IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAAsAAABfX2luaXRfXy5weVBLAwQUAAAAAAAAACEAKlJvIQohAAAKIQAACwAAAF9fbWFpbl9fLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgcGlwdG9vbCBtb2R1bGUgaW1wb3J0cyBwaXAgcmVxdWlyZW1lbnRzIGludG8gQmF6ZWwgcnVsZXMuIiIiCgojIEJvaWxlcnBsYXRlIGFkZGVkIGJ5IHN1YnBhci9jb21waWxlci9weXRob25fYXJjaGl2ZS5weQpmcm9tIHN1YnBhci5ydW50aW1lIGltcG9ydCBzdXBwb3J0IGFzIF8KXy5zZXR1cChpbXBvcnRfcm9vdHM9WydwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQnLCAncGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMycsICdwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAnLCAnYmF6ZWxfdG9vbHMnLCAncGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMycsICdwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQnLCAncGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwJywgJ3J1bGVzX3B5dGhvbiddLCB6aXBfc2FmZT1UcnVlKQpkZWwgXwojIEVuZCBib2lsZXJwbGF0ZQppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGF0ZXhpdAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKCiMgTm90ZTogV2UgY2FyZWZ1bGx5IGltcG9ydCB0aGUgZm9sbG93aW5nIG1vZHVsZXMgaW4gYSBwYXJ0aWN1bGFyCiMgb3JkZXIsIHNpbmNlIHRoZXNlIG1vZHVsZXMgbW9kaWZ5IHRoZSBpbXBvcnQgcGF0aCBhbmQgbWFjaGluZXJ5LgppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmRlZiBleHRyYWN0X3BhY2thZ2VzKHBhY2thZ2VfbmFtZXMpOgogICAgIiIiRXh0cmFjdCB6aXBmaWxlIGNvbnRlbnRzIHRvIGRpc2sgYW5kIGFkZCB0byBpbXBvcnQgcGF0aCIiIgoKICAgICMgU2V0IGEgc2FmZSBleHRyYWN0aW9uIGRpcgogICAgZXh0cmFjdGlvbl90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IHNodXRpbC5ybXRyZWUoCiAgICAgICAgZXh0cmFjdGlvbl90bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCiAgICBwa2dfcmVzb3VyY2VzLnNldF9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdGlvbl90bXBkaXIpCgogICAgIyBFeHRyYWN0IGVhY2ggcGFja2FnZSB0byBkaXNrCiAgICBkaXJzX3RvX2FkZCA9IFtdCiAgICBmb3IgcGFja2FnZV9uYW1lIGluIHBhY2thZ2VfbmFtZXM6CiAgICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShwYWNrYWdlX25hbWUpCiAgICAgICAgZXh0cmFjdGlvbl9kaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKHJlcSwgJycpCiAgICAgICAgZGlyc190b19hZGQuYXBwZW5kKGV4dHJhY3Rpb25fZGlyKQoKICAgICMgQWRkIGV4dHJhY3RlZCBkaXJlY3RvcmllcyB0byBpbXBvcnQgcGF0aCBhaGVhZCBvZiB0aGVpciB6aXAgZmlsZQogICAgIyBjb3VudGVycGFydHMuCiAgICBzeXMucGF0aFswOjBdID0gZGlyc190b19hZGQKICAgIGV4aXN0aW5nX3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgICBpZiBleGlzdGluZ19weXRob25wYXRoOgogICAgICAgIGRpcnNfdG9fYWRkLmV4dGVuZChleGlzdGluZ19weXRob25wYXRoLnNwbGl0KCc6JykpCiAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSAnOicuam9pbihkaXJzX3RvX2FkZCkKCgojIFdoZWVsLCBwaXAsIGFuZCBzZXR1cHRvb2xzIGFyZSBtdWNoIGhhcHBpZXIgcnVubmluZyBmcm9tIGFjdHVhbAojIGZpbGVzIG9uIGRpc2ssIHJhdGhlciB0aGFuIGVudHJpZXMgaW4gYSB6aXBmaWxlLiAgRXh0cmFjdCB6aXBmaWxlCiMgY29udGVudHMsIGFkZCB0aG9zZSBjb250ZW50cyB0byB0aGUgcGF0aCwgdGhlbiBpbXBvcnQgdGhlbS4KZXh0cmFjdF9wYWNrYWdlcyhbJ3BpcCcsICdzZXR1cHRvb2xzJywgJ3doZWVsJ10pCgojIERlZmVhdCBwaXAncyBhdHRlbXB0IHRvIG1hbmdsZSBzeXMucGF0aApzYXZlZF9zeXNfcGF0aCA9IHN5cy5wYXRoCnN5cy5wYXRoID0gc3lzLnBhdGhbOl0KaW1wb3J0IHBpcApzeXMucGF0aCA9IHNhdmVkX3N5c19wYXRoCgppbXBvcnQgc2V0dXB0b29scwppbXBvcnQgd2hlZWwKCgpkZWYgcGlwX21haW4oYXJndik6CiAgICAjIEV4dHJhY3QgdGhlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBQQVIgZm9sbG93aW5nIHRoZSBleGFtcGxlIG9mIGdldC1waXAucHkKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvZ2V0LXBpcC9ibG9iLzQzMGJhMzc3NzZhZTJhZDg5L3RlbXBsYXRlLnB5I0wxNjQtTDE2OAogICAgY2VydF90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGNlcnRfcGF0aCA9IG9zLnBhdGguam9pbihjZXJ0X3RtcGRpciwgImNhY2VydC5wZW0iKQogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZShjZXJ0X3RtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKSkKICAgIHdpdGggb3BlbihjZXJ0X3BhdGgsICJ3YiIpIGFzIGNlcnQ6CiAgICAgIGNlcnQud3JpdGUocGtndXRpbC5nZXRfZGF0YSgicGlwLl92ZW5kb3IucmVxdWVzdHMiLCAiY2FjZXJ0LnBlbSIpKQogICAgYXJndiA9IFsiLS1pc29sYXRlZCIsICItLWRpc2FibGUtcGlwLXZlcnNpb24tY2hlY2siLCAiLS1jZXJ0IiwgY2VydF9wYXRoXSArIGFyZ3YKICAgIHJldHVybiBwaXAubWFpbihhcmd2KQoKZnJvbSBwYWNrYWdpbmcud2hsIGltcG9ydCBXaGVlbAoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nSW1wb3J0IFB5dGhvbiBkZXBlbmRlbmNpZXMgaW50byBCYXplbC4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1weXRob25faW50ZXJwcmV0ZXInLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIFB5dGhvbiBpbnRlcnByZXRlciB0byB1c2Ugd2hlbiBleHRyYWN0aW5nICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlZWxzLicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uYW1lJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0taW5wdXQnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIHJlcXVpcmVtZW50cy50eHQgZmlsZSB0byBpbXBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgcmVxdWlyZW1lbnRzLmJ6bCBmaWxlIHRvIGV4cG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBwdXQgLndobCBmaWxlcy4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZXh0cmFfcGlwX2FyZ3MnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnRXh0cmEgYXJndW1lbnRzIHRvIHBhc3MgZG93biB0byBwaXAuJykpCgpkZWYgZGV0ZXJtaW5lX3Bvc3NpYmxlX2V4dHJhcyh3aGxzKToKICAiIiJEZXRlcm1pbmVzIHRoZSBsaXN0IG9mIHBvc3NpYmxlICJleHRyYXMiIGZvciBlYWNoIC53aGwKCiAgVGhlIHBvc3NpYmlsaXR5IG9mIGFuIGV4dHJhIGlzIGRldGVybWluZWQgYnkgbG9va2luZyBhdCBpdHMKICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cywgYW5kIGRldGVybWluaW5lIHdoZXRoZXIgdGhleSBhcmUKICBzYXRpc2ZpZWQgYnkgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHdoZWVscy4KCiAgQXJnczoKICAgIHdobHM6IGEgbGlzdCBvZiBXaGVlbCBvYmplY3RzCgogIFJldHVybnM6CiAgICBhIGRpY3QgdGhhdCBpcyBrZXllZCBieSB0aGUgV2hlZWwgb2JqZWN0cyBpbiB3aGxzLCBhbmQgd2hvc2UKICAgIHZhbHVlcyBhcmUgbGlzdHMgb2YgcG9zc2libGUgZXh0cmFzLgogICIiIgogIHdobF9tYXAgPSB7CiAgICB3aGwuZGlzdHJpYnV0aW9uKCk6IHdobAogICAgZm9yIHdobCBpbiB3aGxzCiAgfQoKICAjIFRPRE8obWF0dG1vb3IpOiBDb25zaWRlciBtZW1vaXppbmcgaWYgdGhpcyByZWN1cnNpb24gZXZlciBiZWNvbWVzCiAgIyBleHBlbnNpdmUgZW5vdWdoIHRvIHdhcnJhbnQgaXQuCiAgZGVmIGlzX3Bvc3NpYmxlKGRpc3RybywgZXh0cmEpOgogICAgZGlzdHJvID0gZGlzdHJvLnJlcGxhY2UoIi0iLCAiXyIpCiAgICAjIElmIHdlIGRvbid0IGhhdmUgdGhlIC53aGwgYXQgYWxsLCB0aGVuIHRoaXMgaXNuJ3QgcG9zc2libGUuCiAgICBpZiBkaXN0cm8gbm90IGluIHdobF9tYXA6CiAgICAgIHJldHVybiBGYWxzZQogICAgd2hsID0gd2hsX21hcFtkaXN0cm9dCiAgICAjIElmIHdlIGhhdmUgdGhlIC53aGwsIGFuZCB3ZSBkb24ndCBuZWVkIGFueXRoaW5nIGV4dHJhIHRoZW4KICAgICMgd2UgY2FuIHNhdGlzZnkgdGhpcyBkZXBlbmRlbmN5LgogICAgaWYgbm90IGV4dHJhOgogICAgICByZXR1cm4gVHJ1ZQogICAgIyBJZiB3ZSBkbyBuZWVkIHNvbWV0aGluZyBleHRyYSwgdGhlbiBjaGVjayB0aGUgZXh0cmEncwogICAgIyBkZXBlbmRlbmNpZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGZ1bGx5IHNhdGlzZmllZC4KICAgIGZvciBleHRyYV9kZXAgaW4gd2hsLmRlcGVuZGVuY2llcyhleHRyYT1leHRyYSk6CiAgICAgIHJlcSA9IHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2UoZXh0cmFfZGVwKQogICAgICAjIENoZWNrIHRoYXQgdGhlIGRlcCBhbmQgYW55IGV4dHJhcyBhcmUgYWxsIHBvc3NpYmxlLgogICAgICBpZiBub3QgaXNfcG9zc2libGUocmVxLnByb2plY3RfbmFtZSwgTm9uZSk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgIGZvciBlIGluIHJlcS5leHRyYXM6CiAgICAgICAgaWYgbm90IGlzX3Bvc3NpYmxlKHJlcS5wcm9qZWN0X25hbWUsIGUpOgogICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAjIElmIGFsbCBvZiB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBleHRyYSBhcmUgc2F0aXNmaWFibGUgdGhlbgogICAgIyBpdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgdGhpcyBkZXBlbmRlbmN5LgogICAgcmV0dXJuIFRydWUKCiAgcmV0dXJuIHsKICAgIHdobDogWwogICAgICBleHRyYQogICAgICBmb3IgZXh0cmEgaW4gd2hsLmV4dHJhcygpCiAgICAgIGlmIGlzX3Bvc3NpYmxlKHdobC5kaXN0cmlidXRpb24oKSwgZXh0cmEpCiAgICBdCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgpkZWYgbWFpbigpOgogIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCgogICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2Jsb2IvOS4wLjEvcGlwL19faW5pdF9fLnB5I0wyMDkKICBwaXBfYXJncyA9IFsid2hlZWwiLCAiLXciLCBhcmdzLmRpcmVjdG9yeSwgIi1yIiwgYXJncy5pbnB1dF0KICBpZiBhcmdzLmV4dHJhX3BpcF9hcmdzOgogICAgICBwaXBfYXJncyArPSBhcmdzLmV4dHJhX3BpcF9hcmdzLnN0cmlwKCJcIiIpLnNwbGl0KCkKICBpZiBwaXBfbWFpbihwaXBfYXJncyk6CiAgICBzeXMuZXhpdCgxKQoKICAjIEVudW1lcmF0ZSB0aGUgLndobCBmaWxlcyB3ZSBkb3dubG9hZGVkLgogIGRlZiBsaXN0X3dobHMoKToKICAgIGRpciA9IGFyZ3MuZGlyZWN0b3J5ICsgJy8nCiAgICBmb3Igcm9vdCwgdW51c2VkX2Rpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhkaXIpOgogICAgICBmb3IgZm5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgIGlmIGZuYW1lLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4ocm9vdCwgZm5hbWUpCgogIHdobHMgPSBbV2hlZWwocGF0aCkgZm9yIHBhdGggaW4gbGlzdF93aGxzKCldCiAgcG9zc2libGVfZXh0cmFzID0gZGV0ZXJtaW5lX3Bvc3NpYmxlX2V4dHJhcyh3aGxzKQoKICBkZWYgcmVwb3NpdG9yeV9uYW1lKHdoZWVsKToKICAgIHJldHVybiBhcmdzLm5hbWUgKyAiXyIgKyB3aGVlbC5yZXBvc2l0b3J5X3N1ZmZpeCgpCgogIGRlZiB3aGxfbGlicmFyeSh3aGVlbCk6CiAgICAjIEluZGVudGF0aW9uIGhlcmUgbWF0dGVycy4gIHdobF9saWJyYXJ5IG11c3QgYmUgd2l0aGluIHRoZSBzY29wZQogICAgIyBvZiB0aGUgZnVuY3Rpb24gYmVsb3cuICBXZSBhbHNvIGF2b2lkIHJlaW1wb3J0aW5nIGFuIGV4aXN0aW5nIFdITC4KICAgIHJldHVybiAiIiIKICBpZiAie3JlcG9fbmFtZX0iIG5vdCBpbiBuYXRpdmUuZXhpc3RpbmdfcnVsZXMoKToKICAgIHdobF9saWJyYXJ5KAogICAgICAgIG5hbWUgPSAie3JlcG9fbmFtZX0iLAogICAgICAgIHB5dGhvbl9pbnRlcnByZXRlciA9ICJ7cHl0aG9uX2ludGVycHJldGVyfSIsCiAgICAgICAgd2hsID0gIkB7bmFtZX0vLzp7cGF0aH0iLAogICAgICAgIHJlcXVpcmVtZW50cyA9ICJAe25hbWV9Ly86cmVxdWlyZW1lbnRzLmJ6bCIsCiAgICAgICAgZXh0cmFzID0gW3tleHRyYXN9XQogICAgKSIiIi5mb3JtYXQobmFtZT1hcmdzLm5hbWUsIHJlcG9fbmFtZT1yZXBvc2l0b3J5X25hbWUod2hlZWwpLAogICAgICAgICAgICAgICAgcHl0aG9uX2ludGVycHJldGVyPWFyZ3MucHl0aG9uX2ludGVycHJldGVyLAogICAgICAgICAgICAgICAgcGF0aD13aGVlbC5iYXNlbmFtZSgpLAogICAgICAgICAgICAgICAgZXh0cmFzPScsJy5qb2luKFsKICAgICAgICAgICAgICAgICAgJyIlcyInICUgZXh0cmEKICAgICAgICAgICAgICAgICAgZm9yIGV4dHJhIGluIHBvc3NpYmxlX2V4dHJhcy5nZXQod2hlZWwsIFtdKQogICAgICAgICAgICAgICAgXSkpCgogIHdobF90YXJnZXRzID0gJywnLmpvaW4oWwogICAgJywnLmpvaW4oWwogICAgICAnIiVzIjogIkAlcy8vOnBrZyInICUgKHdobC5kaXN0cmlidXRpb24oKS5sb3dlcigpLCByZXBvc2l0b3J5X25hbWUod2hsKSkKICAgIF0gKyBbCiAgICAgICMgRm9yIGV2ZXJ5IGV4dHJhIHRoYXQgaXMgcG9zc2libGUgZnJvbSB0aGlzIHJlcXVpcmVtZW50cy50eHQKICAgICAgJyIlc1slc10iOiAiQCVzLy86JXMiJyAlICh3aGwuZGlzdHJpYnV0aW9uKCkubG93ZXIoKSwgZXh0cmEubG93ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5X25hbWUod2hsKSwgZXh0cmEpCiAgICAgIGZvciBleHRyYSBpbiBwb3NzaWJsZV9leHRyYXMuZ2V0KHdobCwgW10pCiAgICBdKQogICAgZm9yIHdobCBpbiB3aGxzCiAgXSkKCiAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0LCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIlwKIyBJbnN0YWxsIHBpcCByZXF1aXJlbWVudHMuCiMKIyBHZW5lcmF0ZWQgZnJvbSB7aW5wdXR9Cgpsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246d2hsLmJ6bCIsICJ3aGxfbGlicmFyeSIpCgpkZWYgcGlwX2luc3RhbGwoKToKICB7d2hsX2xpYnJhcmllc30KCl9yZXF1aXJlbWVudHMgPSB7ewogIHttYXBwaW5nc30KfX0KCmFsbF9yZXF1aXJlbWVudHMgPSBfcmVxdWlyZW1lbnRzLnZhbHVlcygpCgpkZWYgcmVxdWlyZW1lbnQobmFtZSk6CiAgbmFtZV9rZXkgPSBuYW1lLnJlcGxhY2UoIi0iLCAiXyIpLmxvd2VyKCkKICBpZiBuYW1lX2tleSBub3QgaW4gX3JlcXVpcmVtZW50czoKICAgIGZhaWwoIkNvdWxkIG5vdCBmaW5kIHBpcC1wcm92aWRlZCBkZXBlbmRlbmN5OiAnJXMnIiAlIG5hbWUpCiAgcmV0dXJuIF9yZXF1aXJlbWVudHNbbmFtZV9rZXldCiIiIi5mb3JtYXQoaW5wdXQ9YXJncy5pbnB1dCwKICAgICAgICAgICB3aGxfbGlicmFyaWVzPSdcbicuam9pbihtYXAod2hsX2xpYnJhcnksIHdobHMpKSBpZiB3aGxzIGVsc2UgInBhc3MiLAogICAgICAgICAgIG1hcHBpbmdzPXdobF90YXJnZXRzKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEATzlpVeINAADiDQAAJgAAAGJhemVsX3Rvb2xzL3Rvb2xzL3B5dGhvbi9weTN3cmFwcGVyLnNoIyEvYmluL3NoCgojIERvbid0IHNldCAtZSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcm9idXN0IHRyYXBwaW5nIGFuZCBwcmludGluZyBvZiBlcnJvcnMuCnNldCAtdQoKIyBXZSB1c2UgL2Jpbi9zaCByYXRoZXIgdGhhbiAvYmluL2Jhc2ggZm9yIHBvcnRhYmlsaXR5LiBTZWUgZGlzY3Vzc2lvbiBoZXJlOgojIGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vP25vbW9iaWxlPXRydWUjIXRvcGljL2JhemVsLWRldi80UWxfN2VEY0xDMAojIFdlIGRvIGxvc2UgdGhlIGFiaWxpdHkgdG8gc2V0IC1vIHBpcGVmYWlsLgoKU1RSSUNUPSIxIgoKaWYgWyAiJFNUUklDVCIgPSAiMSIgXTsgdGhlbgogIEZBSUxVUkVfSEVBREVSPSJcCkVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gdXNlIHRoZSBkZWZhdWx0IFB5dGhvbiB0b29sY2hhaW4gXAooQGJhemVsX3Rvb2xzLy90b29scy9weXRob246YXV0b2RldGVjdGluZ190b29sY2hhaW4pLiIKZWxzZQogIEZBSUxVUkVfSEVBREVSPSJcCkVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gdXNlIHRoZSBub24tc3RyaWN0IGF1dG9kZXRlY3RpbmcgUHl0aG9uIFwKdG9vbGNoYWluIChAYmF6ZWxfdG9vbHMvL3Rvb2xzL3B5dGhvbjphdXRvZGV0ZWN0aW5nX3Rvb2xjaGFpbl9ub25zdHJpY3QpLiIKZmkKCmRpZSgpIHsKICBlY2hvICIkRkFJTFVSRV9IRUFERVIiIDE+JjIKICBlY2hvICIkMSIgMT4mMgogIGV4aXQgMQp9CgojIFdlIHVzZSBgd2hpY2hgIHRvIGxvY2F0ZSB0aGUgUHl0aG9uIGludGVycHJldGVyIGNvbW1hbmQgb24gUEFUSC4gYGNvbW1hbmQgLXZgCiMgaXMgYW5vdGhlciBvcHRpb24sIGJ1dCBpdCBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXQgZmluZHMgaGFzIHRoZQojIGV4ZWN1dGFibGUgYml0LgojCiMgQSB0cmlja3kgc2l0dWF0aW9uIGhhcHBlbnMgd2hlbiB0aGlzIHdyYXBwZXIgaXMgaW52b2tlZCBhcyBwYXJ0IG9mIHJ1bm5pbmcgYQojIHRvb2wsIGUuZy4gcGFzc2luZyBhIHB5X2JpbmFyeSB0YXJnZXQgdG8gYGN0eC5hY3Rpb25zLnJ1bigpYC4gQmF6ZWwgd2lsbCB1bnNldAojIHRoZSBQQVRIIHZhcmlhYmxlLiBUaGVuIHRoZSBzaGVsbCB3aWxsIHNlZSB0aGVyZSdzIG5vIFBBVEggYW5kIGluaXRpYWxpemUgaXRzCiMgb3duLCBzb21ldGltZXMgd2l0aG91dCBleHBvcnRpbmcgaXQuIFRoaXMgY2F1c2VzIGB3aGljaGAgdG8gZmFpbCBhbmQgdGhpcwojIHNjcmlwdCB0byB0aGluayB0aGVyZSdzIG5vIFB5dGhvbiBpbnRlcnByZXRlciBpbnN0YWxsZWQuIFRvIGF2b2lkIHRoaXMgd2UKIyBleHBsaWNpdGx5IHBhc3MgUEFUSCB0byBlYWNoIGB3aGljaGAgaW52b2NhdGlvbi4gV2UgY2FuJ3QganVzdCBleHBvcnQgUEFUSAojIGJlY2F1c2UgdGhhdCB3b3VsZCBtb2RpZnkgdGhlIGVudmlyb25tZW50IHNlZW4gYnkgdGhlIGZpbmFsIHVzZXIgUHl0aG9uCiMgcHJvZ3JhbS4KIwojIFNlZSBhbHNvOgojCiMgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2NvbnRpbnVvdXMtaW50ZWdyYXRpb24vaXNzdWVzLzU3OAojICAgICBodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9pc3N1ZXMvODQxNAojICAgICBodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9pc3N1ZXMvODQxNQoKIyBUcnkgdGhlICJweXRob24zIiBjb21tYW5kIG5hbWUgZmlyc3QsIHRoZW4gZmFsbCBiYWNrIG9uICJweXRob24iLgpQWVRIT05fQklOPSIkKFBBVEg9IiRQQVRIIiB3aGljaCBweXRob24zIDI+IC9kZXYvbnVsbCkiClVTRURfRkFMTEJBQ0s9IjAiCmlmIFsgLXogIiR7UFlUSE9OX0JJTjotfSIgXTsgdGhlbgogIFBZVEhPTl9CSU49IiQoUEFUSD0iJFBBVEgiIHdoaWNoIHB5dGhvbiAyPi9kZXYvbnVsbCkiCiAgVVNFRF9GQUxMQkFDSz0iMSIKZmkKaWYgWyAteiAiJHtQWVRIT05fQklOOi19IiBdOyB0aGVuCiAgZGllICJOZWl0aGVyICdweXRob24zJyBub3IgJ3B5dGhvbicgd2VyZSBmb3VuZCBvbiB0aGUgdGFyZ2V0IFwKcGxhdGZvcm0ncyBQQVRILCB3aGljaCBpczoKCiRQQVRICgpQbGVhc2UgZW5zdXJlIGFuIGludGVycHJldGVyIGlzIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIChhbmQgbWFya2VkIFwKZXhlY3V0YWJsZSksIG9yIGVsc2UgcmVnaXN0ZXIgYW4gYXBwcm9wcmlhdGUgUHl0aG9uIHRvb2xjaGFpbiBhcyBwZXIgdGhlIFwKZG9jdW1lbnRhdGlvbiBmb3IgcHlfcnVudGltZV9wYWlyIFwKKGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2Jsb2IvbWFzdGVyL3Rvb2xzL3B5dGhvbi90b29sY2hhaW4uYnpsKS4iCmZpCgppZiBbICIkU1RSSUNUIiA9ICIxIiBdOyB0aGVuCiAgIyBWZXJpZnkgdGhhdCB3ZSBncmFiYmVkIGFuIGludGVycHJldGVyIHdpdGggdGhlIHJpZ2h0IHZlcnNpb24uCiAgVkVSU0lPTl9TVFI9IiQoIiRQWVRIT05fQklOIiAtViAyPiYxKSIgXAogICAgICB8fCBkaWUgIkNvdWxkIG5vdCBnZXQgaW50ZXJwcmV0ZXIgdmVyc2lvbiB2aWEgJyRQWVRIT05fQklOIC1WJyIKICBpZiAhIGVjaG8gIiRWRVJTSU9OX1NUUiIgfCBncmVwIC1xICIgM1wuIiA7IHRoZW4KICAgICAgZGllICJBY2NvcmRpbmcgdG8gJyRQWVRIT05fQklOIC1WJywgdmVyc2lvbiBpcyAnJFZFUlNJT05fU1RSJywgYnV0IHdlIFwKbmVlZCB2ZXJzaW9uIDMuIFBBVEggaXM6CgokUEFUSAoKUGxlYXNlIGVuc3VyZSBhbiBpbnRlcnByZXRlciB3aXRoIHZlcnNpb24gMyBpcyBhdmFpbGFibGUgb24gdGhpcyBcCnBsYXRmb3JtIGFzICdweXRob24zJyBvciAncHl0aG9uJywgb3IgZWxzZSByZWdpc3RlciBhbiBhcHByb3ByaWF0ZSBcClB5dGhvbiB0b29sY2hhaW4gYXMgcGVyIHRoZSBkb2N1bWVudGF0aW9uIGZvciBweV9ydW50aW1lX3BhaXIgXAooaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvYmxvYi9tYXN0ZXIvdG9vbHMvcHl0aG9uL3Rvb2xjaGFpbi5iemwpLgoKTm90ZSB0aGF0IHByaW9yIHRvIEJhemVsIDAuMjcsIHRoZXJlIHdhcyBubyBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgXAppbnRlcnByZXRlcidzIHZlcnNpb24gbWF0Y2hlZCB0aGUgdmVyc2lvbiBkZWNsYXJlZCBieSB0aGUgdGFyZ2V0ICgjNDgxNSkuIElmIFwKeW91ciBidWlsZCB3b3JrZWQgcHJpb3IgdG8gQmF6ZWwgMC4yNywgYW5kIHlvdSdyZSBzdXJlIHlvdXIgdGFyZ2V0cyBkbyBub3QgXApyZXF1aXJlIFB5dGhvbiAzLCB5b3UgY2FuIG9wdCBvdXQgb2YgdGhpcyB2ZXJzaW9uIGNoZWNrIGJ5IHVzaW5nIHRoZSBcCm5vbi1zdHJpY3QgYXV0b2RldGVjdGluZyB0b29sY2hhaW4gaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgYXV0b2RldGVjdGluZyBcCnRvb2xjaGFpbi4gVGhpcyBjYW4gYmUgZG9uZSBieSBwYXNzaW5nIHRoZSBmbGFnIFwKXGAtLWV4dHJhX3Rvb2xjaGFpbnM9QGJhemVsX3Rvb2xzLy90b29scy9weXRob246YXV0b2RldGVjdGluZ190b29sY2hhaW5fbm9uc3RyaWN0XGAgXApvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGFkZGluZyBpdCB0byB5b3VyIGJhemVscmMuIgogIGZpCmZpCgpleGVjICIkUFlUSE9OX0JJTiIgIiRAIgpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAACgAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQCrcTRXBwUAAAcFAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdHBpcAo9PT0KClRoZSBgUHlQQSByZWNvbW1lbmRlZAo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvY3VycmVudC8+YF8KdG9vbCBmb3IgaW5zdGFsbGluZyBQeXRob24gcGFja2FnZXMuCgoqIGBJbnN0YWxsYXRpb24gPGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlL2luc3RhbGxpbmcuaHRtbD5gXwoqIGBEb2N1bWVudGF0aW9uIDxodHRwczovL3BpcC5weXBhLmlvLz5gXwoqIGBDaGFuZ2Vsb2cgPGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlL25ld3MuaHRtbD5gXwoqIGBHaXRodWIgUGFnZSA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwPmBfCiogYElzc3VlIFRyYWNraW5nIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzPmBfCiogYFVzZXIgbWFpbGluZyBsaXN0IDxodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcHl0aG9uLXZpcnR1YWxlbnY+YF8KKiBgRGV2IG1haWxpbmcgbGlzdCA8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3B5cGEtZGV2PmBfCiogVXNlciBJUkM6ICNweXBhIG9uIEZyZWVub2RlLgoqIERldiBJUkM6ICNweXBhLWRldiBvbiBGcmVlbm9kZS4KCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3BpcC5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9waXAKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9waXAvbWFzdGVyLnN2ZwogICA6dGFyZ2V0OiBodHRwOi8vdHJhdmlzLWNpLm9yZy9weXBhL3BpcAoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL2FwcHZleW9yL2NpL3B5cGEvcGlwLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L3B5cGEvcGlwL2hpc3RvcnkKCi4uIGltYWdlOjogaHR0cHM6Ly9yZWFkdGhlZG9jcy5vcmcvcHJvamVjdHMvcGlwL2JhZGdlLz92ZXJzaW9uPXN0YWJsZQogICA6dGFyZ2V0OiBodHRwczovL3BpcC5weXBhLmlvL2VuL3N0YWJsZQoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHBpcCBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywgY2hhdApyb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZSBgUHlQQSBDb2RlIG9mIENvbmR1Y3RgXy4KCi4uIF9QeVBBIENvZGUgb2YgQ29uZHVjdDogaHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0LwoKClBLAwQUAAAAAAAAACEAPFB/JfkJAAD5CQAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9NRVRBREFUQU1ldGFkYXRhLVZlcnNpb246IDIuMApOYW1lOiBwaXAKVmVyc2lvbjogOS4wLjMKU3VtbWFyeTogVGhlIFB5UEEgcmVjb21tZW5kZWQgdG9vbCBmb3IgaW5zdGFsbGluZyBQeXRob24gcGFja2FnZXMuCkhvbWUtcGFnZTogaHR0cHM6Ly9waXAucHlwYS5pby8KQXV0aG9yOiBUaGUgcGlwIGRldmVsb3BlcnMKQXV0aG9yLWVtYWlsOiBweXRob24tdmlydHVhbGVudkBncm91cHMuZ29vZ2xlLmNvbQpMaWNlbnNlOiBNSVQKS2V5d29yZHM6IGVhc3lfaW5zdGFsbCBkaXN0dXRpbHMgc2V0dXB0b29scyBlZ2cgdmlydHVhbGVudgpQbGF0Zm9ybTogVU5LTk9XTgpDbGFzc2lmaWVyOiBEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlCkNsYXNzaWZpZXI6IEludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMKQ2xhc3NpZmllcjogTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogTUlUIExpY2Vuc2UKQ2xhc3NpZmllcjogVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogQnVpbGQgVG9vbHMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNApDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy41CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiBJbXBsZW1lbnRhdGlvbiA6OiBQeVB5ClJlcXVpcmVzLVB5dGhvbjogPj0yLjYsIT0zLjAuKiwhPTMuMS4qLCE9My4yLioKUHJvdmlkZXMtRXh0cmE6IHRlc3RpbmcKUHJvdmlkZXMtRXh0cmE6IHRlc3RpbmcKUmVxdWlyZXMtRGlzdDogcHl0ZXN0OyBleHRyYSA9PSAndGVzdGluZycKUmVxdWlyZXMtRGlzdDogdmlydHVhbGVudiAoPj0xLjEwKTsgZXh0cmEgPT0gJ3Rlc3RpbmcnClJlcXVpcmVzLURpc3Q6IHNjcmlwdHRlc3QgKD49MS4zKTsgZXh0cmEgPT0gJ3Rlc3RpbmcnClJlcXVpcmVzLURpc3Q6IG1vY2s7IGV4dHJhID09ICd0ZXN0aW5nJwpSZXF1aXJlcy1EaXN0OiBwcmV0ZW5kOyBleHRyYSA9PSAndGVzdGluZycKCnBpcAo9PT0KClRoZSBgUHlQQSByZWNvbW1lbmRlZAo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvY3VycmVudC8+YF8KdG9vbCBmb3IgaW5zdGFsbGluZyBQeXRob24gcGFja2FnZXMuCgoqIGBJbnN0YWxsYXRpb24gPGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlL2luc3RhbGxpbmcuaHRtbD5gXwoqIGBEb2N1bWVudGF0aW9uIDxodHRwczovL3BpcC5weXBhLmlvLz5gXwoqIGBDaGFuZ2Vsb2cgPGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlL25ld3MuaHRtbD5gXwoqIGBHaXRodWIgUGFnZSA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwPmBfCiogYElzc3VlIFRyYWNraW5nIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzPmBfCiogYFVzZXIgbWFpbGluZyBsaXN0IDxodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcHl0aG9uLXZpcnR1YWxlbnY+YF8KKiBgRGV2IG1haWxpbmcgbGlzdCA8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3B5cGEtZGV2PmBfCiogVXNlciBJUkM6ICNweXBhIG9uIEZyZWVub2RlLgoqIERldiBJUkM6ICNweXBhLWRldiBvbiBGcmVlbm9kZS4KCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3BpcC5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9waXAKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9waXAvbWFzdGVyLnN2ZwogICA6dGFyZ2V0OiBodHRwOi8vdHJhdmlzLWNpLm9yZy9weXBhL3BpcAoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL2FwcHZleW9yL2NpL3B5cGEvcGlwLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L3B5cGEvcGlwL2hpc3RvcnkKCi4uIGltYWdlOjogaHR0cHM6Ly9yZWFkdGhlZG9jcy5vcmcvcHJvamVjdHMvcGlwL2JhZGdlLz92ZXJzaW9uPXN0YWJsZQogICA6dGFyZ2V0OiBodHRwczovL3BpcC5weXBhLmlvL2VuL3N0YWJsZQoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHBpcCBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywgY2hhdApyb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZSBgUHlQQSBDb2RlIG9mIENvbmR1Y3RgXy4KCi4uIF9QeVBBIENvZGUgb2YgQ29uZHVjdDogaHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0LwoKClBLAwQUAAAAAAAAACEAV/4j5ZhiAACYYgAANwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9SRUNPUkRwaXAvX19pbml0X18ucHksc2hhMjU2PWF4dklqV19NZ2htR2I5VlFFYlJma3lzMWE1aktHc3l5WjBkZjBNLWJlUFUsMTE5NTYNCnBpcC9fX21haW5fXy5weSxzaGEyNTY9VjZLaC1JRURFRnB0MWNhaFJFNk1halVGXzE0cUpSX1Fzdm40TWpXWlh6RSw1ODQNCnBpcC9iYXNlY29tbWFuZC5weSxzaGEyNTY9VFRsbVplc1E0VnV4Y3RvMktxd1pHbWdtTjVpb0hFbF9EZUZldjlpZV9TQSwxMTkxMA0KcGlwL2Jhc2VwYXJzZXIucHksc2hhMjU2PUFLTU9lRjNmVHJScm9pdjBEbVRRYmRpTFcwRFF1eDJLcUdDX2RKSkI5ZDAsMTA0NjUNCnBpcC9jbWRvcHRpb25zLnB5LHNoYTI1Nj04SkNjRjJrS0FGMmNGblY3N29XLTNEc0hKaWZyOWpGMld1Q2h6endnY3dnLDE2NDc0DQpwaXAvZG93bmxvYWQucHksc2hhMjU2PV9WSmFOR3NkYXdPTmQ5c2hhc2w3TXhOelRvOGcwRUFDbjJnYTZHUmpNNW8sMzIxNTMNCnBpcC9leGNlcHRpb25zLnB5LHNoYTI1Nj1CdnFILUp3M3RQMmItMklKMmtqclFlbU9BUE1xS3JRTUxSSVpIWlFwSlhrLDgxMjENCnBpcC9pbmRleC5weSxzaGEyNTY9TDZVaHRBRVpjMnF3N0JxZlFya1BRY3cyZ0NnRXczR3VrTFJTQTk1Qk55SSwzOTk1MA0KcGlwL2xvY2F0aW9ucy5weSxzaGEyNTY9OXJKUmxnb25DNlFDMnpHREluXzdtWGFvWjlfdEZfSUhNMkJRaFdWUmdibyw1NjI2DQpwaXAvcGVwNDI1dGFncy5weSxzaGEyNTY9cTNrZWM0ZjZOSHN6dUdZSWhHSWJWdnM4OTZEMDZ1SkFuS0ZnSl93Y2U0NCwxMDk4MA0KcGlwL3N0YXR1c19jb2Rlcy5weSxzaGEyNTY9RjZ1REc2R2o3Uk5LUUpVRG5kODdRS3FJMTZVcy10LUIwd1BGXzRRTXBXYywxNTYNCnBpcC93aGVlbC5weSxzaGEyNTY9UVNXbUdzMnVpLW40VU1XbTBKVVk2YU1DY3dOS3VuZ1Z6YldzeEk5S2xKUSwzMjAxMA0KcGlwL192ZW5kb3IvX19pbml0X18ucHksc2hhMjU2PVdhYVNKM3JvU1NKX1V2NHlLQXhsR29oS0VIOVlVQTNhSWgxWGcySWpmZ1UsNDY3MA0KcGlwL192ZW5kb3IvYXBwZGlycy5weSxzaGEyNTY9LTlVT0laeTYyYWhDUVZZOS1iN05uNl81XzRZNm9vSG52NzJ0TThpSGk5WSwyMjM2OA0KcGlwL192ZW5kb3IvZGlzdHJvLnB5LHNoYTI1Nj1BNERvdXc5cGNxZFl4RFRwNWItT1IwMmZ4VlhuZldzLXdDMXdBODlyaFJrLDM4MzQ5DQpwaXAvX3ZlbmRvci9pcGFkZHJlc3MucHksc2hhMjU2PXdpbWJxY0U3cnd3RVRsdWNuOEFfNFFkXy1OS1hQT0JjTnhKSGFyVW9YbmcsODAxNzYNCnBpcC9fdmVuZG9yL29yZGVyZWRkaWN0LnB5LHNoYTI1Nj00S3NGdWM2VjhJZ0hST0NIVXUtNHZDcnIyMVpQUGVhN1owY3ZYOUFqUTd3LDQwOTQNCnBpcC9fdmVuZG9yL3B5cGFyc2luZy5weSxzaGEyNTY9N3ZBdVVWYmg2dHhVS1FSMkl6SjhfOURLbUQ1dnRtNU1Ec3NXa0kwa2E4bywyMjQxNzENCnBpcC9fdmVuZG9yL3JlLXZlbmRvci5weSxzaGEyNTY9UGNkWjQwZDBvaE1zZEptQTR0MEFlQVdiUFhpMXRGc3ZBd0E1S0U1RkdlWSw3NzMNCnBpcC9fdmVuZG9yL3JldHJ5aW5nLnB5LHNoYTI1Nj1rM2ZmbGY1X01tMFhjSUpZaEI3VGozNGJxQ0NQaFVEa1lieDFOdlcyRlBFLDk5NzINCnBpcC9fdmVuZG9yL3NpeC5weSxzaGEyNTY9QTZoZEpaVmpJM3RfZ2VlYlo5QnpVdndScklYbzBsZnd6UWxNMkxjS3lhcywzMDA5OA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL19faW5pdF9fLnB5LHNoYTI1Nj1VUHlGbHowZElqeHVzdTVJVGlnOVVERkpkU1k1TFR3aWpobGRuMEFmeXpVLDMwMg0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL19jbWQucHksc2hhMjU2PU1QeFpmWmQyTEtEelZyczU1WDN3QTFyc0kyWXVQOGV2TFpTd1FqMGRJazAsMTMyMA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2FkYXB0ZXIucHksc2hhMjU2PVJhR1l5UkEtUkExSjBBbkU2N0d6RVlGUEJ1NFlINEVRVXZRcVRLYTU3aU0sNDYwOA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlLnB5LHNoYTI1Nj14dGwtVi1wcjlLU3Q5VnZGRFJDQjl5ckhQRXZxdmJrLTVNMXZBSW5aYjVrLDc5MA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NvbXBhdC5weSxzaGEyNTY9Mk1UT3lJMUpsR19nSnBmdXkzLVVRUWxLTVJpSmltUi1YWEIwc3I0NHdqMCwzODANCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb250cm9sbGVyLnB5LHNoYTI1Nj1lbERzTGNhWUExNW5jb2RSbUhuV1FwNmVrVV9vY0VHdERlR0xic25UanpvLDEzMDI0DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvZmlsZXdyYXBwZXIucHksc2hhMjU2PV9LOGNTdG1YcUQzM20xNVBmc1E4cmxwbzZGZlhqVmJLbWp2TFh5SUNSZ0ksMjUzMQ0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2hldXJpc3RpY3MucHksc2hhMjU2PVd0SnJWc3lXanBQOVdvVWlEVmRUWlpSTkJDejVaVnB0YVFwWW5xb2ZEUVUsNDE0MQ0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3NlcmlhbGl6ZS5weSxzaGEyNTY9WE02ZWxHOURTTmV4d2FPQ2dNalV0ZnJISFc1TkFCNlRTYklmM3gyMzV4cyw2NTM2DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvd3JhcHBlci5weSxzaGEyNTY9S3F5dV8zVFdfNTRYRHVkaGE0LUhGMjF2eUVPQUo0Wm5SWEZ5c1RpTG1YQSw0OTgNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvX19pbml0X18ucHksc2hhMjU2PXVXblV0eU12SFlfTFVMYUxfNF9JUjFGX3hQZ0s1ekhmSnlSbkJxNERuUEUsMzY5DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL2ZpbGVfY2FjaGUucHksc2hhMjU2PUZzRHVnM2J3VUFRM29rampmR3p4bERhQmYyZndWU24xaUJLTVRMNlN5R1UsMzUzMg0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9yZWRpc19jYWNoZS5weSxzaGEyNTY9WHl3cXhrUzlNa0NhZmxUT1lfd2pyRTAybmVLZHl3QjlZd2xPQmJQN1l3Yyw5NzMNCnBpcC9fdmVuZG9yL2NlcnRpZmkvX19pbml0X18ucHksc2hhMjU2PVFTUnkxVXp0RS1pMDlJdUdJS0t1YzE5MGswN2x0Nmt0YWJiZWxQTUlab2MsNjMNCnBpcC9fdmVuZG9yL2NlcnRpZmkvX19tYWluX18ucHksc2hhMjU2PUZpT1l0MUZsdHN0N3drOURSYTZHQ29CcjhxQlV4bE5RdV9NS0pmMDRFNnMsNDENCnBpcC9fdmVuZG9yL2NlcnRpZmkvY2FjZXJ0LnBlbSxzaGEyNTY9N0NFWGZMSHhEd3ZEcHdWdTB5XzJsZkpZazYzY1UtS1VLSV9ETDFMcThVbywyNzEwODgNCnBpcC9fdmVuZG9yL2NlcnRpZmkvY29yZS5weSxzaGEyNTY9eFBRRGRHX3NpeTVBN0JmcUdXYTdSSmhjQTYxeFhFcVBpU3J3OUdOeWhIRSw4MzYNCnBpcC9fdmVuZG9yL2NoYXJkZXQvX19pbml0X18ucHksc2hhMjU2PVlzUDV3UWxzSEoyYXVGMVJaSmZ5cGlTckNBN19iUWlSbTNFU19OSTc2LVksMTU1OQ0KcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1ZnJlcS5weSxzaGEyNTY9RF96SzVHeXpvVnNSZXMwSGtMSnppbHRGUVgwYktDTE9yRmU5X3hEdk9fOCwzMTI1NA0KcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1cHJvYmVyLnB5LHNoYTI1Nj1rQnhIYmRldEJwUGU3eHJsYi1lOTkwaW90NjRnX2VHU0xkMzJsQjdfaDNNLDE3NTcNCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcmRpc3RyaWJ1dGlvbi5weSxzaGEyNTY9M3dvV1M2MktyR29vS3lxejR6UVNuakZiSnBhNlY3ZzAyZGFBaWJUd2NsOCw5NDExDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJzZXRncm91cHByb2Jlci5weSxzaGEyNTY9NmJEdThZSWlSdVNjWDRjYTlJZ2IwVTY5VEEyUEdYWERlajZDYzRfOWtPNCwzNzg3DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJzZXRwcm9iZXIucHksc2hhMjU2PUtTbXdKRXJqeXB5ajBiUlptQzVGNWVNN2M4WVFnTFlJalpYaW50Wk5zdGcsNTExMA0KcGlwL192ZW5kb3IvY2hhcmRldC9jb2RpbmdzdGF0ZW1hY2hpbmUucHksc2hhMjU2PVZZcF82Y3l5a2k1c0hnWERTWm5YVzRxMW9lbEhjM2N1OUF5UVRYN3V1ZzgsMzU5MA0KcGlwL192ZW5kb3IvY2hhcmRldC9jb21wYXQucHksc2hhMjU2PVBLVHpIa1NidGJIRHFTOVB5dWpNYlg3NHExYThtTXBlUVREVnNRaFpNUncsMTEzNA0KcGlwL192ZW5kb3IvY2hhcmRldC9jcDk0OXByb2Jlci5weSxzaGEyNTY9VFo0MzRRWDh6ekJzblV2TF84d200QVFWVFoyWmtxRUVRTF9sTnc5ZjlvdywxODU1DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2VudW1zLnB5LHNoYTI1Nj1BaW13ZGI5YXMxZEpLWmFGTlVIMk9oV0lWQlZkNlprSkpfV0s1c05ZOGNVLDE2NjENCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXNjcHJvYmVyLnB5LHNoYTI1Nj1ra3lxVmcxWXczRElPQU1KMmJkbHlRZ1VGUWh1SEFXOGRVR3NrVG9OV1NjLDM5NTANCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXNjc20ucHksc2hhMjU2PVJ1WGxnTnZUSURhcm5kdmxsTkNrNVdaQklwZEN4UTBrY2Q5RUF1eFVoODQsMTA1MTANCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXVjanBwcm9iZXIucHksc2hhMjU2PWlEOEpkcDBJU1JqZ2ppVk43ZjBlOHhHZVFKNUdNMm9lWjFkQThuYlNlVXcsMzc0OQ0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcmZyZXEucHksc2hhMjU2PS03R2RtdmdXZXo0LWVPNFN1WHBhN3RCaURpNXZSWFE4V3ZkRkF6VmFTZm8sMTM1NDYNCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3Jwcm9iZXIucHksc2hhMjU2PU1xRk1UUVh4VzRIYnpJcFo5bEtESEIzR044U1A0eWlIZW5UbWY4Z19QeFksMTc0OA0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d2ZyZXEucHksc2hhMjU2PU5vMVd5ZHVGT2dCNVZJVFVBN1BMeUM1b0pSTnpSeU1iQnhhS0kxbDE2TUEsMzE2MjENCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdwcm9iZXIucHksc2hhMjU2PTEzcDZFUDR5UmF4cW5QNGlIdHhIT0o2UjJ6eEhxMV9tOGhUUmp6Vlo5NWMsMTc0Nw0KcGlwL192ZW5kb3IvY2hhcmRldC9nYjIzMTJmcmVxLnB5LHNoYTI1Nj1KWDhsc3dlS0xtbkN3bWs4VUhFUXNMZ2tyX3JQX2tFYnZpdkM0cVBPcmxjLDIwNzE1DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMnByb2Jlci5weSxzaGEyNTY9Z0d2SVdpOVdoRGpFLXhRWEh2Tkl5cm5MdkViTUFZZ3lVU1o2NUhVZnlsdywxNzU0DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2hlYnJld3Byb2Jlci5weSxzaGEyNTY9YzNTWi1LN2h2eXpHWTZKUkFaeEpnd0pfc1VTOWswV1lrdk1ZMDBZQllGbywxMzgzOA0KcGlwL192ZW5kb3IvY2hhcmRldC9qaXNmcmVxLnB5LHNoYTI1Nj12cG1KdjJCdTBKOGduTVZSUEhNRmVmVFJ2b19oYTFtcnlMaWc4Q0J3Z09nLDI1Nzc3DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2pwY250eC5weSxzaGEyNTY9UFlsTnFSVVFUOExNM2NUNUZtSEdQMGlpc2NGbFRXRUQ5Mk1BTHZCdW5nbywxOTY0Mw0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nYnVsZ2FyaWFubW9kZWwucHksc2hhMjU2PTFIcVFTOVBidG5qMXhRZ3hpdEpNdnc4WDZrS3I1T29ja05DWldmRVFyUEUsMTI4MzkNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2N5cmlsbGljbW9kZWwucHksc2hhMjU2PUxPRGFqdnNldEg4N3lZRERRS0EyQ1VMWFVIODd0STIyM2RoZmpoOVp4OWMsMTc5NDgNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2dyZWVrbW9kZWwucHksc2hhMjU2PThZQVc3YlU4WXdTSmFwMGtJSlNiUE13MUJFcXpHald6cWNxZjBXZ1VLQUEsMTI2ODgNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2hlYnJld21vZGVsLnB5LHNoYTI1Nj1KU25xbUU1RTYydERMVFBUdkxwUXNnNWdPTU80UGJkV1J2VjdBdmtjMEhBLDExMzQ1DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdodW5nYXJpYW5tb2RlbC5weSxzaGEyNTY9UmhhcFlTRzVsMFphTy1WVjRGYW41c1cwV1JHUXFod0JNNjF5eDN5eHlPQSwxMjU5Mg0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndGhhaW1vZGVsLnB5LHNoYTI1Nj04bDAxNzNHdV9XNkc4bXhtUU9URUY0bHMyWWRFN0Z4V2YzUWtTeEVHWEpRLDExMjkwDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmd0dXJraXNobW9kZWwucHksc2hhMjU2PVcyMmVSTkpzcUk2dVdBZndYU0tWV1duQ2VyWXFySThkWlFUbV9NMGxSRmssMTExMDINCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGF0aW4xcHJvYmVyLnB5LHNoYTI1Nj1TMklvT1JoRmszOUZFRk9sU0ZXdGdWeWJSaVA2aDdCbExsZEhWY2xOa1U4LDUzNzANCnBpcC9fdmVuZG9yL2NoYXJkZXQvbWJjaGFyc2V0cHJvYmVyLnB5LHNoYTI1Nj1BUjk1ZUZIOXZ1cVNmdkxRWk4tTDVpamVhMjVOT0JDb1hxdzhzNU85eExRLDM0MTMNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc2dyb3VwcHJvYmVyLnB5LHNoYTI1Nj1oNlRSbm5ZcTJPeEcxV2RENUpPeXhjZFZwbjdkRzBxLXZCOG5XcjVtYmg0LDIwMTINCnBpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc3NtLnB5LHNoYTI1Nj1TWTMyd1ZJRjNIemNqWTNCYUVzcHk5bWV0Yk5TS3hJSUIwUktQbjd0anBJLDI1NDgxDQpwaXAvX3ZlbmRvci9jaGFyZGV0L3NiY2hhcnNldHByb2Jlci5weSxzaGEyNTY9TERTcENsZERDRmxZd1VrR2t3RDJvRnhMbFBXSVdYVDA5YWtIXzJQaVk3NCw1NjU3DQpwaXAvX3ZlbmRvci9jaGFyZGV0L3NiY3Nncm91cHByb2Jlci5weSxzaGEyNTY9MUlwcmNDQl9rMXFmbW54R0M2TUJieEVMbEtxRDNzY1c2UzhZSXdkZXlYQSwzNTQ2DQpwaXAvX3ZlbmRvci9jaGFyZGV0L3NqaXNwcm9iZXIucHksc2hhMjU2PUlJdC1sWmowV0pxSzRybVVaektaUDRHSmxFOEtVRXRGWVZ1WTk2ZWs1TVEsMzc3NA0KcGlwL192ZW5kb3IvY2hhcmRldC91bml2ZXJzYWxkZXRlY3Rvci5weSxzaGEyNTY9cUwwMTc0bFNaRTQ0MmVCMjFubmt0VDlfVmNBeWUwN2xhRldVZVVyanR0WSwxMjQ4NQ0KcGlwL192ZW5kb3IvY2hhcmRldC91dGY4cHJvYmVyLnB5LHNoYTI1Nj1JZEQ4djN6V09zQjhPTGl5UGkteV9mcXdpcFJGeFY5TmMxZUtCTFN1SUV3LDI3NjYNCnBpcC9fdmVuZG9yL2NoYXJkZXQvdmVyc2lvbi5weSxzaGEyNTY9c3AzQjA4bXJEWEItcGYzSzlmcUpfemVESE9DTEM4UnJuZ1F5REZhcF83ZywyNDINCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL19faW5pdF9fLnB5LHNoYTI1Nj1BYnBIR2NnTGIta1JzSkdud0ZFa3RrN3V6cFpPQ2NCWTc0LVlCZHJLVkdzLDENCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL2NoYXJkZXRlY3QucHksc2hhMjU2PVlCTzhMNG1YbzBXUjZfLUZqaF84UXhQQm9FQk5xQjlvTnhOcmRjNTRBUXMsMjczOA0KcGlwL192ZW5kb3IvY29sb3JhbWEvX19pbml0X18ucHksc2hhMjU2PTl4QnlyVHZrOXVwa0w1TkdWNUl0MkVqZTQta3pOTHdhXzFsR1BXcFhvTlUsMjQwDQpwaXAvX3ZlbmRvci9jb2xvcmFtYS9hbnNpLnB5LHNoYTI1Nj1GaTB1bi1RTHFSbS12N29fbktpT3F5QzhQYXBCSks3RExWX3E5TEt0VE8wLDI1MjQNCnBpcC9fdmVuZG9yL2NvbG9yYW1hL2Fuc2l0b3dpbjMyLnB5LHNoYTI1Nj1nSlpCMzVMYmRqYXR5a2QyenJVVW5va016a3ZjRmdzY3luX3ROeHhNRkhBLDk2NjgNCnBpcC9fdmVuZG9yL2NvbG9yYW1hL2luaXRpYWxpc2UucHksc2hhMjU2PWNIcVZKdGI4Mk9HN0hVQ3h2UTJqb0c3Tl9Db3hiSUtiSV9mZ3J5WmtqMjAsMTkxNw0KcGlwL192ZW5kb3IvY29sb3JhbWEvd2luMzIucHksc2hhMjU2PV9TQ0VvVEtfR0EydFUxbmhiYXlLS2FjLXY5Sm45OGxDUElGT2VGTUdDSFEsNTM2NQ0KcGlwL192ZW5kb3IvY29sb3JhbWEvd2ludGVybS5weSxzaGEyNTY9VjdVN29qd0cxcTRuNlBLcmlwakV2V19odFlRaTV1ZVhTTTNMVVVvcXFEWSw2MjkwDQpwaXAvX3ZlbmRvci9kaXN0bGliL19faW5pdF9fLnB5LHNoYTI1Nj0tYVVlTk5DZmlJR18xVHFmMTlCSDB4TE51QktHWDFJN2xOaGNMWWdGVUVBLDU4MQ0KcGlwL192ZW5kb3IvZGlzdGxpYi9jb21wYXQucHksc2hhMjU2PUZ6S2xQOWROVU1ILWpfMUxDVm5qZ3g2S2dVYnBuUmpUallrVGtEWVJQbEksNDA4MDENCnBpcC9fdmVuZG9yL2Rpc3RsaWIvZGF0YWJhc2UucHksc2hhMjU2PWpuaUptWWswTWoydDZnWllibm42OFR2UXduVlowa1h5ZXVmXzNBeEZjbGssNDk2NzINCnBpcC9fdmVuZG9yL2Rpc3RsaWIvaW5kZXgucHksc2hhMjU2PUN3OGd4RnFfN3hYdmRnRXhMM2VmakxBWTNFQVBETVNMM1ZBNDJSa2JRQnMsMjEwODUNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvbG9jYXRvcnMucHksc2hhMjU2PWhEX0htM2FTTDlEa2xZOUN4eWN0Mm5fNzRnWjB4TkZGR0I1TDdNNmRzMTQsNTEwMTMNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvbWFuaWZlc3QucHksc2hhMjU2PTNxRXVaaEhsRGJ2eVlaMUJaYmRhcERBaXZnTWdVd1dwWjAwY21YcWNuMTgsMTQ4MTANCnBpcC9fdmVuZG9yL2Rpc3RsaWIvbWFya2Vycy5weSxzaGEyNTY9aVJyVld3cHlWd2prS0pTWDhORVE5Ml9NUk13cFJPY2ZOR0tDRC1DaDFRTSw2MjgyDQpwaXAvX3ZlbmRvci9kaXN0bGliL21ldGFkYXRhLnB5LHNoYTI1Nj1oVXNmN1FoMkFlNENDa0wzM3FLOHBwd0M4WlR6VDdlcDZIajlSS3BpaktVLDM4ODMzDQpwaXAvX3ZlbmRvci9kaXN0bGliL3Jlc291cmNlcy5weSxzaGEyNTY9VkZCVmJGcUxWcURCU1FEWGNGUUhyWDFLRWN1b0R4VEs2OTlZZGlfYmV5YywxMDc2Ng0KcGlwL192ZW5kb3IvZGlzdGxpYi9zY3JpcHRzLnB5LHNoYTI1Nj14cGVoTmZJU0dQVE54UVp1MDJLOVJ3MlFiTnhfMlE0ZW1lUHYzVzVYMGl3LDE1MjI0DQpwaXAvX3ZlbmRvci9kaXN0bGliL3QzMi5leGUsc2hhMjU2PWNwMFVBVUREcjF0R0F4OGFkbEt4V2JDSElhLW9CM2J4ZXY1ell6Z0FyOEUsODkwODgNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdDY0LmV4ZSxzaGEyNTY9RmlsakRQY1g5cXZvZTlGWUVfOXBORUhxYnFNbmhjQ091SV9vTEo0RjlGOCw5Nzc5Mg0KcGlwL192ZW5kb3IvZGlzdGxpYi91dGlsLnB5LHNoYTI1Nj1FMndVLVJaU2hQTUZVTUpyOWtQbWVtVFVMaW5NNHFEem9zTlBpaEN1S0UwLDUyOTkxDQpwaXAvX3ZlbmRvci9kaXN0bGliL3ZlcnNpb24ucHksc2hhMjU2PUNnZ2hPVXlseEdEN2RFQTJTM012V2p4N21ZXzJiV3NsdUYwT2YzWXhsNFksMjM3MTENCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdzMyLmV4ZSxzaGEyNTY9TEl0ckJKZXNFcXQyUVRRdUIteWhhMlliTWVnVVJIbUhtZFN4aGpCcW1uYyw4NTUwNA0KcGlwL192ZW5kb3IvZGlzdGxpYi93NjQuZXhlLHNoYTI1Nj1uX1Bpb0JDN2x0ejdzQWsxV0xiTHpaSmdTNFIyYXhTeV8wSFBmOFpDc0VnLDk0MjA4DQpwaXAvX3ZlbmRvci9kaXN0bGliL3doZWVsLnB5LHNoYTI1Nj1VUDUzY0t4T001cjdiSFNTLW41cHJGNmh3SkVWc01XOVpOSnV0T3VDMjZjLDM5MTE1DQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9fX2luaXRfXy5weSxzaGEyNTY9YnFTX2RUT0g2dVc5aUdnZDB1emZwUGpvNnZaNHhwUFo3a3lmWkoydk5hdywyNzQNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L21pc2MucHksc2hhMjU2PUtXZWNJTmRiRk5PeFNPUDFmR0Y2ODBDSm5hQzZTNGZCUmdFdGFZVHcwaWcsOTcxDQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zaHV0aWwucHksc2hhMjU2PVZXMXQzdVlxVWpXWkg3alYtNlFpaW1MaG5sZG9WNXVJcEg0RXVpVDFqZncsMjU2NDcNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3N5c2NvbmZpZy5jZmcsc2hhMjU2PXN3Wkt4cTlSWTVlOXIzUFhDcmx2UVBNc3ZPZGlXWkJUSExFYnFTOExKTFUsMjYxNw0KcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLnB5LHNoYTI1Nj1lU0V5Smc3anhGX2VIbEhHOElPdGw5M2tiMDdVb01JUnAxd1lzUGVHaTlrLDI2OTU1DQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC90YXJmaWxlLnB5LHNoYTI1Nj1JaHA3clhSY2piSUt3OENPbTl3U2VQVjlBUkdYYlNGOWdHWEFNbjJRLUtVLDkyNjI4DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fX2luaXRfXy5weSxzaGEyNTY9SnNJd21GbGRrLTlyYUJhZFBTVFM3NEpyZm1Kdm96Yy0zYWVrTWk3SHI5cyw3ODANCnBpcC9fdmVuZG9yL2h0bWw1bGliL19paGF0ZXhtbC5weSxzaGEyNTY9dHpYeWdZbWlzVW1pRVV0MnY3RTFBYjUwQUtRc3JELVNnbFBSblk3NXZNRSwxNjcwNQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX2lucHV0c3RyZWFtLnB5LHNoYTI1Nj1DNGxYNWdVQndlYk9XeTQxaFlQMlpCcGtQVk52eGtfaFpCbTNPVnlQWk00LDMyNTMyDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdG9rZW5pemVyLnB5LHNoYTI1Nj1ZQWFPRUJENnFjNUlTcTlYdDlOaWYxT0ZnY3liVFRmTWR3cUJrWmhwQXE0LDc2NTgwDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdXRpbHMucHksc2hhMjU2PWJTNlRIVmxMOFp5VGNJNkNJeGlNNnh4dUhzRThpMWo1T2dkM0hhMUc4NFUsNDA5Ng0KcGlwL192ZW5kb3IvaHRtbDVsaWIvY29uc3RhbnRzLnB5LHNoYTI1Nj1EZmMxRnYzXzlmcmt0Z1dqZzR0YmotQ2pNTXAwMktvOXFNZTRpbDFCVmRvLDgzMzg3DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9odG1sNXBhcnNlci5weSxzaGEyNTY9RG1sdTlobHE1d19pZDZtQlp5WV9zRTVMdWtJQUNndkc0a3BnSXNkZWQ4USwxMTcxNzANCnBpcC9fdmVuZG9yL2h0bWw1bGliL3NlcmlhbGl6ZXIucHksc2hhMjU2PVVycnNhMGNQUExxTlgtVWJKV1MyZ1Voc18wNnFWYk54WnZVbnJtR1pLNkUsMTQxNzcNCnBpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL19faW5pdF9fLnB5LHNoYTI1Nj04VlIxYmNnRDJPcGVTMlhFeHB1NXlCaFBfUTFLLWx3S2JCS0lDQlBmMWtVLDI4OQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvX2Jhc2UucHksc2hhMjU2PTZQX0FjSW9HanR3QjJxQWxoVjhINFZQLXp0UXhvWEZHd3Q0TnlNcUdfS3csOTc5DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9kYXRyaWUucHksc2hhMjU2PUVRcHFTZmtaUnVUYkUtRHVoVzd4TWRWRHhkWk5aMENmbW5ZZkhBXzN6eE0sMTE3OA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvcHkucHksc2hhMjU2PXdYbVFMclpSZjRNeVdOeWcwbTNoODFtOUluaExSN0dKMDAybUlJWmgtOG8sMTc3NQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2FscGhhYmV0aWNhbGF0dHJpYnV0ZXMucHksc2hhMjU2PURYdi1QMnZkUTVGM09UV002UVo2S2h5RGxBV205MHBiZnJEMUJrOURfbDAsNjIxDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2Jhc2UucHksc2hhMjU2PXotSVU5WkFZanBzVnNxbVZ0N2t1V0M2M2pSMTFoRE1yNkNWcnZ1YW84VzAsMjg2DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2luamVjdF9tZXRhX2NoYXJzZXQucHksc2hhMjU2PTJRX0puTXNjbl90TmJWX3FwZ1lOXzVNM1BuQkdmbXV2RUNNS0RFeEhVY1ksMjc0Mg0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9saW50LnB5LHNoYTI1Nj1xZjVjTHJUNnhYZDhWN0dIMVJfM2xLeElqdUpTZnBiV1RwU3dhZ2xZZER3LDMzNjUNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvb3B0aW9uYWx0YWdzLnB5LHNoYTI1Nj1FSGlnNGtNLVFpTGp1eFZKM0ZBQUZOeS0xMGs0YVY2SEpiUXpIS1pfM3U4LDEwNTM0DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3Nhbml0aXplci5weSxzaGEyNTY9N1BxSnJobTZtbzNKdmFIazJJUVc3aTc0T3I3UXRkLUZWOFVmdEpJeUR5cywyNTExMg0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy93aGl0ZXNwYWNlLnB5LHNoYTI1Nj1LUHQwNjduWVRxcWk4S0xUQ2x5eW5uNGVWek5EQ18tTUFwWE5WSFJYVlgwLDExMzkNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9fX2luaXRfXy5weSxzaGEyNTY9bDNMY3FNU0V5b2g5OUpoX2VXakdleEhuSXZLaExBWG9QLUxEejg4d2h1TSwyMDgNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9nZW5zaGkucHksc2hhMjU2PTZWSXVIRE5vRXh2MUpXdjNlUGo2VjVDTS10Y3lpVVNXZTVfSGQyZWpid1ksMTU1NQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL3NheC5weSxzaGEyNTY9M29mNHZ2YVVZSUFpYzdwbmdlYndKVjI0aHBPUzdaZzlnZ0phX1dRZWd5NCwxNjYxDQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvX19pbml0X18ucHksc2hhMjU2PVVsQjRvcmtUZ1poRklLUWRYcnRpV245Y3BLU3N1aG5PUU9JSGVEMEZ2NGssMzQwNg0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2Jhc2UucHksc2hhMjU2PTR2ZGptX1oyZl9HVFFCd0tuV2xyelZjY3RUYi1LNXNmTjhwWERhV09EaUEsMTM5NDINCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9kb20ucHksc2hhMjU2PVNZM01zaWpYeXpkTlBjOGFLNUlRc3VwQm9NOEo2N3k1NkRnTnRHdnNiOWcsODgzNQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlLnB5LHNoYTI1Nj1hcUlCT0dqX2RGWXFCVVJJY1RlZ0dOQmhBSUpPdzVpRkRIYjRqcmtZSC04LDEyNzY0DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZXRyZWVfbHhtbC5weSxzaGEyNTY9Q0Vnd0hNSVFadklERkFxY3Q0a3FQa1Z0eUtJbTllZkhGcV9WZUV4RVBDQSwxNDE2MQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvX19pbml0X18ucHksc2hhMjU2PUNGcFVPQ2ZMdWhBZ1ZKOE5Zazl3dmlDdTFraFludjdYUlN0dnl6VTFGd3MsNTU0NA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvYmFzZS5weSxzaGEyNTY9ZWktMmNGYk5GZDBnUmp5YUZteG54WkdMTklENG8wYkhGQ0g5Yk15WjVCayw0OTM5DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9kb20ucHksc2hhMjU2PUVIeUZSOEQ4bFlObnlEVTlseF9JS2lnVkpSeWVjVUd1YTBtT2k3SEJ1a2MsMTQxMw0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWUucHksc2hhMjU2PThqVkxFWTJGamdONFJGdWd3aEFoNDRsOVNjVllvRFN0UUZDbmxQd3ZhZkksNDY4NA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWVfbHhtbC5weSxzaGEyNTY9c1k2d2ZSc2hXVGxsdTZuNDhUUFdwS3NRUlBwLTBDUXJUMGhqX0FkekhTVSw2MzA5DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9nZW5zaGkucHksc2hhMjU2PTREMlBFQ1o1bjNaTjNxdTNqTWw5eVk3Qjgxam5RQXBCUVNWbGZhSXVZYkEsMjMwOQ0KcGlwL192ZW5kb3IvaWRuYS9fX2luaXRfXy5weSxzaGEyNTY9OU50N3hweWV0M0RtT3JQVUdvb0RkQXdtSFpadTFxVUF5MkVhSjkza0dpUSw1OA0KcGlwL192ZW5kb3IvaWRuYS9jb2RlYy5weSxzaGEyNTY9bHZZYjd5dTdQaEFxRmFBSUFkV2N3Z2FXSTJVbWdzZVV1YS0xYzBBc0cwQSwzMjk5DQpwaXAvX3ZlbmRvci9pZG5hL2NvbXBhdC5weSxzaGEyNTY9Ui1oMjlELTZtcm5KemJYeHltcldVVzdpWlV2eS0yNlRRd1owaWo1N2k0VSwyMzINCnBpcC9fdmVuZG9yL2lkbmEvY29yZS5weSxzaGEyNTY9R2FmaVdkWVFJSzVUU2pXZFJ6Q1lDaG83MDRBTHRNQ3JWX2RuWFhuNTdVMCwxMTM5MA0KcGlwL192ZW5kb3IvaWRuYS9pZG5hZGF0YS5weSxzaGEyNTY9LUNnODNsdXJLb0E5cDdsYjBsTUFzb3MwckZ6MWRuS3JHZUJFM284VXVDQSwzMjk5OQ0KcGlwL192ZW5kb3IvaWRuYS9pbnRyYW5nZXMucHksc2hhMjU2PVRZMWxweFpJUVdFUDZ0TnFqWmtGQTVoZ29NV09qMU9CbW5VRzhpaFQ4N0UsMTc0OQ0KcGlwL192ZW5kb3IvaWRuYS9wYWNrYWdlX2RhdGEucHksc2hhMjU2PUtNU1VUU19NN1paN1VnbF9WX0VPeFYtRDNvN3Y3eVZrdDQ1SktfYnBXMjQsMjENCnBpcC9fdmVuZG9yL2lkbmEvdXRzNDZkYXRhLnB5LHNoYTI1Nj1ZeWxRWUJmbGpBeF9XVnFSMkQ3SGdjR0d5VkNXd1BtNnVGMzhhRVJ1aHl3LDE4NDk0NA0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvX19pbml0X18ucHksc2hhMjU2PVRxcHo5MER3S1lmaFBzZnpWT0psODRUTDg3cGRGRTVlUE5IZFhBeHM0VGssOTM3MQ0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvbGlua2xvY2tmaWxlLnB5LHNoYTI1Nj1DN09IM0g0R2RLNjh1NEZRZ3A4ZmtQMmtPNGZ5VVRTeWozWDZibGdmb2JjLDI2NTINCnBpcC9fdmVuZG9yL2xvY2tmaWxlL21rZGlybG9ja2ZpbGUucHksc2hhMjU2PWUzcWdJTC1ldFpNTHNTLTNmdDE5aVdfOElRMzYwSE5rR09xRTN5QktzVXcsMzA5Ng0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvcGlkbG9ja2ZpbGUucHksc2hhMjU2PXVrSDl1azZORnV4eVZtRzVRaVd3NGlLcTNmVDdNanFVZ3VYOTVhdllQSVksNjA5MA0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3FsaXRlbG9ja2ZpbGUucHksc2hhMjU2PW8yVE1rTVJZMGl3bi1pTDFYTVJSSUZTdE1Va1M0aTNhamNlZVlObnRLRmcsNTUwNg0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3ltbGlua2xvY2tmaWxlLnB5LHNoYTI1Nj1BQndYWG12VEh2Q2w1dmlQYmxTaEwzUEctZ0dzTGlUMXJvQU1mRFJ3aGk4LDI2MTYNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHksc2hhMjU2PXprY0NQVE5fNlRjTFcwTnJsZzAxNzYtUjFRUV9XVlBUbThzejFSNC1Iak0sNzIwDQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHksc2hhMjU2PV92TmFjNVRyendzcnpiT0ZJYkYtNWNIcWNfWTJhUFQyRDd6cklSMDZCT28sNTEzDQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSxzaGEyNTY9VmlfQTByQVFlSGJVLWE5WDB0dDF5UW05UnFrZ1FiRFN4elJ3OFdsVTlrQSw4NjANCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weSxzaGEyNTY9UkltRUNKNGNfd1RsYVRZWXdaWUxIRWllYkRNYUFKbUsxb1BBUmh3MVQ1bywxNDE2DQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSxzaGEyNTY9bXRnMm5waEpFMW9RTzM5ZzFEZ3NkUHNNTy1ndUJCQ2xwUi1BRVlGcmJNZyw4MjMwDQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5LHNoYTI1Nj1TRDdkVkpHamRQVXF0b0hiNDdxd0s2d1dKVFFkLVpYV2p4cEpnODNVY0JBLDQzMjcNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5LHNoYTI1Nj1TQU1SZXJ6TzNmSzJJa0ZaQ2Faa3V3WmFMX0VHcUhOT3o0cG5pNHZobk4wLDI4MDI1DQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHksc2hhMjU2PTNtNld2UG02Tk54RThya1RHbW4wcjc1Ql9HWlNHZzdpa2FmeEhzQk4xV0EsNDIxDQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSxzaGEyNTY9T3dHbnhZZnIyZ2hOell4NTlxV0lCa3JLM1NuQjZuLVpmZDFYYUxwbm5NMCwxMTU1Ng0KcGlwL192ZW5kb3IvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSxzaGEyNTY9Q2N3dUh0Q0JabjlPVGttZ0Y5Y0ZwYWRJQU1obHJuWlRWS1RPbzRWMnA1OCwxMDMyMzANCnBpcC9fdmVuZG9yL3Byb2dyZXNzL19faW5pdF9fLnB5LHNoYTI1Nj1XbjEwNzRMVURab3ZkNHpmb1ZZb2puUEJnT2M2Y3RIYlFYN3JwX3A4bFJBLDMwMjMNCnBpcC9fdmVuZG9yL3Byb2dyZXNzL2Jhci5weSxzaGEyNTY9WU5QSmVScndZVktGTzJueWFFd3NRallCeWFtTVdUZ0pNdlFPMU5wRC1BWSwyNjg1DQpwaXAvX3ZlbmRvci9wcm9ncmVzcy9jb3VudGVyLnB5LHNoYTI1Nj1rRXFBOGpXRWR3cmM2UF85VmFSeDdiak9Id2s5Z3hsLVE5b1ZiUTA4djVjLDE1MDINCnBpcC9fdmVuZG9yL3Byb2dyZXNzL2hlbHBlcnMucHksc2hhMjU2PUZlaGZ3WlR2LTVjQ2ZzYmNNbHZsVWttM3haMGNSaHNldjZYVnBtZVRGNGMsMjg1NA0KcGlwL192ZW5kb3IvcHJvZ3Jlc3Mvc3Bpbm5lci5weSxzaGEyNTY9aUNWdFVRYmFKVUZIVGpuMVpMUFFMUFllYW80bEM5YVhBYV9IeEllVUs2aywxMzE0DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9fX2luaXRfXy5weSxzaGEyNTY9SlJGVkJ3Nkp5Vjk4V1FTcXY4anNoYzVfZzl4SWJMaGV2STVMSGFWaTlJNCwzNTc1DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9fX3ZlcnNpb25fXy5weSxzaGEyNTY9QlEyNzlianFRXzhQSGh2RF9GTjM2VXVGcWpiU1Vxc203Yk1leUpWLWtWbyw0MzYNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL19pbnRlcm5hbF91dGlscy5weSxzaGEyNTY9WngzUG5FVWNjeWZzQi1pZTExblpWQVc4cUNsSnkwZ3gxcU5NRTdyZ1QxOCwxMDk2DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9hZGFwdGVycy5weSxzaGEyNTY9TEFheTNPSDBaYnZJNmJEV19NNU9mMDZ0VTV6MmZuQ2ZscnBfWG0zOEtzWSwyMTAxNg0KcGlwL192ZW5kb3IvcmVxdWVzdHMvYXBpLnB5LHNoYTI1Nj1CcVZabnZzV3U2UHdtMHZRM2Z3X0RqOV9JLWdjT1I5Q2JTY0IyaHRQQXJBLDYyMzcNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2F1dGgucHksc2hhMjU2PTRLQ0ZRSHJMMUxjb3gzdU1oNHRqT2gzT3JKaHctRjV6dGk5MXdZLVp5VFksOTcyOA0KcGlwL192ZW5kb3IvcmVxdWVzdHMvY2FjZXJ0LnBlbSxzaGEyNTY9N0NFWGZMSHhEd3ZEcHdWdTB5XzJsZkpZazYzY1UtS1VLSV9ETDFMcThVbywyNzEwODgNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2NlcnRzLnB5LHNoYTI1Nj1uWFJWcTlEdEdtdl8xQVlid2pUdTlVcmdBY2RKdjA1WnZrTmVhb0xPWnhZLDQ2NQ0KcGlwL192ZW5kb3IvcmVxdWVzdHMvY29tcGF0LnB5LHNoYTI1Nj1rY3FoVjdVNDNjNGk4T3VrNWU1WWRKWE1ERW1XTkxUOTdMWW02VW9yLTc0LDE2MjYNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2Nvb2tpZXMucHksc2hhMjU2PXU3UUM1aG1sb013ZFQ5LTJ0YXo1R3B3QXZ6cDJMVFVTOWNQNFNXVUtuZk0sMTgyMDgNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2V4Y2VwdGlvbnMucHksc2hhMjU2PW9ad1l3Q202NVkwRk11RnFvakVnVWxXVUJRNE1rWFJ5NVVSSFYxYjk4TDQsMzExNQ0KcGlwL192ZW5kb3IvcmVxdWVzdHMvaGVscC5weSxzaGEyNTY9VXVCVHRjN3RFcG5VX2l2bnB1azJoamd6dVM2ejdHblRFa1NiRU5sYzFYUSwzNjY3DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9ob29rcy5weSxzaGEyNTY9SFhBSG9DMUZOVEZSWlg2LWxOZHZQTTdUc3Q0a3ZHd1lUTi1BT0tSeG9SVSw3NjcNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL21vZGVscy5weSxzaGEyNTY9bGN6MkdFT2UyZU91LUdxQUdkcEEwdkpVcEk3RUU0ZURTbFdJNzhSOFk2NCwzNDA1MQ0KcGlwL192ZW5kb3IvcmVxdWVzdHMvcGFja2FnZXMucHksc2hhMjU2PW5qSm1WaWZZNGFTY3R1VzNQUDVFRlJDeGpFd01SRE82Sl9mZUcyZEtXc0ksNjk1DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9zZXNzaW9ucy5weSxzaGEyNTY9X0E1cXBmcm9oSFZGWUxFdVZ5RUo0djMtbElsTndPM0dwSEctTHprV0ZDTSwyNzU0Ng0KcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RhdHVzX2NvZGVzLnB5LHNoYTI1Nj1hOWJ3dVU3bE1yNEhzaHNSWmR6QmJVc1lWc0lvNEZ1OUdZZzFYRlRGRlBjLDMzMjMNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL3N0cnVjdHVyZXMucHksc2hhMjU2PXlleEN2V2JYNDBNNkU4bUxRT3BBR1paLVpvQW55YVQyZG5pLUJwLWI0MmcsMzAxMg0KcGlwL192ZW5kb3IvcmVxdWVzdHMvdXRpbHMucHksc2hhMjU2PXNQRWtTVkxYbkdsZm9iYkpNbng1RTlWYzRrZnY2VHBGV3BIS0ZCOHdPOFUsMjc2NTINCnBpcC9fdmVuZG9yL3VybGxpYjMvX19pbml0X18ucHksc2hhMjU2PUVmVVBGOVJIdmVhRjlnNWRjSzVrQnNHRHA1THJJQi0zOTZNcEsyUlFrMUksMjg1Mw0KcGlwL192ZW5kb3IvdXJsbGliMy9fY29sbGVjdGlvbnMucHksc2hhMjU2PWIwLXg0NUxCQXJzOTZSdW01eEdBYlBzcml3ZkIzTVpWUWJzdjdsRmlVd0UsMTAyMDQNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29ubmVjdGlvbi5weSxzaGEyNTY9NEdLUjh1WEh6NklwenRZaHR1aEtCcVhqODRIYmJGVUYzQ3Z3eW1HZkxEMCwxMzAwMw0KcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9ucG9vbC5weSxzaGEyNTY9NXViOENYbktzMXdjMlgtTXl1VlZQbzNfOXNjV0xnaFNnYkhPSlRwUVh1RSwzNTM1OA0KcGlwL192ZW5kb3IvdXJsbGliMy9leGNlcHRpb25zLnB5LHNoYTI1Nj1kejFnQkVndFJPbkxyVzhWOTExS2hWWldlQW4zSDJPaERHenRXTlhRcHIwLDY2MDMNCnBpcC9fdmVuZG9yL3VybGxpYjMvZmllbGRzLnB5LHNoYTI1Nj1Zck5STThSQlVtTThndVhLVVFGYTNrd2o2WHZRWjc4WjhpbkU2bC1ZSy1FLDU5NDMNCnBpcC9fdmVuZG9yL3VybGxpYjMvZmlsZXBvc3QucHksc2hhMjU2PU5GNlJseTY2YmlsV1Utc2RVTFhqQ2RRZ04xdVJ4ZkZSZWRlaWZjUkx6a1UsMjMyMQ0KcGlwL192ZW5kb3IvdXJsbGliMy9wb29sbWFuYWdlci5weSxzaGEyNTY9LTUxQkFQbEQwTWdFQ1lkdUhoZmJaQ0VpWm9VX05ERk9LWWxoU2ppZmYyUSwxNjM0NQ0KcGlwL192ZW5kb3IvdXJsbGliMy9yZXF1ZXN0LnB5LHNoYTI1Nj13cnQyRDBTV0xMZ1RSS3JSbmFab3BocTJ4WHBDdk5SZDdSTVQ2RjVvNWhZLDU5NDYNCnBpcC9fdmVuZG9yL3VybGxpYjMvcmVzcG9uc2UucHksc2hhMjU2PTdtR1VIMzVMMklQdVpWT1k3UXZEUTFHU1NLSWY2VjZnZUpYVGhkam1RRDQsMjI5MDMNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvYXBwZW5naW5lLnB5LHNoYTI1Nj00MWwzYXJUeS1rQkJwT2RWcFNQWVZDNjRRbzdSTG5YbkRFRDZoY0l0aEEwLDEwODY1DQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvbnRsbXBvb2wucHksc2hhMjU2PVE5LXJPNVJoMi1JcXlFZDRaaWNwVERmTW5PbGYwSVBQQ2tqaENoQkNqVjQsNDQ3OA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3B5b3BlbnNzbC5weSxzaGEyNTY9QnhKMXlNUEU2MmR1dUhKUDZqbFp4THpfRk5US2JXSTBiLW5WUktsQkRnSSwxNTM1NA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NlY3VyZXRyYW5zcG9ydC5weSxzaGEyNTY9WlJQejZRMXRuc3U5SDFCT0FRVlVTSEl5b3dXbWZhQmI3cEdsYkc1aU9QaywzMDUwMQ0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NvY2tzLnB5LHNoYTI1Nj16UFlVS01nX2MwbjlIRmpaUEc5bkdOMmtqcGFIN3FVQ1p4ckQ1QjdHMF9JLDYxOTUNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2JpbmRpbmdzLnB5LHNoYTI1Nj14MmtMU2gtQVNaS3N1bjBGeHRyYUJ1TFZlM29IdXRoNFlXNnlaNVZvZi13LDE3NTYwDQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9sb3dfbGV2ZWwucHksc2hhMjU2PVViaFV5a0VINkhVSUp1ZDlfcm5fNllXamlvbms1aXFfcnE2WXJoVk02Q28sMTIwNjINCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvX19pbml0X18ucHksc2hhMjU2PW5sQ2hyR3prakNrbWhDWDlIckZfcUhQVWdvc2ZzUFFrVklKeGlpTGhrOWcsMTA5DQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL29yZGVyZWRfZGljdC5weSxzaGEyNTY9VlFhUE9OZmhWTXNiOEI2M1hnN1pPeWRKcUlFX2p6ZU1oVk4zUGVjNm9ndyw4OTM1DQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NpeC5weSxzaGEyNTY9QTZoZEpaVmpJM3RfZ2VlYlo5QnpVdndScklYbzBsZnd6UWxNMkxjS3lhcywzMDA5OA0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvbWFrZWZpbGUucHksc2hhMjU2PXIxSUFEb2xfcEJCcTJZMXViNENQeXVTMmhYdVNoSzQ3bmZGbmdaUmNSaEksMTQ2MQ0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX19pbml0X18ucHksc2hhMjU2PVdCVmJ4UUJvak5BeGZad05hdmtveDNCZ0ppTUE5QkptbS1fZndkMGpEX28sNjg4DQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NzbF9tYXRjaF9ob3N0bmFtZS9faW1wbGVtZW50YXRpb24ucHksc2hhMjU2PWxBajdxR0NaTE9sZGhuOGdaRFk2VHFwNG12Z2tiVGZ5NGs0Z0RJRFJvOGcsNTcwMg0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL19faW5pdF9fLnB5LHNoYTI1Nj02UmFuNG9BVkl5NDBDdV9vRVBXbk5WOWJ3RjVyWHg2RzFEVVo3b2VoalBZLDEwNDQNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9jb25uZWN0aW9uLnB5LHNoYTI1Nj1fNl81SlpKRjNISFJYUjdIYXhIZzNtazdxTUtLM04wbmwzREw4Z0ZBZm80LDQyMzcNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXF1ZXN0LnB5LHNoYTI1Nj1INV9sckh2dHdsMlUyQmJUMVVZTjlIcHJ1TmMxZ3NORmx6Mm5qUW1oUHJRLDM3MDUNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXNwb25zZS5weSxzaGEyNTY9U1NOTDg4OFctTVE4dDNIQWk0NGtOR2dGNjgycDZIX195dEVYekJZeFZfTSwyMzQzDQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmV0cnkucHksc2hhMjU2PXA0TEhtLU9WYU5kTnlaLWhvQW9kVElveE5vY0F1dWVnVDM2SHhfR2N3a2csMTQ2MDENCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zZWxlY3RvcnMucHksc2hhMjU2PVBJSU56d2ppRDVaNkl5VEtBMXRSNW4xa0NPWHlUaHBEQ0UyZkNWRnpMZU0sMjExNDcNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zc2xfLnB5LHNoYTI1Nj1ZcGNpTTBtTl9yZDI3d2NoTEVOU3hUTmE3UFdFZ1oyTVA5YXRlRnVyQ2VvLDEyMjA4DQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdGltZW91dC5weSxzaGEyNTY9N2xITnJnTDVZSDJjSTFqLXlabnpWX0o4akJsUlZkbUZoUWFOeU0xXzJiOCw5NzU3DQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdXJsLnB5LHNoYTI1Nj1xQ1lfSEhVWHZvMDV3QXNFRVJBTGdFeHRsZ3hMbkFIU1E3Y2UxYi1nM1NNLDY0ODcNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC93YWl0LnB5LHNoYTI1Nj1RX3BkX2JENmlhUGdSS3dFbWNqVFlEclNQajREZDRvanlrbXFBMzk4YjhvLDE0NTENCnBpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9fX2luaXRfXy5weSxzaGEyNTY9dDdyQVFReFh3YWxZLWFrOWhUbDczcUhqaGlhOVVILXNMLWUwMHFRckJwbywxMDU3Ng0KcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL2xhYmVscy5weSxzaGEyNTY9NEFPX0t4VGRkcUd0ckw5bnM3a0FQamIwQ2NONnhzQ0l4YkszN0hZOXIzRSw4OTc5DQpwaXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvbWtsYWJlbHMucHksc2hhMjU2PUdZSWV5d25wYUxuUDBHU2ljOExGV2dkMFVWdk9fbDFOYzZZb0YtODdSXzQsMTMwNQ0KcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3Rlc3RzLnB5LHNoYTI1Nj03dlRrN0xnT0puX3QxWHRUX3Zpb2ZabEVKN2NKQ3pQZV9odlZIT2tjUWw4LDY1NjINCnBpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy94X3VzZXJfZGVmaW5lZC5weSxzaGEyNTY9NzJjZlBSaGJma1JDR2trQThabnZWVjdVbm9pTGI1dVBNaFh3aHJYaUxQayw0MzA2DQpwaXAvY29tbWFuZHMvX19pbml0X18ucHksc2hhMjU2PTJVcTNIQ2RqY2hKRDlGTDFMQjdyZDV2NlV5U1ZBVml6WDBXM0VYM2hJb0UsMjI0NA0KcGlwL2NvbW1hbmRzL2NoZWNrLnB5LHNoYTI1Nj0tQTdHSTEtV1pCaDlhNFA2VW9IX2FSLUo3SThMejhseTdtM3duQ2ptZXZzLDEzODINCnBpcC9jb21tYW5kcy9jb21wbGV0aW9uLnB5LHNoYTI1Nj1ra1BnVlg3U1VjSl84SnV3NUdrZ1dheEhOOV80NXdtQXI5bUdzMXpYRUVzLDI0NTMNCnBpcC9jb21tYW5kcy9kb3dubG9hZC5weSxzaGEyNTY9OFJ1dVBtU1lnQXEzaUVEVHFaWV8xUERYUnFSRWRVVUxITmpXSmVBdjdNbyw3ODEwDQpwaXAvY29tbWFuZHMvZnJlZXplLnB5LHNoYTI1Nj1oNi15Rk1wakNqYk5qOC1nT201VXVvRjZjZzE0TjVyUFY0VENpM19DZXVJLDI4MzUNCnBpcC9jb21tYW5kcy9oYXNoLnB5LHNoYTI1Nj1NQ3Q0akVGeWZvY2UwbFZlTkV6MXg0OXVhVFktVkRrS2lCdnZ4clZjSGt3LDE1OTcNCnBpcC9jb21tYW5kcy9oZWxwLnB5LHNoYTI1Nj04NEhXa0VkbkdQX0FFQkhubjhnSlAyVGUwWFRYUktGb1hxWG9wYk9aVE5vLDk4Mg0KcGlwL2NvbW1hbmRzL2luc3RhbGwucHksc2hhMjU2PW92RzlwOW4xWDJOUHFNZ0ZWdFN1VDlrTWJMQWR4MXIzWVNTaVhTdmdPS0ksMTc0MTINCnBpcC9jb21tYW5kcy9saXN0LnB5LHNoYTI1Nj05M2JDaUZ5dDJRdXRfWUhrWUhKTVpIcFhsYWRteHNqUy15T3RaZWIzdXFJLDExMzY5DQpwaXAvY29tbWFuZHMvc2VhcmNoLnB5LHNoYTI1Nj1vVHM5UU5kZWZucm1DVl9KZWZ0RzBQR2lNdVlWbWlFREYxT1VhWXNtRGFvLDQ1MDINCnBpcC9jb21tYW5kcy9zaG93LnB5LHNoYTI1Nj1aWU01N183VThLUDlNUUlJeUhLUWRaeG1pRVpCeXktRFJ6QjY5N1ZGb1RZLDU4OTENCnBpcC9jb21tYW5kcy91bmluc3RhbGwucHksc2hhMjU2PXR6OGNYejRXZHBVZG50M1J2cGRRd0g2X1NOTUI1MGVnQklaV2ExZHdmY2MsMjg4NA0KcGlwL2NvbW1hbmRzL3doZWVsLnB5LHNoYTI1Nj16NVNFaHdzMllSTWIwTWwxSUVrZzZqRlpNTFJwTGw4NmJIQ3JRYll0NXpvLDc3MjkNCnBpcC9jb21wYXQvX19pbml0X18ucHksc2hhMjU2PTJYc19JcHNtZFJnSGJRZ1FPMGM4X2xQdkhKblFYSHlHV3hQYkxiWUpMNGMsNDY3Mg0KcGlwL2NvbXBhdC9kaWN0Y29uZmlnLnB5LHNoYTI1Nj1kUnJlbFBEV3JjZURTekZUNTFSVEVWWTJHdU03VUR5YzVJZ2hfdG40RnZrLDIzMDk2DQpwaXAvbW9kZWxzL19faW5pdF9fLnB5LHNoYTI1Nj0wUnM3X1JBNER4ZU9rV1Q1Q3E0Q1F6RHJTRWh2WWNOM1RIMmNhenI3MlBFLDcxDQpwaXAvbW9kZWxzL2luZGV4LnB5LHNoYTI1Nj1wVWZiT19fdjNtRDlqLTJuX0Nsd1BTOHBWeXg0bDJ3SXd5dld0OEdNQ1JBLDQ4Nw0KcGlwL29wZXJhdGlvbnMvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0KcGlwL29wZXJhdGlvbnMvY2hlY2sucHksc2hhMjU2PXV3VU45Y3Mxc1BvN2MwU2o2cFJyU3Y3YjIyUGsyOVNYVUltVGVsVmNoTVEsMTU5MA0KcGlwL29wZXJhdGlvbnMvZnJlZXplLnB5LHNoYTI1Nj1rLTd3N0xzTS1ScFB2N0VSQnpIaVBwWWtILUd1WWZITHlSLUNwXzFWUEwwLDUxOTQNCnBpcC9yZXEvX19pbml0X18ucHksc2hhMjU2PXZGd1pZOF9WYzFXVTF6RkFlc3BnMU15X3JfQVQzbjdjTjBXOWVYMEVGcWssMjc2DQpwaXAvcmVxL3JlcV9maWxlLnB5LHNoYTI1Nj1mRzlNRHNYVU5QaG1Hd3hVaXdySVhFeW55RDhRN3MzTDQ3LWhMWlBEWHEwLDExOTI2DQpwaXAvcmVxL3JlcV9pbnN0YWxsLnB5LHNoYTI1Nj1nWXJILWx3UU1tdDU1VlZiYXZfRXRSSVB1OTRjUWJIRkhtX0txNkFlSGJnLDQ2NDg3DQpwaXAvcmVxL3JlcV9zZXQucHksc2hhMjU2PWpIc3BYcWNBMkZ4Y0YwNWRnVUlBWjVodVlQdjZibjB3UlVYMFo3UEttYUEsMzQ0NjINCnBpcC9yZXEvcmVxX3VuaW5zdGFsbC5weSxzaGEyNTY9ZmRIMlZnQ2pFQzhOUllEUzdmUnUzWkphQkJVRXktTjVtdXd4RFg1TUJOTSw2ODk3DQpwaXAvdXRpbHMvX19pbml0X18ucHksc2hhMjU2PUhYX3dZUzE1b2lZT3otSDNxRzFLYmkxQ1k3QUdXQ05LNWpsb2lEMGZhdWMsMjcxODcNCnBpcC91dGlscy9hcHBkaXJzLnB5LHNoYTI1Nj1rajJMSy1JMmZDNVFuRWhfQV92LWV2X0lRTWNYYVdXRjVERTM5c052Q0xRLDg4MTENCnBpcC91dGlscy9idWlsZC5weSxzaGEyNTY9NHNtTFJyZlNDbVhtakVuVm5NRmgydEJFcE5jU0xSZTZKMGVqWkotd1dKRSwxMzEyDQpwaXAvdXRpbHMvZGVwcmVjYXRpb24ucHksc2hhMjU2PVhfRk1qdERiTUpxZnFFa2RScmtpLW1ZeUlkUEI2STZESFVUQ0FfQ2hZNk0sMjIzMg0KcGlwL3V0aWxzL2VuY29kaW5nLnB5LHNoYTI1Nj1OUXhHaUZTNUdiZUF2ZUxaVG54OTJ0NXIwUFlxdnQwaVJuUDJ1OVNHRzF3LDk3MQ0KcGlwL3V0aWxzL2ZpbGVzeXN0ZW0ucHksc2hhMjU2PVpFVkJ1WU0zZnFyMl9sZ09FU2g0WTdmUEZzekdENDc0elZtX00zTWI1VGssODk5DQpwaXAvdXRpbHMvZ2xpYmMucHksc2hhMjU2PWpjUVlqdF9vSkxQS1ZaQjI4S2F1eTRTdzcwelMtd2F3eG9VMUhIWDM2XzAsMjkzOQ0KcGlwL3V0aWxzL2hhc2hlcy5weSxzaGEyNTY9b01rN2NkM1BiSmd6cFNReVhxMU15dE11ZDVmNkg1T2EyWVk1aFl1Q3E2SSwyODY2DQpwaXAvdXRpbHMvbG9nZ2luZy5weSxzaGEyNTY9N3lXdTRnWnctUWNsajdYODBRVmRwR1drZFRXR0tUNExpVVZLY0UwNHBybywzMzI3DQpwaXAvdXRpbHMvb3V0ZGF0ZWQucHksc2hhMjU2PWZOd09DTDVyMkVmdFBHaGdDWUdNS3UwMzJIQzhjVi1KQXI5bHAwSG1Ub00sNTQ1NQ0KcGlwL3V0aWxzL3BhY2thZ2luZy5weSxzaGEyNTY9cWhtbGkxNG9kdzZESWhXSmdRWVMyUTBSclNicjhuWE5jRzQ4ZjV5VFJtcywyMDgwDQpwaXAvdXRpbHMvc2V0dXB0b29sc19idWlsZC5weSxzaGEyNTY9MGJsZnNjbU5KV19pWjVEY3N3SmVEQl9QYnRURWpmSzlSTDFSMVdFRFcyRSwyNzgNCnBpcC91dGlscy91aS5weSxzaGEyNTY9cGJEa1NBZXVtWjZqZFpjT0oyeUFieDhpQmdlUDJ6ZnBxTm5MSksxZ3NrUSwxMTU5Nw0KcGlwL3Zjcy9fX2luaXRfXy5weSxzaGEyNTY9V2FmRmxpVVRITW1zU0lTVjhQSHAxTTVFWEROU1d5SnI3OHpLYVFtUExkWSwxMjM3NA0KcGlwL3Zjcy9iYXphYXIucHksc2hhMjU2PXRZVHdjNGI0b2ZmOG1yME8ybzhTaUdlanFCREp4Y2JEQk1TTWQ5LUlTWWMsMzgwMw0KcGlwL3Zjcy9naXQucHksc2hhMjU2PTVMZldyeWk3OEEtMlVMakVaSnZDVGFySl8zbDh2ZW53WEFTbHdtOGhpdWcsMTExOTcNCnBpcC92Y3MvbWVyY3VyaWFsLnB5LHNoYTI1Nj14RzZyRGl3SENSeXRKRXMyM1NJSEJYbF9Td1FvMmpra2REXzZyVlZQNWg0LDM0NzINCnBpcC92Y3Mvc3VidmVyc2lvbi5weSxzaGEyNTY9R0F1WDJTazdJWnZKeUV6RU5LY1ZsZF93R0JyUTNmcFhEbFhqYXBaRVlkSSw5MzUwDQpwaXAtOS4wLjMuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdCxzaGEyNTY9VmE4V2oxWEJwVGJWUTJaNDFtWlJKZEFMRWV6aWlTX1pld1duMUgyZWNZNCwxMjg3DQpwaXAtOS4wLjMuZGlzdC1pbmZvL01FVEFEQVRBLHNoYTI1Nj1rTTJ6WERvSVBpWjJxb2pma2FEQzdhS3FURnd1d2dNUlZKN0ZZVXRBQVZrLDI1NTMNCnBpcC05LjAuMy5kaXN0LWluZm8vUkVDT1JELCwNCnBpcC05LjAuMy5kaXN0LWluZm8vV0hFRUwsc2hhMjU2PWtkc04tNU9KQVpJaUhOLWlPNFJobDgyS3lTMGJEV2Y0dUJ3TWJrTmFmcjgsMTEwDQpwaXAtOS4wLjMuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHQsc2hhMjU2PVEtZlIydGNwOURSZGVYb0duMXdSNjdYZWN5MzJvNUV5UUVuekRnaHdxcWssNjgNCnBpcC05LjAuMy5kaXN0LWluZm8vbWV0YWRhdGEuanNvbixzaGEyNTY9NExtcnVpM2tuTDBiZ294bDE4c2N5czFVenRPZnVnVWZDekFSY3BLVzR6QSwxNTY1DQpwaXAtOS4wLjMuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHQsc2hhMjU2PXp1dXVlNGtub3lKLVV3UFBYZzhmZXpTN1ZDclhKUXJBUDd6ZU51d3ZGUWcsNA0KUEsDBBQAAAAAAAAAIQD23dK+bgAAAG4AAAA2AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL1dIRUVMV2hlZWwtVmVyc2lvbjogMS4wCkdlbmVyYXRvcjogYmRpc3Rfd2hlZWwgKDAuMzAuMCkKUm9vdC1Jcy1QdXJlbGliOiB0cnVlClRhZzogcHkyLW5vbmUtYW55ClRhZzogcHkzLW5vbmUtYW55CgpQSwMEFAAAAAAAAAAhALQXmMREAAAARAAAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFtjb25zb2xlX3NjcmlwdHNdCnBpcCA9IHBpcDptYWluCnBpcDMgPSBwaXA6bWFpbgpwaXAzLjYgPSBwaXA6bWFpbgoKUEsDBBQAAAAAAAAAIQDI4LebHQYAAB0GAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL21ldGFkYXRhLmpzb257ImNsYXNzaWZpZXJzIjogWyJEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlIiwgIkludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMiLCAiTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogTUlUIExpY2Vuc2UiLCAiVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogQnVpbGQgVG9vbHMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNCIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy41IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiBJbXBsZW1lbnRhdGlvbiA6OiBQeVB5Il0sICJleHRlbnNpb25zIjogeyJweXRob24uY29tbWFuZHMiOiB7IndyYXBfY29uc29sZSI6IHsicGlwIjogInBpcDptYWluIiwgInBpcDMiOiAicGlwOm1haW4iLCAicGlwMy42IjogInBpcDptYWluIn19LCAicHl0aG9uLmRldGFpbHMiOiB7ImNvbnRhY3RzIjogW3siZW1haWwiOiAicHl0aG9uLXZpcnR1YWxlbnZAZ3JvdXBzLmdvb2dsZS5jb20iLCAibmFtZSI6ICJUaGUgcGlwIGRldmVsb3BlcnMiLCAicm9sZSI6ICJhdXRob3IifV0sICJkb2N1bWVudF9uYW1lcyI6IHsiZGVzY3JpcHRpb24iOiAiREVTQ1JJUFRJT04ucnN0In0sICJwcm9qZWN0X3VybHMiOiB7IkhvbWUiOiAiaHR0cHM6Ly9waXAucHlwYS5pby8ifX0sICJweXRob24uZXhwb3J0cyI6IHsiY29uc29sZV9zY3JpcHRzIjogeyJwaXAiOiAicGlwOm1haW4iLCAicGlwMyI6ICJwaXA6bWFpbiIsICJwaXAzLjYiOiAicGlwOm1haW4ifX19LCAiZXh0cmFzIjogWyJ0ZXN0aW5nIl0sICJnZW5lcmF0b3IiOiAiYmRpc3Rfd2hlZWwgKDAuMzAuMCkiLCAia2V5d29yZHMiOiBbImVhc3lfaW5zdGFsbCIsICJkaXN0dXRpbHMiLCAic2V0dXB0b29scyIsICJlZ2ciLCAidmlydHVhbGVudiJdLCAibGljZW5zZSI6ICJNSVQiLCAibWV0YWRhdGFfdmVyc2lvbiI6ICIyLjAiLCAibmFtZSI6ICJwaXAiLCAicmVxdWlyZXNfcHl0aG9uIjogIj49Mi42LCE9My4wLiosIT0zLjEuKiwhPTMuMi4qIiwgInJ1bl9yZXF1aXJlcyI6IFt7ImV4dHJhIjogInRlc3RpbmciLCAicmVxdWlyZXMiOiBbIm1vY2siLCAicHJldGVuZCIsICJweXRlc3QiLCAic2NyaXB0dGVzdCAoPj0xLjMpIiwgInZpcnR1YWxlbnYgKD49MS4xMCkiXX1dLCAic3VtbWFyeSI6ICJUaGUgUHlQQSByZWNvbW1lbmRlZCB0b29sIGZvciBpbnN0YWxsaW5nIFB5dGhvbiBwYWNrYWdlcy4iLCAidGVzdF9yZXF1aXJlcyI6IFt7InJlcXVpcmVzIjogWyJtb2NrIiwgInByZXRlbmQiLCAicHl0ZXN0IiwgInNjcmlwdHRlc3QgKD49MS4zKSIsICJ2aXJ0dWFsZW52ICg+PTEuMTApIl19XSwgInZlcnNpb24iOiAiOS4wLjMifVBLAwQUAAAAAAAAACEAxx+XwgQAAAAEAAAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0cGlwClBLAwQUAAAAAAAAACEADVvQdrQuAAC0LgAALAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL19faW5pdF9fLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9jYWxlCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgb3B0cGFyc2UKaW1wb3J0IHdhcm5pbmdzCgppbXBvcnQgc3lzCmltcG9ydCByZQoKIyAyMDE2LTA2LTE3IGJhcnJ5QGRlYmlhbi5vcmc6IHVybGxpYjMgMS4xNCBhZGRlZCBvcHRpb25hbCBzdXBwb3J0IGZvciBzb2NrcywKIyBidXQgaWYgaW52b2tlZCAoaS5lLiBpbXBvcnRlZCksIGl0IHdpbGwgaXNzdWUgYSB3YXJuaW5nIHRvIHN0ZGVyciBpZiBzb2NrcwojIGlzbid0IGF2YWlsYWJsZS4gIHJlcXVlc3RzIHVuY29uZGl0aW9uYWxseSBpbXBvcnRzIHVybGxpYjMncyBzb2NrcyBjb250cmliCiMgbW9kdWxlLCB0cmlnZ2VyaW5nIHRoaXMgd2FybmluZy4gIFRoZSB3YXJuaW5nIGJyZWFrcyBERVAtOCB0ZXN0cyAoYmVjYXVzZSBvZgojIHRoZSBzdGRlcnIgb3V0cHV0KSBhbmQgaXMganVzdCBwbGFpbiBhbm5veWluZyBpbiBub3JtYWwgdXNhZ2UuICBJIGRvbid0IHdhbnQKIyB0byBhZGQgc29ja3MgYXMgeWV0IGFub3RoZXIgZGVwZW5kZW5jeSBmb3IgcGlwLCBub3IgZG8gSSB3YW50IHRvIGFsbG93LXN0ZGVyCiMgaW4gdGhlIERFUC04IHRlc3RzLCBzbyBqdXN0IHN1cHByZXNzIHRoZSB3YXJuaW5nLiAgcGRiIHRlbGxzIG1lIHRoaXMgaGFzIHRvCiMgYmUgZG9uZSBiZWZvcmUgdGhlIGltcG9ydCBvZiBwaXAudmNzLgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgRGVwZW5kZW5jeVdhcm5pbmcKd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PURlcGVuZGVuY3lXYXJuaW5nKSAgIyBub3FhCgojIFdlIHdhbnQgdG8gaW5qZWN0IHRoZSB1c2Ugb2YgU2VjdXJlVHJhbnNwb3J0IGFzIGVhcmx5IGFzIHBvc3NpYmxlIHNvIHRoYXQgYW55CiMgcmVmZXJlbmNlcyBvciBzZXNzaW9ucyBvciB3aGF0IGhhdmUgeW91IGFyZSBlbnN1cmVkIHRvIGhhdmUgaXQsIGhvd2V2ZXIgd2UKIyBvbmx5IHdhbnQgdG8gZG8gdGhpcyBpbiB0aGUgY2FzZSB0aGF0IHdlJ3JlIHJ1bm5pbmcgb24gbWFjT1MgYW5kIHRoZSBsaW5rZWQKIyBPcGVuU1NMIGlzIHRvbyBvbGQgdG8gaGFuZGxlIFRMU3YxLjIKdHJ5OgogICAgaW1wb3J0IHNzbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCmVsc2U6CiAgICBpZiAoc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZAogICAgICAgICAgICBnZXRhdHRyKHNzbCwgIk9QRU5TU0xfVkVSU0lPTl9OVU1CRVIiLCAwKSA8IDB4MTAwMDEwMGYpOiAgIyBPcGVuU1NMIDEuMC4xCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuY29udHJpYiBpbXBvcnQgc2VjdXJldHJhbnNwb3J0CiAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWN1cmV0cmFuc3BvcnQuaW5qZWN0X2ludG9fdXJsbGliMygpCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBJbnN0YWxsYXRpb25FcnJvciwgQ29tbWFuZEVycm9yLCBQaXBFcnJvcgpmcm9tIHBpcC51dGlscyBpbXBvcnQgZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zLCBnZXRfcHJvZwpmcm9tIHBpcC51dGlscyBpbXBvcnQgZGVwcmVjYXRpb24sIGRpc3RfaXNfZWRpdGFibGUKZnJvbSBwaXAudmNzIGltcG9ydCBnaXQsIG1lcmN1cmlhbCwgc3VidmVyc2lvbiwgYmF6YWFyICAjIG5vcWEKZnJvbSBwaXAuYmFzZXBhcnNlciBpbXBvcnQgQ29uZmlnT3B0aW9uUGFyc2VyLCBVcGRhdGluZ0RlZmF1bHRzSGVscEZvcm1hdHRlcgpmcm9tIHBpcC5jb21tYW5kcyBpbXBvcnQgZ2V0X3N1bW1hcmllcywgZ2V0X3NpbWlsYXJfY29tbWFuZHMKZnJvbSBwaXAuY29tbWFuZHMgaW1wb3J0IGNvbW1hbmRzX2RpY3QKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IEluc2VjdXJlUmVxdWVzdFdhcm5pbmcKCgojIGFzc2lnbm1lbnQgZm9yIGZsYWtlOCB0byBiZSBoYXBweQoKIyBUaGlzIGZpeGVzIGEgcGVjdWxpYXJpdHkgd2hlbiBpbXBvcnRpbmcgdmlhIF9faW1wb3J0X18gLSBhcyB3ZSBhcmUKIyBpbml0aWFsaXNpbmcgdGhlIHBpcCBtb2R1bGUsICJmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucyIgaXMgcmVjdXJzaXZlCiMgYW5kIGFwcGVhcnMgbm90IHRvIHdvcmsgcHJvcGVybHkgaW4gdGhhdCBzaXR1YXRpb24uCmltcG9ydCBwaXAuY21kb3B0aW9ucwpjbWRvcHRpb25zID0gcGlwLmNtZG9wdGlvbnMKCiMgVGhlIHZlcnNpb24gYXMgdXNlZCBpbiB0aGUgc2V0dXAucHkgYW5kIHRoZSBkb2NzIGNvbmYucHkKX192ZXJzaW9uX18gPSAiOS4wLjMiCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgojIEhpZGUgdGhlIEluc2VjdXJlUmVxdWVzdFdhcm5pbmcgZnJvbSB1cmxsaWIzCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1JbnNlY3VyZVJlcXVlc3RXYXJuaW5nKQoKCmRlZiBhdXRvY29tcGxldGUoKToKICAgICIiIkNvbW1hbmQgYW5kIG9wdGlvbiBjb21wbGV0aW9uIGZvciB0aGUgbWFpbiBvcHRpb24gcGFyc2VyIChhbmQgb3B0aW9ucykKICAgIGFuZCBpdHMgc3ViY29tbWFuZHMgKGFuZCBvcHRpb25zKS4KCiAgICBFbmFibGUgYnkgc291cmNpbmcgb25lIG9mIHRoZSBjb21wbGV0aW9uIHNoZWxsIHNjcmlwdHMgKGJhc2gsIHpzaCBvciBmaXNoKS4KICAgICIiIgogICAgIyBEb24ndCBjb21wbGV0ZSBpZiB1c2VyIGhhc24ndCBzb3VyY2VkIGJhc2hfY29tcGxldGlvbiBmaWxlLgogICAgaWYgJ1BJUF9BVVRPX0NPTVBMRVRFJyBub3QgaW4gb3MuZW52aXJvbjoKICAgICAgICByZXR1cm4KICAgIGN3b3JkcyA9IG9zLmVudmlyb25bJ0NPTVBfV09SRFMnXS5zcGxpdCgpWzE6XQogICAgY3dvcmQgPSBpbnQob3MuZW52aXJvblsnQ09NUF9DV09SRCddKQogICAgdHJ5OgogICAgICAgIGN1cnJlbnQgPSBjd29yZHNbY3dvcmQgLSAxXQogICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgY3VycmVudCA9ICcnCgogICAgc3ViY29tbWFuZHMgPSBbY21kIGZvciBjbWQsIHN1bW1hcnkgaW4gZ2V0X3N1bW1hcmllcygpXQogICAgb3B0aW9ucyA9IFtdCiAgICAjIHN1YmNvbW1hbmQKICAgIHRyeToKICAgICAgICBzdWJjb21tYW5kX25hbWUgPSBbdyBmb3IgdyBpbiBjd29yZHMgaWYgdyBpbiBzdWJjb21tYW5kc11bMF0KICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgIHN1YmNvbW1hbmRfbmFtZSA9IE5vbmUKCiAgICBwYXJzZXIgPSBjcmVhdGVfbWFpbl9wYXJzZXIoKQogICAgIyBzdWJjb21tYW5kIG9wdGlvbnMKICAgIGlmIHN1YmNvbW1hbmRfbmFtZToKICAgICAgICAjIHNwZWNpYWwgY2FzZTogJ2hlbHAnIHN1YmNvbW1hbmQgaGFzIG5vIG9wdGlvbnMKICAgICAgICBpZiBzdWJjb21tYW5kX25hbWUgPT0gJ2hlbHAnOgogICAgICAgICAgICBzeXMuZXhpdCgxKQogICAgICAgICMgc3BlY2lhbCBjYXNlOiBsaXN0IGxvY2FsbHkgaW5zdGFsbGVkIGRpc3RzIGZvciB1bmluc3RhbGwgY29tbWFuZAogICAgICAgIGlmIHN1YmNvbW1hbmRfbmFtZSA9PSAndW5pbnN0YWxsJyBhbmQgbm90IGN1cnJlbnQuc3RhcnRzd2l0aCgnLScpOgogICAgICAgICAgICBpbnN0YWxsZWQgPSBbXQogICAgICAgICAgICBsYyA9IGN1cnJlbnQubG93ZXIoKQogICAgICAgICAgICBmb3IgZGlzdCBpbiBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMobG9jYWxfb25seT1UcnVlKToKICAgICAgICAgICAgICAgIGlmIGRpc3Qua2V5LnN0YXJ0c3dpdGgobGMpIGFuZCBkaXN0LmtleSBub3QgaW4gY3dvcmRzWzE6XToKICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgICAgICAjIGlmIHRoZXJlIGFyZSBubyBkaXN0cyBpbnN0YWxsZWQsIGZhbGwgYmFjayB0byBvcHRpb24gY29tcGxldGlvbgogICAgICAgICAgICBpZiBpbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBpbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZGlzdCkKICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCgogICAgICAgIHN1YmNvbW1hbmQgPSBjb21tYW5kc19kaWN0W3N1YmNvbW1hbmRfbmFtZV0oKQogICAgICAgIG9wdGlvbnMgKz0gWyhvcHQuZ2V0X29wdF9zdHJpbmcoKSwgb3B0Lm5hcmdzKQogICAgICAgICAgICAgICAgICAgIGZvciBvcHQgaW4gc3ViY29tbWFuZC5wYXJzZXIub3B0aW9uX2xpc3RfYWxsCiAgICAgICAgICAgICAgICAgICAgaWYgb3B0LmhlbHAgIT0gb3B0cGFyc2UuU1VQUFJFU1NfSEVMUF0KCiAgICAgICAgIyBmaWx0ZXIgb3V0IHByZXZpb3VzbHkgc3BlY2lmaWVkIG9wdGlvbnMgZnJvbSBhdmFpbGFibGUgb3B0aW9ucwogICAgICAgIHByZXZfb3B0cyA9IFt4LnNwbGl0KCc9JylbMF0gZm9yIHggaW4gY3dvcmRzWzE6Y3dvcmQgLSAxXV0KICAgICAgICBvcHRpb25zID0gWyh4LCB2KSBmb3IgKHgsIHYpIGluIG9wdGlvbnMgaWYgeCBub3QgaW4gcHJldl9vcHRzXQogICAgICAgICMgZmlsdGVyIG9wdGlvbnMgYnkgY3VycmVudCBpbnB1dAogICAgICAgIG9wdGlvbnMgPSBbKGssIHYpIGZvciBrLCB2IGluIG9wdGlvbnMgaWYgay5zdGFydHN3aXRoKGN1cnJlbnQpXQogICAgICAgIGZvciBvcHRpb24gaW4gb3B0aW9uczoKICAgICAgICAgICAgb3B0X2xhYmVsID0gb3B0aW9uWzBdCiAgICAgICAgICAgICMgYXBwZW5kICc9JyB0byBvcHRpb25zIHdoaWNoIHJlcXVpcmUgYXJncwogICAgICAgICAgICBpZiBvcHRpb25bMV06CiAgICAgICAgICAgICAgICBvcHRfbGFiZWwgKz0gJz0nCiAgICAgICAgICAgIHByaW50KG9wdF9sYWJlbCkKICAgIGVsc2U6CiAgICAgICAgIyBzaG93IG1haW4gcGFyc2VyIG9wdGlvbnMgb25seSB3aGVuIG5lY2Vzc2FyeQogICAgICAgIGlmIGN1cnJlbnQuc3RhcnRzd2l0aCgnLScpIG9yIGN1cnJlbnQuc3RhcnRzd2l0aCgnLS0nKToKICAgICAgICAgICAgb3B0cyA9IFtpLm9wdGlvbl9saXN0IGZvciBpIGluIHBhcnNlci5vcHRpb25fZ3JvdXBzXQogICAgICAgICAgICBvcHRzLmFwcGVuZChwYXJzZXIub3B0aW9uX2xpc3QpCiAgICAgICAgICAgIG9wdHMgPSAobyBmb3IgaXQgaW4gb3B0cyBmb3IgbyBpbiBpdCkKCiAgICAgICAgICAgIHN1YmNvbW1hbmRzICs9IFtpLmdldF9vcHRfc3RyaW5nKCkgZm9yIGkgaW4gb3B0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaS5oZWxwICE9IG9wdHBhcnNlLlNVUFBSRVNTX0hFTFBdCgogICAgICAgIHByaW50KCcgJy5qb2luKFt4IGZvciB4IGluIHN1YmNvbW1hbmRzIGlmIHguc3RhcnRzd2l0aChjdXJyZW50KV0pKQogICAgc3lzLmV4aXQoMSkKCgpkZWYgY3JlYXRlX21haW5fcGFyc2VyKCk6CiAgICBwYXJzZXJfa3cgPSB7CiAgICAgICAgJ3VzYWdlJzogJ1xuJXByb2cgPGNvbW1hbmQ+IFtvcHRpb25zXScsCiAgICAgICAgJ2FkZF9oZWxwX29wdGlvbic6IEZhbHNlLAogICAgICAgICdmb3JtYXR0ZXInOiBVcGRhdGluZ0RlZmF1bHRzSGVscEZvcm1hdHRlcigpLAogICAgICAgICduYW1lJzogJ2dsb2JhbCcsCiAgICAgICAgJ3Byb2cnOiBnZXRfcHJvZygpLAogICAgfQoKICAgIHBhcnNlciA9IENvbmZpZ09wdGlvblBhcnNlcigqKnBhcnNlcl9rdykKICAgIHBhcnNlci5kaXNhYmxlX2ludGVyc3BlcnNlZF9hcmdzKCkKCiAgICBwaXBfcGtnX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpCiAgICBwYXJzZXIudmVyc2lvbiA9ICdwaXAgJXMgZnJvbSAlcyAocHl0aG9uICVzKScgJSAoCiAgICAgICAgX192ZXJzaW9uX18sIHBpcF9wa2dfZGlyLCBzeXMudmVyc2lvbls6M10pCgogICAgIyBhZGQgdGhlIGdlbmVyYWwgb3B0aW9ucwogICAgZ2VuX29wdHMgPSBjbWRvcHRpb25zLm1ha2Vfb3B0aW9uX2dyb3VwKGNtZG9wdGlvbnMuZ2VuZXJhbF9ncm91cCwgcGFyc2VyKQogICAgcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoZ2VuX29wdHMpCgogICAgcGFyc2VyLm1haW4gPSBUcnVlICAjIHNvIHRoZSBoZWxwIGZvcm1hdHRlciBrbm93cwoKICAgICMgY3JlYXRlIGNvbW1hbmQgbGlzdGluZyBmb3IgZGVzY3JpcHRpb24KICAgIGNvbW1hbmRfc3VtbWFyaWVzID0gZ2V0X3N1bW1hcmllcygpCiAgICBkZXNjcmlwdGlvbiA9IFsnJ10gKyBbJyUtMjdzICVzJyAlIChpLCBqKSBmb3IgaSwgaiBpbiBjb21tYW5kX3N1bW1hcmllc10KICAgIHBhcnNlci5kZXNjcmlwdGlvbiA9ICdcbicuam9pbihkZXNjcmlwdGlvbikKCiAgICByZXR1cm4gcGFyc2VyCgoKZGVmIHBhcnNlb3B0cyhhcmdzKToKICAgIHBhcnNlciA9IGNyZWF0ZV9tYWluX3BhcnNlcigpCgogICAgIyBOb3RlOiBwYXJzZXIgY2FsbHMgZGlzYWJsZV9pbnRlcnNwZXJzZWRfYXJncygpLCBzbyB0aGUgcmVzdWx0IG9mIHRoaXMKICAgICMgY2FsbCBpcyB0byBzcGxpdCB0aGUgaW5pdGlhbCBhcmdzIGludG8gdGhlIGdlbmVyYWwgb3B0aW9ucyBiZWZvcmUgdGhlCiAgICAjIHN1YmNvbW1hbmQgYW5kIGV2ZXJ5dGhpbmcgZWxzZS4KICAgICMgRm9yIGV4YW1wbGU6CiAgICAjICBhcmdzOiBbJy0tdGltZW91dD01JywgJ2luc3RhbGwnLCAnLS11c2VyJywgJ0lOSVRvb2xzJ10KICAgICMgIGdlbmVyYWxfb3B0aW9uczogWyctLXRpbWVvdXQ9PTUnXQogICAgIyAgYXJnc19lbHNlOiBbJ2luc3RhbGwnLCAnLS11c2VyJywgJ0lOSVRvb2xzJ10KICAgIGdlbmVyYWxfb3B0aW9ucywgYXJnc19lbHNlID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKCiAgICAjIC0tdmVyc2lvbgogICAgaWYgZ2VuZXJhbF9vcHRpb25zLnZlcnNpb246CiAgICAgICAgc3lzLnN0ZG91dC53cml0ZShwYXJzZXIudmVyc2lvbikKICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKG9zLmxpbmVzZXApCiAgICAgICAgc3lzLmV4aXQoKQoKICAgICMgcGlwIHx8IHBpcCBoZWxwIC0+IHByaW50X2hlbHAoKQogICAgaWYgbm90IGFyZ3NfZWxzZSBvciAoYXJnc19lbHNlWzBdID09ICdoZWxwJyBhbmQgbGVuKGFyZ3NfZWxzZSkgPT0gMSk6CiAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoKQogICAgICAgIHN5cy5leGl0KCkKCiAgICAjIHRoZSBzdWJjb21tYW5kIG5hbWUKICAgIGNtZF9uYW1lID0gYXJnc19lbHNlWzBdCgogICAgaWYgY21kX25hbWUgbm90IGluIGNvbW1hbmRzX2RpY3Q6CiAgICAgICAgZ3Vlc3MgPSBnZXRfc2ltaWxhcl9jb21tYW5kcyhjbWRfbmFtZSkKCiAgICAgICAgbXNnID0gWyd1bmtub3duIGNvbW1hbmQgIiVzIicgJSBjbWRfbmFtZV0KICAgICAgICBpZiBndWVzczoKICAgICAgICAgICAgbXNnLmFwcGVuZCgnbWF5YmUgeW91IG1lYW50ICIlcyInICUgZ3Vlc3MpCgogICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcignIC0gJy5qb2luKG1zZykpCgogICAgIyBhbGwgdGhlIGFyZ3Mgd2l0aG91dCB0aGUgc3ViY29tbWFuZAogICAgY21kX2FyZ3MgPSBhcmdzWzpdCiAgICBjbWRfYXJncy5yZW1vdmUoY21kX25hbWUpCgogICAgcmV0dXJuIGNtZF9uYW1lLCBjbWRfYXJncwoKCmRlZiBjaGVja19pc29sYXRlZChhcmdzKToKICAgIGlzb2xhdGVkID0gRmFsc2UKCiAgICBpZiAiLS1pc29sYXRlZCIgaW4gYXJnczoKICAgICAgICBpc29sYXRlZCA9IFRydWUKCiAgICByZXR1cm4gaXNvbGF0ZWQKCgpkZWYgbWFpbihhcmdzPU5vbmUpOgogICAgaWYgYXJncyBpcyBOb25lOgogICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KCiAgICAjIENvbmZpZ3VyZSBvdXIgZGVwcmVjYXRpb24gd2FybmluZ3MgdG8gYmUgc2VudCB0aHJvdWdoIGxvZ2dlcnMKICAgIGRlcHJlY2F0aW9uLmluc3RhbGxfd2FybmluZ19sb2dnZXIoKQoKICAgIGF1dG9jb21wbGV0ZSgpCgogICAgdHJ5OgogICAgICAgIGNtZF9uYW1lLCBjbWRfYXJncyA9IHBhcnNlb3B0cyhhcmdzKQogICAgZXhjZXB0IFBpcEVycm9yIGFzIGV4YzoKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJFUlJPUjogJXMiICUgZXhjKQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUob3MubGluZXNlcCkKICAgICAgICBzeXMuZXhpdCgxKQoKICAgICMgTmVlZGVkIGZvciBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpIHRvIHdvcmsKICAgICMgaW4gcGlwLnV0aWxzLmVuY29kaW5nLmF1dG9fZGVjb2RlCiAgICB0cnk6CiAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCAnJykKICAgIGV4Y2VwdCBsb2NhbGUuRXJyb3IgYXMgZToKICAgICAgICAjIHNldGxvY2FsZSBjYW4gYXBwYXJlbnRseSBjcmFzaCBpZiBsb2NhbGUgYXJlIHVuaW5pdGlhbGl6ZWQKICAgICAgICBsb2dnZXIuZGVidWcoIklnbm9yaW5nIGVycm9yICVzIHdoZW4gc2V0dGluZyBsb2NhbGUiLCBlKQogICAgY29tbWFuZCA9IGNvbW1hbmRzX2RpY3RbY21kX25hbWVdKGlzb2xhdGVkPWNoZWNrX2lzb2xhdGVkKGNtZF9hcmdzKSkKICAgIHJldHVybiBjb21tYW5kLm1haW4oY21kX2FyZ3MpCgoKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICMgV3JpdGluZyBmcmVlemUgZmlsZXMKCmNsYXNzIEZyb3plblJlcXVpcmVtZW50KG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHJlcSwgZWRpdGFibGUsIGNvbW1lbnRzPSgpKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5yZXEgPSByZXEKICAgICAgICBzZWxmLmVkaXRhYmxlID0gZWRpdGFibGUKICAgICAgICBzZWxmLmNvbW1lbnRzID0gY29tbWVudHMKCiAgICBfcmV2X3JlID0gcmUuY29tcGlsZShyJy1yKFxkKykkJykKICAgIF9kYXRlX3JlID0gcmUuY29tcGlsZShyJy0oMjBcZFxkXGRcZFxkXGQpJCcpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9kaXN0KGNscywgZGlzdCwgZGVwZW5kZW5jeV9saW5rcyk6CiAgICAgICAgbG9jYXRpb24gPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChkaXN0LmxvY2F0aW9uKSkKICAgICAgICBjb21tZW50cyA9IFtdCiAgICAgICAgZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MsIGdldF9zcmNfcmVxdWlyZW1lbnQKICAgICAgICBpZiBkaXN0X2lzX2VkaXRhYmxlKGRpc3QpIGFuZCB2Y3MuZ2V0X2JhY2tlbmRfbmFtZShsb2NhdGlvbik6CiAgICAgICAgICAgIGVkaXRhYmxlID0gVHJ1ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXEgPSBnZXRfc3JjX3JlcXVpcmVtZW50KGRpc3QsIGxvY2F0aW9uKQogICAgICAgICAgICBleGNlcHQgSW5zdGFsbGF0aW9uRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoZW4gdHJ5aW5nIHRvIGdldCByZXF1aXJlbWVudCBmb3IgVkNTIHN5c3RlbSAlcywgIgogICAgICAgICAgICAgICAgICAgICJmYWxsaW5nIGJhY2sgdG8gdW5lZGl0YWJsZSBmb3JtYXQiLCBleGMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJlcSA9IE5vbmUKICAgICAgICAgICAgaWYgcmVxIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGRldGVybWluZSByZXBvc2l0b3J5IGxvY2F0aW9uIG9mICVzJywgbG9jYXRpb24KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAnIyMgISEgQ291bGQgbm90IGRldGVybWluZSByZXBvc2l0b3J5IGxvY2F0aW9uJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmVxID0gZGlzdC5hc19yZXF1aXJlbWVudCgpCiAgICAgICAgICAgICAgICBlZGl0YWJsZSA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZWRpdGFibGUgPSBGYWxzZQogICAgICAgICAgICByZXEgPSBkaXN0LmFzX3JlcXVpcmVtZW50KCkKICAgICAgICAgICAgc3BlY3MgPSByZXEuc3BlY3MKICAgICAgICAgICAgYXNzZXJ0IGxlbihzcGVjcykgPT0gMSBhbmQgc3BlY3NbMF1bMF0gaW4gWyI9PSIsICI9PT0iXSwgXAogICAgICAgICAgICAgICAgJ0V4cGVjdGVkIDEgc3BlYyB3aXRoID09IG9yID09PTsgc3BlY3MgPSAlcjsgZGlzdCA9ICVyJyAlIFwKICAgICAgICAgICAgICAgIChzcGVjcywgZGlzdCkKICAgICAgICAgICAgdmVyc2lvbiA9IHNwZWNzWzBdWzFdCiAgICAgICAgICAgIHZlcl9tYXRjaCA9IGNscy5fcmV2X3JlLnNlYXJjaCh2ZXJzaW9uKQogICAgICAgICAgICBkYXRlX21hdGNoID0gY2xzLl9kYXRlX3JlLnNlYXJjaCh2ZXJzaW9uKQogICAgICAgICAgICBpZiB2ZXJfbWF0Y2ggb3IgZGF0ZV9tYXRjaDoKICAgICAgICAgICAgICAgIHN2bl9iYWNrZW5kID0gdmNzLmdldF9iYWNrZW5kKCdzdm4nKQogICAgICAgICAgICAgICAgaWYgc3ZuX2JhY2tlbmQ6CiAgICAgICAgICAgICAgICAgICAgc3ZuX2xvY2F0aW9uID0gc3ZuX2JhY2tlbmQoKS5nZXRfbG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgbm90IHN2bl9sb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJ1dhcm5pbmc6IGNhbm5vdCBmaW5kIHN2biBsb2NhdGlvbiBmb3IgJXMnLCByZXEpCiAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAnIyMgRklYTUU6IGNvdWxkIG5vdCBmaW5kIHN2biBVUkwgaW4gZGVwZW5kZW5jeV9saW5rcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICdmb3IgdGhpcyBwYWNrYWdlOicKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgJyMgSW5zdGFsbGluZyBhcyBlZGl0YWJsZSB0byBzYXRpc2Z5IHJlcXVpcmVtZW50ICVzOicgJQogICAgICAgICAgICAgICAgICAgICAgICByZXEKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgdmVyX21hdGNoOgogICAgICAgICAgICAgICAgICAgICAgICByZXYgPSB2ZXJfbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICByZXYgPSAneyVzfScgJSBkYXRlX21hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgICAgICAgICAgZWRpdGFibGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgcmVxID0gJyVzQCVzI2VnZz0lcycgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIHN2bl9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgcmV2LAogICAgICAgICAgICAgICAgICAgICAgICBjbHMuZWdnX25hbWUoZGlzdCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGNscyhkaXN0LnByb2plY3RfbmFtZSwgcmVxLCBlZGl0YWJsZSwgY29tbWVudHMpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGVnZ19uYW1lKGRpc3QpOgogICAgICAgIG5hbWUgPSBkaXN0LmVnZ19uYW1lKCkKICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaChyJy1weVxkXC5cZCQnLCBuYW1lKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICBuYW1lID0gbmFtZVs6bWF0Y2guc3RhcnQoKV0KICAgICAgICByZXR1cm4gbmFtZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJlcSA9IHNlbGYucmVxCiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgcmVxID0gJy1lICVzJyAlIHJlcQogICAgICAgIHJldHVybiAnXG4nLmpvaW4obGlzdChzZWxmLmNvbW1lbnRzKSArIFtzdHIocmVxKV0pICsgJ1xuJwoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBzeXMuZXhpdChtYWluKCkpClBLAwQUAAAAAAAAACEAS0mkZUgCAABIAgAALAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL19fbWFpbl9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBvcwppbXBvcnQgc3lzCgojIElmIHdlIGFyZSBydW5uaW5nIGZyb20gYSB3aGVlbCwgYWRkIHRoZSB3aGVlbCB0byBzeXMucGF0aAojIFRoaXMgYWxsb3dzIHRoZSB1c2FnZSBweXRob24gcGlwLSoud2hsL3BpcCBpbnN0YWxsIHBpcC0qLndobAppZiBfX3BhY2thZ2VfXyA9PSAnJzoKICAgICMgX19maWxlX18gaXMgcGlwLSoud2hsL3BpcC9fX21haW5fXy5weQogICAgIyBmaXJzdCBkaXJuYW1lIGNhbGwgc3RyaXBzIG9mICcvX19tYWluX18ucHknLCBzZWNvbmQgc3RyaXBzIG9mZiAnL3BpcCcKICAgICMgUmVzdWx0aW5nIHBhdGggaXMgdGhlIG5hbWUgb2YgdGhlIHdoZWVsIGl0c2VsZgogICAgIyBBZGQgdGhhdCB0byBzeXMucGF0aCBzbyB3ZSBjYW4gaW1wb3J0IHBpcAogICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogICAgc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGgpCgppbXBvcnQgcGlwICAjIG5vcWEKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBzeXMuZXhpdChwaXAubWFpbigpKQpQSwMEFAAAAAAAAAAhAE+9zEg+EgAAPhIAADQAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL19faW5pdF9fLnB5IiIiCnBpcC5fdmVuZG9yIGlzIGZvciB2ZW5kb3JpbmcgZGVwZW5kZW5jaWVzIG9mIHBpcCB0byBwcmV2ZW50IG5lZWRpbmcgcGlwIHRvCmRlcGVuZCBvbiBzb21ldGhpbmcgZXh0ZXJuYWwuCgpGaWxlcyBpbnNpZGUgb2YgcGlwLl92ZW5kb3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW1tdXRhYmxlIGFuZCBzaG91bGQgb25seSBiZQp1cGRhdGVkIHRvIHZlcnNpb25zIGZyb20gdXBzdHJlYW0uCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGdsb2IKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHN5cwoKIyBEb3duc3RyZWFtIHJlZGlzdHJpYnV0b3JzIHdoaWNoIGhhdmUgZGVidW5kbGVkIG91ciBkZXBlbmRlbmNpZXMgc2hvdWxkIGFsc28KIyBwYXRjaCB0aGlzIHZhbHVlIHRvIGJlIHRydWUuIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBhZGRpdGlvbmFsIHBhdGNoaW5nCiMgdG8gY2F1c2UgdGhpbmdzIGxpa2UgInNpeCIgdG8gYmUgYXZhaWxhYmxlIGFzIHBpcC4KREVCVU5ETEVEID0gRmFsc2UKCiMgQnkgZGVmYXVsdCwgbG9vayBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgYSBidW5jaCBvZiAud2hsIGZpbGVzIHdoaWNoIHdlIHdpbGwKIyBhZGQgdG8gdGhlIGJlZ2lubmluZyBvZiBzeXMucGF0aCBiZWZvcmUgYXR0ZW1wdGluZyB0byBpbXBvcnQgYW55dGhpbmcuIFRoaXMKIyBpcyBkb25lIHRvIHN1cHBvcnQgZG93bnN0cmVhbSByZS1kaXN0cmlidXRvcnMgbGlrZSBEZWJpYW4gYW5kIEZlZG9yYSB3aG8KIyB3aXNoIHRvIGNyZWF0ZSB0aGVpciBvd24gV2hlZWxzIGZvciBvdXIgZGVwZW5kZW5jaWVzIHRvIGFpZCBpbiBkZWJ1bmRsaW5nLgpXSEVFTF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKCgojIERlZmluZSBhIHNtYWxsIGhlbHBlciBmdW5jdGlvbiB0byBhbGlhcyBvdXIgdmVuZG9yZWQgbW9kdWxlcyB0byB0aGUgcmVhbCBvbmVzCiMgaWYgdGhlIHZlbmRvcmVkIG9uZXMgZG8gbm90IGV4aXN0LiBUaGlzIGlkZWEgb2YgdGhpcyB3YXMgdGFrZW4gZnJvbQojIGh0dHBzOi8vZ2l0aHViLmNvbS9rZW5uZXRocmVpdHovcmVxdWVzdHMvcHVsbC8yNTY3LgpkZWYgdmVuZG9yZWQobW9kdWxlbmFtZSk6CiAgICB2ZW5kb3JlZF9uYW1lID0gInswfS57MX0iLmZvcm1hdChfX25hbWVfXywgbW9kdWxlbmFtZSkKCiAgICB0cnk6CiAgICAgICAgX19pbXBvcnRfXyh2ZW5kb3JlZF9uYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBsZXZlbD0wKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgX19pbXBvcnRfXyhtb2R1bGVuYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBsZXZlbD0wKQogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgIyBXZSBjYW4ganVzdCBzaWxlbnRseSBhbGxvdyBpbXBvcnQgZmFpbHVyZXMgdG8gcGFzcyBoZXJlLiBJZiB3ZQogICAgICAgICAgICAjIGdvdCB0byB0aGlzIHBvaW50IGl0IG1lYW5zIHRoYXQgYGBpbXBvcnQgcGlwLl92ZW5kb3Iud2hhdGV2ZXJgYAogICAgICAgICAgICAjIGZhaWxlZCBhbmQgc28gZGlkIGBgaW1wb3J0IHdoYXRldmVyYGAuIFNpbmNlIHdlJ3JlIGltcG9ydGluZyB0aGlzCiAgICAgICAgICAgICMgdXBmcm9udCBpbiBhbiBhdHRlbXB0IHRvIGFsaWFzIGltcG9ydHMsIG5vdCBlcnJvcmluZyBoZXJlIHdpbGwKICAgICAgICAgICAgIyBqdXN0IG1lYW4gd2UgZ2V0IGEgcmVndWxhciBpbXBvcnQgZXJyb3Igd2hlbmV2ZXIgcGlwICphY3R1YWxseSoKICAgICAgICAgICAgIyB0cmllcyB0byBpbXBvcnQgb25lIG9mIHRoZXNlIG1vZHVsZXMgdG8gdXNlIGl0LCB3aGljaCBhY3R1YWxseQogICAgICAgICAgICAjIGdpdmVzIHVzIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhhbiB3ZSB3b3VsZCBoYXZlIG90aGVyd2lzZQogICAgICAgICAgICAjIGdvdHRlbi4KICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN5cy5tb2R1bGVzW3ZlbmRvcmVkX25hbWVdID0gc3lzLm1vZHVsZXNbbW9kdWxlbmFtZV0KICAgICAgICAgICAgYmFzZSwgaGVhZCA9IHZlbmRvcmVkX25hbWUucnNwbGl0KCIuIiwgMSkKICAgICAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1tiYXNlXSwgaGVhZCwgc3lzLm1vZHVsZXNbbW9kdWxlbmFtZV0pCgoKIyBJZiB3ZSdyZSBvcGVyYXRpbmcgaW4gYSBkZWJ1bmRsZWQgc2V0dXAsIHRoZW4gd2Ugd2FudCB0byBnbyBhaGVhZCBhbmQgdHJpZ2dlcgojIHRoZSBhbGlhc2luZyBvZiBvdXIgdmVuZG9yZWQgbGlicmFyaWVzIGFzIHdlbGwgYXMgbG9va2luZyBmb3Igd2hlZWxzIHRvIGFkZAojIHRvIG91ciBzeXMucGF0aC4gVGhpcyB3aWxsIGNhdXNlIGFsbCBvZiB0aGlzIGNvZGUgdG8gYmUgYSBuby1vcCB0eXBpY2FsbHkKIyBob3dldmVyIGRvd25zdHJlYW0gcmVkaXN0cmlidXRvcnMgY2FuIGVuYWJsZSBpdCBpbiBhIGNvbnNpc3RlbnQgd2F5IGFjcm9zcwojIGFsbCBwbGF0Zm9ybXMuCmlmIERFQlVORExFRDoKICAgICMgQWN0dWFsbHkgbG9vayBpbnNpZGUgb2YgV0hFRUxfRElSIHRvIGZpbmQgLndobCBmaWxlcyBhbmQgYWRkIHRoZW0gdG8gdGhlCiAgICAjIGZyb250IG9mIG91ciBzeXMucGF0aC4KICAgIHN5cy5wYXRoWzpdID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihXSEVFTF9ESVIsICIqLndobCIpKSArIHN5cy5wYXRoCgogICAgIyBBY3R1YWxseSBhbGlhcyBhbGwgb2Ygb3VyIHZlbmRvcmVkIGRlcGVuZGVuY2llcy4KICAgIHZlbmRvcmVkKCJjYWNoZWNvbnRyb2wiKQogICAgdmVuZG9yZWQoImNvbG9yYW1hIikKICAgIHZlbmRvcmVkKCJkaXN0bGliIikKICAgIHZlbmRvcmVkKCJkaXN0cm8iKQogICAgdmVuZG9yZWQoImh0bWw1bGliIikKICAgIHZlbmRvcmVkKCJsb2NrZmlsZSIpCiAgICB2ZW5kb3JlZCgic2l4IikKICAgIHZlbmRvcmVkKCJzaXgubW92ZXMiKQogICAgdmVuZG9yZWQoInNpeC5tb3Zlcy51cmxsaWIiKQogICAgdmVuZG9yZWQoInBhY2thZ2luZyIpCiAgICB2ZW5kb3JlZCgicGFja2FnaW5nLnZlcnNpb24iKQogICAgdmVuZG9yZWQoInBhY2thZ2luZy5zcGVjaWZpZXJzIikKICAgIHZlbmRvcmVkKCJwa2dfcmVzb3VyY2VzIikKICAgIHZlbmRvcmVkKCJwcm9ncmVzcyIpCiAgICB2ZW5kb3JlZCgicmV0cnlpbmciKQogICAgdmVuZG9yZWQoInJlcXVlc3RzIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5fY29sbGVjdGlvbnMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuY29ubmVjdGlvbiIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5jb25uZWN0aW9ucG9vbCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5jb250cmliIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmNvbnRyaWIubnRsbXBvb2wiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuY29udHJpYi5weW9wZW5zc2wiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuZXhjZXB0aW9ucyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5maWVsZHMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuZmlsZXBvc3QiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucGFja2FnZXMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucGFja2FnZXMub3JkZXJlZF9kaWN0IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnBhY2thZ2VzLnNpeCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wYWNrYWdlcy5zc2xfbWF0Y2hfaG9zdG5hbWUiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucGFja2FnZXMuc3NsX21hdGNoX2hvc3RuYW1lLiIKICAgICAgICAgICAgICJfaW1wbGVtZW50YXRpb24iKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucG9vbG1hbmFnZXIiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucmVxdWVzdCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5yZXNwb25zZSIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwuY29ubmVjdGlvbiIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnJlcXVlc3QiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC5yZXNwb25zZSIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnJldHJ5IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwuc3NsXyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnRpbWVvdXQiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC51cmwiKQpQSwMEFAAAAAAAAAAhAIWJlopgVwAAYFcAADMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2FwcGRpcnMucHkjIS91c3IvYmluL2VudiBweXRob24KIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBBY3RpdmVTdGF0ZSBTb2Z0d2FyZSBJbmMuCiMgQ29weXJpZ2h0IChjKSAyMDEzIEVkZHkgUGV0cmnImW9yCgoiIiJVdGlsaXRpZXMgZm9yIGRldGVybWluaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRpcnMuCgpTZWUgPGh0dHA6Ly9naXRodWIuY29tL0FjdGl2ZVN0YXRlL2FwcGRpcnM+IGZvciBkZXRhaWxzIGFuZCB1c2FnZS4KIiIiCiMgRGV2IE5vdGVzOgojIC0gTVNETiBvbiB3aGVyZSB0byBzdG9yZSBhcHAgZGF0YSBmaWxlczoKIyAgIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZGVmYXVsdC5hc3B4P3NjaWQ9a2I7ZW4tdXM7MzEwMjk0I1hTTFRIMzE5NDEyMTEyMzEyMDEyMTEyMDEyMAojIC0gbWFjT1M6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vTWFjT1NYL0NvbmNlcHR1YWwvQlBGaWxlU3lzdGVtL2luZGV4Lmh0bWwKIyAtIFhERyBzcGVjIGZvciBVbip4OiBodHRwOi8vc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9iYXNlZGlyLXNwZWMvYmFzZWRpci1zcGVjLWxhdGVzdC5odG1sCgpfX3ZlcnNpb25faW5mb19fID0gKDEsIDQsIDApCl9fdmVyc2lvbl9fID0gJy4nLmpvaW4obWFwKHN0ciwgX192ZXJzaW9uX2luZm9fXykpCgoKaW1wb3J0IHN5cwppbXBvcnQgb3MKClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwoKaWYgUFkzOgogICAgdW5pY29kZSA9IHN0cgoKaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgIGltcG9ydCBwbGF0Zm9ybQogICAgb3NfbmFtZSA9IHBsYXRmb3JtLmphdmFfdmVyKClbM11bMF0KICAgIGlmIG9zX25hbWUuc3RhcnRzd2l0aCgnV2luZG93cycpOiAjICJXaW5kb3dzIFhQIiwgIldpbmRvd3MgNyIsIGV0Yy4KICAgICAgICBzeXN0ZW0gPSAnd2luMzInCiAgICBlbGlmIG9zX25hbWUuc3RhcnRzd2l0aCgnTWFjJyk6ICMgIm1hY09TIiwgZXRjLgogICAgICAgIHN5c3RlbSA9ICdkYXJ3aW4nCiAgICBlbHNlOiAjICJMaW51eCIsICJTdW5PUyIsICJGcmVlQlNEIiwgZXRjLgogICAgICAgICMgU2V0dGluZyB0aGlzIHRvICJsaW51eDIiIGlzIG5vdCBpZGVhbCwgYnV0IG9ubHkgV2luZG93cyBvciBNYWMKICAgICAgICAjIGFyZSBhY3R1YWxseSBjaGVja2VkIGZvciBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1vZHVsZSBleHBlY3RzCiAgICAgICAgIyAqc3lzLnBsYXRmb3JtKiBzdHlsZSBzdHJpbmdzLgogICAgICAgIHN5c3RlbSA9ICdsaW51eDInCmVsc2U6CiAgICBzeXN0ZW0gPSBzeXMucGxhdGZvcm0KCgoKZGVmIHVzZXJfZGF0YV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAgICAgICAgICAgICB+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4gICAgIyBvciBpbiAkWERHX0RBVEFfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUCAobm90IHJvYW1pbmcpOiAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiBYUCAocm9hbWluZyk6ICAgICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAobm90IHJvYW1pbmcpOiAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKHJvYW1pbmcpOiAgICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcUm9hbWluZ1w8QXBwQXV0aG9yPlw8QXBwTmFtZT4KCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0RBVEFfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlZmF1bHQgIn4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgY29uc3QgPSByb2FtaW5nIGFuZCAiQ1NJRExfQVBQREFUQSIgb3IgIkNTSURMX0xPQ0FMX0FQUERBVEEiCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKGNvbnN0KSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC8nKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0RBVEFfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcigifi8ubG9jYWwvc2hhcmUiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHNpdGVfZGF0YV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBtdWx0aXBhdGg9RmFsc2UpOgogICAgIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zaGFyZWQgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm11bHRpcGF0aCIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgYXBwbGljYWJsZSB0byAqbml4CiAgICAgICAgICAgIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgbGlzdCBvZiBkYXRhIGRpcnMgc2hvdWxkIGJlCiAgICAgICAgICAgIHJldHVybmVkLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgaXRlbSBmcm9tIFhER19EQVRBX0RJUlMgaXMKICAgICAgICAgICAgcmV0dXJuZWQsIG9yICcvdXNyL2xvY2FsL3NoYXJlLzxBcHBOYW1lPicsCiAgICAgICAgICAgIGlmIFhER19EQVRBX0RJUlMgaXMgbm90IHNldAoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIC91c3IvbG9jYWwvc2hhcmUvPEFwcE5hbWU+IG9yIC91c3Ivc2hhcmUvPEFwcE5hbWU+CiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xBbGwgVXNlcnNcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3Rvcnkgb24gVmlzdGEuKQogICAgICAgIFdpbiA3OiAgICAgIEM6XFByb2dyYW1EYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPiAgICMgSGlkZGVuLCBidXQgd3JpdGVhYmxlIG9uIFdpbiA3LgoKICAgIEZvciBVbml4LCB0aGlzIGlzIHVzaW5nIHRoZSAkWERHX0RBVEFfRElSU1swXSBkZWZhdWx0LgoKICAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhpcyBvbiBXaW5kb3dzLiBTZWUgdGhlIFZpc3RhLUZhaWwgbm90ZSBhYm92ZSBmb3Igd2h5LgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfQ09NTU9OX0FQUERBVEEiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCcvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0JykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgICMgWERHIGRlZmF1bHQgZm9yICRYREdfREFUQV9ESVJTCiAgICAgICAgIyBvbmx5IGZpcnN0LCBpZiBtdWx0aXBhdGggaXMgRmFsc2UKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfREFUQV9ESVJTJywKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGhzZXAuam9pbihbJy91c3IvbG9jYWwvc2hhcmUnLCAnL3Vzci9zaGFyZSddKSkKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmV4cGFuZHVzZXIoeC5yc3RyaXAob3Muc2VwKSkgZm9yIHggaW4gcGF0aC5zcGxpdChvcy5wYXRoc2VwKV0KICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgYXBwbmFtZSA9IG9zLnBhdGguam9pbihhcHBuYW1lLCB2ZXJzaW9uKQogICAgICAgICAgICBwYXRobGlzdCA9IFtvcy5zZXAuam9pbihbeCwgYXBwbmFtZV0pIGZvciB4IGluIHBhdGhsaXN0XQoKICAgICAgICBpZiBtdWx0aXBhdGg6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aGxpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aCA9IHBhdGhsaXN0WzBdCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfY29uZmlnX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY29uZmlnIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8uY29uZmlnLzxBcHBOYW1lPiAgICAgIyBvciBpbiAkWERHX0NPTkZJR19IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luICo6ICAgICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19DT05GSUdfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlYWZ1bHQgIn4vLmNvbmZpZy88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gaW4gWyJ3aW4zMiIsICJkYXJ3aW4iXToKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIE5vbmUsIHJvYW1pbmcpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcigifi8uY29uZmlnIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiBzaXRlX2NvbmZpZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBtdWx0aXBhdGg9RmFsc2UpOgogICAgIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zaGFyZWQgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm11bHRpcGF0aCIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgYXBwbGljYWJsZSB0byAqbml4CiAgICAgICAgICAgIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgbGlzdCBvZiBjb25maWcgZGlycyBzaG91bGQgYmUKICAgICAgICAgICAgcmV0dXJuZWQuIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBpdGVtIGZyb20gWERHX0NPTkZJR19ESVJTIGlzCiAgICAgICAgICAgIHJldHVybmVkLCBvciAnL2V0Yy94ZGcvPEFwcE5hbWU+JywgaWYgWERHX0NPTkZJR19ESVJTIGlzIG5vdCBzZXQKCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgc2FtZSBhcyBzaXRlX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgL2V0Yy94ZGcvPEFwcE5hbWU+IG9yICRYREdfQ09ORklHX0RJUlNbaV0vPEFwcE5hbWU+IGZvciBlYWNoIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgJFhER19DT05GSUdfRElSUwogICAgICAgIFdpbiAqOiAgICAgIHNhbWUgYXMgc2l0ZV9kYXRhX2RpcgogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeSBvbiBWaXN0YS4pCgogICAgRm9yIFVuaXgsIHRoaXMgaXMgdXNpbmcgdGhlICRYREdfQ09ORklHX0RJUlNbMF0gZGVmYXVsdCwgaWYgbXVsdGlwYXRoPUZhbHNlCgogICAgV0FSTklORzogRG8gbm90IHVzZSB0aGlzIG9uIFdpbmRvd3MuIFNlZSB0aGUgVmlzdGEtRmFpbCBub3RlIGFib3ZlIGZvciB3aHkuCiAgICAiIiIKICAgIGlmIHN5c3RlbSBpbiBbIndpbjMyIiwgImRhcndpbiJdOgogICAgICAgIHBhdGggPSBzaXRlX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvcikKICAgICAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICBlbHNlOgogICAgICAgICMgWERHIGRlZmF1bHQgZm9yICRYREdfQ09ORklHX0RJUlMKICAgICAgICAjIG9ubHkgZmlyc3QsIGlmIG11bHRpcGF0aCBpcyBGYWxzZQogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfRElSUycsICcvZXRjL3hkZycpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5leHBhbmR1c2VyKHgucnN0cmlwKG9zLnNlcCkpIGZvciB4IGluIHBhdGguc3BsaXQob3MucGF0aHNlcCldCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgIGFwcG5hbWUgPSBvcy5wYXRoLmpvaW4oYXBwbmFtZSwgdmVyc2lvbikKICAgICAgICAgICAgcGF0aGxpc3QgPSBbb3Muc2VwLmpvaW4oW3gsIGFwcG5hbWVdKSBmb3IgeCBpbiBwYXRobGlzdF0KCiAgICAgICAgaWYgbXVsdGlwYXRoOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aHNlcC5qb2luKHBhdGhsaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGggPSBwYXRobGlzdFswXQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jYWNoZV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBvcGluaW9uPVRydWUpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY2FjaGUgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJvcGluaW9uIiAoYm9vbGVhbikgY2FuIGJlIEZhbHNlIHRvIGRpc2FibGUgdGhlIGFwcGVuZGluZyBvZgogICAgICAgICAgICAiQ2FjaGUiIHRvIHRoZSBiYXNlIGFwcCBkYXRhIGRpciBmb3IgV2luZG93cy4gU2VlCiAgICAgICAgICAgIGRpc2N1c3Npb24gYmVsb3cuCgogICAgVHlwaWNhbCB1c2VyIGNhY2hlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICB+L0xpYnJhcnkvQ2FjaGVzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPiAoWERHIGRlZmF1bHQpCiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XENhY2hlCiAgICAgICAgVmlzdGE6ICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxDYWNoZQoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MgZ28gaW4KICAgIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbm9uLXJvYW1pbmcKICAgIGFwcCBkYXRhIGRpciAodGhlIGRlZmF1bHQgcmV0dXJuZWQgYnkgYHVzZXJfZGF0YV9kaXJgIGFib3ZlKS4gQXBwcyB0eXBpY2FsbHkKICAgIHB1dCBjYWNoZSBkYXRhIHNvbWV3aGVyZSAqdW5kZXIqIHRoZSBnaXZlbiBkaXIgaGVyZS4gU29tZSBleGFtcGxlczoKICAgICAgICAuLi5cTW96aWxsYVxGaXJlZm94XFByb2ZpbGVzXDxQcm9maWxlTmFtZT5cQ2FjaGUKICAgICAgICAuLi5cQWNtZVxTdXBlckFwcFxDYWNoZVwxLjAKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiQ2FjaGUiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgdmFsdWUuCiAgICBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBgb3Bpbmlvbj1GYWxzZWAgb3B0aW9uLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfTE9DQUxfQVBQREFUQSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgICAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgIkNhY2hlIikKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9DYWNoZXMnKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NBQ0hFX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vLmNhY2hlJykpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2xvZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCBvcGluaW9uPVRydWUpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgbG9nIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAib3BpbmlvbiIgKGJvb2xlYW4pIGNhbiBiZSBGYWxzZSB0byBkaXNhYmxlIHRoZSBhcHBlbmRpbmcgb2YKICAgICAgICAgICAgIkxvZ3MiIHRvIHRoZSBiYXNlIGFwcCBkYXRhIGRpciBmb3IgV2luZG93cywgYW5kICJsb2ciIHRvIHRoZQogICAgICAgICAgICBiYXNlIGNhY2hlIGRpciBmb3IgVW5peC4gU2VlIGRpc2N1c3Npb24gYmVsb3cuCgogICAgVHlwaWNhbCB1c2VyIGNhY2hlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICB+L0xpYnJhcnkvTG9ncy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4vbG9nICAjIG9yIHVuZGVyICRYREdfQ0FDSEVfSE9NRSBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XExvZ3MKICAgICAgICBWaXN0YTogICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XExvZ3MKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzCiAgICBnbyBpbiB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gKE5vdGU6IEknbSBpbnRlcmVzdGVkIGluCiAgICBleGFtcGxlcyBvZiB3aGF0IHNvbWUgd2luZG93cyBhcHBzIHVzZSBmb3IgYSBsb2dzIGRpci4pCgogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJMb2dzIiB0byB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgCiAgICB2YWx1ZSBmb3IgV2luZG93cyBhbmQgYXBwZW5kcyAibG9nIiB0byB0aGUgdXNlciBjYWNoZSBkaXIgZm9yIFVuaXguCiAgICBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBgb3Bpbmlvbj1GYWxzZWAgb3B0aW9uLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gImRhcndpbiI6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvTG9ncycpLAogICAgICAgICAgICBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb24pCiAgICAgICAgdmVyc2lvbiA9IEZhbHNlCiAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAiTG9ncyIpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSB1c2VyX2NhY2hlX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb24pCiAgICAgICAgdmVyc2lvbiA9IEZhbHNlCiAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAibG9nIikKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpjbGFzcyBBcHBEaXJzKG9iamVjdCk6CiAgICAiIiJDb252ZW5pZW5jZSB3cmFwcGVyIGZvciBnZXR0aW5nIGFwcGxpY2F0aW9uIGRpcnMuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXBwbmFtZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSwKICAgICAgICAgICAgICAgICBtdWx0aXBhdGg9RmFsc2UpOgogICAgICAgIHNlbGYuYXBwbmFtZSA9IGFwcG5hbWUKICAgICAgICBzZWxmLmFwcGF1dGhvciA9IGFwcGF1dGhvcgogICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KICAgICAgICBzZWxmLnJvYW1pbmcgPSByb2FtaW5nCiAgICAgICAgc2VsZi5tdWx0aXBhdGggPSBtdWx0aXBhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2RhdGFfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2RhdGFfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIHJvYW1pbmc9c2VsZi5yb2FtaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpdGVfZGF0YV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNpdGVfZGF0YV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgbXVsdGlwYXRoPXNlbGYubXVsdGlwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfY29uZmlnX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9jb25maWdfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgcm9hbWluZz1zZWxmLnJvYW1pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l0ZV9jb25maWdfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzaXRlX2NvbmZpZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgbXVsdGlwYXRoPXNlbGYubXVsdGlwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfY2FjaGVfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2NhY2hlX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2xvZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfbG9nX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24pCgoKIy0tLS0gaW50ZXJuYWwgc3VwcG9ydCBzdHVmZgoKZGVmIF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5KGNzaWRsX25hbWUpOgogICAgIiIiVGhpcyBpcyBhIGZhbGxiYWNrIHRlY2huaXF1ZSBhdCBiZXN0LiBJJ20gbm90IHN1cmUgaWYgdXNpbmcgdGhlCiAgICByZWdpc3RyeSBmb3IgdGhpcyBndWFyYW50ZWVzIHVzIHRoZSBjb3JyZWN0IGFuc3dlciBmb3IgYWxsIENTSURMXyoKICAgIG5hbWVzLgogICAgIiIiCiAgICBpbXBvcnQgX3dpbnJlZwoKICAgIHNoZWxsX2ZvbGRlcl9uYW1lID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogIkFwcERhdGEiLAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6ICJDb21tb24gQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAiTG9jYWwgQXBwRGF0YSIsCiAgICB9W2NzaWRsX25hbWVdCgogICAga2V5ID0gX3dpbnJlZy5PcGVuS2V5KAogICAgICAgIF93aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCiAgICAgICAgciJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxTaGVsbCBGb2xkZXJzIgogICAgKQogICAgZGlyLCB0eXBlID0gX3dpbnJlZy5RdWVyeVZhbHVlRXgoa2V5LCBzaGVsbF9mb2xkZXJfbmFtZSkKICAgIHJldHVybiBkaXIKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfcHl3aW4zMihjc2lkbF9uYW1lKToKICAgIGZyb20gd2luMzJjb20uc2hlbGwgaW1wb3J0IHNoZWxsY29uLCBzaGVsbAogICAgZGlyID0gc2hlbGwuU0hHZXRGb2xkZXJQYXRoKDAsIGdldGF0dHIoc2hlbGxjb24sIGNzaWRsX25hbWUpLCAwLCAwKQogICAgIyBUcnkgdG8gbWFrZSB0aGlzIGEgdW5pY29kZSBwYXRoIGJlY2F1c2UgU0hHZXRGb2xkZXJQYXRoIGRvZXMKICAgICMgbm90IHJldHVybiB1bmljb2RlIHN0cmluZ3Mgd2hlbiB0aGVyZSBpcyB1bmljb2RlIGRhdGEgaW4gdGhlCiAgICAjIHBhdGguCiAgICB0cnk6CiAgICAgICAgZGlyID0gdW5pY29kZShkaXIpCgogICAgICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgICAgIGZvciBjIGluIGRpcjoKICAgICAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IHdpbjMyYXBpCiAgICAgICAgICAgICAgICBkaXIgPSB3aW4zMmFwaS5HZXRTaG9ydFBhdGhOYW1lKGRpcikKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gZGlyCgoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcyhjc2lkbF9uYW1lKToKICAgIGltcG9ydCBjdHlwZXMKCiAgICBjc2lkbF9jb25zdCA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6IDI2LAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6IDM1LAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogMjgsCiAgICB9W2NzaWRsX25hbWVdCgogICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgY3R5cGVzLndpbmRsbC5zaGVsbDMyLlNIR2V0Rm9sZGVyUGF0aFcoTm9uZSwgY3NpZGxfY29uc3QsIE5vbmUsIDAsIGJ1ZikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBidWY6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYyID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgICAgIGlmIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0U2hvcnRQYXRoTmFtZVcoYnVmLnZhbHVlLCBidWYyLCAxMDI0KToKICAgICAgICAgICAgYnVmID0gYnVmMgoKICAgIHJldHVybiBidWYudmFsdWUKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9qbmEoY3NpZGxfbmFtZSk6CiAgICBpbXBvcnQgYXJyYXkKICAgIGZyb20gY29tLnN1biBpbXBvcnQgam5hCiAgICBmcm9tIGNvbS5zdW4uam5hLnBsYXRmb3JtIGltcG9ydCB3aW4zMgoKICAgIGJ1Zl9zaXplID0gd2luMzIuV2luRGVmLk1BWF9QQVRIICogMgogICAgYnVmID0gYXJyYXkuemVyb3MoJ2MnLCBidWZfc2l6ZSkKICAgIHNoZWxsID0gd2luMzIuU2hlbGwzMi5JTlNUQU5DRQogICAgc2hlbGwuU0hHZXRGb2xkZXJQYXRoKE5vbmUsIGdldGF0dHIod2luMzIuU2hsT2JqLCBjc2lkbF9uYW1lKSwgTm9uZSwgd2luMzIuU2hsT2JqLlNIR0ZQX1RZUEVfQ1VSUkVOVCwgYnVmKQogICAgZGlyID0gam5hLk5hdGl2ZS50b1N0cmluZyhidWYudG9zdHJpbmcoKSkucnN0cmlwKCJcMCIpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gZGlyOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmID0gYXJyYXkuemVyb3MoJ2MnLCBidWZfc2l6ZSkKICAgICAgICBrZXJuZWwgPSB3aW4zMi5LZXJuZWwzMi5JTlNUQU5DRQogICAgICAgIGlmIGtlcm5hbC5HZXRTaG9ydFBhdGhOYW1lKGRpciwgYnVmLCBidWZfc2l6ZSk6CiAgICAgICAgICAgIGRpciA9IGpuYS5OYXRpdmUudG9TdHJpbmcoYnVmLnRvc3RyaW5nKCkpLnJzdHJpcCgiXDAiKQoKICAgIHJldHVybiBkaXIKCmlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgdHJ5OgogICAgICAgIGltcG9ydCB3aW4zMmNvbS5zaGVsbAogICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX3B5d2luMzIKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW5kbGwKICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgY29tLnN1bi5qbmEKICAgICAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2puYQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeQoKCiMtLS0tIHNlbGYgdGVzdCBjb2RlCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgYXBwbmFtZSA9ICJNeUFwcCIKICAgIGFwcGF1dGhvciA9ICJNeUNvbXBhbnkiCgogICAgcHJvcHMgPSAoInVzZXJfZGF0YV9kaXIiLCAic2l0ZV9kYXRhX2RpciIsCiAgICAgICAgICAgICAidXNlcl9jb25maWdfZGlyIiwgInNpdGVfY29uZmlnX2RpciIsCiAgICAgICAgICAgICAidXNlcl9jYWNoZV9kaXIiLCAidXNlcl9sb2dfZGlyIikKCiAgICBwcmludCgiLS0gYXBwIGRpcnMgKHdpdGggb3B0aW9uYWwgJ3ZlcnNpb24nKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb249IjEuMCIpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aG91dCBvcHRpb25hbCAndmVyc2lvbicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvcikKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRob3V0IG9wdGlvbmFsICdhcHBhdXRob3InKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGggZGlzYWJsZWQgJ2FwcGF1dGhvcicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvcj1GYWxzZSkKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQpQSwMEFAAAAAAAAAAhAABWrDouAQAALgEAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fX2luaXRfXy5weSIiIkNhY2hlQ29udHJvbCBpbXBvcnQgSW50ZXJmYWNlLgoKTWFrZSBpdCBlYXN5IHRvIGltcG9ydCBmcm9tIGNhY2hlY29udHJvbCB3aXRob3V0IGxvbmcgbmFtZXNwYWNlcy4KIiIiCl9fYXV0aG9yX18gPSAnRXJpYyBMYXJzb24nCl9fZW1haWxfXyA9ICdlcmljQGlvbnJvY2sub3JnJwpfX3ZlcnNpb25fXyA9ICcwLjExLjcnCgpmcm9tIC53cmFwcGVyIGltcG9ydCBDYWNoZUNvbnRyb2wKZnJvbSAuYWRhcHRlciBpbXBvcnQgQ2FjaGVDb250cm9sQWRhcHRlcgpmcm9tIC5jb250cm9sbGVyIGltcG9ydCBDYWNoZUNvbnRyb2xsZXIKUEsDBBQAAAAAAAAAIQDaVEalKAUAACgFAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX2NtZC5weWltcG9ydCBsb2dnaW5nCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCByZXF1ZXN0cwoKZnJvbSBwaXAuX3ZlbmRvci5jYWNoZWNvbnRyb2wuYWRhcHRlciBpbXBvcnQgQ2FjaGVDb250cm9sQWRhcHRlcgpmcm9tIHBpcC5fdmVuZG9yLmNhY2hlY29udHJvbC5jYWNoZSBpbXBvcnQgRGljdENhY2hlCmZyb20gcGlwLl92ZW5kb3IuY2FjaGVjb250cm9sLmNvbnRyb2xsZXIgaW1wb3J0IGxvZ2dlcgoKZnJvbSBhcmdwYXJzZSBpbXBvcnQgQXJndW1lbnRQYXJzZXIKCgpkZWYgc2V0dXBfbG9nZ2luZygpOgogICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCiAgICBoYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKCkKICAgIGxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpCgoKZGVmIGdldF9zZXNzaW9uKCk6CiAgICBhZGFwdGVyID0gQ2FjaGVDb250cm9sQWRhcHRlcigKICAgICAgICBEaWN0Q2FjaGUoKSwKICAgICAgICBjYWNoZV9ldGFncz1UcnVlLAogICAgICAgIHNlcmlhbGl6ZXI9Tm9uZSwKICAgICAgICBoZXVyaXN0aWM9Tm9uZSwKICAgICkKICAgIHNlc3MgPSByZXF1ZXN0cy5TZXNzaW9uKCkKICAgIHNlc3MubW91bnQoJ2h0dHA6Ly8nLCBhZGFwdGVyKQogICAgc2Vzcy5tb3VudCgnaHR0cHM6Ly8nLCBhZGFwdGVyKQoKICAgIHNlc3MuY2FjaGVfY29udHJvbGxlciA9IGFkYXB0ZXIuY29udHJvbGxlcgogICAgcmV0dXJuIHNlc3MKCgpkZWYgZ2V0X2FyZ3MoKToKICAgIHBhcnNlciA9IEFyZ3VtZW50UGFyc2VyKCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3VybCcsIGhlbHA9J1RoZSBVUkwgdG8gdHJ5IGFuZCBjYWNoZScpCiAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQoKCmRlZiBtYWluKGFyZ3M9Tm9uZSk6CiAgICBhcmdzID0gZ2V0X2FyZ3MoKQogICAgc2VzcyA9IGdldF9zZXNzaW9uKCkKCiAgICAjIE1ha2UgYSByZXF1ZXN0IHRvIGdldCBhIHJlc3BvbnNlCiAgICByZXNwID0gc2Vzcy5nZXQoYXJncy51cmwpCgogICAgIyBUdXJuIG9uIGxvZ2dpbmcKICAgIHNldHVwX2xvZ2dpbmcoKQoKICAgICMgdHJ5IHNldHRpbmcgdGhlIGNhY2hlCiAgICBzZXNzLmNhY2hlX2NvbnRyb2xsZXIuY2FjaGVfcmVzcG9uc2UocmVzcC5yZXF1ZXN0LCByZXNwLnJhdykKCiAgICAjIE5vdyB0cnkgdG8gZ2V0IGl0CiAgICBpZiBzZXNzLmNhY2hlX2NvbnRyb2xsZXIuY2FjaGVkX3JlcXVlc3QocmVzcC5yZXF1ZXN0KToKICAgICAgICBwcmludCgnQ2FjaGVkIScpCiAgICBlbHNlOgogICAgICAgIHByaW50KCdOb3QgY2FjaGVkIDooJykKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAUOapLAASAAAAEgAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2FkYXB0ZXIucHlpbXBvcnQgdHlwZXMKaW1wb3J0IGZ1bmN0b29scwoKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5hZGFwdGVycyBpbXBvcnQgSFRUUEFkYXB0ZXIKCmZyb20gLmNvbnRyb2xsZXIgaW1wb3J0IENhY2hlQ29udHJvbGxlcgpmcm9tIC5jYWNoZSBpbXBvcnQgRGljdENhY2hlCmZyb20gLmZpbGV3cmFwcGVyIGltcG9ydCBDYWxsYmFja0ZpbGVXcmFwcGVyCgoKY2xhc3MgQ2FjaGVDb250cm9sQWRhcHRlcihIVFRQQWRhcHRlcik6CiAgICBpbnZhbGlkYXRpbmdfbWV0aG9kcyA9IHNldChbJ1BVVCcsICdERUxFVEUnXSkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGU9Tm9uZSwKICAgICAgICAgICAgICAgICBjYWNoZV9ldGFncz1UcnVlLAogICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJfY2xhc3M9Tm9uZSwKICAgICAgICAgICAgICAgICBzZXJpYWxpemVyPU5vbmUsCiAgICAgICAgICAgICAgICAgaGV1cmlzdGljPU5vbmUsCiAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKENhY2hlQ29udHJvbEFkYXB0ZXIsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuY2FjaGUgPSBjYWNoZSBvciBEaWN0Q2FjaGUoKQogICAgICAgIHNlbGYuaGV1cmlzdGljID0gaGV1cmlzdGljCgogICAgICAgIGNvbnRyb2xsZXJfZmFjdG9yeSA9IGNvbnRyb2xsZXJfY2xhc3Mgb3IgQ2FjaGVDb250cm9sbGVyCiAgICAgICAgc2VsZi5jb250cm9sbGVyID0gY29udHJvbGxlcl9mYWN0b3J5KAogICAgICAgICAgICBzZWxmLmNhY2hlLAogICAgICAgICAgICBjYWNoZV9ldGFncz1jYWNoZV9ldGFncywKICAgICAgICAgICAgc2VyaWFsaXplcj1zZXJpYWxpemVyLAogICAgICAgICkKCiAgICBkZWYgc2VuZChzZWxmLCByZXF1ZXN0LCAqKmt3KToKICAgICAgICAiIiIKICAgICAgICBTZW5kIGEgcmVxdWVzdC4gVXNlIHRoZSByZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHNlZSBpZiBpdAogICAgICAgIGV4aXN0cyBpbiB0aGUgY2FjaGUgYW5kIGNhY2hlIHRoZSByZXNwb25zZSBpZiB3ZSBuZWVkIHRvIGFuZCBjYW4uCiAgICAgICAgIiIiCiAgICAgICAgaWYgcmVxdWVzdC5tZXRob2QgPT0gJ0dFVCc6CiAgICAgICAgICAgIGNhY2hlZF9yZXNwb25zZSA9IHNlbGYuY29udHJvbGxlci5jYWNoZWRfcmVxdWVzdChyZXF1ZXN0KQogICAgICAgICAgICBpZiBjYWNoZWRfcmVzcG9uc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5idWlsZF9yZXNwb25zZShyZXF1ZXN0LCBjYWNoZWRfcmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX2NhY2hlPVRydWUpCgogICAgICAgICAgICAjIGNoZWNrIGZvciBldGFncyBhbmQgYWRkIGhlYWRlcnMgaWYgYXBwcm9wcmlhdGUKICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnVwZGF0ZSgKICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbGxlci5jb25kaXRpb25hbF9oZWFkZXJzKHJlcXVlc3QpCiAgICAgICAgICAgICkKCiAgICAgICAgcmVzcCA9IHN1cGVyKENhY2hlQ29udHJvbEFkYXB0ZXIsIHNlbGYpLnNlbmQocmVxdWVzdCwgKiprdykKCiAgICAgICAgcmV0dXJuIHJlc3AKCiAgICBkZWYgYnVpbGRfcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgcmVzcG9uc2UsIGZyb21fY2FjaGU9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgcmVzcG9uc2UgYnkgbWFraW5nIGEgcmVxdWVzdCBvciB1c2luZyB0aGUgY2FjaGUuCgogICAgICAgIFRoaXMgd2lsbCBlbmQgdXAgY2FsbGluZyBzZW5kIGFuZCByZXR1cm5pbmcgYSBwb3RlbnRpYWxseQogICAgICAgIGNhY2hlZCByZXNwb25zZQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBmcm9tX2NhY2hlIGFuZCByZXF1ZXN0Lm1ldGhvZCA9PSAnR0VUJzoKICAgICAgICAgICAgIyBDaGVjayBmb3IgYW55IGhldXJpc3RpY3MgdGhhdCBtaWdodCB1cGRhdGUgaGVhZGVycwogICAgICAgICAgICAjIGJlZm9yZSB0cnlpbmcgdG8gY2FjaGUuCiAgICAgICAgICAgIGlmIHNlbGYuaGV1cmlzdGljOgogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmhldXJpc3RpYy5hcHBseShyZXNwb25zZSkKCiAgICAgICAgICAgICMgYXBwbHkgYW55IGV4cGlyYXRpb24gaGV1cmlzdGljcwogICAgICAgICAgICBpZiByZXNwb25zZS5zdGF0dXMgPT0gMzA0OgogICAgICAgICAgICAgICAgIyBXZSBtdXN0IGhhdmUgc2VudCBhbiBFVGFnIHJlcXVlc3QuIFRoaXMgY291bGQgbWVhbgogICAgICAgICAgICAgICAgIyB0aGF0IHdlJ3ZlIGJlZW4gZXhwaXJlZCBhbHJlYWR5IG9yIHRoYXQgd2Ugc2ltcGx5CiAgICAgICAgICAgICAgICAjIGhhdmUgYW4gZXRhZy4gSW4gZWl0aGVyIGNhc2UsIHdlIHdhbnQgdG8gdHJ5IGFuZAogICAgICAgICAgICAgICAgIyB1cGRhdGUgdGhlIGNhY2hlIGlmIHRoYXQgaXMgdGhlIGNhc2UuCiAgICAgICAgICAgICAgICBjYWNoZWRfcmVzcG9uc2UgPSBzZWxmLmNvbnRyb2xsZXIudXBkYXRlX2NhY2hlZF9yZXNwb25zZSgKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIGNhY2hlZF9yZXNwb25zZSBpcyBub3QgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgZnJvbV9jYWNoZSA9IFRydWUKCiAgICAgICAgICAgICAgICAjIFdlIGFyZSBkb25lIHdpdGggdGhlIHNlcnZlciByZXNwb25zZSwgcmVhZCBhCiAgICAgICAgICAgICAgICAjIHBvc3NpYmxlIHJlc3BvbnNlIGJvZHkgKGNvbXBsaWFudCBzZXJ2ZXJzIHdpbGwKICAgICAgICAgICAgICAgICMgbm90IHJldHVybiBvbmUsIGJ1dCB3ZSBjYW5ub3QgYmUgMTAwJSBzdXJlKSBhbmQKICAgICAgICAgICAgICAgICMgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgogICAgICAgICAgICAgICAgcmVzcG9uc2UucmVhZChkZWNvZGVfY29udGVudD1GYWxzZSkKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlbGVhc2VfY29ubigpCgogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjYWNoZWRfcmVzcG9uc2UKCiAgICAgICAgICAgICMgV2UgYWx3YXlzIGNhY2hlIHRoZSAzMDEgcmVzcG9uc2VzCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwMToKICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbGxlci5jYWNoZV9yZXNwb25zZShyZXF1ZXN0LCByZXNwb25zZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgV3JhcCB0aGUgcmVzcG9uc2UgZmlsZSB3aXRoIGEgd3JhcHBlciB0aGF0IHdpbGwgY2FjaGUgdGhlCiAgICAgICAgICAgICAgICAjICAgcmVzcG9uc2Ugd2hlbiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNvbnN1bWVkLgogICAgICAgICAgICAgICAgcmVzcG9uc2UuX2ZwID0gQ2FsbGJhY2tGaWxlV3JhcHBlcigKICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5fZnAsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rvb2xzLnBhcnRpYWwoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbGxlci5jYWNoZV9yZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgcmVzcG9uc2UuY2h1bmtlZDoKICAgICAgICAgICAgICAgICAgICBzdXBlcl91cGRhdGVfY2h1bmtfbGVuZ3RoID0gcmVzcG9uc2UuX3VwZGF0ZV9jaHVua19sZW5ndGgKCiAgICAgICAgICAgICAgICAgICAgZGVmIF91cGRhdGVfY2h1bmtfbGVuZ3RoKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcl91cGRhdGVfY2h1bmtfbGVuZ3RoKCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jaHVua19sZWZ0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9mcC5fY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLl91cGRhdGVfY2h1bmtfbGVuZ3RoID0gdHlwZXMuTWV0aG9kVHlwZShfdXBkYXRlX2NodW5rX2xlbmd0aCwgcmVzcG9uc2UpCgogICAgICAgIHJlc3AgPSBzdXBlcihDYWNoZUNvbnRyb2xBZGFwdGVyLCBzZWxmKS5idWlsZF9yZXNwb25zZSgKICAgICAgICAgICAgcmVxdWVzdCwgcmVzcG9uc2UKICAgICAgICApCgogICAgICAgICMgU2VlIGlmIHdlIHNob3VsZCBpbnZhbGlkYXRlIHRoZSBjYWNoZS4KICAgICAgICBpZiByZXF1ZXN0Lm1ldGhvZCBpbiBzZWxmLmludmFsaWRhdGluZ19tZXRob2RzIGFuZCByZXNwLm9rOgogICAgICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNvbnRyb2xsZXIuY2FjaGVfdXJsKHJlcXVlc3QudXJsKQogICAgICAgICAgICBzZWxmLmNhY2hlLmRlbGV0ZShjYWNoZV91cmwpCgogICAgICAgICMgR2l2ZSB0aGUgcmVxdWVzdCBhIGZyb21fY2FjaGUgYXR0ciB0byBsZXQgcGVvcGxlIHVzZSBpdAogICAgICAgIHJlc3AuZnJvbV9jYWNoZSA9IGZyb21fY2FjaGUKCiAgICAgICAgcmV0dXJuIHJlc3AKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5jYWNoZS5jbG9zZSgpCiAgICAgICAgc3VwZXIoQ2FjaGVDb250cm9sQWRhcHRlciwgc2VsZikuY2xvc2UoKQpQSwMEFAAAAAAAAAAhABKqxvAWAwAAFgMAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZS5weSIiIgpUaGUgY2FjaGUgb2JqZWN0IEFQSSBmb3IgaW1wbGVtZW50aW5nIGNhY2hlcy4gVGhlIGRlZmF1bHQgaXMgYSB0aHJlYWQKc2FmZSBpbi1tZW1vcnkgZGljdGlvbmFyeS4KIiIiCmZyb20gdGhyZWFkaW5nIGltcG9ydCBMb2NrCgoKY2xhc3MgQmFzZUNhY2hlKG9iamVjdCk6CgogICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCkKCiAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCkKCiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoKQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBwYXNzCgoKY2xhc3MgRGljdENhY2hlKEJhc2VDYWNoZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGluaXRfZGljdD1Ob25lKToKICAgICAgICBzZWxmLmxvY2sgPSBMb2NrKCkKICAgICAgICBzZWxmLmRhdGEgPSBpbml0X2RpY3Qgb3Ige30KCiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5nZXQoa2V5LCBOb25lKQoKICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIHNlbGYuZGF0YS51cGRhdGUoe2tleTogdmFsdWV9KQoKICAgIGRlZiBkZWxldGUoc2VsZiwga2V5KToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgaWYga2V5IGluIHNlbGYuZGF0YToKICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wb3Aoa2V5KQpQSwMEFAAAAAAAAAAhAJ4dVvxxAQAAcQEAAEgAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvX19pbml0X18ucHlmcm9tIHRleHR3cmFwIGltcG9ydCBkZWRlbnQKCnRyeToKICAgIGZyb20gLmZpbGVfY2FjaGUgaW1wb3J0IEZpbGVDYWNoZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBub3RpY2UgPSBkZWRlbnQoJycnCiAgICBOT1RFOiBJbiBvcmRlciB0byB1c2UgdGhlIEZpbGVDYWNoZSB5b3UgbXVzdCBoYXZlCiAgICBsb2NrZmlsZSBpbnN0YWxsZWQuIFlvdSBjYW4gaW5zdGFsbCBpdCB2aWEgcGlwOgogICAgICBwaXAgaW5zdGFsbCBsb2NrZmlsZQogICAgJycnKQogICAgcHJpbnQobm90aWNlKQoKCnRyeToKICAgIGltcG9ydCByZWRpcwogICAgZnJvbSAucmVkaXNfY2FjaGUgaW1wb3J0IFJlZGlzQ2FjaGUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwpQSwMEFAAAAAAAAAAhAMGnBv/MDQAAzA0AAEoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvZmlsZV9jYWNoZS5weWltcG9ydCBoYXNobGliCmltcG9ydCBvcwoKZnJvbSBwaXAuX3ZlbmRvci5sb2NrZmlsZSBpbXBvcnQgTG9ja0ZpbGUKZnJvbSBwaXAuX3ZlbmRvci5sb2NrZmlsZS5ta2RpcmxvY2tmaWxlIGltcG9ydCBNa2RpckxvY2tGaWxlCgpmcm9tIC4uY2FjaGUgaW1wb3J0IEJhc2VDYWNoZQpmcm9tIC4uY29udHJvbGxlciBpbXBvcnQgQ2FjaGVDb250cm9sbGVyCgoKZGVmIF9zZWN1cmVfb3Blbl93cml0ZShmaWxlbmFtZSwgZm1vZGUpOgogICAgIyBXZSBvbmx5IHdhbnQgdG8gd3JpdGUgdG8gdGhpcyBmaWxlLCBzbyBvcGVuIGl0IGluIHdyaXRlIG9ubHkgbW9kZQogICAgZmxhZ3MgPSBvcy5PX1dST05MWQoKICAgICMgb3MuT19DUkVBVCB8IG9zLk9fRVhDTCB3aWxsIGZhaWwgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIHNvIHdlIG9ubHkKICAgICMgIHdpbGwgb3BlbiAqbmV3KiBmaWxlcy4KICAgICMgV2Ugc3BlY2lmeSB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgbW9kZSB3ZSBwYXNzIGlzIHRoZQogICAgIyBtb2RlIG9mIHRoZSBmaWxlLgogICAgZmxhZ3MgfD0gb3MuT19DUkVBVCB8IG9zLk9fRVhDTAoKICAgICMgRG8gbm90IGZvbGxvdyBzeW1saW5rcyB0byBwcmV2ZW50IHNvbWVvbmUgZnJvbSBtYWtpbmcgYSBzeW1saW5rIHRoYXQKICAgICMgd2UgZm9sbG93IGFuZCBpbnNlY3VyZWx5IG9wZW4gYSBjYWNoZSBmaWxlLgogICAgaWYgaGFzYXR0cihvcywgIk9fTk9GT0xMT1ciKToKICAgICAgICBmbGFncyB8PSBvcy5PX05PRk9MTE9XCgogICAgIyBPbiBXaW5kb3dzIHdlJ2xsIG1hcmsgdGhpcyBmaWxlIGFzIGJpbmFyeQogICAgaWYgaGFzYXR0cihvcywgIk9fQklOQVJZIik6CiAgICAgICAgZmxhZ3MgfD0gb3MuT19CSU5BUlkKCiAgICAjIEJlZm9yZSB3ZSBvcGVuIG91ciBmaWxlLCB3ZSB3YW50IHRvIGRlbGV0ZSBhbnkgZXhpc3RpbmcgZmlsZSB0aGF0IGlzCiAgICAjIHRoZXJlCiAgICB0cnk6CiAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQogICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKToKICAgICAgICAjIFRoZSBmaWxlIG11c3Qgbm90IGV4aXN0IGFscmVhZHksIHNvIHdlIGNhbiBqdXN0IHNraXAgYWhlYWQgdG8gb3BlbmluZwogICAgICAgIHBhc3MKCiAgICAjIE9wZW4gb3VyIGZpbGUsIHRoZSB1c2Ugb2Ygb3MuT19DUkVBVCB8IG9zLk9fRVhDTCB3aWxsIGVuc3VyZSB0aGF0IGlmIGEKICAgICMgcmFjZSBjb25kaXRpb24gaGFwcGVucyBiZXR3ZWVuIHRoZSBvcy5yZW1vdmUgYW5kIHRoaXMgbGluZSwgdGhhdCBhbgogICAgIyBlcnJvciB3aWxsIGJlIHJhaXNlZC4gQmVjYXVzZSB3ZSB1dGlsaXplIGEgbG9ja2ZpbGUgdGhpcyBzaG91bGQgb25seQogICAgIyBoYXBwZW4gaWYgc29tZW9uZSBpcyBhdHRlbXB0aW5nIHRvIGF0dGFjayB1cy4KICAgIGZkID0gb3Mub3BlbihmaWxlbmFtZSwgZmxhZ3MsIGZtb2RlKQogICAgdHJ5OgogICAgICAgIHJldHVybiBvcy5mZG9wZW4oZmQsICJ3YiIpCiAgICBleGNlcHQ6CiAgICAgICAgIyBBbiBlcnJvciBvY2N1cnJlZCB3cmFwcGluZyBvdXIgRkQgaW4gYSBmaWxlIG9iamVjdAogICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgIHJhaXNlCgoKY2xhc3MgRmlsZUNhY2hlKEJhc2VDYWNoZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyZWN0b3J5LCBmb3JldmVyPUZhbHNlLCBmaWxlbW9kZT0wbzA2MDAsCiAgICAgICAgICAgICAgICAgZGlybW9kZT0wbzA3MDAsIHVzZV9kaXJfbG9jaz1Ob25lLCBsb2NrX2NsYXNzPU5vbmUpOgoKICAgICAgICBpZiB1c2VfZGlyX2xvY2sgaXMgbm90IE5vbmUgYW5kIGxvY2tfY2xhc3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCB1c2UgdXNlX2Rpcl9sb2NrIGFuZCBsb2NrX2NsYXNzIHRvZ2V0aGVyIikKCiAgICAgICAgaWYgdXNlX2Rpcl9sb2NrOgogICAgICAgICAgICBsb2NrX2NsYXNzID0gTWtkaXJMb2NrRmlsZQoKICAgICAgICBpZiBsb2NrX2NsYXNzIGlzIE5vbmU6CiAgICAgICAgICAgIGxvY2tfY2xhc3MgPSBMb2NrRmlsZQoKICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IGRpcmVjdG9yeQogICAgICAgIHNlbGYuZm9yZXZlciA9IGZvcmV2ZXIKICAgICAgICBzZWxmLmZpbGVtb2RlID0gZmlsZW1vZGUKICAgICAgICBzZWxmLmRpcm1vZGUgPSBkaXJtb2RlCiAgICAgICAgc2VsZi5sb2NrX2NsYXNzID0gbG9ja19jbGFzcwoKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZW5jb2RlKHgpOgogICAgICAgIHJldHVybiBoYXNobGliLnNoYTIyNCh4LmVuY29kZSgpKS5oZXhkaWdlc3QoKQoKICAgIGRlZiBfZm4oc2VsZiwgbmFtZSk6CiAgICAgICAgIyBOT1RFOiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGNoYW5nZSBhcyBzb21lIG1heSBkZXBlbmQgb24gaXQuCiAgICAgICAgIyAgICAgICBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9pb25yb2NrL2NhY2hlY29udHJvbC9pc3N1ZXMvNjMKICAgICAgICBoYXNoZWQgPSBzZWxmLmVuY29kZShuYW1lKQogICAgICAgIHBhcnRzID0gbGlzdChoYXNoZWRbOjVdKSArIFtoYXNoZWRdCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmRpcmVjdG9yeSwgKnBhcnRzKQoKICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICBuYW1lID0gc2VsZi5fZm4oa2V5KQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhuYW1lKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgd2l0aCBvcGVuKG5hbWUsICdyYicpIGFzIGZoOgogICAgICAgICAgICByZXR1cm4gZmgucmVhZCgpCgogICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICBuYW1lID0gc2VsZi5fZm4oa2V5KQoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cwogICAgICAgIHRyeToKICAgICAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKG5hbWUpLCBzZWxmLmRpcm1vZGUpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICB3aXRoIHNlbGYubG9ja19jbGFzcyhuYW1lKSBhcyBsb2NrOgogICAgICAgICAgICAjIFdyaXRlIG91ciBhY3R1YWwgZmlsZQogICAgICAgICAgICB3aXRoIF9zZWN1cmVfb3Blbl93cml0ZShsb2NrLnBhdGgsIHNlbGYuZmlsZW1vZGUpIGFzIGZoOgogICAgICAgICAgICAgICAgZmgud3JpdGUodmFsdWUpCgogICAgZGVmIGRlbGV0ZShzZWxmLCBrZXkpOgogICAgICAgIG5hbWUgPSBzZWxmLl9mbihrZXkpCiAgICAgICAgaWYgbm90IHNlbGYuZm9yZXZlcjoKICAgICAgICAgICAgb3MucmVtb3ZlKG5hbWUpCgoKZGVmIHVybF90b19maWxlX3BhdGgodXJsLCBmaWxlY2FjaGUpOgogICAgIiIiUmV0dXJuIHRoZSBmaWxlIGNhY2hlIHBhdGggYmFzZWQgb24gdGhlIFVSTC4KCiAgICBUaGlzIGRvZXMgbm90IGVuc3VyZSB0aGUgZmlsZSBleGlzdHMhCiAgICAiIiIKICAgIGtleSA9IENhY2hlQ29udHJvbGxlci5jYWNoZV91cmwodXJsKQogICAgcmV0dXJuIGZpbGVjYWNoZS5fZm4oa2V5KQpQSwMEFAAAAAAAAAAhANOIxlTNAwAAzQMAAEsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvcmVkaXNfY2FjaGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCgpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQoKCmRlZiB0b3RhbF9zZWNvbmRzKHRkKToKICAgICIiIlB5dGhvbiAyLjYgY29tcGF0YWJpbGl0eSIiIgogICAgaWYgaGFzYXR0cih0ZCwgJ3RvdGFsX3NlY29uZHMnKToKICAgICAgICByZXR1cm4gdGQudG90YWxfc2Vjb25kcygpCgogICAgbXMgPSB0ZC5taWNyb3NlY29uZHMKICAgIHNlY3MgPSAodGQuc2Vjb25kcyArIHRkLmRheXMgKiAyNCAqIDM2MDApCiAgICByZXR1cm4gKG1zICsgc2VjcyAqIDEwKio2KSAvIDEwKio2CgoKY2xhc3MgUmVkaXNDYWNoZShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uKToKICAgICAgICBzZWxmLmNvbm4gPSBjb25uCgogICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLmNvbm4uZ2V0KGtleSkKCiAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUsIGV4cGlyZXM9Tm9uZSk6CiAgICAgICAgaWYgbm90IGV4cGlyZXM6CiAgICAgICAgICAgIHNlbGYuY29ubi5zZXQoa2V5LCB2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBleHBpcmVzID0gZXhwaXJlcyAtIGRhdGV0aW1lLm5vdygpCiAgICAgICAgICAgIHNlbGYuY29ubi5zZXRleChrZXksIHRvdGFsX3NlY29uZHMoZXhwaXJlcyksIHZhbHVlKQoKICAgIGRlZiBkZWxldGUoc2VsZiwga2V5KToKICAgICAgICBzZWxmLmNvbm4uZGVsZXRlKGtleSkKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiSGVscGVyIGZvciBjbGVhcmluZyBhbGwgdGhlIGtleXMgaW4gYSBkYXRhYmFzZS4gVXNlIHdpdGgKICAgICAgICBjYXV0aW9uISIiIgogICAgICAgIGZvciBrZXkgaW4gc2VsZi5jb25uLmtleXMoKToKICAgICAgICAgICAgc2VsZi5jb25uLmRlbGV0ZShrZXkpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHNlbGYuY29ubi5kaXNjb25uZWN0KCkKUEsDBBQAAAAAAAAAIQAtPC0zfAEAAHwBAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29tcGF0LnB5dHJ5OgogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybGpvaW4KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJsam9pbgoKCnRyeToKICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgcGlja2xlCgoKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnJlc3BvbnNlIGltcG9ydCBIVFRQUmVzcG9uc2UKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnV0aWwgaW1wb3J0IGlzX2ZwX2Nsb3NlZAoKIyBSZXBsaWNhdGUgc29tZSBzaXggYmVoYXZpb3VyCnRyeToKICAgIHRleHRfdHlwZSA9ICh1bmljb2RlLCkKZXhjZXB0IE5hbWVFcnJvcjoKICAgIHRleHRfdHlwZSA9IChzdHIsKQpQSwMEFAAAAAAAAAAhAMdgud7gMgAA4DIAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb250cm9sbGVyLnB5IiIiClRoZSBodHRwbGliMiBhbGdvcml0aG1zIHBvcnRlZCBmb3IgdXNlIHdpdGggcmVxdWVzdHMuCiIiIgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKaW1wb3J0IGNhbGVuZGFyCmltcG9ydCB0aW1lCmZyb20gZW1haWwudXRpbHMgaW1wb3J0IHBhcnNlZGF0ZV90egoKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0Cgpmcm9tIC5jYWNoZSBpbXBvcnQgRGljdENhY2hlCmZyb20gLnNlcmlhbGl6ZSBpbXBvcnQgU2VyaWFsaXplcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKVVJJID0gcmUuY29tcGlsZShyIl4oKFteOi8/I10rKTopPygvLyhbXi8/I10qKSk/KFtePyNdKikoXD8oW14jXSopKT8oIyguKikpPyIpCgoKZGVmIHBhcnNlX3VyaSh1cmkpOgogICAgIiIiUGFyc2VzIGEgVVJJIHVzaW5nIHRoZSByZWdleCBnaXZlbiBpbiBBcHBlbmRpeCBCIG9mIFJGQyAzOTg2LgoKICAgICAgICAoc2NoZW1lLCBhdXRob3JpdHksIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkgPSBwYXJzZV91cmkodXJpKQogICAgIiIiCiAgICBncm91cHMgPSBVUkkubWF0Y2godXJpKS5ncm91cHMoKQogICAgcmV0dXJuIChncm91cHNbMV0sIGdyb3Vwc1szXSwgZ3JvdXBzWzRdLCBncm91cHNbNl0sIGdyb3Vwc1s4XSkKCgpjbGFzcyBDYWNoZUNvbnRyb2xsZXIob2JqZWN0KToKICAgICIiIkFuIGludGVyZmFjZSB0byBzZWUgaWYgcmVxdWVzdCBzaG91bGQgY2FjaGVkIG9yIG5vdC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhY2hlPU5vbmUsIGNhY2hlX2V0YWdzPVRydWUsIHNlcmlhbGl6ZXI9Tm9uZSk6CiAgICAgICAgc2VsZi5jYWNoZSA9IGNhY2hlIG9yIERpY3RDYWNoZSgpCiAgICAgICAgc2VsZi5jYWNoZV9ldGFncyA9IGNhY2hlX2V0YWdzCiAgICAgICAgc2VsZi5zZXJpYWxpemVyID0gc2VyaWFsaXplciBvciBTZXJpYWxpemVyKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfdXJsbm9ybShjbHMsIHVyaSk6CiAgICAgICAgIiIiTm9ybWFsaXplIHRoZSBVUkwgdG8gY3JlYXRlIGEgc2FmZSBrZXkgZm9yIHRoZSBjYWNoZSIiIgogICAgICAgIChzY2hlbWUsIGF1dGhvcml0eSwgcGF0aCwgcXVlcnksIGZyYWdtZW50KSA9IHBhcnNlX3VyaSh1cmkpCiAgICAgICAgaWYgbm90IHNjaGVtZSBvciBub3QgYXV0aG9yaXR5OgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIk9ubHkgYWJzb2x1dGUgVVJJcyBhcmUgYWxsb3dlZC4gdXJpID0gJXMiICUgdXJpKQoKICAgICAgICBzY2hlbWUgPSBzY2hlbWUubG93ZXIoKQogICAgICAgIGF1dGhvcml0eSA9IGF1dGhvcml0eS5sb3dlcigpCgogICAgICAgIGlmIG5vdCBwYXRoOgogICAgICAgICAgICBwYXRoID0gIi8iCgogICAgICAgICMgQ291bGQgZG8gc3ludGF4IGJhc2VkIG5vcm1hbGl6YXRpb24gb2YgdGhlIFVSSSBiZWZvcmUKICAgICAgICAjIGNvbXB1dGluZyB0aGUgZGlnZXN0LiBTZWUgU2VjdGlvbiA2LjIuMiBvZiBTdGQgNjYuCiAgICAgICAgcmVxdWVzdF91cmkgPSBxdWVyeSBhbmQgIj8iLmpvaW4oW3BhdGgsIHF1ZXJ5XSkgb3IgcGF0aAogICAgICAgIGRlZnJhZ191cmkgPSBzY2hlbWUgKyAiOi8vIiArIGF1dGhvcml0eSArIHJlcXVlc3RfdXJpCgogICAgICAgIHJldHVybiBkZWZyYWdfdXJpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgY2FjaGVfdXJsKGNscywgdXJpKToKICAgICAgICByZXR1cm4gY2xzLl91cmxub3JtKHVyaSkKCiAgICBkZWYgcGFyc2VfY2FjaGVfY29udHJvbChzZWxmLCBoZWFkZXJzKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSB0aGUgY2FjaGUgY29udHJvbCBoZWFkZXJzIHJldHVybmluZyBhIGRpY3Rpb25hcnkgd2l0aCB2YWx1ZXMKICAgICAgICBmb3IgdGhlIGRpZmZlcmVudCBkaXJlY3RpdmVzLgogICAgICAgICIiIgogICAgICAgIHJldHZhbCA9IHt9CgogICAgICAgIGNjX2hlYWRlciA9ICdjYWNoZS1jb250cm9sJwogICAgICAgIGlmICdDYWNoZS1Db250cm9sJyBpbiBoZWFkZXJzOgogICAgICAgICAgICBjY19oZWFkZXIgPSAnQ2FjaGUtQ29udHJvbCcKCiAgICAgICAgaWYgY2NfaGVhZGVyIGluIGhlYWRlcnM6CiAgICAgICAgICAgIHBhcnRzID0gaGVhZGVyc1tjY19oZWFkZXJdLnNwbGl0KCcsJykKICAgICAgICAgICAgcGFydHNfd2l0aF9hcmdzID0gWwogICAgICAgICAgICAgICAgdHVwbGUoW3guc3RyaXAoKS5sb3dlcigpIGZvciB4IGluIHBhcnQuc3BsaXQoIj0iLCAxKV0pCiAgICAgICAgICAgICAgICBmb3IgcGFydCBpbiBwYXJ0cyBpZiAtMSAhPSBwYXJ0LmZpbmQoIj0iKQogICAgICAgICAgICBdCiAgICAgICAgICAgIHBhcnRzX3dvX2FyZ3MgPSBbCiAgICAgICAgICAgICAgICAobmFtZS5zdHJpcCgpLmxvd2VyKCksIDEpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBwYXJ0cyBpZiAtMSA9PSBuYW1lLmZpbmQoIj0iKQogICAgICAgICAgICBdCiAgICAgICAgICAgIHJldHZhbCA9IGRpY3QocGFydHNfd2l0aF9hcmdzICsgcGFydHNfd29fYXJncykKICAgICAgICByZXR1cm4gcmV0dmFsCgogICAgZGVmIGNhY2hlZF9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGNhY2hlZCByZXNwb25zZSBpZiBpdCBleGlzdHMgaW4gdGhlIGNhY2hlLCBvdGhlcndpc2UKICAgICAgICByZXR1cm4gRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgY2FjaGVfdXJsID0gc2VsZi5jYWNoZV91cmwocmVxdWVzdC51cmwpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdMb29raW5nIHVwICIlcyIgaW4gdGhlIGNhY2hlJywgY2FjaGVfdXJsKQogICAgICAgIGNjID0gc2VsZi5wYXJzZV9jYWNoZV9jb250cm9sKHJlcXVlc3QuaGVhZGVycykKCiAgICAgICAgIyBCYWlsIG91dCBpZiB0aGUgcmVxdWVzdCBpbnNpc3RzIG9uIGZyZXNoIGRhdGEKICAgICAgICBpZiAnbm8tY2FjaGUnIGluIGNjOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlcXVlc3QgaGVhZGVyIGhhcyAibm8tY2FjaGUiLCBjYWNoZSBieXBhc3NlZCcpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiAnbWF4LWFnZScgaW4gY2MgYW5kIGNjWydtYXgtYWdlJ10gPT0gMDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IGhlYWRlciBoYXMgIm1heF9hZ2UiIGFzIDAsIGNhY2hlIGJ5cGFzc2VkJykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgUmVxdWVzdCBhbGxvd3Mgc2VydmluZyBmcm9tIHRoZSBjYWNoZSwgbGV0J3Mgc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nCiAgICAgICAgY2FjaGVfZGF0YSA9IHNlbGYuY2FjaGUuZ2V0KGNhY2hlX3VybCkKICAgICAgICBpZiBjYWNoZV9kYXRhIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gY2FjaGUgZW50cnkgYXZhaWxhYmxlJykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgQ2hlY2sgd2hldGhlciBpdCBjYW4gYmUgZGVzZXJpYWxpemVkCiAgICAgICAgcmVzcCA9IHNlbGYuc2VyaWFsaXplci5sb2FkcyhyZXF1ZXN0LCBjYWNoZV9kYXRhKQogICAgICAgIGlmIG5vdCByZXNwOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnQ2FjaGUgZW50cnkgZGVzZXJpYWxpemF0aW9uIGZhaWxlZCwgZW50cnkgaWdub3JlZCcpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlIGhhdmUgYSBjYWNoZWQgMzAxLCByZXR1cm4gaXQgaW1tZWRpYXRlbHkuIFdlIGRvbid0CiAgICAgICAgIyBuZWVkIHRvIHRlc3Qgb3VyIHJlc3BvbnNlIGZvciBvdGhlciBoZWFkZXJzIGIvYyBpdCBpcwogICAgICAgICMgaW50cmluc2ljYWxseSAiY2FjaGVhYmxlIiBhcyBpdCBpcyBQZXJtYW5lbnQuCiAgICAgICAgIyBTZWU6CiAgICAgICAgIyAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjIKICAgICAgICAjCiAgICAgICAgIyBDbGllbnQgY2FuIHRyeSB0byByZWZyZXNoIHRoZSB2YWx1ZSBieSByZXBlYXRpbmcgdGhlIHJlcXVlc3QKICAgICAgICAjIHdpdGggY2FjaGUgYnVzdGluZyBoZWFkZXJzIGFzIHVzdWFsIChpZSBuby1jYWNoZSkuCiAgICAgICAgaWYgcmVzcC5zdGF0dXMgPT0gMzAxOgogICAgICAgICAgICBtc2cgPSAoJ1JldHVybmluZyBjYWNoZWQgIjMwMSBNb3ZlZCBQZXJtYW5lbnRseSIgcmVzcG9uc2UgJwogICAgICAgICAgICAgICAgICAgJyhpZ25vcmluZyBkYXRlIGFuZCBldGFnIGluZm9ybWF0aW9uKScpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zyhtc2cpCiAgICAgICAgICAgIHJldHVybiByZXNwCgogICAgICAgIGhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KHJlc3AuaGVhZGVycykKICAgICAgICBpZiBub3QgaGVhZGVycyBvciAnZGF0ZScgbm90IGluIGhlYWRlcnM6CiAgICAgICAgICAgIGlmICdldGFnJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgICMgV2l0aG91dCBkYXRlIG9yIGV0YWcsIHRoZSBjYWNoZWQgcmVzcG9uc2UgY2FuIG5ldmVyIGJlIHVzZWQKICAgICAgICAgICAgICAgICMgYW5kIHNob3VsZCBiZSBkZWxldGVkLgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdQdXJnaW5nIGNhY2hlZCByZXNwb25zZTogbm8gZGF0ZSBvciBldGFnJykKICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUuZGVsZXRlKGNhY2hlX3VybCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZ25vcmluZyBjYWNoZWQgcmVzcG9uc2U6IG5vIGRhdGUnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICBkYXRlID0gY2FsZW5kYXIudGltZWdtKAogICAgICAgICAgICBwYXJzZWRhdGVfdHooaGVhZGVyc1snZGF0ZSddKQogICAgICAgICkKICAgICAgICBjdXJyZW50X2FnZSA9IG1heCgwLCBub3cgLSBkYXRlKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnQ3VycmVudCBhZ2UgYmFzZWQgb24gZGF0ZTogJWknLCBjdXJyZW50X2FnZSkKCiAgICAgICAgIyBUT0RPOiBUaGVyZSBpcyBhbiBhc3N1bXB0aW9uIHRoYXQgdGhlIHJlc3VsdCB3aWxsIGJlIGEKICAgICAgICAjICAgICAgIHVybGxpYjMgcmVzcG9uc2Ugb2JqZWN0LiBUaGlzIG1heSBub3QgYmUgYmVzdCBzaW5jZSB3ZQogICAgICAgICMgICAgICAgY291bGQgcHJvYmFibHkgYXZvaWQgaW5zdGFudGlhdGluZyBvciBjb25zdHJ1Y3RpbmcgdGhlCiAgICAgICAgIyAgICAgICByZXNwb25zZSB1bnRpbCB3ZSBrbm93IHdlIG5lZWQgaXQuCiAgICAgICAgcmVzcF9jYyA9IHNlbGYucGFyc2VfY2FjaGVfY29udHJvbChoZWFkZXJzKQoKICAgICAgICAjIGRldGVybWluZSBmcmVzaG5lc3MKICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSAwCgogICAgICAgICMgQ2hlY2sgdGhlIG1heC1hZ2UgcHJhZ21hIGluIHRoZSBjYWNoZSBjb250cm9sIGhlYWRlcgogICAgICAgIGlmICdtYXgtYWdlJyBpbiByZXNwX2NjIGFuZCByZXNwX2NjWydtYXgtYWdlJ10uaXNkaWdpdCgpOgogICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSBpbnQocmVzcF9jY1snbWF4LWFnZSddKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZyZXNobmVzcyBsaWZldGltZSBmcm9tIG1heC1hZ2U6ICVpJywKICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSkKCiAgICAgICAgIyBJZiB0aGVyZSBpc24ndCBhIG1heC1hZ2UsIGNoZWNrIGZvciBhbiBleHBpcmVzIGhlYWRlcgogICAgICAgIGVsaWYgJ2V4cGlyZXMnIGluIGhlYWRlcnM6CiAgICAgICAgICAgIGV4cGlyZXMgPSBwYXJzZWRhdGVfdHooaGVhZGVyc1snZXhwaXJlcyddKQogICAgICAgICAgICBpZiBleHBpcmVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZXhwaXJlX3RpbWUgPSBjYWxlbmRhci50aW1lZ20oZXhwaXJlcykgLSBkYXRlCiAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSBtYXgoMCwgZXhwaXJlX3RpbWUpCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIkZyZXNobmVzcyBsaWZldGltZSBmcm9tIGV4cGlyZXM6ICVpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUpCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIGFyZSBzZXR0aW5nIGZyZXNobmVzcyBsaW1pdCBpbiB0aGUKICAgICAgICAjIHJlcXVlc3QuIE5vdGUsIHRoaXMgb3ZlcnJpZGVzIHdoYXQgd2FzIGluIHRoZSByZXNwb25zZS4KICAgICAgICBpZiAnbWF4LWFnZScgaW4gY2M6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IGludChjY1snbWF4LWFnZSddKQogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGcmVzaG5lc3MgbGlmZXRpbWUgZnJvbSByZXF1ZXN0IG1heC1hZ2U6ICVpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lID0gMAoKICAgICAgICBpZiAnbWluLWZyZXNoJyBpbiBjYzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbWluX2ZyZXNoID0gaW50KGNjWydtaW4tZnJlc2gnXSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBtaW5fZnJlc2ggPSAwCiAgICAgICAgICAgICMgYWRqdXN0IG91ciBjdXJyZW50IGFnZSBieSBvdXIgbWluIGZyZXNoCiAgICAgICAgICAgIGN1cnJlbnRfYWdlICs9IG1pbl9mcmVzaAogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0FkanVzdGVkIGN1cnJlbnQgYWdlIGZyb20gbWluLWZyZXNoOiAlaScsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2FnZSkKCiAgICAgICAgIyBSZXR1cm4gZW50cnkgaWYgaXQgaXMgZnJlc2ggZW5vdWdoCiAgICAgICAgaWYgZnJlc2huZXNzX2xpZmV0aW1lID4gY3VycmVudF9hZ2U6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVGhlIHJlc3BvbnNlIGlzICJmcmVzaCIsIHJldHVybmluZyBjYWNoZWQgcmVzcG9uc2UnKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVpID4gJWknLCBmcmVzaG5lc3NfbGlmZXRpbWUsIGN1cnJlbnRfYWdlKQogICAgICAgICAgICByZXR1cm4gcmVzcAoKICAgICAgICAjIHdlJ3JlIG5vdCBmcmVzaC4gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBFdGFnLCBjbGVhciBpdCBvdXQKICAgICAgICBpZiAnZXRhZycgbm90IGluIGhlYWRlcnM6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdUaGUgY2FjaGVkIHJlc3BvbnNlIGlzICJzdGFsZSIgd2l0aCBubyBldGFnLCBwdXJnaW5nJwogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuY2FjaGUuZGVsZXRlKGNhY2hlX3VybCkKCiAgICAgICAgIyByZXR1cm4gdGhlIG9yaWdpbmFsIGhhbmRsZXIKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgY29uZGl0aW9uYWxfaGVhZGVycyhzZWxmLCByZXF1ZXN0KToKICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNhY2hlX3VybChyZXF1ZXN0LnVybCkKICAgICAgICByZXNwID0gc2VsZi5zZXJpYWxpemVyLmxvYWRzKHJlcXVlc3QsIHNlbGYuY2FjaGUuZ2V0KGNhY2hlX3VybCkpCiAgICAgICAgbmV3X2hlYWRlcnMgPSB7fQoKICAgICAgICBpZiByZXNwOgogICAgICAgICAgICBoZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChyZXNwLmhlYWRlcnMpCgogICAgICAgICAgICBpZiAnZXRhZycgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgIG5ld19oZWFkZXJzWydJZi1Ob25lLU1hdGNoJ10gPSBoZWFkZXJzWydFVGFnJ10KCiAgICAgICAgICAgIGlmICdsYXN0LW1vZGlmaWVkJyBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgbmV3X2hlYWRlcnNbJ0lmLU1vZGlmaWVkLVNpbmNlJ10gPSBoZWFkZXJzWydMYXN0LU1vZGlmaWVkJ10KCiAgICAgICAgcmV0dXJuIG5ld19oZWFkZXJzCgogICAgZGVmIGNhY2hlX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIHJlc3BvbnNlLCBib2R5PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEFsZ29yaXRobSBmb3IgY2FjaGluZyByZXF1ZXN0cy4KCiAgICAgICAgVGhpcyBhc3N1bWVzIGEgcmVxdWVzdHMgUmVzcG9uc2Ugb2JqZWN0LgogICAgICAgICIiIgogICAgICAgICMgRnJvbSBodHRwbGliMjogRG9uJ3QgY2FjaGUgMjA2J3Mgc2luY2Ugd2UgYXJlbid0IGdvaW5nIHRvCiAgICAgICAgIyAgICAgICAgICAgICAgICBoYW5kbGUgYnl0ZSByYW5nZSByZXF1ZXN0cwogICAgICAgIGNhY2hlYWJsZV9zdGF0dXNfY29kZXMgPSBbMjAwLCAyMDMsIDMwMCwgMzAxXQogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1cyBub3QgaW4gY2FjaGVhYmxlX3N0YXR1c19jb2RlczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1N0YXR1cyBjb2RlICVzIG5vdCBpbiAlcycsCiAgICAgICAgICAgICAgICByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBjYWNoZWFibGVfc3RhdHVzX2NvZGVzCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJlc3BvbnNlX2hlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KHJlc3BvbnNlLmhlYWRlcnMpCgogICAgICAgICMgSWYgd2UndmUgYmVlbiBnaXZlbiBhIGJvZHksIG91ciByZXNwb25zZSBoYXMgYSBDb250ZW50LUxlbmd0aCwgdGhhdAogICAgICAgICMgQ29udGVudC1MZW5ndGggaXMgdmFsaWQgdGhlbiB3ZSBjYW4gY2hlY2sgdG8gc2VlIGlmIHRoZSBib2R5IHdlJ3ZlCiAgICAgICAgIyBiZWVuIGdpdmVuIG1hdGNoZXMgdGhlIGV4cGVjdGVkIHNpemUsIGFuZCBpZiBpdCBkb2Vzbid0IHdlJ2xsIGp1c3QKICAgICAgICAjIHNraXAgdHJ5aW5nIHRvIGNhY2hlIGl0LgogICAgICAgIGlmIChib2R5IGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgICAgImNvbnRlbnQtbGVuZ3RoIiBpbiByZXNwb25zZV9oZWFkZXJzIGFuZAogICAgICAgICAgICAgICAgcmVzcG9uc2VfaGVhZGVyc1siY29udGVudC1sZW5ndGgiXS5pc2RpZ2l0KCkgYW5kCiAgICAgICAgICAgICAgICBpbnQocmVzcG9uc2VfaGVhZGVyc1siY29udGVudC1sZW5ndGgiXSkgIT0gbGVuKGJvZHkpKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGNjX3JlcSA9IHNlbGYucGFyc2VfY2FjaGVfY29udHJvbChyZXF1ZXN0LmhlYWRlcnMpCiAgICAgICAgY2MgPSBzZWxmLnBhcnNlX2NhY2hlX2NvbnRyb2wocmVzcG9uc2VfaGVhZGVycykKCiAgICAgICAgY2FjaGVfdXJsID0gc2VsZi5jYWNoZV91cmwocmVxdWVzdC51cmwpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdVcGRhdGluZyBjYWNoZSB3aXRoIHJlc3BvbnNlIGZyb20gIiVzIicsIGNhY2hlX3VybCkKCiAgICAgICAgIyBEZWxldGUgaXQgZnJvbSB0aGUgY2FjaGUgaWYgd2UgaGFwcGVuIHRvIGhhdmUgaXQgc3RvcmVkIHRoZXJlCiAgICAgICAgbm9fc3RvcmUgPSBGYWxzZQogICAgICAgIGlmIGNjLmdldCgnbm8tc3RvcmUnKToKICAgICAgICAgICAgbm9fc3RvcmUgPSBUcnVlCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVzcG9uc2UgaGVhZGVyIGhhcyAibm8tc3RvcmUiJykKICAgICAgICBpZiBjY19yZXEuZ2V0KCduby1zdG9yZScpOgogICAgICAgICAgICBub19zdG9yZSA9IFRydWUKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IGhlYWRlciBoYXMgIm5vLXN0b3JlIicpCiAgICAgICAgaWYgbm9fc3RvcmUgYW5kIHNlbGYuY2FjaGUuZ2V0KGNhY2hlX3VybCk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUHVyZ2luZyBleGlzdGluZyBjYWNoZSBlbnRyeSB0byBob25vciAibm8tc3RvcmUiJykKICAgICAgICAgICAgc2VsZi5jYWNoZS5kZWxldGUoY2FjaGVfdXJsKQoKICAgICAgICAjIElmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gZXRhZywgdGhlbiBrZWVwIHRoZSByZXNwb25zZQogICAgICAgIGlmIHNlbGYuY2FjaGVfZXRhZ3MgYW5kICdldGFnJyBpbiByZXNwb25zZV9oZWFkZXJzOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0NhY2hpbmcgZHVlIHRvIGV0YWcnKQogICAgICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgICAgIGNhY2hlX3VybCwKICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplci5kdW1wcyhyZXF1ZXN0LCByZXNwb25zZSwgYm9keT1ib2R5KSwKICAgICAgICAgICAgKQoKICAgICAgICAjIEFkZCB0byB0aGUgY2FjaGUgYW55IDMwMXMuIFdlIGRvIHRoaXMgYmVmb3JlIGxvb2tpbmcgdGhhdAogICAgICAgICMgdGhlIERhdGUgaGVhZGVycy4KICAgICAgICBlbGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAzMDE6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2FjaGluZyBwZXJtYW5hbnQgcmVkaXJlY3QnKQogICAgICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgICAgIGNhY2hlX3VybCwKICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplci5kdW1wcyhyZXF1ZXN0LCByZXNwb25zZSkKICAgICAgICAgICAgKQoKICAgICAgICAjIEFkZCB0byB0aGUgY2FjaGUgaWYgdGhlIHJlc3BvbnNlIGhlYWRlcnMgZGVtYW5kIGl0LiBJZiB0aGVyZQogICAgICAgICMgaXMgbm8gZGF0ZSBoZWFkZXIgdGhlbiB3ZSBjYW4ndCBkbyBhbnl0aGluZyBhYm91dCBleHBpcmluZwogICAgICAgICMgdGhlIGNhY2hlLgogICAgICAgIGVsaWYgJ2RhdGUnIGluIHJlc3BvbnNlX2hlYWRlcnM6CiAgICAgICAgICAgICMgY2FjaGUgd2hlbiB0aGVyZSBpcyBhIG1heC1hZ2UgPiAwCiAgICAgICAgICAgIGlmIGNjIGFuZCBjYy5nZXQoJ21heC1hZ2UnKToKICAgICAgICAgICAgICAgIGlmIGNjWydtYXgtYWdlJ10uaXNkaWdpdCgpIGFuZCBpbnQoY2NbJ21heC1hZ2UnXSkgPiAwOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2FjaGluZyBiL2MgZGF0ZSBleGlzdHMgYW5kIG1heC1hZ2UgPiAwJykKICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZXIuZHVtcHMocmVxdWVzdCwgcmVzcG9uc2UsIGJvZHk9Ym9keSksCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBJZiB0aGUgcmVxdWVzdCBjYW4gZXhwaXJlLCBpdCBtZWFucyB3ZSBzaG91bGQgY2FjaGUgaXQKICAgICAgICAgICAgIyBpbiB0aGUgbWVhbnRpbWUuCiAgICAgICAgICAgIGVsaWYgJ2V4cGlyZXMnIGluIHJlc3BvbnNlX2hlYWRlcnM6CiAgICAgICAgICAgICAgICBpZiByZXNwb25zZV9oZWFkZXJzWydleHBpcmVzJ106CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYWNoaW5nIGIvYyBvZiBleHBpcmVzIGhlYWRlcicpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jYWNoZS5zZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVyLmR1bXBzKHJlcXVlc3QsIHJlc3BvbnNlLCBib2R5PWJvZHkpLAogICAgICAgICAgICAgICAgICAgICkKCiAgICBkZWYgdXBkYXRlX2NhY2hlZF9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCByZXNwb25zZSk6CiAgICAgICAgIiIiT24gYSAzMDQgd2Ugd2lsbCBnZXQgYSBuZXcgc2V0IG9mIGhlYWRlcnMgdGhhdCB3ZSB3YW50IHRvCiAgICAgICAgdXBkYXRlIG91ciBjYWNoZWQgdmFsdWUgd2l0aCwgYXNzdW1pbmcgd2UgaGF2ZSBvbmUuCgogICAgICAgIFRoaXMgc2hvdWxkIG9ubHkgZXZlciBiZSBjYWxsZWQgd2hlbiB3ZSd2ZSBzZW50IGFuIEVUYWcgYW5kCiAgICAgICAgZ290dGVuIGEgMzA0IGFzIHRoZSByZXNwb25zZS4KICAgICAgICAiIiIKICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNhY2hlX3VybChyZXF1ZXN0LnVybCkKCiAgICAgICAgY2FjaGVkX3Jlc3BvbnNlID0gc2VsZi5zZXJpYWxpemVyLmxvYWRzKAogICAgICAgICAgICByZXF1ZXN0LAogICAgICAgICAgICBzZWxmLmNhY2hlLmdldChjYWNoZV91cmwpCiAgICAgICAgKQoKICAgICAgICBpZiBub3QgY2FjaGVkX3Jlc3BvbnNlOgogICAgICAgICAgICAjIHdlIGRpZG4ndCBoYXZlIGEgY2FjaGVkIHJlc3BvbnNlCiAgICAgICAgICAgIHJldHVybiByZXNwb25zZQoKICAgICAgICAjIExldHMgdXBkYXRlIG91ciBoZWFkZXJzIHdpdGggdGhlIGhlYWRlcnMgZnJvbSB0aGUgbmV3IHJlcXVlc3Q6CiAgICAgICAgIyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcDQtY29uZGl0aW9uYWwtMjYjc2VjdGlvbi00LjEKICAgICAgICAjCiAgICAgICAgIyBUaGUgc2VydmVyIGlzbid0IHN1cHBvc2VkIHRvIHNlbmQgaGVhZGVycyB0aGF0IHdvdWxkIG1ha2UKICAgICAgICAjIHRoZSBjYWNoZWQgYm9keSBpbnZhbGlkLiBCdXQuLi4ganVzdCBpbiBjYXNlLCB3ZSdsbCBiZSBzdXJlCiAgICAgICAgIyB0byBzdHJpcCBvdXQgb25lcyB3ZSBrbm93IHRoYXQgbWlnaHQgYmUgcHJvYmxtYXRpYyBkdWUgdG8KICAgICAgICAjIHR5cGljYWwgYXNzdW1wdGlvbnMuCiAgICAgICAgZXhjbHVkZWRfaGVhZGVycyA9IFsKICAgICAgICAgICAgImNvbnRlbnQtbGVuZ3RoIiwKICAgICAgICBdCgogICAgICAgIGNhY2hlZF9yZXNwb25zZS5oZWFkZXJzLnVwZGF0ZSgKICAgICAgICAgICAgZGljdCgoaywgdikgZm9yIGssIHYgaW4gcmVzcG9uc2UuaGVhZGVycy5pdGVtcygpCiAgICAgICAgICAgICAgICAgaWYgay5sb3dlcigpIG5vdCBpbiBleGNsdWRlZF9oZWFkZXJzKQogICAgICAgICkKCiAgICAgICAgIyB3ZSB3YW50IGEgMjAwIGIvYyB3ZSBoYXZlIGNvbnRlbnQgdmlhIHRoZSBjYWNoZQogICAgICAgIGNhY2hlZF9yZXNwb25zZS5zdGF0dXMgPSAyMDAKCiAgICAgICAgIyB1cGRhdGUgb3VyIGNhY2hlCiAgICAgICAgc2VsZi5jYWNoZS5zZXQoCiAgICAgICAgICAgIGNhY2hlX3VybCwKICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVyLmR1bXBzKHJlcXVlc3QsIGNhY2hlZF9yZXNwb25zZSksCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gY2FjaGVkX3Jlc3BvbnNlClBLAwQUAAAAAAAAACEAbCY0fOMJAADjCQAARAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2ZpbGV3cmFwcGVyLnB5ZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwoKCmNsYXNzIENhbGxiYWNrRmlsZVdyYXBwZXIob2JqZWN0KToKICAgICIiIgogICAgU21hbGwgd3JhcHBlciBhcm91bmQgYSBmcCBvYmplY3Qgd2hpY2ggd2lsbCB0ZWUgZXZlcnl0aGluZyByZWFkIGludG8gYQogICAgYnVmZmVyLCBhbmQgd2hlbiB0aGF0IGZpbGUgaXMgY2xvc2VkIGl0IHdpbGwgZXhlY3V0ZSBhIGNhbGxiYWNrIHdpdGggdGhlCiAgICBjb250ZW50cyBvZiB0aGF0IGJ1ZmZlci4KCiAgICBBbGwgYXR0cmlidXRlcyBhcmUgcHJveGllZCB0byB0aGUgdW5kZXJseWluZyBmaWxlIG9iamVjdC4KCiAgICBUaGlzIGNsYXNzIHVzZXMgbWVtYmVycyB3aXRoIGEgZG91YmxlIHVuZGVyc2NvcmUgKF9fKSBsZWFkaW5nIHByZWZpeCBzbyBhcwogICAgbm90IHRvIGFjY2lkZW50YWxseSBzaGFkb3cgYW4gYXR0cmlidXRlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwLCBjYWxsYmFjayk6CiAgICAgICAgc2VsZi5fX2J1ZiA9IEJ5dGVzSU8oKQogICAgICAgIHNlbGYuX19mcCA9IGZwCiAgICAgICAgc2VsZi5fX2NhbGxiYWNrID0gY2FsbGJhY2sKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgIyBUaGUgdmFndWFyaWVzIG9mIGdhcmJhZ2UgY29sbGVjdGlvbiBtZWFucyB0aGF0IHNlbGYuX19mcCBpcwogICAgICAgICMgbm90IGFsd2F5cyBzZXQuICBCeSB1c2luZyBfX2dldGF0dHJpYnV0ZV9fIGFuZCB0aGUgcHJpdmF0ZQogICAgICAgICMgbmFtZVswXSBhbGxvd3MgbG9va2luZyB1cCB0aGUgYXR0cmlidXRlIHZhbHVlIGFuZCByYWlzaW5nIGFuCiAgICAgICAgIyBBdHRyaWJ1dGVFcnJvciB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QuIFRoaXMgc3RvcCB0aGlnbnMgZnJvbQogICAgICAgICMgaW5maW5pdGVseSByZWN1cnNpbmcgY2FsbHMgdG8gZ2V0YXR0ciBpbiB0aGUgY2FzZSB3aGVyZQogICAgICAgICMgc2VsZi5fX2ZwIGhhc24ndCBiZWVuIHNldC4KICAgICAgICAjCiAgICAgICAgIyBbMF0gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9yZWZlcmVuY2UvZXhwcmVzc2lvbnMuaHRtbCNhdG9tLWlkZW50aWZpZXJzCiAgICAgICAgZnAgPSBzZWxmLl9fZ2V0YXR0cmlidXRlX18oJ19DYWxsYmFja0ZpbGVXcmFwcGVyX19mcCcpCiAgICAgICAgcmV0dXJuIGdldGF0dHIoZnAsIG5hbWUpCgogICAgZGVmIF9faXNfZnBfY2xvc2VkKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19mcC5mcCBpcyBOb25lCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19mcC5jbG9zZWQKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgIyBXZSBqdXN0IGRvbid0IGNhY2hlIGl0IHRoZW4uCiAgICAgICAgIyBUT0RPOiBBZGQgc29tZSBsb2dnaW5nIGhlcmUuLi4KICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX2Nsb3NlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX19jYWxsYmFjazoKICAgICAgICAgICAgc2VsZi5fX2NhbGxiYWNrKHNlbGYuX19idWYuZ2V0dmFsdWUoKSkKCiAgICAgICAgIyBXZSBhc3NpZ24gdGhpcyB0byBOb25lIGhlcmUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIGNhbiBnZXQgaW50bwogICAgICAgICMgcmVhbGx5IHRyaWNreSBwcm9ibGVtcyB3aGVyZSB0aGUgQ1B5dGhvbiBpbnRlcnByZXRlciBkZWFkIGxvY2tzCiAgICAgICAgIyBiZWNhdXNlIHRoZSBjYWxsYmFjayBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHNvbWV0aGluZyB3aGljaAogICAgICAgICMgaGFzIGEgX19kZWxfXyBtZXRob2QuIFNldHRpbmcgdGhpcyB0byBOb25lIGJyZWFrcyB0aGUgY3ljbGUKICAgICAgICAjIGFuZCBhbGxvd3MgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGRvIGl0J3MgdGhpbmcgbm9ybWFsbHkuCiAgICAgICAgc2VsZi5fX2NhbGxiYWNrID0gTm9uZQoKICAgIGRlZiByZWFkKHNlbGYsIGFtdD1Ob25lKToKICAgICAgICBkYXRhID0gc2VsZi5fX2ZwLnJlYWQoYW10KQogICAgICAgIHNlbGYuX19idWYud3JpdGUoZGF0YSkKICAgICAgICBpZiBzZWxmLl9faXNfZnBfY2xvc2VkKCk6CiAgICAgICAgICAgIHNlbGYuX2Nsb3NlKCkKCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgX3NhZmVfcmVhZChzZWxmLCBhbXQpOgogICAgICAgIGRhdGEgPSBzZWxmLl9fZnAuX3NhZmVfcmVhZChhbXQpCiAgICAgICAgaWYgYW10ID09IDIgYW5kIGRhdGEgPT0gYidcclxuJzoKICAgICAgICAgICAgIyB1cmxsaWIgZXhlY3V0ZXMgdGhpcyByZWFkIHRvIHRvc3MgdGhlIENSTEYgYXQgdGhlIGVuZAogICAgICAgICAgICAjIG9mIHRoZSBjaHVuay4KICAgICAgICAgICAgcmV0dXJuIGRhdGEKCiAgICAgICAgc2VsZi5fX2J1Zi53cml0ZShkYXRhKQogICAgICAgIGlmIHNlbGYuX19pc19mcF9jbG9zZWQoKToKICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQoKICAgICAgICByZXR1cm4gZGF0YQpQSwMEFAAAAAAAAAAhAA5UHvwtEAAALRAAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9oZXVyaXN0aWNzLnB5aW1wb3J0IGNhbGVuZGFyCmltcG9ydCB0aW1lCgpmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBmb3JtYXRkYXRlLCBwYXJzZWRhdGUsIHBhcnNlZGF0ZV90egoKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUsIHRpbWVkZWx0YQoKVElNRV9GTVQgPSAiJWEsICVkICViICVZICVIOiVNOiVTIEdNVCIKCgpkZWYgZXhwaXJlX2FmdGVyKGRlbHRhLCBkYXRlPU5vbmUpOgogICAgZGF0ZSA9IGRhdGUgb3IgZGF0ZXRpbWUubm93KCkKICAgIHJldHVybiBkYXRlICsgZGVsdGEKCgpkZWYgZGF0ZXRpbWVfdG9faGVhZGVyKGR0KToKICAgIHJldHVybiBmb3JtYXRkYXRlKGNhbGVuZGFyLnRpbWVnbShkdC50aW1ldHVwbGUoKSkpCgoKY2xhc3MgQmFzZUhldXJpc3RpYyhvYmplY3QpOgoKICAgIGRlZiB3YXJuaW5nKHNlbGYsIHJlc3BvbnNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSB2YWxpZCAxeHggd2FybmluZyBoZWFkZXIgdmFsdWUgZGVzY3JpYmluZyB0aGUgY2FjaGUKICAgICAgICBhZGp1c3RtZW50cy4KCiAgICAgICAgVGhlIHJlc3BvbnNlIGlzIHByb3ZpZGVkIHRvbyBhbGxvdyB3YXJuaW5ncyBsaWtlIDExMwogICAgICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzQjc2VjdGlvbi01LjUuNCB3aGVyZSB3ZSBuZWVkCiAgICAgICAgdG8gZXhwbGljaXRseSBzYXkgcmVzcG9uc2UgaXMgb3ZlciAyNCBob3VycyBvbGQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICcxMTAgLSAiUmVzcG9uc2UgaXMgU3RhbGUiJwoKICAgIGRlZiB1cGRhdGVfaGVhZGVycyhzZWxmLCByZXNwb25zZSk6CiAgICAgICAgIiIiVXBkYXRlIHRoZSByZXNwb25zZSBoZWFkZXJzIHdpdGggYW55IG5ldyBoZWFkZXJzLgoKICAgICAgICBOT1RFOiBUaGlzIFNIT1VMRCBhbHdheXMgaW5jbHVkZSBzb21lIFdhcm5pbmcgaGVhZGVyIHRvCiAgICAgICAgICAgICAgc2lnbmlmeSB0aGF0IHRoZSByZXNwb25zZSB3YXMgY2FjaGVkIGJ5IHRoZSBjbGllbnQsIG5vdAogICAgICAgICAgICAgIGJ5IHdheSBvZiB0aGUgcHJvdmlkZWQgaGVhZGVycy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4ge30KCiAgICBkZWYgYXBwbHkoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgIHVwZGF0ZWRfaGVhZGVycyA9IHNlbGYudXBkYXRlX2hlYWRlcnMocmVzcG9uc2UpCgogICAgICAgIGlmIHVwZGF0ZWRfaGVhZGVyczoKICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy51cGRhdGUodXBkYXRlZF9oZWFkZXJzKQogICAgICAgICAgICB3YXJuaW5nX2hlYWRlcl92YWx1ZSA9IHNlbGYud2FybmluZyhyZXNwb25zZSkKICAgICAgICAgICAgaWYgd2FybmluZ19oZWFkZXJfdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLnVwZGF0ZSh7J1dhcm5pbmcnOiB3YXJuaW5nX2hlYWRlcl92YWx1ZX0pCgogICAgICAgIHJldHVybiByZXNwb25zZQoKCmNsYXNzIE9uZURheUNhY2hlKEJhc2VIZXVyaXN0aWMpOgogICAgIiIiCiAgICBDYWNoZSB0aGUgcmVzcG9uc2UgYnkgcHJvdmlkaW5nIGFuIGV4cGlyZXMgMSBkYXkgaW4gdGhlCiAgICBmdXR1cmUuCiAgICAiIiIKICAgIGRlZiB1cGRhdGVfaGVhZGVycyhzZWxmLCByZXNwb25zZSk6CiAgICAgICAgaGVhZGVycyA9IHt9CgogICAgICAgIGlmICdleHBpcmVzJyBub3QgaW4gcmVzcG9uc2UuaGVhZGVyczoKICAgICAgICAgICAgZGF0ZSA9IHBhcnNlZGF0ZShyZXNwb25zZS5oZWFkZXJzWydkYXRlJ10pCiAgICAgICAgICAgIGV4cGlyZXMgPSBleHBpcmVfYWZ0ZXIodGltZWRlbHRhKGRheXM9MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1kYXRldGltZSgqZGF0ZVs6Nl0pKQogICAgICAgICAgICBoZWFkZXJzWydleHBpcmVzJ10gPSBkYXRldGltZV90b19oZWFkZXIoZXhwaXJlcykKICAgICAgICAgICAgaGVhZGVyc1snY2FjaGUtY29udHJvbCddID0gJ3B1YmxpYycKICAgICAgICByZXR1cm4gaGVhZGVycwoKCmNsYXNzIEV4cGlyZXNBZnRlcihCYXNlSGV1cmlzdGljKToKICAgICIiIgogICAgQ2FjaGUgKiphbGwqKiByZXF1ZXN0cyBmb3IgYSBkZWZpbmVkIHRpbWUgcGVyaW9kLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3cpOgogICAgICAgIHNlbGYuZGVsdGEgPSB0aW1lZGVsdGEoKiprdykKCiAgICBkZWYgdXBkYXRlX2hlYWRlcnMoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgIGV4cGlyZXMgPSBleHBpcmVfYWZ0ZXIoc2VsZi5kZWx0YSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnZXhwaXJlcyc6IGRhdGV0aW1lX3RvX2hlYWRlcihleHBpcmVzKSwKICAgICAgICAgICAgJ2NhY2hlLWNvbnRyb2wnOiAncHVibGljJywKICAgICAgICB9CgogICAgZGVmIHdhcm5pbmcoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgIHRtcGwgPSAnMTEwIC0gQXV0b21hdGljYWxseSBjYWNoZWQgZm9yICVzLiBSZXNwb25zZSBtaWdodCBiZSBzdGFsZScKICAgICAgICByZXR1cm4gdG1wbCAlIHNlbGYuZGVsdGEKCgpjbGFzcyBMYXN0TW9kaWZpZWQoQmFzZUhldXJpc3RpYyk6CiAgICAiIiIKICAgIElmIHRoZXJlIGlzIG5vIEV4cGlyZXMgaGVhZGVyIGFscmVhZHksIGZhbGwgYmFjayBvbiBMYXN0LU1vZGlmaWVkCiAgICB1c2luZyB0aGUgaGV1cmlzdGljIGZyb20KICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzQjc2VjdGlvbi00LjIuMgogICAgdG8gY2FsY3VsYXRlIGEgcmVhc29uYWJsZSB2YWx1ZS4KCiAgICBGaXJlZm94IGFsc28gZG9lcyBzb21ldGhpbmcgbGlrZSB0aGlzIHBlcgogICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9DYWNoaW5nX0ZBUQogICAgaHR0cDovL2x4ci5tb3ppbGxhLm9yZy9tb3ppbGxhLXJlbGVhc2Uvc291cmNlL25ldHdlcmsvcHJvdG9jb2wvaHR0cC9uc0h0dHBSZXNwb25zZUhlYWQuY3BwIzM5NwogICAgVW5saWtlIG1vemlsbGEgd2UgbGltaXQgdGhpcyB0byAyNC1oci4KICAgICIiIgogICAgY2FjaGVhYmxlX2J5X2RlZmF1bHRfc3RhdHVzZXMgPSBzZXQoWwogICAgICAgIDIwMCwgMjAzLCAyMDQsIDIwNiwgMzAwLCAzMDEsIDQwNCwgNDA1LCA0MTAsIDQxNCwgNTAxCiAgICBdKQoKICAgIGRlZiB1cGRhdGVfaGVhZGVycyhzZWxmLCByZXNwKToKICAgICAgICBoZWFkZXJzID0gcmVzcC5oZWFkZXJzCgogICAgICAgIGlmICdleHBpcmVzJyBpbiBoZWFkZXJzOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgaWYgJ2NhY2hlLWNvbnRyb2wnIGluIGhlYWRlcnMgYW5kIGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSAhPSAncHVibGljJzoKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIGlmIHJlc3Auc3RhdHVzIG5vdCBpbiBzZWxmLmNhY2hlYWJsZV9ieV9kZWZhdWx0X3N0YXR1c2VzOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgaWYgJ2RhdGUnIG5vdCBpbiBoZWFkZXJzIG9yICdsYXN0LW1vZGlmaWVkJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIGRhdGUgPSBjYWxlbmRhci50aW1lZ20ocGFyc2VkYXRlX3R6KGhlYWRlcnNbJ2RhdGUnXSkpCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IHBhcnNlZGF0ZShoZWFkZXJzWydsYXN0LW1vZGlmaWVkJ10pCiAgICAgICAgaWYgZGF0ZSBpcyBOb25lIG9yIGxhc3RfbW9kaWZpZWQgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgY3VycmVudF9hZ2UgPSBtYXgoMCwgbm93IC0gZGF0ZSkKICAgICAgICBkZWx0YSA9IGRhdGUgLSBjYWxlbmRhci50aW1lZ20obGFzdF9tb2RpZmllZCkKICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSBtYXgoMCwgbWluKGRlbHRhIC8gMTAsIDI0ICogMzYwMCkpCiAgICAgICAgaWYgZnJlc2huZXNzX2xpZmV0aW1lIDw9IGN1cnJlbnRfYWdlOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgZXhwaXJlcyA9IGRhdGUgKyBmcmVzaG5lc3NfbGlmZXRpbWUKICAgICAgICByZXR1cm4geydleHBpcmVzJzogdGltZS5zdHJmdGltZShUSU1FX0ZNVCwgdGltZS5nbXRpbWUoZXhwaXJlcykpfQoKICAgIGRlZiB3YXJuaW5nKHNlbGYsIHJlc3ApOgogICAgICAgIHJldHVybiBOb25lClBLAwQUAAAAAAAAACEAEmGAuIgZAACIGQAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3NlcmlhbGl6ZS5weWltcG9ydCBiYXNlNjQKaW1wb3J0IGlvCmltcG9ydCBqc29uCmltcG9ydCB6bGliCgpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKCmZyb20gLmNvbXBhdCBpbXBvcnQgSFRUUFJlc3BvbnNlLCBwaWNrbGUsIHRleHRfdHlwZQoKCmRlZiBfYjY0X2VuY29kZV9ieXRlcyhiKToKICAgIHJldHVybiBiYXNlNjQuYjY0ZW5jb2RlKGIpLmRlY29kZSgiYXNjaWkiKQoKCmRlZiBfYjY0X2VuY29kZV9zdHIocyk6CiAgICByZXR1cm4gX2I2NF9lbmNvZGVfYnl0ZXMocy5lbmNvZGUoInV0ZjgiKSkKCgpkZWYgX2I2NF9lbmNvZGUocyk6CiAgICBpZiBpc2luc3RhbmNlKHMsIHRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIF9iNjRfZW5jb2RlX3N0cihzKQogICAgcmV0dXJuIF9iNjRfZW5jb2RlX2J5dGVzKHMpCgoKZGVmIF9iNjRfZGVjb2RlX2J5dGVzKGIpOgogICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoYi5lbmNvZGUoImFzY2lpIikpCgoKZGVmIF9iNjRfZGVjb2RlX3N0cihzKToKICAgIHJldHVybiBfYjY0X2RlY29kZV9ieXRlcyhzKS5kZWNvZGUoInV0ZjgiKQoKCmNsYXNzIFNlcmlhbGl6ZXIob2JqZWN0KToKCiAgICBkZWYgZHVtcHMoc2VsZiwgcmVxdWVzdCwgcmVzcG9uc2UsIGJvZHk9Tm9uZSk6CiAgICAgICAgcmVzcG9uc2VfaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QocmVzcG9uc2UuaGVhZGVycykKCiAgICAgICAgaWYgYm9keSBpcyBOb25lOgogICAgICAgICAgICBib2R5ID0gcmVzcG9uc2UucmVhZChkZWNvZGVfY29udGVudD1GYWxzZSkKCiAgICAgICAgICAgICMgTk9URTogOTklIHN1cmUgdGhpcyBpcyBkZWFkIGNvZGUuIEknbSBvbmx5IGxlYXZpbmcgaXQKICAgICAgICAgICAgIyAgICAgICBoZXJlIGIvYyBJIGRvbid0IGhhdmUgYSB0ZXN0IHlldCB0byBwcm92ZQogICAgICAgICAgICAjICAgICAgIGl0LiBCYXNpY2FsbHksIGJlZm9yZSB1c2luZwogICAgICAgICAgICAjICAgICAgIGBjYWNoZWNvbnRyb2wuZmlsZXdyYXBwZXIuQ2FsbGJhY2tGaWxlV3JhcHBlcmAsCiAgICAgICAgICAgICMgICAgICAgdGhpcyBtYWRlIGFuIGVmZm9ydCB0byByZXNldCB0aGUgZmlsZSBoYW5kbGUuIFRoZQogICAgICAgICAgICAjICAgICAgIGBDYWxsYmFja0ZpbGVXcmFwcGVyYCBzaG9ydCBjaXJjdWl0cyB0aGlzIGNvZGUgYnkKICAgICAgICAgICAgIyAgICAgICBzZXR0aW5nIHRoZSBib2R5IGFzIHRoZSBjb250ZW50IGlzIGNvbnN1bWVkLCB0aGUKICAgICAgICAgICAgIyAgICAgICByZXN1bHQgYmVpbmcgYSBgYm9keWAgYXJndW1lbnQgaXMgKmFsd2F5cyogcGFzc2VkCiAgICAgICAgICAgICMgICAgICAgaW50byBjYWNoZV9yZXNwb25zZSwgYW5kIGluIHR1cm4sCiAgICAgICAgICAgICMgICAgICAgYFNlcmlhbGl6ZXIuZHVtcGAuCiAgICAgICAgICAgIHJlc3BvbnNlLl9mcCA9IGlvLkJ5dGVzSU8oYm9keSkKCiAgICAgICAgZGF0YSA9IHsKICAgICAgICAgICAgInJlc3BvbnNlIjogewogICAgICAgICAgICAgICAgImJvZHkiOiBfYjY0X2VuY29kZV9ieXRlcyhib2R5KSwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjogZGljdCgKICAgICAgICAgICAgICAgICAgICAoX2I2NF9lbmNvZGUoayksIF9iNjRfZW5jb2RlKHYpKQogICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIHJlc3BvbnNlLmhlYWRlcnMuaXRlbXMoKQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6IHJlc3BvbnNlLnZlcnNpb24sCiAgICAgICAgICAgICAgICAicmVhc29uIjogX2I2NF9lbmNvZGVfc3RyKHJlc3BvbnNlLnJlYXNvbiksCiAgICAgICAgICAgICAgICAic3RyaWN0IjogcmVzcG9uc2Uuc3RyaWN0LAogICAgICAgICAgICAgICAgImRlY29kZV9jb250ZW50IjogcmVzcG9uc2UuZGVjb2RlX2NvbnRlbnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfQoKICAgICAgICAjIENvbnN0cnVjdCBvdXIgdmFyeSBoZWFkZXJzCiAgICAgICAgZGF0YVsidmFyeSJdID0ge30KICAgICAgICBpZiAidmFyeSIgaW4gcmVzcG9uc2VfaGVhZGVyczoKICAgICAgICAgICAgdmFyaWVkX2hlYWRlcnMgPSByZXNwb25zZV9oZWFkZXJzWyd2YXJ5J10uc3BsaXQoJywnKQogICAgICAgICAgICBmb3IgaGVhZGVyIGluIHZhcmllZF9oZWFkZXJzOgogICAgICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVyLnN0cmlwKCkKICAgICAgICAgICAgICAgIGRhdGFbInZhcnkiXVtoZWFkZXJdID0gcmVxdWVzdC5oZWFkZXJzLmdldChoZWFkZXIsIE5vbmUpCgogICAgICAgICMgRW5jb2RlIG91ciBWYXJ5IGhlYWRlcnMgdG8gZW5zdXJlIHRoZXkgY2FuIGJlIHNlcmlhbGl6ZWQgYXMgSlNPTgogICAgICAgIGRhdGFbInZhcnkiXSA9IGRpY3QoCiAgICAgICAgICAgIChfYjY0X2VuY29kZShrKSwgX2I2NF9lbmNvZGUodikgaWYgdiBpcyBub3QgTm9uZSBlbHNlIHYpCiAgICAgICAgICAgIGZvciBrLCB2IGluIGRhdGFbInZhcnkiXS5pdGVtcygpCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gYiIsIi5qb2luKFsKICAgICAgICAgICAgYiJjYz0yIiwKICAgICAgICAgICAgemxpYi5jb21wcmVzcygKICAgICAgICAgICAgICAgIGpzb24uZHVtcHMoCiAgICAgICAgICAgICAgICAgICAgZGF0YSwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpLCBzb3J0X2tleXM9VHJ1ZSwKICAgICAgICAgICAgICAgICkuZW5jb2RlKCJ1dGY4IiksCiAgICAgICAgICAgICksCiAgICAgICAgXSkKCiAgICBkZWYgbG9hZHMoc2VsZiwgcmVxdWVzdCwgZGF0YSk6CiAgICAgICAgIyBTaG9ydCBjaXJjdWl0IGlmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gZW1wdHkgc2V0IG9mIGRhdGEKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgRGV0ZXJtaW5lIHdoYXQgdmVyc2lvbiBvZiB0aGUgc2VyaWFsaXplciB0aGUgZGF0YSB3YXMgc2VyaWFsaXplZAogICAgICAgICMgd2l0aAogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyLCBkYXRhID0gZGF0YS5zcGxpdChiIiwiLCAxKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICB2ZXIgPSBiImNjPTAiCgogICAgICAgICMgTWFrZSBzdXJlIHRoYXQgb3VyICJ2ZXIiIGlzIGFjdHVhbGx5IGEgdmVyc2lvbiBhbmQgaXNuJ3QgYSBmYWxzZQogICAgICAgICMgcG9zaXRpdmUgZnJvbSBhICwgYmVpbmcgaW4gdGhlIGRhdGEgc3RyZWFtLgogICAgICAgIGlmIHZlcls6M10gIT0gYiJjYz0iOgogICAgICAgICAgICBkYXRhID0gdmVyICsgZGF0YQogICAgICAgICAgICB2ZXIgPSBiImNjPTAiCgogICAgICAgICMgR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvdXQgb2YgdGhlIGNjPU4KICAgICAgICB2ZXIgPSB2ZXIuc3BsaXQoYiI9IiwgMSlbLTFdLmRlY29kZSgiYXNjaWkiKQoKICAgICAgICAjIERpc3BhdGNoIHRvIHRoZSBhY3R1YWwgbG9hZCBtZXRob2QgZm9yIHRoZSBnaXZlbiB2ZXJzaW9uCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAiX2xvYWRzX3Z7MH0iLmZvcm1hdCh2ZXIpKShyZXF1ZXN0LCBkYXRhKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBUaGlzIGlzIGEgdmVyc2lvbiB3ZSBkb24ndCBoYXZlIGEgbG9hZHMgZnVuY3Rpb24gZm9yLCBzbyB3ZSdsbAogICAgICAgICAgICAjIGp1c3QgdHJlYXQgaXQgYXMgYSBtaXNzIGFuZCByZXR1cm4gTm9uZQogICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgcHJlcGFyZV9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCBjYWNoZWQpOgogICAgICAgICIiIlZlcmlmeSBvdXIgdmFyeSBoZWFkZXJzIG1hdGNoIGFuZCBjb25zdHJ1Y3QgYSByZWFsIHVybGxpYjMKICAgICAgICBIVFRQUmVzcG9uc2Ugb2JqZWN0LgogICAgICAgICIiIgogICAgICAgICMgU3BlY2lhbCBjYXNlIHRoZSAnKicgVmFyeSB2YWx1ZSBhcyBpdCBtZWFucyB3ZSBjYW5ub3QgYWN0dWFsbHkKICAgICAgICAjIGRldGVybWluZSBpZiB0aGUgY2FjaGVkIHJlc3BvbnNlIGlzIHN1aXRhYmxlIGZvciB0aGlzIHJlcXVlc3QuCiAgICAgICAgaWYgIioiIGluIGNhY2hlZC5nZXQoInZhcnkiLCB7fSk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBWYXJ5IGhlYWRlcnMgZm9yIHRoZSBjYWNoZWQgcmVzcG9uc2UgbWF0Y2ggb3VyCiAgICAgICAgIyByZXF1ZXN0CiAgICAgICAgZm9yIGhlYWRlciwgdmFsdWUgaW4gY2FjaGVkLmdldCgidmFyeSIsIHt9KS5pdGVtcygpOgogICAgICAgICAgICBpZiByZXF1ZXN0LmhlYWRlcnMuZ2V0KGhlYWRlciwgTm9uZSkgIT0gdmFsdWU6CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYm9keV9yYXcgPSBjYWNoZWRbInJlc3BvbnNlIl0ucG9wKCJib2R5IikKCiAgICAgICAgaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QoZGF0YT1jYWNoZWRbJ3Jlc3BvbnNlJ11bJ2hlYWRlcnMnXSkKICAgICAgICBpZiBoZWFkZXJzLmdldCgndHJhbnNmZXItZW5jb2RpbmcnLCAnJykgPT0gJ2NodW5rZWQnOgogICAgICAgICAgICBoZWFkZXJzLnBvcCgndHJhbnNmZXItZW5jb2RpbmcnKQoKICAgICAgICBjYWNoZWRbJ3Jlc3BvbnNlJ11bJ2hlYWRlcnMnXSA9IGhlYWRlcnMKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBib2R5ID0gaW8uQnl0ZXNJTyhib2R5X3JhdykKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAjIFRoaXMgY2FuIGhhcHBlbiBpZiBjYWNoZWNvbnRyb2wgc2VyaWFsaXplZCB0byB2MSBmb3JtYXQgKHBpY2tsZSkKICAgICAgICAgICAgIyB1c2luZyBQeXRob24gMi4gQSBQeXRob24gMiBzdHIoYnl0ZSBzdHJpbmcpIHdpbGwgYmUgdW5waWNrbGVkIGFzCiAgICAgICAgICAgICMgYSBQeXRob24gMyBzdHIgKHVuaWNvZGUgc3RyaW5nKSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgYWJvdmUgdG8KICAgICAgICAgICAgIyBmYWlsIHdpdGg6CiAgICAgICAgICAgICMKICAgICAgICAgICAgIyAgICAgVHlwZUVycm9yOiAnc3RyJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlCiAgICAgICAgICAgIGJvZHkgPSBpby5CeXRlc0lPKGJvZHlfcmF3LmVuY29kZSgndXRmOCcpKQoKICAgICAgICByZXR1cm4gSFRUUFJlc3BvbnNlKAogICAgICAgICAgICBib2R5PWJvZHksCiAgICAgICAgICAgIHByZWxvYWRfY29udGVudD1GYWxzZSwKICAgICAgICAgICAgKipjYWNoZWRbInJlc3BvbnNlIl0KICAgICAgICApCgogICAgZGVmIF9sb2Fkc192MChzZWxmLCByZXF1ZXN0LCBkYXRhKToKICAgICAgICAjIFRoZSBvcmlnaW5hbCBsZWdhY3kgY2FjaGUgZGF0YS4gVGhpcyBkb2Vzbid0IGNvbnRhaW4gZW5vdWdoCiAgICAgICAgIyBpbmZvcm1hdGlvbiB0byBjb25zdHJ1Y3QgZXZlcnl0aGluZyB3ZSBuZWVkLCBzbyB3ZSdsbCB0cmVhdCB0aGlzIGFzCiAgICAgICAgIyBhIG1pc3MuCiAgICAgICAgcmV0dXJuCgogICAgZGVmIF9sb2Fkc192MShzZWxmLCByZXF1ZXN0LCBkYXRhKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhY2hlZCA9IHBpY2tsZS5sb2FkcyhkYXRhKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmV0dXJuIHNlbGYucHJlcGFyZV9yZXNwb25zZShyZXF1ZXN0LCBjYWNoZWQpCgogICAgZGVmIF9sb2Fkc192MihzZWxmLCByZXF1ZXN0LCBkYXRhKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhY2hlZCA9IGpzb24ubG9hZHMoemxpYi5kZWNvbXByZXNzKGRhdGEpLmRlY29kZSgidXRmOCIpKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBXZSBuZWVkIHRvIGRlY29kZSB0aGUgaXRlbXMgdGhhdCB3ZSd2ZSBiYXNlNjQgZW5jb2RlZAogICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsiYm9keSJdID0gX2I2NF9kZWNvZGVfYnl0ZXMoCiAgICAgICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsiYm9keSJdCiAgICAgICAgKQogICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsiaGVhZGVycyJdID0gZGljdCgKICAgICAgICAgICAgKF9iNjRfZGVjb2RlX3N0cihrKSwgX2I2NF9kZWNvZGVfc3RyKHYpKQogICAgICAgICAgICBmb3IgaywgdiBpbiBjYWNoZWRbInJlc3BvbnNlIl1bImhlYWRlcnMiXS5pdGVtcygpCiAgICAgICAgKQogICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsicmVhc29uIl0gPSBfYjY0X2RlY29kZV9zdHIoCiAgICAgICAgICAgIGNhY2hlZFsicmVzcG9uc2UiXVsicmVhc29uIl0sCiAgICAgICAgKQogICAgICAgIGNhY2hlZFsidmFyeSJdID0gZGljdCgKICAgICAgICAgICAgKF9iNjRfZGVjb2RlX3N0cihrKSwgX2I2NF9kZWNvZGVfc3RyKHYpIGlmIHYgaXMgbm90IE5vbmUgZWxzZSB2KQogICAgICAgICAgICBmb3IgaywgdiBpbiBjYWNoZWRbInZhcnkiXS5pdGVtcygpCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gc2VsZi5wcmVwYXJlX3Jlc3BvbnNlKHJlcXVlc3QsIGNhY2hlZCkKUEsDBBQAAAAAAAAAIQCLe8VC8gEAAPIBAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvd3JhcHBlci5weWZyb20gLmFkYXB0ZXIgaW1wb3J0IENhY2hlQ29udHJvbEFkYXB0ZXIKZnJvbSAuY2FjaGUgaW1wb3J0IERpY3RDYWNoZQoKCmRlZiBDYWNoZUNvbnRyb2woc2VzcywKICAgICAgICAgICAgICAgICBjYWNoZT1Ob25lLAogICAgICAgICAgICAgICAgIGNhY2hlX2V0YWdzPVRydWUsCiAgICAgICAgICAgICAgICAgc2VyaWFsaXplcj1Ob25lLAogICAgICAgICAgICAgICAgIGhldXJpc3RpYz1Ob25lKToKCiAgICBjYWNoZSA9IGNhY2hlIG9yIERpY3RDYWNoZSgpCiAgICBhZGFwdGVyID0gQ2FjaGVDb250cm9sQWRhcHRlcigKICAgICAgICBjYWNoZSwKICAgICAgICBjYWNoZV9ldGFncz1jYWNoZV9ldGFncywKICAgICAgICBzZXJpYWxpemVyPXNlcmlhbGl6ZXIsCiAgICAgICAgaGV1cmlzdGljPWhldXJpc3RpYywKICAgICkKICAgIHNlc3MubW91bnQoJ2h0dHA6Ly8nLCBhZGFwdGVyKQogICAgc2Vzcy5tb3VudCgnaHR0cHM6Ly8nLCBhZGFwdGVyKQoKICAgIHJldHVybiBzZXNzClBLAwQUAAAAAAAAACEAFHAFRz8AAAA/AAAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9fX2luaXRfXy5weWZyb20gLmNvcmUgaW1wb3J0IHdoZXJlLCBvbGRfd2hlcmUKCl9fdmVyc2lvbl9fID0gIjIwMTguMDEuMTgiClBLAwQUAAAAAAAAACEAgyvawSkAAAApAAAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9fX21haW5fXy5weWZyb20gY2VydGlmaSBpbXBvcnQgd2hlcmUKcHJpbnQod2hlcmUoKSkKUEsDBBQAAAAAAAAAIQAFodr18CIEAPAiBAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL2NhY2VydC5wZW0KIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gUm9vdCBDQSBPPUdsb2JhbFNpZ24gbnYtc2EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gUm9vdCBDQSBPPUdsb2JhbFNpZ24gbnYtc2EgT1U9Um9vdCBDQQojIExhYmVsOiAiR2xvYmFsU2lnbiBSb290IENBIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTcwNzY2OTAwNTIwNAojIE1ENSBGaW5nZXJwcmludDogM2U6NDU6NTI6MTU6MDk6NTE6OTI6ZTE6Yjc6NWQ6Mzc6OWY6YjE6ODc6Mjk6OGEKIyBTSEExIEZpbmdlcnByaW50OiBiMTpiYzo5Njo4YjpkNDpmNDo5ZDo2MjoyYTphODo5YTo4MTpmMjoxNTowMTo1MjphNDoxZDo4Mjo5YwojIFNIQTI1NiBGaW5nZXJwcmludDogZWI6ZDQ6MTA6NDA6ZTQ6YmI6M2U6Yzc6NDI6Yzk6ZTM6ODE6ZDM6MWU6ZjI6YTQ6MWE6NDg6YjY6Njg6NWM6OTY6ZTc6Y2U6ZjM6YzE6ZGY6NmM6ZDQ6MzM6MWM6OTkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkVENDQWwyZ0F3SUJBZ0lMQkFBQUFBQUJGVXRhdzVRd0RRWUpLb1pJaHZjTkFRRUZCUUF3VnpFTE1Ba0cKQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgpiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHNiMkpoYkZOcFoyNGdVbTl2ZENCRFFUQWVGdzA1T0RBNU1ERXhNakF3Ck1EQmFGdzB5T0RBeE1qZ3hNakF3TURCYU1GY3hDekFKQmdOVkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWkKWVd4VGFXZHVJRzUyTFhOaE1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEVlFRREV4SkhiRzlpWVd4VAphV2R1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGFEdWFaCmpjNmo0MCtLZnZ2eGk0TWxhK3BJSC9FcXNMbVZFUVM5OEdQUjRtZG16eHpkenh0SUsrNk5pWTZhcnltQVphdnAKeHkwU3k2c2NUSEFIb1QwS01NMFZqVS80M2RTTVVCVWM3MUR1eEM3My9PbFM4cEY5NEczVk5UQ09Ya056OGtIcAoxV3Jqc29rNlZqazRid1k4aUdsYktrM0ZwMVM0YkluTW0vazh5dVg5aWZVU1BKSjRsdGJjZEc2VFJHSFJqY2RHCnNuVU9odWdaaXRWdGJOVjRGcFdpNmNnS09PdnlKQk5QYzFTVEU0VTZHN3dlTkxXTEJZeTVkNHV4Mng4Z2thc0oKVTI2UXpuczNkTGx3UjVFaVVXTVdlYTZ4cmtFbUNNZ1pLOUZHcWtqV1pDclhnelQvTENyQmJCbERTZ2VGNTlOOAo5aUZvNytyeVVwOS9rNURQQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFCkJUQURBUUgvTUIwR0ExVWREZ1FXQkJSZ2UyWWFSUTJYeW9sUUwzMEV6VFNvLy96OVN6QU5CZ2txaGtpRzl3MEIKQVFVRkFBT0NBUUVBMW5QbmZFOTIwSTIvN0xxaXZqVEZLREsxZlB4c25Dd3J2UW1lVTc5clhxb1JTTGJsQ0tPegp5ajFoVGROR0NiTSt3NkRqWTFVYjhycnZyVG5oUTdrNG8rWXZpaVk3NzZCUVZ2bkdDdjA0emNRTGNGR1VsNWdFCjM4TmZsTlVWeVJSQm5NUmRkV1FWRGY5Vk1PeUdqLzhON3l5NVkwYjJxdnpmdkduOUxoSklaSnJnbGZDbTd5bVAKQWJFVnRRd2RwZjVwTEdra2VCNnpweHh4WXU3S3lKZXNGMTJLd3ZoSGhtNHF4Rll4bGRCbmlZVXIrV3ltWFVhZApES3FDNUpsUjNYQzMyMVk5WWVScTRWelc5djQ5M2tITUI2NWpVcjlUVS9RcjZjZjl0dmVDWDRYU1FSamJnYk1FCkhNVWZwSUJ2RlNESjNneUlDaDNXWmxYaS9FakpLU1pwNEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjIKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMgojIExhYmVsOiAiR2xvYmFsU2lnbiBSb290IENBIC0gUjIiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NjgyODg1NjU4MTI1CiMgTUQ1IEZpbmdlcnByaW50OiA5NDoxNDo3Nzo3ZTozZTo1ZTpmZDo4ZjozMDpiZDo0MTpiMDpjZjplNzpkMDozMAojIFNIQTEgRmluZ2VycHJpbnQ6IDc1OmUwOmFiOmI2OjEzOjg1OjEyOjI3OjFjOjA0OmY4OjVmOmRkOmRlOjM4OmU0OmI3OjI0OjJlOmZlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYTo0MjpkZDo0MTo3NDo1ZjpkMDpiODoxZTpiOTowMjozNjoyYzpmOTpkODpiZjo3MTo5ZDphMTpiZDoxYjoxZTpmYzo5NDo2Zjo1Yjo0Yzo5OTpmNDoyYzoxYjo5ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHVqQ0NBcUtnQXdJQkFnSUxCQUFBQUFBQkQ0WW01ZzB3RFFZSktvWklodmNOQVFFRkJRQXdUREVnTUI0RwpBMVVFQ3hNWFIyeHZZbUZzVTJsbmJpQlNiMjkwSUVOQklDMGdVakl4RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wCloyNHhFekFSQmdOVkJBTVRDa2RzYjJKaGJGTnBaMjR3SGhjTk1EWXhNakUxTURnd01EQXdXaGNOTWpFeE1qRTEKTURnd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUYVdkdUlGSnZiM1FnUTBFZ0xTQlNNakVUTUJFRwpBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG5iakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2JQSkE2K0xtOG9tVVZDeEtzK0lWU2JDOU4vaEhENkVyUEwKdjRkZnhuK0cwN0l3WE5iOXJmRjczT1g0WUpZSmtoRDEwRlBlKzN0K2M0aXNVb2g3U3FiS1NhWmVxS2VNV2hHOAplb0xydm96cHM2eVdKUWVYU3BrcUJ5KzBIbmUvaWcrMUFud2JscmpGdVRvc3ZOWVN1ZXRaZmVMUUJvWmZYa2xxCnRUbGVpRFRzdkhnTUNKaUViS2pOUzdTZ2ZReDVUZkM0TGNzaHl0VnNXMzNob0NtRW9mblRsRW5MSkdLUklMemQKQzlYWnpQbnFKd29yYzVIR25SdXN5TXZvNEtEMEw1Q0xUZnV3Tmh2MkdYcUY0RzN5WVJPSVhKL2drd3BSbDRwYQp6cStyMWZlcUNhcGd2ZHpaWDk5eXFXQVRYZ0FCeVVyNlA2VHFCd01oQW82Q3lnUENtNDhDQXdFQUFhT0JuRENCCm1UQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVW0rSUgKVjJjY0hzQnFCdDVadEpvdDM5d1poaTR3TmdZRFZSMGZCQzh3TFRBcm9DbWdKNFlsYUhSMGNEb3ZMMk55YkM1bgpiRzlpWVd4emFXZHVMbTVsZEM5eWIyOTBMWEl5TG1OeWJEQWZCZ05WSFNNRUdEQVdnQlNiNGdkWFp4d2V3R29HCjNsbTBtaTNmM0JtR0xqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFtWUZUaHh4b2w0YVI3T0JLdUVRTHE0R3MKSjAvV3diZ2NRM2l6REpyODZpdzhibUViVFVzcDlaOEZIU2JCdU9tREFHSkZ0cWtJazdtcE0wc1ltc0w0aDRoTwoyOTF4TkJyQlZOcEdQK0RUS3F0dFZDTDFPbUxOSUcrNktZblgzWkh1MDF5aVBxRmJRZlhmNVdSRExlblZPYXZTCm90KzNpOURBZ0JrY1JjQXRqT2o0TGFSMFZrbkZCYlZQRmQ1dVJIZzVoNmgrdS9ONUdKRzc5Rytkd2ZDTU5ZeGQKQWZ2RGJibnZSRzE1UmpGK0N2NnBnc0gvNzZ0dUlNUlF5VitkVFpzWGpBemxBY21nUVdwelUvcWxVTFJ1SlEvNwpUQmowL1ZMWmptbXg2QkVQM29qWSt4MUo5NnJlbGM4Z2VNSmdFdHNsUUl4cS9INUNPRUJrRXZlZWdlR1RMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyIKIyBTZXJpYWw6IDIwNjY4NDY5NjI3OTQ3MjMxMDI1NDI3Nzg3MDE4MDk2NjcyMzQxNQojIE1ENSBGaW5nZXJwcmludDogY2Q6Njg6YjY6YTc6Yzc6YzQ6Y2U6NzU6ZTA6MWQ6NGY6NTc6NDQ6NjE6OTI6MDkKIyBTSEExIEZpbmdlcnByaW50OiAxMzoyZDowZDo0NTo1Mzo0Yjo2OTo5NzpjZDpiMjpkNTpjMzozOTplMjo1NTo3Njo2MDo5Yjo1YzpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogZWI6MDQ6Y2Y6NWU6YjE6ZjM6OWE6ZmE6NzY6MmY6MmI6YjE6MjA6ZjI6OTY6Y2I6YTU6MjA6YzE6Yjk6N2Q6YjE6NTg6OTU6NjU6Yjg6MWM6Yjk6YTE6N2I6NzI6NDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVHakNDQXdJQ0VRQ2JmZ1pKb3o1aXVkWHVrRWh4S2U5WE1BMEdDU3FHU0liM0RRRUJCUVVBTUlIS01Rc3cKQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabApjbWxUYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1CkxDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFQKYVdkdUlFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcApkSGtnTFNCSE16QWVGdzA1T1RFd01ERXdNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUlIS01Rc3dDUVlEClZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFQKYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSgpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1CklFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU11Nm5GTDhlQjhhSG04YgpOM085K01scmxCSXdUL0EyUi9YUWtRcjFGOGlsWWNFV1FFMzdpbUdRNVhZZ3dSRUdmYXNzYnFiMUVVR08raTJ0CkttRlpwR2NtVE5Eb3ZGSmJjQ0FFV05GNnlhUnB2SU1YWkswRmk3elFXTTZOalBYcjhFSkpDNTJYSjJjeWJ1R3UKa3hVY2NMd2dUUzhZM3BLSTZHeUZWeEVhNlg3akpoRlVva1dXVllQS01Jbm8zTmlqN1NxQVAzOTVaVmMrRlNCbQpDQytWazcrcVJ5K29ScGZ3RXVMK3dnb3JVZVoyNXJkR3QrSU5wc3lvdzB4WlZZbm02Rk5jSE9xZDhHSVdDNmZKClh3enczc0oyenEvM2F2TDZRYWFpTXhUSjVYcGowNTVpTjlXRlpaNE81bE1rZEJ0ZUhSSlRXOGNzNTROSk94V3UKaW1pNVY1Y0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUVSU1d3YXVTQ1BjL0w4bXkvdVJhbjJUZQoyeUZQaHBrMGRqWlgzZEFWTDhXdGZ4VWZOMkp6UHRUblg4NFhBOXMxK2l2YnJtQUpYeDVmajI2N0N6M3FXaE1lCkRHQnZ0Y0MxSXlJdUJ3dkxxWFRMUjdzZHdkZWxhOHd2MGtMOVNkMm5pYzlUdXRvQVdpaS9ndC80dWhNZFVJYUMKL1k0d2p5bEdzQjQ5TmRvNFloWVlTcTNtdGxGczNxOWk2d0hRSGlUK2VvOFNHaEpvdVB0bW1SUVVSVnl1NTY1cApGNEVyV2pmSlhpcjB4dUtoWEZTYnBsUUF6L0R4d2NlWU1CbzdOaGJibzI3cS9hMnl3dHJ2QWtjVGlzRHhzekd0ClR4emhUNXl2RHd5ZDkzZ04yUFExVm9EYXQyMFhqNTBlZ1dUaC9zVkZ1cTFydVFwNlRrOUxoTzVMOFgzZEVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KSBPPUVudHJ1c3QubmV0IE9VPXd3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikvKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZAojIFN1YmplY3Q6IENOPUVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KSBPPUVudHJ1c3QubmV0IE9VPXd3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikvKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZAojIExhYmVsOiAiRW50cnVzdC5uZXQgUHJlbWl1bSAyMDQ4IFNlY3VyZSBTZXJ2ZXIgQ0EiCiMgU2VyaWFsOiA5NDYwNjkyNDAKIyBNRDUgRmluZ2VycHJpbnQ6IGVlOjI5OjMxOmJjOjMyOjdlOjlhOmU2OmU4OmI1OmY3OjUxOmI0OjM0OjcxOjkwCiMgU0hBMSBGaW5nZXJwcmludDogNTA6MzA6MDY6MDk6MWQ6OTc6ZDQ6ZjU6YWU6Mzk6Zjc6Y2I6ZTc6OTI6N2Q6N2Q6NjU6MmQ6MzQ6MzEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZkOmM0OjcxOjcyOmUwOjFjOmJjOmIwOmJmOjYyOjU4OjBkOjg5OjVmOmUyOmI4OmFjOjlhOmQ0OmY4OjczOjgwOjFlOjBjOjEwOmI5OmM4OjM3OmQyOjFlOmIxOjc3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFS2pDQ0F4S2dBd0lCQWdJRU9HUGUrREFOQmdrcWhraUc5dzBCQVFVRkFEQ0J0REVVTUJJR0ExVUVDaE1MClJXNTBjblZ6ZEM1dVpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnAKYm1OdmNuQXVJR0o1SUhKbFppNGdLR3hwYldsMGN5QnNhV0ZpTGlreEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNQpJRVZ1ZEhKMWMzUXVibVYwSUV4cGJXbDBaV1F4TXpBeEJnTlZCQU1US2tWdWRISjFjM1F1Ym1WMElFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDZ3lNRFE0S1RBZUZ3MDVPVEV5TWpReE56VXdOVEZhRncweU9UQTMKTWpReE5ERTFNVEphTUlHME1SUXdFZ1lEVlFRS0V3dEZiblJ5ZFhOMExtNWxkREZBTUQ0R0ExVUVDeFEzZDNkMwpMbVZ1ZEhKMWMzUXVibVYwTDBOUVUxOHlNRFE0SUdsdVkyOXljQzRnWW5rZ2NtVm1MaUFvYkdsdGFYUnpJR3hwCllXSXVLVEVsTUNNR0ExVUVDeE1jS0dNcElERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFek1ERUcKQTFVRUF4TXFSVzUwY25WemRDNXVaWFFnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dLREl3TkRncApNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJVMUxxUktHc3VxaklBY1ZGbVFxCkswdlJ2d3RLVFk3dGdIYWxaN2Q0UU1CelFzaG93TnRUSzkxZXVIYVlOWk9MR3AxOEV6b09IMXUzSHMvbEpCUWUKc1lHcGpYMjR6R3RMQS9FQ0ROeXJwVUFrQUg5MGxLR2RDQ216aUF2MWgzZWRWYzNrdzM3WGFtU3JoUlNHbFZ1WApNbEJ2UGNpNlpnemovTDI0U2NGMmlVa1ovY0Nvdlltalp5L0duN3h4R1dDNExla3N5WkIyWm51VTRxOTQxbVZUClhUelduTExQS1FQNUw2UlFzdFJJemdVeVZZcjlzbVJNRHVTWUIzWGJmOSs1Q0ZWZ2hUQXArWHRJcEdtRzR6VS8KSG9aZGVub1Z2ZThBamhVaVZCY0FrQ2FUdkE1SmFKRy8rRWZUblpWQ3dRNU4zMjhtejhNWUlXSm1RM0RXMWNBSAo0UUlEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WCkhRNEVGZ1FVVmVTQjBSR0F2dGlKdVFpak1mbWhKQWtXdVhBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFEdWIKajFhYk1PZFRtWHg2ZWFkTmw5Y1psWkQ3QmgvS00zeEdZNCtXWmlUNlFCc2hKOHJtY25QeVQvNHhtZjNJREV4bwpVOGFBZ2hPWStyYXQybDA5OGM1dTloVVJsSUlNN2orVnJ4R3JEOWN2M2g4RGoxY3NIc203bWhwRWxlc1lUNllmCnpYMVhFQytiQkFsYWhMVnUyQjA2NGRhZTBXeDVYbmtjRk1YajBFeVRPMlU4N2Q4OXZxYmxsUnJEdFJuRHZWNWIKdS84ajcyZ1p5eEtUSjF3RExXOHcwQjYyR3F6ZVd2ZlJxcWducHY1NWdjUjVtVE5YdWhLd3FlQkNiSlBLVnQ3KwpiWVFMQ0l0K2plclhtQ0hHOCtjOGVTOWVuTkZNRlkzaDdDSTN6SnBEQzVmY2dKQ05zMmViYjBnSUZWYlB2L0VyCmZGNmFkdWxaa01WOGd6VVJaVkU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1CYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290IE89QmFsdGltb3JlIE9VPUN5YmVyVHJ1c3QKIyBTdWJqZWN0OiBDTj1CYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290IE89QmFsdGltb3JlIE9VPUN5YmVyVHJ1c3QKIyBMYWJlbDogIkJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QiCiMgU2VyaWFsOiAzMzU1NDYxNwojIE1ENSBGaW5nZXJwcmludDogYWM6YjY6OTQ6YTU6OWM6MTc6ZTA6ZDc6OTE6NTI6OWI6YjE6OTc6MDY6YTY6ZTQKIyBTSEExIEZpbmdlcnByaW50OiBkNDpkZToyMDpkMDo1ZTo2NjpmYzo1MzpmZToxYTo1MDo4ODoyYzo3ODpkYjoyODo1MjpjYTplNDo3NAojIFNIQTI1NiBGaW5nZXJwcmludDogMTY6YWY6NTc6YTk6ZjY6NzY6YjA6YWI6MTI6NjA6OTU6YWE6NWU6YmE6ZGU6ZjI6MmE6YjM6MTE6MTk6ZDY6NDQ6YWM6OTU6Y2Q6NGI6OTM6ZGI6ZjM6ZjI6NmE6ZWIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lFQWdBQXVUQU5CZ2txaGtpRzl3MEJBUVVGQURCYU1Rc3dDUVlEVlFRR0V3SkoKUlRFU01CQUdBMVVFQ2hNSlFtRnNkR2x0YjNKbE1STXdFUVlEVlFRTEV3cERlV0psY2xSeWRYTjBNU0l3SUFZRApWUVFERXhsQ1lXeDBhVzF2Y21VZ1EzbGlaWEpVY25WemRDQlNiMjkwTUI0WERUQXdNRFV4TWpFNE5EWXdNRm9YCkRUSTFNRFV4TWpJek5Ua3dNRm93V2pFTE1Ba0dBMVVFQmhNQ1NVVXhFakFRQmdOVkJBb1RDVUpoYkhScGJXOXkKWlRFVE1CRUdBMVVFQ3hNS1EzbGlaWEpVY25WemRERWlNQ0FHQTFVRUF4TVpRbUZzZEdsdGIzSmxJRU41WW1WeQpWSEoxYzNRZ1VtOXZkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTUV1eUtyCm1EMVg2Q1p5bXJWNTFDbmk0ZWlWZ0xHdzQxdU9LeW1hWk4raFhlMndDUVZ0MnlndXptS2lZdjYwaU5vUzZ6anIKSVozQVFTc0JVbnVJZDlNY2o4ZTZ1WWkxYWdubmMrZ1JRS2ZSek1waWpTM2xqd3VtVU5Lb1VNTW82dldySlllSwptcFljcVdlNFB3elY5L2xTRXkvQ0c5VndjUENQd0JMS0JzdWE0ZG5LTTNwMzF2anN1ZkZvUkVKSUU5TEF3cVN1ClhtRCt0cVlGL0xUZEIxa0MxRmtZbUdQMXBXUGdrQXg5WGJJR2V2T0Y2dXZVQTY1ZWhENWYveFh0YWJ6NU9UWnkKZGM5M1VrM3p5WkFzdVQzbHlTTlRQeDhrbUNGY0I1a3B2Y1k2N09kdWhqcHJsM1JqTTcxb0dESHdlSTEydi95ZQpqbDBxaHFkTmtOd25HamtDQXdFQUFhTkZNRU13SFFZRFZSME9CQllFRk9XZFdUQ0NSMWpNclBvSVZEYUdlenExCkJFM3dNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUU13RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjMKRFFFQkJRVUFBNElCQVFDRkRGMk81RzlSYUVJRm9OMjdUeWNsaEFPOTkyVDlMZGN3NDZRUUYrdmFLU20yZVQ5Mgo5aGtUSTdnUUN2bFlwTlJoY0wwRVlXb1NpaGZWQ3IzRnZEQjgxdWtNSlkyR1FFL3N6S04rT01ZM0VVL3QzV2d4CmprelNzd0YwN3I1MVhnZElHbjl3L3haY2hNQjVoYmdGL1grK1pSR2pEOEFDdFBoU056a0UxYWt4ZWhpL29DcjAKRXBuM28wV0M0enhlOVoyZXRjaWVmQzdJcEo1T0NCUkxiZjF3YldzYVk3MWs1aCszenZEeW55NjdHN2Z5VUloegprc0xpNHhhTm1qSUNxNDRZM2VrUUVlNStOYXVRcno0d2xIclFNejJuWlEvMS9JNmVZczlIUkN3Qlhic2R0VExTClI5STRMdEQrZ2R3eWFoNjE3anpWL09lQkhSbkRKRUxxWXptcAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdCBPPUFkZFRydXN0IEFCIE9VPUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrCiMgU3ViamVjdDogQ049QWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdCBPPUFkZFRydXN0IEFCIE9VPUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrCiMgTGFiZWw6ICJBZGRUcnVzdCBFeHRlcm5hbCBSb290IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMWQ6MzU6NTQ6MDQ6ODU6Nzg6YjA6M2Y6NDI6NDI6NGQ6YmY6MjA6NzM6MGE6M2YKIyBTSEExIEZpbmdlcnByaW50OiAwMjpmYTpmMzplMjo5MTo0Mzo1NDo2ODo2MDo3ODo1Nzo2OTo0ZDpmNTplNDo1Yjo2ODo4NToxODo2OAojIFNIQTI1NiBGaW5nZXJwcmludDogNjg6N2Y6YTQ6NTE6Mzg6MjI6Nzg6ZmY6ZjA6Yzg6YjE6MWY6OGQ6NDM6ZDU6NzY6Njc6MWM6NmU6YjI6YmM6ZWE6YjQ6MTM6ZmI6ODM6ZDk6NjU6ZDA6NmQ6MmY6ZjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVOakNDQXg2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJ2TVFzd0NRWURWUVFHRXdKVFJURVUKTUJJR0ExVUVDaE1MUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1GcwpJRlJVVUNCT1pYUjNiM0pyTVNJd0lBWURWUVFERXhsQlpHUlVjblZ6ZENCRmVIUmxjbTVoYkNCRFFTQlNiMjkwCk1CNFhEVEF3TURVek1ERXdORGd6T0ZvWERUSXdNRFV6TURFd05EZ3pPRm93YnpFTE1Ba0dBMVVFQmhNQ1UwVXgKRkRBU0JnTlZCQW9UQzBGa1pGUnlkWE4wSUVGQ01TWXdKQVlEVlFRTEV4MUJaR1JVY25WemRDQkZlSFJsY201aApiQ0JVVkZBZ1RtVjBkMjl5YXpFaU1DQUdBMVVFQXhNWlFXUmtWSEoxYzNRZ1JYaDBaWEp1WVd3Z1EwRWdVbTl2CmREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxmM0dqUG04Z0FFTFRuZ1RsdnQKSDd4c0Q4MjEraU8yenQ2YkVUT1hwQ2xNZlpPZnZVcThrKzBER3VPUHorVnRVRnJXbHltVVdvQ3dTWHJiTHBYOQp1TXEvTnpndEhqNlJRYTF3VnNmd1R6L29NcDUweXNpUVZPbkdYdzk0blpwQVBBNnNZYXBlRkkrZWg2RnFVTnpYCm1rNnZCYk9tY1pTY2NiTlFZQXJIRTUwNEI0WUNxT21vYVNZWWtLdE1zRThqcXpwUGhOamZ6cC9oYVcrNzEwTFgKYTBUa3g2M3ViVUZmY2xweENEZXplV1drV2FDVU4vY0FMdzNDa25MYTBEaHkyeFNvUmNSZEtuMjN0TmJFN3F6TgpFMFMzeVN2ZFF3QWwrbUc1YVdwWUl4RzNwek9QVm5WWjljMHAxMGEzQ2l0bHR0TkNieFd5dUh2NzcrbGRVOVUwCldpY0NBd0VBQWFPQjNEQ0IyVEFkQmdOVkhRNEVGZ1FVcmIyWWVqUzBKdmY2eENaVTd3Tzk0Q1RMVkJvd0N3WUQKVlIwUEJBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Z1prR0ExVWRJd1NCa1RDQmpvQVVyYjJZZWpTMApKdmY2eENaVTd3Tzk0Q1RMVkJxaGM2UnhNRzh4Q3pBSkJnTlZCQVlUQWxORk1SUXdFZ1lEVlFRS0V3dEJaR1JVCmNuVnpkQ0JCUWpFbU1DUUdBMVVFQ3hNZFFXUmtWSEoxYzNRZ1JYaDBaWEp1WVd3Z1ZGUlFJRTVsZEhkdmNtc3gKSWpBZ0JnTlZCQU1UR1VGa1pGUnlkWE4wSUVWNGRHVnlibUZzSUVOQklGSnZiM1NDQVFFd0RRWUpLb1pJaHZjTgpBUUVGQlFBRGdnRUJBTENiNElVbHd0WWo0ZytXQnBLZFFaaWMyWVI1Z2RrZVd4UUhJelpsajdEWWQ3dXNRV3hICllJTlJzUGt5UGVmODlpWVR4NEFXcGI5YS9JZlBlSG1KSVpyaVRBY0toalc4OHQ1UnhOS1d0OXgrVHU1dy9SdzUKNnd3Q1VSUXRqcjBXNE1IZlJuWG5KSzNzOUVLMGhaTndFR2U2blFZMVNoalRLM3JNVVVLaGVtUFI1cnVoeFN2QwpOcjRURGVhOVkzNTVlNmNKRFVDcmF0MlBpc1AyOW93YVFnVlIxRVgxbjZkaUlXZ1ZJRU04bWVkOHZTVFlxWkVYCmM0Zy9WaHN4T0JpMGNRK2F6Y2dPbm80dUcrR01tSVBMSHpIeFJFekdCSE5KZG1BUHgvaTlGNEJyTHVuTVRBNWEKbW5rUElBb3UxWjVqSmg1VmtwVFlnaGRhZTlDOHg0OU9oZ1E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FbnRydXN0LCBJbmMuIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZS8oYykgMjAwNiBFbnRydXN0LCBJbmMuCiMgU3ViamVjdDogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RW50cnVzdCwgSW5jLiBPVT13d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UvKGMpIDIwMDYgRW50cnVzdCwgSW5jLgojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTE2NDY2MDgyMAojIE1ENSBGaW5nZXJwcmludDogZDY6YTU6YzM6ZWQ6NWQ6ZGQ6M2U6MDA6YzE6M2Q6ODc6OTI6MWY6MWQ6M2Y6ZTQKIyBTSEExIEZpbmdlcnByaW50OiBiMzoxZTpiMTpiNzo0MDplMzo2Yzo4NDowMjpkYTpkYzozNzpkNDo0ZDpmNTpkNDo2Nzo0OTo1MjpmOQojIFNIQTI1NiBGaW5nZXJwcmludDogNzM6YzE6NzY6NDM6NGY6MWI6YzY6ZDU6YWQ6ZjQ6NWI6MGU6NzY6ZTc6Mjc6Mjg6N2M6OGQ6ZTU6NzY6MTY6YzE6ZTY6ZTY6MTQ6MWE6MmI6MmM6YmM6N2Q6OGU6NGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVrVENDQTNtZ0F3SUJBZ0lFUld0UVZEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnNERUxNQWtHQTFVRUJoTUMKVlZNeEZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4T1RBM0JnTlZCQXNUTUhkM2R5NWxiblJ5ZFhOMApMbTVsZEM5RFVGTWdhWE1nYVc1amIzSndiM0poZEdWa0lHSjVJSEpsWm1WeVpXNWpaVEVmTUIwR0ExVUVDeE1XCktHTXBJREl3TURZZ1JXNTBjblZ6ZEN3Z1NXNWpMakV0TUNzR0ExVUVBeE1rUlc1MGNuVnpkQ0JTYjI5MElFTmwKY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEyTVRFeU56SXdNak0wTWxvWERUSTJNVEV5TnpJdwpOVE0wTWxvd2diQXhDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXVNVGt3Ck53WURWUVFMRXpCM2QzY3VaVzUwY25WemRDNXVaWFF2UTFCVElHbHpJR2x1WTI5eWNHOXlZWFJsWkNCaWVTQnkKWldabGNtVnVZMlV4SHpBZEJnTlZCQXNURmloaktTQXlNREEySUVWdWRISjFjM1FzSUVsdVl5NHhMVEFyQmdOVgpCQU1USkVWdWRISjFjM1FnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FTSXdEUVlKCktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxhVnRrTkMrc1p0S205STM1Uk1PVmNGN3NONUVVRm8KTnUzcy9wb0JqNkU0S1B6M0VFWm1MazBlR3JFYVRzYlJ3SldJc01uL01Zc3pBOXUzZzNzK0lJUmU3YkpXS0tmNAo0TGxBY1RmRnkwY09seXBvd0NLVlloWGJSOW4xMEN2L2drdkpyVDdlVE51UWdGQS9DWXFFQU93d0NqMFl6ZnY5CktsbWFJNVVYTEVXZUgyNURlVzBNWEpqK1NLZkZJMGRjWHYxdTV4NjA5bWhGMFlhRFc2S0tqYkhqS1lEK0pYR0kKcmI2OGo2eFNsa3VxVVkza0V6RVo2RTVObjl1c3MyclZ2RGxVY2NwNmVuK1EzWDBkZ05tQnUxa213aEgrNXBQaQo5NERrWmZzME53NHBnSEJOcnppR0xwNS9WNitlRjY3ckhNc29JVisySE5qbm9nUWkrZFBhMk1zQ0F3RUFBYU9CCnNEQ0JyVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QXJCZ05WSFJBRUpEQWkKZ0E4eU1EQTJNVEV5TnpJd01qTTBNbHFCRHpJd01qWXhNVEkzTWpBMU16UXlXakFmQmdOVkhTTUVHREFXZ0JSbwprT1JucEtaVGdNZUdacVR4OTB0RCs0UzliVEFkQmdOVkhRNEVGZ1FVYUpEa1o2U21VNERIaG1hazhmZExRL3VFCnZXMHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWamN1TVRvMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQ1QxREN3MXdNZ0t0RDVZK2lSREFVZ3FWOFp5bnR5VHRTeDI5Q1crMVJhR1N3TUNQZXl2SVdvblg5dApPMUt6S3R2bjFJU01ZL1lQeXlZQmtWQnM5RjhVNHBOMHdCT2VNRHBRNDdSZ3hSendJa1NOY1Vlc3lCcko2WnVhCkFHQVQvM0IrWHhGTlNSdXpGVko3eVZUYXY1MlZyMnVhMko3cDhlUkRqZUlSUkRxL3I3MkRRbk5TaTZxN3B5blAKOVdRY0NrM1J2S3FzbnlyUS8zOS8ybjNxc2Uwd0pjR0UyalRTVzNpRFZ1eWNOc01tNGhIMlowa2RrcXVNKyt2LwpldTZGU3FkUWdQQ25YRXFVTGw4Rm1UeFNRZUROdEdQUEFVTzZuSVBjajJBNzgxcTB0SHV1Mmd1UU9IWHZnUjFtCjB2ZFhjRGF6di93b3IzRWxoVnNUL2g1L1dyUTgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IEdsb2JhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBHbG9iYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBHbG9iYWwgQ0EiCiMgU2VyaWFsOiAxNDQ0NzAKIyBNRDUgRmluZ2VycHJpbnQ6IGY3Ojc1OmFiOjI5OmZiOjUxOjRlOmI3Ojc3OjVlOmZmOjA1OjNjOjk5OjhlOmY1CiMgU0hBMSBGaW5nZXJwcmludDogZGU6Mjg6ZjQ6YTQ6ZmY6ZTU6Yjk6MmY6YTM6YzU6MDM6ZDE6YTM6NDk6YTc6Zjk6OTY6MmE6ODI6MTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGZmOjg1OjZhOjJkOjI1OjFkOmNkOjg4OmQzOjY2OjU2OmY0OjUwOjEyOjY3Ojk4OmNmOmFiOmFhOmRlOjQwOjc5OjljOjcyOjJkOmU0OmQyOmI1OmRiOjM2OmE3OjNhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVkRDQ0FqeWdBd0lCQWdJREFqUldNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FSXhDekFKQmdOVkJBWVRBbFZUCk1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVJzd0dRWURWUVFERXhKSFpXOVVjblZ6ZENCSGJHOWkKWVd3Z1EwRXdIaGNOTURJd05USXhNRFF3TURBd1doY05Nakl3TlRJeE1EUXdNREF3V2pCQ01Rc3dDUVlEVlFRRwpFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakViTUJrR0ExVUVBeE1TUjJWdlZISjFjM1FnClIyeHZZbUZzSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMnN3WVl6RDkKOUJjakdsWitXOTg4YkRqa2NiZDRrZFM4b2RoTStLaER0Z1BwVFNFSENJamFXQzltT1NtOUJYaUxuVGpvQmJkcQpmbkdrNXNSZ3ByRHZnT1NKS0ErZUpkYnRnL090cHBISG1NbENHRFVVbmEyWVJwSXVUOHJ4aDBQQkZwVlhMVkR2CmlTMkFlbGV0OHU1ZmE5SUFqYmtVK0JRVk5kbkFScU43Y3NpUnY4bFZLODNRbHo2Y0ptVE0zODZER1hIS1R1YlUKMVh1cEdjMVYzc2pzMGw0NFUrVmNUNHd0L2xBak52eG01c3VPcERrWkFMZVZBam1SQ3c3K09DN1JIUVdhOWswKwpidzhISGE4c0hvOWdPZUw2TmxNVE9kUmVKaXZiUGFnVXZUTHJHQU1vVWdSeDVhc3pQZUU0dXdjMmhHS2NlZW9XCk1QUmZ3Q3ZvY1d2aytRSURBUUFCbzFNd1VUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCVEEKZXBob2pZbjdxd1ZrREJGOXFuMWx1TXJNVGpBZkJnTlZIU01FR0RBV2dCVEFlcGhvalluN3F3VmtEQkY5cW4xbAp1TXJNVGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQU5lTXBhdVV2WFZTT0tWQ1VuNWthRk9TUGVDcGlsS0luClo1N1F6eHBlUituQnNxVFAzVUVhQlU2YlMrNUtiMVZTc3lTaE53cnJaSFlxTGl6ei9UdDFrTC82Y2RqSFBUZlMKdFFXVllybW0zb2s5Tm5zNGQwaVhyS1lnank2bXlRekNzcGxGQU1mT0VWRWlJdUNsNnJZVlNBbGs2bDVQZFBjRgpQc2VLVWd6YkZiUzliWnZseHJGVWFLbmphWkMybXFVUHVMay9JSDJ1U3JXNG5PUWR0cXZtbEtYQng0T3QyL1VuCmh3NEViTlgvM2FCZDdZZFN0eXNWQXE0NXBtcDA2ZHJFNTd4Tk5CNnBYRTB6WDVJSkw0aG1YWGVYeHgxMkU2blYKNWZFV0NSRTExYXpiSkhGd0xKaFdDOWtYdE5IalVTdGVkZWpWME54UE5PM0NCV2FBb2N2bU13PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBVbml2ZXJzYWwgQ0EiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiA5Mjo2NTo1ODo4YjphMjoxYTozMTo3Mjo3Mzo2ODo1YzpiNDphNTo3YTowNzo0OAojIFNIQTEgRmluZ2VycHJpbnQ6IGU2OjIxOmYzOjM1OjQzOjc5OjA1OjlhOjRiOjY4OjMwOjlkOjhhOjJmOjc0OjIyOjE1Ojg3OmVjOjc5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMDo0NTo5Yjo5Zjo2MzpiMjoyNTo1OTpmNTpmYTo1ZDo0Yzo2ZDpiMzpmOTpmNzoyZjpmMTo5Mzo0MjowMzozNTo3ODpmMDo3MzpiZjoxZDoxYjo0NjpjYjpiOToxMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmFEQ0NBMUNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkZNUXN3Q1FZRFZRUUdFd0pWVXpFVwpNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZU1Cd0dBMVVFQXhNVlIyVnZWSEoxYzNRZ1ZXNXBkbVZ5CmMyRnNJRU5CTUI0WERUQTBNRE13TkRBMU1EQXdNRm9YRFRJNU1ETXdOREExTURBd01Gb3dSVEVMTUFrR0ExVUUKQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eEhqQWNCZ05WQkFNVEZVZGxiMVJ5ZFhOMApJRlZ1YVhabGNuTmhiQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBS1lWClZhQ2p4dUFmakowaFVOZkJ2aXRidGFTZW9kbHlXTDBBRzB5L1lja1VIVVdDcThZZGdOWTk2eENjT3E5dEpQaTgKY1FHZUJ2VjhYeDdCRGxYS2c1cFpNSzRaeXpCSWxlMGlONDMwU3BweVpqNnRsY0RnRmdEZ0VCOHJNUTdYbEZUVApRak9nTkIwZVJYYmRUOG9ZTit5RkZYb1pDUHpWeDV6dzhxa3VFS21TNWoxWVBha1dhRHd2ZFNFWWZ5aDNwZUZoCkY3ZW02ZmdlbWR0emJ2UUtvaUZzN3RxcWhaSm1yL1o2YTRMYXVpSUlOUS9QUXZFMSttcnVmaXNsekRvUjVHMnYKYzdKMkhhM1FzbmhuR3FRNUhGRUxaMWFEL1RoZERjN2Q4THNybGgvZWV6SlMvUjI3dFFhaHNpRmVwZGFWYUgvdwptWjdjUlFnKzU5SUpEVFdVM1lCT1U1Zlh0UWxFSUdRV0Z3TUNURk1OYU43VnFuSk5rMjJDRHR1Y3ZjKzA4MXhkClZIcHBDWmJXMnhIQmpYV290TTg1eU00OHZDUjg1bUxLNGIxOXA3MVhaUXZrL2lYdHRta1EzQ2dhUnIwQkhkQ1gKdGVHWU84QTNaTlk5bE80TDRmVW9yZ3RXdjNHTEl5bEJqb2JGUzFKNzJIR3JING9WcGp1RFd0ZFlBVkhHVEVIWgpmOWhCWjNLaUtOOWdnNm1leUh2OFUzTnlXZldUZWhkMkRzNzM1VnpaQzFVMG9xcGJ0V3BVNXhQS1YreVhiZlJlCkJpOUZpMWpVSXhhUzVCWnVLR05aTU45UUFaeGppUnFmMnhlVWduQTN3eVNlbWtmV1dzcE9xR21KY2grUmJOdCsKbmh1dHh4OXozU3hQR1dYOWY1TkFFQzdTOE8wOG5pNG9QbWttTThWN0FnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTnE3THFxd0RMaUlKbEYwWEcwRDA4RFlqM3JXTUI4R0ExVWRJd1FZCk1CYUFGTnE3THFxd0RMaUlKbEYwWEcwRDA4RFlqM3JXTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQWdFQU1Yam14N1hmdUpSQXlYSEVxRFhzUmgzQ2hmTW9XSWF3Qy95T3NqbVBSRldyWklSYwphYW5RbWpnOCt1VWZOZVZFNDRCNWxHaWt1OFNmUGVFMHpUQkdpMVFybGFYdjl6K1poUDAxNXM4eHh0eHF2NmZYCkl3amhtRjdEV2doMnFhYXZkeSszWUwxRVJtcnZsLzl6bGNHTzZKUDcvVEczN0ZjUkVVV2JNUEVhaURuQlR6eW4KQU5YSC9LdHRnQ0p3cFF6Z1hRUXBBdnZMb0pIUmZOYkRmbERWblZpK1FUanJ1WFU4RmRtYnlVcURXY0RhVS8wegp1ellZbTRVUEZkM3VMYXgyazduWkFZMUlFS2o3OVRpRzhkc0t4cjJFb3lOQjN0WjNiNFhVaFJ4UTRLNVJpcnFOClBuYml1Y29uOGwrZjcyNVpEUWJZS3hlazBueHJ1MThVR2tpUEdrem5zMGNjamt4Rkt5RHVTTi9uM1FtT0dLamEKUUkyU0poRlRZWE5kNjczbnhFMHBOMkhyckRrdFp5NFcxdlVBZzRXaHpIOTJ4SDNrdDB0bTd3TkZZR20yREZLVwprb1JlcHFPMXBENHIyY3pZRzBlcThrVGFUL2tENlBBVXl6L3pnOTdRd1ZUanQrZ0tOMDJMSUZrRE1CbWhMTWk5CkVSL2Zyc2xLeGZNblptYUdyR2lSLzlubVV4d1BpMXhwWlFvbXlCNDB3MTFSZTllcG5BYWhOdDNWaVpTODJlUXQKREY0SmJBaVhmS005ZkpQL1A2RVVwOCsxWGV2YjJ4ekVkdCtJdWIxRkJaVWJydnhHYWt5dlNPUE9yZy9TZnV2bQpiSnhQZ1dwNlpLeTdQdFhueTNZdXhhZEl3VnlRRDh2SVAvcm1NdUdORzIrazVvN1krU2xJaXM1ei9pdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSAyIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSAyIE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAzNDpmYzpiODpkMDozNjpkYjo5ZToxNDpiMzpjMjpmMjpkYjo4ZjplNDo5NDpjNwojIFNIQTEgRmluZ2VycHJpbnQ6IDM3OjlhOjE5OjdiOjQxOjg1OjQ1OjM1OjBjOmE2OjAzOjY5OmYzOjNjOjJlOmFmOjQ3OjRmOjIwOjc5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMDoyMzo0ZjozYjpjODo1Mjo3YzphNTo2Mjo4ZTplYzo4MTphZDo1ZDo2OTo4OTo1ZDphNTo2ODowZDpjOToxZDoxYzpiODo0Nzo3ZjozMzpmODo3ODpiOTo1YjowYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJEQ0NBMVNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkhNUXN3Q1FZRFZRUUdFd0pWVXpFVwpNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxYzNRZ1ZXNXBkbVZ5CmMyRnNJRU5CSURJd0hoY05NRFF3TXpBME1EVXdNREF3V2hjTk1qa3dNekEwTURVd01EQXdXakJITVFzd0NRWUQKVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWdNQjRHQTFVRUF4TVhSMlZ2VkhKMQpjM1FnVlc1cGRtVnljMkZzSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRQ3pWRkxCeVQ3eTJkeXhVeHBaS2VleHcwVW81ZGZSN2NYRlM2R3FkSHRYcjBvbS9OajFYcWR1R2R0MERFODEKV3pJTEFlUGI2M3AzTmVxcVd1RFc2S0ZYbFBDUW8zUldsRVF3QXg1Y1RpdUZKblNDZWd4Mm9HOU56a0V0b0JVRwpGRiszUXMxN2oxaGhOTndxQ1BrdXd3R21Ja1FjVEFlQzVsdk8wRXA4Qk5NWmN5ZndxcGgvTHE5TzY0Y2VKSGRxClhiYm9XMFc2M01PaEJXOVdqbzhRSnFWSnd5N1hRWWNpNEUrR3ltQzE2cUZqd0FHWEVIbTlBRHdTYlNzVnNheEwKc2U0WXVVNlczTngyL3p1K3oxOER3UHc3Nkw1R0cvL2FRTUpTOS83ak92ZHFkelhRMm8zclhoaHFNY2NldWp3YgpLTlpyVk1hcVc5ZWlMQnNaektJQzlwdFp2VGRyaHJWdGdyclk2c2xXdktrMldQMCtHZlB0RENhcGt6ajRUOEZkCklnYlFsK3JocmNaVjRJRXJLSU02K3ZSN0lWRUF2bEk0enMxbWVhajBnVmJpMElNSlIxRmJVR3JQMjBnYVhUNzMKeS9abDkyenhsZmdDT3pKV2dqbDZXNzB2aVJ1L29iVG8vMytOak44RDhXQk9XQkZNNjZNL0VDdURtZ0Z6MlpSdApoQUFuWnF6d2NFQUpRcEt0VDVNTllRbFJKTmlTMVF1VVliS0hzdTMvbWpYL2hWVEs3VVJEckJzOEZtdElTZ29jClFJZ2Zrc0lMQUFYLzhzZ0NTcVNxcWN5Wmxwd3ZXT0I5NGI2N0I5eGZCSEpjTVRURDdGOHQ0RDFra0NMbTBleTQKTHQxWnJ0bWhONzlVTmR4ek1rK01CQjR6c3NsRzhkaGN5RlZReVdpOXFMbzJDUUlEQVFBQm8yTXdZVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSMjgxWGgrcVEyKy9DZlhHSng3VHowUnpnUUt6QWZCZ05WCkhTTUVHREFXZ0JSMjgxWGgrcVEyKy9DZlhHSng3VHowUnpnUUt6QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnSUJBR2JCeGlQejJlQXVibC9vejY2d3NDVk5LL2c3V0p0QUpEZGF5NnNXU2YregpkWGt6b1M5dGNCYzBrZjVuZm8vc20rVmVncWxWSHkvYzFGRUhFdjZzRmo0c05jWmovTndRNncyanF0Qjh6TkhRCkwxRXV4QlJhM3VnWjRUN0d6S1FwNXk2RXFnWXdlSFpVY3lpWVdUamdBQTFpMDBKOUlaK3VQVHFNMWZwM0RSZ3IKRmc1Zk51SDhLclV3Sk0vZ1l3eDdXQnIrbWJwQ0VyR1I5SHhvNHNqb3J5enF5WDZ1dXlvOURSWGNOSlcyR0hTbwphZy9IdFBRVHhPUmI3UXJTcEpkTUt1MHZiQktKUGZFbmNLcHFBMUlobjBDb1oxRHk4MW9mMzk4ajl0eDRUdWFZClQxVTZVK1B2OHZTZngzellXSzhwSXBlNDRMMlJMckIyN0ZjUnorOHBSUFBwaFhwZ1krUmRNNGtYMlRHcTJ0YnoKR0RWeXo0Y3JMMk1qaEYyRWpEOVhvSWo4bVpFb0ptbVoxSStYUkw2TzFVaXhwQ2dwOFJXMDRlV2UzZmlQcG04bQoxd2s4T2h3UkRxWnNOL2V0Ukljc0tNZllkSUt6MEc5S1Y3czFLU2VnaStnaHA0ZGtObDNNMkJhc3g3SW5RSkpWCk9DaU5VVzdkRkdkVGJIRmNKb1JOZFZxMmZtQldxVTJ0KzVzZWwvTU4yZEtYVkhmYVBSSzM0Qjd2Q0FhcytZV0gKNmFMY3IzNFlFb1A5VmhkQkx0VXBnbjJaOURIMmNhblBMQUVucFFXNXFySklUaXJ2bjVOU1VaVThVbk9PVmt3WApRTUFKS09TTGFraFQyK3pOVlZYeHh2anBvaXhNcHRFbVgzNnZXa3phSDZieUhDeCtyZ0lXMGxiUUwxZFRSK2lTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WaXNhIGVDb21tZXJjZSBSb290IE89VklTQSBPVT1WaXNhIEludGVybmF0aW9uYWwgU2VydmljZSBBc3NvY2lhdGlvbgojIFN1YmplY3Q6IENOPVZpc2EgZUNvbW1lcmNlIFJvb3QgTz1WSVNBIE9VPVZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uCiMgTGFiZWw6ICJWaXNhIGVDb21tZXJjZSBSb290IgojIFNlcmlhbDogMjU5NTIxODA3NzYyODU4MzYwNDgwMjQ4OTAyNDE1MDU1NjU3OTQKIyBNRDUgRmluZ2VycHJpbnQ6IGZjOjExOmI4OmQ4OjA4OjkzOjMwOjAwOjZkOjIzOmY5OjdlOmViOjUyOjFlOjAyCiMgU0hBMSBGaW5nZXJwcmludDogNzA6MTc6OWI6ODY6OGM6MDA6YTQ6ZmE6NjA6OTE6NTI6MjI6M2Y6OWY6M2U6MzI6YmQ6ZTA6MDU6NjIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY5OmZhOmM5OmJkOjU1OmZiOjBhOmM3OjhkOjUzOmJiOmVlOjVjOmYxOmQ1Ojk3Ojk4OjlmOmQwOmFhOmFiOjIwOmEyOjUxOjUxOmJkOmYxOjczOjNlOmU3OmQxOjIyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb2pDQ0FvcWdBd0lCQWdJUUU0WTFUUjAvQnZMQitXVUYxWkFjWWpBTkJna3Foa2lHOXcwQkFRVUZBREJyCk1Rc3dDUVlEVlFRR0V3SlZVekVOTUFzR0ExVUVDaE1FVmtsVFFURXZNQzBHQTFVRUN4TW1WbWx6WVNCSmJuUmwKY201aGRHbHZibUZzSUZObGNuWnBZMlVnUVhOemIyTnBZWFJwYjI0eEhEQWFCZ05WQkFNVEUxWnBjMkVnWlVOdgpiVzFsY21ObElGSnZiM1F3SGhjTk1ESXdOakkyTURJeE9ETTJXaGNOTWpJd05qSTBNREF4TmpFeVdqQnJNUXN3CkNRWURWUVFHRXdKVlV6RU5NQXNHQTFVRUNoTUVWa2xUUVRFdk1DMEdBMVVFQ3hNbVZtbHpZU0JKYm5SbGNtNWgKZEdsdmJtRnNJRk5sY25acFkyVWdRWE56YjJOcFlYUnBiMjR4SERBYUJnTlZCQU1URTFacGMyRWdaVU52YlcxbApjbU5sSUZKdmIzUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdlY5NVdIbTZoCjJtQ3hsQ2ZMRjlzSFA0Q0ZUOGljdHREMGIwL1BtZGpoMjhKSVhEcXNPVFBISDJxTEpqMHJOZlZJc1pIQkFrNEUKbHBGN3NEUHdzUlJPRVcrMVFLOGJSYVZLNzM2MnJQS2dIMWcvRWtaZ1BJMmg0SDNQVno0ekh2dEg4YW9WbHdkVgpacVcxTFM3WWdGbXlwdzIzUnV3aFkvODFxNlVDenlyMFRQNTc5WlJkaEUybzhtQ1AydzRsUEo5emNjK1UzMHJxCjI5OXlPSXp6bHIzeEY3elN1anRGV3NhbjlzWVhpd0dkL0Jtb0tvTVd1RHBJL2s0K29Lc0dHZWxUODRBVEIrMHQKdno4S1BGVWdPU3dzQUdsMGxVcThJTEtwZWVVWWlaR28zQnhONzd0K053dGQvam1saUZLTUFHenNHSHhCdmZhTApkWGU2WUoyRTUvNHRBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFECkFnRUdNQjBHQTFVZERnUVdCQlFWT0lNUFB5dy9jRE1lelViK0I0d2c0TmZEdHpBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFYL0ZCZlh4Y0NMa3I0TldTUi9wblhLVVR3d01obXl0TWlVYlBXVTNKL3FWQXRtUE4zWEVvbFdjUgp6Q1NzMDBSc2NhNEJJR3NEb284WXR5azZmZVVXWUZONFBNQ3ZGWVAzajFJekpMMWtrNWZ1aS9mYkdLaHRjYlAzCkxCZlFkQ1ZwOS81clBKUytUVXRCakU3aWM5RGprQ0p6UTgzejcrcHp6a1dLc0taSi8weDluWEdJeEhZZGtGc2QKN3YzTTkrNzlZS1d4ZWhaeDBSYlFmQkk4YkdtWDI2NWZPWnB3THdVOEdVWUVtU0EyMEdCdVlRYTdGa0tNY1BjdworK0RiWnFNQUFiM21MTnFSWDZCR2kwMXFuRDA5M1FWRy9uYS9vQW84NUFEbUo3Zi9oQzNldWlJbmxoQng2eUx0CjM5OHpuTS9qcmE2TzFJN21UMUd2RnBMZ1hQWUhEdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BQUEgQ2VydGlmaWNhdGUgU2VydmljZXMgTz1Db21vZG8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlcyBPPUNvbW9kbyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDb21vZG8gQUFBIFNlcnZpY2VzIHJvb3QiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiA0OTo3OTowNDpiMDplYjo4NzoxOTphYzo0NzpiMDpiYzoxMTo1MTo5Yjo3NDpkMAojIFNIQTEgRmluZ2VycHJpbnQ6IGQxOmViOjIzOmE0OjZkOjE3OmQ2OjhmOmQ5OjI1OjY0OmMyOmYxOmYxOjYwOjE3OjY0OmQ4OmUzOjQ5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBkNzphNzphMDpmYjo1ZDo3ZToyNzozMTpkNzo3MTplOTo0ODo0ZTpiYzpkZTpmNzoxZDo1ZjowYzozZTowYToyOTo0ODo3ODoyYjpjODozZTplMDplYTo2OTo5ZTpmNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1qQ0NBeHFnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQjdNUXN3Q1FZRFZRUUdFd0pIUWpFYgpNQmtHQTFVRUNBd1NSM0psWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhEQWRUWVd4bWIzSmtNUm93CkdBWURWUVFLREJGRGIyMXZaRzhnUTBFZ1RHbHRhWFJsWkRFaE1COEdBMVVFQXd3WVFVRkJJRU5sY25ScFptbGoKWVhSbElGTmxjblpwWTJWek1CNFhEVEEwTURFd01UQXdNREF3TUZvWERUSTRNVEl6TVRJek5UazFPVm93ZXpFTApNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdNRWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFCkJ3d0hVMkZzWm05eVpERWFNQmdHQTFVRUNnd1JRMjl0YjJSdklFTkJJRXhwYldsMFpXUXhJVEFmQmdOVkJBTU0KR0VGQlFTQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUApBRENDQVFvQ2dnRUJBTDVBbmZSdTRlcDJoeHhOUlVTT3ZrYklnd2Fkd1NyK0dCK081QUw2ODZ0ZFVJb1dNUXVhCkJ0REZjQ0xOU1MxVVk4eTJibWhHQzFQcXkwd2t3THh5VHVyeEZhNzBWSm9TQ3NONnNqTmc0dHFKVmZNaVdQUGUKM00vdmc0YWlqSlJQbjJqeW1KQkdoQ2ZIZHIvanpEVXNpMTRIWkdXQ3dFaXdxSkg1WVo5MklGQ29rY2RtdGV0NApZZ05XOElvYUUrb3hveDZnbWYwNDl2WW5NbGh2Qi9WcnVQc1VLNiszcXN6V1kxOXpqTm9GbWFnNHFNc1hlRFpSCnJPbWU5SGc2amM4UDJVTGltQXlyTDU4T0FkN3ZuNWxKOFMzZnJIUk5HNWkxUjhYbEtkSDVrQmpIWXB5K2c4Y20KZXo2S0pjZkEzWjNtTldnUUlKMlAyTjdTdzRTY0RWN29MOGtDQXdFQUFhT0J3RENCdlRBZEJnTlZIUTRFRmdRVQpvQkVLSXo2VzhRZnM0cThwNzRLbGY5QXdwTFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3ZXdZRFZSMGZCSFF3Y2pBNG9EYWdOSVl5YUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHYKUVVGQlEyVnlkR2xtYVdOaGRHVlRaWEoyYVdObGN5NWpjbXd3TnFBMG9ES0dNR2gwZEhBNkx5OWpjbXd1WTI5dApiMlJ2TG01bGRDOUJRVUZEWlhKMGFXWnBZMkYwWlZObGNuWnBZMlZ6TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGCkFBT0NBUUVBQ0ZiOEF2Q2I2UCtrK3RaN3hrU0F6ay9FeGZZQVdNeW10cndVU1dnRWR1am03bDNzQWc5ZzFvMVEKR0U4bVRnSGo1ckNsN3IrOGRGUkJ2LzM4RXJqSFQxcjBpV0FGZjJDM0JVcno5dkhDdjhTNWRJYTJMWDFyek5MegpSdDB2eHVCcXc4TTBBeXg5bHQxYXdnNm5DcG5CQll1ckRDL3pYRHJQYkRkVkNZZmVVMEJzV08vOHRxdGxiZ1QyCkc5dzg0Rm9WeHA3WjhWbElNQ0ZsQTJ6czZTRno3SnNEb2VBM3JhQVZHSS82dWdMT3B5eXBFQk1zMU9VSUpxc2kKbDJENGtGNTAxS0thVTczeXFXamdvbTdDMTJ5eG93K2V2K3RvNTFieXJ2TGpLemc2Q1lHMWE0WFh2aTN0UHhxMwpzbVBpOVdJc2d0UnFBRUZROFRtRG41WHBOcGFZYmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVF1b1ZhZGlzIExpbWl0ZWQgT1U9Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1RdW9WYWRpcyBMaW1pdGVkIE9VPVJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EiCiMgU2VyaWFsOiA5ODUwMjY2OTkKIyBNRDUgRmluZ2VycHJpbnQ6IDI3OmRlOjM2OmZlOjcyOmI3OjAwOjAzOjAwOjlkOmY0OmYwOjFlOjZjOjA0OjI0CiMgU0hBMSBGaW5nZXJwcmludDogZGU6M2Y6NDA6YmQ6NTA6OTM6ZDM6OWI6NmM6NjA6ZjY6ZGE6YmM6MDc6NjI6MDE6MDA6ODk6NzY6YzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGE0OjVlOmRlOjNiOmJiOmYwOjljOjhhOmUxOjVjOjcyOmVmOmMwOjcyOjY4OmQ2OjkzOmEyOjFjOjk5OjZmOmQ1OjFlOjY3OmNhOjA3Ojk0OjYwOmZkOjZkOjg4OjczCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMERDQ0JMaWdBd0lCQWdJRU9yWlFpekFOQmdrcWhraUc5dzBCQVFVRkFEQi9NUXN3Q1FZRFZRUUdFd0pDClRURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWxNQ01HQTFVRUN4TWNVbTl2ZENCRFpYSjAKYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFdU1Dd0dBMVVFQXhNbFVYVnZWbUZrYVhNZ1VtOXZkQ0JEWlhKMAphV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd01UQXpNVGt4T0RNek16TmFGdzB5TVRBek1UY3hPRE16Ck16TmFNSDh4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01TVXcKSXdZRFZRUUxFeHhTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVM0d0xBWURWUVFERXlWUgpkVzlXWVdScGN5QlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF2MkcxbFZPNlYvejY4bWNMT2hyZkVZQmtsYlRSdk0xNnovWXAKbGk0a1ZFQWtPUGNhaGR4WVRNdWtKMEtYMEorRGlzUGtCZ05iQUtWUkhuQUVkT0xCMURxcjE2MDdCeGdGanYyRApyT3BtMlJnYmFJcjFWeHFZdXZYdGRqMTgyZDZVYWp0TEY4SFZqNzFsT0RxVjBEMVZOazdmZVZjeEtoN1lXV1ZKCldDQ1lmcXRmZnAvcDFrM3NnM1NweDJ6WTdpbEtoU29HRlBsVTV0UGFaUWVMWXpjUzE5RHN3M3NnUVVTajdjdWcKRitGeFpjNGRaakgzZGdFWnlIMERXTGFWU1IybUVpYm94Z3gyNE9ObXkrcGRwaWJ1NWN4ZnZXZW5BU2NPb3NwVQp4YkY2bFIxeEhrb3BpZ1BjYWtYQnBCbGViemJOdzZLd3QvNWNPT0pTdlBoRVErYVF1d0lEQVFBQm80SUNVakNDCkFrNHdQUVlJS3dZQkJRVUhBUUVFTVRBdk1DMEdDQ3NHQVFVRkJ6QUJoaUZvZEhSd2N6b3ZMMjlqYzNBdWNYVnYKZG1Ga2FYTnZabVp6YUc5eVpTNWpiMjB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekNDQVJvR0ExVWRJQVNDQVJFdwpnZ0VOTUlJQkNRWUpLd1lCQkFHK1dBQUJNSUg3TUlIVUJnZ3JCZ0VGQlFjQ0FqQ0J4eHFCeEZKbGJHbGhibU5sCklHOXVJSFJvWlNCUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsSUdKNUlHRnVlU0J3WVhKMGVTQmgKYzNOMWJXVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJSFJvWlc0Z1lYQndiR2xqWVdKc1pTQnpkR0Z1WkdGeQpaQ0IwWlhKdGN5QmhibVFnWTI5dVpHbDBhVzl1Y3lCdlppQjFjMlVzSUdObGNuUnBabWxqWVhScGIyNGdjSEpoClkzUnBZMlZ6TENCaGJtUWdkR2hsSUZGMWIxWmhaR2x6SUVObGNuUnBabWxqWVhSbElGQnZiR2xqZVM0d0lnWUkKS3dZQkJRVUhBZ0VXRm1oMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhNdVltMHdIUVlEVlIwT0JCWUVGSXRMYmUzVApLYmtHR2V3NU9hbndsNFJxeSsvZk1JR3VCZ05WSFNNRWdhWXdnYU9BRkl0TGJlM1RLYmtHR2V3NU9hbndsNFJxCnkrL2ZvWUdFcElHQk1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXAKZEdWa01TVXdJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRApWUVFERXlWUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnUTZ0bENMCk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWl0UVV0ZjcwbXBLbkdkU2sKZm5JWWo5bG9mRklrM1dkdk9YckVxbDQ5NGxpd1RYQ1loR0hvRytOcEdBN08rMGRRb0U3LzhDUWZ2YkxPOVNmOAo3QzlUcW5ON0F6MTBidVlXbnV1bExzUy9WaWRRSzJLNnZrc2NQRlZjUVIwa3ZvSWdSMTNWUkg1NkZtamZmVTFSCmNIaFhIVE1lL1FLWm5Bek5DZ1ZQeDd1T3BIWDZTbTJ4Z0k0SlZybWNHbUQrWGNIWGV0d1JlTkRXWGNHMzFhMHkKbVFNNmlzeFVKVGt4Z1hzVElsRzZSbXlodTU3NkJHeEpKblNQMG5QcnpEQ2k1dXBaSW9mNGwvVU8vZXJNa3FRVwp4RklZNmlIT3NmSG1oSUhsdXFtR0tQSkRXbDBTbmF3ZTJhamxDbXFuZjZDSEtjL3lpVTNVN01YaTVuclFOaU9LClNuUTIrUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDIgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAyIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAyIgojIFNlcmlhbDogMTI4OQojIE1ENSBGaW5nZXJwcmludDogNWU6Mzk6N2I6ZGQ6Zjg6YmE6ZWM6ODI6ZTk6YWM6NjI6YmE6MGM6NTQ6MDA6MmIKIyBTSEExIEZpbmdlcnByaW50OiBjYTozYTpmYjpjZjoxMjo0MDozNjo0Yjo0NDpiMjoxNjoyMDo4ODo4MDo0ODozOToxOTo5Mzo3YzpmNwojIFNIQTI1NiBGaW5nZXJwcmludDogODU6YTA6ZGQ6N2Q6ZDc6MjA6YWQ6Yjc6ZmY6MDU6Zjg6M2Q6NTQ6MmI6MjA6OWQ6Yzc6ZmY6NDU6Mjg6Zjc6ZDY6Nzc6YjE6ODM6ODk6ZmU6YTU6ZTU6YzQ6OWU6ODYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ0ekNDQTUrZ0F3SUJBZ0lDQlFrd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHgKR1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ01qQWVGdzB3TmpFeE1qUXhPREkzTURCYUZ3MHpNVEV4TWpReE9ESXpNek5hTUVVeEN6QUpCZ05WCkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVcKWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDYQpHTXBMbEEwQUxhOERLWXJ3RDRISXJrd1poUjBJbjZzcFJJWHpMNEd0TWg2UVJyK2poaVlhSHY1K0hCZzZYSnhnCkZ5bzZkSU16TUgxaFZCSEw3YXZnNXRLaWZ2VnJieGkzQ2dzdC9lays3d3JHc3hEcDNNSkdGL2hkL2FUYS81NUoKV3B6bU0rWWtsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQgpycmNDYW9GNnFVV0Q0Z1htdVZiQmxEZVBTSEZqSXV3WFpRZVZpa3ZmajhaYUN1V3c0MTllYXhHckRQbUY2MFRwCitBUno4dW4rWEppTTlYT3ZhN1IremRSY0FpdE1PZUd5bFpVdFFvZlgxYk9RUTdkc0UvSGUzZmJFK0lrLzBYWDEKa3NPUjFZcUkwSkRzM0czZWljSmxjWmFMRFFQOW5MOWJGcXlTMityK2VYeXQ2Ni8zRnN2YnpTVXI1Ui83bXAvaQpVY3c2VXd4STVnNjl5YlIyQmxMbUVST0ZjbU1EQk9BRU5pc2dHUUxvZEtjZnRzbFdadkIxSmR4bndRNWhZSWl6ClB0R28vS1BhSGJEUnNTTlUzMFIyYmUxQjJNR3lJclpUSE44MUhkeWhkeW94NUMzMTVlWGJ5T0QvNVlEWEMyT2cKL3pPaEQ3b3NGUlhxbDdQU29yVys4b3lXSGhxUEhXeWtZVGU1aG5NejE1ZVduaU45Z3FSTWdlS2gwYnBuWDVVSApveWNSN2hZUWU3eEZTa3l5Qk5Lcjc5WDlERkhPVUdvSU1mbVIyZ3lQWkZ3RHd6cUxJRDl1aldjOU90YitmVnVJCnlWNzd6R0hjaXpOMzAwUXlOUWxpQkpJV0VOaWVKMGY3T3lIaitPc2RXd0lEQVFBQm80R3dNSUd0TUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0N3WURWUjBQQkFRREFnRUdNQjBHQTFVZERnUVdCQlFhaEdLOFNFd3pKUVRVN3REMgpBOFFaUnRHVWF6QnVCZ05WSFNNRVp6QmxnQlFhaEdLOFNFd3pKUVRVN3REMkE4UVpSdEdVYTZGSnBFY3dSVEVMCk1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVQKRWxGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTW9JQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBRDRLRmsyZgpCbHVvcm5GZEx3VXZaK1lUUllQRU52Ynp3Q1lNRGJWSFpGMzR0SExKUnFVREdDZFZpWGg5ZHVxV05JQVhJTnpuCmcvaU4vQWU0Mmw5TkxtZXloUDNaUlB4M1VJSG1mTFRKRFF0eVUvaDJCd2RCUjVZTSsrQ0NKcE5WalA0aUgyQmwKZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtVmpCM3BqZDRNMUlRV0s0L1lZN3lhckh2R0g1SwpXV1BLamFKVzFhY3Z2RllmenpuQjR2c0txQlVzZlUxNlk4WnNsMFE4MG0vRFNoY0srSkRTVjZJWlVhVXRsMEhhCkIwK3BVTnFRalpSRzRUN3dsUDBRQURqMU8raEE0YlJ1VmhvZ3pHOVlqZTB1UlkvVzZaTS81N0VzM3pyV0lvemMKaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUgpUVUlaM1BoMVdWYWorYWhKZWZpdkRya1JvSHkzYXUwMDBMWW1ZamdhaHd6NDZQMHUwNUIvQjVFcUhkWitYSVdECm1iQTRDRC9wWHZrMUIrVEpZbTVYZjZkUWxmZTZ5SnZtanFJQnhkWm12M2xoOHp3YzRibUNYRjJndytuWVNMMFoKb2hFVUdXNnloaHRvUGtnM0dvaTNYWlplbk1mdkoySUk0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eQo0YU9USGN5S0psb0pPTkRPMXcyQUZyUjRwVHFIVEkyS3BkVkdsL0lzRUxtOFZDTEFBVkJwUTU3MHN1OXQrT3phCjhlT3g3OStSajFRcUN5WEJKaG5FVWhBRlpkV0NFT3JDTWMwdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAzIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMyIKIyBTZXJpYWw6IDE0NzgKIyBNRDUgRmluZ2VycHJpbnQ6IDMxOjg1OjNjOjYyOjk0Ojk3OjYzOmI5OmFhOmZkOjg5OjRlOmFmOjZmOmUwOmNmCiMgU0hBMSBGaW5nZXJwcmludDogMWY6NDk6MTQ6Zjc6ZDg6NzQ6OTU6MWQ6ZGQ6YWU6MDI6YzA6YmU6ZmQ6M2E6MmQ6ODI6NzU6NTE6ODUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE4OmYxOmZjOjdmOjIwOjVkOmY4OmFkOmRkOmViOjdmOmUwOjA3OmRkOjU3OmUzOmFmOjM3OjVhOjljOjRkOjhkOjczOjU0OjZiOmY0OmYxOmZlOmQxOmUxOjhkOjM1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHblRDQ0JJV2dBd0lCQWdJQ0JjWXdEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4CkdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNekFlRncwd05qRXhNalF4T1RFeE1qTmFGdzB6TVRFeE1qUXhPVEEyTkRSYU1FVXhDekFKQmdOVgpCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXCllXUnBjeUJTYjI5MElFTkJJRE13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRE0KVjBJV1ZKem1tTlBUVGU3KzdjZWZRemxLWmJQb0ZvZzAydzFaa1hUUGtyZ0VRSzBDU3pHcnZJMlJhTmdnRGhvQgo0aHA3VGhkZDRvcTNQNWthemV0aHE4SmxwaCszdDcyM2ovejljSThMb0dlK0FhSlp6M0htRHlsMi83RldlVVVyCkg1NTZWT2lqS1RWb3BBRlBENlF1Tis4YnYrT1BFS2h5cTFoWDUxU0d5TW56VzlvczJsMk9ianlqUHRyN2d1WGQKOGx5eUJUTnZpamJPMEJOTy83OUtERFJNcHNNaHZWQUVWZXV4dTUzN1JSNWtGZDVWQVl3Q2RyWExvVDlDYWJ3dgp2V2hERmxhSktqZGhrZjJtcms3QXl4UmxsRGRMa2didkJOREluSWpiQzN1QnI3RTlLc1JsT25pMjd0eUFzZExUCm1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwcDVpakpVTXY3L0ZmSnVHSVRmaGUKYnRmWkZHNFpNMm1uTzRTSms4UlRWUk9oVVhoQStMakpvdTU3dWxKQ2c1NFU3UVZTV2xsV3A1ZjhuVDhLS2RqYwpUNUVPRTd6ZWxhVGZpNW0rckpzemlPKzFnYThieGlKVHlQYkg3cGNVc01WOGVGTEk4TTV1ZDJDRXB1a3FkaUR0CldBRVhNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFoKYzZ0c2dMam9DMlNUb0p5TUdmK3owZ3pza1NhSGlyT2k0WENQTEFybHpXMW9VZXZhUHdWL2l6TG1FMXhyL2w5QQo0aUxJdExSa1Q5YTZmVWcrcUdrTTE3dUdjY2x6dUQ4N25TVkwydjlBNndJREFRQUJvNElCbFRDQ0FaRXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekNCNFFZRFZSMGdCSUhaTUlIV01JSFRCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUcKQ0NzR0FRVUZCd0lDTUlHR0dvR0RRVzU1SUhWelpTQnZaaUIwYUdseklFTmxjblJwWm1sallYUmxJR052Ym5OMAphWFIxZEdWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElGRjFiMVpoWkdseklGSnZiM1FnUTBFZ015QkRaWEowCmFXWnBZMkYwWlNCUWIyeHBZM2tnTHlCRFpYSjBhV1pwWTJGMGFXOXVJRkJ5WVdOMGFXTmxJRk4wWVhSbGJXVnUKZEM0d0xRWUlLd1lCQlFVSEFnRVdJV2gwZEhBNkx5OTNkM2N1Y1hWdmRtRmthWE5uYkc5aVlXd3VZMjl0TDJOdwpjekFMQmdOVkhROEVCQU1DQVFZd0hRWURWUjBPQkJZRUZQTEFFK0NDUXo3NzdpOW5NcFkxWE51NHl3TFFNRzRHCkExVWRJd1JuTUdXQUZQTEFFK0NDUXo3NzdpOW5NcFkxWE51NHl3TFFvVW1rUnpCRk1Rc3dDUVlEVlFRR0V3SkMKVFRFWk1CY0dBMVVFQ2hNUVVYVnZWbUZrYVhNZ1RHbHRhWFJsWkRFYk1Ca0dBMVVFQXhNU1VYVnZWbUZrYVhNZwpVbTl2ZENCRFFTQXpnZ0lGeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQVQ2MmdMRXo2d1BKdjkyWlZxeU0wCjd1Y3Ayc05idHJDRDJkRFE0aUg3ODJDbk8xMWdVeWVpbS9ZSUlpcm52NkJ5NVp3a2FqR3hrSG9uMjRRUmlTZW0KZDFvNDE3K3Nodnp1WFlPOEJzYlJkMnNQYlNRdlMzcHNwd2VXeXVPRW42MklpeDJyRm8xYlpoZlpGdlNMZ05MZAorTEoydy93NEU2b00za0pwSzI3elBPdUFKOXYxcGtRTm4xcFZXUXZWRFZKSXhhNmY4aStBeGVveVVEVVNseTdCCjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyUGIraVN3d1FIWWFaVEtyemNoR1Q1T3IybTlxb1hhZE4KdDU0Q3JuTUF5Tm9qQStqNTZobDBZZ0NVeXlJZ3ZwU25XYldDYXI2WmVYcXA4a29rVXZkMC9icE81cWdkQW02eApEWUJFd2E3VEl6ZGZ1NFY4SzVJdTZINmxpOTJaNGI4bmJ5MWRxbnVIL2dyZFMveU85U2JrYm5CQ2JqUHNNWjU3Cms4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnMKekhYdWcvV3dZam5QYkZmaVROS1JDdzUxS0J1YXYvMGFRL0hLZC9zN2oyRzRhU2dXUWdSZWNDb2NJZGlQNGIwagpXeTEwUUpMWll4a05jOTFwdkdKSHZPQjBLN0xyZmI1Qkc3WEFSc1doSXN0ZlRzRW9rdDRZdXRVcUtMc1JpeGVUCm1KbGdsRndqejFvbmwxNExCUWFUTng0N2FUYnJxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEsKNFNWaE03SlpHK0p1MXpkWHRnMnBFdG89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVNFQ09NIFRydXN0Lm5ldCBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEKIyBTdWJqZWN0OiBPPVNFQ09NIFRydXN0Lm5ldCBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEKIyBMYWJlbDogIlNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdCBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IGYxOmJjOjYzOjZhOjU0OmUwOmI1OjI3OmY1OmNkOmU3OjFhOmUzOjRkOjZlOjRhCiMgU0hBMSBGaW5nZXJwcmludDogMzY6YjE6MmI6NDk6Zjk6ODE6OWU6ZDc6NGM6OWU6YmM6Mzg6MGY6YzY6NTY6OGY6NWQ6YWM6YjI6ZjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGU3OjVlOjcyOmVkOjlmOjU2OjBlOmVjOjZlOmI0OjgwOjAwOjczOmE0OjNmOmMzOmFkOjE5OjE5OjVhOjM5OjIyOjgyOjAxOjc4Ojk1Ojk3OjRhOjk5OjAyOjZiOjZjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEV2pDQ0FrS2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCUU1Rc3dDUVlEVlFRR0V3SktVREVZCk1CWUdBMVVFQ2hNUFUwVkRUMDBnVkhKMWMzUXVibVYwTVNjd0pRWURWUVFMRXg1VFpXTjFjbWwwZVNCRGIyMXQKZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3SGhjTk1ETXdPVE13TURReU1EUTVXaGNOTWpNd09UTXdNRFF5TURRNQpXakJRTVFzd0NRWURWUVFHRXdKS1VERVlNQllHQTFVRUNoTVBVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEClZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFd2dnRWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDenMvNS8wMjJ4N3haOFY2VU1iWGFLTDB1L1pQdE03b3J3OHlsOAo5Zi91S3VEcDZicGJaQ0thbW04c09pWnBVUVdaSnR6VkhHcHh4cHA5SHAzZGZHekdqR2RuU2o3NGNiQVpKNmtKCkRLYVZ2MHVNRFBwVm1Edlk2Q0toUzNFNGVheVhrbW16aVg3cUlXZ0dtQlNXaDlKaE5yeHRKMWFlVis3QXdGYjkKTXMrazJZN0NJOWVOcVBQWUpheVg1SEE0OUxZNnRKMDdseVpEbzZHOFNWbHlUQ013aHdGWTlrNitIR2hXWnEvTgpRVjNJczAwcVZVYXJIOW9lNGtBOTI4MTl1WktBbkRmZERKWmtuZHdpOTJTTDMySGVGWlJTRmFCOVVzbExxQ0hKCnhySHR5OE9WWU5FUDhLdHcrTi9MVFg3czF2cXIyYjEvVlBLbDZYbjYyZFoySkNoekFnTUJBQUdqUHpBOU1CMEcKQTFVZERnUVdCQlNnYzBtWmFOeUZXMlhqbXlndlY1KzlNN3dIU0RBTEJnTlZIUThFQkFNQ0FRWXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBYUVDcHFMdmtUMTE1c3dXMUY3TmdFK3ZHCmtsM2cwZE5xL3Z1K20yMi94d1Z0V1NERUhQQzMyb1JZQW1QNlNCYnZUNlVMOTBxWThqK2VHNjFIYTJQT0NFZnIKVWo5NG5LOU5ydmpWVDgrYW1Db1FRVGxTeE4zWm13N3Zrd0d1c2k3S2FFSWtRbXl3c3pvK3plbmFTTVFWeStuNQpCdytTVUVtSzNUR1hYOG5wTjZvN1dXV1hsRExKczU4K09tSll4VW10WWc1eHBUS3FMOGFKZGtOQUV4Tm5QYUpVCkpSREw4VHJ5MmZyYlNWYTdwdjZuUVRYRDRJaGh5WWpIM3pZUUlwaFo2ckJLKzFZV2MyNnNUZmNpb1UrdEhYb3QKUlNmbE1NRmU4dG9UeXlWQ1VaVkhBNHhzSWN4MFF1MVQvek9Manc5WEFSWXZ6NmJ1eVhBaUZMMzl2bXdMQXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U29uZXJhIENsYXNzMiBDQSBPPVNvbmVyYQojIFN1YmplY3Q6IENOPVNvbmVyYSBDbGFzczIgQ0EgTz1Tb25lcmEKIyBMYWJlbDogIlNvbmVyYSBDbGFzcyAyIFJvb3QgQ0EiCiMgU2VyaWFsOiAyOQojIE1ENSBGaW5nZXJwcmludDogYTM6ZWM6NzU6MGY6MmU6ODg6ZGY6ZmE6NDg6MDE6NGU6MGI6NWM6NDg6NmY6ZmIKIyBTSEExIEZpbmdlcnByaW50OiAzNzpmNzo2ZDplNjowNzo3Yzo5MDpjNTpiMTozZTo5MzoxYTpiNzo0MToxMDpiNDpmMjplNDo5YToyNwojIFNIQTI1NiBGaW5nZXJwcmludDogNzk6MDg6YjQ6MDM6MTQ6YzE6Mzg6MTA6MGI6NTE6OGQ6MDc6MzU6ODA6N2Y6ZmI6ZmM6Zjg6NTE6OGE6MDA6OTU6MzM6NzE6MDU6YmE6Mzg6NmI6MTU6M2Q6ZDk6MjcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJRENDQWdpZ0F3SUJBZ0lCSFRBTkJna3Foa2lHOXcwQkFRVUZBREE1TVFzd0NRWURWUVFHRXdKR1NURVAKTUEwR0ExVUVDaE1HVTI5dVpYSmhNUmt3RndZRFZRUURFeEJUYjI1bGNtRWdRMnhoYzNNeUlFTkJNQjRYRFRBeApNRFF3TmpBM01qazBNRm9YRFRJeE1EUXdOakEzTWprME1Gb3dPVEVMTUFrR0ExVUVCaE1DUmtreER6QU5CZ05WCkJBb1RCbE52Ym1WeVlURVpNQmNHQTFVRUF4TVFVMjl1WlhKaElFTnNZWE56TWlCRFFUQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKQVhTaldkeXZBTmxzZEUraFkzL0VpOXZYK0FMVFU3NFcrbwpaNm0vQXh4TmpHOHlSOVZCYUtRVEJNRTFESnFFUS94Y0hmK0pzK2dYR00yUlgvdUo0K3EvVGwxOEd5YlRkWG50CjVvVGpWK1d0S2NUME9pam5wWHVFTm1tei9WNTJ2YU10bWRPUVRpTW9mUmhqOFZRN0pwMTJXNWRDc3YrdThFN3MKM1RtVlRvTUdmK2RKUU1qRkFiSlVXbVlkUGZ6NTZUd0tub0c0Y1BBQmkrUWpWSHpJcnZpUUhnQ1djdFJVejJFagp2T3I3blFLVjBiYTVjVHBwQ0Q4UHRPRkN4NGoxUDVpb3A3b2M0SEZ4NzFoWGdWQjZYR3QwUmc2REE1akRqcWh1CjhuWXliaWVEd25QejNCam90SlBxZFVSckJHQWdjVmVIbmZPK29KQWpQWW9rNGRvaDI4TUNBd0VBQWFNek1ERXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFSQmdOVkhRNEVDZ1FJU3FDcVdJVFRYand3Q3dZRFZSMFBCQVFEQWdFRwpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJhem9mNUZuSVZWMHNkMlp2bm9pWXc3Sk5uMzlZdDBqU3Y5emlsCnpxc1d1YXN2ZkRYTHJOQVB0RXdyL0lEdmE0eVJYeloyOTl1ekd4bnE5TElSL1dGeFJMOG9zem9kdjdORDZKKy8KM0RFSWNiQ2RqZFkwUnpLUXhtVWs5NkJLZkFSemp6bHZGNHh5dGIxTHlIcjRlNFBES0U2Y0NlcG5QN0puQkJ2RApGTnI0NTBra2tkQWRhdnBoT2U5cjV5RjFCZ2ZZRXJRaElIQkNjWUhhUEpvMnZxWmJEV3BzbWgrUmUvbjU3MEs2ClRrNmV6QXlObE56WlJaeGU3RUpRWTY3MFhjU3hFdHpLTzZndW5SUmFCWFczN05kajRybzF0Z1FJa2VqYW5aejIKWnJVWXJBcW1WQ1kwTTlJYndkUi9HanFPQzZveWJ0djhUeVdmMlRMSGxscHdyTjlNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1YUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1YUmFtcCBTZWN1cml0eSBTZXJ2aWNlcyBJbmMgT1U9d3d3LnhyYW1wc2VjdXJpdHkuY29tCiMgU3ViamVjdDogQ049WFJhbXAgR2xvYmFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89WFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jIE9VPXd3dy54cmFtcHNlY3VyaXR5LmNvbQojIExhYmVsOiAiWFJhbXAgR2xvYmFsIENBIFJvb3QiCiMgU2VyaWFsOiAxMDcxMDg5MDg4MDM2NTE1MDk2OTI5ODAxMjQyMzM3NDUwMTQ5NTcKIyBNRDUgRmluZ2VycHJpbnQ6IGExOjBiOjQ0OmIzOmNhOjEwOmQ4OjAwOjZlOjlkOjBmOmQ4OjBmOjkyOjBhOmQxCiMgU0hBMSBGaW5nZXJwcmludDogYjg6MDE6ODY6ZDE6ZWI6OWM6ODY6YTU6NDE6MDQ6Y2Y6MzA6NTQ6ZjM6NGM6NTI6Yjc6ZTU6NTg6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNlOmNkOmRjOjkwOjUwOjk5OmQ4OmRhOmRmOmM1OmIxOmQyOjA5OmI3OjM3OmNiOmUyOmMxOjhjOmZiOjJjOjEwOmMwOmZmOjBiOmNmOjBkOjMyOjg2OmZjOjFhOmEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTURDQ0F4aWdBd0lCQWdJUVVKUnM3QmpxMVp4TjFaZnZkWStnclRBTkJna3Foa2lHOXcwQkFRVUZBRENCCmdqRUxNQWtHQTFVRUJoTUNWVk14SGpBY0JnTlZCQXNURlhkM2R5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWsKTUNJR0ExVUVDaE1iV0ZKaGJYQWdVMlZqZFhKcGRIa2dVMlZ5ZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWQpVbUZ0Y0NCSGJHOWlZV3dnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURReE1UQXhNVGN4Ck5EQTBXaGNOTXpVd01UQXhNRFV6TnpFNVdqQ0JnakVMTUFrR0ExVUVCaE1DVlZNeEhqQWNCZ05WQkFzVEZYZDMKZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFa01DSUdBMVVFQ2hNYldGSmhiWEFnVTJWamRYSnBkSGtnVTJWeQpkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNZSkI2OUZiUzYKMzhlTXBTZTJPQXRwODdaT3FDd3VJUjFjUk44aFhYNGpkUDVlZnJSS3Q2YXRINjdnQmhiaW0xdlpaM1JyWFlDUApLWjJHRzltY0RaaHRkaEFvV09SbHNIOUttSG1mNE1NeGZvQXJ0WXpBUURzUmh0RExvb1kyWUtUVk1JSnQyVzdRCkR4SUVNNWRmVDJGYThPVDVrYXZuSFR1ODZNLzBheTAwZk9KSVlSeU84MkZFekcrZ1NxbVVzRTNhNTZrMGVuSTQKcUVITVBKUVJmZXZJcG95M2hzdktNenZaUFRlTCszbytoaXpuYzljS1Y2eGtteG5yOUE4RUNJcXNBeGNaWlBSYQpKU0tOTkN5eTltZ2RFbTNUaWg0VTJzU1BwdUlqaGRWNkRiMXE0T25zN0JlN1FodG5xaVh0UllNaC9NSEpmTlZpClB2cnl4UzNUL2RSbEFnTUJBQUdqZ1o4d2dad3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFAKQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTVpQb2owR1k0UUpuTTVpNUFTcwpqVnkxNmJZYk1EWUdBMVVkSHdRdk1DMHdLNkFwb0NlR0pXaDBkSEE2THk5amNtd3VlSEpoYlhCelpXTjFjbWwwCmVTNWpiMjB2V0VkRFFTNWpjbXd3RUFZSkt3WUJCQUdDTnhVQkJBTUNBUUV3RFFZSktvWklodmNOQVFFRkJRQUQKZ2dFQkFKRVZPUU1CRzJmN1NoejVDbUJib2RwTmwyTDVKRk1uMTRKa1RwQXV3MGtiSzVyYy9LaDRaelh4SGZBUgp2YmRJNHhEMkRkOC8wc20ycWxXa1NMb0MyOTVaTGhWYk81MFdmVWZYTitwZlRYWVNOcnNmMTZHQkJFWWdveXh0CnFaNEJmajhwemdDVDMvM0prbk9KaVdTZTV5dmtISkVzMHJuT2ZjNXZNWm5UNXI3U0hwRHdDUlI1WENPclRkTGEKSVI5Tm1YbWQ0YzhubnhDYkhJZ05zSXBrUVRHNERteVFKS1NiWEhHUHVydCtIQnZiYW9BUElienAyNmEzUVBTeQppNm14NU8rYUd0QTlhWm51cUNpajRUeXo4TElSbk05OFFPYmQ1ME45b3RnNnRhbU44alNaeE5RUTRRYjlDWVFRCk8rN0VUUFRzSjN4Q3duUjhnb29KeWJRREpidz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuIE9VPUdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPVRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLiBPVT1HbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJHbyBEYWRkeSBDbGFzcyAyIENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogOTE6ZGU6MDY6MjU6YWI6ZGE6ZmQ6MzI6MTc6MGM6YmI6MjU6MTc6MmE6ODQ6NjcKIyBTSEExIEZpbmdlcnByaW50OiAyNzo5NjpiYTplNjozZjoxODowMTplMjo3NzoyNjoxYjphMDpkNzo3Nzo3MDowMjo4ZjoyMDplZTplNAojIFNIQTI1NiBGaW5nZXJwcmludDogYzM6ODQ6NmI6ZjI6NGI6OWU6OTM6Y2E6NjQ6Mjc6NGM6MGU6YzY6N2M6MWU6Y2M6NWU6MDI6NGY6ZmM6YWM6ZDI6ZDc6NDA6MTk6MzU6MGU6ODE6ZmU6NTQ6NmE6ZTQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVBRENDQXVpZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJqTVFzd0NRWURWUVFHRXdKVlV6RWgKTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNUlFZHliM1Z3TENCSmJtTXVNVEV3THdZRFZRUUxFeWhIYnlCRQpZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBME1EWXlPVEUzCk1EWXlNRm9YRFRNME1EWXlPVEUzTURZeU1Gb3dZekVMTUFrR0ExVUVCaE1DVlZNeElUQWZCZ05WQkFvVEdGUm8KWlNCSGJ5QkVZV1JrZVNCSGNtOTFjQ3dnU1c1akxqRXhNQzhHQTFVRUN4TW9SMjhnUkdGa1pIa2dRMnhoYzNNZwpNaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBU0F3RFFZSktvWklodmNOQVFFQkJRQURnZ0VOCkFEQ0NBUWdDZ2dFQkFONmQxK3BYR0VtaFcrdlhYMGlHNnI3ZC8rVHZaeHowWldpelYzR2dYbmU3N1p0SjZYQ0EKUFZZWVl3aHYydkxNMEQ5L0FsUWlWQkRZc29IVXdIVTlTMy9IZDhNK2VLc2FBN1VnYXk5cUs3SEZpSDdFdXg2dwp3ZGhGSjIrcU4xajNoeWJYMkMzMnFSZTNIM0kyVHFZWFAyV1lrdHNxYmwyaS9vamdDOTUvNVkwVjRldkxPdFhpCkVxSVRMZGlPcjE4U1BhQUlCUWkyWEtWbE9BUkZtUjZqWUdCMHhVR2xjbUliWXNVZmIxOGFRcjRDVVdXb3JpTVkKYXZ4NEE2bE5mNEREK3F0YS9LRkFwTW9aRnY2eXlPOWVjdzN1ZDcyYTlubVl2TEVIWjZJVkRkMmdXTVpFZXdvKwpZaWhmdWtFSFUxalBFWDQ0ZE1YNC83VnBrSStFZE9xWEc2OENBUU9qZ2NBd2diMHdIUVlEVlIwT0JCWUVGTkxFCnNOS1IxRXdSY2JOaHl6MmgvdDJvYXRUak1JR05CZ05WSFNNRWdZVXdnWUtBRk5MRXNOS1IxRXdSY2JOaHl6MmgKL3Qyb2F0VGpvV2VrWlRCak1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNQpJRWR5YjNWd0xDQkpibU11TVRFd0x3WURWUVFMRXloSGJ5QkVZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqCllYUnBiMjRnUVhWMGFHOXlhWFI1Z2dFQU1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQUQKZ2dFQkFESkw4N0xLUHBIOEVzYWhCNHlPZDZBekJoUmNrQjRZOXdpbVBRb1orWWVBRVc1cDVKWVhNUDgwa1dOeQpPTzdNSEFHakhaUW9wREgyZXNSVTEvYmxNVmdEb3N6T1l0dVVSWE8xdjBYSkpMWFZnZ0t0STNscGpiaTJUYzdQClRNb3pJK2djaUtxZGkwRnVGc2tnNVltZXpUdmFjUGQrbVNZZ0ZGUWxxMjV6aGVhYklaMEtiSUlPcVBqQ0RQb1EKSG15Vzc0Y054QTloaTYzdWd5dVYrSTZTaEhJNTZ5RHFnKzJEelpkdUNMenJUaWEyY3l2azAvWk0vaVp4NG1FUgpkRXIvVnhxSEQzVklMczlSYVJlZ0FoSmhsZFhSUUxJUVRPN0VyQkJEcHFXZUN0V1ZZcG9OejRpQ3hUSU01Q3VmClJlWU5ueWljc2JrcVdsZXROdyt2SFgvYnZaOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLiBPVT1TdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLiBPVT1TdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiU3RhcmZpZWxkIENsYXNzIDIgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiAzMjo0YTo0YjpiYjpjODo2Mzo2OTo5YjpiZTo3NDo5YTpjNjpkZDoxZDo0NjoyNAojIFNIQTEgRmluZ2VycHJpbnQ6IGFkOjdlOjFjOjI4OmIwOjY0OmVmOjhmOjYwOjAzOjQwOjIwOjE0OmMzOmQwOmUzOjM3OjBlOmI1OjhhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNDo2NTpmYToyMDo1Mzo5NzpiODo3NjpmYTphNjpmMDphOTo5NTo4ZTo1NTo5MDplNDowZjpjYzo3ZjphYTo0ZjpiNzpjMjpjODo2Nzo3NToyMTpmYjo1ZjpiNjo1OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUR6Q0NBdmVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbApNQ01HQTFVRUNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wClUzUmhjbVpwWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXcKTmpJNU1UY3pPVEUyV2hjTk16UXdOakk1TVRjek9URTJXakJvTVFzd0NRWURWUVFHRXdKVlV6RWxNQ01HQTFVRQpDaE1jVTNSaGNtWnBaV3hrSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFeU1EQUdBMVVFQ3hNcFUzUmhjbVpwClpXeGtJRU5zWVhOeklESWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnRWdNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRFFBd2dnRUlBb0lCQVFDM01zais2WEdtQklXdERCRmszODVONzhnREdJYy9vYXY3UEthZgo4TU9oMnRUWWJpdFRrUHNrcEQ2RThKN29YK3psSjBUMUtLWS9lOTdnS3ZESXIxTXZuc29GQVpNZWoyWWNPYWROCitscTJjd1FsWnV0M2YrZFp4a3FaSlJSVTZ5Ykg4MzhaMVRCd2o2K3dSaXIvcmVzcDdkZWZxZ1NIbzlUNWlhVTAKWDl0RGtZSTIyV1k4c2JpNWd2MmNPajRReUR2dkJtVm1lcHNaR0QzL2NWRThNQzVmdmoxM2M3SmRCbXpESTFhYQpLNFVta2h5bkFyUGtQdzJ2Q0htQ3VEWTk2cHpUTmJPOGFjcjF6SjNvL1dTTkY0QXpibDVLWFpuSkhvZTBuUnJBCjFXNFROU05lMzV0ZlBlL1c5M2JDNmo2N2VBMGNRbWRyQk5qNDF0cHZpL0pFb0FHckFnRURvNEhGTUlIQ01CMEcKQTFVZERnUVdCQlMvWDdmUnp0MGZodlJiVmF6YzF4RENEcW1JNXpDQmtnWURWUjBqQklHS01JR0hnQlMvWDdmUgp6dDBmaHZSYlZhemMxeERDRHFtSTU2RnNwR293YURFTE1Ba0dBMVVFQmhNQ1ZWTXhKVEFqQmdOVkJBb1RIRk4wCllYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFzVEtWTjBZWEptYVdWc1pDQkQKYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnRUFNQXdHQTFVZEV3UUZNQU1CQWY4dwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVdkUDRpZDBja2FWYUdzYWZQeldkcWJBWWNhVDFlcG9Ya0pLdHYzCkw3SWV6TWRlYXRpRGg2R1g3MGsxUG5jR1FWaGl2NDVZdUFwblAreXozU0ZtSDhsVStuTE1QVXhBMklHdmQ1NkQKZXJ1aXgvVTBGNDdaRVVEMC9Dd3FUUlYvcDJKZExpWFRBQXNnR2gxbytSZTQ5TDJMN1NoWjNVMFdpeGVEeUxKbAp4eTE2cGFxOFU0WnQzVmVreXZnZ1FRdG84UFQ3ZEw1V1hYcDU5ZmtkaGVNdGxiNzFjWkJEekkwZm1nQUtoeW5wClZTSllBQ1BxNHhKREtWdEhDTjJNUVdwbEJxamxJYXBCdEpVaGxibDkwVFNyRTlhdHZOemlQVG5OdlQ1MWNLRVkKV1FQSklyU1BuTlZlS3RlbHR0UUtiZmkzUUJGR21oOTVEbUsvRDVmczRDOGZGNVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUdvdmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89R292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJUYWl3YW4gR1JDQSIKIyBTZXJpYWw6IDQyMDIzMDcwODA3NzA4NzI0MTU5OTkxMTQwNTU2NTI3MDY2ODcwCiMgTUQ1IEZpbmdlcnByaW50OiAzNzo4NTo0NDo1MzozMjo0NToxZjoyMDpmMDpmMzo5NTplMToyNTpjNDo0Mzo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGY0OjhiOjExOmJmOmRlOmFiOmJlOjk0OjU0OjIwOjcxOmU2OjQxOmRlOjZiOmJlOjg4OjJiOjQwOmI5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3NjowMDoyOTo1ZTplZjplODo1Yjo5ZToxZjpkNjoyNDpkYjo3NjowNjoyYTphYTphZTo1OTo4MTo4YTo1NDpkMjo3Nzo0YzpkNDpjMDpiMjpjMDoxMTozMTplMTpiMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNqQ0NBMXFnQXdJQkFnSVFINTFaV3RjdndnWkVwWUFJYWVOZTlqQU5CZ2txaGtpRzl3MEJBUVVGQURBLwpNUXN3Q1FZRFZRUUdFd0pVVnpFd01DNEdBMVVFQ2d3blIyOTJaWEp1YldWdWRDQlNiMjkwSUVObGNuUnBabWxqCllYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQXlNVEl3TlRFek1qTXpNMW9YRFRNeU1USXdOVEV6TWpNek0xb3cKUHpFTE1Ba0dBMVVFQmhNQ1ZGY3hNREF1QmdOVkJBb01KMGR2ZG1WeWJtMWxiblFnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCCkFKb2x1T3pNb25Xb2UvZk9XMW1LeWRHR0VnaFU3Snp5NTBiMmlQTjg2YVhmVEVjMnBCc0JISDhlVjRxTnc4WFIKSWVQYUpEOUlLL3VmTHFHVTV5d2NrOUcvR3dHSFU1bk9wL1VLSVhaMy82bTN4bk9VVDBiM0VFazMrcWhaU1YxcQpnUWRXOG9yNUJ0RDNjQ0pOdExkQnVUSzRzZkN4dzV3L2NQMVQzWUdxMkdONDl0aFRicUdzYW9Ra2NsU0d4dEt5Cnlod09lWUhXdFhCaUNBRXVUazhPMVJHdnFhL2xtci9jeklkdEp1VEpWNkw3bHZuTTRUOVRqR3hNZnB0VENBdHMKRi90bnlNS3RzYzJBdEpmY2RnRVdGZWxxMTZUaGVFZk9odFg3TWZQNk1iNDBxaWo3Y0V3ZFNjZXZMSjF0WnFhMgpqV1IrdFNCcW5UdUJ0bzlBQUdkTGlZYTR6R1grRlZQcEJNSFdYeDFFMXdvdko1cEdmYUVOZGExVWhoWGNTVHZ4CmxzNFBtNkRzbzNwZHZ0VXFkVUxsZTk2bHRxcXZLS3lza0t3NHQ5Vm9OU1o2M1BjNzgvMUZtOUc3UTNodWIvRkMKVkdxWThBMnRsK2xTWHVuVmFuTGVhdmNiWUJUMHBlUzJjV2VxSCtyaVRjRkNRUDVuUmhjNEwwYy9jWnl1NVNISwpZUzF0QjZpRWZDM3VVU1h4WTVDZS9lRlhpR3Z2aWlOdHNlYTlQNjNSUFpZTGhZM05heWU3dHdXYjdMdVJxUW9ICkVnS1hUaUNROFA4Tkh1SkJPOU5BT3VlTlhkcG01QUt3QjFLWVhBNk9NNXpDcHBYN1ZSbHVUSTZ1U3crOXdUaE4KWG8rRUhXYk54V0NXdEZKYUJZbU9sWHFZd1pFOGxTT3lEdlI1dE1sOHdVb2hBZ01CQUFHamFqQm9NQjBHQTFVZApEZ1FXQkJUTXpPL01LV0NrTzdHU3RqejZNbUtQckNVVk96QU1CZ05WSFJNRUJUQURBUUgvTURrR0JHY3FCd0FFCk1UQXZNQzBDQVFBd0NRWUZLdzREQWhvRkFEQUhCZ1ZuS2dNQUFBUVVBNXZ3SWhQL2xTZzIwOXlld0RMN01UcUsKVVdVd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFFQ0FTdm9teWM1ZU1OMVBoblIyV1BXdXM0TXplS1I2ZEJjWgpUdWxTdGJuZ0NuUmlxbWpLZUtCTW1vNHNJeTdWYWhJa3Y5Um8wNHJRMkp5ZnRCOE0zamgrVnpqOGplSlBYZ3lmCnF6dlMvM1dYeTZUalp3ai81Y0FXdFVnQmZlbjVDdjhiNVdwcHYzZ2hxTUtuSTZtR3EzWlc2QTRNOWhQZEttYUsKWkVrOUdoaUhrQVNmUWxLM1Q4ditSMEYyTmUvL0FIWTJSVEtieGthRlhlSWtzQjdqU0phWVYwZVVWWG9QUWJGRQpKUFBCL2hwcnY0ajl3YWJhazJCZWdVcVpJSnhJWmhtMUFIbFVEN2dzTDB1OHFWMWJZSCtNaDZYZ1VtTXF2dGc3CmhVQVYvaDYyWlQvRlM5cCt0WG8xS2FNdWVwaGdJcVAwZlNkT0xlcTBkRHpwRDZRekR4QVJ2Qk1CMXVVTzA3KzEKRXFMaFJTUEF6QWh1WWJlSnE0UGpKQjdtWFFmbkh5QSt6MmZJNTZ3d2JTZExhRzVMS2x3Q0NEVGIrSGJrWjZNbQpuRCtpTXNKS3hZRVlNUkJXcW9UdkxRci91QjkzMHIrbFdLQmk1TmRMa1hXTmlZQ1lmbTNMVTA1ZXIvYXlsNFdYCnVkcFZCcmtrN3RmR09CNWpHeEk3bGVGWXJQTGZoTlZmbVM4TlZWdm1PTnN1UDNMcFNJWEx1eWtUang0NFZibnoKc3NRd21TTk9YZkpJb1JJTTNCS1FDWkJVa1FNOFIrWFZ5V1hndDB0OTdFZlRzd3Mrclo3UWRBQU82NzFScmNEZQpMTUREYXY3djNBdW4ra2JmWU51Y3BsbFFkU05wYzVPeStmd0MwMGZtY2M0UUF1NG5qSVQvckVVTkUxeURNdUFsCnBZWXNmUFFTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EiCiMgU2VyaWFsOiAxNzE1NDcxNzkzNDEyMDU4Nzg2MjE2Nzc5NDkxNDA3MTQyNTA4MQojIE1ENSBGaW5nZXJwcmludDogODc6Y2U6MGI6N2I6MmE6MGU6NDk6MDA6ZTE6NTg6NzE6OWI6Mzc6YTg6OTM6NzIKIyBTSEExIEZpbmdlcnByaW50OiAwNTo2MzpiODo2MzowZDo2MjpkNzo1YTpiYjpjODphYjoxZTo0YjpkZjpiNTphODo5OTpiMjo0ZDo0MwojIFNIQTI1NiBGaW5nZXJwcmludDogM2U6OTA6OTk6YjU6MDE6NWU6OGY6NDg6NmM6MDA6YmM6ZWE6OWQ6MTE6MWU6ZTc6MjE6ZmE6YmE6MzU6NWE6ODk6YmM6ZjE6ZGY6Njk6NTY6MWU6M2Q6YzY6MzI6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0ekNDQXArZ0F3SUJBZ0lRRE9mZzVSZllSdjZQNVdEOEcvQXdPVEFOQmdrcWhraUc5dzBCQVFVRkFEQmwKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2CmIzUWdRMEV3SGhjTk1EWXhNVEV3TURBd01EQXdXaGNOTXpFeE1URXdNREF3TURBd1dqQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObApjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3REaFhPNUVPQVhMR0g4N2RnK1hFU3BhN2MKSnBTSXF2VE85U0E1S0ZoZ0RQaUEycWtWbFRKaFBMV3hLSVNLaXR5ZkNneURGM3FQa0t5SzUzbFRYREdFS3ZZUAptREkyZHN6ZTNUeW9vdTlxK3lIeVVtSGZueURYSCtLeDJmNFlaTklTVzEvNVdCZzF2RWZOb1RiNWEzL1VzRGcrCndSdkRqRFBaMkM4WS9pZ1BzNmVEMXNOdVJNQmhOWllXL2xtY2kzWnQxL0dpU3cwci93dHkycDVnMEk2UU5jWjQKVlljZ29jL2xiUXJJU1h3eG1ETnNJdW1IMERKYW9yb1RnaEh0T1JlZG1UcHlvZWI2cE5uVkZ6RjFyb1Y5SXE0LwpBVWFHOWloNXlMSGE1RmNYeEg0Y0RyQzBrcVpXczcyeWwrMnFwL0MzeGFnL2xSYlEvNkdXNndoZkdIZFBBZ01CCkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVcKQkJSRjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QWZCZ05WSFNNRUdEQVdnQlJGNjZLdjlKTExnakV0VVl1bgpweUdkODIzSUR6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFvZzY4MytMdDhPTnljM3BrbEwvM2NtYllNdVJDCmRXS3VoK3Z5MWRuZVZyT2Z6TTRVS0xrTmwyQmNFa3hZNU5NOWcwbEZXSmMxYVJxb1IrcFd4bm1yRXRobmdZVGYKZndrOGxPYTRKaXdndlQyektJbjNYLzhpNHBlRUgrbGw3NGZnMzhGblNiTmQ2N0lKS3VzbTdYaStmVDhyODdjbQpOVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpOGI1UVo3ZHN2ZlB4Ckgyc01OZ2NXZnpkOHFWdHRldkVTUm1DRDF5Y0V2a3ZPbDc3RFp5cG9FZCtBNXd3elpyOFREUlJ1ODM4Zll4QWUKK28wYkpXMXNqNlczWVFHeDBxTW1vUkJ4bmEzaXcvbkRtVkczS3djSXppN21VTEtuK2dwRkw2THc4Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EiCiMgU2VyaWFsOiAxMDk0NDcxOTU5ODk1MjA0MDM3NDk1MTgzMjk2Mzc5NDQ1NDM0NgojIE1ENSBGaW5nZXJwcmludDogNzk6ZTQ6YTk6ODQ6MGQ6N2Q6M2E6OTY6ZDc6YzA6NGY6ZTI6NDM6NGM6ODk6MmUKIyBTSEExIEZpbmdlcnByaW50OiBhODo5ODo1ZDozYTo2NTplNTplNTpjNDpiMjpkNzpkNjo2ZDo0MDpjNjpkZDoyZjpiMTo5Yzo1NDozNgojIFNIQTI1NiBGaW5nZXJwcmludDogNDM6NDg6YTA6ZTk6NDQ6NGM6Nzg6Y2I6MjY6NWU6MDU6OGQ6NWU6ODk6NDQ6YjQ6ZDg6NGY6OTY6NjI6YmQ6MjY6ZGI6MjU6N2Y6ODk6MzQ6YTQ6NDM6Yzc6MDE6NjEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURyekNDQXBlZ0F3SUJBZ0lRQ0R2Z1ZwQkNSckdoZFdySldaSEhTakFOQmdrcWhraUc5dzBCQVFVRkFEQmgKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JEClFUQWVGdzB3TmpFeE1UQXdNREF3TURCYUZ3MHpNVEV4TVRBd01EQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlQKTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1a2FXZHBZMlZ5ZEM1agpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0anZoRVhMZXFLVFRvMWVxVUtLUEMzZVF5YUtsN2hMT2xsc0IKQ1NETUFaT25UakMzVS9kRHhHa0FWNTNpalNMZGh3WkFBSUVKenM0Ymc3L2Z6VHR4UnVMV1pzY0ZzM1luRm85NwpuaDZWZmU2M1NLTUkydGF2ZWd3NUJtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0CjQzQy9keEMvL0FIMmhkbW9SQkJZTXFsMUdOWFJvcjVINGlkcTlKb3orRWtJWUl2VVg3UTZoTCtocWtwTWZUN1AKVDE5c2RsNmdTemVSbnR3aTVtM09GQnFPYXN2K3piTVVaQmZIV3ltZU1yL3k3dnJUQzBMVXE3ZEJNdG9NMU8vNApnZFc3alZnL3RSdm9TU2lpY05veEJOMzNzaGJ5VEFwT0I2anRTajFldFgramtNT3ZKd0lEQVFBQm8yTXdZVEFPCkJnTlZIUThCQWY4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVQTk1UU5WYlIKVEx0bThLUGlHeHZEbDdJOTBWVXdId1lEVlIwakJCZ3dGb0FVQTk1UU5WYlJUTHRtOEtQaUd4dkRsN0k5MFZVdwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTXVjTjZwSUV4SUsrdDFFbkU5U3NQVGZyZ1QxZVhrSW95UVkvRXNyCmhNQXR1ZFhIL3ZUQkgxakx1RzJjZW5Ubm1DbXJFYlhqY0tDaHpVeUltWk9Na1hEaXF3OGN2cE9wLzJQVjVBZGcKMDZPL25Wc0o4ZFdPNDFQMGptUDZQNmZidEdiZlltYlcwVzVCamZJdHRlcDNTcCtkV09JcldjQkFJKzB0S0lKRgpQbmxVa2lhWTRJQklxRGZ2OE5aNVlCYmVyT2dPelc2c1JCYzRMMG5hNFVVK0tyazJVODg2VUFiM0x1akVWMGxzCllTRVkxUVN0ZUR3c09vQnJwK3V2RlJUcDJJbkJ1VGhzNHBGc2l2OWt1WGNsVnpEQUd5U2o0ZHpwMzBkOHRiUWsKQ0FVdzdDMjlDNzlGdjFDNXFmUHJtQUVTcmNpSXhwZzBYNDBLUE1icDFaV1ZiZDQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EiCiMgU2VyaWFsOiAzNTUzNDAwMDc2NDEwNTQ3OTE5NzI0NzMwNzM0Mzc4MTAwMDg3CiMgTUQ1IEZpbmdlcnByaW50OiBkNDo3NDpkZTo1Nzo1YzozOTpiMjpkMzo5Yzo4NTo4MzpjNTpjMDo2NTo0OTo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IDVmOmI3OmVlOjA2OjMzOmUyOjU5OmRiOmFkOjBjOjRjOjlhOmU2OmQzOjhmOjFhOjYxOmM3OmRjOjI1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3NDozMTplNTpmNDpjMzpjMTpjZTo0Njo5MDo3Nzo0ZjowYjo2MTplMDo1NDo0MDo4ODozYjphOTphMDoxZTpkMDowYjphNjphYjpkNzo4MDo2ZTpkMzpiMToxODpjZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHhUQ0NBcTJnQXdJQkFnSVFBcXhjSm1vTFFKdVBDM255cmtZbGR6QU5CZ2txaGtpRzl3MEJBUVVGQURCcwpNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNzd0tRWURWUVFERXlKRWFXZHBRMlZ5ZENCSWFXZG9JRUZ6YzNWeVlXNWoKWlNCRlZpQlNiMjkwSUVOQk1CNFhEVEEyTVRFeE1EQXdNREF3TUZvWERUTXhNVEV4TURBd01EQXdNRm93YkRFTApNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREVScFoybERaWEowSUVsdVl6RVpNQmNHQTFVRUN4TVFkM2QzCkxtUnBaMmxqWlhKMExtTnZiVEVyTUNrR0ExVUVBeE1pUkdsbmFVTmxjblFnU0dsbmFDQkJjM04xY21GdVkyVWcKUlZZZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWJNNVhQbQorOVM3NVMwdE1xYmY1WUUveWMwbFNiWnhLc1BWbERSbm9nb2NzRjlwcGtDeHhMZXlqOUNZcEtsQldUclQzSlRXClBOdDBPS1JLekUwbGd2ZEtwVk1TT083elNXMXhrWDVqdHF1bVg4T2toUGhQWWxHKytNWHMyemlTNHdibENKRU0KeENoQlZmdkxXb2tWZm5Ib05iOU5jZ2s5dmpvNFVGdDNNUnVOczhja1JacW5yRzBBRkZvRXQ3b1Q2MUVLbUVGQgpJazVsWVllQlFWQ21lVnlKM2hsS1Y5VXU1bDBjVXl4K21NMGFCaGFrYUhQUU5BUVRYS0Z4MDFwOFZkdGVaT0UzCmh6QldCT1VSdENtQUV2RjVPWWlpQWhGOEoyYTNpTGQ0OHNvS3FEaXJDbVRDdjJaZGxZVEJvU1VlaDEwYVVBc2cKRXN4QnUyNExVVGk0UzhzQ0F3RUFBYU5qTUdFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0hRWURWUjBPQkJZRUZMRSt3MmtEK0w5SEFkU1lKaG9JQXU5alpDdkRNQjhHQTFVZEl3UVlNQmFBCkZMRSt3MmtEK0w5SEFkU1lKaG9JQXU5alpDdkRNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFjR2dhWDNOZWMKbnp5SVpnWUlWeUhiSVVmNEttZXF2eGd5ZGtBUVY4R0s4M3JaRVdXT05mcWUvRVcxbnRsTU1VdTRrZWhETEk2egplTTdiNDFONWNkYmxJWlFCMmxXSG1pUms5b3Btek42Y044Mm9OTEZwbXlQSW5uZ2lLM0JENDFWSE1XRVo3MWpGCmhTOU9NUGFnTVJZanlPZmlaUll6eTc4YUc2QTkrTXBlaXpHTFlBaUpMUXdHWEZLM3hQa0ttTkVWWDU4U3ZudzIKWXppOVJLUi81Q1lyQ3NTWGFRM3BqT0xBRUZlNHlIWVNrVlh5U0duWXZDb0NXdzlFMUNBeDIvUzZjQ1pka0dDZQp2RXNYQ1MrMHl4NURhTWtISjhIU1hQZnFJYmxvRXB3OG5MK2UvSUJjbTJQTjdFZXFKU2Rub0RmekFJSjlWTmVwCitPa3VFNk4zNkI5SwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2xhc3MgMiBQcmltYXJ5IENBIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DbGFzcyAyIFByaW1hcnkgQ0EgTz1DZXJ0cGx1cwojIExhYmVsOiAiQ2VydHBsdXMgQ2xhc3MgMiBQcmltYXJ5IENBIgojIFNlcmlhbDogMTc3NzcwMjA4MDQ1OTM0MDQwMjQxNDY4NzYwNDg4MzI3NTk1MDQzCiMgTUQ1IEZpbmdlcnByaW50OiA4ODoyYzo4Yzo1MjpiODphMjozYzpmMzpmNzpiYjowMzplYTphZTphYzo0MjowYgojIFNIQTEgRmluZ2VycHJpbnQ6IDc0OjIwOjc0OjQxOjcyOjljOmRkOjkyOmVjOjc5OjMxOmQ4OjIzOjEwOjhkOmMyOjgxOjkyOmUyOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwZjo5OTozYzo4YTplZjo5NzpiYTphZjo1Njo4NzoxNDowZTpkNTo5YTpkMTo4MjoxYjpiNDphZjphYzpmMDphYTo5YTo1ODpiNTpkNTo3YTozMzo4YTozYTpmYjpjYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGtqQ0NBbnFnQXdJQkFnSVJBSVc5Uy9QWTJ1TnA5cFRYWDhPbFJDTXdEUVlKS29aSWh2Y05BUUVGQlFBdwpQVEVMTUFrR0ExVUVCaE1DUmxJeEVUQVBCZ05WQkFvVENFTmxjblJ3YkhWek1Sc3dHUVlEVlFRREV4SkRiR0Z6CmN5QXlJRkJ5YVcxaGNua2dRMEV3SGhjTk9Ua3dOekEzTVRjd05UQXdXaGNOTVRrd056QTJNak0xT1RVNVdqQTkKTVFzd0NRWURWUVFHRXdKR1VqRVJNQThHQTFVRUNoTUlRMlZ5ZEhCc2RYTXhHekFaQmdOVkJBTVRFa05zWVhOegpJRElnVUhKcGJXRnllU0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTnhRCmx0QVMrRFhTQ0hoNnRsSncvVy91ejdrUnkxMTM0ZXpwZmdTTjFzeHZjME5YWUt3ekNrVHNBMThjZ0NTUjVhaVIKVmhLQzkrQXI5TnV1WVM2SkVJMXJiTHF6QXIzVk5zVklOeVBpOEZvM1VqTVhFdUxSWUUyK0wwRVI0L1lYSlF5TAprY0FibVh1WlZnMnY3dEs4UjFmamVVbDdOSWtuSklUZXNlenBXRTcrVHQ5YXZrR3RyQWpGR0E3djBsUHViTkNkCkVnRVRqZHlBWXZlVnFVU0lTbkZPWUZXZTJ5TVplVllIREQ5akMxeXc0cjUrRmZ5VU0xaEJPSFRFNFkrTDN5YXMKSDdXTE83ZERXV3V3SktadGtJdkVjdXBkTTVpM3k5NWVlKytVOFJzK3lza2h3Y1dZQXFxaTlsdDNtL1YrbGxVMApIR2Rwd1BGQzQwZXMvQ2djWmxVQ0F3RUFBYU9CakRDQmlUQVBCZ05WSFJNRUNEQUdBUUgvQWdFS01Bc0dBMVVkCkR3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTQzTXQzOHNPS0F6ZTNiT2t5bm00anJ2b01Ja3dFUVlKWUlaSUFZYjQKUWdFQkJBUURBZ0VHTURjR0ExVWRId1F3TUM0d0xLQXFvQ2lHSm1oMGRIQTZMeTkzZDNjdVkyVnlkSEJzZFhNdQpZMjl0TDBOU1RDOWpiR0Z6Y3pJdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNuVk0rSVJCbkwzOVIvCkFOOVdNMksxOTFFQmtPdkRQOUdJUk9ra1hlL25GTDBndDVvOEFQNXRuOXVRM05mMFl0YUxjRjNuNVFSSXFXaDgKeWZGQzgyeC94WHA4SFZHSXV0SUtQaWRkM2kxUlR0TVRaR25rTHVQVDU1c0ptYWJnbFp2T0d0ZC92anpPVXJNUgpGY0VQRjgwRHU1d2xGYnFpZG9uOEJ2RVkwSk5MRG55Q3Q2WDA5bC8rN1VDbW5ZUjBPYm5jSG9VVzJpa2JoaU1BCnlidUpmbTZBaUI0dkZMUURKS2d5YndPYVJ5d3d2bGJHcDBJQ2NCdnFRTmk2QlFOd0I2U1cvLzFJTXdyaDNLV0IKa0p0TjNYM241N0xOWE1ocWxmaWw5bzNFWFhnSXZuc0cxa25QR1RaUUl5NEk1cDRGVFVjWTFSYnBzZGEyRU5XNwpsNytpanJSVQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RFNUIFJvb3QgQ0EgWDMgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4KIyBTdWJqZWN0OiBDTj1EU1QgUm9vdCBDQSBYMyBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLgojIExhYmVsOiAiRFNUIFJvb3QgQ0EgWDMiCiMgU2VyaWFsOiA5MTI5OTczNTU3NTMzOTk1MzMzNTkxOTI2Njk2NTgwMzc3ODE1NQojIE1ENSBGaW5nZXJwcmludDogNDE6MDM6NTI6ZGM6MGY6Zjc6NTA6MWI6MTY6ZjA6MDI6OGU6YmE6NmY6NDU6YzUKIyBTSEExIEZpbmdlcnByaW50OiBkYTpjOTowMjo0Zjo1NDpkODpmNjpkZjo5NDo5Mzo1ZjpiMTo3MzoyNjozODpjYTo2YTpkNzo3YzoxMwojIFNIQTI1NiBGaW5nZXJwcmludDogMDY6ODc6MjY6MDM6MzE6YTc6MjQ6MDM6ZDk6MDk6ZjE6MDU6ZTY6OWI6Y2Y6MGQ6MzI6ZTE6YmQ6MjQ6OTM6ZmY6YzY6ZDk6MjA6NmQ6MTE6YmM6ZDY6Nzc6MDc6MzkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURTakNDQWpLZ0F3SUJBZ0lRUksrd2dOYWpKN3FKTURtR0x2aEFhekFOQmdrcWhraUc5dzBCQVFVRkFEQS8KTVNRd0lnWURWUVFLRXh0RWFXZHBkR0ZzSUZOcFoyNWhkSFZ5WlNCVWNuVnpkQ0JEYnk0eEZ6QVZCZ05WQkFNVApEa1JUVkNCU2IyOTBJRU5CSUZnek1CNFhEVEF3TURrek1ESXhNVEl4T1ZvWERUSXhNRGt6TURFME1ERXhOVm93ClB6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUmN3RlFZRFZRUUQKRXc1RVUxUWdVbTl2ZENCRFFTQllNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgpBTit2NlpkUUNJTlh0TXhpWmZhUWd1ekgweXhyTU1wYjdObkRmY2RBd1JnVWkrRG9NM1pKS3VNL0lVbVRyRTRPCnJ6NUl5Mlh1L05NaEQyWFNLdGt5ajR6bDkzZXdFbnUxbGNDSm82bTY3WE11ZWd3R01vT2lmb29VTU0wUm9PRXEKT0xsNUNqSDlVTDJBWmQrM1VXT0R5T0tJWWVwTFlZSHNVbXU1b3VKTEdpaWZTS09lRE5vSmpqNFhMaDdkSU45Ygp4aXFLcXk2OWNLM0ZDeG9sa0hSeXhYdHFxelRXTUluLzVXZ1RlMVFMeU5hdTdGcWNraDQ5WkxPTXh0Ky95VUZ3CjdCWnkxU2JzT0ZVNVE5RDgvUmhjUVBHWDY5V2FtNDBkdXRvbHVjYlkzOEVWQWpxcjJtN3hQaTcxWEFpY1BOYUQKYWVRUW14a3F0aWxYNCtVOW01L3dBbDBDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVgpIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRk1TbnNhUjdMSEg2MitGTGtIWC94QlZnaFlrUU1BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUNqR2l5YkZ3QmNxUjd1S0dZM09yK0R4ejlMd3dtZ2xTQmQ0OWxaUk5JK0RUNjkKaWt1Z2RCL09FSUtjZEJvZGZwZ2EzY3NUUzdNZ1JPU1I2Y3o4ZmFYYmF1WCs1djNnVHQyM0FEcTFjRW12OHVYcgpBdkhSQW9zWnk1UTZYa2pFR0I1WUdWOGVBbHJ3RFBHeHJhbmNXWWFMYnVtUjlZYksrcmxtTTZwWlc4N2lweFp6ClI4c3J6Sm13TjBqUDQxWkw5YzhQREhJeWg4YndSTHRUY20xRDlTWkltbEpudDFpci9tZDJjWGpiRGFKV0ZCTTUKSkRHRm9xZ0NXakJINGQxUUI3d0NDWkFBNjJSallKc1d2SWpKRXViU2ZaR0wrVDB5aldXMDZYeXhWM2JxeGJZbwpPYjhWWlJ6STluZVdhZ3FOZHd2WWtRc0VqZ2ZiS2JZSzdwMkNOVFVRCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Td2lzc1NpZ24gR29sZCBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgU3ViamVjdDogQ049U3dpc3NTaWduIEdvbGQgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIExhYmVsOiAiU3dpc3NTaWduIEdvbGQgQ0EgLSBHMiIKIyBTZXJpYWw6IDEzNDkyODE1NTYxODA2OTkxMjgwCiMgTUQ1IEZpbmdlcnByaW50OiAyNDo3NzpkOTphODo5MTpkMTozYjpmYTo4ODoyZDpjMjpmZjpmODpjZDozMzo5MwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmM1OjM4OjhhOmI3OjMwOjFiOjFiOjZlOmQ0OjdhOmU2OjQ1OjI1OjNhOjZmOjlmOjFhOjI3OjYxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2MjpkZDowYjplOTpiOTpmNTowYToxNjozZTphMDpmODplNzo1YzowNTozYjoxZTpjYTo1NzplYTo1NTpjODo2ODo4Zjo2NDo3Yzo2ODo4MTpmMjpjODozNTo3Yjo5NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnVqQ0NBNktnQXdJQkFnSUpBTHRBSEVQMVhrK3dNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FVXhDekFKQmdOVgpCQVlUQWtOSU1SVXdFd1lEVlFRS0V3eFRkMmx6YzFOcFoyNGdRVWN4SHpBZEJnTlZCQU1URmxOM2FYTnpVMmxuCmJpQkhiMnhrSUVOQklDMGdSekl3SGhjTk1EWXhNREkxTURnek1ETTFXaGNOTXpZeE1ESTFNRGd6TURNMVdqQkYKTVFzd0NRWURWUVFHRXdKRFNERVZNQk1HQTFVRUNoTU1VM2RwYzNOVGFXZHVJRUZITVI4d0hRWURWUVFERXhaVApkMmx6YzFOcFoyNGdSMjlzWkNCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDCkNnS0NBZ0VBcitUdWZvc2tEaEp1cVZBdEZrUTdrcEpjeXJoZGhKSkNFeXE4WlZlQ1FENVhKTTFRaXlVcXQyLzgKNzZMUXdCOENKRW9UbG84akUrWW9XQUNqUjhjR3A0UWpLN3U5bGl0L1ZjeUx3VmNmRG1KbEQ5MDlWb3B6MnE1KwpiYnFCSEg1Q2pDQTEyVU5OaFBxRTIxSXM4dzRuZHd0cnZ4RXZjbmlmTHRnKzVoZzNXaXB5K2RwaWtKS1Z5aCtjCjZiTThLOHZ6QVJPL1dzL0J0UXBndmQyMW1XUlR1S0NXczIvaUpuZVJqT0JpRUFLZk5BK2sxWkl6VWQ2K2picUUKZW1BOGF0dWZLK3plM2dFL2JrM2xVSWJMdEsvdFJFREZ5bHFNMnRJcmZLanV2cWJsQ3FvT3BkOEZVcmRWeHlKZApNbXFYbDJNVDI4bmJlVFo3aFRwS3hWS0orU1RublhlcGd2OVZIS1Z4YVN2UkFpVHlzeWJVYTlvRVZlWEJDc2R0Ck1EZVFLdVNlRkROZUZoZFZ4VnUxeXpTSmt2R2RKbytoQjlUR3NuaFEyd3dNQzN3TGpFSFh1ZW5kaklqM28wMnkKTXN6WUY5ck50ODVtbmRUOVh2KzlsejRwZGVkK3AySllyeVUwcFVISFBid05VTW9EQXc4SVdoK1ZjM2hpdjY5eQpGR2tPcGVVRERuaU9KaWhDOEFjTFlpQVFaemxHK3FrRHpBUTRlbWJ2SUlPMWpFcFdqcEVBL0k1Y2d0NklvTVBpCmFHNTlqZTg4M1dYMFhheFI3eVNBcnFwV2wyLzVyWDNhWVQrWWR6eWxrYlljakNiYVphSUpiY0hpVk9PNXlreE0KZ0k5M2UyQ2FIdCsyOGtnZURycE9WRzJZNE9HaUdxSjNVTS9FWTVMc1J4bWQ2K1pyenNFQ0F3RUFBYU9CckRDQgpxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVXeVY3CmxxUmxVWDY0T2ZQQWVHWmU2RHJuOE80d0h3WURWUjBqQkJnd0ZvQVVXeVY3bHFSbFVYNjRPZlBBZUdaZTZEcm4KOE80d1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRUNBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwY0RvdgpMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQ2U2CjQ1Ujg4YTdBM2hmbTVkalY5VlN3Zy9TN3pWNEZlMCtmZFdhdlBPaFdmdnh5ZURnRDJTdGlHd0M1K09sZ3pjek8KVVlySFVERnU0VXArR0M5cFdiWTlaSUVyNDRPRTVpS0hqbjNnN2dLWlliZ2U5TGdyaUJJV2hNSXhremlXTWFhNQpPMU0vd3lTVFZsdHBrdXpGd2JzNEFPUHNGNm00M01kOEFZT2ZNa2U2VWlJMEhUSjZDVmFuZkNVMnFUMUwyc0NDCmJ3cTdFc2lIU3ljUitSNHR4NU0vbnR0ZkptdFMyUzZLOFJUR1JJMFZxYmUvdmQ2bUd1NnVMZnRJZHhmK3UreXYKR1BVcVVmQTVoSmVWYkc0Ynd5dkVkR0I1SmJBS0o5L2ZYdEk1ejBWOVFrdmZzeXdleGNaZHlsVTZvSnhwbW8vYQo3N0t3UEorSGJCSXJaWEFWVWpFYUpNOXZNU05RSDR4UGp5UERkRUZqSEZXb0ZOMCs0RkZRei9FYk1GWU9rckNDCmhkaUR5eUprdkMyNEpkVlVvcmdHNnEyU3BDU2d3WWExU2hOcVI4OHVDMWFWVk12T210dHF0S2F5MjBFSWhpZDMKOTJxZ1Ftd0xPTTdYZFZBeWtzTGZLekFpU05EVlFUZ2xYYVRwWFovR2xIWFFSZjB3bDBPUGtLc0t4NFp6WUVwcApMZDZsZU5jRzJtcWVTejUzT2lBVElnSFF2MmllWTJCck5VMExiYnFoUGNDVDRIOGpzMVd0Y2lWT1J2blNGdSt3ClpNRUJudW5Lb0dxWURzL1lZUEl2U2Jqa1F1RTROUmIweUc1UDk0Rlc2THFqdmlPdnJ2MXZBK0FDT3pCMitodHQKUWM4QnNlbTR5V2IwMnliek9xUjA4a2trVzhtdzBGZkIrajU2NFpmSgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgU3ViamVjdDogQ049U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgTGFiZWw6ICJTd2lzc1NpZ24gU2lsdmVyIENBIC0gRzIiCiMgU2VyaWFsOiA1NzAwMzgzMDUzMTE3NTk5NTYzCiMgTUQ1IEZpbmdlcnByaW50OiBlMDowNjphMTpjOTo3ZDpjZjpjOTpmYzowZDpjMDo1Njo3NTo5NjpkODo2MjoxMwojIFNIQTEgRmluZ2VycHJpbnQ6IDliOmFhOmU1OjlmOjU2OmVlOjIxOmNiOjQzOjVhOmJlOjI1OjkzOmRmOmE3OmYwOjQwOmQxOjFkOmNiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZTo2Yzo0ZDphMjpiYjpiOTpiYTo1OTpiNjpmMzo5Mzo5Nzo2ODozNzo0Mjo0NjpjMzpjMDowNTo5OTozZjphOTo4ZjowMjowZDoxZDplZDpiZTpkNDo4YTo4MTpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnZUQ0NBNldnQXdJQkFnSUlUeHZVTDFTN0wwc3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRQpCaE1DUTBneEZUQVRCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZVTNkcGMzTlRhV2R1CklGTnBiSFpsY2lCRFFTQXRJRWN5TUI0WERUQTJNVEF5TlRBNE16STBObG9YRFRNMk1UQXlOVEE0TXpJME5sb3cKUnpFTE1Ba0dBMVVFQmhNQ1EwZ3hGVEFUQmdOVkJBb1RERk4zYVhOelUybG5iaUJCUnpFaE1COEdBMVVFQXhNWQpVM2RwYzNOVGFXZHVJRk5wYkhabGNpQkRRU0F0SUVjeU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXhQR0hmOU40TWZjNHlmakRtVU84eC9lOE4rZE9jYnBMajZWekhWeHVtSzREVjY0NE4wTXYKRnowZnlNNW9FTUY0cmhrREt4RDZMSG1EOXVpNWFMbFY4Z1JFcHpuNS9BU0xIdkdpVFNmNVlYdTZ0K1dpRTdicgpZVDdRYk5IbSsvcGU3UjIwbnFBMVc2R1N5L0JKa3Y2RkNnVSs1dGtMNGsrNzNKVTMvSkhwTWpVaTBSODZUaWVGCm5iQVZsRExhWVExSFRXQkNycEpINklOYVVGanBpb3U1WGFIYzNabEtIelpudTBqa2c3WTM2MGc2cnc5bmp4Y0gKNkFUSzcyb3hoOVRBdHZtVWNYdG5aTGkya1VwQ2UyVXVNR29NOVpEdWxlYnl6WUxzMmFGSzdQYXlTK1ZGaGVadAplSk1FTHB5Q2JUYXB4REZrSDRhREN5cjBOUXA0eVZYUFFiQkg2VENmbWI1aHFBYUV1U2g2WHpqWkc2azRzSU4vCmM4SERPMGdxZ2c4aG03ak1xRFhEaEJ1RHN6NitwSlZwQVRxSkFIZ0UyY24wbVJtclZuNWJpNFk1RlpHa0VDd0oKTW9CZ3M1UEFLcllZQzUxK2pVbnlFRXAvK2RWR0x4bVNvNW1uSnF5N2pEem1EcnhIQjl4elVmRndaQzhJK2JSSApIVEJzUk9vcE40V1NhR2E4Z3pqK2V6a3UwMUR3SC90ZVlMYXBwdm9uUWZHYkdITHk5WVIwU3NsbnhGU3VTR1RmCmpORnVzQjNoQjQ4SUhwbWNjZWxNMktYM1J4SWZkTkZSbm9iendxSWpRQXR6MjB1bTUzTUdqTUdnNmNGWnJFYjYKNWkvNHozR2NSbTI1eEJXTk9Ia0RSVWp2eEYzWENPNkhPU0tHc2cwUFdFUDNjYWxJTHYzcTFoOENBd0VBQWFPQgpyRENCcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVCkY2RE53ZVJCdGpwYk84dEZuYjBjd3BqNmhsZ3dId1lEVlIwakJCZ3dGb0FVRjZETndlUkJ0anBiTzh0Rm5iMGMKd3BqNmhsZ3dSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVEQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMApjRG92TDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCCkFIUEdnZUFuMGkwUDRKVXc0cHBCZjFBc1gxOWlZYW1HYW1rWURIUkoxbDJFNmtGU0dHOVlyVkJXSUdyR3ZTaHAKV0pIY2tSRTFxVG9kdkJxbFlKN1lIMzlGa1duWmZydDRjc0VHRHlyT2o0VndZYXlnelF1NE9TbFdoREpPaHJzOQp4Q3JaMXg5eTd2NVJvU0pCc1hFQ1l4cUNzR0tyWGxjU0g5L0wzWFdnd0YxNWtJd2I0RkRtM2pIK21IdHdYNldRCjJLMzRBclp2MDJEZFFFc2l4VDJ0T25xZkdocEhrWGt6dW9MY01ta0RsbTRmUy9CeC91Tm5jcUN4djF5TDVQcVoKSXNlRXVSdU5JNWMvN1NYZ3oyVzc5V0VFNzkwZXNscEJJbHFobjEwczZGdkpiYWtNREhpcVlNWldqd0ZhREdpOAphUmw1eEI5K2x3Vy94ZWtrVVY3VTFVdFQ3ZGtqV2pZRFphUEJBNjFCTVBOR0c0V1FyMlcxMWJIa0ZsdDRkUjJYCmVtMVpxU3FQZTk3RGg0a1FtVWx6ZU1nOXZWRTFkQ3JWOFg1cEd5cTdPNzBsdUpwYVBYSmhrR2FIN2d6V1RkUVIKZEF0cS9nc0QvS05WVjRuK1NzdXVXeGNGeVBLTkl6RlRPTkl0YWorQ3VZMElhdmRlUVhSdXd4RitCNndwWUpFLwpPTXBYRUEyOU1DL0hwZVpCb05xdUJZZWFvS1JsYkV3SkRJbTZ1Tk81d0pPS01QcU41WnByRlFGT1o2cmFZbFkrCmhBaG0wc1EyZmFjK0VQeUk0TlNBNVFDOXF2Tk9CcU42YXZsaWN1TUpUK3ViRGdFajhaKzdmTnpjYkJHWEpiTHkKdEdNVTBnWXFaNHlEOWM3cUI5aWFhaDdzNUFxN0trenJDV0E1enNwaTJDNXUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAzMjc5ODIyNjU1MTI1Njk2MzMyNDMxMzgwNjQzNjk4MTk4MjM2OQojIE1ENSBGaW5nZXJwcmludDogMDI6MjY6YzM6MDE6NWU6MDg6MzA6Mzc6NDM6YTk6ZDA6N2Q6Y2Y6Mzc6ZTY6YmYKIyBTSEExIEZpbmdlcnByaW50OiAzMjozYzoxMTo4ZToxYjpmNzpiODpiNjo1Mjo1NDplMjplMjoxMDowZDpkNjowMjo5MDozNzpmMDo5NgojIFNIQTI1NiBGaW5nZXJwcmludDogMzc6ZDU6MTA6MDY6YzU6MTI6ZWE6YWI6NjI6NjQ6MjE6ZjE6ZWM6OGM6OTI6MDE6M2Y6YzU6Zjg6MmE6ZTk6OGU6ZTU6MzM6ZWI6NDY6MTk6Yjg6ZGU6YjQ6ZDA6NmMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURmRENDQW1TZ0F3SUJBZ0lRR0t5MWF2MXB0aFU2WTJ5djJ2ckVvVEFOQmdrcWhraUc5dzBCQVFVRkFEQlkKTVFzd0NRWURWUVFHRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFeE1DOEdBMVVFQXhNbwpSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdOakV4Ck1qY3dNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUZneEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUsKRXcxSFpXOVVjblZ6ZENCSmJtTXVNVEV3THdZRFZRUURFeWhIWlc5VWNuVnpkQ0JRY21sdFlYSjVJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUF2cmdWZS8vVWZIMW5yWU5rZThoQ1V5M2Y5b1FJSUdIV0FWbHFuRVFScis5Mi9aVit6bUV3dTNxRFh3SzkKQVdiSzdoV05iNkV3bkwyaGhaNlVPdk5XaUFBeHo5anVhcFlDMmUwRGpQdDFiZWZxdUZVV0JSYWE5T0Jlc1lqQQpaSVZjRlUySXg3ZTY0SFhwclFVOW5jZUpTT0M3S01nRDRUQ1RaRjVTd0Zsd0lqVlhpSXJ4bFFxRDE3d3hjd0UwCjdlOUdjZUJyQXFnMWNtdVhtMmJneXh4NVg5Z2FCR2dlUndMbW5XRGlOcGNCMzg0MWt0KytaOGR0ZDFrN2o1M1cKa0JXVXZFSTBFTUU1K2JFblBuN1dpblhGc3ErVzA2TGVtK1NZdm4zaDZZR3R0bS84MXc3YTREU3dEUnAzNStNSQptTzlZK3B5RXR6YXZ3dCtzMHZRUUJuQnhOUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHCkExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVTE5WUVFaY1ZpL0NQTm1GYlN2dHIyWm5KTTVJd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBRnB3Znl6ZHR6UlA5WVpScVNhK1M3aXE4WEVOM0dISG9PbzBIbnAzRHdRMQo2Q2VQYkpDL2tSWWtSajVLVHM0ckZ0VUxVaDM4SDJlaUFrVXhUODd6K2dPbmVaMVRhdG5hWXpyNGdOZlRtZUdsCjRiN1VWWEdZTlRxK2srcXVyVUt5a0cvZy9DRk5OV016aVVuV20wN0t4K2RPQ1FEMzJzZnZtV0taZDdhVklsNksKb0t2MHVIaVl5amdabWNseW5uak5TNnl2R2FCekVpMzh3a0c2Z1pIYUZsb3h0L20wY1lBU1NKbHljMXBaVThGagpValB0cDhuU09RSncrdUN4UW1ZcHFwdFI3VEJVSWhSZjJhc2R3ZVNVOFBqMUsvZnF5bmhHMXJpUi9hWU5LeG9VCkFUNkE4RUtnbFFkZWJjM01TNlJGamFzUzZMUGVXdVdnZk9nUEloMWE2Vms9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EiCiMgU2VyaWFsOiA2OTUyOTE4MTk5MjAzOTIwMzU2NjI5ODk1Mzc4NzcxMjk0MDkwOQojIE1ENSBGaW5nZXJwcmludDogOGM6Y2E6ZGM6MGI6MjI6Y2U6ZjU6YmU6NzI6YWM6NDE6MWE6MTE6YTg6ZDg6MTIKIyBTSEExIEZpbmdlcnByaW50OiA5MTpjNjpkNjplZTozZTo4YTpjODo2Mzo4NDplNTo0ODpjMjo5OToyOTo1Yzo3NTo2Yzo4MTo3Yjo4MQojIFNIQTI1NiBGaW5nZXJwcmludDogOGQ6NzI6MmY6ODE6YTk6YzE6MTM6YzA6Nzk6MWQ6ZjE6MzY6YTI6OTY6NmQ6YjI6NmM6OTU6MGE6OTc6MWQ6YjQ6NmI6NDE6OTk6ZjQ6ZWE6NTQ6Yjc6OGI6ZmI6OWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVJRENDQXdpZ0F3SUJBZ0lRTkU3VlZ5RFY3ZXhKOUMvT045c3JiVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKcVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFb01DWUdBMVVFQ3hNZgpRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdktHTXBJREl3Ck1EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SHpBZEJnTlYKQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3SGhjTk1EWXhNVEUzTURBd01EQXdXaGNOTXpZdwpOekUyTWpNMU9UVTVXakNCcVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqCkxqRW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUcKQTFVRUN4TXZLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObApJRzl1YkhreEh6QWRCZ05WQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNzb1BEN2dGblVuTWVrejUyaFdYTUpFRVVNRFN4dWFQRnMKVzBob1NWazMvQXN6R2NKM2Y4d1FMWlUwSE9iclRRbW5ITks0eVpjMkFyZUoxQ1JmQnNETVJKU1VqUUppYit0YQozUkdOS0pwY2hKQVFlZzI5ZEdZdmFqaWc0dFZVUk9zZEI1OEh1bS91NmYxT0N5bjFQb1NnQWZHY3EvZ2Nmb21rCjZLSFljV1VObzFGNzdyelNJbUFOdVZ1ZDM3cjhVVnNMcjVpeTZTN3BCT2hpaDk0cnlOZE93VXhrSHQzUGgxaTYKU2svS2FBY2RISjFLeHRVdmtjeDhjWEljeGNCbjZ6TDl5WkpjbE5xRndKdS9VMzByQ2ZTTW5aRWZsMnBTeTk0SgpOcVIzMkh1SFVFVFZQbTRwYWZzNVNTWWVDYVdBZTBBdDYrZ25oY24rWWYxKzVueVhIZFdkQWdNQkFBR2pRakJBCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSN1cwWFAKcjg3TGV2MHhraHBxdHZORzYxZElVREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBZVJIQVM3T1J0dnp3NldmVQpEVzVGdmxYb2s5TE9Bei90MmlXd0hWZkxIanAyb0V6c1VIYm9aSElNcEtueHVJdlcxb2VFdXpMbFFSSEFkOW16CllKM3JHOVhSYmtSRXFhWUI3RlZpSFhlNFhJNUlTWHljTzFjUnJLMXpONDR2ZUZ5UWFFZlpZR0RtL0FjOUlpQVgKeFBjVzZjVFljdm5JYzN6ZkZpOFZxVDc5YWllMm9ldGF1cGdmMWVOTlpBcWRFOGhodXZVNUhJZTZ1TDE3SW4vMgovcXhBZWVXc0VHODlqeHQ1ZG92RU43TWhHSVRsTmdEcll5Q1p1ZW4rTXdTN1FjakJBdmxFWXlDZWdjNUMwOVkvCkxIYlRZNXhaM1krbTRRNmdMa0gzTHBWSHo3ejlNL1AyQzJGK2ZwRXJnVWZDSnpEdXB4QmRONDljT1N2a0JQQjcKalZhTWFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDYgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDYgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IgojIFNlcmlhbDogMzMwMzc2NDQxNjc1NjgwNTg5NzAxNjQ3MTk0NzU2NzYxMDE0NTAKIyBNRDUgRmluZ2VycHJpbnQ6IGNiOjE3OmU0OjMxOjY3OjNlOmUyOjA5OmZlOjQ1OjU3OjkzOmYzOjBhOmZhOjFjCiMgU0hBMSBGaW5nZXJwcmludDogNGU6YjY6ZDU6Nzg6NDk6OWI6MWM6Y2Y6NWY6NTg6MWU6YWQ6NTY6YmU6M2Q6OWI6Njc6NDQ6YTU6ZTUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDlhOmNmOmFiOjdlOjQzOmM4OmQ4OjgwOmQwOjZiOjI2OjJhOjk0OmRlOmVlOmU0OmI0OjY1Ojk5Ojg5OmMzOmQwOmNhOmYxOjliOmFmOjY0OjA1OmU0OjFhOmI3OmRmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFMHpDQ0E3dWdBd0lCQWdJUUdOclJuaVo5Nkx0S0lWak56R3M3U2pBTkJna3Foa2lHOXcwQkFRVUZBRENCCnlqRUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUwKRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcApVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXClpYSnBVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVJQzBnUnpVd0hoY05NRFl4TVRBNE1EQXdNREF3V2hjTk16WXdOekUyTWpNMU9UVTVXakNCeWpFTApNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXClpYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcFUybG4KYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcApVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5CmFYUjVJQzBnUnpVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2SkFnSUtYbzEKbm1BTXF1ZExPMDdjZkx3OFJSeTdLK0QrS1FMNVZ3aWpaSVVWSi9YeHJjZ3hpVjBpNkNxcXBrS3pqL2k1VmJleAp0MHV6L285K0IxZnM3MFBiWm1JVlljOWdEYVRZM3ZqZ3cySUlQVlFUNjBuS1dWU0ZKdVVyanh1ZjYvV2hrY0l6ClNkaERZMnBTUzlLUDZIQlJUZEdKYVh2SGNQYXozQkowMjN0ZFMxYlRscjhWZDZHdzlLSWw4cThja21jWTVmUUcKQk8rUXVlUUE1TjA2dFJuL0FycjBQTzdnaStzM2krejAxNnp5OXZBOXI5MTFrVE1aSFJ4QXkzUWtHU0dUMlJUKwpyQ3BTeDQvVkJFbmtqV05IaUR4cGc4ditSNzByZmsvRmxhNE9uZFRSUThCbmMrTVVDSDdsUDU5enVETUt6MTAvCk5JZVdpdTVUNkNVVkFnTUJBQUdqZ2JJd2dhOHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdiUVlJS3dZQkJRVUhBUXdFWVRCZm9WMmdXekJaTUZjd1ZSWUphVzFoWjJVdloybG1NQ0V3SHpBSApCZ1VyRGdNQ0dnUVVqK1hUR29hc2pZNXJ3OCtBYXRSSUdDeDdHUzR3SlJZamFIUjBjRG92TDJ4dloyOHVkbVZ5CmFYTnBaMjR1WTI5dEwzWnpiRzluYnk1bmFXWXdIUVlEVlIwT0JCWUVGSC9UWmFmQzNleTc4REFKODBNNStnS3YKTXpFek1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ1RKRW93WDJMUDJCcVlMejNxM0prdHZYZjJwWGtpT096RQpwNkI0RXExaURrVndaTVhubDJZdG1BbCtYNi9XekNobDhnR3FDQnBIM3ZuNWZKSmFDR2tnRGRrK2JXNDhEVzdZCjVnYVJRQmk1K01IdDM5dEJxdUNXSU1uTlpCVTRnY21VN3FLRUtRc1RiNDdiRE4wbEF0dWtpeGxFMGtGNkJXbEsKV0U5Z3luNkNhZ3NDcWlVWE9iWGJmK2VFWlNxVmlyMkczbDZCRm9NdEVNemUvYWlDS20wb0h3MEx4T1huR2lZWgo0ZlFSYnhDMWxmem5RZ1V5Mjg2ZFVWNG90cDZGMDF2dnBYMUZRSEtPdHc1ckRnYjdNelZJY2JpZEo0dkVaVjhOCmhuYWNSSHIybFZ6MlhUSUlNNlJVdGhnL2FGenlRa3FGT0ZTRFg5SG9MUEtzRWRhbzdXTnEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNlY3VyZVRydXN0IENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TZWN1cmVUcnVzdCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTZWN1cmVUcnVzdCBDQSIKIyBTZXJpYWw6IDE3MTk5Nzc0NTg5MTI1Mjc3Nzg4MzYyNzU3MDE0MjY2ODYyMDMyCiMgTUQ1IEZpbmdlcnByaW50OiBkYzozMjpjMzphNzo2ZDoyNTo1NzpjNzo2ODowOTo5ZDplYToyZDphOTphMjpkMQojIFNIQTEgRmluZ2VycHJpbnQ6IDg3OjgyOmM2OmMzOjA0OjM1OjNiOmNmOmQyOjk2OjkyOmQyOjU5OjNlOjdkOjQ0OmQ5OjM0OmZmOjExCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmMTpjMTpiNTowYTplNTphMjowZDpkODowMzowZTpjOTpmNjpiYzoyNDo4MjozZDpkMzo2NzpiNToyNTo1Nzo1OTpiNDplNzoxYjo2MTpmYzplOTpmNzozNzo1ZDo3MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHVEQ0NBcUNnQXdJQkFnSVFEUENPWEFnV3BhMUNmL0RySnhoWjBEQU5CZ2txaGtpRzl3MEJBUVVGQURCSQpNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4CkZ6QVZCZ05WQkFNVERsTmxZM1Z5WlZSeWRYTjBJRU5CTUI0WERUQTJNVEV3TnpFNU16RXhPRm9YRFRJNU1USXoKTVRFNU5EQTFOVm93U0RFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlQmdOVkJBb1RGMU5sWTNWeVpWUnlkWE4wSUVOdgpjbkJ2Y21GMGFXOXVNUmN3RlFZRFZRUURFdzVUWldOMWNtVlVjblZ6ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLdWtnZVdWemZYMkZJN0NUOHJVNG5pVldKeEI0UTJaUUNRWE9aRXoKWnVtKzRZT3ZZbHlKMGZ3a1cyR3o0QkVSUVJ3ZGJ2QzR1L2plcDRHNnBrakdueDI5dm82cFFUNjRsTzBwR3RTTwowZ01kQSs5dERXY2NWOWNHcmNySTlmNE9yMllsU0FTV0MxMmp1aGJEQ0UvUlJ2Z1VYUExJWGdHWmJmMkl6SWFvCndXOHhRbXhTUG1qTDh4azAzN3VIR0ZhQUpzVFEzTUJ2Mzk2Z3dwRVdvR1FSUzBTOEh2Ym4rbVBlWnF4MnBIR2oKN0RhVWFIcDNwTEhuRGkrQmV1SzFjb2J2b211TDhBL2IwMWsvdW5LOFJDU2M0M096OTY5WEwwSW1uYWwwdWdCUwo4a3ZOVTN4SEN6YUZEbWFwQ0pjV05GZkJadmVBNCsxd1ZNZVQ0QzRvRlZtSHVyc0NBd0VBQWFPQm5UQ0JtakFUCkJna3JCZ0VFQVlJM0ZBSUVCaDRFQUVNQVFUQUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVVFqSzJGdm9FL2Y1ZFMzckQvZmRNUUIxYVE2OHdOQVlEVlIwZkJDMHdLekFwb0NlZwpKWVlqYUhSMGNEb3ZMMk55YkM1elpXTjFjbVYwY25WemRDNWpiMjB2VTFSRFFTNWpjbXd3RUFZSkt3WUJCQUdDCk54VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFERHRUMHJoV0RwU2NsdTFwcU5sR0thN1VUdDMKNlozcTA1OWM0RVZsZXczS1crSndVTEtVQlJTdVNjZU5RUWNTYzVSK0RDTWgvYndRZjJBUVduTDFtQTZzN0xsLwozWHB2WGRNYzlQK0lCV2xDcVFWeHlMZXNKdWd1dEl4cS8zSGN1TEhmbWJ4OElWUXI1RmlpdTFjcHJwNnBveGttCkQ1a3VDTER2L1duUG1Sb0pqZU9ubnl2Sk5qUjdKTE40VEpVWHBBWW1IclprVWpaZllHZlpuTVVGZEF2blp5UFMKQ1B5STZhNkxmK0V3OURkKy9jWXkyaTJlUkRBd2JPNEgzdEkwL05ML1FQWkw5R1pHQmxTbThqSUtZeVl3YTV2UgozSXRIdXVHNTFXTFFvcUQwWndWNEtXTWFid1RXK01aTW81cXhON1NONVNoTEhaNHN3cmhvdk8wQzdqRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNlY3VyZSBHbG9iYWwgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNlY3VyZSBHbG9iYWwgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU2VjdXJlIEdsb2JhbCBDQSIKIyBTZXJpYWw6IDk3NTE4MzYxNjc3MzEwNTE1NTQyMzIxMTk0ODE0NTY5Nzg1OTcKIyBNRDUgRmluZ2VycHJpbnQ6IGNmOmY0OjI3OjBkOmQ0OmVkOmRjOjY1OjE2OjQ5OjZkOjNkOmRhOmJmOjZlOmRlCiMgU0hBMSBGaW5nZXJwcmludDogM2E6NDQ6NzM6NWE6ZTU6ODE6OTA6MWY6MjQ6ODY6NjE6NDY6MWU6M2I6OWM6YzQ6NWY6ZjU6M2E6MWIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQyOjAwOmY1OjA0OjNhOmM4OjU5OjBlOmJiOjUyOjdkOjIwOjllOmQxOjUwOjMwOjI5OmZiOmNiOmQ0OjFjOmExOmI1OjA2OmVjOjI3OmYxOjVhOmRlOjdkOmFjOjY5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdkRDQ0FxU2dBd0lCQWdJUUIxWWlwT2pVaW9sTjlCUEk4UGpxcFRBTkJna3Foa2lHOXcwQkFRVUZBREJLCk1Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHgKR1RBWEJnTlZCQU1URUZObFkzVnlaU0JIYkc5aVlXd2dRMEV3SGhjTk1EWXhNVEEzTVRrME1qSTRXaGNOTWpreApNak14TVRrMU1qQTJXakJLTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnClEyOXljRzl5WVhScGIyNHhHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3Z1EwRXdnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZOUzdZckd4VmFRWng1Uk5vSkxOUDJNd2hSL2p4WURpSgppUVBwdmVwZVJsTUozRnoxV3VqM1JTb0M2ekZoMXlrelRNN0hmQW8zZmcrNk1wamhIWmV2ajhmY3lUaVc4OXNhCi9GSHRhTWJRYnFSOEpOR3VRc2lXVUdNdTRQNTEvcGluWDBrdWxlTTVNMlNPSHFSZmtOSm5QTExaL2tHNVZhY0oKam5JRkhvdmRSSVdDUXRCSndCMWc4TkVYTEpYcjlxWEJrcVBGd3FjSVlBMWdCQkNXZVo0V05PYXB0dm9sUlRuSQpIbVg1ay9XcThWTGNtWmc5cFlZYUREVXora3VsQkFZVkhER0E3Nm9ZYThKNzE5ck8rVE1nMWZXOWFqTXRnUVQ3CnNGelVuS1BpWEIzanFVSjFYbnZVZCs4NVZMckpDaGdiRXBsSkw0aEwvVkJpMFhQbmozcERBZ01CQUFHamdaMHcKZ1pvd0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUEJBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0hRWURWUjBPQkJZRUZLOUVCTUpCZmtpRDIwNDVBdXpzaEhybXpzbWtNRFFHQTFVZEh3UXRNQ3N3CkthQW5vQ1dHSTJoMGRIQTZMeTlqY213dWMyVmpkWEpsZEhKMWMzUXVZMjl0TDFOSFEwRXVZM0pzTUJBR0NTc0cKQVFRQmdqY1ZBUVFEQWdFQU1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmpHZ2hBZmFSZVV3MTMySHF1SHcwTApVUllEN3hoOHlPT3ZhbGlURkdDUnNvVGNpRTYrT1lvNjgrYUNpVjBCTjdPckpLUVZEcEkxV2twRVhrNVgrblhPCkgwak9adlE4UUNhU21Hd2I3aVJHREJlelVxWGJwWkdSenpmVGIrY25DRHBPR1I4NnAxaGNGODk1UDR2a3A5TW0KSTUwbUQxaHAvRWQrc3RDTmk1Ty9LVTlEYVhSMlowdlBCNHptQXZlMTRiUkR0VXN0RkovNTNDWU52NlpIZEFiWQppTkU2S1RDRXp0STVnR0licU1kWFNieHFWVkZuRlVxK05RZmsxWFdZTjNrd0ZOc3BuV3pGYWN4SFZhSXc5OHhjCmY4TERtQnhyVGhhQTYzcDRaVVdpQUJxdkRBMVZaRFJJdUpLNThiUlFLZkpQSXgvYWJLd2ZST0hkSTNoUlc4Y1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBMYWJlbDogIkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEwNDM1MDUxMzY0ODI0OTIzMjk0MTk5ODUwODk4NTgzNDQ2NDU3MwojIE1ENSBGaW5nZXJwcmludDogNWM6NDg6ZGM6Zjc6NDI6NzI6ZWM6NTY6OTQ6NmQ6MWM6Y2M6NzE6MzU6ODA6NzUKIyBTSEExIEZpbmdlcnByaW50OiA2NjozMTpiZjo5ZTpmNzo0Zjo5ZTpiNjpjOTpkNTphNjowYzpiYTo2YTpiZTpkMTpmNzpiZDplZjo3YgojIFNIQTI1NiBGaW5nZXJwcmludDogMGM6MmM6ZDY6M2Q6Zjc6ODA6NmY6YTM6OTk6ZWQ6ZTg6MDk6MTE6NmI6NTc6NWI6Zjg6Nzk6ODk6ZjA6NjU6MTg6Zjk6ODA6OGM6ODY6MDU6MDM6MTc6OGI6YWY6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIVENDQXdXZ0F3SUJBZ0lRVG9FdGlvSmw0QXNDN2o0MUFrYmxQVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKZ1RFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0RwpBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEp6QWxCZ05WCkJBTVRIa05QVFU5RVR5QkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdOakV5TURFd01EQXcKTURCYUZ3MHlPVEV5TXpFeU16VTVOVGxhTUlHQk1Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQk1TUjNKbApZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSEV3ZFRZV3htYjNKa01Sb3dHQVlEVlFRS0V4RkRUMDFQClJFOGdRMEVnVEdsdGFYUmxaREVuTUNVR0ExVUVBeE1lUTA5TlQwUlBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTBFQ0xpM0xqa1J2MwpVY0ViVkFTWTA2bS93ZWFLWFR1SCs3dUl6ZzNqTHo4R2x2Q2lLVkNacnRzN29WZXdkRkZ4emUxQ2tVMUIvcW5JCjJHcUdkMFM3V1dhWFVGNjAxQ3h3Uk0vYU41VkNhVHd3eEhHelV2QWhUYUhZdWpsOEhKNmpKSjN5Z3hhWXFoWjgKUTVzVlc3ZXVOSkgrMUdJbUdFYWFQK3ZCK2ZHUVYrdXNlZzJMMjNJd2FtYlY0RWFqY054bzJmOEVTSWwzM3JYcAorMmR0UWVtOE9iMHkyV0lDOGJHb1BXNDNuT0l2NHRPaUpvdkd1RlZEaU9FalBxWFNKRGxxUjZzQTFLR3pxU1grCkRUK25IYnJUVWNFTHBOcXNPTzlWVUNRRlpVYVRORTh0amEzRzFDRVowbzdLQldGeEIzTkg1WW9aRXIwRVRjNU8KbktWSXJMc205d0lEQVFBQm80R09NSUdMTUIwR0ExVWREZ1FXQkJRTFdPV0x4a3dWTjZSQXFUQ3BJYjVITmxwVwovekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QkpCZ05WSFI4RVFqQkFNRDZnClBLQTZoamhvZEhSd09pOHZZM0pzTG1OdmJXOWtiMk5oTG1OdmJTOURUMDFQUkU5RFpYSjBhV1pwWTJGMGFXOXUKUVhWMGFHOXlhWFI1TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFQcGllbS9ZYjZkYzV0M2l1SFhJWQpTZE9INUVPQzZ6L0pxdldvdGU5VmZDRlNaZm5WRGVGczlENk1rM09STGdMRVRnZHhiOENQT0dFSXFCNkJDc0F2CklDOUJpNUhjU0VXODhjYmV1blpyTThnQUxURkdUTzNubmMrSWxQOHp3RmJvSklZbXVOZzRPTjhxYTkwU3pNYy8KUnhkTW9zSUdsZ25XMi80L1BFWkIzMWppVmc4OE84RWNrelhaT0ZLczdzanNMakJPbERXMEpCOUxlR25hOGdJNAp6SlZTay9Cd0pWbWNJR2ZFN3ZtTFYySDBrblo5UDRTTlZiZm81YXpWOGZVWlZxWmErNUFjcjVQcjVSelVaNWRkCkJBNitDNE9tRjRPNU1CS2d4VE1WQmJrTis4Y0ZkdVBZU28zOE5CZWp4aUVvdmpCRk1SN0hlTDVZWVRpc08rSUIKWlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IE89TmV0d29yayBTb2x1dGlvbnMgTC5MLkMuCiMgU3ViamVjdDogQ049TmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IE89TmV0d29yayBTb2x1dGlvbnMgTC5MLkMuCiMgTGFiZWw6ICJOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMTY2OTc5MTUxNTI5Mzc0OTc0OTA0Mzc1NTYzODY4MTI0ODc5MDQKIyBNRDUgRmluZ2VycHJpbnQ6IGQzOmYzOmE2OjE2OmMwOmZhOjZiOjFkOjU5OmIxOjJkOjk2OjRkOjBlOjExOjJlCiMgU0hBMSBGaW5nZXJwcmludDogNzQ6Zjg6YTM6YzM6ZWY6ZTc6YjM6OTA6MDY6NGI6ODM6OTA6M2M6MjE6NjQ6NjA6MjA6ZTU6ZGY6Y2UKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE1OmYwOmJhOjAwOmEzOmFjOjdhOmYzOmFjOjg4OjRjOjA3OjJiOjEwOjExOmEwOjc3OmJkOjc3OmMwOjk3OmY0OjAxOjY0OmIyOmY4OjU5OjhhOmJkOjgzOjg2OjBjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlENWpDQ0FzNmdBd0lCQWdJUVY4c3piOEpjRnVaSEZoZmprREZvNERBTkJna3Foa2lHOXcwQkFRVUZBREJpCk1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVG1WMGQyOXlheUJUYjJ4MWRHbHZibk1nVEM1TUxrTXUKTVRBd0xnWURWUVFERXlkT1pYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcApkSGt3SGhjTk1EWXhNakF4TURBd01EQXdXaGNOTWpreE1qTXhNak0xT1RVNVdqQmlNUXN3Q1FZRFZRUUdFd0pWClV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdU1UQXdMZ1lEVlFRREV5ZE8KWlhSM2IzSnJJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEa3ZINlNNRzNHMkk0ckM3eEd6dUFubHQ3ZStmb1Mwend6CmM3TUVMN3h4ak9XZnRpSmdQbDlkemduL2dnd2JtbEZRR2lhSjNkVmhYUm5jRWc4dENxSkRYUmZRTkpJZzZuUFAKT0N3R0pnbDZjdmY2VURMNHdwUFRhYUlqemtHeHpPVFZIemJSaWpyNGpHUGlGRmxwN1EzVGYydm91QVBsVDJybAptR05wU0FXK0x2OHp0dW1YV1duNFp4bXVrMkdXUkJYVGNyQS92R3A5N0VoL2pjT3JxbkVyVTJsQlV6UzFzTG5GCkJnckVzRVgxUVYxdWlVVjdQVHNtakhUQzVkTFJmYklSMVB0WU1pS2FnTW5jL1F6cGYxNERsODQ3QUJTSEozQTQKcVk1dXN5ZDJtRkhnQmVNaHF4clZoU0k4S2JXYUZzV0FxUFM3YXpDUEwwWUNvckVNSXVEVEFnTUJBQUdqZ1pjdwpnWlF3SFFZRFZSME9CQllFRkNFd3lmc0ExMDZZMm9lcUt0Q25MckZBTWFkTU1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01GSUdBMVVkSHdSTE1Fa3dSNkJGb0VPR1FXaDBkSEE2THk5amNtd3UKYm1WMGMyOXNjM05zTG1OdmJTOU9aWFIzYjNKclUyOXNkWFJwYjI1elEyVnlkR2xtYVdOaGRHVkJkWFJvYjNKcApkSGt1WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQzdya3ZudDFmcmY2b3R0M05IaFdyQjVLVWQ1T2M4CjZmUlpaWGUxZWx0YWpTVTI0SHFYTGpqQVYyQ0RtQWFEbjdsMmVtNVE0THFJTFB4RnpCaXdtWlZSRHV3ZHVJai8KaDFBY2dzTGo0REtBdjZBTFI4akRNZStaWnpLQVR4Y2hlUXhwWE41ZU5LNEN0U2JxVU45L0dHVXN5ZkpqNGFrSAovbnh4SDJzekpHb2VCZmNGYU1CcUVzc3VYbUhMcmlqVGZzSzBacEVtWHp3dUpGL0xXQS9yS095dkVaYnozSHR2CndLZUk4bE4zczJCZXJxNG8yalVzYnpSRjB5YmgzdXhiVHlkckZueTlSQVFZZ3JPSmVSY1FjVDE2b2haTzlRSE4KcEd4bGFLRkpkbHhEeWRpOE5tZHNwWlMxMU15NXZXbzFWaUhlMk1Qcis4dWtZRXl3VmFDZ2UxZXkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDQxNTc4MjgzODY3MDg2NjkyNjM4MjU2OTIxNTg5NzA3OTM4MDkwCiMgTUQ1IEZpbmdlcnByaW50OiA3Yzo2MjpmZjo3NDo5ZDozMTo1Mzo1ZTo2ODo0YTpkNTo3ODphYToxZTpiZjoyMwojIFNIQTEgRmluZ2VycHJpbnQ6IDlmOjc0OjRlOjlmOjJiOjRkOmJhOmVjOjBmOjMxOjJjOjUwOmI2OjU2OjNiOjhlOjJkOjkzOmMzOjExCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNzo5Mzo5Mjo3YTowNjoxNDo1NDo5Nzo4OTphZDpjZToyZjo4ZjozNDpmNzpmMDpiNjo2ZDowZjozYTplMzphMzpiODo0ZDoyMTplYzoxNTpkYjpiYTo0ZjphZDpjNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lUQ0NBZytnQXdJQkFnSVFIMGV2cW1JQWNGQlVUQUdlbTJPWktqQUtCZ2dxaGtqT1BRUURBekNCaFRFTApNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFCkJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVQKSWtOUFRVOUVUeUJGUTBNZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EZ3dNekEyTURBdwpNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5ClpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU4KVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUURSM3N2ZGNtQ0ZZWDdkZVNSCkZ0U3JZcG4xUGxJTEJzNUJBSCtYNFFva1BCMEJCTzQ5MG8wSmx3emdkZVQ2KzNlS0t2VURZRXMyaXhZakZxMEoKY2ZSSzlDaFF0UDZJSEc0L2JDOHZDVmxicFZzTE01bml3ejJKK1dvczc3TFRCdW1qUWpCQU1CMEdBMVVkRGdRVwpCQlIxY2FjWlNCbThuWjNxUVVmZmxNUklkNW5UZVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpFQTd3TmJlcXkzZUFweXQ0amYvN1ZHRkFrSytxRG0KZlFqR0dvZTlHS2h6dlNiS1lBeWR6cG1mejF3UE1PRytGREhxQWpBVTlKTThTYWN6ZXBCR1I3TmpmUk9iVHJkdgpHRGVBVS83ZElPQTFtamJSeHdHNTV0emQ4LzhkTERvV1Y5bVNPZFk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBIE89V0lTZUtleSBPVT1Db3B5cmlnaHQgKGMpIDIwMDUvT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIFN1YmplY3Q6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EgTz1XSVNlS2V5IE9VPUNvcHlyaWdodCAoYykgMjAwNS9PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgTGFiZWw6ICJPSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBIgojIFNlcmlhbDogODY3MTg4Nzc4NzExMzMxNTkwOTAwODA1NTU5MTE4MjM1NDgzMTQKIyBNRDUgRmluZ2VycHJpbnQ6IGJjOjZjOjUxOjMzOmE3OmU5OmQzOjY2OjYzOjU0OjE1OjcyOjFiOjIxOjkyOjkzCiMgU0hBMSBGaW5nZXJwcmludDogNTk6MjI6YTE6ZTE6NWE6ZWE6MTY6MzU6MjE6Zjg6OTg6Mzk6NmE6NDY6NDY6YjA6NDQ6MWI6MGY6YTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQxOmM5OjIzOjg2OjZhOmI0OmNhOmQ2OmI3OmFkOjU3OjgwOjgxOjU4OjJlOjAyOjA3Ojk3OmE2OmNiOmRmOjRmOmZmOjc4OmNlOjgzOjk2OmIzOjg5OjM3OmQ3OmY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEOFRDQ0F0bWdBd0lCQWdJUVFUMXl4L1JySDRGRGZmSFNLRlRmbWpBTkJna3Foa2lHOXcwQkFRVUZBRENCCmlqRUxNQWtHQTFVRUJoTUNRMGd4RURBT0JnTlZCQW9UQjFkSlUyVkxaWGt4R3pBWkJnTlZCQXNURWtOdmNIbHkKYVdkb2RDQW9ZeWtnTWpBd05URWlNQ0FHQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObApaREVvTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpWVd3Z1VtOXZkQ0JIUVNCRFFUQWVGdzB3Ck5URXlNVEV4TmpBek5EUmFGdzB6TnpFeU1URXhOakE1TlRGYU1JR0tNUXN3Q1FZRFZRUUdFd0pEU0RFUU1BNEcKQTFVRUNoTUhWMGxUWlV0bGVURWJNQmtHQTFVRUN4TVNRMjl3ZVhKcFoyaDBJQ2hqS1NBeU1EQTFNU0l3SUFZRApWUVFMRXhsUFNWTlVSU0JHYjNWdVpHRjBhVzl1SUVWdVpHOXljMlZrTVNnd0pnWURWUVFERXg5UFNWTlVSU0JYClNWTmxTMlY1SUVkc2IySmhiQ0JTYjI5MElFZEJJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeTArekFKczlOdDM1MFVscWF4QkpIK3pZSzdMRytES0JLVU9WVEpvWkl5RVZSZDdqeUJ4UgpWVnV1aytnMy95dHI2ZFRxdmlyZHFGRXIxMmJEWVZ4Z0FzajF6bko3TzdqeVRtVUltczJrYWhuQkFidHpwdGYyCnc5M052S1NMdFpsaHVBR2lvOVJOMUFVOWthMzR0QWh4Wks5dzhSeHJmdmJEZDUwa2MzdmtESXpoMlRiaG1Zc0YKbVF2dFJURUp5c0lBMi9keW9KYXFsWWZRanNlMllYTU5kbWFNM0J1MFk2S2ZmNU1UTVBHaEo5dloveXhWaUpHZwo0RThIc0NoV2pCZ2JsMFNPaWQzZ0YyN25LdStQT1FveGhJTFlRQlJKTG5wQjVLZis0MlRNd1ZseFN5d2hwMXQ5CjRCM1JMb0didzlobzk3MldHNnh3c1JZVUM5dGd1U1lCQlFJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVc3dOK3JqYThzSG5SM0pRbXRoRytJYkpwaHBRdwpFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRXVoL3d1SGJyUDV3VU94ClNQTW93QjB1eVFsQitwUUFIS1NrcTBsUGp6MGU3MDF2dmJ5azl2SW1NTWtReWgySSszUVpINFZGdmJCc1VmazIKZnR2MVRESTZRVTliUjgvb0N5MjJ4Qm1kZE1WSHhqdHFENndVMnp6MGM1eXBCZDhBM0hSNCt2ZzFZRmtDRXhoOAp2UHROc0NCdFE3dGdNSHBuTTF6Rm1kSDRMVGxTYy91TXFwY2xYSExaQ0I2clRqempnVEdmQTZiN3dQNHBpRlhhCmhOVlFBN2JpaEtPbU5xb1JPZ0hoR0V2V1JHaXpQZmxUZElTelJwRkdsZ0MzZ0N5MjRlTVE0dHVpNXlpUEFaWmkKRmo0QTR4eWxOb0VZb2t4U2RzQVJvMjdtSGJyaldyNDJVOFUrZFkrR2FTbFlVN1djdTIrZlhNVVk3TjB2NFpqSgovTDdmQ2cwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydGlnbmEgTz1EaGlteW90aXMKIyBTdWJqZWN0OiBDTj1DZXJ0aWduYSBPPURoaW15b3RpcwojIExhYmVsOiAiQ2VydGlnbmEiCiMgU2VyaWFsOiAxODM2NDgwMjk3NDIwOTM2MjE3NQojIE1ENSBGaW5nZXJwcmludDogYWI6NTc6YTY6NWI6N2Q6NDI6ODI6MTk6YjU6ZDg6NTg6MjY6Mjg6NWU6ZmQ6ZmYKIyBTSEExIEZpbmdlcnByaW50OiBiMToyZToxMzo2Mzo0NTo4NjphNDo2ZjoxYTpiMjo2MDo2ODozNzo1ODoyZDpjNDphYzpmZDo5NDo5NwojIFNIQTI1NiBGaW5nZXJwcmludDogZTM6YjY6YTI6ZGI6MmU6ZDc6Y2U6NDg6ODQ6MmY6N2E6YzU6MzI6NDE6Yzc6Yjc6MWQ6NTQ6MTQ6NGI6ZmI6NDA6YzE6MWY6M2Y6MWQ6MGI6NDI6ZjU6ZWU6YTE6MmQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lKQVA3YzR3RVB5VWovTUEwR0NTcUdTSWIzRFFFQkJRVUFNRFF4Q3pBSkJnTlYKQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoTUI0WApEVEEzTURZeU9URTFNVE13TlZvWERUSTNNRFl5T1RFMU1UTXdOVm93TkRFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRCkJnTlZCQW9NQ1VSb2FXMTViM1JwY3pFUk1BOEdBMVVFQXd3SVEyVnlkR2xuYm1Fd2dnRWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFESWFQSEoxdGF6TkhVbWdoN3N0TDdxWE9FbTdSRkhZZUdpZkJaNApRQ0hrWUo1YXlHUGh4TEdXa3Y4WWJXa2o0U3RpOTkzaU5pK1JCN2xJenc3c2ViWXM1elJMY0FnbG96eUhHeG55CmdRY1BPSkFaMHhIK2hyVHkwVjRlSHBiTmdHek9PekdUdHZLZzBLbVZFbjJsbXN4cnlJUldpak9wNXlJVlV4YncKekJmc1YxL3BvZ3FZQ2Q3alg1eHYzRWpqaFFzVldxYTZuNnhJNHdteTkvUXkzbDQwdmh4NFhVSmJ6ZzRpajAyUQoxMzB5R0xNTExHcS9qajhVRVlrZ0RuY1V0VDJVQ0lmM0pSN1ZzbUFBN0c4cUtDVnVLajRZWXhjbFB6NUVJQmIyCkpzZ2xyZ1ZLdE9kakxQT01GbE4rWFBzUkdnakJSbUtmSXJqeHdvMXAzUG82V0FiZkFnTUJBQUdqZ2J3d2dia3cKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVR3UzK1FUbVF0Q1JadmdIeVV0VkY5bG81M0JFdwpaQVlEVlIwakJGMHdXNEFVR3UzK1FUbVF0Q1JadmdIeVV0VkY5bG81M0JHaE9LUTJNRFF4Q3pBSkJnTlZCQVlUCkFrWlNNUkl3RUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoZ2drQS90emoKQVEvSlNQOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6QU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBUUVBaFFNZWtuSDJRcS9obzJHZTYvUEFEL0tsMU5xVjV0YSthRFk5Zm00ZlRJcnYwUThoCmJWNmxVbVBPRXZqdkt0cHY2emYrRXdMSHl6cytJbXZhWVM1LzFISTkzVERoSGt4QUdZd1AxNXpSZ3pCN21GbmMKZmNhNURDbE1vVE9pNjJjNlpZVFRsdUx0ZGtWd2o3VXIzdmtqMWtsdVBCUzF4cDgxSGxEUXdZOXFjRVFDWXN1dQpIV2hCcDZwWDZGT3FCOUlHOXRVVUJndVJBM1VzYkhLMVlaV2FEWXU1RGVmMTMxVE4zdWJZMWdrSWwyUGx3UzZ3CnQwUW13Q2JBcjFVd25qdlZOaW9aQlBSY0h2L1BMTGYvMFAySFFCSFZFU083U01BaHFhUW9MZjBWK0xCT0svUXcKV3lIOEVaRTB2a0h2ZTUyWGRmK1hsY0NXV0MvcXUwYlh1K1RaTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIgTz1EZXV0c2NoZSBUZWxla29tIEFHIE9VPVQtVGVsZVNlYyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1EZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiBPPURldXRzY2hlIFRlbGVrb20gQUcgT1U9VC1UZWxlU2VjIFRydXN0IENlbnRlcgojIExhYmVsOiAiRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIiCiMgU2VyaWFsOiAzOAojIE1ENSBGaW5nZXJwcmludDogNzQ6MDE6NGE6OTE6YjE6MDg6YzQ6NTg6Y2U6NDc6Y2Q6ZjA6ZGQ6MTE6NTM6MDgKIyBTSEExIEZpbmdlcnByaW50OiA4NTphNDowODpjMDo5YzoxOTozZTo1ZDo1MTo1ODo3ZDpjZDpkNjoxMzozMDpmZDo4YzpkZTozNzpiZgojIFNIQTI1NiBGaW5nZXJwcmludDogYjY6MTk6MWE6NTA6ZDA6YzM6OTc6N2Y6N2Q6YTk6OWI6Y2Q6YWE6Yzg6NmE6MjI6N2Q6YWU6Yjk6Njc6OWU6Yzc6MGI6YTM6YjA6Yzk6ZDk6MjI6NzE6YzE6NzA6ZDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuekNDQW9lZ0F3SUJBZ0lCSmpBTkJna3Foa2lHOXcwQkFRVUZBREJ4TVFzd0NRWURWUVFHRXdKRVJURWMKTUJvR0ExVUVDaE1UUkdWMWRITmphR1VnVkdWc1pXdHZiU0JCUnpFZk1CMEdBMVVFQ3hNV1ZDMVVaV3hsVTJWagpJRlJ5ZFhOMElFTmxiblJsY2pFak1DRUdBMVVFQXhNYVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCU2IyOTBJRU5CCklESXdIaGNOT1Rrd056QTVNVEl4TVRBd1doY05NVGt3TnpBNU1qTTFPVEF3V2pCeE1Rc3dDUVlEVlFRR0V3SkUKUlRFY01Cb0dBMVVFQ2hNVFJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCQlJ6RWZNQjBHQTFVRUN4TVdWQzFVWld4bApVMlZqSUZSeWRYTjBJRU5sYm5SbGNqRWpNQ0VHQTFVRUF4TWFSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlNiMjkwCklFTkJJREl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3JDNk0xNElzcEZMRVUKaGE4OEVPUTVielZkU3E3ZDZtR05sVW4wYjJTakdtQm1wS2xBSW9UWjFLWGxlSk1PYUFHdHVVMWNPczdUdUtoQwpRTi9QbzdxQ1dXcVNHNndjbXRvSUt5VW4rV2tqUi9IZzZ5eDZtL1VUQXRCK05IekNuandBV2F2MTJnejFNandyCnJGRGExc1BlZzVUS3FBeVpNZzRJU0ZaYmF2dmE0VmhZQVVsZmNrRThGUVlCamwydHFyaVR0TTJlNjZmb2FpMVMKTk5zNjcxeDFVZHJiOHpINTduR1lNc1JVRlVRTStadFY3YTNmR0FpZ280YUtTZTVUQlk4WlROWGVXSG1iMG1vYwpRcXZGMWFmUGFBK1c1T0ZobUhaaHlKRjgxajRBNHBGUWgrR2RDdWF0bDlJZHhqcDl5N3phQXpUVmpsc0I5V29ICnR4YTJia3AvQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJReHcza2J1dlZUMXhmZ2lYb3RGMndLc3l1ZE16QVAKQmdOVkhSTUVDREFHQVFIL0FnRUZNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQwpBUUVBbEdSWnJUbGs1eW5yRS81YXc0c1RWOGdFSlBCMGQ4Qmc0MmY3NlltbWc3K1dnbnh1MU1NOTc1NkFicnNwCnRKaDZzVHRVNnprWFIzNGFqZ3Y4SHpGWk1RU3l6aGZ6TE1kaU5sWGlJdGlKVmJTWVNLcGsrdFljTnRoRWVGcGEKSXpwWGwvVjZNRSt1bjJwTVN5dU9vQVBqUHVDcDFOSjcwck9vNG5JOHJaNy9nRm5rbTBXMDlqdXd6VGtabURMbAo2aUZoa09ReElZNDBzZmN2TlVxRkVOcm5pamNodmxsajRQS0ZpREZUMUZRVWhYQjU5QzRHZHlkMUx4KzRpdm4rCnhicllOdVNEN09kbHQ3OWpXdk5HcjRHVU45UkJqTllqMWg3UDlXZ2JSR09pV3Jxbk5WbWg1WEFGbXc0alY1bVUKQ20yNk9XTW9ocEx6R0lUWSs5SFBCVlprVnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q3liZXJ0cnVzdCBHbG9iYWwgUm9vdCBPPUN5YmVydHJ1c3QsIEluYwojIFN1YmplY3Q6IENOPUN5YmVydHJ1c3QgR2xvYmFsIFJvb3QgTz1DeWJlcnRydXN0LCBJbmMKIyBMYWJlbDogIkN5YmVydHJ1c3QgR2xvYmFsIFJvb3QiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NjgyODc3NDg0MzYwCiMgTUQ1IEZpbmdlcnByaW50OiA3MjplNDo0YTo4NzplMzo2OTo0MDo4MDo3NzplYTpiYzplMzpmNDpmZjpmMDplMQojIFNIQTEgRmluZ2VycHJpbnQ6IDVmOjQzOmU1OmIxOmJmOmY4Ojc4OjhjOmFjOjFjOmM3OmNhOjRhOjlhOmM2OjIyOjJiOmNjOjM0OmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5NjowYTpkZjowMDo2MzplOTo2Mzo1Njo3NTowYzoyOTo2NTpkZDowYTowODo2NzpkYTowYjo5YzpiZDo2ZTo3Nzo3MTo0YTplYTpmYjoyMzo0OTphYjozOTozZDphMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG9UQ0NBb21nQXdJQkFnSUxCQUFBQUFBQkQ0V3FMVWd3RFFZSktvWklodmNOQVFFRkJRQXdPekVZTUJZRwpBMVVFQ2hNUFEzbGlaWEowY25WemRDd2dTVzVqTVI4d0hRWURWUVFERXhaRGVXSmxjblJ5ZFhOMElFZHNiMkpoCmJDQlNiMjkwTUI0WERUQTJNVEl4TlRBNE1EQXdNRm9YRFRJeE1USXhOVEE0TURBd01Gb3dPekVZTUJZR0ExVUUKQ2hNUFEzbGlaWEowY25WemRDd2dTVzVqTVI4d0hRWURWUVFERXhaRGVXSmxjblJ5ZFhOMElFZHNiMkpoYkNCUwpiMjkwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUErTWk4dlJSUVpoUC84Tk41CjdDUHl0eHJIam9YeEVuT21HYW9RMjV5aVpYUmFkejVSZlZiMjNDTzIxTzFmV0xFM1RkVkpEbTcxYW9mVzBvelMKSjhiaS96YWZtR1dnRTA3R0ttU2IxWkFTenhRRzlEdmoxQ2krNkE3NHEwNUlsRzJPbFRFUVhPMmlMYjNWT20yeQpITHRnd0VaTEFmVkpybjVHaXRCMGphRU1Bczd1L09lUHVHdG04MzlFQUw5bUpSUXIzUkF3SFFlV1AwMzJhN2lQCnQzc01wVGpyM2tmYjFWMDUvSWluODljcWRQSG9XcUk3bjFDNnBveEZOY0pRWlpYY1k0THYzYjkzVFp4aXlXTnoKRnRBcEQwbXBTUEN6cXJkc3hhY3dPVUJkcnNUaVhTWlQ4TTRjSXdoaHFKUVp1Z1JpUU93Zk9IQjNFZ1p4cHpBWQpYU1VucFFJREFRQUJvNEdsTUlHaU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCk1CMEdBMVVkRGdRV0JCUzJDSHNOZXN5c0lFeUdWakplejZ0dWhTMXdWekEvQmdOVkhSOEVPREEyTURTZ01xQXcKaGk1b2RIUndPaTh2ZDNkM01pNXdkV0pzYVdNdGRISjFjM1F1WTI5dEwyTnliQzlqZEM5amRISnZiM1F1WTNKcwpNQjhHQTFVZEl3UVlNQmFBRkxZSWV3MTZ6S3dnVElaV01sN1BxMjZGTFhCWE1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUJXN3dvam9GUk9sWmZKK0luYVJjSFVvd0FsOUI4VHE3ZWpoVmhwd2pDdDJCV0tMZVBKellGYStITWoKV3FkOEJmUDlJanNPMFFiRTJ6Wk1jd1NPNWJBaTVNWHpMcVhaSStPNFRrb2dwMjRDSko4aVlHZDdpeDF5Q2NVeApYT2w1bjRCSFBhMmhDd2NVUFVmL0Eya2FEQXRFNTJNbHAzK3l5YmgyaE8wajluMEhxMFYrMDkrenYrbUt0czJvCm9tY3JVdFczWmZBNVRHT2drWG1UVWc5VTNZTzduOUdQcDFOenc4di9NT3g4QkxqWVJCK1RYM0VKSXJkdVB1b2MKQTA2ZEdpQmgrNEUzN0Y3OENrV3IxK2NYVmRDZzZtQ2JwdmJqakZzcHdnWmdGSjB0bDB5cGt4V2RZY1FCWDBqVwpXTDFXTVJKT0VjZ2g0TE1Sa1dYYnRLYUlPTTVWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUNodW5naHdhIFRlbGVjb20gQ28uLCBMdGQuIE9VPWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89Q2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4gT1U9ZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJlUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAyODk1NjA4ODY4MjczNTE4OTY1NTAzMDUyOTA1NzM1Mjc2MDQ3NwojIE1ENSBGaW5nZXJwcmludDogMWI6MmU6MDA6Y2E6MjY6MDY6OTA6M2Q6YWQ6ZmU6NmY6MTU6Njg6ZDM6NmI6YjMKIyBTSEExIEZpbmdlcnByaW50OiA2Nzo2NTowZDpmMTo3ZTo4ZTo3ZTo1Yjo4Mjo0MDphNDpmNDo1Njo0YjpjZjplMjozZDo2OTpjNjpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogYzA6YTY6ZjQ6ZGM6NjM6YTI6NGI6ZmQ6Y2Y6NTQ6ZWY6MmE6NmE6MDg6MmE6MGE6NzI6ZGU6MzU6ODA6M2U6MmY6ZjU6ZmY6NTI6N2E6ZTU6ZDg6NzI6MDY6ZGY6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZzRENDQTVpZ0F3SUJBZ0lRRmNpOVpVZGNyN2lYQUY3a0J0SzhuVEFOQmdrcWhraUc5dzBCQVFVRkFEQmUKTVFzd0NRWURWUVFHRXdKVVZ6RWpNQ0VHQTFVRUNnd2FRMmgxYm1kb2QyRWdWR1ZzWldOdmJTQkRieTRzSUV4MApaQzR4S2pBb0JnTlZCQXNNSVdWUVMwa2dVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlCkZ3MHdOREV5TWpBd01qTXhNamRhRncwek5ERXlNakF3TWpNeE1qZGFNRjR4Q3pBSkJnTlZCQVlUQWxSWE1TTXcKSVFZRFZRUUtEQnBEYUhWdVoyaDNZU0JVWld4bFkyOXRJRU52TGl3Z1RIUmtMakVxTUNnR0ExVUVDd3doWlZCTApTU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNFNVUDdvM2JpRE4xWjgydEgzMDZUbTJkMHk4VTgyTjB5d0VoYWpmcWhGQUgKU3laYkNVTnNJWjVxeU5VRDlXQnBqOHp3SXVRZjUvZHFJakczTEJYeTRQNEFha1AvaDJYR3RSckJwMHh0SW5BaAppakh5bDNTSkNSSW1ISjdLMlJLaWxUemE2V2UvQ0tCazQ5WkN0MFh2bC9UMjlkZTFTaFVDV0gyWVdFdGd2TTNYCkRab1RNMVBSWWZsNjFkZDRzNW96OXdDR3poMU5sRGl2cU94NFVYQ0tYQkNEVVNIM0VUMDBobDdsU00yWGdZSTEKVEJuc1pmWnJ4UVdoN2tjVDFyTWhKNVFRQ3Rra083cStSQk5HTUQrWFBOalgxMnJ1T3pqaks5U1hEcmtiNXdkSgpmemNxK1hkNHoxVHRXMGFkbzRBT2tVUEIxbHRmRkxxZnBvMGtSMEJadjNJNHNqWnNOLytaMFYwT1dRcXJhZmZBCnNnUkZlbFFBcnI1VDlyWG40Zmc4b3pIU3FmNGhVbVRGcG1md2RRY0dsQlNCVmNZbjVBR1BGOEZxY2RlK1MvdVUKV0gxK0VUT3hRdmRpYkJqV3p3bG9QbjlzOWg2UFlxMmxZOXNKcHg4aVFrRWViNW1LUHRmNVAwQjZlYkNsQVpMUwpuVDBJRmFVUUFTMnpNbmFvbFEyemVwcjdCeEI0RVcvaGo4ZTZEeVVhZENybEhKaEJtZDhoaCtpVkJtb0tzMnBICmRtWDJPcytQWWhjWmV3b296UnJTZ3g0aHh5eS92djloYUxkbkc3dDRUWTNPWitYa3dZNjNJMmJpblpCMU5KaXAKTml1S21wUzVuZXpNaXJINEpZbGNXcll2akI5dGVTU25VbWpEaERYaVpvMWpEaVZOMVJteTVuazNweUtkVkRFQwpBd0VBQWFOcU1HZ3dIUVlEVlIwT0JCWUVGQjRNOTdabjh1R1NKZ2xGd0ZVNUxuYy9Ra3FpTUF3R0ExVWRFd1FGCk1BTUJBZjh3T1FZRVp5b0hBQVF4TUM4d0xRSUJBREFKQmdVckRnTUNHZ1VBTUFjR0JXY3FBd0FBQkJSRnNNTEgKQ2xaODdsdDRESlg1R0ZQQnBoellFREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBQ2JPRFUxa0JQcFZKdWZHQgp1dmwySUNPMUoyQjAxR3FaTkY1c0FGUFpuL0ttc1NRSFJHb3F4cVdPZUJMb1I5bFlHeE1xWG5tYm53b3FaNllsClB3WnBWblBEaW1aSSt5bUJWM1FHeXB6cUtPZzRaeVlyOGRXMVAyV1QrRFpkam8yTlFDQ0hHZXJ2SjhBOXREa1AKSlh0b1VIUlZuQXhaZlZvOVFaUWxVZ2pnUnl3Vk1SblZ2d2RWeHJzU3RaZjBYNE9GdW5IQjJXeUJFWFlLQ3JDLwpncGYzNmozNit1d3RxU2lVTzFiZDBsRXVyc0M5Q0JXTWQxSTBsdGFick5NZGptRVBOWHVicmpscEMySmdRQ0EyCmo2LzdOdTR0Q0VvZHVMK2JYUGpxcFJ1Z2M2YlkrRzdnTXdSZmFLb25oKzNad1pDYzdiM2phald2WTkrckdObTYKNXVsSzZsQ0tEMkdUSHVJdEdlSXdsRFdTWFE2MkI2OFpnSTlIa0ZGTExrM2RoZUxTQ2xJS0Y1cjhHckJRQXVVQgpvMk0zSVV4RXhKdFJtUkVPYzV3R2oxUXVweWhlUkRtSFZpMDN2WVZFbE9FTVN5eWN3NUtGTkdITEQ3aWJTa05TCi9qUTZmYmpwS2R4MnFjZ3crQlJ4Z01ZZU5raDBJa0ZjaDRMb0dIR0xRWWxFNTM1WVc2aTRqUlBwcDJ6RFIrMnoKR3AxaXJvMkM2cFNlM1ZrUXc2M2Q0azNqTWRYSDdPanlzUDZTSGhZS0d2elo4L2dudHNtK0hiUnNaSkIvOU9URQpXOWMzcmtJTzNhUWFiM3lJVk1VV2J1RjZhQzc0T3I4TnBEeUpPM2luVG1PREJDRUlaNDN5Z2tuUVcvMnh6UStECmhOUStJSVgzU2owcm5QMHFDZ2xONm9INEVadz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Y2VydFNJR04gT1U9Y2VydFNJR04gUk9PVCBDQQojIFN1YmplY3Q6IE89Y2VydFNJR04gT1U9Y2VydFNJR04gUk9PVCBDQQojIExhYmVsOiAiY2VydFNJR04gUk9PVCBDQSIKIyBTZXJpYWw6IDM1MjEwMjI3MjQ5MTU0CiMgTUQ1IEZpbmdlcnByaW50OiAxODo5ODpjMDpkNjplOTozYTpmYzpmOTpiMDpmNTowYzpmNzo0YjowMTo0NDoxNwojIFNIQTEgRmluZ2VycHJpbnQ6IGZhOmI3OmVlOjM2Ojk3OjI2OjYyOmZiOjJkOmIwOjJhOmY2OmJmOjAzOmZkOmU4OjdjOjRiOjJmOjliCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYTphOTo2MjpjNDpmYTo0YTo2YjphZjplYjplNDoxNToxOTo2ZDozNToxYzpjZDo4ODo4ZDo0Zjo1MzpmMzpmYTo4YTplNjpkNzpjNDo2NjphOTo0ZTo2MDo0MjpiYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRE9EQ0NBaUNnQXdJQkFnSUdJQVlGRm5BQ01BMEdDU3FHU0liM0RRRUJCUVVBTURzeEN6QUpCZ05WQkFZVApBbEpQTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEClFUQWVGdzB3TmpBM01EUXhOekl3TURSYUZ3MHpNVEEzTURReE56SXdNRFJhTURzeEN6QUpCZ05WQkFZVEFsSlAKTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVRDQwpBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxjenVYN0lKVXFPdGR1MEtCdXFWNURvCjBTTFRaTHJUaytqVXJJWmhRR3BnVjJoVWhFMjhhbFFDQmYvZm01b3FybDBIajByREtIL3YreXY2ZWZISHJmQVEKVXlTUWkyYkpxSWlycjFxakFPbSt1a2J1VzNON0xCZUNnVjVpTEtFQ1piTzl4U3NBZnNUOEF6TlhEZTNpK3M1ZApSZFk0elRXMnNzSFFuSUZLcXVTeUFWd2RqMStaeExHdDI0Z2g2NUFJZ29Eek1LTkQ1cENDcmxVb1NlMWIxNmtRCk9BNytqMHhibTBicVFmV3dDSFREMElnenRuelhkTi9jaE5GRERuVTVvU1ZBS09wNHl3NHNMam1kakl0dUZod3YKSm9JUTR1TmxsQW9Fd0Y3M1hWdjRFT0xRdW5wTCs5NDNBQUFhV3lqajBweHpQaktIbUtISlVTL1gzcXd6czA4QwpBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQWNZd0hRWURWUjBPCkJCWUVGT0NNbTlzbFNiUHhmSWJXc2tLSEM5QnJvTm5rTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBKzBoeUoKTGpYOCtIWGQ1bjlsaVBSeVRNa3MxekpPODkwWmVVZTlqanRia3c5UVNTUVRheFFHY3U4SjA2R2g0MENFeWVjWQpNblE4U0c0UG4wdlU5eDdUazRaa1ZKZGpjbERWVmMvNklKTUNvcHZESTVOT0ZsVjJvSEI1YmMwaEg4OHZMYndaCjQ0Z3grRmthZ1FuSWw2WjB4MkRFVzh4WGpySjEvUnNDQ2R0WmIzS1RhZmN4UWRhSU9MK0hzcjBXZWZtcTVMNkkKSmQxaEp5TWN0VEVIQkRhMEdwQzlvSFJ4VUlsdHZCVGpENGF1OGFzK3g2QUp6S05JMGVEYlpPZVN0Yyt2Y2tOdwppL25EaER3VHFuNlNtMWRUay9wd3dwRU9NZm1iWjEzcGxqaGVYN056VG9nVlo5NmVkaEJpSUw1VmFaVkRBRGxOCjl1NndXazVKUkZSWVgwS0QKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDggR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyIKIyBTZXJpYWw6IDI4ODA5MTA1NzY5OTI4NTY0MzEzOTg0MDg1MjA5OTc1ODg1NTk5CiMgTUQ1IEZpbmdlcnByaW50OiBiNTplODozNDozNjpjOToxMDo0NDo1ODo0ODo3MDo2ZDoyZTo4MzpkNDpiODowNQojIFNIQTEgRmluZ2VycHJpbnQ6IDAzOjllOmVkOmI4OjBiOmU3OmEwOjNjOjY5OjUzOjg5OjNiOjIwOmQyOmQ5OjMyOjNhOjRjOjJhOmZkCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNDo3ODpiODoxMjoyNTowZDpmODo3ODo2Mzo1YzoyYTphNzplYzo3ZDoxNTo1ZTphYTo2Mjo1ZTplODoyOToxNjplMjpjZDoyOTo0Mzo2MTo4ODo2YzpkMTpmYjpkNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRC9qQ0NBdWFnQXdJQkFnSVFGYXh1bEJteWVVdEI5aWVwd3hnUEh6QU5CZ2txaGtpRzl3MEJBUXNGQURDQgptREVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4T1RBM0JnTlZCQXNUCk1DaGpLU0F5TURBNElFZGxiMVJ5ZFhOMElFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXMKZVRFMk1EUUdBMVVFQXhNdFIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodgpjbWwwZVNBdElFY3pNQjRYRFRBNE1EUXdNakF3TURBd01Gb1hEVE0zTVRJd01USXpOVGsxT1Zvd2daZ3hDekFKCkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBb1l5a2cKTWpBd09DQkhaVzlVY25WemRDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TmpBMApCZ05WQkFNVExVZGxiMVJ5ZFhOMElGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnCkxTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOemlYbUpZSFROWE9USXoKK3V2TGg0eW4xRXJkQm9qcVpJNHhtS1U0a0I2WXp5NWpLL0JHdkVTeWlhSEFLQXhKY0NHVm4yVEFwcE1TQW1VbQpoc2FsaWZENjE0U2djSzlQR3BjL0JrVFZ5ZXR5RUgza01TajdIR0htS0FkRWM1SWlhYWNEaUd5ZFk4aFMycGduCjV3aE1jRDYweVJMQnhXZURYVFB6QXhIc2F0QlQ0dEc2Tm1DVWdMdGhZMnhiRjM3ZlFKUWVxdzNDSVNod2lQL1cKSm14c1lBUWxUbFYrZmUrL2xFamV0eDNkY0kwRlg0aWxtL0xDN3VyUlFFRnRZamdkVmdiRkEwZFJJQm44ZXhBTApEbUt1ZGxXL1gzZStQa2tCVXoyWUpRTjJKRm9kdE51SjZubmx0ck03UDdwTUtFRi9CcXhxanNIUTlnVWRmZVpDCmh1T2wxVWNDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKSFFZRFZSME9CQllFRk1SNXlvNmhUZ01kSE54cjJ6RmJsRDQvTUg4dE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQgpBUUF0eFJQUFZvQjdlbmk5bjY0c21lZnYydCtVWGdscHArZHVhSXk5Y3I1SHFRNlhFcmhLOFdUVE9kOGxOTlRCCnpVNkI4QThFeENTek5KYkdwcW93MzJoaGM5ZjVqb1dKN3c1ZWxTaEtLaWVQRUk0dWZJYkVBcDdhREhkbERrUU4Ka3YzOXN4WTIraEVOSFl3T0I0bHFLVmIzY3ZUZEZaeDNOV1pYcXhOVDJJN0JRTVhYRXhaYWNzZTNhUUhFZXJHRApBV2g5alVHaGxCakJKVno4OFA2REFvZDhEUTNQTGdoY1NrQU5QdXlCWWVZazI4cmdEaTBIc2o1VzNJMzFRWVVIClNKc01DOHRKUDMzc3QvM0xqV2VKR3F2dHV4NmpBQWdJRnlxQ1hERmRSb290RDRhYmRObEYrOVJBc1hxcWFDMkcKc3BraTRjRXJ4NXo0ODErb2doTHJHUkV0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIgTz10aGF3dGUsIEluYy4gT1U9KGMpIDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIgTz10aGF3dGUsIEluYy4gT1U9KGMpIDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiIKIyBTZXJpYWw6IDcxNzU4MzIwNjcyODI1NDEwMDIwNjYxNjIxMDg1MjU2NDcyNDA2CiMgTUQ1IEZpbmdlcnByaW50OiA3NDo5ZDplYTo2MDoyNDpjNDpmZDoyMjo1MzozZTpjYzozYTo3MjpkOToyOTo0ZgojIFNIQTEgRmluZ2VycHJpbnQ6IGFhOmRiOmJjOjIyOjIzOjhmOmM0OjAxOmExOjI3OmJiOjM4OmRkOmY0OjFkOmRiOjA4OjllOmYwOjEyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBhNDozMTowZDo1MDphZjoxODphNjo0NDo3MTo5MDozNzoyYTo4NjphZjphZjo4Yjo5NToxZjpmYjo0MzoxZDo4Mzo3ZjoxZTo1Njo4ODpiNDo1OTo3MTplZDoxNTo1NwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lEQ0NBZzJnQXdJQkFnSVFOZndtWE5tRVQ4azlKajFYbTY3WFZqQUtCZ2dxaGtqT1BRUURBekNCaERFTApNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRTRNRFlHQTFVRUN4TXZLR01wCklESXdNRGNnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreEpEQWkKQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNakFlRncwd056RXhNRFV3TURBdwpNREJhRncwek9EQXhNVGd5TXpVNU5UbGFNSUdFTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1kR2hoCmQzUmxMQ0JKYm1NdU1UZ3dOZ1lEVlFRTEV5OG9ZeWtnTWpBd055QjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWcKWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dgpkQ0JEUVNBdElFY3lNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRW90V2NnbnVWbmZGU2VJZitpaGEvCkJlYmZvd0pQRFFmR0FGRzZEQUpTTFNLa1FqbkUvby9xeWNHKzFFMy9uM3FlNHJGOG1xMm5oZ2x6aDlIbm11TjYKcGFwdSs3cXpjTUJuaUtJMTFLT2FzZjJ0d3U4eCtxaTU4L3NJeHBIUit5bVZvMEl3UURBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVW10Z0FNQURuYTMrRkdPNkx0czZLCkRQZ1I0YnN3Q2dZSUtvWkl6ajBFQXdNRGFRQXdaZ0l4QU4zNDRGZEhXNmZtQ3NPOTlZQ0tselVORzRrOFZJWjMKS01xaDlIbmV0ZVk0c1BCbGNJeC9BbFRDdi8vWW9UN1p6d0l4QU1TTmxQemNVOUxjblhnV0h4VXpJMU5TNDFveApYWjNLcnIwVEtVUU5KMXVvNTJpY0V2ZFlQeTV5QWxlamo2RVVMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzMgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA4IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJ0aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzMiCiMgU2VyaWFsOiAxMjc2MTQxNTcwNTY2ODEyOTk4MDU1NTY0NzYyNzU5OTU0MTQ3NzkKIyBNRDUgRmluZ2VycHJpbnQ6IGZiOjFiOjVkOjQzOjhhOjk0OmNkOjQ0OmM2Ojc2OmYyOjQzOjRiOjQ3OmU3OjMxCiMgU0hBMSBGaW5nZXJwcmludDogZjE6OGI6NTM6OGQ6MWI6ZTk6MDM6YjY6YTY6ZjA6NTY6NDM6NWI6MTc6MTU6ODk6Y2E6ZjM6NmI6ZjIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRiOjAzOmY0OjU4OjA3OmFkOjcwOmYyOjFiOmZjOjJjOmFlOjcxOmM5OmZkOmU0OjYwOjRjOjA2OjRjOmY1OmZmOmI2Ojg2OmJhOmU1OmRiOmFhOmQ3OmZkOmQzOjRjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFS2pDQ0F4S2dBd0lCQWdJUVlBR1h0MGFuNnJTMG10WkxML2VRK3pBTkJna3Foa2lHOXcwQkFRc0ZBRENCCnJqRUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRW9NQ1lHQTFVRUN4TWYKUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJdwpNRGdnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreEpEQWlCZ05WCkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNekFlRncwd09EQTBNREl3TURBd01EQmEKRncwek56RXlNREV5TXpVNU5UbGFNSUd1TVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1kR2hoZDNSbApMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OURaWEowYVdacFkyRjBhVzl1SUZObGNuWnBZMlZ6SUVScGRtbHphVzl1Ck1UZ3dOZ1lEVlFRTEV5OG9ZeWtnTWpBd09DQjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGwKWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0SUVjegpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNyOG5MUHZiMkZ2ZGVIc2JubmRtCmdjcyt2SHl1ODZZbm1qU2phREZ4T0ROaTVQTnhabm14cVdXanBZdlZqMkF0UDBMTXFtc3l3Q1BMTEVIZDVOLzgKWVp6aWM3SWlsUkZER0YvRXRoOVhiQW9GV0NMSU5rdzZmS1hSejRhdmlLZEVBaE4wY1hNS1Fsa0MrQnNVYTBMZgpiMSs2YTRLaW5Wdm5TcjBlQVhMYlMzVG9PMzkvZlI4RXRDYWI0TFJhckVjOVZialhzQ1pTS0FFeFFHYlkyU1M5Cjlpclk3Q0ZKWEp2MmV1bC9WVFYrbG11Tms1TW55NUs3NnF4QXdKL0MrSURQWGZSYTNNNTBocVkrYkF0VHlyMlMKemhrR2N1WU1YRGhweHdUV3ZHek9XL2IzYUp6Y0pSVklpS0hwcWZpWW5PRHoxVEVvWVJGc1o1YU5PWm5Md2tVawpPUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WCkhRNEVGZ1FVcld5cWxHQ2M3ZVQvK2o0S2RDdGpBL2UyV2I4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFCcEEKMkpWbHJBbVNpY1k1OUJEbHFRNW1VMTE0M3Zva2tidm5SRkhmeGhZMEN1OXFSRkhxS3dlS0EzckQ2ejhLTEZJVwpvQ3REdVNXUVAzQ3BNeVZ0UlJvb095ZlBxc01wUWh2Zk8wekFNelJiUVlpL2F5dGxyeWp2c3ZYRHFtYk9lMWJ1CnQ4akxaOEhKbkJvWXVNVERTUVB4WUE1UXpVYkY4M2Q1OTdZVjREamJ4eThvb0F3L2R5WjAyU1VTMmpIYUdoN2MKS1VHUklqeHBwN3NDOHJaY0p3T0o5QWJxbStSeWd1T2hDY0hwQUJuVFB0UndhN3B4cHFwWXJ2Uzc2V3kyNzRmTQptN3YvT2VaV1lkTUtwOFJjVEdCN0JYY21lci9ZQjFJc1l2ZHdZOWs1dkc4Y3dubmNkaW12enNVc1pBUmVpRFp1Ck1kUkFHbUkwTmo4MUFhNnNZNkE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDcgR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiA4MDY4Mjg2MzIwMzM4MTA2NTc4MjE3NzkwODc1MTc5NDYxOTI0MwojIE1ENSBGaW5nZXJwcmludDogMDE6NWU6ZDg6NmI6YmQ6NmY6M2Q6OGU6YTE6MzE6Zjg6MTI6ZTA6OTg6NzM6NmEKIyBTSEExIEZpbmdlcnByaW50OiA4ZDoxNzo4NDpkNTozNzpmMzowMzo3ZDplYzo3MDpmZTo1Nzo4Yjo1MTo5YTo5OTplNjoxMDpkNzpiMAojIFNIQTI1NiBGaW5nZXJwcmludDogNWU6ZGI6N2E6YzQ6M2I6ODI6YTA6NmE6ODc6NjE6ZTg6ZDc6YmU6NDk6Nzk6ZWI6ZjI6NjE6MWY6N2Q6ZDc6OWI6Zjk6MWM6MWM6NmI6NTY6NmE6MjE6OWU6ZDc6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNyakNDQWpXZ0F3SUJBZ0lRUExMMFNBb0E0djdySkR0ZVlEN0RhekFLQmdncWhrak9QUVFEQXpDQm1ERUwKTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4T1RBM0JnTlZCQXNUTUNoagpLU0F5TURBM0lFZGxiMVJ5ZFhOMElFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEUyCk1EUUdBMVVFQXhNdFIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDAKZVNBdElFY3lNQjRYRFRBM01URXdOVEF3TURBd01Gb1hEVE00TURFeE9ESXpOVGsxT1Zvd2daZ3hDekFKQmdOVgpCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBb1l5a2dNakF3Ck55QkhaVzlVY25WemRDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TmpBMEJnTlYKQkFNVExVZGxiMVJ5ZFhOMElGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSApNakIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJCV3g2UDBERlVQbHJPdUhOeEZpNzlLRE5sSjlSVmNMClNvMTdWRHM2Ymw4VkFzQlFwczhsTDMzS1NMakhVR01jS2lFSWZKbzIyQXYrMFNiRldERXdLQ1h6WFYyanVMYWwKdEpMdGJDeWY2OTFEaWFJOFMwaVJIVkRzSnQvV1lDNjlJYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZCVmZOVmRSVmZzbHNxMERhZndCby9xK0VWWFZNQW9HCkNDcUdTTTQ5QkFNREEyY0FNR1FDTUdTV1dhYm9DZDZMdXZwYWlJandINUhUUnFqeVNrd0NZL3RzWHpqYkxrR1QKcVE3bW5kd3hITEtncHhnY2VlSEhOZ0l3T2xhdm1uUnM5dnVENERQVENGK2huTUpibjBiV3RzdVJCbU9pQnVjegpyRDZvZ1JMUXk3clFrZ3UybnBhcUJBK0sKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogODUyMDk1NzQ3MzQwODQ1ODE5MTc3NjM3NTI2NDQwMzE3MjY4NzcKIyBNRDUgRmluZ2VycHJpbnQ6IDhlOmFkOmI1OjAxOmFhOjRkOjgxOmU0OjhjOjFkOmQxOmUxOjE0OjAwOjk1OjE5CiMgU0hBMSBGaW5nZXJwcmludDogMzY6Nzk6Y2E6MzU6NjY6ODc6NzI6MzA6NGQ6MzA6YTU6ZmI6ODc6M2I6MGY6YTc6N2I6Yjc6MGQ6NTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDIzOjk5OjU2OjExOjI3OmE1OjcxOjI1OmRlOjhjOmVmOmVhOjYxOjBkOmRmOjJmOmEwOjc4OmI1OmM4OjA2OjdmOjRlOjgyOjgyOjkwOmJmOmI4OjYwOmU4OjRiOjNjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdVRDQ0E2R2dBd0lCQWdJUVFCckVaQ0d6RXlFRERydmtFaHJGSFRBTkJna3Foa2lHOXcwQkFRc0ZBRENCCnZURUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUwKRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdPQ0JXWlhKcApVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVGd3TmdZRFZRUURFeTlXClpYSnBVMmxuYmlCVmJtbDJaWEp6WVd3Z1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWUKRncwd09EQTBNREl3TURBd01EQmFGdzB6TnpFeU1ERXlNelU1TlRsYU1JRzlNUXN3Q1FZRFZRUUdFd0pWVXpFWApNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUYVdkdUlGUnlkWE4wCklFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F5TURBNElGWmxjbWxUYVdkdUxDQkpibU11SUMwZ1JtOXkKSUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE9EQTJCZ05WQkFNVEwxWmxjbWxUYVdkdUlGVnVhWFpsY25OaApiQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBUThBTUlJQkNnS0NBUUVBeDJFM1hyRUJOTnRpMXhXYi8xaGFqQ01qMW1DT2tkZVFtSU42NWxnWk9JekYKOXVWa2hiU2ljZnZ0dmJuYXpVMEF0TWd0YzZYSGFYR1ZIems4c2tRSG5PZ08razFLeENIZktXR1BNaUpoZ3NXSApIMjZNZkY4V0lGRkUwWEJQVityakhPUE1lZTVZMkE3Q3MwV1R3Q3pubWhjcmV3QTNla0V6ZU9FejR2TVFHbitICkxMNzI5ZmRDNHVXL2gyS0pYd0JMMzhYZDVIVkVNa0U2SG5GdWFjc0xkVVlJMGNyU0s1WFF6L3U1UUd0a2pGZE4KL0JNUmVZVHRYbFQyTko4SUFmTVFKUVlYU3RyeEhYcG1hNWhnWnFUWjc5SXVndkh3N3ducVJNa1ZhdUlEYmpQVApySjlWQU1mMkNHcVV1Vi9jNERQeGhHRDVXeWNSdFB3VzhydFdhb0FsalFJREFRQUJvNEd5TUlHdk1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01HMEdDQ3NHQVFVRkJ3RU1CR0V3WDZGZG9Gc3cKV1RCWE1GVVdDV2x0WVdkbEwyZHBaakFoTUI4d0J3WUZLdzREQWhvRUZJL2wweHFHckkyT2E4UFBnR3JVU0JncwpleGt1TUNVV0kyaDBkSEE2THk5c2IyZHZMblpsY21semFXZHVMbU52YlM5MmMyeHZaMjh1WjJsbU1CMEdBMVVkCkRnUVdCQlMyZC9wcFNFZWZVeExWd3VvSE1uWUgwWmNIR1RBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVN2ajQKc0FQbUxHZDc1SlIzWTh4dVRQbDlEZzNjeUxrMXVYQlBZL29rK215RGpFZWRPMlB6bXZsMk1wV1JzWGU4ckpxKwpzZVF4SWNhQmxWWmFEckhDMUxHbVdhenhZOHU0VEIxWmtFcnZrQllvSDFxdUVQdUJVRGdNYk16eFBjUDFZK096CjR5SEpKRG5wL1JWbVJ2UWJFZEJOYzZOOVJ2azk3YWhmWXRUeFAvamdkRmNyR0oyQnRNUW8ycFNYcFhEcnJCMisKQnhIdzFkdmQ1WXp3MVRLd2crWlg0bysvdnFHcXZ6MGR0ZFE0NnRld1hEcFBhaitQd0dac1k2cnAyYVFXOUlIUgpsUlFPZmMyVk5OblNqM0J6Z1h1Y2ZyMllZZGhGaDVpUXhldUdNTVkxdi9EL3cxV0lnMHZ2QlpJR2NmSzRtSk8zCjdNMkNZZkU0NWsrWG1DcGFqUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA3IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA3IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCIKIyBTZXJpYWw6IDYzMTQzNDg0MzQ4MTUzNTA2NjY1MzExOTg1NTAxNDU4NjQwMDUxCiMgTUQ1IEZpbmdlcnByaW50OiAzYTo1MjplMTplNzpmZDo2ZjozYTplMzo2ZjpmMzo2Zjo5OToxYjpmOToyMjo0MQojIFNIQTEgRmluZ2VycHJpbnQ6IDIyOmQ1OmQ4OmRmOjhmOjAyOjMxOmQxOjhkOmY3OjlkOmI3OmNmOjhhOjJkOjY0OmM5OjNmOjZjOjNhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2OTpkZDpkNzplYTo5MDpiYjo1NzpjOTozZToxMzo1ZDpjODo1ZTphNjpmYzpkNTo0ODowYjo2MDozMjozOTpiZDpjNDo1NDpmYzo3NTo4YjoyYToyNjpjZjo3Zjo3OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGhEQ0NBd3FnQXdJQkFnSVFMNEQrSTR3T0lnOUlaeElva1llc3N6QUtCZ2dxaGtqT1BRUURBekNCeWpFTApNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXClpYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOeUJXWlhKcFUybG4KYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcApVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5CmFYUjVJQzBnUnpRd0hoY05NRGN4TVRBMU1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCeWpFTE1Ba0cKQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcApVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOeUJXWlhKcFUybG5iaXdnClNXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG4KYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpJQzBnUnpRd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVNuVm5wOFV0cGttdzR0WE5oZXJKSTkvZ0htCkdVbzlGQU5MK21BbklObURpV242Vk1hYUdGNVZLbVRlQnZhTlNqdXRFRHhsUFpDSUJJbmdNR0d6cmwwQnAzdmUKZkxLK3ltVmhBSWF1Mm85NzBJbXRUUjFabWtHeHZFZUEzSjVpdy9tamdiSXdnYTh3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKCmFXMWhaMlV2WjJsbU1DRXdIekFIQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWoKYUhSMGNEb3ZMMnh2WjI4dWRtVnlhWE5wWjI0dVkyOXRMM1p6Ykc5bmJ5NW5hV1l3SFFZRFZSME9CQllFRkxNVwprZjN1cG03a3RTNUpqNGQ0Z1lEczViRzFNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNR1loREJnbVlGbzRlMVpDCjRLZjhOb1JSa1NBc2RrMURQY1FkaENQUXJOWjhOUWJPeldtOWtBM2JiRWhDSFE2cVFnSXhBSnc5U0Rrak9WZ2EKRlJKWmFwN3YxVm15SFZJc21YSE54eW5mR3lwaGUzSFIzdlBBNVEwNlNxb3RwOWlHS3QwdUVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSBPPU5ldExvY2sgS2Z0LiBPVT1UYW5ceGZhc1x4ZWR0dlx4ZTFueWtpYWRceGYzayAoQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcykKIyBTdWJqZWN0OiBDTj1OZXRMb2NrIEFyYW55IChDbGFzcyBHb2xkKSBGXHUwMTUxdGFuXHhmYXNceGVkdHZceGUxbnkgTz1OZXRMb2NrIEtmdC4gT1U9VGFuXHhmYXNceGVkdHZceGUxbnlraWFkXHhmM2sgKENlcnRpZmljYXRpb24gU2VydmljZXMpCiMgTGFiZWw6ICJOZXRMb2NrIEFyYW55IChDbGFzcyBHb2xkKSBGXHUwMTUxdGFuXHhmYXNceGVkdHZceGUxbnkiCiMgU2VyaWFsOiA4MDU0NDI3NDg0MTYxNgojIE1ENSBGaW5nZXJwcmludDogYzU6YTE6Yjc6ZmY6NzM6ZGQ6ZDY6ZDc6MzQ6MzI6MTg6ZGY6ZmM6M2M6YWQ6ODgKIyBTSEExIEZpbmdlcnByaW50OiAwNjowODozZjo1OTozZjoxNTphMTowNDphMDo2OTphNDo2YjphOTowMzpkMDowNjpiNzo5NzowOTo5MQojIFNIQTI1NiBGaW5nZXJwcmludDogNmM6NjE6ZGE6YzM6YTI6ZGU6ZjA6MzE6NTA6NmI6ZTA6MzY6ZDI6YTY6ZmU6NDA6MTk6OTQ6ZmI6ZDE6M2Q6Zjk6Yzg6ZDQ6NjY6NTk6OTI6NzQ6YzQ6NDY6ZWM6OTgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lHU1VFczVBQVFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR25NUXN3Q1FZRFZRUUcKRXdKSVZURVJNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXhGVEFUQmdOVkJBb01ERTVsZEV4dlkyc2dTMlowTGpFMwpNRFVHQTFVRUN3d3VWR0Z1dzdwenc2MTBkc09oYm5scmFXRmt3N05ySUNoRFpYSjBhV1pwWTJGMGFXOXVJRk5sCmNuWnBZMlZ6S1RFMU1ETUdBMVVFQXd3c1RtVjBURzlqYXlCQmNtRnVlU0FvUTJ4aGMzTWdSMjlzWkNrZ1JzV1IKZEdGdXc3cHp3NjEwZHNPaGJua3dIaGNOTURneE1qRXhNVFV3T0RJeFdoY05Namd4TWpBMk1UVXdPREl4V2pDQgpwekVMTUFrR0ExVUVCaE1DU0ZVeEVUQVBCZ05WQkFjTUNFSjFaR0Z3WlhOME1SVXdFd1lEVlFRS0RBeE9aWFJNCmIyTnJJRXRtZEM0eE56QTFCZ05WQkFzTUxsUmhic082YzhPdGRIYkRvVzU1YTJsaFpNT3pheUFvUTJWeWRHbG0KYVdOaGRHbHZiaUJUWlhKMmFXTmxjeWt4TlRBekJnTlZCQU1NTEU1bGRFeHZZMnNnUVhKaGJua2dLRU5zWVhOegpJRWR2YkdRcElFYkZrWFJoYnNPNmM4T3RkSGJEb1c1NU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXhDUmVjNzVMYlJURG9mVGpsNUJ1MGpCRkhqenVaOWxrNEJxS2Y4b3d5b1BqSU1IajlEclQKbEY4YWZGdHR2ekJQaENmMm54OUp2TWFaQ3BEeUQvVi9RNFEzWTFHTGVxVncvSHBZelk2YjdjTkdiSVJ3WGRyegpBWkFqL0U0d3FYN2hKMlBuN1dROG9MakpNMlArRnBEL3NMajkxNmpBd0pSREM3YlZXYWFlVnRBa0gzQjVyOXM1ClZBMWxkZGtWUVpRQnIxN3M5bzN4LzYxay9pQ2ExMXpyL3FZZkNHU2ppM1pWclI0N0tHQXVoeVhvcXE4ZnhtUkcKSUxkd2Z6emVTTnVXVTdjNWQrUWE0c2NXaEhhWFd5KzdHUldGK0dtRjlabW5xZkkwcDZtMnBnUDhiNFk5Vkh4MgpCSnRyK1VCZEFEVEhMcGwxbmVXSUE2cE4rQVBTUW5iQUd3SURBS2lMbzBVd1F6QVNCZ05WSFJNQkFmOEVDREFHCkFRSC9BZ0VFTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVelBwbmsvQzJ1TkNsd0I3elUvMk0KVTkrRDE1WXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS3QvN2h3V3FadzhVUUNnd0JFSUJhZVo1bThCaUZSaApidkc1R0sxS3JmNkJRQ09VTC90MWZDOG9TMklrZ1lJTDlXSHhIRzY0WVRqcmdmcGlvVHRhWXRPVVpjVGg1bTJDCitDOGxjTEloSnNGeVVSK01MTU9Fa01OYWo3clA5S2RscGV1WTBmc0Zza1oxRlNOcWI0VmpNSUR3MVo0ZktSekMKYkxCUVdWMlFXenVvRFREUHYzMS96dkdkZzczSlJtNGdwdmxoVWJvaEwzdStwUlZqb2RTVmgvR2V1Zk9KOHoyRgp1TGpidnJXNUtmbmFOd1VBU1pRRGhFVG52ME14ejNXTEpkSDBwbVQxa3ZhckJlczk2YVVMTm1MYXpBWmZOb3UyClhqRzRLdnRlOW5IZlJDYWV4T1lOa2JRdWRaV0FVV3BMTUthd1lxR1Q4WnZZenNSamRUOVpSN0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMiBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIExhYmVsOiAiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMiIKIyBTZXJpYWw6IDEwMDAwMDEyCiMgTUQ1IEZpbmdlcnByaW50OiA3YzphNTowZjpmODo1Yjo5YTo3ZDo2ZDozMDphZTo1NDo1YTplMzo0MjphMjo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IDU5OmFmOjgyOjc5OjkxOjg2OmM3OmI0Ojc1OjA3OmNiOmNmOjAzOjU3OjQ2OmViOjA0OmRkOmI3OjE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Njo4Yzo4Mzo5NDo3ZDphNjozYjo3Mjo0YjplYzplMTo3NDozYzozMTphMDplNjphZTpkMDpkYjo4ZTpjNTpiMzoxYjplMzo3NzpiYjo3ODo0Zjo5MTpiNjo3MTo2ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnlqQ0NBN0tnQXdJQkFnSUVBSmlXakRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKTwpUREVlTUJ3R0ExVUVDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoCmRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0Z1VtOXZkQ0JEUVNBdElFY3lNQjRYRFRBNE1ETXlOakV4TVRneE4xb1gKRFRJd01ETXlOVEV4TURNeE1Gb3dXakVMTUFrR0ExVUVCaE1DVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbApjaUJPWldSbGNteGhibVJsYmpFck1Da0dBMVVFQXd3aVUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVJRkp2CmIzUWdRMEVnTFNCSE1qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1WWjUyOTEKcWo1TG5MVzRySjRMNVBuWnlxdGRqN1U1RUlMWHIxSGdPK0VBU0dyUDJ1RUdReEdacWhRbEVxMGk2QUJ0UThTcAp1T1VmaVV0bnZXRkk3LzNTNEdDSTVia1lZQ2pEZHl1dHNEZXFOOTVrV1NwR1YrUkx1ZmczZk5VMjU0REJ0dlBVClo1dVc2TTdYeGdwVDBHdEpsdk9qQ3dWM1NQY2w1WENzTUJRZ0plTi9kVnJsU1BoT2V3TUhCUHFDWVlkdThEdkUKcE1mUTlYUStwVjBhQ1BLYkpkTDJyQVFtUGxVNllpaWxlN0l3ci9nM3d0RzYxamo5OU85Sk1EZVpKaUZJaFFHcAo1UmJuM0pCVjN3L29PTTJaTnlGUFhmVWliMnJGRWhaZ0YxWHlaV2FtcHpDUk9NRTRIWVlFaExvYUpYaGVuYS9NClVHRFdFNGRTN1dNZmJXVjl3aFVZZE1yaGZtUXBqSExZRmhOOUMwbEs4U2diSUhScnhUM2RzS3BJQ1QwdWdwVE4KR21YWks0aWFtYndZZnAvdWZXWjhQcjJVdUlIT3paZ3dlTUZ2WjlDK1grQm83ZDdpc2Nrc1dYaVNxdDhyWUdQeQo1VjY1NDhyNmYxQ0dQcUkwR0F3SmFDZ1JIT1RodVZ3K1I3b3lQeGpNVzRUMTgydDB4SEowNGVPTG9FcTlqV1l2CjZxMDEyaURUaUlKaDhCSWl0cnpRMWFUc3IxU0lKU1E4cDIyeGNpay9QbGVtZjFXdmJpYkcvdWZNUUZ4UlJJRUsKZU41S3psVy9IZFhadDFidjhIYi9DM20xcjczN3FXbVJScGRvZ0JRMkhiTi91eW1ZTnFVZytvSmdZak9rN05hNgpCNmR1eGM4VXB1ZldralRZZ2ZYOEhWMnFYQjcybzAwN3VQYzVBZ01CQUFHamdaY3dnWlF3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pCU0JnTlZIU0FFU3pCSk1FY0dCRlVkSUFBd1B6QTlCZ2dyQmdFRkJRY0NBUll4YUhSMGNEb3YKTDNkM2R5NXdhMmx2ZG1WeWFHVnBaQzV1YkM5d2IyeHBZMmxsY3k5eWIyOTBMWEJ2YkdsamVTMUhNakFPQmdOVgpIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkpGb01vY1ZIWW5pdGZHc05pZzBqUXQ4WW9qck1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUNBUUNvUVVwbktwS0JnbEJ1NGRmWXN6azc4d0lWQ1ZCUjd5MjlKSHVJaGp2NXRMeVMKQ1phNTlzQ3JJMkFHZVl3UlRsSFNlWUF6KzUxSXZ1eEJRNEVmZmtkQUhPVjZDTXFxaTNXdEZNVEM2R1k4Z2dlbgo1aWVDV3hqbUQyN1pVRDZLUWhncHhyUlcvRllRb0FVWHZRd2pmL1NUN1p3YVViN2RSVUcva1NTMEg0enBYODk3CklabWZsWjg1T2tZY2JQbk5lNXlRelNpcHg2bFZ1NnhpTkdJMUUwc1VPbFdEdVlhTmtxYkc5QWNsVk13V1Z4SksKZ25qSUZOa1hnaVl0WFNBZmVhNysxSEFXRnBXRDJEVTUvMUpkZFJ3V3hSTlZ6MGZNZFdWU1N0N3dzS2ZrQ3BZTAorNjNDNGlXRXN0M2t2WDVaYkp2dzhOam55dkxwbHpoK2liN00remtYWVQ5eTJ6cVIyR1VCR1IydFVLUlhDbnhMCnZKeHhjeXBGVVJtRnpJNzlSNmQwbFIybzBhOU9GN0ZwSnNLcWVGZGJ4VTJuNVo0RkY1VEtzbCtnU1JpTk5Pa20KYkVnZXFtaVNCZUdDYzFxYjNBZGJDRzE5bmRlTklkbjhGQ0Nxd2tYZlArY0FzbEhrd3ZnRnVYa2FqRFR6bmx2awpOMXRyU3Q4c1Y0cEFXamE2M1hWRUNEZENjQXorM0Y0aG9LT0t3SkNjYU5wUTVrVVFSM2kyVHRKbHljTTMzK0ZDClk3QlhOMFV0ZTRxY3Z3WHFaVlV6OXprUXhTZ3FJWG9iaXNRaytUOFZ5Sm9WSVBWVllwYnRiWk5Rdk9TcWVLM1oKeXdwbGg2Wm13Y1NCbzNjNldCNEw3b09MblI3U1VxVE1IVyt3bUcyVU1iWDRjUXJjdWZ4OU1tRG02NitLQVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SG9uZ2tvbmcgUG9zdCBSb290IENBIDEgTz1Ib25na29uZyBQb3N0CiMgU3ViamVjdDogQ049SG9uZ2tvbmcgUG9zdCBSb290IENBIDEgTz1Ib25na29uZyBQb3N0CiMgTGFiZWw6ICJIb25na29uZyBQb3N0IFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDEwMDAKIyBNRDUgRmluZ2VycHJpbnQ6IGE4OjBkOjZmOjM5Ojc4OmI5OjQzOjZkOjc3OjQyOjZkOjk4OjVhOmNjOjIzOmNhCiMgU0hBMSBGaW5nZXJwcmludDogZDY6ZGE6YTg6MjA6OGQ6MDk6ZDI6MTU6NGQ6MjQ6YjU6MmY6Y2I6MzQ6NmU6YjI6NTg6YjI6OGE6NTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGY5OmU2OjdkOjMzOjZjOjUxOjAwOjJhOmMwOjU0OmM2OjMyOjAyOjJkOjY2OmRkOmEyOmU3OmUzOmZmOmYxOjBhOmQwOjYxOmVkOjMxOmQ4OmJiOmI0OjEwOmNmOmIyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlETURDQ0FoaWdBd0lCQWdJQ0ErZ3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNTRXN4CkZqQVVCZ05WQkFvVERVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHJiMjVuSUZCdmMzUWcKVW05dmRDQkRRU0F4TUI0WERUQXpNRFV4TlRBMU1UTXhORm9YRFRJek1EVXhOVEEwTlRJeU9Wb3dSekVMTUFrRwpBMVVFQmhNQ1NFc3hGakFVQmdOVkJBb1REVWh2Ym1kcmIyNW5JRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyCmIyNW5JRkJ2YzNRZ1VtOXZkQ0JEUVNBeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXJQODR0dWxtQWtuam9yVGhrUGxBajNuNTRyMTUvZ0s5N2lTU0hTTDIyb1Z5YWY3WFB3blUzWkcxQXB6UQpqVnJoVmNOUWhya3BKc0xqMmFEeGFRTW9JSUJGSWkxV3B6dFVsVllpV1I4bzN4OGdQVzJpTnI0am9MRnV0YkVuClB6bFRDZXFyYXVoMHNzSmxYSTYvZk1ONGhNMmVGdnoxTGs4Z0tnaWZkL1BGSHNTYVVtWWVTRjdqRUFhUElwamgKWlk0YlhTTm1PN2lsTWxISWhxcWhxWjUvZHBUQ3BteTNRZkRWeUFZNDV0UU00dk03VEcxUWpNU0RKOEVUaEZrOQpublYwdHRnQ1hqcVFlc0JDTm5Mc2FrM2M3OFFBM3hNWVYxOG1lTWpXQ25sM3YvZXZ0M2E1cFF1RUYxMFE2bS9oCnE1VVJYMjA4bzF4TmcxdnlzeG1LZ0lzTGh3SURBUUFCb3lZd0pEQVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUQKTUE0R0ExVWREd0VCL3dRRUF3SUJ4akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRGtiVlBLN2loOWxlZ1lzQwptRUVJakV5ODJ0dnVKeHVDNTJwRjdCYUxUNFdnODdKd3ZWcVd1c3B1YmU1R2kyN25LaTZXc3hrejY3U2ZxTEkzCjdwaW9sN1l1dG1jbjFLWkovUnlUWlhhZVFpL2NJbXlhVC9KYUZUbXhjZGNyVWVodEhKakEyU3Iwb1lKNzFjbEIKb2lNQmREaFZpdys1TG1laUlBUTMycHdMMHhjaDRJK1hlVFJ2aEVnQ0lETWI1alJFbjVGdzlJQmVoRVBDS2RKcwpFaFRrWVkyc0VKQ2VoRkM3OEpadlJaK0s4OHBzVC9vUk9oVVZSc1BOSDROYkxVRVM3VkJuUVJNOUlhdVVpcXBPCmZNR3grNmZXdFNjdmw2dHU0QjNpMFJ3c0gwVGkvTDZSb1p6NzFpbFRjNGFmVTloRERsM1dZNEp4SFlCMHl2YmkKQW12WldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNlY3VyZVNpZ24gUm9vdENBMTEgTz1KYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuCiMgU3ViamVjdDogQ049U2VjdXJlU2lnbiBSb290Q0ExMSBPPUphcGFuIENlcnRpZmljYXRpb24gU2VydmljZXMsIEluYy4KIyBMYWJlbDogIlNlY3VyZVNpZ24gUm9vdENBMTEiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBiNzo1Mjo3NDplMjo5MjpiNDo4MDo5MzpmMjo3NTplNDpjYzpkNzpmMjplYToyNgojIFNIQTEgRmluZ2VycHJpbnQ6IDNiOmM0OjlmOjQ4OmY4OmYzOjczOmEwOjljOjFlOmJkOmY4OjViOmIxOmMzOjY1OmM3OmQ4OjExOmIzCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjowZjplZTpmYjo5ZTozYTo1ODoxYTpkNTpmOTplOTpkYjo3NTo4OTo5ODo1Nzo0MzpkMjo2MTowODo1Yzo0ZDozMTo0Zjo2Zjo1ZDo3Mjo1OTphYTo0MjoxNjoxMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGJUQ0NBbFdnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQllNUXN3Q1FZRFZRUUdFd0pLVURFcgpNQ2tHQTFVRUNoTWlTbUZ3WVc0Z1EyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeXdnU1c1akxqRWNNQm9HCkExVUVBeE1UVTJWamRYSmxVMmxuYmlCU2IyOTBRMEV4TVRBZUZ3MHdPVEEwTURnd05EVTJORGRhRncweU9UQTAKTURnd05EVTJORGRhTUZneEN6QUpCZ05WQkFZVEFrcFFNU3N3S1FZRFZRUUtFeUpLWVhCaGJpQkRaWEowYVdacApZMkYwYVc5dUlGTmxjblpwWTJWekxDQkpibU11TVJ3d0dnWURWUVFERXhOVFpXTjFjbVZUYVdkdUlGSnZiM1JEClFURXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQS9YZXFwUnlRQlR2TFRKc3oKaTFvVVJhVG5rQmJSMzFmU0lSQ2tGLzNmck5ZZnArVGJmUGZzMzdnRDJwUlkvVjF5Zkl3L1h3Rm5kQldXNHdJOApoOXV1eXdHT3d2Tm14b1ZGOUFMR09yVmlzcS82bkwrazV0U0FNSmp6RGJhVGo2blUyRGJ5c1B5S3lpeWhGVE9WCk1kckFHL0x1WXBtR1l6Ky8zWk1xZzZoMnVSTWZ0ODVPUW9XUEl1Y3VHdktWQ2JJRnRVUk9kNkVndmFueVRncDkKVUszMUJRMUZUMFp4L1NnK1Uvc0UyQzNYWlIxS0cvclBPN0F4bWpWdXlJc0cwd0NSOHBRSVpVeXhOQVlBZW9uaQo4TWNEV2MvVjF1aW5NclBtbUVDR3hjMG5Fb3ZNZTg2M0VUeGlZQWNqUGl0QWJwU0FDVzIyczI5M2J6VUlVUHNDCmg4VStpUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVy9oTlQ3S2xodFE2MHZGam1xQytDZlpYdDk0d0RnWUQKVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQgpBS0NoT0JabUxxZFdIeUdjQnZvZDdia2l4VGdtMkU1UDdLTi9lZDVHSWFHSGQ0OEhDSnF5cE1XdkR6S1lDM3htCktiYWJmU1ZTU1VPclRDNHJibnB3cnhZTzR3SnMrMExtR0oxRjJGWEk2RHZkNStIMExnc2NORnhzV0VyN2pJaFEKWDVVY3YrMnJJclZsczRXNm5nKzRyZVY2RzRwUU9oMjlEYng3VkZBTHVVS3ZWYUFZZ2ExbG1lKys1SnkveElXcgpRYkpVYjl3bHplMTQ0bzRNalFsSjNXTjdXbW1XQWlHb3ZWSlo2WDAxeThoU3luK0IvdGxyMC9jUjdTWGYrT2Y1CnBQcHlsNFJURGFYUU1oaFJkbGtVYkEvcjdGK0FqSFZEZzhPRm1QOU1uaTBONUhlRGswNjFsZ2VMS0JPYmpCbU4KUVNkSlFPN2U1aU5FT2R5aEl0YTZBL0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1NaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkgTz1NaWNyb3NlYyBMdGQuCiMgU3ViamVjdDogQ049TWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5IE89TWljcm9zZWMgTHRkLgojIExhYmVsOiAiTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5IgojIFNlcmlhbDogMTQwMTQ3MTI3NzYxOTU3ODQ0NzMKIyBNRDUgRmluZ2VycHJpbnQ6IGY4OjQ5OmY0OjAzOmJjOjQ0OjJkOjgzOmJlOjQ4OjY5OjdkOjI5OjY0OmZjOmIxCiMgU0hBMSBGaW5nZXJwcmludDogODk6ZGY6NzQ6ZmU6NWM6ZjQ6MGY6NGE6ODA6Zjk6ZTM6Mzc6N2Q6NTQ6ZGE6OTE6ZTE6MDE6MzE6OGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNjOjVmOjgxOmZlOmE1OmZhOmI4OjJjOjY0OmJmOmEyOmVhOmVjOmFmOmNkOmU4OmUwOjc3OmZjOjg2OjIwOmE3OmNhOmU1OjM3OjE2OjNkOmYzOjZlOmRiOmYzOjc4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQ2pDQ0F2S2dBd0lCQWdJSkFNSitRd1JPUno4Wk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHQ01Rc3dDUVlEClZRUUdFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDAKWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXRVM3BwWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwRwpDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW9kVEFlRncwd09UQTJNVFl4TVRNd01UaGFGdzB5Ck9URXlNekF4TVRNd01UaGFNSUdDTVFzd0NRWURWUVFHRXdKSVZURVJNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXgKRmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MFpDNHhKekFsQmdOVkJBTU1IazFwWTNKdmMyVmpJR1V0VTNwcApaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvCmRUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9uNGovTmpyZHFHMktmZ1F2dlAKa2Q2bUp2aVpwV053clp1dXlqTkFmVzJXYnFFT1JPN2hFNTJVUWxLYXZYV0ZkQ3lvRGgyVHRoaTNqQ3lvei90YwpjYm5hN1A3b2ZvL2tMeDJ5cUhXSDJMZWg1VHZQbVVwRzBJTVpmY0NoRWh5VmJVcjAyTWVsVFRNdWhUbEFkWDRVCmZJQVNtRkRIUVdlNG9JQmhWS1pzVGgvZ25RNEg2Y202TStmK3dGVW9MQUtBcHhuMW50eFZVd09YZXdkSS81bjcKTjRva3hGbk1VQkJqanFxcEdyQ0VHb2I1WDd1eFVHNmswUXJNMVhGK0g2Y2JmUFZUYmlKZnl5dm0xSHhkcnRiQwp4a3psQlFIWjdWZjh3U041L1BySUpJT1Y4N1ZxVVFIUWQ5YnBFcUg1R29QN2dodTVzSmYwZGdZelEwbWcvd3UxCityVUNBd0VBQWFPQmdEQitNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEcKQTFVZERnUVdCQlRMRDhiZlFrUE1QY3UxU0NPaEducW1LcnMwYURBZkJnTlZIU01FR0RBV2dCVExEOGJmUWtQTQpQY3UxU0NPaEducW1LcnMwYURBYkJnTlZIUkVFRkRBU2dSQnBibVp2UUdVdGMzcHBaMjV2TG1oMU1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUJBUURKMFE1ZUx0WE1zM3creS93OS93MG9sWk1FeUwvYXpYbTRRNUR3cEw3djh1OGgKbUx6VTFGMEc5dTVDN0RCc29LcXB5dkd2aXZvL0MzTnFQdW91UUg0ZnJsUmhlZXN1Q0RmWEkvT01uNzRkc2VHawpkZHVnNGxRVXNib2NLYVFZOWhLNm9oUVU0ekUxeUVEL3QrQUZkbGZCSEZueStML2s3U1ZpWElUd2ZuNGZzNzc1CnR5RVJ6QU1CVm5DbkVKSWVHelNCSHEyY0dzTUVQTzBDWWRZZUJ2TmZPb2Z5Sy9GRmgrVTlyTkhIVjRTOWE2N2MKMlBtMkcySndDejAyeVVMeU10ZDZZZWJTMnozUHlLbkptOXpiV0VUWGJ6aXZmM2pUbzYwYWRib2N3VFo4ang1dApITU4xUnE0MUJhYjJYRDBoN2xid3lZSWlMWHBVcTNERGZTSmxnbkNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMwojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMyIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk3NTk0MjYyMDk5NTQKIyBNRDUgRmluZ2VycHJpbnQ6IGM1OmRmOmI4OjQ5OmNhOjA1OjEzOjU1OmVlOjJkOmJhOjFhOmMzOjNlOmIwOjI4CiMgU0hBMSBGaW5nZXJwcmludDogZDY6OWI6NTY6MTE6NDg6ZjA6MWM6Nzc6YzU6NDU6Nzg6YzE6MDk6MjY6ZGY6NWI6ODU6Njk6NzY6YWQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNiOmI1OjIyOmQ3OmI3OmYxOjI3OmFkOjZhOjAxOjEzOjg2OjViOmRmOjFjOmQ0OjEwOjJlOjdkOjA3OjU5OmFmOjYzOjVhOjdjOmY0OjcyOjBkOmM5OjYzOmM1OjNiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEWHpDQ0FrZWdBd0lCQWdJTEJBQUFBQUFCSVZoVENLSXdEUVlKS29aSWh2Y05BUUVMQlFBd1RERWdNQjRHCkExVUVDeE1YUjJ4dlltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqTXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnAKWjI0eEV6QVJCZ05WQkFNVENrZHNiMkpoYkZOcFoyNHdIaGNOTURrd016RTRNVEF3TURBd1doY05Namt3TXpFNApNVEF3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEVnTFNCU016RVRNQkVHCkExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbmJqQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNd2xkcEI1Qm5naUZ2WEFnN2FFeWlpZS9RVjJFY1d0aUhMOApSZ0pEeDdLS25RUmZKTXN1UytGZ2drYmhVcXNNZ1Vkd2JOMWswZXYxTEtNUGdqME1LNjZYMTdZVWhoQjV1enNUCmdIZU1DT0ZKMG1waUx4OWUrcFpvMzRrbmxUaWZCdGMreWNzbVdRMXozckRJNlNZT2d4WEc3MXVMMGdSZ3lrbW0KS1BacE8vYkx5Q2lSNVoyS1lWYzNySFFVM0hUZ091NXlMeTZjKzlDN3YvVTlBT0VHTStpQ0s2NVRwam9XYzR6ZApRUTRnT3NDMHA2SHBzaytRTGpKZzZWZkx1UVNTYUdqbE9DWmdkYktmZC8rUkZPK3VJRW44clVBVlNORUNNV0VaClhyaVg3NjEzdDJTYWVyOWZ3UlB2bTJMN0RXemdWR2tXcVFQYWJ1bURrM0YyeG1tRmdoY0NBd0VBQWFOQ01FQXcKRGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGSS93UzMrbwpMa1VrcmsxUSttT2FpOTdpM1J1OE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxRTnZBVUtyK3lBenY5NVpVClJVbTdsZ0FKUWF5ekU0YUdLQWN6eW12bWRMbTZBQzJ1cEFyVDlmSHhENHEvYzJkS2c4ZEVlM2pncjI1c2J3TXAKampNNVJjT081TGxYYktyOEVwYnNVOFl0NUNSc3VaUmorOXhUYUdkV1BvTzR6elVodzhsby9zN2F3bE9xekpDSwo2ZkJkUm95VjNYcFlLQm92SGQ3TkFEZEJqKzFFYmRkVEtKZCs4MmNFSGhYWGlwYTAwOTVNSjZSTUczTnpkdlFYCm1jSWZlZzdqTFFpdENod3MvenlyVlE0UGtYNDI2OE5YU2I3aExpMThZSXZEUVZFVEk1M085ekpybEFHb21lY3MKTXg4Nk95WFNoa0RPT3l5R2VNbGhMeFM2N3R0VmI5K0U3Z1VKVGIwbzJITE8wMkpRWlI3cmtwZURNZG16dGNwSApXRDlmCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKIyBTdWJqZWN0OiBDTj1BdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKIyBMYWJlbDogIkF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OCIKIyBTZXJpYWw6IDYwNDcyNzQyOTcyNjI3NTM4ODcKIyBNRDUgRmluZ2VycHJpbnQ6IDczOjNhOjc0OjdhOmVjOmJiOmEzOjk2OmE2OmMyOmU0OmUyOmM4OjliOmMwOmMzCiMgU0hBMSBGaW5nZXJwcmludDogYWU6YzU6ZmI6M2Y6Yzg6ZTE6YmY6YzQ6ZTU6NGY6MDM6MDc6NWE6OWE6ZTg6MDA6Yjc6Zjc6YjY6ZmEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA0OjA0OjgwOjI4OmJmOjFmOjI4OjY0OmQ0OjhmOjlhOmQ0OmQ4OjMyOjk0OjM2OjZhOjgyOjg4OjU2OjU1OjNmOjNiOjE0OjMwOjNmOjkwOjE0OjdmOjVkOjQwOmVmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHRkRDQ0EveWdBd0lCQWdJSVUrdzc3dnV5U0Y4d0RRWUpLb1pJaHZjTkFRRUZCUUF3VVRFTE1Ba0dBMVVFCkJoTUNSVk14UWpCQUJnTlZCQU1NT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWgKY0hKdlptVnphVzl1WVd3Z1EwbEdJRUUyTWpZek5EQTJPREFlRncwd09UQTFNakF3T0RNNE1UVmFGdzB6TURFeQpNekV3T0RNNE1UVmFNRkV4Q3pBSkJnTlZCQVlUQWtWVE1VSXdRQVlEVlFRREREbEJkWFJ2Y21sa1lXUWdaR1VnClEyVnlkR2xtYVdOaFkybHZiaUJHYVhKdFlYQnliMlpsYzJsdmJtRnNJRU5KUmlCQk5qSTJNelF3Tmpnd2dnSWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFES2xtdU82dmo3OGFJMTRIOU0ydUREVXRkOQp0aERJQWw2elF5ckVUMnF5eWh4ZEtKcDRFUnBwV1ZldnRTQkM1SXNQNXQ5YnBnT1NML1VSNUdMWE1uRTQyUVFNCmNhczlVWDRQQjk5akJWenB2NVJ2d1NtQ3dMVGFVYkRCUEx1dE4wcGN5dkZMTmc0a3E3L0RoSGY5cUZEMHNlZkcKTDlJdFdZMTZDazZXYVZJQ3FqYVk3UHo2RklNTU54L0pramQvMTRFdDVjUzU0RDQwL21mMFBtYlIwL1JBejE1aQpOQTl3Qmo0Z0dGck85M0liSld5VGRCU1RvM094RHFxSEVDTlpYeUFGR1VmdGFJNlNFc3BkL05ZcnNwSThJTS9oClg2OGd2cUIyZjNibDdCcUdZVE0rNTN1MFA2QVBqcUs1YW0rNWh5WnZRV3lJcGxEOWFtTUw5Wk1XR3htUHN1MmIKbThtUTlRRU0zeGs5RHo0NEk4a3Zqd3pSQXY0YlZkWk8wSTA4cjArazgvNnZLdE1GblhrSW9jdFhNYlNjeUpDeQpaL1FZRnBNNi9FZlkwWGlXTVIrNkt3eGZYWm10WTRsYUpDQjIyTi85cTA2bUlxcWRYdVluaW4xb0thUG5pcmphCkVic1hMWm1kRXlSRzk4WGkySitPZjhlUGRHMWFzdWh5OWF6dUpCQ3RMeFRhL3kyYVJuRkh2a0xmdXdIYjlIL1QKS0k4eFdWdlR5UUttdEZMS2JwZjdROFVJSm0rSzlMdjlueWlxRGRWRjh4TTZIZGpBZUk5Qlp6d2VsR1N1ZXd2Rgo2TmtCaURrYWw0WmtRZFU3aHd4dStnL0d2VWdVdnpsTjFKNUJ0bytXSFdPV2s5bVZCbmd4YUo0M0JqdUFpVVZoCk9TUEhHMFNqRmVVYytKSXd1d0lEQVFBQm80SHZNSUhzTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0RnWUQKVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUmx6ZXVyTlI0QVBuN1ZkTUFjdEhOSERocGtMekNCcGdZRApWUjBnQklHZU1JR2JNSUdZQmdSVkhTQUFNSUdQTUM4R0NDc0dBUVVGQndJQkZpTm9kSFJ3T2k4dmQzZDNMbVpwCmNtMWhjSEp2Wm1WemFXOXVZV3d1WTI5dEwyTndjekJjQmdnckJnRUZCUWNDQWpCUUhrNEFVQUJoQUhNQVpRQnYKQUNBQVpBQmxBQ0FBYkFCaEFDQUFRZ0J2QUc0QVlRQnVBRzhBZGdCaEFDQUFOQUEzQUNBQVFnQmhBSElBWXdCbApBR3dBYndCdUFHRUFJQUF3QURnQU1BQXhBRGN3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUJkOW9QbTAzY1hGCjY2MUxKTFdoQXF2ZHBZaEtzZzlWU3l0WGpEdmxNZDMreERMeDUxdGtsall5R095bE1uZlg0MFMyd0JFcWdMazkKYW01OG05T3QvTVBXbytaa0tYelI0VGdlZ2l2L0oyV3YreFlWeEM1eGhPVzEvL3FrUjcxa01ydjJKWVNpSjBMMQpJTERDRXhBUnpSQVZ1a0tRS3RKRTRaWW02ekZJRXYwcTJza0d6M1FlcVV2Vmh5ajVlVFNTUGk1RTZQYVBUNDgxClB5V3pPZHhqS3BCcklGL0VVaEpPbHl3cXJKMlgza2p5bzJiYnd0S0RsYVptcDU0bEQra0xNNUZsQ2xyRDJWUVMKM2EvRFRnNGZKbDROM0xPTjdOV0JjTjdTVHlRRjgyeE85VXhKWm8zUi85SUxKVUZJL2xHRXhrS3ZnQVRQMEg1awpTZVR5MzZMc3NVekFLaDNudExGbG9zUzg4WmowcW5BSFk3UzQyanRNK2tBaU1Gc1JwdkFGRHNZQ0EwaXJocHVGCjNkdmQ2cUoyZ0hOOTlad0V4RVdONTdrY2k1N3ExM1hSY3JIZWRVVG5RbjNpVjJ0OTNKbThQWU1vNm9DVGpjVk0KWmNGd2diZzQvRU14c3ZZRE5FZXlyUHNpQnNzZTNSZEhIRjltdWRNYW90b1JzYVM4SThua3ZvZi91WlMyK0YwZwpTdFJmNTcxb2UyWHlGUjdTT3FrdDZkaHJKS3lYV0VSSHJWa1k4U0ZsY043T05HQ29RUEh6UEtUREtDT00vaWN6ClEwQ2dGenpyNmp1d2NxYWp1VXBMWGhaSTlMSzh5SXlTeFoyZnJISTJ2RFNBTkd1cGk1TEF1QmZ0N0haVDlTUUIKakxNaTZFdDhWY2FkK3FNVXUyV0ZibTVQRW40S1BKMlYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUl6ZW5wZS5jb20gTz1JWkVOUEUgUy5BLgojIFN1YmplY3Q6IENOPUl6ZW5wZS5jb20gTz1JWkVOUEUgUy5BLgojIExhYmVsOiAiSXplbnBlLmNvbSIKIyBTZXJpYWw6IDkxNzU2MzA2NTQ5MDM4OTI0MTU5NTUzNjY4Njk5MTQwMjYyMQojIE1ENSBGaW5nZXJwcmludDogYTY6YjA6Y2Q6ODU6ODA6ZGE6NWM6NTA6MzQ6YTM6Mzk6OTA6MmY6NTU6Njc6NzMKIyBTSEExIEZpbmdlcnByaW50OiAyZjo3ODozZDoyNTo1MjoxODphNzo0YTo2NTozOTo3MTpiNToyYzphMjo5Yzo0NToxNTo2ZjplOToxOQojIFNIQTI1NiBGaW5nZXJwcmludDogMjU6MzA6Y2M6OGU6OTg6MzI6MTU6MDI6YmE6ZDk6NmY6OWI6MWY6YmE6MWI6MDk6OWU6MmQ6Mjk6OWU6MGY6NDU6NDg6YmI6OTE6NGY6MzY6M2I6YzA6ZDQ6NTM6MWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY4VENDQTltZ0F3SUJBZ0lRQUxDM1doWklYNy9oeS9XTDF4bm1mVEFOQmdrcWhraUc5dzBCQVFzRkFEQTQKTVFzd0NRWURWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXVRUzR4RXpBUkJnTlZCQU1NQ2tsNgpaVzV3WlM1amIyMHdIaGNOTURjeE1qRXpNVE13T0RJNFdoY05NemN4TWpFek1EZ3lOekkxV2pBNE1Rc3dDUVlEClZRUUdFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2Wlc1d1pTNWoKYjIwd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURKMDNyS0R4NnNwNGJvRm1WcQpzY0liUlRKeGxkbitFRnZNcitlbGVRR1BpY1BLOGxWeDkzZStkNVR6Y3FRc1JOaWVrcHNVT3FIbkpKQUtDbGFPCnhkZ21sT0haU09FdFB0b0tjdDJqbVJYYWdhS0g5SHR1Sm5lSldLM1c2d3l5UVhwemJtM2JlbmhCNlFpSUVuNkgKTG1ZUlkyeFUrenlkY3NDOEx2L0N0OTBOZHVNNjEvZTBhTDZpOWVPQmJzRkdiMTJONEUzR1ZGV0pHak14Q3JGWAp1YU9LbU1Qc096VEZsVUZwZm5YQ1BDREZZYnBSUjZBZ2tKT2hrRXZ6VG55RlJWU2EwUVVtUWJDMVRSMHp2c1FECnlDVjh3WERiTy9RSkxWUW5TS3d2NGNTc1Bzakxra3hUT1RjajdOTUIrZUFKUkUxTlpNRGhEVnFISXJ5dEc2UCsKSnJVVjg2ZjhoQm5wN0tHSXRFUnBoSVB6aWRGMEJxbk1DOWJDM2llRlVDYktGN2pKZW9kV0xCb0JIbXkrRTYwUQpyTFVrOVRpUm9kWkwydkc3MHQ1SHRmRzhnZlpaYTg4WlUrbU5GY3RLeTZsdlJPVWJRYy9oaHFmSzBHcWZ2RXlOCkJqTmFvb1hsa0RXZ1lsd1dUdkRqb3ZvREdyUXNjYk5ZTE41N0M5c2FEK3ZlSVI4R2R3WURzTW52bWZ6QXVVOEwKaGlqKzBybnE0OXFsdzBkcEV1RGI4UFlaaSsxN2NOY0MxdTJIR0Nnc0JDUk1kK1JJaWhyR081clVEOHI2ZGRJQgpRRnFOZWIrTHowdlBxaGJCbGVTdFRJbytGNUhVc1dMbGd1V0FCS1FEZm8yLzJuK2lENWRQRE5NTis5ZlI1WEorCkhNaDMvMXVhRDdldUJVYmw4YWdXN0Vla0Z3SURBUUFCbzRIMk1JSHpNSUd3QmdOVkhSRUVnYWd3Z2FXQkQybHUKWm05QWFYcGxibkJsTG1OdmJhU0JrVENCampGSE1FVUdBMVVFQ2d3K1NWcEZUbEJGSUZNdVFTNGdMU0JEU1VZZwpRVEF4TXpNM01qWXdMVkpOWlhKakxsWnBkRzl5YVdFdFIyRnpkR1ZwZWlCVU1UQTFOU0JHTmpJZ1V6Z3hRekJCCkJnTlZCQWtNT2tGMlpHRWdaR1ZzSUUxbFpHbDBaWEp5WVc1bGJ5QkZkRzl5WW1sa1pXRWdNVFFnTFNBd01UQXgKTUNCV2FYUnZjbWxoTFVkaGMzUmxhWG93RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3SFFZRFZSME9CQllFRkIwY1pRNm84aVY3dEpIUDVMR3g1cjFWZEd3Rk1BMEdDU3FHU0liM0RRRUJDd1VBCkE0SUNBUUI0cGd3V1NwOU1pRHJBeXc2bEZuMmZ1VWhmR0k4TllqYjJ6Umxyckt2VjlwRjlybkh6UDdNT2VJV2IKbGFRbklVZENTbnhJT3ZWRmZMTU1qbEY0ckpVVDNzYjlmYmdha0V5cmtnUEg3VUlCemcvWXNmcWlrdUZnYmE1Ngphd21xeGludWFFbG5NSUFrZWpFV09WdCs4Und1M1d3SnJmSXh3WUpPdWJ2NXZyOHFoVC9BUUtNNldmeFpTendvCkpOdTBGWFd1RFlpNkxuUEF2VmlINVVMeTYxN3VIakFpbWNzMzBjUWhiSUhzdm0wbTVoemtRaUNlUjdDc2cxbHcKTERYV3J6WTB0TTA3K0RLbzcrTjRpZnVOUlN6YW5MaCtRQnhoNXo2aWtpeEw4czM2bUxZcC8vUHllNmtmTHFDVApWeXZlaFFQNWFUZkxubmhxQmJURk1YaUo3SHFuaGVHNWV6emV2aDU1aE02ZmNBNVp3alV1a0NveDJlUkZla0drCkxoT2JOQTVtZTBtclpKZlFSc041blhKUVk2YVlXd2E5U0czWU9ZTnc2RFh3QmRHcXZPUGJ5QUxxZlAyQzJzSmIKVWpXdW1EcXR1aldUSTZjZlNOMDFScGl5RUdqa3BUSENDbGd1R1lFUXlWQjEvT3BhRnM0UjErN3ZVSWd0WWY4LwpRbk1GbEVQVmpqeE9BVG9acFI5R1RuZlFYZVdCSWlHSC9wUjloTmlUcmRab1EwaXkyK3R6Sk9lUmYxU2t0b0ErCm5hTThUSExDVjhTZzFNdzRKODdWQnA2aVNObnBuODZDY0RhVG1qdmZsaUhqV2JjTTJwRTM4UDFaV3JPWnlHbHMKUXlZQk5XTmdWWWtET25YWXVrclpWUC91M29EWUxkRTQxVjR0QzVoOVBtemIvQ2FJeHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBTdWJqZWN0OiBDTj1DaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIExhYmVsOiAiQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgiCiMgU2VyaWFsOiAxMTgwNjgyMjQ4NDgwMTU5NzE0NgojIE1ENSBGaW5nZXJwcmludDogNWU6ODA6OWU6ODQ6NWE6MGU6NjU6MGI6MTc6MDI6ZjM6NTU6MTg6MmE6M2U6ZDcKIyBTSEExIEZpbmdlcnByaW50OiA3ODo2YTo3NDphYzo3NjphYjoxNDo3Zjo5Yzo2YTozMDo1MDpiYTo5ZTphODo3ZTpmZTo5YTpjZTozYwojIFNIQTI1NiBGaW5nZXJwcmludDogMDY6M2U6NGE6ZmE6YzQ6OTE6ZGY6ZDM6MzI6ZjM6MDg6OWI6ODU6NDI6ZTk6NDY6MTc6ZDg6OTM6ZDc6ZmU6OTQ6NGU6MTA6YTc6OTM6N2U6ZTI6OWQ6OTY6OTM6YzAKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhUekNDQlRlZ0F3SUJBZ0lKQUtQYVFuNmtzYTdhTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd1TVFzd0NRWUQKVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMApJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczCk1Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhLVEFuQmdOVkJBTVRJRU5vWVcxaVpYSnoKSUc5bUlFTnZiVzFsY21ObElGSnZiM1FnTFNBeU1EQTRNQjRYRFRBNE1EZ3dNVEV5TWprMU1Gb1hEVE00TURjegpNVEV5TWprMU1Gb3dnYTR4Q3pBSkJnTlZCQVlUQWtWVk1VTXdRUVlEVlFRSEV6cE5ZV1J5YVdRZ0tITmxaU0JqCmRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oYldWeVptbHliV0V1WTI5dEwyRmtaSEpsYzNNcE1SSXcKRUFZRFZRUUZFd2xCT0RJM05ETXlPRGN4R3pBWkJnTlZCQW9URWtGRElFTmhiV1Z5Wm1seWJXRWdVeTVCTGpFcApNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXRJREl3TURnd2dnSWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDdkFNdHdOeXVBV2tvNmJIaVVmYU4vR2gvMk5kVzkKMjhzTlJISStKcktRVXJwak95aFliNld6YlpTbTg5MWtERlgyOXVmeUlpS0FYdUZpeHJZcDRZRnM4ci9sZlRKcQpWS0F5R1ZuK0g0dlhQV0NHaFNSdjR4R3pkejRnbGpVaGE3TUkyWEF1WlBlRWtsUFdEckNRaW9yamg0MEcwNzJRCkR1S1pvUnVHRHRxYUNyc0xZVkFHVXZHZWYzYnN5dy9RSGczUG1UQTlITVJGRUZpczF0UG8xK1hxeFFFSGQ5WlIKNWdOL2lraWxUV2gxdWVtOG5rNFpjZlV5UzV4dFlCa0wrOHlkZGR5L0pzMlBrM2c1ZVhOZUpRN0tYT3QzRWdmTApaRUZIY3BPclVNUHJDWFprTk5JNXQzWVJDUTEyUmNTcHJqMXFyN1Y5WlMrVVdCRHNYSHl2ZnVLMkdOblFtMDVhClNkK3BaZ3ZNUE1aNGZLZWNIZVBPamxPK0JkNWdEMnZsR3RzLzQrRWh5U25COGVzSG5GSWJBVVJSUEhzbDE4VGwKVWxSZEpRZktGaUM0cmVSQjdub0kvcGx2ZzZhUkFyQnNObFZxNTMzMWx1YktnZGFYOFpTRDZlMndzV3NTYVI2cworMTJweFpqcHRGdFllcjQ5b2tRNlkxblVDeVhlRzArOTVRR2V6ZElwMVo4WEdRcHZ2d3lRMHdsZjJlT0tOY3g1CldrMFpONUszeE1HdHIvUjVKSnF5QVF1eHIxeVc4NEF5KzF3OW1QR2dQMHJldnErVUx0bFZtaGR1WUoxamJMaGoKeWE2QlhCZzE0SkM3dmp4UE55SzVmdXZQbm5jaHBqMDRnZnRJMmpFOUsrT0o5ZEMxdlg3Z1VNUVNpYk1qbWhBeApoZHV1Yis4NE14aDJFUUlEQVFBQm80SUJiRENDQVdnd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkREQWRCZ05WCkhRNEVGZ1FVK1NTc0Q3SzErSG5BK21DSUc4VFpUUUtlRnhrd2dlTUdBMVVkSXdTQjJ6Q0IySUFVK1NTc0Q3SzEKK0huQSttQ0lHOFRaVFFLZUZ4bWhnYlNrZ2JFd2dhNHhDekFKQmdOVkJBWVRBa1ZWTVVNd1FRWURWUVFIRXpwTgpZV1J5YVdRZ0tITmxaU0JqZFhKeVpXNTBJR0ZrWkhKbGMzTWdZWFFnZDNkM0xtTmhiV1Z5Wm1seWJXRXVZMjl0CkwyRmtaSEpsYzNNcE1SSXdFQVlEVlFRRkV3bEJPREkzTkRNeU9EY3hHekFaQmdOVkJBb1RFa0ZESUVOaGJXVnkKWm1seWJXRWdVeTVCTGpFcE1DY0dBMVVFQXhNZ1EyaGhiV0psY25NZ2IyWWdRMjl0YldWeVkyVWdVbTl2ZENBdApJREl3TURpQ0NRQ2oya0orcExHdTJqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWCkhTQUFNQ293S0FZSUt3WUJCUVVIQWdFV0hHaDBkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHcKRFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUpBU3J5STF3cU01OEM3ZTZiWHBlSHhJdmo5OVJaSmU2ZHF4R2Z3VwpQSiswVzJhZWF1ZkR1VjJJNkErdHp5TVAzaVU2WHN4UHBjRzFMYXdrMGxnSDNxTFBhWVJnTStnUURST3BJOUNGCjVZNTdwcDQ5Y2hOeU0vV3FmY1pqSHdqMC9nRi9KTThyTEZRSjN1SXJiWkxHT1U4VzZqeCtla2JVUldwR3FPdDEKZ2xhbnE2QjhhQk16OXAwdzhHOG5PU1FqS3BEOWtDazE4cFBmTktYRzkvanZqQTlpU255dTAvVlUrSTIybWxhSApGb0k2TTZ0YUlnajNncnJxTHVCSG1yUzFSYU1GTzluY0xrVkFPK3JjZitnNzY5SHNKdGcxcERERk9xeFhuck4yCnBTQjcrUjVLQldJQnBpaDFZSmVTRFc0K1RUZEREWklWbkJnaXpWR1pvQ2thUEYrS01qTmJNTWVKTDBlWUQ2TUQKeHZieHJOOHk4Tm1CR3VTY3ZmYUFGUERSTExtRjlkaWpzY2lsSWVVY0U1ZnVEcjNmS2Fudk5GTmIwK1JxRTRRRwp0aklDeEZLdUl0TGNzaUZDR3RwQThDbko3QW9NWE9MUXVzeEkwemNLekJJS2lubXdQUU4vYVV2ME5DQjlzelRxCmprdGs5VDc5c3lObkZRMEV1UEF0d1FsUlBMSnNGZkNsSTllRGRPVGxMc24rbUNkQ3hxdkduckRRV3ppbG0xRGUKZmhpWXRVVTc5bm0wNlBjYWV3YUQrOUNMMnJ2SHZSaXJDRzg4Z0d0QVB4a1p1bVdLNXI3VlhOTTIxKzlBVWlSZwpPR2NFTWV5UDg0TEczcmxWOHpzeGtWcmN0UWdWclhZbENnMTdMb2ZpREtZR3ZDWVFiVGVkN04xNGpIeUF4ZkRaCmQwalEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIFN1YmplY3Q6IENOPUdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIExhYmVsOiAiR2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IgojIFNlcmlhbDogMTQ1NDE1MTE3NzMxMTE3ODg0OTQKIyBNRDUgRmluZ2VycHJpbnQ6IDllOjgwOmZmOjc4OjAxOjBjOjJlOmMxOjM2OmJkOmZlOjk2OjkwOjZlOjA4OmYzCiMgU0hBMSBGaW5nZXJwcmludDogNGE6YmQ6ZWU6ZWM6OTU6MGQ6MzU6OWM6ODk6YWU6Yzc6NTI6YTE6MmM6NWI6Mjk6ZjY6ZDY6YWE6MGMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDEzOjYzOjM1OjQzOjkzOjM0OmE3OjY5OjgwOjE2OmEwOmQzOjI0OmRlOjcyOjI4OjRlOjA3OjlkOjdiOjUyOjIwOmJiOjhmOmJkOjc0Ojc4OjE2OmVlOmJlOmJhOmNhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIU1RDQ0JUR2dBd0lCQWdJSkFNbk4wK25WZlNQT01BMEdDU3FHU0liM0RRRUJCUVVBTUlHc01Rc3dDUVlEClZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5Y21WdWRDQmhaR1J5WlhOeklHRjAKSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUdBMVVFQlJNSlFUZ3lOelF6TWpnMwpNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4SnpBbEJnTlZCQU1USGtkc2IySmhiQ0JECmFHRnRZbVZ5YzJsbmJpQlNiMjkwSUMwZ01qQXdPREFlRncwd09EQTRNREV4TWpNeE5EQmFGdzB6T0RBM016RXgKTWpNeE5EQmFNSUdzTVFzd0NRWURWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeQpjbVZ1ZENCaFpHUnlaWE56SUdGMElIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHCkExVUVCUk1KUVRneU56UXpNamczTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEp6QWwKQmdOVkJBTVRIa2RzYjJKaGJDQkRhR0Z0WW1WeWMybG5iaUJTYjI5MElDMGdNakF3T0RDQ0FpSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1EZlZ0UGtPcHQyUmJRVDIvL0J0aG1MTjBFWWxWSkg2eGVkCktZaU9OV3dHTWk1SFl2TkpCTDk5UkRheGNjeTlXZ2x6MWRtRlJQK1JWeVhmWGphT2NORmNjVU1kMmRydlhOTDcKRzcwNnRjdXRvOHhFcHcydUlSVS91WHBia25YWXBCSTRpUm1LdDREUzRqSnZWcHlSMW9nUUM3TjBaSkowWVBQMgp6eGhQWUxJajBNYzd6bUZMbVkvQ0ROQkFzcGpjRGFoT283a0tybUNnclVWU1k3cG12V2pnK2I0YXFJRzdIa0Y0CmRkUEIvZ0JWc0lkVTZDZVFOUjFNTTYyWC9KY3VtSVMvTE1tanY5R1lFUlR0WS9qS21JaFlGNW50UlFPWGZqeUcKSG9pTXZ2S1JoSTlsTk5nQVRIMjNNUmRhS1hvS0dDUXdvemUxZXFrQmZTYlcrUTZPV2ZIOUd6TzFLVHNYTzBHMgpJZDNVd0QybG41OGZRMURKdTd4c2VwZVk3czJNSC91Y1VhNkxjTDBubjNIQWE2eDlrR2JvMTEwNkRiRFZ3bzNWCnlKMmR3VzNRMEw5UjVPUDR3emcycnRhbmRlYXZoRU5kazVJTWFnZmVPeDJZSXRhc3dUWGJvNkFsLzNLMWRoM2UKYmVrc1ppeFNoTkJGa3M0YzVlVXpIZHdIVTFTanFvSTdtamN2M04yZ1pPbm0zYjJ1L0dTRkhUeW55UWJlaFA5cgo2R3NhUE1XaXMwTDdpd2srWHdoU3gyTEUxQVZ4djhSazVQaWhnK2crRXB1b0h0UTJUUzl4OW8wbzlvT3BFOUpoCndaRzdTTUEwajBHTVMwemJhUkwvVUpTY0lJTlpjKzE4b2ZMeC9kMzNTZE5EV0tCV1k4bzlQZVUxVmxucERzb2cKekN0TGt5a1BBZ01CQUFHamdnRnFNSUlCWmpBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFTU1CMEdBMVVkRGdRVwpCQlM1Q2NxY0h0dlRiRHBycnUxVThWdVRCalV1WGpDQjRRWURWUjBqQklIWk1JSFdnQlM1Q2NxY0h0dlRiRHByCnJ1MVU4VnVUQmpVdVhxR0JzcVNCcnpDQnJERUxNQWtHQTFVRUJoTUNSVlV4UXpCQkJnTlZCQWNUT2sxaFpISnAKWkNBb2MyVmxJR04xY25KbGJuUWdZV1JrY21WemN5QmhkQ0IzZDNjdVkyRnRaWEptYVhKdFlTNWpiMjB2WVdSawpjbVZ6Y3lreEVqQVFCZ05WQkFVVENVRTRNamMwTXpJNE56RWJNQmtHQTFVRUNoTVNRVU1nUTJGdFpYSm1hWEp0CllTQlRMa0V1TVNjd0pRWURWUVFERXg1SGJHOWlZV3dnUTJoaGJXSmxjbk5wWjI0Z1VtOXZkQ0F0SURJd01EaUMKQ1FESnpkUHAxWDBqempBT0JnTlZIUThCQWY4RUJBTUNBUVl3UFFZRFZSMGdCRFl3TkRBeUJnUlZIU0FBTUNvdwpLQVlJS3dZQkJRVUhBZ0VXSEdoMGRIQTZMeTl3YjJ4cFkza3VZMkZ0WlhKbWFYSnRZUzVqYjIwd0RRWUpLb1pJCmh2Y05BUUVGQlFBRGdnSUJBSUNJZjNEZWtpalpCWlJHLzVCWHFmRXYzeG9OYS9wOERoeEpKSGtuMkVhcWJ5bFoKVW9od0V1cmRQZldiVTFSdjRXQ2lxQW01N090WmZNWTE4ZHdZNmZGbjVhKzZSZUFKM3NwRUQ4SVhEbmVSUlhvegpYMStXTEdpTHdVZVBtSnM5d096TDlkV0Nrb1ExMGI0Mk9GWnlNVnRITGFvWHBHTlI2d29Cclgvc2RaN0xvUi94CmZ4S3h1ZVJrZjJmV0l5cjB1RGxkbU9naHArRzlQVUlhZEpwd3IyaHNVRjFKei8vN0RsM21MRWZYZ1RwWkFMVnoKYTJNZzlqRkZDRGtPOUhCK1FIQmFQOUJyUXFsMFBTZ3ZBbTExY3BVSmpVaGp4c1lqVjVLVFhqWEJqZmtLOXl5ZApZaHoyclh6ZHBqRWV0ckhIZm9VbStxUnF0ZHBqTU5Idmt6ZXlaaTk5QmZmbnQwdVlsRFhBMlRvcHdaMnlVRE1kClNxbGFwc2tENyszMDU2aHVpclJYaE91a1A5RHVxcXFIVzJQb2srSnJxTlM0Y25ockcrMDU1RjNMbTZxSDFVOU8KQVA3WmFwODhNUThvQWdGOW1PaW5zS0prbm5uNFNQSVZxY3pteUVUclAzaVo4bnR4UGp6eG1LZkZHQkkvNXJzbwpNMExwUlFwOGJmS0dlUy9GZ2hsOUNZbDhzbFIyaUs3ZXdmUE00VzdiTWRhVHJwbWc3eVZxYzVpSld6b3VFNGdlCnY4Q1NsRFFiNHllM2l4NXZRdi9uNlRlYlVCMHRvdmtDN3N0WVdEcHh2R2pqcXNHdkhDZ2ZvdHdqWlQrQjZxNloKMDlnd3p4TU5UeFhKaEx5blNDMzRNQ04zMkVaTGVXMzJqTzA2ZjJBUmVQVHBtNjdWVk1CMGdORUxRcC9CCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89R29EYWRkeS5jb20sIEluYy4KIyBTdWJqZWN0OiBDTj1HbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89R29EYWRkeS5jb20sIEluYy4KIyBMYWJlbDogIkdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA4MDozYTpiYzoyMjpjMTplNjpmYjo4ZDo5YjozYjoyNzo0YTozMjoxYjo5YTowMQojIFNIQTEgRmluZ2VycHJpbnQ6IDQ3OmJlOmFiOmM5OjIyOmVhOmU4OjBlOjc4Ojc4OjM0OjYyOmE3OjlmOjQ1OmMyOjU0OmZkOmU2OjhiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NToxNDowYjozMjo0NzplYjo5YzpjODpjNTpiNDpmMDpkNzpiNTozMDo5MTpmNzozMjo5MjowODo5ZTo2ZTo1YTo2MzplMjo3NDo5ZDpkMzphYzphOToxOTo4ZTpkYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHhUQ0NBcTJnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnekVMTUFrR0ExVUVCaE1DVlZNeApFREFPQmdOVkJBZ1RCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4R2pBWUJnTlZCQW9UCkVVZHZSR0ZrWkhrdVkyOXRMQ0JKYm1NdU1URXdMd1lEVlFRREV5aEhieUJFWVdSa2VTQlNiMjkwSUVObGNuUnAKWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1TURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJegpOVGsxT1Zvd2dZTXhDekFKQmdOVkJBWVRBbFZUTVJBd0RnWURWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFICkV3cFRZMjkwZEhOa1lXeGxNUm93R0FZRFZRUUtFeEZIYjBSaFpHUjVMbU52YlN3Z1NXNWpMakV4TUM4R0ExVUUKQXhNb1IyOGdSR0ZrWkhrZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDl4WWdqeCtsazA5eHZKR0tQM2dFbFk2U0tECkU2YkZJRU1CTzRUeDVvVkpueWZxOW9RYlRxQzAyM0NZeHpJQnNRVStCMDd1OVBwUEwxa3dJdWVyR1ZacjRvQUgKL1BNV2RZQTVVWHZsK1RXMmRFNnBqWUlUNUxZL3FRT0QrcUsraWhWcWY5NEx3N1laRkFYSzZzT29CSlE3Um53eQpEZk1BWmlMSWpXbHROb3dSR0xmVHNoeGd0RGo2QW96TzA5MUdCOTRLUHV0ZGZNaDgrN0FyVTZTU1ltbFJKUVZoCkdrU0JqQ3lwUTVZajM2dzZnWm9PS2NVY3FlbGRIcmFlbmpBS09jN3hpSUQ3UzEzTU11eUZZa01sTkFKV0p3R1IKdER0d0tqOXVzZWljaUFGOW45VDUyMU50WUoyL0xPZFlxN2hmUnZ6T3hCc0RQQW5yU1RGY2FVYXo0RWNDQXdFQQpBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFCkZEcWFoUWNRWnlpMjcvYTlCVUZ1SU1HVTJnL2VNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNaMjExNTFmbVgKV1djRFlmRitPd1l4ZFMyaElJNVBaWWUwOTZhY3ZOanBMOURiV3U3UGRJeHp0RGhDMmdWNytBSjF1UDJsc2RldQo5dGZlRTh0VEVINktSdEdYK3JjdUt4R3JrTEFuZ1Bub24xcnBONStyNU45c3M0VVhuVDNaSkU5NWtUWFdYd1RyCmdJT3JtZ0l0dFJEMDJKREhCSE5BN1hJbG9LbWY3SjZyYUJLWlY4YVBFam9KcEwxRS9RWVZOOEdiNURLajdUam8KMkdUekxINFUvQUxxbjgzL0IyZ1gyeUtRT0MxNmpkRlU4V25qWHpQS2VqMTdDdVBLZjE4NTVlSjF1c1YyR0RQTwpMUEF2VEszM3NlZk9UNmpFbTBwVUJzVi9mZFVJRCtJYy9uNFh1S3hlOXRRV3NrTUpERTMycDJ1MG1ZUmx5bnFJCjR1SkV2bHozNmh6MQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgU3ViamVjdDogQ049U3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgTGFiZWw6ICJTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IGQ2OjM5OjgxOmM2OjUyOjdlOjk2OjY5OmZjOmZjOmNhOjY2OmVkOjA1OmYyOjk2CiMgU0hBMSBGaW5nZXJwcmludDogYjU6MWM6MDY6N2M6ZWU6MmI6MGM6M2Q6Zjg6NTU6YWI6MmQ6OTI6ZjQ6ZmU6Mzk6ZDQ6ZTc6MGY6MGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJjOmUxOmNiOjBiOmY5OmQyOmY5OmUxOjAyOjk5OjNmOmJlOjIxOjUxOjUyOmMzOmIyOmRkOjBjOmFiOmRlOjFjOjY4OmU1OjMxOjliOjgzOjkxOjU0OmRiOmI3OmY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEM1RDQ0FzV2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1QKSEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFNVEtWTjBZWEptYVdWcwpaQ0JTYjI5MElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1TURrd01UQXdNREF3Ck1Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2dZOHhDekFKQmdOVkJBWVRBbFZUTVJBd0RnWURWUVFJRXdkQmNtbDYKYjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUZEdGeVptbGxiR1FnVkdWagphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1USXdNQVlEVlFRREV5bFRkR0Z5Wm1sbGJHUWdVbTl2ZENCRFpYSjBhV1pwClkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKZ2dFQkFMM3R3UVA4OW8vOEFyRnZXNTlJMloxNTRxSzNBMkZXR01OSHR0ZktQVFV1aVVQM29XbWIzb29hL1JNZwpuTFJKZHpJcFZ2MjU3SXpkSXZweTNDZGhsKzcyV29Uc2JobTVpU3pjaEZ2VmRQdHJYOFdKcFJCU2lVWlY5TGgxCkhPWi81RlN1Uy9oVmNsY0NHZmdYY1ZuckhpZ0hkTVdkU0w1c3RQU2tzUE5rTjNtU3dPeEdYbi9oYlZOTVlxL04KSHd0anV6cWQrL3g1QUpoaGRNOG1na0JqODdKeWFoa05tY3JVRG5YTU4vdUxpY0ZaOFdKL1g3TmZaVEQ0cDdkTgpkbG9lZGw0MHdPaVdWcG1Lcy9CL3BNMjkzREl4ZkpIUDRGOFIrR3VxU1Z6Um1aVFJvdU5qV3dsMnRWWmk0VXQwCkhaYlVKdFFJQkZuUW1BNE81dDc4dyt3ZmtQRUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSHdNTWgrbjJUQi94SDFvbzJLb29jNnJCMXNuTUEwRwpDU3FHU0liM0RRRUJDd1VBQTRJQkFRQVJXZm9sVHdOdmxKazdtaCtDaFRuVWRnV1VYdUVvazIxaVhRbkNvS2pVCnNIVTQ4VFJxbmVTZmlvWW1VZVlzMGNZdGJwVWdTcElCN0xpS1ozc3g0bWN1akpVREppNURuVW94OWc2MURMdTMKNGpkL0lyb0FvdzU3VXZ0cnV6dkUwM2xSVHMyUTlHY0hHY2c4Um5vTkFYM0ZXT2R0NW9Vd0Y1b2t4QkRnQlBmZwo4bi9VcWdyL1FoMDM3WlRsWkZrU0lIYzQwekkrT0lGMWxuUDZhSSt4eTg0ZnhlejZuSDdQZnJIeEJ5MjIvTC9LCnBML1Fsd1ZLdk9vWUtBS1F2VlI0Q1NGeDA5RjlIZGtXc0tsaFBkQUtBQ0w4eDN2TENXUkZDenRBZ2ZkOWZETDEKbU1wWWpuMHE3cEJaYzJUNU5uUmVKYUgxWmdVdWZ6a1ZxU3I3VUl1T2hXbjAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIFN1YmplY3Q6IENOPVN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIExhYmVsOiAiU3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiAxNzozNTo3NDphZjo3Yjo2MToxYzplYjpmNDpmOTozYzplMjplZTo0MDpmOTphMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkyOjVhOjhmOjhkOjJjOjZkOjA0OmUwOjY2OjVmOjU5OjZhOmZmOjIyOmQ4OjYzOmU4OjI1OjZmOjNmCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1Njo4ZDo2OTowNTphMjpjODo4NzowODphNDpiMzowMjo1MTo5MDplZDpjZjplZDpiMTo5Nzo0YTo2MDo2YToxMzpjNjplNToyOTowZjpjYjoyYTplNjozZTpkYTpiNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDd6Q0NBdGVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUVCaE1DVlZNeApFREFPQmdOVkJBZ1RCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9UCkhGTjBZWEptYVdWc1pDQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhPekE1QmdOVkJBTVRNbE4wWVhKbWFXVnMKWkNCVFpYSjJhV05sY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNQpNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWmd4Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEClZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnkKWm1sbGJHUWdWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNVHN3T1FZRFZRUURFekpUZEdGeVptbGxiR1FnVTJWeQpkbWxqWlhNZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTlVNT3NRcStVN2k5YjRabDErT2lGT3hIei9MejU4Z0UyMHAKT3NnUGZUejNhM1k0WTlrMllLaWJYbHdBZ0xJdldYLzJoL2tsUTRibmFSdFNtcERoY2VQWUxRMU9iL2JJU2RtMgo4eHBXcml1MmRCVHJ6L3NtNHhxNkhaWXVhanRZbElsSFZ2OGxvSk53VTRQYWhIUVV3MmVlQkdnNjM0NUFXaDFLClRzOURrVHZuVnRZQWNNdFM3bnQ5cmpybnZESDVSZmJDWU04VFdRSXJnTXcwUjkrNTNwQmxiUUxQTEpHbXB1ZmUKaFJoSmZHWk9venB0cWJYdU5DNjZEUU80TTk5SDY3RnJqU1habTg2QjBVVkdNcFp3aDk0Q0RrbERoYlpzYzd0awo2bUZCck1uVVZOK0hMOGNpc2liTW4xbFVhSi84dmlvdnhGVWNkVUJnRjRVQ1ZUbUxmd1VDQXdFQUFhTkNNRUF3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkp4ZkFOK3EKQWRjd0t6aUlvcmh0U3B6eUVaR0RNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJMTnFhRWQybmRPeG1mWnlNSQpidzVoeWYyRTNGL1lOb0hOMkJ0QkxaOWczY2NhYU5uUmJvYmhpQ1BQRTk1RHorSTBzd1NkSHluVnYvaGV5TlhCCnZlNlNiekowOHBHQ0w3MkNRbnF0S3JjZ2ZVMjhlbFVTd2hYcXZmZHFsUzVzZEovUEhMVHl4UUdqaGRCeVBxMXoKcXd1YmRReHRSYmVPbEt5V043V2cwSThWUnc3ajZJUGRqLzN2UVFGM3pDZXBZb1V6OGpjSTczSFBkd2JleUJrZAppRURQZlVZZC94N0g0YzcvSTl2RytvMVZUcWtDNTBjUlJqNzAvYjE3S1NhN3FXRmlOeWkyTFNyMkVJWmt5WENuCjBxMjNLWEI1Nmp6YVl5V2YvV2kzTU94dyszV0t0MjFnWjdJZXlMbnAyS2h2QW90bkRVMG1WM0hhSVB6QlNsQ04Kc1NpNgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgQ29tbWVyY2lhbCBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgQ29tbWVyY2lhbCBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBDb21tZXJjaWFsIgojIFNlcmlhbDogODYwODM1NTk3Nzk2NDEzODg3NgojIE1ENSBGaW5nZXJwcmludDogODI6OTI6YmE6NWI6ZWY6Y2Q6OGE6NmY6YTY6M2Q6NTU6Zjk6ODQ6ZjY6ZDY6YjcKIyBTSEExIEZpbmdlcnByaW50OiBmOTpiNTpiNjozMjo0NTo1Zjo5YzpiZTplYzo1Nzo1Zjo4MDpkYzplOTo2ZToyYzpjNzpiMjo3ODpiNwojIFNIQTI1NiBGaW5nZXJwcmludDogMDM6NzY6YWI6MWQ6NTQ6YzU6Zjk6ODA6M2M6ZTQ6YjI6ZTI6MDE6YTA6ZWU6N2U6ZWY6N2I6NTc6YjY6MzY6ZTg6YTk6M2M6OWI6OGQ6NDg6NjA6Yzk6NmY6NWY6YTcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZDNjR0p5YXBzWHd3RFFZSktvWklodmNOQVFFTEJRQXdSREVMTUFrR0ExVUUKQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WegpkQ0JEYjIxdFpYSmphV0ZzTUI0WERURXdNREV5T1RFME1EWXdObG9YRFRNd01USXpNVEUwTURZd05sb3dSREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnAKY20xVWNuVnpkQ0JEYjIxdFpYSmphV0ZzTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBOWh0UFp3Y3JvUlgxQmlMTEh3R3k0M05GQmtSSkxMdEpKUlRXenNPM3F5eFB4a0V5bEZmNkVxZGJEdUtQCkh4NkdHYWVxdFMyNVh3Mkt3cStGTlhreUxic2NZamZ5c1Z0S1Bjck5jVi9wUXI2VTZNamUrU0pJWk1ibHE4WXIKYmEwRjhQclZDOCthNWZCUXBJczdSNlVqVzNwNitETS91TytabCtNZ3dkWW9pYytVKzdsRjdlTkFGeEhVZFBBTApNZUlySm1xYlRGZXVyQ0ErdWtWNkJmTzltMmtWcm4xT0lHUEVOWFk2QndMSk4vM0hSKzdvOFhZZGN4WHlsNlMxCnlIcDUyVUtxSzM5Yy9zNG1UNk5tZ1RXdlJMcFVIaHd3TW1XZDVqeVRYbEJPZXVNNjFHN01HdnY1MGpldUpDcXIKVndNaUtBMUpkWCszS05wMXY0N2ozQTU1TVFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVW5aUEdVNHRleXE4LwpueDRQNVptVnZDVDJsSTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEUVlKCktvWklodmNOQVFFTEJRQURnZ0VCQUZpczlBUU96Y0FOL3dyOTFMb1dYeW05ZTJpWldFblN0QjAzVFg4bmZVWUcKWFVQR2hpNCtjN0ltZlUrVHFiYkVLcHFySVpjVXNkNk0wNnVKRmRockpOVHhGcTdZcEZ6VWYxR083UmdCc1pOagp2Yno0WVlDYW5ySE9RbkRpcVgwR0pYMG5vZjV2N0xNZUpOcmpTMVVhQURzMXREdloxMTB3L1lFVGlmTENCaXZ0Clo4U095VU95WEdzVmlRSzhZdnhPOHJVenFySnYwd3FpVU9QMk8rZ3VSTUxiWmppcE0xWkk4VzBiTTQwTmpEOWcKTjUzVHltMStOSDRObjNKMml4dWZjdjFTTlVGRkFwWXZITEthYzBraHNVbEhSVWUwNzJvMEVjbE5tc3hadDlZQwpubHBPWmJXVXJodmZLYkFXOGI4QW5nYzZGMlMxQkxVaklaa0tsVHVYZk84PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgTmV0d29ya2luZyBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgTmV0d29ya2luZyBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBOZXR3b3JraW5nIgojIFNlcmlhbDogODk1NzM4MjgyNzIwNjU0Nzc1NwojIE1ENSBGaW5nZXJwcmludDogNDI6NjU6Y2E6YmU6MDE6OWE6OWE6NGM6YTk6OGM6NDE6NDk6Y2Q6YzA6ZDU6N2YKIyBTSEExIEZpbmdlcnByaW50OiAyOTozNjoyMTowMjo4YjoyMDplZDowMjpmNTo2NjpjNTozMjpkMTpkNjplZDo5MDo5Zjo0NTowMDoyZgojIFNIQTI1NiBGaW5nZXJwcmludDogMGE6ODE6ZWM6NWE6OTI6OTc6Nzc6ZjE6NDU6OTA6NGE6ZjM6OGQ6NWQ6NTA6OWY6NjY6YjU6ZTI6YzU6OGY6Y2Q6YjU6MzE6MDU6OGI6MGU6MTc6ZjM6ZjA6YjQ6MWIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZkU4RU9SelVtUzB3RFFZSktvWklodmNOQVFFRkJRQXdSREVMTUFrR0ExVUUKQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WegpkQ0JPWlhSM2IzSnJhVzVuTUI0WERURXdNREV5T1RFME1EZ3lORm9YRFRNd01USXpNVEUwTURneU5Gb3dSREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnAKY20xVWNuVnpkQ0JPWlhSM2IzSnJhVzVuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBdElUTU14Y3VhNVJzYTJGU29PdWp6M21VVE9XVWdKbkxWV1JFWlk5blpPSUc0MXczU2ZZdm00U0VIaTN5CllKMHdUc3lFaGVJc3p4NmUvamFyTTNjMVJOZzFsaG85TnVoNkR0alZSNkZxYVl2Wi9MczZybmxhMWZUV2NidWEKa0NOcm1yZUlkSWNNSGwrNW5pMzZxMU1yM0x0MlBwTk1DQWlNSHFJakhOUnFyU0s2bVFFdWJXWEx2aVJtVlNSTApRRVN4RzlmaHdvWEEzaEEvUGUyNC9QSHhJMVBjdjJXWGI5bjVRSEdOZmIyVjFNNitvRjRuSTk3OXB0QW1EZ0FwCjZ6eEc4RDFndno5UTB0d21RVkdlRkRkQ0JLTndWNmdiaCswdCtudnVqQXJqcVdhSkdjdEIrZDFFTm1IUDRuZEcKeUgzMjlKS0JOdjNiTlBGeWZ2TU1GcjIwRlFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVUJ4L1M1NXphd202aQpRTFN3ZWxBUVVIVEV5TDB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUlsWHNoWjZxTUw5MXRtYm16VENuTFF5RkUybnBOL3N2cWUrK0VQYmtUZk8KdERJdVVGVWFOVTUyUTNFZzc1TjNUaFZ3TG9mRHdSMXQzTXUxSjlRc1Z0RlNVenBFMG5QSXhCc0ZaVnBpa3B6dQpRWTB4MitjMDZsa2gxUUY2MTJTNFpEbk55ZTJ2N1VzRFNLZWdtUUdBM0dXak5xNWxXVWhQZ2t2SVpmRlhIZVZaCkxnby9iTmpSOWVVSnRHeFVBQXJnRlUySGRXMjNXSlphM1czU0FLRDBtMGkrd3pla3VqYmdmSWVGbHhvVm90NHUKb2x1OXJ4ajVrRkROY0ZuNEoyZEh5OGVnQnpwOTBTeGRiQms2WnJWOS9aRnZnckcrQ0pQYkZFZnhvamZIUlo0OAp4M2V2WktpVDMvWnBnNEpnOGtsQ05PMWFBRlNGSEJZMmtneGMrcWF0djlzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBQcmVtaXVtIgojIFNlcmlhbDogNzg5MzcwNjU0MDczNDM1MjExMAojIE1ENSBGaW5nZXJwcmludDogYzQ6NWQ6MGU6NDg6YjY6YWM6Mjg6MzA6NGU6MGE6YmM6Zjk6Mzg6MTY6ODc6NTcKIyBTSEExIEZpbmdlcnByaW50OiBkODphNjozMzoyYzplMDowMzo2ZjpiMTo4NTpmNjo2Mzo0Zjo3ZDo2YTowNjo2NToyNjozMjoyODoyNwojIFNIQTI1NiBGaW5nZXJwcmludDogNzA6YTc6M2Y6N2Y6Mzc6NmI6NjA6MDc6NDI6NDg6OTA6NDU6MzQ6YjE6MTQ6ODI6ZDU6YmY6MGU6Njk6OGU6Y2M6NDk6OGQ6ZjU6MjU6Nzc6ZWI6ZjI6ZTk6M2I6OWEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSakNDQXk2Z0F3SUJBZ0lJYll3VVJyR21DdTR3RFFZSktvWklodmNOQVFFTUJRQXdRVEVMTUFrR0ExVUUKQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVJ3d0dnWURWUVFEREJOQlptWnBjbTFVY25WegpkQ0JRY21WdGFYVnRNQjRYRFRFd01ERXlPVEUwTVRBek5sb1hEVFF3TVRJek1URTBNVEF6Tmxvd1FURUxNQWtHCkExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVUKY25WemRDQlFjbVZ0YVhWdE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBeEJMZgpxVi8rUWQzZDlaK0s0L2FzNFR4NG1yelk4SDk2b0RNcTNJMGdXNjR0YitlVDJUWndhbWpQamxHamhWdG5CS0FRCkpHOWRLSUxCbDFmWVNDa1R0dUcra1UzZmhReFRHSm9lSktKUGovQ2loUXZMOUNsLzBxUlk3aVpOeWFxb2U1cloKK2pqZVJGY1Y1ZmlNeU5sSTRnMFdKeDBleUlPRkpiZTZxbFZCekFNaVN5MlJqWXZtaWE5bXgrbi9LK2s4ck5yUwpzOFBoYUp5SitIb0FWdDcwVlpWcys3cGszV0tMM3d0M011dGl6Q2FhbTd1cVlvTk10QVo2TU1ncHYrMEdUWmU1CkhNUXhLOVZmdkZNU0Y1eVpWeWxtZDJFaE1RY3VKVW1kR1BMdTh5dHhqTFc2T1FkSmQvenZMcEtRQlkwdEwzZDcKNzBPL05idWEyUGx6cHl6eTBGZnVLRTRtWDQrUWFBa3Z1UGpjQnVrdW1qNVJwOUVpeEFxbk9FaHNzL24vZmF1RwpWK082MW9WNGQ3cEQ2a2gvOXRpK0kyMGV2OUUyYkZoYzhlNmtHVlFhOVFQU2R1YmhqTDA4czlOSVMrTEkrSCtTCnFIWkduRUpsUHFRZXdRY0RXa1l0dUpmenQ5V3lWU0h2dXR4TUFKZjdGSlVuTTcvb1EwZEcwZ2laRm1BN21uN1MKNXUwNDZ1d0JIanhJVmtrSngwdzNBSjZJRHNCejRXOW02WEpITUQ0UTVRc0R5WnBDQUd6RmxINWh4SXJmZjRJYQpDMW5FV1RKM3M3eGdhVlk1L2JRR2V5eldaRGJadlVqdGhCOStwU0tQS3JoQzlJSzMxRk9RZUU0dEd2MkJiMFRYCk93RjBsa0xnQU9JdWErckY3bktzdTcvKzZxcW8rTnoyc25tS3RtY0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUUKRkozQVo2WU1JdGttOVVXcnBtVlNFU2ZZUmF4ak1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdFR01BMEdDU3FHU0liM0RRRUJEQVVBQTRJQ0FRQ3pWMDBRWWs0NjVLenF1Qnl2TWlQSXMwbGFVWngyCktJMTVxbGRHRjlYMVV2YTNST2dJUkw4WWhOSUxnTTNGRXYwQVZRVmhoMEhjdFNTZVBNVFl5UHR3bmk5NGxvTWcKTnQ1OEQya1RpS1YxTnBnSXBzYmZyTTdqV05hM1B0NjY4K3MwUU5paWdmVjRQeS9WcGZ6Wm90UmVCQTRYcmY1Qgo4T1d5Y3ZwRWdqTkM2QzFZOTFhTVlqKzZRckNjREZ4K0xtVW1YRk5QQUxKNGZxRU5tUzJOdUIyT29zU3cvV0RRCk1LU095QVJpcWNUdE5kNTZsKzBPT0Y2U0w1TndwYW1jYjZkOUV4MSt4Z2hJc1Y1bjYxRUlKZW5tSld0U0taR2MKMGpsekNGZmVtUWEwVzUwUUJ1SENBS2k0SEVvQ0NoVFF3VUhLKzR3MUlYMkNPUEtwVkpFWk5aT1ViV282eGJMUQp1NG1HaytpYnlRODZwM3E0b2ZCNFJ2cjhOeS9saW9UejMvNEUyYUZvb0M4azRnbVZCdFdWeXVFa2x1dDg5cE1GCnUrMXo2UzNSZFRuWDV5VGIyRTVmUTQrZTBCUTV2MVZ3U0psWE1iU2M3a3FZQTVZd0gyQUc3aHNqL29GZ0l4cEgKWW9XbHpCazBnRyt6ckJyam4vQjdTSzNWQWRsbnRxbHlrK290WnJXeXVPUTlQTEx2VEl6cTZ3ZS9xeldhVllhOApHS2ExcUY2MGcyeHJhVURUbjl6eHcybHJ1ZUZ0Q2ZUeHFsQjJDbnA5ZWhlaFZaWkNtVEVKM1dBUmpRVXdmdWFPClJ0R2RGTnJIRitRRmxvekVKTFVienhRSHNrRDRvNTVCaHJ3RTBHdVd5Q3FBTlAyLzd3YWozVmpGaFQwK2ovNmUKS2VDMnVBbG9HUndZUXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MgTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IFByZW1pdW0gRUNDIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IFByZW1pdW0gRUNDIgojIFNlcmlhbDogODQwMTIyNDkwNzg2MTQ5MDI2MAojIE1ENSBGaW5nZXJwcmludDogNjQ6YjA6MDk6NTU6Y2Y6YjE6ZDU6OTk6ZTI6YmU6MTM6YWI6YTY6NWQ6ZWE6NGQKIyBTSEExIEZpbmdlcnByaW50OiBiODoyMzo2YjowMDoyZjoxZDoxNjo4Njo1MzowMTo1NTo2YzoxMTphNDozNzpjYTplYjpmZjpjMzpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogYmQ6NzE6ZmQ6ZjY6ZGE6OTc6ZTQ6Y2Y6NjI6ZDE6NjQ6N2E6ZGQ6MjU6ODE6YjA6N2Q6Nzk6YWQ6Zjg6Mzk6N2U6YjQ6ZWM6YmE6OWM6NWU6ODQ6ODg6ODI6MTQ6MjMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUIvakNDQVlXZ0F3SUJBZ0lJZEpjbGlzYy9lbFF3Q2dZSUtvWkl6ajBFQXdNd1JURUxNQWtHQTFVRUJoTUMKVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNU0F3SGdZRFZRUUREQmRCWm1acGNtMVVjblZ6ZENCUQpjbVZ0YVhWdElFVkRRekFlRncweE1EQXhNamt4TkRJd01qUmFGdzAwTURFeU16RXhOREl3TWpSYU1FVXhDekFKCkJnTlZCQVlUQWxWVE1SUXdFZ1lEVlFRS0RBdEJabVpwY20xVWNuVnpkREVnTUI0R0ExVUVBd3dYUVdabWFYSnQKVkhKMWMzUWdVSEpsYldsMWJTQkZRME13ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUU5NRjRiRlowRAowS0Y1TmJjNlBKSjZ5aFVjeldMem5DWmNCejNsVlBxajFzd1M2dlFVWCtpT0dhc3ZMa2ptckJoRGVLelFOOE85CnNzMHM1a2ZpR3VaanVEMHVMM2pFVDl2MEQ2Um9URlZ5YTVVZFRoaENsWGpNTnp5UjRwdGxLeW1qUWpCQU1CMEcKQTFVZERnUVdCQlNhcnlsNndCRTFOU1pSTUFERGF2NUExYTdXUERBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBS0JnZ3Foa2pPUFFRREF3Tm5BREJrQWpBWENmT0hpRkJhcjhqQVFyOUhYL1ZzCmFvYmd4Q2QwNURoVDF3Vi9HelRqeGkrenlnazhONTNYNTdoRzhmMmg0bkVDTUVKWmgwUFVVZCs2MHdreVdzNkkKZmxjOW5GOUNhL1VITGJYd2dwUDVXVyt1WlBwWTVZc2U0Mk8rdFlITmJ3S01lUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EiCiMgU2VyaWFsOiAyNzk3NDQKIyBNRDUgRmluZ2VycHJpbnQ6IGQ1OmU5OjgxOjQwOmM1OjE4OjY5OmZjOjQ2OjJjOjg5Ojc1OjYyOjBmOmFhOjc4CiMgU0hBMSBGaW5nZXJwcmludDogMDc6ZTA6MzI6ZTA6MjA6Yjc6MmM6M2Y6MTk6MmY6MDY6Mjg6YTI6NTk6M2E6MTk6YTc6MGY6MDY6OWUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVjOjU4OjQ2OjhkOjU1OmY1OjhlOjQ5OjdlOjc0OjM5OjgyOmQyOmI1OjAwOjEwOmI2OmQxOjY1OjM3OjRhOmNmOjgzOmE3OmQ0OmEzOjJkOmI3OjY4OmM0OjQwOjhlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdXpDQ0FxT2dBd0lCQWdJREJFVEFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1INHhDekFKQmdOVkJBWVRBbEJNCk1TSXdJQVlEVlFRS0V4bFZibWw2WlhSdklGUmxZMmh1YjJ4dloybGxjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NUQKWlhKMGRXMGdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhreElqQWdCZ05WQkFNVEdVTmxjblIxYlNCVQpjblZ6ZEdWa0lFNWxkSGR2Y21zZ1EwRXdIaGNOTURneE1ESXlNVEl3TnpNM1doY05Namt4TWpNeE1USXdOek0zCldqQitNUXN3Q1FZRFZRUUdFd0pRVERFaU1DQUdBMVVFQ2hNWlZXNXBlbVYwYnlCVVpXTm9ibTlzYjJkcFpYTWcKVXk1QkxqRW5NQ1VHQTFVRUN4TWVRMlZ5ZEhWdElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVNJdwpJQVlEVlFRREV4bERaWEowZFcwZ1ZISjFjM1JsWkNCT1pYUjNiM0pySUVOQk1JSUJJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTQvdDlvM0s2d3ZESkZJZjFhd0ZPNFc1QUI3cHRKMTEvOTFzdHMxckgKVVYrcnBES21ZWWUyYmcrRzBqQUNsL2pYYVZlaEdEbGRhbVI1eGdGWnJEd3hTamg4MGdUU1N5am9JRjg3QjZMTQpUWFBiODY1UHgxYlZXcWVXaWZyenEyalVJNFpaSjg4Sko3eXNibktESERCeTMrQ2k2ZExoZEhVWnZTcWVleFZVCkJCdlhRem10VlNqRjRocTc5TURrcmpoSk04eDJoWjg1UmRLa252SVNqRkg0Zk9RdGYvV3NYK3NXbjdFdDBick0Ka1VKM1RDWEprRGh2Mi9ETSs0NGVsMWsrMVdCTzVnVW83VWw1RTB1NlNOc3YrWExUT2NyK0g5ZzBjdlcwUU04eApBY1BzM2hFdEYxMGZ1RkRSWGhtbmFkNEhNeWpLVUpYNXAxVExWSVpRUmFuNVNRSURBUUFCbzBJd1FEQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlFJZHMzTEIvOGs5c1hON2J1UXZPS0VOMFoxOXpBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLYW9yU0xPQVQybW8vOWkwRWlkaTE1eQpzSGhFNDl3Y3J3bjlJMGo2dlNyRXVWVUV0UkNqalNmZUM0SmowTzdlRERkNVFWc2lzckNhUVZ5bWNPRFUwSGZMCkk5TUE0R3hXTCtGcERRM1pxcjhoZ1ZEWkJxV28vNVUzMEtyKzRyUDFtUzFGaElybFFnblhkQUl2OTRuWW1lbTgKSjlSSGpib05SaHgzenhTa0hMbWtNY1NjS0hRRE5QOHpHU2FsNlExMHR6Nlh4bmJvSjVhalp0M2hydkpCVzhxWQpWb056Y09TR0d0SXhRYm92dmkwVFduWnZUdWhPZ1E0L1d3TWlvQksrWmxnUlNzc0R4TFFxS2kyV0YrQTVWTHhJCjAzWW5uWm90QnFiSjdEblNxOXVmbWdzbkFqVXBzVUNWNS9ub25GV0lHVWJXdHpUMWZzNDVtdGs0OFZIM1R5dz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049VFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBMYWJlbDogIlRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGFhOjA4OjhmOmY2OmY5OjdiOmI3OmYyOmIxOmE3OjFlOjliOmVhOmVhOmJkOjc5CiMgU0hBMSBGaW5nZXJwcmludDogY2Y6OWU6ODc6NmQ6ZDM6ZWI6ZmM6NDI6MjY6OTc6YTM6YjU6YTM6N2E6YTA6NzY6YTk6MDY6MjM6NDgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOmQ4OjhmOmUxOjEwOjFjOjQxOmFlOjNlOjgwOjFiOmY4OmJlOjU2OjM1OjBlOmU5OmJhOmQxOmE2OmI5OmJkOjUxOjVlOmRjOjVjOjZkOjViOjg3OjExOmFjOjQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZXpDQ0FtT2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCZk1Rc3dDUVlEVlFRR0V3SlVWekVTCk1CQUdBMVVFQ2d3SlZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlUKVjBOQklGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd09ESTRNRGN5TkRNegpXaGNOTXpBeE1qTXhNVFUxT1RVNVdqQmZNUXN3Q1FZRFZRUUdFd0pVVnpFU01CQUdBMVVFQ2d3SlZFRkpWMEZPCkxVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVVjBOQklGSnZiM1FnUTJWeWRHbG0KYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQgpBUUN3Zm5LNHBBT1U1cWZlQ1RpUlNoRkFoNmQ4V1dRVWU3VVJFTjMrdjlYQXUxYmloU1gwTlhJUCtGUFFRZUZFCkFjSzBITU14UWhaSGhUTWlkcklLYncvbEpWQlBoWWErdjVndUVHY2V2aEVGaGdXUXhGblFmSGdRc0lCY3QrSEgKSzNYTGZKK3V0ZEdkSXpkanA5eENvaTJTQkJ0UXdYdTRQaHZKVmdTTEwxS2JyYWxXNmNIL3JhbFloekMyZ2ZlWApSZndaVnpzcmIrUkg5SmxGL2gzeCtKZWppQjAzSEZ5UDRIWWxtbEQ0b0ZUL1JKQjJJOUl5eHNPckJyLzgrNy96CnJYMlNZZ0piS2RNMW81T2FRMlJnWGJMNk12ODdCSzlOUUdyNXgrUHZJLzFyeStVUGl6Z043Z3I4L2crWW56QXgKM1d4U1pmbUxnYjRpNFJ4WUE3cVJHNGtIQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJScU9Gc21qZDZMV3ZKUGVsU0RHUmpqQ0RXbXVqQU5CZ2txCmhraUc5dzBCQVFVRkFBT0NBUUVBUE5WM1BkcmZpYnFIREFoVWFpQlFrcjZ3UVQyNUptU0RDaS9vUU1DWEtDZUMKTUVySmsvOXE1NllBZjRsQ210WVI1VlBPTDh6eTJnWEUvdUpReERxR2ZjemFmaEFKTzVJMUtsT3kvdXNyQmRscwpYZWJRNzlOcVpwNFZLSVY2NklJQXJCNm5DV2xXUXROb1VSaStWSnEvUkVHNlNiNGd1bWxjN3JoM3pjNXNINjJECmxoaDlEclVVT1lUeEtPa3RvNTU3SG5weVdvT3plVy92dFB6UUNxVllUMGJmKzIxNVdmS0VJbEt1RDh6N2ZEdm4KYXNwSFljTjYrTk9TQkIrNElJVGhObFFXeDBEZU80cHozTi9HQ1V6ZjdOci8xRk5Db2NueVloMGlnenlYeGZrWgpZaWVzWlNMWDB6ekc1WTZ5VTh4Snpyd3cvbnNPTTVENzdkSVVrUjhIcnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuIE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMgojIFN1YmplY3Q6IE89U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELiBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKIyBMYWJlbDogIlNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDZjOjM5OjdkOmE0OjBlOjU1OjU5OmIyOjNmOmQ2OjQxOmIxOjEyOjUwOmRlOjQzCiMgU0hBMSBGaW5nZXJwcmludDogNWY6M2I6OGM6ZjI6Zjg6MTA6YjM6N2Q6Nzg6YjQ6Y2U6ZWM6MTk6MTk6YzM6NzM6MzQ6Yjk6Yzc6NzQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDUxOjNiOjJjOmVjOmI4OjEwOmQ0OmNkOmU1OmRkOjg1OjM5OjFhOmRmOmM2OmMyOmRkOjYwOmQ4OjdiOmI3OjM2OmQyOmI1OjIxOjQ4OjRhOmE0OjdhOjBlOmJlOmY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURCZE1Rc3dDUVlEVlFRR0V3SktVREVsCk1DTUdBMVVFQ2hNY1UwVkRUMDBnVkhKMWMzUWdVM2x6ZEdWdGN5QkRUeTRzVEZSRUxqRW5NQ1VHQTFVRUN4TWUKVTJWamRYSnBkSGtnUTI5dGJYVnVhV05oZEdsdmJpQlNiMjkwUTBFeU1CNFhEVEE1TURVeU9UQTFNREF6T1ZvWApEVEk1TURVeU9UQTFNREF6T1Zvd1hURUxNQWtHQTFVRUJoTUNTbEF4SlRBakJnTlZCQW9USEZORlEwOU5JRlJ5CmRYTjBJRk41YzNSbGJYTWdRMDh1TEV4VVJDNHhKekFsQmdOVkJBc1RIbE5sWTNWeWFYUjVJRU52YlcxMWJtbGoKWVhScGIyNGdVbTl2ZEVOQk1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5BVgpPVkt4VXJPNnhWbUN4RjFTcmpwRFpZQkx4L0tXdk5zMmw5YW1aSXlvWHZEakNoejMzNWM5UzY3Mlhld2h0VUdyCnpibCtkcCsrK1Q0Mk5LQTd3Zll4RVVWMGt6MVhnTVg1aVpuSzVhdHExTFhhUVpBUXdkYldRb25Ddi9RNEVwVk0KVkFYM051UkZnM3NVWmRiY0RFM1IzbjRNcXp2RUZiNDZWcVphYjNacFVxbDZ1Y2pyYXBwZFV0QXRDbXMxRmdrUQpoTkJxeWpvR0FEZEg1SDVYVHorTDYyZTRpS3JGdmxOVnNwSEVmYm13aFJrR2VDN2JZUnI2aGZWS2thSG5GdFdPCm9qbmZsTGh3SHlnL2kveEFYbU9EUElNcUdwbHJ6OTVaYWp2OGJ4YlhILzFLRU90T2doWTZyQ2NNVS9HdDFTU3cKYXdOUXdTMDhGdDFFTkNjYWRmc0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGQXFGcVhkbEJaaDhRSUg0RDVjcwpPUEVLN0R6UE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUEwR0NTcUdTSWIzCkRRRUJDd1VBQTRJQkFRQk1PcU5FckxsRnNjZVRmc2dMQ2tMZlpPb2M3bGxzQ0xxSlgycktTcFdlZW84SHhkcEYKY29KeERqclN6RytudEtFanUvWWtuOHNYL295bXpzTFMyOHlOL0hIOEF5bkJiRjB6WDJTMlpUdUpieGgyZVBYYwpva2dmR1QrT2srdngraGZ1elU3akJCSlYxdVhrM2ZzK0JYemlIVjdHcDd5WFQyZzY5ZWt1Q2tPMnIxZGNZbWg4CnQvMmppb1NnckdLK0t3bUhOUEJxQWJ1YktWWTgvZ0EzenlOczhVNnF0blJHRW15UjdqVFY3SnFSNTBTK2tERnkKMVVrQzlnTGw5Qi9yZk5tV1Zhbi83SXI1bVVmL05Wb0NxZ1RMaWx1SGNTbVJ2YVMwZWcyOW12VlhJd0FISVJjLwpTam5SQlVrTHA3WTNnYVZkaktvelhvRW9mS2Q5SitzQXJvMDMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTEgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTEgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIExhYmVsOiAiSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDczOjlmOjRjOjRiOjczOjViOjc5OmU5OmZhOmJhOjFjOmVmOjZlOmNiOmQ1OmM5CiMgU0hBMSBGaW5nZXJwcmludDogZmU6NDU6NjU6OWI6Nzk6MDM6NWI6OTg6YTE6NjE6YjU6NTE6MmU6YWM6ZGE6NTg6MDk6NDg6MjI6NGQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJjOjEwOjRmOjE1OmE0OjhiOmU3OjA5OmRjOmE1OjQyOmE3OmUxOmQ0OmI5OmRmOjZmOjA1OjQ1OjI3OmU4OjAyOmVhOmE5OjJkOjU5OjU0OjQ0OjI1OjhhOmZlOjcxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTVRDQ0F4bWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmxURUxNQWtHQTFVRUJoTUNSMUl4ClJEQkNCZ05WQkFvVE8waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjEKZEdsdmJuTWdRMlZ5ZEM0Z1FYVjBhRzl5YVhSNU1VQXdQZ1lEVlFRREV6ZElaV3hzWlc1cFl5QkJZMkZrWlcxcApZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwZFhScGIyNXpJRkp2YjNSRFFTQXlNREV4TUI0WERURXhNVEl3Ck5qRXpORGsxTWxvWERUTXhNVEl3TVRFek5EazFNbG93Z1pVeEN6QUpCZ05WQkFZVEFrZFNNVVF3UWdZRFZRUUsKRXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6SUVObApjblF1SUVGMWRHaHZjbWwwZVRGQU1ENEdBMVVFQXhNM1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsCmMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QlNiMjkwUTBFZ01qQXhNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2xUQU9NdXB2YU8rbURZTFpVKytDd3FWRTdOdVlSaGxGaFBqejJMNUVQegpkWW1OVWVURE45S0tpRTE1SHJjUzNVTjRTb3FTNXRkSTFRK2tPaWxFTmJnSDltZ2RWYzA0VWZDTUpER0ZyNFBKCmZlbDNyKzBhZTUwWCtiT2RPRkFQcGxwNWtZQ3ZONjZtMHpIN3RTWUpuVHhhNzFIRks5K1dYZXN5SGdMYWNFbnMKYmd6SW1qZU45L0UyWUVzbUxJS2UwSGp6RFE5anBGRXc0ZmtySnhJSDJPcTlHR0tZc0ZrM2ZiN3U4eUJSUWxxRAo3NU82YVJYeFlwMmZtVG1Db2JkMExvdlV4UXQ3TC9ESUN0bzllUXFha3h5bEtISnprVU9hcDlGTmhZUzVxWFNQCkZFREgzTjZzUVdSc3RCbWJBbU50SkdTUFJMSWw2czVkZEF4ak1seU5oK1VDQXdFQUFhT0JpVENCaGpBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVcHBGQy9STmhTaU9lQ0tRcAo1ZGdUQkNQdVFTVXdSd1lEVlIwZUJFQXdQcUE4TUFXQ0F5NW5jakFGZ2dNdVpYVXdCb0lFTG1Wa2RUQUdnZ1F1CmIzSm5NQVdCQXk1bmNqQUZnUU11WlhVd0JvRUVMbVZrZFRBR2dRUXViM0puTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQWY3M2xCNFh0dVA3S01oamRDU2s0Y054Nk5acm9rZ2NsUEVnOGh3QU9YaGlWdFhkTWlLYWhzb2cycAo2ejBHVzVrNng4ekRtalIvcXc3SVRoemgrdVRjelEyK3Z5VCtiT2Ryd2czSUJwNU9qV0VvcG1yOTVmWmk2aGc4ClRxQlRuYkk2bk91bG5KRVd0azJDNEF3RlNLbHM5Y3o0eTUxSnRQQUNwZjF3QSsyS0lhV3VFNFpKd3pOenZvYzcKZElzWFJTWk1GcEdEL21kOXpVMWpaL3J6QXhLV2VBYU5zV2Z0amorK24wOEM5Yk1KTC9OTWg5OHF5NVY4QWN5cwpObnEvb25ONjk0L0J0WnFoRkxLUE01OE43eUxjWm51RXZVVVhCajA4eXJsM05JL0s2czgvTVQ3amlPT0FTU1hJCmw3V2RtcGxOc0R6NFNnQ2JaTjJmT1V2Uko5ZTQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQSBPPUFjdGFsaXMgUy5wLkEuLzAzMzU4NTIwOTY3CiMgU3ViamVjdDogQ049QWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIE89QWN0YWxpcyBTLnAuQS4vMDMzNTg1MjA5NjcKIyBMYWJlbDogIkFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQSIKIyBTZXJpYWw6IDYyNzE4NDQ3NzI0MjQ3NzA1MDgKIyBNRDUgRmluZ2VycHJpbnQ6IDY5OmMxOjBkOjRmOjA3OmEzOjFiOmMzOmZlOjU2OjNkOjA0OmJjOjExOmY2OmE2CiMgU0hBMSBGaW5nZXJwcmludDogZjM6NzM6YjM6ODc6MDY6NWE6Mjg6ODQ6OGE6ZjI6ZjM6NGE6Y2U6MTk6MmI6ZGQ6Yzc6OGU6OWM6YWMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU1OjkyOjYwOjg0OmVjOjk2OjNhOjY0OmI5OjZlOjJhOmJlOjAxOmNlOjBiOmE4OjZhOjY0OmZiOmZlOmJjOmM3OmFhOmI1OmFmOmMxOjU1OmIzOjdmOmQ3OjYwOjY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdXpDQ0E2T2dBd0lCQWdJSVZ3b1JsMExFNDh3d0RRWUpLb1pJaHZjTkFRRUxCUUF3YXpFTE1Ba0dBMVVFCkJoTUNTVlF4RGpBTUJnTlZCQWNNQlUxcGJHRnVNU013SVFZRFZRUUtEQnBCWTNSaGJHbHpJRk11Y0M1QkxpOHcKTXpNMU9EVXlNRGsyTnpFbk1DVUdBMVVFQXd3ZVFXTjBZV3hwY3lCQmRYUm9aVzUwYVdOaGRHbHZiaUJTYjI5MApJRU5CTUI0WERURXhNRGt5TWpFeE1qSXdNbG9YRFRNd01Ea3lNakV4TWpJd01sb3dhekVMTUFrR0ExVUVCaE1DClNWUXhEakFNQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdseklGTXVjQzVCTGk4d016TTEKT0RVeU1EazJOekVuTUNVR0ExVUVBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwSUVOQgpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXA4YkVwU21rTE8vbEdNV3dVS052ClVUdWZDbHJKd2tnNENzSWNvQmgva2JXSHVVQS8zUjFvSHdpRDFTMGVpS0Q0ajFhUGJaa0NrcEFXMVY4SWJJblgKNGF5OElNS3g0SU5SaW1sTkFKWmFieS9BUkg2akR1U1J6Vmp1M1B2SEhrVkgzU2U1Q0FHZnBpRWQ5VUV0TDB6OQpLSzNnaXEwaXRGWmxqb1pVajVOREtkNDVSbmlqTUNPNnpmQjlFMWZBWGRLRGEwaE14S3VmZ0ZwYk9yM0pweUkvCmdDY3pXdzYzaWd4ZEJ6Y0l5MnpTZWtjaVJEWEZ6TXd1anQwcTdiZDlaZzFmWVZFaVZSdmpSdVBqUGRBMVlwcmIKcnhUSVc2SE1pUnZoTUNiOG9Kc2ZnYWRISHdUcm96bVNCcCtaMDcvVDZrOVFuQm4rbG9jZVBHWDJveGdrZzRZUQo1MVErcURwMkpFK0JJY1hqRHdMNGs1UkhJTHYrMUE3VGFMbmR4SHFFZ3VOVFZIbmQyNXpTOGdlYkxyYThQdTJGCmJlOGxFZktYR2tKaDkwcVg2SXV4RUFmNlpZR3lvam5QOXp6L0dQdkc4VnFMV2VJQ3JIdVMwRTRVVDFsRjlneGUKS0YrdzZEOUZ6OCt2bTIvN2hOTjNXcFZ2ckpTRW51Njh3RXFQU3BQNFJDSGlNVVZoVUU0UTJPTTFmRXdadE40Rgp2Nk1HbjhpMXplUWYxeGNHRFhxVmRGVU5hQnI4RUJ0aVpKMXQ0SldndzVRSFZ3MFU1cjBGKzdpZjV0K0w0c2JuCmZwYjJVOFdBTkZBb1dQQVNVSEVYTUxybWVHTzg5TEt0bXl1eS91RTVqRjY2Q3lDVTNudUR1UC9qVm8yM0VlazcKalBLeHdWMmRwQXRNSzlteUdQVzFuMHNDQXdFQUFhTmpNR0V3SFFZRFZSME9CQllFRkZMWWlEckluM2htN1luegplemh3bE1rQ0FqYlFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVVXRpSU9zaWZlR2J0CmlmTjdPSENVeVFJQ050QXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQUwKZTNLSHdHQ21TVXlJV09ZZGlQY1VaRWltMkZnS0RrOFROZDgxSGRUdEJqSElnVDVxMWQwN0dqTHVrRDBSMGk3MApqc05qTGlObXNHZStiN2JBRXpsZ3FxSTBKWk4xVXQ2bm5hME9oNGxTY1dvV1BCa2RnL2lhS1dXKzlEK2EyZkR6CldvY2hjWUJOeStBNG16KzcrdUF3VGMrRzAyVVFHUmpSbHdLeEszSkNhS3lndlU1YTJoaS9hNWlCMFAyYXZsNFYKU00wUkZibkFLVnkwNklqM1BqYXV0Mkw5SG1MZWNIZ1FIRWhiMnJ5a09McG43VlUrWGxmZjFBTkFUSUdrMGs5agpwd2xDQ1JUOEFLbkNnSE5QTHNCQTJSRjdTT3A2QXNEVDZ5Z0JKbGgwd2NCekltMlRsZjA1ZmJzcTQvYUM0eXlYClgwNGZrWlQ2L2l5ajJIWWF1RTJ5T0UrYitoMUlZSGttNHZQOXFkQ2E2SENQU1hyVzViMEtEdHN0ODQyLzYrT2sKZmN2SGxYSG8ycU44eGNMNGRKSUVHNGFzcENKVFFMYXMva3gyei91VU1zQTFuM1kvYnVXUWJxQ21KcUs0TEw3UgpLNFg5cDJqSXVnRXJzV3gwSGJoemxlZnV0OGNsOEFCTUFMSit0Z3VMSFBQQVVKNGx1ZUFJM2pabS96ZWwwYnRVClpDekpKN1ZMa241bC85TXQ0YmxPdkgra1FTR1FRWGVtT1IvcW51T2YwR1p2QmV5cWRuNi9heGFnNjdYSC9KSlUKTHlzUkp5VTNlRXhSYXJEenpGaGRGUEZxU0JYL3dnZTJzWTBQamx4UVJyTTl2d0dZVDdKWlZFYytOSHQ0YlZhVApMblBxWmloNHpSMFV2NkNQTHk2NExvN3lGSXJNNmJWOCsyeWRES1hobGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1UcnVzdGlzIExpbWl0ZWQgT1U9VHJ1c3RpcyBGUFMgUm9vdCBDQQojIFN1YmplY3Q6IE89VHJ1c3RpcyBMaW1pdGVkIE9VPVRydXN0aXMgRlBTIFJvb3QgQ0EKIyBMYWJlbDogIlRydXN0aXMgRlBTIFJvb3QgQ0EiCiMgU2VyaWFsOiAzNjA1MzY0MDM3NTM5OTAzNDMwNDcyNDk4ODk3NTU2MzcxMDU1MwojIE1ENSBGaW5nZXJwcmludDogMzA6Yzk6ZTc6MWU6NmI6ZTY6MTQ6ZWI6NjU6YjI6MTY6Njk6MjA6MzE6Njc6NGQKIyBTSEExIEZpbmdlcnByaW50OiAzYjpjMDozODowYjozMzpjMzpmNjphNjowYzo4NjoxNToyMjo5MzpkOTpkZjpmNTo0Yjo4MTpjMDowNAojIFNIQTI1NiBGaW5nZXJwcmludDogYzE6YjQ6ODI6OTk6YWI6YTU6MjA6OGY6ZTk6NjM6MGE6Y2U6NTU6Y2E6Njg6YTA6M2U6ZGE6NWE6NTE6OWM6ODg6MDI6YTA6ZDM6YTY6NzM6YmU6OGY6OGU6NTU6N2QKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURaekNDQWsrZ0F3SUJBZ0lRR3grdHRpRDVKTk0yYS9mSDhZeWdXVEFOQmdrcWhraUc5dzBCQVFVRkFEQkYKTVFzd0NRWURWUVFHRXdKSFFqRVlNQllHQTFVRUNoTVBWSEoxYzNScGN5Qk1hVzFwZEdWa01Sd3dHZ1lEVlFRTApFeE5VY25WemRHbHpJRVpRVXlCU2IyOTBJRU5CTUI0WERUQXpNVEl5TXpFeU1UUXdObG9YRFRJME1ERXlNVEV4Ck16WTFORm93UlRFTE1Ba0dBMVVFQmhNQ1IwSXhHREFXQmdOVkJBb1REMVJ5ZFhOMGFYTWdUR2x0YVhSbFpERWMKTUJvR0ExVUVDeE1UVkhKMWMzUnBjeUJHVUZNZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0VQQURDQ0FRb0NnZ0VCQU1WUWU1NDdOZERmeEl6TmpwdnRvOEEybWZSQzZxYytnSU1QcHFkWmg4bVFSVU4rCkFPcUdlU29EdlQwM21ZbG10K1dLVm9hVG5HaExhQVNNazVNQ1BqRFNOem9pWVlrY2hVNTlqOVd2ZXpYMmZpaEgKaVRIY0RubGtINW5TVzdyK2YyQy9yZXZuUERncGFpL2xrUXRWLyt4dldOVXR5ZDVNWm5HUEROY0UyZ2ZtSGhqagp2U2tDcVBvYzRWdTVnNmhCU0x3YWNZM25ZdVV0c3V2ZmZNL2JxMXJLTWZGTUl2TUZFL2VDK1hONURMN1hTeHpBCjBSVThrMEZrMGVhK0l4Y2lBSWxlSDJ1bHJHNm5TNHp0bzNMbXIyTk5MNFhTRkRXYUxrNk02aktZS0lhaGtRbEIKT3JUaDQvTDY4TWtLb2tIZHFlTUR4NGdWT3h6VUdwVFhuMlJaRW0wQ0F3RUFBYU5UTUZFd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QWZCZ05WSFNNRUdEQVdnQlM2K25FbGVZdFhRU1VoaGd0eDY3SmtEb3NoWnpBZEJnTlZIUTRFCkZnUVV1dnB4SlhtTFYwRWxJWVlMY2V1eVpBNkxJV2N3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUg1WS8vMDEKR1gyY0dFK2VzQ3U4am93VS95eWcya2RidysrQkxhOEY2blJJVy9NK1RnZkhiY1d6azg4aU5WeTJQM1VuWHdtVwp6YUQrdmtBTVhCSlYrSk9DeWlucFhqOVdWNHM0TnZkRkdrd296WjVCdU8xV1RJU2tRTWk0c0tVcmFYQUVhc1A0CjFCSXkrUTdEc2R3eWhFUXNiOHRHRCtwbVFROVA4VmlscGcwTkQySGVwWjVkZldXaFBCZm5xRlZPNzZESDdjWkUKZjFUMW8rQ1A4SHhWSW84cHRvR2o0VzFPTEJ1QVoreXRJSjhNWW1IVmwvOUQ3UzNCMmwwcEtvVS9yR1h1aGc4RgpqWkJmMys2ZjlML3VIZnVZNUgrUUs0UjRFQTVzU1ZQdkZWdGxSa3BkcjdyN09uSWR6ZllsaUI2WHpDR2NLUUVOClpldFgyZk5YbHJ0SXpZRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBTdWJqZWN0OiBDTj1CdXlwYXNzIENsYXNzIDIgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgTGFiZWw6ICJCdXlwYXNzIENsYXNzIDIgUm9vdCBDQSIKIyBTZXJpYWw6IDIKIyBNRDUgRmluZ2VycHJpbnQ6IDQ2OmE3OmQyOmZlOjQ1OmZiOjY0OjVhOmE4OjU5OjkwOjliOjc4OjQ0OjliOjI5CiMgU0hBMSBGaW5nZXJwcmludDogNDk6MGE6NzU6NzQ6ZGU6ODc6MGE6NDc6ZmU6NTg6ZWU6ZjY6Yzc6NmI6ZWI6YzY6MGI6MTI6NDA6OTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDlhOjExOjQwOjI1OjE5OjdjOjViOmI5OjVkOjk0OmU2OjNkOjU1OmNkOjQzOjc5OjA4OjQ3OmI2OjQ2OmIyOjNjOmRmOjExOmFkOmE0OmEwOjBlOmZmOjE1OmZiOjQ4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV1RDQ0EwR2dBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRR0V3Sk9UekVkCk1Cc0dBMVVFQ2d3VVFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hJREFlQmdOVkJBTU1GMEoxZVhCaGMzTWcKUTJ4aGMzTWdNaUJTYjI5MElFTkJNQjRYRFRFd01UQXlOakE0TXpnd00xb1hEVFF3TVRBeU5qQTRNemd3TTFvdwpUakVMTUFrR0ExVUVCaE1DVGs4eEhUQWJCZ05WQkFvTUZFSjFlWEJoYzNNZ1FWTXRPVGd6TVRZek16STNNU0F3CkhnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRElnVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmZIWHZmQkI5UjMrME1oOVBUMWFlVHVNZ0hibzRZZjVGa051dWQxZzFMcgo2aHhoRlVpN0hRZktqSzZ3M0phZDZzTmdrb2FDS0hPY1ZnYi9TMlR3RENvM1NiWGx6d3g4N3ZGS3UzTXdaZlBWCkw0TzJmdVBuOVo2cllQblQ4WjJTZElya0hKYXNXNERwdGZReGg2TlIvTWQrb1crT1UzZlVsOEZWTTVJK0dDOTEKMUsyR1NjdVZyMVFHYk5nR0U0MWIvK0VtR1ZuQUpMcUJjWG1RUkZCb0pKUmZ1TE1SOFNsQllhTkJ5eU0yMWNIeApNbEFRVG4vMGhwUHNoTk9PdkV1L1hBRk9CejNjRklxVUNxVHFjL3NMVWVnVEJ4ajZEdkVyMFZRVmZUemg5N1FaClFtZGlYbmZnb2xYc3R0bHBGOVU2cjBUdFNzV2U1SG9uZk9WMTE2ckxKZWZmYXdyYkQwMlRUcWlnelhzdThsa0IKYXJjTnVBZUJmb3M0R3pqbUNsZVpQZTRoNktQMURCYmRpK3cwanB3cUhBQVZGNDFvZzlKd254Z0l6UkZvMWNscgpVczNFUm8vY3RmUFlWM01lNlpRNUJML1QzampldEZQc2FSeWlmc1NQNUJ0d3JmS2krZnYzRm1SbWFaOUpVYUxpCkZSaG5Ca3AvMVd5MVRiTXo0R0hyWGI3cG1BOHkxeDFMUEM1YUFWS1JDZkxmNm8zWUJrQmpxaEhrL3NNM25oUlMKUC9UaXpQSmhrOUg5WjJ2WFVxNi9hS3RBUTZCWE5WTjQ4RlA0WVVJSFpNYlhiNXRNT0ExanJHS3ZOb3VpY3dvTgo5U0c5ZEtwTjZuSURTZHZIWHgxaVk4ZjkzWkhzTSs3MWJiUnVNR2pleU5ZbXNIVmVlN1FISUppaGRqSzRUV3hQCkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNbUFkK0Jpa29MMVJwenoKdXZkTXc5NjRvNjA1TUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBVTE4aAo5YnF3T2xJNUxKS3diQURKNzg0Zzd3YnlscDdwcEhSL2VoYjh0L1cyK3hVYlA2dW13SEpkRUxGeDdyeFA0NjJzCkEyMHVjUzZ2eE9PdG83ME1FYWUwLzBxeWV4QVFINmRYUWJMQXJ2UXNXZFpIRUlqeklWRXBNTXBnaHE5R3F4M3QKT2x1d2xONUU0MEVJb3NIc0hkYjlUN2JXUjlBVUM4cm15clY3ZDM1QkgxNkR4N2FNT1phd1A1YUJRVzlna09MbworZnNpY2RsOXN6MUd2N1NFcjVBY0Q0OFNhcS92N2g1NnJnSktpaGNyZHY2c1ZJa2tMRTgvdHJLblRveW9rWmY3CktjWjdYQzI1eTJhMnQ2aGJFbEdGdFFsK1luaHcvcWxxWUxZZERua00vY3JxSklCeXc1Yy84bmVyUXlJS3grdTIKRElTQ0xJQnJRWW9Jd091bGE5K1pFc3VLMVY2QURKSGdKZ2cyU01YNk9CRTEveVdETGZKNnY5cjlqdjZseTBVcwpIOFNJVTY1M0R0bWFkc1dPTEIyanV0WHNNcTdBcXF6MzBYcE42OVFINGtqM0lvNndwSjlxem82eXNtRDBveUxRCkkrdVVXbnBwM1ErL1FGZXNhMWxRMmFPWjRXNytqUUY1SnlNVjNwS2Rld2xOV3VkTFNEQmFHT1lLYmVhUDROSzcKNXQ5OGJpR0N3V2c1VGJTWVdHWml6RXFRWHNQNkp3U3hlUlYwbWN5K3JTRGVKbUFjNjFaUnBxUHE1S00vcC85aAozUEZhVFd3eUkwUHVyS2p1N2tvU0NUeGRjY0srZWZyQ2gyZ2RDLzFjYWN3RzBKcDlWSmtxeVRrYUdhOUxLa1B6ClkxMWFXT0l2NHgza3FkYlFDdENldjllQkNmSEp4eVlOckpnV1ZxQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBTdWJqZWN0OiBDTj1CdXlwYXNzIENsYXNzIDMgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgTGFiZWw6ICJCdXlwYXNzIENsYXNzIDMgUm9vdCBDQSIKIyBTZXJpYWw6IDIKIyBNRDUgRmluZ2VycHJpbnQ6IDNkOjNiOjE4OjllOjJjOjY0OjVhOmU4OmQ1Ojg4OmNlOjBlOmY5OjM3OmMyOmVjCiMgU0hBMSBGaW5nZXJwcmludDogZGE6ZmE6Zjc6ZmE6NjY6ODQ6ZWM6MDY6OGY6MTQ6NTA6YmQ6Yzc6YzI6ODE6YTU6YmM6YTk6NjQ6NTcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVkOmY3OmViOmJjOmEyOjdhOjJhOjM4OjRkOjM4OjdiOjdkOjQwOjEwOmM2OjY2OmUyOmVkOmI0Ojg0OjNlOjRjOjI5OmI0OmFlOjFkOjViOjkzOjMyOmU2OmIyOjRkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV1RDQ0EwR2dBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRR0V3Sk9UekVkCk1Cc0dBMVVFQ2d3VVFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hJREFlQmdOVkJBTU1GMEoxZVhCaGMzTWcKUTJ4aGMzTWdNeUJTYjI5MElFTkJNQjRYRFRFd01UQXlOakE0TWpnMU9Gb1hEVFF3TVRBeU5qQTRNamcxT0ZvdwpUakVMTUFrR0ExVUVCaE1DVGs4eEhUQWJCZ05WQkFvTUZFSjFlWEJoYzNNZ1FWTXRPVGd6TVRZek16STNNU0F3CkhnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRE1nVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnSVBBRENDQWdvQ2dnSUJBS1hhQ3BVV1VPT1Y4bDZkZGpFR01ucWI4UkIydUFDYXRWSTJ6U1JIc0o4WQpaTHlhOXZyVmVkaVFZa3dpTDk0NFBkYmdxT2tjTE50NEVlbU9hRkVWY3Nmek00ZmtvRjBMWE9CWEJ5b3c5YzNFCk4zY29UUmlSNXIvVlV2MXhMWEErNThiRWl1UHdLQXYwZHBpaGk0ZFZzam9UL0xjK0p6ZU9JdU9vVHlydllMczkKdHpuRERnRkhtVjBTVDl0RCtsZWg3Zm1kdmhGSEpsc1RtS3RkRm9xd054eFhuVVgvaUpZMnY3dktCM3R2aDJQWAowREpxMWwxc0RQR3piam5pYXpFdU9RQW5GTjQ0d093WlpvWVM2SjF5RmhOa1VzZXBOeHo5Z2pEdGhCZ2Q5SzVjCi8zQVRBT3V4OVRONlM5WlYrQVdOUzJtdzliTW9ObHdVeEZGelRXc0w4VFFIMnhjNTE5d29lMnYxbi9NdXdVOFgKS2hEenpNcm82LzFycXk2YW55MkNiZ1RVVWdHVExUMkcvSDc4Mys5Q0hhWnI3N2tneHZlOW9LZVYvYWZtaVNUWQp6SXcwYk9Jakw5a1NHaUc1VlpGdkM1RjVHUXl0UUlnTGNPSjYwZzdZYUVpN2doTTVFRmpwMkNvSHhoTGJXTnZTCk8xVVFSd1VWWjJKK0dHT21SajhKRGxReVhyOE5Zbm9uNzREbzI5bExCbG8zV2lYUUNCSjMxRzhKVUpjOXlCM0QKMzR4Rk1GYkcwMlNyWnZQQVhwYWN3OFR2dzN4cml6cDVmN05KenozaWlaK2dNRXVGdVp5VUpIbVBmV3VwUldnUApLOUR4Mmh6TGFiaktTV0p0eU5Call0MWdEMWlxajZHOEJhVm1vczhiZHJLRVpMRk1PVkxBTUxyd2pFc0NzTGEzCkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZFZTR6Zi9sYis3NHN1d3YKVGc3NUpiQ09QR3ZETUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBQUNBagpRVFVFa01KQVltRHY0alZNMXorczRqU1F1S0Z2ZHZvV0ZxUklOeXpwa01MeVBQZ0tuOWlCNWJ0YjJpVXNwS2RWCmNTUXk5c2dMOHJ4cStKT3NzZ2ZDWDUvYnpNaUtxcjVxYitGSkVNd3gxNEM3dThqWW9nNWtWK3FpOWNLcE1SWFMKSUdycy9DSUJLTStHdUlBZXFjd1JwVHp5RnJOSG5melNnQ0hFeTlCSGNFR2h5b01aQ0N4dDhsMTNuSW9VRTlRMgpISkx3NVFZMzNLYm1rSnM0ajF4ckcwYUdRMEpmUGdFSFUxUmRaWDMzaW5PaG1sUmFIeWxERkNmQ2hRKzFpSHNhCk81UzNIV0NudFp6bktXbFhXcHVUZWtNd0d3UFhZc2hBcHFyOFpPUksxNUZUQWFnZ2lHNmNYMFM1eTJDQk5PeHYKMDMzYVNGL3J0SkM4TGFrY0M2d2MxYUpvSUlBRTF2eXhqeSs3U2pFTlNvWWM2K0kyS1NiMTJ0akU4blZoejM2dQpkbU5LZWtCbGs0ZjRIb0NNaHVXRzFvOE8vRk1zWU9nV1lScWlQa043elRsZ1ZHcjE4b2ttQVdpRFNLSXo2TWtFCmtiSVJOQkUrNnRCREdSOERrNUFNLzFFOVYvUkJidUhMb0w3cnlXUE5iY3prK0RhcWFKM3R2VjJYY0VRTnRnNDEKM09FTVhidWdVWlRMZmhickVTK2pra1hJVEhIWnZNbVpVbGRHTDFEUHZUVnA5RDBWemdhbExBOCs5b0c2bEx2RAp1NzlsZU5LR2VmOUpPeHFERFBEZWVPekk4azFNR3Q2Q0tmakJXdHJ0N3VZblh1aEYwSjBjVWFob3EwVGowSXRxCjQvZzd1OXhOMTJUeVViN21xcXRhNlRIdUJyeHp2eE5pQ3AvSHVaYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogY2E6ZmI6NDA6YTg6NGU6Mzk6OTI6OGE6MWQ6ZmU6OGU6MmY6YzQ6Mjc6ZWE6ZWYKIyBTSEExIEZpbmdlcnByaW50OiA1NTphNjo3MjozZTpjYjpmMjplYzpjZDpjMzoyMzo3NDo3MDoxOTo5ZDoyYTpiZToxMTplMzo4MTpkMQojIFNIQTI1NiBGaW5nZXJwcmludDogZmQ6NzM6ZGE6ZDM6MWM6NjQ6NGY6ZjE6YjQ6M2I6ZWY6MGM6Y2Q6ZGE6OTY6NzE6MGI6OWM6ZDk6ODc6NWU6Y2E6N2U6MzE6NzA6N2E6ZjM6ZTk6NmQ6NTI6MmI6YmQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXgKS3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZApCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sCll5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdIaGNOTURneE1EQXhNVEF5T1RVMldoY05Nek14TURBeE1qTTEKT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeQphWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwClpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJRE13Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM5ZFpQd1lpSnZKSzdnZW5hc2ZiM1pKTlc0dC96Tgo4RUxnNjNpSVZsNmJtbFFkVFF5Szl0UFBjUFJTdGRpVEJPTkdobkZCU2l2d0tpeFZBOVpJdytBNU9PM3lYRHcvClJMeVRQV0dyVHMwTnZ2QWdKMWdPUkg4RUdvZWwxNVlVTnBEUVNYdWhkZnNhYTNPeCtNNnBDU3p5VTlYREZFUzQKaHFYMml5czUycU16Vk5uNmNocjNJaFVjaUpGcmYyYmx3MnFBc0NUejM0WkZpUDBaZjNXSEh4K3hHd3B6SkZ1NQpaZUFzVk1oZzAyWVhQK0hNVkROemtRSTZwbjk3ZGptaUg1YTJPSzYxeUpOMEhaNjV0T1ZnblM5VzBlRHJYbHRNCkVuQU1iRVFncXhIWTlCbjIwcHhTTitmNnRzSXhPMHJVRkptdHh4cjFYVi82QjdoOERSL1dneDZ6QWdNQkFBR2oKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTMQpBL2QyTzJHQ2FoS3FHRlByQXlHVXYvN095akFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBVmozdmxOVzkybk95CldMNnVrSzJZSjVmK0FiR3dVZ0M0VGVRYklYUWJmc0R1WG1rcUphOWMxaDNhMG5uSjg1Y3A0SWFIM2dSWkQvRloKMUdTRlM1bXZKUVFleVVhcGw5NkNzaHR3bjV6MnIzRXgzWHNGcFN6VHVjcEg5c3J5OXVldHVVZy92QmEzd1czMAo2Z212N1BPMTV3V2VwaDZLVTFIV2s0SE1kSlAydWRxbUpRVjBlVnArUUQ2Q1N5WVJNRzdoUDBISFJ3QTExZlhUCjkxUStnVDNhU1dxYXMrOFFQZWJyYjlISUlrZkx6TThCTVpMWkdPTWl2Z2tlR2o1YXN1UnJERlI2ZlVOT3VJbWwKZTllaVBaYUd6UEltTkMxcWtwMmFHdEF3NGwxT0JMQmZpeUIrZDhFOWxZTFJScG83UEhpNGI2SFFEV1NpZUI0cApUcFBEcEZRVVd3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EgTz1BUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzCiMgU3ViamVjdDogQ049RUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSBPPUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMKIyBMYWJlbDogIkVFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EiCiMgU2VyaWFsOiAxMTIzMjQ4Mjg2NzYyMDAyOTE4NzE5MjY0MzE4ODg0OTQ5NDU4NjYKIyBNRDUgRmluZ2VycHJpbnQ6IDQzOjVlOjg4OmQ0OjdkOjFhOjRhOjdlOmZkOjg0OjJlOjUyOmViOjAxOmQ0OjZmCiMgU0hBMSBGaW5nZXJwcmludDogYzk6YTg6Yjk6ZTc6NTU6ODA6NWU6NTg6ZTM6NTM6Nzc6YTc6MjU6ZWI6YWY6YzM6N2I6Mjc6Y2M6ZDcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNlOjg0OmJhOjQzOjQyOjkwOjg1OjE2OmU3Ojc1OjczOmMwOjk5OjJmOjA5Ojc5OmNhOjA4OjRlOjQ2Ojg1OjY4OjFmOmYxOjk1OmNjOmJhOjhhOjIyOjliOjhhOjc2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQXpDQ0F1dWdBd0lCQWdJUVZJRDVvSFB0UHdCTXlvblk0M0htU2pBTkJna3Foa2lHOXcwQkFRVUZBREIxCk1Rc3dDUVlEVlFRR0V3SkZSVEVpTUNBR0ExVUVDZ3daUVZNZ1UyVnlkR2xtYVhSelpXVnlhVzFwYzJ0bGMydDEKY3pFb01DWUdBMVVFQXd3ZlJVVWdRMlZ5ZEdsbWFXTmhkR2x2YmlCRFpXNTBjbVVnVW05dmRDQkRRVEVZTUJZRwpDU3FHU0liM0RRRUpBUllKY0d0cFFITnJMbVZsTUNJWUR6SXdNVEF4TURNd01UQXhNRE13V2hnUE1qQXpNREV5Ck1UY3lNelU1TlRsYU1IVXhDekFKQmdOVkJBWVRBa1ZGTVNJd0lBWURWUVFLREJsQlV5QlRaWEowYVdacGRITmwKWlhKcGJXbHphMlZ6YTNWek1TZ3dKZ1lEVlFRRERCOUZSU0JEWlhKMGFXWnBZMkYwYVc5dUlFTmxiblJ5WlNCUwpiMjkwSUVOQk1SZ3dGZ1lKS29aSWh2Y05BUWtCRmdsd2EybEFjMnN1WldVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCCkFRVUFBNElCRHdBd2dnRUtBb0lCQVFESUlNRHM0TVZMcXdkNGxmTkU3dnNMRFA5MGptRzdzV0xxSTlpcm9XVXkKZXV1T0YwK1cyQXA3a2FKamJNZU1UQzU1djZrRi9HbGNsWTFpK2JsdzdjTlJmZENUNW16ck1Fdmh2SDIvVXB2TwpibnRsOGppeHdLSXk3Mkt5YU9CaFU4RTJsZi9zbExvMnJwd2NweklQNVh5MHhtOTAvWHNZNkt4WDdRWWdTekl3CldGdjl6YWptb2Z4d3ZJNlNjOXVYcDN3aHJqM0I5VWlIYkNlOW55VjBnVld3OTNYMlBhUmthOVpQNTg1QXJRL2QKTXRPOGloSlRtTW1KK3hBZFRYN05maDlXRFNGd2hmWWdneC8ydWg4RWorcDNpRFhFLytwT29ZdE5QMk1iUk1ORQoxQ1YyeXJlTjF4NUtabVROWE1XY2crSENDSWlhN0U2ajhUNGNMTmxzSGFGTEFnTUJBQUdqZ1lvd2dZY3dEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQkx5V2o3cVZoeS8KelFhczhmRWx5YWxMMUJTWk1FVUdBMVVkSlFRK01Ed0dDQ3NHQVFVRkJ3TUNCZ2dyQmdFRkJRY0RBUVlJS3dZQgpCUVVIQXdNR0NDc0dBUVVGQndNRUJnZ3JCZ0VGQlFjRENBWUlLd1lCQlFVSEF3a3dEUVlKS29aSWh2Y05BUUVGCkJRQURnZ0VCQUh2MjVNQU5xaGxIdDAxWG8vNnR1N0ZxMVErZTIrUmp4WTZoVUZhVGxyZzR3Q1FpWnJ4VEZHR1YKdjlESEtwWTVQMzBvc3hCQUlXckVyN0JTZHhqaGx0aFdYZVBkTmw0ZHAxQlVvTVVxNUtxTWxJcFBuVFgvZHFRRwpFNUdpb24wQVJEOVYwNEk4R3RWYnZGWk1JaTVHUTRva1FDM3pFcmc3Y0Jxa2xya2FyNGRCR21vWURRWlB4ejV1CnVTbE5EVW1KRVljeVcrWkxCTWprWE9aMGM1UmRGcGdUbGY3NzI3RkU1VHB3ckRkcjVyTXpjaWpKczFlZzlnSVcKaUFZTHRxWkxJQ2pVM2oyTHJUY0ZVM1QrYnN5OFF4ZHhYdm5GekJxcFllNzNkZ3p6Y3ZSeXJjOXlBallIUjgvdgpHVkNKWU16cEpKVVB3c3NkOG05MmtNZk1kY0dXeFowPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5IE89RC1UcnVzdCBHbWJICiMgU3ViamVjdDogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5IE89RC1UcnVzdCBHbWJICiMgTGFiZWw6ICJELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkiCiMgU2VyaWFsOiA2MjM2MDMKIyBNRDUgRmluZ2VycHJpbnQ6IGNkOmUwOjI1OjY5OjhkOjQ3OmFjOjljOjg5OjM1OjkwOmY3OmZkOjUxOjNkOjJmCiMgU0hBMSBGaW5nZXJwcmludDogNTg6ZTg6YWI6YjA6MzY6MTU6MzM6ZmI6ODA6Zjc6OWI6MWI6NmQ6Mjk6ZDM6ZmY6OGQ6NWY6MDA6ZjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ5OmU3OmE0OjQyOmFjOmYwOmVhOjYyOjg3OjA1OjAwOjU0OmI1OjI1OjY0OmI2OjUwOmU0OmY0OjllOjQyOmUzOjQ4OmQ2OmFhOjM4OmUwOjM5OmU5OjU3OmIxOmMxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTXpDQ0F4dWdBd0lCQWdJRENZUHpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1FMHhDekFKQmdOVkJBWVRBa1JGCk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4SnpBbEJnTlZCQU1NSGtRdFZGSlZVMVFnVW05dmRDQkQKYkdGemN5QXpJRU5CSURJZ01qQXdPVEFlRncwd09URXhNRFV3T0RNMU5UaGFGdzB5T1RFeE1EVXdPRE0xTlRoYQpNRTB4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4SnpBbEJnTlZCQU1NCkhrUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ01qQXdPVENDQVNJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnRVBBRENDQVFvQ2dnRUJBTk95U3M5NlIrOTFteVA2T2kvV1VFV0pOVHJHYTl2KzJ3Qm9xT0FERVIwMwpVQWlmVFVwb2xEV3pVOUdVWTZjZ1ZxL2VVWGpzS2ozelNFaFFQZ3JmUmxXTEoyM0RFRTBOa1ZKRDJJZmdYVTQyCnRTSEtYemxBQkY5YmZzeWp4aXVwUUI3Wk5vVFdTUE9TSGpSR0lDVEJwRkdPU2hydlVEOXBYUmwvUmNQSEFZOVIKeVNQb2NxNjB2RllKZnhMTEhMR3ZLWkFLeVZYTUQ5TzBHdTFITlZwSzdaeHpCQ0hRcXIwTUU3VUF5aVpzeEdzTQpsRnFWbE5wUW12SC9wU3RtTWFUSk9LRGZIUis0Q1M3enAraG5VcXVWSCtCR1B0aWt3OHBheFRHQTZFaWFuNVJwCi9obmQySE44Z2NxVzNvN3RzeklGWllRMDV1YjlWeEMxWDNhL0w3QVFEY1VDQXdFQUFhT0NBUm93Z2dFV01BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGUDNhRk1TZk1ONGh2UjVDT2Z5cll5Tko0UEdFTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpDQjB3WURWUjBmQklITE1JSElNSUdBb0g2Z2ZJWjZiR1JoY0RvdkwyUnBjbVZqCmRHOXllUzVrTFhSeWRYTjBMbTVsZEM5RFRqMUVMVlJTVlZOVUpUSXdVbTl2ZENVeU1FTnNZWE56SlRJd015VXkKTUVOQkpUSXdNaVV5TURJd01Ea3NUejFFTFZSeWRYTjBKVEl3UjIxaVNDeERQVVJGUDJObGNuUnBabWxqWVhSbApjbVYyYjJOaGRHbHZibXhwYzNRd1E2QkJvRCtHUFdoMGRIQTZMeTkzZDNjdVpDMTBjblZ6ZEM1dVpYUXZZM0pzCkwyUXRkSEoxYzNSZmNtOXZkRjlqYkdGemMxOHpYMk5oWHpKZk1qQXdPUzVqY213d0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnRUJBSCtYMnpESTM2U2NmU0Y2Z0hET0ZCSnBpQlNWWUVRQnJMTHBNRStiVU1KbTJINk5NTFZ3TWVuaQphY2Z6Y05zZ0ZZYlFEZkMrckFGMWhNNStuMDIvdDJBN25QUEtIZUplYU5pam5aZmxRR0RTTmlIKzBMUzRGOXAwCm8zL1UzN0NZQXF4dmEyc3NKU1J5b1dYdUpWcmw1akxuOHQrclNmcnprR2tqMndUWjUxeFkvR1hVbDc3TS9DNEsKekNVcU5RVDRZSkVWZFQxQi95TWZHY2hzNjRKVEJLYmtUQ0pOall5NnpsdHo3R1JVVUczUm5GWDdhY00ydzR5OApQSVdtYXdvbURlQ1RtR0N1ZnNZa2w0cGhYNUdPWnBJSmh6Yk5pNXN0UHZaUjFGRFVXU2k5Zy9MTUtIdFRobTNZCkpvaHcxK3FSelQ2NXlzQ1FibHJHWG5SbDExeitvK0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBTdWJqZWN0OiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBMYWJlbDogIkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSIKIyBTZXJpYWw6IDYyMzYwNAojIE1ENSBGaW5nZXJwcmludDogYWE6YzY6NDM6MmM6NWU6MmQ6Y2Q6YzQ6MzQ6YzA6NTA6NGY6MTE6MDI6NGY6YjYKIyBTSEExIEZpbmdlcnByaW50OiA5NjpjOToxYjowYjo5NTpiNDoxMDo5ODo0MjpmYTpkMDpkODoyMjo3OTpmZTo2MDpmYTpiOToxNjo4MwojIFNIQTI1NiBGaW5nZXJwcmludDogZWU6YzU6NDk6NmI6OTg6OGM6ZTk6ODY6MjU6Yjk6MzQ6MDk6MmU6ZWM6Mjk6MDg6YmU6ZDA6YjA6ZjM6MTY6YzI6ZDQ6NzM6MGM6ODQ6ZWE6ZjE6ZjM6ZDM6NDg6ODEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVRekNDQXl1Z0F3SUJBZ0lEQ1lQME1BMEdDU3FHU0liM0RRRUJDd1VBTUZBeEN6QUpCZ05WQkFZVEFrUkYKTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRApiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXdPVEFlRncwd09URXhNRFV3T0RVd05EWmFGdzB5T1RFeE1EVXdPRFV3Ck5EWmFNRkF4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4S2pBb0JnTlYKQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ1JWWWdNakF3T1RDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpueGhEUnd1aSszTUtDT3ZYd0V6NzVpdkpuOWdwZlNlZ3BuCmxqZ0o5aEJPbFNKem1ZM2FGUzNuQmZ3WmN5SzNqcGdBdkR3OXJLRnMrOVo1SlV1dDhNeGsyb2crS2JnUENkTTAKM1RQMVl0SGh6Um5wN2hoUFRGaXU0aDdXREZzVld0ZzZ1TVFZWkI3ak03SzFpWGRPREwvWmxHc1RsMjhTby82WgpxUVRNRmV4Z2FEYnRDSHUzOWIrVDdXWXhnNHpHY1RTSFRoZnFyNHVSalJ4V1FhNGlOMTQzOGgzWjBTME5MMmxSCnA3NW1wb282S3IzSEdySGhGUEMrT2gyNXoxdXhhdjYwc1VZZ292c2VPM0R2azVoOWpIT1c4c1h2aFhDdEtTYjgKSGdRK0hLRFlEOHRTZzJKODdvdFRsWkNwVjZMcVlRWFkrVTNFSi9wdXJlMzUxMUgzYTZVQ0F3RUFBYU9DQVNRdwpnZ0VnTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5PVWlreGlFeW9aTHN5dmNvcDlOdGVhCkhOeG5NQTRHQTFVZER3RUIvd1FFQXdJQkJqQ0IzUVlEVlIwZkJJSFZNSUhTTUlHSG9JR0VvSUdCaG45c1pHRncKT2k4dlpHbHlaV04wYjNKNUxtUXRkSEoxYzNRdWJtVjBMME5PUFVRdFZGSlZVMVFsTWpCU2IyOTBKVEl3UTJ4aApjM01sTWpBekpUSXdRMEVsTWpBeUpUSXdSVllsTWpBeU1EQTVMRTg5UkMxVWNuVnpkQ1V5TUVkdFlrZ3NRejFFClJUOWpaWEowYVdacFkyRjBaWEpsZG05allYUnBiMjVzYVhOME1FYWdSS0JDaGtCb2RIUndPaTh2ZDNkM0xtUXQKZEhKMWMzUXVibVYwTDJOeWJDOWtMWFJ5ZFhOMFgzSnZiM1JmWTJ4aGMzTmZNMTlqWVY4eVgyVjJYekl3TURrdQpZM0pzTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBMDdYdGFQS1NVaU84YUVYVUhMN1ArUFBvZVVTYnJoL1lwCjN1RHgxTVlrQ2VuQnoxVWJ0RERaemhyK0JsR21GYVF0NzdKTHZ5QW9KVW5ScGpaM05PaGszMUt4RWNkemVzMDUKbnNLdGpIRWg4bHBycjk4OFRsV3Zzb1JsRkltNWQ4c3FNYjdQbzIzUGIwaVVNa1p2NTNHTW9LYUVHVGNIOGdORgpDU3VHZFh6ZlgybFhBTnR1MktaeUlrdFExSFdZVnQrM0dQOURRMUN1ZWtSNzhIbFIxME05cDlPQjAvREpUN25hCnhwZUcwSUxENUVKdC9yRGlaRTRPSnVkQU5DYTFDSW5YQ0dOak9DZDFIalBxYnFqZG41bFBkRTJCaVlCTDNacVgKS1Z3dnZvRkJ1WXovNm4xZ0JwN04xejNUTHFNVnZLam1KdVZ2dzl5NEF5SHFueGJ4TEZTMQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q0EgRGlzaWcgUm9vdCBSMiBPPURpc2lnIGEucy4KIyBTdWJqZWN0OiBDTj1DQSBEaXNpZyBSb290IFIyIE89RGlzaWcgYS5zLgojIExhYmVsOiAiQ0EgRGlzaWcgUm9vdCBSMiIKIyBTZXJpYWw6IDEwNTcyMzUwNjAyMzkzMzM4MjExCiMgTUQ1IEZpbmdlcnByaW50OiAyNjowMTpmYjpkODoyNzphNzoxNzo5YTo0NTo1NDozODoxYTo0MzowMTozYjowMwojIFNIQTEgRmluZ2VycHJpbnQ6IGI1OjYxOmViOmVhOmE0OmRlOmU0OjI1OjRiOjY5OjFhOjk4OmE1OjU3OjQ3OmMyOjM0OmM3OmQ5OjcxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMjozZDo0YTowMzo2ZDo3Yjo3MDplOTpmNTo5NTpiMTo0MjoyMDo3OTpkMjpiOToxZTpkZjpiYjoxZjpiNjo1MTphMDo2MzozZTphYTo4YTo5ZDpjNTpmODowNzowMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmFUQ0NBMUdnQXdJQkFnSUpBSks0aU51d2lzRmpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GSXhDekFKQmdOVgpCQVlUQWxOTE1STXdFUVlEVlFRSEV3cENjbUYwYVhOc1lYWmhNUk13RVFZRFZRUUtFd3BFYVhOcFp5QmhMbk11Ck1Sa3dGd1lEVlFRREV4QkRRU0JFYVhOcFp5QlNiMjkwSUZJeU1CNFhEVEV5TURjeE9UQTVNVFV6TUZvWERUUXkKTURjeE9UQTVNVFV6TUZvd1VqRUxNQWtHQTFVRUJoTUNVMHN4RXpBUkJnTlZCQWNUQ2tKeVlYUnBjMnhoZG1FeApFekFSQmdOVkJBb1RDa1JwYzJsbklHRXVjeTR4R1RBWEJnTlZCQU1URUVOQklFUnBjMmxuSUZKdmIzUWdVakl3CmdnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNpbzhRQUNkYUZYUzF0RlBiQ3czT2UKTmNKeFZYNkIrNnRHVU9EQmZFbDQ1cXQ1V0R6YS8zd2NuOWlYQW5nK2EwRUU2VUc5dmdNc1JmWXZaTlNyWGFOSApQV1NiNldpYXhzd2JQN3Erc29zMEFpNllWUm44akcrcVg5cE16azBESWFQWTBqU1RWcGJMVEF3QUZqeGZHczNJCngyeW1yZE14cDd6bzVlRm0xdEw3QTdSQlpja1FyZzRGWThhQWFta3cvZEx1a084Tko5K2ZsWFAwNFNYYWJCYmUKUVRnMDZvdjgwZWdFRkdFdFFYNnN4M2RPeTFGVSsxNlNHQnNFV21qR3ljVDZ0eE9nbUxjUks3ZldWOHg4bmhmUgp5eVgraGs0a0xsWU1lRTJlQVJLbUs2Y0JaVzU4WWgyRWhOL3F3R3UxcFNxVmc4TlRFUXh6SFF1eVJwRFJRanJPClFHNlZyZi9HbEsxdWw0U09mVytlaW9BTlNXMXo0bnVTSHNQendmUHJMZ1Z2MlJ2UE4zWUV5TFJhNUJlbnk5MTIKSDlBWmR1Z3NCYlBXbkRUWWx0eGhoNUVGNUVRSU04SGF1UWhsMUs2eU5nM3J1amk2RE9XYm51dU5adDJaejlhSgpRZllFa29vcEtXMXJPaHpuZFgwQ2NRN3p3T2U5eXhuZG5XQ3l3bVpndHJFRTdzbm1ocm1hWmtDbzV4SHRnVVVECmkvWm5XZWpCQmhHOTNjK0FBazlsUUhoY1IxREltK1lmZ1h2a1JLaGJoWnJpM2xyVngvazZSR1pMNURKVWZPUnMKbkxNT1BSZWlzalFTMW42eXFFbTcwWG9vUUw2aUZoL2Y1RGNmRVhQN2tBcGxRNklOZlBnR0FWVXpmYkFOdVBUMQpycVZDVjN3MkVZeDdYc1FEbll4NW5RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkCkR3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV0Wm40cjdDVTllTWcxZ3F0ems1V3BDNXVRdTB3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFDWUdYbkRuWlRQSWdtN1puQmM2RzNwbXNnSDJlRHRwWGkvcS8wNzVLTU9ZS21GTQp0Q1FTaW4xdEVSVDNuTFhLNXJ5ZUo0NU1HY2lwdlhyQTF6WU9iWVZ5YnFqR29tMzIrbk5qZjd4dWVRZ2NuWXFmCkdvcFRwdGk3MlRWVnNSSEZxUU96Vmp1NWhKTWlYbjdCOWhKU2krb3NaN3orTmt6MXVNL1JzMG1TTzlNcERwa2IKbHZkaHVEdkVLN1o0YkxRamIvRDkwN0plZFIrWmxhaXM5dHJoeFRGNys5RkdzOUs4WjdSaVZMb0o5Mk93azZLYQorZWxTTG90Z0Vxdjg5V0JXN3hCY2k4UWFRdHlEVzJRT3k3Vzgxay9CZkR4dWpSTnQrM3ZyTU5EY1RhL0YxYmFsClRGdHh5ZWd4dnVnNEJraWhHdUxxMHQ0U09WZ2EvNEFPZ25YbXQ4a0hiQTd2L3pqeG1ISEV0MzhPRmRBbGFiMGkKblN2dEJmWkdSNnp0d1BEVU8rTHM3cFpia0JOT0hsWTY2N0R2bHJ1V0l4RzY4a09HZEdTVnlDaDEzeDAxdXRJMwpnemhUT0RZN3oyenArV3NPMFBzRTZFOTMxMlVCZUlZTWVqNGhZdkYvWTNFTXlaOUUyNmdub25XK2JvRSsxOERyCkc1Z1BjRncwc29yTXdJVVk2MjU2cy9kYW9RZS9xVUtTODJBaWwrUVVvUWViVG5iQWpuMzlwQ1hIUiszL0gzT3MKek1PbDZXOEtqcHRsd2xDRnRhT2dVeExNVllkaDg0R3VFRVpodlVRaHVNSTlkTTkrSkRYNkhBY09tejBpeXU4eApMNHlzRXIzdlFDajhLV2Vmc2hOUFppVEVVeG5wSGlrVjcrWnRzSDh0Wi8zemJCdDFScVBsU2hmcHBOY0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFDQ1ZSQUlaMSBPPUFDQ1YgT1U9UEtJQUNDVgojIFN1YmplY3Q6IENOPUFDQ1ZSQUlaMSBPPUFDQ1YgT1U9UEtJQUNDVgojIExhYmVsOiAiQUNDVlJBSVoxIgojIFNlcmlhbDogNjgyODUwMzM4NDc0ODY5NjgwMAojIE1ENSBGaW5nZXJwcmludDogZDA6YTA6NWE6ZWU6MDU6YjY6MDk6OTQ6MjE6YTE6N2Q6ZjE6YjI6Mjk6ODI6MDIKIyBTSEExIEZpbmdlcnByaW50OiA5MzowNTo3YTo4ODoxNTpjNjo0ZjpjZTo4ODoyZjpmYTo5MToxNjo1MjoyODo3ODpiYzo1Mzo2NDoxNwojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6NmU6YzA6MTI6ZTE6YTc6ZGE6OWQ6YmU6MzQ6MTk6NGQ6NDc6OGE6ZDc6YzA6ZGI6MTg6MjI6ZmI6MDc6MWQ6ZjE6Mjk6ODE6NDk6NmU6ZDE6MDQ6Mzg6NDE6MTMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUgwekNDQmJ1Z0F3SUJBZ0lJWHNPM3BrTi9wT0F3RFFZSktvWklodmNOQVFFRkJRQXdRakVTTUJBR0ExVUUKQXd3SlFVTkRWbEpCU1ZveE1SQXdEZ1lEVlFRTERBZFFTMGxCUTBOV01RMHdDd1lEVlFRS0RBUkJRME5XTVFzdwpDUVlEVlFRR0V3SkZVekFlRncweE1UQTFNRFV3T1RNM016ZGFGdzB6TURFeU16RXdPVE0zTXpkYU1FSXhFakFRCkJnTlZCQU1NQ1VGRFExWlNRVWxhTVRFUU1BNEdBMVVFQ3d3SFVFdEpRVU5EVmpFTk1Bc0dBMVVFQ2d3RVFVTkQKVmpFTE1Ba0dBMVVFQmhNQ1JWTXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDYgpxYXUvWVVxWHJ5K1hacHAwWDlEWmx2M1A0dVJtN3g4ZlJ6UENSS1BmbXQ0ZnRWVGRGWHhwTlJGdnU4Z01qbW9ZCkh0aVAyUmE4RUVnMlhQQmpzNUJhWENRMzE2UFd5d2x4dWZFQmNvU3dmZHROZ00zODAyL0orTnEyRG9MU1JZV28KRzJpb1BlajBSR3k5b2NMTEE3Nk1QaE1BaE45S1NNRGpJZ3JvNlRlbkdFeXhDUTBqVm44RVRka1hoQmlseU5wQQpsSFByemc1WFBBT0JPcDBLb1ZkRGFheFhiWG1RZU9XMXREdll2RXlOS0tHbm82ZTZBazRsMFNxdTdhNERJcmhyCklBOHdLRlNWZitEdXpncG1uZEZBTFc0aXI1MGF3UVVaMG0vQThwLzRlN01DUXZ0UXFSMHRrdzhqcThiQkQ1TC8KMEtJVjlWTUpjUnovUlJPRTVpWmUrT0NJSEFyOEZyYW9jd2E0OEdPRUFxREdXdXpuZE45d3JxT0RKZXJXeDVlSAprNmZHaW9vemwyQTNFRDZYUG00cEZkYWhEOUdJTEJLZmI2cWt4a0xyUWFMamxVUFRBWVZ0anJzNzh5TTJ4LzQ3CjRLRWxCMGlyeVlsMC93aVBnTC9BbG1Yejd1eExhTDJkaU1NeHMwRHg2TS8yT0x1YzVORi8xT1ZZbTN6NjFQTU8KbTNXUjVMcFNMaGwrMGZYTldobjh1Z2IyKzFLb1M1a0UzZmo1dEl0UW8wNWlpZkNISlBxRFFzR0grdFV0S1NwYQpjWHBrYXRjbllHTU4yODVKOVkwZmtJa3lGL2h6UTdqU1dwT0dZZGJoZFFycWVXWjJpRTl4NndRbDFncGFlcFBsCnVVc1hRQSt4dHJuMTNrL2M0TE9zT3hGd1lJUktRMjZaSU1BcGNRckFaUUlEQVFBQm80SUN5ekNDQXNjd2ZRWUkKS3dZQkJRVUhBUUVFY1RCdk1Fd0dDQ3NHQVFVRkJ6QUNoa0JvZEhSd09pOHZkM2QzTG1GalkzWXVaWE12Wm1scwpaV0ZrYldsdUwwRnlZMmhwZG05ekwyTmxjblJwWm1sallXUnZjeTl5WVdsNllXTmpkakV1WTNKME1COEdDQ3NHCkFRVUZCekFCaGhOb2RIUndPaTh2YjJOemNDNWhZMk4yTG1Wek1CMEdBMVVkRGdRV0JCVFNoN1RqM3pjbmsxWDIKVnVxQjVUYk1qQjQvdlRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOS0h0T1BmTnllVApWZlpXNm9IbE5zeU1Iais5TUlJQmN3WURWUjBnQklJQmFqQ0NBV1l3Z2dGaUJnUlZIU0FBTUlJQldEQ0NBU0lHCkNDc0dBUVVGQndJQ01JSUJGQjZDQVJBQVFRQjFBSFFBYndCeUFHa0FaQUJoQUdRQUlBQmtBR1VBSUFCREFHVUEKY2dCMEFHa0FaZ0JwQUdNQVlRQmpBR2tBOHdCdUFDQUFVZ0JoQU8wQWVnQWdBR1FBWlFBZ0FHd0FZUUFnQUVFQQpRd0JEQUZZQUlBQW9BRUVBWndCbEFHNEFZd0JwQUdFQUlBQmtBR1VBSUFCVUFHVUFZd0J1QUc4QWJBQnZBR2NBCjdRQmhBQ0FBZVFBZ0FFTUFaUUJ5QUhRQWFRQm1BR2tBWXdCaEFHTUFhUUR6QUc0QUlBQkZBR3dBWlFCakFIUUEKY2dEekFHNEFhUUJqQUdFQUxBQWdBRU1BU1FCR0FDQUFVUUEwQURZQU1BQXhBREVBTlFBMkFFVUFLUUF1QUNBQQpRd0JRQUZNQUlBQmxBRzRBSUFCb0FIUUFkQUJ3QURvQUx3QXZBSGNBZHdCM0FDNEFZUUJqQUdNQWRnQXVBR1VBCmN6QXdCZ2dyQmdFRkJRY0NBUllrYUhSMGNEb3ZMM2QzZHk1aFkyTjJMbVZ6TDJ4bFoybHpiR0ZqYVc5dVgyTXUKYUhSdE1GVUdBMVVkSHdST01Fd3dTcUJJb0VhR1JHaDBkSEE2THk5M2QzY3VZV05qZGk1bGN5OW1hV3hsWVdSdAphVzR2UVhKamFHbDJiM012WTJWeWRHbG1hV05oWkc5ekwzSmhhWHBoWTJOMk1WOWtaWEl1WTNKc01BNEdBMVVkCkR3RUIvd1FFQXdJQkJqQVhCZ05WSFJFRUVEQU9nUXhoWTJOMlFHRmpZM1l1WlhNd0RRWUpLb1pJaHZjTkFRRUYKQlFBRGdnSUJBSmN4QXAvbi9VTm5TRVFVNUNtSDdVd29adENQTmRwTlliZEtsMDIxMjVEZ0JTNE94bm5ROHBkcApENzBFUjltKzI3VXAycHZacnFtWjFkTThNSlAxamFHby9BYU5SUFRLRnBWOE05eGlpNmczK0NmWUNTMGI3OGdVCkp5Q3BaRVQvTHRaMXFteE5ZRUFaU1VOVVk5cml6THBtNVU5RWVsdlphb0VyUU5WLytRRW5XQ3pJN1VpUmZEK20KQU0vRUtYTVJOdDZHR1Q2ZDdobUtHOVd3N1k0OW5DckFEZGc5WnVNOERiM1ZsRnppNHFjMUd3UUE5ajlhamVwRAp2VitKSGFuQnNNeVo0azBBQ3RySkoxdm5FNUJjNVBVem9sVnQzT0FKVFMreEpsc25kUUFKeEdKM0tRaGZubG1zCnRuNnRuMVF3SWdQQkhuRmsvdms0Q3BZWTNRSVVyQ1BMQmh3ZXBIMk5EZDRuUWVpdDJoVzNzQ1BkSzZqVDJpV0gKN2VoVlJFMkk5RForaEpwNHJQY09Wa2tPMWpNbDFvUlFRbXdnRWgwcTFiNjg4bkNCcEhCZ3ZnVzFtNTRFUkw1aApJNnpwcFNTTUVZQ1VXcUtpdVVuU3dkelJwKzB4RVN5ZUdhYnU0Vlhod09yUERZVGtGN2VpZktYZVZTVUc3c3pBCmgxeEEyc3lWUDFYZ05jZTRoTDYwWGMxNmd3Rnk3b2ZtWHgydXRZWEdKdC9td1pycEhnSkhueXFvYmFsYnoreEYKZDMrWUo1b3lYU3JqaE83Rm1HWXZsaUFkM2RqREo5ZXcrZjdaZmMzUW40OExGRmhSbnkrTHd6Z3QzdWlQMW8ySApwUFZXUXhhWkxQU2tWclEwdUdFM3ljSllnQnVnbDZIOFdZM3BFZmJSRDB0Vk5FWXFpNFk3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UV0NBIEdsb2JhbCBSb290IENBIE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1UV0NBIEdsb2JhbCBSb290IENBIE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBMYWJlbDogIlRXQ0EgR2xvYmFsIFJvb3QgQ0EiCiMgU2VyaWFsOiAzMjYyCiMgTUQ1IEZpbmdlcnByaW50OiBmOTowMzo3ZTpjZjplNjo5ZTozYzo3Mzo3YToyYTo5MDowNzo2OTpmZjoyYjo5NgojIFNIQTEgRmluZ2VycHJpbnQ6IDljOmJiOjQ4OjUzOmY2OmE0OmY2OmQzOjUyOmE0OmU4OjMyOjUyOjU1OjYwOjEzOmY1OmFkOmFmOjY1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1OTo3Njo5MDowNzpmNzo2ODo1ZDowZjpjZDo1MDo4NzoyZjo5Zjo5NTpkNTo3NTo1YTo1YjoyYjo0NTo3ZDo4MTpmMzo2OToyYjo2MTowYTo5ODo2NzoyZjowZToxYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSUNETDR3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrR0ExVUVCaE1DVkZjeApFakFRQmdOVkJBb1RDVlJCU1ZkQlRpMURRVEVRTUE0R0ExVUVDeE1IVW05dmRDQkRRVEVjTUJvR0ExVUVBeE1UClZGZERRU0JIYkc5aVlXd2dVbTl2ZENCRFFUQWVGdzB4TWpBMk1qY3dOakk0TXpOYUZ3MHpNREV5TXpFeE5UVTUKTlRsYU1GRXhDekFKQmdOVkJBWVRBbFJYTVJJd0VBWURWUVFLRXdsVVFVbFhRVTR0UTBFeEVEQU9CZ05WQkFzVApCMUp2YjNRZ1EwRXhIREFhQmdOVkJBTVRFMVJYUTBFZ1IyeHZZbUZzSUZKdmIzUWdRMEV3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN3QmR2STY0ekVib29oNzQ1Tm5IRUtIMUp3N1cyQ25KZkYKMTB4T1JVbkxRRUsxRWpSc0djSjBwREZmaFFLWDdFTXpDbFBTbkl5T3Q3aDUyeXZWYXZLT1pzVHVLd0VIa3RTegowQUxmVVBaVnIyWU95K0JIWUM4ck1qazFVam9vZy9oN0ZzWVl1R0xXUnlXUnp2QVpFazJ0WS9YVFAzVmZLZkNoCk1Cd3FvSmltRmIzdS9SazI4T0tSUTQvNnl0WVFKMGxNNzkzQjhZVndtOHJxcUZwRC9HMkdiM1BwTjBXcDhEYkgKekloMUhydHNCditiYXo0WDdHR3FjWHpHSGFMM1Nla1Z0VHpXb1dIMUVmY0ZieDM5RWI3UU1BZkNLYkFKVGliYwo0Nktva1dvZndwRkZpRnpsbUxoeHBSVVp5WHgxRWN4d2RFOHRteDJSUlAxV0tLRCt1NFpxeVBwY0MxamN4a3QyCnlLc2kyWE1QcGZSYUFvay9UNTRpZ3U2aWRGTXFQVk1uYVIxc2pqSXNaQUFtWTJFMlRxTkd0ejk5c3kyc2JaQ2kKbGFMT3o5cUM1d2MwR1picHVDR3FLWDZtT0w2T0tVb2habmtmczhPMUNXZmUxdFFIUnZNcTJ1WWlOMkRMZ2JZUApvQS9weUpWL3YxV1JCWHJQUFJYQWI5NEpsQUdEMXpRYnpFQ2w4TGliWjlXWWtUdW5oSGlWSnFSYUNQZ3JkTFFBCkJEemZ1QlNPNk4rcGpXeG5rak1kd0xmUzdKTEl2Z20vTENrRmJ3SnJudSs4dnlxOFc4QlFqMEZ3Y1lleVRiY0UKcVlTak1xK3U3bXNYaTdLeC9temhrSXlJcUpkSXpzaE55L01HejE5cUNrS3hIaDUzTDQ2ZzVwSU9CdndGSXRJbQo0VEZSZlRMY0R3SURBUUFCb3lNd0lUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFYelNCZHUrV0hkWGx0ZGtDWTRRV3dhNmdjRkduOTB4SE5jZ0wKMXlnOWlYSFpxak5CNmhRYmJDRUF3R3hDR1g2ZmFWc2dRdCtpMHRyRWZKZExqYkRvck1qdXBXa0VtUXFTcHFzbgpMaHBOZ2IrRTFIQWVyVWYrL1VxZE0rRHl1Y1JGQ0NFSzJtbHBjM0lOdmpUK2xJdXR3eDQxMTZLRDcrVTR4NldGCkg2dlBOT3cvS1A0TThWZUdUc2xWOXh6VTJLVjlCbnB2MWQ4UTM0Rk9JV1d4dHVFWGVaVkZCczVmek54R2lXTm8KUkkyVDlHUndvRDJkS0FYRE9YQzRZbnNnL2VUYjZRaWh1SjQ5Q2NkUCt5ejRrM1pCM2xMZzRWZlNuUU84ZDU3KwpuaWxlOThGUllCL2UyZ3V5TFhXM1EwaVQ1L1o1eG9SZGdGbGdsUHg0bUk4OGsxSHRRSkFIMzJSakpNdE9jUVdoCjE1UWFpREx4SW5RaXJxV20yQkpwVEdDakF1NHI3TlJqa2d0ZXZpOTJhNk8ySnJ5UEE5Z0s4a3hrUnIwNVl1V1cKNnpSakVTak1sZkd0NysvY2dGaEk2VXU0Nm1XczZmeUF0YlhJUmZtc3daL1p1ZXBpaUk3RThVdURFcTNtaTRUVwpuc0xyZ3hpZmFyc2JKR0F6Y016czl6THpYTmw1ZmUrZXBQN0pJOE1rN2hXU3NUMlJUeWFHdldaekpCUHFwSzVqCndhMTloQU04RUhpR0czbmp4UFB5QkpVZ3JpT0N4TE02QUdLLzVqWWs0VmU2eHg2UWRkVmZQNVZoSzhFN3plV3oKYUdIUVJpYXBJVkpwTGVzdXgrdDN6cVk2dFFNelQzYlI1MXhVQVYzTGVQVEpETC9QRW80WExTTm9sT2VyL3FteQpLd2JRQk0wPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VGVsaWFTb25lcmEgUm9vdCBDQSB2MSBPPVRlbGlhU29uZXJhCiMgU3ViamVjdDogQ049VGVsaWFTb25lcmEgUm9vdCBDQSB2MSBPPVRlbGlhU29uZXJhCiMgTGFiZWw6ICJUZWxpYVNvbmVyYSBSb290IENBIHYxIgojIFNlcmlhbDogMTk5MDQxOTY2NzQxMDkwMTA3OTY0OTA0Mjg3MjE3Nzg2ODAxNTU4CiMgTUQ1IEZpbmdlcnByaW50OiAzNzo0MTo0OToxYjoxODo1Njo5YToyNjpmNTphZDpjMjo2NjpmYjo0MDphNTo0YwojIFNIQTEgRmluZ2VycHJpbnQ6IDQzOjEzOmJiOjk2OmYxOmQ1Ojg2OjliOmMxOjRlOjZhOjkyOmY2OmNmOmY2OjM0OjY5Ojg3OjgyOjM3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBkZDo2OTozNjpmZToyMTpmODpmMDo3NzpjMToyMzphMTphNToyMTpjMToyMjoyNDpmNzoyMjo1NTpiNzozZTowMzphNzoyNjowNjo5MzplODphMjo0YjowZjphMzo4OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRk9EQ0NBeUNnQXdJQkFnSVJBSlcrRnFEM0xrYnhlem1DY3ZxTHpaWXdEUVlKS29aSWh2Y05BUUVGQlFBdwpOekVVTUJJR0ExVUVDZ3dMVkdWc2FXRlRiMjVsY21FeEh6QWRCZ05WQkFNTUZsUmxiR2xoVTI5dVpYSmhJRkp2CmIzUWdRMEVnZGpFd0hoY05NRGN4TURFNE1USXdNRFV3V2hjTk16SXhNREU0TVRJd01EVXdXakEzTVJRd0VnWUQKVlFRS0RBdFVaV3hwWVZOdmJtVnlZVEVmTUIwR0ExVUVBd3dXVkdWc2FXRlRiMjVsY21FZ1VtOXZkQ0JEUVNCMgpNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNSys2eWZ3SWFQemFTWlZmcDNGClZSYVJYUDN2SWI5VGdIb3QwcEdNWXpIdzdDVHd3NlhTY253UWJmUTN0K1htZkhucWpMV0NpNjVJdHF3QTNHVjEKN0NwTlg4R0g5U0JsSzRHb1J6NkpJNVV3RnBCLzZGY0hTT2NacnI5Rlo3RTNHd1lxL3Q3NXJIMkQrMTY2NUkrWApaNzVMam8xa0IxYzRWV2swTmowVFNPOVA0dE5tSHFUUEdyZGVOalBVdEFhOUdBSDlkNFJRQUVYMWpGM29JN3grCi9qWGg3VkI3cVRDTkdkTUpqbWhuWGI4OGx4aFR1eWxpeGNwZWNzSEhsdFRiTGFDMEgya0Q3T3JpVVBFTVBQQ3MKODFNdDhCejE3V3c1T1hPQUZzaFNzQ1BONEQ3YzNUeEhvTHMxaXVLWWFJdSs1Yjl5N3RMNnBlMFM3ZnlZR0trbQpkdHdvU3hBZ0hOTi9GbmN0N1crQTkwbTdVd1c3WFdqSDFNaDFGaitKV292M0YwZlVUUEhTaVhrK1RUMllxR0hlCk9oN1MrRjRENE1ISkhJelRqVTNUbFRhek4xOWpZNXN6RlBBdEptdFRmSW1NTXNKdTdEMGhBRG5Kb1dqaVVJTXUKc0Rvcjh6YWdyQy9rYjJIQ1VRazVQb3RUdWJ0bjJ0eFR1WFpaTnAxRDVTRGdQVEpnaFNKUnQ4Y3p1OTBWTDZSNApwZ2Q3Z1VZMkJJYmRlVFhIbFN3N3NLTVhOZVZ6SDdSY1dlL2E2aEJsZTNyUWY1K3p0Q28zTzNDTG0xdTVLN2ZzCnNsRVNsMU1wV3RUd0VoRGNUd0s3RXBJdll0US9hVU44RGRiOFdIVUJpSjFZRmt2ZXVwRC9Sd0dKQm1yMlg3S1EKYXJNQ3BnS0l2N05IZmlyWjFmcG9lRFZOQWdNQkFBR2pQekE5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Q3dZRApWUjBQQkFRREFnRUdNQjBHQTFVZERnUVdCQlR3ajFrNEFMUDFqNXFXRE5YcitudXFGK2dURWpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FnRUF2dVJjWWs0azlBd0kvL0RUREdqa2swa2lQMFFuYjd0dDNvTm16cWpNRGZ6MW1nYmwKZHhTUjY1MUJlNWtxaE9YLy9DSEJYZkRrSDFlM2RhbWhYd0ltLzlmSDkwN2VUL2ozSEViQWVrOUFMQ0kxOEJteAowR3RuTExDbzRNQkFOelgyaEZ4YzQ2OUNlUDZueVExUTZnMkVkdlpSNzROVHhuci9EbFpKTG85NjFnem1KMVRqClRRcGdjbUxOa1FmV3BiL0ltV3Z0eEJubXEwd1JPTVZ2TWVKdVNjZy9kb0FtQXlZcDREYjI5aUJUNHhkd05CZWQKWTJnZWErekRUWWE0RXpBdlhVWU5SMFBWRzZwWkRybGNqUVpJclhTSFg4ZjhNVlJCRStMSElRNmU0QjRONGNCNwpRNFdReFlwWXhtVUtlRmZ5eGlNUEFka2dTOTRQKzVLRmRTcGNjNDF0ZXlXUnl1NUZyZ1pMQU16VHNWbFEyanFJCk95bERSbDZYSzFUT1UyK05TdWVXK3I5eERrS0xmUDBvb05CSXl0ckVnVXk3b25PVEpzanJETlltaUxiQUpNKzcKdlZ2cmRYM3BDSTZHTXl4NWR3bHBwWW44czNDUWgzYVAweUs3UXM2OWN3c2dKaXJRbXoxd0hpUnN6WWQycVJlVwp0ODhOa3Z1T0dLbVlTZEdlL21CRWNpRzVHZTNDOVRIeE9VaUlrQ1IxVkJhdHp2VDRhUlJrT2Z1anVMcHdRTWNuCkhML0VWbFA2WTJYUTh4d09GdlZyaGxoTkdOVGtEWTZsblZ1UjNIWWtVRC9HS3Z2WnQ1eTExdWJRMmVnWml4VngKU0syMzZ0aFppTlNRdnhhejJlbXNXV0ZVeUJ5NnlzSEs0YmtnVEk4Nms0bWxvTXkvMC9aMXBIV1diVlk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RS1UdVx1MDExZnJhIEVCRyBCaWxpXHUwMTVmaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuXHUwMTVlLiBPVT1FLVR1Z3JhIFNlcnRpZmlrYXN5b24gTWVya2V6aQojIFN1YmplY3Q6IENOPUUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FLVR1XHUwMTFmcmEgRUJHIEJpbGlcdTAxNWZpbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS5cdTAxNWUuIE9VPUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppCiMgTGFiZWw6ICJFLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogNzY2NzQ0NzIwNjcwMzI1NDM1NQojIE1ENSBGaW5nZXJwcmludDogYjg6YTE6MDM6NjM6YjA6YmQ6MjE6NzE6NzA6OGE6NmY6MTM6M2E6YmI6Nzk6NDkKIyBTSEExIEZpbmdlcnByaW50OiA1MTpjNjplNzowODo0OTowNjo2ZTpmMzo5MjpkNDo1YzphMDowZDo2ZDphMzo2Mjo4ZjpjMzo1MjozOQojIFNIQTI1NiBGaW5nZXJwcmludDogYjA6YmY6ZDU6MmI6YjA6ZDc6ZDk6YmQ6OTI6YmY6NWQ6NGQ6YzE6M2Q6YTI6NTU6YzA6MmM6NTQ6MmY6Mzc6ODM6NjU6ZWE6ODk6Mzk6MTE6ZjU6NWU6NTU6ZjI6M2MKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdTekNDQkRPZ0F3SUJBZ0lJYW1nK25GR2J5MU13RFFZSktvWklodmNOQVFFTEJRQXdnYkl4Q3pBSkJnTlYKQkFZVEFsUlNNUTh3RFFZRFZRUUhEQVpCYm10aGNtRXhRREErQmdOVkJBb01OMFV0VkhYRW4zSmhJRVZDUnlCQwphV3hweFo5cGJTQlVaV3R1YjJ4dmFtbHNaWEpwSUhabElFaHBlbTFsZEd4bGNta2dRUzdGbmk0eEpqQWtCZ05WCkJBc01IVVV0VkhWbmNtRWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTlpYSnJaWHBwTVNnd0pnWURWUVFEREI5RkxWUjEKWjNKaElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERURXpNRE13TlRFeU1EazBPRm9YRFRJegpNRE13TXpFeU1EazBPRm93Z2JJeEN6QUpCZ05WQkFZVEFsUlNNUTh3RFFZRFZRUUhEQVpCYm10aGNtRXhRREErCkJnTlZCQW9NTjBVdFZIWEVuM0poSUVWQ1J5QkNhV3hweFo5cGJTQlVaV3R1YjJ4dmFtbHNaWEpwSUhabElFaHAKZW0xbGRHeGxjbWtnUVM3Rm5pNHhKakFrQmdOVkJBc01IVVV0VkhWbmNtRWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTgpaWEpyWlhwcE1TZ3dKZ1lEVlFRRERCOUZMVlIxWjNKaElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Ck1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNHZVL2t3VlJIb1ZpVkY1NkMvVVkKQjRPdWZxOTg5OVNLYTZWalF6bTVTL2ZEeG1TSlBaUXVWSUJTT1RrSFMwdmRoUWQyaDh5L0w1Vk16SDJuUGJ4SApENWh3K0l5RkhuU09rbTBiUU5HWkRidDFic2lwYTVyQWhER3Z5a1BMNnlzMDZJK1hhd0diMVE1S0NLcGJrblNGClE5T0FycUdJVzY2ejZsN0xGcHAzUk1paDlsUm96dDZQbHl1NlcwQUNER1FYd0xXVHplSHhFMmJPREhudjBaRW8KcTErZ0VsSXdjeG1PaitHTUI2TER1MHJ3Nmg4VnFPNGx6S1JHK0JzaTc3TU9RN29zSkxqRkxGelVIUGhkWkwzRAprMTRvcHo4bjhZNGUweXBRQmFOVjJjdm5PVlBBbUo2TVZHS0xKckQzZlkxODVNYWVaa0pWZ2tmbnNsaU5admNICmZDNDI1bEFjUDl0REpNVy9oa2Q1czNrYzkxcjBFK3hzK0QvaVdSK1Y3a0krdWEyb01vVkpsMGIrU3pHUFdzdXQKZEVjZjZaRzMzeWdFSXFEVUQxM2llVS9xYklXR3ZhaW16dVQ2dytHenJ0NDhVZTdMRTN3QmY0UU9YVkdVbmhNTQp0aTZsVFBrNWNEWnZsc291REVSVnhjcjZYUUtqMzlaa2pGcXpBUXFwdFFwSEYvL3ZrVUFxanFGR09qR1k1Ukg4CnpMdEpWb3I4dWRCaG1tOWxiT2JEeXo1MVNmNlBwK0tKeFdmWG5VWVRUakYyT3lTem5oRmxocXQvN3gzVStMem4KckZwY3QxcEhYRlhPVmJRaWNWdGJDL0RQM0tCaFpPcXAxMmdLWTZmZ0RUK2dyOU9xMG43dlVhRG1VU3RWa2hVWApVOHUzWmc1bVRQajVkVXlRNXhKd3gwVUNBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGQzdqMjdKSjBKeFVlVno2Ckp5cit6RTdTNkU1VU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVMdVBic2tuUW5GUjUKWFBvbkt2N01UdExvVGxRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBRgpOenIwVGJkRjRrVjFKSSsyZDFMb0hOZ1FrMlh6OGxrR3BENGVLZXhkMGRDcmZPQUtrRWg0N1U2WUE1bitLR0NSCkhUQWR1R044cU9ZMXRmclRZWGJtMWdkTHltbWFzb1I2ZDVORkZ4V2ZKTkNZRXhML3U2QXUvVTVNaC9qT1hLcVkKR3dYZ0FFWktnb0NsTTRzbzNPMDQwOS9sUHVuKysxbmRZWVJQMGxTV0UyRVRQbytBYWI2VFI3VTFROUphdXoxYwo3N05DUjgwN1ZSTUdzQW5iL1dQMk9vZ0ttVzkrNGM0YlUycEVaaU5SQ0h1OFcxS2kvUVkzT0VCaGowcVd1SkEzCitHYkhlSkFBRlM2THJWRTFVd2VvYTJpdStVNDhCeWJOQ0FWd3pEay9kcjJsMDJjbUFZYW1VOUpnTzN4RGYxV0sKdkpVYXdTZzVUQjlEMHBIMGNsbUt1VmI4UDdTZDJuQ2NkbHFNUTFEdWpqQnlUZC8vU2ZmR3FXZlpiYXdDRWVJNgpGaVduV0FqTGIxTkJuRWc0UjJnejBkZkhqOVIwSWRUREJaQjYvODZXaUxFVktWMGpxOUJnb1JKUDN2UVh6VExsCnliL0lRNjM5TG83eHIrTDBtUG9TSHlEWXdLY01oY1dROURzdGxpYXhMTDVNcSt1eDBvckoyM2dURHg0Sm5XMlAKQUo4QzJzSDZIM3A2Q2NSSzVvZ3FsNStKaS8wM1gxODZ6amhaaGt1dmNRdTAyUEp3VDU4eUUrT3dwMWZsMnRwRAp5NFEwOGlqRTZtMzBLdS9CYTNiYSszNjdoVHpTVThKTnZuSGhSZEg5STJjTkUzWDd6MlZuSXAydXNBblJDZjhkCk5MLytJNWMzMGpuNlBRMEdDN1RiTzZPcmIxd2R0bjdvczRJMDdRWmNKQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgU3ViamVjdDogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMiBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIExhYmVsOiAiVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMiIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDJiOjliOjllOmU0OjdiOjZjOjFmOjAwOjcyOjFhOmNjOmMxOjc3Ojc5OmRmOjZhCiMgU0hBMSBGaW5nZXJwcmludDogNTk6MGQ6MmQ6N2Q6ODg6NGY6NDA6MmU6NjE6N2U6YTU6NjI6MzI6MTc6NjU6Y2Y6MTc6ZDg6OTQ6ZTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDkxOmUyOmY1Ojc4OjhkOjU4OjEwOmViOmE3OmJhOjU4OjczOjdkOmUxOjU0OjhhOjhlOmNhOmNkOjAxOjQ1Ojk4OmJjOjBiOjE0OjNlOjA0OjFiOjE3OjA1OjI1OjUyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEd3pDQ0FxdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmdqRUxNQWtHQTFVRUJoTUNSRVV4Ckt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWQKQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObApZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3SGhjTk1EZ3hNREF4TVRBME1ERTBXaGNOTXpNeE1EQXhNak0xCk9UVTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnkKYVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MApaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcVg5b2JYK2h6a2VYYVhQU2k1a2ZsODJoVllBVWQKQXFTem0xbnpIb3F2TkszOERjTFpTQm51YVkvSklQd2hxZ2NaN2JCY3JHWEhYKzBDZkh0OExSdld1cm1Bd2hpQwpGb1Q2WnJBSXhsUWpnZVROdVVrLzlrOXVOMGdvT0EvRnZ1ZG9jUDA1bDAzU3g1aVJVS3JFUkxNamZUbEg2VkppCjFoS1RYcmN4bGtJRiszYW5IcVAxd3Z6cGVzVnNxWEZQNnN0NHZHQ3Z4OTcwMmN1K2ZqT2xicFNEOERUNklhdnEKam5LZ1A2VGVNRnZ2aGsxcWxWdERSS2dRRlJ6bEFWZkZtUEhtQmlpUnFpREZ0MU1tVVVPeUN4R1ZXT0hBRDNiWgp3STE4Z2ZOeWNKNXYvaHFPMlY4MXhySnZOSHkrU0UvaVdqblgySjE0bnArR1BnTmVHWXRFb3RYSEFnTUJBQUdqClFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUy8KV1NBMkFIbWdvQ0pyak5YeVlkSzRMTXVDU2pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQU1RT2lZUXNmZE9oeQpOc1p0K1UyZStpS280WUZXejgyN24rcXJrUms0cjZwOEZVM3p0cU9OcGZTTzlrU3BwK2dobGEwK0FHSVdpUEFDCnV2eGhJK1l6bXpCNmF6WmllNjBFSTRSWVplTGJLNHJuSlZNM1lsTmZ2Tm9CWWltaXBpZHg1am9pZnNGdkhaVncKSUVvSE5OL3EveFdBNWJyWGV0aGJkWHdGZWlsSGZrQ29NUk4zelVBN3RGRkhlaTRSNDBjUjNwMW0wSXZWVkdiNgpnMVhxZk1JcGlSdnBiN1BPNGdXRXlTOCtlSVZpYnNsZndYaGpkRmpBU0JnTW1UbnJwTXdhdFhsYWpSV2MyQlFOCjlub0hWOGNpZ3dVdFBKc2xKajBZczZsRGZNaklxMlNQRHFPL25CdWRNTnZhMEJrdXFqengrek9BZHVUTnJSbFAKQlNlT0U2RnV3Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BdG9zIFRydXN0ZWRSb290IDIwMTEgTz1BdG9zCiMgU3ViamVjdDogQ049QXRvcyBUcnVzdGVkUm9vdCAyMDExIE89QXRvcwojIExhYmVsOiAiQXRvcyBUcnVzdGVkUm9vdCAyMDExIgojIFNlcmlhbDogNjY0Mzg3NzQ5NzgxMzMxNjQwMgojIE1ENSBGaW5nZXJwcmludDogYWU6Yjk6YzQ6MzI6NGI6YWM6N2Y6NWQ6NjY6Y2M6Nzc6OTQ6YmI6MmE6Nzc6NTYKIyBTSEExIEZpbmdlcnByaW50OiAyYjpiMTpmNTozZTo1NTowYzoxZDpjNTpmMTpkNDplNjpiNzo2YTo0Njo0Yjo1NTowNjowMjphYzoyMQojIFNIQTI1NiBGaW5nZXJwcmludDogZjM6NTY6YmU6YTI6NDQ6Yjc6YTk6MWU6YjM6NWQ6NTM6Y2E6OWE6ZDc6ODY6NGE6Y2U6MDE6OGU6MmQ6MzU6ZDU6Zjg6Zjk6NmQ6ZGY6Njg6YTY6ZjQ6MWE6YTQ6NzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lJWERQTFlpeGZzekl3RFFZSktvWklodmNOQVFFTEJRQXdQREVlTUJ3R0ExVUUKQXd3VlFYUnZjeUJVY25WemRHVmtVbTl2ZENBeU1ERXhNUTB3Q3dZRFZRUUtEQVJCZEc5ek1Rc3dDUVlEVlFRRwpFd0pFUlRBZUZ3MHhNVEEzTURjeE5EVTRNekJhRncwek1ERXlNekV5TXpVNU5UbGFNRHd4SGpBY0JnTlZCQU1NCkZVRjBiM01nVkhKMWMzUmxaRkp2YjNRZ01qQXhNVEVOTUFzR0ExVUVDZ3dFUVhSdmN6RUxNQWtHQTFVRUJoTUMKUkVVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNWaFR1WGJ5bzdManZQcHZNcApOYjdQR0t3K3F0bjRUYUErR2tlNXZKcmY4djdNUGtmb2VwYkNKSTQxOUtrTS9JTDliY0Z5WWllOTZtdnI1NHJNClZENlFVTStBMUpYNzZMV0MxQlRGdHFsVkpWZmJzVkQyc0dCa1dYcHB6d08zYncyK3lqNXZkSExxcWpBcWMySysKU1pGaHlCSCtEZ01xOTJvZzNBSVZEVjRWYXZ6amdzRzF4WjFrQ1d5aldaZ0hKOGNibGl0aGRIRnNRL0gzTllrUQo0SjdzVmFFM0lxS0hCQVVzUjMyMEhMbGlLV1lveXJmaGsvV2tsQU9adVhDRnRlWkk2bzFRL05uZXpHOEhEdDBMCmNwMkFNQllIbFQ4b0R2M0ZkVTlUMW5TYXRDUXVqZ0tSejNiRm14NVZkSng0SWJId0xmRUxuOExWbGhnZjhGUWkKZW93SEFnTUJBQUdqZlRCN01CMEdBMVVkRGdRV0JCU25wUWF4TEtZSllPN1JsK2x3cnJ3N0dXemJJVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZLZWxCckVzcGdsZzd0R1g2WEN1dkRzWmJOc2hNQmdHCkExVWRJQVFSTUE4d0RRWUxLd1lCQkFHd0xRTUVBUUV3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBbWR6VGJsRWlHS2tHZExENEdrR0RFakt3TFZMZ2Z1WHZUQnpuaytqNTdzajFPN1o4agp2WmZ6YTF6djd2MUFwdCtoazZFS2hxenZJTkI1QWIxNDl4bllKREUwQkFHbXVoV2F3eWZjMkU4UHpCaGovNWtQCkRwRnJkUmJoSWZ6WUpzZEh0NmJQV0hKeGZycmhUWlZITzhtdmJhRzB3ZXlKOXJRUE9MWGlaTndsejZiYjY1cGMKbWFIRkNONzk1dHJWMWxwRkRNUzN3clVVNzdRUi93NFZ0ZlgxMjhhOTYxcW44RllpcVR4bFZNWVZxTDJHbnMyRApsbWg2Y1lHSjRRdmg2aEViYUFqTWFaN3Nua0dlUkRJbWV1S0hDbkU5NitSYXBOTGJ4YzNHM21CL3VmTlBSSkx2CktyY1lQcWNaMlF0OXNUZEJRckM2WUIzeS9na1JzUENIZTZlZAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAxIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMSBHMyIKIyBTZXJpYWw6IDY4NzA0OTY0OTYyNjY2OTI1MDczNjI3MTAzNzYwNjU1NDYyNDA3ODcyMDAzNDE5NQojIE1ENSBGaW5nZXJwcmludDogYTQ6YmM6NWI6M2Y6ZmU6Mzc6OWE6ZmE6NjQ6ZjA6ZTI6ZmE6MDU6M2Q6MGI6YWIKIyBTSEExIEZpbmdlcnByaW50OiAxYjo4ZTplYTo1Nzo5NjoyOToxYTpjOTozOTplYTpiODowYTo4MToxYTo3Mzo3MzpjMDo5Mzo3OTo2NwojIFNIQTI1NiBGaW5nZXJwcmludDogOGE6ODY6NmY6ZDE6YjI6NzY6YjU6N2U6NTc6OGU6OTI6MWM6NjU6ODI6OGE6MmI6ZWQ6NTg6ZTk6ZjI6ZjI6ODg6MDU6NDE6MzQ6Yjc6ZjE6ZjQ6YmY6Yzk6Y2M6NzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVZUZoZkxxMHNHVXZqTndjMU5CTW90WmJVWlpNd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ01TQkhNekFlRncweE1qQXhNVEl4TnpJM05EUmFGdzAwCk1qQXhNVEl4TnpJM05EUmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJREVnUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDZ3ZsQVFqdW55YkVDMEJKeUZ1VEhLM0Mza0Vha0VQQnRWCndlZFlNQjBrdE1QdmhkNk1MT0hCUGQrQzVrK3RSNGRzN0Z0SndVclZ1NC9zaDZ4L2dwcUc3RDBEbVZJQjBqV2UKck5yd1U4bG1QTlNzQWdIYUpOTTdxQUpHcjZRYzQvaHpXSGEzOWc2UURiWHd6OHo2K2NaTTVjT0dNQXFORjM0MQo2OFhmdXc2Y3dJMkg0NGc0aFdmNlBzZXI0Qk9jQlJpWXo1UDFzWkswL0NQVHo5WEVKMG5nbmp5YkNLT0xYU29oCjRQdzVxbFBhZlg3UEdnbFR2RjBGQk0raFNvK0xkb0lOb2ZqU3h4UjNXNUEyQjRHYlBnYjZVbDVqeGFZQS9xWHAKVWh0U3RaSTVjZ01KWXIyd1lCWnVwdDBsd2dObTNmTUUwVURpVG91RzlHL2xnNkFuaEY0RXdmV1F2VEE5eE8rbwphYnc0bTZTa2x0RmkybW5BQVphdXk4UlJOT29NcXY4aGpsbVBTbHprWVpxbjB1a3FlSTFSUFRvVjdxSlpqcWxjCjNzWDVrQ0xsaUVWeDNaR1piSHFmUFQyWWZGNzJ2aFpvb0Y2dUN5UDhXZytxSW5ZdHlhRVFIZVRUUkNPUWlKL0cKS3ViWDlacXpXQjR2TUlrSUcxU2l0WmdqN0FoM0hKVmRZZEhMaVp4Zm9rcVJtdThocWtrV0NLaTlZU2d4eVhTdApoZmJaeGJHTDBlVVFNazFmaXlBNlBFa2ZNNFZaRGR2TENYVkRhWFA3YTNGOThOL0VUSDNHb3k3SWxYbkxjNktPClRrMGsrMTdrQkw1eUc2WW5MVWxhbVhyWFhBa2d0MytVdVUveERSeGVpRUliRWJmbmtkdWViUFJxMzR3R21BT3QKekNqdnBVZnpVd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVbzVmVzgxNmlFT0dyUlo4OEYyUTg3Z0Z3bk13d0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBQmo2VzNYOFBuckhYM2ZIeXQvUFg4TVN4RUJkMURLcXVHclgxUlVWUnBnanBlYVFXeGlaVE9PdFFxT0MKTVRhSXplbjd4QVNXU0lzQng0MEJ6MXN6QnBaR1puUWRUKzNCdHJtMERXSE1ZMzdYTG5lTWxod3FJMmhyaFZkMgpjRE1UL3VGUHBpTjNHUG9hak9pOVpjblBQL1RKRjl6cng3ekFCQzR0Umk5cFpzTWJqLzdzUHRQS2xMOTJDaVVOCnFYc0NIS25RTzE4THdJRTZQV1RodjZjdFRyMU54TmdweGlJWTBNV3NjZ0tDUDZvNm9qb2lsekhkQ0dQRGRSUzUKWUNndFcyamdGcWxtZ2lOUjlldFQyREdiZSttM25VdnJpQmJQK1YwNGlra3dqKzN4NnhuMGR4b3hHRTFuVkd3dgpiMlg1Mnozc0lleGU5UFNMeW1CbFZORnhaUFQ1cHFPQk16WXpjZkNrZUY5T3JZTWgzalJKamVoWnJKM3lkbG8yCjhoUDByK0FKeDJFcWJQZmduYTY3aGtvb2J5N3V0SG5Oa0RQRHMzYjY5ZkJzblFHUStwNlE5cHh5ejBmYXd4L2sKTlNCVDhsVFIzMkdEcGdMaUpUamVoVEl0WG5PUVVsMUN4TTQ5UytINUdZUWQxYUpRekVIN1FSVER2ZGJKV3FOagpaZ0tBdlFVNk8wZWM3QUFtVFBXSVViK29JMzhZQjdBTDdZc21vV1RUWVVyclhKL2VzNjluQTdNZjNXMWRhV2hwCnExNDY3SHhwdk1jN2hVNmVGYm0wRlUvRGxYcFkxOGxzNld5NTh5bGpYclFzOEMwOTdWcGw0S2xiUU1KSW1ZRnQKbmg4R0tqd1N0SXNQbTZJazhLYU4xbnJnUzdaa2xtT1ZoTUpLelJ3dUpJY3pZT1hECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDIgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAyIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAyIEczIgojIFNlcmlhbDogMzkwMTU2MDc5NDU4OTU5MjU3NDQ2MTMzMTY5MjY2MDc5OTYyMDI2ODI0NzI1ODAwCiMgTUQ1IEZpbmdlcnByaW50OiBhZjowYzo4Njo2ZTpiZjo0MDoyZDo3ZjowYjozZToxMjo1MDpiYToxMjozZDowNgojIFNIQTEgRmluZ2VycHJpbnQ6IDA5OjNjOjYxOmYzOjhiOjhiOmRjOjdkOjU1OmRmOjc1OjM4OjAyOjA1OjAwOmUxOjI1OmY1OmM4OjM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZjplNDpmYjowYTpmOTozYTo0ZDowZDo2NzpkYjowYjplYjpiMjozZTozNzpjNzoxYjpmMzoyNTpkYzpiYzpkZDoyNDowZTphMDo0ZDphZjo1ODpiNDo3ZToxODo0MAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVSRmMwSkZ1QmlaczE4czY0S3p0YnB5YndkU2d3RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTWlCSE16QWVGdzB4TWpBeE1USXhPRFU1TXpKYUZ3MDAKTWpBeE1USXhPRFU1TXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklESWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNocmlXeUFSamNWNGcvUnV2NXIrTHJJM0hpbXRGaFppRmYKcXE4blVlVnVHeGJVTFgxUXNGTjN2WGc2WU9Ka0FwdDhocHZXR282dC94OFZmOVdWSGhMTDVoU0VCTUhmTnJNVwpuNHJqeWR1WU5NN1lNeGNvUnZ5bnlmRFN0TlZOQ1hKSitmS0g0Nm5hZmFGOWE3STZKYWx0VWtTcytMNXUrOXltCmM1R1FZYVlERkNEeTU0ZWppSzJ0b0l6L3Bnc2xVaVhuRmdIVnk3ZzFnUXlqTy9EaDRmeGFYYzZBY1czNFNhcysKTzdxNDE0QUIrNlhyVzdQRlhtQXFNYUN2TitnZ09wK29NaXdNekFrZDA1Nk9YYnhNbU83RkdtaDc3Rk9tNlJRMQpvOS9OZ0o4TVNQc2M5UEcvU3JqNjFZeHhTc2NmcmY1Qm1yT0RYZktFVnUrbFYwUE9LYTJNcTFXL3hQdGJBZDBqCklhRllBSTdEMEdvVDdSUGpFaXVBM0dmbWxiTE5IaUp1S3ZoQjFQTEtGQWVOaWxVU3htbjF1SVpvTDFOZXNOS3EKSWNHWTVqRGpaMVhIbTI2c0dhaFZwa1VHMENNNjIrdGxYU29SRWZBN1Q4cHQ5RFRFY2VUL0FGcjJYSzRqWUlWego4ZVFRc1NXdTFaSzdFOEVNNERuYXREbFh0YXMxcW5JaE80TTE1ekhmZWlGdXVESUlmUjB5a1JWS1luTFA0M2VoCnZOVVJHM1lCWndqZ1FRdkQ2eFZ1K0tRWjJhS3JyK0luVWxZckFvb3NGQ1Q1djBJQ3Z5Ykl4by9nYmpoOVV5M2wKN1ppemxXTm9mL2sxOU4rSXhXQTFrc0I4YVJ4aGxSYlE2OTRMcno0RUVFVmxXRkE0cjBqeVdiWVc4andOa0FMRwpjQzRCclR3VjF3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVU3ZWR2ZGxxL1lPeEpXOGFsZDd0eUZuR2J4RDB3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFKSGZnRDlEQ1g1eHd2ZnJzNGlQNFZHeXZEMTErU2hkeUx5Wm0zdGRxdVhLNFFyMzZMTFRuOTFuTVg2NgpBYXJIYWtFN2tOUUlYTEpnYXBEd3lNNERZdm1MN2Z0dUt0d0dUVHdwRDRrV2lsaE1TQS9vaEdIcVBIS21kK1JDCnJvaWpRMWg1ZnE3S3BWTU5xVDF3dlNBWllhUnNPUHhETXVIQlIvLzQ3UEVSSWpLV25NTDJXMm1XZXlBTVEwR2EKVy9aWkdZamVWWWczVVF0NFhBb2VvMEw5eDUySUQ4RHllQUlrVkpPdmlZZUl5VXFBSGVyUWJqNWhMamE3TlE0bgpsdjFtTkR0aGNuUHhGbHhIQmxSSkFIcFlFckFLNzRYOXNiZ3pkV3FUSEJMbVlGNXZIWC9KSHlQTGhHR2ZIb0pFCitWK3RZbFVrbWxLWTdWSG5vWDZYT3VZdkh4SGFVNEFzaFo2ck5SRGJJbDlxeFY2WFUvSXlBZ2t3bzFqd0RRSFYKY3NheGZHbDd3L1UyUmN4aGJsNU1sTVZlcnVnT1hvdS85ODNnN2FFT0d6UHVWQmorRDc3dmZvUnJRK053bU50ZApkYklOV1FlRkZTTTUxdkhmcVNZUDFrakhzNllpOVRNM1dwVkhuM3U2R0JWdi85WVVaSU5KMGdwbklkc1BOV05nCktDTGpzWldEellXbTNTOFA1MmRTYnJzdmhYejFTblBueFQ3QXZTRVNCVC84dHdOSkFsdklKZWJpVkRqMWVZZU0KSFZPeVRvVjdCampITFBqNHNIS05KZVYzVXZRREhFaW1VRitJSURCdThvSkRxejJYaE9kVCt5SEJUdzhpbW9hNApXU3IyUnowWmlDM29oZUdlN0lVSWFyRnNOTWtkN0Vnck8zanRac1NPZVdtRDNuK00KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDMgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDMgRzMiCiMgU2VyaWFsOiAyNjgwOTA3NjExNzA0NjE0NjI0NjM5OTU5NTIxNTczMjcyNDIxMzcwODkyMzk1ODEKIyBNRDUgRmluZ2VycHJpbnQ6IGRmOjdkOmI5OmFkOjU0OjZmOjY4OmExOmRmOjg5OjU3OjAzOjk3OjQzOmIwOmQ3CiMgU0hBMSBGaW5nZXJwcmludDogNDg6MTI6YmQ6OTI6M2M6YTg6YzQ6Mzk6MDY6ZTc6MzA6NmQ6Mjc6OTY6ZTY6YTQ6Y2Y6MjI6MmU6N2QKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDg4OmVmOjgxOmRlOjIwOjJlOmIwOjE4OjQ1OjJlOjQzOmY4OjY0OjcyOjVjOmVhOjVmOmJkOjFmOmMyOmQ5OmQyOjA1OjczOjA3OjA5OmM1OmQ4OmI4OjY5OjBmOjQ2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVUx2V2JBaWluMjNyLzFhT3A3cjBEb004U2FoMHdEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNeUJITXpBZUZ3MHhNakF4TVRJeU1ESTJNekphRncwMApNakF4TVRJeU1ESTJNekphTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3p5dzRRWjQ3cUZKZW5NaW9LVmpaL2FFekhzMjg2SXhTUgoveGwvcGNxczdyTjJuWHJwaXh1cmF6SGIrZ3RUVEsvRnBScDVQSXBNLzZ6ZkpkNU8yWUl5QzBUZXl0dU1yS051CkZvTTdwbVJMTW9uN0ZoWTRmdXRENHROMFNzSmlDbk1LM1VtelY5S3dDb1dkY1R6ZW84dkFNdk1CT1NCREd6WFIKVTdPeDdzV1RhWUkrRnJVb1JxSGU2b2tKN1VPNEJVYUtodlZaUjc0YmJ3RWhFTG45cWRJb3loQTVDY29UTnMrYwpyYTFBZEhrckFqODAvL29nYVgzVDdtSDF1clBuTU5BM0k0WnlZVVVwU0Zsb2IzZW1Mb0crQjAxdnI4N0VSUk9SCkZIQUdqeCtmK0lkcHNRN3Z3NGtaNitvY1lmeDZiSXJjMWdNTG5pYTZFdDNVVkRtckpxTXo2bldCMmkzTkQwL2sKQTlIdkZaY2JhNURGQXBDVFpnSWhzVWZlaTVwS2dMbFZqN1dpTDhEV00yZmFmc1NudEFSRTYwZjc1bGk1OXd6dwpleXV4d0hBcHcwQmlMVHRJYWR3alBFanJld2w1cVczYXFEQ1l6NEJ5QTRpbVcwYXVjbmw4Q0FNaFphNjM0UnlsCnNTcWlNZDVtQlBmQWRPaHgzdjg5V2N5V0poS0xoWlZYR3F0cmRRdEVQUkVvUEh0aHQrS1BaMC9sN0R4TVlJQnAKVnpnZUFWdU5WZWpIMzhETWR5TTBTWFY4OXBnUjZ5M2U3VUV1RkFVQ2YrRCtJT3MxNXhHc0lzNVhQZDdKTUcwUQpBNFhOOGYrTUZyWEJzajZJYkdCL2tFK1Y5L1l0clFFNUJ3VDZkWUI5djBsUTdlL0p4SHdjNjRCKzI3YlEzUlArCnlkT2MxN0tYcVFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVXhoZlF2S2pxQWtQeUd3YVpYU3VRSUxuWG5PUXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQURSaDJWYTFFb2RWVGQyak5URkd1NlFIY3J4ZllXTG9wZnNMTjdFOHRyUDZLWjEvQXZXa3lhaVR0M3B4CktHbVBjK0ZTa05yVnZqcmx0M1pxVm9BaDMxM202VHFlNVQ3Mm9tbkhLZ3F3R0VmY0lIQjlVcU0rV1h6QnVzbkkKRlVCaHluTFdjS3pTdC9BYzVJWXA4TTd2YUdQUXRTQ0tGV0dhZm9hWXRNbkNkdnZNdWpBV3pLTmh4blFUNVd2dgpveFhxQS80VGkyVGswOEhTNklUN1NkRVFUWGxtNjZyOTlJMHhIbkFVcmR6ZVp4Tk1nUlZodkxmWmtYZHhHWUZnCnUvQllwYldjQy9lUElsVW53RXNCYlR1WkRkUWRtMk5uTDlEdURjcG12SlJQcHEzdC9PNWpyRmMvWlNYUHNvYVAKMEFqL3VIWVVidDdsSit5cmVMVlR1YlkvNkNENTBxaStZVWJLaDR5RTgvbnhvR2liSWg2Qkpwc1FCSkZ4d0FZZgozS0RUdVZhbjQ1Z3RmNE9kMzR3cm5ES09NcFR3QVR3aUtwOUR3aTdEbURrSE9IdjhYZ0JDSC9NeUpubURoUGJsCjhNRlJFc0FMSGdRakRGU2xUQzlKeFVyUnRtNWdEV3Y4YTR1RkpHUzNpUTZySlVkYlBNOStTYjNINlFyRzJ2ZCsKRGhjSTAwaVgwSEdTOEE4NVBqUnFISDNZOGlLdXUybjBNN1NtU0ZYUkR3NG02T3kyQ3kybmhUWE4vVm5JbjlITgpQbG9wTkxrOWhNNnhaZFJaa1pGV2RTSEJkNTc1ZXVGZ25kT3RCQmowZk90ZWs0OVRTaUlwK0VnclBrMkdyRnQvCnl3YVpXV0RZV0dXVmpVVFI5MzkrSjM5OXJvRDFCMHkyUHB4eFZKa0VTLzFZK1pqMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyIgojIFNlcmlhbDogMTUzODUzNDgxNjA4NDAyMTM5Mzg2NDMwMzM2MjA4OTQ5MDU0MTkKIyBNRDUgRmluZ2VycHJpbnQ6IDkyOjM4OmI5OmY4OjYzOjI0OjgyOjY1OjJjOjU3OjMzOmU2OmZlOjgxOjhmOjlkCiMgU0hBMSBGaW5nZXJwcmludDogYTE6NGI6NDg6ZDk6NDM6ZWU6MGE6MGU6NDA6OTA6NGY6M2M6ZTA6YTQ6YzA6OTE6OTM6NTE6NWQ6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDdkOjA1OmViOmI2OjgyOjMzOjlmOjhjOjk0OjUxOmVlOjA5OjRlOmViOmZlOmZhOjc5OjUzOmExOjE0OmVkOmIyOmY0OjQ5OjQ5OjQ1OjJmOmFiOjdkOjJmOmMxOjg1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEbGpDQ0FuNmdBd0lCQWdJUUM1TWNPdFk1Witwbkk3L0RyNXIwU3pBTkJna3Foa2lHOXcwQkFRc0ZBREJsCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdgpiM1FnUnpJd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxTVRJd01EQXdXakJsTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmwKY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSekl3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURaNXlndlVqODJja21Ja3pUeitHb2VNVlNBCm42MVVRYlZIMzVhbzFLK0FMYmtLejNYOWlhVjlKUHJqSWd3cnZKVVhDek8vR1UxQkJwQUF2UXhORVA0SHRlY2MKYmlKVk1XV1h2ZE1YMGg1aTg5dnFiRkNNUDRRTWxzKzN5d1BneW0yaEZFd2JpZDN0QUxCU2ZLK1JiTEU0RTlIcApFZ2pBQUxBY0t4SGFkM0EybTY3T2VZZmNnbkRtQ1hSd1ZXbXZvMmlmdjkyMmViUHluWEFwVmZTci81Vmg4OGxBCmJ4M1J2cE83MDRncXU1Mi9jbHBXY1RzLzFQUFJDdjRvNzZQdTJabXZBOU9QWUxmeWtxR3h2WW1KSHpETnc2WXUKWWpPdUZnSjNSRnJuZ1FvOHAwUXVlYmcvQkx4Y29JZmhHNjlSanMzc0xQcjQvbTN3T255cWkrUm5sVEdOQWdNQgpBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXCkJCVE93MHE1bVZYeXVOdGd2NmwrdlZhMWx6YW4xakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBeXFWVmpPUEkKUVc1cEo2ZDFFZTg4aGpadjBwM0dlRGdkYVphaWtta3VPR3liZlFUVWlhV3hNVGVLeVNITXEyek5peHlhMXI5SQowakptd1lyQTh5ODY3OERqMUpHRzBWRGpBOXR6ZDI5S09WUHQzaWJIdFgydkswTFJkV0xqU2lzQ3gxQkw0R25pCmxtd09SR1lRUkkrdEJldjRlYXltRytnM05KMVR5V0dxb2xLdlNuQVdoc0k2eUxFVGNEYll6KzcwQ2pUVlcwejkKQjV5aXV0a0JjbHp6VGNIZERyRWNEY1JqdnEzMEZQdUo3S0pCRGt6TXlGZEEwRzREcXMwTWpvbVptV3p3UERDdgpPTjl2dktPK0tTQW5xM1QvRXlKNDNwZFNWUjZEdFZRZ0ErNnV3RTlXM2pmTXczK3FCQ2U3MDNlNFl0c1hmSndvCkloTnpiTThtOVlvcDV3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMyIKIyBTZXJpYWw6IDE1NDU5MzEyOTgxMDA4NTUzNzMxOTI4Mzg0OTUzMTM1NDI2Nzk2CiMgTUQ1IEZpbmdlcnByaW50OiA3Yzo3Zjo2NTozMTowYzo4MTpkZjo4ZDpiYTozZTo5OTplMjo1YzphZDo2ZTpmYgojIFNIQTEgRmluZ2VycHJpbnQ6IGY1OjE3OmEyOjRmOjlhOjQ4OmM2OmM5OmY4OmEyOjAwOjI2OjlmOmRjOjBmOjQ4OjJjOmFiOjMwOjg5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3ZTozNzpjYjo4Yjo0Yzo0NzowOTowYzphYjozNjo1NToxYjphNjpmNDo1ZDpiODo0MDo2ODowZjpiYToxNjo2YTo5NToyZDpiMTowMDo3MTo3Zjo0MzowNTozZjpjMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1JqQ0NBYzJnQXdJQkFnSVFDNkZhK2gzZm9MVkpSSy9OSktCczdEQUtCZ2dxaGtqT1BRUURBekJsTVFzdwpDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1ClpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWcKUnpNd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxTVRJd01EQXdXakJsTVFzd0NRWURWUVFHRXdKVgpVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1ClkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSek13ZGpBUUJnY3EKaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFaNTd5c1JHWHR6YmcvV1B1TnNWZXBSQzBGRmZMdkMvOFFkSisxWWxKZgpabjRmNWR3YlJYa0x6TVpUQ3AyTlhRTFpxVm5lQWxyMmxTb09qVGhLaWtuR3ZNWURPQWRmVmRwK0NXN2lmMTdRClJTQVBXWFlRMXFBazhDM2VOdkpzS1RtalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC8KQkFRREFnR0dNQjBHQTFVZERnUVdCQlRMMEwycDRaZ0ZVYUZOTjZLRGVjNk5IU3JraERBS0JnZ3Foa2pPUFFRRApBd05uQURCa0FqQWxwSUZGQW1zU1MzVjBUOGdqNDNEeWRYTGVmSW53ejVGeVlaNWVFSkpaVnJtRHh4RG5PT2xZCkpqWjkxZVEwaGprQ01IdzJVL0F3NVdKak9wbml0cU03bXpUNkh0b1FrbkZla1JPbjNhUnVrc3d5MXZVaFpzY3YKNnBaamFtVkZrcFVCdEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEdsb2JhbCBSb290IEcyIgojIFNlcmlhbDogNDI5Mzc0MzU0MDA0Njk3NTM3ODUzNDg3OTUwMzIwMjI1MzU0MQojIE1ENSBGaW5nZXJwcmludDogZTQ6YTY6OGE6Yzg6NTQ6YWM6NTI6NDI6NDY6MGE6ZmQ6NzI6NDg6MWI6MmE6NDQKIyBTSEExIEZpbmdlcnByaW50OiBkZjozYzoyNDpmOTpiZjpkNjo2Njo3NjoxYjoyNjo4MDo3MzpmZTowNjpkMTpjYzo4ZDo0Zjo4MjphNAojIFNIQTI1NiBGaW5nZXJwcmludDogY2I6M2M6Y2I6Yjc6NjA6MzE6ZTU6ZTA6MTM6OGY6OGQ6ZDM6OWE6MjM6Zjk6ZGU6NDc6ZmY6YzM6NWU6NDM6YzE6MTQ6NGM6ZWE6Mjc6ZDQ6NmE6NWE6YjE6Y2I6NWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURqakNDQW5hZ0F3SUJBZ0lRQXpyeDVxY1JxYUM3S0dTeEhRbjY1VEFOQmdrcWhraUc5dzBCQVFzRkFEQmgKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JICk1qQWVGdzB4TXpBNE1ERXhNakF3TURCYUZ3MHpPREF4TVRVeE1qQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlQKTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1a2FXZHBZMlZ5ZEM1agpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3lNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF1emZOTk54N2E4bXlhSkN0U25YL1Jyb2hDZ2lOOVJsVXlmdUkKMi9PdThqcUprVHg2NXFzR0dtdlByQzNvWGdra1JMcGltbjdXbzZoKzRGUjFJQVdzVUxlY1l4cHNNTnphSHhteAoxeDdlL2RmZ3k1U0RONjdzSDBOTzNYc3MwcjB1cFMva3FiaXRPdFNacExZbDZadHJBR0NTWVA5UElVa1k5MmVRCnEyRUduSS95dXVtMDZaSXlhN1h6VitoZEc4Mk1IYXVWQkpWSjh6VXRsdU5KYmQxMzQvdEpTN1NzVlFlcGo1V3oKdENPN1RHMUY4UGFwc3BVd3RQMU1WWXduU2xjVWZJS2R6WE9TMHhaS0JneU1VTkdQSGdtK0Y2SG1JY3I5ZytVUQp2SU9sQ3NSbktQWnpGQlE5Um5iRGh4U0pJVFJOcnc5RkRLWkpvYnE3bk1XeE00TXBoUUlEQVFBQm8wSXdRREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVVGlKVUlCaVYKNXVOdTVnLzYrcmtTN1FZWGp6a3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBR0JuS0pSdkRraGo2ekhkNm1jWQoxWWw5UE1XTFNuL3B2dHNyRjkrd1gzTjNLaklUT1lGblFvUWo4a1ZuTmV5SXYvaVBzR0VNTktTdUlFeUV4dHY0Ck5lRjIyZCttUXJ2SFJBaUdmelowSkZyYWJBMFVXVFc5OGtuZHRoL0pzdzFIS2oyWkw3dGN1N1hVSU9HWlgxTkcKRmR0b20vRHpNTlUrTWVLTmhKN2ppdHJhbGo0MUU2VmY4UGx3VUhCSFFSRlhHVTdBajY0R3hKVVRGeThiSlo5MQo4ckdPbWFGdkU3RkJjZjZJS3NoUEVDQlYxL01VUmVYZ1JQVHFoNVV5a3c3K1UwYjZMSjMvaXlLNVM5a0pSYVRlCnBMaWFXTjBiZlZLZmpsbERpSUdrbmliVmI2M2REY1kzZmUwRGtodmxkMTkyN2p5TnhGMVdXNkxaWm02ek5UZmwKTXJZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEdsb2JhbCBSb290IEczIgojIFNlcmlhbDogNzA4OTI0NDQ2OTAzMDI5MzI5MTc2MDA4MzMzMzg4NDM2NDE0NgojIE1ENSBGaW5nZXJwcmludDogZjU6NWQ6YTQ6NTA6YTU6ZmI6Mjg6N2U6MWU6MGY6MGQ6Y2M6OTY6NTc6NTY6Y2EKIyBTSEExIEZpbmdlcnByaW50OiA3ZTowNDpkZTo4OTo2YTozZTo2Njo2ZDowMDplNjo4NzpkMzozZjpmYTpkOTozYjplODozZDozNDo5ZQojIFNIQTI1NiBGaW5nZXJwcmludDogMzE6YWQ6NjY6NDg6Zjg6MTA6NDE6Mzg6Yzc6Mzg6ZjM6OWU6YTQ6MzI6MDE6MzM6Mzk6M2U6M2E6MTg6Y2M6MDI6Mjk6NmU6Zjk6N2M6MmE6Yzk6ZWY6Njc6MzE6ZDAKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNQekNDQWNXZ0F3SUJBZ0lRQlZWV3ZQSmVwRFUxdzZRUDFhdEZjakFLQmdncWhrak9QUVFEQXpCaE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdQpaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkhNekFlCkZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4TWpBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVE1SVXcKRXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqYjIweApJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVjek1IWXdFQVlIS29aSXpqMENBUVlGCks0RUVBQ0lEWWdBRTNhZlp1NHE0Qy9zTGZ5SFM4TDYrYy9NelhScThOT3JleHB1ODBKWDI4TXpRQzdwaFcxRkcKZnA0dG4rNk9Zd3dYN0FkdzljK0VMa0NEbk9nL1FXMDdyZE9rRkZrMmVKMERRKzRRRTJ4eTNxNklwNkZydFVQTwpaOXdqL3dNY28rSStvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkCkJnTlZIUTRFRmdRVXM5dElwUG1oeGRpdU5rSE1FV05wWWltOFM4WXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXgKQUsyODhtdy9Fa3JSTFRuRENnbVhjL1NJTm95SUo3dm1pSTFRaGFkaitaNHkzbWFURC9ITXNRbVAzV3lyK210LwpvQUl3T1daYndtU051SjVRM0tqVlNhTHR4OXpSU1g4WEFiaklobzlPaklncnFKcXBpc1hSQUwzNFZPS2E1VnQ4CnN5Y1gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNCBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNCIKIyBTZXJpYWw6IDc0NTE1MDA1NTg5NzczNzA3Nzc5MzAwODQ4NjkwMTY2MTQyMzYKIyBNRDUgRmluZ2VycHJpbnQ6IDc4OmYyOmZjOmFhOjYwOjFmOjJmOmI0OmViOmM5OjM3OmJhOjUzOjJlOjc1OjQ5CiMgU0hBMSBGaW5nZXJwcmludDogZGQ6ZmI6MTY6Y2Q6NDk6MzE6Yzk6NzM6YTI6MDM6N2Q6M2Y6Yzg6M2E6NGQ6N2Q6Nzc6NWQ6MDU6ZTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU1OjJmOjdiOmRjOmYxOmE3OmFmOjllOjZjOmU2OjcyOjAxOjdmOjRmOjEyOmFiOmY3OjcyOjQwOmM3OjhlOjc2OjFhOmMyOjAzOmQxOmQ5OmQyOjBhOmM4Ojk5Ojg4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGa0RDQ0EzaWdBd0lCQWdJUUJac2JWNTZPSVRMaU9RZTlwM2QxWERBTkJna3Foa2lHOXcwQkFRd0ZBREJpCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0V3SHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZwpSelF3SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmlNUXN3Q1FZRFZRUUdFd0pWClV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXUKWTI5dE1TRXdId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnUnpRd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDLzVwQnphTjY3NUYxS1BEQWlNR2t6N01LbkpTN0pJVDN5Cml0aFp3dUVwcHoxWXEzYWF6YTU3RzRRTnhEQWY4eHVrT0JiclZzYVhiUjJyc25ueXloSFM1Ri9XQlR4U0QxSWYKeHA0VnBYNituNmxYRmxsVmNxOW9rM0RDc3JwMW1XcHpNcFRSRUVRUUx0K0M4d2VFNW5RN2JYSGlMUXdiN2lEVgp5U0FkWXlrdHp1eGVUc2lUK0NGaG16VHJCY1plN0ZzYXZPdkp6ODJzTkVCZnNYcG03bmZJU0tobVYxZWZWRmlPCkRDdTNUNmN3MlZidXludGQ0NjNKVDE3bE5lY3h5OXFUWHR5T2o0RGF0cEdZUUpCNXczakh0ckhFdFdvWU9BTVEKamRqVU42UXVCWDJJOVlJK0VKRndxMVdDUVRMWDJ3UnpLbTZSQVh3aFROUzhyaHNEZFYxNFp0azZNVVNhTTBDLwpDTmRhU2FUQzVxbWdaOTJrSjd5aFR6bTFFVmdYOXlSY1JvOWs5OEZwaUhhWWRqMVpYVUoyaDRtWGFYcEk4T0NpCkVodG1tblRLM2tzZTV3NWpydWJVNzVLU09wNDkzQURrUlNXSnRwcEVHU3Qrd0pTMDBtRnQ2elBaeGQ5TEJBRE0KZlJ5Vnc0LzNJYkt5RWJlN2YvTFZqSEFzUVdDcXNXTVlSSlVhZG1KKzlvQ3crK2hrcGpQUmlRZmh2YmZtUTZRWQp1S1ozQWVFUGxBd2hIYkpVS1NXSmJPVU9VbEZIZEw0bXJMWkJkZDU2ckYrTlA4bTgwMEVSRWx2bEVGRHJNY1hLCmNoWWlDZDk4VEhVL1krd2hYOFFnVVd0dnNhdUdpMC9DMWtWZm5TRDhvUjdGd0kraXNYNEtKcG4xNUdrdm1CMHQKOWRtcHNoM2xHd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpoakFkQmdOVkhRNEVGZ1FVN05mamd0SnhYV1JNM3k1blArZTZtSzRjRDA4d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBTHRoMlgycGJMNFh4SkVidzZHaUFJM2paR2dQVnM5M3JuRDUvWnBLbWJuSmVGd01ERi9rNWhRcFZnczIKU1YxRVkrQ3RuSllZWmhzakRUMTU2VzFyMWxUNDBqekJRMEN1SFZEMVV2eVFPN3VZbVdscng4R25xR2lrSjl5ZAorU2V1TUlXNTltZE5PajZQV1RraVUwVHJ5RjBEeXUxUWVuMWlJUXFBeUhObTBhQUZZRi9vcGJTbnI2ajNiVFdjCmZGcUsxcUk0bWZONGkvUk4waUFMM2dUdWpKdEhnWElOd0JReTd6QlpMcTdnY2ZKVzVHcVhiNUpRYlphTmFIcWEKc2pZVWVnYnlKTGtKRVZEWENMRzRpWHFFSTJGQ0tlV2p6YUlnUWRmUm5HVFo2aWFoaXhUWFRCbXlVRUZ4UFQ5TgpjQ09HREVyY2dkTE1NcFNFRFFnSmx4eFB3TzVySUhRdzB1QTVOQkNGSVJVQkNPaFZNdDV4U2Rrb0YxQk41cjVOCjBYV3MwTXI3UWJoRHBhclR3d1ZFVHl3Mm0rTDY0a1c0STFOc0JtOW5WWDlHdFV3L2JpaGFlU2JTcEtoaWw5SWUKNHUxS2k3d2IvVWRLRGQ5blpuNnlXMEhRTytUME8vUUVZK252d2xRQVVhQ0tLc25PZU16VjZvY0VHTFBPcjBtSQpyL09TbWJhejVtRVAwb1VBNTFBYTVCdVZuUm1odVp5eG03RUFIdS9RRDA5Q2JNa0t2TzVEK2pweHBjaE5KcVUxCi9ZbGR2SVZpSFRMU29DdFU3WnBYd2R2NkVNOFp0NHRLRzQ4QnRpZVZVK2kyaVcxYnZHalVJK2lMVWFKVytmQ20KZ0tEV0hyTzhEdzlUZFNtcTZoTjM1TjZNZ1NHdEJ4QkhFYTJIUFFmUmRielA4MlorCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBMYWJlbDogIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMDE5MDkwODQ1Mzc1ODIwOTMzMDg5NDEzNjM1MjQ4NzMxOTMxMTcKIyBNRDUgRmluZ2VycHJpbnQ6IDFiOjMxOmIwOjcxOjQwOjM2OmNjOjE0OjM2OjkxOmFkOmM0OjNlOmZkOmVjOjE4CiMgU0hBMSBGaW5nZXJwcmludDogYWY6ZTU6ZDI6NDQ6YTg6ZDE6MTk6NDI6MzA6ZmY6NDc6OWY6ZTI6Zjg6OTc6YmI6Y2Q6N2E6OGM6YjQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDUyOmYwOmUxOmM0OmU1OjhlOmM2OjI5OjI5OjFiOjYwOjMxOjdmOjA3OjQ2OjcxOmI4OjVkOjdlOmE4OjBkOjViOjA3OjI3OjM0OjYzOjUzOjRiOjMyOmI0OjAyOjM0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMkRDQ0E4Q2dBd0lCQWdJUVRLcjV5dHRqYitBZjkwN1lXd09HblRBTkJna3Foa2lHOXcwQkFRd0ZBRENCCmhURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEcKQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVgpCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNVEU1Ck1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1QKRWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUgpRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QlNVMEVnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ1IKNkZTUzBncFdzYXdOSk4zRnowUm5kSmtyTjZOOUkzQUFjYnhUMzhUNktoS1BTMzhRVnIyZmNISzNZWC9KU3c4WApwejNqc0FSaDd2OFJsOGYwaGo0SytqNWMrWlBtTkhyWkZHdm5uTE9Gb0lKNmRxOXhrTmZzL1EzNm5HejYzN0NDCjlCUisrYjdFcGk5UGY1bC90ZnhuUTNLOURBRFdpZXRyTE5QdGo1Z2NGS3QrNWVOdS9OaW81SklrMmtOcllyaFYKL2VyQnZHeTJpL01Palpya20yeHBtZmg0U0RCRjFhM2hEVHhGWVB3eWxsRW52R2ZEeWk2MmErcEd4OGNnb0xFZgpaZDVJQ0xxa1RxbnlnMFkzaE92b3pJRklRMmRPY2lxYlhMMU1HeWlLWENKN3RLdVkyZTdnVVlQRENVWk9iVDZaCitwVVgybnd6VjBFOGpWSHRDN1pjcnl4akd0OVh5RCs4NlYzRW02OUZtZUtqV2lTMHVxbFdQYzl2cXY5SldMN3cKcVAvMHVLM3BOL3U2dVBRTE92bm9RMEllaWRpRXl4UHgyYnZoaVdDNGpDaFdyQlFkbkFybmNldlBEdDA5cVphaApTTDA4OTYrMURTSk13QkdCN0ZZNzl0T2k0bHUzc2dRaVVwV0FrMm5vamt4bDhaRURMWEIwQXVxTFp4VXBhVklDCnU5ZmZVR3BWUnIrZ295aGhmM0RRdzZLcUxDR3FSODRvbkFaRmRyK0NHQ2UwMWE2MHkxRG1hL1JNaG5FdzZhYmYKRm9iZzJQOUEzZnZRUW9oL296TTZMbHdlUVJHQlk4NFljV3NyN0thS3R6RmNPbXBINE1ONVdkWWdHcS95YXBpcQpjcnhYU3RKTG5ic1EvTEJNUWVYdEhUMWVLSjJjekwrelVkcW5SK1dFVXdJREFRQUJvMEl3UURBZEJnTlZIUTRFCkZnUVV1NjkrQWozNnB2RThoSTZ0N2ppWTdOa3lNdFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUFyeDFVYUV0NjVSdTJ5eVRVRVVBSk5Nbk12bAp3RlRQb0NXT0F2bjlzS0lOOVNDWVBCTXRyRmFpc05aK0VaTHBMcnFlTHBweXNiMFpSR3hoTmFLYXRCWVNhVnFNCjRkYytwQnJvTHdQMHJtRWRFQnNxcEl0NnhmNEZwdUhBMXNqK25xNlBLN285bWZqWWN3bFlSbTZtblBUWEo5T1YKMmplRGNoelRjK0NpUjVrRE9GM1ZTWGtBS1J6SDdKc2dIQWNrYVZkNHNqbjhPb1NndFp4OGpiOHVrMkludHpuYQpGeGl1dlR3SmFQK0VtenpWMWdzRDQxZWVGUGZSNjAvSXZZY2p0N1pKUTNtRlhMcnJrZ3VoeHVob3FFd1dzUnFaCkN1aFRMSks3b1FrWWRReGxxSHZMSTdjYXdpaUZ3eHYvMEN0aTc2UjdDWkdZWjR3VUFjMW9CbXBqSVhVRGdJaUsKYm9IR2hmS3BwQzNuOUtVa0VFZUR5czMwalhsWXNRYWI1eG9xMlowQjE1Ujk3UU5LeXZEYjZLa0JQdlZXbWNrZQpqa2s5dStVSnVlQlBTWkk5Rm9KQXpNeFp4dVk2N1JJdWFUeHNsYkg5cWgxN2Y0YStIZzR5UnZ2N0U0OTFmMHlMClMwWmovZ0EwUUhEQnc3bWgzYVp3NGdTelFienBnSkhxWkp4NjRTSURxWnh1Ync1bFQyeUhoMTd6YnFENWRhV2IKUU9oVHNpZWRTcm5BZHlHTi80ZnkzcnlNN3hmZnQwa0wwZkp1TUFzYURrNTI3Ukg4OWVsV3NuMi94MjBLazR5bAowTUMySGI0NlRwU2kxMjVzQzhLS2ZQb2c4OFRrNWMwTnFNdVJrckY4aGV5MUZHbG1Eb0xuemM3SUxhWlJmeUhCCk5WT0ZCa3BkbjYyN0cxOTAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1VU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgTGFiZWw6ICJVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMjY0NTA5Mzc2NDc4MTA1ODc4NzU5MTg3MTY0NTY2NTc4ODcxNwojIE1ENSBGaW5nZXJwcmludDogMWI6ZmU6Njk6ZDE6OTE6Yjc6MTk6MzM6YTM6NzI6YTg6MGY6ZTE6NTU6ZTU6YjUKIyBTSEExIEZpbmdlcnByaW50OiAyYjo4ZjoxYjo1NzozMzowZDpiYjphMjpkMDo3YTo2Yzo1MTpmNzowZTplOTowZDpkYTpiOTphZDo4ZQojIFNIQTI1NiBGaW5nZXJwcmludDogZTc6OTM6Yzk6YjA6MmY6ZDg6YWE6MTM6ZTI6MWM6MzE6MjI6OGE6Y2M6YjA6ODE6MTk6NjQ6M2I6NzQ6OWM6ODk6ODk6NjQ6YjE6NzQ6NmQ6NDY6YzM6ZDQ6Y2I6ZDIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYzakNDQThhZ0F3SUJBZ0lRQWYxdE1QeWp5bEdvRzd4a0RqVURMVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0IKaURFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbApjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WCkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXcKTWpBeE1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVgpCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVCmFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnkKZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFDQUVtVVhOZzdEMndpejBLeFhEWGJ0elNmVFRLMVFnMkhpcWlCTkNTMWtDZHpPaVovTVBhbnM5cy9CCjNQSFRzZFo3TnlnUkswZmFPY2E4T2htMFg2YTlmWjJqWTBLMmR2S3BPeXVSK09KdjBPd1dJSkFKUHVMb2RNa1kKdEpIVVltVGJmNk1HOFlnWWFwQWlQTHorRS9DSEZIdjI1QitPMU9SUnhoRm5SZ2hSeTRZVVZEKzhNLzUrYkp6LwpGcDBZdlZHT05hYW5ac2h5WjlzaFpySFVtM2dEd0ZBNjZNenczTHllVFA2dkJaWTFIMWRhdC8vTytUMjNMTGIyClZOM0k1eEk2VGE1TWlyZGNtclMzSUQzS2Z5STBybjQ3YUdZQlJPY0JUa1pUbXpOZzk1UytVemVRYzBQek1zTlQKNzl1cS9uUk9hY2RyakdDVDNzVEhETi9oTXE3TWt6dFJlSlZuaSs0OVZ2NE0wR2tQR3cvekpTWnJNMjMzYmtmNgpjMFBsZmc2bFpyRXBmREtFWTFXSnhBM0JrMVF3R1JPczAzMDNwK3RkT213MVhOdEIxeExhcVVrTDM5aUFpZ21UCllvNjFaczhsaU0yRXVMRS9wRGtQMlFLZTZ4Sk1sWHp6YXdXcFhoYUR6TGhuNHVnVG5jeGJndE5NcysxYi85N2wKYzZ3ak95MEF2elZWZEFsSjJFbFlHbitTTnVaUmtnN3pKbjBjVFJlOHlleERKdEMvUVY5QXFVUkU5Sm5uVjRlZQpVQjlYVktnKy9YUmpMN0ZRWlFubVdFSXVReHBNdFBBbFIxbjZCQjZUMUNaR1NsQ0JzdDYrZUxmOFp4WGh5VmVFCkhnOWoxdWxpdXRaZlZTN3FYTVlvQ0FRbE9iZ09LNm55VEpjY0J6OE5Vdlh0N3krQ0R3SURBUUFCbzBJd1FEQWQKQmdOVkhRNEVGZ1FVVTNtL1dxb3JTczlVZ09IWW04Q2Q4cklEWnNzd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4RwpBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFGelVmQTNQOXdGOVFabGxESFBGClVwL0wrTStaQm44YjJrTVZuNTRDVlZlV0ZQRlNQQ2VIbENqdEh6b0JONkoyL0ZOUXdJU2J4bXRPdW93aFQ2S08KVldLUjgya1YyTHlJNDhTcUMvM3ZxT2xMVlNvR0lHMVZlQ2taN2w4d1hFc2tFVlgvSkpwdVhpb3I3Z3RObjMvMwpBVGlVRkpWREJ3bjdZS251SEtzU2pLQ2FYcWVZYWxsdGl6OEkrOGpSUmE4WUZXU1FFZzl6S0M3RjRpUk8vRmpzCjhQUkYvaUt6NnkrTzB0bEZZUVhCbDIrb2RuS1BpNHcycjc4TkJjNXhqZWFtYng5c3BuRml4ZGpRZzNJTThXY1IKaVF5Y0UweHlOTis4MVhIZnFuSGQ0YmxzakR3U1hXWGF2VmNTdGtOci8rWGVUV1lSVWMrWnJ1d1h0dWh4a1l6ZQpTZjdkTlhHaUZTZVVITTloNHlhN2I2Tm5KU0ZkNXQwZEN5NW9HenVDcit5RFo0WFVtRkYwc2JtWmdJbi9mM2daClhIbEtZQzZTUUs1TU55b3N5Y2RpeUE1ZDl6WmJ5dUFsSlFHMDNSb0huSGNBUDlEYzFldzkxUHE3UDh5RjFtOS8KcVMzZnVRTDM5WmVhdFRYYXcyZXdoMHFwS0o0amp2OWNKMnZoc0UvekIrNEFMdFJaaDh0U1FaWHE5RWZYN21SQgpWWHlOV1FLVjNXS2R3cm51V2loMGhLV2J0NURIREFmZjlZazJkRExXS01Hd3NBdmduRXpESE5iODQybTFSMGFCCkw2S0NxOU5qUkhERWpmOHRNN3F0ajN1MWNJaXVQaG5QUUNqWS9NaVF1MTJaSXZWUzVsakZINGd4USs2SUhkZkcKamp4RGFoMm5HTjU5UFJieFl2bktrS2o5Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1VU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgU3ViamVjdDogQ049VVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIExhYmVsOiAiVVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEyMzAxMzgyMzcyMDE5OTQ4MTQ1NjU2OTcyMDQ0Mzk5NzU3MjEzNAojIE1ENSBGaW5nZXJwcmludDogZmE6Njg6YmM6ZDk6YjU6N2Y6YWQ6ZmQ6Yzk6MWQ6MDY6ODM6Mjg6Y2M6MjQ6YzEKIyBTSEExIEZpbmdlcnByaW50OiBkMTpjYjpjYTo1ZDpiMjpkNToyYTo3Zjo2OTozYjo2Nzo0ZDplNTpmMDo1YToxZDowYzo5NTo3ZDpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogNGY6ZjQ6NjA6ZDU6NGI6OWM6ODY6ZGE6YmY6YmM6ZmM6NTc6MTI6ZTA6NDA6MGQ6MmI6ZWQ6M2Y6YmM6NGQ6NGY6YmQ6YWE6ODY6ZTA6NmE6ZGM6ZDI6YTk6YWQ6N2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqekNDQWhXZ0F3SUJBZ0lRWEl1WnhWcVV4ZEp4VnQ3TmlZRE1KakFLQmdncWhrak9QUVFEQXpDQmlERUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObAplU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1UCkpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01qQXgKTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVApDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnClZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG0KYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUWFyRlJhcWZsbwpJK2Q2MVNSdlU4WmEyRXVyeHRXMjBlWnpjYTdkbk5ZTVlmM2JvSWtEdUFVVTdGZk83bDAvNGlHenp2ZlVpbm5nCm80TitMWmZRWWNUeG1kd2xrV09yZnpDanRIRGl4NkV6blBPL0xseFRzVit6ZlRKL2lqVGplWG1qUWpCQU1CMEcKQTFVZERnUVdCQlE2NFFtRzFNOFp3cFoyZEVsMjNPQTF4bU5qbWpBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpBMlo2RVdDTnprbHdCQkhVNis0V01CCnp6dXFRaEZrb0oyVU9RSVJlVng3SGZwa3VlNFdRck8vaXNJSnhPemtzVTBDTVFEcEttRkhqRkpLUzA0WWNQYlcKUk5adTlZTzZiVmk5Sk5sV1NPcnZ4S0pHZ1locU9rYlJxWnROeVdIYTBWMVhhaGc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQKIyBMYWJlbDogIkdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNCIKIyBTZXJpYWw6IDE0MzY3MTQ4Mjk0OTIyOTY0NDgwODU5MDIyMTI1ODAwOTc3ODk3NDc0CiMgTUQ1IEZpbmdlcnByaW50OiAyMDpmMDoyNzo2ODpkMTo3ZTphMDo5ZDowZTplNjoyYTpjYTpkZjo1Yzo4OTo4ZQojIFNIQTEgRmluZ2VycHJpbnQ6IDY5OjY5OjU2OjJlOjQwOjgwOmY0OjI0OmExOmU3OjE5OjlmOjE0OmJhOmYzOmVlOjU4OmFiOjZhOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZTpjOTo0OToxMTpjMjo5NTo1Njo3NjpkYjo2YzowYTo1NTowOTo4NjpkNzo2ZTozYjphMDowNTo2Njo3Yzo0NDoyYzo5Nzo2MjpiNDpmYjpiNzo3MzpkZToyMjo4YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQjRUQ0NBWWVnQXdJQkFnSVJLamlrSEpZS0JONUNzaWlsQytnMG1BSXdDZ1lJS29aSXpqMEVBd0l3VURFawpNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTBNUk13RVFZRFZRUUtFd3BICmJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1gKRFRNNE1ERXhPVEF6TVRRd04xb3dVREVrTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRApRU0F0SUZJME1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1Ck1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXVNWjUwNDlzSlE2Zkxqa1pIQU9rcnBybE9RY0oKRnNwanNibUcrSXBYd1ZmT1F2cHpvZmRsUXY4ZXdRQ3libk1PLzhjaDVSaWtxdGx4UDZqVXVjNk1IYU5DTUVBdwpEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZGU3dlNjFGCnVPSkFmL3NLYnZ1K004azhvNFRWTUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFEY2txR2dFNmJQQTdEbXhDR1gKa1BvVVZ5MEQ3TzQ4MDI3S3FHeDJ2S0xldXdJZ0o2aUZKeldiVnNhajhrZlN0MjRiQWdBWHFtZW1GWkhlK3BUcwpld3Y0bjRRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1CiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1CiMgTGFiZWw6ICJHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUiCiMgU2VyaWFsOiAzMjc4NTc5MjA5OTk5MDUwNzIyNjY4MDY5ODAxMTU2MDk0NzkzMTI0NAojIE1ENSBGaW5nZXJwcmludDogOWY6YWQ6M2I6MWM6MDI6MWU6OGE6YmE6MTc6NzQ6Mzg6ODE6MGM6YTI6YmM6MDgKIyBTSEExIEZpbmdlcnByaW50OiAxZjoyNDpjNjozMDpjZDphNDoxODplZjoyMDo2OTpmZjphZDo0ZjpkZDo1Zjo0NjozYToxYjo2OTphYQojIFNIQTI1NiBGaW5nZXJwcmludDogMTc6OWY6YmM6MTQ6OGE6M2Q6ZDA6MGY6ZDI6NGU6YTE6MzQ6NTg6Y2M6NDM6YmY6YTc6ZjU6OWM6ODE6ODI6ZDc6ODM6YTU6MTM6ZjY6ZWI6ZWM6MTA6MGM6ODk6MjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNIakNDQWFTZ0F3SUJBZ0lSWUZsSjRDWXV1MVg1Q25lS2NmbEsyR3d3Q2dZSUtvWkl6ajBFQXdNd1VERWsKTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSApiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1TUI0WERURXlNVEV4TXpBd01EQXdNRm9YCkRUTTRNREV4T1RBek1UUXdOMW93VURFa01DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkQKUVNBdElGSTFNUk13RVFZRFZRUUtFd3BIYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdQpNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRVIwVU9sdnQ5WGIvcE9kRWgrSjhMdHRWN0hwSTZTRmtjCjhHSXhMY0I2S1A0YXAxeXp0c3lYNTBYVVdQclJkMjFEb3NDSFpUUUtIM3JkNnp3em9jV2RUYVJ2UVpVNGY4a2UKaE92Um5rbVNoNVNIRERxRlNtYWZuVm1UVFpkaEJvWktvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVBlWXBTSnZxQjhvaFJFb20zbTdlMG9QUW4xa3dDZ1lJCktvWkl6ajBFQXdNRGFBQXdaUUl4QU9WcEVzbHUyOFl4dWdsQjRaZjQrLzJhNG4wU3llMThaTlBMQlNXTFZ0bWcKNTE1ZFRndURuRnQyS2FBSkppRnFZZ0l3Y2RLMWoxenFPK0Y0Q1lXb2RaSTd5Rno5U084TmRDS29DT0p1eFVuTwp4d3k4cDJGcDhmYzc0U3JMK1N2elpwQTMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczIgojIFNlcmlhbDogMTAwMDMwMDEKIyBNRDUgRmluZ2VycHJpbnQ6IDBiOjQ2OjY3OjA3OmRiOjEwOjJmOjE5OjhjOjM1OjUwOjYwOmQxOjBiOmY0OjM3CiMgU0hBMSBGaW5nZXJwcmludDogZDg6ZWI6NmI6NDE6NTE6OTI6NTk6ZTA6ZjM6ZTc6ODU6MDA6YzA6M2Q6YjY6ODg6OTc6Yzk6ZWU6ZmMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNjOjRmOmIwOmI5OjVhOmI4OmIzOjAwOjMyOmY0OjMyOmI4OjZmOjUzOjVmOmUxOjcyOmMxOjg1OmQwOmZkOjM5Ojg2OjU4OjM3OmNmOjM2OjE4OjdmOmE2OmY0OjI4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZERDQ0ExeWdBd0lCQWdJRUFKaWlPVEFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNzd0tRWURWUVFERENKVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnVW05dmRDQkRRU0F0SUVjek1CNFhEVEV6TVRFeE5ERXhNamcwTWxvWApEVEk0TVRFeE16SXpNREF3TUZvd1dqRUxNQWtHQTFVRUJoTUNUa3d4SGpBY0JnTlZCQW9NRlZOMFlXRjBJR1JsCmNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdUlGSnYKYjNRZ1EwRWdMU0JITXpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTDR5b2xRUApjUHNzWEZucmJNU2tVZWlGS3JQTVNqVHlzRi96RHNjY1BWTWVpQWhvMkc4OXJjS2V6SUpuQnllSGFIRTZuM1dXCklrWUZzTzJ0eDF1ZUt0NmMvRHJHbGFmMUYyY1k1eTlKQ0F4Y3orYk1OTzE0KzFDeDNHc3k4S0wrdGp6azdGcVgKeHo4ZWNBZ3dvTnpGczIxdjBJSnlFYXZTZ1doWmdoZTNlSkpnK3N6ZVA0VHJqVGd6a0FweUkvbzF6Q1p4TWRGeQpLSkxaV3lOdFpyVnRCMExycGpQT2t0dkE5bXhqZU0zS1RqMjE1VktiOGI0NzVsUmdzR1llQ2FzSC9sU0pFVUxSCjl5UzZZSGdhbVBmSkVmMFd3VFVhVkhYdlE5UGxyazdPNTN2RHhrNWhVVXVybWtWTG9SOUJ2VWhURlhGa0M0YXoKNVM2K3pxUWJ3U21Fb3JYTENDTjJReUlrSHhjRTFHNmN4dngvSzJZYTdJcmwxczlOOVdNSnR4VTUxbnVzNitOOAo2VTc4ZFVMSTdWaVZEQVpDb3B6MzVIQ3ozM0p2V2pkQWlkaUZwTmZ4Qzk1REdkUktXQ3lNaWptZXY0U0g4Ulk3Ck5nenAwN1RLYkJsQlVnbWhIYkJxdjRMdmNGRWhNdHdGZG96TDkyVGtBMUN2akpGbnE4WHk3bGpZM3I3MzV6SFAKYk1rN2NjSFZpTFZsdk1Eb0Z4Y0hFclZjMHFzZ2s3VG1nb053TnNYTm80MnRpK3lqd1VPSDVrUGlOTDZWaXpYdApCem5hcUIxNm56YWVFckFNWlJLUUZXRFpKa0JFNDFaZ3BSRFVhano5UWR3T1drZTI3NWRoZFUvWi9zZXlIZFR0ClhVbXpxV3JMWm9RVDFWeWczTjl1ZHdiUmNYWElWMit2RDNkYkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUlVyZnJIa2xldXlqV2NMaEw3NUxwZApJTnlVVnpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQU1KbWRCVExJWGc0N21BRTZpcVRuQi9kNitPZWEzMUJEClU1Y3FQY284UjVndTRSVjc4Wkx6WWRxUUpSWmx3SjlVWFE0RE8xdDNBcHlFdGcyWVh6VGRPMlBDd3lpQndwd3AKTGluaXlNTUI4alBxS3FyTUNRajNaV2ZHemQvVHRpdW52Y3pSRG5CZnVDUFJ5NUZPQ3ZUSWV1WFpZemJCMU4vOApJcGYzWUYzcUtTOVlzcjFZdlkyV1R4QjF2MGg3UFZHSG9UeDBJc0w4QjMrQTNNU3MvbXJCY0RDdzZZNXA0aXhwCmdaUUp1dDMrVGNDRGpKUll3RVlncjV3ZkF2ZzFWVWt2UnRUQThLQ1dBZzh6eFhIem5pTjlsTGY5T3RNSmd3WWgKL1dBOXJqTEEwdTZOcHZEbnRJSjhDc3h3eVhtQStQNU05eldFR1lveCt3cloxMytiOEtLYWE4TUZTdTFCWUJRdwowYW9SUW03VEl3SUVDOFpsM2QxU2Q5cUJhN0tvK2dFNHVaYnFLbXhubDRtVW5yemhWTlhrYW5qdlNyMHJtajFBCmZzYkFkZEp1KzJndzdPeUxuZmxKTlpvYUxObXpsVG5WSHBMM3BybGxMK1U5YlRwSVRBamM1Q2dTS0w1OU5WenEKNEJaK0V4dHExejdYbnZ3dGRiTEJGTlVqQTl0YmJ3cytlQzhOM2pPTkZyZEk1NE9hZ1E5N3dVTk5WUVFYT0VwUgoxVm1paVhUVG43NGVTOWZHYmJlSUpHOWdrYVNDaFZ0V1FielFSS3RxRTc3UkxGaTNFak5Zc2pkajNCUDFsQjAvClFGSDFUL1U2N2NqRjY4SWVIUmFWZXNkK1FuR1Ria3NWdHpEZnF1MVhoVWlzSFdyZE9Xbms0WGw0dnM0RnY2RU0KOTRCN0lXY25NRms9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQSBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQSIKIyBTZXJpYWw6IDEwMDAwMDEzCiMgTUQ1IEZpbmdlcnByaW50OiBmYzowNjphZjo3YjplODoxYTpmMTo5YTpiNDplODpkMjo3MDoxZjpjMDpmNTpiYQojIFNIQTEgRmluZ2VycHJpbnQ6IDc2OmUyOjdlOmMxOjRmOmRiOjgyOmMxOmMwOmE2Ojc1OmI1OjA1OmJlOjNkOjI5OmI0OmVkOmRiOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0ZDoyNDo5MTo0MTo0YzpmZTo5NTo2Nzo0NjplYzo0YzplZjphNjpjZjo2Zjo3MjplMjo4YToxMzoyOTo0MzoyZjo5ZDo4YTo5MDo3YTpjNDpjYjo1ZDphZDpjMTo1YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNEQ0NBMWlnQXdJQkFnSUVBSmlXalRBTkJna3Foa2lHOXcwQkFRc0ZBREJZTVFzd0NRWURWUVFHRXdKTwpUREVlTUJ3R0ExVUVDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Ta3dKd1lEVlFRRERDQlRkR0ZoCmRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0Z1JWWWdVbTl2ZENCRFFUQWVGdzB4TURFeU1EZ3hNVEU1TWpsYUZ3MHkKTWpFeU1EZ3hNVEV3TWpoYU1GZ3hDekFKQmdOVkJBWVRBazVNTVI0d0hBWURWUVFLREJWVGRHRmhkQ0JrWlhJZwpUbVZrWlhKc1lXNWtaVzR4S1RBbkJnTlZCQU1NSUZOMFlXRjBJR1JsY2lCT1pXUmxjbXhoYm1SbGJpQkZWaUJTCmIyOTBJRU5CTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0OGQraWZra1N6clMKTTRNMUxHbnMzQW1rNDFHb0pTdDV1QWc5NEpHNmhJWEdoYVRLNXNrdVU2VEpKQjc5VldaeFhTekZZR2dFdDluQwpVaVk0aUtUV08wQ213czAvelppVHMxUVVXSlpWMVZEK2hxMmtZMzljaC9hTzVpZVNaeGVTQWdNczNOWm1kTzNkClovL0JZWTFqVHcrYmJSY3dKdStyMGg4UW9QbkZmeFpwZ1FOSDdSNW9qWEtoVGJJbXhycHNYMjNXcjlHeEU0NnAKcmZOZWFYVW1HRDVCS3lGLzdvdGRCd2FkUThRcENpdjhLajZHeXp5RE92bkpEZHJGbWVLOGVFRXpkdUcvTDEzbApwSmhRREJYZDRQcWNmemhvMExLbWVxZlJNYjEraWxnblE3TzZNNUhUcDVnVlhKcm0wdzkxMmZ4Qm1KYytxaVhiCmo1SXVzSHNNWC9GanFUZjVtM1ZwVENnbUpkclY4aEp3UlZYajMzTmVOL1VoYkpDT05WckoweVByMDhDK2VLeEMKS0ZobXBVWnRjQUxYRVBsTFZQeGRoa3FIejMvS1Jhd1JXclVnVVkwdmlFZVhPY0RQdXNCQ0FVQ1pTQ0VMYTZmUwovWmJWMGI1R25VbmdDNmFnSWs0NDBNRThNTHh3anl4MXpOREZqRkU3UFpRSVpDWmhmYm5EWlk4VW5DSFFxdjBYCmNnT1B2WnVNNWw1VG5ybWQ3NEs3NGJ6aWNrRmJJWlRUUlRlVTBkOEpPVjNuSTZxYUhjcHRxQXFHaFlxQ3ZrSUgKMXZJNGduUGFoMXZsUE5PZVBxYzdudlFEcy9ueGZSTjBBdis3b2VYNkFIa2NwbVpCaUZ4Z1Y2WXVDY1M2L1pyUApweDlBdzd2TVdncFZTenM0ZGxHNFk0dUVsQmJtVnZNQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZQNnJBSkNZbmlUOHFjd2FpdnNudUw4d2JxZzcKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFEUGR5eHVWcjVPczdhRUFKU3JSOGtOMG5iSGhwOGRCOU8ydExzSQplSzlwMGd0SjNqUEZySzNDaUFKOUJyYzFBc0ZneWIvRTZKVGUxTk9wRXlWYS9tNmlybjBGM0gzemJQQitwbzN1CjJkZk9XQmZvcVNtdWMwaUg1NXZLYmltaFpGOFpFL2V1QmhEL1VjYWJUVlVsVDVPWkVBRlRkZkVUenNlbVFVSFMKdjRpbGYwWDhyTGlsdFRNTWdzVDdCL1pxNVNXRVh3Ykt3WVk1RWR0WXpYYzdMTUpNRDE2YTQvQ3JQbUViVUNUQwp3UFR4R2ZBUktiYWxHQUtiMTJOTWNJeEhvd05EWExsZFJxQU5iLzlaanI3ZG4zTERXeXZmakZ2TzVReEdiSkt5CkNxTk1WRUlZRlJJWXZkcjh1blJ1LzhHMm9HVFlxVjlWcnA5Y2FuYVcySE5uaC90TmYxenVhY3B6RVB1S3FmMmUKdlRZNFNVbUg5QTRVOE9tSHVEK25UM3Bham5uVWsrUzdhRktFckd6cDg1aHdWWEl5K1RTckswbTF6U0JpNURwNgpaMk9ybHR4dHJwZnMvSjkyVm9ndVpzOWJ0c21rc05jRnV1RW5MNU83SmlxaWs3QWI4NDYrSFVDanVUYVBQb0lhCkdsNkk2bEQ0V2VLRFJpa0w0MFJjNFpXMmFaQ2FGRytYcm9IUGFPK1ptcjYxNStGLytQb1RSeFpNekcwSVFPZUwKZUc5UWdrUlFQMllHaXF0RGhGWktEeUF0aGc3MTB0dlNlb3BMemFYb1R2RmVKaVVCV1NPZ2Z0TDJmaUZYMXllOApGVmRNcEViQjRJTWVERXhOSDA4R0dlTDVxUFE2Z3FHeWVVTjUxcTF2ZWllUUE2VHFKSWMvMmIzWjZmSmZVRWtjCjd1elhMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBMYWJlbDogIklkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDEzMjk4ODIxMDM0OTQ2MzQyMzkwNTIwMDAzODc3Nzk2ODM5NDI2CiMgTUQ1IEZpbmdlcnByaW50OiBiMzozZTo3Nzo3Mzo3NTplZTphMDpkMzplMzo3ZTo0OTo2Mzo0OTo1OTpiYjpjNwojIFNIQTEgRmluZ2VycHJpbnQ6IGRmOjcxOjdlOmFhOjRhOmQ5OjRlOmM5OjU1Ojg0Ojk5OjYwOjJkOjQ4OmRlOjVmOmJjOmYwOjNhOjI1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1ZDo1Njo0OTo5YjplNDpkMjplMDo4YjpjZjpjYTpkMDo4YTozZTozODo3MjozZDo1MDo1MDozYjpkZTo3MDo2OTo0ODplNDoyZjo1NTo2MDozMDoxOTplNToyODphZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVFDZ0ZDZ0FBQUFVVWp5RVMxQUFBQUFqQU5CZ2txaGtpRzl3MEJBUXNGQURCSwpNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3dKUVlEVlFRREV4NUpaR1Z1ClZISjFjM1FnUTI5dGJXVnlZMmxoYkNCU2IyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UZ3hNakl6V2hjTk16UXcKTVRFMk1UZ3hNakl6V2pCS01Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjdwpKUVlEVlFRREV4NUpaR1Z1VkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTYjI5MElFTkJJREV3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNuVUJuZVA1azkxRE5HOFc5UllZS3lxVStQWjRsZGhObFQKM1F3bzJkZncvNjZWUTNLWitiVmRmSXJCUXVFeFVIVFJnUTE4elpzaHEwUGlySzFlaG03ekNZb2ZXaks5b3V1VQorZWhjQ3V6L21OS3ZjYk8wVTU5T2grK1N2TDNzVHpJd2lFc1hYbGZFVThMMkFwZU4yV0lydnlRZllvM2Z3N2dwClMwbDRQSk5naUNMOG1kbzJ5TUtpMUN4VUFHYzFibk8vQWxqd3BOM2xzS0ltZXNyZ05xVVpGdlg5dCsrdVAwRDEKYlZvRS9jNDB5aVRjZENNYlhUTVRFbDNFQVNYMk1OMENYWi9nMVVlOXRPc2JvYnRKU2RpZld3THppdVFra09SaQpUMC9CcjRzT2RCZW8wWEtJYW5vQlNjeTBSbm5HRjdIYW1CNEhXZnAxSVlWbDNaQld6dnVycFdDZHhKMzVVckNMCnZZZjVqeXNqQ2lOMk8vY3o0Y2tBODJuNVM2TGdUcngra3ptRUIvZEVjSDcrQjFybHNhelJHTXp5TmVWSlNRaksKVnNrOSt3OFlmWXM3d1JQQ1RZL0pUdzQzNlIraERtcmZZaTdMTlFaUmVTeklKVGowK2t1bmlWeWMwdU1OT1laSwpkSHpWV1lmQ1AwNE1YRkwwUGZkU2d2SHFvNno5U1RRYUtQTkJpRG9UN3VqZS81a2RYN3JMNkI3eXVWQmd3REhUCmMrWHZ2cUR0TXd0MHZpQWd4R2RzOEFnRGVsV0FmMFpPbHFmMEhqN2g5dGdKNFROa0syUFhNbDZmK2NCN0QzaHYKbDd5VG12bWNFcEI0ZW9DSEZkZHlkSnhWZEhpeHV1RnVjQVM2VDZDNmFNTjcvekh3Y3owOWxDcXhDMEVPb1A1TgppR1ZyZVRPMDF3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVU3VVFad05Qd0JvdnVwSHUrUXVjbVZNaU9Obll3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFBMnVrREwycGt0OFJIWVpZUjRuS00xZVZPOGx2T01Ja1BrcDE2NW9DT0dVQUZqdkxpNStVMUtNdGx3SAo2b2k2bVl0UWxOZUNnTjloQ1FDVHJRMFU1czdCOGplVWVMQmZuTE9pYzdpUEJaTTR6WTArc0xqN3dNK3g4dXd0CkxSdk03S3FhczZwZ2doc3RPOE9FUFZlS2xoNmNkYmpUTU0xZ0NJT1EwNDVVOFUxbXdGMTBBMENqN29WK3doOTMKbkFib3dhY1lYVktWN2NuZEpaNXQrcW50b3pvMDBGbDcydTFROHpXLzdlc1VUVEhIWVBUYThZZWM0a2ppeHNVMword1lRK25WWlpqRkhLZHAybWh6cGdxN3ZtcmxSOTRnam1tbVZZanpsVllBMjExUUMvL0c1WGM3VUkyL1lSWVJLClcyWHZpUXpkRktjZ3l4aWxKYlFOK1FId290TDBBTWgwanFFcVNJNWwyeFBFNGlVWGZldStoMXNYSUZSUmswcFQKQXd2c1hjb3o3V0w5UmNjdlc5eFlvSUE1NXZyWC9oTVVwdTA5bEVwQ2ROVERkMWx6elk5R3ZsVTQ3L3Jva1RMcQpsMWdFSXQ0NHc4eThiY2t6T21vS2FUK2d5T3B5ajR4amhpTzliVHlXbnBYZ1NVeXFvcmtxRzV3MmdYanR3K2hHCjRpWlpSSFVlMlhXSlVjMFFoSjFoWU10ZCtaY2lUWTZZNXVOLzlsdTdyczNLU29GclhndnpVZUYwSytsK0o2ZloKbVVsTytLV0EyeVVQSEdOaWlza3paMnM4RUlQR3JkNm96UmFPamZBSE4zR2Y4cXY4UWZYQmkrd0FOMTBKNVU2QQo3L3F4WERnR3BSdEs0ZHc0TFR6Y3F4K1FHdFZLbk83UmNHek03dlJYK0JpNmhHNkgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIFN1YmplY3Q6IENOPUlkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIExhYmVsOiAiSWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIgojIFNlcmlhbDogMTMyOTg4MjEwMzQ5NDYzNDIzOTA1MjE5NzYxNTY4NDM5MzM2OTgKIyBNRDUgRmluZ2VycHJpbnQ6IDM3OjA2OmE1OmIwOmZjOjg5OjlkOmJhOmY0OjZiOjhjOjFhOjY0OmNkOmQ1OmJhCiMgU0hBMSBGaW5nZXJwcmludDogYmE6Mjk6NDE6NjA6Nzc6OTg6M2Y6ZjQ6ZjM6ZWY6ZjI6MzE6MDU6M2I6MmU6ZWE6NmQ6NGQ6NDU6ZmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDMwOmQwOjg5OjVhOjlhOjQ0OjhhOjI2OjIwOjkxOjYzOjU1OjIyOmQxOmY1OjIwOjEwOmI1Ojg2OjdhOmNhOmUxOjJjOjc4OmVmOjk1OjhmOmQ0OmY0OjM4OjlmOjJmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWmpDQ0EwNmdBd0lCQWdJUUNnRkNnQUFBQVVVanowWjhBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJOCk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNvd0tBWURWUVFERXlGSlpHVnUKVkhKMWMzUWdVSFZpYkdsaklGTmxZM1J2Y2lCU2IyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UYzFNek15V2hjTgpNelF3TVRFMk1UYzFNek15V2pCTk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wCk1Tb3dLQVlEVlFRREV5RkpaR1Z1VkhKMWMzUWdVSFZpYkdsaklGTmxZM1J2Y2lCU2IyOTBJRU5CSURFd2dnSWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDMklwVDhwRWl2NkVkckN2c25kdVR5UDRvNwpla29zTVNxTWpiQ3B3ekZycUhkMmhDYTJySUZDRFFqclZWaTdldmk4WlgzeW9HMkxxRWZwWW5ZZUVlNElGTkd5ClJCYjA2dEQ2SGk5ZTI4dHpRYTY4QUxCS0swQ3lyT0U3UzhJdG5lU2htK3dhT2g3d0NMUFE1Q1ExQjUrY3RNbFMKYmRzSHlvKzFXL0NEODAvSExhWElyY3VWSUtReEtGZFlXdVNORzVxcm5nME04Z296T1NJNUNwY3U4MU4zdVVSRgovWVRMTmlDQldTMmFiMjFJU0dIS1ROOVQwYTlTdkVTZnF5OXJnM0x2ZFlEYUJqTWJYY2phWThaTnpheG1NYzNSCjNqNkhFRGJodWFSNjcyQlFzc3ZLcGxiZ042K3JOQk01SmVnNVp1U1llcW9TbUp4WlpvWStyZkd3eWo0R0QzdncKRVVzM29FUnRlOHVvakhIMDFiV1JOc3p3RmNZcjNsRVhzWmRNVUQyeGxWbDhCWDB0SWRVQXZ3Rm5vbDU3cGx6eQo5eUx4a0EyVDI2cEVVV2JNZlhZRDYycW9LamdabDNZTmE0cGgrYnoyN25iOWNDdmRLVHo0Q2g1YlFoeUxWaTlWCkd4eWhMclhIRnViNHFqeVNqbW0yQWNHMWhwMkpEd3M0bEZUbzZ0eWVQU1c4VXlidDFhczVxc1ZBVEZTcnNyVFoKMmZqWGN0c2N2RzI5WlYvdmlEVXFaaS91OXJObDhET05mSmhCYVVZUFF4eHArcHUxMEdGcXpjcEwyVXlRUnFzVgpXYUZIVkNrdWd5aGZITUtpcTNJWEFBYU9SZXlMNGpNOWY5b1pST1JpY3NQZklzYnlWdFRkWDVWeTdXMWY5MGdEClcvM0ZLcUQyY3lPRUVCc0I1d0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVNDNIZ250aW5RdG5iY1pGcmxKUHJ3NlBSRktNd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnSUJBRWY2M1Fxd0VaRTRyVTFkOStVT2wxUVpna2lIVkl5cVpKbllXdjZJQWNWWXBabXhJMVFqCnQyb2RJRmZsQVdKQkY5TUoyM1hMYmxTUWRmNGFuNEVLd3QzWDl3blFXM0lWNUI0SmFqMHo4eUdhNWhWK3JWSFYKRFJEdGZVTEFqKzdBbWdqVlFkWmNEaUZwYm9CaERoWEF1TS9GU1JKU3pMNDZ6TlF1T0FYZU5mMGZiN2lBYUpnOQpUYURLUUdYU2MzejFpOWtLbFQvWVB5TnRHdEVxSkJuWmhiTVg3M2h1cVZqUkk5UEhFKzF5Slg5ZHNYTncwSDhHCmx3bUVLWUJoSGZwZS8zT3NvT09KdUJ4eEZjYmVNWDhTM09GdG02L242SjkxZUV5clJqdWF6cjhGR0YxTkZUd1cKbWhsUUJKcXltbTlsaTFKZlBGZ0VLQ1hBWm1FeGZybmdkYmthcUlIV2NoZXp4UU14TlJGNGVLTGc2VENNZjREZgpXTjg4dWllVzRvQTBiZU9ZMDJRbnJFaCtLSGRjeGlWaEpmaUZER1g2eERJdnBaZ0Y1UGdMWnhZV3hvSzRNaG41CitibDUzQi9ONjYrckR0MGIyMFhrZXVjQzRwVmQvR253VTJsaGxYVjVDMTVWNWpnY2xLbFpNNTdJY1hSNWYxR0oKdHNocXVERElhampEYnA3aE54YnFCV0pNV3hKSDdhZTBzMWhXeDBuemZ4Sm9DVEZ4OEczNFRrZjcxb1h1eFZoQQpHYVFkcC9sTFF6ZmNhRnBQeit2Q1pIVGV0QlhaOUZSVUdpOGMxNWR4VkpDTzJTQ2RVeXQvcTQvaTZqQzhVRGZ2CjhVZTFmWHdzQk94b25iUkpSQkQwY2tzY1pPZjg1bXVRM1dsOWFmMEFWcVczckxhdHQ4bytBZStjCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAwOSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAwOSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMTI0Njk4OTM1MgojIE1ENSBGaW5nZXJwcmludDogNGI6ZTI6Yzk6OTE6OTY6NjU6MGM6ZjQ6MGU6NWE6OTM6OTI6YTA6MGE6ZmU6YjIKIyBTSEExIEZpbmdlcnByaW50OiA4YzpmNDoyNzpmZDo3OTowYzozYTpkMTo2NjowNjo4ZDplODoxZTo1NzplZjpiYjo5MzoyMjo3MjpkNAojIFNIQTI1NiBGaW5nZXJwcmludDogNDM6ZGY6NTc6NzQ6YjA6M2U6N2Y6ZWY6NWY6ZTQ6MGQ6OTM6MWE6N2I6ZWQ6ZjE6YmI6MmU6NmI6NDI6NzM6OGM6NGU6NmQ6Mzg6NDE6MTA6M2Q6M2E6YTc6ZjM6MzkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVQakNDQXlhZ0F3SUJBZ0lFU2xPTUtEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnZqRUxNQWtHQTFVRUJoTUMKVlZNeEZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MApjblZ6ZEM1dVpYUXZiR1ZuWVd3dGRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzCklFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEV5TURBR0ExVUVBeE1wUlc1MGNuVnoKZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3SGhjTk1Ea3dOekEzTVRjeQpOVFUwV2hjTk16QXhNakEzTVRjMU5UVTBXakNCdmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVVZ1CmRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwY25WemRDNXVaWFF2YkdWbllXd3QKZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1EQTVJRVZ1ZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMAphRzl5YVhwbFpDQjFjMlVnYjI1c2VURXlNREFHQTFVRUF4TXBSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqCllYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUsKQW9JQkFRQzZoTFp5MjU0TWErS1o2VEFCcDNicU1yaVZRUnJKMm1GT1dITFAvdmFDZWI5ellRWUtwU2ZZczEvVApSVTRjY3RaT012SnlpZy8zZ3huUWFvQ0FBRVVlc01mbm1yOFNWeWNjbzJndkNvZTlhbXNPWG1YekhIZlYxSVdOCmNDRzBzekxuaTZMVmhqa0NzYmpTUjg3a3lVbkVPNmZlKzFSOVY3N3c2RzdDZWJJNkMxWGlVSmdXTWhOY0wzaFcKd2NLVXMvSmE1Q2VhbnlUWHh1elFteVdDNDh6Q3hFWEZqSmQ2Qm1zcUVaK3BDbTVJTzIvYjFCRVpRdmVQQjcvMQpVMStjUHZRWExPWnByRTR5VEdKMzZyZm81YnMwdkJtTHJweFI1N2QrdFZPeE15TGxiYzl3UEJyNjRwdG50b1AwCmphV3ZZa3hONEZpc1pEUVNBL2kyalpSakpLUnhBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxY2laNjBCN3ZmZWM3YVZIVWJJMmZrQkptcXpBTgpCZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFlWjhkbHNhMmVUOGlqWWZUaHdNRVlHcHJtaTVaaVhNUnJFUFI5UlAvCmpUa3J3UEs5VDNDTXFTL3FGOFFMVko3VUc1YVlNenlvcldLaUFIYXJXV2x1QmgxK3hMbEVqWml2RXRSaDJ3b1oKUmtmejYvZGp3VUFGUUtYU3QvUzFtamEvcVloMmlBUlZCQ3VjaDM4YU56eCtMYVVhMk5TSlhzcTlyRDFzMkcydgoxZk4yRDgwN2lEZ2luV3lUbXNROXY0SWJaVCttRDEycS9PV3lGY3ExcmNhOFBkQ0U2T29HY3JCTk9USjR2ejRSCm5BdWtuWm9oOC9DYkN6QjQyOEhjaDBQK3ZHT2F5c1hDSE1uSGpmODdFbGdJNXJZOTdIb3NUdnVEbHM0TVBHbUgKVkhPa2M4S1QvMUVRckJWVUFkajhCYkdKb1g5MGc1cEoxOXhPZTRwSWI0dEY5Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMTIgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxIgojIFNlcmlhbDogNTE1NDMxMjQ0ODE5MzA2NDkxMTQxMTYxMzMzNjkKIyBNRDUgRmluZ2VycHJpbnQ6IGI2OjdlOjFkOmYwOjU4OmM1OjQ5OjZjOjI0OjNiOjNkOmVkOjk4OjE4OmVkOmJjCiMgU0hBMSBGaW5nZXJwcmludDogMjA6ZDg6MDY6NDA6ZGY6OWI6MjU6ZjU6MTI6MjU6M2E6MTE6ZWE6Zjc6NTk6OGE6ZWI6MTQ6YjU6NDcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDAyOmVkOjBlOmIyOjhjOjE0OmRhOjQ1OjE2OjVjOjU2OjY3OjkxOjcwOjBkOjY0OjUxOmQ3OmZiOjU2OmYwOmIyOmFiOjFkOjNiOjhlOmIwOjcwOmU1OjZlOmRmOmY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDK1RDQ0FvQ2dBd0lCQWdJTkFLYUxlU2tBQUFBQVVOQ1IrVEFLQmdncWhrak9QUVFEQXpDQnZ6RUxNQWtHCkExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjMKZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dGRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREV5SUVWdQpkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEV6TURFR0ExVUVBeE1xClJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSVU14TUI0WERURXkKTVRJeE9ERTFNalV6TmxvWERUTTNNVEl4T0RFMU5UVXpObG93Z2I4eEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRApWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXVNU2d3SmdZRFZRUUxFeDlUWldVZ2QzZDNMbVZ1ZEhKMWMzUXVibVYwCkwyeGxaMkZzTFhSbGNtMXpNVGt3TndZRFZRUUxFekFvWXlrZ01qQXhNaUJGYm5SeWRYTjBMQ0JKYm1NdUlDMGcKWm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUWdVbTl2ZENCRApaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFVkRNVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpCkEySUFCSVFUeWRDNmJVRjc0bXpRNjFWZlpnSWFKUFJiaVdsSDQ3akNmZkh5QXNXZm9QWmIxWXNHR1laUFV4QnQKQnlRbm9hRDQxVWNaWVV4OXlwTW42blFNNzIrV0NmNWo3SEJkTnExbmQ2N0puWHhWUkRxaVkxRWY5ZU5pMUtsSApCejdNSUtOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPCkJCWUVGTGRqNXhyZGpla0lwbFdEcE9CcVVFRmxFVUpKTUFvR0NDcUdTTTQ5QkFNREEyY0FNR1FDTUdGNTJPVkMKUjk4Y3JsT1pGN1p2SEgzaHZ4R1UwUU9JZGVTTmlhU0tkMGJlYldIdkF2WDd0ZC9NL2s3Ly9xbm1wd0l3VzVuWApoVGNHdFhzSS9lc25pMHFVK2VINnA0NG1DT2g4a21odGM5aHZKcXdoQXJpWnR5WkJXeVZncnRCSUd1NEcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNGQ0EgRVYgUk9PVCBPPUNoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNGQ0EgRVYgUk9PVCBPPUNoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ0ZDQSBFViBST09UIgojIFNlcmlhbDogNDA3NTU1Mjg2CiMgTUQ1IEZpbmdlcnByaW50OiA3NDplMTpiNjplZDoyNjo3YTo3YTo0NDozMDozMzo5NDphYjo3YjoyNzo4MTozMAojIFNIQTEgRmluZ2VycHJpbnQ6IGUyOmI4OjI5OjRiOjU1Ojg0OmFiOjZiOjU4OmMyOjkwOjQ2OjZjOmFjOjNmOmI4OjM5OjhmOjg0OjgzCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1YzpjMzpkNzo4ZTo0ZToxZDo1ZTo0NTo1NDo3YTowNDplNjo4NzozZTo2NDpmOTowYzpmOTo1Mzo2ZDoxYzpjYzoyZTpmODowMDpmMzo1NTpjNDpjNTpmZDo3MDpmZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmpUQ0NBM1dnQXdJQkFnSUVHRXJNMWpBTkJna3Foa2lHOXcwQkFRc0ZBREJXTVFzd0NRWURWUVFHRXdKRApUakV3TUM0R0ExVUVDZ3duUTJocGJtRWdSbWx1WVc1amFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5CmFYUjVNUlV3RXdZRFZRUUREQXhEUmtOQklFVldJRkpQVDFRd0hoY05NVEl3T0RBNE1ETXdOekF4V2hjTk1qa3gKTWpNeE1ETXdOekF4V2pCV01Rc3dDUVlEVlFRR0V3SkRUakV3TUM0R0ExVUVDZ3duUTJocGJtRWdSbWx1WVc1agphV0ZzSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUlV3RXdZRFZRUUREQXhEUmtOQklFVldJRkpQClQxUXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFEWFhXdk5FRDhmQlZuVkJVMDMKc1E3c21DdU9GUjM2azBzWGdpRnhFRkxYVVdSd0ZzSlZhVTJPRlcyZnZ3d2J3dUNqWjlZTXJNOGlycTkzVkNwTApUSXBUVW5yRDdpN2VzM0Vsd2VsZFBlNmhMNlAzS2p6Skl4MXFxeDJocC9IejdLRFZSTThWejNJdkhXT1g2Sm41Ci9aT2tWSUJNVXRSU3F5NUozNUROdUYrK1A5Nmh5azBnMUNYb2hDbFR0N0dJSC8vNjJwQ2ZDcWt0UVQreDhSZ3AKN2haWkxEUkpHcWdHMTZpSTBnTnllakxpNm1oTmJpeVdaWHZLV2ZyeTR0M3VNQ3o3ekVhc3hHUHJiMzgyS3pSegpFcFIvMzh3bW52RnlYVkJsV1k5cHM0ZGVNbS9ER0lxMWxZK3dlamZlV2tVN3h6Ymg3MmZST2RPWFczTmlHVWd0Cmh4d0crM1NZSUVsejhBWFNHN0dnbzdjYmNOT0lhYmxhMWpqMFl0d2xpM2kvK09oK3VGekpsVTlmcHkyNUlHdlAKYTkzMURmU0N0L1N5Wmk0UUtQYVhXbnVXRm84QkdTMXNibjg1V0Faa2d3R0RnOE5Oa3QweXhvZWtOK2tXenFvdAphSzhLZ1dVNmNNR2JyVTF0Vk1vcUxVdUZHN09BNW5CRkRXdGVOZkIvTzdpYzVBUndpUklsazlvS21TSmdhbU5nClRuWUdtRTY5ZzYwZFdJb2xoZExIWlI0dGpzYmZ0c2JoZjRvRUlSVXBkUEErbkpDZERDN3hpajVhcWd3SkhzZlYKUEtQdGw4TWVOUG80K1FnTzQ4QmRLNFBSVm1ySnRxaFVVeTU0TW1jOWduOTAwUHZodGdWZ3VYRGJqZ3Y1RTFodgpjV0FRVWhDNXdVRUo3M0lmWnpGNC81WUZqUUlEQVFBQm8yTXdZVEFmQmdOVkhTTUVHREFXZ0JUai9pMzlLTkFMCnRicTJvc1MvQnFvRmpKUDdMekFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWQKQmdOVkhRNEVGZ1FVNC80dC9TalFDN1c2dHFMRXZ3YXFCWXlUK3k4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQgpBQ1hHdW12cmg4dmVnam1XUGZCRXAydUVjd1BlblN0UHVpQi92SGl5ejVld0c1enoxM2t1OVVpMjB2c1hpT2JUCmVqL3RVeFBRNGk5cWVjc0FJeWptSGpkWE5ZbUV3blpQTkRhdFo4UE9RUWFJeGZmdTJCcTQxZ3QvVVArVHFoZEwKak96dFVtQ3lwQWJxVHV2MGF4bjk2L1VhNENVcW10ekhRVGIzeUhRRmhEbVZPZFlMTzZRbitnallYQjc0QkdCUwpFU2dvQS8vdlUyWUFwVW8wRm1aOC9RbWtycDVuR205QkMyc0dFNXVQaG5FRnRDK05pV1l6S1haVW1oSDRKL3F5ClA1SGd6ZzBiOHpBYXJiOGlYUnZUdnlVRlRlR1NHbitabnp4RWs4clVRRWxzZ0lmWEJEckRNbEkxRGxiNHBkMTkKeElzTkVSOVR5eDZ5Rjdab2QxcmcxTXZJQjY3MU9pNk9ON2ZRQVV0REtYZU1PWmVQZ2xyNFVlV0pvQmpuYUg5ZApDaTc3bzBjT1BhWWplc1lCeDQvSVhyOXRnRmEraWlTNk0rcWY0VElSbnZIU1Q0RDJHMEN2T0o0UlVIbHpFaExOCjVteWRMSWh5UERDQkJwRWk2bG10MmhrdUlzS051WXlINEdhOGN5TmZJV1JqZ0VqMW9Ed1lQWlRJU0VFZFFMcGUKL3Y1V09hSEl6MTZlR1dSR0VOb1hrYmNGZ0t5TG1aSjk1NkxZQndzMkorZEllV0NLdzljVFhQaHlRTjlLeTgrWgpBQW9BQ3hHVjJsWkZBNGdLbjJmUTFYbXhxSTFBYlEzQ2VrRDY4MTlrUjVMTFU3bTdXYzVQL2RBVlV3SFkzK3ZaCjVuYnYwQ083TzZsNXM5VUNLYzJKbzVZUFNqWG5Ua0xBZGMwSHorWXM2M3N1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UXHhkY1JLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhXHUwMTFmbGF5XHUwMTMxY1x1MDEzMXNcdTAxMzEgSDUgTz1UXHhkY1JLVFJVU1QgQmlsZ2kgXHUwMTMwbGV0aVx1MDE1ZmltIHZlIEJpbGlcdTAxNWZpbSBHXHhmY3ZlbmxpXHUwMTFmaSBIaXptZXRsZXJpIEEuXHUwMTVlLgojIFN1YmplY3Q6IENOPVRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSBPPVRceGRjUktUUlVTVCBCaWxnaSBcdTAxMzBsZXRpXHUwMTVmaW0gdmUgQmlsaVx1MDE1ZmltIEdceGZjdmVubGlcdTAxMWZpIEhpem1ldGxlcmkgQS5cdTAxNWUuCiMgTGFiZWw6ICJUXHhkY1JLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhXHUwMTFmbGF5XHUwMTMxY1x1MDEzMXNcdTAxMzEgSDUiCiMgU2VyaWFsOiAxNTYyMzM2OTkxNzI0ODEKIyBNRDUgRmluZ2VycHJpbnQ6IGRhOjcwOjhlOmYwOjIyOmRmOjkzOjI2OmY2OjVmOjlmOmQzOjE1OjA2OjUyOjRlCiMgU0hBMSBGaW5nZXJwcmludDogYzQ6MTg6ZjY6NGQ6NDY6ZDE6ZGY6MDA6M2Q6Mjc6MzA6MTM6NzI6NDM6YTk6MTI6MTE6YzY6NzU6ZmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ5OjM1OjFiOjkwOjM0OjQ0OmMxOjg1OmNjOmRjOjVjOjY5OjNkOjI0OmQ4OjU1OjVjOmIyOjA4OmQ2OmE4OjE0OjEzOjA3OjY5OjlmOjRhOmYwOjYzOjE5OjlkOjc4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSnpDQ0F3K2dBd0lCQWdJSEFJNFgvaVFnZ1RBTkJna3Foa2lHOXcwQkFRc0ZBRENCc1RFTE1Ba0dBMVVFCkJoTUNWRkl4RHpBTkJnTlZCQWNNQmtGdWEyRnlZVEZOTUVzR0ExVUVDZ3hFVk1PY1VrdFVVbFZUVkNCQ2FXeG4KYVNERXNHeGxkR25GbjJsdElIWmxJRUpwYkduRm4ybHRJRWZEdkhabGJteHB4SjlwSUVocGVtMWxkR3hsY21rZwpRUzdGbmk0eFFqQkFCZ05WQkFNTU9WVERuRkpMVkZKVlUxUWdSV3hsYTNSeWIyNXBheUJUWlhKMGFXWnBhMkVnClNHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzU0JJTlRBZUZ3MHhNekEwTXpBd09EQTNNREZhRncweU16QTAKTWpnd09EQTNNREZhTUlHeE1Rc3dDUVlEVlFRR0V3SlVVakVQTUEwR0ExVUVCd3dHUVc1cllYSmhNVTB3U3dZRApWUVFLREVSVXc1eFNTMVJTVlZOVUlFSnBiR2RwSU1Td2JHVjBhY1dmYVcwZ2RtVWdRbWxzYWNXZmFXMGdSOE84CmRtVnViR25FbjJrZ1NHbDZiV1YwYkdWeWFTQkJMc1dlTGpGQ01FQUdBMVVFQXd3NVZNT2NVa3RVVWxWVFZDQkYKYkdWcmRISnZibWxySUZObGNuUnBabWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hJRWcxTUlJQgpJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcENVWjRXV2U2MGdoVUVvSTVSSHdXcm9tCi80Tlp6a1FxTC83aHptQUQvSTBEcGUzL2E2aTZ6RFFHbjFrMTl1d3N1NTM3alZKcDQ1d25FRlB6cEFMRnAva1IKR21sMWJzTWRpOUdZalpPSHAzR1hEU0hIbWZsUzB5eGpYVlc4NkI4QlNMbGcva0pLOXNpQXJzMW1lcDVGaW1oMwo0a2hvbjZMYThlSEJFSi9yUENtQnArRXlDTlNnQmJHTSs0MldBQTQrSmQ5VGhpSTcvUFM5OHdsK2QreUc2dzh6CjVVTlA5RlIxYlNtWkxtWmFROS9MWE1ySTVUanhmanMxblEvMHhWcWh6UE1nZ0NUVFYrd1Z1blVsbStoa1M3TTAKaE84RXVQYkpiS29DUHJaVjRqSTNYL3htbDEvTjFwN0hJTDlOeHF3L2RWOGM3VEtjZkdrQWFaSGpJeGhUNlFJRApBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVWcGtISHRPc0RHbGt0QXhRUjk1RExMNGd3UHN3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUo1RmRuc1gKU0RMeU9Jc3B2ZTZXU2s2QkdMRlJSeUROMEdTeERzblpBZGtKenNpWjNHZ2xFOVJjOHFQb0JQNXlDY2NMcWgwbApWWDZXbWxlM3VzVVJlaG5tcDM0OWhRNzErUzRwTCtmNWJGZ1dWMUFsOWo0dVBxcnRkM0dxcXBtV1JncXVqdXdxClVSYXdYczNxWndRY1dERDFZSXE5cHIxTjVaYTAvRUtKQVd2MmNNaFFPUXd0MVdiWnlOS3pNcmNiR1czTE0vbmYKcGVZVmhEZnd3dkpsbHBLUWQvQ3Q5SkRwRVhqWGs0bkFQUXU2S2ZUb21aMXlqdTJkTCs2U2ZhSHgvMTI2TTJDRgpZdjRIQXFHRVZrYStsZ3FhRTljaFRMZDhCNTlPVGorUmRQc25uUkhNM2VheHluRk5FeGM1SnNVcElTdVRLV3FXCitxdEI0VXUyTlF2QW14VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRpbm9taXMgLSBSb290IENBIE89Q2VydGlub21pcyBPVT0wMDAyIDQzMzk5ODkwMwojIFN1YmplY3Q6IENOPUNlcnRpbm9taXMgLSBSb290IENBIE89Q2VydGlub21pcyBPVT0wMDAyIDQzMzk5ODkwMwojIExhYmVsOiAiQ2VydGlub21pcyAtIFJvb3QgQ0EiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAxNDowYTpmZDo4ZDphODoyODpiNTozODo2OTpkYjo1Njo3ZTo2MToyMjowMzozZgojIFNIQTEgRmluZ2VycHJpbnQ6IDlkOjcwOmJiOjAxOmE1OmE0OmEwOjE4OjExOjJlOmY3OjFjOjAxOmI5OjMyOmM1OjM0OmU3Ojg4OmE4CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyYTo5OTpmNTpiYzoxMTo3NDpiNzozYzpiYjoxZDo2MjowODo4NDplMDoxYzozNDplNToxYzpjYjozOTo3ODpkYToxMjo1ZjowZTozMzoyNjo4ODo4MzpiZjo0MTo1OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmtqQ0NBM3FnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pHVWpFVApNQkVHQTFVRUNoTUtRMlZ5ZEdsdWIyMXBjekVYTUJVR0ExVUVDeE1PTURBd01pQTBNek01T1RnNU1ETXhIVEFiCkJnTlZCQU1URkVObGNuUnBibTl0YVhNZ0xTQlNiMjkwSUVOQk1CNFhEVEV6TVRBeU1UQTVNVGN4T0ZvWERUTXoKTVRBeU1UQTVNVGN4T0Zvd1dqRUxNQWtHQTFVRUJoTUNSbEl4RXpBUkJnTlZCQW9UQ2tObGNuUnBibTl0YVhNeApGekFWQmdOVkJBc1REakF3TURJZ05ETXpPVGs0T1RBek1SMHdHd1lEVlFRREV4UkRaWEowYVc1dmJXbHpJQzBnClVtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTlRNQ1Fvc1A1TDIKZnhTZUM1eWFhaDFBTUdUOXF0OE9IZ1pibjFDRjZzMk5xME5uM3JENmZvQ1dub1I0a2tqVzR6bnV6dVJaV0pmbApMaWVZNnBPb2Q1dEs4TzkwZ0Mzck1CKzEyY2VBbkdJbmtZandTb25kM0lqbUZQblZBeS8vbGR1OW4rd3MraFFWCldaVUt4a2Q4YVJpNXB3UDV5bmFwejhkdnRGNEYvdTdCVXJKMU1vZnM3U2xtTy9OS0ZvTDIxcHJiY3BqcDN2REYKVEtXcnRlb0I0b3d1Wkg5a2IvMmpKWk9MeUtJT1NZMDA4Qi9zV0VVdU5LcUVVTDNuc2tvVHVMQVByamhkc0trYgo1blBKV3FIWlprQ3FxVTJtTkFLdGhINnlJOEg3S3NabjlEUzJzSlZxTTA5eFJMV3R3SGt6aU9DLzdhT2dGTFNjCkNiQUs0MkMrK1BobWlNMWI4WGNGNExWemJzRjlSaTZPU3llbXpUVUsvZVZOZmFvcW95bkhXbWdFNk9YV2s2UmkKd3NYbTlFL0crWjhhallKSkdZcktXVU02NkEweXdmUk1Fd052YnFZL2tYUEx5bk52RWlDTDdzQ0NlTjVMTHNKSgp3eDN0RnZZazlDY2JYRmN4M0ZYdXFCNXZiS3ppUmN4WFY0cDFWeG5ndFZpWlNUWXhQRE1CYlJaS3piZ3FnNFNHCm0vbGcwaDl0a1FQVFlLYlZQWnJkZDVBOU5hU2ZEMTcxVWtScHVjQzYzTTk5MzN6WnhLeUdJaks4ZTJ1UjczcjQKRjJpdzRsTlZZQzJ2UHNLRDJOa0pLL0RBWk51SGk1SE1rZXNFL1hhMGxacm1GQVliMVRRZHZ0ai9kQnhUaFpuZwpXVkpLWWUySW5tdEppVVorSUZyWjUwcmxhdTdTWlJGREFnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCVHZrVXoxcGNNdzZDOEk2dE54SXFTU2FIaDAKMlRBZkJnTlZIU01FR0RBV2dCVHZrVXoxcGNNdzZDOEk2dE54SXFTU2FIaDAyVEFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQWdFQWZqMVUyaUpkR2xnK08xUW51cnJNeU9NYWF1bysrUkxyVmw4OVVNN2c2a2dtSnM5NVZuNlJISmsvCjBLR1JIQ3dQVDVpVldWTzkwQ0xZaUYyY04vejdaTUY0akl1YVlBbnExZm9oWDlCMFplZFF4Yjh1dVFzTHJiV3cKRjZZU2pOUmllT3BXYXV3SzBrRERQQVV3UGsyVXQ1OUtBOU45SjB1Mi9rVE8raGt6R20ya1F0SGR6TWpJMXhaUwpnMDgxbExNU1ZYM2w0a0xyNUp5VENjQk1Xd2VyeDIwUm9GQVhsQ09vdFFxU0Q3SjZ3V0FzT013YXBsdi84Z3pqCnFoOGMzTGlna3lmZVkrTi9JWjg2NVo3NjRCTnFkZXVXWEdLUmxJNW5VN2FKK0JJSnkyOVNXd055aGxDVkNOU04KaDRZVkg1VWsyS1J2bXM2a25adHQwckoyQm9iR1ZnakY2d25hTnNJYlcwRytZU3JqY09hNHB2aTJXc1M5SWZmLwpxbCtoYkhZNVp0YnFURlhoQURPYkU1aGp5Vy9RQVNBSk4xTG5ERTgremJ6MVg1WW5weUFDbGVBdTZBZEJCUjhWCmJ0YXc1Qm5nRHdLVEFDZHl4WXZSVkI5ZFNzTkFsMzVWcG56Qk13UVVBUjFKSUdrTEdaT2RibGdpOTBBTVJnd2oKWS9NNTBuOTJVYWYweUtIeERIWWlJMFpTS1MzaW8wRUhWbW1ZMGdVSnZHbkhXbUhOajRGZ0ZVMkEzWkRpZmNSUQo4b3c3YmtySHh1YUFLenlCdkJHQUZoQW4xL0ROUDNuTWN5ckRmbE9SMW03NDlmUEgwRkZOamt1bFcrWVpGenZXCmdRbmNJdHp1anJuRWoxUGhaN3N6dUlnVlJzL3RhVFgvZFExRzg4NXg0Y1ZyaGtJR3VVRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EgTz1XSVNlS2V5IE9VPU9JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBTdWJqZWN0OiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBIE89V0lTZUtleSBPVT1PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgTGFiZWw6ICJPSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBIgojIFNlcmlhbDogMTU3NzY4NTk1NjE2NTg4NDE0NDIyMTU5Mjc4OTY2NzUwNzU3NTY4CiMgTUQ1IEZpbmdlcnByaW50OiBhNDplYjpiOTo2MToyODoyZTpiNzoyZjo5ODpiMDozNToyNjo5MDo5OTo1MToxZAojIFNIQTEgRmluZ2VycHJpbnQ6IDBmOmY5OjQwOjc2OjE4OmQzOmQ3OjZhOjRiOjk4OmYwOmE4OjM1OjllOjBjOmZkOjI3OmFjOmNjOmVkCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Yjo5YzowODplODo2ZTpiMDpmNzo2NzpjZjphZDo2NTpjZDo5ODpiNjoyMTo0OTplNTo0OTo0YTo2NzpmNTo4NDo1ZTo3YjpkMTplZDowMTo5ZjoyNzpiODo2YjpkNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHRUQ0NBcDJnQXdJQkFnSVFkckVnVW5Ud2hZZEdzL2dqR3ZiQ3dEQU5CZ2txaGtpRzl3MEJBUXNGQURCdApNUXN3Q1FZRFZRUUdFd0pEU0RFUU1BNEdBMVVFQ2hNSFYwbFRaVXRsZVRFaU1DQUdBMVVFQ3hNWlQwbFRWRVVnClJtOTFibVJoZEdsdmJpQkZibVJ2Y25ObFpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSGJHOWkKWVd3Z1VtOXZkQ0JIUWlCRFFUQWVGdzB4TkRFeU1ERXhOVEF3TXpKYUZ3MHpPVEV5TURFeE5URXdNekZhTUcweApDekFKQmdOVkJBWVRBa05JTVJBd0RnWURWUVFLRXdkWFNWTmxTMlY1TVNJd0lBWURWUVFMRXhsUFNWTlVSU0JHCmIzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWFNWTmxTMlY1SUVkc2IySmgKYkNCU2IyOTBJRWRDSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMkJlMwpIRW9rS3RhWHNjcmlIdnQ5T08rWTliSTVtRTRudUJGZGU5SWxsSWlDRlNacUd6RzdxRnNoSVN2WUQwNmZXdkd4Cld1UjUxaklqSytGVHpKbEZYSHRQcmJ5L2gwb0xTNWRhcVBaSTdIMTdEYzBoQnQrZUZmMUJpa2kzSVBTaGVodFgKMUYxUS83cG4yQ09aSDhnLzQ5Ny9iMXQzc1d0dXVNbGs5K0hLUVVZT0tYSFF1U1A4eVlGZlR2ZHYzNytFclhOawp1N2RDam1uMjFIWWRmcDJudUZlS1VXZHkxOVNvdUpWVVFITUQ5dXIwNi80b1FuYy9uU01ic3JZOWdCUUhUQzVQCjk5VUtGZzI5WmtNM2ZpTkRlY05BaHZWTUtkcU9tcTBOcFFTSGlCNkY0K2xUMVp2SWl3TmplT3ZnR1VwdXV5OXIKTTJSWWs2MXB2NDhiNzRKSXh3SURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBZEJnTlZIUTRFRmdRVU5RL0lObU5lNHFQcytUdG1GYzVSVXVPUm1qMHdFQVlKS3dZQkJBR0NOeFVCCkJBTUNBUUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUVCTSs0ZXltWUdRZnAzRnNMQW16WWg3S3pLTmJyZ2gKY1ZpWGZhNDNGSzgrNS9lYTRuMzJjWmlaQktwRGRIaWo0MGxoUG5PTVRaVGcrWEhFdGhZT1UzZ2YxcUtITHdJNQpnU2s4cnhXWUlURCtLSkFBak5IaHkvcGV5UDM0RUVZN29uaENrUmQwVlFyZVVHZE5adEduLy8zWndMV29vNHJPClp2VVBRODJuSzFkN1kwWnFxaTVTMlBUdDRXMnRLWkI0U0xyaEk2cWppZXkxcTViQXRFdWlIWmVlZXZKdVFISGYKYVBGbFRjNThCZDlUWmFtbDhMR1hCSEFWUmdPWTFOSy9WTFNnV0gxU2I5cFdKbUxVMk51Sk1XOGM4Q0xDMDJJYwpOYzFNYVJWVUdwQ1kzdXNlWDhwM3g4dU9QVU5wbkpwWTBDUTczeHRBbG40MXJZSEhUbkc2aUJNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1pBRklSIFJPT1QgQ0EyIE89S3Jham93YSBJemJhIFJvemxpY3plbmlvd2EgUy5BLgojIFN1YmplY3Q6IENOPVNaQUZJUiBST09UIENBMiBPPUtyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4KIyBMYWJlbDogIlNaQUZJUiBST09UIENBMiIKIyBTZXJpYWw6IDM1NzA0MzAzNDc2NzE4NjkxNDIxNzI3NzM0NDU4NzM4Njc0MzM3NzU1ODI5NjI5MgojIE1ENSBGaW5nZXJwcmludDogMTE6NjQ6YzE6ODk6YjA6MjQ6YjE6OGM6YjE6MDc6N2U6ODk6OWU6NTE6OWU6OTkKIyBTSEExIEZpbmdlcnByaW50OiBlMjo1MjpmYTo5NTozZjplZDpkYjoyNDo2MDpiZDo2ZToyODpmMzo5YzpjYzpjZjo1ZTpiMzozZjpkZQojIFNIQTI1NiBGaW5nZXJwcmludDogYTE6MzM6OWQ6MzM6Mjg6MWE6MGI6NTY6ZTU6NTc6ZDM6ZDM6MmI6MWM6ZTc6Zjk6MzY6N2U6YjA6OTQ6YmQ6NWY6YTc6MmE6N2U6NTA6MDQ6Yzg6ZGU6ZDc6Y2E6ZmUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURjakNDQWxxZ0F3SUJBZ0lVUG9wZEIreFYwakxWdCtPMlh3SHJMZHprMXVRd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1VURUxNQWtHQTFVRUJoTUNVRXd4S0RBbUJnTlZCQW9NSDB0eVlXcHZkMkVnU1hwaVlTQlNiM3BzYVdONgpaVzVwYjNkaElGTXVRUzR4R0RBV0JnTlZCQU1NRDFOYVFVWkpVaUJTVDA5VUlFTkJNakFlRncweE5URXdNVGt3Ck56UXpNekJhRncwek5URXdNVGt3TnpRek16QmFNRkV4Q3pBSkJnTlZCQVlUQWxCTU1TZ3dKZ1lEVlFRS0RCOUwKY21GcWIzZGhJRWw2WW1FZ1VtOTZiR2xqZW1WdWFXOTNZU0JUTGtFdU1SZ3dGZ1lEVlFRRERBOVRXa0ZHU1ZJZwpVazlQVkNCRFFUSXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDM3ZENVFxRXZOClFMWE9ZZWVXeXJTaDJnd2lzUHExZTNZQWQ0d0x6MzJvaHN3bVVlUWdQWVVNMWxqajUvUXFHSjNhMGE0bTd1dFQKM1BTUTFoTktESkE4dy9UYTBvNE5ranJjc2JIL09ON0R1aTFmZ0xrQ3ZVcWRHdyswdzhMQlp3UGQzQnVjUGJPdwozZ0FlcURSSHU1cnIvZ3NVdlRhRTJnMGd2L3BieTZrV0lLMDVZTzR2ZGJibmw1ejVQdjErVFc5TkwrK0lEV3I2CjNmRTliaUNsb0JLMFRYQzV6dGR5TzRtVHA0Q0VIQ2RKY2ttMS96dVZuc0hNeUFIczZBNktDcGJuczZhSDVkYjUKQlNzTmwwQndQTHFzZFZxYzFVMmRBZ3JTUzV0bVMwWUhGMld0bjJ5SUFOd2lpZURoWk5SbnZERjVZVHk3eWtITgpYR29BeUR3NGpsaXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFECkFnRUdNQjBHQTFVZERnUVdCQlF1RnFsS0dMWEx6UFZ2VVBNalgvaGQ1Nnp3eURBTkJna3Foa2lHOXcwQkFRc0YKQUFPQ0FRRUF0WFA0QTl4Wld4MTI2YU1xZTVBb3NrM0FNMCtxbXJIVXVPUW4vNm1XbWM1RzRHMThUS0k0cEFadwo4UFJCRWV3L1I0MC9jb2Y1Ty8ya2J5dFRBT0QvT2JscUJ3N3JIUnoyb25LUXk0STlFWUtMMHJ1ZktxOGg1bU9HCm5Ya1o3L2U3RERXUXc0cnRUdy8xekJMWnBENjdvUHdnbFY5UEppOFJJNE5PZFFjUHY1dlJ0QjNwRUFUK3ltQ1AKb2t5NHJjL2hrQS9OcmdySFhYdTNVTkxVWWZyVkZkdlhuNGRSVk91bDQrdkpoYUFsSURmN2pzNE1OSVRoUElHeQpkMDVEcFloZmhtZWhQZWEwWEdHMlB0dit0eWpGb2dldXRjcktqU29TNzVmdHdqQ2t5U3A2Ky9OTkl4dVpNelNnCkx2V3BDei9VWGVIUGhKL2lHY0pmaXRZZ0h1Tnp0dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIiCiMgU2VyaWFsOiA0NDk3OTkwMDAxNzIwNDM4MzA5OTQ2Mzc2NDM1NzUxMjU5Njk2OQojIE1ENSBGaW5nZXJwcmludDogNmQ6NDY6OWU6ZDk6MjU6NmQ6MDg6MjM6NWI6NWU6NzQ6N2Q6MWU6Mjc6ZGI6ZjIKIyBTSEExIEZpbmdlcnByaW50OiBkMzpkZDo0ODozZToyYjpiZjo0YzowNTplODphZjoxMDpmNTpmYTo3NjoyNjpjZjpkMzpkYzozMDo5MgojIFNIQTI1NiBGaW5nZXJwcmludDogYjY6NzY6ZjI6ZWQ6ZGE6ZTg6Nzc6NWM6ZDM6NmM6YjA6ZjY6M2M6ZDE6ZDQ6NjA6Mzk6NjE6ZjQ6OWU6NjI6NjU6YmE6MDE6M2E6MmY6MDM6MDc6YjY6ZDA6Yjg6MDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYwakNDQTdxZ0F3SUJBZ0lRSWRiUVNrOGxEOGt5Ti95cVhoS042VEFOQmdrcWhraUc5dzBCQVEwRkFEQ0IKZ0RFTE1Ba0dBMVVFQmhNQ1VFd3hJakFnQmdOVkJBb1RHVlZ1YVhwbGRHOGdWR1ZqYUc1dmJHOW5hV1Z6SUZNdQpRUzR4SnpBbEJnTlZCQXNUSGtObGNuUjFiU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURWtNQ0lHCkExVUVBeE1iUTJWeWRIVnRJRlJ5ZFhOMFpXUWdUbVYwZDI5eWF5QkRRU0F5TUNJWUR6SXdNVEV4TURBMk1EZ3oKT1RVMldoZ1BNakEwTmpFd01EWXdPRE01TlRaYU1JR0FNUXN3Q1FZRFZRUUdFd0pRVERFaU1DQUdBMVVFQ2hNWgpWVzVwZW1WMGJ5QlVaV05vYm05c2IyZHBaWE1nVXk1QkxqRW5NQ1VHQTFVRUN4TWVRMlZ5ZEhWdElFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TUXdJZ1lEVlFRREV4dERaWEowZFcwZ1ZISjFjM1JsWkNCT1pYUjMKYjNKcklFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzkrWGo0NXRXQQpER1NkaGh1V1pHYy9Jam9lZFFGOTcvdGNaNHpKekZ4cnFaSG11VUxsSUV1YjJwdDd1WmxkMlp1QVM5ZUVRQ3NuCjAraTZNTHMrQ1JxblNaWHZLMEFrd3BmSHArNmJKZStvQ2dDWGhWcXFuZHdweWVJMUIrdHdUVXJXd2JOV3VLRkIKT0p2Uit6Ri9qK0JmNGJFL0Q0NFdTV0RYQm8wWSthb21FS3NxMDlEUlo0MGJScjVITU5VdWN0SEZZOXJuWTNsRQpma3RqSkltR0xqUS9LVXhTaXlxbndPS1JLSW01d0Z2NUhkbm5KNjMvbWdLWHdjWlFrcHNDTEwycHVUUlpDcitFClN2L2Yvck9mNjltZTRKZ2o3S1pyZHhZcTI4eXRPeHlraDl4R2MxNFpZbWhGVitTUWdrSzdRdGJ3WWVEQm96MW0KbzEzMEdPNkl5WTBYUlNtWk1uVUNNZTRwSnNockF1YTFZa1YvTnhWYUkyaUoxRDdlVGlldzhFQU12RTBYeTAyaQpzeDdRQmxyZDlwUFBWM1daOWZxR0dtZDRzNytXL2pUY3ZlZFNWdVd6NVhWNzEwR1JCZHhkYWVPVkRVTzUvSU9XCk9aVjdiSUJhVHhOeXh0ZDlLWHBFdWxLa0t0VkJSZ2tnL2lLZ3Rsc3dqYnlKRE5YWGNQaUhVdjNhNzZ4UkxnZXoKVHY3UUNkcHc3NWo2VnVadDI3VlhTOXpsTENVVnlKNHVlRTc0MnB5ZWhpektWL01hNWNpU2l4cUNsbnJEdkZBUwphZGdPV2thTE91c20raVBKdHJDQnZrSUFwUGpXL2pBdXg5Skc5dVdPZGYzeXpMblFoMXZNQmhCZ3U0TTF0MTVuCjNrZnNtVWp4cEtFVi9xMk1ZbzQ1VlU4NUZybXhZNTMvdHdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01CMEdBMVVkRGdRV0JCUzJvVlE1QXNPZ1A0Nkt2UHJVK0J5bTBUb08vVEFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFTkJRQURnZ0lCQUhHbERzN2s2YjgvT05XSldzUUNZZnRNeFJRWExZdFBVMnNRCkYveGxoTWNRU1pEZTI4Y21rNGdtYjNEV0FsNDVvUGVQcTVhMXBSTmNnUlJ0RG9HQ0VSdUtUc1pQcGQxaUhrVGYKQ1ZuMFczY0xOK21MSU1iNENrNHVXQnpyTTlEUGhtREoydnVBTDU1TVlJUjRQU0ZrMXZ0Qkh4Z1A1OGwxY2IyOQpYTjQwaHo1QnNBNzJ1ZFkvQ1JPV0ZDL2VtaDFhdVZiT05UcXdYM0JOWHVNcDhTTW9jbG0ycThLTVppWWNkeXdtCmRqV0xLS2Rwb1BrNzlTUGRoUkIweVpBRFZwSG5yN3BIMUJLWEVTTGpva21VYk9lM2xFdTZMYVRhTTR0TXBrVC8KV2p6R0hXVFl0VEhrcGp4NnFGY0wyKzFoR3N2eHpuTjNZNlNIYjB4Uk9OYmtYOGVmdG9FcTVJVkllVmhlTy9qYgpBb0pud1RuYnczUkxQVFllK1NtVGlHaGJxRVFaSWZDbjZJRU5MT2lUTnJRM3NzcXdHeVo2bWlVZm1wcUFua3NxClAvdWptdjV6TW5IQ25zWnk0WXBvSi9Ia0Q3VEVUS1Zoay9pWEVBY3FNQ1dwdWNoeHVPOW96QzErOWVCK0Q0S28KYjdhNmJJTkRkODJLa2hlaG5sdDRGajFGNGpOeTNlRm15cG5UeWNVbS9RMW9CRWF1dHRtYmpMNFp2ckhHOGhuagpYQUxLTE5odlNnZlp5VFhhUUhYeXhLY1piNTVDRUpoMTVwV0xZTHp0eFJMWGlzN1ZtRnhXbGdQRjduY0dOZi9QCjVPNC9FMkh1MjlvdGhmRE5ycDJ5R0FsRnc1S2hjaGY4UjdhZ0N5enh4TjVEYUFocVh6dndkbVA3ekFZc3BzYmkKRHJXNXZpU1AKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIExhYmVsOiAiSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IGNhOmZmOmUyOmRiOjAzOmQ5OmNiOjRiOmU5OjBmOmFkOjg0OmZkOjdiOjE4OmNlCiMgU0hBMSBGaW5nZXJwcmludDogMDE6MGM6MDY6OTU6YTY6OTg6MTk6MTQ6ZmY6YmY6NWY6YzY6YjA6YjY6OTU6ZWE6Mjk6ZTk6MTI6YTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjQwOjkyOjlhOjAyOmNlOjUzOmI0OmFjOmY0OmYyOmZmOmM2Ojk4OjFjOmU0OjQ5OjZmOjc1OjVlOjZkOjQ1OmZlOjBiOjJhOjY5OjJiOmNkOjUyOjUyOjNmOjM2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHQ3pDQ0EvT2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnBqRUxNQWtHQTFVRUJoTUNSMUl4CkR6QU5CZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWsKSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFFEQStCZ05WQkFNVApOMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdVbTl2CmRFTkJJREl3TVRVd0hoY05NVFV3TnpBM01UQXhNVEl4V2hjTk5EQXdOak13TVRBeE1USXhXakNCcGpFTE1Ba0cKQTFVRUJoTUNSMUl4RHpBTkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaApaR1Z0YVdNZ1lXNWtJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4ClFEQStCZ05WQkFNVE4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjEKZEdsdmJuTWdVbTl2ZEVOQklESXdNVFV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQwpBUURDK0trL0c0bjhQRHdFWFQyUU5yQ1JPbms4WmxydmJUa0JTUnEwdDg5L1RTTlR0NUFBNHhNcUtLWXg4WkVBCjR5anNyaUZCemgvYS9YMFNXd0dERDdtd1g1bmg4aEtEZ0UwR1B0K3NyK2VoaUdzeHIvQ0wwQmd6dU50RmFqVDAKQW9Ba0tBb0NGWlZlZGlvTm1Ub1VXL2JMeTFPOEUwMEJpRGVVSlJ0Q3ZDTFlqcU9XWGpyWk10cys2UEFRWmUxMAo0UytuZks4bk5Mc3BmWnUyenduSTVkTUsvSWhsWlhRSzNITWNYTTFBc1J6VXRvU01URkRQYUk2b1dhN0NKMDZDCm9qWGRGUFFmLzdKMzFZY3ZxbTU5SkNmbnhzc201dVgrWndkajJFVU4zVHBaWlRsWWVwS1pjajJjaEY2SUlialYKOUN6ODJYQlNUM2k0dlR3cmk1V1k5YlBSYU04Z0ZINU1YRi9uaStYMU5ZRVpOOWNSQ0xkbXZ0Tkt6b05YQURyRApnZmdYeTVJMlhkR2oySFViNFlzbjZucElRZjFGR1FhdEo1bE93WEJIM2JXZmdWTVM1YkdNU0YweFF4ZmpqTVo2Clk1WkxLVEJPaEU1aUdWNDh6cGVRcFg4QjY1M2crSXVKM1NXWVBaSzJmdS9aOFZGUmZTMG15R2xaWWVDc2FyZ3EKTmhFRWVsQzlNb1MrTDl4eTFkY2RGa2ZrUjJZZ1AvU1d4YStPQVhxbEQzcGs5UTBZaDltdWlOWDZoTUU2d0drbwpMZklOYUZHcTQ2VjN4cVNRRHFFM2l6RWpSOEVKQ090dTkzaWIxNEw4aENDWlNSbTJFa2F4KzBWVkZxbWpaYXljCkJ3L3FhOXdmTGdaeTdJYUlFdVF0MjE4RkwrVHdBOU1tTStlQXdzMUNvUmMwQ3dJREFRQUJvMEl3UURBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVWNSVm55TWpKdlhWZApjdEE0R0dxZDgzRWtWQXN3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUhXN2JWUkxxaEJZUmpUeVl0Y1dObDBJClh0VnN5SWU5dEM1RzhqSDRmT3BDdFpNV1ZkeWhEQktnMm1GK0QxaFljMlJ5eCtoRmp0eXA4aVkveG5tTXNWTUkKTTRHd1ZoTys1bEZjMkpzS1QwdWNWbE1DNlUvMkRXRHFUVUpWNkh3YklTSFRHenJNZC9LNGtQRm94L2xhL3ZvdAo5TC9KOVVVYnpqZ1FLamVLZWFPMDR3bHNoWWFULzRtV0ozaUJqMmZqUm5SVWp0a05hZUpLOUUxMEEvK3lkKzJWClo1ZmtzY1dydjJvajZOU1U0a1FvWXNSTDR2RFk0aWxyR25CK0pHR1RlMDhETWlVTlJTUXJsclJHYXI5S0MvZWEKajhHc0dzVm44MjgwMHZwelk0enZGckNvcEVZcStPc1M3SEswNy9ncmZveFN3SXVFVlBrdlB1TlZxTnhtc2RuaApYOWl6akZrMFdhU3JUMnk3SHhqYmRhdll5NUxObERoaERnY0dIMHRHRVBFVnZvMkZYRHRLSzRGNUQ3UnBuMGxRCmwwMzNEbFpkd0pWcXdqYkRHMmpKOVNyY1I1cStzczdGSmVqNkE3bmErUlp1a1lUMUhDakkvQ2JNMXh5UVZxZGYKYnpvRXZNMTRpUXVPRHkranFrK2lHeEk5RmdoQUQvRkdUTmVxZXdqQkN2VnRKOTRDajhyRHRTdks2ZXZJSVZNNApwY3c3MkhjM01LSlAyVy9SOGtDdFFYb1h4ZFpLTlltM1FkVjhobjlWVFlOS3BYTWd3RHF2a1BHYUpJN1pqbkhLCmU3aUcycktQbVQ0ZEV3MFNFZTdVcS9EcEZYWUM1T0RmcWlBZVcyR0ZaRUNwa0pjTnJWUFNXaDJIYWdDWFpXSzAKdm05cXAvVXNRdTB5cmJZaG5yNjgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDgxOmU1OmI0OjE3OmViOmMyOmY1OmUxOjRiOjBkOjQxOjdiOjQ5OjkyOmZlOmVmCiMgU0hBMSBGaW5nZXJwcmludDogOWY6ZjE6NzE6OGQ6OTI6ZDU6OWE6ZjM6N2Q6NzQ6OTc6YjQ6YmM6NmY6ODQ6Njg6MGI6YmE6YjY6NjYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ0OmI1OjQ1OmFhOjhhOjI1OmU2OjVhOjczOmNhOjE1OmRjOjI3OmZjOjM2OmQyOjRjOjFjOmI5Ojk1OjNhOjA2OjY1OjM5OmIxOjE1OjgyOmRjOjQ4OjdiOjQ4OjMzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDd3pDQ0FrcWdBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakNCcWpFTE1Ba0dBMVVFQmhNQ1IxSXhEekFOCkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmwKYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UkRCQ0JnTlZCQU1UTzBobApiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1JVTkRJRkp2CmIzUkRRU0F5TURFMU1CNFhEVEUxTURjd056RXdNemN4TWxvWERUUXdNRFl6TURFd016Y3hNbG93Z2FveEN6QUoKQmdOVkJBWVRBa2RTTVE4d0RRWURWUVFIRXdaQmRHaGxibk14UkRCQ0JnTlZCQW9UTzBobGJHeGxibWxqSUVGagpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1EyVnlkQzRnUVhWMGFHOXlhWFI1Ck1VUXdRZ1lEVlFRREV6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDAKZFhScGIyNXpJRVZEUXlCU2IyOTBRMEVnTWpBeE5UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkpLZwpRZWhMZ29SYzR2Z3hFWm1HWkU0SkpTK2RRUzhLcmpWUGRKV3lVV1Jyald2bVAzQ1Y4QVZFUjZaeU9GQjJsUUphCmpxNG9udmt0VHBudkxFaHZUQ1VwNk5GeFc5OGR3WFUzdE5mNmUzcENuR29LVmxwOGFRdXFnQWtrYkg3QlJxTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkxRaQpDNEtaSkFFT25MdmtEdjIvKzVjZ2s1a3FNQW9HQ0NxR1NNNDlCQU1DQTJjQU1HUUNNR2ZPRm1JNG9xeGlSYWVwCmxTVEFHaWVjTWp2QXdOVzZxZWY0QkVOVGhlNVNJZDZkOVNXRFBwNVlTeS9YWnhNT0lRSXdCZUYxQWQ1bzdTb2YKVFV3SkNBM3NTNjFrRnlqbmRjNUZaWEloRjhzaVFRNk1FNWc0bWxSdG04cmlmT29DV0NLUgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHBsdXMgUm9vdCBDQSBHMSBPPUNlcnRwbHVzCiMgU3ViamVjdDogQ049Q2VydHBsdXMgUm9vdCBDQSBHMSBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBSb290IENBIEcxIgojIFNlcmlhbDogMTQ5MTkxMTU2NTc3OTg5ODM1NjcwOTczMTE3Njk2NTYxNTU2NDYzNzcxMwojIE1ENSBGaW5nZXJwcmludDogN2Y6MDk6OWM6Zjc6ZDk6Yjk6NWM6Njk6Njk6NTY6ZDU6Mzc6M2U6MTQ6MGQ6NDIKIyBTSEExIEZpbmdlcnByaW50OiAyMjpmZDpkMDpiNzpmZDphMjo0ZTowZDphYzo0OToyYzphMDphYzphNjo3Yjo2YToxZjplMzpmNzo2NgojIFNIQTI1NiBGaW5nZXJwcmludDogMTU6MmE6NDA6MmI6ZmM6ZGY6MmM6ZDU6NDg6MDU6NGQ6MjI6NzU6YjM6OWM6N2Y6Y2E6M2U6YzA6OTc6ODA6Nzg6YjA6ZjA6ZWE6NzY6ZTU6NjE6YTY6Yzc6NDM6M2UKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhekNDQTFPZ0F3SUJBZ0lTRVNCVmcrUXRQbFJXaFMyRE43Y3MzRVlSTUEwR0NTcUdTSWIzRFFFQkRRVUEKTUQ0eEN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeQpkSEJzZFhNZ1VtOXZkQ0JEUVNCSE1UQWVGdzB4TkRBMU1qWXdNREF3TURCYUZ3MHpPREF4TVRVd01EQXdNREJhCk1ENHhDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnkKZEhCc2RYTWdVbTl2ZENCRFFTQkhNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQgpBTnBRaDdiYXVLaytuV1Q2VmpPYVZqMFc1UU9Wc2pRY21tMWlCZFRZaitlSlpKKzYyMlNMWk9aNUttSE5yNDlhCmlaRmx1Vmo4dEFOZmtUOHRFQlhnZnMrOC9IOURaNml0WGpZajJKaXpUZk5EbmpsOEt2enNpTldJN25DOWhSWXQKNmt1SlBLTnhRdjRjL2RNY0xSQzRobFRxUTdqYnhvZmFxSzZBSmM5NkpoMnFrYkJJYjY2MTNwN1kxL29BL2NhUAowRkc3WW4ya3NZeXkveUFSdWpWakJZWkhZRU16a1BaSG9nTlBsazJkVDhIcTZweWkvalF1M3JmS0czYWt0NjJmCjZhalVlRDk0L3ZJNENUWWQwaFlDeU93cWFLLzFqcFR2TFJONkhrSktIUlV4cmd3RVYveGhjL014Vm9ZeGdLREUKRVc0d2R1T1U4RjhFeEt5SGNvbVl4WjNNVndpYTlBejhmWG9GT3ZwSGdEbTJ6NFFUZDI4bjZ2K1daeGNJYmVrTgoxaU5RTUxBVmRCTSs1Uy8vRHMzRUMwcGQ4TmdBTTBsbTY2RVlmRmt1UFNpNVlYSEx0YVc2dU9yYzRuQnZDR3JjCmgyYzA3OTh3Y3QzenlUOGovelhodmlFcElEQ0I1Qm1sSU9rbHluTXhkQ20rNGtMVjg3SW1ac2RvL1JtejV5Q1QKbWVoZDRGNkg1MGJvSlp3S0tTVFV6VmlHVWtBa3Nuc1BtQklnSlBhUWJFZklEYnNZSUM3Wi9meUw4aW5xaDNTVgo0RUpRZUlRRVFXR3c5Q0VqankzTEtDSHlhbXowR3FiRkZMUTNaVStWL1lESStITGxKV3ZFWUxGN2JZNUtpblBPCldmdHdlbk1HRTluVGREY2tRUW9SYjVmYzUrUitvYjBWOHJxSER6MW9paFlIQWdNQkFBR2pZekJoTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTb3djQ2JrYWhERlh4ZApCaWUwS2xIWWx3dUJzVEFmQmdOVkhTTUVHREFXZ0JTb3djQ2JrYWhERlh4ZEJpZTBLbEhZbHd1QnNUQU5CZ2txCmhraUc5dzBCQVEwRkFBT0NBZ0VBbkZadkFYN1J2VXoxaXNid0poL2s0RGdZekRMREtUdWRRU2swWWNiWDhBQ2gKNjZSeWo1UVh2Qk1zZGJSWDdncDhDWHJjMWNxaDBEUVQrSGVybitYKzJCNTBpb1VIajMvTWVYcktsczNOL1UvNwovU01Oa1BYMFh0UEdZWDJlRWVBQzdna0UyUWZkcG9xM0RJTWt1NE5Ra3Y1Z2RSRSsySjJ3aW5xMTRKMmJ5NUJTClM3Q1RLdFErRmpQbG5zWmxGVDVrT3dRLzJ3eVBYMXdkYVIrdjgra2hqUFB2bC9hYXR4bTJoSFNjbzFTMWNFNWoKMkZkZFV5R2JRSkpEK3RaM1ZUTlBaTlg3MEN4cWptMGxwdStGNkFMRVV6NjVub2U4ekRVYTNxSHBpbU9IWlI0UgpLdHRqZDVjVXZwb1VtUkd5d082d1QvZ1VJVEpEVDUrcm9zdW9ENm83QmxYR0VpbFhDTlEzMTRjbnJVbFpwNUdyClJIcGVqWERibDg1SVVMRnprL2J3ZzJENXpmSGhNZjFiZkhFaFl4UVVxcS9GM3BOK2FMSHNJcUtxa0hXZXRVTnkKNm1TamhFdjlES2dtYTNHWDdsWmpadWhDVlBuSEhkL1FqMXZmeURCdmlQNE54RE1jVTZpai9VZ1E4dVFLVHVFVgpWL3h1WkREQ1ZSSGM2cW5OU2xTc0tXTkV6MHBBb05ab1dSc3orZTg2aTlzZ2t0eENoTDhCcTRmQTFTQ0MyOGE1Cmc0VkNYQTlETzJwSk5kV1k5QlcvK21HQkRBa2dHTkxRRnd6TFNBQlE2WGFDakdUWE9xQUhWY3dlTWNEdk9yUmwKKytPL1FtdWVENmk5YTVqYzJOdkxpNlRkMTFuMGJ0Mytxc09SMEM1Q0I4QU1UVlBOSkxGTVd4NVI5Ti9wa3ZvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHBsdXMgUm9vdCBDQSBHMiBPPUNlcnRwbHVzCiMgU3ViamVjdDogQ049Q2VydHBsdXMgUm9vdCBDQSBHMiBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBSb290IENBIEcyIgojIFNlcmlhbDogMTQ5MjA4NzA5NjEzMTUzNjg0NDIwOTU2MzUwOTIyODk1MTg3NTg2MTU4OQojIE1ENSBGaW5nZXJwcmludDogYTc6ZWU6YzQ6Nzg6MmQ6MWI6ZWU6MmQ6Yjk6Mjk6Y2U6ZDY6YTc6OTY6MzI6MzEKIyBTSEExIEZpbmdlcnByaW50OiA0Zjo2NTo4ZToxZjplOTowNjpkODoyODowMjplOTo1NDo0Nzo0MTpjOTo1NDoyNTo1ZDo2OTpjYzoxYQojIFNIQTI1NiBGaW5nZXJwcmludDogNmM6YzA6NTA6NDE6ZTY6NDQ6NWU6NzQ6Njk6NmM6NGM6ZmI6Yzk6Zjg6MGY6NTQ6M2I6N2U6YWI6YmI6NDQ6YjQ6Y2U6NmY6Nzg6N2M6NmE6OTk6NzE6YzQ6MmY6MTcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNIRENDQWFLZ0F3SUJBZ0lTRVNEWmtjNnVvK2pGNS8vcEFxL1BjN3hWTUFvR0NDcUdTTTQ5QkFNRE1ENHgKQ3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5ZEhCcwpkWE1nVW05dmRDQkRRU0JITWpBZUZ3MHhOREExTWpZd01EQXdNREJhRncwek9EQXhNVFV3TURBd01EQmFNRDR4CkN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeWRIQnMKZFhNZ1VtOXZkQ0JEUVNCSE1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk0wUFcxYUMzL0JGR3RhdAo5M253SGNtc2x0YWVUcHdmdEVJUnlvYS9iZnVGbzhYbEdWelg3cVkvYVdmWWVPS215Y1RiTFhrdTU0dU5BbTh4CklrMEc0MkJ5UlowT1FuZWV6cy9sZjRXYkdPVDh6QzV5MHhhVFRzcVpZMXloQlNwc0JxTmpNR0V3RGdZRFZSMFAKQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5xRFl3SjVqdHBNeGp3agpGTmlQd3lDcktHQlpNQjhHQTFVZEl3UVlNQmFBRk5xRFl3SjVqdHBNeGp3akZOaVB3eUNyS0dCWk1Bb0dDQ3FHClNNNDlCQU1EQTJnQU1HVUNNSEQrc0F2Wjk0T1g3UE5WSGRUY3N3WU8vak9ZbllzNWtHdVVJZTIyMTEzV1ROY2gKcCtlL0lROHJ6ZmNxM0lVSG5RSXhBSVlVRnVYY3NHWEN3STRVbjc4a0Ztamx2UGw1YWR5dFJTdjN0akZ6ekFhbApVNU9SR3BPdWNHcG51dGVlNVdFYVh3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEcxIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzEgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEcxIgojIFNlcmlhbDogMTQ5MjAzNjU3NzgxMTk0NzAxMzc3MDQwMDEyNzAzNDgyNTE3ODg0NDc3NQojIE1ENSBGaW5nZXJwcmludDogNzY6MDA6Y2M6ODE6Mjk6Y2Q6NTU6NWU6ODg6NmE6N2E6MmU6Zjc6NGQ6Mzk6ZGEKIyBTSEExIEZpbmdlcnByaW50OiA3OTo5MTplODozNDpmNzplMjplZTpkZDowODo5NTowMTo1MjplOTo1NToyZDoxNDplOTo1ODpkNTo3ZQojIFNIQTI1NiBGaW5nZXJwcmludDogNTY6Yzc6NzE6Mjg6ZDk6OGM6MTg6ZDk6MWI6NGM6ZmQ6ZmY6YmM6MjU6ZWU6OTE6MDM6ZDQ6NzU6OGU6YTI6YWI6YWQ6ODI6NmE6OTA6ZjM6NDU6N2Q6NDY6MGU6YjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiekNDQTFlZ0F3SUJBZ0lTRVNDemtGVTVmWDgyYldUQ3A1OXJZNDVuTUEwR0NTcUdTSWIzRFFFQkN3VUEKTUVBeEN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5dwpaVzVVY25WemRDQlNiMjkwSUVOQklFY3hNQjRYRFRFME1EVXlOakE0TkRVMU1Gb1hEVE00TURFeE5UQXdNREF3Ck1Gb3dRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1UKVDNCbGJsUnlkWE4wSUZKdmIzUWdRMEVnUnpFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFENGVVYmFsc1V3WG9weEF5MXdwTHV3eFFqY3plWTF3SUNrRVMzZDVvZXVYVDJSMG9kc043ZmFZcDZiCndpVFhqL0hicHFiZlJtOVJwbkhMUGhzeFoyTDNFVnMwSjlWNVRveWJXTDBpRUExY0p3emRNT1dvMDEwaE9IUVgKL3VNZnRrODdheTNiZldBZmpIMU1CY0xyQVJZVm1CU08wWkIzSWovc3dqbTRlVHJ3U1NUaWxaSGNZVFNTakZSMAo3N0Y5akFIaU9IM0JYMnBmSkxLT1loZXRlU0N0cXgyMzRMU1dTRTltUXhBR0ZpUUQ0ZUNjanNaR1Q0NGFtZUdQCnVZNHpiR25lV0syZ0RxZGtWQkZwUkdaUFRCS25qaXg5eE5SYnhRQTBNTUhabWY0eXpnZUV0RTdOQ3Y4MlRXTHgKcDJOWDVOdHFwNjYvSzduSjVySW5pZVYrbWh4TmFNYkJHTjR6SzFGR1N4eU85ejBNK1lvMEZNVDdNelVqOGN6eApLc2VsdTdDaXp2NVRhMDFCRzJZb3NwYjZwNjRLVHJrNU0wU2NkTUdUSFBqZ25pUWxRL0diSTRLcTN5d2dzTncyClRnT3pmQUxVNW5zYXFvY1R2ejZoZEx1YkR1SEFrNS9YcEdiS3V4czc0ekQwTTFtS0IzSURWZWR6YWdNeGJtK1cKRytPaW42K1N4KzMxUXJjbFREc1RCTThjbHE4Y0lxUFFxd1d5VEJJalV0ejlHVnNubkI0N2V2MUNJOXNqZ0JQdwp2RkVWVkpTbWR6N1FkRkc5VVJRSU9UZkxIelNwTUoxU2hDNVZrTEc2MzFVQUM5aFdMYkZKU1hLQXFXTFh3UFlZCkVRUlZ6WFI3ejJGd2VmUjdMRnhja3Z6bHVGcXJUSk9Wb1NmdXBiN1BjU05DdXB0MkxRSURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVsMFloVnlFMQoyalpWeC9QeE4zRGxDUGFUS2JZd0h3WURWUjBqQkJnd0ZvQVVsMFloVnlFMTJqWlZ4L1B4TjNEbENQYVRLYll3CkRRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFCM2RBbUI4NERXbjVwaDc2a1RPWjBCUDhwTnVadFE1aVNhczAwMEUKUEx1SElUODM5SEVsMmt1NnE1YUNnWkcyN2RteHBHV1g0bTlrV2FTVzdtREtIeVA3UmJyL2p5VHd5cWt4ZjNrZgpnTE10TXJwa1oyQ3Z1Vm5OMzVwSjA2aUNzZm1ZbElyTTRMdmdCQnVaWUxGR1pkd0lvckpHbmtTSTZwTitWeGJTCkZYSmZMa3VyMUoxanVPTkk1ZjZFTGxnS24wTWQvcmNZa29aRFN3NmNNb1lzWVBYcFNPcVY3WEFwOGRVdi9UVzAKVjgvYmhVaVp1Y0p2YkkvTmVKV3NaQ2o5VnJERGI4TytXVkxoWDRTUGdQTDBEVGF0ZHJPanRlRmtkanBZM0gxUApYbFpzNVZWWlY2WGY4WXBtTUl6VVVtSTRkN1MrS05mS05zU2JCZkQ0RmR2YjhlODBuUjE0U29oV1oyNWcvNC9JCmkrR092VUtwTXdwWlFoSVNLdnF4blVPT0JadVoybUt0VnphekhiWU5lUzJXdU92eURFc01wWlRHTUtjbUdTM3QKVEFaUU1QSDlXRDI1U3hkZkdiUnFoRlMwT0U4NW9nMldhTU1vbFAzdExSOUthME9XTHBBQkVQczRwb0VMMEw5MQowOVM1enZFL2J3NGNIamR4NVJpSGRSay9VTGxlcEVVMHJiREs1dVVUZGc4eEZLbU9MWlRXMVlWTmN4VlBTL0t5ClB1MXN2ZjBPbldaenNEMjA5NytvNEJHa3hLNTFDVXBqQUVnZ3BzYWRDd21LdE9EbXpqN0hQaVk0NlN2ZXBnaEoKQXdTUWl1bVB2K2kydENxakk0MGNITEk1a3FpUEFseEFPWFhVYzBFQ2Q5N040RU9IMXVTNlNzTnNFbi8rS3VZagoxb3h4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMiBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEcyIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMiIKIyBTZXJpYWw6IDE0OTIwMTI0NDgwNDI3MDIwOTY5ODY4NzU5ODc2NzY5MzU1NzM0MTU0NDEKIyBNRDUgRmluZ2VycHJpbnQ6IDU3OjI0OmI2OjU5OjI0OjZiOmFlOmM4OmZlOjFjOjBjOjIwOmYyOmMwOjRlOmViCiMgU0hBMSBGaW5nZXJwcmludDogNzk6NWY6ODg6NjA6YzU6YWI6N2M6M2Q6OTI6ZTY6Y2I6ZjQ6OGQ6ZTE6NDU6Y2Q6MTE6ZWY6NjA6MGIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDI3Ojk5OjU4OjI5OmZlOjZhOjc1OjE1OmMxOmJmOmU4OjQ4OmY5OmM0Ojc2OjFkOmIxOjZjOjIyOjU5OjI5OjI1OjdiOmY0OjBkOjA4Ojk0OmYyOjllOmE4OmJhOmYyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYnpDQ0ExZWdBd0lCQWdJU0VTQ2hhUnUvdmJtOVVwYVBJK2hJdnlZUk1BMEdDU3FHU0liM0RRRUJEUVVBCk1FQXhDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsUGNHVnVWSEoxYzNReEhUQWJCZ05WQkFNTUZFOXcKWlc1VWNuVnpkQ0JTYjI5MElFTkJJRWN5TUI0WERURTBNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOVEF3TURBdwpNRm93UURFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVTl3Wlc1VWNuVnpkREVkTUJzR0ExVUVBd3dVClQzQmxibFJ5ZFhOMElGSnZiM1FnUTBFZ1J6SXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRRE10bGVsTTVRUWdUSlQzMkYrRDNZNXoxekNVM1VkU1hxV09OMmljMnJ4Yjk1ZW9scTVjU0crTnRtaAovTHp1YktoOE5CcHhHdWdhMkY4T1JBYnRwK0R6MG1FTDRES2lsdEU0OE1MYUFSZjg1S3hQNk82SkhuU3JUNzhlCkNiWTJhbGJ6NGU2V2lXWWtCdVROUWpwSzNlQ2FzTVNDUmJQK3lhdGNmRDdKNnhjdkRIMXVycVdQeUt3bENtLzYKMVVXWTBqVUo5Z05EbFA3WnZ5Q1ZlWUNZaXRtSk5idFJHNlEzZmZ5Wk82di92NndOajBPeG1Yc1dFSDRkYjBmRQpGWThFbGdnR1FnVDRoTllkdkpHbVFyNUoxV3FJUDd3dFVkR2VqZUJTekZmZE5UVlkyN1NQSklqa2k5L2NhMVRTCmdTdXl6cEpMSEI5RytoM1lrc3QyWjdVSm1RbmxyQmNVVlhER1BLQldDZ096M0dJWjM4aTFNSC8xUENaMUViM1gKRzdPSG5nZXZaWEhsb004YXB3a1FIWk9KWmx2b1BHSXl0YlU2YnVtRkFZdWVRNHhuY3loWlcrdmozQ3pNcFNaeQpZaEswNXB5RFJQWlJwT0xBZWlSWHlnNmxQenExTzR2bGR1NXc1cExlRmx3b1c1Y1pKNUwrZXBKVXpwTTVDaGFICnZHT3o5YkdUWE9CdXQ5RHErV0l5aUVUN3Z5Y290akNWWFJJb3VaVytqMU1ZNWFJWUZ1SldwTElzRVBVZE42YjQKdC9iUVdWeUo5OExWdFpSMDBkWCtHN2J3NXRZZWU5STh5NmpqOVJqeklSOXU3MDFvQm5zdFhXNURpYWJBK2FDLwpnaDdQVTMrMDZ5emJYZlpxZlVBa0JYS0pPQUdUeTNIQ09WMEdFZlp2ZVBnM0RUbUVKd0lEQVFBQm8yTXdZVEFPCkJnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVYWpuNlFpTDMKNW9rQVRWNTlNNFBMdUc1M2hxOHdId1lEVlIwakJCZ3dGb0FVYWpuNlFpTDM1b2tBVFY1OU00UEx1RzUzaHE4dwpEUVlKS29aSWh2Y05BUUVOQlFBRGdnSUJBSmpMcTBBODVUTUNsMzh0aDZhUDFGNUtyN2dlNTd0eCs0QmtKYW16CkdqNW9YU2NtcDdvcTRmQlhnd3BrVHg0aWRCdnBrRi93ck0vL1QyaDZPS1FRYkEyeHg2UjNnQmkyb2loRWRxYzAKblhHRUw4cFowa2VJbVVFaXlUQ1lZVzQ5cUtnRmJkRWZ3RkZFVm44bk5RTGRYcGdLUXVzd3Y0MmhtMUdxTytxVApSbVRGQUhuZUlXdjJWNkNHMXdaeTdIQkdTNHR6M2FBaGRUN2NIY0NQMDA5ekhJWFovbjlpeUpWdnR0TjdqTHBUCndtK2JSRXg1MEIxd3M5ZWZBdlN5QjdESDVmaXRJdzZtVnNrcEVuZEkyUzlHL1R2dy9IUndrcVdPT0FnZlpEQzIKdDB2N05xd1FqcUJTTTJPZEF6Vld4V205eGlOYUo1VDJwQkw0TFRNOG9WYWxYOVlaNmUxOENMMTN6U2RrekpUYQpUa1pRaCtENXdWT0FIcnV0KzBkU2l4djlvdm5lRGlLM1BUTlpiTlRlOVpVR01nMVJHVUZjUGs4Rzk3a3JnQ2YyCm82cDZmQWJoUThNVE9XSWFOcjNnS0M2VUF1UXBMbUJWcmtBOXNIU1NYdkFnWkpZL1gwVmRpTFdLMmdLZ1cwVlUKM2pnOUNjQ29TbVZHRnZ5cXYxUk9UVnUrT0VPM0tNcUxNNm9hSmJvbFhDa3ZXMHB1ak9vdG5DcjJCWGJnZDVlQQppTjFuRTI4ZGFDU0xUN2QwZ2VYMFlKOTZWZGMrTjlvV2F6NTNySzRZY0pVSWVTa0RpdjdCTzdNL0dnK2tPMTRmCldLR1Z5YXN2YzByUUxXNmFXUTlWR0hndFBGR21sNHZtdTdKd3Frd1Izdjk4S3pmVWV0RjNOSS9uK1VMM1BJRU0KUzFJSwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzMgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMyBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzMiCiMgU2VyaWFsOiAxNDkyMTA0OTA4MjcxNDg1NjUzMDcxMjE5OTQxODY0MTcxMTcwNDU1NjE1CiMgTUQ1IEZpbmdlcnByaW50OiAyMTozNzpiNDoxNzoxNjo5Mjo3Yjo2Nzo0Njo3MDphOTo5NjpkNzphODoxMzoyNAojIFNIQTEgRmluZ2VycHJpbnQ6IDZlOjI2OjY0OmYzOjU2OmJmOjM0OjU1OmJmOmQxOjkzOjNmOjdjOjAxOmRlOmQ4OjEzOmRhOjhhOmE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNzpjMzo2MjozMTo3MDo2ZTo4MTowNzo4YzozNjo3YzpiODo5NjoxOTo4ZjoxZTozMjowODpkZDo5Mjo2OTo0OTpkZDo4Zjo1NzowOTphNDoxMDpmNzo1Yjo2Mjo5MgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0lUQ0NBYWFnQXdJQkFnSVNFU0RtK0V6OEpMQytCVUNzMm9NYk5HQS9NQW9HQ0NxR1NNNDlCQU1ETUVBeApDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsUGNHVnVWSEoxYzNReEhUQWJCZ05WQkFNTUZFOXdaVzVVCmNuVnpkQ0JTYjI5MElFTkJJRWN6TUI0WERURTBNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOVEF3TURBd01Gb3cKUURFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVTl3Wlc1VWNuVnpkREVkTUJzR0ExVUVBd3dVVDNCbApibFJ5ZFhOMElGSnZiM1FnUTBFZ1J6TXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFSSzdsaXVUY3BtCjNnWTZveEg4NEJqd2JoeTZMVEFNaWRuVzdwdHpnNmtqRll3dldZcGEzUlRxblZrclE3Y0c3REsydXU1QnRhMWQKb1lYTTZoMFVacU5uZmtiaWxQUG50bGFoRlZtaFR6ZVh1U0lldlJIcjlMSWZYc01VbXVYWmw1bWpZekJoTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSSGQ4TVVpMkk1CkRNbHY0VkJOMEJCWTNKV0liVEFmQmdOVkhTTUVHREFXZ0JSSGQ4TVVpMkk1RE1sdjRWQk4wQkJZM0pXSWJUQUsKQmdncWhrak9QUVFEQXdOcEFEQm1BakVBajZqY25ib01CQmY2RmVrOUx5a0JsNytCRmpOQWsyejgrZTJBY0crcQpqOXVFd292MU5jb0czR1J2YUJiaGo1RzVBakVBMkV1bHk4TFFDR3pwR1B0YTNVMWZKQXV3QUNFbDc0K25CQ1p4CjRueHA1VjJhK0VFZk96bVRrNTFWNnMyTjhmdkIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlTUkcgUm9vdCBYMSBPPUludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwCiMgU3ViamVjdDogQ049SVNSRyBSb290IFgxIE89SW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAKIyBMYWJlbDogIklTUkcgUm9vdCBYMSIKIyBTZXJpYWw6IDE3Mjg4NjkyODY2OTc5MDQ3NjA2NDY3MDI0MzUwNDE2OTA2MTEyMAojIE1ENSBGaW5nZXJwcmludDogMGM6ZDI6Zjk6ZTA6ZGE6MTc6NzM6ZTk6ZWQ6ODY6NGQ6YTU6ZTM6NzA6ZTc6NGUKIyBTSEExIEZpbmdlcnByaW50OiBjYTpiZDoyYTo3OTphMTowNzo2YTozMTpmMjoxZDoyNTozNjozNTpjYjowMzo5ZDo0MzoyOTphNTplOAojIFNIQTI1NiBGaW5nZXJwcmludDogOTY6YmM6ZWM6MDY6MjY6NDk6NzY6ZjM6NzQ6NjA6Nzc6OWE6Y2Y6Mjg6YzU6YTc6Y2Y6ZTg6YTM6YzA6YWE6ZTE6MWE6OGY6ZmM6ZWU6MDU6YzA6YmQ6ZGY6MDg6YzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhekNDQTFPZ0F3SUJBZ0lSQUlJUXo3RFNRT05aUkdQZ3UyT0Npd0F3RFFZSktvWklodmNOQVFFTEJRQXcKVHpFTE1Ba0dBMVVFQmhNQ1ZWTXhLVEFuQmdOVkJBb1RJRWx1ZEdWeWJtVjBJRk5sWTNWeWFYUjVJRkpsYzJWaApjbU5vSUVkeWIzVndNUlV3RXdZRFZRUURFd3hKVTFKSElGSnZiM1FnV0RFd0hoY05NVFV3TmpBME1URXdORE00CldoY05NelV3TmpBME1URXdORE00V2pCUE1Rc3dDUVlEVlFRR0V3SlZVekVwTUNjR0ExVUVDaE1nU1c1MFpYSnUKWlhRZ1UyVmpkWEpwZEhrZ1VtVnpaV0Z5WTJnZ1IzSnZkWEF4RlRBVEJnTlZCQU1UREVsVFVrY2dVbTl2ZENCWQpNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLM29KSFAwRkRmem01NHJWeWdjCmg3N2N0OTg0a0l4dVBPWlhvSGozZGNLaS92VnFidllBVHlqYjNtaUdiRVNUdHJGai9SUVNhNzhmMHVveG15RisKMFRNOHVrajEzWG5mczdqL0V2RWhta3ZCaW9aeGFVcG1abXlQZmp4d3Y2MHBJZ2J6NU1EbWdLN2lTNCszbVg2VQpBNS9UUjVkOG1VZ2pVK2c0cms4S2I0TXUwVWxYaklCMHR0b3YwRGlOZXdOd0lSdDE4akE4K28rdTNkcGpxK3NXClQ4S09FVXQrend2by83VjNMdlN5ZTByZ1RCSWxESENOQXltZzRWTWs3QlBaN2htL0VMTktqRCtKbzJGUjNxeUgKQjVUMFkzSHNMdUp2VzVpQjRZbGNOSGxzZHU4N2tHSjU1dHVrbWk4bXhkQVE0UTdlMlJDT0Z2dTM5NmozeCtVQwpCNWlQTmdpVjUrSTNsZzAyZFo3N0RuS3hIWnU4QS9sSkJkaUIzUVcwS3RaQjZhd0JkcFVLRDlqZjFiMFNIelV2CktCZHMwcGpCcUFsa2QyNUhON3JPckZsZWFKMS9jdGFKeFFaQktUNVpQdDBtOVNUSkVhZGFvMHhBSDBhaG1iV24KT2xGdWhqdWVmWEtuRWdWNFdlMCtVWGdWQ3dPUGpkQXZCYkkrZTBvY1MzTUZFdnpHNnVCUUUzeERrM1N6eW5UbgpqaDhCQ05BdzFGdHhOclFIdXNFd01GeEl0NEk3bUtaOVlJcWlveW1DekxxOWd3UWJvb01EUWFIV0JmRWJ3cmJ3CnFIeUdPMGFvU0NxSTNIYWFkcjhmYXFVOUdZL3JPUE5rM3NnckRRb28vL2ZiNGhWQzFDTFFKMTNoZWY0WTUzQ0kKclU3bTJZczZ4dDBuVVc3L3ZHVDFNME5QQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSNXRGbm1lN2JsNUFGemdBaUl5QnBZOXVtYmJqQU5CZ2txCmhraUc5dzBCQVFzRkFBT0NBZ0VBVlI5WXFieXlxRkRRRExIWUdta2dKeWtJckdGMVhJcHUrSUxsYVMvVjlsWkwKdWJoekVGblRJWmQrNTB4eCs3TFNZSzA1cUF2cUZ5RldoZkZRRGxucnp1Qlo2YnJKRmUrR25ZK0VnUGJrNlpHUQozQmViWWh0RjhHYVYwbnh2d3VvNzd4L1B5OWF1Si9HcHNNaXUvWDErbXZvaUJPdi8yWC9xa1NzaXNSY09qL0tLCk5GdFkyUHdCeVZTNXVDYk1pb2d6aVV3dGhEeUMzKzZXVndXNkxMdjN4TGZIVGp1Q3ZqSElJbk56a3RIQ2dLUTUKT1JBekk0Sk1QSitHc2xXWUhiNHBob3dpbTU3aWF6dFhPb0p3VGR3Sng0bkxDZ2ROYk9oZGpzbnZ6cXZIdTdVcgpUa1hXU3RBbXpPVnl5Z2hxcFpYakZhSDNwTzNKTEYrbCsvK3NLQUl1dnRkN3UrTnhlNUFXMHdkZVJsTjhOd2RDCmpOUEVscHpWbWJVcTRKVWFnRWl1VERrSHpzeEhwRktWSzdxNCs2M1NNMU45NVIxTmJkV2hzY2RDYitaQUp6VmMKb3lpM0I0M25qVE9RNXlPZisxQ2NlV3hHMWJRVnM1WnVmcHNNbGpxNFVpMC8xbHZoK3dqQ2hQNGtxS09KMnF4cQo0Umdxc2FoRFlWdlRIOXc3alhieUxlaU5kZDhYTTJ3OVUvdDd5MEZmLzl5aTBHRTQ0WmE0ckYyTE45ZDExVFBBCm1SR3VuVUhCY25XRXZnSkJRbDluSkVpVTBac252Z2MvdWJoUGdYUlI0WHEzN1owajRyN2cxU2dFRXp3eEE1N2QKZW15UHhnY1l4bi9lUjQ0L0tKNEVCcytsVkRSM3ZleUptK2tYUTk5YjIxLytqaDVYb3MxQW5YNWlJdHJlR0NjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1GTk1ULVJDTSBPVT1BQyBSQUlaIEZOTVQtUkNNCiMgU3ViamVjdDogTz1GTk1ULVJDTSBPVT1BQyBSQUlaIEZOTVQtUkNNCiMgTGFiZWw6ICJBQyBSQUlaIEZOTVQtUkNNIgojIFNlcmlhbDogNDg1ODc2MzA4MjA2NDQ4ODA0NzAxNTU0NjgyNzYwNTU0NzU5CiMgTUQ1IEZpbmdlcnByaW50OiBlMjowOTowNDpiNDpkMzpiZDpkMTphMDoxNDpmZDoxYTpkMjo0NzpjNDo1NzoxZAojIFNIQTEgRmluZ2VycHJpbnQ6IGVjOjUwOjM1OjA3OmIyOjE1OmM0Ojk1OjYyOjE5OmUyOmE4OjlhOjViOjQyOjk5OjJjOjRjOjJjOjIwCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjpjNTo1NzowYzoyOTowMTo4Yzo0ZDo2NzpiMTphYToxMjo3YjphZjoxMjpmNzowMzpiNDo2MToxZTpiYzoxNzpiNzpkYTpiNTo1NzozODo5NDoxNzo5Yjo5MzpmYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmd6Q0NBMnVnQXdJQkFnSVBYWk9OTUdjMnlBWWRHc2RVaEdrSE1BMEdDU3FHU0liM0RRRUJDd1VBTURzeApDekFKQmdOVkJBWVRBa1ZUTVJFd0R3WURWUVFLREFoR1RrMVVMVkpEVFRFWk1CY0dBMVVFQ3d3UVFVTWdVa0ZKCldpQkdUazFVTFZKRFRUQWVGdzB3T0RFd01qa3hOVFU1TlRaYUZ3MHpNREF4TURFd01EQXdNREJhTURzeEN6QUoKQmdOVkJBWVRBa1ZUTVJFd0R3WURWUVFLREFoR1RrMVVMVkpEVFRFWk1CY0dBMVVFQ3d3UVFVTWdVa0ZKV2lCRwpUazFVTFZKRFRUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUxweGdIcE1obTUvCnlCTnR3TVo5SEFDWGp5d01JN3NRbWtDcEdyZUhpUGliVm1yNzVudU9pNUtPcHlWZFdSSGJOaTYzVVJjZnFRZ2YKQkJja1dLbzNTaGpmNVRuVVYvM1h3U3lSQVpIaUl0UUR3Rmo4ZDBmc2p6NTBRN3FzTkkxTk9IWm5qckRJYnpBegpXSEZjdFBWcmJ0UUJVTGdUZm14S28wblJJQm51dk1BcEdHV24zdjd2M1FxUUllY2FaNUpDRUpoZlR6QzhQaHhGCnRCRFhhRUFVd0VENjUzY1hldVlMajJWYlBObWFVdHUxdlo1R3p6M3JrUVVDd0pheWRreE5FSlk3a3ZxY2Z3K1oKMzc0ak5VVWVBbHordGFpYm1TWGFYdk1pd3puMTVDb3UwOFlmeEd5cXhSeHFBUVZLTDlMRndhZzBKbDFtcGRJQwpJZmtZdHdiMVRwbHZxS3RNVWVqUFVCakZkOGc1Q1N4SmtqS1pxTHNYRjNtd1dzWG1vOFJaWlVjMWcxNnA2RFVMCm1idmt6U0RHbTBvR09iVm8vQ0s2N2xXTUswN3E4N0hqL0xhWm10VkMrbkZOQ00rSEhtcHhmZm5UdE9tbGNZRjcKd2s1SGxxWDJkb1dqS0kvcGdHNkJVNlZ0WDdoSStjTDVOcVl1U2YrNGxzS01CN09iaUZqODZ4c2MzaTF3NHBlUwpNS0dKNDd4VnFDZldTKzJRcll2Nll5VlpMYWcxM2NxWE03emx6Y2VkMGV6dlhnNUtrQVltWTYyNTJUVXRCN3AyClpTeXNWNDk5OUFlVTE0RUNsbDJqQjBuVmV0QlgrUnZuVTBaMXFyQjVRc3RvY1FqcFlMMDVhYzcwcjhOV1FNZXQKVXFJSjVHK0dSNG9mNnlnblhZTWdyd1RKYkZhYWkwYjFBZ01CQUFHamdZTXdnWUF3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRlBkOXhmM0U2Sm9iZDJTbjlSMmd6TCtICllKcHRNRDRHQTFVZElBUTNNRFV3TXdZRVZSMGdBREFyTUNrR0NDc0dBUVVGQndJQkZoMW9kSFJ3T2k4dmQzZDMKTG1ObGNuUXVabTV0ZEM1bGN5OWtjR056THpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUI1QkszL01qVHZERApuRkZsbTV3aW9vb01oZk56S1d0Ti9nSGlxUXhqQWI4RVo2V2RtRi85QVJQNjdKcGk2WWIrdG1MU2JreVUrOEIxClJYeGxEUGl5Tjgrc0Q4K05iL2taOTQvc0h2SndudkRLdU8rMy8zWTNkbHYyYm9qenIySXlJcE1OT21xT0ZHWU0KTFZOMFYyVWUxYkxkSTRFN3BXWWpKMmNKaitGM3FrUE5aVkVJN1ZGWS91WTUrY3RIaEtRVjhYYTdwTzZrTzhSZgo3N0l6bGhFWXQ4bGx2aGpobzZUYytoajUwN3dUbXpsNk5MclRRZnY2TW9vcXR5dUdDMm1ET0w3TmlpNExjSzJOCkpwTHVIdlVCS3dyWjFwZWJidUNvR1J3NklZc01Ia0N0QStmZFpuNzF1U0FOQStpVytZSkYxRG5nb0FCZDE1am0KZlo1bmM4T2FLdmVyaTZFNkZPODB2RklPaVppYUJFQ0VIWDVGYVpOWHp1dk8rRkI4VHh4dUJFT2IrZFk3SXhqcAo2bzdSVFVhTjhUdmthc3E2K3lPM20vcVpBU2xhV0ZvdDQvblViUTRtcmNGdU5Md3krQXdGK21XajJ6czNneUxwCjF0eHlNLzFkOGlDOWRqd2oyaWozK1J2cldXVFYzRjl5ZmlEOHpZbTFrR2ROWW5vL1RxMGR3em4rZXZRb0Z0OUIKOWtpQUJkY1BVWG1zRUt2VTdBTm01bXF3dWpHU1FrQnF2anJUY3VGcU4xVzhyQjJWdDJsaDhrT1JkT2FnMHdvawpScUVJcjliYVJSbVcxRk1kVzRSNThNRDNSKytMajhVR3JwMU1ZcDMvUmdUNDA4bTJFQ1ZBZGY0V3FzbEtZSVl2CnV1OHdkK1JVNHJpRW1WaUFxaE9MVVRwUFNQYUx0ck09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSAxIE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgMSBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDE0MzI2Njk3ODkxNjY1NTg1Njg3ODAzNDcxMjMxNzIzMDA1NDUzODM2OTk5NAojIE1ENSBGaW5nZXJwcmludDogNDM6YzY6YmY6YWU6ZWM6ZmU6YWQ6MmY6MTg6YzY6ODg6Njg6MzA6ZmM6Yzg6ZTYKIyBTSEExIEZpbmdlcnByaW50OiA4ZDphNzpmOTo2NTplYzo1ZTpmYzozNzo5MTowZjoxYzo2ZTo1OTpmZDpjMTpjYzo2YTo2ZTpkZToxNgojIFNIQTI1NiBGaW5nZXJwcmludDogOGU6Y2Q6ZTY6ODg6NGY6M2Q6ODc6YjE6MTI6NWI6YTM6MWE6YzM6ZmM6YjE6M2Q6NzA6MTY6ZGU6N2Y6NTc6Y2M6OTA6NGY6ZTE6Y2I6OTc6YzY6YWU6OTg6MTk6NmUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQWltZ0F3SUJBZ0lUQm15Zno1bS9qQW81NHZCNGlrUG1salpieWpBTkJna3Foa2lHOXcwQkFRc0YKQURBNU1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNgpiMjRnVW05dmRDQkRRU0F4TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOekF3TURBd01Gb3dPVEVMCk1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnYKYjNRZ1EwRWdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMSjRnSEhLZU5YagpjYTlIZ0ZCMGZXN1kxNGgyOUpsbzkxZ2hZUGwwaEFFdnJBSXRodE9nUTNwT3NxVFFOcm9Cdm8zYlNNZ0hGelpNCjlPNklJOGMrNnpmMXRSbjRTV2l3M3RlNWRqZ2RZWjZrL29JMnBlVktWdVJGNGZuOXRCYjZkTnFjbXpVNUwvcXcKSUZBR2JIclFnTEttK2Evc1J4bVBVRGdIM0tLSE9WajR1dFdwK1Vobk1KYnVsSGhlYjRtalVjQXdobWFoUldhNgpWT3VqdzVINVNOei8wZWd3TFgwdGRIQTExNGdrOTU3RVdXNjdjNGNYOGpKR0tMaEQrcmNkcXNxMDhwOGtEaTFMCjkzRmNYbW4vNnBVQ3l6aUtybEE0Yjl2N0xXSWJ4Y2NlVk9GMzRHZklENXlISTlZL1FDQi9JSURFZ0V3K095UW0KamdTdWJKcklxZzBDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBWVl3SFFZRFZSME9CQllFRklRWXpJVTA3THdNbEpRdUNGbWN4N0lRVGdvSU1BMEdDU3FHU0liM0RRRUJDd1VBCkE0SUJBUUNZOGpkYVFaQ2hHc1YyVVNnZ05pTU9ydVlvdTZyNGxLNUlwREIvRy93a2pVdTB5S0dYOXJieGVuREkKVTVQTUNDamptQ1hQSTZUNTNpSFRmSVVKclU2YWRUckNDMnFKZUhaRVJ4aGxiSTFCamp0L21zdjB0YWRRMXdVcwpOK2dEUzYzcFlhQUNidlh5OE1XeTdWdTMzUHFVWEhlZUU2Vi9VcTJWOHZpVE85NkxYRnZLV2xKYllLOFU5MHZ2Cm8vdWZRSlZ0TVZUOFF0UEhSaDhqcmRrUFNIQ2EyWFY0Y2RGeVF6UjFibGRad2dKY0ptQXB6eU1aRm82SVE2WFUKNU1zSSt5TVJRK2hES1hKaW9hbGRYZ2pVa0s2NDJNNFV3dEJWOG9iMnhKTkRkMlpod0xub1FkZVhlR0FEYmtweQpycVhSZmJvUW5vWnNHNHE1V1RQNDY4U1F2dkc1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSAyIE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgMiBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDE0MzI2Njk4Mjg4NTk2MzU1MTgxODM0OTE2MDY1ODkyNTAwNjk3MDY1MzIzOQojIE1ENSBGaW5nZXJwcmludDogYzg6ZTU6OGQ6Y2U6YTg6NDI6ZTI6N2E6YzA6MmE6NWM6N2M6OWU6MjY6YmY6NjYKIyBTSEExIEZpbmdlcnByaW50OiA1YTo4YzplZjo0NTpkNzphNjo5ODo1OTo3Njo3YTo4Yzo4Yjo0NDo5NjpiNTo3ODpjZjo0Nzo0YjoxYQojIFNIQTI1NiBGaW5nZXJwcmludDogMWI6YTU6YjI6YWE6OGM6NjU6NDA6MWE6ODI6OTY6MDE6MTg6Zjg6MGI6ZWM6NGY6NjI6MzA6NGQ6ODM6Y2U6YzQ6NzE6M2E6MTk6YzM6OWM6MDE6MWU6YTQ6NmQ6YjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZRVENDQXltZ0F3SUJBZ0lUQm15ZjBwWTFocDhLRCtXR2VQaGJKcnVLTnpBTkJna3Foa2lHOXcwQkFRd0YKQURBNU1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNgpiMjRnVW05dmRDQkRRU0F5TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMCk1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnYKYjNRZ1EwRWdNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMldueTJjU2t4SwpnWGxSbWV5S3kydGdVUk84VFcwRy9MQUlqZDBaRUdySEpndzEyTUJ2SUlUcGxMR2JoUVBEVzl0SzZNajRrSGJaClcwL2pUT2dHTmszTW1xdzlESkFya3RRR0dXQ3NOMFI1aFlHQ3JWbzM0QTNNbmFaTVVuYnFRNTIzQk5GUTlsWGcKMWRLbVNZWHBOK25LZnE1Y2xVMUltait1SUZwdGlKWFpOTGhTR2tPUXNMOXNCYm0yZUxmcTBPUTZQQkpUWXY5Swo4bnUrTlFXcEVqVGo4MlIwWWl3OUFFbGFLUDR5Ukx1SDNXVW5BbkU3MmtyM0g5ck45eUZWa0U4UDdLNkM0WjlyCjJVWFR1L0JmaCswOExEbUcyai9lN0hKVjYzbWpyZHZkZkxDNkhNNzgzazgxZHM4UCtIZ2ZhalpSUmlkaFcrbWUKei9DaVZYMThKWXB2TDdURno0UXVLLzBOVVJCcysxOGJ2QnQreGE0N21BRXhrdjhMVi9TYXNybFg2YXZ2RFhiUgo4Tzcwem9hbjRHN3B0R21oMzJuMk04WnBMcGNUbnFXSHNGY1FnVGZKVTdPN2YvYVMwWnpRR1BTU2J0cURUNlpqCm1VeWwrMTd2SVdSNklGOXNaSVVWeXpmcFlnd0xLaGJjQVM0eTJqNUw5WjQ2OWhkQWxPK2VrUWlHK3I1anFGb3oKN010MFE1WDViR2xTTnNjcGIveFZBMXdmKzUrOVIrdm5TVWVWQzA2SklnbEo0UFZoSHZHL0xvcHlib0JaLzFjNgorWFV5bzA1ZjdPMG9ZdGxOYy9MTWdSZGc3YzNyM051bnlzVitBcjN5VkFoVS9iUXRDU3dYVkVxWTBWVGhVV2NJCjB1MXVmbTgvMGkyQldTbG15NUE1bFJFZWRDZiszZXV2QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJTd0RQQk1NUFFGV0FKSS9UUGxVcTlMaE9ObQpVakFOQmdrcWhraUc5dzBCQVF3RkFBT0NBZ0VBcXFpQWp3NTRvK0NpMU0zbTlaaDZPK29BQTdDWERwTzhXcWoyCkxJeHloNm14L0g5ei9XTnhlS1dIV2M4dzRRMFFzaE5hYllMMWF1YUFuNkFGQzJqa1IydkhhdCsyL1hjeWN1VVkKK2duMG9KTXNYZEtNZFlWMlpaQU1BM20zTVNOanJYaURDWVpvaE1yLytjOG1tcEo1NTgxTHhlZGhweGZMODZrUwprNU5ycCtndlU1TEVZRml3ekFKUkdGdUZqV0paWTdhdHRONmEreWIzQUNmQVhWVTNkSm5KVUgvaldTNUU0eXdsCjd1eE1NbmUwbnhycFMxMGd4ZHI5SEljV3hrUG8xTHNtbWtWd1hxa0xOMVBpUm5zbi9lQkc4b20zekVLMnl5Z20KYnRtbHlUcklRUk5nOTFDTUZhNnliUm9WR2xkNDVwSXEyV1dRZ2o5c0FxK3VFam9ubGpZRTF4MmlnR09wbS9IbAp1clI4RkxCT3liRWZkRjg0OWxIcW0vb3NvaEhVcVMwbkdrV3hyN0pPY1EzQVdFYldhUWJMVTh1ei9tdEJ6VUYrCmZVd1BmSEo1ZWxuTlhrb09ySnVwbUhONWZMVDB6TG00Qnd5eWRGeTR4MitJb1pDbjlLcjV2MmM2OUJvVlloNjMKbjc0OXNTbXZaNkVTOGxnUUdWTURNQnU0R29uMm5MMlhBNDZqQ2ZNZGl5SHh0Ti9rSE5HZlpRSUc2bHpXRTdPRQo3NktsWEl4M0thZG93R3V1UU5Lb3RPck44STFMT0p3Wm1oc29WTGlKa08vS2RZRStIdkprSk1jWXIwNy9SNTRICjlqVmxwTk1LVnYvMUYyUnM3NmdpSlVtVHR0OEFGOXBZZmwzdXhSdXcwZEZmSVJESCtmTzZBZ29uQjhYeDFzZlQKNFBzSllHdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDMgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAzIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAzIgojIFNlcmlhbDogMTQzMjY2OTg2Njk5MDkwNzY2Mjk0NzAwNjM1MzgxMjMwOTM0Nzg4NjY1OTMwCiMgTUQ1IEZpbmdlcnByaW50OiBhMDpkNDplZjowYjpmNzpiNTpkODo0OTo5NToyYTplYzpmNTpjNDpmYzo4MTo4NwojIFNIQTEgRmluZ2VycHJpbnQ6IDBkOjQ0OmRkOjhjOjNjOjhjOjFhOjFhOjU4Ojc1OjY0OjgxOmU5OjBmOjJlOjJhOmZmOmIzOmQyOjZlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxODpjZTo2YzpmZTo3YjpmMTo0ZTo2MDpiMjplMzo0NzpiODpkZjplODo2ODpjYjozMTpkMDoyZTpiYjozYTpkYToyNzoxNTo2OTpmNTowMzo0MzpiNDo2ZDpiMzphNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQnRqQ0NBVnVnQXdJQkFnSVRCbXlmMVhTWE5tWS9Pd3VhMmVpZWRnUHlTakFLQmdncWhrak9QUVFEQWpBNQpNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnClVtOXZkQ0JEUVNBek1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0cKQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZwpRMEVnTXpCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkNtWHA4WkJmOEFObStnQkcxYkc4bEtsCnVpMnlFdWpTTHRmNnljWFlxbTBmYzRFN081aHJPWHd6cGNWT2hvNkFGMmhpUlZkOVJGZ2RzemZsWndqclp0NmoKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJTcgp0dHZYQnA0M3JEQ0dCNUZ3eDV6RUdiRjR3REFLQmdncWhrak9QUVFEQWdOSkFEQkdBaUVBNElXU294ZTNqZmtyCkJxV1RyQnFZYUdGeSt1R2gwUHNjZUdDbVE1bkZ1TVFDSVFDY0F1L3hsSnl6bHZucnhpcjR0aXorT3BBVUZ0ZU0KWXlSSUhOOHdmZFZvT3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgNCBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDQgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDQiCiMgU2VyaWFsOiAxNDMyNjY5ODk3NTgwODA3NjM5NzQxMDUyMDA2MzA3NjM4Nzc4NDkyODQ4NzgKIyBNRDUgRmluZ2VycHJpbnQ6IDg5OmJjOjI3OmQ1OmViOjE3OjhkOjA2OjZhOjY5OmQ1OmZkOjg5OjQ3OmI0OmNkCiMgU0hBMSBGaW5nZXJwcmludDogZjY6MTA6ODQ6MDc6ZDY6Zjg6YmI6Njc6OTg6MGM6YzI6ZTI6NDQ6YzI6ZWI6YWU6MWM6ZWY6NjM6YmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUzOjVkOjI4OjQxOjllOmQwOjIwOjI1OmNmOmE2OjkwOjM4OmNkOjYyOjM5OjYyOjQ1OjhkOmE1OmM2Ojk1OmZiOmRlOmEzOmMyOjJiOjBiOmZiOjI1Ojg5OjcwOjkyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCOGpDQ0FYaWdBd0lCQWdJVEJteWYxOEc3RUV3cFErVnhlM3NzeUJyQkRqQUtCZ2dxaGtqT1BRUURBekE1Ck1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGcKVW05dmRDQkRRU0EwTUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrRwpBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnClEwRWdOREIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJOS3JpamRQbzFNTi9zR0tlMHVvZTBaTFk3QmkKOWkwYjJ3aHhJZElBNkdPOW1pZjc4RGx1WGVvOXBjbUJxcU5iSUpoRlhSYmIvZWdRYmVPYzRPTzlYNFJpODNCawpNNkRMSkM5d3VvaWhLcUIxK0lHdVlnYkVnZHM1Ymltd0h2b3VYS05DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0hRWURWUjBPQkJZRUZOUHN4enBsYnN6aDJuYWFWdnVjODRadFYrV0IKTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTURxTElmRzlmaEd0ME85WWxpL1c2NTEra0kwcnoyWlZ3eXpqS0tsdwpDa2NPOERkWkV2OHRtWlFvVGlwUE5VMHpXZ0l4QU9wMUFFNDd4RHFVRXBISldFYWRJUk55cDRpY2l1Uk1TdHVXCjFLeUxhMnRKRWxNenJkZmt2aVQ4dFFwMjFLVzhFQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1MdXhUcnVzdCBHbG9iYWwgUm9vdCAyIE89THV4VHJ1c3QgUy5BLgojIFN1YmplY3Q6IENOPUx1eFRydXN0IEdsb2JhbCBSb290IDIgTz1MdXhUcnVzdCBTLkEuCiMgTGFiZWw6ICJMdXhUcnVzdCBHbG9iYWwgUm9vdCAyIgojIFNlcmlhbDogNTk5MTQzMzgyMjU3MzQxNDcxMjM5NDEwNTgzNzY3ODgxMTAzMDU4MjI0ODk1MjEKIyBNRDUgRmluZ2VycHJpbnQ6IGIyOmUxOjA5OjAwOjYxOmFmOmY3OmYxOjkxOjZmOmM0OmFkOjhkOjVlOjNiOjdjCiMgU0hBMSBGaW5nZXJwcmludDogMWU6MGU6NTY6MTk6MGE6ZDE6OGI6MjU6OTg6YjI6MDQ6NDQ6ZmY6NjY6OGE6MDQ6MTc6OTk6NWY6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU0OjQ1OjVmOjcxOjI5OmMyOjBiOjE0OjQ3OmM0OjE4OmY5Ojk3OjE2OjhmOjI0OmM1OjhmOmM1OjAyOjNiOmY1OmRhOjViOmUyOmViOjZlOjFkOmQ4OjkwOjJlOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGd3pDQ0E2dWdBd0lCQWdJVUNuNm0zMHRFbnRwcUpJV2U1cmdWMHhaL3U3RXdEUVlKS29aSWh2Y05BUUVMCkJRQXdSakVMTUFrR0ExVUVCaE1DVEZVeEZqQVVCZ05WQkFvTURVeDFlRlJ5ZFhOMElGTXVRUzR4SHpBZEJnTlYKQkFNTUZreDFlRlJ5ZFhOMElFZHNiMkpoYkNCU2IyOTBJREl3SGhjTk1UVXdNekExTVRNeU1UVTNXaGNOTXpVdwpNekExTVRNeU1UVTNXakJHTVFzd0NRWURWUVFHRXdKTVZURVdNQlFHQTFVRUNnd05USFY0VkhKMWMzUWdVeTVCCkxqRWZNQjBHQTFVRUF3d1dUSFY0VkhKMWMzUWdSMnh2WW1Gc0lGSnZiM1FnTWpDQ0FpSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5lRmw3OFJtT253WW9OTVBJZjVVMm8zQy9JUFBJZk9iOXdtS2IzRgppYnJKZ3ozMzdzcGJ4bTFKYzdUSlJxTWJOQk0vd1lsRlYvVFpzZnMyWlV2N0NPSkljUkhJYmp1ZW5kK0paVGVtCmhmWTdSQmkyeGpjd1lrU1NsMmw5UWpBazVBME1pV3RqM3NYaDMwNnBGR3hUNEdITzloY3ZIVHk5NWlKTUhaUDEKRU1TaGR1eHEzc1ZzMzVhMFZrQkN3R0tTTUtFdEZaU2cwaUFHQ1c1cWJlWHJ0NzdVOFBFVmZJdm1Ucm9UekVzbgpYcGs4RjEyUGdYOHpQVS9UUHh2c1hEL3dQRXgxYnZLbTFaM2FMUWRqQXNaeTZaUzhURW1WVDRoU3lOdm9hWUw0CnpEUmJJdkNHcDRtOVNBcHRab0Z0eU1oayt3SGg5T0hlMlo3ZDIxdlVLcGttRlJzZVRKSXBncDdWa29HU1FYQVoKOTZUbGswdThkMmN4M1J6OU1YQU5GNWtNK1F3NUdTb1h0VEJ4VmRVUHJsamhQUzgwbTgrZjluaUZ3cE42Y2o1bQpqNXdXRVdDUG5vbHZaNzdnUjFvN0RKcG5pODlHeHE0NG8vS252T2JXaFdzekpIQWlTOHNJbTd2SStBSXBIYjRnCkRFYS9hNGVic3lwbVFqVkdiS3E2cmZtWWUrbFFWUlF4djdIYUxlMkFyV2drKzJtcjJIRVRNT1puczRkQS9ZbCsKOGtQUkVkOHZaUzlremw4VXViRy9NYjJIZUZwWlpZaXEvRmt5U0liV1RMa3BTNVhUZHZOM0pXMUNIRGlEVGYyagpYNXQvTGF4NUd3NUNNWmRqcFB1S2FkVWlEVFNRTUM2b3RPQnR0cFNzdkl0TzEzRDh4VGlPWkNYaFRUbVF6c21ICmhGaHhBZ01CQUFHamdhZ3dnYVV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJDQmdOVkhTQUVPekE1TURjR0J5dUIKS3dFQkFRb3dMREFxQmdnckJnRUZCUWNDQVJZZWFIUjBjSE02THk5eVpYQnZjMmwwYjNKNUxteDFlSFJ5ZFhOMApMbXgxTUE0R0ExVWREd0VCL3dRRUF3SUJCakFmQmdOVkhTTUVHREFXZ0JUL0dDaDIrVWdGTEtHdThTc2JLN0pUCitFdDhzekFkQmdOVkhRNEVGZ1FVL3hnb2R2bElCU3locnZFckd5dXlVL2hMZkxNd0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnSUJBR29aRk8xdWVjRXNoOVFOY0g3WDluakpDd1JPeExIT2szRCtzRlRBTXMyWk1HUVh2dy9sNGpQOQpCelpBY2c0YXRtcFoxZ0RsYUNEZExuSU5IMnBrTVNDRWZVbW1XamZyUmNtRjlkVEhGNWtINXB0VjVBem9xYlRPCmpGdTFFVnpQaWc0TjFxeDNnZjR5bkNTZWNzNVU4OUJ2b2xiVzdNTTNMR1ZZdmxjQUd2STErdXQ3TVYzQ3dSSTkKbG9HSWxvbkJXVng2NW45d05PZUQ0ckhoNGJoWTc5U1Y1R0NjOEphWGNvenJoQUl1Wlkra3Q5Si9aOTNJMDU1YwpxcW1rb0NVVUJwdnNUMzR0QzM4ZGRmRXoyTzNPdUhWdFBsdTVtQjB4RFZiWVF3OHdrYklFYTkxV3ZwV0FWV2UrCjJNMkQyUmp1TGcrR0xaS2VjQlBzM2xISlEzZ0NwVTNJK1YvRWtWaEdGbmRhZEtwQXZBZWZNTG14OXhJWDNlUC8KSkVBZGVtclJUeGdLcXBBZDYwQWUzNkVlUkpJUW12S040ZEZMUnA3b1JVS1g2a1daOCt4bTFRTDY4cVpLSktyZQp6cm5LK1QrVGIvbWp1dXFsUHBtdC9mOTdtZlZsN3ZCWktHZlhrSldrRTRTcGhNSG96czUxazJNYXZEenExV1FmCkxTb1NPY2JEV2pMdFI1RVdEcnc0d1ZEZWo4b3FrRFFjN2tHVW5GNFpMdmhGU1psMGtiQUViK01FV3JHcktxdisKeDlDV3R0cmhTbVFHYm1CTnZVSk8vM2phSk1vYnROZVdPV3l1OFE2cXAzMUlpeUJNejJUV3VKZEdzRTdSS2xZNgpvSk85cjRBazRBcCs1OHJWeXVpRlZkdzJLdUdVYUpQSFpuSkVENEFoTW13bHh5T0Fnd3JyCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEgTz1UdXJraXllIEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsgT1U9S2FtdSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkgLSBLYW11IFNNCiMgU3ViamVjdDogQ049VFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxIE89VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLIE9VPUthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTQojIExhYmVsOiAiVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogZGM6MDA6ODE6ZGM6Njk6MmY6M2U6MmY6YjA6M2I6ZjY6M2Q6NWE6OTE6OGU6NDkKIyBTSEExIEZpbmdlcnByaW50OiAzMTo0Mzo2NDo5YjplYzpjZToyNzplYzplZDozYTozZjowYjo4ZjowZDplNDplODo5MTpkZDplZTpjYQojIFNIQTI1NiBGaW5nZXJwcmludDogNDY6ZWQ6YzM6Njg6OTA6NDY6ZDU6M2E6NDU6M2Y6YjM6MTA6NGE6Yjg6MGQ6Y2E6ZWM6NjU6OGI6MjY6NjA6ZWE6MTY6Mjk6ZGQ6N2U6ODY6Nzk6OTA6NjQ6ODc6MTYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVZekNDQTB1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCMGpFTE1Ba0dBMVVFQmhNQ1ZGSXgKR0RBV0JnTlZCQWNURDBkbFlucGxJQzBnUzI5allXVnNhVEZDTUVBR0ExVUVDaE01VkhWeWEybDVaU0JDYVd4cApiWE5sYkNCMlpTQlVaV3R1YjJ4dmFtbHJJRUZ5WVhOMGFYSnRZU0JMZFhKMWJYVWdMU0JVVlVKSlZFRkxNUzB3Ckt3WURWUVFMRXlSTFlXMTFJRk5sY25ScFptbHJZWE41YjI0Z1RXVnlhMlY2YVNBdElFdGhiWFVnVTAweE5qQTAKQmdOVkJBTVRMVlJWUWtsVVFVc2dTMkZ0ZFNCVFRTQlRVMHdnUzI5cklGTmxjblJwWm1scllYTnBJQzBnVTNWeQpkVzBnTVRBZUZ3MHhNekV4TWpVd09ESTFOVFZhRncwME16RXdNalV3T0RJMU5UVmFNSUhTTVFzd0NRWURWUVFHCkV3SlVVakVZTUJZR0ExVUVCeE1QUjJWaWVtVWdMU0JMYjJOaFpXeHBNVUl3UUFZRFZRUUtFemxVZFhKcmFYbGwKSUVKcGJHbHRjMlZzSUhabElGUmxhMjV2Ykc5cWFXc2dRWEpoYzNScGNtMWhJRXQxY25WdGRTQXRJRlJWUWtsVQpRVXN4TFRBckJnTlZCQXNUSkV0aGJYVWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTlpYSnJaWHBwSUMwZ1MyRnRkU0JUClRURTJNRFFHQTFVRUF4TXRWRlZDU1ZSQlN5QkxZVzExSUZOTklGTlRUQ0JMYjJzZ1UyVnlkR2xtYVd0aGMya2cKTFNCVGRYSjFiU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyM1V3TTZxNwphOU9aTEJJM2hObU5lNWVBMDI3bi81dFFsVDZRbFZaQzF4bDhKb1NOa3ZvQkhUb1A0bVE0dDR5ODZJajVpeVNyCkxxUDFOK1JBamhnbGVZTjFIenYvYktqRnhsYjR0TzJLUktPcmJFejhIZERjNzJpOXorU3F6dkJWOTZJMDFJTnIKTjN3Y3d2NjFBK3hYenJ5MHRjWHRBQTlUTnlwTjlFOE1nL3VHejh2K2pFNjloL21uaXlGWG5IcmZBMmVKTEoyWApZYWNRdUZXUWZ3NHRKemgwMytmOTJrNFM0MDBWSWdMSTRPRDhENjJLMThsVVVNdzdEOG9XZ0lUUVVWYkRqbFovCmlTSXpMK2FGQ3IybHFCczIzdFBjTEcwN3h4TzlXU01zNXVXazk5Z0w3ZXFRUUVTb2xidVQxZENBTkxaR2VBNGYKQUpORzRlN3ArZXhQRndJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVpUL0hpb2JHUE4wOFZGdzErRHJ0VWd4SApWOGd3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0VCQUNvLzRmRXlqcTdobUZ4TFhzOXJIbW9KMGlLcEVzZGVWMzF6Vm1TQWhIcVQ1QW01RU0yZktpZmgKQUhlK1NNZzFxSUdmNUxnc3lYOE9zTkpMTjEzcXVkVUxYalM5OUhNcHcrMG1GWngrQ0ZPS1dJM1FTeWpmd2JQZgpJUFA1NCtNNjM4eWNsTmhPVDhOckY3ZjNjdWl0WmpPMUpWT3I0UGhNcVozOThnMjZycm5acXNacitaTzdycXU0Cmx6d0RHcnBEeHBhNVJYSTRzNmVobGoyUmUzN0FJVk5NaCszeUMxU1ZVWlBWSXFVTml2R1REajVVRHJEWXlVN2MKOGpFeVZ1cGsrZXExblJabVFuTHpmOU94TVVQOHBJNFg4VzBqcTVSbStLMzdEd2h1SmkxL0Z3Y0pzb3o3VU1DZgpsbzNQdHYwQW5Wb1VtcjhDUlBYQndwOGlYcUlQb2VNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R0RDQSBUcnVzdEFVVEggUjUgUk9PVCBPPUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuCiMgU3ViamVjdDogQ049R0RDQSBUcnVzdEFVVEggUjUgUk9PVCBPPUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuCiMgTGFiZWw6ICJHRENBIFRydXN0QVVUSCBSNSBST09UIgojIFNlcmlhbDogOTAwOTg5OTY1MDc0MDEyMDE4NgojIE1ENSBGaW5nZXJwcmludDogNjM6Y2M6ZDk6M2Q6MzQ6MzU6NWM6NmY6NTM6YTM6ZTI6MDg6NzA6NDg6MWY6YjQKIyBTSEExIEZpbmdlcnByaW50OiAwZjozNjozODo1Yjo4MToxYToyNTpjMzo5YjozMTo0ZTo4MzpjYTplOTozNDo2Njo3MDpjYzo3NDpiNAojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6ZmY6OGY6ZDA6NDQ6MzM6NDg6N2Q6NmE6OGE6YTY6MGM6MWE6Mjk6NzY6N2E6OWY6YzI6YmI6YjA6NWU6NDI6MGY6NzE6M2E6MTM6Yjk6OTI6ODk6MWQ6Mzg6OTMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZpRENDQTNDZ0F3SUJBZ0lJZlFtWC92Qkg2bm93RFFZSktvWklodmNOQVFFTEJRQXdZakVMTUFrR0ExVUUKQmhNQ1EwNHhNakF3QmdOVkJBb01LVWRWUVU1SElFUlBUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWgpJRU5QTGl4TVZFUXVNUjh3SFFZRFZRUUREQlpIUkVOQklGUnlkWE4wUVZWVVNDQlNOU0JTVDA5VU1CNFhEVEUwCk1URXlOakExTVRNeE5Wb1hEVFF3TVRJek1URTFOVGsxT1Zvd1lqRUxNQWtHQTFVRUJoTUNRMDR4TWpBd0JnTlYKQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaSUVOUExpeE1WRVF1TVI4dwpIUVlEVlFRRERCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMmFNVzhNaDBkSGViN3pNTk93WitWZnkxWUk5MmhoSkNmVlptUG9pQzdYSmoKRHA2TDNUUXNBbEZSd3huOVdWU0V5ZkZyczB5dzZlaEdYVGpHb3FjdUVWZTZnaFdpbkk5dHNKbEtDdkxyaVhCagpUbm5FdDF1OW9sMng4a0VDSzYycE9xUHNlUXJzWHpyai9lK0FQSzAwbXhxcmlDWjdWcUtDaGgvck5ZbURmMSt1CktVNDl0bTdzcnNId0o1dXU0L1RzNzY1Lzk0WTljbnJycGZ0WlRxZnJsWXdpT1huaExRaVB6THlSdUVIM0ZNRWoKcWNPdG1rVkVzN0xYTE0zR0tlSlFFSzVjeTRLT0Z4ZzJmWmZtaUpxd1RUUUo5Q3k1V21ZcXNCZWJuaDUyblVwbQpNVUhmUC92RkJ1OGJ0bjRhUmpiM1pHTTc0emtZSStkbmRSVFZkVmVTTjcyK2Foc21VUEkySmdhUXhYQUJaRzEyClp1R1IyMjRId0dHQUxySXVMNHh3cDlFN1BMT1I1RzYyeER0dzhteVNsd25OUjMwWXdQTzduZy9XaTY0SHRsb1AKemdzTVI2ZmxQcmk5ZmNlYk5hQmhsenBCZFJmTUs1WjNLcEloSHRtVmRpQm5hTThOdmQvV0h3bHFtdUxNYzNHawpMMzBTZ0xkVE1FWmVTMVNaRDJmSnBjanlJTUdDN0owUjM4SUMreG83MGUwZ211OWxaSklRRFNyaTNuRHhHR2VDCmpHSGV1THpSTDV6N0Q5QXI3UnQydWVRNVZmajRvUjI0cW9BQVRJTG5zbjhKdUx3d29DOE45VktlanZlU3N3b0EKSFFCVWx3YmdzUWZaeHc5Y1pYMDhiVmxYNU8ybGplbEFVNThWUzZCeDlob2g0OXB3QmlGWUZJZUZkM21xZ25rQwpBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGT0xKUUo5Tnp1aWFvWHpQRGo5bHhTbUlhaGxSTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFEUlNWZmcKcDh4b1dMb0JEeXNaelkyd1lVV3NFZTFqVUduNEgzKytGby85bmVzTHFqSkhkdEpuSk8yOWZETXlseXJIQllabQpEUmQ5RkJVYjFPdjlINXIyWHBkcHR4b2xwQXF6a1Q5Zk5xeUw3RmVvUHVlQmloaFhPWVYwR2tMSDZWc1RYNC81CkNPbVNkSTMxUjlLck85YjdlR1pPTm4zNTZaTHBCTjc5U1dQOGJmc1VjWk5uTDBkS3Q3bi9IaXB6Y0VZd3YxcnkKTDNtbDRZME0yZm15WXplTU4yV0ZjR3BjV3dseXVhMWpQTEhkK1B3eXZ6ZUc1THVPbUNkK3VoOFc0WEFSOGdQZgpKV0l5SnlZWU1vU2Yvd0E2RTdxYVRmUlB1QlJ3SXJIS0s1RE9LY0Z3OUMrZGYvS1FIdFphMzdkRy9PYUcrc3ZnCklIWjZ1cWJMOVh6ZVlxV3hpKzdlZ21hS1Rqb3dIeitBeTYwbnVneGUxOUN4VnNwM2NiSzFkYUZRcVVCREY4SW8KMmM5U2kxdklZOVJDUHFBemVrWXU5d29nUmxSK2FrOHg4WUYrUW5RNFpYTW43c1o4dUk3WHBUclhtS0djakJCVgowOXRMN0VDUThzMXVWOUppRG54WGs3R25iYzJkZzdzcTUrVzJPM0ZZcmYzUlJieGFrZTVURlcvVFJRbDFicnFRClhSNEV6emZmSHFobXNZem1JR3J2L0VoT2RKaENyeWx2TG1ySCszM1JaakVpeklZQWZtYURERUwwdlRTU3d4cnEKVDhwK2NrMExjSXltU0x1bW9SVDIrMWhFbVJTdXFndVRhYUFwSlVxbHl5dmRpbVlIRm5nVlYzRWI3UFZIaFBPZQpNVGQ2MVg4a3JlUzgvZjNNYm9Qb0RLaTNRV3dIM2IwOGhwY3YwZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgTGFiZWw6ICJUcnVzdENvciBSb290Q2VydCBDQS0xIgojIFNlcmlhbDogMTU3NTI0NDQwOTU4MTEwMDY0ODkKIyBNRDUgRmluZ2VycHJpbnQ6IDZlOjg1OmYxOmRjOjFhOjAwOmQzOjIyOmQ1OmIyOmIyOmFjOjZiOjM3OjA1OjQ1CiMgU0hBMSBGaW5nZXJwcmludDogZmY6YmQ6Y2Q6ZTc6ODI6Yzg6NDM6NWU6M2M6NmY6MjY6ODY6NWM6Y2E6YTg6M2E6NDU6NWI6YzM6MGEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGQ0OjBlOjljOjg2OmNkOjhmOmU0OjY4OmMxOjc3OjY5OjU5OmY0OjllOmE3Ojc0OmZhOjU0Ojg2Ojg0OmI2OmM0OjA2OmYzOjkwOjkyOjYxOmY0OmRjOmUyOjU3OjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTURDQ0F4aWdBd0lCQWdJSkFOcWI3SEh6QTdBWk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHa01Rc3dDUVlEClZRUUdFd0pRUVRFUE1BMEdBMVVFQ0F3R1VHRnVZVzFoTVJRd0VnWURWUVFIREF0UVlXNWhiV0VnUTJsMGVURWsKTUNJR0ExVUVDZ3diVkhKMWMzUkRiM0lnVTNsemRHVnRjeUJUTGlCa1pTQlNMa3d1TVNjd0pRWURWUVFMREI1VQpjblZ6ZEVOdmNpQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt4SHpBZEJnTlZCQU1NRmxSeWRYTjBRMjl5CklGSnZiM1JEWlhKMElFTkJMVEV3SGhjTk1UWXdNakEwTVRJek1qRTJXaGNOTWpreE1qTXhNVGN5TXpFMldqQ0IKcERFTE1Ba0dBMVVFQmhNQ1VFRXhEekFOQmdOVkJBZ01CbEJoYm1GdFlURVVNQklHQTFVRUJ3d0xVR0Z1WVcxaApJRU5wZEhreEpEQWlCZ05WQkFvTUcxUnlkWE4wUTI5eUlGTjVjM1JsYlhNZ1V5NGdaR1VnVWk1TUxqRW5NQ1VHCkExVUVDd3dlVkhKMWMzUkRiM0lnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1SOHdIUVlEVlFRRERCWlUKY25WemRFTnZjaUJTYjI5MFEyVnlkQ0JEUVMweE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQXY0NjNsZUxDSmhKck14bkhRRmdLcTFtcWpRQ2ovSURIVUh1TzFDQW11aklTMkNOVVNTVVFJcGlkClJ0TEJ5WjVPR3k0c0RqanpHaVZvSEtaYUJlWWVpMGkvbUpaMFBtbks2YlY0cFFhODFRQmVDUXJ5SjNwUy9DM1YKc2VxMGlXRWs4eG9UMjZuUFV1ME1KTHE1bnV4K0FIVDZrNjFzS1pLdVViUzcwMWUvcy9Pb2paejBKRXNxMXBtZQo5Sjcrd0g1Q091Y0xsVlBhdDJnT2tFejdjRCtQU2l5VTh5YmRZMm1wbE5nUVRzVkhDSkNaR3hkTnVXeHU3MkNWCkVZNGhnTFc5b0hQWTBMSjN4RVhxV2liN1puWjIrQVlmWVcwUFZjV0R0eEJXY2dZSHBmT3hHZ01GWkE2ZFdvclcKaG5BYkpONytLSW9yMEdxdy9IcWkzTEo1RG90bER3SURBUUFCbzJNd1lUQWRCZ05WSFE0RUZnUVU3bXRKUEhvLwpEZU94Q2JlS3lLc1puM016VU9jd0h3WURWUjBqQkJnd0ZvQVU3bXRKUEhvL0RlT3hDYmVLeUtzWm4zTXpVT2N3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dFQkFDVVkxSkdQRSs2UEhoMFJVOW90UkNrWm9CNXJNWjVORHA2dFBWeEJiNVVySktGNW1EbzROdnU3WnA1SQovNUNRN3ozVXVKdTBoM1UvSUp2T2NzK2hWY0ZOWktJWkJxRUhNd3dMS2VYeDZxdWo3TFVLZEpESGZYTHkxMXlmCmtlK1JpN2ZjN1dhaXo0NW1PN3lmT2dMZ0o5MFdtTUNWMUFxazVJR2FkWlExbkpCZmlEY0dyVm1WQ3JEUlo5TVoKeW9ubk1sbzJIRDZDcUZxVHZzYlFaSkcyejltMkdNL2JmdEpsbzZiRWpoY3h3ZnQrZHR2VGhlTllzbmQ2ZGp0cwpMMUFjNTl2Mloza2Y5WUtWbWdlbkZLK1AzQ2doWnduUzFrMWFIQmtjam5kY3c1UWtQVEpyUzM3VWVKU0R2amROCnpsL0hIazQ4NElremxRc1BwVExXUEZwNUxCaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTIgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIFJvb3RDZXJ0IENBLTIiCiMgU2VyaWFsOiAyNzExNjk0NTEwMTk5MTAxNjk4CiMgTUQ1IEZpbmdlcnByaW50OiBhMjplMTpmODoxODowYjpiYTo0NTpkNTpjNzo0MToyYTpiYjozNzo1Mjo0NTo2NAojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OmJlOjZkOmNiOjU2OmYxOjU1OmI5OjYzOmQ0OjEyOmNhOjRlOjA2OjM0OmM3Ojk0OmIyOjFjOmMwCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNzo1MzplOTo0MDozNzo4YzoxYjpkNTplMzo4Mzo2ZTozOTo1ZDphZTphNTpjYjo4Mzo5ZTo1MDo0NjpmMTpiZDowZTphZToxOTo1MTpjZjoxMDpmZTpjNzpjOTo2NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0x6Q0NCQmVnQXdJQkFnSUlKYUhmeWpQTFdRSXdEUVlKS29aSWh2Y05BUUVMQlFBd2dhUXhDekFKQmdOVgpCQVlUQWxCQk1ROHdEUVlEVlFRSURBWlFZVzVoYldFeEZEQVNCZ05WQkFjTUMxQmhibUZ0WVNCRGFYUjVNU1F3CklnWURWUVFLREJ0VWNuVnpkRU52Y2lCVGVYTjBaVzF6SUZNdUlHUmxJRkl1VEM0eEp6QWxCZ05WQkFzTUhsUnkKZFhOMFEyOXlJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRFZk1CMEdBMVVFQXd3V1ZISjFjM1JEYjNJZwpVbTl2ZEVObGNuUWdRMEV0TWpBZUZ3MHhOakF5TURReE1qTXlNak5hRncwek5ERXlNekV4TnpJMk16bGFNSUdrCk1Rc3dDUVlEVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWcKUTJsMGVURWtNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRApWUVFMREI1VWNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTU1GbFJ5CmRYTjBRMjl5SUZKdmIzUkRaWEowSUVOQkxUSXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRQ25JRzdDS3FKaUpKV1Fkc2c0Zm9EU3E4R2JaUVdVOU1FS0VOVUNyTzJmazhlSHlMQW5LMElNUFFvKwpRVnFlZGQyTnl1Q2I3R2d5cEdtU2FJd0xnUTVXb0Q0YTNTd2xGSUl2bDlOa1J2UlVxZHc2VkMweEs1bUM4dGtxCjErOXhBTGd4cEw1NkpBZkRRaUR5aXRTU0JCdGxWa3hzMVB1MllWcEhJN1RZYWJTM090QjBQQXgxb1l4T2RxSHAKMnlxbE8vck9zUDkrYWlqOUp4eklzZWtwOFZkdVpMVFF3UlZ0RHI0dURrYklYdlJSL3U4T1l6bzdjYnJQYjFuSwpET09iWFVtNFRPSlhzWmlLUWxlY2R1L3Z2ZEZvcU5MMENidDNOYjRsZ2dqRUZpeEVJRmFwUkJGMzcxMjBIYXBlCmF6NkxNdllITDFjRWtzcjEvcDNDNmVpempreExBakhaNUR4SWdpZjNHSUoyU0RweHNST2hPZFV1eFRUQ0hXS0YKM3dQK1RmU3ZQZDljVzQzNmNPR2xmaWZIaGk1cWp4TEdoRjVEVVZDY0dadDQ1dnoyN1VkK2V6MW03eE1UaUY4OApvV1A3K2F5SE5aL3pncDZrUHdxY01XbUxtYVNJU281dVprM3ZGc1FQZVNnaFlBMkZGbjNYVkRqeGtsYjl0VE5NCmc5elhFSjlML2NiNFFyMjZmSE1DNFA5OXpWdmgxS3hoZTFmVlNudGIxSVZZSjEyLytDdGdyS0FtcmhRaEo4WjMKbWpPQVBGNUdQL2ZEc2FPR004Ym9YZzI1TlN5cVJzR0ZBbldBb09zayt4V3E1R2QvYm5jLzlBU0tMM3g3NHhkaAo4TjBKcVNESXZnbWswSDVFdzdJd1NqaXFxZXdZbWdlQ0s5dTRuQml0MnVCR0Y2elBYUUlEQVFBQm8yTXdZVEFkCkJnTlZIUTRFRmdRVTJmNGhRRzZVbnJ5YlBaeDltQ0FaNVl3d1lySXdId1lEVlIwakJCZ3dGb0FVMmY0aFFHNlUKbnJ5YlBaeDltQ0FaNVl3d1lySXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZdwpEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSjVGbmd3N3R1L2hPc2g4MFFBOXorTHFCcld5T3JzR1MyaDYwQ09YCmRLY3M4QWpZZVZyWFdvU0syQkthRzlsOVhFMXd4YVg1cStXamlZbmRBZnJzM2ZucGtwZmJzRVpDODlOaXFwWCsKTVdjVWFWaVFDcW9MN2pjangxQlJ0UFYrbnVONzkrVE1Rakl0U1F6TC8wa01teDQwL1c1dWxvcDVBN1p2MnduTAovVjlsRkRmaE9QWHpZUlpZNUxWdERRc0VHejlRTFgrengzb2FGb0JnK0lvZjZSc3F4dm02QVJwcHY5Sll4MVJYCkNJL2hPV0IzUzZ4WmhCcUk4ZDNMVDNqWDUrRXpMZnp1UWZvZ3NMN0w5emlVd09IUWhRKzc3U3h6cSszK2tuWWEKWkg5YkRUTUpCek43Qmo4UnBGeHdQSVhBeitPUXFJTjMrdHZteFl4b1p4Qm5wVkl0OE1TWmozKy8wV3ZpdFVmVwoyZENGbVUyVW13OUxqZTRBV2tjZEVRT3NRUml2aDdkdkREcVB5cy9jQThHaUNjamwvWUJleUdCQ0FSc2FVMXE3Ck42YTN2THFFNlI1c0d0UmsydFJEL3BPTFMvSXNlUllRMUpNTGlJK2gySVlVUnBGSG15Z2s3MWRTVGx4Q25LcjMKU2V3bjZFQWVzNmFKSW5LYzlRMHp0RmlqTUR2ZDFHcFVrNzRhVGZPVGxQZjhoQXMvaENCY05BTkV4ZHF0dkFyQgpBczhlNVpUWjg0NWIyRXp3bmV4aEY3c1VNbFFNQWltVEhwS0c5bi92NTVJRkRsbmRtUWd1THZxY0FGTFR4V1lwCjVLZVhSS1FPS0lFVE5jWDJiMlRtUWNUVkw4dzBSU1hQUVFDV1BVb3V3cGFZVDA1S25KZTMyeCtTTXNqL0QxRnUKMXV3SgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgRUNBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgRUNBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgTGFiZWw6ICJUcnVzdENvciBFQ0EtMSIKIyBTZXJpYWw6IDk1NDgyNDI5NDY5ODg2MjU5ODQKIyBNRDUgRmluZ2VycHJpbnQ6IDI3OjkyOjIzOjFkOjBhOmY1OjQwOjdjOmU5OmU2OjZiOjlkOmQ4OmY1OmU3OjZjCiMgU0hBMSBGaW5nZXJwcmludDogNTg6ZDE6ZGY6OTU6OTU6Njc6NmI6NjM6YzA6ZjA6NWI6MWM6MTc6NGQ6OGI6ODQ6MGI6Yzg6Nzg6YmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVhOjg4OjVkOmIxOjljOjAxOmQ5OjEyOmM1Ojc1OjkzOjg4OjkzOjhjOmFmOmJiOmRmOjAzOjFhOmIyOmQ0OjhlOjkxOmVlOjE1OjU4OjliOjQyOjk3OjFkOjAzOjljCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSURDQ0F3aWdBd0lCQWdJSkFJU0NMRjhjWXRCQU1BMEdDU3FHU0liM0RRRUJDd1VBTUlHY01Rc3dDUVlEClZRUUdFd0pRUVRFUE1BMEdBMVVFQ0F3R1VHRnVZVzFoTVJRd0VnWURWUVFIREF0UVlXNWhiV0VnUTJsMGVURWsKTUNJR0ExVUVDZ3diVkhKMWMzUkRiM0lnVTNsemRHVnRjeUJUTGlCa1pTQlNMa3d1TVNjd0pRWURWUVFMREI1VQpjblZ6ZEVOdmNpQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt4RnpBVkJnTlZCQU1NRGxSeWRYTjBRMjl5CklFVkRRUzB4TUI0WERURTJNREl3TkRFeU16SXpNMW9YRFRJNU1USXpNVEUzTWpnd04xb3dnWnd4Q3pBSkJnTlYKQkFZVEFsQkJNUTh3RFFZRFZRUUlEQVpRWVc1aGJXRXhGREFTQmdOVkJBY01DMUJoYm1GdFlTQkRhWFI1TVNRdwpJZ1lEVlFRS0RCdFVjblZ6ZEVOdmNpQlRlWE4wWlcxeklGTXVJR1JsSUZJdVRDNHhKekFsQmdOVkJBc01IbFJ5CmRYTjBRMjl5SUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVURVhNQlVHQTFVRUF3d09WSEoxYzNSRGIzSWcKUlVOQkxURXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEUGorQVJ0WitvZG5iYgozdzlVNzNOaktZS3RSOGFqYSszK1h6UDRRMUhwR2pPUk1SZWdkTVRVcHdIbXNwSSthcDN0RHZsMG1FRFRQd09BCkJvSkE2TEhpcDFHbkhZTW1hNnZlK2hlUks5akdyQjZ4bmhrQjFaZW02ZzIzeEZVZkozelNDTlYySHlrVmgwQTUKM1RoRkVYWFFtcWMwNEwvTnlGSWR1VWQrRGJpN3hnejJjMWNXV241RGtSOVZPc1p0UkFTcW5LbWNwMHlKRjRPdQpvd1JlVW9DTEhoSWxFUm5YREgxOU1VUkI2dHV2c0J6dmdkQXN4Wm9obXozdFFqdFFKdkxzem5GaEJtSWhWRTUvCndaMCtmeUNNZ01zcTJKZGl5SU16a1gyd29sb1BWK2c3elBJbHN0UjhMK3hOeHFFNkZYcm50bDAxOWZaSVNqWkYKWnRTNm1GakJBZ01CQUFHall6QmhNQjBHQTFVZERnUVdCQlJFbmtqMXpHMUkxS0JMZi81WkpDK0RsNW1haGpBZgpCZ05WSFNNRUdEQVdnQlJFbmtqMXpHMUkxS0JMZi81WkpDK0RsNW1haGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQUJUNDFYQlZ3bThuSGMyRnYKY2l2VXdvL3lRMTBDenNTVXVaUVJnMmRkNG1kc2RYYS91d3lxTnNhdFI1TmozQjUrMXQ0dS91a1pNamdEZnhUMgpBSE1zV2JFaEJ1SDdyQmlWREtQL21aYjNLeWViMVNUTUhkM0JPdUNZUkxERTVENTNzWE9wWkN6MkhBRjhQMTFGCmhjQ0Y1eVdQbGR3WDh6eWZHbTZ3eXVNZEt1bE1ZL29rWVdMVzJuNjJIR3oxQWgzVUt0MVZrT3NxRVVjOExsNTAKc29JaXBYMVRIMFhzSjVGOTV5SVc2TUJvTnRqRzhVK0FSREw1NGRIUkhhcmVxS3VjQksrdElBNWttRTJsYThCSQpXSlpwVGR3SGpGR1RvdCtmRHoyTFlMU0NqYW9JVG1KRjRQa0wwdURnUEZ2ZVhIRW5KY0xtQTRHTEVGUGp4MVdpCnRKL1g1Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSIKIyBTZXJpYWw6IDg4NzU2NDAyOTY1NTgzMTAwNDEKIyBNRDUgRmluZ2VycHJpbnQ6IDg2OjY5OjEyOmMwOjcwOmYxOmVjOmFjOmFjOmMyOmQ1OmJjOmE1OjViOmExOjI5CiMgU0hBMSBGaW5nZXJwcmludDogYjc6YWI6MzM6MDg6ZDE6ZWE6NDQ6Nzc6YmE6MTQ6ODA6MTI6NWE6NmY6YmQ6YTk6MzY6NDk6MGM6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDg1OjY2OjZhOjU2OjJlOmUwOmJlOjVjOmU5OjI1OmMxOmQ4Ojg5OjBhOjZmOjc2OmE4OjdlOmMxOjZkOjRkOjdkOjVmOjI5OmVhOjc0OjE5OmNmOjIwOjEyOjNiOjY5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM1RDQ0E4V2dBd0lCQWdJSWV5eWIweGFBTXBrd0RRWUpLb1pJaHZjTkFRRUxCUUF3ZkRFTE1Ba0dBMVVFCkJoTUNWVk14RGpBTUJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUsKREE5VFUwd2dRMjl5Y0c5eVlYUnBiMjR4TVRBdkJnTlZCQU1NS0ZOVFRDNWpiMjBnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQlNVMEV3SGhjTk1UWXdNakV5TVRjek9UTTVXaGNOTkRFd01qRXlNVGN6Ck9UTTVXakI4TVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHYKZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRXhNQzhHQTFVRUF3d29VMU5NTG1OdgpiU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUZKVFFUQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFQa1AzYU1yZmN2UUt2N3NaNFdtNXk0YnVuZmg0L1d2cE96NlNsMlIKeEZkSGF4aDNhM2J5L1pQa1BRL0NGcDRMWnNOV2xKNFhnNFhPVnUveUZ2MEFZdlVpQ1ZUb1pSZE9RYm5nVDBhWApxaHZJdUc1aVhtbXhYOXNxQW43OGJNcnpRZGp0ME9qOFAyRkk3YkFERkIwUURrc1o0THRPN0labC96YnpYbWNDCkM1MkdWV0g5ZWpqdC91SVpBTGR2b1ZCaWRYUThvUHJJSlpLMGJub2l4L2dlb2VPeTNaRXhxeXNkQlArbFNnUTMKNllXa015djk0dFpWTkh3WnBFcG94N0tvMDdmS29aT0k2OEdYdkl6NUhka2loQ1IweHdROWFxa3BrOHpydUZ2aAovbDhscWpSWXlNRWpWSjBibUJIRE9KeCtQWVpzcFE5QWhud0M5RndDVHlqTHJuR2ZEenJJTS80UkpUWHEvTHJGCllEM1pmQmpWc3FuVGRYZ0RjaUxLT3NNZjd5emxMcW42bml5MlVVYjlyd1BXNm1CbzZvVVdObXVGNlI3QXM5M0UKSk55QUtvRkJiWlEreU9ESmdVRUFubDYvZjhVSW1LSVlMRUpBcy9sdk9DZExUb0QwUFlGSDRJaDg2aHpPdFhWYwpVUzRjSzM4YWNpam5BTFhSZE1iWDVKK3RCNU8yVXpVMS9EZmt3L1pkRnI0aGM5NlNDdmlnWTJxOGxwSnFQdmk4ClpWV2IzdlVOaVNZRS9DVWFwaVZweThKdHluemlXVitYck92dkxzaTgxeHRaUEN2TThobklrMnNuWXhuUC9Pa20KK01weG0zK1QvalJuaEU2WjYveXplQWt6Y0xwbXBuYnRHM1ByR3FVTnhDSVRJSlJXQ2s0c2JFNngvYytjQ2JxaQpNKzJIQWdNQkFBR2pZekJoTUIwR0ExVWREZ1FXQkJUZEJBa0hvdlY2ZlZKVEVwS1Y3amlBSlEybVdUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk4wRUNRZWk5WHA5VWxNU2twWHVPSUFsRGFaWk1BNEcKQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFJQmdSbENuN0pwMGNIaDV3WWZHVgpjcE54Sksxb2sxaU9NcThiczNBRC9DVXJkSVdRUFhocTlMbUxwWmM3dFJpUnV4Nm4rVUJia2ZsVm1hOGVFZEJjCkhhZG00N0dVQnd3eU9hYnFHN0I1MkIyY2NFVGppdDNFK1pVZmlqaERQd0dGcFVlblBVYXl2T1VpYVBkN25OZ3MKUGdvaHlDMHpyTC9GZ1preGRNRjFjY1crc2ZBalJmU2RhL3daWTUyanZBVEdHQXNsdTFPSkQ3T0FVTjVGN2tSLwpxNVI0WkpqVDlpamRoOWh3WlhUN0Rya1Q2NmNQWWFreWxzemV1KzFqVEJpN3FVRDNvRlJ1SUloeGRSanFlclEwCmN1QWpKM2RjdHBEcWhpVkFxKzh6RDh1ZmdyNmlJUHYydFMwYTVzS0ZzWFFQKzhobEFxUlNBVWZkU1NMQnY5anIKYTZ4KzN1eGpNeFczSXdpUHhnK05RVnJkanNXNWorVkZQM2pidXRJYlFMSCtjVTAvNElHaXVsNjA3QlhnazkwSQpIMzdoVlprTElkNlRuZ3I3NXFOSnZUWXcvdWQzc3FCMWw3VXRnWWdYWlNEMzJwQUFuOGxTekRMS05YejFQUS9ZCks5ZjFKbXpKQmpTV0Z1cHdXUm95ZVhrTHRvaC9EMUpJUGI5czJLSkVMdEZPdDNKWTA0a1RsZjVFcS9qWGl4dHUKbkx3c29GdlZhZ0N2WHpmaDFmb1FDNWljaHVjbWo4N3c3RzZLVnd1QTQwNnl3S0JqWVpDNlZXZzNkR3Eya3R1ZgpvWVlpdG1VbkR1eTJuMEpnNUdmQ3RkcEJDOFRUaTJFYnZQb2ZrU3ZYUkFkZXVpbXMyY1hwNzFOSVd1dUE4U2hZCkljMndCbFg3Sno5VGtIQ3BCQjVYSjdrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MiCiMgU2VyaWFsOiA4NDk1NzIzODEzMjk3MjE2NDI0CiMgTUQ1IEZpbmdlcnByaW50OiAyZTpkYTplNDozOTo3Zjo5Yzo4ZjozNzpkMTo3MDo5ZjoyNjoxNzo1MTozYTo4ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGMzOjE5OjdjOjM5OjI0OmU2OjU0OmFmOjFiOmM0OmFiOjIwOjk1OjdhOmUyOmMzOjBlOjEzOjAyOjZhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzNDoxNzpiYjowNjpjYzo2MDowNzpkYToxYjo5NjoxYzo5MjowYjo4YTpiNDpjZTozZjphZDo4MjowZTo0YTphMzowYjo5YTpjYjpjNDphNzo0ZTpiZDpjZTpiYzo2NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2pUQ0NBaFNnQXdJQkFnSUlkZWJmeThGb1c2Z3dDZ1lJS29aSXpqMEVBd0l3ZkRFTE1Ba0dBMVVFQmhNQwpWVk14RGpBTUJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUClUwd2dRMjl5Y0c5eVlYUnBiMjR4TVRBdkJnTlZCQU1NS0ZOVFRDNWpiMjBnVW05dmRDQkRaWEowYVdacFkyRjAKYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXdNakV5TVRneE5EQXpXaGNOTkRFd01qRXlNVGd4TkRBegpXakI4TVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHZkWE4wCmIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRXhNQzhHQTFVRUF3d29VMU5NTG1OdmJTQlMKYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUVWRFF6QjJNQkFHQnlxR1NNNDlBZ0VHQlN1QgpCQUFpQTJJQUJFVnVxVkRFcGlNMm5sOG9qUmZMbGlKa1A5eDZqaDNNQ0xPaWNTUzZqa201QkJ0SGxsaXJMWlhJCjdaNElOY2duNjRtTVUxanJZb3IrOEZzUGF6RlNZMEU3aWMzczdMYU5HZE0wQjl5N3hnWi93a1dWN010L3FDUGcKQ2VtQit2TkgwNk5qTUdFd0hRWURWUjBPQkJZRUZJTFJoWE13NXpVRTA0NENrdnZscE5IRUllak5NQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVWd0R0ZjekRuTlFUVGpnS1MrK1drMGNRaDZNMHdEZ1lEClZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJjQU1HUUNNRy9uNjFrUnBHRFBZYkNXZSswRitTOFQKa2R6dDVmeFFheEZHUnJNY0lRQml1NzdENStqTkI1bjVEUXRkY2o3RXFnSXdIN3k2QytJd0pQdDhiWUJWQ3BrKwpnQTB6NVdhanM2TzdwZFdMandrc3BsMSs0dkFIQ0dodDBueHBibC9mNVdwbAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIiCiMgU2VyaWFsOiA2MjQ4MjI3NDk0MzUyOTQzMzUwCiMgTUQ1IEZpbmdlcnByaW50OiBlMToxZTozMTo1ODoxYTphZTo1NDo1MzowMjpmNjoxNzo2YToxMTo3Yjo0ZDo5NQojIFNIQTEgRmluZ2VycHJpbnQ6IDc0OjNhOmYwOjUyOjliOmQwOjMyOmEwOmY0OjRhOjgzOmNkOmQ0OmJhOmE5OjdiOjdjOjJlOmM0OjlhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyZTo3YjpmMTo2YzpjMjoyNDo4NTphNzpiYjplMjphYTo4Njo5Njo3NTowNzo2MTpiMDphZTozOTpiZTozYjoyZjplOTpkMDpjYzo2ZDo0ZTpmNzozNDo5MTo0Mjo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjZ6Q0NBOU9nQXdJQkFnSUlWcllwelRTOGVQWXdEUVlKS29aSWh2Y05BUUVMQlFBd2dZSXhDekFKQmdOVgpCQVlUQWxWVE1RNHdEQVlEVlFRSURBVlVaWGhoY3pFUU1BNEdBMVVFQnd3SFNHOTFjM1J2YmpFWU1CWUdBMVVFCkNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1UY3dOUVlEVlFRRERDNVRVMHd1WTI5dElFVldJRkp2YjNRZ1EyVnkKZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5TUI0WERURTNNRFV6TVRFNE1UUXpOMW9YRFRReQpNRFV6TURFNE1UUXpOMW93Z1lJeEN6QUpCZ05WQkFZVEFsVlRNUTR3REFZRFZRUUlEQVZVWlhoaGN6RVFNQTRHCkExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUVDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNVGN3TlFZRFZRUUQKREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dVbE5CSUZJeQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQWp6WmxRT0hXVGNEWHRPbEcybXZxCk0wZk5UUGw5ZmI2OUxUM3cyM2poaHFYWnVnbFhhTzFYUHFEUUNFR0Q1eWhCSkIvamNoWFFBUnI3WG5BanNzdWYKT2VQUHhVN0drbTBteG51N3M5b25uUXFHNllFM0JmN3djWEhzd3h6cFk2SVhGSjN2RzJmVGhWVUNBdFpKeWN4YQo0YkgzYnpLZnlkUTdpRUdvbkwzTHE5dHRld2tmb2t4eWtOb3JDUHpQUEZUT1p3K296MTJXR1F2RTQzTHJyZEY5CkhTZnZrdXNRdjF2ck82L1BnTjNCMHBZRVczcCtwS2s4T0hha1lvNmdPVjdxZDg5ZEFGbVBaaXcrQjZLakJTWVIKYVpmcWhiY1BsZ3RMeUVEaFVMb3Vpc3YzRDVvaTUzK2FOeFBOOGswVGF5SFJ3TXdpOHFGRzlrUnBuTXBoTlFjQQpiOVpoQ0JIcXVyajI2Yk5nNVUyNTdKOFVac2xYV052TmgybjRpb1lTQTBlL1poTjJySGQ5TkNTRmc4M1hxcHlRCkdwOGhMSDk0dDJTNDJPaW05SGl6VmN1RTBqTEVlSzZqajJIZHpnaFRyZXlJL0JYa21nM21ueHAzemt5UHVCUVYKUFdLY2hqZ0dBR1lTNUZsMldsUEFBcGlpRUN0b1JIdU9lYzR6U25hcVc0RVdHN1dLMk5BQWUxNWl0QW5XaG1NTwpwZ1dWU2Jvb2k0aVRzalFjMktSVmJyY2MwTjZaVlRzajlDTGcrU2xtSnV3Z1VIZmJTZ3VQdnVVQ1lIQkJYdFN1ClVEa2lGQ2JMc2p0emRGVkhCM21CT2Fnd0UwVGxCSXF1bGhNbFFnKzVVOFNiL00za0hONDgrcXZXQmtvZlo2YVkKTUJ6ZExOdmNHSlZYWnNiL1hJdFc5WGNDQXdFQUFhTmpNR0V3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFmQmdOVgpIU01FR0RBV2dCVDVZTHZVNDlVMDlyajFCb0FscDNQYlJtbW9uakFkQmdOVkhRNEVGZ1FVK1dDNzFPUFZOUGE0CjlRYUFKYWR6MjBacHFKNHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQlcKczQ3TENwMUpqcitreEpHN1poY0ZVWmgxKytWUUxIcWU4UlQ2cTlPS1B2K1JLWTlqaTlpMHFWUUJEYjZUaGkvNQpTbTNIWHZWWCtjcFZIQksrUnc4MnhkOXF0OXQxd2tjbGY3bnhZL2hvTFZVRTBmS05zS1RQdkR4ZUgzam5wYUFnCmNMQUV4YmYzY3FmZUlnMjlNeVZHakdTU0p1TStMbU9XMnB1TVBmZ1lDZGNEekgyR2d1REtCQWRSVU5mL2t0VU0KNzlxR241blg2N2V2YU9JNUpwUzZhTGUvZzlQcWVtYzlZbWV1SmVWeTZPTGs3SzRTOWtzclBKL3BzRUR6T0ZTegovYmRveU5yR2oxRThzdnVSM0J6bm01M2h0dzF5aitLa3hLbDQrZXNVck1aREJjSmxPU2dZQXNPQ3NwMEZ2bVh0CmxsOWxkRHo3Q1RVdWU1d1QvUnNQWGNkdGdUcFdEOHc3NGE4Q0x5S3NSc3BHUEtBY1ROWkV0RjR1WEJWbUNlRW0KS2Y3R1VtRzZzWFAvd3d5YzVXeHFsRDhVeWtBV2xZVHpXYW1zWDB4aGsyM1JPOHlpbFF3aXBtZG5SQzY1MmRLSwpRYk5tQzFyN2ZTT2w4aHF3Lzk2Ymc1UXUwVC9ma3JlUnJ3VTdaY2VnYkxITlloTERrQnZqSmM0MHZHOTNkckVRCncvY0ZHc0RXcjNSaVNCZDNrbW1RWVJ6ZWxZQjBWSThZSE1QekE5Qy9wRU4xaGxNWWVnb3VDUncybjVIOWdvb2kKUzlFT1VDWGR5d01NRjhtREFBaE9OVTJLaSszd0FwUm1MRVIveTVVbmxoZXRDVENzdG5FWGJvc1g5aHdKMUMwNwptS1Z4MDFRVDJXRHo5VXRtVC9yeDdpQVNqYlNzVjdGRlk2R3NkcW5DK3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MiCiMgU2VyaWFsOiAzMTgyMjQ2NTI2NzU0NTU1Mjg1CiMgTUQ1IEZpbmdlcnByaW50OiA1OTo1MzoyMjo2NTo4Mzo0MjowMTo1NDpjMDpjZTo0MjpiOTo1YTo3YzpmMjo5MAojIFNIQTEgRmluZ2VycHJpbnQ6IDRjOmRkOjUxOmEzOmQxOmY1OjIwOjMyOjE0OmIwOmM2OmM1OjMyOjIzOjAzOjkxOmM3OjQ2OjQyOjZkCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyMjphMjpjMTpmNzpiZDplZDo3MDo0YzpjMTplNzowMTpiNTpmNDowODpjMzoxMDo4ODowZjplOTo1NjpiNTpkZToyYTo0YTo0NDpmOTo5Yzo4NzozYToyNTphNzpjOAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2xEQ0NBaHFnQXdJQkFnSUlMQ21jV3hidEJaVXdDZ1lJS29aSXpqMEVBd0l3ZnpFTE1Ba0dBMVVFQmhNQwpWVk14RGpBTUJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUClUwd2dRMjl5Y0c5eVlYUnBiMjR4TkRBeUJnTlZCQU1NSzFOVFRDNWpiMjBnUlZZZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JGUTBNd0hoY05NVFl3TWpFeU1UZ3hOVEl6V2hjTk5ERXdNakV5TVRneApOVEl6V2pCL01Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPQmdOVkJBY01CMGh2CmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakUwTURJR0ExVUVBd3dyVTFOTUxtTnYKYlNCRlZpQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRVZEUXpCMk1CQUdCeXFHU000OQpBZ0VHQlN1QkJBQWlBMklBQktvU1I1Q1lHL3Z2dzBBSGd5Qk84VENDb2diUjhwS0dZZkwySVdqS0FNVEg2a01BClZJYmMvUi9mQUxoQllsemNjQll5M2grWjFNekZCOGdJSDJFV0IxRTlmVndIVStNMU9JemZ6Wi9aTGcxS3Roa3UKV25CYUJ1Mis4S0d3eXRBSkthTmpNR0V3SFFZRFZSME9CQllFRkZ2S1h1WGUwb0dxemFndFpGRzIyWEtibCtaUApNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVVzhwZTVkN1NnYXJOcUMxa1ViYlpjcHVYCjVrOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTUNBMmdBTUdVQ01RQ0s1a0NKTit2cDFSUFoKeXRSckpQT3dQWWRHV0Jyc3NkOXYrMWE2Y0d2SE9Nem9zWXhQRC9meFozWU9nOUFlVVk4Q01EMzJJeWdtVE1aZwpoNU1tbTdJMUhyclc5enpSSE03NkpUeW1Hb0VWVy9NU0QyenVaWXJKaDZqNUIrQmltb3hjU2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tClBLAwQUAAAAAAAAACEACRNCR0QDAABEAwAAOAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9jb3JlLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKY2VydGlmaS5weQp+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSByZXR1cm5zIHRoZSBpbnN0YWxsYXRpb24gbG9jYXRpb24gb2YgY2FjZXJ0LnBlbS4KIiIiCmltcG9ydCBvcwppbXBvcnQgd2FybmluZ3MKCgpjbGFzcyBEZXByZWNhdGVkQnVuZGxlV2FybmluZyhEZXByZWNhdGlvbldhcm5pbmcpOgogICAgIiIiCiAgICBUaGUgd2VhayBzZWN1cml0eSBidW5kbGUgaXMgYmVpbmcgZGVwcmVjYXRlZC4gUGxlYXNlIGJvdGhlciB5b3VyIHNlcnZpY2UKICAgIHByb3ZpZGVyIHRvIGdldCB0aGVtIHRvIHN0b3AgdXNpbmcgY3Jvc3Mtc2lnbmVkIHJvb3RzLgogICAgIiIiCgoKZGVmIHdoZXJlKCk6CiAgICBmID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQoKICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZiwgJ2NhY2VydC5wZW0nKQoKCmRlZiBvbGRfd2hlcmUoKToKICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgIlRoZSB3ZWFrIHNlY3VyaXR5IGJ1bmRsZSBoYXMgYmVlbiByZW1vdmVkLiBjZXJ0aWZpLm9sZF93aGVyZSgpIGlzIG5vdyBhbiBhbGlhcyAiCiAgICAgICAgIm9mIGNlcnRpZmkud2hlcmUoKS4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIGNlcnRpZmkud2hlcmUoKSBpbnN0ZWFkLiAiCiAgICAgICAgImNlcnRpZmkub2xkX3doZXJlKCkgd2lsbCBiZSByZW1vdmVkIGluIDIwMTguIiwKICAgICAgICBEZXByZWNhdGVkQnVuZGxlV2FybmluZwogICAgKQogICAgcmV0dXJuIHdoZXJlKCkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBwcmludCh3aGVyZSgpKQpQSwMEFAAAAAAAAAAhAPDPD1MXBgAAFwYAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvX19pbml0X18ucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgpmcm9tIC5jb21wYXQgaW1wb3J0IFBZMiwgUFkzCmZyb20gLnVuaXZlcnNhbGRldGVjdG9yIGltcG9ydCBVbml2ZXJzYWxEZXRlY3Rvcgpmcm9tIC52ZXJzaW9uIGltcG9ydCBfX3ZlcnNpb25fXywgVkVSU0lPTgoKCmRlZiBkZXRlY3QoYnl0ZV9zdHIpOgogICAgIiIiCiAgICBEZXRlY3QgdGhlIGVuY29kaW5nIG9mIHRoZSBnaXZlbiBieXRlIHN0cmluZy4KCiAgICA6cGFyYW0gYnl0ZV9zdHI6ICAgICBUaGUgYnl0ZSBzZXF1ZW5jZSB0byBleGFtaW5lLgogICAgOnR5cGUgYnl0ZV9zdHI6ICAgICAgYGBieXRlc2BgIG9yIGBgYnl0ZWFycmF5YGAKICAgICIiIgogICAgaWYgbm90IGlzaW5zdGFuY2UoYnl0ZV9zdHIsIGJ5dGVhcnJheSk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnl0ZV9zdHIsIGJ5dGVzKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBvYmplY3Qgb2YgdHlwZSBieXRlcyBvciBieXRlYXJyYXksIGdvdDogJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3swfScuZm9ybWF0KHR5cGUoYnl0ZV9zdHIpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBieXRlX3N0ciA9IGJ5dGVhcnJheShieXRlX3N0cikKICAgIGRldGVjdG9yID0gVW5pdmVyc2FsRGV0ZWN0b3IoKQogICAgZGV0ZWN0b3IuZmVlZChieXRlX3N0cikKICAgIHJldHVybiBkZXRlY3Rvci5jbG9zZSgpClBLAwQUAAAAAAAAACEAOb+EEBZ6AAAWegAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1ZnJlcS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBCaWc1IGZyZXF1ZW5jeSB0YWJsZQojIGJ5IFRhaXdhbidzIE1hbmRhcmluIFByb21vdGlvbiBDb3VuY2lsCiMgPGh0dHA6Ly93d3cuZWR1LnR3OjgxL21hbmRyLz4KIwojIDEyOCAgLS0+IDAuNDIyNjEKIyAyNTYgIC0tPiAwLjU3ODUxCiMgNTEyICAtLT4gMC43NDg1MQojIDEwMjQgLS0+IDAuODkzODQKIyAyMDQ4IC0tPiAwLjk3NTgzCiMKIyBJZGVhbCBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjc0ODUxLygxLTAuNzQ4NTEpID0yLjk4CiMgUmFuZG9tIERpc3RyaWJ1dGlvbiBSYXRpb24gPSA1MTIvKDU0MDEtNTEyKT0wLjEwNQojCiMgVHlwaWNhbCBEaXN0cmlidXRpb24gUmF0aW8gYWJvdXQgMjUlIG9mIElkZWFsIG9uZSwgc3RpbGwgbXVjaCBoaWdoZXIgdGhhbiBSRFIKCkJJRzVfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8gPSAwLjc1CgojQ2hhciB0byBGcmVxT3JkZXIgdGFibGUKQklHNV9UQUJMRV9TSVpFID0gNTM3NgoKQklHNV9DSEFSX1RPX0ZSRVFfT1JERVIgPSAoCiAgIDEsMTgwMSwxNTA2LCAyNTUsMTQzMSwgMTk4LCAgIDksICA4MiwgICA2LDUwMDgsIDE3NywgMjAyLDM2ODEsMTI1NiwyODIxLCAxMTAsICMgICAxNgozODE0LCAgMzMsMzI3NCwgMjYxLCAgNzYsICA0NCwyMTE0LCAgMTYsMjk0NiwyMTg3LDExNzYsIDY1OSwzOTcxLCAgMjYsMzQ1MSwyNjUzLCAjICAgMzIKMTE5OCwzOTcyLDMzNTAsNDIwMiwgNDEwLDIyMTUsIDMwMiwgNTkwLCAzNjEsMTk2NCwgICA4LCAyMDQsICA1OCw0NTEwLDUwMDksMTkzMiwgIyAgIDQ4CiAgNjMsNTAxMCw1MDExLCAzMTcsMTYxNCwgIDc1LCAyMjIsIDE1OSw0MjAzLDI0MTcsMTQ4MCw1MDEyLDM1NTUsMzA5MSwgMjI0LDI4MjIsICMgICA2NAozNjgyLCAgIDMsICAxMCwzOTczLDE0NzEsICAyOSwyNzg3LDExMzUsMjg2NiwxOTQwLCA4NzMsIDEzMCwzMjc1LDExMjMsIDMxMiw1MDEzLCAjICAgODAKNDUxMSwyMDUyLCA1MDcsIDI1MiwgNjgyLDUwMTQsIDE0MiwxOTE1LCAxMjQsIDIwNiwyOTQ3LCAgMzQsMzU1NiwzMjA0LCAgNjQsIDYwNCwgIyAgIDk2CjUwMTUsMjUwMSwxOTc3LDE5NzgsIDE1NSwxOTkxLCA2NDUsIDY0MSwxNjA2LDUwMTYsMzQ1MiwgMzM3LCAgNzIsIDQwNiw1MDE3LCAgODAsICMgIDExMgogNjMwLCAyMzgsMzIwNSwxNTA5LCAyNjMsIDkzOSwxMDkyLDI2NTQsIDc1NiwxNDQwLDEwOTQsMzQ1MywgNDQ5LCAgNjksMjk4NywgNTkxLCAjICAxMjgKIDE3OSwyMDk2LCA0NzEsIDExNSwyMDM1LDE4NDQsICA2MCwgIDUwLDI5ODgsIDEzNCwgODA2LDE4NjksIDczNCwyMDM2LDM0NTQsIDE4MCwgIyAgMTQ0CiA5OTUsMTYwNywgMTU2LCA1MzcsMjkwNywgNjg4LDUwMTgsIDMxOSwxMzA1LCA3NzksMjE0NSwgNTE0LDIzNzksIDI5OCw0NTEyLCAzNTksICMgIDE2MAoyNTAyLCAgOTAsMjcxNiwxMzM4LCA2NjMsICAxMSwgOTA2LDEwOTksMjU1MywgIDIwLDI0NDEsIDE4MiwgNTMyLDE3MTYsNTAxOSwgNzMyLCAjICAxNzYKMTM3Niw0MjA0LDEzMTEsMTQyMCwzMjA2LCAgMjUsMjMxNywxMDU2LCAxMTMsIDM5OSwgMzgyLDE5NTAsIDI0MiwzNDU1LDI0NzQsIDUyOSwgIyAgMTkyCjMyNzYsIDQ3NSwxNDQ3LDM2ODMsNTAyMCwgMTE3LCAgMjEsIDY1NiwgODEwLDEyOTcsMjMwMCwyMzM0LDM1NTcsNTAyMSwgMTI2LDQyMDUsICMgIDIwOAogNzA2LCA0NTYsIDE1MCwgNjEzLDQ1MTMsICA3MSwxMTE4LDIwMzcsNDIwNiwgMTQ1LDMwOTIsICA4NSwgODM1LCA0ODYsMjExNSwxMjQ2LCAjICAyMjQKMTQyNiwgNDI4LCA3MjcsMTI4NSwxMDE1LCA4MDAsIDEwNiwgNjIzLCAzMDMsMTI4MSw1MDIyLDIxMjgsMjM1OSwgMzQ3LDM4MTUsIDIyMSwgIyAgMjQwCjM1NTgsMzEzNSw1MDIzLDE5NTYsMTE1Myw0MjA3LCAgODMsIDI5NiwxMTk5LDMwOTMsIDE5MiwgNjI0LCAgOTMsNTAyNCwgODIyLDE4OTgsICMgIDI1NgoyODIzLDMxMzYsIDc5NSwyMDY1LCA5OTEsMTU1NCwxNTQyLDE1OTIsICAyNywgIDQzLDI4NjcsIDg1OSwgMTM5LDE0NTYsIDg2MCw0NTE0LCAjICAyNzIKIDQzNywgNzEyLDM5NzQsIDE2NCwyMzk3LDMxMzcsIDY5NSwgMjExLDMwMzcsMjA5NywgMTk1LDM5NzUsMTYwOCwzNTU5LDM1NjAsMzY4NCwgIyAgMjg4CjM5NzYsIDIzNCwgODExLDI5ODksMjA5OCwzOTc3LDIyMzMsMTQ0MSwzNTYxLDE2MTUsMjM4MCwgNjY4LDIwNzcsMTYzOCwgMzA1LCAyMjgsICMgIDMwNAoxNjY0LDQ1MTUsIDQ2NywgNDE1LDUwMjUsIDI2MiwyMDk5LDE1OTMsIDIzOSwgMTA4LCAzMDAsIDIwMCwxMDMzLCA1MTIsMTI0NywyMDc4LCAjICAzMjAKNTAyNiw1MDI3LDIxNzYsMzIwNywzNjg1LDI2ODIsIDU5MywgODQ1LDEwNjIsMzI3NywgIDg4LDE3MjMsMjAzOCwzOTc4LDE5NTEsIDIxMiwgIyAgMzM2CiAyNjYsIDE1MiwgMTQ5LCA0NjgsMTg5OSw0MjA4LDQ1MTYsICA3NywgMTg3LDUwMjgsMzAzOCwgIDM3LCAgIDUsMjk5MCw1MDI5LDM5NzksICMgIDM1Mgo1MDMwLDUwMzEsICAzOSwyNTI0LDQ1MTcsMjkwOCwzMjA4LDIwNzksICA1NSwgMTQ4LCAgNzQsNDUxOCwgNTQ1LCA0ODMsMTQ3NCwxMDI5LCAjICAzNjgKMTY2NSwgMjE3LDE4NzAsMTUzMSwzMTM4LDExMDQsMjY1NSw0MjA5LCAgMjQsIDE3MiwzNTYyLCA5MDAsMzk4MCwzNTYzLDM1NjQsNDUxOSwgIyAgMzg0CiAgMzIsMTQwOCwyODI0LDEzMTIsIDMyOSwgNDg3LDIzNjAsMjI1MSwyNzE3LCA3ODQsMjY4MywgICA0LDMwMzksMzM1MSwxNDI3LDE3ODksICMgIDQwMAogMTg4LCAxMDksIDQ5OSw1MDMyLDM2ODYsMTcxNywxNzkwLCA4ODgsMTIxNywzMDQwLDQ1MjAsNTAzMywzNTY1LDUwMzQsMzM1MiwxNTIwLCAjICA0MTYKMzY4NywzOTgxLCAxOTYsMTAzNCwgNzc1LDUwMzUsNTAzNiwgOTI5LDE4MTYsIDI0OSwgNDM5LCAgMzgsNTAzNywxMDYzLDUwMzgsIDc5NCwgIyAgNDMyCjM5ODIsMTQzNSwyMzAxLCAgNDYsIDE3OCwzMjc4LDIwNjYsNTAzOSwyMzgxLDUwNDAsIDIxNCwxNzA5LDQ1MjEsIDgwNCwgIDM1LCA3MDcsICMgIDQ0OAogMzI0LDM2ODgsMTYwMSwyNTU0LCAxNDAsIDQ1OSw0MjEwLDUwNDEsNTA0MiwxMzY1LCA4MzksIDI3MiwgOTc4LDIyNjIsMjU4MCwzNDU2LCAjICA0NjQKMjEyOSwxMzYzLDM2ODksMTQyMywgNjk3LCAxMDAsMzA5NCwgIDQ4LCAgNzAsMTIzMSwgNDk1LDMxMzksMjE5Niw1MDQzLDEyOTQsNTA0NCwgIyAgNDgwCjIwODAsIDQ2MiwgNTg2LDEwNDIsMzI3OSwgODUzLCAyNTYsIDk4OCwgMTg1LDIzODIsMzQ1NywxNjk4LCA0MzQsMTA4NCw1MDQ1LDM0NTgsICMgIDQ5NgogMzE0LDI2MjUsMjc4OCw0NTIyLDIzMzUsMjMzNiwgNTY5LDIyODUsIDYzNywxODE3LDI1MjUsIDc1NywxMTYyLDE4NzksMTYxNiwzNDU5LCAjICA1MTIKIDI4NywxNTc3LDIxMTYsIDc2OCw0NTIzLDE2NzEsMjg2OCwzNTY2LDI1MjYsMTMyMSwzODE2LCA5MDksMjQxOCw1MDQ2LDQyMTEsIDkzMywgIyAgNTI4CjM4MTcsNDIxMiwyMDUzLDIzNjEsMTIyMiw0NTI0LCA3NjUsMjQxOSwxMzIyLCA3ODYsNDUyNSw1MDQ3LDE5MjAsMTQ2MiwxNjc3LDI5MDksICMgIDU0NAoxNjk5LDUwNDgsNDUyNiwxNDI0LDI0NDIsMzE0MCwzNjkwLDI2MDAsMzM1MywxNzc1LDE5NDEsMzQ2MCwzOTgzLDQyMTMsIDMwOSwxMzY5LCAjICA1NjAKMTEzMCwyODI1LCAzNjQsMjIzNCwxNjUzLDEyOTksMzk4NCwzNTY3LDM5ODUsMzk4NiwyNjU2LCA1MjUsMTA4NSwzMDQxLCA5MDIsMjAwMSwgIyAgNTc2CjE0NzUsIDk2NCw0NTI3LCA0MjEsMTg0NSwxNDE1LDEwNTcsMjI4NiwgOTQwLDEzNjQsMzE0MSwgMzc2LDQ1MjgsNDUyOSwxMzgxLCAgIDcsICMgIDU5MgoyNTI3LCA5ODMsMjM4MywgMzM2LDE3MTAsMjY4NCwxODQ2LCAzMjEsMzQ2MSwgNTU5LDExMzEsMzA0MiwyNzUyLDE4MDksMTEzMiwxMzEzLCAjICA2MDgKIDI2NSwxNDgxLDE4NTgsNTA0OSwgMzUyLDEyMDMsMjgyNiwzMjgwLCAxNjcsMTA4OSwgNDIwLDI4MjcsIDc3NiwgNzkyLDE3MjQsMzU2OCwgIyAgNjI0CjQyMTQsMjQ0MywzMjgxLDUwNTAsNDIxNSw1MDUxLCA0NDYsIDIyOSwgMzMzLDI3NTMsIDkwMSwzODE4LDEyMDAsMTU1Nyw0NTMwLDI2NTcsICMgIDY0MAoxOTIxLCAzOTUsMjc1NCwyNjg1LDM4MTksNDIxNiwxODM2LCAxMjUsIDkxNiwzMjA5LDI2MjYsNDUzMSw1MDUyLDUwNTMsMzgyMCw1MDU0LCAjICA2NTYKNTA1NSw1MDU2LDQ1MzIsMzE0MiwzNjkxLDExMzMsMjU1NSwxNzU3LDM0NjIsMTUxMCwyMzE4LDE0MDksMzU2OSw1MDU3LDIxNDYsIDQzOCwgIyAgNjcyCjI2MDEsMjkxMCwyMzg0LDMzNTQsMTA2OCwgOTU4LDMwNDMsIDQ2MSwgMzExLDI4NjksMjY4Niw0MjE3LDE5MTYsMzIxMCw0MjE4LDE5NzksICMgIDY4OAogMzgzLCA3NTAsMjc1NSwyNjI3LDQyMTksIDI3NCwgNTM5LCAzODUsMTI3OCwxNDQyLDUwNTgsMTE1NCwxOTY1LCAzODQsIDU2MSwgMjEwLCAjICA3MDQKICA5OCwxMjk1LDI1NTYsMzU3MCw1MDU5LDE3MTEsMjQyMCwxNDgyLDM0NjMsMzk4NywyOTExLDEyNTcsIDEyOSw1MDYwLDM4MjEsIDY0MiwgIyAgNzIwCiA1MjMsMjc4OSwyNzkwLDI2NTgsNTA2MSwgMTQxLDIyMzUsMTMzMywgIDY4LCAxNzYsIDQ0MSwgODc2LCA5MDcsNDIyMCwgNjAzLDI2MDIsICMgIDczNgogNzEwLCAxNzEsMzQ2NCwgNDA0LCA1NDksICAxOCwzMTQzLDIzOTgsMTQxMCwzNjkyLDE2NjYsNTA2MiwzNTcxLDQ1MzMsMjkxMiw0NTM0LCAjICA3NTIKNTA2MywyOTkxLCAzNjgsNTA2NCwgMTQ2LCAzNjYsICA5OSwgODcxLDM2OTMsMTU0MywgNzQ4LCA4MDcsMTU4NiwxMTg1LCAgMjIsMjI2MywgIyAgNzY4CiAzNzksMzgyMiwzMjExLDUwNjUsMzIxMiwgNTA1LDE5NDIsMjYyOCwxOTkyLDEzODIsMjMxOSw1MDY2LCAzODAsMjM2MiwgMjE4LCA3MDIsICMgIDc4NAoxODE4LDEyNDgsMzQ2NSwzMDQ0LDM1NzIsMzM1NSwzMjgyLDUwNjcsMjk5MiwzNjk0LCA5MzAsMzI4MywzODIzLDUwNjgsICA1OSw1MDY5LCAjICA4MDAKIDU4NSwgNjAxLDQyMjEsIDQ5NywzNDY2LDExMTIsMTMxNCw0NTM1LDE4MDIsNTA3MCwxMjIzLDE0NzIsMjE3Nyw1MDcxLCA3NDksMTgzNywgIyAgODE2CiA2OTAsMTkwMCwzODI0LDE3NzMsMzk4OCwxNDc2LCA0MjksMTA0MywxNzkxLDIyMzYsMjExNywgOTE3LDQyMjIsIDQ0NywxMDg2LDE2MjksICMgIDgzMgo1MDcyLCA1NTYsNTA3Myw1MDc0LDIwMjEsMTY1NCwgODQ0LDEwOTAsIDEwNSwgNTUwLCA5NjYsMTc1OCwyODI4LDEwMDgsMTc4MywgNjg2LCAjICA4NDgKMTA5NSw1MDc1LDIyODcsIDc5MywxNjAyLDUwNzYsMzU3MywyNjAzLDQ1MzYsNDIyMywyOTQ4LDIzMDIsNDUzNywzODI1LCA5ODAsMjUwMywgIyAgODY0CiA1NDQsIDM1MywgNTI3LDQ1MzgsIDkwOCwyNjg3LDI5MTMsNTA3NywgMzgxLDI2MjksMTk0MywxMzQ4LDUwNzgsMTM0MSwxMjUyLCA1NjAsICMgIDg4MAozMDk1LDUwNzksMzQ2NywyODcwLDUwODAsMjA1NCwgOTczLCA4ODYsMjA4MSwgMTQzLDQ1MzksNTA4MSw1MDgyLCAxNTcsMzk4OSwgNDk2LCAjICA4OTYKNDIyNCwgIDU3LCA4NDAsIDU0MCwyMDM5LDQ1NDAsNDU0MSwzNDY4LDIxMTgsMTQ0NSwgOTcwLDIyNjQsMTc0OCwxOTY2LDIwODIsNDIyNSwgIyAgOTEyCjMxNDQsMTIzNCwxNzc2LDMyODQsMjgyOSwzNjk1LCA3NzMsMTIwNiwyMTMwLDEwNjYsMjA0MCwxMzI2LDM5OTAsMTczOCwxNzI1LDQyMjYsICMgIDkyOAogMjc5LDMxNDUsICA1MSwxNTQ0LDI2MDQsIDQyMywxNTc4LDIxMzEsMjA2NywgMTczLDQ1NDIsMTg4MCw1MDgzLDUwODQsMTU4MywgMjY0LCAjICA5NDQKIDYxMCwzNjk2LDQ1NDMsMjQ0NCwgMjgwLCAxNTQsNTA4NSw1MDg2LDUwODcsMTczOSwgMzM4LDEyODIsMzA5NiwgNjkzLDI4NzEsMTQxMSwgIyAgOTYwCjEwNzQsMzgyNiwyNDQ1LDUwODgsNDU0NCw1MDg5LDUwOTAsMTI0MCwgOTUyLDIzOTksNTA5MSwyOTE0LDE1MzgsMjY4OCwgNjg1LDE0ODMsICMgIDk3Ngo0MjI3LDI0NzUsMTQzNiwgOTUzLDQyMjgsMjA1NSw0NTQ1LCA2NzEsMjQwMCwgIDc5LDQyMjksMjQ0NiwzMjg1LCA2MDgsIDU2NywyNjg5LCAjICA5OTIKMzQ2OSw0MjMwLDQyMzEsMTY5MSwgMzkzLDEyNjEsMTc5MiwyNDAxLDUwOTIsNDU0Niw1MDkzLDUwOTQsNTA5NSw1MDk2LDEzODMsMTY3MiwgIyAxMDA4CjM4MjcsMzIxMywxNDY0LCA1MjIsMTExOSwgNjYxLDExNTAsIDIxNiwgNjc1LDQ1NDcsMzk5MSwxNDMyLDM1NzQsIDYwOSw0NTQ4LDI2OTAsICMgMTAyNAoyNDAyLDUwOTcsNTA5OCw1MDk5LDQyMzIsMzA0NSwgICAwLDUxMDAsMjQ3NiwgMzE1LCAyMzEsMjQ0NywgMzAxLDMzNTYsNDU0OSwyMzg1LCAjIDEwNDAKNTEwMSwgMjMzLDQyMzMsMzY5NywxODE5LDQ1NTAsNDU1MSw1MTAyLCAgOTYsMTc3NywxMzE1LDIwODMsNTEwMywgMjU3LDUxMDQsMTgxMCwgIyAxMDU2CjM2OTgsMjcxOCwxMTM5LDE4MjAsNDIzNCwyMDIyLDExMjQsMjE2NCwyNzkxLDE3NzgsMjY1OSw1MTA1LDMwOTcsIDM2MywxNjU1LDMyMTQsICMgMTA3Mgo1MTA2LDI5OTMsNTEwNyw1MTA4LDUxMDksMzk5MiwxNTY3LDM5OTMsIDcxOCwgMTAzLDMyMTUsIDg0OSwxNDQzLCAzNDEsMzM1NywyOTQ5LCAjIDEwODgKMTQ4NCw1MTEwLDE3MTIsIDEyNywgIDY3LCAzMzksNDIzNSwyNDAzLCA2NzksMTQxMiwgODIxLDUxMTEsNTExMiwgODM0LCA3MzgsIDM1MSwgIyAxMTA0CjI5OTQsMjE0NywgODQ2LCAyMzUsMTQ5NywxODgxLCA0MTgsMTk5MywzODI4LDI3MTksIDE4NiwxMTAwLDIxNDgsMjc1NiwzNTc1LDE1NDUsICMgMTEyMAoxMzU1LDI5NTAsMjg3MiwxMzc3LCA1ODMsMzk5NCw0MjM2LDI1ODEsMjk5NSw1MTEzLDEyOTgsMzY5OSwxMDc4LDI1NTcsMzcwMCwyMzYzLCAjIDExMzYKICA3OCwzODI5LDM4MzAsIDI2NywxMjg5LDIxMDAsMjAwMiwxNTk0LDQyMzcsIDM0OCwgMzY5LDEyNzQsMjE5NywyMTc4LDE4MzgsNDU1MiwgIyAxMTUyCjE4MjEsMjgzMCwzNzAxLDI3NTcsMjI4OCwyMDAzLDQ1NTMsMjk1MSwyNzU4LCAxNDQsMzM1OCwgODgyLDQ1NTQsMzk5NSwyNzU5LDM0NzAsICMgMTE2OAo0NTU1LDI5MTUsNTExNCw0MjM4LDE3MjYsIDMyMCw1MTE1LDM5OTYsMzA0NiwgNzg4LDI5OTYsNTExNiwyODMxLDE3NzQsMTMyNywyODczLCAjIDExODQKMzk5NywyODMyLDUxMTcsMTMwNiw0NTU2LDIwMDQsMTcwMCwzODMxLDM1NzYsMjM2NCwyNjYwLCA3ODcsMjAyMywgNTA2LCA4MjQsMzcwMiwgIyAxMjAwCiA1MzQsIDMyMyw0NTU3LDEwNDQsMzM1OSwyMDI0LDE5MDEsIDk0NiwzNDcxLDUxMTgsMTc3OSwxNTAwLDE2NzgsNTExOSwxODgyLDQ1NTgsICMgMTIxNgogMTY1LCAyNDMsNDU1OSwzNzAzLDI1MjgsIDEyMywgNjgzLDQyMzksIDc2NCw0NTYwLCAgMzYsMzk5OCwxNzkzLCA1ODksMjkxNiwgODE2LCAjIDEyMzIKIDYyNiwxNjY3LDMwNDcsMjIzNywxNjM5LDE1NTUsMTYyMiwzODMyLDM5OTksNTEyMCw0MDAwLDI4NzQsMTM3MCwxMjI4LDE5MzMsIDg5MSwgIyAxMjQ4CjIwODQsMjkxNywgMzA0LDQyNDAsNTEyMSwgMjkyLDI5OTcsMjcyMCwzNTc3LCA2OTEsMjEwMSw0MjQxLDExMTUsNDU2MSwgMTE4LCA2NjIsICMgMTI2NAo1MTIyLCA2MTEsMTE1NiwgODU0LDIzODYsMTMxNiwyODc1LCAgIDIsIDM4NiwgNTE1LDI5MTgsNTEyMyw1MTI0LDMyODYsIDg2OCwyMjM4LCAjIDEyODAKMTQ4NiwgODU1LDI2NjEsIDc4NSwyMjE2LDMwNDgsNTEyNSwxMDQwLDMyMTYsMzU3OCw1MTI2LDMxNDYsIDQ0OCw1MTI3LDE1MjUsNTEyOCwgIyAxMjk2CjIxNjUsNDU2Miw1MTI5LDM4MzMsNTEzMCw0MjQyLDI4MzMsMzU3OSwzMTQ3LCA1MDMsIDgxOCw0MDAxLDMxNDgsMTU2OCwgODE0LCA2NzYsICMgMTMxMgoxNDQ0LCAzMDYsMTc0OSw1MTMxLDM4MzQsMTQxNiwxMDMwLCAxOTcsMTQyOCwgODA1LDI4MzQsMTUwMSw0NTYzLDUxMzIsNTEzMyw1MTM0LCAjIDEzMjgKMTk5NCw1MTM1LDQ1NjQsNTEzNiw1MTM3LDIxOTgsICAxMywyNzkyLDM3MDQsMjk5OCwzMTQ5LDEyMjksMTkxNyw1MTM4LDM4MzUsMjEzMiwgIyAxMzQ0CjUxMzksNDI0Myw0NTY1LDI0MDQsMzU4MCw1MTQwLDIyMTcsMTUxMSwxNzI3LDExMjAsNTE0MSw1MTQyLCA2NDYsMzgzNiwyNDQ4LCAzMDcsICMgMTM2MAo1MTQzLDUxNDQsMTU5NSwzMjE3LDUxNDUsNTE0Niw1MTQ3LDM3MDUsMTExMywxMzU2LDQwMDIsMTQ2NSwyNTI5LDI1MzAsNTE0OCwgNTE5LCAjIDEzNzYKNTE0OSwgMTI4LDIxMzMsICA5MiwyMjg5LDE5ODAsNTE1MCw0MDAzLDE1MTIsIDM0MiwzMTUwLDIxOTksNTE1MSwyNzkzLDIyMTgsMTk4MSwgIyAxMzkyCjMzNjAsNDI0NCwgMjkwLDE2NTYsMTMxNywgNzg5LCA4MjcsMjM2NSw1MTUyLDM4MzcsNDU2NiwgNTYyLCA1ODEsNDAwNCw1MTUzLCA0MDEsICMgMTQwOAo0NTY3LDIyNTIsICA5NCw0NTY4LDUxNTQsMTM5OSwyNzk0LDUxNTUsMTQ2MywyMDI1LDQ1NjksMzIxOCwxOTQ0LDUxNTYsIDgyOCwxMTA1LCAjIDE0MjQKNDI0NSwxMjYyLDEzOTQsNTE1Nyw0MjQ2LCA2MDUsNDU3MCw1MTU4LDE3ODQsMjg3Niw1MTU5LDI4MzUsIDgxOSwyMTAyLCA1NzgsMjIwMCwgIyAxNDQwCjI5NTIsNTE2MCwxNTAyLCA0MzYsMzI4Nyw0MjQ3LDMyODgsMjgzNiw0MDA1LDI5MTksMzQ3MiwzNDczLDUxNjEsMjcyMSwyMzIwLDUxNjIsICMgMTQ1Ngo1MTYzLDIzMzcsMjA2OCwgIDIzLDQ1NzEsIDE5MywgODI2LDM4MzgsMjEwMywgNjk5LDE2MzAsNDI0OCwzMDk4LCAzOTAsMTc5NCwxMDY0LCAjIDE0NzIKMzU4MSw1MTY0LDE1NzksMzA5OSwzMTAwLDE0MDAsNTE2NSw0MjQ5LDE4MzksMTY0MCwyODc3LDUxNjYsNDU3Miw0NTczLCAxMzcsNDI1MCwgIyAxNDg4CiA1OTgsMzEwMSwxOTY3LCA3ODAsIDEwNCwgOTc0LDI5NTMsNTE2NywgMjc4LCA4OTksIDI1MywgNDAyLCA1NzIsIDUwNCwgNDkzLDEzMzksICMgMTUwNAo1MTY4LDQwMDYsMTI3NSw0NTc0LDI1ODIsMjU1OCw1MTY5LDM3MDYsMzA0OSwzMTAyLDIyNTMsIDU2NSwxMzM0LDI3MjIsIDg2MywgIDQxLCAjIDE1MjAKNTE3MCw1MTcxLDQ1NzUsNTE3MiwxNjU3LDIzMzgsICAxOSwgNDYzLDI3NjAsNDI1MSwgNjA2LDUxNzMsMjk5OSwzMjg5LDEwODcsMjA4NSwgIyAxNTM2CjEzMjMsMjY2MiwzMDAwLDUxNzQsMTYzMSwxNjIzLDE3NTAsNDI1MiwyNjkxLDUxNzUsMjg3OCwgNzkxLDI3MjMsMjY2MywyMzM5LCAyMzIsICMgMTU1MgoyNDIxLDUxNzYsMzAwMSwxNDk4LDUxNzcsMjY2NCwyNjMwLCA3NTUsMTM2NiwzNzA3LDMyOTAsMzE1MSwyMDI2LDE2MDksIDExOSwxOTE4LCAjIDE1NjgKMzQ3NCwgODYyLDEwMjYsNDI1Myw1MTc4LDQwMDcsMzgzOSw0NTc2LDQwMDgsNDU3NywyMjY1LDE5NTIsMjQ3Nyw1MTc5LDExMjUsIDgxNywgIyAxNTg0CjQyNTQsNDI1NSw0MDA5LDE1MTMsMTc2NiwyMDQxLDE0ODcsNDI1NiwzMDUwLDMyOTEsMjgzNywzODQwLDMxNTIsNTE4MCw1MTgxLDE1MDcsICMgMTYwMAo1MTgyLDI2OTIsIDczMywgIDQwLDE2MzIsMTEwNiwyODc5LCAzNDUsNDI1NywgODQxLDI1MzEsIDIzMCw0NTc4LDMwMDIsMTg0NywzMjkyLCAjIDE2MTYKMzQ3NSw1MTgzLDEyNjMsIDk4NiwzNDc2LDUxODQsIDczNSwgODc5LCAyNTQsMTEzNywgODU3LCA2MjIsMTMwMCwxMTgwLDEzODgsMTU2MiwgIyAxNjMyCjQwMTAsNDAxMSwyOTU0LCA5NjcsMjc2MSwyNjY1LDEzNDksIDU5MiwyMTM0LDE2OTIsMzM2MSwzMDAzLDE5OTUsNDI1OCwxNjc5LDQwMTIsICMgMTY0OAoxOTAyLDIxODgsNTE4NSwgNzM5LDM3MDgsMjcyNCwxMjk2LDEyOTAsNTE4Niw0MjU5LDIyMDEsMjIwMiwxOTIyLDE1NjMsMjYwNSwyNTU5LCAjIDE2NjQKMTg3MSwyNzYyLDMwMDQsNTE4NywgNDM1LDUxODgsIDM0MywxMTA4LCA1OTYsICAxNywxNzUxLDQ1NzksMjIzOSwzNDc3LDM3MDksNTE4OSwgIyAxNjgwCjQ1ODAsIDI5NCwzNTgyLDI5NTUsMTY5MywgNDc3LCA5NzksIDI4MSwyMDQyLDM1ODMsIDY0MywyMDQzLDM3MTAsMjYzMSwyNzk1LDIyNjYsICMgMTY5NgoxMDMxLDIzNDAsMjEzNSwyMzAzLDM1ODQsNDU4MSwgMzY3LDEyNDksMjU2MCw1MTkwLDM1ODUsNTE5MSw0NTgyLDEyODMsMzM2MiwyMDA1LCAjIDE3MTIKIDI0MCwxNzYyLDMzNjMsNDU4Myw0NTg0LCA4MzYsMTA2OSwzMTUzLCA0NzQsNTE5MiwyMTQ5LDI1MzIsIDI2OCwzNTg2LDUxOTMsMzIxOSwgIyAxNzI4CjE1MjEsMTI4NCw1MTk0LDE2NTgsMTU0Niw0MjYwLDUxOTUsMzU4NywzNTg4LDUxOTYsNDI2MSwzMzY0LDI2OTMsMTY4NSw0MjYyLCA5NjEsICMgMTc0NAoxNjczLDI2MzIsIDE5MCwyMDA2LDIyMDMsMzg0MSw0NTg1LDQ1ODYsNTE5NywgNTcwLDI1MDQsMzcxMSwxNDkwLDUxOTgsNDU4NywyNjMzLCAjIDE3NjAKMzI5MywxOTU3LDQ1ODgsIDU4NCwxNTE0LCAzOTYsMTA0NSwxOTQ1LDUxOTksNDU4OSwxOTY4LDI0NDksNTIwMCw1MjAxLDQ1OTAsNDAxMywgIyAxNzc2CiA2MTksNTIwMiwzMTU0LDMyOTQsIDIxNSwyMDA3LDI3OTYsMjU2MSwzMjIwLDQ1OTEsMzIyMSw0NTkyLCA3NjMsNDI2MywzODQyLDQ1OTMsICMgMTc5Mgo1MjAzLDUyMDQsMTk1OCwxNzY3LDI5NTYsMzM2NSwzNzEyLDExNzQsIDQ1MiwxNDc3LDQ1OTQsMzM2NiwzMTU1LDUyMDUsMjgzOCwxMjUzLCAjIDE4MDgKMjM4NywyMTg5LDEwOTEsMjI5MCw0MjY0LCA0OTIsNTIwNiwgNjM4LDExNjksMTgyNSwyMTM2LDE3NTIsNDAxNCwgNjQ4LCA5MjYsMTAyMSwgIyAxODI0CjEzMjQsNDU5NSwgNTIwLDQ1OTYsIDk5NywgODQ3LDEwMDcsIDg5Miw0NTk3LDM4NDMsMjI2NywxODcyLDM3MTMsMjQwNSwxNzg1LDQ1OTgsICMgMTg0MAoxOTUzLDI5NTcsMzEwMywzMjIyLDE3MjgsNDI2NSwyMDQ0LDM3MTQsNDU5OSwyMDA4LDE3MDEsMzE1NiwxNTUxLCAgMzAsMjI2OCw0MjY2LCAjIDE4NTYKNTIwNywyMDI3LDQ2MDAsMzU4OSw1MjA4LCA1MDEsNTIwOSw0MjY3LCA1OTQsMzQ3OCwyMTY2LDE4MjIsMzU5MCwzNDc5LDM1OTEsMzIyMywgIyAxODcyCiA4MjksMjgzOSw0MjY4LDUyMTAsMTY4MCwzMTU3LDEyMjUsNDI2OSw1MjExLDMyOTUsNDYwMSw0MjcwLDMxNTgsMjM0MSw1MjEyLDQ2MDIsICMgMTg4OAo0MjcxLDUyMTMsNDAxNSw0MDE2LDUyMTQsMTg0OCwyMzg4LDI2MDYsMzM2Nyw1MjE1LDQ2MDMsIDM3NCw0MDE3LCA2NTIsNDI3Miw0MjczLCAjIDE5MDQKIDM3NSwxMTQwLCA3OTgsNTIxNiw1MjE3LDUyMTgsMjM2Niw0NjA0LDIyNjksIDU0NiwxNjU5LCAxMzgsMzA1MSwyNDUwLDQ2MDUsNTIxOSwgIyAxOTIwCjIyNTQsIDYxMiwxODQ5LCA5MTAsIDc5NiwzODQ0LDE3NDAsMTM3MSwgODI1LDM4NDUsMzg0Niw1MjIwLDI5MjAsMjU2Miw1MjIxLCA2OTIsICMgMTkzNgogNDQ0LDMwNTIsMjYzNCwgODAxLDQ2MDYsNDI3NCw1MjIyLDE0OTEsIDI0NCwxMDUzLDMwNTMsNDI3NSw0Mjc2LCAzNDAsNTIyMyw0MDE4LCAjIDE5NTIKMTA0MSwzMDA1LCAyOTMsMTE2OCwgIDg3LDEzNTcsNTIyNCwxNTM5LCA5NTksNTIyNSwyMjQwLCA3MjEsIDY5NCw0Mjc3LDM4NDcsIDIxOSwgIyAxOTY4CjE0NzgsIDY0NCwxNDE3LDMzNjgsMjY2NiwxNDEzLDE0MDEsMTMzNSwxMzg5LDQwMTksNTIyNiw1MjI3LDMwMDYsMjM2NywzMTU5LDE4MjYsICMgMTk4NAogNzMwLDE1MTUsIDE4NCwyODQwLCAgNjYsNDYwNyw1MjI4LDE2NjAsMjk1OCwgMjQ2LDMzNjksIDM3OCwxNDU3LCAyMjYsMzQ4MCwgOTc1LCAjIDIwMDAKNDAyMCwyOTU5LDEyNjQsMzU5MiwgNjc0LCA2OTYsNTIyOSwgMTYzLDUyMzAsMTE0MSwyNDIyLDIxNjcsIDcxMywzNTkzLDMzNzAsNDYwOCwgIyAyMDE2CjQwMjEsNTIzMSw1MjMyLDExODYsICAxNSw1MjMzLDEwNzksMTA3MCw1MjM0LDE1MjIsMzIyNCwzNTk0LCAyNzYsMTA1MCwyNzI1LCA3NTgsICMgMjAzMgoxMTI2LCA2NTMsMjk2MCwzMjk2LDUyMzUsMjM0MiwgODg5LDM1OTUsNDAyMiwzMTA0LDMwMDcsIDkwMywxMjUwLDQ2MDksNDAyMywzNDgxLCAjIDIwNDgKMzU5NiwxMzQyLDE2ODEsMTcxOCwgNzY2LDMyOTcsIDI4NiwgIDg5LDI5NjEsMzcxNSw1MjM2LDE3MTMsNTIzNywyNjA3LDMzNzEsMzAwOCwgIyAyMDY0CjUyMzgsMjk2MiwyMjE5LDMyMjUsMjg4MCw1MjM5LDQ2MTAsMjUwNSwyNTMzLCAxODEsIDM4NywxMDc1LDQwMjQsIDczMSwyMTkwLDMzNzIsICMgMjA4MAo1MjQwLDMyOTgsIDMxMCwgMzEzLDM0ODIsMjMwNCwgNzcwLDQyNzgsICA1NCwzMDU0LCAxODksNDYxMSwzMTA1LDM4NDgsNDAyNSw1MjQxLCAjIDIwOTYKMTIzMCwxNjE3LDE4NTAsIDM1NSwzNTk3LDQyNzksNDYxMiwzMzczLCAxMTEsNDI4MCwzNzE2LDEzNTAsMzE2MCwzNDgzLDMwNTUsNDI4MSwgIyAyMTEyCjIxNTAsMzI5OSwzNTk4LDUyNDIsMjc5Nyw0MDI2LDQwMjcsMzAwOSwgNzIyLDIwMDksNTI0MywxMDcxLCAyNDcsMTIwNywyMzQzLDI0NzgsICMgMjEyOAoxMzc4LDQ2MTMsMjAxMCwgODY0LDE0MzcsMTIxNCw0NjE0LCAzNzMsMzg0OSwxMTQyLDIyMjAsIDY2Nyw0NjE1LCA0NDIsMjc2MywyNTYzLCAjIDIxNDQKMzg1MCw0MDI4LDE5NjksNDI4MiwzMzAwLDE4NDAsIDgzNywgMTcwLDExMDcsIDkzNCwxMzM2LDE4ODMsNTI0NCw1MjQ1LDIxMTksNDI4MywgIyAyMTYwCjI4NDEsIDc0MywxNTY5LDUyNDYsNDYxNiw0Mjg0LCA1ODIsMjM4OSwxNDE4LDM0ODQsNTI0NywxODAzLDUyNDgsIDM1NywxMzk1LDE3MjksICMgMjE3NgozNzE3LDMzMDEsMjQyMywxNTY0LDIyNDEsNTI0OSwzMTA2LDM4NTEsMTYzMyw0NjE3LDExMTQsMjA4Niw0Mjg1LDE1MzIsNTI1MCwgNDgyLCAjIDIxOTIKMjQ1MSw0NjE4LDUyNTEsNTI1MiwxNDkyLCA4MzMsMTQ2Niw1MjUzLDI3MjYsMzU5OSwxNjQxLDI4NDIsNTI1NCwxNTI2LDEyNzIsMzcxOCwgIyAyMjA4CjQyODYsMTY4NiwxNzk1LCA0MTYsMjU2NCwxOTAzLDE5NTQsMTgwNCw1MjU1LDM4NTIsMjc5OCwzODUzLDExNTksMjMyMSw1MjU2LDI4ODEsICMgMjIyNAo0NjE5LDE2MTAsMTU4NCwzMDU2LDI0MjQsMjc2NCwgNDQzLDMzMDIsMTE2MywzMTYxLDUyNTcsNTI1OCw0MDI5LDUyNTksNDI4NywyNTA2LCAjIDIyNDAKMzA1Nyw0NjIwLDQwMzAsMzE2MiwyMTA0LDE2NDcsMzYwMCwyMDExLDE4NzMsNDI4OCw1MjYwLDQyODksIDQzMSwzNDg1LDUyNjEsIDI1MCwgIyAyMjU2CiAgOTcsICA4MSw0MjkwLDUyNjIsMTY0OCwxODUxLDE1NTgsIDE2MCwgODQ4LDUyNjMsIDg2NiwgNzQwLDE2OTQsNTI2NCwyMjA0LDI4NDMsICMgMjI3MgozMjI2LDQyOTEsNDYyMSwzNzE5LDE2ODcsIDk1MCwyNDc5LCA0MjYsIDQ2OSwzMjI3LDM3MjAsMzcyMSw0MDMxLDUyNjUsNTI2NiwxMTg4LCAjIDIyODgKIDQyNCwxOTk2LCA4NjEsMzYwMSw0MjkyLDM4NTQsMjIwNSwyNjk0LCAxNjgsMTIzNSwzNjAyLDQyOTMsNTI2NywyMDg3LDE2NzQsNDYyMiwgIyAyMzA0CjMzNzQsMzMwMywgMjIwLDI1NjUsMTAwOSw1MjY4LDM4NTUsIDY3MCwzMDEwLCAzMzIsMTIwOCwgNzE3LDUyNjksNTI3MCwzNjAzLDI0NTIsICMgMjMyMAo0MDMyLDMzNzUsNTI3MSwgNTEzLDUyNzIsMTIwOSwyODgyLDMzNzYsMzE2Myw0NjIzLDEwODAsNTI3Myw1Mjc0LDUyNzUsNTI3NiwyNTM0LCAjIDIzMzYKMzcyMiwzNjA0LCA4MTUsMTU4Nyw0MDMzLDQwMzQsNTI3NywzNjA1LDM0ODYsMzg1NiwxMjU0LDQ2MjQsMTMyOCwzMDU4LDEzOTAsNDAzNSwgIyAyMzUyCjE3NDEsNDAzNiwzODU3LDQwMzcsNTI3OCwgMjM2LDM4NTgsMjQ1MywzMzA0LDUyNzksNTI4MCwzNzIzLDM4NTksMTI3MywzODYwLDQ2MjUsICMgMjM2OAo1MjgxLCAzMDgsNTI4Miw0NjI2LCAyNDUsNDYyNywxODUyLDI0ODAsMTMwNywyNTgzLCA0MzAsIDcxNSwyMTM3LDI0NTQsNTI4MywgMjcwLCAjIDIzODQKIDE5OSwyODgzLDQwMzgsNTI4NCwzNjA2LDI3MjcsMTc1MywgNzYxLDE3NTQsIDcyNSwxNjYxLDE4NDEsNDYyOCwzNDg3LDM3MjQsNTI4NSwgIyAyNDAwCjUyODYsIDU4NywgIDE0LDMzMDUsIDIyNywyNjA4LCAzMjYsIDQ4MCwyMjcwLCA5NDMsMjc2NSwzNjA3LCAyOTEsIDY1MCwxODg0LDUyODcsICMgMjQxNgoxNzAyLDEyMjYsIDEwMiwxNTQ3LCAgNjIsMzQ4OCwgOTA0LDQ2MjksMzQ4OSwxMTY0LDQyOTQsNTI4OCw1Mjg5LDEyMjQsMTU0OCwyNzY2LCAjIDI0MzIKIDM5MSwgNDk4LDE0OTMsNTI5MCwxMzg2LDE0MTksNTI5MSwyMDU2LDExNzcsNDYzMCwgODEzLCA4ODAsMTA4MSwyMzY4LCA1NjYsMTE0NSwgIyAyNDQ4CjQ2MzEsMjI5MSwxMDAxLDEwMzUsMjU2NiwyNjA5LDIyNDIsIDM5NCwxMjg2LDUyOTIsNTI5MywyMDY5LDUyOTQsICA4NiwxNDk0LDE3MzAsICMgMjQ2NAo0MDM5LCA0OTEsMTU4OCwgNzQ1LCA4OTcsMjk2MywgODQzLDMzNzcsNDA0MCwyNzY3LDI4ODQsMzMwNiwxNzY4LCA5OTgsMjIyMSwyMDcwLCAjIDI0ODAKIDM5NywxODI3LDExOTUsMTk3MCwzNzI1LDMwMTEsMzM3OCwgMjg0LDUyOTUsMzg2MSwyNTA3LDIxMzgsMjEyMCwxOTA0LDUyOTYsNDA0MSwgIyAyNDk2CjIxNTEsNDA0Miw0Mjk1LDEwMzYsMzQ5MCwxOTA1LCAxMTQsMjU2Nyw0Mjk2LCAyMDksMTUyNyw1Mjk3LDUyOTgsMjk2NCwyODQ0LDI2MzUsICMgMjUxMgoyMzkwLDI3MjgsMzE2NCwgODEyLDI1NjgsNTI5OSwzMzA3LDUzMDAsMTU1OSwgNzM3LDE4ODUsMzcyNiwxMjEwLCA4ODUsICAyOCwyNjk1LCAjIDI1MjgKMzYwOCwzODYyLDUzMDEsNDI5NywxMDA0LDE3ODAsNDYzMiw1MzAyLCAzNDYsMTk4MiwyMjIyLDI2OTYsNDYzMywzODYzLDE3NDIsIDc5NywgIyAyNTQ0CjE2NDIsNDA0MywxOTM0LDEwNzIsMTM4NCwyMTUyLCA4OTYsNDA0NCwzMzA4LDM3MjcsMzIyOCwyODg1LDM2MDksNTMwMywyNTY5LDE5NTksICMgMjU2MAo0NjM0LDI0NTUsMTc4Niw1MzA0LDUzMDUsNTMwNiw0MDQ1LDQyOTgsMTAwNSwxMzA4LDM3MjgsNDI5OSwyNzI5LDQ2MzUsNDYzNiwxNTI4LCAjIDI1NzYKMjYxMCwgMTYxLDExNzgsNDMwMCwxOTgzLCA5ODcsNDYzNywxMTAxLDQzMDEsIDYzMSw0MDQ2LDExNTcsMzIyOSwyNDI1LDEzNDMsMTI0MSwgIyAyNTkyCjEwMTYsMjI0MywyNTcwLCAzNzIsIDg3NywyMzQ0LDI1MDgsMTE2MCwgNTU1LDE5MzUsIDkxMSw0MDQ3LDUzMDcsIDQ2NiwxMTcwLCAxNjksICMgMjYwOAoxMDUxLDI5MjEsMjY5NywzNzI5LDI0ODEsMzAxMiwxMTgyLDIwMTIsMjU3MSwxMjUxLDI2MzYsNTMwOCwgOTkyLDIzNDUsMzQ5MSwxNTQwLCAjIDI2MjQKMjczMCwxMjAxLDIwNzEsMjQwNiwxOTk3LDI0ODIsNTMwOSw0NjM4LCA1MjgsMTkyMywyMTkxLDE1MDMsMTg3NCwxNTcwLDIzNjksMzM3OSwgIyAyNjQwCjMzMDksNTMxMCwgNTU3LDEwNzMsNTMxMSwxODI4LDM0OTIsMjA4OCwyMjcxLDMxNjUsMzA1OSwzMTA3LCA3NjcsMzEwOCwyNzk5LDQ2MzksICMgMjY1NgoxMDA2LDQzMDIsNDY0MCwyMzQ2LDEyNjcsMjE3OSwzNzMwLDMyMzAsIDc3OCw0MDQ4LDMyMzEsMjczMSwxNTk3LDI2NjcsNTMxMiw0NjQxLCAjIDI2NzIKNTMxMywzNDkzLDUzMTQsNTMxNSw1MzE2LDMzMTAsMjY5OCwxNDMzLDMzMTEsIDEzMSwgIDk1LDE1MDQsNDA0OSwgNzIzLDQzMDMsMzE2NiwgIyAyNjg4CjE4NDIsMzYxMCwyNzY4LDIxOTIsNDA1MCwyMDI4LDIxMDUsMzczMSw1MzE3LDMwMTMsNDA1MSwxMjE4LDUzMTgsMzM4MCwzMjMyLDQwNTIsICMgMjcwNAo0MzA0LDI1ODQsIDI0OCwxNjM0LDM4NjQsIDkxMiw1MzE5LDI4NDUsMzczMiwzMDYwLDM4NjUsIDY1NCwgIDUzLDUzMjAsMzAxNCw1MzIxLCAjIDI3MjAKMTY4OCw0NjQyLCA3NzcsMzQ5NCwxMDMyLDQwNTMsMTQyNSw1MzIyLCAxOTEsIDgyMCwyMTIxLDI4NDYsIDk3MSw0NjQzLCA5MzEsMzIzMywgIyAyNzM2CiAxMzUsIDY2NCwgNzgzLDM4NjYsMTk5OCwgNzcyLDI5MjIsMTkzNiw0MDU0LDM4NjcsNDY0NCwyOTIzLDMyMzQsIDI4MiwyNzMyLCA2NDAsICMgMjc1MgoxMzcyLDM0OTUsMTEyNywgOTIyLCAzMjUsMzM4MSw1MzIzLDUzMjQsIDcxMSwyMDQ1LDUzMjUsNTMyNiw0MDU1LDIyMjMsMjgwMCwxOTM3LCAjIDI3NjgKNDA1NiwzMzgyLDIyMjQsMjI1NSwzODY4LDIzMDUsNTMyNyw0NjQ1LDM4NjksMTI1OCwzMzEyLDQwNTcsMzIzNSwyMTM5LDI5NjUsNDA1OCwgIyAyNzg0CjQwNTksNTMyOCwyMjI1LCAyNTgsMzIzNiw0NjQ2LCAxMDEsMTIyNyw1MzI5LDMzMTMsMTc1NSw1MzMwLDEzOTEsMzMxNCw1MzMxLDI5MjQsICMgMjgwMAoyMDU3LCA4OTMsNTMzMiw1MzMzLDUzMzQsMTQwMiw0MzA1LDIzNDcsNTMzNSw1MzM2LDMyMzcsMzYxMSw1MzM3LDUzMzgsIDg3OCwxMzI1LCAjIDI4MTYKMTc4MSwyODAxLDQ2NDcsIDI1OSwxMzg1LDI1ODUsIDc0NCwxMTgzLDIyNzIsNDY0OCw1MzM5LDQwNjAsMjUwOSw1MzQwLCA2ODQsMTAyNCwgIyAyODMyCjQzMDYsNTM0MSwgNDcyLDM2MTIsMzQ5NiwxMTY1LDMzMTUsNDA2MSw0MDYyLCAzMjIsMjE1MywgODgxLCA0NTUsMTY5NSwxMTUyLDEzNDAsICMgMjg0OAogNjYwLCA1NTQsMjE1NCw0NjQ5LDEwNTgsNDY1MCw0MzA3LCA4MzAsMTA2NSwzMzgzLDQwNjMsNDY1MSwxOTI0LDUzNDIsMTcwMywxOTE5LCAjIDI4NjQKNTM0MywgOTMyLDIyNzMsIDEyMiw1MzQ0LDQ2NTIsIDk0NywgNjc3LDUzNDUsMzg3MCwyNjM3LCAyOTcsMTkwNiwxOTI1LDIyNzQsNDY1MywgIyAyODgwCjIzMjIsMzMxNiw1MzQ2LDUzNDcsNDMwOCw1MzQ4LDQzMDksICA4NCw0MzEwLCAxMTIsIDk4OSw1MzQ5LCA1NDcsMTA1OSw0MDY0LCA3MDEsICMgMjg5NgozNjEzLDEwMTksNTM1MCw0MzExLDUzNTEsMzQ5NywgOTQyLCA2MzksIDQ1NywyMzA2LDI0NTYsIDk5MywyOTY2LCA0MDcsIDg1MSwgNDk0LCAjIDI5MTIKNDY1NCwzMzg0LCA5MjcsNTM1MiwxMjM3LDUzNTMsMjQyNiwzMzg1LCA1NzMsNDMxMiwgNjgwLCA5MjEsMjkyNSwxMjc5LDE4NzUsIDI4NSwgIyAyOTI4CiA3OTAsMTQ0OCwxOTg0LCA3MTksMjE2OCw1MzU0LDUzNTUsNDY1NSw0MDY1LDQwNjYsMTY0OSw1MzU2LDE1NDEsIDU2Myw1MzU3LDEwNzcsICMgMjk0NAo1MzU4LDMzODYsMzA2MSwzNDk4LCA1MTEsMzAxNSw0MDY3LDQwNjgsMzczMyw0MDY5LDEyNjgsMjU3MiwzMzg3LDMyMzgsNDY1Niw0NjU3LCAjIDI5NjAKNTM1OSwgNTM1LDEwNDgsMTI3NiwxMTg5LDI5MjYsMjAyOSwzMTY3LDE0MzgsMTM3MywyODQ3LDI5NjcsMTEzNCwyMDEzLDUzNjAsNDMxMywgIyAyOTc2CjEyMzgsMjU4NiwzMTA5LDEyNTksNTM2MSwgNzAwLDUzNjIsMjk2OCwzMTY4LDM3MzQsNDMxNCw1MzYzLDQzMTUsMTE0NiwxODc2LDE5MDcsICMgMjk5Mgo0NjU4LDI2MTEsNDA3MCwgNzgxLDI0MjcsIDEzMiwxNTg5LCAyMDMsIDE0NywgMjczLDI4MDIsMjQwNywgODk4LDE3ODcsMjE1NSw0MDcxLCAjIDMwMDgKNDA3Miw1MzY0LDM4NzEsMjgwMyw1MzY1LDUzNjYsNDY1OSw0NjYwLDUzNjcsMzIzOSw1MzY4LDE2MzUsMzg3MiwgOTY1LDUzNjksMTgwNSwgIyAzMDI0CjI2OTksMTUxNiwzNjE0LDExMjEsMTA4MiwxMzI5LDMzMTcsNDA3MywxNDQ5LDM4NzMsICA2NSwxMTI4LDI4NDgsMjkyNywyNzY5LDE1OTAsICMgMzA0MAozODc0LDUzNzAsNTM3MSwgIDEyLDI2NjgsICA0NSwgOTc2LDI1ODcsMzE2OSw0NjYxLCA1MTcsMjUzNSwxMDEzLDEwMzcsMzI0MCw1MzcyLCAjIDMwNTYKMzg3NSwyODQ5LDUzNzMsMzg3Niw1Mzc0LDM0OTksNTM3NSwyNjEyLCA2MTQsMTk5OSwyMzIzLDM4NzcsMzExMCwyNzMzLDI2MzgsNTM3NiwgIyAzMDcyCjI1ODgsNDMxNiwgNTk5LDEyNjksNTM3NywxODExLDM3MzUsNTM3OCwyNzAwLDMxMTEsIDc1OSwxMDYwLCA0ODksMTgwNiwzMzg4LDMzMTgsICMgMzA4OAoxMzU4LDUzNzksNTM4MCwyMzkxLDEzODcsMTIxNSwyNjM5LDIyNTYsIDQ5MCw1MzgxLDUzODIsNDMxNywxNzU5LDIzOTIsMjM0OCw1MzgzLCAjIDMxMDQKNDY2MiwzODc4LDE5MDgsNDA3NCwyNjQwLDE4MDcsMzI0MSw0NjYzLDM1MDAsMzMxOSwyNzcwLDIzNDksIDg3NCw1Mzg0LDUzODUsMzUwMSwgIyAzMTIwCjM3MzYsMTg1OSwgIDkxLDI5MjgsMzczNywzMDYyLDM4NzksNDY2NCw1Mzg2LDMxNzAsNDA3NSwyNjY5LDUzODcsMzUwMiwxMjAyLDE0MDMsICMgMzEzNgozODgwLDI5NjksMjUzNiwxNTE3LDI1MTAsNDY2NSwzNTAzLDI1MTEsNTM4OCw0NjY2LDUzODksMjcwMSwxODg2LDE0OTUsMTczMSw0MDc2LCAjIDMxNTIKMjM3MCw0NjY3LDUzOTAsMjAzMCw1MzkxLDUzOTIsNDA3NywyNzAyLDEyMTYsIDIzNywyNTg5LDQzMTgsMjMyNCw0MDc4LDM4ODEsNDY2OCwgIyAzMTY4CjQ2NjksMjcwMywzNjE1LDM1MDQsIDQ0NSw0NjcwLDUzOTMsNTM5NCw1Mzk1LDUzOTYsMjc3MSwgIDYxLDQwNzksMzczOCwxODIzLDQwODAsICMgMzE4NAo1Mzk3LCA2ODcsMjA0NiwgOTM1LCA5MjUsIDQwNSwyNjcwLCA3MDMsMTA5NiwxODYwLDI3MzQsNDY3MSw0MDgxLDE4NzcsMTM2NywyNzA0LCAjIDMyMDAKMzM4OSwgOTE4LDIxMDYsMTc4MiwyNDgzLCAzMzQsMzMyMCwxNjExLDEwOTMsNDY3MiwgNTY0LDMxNzEsMzUwNSwzNzM5LDMzOTAsIDk0NSwgIyAzMjE2CjI2NDEsMjA1OCw0NjczLDUzOTgsMTkyNiwgODcyLDQzMTksNTM5OSwzNTA2LDI3MDUsMzExMiwgMzQ5LDQzMjAsMzc0MCw0MDgyLDQ2NzQsICMgMzIzMgozODgyLDQzMjEsMzc0MSwyMTU2LDQwODMsNDY3NSw0Njc2LDQzMjIsNDY3NywyNDA4LDIwNDcsIDc4Miw0MDg0LCA0MDAsIDI1MSw0MzIzLCAjIDMyNDgKMTYyNCw1NDAwLDU0MDEsIDI3NywzNzQyLCAyOTksMTI2NSwgNDc2LDExOTEsMzg4MywyMTIyLDQzMjQsNDMyNSwxMTA5LCAyMDUsNTQwMiwgIyAzMjY0CjI1OTAsMTAwMCwyMTU3LDM2MTYsMTg2MSw1NDAzLDU0MDQsNTQwNSw0Njc4LDU0MDYsNDY3OSwyNTczLCAxMDcsMjQ4NCwyMTU4LDQwODUsICMgMzI4MAozNTA3LDMxNzIsNTQwNywxNTMzLCA1NDEsMTMwMSwgMTU4LCA3NTMsNDMyNiwyODg2LDM2MTcsNTQwOCwxNjk2LCAzNzAsMTA4OCw0MzI3LCAjIDMyOTYKNDY4MCwzNjE4LCA1NzksIDMyNywgNDQwLCAxNjIsMjI0NCwgMjY5LDE5MzgsMTM3NCwzNTA4LCA5NjgsMzA2MywgIDU2LDEzOTYsMzExMywgIyAzMzEyCjIxMDcsMzMyMSwzMzkxLDU0MDksMTkyNywyMTU5LDQ2ODEsMzAxNiw1NDEwLDM2MTksNTQxMSw1NDEyLDM3NDMsNDY4MiwyNDg1LDU0MTMsICMgMzMyOAoyODA0LDU0MTQsMTY1MCw0NjgzLDU0MTUsMjYxMyw1NDE2LDU0MTcsNDA4NiwyNjcxLDMzOTIsMTE0OSwzMzkzLDQwODcsMzg4NCw0MDg4LCAjIDMzNDQKNTQxOCwxMDc2LCAgNDksNTQxOSwgOTUxLDMyNDIsMzMyMiwzMzIzLCA0NTAsMjg1MCwgOTIwLDU0MjAsMTgxMiwyODA1LDIzNzEsNDMyOCwgIyAzMzYwCjE5MDksMTEzOCwyMzcyLDM4ODUsMzUwOSw1NDIxLDMyNDMsNDY4NCwxOTEwLDExNDcsMTUxOCwyNDI4LDQ2ODUsMzg4Niw1NDIyLDQ2ODYsICMgMzM3NgoyMzkzLDI2MTQsIDI2MCwxNzk2LDMyNDQsNTQyMyw1NDI0LDM4ODcsMzMyNCwgNzA4LDU0MjUsMzYyMCwxNzA0LDU0MjYsMzYyMSwxMzUxLCAjIDMzOTIKMTYxOCwzMzk0LDMwMTcsMTg4NywgOTQ0LDQzMjksMzM5NSw0MzMwLDMwNjQsMzM5Niw0MzMxLDU0MjcsMzc0NCwgNDIyLCA0MTMsMTcxNCwgIyAzNDA4CjMzMjUsIDUwMCwyMDU5LDIzNTAsNDMzMiwyNDg2LDU0MjgsMTM0NCwxOTExLCA5NTQsNTQyOSwxNjY4LDU0MzAsNTQzMSw0MDg5LDI0MDksICMgMzQyNAo0MzMzLDM2MjIsMzg4OCw0MzM0LDU0MzIsMjMwNywxMzE4LDI1MTIsMzExNCwgMTMzLDMxMTUsMjg4Nyw0Njg3LCA2MjksICAzMSwyODUxLCAjIDM0NDAKMjcwNiwzODg5LDQ2ODgsIDg1MCwgOTQ5LDQ2ODksNDA5MCwyOTcwLDE3MzIsMjA4OSw0MzM1LDE0OTYsMTg1Myw1NDMzLDQwOTEsIDYyMCwgIyAzNDU2CjMyNDUsIDk4MSwxMjQyLDM3NDUsMzM5NywxNjE5LDM3NDYsMTY0MywzMzI2LDIxNDAsMjQ1NywxOTcxLDE3MTksMzUxMCwyMTY5LDU0MzQsICMgMzQ3MgozMjQ2LDU0MzUsNTQzNiwzMzk4LDE4MjksNTQzNywxMjc3LDQ2OTAsMTU2NSwyMDQ4LDU0MzgsMTYzNiwzNjIzLDMxMTYsNTQzOSwgODY5LCAjIDM0ODgKMjg1MiwgNjU1LDM4OTAsMzg5MSwzMTE3LDQwOTIsMzAxOCwzODkyLDEzMTAsMzYyNCw0NjkxLDU0NDAsNTQ0MSw1NDQyLDE3MzMsIDU1OCwgIyAzNTA0CjQ2OTIsMzc0NywgMzM1LDE1NDksMzA2NSwxNzU2LDQzMzYsMzc0OCwxOTQ2LDM1MTEsMTgzMCwxMjkxLDExOTIsIDQ3MCwyNzM1LDIxMDgsICMgMzUyMAoyODA2LCA5MTMsMTA1NCw0MDkzLDU0NDMsMTAyNyw1NDQ0LDMwNjYsNDA5NCw0NjkzLCA5ODIsMjY3MiwzMzk5LDMxNzMsMzUxMiwzMjQ3LCAjIDM1MzYKMzI0OCwxOTQ3LDI4MDcsNTQ0NSwgNTcxLDQ2OTQsNTQ0NiwxODMxLDU0NDcsMzYyNSwyNTkxLDE1MjMsMjQyOSw1NDQ4LDIwOTAsIDk4NCwgIyAzNTUyCjQ2OTUsMzc0OSwxOTYwLDU0NDksMzc1MCwgODUyLCA5MjMsMjgwOCwzNTEzLDM3NTEsIDk2OSwxNTE5LCA5OTksMjA0OSwyMzI1LDE3MDUsICMgMzU2OAo1NDUwLDMxMTgsIDYxNSwxNjYyLCAxNTEsIDU5Nyw0MDk1LDI0MTAsMjMyNiwxMDQ5LCAyNzUsNDY5NiwzNzUyLDQzMzcsIDU2OCwzNzUzLCAjIDM1ODQKMzYyNiwyNDg3LDQzMzgsMzc1NCw1NDUxLDI0MzAsMjI3NSwgNDA5LDMyNDksNTQ1MiwxNTY2LDI4ODgsMzUxNCwxMDAyLCA3NjksMjg1MywgIyAzNjAwCiAxOTQsMjA5MSwzMTc0LDM3NTUsMjIyNiwzMzI3LDQzMzksIDYyOCwxNTA1LDU0NTMsNTQ1NCwxNzYzLDIxODAsMzAxOSw0MDk2LCA1MjEsICMgMzYxNgoxMTYxLDI1OTIsMTc4OCwyMjA2LDI0MTEsNDY5Nyw0MDk3LDE2MjUsNDM0MCw0MzQxLCA0MTIsICA0MiwzMTE5LCA0NjQsNTQ1NSwyNjQyLCAjIDM2MzIKNDY5OCwzNDAwLDE3NjAsMTU3MSwyODg5LDM1MTUsMjUzNywxMjE5LDIyMDcsMzg5MywyNjQzLDIxNDEsMjM3Myw0Njk5LDQ3MDAsMzMyOCwgIyAzNjQ4CjE2NTEsMzQwMSwzNjI3LDU0NTYsNTQ1NywzNjI4LDI0ODgsMzUxNiw1NDU4LDM3NTYsNTQ1OSw1NDYwLDIyNzYsMjA5MiwgNDYwLDU0NjEsICMgMzY2NAo0NzAxLDU0NjIsMzAyMCwgOTYyLCA1ODgsMzYyOSwgMjg5LDMyNTAsMjY0NCwxMTE2LCAgNTIsNTQ2MywzMDY3LDE3OTcsNTQ2NCw1NDY1LCAjIDM2ODAKNTQ2NiwxNDY3LDU0NjcsMTU5OCwxMTQzLDM3NTcsNDM0MiwxOTg1LDE3MzQsMTA2Nyw0NzAyLDEyODAsMzQwMiwgNDY1LDQ3MDMsMTU3MiwgIyAzNjk2CiA1MTAsNTQ2OCwxOTI4LDIyNDUsMTgxMywxNjQ0LDM2MzAsNTQ2OSw0NzA0LDM3NTgsNTQ3MCw1NDcxLDI2NzMsMTU3MywxNTM0LDU0NzIsICMgMzcxMgo1NDczLCA1MzYsMTgwOCwxNzYxLDM1MTcsMzg5NCwzMTc1LDI2NDUsNTQ3NCw1NDc1LDU0NzYsNDcwNSwzNTE4LDI5MjksMTkxMiwyODA5LCAjIDM3MjgKNTQ3NywzMzI5LDExMjIsIDM3NywzMjUxLDU0NzgsIDM2MCw1NDc5LDU0ODAsNDM0MywxNTI5LCA1NTEsNTQ4MSwyMDYwLDM3NTksMTc2OSwgIyAzNzQ0CjI0MzEsNTQ4MiwyOTMwLDQzNDQsMzMzMCwzMTIwLDIzMjcsMjEwOSwyMDMxLDQ3MDYsMTQwNCwgMTM2LDE0NjgsMTQ3OSwgNjcyLDExNzEsICMgMzc2MAozMjUyLDIzMDgsIDI3MSwzMTc2LDU0ODMsMjc3Miw1NDg0LDIwNTAsIDY3OCwyNzM2LCA4NjUsMTk0OCw0NzA3LDU0ODUsMjAxNCw0MDk4LCAjIDM3NzYKMjk3MSw1NDg2LDI3MzcsMjIyNywxMzk3LDMwNjgsMzc2MCw0NzA4LDQ3MDksMTczNSwyOTMxLDM0MDMsMzYzMSw1NDg3LDM4OTUsIDUwOSwgIyAzNzkyCjI4NTQsMjQ1OCwyODkwLDM4OTYsNTQ4OCw1NDg5LDMxNzcsMzE3OCw0NzEwLDQzNDUsMjUzOCw0NzExLDIzMDksMTE2NiwxMDEwLCA1NTIsICMgMzgwOAogNjgxLDE4ODgsNTQ5MCw1NDkxLDI5NzIsMjk3Myw0MDk5LDEyODcsMTU5NiwxODYyLDMxNzksIDM1OCwgNDUzLCA3MzYsIDE3NSwgNDc4LCAjIDM4MjQKMTExNywgOTA1LDExNjcsMTA5Nyw1NDkyLDE4NTQsMTUzMCw1NDkzLDE3MDYsNTQ5NCwyMTgxLDM1MTksMjI5MiwzNzYxLDM1MjAsMzYzMiwgIyAzODQwCjQzNDYsMjA5Myw0MzQ3LDU0OTUsMzQwNCwxMTkzLDI0ODksNDM0OCwxNDU4LDIxOTMsMjIwOCwxODYzLDE4ODksMTQyMSwzMzMxLDI5MzIsICMgMzg1NgozMDY5LDIxODIsMzUyMSwgNTk1LDIxMjMsNTQ5Niw0MTAwLDU0OTcsNTQ5OCw0MzQ5LDE3MDcsMjY0NiwgMjIzLDM3NjIsMTM1OSwgNzUxLCAjIDM4NzIKMzEyMSwgMTgzLDM1MjIsNTQ5OSwyODEwLDMwMjEsIDQxOSwyMzc0LCA2MzMsIDcwNCwzODk3LDIzOTQsIDI0MSw1NTAwLDU1MDEsNTUwMiwgIyAzODg4CiA4MzgsMzAyMiwzNzYzLDIyNzcsMjc3MywyNDU5LDM4OTgsMTkzOSwyMDUxLDQxMDEsMTMwOSwzMTIyLDIyNDYsMTE4MSw1NTAzLDExMzYsICMgMzkwNAoyMjA5LDM4OTksMjM3NSwxNDQ2LDQzNTAsMjMxMCw0NzEyLDU1MDQsNTUwNSw0MzUxLDEwNTUsMjYxNSwgNDg0LDM3NjQsNTUwNiw0MTAyLCAjIDM5MjAKIDYyNSw0MzUyLDIyNzgsMzQwNSwxNDk5LDQzNTMsNDEwMyw1NTA3LDQxMDQsNDM1NCwzMjUzLDIyNzksMjI4MCwzNTIzLDU1MDgsNTUwOSwgIyAzOTM2CjI3NzQsIDgwOCwyNjE2LDM3NjUsMzQwNiw0MTA1LDQzNTUsMzEyMywyNTM5LCA1MjYsMzQwNywzOTAwLDQzNTYsIDk1NSw1NTEwLDE2MjAsICMgMzk1Mgo0MzU3LDI2NDcsMjQzMiw1NTExLDE0MjksMzc2NiwxNjY5LDE4MzIsIDk5NCwgOTI4LDU1MTIsMzYzMywxMjYwLDU1MTMsNTUxNCw1NTE1LCAjIDM5NjgKMTk0OSwyMjkzLCA3NDEsMjkzMywxNjI2LDQzNTgsMjczOCwyNDYwLCA4NjcsMTE4NCwgMzYyLDM0MDgsMTM5Miw1NTE2LDU1MTcsNDEwNiwgIyAzOTg0CjQzNTksMTc3MCwxNzM2LDMyNTQsMjkzNCw0NzEzLDQ3MTQsMTkyOSwyNzA3LDE0NTksMTE1OCw1NTE4LDMwNzAsMzQwOSwyODkxLDEyOTIsICMgNDAwMAoxOTMwLDI1MTMsMjg1NSwzNzY3LDE5ODYsMTE4NywyMDcyLDIwMTUsMjYxNyw0MzYwLDU1MTksMjU3NCwyNTE0LDIxNzAsMzc2OCwyNDkwLCAjIDQwMTYKMzMzMiw1NTIwLDM3NjksNDcxNSw1NTIxLDU1MjIsIDY2NiwxMDAzLDMwMjMsMTAyMiwzNjM0LDQzNjEsNTUyMyw0NzE2LDE4MTQsMjI1NywgIyA0MDMyCiA1NzQsMzkwMSwxNjAzLCAyOTUsMTUzNSwgNzA1LDM5MDIsNDM2MiwgMjgzLCA4NTgsIDQxNyw1NTI0LDU1MjUsMzI1NSw0NzE3LDQ3MTgsICMgNDA0OAozMDcxLDEyMjAsMTg5MCwxMDQ2LDIyODEsMjQ2MSw0MTA3LDEzOTMsMTU5OSwgNjg5LDI1NzUsIDM4OCw0MzYzLDU1MjYsMjQ5MSwgODAyLCAjIDQwNjQKNTUyNywyODExLDM5MDMsMjA2MSwxNDA1LDIyNTgsNTUyOCw0NzE5LDM5MDQsMjExMCwxMDUyLDEzNDUsMzI1NiwxNTg1LDU1MjksIDgwOSwgIyA0MDgwCjU1MzAsNTUzMSw1NTMyLCA1NzUsMjczOSwzNTI0LCA5NTYsMTU1MiwxNDY5LDExNDQsMjMyOCw1NTMzLDIzMjksMTU2MCwyNDYyLDM2MzUsICMgNDA5NgozMjU3LDQxMDgsIDYxNiwyMjEwLDQzNjQsMzE4MCwyMTgzLDIyOTQsNTUzNCwxODMzLDU1MzUsMzUyNSw0NzIwLDU1MzYsMTMxOSwzNzcwLCAjIDQxMTIKMzc3MSwxMjExLDM2MzYsMTAyMywzMjU4LDEyOTMsMjgxMiw1NTM3LDU1MzgsNTUzOSwzOTA1LCA2MDcsMjMxMSwzOTA2LCA3NjIsMjg5MiwgIyA0MTI4CjE0MzksNDM2NSwxMzYwLDQ3MjEsMTQ4NSwzMDcyLDU1NDAsNDcyMiwxMDM4LDQzNjYsMTQ1MCwyMDYyLDI2NDgsNDM2NywxMzc5LDQ3MjMsICMgNDE0NAoyNTkzLDU1NDEsNTU0Miw0MzY4LDEzNTIsMTQxNCwyMzMwLDI5MzUsMTE3Miw1NTQzLDU1NDQsMzkwNywzOTA4LDQ3MjQsMTc5OCwxNDUxLCAjIDQxNjAKNTU0NSw1NTQ2LDU1NDcsNTU0OCwyOTM2LDQxMDksNDExMCwyNDkyLDIzNTEsIDQxMSw0MTExLDQxMTIsMzYzNywzMzMzLDMxMjQsNDcyNSwgIyA0MTc2CjE1NjEsMjY3NCwxNDUyLDQxMTMsMTM3NSw1NTQ5LDU1NTAsICA0NywyOTc0LCAzMTYsNTU1MSwxNDA2LDE1OTEsMjkzNywzMTgxLDU1NTIsICMgNDE5MgoxMDI1LDIxNDIsMzEyNSwzMTgyLCAzNTQsMjc0MCwgODg0LDIyMjgsNDM2OSwyNDEyLCA1MDgsMzc3MiwgNzI2LDM2MzgsIDk5NiwyNDMzLCAjIDQyMDgKMzYzOSwgNzI5LDU1NTMsIDM5MiwyMTk0LDE0NTMsNDExNCw0NzI2LDM3NzMsNTU1NCw1NTU1LDI0NjMsMzY0MCwyNjE4LDE2NzUsMjgxMywgIyA0MjI0CiA5MTksMjM1MiwyOTc1LDIzNTMsMTI3MCw0NzI3LDQxMTUsICA3Myw1NTU2LDU1NTcsIDY0Nyw1NTU4LDMyNTksMjg1NiwyMjU5LDE1NTAsICMgNDI0MAoxMzQ2LDMwMjQsNTU1OSwxMzMyLCA4ODMsMzUyNiw1NTYwLDU1NjEsNTU2Miw1NTYzLDMzMzQsMjc3NSw1NTY0LDEyMTIsIDgzMSwxMzQ3LCAjIDQyNTYKNDM3MCw0NzI4LDIzMzEsMzkwOSwxODY0LDMwNzMsIDcyMCwzOTEwLDQ3MjksNDczMCwzOTExLDU1NjUsNDM3MSw1NTY2LDU1NjcsNDczMSwgIyA0MjcyCjU1NjgsNTU2OSwxNzk5LDQ3MzIsMzc3NCwyNjE5LDQ3MzMsMzY0MSwxNjQ1LDIzNzYsNDczNCw1NTcwLDI5MzgsIDY2OSwyMjExLDI2NzUsICMgNDI4OAoyNDM0LDU1NzEsMjg5Myw1NTcyLDU1NzMsMTAyOCwzMjYwLDU1NzQsNDM3MiwyNDEzLDU1NzUsMjI2MCwxMzUzLDU1NzYsNTU3Nyw0NzM1LCAjIDQzMDQKMzE4MywgNTE4LDU1NzgsNDExNiw1NTc5LDQzNzMsMTk2MSw1NTgwLDIxNDMsNDM3NCw1NTgxLDU1ODIsMzAyNSwyMzU0LDIzNTUsMzkxMiwgIyA0MzIwCiA1MTYsMTgzNCwxNDU0LDQxMTcsMjcwOCw0Mzc1LDQ3MzYsMjIyOSwyNjIwLDE5NzIsMTEyOSwzNjQyLDU1ODMsMjc3Niw1NTg0LDI5NzYsICMgNDMzNgoxNDIyLCA1NzcsMTQ3MCwzMDI2LDE1MjQsMzQxMCw1NTg1LDU1ODYsIDQzMiw0Mzc2LDMwNzQsMzUyNyw1NTg3LDI1OTQsMTQ1NSwyNTE1LCAjIDQzNTIKMjIzMCwxOTczLDExNzUsNTU4OCwxMDIwLDI3NDEsNDExOCwzNTI4LDQ3MzcsNTU4OSwyNzQyLDU1OTAsMTc0MywxMzYxLDMwNzUsMzUyOSwgIyA0MzY4CjI2NDksNDExOSw0Mzc3LDQ3MzgsMjI5NSwgODk1LCA5MjQsNDM3OCwyMTcxLCAzMzEsMjI0NywzMDc2LCAxNjYsMTYyNywzMDc3LDEwOTgsICMgNDM4NAo1NTkxLDEyMzIsMjg5NCwyMjMxLDM0MTEsNDczOSwgNjU3LCA0MDMsMTE5NiwyMzc3LCA1NDIsMzc3NSwzNDEyLDE2MDAsNDM3OSwzNTMwLCAjIDQ0MDAKNTU5Miw0NzQwLDI3NzcsMzI2MSwgNTc2LCA1MzAsMTM2Miw0NzQxLDQ3NDIsMjU0MCwyNjc2LDM3NzYsNDEyMCw1NTkzLCA4NDIsMzkxMywgIyA0NDE2CjU1OTQsMjgxNCwyMDMyLDEwMTQsNDEyMSwgMjEzLDI3MDksMzQxMywgNjY1LCA2MjEsNDM4MCw1NTk1LDM3NzcsMjkzOSwyNDM1LDU1OTYsICMgNDQzMgoyNDM2LDMzMzUsMzY0MywzNDE0LDQ3NDMsNDM4MSwyNTQxLDQzODIsNDc0NCwzNjQ0LDE2ODIsNDM4MywzNTMxLDEzODAsNTU5NywgNzI0LCAjIDQ0NDgKMjI4MiwgNjAwLDE2NzAsNTU5OCwxMzM3LDEyMzMsNDc0NSwzMTI2LDIyNDgsNTU5OSwxNjIxLDQ3NDYsNTYwMCwgNjUxLDQzODQsNTYwMSwgIyA0NDY0CjE2MTIsNDM4NSwyNjIxLDU2MDIsMjg1Nyw1NjAzLDI3NDMsMjMxMiwzMDc4LDU2MDQsIDcxNiwyNDY0LDMwNzksIDE3NCwxMjU1LDI3MTAsICMgNDQ4MAo0MTIyLDM2NDUsIDU0OCwxMzIwLDEzOTgsIDcyOCw0MTIzLDE1NzQsNTYwNSwxODkxLDExOTcsMzA4MCw0MTI0LDU2MDYsMzA4MSwzMDgyLCAjIDQ0OTYKMzc3OCwzNjQ2LDM3NzksIDc0Nyw1NjA3LCA2MzUsNDM4Niw0NzQ3LDU2MDgsNTYwOSw1NjEwLDQzODcsNTYxMSw1NjEyLDQ3NDgsNTYxMywgIyA0NTEyCjM0MTUsNDc0OSwyNDM3LCA0NTEsNTYxNCwzNzgwLDI1NDIsMjA3Myw0Mzg4LDI3NDQsNDM4OSw0MTI1LDU2MTUsMTc2NCw0NzUwLDU2MTYsICMgNDUyOAo0MzkwLCAzNTAsNDc1MSwyMjgzLDIzOTUsMjQ5Myw1NjE3LDQzOTEsNDEyNiwyMjQ5LDE0MzQsNDEyNywgNDg4LDQ3NTIsIDQ1OCw0MzkyLCAjIDQ1NDQKNDEyOCwzNzgxLCA3NzEsMTMzMCwyMzk2LDM5MTQsMjU3NiwzMTg0LDIxNjAsMjQxNCwxNTUzLDI2NzcsMzE4NSw0MzkzLDU2MTgsMjQ5NCwgIyA0NTYwCjI4OTUsMjYyMiwxNzIwLDI3MTEsNDM5NCwzNDE2LDQ3NTMsNTYxOSwyNTQzLDQzOTUsNTYyMCwzMjYyLDQzOTYsMjc3OCw1NjIxLDIwMTYsICMgNDU3NgoyNzQ1LDU2MjIsMTE1NSwxMDE3LDM3ODIsMzkxNSw1NjIzLDMzMzYsMjMxMywgMjAxLDE4NjUsNDM5NywxNDMwLDU2MjQsNDEyOSw1NjI1LCAjIDQ1OTIKNTYyNiw1NjI3LDU2MjgsNTYyOSw0Mzk4LDE2MDQsNTYzMCwgNDE0LDE4NjYsIDM3MSwyNTk1LDQ3NTQsNDc1NSwzNTMyLDIwMTcsMzEyNywgIyA0NjA4CjQ3NTYsMTcwOCwgOTYwLDQzOTksIDg4NywgMzg5LDIxNzIsMTUzNiwxNjYzLDE3MjEsNTYzMSwyMjMyLDQxMzAsMjM1NiwyOTQwLDE1ODAsICMgNDYyNAo1NjMyLDU2MzMsMTc0NCw0NzU3LDI1NDQsNDc1OCw0NzU5LDU2MzQsNDc2MCw1NjM1LDIwNzQsNTYzNiw0NzYxLDM2NDcsMzQxNywyODk2LCAjIDQ2NDAKNDQwMCw1NjM3LDQ0MDEsMjY1MCwzNDE4LDI4MTUsIDY3MywyNzEyLDI0NjUsIDcwOSwzNTMzLDQxMzEsMzY0OCw0NDAyLDU2MzgsMTE0OCwgIyA0NjU2CiA1MDIsIDYzNCw1NjM5LDU2NDAsMTIwNCw0NzYyLDM2NDksMTU3NSw0NzYzLDI2MjMsMzc4Myw1NjQxLDM3ODQsMzEyOCwgOTQ4LDMyNjMsICMgNDY3MgogMTIxLDE3NDUsMzkxNiwxMTEwLDU2NDIsNDQwMywzMDgzLDI1MTYsMzAyNyw0MTMyLDM3ODUsMTE1MSwxNzcxLDM5MTcsMTQ4OCw0MTMzLCAjIDQ2ODgKMTk4Nyw1NjQzLDI0MzgsMzUzNCw1NjQ0LDU2NDUsMjA5NCw1NjQ2LDQ0MDQsMzkxOCwxMjEzLDE0MDcsMjgxNiwgNTMxLDI3NDYsMjU0NSwgIyA0NzA0CjMyNjQsMTAxMSwxNTM3LDQ3NjQsMjc3OSw0NDA1LDMxMjksMTA2MSw1NjQ3LDM3ODYsMzc4NywxODY3LDI4OTcsNTY0OCwyMDE4LCAxMjAsICMgNDcyMAo0NDA2LDQ0MDcsMjA2MywzNjUwLDMyNjUsMjMxNCwzOTE5LDI2NzgsMzQxOSwxOTU1LDQ3NjUsNDEzNCw1NjQ5LDM1MzUsMTA0NywyNzEzLCAjIDQ3MzYKMTI2Niw1NjUwLDEzNjgsNDc2NiwyODU4LCA2NDksMzQyMCwzOTIwLDI1NDYsMjc0NywxMTAyLDI4NTksMjY3OSw1NjUxLDU2NTIsMjAwMCwgIyA0NzUyCjU2NTMsMTExMSwzNjUxLDI5NzcsNTY1NCwyNDk1LDM5MjEsMzY1MiwyODE3LDE4NTUsMzQyMSwzNzg4LDU2NTUsNTY1NiwzNDIyLDI0MTUsICMgNDc2OAoyODk4LDMzMzcsMzI2NiwzNjUzLDU2NTcsMjU3Nyw1NjU4LDM2NTQsMjgxOCw0MTM1LDE0NjAsIDg1Niw1NjU5LDM2NTUsNTY2MCwyODk5LCAjIDQ3ODQKMjk3OCw1NjYxLDI5MDAsMzkyMiw1NjYyLDQ0MDgsIDYzMiwyNTE3LCA4NzUsMzkyMywxNjk3LDM5MjQsMjI5Niw1NjYzLDU2NjQsNDc2NywgIyA0ODAwCjMwMjgsMTIzOSwgNTgwLDQ3NjgsNDQwOSw1NjY1LCA5MTQsIDkzNiwyMDc1LDExOTAsNDEzNiwxMDM5LDIxMjQsNTY2Niw1NjY3LDU2NjgsICMgNDgxNgo1NjY5LDM0MjMsMTQ3Myw1NjcwLDEzNTQsNDQxMCwzOTI1LDQ3NjksMjE3MywzMDg0LDQxMzcsIDkxNSwzMzM4LDQ0MTEsNDQxMiwzMzM5LCAjIDQ4MzIKMTYwNSwxODM1LDU2NzEsMjc0OCwgMzk4LDM2NTYsNDQxMywzOTI2LDQxMzgsIDMyOCwxOTEzLDI4NjAsNDEzOSwzOTI3LDEzMzEsNDQxNCwgIyA0ODQ4CjMwMjksIDkzNyw0NDE1LDU2NzIsMzY1Nyw0MTQwLDQxNDEsMzQyNCwyMTYxLDQ3NzAsMzQyNSwgNTI0LCA3NDIsIDUzOCwzMDg1LDEwMTIsICMgNDg2NAo1NjczLDU2NzQsMzkyOCwyNDY2LDU2NzUsIDY1OCwxMTAzLCAyMjUsMzkyOSw1Njc2LDU2NzcsNDc3MSw1Njc4LDQ3NzIsNTY3OSwzMjY3LCAjIDQ4ODAKMTI0Myw1NjgwLDQxNDIsIDk2MywyMjUwLDQ3NzMsNTY4MSwyNzE0LDM2NTgsMzE4Niw1NjgyLDU2ODMsMjU5NiwyMzMyLDU2ODQsNDc3NCwgIyA0ODk2CjU2ODUsNTY4Niw1Njg3LDM1MzYsIDk1NywzNDI2LDI1NDcsMjAzMywxOTMxLDI5NDEsMjQ2NywgODcwLDIwMTksMzY1OSwxNzQ2LDI3ODAsICMgNDkxMgoyNzgxLDI0MzksMjQ2OCw1Njg4LDM5MzAsNTY4OSwzNzg5LDMxMzAsMzc5MCwzNTM3LDM0MjcsMzc5MSw1NjkwLDExNzksMzA4Niw1NjkxLCAjIDQ5MjgKMzE4NywyMzc4LDQ0MTYsMzc5MiwyNTQ4LDMxODgsMzEzMSwyNzQ5LDQxNDMsNTY5MiwzNDI4LDE1NTYsMjU0OSwyMjk3LCA5NzcsMjkwMSwgIyA0OTQ0CjIwMzQsNDE0NCwxMjA1LDM0MjksNTY5MywxNzY1LDM0MzAsMzE4OSwyMTI1LDEyNzEsIDcxNCwxNjg5LDQ3NzUsMzUzOCw1Njk0LDIzMzMsICMgNDk2MAozOTMxLCA1MzMsNDQxNywzNjYwLDIxODQsIDYxNyw1Njk1LDI0NjksMzM0MCwzNTM5LDIzMTUsNTY5Niw1Njk3LDMxOTAsNTY5OCw1Njk5LCAjIDQ5NzYKMzkzMiwxOTg4LCA2MTgsIDQyNywyNjUxLDM1NDAsMzQzMSw1NzAwLDU3MDEsMTI0NCwxNjkwLDU3MDIsMjgxOSw0NDE4LDQ3NzYsNTcwMywgIyA0OTkyCjM1NDEsNDc3Nyw1NzA0LDIyODQsMTU3NiwgNDczLDM2NjEsNDQxOSwzNDMyLCA5NzIsNTcwNSwzNjYyLDU3MDYsMzA4Nyw1NzA3LDU3MDgsICMgNTAwOAo0Nzc4LDQ3NzksNTcwOSwzNzkzLDQxNDUsNDE0Niw1NzEwLCAxNTMsNDc4MCwgMzU2LDU3MTEsMTg5MiwyOTAyLDQ0MjAsMjE0NCwgNDA4LCAjIDUwMjQKIDgwMywyMzU3LDU3MTIsMzkzMyw1NzEzLDQ0MjEsMTY0NiwyNTc4LDI1MTgsNDc4MSw0NzgyLDM5MzQsNTcxNCwzOTM1LDQ0MjIsNTcxNSwgIyA1MDQwCjI0MTYsMzQzMywgNzUyLDU3MTYsNTcxNywxOTYyLDMzNDEsMjk3OSw1NzE4LCA3NDYsMzAzMCwyNDcwLDQ3ODMsNDQyMywzNzk0LCA2OTgsICMgNTA1Ngo0Nzg0LDE4OTMsNDQyNCwzNjYzLDI1NTAsNDc4NSwzNjY0LDM5MzYsNTcxOSwzMTkxLDM0MzQsNTcyMCwxODI0LDEzMDIsNDE0NywyNzE1LCAjIDUwNzIKMzkzNywxOTc0LDQ0MjUsNTcyMSw0NDI2LDMxOTIsIDgyMywxMzAzLDEyODgsMTIzNiwyODYxLDM1NDIsNDE0OCwzNDM1LCA3NzQsMzkzOCwgIyA1MDg4CjU3MjIsMTU4MSw0Nzg2LDEzMDQsMjg2MiwzOTM5LDQ3ODcsNTcyMywyNDQwLDIxNjIsMTA4MywzMjY4LDQ0MjcsNDE0OSw0NDI4LCAzNDQsICMgNTEwNAoxMTczLCAyODgsMjMxNiwgNDU0LDE2ODMsNTcyNCw1NzI1LDE0NjEsNDc4OCw0MTUwLDI1OTcsNTcyNiw1NzI3LDQ3ODksIDk4NSwgODk0LCAjIDUxMjAKNTcyOCwzNDM2LDMxOTMsNTcyOSwxOTE0LDI5NDIsMzc5NSwxOTg5LDU3MzAsMjExMSwxOTc1LDU3MzEsNDE1MSw1NzMyLDI1NzksMTE5NCwgIyA1MTM2CiA0MjUsNTczMyw0NzkwLDMxOTQsMTI0NSwzNzk2LDQ0MjksNTczNCw1NzM1LDI4NjMsNTczNiwgNjM2LDQ3OTEsMTg1NiwzOTQwLCA3NjAsICMgNTE1MgoxODAwLDU3MzcsNDQzMCwyMjEyLDE1MDgsNDc5Miw0MTUyLDE4OTQsMTY4NCwyMjk4LDU3MzgsNTczOSw0NzkzLDQ0MzEsNDQzMiwyMjEzLCAjIDUxNjgKIDQ3OSw1NzQwLDU3NDEsIDgzMiw1NzQyLDQxNTMsMjQ5Niw1NzQzLDI5ODAsMjQ5NywzNzk3LCA5OTAsMzEzMiwgNjI3LDE4MTUsMjY1MiwgIyA1MTg0CjQ0MzMsMTU4Miw0NDM0LDIxMjYsMjExMiwzNTQzLDQ3OTQsNTc0NCwgNzk5LDQ0MzUsMzE5NSw1NzQ1LDQ3OTUsMjExMywxNzM3LDMwMzEsICMgNTIwMAoxMDE4LCA1NDMsIDc1NCw0NDM2LDMzNDIsMTY3Niw0Nzk2LDQ3OTcsNDE1NCw0Nzk4LDE0ODksNTc0NiwzNTQ0LDU3NDcsMjYyNCwyOTAzLCAjIDUyMTYKNDE1NSw1NzQ4LDU3NDksMjk4MSw1NzUwLDU3NTEsNTc1Miw1NzUzLDMxOTYsNDc5OSw0ODAwLDIxODUsMTcyMiw1NzU0LDMyNjksMzI3MCwgIyA1MjMyCjE4NDMsMzY2NSwxNzE1LCA0ODEsIDM2NSwxOTc2LDE4NTcsNTc1NSw1NzU2LDE5NjMsMjQ5OCw0ODAxLDU3NTcsMjEyNywzNjY2LDMyNzEsICMgNTI0OAogNDMzLDE4OTUsMjA2NCwyMDc2LDU3NTgsIDYwMiwyNzUwLDU3NTksNTc2MCw1NzYxLDU3NjIsNTc2MywzMDMyLDE2MjgsMzQzNyw1NzY0LCAjIDUyNjQKMzE5Nyw0ODAyLDQxNTYsMjkwNCw0ODAzLDI1MTksNTc2NSwyNTUxLDI3ODIsNTc2Niw1NzY3LDU3NjgsMzM0Myw0ODA0LDI5MDUsNTc2OSwgIyA1MjgwCjQ4MDUsNTc3MCwyODY0LDQ4MDYsNDgwNywxMjIxLDI5ODIsNDE1NywyNTIwLDU3NzEsNTc3Miw1NzczLDE4NjgsMTk5MCw1Nzc0LDU3NzUsICMgNTI5Ngo1Nzc2LDE4OTYsNTc3Nyw1Nzc4LDQ4MDgsMTg5Nyw0MTU4LCAzMTgsNTc3OSwyMDk1LDQxNTksNDQzNyw1NzgwLDU3ODEsIDQ4NSw1NzgyLCAjIDUzMTIKIDkzOCwzOTQxLCA1NTMsMjY4MCwgMTE2LDU3ODMsMzk0MiwzNjY3LDU3ODQsMzU0NSwyNjgxLDI3ODMsMzQzOCwzMzQ0LDI4MjAsNTc4NSwgIyA1MzI4CjM2NjgsMjk0Myw0MTYwLDE3NDcsMjk0NCwyOTgzLDU3ODYsNTc4NywgMjA3LDU3ODgsNDgwOSw1Nzg5LDQ4MTAsMjUyMSw1NzkwLDMwMzMsICMgNTM0NAogODkwLDM2NjksMzk0Myw1NzkxLDE4NzgsMzc5OCwzNDM5LDU3OTIsMjE4NiwyMzU4LDM0NDAsMTY1Miw1NzkzLDU3OTQsNTc5NSwgOTQxLCAjIDUzNjAKMjI5OSwgMjA4LDM1NDYsNDE2MSwyMDIwLCAzMzAsNDQzOCwzOTQ0LDI5MDYsMjQ5OSwzNzk5LDQ0MzksNDgxMSw1Nzk2LDU3OTcsNTc5OCwgIyA1Mzc2CikKClBLAwQUAAAAAAAAACEAy+dnZt0GAADdBgAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgQmlnNURpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgQklHNV9TTV9NT0RFTAoKCmNsYXNzIEJpZzVQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoQmlnNVByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEJJRzVfU01fTU9ERUwpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBCaWc1RGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkJpZzUiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJDaGluZXNlIgpQSwMEFAAAAAAAAAAhAOBZKD3DJAAAwyQAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcmRpc3RyaWJ1dGlvbi5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuZXVjdHdmcmVxIGltcG9ydCAoRVVDVFdfQ0hBUl9UT19GUkVRX09SREVSLCBFVUNUV19UQUJMRV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICBFVUNUV19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTykKZnJvbSAuZXVja3JmcmVxIGltcG9ydCAoRVVDS1JfQ0hBUl9UT19GUkVRX09SREVSLCBFVUNLUl9UQUJMRV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICBFVUNLUl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTykKZnJvbSAuZ2IyMzEyZnJlcSBpbXBvcnQgKEdCMjMxMl9DSEFSX1RPX0ZSRVFfT1JERVIsIEdCMjMxMl9UQUJMRV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgR0IyMzEyX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQpmcm9tIC5iaWc1ZnJlcSBpbXBvcnQgKEJJRzVfQ0hBUl9UT19GUkVRX09SREVSLCBCSUc1X1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgQklHNV9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTykKZnJvbSAuamlzZnJlcSBpbXBvcnQgKEpJU19DSEFSX1RPX0ZSRVFfT1JERVIsIEpJU19UQUJMRV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgSklTX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQoKCmNsYXNzIENoYXJEaXN0cmlidXRpb25BbmFseXNpcyhvYmplY3QpOgogICAgRU5PVUdIX0RBVEFfVEhSRVNIT0xEID0gMTAyNAogICAgU1VSRV9ZRVMgPSAwLjk5CiAgICBTVVJFX05PID0gMC4wMQogICAgTUlOSU1VTV9EQVRBX1RIUkVTSE9MRCA9IDMKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIyBNYXBwaW5nIHRhYmxlIHRvIGdldCBmcmVxdWVuY3kgb3JkZXIgZnJvbSBjaGFyIG9yZGVyIChnZXQgZnJvbQogICAgICAgICMgR2V0T3JkZXIoKSkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBOb25lCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IE5vbmUgICMgU2l6ZSBvZiBhYm92ZSB0YWJsZQogICAgICAgICMgVGhpcyBpcyBhIGNvbnN0YW50IHZhbHVlIHdoaWNoIHZhcmllcyBmcm9tIGxhbmd1YWdlIHRvIGxhbmd1YWdlLAogICAgICAgICMgdXNlZCBpbiBjYWxjdWxhdGluZyBjb25maWRlbmNlLiAgU2VlCiAgICAgICAgIyBodHRwOi8vd3d3Lm1vemlsbGEub3JnL3Byb2plY3RzL2ludGwvVW5pdmVyc2FsQ2hhcnNldERldGVjdGlvbi5odG1sCiAgICAgICAgIyBmb3IgZnVydGhlciBkZXRhaWwuCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IE5vbmUKICAgICAgICBzZWxmLl9kb25lID0gTm9uZQogICAgICAgIHNlbGYuX3RvdGFsX2NoYXJzID0gTm9uZQogICAgICAgIHNlbGYuX2ZyZXFfY2hhcnMgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgICIiInJlc2V0IGFuYWx5c2VyLCBjbGVhciBhbnkgc3RhdGUiIiIKICAgICAgICAjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gVHJ1ZSwgZGV0ZWN0aW9uIGlzIGRvbmUgYW5kIGNvbmNsdXNpb24gaGFzCiAgICAgICAgIyBiZWVuIG1hZGUKICAgICAgICBzZWxmLl9kb25lID0gRmFsc2UKICAgICAgICBzZWxmLl90b3RhbF9jaGFycyA9IDAgICMgVG90YWwgY2hhcmFjdGVycyBlbmNvdW50ZXJlZAogICAgICAgICMgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdob3NlIGZyZXF1ZW5jeSBvcmRlciBpcyBsZXNzIHRoYW4gNTEyCiAgICAgICAgc2VsZi5fZnJlcV9jaGFycyA9IDAKCiAgICBkZWYgZmVlZChzZWxmLCBjaGFyLCBjaGFyX2xlbik6CiAgICAgICAgIiIiZmVlZCBhIGNoYXJhY3RlciB3aXRoIGtub3duIGxlbmd0aCIiIgogICAgICAgIGlmIGNoYXJfbGVuID09IDI6CiAgICAgICAgICAgICMgd2Ugb25seSBjYXJlIGFib3V0IDItYnl0ZXMgY2hhcmFjdGVyIGluIG91ciBkaXN0cmlidXRpb24gYW5hbHlzaXMKICAgICAgICAgICAgb3JkZXIgPSBzZWxmLmdldF9vcmRlcihjaGFyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG9yZGVyID0gLTEKICAgICAgICBpZiBvcmRlciA+PSAwOgogICAgICAgICAgICBzZWxmLl90b3RhbF9jaGFycyArPSAxCiAgICAgICAgICAgICMgb3JkZXIgaXMgdmFsaWQKICAgICAgICAgICAgaWYgb3JkZXIgPCBzZWxmLl90YWJsZV9zaXplOgogICAgICAgICAgICAgICAgaWYgNTEyID4gc2VsZi5fY2hhcl90b19mcmVxX29yZGVyW29yZGVyXToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9mcmVxX2NoYXJzICs9IDEKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgIiIicmV0dXJuIGNvbmZpZGVuY2UgYmFzZWQgb24gZXhpc3RpbmcgZGF0YSIiIgogICAgICAgICMgaWYgd2UgZGlkbid0IHJlY2VpdmUgYW55IGNoYXJhY3RlciBpbiBvdXIgY29uc2lkZXJhdGlvbiByYW5nZSwKICAgICAgICAjIHJldHVybiBuZWdhdGl2ZSBhbnN3ZXIKICAgICAgICBpZiBzZWxmLl90b3RhbF9jaGFycyA8PSAwIG9yIHNlbGYuX2ZyZXFfY2hhcnMgPD0gc2VsZi5NSU5JTVVNX0RBVEFfVEhSRVNIT0xEOgogICAgICAgICAgICByZXR1cm4gc2VsZi5TVVJFX05PCgogICAgICAgIGlmIHNlbGYuX3RvdGFsX2NoYXJzICE9IHNlbGYuX2ZyZXFfY2hhcnM6CiAgICAgICAgICAgIHIgPSAoc2VsZi5fZnJlcV9jaGFycyAvICgoc2VsZi5fdG90YWxfY2hhcnMgLSBzZWxmLl9mcmVxX2NoYXJzKQogICAgICAgICAgICAgICAgICogc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbykpCiAgICAgICAgICAgIGlmIHIgPCBzZWxmLlNVUkVfWUVTOgogICAgICAgICAgICAgICAgcmV0dXJuIHIKCiAgICAgICAgIyBub3JtYWxpemUgY29uZmlkZW5jZSAod2UgZG9uJ3Qgd2FudCB0byBiZSAxMDAlIHN1cmUpCiAgICAgICAgcmV0dXJuIHNlbGYuU1VSRV9ZRVMKCiAgICBkZWYgZ290X2Vub3VnaF9kYXRhKHNlbGYpOgogICAgICAgICMgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byByZWNlaXZlIGFsbCBkYXRhIHRvIGRyYXcgY29uY2x1c2lvbi4KICAgICAgICAjIEZvciBjaGFyc2V0IGRldGVjdGlvbiwgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBpcyBlbm91Z2gKICAgICAgICByZXR1cm4gc2VsZi5fdG90YWxfY2hhcnMgPiBzZWxmLkVOT1VHSF9EQVRBX1RIUkVTSE9MRAoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgV2UgZG8gbm90IGhhbmRsZSBjaGFyYWN0ZXJzIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBlbmNvZGluZyBzdHJpbmcsCiAgICAgICAgIyBidXQgY29udmVydCB0aGlzIGVuY29kaW5nIHN0cmluZyB0byBhIG51bWJlciwgaGVyZSBjYWxsZWQgb3JkZXIuCiAgICAgICAgIyBUaGlzIGFsbG93cyBtdWx0aXBsZSBlbmNvZGluZ3Mgb2YgYSBsYW5ndWFnZSB0byBzaGFyZSBvbmUgZnJlcXVlbmN5CiAgICAgICAgIyB0YWJsZS4KICAgICAgICByZXR1cm4gLTEKCgpjbGFzcyBFVUNUV0Rpc3RyaWJ1dGlvbkFuYWx5c2lzKENoYXJEaXN0cmlidXRpb25BbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoRVVDVFdEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEVVQ1RXX0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBFVUNUV19UQUJMRV9TSVpFCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IEVVQ1RXX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3IgZXVjLVRXIGVuY29kaW5nLCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgICAgICMgICBmaXJzdCAgYnl0ZSByYW5nZTogMHhjNCAtLSAweGZlCiAgICAgICAgIyAgIHNlY29uZCBieXRlIHJhbmdlOiAweGExIC0tIDB4ZmUKICAgICAgICAjIG5vIHZhbGlkYXRpb24gbmVlZGVkIGhlcmUuIFN0YXRlIG1hY2hpbmUgaGFzIGRvbmUgdGhhdAogICAgICAgIGZpcnN0X2NoYXIgPSBieXRlX3N0clswXQogICAgICAgIGlmIGZpcnN0X2NoYXIgPj0gMHhDNDoKICAgICAgICAgICAgcmV0dXJuIDk0ICogKGZpcnN0X2NoYXIgLSAweEM0KSArIGJ5dGVfc3RyWzFdIC0gMHhBMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAtMQoKCmNsYXNzIEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gRVVDS1JfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEVVQ0tSX1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gRVVDS1JfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBldWMtS1IgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgIGZpcnN0ICBieXRlIHJhbmdlOiAweGIwIC0tIDB4ZmUKICAgICAgICAjICAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4YTEgLS0gMHhmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgZmlyc3RfY2hhciA9IGJ5dGVfc3RyWzBdCiAgICAgICAgaWYgZmlyc3RfY2hhciA+PSAweEIwOgogICAgICAgICAgICByZXR1cm4gOTQgKiAoZmlyc3RfY2hhciAtIDB4QjApICsgYnl0ZV9zdHJbMV0gLSAweEExCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xCgoKY2xhc3MgR0IyMzEyRGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihHQjIzMTJEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEdCMjMxMl9DSEFSX1RPX0ZSRVFfT1JERVIKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gR0IyMzEyX1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gR0IyMzEyX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3IgR0IyMzEyIGVuY29kaW5nLCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgICAgICMgIGZpcnN0ICBieXRlIHJhbmdlOiAweGIwIC0tIDB4ZmUKICAgICAgICAjICBzZWNvbmQgYnl0ZSByYW5nZTogMHhhMSAtLSAweGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBmaXJzdF9jaGFyLCBzZWNvbmRfY2hhciA9IGJ5dGVfc3RyWzBdLCBieXRlX3N0clsxXQogICAgICAgIGlmIChmaXJzdF9jaGFyID49IDB4QjApIGFuZCAoc2Vjb25kX2NoYXIgPj0gMHhBMSk6CiAgICAgICAgICAgIHJldHVybiA5NCAqIChmaXJzdF9jaGFyIC0gMHhCMCkgKyBzZWNvbmRfY2hhciAtIDB4QTEKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKCgpjbGFzcyBCaWc1RGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihCaWc1RGlzdHJpYnV0aW9uQW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBCSUc1X0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBCSUc1X1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gQklHNV9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgZm9yIGJpZzUgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgIGZpcnN0ICBieXRlIHJhbmdlOiAweGE0IC0tIDB4ZmUKICAgICAgICAjICAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4NDAgLS0gMHg3ZSAsIDB4YTEgLS0gMHhmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgZmlyc3RfY2hhciwgc2Vjb25kX2NoYXIgPSBieXRlX3N0clswXSwgYnl0ZV9zdHJbMV0KICAgICAgICBpZiBmaXJzdF9jaGFyID49IDB4QTQ6CiAgICAgICAgICAgIGlmIHNlY29uZF9jaGFyID49IDB4QTE6CiAgICAgICAgICAgICAgICByZXR1cm4gMTU3ICogKGZpcnN0X2NoYXIgLSAweEE0KSArIHNlY29uZF9jaGFyIC0gMHhBMSArIDYzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gMTU3ICogKGZpcnN0X2NoYXIgLSAweEE0KSArIHNlY29uZF9jaGFyIC0gMHg0MAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAtMQoKCmNsYXNzIFNKSVNEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKFNKSVNEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEpJU19DSEFSX1RPX0ZSRVFfT1JERVIKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gSklTX1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gSklTX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3Igc2ppcyBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4ODEgLS0gMHg5ZiAsIDB4ZTAgLS0gMHhmZQogICAgICAgICMgICBzZWNvbmQgYnl0ZSByYW5nZTogMHg0MCAtLSAweDdlLCAgMHg4MSAtLSBveGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBmaXJzdF9jaGFyLCBzZWNvbmRfY2hhciA9IGJ5dGVfc3RyWzBdLCBieXRlX3N0clsxXQogICAgICAgIGlmIChmaXJzdF9jaGFyID49IDB4ODEpIGFuZCAoZmlyc3RfY2hhciA8PSAweDlGKToKICAgICAgICAgICAgb3JkZXIgPSAxODggKiAoZmlyc3RfY2hhciAtIDB4ODEpCiAgICAgICAgZWxpZiAoZmlyc3RfY2hhciA+PSAweEUwKSBhbmQgKGZpcnN0X2NoYXIgPD0gMHhFRik6CiAgICAgICAgICAgIG9yZGVyID0gMTg4ICogKGZpcnN0X2NoYXIgLSAweEUwICsgMzEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xCiAgICAgICAgb3JkZXIgPSBvcmRlciArIHNlY29uZF9jaGFyIC0gMHg0MAogICAgICAgIGlmIHNlY29uZF9jaGFyID4gMHg3RjoKICAgICAgICAgICAgb3JkZXIgPSAtMQogICAgICAgIHJldHVybiBvcmRlcgoKCmNsYXNzIEVVQ0pQRGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNKUERpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gSklTX0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBKSVNfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBKSVNfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBldWMtSlAgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgIGZpcnN0ICBieXRlIHJhbmdlOiAweGEwIC0tIDB4ZmUKICAgICAgICAjICAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4YTEgLS0gMHhmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgY2hhciA9IGJ5dGVfc3RyWzBdCiAgICAgICAgaWYgY2hhciA+PSAweEEwOgogICAgICAgICAgICByZXR1cm4gOTQgKiAoY2hhciAtIDB4QTEpICsgYnl0ZV9zdHJbMV0gLSAweGExCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xClBLAwQUAAAAAAAAACEAiVkkiMsOAADLDgAARgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0Z3JvdXBwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2JlcgoKCmNsYXNzIENoYXJTZXRHcm91cFByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYW5nX2ZpbHRlcj1Ob25lKToKICAgICAgICBzdXBlcihDaGFyU2V0R3JvdXBQcm9iZXIsIHNlbGYpLl9faW5pdF9fKGxhbmdfZmlsdGVyPWxhbmdfZmlsdGVyKQogICAgICAgIHNlbGYuX2FjdGl2ZV9udW0gPSAwCiAgICAgICAgc2VsZi5wcm9iZXJzID0gW10KICAgICAgICBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlciA9IE5vbmUKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc3VwZXIoQ2hhclNldEdyb3VwUHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgc2VsZi5fYWN0aXZlX251bSA9IDAKICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYucHJvYmVyczoKICAgICAgICAgICAgaWYgcHJvYmVyOgogICAgICAgICAgICAgICAgcHJvYmVyLnJlc2V0KCkKICAgICAgICAgICAgICAgIHByb2Jlci5hY3RpdmUgPSBUcnVlCiAgICAgICAgICAgICAgICBzZWxmLl9hY3RpdmVfbnVtICs9IDEKICAgICAgICBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlciA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICBzZWxmLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIuY2hhcnNldF9uYW1lCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICBzZWxmLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIubGFuZ3VhZ2UKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIHByb2JlciBpbiBzZWxmLnByb2JlcnM6CiAgICAgICAgICAgIGlmIG5vdCBwcm9iZXI6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBub3QgcHJvYmVyLmFjdGl2ZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHN0YXRlID0gcHJvYmVyLmZlZWQoYnl0ZV9zdHIpCiAgICAgICAgICAgIGlmIG5vdCBzdGF0ZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHN0YXRlID09IFByb2JpbmdTdGF0ZS5GT1VORF9JVDoKICAgICAgICAgICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gcHJvYmVyCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQogICAgICAgICAgICBlbGlmIHN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUU6CiAgICAgICAgICAgICAgICBwcm9iZXIuYWN0aXZlID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuX2FjdGl2ZV9udW0gLT0gMQogICAgICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlX251bSA8PSAwOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgc3RhdGUgPSBzZWxmLnN0YXRlCiAgICAgICAgaWYgc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUOgogICAgICAgICAgICByZXR1cm4gMC45OQogICAgICAgIGVsaWYgc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRToKICAgICAgICAgICAgcmV0dXJuIDAuMDEKICAgICAgICBiZXN0X2NvbmYgPSAwLjAKICAgICAgICBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlciA9IE5vbmUKICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYucHJvYmVyczoKICAgICAgICAgICAgaWYgbm90IHByb2JlcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCBwcm9iZXIuYWN0aXZlOgogICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzIG5vdCBhY3RpdmUnLCBwcm9iZXIuY2hhcnNldF9uYW1lKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY29uZiA9IHByb2Jlci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBjb25maWRlbmNlID0gJXMnLCBwcm9iZXIuY2hhcnNldF9uYW1lLCBwcm9iZXIubGFuZ3VhZ2UsIGNvbmYpCiAgICAgICAgICAgIGlmIGJlc3RfY29uZiA8IGNvbmY6CiAgICAgICAgICAgICAgICBiZXN0X2NvbmYgPSBjb25mCiAgICAgICAgICAgICAgICBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlciA9IHByb2JlcgogICAgICAgIGlmIG5vdCBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlcjoKICAgICAgICAgICAgcmV0dXJuIDAuMAogICAgICAgIHJldHVybiBiZXN0X2NvbmYKUEsDBBQAAAAAAAAAIQDgl2Fa9hMAAPYTAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJzZXRwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUKCgpjbGFzcyBDaGFyU2V0UHJvYmVyKG9iamVjdCk6CgogICAgU0hPUlRDVVRfVEhSRVNIT0xEID0gMC45NQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYW5nX2ZpbHRlcj1Ob25lKToKICAgICAgICBzZWxmLl9zdGF0ZSA9IE5vbmUKICAgICAgICBzZWxmLmxhbmdfZmlsdGVyID0gbGFuZ19maWx0ZXIKICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkcKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZmVlZChzZWxmLCBidWYpOgogICAgICAgIHBhc3MKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzdGF0ZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIDAuMAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBmaWx0ZXJfaGlnaF9ieXRlX29ubHkoYnVmKToKICAgICAgICBidWYgPSByZS5zdWIoYicoW1x4MDAtXHg3Rl0pKycsIGInICcsIGJ1ZikKICAgICAgICByZXR1cm4gYnVmCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGZpbHRlcl9pbnRlcm5hdGlvbmFsX3dvcmRzKGJ1Zik6CiAgICAgICAgIiIiCiAgICAgICAgV2UgZGVmaW5lIHRocmVlIHR5cGVzIG9mIGJ5dGVzOgogICAgICAgIGFscGhhYmV0OiBlbmdsaXNoIGFscGhhYmV0cyBbYS16QS1aXQogICAgICAgIGludGVybmF0aW9uYWw6IGludGVybmF0aW9uYWwgY2hhcmFjdGVycyBbXHg4MC1ceEZGXQogICAgICAgIG1hcmtlcjogZXZlcnl0aGluZyBlbHNlIFteYS16QS1aXHg4MC1ceEZGXQoKICAgICAgICBUaGUgaW5wdXQgYnVmZmVyIGNhbiBiZSB0aG91Z2h0IHRvIGNvbnRhaW4gYSBzZXJpZXMgb2Ygd29yZHMgZGVsaW1pdGVkCiAgICAgICAgYnkgbWFya2Vycy4gVGhpcyBmdW5jdGlvbiB3b3JrcyB0byBmaWx0ZXIgYWxsIHdvcmRzIHRoYXQgY29udGFpbiBhdAogICAgICAgIGxlYXN0IG9uZSBpbnRlcm5hdGlvbmFsIGNoYXJhY3Rlci4gQWxsIGNvbnRpZ3VvdXMgc2VxdWVuY2VzIG9mIG1hcmtlcnMKICAgICAgICBhcmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgc3BhY2UgYXNjaWkgY2hhcmFjdGVyLgoKICAgICAgICBUaGlzIGZpbHRlciBhcHBsaWVzIHRvIGFsbCBzY3JpcHRzIHdoaWNoIGRvIG5vdCB1c2UgRW5nbGlzaCBjaGFyYWN0ZXJzLgogICAgICAgICIiIgogICAgICAgIGZpbHRlcmVkID0gYnl0ZWFycmF5KCkKCiAgICAgICAgIyBUaGlzIHJlZ2V4IGV4cHJlc3Npb24gZmlsdGVycyBvdXQgb25seSB3b3JkcyB0aGF0IGhhdmUgYXQtbGVhc3Qgb25lCiAgICAgICAgIyBpbnRlcm5hdGlvbmFsIGNoYXJhY3Rlci4gVGhlIHdvcmQgbWF5IGluY2x1ZGUgb25lIG1hcmtlciBjaGFyYWN0ZXIgYXQKICAgICAgICAjIHRoZSBlbmQuCiAgICAgICAgd29yZHMgPSByZS5maW5kYWxsKGInW2EtekEtWl0qW1x4ODAtXHhGRl0rW2EtekEtWl0qW15hLXpBLVpceDgwLVx4RkZdPycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZikKCiAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CiAgICAgICAgICAgIGZpbHRlcmVkLmV4dGVuZCh3b3JkWzotMV0pCgogICAgICAgICAgICAjIElmIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgd29yZCBpcyBhIG1hcmtlciwgcmVwbGFjZSBpdCB3aXRoIGEKICAgICAgICAgICAgIyBzcGFjZSBhcyBtYXJrZXJzIHNob3VsZG4ndCBhZmZlY3Qgb3VyIGFuYWx5c2lzICh0aGV5IGFyZSB1c2VkCiAgICAgICAgICAgICMgc2ltaWxhcmx5IGFjcm9zcyBhbGwgbGFuZ3VhZ2VzIGFuZCBtYXkgdGh1cyBoYXZlIHNpbWlsYXIKICAgICAgICAgICAgIyBmcmVxdWVuY2llcykuCiAgICAgICAgICAgIGxhc3RfY2hhciA9IHdvcmRbLTE6XQogICAgICAgICAgICBpZiBub3QgbGFzdF9jaGFyLmlzYWxwaGEoKSBhbmQgbGFzdF9jaGFyIDwgYidceDgwJzoKICAgICAgICAgICAgICAgIGxhc3RfY2hhciA9IGInICcKICAgICAgICAgICAgZmlsdGVyZWQuZXh0ZW5kKGxhc3RfY2hhcikKCiAgICAgICAgcmV0dXJuIGZpbHRlcmVkCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGZpbHRlcl93aXRoX2VuZ2xpc2hfbGV0dGVycyhidWYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBjb3B5IG9mIGBgYnVmYGAgdGhhdCByZXRhaW5zIG9ubHkgdGhlIHNlcXVlbmNlcyBvZiBFbmdsaXNoCiAgICAgICAgYWxwaGFiZXQgYW5kIGhpZ2ggYnl0ZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBiZXR3ZWVuIDw+IGNoYXJhY3RlcnMuCiAgICAgICAgQWxzbyByZXRhaW5zIEVuZ2xpc2ggYWxwaGFiZXQgYW5kIGhpZ2ggYnl0ZSBjaGFyYWN0ZXJzIGltbWVkaWF0ZWx5CiAgICAgICAgYmVmb3JlIG9jY3VycmVuY2VzIG9mID4uCgogICAgICAgIFRoaXMgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIHRvIGFsbCBzY3JpcHRzIHdoaWNoIGNvbnRhaW4gYm90aCBFbmdsaXNoCiAgICAgICAgY2hhcmFjdGVycyBhbmQgZXh0ZW5kZWQgQVNDSUkgY2hhcmFjdGVycywgYnV0IGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkKICAgICAgICBgYExhdGluMVByb2JlcmBgLgogICAgICAgICIiIgogICAgICAgIGZpbHRlcmVkID0gYnl0ZWFycmF5KCkKICAgICAgICBpbl90YWcgPSBGYWxzZQogICAgICAgIHByZXYgPSAwCgogICAgICAgIGZvciBjdXJyIGluIHJhbmdlKGxlbihidWYpKToKICAgICAgICAgICAgIyBTbGljZSBoZXJlIHRvIGdldCBieXRlcyBpbnN0ZWFkIG9mIGFuIGludCB3aXRoIFB5dGhvbiAzCiAgICAgICAgICAgIGJ1Zl9jaGFyID0gYnVmW2N1cnI6Y3VyciArIDFdCiAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UncmUgY29taW5nIG91dCBvZiBvciBlbnRlcmluZyBhbiBIVE1MIHRhZwogICAgICAgICAgICBpZiBidWZfY2hhciA9PSBiJz4nOgogICAgICAgICAgICAgICAgaW5fdGFnID0gRmFsc2UKICAgICAgICAgICAgZWxpZiBidWZfY2hhciA9PSBiJzwnOgogICAgICAgICAgICAgICAgaW5fdGFnID0gVHJ1ZQoKICAgICAgICAgICAgIyBJZiBjdXJyZW50IGNoYXJhY3RlciBpcyBub3QgZXh0ZW5kZWQtQVNDSUkgYW5kIG5vdCBhbHBoYWJldGljLi4uCiAgICAgICAgICAgIGlmIGJ1Zl9jaGFyIDwgYidceDgwJyBhbmQgbm90IGJ1Zl9jaGFyLmlzYWxwaGEoKToKICAgICAgICAgICAgICAgICMgLi4uYW5kIHdlJ3JlIG5vdCBpbiBhIHRhZwogICAgICAgICAgICAgICAgaWYgY3VyciA+IHByZXYgYW5kIG5vdCBpbl90YWc6CiAgICAgICAgICAgICAgICAgICAgIyBLZWVwIGV2ZXJ5dGhpbmcgYWZ0ZXIgbGFzdCBub24tZXh0ZW5kZWQtQVNDSUksCiAgICAgICAgICAgICAgICAgICAgIyBub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5leHRlbmQoYnVmW3ByZXY6Y3Vycl0pCiAgICAgICAgICAgICAgICAgICAgIyBPdXRwdXQgYSBzcGFjZSB0byBkZWxpbWl0IHN0cmV0Y2ggd2Uga2VwdAogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmV4dGVuZChiJyAnKQogICAgICAgICAgICAgICAgcHJldiA9IGN1cnIgKyAxCgogICAgICAgICMgSWYgd2UncmUgbm90IGluIGEgdGFnLi4uCiAgICAgICAgaWYgbm90IGluX3RhZzoKICAgICAgICAgICAgIyBLZWVwIGV2ZXJ5dGhpbmcgYWZ0ZXIgbGFzdCBub24tZXh0ZW5kZWQtQVNDSUksIG5vbi1hbHBoYWJldGljCiAgICAgICAgICAgICMgY2hhcmFjdGVyCiAgICAgICAgICAgIGZpbHRlcmVkLmV4dGVuZChidWZbcHJldjpdKQoKICAgICAgICByZXR1cm4gZmlsdGVyZWQKUEsDBBQAAAAAAAAAIQCTBtcyAQAAAAEAAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NsaS9fX2luaXRfXy5weQpQSwMEFAAAAAAAAAAhAF/drbmyCgAAsgoAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL2NoYXJkZXRlY3QucHkjIS91c3IvYmluL2VudiBweXRob24KIiIiClNjcmlwdCB3aGljaCB0YWtlcyBvbmUgb3IgbW9yZSBmaWxlIHBhdGhzIGFuZCByZXBvcnRzIG9uIHRoZWlyIGRldGVjdGVkCmVuY29kaW5ncwoKRXhhbXBsZTo6CgogICAgJSBjaGFyZGV0ZWN0IHNvbWVmaWxlIHNvbWVvdGhlcmZpbGUKICAgIHNvbWVmaWxlOiB3aW5kb3dzLTEyNTIgd2l0aCBjb25maWRlbmNlIDAuNQogICAgc29tZW90aGVyZmlsZTogYXNjaWkgd2l0aCBjb25maWRlbmNlIDEuMAoKSWYgbm8gcGF0aHMgYXJlIHByb3ZpZGVkLCBpdCB0YWtlcyBpdHMgaW5wdXQgZnJvbSBzdGRpbi4KCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIHByaW50X2Z1bmN0aW9uLCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IHN5cwoKZnJvbSBjaGFyZGV0IGltcG9ydCBfX3ZlcnNpb25fXwpmcm9tIGNoYXJkZXQuY29tcGF0IGltcG9ydCBQWTIKZnJvbSBjaGFyZGV0LnVuaXZlcnNhbGRldGVjdG9yIGltcG9ydCBVbml2ZXJzYWxEZXRlY3RvcgoKCmRlZiBkZXNjcmlwdGlvbl9vZihsaW5lcywgbmFtZT0nc3RkaW4nKToKICAgICIiIgogICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByb2JhYmxlIGVuY29kaW5nIG9mIGEgZmlsZSBvcgogICAgbGlzdCBvZiBzdHJpbmdzLgoKICAgIDpwYXJhbSBsaW5lczogVGhlIGxpbmVzIHRvIGdldCB0aGUgZW5jb2Rpbmcgb2YuCiAgICA6dHlwZSBsaW5lczogSXRlcmFibGUgb2YgYnl0ZXMKICAgIDpwYXJhbSBuYW1lOiBOYW1lIG9mIGZpbGUgb3IgY29sbGVjdGlvbiBvZiBsaW5lcwogICAgOnR5cGUgbmFtZTogc3RyCiAgICAiIiIKICAgIHUgPSBVbml2ZXJzYWxEZXRlY3RvcigpCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICBsaW5lID0gYnl0ZWFycmF5KGxpbmUpCiAgICAgICAgdS5mZWVkKGxpbmUpCiAgICAgICAgIyBzaG9ydGN1dCBvdXQgb2YgdGhlIGxvb3AgdG8gc2F2ZSByZWFkaW5nIGZ1cnRoZXIgLSBwYXJ0aWN1bGFybHkgdXNlZnVsIGlmIHdlIHJlYWQgYSBCT00uCiAgICAgICAgaWYgdS5kb25lOgogICAgICAgICAgICBicmVhawogICAgdS5jbG9zZSgpCiAgICByZXN1bHQgPSB1LnJlc3VsdAogICAgaWYgUFkyOgogICAgICAgIG5hbWUgPSBuYW1lLmRlY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCksICdpZ25vcmUnKQogICAgaWYgcmVzdWx0WydlbmNvZGluZyddOgogICAgICAgIHJldHVybiAnezB9OiB7MX0gd2l0aCBjb25maWRlbmNlIHsyfScuZm9ybWF0KG5hbWUsIHJlc3VsdFsnZW5jb2RpbmcnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2NvbmZpZGVuY2UnXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICd7MH06IG5vIHJlc3VsdCcuZm9ybWF0KG5hbWUpCgoKZGVmIG1haW4oYXJndj1Ob25lKToKICAgICIiIgogICAgSGFuZGxlcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBnZXRzIHRoaW5ncyBzdGFydGVkLgoKICAgIDpwYXJhbSBhcmd2OiBMaXN0IG9mIGFyZ3VtZW50cywgYXMgaWYgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUuCiAgICAgICAgICAgICAgICAgSWYgTm9uZSwgYGBzeXMuYXJndlsxOl1gYCBpcyB1c2VkIGluc3RlYWQuCiAgICA6dHlwZSBhcmd2OiBsaXN0IG9mIHN0cgogICAgIiIiCiAgICAjIEdldCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKICAgICAgICBkZXNjcmlwdGlvbj0iVGFrZXMgb25lIG9yIG1vcmUgZmlsZSBwYXRocyBhbmQgcmVwb3J0cyB0aGVpciBkZXRlY3RlZCBcCiAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5ncyIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdpbnB1dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0ZpbGUgd2hvc2UgZW5jb2Rpbmcgd2Ugd291bGQgbGlrZSB0byBkZXRlcm1pbmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IHN0ZGluKScsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3JiJyksIG5hcmdzPScqJywKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bc3lzLnN0ZGluIGlmIFBZMiBlbHNlIHN5cy5zdGRpbi5idWZmZXJdKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJzaW9uJywgYWN0aW9uPSd2ZXJzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0nJShwcm9nKXMgezB9Jy5mb3JtYXQoX192ZXJzaW9uX18pKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCgogICAgZm9yIGYgaW4gYXJncy5pbnB1dDoKICAgICAgICBpZiBmLmlzYXR0eSgpOgogICAgICAgICAgICBwcmludCgiWW91IGFyZSBydW5uaW5nIGNoYXJkZXRlY3QgaW50ZXJhY3RpdmVseS4gUHJlc3MgIiArCiAgICAgICAgICAgICAgICAgICJDVFJMLUQgdHdpY2UgYXQgdGhlIHN0YXJ0IG9mIGEgYmxhbmsgbGluZSB0byBzaWduYWwgdGhlICIgKwogICAgICAgICAgICAgICAgICAiZW5kIG9mIHlvdXIgaW5wdXQuIElmIHlvdSB3YW50IGhlbHAsIHJ1biBjaGFyZGV0ZWN0ICIgKwogICAgICAgICAgICAgICAgICAiLS1oZWxwXG4iLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgcHJpbnQoZGVzY3JpcHRpb25fb2YoZiwgZi5uYW1lKSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAXPs3SAYOAAAGDgAARgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jb2RpbmdzdGF0ZW1hY2hpbmUucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaW1wb3J0IGxvZ2dpbmcKCmZyb20gLmVudW1zIGltcG9ydCBNYWNoaW5lU3RhdGUKCgpjbGFzcyBDb2RpbmdTdGF0ZU1hY2hpbmUob2JqZWN0KToKICAgICIiIgogICAgQSBzdGF0ZSBtYWNoaW5lIHRvIHZlcmlmeSBhIGJ5dGUgc2VxdWVuY2UgZm9yIGEgcGFydGljdWxhciBlbmNvZGluZy4gRm9yCiAgICBlYWNoIGJ5dGUgdGhlIGRldGVjdG9yIHJlY2VpdmVzLCBpdCB3aWxsIGZlZWQgdGhhdCBieXRlIHRvIGV2ZXJ5IGFjdGl2ZQogICAgc3RhdGUgbWFjaGluZSBhdmFpbGFibGUsIG9uZSBieXRlIGF0IGEgdGltZS4gVGhlIHN0YXRlIG1hY2hpbmUgY2hhbmdlcyBpdHMKICAgIHN0YXRlIGJhc2VkIG9uIGl0cyBwcmV2aW91cyBzdGF0ZSBhbmQgdGhlIGJ5dGUgaXQgcmVjZWl2ZXMuIFRoZXJlIGFyZSAzCiAgICBzdGF0ZXMgaW4gYSBzdGF0ZSBtYWNoaW5lIHRoYXQgYXJlIG9mIGludGVyZXN0IHRvIGFuIGF1dG8tZGV0ZWN0b3I6CgogICAgU1RBUlQgc3RhdGU6IFRoaXMgaXMgdGhlIHN0YXRlIHRvIHN0YXJ0IHdpdGgsIG9yIGEgbGVnYWwgYnl0ZSBzZXF1ZW5jZQogICAgICAgICAgICAgICAgIChpLmUuIGEgdmFsaWQgY29kZSBwb2ludCkgZm9yIGNoYXJhY3RlciBoYXMgYmVlbiBpZGVudGlmaWVkLgoKICAgIE1FIHN0YXRlOiAgVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhdGUgbWFjaGluZSBpZGVudGlmaWVkIGEgYnl0ZSBzZXF1ZW5jZQogICAgICAgICAgICAgICB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBjaGFyc2V0IGl0IGlzIGRlc2lnbmVkIGZvciBhbmQgdGhhdAogICAgICAgICAgICAgICB0aGVyZSBpcyBubyBvdGhlciBwb3NzaWJsZSBlbmNvZGluZyB3aGljaCBjYW4gY29udGFpbiB0aGlzIGJ5dGUKICAgICAgICAgICAgICAgc2VxdWVuY2UuIFRoaXMgd2lsbCB0byBsZWFkIHRvIGFuIGltbWVkaWF0ZSBwb3NpdGl2ZSBhbnN3ZXIgZm9yCiAgICAgICAgICAgICAgIHRoZSBkZXRlY3Rvci4KCiAgICBFUlJPUiBzdGF0ZTogVGhpcyBpbmRpY2F0ZXMgdGhlIHN0YXRlIG1hY2hpbmUgaWRlbnRpZmllZCBhbiBpbGxlZ2FsIGJ5dGUKICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBmb3IgdGhhdCBlbmNvZGluZy4gVGhpcyB3aWxsIGxlYWQgdG8gYW4gaW1tZWRpYXRlCiAgICAgICAgICAgICAgICAgbmVnYXRpdmUgYW5zd2VyIGZvciB0aGlzIGVuY29kaW5nLiBEZXRlY3RvciB3aWxsIGV4Y2x1ZGUgdGhpcwogICAgICAgICAgICAgICAgIGVuY29kaW5nIGZyb20gY29uc2lkZXJhdGlvbiBmcm9tIGhlcmUgb24uCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzbSk6CiAgICAgICAgc2VsZi5fbW9kZWwgPSBzbQogICAgICAgIHNlbGYuX2N1cnJfYnl0ZV9wb3MgPSAwCiAgICAgICAgc2VsZi5fY3Vycl9jaGFyX2xlbiA9IDAKICAgICAgICBzZWxmLl9jdXJyX3N0YXRlID0gTm9uZQogICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX2N1cnJfc3RhdGUgPSBNYWNoaW5lU3RhdGUuU1RBUlQKCiAgICBkZWYgbmV4dF9zdGF0ZShzZWxmLCBjKToKICAgICAgICAjIGZvciBlYWNoIGJ5dGUgd2UgZ2V0IGl0cyBjbGFzcwogICAgICAgICMgaWYgaXQgaXMgZmlyc3QgYnl0ZSwgd2UgYWxzbyBnZXQgYnl0ZSBsZW5ndGgKICAgICAgICBieXRlX2NsYXNzID0gc2VsZi5fbW9kZWxbJ2NsYXNzX3RhYmxlJ11bY10KICAgICAgICBpZiBzZWxmLl9jdXJyX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5TVEFSVDoKICAgICAgICAgICAgc2VsZi5fY3Vycl9ieXRlX3BvcyA9IDAKICAgICAgICAgICAgc2VsZi5fY3Vycl9jaGFyX2xlbiA9IHNlbGYuX21vZGVsWydjaGFyX2xlbl90YWJsZSddW2J5dGVfY2xhc3NdCiAgICAgICAgIyBmcm9tIGJ5dGUncyBjbGFzcyBhbmQgc3RhdGVfdGFibGUsIHdlIGdldCBpdHMgbmV4dCBzdGF0ZQogICAgICAgIGN1cnJfc3RhdGUgPSAoc2VsZi5fY3Vycl9zdGF0ZSAqIHNlbGYuX21vZGVsWydjbGFzc19mYWN0b3InXQogICAgICAgICAgICAgICAgICAgICAgKyBieXRlX2NsYXNzKQogICAgICAgIHNlbGYuX2N1cnJfc3RhdGUgPSBzZWxmLl9tb2RlbFsnc3RhdGVfdGFibGUnXVtjdXJyX3N0YXRlXQogICAgICAgIHNlbGYuX2N1cnJfYnl0ZV9wb3MgKz0gMQogICAgICAgIHJldHVybiBzZWxmLl9jdXJyX3N0YXRlCgogICAgZGVmIGdldF9jdXJyZW50X2NoYXJsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2N1cnJfY2hhcl9sZW4KCiAgICBkZWYgZ2V0X2NvZGluZ19zdGF0ZV9tYWNoaW5lKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9tb2RlbFsnbmFtZSddCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX21vZGVsWydsYW5ndWFnZSddClBLAwQUAAAAAAAAACEAfIblZW4EAABuBAAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jb21wYXQucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb250cmlidXRvcihzKToKIyAgIERhbiBCbGFuY2hhcmQKIyAgIElhbiBDb3JkYXNjbwojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppbXBvcnQgc3lzCgoKaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKToKICAgIFBZMiA9IFRydWUKICAgIFBZMyA9IEZhbHNlCiAgICBiYXNlX3N0ciA9IChzdHIsIHVuaWNvZGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCmVsc2U6CiAgICBQWTIgPSBGYWxzZQogICAgUFkzID0gVHJ1ZQogICAgYmFzZV9zdHIgPSAoYnl0ZXMsIHN0cikKICAgIHRleHRfdHlwZSA9IHN0cgpQSwMEFAAAAAAAAAAhAL1CmjE/BwAAPwcAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY3A5NDlwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAubWJjc3NtIGltcG9ydCBDUDk0OV9TTV9NT0RFTAoKCmNsYXNzIENQOTQ5UHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKENQOTQ5UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoQ1A5NDlfU01fTU9ERUwpCiAgICAgICAgIyBOT1RFOiBDUDk0OSBpcyBhIHN1cGVyc2V0IG9mIEVVQy1LUiwgc28gdGhlIGRpc3RyaWJ1dGlvbiBzaG91bGQgYmUKICAgICAgICAjICAgICAgIG5vdCBkaWZmZXJlbnQuCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJDUDk0OSIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIktvcmVhbiIKUEsDBBQAAAAAAAAAIQBEBKzJfQYAAH0GAAA5AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VudW1zLnB5IiIiCkFsbCBvZiB0aGUgRW51bXMgdGhhdCBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBjaGFyZGV0IHBhY2thZ2UuCgo6YXV0aG9yOiBEYW4gQmxhbmNoYXJkIChkYW4uYmxhbmNoYXJkQGdtYWlsLmNvbSkKIiIiCgoKY2xhc3MgSW5wdXRTdGF0ZShvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHN0YXRlcyBhIHVuaXZlcnNhbCBkZXRlY3RvciBjYW4gYmUgaW4uCiAgICAiIiIKICAgIFBVUkVfQVNDSUkgPSAwCiAgICBFU0NfQVNDSUkgPSAxCiAgICBISUdIX0JZVEUgPSAyCgoKY2xhc3MgTGFuZ3VhZ2VGaWx0ZXIob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBsYW5ndWFnZSBmaWx0ZXJzIHdlIGNhbiBhcHBseSB0byBhCiAgICBgYFVuaXZlcnNhbERldGVjdG9yYGAuCiAgICAiIiIKICAgIENISU5FU0VfU0lNUExJRklFRCA9IDB4MDEKICAgIENISU5FU0VfVFJBRElUSU9OQUwgPSAweDAyCiAgICBKQVBBTkVTRSA9IDB4MDQKICAgIEtPUkVBTiA9IDB4MDgKICAgIE5PTl9DSksgPSAweDEwCiAgICBBTEwgPSAweDFGCiAgICBDSElORVNFID0gQ0hJTkVTRV9TSU1QTElGSUVEIHwgQ0hJTkVTRV9UUkFESVRJT05BTAogICAgQ0pLID0gQ0hJTkVTRSB8IEpBUEFORVNFIHwgS09SRUFOCgoKY2xhc3MgUHJvYmluZ1N0YXRlKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgc3RhdGVzIGEgcHJvYmVyIGNhbiBiZSBpbi4KICAgICIiIgogICAgREVURUNUSU5HID0gMAogICAgRk9VTkRfSVQgPSAxCiAgICBOT1RfTUUgPSAyCgoKY2xhc3MgTWFjaGluZVN0YXRlKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgc3RhdGVzIGEgc3RhdGUgbWFjaGluZSBjYW4gYmUgaW4uCiAgICAiIiIKICAgIFNUQVJUID0gMAogICAgRVJST1IgPSAxCiAgICBJVFNfTUUgPSAyCgoKY2xhc3MgU2VxdWVuY2VMaWtlbGlob29kKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBsaWtlbGlob29kIG9mIGEgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgcHJldmlvdXMgb25lLgogICAgIiIiCiAgICBORUdBVElWRSA9IDAKICAgIFVOTElLRUxZID0gMQogICAgTElLRUxZID0gMgogICAgUE9TSVRJVkUgPSAzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X251bV9jYXRlZ29yaWVzKGNscyk6CiAgICAgICAgIiIiOnJldHVybnM6IFRoZSBudW1iZXIgb2YgbGlrZWxpaG9vZCBjYXRlZ29yaWVzIGluIHRoZSBlbnVtLiIiIgogICAgICAgIHJldHVybiA0CgoKY2xhc3MgQ2hhcmFjdGVyQ2F0ZWdvcnkob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBjYXRlZ29yaWVzIGxhbmd1YWdlIG1vZGVscyBmb3IKICAgIGBgU2luZ2xlQnl0ZUNoYXJzZXRQcm9iZXJgYCBwdXQgY2hhcmFjdGVycyBpbnRvLgoKICAgIEFueXRoaW5nIGxlc3MgdGhhbiBDT05UUk9MIGlzIGNvbnNpZGVyZWQgYSBsZXR0ZXIuCiAgICAiIiIKICAgIFVOREVGSU5FRCA9IDI1NQogICAgTElORV9CUkVBSyA9IDI1NAogICAgU1lNQk9MID0gMjUzCiAgICBESUdJVCA9IDI1MgogICAgQ09OVFJPTCA9IDI1MQpQSwMEFAAAAAAAAAAhAASIBT1uDwAAbg8AAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXNjcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuZW51bXMgaW1wb3J0IExhbmd1YWdlRmlsdGVyLCBQcm9iaW5nU3RhdGUsIE1hY2hpbmVTdGF0ZQpmcm9tIC5lc2NzbSBpbXBvcnQgKEhaX1NNX01PREVMLCBJU08yMDIyQ05fU01fTU9ERUwsIElTTzIwMjJKUF9TTV9NT0RFTCwKICAgICAgICAgICAgICAgICAgICBJU08yMDIyS1JfU01fTU9ERUwpCgoKY2xhc3MgRXNjQ2hhclNldFByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgICIiIgogICAgVGhpcyBDaGFyU2V0UHJvYmVyIHVzZXMgYSAiY29kZSBzY2hlbWUiIGFwcHJvYWNoIGZvciBkZXRlY3RpbmcgZW5jb2RpbmdzLAogICAgd2hlcmVieSBlYXNpbHkgcmVjb2duaXphYmxlIGVzY2FwZSBvciBzaGlmdCBzZXF1ZW5jZXMgYXJlIHJlbGllZCBvbiB0bwogICAgaWRlbnRpZnkgdGhlc2UgZW5jb2RpbmdzLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHN1cGVyKEVzY0NoYXJTZXRQcm9iZXIsIHNlbGYpLl9faW5pdF9fKGxhbmdfZmlsdGVyPWxhbmdfZmlsdGVyKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gW10KICAgICAgICBpZiBzZWxmLmxhbmdfZmlsdGVyICYgTGFuZ3VhZ2VGaWx0ZXIuQ0hJTkVTRV9TSU1QTElGSUVEOgogICAgICAgICAgICBzZWxmLmNvZGluZ19zbS5hcHBlbmQoQ29kaW5nU3RhdGVNYWNoaW5lKEhaX1NNX01PREVMKSkKICAgICAgICAgICAgc2VsZi5jb2Rpbmdfc20uYXBwZW5kKENvZGluZ1N0YXRlTWFjaGluZShJU08yMDIyQ05fU01fTU9ERUwpKQogICAgICAgIGlmIHNlbGYubGFuZ19maWx0ZXIgJiBMYW5ndWFnZUZpbHRlci5KQVBBTkVTRToKICAgICAgICAgICAgc2VsZi5jb2Rpbmdfc20uYXBwZW5kKENvZGluZ1N0YXRlTWFjaGluZShJU08yMDIySlBfU01fTU9ERUwpKQogICAgICAgIGlmIHNlbGYubGFuZ19maWx0ZXIgJiBMYW5ndWFnZUZpbHRlci5LT1JFQU46CiAgICAgICAgICAgIHNlbGYuY29kaW5nX3NtLmFwcGVuZChDb2RpbmdTdGF0ZU1hY2hpbmUoSVNPMjAyMktSX1NNX01PREVMKSkKICAgICAgICBzZWxmLmFjdGl2ZV9zbV9jb3VudCA9IE5vbmUKICAgICAgICBzZWxmLl9kZXRlY3RlZF9jaGFyc2V0ID0gTm9uZQogICAgICAgIHNlbGYuX2RldGVjdGVkX2xhbmd1YWdlID0gTm9uZQogICAgICAgIHNlbGYuX3N0YXRlID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihFc2NDaGFyU2V0UHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgZm9yIGNvZGluZ19zbSBpbiBzZWxmLmNvZGluZ19zbToKICAgICAgICAgICAgaWYgbm90IGNvZGluZ19zbToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNvZGluZ19zbS5hY3RpdmUgPSBUcnVlCiAgICAgICAgICAgIGNvZGluZ19zbS5yZXNldCgpCiAgICAgICAgc2VsZi5hY3RpdmVfc21fY291bnQgPSBsZW4oc2VsZi5jb2Rpbmdfc20pCiAgICAgICAgc2VsZi5fZGV0ZWN0ZWRfY2hhcnNldCA9IE5vbmUKICAgICAgICBzZWxmLl9kZXRlY3RlZF9sYW5ndWFnZSA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RldGVjdGVkX2NoYXJzZXQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZGV0ZWN0ZWRfbGFuZ3VhZ2UKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZGV0ZWN0ZWRfY2hhcnNldDoKICAgICAgICAgICAgcmV0dXJuIDAuOTkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gMC4wMAoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgYyBpbiBieXRlX3N0cjoKICAgICAgICAgICAgZm9yIGNvZGluZ19zbSBpbiBzZWxmLmNvZGluZ19zbToKICAgICAgICAgICAgICAgIGlmIG5vdCBjb2Rpbmdfc20gb3Igbm90IGNvZGluZ19zbS5hY3RpdmU6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGNvZGluZ19zdGF0ZSA9IGNvZGluZ19zbS5uZXh0X3N0YXRlKGMpCiAgICAgICAgICAgICAgICBpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLkVSUk9SOgogICAgICAgICAgICAgICAgICAgIGNvZGluZ19zbS5hY3RpdmUgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX3NtX2NvdW50IC09IDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmFjdGl2ZV9zbV9jb3VudCA8PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKICAgICAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5JVFNfTUU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZXRlY3RlZF9jaGFyc2V0ID0gY29kaW5nX3NtLmdldF9jb2Rpbmdfc3RhdGVfbWFjaGluZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGV0ZWN0ZWRfbGFuZ3VhZ2UgPSBjb2Rpbmdfc20ubGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQpQSwMEFAAAAAAAAAAhAMEKYKIOKQAADikAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXNjc20ucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuZW51bXMgaW1wb3J0IE1hY2hpbmVTdGF0ZQoKSFpfQ0xTID0gKAoxLDAsMCwwLDAsMCwwLDAsICAjIDAwIC0gMDcKMCwwLDAsMCwwLDAsMCwwLCAgIyAwOCAtIDBmCjAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwowLDAsMCwxLDAsMCwwLDAsICAjIDE4IC0gMWYKMCwwLDAsMCwwLDAsMCwwLCAgIyAyMCAtIDI3CjAsMCwwLDAsMCwwLDAsMCwgICMgMjggLSAyZgowLDAsMCwwLDAsMCwwLDAsICAjIDMwIC0gMzcKMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCjAsMCwwLDAsMCwwLDAsMCwgICMgNDAgLSA0NwowLDAsMCwwLDAsMCwwLDAsICAjIDQ4IC0gNGYKMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CjAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgowLDAsMCwwLDAsMCwwLDAsICAjIDYwIC0gNjcKMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCjAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwowLDAsMCw0LDAsNSwyLDAsICAjIDc4IC0gN2YKMSwxLDEsMSwxLDEsMSwxLCAgIyA4MCAtIDg3CjEsMSwxLDEsMSwxLDEsMSwgICMgODggLSA4ZgoxLDEsMSwxLDEsMSwxLDEsICAjIDkwIC0gOTcKMSwxLDEsMSwxLDEsMSwxLCAgIyA5OCAtIDlmCjEsMSwxLDEsMSwxLDEsMSwgICMgYTAgLSBhNwoxLDEsMSwxLDEsMSwxLDEsICAjIGE4IC0gYWYKMSwxLDEsMSwxLDEsMSwxLCAgIyBiMCAtIGI3CjEsMSwxLDEsMSwxLDEsMSwgICMgYjggLSBiZgoxLDEsMSwxLDEsMSwxLDEsICAjIGMwIC0gYzcKMSwxLDEsMSwxLDEsMSwxLCAgIyBjOCAtIGNmCjEsMSwxLDEsMSwxLDEsMSwgICMgZDAgLSBkNwoxLDEsMSwxLDEsMSwxLDEsICAjIGQ4IC0gZGYKMSwxLDEsMSwxLDEsMSwxLCAgIyBlMCAtIGU3CjEsMSwxLDEsMSwxLDEsMSwgICMgZTggLSBlZgoxLDEsMSwxLDEsMSwxLDEsICAjIGYwIC0gZjcKMSwxLDEsMSwxLDEsMSwxLCAgIyBmOCAtIGZmCikKCkhaX1NUID0gKApNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgMyxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMDAtMDcKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAwOC0wZgpNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsIyAxMC0xNwogICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LCAgICAgNSwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTgtMWYKICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsICAgICA0LCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDIwLTI3CiAgICAgNCxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgMjgtMmYKKQoKSFpfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMCwgMCwgMCwgMCwgMCkKCkhaX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEhaX0NMUywKICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDYsCiAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEhaX1NULAogICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBIWl9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgJ25hbWUnOiAiSFotR0ItMjMxMiIsCiAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdDaGluZXNlJ30KCklTTzIwMjJDTl9DTFMgPSAoCjIsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwowLDAsMCwwLDAsMCwwLDAsICAjIDA4IC0gMGYKMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CjAsMCwwLDEsMCwwLDAsMCwgICMgMTggLSAxZgowLDAsMCwwLDAsMCwwLDAsICAjIDIwIC0gMjcKMCwzLDAsMCwwLDAsMCwwLCAgIyAyOCAtIDJmCjAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwowLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKMCwwLDAsNCwwLDAsMCwwLCAgIyA0MCAtIDQ3CjAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgowLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCjAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwowLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CjAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDgwIC0gODcKMiwyLDIsMiwyLDIsMiwyLCAgIyA4OCAtIDhmCjIsMiwyLDIsMiwyLDIsMiwgICMgOTAgLSA5NwoyLDIsMiwyLDIsMiwyLDIsICAjIDk4IC0gOWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CjIsMiwyLDIsMiwyLDIsMiwgICMgYTggLSBhZgoyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCjIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwoyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CjIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgoyLDIsMiwyLDIsMiwyLDIsICAjIGUwIC0gZTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBlOCAtIGVmCjIsMiwyLDIsMiwyLDIsMiwgICMgZjAgLSBmNwoyLDIsMiwyLDIsMiwyLDIsICAjIGY4IC0gZmYKKQoKSVNPMjAyMkNOX1NUID0gKApNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgMDAtMDcKTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDA4LTBmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAxMC0xNwpNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTgtMWYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAyMC0yNwogICAgIDUsICAgICA2LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMjgtMmYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAzMC0zNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCwjIDM4LTNmCikKCklTTzIwMjJDTl9DSEFSX0xFTl9UQUJMRSA9ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKQoKSVNPMjAyMkNOX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IElTTzIwMjJDTl9DTFMsCiAgICAgICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogOSwKICAgICAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IElTTzIwMjJDTl9TVCwKICAgICAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IElTTzIwMjJDTl9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogIklTTy0yMDIyLUNOIiwKICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdDaGluZXNlJ30KCklTTzIwMjJKUF9DTFMgPSAoCjIsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwowLDAsMCwwLDAsMCwyLDIsICAjIDA4IC0gMGYKMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CjAsMCwwLDEsMCwwLDAsMCwgICMgMTggLSAxZgowLDAsMCwwLDcsMCwwLDAsICAjIDIwIC0gMjcKMywwLDAsMCwwLDAsMCwwLCAgIyAyOCAtIDJmCjAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwowLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKNiwwLDQsMCw4LDAsMCwwLCAgIyA0MCAtIDQ3CjAsOSw1LDAsMCwwLDAsMCwgICMgNDggLSA0ZgowLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCjAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwowLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CjAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDgwIC0gODcKMiwyLDIsMiwyLDIsMiwyLCAgIyA4OCAtIDhmCjIsMiwyLDIsMiwyLDIsMiwgICMgOTAgLSA5NwoyLDIsMiwyLDIsMiwyLDIsICAjIDk4IC0gOWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CjIsMiwyLDIsMiwyLDIsMiwgICMgYTggLSBhZgoyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCjIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwoyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CjIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgoyLDIsMiwyLDIsMiwyLDIsICAjIGUwIC0gZTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBlOCAtIGVmCjIsMiwyLDIsMiwyLDIsMiwgICMgZjAgLSBmNwoyLDIsMiwyLDIsMiwyLDIsICAjIGY4IC0gZmYKKQoKSVNPMjAyMkpQX1NUID0gKApNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgMDAtMDcKTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDA4LTBmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMgMTAtMTcKTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDE4LTFmCk1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAyMC0yNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDYsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsIyAyOC0yZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAzMC0zNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDM4LTNmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgNDAtNDcKKQoKSVNPMjAyMkpQX0NIQVJfTEVOX1RBQkxFID0gKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApCgpJU08yMDIySlBfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogSVNPMjAyMkpQX0NMUywKICAgICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IElTTzIwMjJKUF9TVCwKICAgICAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IElTTzIwMjJKUF9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogIklTTy0yMDIyLUpQIiwKICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdKYXBhbmVzZSd9CgpJU08yMDIyS1JfQ0xTID0gKAoyLDAsMCwwLDAsMCwwLDAsICAjIDAwIC0gMDcKMCwwLDAsMCwwLDAsMCwwLCAgIyAwOCAtIDBmCjAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwowLDAsMCwxLDAsMCwwLDAsICAjIDE4IC0gMWYKMCwwLDAsMCwzLDAsMCwwLCAgIyAyMCAtIDI3CjAsNCwwLDAsMCwwLDAsMCwgICMgMjggLSAyZgowLDAsMCwwLDAsMCwwLDAsICAjIDMwIC0gMzcKMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCjAsMCwwLDUsMCwwLDAsMCwgICMgNDAgLSA0NwowLDAsMCwwLDAsMCwwLDAsICAjIDQ4IC0gNGYKMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CjAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgowLDAsMCwwLDAsMCwwLDAsICAjIDYwIC0gNjcKMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCjAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwowLDAsMCwwLDAsMCwwLDAsICAjIDc4IC0gN2YKMiwyLDIsMiwyLDIsMiwyLCAgIyA4MCAtIDg3CjIsMiwyLDIsMiwyLDIsMiwgICMgODggLSA4ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDkwIC0gOTcKMiwyLDIsMiwyLDIsMiwyLCAgIyA5OCAtIDlmCjIsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwoyLDIsMiwyLDIsMiwyLDIsICAjIGE4IC0gYWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBiMCAtIGI3CjIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgoyLDIsMiwyLDIsMiwyLDIsICAjIGMwIC0gYzcKMiwyLDIsMiwyLDIsMiwyLCAgIyBjOCAtIGNmCjIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwoyLDIsMiwyLDIsMiwyLDIsICAjIGQ4IC0gZGYKMiwyLDIsMiwyLDIsMiwyLCAgIyBlMCAtIGU3CjIsMiwyLDIsMiwyLDIsMiwgICMgZTggLSBlZgoyLDIsMiwyLDIsMiwyLDIsICAjIGYwIC0gZjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBmOCAtIGZmCikKCklTTzIwMjJLUl9TVCA9ICgKTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDAwLTA3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMgMDgtMGYKTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTAtMTcKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDE4LTFmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgMjAtMjcKKQoKSVNPMjAyMktSX0NIQVJfTEVOX1RBQkxFID0gKDAsIDAsIDAsIDAsIDAsIDApCgpJU08yMDIyS1JfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogSVNPMjAyMktSX0NMUywKICAgICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogSVNPMjAyMktSX1NULAogICAgICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogSVNPMjAyMktSX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAiSVNPLTIwMjItS1IiLAogICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ0tvcmVhbid9CgoKUEsDBBQAAAAAAAAAIQAgN8TQpQ4AAKUOAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2pwcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUsIE1hY2hpbmVTdGF0ZQpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgRVVDSlBEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5qcGNudHggaW1wb3J0IEVVQ0pQQ29udGV4dEFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgRVVDSlBfU01fTU9ERUwKCgpjbGFzcyBFVUNKUFByb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNKUFByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEVVQ0pQX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gRVVDSlBEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyID0gRVVDSlBDb250ZXh0QW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihFVUNKUFByb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiRVVDLUpQIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiSmFwYW5lc2UiCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihieXRlX3N0cikpOgogICAgICAgICAgICAjIFBZM0s6IGJ5dGVfc3RyIGlzIGEgYnl0ZSBhcnJheSwgc28gYnl0ZV9zdHJbaV0gaXMgYW4gaW50LCBub3QgYSBieXRlCiAgICAgICAgICAgIGNvZGluZ19zdGF0ZSA9IHNlbGYuY29kaW5nX3NtLm5leHRfc3RhdGUoYnl0ZV9zdHJbaV0pCiAgICAgICAgICAgIGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuRVJST1I6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgJXMgcHJvYmVyIGhpdCBlcnJvciBhdCBieXRlICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhcnNldF9uYW1lLCBzZWxmLmxhbmd1YWdlLCBpKQogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuSVRTX01FOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5TVEFSVDoKICAgICAgICAgICAgICAgIGNoYXJfbGVuID0gc2VsZi5jb2Rpbmdfc20uZ2V0X2N1cnJlbnRfY2hhcmxlbigpCiAgICAgICAgICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzFdID0gYnl0ZV9zdHJbMF0KICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXIsIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoc2VsZi5fbGFzdF9jaGFyLCBjaGFyX2xlbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyLmZlZWQoYnl0ZV9zdHJbaSAtIDE6aSArIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5mZWVkKGJ5dGVfc3RyW2kgLSAxOmkgKyAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzBdID0gYnl0ZV9zdHJbLTFdCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgKHNlbGYuY29udGV4dF9hbmFseXplci5nb3RfZW5vdWdoX2RhdGEoKSBhbmQKICAgICAgICAgICAgICAgKHNlbGYuZ2V0X2NvbmZpZGVuY2UoKSA+IHNlbGYuU0hPUlRDVVRfVEhSRVNIT0xEKSk6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBjb250ZXh0X2NvbmYgPSBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgIGRpc3RyaWJfY29uZiA9IHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICByZXR1cm4gbWF4KGNvbnRleHRfY29uZiwgZGlzdHJpYl9jb25mKQpQSwMEFAAAAAAAAAAhAPRBA3nqNAAA6jQAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3JmcmVxLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFNhbXBsaW5nIGZyb20gYWJvdXQgMjBNIHRleHQgbWF0ZXJpYWxzIGluY2x1ZGUgbGl0ZXJhdHVyZSBhbmQgY29tcHV0ZXIgdGVjaG5vbG9neQoKIyAxMjggIC0tPiAwLjc5CiMgMjU2ICAtLT4gMC45MgojIDUxMiAgLS0+IDAuOTg2CiMgMTAyNCAtLT4gMC45OTk0NAojIDIwNDggLS0+IDAuOTk5OTkKIwojIElkZWEgRGlzdHJpYnV0aW9uIFJhdGlvID0gMC45ODY1MyAvICgxLTAuOTg2NTMpID0gNzMuMjQKIyBSYW5kb20gRGlzdHJpYnV0aW9uIFJhdGlvbiA9IDUxMiAvICgyMzUwLTUxMikgPSAwLjI3OS4KIwojIFR5cGljYWwgRGlzdHJpYnV0aW9uIFJhdGlvCgpFVUNLUl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTyA9IDYuMAoKRVVDS1JfVEFCTEVfU0laRSA9IDIzNTIKCiMgQ2hhciB0byBGcmVxT3JkZXIgdGFibGUgLApFVUNLUl9DSEFSX1RPX0ZSRVFfT1JERVIgPSAoCiAgMTMsIDEzMCwgMTIwLDEzOTYsIDQ4MSwxNzE5LDE3MjAsIDMyOCwgNjA5LCAyMTIsMTcyMSwgNzA3LCA0MDAsIDI5OSwxNzIyLCAgODcsCjEzOTcsMTcyMywgMTA0LCA1MzYsMTExNywxMjAzLDE3MjQsMTI2NywgNjg1LDEyNjgsIDUwOCwxNzI1LDE3MjYsMTcyNywxNzI4LDEzOTgsCjEzOTksMTcyOSwxNzMwLDE3MzEsIDE0MSwgNjIxLCAzMjYsMTA1NywgMzY4LDE3MzIsIDI2NywgNDg4LCAgMjAsMTczMywxMjY5LDE3MzQsCiA5NDUsMTQwMCwxNzM1LCAgNDcsIDkwNCwxMjcwLDE3MzYsMTczNywgNzczLCAyNDgsMTczOCwgNDA5LCAzMTMsIDc4NiwgNDI5LDE3MzksCiAxMTYsIDk4NywgODEzLDE0MDEsIDY4MywgIDc1LDEyMDQsIDE0NSwxNzQwLDE3NDEsMTc0MiwxNzQzLCAgMTYsIDg0NywgNjY3LCA2MjIsCiA3MDgsMTc0NCwxNzQ1LDE3NDYsIDk2NiwgNzg3LCAzMDQsIDEyOSwxNzQ3LCAgNjAsIDgyMCwgMTIzLCA2NzYsMTc0OCwxNzQ5LDE3NTAsCjE3NTEsIDYxNywxNzUyLCA2MjYsMTc1MywxNzU0LDE3NTUsMTc1NiwgNjUzLDE3NTcsMTc1OCwxNzU5LDE3NjAsMTc2MSwxNzYyLCA4NTYsCiAzNDQsMTc2MywxNzY0LDE3NjUsMTc2NiwgIDg5LCA0MDEsIDQxOCwgODA2LCA5MDUsIDg0OCwxNzY3LDE3NjgsMTc2OSwgOTQ2LDEyMDUsCiA3MDksMTc3MCwxMTE4LDE3NzEsIDI0MSwxNzcyLDE3NzMsMTc3NCwxMjcxLDE3NzUsIDU2OSwxNzc2LCA5OTksMTc3NywxNzc4LDE3NzksCjE3ODAsIDMzNywgNzUxLDEwNTgsICAyOCwgNjI4LCAyNTQsMTc4MSwgMTc3LCA5MDYsIDI3MCwgMzQ5LCA4OTEsMTA3OSwxNzgyLCAgMTksCjE3ODMsIDM3OSwxNzg0LCAzMTUsMTc4NSwgNjI5LCA3NTQsMTQwMiwgNTU5LDE3ODYsIDYzNiwgMjAzLDEyMDYsMTc4NywgNzEwLCA1NjcsCjE3ODgsIDkzNSwgODE0LDE3ODksMTc5MCwxMjA3LCA3NjYsIDUyOCwxNzkxLDE3OTIsMTIwOCwxNzkzLDE3OTQsMTc5NSwxNzk2LDE3OTcsCjE0MDMsMTc5OCwxNzk5LCA1MzMsMTA1OSwxNDA0LDE0MDUsMTE1NiwxNDA2LCA5MzYsIDg4NCwxMDgwLDE4MDAsIDM1MSwxODAxLDE4MDIsCjE4MDMsMTgwNCwxODA1LCA4MDEsMTgwNiwxODA3LDE4MDgsMTExOSwxODA5LDExNTcsIDcxNCwgNDc0LDE0MDcsMTgxMCwgMjk4LCA4OTksCiA4ODUsMTgxMSwxMTIwLCA4MDIsMTE1OCwxODEyLCA4OTIsMTgxMywxODE0LDE0MDgsIDY1OSwxODE1LDE4MTYsMTEyMSwxODE3LDE4MTgsCjE4MTksMTgyMCwxODIxLDE4MjIsIDMxOSwxODIzLCA1OTQsIDU0NSwxODI0LCA4MTUsIDkzNywxMjA5LDE4MjUsMTgyNiwgNTczLDE0MDksCjEwMjIsMTgyNywxMjEwLDE4MjgsMTgyOSwxODMwLDE4MzEsMTgzMiwxODMzLCA1NTYsIDcyMiwgODA3LDExMjIsMTA2MCwxODM0LCA2OTcsCjE4MzUsIDkwMCwgNTU3LCA3MTUsMTgzNiwxNDEwLCA1NDAsMTQxMSwgNzUyLDExNTksIDI5NCwgNTk3LDEyMTEsIDk3NiwgODAzLCA3NzAsCjE0MTIsMTgzNywxODM4LCAgMzksIDc5NCwxNDEzLCAzNTgsMTgzOSwgMzcxLCA5MjUsMTg0MCwgNDUzLCA2NjEsIDc4OCwgNTMxLCA3MjMsCiA1NDQsMTAyMywxMDgxLCA4NjksICA5MSwxODQxLCAzOTIsIDQzMCwgNzkwLCA2MDIsMTQxNCwgNjc3LDEwODIsIDQ1NywxNDE1LDE0MTYsCjE4NDIsMTg0MywgNDc1LCAzMjcsMTAyNCwxNDE3LCA3OTUsIDEyMSwxODQ0LCA3MzMsIDQwMywxNDE4LDE4NDUsMTg0NiwxODQ3LCAzMDAsCiAxMTksIDcxMSwxMjEyLCA2MjcsMTg0OCwxMjcyLCAyMDcsMTg0OSwxODUwLCA3OTYsMTIxMywgMzgyLDE4NTEsIDUxOSwxODUyLDEwODMsCiA4OTMsMTg1MywxODU0LDE4NTUsIDM2NywgODA5LCA0ODcsIDY3MSwxODU2LCA2NjMsMTg1NywxODU4LCA5NTYsIDQ3MSwgMzA2LCA4NTcsCjE4NTksMTg2MCwxMTYwLDEwODQsMTg2MSwxODYyLDE4NjMsMTg2NCwxODY1LDEwNjEsMTg2NiwxODY3LDE4NjgsMTg2OSwxODcwLDE4NzEsCiAyODIsICA5NiwgNTc0LDE4NzIsIDUwMiwxMDg1LDE4NzMsMTIxNCwxODc0LCA5MDcsMTg3NSwxODc2LCA4MjcsIDk3NywxNDE5LDE0MjAsCjE0MjEsIDI2OCwxODc3LDE0MjIsMTg3OCwxODc5LDE4ODAsIDMwOCwxODgxLCAgIDIsIDUzNywxODgyLDE4ODMsMTIxNSwxODg0LDE4ODUsCiAxMjcsIDc5MSwxODg2LDEyNzMsMTQyMywxODg3LCAgMzQsIDMzNiwgNDA0LCA2NDMsMTg4OCwgNTcxLCA2NTQsIDg5NCwgODQwLDE4ODksCiAgIDAsIDg4NiwxMjc0LCAxMjIsIDU3NSwgMjYwLCA5MDgsIDkzOCwxODkwLDEyNzUsIDQxMCwgMzE2LDE4OTEsMTg5MiwgMTAwLDE4OTMsCjE4OTQsMTEyMywgIDQ4LDExNjEsMTEyNCwxMDI1LDE4OTUsIDYzMywgOTAxLDEyNzYsMTg5NiwxODk3LCAxMTUsIDgxNiwxODk4LCAzMTcsCjE4OTksIDY5NCwxOTAwLCA5MDksIDczNCwxNDI0LCA1NzIsIDg2NiwxNDI1LCA2OTEsICA4NSwgNTI0LDEwMTAsIDU0MywgMzk0LCA4NDEsCjE5MDEsMTkwMiwxOTAzLDEwMjYsMTkwNCwxOTA1LDE5MDYsMTkwNywxOTA4LDE5MDksICAzMCwgNDUxLCA2NTEsIDk4OCwgMzEwLDE5MTAsCjE5MTEsMTQyNiwgODEwLDEyMTYsICA5MywxOTEyLDE5MTMsMTI3NywxMjE3LDE5MTQsIDg1OCwgNzU5LCAgNDUsICA1OCwgMTgxLCA2MTAsCiAyNjksMTkxNSwxOTE2LCAxMzEsMTA2MiwgNTUxLCA0NDMsMTAwMCwgODIxLDE0MjcsIDk1NywgODk1LDEwODYsMTkxNywxOTE4LCAzNzUsCjE5MTksIDM1OSwxOTIwLCA2ODcsMTkyMSwgODIyLDE5MjIsIDI5MywxOTIzLDE5MjQsICA0MCwgNjYyLCAxMTgsIDY5MiwgIDI5LCA5MzksCiA4ODcsIDY0MCwgNDgyLCAxNzQsMTkyNSwgIDY5LDExNjIsIDcyOCwxNDI4LCA5MTAsMTkyNiwxMjc4LDEyMTgsMTI3OSwgMzg2LCA4NzAsCiAyMTcsIDg1NCwxMTYzLCA4MjMsMTkyNywxOTI4LDE5MjksMTkzMCwgODM0LDE5MzEsICA3OCwxOTMyLCA4NTksMTkzMywxMDYzLDE5MzQsCjE5MzUsMTkzNiwxOTM3LCA0MzgsMTE2NCwgMjA4LCA1OTUsMTkzOCwxOTM5LDE5NDAsMTk0MSwxMjE5LDExMjUsMTk0MiwgMjgwLCA4ODgsCjE0MjksMTQzMCwxMjIwLDE0MzEsMTk0MywxOTQ0LDE5NDUsMTk0NiwxOTQ3LDEyODAsIDE1MCwgNTEwLDE0MzIsMTk0OCwxOTQ5LDE5NTAsCjE5NTEsMTk1MiwxOTUzLDE5NTQsMTAxMSwxMDg3LDE5NTUsMTQzMywxMDQzLDE5NTYsIDg4MSwxOTU3LCA2MTQsIDk1OCwxMDY0LDEwNjUsCjEyMjEsMTk1OCwgNjM4LDEwMDEsIDg2MCwgOTY3LCA4OTYsMTQzNCwgOTg5LCA0OTIsIDU1MywxMjgxLDExNjUsMTk1OSwxMjgyLDEwMDIsCjEyODMsMTIyMiwxOTYwLDE5NjEsMTk2MiwxOTYzLCAgMzYsIDM4MywgMjI4LCA3NTMsIDI0NywgNDU0LDE5NjQsIDg3NiwgNjc4LDE5NjUsCjE5NjYsMTI4NCwgMTI2LCA0NjQsIDQ5MCwgODM1LCAxMzYsIDY3MiwgNTI5LCA5NDAsMTA4OCwxNDM1LCA0NzMsMTk2NywxOTY4LCA0NjcsCiAgNTAsIDM5MCwgMjI3LCA1ODcsIDI3OSwgMzc4LCA1OTgsIDc5MiwgOTY4LCAyNDAsIDE1MSwgMTYwLCA4NDksIDg4MiwxMTI2LDEyODUsCiA2MzksMTA0NCwgMTMzLCAxNDAsIDI4OCwgMzYwLCA4MTEsIDU2MywxMDI3LCA1NjEsIDE0MiwgNTIzLDE5NjksMTk3MCwxOTcxLCAgIDcsCiAxMDMsIDI5NiwgNDM5LCA0MDcsIDUwNiwgNjM0LCA5OTAsMTk3MiwxOTczLDE5NzQsMTk3NSwgNjQ1LDE5NzYsMTk3NywxOTc4LDE5NzksCjE5ODAsMTk4MSwgMjM2LDE5ODIsMTQzNiwxOTgzLDE5ODQsMTA4OSwgMTkyLCA4MjgsIDYxOCwgNTE4LDExNjYsIDMzMywxMTI3LDE5ODUsCiA4MTgsMTIyMywxOTg2LDE5ODcsMTk4OCwxOTg5LDE5OTAsMTk5MSwxOTkyLDE5OTMsIDM0MiwxMTI4LDEyODYsIDc0NiwgODQyLDE5OTQsCjE5OTUsIDU2MCwgMjIzLDEyODcsICA5OCwgICA4LCAxODksIDY1MCwgOTc4LDEyODgsMTk5NiwxNDM3LDE5OTcsICAxNywgMzQ1LCAyNTAsCiA0MjMsIDI3NywgMjM0LCA1MTIsIDIyNiwgIDk3LCAyODksICA0MiwgMTY3LDE5OTgsIDIwMSwxOTk5LDIwMDAsIDg0MywgODM2LCA4MjQsCiA1MzIsIDMzOCwgNzgzLDEwOTAsIDE4MiwgNTc2LCA0MzYsMTQzOCwxNDM5LCA1MjcsIDUwMCwyMDAxLCA5NDcsIDg4OSwyMDAyLDIwMDMsCjIwMDQsMjAwNSwgMjYyLCA2MDAsIDMxNCwgNDQ3LDIwMDYsIDU0NywyMDA3LCA2OTMsIDczOCwxMTI5LDIwMDgsICA3MSwxNDQwLCA3NDUsCiA2MTksIDY4OCwyMDA5LCA4MjksMjAxMCwyMDExLCAxNDcsMjAxMiwgIDMzLCA5NDgsMjAxMywyMDE0LCAgNzQsIDIyNCwyMDE1LCAgNjEsCiAxOTEsIDkxOCwgMzk5LCA2MzcsMjAxNiwxMDI4LDExMzAsIDI1NywgOTAyLDIwMTcsMjAxOCwyMDE5LDIwMjAsMjAyMSwyMDIyLDIwMjMsCjIwMjQsMjAyNSwyMDI2LCA4MzcsMjAyNywyMDI4LDIwMjksMjAzMCwgMTc5LCA4NzQsIDU5MSwgIDUyLCA3MjQsIDI0NiwyMDMxLDIwMzIsCjIwMzMsMjAzNCwxMTY3LCA5NjksMjAzNSwxMjg5LCA2MzAsIDYwNSwgOTExLDEwOTEsMTE2OCwyMDM2LDIwMzcsMjAzOCwxNDQxLCA5MTIsCjIwMzksIDYyMywyMDQwLDIwNDEsIDI1MywxMTY5LDEyOTAsMjA0MiwxNDQyLCAxNDYsIDYyMCwgNjExLCA1NzcsIDQzMywyMDQzLDEyMjQsCiA3MTksMTE3MCwgOTU5LCA0NDAsIDQzNywgNTM0LCAgODQsIDM4OCwgNDgwLDExMzEsIDE1OSwgMjIwLCAxOTgsIDY3OSwyMDQ0LDEwMTIsCiA4MTksMTA2NiwxNDQzLCAxMTMsMTIyNSwgMTk0LCAzMTgsMTAwMywxMDI5LDIwNDUsMjA0NiwyMDQ3LDIwNDgsMTA2NywyMDQ5LDIwNTAsCjIwNTEsMjA1MiwyMDUzLCAgNTksIDkxMywgMTEyLDIwNTQsIDYzMiwyMDU1LCA0NTUsIDE0NCwgNzM5LDEyOTEsMjA1NiwgMjczLCA2ODEsCiA0OTksMjA1NywgNDQ4LDIwNTgsMjA1OSwgNzYwLDIwNjAsMjA2MSwgOTcwLCAzODQsIDE2OSwgMjQ1LDExMzIsMjA2MiwyMDYzLCA0MTQsCjE0NDQsMjA2NCwyMDY1LCAgNDEsIDIzNSwyMDY2LCAxNTcsIDI1MiwgODc3LCA1NjgsIDkxOSwgNzg5LCA1ODAsMjA2NywgNzI1LDIwNjgsCjIwNjksMTI5MiwyMDcwLDIwNzEsMTQ0NSwyMDcyLDE0NDYsMjA3MywyMDc0LCAgNTUsIDU4OCwgIDY2LDE0NDcsIDI3MSwxMDkyLDIwNzUsCjEyMjYsMjA3NiwgOTYwLDEwMTMsIDM3MiwyMDc3LDIwNzgsMjA3OSwyMDgwLDIwODEsMTI5MywyMDgyLDIwODMsMjA4NCwyMDg1LCA4NTAsCjIwODYsMjA4NywyMDg4LDIwODksMjA5MCwgMTg2LDIwOTEsMTA2OCwgMTgwLDIwOTIsMjA5MywyMDk0LCAxMDksMTIyNywgNTIyLCA2MDYsCjIwOTUsIDg2NywxNDQ4LDEwOTMsIDk5MSwxMTcxLCA5MjYsIDM1MywxMTMzLDIwOTYsIDU4MSwyMDk3LDIwOTgsMjA5OSwxMjk0LDE0NDksCjE0NTAsMjEwMCwgNTk2LDExNzIsMTAxNCwxMjI4LDIxMDEsMTQ1MSwxMjk1LDExNzMsMTIyOSwyMTAyLDIxMDMsMTI5NiwxMTM0LDE0NTIsCiA5NDksMTEzNSwyMTA0LDIxMDUsMTA5NCwxNDUzLDE0NTQsMTQ1NSwyMTA2LDEwOTUsMjEwNywyMTA4LDIxMDksMjExMCwyMTExLDIxMTIsCjIxMTMsMjExNCwyMTE1LDIxMTYsMjExNywgODA0LDIxMTgsMjExOSwxMjMwLDEyMzEsIDgwNSwxNDU2LCA0MDUsMTEzNiwyMTIwLDIxMjEsCjIxMjIsMjEyMywyMTI0LCA3MjAsIDcwMSwxMjk3LCA5OTIsMTQ1NywgOTI3LDEwMDQsMjEyNSwyMTI2LDIxMjcsMjEyOCwyMTI5LDIxMzAsCiAgMjIsIDQxNywyMTMxLCAzMDMsMjEzMiwgMzg1LDIxMzMsIDk3MSwgNTIwLCA1MTMsMjEzNCwxMTc0LCAgNzMsMTA5NiwgMjMxLCAyNzQsCiA5NjIsMTQ1OCwgNjczLDIxMzUsMTQ1OSwyMTM2LCAxNTIsMTEzNywyMTM3LDIxMzgsMjEzOSwyMTQwLDEwMDUsMTEzOCwxNDYwLDExMzksCjIxNDEsMjE0MiwyMTQzLDIxNDQsICAxMSwgMzc0LCA4NDQsMjE0NSwgMTU0LDEyMzIsICA0NiwxNDYxLDIxNDYsIDgzOCwgODMwLCA3MjEsCjEyMzMsIDEwNiwyMTQ3LCAgOTAsIDQyOCwgNDYyLCA1NzgsIDU2NiwxMTc1LCAzNTIsMjE0OCwyMTQ5LCA1MzgsMTIzNCwgMTI0LDEyOTgsCjIxNTAsMTQ2MiwgNzYxLCA1NjUsMjE1MSwgNjg2LDIxNTIsIDY0OSwyMTUzLCAgNzIsIDE3MywyMTU0LCA0NjAsIDQxNSwyMTU1LDE0NjMsCjIxNTYsMTIzNSwgMzA1LDIxNTcsMjE1OCwyMTU5LDIxNjAsMjE2MSwyMTYyLCA1NzksMjE2MywyMTY0LDIxNjUsMjE2NiwyMTY3LCA3NDcsCjIxNjgsMjE2OSwyMTcwLDIxNzEsMTQ2NCwgNjY5LDIxNzIsMjE3MywyMTc0LDIxNzUsMjE3NiwxNDY1LDIxNzcsICAyMywgNTMwLCAyODUsCjIxNzgsIDMzNSwgNzI5LDIxNzksIDM5NywyMTgwLDIxODEsMjE4MiwxMDMwLDIxODMsMjE4NCwgNjk4LDIxODUsMjE4NiwgMzI1LDIxODcsCjIxODgsIDM2OSwyMTg5LCA3OTksMTA5NywxMDE1LCAzNDgsMjE5MCwxMDY5LCA2ODAsMjE5MSwgODUxLDE0NjYsMjE5MiwyMTkzLCAgMTAsCjIxOTQsIDYxMywgNDI0LDIxOTUsIDk3OSwgMTA4LCA0NDksIDU4OSwgIDI3LCAxNzIsICA4MSwxMDMxLCAgODAsIDc3NCwgMjgxLCAzNTAsCjEwMzIsIDUyNSwgMzAxLCA1ODIsMTE3NiwyMTk2LCA2NzQsMTA0NSwyMTk3LDIxOTgsMTQ2NywgNzMwLCA3NjIsMjE5OSwyMjAwLDIyMDEsCjIyMDIsMTQ2OCwyMjAzLCA5OTMsMjIwNCwyMjA1LCAyNjYsMTA3MCwgOTYzLDExNDAsMjIwNiwyMjA3LDIyMDgsIDY2NCwxMDk4LCA5NzIsCjIyMDksMjIxMCwyMjExLDExNzcsMTQ2OSwxNDcwLCA4NzEsMjIxMiwyMjEzLDIyMTQsMjIxNSwyMjE2LDE0NzEsMjIxNywyMjE4LDIyMTksCjIyMjAsMjIyMSwyMjIyLDIyMjMsMjIyNCwyMjI1LDIyMjYsMjIyNywxNDcyLDEyMzYsMjIyOCwyMjI5LDIyMzAsMjIzMSwyMjMyLDIyMzMsCjIyMzQsMjIzNSwxMjk5LDIyMzYsMjIzNywgMjAwLDIyMzgsIDQ3NywgMzczLDIyMzksMjI0MCwgNzMxLCA4MjUsIDc3NywyMjQxLDIyNDIsCjIyNDMsIDUyMSwgNDg2LCA1NDgsMjI0NCwyMjQ1LDIyNDYsMTQ3MywxMzAwLCAgNTMsIDU0OSwgMTM3LCA4NzUsICA3NiwgMTU4LDIyNDcsCjEzMDEsMTQ3NCwgNDY5LCAzOTYsMTAxNiwgMjc4LCA3MTIsMjI0OCwgMzIxLCA0NDIsIDUwMywgNzY3LCA3NDQsIDk0MSwxMjM3LDExNzgsCjE0NzUsMjI0OSwgIDgyLCAxNzgsMTE0MSwxMTc5LCA5NzMsMjI1MCwxMzAyLDIyNTEsIDI5NywyMjUyLDIyNTMsIDU3MCwyMjU0LDIyNTUsCjIyNTYsICAxOCwgNDUwLCAyMDYsMjI1NywgMjkwLCAyOTIsMTE0MiwyMjU4LCA1MTEsIDE2MiwgIDk5LCAzNDYsIDE2NCwgNzM1LDIyNTksCjE0NzYsMTQ3NywgICA0LCA1NTQsIDM0MywgNzk4LDEwOTksMjI2MCwxMTAwLDIyNjEsICA0MywgMTcxLDEzMDMsIDEzOSwgMjE1LDIyNjIsCjIyNjMsIDcxNywgNzc1LDIyNjQsMTAzMywgMzIyLCAyMTYsMjI2NSwgODMxLDIyNjYsIDE0OSwyMjY3LDEzMDQsMjI2OCwyMjY5LCA3MDIsCjEyMzgsIDEzNSwgODQ1LCAzNDcsIDMwOSwyMjcwLCA0ODQsMjI3MSwgODc4LCA2NTUsIDIzOCwxMDA2LDE0NzgsMjI3MiwgIDY3LDIyNzMsCiAyOTUsMjI3NCwyMjc1LCA0NjEsMjI3NiwgNDc4LCA5NDIsIDQxMiwyMjc3LDEwMzQsMjI3OCwyMjc5LDIyODAsIDI2NSwyMjgxLCA1NDEsCjIyODIsMjI4MywyMjg0LDIyODUsMjI4NiwgIDcwLCA4NTIsMTA3MSwyMjg3LDIyODgsMjI4OSwyMjkwLCAgMjEsICA1NiwgNTA5LCAxMTcsCiA0MzIsMjI5MSwyMjkyLCAzMzEsIDk4MCwgNTUyLDExMDEsIDE0OCwgMjg0LCAxMDUsIDM5MywxMTgwLDEyMzksIDc1NSwyMjkzLCAxODcsCjIyOTQsMTA0NiwxNDc5LDIyOTUsIDM0MCwyMjk2LCAgNjMsMTA0NywgMjMwLDIyOTcsMjI5OCwxMzA1LCA3NjMsMTMwNiwgMTAxLCA4MDAsCiA4MDgsIDQ5NCwyMjk5LDIzMDAsMjMwMSwgOTAzLDIzMDIsICAzNywxMDcyLCAgMTQsICAgNSwyMzAzLCAgNzksIDY3NSwyMzA0LCAzMTIsCjIzMDUsMjMwNiwyMzA3LDIzMDgsMjMwOSwxNDgwLCAgIDYsMTMwNywyMzEwLDIzMTEsMjMxMiwgICAxLCA0NzAsICAzNSwgIDI0LCAyMjksCjIzMTMsIDY5NSwgMjEwLCAgODYsIDc3OCwgIDE1LCA3ODQsIDU5MiwgNzc5LCAgMzIsICA3NywgODU1LCA5NjQsMjMxNCwgMjU5LDIzMTUsCiA1MDEsIDM4MCwyMzE2LDIzMTcsICA4MywgOTgxLCAxNTMsIDY4OSwxMzA4LDE0ODEsMTQ4MiwxNDgzLDIzMTgsMjMxOSwgNzE2LDE0ODQsCjIzMjAsMjMyMSwyMzIyLDIzMjMsMjMyNCwyMzI1LDE0ODUsMjMyNiwyMzI3LCAxMjgsICA1NywgIDY4LCAyNjEsMTA0OCwgMjExLCAxNzAsCjEyNDAsICAzMSwyMzI4LCAgNTEsIDQzNSwgNzQyLDIzMjksMjMzMCwyMzMxLCA2MzUsMjMzMiwgMjY0LCA0NTYsMjMzMywyMzM0LDIzMzUsCiA0MjUsMjMzNiwxNDg2LCAxNDMsIDUwNywgMjYzLCA5NDMsMjMzNywgMzYzLCA5MjAsMTQ4NywgMjU2LDE0ODgsMTEwMiwgMjQzLCA2MDEsCjE0ODksMjMzOCwyMzM5LDIzNDAsMjM0MSwyMzQyLDIzNDMsMjM0NCwgODYxLDIzNDUsMjM0NiwyMzQ3LDIzNDgsMjM0OSwyMzUwLCAzOTUsCjIzNTEsMTQ5MCwxNDkxLCAgNjIsIDUzNSwgMTY2LCAyMjUsMjM1MiwyMzUzLCA2NjgsIDQxOSwxMjQxLCAxMzgsIDYwNCwgOTI4LDIzNTQsCjExODEsMjM1NSwxNDkyLDE0OTMsMjM1NiwyMzU3LDIzNTgsMTE0MywyMzU5LCA2OTYsMjM2MCwgMzg3LCAzMDcsMTMwOSwgNjgyLCA0NzYsCjIzNjEsMjM2MiwgMzMyLCAgMTIsIDIyMiwgMTU2LDIzNjMsIDIzMiwyMzY0LCA2NDEsIDI3NiwgNjU2LCA1MTcsMTQ5NCwxNDk1LDEwMzUsCiA0MTYsIDczNiwxNDk2LDIzNjUsMTAxNywgNTg2LDIzNjYsMjM2NywyMzY4LDE0OTcsMjM2OSwgMjQyLDIzNzAsMjM3MSwyMzcyLDE0OTgsCjIzNzMsIDk2NSwgNzEzLDIzNzQsMjM3NSwyMzc2LDIzNzcsIDc0MCwgOTgyLDE0OTksIDk0NCwxNTAwLDEwMDcsMjM3OCwyMzc5LDEzMTAsCjE1MDEsMjM4MCwyMzgxLDIzODIsIDc4NSwgMzI5LDIzODMsMjM4NCwxNTAyLDIzODUsMjM4NiwyMzg3LCA5MzIsMjM4OCwxNTAzLDIzODksCjIzOTAsMjM5MSwyMzkyLDEyNDIsMjM5MywyMzk0LDIzOTUsMjM5NiwyMzk3LCA5OTQsIDk1MCwyMzk4LDIzOTksMjQwMCwyNDAxLDE1MDQsCjEzMTEsMjQwMiwyNDAzLDI0MDQsMjQwNSwxMDQ5LCA3NDksMjQwNiwyNDA3LCA4NTMsIDcxOCwxMTQ0LDEzMTIsMjQwOCwxMTgyLDE1MDUsCjI0MDksMjQxMCwgMjU1LCA1MTYsIDQ3OSwgNTY0LCA1NTAsIDIxNCwxNTA2LDE1MDcsMTMxMywgNDEzLCAyMzksIDQ0NCwgMzM5LDExNDUsCjEwMzYsMTUwOCwxNTA5LDEzMTQsMTAzNywxNTEwLDEzMTUsMjQxMSwxNTExLDI0MTIsMjQxMywyNDE0LCAxNzYsIDcwMywgNDk3LCA2MjQsCiA1OTMsIDkyMSwgMzAyLDI0MTUsIDM0MSwgMTY1LDExMDMsMTUxMiwyNDE2LDE1MTMsMjQxNywyNDE4LDI0MTksIDM3NiwyNDIwLCA3MDAsCjI0MjEsMjQyMiwyNDIzLCAyNTgsIDc2OCwxMzE2LDI0MjQsMTE4MywyNDI1LCA5OTUsIDYwOCwyNDI2LDI0MjcsMjQyOCwyNDI5LCAyMjEsCjI0MzAsMjQzMSwyNDMyLDI0MzMsMjQzNCwyNDM1LDI0MzYsMjQzNywgMTk1LCAzMjMsIDcyNiwgMTg4LCA4OTcsIDk4MywxMzE3LCAzNzcsCiA2NDQsMTA1MCwgODc5LDI0MzgsIDQ1MiwyNDM5LDI0NDAsMjQ0MSwyNDQyLDI0NDMsMjQ0NCwgOTE0LDI0NDUsMjQ0NiwyNDQ3LDI0NDgsCiA5MTUsIDQ4OSwyNDQ5LDE1MTQsMTE4NCwyNDUwLDI0NTEsIDUxNSwgIDY0LCA0MjcsIDQ5NSwyNDUyLCA1ODMsMjQ1MywgNDgzLCA0ODUsCjEwMzgsIDU2MiwgMjEzLDE1MTUsIDc0OCwgNjY2LDI0NTQsMjQ1NSwyNDU2LDI0NTcsIDMzNCwyNDU4LCA3ODAsIDk5NiwxMDA4LCA3MDUsCjEyNDMsMjQ1OSwyNDYwLDI0NjEsMjQ2MiwyNDYzLCAxMTQsMjQ2NCwgNDkzLDExNDYsIDM2NiwgMTYzLDE1MTYsIDk2MSwxMTA0LDI0NjUsCiAyOTEsMjQ2NiwxMzE4LDExMDUsMjQ2NywxNTE3LCAzNjUsMjQ2OCwgMzU1LCA5NTEsMTI0NCwyNDY5LDEzMTksMjQ3MCwgNjMxLDI0NzEsCjI0NzIsIDIxOCwxMzIwLCAzNjQsIDMyMCwgNzU2LDE1MTgsMTUxOSwxMzIxLDE1MjAsMTMyMiwyNDczLDI0NzQsMjQ3NSwyNDc2LCA5OTcsCjI0NzcsMjQ3OCwyNDc5LDI0ODAsIDY2NSwxMTg1LDI0ODEsIDkxNiwxNTIxLDI0ODIsMjQ4MywyNDg0LCA1ODQsIDY4NCwyNDg1LDI0ODYsCiA3OTcsMjQ4NywxMDUxLDExODYsMjQ4OCwyNDg5LDI0OTAsMTUyMiwyNDkxLDI0OTIsIDM3MCwyNDkzLDEwMzksMTE4NywgIDY1LDI0OTQsCiA0MzQsIDIwNSwgNDYzLDExODgsMjQ5NSwgMTI1LCA4MTIsIDM5MSwgNDAyLCA4MjYsIDY5OSwgMjg2LCAzOTgsIDE1NSwgNzgxLCA3NzEsCiA1ODUsMjQ5NiwgNTkwLCA1MDUsMTA3MywyNDk3LCA1OTksIDI0NCwgMjE5LCA5MTcsMTAxOCwgOTUyLCA2NDYsMTUyMywyNDk4LDEzMjMsCjI0OTksMjUwMCwgIDQ5LCA5ODQsIDM1NCwgNzQxLDI1MDEsIDYyNSwyNTAyLDEzMjQsMjUwMywxMDE5LCAxOTAsIDM1NywgNzU3LCA0OTEsCiAgOTUsIDc4MiwgODY4LDI1MDQsMjUwNSwyNTA2LDI1MDcsMjUwOCwyNTA5LCAxMzQsMTUyNCwxMDc0LCA0MjIsMTUyNSwgODk4LDI1MTAsCiAxNjEsMjUxMSwyNTEyLDI1MTMsMjUxNCwgNzY5LDI1MTUsMTUyNiwyNTE2LDI1MTcsIDQxMSwxMzI1LDI1MTgsIDQ3MiwxNTI3LDI1MTksCjI1MjAsMjUyMSwyNTIyLDI1MjMsMjUyNCwgOTg1LDI1MjUsMjUyNiwyNTI3LDI1MjgsMjUyOSwyNTMwLCA3NjQsMjUzMSwxMjQ1LDI1MzIsCjI1MzMsICAyNSwgMjA0LCAzMTEsMjUzNCwgNDk2LDI1MzUsMTA1MiwyNTM2LDI1MzcsMjUzOCwyNTM5LDI1NDAsMjU0MSwyNTQyLCAxOTksCiA3MDQsIDUwNCwgNDY4LCA3NTgsIDY1NywxNTI4LCAxOTYsICA0NCwgODM5LDEyNDYsIDI3MiwgNzUwLDI1NDMsIDc2NSwgODYyLDI1NDQsCjI1NDUsMTMyNiwyNTQ2LCAxMzIsIDYxNSwgOTMzLDI1NDcsIDczMiwyNTQ4LDI1NDksMjU1MCwxMTg5LDE1MjksMjU1MSwgMjgzLDEyNDcsCjEwNTMsIDYwNywgOTI5LDI1NTIsMjU1MywyNTU0LCA5MzAsIDE4MywgODcyLCA2MTYsMTA0MCwxMTQ3LDI1NTUsMTE0OCwxMDIwLCA0NDEsCiAyNDksMTA3NSwyNTU2LDI1NTcsMjU1OCwgNDY2LCA3NDMsMjU1OSwyNTYwLDI1NjEsICA5MiwgNTE0LCA0MjYsIDQyMCwgNTI2LDI1NjIsCjI1NjMsMjU2NCwyNTY1LDI1NjYsMjU2NywyNTY4LCAxODUsMjU2OSwyNTcwLDI1NzEsMjU3MiwgNzc2LDE1MzAsIDY1OCwyNTczLCAzNjIsCjI1NzQsIDM2MSwgOTIyLDEwNzYsIDc5MywyNTc1LDI1NzYsMjU3NywyNTc4LDI1NzksMjU4MCwxNTMxLCAyNTEsMjU4MSwyNTgyLDI1ODMsCjI1ODQsMTUzMiwgIDU0LCA2MTIsIDIzNywxMzI3LDI1ODUsMjU4NiwgMjc1LCA0MDgsIDY0NywgMTExLDI1ODcsMTUzMywxMTA2LCA0NjUsCiAgIDMsIDQ1OCwgICA5LCAgMzgsMjU4OCwgMTA3LCAxMTAsIDg5MCwgMjA5LCAgMjYsIDczNywgNDk4LDI1ODksMTUzNCwyNTkwLCA0MzEsCiAyMDIsICA4OCwxNTM1LCAzNTYsIDI4NywxMTA3LCA2NjAsMTE0OSwyNTkxLCAzODEsMTUzNiwgOTg2LDExNTAsIDQ0NSwxMjQ4LDExNTEsCiA5NzQsMjU5MiwyNTkzLCA4NDYsMjU5NCwgNDQ2LCA5NTMsIDE4NCwxMjQ5LDEyNTAsIDcyNywyNTk1LCA5MjMsIDE5MywgODgzLDI1OTYsCjI1OTcsMjU5OCwgMTAyLCAzMjQsIDUzOSwgODE3LDI1OTksIDQyMSwxMDQxLDI2MDAsIDgzMiwyNjAxLCAgOTQsIDE3NSwgMTk3LCA0MDYsCjI2MDIsIDQ1OSwyNjAzLDI2MDQsMjYwNSwyNjA2LDI2MDcsIDMzMCwgNTU1LDI2MDgsMjYwOSwyNjEwLCA3MDYsMTEwOCwgMzg5LDI2MTEsCjI2MTIsMjYxMywyNjE0LCAyMzMsMjYxNSwgODMzLCA1NTgsIDkzMSwgOTU0LDEyNTEsMjYxNiwyNjE3LDE1MzcsIDU0NiwyNjE4LDI2MTksCjEwMDksMjYyMCwyNjIxLDI2MjIsMTUzOCwgNjkwLDEzMjgsMjYyMywgOTU1LDI2MjQsMTUzOSwyNjI1LDI2MjYsIDc3MiwyNjI3LDI2MjgsCjI2MjksMjYzMCwyNjMxLCA5MjQsIDY0OCwgODYzLCA2MDMsMjYzMiwyNjMzLCA5MzQsMTU0MCwgODY0LCA4NjUsMjYzNCwgNjQyLDEwNDIsCiA2NzAsMTE5MCwyNjM1LDI2MzYsMjYzNywyNjM4LCAxNjgsMjYzOSwgNjUyLCA4NzMsIDU0MiwxMDU0LDE1NDEsMjY0MCwyNjQxLDI2NDIsICAjIDUxMiwgMjU2CikKClBLAwQUAAAAAAAAACEAJgWX+NQGAADUBgAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcnByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5tYmNzc20gaW1wb3J0IEVVQ0tSX1NNX01PREVMCgoKY2xhc3MgRVVDS1JQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoRVVDS1JQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShFVUNLUl9TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkVVQy1LUiIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIktvcmVhbiIKUEsDBBQAAAAAAAAAIQDM20nVhXsAAIV7AAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y3R3ZnJlcS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBFVUNUVyBmcmVxdWVuY3kgdGFibGUKIyBDb252ZXJ0ZWQgZnJvbSBiaWc1IHdvcmsKIyBieSBUYWl3YW4ncyBNYW5kYXJpbiBQcm9tb3Rpb24gQ291bmNpbAojIDxodHRwOiN3d3cuZWR1LnR3OjgxL21hbmRyLz4KCiMgMTI4ICAtLT4gMC40MjI2MQojIDI1NiAgLS0+IDAuNTc4NTEKIyA1MTIgIC0tPiAwLjc0ODUxCiMgMTAyNCAtLT4gMC44OTM4NAojIDIwNDggLS0+IDAuOTc1ODMKIwojIElkZWEgRGlzdHJpYnV0aW9uIFJhdGlvID0gMC43NDg1MS8oMS0wLjc0ODUxKSA9Mi45OAojIFJhbmRvbSBEaXN0cmlidXRpb24gUmF0aW9uID0gNTEyLyg1NDAxLTUxMik9MC4xMDUKIwojIFR5cGljYWwgRGlzdHJpYnV0aW9uIFJhdGlvIGFib3V0IDI1JSBvZiBJZGVhbCBvbmUsIHN0aWxsIG11Y2ggaGlnaGVyIHRoYW4gUkRSCgpFVUNUV19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTyA9IDAuNzUKCiMgQ2hhciB0byBGcmVxT3JkZXIgdGFibGUgLApFVUNUV19UQUJMRV9TSVpFID0gNTM3NgoKRVVDVFdfQ0hBUl9UT19GUkVRX09SREVSID0gKAogICAxLDE4MDAsMTUwNiwgMjU1LDE0MzEsIDE5OCwgICA5LCAgODIsICAgNiw3MzEwLCAxNzcsIDIwMiwzNjE1LDEyNTYsMjgwOCwgMTEwLCAgIyAyNzQyCjM3MzUsICAzMywzMjQxLCAyNjEsICA3NiwgIDQ0LDIxMTMsICAxNiwyOTMxLDIxODQsMTE3NiwgNjU5LDM4NjgsICAyNiwzNDA0LDI2NDMsICAjIDI3NTgKMTE5OCwzODY5LDMzMTMsNDA2MCwgNDEwLDIyMTEsIDMwMiwgNTkwLCAzNjEsMTk2MywgICA4LCAyMDQsICA1OCw0Mjk2LDczMTEsMTkzMSwgICMgMjc3NAogIDYzLDczMTIsNzMxMywgMzE3LDE2MTQsICA3NSwgMjIyLCAxNTksNDA2MSwyNDEyLDE0ODAsNzMxNCwzNTAwLDMwNjgsIDIyNCwyODA5LCAgIyAyNzkwCjM2MTYsICAgMywgIDEwLDM4NzAsMTQ3MSwgIDI5LDI3NzQsMTEzNSwyODUyLDE5MzksIDg3MywgMTMwLDMyNDIsMTEyMywgMzEyLDczMTUsICAjIDI4MDYKNDI5NywyMDUxLCA1MDcsIDI1MiwgNjgyLDczMTYsIDE0MiwxOTE0LCAxMjQsIDIwNiwyOTMyLCAgMzQsMzUwMSwzMTczLCAgNjQsIDYwNCwgICMgMjgyMgo3MzE3LDI0OTQsMTk3NiwxOTc3LCAxNTUsMTk5MCwgNjQ1LCA2NDEsMTYwNiw3MzE4LDM0MDUsIDMzNywgIDcyLCA0MDYsNzMxOSwgIDgwLCAgIyAyODM4CiA2MzAsIDIzOCwzMTc0LDE1MDksIDI2MywgOTM5LDEwOTIsMjY0NCwgNzU2LDE0NDAsMTA5NCwzNDA2LCA0NDksICA2OSwyOTY5LCA1OTEsICAjIDI4NTQKIDE3OSwyMDk1LCA0NzEsIDExNSwyMDM0LDE4NDMsICA2MCwgIDUwLDI5NzAsIDEzNCwgODA2LDE4NjgsIDczNCwyMDM1LDM0MDcsIDE4MCwgICMgMjg3MAogOTk1LDE2MDcsIDE1NiwgNTM3LDI4OTMsIDY4OCw3MzIwLCAzMTksMTMwNSwgNzc5LDIxNDQsIDUxNCwyMzc0LCAyOTgsNDI5OCwgMzU5LCAgIyAyODg2CjI0OTUsICA5MCwyNzA3LDEzMzgsIDY2MywgIDExLCA5MDYsMTA5OSwyNTQ1LCAgMjAsMjQzNiwgMTgyLCA1MzIsMTcxNiw3MzIxLCA3MzIsICAjIDI5MDIKMTM3Niw0MDYyLDEzMTEsMTQyMCwzMTc1LCAgMjUsMjMxMiwxMDU2LCAxMTMsIDM5OSwgMzgyLDE5NDksIDI0MiwzNDA4LDI0NjcsIDUyOSwgICMgMjkxOAozMjQzLCA0NzUsMTQ0NywzNjE3LDczMjIsIDExNywgIDIxLCA2NTYsIDgxMCwxMjk3LDIyOTUsMjMyOSwzNTAyLDczMjMsIDEyNiw0MDYzLCAgIyAyOTM0CiA3MDYsIDQ1NiwgMTUwLCA2MTMsNDI5OSwgIDcxLDExMTgsMjAzNiw0MDY0LCAxNDUsMzA2OSwgIDg1LCA4MzUsIDQ4NiwyMTE0LDEyNDYsICAjIDI5NTAKMTQyNiwgNDI4LCA3MjcsMTI4NSwxMDE1LCA4MDAsIDEwNiwgNjIzLCAzMDMsMTI4MSw3MzI0LDIxMjcsMjM1NCwgMzQ3LDM3MzYsIDIyMSwgICMgMjk2NgozNTAzLDMxMTAsNzMyNSwxOTU1LDExNTMsNDA2NSwgIDgzLCAyOTYsMTE5OSwzMDcwLCAxOTIsIDYyNCwgIDkzLDczMjYsIDgyMiwxODk3LCAgIyAyOTgyCjI4MTAsMzExMSwgNzk1LDIwNjQsIDk5MSwxNTU0LDE1NDIsMTU5MiwgIDI3LCAgNDMsMjg1MywgODU5LCAxMzksMTQ1NiwgODYwLDQzMDAsICAjIDI5OTgKIDQzNywgNzEyLDM4NzEsIDE2NCwyMzkyLDMxMTIsIDY5NSwgMjExLDMwMTcsMjA5NiwgMTk1LDM4NzIsMTYwOCwzNTA0LDM1MDUsMzYxOCwgICMgMzAxNAozODczLCAyMzQsIDgxMSwyOTcxLDIwOTcsMzg3NCwyMjI5LDE0NDEsMzUwNiwxNjE1LDIzNzUsIDY2OCwyMDc2LDE2MzgsIDMwNSwgMjI4LCAgIyAzMDMwCjE2NjQsNDMwMSwgNDY3LCA0MTUsNzMyNywgMjYyLDIwOTgsMTU5MywgMjM5LCAxMDgsIDMwMCwgMjAwLDEwMzMsIDUxMiwxMjQ3LDIwNzcsICAjIDMwNDYKNzMyOCw3MzI5LDIxNzMsMzE3NiwzNjE5LDI2NzMsIDU5MywgODQ1LDEwNjIsMzI0NCwgIDg4LDE3MjMsMjAzNywzODc1LDE5NTAsIDIxMiwgICMgMzA2MgogMjY2LCAxNTIsIDE0OSwgNDY4LDE4OTgsNDA2Niw0MzAyLCAgNzcsIDE4Nyw3MzMwLDMwMTgsICAzNywgICA1LDI5NzIsNzMzMSwzODc2LCAgIyAzMDc4CjczMzIsNzMzMywgIDM5LDI1MTcsNDMwMywyODk0LDMxNzcsMjA3OCwgIDU1LCAxNDgsICA3NCw0MzA0LCA1NDUsIDQ4MywxNDc0LDEwMjksICAjIDMwOTQKMTY2NSwgMjE3LDE4NjksMTUzMSwzMTEzLDExMDQsMjY0NSw0MDY3LCAgMjQsIDE3MiwzNTA3LCA5MDAsMzg3NywzNTA4LDM1MDksNDMwNSwgICMgMzExMAogIDMyLDE0MDgsMjgxMSwxMzEyLCAzMjksIDQ4NywyMzU1LDIyNDcsMjcwOCwgNzg0LDI2NzQsICAgNCwzMDE5LDMzMTQsMTQyNywxNzg4LCAgIyAzMTI2CiAxODgsIDEwOSwgNDk5LDczMzQsMzYyMCwxNzE3LDE3ODksIDg4OCwxMjE3LDMwMjAsNDMwNiw3MzM1LDM1MTAsNzMzNiwzMzE1LDE1MjAsICAjIDMxNDIKMzYyMSwzODc4LCAxOTYsMTAzNCwgNzc1LDczMzcsNzMzOCwgOTI5LDE4MTUsIDI0OSwgNDM5LCAgMzgsNzMzOSwxMDYzLDczNDAsIDc5NCwgICMgMzE1OAozODc5LDE0MzUsMjI5NiwgIDQ2LCAxNzgsMzI0NSwyMDY1LDczNDEsMjM3Niw3MzQyLCAyMTQsMTcwOSw0MzA3LCA4MDQsICAzNSwgNzA3LCAgIyAzMTc0CiAzMjQsMzYyMiwxNjAxLDI1NDYsIDE0MCwgNDU5LDQwNjgsNzM0Myw3MzQ0LDEzNjUsIDgzOSwgMjcyLCA5NzgsMjI1NywyNTcyLDM0MDksICAjIDMxOTAKMjEyOCwxMzYzLDM2MjMsMTQyMywgNjk3LCAxMDAsMzA3MSwgIDQ4LCAgNzAsMTIzMSwgNDk1LDMxMTQsMjE5Myw3MzQ1LDEyOTQsNzM0NiwgICMgMzIwNgoyMDc5LCA0NjIsIDU4NiwxMDQyLDMyNDYsIDg1MywgMjU2LCA5ODgsIDE4NSwyMzc3LDM0MTAsMTY5OCwgNDM0LDEwODQsNzM0NywzNDExLCAgIyAzMjIyCiAzMTQsMjYxNSwyNzc1LDQzMDgsMjMzMCwyMzMxLCA1NjksMjI4MCwgNjM3LDE4MTYsMjUxOCwgNzU3LDExNjIsMTg3OCwxNjE2LDM0MTIsICAjIDMyMzgKIDI4NywxNTc3LDIxMTUsIDc2OCw0MzA5LDE2NzEsMjg1NCwzNTExLDI1MTksMTMyMSwzNzM3LCA5MDksMjQxMyw3MzQ4LDQwNjksIDkzMywgICMgMzI1NAozNzM4LDczNDksMjA1MiwyMzU2LDEyMjIsNDMxMCwgNzY1LDI0MTQsMTMyMiwgNzg2LDQzMTEsNzM1MCwxOTE5LDE0NjIsMTY3NywyODk1LCAgIyAzMjcwCjE2OTksNzM1MSw0MzEyLDE0MjQsMjQzNywzMTE1LDM2MjQsMjU5MCwzMzE2LDE3NzQsMTk0MCwzNDEzLDM4ODAsNDA3MCwgMzA5LDEzNjksICAjIDMyODYKMTEzMCwyODEyLCAzNjQsMjIzMCwxNjUzLDEyOTksMzg4MSwzNTEyLDM4ODIsMzg4MywyNjQ2LCA1MjUsMTA4NSwzMDIxLCA5MDIsMjAwMCwgICMgMzMwMgoxNDc1LCA5NjQsNDMxMywgNDIxLDE4NDQsMTQxNSwxMDU3LDIyODEsIDk0MCwxMzY0LDMxMTYsIDM3Niw0MzE0LDQzMTUsMTM4MSwgICA3LCAgIyAzMzE4CjI1MjAsIDk4MywyMzc4LCAzMzYsMTcxMCwyNjc1LDE4NDUsIDMyMSwzNDE0LCA1NTksMTEzMSwzMDIyLDI3NDIsMTgwOCwxMTMyLDEzMTMsICAjIDMzMzQKIDI2NSwxNDgxLDE4NTcsNzM1MiwgMzUyLDEyMDMsMjgxMywzMjQ3LCAxNjcsMTA4OSwgNDIwLDI4MTQsIDc3NiwgNzkyLDE3MjQsMzUxMywgICMgMzM1MAo0MDcxLDI0MzgsMzI0OCw3MzUzLDQwNzIsNzM1NCwgNDQ2LCAyMjksIDMzMywyNzQzLCA5MDEsMzczOSwxMjAwLDE1NTcsNDMxNiwyNjQ3LCAgIyAzMzY2CjE5MjAsIDM5NSwyNzQ0LDI2NzYsMzc0MCw0MDczLDE4MzUsIDEyNSwgOTE2LDMxNzgsMjYxNiw0MzE3LDczNTUsNzM1NiwzNzQxLDczNTcsICAjIDMzODIKNzM1OCw3MzU5LDQzMTgsMzExNywzNjI1LDExMzMsMjU0NywxNzU3LDM0MTUsMTUxMCwyMzEzLDE0MDksMzUxNCw3MzYwLDIxNDUsIDQzOCwgICMgMzM5OAoyNTkxLDI4OTYsMjM3OSwzMzE3LDEwNjgsIDk1OCwzMDIzLCA0NjEsIDMxMSwyODU1LDI2NzcsNDA3NCwxOTE1LDMxNzksNDA3NSwxOTc4LCAgIyAzNDE0CiAzODMsIDc1MCwyNzQ1LDI2MTcsNDA3NiwgMjc0LCA1MzksIDM4NSwxMjc4LDE0NDIsNzM2MSwxMTU0LDE5NjQsIDM4NCwgNTYxLCAyMTAsICAjIDM0MzAKICA5OCwxMjk1LDI1NDgsMzUxNSw3MzYyLDE3MTEsMjQxNSwxNDgyLDM0MTYsMzg4NCwyODk3LDEyNTcsIDEyOSw3MzYzLDM3NDIsIDY0MiwgICMgMzQ0NgogNTIzLDI3NzYsMjc3NywyNjQ4LDczNjQsIDE0MSwyMjMxLDEzMzMsICA2OCwgMTc2LCA0NDEsIDg3NiwgOTA3LDQwNzcsIDYwMywyNTkyLCAgIyAzNDYyCiA3MTAsIDE3MSwzNDE3LCA0MDQsIDU0OSwgIDE4LDMxMTgsMjM5MywxNDEwLDM2MjYsMTY2Niw3MzY1LDM1MTYsNDMxOSwyODk4LDQzMjAsICAjIDM0NzgKNzM2NiwyOTczLCAzNjgsNzM2NywgMTQ2LCAzNjYsICA5OSwgODcxLDM2MjcsMTU0MywgNzQ4LCA4MDcsMTU4NiwxMTg1LCAgMjIsMjI1OCwgICMgMzQ5NAogMzc5LDM3NDMsMzE4MCw3MzY4LDMxODEsIDUwNSwxOTQxLDI2MTgsMTk5MSwxMzgyLDIzMTQsNzM2OSwgMzgwLDIzNTcsIDIxOCwgNzAyLCAgIyAzNTEwCjE4MTcsMTI0OCwzNDE4LDMwMjQsMzUxNywzMzE4LDMyNDksNzM3MCwyOTc0LDM2MjgsIDkzMCwzMjUwLDM3NDQsNzM3MSwgIDU5LDczNzIsICAjIDM1MjYKIDU4NSwgNjAxLDQwNzgsIDQ5NywzNDE5LDExMTIsMTMxNCw0MzIxLDE4MDEsNzM3MywxMjIzLDE0NzIsMjE3NCw3Mzc0LCA3NDksMTgzNiwgICMgMzU0MgogNjkwLDE4OTksMzc0NSwxNzcyLDM4ODUsMTQ3NiwgNDI5LDEwNDMsMTc5MCwyMjMyLDIxMTYsIDkxNyw0MDc5LCA0NDcsMTA4NiwxNjI5LCAgIyAzNTU4CjczNzUsIDU1Niw3Mzc2LDczNzcsMjAyMCwxNjU0LCA4NDQsMTA5MCwgMTA1LCA1NTAsIDk2NiwxNzU4LDI4MTUsMTAwOCwxNzgyLCA2ODYsICAjIDM1NzQKMTA5NSw3Mzc4LDIyODIsIDc5MywxNjAyLDczNzksMzUxOCwyNTkzLDQzMjIsNDA4MCwyOTMzLDIyOTcsNDMyMywzNzQ2LCA5ODAsMjQ5NiwgICMgMzU5MAogNTQ0LCAzNTMsIDUyNyw0MzI0LCA5MDgsMjY3OCwyODk5LDczODAsIDM4MSwyNjE5LDE5NDIsMTM0OCw3MzgxLDEzNDEsMTI1MiwgNTYwLCAgIyAzNjA2CjMwNzIsNzM4MiwzNDIwLDI4NTYsNzM4MywyMDUzLCA5NzMsIDg4NiwyMDgwLCAxNDMsNDMyNSw3Mzg0LDczODUsIDE1NywzODg2LCA0OTYsICAjIDM2MjIKNDA4MSwgIDU3LCA4NDAsIDU0MCwyMDM4LDQzMjYsNDMyNywzNDIxLDIxMTcsMTQ0NSwgOTcwLDIyNTksMTc0OCwxOTY1LDIwODEsNDA4MiwgICMgMzYzOAozMTE5LDEyMzQsMTc3NSwzMjUxLDI4MTYsMzYyOSwgNzczLDEyMDYsMjEyOSwxMDY2LDIwMzksMTMyNiwzODg3LDE3MzgsMTcyNSw0MDgzLCAgIyAzNjU0CiAyNzksMzEyMCwgIDUxLDE1NDQsMjU5NCwgNDIzLDE1NzgsMjEzMCwyMDY2LCAxNzMsNDMyOCwxODc5LDczODYsNzM4NywxNTgzLCAyNjQsICAjIDM2NzAKIDYxMCwzNjMwLDQzMjksMjQzOSwgMjgwLCAxNTQsNzM4OCw3Mzg5LDczOTAsMTczOSwgMzM4LDEyODIsMzA3MywgNjkzLDI4NTcsMTQxMSwgICMgMzY4NgoxMDc0LDM3NDcsMjQ0MCw3MzkxLDQzMzAsNzM5Miw3MzkzLDEyNDAsIDk1MiwyMzk0LDczOTQsMjkwMCwxNTM4LDI2NzksIDY4NSwxNDgzLCAgIyAzNzAyCjQwODQsMjQ2OCwxNDM2LCA5NTMsNDA4NSwyMDU0LDQzMzEsIDY3MSwyMzk1LCAgNzksNDA4NiwyNDQxLDMyNTIsIDYwOCwgNTY3LDI2ODAsICAjIDM3MTgKMzQyMiw0MDg3LDQwODgsMTY5MSwgMzkzLDEyNjEsMTc5MSwyMzk2LDczOTUsNDMzMiw3Mzk2LDczOTcsNzM5OCw3Mzk5LDEzODMsMTY3MiwgICMgMzczNAozNzQ4LDMxODIsMTQ2NCwgNTIyLDExMTksIDY2MSwxMTUwLCAyMTYsIDY3NSw0MzMzLDM4ODgsMTQzMiwzNTE5LCA2MDksNDMzNCwyNjgxLCAgIyAzNzUwCjIzOTcsNzQwMCw3NDAxLDc0MDIsNDA4OSwzMDI1LCAgIDAsNzQwMywyNDY5LCAzMTUsIDIzMSwyNDQyLCAzMDEsMzMxOSw0MzM1LDIzODAsICAjIDM3NjYKNzQwNCwgMjMzLDQwOTAsMzYzMSwxODE4LDQzMzYsNDMzNyw3NDA1LCAgOTYsMTc3NiwxMzE1LDIwODIsNzQwNiwgMjU3LDc0MDcsMTgwOSwgICMgMzc4MgozNjMyLDI3MDksMTEzOSwxODE5LDQwOTEsMjAyMSwxMTI0LDIxNjMsMjc3OCwxNzc3LDI2NDksNzQwOCwzMDc0LCAzNjMsMTY1NSwzMTgzLCAgIyAzNzk4Cjc0MDksMjk3NSw3NDEwLDc0MTEsNzQxMiwzODg5LDE1NjcsMzg5MCwgNzE4LCAxMDMsMzE4NCwgODQ5LDE0NDMsIDM0MSwzMzIwLDI5MzQsICAjIDM4MTQKMTQ4NCw3NDEzLDE3MTIsIDEyNywgIDY3LCAzMzksNDA5MiwyMzk4LCA2NzksMTQxMiwgODIxLDc0MTQsNzQxNSwgODM0LCA3MzgsIDM1MSwgICMgMzgzMAoyOTc2LDIxNDYsIDg0NiwgMjM1LDE0OTcsMTg4MCwgNDE4LDE5OTIsMzc0OSwyNzEwLCAxODYsMTEwMCwyMTQ3LDI3NDYsMzUyMCwxNTQ1LCAgIyAzODQ2CjEzNTUsMjkzNSwyODU4LDEzNzcsIDU4MywzODkxLDQwOTMsMjU3MywyOTc3LDc0MTYsMTI5OCwzNjMzLDEwNzgsMjU0OSwzNjM0LDIzNTgsICAjIDM4NjIKICA3OCwzNzUwLDM3NTEsIDI2NywxMjg5LDIwOTksMjAwMSwxNTk0LDQwOTQsIDM0OCwgMzY5LDEyNzQsMjE5NCwyMTc1LDE4MzcsNDMzOCwgICMgMzg3OAoxODIwLDI4MTcsMzYzNSwyNzQ3LDIyODMsMjAwMiw0MzM5LDI5MzYsMjc0OCwgMTQ0LDMzMjEsIDg4Miw0MzQwLDM4OTIsMjc0OSwzNDIzLCAgIyAzODk0CjQzNDEsMjkwMSw3NDE3LDQwOTUsMTcyNiwgMzIwLDc0MTgsMzg5MywzMDI2LCA3ODgsMjk3OCw3NDE5LDI4MTgsMTc3MywxMzI3LDI4NTksICAjIDM5MTAKMzg5NCwyODE5LDc0MjAsMTMwNiw0MzQyLDIwMDMsMTcwMCwzNzUyLDM1MjEsMjM1OSwyNjUwLCA3ODcsMjAyMiwgNTA2LCA4MjQsMzYzNiwgICMgMzkyNgogNTM0LCAzMjMsNDM0MywxMDQ0LDMzMjIsMjAyMywxOTAwLCA5NDYsMzQyNCw3NDIxLDE3NzgsMTUwMCwxNjc4LDc0MjIsMTg4MSw0MzQ0LCAgIyAzOTQyCiAxNjUsIDI0Myw0MzQ1LDM2MzcsMjUyMSwgMTIzLCA2ODMsNDA5NiwgNzY0LDQzNDYsICAzNiwzODk1LDE3OTIsIDU4OSwyOTAyLCA4MTYsICAjIDM5NTgKIDYyNiwxNjY3LDMwMjcsMjIzMywxNjM5LDE1NTUsMTYyMiwzNzUzLDM4OTYsNzQyMywzODk3LDI4NjAsMTM3MCwxMjI4LDE5MzIsIDg5MSwgICMgMzk3NAoyMDgzLDI5MDMsIDMwNCw0MDk3LDc0MjQsIDI5MiwyOTc5LDI3MTEsMzUyMiwgNjkxLDIxMDAsNDA5OCwxMTE1LDQzNDcsIDExOCwgNjYyLCAgIyAzOTkwCjc0MjUsIDYxMSwxMTU2LCA4NTQsMjM4MSwxMzE2LDI4NjEsICAgMiwgMzg2LCA1MTUsMjkwNCw3NDI2LDc0MjcsMzI1MywgODY4LDIyMzQsICAjIDQwMDYKMTQ4NiwgODU1LDI2NTEsIDc4NSwyMjEyLDMwMjgsNzQyOCwxMDQwLDMxODUsMzUyMyw3NDI5LDMxMjEsIDQ0OCw3NDMwLDE1MjUsNzQzMSwgICMgNDAyMgoyMTY0LDQzNDgsNzQzMiwzNzU0LDc0MzMsNDA5OSwyODIwLDM1MjQsMzEyMiwgNTAzLCA4MTgsMzg5OCwzMTIzLDE1NjgsIDgxNCwgNjc2LCAgIyA0MDM4CjE0NDQsIDMwNiwxNzQ5LDc0MzQsMzc1NSwxNDE2LDEwMzAsIDE5NywxNDI4LCA4MDUsMjgyMSwxNTAxLDQzNDksNzQzNSw3NDM2LDc0MzcsICAjIDQwNTQKMTk5Myw3NDM4LDQzNTAsNzQzOSw3NDQwLDIxOTUsICAxMywyNzc5LDM2MzgsMjk4MCwzMTI0LDEyMjksMTkxNiw3NDQxLDM3NTYsMjEzMSwgICMgNDA3MAo3NDQyLDQxMDAsNDM1MSwyMzk5LDM1MjUsNzQ0MywyMjEzLDE1MTEsMTcyNywxMTIwLDc0NDQsNzQ0NSwgNjQ2LDM3NTcsMjQ0MywgMzA3LCAgIyA0MDg2Cjc0NDYsNzQ0NywxNTk1LDMxODYsNzQ0OCw3NDQ5LDc0NTAsMzYzOSwxMTEzLDEzNTYsMzg5OSwxNDY1LDI1MjIsMjUyMyw3NDUxLCA1MTksICAjIDQxMDIKNzQ1MiwgMTI4LDIxMzIsICA5MiwyMjg0LDE5NzksNzQ1MywzOTAwLDE1MTIsIDM0MiwzMTI1LDIxOTYsNzQ1NCwyNzgwLDIyMTQsMTk4MCwgICMgNDExOAozMzIzLDc0NTUsIDI5MCwxNjU2LDEzMTcsIDc4OSwgODI3LDIzNjAsNzQ1NiwzNzU4LDQzNTIsIDU2MiwgNTgxLDM5MDEsNzQ1NywgNDAxLCAgIyA0MTM0CjQzNTMsMjI0OCwgIDk0LDQzNTQsMTM5OSwyNzgxLDc0NTgsMTQ2MywyMDI0LDQzNTUsMzE4NywxOTQzLDc0NTksIDgyOCwxMTA1LDQxMDEsICAjIDQxNTAKMTI2MiwxMzk0LDc0NjAsNDEwMiwgNjA1LDQzNTYsNzQ2MSwxNzgzLDI4NjIsNzQ2MiwyODIyLCA4MTksMjEwMSwgNTc4LDIxOTcsMjkzNywgICMgNDE2Ngo3NDYzLDE1MDIsIDQzNiwzMjU0LDQxMDMsMzI1NSwyODIzLDM5MDIsMjkwNSwzNDI1LDM0MjYsNzQ2NCwyNzEyLDIzMTUsNzQ2NSw3NDY2LCAgIyA0MTgyCjIzMzIsMjA2NywgIDIzLDQzNTcsIDE5MywgODI2LDM3NTksMjEwMiwgNjk5LDE2MzAsNDEwNCwzMDc1LCAzOTAsMTc5MywxMDY0LDM1MjYsICAjIDQxOTgKNzQ2NywxNTc5LDMwNzYsMzA3NywxNDAwLDc0NjgsNDEwNSwxODM4LDE2NDAsMjg2Myw3NDY5LDQzNTgsNDM1OSwgMTM3LDQxMDYsIDU5OCwgICMgNDIxNAozMDc4LDE5NjYsIDc4MCwgMTA0LCA5NzQsMjkzOCw3NDcwLCAyNzgsIDg5OSwgMjUzLCA0MDIsIDU3MiwgNTA0LCA0OTMsMTMzOSw3NDcxLCAgIyA0MjMwCjM5MDMsMTI3NSw0MzYwLDI1NzQsMjU1MCw3NDcyLDM2NDAsMzAyOSwzMDc5LDIyNDksIDU2NSwxMzM0LDI3MTMsIDg2MywgIDQxLDc0NzMsICAjIDQyNDYKNzQ3NCw0MzYxLDc0NzUsMTY1NywyMzMzLCAgMTksIDQ2MywyNzUwLDQxMDcsIDYwNiw3NDc2LDI5ODEsMzI1NiwxMDg3LDIwODQsMTMyMywgICMgNDI2MgoyNjUyLDI5ODIsNzQ3NywxNjMxLDE2MjMsMTc1MCw0MTA4LDI2ODIsNzQ3OCwyODY0LCA3OTEsMjcxNCwyNjUzLDIzMzQsIDIzMiwyNDE2LCAgIyA0Mjc4Cjc0NzksMjk4MywxNDk4LDc0ODAsMjY1NCwyNjIwLCA3NTUsMTM2NiwzNjQxLDMyNTcsMzEyNiwyMDI1LDE2MDksIDExOSwxOTE3LDM0MjcsICAjIDQyOTQKIDg2MiwxMDI2LDQxMDksNzQ4MSwzOTA0LDM3NjAsNDM2MiwzOTA1LDQzNjMsMjI2MCwxOTUxLDI0NzAsNzQ4MiwxMTI1LCA4MTcsNDExMCwgICMgNDMxMAo0MTExLDM5MDYsMTUxMywxNzY2LDIwNDAsMTQ4Nyw0MTEyLDMwMzAsMzI1OCwyODI0LDM3NjEsMzEyNyw3NDgzLDc0ODQsMTUwNyw3NDg1LCAgIyA0MzI2CjI2ODMsIDczMywgIDQwLDE2MzIsMTEwNiwyODY1LCAzNDUsNDExMywgODQxLDI1MjQsIDIzMCw0MzY0LDI5ODQsMTg0NiwzMjU5LDM0MjgsICAjIDQzNDIKNzQ4NiwxMjYzLCA5ODYsMzQyOSw3NDg3LCA3MzUsIDg3OSwgMjU0LDExMzcsIDg1NywgNjIyLDEzMDAsMTE4MCwxMzg4LDE1NjIsMzkwNywgICMgNDM1OAozOTA4LDI5MzksIDk2NywyNzUxLDI2NTUsMTM0OSwgNTkyLDIxMzMsMTY5MiwzMzI0LDI5ODUsMTk5NCw0MTE0LDE2NzksMzkwOSwxOTAxLCAgIyA0Mzc0CjIxODUsNzQ4OCwgNzM5LDM2NDIsMjcxNSwxMjk2LDEyOTAsNzQ4OSw0MTE1LDIxOTgsMjE5OSwxOTIxLDE1NjMsMjU5NSwyNTUxLDE4NzAsICAjIDQzOTAKMjc1MiwyOTg2LDc0OTAsIDQzNSw3NDkxLCAzNDMsMTEwOCwgNTk2LCAgMTcsMTc1MSw0MzY1LDIyMzUsMzQzMCwzNjQzLDc0OTIsNDM2NiwgICMgNDQwNgogMjk0LDM1MjcsMjk0MCwxNjkzLCA0NzcsIDk3OSwgMjgxLDIwNDEsMzUyOCwgNjQzLDIwNDIsMzY0NCwyNjIxLDI3ODIsMjI2MSwxMDMxLCAgIyA0NDIyCjIzMzUsMjEzNCwyMjk4LDM1MjksNDM2NywgMzY3LDEyNDksMjU1Miw3NDkzLDM1MzAsNzQ5NCw0MzY4LDEyODMsMzMyNSwyMDA0LCAyNDAsICAjIDQ0MzgKMTc2MiwzMzI2LDQzNjksNDM3MCwgODM2LDEwNjksMzEyOCwgNDc0LDc0OTUsMjE0OCwyNTI1LCAyNjgsMzUzMSw3NDk2LDMxODgsMTUyMSwgICMgNDQ1NAoxMjg0LDc0OTcsMTY1OCwxNTQ2LDQxMTYsNzQ5OCwzNTMyLDM1MzMsNzQ5OSw0MTE3LDMzMjcsMjY4NCwxNjg1LDQxMTgsIDk2MSwxNjczLCAgIyA0NDcwCjI2MjIsIDE5MCwyMDA1LDIyMDAsMzc2Miw0MzcxLDQzNzIsNzUwMCwgNTcwLDI0OTcsMzY0NSwxNDkwLDc1MDEsNDM3MywyNjIzLDMyNjAsICAjIDQ0ODYKMTk1Niw0Mzc0LCA1ODQsMTUxNCwgMzk2LDEwNDUsMTk0NCw3NTAyLDQzNzUsMTk2NywyNDQ0LDc1MDMsNzUwNCw0Mzc2LDM5MTAsIDYxOSwgICMgNDUwMgo3NTA1LDMxMjksMzI2MSwgMjE1LDIwMDYsMjc4MywyNTUzLDMxODksNDM3NywzMTkwLDQzNzgsIDc2Myw0MTE5LDM3NjMsNDM3OSw3NTA2LCAgIyA0NTE4Cjc1MDcsMTk1NywxNzY3LDI5NDEsMzMyOCwzNjQ2LDExNzQsIDQ1MiwxNDc3LDQzODAsMzMyOSwzMTMwLDc1MDgsMjgyNSwxMjUzLDIzODIsICAjIDQ1MzQKMjE4NiwxMDkxLDIyODUsNDEyMCwgNDkyLDc1MDksIDYzOCwxMTY5LDE4MjQsMjEzNSwxNzUyLDM5MTEsIDY0OCwgOTI2LDEwMjEsMTMyNCwgICMgNDU1MAo0MzgxLCA1MjAsNDM4MiwgOTk3LCA4NDcsMTAwNywgODkyLDQzODMsMzc2NCwyMjYyLDE4NzEsMzY0Nyw3NTEwLDI0MDAsMTc4NCw0Mzg0LCAgIyA0NTY2CjE5NTIsMjk0MiwzMDgwLDMxOTEsMTcyOCw0MTIxLDIwNDMsMzY0OCw0Mzg1LDIwMDcsMTcwMSwzMTMxLDE1NTEsICAzMCwyMjYzLDQxMjIsICAjIDQ1ODIKNzUxMSwyMDI2LDQzODYsMzUzNCw3NTEyLCA1MDEsNzUxMyw0MTIzLCA1OTQsMzQzMSwyMTY1LDE4MjEsMzUzNSwzNDMyLDM1MzYsMzE5MiwgICMgNDU5OAogODI5LDI4MjYsNDEyNCw3NTE0LDE2ODAsMzEzMiwxMjI1LDQxMjUsNzUxNSwzMjYyLDQzODcsNDEyNiwzMTMzLDIzMzYsNzUxNiw0Mzg4LCAgIyA0NjE0CjQxMjcsNzUxNywzOTEyLDM5MTMsNzUxOCwxODQ3LDIzODMsMjU5NiwzMzMwLDc1MTksNDM4OSwgMzc0LDM5MTQsIDY1Miw0MTI4LDQxMjksICAjIDQ2MzAKIDM3NSwxMTQwLCA3OTgsNzUyMCw3NTIxLDc1MjIsMjM2MSw0MzkwLDIyNjQsIDU0NiwxNjU5LCAxMzgsMzAzMSwyNDQ1LDQzOTEsNzUyMywgICMgNDY0NgoyMjUwLCA2MTIsMTg0OCwgOTEwLCA3OTYsMzc2NSwxNzQwLDEzNzEsIDgyNSwzNzY2LDM3NjcsNzUyNCwyOTA2LDI1NTQsNzUyNSwgNjkyLCAgIyA0NjYyCiA0NDQsMzAzMiwyNjI0LCA4MDEsNDM5Miw0MTMwLDc1MjYsMTQ5MSwgMjQ0LDEwNTMsMzAzMyw0MTMxLDQxMzIsIDM0MCw3NTI3LDM5MTUsICAjIDQ2NzgKMTA0MSwyOTg3LCAyOTMsMTE2OCwgIDg3LDEzNTcsNzUyOCwxNTM5LCA5NTksNzUyOSwyMjM2LCA3MjEsIDY5NCw0MTMzLDM3NjgsIDIxOSwgICMgNDY5NAoxNDc4LCA2NDQsMTQxNywzMzMxLDI2NTYsMTQxMywxNDAxLDEzMzUsMTM4OSwzOTE2LDc1MzAsNzUzMSwyOTg4LDIzNjIsMzEzNCwxODI1LCAgIyA0NzEwCiA3MzAsMTUxNSwgMTg0LDI4MjcsICA2Niw0MzkzLDc1MzIsMTY2MCwyOTQzLCAyNDYsMzMzMiwgMzc4LDE0NTcsIDIyNiwzNDMzLCA5NzUsICAjIDQ3MjYKMzkxNywyOTQ0LDEyNjQsMzUzNywgNjc0LCA2OTYsNzUzMywgMTYzLDc1MzQsMTE0MSwyNDE3LDIxNjYsIDcxMywzNTM4LDMzMzMsNDM5NCwgICMgNDc0MgozOTE4LDc1MzUsNzUzNiwxMTg2LCAgMTUsNzUzNywxMDc5LDEwNzAsNzUzOCwxNTIyLDMxOTMsMzUzOSwgMjc2LDEwNTAsMjcxNiwgNzU4LCAgIyA0NzU4CjExMjYsIDY1MywyOTQ1LDMyNjMsNzUzOSwyMzM3LCA4ODksMzU0MCwzOTE5LDMwODEsMjk4OSwgOTAzLDEyNTAsNDM5NSwzOTIwLDM0MzQsICAjIDQ3NzQKMzU0MSwxMzQyLDE2ODEsMTcxOCwgNzY2LDMyNjQsIDI4NiwgIDg5LDI5NDYsMzY0OSw3NTQwLDE3MTMsNzU0MSwyNTk3LDMzMzQsMjk5MCwgICMgNDc5MAo3NTQyLDI5NDcsMjIxNSwzMTk0LDI4NjYsNzU0Myw0Mzk2LDI0OTgsMjUyNiwgMTgxLCAzODcsMTA3NSwzOTIxLCA3MzEsMjE4NywzMzM1LCAgIyA0ODA2Cjc1NDQsMzI2NSwgMzEwLCAzMTMsMzQzNSwyMjk5LCA3NzAsNDEzNCwgIDU0LDMwMzQsIDE4OSw0Mzk3LDMwODIsMzc2OSwzOTIyLDc1NDUsICAjIDQ4MjIKMTIzMCwxNjE3LDE4NDksIDM1NSwzNTQyLDQxMzUsNDM5OCwzMzM2LCAxMTEsNDEzNiwzNjUwLDEzNTAsMzEzNSwzNDM2LDMwMzUsNDEzNywgICMgNDgzOAoyMTQ5LDMyNjYsMzU0Myw3NTQ2LDI3ODQsMzkyMywzOTI0LDI5OTEsIDcyMiwyMDA4LDc1NDcsMTA3MSwgMjQ3LDEyMDcsMjMzOCwyNDcxLCAgIyA0ODU0CjEzNzgsNDM5OSwyMDA5LCA4NjQsMTQzNywxMjE0LDQ0MDAsIDM3MywzNzcwLDExNDIsMjIxNiwgNjY3LDQ0MDEsIDQ0MiwyNzUzLDI1NTUsICAjIDQ4NzAKMzc3MSwzOTI1LDE5NjgsNDEzOCwzMjY3LDE4MzksIDgzNywgMTcwLDExMDcsIDkzNCwxMzM2LDE4ODIsNzU0OCw3NTQ5LDIxMTgsNDEzOSwgICMgNDg4NgoyODI4LCA3NDMsMTU2OSw3NTUwLDQ0MDIsNDE0MCwgNTgyLDIzODQsMTQxOCwzNDM3LDc1NTEsMTgwMiw3NTUyLCAzNTcsMTM5NSwxNzI5LCAgIyA0OTAyCjM2NTEsMzI2OCwyNDE4LDE1NjQsMjIzNyw3NTUzLDMwODMsMzc3MiwxNjMzLDQ0MDMsMTExNCwyMDg1LDQxNDEsMTUzMiw3NTU0LCA0ODIsICAjIDQ5MTgKMjQ0Niw0NDA0LDc1NTUsNzU1NiwxNDkyLCA4MzMsMTQ2Niw3NTU3LDI3MTcsMzU0NCwxNjQxLDI4MjksNzU1OCwxNTI2LDEyNzIsMzY1MiwgICMgNDkzNAo0MTQyLDE2ODYsMTc5NCwgNDE2LDI1NTYsMTkwMiwxOTUzLDE4MDMsNzU1OSwzNzczLDI3ODUsMzc3NCwxMTU5LDIzMTYsNzU2MCwyODY3LCAgIyA0OTUwCjQ0MDUsMTYxMCwxNTg0LDMwMzYsMjQxOSwyNzU0LCA0NDMsMzI2OSwxMTYzLDMxMzYsNzU2MSw3NTYyLDM5MjYsNzU2Myw0MTQzLDI0OTksICAjIDQ5NjYKMzAzNyw0NDA2LDM5MjcsMzEzNywyMTAzLDE2NDcsMzU0NSwyMDEwLDE4NzIsNDE0NCw3NTY0LDQxNDUsIDQzMSwzNDM4LDc1NjUsIDI1MCwgICMgNDk4MgogIDk3LCAgODEsNDE0Niw3NTY2LDE2NDgsMTg1MCwxNTU4LCAxNjAsIDg0OCw3NTY3LCA4NjYsIDc0MCwxNjk0LDc1NjgsMjIwMSwyODMwLCAgIyA0OTk4CjMxOTUsNDE0Nyw0NDA3LDM2NTMsMTY4NywgOTUwLDI0NzIsIDQyNiwgNDY5LDMxOTYsMzY1NCwzNjU1LDM5MjgsNzU2OSw3NTcwLDExODgsICAjIDUwMTQKIDQyNCwxOTk1LCA4NjEsMzU0Niw0MTQ4LDM3NzUsMjIwMiwyNjg1LCAxNjgsMTIzNSwzNTQ3LDQxNDksNzU3MSwyMDg2LDE2NzQsNDQwOCwgICMgNTAzMAozMzM3LDMyNzAsIDIyMCwyNTU3LDEwMDksNzU3MiwzNzc2LCA2NzAsMjk5MiwgMzMyLDEyMDgsIDcxNyw3NTczLDc1NzQsMzU0OCwyNDQ3LCAgIyA1MDQ2CjM5MjksMzMzOCw3NTc1LCA1MTMsNzU3NiwxMjA5LDI4NjgsMzMzOSwzMTM4LDQ0MDksMTA4MCw3NTc3LDc1NzgsNzU3OSw3NTgwLDI1MjcsICAjIDUwNjIKMzY1NiwzNTQ5LCA4MTUsMTU4NywzOTMwLDM5MzEsNzU4MSwzNTUwLDM0MzksMzc3NywxMjU0LDQ0MTAsMTMyOCwzMDM4LDEzOTAsMzkzMiwgICMgNTA3OAoxNzQxLDM5MzMsMzc3OCwzOTM0LDc1ODIsIDIzNiwzNzc5LDI0NDgsMzI3MSw3NTgzLDc1ODQsMzY1NywzNzgwLDEyNzMsMzc4MSw0NDExLCAgIyA1MDk0Cjc1ODUsIDMwOCw3NTg2LDQ0MTIsIDI0NSw0NDEzLDE4NTEsMjQ3MywxMzA3LDI1NzUsIDQzMCwgNzE1LDIxMzYsMjQ0OSw3NTg3LCAyNzAsICAjIDUxMTAKIDE5OSwyODY5LDM5MzUsNzU4OCwzNTUxLDI3MTgsMTc1MywgNzYxLDE3NTQsIDcyNSwxNjYxLDE4NDAsNDQxNCwzNDQwLDM2NTgsNzU4OSwgICMgNTEyNgo3NTkwLCA1ODcsICAxNCwzMjcyLCAyMjcsMjU5OCwgMzI2LCA0ODAsMjI2NSwgOTQzLDI3NTUsMzU1MiwgMjkxLCA2NTAsMTg4Myw3NTkxLCAgIyA1MTQyCjE3MDIsMTIyNiwgMTAyLDE1NDcsICA2MiwzNDQxLCA5MDQsNDQxNSwzNDQyLDExNjQsNDE1MCw3NTkyLDc1OTMsMTIyNCwxNTQ4LDI3NTYsICAjIDUxNTgKIDM5MSwgNDk4LDE0OTMsNzU5NCwxMzg2LDE0MTksNzU5NSwyMDU1LDExNzcsNDQxNiwgODEzLCA4ODAsMTA4MSwyMzYzLCA1NjYsMTE0NSwgICMgNTE3NAo0NDE3LDIyODYsMTAwMSwxMDM1LDI1NTgsMjU5OSwyMjM4LCAzOTQsMTI4Niw3NTk2LDc1OTcsMjA2OCw3NTk4LCAgODYsMTQ5NCwxNzMwLCAgIyA1MTkwCjM5MzYsIDQ5MSwxNTg4LCA3NDUsIDg5NywyOTQ4LCA4NDMsMzM0MCwzOTM3LDI3NTcsMjg3MCwzMjczLDE3NjgsIDk5OCwyMjE3LDIwNjksICAjIDUyMDYKIDM5NywxODI2LDExOTUsMTk2OSwzNjU5LDI5OTMsMzM0MSwgMjg0LDc1OTksMzc4MiwyNTAwLDIxMzcsMjExOSwxOTAzLDc2MDAsMzkzOCwgICMgNTIyMgoyMTUwLDM5MzksNDE1MSwxMDM2LDM0NDMsMTkwNCwgMTE0LDI1NTksNDE1MiwgMjA5LDE1MjcsNzYwMSw3NjAyLDI5NDksMjgzMSwyNjI1LCAgIyA1MjM4CjIzODUsMjcxOSwzMTM5LCA4MTIsMjU2MCw3NjAzLDMyNzQsNzYwNCwxNTU5LCA3MzcsMTg4NCwzNjYwLDEyMTAsIDg4NSwgIDI4LDI2ODYsICAjIDUyNTQKMzU1MywzNzgzLDc2MDUsNDE1MywxMDA0LDE3NzksNDQxOCw3NjA2LCAzNDYsMTk4MSwyMjE4LDI2ODcsNDQxOSwzNzg0LDE3NDIsIDc5NywgICMgNTI3MAoxNjQyLDM5NDAsMTkzMywxMDcyLDEzODQsMjE1MSwgODk2LDM5NDEsMzI3NSwzNjYxLDMxOTcsMjg3MSwzNTU0LDc2MDcsMjU2MSwxOTU4LCAgIyA1Mjg2CjQ0MjAsMjQ1MCwxNzg1LDc2MDgsNzYwOSw3NjEwLDM5NDIsNDE1NCwxMDA1LDEzMDgsMzY2Miw0MTU1LDI3MjAsNDQyMSw0NDIyLDE1MjgsICAjIDUzMDIKMjYwMCwgMTYxLDExNzgsNDE1NiwxOTgyLCA5ODcsNDQyMywxMTAxLDQxNTcsIDYzMSwzOTQzLDExNTcsMzE5OCwyNDIwLDEzNDMsMTI0MSwgICMgNTMxOAoxMDE2LDIyMzksMjU2MiwgMzcyLCA4NzcsMjMzOSwyNTAxLDExNjAsIDU1NSwxOTM0LCA5MTEsMzk0NCw3NjExLCA0NjYsMTE3MCwgMTY5LCAgIyA1MzM0CjEwNTEsMjkwNywyNjg4LDM2NjMsMjQ3NCwyOTk0LDExODIsMjAxMSwyNTYzLDEyNTEsMjYyNiw3NjEyLCA5OTIsMjM0MCwzNDQ0LDE1NDAsICAjIDUzNTAKMjcyMSwxMjAxLDIwNzAsMjQwMSwxOTk2LDI0NzUsNzYxMyw0NDI0LCA1MjgsMTkyMiwyMTg4LDE1MDMsMTg3MywxNTcwLDIzNjQsMzM0MiwgICMgNTM2NgozMjc2LDc2MTQsIDU1NywxMDczLDc2MTUsMTgyNywzNDQ1LDIwODcsMjI2NiwzMTQwLDMwMzksMzA4NCwgNzY3LDMwODUsMjc4Niw0NDI1LCAgIyA1MzgyCjEwMDYsNDE1OCw0NDI2LDIzNDEsMTI2NywyMTc2LDM2NjQsMzE5OSwgNzc4LDM5NDUsMzIwMCwyNzIyLDE1OTcsMjY1Nyw3NjE2LDQ0MjcsICAjIDUzOTgKNzYxNywzNDQ2LDc2MTgsNzYxOSw3NjIwLDMyNzcsMjY4OSwxNDMzLDMyNzgsIDEzMSwgIDk1LDE1MDQsMzk0NiwgNzIzLDQxNTksMzE0MSwgICMgNTQxNAoxODQxLDM1NTUsMjc1OCwyMTg5LDM5NDcsMjAyNywyMTA0LDM2NjUsNzYyMSwyOTk1LDM5NDgsMTIxOCw3NjIyLDMzNDMsMzIwMSwzOTQ5LCAgIyA1NDMwCjQxNjAsMjU3NiwgMjQ4LDE2MzQsMzc4NSwgOTEyLDc2MjMsMjgzMiwzNjY2LDMwNDAsMzc4NiwgNjU0LCAgNTMsNzYyNCwyOTk2LDc2MjUsICAjIDU0NDYKMTY4OCw0NDI4LCA3NzcsMzQ0NywxMDMyLDM5NTAsMTQyNSw3NjI2LCAxOTEsIDgyMCwyMTIwLDI4MzMsIDk3MSw0NDI5LCA5MzEsMzIwMiwgICMgNTQ2MgogMTM1LCA2NjQsIDc4MywzNzg3LDE5OTcsIDc3MiwyOTA4LDE5MzUsMzk1MSwzNzg4LDQ0MzAsMjkwOSwzMjAzLCAyODIsMjcyMywgNjQwLCAgIyA1NDc4CjEzNzIsMzQ0OCwxMTI3LCA5MjIsIDMyNSwzMzQ0LDc2MjcsNzYyOCwgNzExLDIwNDQsNzYyOSw3NjMwLDM5NTIsMjIxOSwyNzg3LDE5MzYsICAjIDU0OTQKMzk1MywzMzQ1LDIyMjAsMjI1MSwzNzg5LDIzMDAsNzYzMSw0NDMxLDM3OTAsMTI1OCwzMjc5LDM5NTQsMzIwNCwyMTM4LDI5NTAsMzk1NSwgICMgNTUxMAozOTU2LDc2MzIsMjIyMSwgMjU4LDMyMDUsNDQzMiwgMTAxLDEyMjcsNzYzMywzMjgwLDE3NTUsNzYzNCwxMzkxLDMyODEsNzYzNSwyOTEwLCAgIyA1NTI2CjIwNTYsIDg5Myw3NjM2LDc2MzcsNzYzOCwxNDAyLDQxNjEsMjM0Miw3NjM5LDc2NDAsMzIwNiwzNTU2LDc2NDEsNzY0MiwgODc4LDEzMjUsICAjIDU1NDIKMTc4MCwyNzg4LDQ0MzMsIDI1OSwxMzg1LDI1NzcsIDc0NCwxMTgzLDIyNjcsNDQzNCw3NjQzLDM5NTcsMjUwMiw3NjQ0LCA2ODQsMTAyNCwgICMgNTU1OAo0MTYyLDc2NDUsIDQ3MiwzNTU3LDM0NDksMTE2NSwzMjgyLDM5NTgsMzk1OSwgMzIyLDIxNTIsIDg4MSwgNDU1LDE2OTUsMTE1MiwxMzQwLCAgIyA1NTc0CiA2NjAsIDU1NCwyMTUzLDQ0MzUsMTA1OCw0NDM2LDQxNjMsIDgzMCwxMDY1LDMzNDYsMzk2MCw0NDM3LDE5MjMsNzY0NiwxNzAzLDE5MTgsICAjIDU1OTAKNzY0NywgOTMyLDIyNjgsIDEyMiw3NjQ4LDQ0MzgsIDk0NywgNjc3LDc2NDksMzc5MSwyNjI3LCAyOTcsMTkwNSwxOTI0LDIyNjksNDQzOSwgICMgNTYwNgoyMzE3LDMyODMsNzY1MCw3NjUxLDQxNjQsNzY1Miw0MTY1LCAgODQsNDE2NiwgMTEyLCA5ODksNzY1MywgNTQ3LDEwNTksMzk2MSwgNzAxLCAgIyA1NjIyCjM1NTgsMTAxOSw3NjU0LDQxNjcsNzY1NSwzNDUwLCA5NDIsIDYzOSwgNDU3LDIzMDEsMjQ1MSwgOTkzLDI5NTEsIDQwNywgODUxLCA0OTQsICAjIDU2MzgKNDQ0MCwzMzQ3LCA5MjcsNzY1NiwxMjM3LDc2NTcsMjQyMSwzMzQ4LCA1NzMsNDE2OCwgNjgwLCA5MjEsMjkxMSwxMjc5LDE4NzQsIDI4NSwgICMgNTY1NAogNzkwLDE0NDgsMTk4MywgNzE5LDIxNjcsNzY1OCw3NjU5LDQ0NDEsMzk2MiwzOTYzLDE2NDksNzY2MCwxNTQxLCA1NjMsNzY2MSwxMDc3LCAgIyA1NjcwCjc2NjIsMzM0OSwzMDQxLDM0NTEsIDUxMSwyOTk3LDM5NjQsMzk2NSwzNjY3LDM5NjYsMTI2OCwyNTY0LDMzNTAsMzIwNyw0NDQyLDQ0NDMsICAjIDU2ODYKNzY2MywgNTM1LDEwNDgsMTI3NiwxMTg5LDI5MTIsMjAyOCwzMTQyLDE0MzgsMTM3MywyODM0LDI5NTIsMTEzNCwyMDEyLDc2NjQsNDE2OSwgICMgNTcwMgoxMjM4LDI1NzgsMzA4NiwxMjU5LDc2NjUsIDcwMCw3NjY2LDI5NTMsMzE0MywzNjY4LDQxNzAsNzY2Nyw0MTcxLDExNDYsMTg3NSwxOTA2LCAgIyA1NzE4CjQ0NDQsMjYwMSwzOTY3LCA3ODEsMjQyMiwgMTMyLDE1ODksIDIwMywgMTQ3LCAyNzMsMjc4OSwyNDAyLCA4OTgsMTc4NiwyMTU0LDM5NjgsICAjIDU3MzQKMzk2OSw3NjY4LDM3OTIsMjc5MCw3NjY5LDc2NzAsNDQ0NSw0NDQ2LDc2NzEsMzIwOCw3NjcyLDE2MzUsMzc5MywgOTY1LDc2NzMsMTgwNCwgICMgNTc1MAoyNjkwLDE1MTYsMzU1OSwxMTIxLDEwODIsMTMyOSwzMjg0LDM5NzAsMTQ0OSwzNzk0LCAgNjUsMTEyOCwyODM1LDI5MTMsMjc1OSwxNTkwLCAgIyA1NzY2CjM3OTUsNzY3NCw3Njc1LCAgMTIsMjY1OCwgIDQ1LCA5NzYsMjU3OSwzMTQ0LDQ0NDcsIDUxNywyNTI4LDEwMTMsMTAzNywzMjA5LDc2NzYsICAjIDU3ODIKMzc5NiwyODM2LDc2NzcsMzc5Nyw3Njc4LDM0NTIsNzY3OSwyNjAyLCA2MTQsMTk5OCwyMzE4LDM3OTgsMzA4NywyNzI0LDI2MjgsNzY4MCwgICMgNTc5OAoyNTgwLDQxNzIsIDU5OSwxMjY5LDc2ODEsMTgxMCwzNjY5LDc2ODIsMjY5MSwzMDg4LCA3NTksMTA2MCwgNDg5LDE4MDUsMzM1MSwzMjg1LCAgIyA1ODE0CjEzNTgsNzY4Myw3Njg0LDIzODYsMTM4NywxMjE1LDI2MjksMjI1MiwgNDkwLDc2ODUsNzY4Niw0MTczLDE3NTksMjM4NywyMzQzLDc2ODcsICAjIDU4MzAKNDQ0OCwzNzk5LDE5MDcsMzk3MSwyNjMwLDE4MDYsMzIxMCw0NDQ5LDM0NTMsMzI4NiwyNzYwLDIzNDQsIDg3NCw3Njg4LDc2ODksMzQ1NCwgICMgNTg0NgozNjcwLDE4NTgsICA5MSwyOTE0LDM2NzEsMzA0MiwzODAwLDQ0NTAsNzY5MCwzMTQ1LDM5NzIsMjY1OSw3NjkxLDM0NTUsMTIwMiwxNDAzLCAgIyA1ODYyCjM4MDEsMjk1NCwyNTI5LDE1MTcsMjUwMyw0NDUxLDM0NTYsMjUwNCw3NjkyLDQ0NTIsNzY5MywyNjkyLDE4ODUsMTQ5NSwxNzMxLDM5NzMsICAjIDU4NzgKMjM2NSw0NDUzLDc2OTQsMjAyOSw3Njk1LDc2OTYsMzk3NCwyNjkzLDEyMTYsIDIzNywyNTgxLDQxNzQsMjMxOSwzOTc1LDM4MDIsNDQ1NCwgICMgNTg5NAo0NDU1LDI2OTQsMzU2MCwzNDU3LCA0NDUsNDQ1Niw3Njk3LDc2OTgsNzY5OSw3NzAwLDI3NjEsICA2MSwzOTc2LDM2NzIsMTgyMiwzOTc3LCAgIyA1OTEwCjc3MDEsIDY4NywyMDQ1LCA5MzUsIDkyNSwgNDA1LDI2NjAsIDcwMywxMDk2LDE4NTksMjcyNSw0NDU3LDM5NzgsMTg3NiwxMzY3LDI2OTUsICAjIDU5MjYKMzM1MiwgOTE4LDIxMDUsMTc4MSwyNDc2LCAzMzQsMzI4NywxNjExLDEwOTMsNDQ1OCwgNTY0LDMxNDYsMzQ1OCwzNjczLDMzNTMsIDk0NSwgICMgNTk0MgoyNjMxLDIwNTcsNDQ1OSw3NzAyLDE5MjUsIDg3Miw0MTc1LDc3MDMsMzQ1OSwyNjk2LDMwODksIDM0OSw0MTc2LDM2NzQsMzk3OSw0NDYwLCAgIyA1OTU4CjM4MDMsNDE3NywzNjc1LDIxNTUsMzk4MCw0NDYxLDQ0NjIsNDE3OCw0NDYzLDI0MDMsMjA0NiwgNzgyLDM5ODEsIDQwMCwgMjUxLDQxNzksICAjIDU5NzQKMTYyNCw3NzA0LDc3MDUsIDI3NywzNjc2LCAyOTksMTI2NSwgNDc2LDExOTEsMzgwNCwyMTIxLDQxODAsNDE4MSwxMTA5LCAyMDUsNzcwNiwgICMgNTk5MAoyNTgyLDEwMDAsMjE1NiwzNTYxLDE4NjAsNzcwNyw3NzA4LDc3MDksNDQ2NCw3NzEwLDQ0NjUsMjU2NSwgMTA3LDI0NzcsMjE1NywzOTgyLCAgIyA2MDA2CjM0NjAsMzE0Nyw3NzExLDE1MzMsIDU0MSwxMzAxLCAxNTgsIDc1Myw0MTgyLDI4NzIsMzU2Miw3NzEyLDE2OTYsIDM3MCwxMDg4LDQxODMsICAjIDYwMjIKNDQ2NiwzNTYzLCA1NzksIDMyNywgNDQwLCAxNjIsMjI0MCwgMjY5LDE5MzcsMTM3NCwzNDYxLCA5NjgsMzA0MywgIDU2LDEzOTYsMzA5MCwgICMgNjAzOAoyMTA2LDMyODgsMzM1NCw3NzEzLDE5MjYsMjE1OCw0NDY3LDI5OTgsNzcxNCwzNTY0LDc3MTUsNzcxNiwzNjc3LDQ0NjgsMjQ3OCw3NzE3LCAgIyA2MDU0CjI3OTEsNzcxOCwxNjUwLDQ0NjksNzcxOSwyNjAzLDc3MjAsNzcyMSwzOTgzLDI2NjEsMzM1NSwxMTQ5LDMzNTYsMzk4NCwzODA1LDM5ODUsICAjIDYwNzAKNzcyMiwxMDc2LCAgNDksNzcyMywgOTUxLDMyMTEsMzI4OSwzMjkwLCA0NTAsMjgzNywgOTIwLDc3MjQsMTgxMSwyNzkyLDIzNjYsNDE4NCwgICMgNjA4NgoxOTA4LDExMzgsMjM2NywzODA2LDM0NjIsNzcyNSwzMjEyLDQ0NzAsMTkwOSwxMTQ3LDE1MTgsMjQyMyw0NDcxLDM4MDcsNzcyNiw0NDcyLCAgIyA2MTAyCjIzODgsMjYwNCwgMjYwLDE3OTUsMzIxMyw3NzI3LDc3MjgsMzgwOCwzMjkxLCA3MDgsNzcyOSwzNTY1LDE3MDQsNzczMCwzNTY2LDEzNTEsICAjIDYxMTgKMTYxOCwzMzU3LDI5OTksMTg4NiwgOTQ0LDQxODUsMzM1OCw0MTg2LDMwNDQsMzM1OSw0MTg3LDc3MzEsMzY3OCwgNDIyLCA0MTMsMTcxNCwgICMgNjEzNAozMjkyLCA1MDAsMjA1OCwyMzQ1LDQxODgsMjQ3OSw3NzMyLDEzNDQsMTkxMCwgOTU0LDc3MzMsMTY2OCw3NzM0LDc3MzUsMzk4NiwyNDA0LCAgIyA2MTUwCjQxODksMzU2NywzODA5LDQxOTAsNzczNiwyMzAyLDEzMTgsMjUwNSwzMDkxLCAxMzMsMzA5MiwyODczLDQ0NzMsIDYyOSwgIDMxLDI4MzgsICAjIDYxNjYKMjY5NywzODEwLDQ0NzQsIDg1MCwgOTQ5LDQ0NzUsMzk4NywyOTU1LDE3MzIsMjA4OCw0MTkxLDE0OTYsMTg1Miw3NzM3LDM5ODgsIDYyMCwgICMgNjE4MgozMjE0LCA5ODEsMTI0MiwzNjc5LDMzNjAsMTYxOSwzNjgwLDE2NDMsMzI5MywyMTM5LDI0NTIsMTk3MCwxNzE5LDM0NjMsMjE2OCw3NzM4LCAgIyA2MTk4CjMyMTUsNzczOSw3NzQwLDMzNjEsMTgyOCw3NzQxLDEyNzcsNDQ3NiwxNTY1LDIwNDcsNzc0MiwxNjM2LDM1NjgsMzA5Myw3NzQzLCA4NjksICAjIDYyMTQKMjgzOSwgNjU1LDM4MTEsMzgxMiwzMDk0LDM5ODksMzAwMCwzODEzLDEzMTAsMzU2OSw0NDc3LDc3NDQsNzc0NSw3NzQ2LDE3MzMsIDU1OCwgICMgNjIzMAo0NDc4LDM2ODEsIDMzNSwxNTQ5LDMwNDUsMTc1Niw0MTkyLDM2ODIsMTk0NSwzNDY0LDE4MjksMTI5MSwxMTkyLCA0NzAsMjcyNiwyMTA3LCAgIyA2MjQ2CjI3OTMsIDkxMywxMDU0LDM5OTAsNzc0NywxMDI3LDc3NDgsMzA0NiwzOTkxLDQ0NzksIDk4MiwyNjYyLDMzNjIsMzE0OCwzNDY1LDMyMTYsICAjIDYyNjIKMzIxNywxOTQ2LDI3OTQsNzc0OSwgNTcxLDQ0ODAsNzc1MCwxODMwLDc3NTEsMzU3MCwyNTgzLDE1MjMsMjQyNCw3NzUyLDIwODksIDk4NCwgICMgNjI3OAo0NDgxLDM2ODMsMTk1OSw3NzUzLDM2ODQsIDg1MiwgOTIzLDI3OTUsMzQ2NiwzNjg1LCA5NjksMTUxOSwgOTk5LDIwNDgsMjMyMCwxNzA1LCAgIyA2Mjk0Cjc3NTQsMzA5NSwgNjE1LDE2NjIsIDE1MSwgNTk3LDM5OTIsMjQwNSwyMzIxLDEwNDksIDI3NSw0NDgyLDM2ODYsNDE5MywgNTY4LDM2ODcsICAjIDYzMTAKMzU3MSwyNDgwLDQxOTQsMzY4OCw3NzU1LDI0MjUsMjI3MCwgNDA5LDMyMTgsNzc1NiwxNTY2LDI4NzQsMzQ2NywxMDAyLCA3NjksMjg0MCwgICMgNjMyNgogMTk0LDIwOTAsMzE0OSwzNjg5LDIyMjIsMzI5NCw0MTk1LCA2MjgsMTUwNSw3NzU3LDc3NTgsMTc2MywyMTc3LDMwMDEsMzk5MywgNTIxLCAgIyA2MzQyCjExNjEsMjU4NCwxNzg3LDIyMDMsMjQwNiw0NDgzLDM5OTQsMTYyNSw0MTk2LDQxOTcsIDQxMiwgIDQyLDMwOTYsIDQ2NCw3NzU5LDI2MzIsICAjIDYzNTgKNDQ4NCwzMzYzLDE3NjAsMTU3MSwyODc1LDM0NjgsMjUzMCwxMjE5LDIyMDQsMzgxNCwyNjMzLDIxNDAsMjM2OCw0NDg1LDQ0ODYsMzI5NSwgICMgNjM3NAoxNjUxLDMzNjQsMzU3Miw3NzYwLDc3NjEsMzU3MywyNDgxLDM0NjksNzc2MiwzNjkwLDc3NjMsNzc2NCwyMjcxLDIwOTEsIDQ2MCw3NzY1LCAgIyA2MzkwCjQ0ODcsNzc2NiwzMDAyLCA5NjIsIDU4OCwzNTc0LCAyODksMzIxOSwyNjM0LDExMTYsICA1Miw3NzY3LDMwNDcsMTc5Niw3NzY4LDc3NjksICAjIDY0MDYKNzc3MCwxNDY3LDc3NzEsMTU5OCwxMTQzLDM2OTEsNDE5OCwxOTg0LDE3MzQsMTA2Nyw0NDg4LDEyODAsMzM2NSwgNDY1LDQ0ODksMTU3MiwgICMgNjQyMgogNTEwLDc3NzIsMTkyNywyMjQxLDE4MTIsMTY0NCwzNTc1LDc3NzMsNDQ5MCwzNjkyLDc3NzQsNzc3NSwyNjYzLDE1NzMsMTUzNCw3Nzc2LCAgIyA2NDM4Cjc3NzcsNDE5OSwgNTM2LDE4MDcsMTc2MSwzNDcwLDM4MTUsMzE1MCwyNjM1LDc3NzgsNzc3OSw3NzgwLDQ0OTEsMzQ3MSwyOTE1LDE5MTEsICAjIDY0NTQKMjc5Niw3NzgxLDMyOTYsMTEyMiwgMzc3LDMyMjAsNzc4MiwgMzYwLDc3ODMsNzc4NCw0MjAwLDE1MjksIDU1MSw3Nzg1LDIwNTksMzY5MywgICMgNjQ3MAoxNzY5LDI0MjYsNzc4NiwyOTE2LDQyMDEsMzI5NywzMDk3LDIzMjIsMjEwOCwyMDMwLDQ0OTIsMTQwNCwgMTM2LDE0NjgsMTQ3OSwgNjcyLCAgIyA2NDg2CjExNzEsMzIyMSwyMzAzLCAyNzEsMzE1MSw3Nzg3LDI3NjIsNzc4OCwyMDQ5LCA2NzgsMjcyNywgODY1LDE5NDcsNDQ5Myw3Nzg5LDIwMTMsICAjIDY1MDIKMzk5NSwyOTU2LDc3OTAsMjcyOCwyMjIzLDEzOTcsMzA0OCwzNjk0LDQ0OTQsNDQ5NSwxNzM1LDI5MTcsMzM2NiwzNTc2LDc3OTEsMzgxNiwgICMgNjUxOAogNTA5LDI4NDEsMjQ1MywyODc2LDM4MTcsNzc5Miw3NzkzLDMxNTIsMzE1Myw0NDk2LDQyMDIsMjUzMSw0NDk3LDIzMDQsMTE2NiwxMDEwLCAgIyA2NTM0CiA1NTIsIDY4MSwxODg3LDc3OTQsNzc5NSwyOTU3LDI5NTgsMzk5NiwxMjg3LDE1OTYsMTg2MSwzMTU0LCAzNTgsIDQ1MywgNzM2LCAxNzUsICAjIDY1NTAKIDQ3OCwxMTE3LCA5MDUsMTE2NywxMDk3LDc3OTYsMTg1MywxNTMwLDc3OTcsMTcwNiw3Nzk4LDIxNzgsMzQ3MiwyMjg3LDM2OTUsMzQ3MywgICMgNjU2NgozNTc3LDQyMDMsMjA5Miw0MjA0LDc3OTksMzM2NywxMTkzLDI0ODIsNDIwNSwxNDU4LDIxOTAsMjIwNSwxODYyLDE4ODgsMTQyMSwzMjk4LCAgIyA2NTgyCjI5MTgsMzA0OSwyMTc5LDM0NzQsIDU5NSwyMTIyLDc4MDAsMzk5Nyw3ODAxLDc4MDIsNDIwNiwxNzA3LDI2MzYsIDIyMywzNjk2LDEzNTksICAjIDY1OTgKIDc1MSwzMDk4LCAxODMsMzQ3NSw3ODAzLDI3OTcsMzAwMywgNDE5LDIzNjksIDYzMywgNzA0LDM4MTgsMjM4OSwgMjQxLDc4MDQsNzgwNSwgICMgNjYxNAo3ODA2LCA4MzgsMzAwNCwzNjk3LDIyNzIsMjc2MywyNDU0LDM4MTksMTkzOCwyMDUwLDM5OTgsMTMwOSwzMDk5LDIyNDIsMTE4MSw3ODA3LCAgIyA2NjMwCjExMzYsMjIwNiwzODIwLDIzNzAsMTQ0Niw0MjA3LDIzMDUsNDQ5OCw3ODA4LDc4MDksNDIwOCwxMDU1LDI2MDUsIDQ4NCwzNjk4LDc4MTAsICAjIDY2NDYKMzk5OSwgNjI1LDQyMDksMjI3MywzMzY4LDE0OTksNDIxMCw0MDAwLDc4MTEsNDAwMSw0MjExLDMyMjIsMjI3NCwyMjc1LDM0NzYsNzgxMiwgICMgNjY2Mgo3ODEzLDI3NjQsIDgwOCwyNjA2LDM2OTksMzM2OSw0MDAyLDQyMTIsMzEwMCwyNTMyLCA1MjYsMzM3MCwzODIxLDQyMTMsIDk1NSw3ODE0LCAgIyA2Njc4CjE2MjAsNDIxNCwyNjM3LDI0MjcsNzgxNSwxNDI5LDM3MDAsMTY2OSwxODMxLCA5OTQsIDkyOCw3ODE2LDM1NzgsMTI2MCw3ODE3LDc4MTgsICAjIDY2OTQKNzgxOSwxOTQ4LDIyODgsIDc0MSwyOTE5LDE2MjYsNDIxNSwyNzI5LDI0NTUsIDg2NywxMTg0LCAzNjIsMzM3MSwxMzkyLDc4MjAsNzgyMSwgICMgNjcxMAo0MDAzLDQyMTYsMTc3MCwxNzM2LDMyMjMsMjkyMCw0NDk5LDQ1MDAsMTkyOCwyNjk4LDE0NTksMTE1OCw3ODIyLDMwNTAsMzM3MiwyODc3LCAgIyA2NzI2CjEyOTIsMTkyOSwyNTA2LDI4NDIsMzcwMSwxOTg1LDExODcsMjA3MSwyMDE0LDI2MDcsNDIxNyw3ODIzLDI1NjYsMjUwNywyMTY5LDM3MDIsICAjIDY3NDIKMjQ4MywzMjk5LDc4MjQsMzcwMyw0NTAxLDc4MjUsNzgyNiwgNjY2LDEwMDMsMzAwNSwxMDIyLDM1NzksNDIxOCw3ODI3LDQ1MDIsMTgxMywgICMgNjc1OAoyMjUzLCA1NzQsMzgyMiwxNjAzLCAyOTUsMTUzNSwgNzA1LDM4MjMsNDIxOSwgMjgzLCA4NTgsIDQxNyw3ODI4LDc4MjksMzIyNCw0NTAzLCAgIyA2Nzc0CjQ1MDQsMzA1MSwxMjIwLDE4ODksMTA0NiwyMjc2LDI0NTYsNDAwNCwxMzkzLDE1OTksIDY4OSwyNTY3LCAzODgsNDIyMCw3ODMwLDI0ODQsICAjIDY3OTAKIDgwMiw3ODMxLDI3OTgsMzgyNCwyMDYwLDE0MDUsMjI1NCw3ODMyLDQ1MDUsMzgyNSwyMTA5LDEwNTIsMTM0NSwzMjI1LDE1ODUsNzgzMywgICMgNjgwNgogODA5LDc4MzQsNzgzNSw3ODM2LCA1NzUsMjczMCwzNDc3LCA5NTYsMTU1MiwxNDY5LDExNDQsMjMyMyw3ODM3LDIzMjQsMTU2MCwyNDU3LCAgIyA2ODIyCjM1ODAsMzIyNiw0MDA1LCA2MTYsMjIwNywzMTU1LDIxODAsMjI4OSw3ODM4LDE4MzIsNzgzOSwzNDc4LDQ1MDYsNzg0MCwxMzE5LDM3MDQsICAjIDY4MzgKMzcwNSwxMjExLDM1ODEsMTAyMywzMjI3LDEyOTMsMjc5OSw3ODQxLDc4NDIsNzg0MywzODI2LCA2MDcsMjMwNiwzODI3LCA3NjIsMjg3OCwgICMgNjg1NAoxNDM5LDQyMjEsMTM2MCw3ODQ0LDE0ODUsMzA1Miw3ODQ1LDQ1MDcsMTAzOCw0MjIyLDE0NTAsMjA2MSwyNjM4LDQyMjMsMTM3OSw0NTA4LCAgIyA2ODcwCjI1ODUsNzg0Niw3ODQ3LDQyMjQsMTM1MiwxNDE0LDIzMjUsMjkyMSwxMTcyLDc4NDgsNzg0OSwzODI4LDM4MjksNzg1MCwxNzk3LDE0NTEsICAjIDY4ODYKNzg1MSw3ODUyLDc4NTMsNzg1NCwyOTIyLDQwMDYsNDAwNywyNDg1LDIzNDYsIDQxMSw0MDA4LDQwMDksMzU4MiwzMzAwLDMxMDEsNDUwOSwgICMgNjkwMgoxNTYxLDI2NjQsMTQ1Miw0MDEwLDEzNzUsNzg1NSw3ODU2LCAgNDcsMjk1OSwgMzE2LDc4NTcsMTQwNiwxNTkxLDI5MjMsMzE1Niw3ODU4LCAgIyA2OTE4CjEwMjUsMjE0MSwzMTAyLDMxNTcsIDM1NCwyNzMxLCA4ODQsMjIyNCw0MjI1LDI0MDcsIDUwOCwzNzA2LCA3MjYsMzU4MywgOTk2LDI0MjgsICAjIDY5MzQKMzU4NCwgNzI5LDc4NTksIDM5MiwyMTkxLDE0NTMsNDAxMSw0NTEwLDM3MDcsNzg2MCw3ODYxLDI0NTgsMzU4NSwyNjA4LDE2NzUsMjgwMCwgICMgNjk1MAogOTE5LDIzNDcsMjk2MCwyMzQ4LDEyNzAsNDUxMSw0MDEyLCAgNzMsNzg2Miw3ODYzLCA2NDcsNzg2NCwzMjI4LDI4NDMsMjI1NSwxNTUwLCAgIyA2OTY2CjEzNDYsMzAwNiw3ODY1LDEzMzIsIDg4MywzNDc5LDc4NjYsNzg2Nyw3ODY4LDc4NjksMzMwMSwyNzY1LDc4NzAsMTIxMiwgODMxLDEzNDcsICAjIDY5ODIKNDIyNiw0NTEyLDIzMjYsMzgzMCwxODYzLDMwNTMsIDcyMCwzODMxLDQ1MTMsNDUxNCwzODMyLDc4NzEsNDIyNyw3ODcyLDc4NzMsNDUxNSwgICMgNjk5OAo3ODc0LDc4NzUsMTc5OCw0NTE2LDM3MDgsMjYwOSw0NTE3LDM1ODYsMTY0NSwyMzcxLDc4NzYsNzg3NywyOTI0LCA2NjksMjIwOCwyNjY1LCAgIyA3MDE0CjI0MjksNzg3OCwyODc5LDc4NzksNzg4MCwxMDI4LDMyMjksNzg4MSw0MjI4LDI0MDgsNzg4MiwyMjU2LDEzNTMsNzg4Myw3ODg0LDQ1MTgsICAjIDcwMzAKMzE1OCwgNTE4LDc4ODUsNDAxMyw3ODg2LDQyMjksMTk2MCw3ODg3LDIxNDIsNDIzMCw3ODg4LDc4ODksMzAwNywyMzQ5LDIzNTAsMzgzMywgICMgNzA0NgogNTE2LDE4MzMsMTQ1NCw0MDE0LDI2OTksNDIzMSw0NTE5LDIyMjUsMjYxMCwxOTcxLDExMjksMzU4Nyw3ODkwLDI3NjYsNzg5MSwyOTYxLCAgIyA3MDYyCjE0MjIsIDU3NywxNDcwLDMwMDgsMTUyNCwzMzczLDc4OTIsNzg5MywgNDMyLDQyMzIsMzA1NCwzNDgwLDc4OTQsMjU4NiwxNDU1LDI1MDgsICAjIDcwNzgKMjIyNiwxOTcyLDExNzUsNzg5NSwxMDIwLDI3MzIsNDAxNSwzNDgxLDQ1MjAsNzg5NiwyNzMzLDc4OTcsMTc0MywxMzYxLDMwNTUsMzQ4MiwgICMgNzA5NAoyNjM5LDQwMTYsNDIzMyw0NTIxLDIyOTAsIDg5NSwgOTI0LDQyMzQsMjE3MCwgMzMxLDIyNDMsMzA1NiwgMTY2LDE2MjcsMzA1NywxMDk4LCAgIyA3MTEwCjc4OTgsMTIzMiwyODgwLDIyMjcsMzM3NCw0NTIyLCA2NTcsIDQwMywxMTk2LDIzNzIsIDU0MiwzNzA5LDMzNzUsMTYwMCw0MjM1LDM0ODMsICAjIDcxMjYKNzg5OSw0NTIzLDI3NjcsMzIzMCwgNTc2LCA1MzAsMTM2Miw3OTAwLDQ1MjQsMjUzMywyNjY2LDM3MTAsNDAxNyw3OTAxLCA4NDIsMzgzNCwgICMgNzE0Mgo3OTAyLDI4MDEsMjAzMSwxMDE0LDQwMTgsIDIxMywyNzAwLDMzNzYsIDY2NSwgNjIxLDQyMzYsNzkwMywzNzExLDI5MjUsMjQzMCw3OTA0LCAgIyA3MTU4CjI0MzEsMzMwMiwzNTg4LDMzNzcsNzkwNSw0MjM3LDI1MzQsNDIzOCw0NTI1LDM1ODksMTY4Miw0MjM5LDM0ODQsMTM4MCw3OTA2LCA3MjQsICAjIDcxNzQKMjI3NywgNjAwLDE2NzAsNzkwNywxMzM3LDEyMzMsNDUyNiwzMTAzLDIyNDQsNzkwOCwxNjIxLDQ1MjcsNzkwOSwgNjUxLDQyNDAsNzkxMCwgICMgNzE5MAoxNjEyLDQyNDEsMjYxMSw3OTExLDI4NDQsNzkxMiwyNzM0LDIzMDcsMzA1OCw3OTEzLCA3MTYsMjQ1OSwzMDU5LCAxNzQsMTI1NSwyNzAxLCAgIyA3MjA2CjQwMTksMzU5MCwgNTQ4LDEzMjAsMTM5OCwgNzI4LDQwMjAsMTU3NCw3OTE0LDE4OTAsMTE5NywzMDYwLDQwMjEsNzkxNSwzMDYxLDMwNjIsICAjIDcyMjIKMzcxMiwzNTkxLDM3MTMsIDc0Nyw3OTE2LCA2MzUsNDI0Miw0NTI4LDc5MTcsNzkxOCw3OTE5LDQyNDMsNzkyMCw3OTIxLDQ1MjksNzkyMiwgICMgNzIzOAozMzc4LDQ1MzAsMjQzMiwgNDUxLDc5MjMsMzcxNCwyNTM1LDIwNzIsNDI0NCwyNzM1LDQyNDUsNDAyMiw3OTI0LDE3NjQsNDUzMSw3OTI1LCAgIyA3MjU0CjQyNDYsIDM1MCw3OTI2LDIyNzgsMjM5MCwyNDg2LDc5MjcsNDI0Nyw0MDIzLDIyNDUsMTQzNCw0MDI0LCA0ODgsNDUzMiwgNDU4LDQyNDgsICAjIDcyNzAKNDAyNSwzNzE1LCA3NzEsMTMzMCwyMzkxLDM4MzUsMjU2OCwzMTU5LDIxNTksMjQwOSwxNTUzLDI2NjcsMzE2MCw0MjQ5LDc5MjgsMjQ4NywgICMgNzI4NgoyODgxLDI2MTIsMTcyMCwyNzAyLDQyNTAsMzM3OSw0NTMzLDc5MjksMjUzNiw0MjUxLDc5MzAsMzIzMSw0MjUyLDI3NjgsNzkzMSwyMDE1LCAgIyA3MzAyCjI3MzYsNzkzMiwxMTU1LDEwMTcsMzcxNiwzODM2LDc5MzMsMzMwMywyMzA4LCAyMDEsMTg2NCw0MjUzLDE0MzAsNzkzNCw0MDI2LDc5MzUsICAjIDczMTgKNzkzNiw3OTM3LDc5MzgsNzkzOSw0MjU0LDE2MDQsNzk0MCwgNDE0LDE4NjUsIDM3MSwyNTg3LDQ1MzQsNDUzNSwzNDg1LDIwMTYsMzEwNCwgICMgNzMzNAo0NTM2LDE3MDgsIDk2MCw0MjU1LCA4ODcsIDM4OSwyMTcxLDE1MzYsMTY2MywxNzIxLDc5NDEsMjIyOCw0MDI3LDIzNTEsMjkyNiwxNTgwLCAgIyA3MzUwCjc5NDIsNzk0Myw3OTQ0LDE3NDQsNzk0NSwyNTM3LDQ1MzcsNDUzOCw3OTQ2LDQ1MzksNzk0NywyMDczLDc5NDgsNzk0OSwzNTkyLDMzODAsICAjIDczNjYKMjg4Miw0MjU2LDc5NTAsNDI1NywyNjQwLDMzODEsMjgwMiwgNjczLDI3MDMsMjQ2MCwgNzA5LDM0ODYsNDAyOCwzNTkzLDQyNTgsNzk1MSwgICMgNzM4MgoxMTQ4LCA1MDIsIDYzNCw3OTUyLDc5NTMsMTIwNCw0NTQwLDM1OTQsMTU3NSw0NTQxLDI2MTMsMzcxNyw3OTU0LDM3MTgsMzEwNSwgOTQ4LCAgIyA3Mzk4CjMyMzIsIDEyMSwxNzQ1LDM4MzcsMTExMCw3OTU1LDQyNTksMzA2MywyNTA5LDMwMDksNDAyOSwzNzE5LDExNTEsMTc3MSwzODM4LDE0ODgsICAjIDc0MTQKNDAzMCwxOTg2LDc5NTYsMjQzMywzNDg3LDc5NTcsNzk1OCwyMDkzLDc5NTksNDI2MCwzODM5LDEyMTMsMTQwNywyODAzLCA1MzEsMjczNywgICMgNzQzMAoyNTM4LDMyMzMsMTAxMSwxNTM3LDc5NjAsMjc2OSw0MjYxLDMxMDYsMTA2MSw3OTYxLDM3MjAsMzcyMSwxODY2LDI4ODMsNzk2MiwyMDE3LCAgIyA3NDQ2CiAxMjAsNDI2Miw0MjYzLDIwNjIsMzU5NSwzMjM0LDIzMDksMzg0MCwyNjY4LDMzODIsMTk1NCw0NTQyLDc5NjMsNzk2NCwzNDg4LDEwNDcsICAjIDc0NjIKMjcwNCwxMjY2LDc5NjUsMTM2OCw0NTQzLDI4NDUsIDY0OSwzMzgzLDM4NDEsMjUzOSwyNzM4LDExMDIsMjg0NiwyNjY5LDc5NjYsNzk2NywgICMgNzQ3OAoxOTk5LDc5NjgsMTExMSwzNTk2LDI5NjIsNzk2OSwyNDg4LDM4NDIsMzU5NywyODA0LDE4NTQsMzM4NCwzNzIyLDc5NzAsNzk3MSwzMzg1LCAgIyA3NDk0CjI0MTAsMjg4NCwzMzA0LDMyMzUsMzU5OCw3OTcyLDI1NjksNzk3MywzNTk5LDI4MDUsNDAzMSwxNDYwLCA4NTYsNzk3NCwzNjAwLDc5NzUsICAjIDc1MTAKMjg4NSwyOTYzLDc5NzYsMjg4NiwzODQzLDc5NzcsNDI2NCwgNjMyLDI1MTAsIDg3NSwzODQ0LDE2OTcsMzg0NSwyMjkxLDc5NzgsNzk3OSwgICMgNzUyNgo0NTQ0LDMwMTAsMTIzOSwgNTgwLDQ1NDUsNDI2NSw3OTgwLCA5MTQsIDkzNiwyMDc0LDExOTAsNDAzMiwxMDM5LDIxMjMsNzk4MSw3OTgyLCAgIyA3NTQyCjc5ODMsMzM4NiwxNDczLDc5ODQsMTM1NCw0MjY2LDM4NDYsNzk4NSwyMTcyLDMwNjQsNDAzMywgOTE1LDMzMDUsNDI2Nyw0MjY4LDMzMDYsICAjIDc1NTgKMTYwNSwxODM0LDc5ODYsMjczOSwgMzk4LDM2MDEsNDI2OSwzODQ3LDQwMzQsIDMyOCwxOTEyLDI4NDcsNDAzNSwzODQ4LDEzMzEsNDI3MCwgICMgNzU3NAozMDExLCA5MzcsNDI3MSw3OTg3LDM2MDIsNDAzNiw0MDM3LDMzODcsMjE2MCw0NTQ2LDMzODgsIDUyNCwgNzQyLCA1MzgsMzA2NSwxMDEyLCAgIyA3NTkwCjc5ODgsNzk4OSwzODQ5LDI0NjEsNzk5MCwgNjU4LDExMDMsIDIyNSwzODUwLDc5OTEsNzk5Miw0NTQ3LDc5OTMsNDU0OCw3OTk0LDMyMzYsICAjIDc2MDYKMTI0Myw3OTk1LDQwMzgsIDk2MywyMjQ2LDQ1NDksNzk5NiwyNzA1LDM2MDMsMzE2MSw3OTk3LDc5OTgsMjU4OCwyMzI3LDc5OTksNDU1MCwgICMgNzYyMgo4MDAwLDgwMDEsODAwMiwzNDg5LDMzMDcsIDk1NywzMzg5LDI1NDAsMjAzMiwxOTMwLDI5MjcsMjQ2MiwgODcwLDIwMTgsMzYwNCwxNzQ2LCAgIyA3NjM4CjI3NzAsMjc3MSwyNDM0LDI0NjMsODAwMywzODUxLDgwMDQsMzcyMywzMTA3LDM3MjQsMzQ5MCwzMzkwLDM3MjUsODAwNSwxMTc5LDMwNjYsICAjIDc2NTQKODAwNiwzMTYyLDIzNzMsNDI3MiwzNzI2LDI1NDEsMzE2MywzMTA4LDI3NDAsNDAzOSw4MDA3LDMzOTEsMTU1NiwyNTQyLDIyOTIsIDk3NywgICMgNzY3MAoyODg3LDIwMzMsNDA0MCwxMjA1LDMzOTIsODAwOCwxNzY1LDMzOTMsMzE2NCwyMTI0LDEyNzEsMTY4OSwgNzE0LDQ1NTEsMzQ5MSw4MDA5LCAgIyA3Njg2CjIzMjgsMzg1MiwgNTMzLDQyNzMsMzYwNSwyMTgxLCA2MTcsODAxMCwyNDY0LDMzMDgsMzQ5MiwyMzEwLDgwMTEsODAxMiwzMTY1LDgwMTMsICAjIDc3MDIKODAxNCwzODUzLDE5ODcsIDYxOCwgNDI3LDI2NDEsMzQ5MywzMzk0LDgwMTUsODAxNiwxMjQ0LDE2OTAsODAxNywyODA2LDQyNzQsNDU1MiwgICMgNzcxOAo4MDE4LDM0OTQsODAxOSw4MDIwLDIyNzksMTU3NiwgNDczLDM2MDYsNDI3NSwzMzk1LCA5NzIsODAyMSwzNjA3LDgwMjIsMzA2Nyw4MDIzLCAgIyA3NzM0CjgwMjQsNDU1Myw0NTU0LDgwMjUsMzcyNyw0MDQxLDQwNDIsODAyNiwgMTUzLDQ1NTUsIDM1Niw4MDI3LDE4OTEsMjg4OCw0Mjc2LDIxNDMsICAjIDc3NTAKIDQwOCwgODAzLDIzNTIsODAyOCwzODU0LDgwMjksNDI3NywxNjQ2LDI1NzAsMjUxMSw0NTU2LDQ1NTcsMzg1NSw4MDMwLDM4NTYsNDI3OCwgICMgNzc2Ngo4MDMxLDI0MTEsMzM5NiwgNzUyLDgwMzIsODAzMywxOTYxLDI5NjQsODAzNCwgNzQ2LDMwMTIsMjQ2NSw4MDM1LDQyNzksMzcyOCwgNjk4LCAgIyA3NzgyCjQ1NTgsMTg5Miw0MjgwLDM2MDgsMjU0Myw0NTU5LDM2MDksMzg1Nyw4MDM2LDMxNjYsMzM5Nyw4MDM3LDE4MjMsMTMwMiw0MDQzLDI3MDYsICAjIDc3OTgKMzg1OCwxOTczLDQyODEsODAzOCw0MjgyLDMxNjcsIDgyMywxMzAzLDEyODgsMTIzNiwyODQ4LDM0OTUsNDA0NCwzMzk4LCA3NzQsMzg1OSwgICMgNzgxNAo4MDM5LDE1ODEsNDU2MCwxMzA0LDI4NDksMzg2MCw0NTYxLDgwNDAsMjQzNSwyMTYxLDEwODMsMzIzNyw0MjgzLDQwNDUsNDI4NCwgMzQ0LCAgIyA3ODMwCjExNzMsIDI4OCwyMzExLCA0NTQsMTY4Myw4MDQxLDgwNDIsMTQ2MSw0NTYyLDQwNDYsMjU4OSw4MDQzLDgwNDQsNDU2MywgOTg1LCA4OTQsICAjIDc4NDYKODA0NSwzMzk5LDMxNjgsODA0NiwxOTEzLDI5MjgsMzcyOSwxOTg4LDgwNDcsMjExMCwxOTc0LDgwNDgsNDA0Nyw4MDQ5LDI1NzEsMTE5NCwgICMgNzg2MgogNDI1LDgwNTAsNDU2NCwzMTY5LDEyNDUsMzczMCw0Mjg1LDgwNTEsODA1MiwyODUwLDgwNTMsIDYzNiw0NTY1LDE4NTUsMzg2MSwgNzYwLCAgIyA3ODc4CjE3OTksODA1NCw0Mjg2LDIyMDksMTUwOCw0NTY2LDQwNDgsMTg5MywxNjg0LDIyOTMsODA1NSw4MDU2LDgwNTcsNDI4Nyw0Mjg4LDIyMTAsICAjIDc4OTQKIDQ3OSw4MDU4LDgwNTksIDgzMiw4MDYwLDQwNDksMjQ4OSw4MDYxLDI5NjUsMjQ5MCwzNzMxLCA5OTAsMzEwOSwgNjI3LDE4MTQsMjY0MiwgICMgNzkxMAo0Mjg5LDE1ODIsNDI5MCwyMTI1LDIxMTEsMzQ5Niw0NTY3LDgwNjIsIDc5OSw0MjkxLDMxNzAsODA2Myw0NTY4LDIxMTIsMTczNywzMDEzLCAgIyA3OTI2CjEwMTgsIDU0MywgNzU0LDQyOTIsMzMwOSwxNjc2LDQ1NjksNDU3MCw0MDUwLDgwNjQsMTQ4OSw4MDY1LDM0OTcsODA2NiwyNjE0LDI4ODksICAjIDc5NDIKNDA1MSw4MDY3LDgwNjgsMjk2Niw4MDY5LDgwNzAsODA3MSw4MDcyLDMxNzEsNDU3MSw0NTcyLDIxODIsMTcyMiw4MDczLDMyMzgsMzIzOSwgICMgNzk1OAoxODQyLDM2MTAsMTcxNSwgNDgxLCAzNjUsMTk3NSwxODU2LDgwNzQsODA3NSwxOTYyLDI0OTEsNDU3Myw4MDc2LDIxMjYsMzYxMSwzMjQwLCAgIyA3OTc0CiA0MzMsMTg5NCwyMDYzLDIwNzUsODA3NywgNjAyLDI3NDEsODA3OCw4MDc5LDgwODAsODA4MSw4MDgyLDMwMTQsMTYyOCwzNDAwLDgwODMsICAjIDc5OTAKMzE3Miw0NTc0LDQwNTIsMjg5MCw0NTc1LDI1MTIsODA4NCwyNTQ0LDI3NzIsODA4NSw4MDg2LDgwODcsMzMxMCw0NTc2LDI4OTEsODA4OCwgICMgODAwNgo0NTc3LDgwODksMjg1MSw0NTc4LDQ1NzksMTIyMSwyOTY3LDQwNTMsMjUxMyw4MDkwLDgwOTEsODA5MiwxODY3LDE5ODksODA5Myw4MDk0LCAgIyA4MDIyCjgwOTUsMTg5NSw4MDk2LDgwOTcsNDU4MCwxODk2LDQwNTQsIDMxOCw4MDk4LDIwOTQsNDA1NSw0MjkzLDgwOTksODEwMCwgNDg1LDgxMDEsICAjIDgwMzgKIDkzOCwzODYyLCA1NTMsMjY3MCwgMTE2LDgxMDIsMzg2MywzNjEyLDgxMDMsMzQ5OCwyNjcxLDI3NzMsMzQwMSwzMzExLDI4MDcsODEwNCwgICMgODA1NAozNjEzLDI5MjksNDA1NiwxNzQ3LDI5MzAsMjk2OCw4MTA1LDgxMDYsIDIwNyw4MTA3LDgxMDgsMjY3Miw0NTgxLDI1MTQsODEwOSwzMDE1LCAgIyA4MDcwCiA4OTAsMzYxNCwzODY0LDgxMTAsMTg3NywzNzMyLDM0MDIsODExMSwyMTgzLDIzNTMsMzQwMywxNjUyLDgxMTIsODExMyw4MTE0LCA5NDEsICAjIDgwODYKMjI5NCwgMjA4LDM0OTksNDA1NywyMDE5LCAzMzAsNDI5NCwzODY1LDI4OTIsMjQ5MiwzNzMzLDQyOTUsODExNSw4MTE2LDgxMTcsODExOCwgICMgODEwMgopCgpQSwMEFAAAAAAAAAAhAKBBjRjTBgAA0wYAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IEVVQ1RXRGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBFVUNUV19TTV9NT0RFTAoKY2xhc3MgRVVDVFdQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoRVVDVFdQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShFVUNUV19TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEVVQ1RXRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkVVQy1UVyIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIlRhaXdhbiIKUEsDBBQAAAAAAAAAIQAZRdLX61AAAOtQAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMmZyZXEucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgR0IyMzEyIG1vc3QgZnJlcXVlbnRseSB1c2VkIGNoYXJhY3RlciB0YWJsZQojCiMgQ2hhciB0byBGcmVxT3JkZXIgdGFibGUgLCBmcm9tIGh6Njc2MwoKIyA1MTIgIC0tPiAwLjc5ICAtLSAwLjc5CiMgMTAyNCAtLT4gMC45MiAgLS0gMC4xMwojIDIwNDggLS0+IDAuOTggIC0tIDAuMDYKIyA2NzY4IC0tPiAxLjAwICAtLSAwLjAyCiMKIyBJZGVhbCBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjc5MTM1LygxLTAuNzkxMzUpID0gMy43OQojIFJhbmRvbSBEaXN0cmlidXRpb24gUmF0aW9uID0gNTEyIC8gKDM3NTUgLSA1MTIpID0gMC4xNTcKIwojIFR5cGljYWwgRGlzdHJpYnV0aW9uIFJhdGlvIGFib3V0IDI1JSBvZiBJZGVhbCBvbmUsIHN0aWxsIG11Y2ggaGlnaGVyIHRoYXQgUkRSCgpHQjIzMTJfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8gPSAwLjkKCkdCMjMxMl9UQUJMRV9TSVpFID0gMzc2MAoKR0IyMzEyX0NIQVJfVE9fRlJFUV9PUkRFUiA9ICgKMTY3MSwgNzQ5LDE0NDMsMjM2NCwzOTI0LDM4MDcsMjMzMCwzOTIxLDE3MDQsMzQ2MywyNjkxLDE1MTEsMTUxNSwgNTcyLDMxOTEsMjIwNSwKMjM2MSwgMjI0LDI1NTgsIDQ3OSwxNzExLCA5NjMsMzE2MiwgNDQwLDQwNjAsMTkwNSwyOTY2LDI5NDcsMzU4MCwyNjQ3LDM5NjEsMzg0MiwKMjIwNCwgODY5LDQyMDcsIDk3MCwyNjc4LDU2MjYsMjk0NCwyOTU2LDE0NzksNDA0OCwgNTE0LDM1OTUsIDU4OCwxMzQ2LDI4MjAsMzQwOSwKIDI0OSw0MDg4LDE3NDYsMTg3MywyMDQ3LDE3NzQsIDU4MSwxODEzLCAzNTgsMTE3NCwzNTkwLDEwMTQsMTU2MSw0ODQ0LDIyNDUsIDY3MCwKMTYzNiwzMTEyLCA4ODksMTI4NiwgOTUzLCA1NTYsMjMyNywzMDYwLDEyOTAsMzE0MSwgNjEzLCAxODUsMzQ3NywxMzY3LCA4NTAsMzgyMCwKMTcxNSwyNDI4LDI2NDIsMjMwMywyNzMyLDMwNDEsMjU2MiwyNjQ4LDM1NjYsMzk0NiwxMzQ5LCAzODgsMzA5OCwyMDkxLDEzNjAsMzU4NSwKIDE1MiwxNjg3LDE1MzksIDczOCwxNTU5LCAgNTksMTIzMiwyOTI1LDIyNjcsMTM4OCwxMjQ5LDE3NDEsMTY3OSwyOTYwLCAxNTEsMTU2NiwKMTEyNSwxMzUyLDQyNzEsIDkyNCw0Mjk2LCAzODUsMzE2Niw0NDU5LCAzMTAsMTI0NSwyODUwLCAgNzAsMzI4NSwyNzI5LDM1MzQsMzU3NSwKMjM5OCwzMjk4LDM0NjYsMTk2MCwyMjY1LCAyMTcsMzY0NywgODY0LDE5MDksMjA4NCw0NDAxLDI3NzMsMTAxMCwzMjY5LDUxNTIsIDg1MywKMzA1MSwzMTIxLDEyNDQsNDI1MSwxODk1LCAzNjQsMTQ5OSwxNTQwLDIzMTMsMTE4MCwzNjU1LDIyNjgsIDU2MiwgNzE1LDI0MTcsMzA2MSwKIDU0NCwgMzM2LDM3NjgsMjM4MCwxNzUyLDQwNzUsIDk1MCwgMjgwLDI0MjUsNDM4MiwgMTgzLDI3NTksMzI3MiwgMzMzLDQyOTcsMjE1NSwKMTY4OCwyMzU2LDE0NDQsMTAzOSw0NTQwLCA3MzYsMTE3NywzMzQ5LDI0NDMsMjM2OCwyMTQ0LDIyMjUsIDU2NSwgMTk2LDE0ODIsMzQwNiwKIDkyNywxMzM1LDQxNDcsIDY5MiwgODc4LDEzMTEsMTY1MywzOTExLDM2MjIsMTM3OCw0MjAwLDE4NDAsMjk2OSwzMTQ5LDIxMjYsMTgxNiwKMjUzNCwxNTQ2LDIzOTMsMjc2MCwgNzM3LDI0OTQsICAxMywgNDQ3LCAyNDUsMjc0NywgIDM4LDI3NjUsMjEyOSwyNTg5LDEwNzksIDYwNiwKIDM2MCwgNDcxLDM3NTUsMjg5MCwgNDA0LCA4NDgsIDY5OSwxNzg1LDEyMzYsIDM3MCwyMjIxLDEwMjMsMzc0NiwyMDc0LDIwMjYsMjAyMywKMjM4OCwxNTgxLDIxMTksIDgxMiwxMTQxLDMwOTEsMjUzNiwxNTE5LCA4MDQsMjA1MywgNDA2LDE1OTYsMTA5MCwgNzg0LCA1NDgsNDQxNCwKMTgwNiwyMjY0LDI5MzYsMTEwMCwgMzQzLDQxMTQsNTA5NiwgNjIyLDMzNTgsIDc0MywzNjY4LDE1MTAsMTYyNiw1MDIwLDM1NjcsMjUxMywKMzE5NSw0MTE1LDU2MjcsMjQ4OSwyOTkxLCAgMjQsMjA2NSwyNjk3LDEwODcsMjcxOSwgIDQ4LDE2MzQsIDMxNSwgIDY4LCA5ODUsMjA1MiwKIDE5OCwyMjM5LDEzNDcsMTEwNywxNDM5LCA1OTcsMjM2NiwyMTcyLCA4NzEsMzMwNywgOTE5LDI0ODcsMjc5MCwxODY3LCAyMzYsMjU3MCwKMTQxMywzNzk0LCA5MDYsMzM2NSwzMzgxLDE3MDEsMTk4MiwxODE4LDE1MjQsMjkyNCwxMjA1LCA2MTYsMjU4NiwyMDcyLDIwMDQsIDU3NSwKIDI1MywzMDk5LCAgMzIsMTM2NSwxMTgyLCAxOTcsMTcxNCwyNDU0LDEyMDEsIDU1NCwzMzg4LDMyMjQsMjc0OCwgNzU2LDI1ODcsIDI1MCwKMjU2NywxNTA3LDE1MTcsMzUyOSwxOTIyLDI3NjEsMjMzNywzNDE2LDE5NjEsMTY3NywyNDUyLDIyMzgsMzE1MywgNjE1LCA5MTEsMTUwNiwKMTQ3NCwyNDk1LDEyNjUsMTkwNiwyNzQ5LDM3NTYsMzI4MCwyMTYxLCA4OTgsMjcxNCwxNzU5LDM0NTAsMjI0MywyNDQ0LCA1NjMsICAyNiwKMzI4NiwyMjY2LDM3NjksMzM0NCwyNzA3LDM2NzcsIDYxMSwxNDAyLCA1MzEsMTAyOCwyODcxLDQ1NDgsMTM3NSwgMjYxLDI5NDgsIDgzNSwKMTE5MCw0MTM0LCAzNTMsIDg0MCwyNjg0LDE5MDAsMzA4MiwxNDM1LDIxMDksMTIwNywxNjc0LCAzMjksMTg3MiwyNzgxLDQwNTUsMjY4NiwKMjEwNCwgNjA4LDMzMTgsMjQyMywyOTU3LDI3NjgsMTEwOCwzNzM5LDM1MTIsMzI3MSwzOTg1LDIyMDMsMTc3MSwzNTIwLDE0MTgsMjA1NCwKMTY4MSwxMTUzLCAyMjUsMTYyNywyOTI5LCAxNjIsMjA1MCwyNTExLDM2ODcsMTk1NCwgMTI0LDE4NTksMjQzMSwxNjg0LDMwMzIsMjg5NCwKIDU4NSw0ODA1LDM5NjksMjg2OSwyNzA0LDIwODgsMjAzMiwyMDk1LDM2NTYsMjYzNSw0MzYyLDIyMDksIDI1NiwgNTE4LDIwNDIsMjEwNSwKMzc3NywzNjU3LCA2NDMsMjI5OCwxMTQ4LDE3NzksIDE5MCwgOTg5LDM1NDQsIDQxNCwgIDExLDIxMzUsMjA2MywyOTc5LDE0NzEsIDQwMywKMzY3OCwgMTI2LCA3NzAsMTU2MywgNjcxLDI0OTksMzIxNiwyODc3LCA2MDAsMTE3OSwgMzA3LDI4MDUsNDkzNywxMjY4LDEyOTcsMjY5NCwKIDI1Miw0MDMyLDE0NDgsMTQ5NCwxMzMxLDEzOTQsIDEyNywyMjU2LCAyMjIsMTY0NywxMDM1LDE0ODEsMzA1NiwxOTE1LDEwNDgsIDg3MywKMzY1MSwgMjEwLCAgMzMsMTYwOCwyNTE2LCAyMDAsMTUyMCwgNDE1LCAxMDIsICAgMCwzMzg5LDEyODcsIDgxNywgIDkxLDMyOTksMjk0MCwKIDgzNiwxODE0LCA1NDksMjE5NywxMzk2LDE2NjksMjk4NywzNTgyLDIyOTcsMjg0OCw0NTI4LDEwNzAsIDY4NywgIDIwLDE4MTksIDEyMSwKMTU1MiwxMzY0LDE0NjEsMTk2OCwyNjE3LDM1NDAsMjgyNCwyMDgzLCAxNzcsIDk0OCw0OTM4LDIyOTEsIDExMCw0NTQ5LDIwNjYsIDY0OCwKMzM1OSwxNzU1LDIxMTAsMjExNCw0NjQyLDQ4NDUsMTY5MywzOTM3LDMzMDgsMTI1NywxODY5LDIxMjMsIDIwOCwxODA0LDMxNTksMjk5MiwKMjUzMSwyNTQ5LDMzNjEsMjQxOCwxMzUwLDIzNDcsMjgwMCwyNTY4LDEyOTEsMjAzNiwyNjgwLCAgNzIsIDg0MiwxOTkwLCAyMTIsMTIzMywKMTE1NCwxNTg2LCAgNzUsMjAyNywzNDEwLDQ5MDAsMTgyMywxMzM3LDI3MTAsMjY3NiwgNzI4LDI4MTAsMTUyMiwzMDI2LDQ5OTUsIDE1NywKIDc1NSwxMDUwLDQwMjIsIDcxMCwgNzg1LDE5MzYsMjE5NCwyMDg1LDE0MDYsMjc3NywyNDAwLCAxNTAsMTI1MCw0MDQ5LDEyMDYsIDgwNywKMTkxMCwgNTM0LCA1MjksMzMwOSwxNzIxLDE2NjAsIDI3NCwgIDM5LDI4MjcsIDY2MSwyNjcwLDE1NzgsIDkyNSwzMjQ4LDM4MTUsMTA5NCwKNDI3OCw0OTAxLDQyNTIsICA0MSwxMTUwLDM3NDcsMjU3MiwyMjI3LDQ1MDEsMzY1OCw0OTAyLDM4MTMsMzM1NywzNjE3LDI4ODQsMjI1OCwKIDg4NywgNTM4LDQxODcsMzE5OSwxMjk0LDI0MzksMzA0MiwyMzI5LDIzNDMsMjQ5NywxMjU1LCAxMDcsIDU0MywxNTI3LCA1MjEsMzQ3OCwKMzU2OCwgMTk0LDUwNjIsICAxNSwgOTYxLDM4NzAsMTI0MSwxMTkyLDI2NjQsICA2Niw1MjE1LDMyNjAsMjExMSwxMjk1LDExMjcsMjE1MiwKMzgwNSw0MTM1LCA5MDEsMTE2NCwxOTc2LCAzOTgsMTI3OCwgNTMwLDE0NjAsIDc0OCwgOTA0LDEwNTQsMTk2NiwxNDI2LCAgNTMsMjkwOSwKIDUwOSwgNTIzLDIyNzksMTUzNCwgNTM2LDEwMTksIDIzOSwxNjg1LCA0NjAsMjM1MywgNjczLDEwNjUsMjQwMSwzNjAwLDQyOTgsMjI3MiwKMTI3MiwyMzYzLCAyODQsMTc1MywzNjc5LDQwNjQsMTY5NSwgIDgxLCA4MTUsMjY3NywyNzU3LDI3MzEsMTM4NiwgODU5LCA1MDAsNDIyMSwKMjE5MCwyNTY2LCA3NTcsMTAwNiwyNTE5LDIwNjgsMTE2NiwxNDU1LCAzMzcsMjY1NCwzMjAzLDE4NjMsMTY4MiwxOTE0LDMwMjUsMTI1MiwKMTQwOSwxMzY2LCA4NDcsIDcxNCwyODM0LDIwMzgsMzIwOSwgOTY0LDI5NzAsMTkwMSwgODg1LDI1NTMsMTA3OCwxNzU2LDMwNDksIDMwMSwKMTU3MiwzMzI2LCA2ODgsMjEzMCwxOTk2LDI0MjksMTgwNSwxNjQ4LDI5MzAsMzQyMSwyNzUwLDM2NTIsMzA4OCwgMjYyLDExNTgsMTI1NCwKIDM4OSwxNjQxLDE4MTIsIDUyNiwxNzE5LCA5MjMsMjA3MywxMDczLDE5MDIsIDQ2OCwgNDg5LDQ2MjUsMTE0MCwgODU3LDIzNzUsMzA3MCwKMzMxOSwyODYzLCAzODAsIDExNiwxMzI4LDI2OTMsMTE2MSwyMjQ0LCAyNzMsMTIxMiwxODg0LDI3NjksMzAxMSwxNzc1LDExNDIsIDQ2MSwKMzA2NiwxMjAwLDIxNDcsMjIxMiwgNzkwLCA3MDIsMjY5NSw0MjIyLDE2MDEsMTA1OCwgNDM0LDIzMzgsNTE1MywzNjQwLCAgNjcsMjM2MCwKNDA5OSwyNTAyLCA2MTgsMzQ3MiwxMzI5LCA0MTYsMTEzMiwgODMwLDI3ODIsMTgwNywyNjUzLDMyMTEsMzUxMCwxNjYyLCAxOTIsMjEyNCwKIDI5NiwzOTc5LDE3MzksMTYxMSwzNjg0LCAgMjMsIDExOCwgMzI0LCA0NDYsMTIzOSwxMjI1LCAyOTMsMjUyMCwzODE0LDM3OTUsMjUzNSwKMzExNiwgIDE3LDEwNzQsIDQ2NywyNjkyLDIyMDEsIDM4NywyOTIyLCAgNDUsMTMyNiwzMDU1LDE2NDUsMzY1OSwyODE3LCA5NTgsIDI0MywKMTkwMywyMzIwLDEzMzksMjgyNSwxNzg0LDMyODksIDM1NiwgNTc2LCA4NjUsMjMxNSwyMzgxLDMzNzcsMzkxNiwxMDg4LDMxMjIsMTcxMywKMTY1NSwgOTM1LCA2MjgsNDY4OSwxMDM0LDEzMjcsIDQ0MSwgODAwLCA3MjAsIDg5NCwxOTc5LDIxODMsMTUyOCw1Mjg5LDI3MDIsMTA3MSwKNDA0NiwzNTcyLDIzOTksMTU3MSwzMjgxLCAgNzksIDc2MSwxMTAzLCAzMjcsIDEzNCwgNzU4LDE4OTksMTM3MSwxNjE1LCA4NzksIDQ0MiwKIDIxNSwyNjA1LDI1NzksIDE3MywyMDQ4LDI0ODUsMTA1NywyOTc1LDMzMTcsMTA5NywyMjUzLDM4MDEsNDI2MywxNDAzLDE2NTAsMjk0NiwKIDgxNCw0OTY4LDM0ODcsMTU0OCwyNjQ0LDE1NjcsMTI4NSwgICAyLCAyOTUsMjYzNiwgIDk3LCA5NDYsMzU3NiwgODMyLCAxNDEsNDI1NywKMzI3MywgNzYwLDM4MjEsMzUyMSwzMTU2LDI2MDcsIDk0OSwxMDI0LDE3MzMsMTUxNiwxODAzLDE5MjAsMjEyNSwyMjgzLDI2NjUsMzE4MCwKMTUwMSwyMDY0LDM1NjAsMjE3MSwxNTkyLCA4MDMsMzUxOCwxNDE2LCA3MzIsMzg5Nyw0MjU4LDEzNjMsMTM2MiwyNDU4LCAxMTksMTQyNywKIDYwMiwxNTI1LDI2MDgsMTYwNSwxNjM5LDMxNzUsIDY5NCwzMDY0LCAgMTAsIDQ2NSwgIDc2LDIwMDAsNDg0Niw0MjA4LCA0NDQsMzc4MSwKMTYxOSwzMzUzLDIyMDYsMTI3MywzNzk2LCA3NDAsMjQ4MywgMzIwLDE3MjMsMjM3NywzNjYwLDI2MTksMTM1OSwxMTM3LDE3NjIsMTcyNCwKMjM0NSwyODQyLDE4NTAsMTg2MiwgOTEyLCA4MjEsMTg2NiwgNjEyLDI2MjUsMTczNSwyNTczLDMzNjksMTA5MywgODQ0LCAgODksIDkzNywKIDkzMCwxNDI0LDM1NjQsMjQxMywyOTcyLDEwMDQsMzA0NiwzMDE5LDIwMTEsIDcxMSwzMTcxLDE0NTIsNDE3OCwgNDI4LCA4MDEsMTk0MywKIDQzMiwgNDQ1LDI4MTEsIDIwNiw0MTM2LDE0NzIsIDczMCwgMzQ5LCAgNzMsIDM5NywyODAyLDI1NDcsIDk5OCwxNjM3LDExNjcsIDc4OSwKIDM5NiwzMjE3LCAxNTQsMTIxOCwgNzE2LDExMjAsMTc4MCwyODE5LDQ4MjYsMTkzMSwzMzM0LDM3NjIsMjEzOSwxMjE1LDI2MjcsIDU1MiwKMzY2NCwzNjI4LDMyMzIsMTQwNSwyMzgzLDMxMTEsMTM1NiwyNjUyLDM1NzcsMzMyMCwzMTAxLDE3MDMsIDY0MCwxMDQ1LDEzNzAsMTI0NiwKNDk5NiwgMzcxLDE1NzUsMjQzNiwxNjIxLDIyMTAsIDk4NCw0MDMzLDE3MzQsMjYzOCwgIDE2LDQ1MjksIDY2MywyNzU1LDMyNTUsMTQ1MSwKMzkxNywyMjU3LDEyNTMsMTk1NSwyMjM0LDEyNjMsMjk1MSwgMjE0LDEyMjksIDYxNywgNDg1LCAzNTksMTgzMSwxOTY5LCA0NzMsMjMxMCwKIDc1MCwyMDU4LCAxNjUsICA4MCwyODY0LDI0MTksIDM2MSw0MzQ0LDI0MTYsMjQ3OSwxMTM0LCA3OTYsMzcyNiwxMjY2LDI5NDMsIDg2MCwKMjcxNSwgOTM4LCAzOTAsMjczNCwxMzEzLDEzODQsIDI0OCwgMjAyLCA4NzcsMTA2NCwyODU0LCA1MjIsMzkwNywgMjc5LDE2MDIsIDI5NywKMjM1NywgMzk1LDM3NDAsIDEzNywyMDc1LCA5NDQsNDA4OSwyNTg0LDEyNjcsMzgwMiwgIDYyLDE1MzMsMjI4NSwgMTc4LCAxNzYsIDc4MCwKMjQ0MCwgMjAxLDM3MDcsIDU5MCwgNDc4LDE1NjAsNDM1NCwyMTE3LDEwNzUsICAzMCwgIDc0LDQ2NDMsNDAwNCwxNjM1LDE0NDEsMjc0NSwKIDc3NiwyNTk2LCAyMzgsMTA3NywxNjkyLDE5MTIsMjg0NCwgNjA1LCA0OTksMTc0MiwzOTQ3LCAyNDEsMzA1MywgOTgwLDE3NDksIDkzNiwKMjY0MCw0NTExLDI1ODIsIDUxNSwxNTQzLDIxNjIsNTMyMiwyODkyLDI5OTMsIDg5MCwyMTQ4LDE5MjQsIDY2NSwxODI3LDM1ODEsMTAzMiwKIDk2OCwzMTYzLCAzMzksMTA0NCwxODk2LCAyNzAsIDU4MywxNzkxLDE3MjAsNDM2NywxMTk0LDM0ODgsMzY2OSwgIDQzLDI1MjMsMTY1NywKIDE2MywyMTY3LCAyOTAsMTIwOSwxNjIyLDMzNzgsIDU1MCwgNjM0LDI1MDgsMjUxMCwgNjk1LDI2MzQsMjM4NCwyNTEyLDE0NzYsMTQxNCwKIDIyMCwxNDY5LDIzNDEsMjEzOCwyODUyLDMxODMsMjkwMCw0OTM5LDI4NjUsMzUwMiwxMjExLDM2ODAsIDg1NCwzMjI3LDEyOTksMjk3NiwKMzE3MiwgMTg2LDI5OTgsMTQ1OSwgNDQzLDEwNjcsMzI1MSwxNDk1LCAzMjEsMTkzMiwzMDU0LCA5MDksIDc1MywxNDEwLDE4MjgsIDQzNiwKMjQ0MSwxMTE5LDE1ODcsMzE2NCwyMTg2LDEyNTgsIDIyNywgMjMxLDE0MjUsMTg5MCwzMjAwLDM5NDIsIDI0NywgOTU5LCA3MjUsNTI1NCwKMjc0MSwgNTc3LDIxNTgsMjA3OSwgOTI5LCAxMjAsIDE3NCwgODM4LDI4MTMsIDU5MSwxMTE1LCA0MTcsMjAyNCwgIDQwLDMyNDAsMTUzNiwKMTAzNywgMjkxLDQxNTEsMjM1NCwgNjMyLDEyOTgsMjQwNiwyNTAwLDM1MzUsMTgyNSwxODQ2LDM0NTEsIDIwNSwxMTcxLCAzNDUsNDIzOCwKICAxOCwxMTYzLCA4MTEsIDY4NSwyMjA4LDEyMTcsIDQyNSwxMzEyLDE1MDgsMTE3NSw0MzA4LDI1NTIsMTAzMywgNTg3LDEzODEsMzA1OSwKMjk4NCwzNDgyLCAzNDAsMTMxNiw0MDIzLDM5NzIsIDc5MiwzMTc2LCA1MTksIDc3Nyw0NjkwLCA5MTgsIDkzMyw0MTMwLDI5ODEsMzc0MSwKICA5MCwzMzYwLDI5MTEsMjIwMCw1MTg0LDQ1NTAsIDYwOSwzMDc5LDIwMzAsIDI3MiwzMzc5LDI3MzYsIDM2MywzODgxLDExMzAsMTQ0NywKIDI4NiwgNzc5LCAzNTcsMTE2OSwzMzUwLDMxMzcsMTYzMCwxMjIwLDI2ODcsMjM5MSwgNzQ3LDEyNzcsMzY4OCwyNjE4LDI2ODIsMjYwMSwKMTE1NiwzMTk2LDUyOTAsNDAzNCwzMTAyLDE2ODksMzU5NiwzMTI4LCA4NzQsIDIxOSwyNzgzLCA3OTgsIDUwOCwxODQzLDI0NjEsIDI2OSwKMTY1OCwxNzc2LDEzOTIsMTkxMywyOTgzLDMyODcsMjg2NiwyMTU5LDIzNzIsIDgyOSw0MDc2LCAgNDYsNDI1MywyODczLDE4ODksMTg5NCwKIDkxNSwxODM0LDE2MzEsMjE4MSwyMzE4LCAyOTgsIDY2NCwyODE4LDM1NTUsMjczNSwgOTU0LDMyMjgsMzExNywgNTI3LDM1MTEsMjE3MywKIDY4MSwyNzEyLDMwMzMsMjI0NywyMzQ2LDM0NjcsMTY1MiwgMTU1LDIxNjQsMzM4MiwgMTEzLDE5OTQsIDQ1MCwgODk5LCA0OTQsIDk5NCwKMTIzNywyOTU4LDE4NzUsMjMzNiwxOTI2LDM3MjcsIDU0NSwxNTc3LDE1NTAsIDYzMywzNDczLCAyMDQsMTMwNSwzMDcyLDI0MTAsMTk1NiwKMjQ3MSwgNzA3LDIxMzQsIDg0MSwyMTk1LDIxOTYsMjY2MywzODQzLDEwMjYsNDk0MCwgOTkwLDMyNTIsNDk5NywgMzY4LDEwOTIsIDQzNywKMzIxMiwzMjU4LDE5MzMsMTgyOSwgNjc1LDI5NzcsMjg5MywgNDEyLCA5NDMsMzcyMyw0NjQ0LDMyOTQsMzI4MywyMjMwLDIzNzMsNTE1NCwKMjM4OSwyMjQxLDI2NjEsMjMyMywxNDA0LDI1MjQsIDU5MywgNzg3LCA2NzcsMzAwOCwxMjc1LDIwNTksIDQzOCwyNzA5LDI2MDksMjI0MCwKMjI2OSwyMjQ2LDE0NDYsICAzNiwxNTY4LDEzNzMsMzg5MiwxNTc0LDIzMDEsMTQ1NiwzOTYyLCA2OTMsMjI3Niw1MjE2LDIwMzUsMTE0MywKMjcyMCwxOTE5LDE3OTcsMTgxMSwyNzYzLDQxMzcsMjU5NywxODMwLDE2OTksMTQ4OCwxMTk4LDIwOTAsIDQyNCwxNjk0LCAzMTIsMzYzNCwKMzM5MCw0MTc5LDMzMzUsMjI1MiwxMjE0LCA1NjEsMTA1OSwzMjQzLDIyOTUsMjU2MSwgOTc1LDUxNTUsMjMyMSwyNzUxLDM3NzIsIDQ3MiwKMTUzNywzMjgyLDMzOTgsMTA0NywyMDc3LDIzNDgsMjg3OCwxMzIzLDMzNDAsMzA3NiwgNjkwLDI5MDYsICA1MSwgMzY5LCAxNzAsMzU0MSwKMTA2MCwyMTg3LDI2ODgsMzY3MCwyNTQxLDEwODMsMTY4MywgOTI4LDM5MTgsIDQ1OSwgMTA5LDQ0MjcsIDU5OSwzNzQ0LDQyODYsIDE0MywKMjEwMSwyNzMwLDI0OTAsICA4MiwxNTg4LDMwMzYsMjEyMSwgMjgxLDE4NjAsIDQ3Nyw0MDM1LDEyMzgsMjgxMiwzMDIwLDI3MTYsMzMxMiwKMTUzMCwyMTg4LDIwNTUsMTMxNywgODQzLCA2MzYsMTgwOCwxMTczLDM0OTUsIDY0OSwgMTgxLDEwMDIsIDE0NywzNjQxLDExNTksMjQxNCwKMzc1MCwyMjg5LDI3OTUsIDgxMywzMTIzLDI2MTAsMTEzNiw0MzY4LCAgIDUsMzM5MSw0NTQxLDIxNzQsIDQyMCwgNDI5LDE3MjgsIDc1NCwKMTIyOCwyMTE1LDIyMTksIDM0NywyMjIzLDI3MzMsIDczNSwxNTE4LDMwMDMsMjM1NSwzMTM0LDE3NjQsMzk0OCwzMzI5LDE4ODgsMjQyNCwKMTAwMSwxMjM0LDE5NzIsMzMyMSwzMzYzLDE2NzIsMTAyMSwxNDUwLDE1ODQsIDIyNiwgNzY1LCA2NTUsMjUyNiwzNDA0LDMyNDQsMjMwMiwKMzY2NSwgNzMxLCA1OTQsMjE4NCwgMzE5LDE1NzYsIDYyMSwgNjU4LDI2NTYsNDI5OSwyMDk5LDM4NjQsMTI3OSwyMDcxLDI1OTgsMjczOSwKIDc5NSwzMDg2LDM2OTksMzkwOCwxNzA3LDIzNTIsMjQwMiwxMzgyLDMxMzYsMjQ3NSwxNDY1LDQ4NDcsMzQ5NiwzODY1LDEwODUsMzAwNCwKMjU5MSwxMDg0LCAyMTMsMjI4NywxOTYzLDM1NjUsMjI1MCwgODIyLCA3OTMsNDU3NCwzMTg3LDE3NzIsMTc4OSwzMDUwLCA1OTUsMTQ4NCwKMTk1OSwyNzcwLDEwODAsMjY1MCwgNDU2LCA0MjIsMjk5NiwgOTQwLDMzMjIsNDMyOCw0MzQ1LDMwOTIsMjc0MiwgOTY1LDI3ODQsIDczOSwKNDEyNCwgOTUyLDEzNTgsMjQ5OCwyOTQ5LDI1NjUsIDMzMiwyNjk4LDIzNzgsIDY2MCwyMjYwLDI0NzMsNDE5NCwzODU2LDI5MTksIDUzNSwKMTI2MCwyNjUxLDEyMDgsMTQyOCwxMzAwLDE5NDksMTMwMywyOTQyLCA0MzMsMjQ1NSwyNDUwLDEyNTEsMTk0NiwgNjE0LDEyNjksIDY0MSwKMTMwNiwxODEwLDI3MzcsMzA3OCwyOTEyLCA1NjQsMjM2NSwxNDE5LDE0MTUsMTQ5Nyw0NDYwLDIzNjcsMjE4NSwxMzc5LDMwMDUsMTMwNywKMzIxOCwyMTc1LDE4OTcsMzA2MywgNjgyLDExNTcsNDA0MCw0MDA1LDE3MTIsMTE2MCwxOTQxLDEzOTksIDM5NCwgNDAyLDI5NTIsMTU3MywKMTE1MSwyOTg2LDI0MDQsIDg2MiwgMjk5LDIwMzMsMTQ4OSwzMDA2LCAzNDYsIDE3MSwyODg2LDM0MDEsMTcyNiwyOTMyLCAxNjgsMjUzMywKICA0NywyNTA3LDEwMzAsMzczNSwxMTQ1LDMzNzAsMTM5NSwxMzE4LDE1NzksMzYwOSw0NTYwLDI4NTcsNDExNiwxNDU3LDI1MjksMTk2NSwKIDUwNCwxMDM2LDI2OTAsMjk4OCwyNDA1LCA3NDUsNTg3MSwgODQ5LDIzOTcsMjA1NiwzMDgxLCA4NjMsMjM1OSwzODU3LDIwOTYsICA5OSwKMTM5NywxNzY5LDIzMDAsNDQyOCwxNjQzLDM0NTUsMTk3OCwxNzU3LDM3MTgsMTQ0MCwgIDM1LDQ4NzksMzc0MiwxMjk2LDQyMjgsMjI4MCwKIDE2MCw1MDYzLDE1OTksMjAxMywgMTY2LCA1MjAsMzQ3OSwxNjQ2LDMzNDUsMzAxMiwgNDkwLDE5MzcsMTU0NSwxMjY0LDIxODIsMjUwNSwKMTA5NiwxMTg4LDEzNjksMTQzNiwyNDIxLDE2NjcsMjc5MiwyNDYwLDEyNzAsMjEyMiwgNzI3LDMxNjcsMjE0MywgODA2LDE3MDYsMTAxMiwKMTgwMCwzMDM3LCA5NjAsMjIxOCwxODgyLCA4MDUsIDEzOSwyNDU2LDExMzksMTUyMSwgODUxLDEwNTIsMzA5MywzMDg5LCAzNDIsMjAzOSwKIDc0NCw1MDk3LDE0NjgsMTUwMiwxNTg1LDIwODcsIDIyMywgOTM5LCAzMjYsMjE0MCwyNTc3LCA4OTIsMjQ4MSwxNjIzLDQwNzcsIDk4MiwKMzcwOCwgMTM1LDIxMzEsICA4NywyNTAzLDMxMTQsMjMyNiwxMTA2LCA4NzYsMTYxNiwgNTQ3LDI5OTcsMjgzMSwyMDkzLDM0NDEsNDUzMCwKNDMxNCwgICA5LDMyNTYsNDIyOSw0MTQ4LCA2NTksMTQ2MiwxOTg2LDE3MTAsMjA0NiwyOTEzLDIyMzEsNDA5MCw0ODgwLDUyNTUsMzM5MiwKMzI3NCwxMzY4LDM2ODksNDY0NSwxNDc3LCA3MDUsMzM4NCwzNjM1LDEwNjgsMTUyOSwyOTQxLDE0NTgsMzc4MiwxNTA5LCAxMDAsMTY1NiwKMjU0OCwgNzE4LDIzMzksIDQwOCwxNTkwLDI3ODAsMzU0OCwxODM4LDQxMTcsMzcxOSwxMzQ1LDM1MzAsIDcxNywzNDQyLDI3NzgsMzIyMCwKMjg5OCwxODkyLDQ1OTAsMzYxNCwzMzcxLDIwNDMsMTk5OCwxMjI0LDM0ODMsIDg5MSwgNjM1LCA1ODQsMjU1OSwzMzU1LCA3MzMsMTc2NiwKMTcyOSwxMTcyLDM3ODksMTg5MSwyMzA3LCA3ODEsMjk4MiwyMjcxLDE5NTcsMTU4MCw1NzczLDI2MzMsMjAwNSw0MTk1LDMwOTcsMTUzNSwKMzIxMywxMTg5LDE5MzQsNTY5MywzMjYyLCA1ODYsMzExOCwxMzI0LDE1OTgsIDUxNywxNTY0LDIyMTcsMTg2OCwxODkzLDQ0NDUsMzcyOCwKMjcwMywzMTM5LDE1MjYsMTc4NywxOTkyLDM4ODIsMjg3NSwxNTQ5LDExOTksMTA1NiwyMjI0LDE5MDQsMjcxMSw1MDk4LDQyODcsIDMzOCwKMTk5MywzMTI5LDM0ODksMjY4OSwxODA5LDI4MTUsMTk5NywgOTU3LDE4NTUsMzg5OCwyNTUwLDMyNzUsMzA1NywxMTA1LDEzMTksIDYyNywKMTUwNSwxOTExLDE4ODMsMzUyNiwgNjk4LDM2MjksMzQ1NiwxODMzLDE0MzEsIDc0NiwgIDc3LDEyNjEsMjAxNywyMjk2LDE5NzcsMTg4NSwKIDEyNSwxMzM0LDE2MDAsIDUyNSwxNzk4LDExMDksMjIyMiwxNDcwLDE5NDUsIDU1OSwyMjM2LDExODYsMzQ0MywyNDc2LDE5MjksMTQxMSwKMjQxMSwzMTM1LDE3NzcsMzM3MiwyNjIxLDE4NDEsMTYxMywzMjI5LCA2NjgsMTQzMCwxODM5LDI2NDMsMjkxNiwgMTk1LDE5ODksMjY3MSwKMjM1OCwxMzg3LCA2MjksMzIwNSwyMjkzLDUyNTYsNDQzOSwgMTIzLDEzMTAsIDg4OCwxODc5LDQzMDAsMzAyMSwzNjA1LDEwMDMsMTE2MiwKMzE5MiwyOTEwLDIwMTAsIDE0MCwyMzk1LDI4NTksICA1NSwxMDgyLDIwMTIsMjkwMSwgNjYyLCA0MTksMjA4MSwxNDM4LCA2ODAsMjc3NCwKNDY1NCwzOTEyLDE2MjAsMTczMSwxNjI1LDUwMzUsNDA2NSwyMzI4LCA1MTIsMTM0NCwgODAyLDU0NDMsMjE2MywyMzExLDI1MzcsIDUyNCwKMzM5OSwgIDk4LDExNTUsMjEwMywxOTE4LDI2MDYsMzkyNSwyODE2LDEzOTMsMjQ2NSwxNTA0LDM3NzMsMjE3NywzOTYzLDE0NzgsNDM0NiwKIDE4MCwxMTEzLDQ2NTUsMzQ2MSwyMDI4LDE2OTgsIDgzMywyNjk2LDEyMzUsMTMyMiwxNTk0LDQ0MDgsMzYyMywzMDEzLDMyMjUsMjA0MCwKMzAyMiwgNTQxLDI4ODEsIDYwNywzNjMyLDIwMjksMTY2NSwxMjE5LCA2MzksMTM4NSwxNjg2LDEwOTksMjgwMywzMjMxLDE5MzgsMzE4OCwKMjg1OCwgNDI3LCA2NzYsMjc3MiwxMTY4LDIwMjUsIDQ1NCwzMjUzLDI0ODYsMzU1NiwgMjMwLDE5NTAsIDU4MCwgNzkxLDE5OTEsMTI4MCwKMTA4NiwxOTc0LDIwMzQsIDYzMCwgMjU3LDMzMzgsMjc4OCw0OTAzLDEwMTcsICA4Niw0NzkwLCA5NjYsMjc4OSwxOTk1LDE2OTYsMTEzMSwKIDI1OSwzMDk1LDQxODgsMTMwOCwgMTc5LDE0NjMsNTI1NywgMjg5LDQxMDcsMTI0OCwgIDQyLDM0MTMsMTcyNSwyMjg4LCA4OTYsMTk0NywKIDc3NCw0NDc0LDQyNTQsIDYwNCwzNDMwLDQyNjQsIDM5MiwyNTE0LDI1ODgsIDQ1MiwgMjM3LDE0MDgsMzAxOCwgOTg4LDQ1MzEsMTk3MCwKMzAzNCwzMzEwLCA1NDAsMjM3MCwxNTYyLDEyODgsMjk5MCwgNTAyLDQ3NjUsMTE0NywgICA0LDE4NTMsMjcwOCwgMjA3LCAyOTQsMjgxNCwKNDA3OCwyOTAyLDI1MDksIDY4NCwgIDM0LDMxMDUsMzUzMiwyNTUxLCA2NDQsIDcwOSwyODAxLDIzNDQsIDU3MywxNzI3LDM1NzMsMzU1NywKMjAyMSwxMDgxLDMxMDAsNDMxNSwyMTAwLDM2ODEsIDE5OSwyMjYzLDE4MzcsMjM4NSwgMTQ2LDM0ODQsMTE5NSwyNzc2LDM5NDksIDk5NywKMTkzOSwzOTczLDEwMDgsMTA5MSwxMjAyLDE5NjIsMTg0NywxMTQ5LDQyMDksNTQ0NCwxMDc2LCA0OTMsIDExNyw1NDAwLDI1MjEsIDk3MiwKMTQ5MCwyOTM0LDE3OTYsNDU0MiwyMzc0LDE1MTIsMjkzMywyNjU3LCA0MTMsMjg4OCwxMTM1LDI3NjIsMjMxNCwyMTU2LDEzNTUsMjM2OSwKIDc2NiwyMDA3LDI1MjcsMjE3MCwzMTI0LDI0OTEsMjU5MywyNjMyLDQ3NTcsMjQzNywgMjM0LDMxMjUsMzU5MSwxODk4LDE3NTAsMTM3NiwKMTk0MiwzNDY4LDMxMzgsIDU3MCwyMTI3LDIxNDUsMzI3Niw0MTMxLCA5NjIsIDEzMiwxNDQ1LDQxOTYsICAxOSwgOTQxLDM2MjQsMzQ4MCwKMzM2NiwxOTczLDEzNzQsNDQ2MSwzNDMxLDI2MjksIDI4MywyNDE1LDIyNzUsIDgwOCwyODg3LDM2MjAsMjExMiwyNTYzLDEzNTMsMzYxMCwKIDk1NSwxMDg5LDMxMDMsMTA1MywgIDk2LCAgODgsNDA5NywgODIzLDM4MDgsMTU4MywgMzk5LCAyOTIsNDA5MSwzMzEzLCA0MjEsMTEyOCwKIDY0Miw0MDA2LCA5MDMsMjUzOSwxODc3LDIwODIsIDU5NiwgIDI5LDQwNjYsMTc5MCwgNzIyLDIxNTcsIDEzMCwgOTk1LDE1NjksIDc2OSwKMTQ4NSwgNDY0LCA1MTMsMjIxMywgMjg4LDE5MjMsMTEwMSwyNDUzLDQzMTYsIDEzMywgNDg2LDI0NDUsICA1MCwgNjI1LCA0ODcsMjIwNywKICA1NywgNDIzLCA0ODEsMjk2MiwgMTU5LDM3MjksMTU1OCwgNDkxLCAzMDMsIDQ4MiwgNTAxLCAyNDAsMjgzNywgMTEyLDM2NDgsMjM5MiwKMTc4MywgMzYyLCAgIDgsMzQzMywzNDIyLCA2MTAsMjc5MywzMjc3LDEzOTAsMTI4NCwxNjU0LCAgMjEsMzgyMywgNzM0LCAzNjcsIDYyMywKIDE5MywgMjg3LCAzNzQsMTAwOSwxNDgzLCA4MTYsIDQ3NiwgMzEzLDIyNTUsMjM0MCwxMjYyLDIxNTAsMjg5OSwxMTQ2LDI1ODEsIDc4MiwKMjExNiwxNjU5LDIwMTgsMTg4MCwgMjU1LDM1ODYsMzMxNCwxMTEwLDI4NjcsMjEzNywyNTY0LCA5ODYsMjc2Nyw1MTg1LDIwMDYsIDY1MCwKIDE1OCwgOTI2LCA3NjIsIDg4MSwzMTU3LDI3MTcsMjM2MiwzNTg3LCAzMDYsMzY5MCwzMjQ1LDE1NDIsMzA3NywyNDI3LDE2OTEsMjQ3OCwKMjExOCwyOTg1LDM0OTAsMjQzOCwgNTM5LDIzMDUsIDk4MywgMTI5LDE3NTQsIDM1NSw0MjAxLDIzODYsIDgyNywyOTIzLCAxMDQsMTc3MywKMjgzOCwyNzcxLCA0MTEsMjkwNSwzOTE5LCAzNzYsIDc2NywgMTIyLDExMTQsIDgyOCwyNDIyLDE4MTcsMzUwNiwgMjY2LDM0NjAsMTAwNywKMTYwOSw0OTk4LCA5NDUsMjYxMiw0NDI5LDIyNzQsIDcyNiwxMjQ3LDE5NjQsMjkxNCwyMTk5LDIwNzAsNDAwMiw0MTA4LCA2NTcsMzMyMywKMTQyMiwgNTc5LCA0NTUsMjc2NCw0NzM3LDEyMjIsMjg5NSwxNjcwLCA4MjQsMTIyMywxNDg3LDI1MjUsIDU1OCwgODYxLDMwODAsIDU5OCwKMjY1OSwyNTE1LDE5NjcsIDc1MiwyNTgzLDIzNzYsMjIxNCw0MTgwLCA5NzcsIDcwNCwyNDY0LDQ5OTksMjYyMiw0MTA5LDEyMTAsMjk2MSwKIDgxOSwxNTQxLCAxNDIsMjI4NCwgIDQ0LCA0MTgsIDQ1NywxMTI2LDM3MzAsNDM0Nyw0NjI2LDE2NDQsMTg3NiwzNjcxLDE4NjQsIDMwMiwKMTA2Myw1Njk0LCA2MjQsIDcyMywxOTg0LDM3NDUsMTMxNCwxNjc2LDI0ODgsMTYxMCwxNDQ5LDM1NTgsMzU2OSwyMTY2LDIwOTgsIDQwOSwKMTAxMSwyMzI1LDM3MDQsMjMwNiwgODE4LDE3MzIsMTM4MywxODI0LDE4NDQsMzc1NywgOTk5LDI3MDUsMzQ5NywxMjE2LDE0MjMsMjY4MywKMjQyNiwyOTU0LDI1MDEsMjcyNiwyMjI5LDE0NzUsMjU1NCw1MDY0LDE5NzEsMTc5NCwxNjY2LDIwMTQsMTM0MywgNzgzLCA3MjQsIDE5MSwKMjQzNCwxMzU0LDIyMjAsNTA2NSwxNzYzLDI3NTIsMjQ3Miw0MTUyLCAxMzEsIDE3NSwyODg1LDM0MzQsICA5MiwxNDY2LDQ5MjAsMjYxNiwKMzg3MSwzODcyLDM4NjYsIDEyOCwxNTUxLDE2MzIsIDY2OSwxODU0LDM2ODIsNDY5MSw0MTI1LDEyMzAsIDE4OCwyOTczLDMyOTAsMTMwMiwKMTIxMywgNTYwLDMyNjYsIDkxNywgNzYzLDM5MDksMzI0OSwxNzYwLCA4NjgsMTk1OCwgNzY0LDE3ODIsMjA5NywgMTQ1LDIyNzcsMzc3NCwKNDQ2MiwgIDY0LDE0OTEsMzA2MiwgOTcxLDIxMzIsMzYwNiwyNDQyLCAyMjEsMTIyNiwxNjE3LCAyMTgsIDMyMywxMTg1LDMyMDcsMzE0NywKIDU3MSwgNjE5LDE0NzMsMTAwNSwxNzQ0LDIyODEsIDQ0OSwxODg3LDIzOTYsMzY4NSwgMjc1LCAzNzUsMzgxNiwxNzQzLDM4NDQsMzczMSwKIDg0NSwxOTgzLDIzNTAsNDIxMCwxMzc3LCA3NzMsIDk2NywzNDk5LDMwNTIsMzc0MywyNzI1LDQwMDcsMTY5NywxMDIyLDM5NDMsMTQ2NCwKMzI2NCwyODU1LDI3MjIsMTk1MiwxMDI5LDI4MzksMjQ2NywgIDg0LDQzODMsMjIxNSwgODIwLDEzOTEsMjAxNSwyNDQ4LDM2NzIsIDM3NywKMTk0OCwyMTY4LCA3OTcsMjU0NSwzNTM2LDI1NzgsMjY0NSwgIDk0LDI4NzQsMTY3OCwgNDA1LDEyNTksMzA3MSwgNzcxLCA1NDYsMTMxNSwKIDQ3MCwxMjQzLDMwODMsIDg5NSwyNDY4LCA5ODEsIDk2OSwyMDM3LCA4NDYsNDE4MSwgNjUzLDEyNzYsMjkyOCwgIDE0LDI1OTQsIDU1NywKMzAwNywyNDc0LCAxNTYsIDkwMiwxMzM4LDE3NDAsMjU3NCwgNTM3LDI1MTgsIDk3MywyMjgyLDIyMTYsMjQzMywxOTI4LCAxMzgsMjkwMywKMTI5MywyNjMxLDE2MTIsIDY0NiwzNDU3LCA4MzksMjkzNSwgMTExLCA0OTYsMjE5MSwyODQ3LCA1ODksMzE4NiwgMTQ5LDM5OTQsMjA2MCwKNDAzMSwyNjQxLDQwNjcsMzE0NSwxODcwLCAgMzcsMzU5NywyMTM2LDEwMjUsMjA1MSwzMDA5LDMzODMsMzU0OSwxMTIxLDEwMTYsMzI2MSwKMTMwMSwgMjUxLDI0NDYsMjU5OSwyMTUzLCA4NzIsMzI0NiwgNjM3LCAzMzQsMzcwNSwgODMxLCA4ODQsIDkyMSwzMDY1LDMxNDAsNDA5MiwKMjE5OCwxOTQ0LCAyNDYsMjk2NCwgMTA4LDIwNDUsMTE1MiwxOTIxLDIzMDgsMTAzMSwgMjAzLDMxNzMsNDE3MCwxOTA3LDM4OTAsIDgxMCwKMTQwMSwyMDAzLDE2OTAsIDUwNiwgNjQ3LDEyNDIsMjgyOCwxNzYxLDE2NDksMzIwOCwyMjQ5LDE1ODksMzcwOSwyOTMxLDUxNTYsMTcwOCwKIDQ5OCwgNjY2LDI2MTMsIDgzNCwzODE3LDEyMzEsIDE4NCwyODUxLDExMjQsIDg4MywzMTk3LDIyNjEsMzcxMCwxNzY1LDE1NTMsMjY1OCwKMTE3OCwyNjM5LDIzNTEsICA5MywxMTkzLCA5NDIsMjUzOCwyMTQxLDQ0MDIsIDIzNSwxODIxLCA4NzAsMTU5MSwyMTkyLDE3MDksMTg3MSwKMzM0MSwxNjE4LDQxMjYsMjU5NSwyMzM0LCA2MDMsIDY1MSwgIDY5LCA3MDEsIDI2OCwyNjYyLDM0MTEsMjU1NSwxMzgwLDE2MDYsIDUwMywKIDQ0OCwgMjU0LDIzNzEsMjY0NiwgNTc0LDExODcsMjMwOSwxNzcwLCAzMjIsMjIzNSwxMjkyLDE4MDEsIDMwNSwgNTY2LDExMzMsIDIyOSwKMjA2NywyMDU3LCA3MDYsIDE2NywgNDgzLDIwMDIsMjY3MiwzMjk1LDE4MjAsMzU2MSwzMDY3LCAzMTYsIDM3OCwyNzQ2LDM0NTIsMTExMiwKIDEzNiwxOTgxLCA1MDcsMTY1MSwyOTE3LDExMTcsIDI4NSw0NTkxLCAxODIsMjU4MCwzNTIyLDEzMDQsIDMzNSwzMzAzLDE4MzUsMjUwNCwKMTc5NSwxNzkyLDIyNDgsIDY3NCwxMDE4LDIxMDYsMjQ0OSwxODU3LDIyOTIsMjg0NSwgOTc2LDMwNDcsMTc4MSwyNjAwLDI3MjcsMTM4OSwKMTI4MSwgIDUyLDMxNTIsIDE1MywgMjY1LDM5NTAsIDY3MiwzNDg1LDM5NTEsNDQ2MywgNDMwLDExODMsIDM2NSwgMjc4LDIxNjksICAyNywKMTQwNywxMzM2LDIzMDQsIDIwOSwxMzQwLDE3MzAsMjIwMiwxODUyLDI0MDMsMjg4MywgOTc5LDE3MzcsMTA2MiwgNjMxLDI4MjksMjU0MiwKMzg3NiwyNTkyLCA4MjUsMjA4NiwyMjI2LDMwNDgsMzYyNSwgMzUyLDE0MTcsMzcyNCwgNTQyLCA5OTEsIDQzMSwxMzUxLDM5MzgsMTg2MSwKMjI5NCwgODI2LDEzNjEsMjkyNywzMTQyLDM1MDMsMTczOCwgNDYzLDI0NjIsMjcyMywgNTgyLDE5MTYsMTU5NSwyODA4LCA0MDAsMzg0NSwKMzg5MSwyODY4LDM2MjEsMjI1NCwgIDU4LDI0OTIsMTEyMywgOTEwLDIxNjAsMjYxNCwxMzcyLDE2MDMsMTE5NiwxMDcyLDMzODUsMTcwMCwKMzI2NywxOTgwLCA2OTYsIDQ4MCwyNDMwLCA5MjAsIDc5OSwxNTcwLDI5MjAsMTk1MSwyMDQxLDQwNDcsMjU0MCwxMzIxLDQyMjMsMjQ2OSwKMzU2MiwyMjI4LDEyNzEsMjYwMiwgNDAxLDI4MzMsMzM1MSwyNTc1LDUxNTcsIDkwNywyMzEyLDEyNTYsIDQxMCwgMjYzLDM1MDcsMTU4MiwKIDk5NiwgNjc4LDE4NDksMjMxNiwxNDgwLCA5MDgsMzU0NSwyMjM3LCA3MDMsMjMyMiwgNjY3LDE4MjYsMjg0OSwxNTMxLDI2MDQsMjk5OSwKMjQwNywzMTQ2LDIxNTEsMjYzMCwxNzg2LDM3MTEsIDQ2OSwzNTQyLCA0OTcsMzg5OSwyNDA5LCA4NTgsIDgzNyw0NDQ2LDMzOTMsMTI3NCwKIDc4NiwgNjIwLDE4NDUsMjAwMSwzMzExLCA0ODQsIDMwOCwzMzY3LDEyMDQsMTgxNSwzNjkxLDIzMzIsMTUzMiwyNTU3LDE4NDIsMjAyMCwKMjcyNCwxOTI3LDIzMzMsNDQ0MCwgNTY3LCAgMjIsMTY3MywyNzI4LDQ0NzUsMTk4NywxODU4LDExNDQsMTU5NywgMTAxLDE4MzIsMzYwMSwKICAxMiwgOTc0LDM3ODMsNDM5MSwgOTUxLDE0MTIsICAgMSwzNzIwLCA0NTMsNDYwOCw0MDQxLCA1MjgsMTA0MSwxMDI3LDMyMzAsMjYyOCwKMTEyOSwgODc1LDEwNTEsMzI5MSwxMjAzLDIyNjIsMTA2OSwyODYwLDI3OTksMjE0OSwyNjE1LDMyNzgsIDE0NCwxNzU4LDMwNDAsICAzMSwKIDQ3NSwxNjgwLCAzNjYsMjY4NSwzMTg0LCAzMTEsMTY0Miw0MDA4LDI0NjYsNTAzNiwxNTkzLDE0OTMsMjgwOSwgMjE2LDE0MjAsMTY2OCwKIDIzMywgMzA0LDIxMjgsMzI4NCwgMjMyLDE0MjksMTc2OCwxMDQwLDIwMDgsMzQwNywyNzQwLDI5NjcsMjU0MywgMjQyLDIxMzMsIDc3OCwKMTU2NSwyMDIyLDI2MjAsIDUwNSwyMTg5LDI3NTYsMTA5OCwyMjczLCAzNzIsMTYxNCwgNzA4LCA1NTMsMjg0NiwyMDk0LDIyNzgsIDE2OSwKMzYyNiwyODM1LDQxNjEsIDIyOCwyNjc0LDMxNjUsIDgwOSwxNDU0LDEzMDksIDQ2NiwxNzA1LDEwOTUsIDkwMCwzNDIzLCA4ODAsMjY2NywKMzc1MSw1MjU4LDIzMTcsMzEwOSwyNTcxLDQzMTcsMjc2NiwxNTAzLDEzNDIsIDg2Niw0NDQ3LDExMTgsICA2MywyMDc2LCAzMTQsMTg4MSwKMTM0OCwxMDYxLCAxNzIsIDk3OCwzNTE1LDE3NDcsIDUzMiwgNTExLDM5NzAsICAgNiwgNjAxLCA5MDUsMjY5OSwzMzAwLDE3NTEsIDI3NiwKMTQ2NywzNzI1LDI2NjgsICA2NSw0MjM5LDI1NDQsMjc3OSwyNTU2LDE2MDQsIDU3OCwyNDUxLDE4MDIsIDk5MiwyMzMxLDI2MjQsMTMyMCwKMzQ0NiwgNzEzLDE1MTMsMTAxMywgMTAzLDI3ODYsMjQ0NywxNjYxLCA4ODYsMTcwMiwgOTE2LCA2NTQsMzU3NCwyMDMxLDE1NTYsIDc1MSwKMjE3OCwyODIxLDIxNzksMTQ5OCwxNTM4LDIxNzYsIDI3MSwgOTE0LDIyNTEsMjA4MCwxMzI1LCA2MzgsMTk1MywyOTM3LDM4NzcsMjQzMiwKMjc1NCwgIDk1LDMyNjUsMTcxNiwgMjYwLDEyMjcsNDA4MywgNzc1LCAxMDYsMTM1NywzMjU0LCA0MjYsMTYwNywgNTU1LDI0ODAsIDc3MiwKMTk4NSwgMjQ0LDI1NDYsIDQ3NCwgNDk1LDEwNDYsMjYxMSwxODUxLDIwNjEsICA3MSwyMDg5LDE2NzUsMjU5MCwgNzQyLDM3NTgsMjg0MywKMzIyMiwxNDMzLCAyNjcsMjE4MCwyNTc2LDI4MjYsMjIzMywyMDkyLDM5MTMsMjQzNSwgOTU2LDE3NDUsMzA3NSwgODU2LDIxMTMsMTExNiwKIDQ1MSwgICAzLDE5ODgsMjg5NiwxMzk4LCA5OTMsMjQ2MywxODc4LDIwNDksMTM0MSwyNzE4LDI3MjEsMjg3MCwyMTA4LCA3MTIsMjkwNCwKNDM2MywyNzUzLDIzMjQsIDI3NywyODcyLDIzNDksMjY0OSwgMzg0LCA5ODcsIDQzNSwgNjkxLDMwMDAsIDkyMiwgMTY0LDM5MzksIDY1MiwKMTUwMCwxMTg0LDQxNTMsMjQ4MiwzMzczLDIxNjUsNDg0OCwyMzM1LDM3NzUsMzUwOCwzMTU0LDI4MDYsMjgzMCwxNTU0LDIxMDIsMTY2NCwKMjUzMCwxNDM0LDI0MDgsIDg5MywxNTQ3LDI2MjMsMzQ0NywyODMyLDIyNDIsMjUzMiwzMTY5LDI4NTYsMzIyMywyMDc4LCAgNDksMzc3MCwKMzQ2OSwgNDYyLCAzMTgsIDY1NiwyMjU5LDMyNTAsMzA2OSwgNjc5LDE2MjksMjc1OCwgMzQ0LDExMzgsMTEwNCwzMTIwLDE4MzYsMTI4MywKMzExNSwyMTU0LDE0MzcsNDQ0OCwgOTM0LCA3NTksMTk5OSwgNzk0LDI4NjIsMTAzOCwgNTMzLDI1NjAsMTcyMiwyMzQyLCA4NTUsMjYyNiwKMTE5NywxNjYzLDQ0NzYsMzEyNywgIDg1LDQyNDAsMjUyOCwgIDI1LDExMTEsMTE4MSwzNjczLCA0MDcsMzQ3MCw0NTYxLDI2NzksMjcxMywKIDc2OCwxOTI1LDI4NDEsMzk4NiwxNTQ0LDExNjUsIDkzMiwgMzczLDEyNDAsMjE0NiwxOTMwLDI2NzMsIDcyMSw0NzY2LCAzNTQsNDMzMywKIDM5MSwyOTYzLCAxODcsICA2MSwzMzY0LDE0NDIsMTEwMiwgMzMwLDE5NDAsMTc2NywgMzQxLDM4MDksNDExOCwgMzkzLDI0OTYsMjA2MiwKMjIxMSwgMTA1LCAzMzEsIDMwMCwgNDM5LCA5MTMsMTMzMiwgNjI2LCAzNzksMzMwNCwxNTU3LCAzMjgsIDY4OSwzOTUyLCAzMDksMTU1NSwKIDkzMSwgMzE3LDI1MTcsMzAyNywgMzI1LCA1NjksIDY4NiwyMTA3LDMwODQsICA2MCwxMDQyLDEzMzMsMjc5NCwgMjY0LDMxNzcsNDAxNCwKMTYyOCwgMjU4LDM3MTIsICAgNyw0NDY0LDExNzYsMTA0MywxNzc4LCA2ODMsIDExNCwxOTc1LCAgNzgsMTQ5MiwgMzgzLDE4ODYsIDUxMCwKIDM4NiwgNjQ1LDUyOTEsMjg5MSwyMDY5LDMzMDUsNDEzOCwzODY3LDI5MzksMjYwMywyNDkzLDE5MzUsMTA2NiwxODQ4LDM1ODgsMTAxNSwKMTI4MiwxMjg5LDQ2MDksIDY5NywxNDUzLDMwNDQsMjY2NiwzNjExLDE4NTYsMjQxMiwgIDU0LCA3MTksMTMzMCwgNTY4LDM3NzgsMjQ1OSwKMTc0OCwgNzg4LCA0OTIsIDU1MSwxMTkxLDEwMDAsIDQ4OCwzMzk0LDM3NjMsIDI4MiwxNzk5LCAzNDgsMjAxNiwxNTIzLDMxNTUsMjM5MCwKMTA0OSwgMzgyLDIwMTksMTc4OCwxMTcwLCA3MjksMjk2OCwzNTIzLCA4OTcsMzkyNiwyNzg1LDI5MzgsMzI5MiwgMzUwLDIzMTksMzIzOCwKMTcxOCwxNzE3LDI2NTUsMzQ1MywzMTQzLDQ0NjUsIDE2MSwyODg5LDI5ODAsMjAwOSwxNDIxLCAgNTYsMTkwOCwxNjQwLDIzODcsMjIzMiwKMTkxNywxODc0LDI0NzcsNDkyMSwgMTQ4LCAgODMsMzQzOCwgNTkyLDQyNDUsMjg4MiwxODIyLDEwNTUsIDc0MSwgMTE1LDE0OTYsMTYyNCwKIDM4MSwxNjM4LDQ1OTIsMTAyMCwgNTE2LDMyMTQsIDQ1OCwgOTQ3LDQ1NzUsMTQzMiwgMjExLDE1MTQsMjkyNiwxODY1LDIxNDIsIDE4OSwKIDg1MiwxMjIxLDE0MDAsMTQ4NiwgODgyLDIyOTksNDAzNiwgMzUxLCAgMjgsMTEyMiwgNzAwLDY0NzksNjQ4MCw2NDgxLDY0ODIsNjQ4MywgICNsYXN0IDUxMgopCgpQSwMEFAAAAAAAAAAhAH6r/o/aBgAA2gYAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEycHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBHQjIzMTJEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5tYmNzc20gaW1wb3J0IEdCMjMxMl9TTV9NT0RFTAoKY2xhc3MgR0IyMzEyUHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEdCMjMxMlByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEdCMjMxMl9TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEdCMjMxMkRpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJHQjIzMTIiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJDaGluZXNlIgpQSwMEFAAAAAAAAAAhAA0p07IONgAADjYAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvaGVicmV3cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgICAgICAgICAgU2h5IFNoYWxvbQojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDUKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZQoKIyBUaGlzIHByb2JlciBkb2Vzbid0IGFjdHVhbGx5IHJlY29nbml6ZSBhIGxhbmd1YWdlIG9yIGEgY2hhcnNldC4KIyBJdCBpcyBhIGhlbHBlciBwcm9iZXIgZm9yIHRoZSB1c2Ugb2YgdGhlIEhlYnJldyBtb2RlbCBwcm9iZXJzCgojIyMgR2VuZXJhbCBpZGVhcyBvZiB0aGUgSGVicmV3IGNoYXJzZXQgcmVjb2duaXRpb24gIyMjCiMKIyBGb3VyIG1haW4gY2hhcnNldHMgZXhpc3QgaW4gSGVicmV3OgojICJJU08tODg1OS04IiAtIFZpc3VhbCBIZWJyZXcKIyAid2luZG93cy0xMjU1IiAtIExvZ2ljYWwgSGVicmV3CiMgIklTTy04ODU5LTgtSSIgLSBMb2dpY2FsIEhlYnJldwojICJ4LW1hYy1oZWJyZXciIC0gPz8gTG9naWNhbCBIZWJyZXcgPz8KIwojIEJvdGggIklTTyIgY2hhcnNldHMgdXNlIGEgY29tcGxldGVseSBpZGVudGljYWwgc2V0IG9mIGNvZGUgcG9pbnRzLCB3aGVyZWFzCiMgIndpbmRvd3MtMTI1NSIgYW5kICJ4LW1hYy1oZWJyZXciIGFyZSB0d28gZGlmZmVyZW50IHByb3BlciBzdXBlcnNldHMgb2YKIyB0aGVzZSBjb2RlIHBvaW50cy4gd2luZG93cy0xMjU1IGRlZmluZXMgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZQojIDB4ODAtMHg5RiBhcyBzb21lIG1pc2MgcHVuY3R1YXRpb24gbWFya3MgYXMgd2VsbCBhcyBzb21lIEhlYnJldy1zcGVjaWZpYwojIGRpYWNyaXRpY3MgYW5kIGFkZGl0aW9uYWwgJ1lpZGRpc2gnIGxpZ2F0dXJlIGxldHRlcnMgaW4gdGhlIHJhbmdlIDB4YzAtMHhkNi4KIyB4LW1hYy1oZWJyZXcgZGVmaW5lcyBzaW1pbGFyIGFkZGl0aW9uYWwgY29kZSBwb2ludHMgYnV0IHdpdGggYSBkaWZmZXJlbnQKIyBtYXBwaW5nLgojCiMgQXMgZmFyIGFzIGFuIGF2ZXJhZ2UgSGVicmV3IHRleHQgd2l0aCBubyBkaWFjcml0aWNzIGlzIGNvbmNlcm5lZCwgYWxsIGZvdXIKIyBjaGFyc2V0cyBhcmUgaWRlbnRpY2FsIHdpdGggcmVzcGVjdCB0byBjb2RlIHBvaW50cy4gTWVhbmluZyB0aGF0IGZvciB0aGUKIyBtYWluIEhlYnJldyBhbHBoYWJldCwgYWxsIGZvdXIgbWFwIHRoZSBzYW1lIHZhbHVlcyB0byBhbGwgMjcgSGVicmV3IGxldHRlcnMKIyAoaW5jbHVkaW5nIGZpbmFsIGxldHRlcnMpLgojCiMgVGhlIGRvbWluYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSBjaGFyc2V0cyBpcyB0aGVpciBkaXJlY3Rpb25hbGl0eS4KIyAiVmlzdWFsIiBkaXJlY3Rpb25hbGl0eSBtZWFucyB0aGF0IHRoZSB0ZXh0IGlzIG9yZGVyZWQgYXMgaWYgdGhlIHJlbmRlcmVyIGlzCiMgbm90IGF3YXJlIG9mIGEgQklESSByZW5kZXJpbmcgYWxnb3JpdGhtLiBUaGUgcmVuZGVyZXIgc2VlcyB0aGUgdGV4dCBhbmQKIyBkcmF3cyBpdCBmcm9tIGxlZnQgdG8gcmlnaHQuIFRoZSB0ZXh0IGl0c2VsZiB3aGVuIG9yZGVyZWQgbmF0dXJhbGx5IGlzIHJlYWQKIyBiYWNrd2FyZHMuIEEgYnVmZmVyIG9mIFZpc3VhbCBIZWJyZXcgZ2VuZXJhbGx5IGxvb2tzIGxpa2Ugc286CiMgIltsYXN0IHdvcmQgb2YgZmlyc3QgbGluZSBzcGVsbGVkIGJhY2t3YXJkc10gW3dob2xlIGxpbmUgb3JkZXJlZCBiYWNrd2FyZHMKIyBhbmQgc3BlbGxlZCBiYWNrd2FyZHNdIFtmaXJzdCB3b3JkIG9mIGZpcnN0IGxpbmUgc3BlbGxlZCBiYWNrd2FyZHNdCiMgW2VuZCBvZiBsaW5lXSBbbGFzdCB3b3JkIG9mIHNlY29uZCBsaW5lXSAuLi4gZXRjJyAiCiMgYWRkaW5nIHB1bmN0dWF0aW9uIG1hcmtzLCBudW1iZXJzIGFuZCBFbmdsaXNoIHRleHQgdG8gdmlzdWFsIHRleHQgaXMKIyBuYXR1cmFsbHkgYWxzbyAidmlzdWFsIiBhbmQgZnJvbSBsZWZ0IHRvIHJpZ2h0LgojCiMgIkxvZ2ljYWwiIGRpcmVjdGlvbmFsaXR5IG1lYW5zIHRoZSB0ZXh0IGlzIG9yZGVyZWQgIm5hdHVyYWxseSIgYWNjb3JkaW5nIHRvCiMgdGhlIG9yZGVyIGl0IGlzIHJlYWQuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgcmVuZGVyZXIgdG8gZGlzcGxheQojIHRoZSB0ZXh0IGZyb20gcmlnaHQgdG8gbGVmdC4gQSBCSURJIGFsZ29yaXRobSBpcyB1c2VkIHRvIHBsYWNlIGdlbmVyYWwKIyBwdW5jdHVhdGlvbiBtYXJrcywgbnVtYmVycyBhbmQgRW5nbGlzaCB0ZXh0IGluIHRoZSB0ZXh0LgojCiMgVGV4dHMgaW4geC1tYWMtaGVicmV3IGFyZSBhbG1vc3QgaW1wb3NzaWJsZSB0byBmaW5kIG9uIHRoZSBJbnRlcm5ldC4gRnJvbQojIHdoYXQgbGl0dGxlIGV2aWRlbmNlIEkgY291bGQgZmluZCwgaXQgc2VlbXMgdGhhdCBpdHMgZ2VuZXJhbCBkaXJlY3Rpb25hbGl0eQojIGlzIExvZ2ljYWwuCiMKIyBUbyBzdW0gdXAgYWxsIG9mIHRoZSBhYm92ZSwgdGhlIEhlYnJldyBwcm9iaW5nIG1lY2hhbmlzbSBrbm93cyBhYm91dCB0d28KIyBjaGFyc2V0czoKIyBWaXN1YWwgSGVicmV3IC0gIklTTy04ODU5LTgiIC0gYmFja3dhcmRzIHRleHQgLSBXb3JkcyBhbmQgc2VudGVuY2VzIGFyZQojICAgIGJhY2t3YXJkcyB3aGlsZSBsaW5lIG9yZGVyIGlzIG5hdHVyYWwuIEZvciBjaGFyc2V0IHJlY29nbml0aW9uIHB1cnBvc2VzCiMgICAgdGhlIGxpbmUgb3JkZXIgaXMgdW5pbXBvcnRhbnQgKEluIGZhY3QsIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLCBldmVuCiMgICAgd29yZCBvcmRlciBpcyB1bmltcG9ydGFudCkuCiMgTG9naWNhbCBIZWJyZXcgLSAid2luZG93cy0xMjU1IiAtIG5vcm1hbCwgbmF0dXJhbGx5IG9yZGVyZWQgdGV4dC4KIwojICJJU08tODg1OS04LUkiIGlzIGEgc3Vic2V0IG9mIHdpbmRvd3MtMTI1NSBhbmQgZG9lc24ndCBuZWVkIHRvIGJlCiMgICAgc3BlY2lmaWNhbGx5IGlkZW50aWZpZWQuCiMgIngtbWFjLWhlYnJldyIgaXMgYWxzbyBpZGVudGlmaWVkIGFzIHdpbmRvd3MtMTI1NS4gQSB0ZXh0IGluIHgtbWFjLWhlYnJldwojICAgIHRoYXQgY29udGFpbiBzcGVjaWFsIHB1bmN0dWF0aW9uIG1hcmtzIG9yIGRpYWNyaXRpY3MgaXMgZGlzcGxheWVkIHdpdGgKIyAgICBzb21lIHVuY29udmVydGVkIGNoYXJhY3RlcnMgc2hvd2luZyBhcyBxdWVzdGlvbiBtYXJrcy4gVGhpcyBwcm9ibGVtIG1pZ2h0CiMgICAgYmUgY29ycmVjdGVkIHVzaW5nIGFub3RoZXIgbW9kZWwgcHJvYmVyIGZvciB4LW1hYy1oZWJyZXcuIER1ZSB0byB0aGUgZmFjdAojICAgIHRoYXQgeC1tYWMtaGVicmV3IHRleHRzIGFyZSBzbyByYXJlLCB3cml0aW5nIGFub3RoZXIgbW9kZWwgcHJvYmVyIGlzbid0CiMgICAgd29ydGggdGhlIGVmZm9ydCBhbmQgcGVyZm9ybWFuY2UgaGl0LgojCiMjIyMgVGhlIFByb2JlciAjIyMjCiMKIyBUaGUgcHJvYmVyIGlzIGRpdmlkZWQgYmV0d2VlbiB0d28gU0JDaGFyU2V0UHJvYmVycyBhbmQgYSBIZWJyZXdQcm9iZXIsCiMgYWxsIG9mIHdoaWNoIGFyZSBtYW5hZ2VkLCBjcmVhdGVkLCBmZWQgZGF0YSwgaW5xdWlyZWQgYW5kIGRlbGV0ZWQgYnkgdGhlCiMgU0JDU0dyb3VwUHJvYmVyLiBUaGUgdHdvIFNCQ2hhclNldFByb2JlcnMgaWRlbnRpZnkgdGhhdCB0aGUgdGV4dCBpcyBpbgojIGZhY3Qgc29tZSBraW5kIG9mIEhlYnJldywgTG9naWNhbCBvciBWaXN1YWwuIFRoZSBmaW5hbCBkZWNpc2lvbiBhYm91dCB3aGljaAojIG9uZSBpcyBpdCBpcyBtYWRlIGJ5IHRoZSBIZWJyZXdQcm9iZXIgYnkgY29tYmluaW5nIGZpbmFsLWxldHRlciBzY29yZXMKIyB3aXRoIHRoZSBzY29yZXMgb2YgdGhlIHR3byBTQkNoYXJTZXRQcm9iZXJzIHRvIHByb2R1Y2UgYSBmaW5hbCBhbnN3ZXIuCiMKIyBUaGUgU0JDU0dyb3VwUHJvYmVyIGlzIHJlc3BvbnNpYmxlIGZvciBzdHJpcHBpbmcgdGhlIG9yaWdpbmFsIHRleHQgb2YgSFRNTAojIHRhZ3MsIEVuZ2xpc2ggY2hhcmFjdGVycywgbnVtYmVycywgbG93LUFTQ0lJIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMsIHNwYWNlcwojIGFuZCBuZXcgbGluZXMuIEl0IHJlZHVjZXMgYW55IHNlcXVlbmNlIG9mIHN1Y2ggY2hhcmFjdGVycyB0byBhIHNpbmdsZSBzcGFjZS4KIyBUaGUgYnVmZmVyIGZlZCB0byBlYWNoIHByb2JlciBpbiB0aGUgU0JDUyBncm91cCBwcm9iZXIgaXMgcHVyZSB0ZXh0IGluCiMgaGlnaC1BU0NJSS4KIyBUaGUgdHdvIFNCQ2hhclNldFByb2JlcnMgKG1vZGVsIHByb2JlcnMpIHNoYXJlIHRoZSBzYW1lIGxhbmd1YWdlIG1vZGVsOgojIFdpbjEyNTVNb2RlbC4KIyBUaGUgZmlyc3QgU0JDaGFyU2V0UHJvYmVyIHVzZXMgdGhlIG1vZGVsIG5vcm1hbGx5IGFzIGFueSBvdGhlcgojIFNCQ2hhclNldFByb2JlciBkb2VzLCB0byByZWNvZ25pemUgd2luZG93cy0xMjU1LCB1cG9uIHdoaWNoIHRoaXMgbW9kZWwgd2FzCiMgYnVpbHQuIFRoZSBzZWNvbmQgU0JDaGFyU2V0UHJvYmVyIGlzIHRvbGQgdG8gbWFrZSB0aGUgcGFpci1vZi1sZXR0ZXIKIyBsb29rdXAgaW4gdGhlIGxhbmd1YWdlIG1vZGVsIGJhY2t3YXJkcy4gVGhpcyBpbiBwcmFjdGljZSBleGFjdGx5IHNpbXVsYXRlcwojIGEgdmlzdWFsIEhlYnJldyBtb2RlbCB1c2luZyB0aGUgd2luZG93cy0xMjU1IGxvZ2ljYWwgSGVicmV3IG1vZGVsLgojCiMgVGhlIEhlYnJld1Byb2JlciBpcyBub3QgdXNpbmcgYW55IGxhbmd1YWdlIG1vZGVsLiBBbGwgaXQgZG9lcyBpcyBsb29rIGZvcgojIGZpbmFsLWxldHRlciBldmlkZW5jZSBzdWdnZXN0aW5nIHRoZSB0ZXh0IGlzIGVpdGhlciBsb2dpY2FsIEhlYnJldyBvciB2aXN1YWwKIyBIZWJyZXcuIERpc2pvaW50ZWQgZnJvbSB0aGUgbW9kZWwgcHJvYmVycywgdGhlIHJlc3VsdHMgb2YgdGhlIEhlYnJld1Byb2JlcgojIGFsb25lIGFyZSBtZWFuaW5nbGVzcy4gSGVicmV3UHJvYmVyIGFsd2F5cyByZXR1cm5zIDAuMDAgYXMgY29uZmlkZW5jZQojIHNpbmNlIGl0IG5ldmVyIGlkZW50aWZpZXMgYSBjaGFyc2V0IGJ5IGl0c2VsZi4gSW5zdGVhZCwgdGhlIHBvaW50ZXIgdG8gdGhlCiMgSGVicmV3UHJvYmVyIGlzIHBhc3NlZCB0byB0aGUgbW9kZWwgcHJvYmVycyBhcyBhIGhlbHBlciAiTmFtZSBQcm9iZXIiLgojIFdoZW4gdGhlIEdyb3VwIHByb2JlciByZWNlaXZlcyBhIHBvc2l0aXZlIGlkZW50aWZpY2F0aW9uIGZyb20gYW55IHByb2JlciwKIyBpdCBhc2tzIGZvciB0aGUgbmFtZSBvZiB0aGUgY2hhcnNldCBpZGVudGlmaWVkLiBJZiB0aGUgcHJvYmVyIHF1ZXJpZWQgaXMgYQojIEhlYnJldyBtb2RlbCBwcm9iZXIsIHRoZSBtb2RlbCBwcm9iZXIgZm9yd2FyZHMgdGhlIGNhbGwgdG8gdGhlCiMgSGVicmV3UHJvYmVyIHRvIG1ha2UgdGhlIGZpbmFsIGRlY2lzaW9uLiBJbiB0aGUgSGVicmV3UHJvYmVyLCB0aGUKIyBkZWNpc2lvbiBpcyBtYWRlIGFjY29yZGluZyB0byB0aGUgZmluYWwtbGV0dGVycyBzY29yZXMgbWFpbnRhaW5lZCBhbmQgQm90aAojIG1vZGVsIHByb2JlcnMgc2NvcmVzLiBUaGUgYW5zd2VyIGlzIHJldHVybmVkIGluIHRoZSBmb3JtIG9mIHRoZSBuYW1lIG9mIHRoZQojIGNoYXJzZXQgaWRlbnRpZmllZCwgZWl0aGVyICJ3aW5kb3dzLTEyNTUiIG9yICJJU08tODg1OS04Ii4KCmNsYXNzIEhlYnJld1Byb2JlcihDaGFyU2V0UHJvYmVyKToKICAgICMgd2luZG93cy0xMjU1IC8gSVNPLTg4NTktOCBjb2RlIHBvaW50cyBvZiBpbnRlcmVzdAogICAgRklOQUxfS0FGID0gMHhlYQogICAgTk9STUFMX0tBRiA9IDB4ZWIKICAgIEZJTkFMX01FTSA9IDB4ZWQKICAgIE5PUk1BTF9NRU0gPSAweGVlCiAgICBGSU5BTF9OVU4gPSAweGVmCiAgICBOT1JNQUxfTlVOID0gMHhmMAogICAgRklOQUxfUEUgPSAweGYzCiAgICBOT1JNQUxfUEUgPSAweGY0CiAgICBGSU5BTF9UU0FESSA9IDB4ZjUKICAgIE5PUk1BTF9UU0FESSA9IDB4ZjYKCiAgICAjIE1pbmltdW0gVmlzdWFsIHZzIExvZ2ljYWwgZmluYWwgbGV0dGVyIHNjb3JlIGRpZmZlcmVuY2UuCiAgICAjIElmIHRoZSBkaWZmZXJlbmNlIGlzIGJlbG93IHRoaXMsIGRvbid0IHJlbHkgc29sZWx5IG9uIHRoZSBmaW5hbCBsZXR0ZXIgc2NvcmUKICAgICMgZGlzdGFuY2UuCiAgICBNSU5fRklOQUxfQ0hBUl9ESVNUQU5DRSA9IDUKCiAgICAjIE1pbmltdW0gVmlzdWFsIHZzIExvZ2ljYWwgbW9kZWwgc2NvcmUgZGlmZmVyZW5jZS4KICAgICMgSWYgdGhlIGRpZmZlcmVuY2UgaXMgYmVsb3cgdGhpcywgZG9uJ3QgcmVseSBhdCBhbGwgb24gdGhlIG1vZGVsIHNjb3JlCiAgICAjIGRpc3RhbmNlLgogICAgTUlOX01PREVMX0RJU1RBTkNFID0gMC4wMQoKICAgIFZJU1VBTF9IRUJSRVdfTkFNRSA9ICJJU08tODg1OS04IgogICAgTE9HSUNBTF9IRUJSRVdfTkFNRSA9ICJ3aW5kb3dzLTEyNTUiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEhlYnJld1Byb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfbG9naWNhbF9zY29yZSA9IE5vbmUKICAgICAgICBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZSA9IE5vbmUKICAgICAgICBzZWxmLl9wcmV2ID0gTm9uZQogICAgICAgIHNlbGYuX2JlZm9yZV9wcmV2ID0gTm9uZQogICAgICAgIHNlbGYuX2xvZ2ljYWxfcHJvYmVyID0gTm9uZQogICAgICAgIHNlbGYuX3Zpc3VhbF9wcm9iZXIgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfbG9naWNhbF9zY29yZSA9IDAKICAgICAgICBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZSA9IDAKICAgICAgICAjIFRoZSB0d28gbGFzdCBjaGFyYWN0ZXJzIHNlZW4gaW4gdGhlIHByZXZpb3VzIGJ1ZmZlciwKICAgICAgICAjIG1QcmV2IGFuZCBtQmVmb3JlUHJldiBhcmUgaW5pdGlhbGl6ZWQgdG8gc3BhY2UgaW4gb3JkZXIgdG8gc2ltdWxhdGUKICAgICAgICAjIGEgd29yZCBkZWxpbWl0ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YQogICAgICAgIHNlbGYuX3ByZXYgPSAnICcKICAgICAgICBzZWxmLl9iZWZvcmVfcHJldiA9ICcgJwogICAgICAgICMgVGhlc2UgcHJvYmVycyBhcmUgb3duZWQgYnkgdGhlIGdyb3VwIHByb2Jlci4KCiAgICBkZWYgc2V0X21vZGVsX3Byb2JlcnMoc2VsZiwgbG9naWNhbFByb2JlciwgdmlzdWFsUHJvYmVyKToKICAgICAgICBzZWxmLl9sb2dpY2FsX3Byb2JlciA9IGxvZ2ljYWxQcm9iZXIKICAgICAgICBzZWxmLl92aXN1YWxfcHJvYmVyID0gdmlzdWFsUHJvYmVyCgogICAgZGVmIGlzX2ZpbmFsKHNlbGYsIGMpOgogICAgICAgIHJldHVybiBjIGluIFtzZWxmLkZJTkFMX0tBRiwgc2VsZi5GSU5BTF9NRU0sIHNlbGYuRklOQUxfTlVOLAogICAgICAgICAgICAgICAgICAgICBzZWxmLkZJTkFMX1BFLCBzZWxmLkZJTkFMX1RTQURJXQoKICAgIGRlZiBpc19ub25fZmluYWwoc2VsZiwgYyk6CiAgICAgICAgIyBUaGUgbm9ybWFsIFRzYWRpIGlzIG5vdCBhIGdvb2QgTm9uLUZpbmFsIGxldHRlciBkdWUgdG8gd29yZHMgbGlrZQogICAgICAgICMgJ2xlY2hvdGV0JyAodG8gY2hhdCkgY29udGFpbmluZyBhbiBhcG9zdHJvcGhlIGFmdGVyIHRoZSB0c2FkaS4gVGhpcwogICAgICAgICMgYXBvc3Ryb3BoZSBpcyBjb252ZXJ0ZWQgdG8gYSBzcGFjZSBpbiBGaWx0ZXJXaXRob3V0RW5nbGlzaExldHRlcnMKICAgICAgICAjIGNhdXNpbmcgdGhlIE5vbi1GaW5hbCB0c2FkaSB0byBhcHBlYXIgYXQgYW4gZW5kIG9mIGEgd29yZCBldmVuCiAgICAgICAgIyB0aG91Z2ggdGhpcyBpcyBub3QgdGhlIGNhc2UgaW4gdGhlIG9yaWdpbmFsIHRleHQuCiAgICAgICAgIyBUaGUgbGV0dGVycyBQZSBhbmQgS2FmIHJhcmVseSBkaXNwbGF5IGEgcmVsYXRlZCBiZWhhdmlvciBvZiBub3QgYmVpbmcKICAgICAgICAjIGEgZ29vZCBOb24tRmluYWwgbGV0dGVyLiBXb3JkcyBsaWtlICdQb3AnLCAnV2luYW1wJyBhbmQgJ011YmFyYWsnCiAgICAgICAgIyBmb3IgZXhhbXBsZSBsZWdhbGx5IGVuZCB3aXRoIGEgTm9uLUZpbmFsIFBlIG9yIEthZi4gSG93ZXZlciwgdGhlCiAgICAgICAgIyBiZW5lZml0IG9mIHRoZXNlIGxldHRlcnMgYXMgTm9uLUZpbmFsIGxldHRlcnMgb3V0d2VpZ2hzIHRoZSBkYW1hZ2UKICAgICAgICAjIHNpbmNlIHRoZXNlIHdvcmRzIGFyZSBxdWl0ZSByYXJlLgogICAgICAgIHJldHVybiBjIGluIFtzZWxmLk5PUk1BTF9LQUYsIHNlbGYuTk9STUFMX01FTSwKICAgICAgICAgICAgICAgICAgICAgc2VsZi5OT1JNQUxfTlVOLCBzZWxmLk5PUk1BTF9QRV0KCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBGaW5hbCBsZXR0ZXIgYW5hbHlzaXMgZm9yIGxvZ2ljYWwtdmlzdWFsIGRlY2lzaW9uLgogICAgICAgICMgTG9vayBmb3IgZXZpZGVuY2UgdGhhdCB0aGUgcmVjZWl2ZWQgYnVmZmVyIGlzIGVpdGhlciBsb2dpY2FsIEhlYnJldwogICAgICAgICMgb3IgdmlzdWFsIEhlYnJldy4KICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGNoZWNrZWQ6CiAgICAgICAgIyAxKSBBIHdvcmQgbG9uZ2VyIHRoYW4gMSBsZXR0ZXIsIGVuZGluZyB3aXRoIGEgZmluYWwgbGV0dGVyLiBUaGlzIGlzCiAgICAgICAgIyAgICBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIHRleHQgaXMgbGFpZCBvdXQgIm5hdHVyYWxseSIgc2luY2UgdGhlCiAgICAgICAgIyAgICBmaW5hbCBsZXR0ZXIgcmVhbGx5IGFwcGVhcnMgYXQgdGhlIGVuZC4gKzEgZm9yIGxvZ2ljYWwgc2NvcmUuCiAgICAgICAgIyAyKSBBIHdvcmQgbG9uZ2VyIHRoYW4gMSBsZXR0ZXIsIGVuZGluZyB3aXRoIGEgTm9uLUZpbmFsIGxldHRlci4gSW4KICAgICAgICAjICAgIG5vcm1hbCBIZWJyZXcsIHdvcmRzIGVuZGluZyB3aXRoIEthZiwgTWVtLCBOdW4sIFBlIG9yIFRzYWRpLAogICAgICAgICMgICAgc2hvdWxkIG5vdCBlbmQgd2l0aCB0aGUgTm9uLUZpbmFsIGZvcm0gb2YgdGhhdCBsZXR0ZXIuIEV4Y2VwdGlvbnMKICAgICAgICAjICAgIHRvIHRoaXMgcnVsZSBhcmUgbWVudGlvbmVkIGFib3ZlIGluIGlzTm9uRmluYWwoKS4gVGhpcyBpcyBhbgogICAgICAgICMgICAgaW5kaWNhdGlvbiB0aGF0IHRoZSB0ZXh0IGlzIGxhaWQgb3V0IGJhY2t3YXJkcy4gKzEgZm9yIHZpc3VhbAogICAgICAgICMgICAgc2NvcmUKICAgICAgICAjIDMpIEEgd29yZCBsb25nZXIgdGhhbiAxIGxldHRlciwgc3RhcnRpbmcgd2l0aCBhIGZpbmFsIGxldHRlci4gRmluYWwKICAgICAgICAjICAgIGxldHRlcnMgc2hvdWxkIG5vdCBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHdvcmQuIFRoaXMgaXMgYW4KICAgICAgICAjICAgIGluZGljYXRpb24gdGhhdCB0aGUgdGV4dCBpcyBsYWlkIG91dCBiYWNrd2FyZHMuICsxIGZvciB2aXN1YWwKICAgICAgICAjICAgIHNjb3JlLgogICAgICAgICMKICAgICAgICAjIFRoZSB2aXN1YWwgc2NvcmUgYW5kIGxvZ2ljYWwgc2NvcmUgYXJlIGFjY3VtdWxhdGVkIHRocm91Z2hvdXQgdGhlCiAgICAgICAgIyB0ZXh0IGFuZCBhcmUgZmluYWxseSBjaGVja2VkIGFnYWluc3QgZWFjaCBvdGhlciBpbiBHZXRDaGFyU2V0TmFtZSgpLgogICAgICAgICMgTm8gY2hlY2tpbmcgZm9yIGZpbmFsIGxldHRlcnMgaW4gdGhlIG1pZGRsZSBvZiB3b3JkcyBpcyBkb25lIHNpbmNlCiAgICAgICAgIyB0aGF0IGNhc2UgaXMgbm90IGFuIGluZGljYXRpb24gZm9yIGVpdGhlciBMb2dpY2FsIG9yIFZpc3VhbCB0ZXh0LgogICAgICAgICMKICAgICAgICAjIFdlIGF1dG9tYXRpY2FsbHkgZmlsdGVyIG91dCBhbGwgNy1iaXQgY2hhcmFjdGVycyAocmVwbGFjZSB0aGVtIHdpdGgKICAgICAgICAjIHNwYWNlcykgc28gdGhlIHdvcmQgYm91bmRhcnkgZGV0ZWN0aW9uIHdvcmtzIHByb3Blcmx5LiBbTUFQXQoKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUU6CiAgICAgICAgICAgICMgQm90aCBtb2RlbCBwcm9iZXJzIHNheSBpdCdzIG5vdCB0aGVtLiBObyByZWFzb24gdG8gY29udGludWUuCiAgICAgICAgICAgIHJldHVybiBQcm9iaW5nU3RhdGUuTk9UX01FCgogICAgICAgIGJ5dGVfc3RyID0gc2VsZi5maWx0ZXJfaGlnaF9ieXRlX29ubHkoYnl0ZV9zdHIpCgogICAgICAgIGZvciBjdXIgaW4gYnl0ZV9zdHI6CiAgICAgICAgICAgIGlmIGN1ciA9PSAnICc6CiAgICAgICAgICAgICAgICAjIFdlIHN0YW5kIG9uIGEgc3BhY2UgLSBhIHdvcmQganVzdCBlbmRlZAogICAgICAgICAgICAgICAgaWYgc2VsZi5fYmVmb3JlX3ByZXYgIT0gJyAnOgogICAgICAgICAgICAgICAgICAgICMgbmV4dC10by1sYXN0IGNoYXIgd2FzIG5vdCBhIHNwYWNlIHNvIHNlbGYuX3ByZXYgaXMgbm90IGEKICAgICAgICAgICAgICAgICAgICAjIDEgbGV0dGVyIHdvcmQKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2ZpbmFsKHNlbGYuX3ByZXYpOgogICAgICAgICAgICAgICAgICAgICAgICAjIGNhc2UgKDEpIFstMjpub3Qgc3BhY2VdWy0xOmZpbmFsIGxldHRlcl1bY3VyOnNwYWNlXQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9maW5hbF9jaGFyX2xvZ2ljYWxfc2NvcmUgKz0gMQogICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5pc19ub25fZmluYWwoc2VsZi5fcHJldik6CiAgICAgICAgICAgICAgICAgICAgICAgICMgY2FzZSAoMikgWy0yOm5vdCBzcGFjZV1bLTE6Tm9uLUZpbmFsIGxldHRlcl1bCiAgICAgICAgICAgICAgICAgICAgICAgICMgIGN1cjpzcGFjZV0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmluYWxfY2hhcl92aXN1YWxfc2NvcmUgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBOb3Qgc3RhbmRpbmcgb24gYSBzcGFjZQogICAgICAgICAgICAgICAgaWYgKChzZWxmLl9iZWZvcmVfcHJldiA9PSAnICcpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5pc19maW5hbChzZWxmLl9wcmV2KSkgYW5kIChjdXIgIT0gJyAnKSk6CiAgICAgICAgICAgICAgICAgICAgIyBjYXNlICgzKSBbLTI6c3BhY2VdWy0xOmZpbmFsIGxldHRlcl1bY3VyOm5vdCBzcGFjZV0KICAgICAgICAgICAgICAgICAgICBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZSArPSAxCiAgICAgICAgICAgIHNlbGYuX2JlZm9yZV9wcmV2ID0gc2VsZi5fcHJldgogICAgICAgICAgICBzZWxmLl9wcmV2ID0gY3VyCgogICAgICAgICMgRm9yZXZlciBkZXRlY3RpbmcsIHRpbGwgdGhlIGVuZCBvciB1bnRpbCBib3RoIG1vZGVsIHByb2JlcnMgcmV0dXJuCiAgICAgICAgIyBQcm9iaW5nU3RhdGUuTk9UX01FIChoYW5kbGVkIGFib3ZlKQogICAgICAgIHJldHVybiBQcm9iaW5nU3RhdGUuREVURUNUSU5HCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgICMgTWFrZSB0aGUgZGVjaXNpb246IGlzIGl0IExvZ2ljYWwgb3IgVmlzdWFsPwogICAgICAgICMgSWYgdGhlIGZpbmFsIGxldHRlciBzY29yZSBkaXN0YW5jZSBpcyBkb21pbmFudCBlbm91Z2gsIHJlbHkgb24gaXQuCiAgICAgICAgZmluYWxzdWIgPSBzZWxmLl9maW5hbF9jaGFyX2xvZ2ljYWxfc2NvcmUgLSBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZQogICAgICAgIGlmIGZpbmFsc3ViID49IHNlbGYuTUlOX0ZJTkFMX0NIQVJfRElTVEFOQ0U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLkxPR0lDQUxfSEVCUkVXX05BTUUKICAgICAgICBpZiBmaW5hbHN1YiA8PSAtc2VsZi5NSU5fRklOQUxfQ0hBUl9ESVNUQU5DRToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuVklTVUFMX0hFQlJFV19OQU1FCgogICAgICAgICMgSXQncyBub3QgZG9taW5hbnQgZW5vdWdoLCB0cnkgdG8gcmVseSBvbiB0aGUgbW9kZWwgc2NvcmVzIGluc3RlYWQuCiAgICAgICAgbW9kZWxzdWIgPSAoc2VsZi5fbG9naWNhbF9wcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICAgICAgICAgIC0gc2VsZi5fdmlzdWFsX3Byb2Jlci5nZXRfY29uZmlkZW5jZSgpKQogICAgICAgIGlmIG1vZGVsc3ViID4gc2VsZi5NSU5fTU9ERUxfRElTVEFOQ0U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLkxPR0lDQUxfSEVCUkVXX05BTUUKICAgICAgICBpZiBtb2RlbHN1YiA8IC1zZWxmLk1JTl9NT0RFTF9ESVNUQU5DRToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuVklTVUFMX0hFQlJFV19OQU1FCgogICAgICAgICMgU3RpbGwgbm8gZ29vZCwgYmFjayB0byBmaW5hbCBsZXR0ZXIgZGlzdGFuY2UsIG1heWJlIGl0J2xsIHNhdmUgdGhlCiAgICAgICAgIyBkYXkuCiAgICAgICAgaWYgZmluYWxzdWIgPCAwLjA6CiAgICAgICAgICAgIHJldHVybiBzZWxmLlZJU1VBTF9IRUJSRVdfTkFNRQoKICAgICAgICAjIChmaW5hbHN1YiA+IDAgLSBMb2dpY2FsKSBvciAoZG9uJ3Qga25vdyB3aGF0IHRvIGRvKSBkZWZhdWx0IHRvCiAgICAgICAgIyBMb2dpY2FsLgogICAgICAgIHJldHVybiBzZWxmLkxPR0lDQUxfSEVCUkVXX05BTUUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gJ0hlYnJldycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzdGF0ZShzZWxmKToKICAgICAgICAjIFJlbWFpbiBhY3RpdmUgYXMgbG9uZyBhcyBhbnkgb2YgdGhlIG1vZGVsIHByb2JlcnMgYXJlIGFjdGl2ZS4KICAgICAgICBpZiAoc2VsZi5fbG9naWNhbF9wcm9iZXIuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRSkgYW5kIFwKICAgICAgICAgICAoc2VsZi5fdmlzdWFsX3Byb2Jlci5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuTk9UX01FKToKICAgICAgICAgICAgcmV0dXJuIFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICByZXR1cm4gUHJvYmluZ1N0YXRlLkRFVEVDVElORwpQSwMEFAAAAAAAAAAhAMIaOWGxZAAAsWQAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvamlzZnJlcS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBTYW1wbGluZyBmcm9tIGFib3V0IDIwTSB0ZXh0IG1hdGVyaWFscyBpbmNsdWRlIGxpdGVyYXR1cmUgYW5kIGNvbXB1dGVyIHRlY2hub2xvZ3kKIwojIEphcGFuZXNlIGZyZXF1ZW5jeSB0YWJsZSwgYXBwbGllZCB0byBib3RoIFMtSklTIGFuZCBFVUMtSlAKIyBUaGV5IGFyZSBzb3J0ZWQgaW4gb3JkZXIuCgojIDEyOCAgLS0+IDAuNzcwOTQKIyAyNTYgIC0tPiAwLjg1NzEwCiMgNTEyICAtLT4gMC45MjYzNQojIDEwMjQgLS0+IDAuOTcxMzAKIyAyMDQ4IC0tPiAwLjk5NDMxCiMKIyBJZGVhbCBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjkyNjM1IC8gKDEtMC45MjYzNSkgPSAxMi41OAojIFJhbmRvbSBEaXN0cmlidXRpb24gUmF0aW9uID0gNTEyIC8gKDI5NjUrNjIrODMrODYtNTEyKSA9IDAuMTkxCiMKIyBUeXBpY2FsIERpc3RyaWJ1dGlvbiBSYXRpbywgMjUlIG9mIElEUgoKSklTX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPID0gMy4wCgojIENoYXIgdG8gRnJlcU9yZGVyIHRhYmxlICwKSklTX1RBQkxFX1NJWkUgPSA0MzY4CgpKSVNfQ0hBUl9UT19GUkVRX09SREVSID0gKAogIDQwLCAgIDEsICAgNiwgMTgyLCAxNTIsIDE4MCwgMjk1LDIxMjcsIDI4NSwgMzgxLDMyOTUsNDMwNCwzMDY4LDQ2MDYsMzE2NSwzNTEwLCAjICAgMTYKMzUxMSwxODIyLDI3ODUsNDYwNywxMTkzLDIyMjYsNTA3MCw0NjA4LCAxNzEsMjk5NiwxMjQ3LCAgMTgsIDE3OSw1MDcxLCA4NTYsMTY2MSwgIyAgIDMyCjEyNjIsNTA3MiwgNjE5LCAxMjcsMzQzMSwzNTEyLDMyMzAsMTg5OSwxNzAwLCAyMzIsIDIyOCwxMjk0LDEyOTgsIDI4NCwgMjgzLDIwNDEsICMgICA0OAoyMDQyLDEwNjEsMTA2MiwgIDQ4LCAgNDksICA0NCwgIDQ1LCA0MzMsIDQzNCwxMDQwLDEwNDEsIDk5NiwgNzg3LDI5OTcsMTI1NSw0MzA1LCAjICAgNjQKMjEwOCw0NjA5LDE2ODQsMTY0OCw1MDczLDUwNzQsNTA3NSw1MDc2LDUwNzcsNTA3OCwzNjg3LDUwNzksNDYxMCw1MDgwLDM5MjcsMzkyOCwgIyAgIDgwCjUwODEsMzI5NiwzNDMyLCAyOTAsMjI4NSwxNDcxLDIxODcsNTA4MiwyNTgwLDI4MjUsMTMwMywyMTQwLDE3MzksMTQ0NSwyNjkxLDMzNzUsICMgICA5NgoxNjkxLDMyOTcsNDMwNiw0MzA3LDQ2MTEsIDQ1MiwzMzc2LDExODIsMjcxMywzNjg4LDMwNjksNDMwOCw1MDgzLDUwODQsNTA4NSw1MDg2LCAjICAxMTIKNTA4Nyw1MDg4LDUwODksNTA5MCw1MDkxLDUwOTIsNTA5Myw1MDk0LDUwOTUsNTA5Niw1MDk3LDUwOTgsNTA5OSw1MTAwLDUxMDEsNTEwMiwgIyAgMTI4CjUxMDMsNTEwNCw1MTA1LDUxMDYsNTEwNyw1MTA4LDUxMDksNTExMCw1MTExLDUxMTIsNDA5Nyw1MTEzLDUxMTQsNTExNSw1MTE2LDUxMTcsICMgIDE0NAo1MTE4LDUxMTksNTEyMCw1MTIxLDUxMjIsNTEyMyw1MTI0LDUxMjUsNTEyNiw1MTI3LDUxMjgsNTEyOSw1MTMwLDUxMzEsNTEzMiw1MTMzLCAjICAxNjAKNTEzNCw1MTM1LDUxMzYsNTEzNyw1MTM4LDUxMzksNTE0MCw1MTQxLDUxNDIsNTE0Myw1MTQ0LDUxNDUsNTE0Niw1MTQ3LDUxNDgsNTE0OSwgIyAgMTc2CjUxNTAsNTE1MSw1MTUyLDQ2MTIsNTE1Myw1MTU0LDUxNTUsNTE1Niw1MTU3LDUxNTgsNTE1OSw1MTYwLDUxNjEsNTE2Miw1MTYzLDUxNjQsICMgIDE5Mgo1MTY1LDUxNjYsNTE2Nyw1MTY4LDUxNjksNTE3MCw1MTcxLDUxNzIsNTE3Myw1MTc0LDUxNzUsMTQ3MiwgNTk4LCA2MTgsIDgyMCwxMjA1LCAjICAyMDgKMTMwOSwxNDEyLDE4NTgsMTMwNywxNjkyLDUxNzYsNTE3Nyw1MTc4LDUxNzksNTE4MCw1MTgxLDUxODIsMTE0MiwxNDUyLDEyMzQsMTE3MiwgIyAgMjI0CjE4NzUsMjA0MywyMTQ5LDE3OTMsMTM4MiwyOTczLCA5MjUsMjQwNCwxMDY3LDEyNDEsIDk2MCwxMzc3LDI5MzUsMTQ5MSwgOTE5LDEyMTcsICMgIDI0MAoxODY1LDIwMzAsMTQwNiwxNDk5LDI3NDksNDA5OCw1MTgzLDUxODQsNTE4NSw1MTg2LDUxODcsNTE4OCwyNTYxLDQwOTksMzExNywxODA0LCAjICAyNTYKMjA0OSwzNjg5LDQzMDksMzUxMywxNjYzLDUxODksMzE2NiwzMTE4LDMyOTgsMTU4NywxNTYxLDM0MzMsNTE5MCwzMTE5LDE2MjUsMjk5OCwgIyAgMjcyCjMyOTksNDYxMywxNzY2LDM2OTAsMjc4Niw0NjE0LDUxOTEsNTE5Miw1MTkzLDUxOTQsMjE2MSwgIDI2LDMzNzcsICAgMiwzOTI5LCAgMjAsICMgIDI4OAozNjkxLCAgNDcsNDEwMCwgIDUwLCAgMTcsICAxNiwgIDM1LCAyNjgsICAyNywgMjQzLCAgNDIsIDE1NSwgIDI0LCAxNTQsICAyOSwgMTg0LCAjICAzMDQKICAgNCwgIDkxLCAgMTQsICA5MiwgIDUzLCAzOTYsICAzMywgMjg5LCAgIDksICAzNywgIDY0LCA2MjAsICAyMSwgIDM5LCAzMjEsICAgNSwgIyAgMzIwCiAgMTIsICAxMSwgIDUyLCAgMTMsICAgMywgMjA4LCAxMzgsICAgMCwgICA3LCAgNjAsIDUyNiwgMTQxLCAxNTEsMTA2OSwgMTgxLCAyNzUsICMgIDMzNgoxNTkxLCAgODMsIDEzMiwxNDc1LCAxMjYsIDMzMSwgODI5LCAgMTUsICA2OSwgMTYwLCAgNTksICAyMiwgMTU3LCAgNTUsMTA3OSwgMzEyLCAjICAzNTIKIDEwOSwgIDM4LCAgMjMsICAyNSwgIDEwLCAgMTksICA3OSw1MTk1LCAgNjEsIDM4MiwxMTI0LCAgIDgsICAzMCw1MTk2LDUxOTcsNTE5OCwgIyAgMzY4CjUxOTksNTIwMCw1MjAxLDUyMDIsNTIwMyw1MjA0LDUyMDUsNTIwNiwgIDg5LCAgNjIsICA3NCwgIDM0LDI0MTYsIDExMiwgMTM5LCAxOTYsICMgIDM4NAogMjcxLCAxNDksICA4NCwgNjA3LCAxMzEsIDc2NSwgIDQ2LCAgODgsIDE1MywgNjgzLCAgNzYsIDg3NCwgMTAxLCAyNTgsICA1NywgIDgwLCAjICA0MDAKICAzMiwgMzY0LCAxMjEsMTUwOCwgMTY5LDE1NDcsICA2OCwgMjM1LCAxNDUsMjk5OSwgIDQxLCAzNjAsMzAyNywgIDcwLCAgNjMsICAzMSwgIyAgNDE2CiAgNDMsIDI1OSwgMjYyLDEzODMsICA5OSwgNTMzLCAxOTQsICA2NiwgIDkzLCA4NDYsIDIxNywgMTkyLCAgNTYsIDEwNiwgIDU4LCA1NjUsICMgIDQzMgogMjgwLCAyNzIsIDMxMSwgMjU2LCAxNDYsICA4MiwgMzA4LCAgNzEsIDEwMCwgMTI4LCAyMTQsIDY1NSwgMTEwLCAyNjEsIDEwNCwxMTQwLCAjICA0NDgKICA1NCwgIDUxLCAgMzYsICA4NywgIDY3LDMwNzAsIDE4NSwyNjE4LDI5MzYsMjAyMCwgIDI4LDEwNjYsMjM5MCwyMDU5LDUyMDcsNTIwOCwgIyAgNDY0CjUyMDksNTIxMCw1MjExLDUyMTIsNTIxMyw1MjE0LDUyMTUsNTIxNiw0NjE1LDUyMTcsNTIxOCw1MjE5LDUyMjAsNTIyMSw1MjIyLDUyMjMsICMgIDQ4MAo1MjI0LDUyMjUsNTIyNiw1MjI3LDUyMjgsNTIyOSw1MjMwLDUyMzEsNTIzMiw1MjMzLDUyMzQsNTIzNSw1MjM2LDM1MTQsNTIzNyw1MjM4LCAjICA0OTYKNTIzOSw1MjQwLDUyNDEsNTI0Miw1MjQzLDUyNDQsMjI5NywyMDMxLDQ2MTYsNDMxMCwzNjkyLDUyNDUsMzA3MSw1MjQ2LDM1OTgsNTI0NywgIyAgNTEyCjQ2MTcsMzIzMSwzNTE1LDUyNDgsNDEwMSw0MzExLDQ2MTgsMzgwOCw0MzEyLDQxMDIsNTI0OSw0MTAzLDQxMDQsMzU5OSw1MjUwLDUyNTEsICMgIDUyOAo1MjUyLDUyNTMsNTI1NCw1MjU1LDUyNTYsNTI1Nyw1MjU4LDUyNTksNTI2MCw1MjYxLDUyNjIsNTI2Myw1MjY0LDUyNjUsNTI2Niw1MjY3LCAjICA1NDQKNTI2OCw1MjY5LDUyNzAsNTI3MSw1MjcyLDUyNzMsNTI3NCw1Mjc1LDUyNzYsNTI3Nyw1Mjc4LDUyNzksNTI4MCw1MjgxLDUyODIsNTI4MywgIyAgNTYwCjUyODQsNTI4NSw1Mjg2LDUyODcsNTI4OCw1Mjg5LDUyOTAsNTI5MSw1MjkyLDUyOTMsNTI5NCw1Mjk1LDUyOTYsNTI5Nyw1Mjk4LDUyOTksICMgIDU3Ngo1MzAwLDUzMDEsNTMwMiw1MzAzLDUzMDQsNTMwNSw1MzA2LDUzMDcsNTMwOCw1MzA5LDUzMTAsNTMxMSw1MzEyLDUzMTMsNTMxNCw1MzE1LCAjICA1OTIKNTMxNiw1MzE3LDUzMTgsNTMxOSw1MzIwLDUzMjEsNTMyMiw1MzIzLDUzMjQsNTMyNSw1MzI2LDUzMjcsNTMyOCw1MzI5LDUzMzAsNTMzMSwgIyAgNjA4CjUzMzIsNTMzMyw1MzM0LDUzMzUsNTMzNiw1MzM3LDUzMzgsNTMzOSw1MzQwLDUzNDEsNTM0Miw1MzQzLDUzNDQsNTM0NSw1MzQ2LDUzNDcsICMgIDYyNAo1MzQ4LDUzNDksNTM1MCw1MzUxLDUzNTIsNTM1Myw1MzU0LDUzNTUsNTM1Niw1MzU3LDUzNTgsNTM1OSw1MzYwLDUzNjEsNTM2Miw1MzYzLCAjICA2NDAKNTM2NCw1MzY1LDUzNjYsNTM2Nyw1MzY4LDUzNjksNTM3MCw1MzcxLDUzNzIsNTM3Myw1Mzc0LDUzNzUsNTM3Niw1Mzc3LDUzNzgsNTM3OSwgIyAgNjU2CjUzODAsNTM4MSwgMzYzLCA2NDIsMjc4NywyODc4LDI3ODgsMjc4OSwyMzE2LDMyMzIsMjMxNywzNDM0LDIwMTEsIDE2NSwxOTQyLDM5MzAsICMgIDY3MgozOTMxLDM5MzIsMzkzMyw1MzgyLDQ2MTksNTM4Myw0NjIwLDUzODQsNTM4NSw1Mzg2LDUzODcsNTM4OCw1Mzg5LDUzOTAsNTM5MSw1MzkyLCAjICA2ODgKNTM5Myw1Mzk0LDUzOTUsNTM5Niw1Mzk3LDUzOTgsNTM5OSw1NDAwLDU0MDEsNTQwMiw1NDAzLDU0MDQsNTQwNSw1NDA2LDU0MDcsNTQwOCwgIyAgNzA0CjU0MDksNTQxMCw1NDExLDU0MTIsNTQxMyw1NDE0LDU0MTUsNTQxNiw1NDE3LDU0MTgsNTQxOSw1NDIwLDU0MjEsNTQyMiw1NDIzLDU0MjQsICMgIDcyMAo1NDI1LDU0MjYsNTQyNyw1NDI4LDU0MjksNTQzMCw1NDMxLDU0MzIsNTQzMyw1NDM0LDU0MzUsNTQzNiw1NDM3LDU0MzgsNTQzOSw1NDQwLCAjICA3MzYKNTQ0MSw1NDQyLDU0NDMsNTQ0NCw1NDQ1LDU0NDYsNTQ0Nyw1NDQ4LDU0NDksNTQ1MCw1NDUxLDU0NTIsNTQ1Myw1NDU0LDU0NTUsNTQ1NiwgIyAgNzUyCjU0NTcsNTQ1OCw1NDU5LDU0NjAsNTQ2MSw1NDYyLDU0NjMsNTQ2NCw1NDY1LDU0NjYsNTQ2Nyw1NDY4LDU0NjksNTQ3MCw1NDcxLDU0NzIsICMgIDc2OAo1NDczLDU0NzQsNTQ3NSw1NDc2LDU0NzcsNTQ3OCw1NDc5LDU0ODAsNTQ4MSw1NDgyLDU0ODMsNTQ4NCw1NDg1LDU0ODYsNTQ4Nyw1NDg4LCAjICA3ODQKNTQ4OSw1NDkwLDU0OTEsNTQ5Miw1NDkzLDU0OTQsNTQ5NSw1NDk2LDU0OTcsNTQ5OCw1NDk5LDU1MDAsNTUwMSw1NTAyLDU1MDMsNTUwNCwgIyAgODAwCjU1MDUsNTUwNiw1NTA3LDU1MDgsNTUwOSw1NTEwLDU1MTEsNTUxMiw1NTEzLDU1MTQsNTUxNSw1NTE2LDU1MTcsNTUxOCw1NTE5LDU1MjAsICMgIDgxNgo1NTIxLDU1MjIsNTUyMyw1NTI0LDU1MjUsNTUyNiw1NTI3LDU1MjgsNTUyOSw1NTMwLDU1MzEsNTUzMiw1NTMzLDU1MzQsNTUzNSw1NTM2LCAjICA4MzIKNTUzNyw1NTM4LDU1MzksNTU0MCw1NTQxLDU1NDIsNTU0Myw1NTQ0LDU1NDUsNTU0Niw1NTQ3LDU1NDgsNTU0OSw1NTUwLDU1NTEsNTU1MiwgIyAgODQ4CjU1NTMsNTU1NCw1NTU1LDU1NTYsNTU1Nyw1NTU4LDU1NTksNTU2MCw1NTYxLDU1NjIsNTU2Myw1NTY0LDU1NjUsNTU2Niw1NTY3LDU1NjgsICMgIDg2NAo1NTY5LDU1NzAsNTU3MSw1NTcyLDU1NzMsNTU3NCw1NTc1LDU1NzYsNTU3Nyw1NTc4LDU1NzksNTU4MCw1NTgxLDU1ODIsNTU4Myw1NTg0LCAjICA4ODAKNTU4NSw1NTg2LDU1ODcsNTU4OCw1NTg5LDU1OTAsNTU5MSw1NTkyLDU1OTMsNTU5NCw1NTk1LDU1OTYsNTU5Nyw1NTk4LDU1OTksNTYwMCwgIyAgODk2CjU2MDEsNTYwMiw1NjAzLDU2MDQsNTYwNSw1NjA2LDU2MDcsNTYwOCw1NjA5LDU2MTAsNTYxMSw1NjEyLDU2MTMsNTYxNCw1NjE1LDU2MTYsICMgIDkxMgo1NjE3LDU2MTgsNTYxOSw1NjIwLDU2MjEsNTYyMiw1NjIzLDU2MjQsNTYyNSw1NjI2LDU2MjcsNTYyOCw1NjI5LDU2MzAsNTYzMSw1NjMyLCAjICA5MjgKNTYzMyw1NjM0LDU2MzUsNTYzNiw1NjM3LDU2MzgsNTYzOSw1NjQwLDU2NDEsNTY0Miw1NjQzLDU2NDQsNTY0NSw1NjQ2LDU2NDcsNTY0OCwgIyAgOTQ0CjU2NDksNTY1MCw1NjUxLDU2NTIsNTY1Myw1NjU0LDU2NTUsNTY1Niw1NjU3LDU2NTgsNTY1OSw1NjYwLDU2NjEsNTY2Miw1NjYzLDU2NjQsICMgIDk2MAo1NjY1LDU2NjYsNTY2Nyw1NjY4LDU2NjksNTY3MCw1NjcxLDU2NzIsNTY3Myw1Njc0LDU2NzUsNTY3Niw1Njc3LDU2NzgsNTY3OSw1NjgwLCAjICA5NzYKNTY4MSw1NjgyLDU2ODMsNTY4NCw1Njg1LDU2ODYsNTY4Nyw1Njg4LDU2ODksNTY5MCw1NjkxLDU2OTIsNTY5Myw1Njk0LDU2OTUsNTY5NiwgIyAgOTkyCjU2OTcsNTY5OCw1Njk5LDU3MDAsNTcwMSw1NzAyLDU3MDMsNTcwNCw1NzA1LDU3MDYsNTcwNyw1NzA4LDU3MDksNTcxMCw1NzExLDU3MTIsICMgMTAwOAo1NzEzLDU3MTQsNTcxNSw1NzE2LDU3MTcsNTcxOCw1NzE5LDU3MjAsNTcyMSw1NzIyLDU3MjMsNTcyNCw1NzI1LDU3MjYsNTcyNyw1NzI4LCAjIDEwMjQKNTcyOSw1NzMwLDU3MzEsNTczMiw1NzMzLDU3MzQsNTczNSw1NzM2LDU3MzcsNTczOCw1NzM5LDU3NDAsNTc0MSw1NzQyLDU3NDMsNTc0NCwgIyAxMDQwCjU3NDUsNTc0Niw1NzQ3LDU3NDgsNTc0OSw1NzUwLDU3NTEsNTc1Miw1NzUzLDU3NTQsNTc1NSw1NzU2LDU3NTcsNTc1OCw1NzU5LDU3NjAsICMgMTA1Ngo1NzYxLDU3NjIsNTc2Myw1NzY0LDU3NjUsNTc2Niw1NzY3LDU3NjgsNTc2OSw1NzcwLDU3NzEsNTc3Miw1NzczLDU3NzQsNTc3NSw1Nzc2LCAjIDEwNzIKNTc3Nyw1Nzc4LDU3NzksNTc4MCw1NzgxLDU3ODIsNTc4Myw1Nzg0LDU3ODUsNTc4Niw1Nzg3LDU3ODgsNTc4OSw1NzkwLDU3OTEsNTc5MiwgIyAxMDg4CjU3OTMsNTc5NCw1Nzk1LDU3OTYsNTc5Nyw1Nzk4LDU3OTksNTgwMCw1ODAxLDU4MDIsNTgwMyw1ODA0LDU4MDUsNTgwNiw1ODA3LDU4MDgsICMgMTEwNAo1ODA5LDU4MTAsNTgxMSw1ODEyLDU4MTMsNTgxNCw1ODE1LDU4MTYsNTgxNyw1ODE4LDU4MTksNTgyMCw1ODIxLDU4MjIsNTgyMyw1ODI0LCAjIDExMjAKNTgyNSw1ODI2LDU4MjcsNTgyOCw1ODI5LDU4MzAsNTgzMSw1ODMyLDU4MzMsNTgzNCw1ODM1LDU4MzYsNTgzNyw1ODM4LDU4MzksNTg0MCwgIyAxMTM2CjU4NDEsNTg0Miw1ODQzLDU4NDQsNTg0NSw1ODQ2LDU4NDcsNTg0OCw1ODQ5LDU4NTAsNTg1MSw1ODUyLDU4NTMsNTg1NCw1ODU1LDU4NTYsICMgMTE1Mgo1ODU3LDU4NTgsNTg1OSw1ODYwLDU4NjEsNTg2Miw1ODYzLDU4NjQsNTg2NSw1ODY2LDU4NjcsNTg2OCw1ODY5LDU4NzAsNTg3MSw1ODcyLCAjIDExNjgKNTg3Myw1ODc0LDU4NzUsNTg3Niw1ODc3LDU4NzgsNTg3OSw1ODgwLDU4ODEsNTg4Miw1ODgzLDU4ODQsNTg4NSw1ODg2LDU4ODcsNTg4OCwgIyAxMTg0CjU4ODksNTg5MCw1ODkxLDU4OTIsNTg5Myw1ODk0LDU4OTUsNTg5Niw1ODk3LDU4OTgsNTg5OSw1OTAwLDU5MDEsNTkwMiw1OTAzLDU5MDQsICMgMTIwMAo1OTA1LDU5MDYsNTkwNyw1OTA4LDU5MDksNTkxMCw1OTExLDU5MTIsNTkxMyw1OTE0LDU5MTUsNTkxNiw1OTE3LDU5MTgsNTkxOSw1OTIwLCAjIDEyMTYKNTkyMSw1OTIyLDU5MjMsNTkyNCw1OTI1LDU5MjYsNTkyNyw1OTI4LDU5MjksNTkzMCw1OTMxLDU5MzIsNTkzMyw1OTM0LDU5MzUsNTkzNiwgIyAxMjMyCjU5MzcsNTkzOCw1OTM5LDU5NDAsNTk0MSw1OTQyLDU5NDMsNTk0NCw1OTQ1LDU5NDYsNTk0Nyw1OTQ4LDU5NDksNTk1MCw1OTUxLDU5NTIsICMgMTI0OAo1OTUzLDU5NTQsNTk1NSw1OTU2LDU5NTcsNTk1OCw1OTU5LDU5NjAsNTk2MSw1OTYyLDU5NjMsNTk2NCw1OTY1LDU5NjYsNTk2Nyw1OTY4LCAjIDEyNjQKNTk2OSw1OTcwLDU5NzEsNTk3Miw1OTczLDU5NzQsNTk3NSw1OTc2LDU5NzcsNTk3OCw1OTc5LDU5ODAsNTk4MSw1OTgyLDU5ODMsNTk4NCwgIyAxMjgwCjU5ODUsNTk4Niw1OTg3LDU5ODgsNTk4OSw1OTkwLDU5OTEsNTk5Miw1OTkzLDU5OTQsNTk5NSw1OTk2LDU5OTcsNTk5OCw1OTk5LDYwMDAsICMgMTI5Ngo2MDAxLDYwMDIsNjAwMyw2MDA0LDYwMDUsNjAwNiw2MDA3LDYwMDgsNjAwOSw2MDEwLDYwMTEsNjAxMiw2MDEzLDYwMTQsNjAxNSw2MDE2LCAjIDEzMTIKNjAxNyw2MDE4LDYwMTksNjAyMCw2MDIxLDYwMjIsNjAyMyw2MDI0LDYwMjUsNjAyNiw2MDI3LDYwMjgsNjAyOSw2MDMwLDYwMzEsNjAzMiwgIyAxMzI4CjYwMzMsNjAzNCw2MDM1LDYwMzYsNjAzNyw2MDM4LDYwMzksNjA0MCw2MDQxLDYwNDIsNjA0Myw2MDQ0LDYwNDUsNjA0Niw2MDQ3LDYwNDgsICMgMTM0NAo2MDQ5LDYwNTAsNjA1MSw2MDUyLDYwNTMsNjA1NCw2MDU1LDYwNTYsNjA1Nyw2MDU4LDYwNTksNjA2MCw2MDYxLDYwNjIsNjA2Myw2MDY0LCAjIDEzNjAKNjA2NSw2MDY2LDYwNjcsNjA2OCw2MDY5LDYwNzAsNjA3MSw2MDcyLDYwNzMsNjA3NCw2MDc1LDYwNzYsNjA3Nyw2MDc4LDYwNzksNjA4MCwgIyAxMzc2CjYwODEsNjA4Miw2MDgzLDYwODQsNjA4NSw2MDg2LDYwODcsNjA4OCw2MDg5LDYwOTAsNjA5MSw2MDkyLDYwOTMsNjA5NCw2MDk1LDYwOTYsICMgMTM5Mgo2MDk3LDYwOTgsNjA5OSw2MTAwLDYxMDEsNjEwMiw2MTAzLDYxMDQsNjEwNSw2MTA2LDYxMDcsNjEwOCw2MTA5LDYxMTAsNjExMSw2MTEyLCAjIDE0MDgKNjExMyw2MTE0LDIwNDQsMjA2MCw0NjIxLCA5OTcsMTIzNSwgNDczLDExODYsNDYyMiwgOTIwLDMzNzgsNjExNSw2MTE2LCAzNzksMTEwOCwgIyAxNDI0CjQzMTMsMjY1NywyNzM1LDM5MzQsNjExNywzODA5LCA2MzYsMzIzMywgNTczLDEwMjYsMzY5MywzNDM1LDI5NzQsMzMwMCwyMjk4LDQxMDUsICMgMTQ0MAogODU0LDI5MzcsMjQ2MywgMzkzLDI1ODEsMjQxNywgNTM5LCA3NTIsMTI4MCwyNzUwLDI0ODAsIDE0MCwxMTYxLCA0NDAsIDcwOCwxNTY5LCAjIDE0NTYKIDY2NSwyNDk3LDE3NDYsMTI5MSwxNTIzLDMwMDAsIDE2NCwxNjAzLCA4NDcsMTMzMSwgNTM3LDE5OTcsIDQ4NiwgNTA4LDE2OTMsMjQxOCwgIyAxNDcyCjE5NzAsMjIyNywgODc4LDEyMjAsIDI5OSwxMDMwLCA5NjksIDY1MiwyNzUxLCA2MjQsMTEzNywzMzAxLDI2MTksICA2NSwzMzAyLDIwNDUsICMgMTQ4OAoxNzYxLDE4NTksMzEyMCwxOTMwLDM2OTQsMzUxNiwgNjYzLDE3NjcsIDg1MiwgODM1LDM2OTUsIDI2OSwgNzY3LDI4MjYsMjMzOSwxMzA1LCAjIDE1MDQKIDg5NiwxMTUwLCA3NzAsMTYxNiw2MTE4LCA1MDYsMTUwMiwyMDc1LDEwMTIsMjUxOSwgNzc1LDI1MjAsMjk3NSwyMzQwLDI5MzgsNDMxNCwgIyAxNTIwCjMwMjgsMjA4NiwxMjI0LDE5NDMsMjI4Niw2MTE5LDMwNzIsNDMxNSwyMjQwLDEyNzMsMTk4NywzOTM1LDE1NTcsIDE3NSwgNTk3LCA5ODUsICMgMTUzNgozNTE3LDI0MTksMjUyMSwxNDE2LDMwMjksIDU4NSwgOTM4LDE5MzEsMTAwNywxMDUyLDE5MzIsMTY4NSw2MTIwLDMzNzksNDMxNiw0NjIzLCAjIDE1NTIKIDgwNCwgNTk5LDMxMjEsMTMzMywyMTI4LDI1MzksMTE1OSwxNTU0LDIwMzIsMzgxMCwgNjg3LDIwMzMsMjkwNCwgOTUyLCA2NzUsMTQ2NywgIyAxNTY4CjM0MzYsNjEyMSwyMjQxLDEwOTYsMTc4NiwyNDQwLDE1NDMsMTkyNCwgOTgwLDE4MTMsMjIyOCwgNzgxLDI2OTIsMTg3OSwgNzI4LDE5MTgsICMgMTU4NAozNjk2LDQ2MjQsIDU0OCwxOTUwLDQ2MjUsMTgwOSwxMDg4LDEzNTYsMzMwMywyNTIyLDE5NDQsIDUwMiwgOTcyLCAzNzMsIDUxMywyODI3LCAjIDE2MDAKIDU4NiwyMzc3LDIzOTEsMTAwMywxOTc2LDE2MzEsNjEyMiwyNDY0LDEwODQsIDY0OCwxNzc2LDQ2MjYsMjE0MSwgMzI0LCA5NjIsMjAxMiwgIyAxNjE2CjIxNzcsMjA3NiwxMzg0LCA3NDIsMjE3OCwxNDQ4LDExNzMsMTgxMCwgMjIyLCAxMDIsIDMwMSwgNDQ1LCAxMjUsMjQyMCwgNjYyLDI0OTgsICMgMTYzMgogMjc3LCAyMDAsMTQ3NiwxMTY1LDEwNjgsIDIyNCwyNTYyLDEzNzgsMTQ0NiwgNDUwLDE4ODAsIDY1OSwgNzkxLCA1ODIsNDYyNywyOTM5LCAjIDE2NDgKMzkzNiwxNTE2LDEyNzQsIDU1NSwyMDk5LDM2OTcsMTAyMCwxMzg5LDE1MjYsMzM4MCwxNzYyLDE3MjMsMTc4NywyMjI5LCA0MTIsMjExNCwgIyAxNjY0CjE5MDAsMjM5MiwzNTE4LCA1MTIsMjU5NywgNDI3LDE5MjUsMjM0MSwzMTIyLDE2NTMsMTY4NiwyNDY1LDI0OTksIDY5NywgMzMwLCAyNzMsICMgMTY4MAogMzgwLDIxNjIsIDk1MSwgODMyLCA3ODAsIDk5MSwxMzAxLDMwNzMsIDk2NSwyMjcwLDM1MTksIDY2OCwyNTIzLDI2MzYsMTI4NiwgNTM1LCAjIDE2OTYKMTQwNywgNTE4LCA2NzEsIDk1NywyNjU4LDIzNzgsIDI2NywgNjExLDIxOTcsMzAzMCw2MTIzLCAyNDgsMjI5OSwgOTY3LDE3OTksMjM1NiwgIyAxNzEyCiA4NTAsMTQxOCwzNDM3LDE4NzYsMTI1NiwxNDgwLDI4MjgsMTcxOCw2MTI0LDYxMjUsMTc1NSwxNjY0LDI0MDUsNjEyNiw0NjI4LDI4NzksICMgMTcyOAoyODI5LCA0OTksMjE3OSwgNjc2LDQ2MjksIDU1NywyMzI5LDIyMTQsMjA5MCwgMzI1LDMyMzQsIDQ2NCwgODExLDMwMDEsIDk5MiwyMzQyLCAjIDE3NDQKMjQ4MSwxMjMyLDE0NjksIDMwMywyMjQyLCA0NjYsMTA3MCwyMTYzLCA2MDMsMTc3NywyMDkxLDQ2MzAsMjc1Miw0NjMxLDI3MTQsIDMyMiwgIyAxNzYwCjI2NTksMTk2NCwxNzY4LCA0ODEsMjE4OCwxNDYzLDIzMzAsMjg1NywzNjAwLDIwOTIsMzAzMSwyNDIxLDQ2MzIsMjMxOCwyMDcwLDE4NDksICMgMTc3NgoyNTk4LDQ2MzMsMTMwMiwyMjU0LDE2NjgsMTcwMSwyNDIyLDM4MTEsMjkwNSwzMDMyLDMxMjMsMjA0Niw0MTA2LDE3NjMsMTY5NCw0NjM0LCAjIDE3OTIKMTYwNCwgOTQzLDE3MjQsMTQ1NCwgOTE3LCA4NjgsMjIxNSwxMTY5LDI5NDAsIDU1MiwxMTQ1LDE4MDAsMTIyOCwxODIzLDE5NTUsIDMxNiwgIyAxODA4CjEwODAsMjUxMCwgMzYxLDE4MDcsMjgzMCw0MTA3LDI2NjAsMzM4MSwxMzQ2LDE0MjMsMTEzNCw0MTA4LDYxMjcsIDU0MSwxMjYzLDEyMjksICMgMTgyNAoxMTQ4LDI1NDAsIDU0NSwgNDY1LDE4MzMsMjg4MCwzNDM4LDE5MDEsMzA3NCwyNDgyLCA4MTYsMzkzNywgNzEzLDE3ODgsMjUwMCwgMTIyLCAjIDE4NDAKMTU3NSwgMTk1LDE0NTEsMjUwMSwxMTExLDYxMjgsIDg1OSwgMzc0LDEyMjUsMjI0MywyNDgzLDQzMTcsIDM5MCwxMDMzLDM0MzksMzA3NSwgIyAxODU2CjI1MjQsMTY4NywgMjY2LCA3OTMsMTQ0MCwyNTk5LCA5NDYsIDc3OSwgODAyLCA1MDcsIDg5NywxMDgxLCA1MjgsMjE4OSwxMjkyLCA3MTEsICMgMTg3MgoxODY2LDE3MjUsMTE2NywxNjQwLCA3NTMsIDM5OCwyNjYxLDEwNTMsIDI0NiwgMzQ4LDQzMTgsIDEzNywxMDI0LDM0NDAsMTYwMCwyMDc3LCAjIDE4ODgKMjEyOSwgODI1LDQzMTksIDY5OCwgMjM4LCA1MjEsIDE4NywyMzAwLDExNTcsMjQyMywxNjQxLDE2MDUsMTQ2NCwxNjEwLDEwOTcsMjU0MSwgIyAxOTA0CjEyNjAsMTQzNiwgNzU5LDIyNTUsMTgxNCwyMTUwLCA3MDUsMzIzNSwgNDA5LDI1NjMsMzMwNCwgNTYxLDMwMzMsMjAwNSwyNTY0LCA3MjYsICMgMTkyMAoxOTU2LDIzNDMsMzY5OCw0MTA5LCA5NDksMzgxMiwzODEzLDM1MjAsMTY2OSwgNjUzLDEzNzksMjUyNSwgODgxLDIxOTgsIDYzMiwyMjU2LCAjIDE5MzYKMTAyNywgNzc4LDEwNzQsIDczMywxOTU3LCA1MTQsMTQ4MSwyNDY2LCA1NTQsMjE4MCwgNzAyLDM5MzgsMTYwNiwxMDE3LDEzOTgsNjEyOSwgIyAxOTUyCjEzODAsMzUyMSwgOTIxLCA5OTMsMTMxMywgNTk0LCA0NDksMTQ4OSwxNjE3LDExNjYsIDc2OCwxNDI2LDEzNjAsIDQ5NSwxNzk0LDM2MDEsICMgMTk2OAoxMTc3LDM2MDIsMTE3MCw0MzIwLDIzNDQsIDQ3NiwgNDI1LDMxNjcsNDYzNSwzMTY4LDE0MjQsIDQwMSwyNjYyLDExNzEsMzM4MiwxOTk4LCAjIDE5ODQKMTA4OSw0MTEwLCA0NzcsMzE2OSwgNDc0LDYxMzAsMTkwOSwgNTk2LDI4MzEsMTg0MiwgNDk0LCA2OTMsMTA1MSwxMDI4LDEyMDcsMzA3NiwgIyAyMDAwCiA2MDYsMjExNSwgNzI3LDI3OTAsMTQ3MywxMTE1LCA3NDMsMzUyMiwgNjMwLCA4MDUsMTUzMiw0MzIxLDIwMjEsIDM2NiwxMDU3LCA4MzgsICMgMjAxNgogNjg0LDExMTQsMjE0Miw0MzIyLDIwNTAsMTQ5MiwxODkyLDE4MDgsMjI3MSwzODE0LDI0MjQsMTk3MSwxNDQ3LDEzNzMsMzMwNSwxMDkwLCAjIDIwMzIKMTUzNiwzOTM5LDM1MjMsMzMwNiwxNDU1LDIxOTksIDMzNiwgMzY5LDIzMzEsMTAzNSwgNTg0LDIzOTMsIDkwMiwgNzE4LDI2MDAsNjEzMSwgIyAyMDQ4CjI3NTMsIDQ2MywyMTUxLDExNDksMTYxMSwyNDY3LCA3MTUsMTMwOCwzMTI0LDEyNjgsIDM0MywxNDEzLDMyMzYsMTUxNywxMzQ3LDI2NjMsICMgMjA2NAoyMDkzLDM5NDAsMjAyMiwxMTMxLDE1NTMsMjEwMCwyOTQxLDE0MjcsMzQ0MSwyOTQyLDEzMjMsMjQ4NCw2MTMyLDE5ODAsIDg3MiwyMzY4LCAjIDIwODAKMjQ0MSwyOTQzLCAzMjAsMjM2OSwyMTE2LDEwODIsIDY3OSwxOTMzLDM5NDEsMjc5MSwzODE1LCA2MjUsMTE0MywyMDIzLCA0MjIsMjIwMCwgIyAyMDk2CjM4MTYsNjEzMywgNzMwLDE2OTUsIDM1NiwyMjU3LDE2MjYsMjMwMSwyODU4LDI2MzcsMTYyNywxNzc4LCA5MzcsIDg4MywyOTA2LDI2OTMsICMgMjExMgozMDAyLDE3NjksMTA4NiwgNDAwLDEwNjMsMTMyNSwzMzA3LDI3OTIsNDExMSwzMDc3LCA0NTYsMjM0NSwxMDQ2LCA3NDcsNjEzNCwxNTI0LCAjIDIxMjgKIDg4NCwxMDk0LDMzODMsMTQ3NCwyMTY0LDEwNTksIDk3NCwxNjg4LDIxODEsMjI1OCwxMDQ3LCAzNDUsMTY2NSwxMTg3LCAzNTgsIDg3NSwgIyAyMTQ0CjMxNzAsIDMwNSwgNjYwLDM1MjQsMjE5MCwxMzM0LDExMzUsMzE3MSwxNTQwLDE2NDksMjU0MiwxNTI3LCA5MjcsIDk2OCwyNzkzLCA4ODUsICMgMjE2MAoxOTcyLDE4NTAsIDQ4MiwgNTAwLDI2MzgsMTIxOCwxMTA5LDEwODUsMjU0MywxNjU0LDIwMzQsIDg3NiwgIDc4LDIyODcsMTQ4MiwxMjc3LCAjIDIxNzYKIDg2MSwxNjc1LDEwODMsMTc3OSwgNzI0LDI3NTQsIDQ1NCwgMzk3LDExMzIsMTYxMiwyMzMyLCA4OTMsIDY3MiwxMjM3LCAyNTcsMjI1OSwgIyAyMTkyCjIzNzAsIDEzNSwzMzg0LCAzMzcsMjI0NCwgNTQ3LCAzNTIsIDM0MCwgNzA5LDI0ODUsMTQwMCwgNzg4LDExMzgsMjUxMSwgNTQwLCA3NzIsICMgMjIwOAoxNjgyLDIyNjAsMjI3MiwyNTQ0LDIwMTMsMTg0MywxOTAyLDQ2MzYsMTk5OSwxNTYyLDIyODgsNDYzNywyMjAxLDE0MDMsMTUzMywgNDA3LCAjIDIyMjQKIDU3NiwzMzA4LDEyNTQsMjA3MSwgOTc4LDMzODUsIDE3MCwgMTM2LDEyMDEsMzEyNSwyNjY0LDMxNzIsMjM5NCwgMjEzLCA5MTIsIDg3MywgIyAyMjQwCjM2MDMsMTcxMywyMjAyLCA2OTksMzYwNCwzNjk5LCA4MTMsMzQ0MiwgNDkzLCA1MzEsMTA1NCwgNDY4LDI5MDcsMTQ4MywgMzA0LCAyODEsICMgMjI1Ngo0MTEyLDE3MjYsMTI1MiwyMDk0LCAzMzksMjMxOSwyMTMwLDI2MzksIDc1NiwxNTYzLDI5NDQsIDc0OCwgNTcxLDI5NzYsMTU4OCwyNDI1LCAjIDIyNzIKMjcxNSwxODUxLDE0NjAsMjQyNiwxNTI4LDEzOTIsMTk3MywzMjM3LCAyODgsMzMwOSwgNjg1LDMzODYsIDI5NiwgODkyLDI3MTYsMjIxNiwgIyAyMjg4CjE1NzAsMjI0NSwgNzIyLDE3NDcsMjIxNywgOTA1LDMyMzgsMTEwMyw2MTM1LDE4OTMsMTQ0MSwxOTY1LCAyNTEsMTgwNSwyMzcxLDM3MDAsICMgMjMwNAoyNjAxLDE5MTksMTA3OCwgIDc1LDIxODIsMTUwOSwxNTkyLDEyNzAsMjY0MCw0NjM4LDIxNTIsNjEzNiwzMzEwLDM4MTcsIDUyNCwgNzA2LCAjIDIzMjAKMTA3NSwgMjkyLDM4MTgsMTc1NiwyNjAyLCAzMTcsICA5OCwzMTczLDM2MDUsMzUyNSwxODQ0LDIyMTgsMzgxOSwyNTAyLCA4MTQsIDU2NywgIyAyMzM2CiAzODUsMjkwOCwxNTM0LDYxMzcsIDUzNCwxNjQyLDMyMzksIDc5Nyw2MTM4LDE2NzAsMTUyOSwgOTUzLDQzMjMsIDE4OCwxMDcxLCA1MzgsICMgMjM1MgogMTc4LCA3MjksMzI0MCwyMTA5LDEyMjYsMTM3NCwyMDAwLDIzNTcsMjk3NywgNzMxLDI0NjgsMTExNiwyMDE0LDIwNTEsNjEzOSwxMjYxLCAjIDIzNjgKMTU5MywgODAzLDI4NTksMjczNiwzNDQzLCA1NTYsIDY4MiwgODIzLDE1NDEsNjE0MCwxMzY5LDIyODksMTcwNiwyNzk0LCA4NDUsIDQ2MiwgIyAyMzg0CjI2MDMsMjY2NSwxMzYxLCAzODcsIDE2MiwyMzU4LDE3NDAsIDczOSwxNzcwLDE3MjAsMTMwNCwxNDAxLDMyNDEsMTA0OSwgNjI3LDE1NzEsICMgMjQwMAoyNDI3LDM1MjYsMTg3NywzOTQyLDE4NTIsMTUwMCwgNDMxLDE5MTAsMTUwMywgNjc3LCAyOTcsMjc5NSwgMjg2LDE0MzMsMTAzOCwxMTk4LCAjIDI0MTYKMjI5MCwxMTMzLDE1OTYsNDExMyw0NjM5LDI0NjksMTUxMCwxNDg0LDM5NDMsNjE0MSwyNDQyLCAxMDgsIDcxMiw0NjQwLDIzNzIsIDg2NiwgIyAyNDMyCjM3MDEsMjc1NSwzMjQyLDEzNDgsIDgzNCwxOTQ1LDE0MDgsMzUyNywyMzk1LDMyNDMsMTgxMSwgODI0LCA5OTQsMTE3OSwyMTEwLDE1NDgsICMgMjQ0OAoxNDUzLCA3OTAsMzAwMywgNjkwLDQzMjQsNDMyNSwyODMyLDI5MDksMzgyMCwxODYwLDM4MjEsIDIyNSwxNzQ4LCAzMTAsIDM0NiwxNzgwLCAjIDI0NjQKMjQ3MCwgODIxLDE5OTMsMjcxNywyNzk2LCA4MjgsIDg3NywzNTI4LDI4NjAsMjQ3MSwxNzAyLDIxNjUsMjkxMCwyNDg2LDE3ODksIDQ1MywgIyAyNDgwCiAzNTksMjI5MSwxNjc2LCAgNzMsMTE2NCwxNDYxLDExMjcsMzMxMSwgNDIxLCA2MDQsIDMxNCwxMDM3LCA1ODksIDExNiwyNDg3LCA3MzcsICMgMjQ5NgogODM3LDExODAsIDExMSwgMjQ0LCA3MzUsNjE0MiwyMjYxLDE4NjEsMTM2MiwgOTg2LCA1MjMsIDQxOCwgNTgxLDI2NjYsMzgyMiwgMTAzLCAjIDI1MTIKIDg1NSwgNTAzLDE0MTQsMTg2NywyNDg4LDEwOTEsIDY1NywxNTk3LCA5NzksIDYwNSwxMzE2LDQ2NDEsMTAyMSwyNDQzLDIwNzgsMjAwMSwgIyAyNTI4CjEyMDksICA5NiwgNTg3LDIxNjYsMTAzMiwgMjYwLDEwNzIsMjE1MywgMTczLCAgOTQsIDIyNiwzMjQ0LCA4MTksMjAwNiw0NjQyLDQxMTQsICMgMjU0NAoyMjAzLCAyMzEsMTc0NCwgNzgyLCAgOTcsMjY2NywgNzg2LDMzODcsIDg4NywgMzkxLCA0NDIsMjIxOSw0MzI2LDE0MjUsNjE0MywyNjk0LCAjIDI1NjAKIDYzMywxNTQ0LDEyMDIsIDQ4MywyMDE1LCA1OTIsMjA1MiwxOTU4LDI0NzIsMTY1NSwgNDE5LCAxMjksNDMyNywzNDQ0LDMzMTIsMTcxNCwgIyAyNTc2CjEyNTcsMzA3OCw0MzI4LDE1MTgsMTA5OCwgODY1LDEzMTAsMTAxOSwxODg1LDE1MTIsMTczNCwgNDY5LDI0NDQsIDE0OCwgNzczLCA0MzYsICMgMjU5MgoxODE1LDE4NjgsMTEyOCwxMDU1LDQzMjksMTI0NSwyNzU2LDM0NDUsMjE1NCwxOTM0LDEwMzksNDY0MywgNTc5LDEyMzgsIDkzMiwyMzIwLCAjIDI2MDgKIDM1MywgMjA1LCA4MDEsIDExNSwyNDI4LCA5NDQsMjMyMSwxODgxLCAzOTksMjU2NSwxMjExLCA2NzgsIDc2NiwzOTQ0LCAzMzUsMjEwMSwgIyAyNjI0CjE0NTksMTc4MSwxNDAyLDM5NDUsMjczNywyMTMxLDEwMTAsIDg0NCwgOTgxLDEzMjYsMTAxMywgNTUwLDE4MTYsMTU0NSwyNjIwLDEzMzUsICMgMjY0MAoxMDA4LCAzNzEsMjg4MSwgOTM2LDE0MTksMTYxMywzNTI5LDE0NTYsMTM5NSwyMjczLDE4MzQsMjYwNCwxMzE3LDI3MzgsMjUwMywgNDE2LCAjIDI2NTYKMTY0Myw0MzMwLCA4MDYsMTEyNiwgMjI5LCA1OTEsMzk0NiwxMzE0LDE5ODEsMTU3NiwxODM3LDE2NjYsIDM0NywxNzkwLCA5NzcsMzMxMywgIyAyNjcyCiA3NjQsMjg2MSwxODUzLCA2ODgsMjQyOSwxOTIwLDE0NjIsICA3NywgNTk1LCA0MTUsMjAwMiwzMDM0LCA3OTgsMTE5Miw0MTE1LDYxNDQsICMgMjY4OAoyOTc4LDQzMzEsMzAzNSwyNjk1LDI1ODIsMjA3MiwyNTY2LCA0MzAsMjQzMCwxNzI3LCA4NDIsMTM5NiwzOTQ3LDM3MDIsIDYxMywgMzc3LCAjIDI3MDQKIDI3OCwgMjM2LDE0MTcsMzM4OCwzMzE0LDMxNzQsIDc1NywxODY5LCAxMDcsMzUzMCw2MTQ1LDExOTQsIDYyMywyMjYyLCAyMDcsMTI1MywgIyAyNzIwCjIxNjcsMzQ0NiwzOTQ4LCA0OTIsMTExNywxOTM1LCA1MzYsMTgzOCwyNzU3LDEyNDYsNDMzMiwgNjk2LDIwOTUsMjQwNiwxMzkzLDE1NzIsICMgMjczNgozMTc1LDE3ODIsIDU4MywgMTkwLCAyNTMsMTM5MCwyMjMwLCA4MzAsMzEyNiwzMzg5LCA5MzQsMzI0NSwxNzAzLDE3NDksMjk3OSwxODcwLCAjIDI3NTIKMjU0NSwxNjU2LDIyMDQsIDg2OSwyMzQ2LDQxMTYsMzE3NiwxODE3LCA0OTYsMTc2NCw0NjQ0LCA5NDIsMTUwNCwgNDA0LDE5MDMsMTEyMiwgIyAyNzY4CjE1ODAsMzYwNiwyOTQ1LDEwMjIsIDUxNSwgMzcyLDE3MzUsIDk1NSwyNDMxLDMwMzYsNjE0NiwyNzk3LDExMTAsMjMwMiwyNzk4LCA2MTcsICMgMjc4NAo2MTQ3LCA0NDEsIDc2MiwxNzcxLDM0NDcsMzYwNywzNjA4LDE5MDQsIDg0MCwzMDM3LCAgODYsIDkzOSwxMzg1LCA1NzIsMTM3MCwyNDQ1LCAjIDI4MDAKMTMzNiwgMTE0LDM3MDMsIDg5OCwgMjk0LCAyMDMsMzMxNSwgNzAzLDE1ODMsMjI3NCwgNDI5LCA5NjEsNDMzMywxODU0LDE5NTEsMzM5MCwgIyAyODE2CjIzNzMsMzcwNCw0MzM0LDEzMTgsMTM4MSwgOTY2LDE5MTEsMjMyMiwxMDA2LDExNTUsIDMwOSwgOTg5LCA0NTgsMjcxOCwxNzk1LDEzNzIsICMgMjgzMgoxMjAzLCAyNTIsMTY4OSwxMzYzLDMxNzcsIDUxNywxOTM2LCAxNjgsMTQ5MCwgNTYyLCAxOTMsMzgyMywxMDQyLDQxMTcsMTgzNSwgNTUxLCAjIDI4NDgKIDQ3MCw0NjQ1LCAzOTUsIDQ4OSwzNDQ4LDE4NzEsMTQ2NSwyNTgzLDI2NDEsIDQxNywxNDkzLCAyNzksMTI5NSwgNTExLDEyMzYsMTExOSwgIyAyODY0CiAgNzIsMTIzMSwxOTgyLDE4MTIsMzAwNCwgODcxLDE1NjQsIDk4NCwzNDQ5LDE2NjcsMjY5NiwyMDk2LDQ2NDYsMjM0NywyODMzLDE2NzMsICMgMjg4MAozNjA5LCA2OTUsMzI0NiwyNjY4LCA4MDcsMTE4Myw0NjQ3LCA4OTAsIDM4OCwyMzMzLDE4MDEsMTQ1NywyOTExLDE3NjUsMTQ3NywxMDMxLCAjIDI4OTYKMzMxNiwzMzE3LDEyNzgsMzM5MSwyNzk5LDIyOTIsMjUyNiwgMTYzLDM0NTAsNDMzNSwyNjY5LDE0MDQsMTgwMiw2MTQ4LDIzMjMsMjQwNywgIyAyOTEyCjE1ODQsMTcyOCwxNDk0LDE4MjQsMTI2OSwgMjk4LCA5MDksMzMxOCwxMDM0LDE2MzIsIDM3NSwgNzc2LDE2ODMsMjA2MSwgMjkxLCAyMTAsICMgMjkyOAoxMTIzLCA4MDksMTI0OSwxMDAyLDI2NDIsMzAzOCwgMjA2LDEwMTEsMjEzMiwgMTQ0LCA5NzUsIDg4MiwxNTY1LCAzNDIsIDY2NywgNzU0LCAjIDI5NDQKMTQ0MiwyMTQzLDEyOTksMjMwMywyMDYyLCA0NDcsIDYyNiwyMjA1LDEyMjEsMjczOSwyOTEyLDExNDQsMTIxNCwyMjA2LDI1ODQsIDc2MCwgIyAyOTYwCjE3MTUsIDYxNCwgOTUwLDEyODEsMjY3MCwyNjIxLCA4MTAsIDU3NywxMjg3LDI1NDYsNDY0OCwgMjQyLDIxNjgsIDI1MCwyNjQzLCA2OTEsICMgMjk3NgogMTIzLDI2NDQsIDY0NywgMzEzLDEwMjksIDY4OSwxMzU3LDI5NDYsMTY1MCwgMjE2LCA3NzEsMTMzOSwxMzA2LCA4MDgsMjA2MywgNTQ5LCAjIDI5OTIKIDkxMywxMzcxLDI5MTMsMjkxNCw2MTQ5LDE0NjYsMTA5MiwxMTc0LDExOTYsMTMxMSwyNjA1LDIzOTYsMTc4MywxNzk2LDMwNzksIDQwNiwgIyAzMDA4CjI2NzEsMjExNywzOTQ5LDQ2NDksIDQ4NywxODI1LDIyMjAsNjE1MCwyOTE1LCA0NDgsMjM0OCwxMDczLDYxNTEsMjM5NywxNzA3LCAxMzAsICMgMzAyNAogOTAwLDE1OTgsIDMyOSwgMTc2LDE5NTksMjUyNywxNjIwLDYxNTIsMjI3NSw0MzM2LDMzMTksMTk4MywyMTkxLDM3MDUsMzYxMCwyMTU1LCAjIDMwNDAKMzcwNiwxOTEyLDE1MTMsMTYxNCw2MTUzLDE5ODgsIDY0NiwgMzkyLDIzMDQsMTU4OSwzMzIwLDMwMzksMTgyNiwxMjM5LDEzNTIsMTM0MCwgIyAzMDU2CjI5MTYsIDUwNSwyNTY3LDE3MDksMTQzNywyNDA4LDI1NDcsIDkwNiw2MTU0LDI2NzIsIDM4NCwxNDU4LDE1OTQsMTEwMCwxMzI5LCA3MTAsICMgMzA3MgogNDIzLDM1MzEsMjA2NCwyMjMxLDI2MjIsMTk4OSwyNjczLDEwODcsMTg4MiwgMzMzLCA4NDEsMzAwNSwxMjk2LDI4ODIsMjM3OSwgNTgwLCAjIDMwODgKMTkzNywxODI3LDEyOTMsMjU4NSwgNjAxLCA1NzQsIDI0OSwxNzcyLDQxMTgsMjA3OSwxMTIwLCA2NDUsIDkwMSwxMTc2LDE2OTAsIDc5NSwgIyAzMTA0CjIyMDcsIDQ3OCwxNDM0LCA1MTYsMTE5MCwxNTMwLCA3NjEsMjA4MCwgOTMwLDEyNjQsIDM1NSwgNDM1LDE1NTIsIDY0NCwxNzkxLCA5ODcsICMgMzEyMAogMjIwLDEzNjQsMTE2MywxMTIxLDE1MzgsIDMwNiwyMTY5LDEzMjcsMTIyMiwgNTQ2LDI2NDUsIDIxOCwgMjQxLCA2MTAsMTcwNCwzMzIxLCAjIDMxMzYKMTk4NCwxODM5LDE5NjYsMjUyOCwgNDUxLDYxNTUsMjU4NiwzNzA3LDI1NjgsIDkwNywzMTc4LCAyNTQsMjk0NywgMTg2LDE4NDUsNDY1MCwgIyAzMTUyCiA3NDUsIDQzMiwxNzU3LCA0MjgsMTYzMywgODg4LDIyNDYsMjIyMSwyNDg5LDM2MTEsMjExOCwxMjU4LDEyNjUsIDk1NiwzMTI3LDE3ODQsICMgMzE2OAo0MzM3LDI0OTAsIDMxOSwgNTEwLCAxMTksIDQ1NywzNjEyLCAyNzQsMjAzNSwyMDA3LDQ2NTEsMTQwOSwzMTI4LCA5NzAsMjc1OCwgNTkwLCAjIDMxODQKMjgwMCwgNjYxLDIyNDcsNDY1MiwyMDA4LDM5NTAsMTQyMCwxNTQ5LDMwODAsMzMyMiwzOTUxLDE2NTEsMTM3NSwyMTExLCA0ODUsMjQ5MSwgIyAzMjAwCjE0MjksMTE1Niw2MTU2LDI1NDgsMjE4MywxNDk1LCA4MzEsMTg0MCwyNTI5LDI0NDYsIDUwMSwxNjU3LCAzMDcsMTg5NCwzMjQ3LDEzNDEsICMgMzIxNgogNjY2LCA4OTksMjE1NiwxNTM5LDI1NDksMTU1OSwgODg2LCAzNDksMjIwOCwzMDgxLDIzMDUsMTczNiwzODI0LDIxNzAsMjc1OSwxMDE0LCAjIDMyMzIKMTkxMywxMzg2LCA1NDIsMTM5NywyOTQ4LCA0OTAsIDM2OCwgNzE2LCAzNjIsIDE1OSwgMjgyLDI1NjksMTEyOSwxNjU4LDEyODgsMTc1MCwgIyAzMjQ4CjI2NzQsIDI3NiwgNjQ5LDIwMTYsIDc1MSwxNDk2LCA2NTgsMTgxOCwxMjg0LDE4NjIsMjIwOSwyMDg3LDI1MTIsMzQ1MSwgNjIyLDI4MzQsICMgMzI2NAogMzc2LCAxMTcsMTA2MCwyMDUzLDEyMDgsMTcyMSwxMTAxLDE0NDMsIDI0NywxMjUwLDMxNzksMTc5MiwzOTUyLDI3NjAsMjM5OCwzOTUzLCAjIDMyODAKNjE1NywyMTQ0LDM3MDgsIDQ0NiwyNDMyLDExNTEsMjU3MCwzNDUyLDI0NDcsMjc2MSwyODM1LDEyMTAsMjQ0OCwzMDgyLCA0MjQsMjIyMiwgIyAzMjk2CjEyNTEsMjQ0OSwyMTE5LDI4MzYsIDUwNCwxNTgxLDQzMzgsIDYwMiwgODE3LCA4NTcsMzgyNSwyMzQ5LDIzMDYsIDM1NywzODI2LDE0NzAsICMgMzMxMgoxODgzLDI4ODMsIDI1NSwgOTU4LCA5MjksMjkxNywzMjQ4LCAzMDIsNDY1MywxMDUwLDEyNzEsMTc1MSwyMzA3LDE5NTIsMTQzMCwyNjk3LCAjIDMzMjgKMjcxOSwyMzU5LCAzNTQsMzE4MCwgNzc3LCAxNTgsMjAzNiw0MzM5LDE2NTksNDM0MCw0NjU0LDIzMDgsMjk0OSwyMjQ4LDExNDYsMjIzMiwgIyAzMzQ0CjM1MzIsMjcyMCwxNjk2LDI2MjMsMzgyNyw2MTU4LDMxMjksMTU1MCwyNjk4LDE0ODUsMTI5NywxNDI4LCA2MzcsIDkzMSwyNzIxLDIxNDUsICMgMzM2MAogOTE0LDI1NTAsMjU4NywgIDgxLDI0NTAsIDYxMiwgODI3LDI2NDYsMTI0Miw0NjU1LDExMTgsMjg4NCwgNDcyLDE4NTUsMzE4MSwzNTMzLCAjIDMzNzYKMzUzNCwgNTY5LDEzNTMsMjY5OSwxMjQ0LDE3NTgsMjU4OCw0MTE5LDIwMDksMjc2MiwyMTcxLDM3MDksMTMxMiwxNTMxLDYxNTksMTE1MiwgIyAzMzkyCjE5MzgsIDEzNCwxODMwLCA0NzEsMzcxMCwyMjc2LDExMTIsMTUzNSwzMzIzLDM0NTMsMzUzNSwgOTgyLDEzMzcsMjk1MCwgNDg4LCA4MjYsICMgMzQwOAogNjc0LDEwNTgsMTYyOCw0MTIwLDIwMTcsIDUyMiwyMzk5LCAyMTEsIDU2OCwxMzY3LDM0NTQsIDM1MCwgMjkzLDE4NzIsMTEzOSwzMjQ5LCAjIDM0MjQKMTM5OSwxOTQ2LDMwMDYsMTMwMCwyMzYwLDMzMjQsIDU4OCwgNzM2LDYxNjAsMjYwNiwgNzQ0LCA2NjksMzUzNiwzODI4LDYxNjEsMTM1OCwgIyAzNDQwCiAxOTksIDcyMywgODQ4LCA5MzMsIDg1MSwxOTM5LDE1MDUsMTUxNCwxMzM4LDE2MTgsMTgzMSw0NjU2LDE2MzQsMzYxMywgNDQzLDI3NDAsICMgMzQ1NgozODI5LCA3MTcsMTk0NywgNDkxLDE5MTQsNjE2MiwyNTUxLDE1NDIsNDEyMSwxMDI1LDYxNjMsMTA5OSwxMjIzLCAxOTgsMzA0MCwyNzIyLCAjIDM0NzIKIDM3MCwgNDEwLDE5MDUsMjU4OSwgOTk4LDEyNDgsMzE4MiwyMzgwLCA1MTksMTQ0OSw0MTIyLDE3MTAsIDk0NywgOTI4LDExNTMsNDM0MSwgIyAzNDg4CjIyNzcsIDM0NCwyNjI0LDE1MTEsIDYxNSwgMTA1LCAxNjEsMTIxMiwxMDc2LDE5NjAsMzEzMCwyMDU0LDE5MjYsMTE3NSwxOTA2LDI0NzMsICMgMzUwNAogNDE0LDE4NzMsMjgwMSw2MTY0LDIzMDksIDMxNSwxMzE5LDMzMjUsIDMxOCwyMDE4LDIxNDYsMjE1NywgOTYzLCA2MzEsIDIyMyw0MzQyLCAjIDM1MjAKNDM0MywyNjc1LCA0NzksMzcxMSwxMTk3LDI2MjUsMzcxMiwyNjc2LDIzNjEsNjE2NSw0MzQ0LDQxMjMsNjE2NiwyNDUxLDMxODMsMTg4NiwgIyAzNTM2CjIxODQsMTY3NCwxMzMwLDE3MTEsMTYzNSwxNTA2LCA3OTksIDIxOSwzMjUwLDMwODMsMzk1NCwxNjc3LDM3MTMsMzMyNiwyMDgxLDM2MTQsICMgMzU1MgoxNjUyLDIwNzMsNDY1NywxMTQ3LDMwNDEsMTc1MiwgNjQzLDE5NjEsIDE0NywxOTc0LDM5NTUsNjE2NywxNzE2LDIwMzcsIDkxOCwzMDA3LCAjIDM1NjgKMTk5NCwgMTIwLDE1MzcsIDExOCwgNjA5LDMxODQsNDM0NSwgNzQwLDM0NTUsMTIxOSwgMzMyLDE2MTUsMzgzMCw2MTY4LDE2MjEsMjk4MCwgIyAzNTg0CjE1ODIsIDc4MywgMjEyLCA1NTMsMjM1MCwzNzE0LDEzNDksMjQzMywyMDgyLDQxMjQsIDg4OSw2MTY5LDIzMTAsMTI3NSwxNDEwLCA5NzMsICMgMzYwMAogMTY2LDEzMjAsMzQ1NiwxNzk3LDEyMTUsMzE4NSwyODg1LDE4NDYsMjU5MCwyNzYzLDQ2NTgsIDYyOSwgODIyLDMwMDgsIDc2MywgOTQwLCAjIDM2MTYKMTk5MCwyODYyLCA0MzksMjQwOSwxNTY2LDEyNDAsMTYyMiwgOTI2LDEyODIsMTkwNywyNzY0LCA2NTQsMjIxMCwxNjA3LCAzMjcsMTEzMCwgIyAzNjMyCjM5NTYsMTY3OCwxNjIzLDYxNzAsMjQzNCwyMTkyLCA2ODYsIDYwOCwzODMxLDM3MTUsIDkwMywzOTU3LDMwNDIsNjE3MSwyNzQxLDE1MjIsICMgMzY0OAoxOTE1LDExMDUsMTU1NSwyNTUyLDEzNTksIDMyMywzMjUxLDQzNDYsMzQ1NywgNzM4LDEzNTQsMjU1MywyMzExLDIzMzQsMTgyOCwyMDAzLCAjIDM2NjQKMzgzMiwxNzUzLDIzNTEsMTIyNyw2MTcyLDE4ODcsNDEyNSwxNDc4LDYxNzMsMjQxMCwxODc0LDE3MTIsMTg0NywgNTIwLDEyMDQsMjYwNywgIyAzNjgwCiAyNjQsNDY1OSwgODM2LDI2NzcsMjEwMiwgNjAwLDQ2NjAsMzgzMywyMjc4LDMwODQsNjE3NCw0MzQ3LDM2MTUsMTM0MiwgNjQwLCA1MzIsICMgMzY5NgogNTQzLDI2MDgsMTg4OCwyNDAwLDI1OTEsMTAwOSw0MzQ4LDE0OTcsIDM0MSwxNzM3LDM2MTYsMjcyMywxMzk0LCA1MjksMzI1MiwxMzIxLCAjIDM3MTIKIDk4Myw0NjYxLDE1MTUsMjEyMCwgOTcxLDI1OTIsIDkyNCwgMjg3LDE2NjIsMzE4Niw0MzQ5LDI3MDAsNDM1MCwxNTE5LCA5MDgsMTk0OCwgIyAzNzI4CjI0NTIsIDE1NiwgNzk2LDE2MjksMTQ4NiwyMjIzLDIwNTUsIDY5NCw0MTI2LDEyNTksMTAzNiwzMzkyLDEyMTMsMjI0OSwyNzQyLDE4ODksICMgMzc0NAoxMjMwLDM5NTgsMTAxNSwgOTEwLCA0MDgsIDU1OSwzNjE3LDQ2NjIsIDc0NiwgNzI1LCA5MzUsNDY2MywzOTU5LDMwMDksMTI4OSwgNTYzLCAjIDM3NjAKIDg2Nyw0NjY0LDM5NjAsMTU2NywyOTgxLDIwMzgsMjYyNiwgOTg4LDIyNjMsMjM4MSw0MzUxLCAxNDMsMjM3NCwgNzA0LDE4OTUsNjE3NSwgIyAzNzc2CjExODgsMzcxNiwyMDg4LCA2NzMsMzA4NSwyMzYyLDQzNTIsIDQ4NCwxNjA4LDE5MjEsMjc2NSwyOTE4LCAyMTUsIDkwNCwzNjE4LDM1MzcsICMgMzc5MgogODk0LCA1MDksIDk3NiwzMDQzLDI3MDEsMzk2MSw0MzUzLDI4MzcsMjk4MiwgNDk4LDYxNzYsNjE3NywxMTAyLDM1MzgsMTMzMiwzMzkzLCAjIDM4MDgKMTQ4NywxNjM2LDE2MzcsIDIzMywgMjQ1LDM5NjIsIDM4MywgNjUwLCA5OTUsMzA0NCwgNDYwLDE1MjAsMTIwNiwyMzUyLCA3NDksMzMyNywgIyAzODI0CiA1MzAsIDcwMCwgMzg5LDE0MzgsMTU2MCwxNzczLDM5NjMsMjI2NCwgNzE5LDI5NTEsMjcyNCwzODM0LCA4NzAsMTgzMiwxNjQ0LDEwMDAsICMgMzg0MAogODM5LDI0NzQsMzcxNywgMTk3LDE2MzAsMzM5NCwgMzY1LDI4ODYsMzk2NCwxMjg1LDIxMzMsIDczNCwgOTIyLCA4MTgsMTEwNiwgNzMyLCAjIDM4NTYKIDQ4MCwyMDgzLDE3NzQsMzQ1OCwgOTIzLDIyNzksMTM1MCwgMjIxLDMwODYsICA4NSwyMjMzLDIyMzQsMzgzNSwxNTg1LDMwMTAsMjE0NywgIyAzODcyCjEzODcsMTcwNSwyMzgyLDE2MTksMjQ3NSwgMTMzLCAyMzksMjgwMiwxOTkxLDEwMTYsMjA4NCwyMzgzLCA0MTEsMjgzOCwxMTEzLCA2NTEsICMgMzg4OAoxOTg1LDExNjAsMzMyOCwgOTkwLDE4NjMsMzA4NywxMDQ4LDEyNzYsMjY0NywgMjY1LDI2MjcsMTU5OSwzMjUzLDIwNTYsIDE1MCwgNjM4LCAjIDM5MDQKMjAxOSwgNjU2LCA4NTMsIDMyNiwxNDc5LCA2ODAsMTQzOSw0MzU0LDEwMDEsMTc1OSwgNDEzLDM0NTksMzM5NSwyNDkyLDE0MzEsIDQ1OSwgIyAzOTIwCjQzNTUsMTEyNSwzMzI5LDIyNjUsMTk1MywxNDUwLDIwNjUsMjg2MywgODQ5LCAzNTEsMjY3OCwzMTMxLDMyNTQsMzI1NSwxMTA0LDE1NzcsICMgMzkzNgogMjI3LDEzNTEsMTY0NSwyNDUzLDIxOTMsMTQyMSwyODg3LCA4MTIsMjEyMSwgNjM0LCAgOTUsMjQzNSwgMjAxLDIzMTIsNDY2NSwxNjQ2LCAjIDM5NTIKMTY3MSwyNzQzLDE2MDEsMjU1NCwyNzAyLDI2NDgsMjI4MCwxMzE1LDEzNjYsMjA4OSwzMTMyLDE1NzMsMzcxOCwzOTY1LDE3MjksMTE4OSwgIyAzOTY4CiAzMjgsMjY3OSwxMDc3LDE5NDAsMTEzNiwgNTU4LDEyODMsIDk2NCwxMTk1LCA2MjEsMjA3NCwxMTk5LDE3NDMsMzQ2MCwzNjE5LDE4OTYsICMgMzk4NAoxOTE2LDE4OTAsMzgzNiwyOTUyLDExNTQsMjExMiwxMDY0LCA4NjIsIDM3OCwzMDExLDIwNjYsMjExMywyODAzLDE1NjgsMjgzOSw2MTc4LCAjIDQwMDAKMzA4OCwyOTE5LDE5NDEsMTY2MCwyMDA0LDE5OTIsMjE5NCwgMTQyLCA3MDcsMTU5MCwxNzA4LDE2MjQsMTkyMiwxMDIzLDE4MzYsMTIzMywgIyA0MDE2CjEwMDQsMjMxMywgNzg5LCA3NDEsMzYyMCw2MTc5LDE2MDksMjQxMSwxMjAwLDQxMjcsMzcxOSwzNzIwLDQ2NjYsMjA1NywzNzIxLCA1OTMsICMgNDAzMgoyODQwLCAzNjcsMjkyMCwxODc4LDYxODAsMzQ2MSwxNTIxLCA2MjgsMTE2OCwgNjkyLDIyMTEsMjY0OSwgMzAwLCA3MjAsMjA2NywyNTcxLCAjIDQwNDgKMjk1MywzMzk2LCA5NTksMjUwNCwzOTY2LDM1MzksMzQ2MiwxOTc3LCA3MDEsNjE4MSwgOTU0LDEwNDMsIDgwMCwgNjgxLCAxODMsMzcyMiwgIyA0MDY0CjE4MDMsMTczMCwzNTQwLDQxMjgsMjEwMywgODE1LDIzMTQsIDE3NCwgNDY3LCAyMzAsMjQ1NCwxMDkzLDIxMzQsIDc1NSwzNTQxLDMzOTcsICMgNDA4MAoxMTQxLDExNjIsNjE4MiwxNzM4LDIwMzksIDI3MCwzMjU2LDI1MTMsMTAwNSwxNjQ3LDIxODUsMzgzNywgODU4LDE2NzksMTg5NywxNzE5LCAjIDQwOTYKMjk1NCwyMzI0LDE4MDYsIDQwMiwgNjcwLCAxNjcsNDEyOSwxNDk4LDIxNTgsMjEwNCwgNzUwLDYxODMsIDkxNSwgMTg5LDE2ODAsMTU1MSwgIyA0MTEyCiA0NTUsNDM1NiwxNTAxLDI0NTUsIDQwNSwxMDk1LDI5NTUsIDMzOCwxNTg2LDEyNjYsMTgxOSwgNTcwLCA2NDEsMTMyNCwgMjM3LDE1NTYsICMgNDEyOAoyNjUwLDEzODgsMzcyMyw2MTg0LDEzNjgsMjM4NCwxMzQzLDE5NzgsMzA4OSwyNDM2LCA4NzksMzcyNCwgNzkyLDExOTEsIDc1OCwzMDEyLCAjIDQxNDQKMTQxMSwyMTM1LDEzMjIsNDM1NywgMjQwLDQ2NjcsMTg0OCwzNzI1LDE1NzQsNjE4NSwgNDIwLDMwNDUsMTU0NiwxMzkxLCA3MTQsNDM1OCwgIyA0MTYwCjE5NjcsIDk0MSwxODY0LCA4NjMsIDY2NCwgNDI2LCA1NjAsMTczMSwyNjgwLDE3ODUsMjg2NCwxOTQ5LDIzNjMsIDQwMywzMzMwLDE0MTUsICMgNDE3NgoxMjc5LDIxMzYsMTY5NywyMzM1LCAyMDQsIDcyMSwyMDk3LDM4MzgsICA5MCw2MTg2LDIwODUsMjUwNSwgMTkxLDM5NjcsIDEyNCwyMTQ4LCAjIDQxOTIKMTM3NiwxNzk4LDExNzgsMTEwNywxODk4LDE0MDUsIDg2MCw0MzU5LDEyNDMsMTI3MiwyMzc1LDI5ODMsMTU1OCwyNDU2LDE2MzgsIDExMywgIyA0MjA4CjM2MjEsIDU3OCwxOTIzLDI2MDksIDg4MCwgMzg2LDQxMzAsIDc4NCwyMTg2LDIyNjYsMTQyMiwyOTU2LDIxNzIsMTcyMiwgNDk3LCAyNjMsICMgNDIyNAoyNTE0LDEyNjcsMjQxMiwyNjEwLCAxNzcsMjcwMywzNTQyLCA3NzQsMTkyNywxMzQ0LCA2MTYsMTQzMiwxNTk1LDEwMTgsIDE3Miw0MzYwLCAjIDQyNDAKMjMyNSwgOTExLDQzNjEsIDQzOCwxNDY4LDM2MjIsIDc5NCwzOTY4LDIwMjQsMjE3MywxNjgxLDE4MjksMjk1NywgOTQ1LCA4OTUsMzA5MCwgIyA0MjU2CiA1NzUsMjIxMiwyNDc2LCA0NzUsMjQwMSwyNjgxLCA3ODUsMjc0NCwxNzQ1LDIyOTMsMjU1NSwxOTc1LDMxMzMsMjg2NSwgMzk0LDQ2NjgsICMgNDI3MgozODM5LCA2MzUsNDEzMSwgNjM5LCAyMDIsMTUwNywyMTk1LDI3NjYsMTM0NSwxNDM1LDI1NzIsMzcyNiwxOTA4LDExODQsMTE4MSwyNDU3LCAjIDQyODgKMzcyNywzMTM0LDQzNjIsIDg0MywyNjExLCA0MzcsIDkxNiw0NjY5LCAyMzQsIDc2OSwxODg0LDMwNDYsMzA0NywzNjIzLCA4MzMsNjE4NywgIyA0MzA0CjE2MzksMjI1MCwyNDAyLDEzNTUsMTE4NSwyMDEwLDIwNDcsIDk5OSwgNTI1LDE3MzIsMTI5MCwxNDg4LDI2MTIsIDk0OCwxNTc4LDM3MjgsICMgNDMyMAoyNDEzLDI0NzcsMTIxNiwyNzI1LDIxNTksIDMzNCwzODQwLDEzMjgsMzYyNCwyOTIxLDE1MjUsNDEzMiwgNTY0LDEwNTYsIDg5MSw0MzYzLCAjIDQzMzYKMTQ0NCwxNjk4LDIzODUsMjI1MSwzNzI5LDEzNjUsMjI4MSwyMjM1LDE3MTcsNjE4OCwgODY0LDM4NDEsMjUxNSwgNDQ0LCA1MjcsMjc2NywgIyA0MzUyCjI5MjIsMzYyNSwgNTQ0LCA0NjEsNjE4OSwgNTY2LCAyMDksMjQzNywzMzk4LDIwOTgsMTA2NSwyMDY4LDMzMzEsMzYyNiwzMjU3LDIxMzcsICMgNDM2OCAgI2xhc3QgNTEyCikKCgpQSwMEFAAAAAAAAAAhAAZ5JWq7TAAAu0wAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvanBjbnR4LnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKIyBUaGlzIGlzIGhpcmFnYW5hIDItY2hhciBzZXF1ZW5jZSB0YWJsZSwgdGhlIG51bWJlciBpbiBlYWNoIGNlbGwgcmVwcmVzZW50cyBpdHMgZnJlcXVlbmN5IGNhdGVnb3J5CmpwMkNoYXJDb250ZXh0ID0gKAooMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxKSwKKDIsNCwwLDQsMCwzLDAsNCwwLDMsNCw0LDQsMiw0LDMsMyw0LDMsMiwzLDMsNCwyLDMsMywzLDIsNCwxLDQsMywzLDEsNSw0LDMsNCwzLDQsMyw1LDMsMCwzLDUsNCwyLDAsMywxLDAsMywzLDAsMywzLDAsMSwxLDAsNCwzLDAsMywzLDAsNCwwLDIsMCwzLDUsNSw1LDUsNCwwLDQsMSwwLDMsNCksCigwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIpLAooMCw0LDAsNSwwLDUsMCw0LDAsNCw1LDQsNCwzLDUsMyw1LDEsNSwzLDQsMyw0LDQsMyw0LDMsMyw0LDMsNSw0LDQsMyw1LDUsMyw1LDUsNSwzLDUsNSwzLDQsNSw1LDMsMSwzLDIsMCwzLDQsMCw0LDIsMCw0LDIsMSw1LDMsMiwzLDUsMCw0LDAsMiwwLDUsNCw0LDUsNCw1LDAsNCwwLDAsNCw0KSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCksCigwLDMsMCw0LDAsMywwLDMsMCw0LDUsNCwzLDMsMywzLDQsMyw1LDQsNCwzLDUsNCw0LDMsNCwzLDQsNCw0LDQsNSwzLDQsNCwzLDQsNSw1LDQsNSw1LDEsNCw1LDQsMywwLDMsMywxLDMsMywwLDQsNCwwLDMsMywxLDUsMywzLDMsNSwwLDQsMCwzLDAsNCw0LDMsNCwzLDMsMCw0LDEsMSwzLDQpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSwKKDAsNCwwLDMsMCwzLDAsNCwwLDMsNCw0LDMsMiwyLDEsMiwxLDMsMSwzLDMsMywzLDMsNCwzLDEsMywzLDUsMywzLDAsNCwzLDAsNSw0LDMsMyw1LDQsNCwzLDQsNCw1LDAsMSwyLDAsMSwyLDAsMiwyLDAsMSwwLDAsNSwyLDIsMSw0LDAsMywwLDEsMCw0LDQsMyw1LDQsMywwLDIsMSwwLDQsMyksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApLAooMCwzLDAsNSwwLDQsMCwyLDEsNCw0LDIsNCwxLDQsMiw0LDIsNCwzLDMsMyw0LDMsMywzLDMsMSw0LDIsMywzLDMsMSw0LDQsMSwxLDEsNCwzLDMsMiwwLDIsNCwzLDIsMCwzLDMsMCwzLDEsMSwwLDAsMCwzLDMsMCw0LDIsMiwzLDQsMCw0LDAsMywwLDQsNCw1LDMsNCw0LDAsMywwLDAsMSw0KSwKKDEsNCwwLDQsMCw0LDAsNCwwLDMsNSw0LDQsMyw0LDMsNSw0LDMsMyw0LDMsNSw0LDQsNCw0LDMsNCwyLDQsMywzLDEsNSw0LDMsMiw0LDUsNCw1LDUsNCw0LDUsNCw0LDAsMywyLDIsMywzLDAsNCwzLDEsMywyLDEsNCwzLDMsNCw1LDAsMywwLDIsMCw0LDUsNSw0LDUsNCwwLDQsMCwwLDUsNCksCigwLDUsMCw1LDAsNCwwLDMsMCw0LDQsMyw0LDMsMywzLDQsMCw0LDQsNCwzLDQsMyw0LDMsMywxLDQsMiw0LDMsNCwwLDUsNCwxLDQsNSw0LDQsNSwzLDIsNCwzLDQsMywyLDQsMSwzLDMsMywyLDMsMiwwLDQsMywzLDQsMywzLDMsNCwwLDQsMCwzLDAsNCw1LDQsNCw0LDMsMCw0LDEsMCwxLDMpLAooMCwzLDEsNCwwLDMsMCwyLDAsMyw0LDQsMywxLDQsMiwzLDMsNCwzLDQsMyw0LDMsNCw0LDMsMiwzLDEsNSw0LDQsMSw0LDQsMyw1LDQsNCwzLDUsNSw0LDMsNCw0LDMsMSwyLDMsMSwyLDIsMCwzLDIsMCwzLDEsMCw1LDMsMywzLDQsMywzLDMsMyw0LDQsNCw0LDUsNCwyLDAsMywzLDIsNCwzKSwKKDAsMiwwLDMsMCwxLDAsMSwwLDAsMywyLDAsMCwyLDAsMSwwLDIsMSwzLDMsMywxLDIsMywxLDAsMSwwLDQsMiwxLDEsMywzLDAsNCwzLDMsMSw0LDMsMywwLDMsMywyLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsNCwxLDAsMiwzLDIsMiwyLDEsMywzLDMsNCw0LDMsMiwwLDMsMSwwLDMsMyksCigwLDQsMCw0LDAsMywwLDMsMCw0LDQsNCwzLDMsMywzLDMsMyw0LDMsNCwyLDQsMyw0LDMsMywyLDQsMyw0LDUsNCwxLDQsNSwzLDUsNCw1LDMsNSw0LDAsMyw1LDUsMywxLDMsMywyLDIsMywwLDMsNCwxLDMsMywyLDQsMywzLDMsNCwwLDQsMCwzLDAsNCw1LDQsNCw1LDMsMCw0LDEsMCwzLDQpLAooMCwyLDAsMywwLDMsMCwwLDAsMiwyLDIsMSwwLDEsMCwwLDAsMywwLDMsMCwzLDAsMSwzLDEsMCwzLDEsMywzLDMsMSwzLDMsMywwLDEsMywxLDMsNCwwLDAsMywxLDEsMCwzLDIsMCwwLDAsMCwxLDMsMCwxLDAsMCwzLDMsMiwwLDMsMCwwLDAsMCwwLDMsNCwzLDQsMywzLDAsMywwLDAsMiwzKSwKKDIsMywwLDMsMCwyLDAsMSwwLDMsMyw0LDMsMSwzLDEsMSwxLDMsMSw0LDMsNCwzLDMsMywwLDAsMywxLDUsNCwzLDEsNCwzLDIsNSw1LDQsNCw0LDQsMywzLDQsNCw0LDAsMiwxLDEsMywyLDAsMSwyLDAsMCwxLDAsNCwxLDMsMywzLDAsMywwLDEsMCw0LDQsNCw1LDUsMywwLDIsMCwwLDQsNCksCigwLDIsMCwxLDAsMywxLDMsMCwyLDMsMywzLDAsMywxLDAsMCwzLDAsMywyLDMsMSwzLDIsMSwxLDAsMCw0LDIsMSwwLDIsMywxLDQsMywyLDAsNCw0LDMsMSwzLDEsMywwLDEsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDQsMSwxLDEsMiwwLDMsMCwwLDAsMyw0LDIsNCwzLDIsMCwxLDAsMCwzLDMpLAooMCwxLDAsNCwwLDUsMCw0LDAsMiw0LDQsMiwzLDMsMiwzLDMsNSwzLDMsMyw0LDMsNCwyLDMsMCw0LDMsMywzLDQsMSw0LDMsMiwxLDUsNSwzLDQsNSwxLDMsNSw0LDIsMCwzLDMsMCwxLDMsMCw0LDIsMCwxLDMsMSw0LDMsMywzLDMsMCwzLDAsMSwwLDMsNCw0LDQsNSw1LDAsMywwLDEsNCw1KSwKKDAsMiwwLDMsMCwzLDAsMCwwLDIsMywxLDMsMCw0LDAsMSwxLDMsMCwzLDQsMywyLDMsMSwwLDMsMywyLDMsMSwzLDAsMiwzLDAsMiwxLDQsMSwyLDIsMCwwLDMsMywwLDAsMiwwLDAsMCwxLDAsMCwwLDAsMiwyLDAsMywyLDEsMywzLDAsMiwwLDIsMCwwLDMsMywxLDIsNCwwLDMsMCwyLDIsMyksCigyLDQsMCw1LDAsNCwwLDQsMCwyLDQsNCw0LDMsNCwzLDMsMywxLDIsNCwzLDQsMyw0LDQsNSwwLDMsMywzLDMsMiwwLDQsMywxLDQsMyw0LDEsNCw0LDMsMyw0LDQsMywxLDIsMywwLDQsMiwwLDQsMSwwLDMsMywwLDQsMywzLDMsNCwwLDQsMCwyLDAsMyw1LDMsNCw1LDIsMCwzLDAsMCw0LDUpLAooMCwzLDAsNCwwLDEsMCwxLDAsMSwzLDIsMiwxLDMsMCwzLDAsMiwwLDIsMCwzLDAsMiwwLDAsMCwxLDAsMSwxLDAsMCwzLDEsMCwwLDAsNCwwLDMsMSwwLDIsMSwzLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCw0LDIsMiwzLDEsMCwzLDAsMCwwLDEsNCw0LDQsMywwLDAsNCwwLDAsMSw0KSwKKDEsNCwxLDUsMCwzLDAsMywwLDQsNSw0LDQsMyw1LDMsMyw0LDQsMyw0LDEsMywzLDMsMywyLDEsNCwxLDUsNCwzLDEsNCw0LDMsNSw0LDQsMyw1LDQsMywzLDQsNCw0LDAsMywzLDEsMiwzLDAsMywxLDAsMywzLDAsNSw0LDQsNCw0LDQsNCwzLDMsNSw0LDQsMywzLDUsNCwwLDMsMiwwLDQsNCksCigwLDIsMCwzLDAsMSwwLDAsMCwxLDMsMywzLDIsNCwxLDMsMCwzLDEsMywwLDIsMiwxLDEsMCwwLDIsMCw0LDMsMSwwLDQsMywwLDQsNCw0LDEsNCwzLDEsMSwzLDMsMSwwLDIsMCwwLDEsMywwLDAsMCwwLDIsMCwwLDQsMywyLDQsMyw1LDQsMywzLDMsNCwzLDMsNCwzLDMsMCwyLDEsMCwzLDMpLAooMCwyLDAsNCwwLDMsMCwyLDAsMiw1LDUsMyw0LDQsNCw0LDEsNCwzLDMsMCw0LDMsNCwzLDEsMywzLDIsNCwzLDAsMyw0LDMsMCwzLDQsNCwyLDQsNCwwLDQsNSwzLDMsMiwyLDEsMSwxLDIsMCwxLDUsMCwzLDMsMiw0LDMsMywzLDQsMCwzLDAsMiwwLDQsNCwzLDUsNSwwLDAsMywwLDIsMywzKSwKKDAsMywwLDQsMCwzLDAsMSwwLDMsNCwzLDMsMSwzLDMsMywwLDMsMSwzLDAsNCwzLDMsMSwxLDAsMywwLDMsMywwLDAsNCw0LDAsMSw1LDQsMywzLDUsMCwzLDMsNCwzLDAsMiwwLDEsMSwxLDAsMSwzLDAsMSwyLDEsMywzLDIsMywzLDAsMywwLDEsMCwxLDMsMyw0LDQsMSwwLDEsMiwyLDEsMyksCigwLDEsMCw0LDAsNCwwLDMsMCwxLDMsMywzLDIsMywxLDEsMCwzLDAsMywzLDQsMywyLDQsMiwwLDEsMCw0LDMsMiwwLDQsMywwLDUsMywzLDIsNCw0LDQsMywzLDMsNCwwLDEsMywwLDAsMSwwLDAsMSwwLDAsMCwwLDQsMiwzLDMsMywwLDMsMCwwLDAsNCw0LDQsNSwzLDIsMCwzLDMsMCwzLDUpLAooMCwyLDAsMywwLDAsMCwzLDAsMSwzLDAsMiwwLDAsMCwxLDAsMywxLDEsMywzLDAsMCwzLDAsMCwzLDAsMiwzLDEsMCwzLDEsMCwzLDMsMiwwLDQsMiwyLDAsMiwwLDAsMCw0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDEsMiwwLDEsMCwxLDAsMCwwLDEsMywxLDIsMCwwLDAsMSwwLDAsMSw0KSwKKDAsMywwLDMsMCw1LDAsMSwwLDIsNCwzLDEsMywzLDIsMSwxLDUsMiwxLDAsNSwxLDIsMCwwLDAsMywzLDIsMiwzLDIsNCwzLDAsMCwzLDMsMSwzLDMsMCwyLDUsMyw0LDAsMywzLDAsMSwyLDAsMiwyLDAsMywyLDAsMiwyLDMsMywzLDAsMiwwLDEsMCwzLDQsNCwyLDUsNCwwLDMsMCwwLDMsNSksCigwLDMsMCwzLDAsMywwLDEsMCwzLDMsMywzLDAsMywwLDIsMCwyLDEsMSwwLDIsMCwxLDAsMCwwLDIsMSwwLDAsMSwwLDMsMiwwLDAsMywzLDEsMiwzLDEsMCwzLDMsMCwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDIsMywxLDIsMywwLDMsMCwxLDAsMywyLDEsMCw0LDMsMCwxLDEsMCwzLDMpLAooMCw0LDAsNSwwLDMsMCwzLDAsNCw1LDUsNCwzLDUsMyw0LDMsNSwzLDMsMiw1LDMsNCw0LDQsMyw0LDMsNCw1LDUsMyw0LDQsMyw0LDQsNSw0LDQsNCwzLDQsNSw1LDQsMiwzLDQsMiwzLDQsMCwzLDMsMSw0LDMsMiw0LDMsMyw1LDUsMCwzLDAsMywwLDUsNSw1LDUsNCw0LDAsNCwwLDEsNCw0KSwKKDAsNCwwLDQsMCwzLDAsMywwLDMsNSw0LDQsMiwzLDIsNSwxLDMsMiw1LDEsNCwyLDMsMiwzLDMsNCwzLDMsMywzLDIsNSw0LDEsMywzLDUsMyw0LDQsMCw0LDQsMywxLDEsMywxLDAsMiwzLDAsMiwzLDAsMywwLDAsNCwzLDEsMyw0LDAsMywwLDIsMCw0LDQsNCwzLDQsNSwwLDQsMCwwLDMsNCksCigwLDMsMCwzLDAsMywxLDIsMCwzLDQsNCwzLDMsMywwLDIsMiw0LDMsMywxLDMsMywzLDEsMSwwLDMsMSw0LDMsMiwzLDQsNCwyLDQsNCw0LDMsNCw0LDMsMiw0LDQsMywxLDMsMywxLDMsMywwLDQsMSwwLDIsMiwxLDQsMywyLDMsMyw1LDQsMywzLDUsNCw0LDMsMywwLDQsMCwzLDIsMiw0LDQpLAooMCwyLDAsMSwwLDAsMCwwLDAsMSwyLDEsMywwLDAsMCwwLDAsMiwwLDEsMiwxLDAsMCwxLDAsMCwwLDAsMywwLDAsMSwwLDEsMSwzLDEsMCwwLDAsMSwxLDAsMSwxLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwxLDEsMiwyLDAsMyw0LDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMSwxKSwKKDAsMSwwLDAsMCwxLDAsMCwwLDAsNCwwLDQsMSw0LDAsMywwLDQsMCwzLDAsNCwwLDMsMCwzLDAsNCwxLDUsMSw0LDAsMCwzLDAsNSwwLDUsMiwwLDEsMCwwLDAsMiwxLDQsMCwxLDMsMCwwLDMsMCwwLDMsMSwxLDQsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCksCigxLDQsMCw1LDAsMywwLDIsMCwzLDUsNCw0LDMsNCwzLDUsMyw0LDMsMywwLDQsMywzLDMsMywzLDMsMiw0LDQsMywxLDMsNCw0LDUsNCw0LDMsNCw0LDEsMyw1LDQsMywzLDMsMSwyLDIsMywzLDEsMywxLDMsMywzLDUsMywzLDQsNSwwLDMsMCwzLDAsMyw0LDMsNCw0LDMsMCwzLDAsMiw0LDMpLAooMCwxLDAsNCwwLDAsMCwwLDAsMSw0LDAsNCwxLDQsMiw0LDAsMywwLDEsMCwxLDAsMCwwLDAsMCwyLDAsMywxLDEsMSwwLDMsMCwwLDAsMSwyLDEsMCwwLDEsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLDMsMCwwLDAsMCwzLDIsMCwyLDIsMCwxLDAsMCwwLDIsMywyLDMsMywwLDAsMCwwLDIsMSwwKSwKKDAsNSwxLDUsMCwzLDAsMywwLDUsNCw0LDUsMSw1LDMsMywwLDQsMyw0LDMsNSwzLDQsMywzLDIsNCwzLDQsMywzLDAsMywzLDEsNCw0LDMsNCw0LDQsMyw0LDUsNSwzLDIsMywxLDEsMywzLDEsMywxLDEsMywzLDIsNCw1LDMsMyw1LDAsNCwwLDMsMCw0LDQsMyw1LDMsMywwLDMsNCwwLDQsMyksCigwLDUsMCw1LDAsMywwLDIsMCw0LDQsMyw1LDIsNCwzLDMsMyw0LDQsNCwzLDUsMyw1LDMsMywxLDQsMCw0LDMsMywwLDMsMywwLDQsNCw0LDQsNSw0LDMsMyw1LDUsMywyLDMsMSwyLDMsMiwwLDEsMCwwLDMsMiwyLDQsNCwzLDEsNSwwLDQsMCwzLDAsNCwzLDEsMywyLDEsMCwzLDMsMCwzLDMpLAooMCw0LDAsNSwwLDUsMCw0LDAsNCw1LDUsNSwzLDQsMywzLDIsNSw0LDQsMyw1LDMsNSwzLDQsMCw0LDMsNCw0LDMsMiw0LDQsMyw0LDUsNCw0LDUsNSwwLDMsNSw1LDQsMSwzLDMsMiwzLDMsMSwzLDEsMCw0LDMsMSw0LDQsMyw0LDUsMCw0LDAsMiwwLDQsMyw0LDQsMywzLDAsNCwwLDAsNSw1KSwKKDAsNCwwLDQsMCw1LDAsMSwxLDMsMyw0LDQsMyw0LDEsMywwLDUsMSwzLDAsMywxLDMsMSwxLDAsMywwLDMsMyw0LDAsNCwzLDAsNCw0LDQsMyw0LDQsMCwzLDUsNCwxLDAsMywwLDAsMiwzLDAsMywxLDAsMywxLDAsMywyLDEsMyw1LDAsMywwLDEsMCwzLDIsMywzLDQsNCwwLDIsMiwwLDQsNCksCigyLDQsMCw1LDAsNCwwLDMsMCw0LDUsNSw0LDMsNSwzLDUsMyw1LDMsNSwyLDUsMyw0LDMsMyw0LDMsNCw1LDMsMiwxLDUsNCwzLDIsMyw0LDUsMyw0LDEsMiw1LDQsMywwLDMsMywwLDMsMiwwLDIsMywwLDQsMSwwLDMsNCwzLDMsNSwwLDMsMCwxLDAsNCw1LDUsNSw0LDMsMCw0LDIsMCwzLDUpLAooMCw1LDAsNCwwLDQsMCwyLDAsNSw0LDMsNCwzLDQsMywzLDMsNCwzLDQsMiw1LDMsNSwzLDQsMSw0LDMsNCw0LDQsMCwzLDUsMCw0LDQsNCw0LDUsMywxLDMsNCw1LDMsMywzLDMsMywzLDMsMCwyLDIsMCwzLDMsMiw0LDMsMywzLDUsMyw0LDEsMywzLDUsMywyLDAsMCwwLDAsNCwzLDEsMywzKSwKKDAsMSwwLDMsMCwzLDAsMSwwLDEsMywzLDMsMiwzLDMsMywwLDMsMCwwLDAsMywxLDMsMCwwLDAsMiwyLDIsMywwLDAsMywyLDAsMSwyLDQsMSwzLDMsMCwwLDMsMywzLDAsMSwwLDAsMiwxLDAsMCwzLDAsMywxLDAsMywwLDAsMSwzLDAsMiwwLDEsMCwzLDMsMSwzLDMsMCwwLDEsMSwwLDMsMyksCigwLDIsMCwzLDAsMiwxLDQsMCwyLDIsMywxLDEsMywxLDEsMCwyLDAsMywxLDIsMywxLDMsMCwwLDEsMCw0LDMsMiwzLDMsMywxLDQsMiwzLDMsMywzLDEsMCwzLDEsNCwwLDEsMSwwLDEsMiwwLDEsMSwwLDEsMSwwLDMsMSwzLDIsMiwwLDEsMCwwLDAsMiwzLDMsMywxLDAsMCwwLDAsMCwyLDMpLAooMCw1LDAsNCwwLDUsMCwyLDAsNCw1LDUsMywzLDQsMywzLDEsNSw0LDQsMiw0LDQsNCwzLDQsMiw0LDMsNSw1LDQsMywzLDQsMywzLDUsNSw0LDUsNSwxLDMsNCw1LDMsMSw0LDMsMSwzLDMsMCwzLDMsMSw0LDMsMSw0LDUsMywzLDUsMCw0LDAsMywwLDUsMywzLDEsNCwzLDAsNCwwLDEsNSwzKSwKKDAsNSwwLDUsMCw0LDAsMiwwLDQsNCwzLDQsMywzLDMsMywzLDUsNCw0LDQsNCw0LDQsNSwzLDMsNSwyLDQsNCw0LDMsNCw0LDMsMyw0LDQsNSw1LDMsMyw0LDMsNCwzLDMsNCwzLDMsMywzLDEsMiwyLDEsNCwzLDMsNSw0LDQsMyw0LDAsNCwwLDMsMCw0LDQsNCw0LDQsMSwwLDQsMiwwLDIsNCksCigwLDQsMCw0LDAsMywwLDEsMCwzLDUsMiwzLDAsMywwLDIsMSw0LDIsMywzLDQsMSw0LDMsMywyLDQsMSwzLDMsMywwLDMsMywwLDAsMywzLDMsNSwzLDMsMywzLDMsMiwwLDIsMCwwLDIsMCwwLDIsMCwwLDEsMCwwLDMsMSwyLDIsMywwLDMsMCwyLDAsNCw0LDMsMyw0LDEsMCwzLDAsMCwyLDQpLAooMCwwLDAsNCwwLDAsMCwwLDAsMCwxLDAsMSwwLDIsMCwwLDAsMCwwLDEsMCwyLDAsMSwwLDAsMCwwLDAsMywxLDMsMCwzLDIsMCwwLDAsMSwwLDMsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMyw0LDAsMiwwLDAsMCwwLDAsMCwyKSwKKDAsMiwxLDMsMCwyLDAsMiwwLDMsMywzLDMsMSwzLDEsMywzLDMsMywzLDMsNCwyLDIsMSwyLDEsNCwwLDQsMywxLDMsMywzLDIsNCwzLDUsNCwzLDMsMywzLDMsMywzLDAsMSwzLDAsMiwwLDAsMSwwLDAsMSwwLDAsNCwyLDAsMiwzLDAsMywzLDAsMywzLDQsMiwzLDEsNCwwLDEsMiwwLDIsMyksCigwLDMsMCwzLDAsMSwwLDMsMCwyLDMsMywzLDAsMywxLDIsMCwzLDMsMiwzLDMsMiwzLDIsMywxLDMsMCw0LDMsMiwwLDMsMywxLDQsMywzLDIsMyw0LDMsMSwzLDMsMSwxLDAsMSwxLDAsMSwwLDEsMCwxLDAsMCwwLDQsMSwxLDAsMywwLDMsMSwwLDIsMywzLDMsMywzLDEsMCwwLDIsMCwzLDMpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMiwwLDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMywwLDMsMCwzLDEsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwyLDAsMiwzLDAsMCwwLDAsMCwwLDAsMCwzKSwKKDAsMiwwLDMsMSwzLDAsMywwLDIsMywzLDMsMSwzLDEsMywxLDMsMSwzLDMsMywxLDMsMCwyLDMsMSwxLDQsMywzLDIsMywzLDEsMiwyLDQsMSwzLDMsMCwxLDQsMiwzLDAsMSwzLDAsMywwLDAsMSwzLDAsMiwwLDAsMywzLDIsMSwzLDAsMywwLDIsMCwzLDQsNCw0LDMsMSwwLDMsMCwwLDMsMyksCigwLDIsMCwxLDAsMiwwLDAsMCwxLDMsMiwyLDEsMywwLDEsMSwzLDAsMywyLDMsMSwyLDAsMiwwLDEsMSwzLDMsMywwLDMsMywxLDEsMiwzLDIsMywzLDEsMiwzLDIsMCwwLDEsMCwwLDAsMCwwLDAsMywwLDEsMCwwLDIsMSwyLDEsMywwLDMsMCwwLDAsMyw0LDQsNCwzLDIsMCwyLDAsMCwyLDQpLAooMCwwLDAsMSwwLDEsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwzLDEsMCwwLDAsMCwwLDAsMCwzKSwKKDAsMywwLDMsMCwyLDAsMywwLDMsMywzLDIsMywyLDIsMiwwLDMsMSwzLDMsMywyLDMsMywwLDAsMywwLDMsMiwyLDAsMiwzLDEsNCwzLDQsMywzLDIsMywxLDUsNCw0LDAsMywxLDIsMSwzLDAsMywxLDEsMiwwLDIsMywxLDMsMSwzLDAsMywwLDEsMCwzLDMsNCw0LDIsMSwwLDIsMSwwLDIsNCksCigwLDEsMCwzLDAsMSwwLDIsMCwxLDQsMiw1LDEsNCwwLDIsMCwyLDEsMywxLDQsMCwyLDEsMCwwLDIsMSw0LDEsMSwwLDMsMywwLDUsMSwzLDIsMywzLDEsMCwzLDIsMywwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDQsMCwxLDAsMywwLDIsMCwxLDAsMywzLDMsNCwzLDMsMCwwLDAsMCwyLDMpLAooMCwwLDAsMSwwLDAsMCwwLDAsMCwyLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwxLDAsMCwxLDAsMCwwLDAsMCwzKSwKKDAsMSwwLDMsMCw0LDAsMywwLDIsNCwzLDEsMCwzLDIsMiwxLDMsMSwyLDIsMywxLDEsMSwyLDEsMywwLDEsMiwwLDEsMywyLDEsMywwLDUsNSwxLDAsMCwxLDMsMiwxLDAsMywwLDAsMSwwLDAsMCwwLDAsMyw0LDAsMSwxLDEsMywyLDAsMiwwLDEsMCwyLDMsMywxLDIsMywwLDEsMCwxLDAsNCksCigwLDAsMCwxLDAsMywwLDMsMCwyLDIsMSwwLDAsNCwwLDMsMCwzLDEsMywwLDMsMCwzLDAsMSwwLDMsMCwzLDEsMywwLDMsMywwLDAsMSwyLDEsMSwxLDAsMSwyLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDIsMiwxLDIsMCwwLDIsMCwwLDAsMCwyLDMsMywzLDMsMCwwLDAsMCwxLDQpLAooMCwwLDAsMywwLDMsMCwwLDAsMCwzLDEsMSwwLDMsMCwxLDAsMiwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMywwLDIsMCwyLDMsMCwwLDIsMiwzLDEsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwyLDAsMCwwLDAsMiwzKSwKKDIsNCwwLDUsMCw1LDAsNCwwLDMsNCwzLDMsMyw0LDMsMywzLDQsMyw0LDQsNSw0LDUsNSw1LDIsMywwLDUsNSw0LDEsNSw0LDMsMSw1LDQsMyw0LDQsMywzLDQsMywzLDAsMywyLDAsMiwzLDAsMywwLDAsMywzLDAsNSwzLDIsMywzLDAsMywwLDMsMCwzLDQsNSw0LDUsMywwLDQsMywwLDMsNCksCigwLDMsMCwzLDAsMywwLDMsMCwzLDMsNCwzLDIsMywyLDMsMCw0LDMsMywzLDMsMywzLDMsMywwLDMsMiw0LDMsMywxLDMsNCwzLDQsNCw0LDMsNCw0LDMsMiw0LDQsMSwwLDIsMCwwLDEsMSwwLDIsMCwwLDMsMSwwLDUsMywyLDEsMywwLDMsMCwxLDIsNCwzLDIsNCwzLDMsMCwzLDIsMCw0LDQpLAooMCwzLDAsMywwLDEsMCwwLDAsMSw0LDMsMywyLDMsMSwzLDEsNCwyLDMsMiw0LDIsMyw0LDMsMCwyLDIsMywzLDMsMCwzLDMsMywwLDMsNCwxLDMsMywwLDMsNCwzLDMsMCwxLDEsMCwxLDAsMCwwLDQsMCwzLDAsMCwzLDEsMiwxLDMsMCw0LDAsMSwwLDQsMywzLDQsMywzLDAsMiwwLDAsMywzKSwKKDAsMywwLDQsMCwxLDAsMywwLDMsNCwzLDMsMCwzLDMsMywxLDMsMSwzLDMsNCwzLDMsMywwLDAsMywxLDUsMywzLDEsMywzLDIsNSw0LDMsMyw0LDUsMywyLDUsMyw0LDAsMSwwLDAsMCwwLDAsMiwwLDAsMSwxLDAsNCwyLDIsMSwzLDAsMywwLDIsMCw0LDQsMyw1LDMsMiwwLDEsMSwwLDMsNCksCigwLDUsMCw0LDAsNSwwLDIsMCw0LDQsMywzLDIsMywzLDMsMSw0LDMsNCwxLDUsMyw0LDMsNCwwLDQsMiw0LDMsNCwxLDUsNCwwLDQsNCw0LDQsNSw0LDEsMyw1LDQsMiwxLDQsMSwxLDMsMiwwLDMsMSwwLDMsMiwxLDQsMywzLDMsNCwwLDQsMCwzLDAsNCw0LDQsMywzLDMsMCw0LDIsMCwzLDQpLAooMSw0LDAsNCwwLDMsMCwxLDAsMywzLDMsMSwxLDMsMywyLDIsMywzLDEsMCwzLDIsMiwxLDIsMCwzLDEsMiwxLDIsMCwzLDIsMCwyLDIsMywzLDQsMywwLDMsMywxLDIsMCwxLDEsMywxLDIsMCwwLDMsMCwxLDEsMCwzLDIsMiwzLDMsMCwzLDAsMCwwLDIsMywzLDQsMywzLDAsMSwwLDAsMSw0KSwKKDAsNCwwLDQsMCw0LDAsMCwwLDMsNCw0LDMsMSw0LDIsMywyLDMsMywzLDEsNCwzLDQsMCwzLDAsNCwyLDMsMywyLDIsNSw0LDIsMSwzLDQsMyw0LDMsMSwzLDMsNCwyLDAsMiwxLDAsMywzLDAsMCwyLDAsMywxLDAsNCw0LDMsNCwzLDAsNCwwLDEsMCwyLDQsNCw0LDQsNCwwLDMsMiwwLDMsMyksCigwLDAsMCwxLDAsNCwwLDAsMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDMsMiwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDIpLAooMCwyLDAsMywwLDQsMCw0LDAsMSwzLDMsMywwLDQsMCwyLDEsMiwxLDEsMSwyLDAsMywxLDEsMCwxLDAsMywxLDAsMCwzLDMsMiwwLDEsMSwwLDAsMCwwLDAsMSwwLDIsMCwyLDIsMCwzLDEsMCwwLDEsMCwxLDEsMCwxLDIsMCwzLDAsMCwwLDAsMSwwLDAsMywzLDQsMywxLDAsMSwwLDMsMCwyKSwKKDAsMCwwLDMsMCw1LDAsMCwwLDAsMSwwLDIsMCwzLDEsMCwxLDMsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDEsMSwwLDAsNCwwLDAsMCwyLDMsMCwxLDQsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMywwLDAsMCwwLDAsMyksCigwLDIsMCw1LDAsNSwwLDEsMCwyLDQsMywzLDIsNSwxLDMsMiwzLDMsMywwLDQsMSwyLDAsMywwLDQsMCwyLDIsMSwxLDUsMywwLDAsMSw0LDIsMywyLDAsMywzLDMsMiwwLDIsNCwxLDEsMiwwLDEsMSwwLDMsMSwwLDEsMywxLDIsMywwLDIsMCwwLDAsMSwzLDUsNCw0LDQsMCwzLDAsMCwxLDMpLAooMCw0LDAsNSwwLDQsMCw0LDAsNCw1LDQsMywzLDQsMywzLDMsNCwzLDQsNCw1LDMsNCw1LDQsMiw0LDIsMyw0LDMsMSw0LDQsMSwzLDUsNCw0LDUsNSw0LDQsNSw1LDUsMiwzLDMsMSw0LDMsMSwzLDMsMCwzLDMsMSw0LDMsNCw0LDQsMCwzLDAsNCwwLDMsMyw0LDQsNSwwLDAsNCwzLDAsNCw1KSwKKDAsNCwwLDQsMCwzLDAsMywwLDMsNCw0LDQsMywzLDIsNCwzLDQsMyw0LDMsNSwzLDQsMywyLDEsNCwyLDQsNCwzLDEsMyw0LDIsNCw1LDUsMyw0LDUsNCwxLDUsNCwzLDAsMywyLDIsMywyLDEsMywxLDAsMywzLDMsNSwzLDMsMyw1LDQsNCwyLDMsMyw0LDMsMywzLDIsMSwwLDMsMiwxLDQsMyksCigwLDQsMCw1LDAsNCwwLDMsMCwzLDUsNSwzLDIsNCwzLDQsMCw1LDQsNCwxLDQsNCw0LDMsMywzLDQsMyw1LDUsMiwzLDMsNCwxLDIsNSw1LDMsNSw1LDIsMyw1LDUsNCwwLDMsMiwwLDMsMywxLDEsNSwxLDQsMSwwLDQsMywyLDMsNSwwLDQsMCwzLDAsNSw0LDMsNCwzLDAsMCw0LDEsMCw0LDQpLAooMSwzLDAsNCwwLDIsMCwyLDAsMiw1LDUsMywzLDMsMywzLDAsNCwyLDMsNCw0LDQsMyw0LDAsMCwzLDQsNSw0LDMsMywzLDMsMiw1LDUsNCw1LDUsNSw0LDMsNSw1LDUsMSwzLDEsMCwxLDAsMCwzLDIsMCw0LDIsMCw1LDIsMywyLDQsMSwzLDAsMywwLDQsNSw0LDUsNCwzLDAsNCwyLDAsNSw0KSwKKDAsMywwLDQsMCw1LDAsMywwLDMsNCw0LDMsMiwzLDIsMywzLDMsMywzLDIsNCwzLDMsMiwyLDAsMywzLDMsMywzLDEsMywzLDMsMCw0LDQsMyw0LDQsMSwxLDQsNCwyLDAsMywxLDAsMSwxLDAsNCwxLDAsMiwzLDEsMywzLDEsMyw0LDAsMywwLDEsMCwzLDEsMywwLDAsMSwwLDIsMCwwLDQsNCksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApLAooMCwzLDAsMywwLDIsMCwzLDAsMSw1LDQsMywzLDMsMSw0LDIsMSwyLDMsNCw0LDIsNCw0LDUsMCwzLDEsNCwzLDQsMCw0LDMsMywzLDIsMywyLDUsMyw0LDMsMiwyLDMsMCwwLDMsMCwyLDEsMCwxLDIsMCwwLDAsMCwyLDEsMSwzLDEsMCwyLDAsNCwwLDMsNCw0LDQsNSwyLDAsMiwwLDAsMSwzKSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDEsMSwwLDAsMSwxLDAsMCwwLDQsMiwxLDEsMCwxLDAsMywyLDAsMCwzLDEsMSwxLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDEsMCwwLDAsMiwwLDAsMCwxLDQsMCw0LDIsMSwwLDAsMCwwLDAsMSksCigwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwzLDEsMCwwLDAsMiwwLDIsMSwwLDAsMSwyLDEsMCwxLDEsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMywxLDAsMCwwLDAsMCwxLDAsMCwyLDEsMCwwLDAsMCwwLDAsMCwwLDIpLAooMCw0LDAsNCwwLDQsMCwzLDAsNCw0LDMsNCwyLDQsMywyLDAsNCw0LDQsMyw1LDMsNSwzLDMsMiw0LDIsNCwzLDQsMywxLDQsMCwyLDMsNCw0LDQsMywzLDMsNCw0LDQsMyw0LDEsMyw0LDMsMiwxLDIsMSwzLDMsMyw0LDQsMywzLDUsMCw0LDAsMywwLDQsMywzLDMsMiwxLDAsMywwLDAsMywzKSwKKDAsNCwwLDMsMCwzLDAsMywwLDMsNSw1LDMsMywzLDMsNCwzLDQsMywzLDMsNCw0LDQsMywzLDMsMyw0LDMsNSwzLDMsMSwzLDIsNCw1LDUsNSw1LDQsMyw0LDUsNSwzLDIsMiwzLDMsMywzLDIsMywzLDEsMiwzLDIsNCwzLDMsMyw0LDAsNCwwLDIsMCw0LDMsMiwyLDEsMiwwLDMsMCwwLDQsMSksCikKCmNsYXNzIEphcGFuZXNlQ29udGV4dEFuYWx5c2lzKG9iamVjdCk6CiAgICBOVU1fT0ZfQ0FURUdPUlkgPSA2CiAgICBET05UX0tOT1cgPSAtMQogICAgRU5PVUdIX1JFTF9USFJFU0hPTEQgPSAxMDAKICAgIE1BWF9SRUxfVEhSRVNIT0xEID0gMTAwMAogICAgTUlOSU1VTV9EQVRBX1RIUkVTSE9MRCA9IDQKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fdG90YWxfcmVsID0gTm9uZQogICAgICAgIHNlbGYuX3JlbF9zYW1wbGUgPSBOb25lCiAgICAgICAgc2VsZi5fbmVlZF90b19za2lwX2NoYXJfbnVtID0gTm9uZQogICAgICAgIHNlbGYuX2xhc3RfY2hhcl9vcmRlciA9IE5vbmUKICAgICAgICBzZWxmLl9kb25lID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl90b3RhbF9yZWwgPSAwICAjIHRvdGFsIHNlcXVlbmNlIHJlY2VpdmVkCiAgICAgICAgIyBjYXRlZ29yeSBjb3VudGVycywgZWFjaCBpbnRlZ2VyIGNvdW50cyBzZXF1ZW5jZSBpbiBpdHMgY2F0ZWdvcnkKICAgICAgICBzZWxmLl9yZWxfc2FtcGxlID0gWzBdICogc2VsZi5OVU1fT0ZfQ0FURUdPUlkKICAgICAgICAjIGlmIGxhc3QgYnl0ZSBpbiBjdXJyZW50IGJ1ZmZlciBpcyBub3QgdGhlIGxhc3QgYnl0ZSBvZiBhIGNoYXJhY3RlciwKICAgICAgICAjIHdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBieXRlcyB0byBza2lwIGluIG5leHQgYnVmZmVyCiAgICAgICAgc2VsZi5fbmVlZF90b19za2lwX2NoYXJfbnVtID0gMAogICAgICAgIHNlbGYuX2xhc3RfY2hhcl9vcmRlciA9IC0xICAjIFRoZSBvcmRlciBvZiBwcmV2aW91cyBjaGFyCiAgICAgICAgIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFRydWUsIGRldGVjdGlvbiBpcyBkb25lIGFuZCBjb25jbHVzaW9uIGhhcwogICAgICAgICMgYmVlbiBtYWRlCiAgICAgICAgc2VsZi5fZG9uZSA9IEZhbHNlCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIsIG51bV9ieXRlcyk6CiAgICAgICAgaWYgc2VsZi5fZG9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgVGhlIGJ1ZmZlciB3ZSBnb3QgaXMgYnl0ZSBvcmllbnRlZCwgYW5kIGEgY2hhcmFjdGVyIG1heSBzcGFuIGluIG1vcmUgdGhhbiBvbmUKICAgICAgICAjIGJ1ZmZlcnMuIEluIGNhc2UgdGhlIGxhc3Qgb25lIG9yIHR3byBieXRlIGluIGxhc3QgYnVmZmVyIGlzIG5vdAogICAgICAgICMgY29tcGxldGUsIHdlIHJlY29yZCBob3cgbWFueSBieXRlIG5lZWRlZCB0byBjb21wbGV0ZSB0aGF0IGNoYXJhY3RlcgogICAgICAgICMgYW5kIHNraXAgdGhlc2UgYnl0ZXMgaGVyZS4gIFdlIGNhbiBjaG9vc2UgdG8gcmVjb3JkIHRob3NlIGJ5dGVzIGFzCiAgICAgICAgIyB3ZWxsIGFuZCBhbmFseXNlIHRoZSBjaGFyYWN0ZXIgb25jZSBpdCBpcyBjb21wbGV0ZSwgYnV0IHNpbmNlIGEKICAgICAgICAjIGNoYXJhY3RlciB3aWxsIG5vdCBtYWtlIG11Y2ggZGlmZmVyZW5jZSwgYnkgc2ltcGx5IHNraXBwaW5nCiAgICAgICAgIyB0aGlzIGNoYXJhY3RlciB3aWxsIHNpbXBseSBvdXIgbG9naWMgYW5kIGltcHJvdmUgcGVyZm9ybWFuY2UuCiAgICAgICAgaSA9IHNlbGYuX25lZWRfdG9fc2tpcF9jaGFyX251bQogICAgICAgIHdoaWxlIGkgPCBudW1fYnl0ZXM6CiAgICAgICAgICAgIG9yZGVyLCBjaGFyX2xlbiA9IHNlbGYuZ2V0X29yZGVyKGJ5dGVfc3RyW2k6aSArIDJdKQogICAgICAgICAgICBpICs9IGNoYXJfbGVuCiAgICAgICAgICAgIGlmIGkgPiBudW1fYnl0ZXM6CiAgICAgICAgICAgICAgICBzZWxmLl9uZWVkX3RvX3NraXBfY2hhcl9udW0gPSBpIC0gbnVtX2J5dGVzCiAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJfb3JkZXIgPSAtMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgKG9yZGVyICE9IC0xKSBhbmQgKHNlbGYuX2xhc3RfY2hhcl9vcmRlciAhPSAtMSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdG90YWxfcmVsICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl90b3RhbF9yZWwgPiBzZWxmLk1BWF9SRUxfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kb25lID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbF9zYW1wbGVbanAyQ2hhckNvbnRleHRbc2VsZi5fbGFzdF9jaGFyX29yZGVyXVtvcmRlcl1dICs9IDEKICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfY2hhcl9vcmRlciA9IG9yZGVyCgogICAgZGVmIGdvdF9lbm91Z2hfZGF0YShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdG90YWxfcmVsID4gc2VsZi5FTk9VR0hfUkVMX1RIUkVTSE9MRAoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICAjIFRoaXMgaXMganVzdCBvbmUgd2F5IHRvIGNhbGN1bGF0ZSBjb25maWRlbmNlLiBJdCB3b3JrcyB3ZWxsIGZvciBtZS4KICAgICAgICBpZiBzZWxmLl90b3RhbF9yZWwgPiBzZWxmLk1JTklNVU1fREFUQV9USFJFU0hPTEQ6CiAgICAgICAgICAgIHJldHVybiAoc2VsZi5fdG90YWxfcmVsIC0gc2VsZi5fcmVsX3NhbXBsZVswXSkgLyBzZWxmLl90b3RhbF9yZWwKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5ET05UX0tOT1cKCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICByZXR1cm4gLTEsIDEKCmNsYXNzIFNKSVNDb250ZXh0QW5hbHlzaXMoSmFwYW5lc2VDb250ZXh0QW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKFNKSVNDb250ZXh0QW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyc2V0X25hbWUgPSAiU0hJRlRfSklTIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fY2hhcnNldF9uYW1lCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgaWYgbm90IGJ5dGVfc3RyOgogICAgICAgICAgICByZXR1cm4gLTEsIDEKICAgICAgICAjIGZpbmQgb3V0IGN1cnJlbnQgY2hhcidzIGJ5dGUgbGVuZ3RoCiAgICAgICAgZmlyc3RfY2hhciA9IGJ5dGVfc3RyWzBdCiAgICAgICAgaWYgKDB4ODEgPD0gZmlyc3RfY2hhciA8PSAweDlGKSBvciAoMHhFMCA8PSBmaXJzdF9jaGFyIDw9IDB4RkMpOgogICAgICAgICAgICBjaGFyX2xlbiA9IDIKICAgICAgICAgICAgaWYgKGZpcnN0X2NoYXIgPT0gMHg4Nykgb3IgKDB4RkEgPD0gZmlyc3RfY2hhciA8PSAweEZDKToKICAgICAgICAgICAgICAgIHNlbGYuX2NoYXJzZXRfbmFtZSA9ICJDUDkzMiIKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFyX2xlbiA9IDEKCiAgICAgICAgIyByZXR1cm4gaXRzIG9yZGVyIGlmIGl0IGlzIGhpcmFnYW5hCiAgICAgICAgaWYgbGVuKGJ5dGVfc3RyKSA+IDE6CiAgICAgICAgICAgIHNlY29uZF9jaGFyID0gYnl0ZV9zdHJbMV0KICAgICAgICAgICAgaWYgKGZpcnN0X2NoYXIgPT0gMjAyKSBhbmQgKDB4OUYgPD0gc2Vjb25kX2NoYXIgPD0gMHhGMSk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2Vjb25kX2NoYXIgLSAweDlGLCBjaGFyX2xlbgoKICAgICAgICByZXR1cm4gLTEsIGNoYXJfbGVuCgpjbGFzcyBFVUNKUENvbnRleHRBbmFseXNpcyhKYXBhbmVzZUNvbnRleHRBbmFseXNpcyk6CiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBpZiBub3QgYnl0ZV9zdHI6CiAgICAgICAgICAgIHJldHVybiAtMSwgMQogICAgICAgICMgZmluZCBvdXQgY3VycmVudCBjaGFyJ3MgYnl0ZSBsZW5ndGgKICAgICAgICBmaXJzdF9jaGFyID0gYnl0ZV9zdHJbMF0KICAgICAgICBpZiAoZmlyc3RfY2hhciA9PSAweDhFKSBvciAoMHhBMSA8PSBmaXJzdF9jaGFyIDw9IDB4RkUpOgogICAgICAgICAgICBjaGFyX2xlbiA9IDIKICAgICAgICBlbGlmIGZpcnN0X2NoYXIgPT0gMHg4RjoKICAgICAgICAgICAgY2hhcl9sZW4gPSAzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcl9sZW4gPSAxCgogICAgICAgICMgcmV0dXJuIGl0cyBvcmRlciBpZiBpdCBpcyBoaXJhZ2FuYQogICAgICAgIGlmIGxlbihieXRlX3N0cikgPiAxOgogICAgICAgICAgICBzZWNvbmRfY2hhciA9IGJ5dGVfc3RyWzFdCiAgICAgICAgICAgIGlmIChmaXJzdF9jaGFyID09IDB4QTQpIGFuZCAoMHhBMSA8PSBzZWNvbmRfY2hhciA8PSAweEYzKToKICAgICAgICAgICAgICAgIHJldHVybiBzZWNvbmRfY2hhciAtIDB4QTEsIGNoYXJfbGVuCgogICAgICAgIHJldHVybiAtMSwgY2hhcl9sZW4KCgpQSwMEFAAAAAAAAAAhAPBoyconMgAAJzIAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2J1bGdhcmlhbm1vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKIyB0aGlzIHRhYmxlIGlzIG1vZGlmaWVkIGJhc2Ugb24gd2luMTI1MUJ1bGdhcmlhbkNoYXJUb09yZGVyTWFwLCBzbwojIG9ubHkgbnVtYmVyIDw2NCBpcyBzdXJlIHZhbGlkCgpMYXRpbjVfQnVsZ2FyaWFuQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCA3NywgOTAsIDk5LDEwMCwgNzIsMTA5LDEwNywxMDEsIDc5LDE4NSwgODEsMTAyLCA3NiwgOTQsIDgyLCAgIyA0MAoxMTAsMTg2LDEwOCwgOTEsIDc0LDExOSwgODQsIDk2LDExMSwxODcsMTE1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNjUsIDY5LCA3MCwgNjYsIDYzLCA2OCwxMTIsMTAzLCA5MiwxOTQsMTA0LCA5NSwgODYsIDg3LCA3MSwgICMgNjAKMTE2LDE5NSwgODUsIDkzLCA5NywxMTMsMTk2LDE5NywxOTgsMTk5LDIwMCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksICAjIDgwCjIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwgICMgOTAKIDgxLDIyNiwyMjcsMjI4LDIyOSwyMzAsMTA1LDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LCA0NSwyMzcsMjM4LCAgIyBhMAogMzEsIDMyLCAzNSwgNDMsIDM3LCA0NCwgNTUsIDQ3LCA0MCwgNTksIDMzLCA0NiwgMzgsIDM2LCA0MSwgMzAsICAjIGIwCiAzOSwgMjgsIDM0LCA1MSwgNDgsIDQ5LCA1MywgNTAsIDU0LCA1NywgNjEsMjM5LCA2NywyNDAsIDYwLCA1NiwgICMgYzAKICAxLCAxOCwgIDksIDIwLCAxMSwgIDMsIDIzLCAxNSwgIDIsIDI2LCAxMiwgMTAsIDE0LCAgNiwgIDQsIDEzLCAgIyBkMAogIDcsICA4LCAgNSwgMTksIDI5LCAyNSwgMjIsIDIxLCAyNywgMjQsIDE3LCA3NSwgNTIsMjQxLCA0MiwgMTYsICAjIGUwCiA2MiwyNDIsMjQzLDI0NCwgNTgsMjQ1LCA5OCwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwgOTEsMjUyLDI1MywgICMgZjAKKQoKd2luMTI1MUJ1bGdhcmlhbkNoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgNzcsIDkwLCA5OSwxMDAsIDcyLDEwOSwxMDcsMTAxLCA3OSwxODUsIDgxLDEwMiwgNzYsIDk0LCA4MiwgICMgNDAKMTEwLDE4NiwxMDgsIDkxLCA3NCwxMTksIDg0LCA5NiwxMTEsMTg3LDExNSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDY1LCA2OSwgNzAsIDY2LCA2MywgNjgsMTEyLDEwMywgOTIsMTk0LDEwNCwgOTUsIDg2LCA4NywgNzEsICAjIDYwCjExNiwxOTUsIDg1LCA5MywgOTcsMTEzLDE5NiwxOTcsMTk4LDE5OSwyMDAsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywxMjAsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLCAgIyA4MAoyMjEsIDc4LCA2NCwgODMsMTIxLCA5OCwxMTcsMTA1LDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksICAjIDkwCiA4OCwyMzAsMjMxLDIzMiwyMzMsMTIyLCA4OSwxMDYsMjM0LDIzNSwyMzYsMjM3LDIzOCwgNDUsMjM5LDI0MCwgICMgYTAKIDczLCA4MCwxMTgsMTE0LDI0MSwyNDIsMjQzLDI0NCwyNDUsIDYyLCA1OCwyNDYsMjQ3LDI0OCwyNDksMjUwLCAgIyBiMAogMzEsIDMyLCAzNSwgNDMsIDM3LCA0NCwgNTUsIDQ3LCA0MCwgNTksIDMzLCA0NiwgMzgsIDM2LCA0MSwgMzAsICAjIGMwCiAzOSwgMjgsIDM0LCA1MSwgNDgsIDQ5LCA1MywgNTAsIDU0LCA1NywgNjEsMjUxLCA2NywyNTIsIDYwLCA1NiwgICMgZDAKICAxLCAxOCwgIDksIDIwLCAxMSwgIDMsIDIzLCAxNSwgIDIsIDI2LCAxMiwgMTAsIDE0LCAgNiwgIDQsIDEzLCAgIyBlMAogIDcsICA4LCAgNSwgMTksIDI5LCAyNSwgMjIsIDIxLCAyNywgMjQsIDE3LCA3NSwgNTIsMjUzLCA0MiwgMTYsICAjIGYwCikKCiMgTW9kZWwgVGFibGU6CiMgdG90YWwgc2VxdWVuY2VzOiAxMDAlCiMgZmlyc3QgNTEyIHNlcXVlbmNlczogOTYuOTM5MiUKIyBmaXJzdCAxMDI0IHNlcXVlbmNlczozLjA2MTglCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgMC4yOTkyJQojIG5lZ2F0aXZlIHNlcXVlbmNlczogIDAuMDAyMCUKQnVsZ2FyaWFuTGFuZ01vZGVsID0gKAowLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDMsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMywzLDIsMiwzLDIsMiwxLDIsMiwKMywxLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMCwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwzLDMsMywzLDMsMywzLDMsMCwzLDEsMCwKMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDIsMiwyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwzLDIsMywzLDMsMywzLDMsMywzLDAsMywwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMywyLDMsMywzLDMsMywzLDMsMywwLDMsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwyLDEsMywzLDMsMywyLDIsMiwxLDEsMiwwLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDIsMywyLDIsMywzLDEsMSwyLDMsMywyLDMsMywzLDMsMiwxLDIsMCwyLDAsMywwLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywxLDMsMywzLDMsMywyLDMsMiwzLDMsMywzLDMsMiwzLDMsMSwzLDAsMywwLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywxLDMsMywyLDMsMywzLDEsMywzLDIsMywyLDIsMiwwLDAsMiwwLDIsMCwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDMsMywwLDMsMywzLDIsMiwzLDMsMywxLDIsMiwzLDIsMSwxLDIsMCwyLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywyLDMsMywxLDIsMywyLDIsMiwzLDMsMywzLDMsMiwyLDMsMSwyLDAsMiwxLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDEsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywxLDMsMywzLDMsMywyLDMsMywzLDIsMywzLDIsMywyLDIsMiwzLDEsMiwwLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDMsMywzLDMsMSwxLDEsMiwyLDEsMywxLDMsMiwyLDMsMCwwLDEsMCwxLDAsMSwwLDAsCjAsMCwwLDEsMCwwLDAsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDIsMiwzLDIsMiwzLDEsMiwxLDEsMSwyLDMsMSwzLDEsMiwyLDAsMSwxLDEsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywxLDMsMiwyLDMsMywxLDIsMywxLDEsMywzLDMsMywxLDIsMiwxLDEsMSwwLDIsMCwyLDAsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDIsMiwzLDMsMywyLDIsMSwxLDIsMCwyLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywwLDEsMiwxLDMsMywyLDMsMywzLDMsMywyLDMsMiwxLDAsMywxLDIsMSwyLDEsMiwzLDIsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMSwxLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwwLDMsMSwzLDMsMiwzLDMsMiwyLDIsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMCwzLDMsMywzLDMsMiwxLDEsMiwxLDMsMywwLDMsMSwxLDEsMSwzLDIsMCwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDIsMiwyLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDEsMywxLDMsMywyLDMsMiwyLDIsMywwLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywyLDMsMywyLDIsMywyLDEsMSwxLDEsMSwzLDEsMywxLDEsMCwwLDAsMSwwLDAsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMiwzLDIsMCwzLDIsMCwzLDAsMiwwLDAsMiwxLDMsMSwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywyLDEsMSwxLDEsMiwxLDEsMiwxLDEsMSwyLDIsMSwyLDEsMSwxLDAsMSwxLDAsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMiwxLDMsMSwxLDIsMSwzLDIsMSwxLDAsMSwyLDMsMiwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMiwyLDEsMCwxLDAsMCwxLDAsMCwwLDIsMSwwLDMsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMiwzLDIsMywzLDEsMywyLDEsMSwxLDIsMSwxLDIsMSwzLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDIsMiwzLDMsMiwzLDIsMiwyLDMsMSwyLDIsMSwxLDIsMSwxLDIsMiwwLDEsMSwwLDEsMCwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDIsMSwzLDEsMCwyLDIsMSwzLDIsMSwwLDAsMiwwLDIsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMSwyLDAsMiwzLDEsMiwzLDIsMCwxLDMsMSwyLDEsMSwxLDAsMCwxLDAsMCwyLDIsMiwzLAoyLDIsMiwyLDEsMiwxLDEsMiwyLDEsMSwyLDAsMSwxLDEsMCwwLDEsMSwwLDAsMSwxLDAsMCwwLDEsMSwwLDEsCjMsMywzLDMsMywyLDEsMiwyLDEsMiwwLDIsMCwxLDAsMSwyLDEsMiwxLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMiwzLDMsMSwxLDMsMSwwLDMsMiwxLDAsMCwwLDEsMiwwLDIsMCwxLDAsMCwwLDEsMCwxLDIsMSwyLDIsCjEsMSwxLDEsMSwxLDEsMiwyLDIsMSwxLDEsMSwxLDEsMSwwLDEsMiwxLDEsMSwwLDAsMCwwLDAsMSwxLDAsMCwKMywxLDAsMSwwLDIsMywyLDIsMiwzLDIsMiwyLDIsMiwxLDAsMiwxLDIsMSwxLDEsMCwxLDIsMSwyLDIsMiwxLAoxLDEsMiwyLDIsMiwxLDIsMSwxLDAsMSwyLDEsMiwyLDIsMSwxLDEsMCwxLDEsMSwxLDIsMCwxLDAsMCwwLDAsCjIsMywyLDMsMywwLDAsMiwxLDAsMiwxLDAsMCwwLDAsMiwzLDAsMiwwLDAsMCwwLDAsMSwwLDAsMiwwLDEsMiwKMiwxLDIsMSwyLDIsMSwxLDEsMiwxLDEsMSwwLDEsMiwyLDEsMSwxLDEsMSwwLDEsMSwxLDAsMCwxLDIsMCwwLAozLDMsMiwyLDMsMCwyLDMsMSwxLDIsMCwwLDAsMSwwLDAsMiwwLDIsMCwwLDAsMSwwLDEsMCwxLDIsMCwyLDIsCjEsMSwxLDEsMiwxLDAsMSwyLDIsMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwKMiwzLDIsMywzLDAsMCwzLDAsMSwxLDAsMSwwLDAsMCwyLDIsMSwyLDAsMCwwLDAsMCwwLDAsMCwyLDAsMSwyLAoyLDIsMSwxLDEsMSwxLDIsMiwyLDEsMCwyLDAsMSwwLDEsMCwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsCjMsMywzLDMsMiwyLDIsMiwyLDAsMiwxLDEsMSwxLDIsMSwyLDEsMSwwLDIsMCwxLDAsMSwwLDAsMiwwLDEsMiwKMSwxLDEsMSwxLDEsMSwyLDIsMSwxLDAsMiwwLDEsMCwyLDAsMCwxLDEsMSwwLDAsMiwwLDAsMCwxLDEsMCwwLAoyLDMsMywzLDMsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDEsMSwwLDAsMCwwLDAsMCwxLDIsMCwxLDIsCjIsMiwyLDEsMSwyLDEsMSwyLDIsMiwxLDIsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMCwwLDEsMSwxLDAsMCwKMiwzLDMsMywzLDAsMiwyLDAsMiwxLDAsMCwwLDEsMSwxLDIsMCwyLDAsMCwwLDMsMCwwLDAsMCwyLDAsMiwyLAoxLDEsMSwyLDEsMiwxLDEsMiwyLDIsMSwyLDAsMSwxLDEsMCwxLDEsMSwxLDAsMiwxLDAsMCwwLDEsMSwwLDAsCjIsMywzLDMsMywwLDIsMSwwLDAsMiwwLDAsMCwwLDAsMSwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMiwwLDEsMiwKMSwxLDEsMiwxLDEsMSwxLDIsMiwyLDAsMSwwLDEsMSwxLDAsMCwxLDEsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLAozLDMsMiwyLDMsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDEsMSwwLDMsMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDIsCjEsMSwxLDEsMSwyLDEsMSwyLDIsMSwyLDIsMSwwLDEsMSwxLDEsMSwwLDEsMCwwLDEsMCwwLDAsMSwxLDAsMCwKMywxLDAsMSwwLDIsMiwyLDIsMywyLDEsMSwxLDIsMywwLDAsMSwwLDIsMSwxLDAsMSwxLDEsMSwyLDEsMSwxLAoxLDIsMiwxLDIsMSwyLDIsMSwxLDAsMSwyLDEsMiwyLDEsMSwxLDAsMCwxLDEsMSwyLDEsMCwxLDAsMCwwLDAsCjIsMSwwLDEsMCwzLDEsMiwyLDIsMiwxLDIsMiwxLDEsMSwwLDIsMSwyLDIsMSwxLDIsMSwxLDAsMiwxLDEsMSwKMSwyLDIsMiwyLDIsMiwyLDEsMiwwLDEsMSwwLDIsMSwxLDEsMSwxLDAsMCwxLDEsMSwxLDAsMSwwLDAsMCwwLAoyLDEsMSwxLDEsMiwyLDIsMiwxLDIsMiwyLDEsMiwyLDEsMSwyLDEsMiwzLDIsMiwxLDEsMSwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMywyLDAsMSwyLDAsMSwyLDEsMSwwLDEsMCwxLDIsMSwyLDAsMCwwLDEsMSwwLDAsMCwxLDAsMCwyLAoxLDEsMCwwLDEsMSwwLDEsMSwxLDEsMCwyLDAsMSwxLDEsMCwwLDEsMSwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsCjIsMCwwLDAsMCwxLDIsMiwyLDIsMiwyLDIsMSwyLDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMiwxLDEsMSwKMSwyLDIsMiwyLDEsMSwyLDEsMiwxLDEsMSwwLDIsMSwyLDEsMSwxLDAsMiwxLDEsMSwxLDAsMSwwLDAsMCwwLAozLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsCjEsMSwwLDEsMCwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMywyLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwyLAoxLDEsMSwxLDEsMSwwLDAsMiwyLDIsMiwyLDAsMSwxLDAsMSwxLDEsMSwxLDAsMCwxLDAsMCwwLDEsMSwwLDEsCjIsMywxLDIsMSwwLDEsMSwwLDIsMiwyLDAsMCwxLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMSwwLDEsMiwKMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLAoyLDIsMiwyLDIsMCwwLDIsMCwwLDIsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDIsCjEsMSwxLDEsMSwwLDAsMSwyLDEsMSwwLDEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMiwyLDAsMCwyLDAsMSwxLDAsMCwwLDEsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLAowLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDMsMiwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMiwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMiwKMSwxLDAsMCwxLDAsMCwwLDEsMSwwLDAsMSwwLDEsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMiwyLDIsMSwyLDEsMiwyLDEsMSwyLDEsMSwxLDAsMSwxLDEsMSwyLDAsMSwwLDEsMSwxLDEsMCwxLDEsCjEsMSwyLDEsMSwxLDEsMSwxLDAsMCwxLDIsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwzLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDIsMSwwLDAsMSwwLDIsMCwwLDAsMCwwLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwKMCwyLDAsMSwwLDAsMSwxLDIsMCwxLDAsMSwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwyLDIsMCwxLDEsMCwyLDEsMCwxLDEsMSwwLDAsMSwwLDIsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMSwwLDAsMSwwLDAsMCwxLDEsMCwwLDEsMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMiwyLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAowLDEsMCwxLDEsMSwwLDAsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwxLDAsMCwxLDIsMSwxLDEsMSwxLDEsMiwyLDEsMCwwLDEsMCwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwKMSwxLDIsMSwxLDEsMSwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMSwyLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKMCwxLDEsMCwxLDEsMSwwLDAsMSwwLDAsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAoxLDAsMSwwLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDAsMiwwLDAsMiwwLDEsMCwwLDEsMCwwLDEsCjEsMSwwLDAsMSwxLDAsMSwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLAoxLDEsMSwxLDEsMSwxLDIsMCwwLDAsMCwwLDAsMiwxLDAsMSwxLDAsMCwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMSwxLDAsMSwxLDEsMSwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKKQoKTGF0aW41QnVsZ2FyaWFuTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogTGF0aW41X0J1bGdhcmlhbkNoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEJ1bGdhcmlhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTY5MzkyLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJU08tODg1OS01IiwKICAnbGFuZ3VhZ2UnOiAnQnVsZ2FpcmFuJywKfQoKV2luMTI1MUJ1bGdhcmlhbk1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IHdpbjEyNTFCdWxnYXJpYW5DaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBCdWxnYXJpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk2OTM5MiwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAid2luZG93cy0xMjUxIiwKICAnbGFuZ3VhZ2UnOiAnQnVsZ2FyaWFuJywKfQpQSwMEFAAAAAAAAAAhAMjxVpscRgAAHEYAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2N5cmlsbGljbW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgS09JOC1SIGxhbmd1YWdlIG1vZGVsCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6CktPSThSX2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LCAgIyA4MAoyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsICAjIDkwCjIyMywyMjQsMjI1LCA2OCwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywgICMgYTAKMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLCAgIyBiMAogMjcsICAzLCAyMSwgMjgsIDEzLCAgMiwgMzksIDE5LCAyNiwgIDQsIDIzLCAxMSwgIDgsIDEyLCAgNSwgIDEsICAjIGMwCiAxNSwgMTYsICA5LCAgNywgIDYsIDE0LCAyNCwgMTAsIDE3LCAxOCwgMjAsIDI1LCAzMCwgMjksIDIyLCA1NCwgICMgZDAKIDU5LCAzNywgNDQsIDU4LCA0MSwgNDgsIDUzLCA0NiwgNTUsIDQyLCA2MCwgMzYsIDQ5LCAzOCwgMzEsIDM0LCAgIyBlMAogMzUsIDQzLCA0NSwgMzIsIDQwLCA1MiwgNTYsIDMzLCA2MSwgNjIsIDUxLCA1NywgNDcsIDYzLCA1MCwgNzAsICAjIGYwCikKCndpbjEyNTFfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsCjIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwKMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LAoyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LCA2OCwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsCiAzNywgNDQsIDMzLCA0NiwgNDEsIDQ4LCA1NiwgNTEsIDQyLCA2MCwgMzYsIDQ5LCAzOCwgMzEsIDM0LCAzNSwKIDQ1LCAzMiwgNDAsIDUyLCA1MywgNTUsIDU4LCA1MCwgNTcsIDYzLCA3MCwgNjIsIDYxLCA0NywgNTksIDQzLAogIDMsIDIxLCAxMCwgMTksIDEzLCAgMiwgMjQsIDIwLCAgNCwgMjMsIDExLCAgOCwgMTIsICA1LCAgMSwgMTUsCiAgOSwgIDcsICA2LCAxNCwgMzksIDI2LCAyOCwgMjIsIDI1LCAyOSwgNTQsIDE4LCAxNywgMzAsIDI3LCAxNiwKKQoKbGF0aW41X2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LAoyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsCjIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwKIDM3LCA0NCwgMzMsIDQ2LCA0MSwgNDgsIDU2LCA1MSwgNDIsIDYwLCAzNiwgNDksIDM4LCAzMSwgMzQsIDM1LAogNDUsIDMyLCA0MCwgNTIsIDUzLCA1NSwgNTgsIDUwLCA1NywgNjMsIDcwLCA2MiwgNjEsIDQ3LCA1OSwgNDMsCiAgMywgMjEsIDEwLCAxOSwgMTMsICAyLCAyNCwgMjAsICA0LCAyMywgMTEsICA4LCAxMiwgIDUsICAxLCAxNSwKICA5LCAgNywgIDYsIDE0LCAzOSwgMjYsIDI4LCAyMiwgMjUsIDI5LCA1NCwgMTgsIDE3LCAzMCwgMjcsIDE2LAoyMzksIDY4LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTUsCikKCm1hY0N5cmlsbGljX2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKIDM3LCA0NCwgMzMsIDQ2LCA0MSwgNDgsIDU2LCA1MSwgNDIsIDYwLCAzNiwgNDksIDM4LCAzMSwgMzQsIDM1LAogNDUsIDMyLCA0MCwgNTIsIDUzLCA1NSwgNTgsIDUwLCA1NywgNjMsIDcwLCA2MiwgNjEsIDQ3LCA1OSwgNDMsCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwKMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLAoyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsCjIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsIDY4LCAxNiwKICAzLCAyMSwgMTAsIDE5LCAxMywgIDIsIDI0LCAyMCwgIDQsIDIzLCAxMSwgIDgsIDEyLCAgNSwgIDEsIDE1LAogIDksICA3LCAgNiwgMTQsIDM5LCAyNiwgMjgsIDIyLCAyNSwgMjksIDU0LCAxOCwgMTcsIDMwLCAyNywyNTUsCikKCklCTTg1NV9jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwgNzQsMTUzLCA3NSwxNTQsICAjIDQwCjE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MSwxNzIsIDY2LDE3MywgNjUsMTc0LCA3NiwxNzUsIDY0LDE3NiwxNzcsIDc3LCA3MiwxNzgsIDY5LCAgIyA2MAogNjcsMTc5LCA3OCwgNzMsMTgwLDE4MSwgNzksMTgyLDE4MywxODQsMTg1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjE5MSwxOTIsMTkzLDE5NCwgNjgsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwKMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsIDI3LCA1OSwgNTQsIDcwLAogIDMsIDM3LCAyMSwgNDQsIDI4LCA1OCwgMTMsIDQxLCAgMiwgNDgsIDM5LCA1MywgMTksIDQ2LDIxOCwyMTksCjIyMCwyMjEsMjIyLDIyMywyMjQsIDI2LCA1NSwgIDQsIDQyLDIyNSwyMjYsMjI3LDIyOCwgMjMsIDYwLDIyOSwKMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsIDExLCAzNiwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLAogIDgsIDQ5LCAxMiwgMzgsICA1LCAzMSwgIDEsIDM0LCAxNSwyNDQsMjQ1LDI0NiwyNDcsIDM1LCAxNiwyNDgsCiA0MywgIDksIDQ1LCAgNywgMzIsICA2LCA0MCwgMTQsIDUyLCAyNCwgNTYsIDEwLCAzMywgMTcsIDYxLDI0OSwKMjUwLCAxOCwgNjIsIDIwLCA1MSwgMjUsIDU3LCAzMCwgNDcsIDI5LCA2MywgMjIsIDUwLDI1MSwyNTIsMjU1LAopCgpJQk04NjZfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAogMzcsIDQ0LCAzMywgNDYsIDQxLCA0OCwgNTYsIDUxLCA0MiwgNjAsIDM2LCA0OSwgMzgsIDMxLCAzNCwgMzUsCiA0NSwgMzIsIDQwLCA1MiwgNTMsIDU1LCA1OCwgNTAsIDU3LCA2MywgNzAsIDYyLCA2MSwgNDcsIDU5LCA0MywKICAzLCAyMSwgMTAsIDE5LCAxMywgIDIsIDI0LCAyMCwgIDQsIDIzLCAxMSwgIDgsIDEyLCAgNSwgIDEsIDE1LAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsCjIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwKMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LAogIDksICA3LCAgNiwgMTQsIDM5LCAyNiwgMjgsIDIyLCAyNSwgMjksIDU0LCAxOCwgMTcsIDMwLCAyNywgMTYsCjIzOSwgNjgsMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1NSwKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5Ny42NjAxJQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOiAyLjMzODklCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgIDAuMTIzNyUKIyBuZWdhdGl2ZSBzZXF1ZW5jZXM6ICAgMC4wMDA5JQpSdXNzaWFuTGFuZ01vZGVsID0gKAowLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwxLDMsMywzLDMsMSwzLDMsMywyLDMsMiwzLDMsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwzLDIsMiwyLDIsMiwwLDAsMiwKMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDAsMCwzLDMsMywzLDMsMywzLDMsMywyLDMsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwzLDMsMywzLDMsMywzLDMsMywyLDMsMywwLDAsMywzLDMsMywzLDMsMywzLDIsMywzLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwwLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDEsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDAsMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMiwxLAowLDAsMCwwLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywyLDIsMiwzLDEsMywzLDEsMywzLDMsMywyLDIsMywwLDIsMiwyLDMsMywyLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDMsMywzLDMsMywyLDIsMywyLDMsMywzLDIsMSwyLDIsMCwxLDIsMiwyLDIsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwzLDAsMiwyLDMsMywyLDEsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDEsMiwzLDIsMiwzLDIsMywzLDMsMywyLDIsMywwLDMsMiwyLDMsMSwxLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMiwyLDMsMywzLDMsMywyLDMsMywzLDMsMiwyLDIsMCwzLDMsMywyLDIsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwzLDMsMywzLDMsMywyLDMsMiwyLDAsMSwzLDIsMSwyLDIsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywyLDEsMSwzLDAsMSwxLDEsMSwyLDEsMSwwLDIsMiwyLDEsMiwwLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDMsMywyLDIsMiwyLDEsMywyLDMsMiwzLDIsMSwyLDIsMCwxLDEsMiwxLDIsMSwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDMsMiwzLDMsMywyLDIsMiwyLDAsMiwyLDIsMiwzLDEsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDIsMiwzLDMsMywzLDMsMywzLDMsMywxLDMsMiwwLDAsMywzLDMsMywyLDMsMywzLDMsMiwzLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMywyLDIsMywzLDAsMiwxLDAsMywyLDMsMiwzLDAsMCwxLDIsMCwwLDEsMCwxLDIsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDMsMCwyLDMsMywzLDMsMiwzLDMsMywzLDEsMiwyLDAsMCwyLDMsMiwyLDIsMywyLDMsMiwyLDMsMCwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDAsMiwzLDIsMywwLDEsMiwzLDMsMiwwLDIsMywwLDAsMiwzLDIsMiwwLDEsMywxLDMsMiwyLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMywwLDIsMywzLDMsMywzLDMsMywzLDIsMSwzLDIsMCwwLDIsMiwzLDMsMywyLDMsMywwLDIsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwyLDMsMywyLDIsMiwzLDMsMCwwLDEsMSwxLDEsMSwyLDAsMCwxLDEsMSwxLDAsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMiwzLDMsMywzLDMsMywzLDAsMywyLDMsMywyLDMsMiwwLDIsMSwwLDEsMSwwLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDMsMywzLDIsMiwyLDIsMywxLDMsMiwzLDEsMSwyLDEsMCwyLDIsMiwyLDEsMywxLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDMsMywzLDMsMywxLDIsMiwxLDMsMSwwLDMsMCwwLDMsMCwwLDAsMSwxLDAsMSwyLDEsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwyLDEsMSwzLDMsMywyLDIsMSwyLDIsMywxLDEsMiwwLDAsMiwyLDEsMywwLDAsMiwxLDEsMiwxLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywzLDMsMywxLDIsMiwyLDEsMiwxLDMsMywxLDEsMiwxLDIsMSwyLDIsMCwyLDAsMCwxLDEsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMywzLDMsMiwxLDMsMiwyLDMsMiwwLDMsMiwwLDMsMCwxLDAsMSwxLDAsMCwxLDEsMSwxLDAsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDMsMywzLDIsMiwyLDMsMywxLDIsMSwyLDEsMCwxLDAsMSwxLDAsMSwwLDAsMiwxLDEsMSwwLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMSwyLDEsMiwzLDMsMiwyLDEsMiwyLDMsMCwyLDEsMCwwLDIsMiwzLDIsMSwyLDIsMiwyLDIsMywxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDEsMSwwLDEsMSwyLDIsMSwxLDMsMCwwLDEsMywxLDEsMSwwLDAsMCwxLDAsMSwxLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwzLDMsMywyLDAsMCwwLDIsMSwwLDEsMCwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMSwwLDAsMiwzLDIsMiwyLDEsMiwyLDIsMSwyLDEsMCwwLDEsMSwxLDAsMiwwLDEsMSwxLDAsMCwxLDEsCjEsMCwwLDAsMCwwLDEsMiwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMywzLDAsMCwwLDAsMSwwLDAsMCwwLDMsMCwxLDIsMSwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMSwxLAoxLDAsMSwwLDEsMiwwLDAsMSwxLDIsMSwwLDEsMSwxLDEsMCwxLDEsMSwxLDAsMSwwLDAsMSwwLDAsMSwxLDAsCjIsMiwzLDIsMiwyLDMsMSwyLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMSwwLDIsMSwKMSwxLDEsMSwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMCwxLDEsMSwwLDEsMSwwLAozLDMsMywyLDIsMiwyLDMsMiwyLDEsMSwyLDIsMiwyLDEsMSwzLDEsMiwxLDIsMCwwLDEsMSwwLDEsMCwyLDEsCjEsMSwxLDEsMSwyLDEsMCwxLDEsMSwxLDAsMSwwLDAsMSwxLDAsMCwxLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwKMiwwLDAsMSwwLDMsMiwyLDIsMiwxLDIsMSwyLDEsMiwwLDAsMCwyLDEsMiwyLDEsMSwyLDIsMCwxLDEsMCwyLAoxLDEsMSwxLDEsMCwxLDEsMSwyLDEsMSwxLDIsMSwwLDEsMiwxLDEsMSwxLDAsMSwxLDEsMCwwLDEsMCwwLDEsCjEsMywyLDIsMiwxLDEsMSwyLDMsMCwwLDAsMCwyLDAsMiwyLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDEsMSwKMSwwLDEsMSwwLDEsMCwxLDEsMCwxLDEsMCwyLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLAoyLDMsMiwzLDIsMSwyLDIsMiwyLDEsMCwwLDAsMiwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwyLDEsCjEsMSwyLDEsMCwyLDAsMCwxLDAsMSwwLDAsMSwwLDAsMSwxLDAsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwKMywwLDAsMSwwLDIsMiwyLDMsMiwyLDIsMiwyLDIsMiwwLDAsMCwyLDEsMiwxLDEsMSwyLDIsMCwwLDAsMSwyLAoxLDEsMSwxLDEsMCwxLDIsMSwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMCwwLDEsCjIsMywyLDMsMywyLDAsMSwxLDEsMCwwLDEsMCwyLDAsMSwxLDMsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDIsMSwKMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMSwxLDAsMSwxLDEsMCwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLAoyLDMsMywzLDMsMSwyLDIsMiwyLDAsMSwxLDAsMiwxLDEsMSwyLDEsMCwxLDEsMCwwLDEsMCwxLDAsMCwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMywyLDAsMCwxLDEsMiwyLDEsMCwwLDIsMCwxLDEsMywwLDAsMSwwLDAsMCwwLDAsMSwwLDEsMiwxLAoxLDEsMiwwLDEsMSwxLDAsMSwwLDEsMSwwLDEsMCwxLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMSwxLDAsCjEsMywyLDMsMiwxLDAsMCwyLDIsMiwwLDEsMCwyLDAsMSwxLDEsMCwxLDAsMCwwLDMsMCwxLDEsMCwwLDIsMSwKMSwxLDEsMCwxLDEsMCwwLDAsMCwxLDEsMCwxLDAsMCwyLDEsMSwwLDEsMCwwLDAsMSwwLDEsMCwwLDEsMSwwLAozLDEsMiwxLDEsMiwyLDIsMiwyLDIsMSwyLDIsMSwxLDAsMCwwLDIsMiwyLDAsMCwwLDEsMiwxLDAsMSwwLDEsCjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMiwxLDEsMSwwLDEsMCwxLDEsMCwxLDEsMSwwLDAsMSwKMywwLDAsMCwwLDIsMCwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMCwxLDEsMSwwLDEsMCwxLDEsMCwwLDEsMCwxLAoxLDEsMCwwLDEsMCwwLDAsMSwwLDEsMSwwLDAsMSwwLDEsMCwxLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDEsCjEsMywzLDIsMiwwLDAsMCwyLDIsMCwwLDAsMSwyLDAsMSwxLDIsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDIsMSwKMCwxLDEsMCwwLDEsMSwwLDAsMCwxLDEsMCwxLDEsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAoyLDMsMiwzLDIsMCwwLDAsMCwxLDEsMCwwLDAsMiwwLDIsMCwyLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwxLDEsCjEsMSwyLDAsMSwyLDEsMCwxLDEsMiwxLDEsMSwxLDEsMiwxLDEsMCwxLDAsMCwxLDEsMSwxLDEsMCwxLDEsMCwKMSwzLDIsMiwyLDEsMCwwLDIsMiwxLDAsMSwyLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwxLAowLDAsMSwxLDAsMSwxLDAsMCwxLDEsMCwxLDEsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMCwyLDMsMSwyLDIsMiwyLDIsMiwxLDEsMCwwLDAsMSwwLDEsMCwyLDEsMSwxLDAsMCwwLDAsMSwKMSwxLDAsMSwxLDAsMSwxLDEsMSwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAoyLDAsMiwwLDAsMSwwLDMsMiwxLDIsMSwyLDIsMCwxLDAsMCwwLDIsMSwwLDAsMiwxLDEsMSwxLDAsMiwwLDIsCjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMiwxLDAsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDAsMSwwLDAsMSwKMSwyLDIsMiwyLDEsMCwwLDEsMCwwLDAsMCwwLDIsMCwxLDEsMSwxLDAsMCwwLDAsMSwwLDEsMiwwLDAsMiwwLAoxLDAsMSwxLDEsMiwxLDAsMSwwLDEsMSwwLDAsMSwwLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwxLDAsMSwxLDAsCjIsMSwyLDIsMiwwLDMsMCwxLDEsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwwLDAsMSwxLDEsMCwwLDEsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLAoxLDIsMiwzLDIsMiwwLDAsMSwxLDIsMCwxLDIsMSwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMSwxLDAsMCwxLDEsMCwwLDEsMSwwLDAsMSwxLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwKMiwyLDEsMSwyLDEsMiwyLDIsMiwyLDEsMiwyLDAsMSwwLDAsMCwxLDIsMiwyLDEsMiwxLDEsMSwxLDEsMiwxLAoxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsMSwwLDEsMSwxLDAsMCwwLDAsMSwxLDEsMCwxLDEsMCwwLDEsCjEsMiwyLDIsMiwwLDEsMCwyLDIsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwKMCwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMSwxLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMiwyLDAsMCwwLDIsMiwyLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLAowLDEsMSwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDIsMiwwLDAsMCwwLDEsMCwwLDEsMSwyLDAsMCwwLDAsMSwwLDEsMCwwLDEsMCwwLDIsMCwwLDAsMSwKMCwwLDEsMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDAsMCwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwyLDEsMSwyLDAsMiwxLDEsMSwxLDAsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwxLDEsCjAsMCwxLDAsMSwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDIsMSwyLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLAowLDAsMSwwLDEsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjEsMCwwLDAsMCwyLDAsMSwyLDEsMCwxLDEsMSwwLDEsMCwwLDAsMSwwLDEsMCwwLDEsMCwxLDAsMCwwLDAsMSwKMCwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMSwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAoyLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjEsMCwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAoxLDEsMSwwLDEsMCwxLDAsMCwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMSwxLDAsMSwxLDAsMSwwLDEsMCwwLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDEsMCwxLDEsMCwxLDAsMCwwLAowLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwKKQoKS29pOHJNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBLT0k4Ul9jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBSdXNzaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzY2MDEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIktPSTgtUiIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9CgpXaW4xMjUxQ3lyaWxsaWNNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiB3aW4xMjUxX2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAid2luZG93cy0xMjUxIiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KCkxhdGluNUN5cmlsbGljTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogbGF0aW41X2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiSVNPLTg4NTktNSIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9CgpNYWNDeXJpbGxpY01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IG1hY0N5cmlsbGljX2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiTWFjQ3lyaWxsaWMiLAogICdsYW5ndWFnZSc6ICdSdXNzaWFuJywKfQoKSWJtODY2TW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogSUJNODY2X2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiSUJNODY2IiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KCklibTg1NU1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IElCTTg1NV9jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBSdXNzaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzY2MDEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIklCTTg1NSIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9ClBLAwQUAAAAAAAAACEA/ruvKZAxAACQMQAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nZ3JlZWttb2RlbC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAyNTU6IENvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHVzdWFsbHkgZG9lcyBub3QgZXhpc3QgaW4gYW55IHRleHQKIyAyNTQ6IENhcnJpYWdlL1JldHVybgojIDI1Mzogc3ltYm9sIChwdW5jdHVhdGlvbikgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gd29yZAojIDI1MjogMCAtIDkKCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6CkxhdGluN19jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDgyLDEwMCwxMDQsIDk0LCA5OCwxMDEsMTE2LDEwMiwxMTEsMTg3LDExNywgOTIsIDg4LDExMywgODUsICAjIDQwCiA3OSwxMTgsMTA1LCA4MywgNjcsMTE0LDExOSwgOTUsIDk5LDEwOSwxODgsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MiwgNzAsIDgwLCA4MSwgNjAsIDk2LCA5MywgODksIDY4LDEyMCwgOTcsIDc3LCA4NiwgNjksIDU1LCAgIyA2MAogNzgsMTE1LCA2NSwgNjYsIDU4LCA3NiwxMDYsMTAzLCA4NywxMDcsMTEyLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgODAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyA5MAoyNTMsMjMzLCA5MCwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsIDc0LDI1MywyNTMsICAjIGEwCjI1MywyNTMsMjUzLDI1MywyNDcsMjQ4LCA2MSwgMzYsIDQ2LCA3MSwgNzMsMjUzLCA1NCwyNTMsMTA4LDEyMywgICMgYjAKMTEwLCAzMSwgNTEsIDQzLCA0MSwgMzQsIDkxLCA0MCwgNTIsIDQ3LCA0NCwgNTMsIDM4LCA0OSwgNTksIDM5LCAgIyBjMAogMzUsIDQ4LDI1MCwgMzcsIDMzLCA0NSwgNTYsIDUwLCA4NCwgNTcsMTIwLDEyMSwgMTcsIDE4LCAyMiwgMTUsICAjIGQwCjEyNCwgIDEsIDI5LCAyMCwgMjEsICAzLCAzMiwgMTMsIDI1LCAgNSwgMTEsIDE2LCAxMCwgIDYsIDMwLCAgNCwgICMgZTAKICA5LCAgOCwgMTQsICA3LCAgMiwgMTIsIDI4LCAyMywgNDIsIDI0LCA2NCwgNzUsIDE5LCAyNiwgMjcsMjUzLCAgIyBmMAopCgp3aW4xMjUzX2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgODIsMTAwLDEwNCwgOTQsIDk4LDEwMSwxMTYsMTAyLDExMSwxODcsMTE3LCA5MiwgODgsMTEzLCA4NSwgICMgNDAKIDc5LDExOCwxMDUsIDgzLCA2NywxMTQsMTE5LCA5NSwgOTksMTA5LDE4OCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcyLCA3MCwgODAsIDgxLCA2MCwgOTYsIDkzLCA4OSwgNjgsMTIwLCA5NywgNzcsIDg2LCA2OSwgNTUsICAjIDYwCiA3OCwxMTUsIDY1LCA2NiwgNTgsIDc2LDEwNiwxMDMsIDg3LDEwNywxMTIsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyA4MAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDkwCjI1MywyMzMsIDYxLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgNzQsMjUzLDI1MywgICMgYTAKMjUzLDI1MywyNTMsMjUzLDI0NywyNTMsMjUzLCAzNiwgNDYsIDcxLCA3MywyNTMsIDU0LDI1MywxMDgsMTIzLCAgIyBiMAoxMTAsIDMxLCA1MSwgNDMsIDQxLCAzNCwgOTEsIDQwLCA1MiwgNDcsIDQ0LCA1MywgMzgsIDQ5LCA1OSwgMzksICAjIGMwCiAzNSwgNDgsMjUwLCAzNywgMzMsIDQ1LCA1NiwgNTAsIDg0LCA1NywxMjAsMTIxLCAxNywgMTgsIDIyLCAxNSwgICMgZDAKMTI0LCAgMSwgMjksIDIwLCAyMSwgIDMsIDMyLCAxMywgMjUsICA1LCAxMSwgMTYsIDEwLCAgNiwgMzAsICA0LCAgIyBlMAogIDksICA4LCAxNCwgIDcsICAyLCAxMiwgMjgsIDIzLCA0MiwgMjQsIDY0LCA3NSwgMTksIDI2LCAyNywyNTMsICAjIGYwCikKCiMgTW9kZWwgVGFibGU6CiMgdG90YWwgc2VxdWVuY2VzOiAxMDAlCiMgZmlyc3QgNTEyIHNlcXVlbmNlczogOTguMjg1MSUKIyBmaXJzdCAxMDI0IHNlcXVlbmNlczoxLjcwMDElCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgMC4wMzU5JQojIG5lZ2F0aXZlIHNlcXVlbmNlczogIDAuMDE0OCUKR3JlZWtMYW5nTW9kZWwgPSAoCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywyLDIsMywzLDMsMywzLDMsMywzLDEsMywzLDMsMCwyLDIsMywzLDAsMywwLDMsMiwwLDMsMywzLDAsCjMsMCwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMCwzLDMsMCwzLDIsMywzLDAsMywyLDMsMywzLDAsMCwzLDAsMywwLDMsMywyLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjAsMiwzLDIsMiwzLDMsMywzLDMsMywzLDMsMCwzLDMsMywzLDAsMiwzLDMsMCwzLDMsMywzLDIsMywzLDMsMCwKMiwwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwyLDEsMywzLDMsMywyLDMsMywyLDMsMywyLDAsCjAsMCwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDAsMywzLDMsMywzLDMsMCwzLDMsMCwzLDMsMywzLDMsMywzLDMsMywzLDAsMywyLDMsMywwLAoyLDAsMSwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDIsMywwLDAsMCwwLDMsMywwLDMsMSwzLDMsMywwLDMsMywwLDMsMywzLDMsMCwwLDAsMCwKMiwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywwLDMsMCwzLDMsMywzLDMsMCwzLDIsMiwyLDMsMCwyLDMsMywzLDMsMywyLDMsMywwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMywyLDIsMiwzLDMsMywzLDAsMywxLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDIsMiwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDIsMCwzLDAsMCwwLDMsMywyLDMsMywzLDMsMywwLDAsMywyLDMsMCwyLDMsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwzLDMsMywzLDAsMCwzLDMsMCwyLDMsMCwzLDAsMywzLDMsMCwwLDMsMCwzLDAsMiwyLDMsMywwLDAsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMiwwLDMsMiwzLDMsMywzLDAsMywzLDMsMywzLDAsMywzLDIsMywyLDMsMywyLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDIsMywyLDMsMywzLDMsMywzLDAsMiwzLDIsMywyLDIsMiwzLDIsMywzLDIsMywwLDIsMiwyLDMsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywwLDAsMCwzLDMsMywyLDMsMywwLDAsMywwLDMsMCwwLDAsMywyLDAsMywwLDMsMCwwLDIsMCwyLDAsCjAsMCwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywwLDMsMywzLDMsMywzLDAsMywzLDAsMywwLDAsMCwzLDMsMCwzLDMsMywwLDAsMSwyLDMsMCwKMywwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywyLDAsMCwzLDIsMiwzLDMsMCwzLDMsMywzLDMsMiwxLDMsMCwzLDIsMywzLDIsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMywwLDIsMywzLDMsMywzLDMsMCwwLDMsMCwzLDAsMCwwLDMsMywwLDMsMiwzLDAsMCwzLDMsMywwLAozLDAsMCwwLDIsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywwLDMsMywzLDMsMywzLDAsMCwzLDAsMywwLDAsMCwzLDIsMCwzLDIsMywwLDAsMywyLDMsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywxLDIsMiwzLDMsMywzLDMsMywwLDIsMywwLDMsMCwwLDAsMywzLDAsMywwLDIsMCwwLDIsMywxLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMywzLDMsMywwLDMsMCwzLDMsMiwzLDAsMywzLDMsMywzLDMsMCwzLDMsMywwLDIsMywwLDAsMywwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDMsMywzLDAsMCwzLDAsMCwwLDMsMywwLDMsMCwyLDMsMywwLDAsMywwLDMsMCwzLDMsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywwLDAsMCwzLDMsMywzLDMsMywwLDAsMywwLDIsMCwwLDAsMywzLDAsMywwLDMsMCwwLDIsMCwyLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMywwLDMsMCwyLDAsMywyLDAsMywyLDMsMiwzLDAsMCwzLDIsMywyLDMsMywwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwyLDMsMywzLDMsMywwLDAsMCwzLDAsMiwxLDAsMCwzLDIsMiwyLDAsMywwLDAsMiwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwzLDMsMywyLDAsMywwLDMsMCwzLDMsMCwyLDEsMiwzLDMsMCwwLDMsMCwzLDAsMywzLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDMsMywzLDAsMywzLDMsMywzLDMsMCwyLDMsMCwzLDAsMCwwLDIsMSwwLDIsMiwzLDAsMCwyLDIsMiwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwyLDMsMywzLDIsMywwLDAsMSwzLDAsMiwwLDAsMCwwLDMsMCwxLDAsMiwwLDAsMSwxLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywxLDAsMywwLDAsMCwzLDIsMCwzLDIsMywzLDMsMCwwLDMsMCwzLDIsMiwyLDEsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMywzLDMsMCwwLDMsMCwwLDAsMCwyLDAsMiwzLDMsMiwyLDIsMiwzLDAsMiwwLDIsMiwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywyLDAsMCwwLDAsMCwwLDIsMywwLDIsMCwyLDMsMiwwLDAsMywwLDMsMCwzLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwzLDIsMywzLDIsMiwzLDAsMiwwLDMsMCwwLDAsMiwwLDAsMCwwLDEsMiwwLDIsMCwyLDAsCjAsMiwwLDIsMCwyLDIsMCwwLDEsMCwyLDIsMiwwLDIsMiwyLDAsMiwyLDIsMCwwLDIsMCwwLDEsMCwwLDAsMCwKMCwyLDAsMywzLDIsMCwwLDAsMCwwLDAsMSwzLDAsMiwwLDIsMiwyLDAsMCwyLDAsMywwLDAsMiwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDIsMywyLDAsMiwyLDAsMiwwLDIsMiwwLDIsMCwyLDIsMiwwLDAsMCwwLDAsMCwyLDMsMCwwLDAsMiwKMCwxLDIsMCwwLDAsMCwyLDIsMCwwLDAsMiwxLDAsMiwyLDAsMCwwLDAsMCwwLDEsMCwyLDAsMCwwLDAsMCwwLAowLDAsMiwxLDAsMiwzLDIsMiwzLDIsMywyLDAsMCwzLDMsMywwLDAsMywyLDAsMCwwLDEsMSwwLDIsMCwyLDIsCjAsMiwwLDIsMCwyLDIsMCwwLDIsMCwyLDIsMiwwLDIsMiwyLDIsMCwwLDIsMCwwLDAsMiwwLDEsMCwwLDAsMCwKMCwzLDAsMywzLDIsMiwwLDMsMCwwLDAsMiwyLDAsMiwyLDIsMSwyLDAsMCwxLDIsMiwwLDAsMywwLDAsMCwyLAowLDEsMiwwLDAsMCwxLDIsMCwwLDAsMCwwLDAsMCwyLDIsMCwxLDAsMCwyLDAsMCwwLDIsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMywzLDIsMiwwLDAsMCwyLDAsMiwzLDMsMCwyLDAsMCwwLDAsMCwwLDIsMiwyLDAsMiwyLDAsMiwwLDIsCjAsMiwyLDAsMCwyLDIsMiwyLDEsMCwwLDIsMiwwLDIsMCwwLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwyLDAsMywyLDMsMCwwLDAsMywwLDAsMiwyLDAsMiwwLDIsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwyLAowLDAsMiwyLDAsMCwyLDIsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwyLDAsMCwzLDIsMCwyLDIsMiwyLDIsMCwwLDAsMiwwLDAsMCwwLDIsMCwxLDAsMCwyLDAsMSwwLDAsMCwKMCwyLDIsMiwwLDIsMiwwLDEsMiwwLDIsMiwyLDAsMiwyLDIsMiwxLDIsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMiwwLDIsMCwyLDIsMCwwLDAsMCwxLDIsMSwwLDAsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMywyLDMsMCwwLDIsMCwwLDAsMiwyLDAsMiwwLDAsMCwxLDAsMCwyLDAsMiwwLDIsMiwwLDAsMCwwLAowLDAsMiwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsCjAsMiwyLDMsMiwyLDAsMCwwLDAsMCwwLDEsMywwLDIsMCwyLDIsMCwwLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMCwyLDAsMywyLDAsMiwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMCwyLDAsMCwwLDAsMSwxLDAsMCwyLDEsMiwwLDIsMiwwLDEsMCwwLDEsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwzLDAsMiwyLDIsMCwwLDIsMCwwLDAsMiwwLDAsMCwyLDMsMCwyLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwyLAowLDEsMiwwLDAsMCwxLDIsMiwxLDAsMCwwLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDEsMiwwLDIsMiwwLDIsMCwwLDIsMCwwLDAsMCwxLDIsMSwwLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMiwwLDAsMCwzLDEsMiwyLDAsMiwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMywwLDAsMCwwLDIsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDEsMCwyLDAsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwwLDAsMCwwLDAsMCwyLAowLDIsMiwwLDAsMiwyLDIsMiwyLDAsMSwyLDAsMCwwLDIsMiwwLDEsMCwyLDAsMCwyLDIsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMiwKMCwxLDIsMCwwLDAsMCwyLDIsMSwwLDEsMCwxLDAsMiwyLDIsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAowLDIsMCwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwyLDIsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDIsCjAsMiwyLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMiwwLDAsMCwKMCwyLDIsMiwyLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwxLAowLDAsMiwwLDAsMCwwLDEsMiwwLDAsMCwwLDAsMCwyLDIsMSwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMiwwLDIsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMiwyLDIsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMiwKMCwwLDEsMCwwLDAsMCwyLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwyLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDIsCjAsMCwyLDAsMCwwLDAsMiwyLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDAsMiwyLDEsMCwwLDAsMCwwLDAsMiwwLDAsMiwwLDIsMiwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwyLAowLDAsMiwwLDAsMiwwLDIsMiwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwwLDIsMiwwLDIsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwyLDAsMCwwLDAsMCwKMCwyLDIsMiwyLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwxLAowLDAsMCwwLDAsMCwwLDIsMSwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDAsMCwwLDIsMCwwLDAsMCwwLDEsMCwwLDAsMCwyLDIsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMiwwLDAsMCwKMCwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDIsMCwyLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMiwxLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAopCgpMYXRpbjdHcmVla01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IExhdGluN19jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBHcmVla0xhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTgyODUxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJU08tODg1OS03IiwKICAnbGFuZ3VhZ2UnOiAnR3JlZWsnLAp9CgpXaW4xMjUzR3JlZWtNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiB3aW4xMjUzX2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEdyZWVrTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45ODI4NTEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIndpbmRvd3MtMTI1MyIsCiAgJ2xhbmd1YWdlJzogJ0dyZWVrJywKfQpQSwMEFAAAAAAAAAAhAI9mrRhRLAAAUSwAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2hlYnJld21vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgICAgICAgICAgU2ltb24gTW9udGFndQojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDUKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMgICBTaG9zaGFubmFoIEZvcmJlcyAtIG9yaWdpbmFsIEMgY29kZSAoPykKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAyNTU6IENvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHVzdWFsbHkgZG9lcyBub3QgZXhpc3QgaW4gYW55IHRleHQKIyAyNTQ6IENhcnJpYWdlL1JldHVybgojIDI1Mzogc3ltYm9sIChwdW5jdHVhdGlvbikgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gd29yZAojIDI1MjogMCAtIDkKCiMgV2luZG93cy0xMjU1IGxhbmd1YWdlIG1vZGVsCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6CldJTjEyNTVfQ0hBUl9UT19PUkRFUl9NQVAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCA2OSwgOTEsIDc5LCA4MCwgOTIsIDg5LCA5NywgOTAsIDY4LDExMSwxMTIsIDgyLCA3MywgOTUsIDg1LCAgIyA0MAogNzgsMTIxLCA4NiwgNzEsIDY3LDEwMiwxMDcsIDg0LDExNCwxMDMsMTE1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNTAsIDc0LCA2MCwgNjEsIDQyLCA3NiwgNzAsIDY0LCA1MywxMDUsIDkzLCA1NiwgNjUsIDU0LCA0OSwgICMgNjAKIDY2LDExMCwgNTEsIDQzLCA0NCwgNjMsIDgxLCA3NywgOTgsIDc1LDEwOCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxMjQsMjAyLDIwMywyMDQsMjA1LCA0MCwgNTgsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsCjIxNSwgODMsIDUyLCA0NywgNDYsIDcyLCAzMiwgOTQsMjE2LDExMywyMTcsMTA5LDIxOCwyMTksMjIwLDIyMSwKIDM0LDExNiwyMjIsMTE4LDEwMCwyMjMsMjI0LDExNywxMTksMTA0LDEyNSwyMjUsMjI2LCA4NywgOTksMjI3LAoxMDYsMTIyLDEyMywyMjgsIDU1LDIyOSwyMzAsMTAxLDIzMSwyMzIsMTIwLDIzMywgNDgsIDM5LCA1NywyMzQsCiAzMCwgNTksIDQxLCA4OCwgMzMsIDM3LCAzNiwgMzEsIDI5LCAzNSwyMzUsIDYyLCAyOCwyMzYsMTI2LDIzNywKMjM4LCAzOCwgNDUsMjM5LDI0MCwyNDEsMjQyLDI0MywxMjcsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLAogIDksICA4LCAyMCwgMTYsICAzLCAgMiwgMjQsIDE0LCAyMiwgIDEsIDI1LCAxNSwgIDQsIDExLCAgNiwgMjMsCiAxMiwgMTksIDEzLCAyNiwgMTgsIDI3LCAyMSwgMTcsICA3LCAxMCwgIDUsMjUxLDI1MiwxMjgsIDk2LDI1MywKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5OC40MDA0JQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOiAxLjU5ODElCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgIDAuMDg3JQojIG5lZ2F0aXZlIHNlcXVlbmNlczogICAwLjAwMTUlCkhFQlJFV19MQU5HX01PREVMID0gKAowLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDIsMSwyLDAsMSwwLDAsCjMsMCwzLDEsMCwwLDEsMywyLDAsMSwxLDIsMCwyLDIsMiwxLDEsMSwxLDIsMSwxLDEsMiwwLDAsMiwyLDAsMSwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwyLAoxLDIsMSwyLDEsMiwwLDAsMiwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwKMSwyLDEsMywxLDEsMCwwLDIsMCwwLDAsMSwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMCwxLDIsMiwxLDMsCjEsMiwxLDEsMiwyLDAsMCwyLDIsMCwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDIsMiwyLDIsMywyLAoxLDIsMSwyLDIsMiwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMiwzLDIsMiwzLDIsMiwyLDEsMiwyLDIsMiwKMSwyLDEsMSwyLDIsMCwxLDIsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMCwyLDIsMiwyLDIsCjAsMiwwLDIsMiwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywwLDIsMiwyLAowLDIsMSwyLDIsMiwwLDAsMiwxLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwxLDIsMywyLDIsMiwKMSwyLDEsMiwyLDIsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMSwwLAozLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDAsMiwwLDIsCjAsMiwxLDIsMiwyLDAsMCwxLDIsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwzLDIsMiwzLDIsMSwyLDEsMSwxLAowLDEsMSwxLDEsMSwzLDAsMSwwLDAsMCwwLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwKMCwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsCjAsMiwwLDEsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywyLDEsMiwzLDMsMiwzLDMsMywzLDIsMywyLDEsMiwwLDIsMSwyLAowLDIsMCwyLDIsMiwwLDAsMSwyLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMSwyLDIsMywzLDIsMywyLDMsMiwyLDMsMSwyLDIsMCwyLDIsMiwKMCwyLDEsMiwyLDIsMCwwLDEsMiwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMSwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMiwzLDMsMiwyLDIsMywzLDMsMywxLDMsMiwyLDIsCjAsMiwwLDEsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwzLDMsMywyLDMsMiwyLDIsMSwyLDIsMCwyLDIsMiwyLAowLDIsMCwyLDIsMiwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDEsMywyLDMsMywyLDMsMywyLDIsMSwyLDIsMiwyLDIsMiwKMCwyLDEsMiwxLDIsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywyLDMsMiwzLDMsMiwzLDMsMywzLDIsMywyLDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLDEsCjAsMiwwLDEsMiwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMiwxLDIsMywzLDMsMywzLDMsMywyLDMsMiwzLDIsMSwyLDMsMCwyLDEsMiwyLAowLDIsMSwxLDIsMSwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwyLDAsCjMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMywyLDEsMywxLDIsMiwyLDEsMiwzLDMsMSwyLDEsMiwyLDIsMiwKMCwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDAsMiwzLDMsMywxLDMsMywzLDEsMiwyLDIsMiwxLDEsMiwyLDIsMiwyLDIsCjAsMiwwLDEsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMiwzLDMsMywyLDIsMywzLDMsMiwxLDIsMywyLDMsMiwyLDIsMiwxLDIsMSwxLDEsMiwyLAowLDIsMSwxLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwKMSwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMiwzLDMsMiwzLDEsMiwyLDIsMiwzLDIsMywxLDEsMiwyLDEsMiwyLDEsMSwwLDIsMiwyLDIsCjAsMSwwLDEsMiwyLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywwLDAsMSwxLDAsMSwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDIsMiwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwxLDAsMSwwLDEsMSwwLDEsMSwwLDAsMCwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMCwwLDEsMSwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMywyLDIsMSwyLDIsMiwyLDIsMiwyLDEsMiwyLDEsMiwyLDEsMSwxLDEsMSwxLDEsMSwyLDEsMSwwLDMsMywzLAowLDMsMCwyLDIsMiwyLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjIsMiwyLDMsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwyLDIsMSwyLDIsMiwxLDEsMSwyLDAsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMCwyLDIsMCwwLDAsMCwwLDAsCjAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDIsMSwwLDIsMSwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMSwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMSwxLDIsMiwyLDIsMiwxLDIsMiwyLDEsMSwyLDIsMiwyLDIsMiwyLDEsMiwyLDEsMCwxLDEsMSwxLDAsCjAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDEsMSwxLDEsMiwxLDEsMiwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMiwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMSwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsCjIsMSwxLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDIsMiwyLDIsMiwxLDIsMSwyLDEsMSwxLDEsMCwwLDAsMCwKMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMSwyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMiwxLDIsMSwxLDIsMSwxLDEsMiwxLDIsMSwyLDAsMSwwLDEsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDEsMiwyLDIsMSwyLDIsMiwyLDIsMiwyLDIsMSwyLDEsMSwxLDEsMSwxLDIsMSwyLDEsMSwwLDEsMCwxLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDIsMiwKMCwyLDAsMSwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMiwwLDEsMSwxLDAsMSwwLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDEsMSwwLDAsCjAsMSwxLDEsMiwxLDIsMiwyLDAsMiwwLDIsMCwxLDEsMiwxLDEsMSwxLDIsMSwwLDEsMSwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwxLDAsMCwwLDAsMCwxLDAsMSwyLDIsMCwxLDAsMCwxLDEsMiwyLDEsMiwwLDIsMCwwLDAsMSwyLDAsMSwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMiwwLDIsMSwyLDAsMiwwLDAsMSwxLDEsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLDEsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDEsMCwwLDAsMCwwLDEsMCwyLDEsMSwwLDEsMCwwLDEsMSwxLDIsMiwwLDAsMSwwLDAsMCwxLDAsMCwxLAoxLDEsMiwxLDAsMSwxLDEsMCwxLDAsMSwxLDEsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMiwyLDEsCjAsMiwwLDEsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDAsMCwxLDAsMSwxLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMSwxLDEsMSwxLDEsMSwxLDIsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDEsMSwxLDAsMSwxLDAsMSwwLDAsMCwxLDEsMCwxLAoyLDAsMSwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwxLDAsMSwwLDAsMSwxLDIsMSwxLDIsMCwxLDAsMCwwLDEsMSwwLDEsCjEsMCwwLDEsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMiwwLDEsMCwwLDAsMCwyLDEsMSwyLDAsMiwwLDAsMCwxLDEsMCwxLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMiwxLDEsMCwxLDAsMCwyLDIsMSwyLDEsMSwwLDEsMCwwLDAsMSwxLDAsMSwKMiwwLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMiwyLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDEsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDIsMiwwLDAsMCwwLDIsMSwxLDEsMCwyLDEsMSwwLDAsMCwyLDEsMCwxLAoxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDIsMCwxLDAsMCwxLDEsMCwyLDEsMSwwLDEsMCwwLDAsMSwxLDAsMSwKMiwyLDEsMSwxLDAsMSwxLDAsMSwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDEsMSwwLDEsMCwwLDEsMSwwLDEsMiwxLDAsMiwwLDAsMCwxLDEsMCwxLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsCjAsMSwwLDAsMiwwLDIsMSwxLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDIsMCwxLDAsMCwxLDEsMSwwLDEsMCwwLDEsMCwwLDAsMSwwLDAsMSwKMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLDAsMSwwLDAsMiwxLDEsMSwxLDEsMCwxLDAsMCwwLDAsMSwwLDEsCjAsMSwxLDEsMiwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwyLDEsMCwwLDAsMCwwLDEsMSwxLDEsMSwwLDEsMCwwLDAsMSwxLDAsMCwKKQoKV2luMTI1NUhlYnJld01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IFdJTjEyNTVfQ0hBUl9UT19PUkRFUl9NQVAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogSEVCUkVXX0xBTkdfTU9ERUwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk4NDAwNCwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAid2luZG93cy0xMjU1IiwKICAnbGFuZ3VhZ2UnOiAnSGVicmV3JywKfQpQSwMEFAAAAAAAAAAhAMPBVYAwMQAAMDEAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2h1bmdhcmlhbm1vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKTGF0aW4yX0h1bmdhcmlhbkNoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgMjgsIDQwLCA1NCwgNDUsIDMyLCA1MCwgNDksIDM4LCAzOSwgNTMsIDM2LCA0MSwgMzQsIDM1LCA0NywKIDQ2LCA3MSwgNDMsIDMzLCAzNywgNTcsIDQ4LCA2NCwgNjgsIDU1LCA1MiwyNTMsMjUzLDI1MywyNTMsMjUzLAoyNTMsICAyLCAxOCwgMjYsIDE3LCAgMSwgMjcsIDEyLCAyMCwgIDksIDIyLCAgNywgIDYsIDEzLCAgNCwgIDgsCiAyMywgNjcsIDEwLCAgNSwgIDMsIDIxLCAxOSwgNjUsIDYyLCAxNiwgMTEsMjUzLDI1MywyNTMsMjUzLDI1MywKMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LAoxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywgNzUsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwKIDc5LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLAoyMjEsIDUxLCA4MSwyMjIsIDc4LDIyMywyMjQsMjI1LDIyNiwgNDQsMjI3LDIyOCwyMjksIDYxLDIzMCwyMzEsCjIzMiwyMzMsMjM0LCA1OCwyMzUsIDY2LCA1OSwyMzYsMjM3LDIzOCwgNjAsIDY5LCA2MywyMzksMjQwLDI0MSwKIDgyLCAxNCwgNzQsMjQyLCA3MCwgODAsMjQzLCA3MiwyNDQsIDE1LCA4MywgNzcsIDg0LCAzMCwgNzYsIDg1LAoyNDUsMjQ2LDI0NywgMjUsIDczLCA0MiwgMjQsMjQ4LDI0OSwyNTAsIDMxLCA1NiwgMjksMjUxLDI1MiwyNTMsCikKCndpbjEyNTBIdW5nYXJpYW5DaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDI4LCA0MCwgNTQsIDQ1LCAzMiwgNTAsIDQ5LCAzOCwgMzksIDUzLCAzNiwgNDEsIDM0LCAzNSwgNDcsCiA0NiwgNzIsIDQzLCAzMywgMzcsIDU3LCA0OCwgNjQsIDY4LCA1NSwgNTIsMjUzLDI1MywyNTMsMjUzLDI1MywKMjUzLCAgMiwgMTgsIDI2LCAxNywgIDEsIDI3LCAxMiwgMjAsICA5LCAyMiwgIDcsICA2LCAxMywgIDQsICA4LAogMjMsIDY3LCAxMCwgIDUsICAzLCAyMSwgMTksIDY1LCA2MiwgMTYsIDExLDI1MywyNTMsMjUzLDI1MywyNTMsCjE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwKMTc3LDE3OCwxNzksMTgwLCA3OCwxODEsIDY5LDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsIDc2LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsCiA4MSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwKMjIxLCA1MSwgODMsMjIyLCA4MCwyMjMsMjI0LDIyNSwyMjYsIDQ0LDIyNywyMjgsMjI5LCA2MSwyMzAsMjMxLAoyMzIsMjMzLDIzNCwgNTgsMjM1LCA2NiwgNTksMjM2LDIzNywyMzgsIDYwLCA3MCwgNjMsMjM5LDI0MCwyNDEsCiA4NCwgMTQsIDc1LDI0MiwgNzEsIDgyLDI0MywgNzMsMjQ0LCAxNSwgODUsIDc5LCA4NiwgMzAsIDc3LCA4NywKMjQ1LDI0NiwyNDcsIDI1LCA3NCwgNDIsIDI0LDI0OCwyNDksMjUwLCAzMSwgNTYsIDI5LDI1MSwyNTIsMjUzLAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDk0LjczNjglCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6NS4yNjIzJQojIHJlc3QgIHNlcXVlbmNlczogICAgIDAuODg5NCUKIyBuZWdhdGl2ZSBzZXF1ZW5jZXM6ICAwLjAwMDklCkh1bmdhcmlhbkxhbmdNb2RlbCA9ICgKMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAozLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDIsMiwzLDMsMSwxLDIsMiwyLDIsMiwxLDIsCjMsMiwyLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDEsMiwzLDMsMywzLDIsMywzLDEsMSwzLDMsMCwxLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLAozLDIsMSwzLDMsMywzLDMsMiwzLDMsMywzLDMsMSwxLDIsMywzLDMsMywzLDMsMywxLDEsMywyLDAsMSwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDEsMSwyLDMsMywzLDEsMywzLDMsMywzLDEsMywzLDIsMiwwLDMsMiwzLAowLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMiwzLDMsMiwzLDMsMywzLDMsMiwzLDMsMiwyLDMsMiwzLDIsMCwzLDIsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywyLDMsMywzLDMsMywyLDMsMywzLDEsMiwzLDIsMiwzLDEsMiwzLDMsMiwyLDAsMywzLDMsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywyLDIsMywzLDMsMywzLDMsMiwzLDMsMywzLDIsMywzLDMsMywwLDIsMywyLAowLDAsMCwxLDEsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywxLDEsMSwzLDMsMiwxLDMsMiwyLDMsMiwxLDMsMiwyLDEsMCwzLDMsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDIsMiwzLDMsMywzLDMsMSwyLDMsMywzLDMsMSwyLDEsMywzLDMsMywyLDIsMywxLDEsMywyLDAsMSwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDIsMiwzLDMsMywzLDMsMiwxLDMsMywzLDMsMywyLDIsMSwzLDMsMywwLDEsMSwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywyLDMsMywyLDMsMywzLDIsMCwzLDIsMywKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywyLDMsMywzLDIsMywyLDMsMywzLDEsMywyLDIsMiwzLDEsMSwzLDMsMSwxLDAsMywzLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywyLDMsMywzLDIsMywyLDMsMywzLDIsMywzLDMsMywzLDEsMiwzLDIsMiwwLDIsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwyLDMsMSwzLDMsMiwyLDEsMywzLDMsMSwxLDMsMSwyLDMsMiwzLDIsMiwyLDEsMCwyLDIsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLAozLDEsMSwzLDMsMywzLDMsMSwyLDMsMywzLDMsMSwyLDEsMywzLDMsMiwyLDMsMiwxLDAsMywyLDAsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMywzLDMsMywzLDEsMiwzLDMsMywzLDEsMSwwLDMsMywzLDMsMCwyLDMsMCwwLDIsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMiwzLDMsMiwyLDIsMiwzLDMsMCwxLDIsMywyLDMsMiwyLDMsMiwxLDIsMCwyLDIsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywxLDIsMywzLDMsMiwxLDIsMywzLDIsMiwyLDMsMiwzLDMsMSwzLDMsMSwxLDAsMiwzLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwyLDIsMiwyLDMsMywzLDEsMSwxLDMsMywxLDEsMywxLDEsMywyLDEsMiwzLDEsMSwwLDIsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMSwyLDEsMSwzLDMsMSwxLDEsMSwzLDMsMSwxLDIsMiwxLDIsMSwxLDIsMiwxLDEsMCwyLDIsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDEsMiwxLDEsMywzLDEsMCwxLDEsMywzLDIsMCwxLDEsMiwzLDEsMCwyLDIsMSwwLDAsMSwzLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywyLDEsMywzLDMsMywzLDEsMiwzLDIsMywzLDIsMSwxLDMsMiwzLDIsMSwyLDIsMCwxLDIsMSwwLDAsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMiwyLDIsMiwzLDEsMiwyLDEsMSwzLDMsMCwzLDIsMSwyLDMsMiwxLDMsMywxLDEsMCwyLDEsMywKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDIsMiwzLDIsMywzLDMsMiwxLDEsMywzLDEsMSwxLDIsMiwzLDIsMywyLDIsMiwxLDAsMiwyLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMywzLDMsMywzLDAsMCwzLDMsMiwzLDAsMCwwLDIsMywzLDEsMCwxLDIsMCwwLDEsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwyLDMsMywzLDMsMywxLDIsMywzLDIsMiwxLDEsMCwzLDMsMiwyLDEsMiwyLDEsMCwyLDIsMCwxLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwyLDEsMywxLDIsMywzLDIsMiwxLDEsMiwyLDEsMSwxLDEsMywyLDEsMSwxLDEsMiwxLDAsMSwyLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMSwxLDEsMSwxLDMsMywzLDAsMSwxLDMsMywxLDEsMSwxLDEsMiwyLDAsMywxLDEsMiwwLDIsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMSwwLDEsMiwxLDIsMiwwLDEsMiwzLDEsMiwwLDAsMCwyLDEsMSwxLDEsMSwyLDAsMCwxLDEsMCwwLDAsMCwKMSwyLDEsMiwyLDIsMSwyLDEsMiwwLDIsMCwyLDIsMSwxLDIsMSwxLDIsMSwxLDEsMCwxLDAsMCwwLDEsMSwwLAoxLDEsMSwyLDMsMiwzLDMsMCwxLDIsMiwzLDEsMCwxLDAsMiwxLDIsMiwwLDEsMSwwLDAsMSwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMywzLDIsMiwxLDAsMCwzLDIsMywyLDAsMCwwLDEsMSwzLDAsMCwxLDEsMCwwLDIsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDIsMiwzLDMsMSwwLDEsMywyLDMsMSwxLDEsMCwxLDEsMSwxLDEsMywxLDAsMCwyLDIsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMSwxLDIsMiwyLDEsMCwxLDIsMywzLDIsMCwwLDAsMiwxLDEsMSwyLDEsMSwxLDAsMSwxLDEsMCwwLDAsCjEsMiwyLDIsMiwyLDEsMSwxLDIsMCwyLDEsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDAsMSwxLDEsMCwwLDEsMSwKMywyLDIsMSwwLDAsMSwxLDIsMiwwLDMsMCwxLDIsMSwxLDAsMCwxLDEsMSwwLDEsMSwxLDEsMCwyLDEsMSwxLAoyLDIsMSwxLDEsMiwxLDIsMSwxLDEsMSwxLDEsMSwyLDEsMSwxLDIsMywxLDEsMSwxLDEsMSwxLDEsMSwwLDEsCjIsMywzLDAsMSwwLDAsMCwzLDMsMSwwLDAsMSwyLDIsMSwwLDAsMCwwLDIsMCwwLDEsMSwxLDAsMiwxLDEsMSwKMiwxLDEsMSwxLDEsMSwyLDEsMSwwLDEsMSwwLDEsMSwxLDAsMSwyLDEsMSwwLDEsMSwxLDEsMSwxLDEsMCwxLAoyLDMsMywwLDEsMCwwLDAsMiwyLDAsMCwwLDAsMSwyLDIsMCwwLDAsMCwxLDAsMCwxLDEsMCwwLDIsMCwxLDAsCjIsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLDEsMSwyLDAsMSwxLDEsMSwxLDAsMSwKMywyLDIsMCwxLDAsMSwwLDIsMywyLDAsMCwxLDIsMiwxLDAsMCwxLDEsMSwwLDAsMiwxLDAsMSwyLDIsMSwxLAoyLDEsMSwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMCwyLDEsMCwxLDEsMCwxLDEsMSwwLDEsMSwyLDEsMSwwLDEsCjIsMiwyLDAsMCwxLDAsMCwyLDIsMSwxLDAsMCwyLDEsMSwwLDAsMCwxLDIsMCwwLDIsMSwwLDAsMiwxLDEsMSwKMiwxLDEsMSwxLDIsMSwyLDEsMSwxLDIsMiwxLDEsMiwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLAoxLDIsMywwLDAsMCwxLDAsMywyLDEsMCwwLDEsMiwxLDEsMCwwLDAsMCwyLDEsMCwxLDEsMCwwLDIsMSwyLDEsCjEsMSwwLDAsMCwxLDAsMSwxLDEsMSwxLDIsMCwwLDEsMCwwLDAsMiwwLDAsMSwxLDEsMSwxLDEsMSwxLDAsMSwKMywwLDAsMiwxLDIsMiwxLDAsMCwyLDEsMiwyLDAsMCwwLDIsMSwxLDEsMCwxLDEsMCwwLDEsMSwyLDAsMCwwLAoxLDIsMSwyLDIsMSwxLDIsMSwyLDAsMSwxLDEsMSwxLDEsMSwxLDEsMiwxLDEsMCwwLDEsMSwxLDEsMCwwLDEsCjEsMywyLDAsMCwwLDEsMCwyLDIsMiwwLDAsMCwyLDIsMSwwLDAsMCwwLDMsMSwxLDEsMSwwLDAsMiwxLDEsMSwKMiwxLDAsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDAsMiwxLDAsMCwxLDAsMSwxLDAsMSwxLDEsMSwxLDEsMCwxLAoyLDMsMiwwLDAsMCwxLDAsMiwyLDAsMCwwLDAsMiwxLDEsMCwwLDAsMCwyLDEsMCwxLDEsMCwwLDIsMSwxLDAsCjIsMSwxLDEsMSwyLDEsMiwxLDIsMCwxLDEsMSwwLDIsMSwxLDEsMiwxLDEsMSwxLDAsMSwxLDEsMSwxLDAsMSwKMywxLDEsMiwyLDIsMywyLDEsMSwyLDIsMSwxLDAsMSwwLDIsMiwxLDEsMSwxLDEsMCwwLDEsMSwwLDEsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDAsMCwwLDAsMCwyLDIsMCwwLDAsMCwyLDIsMSwwLDAsMCwxLDEsMCwwLDEsMiwwLDAsMiwxLDEsMSwKMiwyLDEsMSwxLDIsMSwyLDEsMSwwLDEsMSwxLDEsMiwxLDEsMSwyLDEsMSwxLDEsMCwxLDIsMSwxLDEsMCwxLAoxLDAsMCwxLDIsMywyLDEsMCwwLDIsMCwxLDEsMCwwLDAsMSwxLDEsMSwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsCjEsMiwxLDIsMSwyLDEsMSwxLDIsMCwyLDEsMSwxLDAsMSwyLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDIsMCwwLDAsMCwwLDEsMSwyLDEsMCwwLDEsMSwxLDAsMCwwLDAsMiwwLDAsMSwxLDAsMCwyLDEsMSwxLAoyLDEsMSwxLDEsMSwxLDIsMSwwLDEsMSwxLDEsMCwyLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwxLDEsMSwwLDEsCjEsMiwyLDAsMSwxLDEsMCwyLDIsMiwwLDAsMCwzLDIsMSwwLDAsMCwxLDEsMCwwLDEsMSwwLDEsMSwxLDAsMCwKMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwyLDEsMSwxLDAsMCwxLDEsMSwwLDEsMCwxLAoyLDEsMCwyLDEsMSwyLDIsMSwxLDIsMSwxLDEsMCwwLDAsMSwxLDAsMSwxLDEsMSwwLDAsMSwxLDEsMCwwLDAsCjEsMiwyLDIsMiwyLDEsMSwxLDIsMCwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMCwwLDEsMCwKMSwyLDMsMCwwLDAsMSwwLDIsMiwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwyLDAsMSwwLAoyLDEsMSwxLDEsMSwwLDIsMCwwLDAsMSwyLDEsMSwxLDEsMCwxLDIsMCwxLDAsMSwwLDEsMSwxLDAsMSwwLDEsCjIsMiwyLDAsMCwwLDEsMCwyLDEsMiwwLDAsMCwxLDEsMiwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMiwxLDAsMSwKMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDIsMCwxLDEsMSwxLDEsMCwxLAoxLDIsMiwwLDAsMCwxLDAsMiwyLDIsMCwwLDAsMSwxLDAsMCwwLDAsMCwxLDEsMCwyLDAsMCwxLDEsMSwwLDEsCjEsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMCwwLDEsMCwwLDEsMSwwLDEsMCwxLDEsMSwxLDEsMCwwLDAsMSwKMSwwLDAsMSwwLDEsMiwxLDAsMCwxLDEsMSwyLDAsMCwwLDEsMSwwLDEsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLAowLDIsMSwyLDEsMSwxLDEsMSwyLDAsMiwwLDEsMSwwLDEsMiwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsCjIsMSwxLDAsMSwyLDAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMiwxLDAsMSwKMiwyLDEsMSwxLDEsMSwyLDEsMSwwLDEsMSwxLDEsMiwxLDEsMSwyLDEsMSwwLDEsMCwxLDEsMSwxLDEsMCwxLAoxLDIsMiwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMiwxLDAsMCwwLDAsMCwyLDAsMCwyLDIsMCwwLDIsMCwwLDEsCjIsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMSwwLDEsMCwwLDAsMSwxLDEsMSwwLDAsMSwxLDEsMSwwLDAsMSwKMSwxLDIsMCwwLDMsMSwwLDIsMSwxLDEsMCwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMCwxLDAsMCwxLDAsMSwwLAoxLDIsMSwwLDEsMSwxLDIsMSwxLDAsMSwxLDEsMSwxLDAsMCwwLDEsMSwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsCjIsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMiwwLDAsMCwKMiwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDIsMSwxLDAsMCwxLDEsMSwxLDEsMCwxLAoyLDEsMSwxLDIsMSwxLDEsMCwxLDEsMiwxLDAsMCwwLDAsMSwxLDEsMSwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwxLDAsMSwxLDEsMSwxLDAsMCwxLDEsMiwxLDAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDEsMCwxLDAsMCwwLAoxLDIsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwxLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsCjIsMCwwLDAsMSwxLDEsMSwwLDAsMSwxLDAsMCwwLDAsMCwxLDEsMSwyLDAsMCwxLDAsMCwxLDAsMSwwLDAsMCwKMCwxLDEsMSwxLDEsMSwxLDEsMiwwLDEsMSwxLDEsMCwxLDEsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDEsMSwxLDEsMCwwLDIsMSwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsCjAsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDAsMSwxLDAsMSwxLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwxLDEsMCwwLDAsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAowLDEsMSwxLDEsMSwwLDAsMSwxLDAsMSwwLDEsMCwwLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDEsMCwwLDAsMCwwLDAsMSwxLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwxLDEsMSwwLDEsMCwwLDEsMSwwLDEsMCwxLDEsMCwxLDEsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDAsMCwxLDAsMCwxLDAsMSwwLDEsMSwxLDAsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwxLDEsMSwwLDAsMCwxLDEsMSwwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwwLDEsMCwwLDEsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCikKCkxhdGluMkh1bmdhcmlhbk1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IExhdGluMl9IdW5nYXJpYW5DaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBIdW5nYXJpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk0NzM2OCwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IFRydWUsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJU08tODg1OS0yIiwKICAnbGFuZ3VhZ2UnOiAnSHVuZ2FyaWFuJywKfQoKV2luMTI1MEh1bmdhcmlhbk1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IHdpbjEyNTBIdW5nYXJpYW5DaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBIdW5nYXJpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk0NzM2OCwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IFRydWUsCiAgJ2NoYXJzZXRfbmFtZSc6ICJ3aW5kb3dzLTEyNTAiLAogICdsYW5ndWFnZSc6ICdIdW5nYXJpYW4nLAp9ClBLAwQUAAAAAAAAACEAIg/SPxosAAAaLAAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndGhhaW1vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBUaGUgZm9sbG93aW5nIHJlc3VsdCBmb3IgdGhhaSB3YXMgY29sbGVjdGVkIGZyb20gYSBsaW1pdGVkIHNhbXBsZSAoMU0pLgoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKVElTNjIwQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE4MiwxMDYsMTA3LDEwMCwxODMsMTg0LDE4NSwxMDEsIDk0LDE4NiwxODcsMTA4LDEwOSwxMTAsMTExLCAgIyA0MAoxODgsMTg5LDE5MCwgODksIDk1LDExMiwxMTMsMTkxLDE5MiwxOTMsMTk0LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNjQsIDcyLCA3MywxMTQsIDc0LDExNSwxMTYsMTAyLCA4MSwyMDEsMTE3LCA5MCwxMDMsIDc4LCA4MiwgICMgNjAKIDk2LDIwMiwgOTEsIDc5LCA4NCwxMDQsMTA1LCA5NywgOTgsIDkyLDIwMywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoyMDksMjEwLDIxMSwyMTIsMjEzLCA4OCwyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMTE4LDIyMSwyMjIsCjIyMywyMjQsIDk5LCA4NSwgODMsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwKMjM2LCAgNSwgMzAsMjM3LCAyNCwyMzgsIDc1LCAgOCwgMjYsIDUyLCAzNCwgNTEsMTE5LCA0NywgNTgsIDU3LAogNDksIDUzLCA1NSwgNDMsIDIwLCAxOSwgNDQsIDE0LCA0OCwgIDMsIDE3LCAyNSwgMzksIDYyLCAzMSwgNTQsCiA0NSwgIDksIDE2LCAgMiwgNjEsIDE1LDIzOSwgMTIsIDQyLCA0NiwgMTgsIDIxLCA3NiwgIDQsIDY2LCA2MywKIDIyLCAxMCwgIDEsIDM2LCAyMywgMTMsIDQwLCAyNywgMzIsIDM1LCA4NiwyNDAsMjQxLDI0MiwyNDMsMjQ0LAogMTEsIDI4LCA0MSwgMjksIDMzLDI0NSwgNTAsIDM3LCAgNiwgIDcsIDY3LCA3NywgMzgsIDkzLDI0NiwyNDcsCiA2OCwgNTYsIDU5LCA2NSwgNjksIDYwLCA3MCwgODAsIDcxLCA4NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5Mi42Mzg2JQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOjcuMzE3NyUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAxLjAyMzAlCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgMC4wNDM2JQpUaGFpTGFuZ01vZGVsID0gKAowLDEsMywzLDMsMywwLDAsMywzLDAsMywzLDAsMywzLDMsMywzLDMsMywzLDAsMCwzLDMsMywwLDMsMywzLDMsCjAsMywzLDAsMCwwLDEsMywwLDMsMywyLDMsMywwLDEsMiwzLDMsMywzLDAsMiwwLDIsMCwwLDMsMiwxLDIsMiwKMywwLDMsMywyLDMsMCwwLDMsMywwLDMsMywwLDMsMywzLDMsMywzLDMsMywzLDAsMywyLDMsMCwyLDIsMiwzLAowLDIsMywwLDAsMCwwLDEsMCwxLDIsMywxLDEsMywyLDIsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsCjMsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsMywzLDIsMywyLDMsMywyLDIsMiwKMywxLDIsMywwLDMsMywyLDIsMSwyLDMsMywxLDIsMCwxLDMsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwxLAozLDMsMiwyLDMsMywzLDMsMSwyLDMsMywzLDMsMywyLDIsMiwyLDMsMywyLDIsMywzLDIsMiwzLDIsMywyLDIsCjMsMywxLDIsMywxLDIsMiwzLDMsMSwwLDIsMSwwLDAsMywxLDIsMSwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMSwKMywzLDMsMywzLDMsMiwyLDMsMywzLDMsMiwzLDIsMiwzLDMsMiwyLDMsMiwyLDIsMiwxLDEsMywxLDIsMSwxLAozLDIsMSwwLDIsMSwwLDEsMCwxLDEsMCwxLDEsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMywyLDMsMywyLDIsMywyLDMsMywyLDMsMSwxLDIsMywyLDIsMiwzLDIsMiwyLDIsMiwxLDIsMSwKMiwyLDEsMSwzLDMsMiwxLDAsMSwyLDIsMCwxLDMsMCwwLDAsMSwxLDAsMCwwLDAsMCwyLDMsMCwwLDIsMSwxLAozLDMsMiwzLDMsMiwwLDAsMywzLDAsMywzLDAsMiwyLDMsMSwyLDIsMSwxLDEsMCwyLDIsMiwwLDIsMiwxLDEsCjAsMiwxLDAsMiwwLDAsMiwwLDEsMCwwLDEsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDIsMywzLDIsMCwwLDMsMywwLDIsMywwLDIsMSwyLDIsMiwyLDEsMiwwLDAsMiwyLDIsMCwyLDIsMSwxLAowLDIsMSwwLDIsMCwwLDIsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDMsMiwzLDIsMCwyLDIsMSwzLDIsMSwzLDIsMSwyLDMsMiwyLDMsMCwyLDMsMiwyLDEsMiwyLDIsMiwKMSwyLDIsMCwwLDAsMCwyLDAsMSwyLDAsMSwxLDEsMCwxLDAsMywxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMiwzLDMsMiwzLDIsMiwyLDMsMiwyLDMsMiwyLDEsMiwzLDIsMiwzLDEsMywyLDIsMiwzLDIsMiwyLDMsCjMsMiwxLDMsMCwxLDEsMSwwLDIsMSwxLDEsMSwxLDAsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwKMSwwLDAsMywwLDMsMywzLDMsMywwLDAsMywwLDIsMiwzLDMsMywzLDMsMCwwLDAsMSwxLDMsMCwwLDAsMCwyLAowLDAsMSwwLDAsMCwwLDAsMCwwLDIsMywwLDAsMCwzLDAsMiwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsCjIsMCwzLDMsMywzLDAsMCwyLDMsMCwwLDMsMCwzLDMsMiwzLDMsMywzLDMsMCwwLDMsMywzLDAsMCwwLDMsMywKMCwwLDMsMCwwLDAsMCwyLDAsMCwyLDEsMSwzLDAsMCwxLDAsMCwyLDMsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDIsMywzLDMsMywzLDMsMywxLDIsMSwzLDMsMiwyLDEsMiwyLDIsMywxLDEsMiwwLDIsMSwyLDEsCjIsMiwxLDAsMCwwLDEsMSwwLDEsMCwxLDEsMCwwLDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDIsMSwyLDMsMywzLDAsMiwwLDIsMiwwLDIsMSwzLDIsMiwxLDIsMSwwLDAsMiwyLDEsMCwyLDEsMiwyLAowLDEsMSwwLDAsMCwwLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMiwxLDMsMywxLDEsMywwLDIsMywxLDEsMywyLDEsMSwyLDAsMiwyLDMsMiwxLDEsMSwxLDEsMiwKMywwLDAsMSwzLDEsMiwxLDIsMCwzLDAsMCwwLDEsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLAozLDMsMSwxLDMsMiwzLDMsMywxLDMsMiwxLDMsMiwxLDMsMiwyLDIsMiwxLDMsMywxLDIsMSwzLDEsMiwzLDAsCjIsMSwxLDMsMiwyLDIsMSwyLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwKMywzLDIsMywyLDMsMywyLDMsMiwzLDIsMywzLDIsMSwwLDMsMiwyLDIsMSwyLDIsMiwxLDIsMiwxLDIsMSwxLAoyLDIsMiwzLDAsMSwzLDEsMSwxLDEsMCwxLDEsMCwyLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMiwzLDIsMiwxLDEsMywyLDMsMiwzLDIsMCwzLDIsMiwxLDIsMCwyLDIsMiwxLDIsMiwyLDIsMSwKMywyLDEsMiwyLDEsMCwyLDAsMSwwLDAsMSwxLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMiwzLDEsMiwzLDMsMiwyLDMsMCwxLDEsMiwwLDMsMywyLDIsMywwLDEsMSwzLDAsMCwwLDAsCjMsMSwwLDMsMywwLDIsMCwyLDEsMCwwLDMsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwzLDIsMywzLDAsMSwzLDEsMSwyLDEsMiwxLDEsMywxLDEsMCwyLDMsMSwxLDEsMSwxLDEsMSwxLAozLDEsMSwyLDIsMiwyLDEsMSwxLDAsMCwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMiwyLDEsMSwyLDEsMywzLDIsMywyLDIsMywyLDIsMywxLDIsMiwxLDIsMCwzLDIsMSwyLDIsMiwyLDIsMSwKMywyLDEsMiwyLDIsMSwxLDEsMSwwLDAsMSwxLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMSwzLDMsMCwyLDEsMCwzLDIsMCwwLDMsMSwwLDEsMSwwLDEsMCwwLDAsMCwwLDEsCjEsMCwwLDEsMCwzLDIsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDIsMiwyLDMsMCwwLDEsMywwLDMsMiwwLDMsMiwyLDMsMywzLDMsMywxLDAsMiwyLDIsMCwyLDIsMSwyLAowLDIsMywwLDAsMCwwLDEsMCwxLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMCwyLDMsMSwzLDMsMiwzLDMsMCwzLDMsMCwzLDIsMiwzLDIsMywzLDMsMCwwLDIsMiwzLDAsMSwxLDEsMywKMCwwLDMsMCwwLDAsMiwyLDAsMSwzLDAsMSwyLDIsMiwzLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLAozLDIsMywzLDIsMCwzLDMsMiwyLDMsMSwzLDIsMSwzLDIsMCwxLDIsMiwwLDIsMywyLDEsMCwzLDAsMCwwLDAsCjMsMCwwLDIsMywxLDMsMCwwLDMsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDMsMiwyLDIsMSwyLDAsMSwzLDEsMSwzLDEsMywwLDAsMiwxLDEsMSwxLDIsMSwxLDEsMCwyLDEsMCwxLAoxLDIsMCwwLDAsMywxLDEsMCwwLDAsMCwxLDAsMSwwLDAsMSwwLDEsMCwwLDAsMCwwLDMsMSwwLDAsMCwxLDAsCjMsMywzLDMsMiwyLDIsMiwyLDEsMywxLDEsMSwyLDAsMSwxLDIsMSwyLDEsMywyLDAsMCwzLDEsMSwxLDEsMSwKMywxLDAsMiwzLDAsMCwwLDMsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwyLDMsMCwzLDMsMCwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDIsMywxLDMsMCwwLDEsMiwwLDAsMiwwLDMsMywyLDMsMywzLDIsMywwLDAsMiwyLDIsMCwwLDAsMiwyLAowLDAsMSwwLDAsMCwwLDMsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDMsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwyLDMsMSwzLDMsMCwwLDEsMCwzLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMSwyLDMsMSwyLDMsMSwwLDMsMCwyLDIsMSwwLDIsMSwxLDIsMCwxLDAsMCwxLDEsMSwxLDAsMSwwLDAsCjEsMCwwLDAsMCwxLDEsMCwzLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywyLDEsMCwxLDEsMSwzLDEsMiwyLDIsMiwyLDIsMSwxLDEsMSwwLDMsMSwwLDEsMywxLDEsMSwxLAoxLDEsMCwyLDAsMSwzLDEsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDEsCjMsMCwyLDIsMSwzLDMsMiwzLDMsMCwxLDEsMCwyLDIsMSwyLDEsMywzLDEsMCwwLDMsMiwwLDAsMCwwLDIsMSwKMCwxLDAsMCwwLDAsMSwyLDAsMSwxLDMsMSwxLDIsMiwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywwLDAsMSwwLDAsMCwzLDAsMCwzLDAsMywxLDAsMSwxLDEsMywyLDAsMCwwLDMsMCwwLDAsMCwyLDAsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDEsMywyLDEsMywzLDEsMiwyLDAsMSwyLDEsMCwxLDIsMCwwLDAsMCwwLDMsMCwwLDAsMywwLDAsMCwwLAozLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwxLDIsMCwzLDMsMywyLDIsMCwxLDEsMCwxLDMsMCwwLDAsMiwyLDAsMCwwLDAsMywxLDAsMSwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMiwzLDEsMiwwLDAsMiwxLDAsMywxLDAsMSwyLDAsMSwxLDEsMSwzLDAsMCwzLDEsMSwwLDIsMiwxLDEsCjAsMiwwLDAsMCwwLDAsMSwwLDEsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDAsMywxLDIsMCwwLDIsMiwwLDEsMiwwLDEsMCwxLDMsMSwyLDEsMCwwLDAsMiwwLDMsMCwwLDAsMSwwLAowLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwxLDEsMiwyLDAsMCwwLDIsMCwyLDEsMCwxLDEsMCwxLDEsMSwyLDEsMCwwLDEsMSwxLDAsMiwxLDEsMSwKMCwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLAowLDAsMCwyLDAsMSwzLDEsMSwxLDEsMCwwLDAsMCwzLDIsMCwxLDAsMCwwLDEsMiwwLDAsMCwxLDAsMCwwLDAsCjAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDMsMywzLDMsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwyLDMsMiwyLDAsMCwwLDEsMCwwLDAsMCwyLDMsMiwxLDIsMiwzLDAsMCwwLDIsMywxLDAsMCwwLDEsMSwKMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwyLDAsMSwwLDAsMCwwLDIsMCwyLDAsMSwwLDAsMCwxLDEsMCwwLDAsMiwxLDAsMSwwLDEsMSwwLDAsCjAsMSwwLDIsMCwwLDEsMCwzLDAsMSwwLDAsMCwyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDEsMCwwLDEsMCwwLDAsMCwwLDEsMSwyLDAsMCwwLDAsMSwwLDAsMSwzLDEsMCwwLDAsMCwxLDEsMCwwLAowLDEsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywxLDEsMSwxLDIsMywwLDAsMiwxLDEsMSwxLDEsMCwyLDEsMSwwLDAsMCwyLDEsMCwxLDIsMSwxLDAsMSwKMiwxLDAsMywwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDMsMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDEsCjAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMCwwLDAsMCwwLDAsMSwyLDEsMCwxLDEsMCwyLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwyLDAsMCwwLDEsMywwLDEsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDEsMiwwLDAsMCwwLDAsCjMsMywwLDAsMSwxLDIsMCwwLDEsMiwxLDAsMSwxLDEsMCwxLDEsMCwwLDIsMSwxLDAsMSwwLDAsMSwxLDEsMCwKMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwxLDAsMCwwLDAsMSwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDAsMCwxLDEsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDEsMCwxLDIsMCwxLDIsMCwwLDEsMSwwLDIsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDAsCjEsMCwwLDEsMCwxLDEsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMSwxLDAsMiwxLDMsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwzLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMSwwLDEsMCwwLDIsMCwwLDIsMCwwLDEsMSwyLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsCjEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwxLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwzLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDIsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwxLDEsMCwwLDIsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKQoKVElTNjIwVGhhaU1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IFRJUzYyMENoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFRoYWlMYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjkyNjM4NiwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiVElTLTYyMCIsCiAgJ2xhbmd1YWdlJzogJ1RoYWknLAp9ClBLAwQUAAAAAAAAACEAtTLDZF4rAABeKwAARAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndHVya2lzaG1vZGVsLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgw5Z6Z8O8ciBCYXNrxLFuIC0gVHVya2lzaCBMYW5ndWFnZSBNb2RlbAojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKTGF0aW41X1R1cmtpc2hDaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAoyNTUsIDIzLCAzNywgNDcsIDM5LCAyOSwgNTIsIDM2LCA0NSwgNTMsIDYwLCAxNiwgNDksIDIwLCA0NiwgNDIsCiA0OCwgNjksIDQ0LCAzNSwgMzEsIDUxLCAzOCwgNjIsIDY1LCA0MywgNTYsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMjU1LCAgMSwgMjEsIDI4LCAxMiwgIDIsIDE4LCAyNywgMjUsICAzLCAyNCwgMTAsICA1LCAxMywgIDQsIDE1LAogMjYsIDY0LCAgNywgIDgsICA5LCAxNCwgMzIsIDU3LCA1OCwgMTEsIDIyLDI1NSwyNTUsMjU1LDI1NSwyNTUsCjE4MCwxNzksMTc4LDE3NywxNzYsMTc1LDE3NCwxNzMsMTcyLDE3MSwxNzAsMTY5LDE2OCwxNjcsMTY2LDE2NSwKMTY0LDE2MywxNjIsMTYxLDE2MCwxNTksMTAxLDE1OCwxNTcsMTU2LDE1NSwxNTQsMTUzLDE1MiwxNTEsMTA2LAoxNTAsMTQ5LDE0OCwxNDcsMTQ2LDE0NSwxNDQsMTAwLDE0MywxNDIsMTQxLDE0MCwxMzksMTM4LDEzNywxMzYsCiA5NCwgODAsIDkzLDEzNSwxMDUsMTM0LDEzMywgNjMsMTMyLDEzMSwxMzAsMTI5LDEyOCwxMjcsMTI2LDEyNSwKMTI0LDEwNCwgNzMsIDk5LCA3OSwgODUsMTIzLCA1NCwxMjIsIDk4LCA5MiwxMjEsMTIwLCA5MSwxMDMsMTE5LAogNjgsMTE4LDExNywgOTcsMTE2LDExNSwgNTAsIDkwLDExNCwxMTMsMTEyLDExMSwgNTUsIDQxLCA0MCwgODYsCiA4OSwgNzAsIDU5LCA3OCwgNzEsIDgyLCA4OCwgMzMsIDc3LCA2NiwgODQsIDgzLDExMCwgNzUsIDYxLCA5NiwKIDMwLCA2NywxMDksIDc0LCA4NywxMDIsIDM0LCA5NSwgODEsMTA4LCA3NiwgNzIsIDE3LCAgNiwgMTksMTA3LAopCgpUdXJraXNoTGFuZ01vZGVsID0gKAozLDIsMywzLDMsMSwzLDMsMywzLDMsMywzLDMsMiwxLDEsMywzLDEsMywzLDAsMywzLDMsMywzLDAsMywxLDMsCjMsMiwxLDAsMCwxLDEsMCwwLDAsMSwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDIsMiwwLDAsMSwwLDAsMSwKMywyLDIsMywzLDAsMywzLDMsMywzLDMsMywyLDMsMSwwLDMsMywxLDMsMywwLDMsMywzLDMsMywwLDMsMCwzLAozLDEsMSwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMSwwLDEsCjMsMywyLDMsMywwLDMsMywzLDMsMywzLDMsMiwzLDEsMSwzLDMsMCwzLDMsMSwyLDMsMywzLDMsMCwzLDAsMywKMywxLDEsMCwwLDAsMSwwLDAsMCwwLDEsMSwwLDEsMiwxLDAsMCwwLDEsMCwwLDAsMCwyLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMywxLDMsMywyLDAsMywyLDEsMiwyLDEsMywzLDAsMCwwLDIsCjIsMiwwLDEsMCwwLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDAsMSwwLDAsMSwKMywzLDMsMiwzLDMsMSwyLDMsMywzLDMsMywzLDMsMSwzLDIsMSwwLDMsMiwwLDEsMiwzLDMsMiwxLDAsMCwyLAoyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDIsMCwwLDAsCjEsMCwxLDMsMywxLDMsMywzLDMsMywzLDMsMSwyLDAsMCwyLDMsMCwyLDMsMCwwLDIsMiwyLDMsMCwzLDAsMSwKMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMywzLDAsMywyLDAsMiwzLDIsMywzLDEsMCwwLDIsCjMsMiwwLDAsMSwwLDAsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDAsMiwwLDAsMSwKMywzLDMsMiwzLDMsMiwzLDMsMywzLDIsMywzLDMsMCwzLDMsMCwwLDIsMSwwLDAsMiwzLDIsMiwwLDAsMCwyLAoyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwxLDAsMSwwLDIsMCwwLDEsCjMsMywzLDIsMywzLDMsMywzLDMsMywyLDMsMywzLDAsMywyLDAsMSwzLDIsMSwxLDMsMiwzLDIsMSwwLDAsMiwKMiwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLAozLDMsMywyLDMsMywzLDMsMywzLDMsMiwzLDMsMywwLDMsMiwyLDAsMiwzLDAsMCwyLDIsMiwyLDAsMCwwLDIsCjMsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDAsMSwwLDAsMCwKMywzLDMsMywzLDMsMywyLDIsMiwyLDMsMiwzLDMsMCwzLDMsMSwxLDIsMiwwLDAsMiwyLDMsMiwwLDAsMSwzLAowLDMsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDEsCjMsMywzLDIsMywzLDMsMiwxLDIsMiwzLDIsMywzLDAsMywyLDAsMCwxLDEsMCwxLDEsMiwxLDIsMCwwLDAsMSwKMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwxLDAsMCwwLAozLDMsMywyLDMsMywyLDMsMiwyLDIsMywzLDMsMywxLDMsMSwxLDAsMywyLDEsMSwzLDMsMiwzLDEsMCwwLDEsCjEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMiwwLDAsMSwKMywyLDIsMywzLDAsMywzLDMsMywzLDMsMywyLDIsMSwwLDMsMywxLDMsMywwLDEsMywzLDIsMywwLDMsMCwzLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjIsMiwyLDMsMywwLDMsMywzLDMsMywzLDMsMywzLDAsMCwzLDIsMCwzLDMsMCwzLDIsMywzLDMsMCwzLDEsMywKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDIsMCwxLDAsMCwwLDAsMCwwLDAsMiwyLDAsMCwxLDAsMCwxLAozLDMsMywxLDIsMywzLDEsMCwwLDEsMCwwLDMsMywyLDMsMCwwLDIsMCwwLDIsMCwyLDAsMCwwLDIsMCwyLDAsCjAsMywxLDAsMSwwLDAsMCwyLDIsMSwwLDEsMSwyLDEsMiwyLDIsMCwyLDEsMSwwLDAsMCwyLDAsMCwwLDAsMCwKMSwyLDEsMywzLDAsMywzLDMsMywzLDIsMywwLDAsMCwwLDIsMywwLDIsMywxLDAsMiwzLDEsMywwLDMsMCwyLAozLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDEsMywzLDIsMiwzLDIsMiwwLDEsMiwzLDAsMSwyLDEsMCwxLDAsMCwwLDEsMCwyLDIsMCwwLDAsMSwKMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLAozLDMsMywxLDMsMywxLDEsMywzLDEsMSwzLDMsMSwwLDIsMSwyLDAsMiwxLDAsMCwxLDEsMiwxLDAsMCwwLDIsCjIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwwLDIsMSwzLDAsMCwyLDAsMCwzLDMsMCwzLDAsMCwxLDAsMSwyLDAsMCwxLDEsMiwyLDAsMSwwLAowLDEsMiwxLDEsMCwxLDAsMSwxLDEsMSwxLDAsMSwxLDEsMiwyLDEsMiwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsCjMsMywzLDIsMywyLDMsMywwLDIsMiwyLDMsMywzLDAsMywwLDAsMCwyLDIsMCwxLDIsMSwxLDEsMCwwLDAsMSwKMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAozLDMsMywzLDMsMywyLDEsMiwyLDMsMywzLDMsMiwwLDIsMCwwLDAsMiwyLDAsMCwyLDEsMywzLDAsMCwxLDEsCjEsMSwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwKMSwxLDIsMywzLDAsMywzLDMsMywzLDMsMiwyLDAsMiwwLDIsMywyLDMsMiwyLDIsMiwyLDIsMiwxLDMsMiwzLAoyLDAsMiwxLDIsMiwyLDIsMSwxLDIsMiwxLDIsMiwxLDIsMCwwLDIsMSwxLDAsMiwxLDAsMCwxLDAsMCwwLDEsCjIsMywzLDEsMSwxLDAsMSwxLDEsMiwzLDIsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwKMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDIsMiwzLDIsMywyLDIsMSwzLDMsMywwLDIsMSwyLDAsMiwxLDAsMCwxLDEsMSwxLDEsMCwwLDEsCjIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwyLDAsMSwwLDAsMCwKMywzLDMsMiwzLDMsMywzLDMsMiwzLDEsMiwzLDMsMSwyLDAsMCwwLDAsMCwwLDAsMywyLDEsMSwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwzLDMsMiwxLDEsMSwxLDEsMywzLDAsMywxLDAsMCwxLDEsMCwwLDMsMSwyLDEsMCwwLDAsMCwKMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLAozLDMsMywyLDIsMywyLDIsMiwzLDIsMSwxLDMsMywwLDMsMCwwLDAsMCwxLDAsMCwzLDEsMSwyLDAsMCwwLDEsCjEsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMSwxLDEsMywzLDAsMywzLDMsMywzLDIsMiwyLDEsMiwwLDIsMSwyLDIsMSwxLDAsMSwyLDIsMiwyLDIsMiwyLAowLDAsMiwxLDIsMSwyLDEsMCwxLDEsMywxLDIsMSwxLDIsMCwwLDIsMCwxLDAsMSwwLDEsMCwwLDAsMSwwLDEsCjMsMywzLDEsMywzLDMsMCwxLDEsMCwyLDIsMywxLDAsMywwLDAsMCwxLDAsMCwwLDEsMCwwLDEsMCwxLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwwLDAsMiwyLDEsMCwwLDEsMCwwLDMsMywxLDMsMCwwLDEsMSwwLDIsMCwzLDAsMCwwLDIsMCwxLDEsCjAsMSwyLDAsMSwyLDIsMCwyLDIsMiwyLDEsMCwyLDEsMSwwLDIsMCwyLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwzLDIsMywyLDAsMiwyLDIsMSwzLDIsMCwyLDEsMiwwLDEsMiwwLDAsMSwwLDIsMiwwLDAsMCwyLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDAsCjMsMywzLDAsMywzLDEsMSwyLDMsMSwwLDMsMiwzLDAsMywwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwKMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwzLDMsMCwzLDMsMiwzLDMsMiwyLDAsMCwwLDAsMSwyLDAsMSwzLDAsMCwwLDMsMSwxLDAsMywwLDIsCjIsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwyLDIsMSwwLDMsMSwxLDEsMSwzLDMsMiwzLDAsMCwxLDAsMSwyLDAsMiwyLDAsMiwyLDAsMiwxLAowLDIsMiwxLDEsMSwxLDAsMiwxLDEsMCwxLDEsMSwxLDIsMSwyLDEsMiwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDAsMSwxLDMsMCwwLDEsMSwwLDAsMiwyLDAsMywwLDAsMSwxLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwKMCwzLDEsMCwxLDAsMSwwLDIsMCwwLDEsMCwxLDAsMSwxLDEsMiwxLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywwLDIsMCwyLDAsMSwxLDEsMCwwLDMsMywwLDIsMCwwLDEsMCwwLDIsMSwxLDAsMSwwLDEsMCwxLDAsCjAsMiwwLDEsMiwwLDIsMCwyLDEsMSwwLDEsMCwyLDEsMSwwLDIsMSwxLDAsMSwwLDAsMCwxLDEsMCwwLDAsMCwKMywyLDMsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDIsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLAowLDAsMSwxLDAsMCwxLDAsMSwwLDAsMSwwLDAsMCwyLDEsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDAsMCwyLDMsMCwwLDEsMCwxLDAsMiwzLDIsMywwLDAsMSwzLDAsMiwxLDAsMCwwLDAsMiwwLDEsMCwKMCwyLDEsMCwwLDEsMSwwLDIsMSwwLDAsMSwwLDAsMSwxLDAsMSwxLDIsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLAozLDIsMiwwLDAsMSwxLDAsMCwwLDAsMCwwLDMsMSwxLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDIsMCwxLDAsCjAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMywzLDAsMiwzLDIsMiwxLDIsMiwxLDEsMiwwLDEsMywyLDIsMiwwLDAsMiwyLDAsMCwwLDEsMiwxLAozLDAsMiwxLDEsMCwxLDEsMSwwLDEsMiwyLDIsMSwxLDIsMCwwLDAsMCwxLDAsMSwxLDAsMCwwLDAsMCwwLDAsCjAsMSwxLDIsMywwLDMsMywzLDIsMiwyLDIsMSwwLDEsMCwxLDAsMSwyLDIsMCwwLDIsMiwxLDMsMSwxLDIsMSwKMCwwLDEsMSwyLDAsMSwxLDAsMCwxLDIsMCwyLDEsMSwyLDAsMCwxLDAsMCwwLDEsMCwxLDAsMSwwLDAsMCwwLAozLDMsMiwwLDAsMywxLDAsMCwwLDAsMCwwLDMsMiwxLDIsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDIsMCwxLDAsCjAsMiwxLDEsMCwwLDEsMCwxLDIsMCwwLDEsMSwwLDAsMiwxLDEsMSwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMCwwLDEsMCwwLDAsMCwxLDAsMCwzLDMsMiwyLDAsMCwxLDAsMCwyLDAsMSwwLDAsMCwyLDAsMSwwLAowLDAsMSwxLDAsMCwyLDAsMiwxLDAsMCwxLDEsMiwxLDIsMCwyLDEsMiwxLDEsMSwwLDAsMSwxLDAsMCwwLDAsCjMsMywyLDAsMCwyLDIsMCwwLDAsMSwxLDAsMiwyLDEsMywxLDAsMSwwLDEsMiwwLDAsMCwwLDAsMSwwLDEsMCwKMCwxLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMSwxLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDAsMCwwLDEsMCwwLDEsMCwwLDIsMywxLDIsMCwwLDEsMCwwLDIsMCwwLDAsMSwwLDIsMCwyLDAsCjAsMSwxLDIsMiwxLDIsMCwyLDEsMSwwLDAsMSwxLDAsMSwxLDEsMSwyLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMCwyLDEsMiwxLDAsMCwxLDEsMCwzLDMsMSwyLDAsMCwxLDAsMCwyLDAsMiwwLDEsMSwyLDAsMCwwLAowLDAsMSwxLDEsMSwyLDAsMSwxLDAsMSwxLDEsMSwwLDAsMCwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsCjMsMywzLDAsMiwyLDMsMiwwLDAsMSwwLDAsMiwzLDEsMCwwLDAsMCwwLDAsMiwwLDIsMCwwLDAsMiwwLDAsMCwKMCwxLDEsMCwwLDAsMSwwLDAsMSwwLDEsMSwwLDEsMCwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywwLDAsMCwwLDAsMCwwLDEsMCwwLDIsMiwyLDIsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDIsMCwxLDAsCjAsMCwyLDEsMSwwLDEsMCwyLDEsMSwwLDAsMSwxLDIsMSwwLDIsMCwyLDAsMSwwLDAsMCwyLDAsMCwwLDAsMCwKMCwwLDAsMiwyLDAsMiwxLDEsMSwxLDIsMiwwLDAsMSwwLDEsMCwwLDEsMywwLDAsMCwwLDEsMCwwLDIsMSwwLAowLDAsMSwwLDEsMCwwLDAsMCwwLDIsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDIsMywwLDIsMywxLDIsMiwwLDIsMCwwLDIsMCwyLDEsMSwxLDIsMSwwLDAsMSwyLDEsMSwyLDEsMCwKMSwwLDIsMCwxLDAsMSwxLDAsMCwyLDIsMSwyLDEsMSwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywwLDIsMSwyLDAsMCwwLDEsMCwwLDMsMiwwLDEsMCwwLDEsMCwwLDIsMCwwLDAsMSwyLDEsMCwxLDAsCjAsMCwwLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMSwwLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMiwyLDAsMiwyLDEsMSwwLDEsMSwxLDEsMSwwLDAsMSwyLDEsMSwxLDAsMSwwLDAsMCwxLDEsMSwxLAowLDAsMiwxLDAsMSwxLDEsMCwxLDEsMiwxLDIsMSwxLDIsMCwxLDEsMiwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjMsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMiwyLDAsMiwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwKMCwyLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwzLDIsMCwyLDIsMCwxLDEsMCwxLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsCjIsMCwxLDAsMSwwLDEsMSwwLDAsMSwyLDAsMSwwLDEsMSwwLDAsMSwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMCwxLDEsMCwwLDAsMSwwLDAsMCwxLDIsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMSwyLDAsMSwwLAowLDAsMSwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDIsMSwwLDEsMSwxLDAsMCwwLDAsMSwyLDAsMCwxLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLAoxLDEsMiwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMSwKMCwwLDEsMiwyLDAsMiwxLDIsMSwxLDIsMiwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMiwwLDAsMCwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCjIsMiwyLDAsMCwwLDEsMCwwLDAsMCwwLDAsMiwyLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKQoKTGF0aW41VHVya2lzaE1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IExhdGluNV9UdXJraXNoQ2hhclRvT3JkZXJNYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogVHVya2lzaExhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTcwMjkwLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogVHJ1ZSwKICAnY2hhcnNldF9uYW1lJzogIklTTy04ODU5LTkiLAogICdsYW5ndWFnZSc6ICdUdXJraXNoJywKfQpQSwMEFAAAAAAAAAAhAOTs8KT6FAAA+hQAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGF0aW4xcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlCgpGUkVRX0NBVF9OVU0gPSA0CgpVREYgPSAwICAjIHVuZGVmaW5lZApPVEggPSAxICAjIG90aGVyCkFTQyA9IDIgICMgYXNjaWkgY2FwaXRhbCBsZXR0ZXIKQVNTID0gMyAgIyBhc2NpaSBzbWFsbCBsZXR0ZXIKQUNWID0gNCAgIyBhY2NlbnQgY2FwaXRhbCB2b3dlbApBQ08gPSA1ICAjIGFjY2VudCBjYXBpdGFsIG90aGVyCkFTViA9IDYgICMgYWNjZW50IHNtYWxsIHZvd2VsCkFTTyA9IDcgICMgYWNjZW50IHNtYWxsIG90aGVyCkNMQVNTX05VTSA9IDggICMgdG90YWwgY2xhc3NlcwoKTGF0aW4xX0NoYXJUb0NsYXNzID0gKAogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAwMCAtIDA3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDA4IC0gMEYKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMTAgLSAxNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAxOCAtIDFGCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDIwIC0gMjcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMjggLSAyRgogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAzMCAtIDM3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDM4IC0gM0YKICAgIE9USCwgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCAgICMgNDAgLSA0NwogICAgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsICAgIyA0OCAtIDRGCiAgICBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgICAjIDUwIC0gNTcKICAgIEFTQywgQVNDLCBBU0MsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgNTggLSA1RgogICAgT1RILCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsICAgIyA2MCAtIDY3CiAgICBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgICAjIDY4IC0gNkYKICAgIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCAgICMgNzAgLSA3NwogICAgQVNTLCBBU1MsIEFTUywgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyA3OCAtIDdGCiAgICBPVEgsIFVERiwgT1RILCBBU08sIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDgwIC0gODcKICAgIE9USCwgT1RILCBBQ08sIE9USCwgQUNPLCBVREYsIEFDTywgVURGLCAgICMgODggLSA4RgogICAgVURGLCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyA5MCAtIDk3CiAgICBPVEgsIE9USCwgQVNPLCBPVEgsIEFTTywgVURGLCBBU08sIEFDTywgICAjIDk4IC0gOUYKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgQTAgLSBBNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyBBOCAtIEFGCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIEIwIC0gQjcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgQjggLSBCRgogICAgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNPLCBBQ08sICAgIyBDMCAtIEM3CiAgICBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgICAjIEM4IC0gQ0YKICAgIEFDTywgQUNPLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgT1RILCAgICMgRDAgLSBENwogICAgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDTywgQUNPLCBBQ08sICAgIyBEOCAtIERGCiAgICBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU08sIEFTTywgICAjIEUwIC0gRTcKICAgIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCAgICMgRTggLSBFRgogICAgQVNPLCBBU08sIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBPVEgsICAgIyBGMCAtIEY3CiAgICBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNPLCBBU08sIEFTTywgICAjIEY4IC0gRkYKKQoKIyAwIDogaWxsZWdhbAojIDEgOiB2ZXJ5IHVubGlrZWx5CiMgMiA6IG5vcm1hbAojIDMgOiB2ZXJ5IGxpa2VseQpMYXRpbjFDbGFzc01vZGVsID0gKAojIFVERiBPVEggQVNDIEFTUyBBQ1YgQUNPIEFTViBBU08KICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgIyBVREYKICAgIDAsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgIyBPVEgKICAgIDAsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgIyBBU0MKICAgIDAsICAzLCAgMywgIDMsICAxLCAgMSwgIDMsICAzLCAgIyBBU1MKICAgIDAsICAzLCAgMywgIDMsICAxLCAgMiwgIDEsICAyLCAgIyBBQ1YKICAgIDAsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgIyBBQ08KICAgIDAsICAzLCAgMSwgIDMsICAxLCAgMSwgIDEsICAzLCAgIyBBU1YKICAgIDAsICAzLCAgMSwgIDMsICAxLCAgMSwgIDMsICAzLCAgIyBBU08KKQoKCmNsYXNzIExhdGluMVByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihMYXRpbjFQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9sYXN0X2NoYXJfY2xhc3MgPSBOb25lCiAgICAgICAgc2VsZi5fZnJlcV9jb3VudGVyID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl9sYXN0X2NoYXJfY2xhc3MgPSBPVEgKICAgICAgICBzZWxmLl9mcmVxX2NvdW50ZXIgPSBbMF0gKiBGUkVRX0NBVF9OVU0KICAgICAgICBDaGFyU2V0UHJvYmVyLnJlc2V0KHNlbGYpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiSVNPLTg4NTktMSIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIiIKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgYnl0ZV9zdHIgPSBzZWxmLmZpbHRlcl93aXRoX2VuZ2xpc2hfbGV0dGVycyhieXRlX3N0cikKICAgICAgICBmb3IgYyBpbiBieXRlX3N0cjoKICAgICAgICAgICAgY2hhcl9jbGFzcyA9IExhdGluMV9DaGFyVG9DbGFzc1tjXQogICAgICAgICAgICBmcmVxID0gTGF0aW4xQ2xhc3NNb2RlbFsoc2VsZi5fbGFzdF9jaGFyX2NsYXNzICogQ0xBU1NfTlVNKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNoYXJfY2xhc3NdCiAgICAgICAgICAgIGlmIGZyZXEgPT0gMDoKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgc2VsZi5fZnJlcV9jb3VudGVyW2ZyZXFdICs9IDEKICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyX2NsYXNzID0gY2hhcl9jbGFzcwoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUU6CiAgICAgICAgICAgIHJldHVybiAwLjAxCgogICAgICAgIHRvdGFsID0gc3VtKHNlbGYuX2ZyZXFfY291bnRlcikKICAgICAgICBpZiB0b3RhbCA8IDAuMDE6CiAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAwLjAKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25maWRlbmNlID0gKChzZWxmLl9mcmVxX2NvdW50ZXJbM10gLSBzZWxmLl9mcmVxX2NvdW50ZXJbMV0gKiAyMC4wKQogICAgICAgICAgICAgICAgICAgICAgICAgIC8gdG90YWwpCiAgICAgICAgaWYgY29uZmlkZW5jZSA8IDAuMDoKICAgICAgICAgICAgY29uZmlkZW5jZSA9IDAuMAogICAgICAgICMgbG93ZXIgdGhlIGNvbmZpZGVuY2Ugb2YgbGF0aW4xIHNvIHRoYXQgb3RoZXIgbW9yZSBhY2N1cmF0ZQogICAgICAgICMgZGV0ZWN0b3IgY2FuIHRha2UgcHJpb3JpdHkuCiAgICAgICAgY29uZmlkZW5jZSA9IGNvbmZpZGVuY2UgKiAwLjczCiAgICAgICAgcmV0dXJuIGNvbmZpZGVuY2UKUEsDBBQAAAAAAAAAIQA2dRhNVQ0AAFUNAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY2hhcnNldHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMgICBQcm9vZnBvaW50LCBJbmMuCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZSwgTWFjaGluZVN0YXRlCgoKY2xhc3MgTXVsdGlCeXRlQ2hhclNldFByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgICIiIgogICAgTXVsdGlCeXRlQ2hhclNldFByb2JlcgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHN1cGVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIsIHNlbGYpLl9faW5pdF9fKGxhbmdfZmlsdGVyPWxhbmdfZmlsdGVyKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gTm9uZQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gTm9uZQogICAgICAgIHNlbGYuX2xhc3RfY2hhciA9IFswLCAwXQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgaWYgc2VsZi5jb2Rpbmdfc206CiAgICAgICAgICAgIHNlbGYuY29kaW5nX3NtLnJlc2V0KCkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplcjoKICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIucmVzZXQoKQogICAgICAgIHNlbGYuX2xhc3RfY2hhciA9IFswLCAwXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYnl0ZV9zdHIpKToKICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gc2VsZi5jb2Rpbmdfc20ubmV4dF9zdGF0ZShieXRlX3N0cltpXSkKICAgICAgICAgICAgaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5FUlJPUjoKICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBwcm9iZXIgaGl0IGVycm9yIGF0IGJ5dGUgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFyc2V0X25hbWUsIHNlbGYubGFuZ3VhZ2UsIGkpCiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5JVFNfTUU6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLlNUQVJUOgogICAgICAgICAgICAgICAgY2hhcl9sZW4gPSBzZWxmLmNvZGluZ19zbS5nZXRfY3VycmVudF9jaGFybGVuKCkKICAgICAgICAgICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMV0gPSBieXRlX3N0clswXQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoc2VsZi5fbGFzdF9jaGFyLCBjaGFyX2xlbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChieXRlX3N0cltpIC0gMTppICsgMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzBdID0gYnl0ZV9zdHJbLTFdCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgKHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmdvdF9lbm91Z2hfZGF0YSgpIGFuZAogICAgICAgICAgICAgICAgICAgIChzZWxmLmdldF9jb25maWRlbmNlKCkgPiBzZWxmLlNIT1JUQ1VUX1RIUkVTSE9MRCkpOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmdldF9jb25maWRlbmNlKCkKUEsDBBQAAAAAAAAAIQCt0xGo3AcAANwHAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY3Nncm91cHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMgICBQcm9vZnBvaW50LCBJbmMuCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRncm91cHByb2JlciBpbXBvcnQgQ2hhclNldEdyb3VwUHJvYmVyCmZyb20gLnV0Zjhwcm9iZXIgaW1wb3J0IFVURjhQcm9iZXIKZnJvbSAuc2ppc3Byb2JlciBpbXBvcnQgU0pJU1Byb2Jlcgpmcm9tIC5ldWNqcHByb2JlciBpbXBvcnQgRVVDSlBQcm9iZXIKZnJvbSAuZ2IyMzEycHJvYmVyIGltcG9ydCBHQjIzMTJQcm9iZXIKZnJvbSAuZXVja3Jwcm9iZXIgaW1wb3J0IEVVQ0tSUHJvYmVyCmZyb20gLmNwOTQ5cHJvYmVyIGltcG9ydCBDUDk0OVByb2Jlcgpmcm9tIC5iaWc1cHJvYmVyIGltcG9ydCBCaWc1UHJvYmVyCmZyb20gLmV1Y3R3cHJvYmVyIGltcG9ydCBFVUNUV1Byb2JlcgoKCmNsYXNzIE1CQ1NHcm91cFByb2JlcihDaGFyU2V0R3JvdXBQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHN1cGVyKE1CQ1NHcm91cFByb2Jlciwgc2VsZikuX19pbml0X18obGFuZ19maWx0ZXI9bGFuZ19maWx0ZXIpCiAgICAgICAgc2VsZi5wcm9iZXJzID0gWwogICAgICAgICAgICBVVEY4UHJvYmVyKCksCiAgICAgICAgICAgIFNKSVNQcm9iZXIoKSwKICAgICAgICAgICAgRVVDSlBQcm9iZXIoKSwKICAgICAgICAgICAgR0IyMzEyUHJvYmVyKCksCiAgICAgICAgICAgIEVVQ0tSUHJvYmVyKCksCiAgICAgICAgICAgIENQOTQ5UHJvYmVyKCksCiAgICAgICAgICAgIEJpZzVQcm9iZXIoKSwKICAgICAgICAgICAgRVVDVFdQcm9iZXIoKQogICAgICAgIF0KICAgICAgICBzZWxmLnJlc2V0KCkKUEsDBBQAAAAAAAAAIQBp9uEPiWMAAIljAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY3NzbS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5lbnVtcyBpbXBvcnQgTWFjaGluZVN0YXRlCgojIEJJRzUKCkJJRzVfQ0xTID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAwMCAtIDA3ICAgICNhbGxvdyAweDAwIGFzIGxlZ2FsIHZhbHVlCiAgICAxLDEsMSwxLDEsMSwwLDAsICAjIDA4IC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMTAgLSAxNwogICAgMSwxLDEsMCwxLDEsMSwxLCAgIyAxOCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjggLSAyZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzMCAtIDM3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDM4IC0gM2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDAgLSA0NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0OCAtIDRmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDUwIC0gNTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTggLSA1ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2MCAtIDY3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDY4IC0gNmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNzAgLSA3NwogICAgMiwyLDIsMiwyLDIsMiwxLCAgIyA3OCAtIDdmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDgwIC0gODcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgODggLSA4ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA5MCAtIDk3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDk4IC0gOWYKICAgIDQsMywzLDMsMywzLDMsMywgICMgYTAgLSBhNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBhOCAtIGFmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGIwIC0gYjcKICAgIDMsMywzLDMsMywzLDMsMywgICMgYjggLSBiZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBjMCAtIGM3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGM4IC0gY2YKICAgIDMsMywzLDMsMywzLDMsMywgICMgZDAgLSBkNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBkOCAtIGRmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGUwIC0gZTcKICAgIDMsMywzLDMsMywzLDMsMywgICMgZTggLSBlZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBmMCAtIGY3CiAgICAzLDMsMywzLDMsMywzLDAgICMgZjggLSBmZgopCgpCSUc1X1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDgtMGYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQjMTAtMTcKKQoKQklHNV9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAxLCAyLCAwKQoKQklHNV9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBCSUc1X0NMUywKICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNSwKICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBCSUc1X1NULAogICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEJJRzVfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQmlnNSd9CgojIENQOTQ5CgpDUDk0OV9DTFMgID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwwLDAsICAjIDAwIC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMCwxLDEsMSwxLCAgIyAxMCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyZgogICAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsICAjIDMwIC0gM2YKICAgIDEsNCw0LDQsNCw0LDQsNCwgNCw0LDQsNCw0LDQsNCw0LCAgIyA0MCAtIDRmCiAgICA0LDQsNSw1LDUsNSw1LDUsIDUsNSw1LDEsMSwxLDEsMSwgICMgNTAgLSA1ZgogICAgMSw1LDUsNSw1LDUsNSw1LCA1LDUsNSw1LDUsNSw1LDUsICAjIDYwIC0gNmYKICAgIDUsNSw1LDUsNSw1LDUsNSwgNSw1LDUsMSwxLDEsMSwxLCAgIyA3MCAtIDdmCiAgICAwLDYsNiw2LDYsNiw2LDYsIDYsNiw2LDYsNiw2LDYsNiwgICMgODAgLSA4ZgogICAgNiw2LDYsNiw2LDYsNiw2LCA2LDYsNiw2LDYsNiw2LDYsICAjIDkwIC0gOWYKICAgIDYsNyw3LDcsNyw3LDcsNywgNyw3LDcsNyw3LDgsOCw4LCAgIyBhMCAtIGFmCiAgICA3LDcsNyw3LDcsNyw3LDcsIDcsNyw3LDcsNyw3LDcsNywgICMgYjAgLSBiZgogICAgNyw3LDcsNyw3LDcsOSwyLCAyLDMsMiwyLDIsMiwyLDIsICAjIGMwIC0gY2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGRmCiAgICAyLDIsMiwyLDIsMiwyLDIsIDIsMiwyLDIsMiwyLDIsMiwgICMgZTAgLSBlZgogICAgMiwyLDIsMiwyLDIsMiwyLCAyLDIsMiwyLDIsMiwyLDAsICAjIGYwIC0gZmYKKQoKQ1A5NDlfU1QgPSAoCiNjbHM9ICAgIDAgICAgICAxICAgICAgMiAgICAgIDMgICAgICA0ICAgICAgNSAgICAgIDYgICAgICA3ICAgICAgOCAgICAgIDkgICMgcHJldmlvdXMgc3RhdGUgPQogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICA0LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA2LCAjIE1hY2hpbmVTdGF0ZS5TVEFSVAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAjIE1hY2hpbmVTdGF0ZS5FUlJPUgogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwgIyBNYWNoaW5lU3RhdGUuSVRTX01FCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICMgMwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAjIDQKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgIyA1CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICMgNgopCgpDUDk0OV9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAyLCAwLCAxLCAxLCAyLCAyLCAwLCAyKQoKQ1A5NDlfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogQ1A5NDlfQ0xTLAogICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogMTAsCiAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IENQOTQ5X1NULAogICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBDUDk0OV9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQ1A5NDknfQoKIyBFVUMtSlAKCkVVQ0pQX0NMUyA9ICgKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMDAgLSAwNwogICAgNCw0LDQsNCw0LDQsNSw1LCAgIyAwOCAtIDBmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDEwIC0gMTcKICAgIDQsNCw0LDUsNCw0LDQsNCwgICMgMTggLSAxZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAyMCAtIDI3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDI4IC0gMmYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMzAgLSAzNwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAzOCAtIDNmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDQwIC0gNDcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNDggLSA0ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA1MCAtIDU3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDU4IC0gNWYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNjAgLSA2NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA2OCAtIDZmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDcwIC0gNzcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNzggLSA3ZgogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyA4MCAtIDg3CiAgICA1LDUsNSw1LDUsNSwxLDMsICAjIDg4IC0gOGYKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgOTAgLSA5NwogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyA5OCAtIDlmCiAgICA1LDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYTggLSBhZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBiMCAtIGI3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBjOCAtIGNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBlMCAtIGU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGU4IC0gZWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZjAgLSBmNwogICAgMCwwLDAsMCwwLDAsMCw1ICAjIGY4IC0gZmYKKQoKRVVDSlBfU1QgPSAoCiAgICAgICAgICAzLCAgICAgNCwgICAgIDMsICAgICA1LE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzEwLTE3CiAgICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTgtMWYKICAgICAgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUIzIwLTI3CikKCkVVQ0pQX0NIQVJfTEVOX1RBQkxFID0gKDIsIDIsIDIsIDMsIDEsIDApCgpFVUNKUF9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBFVUNKUF9DTFMsCiAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBFVUNKUF9TVCwKICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogRVVDSlBfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgICduYW1lJzogJ0VVQy1KUCd9CgojIEVVQy1LUgoKRVVDS1JfQ0xTICA9ICgKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMDAgLSAwNwogICAgMSwxLDEsMSwxLDEsMCwwLCAgIyAwOCAtIDBmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDEwIC0gMTcKICAgIDEsMSwxLDAsMSwxLDEsMSwgICMgMTggLSAxZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDI4IC0gMmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzAgLSAzNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzOCAtIDNmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDQwIC0gNDcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNDggLSA0ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA1MCAtIDU3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDU4IC0gNWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNjAgLSA2NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA2OCAtIDZmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDcwIC0gNzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNzggLSA3ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4MCAtIDg3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDg4IC0gOGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTAgLSA5NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5OCAtIDlmCiAgICAwLDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKICAgIDIsMiwyLDIsMiwzLDMsMywgICMgYTggLSBhZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBiMCAtIGI3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwogICAgMiwzLDIsMiwyLDIsMiwyLCAgIyBjOCAtIGNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBlMCAtIGU3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGU4IC0gZWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZjAgLSBmNwogICAgMiwyLDIsMiwyLDIsMiwwICAgIyBmOCAtIGZmCikKCkVVQ0tSX1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMwOC0wZgopCgpFVUNLUl9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAyLCAwKQoKRVVDS1JfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogRVVDS1JfQ0xTLAogICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDQsCiAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBFVUNLUl9TVCwKICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEVVQ0tSX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgJ25hbWUnOiAnRVVDLUtSJ30KCiMgRVVDLVRXCgpFVUNUV19DTFMgPSAoCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDAwIC0gMDcKICAgIDIsMiwyLDIsMiwyLDAsMCwgICMgMDggLSAwZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAxMCAtIDE3CiAgICAyLDIsMiwwLDIsMiwyLDIsICAjIDE4IC0gMWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMjAgLSAyNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAyOCAtIDJmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDMwIC0gMzcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMzggLSAzZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0MCAtIDQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQ4IC0gNGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTAgLSA1NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1OCAtIDVmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDYwIC0gNjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjggLSA2ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA3MCAtIDc3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDc4IC0gN2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODAgLSA4NwogICAgMCwwLDAsMCwwLDAsNiwwLCAgIyA4OCAtIDhmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDkwIC0gOTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTggLSA5ZgogICAgMCwzLDQsNCw0LDQsNCw0LCAgIyBhMCAtIGE3CiAgICA1LDUsMSwxLDEsMSwxLDEsICAjIGE4IC0gYWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgYjAgLSBiNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyBiOCAtIGJmCiAgICAxLDEsMywxLDMsMywzLDMsICAjIGMwIC0gYzcKICAgIDMsMywzLDMsMywzLDMsMywgICMgYzggLSBjZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBkMCAtIGQ3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGQ4IC0gZGYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZTAgLSBlNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBlOCAtIGVmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGYwIC0gZjcKICAgIDMsMywzLDMsMywzLDMsMCAgICMgZjggLSBmZgopCgpFVUNUV19TVCA9ICgKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMywgICAgIDMsICAgICAzLCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsIzEwLTE3CiAgICBNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMxOC0xZgogICAgICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwjMjAtMjcKICAgIE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzI4LTJmCikKCkVVQ1RXX0NIQVJfTEVOX1RBQkxFID0gKDAsIDAsIDEsIDIsIDIsIDIsIDMpCgpFVUNUV19TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBFVUNUV19DTFMsCiAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNywKICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEVVQ1RXX1NULAogICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogRVVDVFdfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAnbmFtZSc6ICd4LWV1Yy10dyd9CgojIEdCMjMxMgoKR0IyMzEyX0NMUyA9ICgKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMDAgLSAwNwogICAgMSwxLDEsMSwxLDEsMCwwLCAgIyAwOCAtIDBmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDEwIC0gMTcKICAgIDEsMSwxLDAsMSwxLDEsMSwgICMgMTggLSAxZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDI4IC0gMmYKICAgIDMsMywzLDMsMywzLDMsMywgICMgMzAgLSAzNwogICAgMywzLDEsMSwxLDEsMSwxLCAgIyAzOCAtIDNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQwIC0gNDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDggLSA0ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1MCAtIDU3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDU4IC0gNWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjAgLSA2NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2OCAtIDZmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDcwIC0gNzcKICAgIDIsMiwyLDIsMiwyLDIsNCwgICMgNzggLSA3ZgogICAgNSw2LDYsNiw2LDYsNiw2LCAgIyA4MCAtIDg3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIDg4IC0gOGYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgOTAgLSA5NwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyA5OCAtIDlmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGEwIC0gYTcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYTggLSBhZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBiMCAtIGI3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGI4IC0gYmYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYzAgLSBjNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBjOCAtIGNmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGQwIC0gZDcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZDggLSBkZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBlMCAtIGU3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGU4IC0gZWYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZjAgLSBmNwogICAgNiw2LDYsNiw2LDYsNiwwICAgIyBmOCAtIGZmCikKCkdCMjMxMl9TVCA9ICgKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsIzEwLTE3CiAgICAgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMxOC0xZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsIzIwLTI3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMyOC0yZgopCgojIFRvIGJlIGFjY3VyYXRlLCB0aGUgbGVuZ3RoIG9mIGNsYXNzIDYgY2FuIGJlIGVpdGhlciAyIG9yIDQuCiMgQnV0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGlzY3JpbWluYXRlIGJldHdlZW4gdGhlIHR3byBzaW5jZQojIGl0IGlzIHVzZWQgZm9yIGZyZXF1ZW5jeSBhbmFseXNpcyBvbmx5LCBhbmQgd2UgYXJlIHZhbGlkYXRpbmcKIyBlYWNoIGNvZGUgcmFuZ2UgdGhlcmUgYXMgd2VsbC4gU28gaXQgaXMgc2FmZSB0byBzZXQgaXQgdG8gYmUKIyAyIGhlcmUuCkdCMjMxMl9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAxLCAxLCAxLCAxLCAyKQoKR0IyMzEyX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEdCMjMxMl9DTFMsCiAgICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNywKICAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEdCMjMxMl9TVCwKICAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEdCMjMxMl9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0dCMjMxMid9CgojIFNoaWZ0X0pJUwoKU0pJU19DTFMgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDAwIC0gMDcKICAgIDEsMSwxLDEsMSwxLDAsMCwgICMgMDggLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAxMCAtIDE3CiAgICAxLDEsMSwwLDEsMSwxLDEsICAjIDE4IC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyOCAtIDJmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDMwIC0gMzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzggLSAzZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0MCAtIDQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQ4IC0gNGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTAgLSA1NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1OCAtIDVmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDYwIC0gNjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjggLSA2ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA3MCAtIDc3CiAgICAyLDIsMiwyLDIsMiwyLDEsICAjIDc4IC0gN2YKICAgIDMsMywzLDMsMywyLDIsMywgICMgODAgLSA4NwogICAgMywzLDMsMywzLDMsMywzLCAgIyA4OCAtIDhmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIDkwIC0gOTcKICAgIDMsMywzLDMsMywzLDMsMywgICMgOTggLSA5ZgogICAgIzB4YTAgaXMgaWxsZWdhbCBpbiBzamlzIGVuY29kaW5nLCBidXQgc29tZSBwYWdlcyBkb2VzCiAgICAjY29udGFpbiBzdWNoIGJ5dGUuIFdlIG5lZWQgdG8gYmUgbW9yZSBlcnJvciBmb3JnaXZlbi4KICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBhOCAtIGFmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGUwIC0gZTcKICAgIDMsMywzLDMsMyw0LDQsNCwgICMgZTggLSBlZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBmMCAtIGY3CiAgICAzLDMsMywzLDMsMCwwLDApICAjIGY4IC0gZmYKCgpTSklTX1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMxMC0xNwopCgpTSklTX0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDEsIDIsIDAsIDApCgpTSklTX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IFNKSVNfQ0xTLAogICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogU0pJU19TVCwKICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogU0pJU19DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgJ25hbWUnOiAnU2hpZnRfSklTJ30KCiMgVUNTMi1CRQoKVUNTMkJFX0NMUyA9ICgKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwogICAgMCwwLDEsMCwwLDIsMCwwLCAgIyAwOCAtIDBmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKICAgIDAsMCwwLDMsMCwwLDAsMCwgICMgMTggLSAxZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAyMCAtIDI3CiAgICAwLDMsMywzLDMsMywwLDAsICAjIDI4IC0gMmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDQwIC0gNDcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4MCAtIDg3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDg4IC0gOGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTAgLSA5NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5OCAtIDlmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGEwIC0gYTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYTggLSBhZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBiMCAtIGI3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGI4IC0gYmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYzAgLSBjNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBjOCAtIGNmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGQwIC0gZDcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZDggLSBkZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBlMCAtIGU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGU4IC0gZWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZjAgLSBmNwogICAgMCwwLDAsMCwwLDAsNCw1ICAgIyBmOCAtIGZmCikKClVDUzJCRV9TVCAgPSAoCiAgICAgICAgICA1LCAgICAgNywgICAgIDcsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzEwLTE3CiAgICAgICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LCAgICAgNixNYWNoaW5lU3RhdGUuSVRTX01FLCAgICAgNiwgICAgIDYsIzE4LTFmCiAgICAgICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LCAgICAgNSwgICAgIDcsICAgICA3LE1hY2hpbmVTdGF0ZS5FUlJPUiwjMjAtMjcKICAgICAgICAgIDUsICAgICA4LCAgICAgNiwgICAgIDYsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNiwgICAgIDYsICAgICA2LCMyOC0yZgogICAgICAgICAgNiwgICAgIDYsICAgICA2LCAgICAgNixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzMwLTM3CikKClVDUzJCRV9DSEFSX0xFTl9UQUJMRSA9ICgyLCAyLCAyLCAwLCAyLCAyKQoKVUNTMkJFX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IFVDUzJCRV9DTFMsCiAgICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IFVDUzJCRV9TVCwKICAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IFVDUzJCRV9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1VURi0xNkJFJ30KCiMgVUNTMi1MRQoKVUNTMkxFX0NMUyA9ICgKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwogICAgMCwwLDEsMCwwLDIsMCwwLCAgIyAwOCAtIDBmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKICAgIDAsMCwwLDMsMCwwLDAsMCwgICMgMTggLSAxZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAyMCAtIDI3CiAgICAwLDMsMywzLDMsMywwLDAsICAjIDI4IC0gMmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDQwIC0gNDcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4MCAtIDg3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDg4IC0gOGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTAgLSA5NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5OCAtIDlmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGEwIC0gYTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYTggLSBhZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBiMCAtIGI3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGI4IC0gYmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYzAgLSBjNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBjOCAtIGNmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGQwIC0gZDcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZDggLSBkZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBlMCAtIGU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGU4IC0gZWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZjAgLSBmNwogICAgMCwwLDAsMCwwLDAsNCw1ICAgIyBmOCAtIGZmCikKClVDUzJMRV9TVCA9ICgKICAgICAgICAgIDYsICAgICA2LCAgICAgNywgICAgIDYsICAgICA0LCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsIzEwLTE3CiAgICAgICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA2LCAgICAgNiwjMTgtMWYKICAgICAgICAgIDcsICAgICA2LCAgICAgOCwgICAgIDgsICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCMyMC0yNwogICAgICAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSwgICAgIDUsIzI4LTJmCiAgICAgICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCAjMzAtMzcKKQoKVUNTMkxFX0NIQVJfTEVOX1RBQkxFID0gKDIsIDIsIDIsIDIsIDIsIDIpCgpVQ1MyTEVfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogVUNTMkxFX0NMUywKICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBVQ1MyTEVfU1QsCiAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogVUNTMkxFX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICduYW1lJzogJ1VURi0xNkxFJ30KCiMgVVRGLTgKClVURjhfQ0xTID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAwMCAtIDA3ICAjYWxsb3cgMHgwMCBhcyBhIGxlZ2FsIHZhbHVlCiAgICAxLDEsMSwxLDEsMSwwLDAsICAjIDA4IC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMTAgLSAxNwogICAgMSwxLDEsMCwxLDEsMSwxLCAgIyAxOCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjggLSAyZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzMCAtIDM3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDM4IC0gM2YKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNDAgLSA0NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA0OCAtIDRmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDUwIC0gNTcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNTggLSA1ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA2MCAtIDY3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDY4IC0gNmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNzAgLSA3NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA3OCAtIDdmCiAgICAyLDIsMiwyLDMsMywzLDMsICAjIDgwIC0gODcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgODggLSA4ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA5MCAtIDk3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDk4IC0gOWYKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgYTAgLSBhNwogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyBhOCAtIGFmCiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIGIwIC0gYjcKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgYjggLSBiZgogICAgMCwwLDYsNiw2LDYsNiw2LCAgIyBjMCAtIGM3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGM4IC0gY2YKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZDAgLSBkNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBkOCAtIGRmCiAgICA3LDgsOCw4LDgsOCw4LDgsICAjIGUwIC0gZTcKICAgIDgsOCw4LDgsOCw5LDgsOCwgICMgZTggLSBlZgogICAgMTAsMTEsMTEsMTEsMTEsMTEsMTEsMTEsICAjIGYwIC0gZjcKICAgIDEyLDEzLDEzLDEzLDE0LDE1LDAsMCAgICAjIGY4IC0gZmYKKQoKVVRGOF9TVCA9ICgKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgMTIsICAgMTAsIzAwLTA3CiAgICAgICAgIDksICAgICAxMSwgICAgIDgsICAgICA3LCAgICAgNiwgICAgIDUsICAgICA0LCAgICAzLCMwOC0wZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzE4LTFmCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzIwLTI3CiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzI4LTJmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSwgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMzMC0zNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMzgtM2YKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzQwLTQ3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM0OC00ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDcsICAgICA3LCAgICAgNywgICAgIDcsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNTAtNTcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzU4LTVmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA3LCAgICAgNyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM2MC02NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNjgtNmYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA5LCAgICAgOSwgICAgIDksICAgICA5LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzcwLTc3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM3OC03ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDksTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjODAtODcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzg4LThmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAxMiwgICAgMTIsICAgIDEyLCAgICAxMixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM5MC05NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjOTgtOWYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgIDEyLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsI2EwLWE3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCNhOC1hZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgMTIsICAgIDEyLCAgICAxMixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjYjAtYjcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsI2I4LWJmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCNjMC1jNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiAjYzgtY2YKKQoKVVRGOF9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAwLCAwLCAwLCAwLCAyLCAzLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2KQoKVVRGOF9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBVVEY4X0NMUywKICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogMTYsCiAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogVVRGOF9TVCwKICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBVVEY4X0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICduYW1lJzogJ1VURi04J30KUEsDBBQAAAAAAAAAIQAede8eGRYAABkWAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NiY2hhcnNldHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IENoYXJhY3RlckNhdGVnb3J5LCBQcm9iaW5nU3RhdGUsIFNlcXVlbmNlTGlrZWxpaG9vZAoKCmNsYXNzIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgU0FNUExFX1NJWkUgPSA2NAogICAgU0JfRU5PVUdIX1JFTF9USFJFU0hPTEQgPSAxMDI0ICAjICAwLjI1ICogU0FNUExFX1NJWkVeMgogICAgUE9TSVRJVkVfU0hPUlRDVVRfVEhSRVNIT0xEID0gMC45NQogICAgTkVHQVRJVkVfU0hPUlRDVVRfVEhSRVNIT0xEID0gMC4wNQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RlbCwgcmV2ZXJzZWQ9RmFsc2UsIG5hbWVfcHJvYmVyPU5vbmUpOgogICAgICAgIHN1cGVyKFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fbW9kZWwgPSBtb2RlbAogICAgICAgICMgVFJVRSBpZiB3ZSBuZWVkIHRvIHJldmVyc2UgZXZlcnkgcGFpciBpbiB0aGUgbW9kZWwgbG9va3VwCiAgICAgICAgc2VsZi5fcmV2ZXJzZWQgPSByZXZlcnNlZAogICAgICAgICMgT3B0aW9uYWwgYXV4aWxpYXJ5IHByb2JlciBmb3IgbmFtZSBkZWNpc2lvbgogICAgICAgIHNlbGYuX25hbWVfcHJvYmVyID0gbmFtZV9wcm9iZXIKICAgICAgICBzZWxmLl9sYXN0X29yZGVyID0gTm9uZQogICAgICAgIHNlbGYuX3NlcV9jb3VudGVycyA9IE5vbmUKICAgICAgICBzZWxmLl90b3RhbF9zZXFzID0gTm9uZQogICAgICAgIHNlbGYuX3RvdGFsX2NoYXIgPSBOb25lCiAgICAgICAgc2VsZi5fZnJlcV9jaGFyID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihTaW5nbGVCeXRlQ2hhclNldFByb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgICMgY2hhciBvcmRlciBvZiBsYXN0IGNoYXJhY3RlcgogICAgICAgIHNlbGYuX2xhc3Rfb3JkZXIgPSAyNTUKICAgICAgICBzZWxmLl9zZXFfY291bnRlcnMgPSBbMF0gKiBTZXF1ZW5jZUxpa2VsaWhvb2QuZ2V0X251bV9jYXRlZ29yaWVzKCkKICAgICAgICBzZWxmLl90b3RhbF9zZXFzID0gMAogICAgICAgIHNlbGYuX3RvdGFsX2NoYXIgPSAwCiAgICAgICAgIyBjaGFyYWN0ZXJzIHRoYXQgZmFsbCBpbiBvdXIgc2FtcGxpbmcgcmFuZ2UKICAgICAgICBzZWxmLl9mcmVxX2NoYXIgPSAwCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX25hbWVfcHJvYmVyOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbmFtZV9wcm9iZXIuY2hhcnNldF9uYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21vZGVsWydjaGFyc2V0X25hbWUnXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX25hbWVfcHJvYmVyOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbmFtZV9wcm9iZXIubGFuZ3VhZ2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbW9kZWwuZ2V0KCdsYW5ndWFnZScpCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGlmIG5vdCBzZWxmLl9tb2RlbFsna2VlcF9lbmdsaXNoX2xldHRlciddOgogICAgICAgICAgICBieXRlX3N0ciA9IHNlbGYuZmlsdGVyX2ludGVybmF0aW9uYWxfd29yZHMoYnl0ZV9zdHIpCiAgICAgICAgaWYgbm90IGJ5dGVfc3RyOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQogICAgICAgIGNoYXJfdG9fb3JkZXJfbWFwID0gc2VsZi5fbW9kZWxbJ2NoYXJfdG9fb3JkZXJfbWFwJ10KICAgICAgICBmb3IgaSwgYyBpbiBlbnVtZXJhdGUoYnl0ZV9zdHIpOgogICAgICAgICAgICAjIFhYWDogT3JkZXIgaXMgaW4gcmFuZ2UgMS02NCwgc28gb25lIHdvdWxkIHRoaW5rIHdlIHdhbnQgMC02MyBoZXJlLAogICAgICAgICAgICAjICAgICAgYnV0IHRoYXQgbGVhZHMgdG8gMjcgbW9yZSB0ZXN0IGZhaWx1cmVzIHRoYW4gYmVmb3JlLgogICAgICAgICAgICBvcmRlciA9IGNoYXJfdG9fb3JkZXJfbWFwW2NdCiAgICAgICAgICAgICMgWFhYOiBUaGlzIHdhcyBTWU1CT0xfQ0FUX09SREVSIGJlZm9yZSwgd2l0aCBhIHZhbHVlIG9mIDI1MCwgYnV0CiAgICAgICAgICAgICMgICAgICBDaGFyYWN0ZXJDYXRlZ29yeS5TWU1CT0wgaXMgYWN0dWFsbHkgMjUzLCBzbyB3ZSB1c2UgQ09OVFJPTAogICAgICAgICAgICAjICAgICAgdG8gbWFrZSBpdCBjbG9zZXIgdG8gdGhlIG9yaWdpbmFsIGludGVudC4gVGhlIG9ubHkgZGlmZmVyZW5jZQogICAgICAgICAgICAjICAgICAgaXMgd2hldGhlciBvciBub3Qgd2UgY291bnQgZGlnaXRzIGFuZCBjb250cm9sIGNoYXJhY3RlcnMgZm9yCiAgICAgICAgICAgICMgICAgICBfdG90YWxfY2hhciBwdXJwb3Nlcy4KICAgICAgICAgICAgaWYgb3JkZXIgPCBDaGFyYWN0ZXJDYXRlZ29yeS5DT05UUk9MOgogICAgICAgICAgICAgICAgc2VsZi5fdG90YWxfY2hhciArPSAxCiAgICAgICAgICAgIGlmIG9yZGVyIDwgc2VsZi5TQU1QTEVfU0laRToKICAgICAgICAgICAgICAgIHNlbGYuX2ZyZXFfY2hhciArPSAxCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9sYXN0X29yZGVyIDwgc2VsZi5TQU1QTEVfU0laRToKICAgICAgICAgICAgICAgICAgICBzZWxmLl90b3RhbF9zZXFzICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fcmV2ZXJzZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoc2VsZi5fbGFzdF9vcmRlciAqIHNlbGYuU0FNUExFX1NJWkUpICsgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBzZWxmLl9tb2RlbFsncHJlY2VkZW5jZV9tYXRyaXgnXVtpXQogICAgICAgICAgICAgICAgICAgIGVsc2U6ICAjIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBsZXR0ZXJzIGluIHRoZSBsb29rdXAKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChvcmRlciAqIHNlbGYuU0FNUExFX1NJWkUpICsgc2VsZi5fbGFzdF9vcmRlcgogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IHNlbGYuX21vZGVsWydwcmVjZWRlbmNlX21hdHJpeCddW2ldCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2VxX2NvdW50ZXJzW21vZGVsXSArPSAxCiAgICAgICAgICAgIHNlbGYuX2xhc3Rfb3JkZXIgPSBvcmRlcgoKICAgICAgICBjaGFyc2V0X25hbWUgPSBzZWxmLl9tb2RlbFsnY2hhcnNldF9uYW1lJ10KICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkc6CiAgICAgICAgICAgIGlmIHNlbGYuX3RvdGFsX3NlcXMgPiBzZWxmLlNCX0VOT1VHSF9SRUxfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgY29uZmlkZW5jZSA9IHNlbGYuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICAgICAgaWYgY29uZmlkZW5jZSA+IHNlbGYuUE9TSVRJVkVfU0hPUlRDVVRfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyBjb25maWRlbmNlID0gJXMsIHdlIGhhdmUgYSB3aW5uZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRfbmFtZSwgY29uZmlkZW5jZSkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgZWxpZiBjb25maWRlbmNlIDwgc2VsZi5ORUdBVElWRV9TSE9SVENVVF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzIGNvbmZpZGVuY2UgPSAlcywgYmVsb3cgbmVnYXRpdmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaG9ydGN1dCB0aHJlc2hob2xkICVzJywgY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ORUdBVElWRV9TSE9SVENVVF9USFJFU0hPTEQpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIHIgPSAwLjAxCiAgICAgICAgaWYgc2VsZi5fdG90YWxfc2VxcyA+IDA6CiAgICAgICAgICAgIHIgPSAoKDEuMCAqIHNlbGYuX3NlcV9jb3VudGVyc1tTZXF1ZW5jZUxpa2VsaWhvb2QuUE9TSVRJVkVdKSAvCiAgICAgICAgICAgICAgICAgc2VsZi5fdG90YWxfc2VxcyAvIHNlbGYuX21vZGVsWyd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJ10pCiAgICAgICAgICAgIHIgPSByICogc2VsZi5fZnJlcV9jaGFyIC8gc2VsZi5fdG90YWxfY2hhcgogICAgICAgICAgICBpZiByID49IDEuMDoKICAgICAgICAgICAgICAgIHIgPSAwLjk5CiAgICAgICAgcmV0dXJuIHIKUEsDBBQAAAAAAAAAIQCK/k+g2g0AANoNAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NiY3Nncm91cHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRncm91cHByb2JlciBpbXBvcnQgQ2hhclNldEdyb3VwUHJvYmVyCmZyb20gLnNiY2hhcnNldHByb2JlciBpbXBvcnQgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAubGFuZ2N5cmlsbGljbW9kZWwgaW1wb3J0IChXaW4xMjUxQ3lyaWxsaWNNb2RlbCwgS29pOHJNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRpbjVDeXJpbGxpY01vZGVsLCBNYWNDeXJpbGxpY01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElibTg2Nk1vZGVsLCBJYm04NTVNb2RlbCkKZnJvbSAubGFuZ2dyZWVrbW9kZWwgaW1wb3J0IExhdGluN0dyZWVrTW9kZWwsIFdpbjEyNTNHcmVla01vZGVsCmZyb20gLmxhbmdidWxnYXJpYW5tb2RlbCBpbXBvcnQgTGF0aW41QnVsZ2FyaWFuTW9kZWwsIFdpbjEyNTFCdWxnYXJpYW5Nb2RlbAojIGZyb20gLmxhbmdodW5nYXJpYW5tb2RlbCBpbXBvcnQgTGF0aW4ySHVuZ2FyaWFuTW9kZWwsIFdpbjEyNTBIdW5nYXJpYW5Nb2RlbApmcm9tIC5sYW5ndGhhaW1vZGVsIGltcG9ydCBUSVM2MjBUaGFpTW9kZWwKZnJvbSAubGFuZ2hlYnJld21vZGVsIGltcG9ydCBXaW4xMjU1SGVicmV3TW9kZWwKZnJvbSAuaGVicmV3cHJvYmVyIGltcG9ydCBIZWJyZXdQcm9iZXIKZnJvbSAubGFuZ3R1cmtpc2htb2RlbCBpbXBvcnQgTGF0aW41VHVya2lzaE1vZGVsCgoKY2xhc3MgU0JDU0dyb3VwUHJvYmVyKENoYXJTZXRHcm91cFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU0JDU0dyb3VwUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5wcm9iZXJzID0gWwogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjUxQ3lyaWxsaWNNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKEtvaThyTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjVDeXJpbGxpY01vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoTWFjQ3lyaWxsaWNNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKElibTg2Nk1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoSWJtODU1TW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjdHcmVla01vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1M0dyZWVrTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjVCdWxnYXJpYW5Nb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKFdpbjEyNTFCdWxnYXJpYW5Nb2RlbCksCiAgICAgICAgICAgICMgVE9ETzogUmVzdG9yZSBIdW5nYXJpYW4gZW5jb2RpbmdzIChpc28tODg1OS0yIGFuZCB3aW5kb3dzLTEyNTApCiAgICAgICAgICAgICMgICAgICAgYWZ0ZXIgd2UgcmV0cmFpbiBtb2RlbC4KICAgICAgICAgICAgIyBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjJIdW5nYXJpYW5Nb2RlbCksCiAgICAgICAgICAgICMgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1MEh1bmdhcmlhbk1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoVElTNjIwVGhhaU1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoTGF0aW41VHVya2lzaE1vZGVsKSwKICAgICAgICBdCiAgICAgICAgaGVicmV3X3Byb2JlciA9IEhlYnJld1Byb2JlcigpCiAgICAgICAgbG9naWNhbF9oZWJyZXdfcHJvYmVyID0gU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1NUhlYnJld01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlLCBoZWJyZXdfcHJvYmVyKQogICAgICAgIHZpc3VhbF9oZWJyZXdfcHJvYmVyID0gU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1NUhlYnJld01vZGVsLCBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVicmV3X3Byb2JlcikKICAgICAgICBoZWJyZXdfcHJvYmVyLnNldF9tb2RlbF9wcm9iZXJzKGxvZ2ljYWxfaGVicmV3X3Byb2JlciwgdmlzdWFsX2hlYnJld19wcm9iZXIpCiAgICAgICAgc2VsZi5wcm9iZXJzLmV4dGVuZChbaGVicmV3X3Byb2JlciwgbG9naWNhbF9oZWJyZXdfcHJvYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbF9oZWJyZXdfcHJvYmVyXSkKCiAgICAgICAgc2VsZi5yZXNldCgpClBLAwQUAAAAAAAAACEA1pFnMr4OAAC+DgAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9zamlzcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBTSklTRGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAuanBjbnR4IGltcG9ydCBTSklTQ29udGV4dEFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgU0pJU19TTV9NT0RFTApmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlLCBNYWNoaW5lU3RhdGUKCgpjbGFzcyBTSklTUHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKFNKSVNQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShTSklTX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gU0pJU0Rpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIgPSBTSklTQ29udGV4dEFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc3VwZXIoU0pJU1Byb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuY2hhcnNldF9uYW1lCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJKYXBhbmVzZSIKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGJ5dGVfc3RyKSk6CiAgICAgICAgICAgIGNvZGluZ19zdGF0ZSA9IHNlbGYuY29kaW5nX3NtLm5leHRfc3RhdGUoYnl0ZV9zdHJbaV0pCiAgICAgICAgICAgIGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuRVJST1I6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgJXMgcHJvYmVyIGhpdCBlcnJvciBhdCBieXRlICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhcnNldF9uYW1lLCBzZWxmLmxhbmd1YWdlLCBpKQogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuSVRTX01FOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5TVEFSVDoKICAgICAgICAgICAgICAgIGNoYXJfbGVuID0gc2VsZi5jb2Rpbmdfc20uZ2V0X2N1cnJlbnRfY2hhcmxlbigpCiAgICAgICAgICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzFdID0gYnl0ZV9zdHJbMF0KICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXJbMiAtIGNoYXJfbGVuOl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXIsIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZmVlZChieXRlX3N0cltpICsgMSAtIGNoYXJfbGVuOmkgKyAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjaGFyX2xlbl0sIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoYnl0ZV9zdHJbaSAtIDE6aSArIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9sZW4pCgogICAgICAgIHNlbGYuX2xhc3RfY2hhclswXSA9IGJ5dGVfc3RyWy0xXQoKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkc6CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZ290X2Vub3VnaF9kYXRhKCkgYW5kCiAgICAgICAgICAgICAgIChzZWxmLmdldF9jb25maWRlbmNlKCkgPiBzZWxmLlNIT1JUQ1VUX1RIUkVTSE9MRCkpOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgY29udGV4dF9jb25mID0gc2VsZi5jb250ZXh0X2FuYWx5emVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICBkaXN0cmliX2NvbmYgPSBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgcmV0dXJuIG1heChjb250ZXh0X2NvbmYsIGRpc3RyaWJfY29uZikKUEsDBBQAAAAAAAAAIQB1gEc9xTAAAMUwAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3VuaXZlcnNhbGRldGVjdG9yLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoiIiIKTW9kdWxlIGNvbnRhaW5pbmcgdGhlIFVuaXZlcnNhbERldGVjdG9yIGRldGVjdG9yIGNsYXNzLCB3aGljaCBpcyB0aGUgcHJpbWFyeQpjbGFzcyBhIHVzZXIgb2YgYGBjaGFyZGV0YGAgc2hvdWxkIHVzZS4KCjphdXRob3I6IE1hcmsgUGlsZ3JpbSAoaW5pdGlhbCBwb3J0IHRvIFB5dGhvbikKOmF1dGhvcjogU2h5IFNoYWxvbSAob3JpZ2luYWwgQyBjb2RlKQo6YXV0aG9yOiBEYW4gQmxhbmNoYXJkIChtYWpvciByZWZhY3RvcmluZyBmb3IgMy4wKQo6YXV0aG9yOiBJYW4gQ29yZGFzY28KIiIiCgoKaW1wb3J0IGNvZGVjcwppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKCmZyb20gLmNoYXJzZXRncm91cHByb2JlciBpbXBvcnQgQ2hhclNldEdyb3VwUHJvYmVyCmZyb20gLmVudW1zIGltcG9ydCBJbnB1dFN0YXRlLCBMYW5ndWFnZUZpbHRlciwgUHJvYmluZ1N0YXRlCmZyb20gLmVzY3Byb2JlciBpbXBvcnQgRXNjQ2hhclNldFByb2Jlcgpmcm9tIC5sYXRpbjFwcm9iZXIgaW1wb3J0IExhdGluMVByb2Jlcgpmcm9tIC5tYmNzZ3JvdXBwcm9iZXIgaW1wb3J0IE1CQ1NHcm91cFByb2Jlcgpmcm9tIC5zYmNzZ3JvdXBwcm9iZXIgaW1wb3J0IFNCQ1NHcm91cFByb2JlcgoKCmNsYXNzIFVuaXZlcnNhbERldGVjdG9yKG9iamVjdCk6CiAgICAiIiIKICAgIFRoZSBgYFVuaXZlcnNhbERldGVjdG9yYGAgY2xhc3MgdW5kZXJsaWVzIHRoZSBgYGNoYXJkZXQuZGV0ZWN0YGAgZnVuY3Rpb24KICAgIGFuZCBjb29yZGluYXRlcyBhbGwgb2YgdGhlIGRpZmZlcmVudCBjaGFyc2V0IHByb2JlcnMuCgogICAgVG8gZ2V0IGEgYGBkaWN0YGAgY29udGFpbmluZyBhbiBlbmNvZGluZyBhbmQgaXRzIGNvbmZpZGVuY2UsIHlvdSBjYW4gc2ltcGx5CiAgICBydW46CgogICAgLi4gY29kZTo6CgogICAgICAgICAgICB1ID0gVW5pdmVyc2FsRGV0ZWN0b3IoKQogICAgICAgICAgICB1LmZlZWQoc29tZV9ieXRlcykKICAgICAgICAgICAgdS5jbG9zZSgpCiAgICAgICAgICAgIGRldGVjdGVkID0gdS5yZXN1bHQKCiAgICAiIiIKCiAgICBNSU5JTVVNX1RIUkVTSE9MRCA9IDAuMjAKICAgIEhJR0hfQllURV9ERVRFQ1RPUiA9IHJlLmNvbXBpbGUoYidbXHg4MC1ceEZGXScpCiAgICBFU0NfREVURUNUT1IgPSByZS5jb21waWxlKGInKFwwMzN8fnspJykKICAgIFdJTl9CWVRFX0RFVEVDVE9SID0gcmUuY29tcGlsZShiJ1tceDgwLVx4OUZdJykKICAgIElTT19XSU5fTUFQID0geydpc28tODg1OS0xJzogJ1dpbmRvd3MtMTI1MicsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMic6ICdXaW5kb3dzLTEyNTAnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTUnOiAnV2luZG93cy0xMjUxJywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS02JzogJ1dpbmRvd3MtMTI1NicsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktNyc6ICdXaW5kb3dzLTEyNTMnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTgnOiAnV2luZG93cy0xMjU1JywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS05JzogJ1dpbmRvd3MtMTI1NCcsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMTMnOiAnV2luZG93cy0xMjU3J30KCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9TGFuZ3VhZ2VGaWx0ZXIuQUxMKToKICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIgPSBOb25lCiAgICAgICAgc2VsZi5fY2hhcnNldF9wcm9iZXJzID0gW10KICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKICAgICAgICBzZWxmLmRvbmUgPSBOb25lCiAgICAgICAgc2VsZi5fZ290X2RhdGEgPSBOb25lCiAgICAgICAgc2VsZi5faW5wdXRfc3RhdGUgPSBOb25lCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyID0gTm9uZQogICAgICAgIHNlbGYubGFuZ19maWx0ZXIgPSBsYW5nX2ZpbHRlcgogICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAgICAgICAgc2VsZi5faGFzX3dpbl9ieXRlcyA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzZXQgdGhlIFVuaXZlcnNhbERldGVjdG9yIGFuZCBhbGwgb2YgaXRzIHByb2JlcnMgYmFjayB0byB0aGVpcgogICAgICAgIGluaXRpYWwgc3RhdGVzLiAgVGhpcyBpcyBjYWxsZWQgYnkgYGBfX2luaXRfX2BgLCBzbyB5b3Ugb25seSBuZWVkIHRvCiAgICAgICAgY2FsbCB0aGlzIGRpcmVjdGx5IGluIGJldHdlZW4gYW5hbHlzZXMgb2YgZGlmZmVyZW50IGRvY3VtZW50cy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiBOb25lLCAnY29uZmlkZW5jZSc6IDAuMCwgJ2xhbmd1YWdlJzogTm9uZX0KICAgICAgICBzZWxmLmRvbmUgPSBGYWxzZQogICAgICAgIHNlbGYuX2dvdF9kYXRhID0gRmFsc2UKICAgICAgICBzZWxmLl9oYXNfd2luX2J5dGVzID0gRmFsc2UKICAgICAgICBzZWxmLl9pbnB1dF9zdGF0ZSA9IElucHV0U3RhdGUuUFVSRV9BU0NJSQogICAgICAgIHNlbGYuX2xhc3RfY2hhciA9IGInJwogICAgICAgIGlmIHNlbGYuX2VzY19jaGFyc2V0X3Byb2JlcjoKICAgICAgICAgICAgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyLnJlc2V0KCkKICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgcHJvYmVyLnJlc2V0KCkKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZXMgYSBjaHVuayBvZiBhIGRvY3VtZW50IGFuZCBmZWVkcyBpdCB0aHJvdWdoIGFsbCBvZiB0aGUgcmVsZXZhbnQKICAgICAgICBjaGFyc2V0IHByb2JlcnMuCgogICAgICAgIEFmdGVyIGNhbGxpbmcgYGBmZWVkYGAsIHlvdSBjYW4gY2hlY2sgdGhlIHZhbHVlIG9mIHRoZSBgYGRvbmVgYAogICAgICAgIGF0dHJpYnV0ZSB0byBzZWUgaWYgeW91IG5lZWQgdG8gY29udGludWUgZmVlZGluZyB0aGUKICAgICAgICBgYFVuaXZlcnNhbERldGVjdG9yYGAgbW9yZSBkYXRhLCBvciBpZiBpdCBoYXMgbWFkZSBhIHByZWRpY3Rpb24KICAgICAgICAoaW4gdGhlIGBgcmVzdWx0YGAgYXR0cmlidXRlKS4KCiAgICAgICAgLi4gbm90ZTo6CiAgICAgICAgICAgWW91IHNob3VsZCBhbHdheXMgY2FsbCBgYGNsb3NlYGAgd2hlbiB5b3UncmUgZG9uZSBmZWVkaW5nIGluIHlvdXIKICAgICAgICAgICBkb2N1bWVudCBpZiBgYGRvbmVgYCBpcyBub3QgYWxyZWFkeSBgYFRydWVgYC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmRvbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBub3QgbGVuKGJ5dGVfc3RyKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ5dGVfc3RyLCBieXRlYXJyYXkpOgogICAgICAgICAgICBieXRlX3N0ciA9IGJ5dGVhcnJheShieXRlX3N0cikKCiAgICAgICAgIyBGaXJzdCBjaGVjayBmb3Iga25vd24gQk9Ncywgc2luY2UgdGhlc2UgYXJlIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdAogICAgICAgIGlmIG5vdCBzZWxmLl9nb3RfZGF0YToKICAgICAgICAgICAgIyBJZiB0aGUgZGF0YSBzdGFydHMgd2l0aCBCT00sIHdlIGtub3cgaXQgaXMgVVRGCiAgICAgICAgICAgIGlmIGJ5dGVfc3RyLnN0YXJ0c3dpdGgoY29kZWNzLkJPTV9VVEY4KToKICAgICAgICAgICAgICAgICMgRUYgQkIgQkYgIFVURi04IHdpdGggQk9NCiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAiVVRGLTgtU0lHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CiAgICAgICAgICAgIGVsaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aCgoY29kZWNzLkJPTV9VVEYzMl9MRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuQk9NX1VURjMyX0JFKSk6CiAgICAgICAgICAgICAgICAjIEZGIEZFIDAwIDAwICBVVEYtMzIsIGxpdHRsZS1lbmRpYW4gQk9NCiAgICAgICAgICAgICAgICAjIDAwIDAwIEZFIEZGICBVVEYtMzIsIGJpZy1lbmRpYW4gQk9NCiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAiVVRGLTMyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CiAgICAgICAgICAgIGVsaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aChiJ1x4RkVceEZGXHgwMFx4MDAnKToKICAgICAgICAgICAgICAgICMgRkUgRkYgMDAgMDAgIFVDUy00LCB1bnVzdWFsIG9jdGV0IG9yZGVyIEJPTSAoMzQxMikKICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICJYLUlTTy0xMDY0Ni1VQ1MtNC0zNDEyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CiAgICAgICAgICAgIGVsaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aChiJ1x4MDBceDAwXHhGRlx4RkUnKToKICAgICAgICAgICAgICAgICMgMDAgMDAgRkYgRkUgIFVDUy00LCB1bnVzdWFsIG9jdGV0IG9yZGVyIEJPTSAoMjE0MykKICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICJYLUlTTy0xMDY0Ni1VQ1MtNC0yMTQzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CiAgICAgICAgICAgIGVsaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aCgoY29kZWNzLkJPTV9MRSwgY29kZWNzLkJPTV9CRSkpOgogICAgICAgICAgICAgICAgIyBGRiBGRSAgVVRGLTE2LCBsaXR0bGUgZW5kaWFuIEJPTQogICAgICAgICAgICAgICAgIyBGRSBGRiAgVVRGLTE2LCBiaWcgZW5kaWFuIEJPTQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogIlVURi0xNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICcnfQoKICAgICAgICAgICAgc2VsZi5fZ290X2RhdGEgPSBUcnVlCiAgICAgICAgICAgIGlmIHNlbGYucmVzdWx0WydlbmNvZGluZyddIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5kb25lID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgSWYgbm9uZSBvZiB0aG9zZSBtYXRjaGVkIGFuZCB3ZSd2ZSBvbmx5IHNlZSBBU0NJSSBzbyBmYXIsIGNoZWNrCiAgICAgICAgIyBmb3IgaGlnaCBieXRlcyBhbmQgZXNjYXBlIHNlcXVlbmNlcwogICAgICAgIGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuUFVSRV9BU0NJSToKICAgICAgICAgICAgaWYgc2VsZi5ISUdIX0JZVEVfREVURUNUT1Iuc2VhcmNoKGJ5dGVfc3RyKToKICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0X3N0YXRlID0gSW5wdXRTdGF0ZS5ISUdIX0JZVEUKICAgICAgICAgICAgZWxpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLlBVUkVfQVNDSUkgYW5kIFwKICAgICAgICAgICAgICAgICAgICBzZWxmLkVTQ19ERVRFQ1RPUi5zZWFyY2goc2VsZi5fbGFzdF9jaGFyICsgYnl0ZV9zdHIpOgogICAgICAgICAgICAgICAgc2VsZi5faW5wdXRfc3RhdGUgPSBJbnB1dFN0YXRlLkVTQ19BU0NJSQoKICAgICAgICBzZWxmLl9sYXN0X2NoYXIgPSBieXRlX3N0clstMTpdCgogICAgICAgICMgSWYgd2UndmUgc2VlbiBlc2NhcGUgc2VxdWVuY2VzLCB1c2UgdGhlIEVzY0NoYXJTZXRQcm9iZXIsIHdoaWNoCiAgICAgICAgIyB1c2VzIGEgc2ltcGxlIHN0YXRlIG1hY2hpbmUgdG8gY2hlY2sgZm9yIGtub3duIGVzY2FwZSBzZXF1ZW5jZXMgaW4KICAgICAgICAjIEhaIGFuZCBJU08tMjAyMiBlbmNvZGluZ3MsIHNpbmNlIHRob3NlIGFyZSB0aGUgb25seSBlbmNvZGluZ3MgdGhhdAogICAgICAgICMgdXNlIHN1Y2ggc2VxdWVuY2VzLgogICAgICAgIGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuRVNDX0FTQ0lJOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyOgogICAgICAgICAgICAgICAgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyID0gRXNjQ2hhclNldFByb2JlcihzZWxmLmxhbmdfZmlsdGVyKQogICAgICAgICAgICBpZiBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIuZmVlZChieXRlX3N0cikgPT0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUOgogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2Jlci5jaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIubGFuZ3VhZ2V9CiAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCiAgICAgICAgIyBJZiB3ZSd2ZSBzZWVuIGhpZ2ggYnl0ZXMgKGkuZS4sIHRob3NlIHdpdGggdmFsdWVzIGdyZWF0ZXIgdGhhbiAxMjcpLAogICAgICAgICMgd2UgbmVlZCB0byBkbyBtb3JlIGNvbXBsaWNhdGVkIGNoZWNrcyB1c2luZyBhbGwgb3VyIG11bHRpLWJ5dGUgYW5kCiAgICAgICAgIyBzaW5nbGUtYnl0ZSBwcm9iZXJzIHRoYXQgYXJlIGxlZnQuICBUaGUgc2luZ2xlLWJ5dGUgcHJvYmVycwogICAgICAgICMgdXNlIGNoYXJhY3RlciBiaWdyYW0gZGlzdHJpYnV0aW9ucyB0byBkZXRlcm1pbmUgdGhlIGVuY29kaW5nLCB3aGVyZWFzCiAgICAgICAgIyB0aGUgbXVsdGktYnl0ZSBwcm9iZXJzIHVzZSBhIGNvbWJpbmF0aW9uIG9mIGNoYXJhY3RlciB1bmlncmFtIGFuZAogICAgICAgICMgYmlncmFtIGRpc3RyaWJ1dGlvbnMuCiAgICAgICAgZWxpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLkhJR0hfQllURToKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgICAgIHNlbGYuX2NoYXJzZXRfcHJvYmVycyA9IFtNQkNTR3JvdXBQcm9iZXIoc2VsZi5sYW5nX2ZpbHRlcildCiAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIGNoZWNraW5nIG5vbi1DSksgZW5jb2RpbmdzLCB1c2Ugc2luZ2xlLWJ5dGUgcHJvYmVyCiAgICAgICAgICAgICAgICBpZiBzZWxmLmxhbmdfZmlsdGVyICYgTGFuZ3VhZ2VGaWx0ZXIuTk9OX0NKSzoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGFyc2V0X3Byb2JlcnMuYXBwZW5kKFNCQ1NHcm91cFByb2JlcigpKQogICAgICAgICAgICAgICAgc2VsZi5fY2hhcnNldF9wcm9iZXJzLmFwcGVuZChMYXRpbjFQcm9iZXIoKSkKICAgICAgICAgICAgZm9yIHByb2JlciBpbiBzZWxmLl9jaGFyc2V0X3Byb2JlcnM6CiAgICAgICAgICAgICAgICBpZiBwcm9iZXIuZmVlZChieXRlX3N0cikgPT0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUOgogICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6IHByb2Jlci5jaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiBwcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiBwcm9iZXIubGFuZ3VhZ2V9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb25lID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIHNlbGYuV0lOX0JZVEVfREVURUNUT1Iuc2VhcmNoKGJ5dGVfc3RyKToKICAgICAgICAgICAgICAgIHNlbGYuX2hhc193aW5fYnl0ZXMgPSBUcnVlCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFN0b3AgYW5hbHl6aW5nIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZCBjb21lIHVwIHdpdGggYSBmaW5hbAogICAgICAgIHByZWRpY3Rpb24uCgogICAgICAgIDpyZXR1cm5zOiAgVGhlIGBgcmVzdWx0YGAgYXR0cmlidXRlLCBhIGBgZGljdGBgIHdpdGggdGhlIGtleXMKICAgICAgICAgICAgICAgICAgIGBlbmNvZGluZ2AsIGBjb25maWRlbmNlYCwgYW5kIGBsYW5ndWFnZWAuCiAgICAgICAgIiIiCiAgICAgICAgIyBEb24ndCBib3RoZXIgd2l0aCBjaGVja3MgaWYgd2UncmUgYWxyZWFkeSBkb25lCiAgICAgICAgaWYgc2VsZi5kb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXN1bHQKICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCgogICAgICAgIGlmIG5vdCBzZWxmLl9nb3RfZGF0YToKICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ25vIGRhdGEgcmVjZWl2ZWQhJykKCiAgICAgICAgIyBEZWZhdWx0IHRvIEFTQ0lJIGlmIGl0IGlzIGFsbCB3ZSd2ZSBzZWVuIHNvIGZhcgogICAgICAgIGVsaWYgc2VsZi5faW5wdXRfc3RhdGUgPT0gSW5wdXRTdGF0ZS5QVVJFX0FTQ0lJOgogICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAnYXNjaWknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CgogICAgICAgICMgSWYgd2UgaGF2ZSBzZWVuIG5vbi1BU0NJSSwgcmV0dXJuIHRoZSBiZXN0IHRoYXQgbWV0IE1JTklNVU1fVEhSRVNIT0xECiAgICAgICAgZWxpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLkhJR0hfQllURToKICAgICAgICAgICAgcHJvYmVyX2NvbmZpZGVuY2UgPSBOb25lCiAgICAgICAgICAgIG1heF9wcm9iZXJfY29uZmlkZW5jZSA9IDAuMAogICAgICAgICAgICBtYXhfcHJvYmVyID0gTm9uZQogICAgICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgICAgIGlmIG5vdCBwcm9iZXI6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHByb2Jlcl9jb25maWRlbmNlID0gcHJvYmVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgICAgIGlmIHByb2Jlcl9jb25maWRlbmNlID4gbWF4X3Byb2Jlcl9jb25maWRlbmNlOgogICAgICAgICAgICAgICAgICAgIG1heF9wcm9iZXJfY29uZmlkZW5jZSA9IHByb2Jlcl9jb25maWRlbmNlCiAgICAgICAgICAgICAgICAgICAgbWF4X3Byb2JlciA9IHByb2JlcgogICAgICAgICAgICBpZiBtYXhfcHJvYmVyIGFuZCAobWF4X3Byb2Jlcl9jb25maWRlbmNlID4gc2VsZi5NSU5JTVVNX1RIUkVTSE9MRCk6CiAgICAgICAgICAgICAgICBjaGFyc2V0X25hbWUgPSBtYXhfcHJvYmVyLmNoYXJzZXRfbmFtZQogICAgICAgICAgICAgICAgbG93ZXJfY2hhcnNldF9uYW1lID0gbWF4X3Byb2Jlci5jaGFyc2V0X25hbWUubG93ZXIoKQogICAgICAgICAgICAgICAgY29uZmlkZW5jZSA9IG1heF9wcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICAgICAgIyBVc2UgV2luZG93cyBlbmNvZGluZyBuYW1lIGluc3RlYWQgb2YgSVNPLTg4NTkgaWYgd2Ugc2F3IGFueQogICAgICAgICAgICAgICAgIyBleHRyYSBXaW5kb3dzLXNwZWNpZmljIGJ5dGVzCiAgICAgICAgICAgICAgICBpZiBsb3dlcl9jaGFyc2V0X25hbWUuc3RhcnRzd2l0aCgnaXNvLTg4NTknKToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9oYXNfd2luX2J5dGVzOgogICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0X25hbWUgPSBzZWxmLklTT19XSU5fTUFQLmdldChsb3dlcl9jaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRfbmFtZSkKICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6IGNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogY29uZmlkZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6IG1heF9wcm9iZXIubGFuZ3VhZ2V9CgogICAgICAgICMgTG9nIGFsbCBwcm9iZXIgY29uZmlkZW5jZXMgaWYgbm9uZSBtZXQgTUlOSU1VTV9USFJFU0hPTEQKICAgICAgICBpZiBzZWxmLmxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpID09IGxvZ2dpbmcuREVCVUc6CiAgICAgICAgICAgIGlmIHNlbGYucmVzdWx0WydlbmNvZGluZyddIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1Zygnbm8gcHJvYmVycyBoaXQgbWluaW11bSB0aHJlc2hvbGQnKQogICAgICAgICAgICAgICAgZm9yIGdyb3VwX3Byb2JlciBpbiBzZWxmLl9jaGFyc2V0X3Byb2JlcnM6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGdyb3VwX3Byb2JlcjoKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGdyb3VwX3Byb2JlciwgQ2hhclNldEdyb3VwUHJvYmVyKToKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHByb2JlciBpbiBncm91cF9wcm9iZXIucHJvYmVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBjb25maWRlbmNlID0gJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5sYW5ndWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5nZXRfY29uZmlkZW5jZSgpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBjb25maWRlbmNlID0gJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZXIuY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZXIubGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5nZXRfY29uZmlkZW5jZSgpKQogICAgICAgIHJldHVybiBzZWxmLnJlc3VsdApQSwMEFAAAAAAAAAAhAPW/vD3OCgAAzgoAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdXRmOHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUsIE1hY2hpbmVTdGF0ZQpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5tYmNzc20gaW1wb3J0IFVURjhfU01fTU9ERUwKCgoKY2xhc3MgVVRGOFByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgIE9ORV9DSEFSX1BST0IgPSAwLjUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoVVRGOFByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKFVURjhfU01fTU9ERUwpCiAgICAgICAgc2VsZi5fbnVtX21iX2NoYXJzID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihVVEY4UHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20ucmVzZXQoKQogICAgICAgIHNlbGYuX251bV9tYl9jaGFycyA9IDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJ1dGYtOCIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIiIKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIGMgaW4gYnl0ZV9zdHI6CiAgICAgICAgICAgIGNvZGluZ19zdGF0ZSA9IHNlbGYuY29kaW5nX3NtLm5leHRfc3RhdGUoYykKICAgICAgICAgICAgaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5FUlJPUjoKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLklUU19NRToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuU1RBUlQ6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmNvZGluZ19zbS5nZXRfY3VycmVudF9jaGFybGVuKCkgPj0gMjoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9udW1fbWJfY2hhcnMgKz0gMQoKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkc6CiAgICAgICAgICAgIGlmIHNlbGYuZ2V0X2NvbmZpZGVuY2UoKSA+IHNlbGYuU0hPUlRDVVRfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgdW5saWtlID0gMC45OQogICAgICAgIGlmIHNlbGYuX251bV9tYl9jaGFycyA8IDY6CiAgICAgICAgICAgIHVubGlrZSAqPSBzZWxmLk9ORV9DSEFSX1BST0IgKiogc2VsZi5fbnVtX21iX2NoYXJzCiAgICAgICAgICAgIHJldHVybiAxLjAgLSB1bmxpa2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdW5saWtlClBLAwQUAAAAAAAAACEAR8eQ1/IAAADyAAAAOwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC92ZXJzaW9uLnB5IiIiClRoaXMgbW9kdWxlIGV4aXN0cyBvbmx5IHRvIHNpbXBsaWZ5IHJldHJpZXZpbmcgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGNoYXJkZXQKZnJvbSB3aXRoaW4gc2V0dXAucHkgYW5kIGZyb20gY2hhcmRldCBzdWJwYWNrYWdlcy4KCjphdXRob3I6IERhbiBCbGFuY2hhcmQgKGRhbi5ibGFuY2hhcmRAZ21haWwuY29tKQoiIiIKCl9fdmVyc2lvbl9fID0gIjMuMC40IgpWRVJTSU9OID0gX192ZXJzaW9uX18uc3BsaXQoJy4nKQpQSwMEFAAAAAAAAAAhAFjUaTnwAAAA8AAAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL19faW5pdF9fLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KZnJvbSAuaW5pdGlhbGlzZSBpbXBvcnQgaW5pdCwgZGVpbml0LCByZWluaXQsIGNvbG9yYW1hX3RleHQKZnJvbSAuYW5zaSBpbXBvcnQgRm9yZSwgQmFjaywgU3R5bGUsIEN1cnNvcgpmcm9tIC5hbnNpdG93aW4zMiBpbXBvcnQgQW5zaVRvV2luMzIKCl9fdmVyc2lvbl9fID0gJzAuMy43JwoKUEsDBBQAAAAAAAAAIQA+Fadf3AkAANwJAAA5AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9hbnNpLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KJycnClRoaXMgbW9kdWxlIGdlbmVyYXRlcyBBTlNJIGNoYXJhY3RlciBjb2RlcyB0byBwcmludGluZyBjb2xvcnMgdG8gdGVybWluYWxzLgpTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZQonJycKCkNTSSA9ICdcMDMzWycKT1NDID0gJ1wwMzNdJwpCRUwgPSAnXDAwNycKCgpkZWYgY29kZV90b19jaGFycyhjb2RlKToKICAgIHJldHVybiBDU0kgKyBzdHIoY29kZSkgKyAnbScKCmRlZiBzZXRfdGl0bGUodGl0bGUpOgogICAgcmV0dXJuIE9TQyArICcyOycgKyB0aXRsZSArIEJFTAoKZGVmIGNsZWFyX3NjcmVlbihtb2RlPTIpOgogICAgcmV0dXJuIENTSSArIHN0cihtb2RlKSArICdKJwoKZGVmIGNsZWFyX2xpbmUobW9kZT0yKToKICAgIHJldHVybiBDU0kgKyBzdHIobW9kZSkgKyAnSycKCgpjbGFzcyBBbnNpQ29kZXMob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjIHRoZSBzdWJjbGFzc2VzIGRlY2xhcmUgY2xhc3MgYXR0cmlidXRlcyB3aGljaCBhcmUgbnVtYmVycy4KICAgICAgICAjIFVwb24gaW5zdGFudGlhdGlvbiB3ZSBkZWZpbmUgaW5zdGFuY2UgYXR0cmlidXRlcywgd2hpY2ggYXJlIHRoZSBzYW1lCiAgICAgICAgIyBhcyB0aGUgY2xhc3MgYXR0cmlidXRlcyBidXQgd3JhcHBlZCB3aXRoIHRoZSBBTlNJIGVzY2FwZSBzZXF1ZW5jZQogICAgICAgIGZvciBuYW1lIGluIGRpcihzZWxmKToKICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGNvZGVfdG9fY2hhcnModmFsdWUpKQoKCmNsYXNzIEFuc2lDdXJzb3Iob2JqZWN0KToKICAgIGRlZiBVUChzZWxmLCBuPTEpOgogICAgICAgIHJldHVybiBDU0kgKyBzdHIobikgKyAnQScKICAgIGRlZiBET1dOKHNlbGYsIG49MSk6CiAgICAgICAgcmV0dXJuIENTSSArIHN0cihuKSArICdCJwogICAgZGVmIEZPUldBUkQoc2VsZiwgbj0xKToKICAgICAgICByZXR1cm4gQ1NJICsgc3RyKG4pICsgJ0MnCiAgICBkZWYgQkFDSyhzZWxmLCBuPTEpOgogICAgICAgIHJldHVybiBDU0kgKyBzdHIobikgKyAnRCcKICAgIGRlZiBQT1Moc2VsZiwgeD0xLCB5PTEpOgogICAgICAgIHJldHVybiBDU0kgKyBzdHIoeSkgKyAnOycgKyBzdHIoeCkgKyAnSCcKCgpjbGFzcyBBbnNpRm9yZShBbnNpQ29kZXMpOgogICAgQkxBQ0sgICAgICAgICAgID0gMzAKICAgIFJFRCAgICAgICAgICAgICA9IDMxCiAgICBHUkVFTiAgICAgICAgICAgPSAzMgogICAgWUVMTE9XICAgICAgICAgID0gMzMKICAgIEJMVUUgICAgICAgICAgICA9IDM0CiAgICBNQUdFTlRBICAgICAgICAgPSAzNQogICAgQ1lBTiAgICAgICAgICAgID0gMzYKICAgIFdISVRFICAgICAgICAgICA9IDM3CiAgICBSRVNFVCAgICAgICAgICAgPSAzOQoKICAgICMgVGhlc2UgYXJlIGZhaXJseSB3ZWxsIHN1cHBvcnRlZCwgYnV0IG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZC4KICAgIExJR0hUQkxBQ0tfRVggICA9IDkwCiAgICBMSUdIVFJFRF9FWCAgICAgPSA5MQogICAgTElHSFRHUkVFTl9FWCAgID0gOTIKICAgIExJR0hUWUVMTE9XX0VYICA9IDkzCiAgICBMSUdIVEJMVUVfRVggICAgPSA5NAogICAgTElHSFRNQUdFTlRBX0VYID0gOTUKICAgIExJR0hUQ1lBTl9FWCAgICA9IDk2CiAgICBMSUdIVFdISVRFX0VYICAgPSA5NwoKCmNsYXNzIEFuc2lCYWNrKEFuc2lDb2Rlcyk6CiAgICBCTEFDSyAgICAgICAgICAgPSA0MAogICAgUkVEICAgICAgICAgICAgID0gNDEKICAgIEdSRUVOICAgICAgICAgICA9IDQyCiAgICBZRUxMT1cgICAgICAgICAgPSA0MwogICAgQkxVRSAgICAgICAgICAgID0gNDQKICAgIE1BR0VOVEEgICAgICAgICA9IDQ1CiAgICBDWUFOICAgICAgICAgICAgPSA0NgogICAgV0hJVEUgICAgICAgICAgID0gNDcKICAgIFJFU0VUICAgICAgICAgICA9IDQ5CgogICAgIyBUaGVzZSBhcmUgZmFpcmx5IHdlbGwgc3VwcG9ydGVkLCBidXQgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgogICAgTElHSFRCTEFDS19FWCAgID0gMTAwCiAgICBMSUdIVFJFRF9FWCAgICAgPSAxMDEKICAgIExJR0hUR1JFRU5fRVggICA9IDEwMgogICAgTElHSFRZRUxMT1dfRVggID0gMTAzCiAgICBMSUdIVEJMVUVfRVggICAgPSAxMDQKICAgIExJR0hUTUFHRU5UQV9FWCA9IDEwNQogICAgTElHSFRDWUFOX0VYICAgID0gMTA2CiAgICBMSUdIVFdISVRFX0VYICAgPSAxMDcKCgpjbGFzcyBBbnNpU3R5bGUoQW5zaUNvZGVzKToKICAgIEJSSUdIVCAgICA9IDEKICAgIERJTSAgICAgICA9IDIKICAgIE5PUk1BTCAgICA9IDIyCiAgICBSRVNFVF9BTEwgPSAwCgpGb3JlICAgPSBBbnNpRm9yZSgpCkJhY2sgICA9IEFuc2lCYWNrKCkKU3R5bGUgID0gQW5zaVN0eWxlKCkKQ3Vyc29yID0gQW5zaUN1cnNvcigpClBLAwQUAAAAAAAAACEAx2PA2cQlAADEJQAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaXRvd2luMzIucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgb3MKCmZyb20gLmFuc2kgaW1wb3J0IEFuc2lGb3JlLCBBbnNpQmFjaywgQW5zaVN0eWxlLCBTdHlsZQpmcm9tIC53aW50ZXJtIGltcG9ydCBXaW5UZXJtLCBXaW5Db2xvciwgV2luU3R5bGUKZnJvbSAud2luMzIgaW1wb3J0IHdpbmRsbCwgd2luYXBpX3Rlc3QKCgp3aW50ZXJtID0gTm9uZQppZiB3aW5kbGwgaXMgbm90IE5vbmU6CiAgICB3aW50ZXJtID0gV2luVGVybSgpCgoKZGVmIGlzX3N0cmVhbV9jbG9zZWQoc3RyZWFtKToKICAgIHJldHVybiBub3QgaGFzYXR0cihzdHJlYW0sICdjbG9zZWQnKSBvciBzdHJlYW0uY2xvc2VkCgoKZGVmIGlzX2FfdHR5KHN0cmVhbSk6CiAgICByZXR1cm4gaGFzYXR0cihzdHJlYW0sICdpc2F0dHknKSBhbmQgc3RyZWFtLmlzYXR0eSgpCgoKY2xhc3MgU3RyZWFtV3JhcHBlcihvYmplY3QpOgogICAgJycnCiAgICBXcmFwcyBhIHN0cmVhbSAoc3VjaCBhcyBzdGRvdXQpLCBhY3RpbmcgYXMgYSB0cmFuc3BhcmVudCBwcm94eSBmb3IgYWxsCiAgICBhdHRyaWJ1dGUgYWNjZXNzIGFwYXJ0IGZyb20gbWV0aG9kICd3cml0ZSgpJywgd2hpY2ggaXMgZGVsZWdhdGVkIHRvIG91cgogICAgQ29udmVydGVyIGluc3RhbmNlLgogICAgJycnCiAgICBkZWYgX19pbml0X18oc2VsZiwgd3JhcHBlZCwgY29udmVydGVyKToKICAgICAgICAjIGRvdWJsZS11bmRlcnNjb3JlIGV2ZXJ5dGhpbmcgdG8gcHJldmVudCBjbGFzaGVzIHdpdGggbmFtZXMgb2YKICAgICAgICAjIGF0dHJpYnV0ZXMgb24gdGhlIHdyYXBwZWQgc3RyZWFtIG9iamVjdC4KICAgICAgICBzZWxmLl9fd3JhcHBlZCA9IHdyYXBwZWQKICAgICAgICBzZWxmLl9fY29udmVydG9yID0gY29udmVydGVyCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX193cmFwcGVkLCBuYW1lKQoKICAgIGRlZiB3cml0ZShzZWxmLCB0ZXh0KToKICAgICAgICBzZWxmLl9fY29udmVydG9yLndyaXRlKHRleHQpCgoKY2xhc3MgQW5zaVRvV2luMzIob2JqZWN0KToKICAgICcnJwogICAgSW1wbGVtZW50cyBhICd3cml0ZSgpJyBtZXRob2Qgd2hpY2gsIG9uIFdpbmRvd3MsIHdpbGwgc3RyaXAgQU5TSSBjaGFyYWN0ZXIKICAgIHNlcXVlbmNlcyBmcm9tIHRoZSB0ZXh0LCBhbmQgaWYgb3V0cHV0dGluZyB0byBhIHR0eSwgd2lsbCBjb252ZXJ0IHRoZW0gaW50bwogICAgd2luMzIgZnVuY3Rpb24gY2FsbHMuCiAgICAnJycKICAgIEFOU0lfQ1NJX1JFID0gcmUuY29tcGlsZSgnXDAwMT9cMDMzXFsoKD86XGR8OykqKShbYS16QS1aXSlcMDAyPycpICAgICAjIENvbnRyb2wgU2VxdWVuY2UgSW50cm9kdWNlcgogICAgQU5TSV9PU0NfUkUgPSByZS5jb21waWxlKCdcMDAxP1wwMzNcXSgoPzoufDspKj8pKFx4MDcpXDAwMj8nKSAgICAgICAgICMgT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdyYXBwZWQsIGNvbnZlcnQ9Tm9uZSwgc3RyaXA9Tm9uZSwgYXV0b3Jlc2V0PUZhbHNlKToKICAgICAgICAjIFRoZSB3cmFwcGVkIHN0cmVhbSAobm9ybWFsbHkgc3lzLnN0ZG91dCBvciBzeXMuc3RkZXJyKQogICAgICAgIHNlbGYud3JhcHBlZCA9IHdyYXBwZWQKCiAgICAgICAgIyBzaG91bGQgd2UgcmVzZXQgY29sb3JzIHRvIGRlZmF1bHRzIGFmdGVyIGV2ZXJ5IC53cml0ZSgpCiAgICAgICAgc2VsZi5hdXRvcmVzZXQgPSBhdXRvcmVzZXQKCiAgICAgICAgIyBjcmVhdGUgdGhlIHByb3h5IHdyYXBwaW5nIG91ciBvdXRwdXQgc3RyZWFtCiAgICAgICAgc2VsZi5zdHJlYW0gPSBTdHJlYW1XcmFwcGVyKHdyYXBwZWQsIHNlbGYpCgogICAgICAgIG9uX3dpbmRvd3MgPSBvcy5uYW1lID09ICdudCcKICAgICAgICAjIFdlIHRlc3QgaWYgdGhlIFdpbkFQSSB3b3JrcywgYmVjYXVzZSBldmVuIGlmIHdlIGFyZSBvbiBXaW5kb3dzCiAgICAgICAgIyB3ZSBtYXkgYmUgdXNpbmcgYSB0ZXJtaW5hbCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgV2luQVBJCiAgICAgICAgIyAoZS5nLiBDeWd3aW4gVGVybWluYWwpLiBJbiB0aGlzIGNhc2UgaXQncyB1cCB0byB0aGUgdGVybWluYWwKICAgICAgICAjIHRvIHN1cHBvcnQgdGhlIEFOU0kgY29kZXMuCiAgICAgICAgY29udmVyc2lvbl9zdXBwb3J0ZWQgPSBvbl93aW5kb3dzIGFuZCB3aW5hcGlfdGVzdCgpCgogICAgICAgICMgc2hvdWxkIHdlIHN0cmlwIEFOU0kgc2VxdWVuY2VzIGZyb20gb3VyIG91dHB1dD8KICAgICAgICBpZiBzdHJpcCBpcyBOb25lOgogICAgICAgICAgICBzdHJpcCA9IGNvbnZlcnNpb25fc3VwcG9ydGVkIG9yIChub3QgaXNfc3RyZWFtX2Nsb3NlZCh3cmFwcGVkKSBhbmQgbm90IGlzX2FfdHR5KHdyYXBwZWQpKQogICAgICAgIHNlbGYuc3RyaXAgPSBzdHJpcAoKICAgICAgICAjIHNob3VsZCB3ZSBzaG91bGQgY29udmVydCBBTlNJIHNlcXVlbmNlcyBpbnRvIHdpbjMyIGNhbGxzPwogICAgICAgIGlmIGNvbnZlcnQgaXMgTm9uZToKICAgICAgICAgICAgY29udmVydCA9IGNvbnZlcnNpb25fc3VwcG9ydGVkIGFuZCBub3QgaXNfc3RyZWFtX2Nsb3NlZCh3cmFwcGVkKSBhbmQgaXNfYV90dHkod3JhcHBlZCkKICAgICAgICBzZWxmLmNvbnZlcnQgPSBjb252ZXJ0CgogICAgICAgICMgZGljdCBvZiBhbnNpIGNvZGVzIHRvIHdpbjMyIGZ1bmN0aW9ucyBhbmQgcGFyYW1ldGVycwogICAgICAgIHNlbGYud2luMzJfY2FsbHMgPSBzZWxmLmdldF93aW4zMl9jYWxscygpCgogICAgICAgICMgYXJlIHdlIHdyYXBwaW5nIHN0ZGVycj8KICAgICAgICBzZWxmLm9uX3N0ZGVyciA9IHNlbGYud3JhcHBlZCBpcyBzeXMuc3RkZXJyCgogICAgZGVmIHNob3VsZF93cmFwKHNlbGYpOgogICAgICAgICcnJwogICAgICAgIFRydWUgaWYgdGhpcyBjbGFzcyBpcyBhY3R1YWxseSBuZWVkZWQuIElmIGZhbHNlLCB0aGVuIHRoZSBvdXRwdXQKICAgICAgICBzdHJlYW0gd2lsbCBub3QgYmUgYWZmZWN0ZWQsIG5vciB3aWxsIHdpbjMyIGNhbGxzIGJlIGlzc3VlZCwgc28KICAgICAgICB3cmFwcGluZyBzdGRvdXQgaXMgbm90IGFjdHVhbGx5IHJlcXVpcmVkLiBUaGlzIHdpbGwgZ2VuZXJhbGx5IGJlCiAgICAgICAgRmFsc2Ugb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB1bmxlc3Mgb3B0aW9uYWwgZnVuY3Rpb25hbGl0eSBsaWtlCiAgICAgICAgYXV0b3Jlc2V0IGhhcyBiZWVuIHJlcXVlc3RlZCB1c2luZyBrd2FyZ3MgdG8gaW5pdCgpCiAgICAgICAgJycnCiAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydCBvciBzZWxmLnN0cmlwIG9yIHNlbGYuYXV0b3Jlc2V0CgogICAgZGVmIGdldF93aW4zMl9jYWxscyhzZWxmKToKICAgICAgICBpZiBzZWxmLmNvbnZlcnQgYW5kIHdpbnRlcm06CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBBbnNpU3R5bGUuUkVTRVRfQUxMOiAod2ludGVybS5yZXNldF9hbGwsICksCiAgICAgICAgICAgICAgICBBbnNpU3R5bGUuQlJJR0hUOiAod2ludGVybS5zdHlsZSwgV2luU3R5bGUuQlJJR0hUKSwKICAgICAgICAgICAgICAgIEFuc2lTdHlsZS5ESU06ICh3aW50ZXJtLnN0eWxlLCBXaW5TdHlsZS5OT1JNQUwpLAogICAgICAgICAgICAgICAgQW5zaVN0eWxlLk5PUk1BTDogKHdpbnRlcm0uc3R5bGUsIFdpblN0eWxlLk5PUk1BTCksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5CTEFDSzogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQkxBQ0spLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuUkVEOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5SRUQpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuR1JFRU46ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkdSRUVOKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLllFTExPVzogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuWUVMTE9XKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkJMVUU6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkJMVUUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTUFHRU5UQTogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuTUFHRU5UQSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5DWUFOOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5DWUFOKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLldISVRFOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5HUkVZKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLlJFU0VUOiAod2ludGVybS5mb3JlLCApLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRCTEFDS19FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQkxBQ0ssIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRSRURfRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLlJFRCwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVEdSRUVOX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5HUkVFTiwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVFlFTExPV19FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuWUVMTE9XLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUQkxVRV9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQkxVRSwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVE1BR0VOVEFfRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLk1BR0VOVEEsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRDWUFOX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5DWUFOLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUV0hJVEVfRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkdSRVksIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suQkxBQ0s6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkJMQUNLKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLlJFRDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuUkVEKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkdSRUVOOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5HUkVFTiksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5ZRUxMT1c6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLllFTExPVyksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5CTFVFOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5CTFVFKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLk1BR0VOVEE6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLk1BR0VOVEEpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suQ1lBTjogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQ1lBTiksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5XSElURTogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuR1JFWSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5SRVNFVDogKHdpbnRlcm0uYmFjaywgKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUQkxBQ0tfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkJMQUNLLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUUkVEX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5SRUQsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRHUkVFTl9FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuR1JFRU4sIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRZRUxMT1dfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLllFTExPVywgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVEJMVUVfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkJMVUUsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRNQUdFTlRBX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5NQUdFTlRBLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUQ1lBTl9FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQ1lBTiwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVFdISVRFX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5HUkVZLCBUcnVlKSwKICAgICAgICAgICAgfQogICAgICAgIHJldHVybiBkaWN0KCkKCiAgICBkZWYgd3JpdGUoc2VsZiwgdGV4dCk6CiAgICAgICAgaWYgc2VsZi5zdHJpcCBvciBzZWxmLmNvbnZlcnQ6CiAgICAgICAgICAgIHNlbGYud3JpdGVfYW5kX2NvbnZlcnQodGV4dCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndyYXBwZWQud3JpdGUodGV4dCkKICAgICAgICAgICAgc2VsZi53cmFwcGVkLmZsdXNoKCkKICAgICAgICBpZiBzZWxmLmF1dG9yZXNldDoKICAgICAgICAgICAgc2VsZi5yZXNldF9hbGwoKQoKCiAgICBkZWYgcmVzZXRfYWxsKHNlbGYpOgogICAgICAgIGlmIHNlbGYuY29udmVydDoKICAgICAgICAgICAgc2VsZi5jYWxsX3dpbjMyKCdtJywgKDAsKSkKICAgICAgICBlbGlmIG5vdCBzZWxmLnN0cmlwIGFuZCBub3QgaXNfc3RyZWFtX2Nsb3NlZChzZWxmLndyYXBwZWQpOgogICAgICAgICAgICBzZWxmLndyYXBwZWQud3JpdGUoU3R5bGUuUkVTRVRfQUxMKQoKCiAgICBkZWYgd3JpdGVfYW5kX2NvbnZlcnQoc2VsZiwgdGV4dCk6CiAgICAgICAgJycnCiAgICAgICAgV3JpdGUgdGhlIGdpdmVuIHRleHQgdG8gb3VyIHdyYXBwZWQgc3RyZWFtLCBzdHJpcHBpbmcgYW55IEFOU0kKICAgICAgICBzZXF1ZW5jZXMgZnJvbSB0aGUgdGV4dCwgYW5kIG9wdGlvbmFsbHkgY29udmVydGluZyB0aGVtIGludG8gd2luMzIKICAgICAgICBjYWxscy4KICAgICAgICAnJycKICAgICAgICBjdXJzb3IgPSAwCiAgICAgICAgdGV4dCA9IHNlbGYuY29udmVydF9vc2ModGV4dCkKICAgICAgICBmb3IgbWF0Y2ggaW4gc2VsZi5BTlNJX0NTSV9SRS5maW5kaXRlcih0ZXh0KToKICAgICAgICAgICAgc3RhcnQsIGVuZCA9IG1hdGNoLnNwYW4oKQogICAgICAgICAgICBzZWxmLndyaXRlX3BsYWluX3RleHQodGV4dCwgY3Vyc29yLCBzdGFydCkKICAgICAgICAgICAgc2VsZi5jb252ZXJ0X2Fuc2koKm1hdGNoLmdyb3VwcygpKQogICAgICAgICAgICBjdXJzb3IgPSBlbmQKICAgICAgICBzZWxmLndyaXRlX3BsYWluX3RleHQodGV4dCwgY3Vyc29yLCBsZW4odGV4dCkpCgoKICAgIGRlZiB3cml0ZV9wbGFpbl90ZXh0KHNlbGYsIHRleHQsIHN0YXJ0LCBlbmQpOgogICAgICAgIGlmIHN0YXJ0IDwgZW5kOgogICAgICAgICAgICBzZWxmLndyYXBwZWQud3JpdGUodGV4dFtzdGFydDplbmRdKQogICAgICAgICAgICBzZWxmLndyYXBwZWQuZmx1c2goKQoKCiAgICBkZWYgY29udmVydF9hbnNpKHNlbGYsIHBhcmFtc3RyaW5nLCBjb21tYW5kKToKICAgICAgICBpZiBzZWxmLmNvbnZlcnQ6CiAgICAgICAgICAgIHBhcmFtcyA9IHNlbGYuZXh0cmFjdF9wYXJhbXMoY29tbWFuZCwgcGFyYW1zdHJpbmcpCiAgICAgICAgICAgIHNlbGYuY2FsbF93aW4zMihjb21tYW5kLCBwYXJhbXMpCgoKICAgIGRlZiBleHRyYWN0X3BhcmFtcyhzZWxmLCBjb21tYW5kLCBwYXJhbXN0cmluZyk6CiAgICAgICAgaWYgY29tbWFuZCBpbiAnSGYnOgogICAgICAgICAgICBwYXJhbXMgPSB0dXBsZShpbnQocCkgaWYgbGVuKHApICE9IDAgZWxzZSAxIGZvciBwIGluIHBhcmFtc3RyaW5nLnNwbGl0KCc7JykpCiAgICAgICAgICAgIHdoaWxlIGxlbihwYXJhbXMpIDwgMjoKICAgICAgICAgICAgICAgICMgZGVmYXVsdHM6CiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgKyAoMSwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFyYW1zID0gdHVwbGUoaW50KHApIGZvciBwIGluIHBhcmFtc3RyaW5nLnNwbGl0KCc7JykgaWYgbGVuKHApICE9IDApCiAgICAgICAgICAgIGlmIGxlbihwYXJhbXMpID09IDA6CiAgICAgICAgICAgICAgICAjIGRlZmF1bHRzOgogICAgICAgICAgICAgICAgaWYgY29tbWFuZCBpbiAnSkttJzoKICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSAoMCwpCiAgICAgICAgICAgICAgICBlbGlmIGNvbW1hbmQgaW4gJ0FCQ0QnOgogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9ICgxLCkKCiAgICAgICAgcmV0dXJuIHBhcmFtcwoKCiAgICBkZWYgY2FsbF93aW4zMihzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgogICAgICAgIGlmIGNvbW1hbmQgPT0gJ20nOgogICAgICAgICAgICBmb3IgcGFyYW0gaW4gcGFyYW1zOgogICAgICAgICAgICAgICAgaWYgcGFyYW0gaW4gc2VsZi53aW4zMl9jYWxsczoKICAgICAgICAgICAgICAgICAgICBmdW5jX2FyZ3MgPSBzZWxmLndpbjMyX2NhbGxzW3BhcmFtXQogICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jX2FyZ3NbMF0KICAgICAgICAgICAgICAgICAgICBhcmdzID0gZnVuY19hcmdzWzE6XQogICAgICAgICAgICAgICAgICAgIGt3YXJncyA9IGRpY3Qob25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQogICAgICAgICAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGVsaWYgY29tbWFuZCBpbiAnSic6CiAgICAgICAgICAgIHdpbnRlcm0uZXJhc2Vfc2NyZWVuKHBhcmFtc1swXSwgb25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQogICAgICAgIGVsaWYgY29tbWFuZCBpbiAnSyc6CiAgICAgICAgICAgIHdpbnRlcm0uZXJhc2VfbGluZShwYXJhbXNbMF0sIG9uX3N0ZGVycj1zZWxmLm9uX3N0ZGVycikKICAgICAgICBlbGlmIGNvbW1hbmQgaW4gJ0hmJzogICAgICMgY3Vyc29yIHBvc2l0aW9uIC0gYWJzb2x1dGUKICAgICAgICAgICAgd2ludGVybS5zZXRfY3Vyc29yX3Bvc2l0aW9uKHBhcmFtcywgb25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQogICAgICAgIGVsaWYgY29tbWFuZCBpbiAnQUJDRCc6ICAgIyBjdXJzb3IgcG9zaXRpb24gLSByZWxhdGl2ZQogICAgICAgICAgICBuID0gcGFyYW1zWzBdCiAgICAgICAgICAgICMgQSAtIHVwLCBCIC0gZG93biwgQyAtIGZvcndhcmQsIEQgLSBiYWNrCiAgICAgICAgICAgIHgsIHkgPSB7J0EnOiAoMCwgLW4pLCAnQic6ICgwLCBuKSwgJ0MnOiAobiwgMCksICdEJzogKC1uLCAwKX1bY29tbWFuZF0KICAgICAgICAgICAgd2ludGVybS5jdXJzb3JfYWRqdXN0KHgsIHksIG9uX3N0ZGVycj1zZWxmLm9uX3N0ZGVycikKCgogICAgZGVmIGNvbnZlcnRfb3NjKHNlbGYsIHRleHQpOgogICAgICAgIGZvciBtYXRjaCBpbiBzZWxmLkFOU0lfT1NDX1JFLmZpbmRpdGVyKHRleHQpOgogICAgICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigpCiAgICAgICAgICAgIHRleHQgPSB0ZXh0WzpzdGFydF0gKyB0ZXh0W2VuZDpdCiAgICAgICAgICAgIHBhcmFtc3RyaW5nLCBjb21tYW5kID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgaWYgY29tbWFuZCBpbiAnXHgwNyc6ICAgICAgICMgXHgwNyA9IEJFTAogICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zdHJpbmcuc3BsaXQoIjsiKQogICAgICAgICAgICAgICAgIyAwIC0gY2hhbmdlIHRpdGxlIGFuZCBpY29uICh3ZSB3aWxsIG9ubHkgY2hhbmdlIHRpdGxlKQogICAgICAgICAgICAgICAgIyAxIC0gY2hhbmdlIGljb24gKHdlIGRvbid0IHN1cHBvcnQgdGhpcykKICAgICAgICAgICAgICAgICMgMiAtIGNoYW5nZSB0aXRsZQogICAgICAgICAgICAgICAgaWYgcGFyYW1zWzBdIGluICcwMic6CiAgICAgICAgICAgICAgICAgICAgd2ludGVybS5zZXRfdGl0bGUocGFyYW1zWzFdKQogICAgICAgIHJldHVybiB0ZXh0ClBLAwQUAAAAAAAAACEAfdbYL30HAAB9BwAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvaW5pdGlhbGlzZS5weSMgQ29weXJpZ2h0IEpvbmF0aGFuIEhhcnRsZXkgMjAxMy4gQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUuCmltcG9ydCBhdGV4aXQKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IHN5cwoKZnJvbSAuYW5zaXRvd2luMzIgaW1wb3J0IEFuc2lUb1dpbjMyCgoKb3JpZ19zdGRvdXQgPSBOb25lCm9yaWdfc3RkZXJyID0gTm9uZQoKd3JhcHBlZF9zdGRvdXQgPSBOb25lCndyYXBwZWRfc3RkZXJyID0gTm9uZQoKYXRleGl0X2RvbmUgPSBGYWxzZQoKCmRlZiByZXNldF9hbGwoKToKICAgIGlmIEFuc2lUb1dpbjMyIGlzIG5vdCBOb25lOiAgICAjIElzc3VlICM3NDogb2JqZWN0cyBtaWdodCBiZWNvbWUgTm9uZSBhdCBleGl0CiAgICAgICAgQW5zaVRvV2luMzIob3JpZ19zdGRvdXQpLnJlc2V0X2FsbCgpCgoKZGVmIGluaXQoYXV0b3Jlc2V0PUZhbHNlLCBjb252ZXJ0PU5vbmUsIHN0cmlwPU5vbmUsIHdyYXA9VHJ1ZSk6CgogICAgaWYgbm90IHdyYXAgYW5kIGFueShbYXV0b3Jlc2V0LCBjb252ZXJ0LCBzdHJpcF0pOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3dyYXA9RmFsc2UgY29uZmxpY3RzIHdpdGggYW55IG90aGVyIGFyZz1UcnVlJykKCiAgICBnbG9iYWwgd3JhcHBlZF9zdGRvdXQsIHdyYXBwZWRfc3RkZXJyCiAgICBnbG9iYWwgb3JpZ19zdGRvdXQsIG9yaWdfc3RkZXJyCgogICAgb3JpZ19zdGRvdXQgPSBzeXMuc3Rkb3V0CiAgICBvcmlnX3N0ZGVyciA9IHN5cy5zdGRlcnIKCiAgICBpZiBzeXMuc3Rkb3V0IGlzIE5vbmU6CiAgICAgICAgd3JhcHBlZF9zdGRvdXQgPSBOb25lCiAgICBlbHNlOgogICAgICAgIHN5cy5zdGRvdXQgPSB3cmFwcGVkX3N0ZG91dCA9IFwKICAgICAgICAgICAgd3JhcF9zdHJlYW0ob3JpZ19zdGRvdXQsIGNvbnZlcnQsIHN0cmlwLCBhdXRvcmVzZXQsIHdyYXApCiAgICBpZiBzeXMuc3RkZXJyIGlzIE5vbmU6CiAgICAgICAgd3JhcHBlZF9zdGRlcnIgPSBOb25lCiAgICBlbHNlOgogICAgICAgIHN5cy5zdGRlcnIgPSB3cmFwcGVkX3N0ZGVyciA9IFwKICAgICAgICAgICAgd3JhcF9zdHJlYW0ob3JpZ19zdGRlcnIsIGNvbnZlcnQsIHN0cmlwLCBhdXRvcmVzZXQsIHdyYXApCgogICAgZ2xvYmFsIGF0ZXhpdF9kb25lCiAgICBpZiBub3QgYXRleGl0X2RvbmU6CiAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHJlc2V0X2FsbCkKICAgICAgICBhdGV4aXRfZG9uZSA9IFRydWUKCgpkZWYgZGVpbml0KCk6CiAgICBpZiBvcmlnX3N0ZG91dCBpcyBub3QgTm9uZToKICAgICAgICBzeXMuc3Rkb3V0ID0gb3JpZ19zdGRvdXQKICAgIGlmIG9yaWdfc3RkZXJyIGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5zdGRlcnIgPSBvcmlnX3N0ZGVycgoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBjb2xvcmFtYV90ZXh0KCphcmdzLCAqKmt3YXJncyk6CiAgICBpbml0KCphcmdzLCAqKmt3YXJncykKICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBkZWluaXQoKQoKCmRlZiByZWluaXQoKToKICAgIGlmIHdyYXBwZWRfc3Rkb3V0IGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5zdGRvdXQgPSB3cmFwcGVkX3N0ZG91dAogICAgaWYgd3JhcHBlZF9zdGRlcnIgaXMgbm90IE5vbmU6CiAgICAgICAgc3lzLnN0ZGVyciA9IHdyYXBwZWRfc3RkZXJyCgoKZGVmIHdyYXBfc3RyZWFtKHN0cmVhbSwgY29udmVydCwgc3RyaXAsIGF1dG9yZXNldCwgd3JhcCk6CiAgICBpZiB3cmFwOgogICAgICAgIHdyYXBwZXIgPSBBbnNpVG9XaW4zMihzdHJlYW0sCiAgICAgICAgICAgIGNvbnZlcnQ9Y29udmVydCwgc3RyaXA9c3RyaXAsIGF1dG9yZXNldD1hdXRvcmVzZXQpCiAgICAgICAgaWYgd3JhcHBlci5zaG91bGRfd3JhcCgpOgogICAgICAgICAgICBzdHJlYW0gPSB3cmFwcGVyLnN0cmVhbQogICAgcmV0dXJuIHN0cmVhbQoKClBLAwQUAAAAAAAAACEADW2iPfUUAAD1FAAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvd2luMzIucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgoKIyBmcm9tIHdpbmJhc2UuaApTVERPVVQgPSAtMTEKU1RERVJSID0gLTEyCgp0cnk6CiAgICBpbXBvcnQgY3R5cGVzCiAgICBmcm9tIGN0eXBlcyBpbXBvcnQgTGlicmFyeUxvYWRlcgogICAgd2luZGxsID0gTGlicmFyeUxvYWRlcihjdHlwZXMuV2luRExMKQogICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbnR5cGVzCmV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIEltcG9ydEVycm9yKToKICAgIHdpbmRsbCA9IE5vbmUKICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlID0gbGFtYmRhICpfOiBOb25lCiAgICB3aW5hcGlfdGVzdCA9IGxhbWJkYSAqXzogTm9uZQplbHNlOgogICAgZnJvbSBjdHlwZXMgaW1wb3J0IGJ5cmVmLCBTdHJ1Y3R1cmUsIGNfY2hhciwgUE9JTlRFUgoKICAgIENPT1JEID0gd2ludHlwZXMuX0NPT1JECgogICAgY2xhc3MgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8oU3RydWN0dXJlKToKICAgICAgICAiIiJzdHJ1Y3QgaW4gd2luY29uLmguIiIiCiAgICAgICAgX2ZpZWxkc18gPSBbCiAgICAgICAgICAgICgiZHdTaXplIiwgQ09PUkQpLAogICAgICAgICAgICAoImR3Q3Vyc29yUG9zaXRpb24iLCBDT09SRCksCiAgICAgICAgICAgICgid0F0dHJpYnV0ZXMiLCB3aW50eXBlcy5XT1JEKSwKICAgICAgICAgICAgKCJzcldpbmRvdyIsIHdpbnR5cGVzLlNNQUxMX1JFQ1QpLAogICAgICAgICAgICAoImR3TWF4aW11bVdpbmRvd1NpemUiLCBDT09SRCksCiAgICAgICAgXQogICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gJyglZCwlZCwlZCwlZCwlZCwlZCwlZCwlZCwlZCwlZCwlZCknICUgKAogICAgICAgICAgICAgICAgc2VsZi5kd1NpemUuWSwgc2VsZi5kd1NpemUuWAogICAgICAgICAgICAgICAgLCBzZWxmLmR3Q3Vyc29yUG9zaXRpb24uWSwgc2VsZi5kd0N1cnNvclBvc2l0aW9uLlgKICAgICAgICAgICAgICAgICwgc2VsZi53QXR0cmlidXRlcwogICAgICAgICAgICAgICAgLCBzZWxmLnNyV2luZG93LlRvcCwgc2VsZi5zcldpbmRvdy5MZWZ0LCBzZWxmLnNyV2luZG93LkJvdHRvbSwgc2VsZi5zcldpbmRvdy5SaWdodAogICAgICAgICAgICAgICAgLCBzZWxmLmR3TWF4aW11bVdpbmRvd1NpemUuWSwgc2VsZi5kd01heGltdW1XaW5kb3dTaXplLlgKICAgICAgICAgICAgKQoKICAgIF9HZXRTdGRIYW5kbGUgPSB3aW5kbGwua2VybmVsMzIuR2V0U3RkSGFuZGxlCiAgICBfR2V0U3RkSGFuZGxlLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkRXT1JELAogICAgXQogICAgX0dldFN0ZEhhbmRsZS5yZXN0eXBlID0gd2ludHlwZXMuSEFORExFCgogICAgX0dldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvID0gd2luZGxsLmtlcm5lbDMyLkdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvCiAgICBfR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8uYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuSEFORExFLAogICAgICAgIFBPSU5URVIoQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8pLAogICAgXQogICAgX0dldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCgogICAgX1NldENvbnNvbGVUZXh0QXR0cmlidXRlID0gd2luZGxsLmtlcm5lbDMyLlNldENvbnNvbGVUZXh0QXR0cmlidXRlCiAgICBfU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUuYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuSEFORExFLAogICAgICAgIHdpbnR5cGVzLldPUkQsCiAgICBdCiAgICBfU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBfU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uID0gd2luZGxsLmtlcm5lbDMyLlNldENvbnNvbGVDdXJzb3JQb3NpdGlvbgogICAgX1NldENvbnNvbGVDdXJzb3JQb3NpdGlvbi5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgQ09PUkQsCiAgICBdCiAgICBfU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCgogICAgX0ZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQSA9IHdpbmRsbC5rZXJuZWwzMi5GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEKICAgIF9GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEuYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuSEFORExFLAogICAgICAgIGNfY2hhciwKICAgICAgICB3aW50eXBlcy5EV09SRCwKICAgICAgICBDT09SRCwKICAgICAgICBQT0lOVEVSKHdpbnR5cGVzLkRXT1JEKSwKICAgIF0KICAgIF9GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBfRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUgPSB3aW5kbGwua2VybmVsMzIuRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUKICAgIF9GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZS5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgd2ludHlwZXMuV09SRCwKICAgICAgICB3aW50eXBlcy5EV09SRCwKICAgICAgICBDT09SRCwKICAgICAgICBQT0lOVEVSKHdpbnR5cGVzLkRXT1JEKSwKICAgIF0KICAgIF9GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZS5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIF9TZXRDb25zb2xlVGl0bGVXID0gd2luZGxsLmtlcm5lbDMyLlNldENvbnNvbGVUaXRsZUEKICAgIF9TZXRDb25zb2xlVGl0bGVXLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkxQQ1NUUgogICAgXQogICAgX1NldENvbnNvbGVUaXRsZVcucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBoYW5kbGVzID0gewogICAgICAgIFNURE9VVDogX0dldFN0ZEhhbmRsZShTVERPVVQpLAogICAgICAgIFNUREVSUjogX0dldFN0ZEhhbmRsZShTVERFUlIpLAogICAgfQoKICAgIGRlZiB3aW5hcGlfdGVzdCgpOgogICAgICAgIGhhbmRsZSA9IGhhbmRsZXNbU1RET1VUXQogICAgICAgIGNzYmkgPSBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTygpCiAgICAgICAgc3VjY2VzcyA9IF9HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbygKICAgICAgICAgICAgaGFuZGxlLCBieXJlZihjc2JpKSkKICAgICAgICByZXR1cm4gYm9vbChzdWNjZXNzKQoKICAgIGRlZiBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhzdHJlYW1faWQ9U1RET1VUKToKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICBjc2JpID0gQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8oKQogICAgICAgIHN1Y2Nlc3MgPSBfR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oCiAgICAgICAgICAgIGhhbmRsZSwgYnlyZWYoY3NiaSkpCiAgICAgICAgcmV0dXJuIGNzYmkKCiAgICBkZWYgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3RyZWFtX2lkLCBhdHRycyk6CiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tzdHJlYW1faWRdCiAgICAgICAgcmV0dXJuIF9TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShoYW5kbGUsIGF0dHJzKQoKICAgIGRlZiBTZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oc3RyZWFtX2lkLCBwb3NpdGlvbiwgYWRqdXN0PVRydWUpOgogICAgICAgIHBvc2l0aW9uID0gQ09PUkQoKnBvc2l0aW9uKQogICAgICAgICMgSWYgdGhlIHBvc2l0aW9uIGlzIG91dCBvZiByYW5nZSwgZG8gbm90aGluZy4KICAgICAgICBpZiBwb3NpdGlvbi5ZIDw9IDAgb3IgcG9zaXRpb24uWCA8PSAwOgogICAgICAgICAgICByZXR1cm4KICAgICAgICAjIEFkanVzdCBmb3IgV2luZG93cycgU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uOgogICAgICAgICMgICAgMS4gYmVpbmcgMC1iYXNlZCwgd2hpbGUgQU5TSSBpcyAxLWJhc2VkLgogICAgICAgICMgICAgMi4gZXhwZWN0aW5nICh4LHkpLCB3aGlsZSBBTlNJIHVzZXMgKHkseCkuCiAgICAgICAgYWRqdXN0ZWRfcG9zaXRpb24gPSBDT09SRChwb3NpdGlvbi5ZIC0gMSwgcG9zaXRpb24uWCAtIDEpCiAgICAgICAgaWYgYWRqdXN0OgogICAgICAgICAgICAjIEFkanVzdCBmb3Igdmlld3BvcnQncyBzY3JvbGwgcG9zaXRpb24KICAgICAgICAgICAgc3IgPSBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhTVERPVVQpLnNyV2luZG93CiAgICAgICAgICAgIGFkanVzdGVkX3Bvc2l0aW9uLlkgKz0gc3IuVG9wCiAgICAgICAgICAgIGFkanVzdGVkX3Bvc2l0aW9uLlggKz0gc3IuTGVmdAogICAgICAgICMgUmVzdW1lIG5vcm1hbCBwcm9jZXNzaW5nCiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tzdHJlYW1faWRdCiAgICAgICAgcmV0dXJuIF9TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oaGFuZGxlLCBhZGp1c3RlZF9wb3NpdGlvbikKCiAgICBkZWYgRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoc3RyZWFtX2lkLCBjaGFyLCBsZW5ndGgsIHN0YXJ0KToKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICBjaGFyID0gY19jaGFyKGNoYXIuZW5jb2RlKCkpCiAgICAgICAgbGVuZ3RoID0gd2ludHlwZXMuRFdPUkQobGVuZ3RoKQogICAgICAgIG51bV93cml0dGVuID0gd2ludHlwZXMuRFdPUkQoMCkKICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGlzIGhhcmQtY29kZWQgZm9yIEFOU0kgKHZzIHdpZGUpIGJ5dGVzLgogICAgICAgIHN1Y2Nlc3MgPSBfRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBKAogICAgICAgICAgICBoYW5kbGUsIGNoYXIsIGxlbmd0aCwgc3RhcnQsIGJ5cmVmKG51bV93cml0dGVuKSkKICAgICAgICByZXR1cm4gbnVtX3dyaXR0ZW4udmFsdWUKCiAgICBkZWYgRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoc3RyZWFtX2lkLCBhdHRyLCBsZW5ndGgsIHN0YXJ0KToKICAgICAgICAnJycgRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoIGhDb25zb2xlLCBjc2JpLndBdHRyaWJ1dGVzLCBkd0NvblNpemUsIGNvb3JkU2NyZWVuLCAmY0NoYXJzV3JpdHRlbiApJycnCiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tzdHJlYW1faWRdCiAgICAgICAgYXR0cmlidXRlID0gd2ludHlwZXMuV09SRChhdHRyKQogICAgICAgIGxlbmd0aCA9IHdpbnR5cGVzLkRXT1JEKGxlbmd0aCkKICAgICAgICBudW1fd3JpdHRlbiA9IHdpbnR5cGVzLkRXT1JEKDApCiAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBpcyBoYXJkLWNvZGVkIGZvciBBTlNJICh2cyB3aWRlKSBieXRlcy4KICAgICAgICByZXR1cm4gX0ZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKAogICAgICAgICAgICBoYW5kbGUsIGF0dHJpYnV0ZSwgbGVuZ3RoLCBzdGFydCwgYnlyZWYobnVtX3dyaXR0ZW4pKQoKICAgIGRlZiBTZXRDb25zb2xlVGl0bGUodGl0bGUpOgogICAgICAgIHJldHVybiBfU2V0Q29uc29sZVRpdGxlVyh0aXRsZSkKUEsDBBQAAAAAAAAAIQB3e2chkhgAAJIYAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS93aW50ZXJtLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KZnJvbSAuIGltcG9ydCB3aW4zMgoKCiMgZnJvbSB3aW5jb24uaApjbGFzcyBXaW5Db2xvcihvYmplY3QpOgogICAgQkxBQ0sgICA9IDAKICAgIEJMVUUgICAgPSAxCiAgICBHUkVFTiAgID0gMgogICAgQ1lBTiAgICA9IDMKICAgIFJFRCAgICAgPSA0CiAgICBNQUdFTlRBID0gNQogICAgWUVMTE9XICA9IDYKICAgIEdSRVkgICAgPSA3CgojIGZyb20gd2luY29uLmgKY2xhc3MgV2luU3R5bGUob2JqZWN0KToKICAgIE5PUk1BTCAgICAgICAgICAgICAgPSAweDAwICMgZGltIHRleHQsIGRpbSBiYWNrZ3JvdW5kCiAgICBCUklHSFQgICAgICAgICAgICAgID0gMHgwOCAjIGJyaWdodCB0ZXh0LCBkaW0gYmFja2dyb3VuZAogICAgQlJJR0hUX0JBQ0tHUk9VTkQgICA9IDB4ODAgIyBkaW0gdGV4dCwgYnJpZ2h0IGJhY2tncm91bmQKCmNsYXNzIFdpblRlcm0ob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fZGVmYXVsdCA9IHdpbjMyLkdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKHdpbjMyLlNURE9VVCkud0F0dHJpYnV0ZXMKICAgICAgICBzZWxmLnNldF9hdHRycyhzZWxmLl9kZWZhdWx0KQogICAgICAgIHNlbGYuX2RlZmF1bHRfZm9yZSA9IHNlbGYuX2ZvcmUKICAgICAgICBzZWxmLl9kZWZhdWx0X2JhY2sgPSBzZWxmLl9iYWNrCiAgICAgICAgc2VsZi5fZGVmYXVsdF9zdHlsZSA9IHNlbGYuX3N0eWxlCiAgICAgICAgIyBJbiBvcmRlciB0byBlbXVsYXRlIExJR0hUX0VYIGluIHdpbmRvd3MsIHdlIGJvcnJvdyB0aGUgQlJJR0hUIHN0eWxlLgogICAgICAgICMgU28gdGhhdCBMSUdIVF9FWCBjb2xvcnMgYW5kIEJSSUdIVCBzdHlsZSBkbyBub3QgY2xvYmJlciBlYWNoIG90aGVyLAogICAgICAgICMgd2UgdHJhY2sgdGhlbSBzZXBhcmF0ZWx5LCBzaW5jZSBMSUdIVF9FWCBpcyBvdmVyd3JpdHRlbiBieSBGb3JlL0JhY2sKICAgICAgICAjIGFuZCBCUklHSFQgaXMgb3ZlcndyaXR0ZW4gYnkgU3R5bGUgY29kZXMuCiAgICAgICAgc2VsZi5fbGlnaHQgPSAwCgogICAgZGVmIGdldF9hdHRycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZm9yZSArIHNlbGYuX2JhY2sgKiAxNiArIChzZWxmLl9zdHlsZSB8IHNlbGYuX2xpZ2h0KQoKICAgIGRlZiBzZXRfYXR0cnMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX2ZvcmUgPSB2YWx1ZSAmIDcKICAgICAgICBzZWxmLl9iYWNrID0gKHZhbHVlID4+IDQpICYgNwogICAgICAgIHNlbGYuX3N0eWxlID0gdmFsdWUgJiAoV2luU3R5bGUuQlJJR0hUIHwgV2luU3R5bGUuQlJJR0hUX0JBQ0tHUk9VTkQpCgogICAgZGVmIHJlc2V0X2FsbChzZWxmLCBvbl9zdGRlcnI9Tm9uZSk6CiAgICAgICAgc2VsZi5zZXRfYXR0cnMoc2VsZi5fZGVmYXVsdCkKICAgICAgICBzZWxmLnNldF9jb25zb2xlKGF0dHJzPXNlbGYuX2RlZmF1bHQpCgogICAgZGVmIGZvcmUoc2VsZiwgZm9yZT1Ob25lLCBsaWdodD1GYWxzZSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBpZiBmb3JlIGlzIE5vbmU6CiAgICAgICAgICAgIGZvcmUgPSBzZWxmLl9kZWZhdWx0X2ZvcmUKICAgICAgICBzZWxmLl9mb3JlID0gZm9yZQogICAgICAgICMgRW11bGF0ZSBMSUdIVF9FWCB3aXRoIEJSSUdIVCBTdHlsZQogICAgICAgIGlmIGxpZ2h0OgogICAgICAgICAgICBzZWxmLl9saWdodCB8PSBXaW5TdHlsZS5CUklHSFQKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9saWdodCAmPSB+V2luU3R5bGUuQlJJR0hUCiAgICAgICAgc2VsZi5zZXRfY29uc29sZShvbl9zdGRlcnI9b25fc3RkZXJyKQoKICAgIGRlZiBiYWNrKHNlbGYsIGJhY2s9Tm9uZSwgbGlnaHQ9RmFsc2UsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgaWYgYmFjayBpcyBOb25lOgogICAgICAgICAgICBiYWNrID0gc2VsZi5fZGVmYXVsdF9iYWNrCiAgICAgICAgc2VsZi5fYmFjayA9IGJhY2sKICAgICAgICAjIEVtdWxhdGUgTElHSFRfRVggd2l0aCBCUklHSFRfQkFDS0dST1VORCBTdHlsZQogICAgICAgIGlmIGxpZ2h0OgogICAgICAgICAgICBzZWxmLl9saWdodCB8PSBXaW5TdHlsZS5CUklHSFRfQkFDS0dST1VORAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2xpZ2h0ICY9IH5XaW5TdHlsZS5CUklHSFRfQkFDS0dST1VORAogICAgICAgIHNlbGYuc2V0X2NvbnNvbGUob25fc3RkZXJyPW9uX3N0ZGVycikKCiAgICBkZWYgc3R5bGUoc2VsZiwgc3R5bGU9Tm9uZSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBpZiBzdHlsZSBpcyBOb25lOgogICAgICAgICAgICBzdHlsZSA9IHNlbGYuX2RlZmF1bHRfc3R5bGUKICAgICAgICBzZWxmLl9zdHlsZSA9IHN0eWxlCiAgICAgICAgc2VsZi5zZXRfY29uc29sZShvbl9zdGRlcnI9b25fc3RkZXJyKQoKICAgIGRlZiBzZXRfY29uc29sZShzZWxmLCBhdHRycz1Ob25lLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGlmIGF0dHJzIGlzIE5vbmU6CiAgICAgICAgICAgIGF0dHJzID0gc2VsZi5nZXRfYXR0cnMoKQogICAgICAgIGhhbmRsZSA9IHdpbjMyLlNURE9VVAogICAgICAgIGlmIG9uX3N0ZGVycjoKICAgICAgICAgICAgaGFuZGxlID0gd2luMzIuU1RERVJSCiAgICAgICAgd2luMzIuU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoaGFuZGxlLCBhdHRycykKCiAgICBkZWYgZ2V0X3Bvc2l0aW9uKHNlbGYsIGhhbmRsZSk6CiAgICAgICAgcG9zaXRpb24gPSB3aW4zMi5HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhoYW5kbGUpLmR3Q3Vyc29yUG9zaXRpb24KICAgICAgICAjIEJlY2F1c2UgV2luZG93cyBjb29yZGluYXRlcyBhcmUgMC1iYXNlZCwKICAgICAgICAjIGFuZCB3aW4zMi5TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24gZXhwZWN0cyAxLWJhc2VkLgogICAgICAgIHBvc2l0aW9uLlggKz0gMQogICAgICAgIHBvc2l0aW9uLlkgKz0gMQogICAgICAgIHJldHVybiBwb3NpdGlvbgoKICAgIGRlZiBzZXRfY3Vyc29yX3Bvc2l0aW9uKHNlbGYsIHBvc2l0aW9uPU5vbmUsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgaWYgcG9zaXRpb24gaXMgTm9uZToKICAgICAgICAgICAgIyBJJ20gbm90IGN1cnJlbnRseSB0cmFja2luZyB0aGUgcG9zaXRpb24sIHNvIHRoZXJlIGlzIG5vIGRlZmF1bHQuCiAgICAgICAgICAgICMgcG9zaXRpb24gPSBzZWxmLmdldF9wb3NpdGlvbigpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGhhbmRsZSA9IHdpbjMyLlNURE9VVAogICAgICAgIGlmIG9uX3N0ZGVycjoKICAgICAgICAgICAgaGFuZGxlID0gd2luMzIuU1RERVJSCiAgICAgICAgd2luMzIuU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGhhbmRsZSwgcG9zaXRpb24pCgogICAgZGVmIGN1cnNvcl9hZGp1c3Qoc2VsZiwgeCwgeSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERPVVQKICAgICAgICBpZiBvbl9zdGRlcnI6CiAgICAgICAgICAgIGhhbmRsZSA9IHdpbjMyLlNUREVSUgogICAgICAgIHBvc2l0aW9uID0gc2VsZi5nZXRfcG9zaXRpb24oaGFuZGxlKQogICAgICAgIGFkanVzdGVkX3Bvc2l0aW9uID0gKHBvc2l0aW9uLlkgKyB5LCBwb3NpdGlvbi5YICsgeCkKICAgICAgICB3aW4zMi5TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oaGFuZGxlLCBhZGp1c3RlZF9wb3NpdGlvbiwgYWRqdXN0PUZhbHNlKQoKICAgIGRlZiBlcmFzZV9zY3JlZW4oc2VsZiwgbW9kZT0wLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgICMgMCBzaG91bGQgY2xlYXIgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIHNjcmVlbi4KICAgICAgICAjIDEgc2hvdWxkIGNsZWFyIGZyb20gdGhlIGN1cnNvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY3JlZW4uCiAgICAgICAgIyAyIHNob3VsZCBjbGVhciB0aGUgZW50aXJlIHNjcmVlbiwgYW5kIG1vdmUgY3Vyc29yIHRvICgxLDEpCiAgICAgICAgaGFuZGxlID0gd2luMzIuU1RET1VUCiAgICAgICAgaWYgb25fc3RkZXJyOgogICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERFUlIKICAgICAgICBjc2JpID0gd2luMzIuR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oaGFuZGxlKQogICAgICAgICMgZ2V0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIGNlbGxzIGluIHRoZSBjdXJyZW50IGJ1ZmZlcgogICAgICAgIGNlbGxzX2luX3NjcmVlbiA9IGNzYmkuZHdTaXplLlggKiBjc2JpLmR3U2l6ZS5ZCiAgICAgICAgIyBnZXQgbnVtYmVyIG9mIGNoYXJhY3RlciBjZWxscyBiZWZvcmUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KICAgICAgICBjZWxsc19iZWZvcmVfY3Vyc29yID0gY3NiaS5kd1NpemUuWCAqIGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5ZICsgY3NiaS5kd0N1cnNvclBvc2l0aW9uLlgKICAgICAgICBpZiBtb2RlID09IDA6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSBjc2JpLmR3Q3Vyc29yUG9zaXRpb24KICAgICAgICAgICAgY2VsbHNfdG9fZXJhc2UgPSBjZWxsc19pbl9zY3JlZW4gLSBjZWxsc19iZWZvcmVfY3Vyc29yCiAgICAgICAgaWYgbW9kZSA9PSAxOgogICAgICAgICAgICBmcm9tX2Nvb3JkID0gd2luMzIuQ09PUkQoMCwgMCkKICAgICAgICAgICAgY2VsbHNfdG9fZXJhc2UgPSBjZWxsc19iZWZvcmVfY3Vyc29yCiAgICAgICAgZWxpZiBtb2RlID09IDI6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSB3aW4zMi5DT09SRCgwLCAwKQogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNlbGxzX2luX3NjcmVlbgogICAgICAgICMgZmlsbCB0aGUgZW50aXJlIHNjcmVlbiB3aXRoIGJsYW5rcwogICAgICAgIHdpbjMyLkZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyKGhhbmRsZSwgJyAnLCBjZWxsc190b19lcmFzZSwgZnJvbV9jb29yZCkKICAgICAgICAjIG5vdyBzZXQgdGhlIGJ1ZmZlcidzIGF0dHJpYnV0ZXMgYWNjb3JkaW5nbHkKICAgICAgICB3aW4zMi5GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZShoYW5kbGUsIHNlbGYuZ2V0X2F0dHJzKCksIGNlbGxzX3RvX2VyYXNlLCBmcm9tX2Nvb3JkKQogICAgICAgIGlmIG1vZGUgPT0gMjoKICAgICAgICAgICAgIyBwdXQgdGhlIGN1cnNvciB3aGVyZSBuZWVkZWQKICAgICAgICAgICAgd2luMzIuU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGhhbmRsZSwgKDEsIDEpKQoKICAgIGRlZiBlcmFzZV9saW5lKHNlbGYsIG1vZGU9MCwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICAjIDAgc2hvdWxkIGNsZWFyIGZyb20gdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgogICAgICAgICMgMSBzaG91bGQgY2xlYXIgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuCiAgICAgICAgIyAyIHNob3VsZCBjbGVhciB0aGUgZW50aXJlIGxpbmUuCiAgICAgICAgaGFuZGxlID0gd2luMzIuU1RET1VUCiAgICAgICAgaWYgb25fc3RkZXJyOgogICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERFUlIKICAgICAgICBjc2JpID0gd2luMzIuR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oaGFuZGxlKQogICAgICAgIGlmIG1vZGUgPT0gMDoKICAgICAgICAgICAgZnJvbV9jb29yZCA9IGNzYmkuZHdDdXJzb3JQb3NpdGlvbgogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNzYmkuZHdTaXplLlggLSBjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWAogICAgICAgIGlmIG1vZGUgPT0gMToKICAgICAgICAgICAgZnJvbV9jb29yZCA9IHdpbjMyLkNPT1JEKDAsIGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5ZKQogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5YCiAgICAgICAgZWxpZiBtb2RlID09IDI6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSB3aW4zMi5DT09SRCgwLCBjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWSkKICAgICAgICAgICAgY2VsbHNfdG9fZXJhc2UgPSBjc2JpLmR3U2l6ZS5YCiAgICAgICAgIyBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuIHdpdGggYmxhbmtzCiAgICAgICAgd2luMzIuRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoaGFuZGxlLCAnICcsIGNlbGxzX3RvX2VyYXNlLCBmcm9tX2Nvb3JkKQogICAgICAgICMgbm93IHNldCB0aGUgYnVmZmVyJ3MgYXR0cmlidXRlcyBhY2NvcmRpbmdseQogICAgICAgIHdpbjMyLkZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKGhhbmRsZSwgc2VsZi5nZXRfYXR0cnMoKSwgY2VsbHNfdG9fZXJhc2UsIGZyb21fY29vcmQpCgogICAgZGVmIHNldF90aXRsZShzZWxmLCB0aXRsZSk6CiAgICAgICAgd2luMzIuU2V0Q29uc29sZVRpdGxlKHRpdGxlKQpQSwMEFAAAAAAAAAAhACacUZdFAgAARQIAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX19pbml0X18ucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwppbXBvcnQgbG9nZ2luZwoKX192ZXJzaW9uX18gPSAnMC4yLjQnCgpjbGFzcyBEaXN0bGliRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICBwYXNzCgp0cnk6CiAgICBmcm9tIGxvZ2dpbmcgaW1wb3J0IE51bGxIYW5kbGVyCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBjbGFzcyBOdWxsSGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgogICAgICAgIGRlZiBoYW5kbGUoc2VsZiwgcmVjb3JkKTogcGFzcwogICAgICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6IHBhc3MKICAgICAgICBkZWYgY3JlYXRlTG9jayhzZWxmKTogc2VsZi5sb2NrID0gTm9uZQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCmxvZ2dlci5hZGRIYW5kbGVyKE51bGxIYW5kbGVyKCkpClBLAwQUAAAAAAAAACEAI+9n/BIBAAASAQAARgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvX19pbml0X18ucHkiIiJNb2R1bGVzIGNvcGllZCBmcm9tIFB5dGhvbiAzIHN0YW5kYXJkIGxpYnJhcmllcywgZm9yIGludGVybmFsIHVzZSBvbmx5LgoKSW5kaXZpZHVhbCBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgYXJlIGZvdW5kIGluIGQyLl9iYWNrcG9ydC5taXNjLiAgSW50ZW5kZWQKdXNhZ2UgaXMgdG8gYWx3YXlzIGltcG9ydCB0aGluZ3MgbWlzc2luZyBmcm9tIDMuMSBmcm9tIHRoYXQgbW9kdWxlOiB0aGUKYnVpbHQtaW4vc3RkbGliIG9iamVjdHMgd2lsbCBiZSB1c2VkIGlmIGZvdW5kLgoiIiIKUEsDBBQAAAAAAAAAIQCvii9lywMAAMsDAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9taXNjLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIkJhY2twb3J0cyBmb3IgaW5kaXZpZHVhbCBjbGFzc2VzIGFuZCBmdW5jdGlvbnMuIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwoKX19hbGxfXyA9IFsnY2FjaGVfZnJvbV9zb3VyY2UnLCAnY2FsbGFibGUnLCAnZnNlbmNvZGUnXQoKCnRyeToKICAgIGZyb20gaW1wIGltcG9ydCBjYWNoZV9mcm9tX3NvdXJjZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBkZWYgY2FjaGVfZnJvbV9zb3VyY2UocHlfZmlsZSwgZGVidWc9X19kZWJ1Z19fKToKICAgICAgICBleHQgPSBkZWJ1ZyBhbmQgJ2MnIG9yICdvJwogICAgICAgIHJldHVybiBweV9maWxlICsgZXh0CgoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2FsbGFibGUKCiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvYmosIENhbGxhYmxlKQoKCnRyeToKICAgIGZzZW5jb2RlID0gb3MuZnNlbmNvZGUKZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgZGVmIGZzZW5jb2RlKGZpbGVuYW1lKToKICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgc3RyKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3QgYnl0ZXMgb3Igc3RyLCBub3QgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUoZmlsZW5hbWUpLl9fbmFtZV9fKQpQSwMEFAAAAAAAAAAhAOJiPdAvZAAAL2QAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3NodXRpbC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgY29weWluZyBhbmQgYXJjaGl2aW5nIGZpbGVzIGFuZCBkaXJlY3RvcnkgdHJlZXMuCgpYWFggVGhlIGZ1bmN0aW9ucyBoZXJlIGRvbid0IGNvcHkgdGhlIHJlc291cmNlIGZvcmsgb3Igb3RoZXIgbWV0YWRhdGEgb24gTWFjLgoKIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgc3RhdApmcm9tIG9zLnBhdGggaW1wb3J0IGFic3BhdGgKaW1wb3J0IGZubWF0Y2gKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBlcnJubwpmcm9tIC4gaW1wb3J0IHRhcmZpbGUKCnRyeToKICAgIGltcG9ydCBiejIKICAgIF9CWjJfU1VQUE9SVEVEID0gVHJ1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBfQloyX1NVUFBPUlRFRCA9IEZhbHNlCgp0cnk6CiAgICBmcm9tIHB3ZCBpbXBvcnQgZ2V0cHduYW0KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZ2V0cHduYW0gPSBOb25lCgp0cnk6CiAgICBmcm9tIGdycCBpbXBvcnQgZ2V0Z3JuYW0KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZ2V0Z3JuYW0gPSBOb25lCgpfX2FsbF9fID0gWyJjb3B5ZmlsZW9iaiIsICJjb3B5ZmlsZSIsICJjb3B5bW9kZSIsICJjb3B5c3RhdCIsICJjb3B5IiwgImNvcHkyIiwKICAgICAgICAgICAiY29weXRyZWUiLCAibW92ZSIsICJybXRyZWUiLCAiRXJyb3IiLCAiU3BlY2lhbEZpbGVFcnJvciIsCiAgICAgICAgICAgIkV4ZWNFcnJvciIsICJtYWtlX2FyY2hpdmUiLCAiZ2V0X2FyY2hpdmVfZm9ybWF0cyIsCiAgICAgICAgICAgInJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0IiwgInVucmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQiLAogICAgICAgICAgICJnZXRfdW5wYWNrX2Zvcm1hdHMiLCAicmVnaXN0ZXJfdW5wYWNrX2Zvcm1hdCIsCiAgICAgICAgICAgInVucmVnaXN0ZXJfdW5wYWNrX2Zvcm1hdCIsICJ1bnBhY2tfYXJjaGl2ZSIsICJpZ25vcmVfcGF0dGVybnMiXQoKY2xhc3MgRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CiAgICBwYXNzCgpjbGFzcyBTcGVjaWFsRmlsZUVycm9yKEVudmlyb25tZW50RXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gdHJ5aW5nIHRvIGRvIGEga2luZCBvZiBvcGVyYXRpb24gKGUuZy4gY29weWluZykgd2hpY2ggaXMKICAgIG5vdCBzdXBwb3J0ZWQgb24gYSBzcGVjaWFsIGZpbGUgKGUuZy4gYSBuYW1lZCBwaXBlKSIiIgoKY2xhc3MgRXhlY0Vycm9yKEVudmlyb25tZW50RXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYSBjb21tYW5kIGNvdWxkIG5vdCBiZSBleGVjdXRlZCIiIgoKY2xhc3MgUmVhZEVycm9yKEVudmlyb25tZW50RXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYW4gYXJjaGl2ZSBjYW5ub3QgYmUgcmVhZCIiIgoKY2xhc3MgUmVnaXN0cnlFcnJvcihFeGNlcHRpb24pOgogICAgIiIiUmFpc2VkIHdoZW4gYSByZWdpc3RyeSBvcGVyYXRpb24gd2l0aCB0aGUgYXJjaGl2aW5nCiAgICBhbmQgdW5wYWNraW5nIHJlZ2lzdHJpZXMgZmFpbHMiIiIKCgp0cnk6CiAgICBXaW5kb3dzRXJyb3IKZXhjZXB0IE5hbWVFcnJvcjoKICAgIFdpbmRvd3NFcnJvciA9IE5vbmUKCmRlZiBjb3B5ZmlsZW9iaihmc3JjLCBmZHN0LCBsZW5ndGg9MTYqMTAyNCk6CiAgICAiIiJjb3B5IGRhdGEgZnJvbSBmaWxlLWxpa2Ugb2JqZWN0IGZzcmMgdG8gZmlsZS1saWtlIG9iamVjdCBmZHN0IiIiCiAgICB3aGlsZSAxOgogICAgICAgIGJ1ZiA9IGZzcmMucmVhZChsZW5ndGgpCiAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgYnJlYWsKICAgICAgICBmZHN0LndyaXRlKGJ1ZikKCmRlZiBfc2FtZWZpbGUoc3JjLCBkc3QpOgogICAgIyBNYWNpbnRvc2gsIFVuaXguCiAgICBpZiBoYXNhdHRyKG9zLnBhdGgsICdzYW1lZmlsZScpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUoc3JjLCBkc3QpCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgQWxsIG90aGVyIHBsYXRmb3JtczogY2hlY2sgZm9yIHNhbWUgcGF0aG5hbWUuCiAgICByZXR1cm4gKG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKHNyYykpID09CiAgICAgICAgICAgIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKGRzdCkpKQoKZGVmIGNvcHlmaWxlKHNyYywgZHN0KToKICAgICIiIkNvcHkgZGF0YSBmcm9tIHNyYyB0byBkc3QiIiIKICAgIGlmIF9zYW1lZmlsZShzcmMsIGRzdCk6CiAgICAgICAgcmFpc2UgRXJyb3IoImAlc2AgYW5kIGAlc2AgYXJlIHRoZSBzYW1lIGZpbGUiICUgKHNyYywgZHN0KSkKCiAgICBmb3IgZm4gaW4gW3NyYywgZHN0XToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0ID0gb3Muc3RhdChmbikKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgIyBGaWxlIG1vc3QgbGlrZWx5IGRvZXMgbm90IGV4aXN0CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWCBXaGF0IGFib3V0IG90aGVyIHNwZWNpYWwgZmlsZXM/IChzb2NrZXRzLCBkZXZpY2VzLi4uKQogICAgICAgICAgICBpZiBzdGF0LlNfSVNGSUZPKHN0LnN0X21vZGUpOgogICAgICAgICAgICAgICAgcmFpc2UgU3BlY2lhbEZpbGVFcnJvcigiYCVzYCBpcyBhIG5hbWVkIHBpcGUiICUgZm4pCgogICAgd2l0aCBvcGVuKHNyYywgJ3JiJykgYXMgZnNyYzoKICAgICAgICB3aXRoIG9wZW4oZHN0LCAnd2InKSBhcyBmZHN0OgogICAgICAgICAgICBjb3B5ZmlsZW9iaihmc3JjLCBmZHN0KQoKZGVmIGNvcHltb2RlKHNyYywgZHN0KToKICAgICIiIkNvcHkgbW9kZSBiaXRzIGZyb20gc3JjIHRvIGRzdCIiIgogICAgaWYgaGFzYXR0cihvcywgJ2NobW9kJyk6CiAgICAgICAgc3QgPSBvcy5zdGF0KHNyYykKICAgICAgICBtb2RlID0gc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpCiAgICAgICAgb3MuY2htb2QoZHN0LCBtb2RlKQoKZGVmIGNvcHlzdGF0KHNyYywgZHN0KToKICAgICIiIkNvcHkgYWxsIHN0YXQgaW5mbyAobW9kZSBiaXRzLCBhdGltZSwgbXRpbWUsIGZsYWdzKSBmcm9tIHNyYyB0byBkc3QiIiIKICAgIHN0ID0gb3Muc3RhdChzcmMpCiAgICBtb2RlID0gc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpCiAgICBpZiBoYXNhdHRyKG9zLCAndXRpbWUnKToKICAgICAgICBvcy51dGltZShkc3QsIChzdC5zdF9hdGltZSwgc3Quc3RfbXRpbWUpKQogICAgaWYgaGFzYXR0cihvcywgJ2NobW9kJyk6CiAgICAgICAgb3MuY2htb2QoZHN0LCBtb2RlKQogICAgaWYgaGFzYXR0cihvcywgJ2NoZmxhZ3MnKSBhbmQgaGFzYXR0cihzdCwgJ3N0X2ZsYWdzJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy5jaGZsYWdzKGRzdCwgc3Quc3RfZmxhZ3MpCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgd2h5OgogICAgICAgICAgICBpZiAobm90IGhhc2F0dHIoZXJybm8sICdFT1BOT1RTVVBQJykgb3IKICAgICAgICAgICAgICAgIHdoeS5lcnJubyAhPSBlcnJuby5FT1BOT1RTVVBQKToKICAgICAgICAgICAgICAgIHJhaXNlCgpkZWYgY29weShzcmMsIGRzdCk6CiAgICAiIiJDb3B5IGRhdGEgYW5kIG1vZGUgYml0cyAoImNwIHNyYyBkc3QiKS4KCiAgICBUaGUgZGVzdGluYXRpb24gbWF5IGJlIGEgZGlyZWN0b3J5LgoKICAgICIiIgogICAgaWYgb3MucGF0aC5pc2Rpcihkc3QpOgogICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3QsIG9zLnBhdGguYmFzZW5hbWUoc3JjKSkKICAgIGNvcHlmaWxlKHNyYywgZHN0KQogICAgY29weW1vZGUoc3JjLCBkc3QpCgpkZWYgY29weTIoc3JjLCBkc3QpOgogICAgIiIiQ29weSBkYXRhIGFuZCBhbGwgc3RhdCBpbmZvICgiY3AgLXAgc3JjIGRzdCIpLgoKICAgIFRoZSBkZXN0aW5hdGlvbiBtYXkgYmUgYSBkaXJlY3RvcnkuCgogICAgIiIiCiAgICBpZiBvcy5wYXRoLmlzZGlyKGRzdCk6CiAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgb3MucGF0aC5iYXNlbmFtZShzcmMpKQogICAgY29weWZpbGUoc3JjLCBkc3QpCiAgICBjb3B5c3RhdChzcmMsIGRzdCkKCmRlZiBpZ25vcmVfcGF0dGVybnMoKnBhdHRlcm5zKToKICAgICIiIkZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgY29weXRyZWUoKSBpZ25vcmUgcGFyYW1ldGVyLgoKICAgIFBhdHRlcm5zIGlzIGEgc2VxdWVuY2Ugb2YgZ2xvYi1zdHlsZSBwYXR0ZXJucwogICAgdGhhdCBhcmUgdXNlZCB0byBleGNsdWRlIGZpbGVzIiIiCiAgICBkZWYgX2lnbm9yZV9wYXR0ZXJucyhwYXRoLCBuYW1lcyk6CiAgICAgICAgaWdub3JlZF9uYW1lcyA9IFtdCiAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgIGlnbm9yZWRfbmFtZXMuZXh0ZW5kKGZubWF0Y2guZmlsdGVyKG5hbWVzLCBwYXR0ZXJuKSkKICAgICAgICByZXR1cm4gc2V0KGlnbm9yZWRfbmFtZXMpCiAgICByZXR1cm4gX2lnbm9yZV9wYXR0ZXJucwoKZGVmIGNvcHl0cmVlKHNyYywgZHN0LCBzeW1saW5rcz1GYWxzZSwgaWdub3JlPU5vbmUsIGNvcHlfZnVuY3Rpb249Y29weTIsCiAgICAgICAgICAgICBpZ25vcmVfZGFuZ2xpbmdfc3ltbGlua3M9RmFsc2UpOgogICAgIiIiUmVjdXJzaXZlbHkgY29weSBhIGRpcmVjdG9yeSB0cmVlLgoKICAgIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgbXVzdCBub3QgYWxyZWFkeSBleGlzdC4KICAgIElmIGV4Y2VwdGlvbihzKSBvY2N1ciwgYW4gRXJyb3IgaXMgcmFpc2VkIHdpdGggYSBsaXN0IG9mIHJlYXNvbnMuCgogICAgSWYgdGhlIG9wdGlvbmFsIHN5bWxpbmtzIGZsYWcgaXMgdHJ1ZSwgc3ltYm9saWMgbGlua3MgaW4gdGhlCiAgICBzb3VyY2UgdHJlZSByZXN1bHQgaW4gc3ltYm9saWMgbGlua3MgaW4gdGhlIGRlc3RpbmF0aW9uIHRyZWU7IGlmCiAgICBpdCBpcyBmYWxzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlcyBwb2ludGVkIHRvIGJ5IHN5bWJvbGljCiAgICBsaW5rcyBhcmUgY29waWVkLiBJZiB0aGUgZmlsZSBwb2ludGVkIGJ5IHRoZSBzeW1saW5rIGRvZXNuJ3QKICAgIGV4aXN0LCBhbiBleGNlcHRpb24gd2lsbCBiZSBhZGRlZCBpbiB0aGUgbGlzdCBvZiBlcnJvcnMgcmFpc2VkIGluCiAgICBhbiBFcnJvciBleGNlcHRpb24gYXQgdGhlIGVuZCBvZiB0aGUgY29weSBwcm9jZXNzLgoKICAgIFlvdSBjYW4gc2V0IHRoZSBvcHRpb25hbCBpZ25vcmVfZGFuZ2xpbmdfc3ltbGlua3MgZmxhZyB0byB0cnVlIGlmIHlvdQogICAgd2FudCB0byBzaWxlbmNlIHRoaXMgZXhjZXB0aW9uLiBOb3RpY2UgdGhhdCB0aGlzIGhhcyBubyBlZmZlY3Qgb24KICAgIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgb3Muc3ltbGluay4KCiAgICBUaGUgb3B0aW9uYWwgaWdub3JlIGFyZ3VtZW50IGlzIGEgY2FsbGFibGUuIElmIGdpdmVuLCBpdAogICAgaXMgY2FsbGVkIHdpdGggdGhlIGBzcmNgIHBhcmFtZXRlciwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeQogICAgYmVpbmcgdmlzaXRlZCBieSBjb3B5dHJlZSgpLCBhbmQgYG5hbWVzYCB3aGljaCBpcyB0aGUgbGlzdCBvZgogICAgYHNyY2AgY29udGVudHMsIGFzIHJldHVybmVkIGJ5IG9zLmxpc3RkaXIoKToKCiAgICAgICAgY2FsbGFibGUoc3JjLCBuYW1lcykgLT4gaWdub3JlZF9uYW1lcwoKICAgIFNpbmNlIGNvcHl0cmVlKCkgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5LCB0aGUgY2FsbGFibGUgd2lsbCBiZQogICAgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZGlyZWN0b3J5IHRoYXQgaXMgY29waWVkLiBJdCByZXR1cm5zIGEKICAgIGxpc3Qgb2YgbmFtZXMgcmVsYXRpdmUgdG8gdGhlIGBzcmNgIGRpcmVjdG9yeSB0aGF0IHNob3VsZAogICAgbm90IGJlIGNvcGllZC4KCiAgICBUaGUgb3B0aW9uYWwgY29weV9mdW5jdGlvbiBhcmd1bWVudCBpcyBhIGNhbGxhYmxlIHRoYXQgd2lsbCBiZSB1c2VkCiAgICB0byBjb3B5IGVhY2ggZmlsZS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgc291cmNlIHBhdGggYW5kIHRoZQogICAgZGVzdGluYXRpb24gcGF0aCBhcyBhcmd1bWVudHMuIEJ5IGRlZmF1bHQsIGNvcHkyKCkgaXMgdXNlZCwgYnV0IGFueQogICAgZnVuY3Rpb24gdGhhdCBzdXBwb3J0cyB0aGUgc2FtZSBzaWduYXR1cmUgKGxpa2UgY29weSgpKSBjYW4gYmUgdXNlZC4KCiAgICAiIiIKICAgIG5hbWVzID0gb3MubGlzdGRpcihzcmMpCiAgICBpZiBpZ25vcmUgaXMgbm90IE5vbmU6CiAgICAgICAgaWdub3JlZF9uYW1lcyA9IGlnbm9yZShzcmMsIG5hbWVzKQogICAgZWxzZToKICAgICAgICBpZ25vcmVkX25hbWVzID0gc2V0KCkKCiAgICBvcy5tYWtlZGlycyhkc3QpCiAgICBlcnJvcnMgPSBbXQogICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgaWYgbmFtZSBpbiBpZ25vcmVkX25hbWVzOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHNyY25hbWUgPSBvcy5wYXRoLmpvaW4oc3JjLCBuYW1lKQogICAgICAgIGRzdG5hbWUgPSBvcy5wYXRoLmpvaW4oZHN0LCBuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoc3JjbmFtZSk6CiAgICAgICAgICAgICAgICBsaW5rdG8gPSBvcy5yZWFkbGluayhzcmNuYW1lKQogICAgICAgICAgICAgICAgaWYgc3ltbGlua3M6CiAgICAgICAgICAgICAgICAgICAgb3Muc3ltbGluayhsaW5rdG8sIGRzdG5hbWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGRhbmdsaW5nIHN5bWxpbmsgaWYgdGhlIGZsYWcgaXMgb24KICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobGlua3RvKSBhbmQgaWdub3JlX2RhbmdsaW5nX3N5bWxpbmtzOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIGxldCB0aGUgY29weSBvY2N1cnMuIGNvcHkyIHdpbGwgcmFpc2UgYW4gZXJyb3IKICAgICAgICAgICAgICAgICAgICBjb3B5X2Z1bmN0aW9uKHNyY25hbWUsIGRzdG5hbWUpCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihzcmNuYW1lKToKICAgICAgICAgICAgICAgIGNvcHl0cmVlKHNyY25hbWUsIGRzdG5hbWUsIHN5bWxpbmtzLCBpZ25vcmUsIGNvcHlfZnVuY3Rpb24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFdpbGwgcmFpc2UgYSBTcGVjaWFsRmlsZUVycm9yIGZvciB1bnN1cHBvcnRlZCBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICBjb3B5X2Z1bmN0aW9uKHNyY25hbWUsIGRzdG5hbWUpCiAgICAgICAgIyBjYXRjaCB0aGUgRXJyb3IgZnJvbSB0aGUgcmVjdXJzaXZlIGNvcHl0cmVlIHNvIHRoYXQgd2UgY2FuCiAgICAgICAgIyBjb250aW51ZSB3aXRoIG90aGVyIGZpbGVzCiAgICAgICAgZXhjZXB0IEVycm9yIGFzIGVycjoKICAgICAgICAgICAgZXJyb3JzLmV4dGVuZChlcnIuYXJnc1swXSkKICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyB3aHk6CiAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoKHNyY25hbWUsIGRzdG5hbWUsIHN0cih3aHkpKSkKICAgIHRyeToKICAgICAgICBjb3B5c3RhdChzcmMsIGRzdCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIHdoeToKICAgICAgICBpZiBXaW5kb3dzRXJyb3IgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2Uod2h5LCBXaW5kb3dzRXJyb3IpOgogICAgICAgICAgICAjIENvcHlpbmcgZmlsZSBhY2Nlc3MgdGltZXMgbWF5IGZhaWwgb24gV2luZG93cwogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZXJyb3JzLmV4dGVuZCgoc3JjLCBkc3QsIHN0cih3aHkpKSkKICAgIGlmIGVycm9yczoKICAgICAgICByYWlzZSBFcnJvcihlcnJvcnMpCgpkZWYgcm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnM9RmFsc2UsIG9uZXJyb3I9Tm9uZSk6CiAgICAiIiJSZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkgdHJlZS4KCiAgICBJZiBpZ25vcmVfZXJyb3JzIGlzIHNldCwgZXJyb3JzIGFyZSBpZ25vcmVkOyBvdGhlcndpc2UsIGlmIG9uZXJyb3IKICAgIGlzIHNldCwgaXQgaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgZXJyb3Igd2l0aCBhcmd1bWVudHMgKGZ1bmMsCiAgICBwYXRoLCBleGNfaW5mbykgd2hlcmUgZnVuYyBpcyBvcy5saXN0ZGlyLCBvcy5yZW1vdmUsIG9yIG9zLnJtZGlyOwogICAgcGF0aCBpcyB0aGUgYXJndW1lbnQgdG8gdGhhdCBmdW5jdGlvbiB0aGF0IGNhdXNlZCBpdCB0byBmYWlsOyBhbmQKICAgIGV4Y19pbmZvIGlzIGEgdHVwbGUgcmV0dXJuZWQgYnkgc3lzLmV4Y19pbmZvKCkuICBJZiBpZ25vcmVfZXJyb3JzCiAgICBpcyBmYWxzZSBhbmQgb25lcnJvciBpcyBOb25lLCBhbiBleGNlcHRpb24gaXMgcmFpc2VkLgoKICAgICIiIgogICAgaWYgaWdub3JlX2Vycm9yczoKICAgICAgICBkZWYgb25lcnJvcigqYXJncyk6CiAgICAgICAgICAgIHBhc3MKICAgIGVsaWYgb25lcnJvciBpcyBOb25lOgogICAgICAgIGRlZiBvbmVycm9yKCphcmdzKToKICAgICAgICAgICAgcmFpc2UKICAgIHRyeToKICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhwYXRoKToKICAgICAgICAgICAgIyBzeW1saW5rcyB0byBkaXJlY3RvcmllcyBhcmUgZm9yYmlkZGVuLCBzZWUgYnVnICMxNjY5CiAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoIkNhbm5vdCBjYWxsIHJtdHJlZSBvbiBhIHN5bWJvbGljIGxpbmsiKQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgb25lcnJvcihvcy5wYXRoLmlzbGluaywgcGF0aCwgc3lzLmV4Y19pbmZvKCkpCiAgICAgICAgIyBjYW4ndCBjb250aW51ZSBldmVuIGlmIG9uZXJyb3IgaG9vayByZXR1cm5zCiAgICAgICAgcmV0dXJuCiAgICBuYW1lcyA9IFtdCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHBhdGgpCiAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgb25lcnJvcihvcy5saXN0ZGlyLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtb2RlID0gb3MubHN0YXQoZnVsbG5hbWUpLnN0X21vZGUKICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgIG1vZGUgPSAwCiAgICAgICAgaWYgc3RhdC5TX0lTRElSKG1vZGUpOgogICAgICAgICAgICBybXRyZWUoZnVsbG5hbWUsIGlnbm9yZV9lcnJvcnMsIG9uZXJyb3IpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZ1bGxuYW1lKQogICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICAgICBvbmVycm9yKG9zLnJlbW92ZSwgZnVsbG5hbWUsIHN5cy5leGNfaW5mbygpKQogICAgdHJ5OgogICAgICAgIG9zLnJtZGlyKHBhdGgpCiAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgb25lcnJvcihvcy5ybWRpciwgcGF0aCwgc3lzLmV4Y19pbmZvKCkpCgoKZGVmIF9iYXNlbmFtZShwYXRoKToKICAgICMgQSBiYXNlbmFtZSgpIHZhcmlhbnQgd2hpY2ggZmlyc3Qgc3RyaXBzIHRoZSB0cmFpbGluZyBzbGFzaCwgaWYgcHJlc2VudC4KICAgICMgVGh1cyB3ZSBhbHdheXMgZ2V0IHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aCwgZXZlbiBmb3IgZGlyZWN0b3JpZXMuCiAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShwYXRoLnJzdHJpcChvcy5wYXRoLnNlcCkpCgpkZWYgbW92ZShzcmMsIGRzdCk6CiAgICAiIiJSZWN1cnNpdmVseSBtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkgdG8gYW5vdGhlciBsb2NhdGlvbi4gVGhpcyBpcwogICAgc2ltaWxhciB0byB0aGUgVW5peCAibXYiIGNvbW1hbmQuCgogICAgSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5IG9yIGEgc3ltbGluayB0byBhIGRpcmVjdG9yeSwgdGhlIHNvdXJjZQogICAgaXMgbW92ZWQgaW5zaWRlIHRoZSBkaXJlY3RvcnkuIFRoZSBkZXN0aW5hdGlvbiBwYXRoIG11c3Qgbm90IGFscmVhZHkKICAgIGV4aXN0LgoKICAgIElmIHRoZSBkZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5LCBpdCBtYXkgYmUKICAgIG92ZXJ3cml0dGVuIGRlcGVuZGluZyBvbiBvcy5yZW5hbWUoKSBzZW1hbnRpY3MuCgogICAgSWYgdGhlIGRlc3RpbmF0aW9uIGlzIG9uIG91ciBjdXJyZW50IGZpbGVzeXN0ZW0sIHRoZW4gcmVuYW1lKCkgaXMgdXNlZC4KICAgIE90aGVyd2lzZSwgc3JjIGlzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gYW5kIHRoZW4gcmVtb3ZlZC4KICAgIEEgbG90IG1vcmUgY291bGQgYmUgZG9uZSBoZXJlLi4uICBBIGxvb2sgYXQgYSBtdi5jIHNob3dzIGEgbG90IG9mCiAgICB0aGUgaXNzdWVzIHRoaXMgaW1wbGVtZW50YXRpb24gZ2xvc3NlcyBvdmVyLgoKICAgICIiIgogICAgcmVhbF9kc3QgPSBkc3QKICAgIGlmIG9zLnBhdGguaXNkaXIoZHN0KToKICAgICAgICBpZiBfc2FtZWZpbGUoc3JjLCBkc3QpOgogICAgICAgICAgICAjIFdlIG1pZ2h0IGJlIG9uIGEgY2FzZSBpbnNlbnNpdGl2ZSBmaWxlc3lzdGVtLAogICAgICAgICAgICAjIHBlcmZvcm0gdGhlIHJlbmFtZSBhbnl3YXkuCiAgICAgICAgICAgIG9zLnJlbmFtZShzcmMsIGRzdCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJlYWxfZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgX2Jhc2VuYW1lKHNyYykpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVhbF9kc3QpOgogICAgICAgICAgICByYWlzZSBFcnJvcigiRGVzdGluYXRpb24gcGF0aCAnJXMnIGFscmVhZHkgZXhpc3RzIiAlIHJlYWxfZHN0KQogICAgdHJ5OgogICAgICAgIG9zLnJlbmFtZShzcmMsIHJlYWxfZHN0KQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzcmMpOgogICAgICAgICAgICBpZiBfZGVzdGluc3JjKHNyYywgZHN0KToKICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKCJDYW5ub3QgbW92ZSBhIGRpcmVjdG9yeSAnJXMnIGludG8gaXRzZWxmICclcycuIiAlIChzcmMsIGRzdCkpCiAgICAgICAgICAgIGNvcHl0cmVlKHNyYywgcmVhbF9kc3QsIHN5bWxpbmtzPVRydWUpCiAgICAgICAgICAgIHJtdHJlZShzcmMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29weTIoc3JjLCByZWFsX2RzdCkKICAgICAgICAgICAgb3MudW5saW5rKHNyYykKCmRlZiBfZGVzdGluc3JjKHNyYywgZHN0KToKICAgIHNyYyA9IGFic3BhdGgoc3JjKQogICAgZHN0ID0gYWJzcGF0aChkc3QpCiAgICBpZiBub3Qgc3JjLmVuZHN3aXRoKG9zLnBhdGguc2VwKToKICAgICAgICBzcmMgKz0gb3MucGF0aC5zZXAKICAgIGlmIG5vdCBkc3QuZW5kc3dpdGgob3MucGF0aC5zZXApOgogICAgICAgIGRzdCArPSBvcy5wYXRoLnNlcAogICAgcmV0dXJuIGRzdC5zdGFydHN3aXRoKHNyYykKCmRlZiBfZ2V0X2dpZChuYW1lKToKICAgICIiIlJldHVybnMgYSBnaWQsIGdpdmVuIGEgZ3JvdXAgbmFtZS4iIiIKICAgIGlmIGdldGdybmFtIGlzIE5vbmUgb3IgbmFtZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gZ2V0Z3JuYW0obmFtZSkKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICByZXN1bHQgPSBOb25lCiAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHJlc3VsdFsyXQogICAgcmV0dXJuIE5vbmUKCmRlZiBfZ2V0X3VpZChuYW1lKToKICAgICIiIlJldHVybnMgYW4gdWlkLCBnaXZlbiBhIHVzZXIgbmFtZS4iIiIKICAgIGlmIGdldHB3bmFtIGlzIE5vbmUgb3IgbmFtZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gZ2V0cHduYW0obmFtZSkKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICByZXN1bHQgPSBOb25lCiAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHJlc3VsdFsyXQogICAgcmV0dXJuIE5vbmUKCmRlZiBfbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgYmFzZV9kaXIsIGNvbXByZXNzPSJnemlwIiwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsCiAgICAgICAgICAgICAgICAgIG93bmVyPU5vbmUsIGdyb3VwPU5vbmUsIGxvZ2dlcj1Ob25lKToKICAgICIiIkNyZWF0ZSBhIChwb3NzaWJseSBjb21wcmVzc2VkKSB0YXIgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIKICAgICdiYXNlX2RpcicuCgogICAgJ2NvbXByZXNzJyBtdXN0IGJlICJnemlwIiAodGhlIGRlZmF1bHQpLCAiYnppcDIiLCBvciBOb25lLgoKICAgICdvd25lcicgYW5kICdncm91cCcgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFuIG93bmVyIGFuZCBhIGdyb3VwIGZvciB0aGUKICAgIGFyY2hpdmUgdGhhdCBpcyBiZWluZyBidWlsdC4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCBvd25lciBhbmQgZ3JvdXAKICAgIHdpbGwgYmUgdXNlZC4KCiAgICBUaGUgb3V0cHV0IHRhciBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfbmFtZScgKyAgIi50YXIiLCBwb3NzaWJseSBwbHVzCiAgICB0aGUgYXBwcm9wcmlhdGUgY29tcHJlc3Npb24gZXh0ZW5zaW9uICgiLmd6Iiwgb3IgIi5iejIiKS4KCiAgICBSZXR1cm5zIHRoZSBvdXRwdXQgZmlsZW5hbWUuCiAgICAiIiIKICAgIHRhcl9jb21wcmVzc2lvbiA9IHsnZ3ppcCc6ICdneicsIE5vbmU6ICcnfQogICAgY29tcHJlc3NfZXh0ID0geydnemlwJzogJy5neid9CgogICAgaWYgX0JaMl9TVVBQT1JURUQ6CiAgICAgICAgdGFyX2NvbXByZXNzaW9uWydiemlwMiddID0gJ2J6MicKICAgICAgICBjb21wcmVzc19leHRbJ2J6aXAyJ10gPSAnLmJ6MicKCiAgICAjIGZsYWdzIGZvciBjb21wcmVzc2lvbiBwcm9ncmFtLCBlYWNoIGVsZW1lbnQgb2YgbGlzdCB3aWxsIGJlIGFuIGFyZ3VtZW50CiAgICBpZiBjb21wcmVzcyBpcyBub3QgTm9uZSBhbmQgY29tcHJlc3Mgbm90IGluIGNvbXByZXNzX2V4dDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJiYWQgdmFsdWUgZm9yICdjb21wcmVzcycsIG9yIGNvbXByZXNzaW9uIGZvcm1hdCBub3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCA6IHswfSIuZm9ybWF0KGNvbXByZXNzKSkKCiAgICBhcmNoaXZlX25hbWUgPSBiYXNlX25hbWUgKyAnLnRhcicgKyBjb21wcmVzc19leHQuZ2V0KGNvbXByZXNzLCAnJykKICAgIGFyY2hpdmVfZGlyID0gb3MucGF0aC5kaXJuYW1lKGFyY2hpdmVfbmFtZSkKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYXJjaGl2ZV9kaXIpOgogICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNyZWF0aW5nICVzIiwgYXJjaGl2ZV9kaXIpCiAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKGFyY2hpdmVfZGlyKQoKICAgICMgY3JlYXRpbmcgdGhlIHRhcmJhbGwKICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICBsb2dnZXIuaW5mbygnQ3JlYXRpbmcgdGFyIGFyY2hpdmUnKQoKICAgIHVpZCA9IF9nZXRfdWlkKG93bmVyKQogICAgZ2lkID0gX2dldF9naWQoZ3JvdXApCgogICAgZGVmIF9zZXRfdWlkX2dpZCh0YXJpbmZvKToKICAgICAgICBpZiBnaWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRhcmluZm8uZ2lkID0gZ2lkCiAgICAgICAgICAgIHRhcmluZm8uZ25hbWUgPSBncm91cAogICAgICAgIGlmIHVpZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGFyaW5mby51aWQgPSB1aWQKICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9IG93bmVyCiAgICAgICAgcmV0dXJuIHRhcmluZm8KCiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9uYW1lLCAnd3wlcycgJSB0YXJfY29tcHJlc3Npb25bY29tcHJlc3NdKQogICAgICAgIHRyeToKICAgICAgICAgICAgdGFyLmFkZChiYXNlX2RpciwgZmlsdGVyPV9zZXRfdWlkX2dpZCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB0YXIuY2xvc2UoKQoKICAgIHJldHVybiBhcmNoaXZlX25hbWUKCmRlZiBfY2FsbF9leHRlcm5hbF96aXAoYmFzZV9kaXIsIHppcF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSwgZHJ5X3J1bj1GYWxzZSk6CiAgICAjIFhYWCBzZWUgaWYgd2Ugd2FudCB0byBrZWVwIGFuIGV4dGVybmFsIGNhbGwgaGVyZQogICAgaWYgdmVyYm9zZToKICAgICAgICB6aXBvcHRpb25zID0gIi1yIgogICAgZWxzZToKICAgICAgICB6aXBvcHRpb25zID0gIi1ycSIKICAgIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCiAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KICAgIHRyeToKICAgICAgICBzcGF3bihbInppcCIsIHppcG9wdGlvbnMsIHppcF9maWxlbmFtZSwgYmFzZV9kaXJdLCBkcnlfcnVuPWRyeV9ydW4pCiAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yOgogICAgICAgICMgWFhYIHJlYWxseSBzaG91bGQgZGlzdGluZ3Vpc2ggYmV0d2VlbiAiY291bGRuJ3QgZmluZAogICAgICAgICMgZXh0ZXJuYWwgJ3ppcCcgY29tbWFuZCIgYW5kICJ6aXAgZmFpbGVkIi4KICAgICAgICByYWlzZSBFeGVjRXJyb3IoInVuYWJsZSB0byBjcmVhdGUgemlwIGZpbGUgJyVzJzogIgogICAgICAgICAgICAiY291bGQgbmVpdGhlciBpbXBvcnQgdGhlICd6aXBmaWxlJyBtb2R1bGUgbm9yICIKICAgICAgICAgICAgImZpbmQgYSBzdGFuZGFsb25lIHppcCB1dGlsaXR5IikgJSB6aXBfZmlsZW5hbWUKCmRlZiBfbWFrZV96aXBmaWxlKGJhc2VfbmFtZSwgYmFzZV9kaXIsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLCBsb2dnZXI9Tm9uZSk6CiAgICAiIiJDcmVhdGUgYSB6aXAgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4KCiAgICBUaGUgb3V0cHV0IHppcCBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfbmFtZScgKyAiLnppcCIuICBVc2VzIGVpdGhlciB0aGUKICAgICJ6aXBmaWxlIiBQeXRob24gbW9kdWxlIChpZiBhdmFpbGFibGUpIG9yIHRoZSBJbmZvWklQICJ6aXAiIHV0aWxpdHkKICAgIChpZiBpbnN0YWxsZWQgYW5kIGZvdW5kIG9uIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoKS4gIElmIG5laXRoZXIgdG9vbCBpcwogICAgYXZhaWxhYmxlLCByYWlzZXMgRXhlY0Vycm9yLiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHppcAogICAgZmlsZS4KICAgICIiIgogICAgemlwX2ZpbGVuYW1lID0gYmFzZV9uYW1lICsgIi56aXAiCiAgICBhcmNoaXZlX2RpciA9IG9zLnBhdGguZGlybmFtZShiYXNlX25hbWUpCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGFyY2hpdmVfZGlyKToKICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjcmVhdGluZyAlcyIsIGFyY2hpdmVfZGlyKQogICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICBvcy5tYWtlZGlycyhhcmNoaXZlX2RpcikKCiAgICAjIElmIHppcGZpbGUgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUsIHRyeSBzcGF3bmluZyBhbiBleHRlcm5hbCAnemlwJwogICAgIyBjb21tYW5kLgogICAgdHJ5OgogICAgICAgIGltcG9ydCB6aXBmaWxlCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgemlwZmlsZSA9IE5vbmUKCiAgICBpZiB6aXBmaWxlIGlzIE5vbmU6CiAgICAgICAgX2NhbGxfZXh0ZXJuYWxfemlwKGJhc2VfZGlyLCB6aXBfZmlsZW5hbWUsIHZlcmJvc2UsIGRyeV9ydW4pCiAgICBlbHNlOgogICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNyZWF0aW5nICclcycgYW5kIGFkZGluZyAnJXMnIHRvIGl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgemlwX2ZpbGVuYW1lLCBiYXNlX2RpcikKCiAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgIHppcCA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZW5hbWUsICJ3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQoKICAgICAgICAgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhiYXNlX2Rpcik6CiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGRpcnBhdGgsIG5hbWUpKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICB6aXAud3JpdGUocGF0aCwgcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyAnJXMnIiwgcGF0aCkKICAgICAgICAgICAgemlwLmNsb3NlKCkKCiAgICByZXR1cm4gemlwX2ZpbGVuYW1lCgpfQVJDSElWRV9GT1JNQVRTID0gewogICAgJ2d6dGFyJzogKF9tYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgJ2d6aXAnKV0sICJnemlwJ2VkIHRhci1maWxlIiksCiAgICAnYnp0YXInOiAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCAnYnppcDInKV0sICJiemlwMidlZCB0YXItZmlsZSIpLAogICAgJ3Rhcic6ICAgKF9tYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgTm9uZSldLCAidW5jb21wcmVzc2VkIHRhciBmaWxlIiksCiAgICAnemlwJzogICAoX21ha2VfemlwZmlsZSwgW10sICJaSVAgZmlsZSIpLAogICAgfQoKaWYgX0JaMl9TVVBQT1JURUQ6CiAgICBfQVJDSElWRV9GT1JNQVRTWydienRhciddID0gKF9tYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgJ2J6aXAyJyldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiemlwMidlZCB0YXItZmlsZSIpCgpkZWYgZ2V0X2FyY2hpdmVfZm9ybWF0cygpOgogICAgIiIiUmV0dXJucyBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMgZm9yIGFyY2hpdmluZyBhbmQgdW5hcmNoaXZpbmcuCgogICAgRWFjaCBlbGVtZW50IG9mIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSBpcyBhIHR1cGxlIChuYW1lLCBkZXNjcmlwdGlvbikKICAgICIiIgogICAgZm9ybWF0cyA9IFsobmFtZSwgcmVnaXN0cnlbMl0pIGZvciBuYW1lLCByZWdpc3RyeSBpbgogICAgICAgICAgICAgICBfQVJDSElWRV9GT1JNQVRTLml0ZW1zKCldCiAgICBmb3JtYXRzLnNvcnQoKQogICAgcmV0dXJuIGZvcm1hdHMKCmRlZiByZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdChuYW1lLCBmdW5jdGlvbiwgZXh0cmFfYXJncz1Ob25lLCBkZXNjcmlwdGlvbj0nJyk6CiAgICAiIiJSZWdpc3RlcnMgYW4gYXJjaGl2ZSBmb3JtYXQuCgogICAgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZm9ybWF0LiBmdW5jdGlvbiBpcyB0aGUgY2FsbGFibGUgdGhhdCB3aWxsIGJlCiAgICB1c2VkIHRvIGNyZWF0ZSBhcmNoaXZlcy4gSWYgcHJvdmlkZWQsIGV4dHJhX2FyZ3MgaXMgYSBzZXF1ZW5jZSBvZgogICAgKG5hbWUsIHZhbHVlKSB0dXBsZXMgdGhhdCB3aWxsIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGNhbGxhYmxlLgogICAgZGVzY3JpcHRpb24gY2FuIGJlIHByb3ZpZGVkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQsIGFuZCB3aWxsIGJlIHJldHVybmVkCiAgICBieSB0aGUgZ2V0X2FyY2hpdmVfZm9ybWF0cygpIGZ1bmN0aW9uLgogICAgIiIiCiAgICBpZiBleHRyYV9hcmdzIGlzIE5vbmU6CiAgICAgICAgZXh0cmFfYXJncyA9IFtdCiAgICBpZiBub3QgaXNpbnN0YW5jZShmdW5jdGlvbiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcignVGhlICVzIG9iamVjdCBpcyBub3QgY2FsbGFibGUnICUgZnVuY3Rpb24pCiAgICBpZiBub3QgaXNpbnN0YW5jZShleHRyYV9hcmdzLCAodHVwbGUsIGxpc3QpKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4dHJhX2FyZ3MgbmVlZHMgdG8gYmUgYSBzZXF1ZW5jZScpCiAgICBmb3IgZWxlbWVudCBpbiBleHRyYV9hcmdzOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGVsZW1lbnQsICh0dXBsZSwgbGlzdCkpIG9yIGxlbihlbGVtZW50KSAhPTI6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXh0cmFfYXJncyBlbGVtZW50cyBhcmUgOiAoYXJnX25hbWUsIHZhbHVlKScpCgogICAgX0FSQ0hJVkVfRk9STUFUU1tuYW1lXSA9IChmdW5jdGlvbiwgZXh0cmFfYXJncywgZGVzY3JpcHRpb24pCgpkZWYgdW5yZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdChuYW1lKToKICAgIGRlbCBfQVJDSElWRV9GT1JNQVRTW25hbWVdCgpkZWYgbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgZm9ybWF0LCByb290X2Rpcj1Ob25lLCBiYXNlX2Rpcj1Ob25lLCB2ZXJib3NlPTAsCiAgICAgICAgICAgICAgICAgZHJ5X3J1bj0wLCBvd25lcj1Ob25lLCBncm91cD1Ob25lLCBsb2dnZXI9Tm9uZSk6CiAgICAiIiJDcmVhdGUgYW4gYXJjaGl2ZSBmaWxlIChlZy4gemlwIG9yIHRhcikuCgogICAgJ2Jhc2VfbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLCBtaW51cyBhbnkgZm9ybWF0LXNwZWNpZmljCiAgICBleHRlbnNpb247ICdmb3JtYXQnIGlzIHRoZSBhcmNoaXZlIGZvcm1hdDogb25lIG9mICJ6aXAiLCAidGFyIiwgImJ6dGFyIgogICAgb3IgImd6dGFyIi4KCiAgICAncm9vdF9kaXInIGlzIGEgZGlyZWN0b3J5IHRoYXQgd2lsbCBiZSB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlCiAgICBhcmNoaXZlOyBpZS4gd2UgdHlwaWNhbGx5IGNoZGlyIGludG8gJ3Jvb3RfZGlyJyBiZWZvcmUgY3JlYXRpbmcgdGhlCiAgICBhcmNoaXZlLiAgJ2Jhc2VfZGlyJyBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlIHN0YXJ0IGFyY2hpdmluZyBmcm9tOwogICAgaWUuICdiYXNlX2Rpcicgd2lsbCBiZSB0aGUgY29tbW9uIHByZWZpeCBvZiBhbGwgZmlsZXMgYW5kCiAgICBkaXJlY3RvcmllcyBpbiB0aGUgYXJjaGl2ZS4gICdyb290X2RpcicgYW5kICdiYXNlX2RpcicgYm90aCBkZWZhdWx0CiAgICB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIGZpbGUuCgogICAgJ293bmVyJyBhbmQgJ2dyb3VwJyBhcmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGFyY2hpdmUuIEJ5IGRlZmF1bHQsCiAgICB1c2VzIHRoZSBjdXJyZW50IG93bmVyIGFuZCBncm91cC4KICAgICIiIgogICAgc2F2ZV9jd2QgPSBvcy5nZXRjd2QoKQogICAgaWYgcm9vdF9kaXIgaXMgbm90IE5vbmU6CiAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoImNoYW5naW5nIGludG8gJyVzJyIsIHJvb3RfZGlyKQogICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguYWJzcGF0aChiYXNlX25hbWUpCiAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgIG9zLmNoZGlyKHJvb3RfZGlyKQoKICAgIGlmIGJhc2VfZGlyIGlzIE5vbmU6CiAgICAgICAgYmFzZV9kaXIgPSBvcy5jdXJkaXIKCiAgICBrd2FyZ3MgPSB7J2RyeV9ydW4nOiBkcnlfcnVuLCAnbG9nZ2VyJzogbG9nZ2VyfQoKICAgIHRyeToKICAgICAgICBmb3JtYXRfaW5mbyA9IF9BUkNISVZFX0ZPUk1BVFNbZm9ybWF0XQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gYXJjaGl2ZSBmb3JtYXQgJyVzJyIgJSBmb3JtYXQpCgogICAgZnVuYyA9IGZvcm1hdF9pbmZvWzBdCiAgICBmb3IgYXJnLCB2YWwgaW4gZm9ybWF0X2luZm9bMV06CiAgICAgICAga3dhcmdzW2FyZ10gPSB2YWwKCiAgICBpZiBmb3JtYXQgIT0gJ3ppcCc6CiAgICAgICAga3dhcmdzWydvd25lciddID0gb3duZXIKICAgICAgICBrd2FyZ3NbJ2dyb3VwJ10gPSBncm91cAoKICAgIHRyeToKICAgICAgICBmaWxlbmFtZSA9IGZ1bmMoYmFzZV9uYW1lLCBiYXNlX2RpciwgKiprd2FyZ3MpCiAgICBmaW5hbGx5OgogICAgICAgIGlmIHJvb3RfZGlyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoImNoYW5naW5nIGJhY2sgdG8gJyVzJyIsIHNhdmVfY3dkKQogICAgICAgICAgICBvcy5jaGRpcihzYXZlX2N3ZCkKCiAgICByZXR1cm4gZmlsZW5hbWUKCgpkZWYgZ2V0X3VucGFja19mb3JtYXRzKCk6CiAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cyBmb3IgdW5wYWNraW5nLgoKICAgIEVhY2ggZWxlbWVudCBvZiB0aGUgcmV0dXJuZWQgc2VxdWVuY2UgaXMgYSB0dXBsZQogICAgKG5hbWUsIGV4dGVuc2lvbnMsIGRlc2NyaXB0aW9uKQogICAgIiIiCiAgICBmb3JtYXRzID0gWyhuYW1lLCBpbmZvWzBdLCBpbmZvWzNdKSBmb3IgbmFtZSwgaW5mbyBpbgogICAgICAgICAgICAgICBfVU5QQUNLX0ZPUk1BVFMuaXRlbXMoKV0KICAgIGZvcm1hdHMuc29ydCgpCiAgICByZXR1cm4gZm9ybWF0cwoKZGVmIF9jaGVja191bnBhY2tfb3B0aW9ucyhleHRlbnNpb25zLCBmdW5jdGlvbiwgZXh0cmFfYXJncyk6CiAgICAiIiJDaGVja3Mgd2hhdCBnZXRzIHJlZ2lzdGVyZWQgYXMgYW4gdW5wYWNrZXIuIiIiCiAgICAjIGZpcnN0IG1ha2Ugc3VyZSBubyBvdGhlciB1bnBhY2tlciBpcyByZWdpc3RlcmVkIGZvciB0aGlzIGV4dGVuc2lvbgogICAgZXhpc3RpbmdfZXh0ZW5zaW9ucyA9IHt9CiAgICBmb3IgbmFtZSwgaW5mbyBpbiBfVU5QQUNLX0ZPUk1BVFMuaXRlbXMoKToKICAgICAgICBmb3IgZXh0IGluIGluZm9bMF06CiAgICAgICAgICAgIGV4aXN0aW5nX2V4dGVuc2lvbnNbZXh0XSA9IG5hbWUKCiAgICBmb3IgZXh0ZW5zaW9uIGluIGV4dGVuc2lvbnM6CiAgICAgICAgaWYgZXh0ZW5zaW9uIGluIGV4aXN0aW5nX2V4dGVuc2lvbnM6CiAgICAgICAgICAgIG1zZyA9ICclcyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yICIlcyInCiAgICAgICAgICAgIHJhaXNlIFJlZ2lzdHJ5RXJyb3IobXNnICUgKGV4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfZXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKCiAgICBpZiBub3QgaXNpbnN0YW5jZShmdW5jdGlvbiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcignVGhlIHJlZ2lzdGVyZWQgZnVuY3Rpb24gbXVzdCBiZSBhIGNhbGxhYmxlJykKCgpkZWYgcmVnaXN0ZXJfdW5wYWNrX2Zvcm1hdChuYW1lLCBleHRlbnNpb25zLCBmdW5jdGlvbiwgZXh0cmFfYXJncz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0nJyk6CiAgICAiIiJSZWdpc3RlcnMgYW4gdW5wYWNrIGZvcm1hdC4KCiAgICBgbmFtZWAgaXMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hdC4gYGV4dGVuc2lvbnNgIGlzIGEgbGlzdCBvZiBleHRlbnNpb25zCiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQuCgogICAgYGZ1bmN0aW9uYCBpcyB0aGUgY2FsbGFibGUgdGhhdCB3aWxsIGJlCiAgICB1c2VkIHRvIHVucGFjayBhcmNoaXZlcy4gVGhlIGNhbGxhYmxlIHdpbGwgcmVjZWl2ZSBhcmNoaXZlcyB0byB1bnBhY2suCiAgICBJZiBpdCdzIHVuYWJsZSB0byBoYW5kbGUgYW4gYXJjaGl2ZSwgaXQgbmVlZHMgdG8gcmFpc2UgYSBSZWFkRXJyb3IKICAgIGV4Y2VwdGlvbi4KCiAgICBJZiBwcm92aWRlZCwgYGV4dHJhX2FyZ3NgIGlzIGEgc2VxdWVuY2Ugb2YKICAgIChuYW1lLCB2YWx1ZSkgdHVwbGVzIHRoYXQgd2lsbCBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZSBjYWxsYWJsZS4KICAgIGRlc2NyaXB0aW9uIGNhbiBiZSBwcm92aWRlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0LCBhbmQgd2lsbCBiZSByZXR1cm5lZAogICAgYnkgdGhlIGdldF91bnBhY2tfZm9ybWF0cygpIGZ1bmN0aW9uLgogICAgIiIiCiAgICBpZiBleHRyYV9hcmdzIGlzIE5vbmU6CiAgICAgICAgZXh0cmFfYXJncyA9IFtdCiAgICBfY2hlY2tfdW5wYWNrX29wdGlvbnMoZXh0ZW5zaW9ucywgZnVuY3Rpb24sIGV4dHJhX2FyZ3MpCiAgICBfVU5QQUNLX0ZPUk1BVFNbbmFtZV0gPSBleHRlbnNpb25zLCBmdW5jdGlvbiwgZXh0cmFfYXJncywgZGVzY3JpcHRpb24KCmRlZiB1bnJlZ2lzdGVyX3VucGFja19mb3JtYXQobmFtZSk6CiAgICAiIiJSZW1vdmVzIHRoZSBwYWNrIGZvcm1hdCBmcm9tIHRoZSByZWdpc3RyeS4iIiIKICAgIGRlbCBfVU5QQUNLX0ZPUk1BVFNbbmFtZV0KCmRlZiBfZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIkVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGBwYXRoYCBleGlzdHMiIiIKICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgIG9zLm1ha2VkaXJzKGRpcm5hbWUpCgpkZWYgX3VucGFja196aXBmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2Rpcik6CiAgICAiIiJVbnBhY2sgemlwIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAogICAgIiIiCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHppcGZpbGUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByYWlzZSBSZWFkRXJyb3IoJ3psaWIgbm90IHN1cHBvcnRlZCwgY2Fubm90IHVucGFjayB0aGlzIGFyY2hpdmUuJykKCiAgICBpZiBub3QgemlwZmlsZS5pc196aXBmaWxlKGZpbGVuYW1lKToKICAgICAgICByYWlzZSBSZWFkRXJyb3IoIiVzIGlzIG5vdCBhIHppcCBmaWxlIiAlIGZpbGVuYW1lKQoKICAgIHppcCA9IHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSkKICAgIHRyeToKICAgICAgICBmb3IgaW5mbyBpbiB6aXAuaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKCiAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQogICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJy8nKSBvciAnLi4nIGluIG5hbWU6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGV4dHJhY3RfZGlyLCAqbmFtZS5zcGxpdCgnLycpKQogICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIF9lbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgaWYgbm90IG5hbWUuZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgICMgZmlsZQogICAgICAgICAgICAgICAgZGF0YSA9IHppcC5yZWFkKGluZm8uZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBmID0gb3Blbih0YXJnZXQsICd3YicpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICBkZWwgZGF0YQogICAgZmluYWxseToKICAgICAgICB6aXAuY2xvc2UoKQoKZGVmIF91bnBhY2tfdGFyZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIpOgogICAgIiIiVW5wYWNrIHRhci90YXIuZ3ovdGFyLmJ6MiBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKICAgICIiIgogICAgdHJ5OgogICAgICAgIHRhcm9iaiA9IHRhcmZpbGUub3BlbihmaWxlbmFtZSkKICAgIGV4Y2VwdCB0YXJmaWxlLlRhckVycm9yOgogICAgICAgIHJhaXNlIFJlYWRFcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkIHRhciBmaWxlIiAlIGZpbGVuYW1lKQogICAgdHJ5OgogICAgICAgIHRhcm9iai5leHRyYWN0YWxsKGV4dHJhY3RfZGlyKQogICAgZmluYWxseToKICAgICAgICB0YXJvYmouY2xvc2UoKQoKX1VOUEFDS19GT1JNQVRTID0gewogICAgJ2d6dGFyJzogKFsnLnRhci5neicsICcudGd6J10sIF91bnBhY2tfdGFyZmlsZSwgW10sICJnemlwJ2VkIHRhci1maWxlIiksCiAgICAndGFyJzogICAoWycudGFyJ10sIF91bnBhY2tfdGFyZmlsZSwgW10sICJ1bmNvbXByZXNzZWQgdGFyIGZpbGUiKSwKICAgICd6aXAnOiAgIChbJy56aXAnXSwgX3VucGFja196aXBmaWxlLCBbXSwgIlpJUCBmaWxlIikKICAgIH0KCmlmIF9CWjJfU1VQUE9SVEVEOgogICAgX1VOUEFDS19GT1JNQVRTWydienRhciddID0gKFsnLmJ6MiddLCBfdW5wYWNrX3RhcmZpbGUsIFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiemlwMidlZCB0YXItZmlsZSIpCgpkZWYgX2ZpbmRfdW5wYWNrX2Zvcm1hdChmaWxlbmFtZSk6CiAgICBmb3IgbmFtZSwgaW5mbyBpbiBfVU5QQUNLX0ZPUk1BVFMuaXRlbXMoKToKICAgICAgICBmb3IgZXh0ZW5zaW9uIGluIGluZm9bMF06CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKGV4dGVuc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZQogICAgcmV0dXJuIE5vbmUKCmRlZiB1bnBhY2tfYXJjaGl2ZShmaWxlbmFtZSwgZXh0cmFjdF9kaXI9Tm9uZSwgZm9ybWF0PU5vbmUpOgogICAgIiIiVW5wYWNrIGFuIGFyY2hpdmUuCgogICAgYGZpbGVuYW1lYCBpcyB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZS4KCiAgICBgZXh0cmFjdF9kaXJgIGlzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgZGlyZWN0b3J5LCB3aGVyZSB0aGUgYXJjaGl2ZQogICAgaXMgdW5wYWNrZWQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgdXNlZC4KCiAgICBgZm9ybWF0YCBpcyB0aGUgYXJjaGl2ZSBmb3JtYXQ6IG9uZSBvZiAiemlwIiwgInRhciIsIG9yICJnenRhciIuIE9yIGFueQogICAgb3RoZXIgcmVnaXN0ZXJlZCBmb3JtYXQuIElmIG5vdCBwcm92aWRlZCwgdW5wYWNrX2FyY2hpdmUgd2lsbCB1c2UgdGhlCiAgICBmaWxlbmFtZSBleHRlbnNpb24gYW5kIHNlZSBpZiBhbiB1bnBhY2tlciB3YXMgcmVnaXN0ZXJlZCBmb3IgdGhhdAogICAgZXh0ZW5zaW9uLgoKICAgIEluIGNhc2Ugbm9uZSBpcyBmb3VuZCwgYSBWYWx1ZUVycm9yIGlzIHJhaXNlZC4KICAgICIiIgogICAgaWYgZXh0cmFjdF9kaXIgaXMgTm9uZToKICAgICAgICBleHRyYWN0X2RpciA9IG9zLmdldGN3ZCgpCgogICAgaWYgZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgZm9ybWF0X2luZm8gPSBfVU5QQUNLX0ZPUk1BVFNbZm9ybWF0XQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biB1bnBhY2sgZm9ybWF0ICd7MH0nIi5mb3JtYXQoZm9ybWF0KSkKCiAgICAgICAgZnVuYyA9IGZvcm1hdF9pbmZvWzFdCiAgICAgICAgZnVuYyhmaWxlbmFtZSwgZXh0cmFjdF9kaXIsICoqZGljdChmb3JtYXRfaW5mb1syXSkpCiAgICBlbHNlOgogICAgICAgICMgd2UgbmVlZCB0byBsb29rIGF0IHRoZSByZWdpc3RlcmVkIHVucGFja2VycyBzdXBwb3J0ZWQgZXh0ZW5zaW9ucwogICAgICAgIGZvcm1hdCA9IF9maW5kX3VucGFja19mb3JtYXQoZmlsZW5hbWUpCiAgICAgICAgaWYgZm9ybWF0IGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiVW5rbm93biBhcmNoaXZlIGZvcm1hdCAnezB9JyIuZm9ybWF0KGZpbGVuYW1lKSkKCiAgICAgICAgZnVuYyA9IF9VTlBBQ0tfRk9STUFUU1tmb3JtYXRdWzFdCiAgICAgICAga3dhcmdzID0gZGljdChfVU5QQUNLX0ZPUk1BVFNbZm9ybWF0XVsyXSkKICAgICAgICBmdW5jKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgKiprd2FyZ3MpClBLAwQUAAAAAAAAACEAbxYArTkKAAA5CgAASAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLmNmZ1twb3NpeF9wcmVmaXhdCiMgQ29uZmlndXJhdGlvbiBkaXJlY3Rvcmllcy4gIFNvbWUgb2YgdGhlc2UgY29tZSBzdHJhaWdodCBvdXQgb2YgdGhlCiMgY29uZmlndXJlIHNjcmlwdC4gIFRoZXkgYXJlIGZvciBpbXBsZW1lbnRpbmcgdGhlIG90aGVyIHZhcmlhYmxlcywgbm90IHRvCiMgYmUgdXNlZCBkaXJlY3RseSBpbiBbcmVzb3VyY2VfbG9jYXRpb25zXS4KY29uZmRpciA9IC9ldGMKZGF0YWRpciA9IC91c3Ivc2hhcmUKbGliZGlyID0gL3Vzci9saWIKc3RhdGVkaXIgPSAvdmFyCiMgVXNlciByZXNvdXJjZSBkaXJlY3RvcnkKbG9jYWwgPSB+Ly5sb2NhbC97ZGlzdHJpYnV0aW9uLm5hbWV9CgpzdGRsaWIgPSB7YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwbGF0c3RkbGliID0ge3BsYXRiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnB1cmVsaWIgPSB7YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7cGxhdGJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge2Jhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9e2FiaWZsYWdzfQpwbGF0aW5jbHVkZSA9IHtwbGF0YmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH17YWJpZmxhZ3N9CmRhdGEgPSB7YmFzZX0KCltwb3NpeF9ob21lXQpzdGRsaWIgPSB7YmFzZX0vbGliL3B5dGhvbgpwbGF0c3RkbGliID0ge2Jhc2V9L2xpYi9weXRob24KcHVyZWxpYiA9IHtiYXNlfS9saWIvcHl0aG9uCnBsYXRsaWIgPSB7YmFzZX0vbGliL3B5dGhvbgppbmNsdWRlID0ge2Jhc2V9L2luY2x1ZGUvcHl0aG9uCnBsYXRpbmNsdWRlID0ge2Jhc2V9L2luY2x1ZGUvcHl0aG9uCnNjcmlwdHMgPSB7YmFzZX0vYmluCmRhdGEgPSB7YmFzZX0KCltudF0Kc3RkbGliID0ge2Jhc2V9L0xpYgpwbGF0c3RkbGliID0ge2Jhc2V9L0xpYgpwdXJlbGliID0ge2Jhc2V9L0xpYi9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7YmFzZX0vTGliL3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHtiYXNlfS9JbmNsdWRlCnBsYXRpbmNsdWRlID0ge2Jhc2V9L0luY2x1ZGUKc2NyaXB0cyA9IHtiYXNlfS9TY3JpcHRzCmRhdGEgPSB7YmFzZX0KCltvczJdCnN0ZGxpYiA9IHtiYXNlfS9MaWIKcGxhdHN0ZGxpYiA9IHtiYXNlfS9MaWIKcHVyZWxpYiA9IHtiYXNlfS9MaWIvc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge2Jhc2V9L0xpYi9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7YmFzZX0vSW5jbHVkZQpwbGF0aW5jbHVkZSA9IHtiYXNlfS9JbmNsdWRlCnNjcmlwdHMgPSB7YmFzZX0vU2NyaXB0cwpkYXRhID0ge2Jhc2V9Cgpbb3MyX2hvbWVdCnN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwbGF0c3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnB1cmVsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHt1c2VyYmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH0Kc2NyaXB0cyA9IHt1c2VyYmFzZX0vYmluCmRhdGEgPSB7dXNlcmJhc2V9CgpbbnRfdXNlcl0Kc3RkbGliID0ge3VzZXJiYXNlfS9QeXRob257cHlfdmVyc2lvbl9ub2RvdH0KcGxhdHN0ZGxpYiA9IHt1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9CnB1cmVsaWIgPSB7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fS9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fS9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fS9JbmNsdWRlCnNjcmlwdHMgPSB7dXNlcmJhc2V9L1NjcmlwdHMKZGF0YSA9IHt1c2VyYmFzZX0KCltwb3NpeF91c2VyXQpzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0KcGxhdHN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwdXJlbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7dXNlcmJhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnNjcmlwdHMgPSB7dXNlcmJhc2V9L2JpbgpkYXRhID0ge3VzZXJiYXNlfQoKW29zeF9mcmFtZXdvcmtfdXNlcl0Kc3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9uCnBsYXRzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob24KcHVyZWxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbi9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob24vc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge3VzZXJiYXNlfS9pbmNsdWRlCnNjcmlwdHMgPSB7dXNlcmJhc2V9L2JpbgpkYXRhID0ge3VzZXJiYXNlfQpQSwMEFAAAAAAAAAAhADYPUtZLaQAAS2kAAEcAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3N5c2NvbmZpZy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJBY2Nlc3MgdG8gUHl0aG9uJ3MgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4iIiIKCmltcG9ydCBjb2RlY3MKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3lzCmZyb20gb3MucGF0aCBpbXBvcnQgcGFyZGlyLCByZWFscGF0aAp0cnk6CiAgICBpbXBvcnQgY29uZmlncGFyc2VyCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBDb25maWdQYXJzZXIgYXMgY29uZmlncGFyc2VyCgoKX19hbGxfXyA9IFsKICAgICdnZXRfY29uZmlnX2hfZmlsZW5hbWUnLAogICAgJ2dldF9jb25maWdfdmFyJywKICAgICdnZXRfY29uZmlnX3ZhcnMnLAogICAgJ2dldF9tYWtlZmlsZV9maWxlbmFtZScsCiAgICAnZ2V0X3BhdGgnLAogICAgJ2dldF9wYXRoX25hbWVzJywKICAgICdnZXRfcGF0aHMnLAogICAgJ2dldF9wbGF0Zm9ybScsCiAgICAnZ2V0X3B5dGhvbl92ZXJzaW9uJywKICAgICdnZXRfc2NoZW1lX25hbWVzJywKICAgICdwYXJzZV9jb25maWdfaCcsCl0KCgpkZWYgX3NhZmVfcmVhbHBhdGgocGF0aCk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHJlYWxwYXRoKHBhdGgpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICByZXR1cm4gcGF0aAoKCmlmIHN5cy5leGVjdXRhYmxlOgogICAgX1BST0pFQ1RfQkFTRSA9IG9zLnBhdGguZGlybmFtZShfc2FmZV9yZWFscGF0aChzeXMuZXhlY3V0YWJsZSkpCmVsc2U6CiAgICAjIHN5cy5leGVjdXRhYmxlIGNhbiBiZSBlbXB0eSBpZiBhcmd2WzBdIGhhcyBiZWVuIGNoYW5nZWQgYW5kIFB5dGhvbiBpcwogICAgIyB1bmFibGUgdG8gcmV0cmlldmUgdGhlIHJlYWwgcHJvZ3JhbSBuYW1lCiAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MuZ2V0Y3dkKCkpCgppZiBvcy5uYW1lID09ICJudCIgYW5kICJwY2J1aWxkIiBpbiBfUFJPSkVDVF9CQVNFWy04Ol0ubG93ZXIoKToKICAgIF9QUk9KRUNUX0JBU0UgPSBfc2FmZV9yZWFscGF0aChvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgcGFyZGlyKSkKIyBQQy9WUzcuMQppZiBvcy5uYW1lID09ICJudCIgYW5kICJcXHBjXFx2IiBpbiBfUFJPSkVDVF9CQVNFWy0xMDpdLmxvd2VyKCk6CiAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsIHBhcmRpciwgcGFyZGlyKSkKIyBQQy9BTUQ2NAppZiBvcy5uYW1lID09ICJudCIgYW5kICJcXHBjYnVpbGRcXGFtZDY0IiBpbiBfUFJPSkVDVF9CQVNFWy0xNDpdLmxvd2VyKCk6CiAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsIHBhcmRpciwgcGFyZGlyKSkKCgpkZWYgaXNfcHl0aG9uX2J1aWxkKCk6CiAgICBmb3IgZm4gaW4gKCJTZXR1cC5kaXN0IiwgIlNldHVwLmxvY2FsIik6CiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsICJNb2R1bGVzIiwgZm4pKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKX1BZVEhPTl9CVUlMRCA9IGlzX3B5dGhvbl9idWlsZCgpCgpfY2ZnX3JlYWQgPSBGYWxzZQoKZGVmIF9lbnN1cmVfY2ZnX3JlYWQoKToKICAgIGdsb2JhbCBfY2ZnX3JlYWQKICAgIGlmIG5vdCBfY2ZnX3JlYWQ6CiAgICAgICAgZnJvbSAuLnJlc291cmNlcyBpbXBvcnQgZmluZGVyCiAgICAgICAgYmFja3BvcnRfcGFja2FnZSA9IF9fbmFtZV9fLnJzcGxpdCgnLicsIDEpWzBdCiAgICAgICAgX2ZpbmRlciA9IGZpbmRlcihiYWNrcG9ydF9wYWNrYWdlKQogICAgICAgIF9jZmdmaWxlID0gX2ZpbmRlci5maW5kKCdzeXNjb25maWcuY2ZnJykKICAgICAgICBhc3NlcnQgX2NmZ2ZpbGUsICdzeXNjb25maWcuY2ZnIGV4aXN0cycKICAgICAgICB3aXRoIF9jZmdmaWxlLmFzX3N0cmVhbSgpIGFzIHM6CiAgICAgICAgICAgIF9TQ0hFTUVTLnJlYWRmcChzKQogICAgICAgIGlmIF9QWVRIT05fQlVJTEQ6CiAgICAgICAgICAgIGZvciBzY2hlbWUgaW4gKCdwb3NpeF9wcmVmaXgnLCAncG9zaXhfaG9tZScpOgogICAgICAgICAgICAgICAgX1NDSEVNRVMuc2V0KHNjaGVtZSwgJ2luY2x1ZGUnLCAne3NyY2Rpcn0vSW5jbHVkZScpCiAgICAgICAgICAgICAgICBfU0NIRU1FUy5zZXQoc2NoZW1lLCAncGxhdGluY2x1ZGUnLCAne3Byb2plY3RiYXNlfS8uJykKCiAgICAgICAgX2NmZ19yZWFkID0gVHJ1ZQoKCl9TQ0hFTUVTID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCl9WQVJfUkVQTCA9IHJlLmNvbXBpbGUocidceyhbXntdKj8pXH0nKQoKZGVmIF9leHBhbmRfZ2xvYmFscyhjb25maWcpOgogICAgX2Vuc3VyZV9jZmdfcmVhZCgpCiAgICBpZiBjb25maWcuaGFzX3NlY3Rpb24oJ2dsb2JhbHMnKToKICAgICAgICBnbG9iYWxzID0gY29uZmlnLml0ZW1zKCdnbG9iYWxzJykKICAgIGVsc2U6CiAgICAgICAgZ2xvYmFscyA9IHR1cGxlKCkKCiAgICBzZWN0aW9ucyA9IGNvbmZpZy5zZWN0aW9ucygpCiAgICBmb3Igc2VjdGlvbiBpbiBzZWN0aW9uczoKICAgICAgICBpZiBzZWN0aW9uID09ICdnbG9iYWxzJzoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBmb3Igb3B0aW9uLCB2YWx1ZSBpbiBnbG9iYWxzOgogICAgICAgICAgICBpZiBjb25maWcuaGFzX29wdGlvbihzZWN0aW9uLCBvcHRpb24pOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY29uZmlnLnNldChzZWN0aW9uLCBvcHRpb24sIHZhbHVlKQogICAgY29uZmlnLnJlbW92ZV9zZWN0aW9uKCdnbG9iYWxzJykKCiAgICAjIG5vdyBleHBhbmRpbmcgbG9jYWwgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNmZyBmaWxlCiAgICAjCiAgICBmb3Igc2VjdGlvbiBpbiBjb25maWcuc2VjdGlvbnMoKToKICAgICAgICB2YXJpYWJsZXMgPSBkaWN0KGNvbmZpZy5pdGVtcyhzZWN0aW9uKSkKCiAgICAgICAgZGVmIF9yZXBsYWNlcihtYXRjaG9iaik6CiAgICAgICAgICAgIG5hbWUgPSBtYXRjaG9iai5ncm91cCgxKQogICAgICAgICAgICBpZiBuYW1lIGluIHZhcmlhYmxlczoKICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZXNbbmFtZV0KICAgICAgICAgICAgcmV0dXJuIG1hdGNob2JqLmdyb3VwKDApCgogICAgICAgIGZvciBvcHRpb24sIHZhbHVlIGluIGNvbmZpZy5pdGVtcyhzZWN0aW9uKToKICAgICAgICAgICAgY29uZmlnLnNldChzZWN0aW9uLCBvcHRpb24sIF9WQVJfUkVQTC5zdWIoX3JlcGxhY2VyLCB2YWx1ZSkpCgojX2V4cGFuZF9nbG9iYWxzKF9TQ0hFTUVTKQoKICMgRklYTUUgZG9uJ3QgcmVseSBvbiBzeXMudmVyc2lvbiBoZXJlLCBpdHMgZm9ybWF0IGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbAogIyBvZiBDUHl0aG9uLCB1c2Ugc3lzLnZlcnNpb25faW5mbyBvciBzeXMuaGV4dmVyc2lvbgpfUFlfVkVSU0lPTiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KX1BZX1ZFUlNJT05fU0hPUlQgPSBzeXMudmVyc2lvbls6M10KX1BZX1ZFUlNJT05fU0hPUlRfTk9fRE9UID0gX1BZX1ZFUlNJT05bMF0gKyBfUFlfVkVSU0lPTlsyXQpfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMucHJlZml4KQpfRVhFQ19QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjX3ByZWZpeCkKX0NPTkZJR19WQVJTID0gTm9uZQpfVVNFUl9CQVNFID0gTm9uZQoKCmRlZiBfc3Vic3RfdmFycyhwYXRoLCBsb2NhbF92YXJzKToKICAgICIiIkluIHRoZSBzdHJpbmcgYHBhdGhgLCByZXBsYWNlIHRva2VucyBsaWtlIHtzb21lLnRoaW5nfSB3aXRoIHRoZQogICAgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIHRoZSBtYXAgYGxvY2FsX3ZhcnNgLgoKICAgIElmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgdmFsdWUsIGxlYXZlIHRoZSB0b2tlbiB1bmNoYW5nZWQuCiAgICAiIiIKICAgIGRlZiBfcmVwbGFjZXIobWF0Y2hvYmopOgogICAgICAgIG5hbWUgPSBtYXRjaG9iai5ncm91cCgxKQogICAgICAgIGlmIG5hbWUgaW4gbG9jYWxfdmFyczoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsX3ZhcnNbbmFtZV0KICAgICAgICBlbGlmIG5hbWUgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bbmFtZV0KICAgICAgICByZXR1cm4gbWF0Y2hvYmouZ3JvdXAoMCkKICAgIHJldHVybiBfVkFSX1JFUEwuc3ViKF9yZXBsYWNlciwgcGF0aCkKCgpkZWYgX2V4dGVuZF9kaWN0KHRhcmdldF9kaWN0LCBvdGhlcl9kaWN0KToKICAgIHRhcmdldF9rZXlzID0gdGFyZ2V0X2RpY3Qua2V5cygpCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvdGhlcl9kaWN0Lml0ZW1zKCk6CiAgICAgICAgaWYga2V5IGluIHRhcmdldF9rZXlzOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHRhcmdldF9kaWN0W2tleV0gPSB2YWx1ZQoKCmRlZiBfZXhwYW5kX3ZhcnMoc2NoZW1lLCB2YXJzKToKICAgIHJlcyA9IHt9CiAgICBpZiB2YXJzIGlzIE5vbmU6CiAgICAgICAgdmFycyA9IHt9CiAgICBfZXh0ZW5kX2RpY3QodmFycywgZ2V0X2NvbmZpZ192YXJzKCkpCgogICAgZm9yIGtleSwgdmFsdWUgaW4gX1NDSEVNRVMuaXRlbXMoc2NoZW1lKToKICAgICAgICBpZiBvcy5uYW1lIGluICgncG9zaXgnLCAnbnQnKToKICAgICAgICAgICAgdmFsdWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsdWUpCiAgICAgICAgcmVzW2tleV0gPSBvcy5wYXRoLm5vcm1wYXRoKF9zdWJzdF92YXJzKHZhbHVlLCB2YXJzKSkKICAgIHJldHVybiByZXMKCgpkZWYgZm9ybWF0X3ZhbHVlKHZhbHVlLCB2YXJzKToKICAgIGRlZiBfcmVwbGFjZXIobWF0Y2hvYmopOgogICAgICAgIG5hbWUgPSBtYXRjaG9iai5ncm91cCgxKQogICAgICAgIGlmIG5hbWUgaW4gdmFyczoKICAgICAgICAgICAgcmV0dXJuIHZhcnNbbmFtZV0KICAgICAgICByZXR1cm4gbWF0Y2hvYmouZ3JvdXAoMCkKICAgIHJldHVybiBfVkFSX1JFUEwuc3ViKF9yZXBsYWNlciwgdmFsdWUpCgoKZGVmIF9nZXRfZGVmYXVsdF9zY2hlbWUoKToKICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAjIHRoZSBkZWZhdWx0IHNjaGVtZSBmb3IgcG9zaXggaXMgcG9zaXhfcHJlZml4CiAgICAgICAgcmV0dXJuICdwb3NpeF9wcmVmaXgnCiAgICByZXR1cm4gb3MubmFtZQoKCmRlZiBfZ2V0dXNlcmJhc2UoKToKICAgIGVudl9iYXNlID0gb3MuZW52aXJvbi5nZXQoIlBZVEhPTlVTRVJCQVNFIiwgTm9uZSkKCiAgICBkZWYgam9pbnVzZXIoKmFyZ3MpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4cGFuZHVzZXIob3MucGF0aC5qb2luKCphcmdzKSkKCiAgICAjIHdoYXQgYWJvdXQgJ29zMmVteCcsICdyaXNjb3MnID8KICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKICAgICAgICBiYXNlID0gb3MuZW52aXJvbi5nZXQoIkFQUERBVEEiKSBvciAifiIKICAgICAgICBpZiBlbnZfYmFzZToKICAgICAgICAgICAgcmV0dXJuIGVudl9iYXNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGpvaW51c2VyKGJhc2UsICJQeXRob24iKQoKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICBmcmFtZXdvcmsgPSBnZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIikKICAgICAgICBpZiBmcmFtZXdvcms6CiAgICAgICAgICAgIGlmIGVudl9iYXNlOgogICAgICAgICAgICAgICAgcmV0dXJuIGVudl9iYXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gam9pbnVzZXIoIn4iLCAiTGlicmFyeSIsIGZyYW1ld29yaywgIiVkLiVkIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mb1s6Ml0pCgogICAgaWYgZW52X2Jhc2U6CiAgICAgICAgcmV0dXJuIGVudl9iYXNlCiAgICBlbHNlOgogICAgICAgIHJldHVybiBqb2ludXNlcigifiIsICIubG9jYWwiKQoKCmRlZiBfcGFyc2VfbWFrZWZpbGUoZmlsZW5hbWUsIHZhcnM9Tm9uZSk6CiAgICAiIiJQYXJzZSBhIE1ha2VmaWxlLXN0eWxlIGZpbGUuCgogICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbmFtZS92YWx1ZSBwYWlycyBpcyByZXR1cm5lZC4gIElmIGFuCiAgICBvcHRpb25hbCBkaWN0aW9uYXJ5IGlzIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpdCBpcwogICAgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3IGRpY3Rpb25hcnkuCiAgICAiIiIKICAgICMgUmVnZXhlcyBuZWVkZWQgZm9yIHBhcnNpbmcgTWFrZWZpbGUgKGFuZCBzaW1pbGFyIHN5bnRheGVzLAogICAgIyBsaWtlIG9sZC1zdHlsZSBTZXR1cCBmaWxlcykuCiAgICBfdmFyaWFibGVfcnggPSByZS5jb21waWxlKCIoW2EtekEtWl1bYS16QS1aMC05X10rKVxzKj1ccyooLiopIikKICAgIF9maW5kdmFyMV9yeCA9IHJlLmNvbXBpbGUociJcJFwoKFtBLVphLXpdW0EtWmEtejAtOV9dKilcKSIpCiAgICBfZmluZHZhcjJfcnggPSByZS5jb21waWxlKHIiXCR7KFtBLVphLXpdW0EtWmEtejAtOV9dKil9IikKCiAgICBpZiB2YXJzIGlzIE5vbmU6CiAgICAgICAgdmFycyA9IHt9CiAgICBkb25lID0ge30KICAgIG5vdGRvbmUgPSB7fQoKICAgIHdpdGggY29kZWNzLm9wZW4oZmlsZW5hbWUsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIikgYXMgZjoKICAgICAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkKCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMnKSBvciBsaW5lLnN0cmlwKCkgPT0gJyc6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbSA9IF92YXJpYWJsZV9yeC5tYXRjaChsaW5lKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIG4sIHYgPSBtLmdyb3VwKDEsIDIpCiAgICAgICAgICAgIHYgPSB2LnN0cmlwKCkKICAgICAgICAgICAgIyBgJCQnIGlzIGEgbGl0ZXJhbCBgJCcgaW4gbWFrZQogICAgICAgICAgICB0bXB2ID0gdi5yZXBsYWNlKCckJCcsICcnKQoKICAgICAgICAgICAgaWYgIiQiIGluIHRtcHY6CiAgICAgICAgICAgICAgICBub3Rkb25lW25dID0gdgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHYgPSBpbnQodikKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICMgaW5zZXJ0IGxpdGVyYWwgYCQnCiAgICAgICAgICAgICAgICAgICAgZG9uZVtuXSA9IHYucmVwbGFjZSgnJCQnLCAnJCcpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSB2CgogICAgIyBkbyB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUKICAgIHZhcmlhYmxlcyA9IGxpc3Qobm90ZG9uZS5rZXlzKCkpCgogICAgIyBWYXJpYWJsZXMgd2l0aCBhICdQWV8nIHByZWZpeCBpbiB0aGUgbWFrZWZpbGUuIFRoZXNlIG5lZWQgdG8KICAgICMgYmUgbWFkZSBhdmFpbGFibGUgd2l0aG91dCB0aGF0IHByZWZpeCB0aHJvdWdoIHN5c2NvbmZpZy4KICAgICMgU3BlY2lhbCBjYXJlIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCB2YXJpYWJsZSBleHBhbnNpb24gd29ya3MsIGV2ZW4KICAgICMgaWYgdGhlIGV4cGFuc2lvbiB1c2VzIHRoZSBuYW1lIHdpdGhvdXQgYSBwcmVmaXguCiAgICByZW5hbWVkX3ZhcmlhYmxlcyA9ICgnQ0ZMQUdTJywgJ0xERkxBR1MnLCAnQ1BQRkxBR1MnKQoKICAgIHdoaWxlIGxlbih2YXJpYWJsZXMpID4gMDoKICAgICAgICBmb3IgbmFtZSBpbiB0dXBsZSh2YXJpYWJsZXMpOgogICAgICAgICAgICB2YWx1ZSA9IG5vdGRvbmVbbmFtZV0KICAgICAgICAgICAgbSA9IF9maW5kdmFyMV9yeC5zZWFyY2godmFsdWUpIG9yIF9maW5kdmFyMl9yeC5zZWFyY2godmFsdWUpCiAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBuID0gbS5ncm91cCgxKQogICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICBpZiBuIGluIGRvbmU6CiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHN0cihkb25lW25dKQogICAgICAgICAgICAgICAgZWxpZiBuIGluIG5vdGRvbmU6CiAgICAgICAgICAgICAgICAgICAgIyBnZXQgaXQgb24gYSBzdWJzZXF1ZW50IHJvdW5kCiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgICAgICAgICAgZWxpZiBuIGluIG9zLmVudmlyb246CiAgICAgICAgICAgICAgICAgICAgIyBkbyBpdCBsaWtlIG1ha2U6IGZhbGwgYmFjayB0byBlbnZpcm9ubWVudAogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBvcy5lbnZpcm9uW25dCgogICAgICAgICAgICAgICAgZWxpZiBuIGluIHJlbmFtZWRfdmFyaWFibGVzOgogICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c3dpdGgoJ1BZXycpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lWzM6XSBpbiByZW5hbWVkX3ZhcmlhYmxlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSAiIgoKICAgICAgICAgICAgICAgICAgICBlbGlmICdQWV8nICsgbiBpbiBub3Rkb25lOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzdHIoZG9uZVsnUFlfJyArIG5dKQoKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZG9uZVtuXSA9IGl0ZW0gPSAiIgoKICAgICAgICAgICAgICAgIGlmIGZvdW5kOgogICAgICAgICAgICAgICAgICAgIGFmdGVyID0gdmFsdWVbbS5lbmQoKTpdCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVs6bS5zdGFydCgpXSArIGl0ZW0gKyBhZnRlcgogICAgICAgICAgICAgICAgICAgIGlmICIkIiBpbiBhZnRlcjoKICAgICAgICAgICAgICAgICAgICAgICAgbm90ZG9uZVtuYW1lXSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQodmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMucmVtb3ZlKG5hbWUpCgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHN3aXRoKCdQWV8nKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMzpdIGluIHJlbmFtZWRfdmFyaWFibGVzKToKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVszOl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIGRvbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBib2d1cyB2YXJpYWJsZSByZWZlcmVuY2UgKGUuZy4gInByZWZpeD0kL29wdC9weXRob24iKTsKICAgICAgICAgICAgICAgICMganVzdCBkcm9wIGl0IHNpbmNlIHdlIGNhbid0IGRlYWwKICAgICAgICAgICAgICAgIGRvbmVbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgdmFyaWFibGVzLnJlbW92ZShuYW1lKQoKICAgICMgc3RyaXAgc3B1cmlvdXMgc3BhY2VzCiAgICBmb3IgaywgdiBpbiBkb25lLml0ZW1zKCk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBzdHIpOgogICAgICAgICAgICBkb25lW2tdID0gdi5zdHJpcCgpCgogICAgIyBzYXZlIHRoZSByZXN1bHRzIGluIHRoZSBnbG9iYWwgZGljdGlvbmFyeQogICAgdmFycy51cGRhdGUoZG9uZSkKICAgIHJldHVybiB2YXJzCgoKZGVmIGdldF9tYWtlZmlsZV9maWxlbmFtZSgpOgogICAgIiIiUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBNYWtlZmlsZS4iIiIKICAgIGlmIF9QWVRIT05fQlVJTEQ6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCAiTWFrZWZpbGUiKQogICAgaWYgaGFzYXR0cihzeXMsICdhYmlmbGFncycpOgogICAgICAgIGNvbmZpZ19kaXJfbmFtZSA9ICdjb25maWctJXMlcycgJSAoX1BZX1ZFUlNJT05fU0hPUlQsIHN5cy5hYmlmbGFncykKICAgIGVsc2U6CiAgICAgICAgY29uZmlnX2Rpcl9uYW1lID0gJ2NvbmZpZycKICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZ2V0X3BhdGgoJ3N0ZGxpYicpLCBjb25maWdfZGlyX25hbWUsICdNYWtlZmlsZScpCgoKZGVmIF9pbml0X3Bvc2l4KHZhcnMpOgogICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBQT1NJWCBzeXN0ZW1zLiIiIgogICAgIyBsb2FkIHRoZSBpbnN0YWxsZWQgTWFrZWZpbGU6CiAgICBtYWtlZmlsZSA9IGdldF9tYWtlZmlsZV9maWxlbmFtZSgpCiAgICB0cnk6CiAgICAgICAgX3BhcnNlX21ha2VmaWxlKG1ha2VmaWxlLCB2YXJzKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZToKICAgICAgICBtc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBtYWtlZmlsZQogICAgICAgIGlmIGhhc2F0dHIoZSwgInN0cmVycm9yIik6CiAgICAgICAgICAgIG1zZyA9IG1zZyArICIgKCVzKSIgJSBlLnN0cmVycm9yCiAgICAgICAgcmFpc2UgSU9FcnJvcihtc2cpCiAgICAjIGxvYWQgdGhlIGluc3RhbGxlZCBweWNvbmZpZy5oOgogICAgY29uZmlnX2ggPSBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKQogICAgdHJ5OgogICAgICAgIHdpdGggb3Blbihjb25maWdfaCkgYXMgZjoKICAgICAgICAgICAgcGFyc2VfY29uZmlnX2goZiwgdmFycykKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CiAgICAgICAgbXNnID0gImludmFsaWQgUHl0aG9uIGluc3RhbGxhdGlvbjogdW5hYmxlIHRvIG9wZW4gJXMiICUgY29uZmlnX2gKICAgICAgICBpZiBoYXNhdHRyKGUsICJzdHJlcnJvciIpOgogICAgICAgICAgICBtc2cgPSBtc2cgKyAiICglcykiICUgZS5zdHJlcnJvcgogICAgICAgIHJhaXNlIElPRXJyb3IobXNnKQogICAgIyBPbiBBSVgsIHRoZXJlIGFyZSB3cm9uZyBwYXRocyB0byB0aGUgbGlua2VyIHNjcmlwdHMgaW4gdGhlIE1ha2VmaWxlCiAgICAjIC0tIHRoZXNlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgUHl0aG9uIHNvdXJjZSwgYnV0IHdoZW4gaW5zdGFsbGVkCiAgICAjIHRoZSBzY3JpcHRzIGFyZSBpbiBhbm90aGVyIGRpcmVjdG9yeS4KICAgIGlmIF9QWVRIT05fQlVJTEQ6CiAgICAgICAgdmFyc1snTERTSEFSRUQnXSA9IHZhcnNbJ0JMRFNIQVJFRCddCgoKZGVmIF9pbml0X25vbl9wb3NpeCh2YXJzKToKICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgTlQiIiIKICAgICMgc2V0IGJhc2ljIGluc3RhbGwgZGlyZWN0b3JpZXMKICAgIHZhcnNbJ0xJQkRFU1QnXSA9IGdldF9wYXRoKCdzdGRsaWInKQogICAgdmFyc1snQklOTElCREVTVCddID0gZ2V0X3BhdGgoJ3BsYXRzdGRsaWInKQogICAgdmFyc1snSU5DTFVERVBZJ10gPSBnZXRfcGF0aCgnaW5jbHVkZScpCiAgICB2YXJzWydTTyddID0gJy5weWQnCiAgICB2YXJzWydFWEUnXSA9ICcuZXhlJwogICAgdmFyc1snVkVSU0lPTiddID0gX1BZX1ZFUlNJT05fU0hPUlRfTk9fRE9UCiAgICB2YXJzWydCSU5ESVInXSA9IG9zLnBhdGguZGlybmFtZShfc2FmZV9yZWFscGF0aChzeXMuZXhlY3V0YWJsZSkpCgojCiMgcHVibGljIEFQSXMKIwoKCmRlZiBwYXJzZV9jb25maWdfaChmcCwgdmFycz1Ob25lKToKICAgICIiIlBhcnNlIGEgY29uZmlnLmgtc3R5bGUgZmlsZS4KCiAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBuYW1lL3ZhbHVlIHBhaXJzIGlzIHJldHVybmVkLiAgSWYgYW4KICAgIG9wdGlvbmFsIGRpY3Rpb25hcnkgaXMgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGl0IGlzCiAgICB1c2VkIGluc3RlYWQgb2YgYSBuZXcgZGljdGlvbmFyeS4KICAgICIiIgogICAgaWYgdmFycyBpcyBOb25lOgogICAgICAgIHZhcnMgPSB7fQogICAgZGVmaW5lX3J4ID0gcmUuY29tcGlsZSgiI2RlZmluZSAoW0EtWl1bQS1aYS16MC05X10rKSAoLiopXG4iKQogICAgdW5kZWZfcnggPSByZS5jb21waWxlKCIvWypdICN1bmRlZiAoW0EtWl1bQS1aYS16MC05X10rKSBbKl0vXG4iKQoKICAgIHdoaWxlIFRydWU6CiAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBtID0gZGVmaW5lX3J4Lm1hdGNoKGxpbmUpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgbiwgdiA9IG0uZ3JvdXAoMSwgMikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdiA9IGludCh2KQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgdmFyc1tuXSA9IHYKICAgICAgICBlbHNlOgogICAgICAgICAgICBtID0gdW5kZWZfcngubWF0Y2gobGluZSkKICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgIHZhcnNbbS5ncm91cCgxKV0gPSAwCiAgICByZXR1cm4gdmFycwoKCmRlZiBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKToKICAgICIiIlJldHVybiB0aGUgcGF0aCBvZiBweWNvbmZpZy5oLiIiIgogICAgaWYgX1BZVEhPTl9CVUlMRDoKICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgICAgIGluY19kaXIgPSBvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgIlBDIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbmNfZGlyID0gX1BST0pFQ1RfQkFTRQogICAgZWxzZToKICAgICAgICBpbmNfZGlyID0gZ2V0X3BhdGgoJ3BsYXRpbmNsdWRlJykKICAgIHJldHVybiBvcy5wYXRoLmpvaW4oaW5jX2RpciwgJ3B5Y29uZmlnLmgnKQoKCmRlZiBnZXRfc2NoZW1lX25hbWVzKCk6CiAgICAiIiJSZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIHRoZSBzY2hlbWVzIG5hbWVzLiIiIgogICAgcmV0dXJuIHR1cGxlKHNvcnRlZChfU0NIRU1FUy5zZWN0aW9ucygpKSkKCgpkZWYgZ2V0X3BhdGhfbmFtZXMoKToKICAgICIiIlJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhdGhzIG5hbWVzLiIiIgogICAgIyB4eHggc2VlIGlmIHdlIHdhbnQgYSBzdGF0aWMgbGlzdAogICAgcmV0dXJuIF9TQ0hFTUVTLm9wdGlvbnMoJ3Bvc2l4X3ByZWZpeCcpCgoKZGVmIGdldF9wYXRocyhzY2hlbWU9X2dldF9kZWZhdWx0X3NjaGVtZSgpLCB2YXJzPU5vbmUsIGV4cGFuZD1UcnVlKToKICAgICIiIlJldHVybiBhIG1hcHBpbmcgY29udGFpbmluZyBhbiBpbnN0YWxsIHNjaGVtZS4KCiAgICBgYHNjaGVtZWBgIGlzIHRoZSBpbnN0YWxsIHNjaGVtZSBuYW1lLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwKICAgIHJldHVybiB0aGUgZGVmYXVsdCBzY2hlbWUgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgogICAgIiIiCiAgICBfZW5zdXJlX2NmZ19yZWFkKCkKICAgIGlmIGV4cGFuZDoKICAgICAgICByZXR1cm4gX2V4cGFuZF92YXJzKHNjaGVtZSwgdmFycykKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIGRpY3QoX1NDSEVNRVMuaXRlbXMoc2NoZW1lKSkKCgpkZWYgZ2V0X3BhdGgobmFtZSwgc2NoZW1lPV9nZXRfZGVmYXVsdF9zY2hlbWUoKSwgdmFycz1Ob25lLCBleHBhbmQ9VHJ1ZSk6CiAgICAiIiJSZXR1cm4gYSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjaGVtZS4KCiAgICBgYHNjaGVtZWBgIGlzIHRoZSBpbnN0YWxsIHNjaGVtZSBuYW1lLgogICAgIiIiCiAgICByZXR1cm4gZ2V0X3BhdGhzKHNjaGVtZSwgdmFycywgZXhwYW5kKVtuYW1lXQoKCmRlZiBnZXRfY29uZmlnX3ZhcnMoKmFyZ3MpOgogICAgIiIiV2l0aCBubyBhcmd1bWVudHMsIHJldHVybiBhIGRpY3Rpb25hcnkgb2YgYWxsIGNvbmZpZ3VyYXRpb24KICAgIHZhcmlhYmxlcyByZWxldmFudCBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCgogICAgT24gVW5peCwgdGhpcyBtZWFucyBldmVyeSB2YXJpYWJsZSBkZWZpbmVkIGluIFB5dGhvbidzIGluc3RhbGxlZCBNYWtlZmlsZTsKICAgIE9uIFdpbmRvd3MgYW5kIE1hYyBPUyBpdCdzIGEgbXVjaCBzbWFsbGVyIHNldC4KCiAgICBXaXRoIGFyZ3VtZW50cywgcmV0dXJuIGEgbGlzdCBvZiB2YWx1ZXMgdGhhdCByZXN1bHQgZnJvbSBsb29raW5nIHVwCiAgICBlYWNoIGFyZ3VtZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGRpY3Rpb25hcnkuCiAgICAiIiIKICAgIGdsb2JhbCBfQ09ORklHX1ZBUlMKICAgIGlmIF9DT05GSUdfVkFSUyBpcyBOb25lOgogICAgICAgIF9DT05GSUdfVkFSUyA9IHt9CiAgICAgICAgIyBOb3JtYWxpemVkIHZlcnNpb25zIG9mIHByZWZpeCBhbmQgZXhlY19wcmVmaXggYXJlIGhhbmR5IHRvIGhhdmU7CiAgICAgICAgIyBpbiBmYWN0LCB0aGVzZSBhcmUgdGhlIHN0YW5kYXJkIHZlcnNpb25zIHVzZWQgbW9zdCBwbGFjZXMgaW4gdGhlCiAgICAgICAgIyBkaXN0dXRpbHMyIG1vZHVsZS4KICAgICAgICBfQ09ORklHX1ZBUlNbJ3ByZWZpeCddID0gX1BSRUZJWAogICAgICAgIF9DT05GSUdfVkFSU1snZXhlY19wcmVmaXgnXSA9IF9FWEVDX1BSRUZJWAogICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbiddID0gX1BZX1ZFUlNJT04KICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fc2hvcnQnXSA9IF9QWV9WRVJTSU9OX1NIT1JUCiAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uX25vZG90J10gPSBfUFlfVkVSU0lPTlswXSArIF9QWV9WRVJTSU9OWzJdCiAgICAgICAgX0NPTkZJR19WQVJTWydiYXNlJ10gPSBfUFJFRklYCiAgICAgICAgX0NPTkZJR19WQVJTWydwbGF0YmFzZSddID0gX0VYRUNfUFJFRklYCiAgICAgICAgX0NPTkZJR19WQVJTWydwcm9qZWN0YmFzZSddID0gX1BST0pFQ1RfQkFTRQogICAgICAgIHRyeToKICAgICAgICAgICAgX0NPTkZJR19WQVJTWydhYmlmbGFncyddID0gc3lzLmFiaWZsYWdzCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIHN5cy5hYmlmbGFncyBtYXkgbm90IGJlIGRlZmluZWQgb24gYWxsIHBsYXRmb3Jtcy4KICAgICAgICAgICAgX0NPTkZJR19WQVJTWydhYmlmbGFncyddID0gJycKCiAgICAgICAgaWYgb3MubmFtZSBpbiAoJ250JywgJ29zMicpOgogICAgICAgICAgICBfaW5pdF9ub25fcG9zaXgoX0NPTkZJR19WQVJTKQogICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgX2luaXRfcG9zaXgoX0NPTkZJR19WQVJTKQogICAgICAgICMgU2V0dGluZyAndXNlcmJhc2UnIGlzIGRvbmUgYmVsb3cgdGhlIGNhbGwgdG8gdGhlCiAgICAgICAgIyBpbml0IGZ1bmN0aW9uIHRvIGVuYWJsZSB1c2luZyAnZ2V0X2NvbmZpZ192YXInIGluCiAgICAgICAgIyB0aGUgaW5pdC1mdW5jdGlvbi4KICAgICAgICBpZiBzeXMudmVyc2lvbiA+PSAnMi42JzoKICAgICAgICAgICAgX0NPTkZJR19WQVJTWyd1c2VyYmFzZSddID0gX2dldHVzZXJiYXNlKCkKCiAgICAgICAgaWYgJ3NyY2Rpcicgbm90IGluIF9DT05GSUdfVkFSUzoKICAgICAgICAgICAgX0NPTkZJR19WQVJTWydzcmNkaXInXSA9IF9QUk9KRUNUX0JBU0UKICAgICAgICBlbHNlOgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3NyY2RpciddID0gX3NhZmVfcmVhbHBhdGgoX0NPTkZJR19WQVJTWydzcmNkaXInXSkKCiAgICAgICAgIyBDb252ZXJ0IHNyY2RpciBpbnRvIGFuIGFic29sdXRlIHBhdGggaWYgaXQgYXBwZWFycyBuZWNlc3NhcnkuCiAgICAgICAgIyBOb3JtYWxseSBpdCBpcyByZWxhdGl2ZSB0byB0aGUgYnVpbGQgZGlyZWN0b3J5LiAgSG93ZXZlciwgZHVyaW5nCiAgICAgICAgIyB0ZXN0aW5nLCBmb3IgZXhhbXBsZSwgd2UgbWlnaHQgYmUgcnVubmluZyBhIG5vbi1pbnN0YWxsZWQgcHl0aG9uCiAgICAgICAgIyBmcm9tIGEgZGlmZmVyZW50IGRpcmVjdG9yeS4KICAgICAgICBpZiBfUFlUSE9OX0JVSUxEIGFuZCBvcy5uYW1lID09ICJwb3NpeCI6CiAgICAgICAgICAgIGJhc2UgPSBfUFJPSkVDVF9CQVNFCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgY3dkID0gTm9uZQogICAgICAgICAgICBpZiAobm90IG9zLnBhdGguaXNhYnMoX0NPTkZJR19WQVJTWydzcmNkaXInXSkgYW5kCiAgICAgICAgICAgICAgICBiYXNlICE9IGN3ZCk6CiAgICAgICAgICAgICAgICAjIHNyY2RpciBpcyByZWxhdGl2ZSBhbmQgd2UgYXJlIG5vdCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICMgYXMgdGhlIGV4ZWN1dGFibGUuIEFzc3VtZSBleGVjdXRhYmxlIGlzIGluIHRoZSBidWlsZAogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkgYW5kIG1ha2Ugc3JjZGlyIGFic29sdXRlLgogICAgICAgICAgICAgICAgc3JjZGlyID0gb3MucGF0aC5qb2luKGJhc2UsIF9DT05GSUdfVkFSU1snc3JjZGlyJ10pCiAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3NyY2RpciddID0gb3MucGF0aC5ub3JtcGF0aChzcmNkaXIpCgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAga2VybmVsX3ZlcnNpb24gPSBvcy51bmFtZSgpWzJdICAjIEtlcm5lbCB2ZXJzaW9uICg4LjQuMykKICAgICAgICAgICAgbWFqb3JfdmVyc2lvbiA9IGludChrZXJuZWxfdmVyc2lvbi5zcGxpdCgnLicpWzBdKQoKICAgICAgICAgICAgaWYgbWFqb3JfdmVyc2lvbiA8IDg6CiAgICAgICAgICAgICAgICAjIE9uIG1hY09TIGJlZm9yZSAxMC40LCBjaGVjayBpZiAtYXJjaCBhbmQgLWlzeXNyb290CiAgICAgICAgICAgICAgICAjIGFyZSBpbiBDRkxBR1Mgb3IgTERGTEFHUyBhbmQgcmVtb3ZlIHRoZW0gaWYgdGhleSBhcmUuCiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIHdoZW4gYnVpbGRpbmcgZXh0ZW5zaW9ucyBvbiBhIDEwLjMgc3lzdGVtCiAgICAgICAgICAgICAgICAjIHVzaW5nIGEgdW5pdmVyc2FsIGJ1aWxkIG9mIHB5dGhvbi4KICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCdMREZMQUdTJywgJ0JBU0VDRkxBR1MnLAogICAgICAgICAgICAgICAgICAgICAgICAjIGEgbnVtYmVyIG9mIGRlcml2ZWQgdmFyaWFibGVzLiBUaGVzZSBuZWVkIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICMgcGF0Y2hlZCB1cCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICAgICAnQ0ZMQUdTJywgJ1BZX0NGTEFHUycsICdCTERTSEFSRUQnKToKICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9DT05GSUdfVkFSU1trZXldCiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQogICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctaXN5c3Jvb3QgW14gXHRdKicsICcgJywgZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgX0NPTkZJR19WQVJTW2tleV0gPSBmbGFncwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBBbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgYXJjaGl0ZWN0dXJlIGZsYWdzIHVzaW5nCiAgICAgICAgICAgICAgICAjIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgogICAgICAgICAgICAgICAgIyBOT1RFOiBUaGlzIG5hbWUgd2FzIGludHJvZHVjZWQgYnkgQXBwbGUgaW4gT1NYIDEwLjUgYW5kCiAgICAgICAgICAgICAgICAjIGlzIHVzZWQgYnkgc2V2ZXJhbCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGRpc3RyaWJ1dGVkIHdpdGgKICAgICAgICAgICAgICAgICMgdGhhdCBPUyByZWxlYXNlLgogICAgICAgICAgICAgICAgaWYgJ0FSQ0hGTEFHUycgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgICAgICAgICBhcmNoID0gb3MuZW52aXJvblsnQVJDSEZMQUdTJ10KICAgICAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnTERGTEFHUycsICdCQVNFQ0ZMQUdTJywKICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBvZiBkZXJpdmVkIHZhcmlhYmxlcy4gVGhlc2UgbmVlZCB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAjIHBhdGNoZWQgdXAgYXMgd2VsbC4KICAgICAgICAgICAgICAgICAgICAgICAgJ0NGTEFHUycsICdQWV9DRkxBR1MnLCAnQkxEU0hBUkVEJyk6CgogICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9DT05GSUdfVkFSU1trZXldCiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK1x3K1xzJywgJyAnLCBmbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyArICcgJyArIGFyY2gKICAgICAgICAgICAgICAgICAgICAgICAgX0NPTkZJR19WQVJTW2tleV0gPSBmbGFncwoKICAgICAgICAgICAgICAgICMgSWYgd2UncmUgb24gT1NYIDEwLjUgb3IgbGF0ZXIgYW5kIHRoZSB1c2VyIHRyaWVzIHRvCiAgICAgICAgICAgICAgICAjIGNvbXBpbGVzIGFuIGV4dGVuc2lvbiB1c2luZyBhbiBTREsgdGhhdCBpcyBub3QgcHJlc2VudAogICAgICAgICAgICAgICAgIyBvbiB0aGUgY3VycmVudCBtYWNoaW5lIGl0IGlzIGJldHRlciB0byBub3QgdXNlIGFuIFNESwogICAgICAgICAgICAgICAgIyB0aGFuIHRvIGZhaWwuCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAjIFRoZSBtYWpvciB1c2VjYXNlIGZvciB0aGlzIGlzIHVzZXJzIHVzaW5nIGEgUHl0aG9uLm9yZwogICAgICAgICAgICAgICAgIyBiaW5hcnkgaW5zdGFsbGVyICBvbiBPU1ggMTAuNjogdGhhdCBpbnN0YWxsZXIgdXNlcwogICAgICAgICAgICAgICAgIyB0aGUgMTAuNHUgU0RLLCBidXQgdGhhdCBTREsgaXMgbm90IGluc3RhbGxlZCBieSBkZWZhdWx0CiAgICAgICAgICAgICAgICAjIHdoZW4geW91IGluc3RhbGwgWGNvZGUuCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBDRkxBR1MgPSBfQ09ORklHX1ZBUlMuZ2V0KCdDRkxBR1MnLCAnJykKICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2goJy1pc3lzcm9vdFxzKyhcUyspJywgQ0ZMQUdTKQogICAgICAgICAgICAgICAgaWYgbSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzZGsgPSBtLmdyb3VwKDEpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNkayk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCdMREZMQUdTJywgJ0JBU0VDRkxBR1MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBudW1iZXIgb2YgZGVyaXZlZCB2YXJpYWJsZXMuIFRoZXNlIG5lZWQgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBhdGNoZWQgdXAgYXMgd2VsbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDRkxBR1MnLCAnUFlfQ0ZMQUdTJywgJ0JMRFNIQVJFRCcpOgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX0NPTkZJR19WQVJTW2tleV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctaXN5c3Jvb3RccytcUysoXHN8JCknLCAnICcsIGZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPTkZJR19WQVJTW2tleV0gPSBmbGFncwoKICAgIGlmIGFyZ3M6CiAgICAgICAgdmFscyA9IFtdCiAgICAgICAgZm9yIG5hbWUgaW4gYXJnczoKICAgICAgICAgICAgdmFscy5hcHBlbmQoX0NPTkZJR19WQVJTLmdldChuYW1lKSkKICAgICAgICByZXR1cm4gdmFscwogICAgZWxzZToKICAgICAgICByZXR1cm4gX0NPTkZJR19WQVJTCgoKZGVmIGdldF9jb25maWdfdmFyKG5hbWUpOgogICAgIiIiUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSB2YXJpYWJsZSB1c2luZyB0aGUgZGljdGlvbmFyeSByZXR1cm5lZCBieQogICAgJ2dldF9jb25maWdfdmFycygpJy4KCiAgICBFcXVpdmFsZW50IHRvIGdldF9jb25maWdfdmFycygpLmdldChuYW1lKQogICAgIiIiCiAgICByZXR1cm4gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KG5hbWUpCgoKZGVmIGdldF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgY3VycmVudCBwbGF0Zm9ybS4KCiAgICBUaGlzIGlzIHVzZWQgbWFpbmx5IHRvIGRpc3Rpbmd1aXNoIHBsYXRmb3JtLXNwZWNpZmljIGJ1aWxkIGRpcmVjdG9yaWVzIGFuZAogICAgcGxhdGZvcm0tc3BlY2lmaWMgYnVpbHQgZGlzdHJpYnV0aW9ucy4gIFR5cGljYWxseSBpbmNsdWRlcyB0aGUgT1MgbmFtZQogICAgYW5kIHZlcnNpb24gYW5kIHRoZSBhcmNoaXRlY3R1cmUgKGFzIHN1cHBsaWVkIGJ5ICdvcy51bmFtZSgpJyksCiAgICBhbHRob3VnaCB0aGUgZXhhY3QgaW5mb3JtYXRpb24gaW5jbHVkZWQgZGVwZW5kcyBvbiB0aGUgT1M7IGVnLiBmb3IgSVJJWAogICAgdGhlIGFyY2hpdGVjdHVyZSBpc24ndCBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IChJUklYIG9ubHkgcnVucyBvbiBTR0kKICAgIGhhcmR3YXJlKSwgYnV0IGZvciBMaW51eCB0aGUga2VybmVsIHZlcnNpb24gaXNuJ3QgcGFydGljdWxhcmx5CiAgICBpbXBvcnRhbnQuCgogICAgRXhhbXBsZXMgb2YgcmV0dXJuZWQgdmFsdWVzOgogICAgICAgbGludXgtaTU4NgogICAgICAgbGludXgtYWxwaGEgKD8pCiAgICAgICBzb2xhcmlzLTIuNi1zdW40dQogICAgICAgaXJpeC01LjMKICAgICAgIGlyaXg2NC02LjIKCiAgICBXaW5kb3dzIHdpbGwgcmV0dXJuIG9uZSBvZjoKICAgICAgIHdpbi1hbWQ2NCAoNjRiaXQgV2luZG93cyBvbiBBTUQ2NCAoYWthIHg4Nl82NCwgSW50ZWw2NCwgRU02NFQsIGV0YykKICAgICAgIHdpbi1pYTY0ICg2NGJpdCBXaW5kb3dzIG9uIEl0YW5pdW0pCiAgICAgICB3aW4zMiAoYWxsIG90aGVycyAtIHNwZWNpZmljYWxseSwgc3lzLnBsYXRmb3JtIGlzIHJldHVybmVkKQoKICAgIEZvciBvdGhlciBub24tUE9TSVggcGxhdGZvcm1zLCBjdXJyZW50bHkganVzdCByZXR1cm5zICdzeXMucGxhdGZvcm0nLgogICAgIiIiCiAgICBpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgIyBzbmlmZiBzeXMudmVyc2lvbiBmb3IgYXJjaGl0ZWN0dXJlLgogICAgICAgIHByZWZpeCA9ICIgYml0ICgiCiAgICAgICAgaSA9IHN5cy52ZXJzaW9uLmZpbmQocHJlZml4KQogICAgICAgIGlmIGkgPT0gLTE6CiAgICAgICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KICAgICAgICBqID0gc3lzLnZlcnNpb24uZmluZCgiKSIsIGkpCiAgICAgICAgbG9vayA9IHN5cy52ZXJzaW9uW2krbGVuKHByZWZpeCk6al0ubG93ZXIoKQogICAgICAgIGlmIGxvb2sgPT0gJ2FtZDY0JzoKICAgICAgICAgICAgcmV0dXJuICd3aW4tYW1kNjQnCiAgICAgICAgaWYgbG9vayA9PSAnaXRhbml1bSc6CiAgICAgICAgICAgIHJldHVybiAnd2luLWlhNjQnCiAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQoKICAgIGlmIG9zLm5hbWUgIT0gInBvc2l4IiBvciBub3QgaGFzYXR0cihvcywgJ3VuYW1lJyk6CiAgICAgICAgIyBYWFggd2hhdCBhYm91dCB0aGUgYXJjaGl0ZWN0dXJlPyBOVCBpcyBJbnRlbCBvciBBbHBoYSwKICAgICAgICAjIE1hYyBPUyBpcyBNNjhrIG9yIFBQQywgZXRjLgogICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KCiAgICAjIFRyeSB0byBkaXN0aW5ndWlzaCB2YXJpb3VzIGZsYXZvdXJzIG9mIFVuaXgKICAgIG9zbmFtZSwgaG9zdCwgcmVsZWFzZSwgdmVyc2lvbiwgbWFjaGluZSA9IG9zLnVuYW1lKCkKCiAgICAjIENvbnZlcnQgdGhlIE9TIG5hbWUgdG8gbG93ZXJjYXNlLCByZW1vdmUgJy8nIGNoYXJhY3RlcnMKICAgICMgKHRvIGFjY29tbW9kYXRlIEJTRC9PUyksIGFuZCB0cmFuc2xhdGUgc3BhY2VzIChmb3IgIlBvd2VyIE1hY2ludG9zaCIpCiAgICBvc25hbWUgPSBvc25hbWUubG93ZXIoKS5yZXBsYWNlKCcvJywgJycpCiAgICBtYWNoaW5lID0gbWFjaGluZS5yZXBsYWNlKCcgJywgJ18nKQogICAgbWFjaGluZSA9IG1hY2hpbmUucmVwbGFjZSgnLycsICctJykKCiAgICBpZiBvc25hbWVbOjVdID09ICJsaW51eCI6CiAgICAgICAgIyBBdCBsZWFzdCBvbiBMaW51eC9JbnRlbCwgJ21hY2hpbmUnIGlzIHRoZSBwcm9jZXNzb3IgLS0KICAgICAgICAjIGkzODYsIGV0Yy4KICAgICAgICAjIFhYWCB3aGF0IGFib3V0IEFscGhhLCBTUEFSQywgZXRjPwogICAgICAgIHJldHVybiAgIiVzLSVzIiAlIChvc25hbWUsIG1hY2hpbmUpCiAgICBlbGlmIG9zbmFtZVs6NV0gPT0gInN1bm9zIjoKICAgICAgICBpZiByZWxlYXNlWzBdID49ICI1IjogICAgICAgICAgICMgU3VuT1MgNSA9PSBTb2xhcmlzIDIKICAgICAgICAgICAgb3NuYW1lID0gInNvbGFyaXMiCiAgICAgICAgICAgIHJlbGVhc2UgPSAiJWQuJXMiICUgKGludChyZWxlYXNlWzBdKSAtIDMsIHJlbGVhc2VbMjpdKQogICAgICAgICMgZmFsbCB0aHJvdWdoIHRvIHN0YW5kYXJkIG9zbmFtZS1yZWxlYXNlLW1hY2hpbmUgcmVwcmVzZW50YXRpb24KICAgIGVsaWYgb3NuYW1lWzo0XSA9PSAiaXJpeCI6ICAgICAgICAgICAgICAjIGNvdWxkIGJlICJpcml4NjQiIQogICAgICAgIHJldHVybiAiJXMtJXMiICUgKG9zbmFtZSwgcmVsZWFzZSkKICAgIGVsaWYgb3NuYW1lWzozXSA9PSAiYWl4IjoKICAgICAgICByZXR1cm4gIiVzLSVzLiVzIiAlIChvc25hbWUsIHZlcnNpb24sIHJlbGVhc2UpCiAgICBlbGlmIG9zbmFtZVs6Nl0gPT0gImN5Z3dpbiI6CiAgICAgICAgb3NuYW1lID0gImN5Z3dpbiIKICAgICAgICByZWxfcmUgPSByZS5jb21waWxlKHInW1xkLl0rJykKICAgICAgICBtID0gcmVsX3JlLm1hdGNoKHJlbGVhc2UpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgcmVsZWFzZSA9IG0uZ3JvdXAoKQogICAgZWxpZiBvc25hbWVbOjZdID09ICJkYXJ3aW4iOgogICAgICAgICMKICAgICAgICAjIEZvciBvdXIgcHVycG9zZXMsIHdlJ2xsIGFzc3VtZSB0aGF0IHRoZSBzeXN0ZW0gdmVyc2lvbiBmcm9tCiAgICAgICAgIyBkaXN0dXRpbHMnIHBlcnNwZWN0aXZlIGlzIHdoYXQgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIGlzIHNldAogICAgICAgICMgdG8uIFRoaXMgbWFrZXMgdGhlIGNvbXBhdGliaWxpdHkgc3RvcnkgYSBiaXQgbW9yZSBzYW5lIGJlY2F1c2UgdGhlCiAgICAgICAgIyBtYWNoaW5lIGlzIGdvaW5nIHRvIGNvbXBpbGUgYW5kIGxpbmsgYXMgaWYgaXQgd2VyZQogICAgICAgICMgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULgogICAgICAgIGNmZ3ZhcnMgPSBnZXRfY29uZmlnX3ZhcnMoKQogICAgICAgIG1hY3ZlciA9IGNmZ3ZhcnMuZ2V0KCdNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnKQoKICAgICAgICBpZiBUcnVlOgogICAgICAgICAgICAjIEFsd2F5cyBjYWxjdWxhdGUgdGhlIHJlbGVhc2Ugb2YgdGhlIHJ1bm5pbmcgbWFjaGluZSwKICAgICAgICAgICAgIyBuZWVkZWQgdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiBidWlsZCBmYXQgYmluYXJpZXMgb3Igbm90LgoKICAgICAgICAgICAgbWFjcmVsZWFzZSA9IG1hY3ZlcgogICAgICAgICAgICAjIEdldCB0aGUgc3lzdGVtIHZlcnNpb24uIFJlYWRpbmcgdGhpcyBwbGlzdCBpcyBhIGRvY3VtZW50ZWQKICAgICAgICAgICAgIyB3YXkgdG8gZ2V0IHRoZSBzeXN0ZW0gdmVyc2lvbiAoc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgogICAgICAgICAgICAjIHRoZSBHZXN0YWx0IE1hbmFnZXIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGYgPSBvcGVuKCcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnKQogICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgICAgICMgV2UncmUgb24gYSBwbGFpbiBkYXJ3aW4gYm94LCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQKICAgICAgICAgICAgICAgICMgYmVoYXZpb3VyLgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2gocic8a2V5PlByb2R1Y3RVc2VyVmlzaWJsZVZlcnNpb248L2tleT5ccyonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJzxzdHJpbmc+KC4qPyk8L3N0cmluZz4nLCBmLnJlYWQoKSkKICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG1hY3JlbGVhc2UgPSAnLicuam9pbihtLmdyb3VwKDEpLnNwbGl0KCcuJylbOjJdKQogICAgICAgICAgICAgICAgIyBlbHNlOiBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3VyCgogICAgICAgIGlmIG5vdCBtYWN2ZXI6CiAgICAgICAgICAgIG1hY3ZlciA9IG1hY3JlbGVhc2UKCiAgICAgICAgaWYgbWFjdmVyOgogICAgICAgICAgICByZWxlYXNlID0gbWFjdmVyCiAgICAgICAgICAgIG9zbmFtZSA9ICJtYWNvc3giCgogICAgICAgICAgICBpZiAoKG1hY3JlbGVhc2UgKyAnLicpID49ICcxMC40LicgYW5kCiAgICAgICAgICAgICAgICAnLWFyY2gnIGluIGdldF9jb25maWdfdmFycygpLmdldCgnQ0ZMQUdTJywgJycpLnN0cmlwKCkpOgogICAgICAgICAgICAgICAgIyBUaGUgdW5pdmVyc2FsIGJ1aWxkIHdpbGwgYnVpbGQgZmF0IGJpbmFyaWVzLCBidXQgbm90IG9uCiAgICAgICAgICAgICAgICAjIHN5c3RlbXMgYmVmb3JlIDEwLjQKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICMgVHJ5IHRvIGRldGVjdCA0LXdheSB1bml2ZXJzYWwgYnVpbGRzLCB0aG9zZSBoYXZlIG1hY2hpbmUtdHlwZQogICAgICAgICAgICAgICAgIyAndW5pdmVyc2FsJyBpbnN0ZWFkIG9mICdmYXQnLgoKICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JwogICAgICAgICAgICAgICAgY2ZsYWdzID0gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KCdDRkxBR1MnKQoKICAgICAgICAgICAgICAgIGFyY2hzID0gcmUuZmluZGFsbCgnLWFyY2hccysoXFMrKScsIGNmbGFncykKICAgICAgICAgICAgICAgIGFyY2hzID0gdHVwbGUoc29ydGVkKHNldChhcmNocykpKQoKICAgICAgICAgICAgICAgIGlmIGxlbihhcmNocykgPT0gMToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gYXJjaHNbMF0KICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycpOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JwogICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdpbnRlbCcKICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdDMnCiAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgncHBjNjQnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQ2NCcKICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycsICdwcGM2NCcsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3VuaXZlcnNhbCcKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyBtYWNoaW5lIHZhbHVlIGZvciBhcmNocz0lciIgJSAoYXJjaHMsKSkKCiAgICAgICAgICAgIGVsaWYgbWFjaGluZSA9PSAnaTM4Nic6CiAgICAgICAgICAgICAgICAjIE9uIE9TWCB0aGUgbWFjaGluZSB0eXBlIHJldHVybmVkIGJ5IHVuYW1lIGlzIGFsd2F5cyB0aGUKICAgICAgICAgICAgICAgICMgMzItYml0IHZhcmlhbnQsIGV2ZW4gaWYgdGhlIGV4ZWN1dGFibGUgYXJjaGl0ZWN0dXJlIGlzCiAgICAgICAgICAgICAgICAjIHRoZSA2NC1iaXQgdmFyaWFudAogICAgICAgICAgICAgICAgaWYgc3lzLm1heHNpemUgPj0gMioqMzI6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICd4ODZfNjQnCgogICAgICAgICAgICBlbGlmIG1hY2hpbmUgaW4gKCdQb3dlclBDJywgJ1Bvd2VyX01hY2ludG9zaCcpOgogICAgICAgICAgICAgICAgIyBQaWNrIGEgc2FuZSBuYW1lIGZvciB0aGUgUFBDIGFyY2hpdGVjdHVyZS4KICAgICAgICAgICAgICAgICMgU2VlICdpMzg2JyBjYXNlCiAgICAgICAgICAgICAgICBpZiBzeXMubWF4c2l6ZSA+PSAyKiozMjoKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3BwYzY0JwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3BwYycKCiAgICByZXR1cm4gIiVzLSVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCgoKZGVmIGdldF9weXRob25fdmVyc2lvbigpOgogICAgcmV0dXJuIF9QWV9WRVJTSU9OX1NIT1JUCgoKZGVmIF9wcmludF9kaWN0KHRpdGxlLCBkYXRhKToKICAgIGZvciBpbmRleCwgKGtleSwgdmFsdWUpIGluIGVudW1lcmF0ZShzb3J0ZWQoZGF0YS5pdGVtcygpKSk6CiAgICAgICAgaWYgaW5kZXggPT0gMDoKICAgICAgICAgICAgcHJpbnQoJyVzOiAnICUgKHRpdGxlKSkKICAgICAgICBwcmludCgnXHQlcyA9ICIlcyInICUgKGtleSwgdmFsdWUpKQoKCmRlZiBfbWFpbigpOgogICAgIiIiRGlzcGxheSBhbGwgaW5mb3JtYXRpb24gc3lzY29uZmlnIGRldGFpbnMuIiIiCiAgICBwcmludCgnUGxhdGZvcm06ICIlcyInICUgZ2V0X3BsYXRmb3JtKCkpCiAgICBwcmludCgnUHl0aG9uIHZlcnNpb246ICIlcyInICUgZ2V0X3B5dGhvbl92ZXJzaW9uKCkpCiAgICBwcmludCgnQ3VycmVudCBpbnN0YWxsYXRpb24gc2NoZW1lOiAiJXMiJyAlIF9nZXRfZGVmYXVsdF9zY2hlbWUoKSkKICAgIHByaW50KCkKICAgIF9wcmludF9kaWN0KCdQYXRocycsIGdldF9wYXRocygpKQogICAgcHJpbnQoKQogICAgX3ByaW50X2RpY3QoJ1ZhcmlhYmxlcycsIGdldF9jb25maWdfdmFycygpKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBfbWFpbigpClBLAwQUAAAAAAAAACEAREIfQ9RpAQDUaQEARQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvdGFyZmlsZS5weSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgdGFyZmlsZS5weQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENvcHlyaWdodCAoQykgMjAwMiBMYXJzIEd1c3RhZWJlbCA8bGFyc0BndXN0YWViZWwuZGU+CiMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIFBlcm1pc3Npb24gIGlzICBoZXJlYnkgZ3JhbnRlZCwgIGZyZWUgIG9mIGNoYXJnZSwgIHRvICBhbnkgcGVyc29uCiMgb2J0YWluaW5nIGEgIGNvcHkgb2YgIHRoaXMgc29mdHdhcmUgIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KIyBmaWxlcyAgKHRoZSAgIlNvZnR3YXJlIiksICB0byAgIGRlYWwgIGluICB0aGUgIFNvZnR3YXJlICAgd2l0aG91dAojIHJlc3RyaWN0aW9uLCAgaW5jbHVkaW5nICB3aXRob3V0IGxpbWl0YXRpb24gIHRoZSAgcmlnaHRzIHRvICB1c2UsCiMgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKIyBjb3BpZXMgIG9mICB0aGUgIFNvZnR3YXJlLCAgYW5kIHRvICBwZXJtaXQgIHBlcnNvbnMgIHRvICB3aG9tIHRoZQojIFNvZnR3YXJlICBpcyAgZnVybmlzaGVkICB0byAgZG8gIHNvLCAgc3ViamVjdCAgdG8gIHRoZSAgZm9sbG93aW5nCiMgY29uZGl0aW9uczoKIwojIFRoZSBhYm92ZSBjb3B5cmlnaHQgIG5vdGljZSBhbmQgdGhpcyAgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgIGJlCiMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZICBLSU5ELAojIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HICBCVVQgTk9UIExJTUlURUQgVE8gIFRIRSBXQVJSQU5USUVTCiMgT0YgIE1FUkNIQU5UQUJJTElUWSwgIEZJVE5FU1MgICBGT1IgIEEgIFBBUlRJQ1VMQVIgICBQVVJQT1NFICBBTkQKIyBOT05JTkZSSU5HRU1FTlQuICBJTiAgTk8gIEVWRU5UIFNIQUxMICBUSEUgIEFVVEhPUlMgIE9SIENPUFlSSUdIVAojIEhPTERFUlMgIEJFIExJQUJMRSAgRk9SIEFOWSAgQ0xBSU0sIERBTUFHRVMgIE9SIE9USEVSICBMSUFCSUxJVFksCiMgV0hFVEhFUiAgSU4gQU4gIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgIE9SIE9USEVSV0lTRSwgIEFSSVNJTkcKIyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCiMgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgojCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KCiIiIlJlYWQgZnJvbSBhbmQgd3JpdGUgdG8gdGFyIGZvcm1hdCBhcmNoaXZlcy4KIiIiCgpfX3ZlcnNpb25fXyA9ICIkUmV2aXNpb24kIgoKdmVyc2lvbiAgICAgPSAiMC45LjAiCl9fYXV0aG9yX18gID0gIkxhcnMgR3VzdFx1MDBlNGJlbCAobGFyc0BndXN0YWViZWwuZGUpIgpfX2RhdGVfXyAgICA9ICIkRGF0ZTogMjAxMS0wMi0yNSAxNzo0MjowMSArMDIwMCAoRnJpLCAyNSBGZWIgMjAxMSkgJCIKX19jdnNpZF9fICAgPSAiJElkOiB0YXJmaWxlLnB5IDg4NTg2IDIwMTEtMDItMjUgMTU6NDI6MDFaIG1hcmMtYW5kcmUubGVtYnVyZyAkIgpfX2NyZWRpdHNfXyA9ICJHdXN0YXZvIE5pZW1leWVyLCBOaWVscyBHdXN0XHUwMGU0YmVsLCBSaWNoYXJkIFRvd25zZW5kLiIKCiMtLS0tLS0tLS0KIyBJbXBvcnRzCiMtLS0tLS0tLS0KaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHN0YXQKaW1wb3J0IGVycm5vCmltcG9ydCB0aW1lCmltcG9ydCBzdHJ1Y3QKaW1wb3J0IGNvcHkKaW1wb3J0IHJlCgp0cnk6CiAgICBpbXBvcnQgZ3JwLCBwd2QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZ3JwID0gcHdkID0gTm9uZQoKIyBvcy5zeW1saW5rIG9uIFdpbmRvd3MgcHJpb3IgdG8gNi4wIHJhaXNlcyBOb3RJbXBsZW1lbnRlZEVycm9yCnN5bWxpbmtfZXhjZXB0aW9uID0gKEF0dHJpYnV0ZUVycm9yLCBOb3RJbXBsZW1lbnRlZEVycm9yKQp0cnk6CiAgICAjIFdpbmRvd3NFcnJvciAoMTMxNCkgd2lsbCBiZSByYWlzZWQgaWYgdGhlIGNhbGxlciBkb2VzIG5vdCBob2xkIHRoZQogICAgIyBTZUNyZWF0ZVN5bWJvbGljTGlua1ByaXZpbGVnZSBwcml2aWxlZ2UKICAgIHN5bWxpbmtfZXhjZXB0aW9uICs9IChXaW5kb3dzRXJyb3IsKQpleGNlcHQgTmFtZUVycm9yOgogICAgcGFzcwoKIyBmcm9tIHRhcmZpbGUgaW1wb3J0ICoKX19hbGxfXyA9IFsiVGFyRmlsZSIsICJUYXJJbmZvIiwgImlzX3RhcmZpbGUiLCAiVGFyRXJyb3IiXQoKaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICBpbXBvcnQgX19idWlsdGluX18gYXMgYnVpbHRpbnMKZWxzZToKICAgIGltcG9ydCBidWlsdGlucwoKX29wZW4gPSBidWlsdGlucy5vcGVuICAgIyBTaW5jZSAnb3BlbicgaXMgVGFyRmlsZS5vcGVuCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgdGFyIGNvbnN0YW50cwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk5VTCA9IGIiXDAiICAgICAgICAgICAgICAgICAgICAgIyB0aGUgbnVsbCBjaGFyYWN0ZXIKQkxPQ0tTSVpFID0gNTEyICAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcwpSRUNPUkRTSVpFID0gQkxPQ0tTSVpFICogMjAgICAgICMgbGVuZ3RoIG9mIHJlY29yZHMKR05VX01BR0lDID0gYiJ1c3RhciAgXDAiICAgICAgICAjIG1hZ2ljIGdudSB0YXIgc3RyaW5nClBPU0lYX01BR0lDID0gYiJ1c3Rhclx4MDAwMCIgICAgIyBtYWdpYyBwb3NpeCB0YXIgc3RyaW5nCgpMRU5HVEhfTkFNRSA9IDEwMCAgICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBmaWxlbmFtZQpMRU5HVEhfTElOSyA9IDEwMCAgICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5rbmFtZQpMRU5HVEhfUFJFRklYID0gMTU1ICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgdGhlIHByZWZpeCBmaWVsZAoKUkVHVFlQRSA9IGIiMCIgICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQpBUkVHVFlQRSA9IGIiXDAiICAgICAgICAgICAgICAgICMgcmVndWxhciBmaWxlCkxOS1RZUEUgPSBiIjEiICAgICAgICAgICAgICAgICAgIyBsaW5rIChpbnNpZGUgdGFyZmlsZSkKU1lNVFlQRSA9IGIiMiIgICAgICAgICAgICAgICAgICAjIHN5bWJvbGljIGxpbmsKQ0hSVFlQRSA9IGIiMyIgICAgICAgICAgICAgICAgICAjIGNoYXJhY3RlciBzcGVjaWFsIGRldmljZQpCTEtUWVBFID0gYiI0IiAgICAgICAgICAgICAgICAgICMgYmxvY2sgc3BlY2lhbCBkZXZpY2UKRElSVFlQRSA9IGIiNSIgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQpGSUZPVFlQRSA9IGIiNiIgICAgICAgICAgICAgICAgICMgZmlmbyBzcGVjaWFsIGRldmljZQpDT05UVFlQRSA9IGIiNyIgICAgICAgICAgICAgICAgICMgY29udGlndW91cyBmaWxlCgpHTlVUWVBFX0xPTkdOQU1FID0gYiJMIiAgICAgICAgICMgR05VIHRhciBsb25nbmFtZQpHTlVUWVBFX0xPTkdMSU5LID0gYiJLIiAgICAgICAgICMgR05VIHRhciBsb25nbGluawpHTlVUWVBFX1NQQVJTRSA9IGIiUyIgICAgICAgICAgICMgR05VIHRhciBzcGFyc2UgZmlsZQoKWEhEVFlQRSA9IGIieCIgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSBleHRlbmRlZCBoZWFkZXIKWEdMVFlQRSA9IGIiZyIgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSBnbG9iYWwgaGVhZGVyClNPTEFSSVNfWEhEVFlQRSA9IGIiWCIgICAgICAgICAgIyBTb2xhcmlzIGV4dGVuZGVkIGhlYWRlcgoKVVNUQVJfRk9STUFUID0gMCAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMTk4OCAodXN0YXIpIGZvcm1hdApHTlVfRk9STUFUID0gMSAgICAgICAgICAgICAgICAgICMgR05VIHRhciBmb3JtYXQKUEFYX0ZPUk1BVCA9IDIgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSAocGF4KSBmb3JtYXQKREVGQVVMVF9GT1JNQVQgPSBHTlVfRk9STUFUCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgdGFyZmlsZSBjb25zdGFudHMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEZpbGUgdHlwZXMgdGhhdCB0YXJmaWxlIHN1cHBvcnRzOgpTVVBQT1JURURfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsIExOS1RZUEUsCiAgICAgICAgICAgICAgICAgICBTWU1UWVBFLCBESVJUWVBFLCBGSUZPVFlQRSwKICAgICAgICAgICAgICAgICAgIENPTlRUWVBFLCBDSFJUWVBFLCBCTEtUWVBFLAogICAgICAgICAgICAgICAgICAgR05VVFlQRV9MT05HTkFNRSwgR05VVFlQRV9MT05HTElOSywKICAgICAgICAgICAgICAgICAgIEdOVVRZUEVfU1BBUlNFKQoKIyBGaWxlIHR5cGVzIHRoYXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBmaWxlLgpSRUdVTEFSX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLAogICAgICAgICAgICAgICAgIENPTlRUWVBFLCBHTlVUWVBFX1NQQVJTRSkKCiMgRmlsZSB0eXBlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBHTlUgdGFyIGZvcm1hdC4KR05VX1RZUEVTID0gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkssCiAgICAgICAgICAgICBHTlVUWVBFX1NQQVJTRSkKCiMgRmllbGRzIGZyb20gYSBwYXggaGVhZGVyIHRoYXQgb3ZlcnJpZGUgYSBUYXJJbmZvIGF0dHJpYnV0ZS4KUEFYX0ZJRUxEUyA9ICgicGF0aCIsICJsaW5rcGF0aCIsICJzaXplIiwgIm10aW1lIiwKICAgICAgICAgICAgICAidWlkIiwgImdpZCIsICJ1bmFtZSIsICJnbmFtZSIpCgojIEZpZWxkcyBmcm9tIGEgcGF4IGhlYWRlciB0aGF0IGFyZSBhZmZlY3RlZCBieSBoZHJjaGFyc2V0LgpQQVhfTkFNRV9GSUVMRFMgPSBzZXQoKCJwYXRoIiwgImxpbmtwYXRoIiwgInVuYW1lIiwgImduYW1lIikpCgojIEZpZWxkcyBpbiBhIHBheCBoZWFkZXIgdGhhdCBhcmUgbnVtYmVycywgYWxsIG90aGVyIGZpZWxkcwojIGFyZSB0cmVhdGVkIGFzIHN0cmluZ3MuClBBWF9OVU1CRVJfRklFTERTID0gewogICAgImF0aW1lIjogZmxvYXQsCiAgICAiY3RpbWUiOiBmbG9hdCwKICAgICJtdGltZSI6IGZsb2F0LAogICAgInVpZCI6IGludCwKICAgICJnaWQiOiBpbnQsCiAgICAic2l6ZSI6IGludAp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQml0cyB1c2VkIGluIHRoZSBtb2RlIGZpZWxkLCB2YWx1ZXMgaW4gb2N0YWwuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU19JRkxOSyA9IDBvMTIwMDAwICAgICAgICAjIHN5bWJvbGljIGxpbmsKU19JRlJFRyA9IDBvMTAwMDAwICAgICAgICAjIHJlZ3VsYXIgZmlsZQpTX0lGQkxLID0gMG8wNjAwMDAgICAgICAgICMgYmxvY2sgZGV2aWNlClNfSUZESVIgPSAwbzA0MDAwMCAgICAgICAgIyBkaXJlY3RvcnkKU19JRkNIUiA9IDBvMDIwMDAwICAgICAgICAjIGNoYXJhY3RlciBkZXZpY2UKU19JRklGTyA9IDBvMDEwMDAwICAgICAgICAjIGZpZm8KClRTVUlEICAgPSAwbzQwMDAgICAgICAgICAgIyBzZXQgVUlEIG9uIGV4ZWN1dGlvbgpUU0dJRCAgID0gMG8yMDAwICAgICAgICAgICMgc2V0IEdJRCBvbiBleGVjdXRpb24KVFNWVFggICA9IDBvMTAwMCAgICAgICAgICAjIHJlc2VydmVkCgpUVVJFQUQgID0gMG80MDAgICAgICAgICAgICMgcmVhZCBieSBvd25lcgpUVVdSSVRFID0gMG8yMDAgICAgICAgICAgICMgd3JpdGUgYnkgb3duZXIKVFVFWEVDICA9IDBvMTAwICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IG93bmVyClRHUkVBRCAgPSAwbzA0MCAgICAgICAgICAgIyByZWFkIGJ5IGdyb3VwClRHV1JJVEUgPSAwbzAyMCAgICAgICAgICAgIyB3cml0ZSBieSBncm91cApUR0VYRUMgID0gMG8wMTAgICAgICAgICAgICMgZXhlY3V0ZS9zZWFyY2ggYnkgZ3JvdXAKVE9SRUFEICA9IDBvMDA0ICAgICAgICAgICAjIHJlYWQgYnkgb3RoZXIKVE9XUklURSA9IDBvMDAyICAgICAgICAgICAjIHdyaXRlIGJ5IG90aGVyClRPRVhFQyAgPSAwbzAwMSAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBvdGhlcgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGluaXRpYWxpemF0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6CiAgICBFTkNPRElORyA9ICJ1dGYtOCIKZWxzZToKICAgIEVOQ09ESU5HID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU29tZSB1c2VmdWwgZnVuY3Rpb25zCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmRlZiBzdG4ocywgbGVuZ3RoLCBlbmNvZGluZywgZXJyb3JzKToKICAgICIiIkNvbnZlcnQgYSBzdHJpbmcgdG8gYSBudWxsLXRlcm1pbmF0ZWQgYnl0ZXMgb2JqZWN0LgogICAgIiIiCiAgICBzID0gcy5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykKICAgIHJldHVybiBzWzpsZW5ndGhdICsgKGxlbmd0aCAtIGxlbihzKSkgKiBOVUwKCmRlZiBudHMocywgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAiIiJDb252ZXJ0IGEgbnVsbC10ZXJtaW5hdGVkIGJ5dGVzIG9iamVjdCB0byBhIHN0cmluZy4KICAgICIiIgogICAgcCA9IHMuZmluZChiIlwwIikKICAgIGlmIHAgIT0gLTE6CiAgICAgICAgcyA9IHNbOnBdCiAgICByZXR1cm4gcy5kZWNvZGUoZW5jb2RpbmcsIGVycm9ycykKCmRlZiBudGkocyk6CiAgICAiIiJDb252ZXJ0IGEgbnVtYmVyIGZpZWxkIHRvIGEgcHl0aG9uIG51bWJlci4KICAgICIiIgogICAgIyBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGVuY29kaW5ncyBmb3IgYSBudW1iZXIgZmllbGQsIHNlZQogICAgIyBpdG4oKSBiZWxvdy4KICAgIGlmIHNbMF0gIT0gY2hyKDBvMjAwKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG4gPSBpbnQobnRzKHMsICJhc2NpaSIsICJzdHJpY3QiKSBvciAiMCIsIDgpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXJFcnJvcigiaW52YWxpZCBoZWFkZXIiKQogICAgZWxzZToKICAgICAgICBuID0gMAogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzKSAtIDEpOgogICAgICAgICAgICBuIDw8PSA4CiAgICAgICAgICAgIG4gKz0gb3JkKHNbaSArIDFdKQogICAgcmV0dXJuIG4KCmRlZiBpdG4obiwgZGlnaXRzPTgsIGZvcm1hdD1ERUZBVUxUX0ZPUk1BVCk6CiAgICAiIiJDb252ZXJ0IGEgcHl0aG9uIG51bWJlciB0byBhIG51bWJlciBmaWVsZC4KICAgICIiIgogICAgIyBQT1NJWCAxMDAzLjEtMTk4OCByZXF1aXJlcyBudW1iZXJzIHRvIGJlIGVuY29kZWQgYXMgYSBzdHJpbmcgb2YKICAgICMgb2N0YWwgZGlnaXRzIGZvbGxvd2VkIGJ5IGEgbnVsbC1ieXRlLCB0aGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8KICAgICMgKDgqKihkaWdpdHMtMSkpLTEuIEdOVSB0YXIgYWxsb3dzIHN0b3JpbmcgbnVtYmVycyBncmVhdGVyIHRoYW4KICAgICMgdGhhdCBpZiBuZWNlc3NhcnkuIEEgbGVhZGluZyAwbzIwMCBieXRlIGluZGljYXRlcyB0aGlzIHBhcnRpY3VsYXIKICAgICMgZW5jb2RpbmcsIHRoZSBmb2xsb3dpbmcgZGlnaXRzLTEgYnl0ZXMgYXJlIGEgYmlnLWVuZGlhbgogICAgIyByZXByZXNlbnRhdGlvbi4gVGhpcyBhbGxvd3MgdmFsdWVzIHVwIHRvICgyNTYqKihkaWdpdHMtMSkpLTEuCiAgICBpZiAwIDw9IG4gPCA4ICoqIChkaWdpdHMgLSAxKToKICAgICAgICBzID0gKCIlMCpvIiAlIChkaWdpdHMgLSAxLCBuKSkuZW5jb2RlKCJhc2NpaSIpICsgTlVMCiAgICBlbHNlOgogICAgICAgIGlmIGZvcm1hdCAhPSBHTlVfRk9STUFUIG9yIG4gPj0gMjU2ICoqIChkaWdpdHMgLSAxKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3ZlcmZsb3cgaW4gbnVtYmVyIGZpZWxkIikKCiAgICAgICAgaWYgbiA8IDA6CiAgICAgICAgICAgICMgWFhYIFdlIG1pbWljIEdOVSB0YXIncyBiZWhhdmlvdXIgd2l0aCBuZWdhdGl2ZSBudW1iZXJzLAogICAgICAgICAgICAjIHRoaXMgY291bGQgcmFpc2UgT3ZlcmZsb3dFcnJvci4KICAgICAgICAgICAgbiA9IHN0cnVjdC51bnBhY2soIkwiLCBzdHJ1Y3QucGFjaygibCIsIG4pKVswXQoKICAgICAgICBzID0gYnl0ZWFycmF5KCkKICAgICAgICBmb3IgaSBpbiByYW5nZShkaWdpdHMgLSAxKToKICAgICAgICAgICAgcy5pbnNlcnQoMCwgbiAmIDBvMzc3KQogICAgICAgICAgICBuID4+PSA4CiAgICAgICAgcy5pbnNlcnQoMCwgMG8yMDApCiAgICByZXR1cm4gcwoKZGVmIGNhbGNfY2hrc3VtcyhidWYpOgogICAgIiIiQ2FsY3VsYXRlIHRoZSBjaGVja3N1bSBmb3IgYSBtZW1iZXIncyBoZWFkZXIgYnkgc3VtbWluZyB1cCBhbGwKICAgICAgIGNoYXJhY3RlcnMgZXhjZXB0IGZvciB0aGUgY2hrc3VtIGZpZWxkIHdoaWNoIGlzIHRyZWF0ZWQgYXMgaWYKICAgICAgIGl0IHdhcyBmaWxsZWQgd2l0aCBzcGFjZXMuIEFjY29yZGluZyB0byB0aGUgR05VIHRhciBzb3VyY2VzLAogICAgICAgc29tZSB0YXJzIChTdW4gYW5kIE5lWFQpIGNhbGN1bGF0ZSBjaGtzdW0gd2l0aCBzaWduZWQgY2hhciwKICAgICAgIHdoaWNoIHdpbGwgYmUgZGlmZmVyZW50IGlmIHRoZXJlIGFyZSBjaGFycyBpbiB0aGUgYnVmZmVyIHdpdGgKICAgICAgIHRoZSBoaWdoIGJpdCBzZXQuIFNvIHdlIGNhbGN1bGF0ZSB0d28gY2hlY2tzdW1zLCB1bnNpZ25lZCBhbmQKICAgICAgIHNpZ25lZC4KICAgICIiIgogICAgdW5zaWduZWRfY2hrc3VtID0gMjU2ICsgc3VtKHN0cnVjdC51bnBhY2soIjE0OEIiLCBidWZbOjE0OF0pICsgc3RydWN0LnVucGFjaygiMzU2QiIsIGJ1ZlsxNTY6NTEyXSkpCiAgICBzaWduZWRfY2hrc3VtID0gMjU2ICsgc3VtKHN0cnVjdC51bnBhY2soIjE0OGIiLCBidWZbOjE0OF0pICsgc3RydWN0LnVucGFjaygiMzU2YiIsIGJ1ZlsxNTY6NTEyXSkpCiAgICByZXR1cm4gdW5zaWduZWRfY2hrc3VtLCBzaWduZWRfY2hrc3VtCgpkZWYgY29weWZpbGVvYmooc3JjLCBkc3QsIGxlbmd0aD1Ob25lKToKICAgICIiIkNvcHkgbGVuZ3RoIGJ5dGVzIGZyb20gZmlsZW9iaiBzcmMgdG8gZmlsZW9iaiBkc3QuCiAgICAgICBJZiBsZW5ndGggaXMgTm9uZSwgY29weSB0aGUgZW50aXJlIGNvbnRlbnQuCiAgICAiIiIKICAgIGlmIGxlbmd0aCA9PSAwOgogICAgICAgIHJldHVybgogICAgaWYgbGVuZ3RoIGlzIE5vbmU6CiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgYnVmID0gc3JjLnJlYWQoMTYqMTAyNCkKICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGRzdC53cml0ZShidWYpCiAgICAgICAgcmV0dXJuCgogICAgQlVGU0laRSA9IDE2ICogMTAyNAogICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuZ3RoLCBCVUZTSVpFKQogICAgZm9yIGIgaW4gcmFuZ2UoYmxvY2tzKToKICAgICAgICBidWYgPSBzcmMucmVhZChCVUZTSVpFKQogICAgICAgIGlmIGxlbihidWYpIDwgQlVGU0laRToKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiZW5kIG9mIGZpbGUgcmVhY2hlZCIpCiAgICAgICAgZHN0LndyaXRlKGJ1ZikKCiAgICBpZiByZW1haW5kZXIgIT0gMDoKICAgICAgICBidWYgPSBzcmMucmVhZChyZW1haW5kZXIpCiAgICAgICAgaWYgbGVuKGJ1ZikgPCByZW1haW5kZXI6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImVuZCBvZiBmaWxlIHJlYWNoZWQiKQogICAgICAgIGRzdC53cml0ZShidWYpCiAgICByZXR1cm4KCmZpbGVtb2RlX3RhYmxlID0gKAogICAgKChTX0lGTE5LLCAgICAgICJsIiksCiAgICAgKFNfSUZSRUcsICAgICAgIi0iKSwKICAgICAoU19JRkJMSywgICAgICAiYiIpLAogICAgIChTX0lGRElSLCAgICAgICJkIiksCiAgICAgKFNfSUZDSFIsICAgICAgImMiKSwKICAgICAoU19JRklGTywgICAgICAicCIpKSwKCiAgICAoKFRVUkVBRCwgICAgICAgInIiKSwpLAogICAgKChUVVdSSVRFLCAgICAgICJ3IiksKSwKICAgICgoVFVFWEVDfFRTVUlELCAicyIpLAogICAgIChUU1VJRCwgICAgICAgICJTIiksCiAgICAgKFRVRVhFQywgICAgICAgIngiKSksCgogICAgKChUR1JFQUQsICAgICAgICJyIiksKSwKICAgICgoVEdXUklURSwgICAgICAidyIpLCksCiAgICAoKFRHRVhFQ3xUU0dJRCwgInMiKSwKICAgICAoVFNHSUQsICAgICAgICAiUyIpLAogICAgIChUR0VYRUMsICAgICAgICJ4IikpLAoKICAgICgoVE9SRUFELCAgICAgICAiciIpLCksCiAgICAoKFRPV1JJVEUsICAgICAgInciKSwpLAogICAgKChUT0VYRUN8VFNWVFgsICJ0IiksCiAgICAgKFRTVlRYLCAgICAgICAgIlQiKSwKICAgICAoVE9FWEVDLCAgICAgICAieCIpKQopCgpkZWYgZmlsZW1vZGUobW9kZSk6CiAgICAiIiJDb252ZXJ0IGEgZmlsZSdzIG1vZGUgdG8gYSBzdHJpbmcgb2YgdGhlIGZvcm0KICAgICAgIC1yd3hyd3hyd3guCiAgICAgICBVc2VkIGJ5IFRhckZpbGUubGlzdCgpCiAgICAiIiIKICAgIHBlcm0gPSBbXQogICAgZm9yIHRhYmxlIGluIGZpbGVtb2RlX3RhYmxlOgogICAgICAgIGZvciBiaXQsIGNoYXIgaW4gdGFibGU6CiAgICAgICAgICAgIGlmIG1vZGUgJiBiaXQgPT0gYml0OgogICAgICAgICAgICAgICAgcGVybS5hcHBlbmQoY2hhcikKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGVybS5hcHBlbmQoIi0iKQogICAgcmV0dXJuICIiLmpvaW4ocGVybSkKCmNsYXNzIFRhckVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJCYXNlIGV4Y2VwdGlvbi4iIiIKICAgIHBhc3MKY2xhc3MgRXh0cmFjdEVycm9yKFRhckVycm9yKToKICAgICIiIkdlbmVyYWwgZXhjZXB0aW9uIGZvciBleHRyYWN0IGVycm9ycy4iIiIKICAgIHBhc3MKY2xhc3MgUmVhZEVycm9yKFRhckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5yZWFkYWJsZSB0YXIgYXJjaGl2ZXMuIiIiCiAgICBwYXNzCmNsYXNzIENvbXByZXNzaW9uRXJyb3IoVGFyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciB1bmF2YWlsYWJsZSBjb21wcmVzc2lvbiBtZXRob2RzLiIiIgogICAgcGFzcwpjbGFzcyBTdHJlYW1FcnJvcihUYXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIHVuc3VwcG9ydGVkIG9wZXJhdGlvbnMgb24gc3RyZWFtLWxpa2UgVGFyRmlsZXMuIiIiCiAgICBwYXNzCmNsYXNzIEhlYWRlckVycm9yKFRhckVycm9yKToKICAgICIiIkJhc2UgZXhjZXB0aW9uIGZvciBoZWFkZXIgZXJyb3JzLiIiIgogICAgcGFzcwpjbGFzcyBFbXB0eUhlYWRlckVycm9yKEhlYWRlckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgZW1wdHkgaGVhZGVycy4iIiIKICAgIHBhc3MKY2xhc3MgVHJ1bmNhdGVkSGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciB0cnVuY2F0ZWQgaGVhZGVycy4iIiIKICAgIHBhc3MKY2xhc3MgRU9GSGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciBlbmQgb2YgZmlsZSBoZWFkZXJzLiIiIgogICAgcGFzcwpjbGFzcyBJbnZhbGlkSGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciBpbnZhbGlkIGhlYWRlcnMuIiIiCiAgICBwYXNzCmNsYXNzIFN1YnNlcXVlbnRIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIG1pc3NpbmcgYW5kIGludmFsaWQgZXh0ZW5kZWQgaGVhZGVycy4iIiIKICAgIHBhc3MKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBpbnRlcm5hbCBzdHJlYW0gaW50ZXJmYWNlCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgX0xvd0xldmVsRmlsZShvYmplY3QpOgogICAgIiIiTG93LWxldmVsIGZpbGUgb2JqZWN0LiBTdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nLgogICAgICAgSXQgaXMgdXNlZCBpbnN0ZWFkIG9mIGEgcmVndWxhciBmaWxlIG9iamVjdCBmb3Igc3RyZWFtaW5nCiAgICAgICBhY2Nlc3MuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZSk6CiAgICAgICAgbW9kZSA9IHsKICAgICAgICAgICAgInIiOiBvcy5PX1JET05MWSwKICAgICAgICAgICAgInciOiBvcy5PX1dST05MWSB8IG9zLk9fQ1JFQVQgfCBvcy5PX1RSVU5DLAogICAgICAgIH1bbW9kZV0KICAgICAgICBpZiBoYXNhdHRyKG9zLCAiT19CSU5BUlkiKToKICAgICAgICAgICAgbW9kZSB8PSBvcy5PX0JJTkFSWQogICAgICAgIHNlbGYuZmQgPSBvcy5vcGVuKG5hbWUsIG1vZGUsIDBvNjY2KQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBvcy5jbG9zZShzZWxmLmZkKQoKICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgogICAgICAgIHJldHVybiBvcy5yZWFkKHNlbGYuZmQsIHNpemUpCgogICAgZGVmIHdyaXRlKHNlbGYsIHMpOgogICAgICAgIG9zLndyaXRlKHNlbGYuZmQsIHMpCgpjbGFzcyBfU3RyZWFtKG9iamVjdCk6CiAgICAiIiJDbGFzcyB0aGF0IHNlcnZlcyBhcyBhbiBhZGFwdGVyIGJldHdlZW4gVGFyRmlsZSBhbmQKICAgICAgIGEgc3RyZWFtLWxpa2Ugb2JqZWN0LiAgVGhlIHN0cmVhbS1saWtlIG9iamVjdCBvbmx5CiAgICAgICBuZWVkcyB0byBoYXZlIGEgcmVhZCgpIG9yIHdyaXRlKCkgbWV0aG9kIGFuZCBpcyBhY2Nlc3NlZAogICAgICAgYmxvY2t3aXNlLiAgVXNlIG9mIGd6aXAgb3IgYnppcDIgY29tcHJlc3Npb24gaXMgcG9zc2libGUuCiAgICAgICBBIHN0cmVhbS1saWtlIG9iamVjdCBjb3VsZCBiZSBmb3IgZXhhbXBsZTogc3lzLnN0ZGluLAogICAgICAgc3lzLnN0ZG91dCwgYSBzb2NrZXQsIGEgdGFwZSBkZXZpY2UgZXRjLgoKICAgICAgIF9TdHJlYW0gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGludGVybmFsbHkuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZSwgY29tcHR5cGUsIGZpbGVvYmosIGJ1ZnNpemUpOgogICAgICAgICIiIkNvbnN0cnVjdCBhIF9TdHJlYW0gb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBUcnVlCiAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgogICAgICAgICAgICBmaWxlb2JqID0gX0xvd0xldmVsRmlsZShuYW1lLCBtb2RlKQogICAgICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gRmFsc2UKCiAgICAgICAgaWYgY29tcHR5cGUgPT0gJyonOgogICAgICAgICAgICAjIEVuYWJsZSB0cmFuc3BhcmVudCBjb21wcmVzc2lvbiBkZXRlY3Rpb24gZm9yIHRoZQogICAgICAgICAgICAjIHN0cmVhbSBpbnRlcmZhY2UKICAgICAgICAgICAgZmlsZW9iaiA9IF9TdHJlYW1Qcm94eShmaWxlb2JqKQogICAgICAgICAgICBjb21wdHlwZSA9IGZpbGVvYmouZ2V0Y29tcHR5cGUoKQoKICAgICAgICBzZWxmLm5hbWUgICAgID0gbmFtZSBvciAiIgogICAgICAgIHNlbGYubW9kZSAgICAgPSBtb2RlCiAgICAgICAgc2VsZi5jb21wdHlwZSA9IGNvbXB0eXBlCiAgICAgICAgc2VsZi5maWxlb2JqICA9IGZpbGVvYmoKICAgICAgICBzZWxmLmJ1ZnNpemUgID0gYnVmc2l6ZQogICAgICAgIHNlbGYuYnVmICAgICAgPSBiIiIKICAgICAgICBzZWxmLnBvcyAgICAgID0gMAogICAgICAgIHNlbGYuY2xvc2VkICAgPSBGYWxzZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGNvbXB0eXBlID09ICJneiI6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHpsaWIKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ6bGliIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKICAgICAgICAgICAgICAgIHNlbGYuemxpYiA9IHpsaWIKICAgICAgICAgICAgICAgIHNlbGYuY3JjID0gemxpYi5jcmMzMihiIiIpCiAgICAgICAgICAgICAgICBpZiBtb2RlID09ICJyIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0X3JlYWRfZ3ooKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0X3dyaXRlX2d6KCkKCiAgICAgICAgICAgIGlmIGNvbXB0eXBlID09ICJiejIiOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGltcG9ydCBiejIKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQogICAgICAgICAgICAgICAgaWYgbW9kZSA9PSAiciI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYnVmID0gYiIiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyRGVjb21wcmVzc29yKCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyQ29tcHJlc3NvcigpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQogICAgICAgICAgICByYWlzZQoKICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgImNsb3NlZCIpIGFuZCBub3Qgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiBfaW5pdF93cml0ZV9neihzZWxmKToKICAgICAgICAiIiJJbml0aWFsaXplIGZvciB3cml0aW5nIHdpdGggZ3ppcCBjb21wcmVzc2lvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNtcCA9IHNlbGYuemxpYi5jb21wcmVzc29iaig5LCBzZWxmLnpsaWIuREVGTEFURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXNlbGYuemxpYi5NQVhfV0JJVFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi56bGliLkRFRl9NRU1fTEVWRUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkKICAgICAgICB0aW1lc3RhbXAgPSBzdHJ1Y3QucGFjaygiPEwiLCBpbnQodGltZS50aW1lKCkpKQogICAgICAgIHNlbGYuX193cml0ZShiIlwwMzdcMjEzXDAxMFwwMTAiICsgdGltZXN0YW1wICsgYiJcMDAyXDM3NyIpCiAgICAgICAgaWYgc2VsZi5uYW1lLmVuZHN3aXRoKCIuZ3oiKToKICAgICAgICAgICAgc2VsZi5uYW1lID0gc2VsZi5uYW1lWzotM10KICAgICAgICAjIFJGQzE5NTIgc2F5cyB3ZSBtdXN0IHVzZSBJU08tODg1OS0xIGZvciB0aGUgRk5BTUUgZmllbGQuCiAgICAgICAgc2VsZi5fX3dyaXRlKHNlbGYubmFtZS5lbmNvZGUoImlzby04ODU5LTEiLCAicmVwbGFjZSIpICsgTlVMKQoKICAgIGRlZiB3cml0ZShzZWxmLCBzKToKICAgICAgICAiIiJXcml0ZSBzdHJpbmcgcyB0byB0aGUgc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gImd6IjoKICAgICAgICAgICAgc2VsZi5jcmMgPSBzZWxmLnpsaWIuY3JjMzIocywgc2VsZi5jcmMpCiAgICAgICAgc2VsZi5wb3MgKz0gbGVuKHMpCiAgICAgICAgaWYgc2VsZi5jb21wdHlwZSAhPSAidGFyIjoKICAgICAgICAgICAgcyA9IHNlbGYuY21wLmNvbXByZXNzKHMpCiAgICAgICAgc2VsZi5fX3dyaXRlKHMpCgogICAgZGVmIF9fd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgIiIiV3JpdGUgc3RyaW5nIHMgdG8gdGhlIHN0cmVhbSBpZiBhIHdob2xlIG5ldyBibG9jawogICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHdyaXR0ZW4uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5idWYgKz0gcwogICAgICAgIHdoaWxlIGxlbihzZWxmLmJ1ZikgPiBzZWxmLmJ1ZnNpemU6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1Zls6c2VsZi5idWZzaXplXSkKICAgICAgICAgICAgc2VsZi5idWYgPSBzZWxmLmJ1ZltzZWxmLmJ1ZnNpemU6XQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbG9zZSB0aGUgX1N0cmVhbSBvYmplY3QuIE5vIG9wZXJhdGlvbiBzaG91bGQgYmUKICAgICAgICAgICBkb25lIG9uIGl0IGFmdGVyd2FyZHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInciIGFuZCBzZWxmLmNvbXB0eXBlICE9ICJ0YXIiOgogICAgICAgICAgICBzZWxmLmJ1ZiArPSBzZWxmLmNtcC5mbHVzaCgpCgogICAgICAgIGlmIHNlbGYubW9kZSA9PSAidyIgYW5kIHNlbGYuYnVmOgogICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc2VsZi5idWYpCiAgICAgICAgICAgIHNlbGYuYnVmID0gYiIiCiAgICAgICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gImd6IjoKICAgICAgICAgICAgICAgICMgVGhlIG5hdGl2ZSB6bGliIGNyYyBpcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgYnV0CiAgICAgICAgICAgICAgICAjIHRoZSBQeXRob24gd3JhcHBlciBpbXBsaWNpdGx5IGNhc3RzIHRoYXQgdG8gYSBzaWduZWQgQwogICAgICAgICAgICAgICAgIyBsb25nLiAgU28sIG9uIGEgMzItYml0IGJveCBzZWxmLmNyYyBtYXkgImxvb2sgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgIyB3aGlsZSB0aGUgc2FtZSBjcmMgb24gYSA2NC1iaXQgYm94IG1heSAibG9vayBwb3NpdGl2ZSIuCiAgICAgICAgICAgICAgICAjIFRvIGF2b2lkIGlya3NvbWUgd2FybmluZ3MgZnJvbSB0aGUgYHN0cnVjdGAgbW9kdWxlLCBmb3JjZQogICAgICAgICAgICAgICAgIyBpdCB0byBsb29rIHBvc2l0aXZlIG9uIGFsbCBib3hlcy4KICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjaygiPEwiLCBzZWxmLmNyYyAmIDB4ZmZmZmZmZmYpKQogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHN0cnVjdC5wYWNrKCI8TCIsIHNlbGYucG9zICYgMHhmZmZmRkZGRikpCgogICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQoKICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKCiAgICBkZWYgX2luaXRfcmVhZF9neihzZWxmKToKICAgICAgICAiIiJJbml0aWFsaXplIGZvciByZWFkaW5nIGEgZ3ppcCBjb21wcmVzc2VkIGZpbGVvYmouCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jbXAgPSBzZWxmLnpsaWIuZGVjb21wcmVzc29iaigtc2VsZi56bGliLk1BWF9XQklUUykKICAgICAgICBzZWxmLmRidWYgPSBiIiIKCiAgICAgICAgIyB0YWtlbiBmcm9tIGd6aXAuR3ppcEZpbGUgd2l0aCBzb21lIGFsdGVyYXRpb25zCiAgICAgICAgaWYgc2VsZi5fX3JlYWQoMikgIT0gYiJcMDM3XDIxMyI6CiAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgZ3ppcCBmaWxlIikKICAgICAgICBpZiBzZWxmLl9fcmVhZCgxKSAhPSBiIlwwMTAiOgogICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiBtZXRob2QiKQoKICAgICAgICBmbGFnID0gb3JkKHNlbGYuX19yZWFkKDEpKQogICAgICAgIHNlbGYuX19yZWFkKDYpCgogICAgICAgIGlmIGZsYWcgJiA0OgogICAgICAgICAgICB4bGVuID0gb3JkKHNlbGYuX19yZWFkKDEpKSArIDI1NiAqIG9yZChzZWxmLl9fcmVhZCgxKSkKICAgICAgICAgICAgc2VsZi5yZWFkKHhsZW4pCiAgICAgICAgaWYgZmxhZyAmIDg6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5fX3JlYWQoMSkKICAgICAgICAgICAgICAgIGlmIG5vdCBzIG9yIHMgPT0gTlVMOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgZmxhZyAmIDE2OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgcyA9IHNlbGYuX19yZWFkKDEpCiAgICAgICAgICAgICAgICBpZiBub3QgcyBvciBzID09IE5VTDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGZsYWcgJiAyOgogICAgICAgICAgICBzZWxmLl9fcmVhZCgyKQoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgc3RyZWFtJ3MgZmlsZSBwb2ludGVyIHBvc2l0aW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnBvcwoKICAgIGRlZiBzZWVrKHNlbGYsIHBvcz0wKToKICAgICAgICAiIiJTZXQgdGhlIHN0cmVhbSdzIGZpbGUgcG9pbnRlciB0byBwb3MuIE5lZ2F0aXZlIHNlZWtpbmcKICAgICAgICAgICBpcyBmb3JiaWRkZW4uCiAgICAgICAgIiIiCiAgICAgICAgaWYgcG9zIC0gc2VsZi5wb3MgPj0gMDoKICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QocG9zIC0gc2VsZi5wb3MsIHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYmxvY2tzKToKICAgICAgICAgICAgICAgIHNlbGYucmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgIHNlbGYucmVhZChyZW1haW5kZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgU3RyZWFtRXJyb3IoInNlZWtpbmcgYmFja3dhcmRzIGlzIG5vdCBhbGxvd2VkIikKICAgICAgICByZXR1cm4gc2VsZi5wb3MKCiAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBzaXplIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICAgICAgSWYgc2l6ZSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIGFsbCBieXRlcyBvZiB0aGUgc3RyZWFtCiAgICAgICAgICAgdXAgdG8gRU9GLgogICAgICAgICIiIgogICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgdCA9IFtdCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBidWYgPSBzZWxmLl9yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHQuYXBwZW5kKGJ1ZikKICAgICAgICAgICAgYnVmID0gIiIuam9pbih0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX3JlYWQoc2l6ZSkKICAgICAgICBzZWxmLnBvcyArPSBsZW4oYnVmKQogICAgICAgIHJldHVybiBidWYKCiAgICBkZWYgX3JlYWQoc2VsZiwgc2l6ZSk6CiAgICAgICAgIiIiUmV0dXJuIHNpemUgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gInRhciI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcmVhZChzaXplKQoKICAgICAgICBjID0gbGVuKHNlbGYuZGJ1ZikKICAgICAgICB3aGlsZSBjIDwgc2l6ZToKICAgICAgICAgICAgYnVmID0gc2VsZi5fX3JlYWQoc2VsZi5idWZzaXplKQogICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5jbXAuZGVjb21wcmVzcyhidWYpCiAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSIpCiAgICAgICAgICAgIHNlbGYuZGJ1ZiArPSBidWYKICAgICAgICAgICAgYyArPSBsZW4oYnVmKQogICAgICAgIGJ1ZiA9IHNlbGYuZGJ1Zls6c2l6ZV0KICAgICAgICBzZWxmLmRidWYgPSBzZWxmLmRidWZbc2l6ZTpdCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIGRlZiBfX3JlYWQoc2VsZiwgc2l6ZSk6CiAgICAgICAgIiIiUmV0dXJuIHNpemUgYnl0ZXMgZnJvbSBzdHJlYW0uIElmIGludGVybmFsIGJ1ZmZlciBpcyBlbXB0eSwKICAgICAgICAgICByZWFkIGFub3RoZXIgYmxvY2sgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIGMgPSBsZW4oc2VsZi5idWYpCiAgICAgICAgd2hpbGUgYyA8IHNpemU6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHNlbGYuYnVmICs9IGJ1ZgogICAgICAgICAgICBjICs9IGxlbihidWYpCiAgICAgICAgYnVmID0gc2VsZi5idWZbOnNpemVdCiAgICAgICAgc2VsZi5idWYgPSBzZWxmLmJ1ZltzaXplOl0KICAgICAgICByZXR1cm4gYnVmCiMgY2xhc3MgX1N0cmVhbQoKY2xhc3MgX1N0cmVhbVByb3h5KG9iamVjdCk6CiAgICAiIiJTbWFsbCBwcm94eSBjbGFzcyB0aGF0IGVuYWJsZXMgdHJhbnNwYXJlbnQgY29tcHJlc3Npb24KICAgICAgIGRldGVjdGlvbiBmb3IgdGhlIFN0cmVhbSBpbnRlcmZhY2UgKG1vZGUgJ3J8KicpLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmopOgogICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKCiAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLmZpbGVvYmoucmVhZAogICAgICAgIHJldHVybiBzZWxmLmJ1ZgoKICAgIGRlZiBnZXRjb21wdHlwZShzZWxmKToKICAgICAgICBpZiBzZWxmLmJ1Zi5zdGFydHN3aXRoKGIiXDAzN1wyMTNcMDEwIik6CiAgICAgICAgICAgIHJldHVybiAiZ3oiCiAgICAgICAgaWYgc2VsZi5idWYuc3RhcnRzd2l0aChiIkJaaDkxIik6CiAgICAgICAgICAgIHJldHVybiAiYnoyIgogICAgICAgIHJldHVybiAidGFyIgoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQojIGNsYXNzIFN0cmVhbVByb3h5CgpjbGFzcyBfQloyUHJveHkob2JqZWN0KToKICAgICIiIlNtYWxsIHByb3h5IGNsYXNzIHRoYXQgZW5hYmxlcyBleHRlcm5hbCBmaWxlIG9iamVjdAogICAgICAgc3VwcG9ydCBmb3IgInI6YnoyIiBhbmQgInc6YnoyIiBtb2Rlcy4gVGhpcyBpcyBhY3R1YWxseQogICAgICAgYSB3b3JrYXJvdW5kIGZvciBhIGxpbWl0YXRpb24gaW4gYnoyIG1vZHVsZSdzIEJaMkZpbGUKICAgICAgIGNsYXNzIHdoaWNoICh1bmxpa2UgZ3ppcC5HemlwRmlsZSkgaGFzIG5vIHN1cHBvcnQgZm9yCiAgICAgICBhIGZpbGUgb2JqZWN0IGFyZ3VtZW50LgogICAgIiIiCgogICAgYmxvY2tzaXplID0gMTYgKiAxMDI0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG1vZGUpOgogICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCiAgICAgICAgc2VsZi5uYW1lID0gZ2V0YXR0cihzZWxmLmZpbGVvYmosICJuYW1lIiwgTm9uZSkKICAgICAgICBzZWxmLmluaXQoKQoKICAgIGRlZiBpbml0KHNlbGYpOgogICAgICAgIGltcG9ydCBiejIKICAgICAgICBzZWxmLnBvcyA9IDAKICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInIiOgogICAgICAgICAgICBzZWxmLmJ6Mm9iaiA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQogICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlaygwKQogICAgICAgICAgICBzZWxmLmJ1ZiA9IGIiIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuYnoyb2JqID0gYnoyLkJaMkNvbXByZXNzb3IoKQoKICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgogICAgICAgIHggPSBsZW4oc2VsZi5idWYpCiAgICAgICAgd2hpbGUgeCA8IHNpemU6CiAgICAgICAgICAgIHJhdyA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYmxvY2tzaXplKQogICAgICAgICAgICBpZiBub3QgcmF3OgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZGF0YSA9IHNlbGYuYnoyb2JqLmRlY29tcHJlc3MocmF3KQogICAgICAgICAgICBzZWxmLmJ1ZiArPSBkYXRhCiAgICAgICAgICAgIHggKz0gbGVuKGRhdGEpCgogICAgICAgIGJ1ZiA9IHNlbGYuYnVmWzpzaXplXQogICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWZbc2l6ZTpdCiAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGJ1ZikKICAgICAgICByZXR1cm4gYnVmCgogICAgZGVmIHNlZWsoc2VsZiwgcG9zKToKICAgICAgICBpZiBwb3MgPCBzZWxmLnBvczoKICAgICAgICAgICAgc2VsZi5pbml0KCkKICAgICAgICBzZWxmLnJlYWQocG9zIC0gc2VsZi5wb3MpCgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucG9zCgogICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgogICAgICAgIHNlbGYucG9zICs9IGxlbihkYXRhKQogICAgICAgIHJhdyA9IHNlbGYuYnoyb2JqLmNvbXByZXNzKGRhdGEpCiAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHJhdykKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IjoKICAgICAgICAgICAgcmF3ID0gc2VsZi5iejJvYmouZmx1c2goKQogICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUocmF3KQojIGNsYXNzIF9CWjJQcm94eQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEV4dHJhY3Rpb24gZmlsZSBvYmplY3QKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBfRmlsZUluRmlsZShvYmplY3QpOgogICAgIiIiQSB0aGluIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIGZpbGUgb2JqZWN0IHRoYXQKICAgICAgIHByb3ZpZGVzIGEgcGFydCBvZiBpdHMgZGF0YSBhcyBhbiBpbmRpdmlkdWFsIGZpbGUKICAgICAgIG9iamVjdC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqLCBvZmZzZXQsIHNpemUsIGJsb2NraW5mbz1Ob25lKToKICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAgICAgICAgc2VsZi5vZmZzZXQgPSBvZmZzZXQKICAgICAgICBzZWxmLnNpemUgPSBzaXplCiAgICAgICAgc2VsZi5wb3NpdGlvbiA9IDAKCiAgICAgICAgaWYgYmxvY2tpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgIGJsb2NraW5mbyA9IFsoMCwgc2l6ZSldCgogICAgICAgICMgQ29uc3RydWN0IGEgbWFwIHdpdGggZGF0YSBhbmQgemVybyBibG9ja3MuCiAgICAgICAgc2VsZi5tYXBfaW5kZXggPSAwCiAgICAgICAgc2VsZi5tYXAgPSBbXQogICAgICAgIGxhc3Rwb3MgPSAwCiAgICAgICAgcmVhbHBvcyA9IHNlbGYub2Zmc2V0CiAgICAgICAgZm9yIG9mZnNldCwgc2l6ZSBpbiBibG9ja2luZm86CiAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CiAgICAgICAgICAgICAgICBzZWxmLm1hcC5hcHBlbmQoKEZhbHNlLCBsYXN0cG9zLCBvZmZzZXQsIE5vbmUpKQogICAgICAgICAgICBzZWxmLm1hcC5hcHBlbmQoKFRydWUsIG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSwgcmVhbHBvcykpCiAgICAgICAgICAgIHJlYWxwb3MgKz0gc2l6ZQogICAgICAgICAgICBsYXN0cG9zID0gb2Zmc2V0ICsgc2l6ZQogICAgICAgIGlmIGxhc3Rwb3MgPCBzZWxmLnNpemU6CiAgICAgICAgICAgIHNlbGYubWFwLmFwcGVuZCgoRmFsc2UsIGxhc3Rwb3MsIHNlbGYuc2l6ZSwgTm9uZSkpCgogICAgZGVmIHNlZWthYmxlKHNlbGYpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuZmlsZW9iaiwgInNlZWthYmxlIik6CiAgICAgICAgICAgICMgWFhYIGd6aXAuR3ppcEZpbGUgYW5kIGJ6Mi5CWjJGaWxlCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iai5zZWVrYWJsZSgpCgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYucG9zaXRpb24KCiAgICBkZWYgc2VlayhzZWxmLCBwb3NpdGlvbik6CiAgICAgICAgIiIiU2VlayB0byBhIHBvc2l0aW9uIGluIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIHNlbGYucG9zaXRpb24gPSBwb3NpdGlvbgoKICAgIGRlZiByZWFkKHNlbGYsIHNpemU9Tm9uZSk6CiAgICAgICAgIiIiUmVhZCBkYXRhIGZyb20gdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgogICAgICAgICAgICBzaXplID0gc2VsZi5zaXplIC0gc2VsZi5wb3NpdGlvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNpemUgPSBtaW4oc2l6ZSwgc2VsZi5zaXplIC0gc2VsZi5wb3NpdGlvbikKCiAgICAgICAgYnVmID0gYiIiCiAgICAgICAgd2hpbGUgc2l6ZSA+IDA6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBkYXRhLCBzdGFydCwgc3RvcCwgb2Zmc2V0ID0gc2VsZi5tYXBbc2VsZi5tYXBfaW5kZXhdCiAgICAgICAgICAgICAgICBpZiBzdGFydCA8PSBzZWxmLnBvc2l0aW9uIDwgc3RvcDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcF9pbmRleCArPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5tYXBfaW5kZXggPT0gbGVuKHNlbGYubWFwKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXBfaW5kZXggPSAwCiAgICAgICAgICAgIGxlbmd0aCA9IG1pbihzaXplLCBzdG9wIC0gc2VsZi5wb3NpdGlvbikKICAgICAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKG9mZnNldCArIChzZWxmLnBvc2l0aW9uIC0gc3RhcnQpKQogICAgICAgICAgICAgICAgYnVmICs9IHNlbGYuZmlsZW9iai5yZWFkKGxlbmd0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ1ZiArPSBOVUwgKiBsZW5ndGgKICAgICAgICAgICAgc2l6ZSAtPSBsZW5ndGgKICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBsZW5ndGgKICAgICAgICByZXR1cm4gYnVmCiNjbGFzcyBfRmlsZUluRmlsZQoKCmNsYXNzIEV4RmlsZU9iamVjdChvYmplY3QpOgogICAgIiIiRmlsZS1saWtlIG9iamVjdCBmb3IgcmVhZGluZyBhbiBhcmNoaXZlIG1lbWJlci4KICAgICAgIElzIHJldHVybmVkIGJ5IFRhckZpbGUuZXh0cmFjdGZpbGUoKS4KICAgICIiIgogICAgYmxvY2tzaXplID0gMTAyNAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJmaWxlLCB0YXJpbmZvKToKICAgICAgICBzZWxmLmZpbGVvYmogPSBfRmlsZUluRmlsZSh0YXJmaWxlLmZpbGVvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5zcGFyc2UpCiAgICAgICAgc2VsZi5uYW1lID0gdGFyaW5mby5uYW1lCiAgICAgICAgc2VsZi5tb2RlID0gInIiCiAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQogICAgICAgIHNlbGYuc2l6ZSA9IHRhcmluZm8uc2l6ZQoKICAgICAgICBzZWxmLnBvc2l0aW9uID0gMAogICAgICAgIHNlbGYuYnVmZmVyID0gYiIiCgogICAgZGVmIHJlYWRhYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHdyaXRhYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBzZWVrYWJsZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnNlZWthYmxlKCkKCiAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgogICAgICAgICIiIlJlYWQgYXQgbW9zdCBzaXplIGJ5dGVzIGZyb20gdGhlIGZpbGUuIElmIHNpemUgaXMgbm90CiAgICAgICAgICAgcHJlc2VudCBvciBOb25lLCByZWFkIGFsbCBkYXRhIHVudGlsIEVPRiBpcyByZWFjaGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKCiAgICAgICAgYnVmID0gYiIiCiAgICAgICAgaWYgc2VsZi5idWZmZXI6CiAgICAgICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuYnVmZmVyCiAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IGIiIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5idWZmZXJbOnNpemVdCiAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IHNlbGYuYnVmZmVyW3NpemU6XQoKICAgICAgICBpZiBzaXplIGlzIE5vbmU6CiAgICAgICAgICAgIGJ1ZiArPSBzZWxmLmZpbGVvYmoucmVhZCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnVmICs9IHNlbGYuZmlsZW9iai5yZWFkKHNpemUgLSBsZW4oYnVmKSkKCiAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBsZW4oYnVmKQogICAgICAgIHJldHVybiBidWYKCiAgICAjIFhYWCBUZXh0SU9XcmFwcGVyIHVzZXMgdGhlIHJlYWQxKCkgbWV0aG9kLgogICAgcmVhZDEgPSByZWFkCgogICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9LTEpOgogICAgICAgICIiIlJlYWQgb25lIGVudGlyZSBsaW5lIGZyb20gdGhlIGZpbGUuIElmIHNpemUgaXMgcHJlc2VudAogICAgICAgICAgIGFuZCBub24tbmVnYXRpdmUsIHJldHVybiBhIHN0cmluZyB3aXRoIGF0IG1vc3QgdGhhdAogICAgICAgICAgIHNpemUsIHdoaWNoIG1heSBiZSBhbiBpbmNvbXBsZXRlIGxpbmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQoKICAgICAgICBwb3MgPSBzZWxmLmJ1ZmZlci5maW5kKGIiXG4iKSArIDEKICAgICAgICBpZiBwb3MgPT0gMDoKICAgICAgICAgICAgIyBubyBuZXdsaW5lIGZvdW5kLgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5ibG9ja3NpemUpCiAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciArPSBidWYKICAgICAgICAgICAgICAgIGlmIG5vdCBidWYgb3IgYiJcbiIgaW4gYnVmOgogICAgICAgICAgICAgICAgICAgIHBvcyA9IHNlbGYuYnVmZmVyLmZpbmQoYiJcbiIpICsgMQogICAgICAgICAgICAgICAgICAgIGlmIHBvcyA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICAjIG5vIG5ld2xpbmUgZm91bmQuCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGxlbihzZWxmLmJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBpZiBzaXplICE9IC0xOgogICAgICAgICAgICBwb3MgPSBtaW4oc2l6ZSwgcG9zKQoKICAgICAgICBidWYgPSBzZWxmLmJ1ZmZlcls6cG9zXQogICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbcG9zOl0KICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbihidWYpCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIGRlZiByZWFkbGluZXMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCB3aXRoIGFsbCByZW1haW5pbmcgbGluZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKCiAgICAgICAgcmV0dXJuIHNlbGYucG9zaXRpb24KCiAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZT1vcy5TRUVLX1NFVCk6CiAgICAgICAgIiIiU2VlayB0byBhIHBvc2l0aW9uIGluIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKCiAgICAgICAgaWYgd2hlbmNlID09IG9zLlNFRUtfU0VUOgogICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWluKG1heChwb3MsIDApLCBzZWxmLnNpemUpCiAgICAgICAgZWxpZiB3aGVuY2UgPT0gb3MuU0VFS19DVVI6CiAgICAgICAgICAgIGlmIHBvcyA8IDA6CiAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWF4KHNlbGYucG9zaXRpb24gKyBwb3MsIDApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWluKHNlbGYucG9zaXRpb24gKyBwb3MsIHNlbGYuc2l6ZSkKICAgICAgICBlbGlmIHdoZW5jZSA9PSBvcy5TRUVLX0VORDoKICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IG1heChtaW4oc2VsZi5zaXplICsgcG9zLCBzZWxmLnNpemUpLCAwKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgYXJndW1lbnQiKQoKICAgICAgICBzZWxmLmJ1ZmZlciA9IGIiIgogICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYucG9zaXRpb24pCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkNsb3NlIHRoZSBmaWxlIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiR2V0IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGZpbGUncyBsaW5lcy4KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgeWllbGQgbGluZQojY2xhc3MgRXhGaWxlT2JqZWN0CgojLS0tLS0tLS0tLS0tLS0tLS0tCiMgRXhwb3J0ZWQgQ2xhc3NlcwojLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIFRhckluZm8ob2JqZWN0KToKICAgICIiIkluZm9ybWF0aW9uYWwgY2xhc3Mgd2hpY2ggaG9sZHMgdGhlIGRldGFpbHMgYWJvdXQgYW4KICAgICAgIGFyY2hpdmUgbWVtYmVyIGdpdmVuIGJ5IGEgdGFyIGhlYWRlciBibG9jay4KICAgICAgIFRhckluZm8gb2JqZWN0cyBhcmUgcmV0dXJuZWQgYnkgVGFyRmlsZS5nZXRtZW1iZXIoKSwKICAgICAgIFRhckZpbGUuZ2V0bWVtYmVycygpIGFuZCBUYXJGaWxlLmdldHRhcmluZm8oKSBhbmQgYXJlCiAgICAgICB1c3VhbGx5IGNyZWF0ZWQgaW50ZXJuYWxseS4KICAgICIiIgoKICAgIF9fc2xvdHNfXyA9ICgibmFtZSIsICJtb2RlIiwgInVpZCIsICJnaWQiLCAic2l6ZSIsICJtdGltZSIsCiAgICAgICAgICAgICAgICAgImNoa3N1bSIsICJ0eXBlIiwgImxpbmtuYW1lIiwgInVuYW1lIiwgImduYW1lIiwKICAgICAgICAgICAgICAgICAiZGV2bWFqb3IiLCAiZGV2bWlub3IiLAogICAgICAgICAgICAgICAgICJvZmZzZXQiLCAib2Zmc2V0X2RhdGEiLCAicGF4X2hlYWRlcnMiLCAic3BhcnNlIiwKICAgICAgICAgICAgICAgICAidGFyZmlsZSIsICJfc3BhcnNlX3N0cnVjdHMiLCAiX2xpbmtfdGFyZ2V0IikKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iIik6CiAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySW5mbyBvYmplY3QuIG5hbWUgaXMgdGhlIG9wdGlvbmFsIG5hbWUKICAgICAgICAgICBvZiB0aGUgbWVtYmVyLgogICAgICAgICIiIgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUgICAgICAgICMgbWVtYmVyIG5hbWUKICAgICAgICBzZWxmLm1vZGUgPSAwbzY0NCAgICAgICAjIGZpbGUgcGVybWlzc2lvbnMKICAgICAgICBzZWxmLnVpZCA9IDAgICAgICAgICAgICAjIHVzZXIgaWQKICAgICAgICBzZWxmLmdpZCA9IDAgICAgICAgICAgICAjIGdyb3VwIGlkCiAgICAgICAgc2VsZi5zaXplID0gMCAgICAgICAgICAgIyBmaWxlIHNpemUKICAgICAgICBzZWxmLm10aW1lID0gMCAgICAgICAgICAjIG1vZGlmaWNhdGlvbiB0aW1lCiAgICAgICAgc2VsZi5jaGtzdW0gPSAwICAgICAgICAgIyBoZWFkZXIgY2hlY2tzdW0KICAgICAgICBzZWxmLnR5cGUgPSBSRUdUWVBFICAgICAjIG1lbWJlciB0eXBlCiAgICAgICAgc2VsZi5saW5rbmFtZSA9ICIiICAgICAgIyBsaW5rIG5hbWUKICAgICAgICBzZWxmLnVuYW1lID0gIiIgICAgICAgICAjIHVzZXIgbmFtZQogICAgICAgIHNlbGYuZ25hbWUgPSAiIiAgICAgICAgICMgZ3JvdXAgbmFtZQogICAgICAgIHNlbGYuZGV2bWFqb3IgPSAwICAgICAgICMgZGV2aWNlIG1ham9yIG51bWJlcgogICAgICAgIHNlbGYuZGV2bWlub3IgPSAwICAgICAgICMgZGV2aWNlIG1pbm9yIG51bWJlcgoKICAgICAgICBzZWxmLm9mZnNldCA9IDAgICAgICAgICAjIHRoZSB0YXIgaGVhZGVyIHN0YXJ0cyBoZXJlCiAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IDAgICAgIyB0aGUgZmlsZSdzIGRhdGEgc3RhcnRzIGhlcmUKCiAgICAgICAgc2VsZi5zcGFyc2UgPSBOb25lICAgICAgIyBzcGFyc2UgbWVtYmVyIGluZm9ybWF0aW9uCiAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9ICAgIyBwYXggaGVhZGVyIGluZm9ybWF0aW9uCgogICAgIyBJbiBwYXggaGVhZGVycyB0aGUgIm5hbWUiIGFuZCAibGlua25hbWUiIGZpZWxkIGFyZSBjYWxsZWQKICAgICMgInBhdGgiIGFuZCAibGlua3BhdGgiLgogICAgZGVmIF9nZXRwYXRoKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLm5hbWUKICAgIGRlZiBfc2V0cGF0aChzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICBwYXRoID0gcHJvcGVydHkoX2dldHBhdGgsIF9zZXRwYXRoKQoKICAgIGRlZiBfZ2V0bGlua3BhdGgoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYubGlua25hbWUKICAgIGRlZiBfc2V0bGlua3BhdGgoc2VsZiwgbGlua25hbWUpOgogICAgICAgIHNlbGYubGlua25hbWUgPSBsaW5rbmFtZQogICAgbGlua3BhdGggPSBwcm9wZXJ0eShfZ2V0bGlua3BhdGgsIF9zZXRsaW5rcGF0aCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8JXMgJXIgYXQgJSN4PiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sc2VsZi5uYW1lLGlkKHNlbGYpKQoKICAgIGRlZiBnZXRfaW5mbyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIFRhckluZm8ncyBhdHRyaWJ1dGVzIGFzIGEgZGljdGlvbmFyeS4KICAgICAgICAiIiIKICAgICAgICBpbmZvID0gewogICAgICAgICAgICAibmFtZSI6ICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICJtb2RlIjogICAgIHNlbGYubW9kZSAmIDBvNzc3NywKICAgICAgICAgICAgInVpZCI6ICAgICAgc2VsZi51aWQsCiAgICAgICAgICAgICJnaWQiOiAgICAgIHNlbGYuZ2lkLAogICAgICAgICAgICAic2l6ZSI6ICAgICBzZWxmLnNpemUsCiAgICAgICAgICAgICJtdGltZSI6ICAgIHNlbGYubXRpbWUsCiAgICAgICAgICAgICJjaGtzdW0iOiAgIHNlbGYuY2hrc3VtLAogICAgICAgICAgICAidHlwZSI6ICAgICBzZWxmLnR5cGUsCiAgICAgICAgICAgICJsaW5rbmFtZSI6IHNlbGYubGlua25hbWUsCiAgICAgICAgICAgICJ1bmFtZSI6ICAgIHNlbGYudW5hbWUsCiAgICAgICAgICAgICJnbmFtZSI6ICAgIHNlbGYuZ25hbWUsCiAgICAgICAgICAgICJkZXZtYWpvciI6IHNlbGYuZGV2bWFqb3IsCiAgICAgICAgICAgICJkZXZtaW5vciI6IHNlbGYuZGV2bWlub3IKICAgICAgICB9CgogICAgICAgIGlmIGluZm9bInR5cGUiXSA9PSBESVJUWVBFIGFuZCBub3QgaW5mb1sibmFtZSJdLmVuZHN3aXRoKCIvIik6CiAgICAgICAgICAgIGluZm9bIm5hbWUiXSArPSAiLyIKCiAgICAgICAgcmV0dXJuIGluZm8KCiAgICBkZWYgdG9idWYoc2VsZiwgZm9ybWF0PURFRkFVTFRfRk9STUFULCBlbmNvZGluZz1FTkNPRElORywgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiKToKICAgICAgICAiIiJSZXR1cm4gYSB0YXIgaGVhZGVyIGFzIGEgc3RyaW5nIG9mIDUxMiBieXRlIGJsb2Nrcy4KICAgICAgICAiIiIKICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCgogICAgICAgIGlmIGZvcm1hdCA9PSBVU1RBUl9GT1JNQVQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV91c3Rhcl9oZWFkZXIoaW5mbywgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBlbGlmIGZvcm1hdCA9PSBHTlVfRk9STUFUOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVfZ251X2hlYWRlcihpbmZvLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIGVsaWYgZm9ybWF0ID09IFBBWF9GT1JNQVQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9wYXhfaGVhZGVyKGluZm8sIGVuY29kaW5nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgZm9ybWF0IikKCiAgICBkZWYgY3JlYXRlX3VzdGFyX2hlYWRlcihzZWxmLCBpbmZvLCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHVzdGFyIGhlYWRlciBibG9jay4KICAgICAgICAiIiIKICAgICAgICBpbmZvWyJtYWdpYyJdID0gUE9TSVhfTUFHSUMKCiAgICAgICAgaWYgbGVuKGluZm9bImxpbmtuYW1lIl0pID4gTEVOR1RIX0xJTks6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxpbmtuYW1lIGlzIHRvbyBsb25nIikKCiAgICAgICAgaWYgbGVuKGluZm9bIm5hbWUiXSkgPiBMRU5HVEhfTkFNRToKICAgICAgICAgICAgaW5mb1sicHJlZml4Il0sIGluZm9bIm5hbWUiXSA9IHNlbGYuX3Bvc2l4X3NwbGl0X25hbWUoaW5mb1sibmFtZSJdKQoKICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQsIGVuY29kaW5nLCBlcnJvcnMpCgogICAgZGVmIGNyZWF0ZV9nbnVfaGVhZGVyKHNlbGYsIGluZm8sIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgR05VIGhlYWRlciBibG9jayBzZXF1ZW5jZS4KICAgICAgICAiIiIKICAgICAgICBpbmZvWyJtYWdpYyJdID0gR05VX01BR0lDCgogICAgICAgIGJ1ZiA9IGIiIgogICAgICAgIGlmIGxlbihpbmZvWyJsaW5rbmFtZSJdKSA+IExFTkdUSF9MSU5LOgogICAgICAgICAgICBidWYgKz0gc2VsZi5fY3JlYXRlX2dudV9sb25nX2hlYWRlcihpbmZvWyJsaW5rbmFtZSJdLCBHTlVUWVBFX0xPTkdMSU5LLCBlbmNvZGluZywgZXJyb3JzKQoKICAgICAgICBpZiBsZW4oaW5mb1sibmFtZSJdKSA+IExFTkdUSF9OQU1FOgogICAgICAgICAgICBidWYgKz0gc2VsZi5fY3JlYXRlX2dudV9sb25nX2hlYWRlcihpbmZvWyJuYW1lIl0sIEdOVVRZUEVfTE9OR05BTUUsIGVuY29kaW5nLCBlcnJvcnMpCgogICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIEdOVV9GT1JNQVQsIGVuY29kaW5nLCBlcnJvcnMpCgogICAgZGVmIGNyZWF0ZV9wYXhfaGVhZGVyKHNlbGYsIGluZm8sIGVuY29kaW5nKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHVzdGFyIGhlYWRlciBibG9jay4gSWYgaXQgY2Fubm90IGJlCiAgICAgICAgICAgcmVwcmVzZW50ZWQgdGhpcyB3YXksIHByZXBlbmQgYSBwYXggZXh0ZW5kZWQgaGVhZGVyIHNlcXVlbmNlCiAgICAgICAgICAgd2l0aCBzdXBwbGVtZW50IGluZm9ybWF0aW9uLgogICAgICAgICIiIgogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQwogICAgICAgIHBheF9oZWFkZXJzID0gc2VsZi5wYXhfaGVhZGVycy5jb3B5KCkKCiAgICAgICAgIyBUZXN0IHN0cmluZyBmaWVsZHMgZm9yIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZmllbGQgbGVuZ3RoIG9yIGNhbm5vdAogICAgICAgICMgYmUgcmVwcmVzZW50ZWQgaW4gQVNDSUkgZW5jb2RpbmcuCiAgICAgICAgZm9yIG5hbWUsIGhuYW1lLCBsZW5ndGggaW4gKAogICAgICAgICAgICAgICAgKCJuYW1lIiwgInBhdGgiLCBMRU5HVEhfTkFNRSksICgibGlua25hbWUiLCAibGlua3BhdGgiLCBMRU5HVEhfTElOSyksCiAgICAgICAgICAgICAgICAoInVuYW1lIiwgInVuYW1lIiwgMzIpLCAoImduYW1lIiwgImduYW1lIiwgMzIpKToKCiAgICAgICAgICAgIGlmIGhuYW1lIGluIHBheF9oZWFkZXJzOgogICAgICAgICAgICAgICAgIyBUaGUgcGF4IGhlYWRlciBoYXMgcHJpb3JpdHkuCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBUcnkgdG8gZW5jb2RlIHRoZSBzdHJpbmcgYXMgQVNDSUkuCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGluZm9bbmFtZV0uZW5jb2RlKCJhc2NpaSIsICJzdHJpY3QiKQogICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gaW5mb1tuYW1lXQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIGxlbihpbmZvW25hbWVdKSA+IGxlbmd0aDoKICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IGluZm9bbmFtZV0KCiAgICAgICAgIyBUZXN0IG51bWJlciBmaWVsZHMgZm9yIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZmllbGQgbGltaXQgb3IgdmFsdWVzCiAgICAgICAgIyB0aGF0IGxpa2UgdG8gYmUgc3RvcmVkIGFzIGZsb2F0LgogICAgICAgIGZvciBuYW1lLCBkaWdpdHMgaW4gKCgidWlkIiwgOCksICgiZ2lkIiwgOCksICgic2l6ZSIsIDEyKSwgKCJtdGltZSIsIDEyKSk6CiAgICAgICAgICAgIGlmIG5hbWUgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICAgICAjIFRoZSBwYXggaGVhZGVyIGhhcyBwcmlvcml0eS4gQXZvaWQgb3ZlcmZsb3cuCiAgICAgICAgICAgICAgICBpbmZvW25hbWVdID0gMAogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHZhbCA9IGluZm9bbmFtZV0KICAgICAgICAgICAgaWYgbm90IDAgPD0gdmFsIDwgOCAqKiAoZGlnaXRzIC0gMSkgb3IgaXNpbnN0YW5jZSh2YWwsIGZsb2F0KToKICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW25hbWVdID0gc3RyKHZhbCkKICAgICAgICAgICAgICAgIGluZm9bbmFtZV0gPSAwCgogICAgICAgICMgQ3JlYXRlIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBpZiBuZWNlc3NhcnkuCiAgICAgICAgaWYgcGF4X2hlYWRlcnM6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIocGF4X2hlYWRlcnMsIFhIRFRZUEUsIGVuY29kaW5nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ1ZiA9IGIiIgoKICAgICAgICByZXR1cm4gYnVmICsgc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQsICJhc2NpaSIsICJyZXBsYWNlIikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBjcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoY2xzLCBwYXhfaGVhZGVycyk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSBwYXggZ2xvYmFsIGhlYWRlciBibG9jayBzZXF1ZW5jZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKHBheF9oZWFkZXJzLCBYR0xUWVBFLCAidXRmOCIpCgogICAgZGVmIF9wb3NpeF9zcGxpdF9uYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlNwbGl0IGEgbmFtZSBsb25nZXIgdGhhbiAxMDAgY2hhcnMgaW50byBhIHByZWZpeAogICAgICAgICAgIGFuZCBhIG5hbWUgcGFydC4KICAgICAgICAiIiIKICAgICAgICBwcmVmaXggPSBuYW1lWzpMRU5HVEhfUFJFRklYICsgMV0KICAgICAgICB3aGlsZSBwcmVmaXggYW5kIHByZWZpeFstMV0gIT0gIi8iOgogICAgICAgICAgICBwcmVmaXggPSBwcmVmaXhbOi0xXQoKICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCiAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KCiAgICAgICAgaWYgbm90IHByZWZpeCBvciBsZW4obmFtZSkgPiBMRU5HVEhfTkFNRToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibmFtZSBpcyB0b28gbG9uZyIpCiAgICAgICAgcmV0dXJuIHByZWZpeCwgbmFtZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY3JlYXRlX2hlYWRlcihpbmZvLCBmb3JtYXQsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIlJldHVybiBhIGhlYWRlciBibG9jay4gaW5mbyBpcyBhIGRpY3Rpb25hcnkgd2l0aCBmaWxlCiAgICAgICAgICAgaW5mb3JtYXRpb24sIGZvcm1hdCBtdXN0IGJlIG9uZSBvZiB0aGUgKl9GT1JNQVQgY29uc3RhbnRzLgogICAgICAgICIiIgogICAgICAgIHBhcnRzID0gWwogICAgICAgICAgICBzdG4oaW5mby5nZXQoIm5hbWUiLCAiIiksIDEwMCwgZW5jb2RpbmcsIGVycm9ycyksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgibW9kZSIsIDApICYgMG83Nzc3LCA4LCBmb3JtYXQpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoInVpZCIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoImdpZCIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoInNpemUiLCAwKSwgMTIsIGZvcm1hdCksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgibXRpbWUiLCAwKSwgMTIsIGZvcm1hdCksCiAgICAgICAgICAgIGIiICAgICAgICAiLCAjIGNoZWNrc3VtIGZpZWxkCiAgICAgICAgICAgIGluZm8uZ2V0KCJ0eXBlIiwgUkVHVFlQRSksCiAgICAgICAgICAgIHN0bihpbmZvLmdldCgibGlua25hbWUiLCAiIiksIDEwMCwgZW5jb2RpbmcsIGVycm9ycyksCiAgICAgICAgICAgIGluZm8uZ2V0KCJtYWdpYyIsIFBPU0lYX01BR0lDKSwKICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJ1bmFtZSIsICIiKSwgMzIsIGVuY29kaW5nLCBlcnJvcnMpLAogICAgICAgICAgICBzdG4oaW5mby5nZXQoImduYW1lIiwgIiIpLCAzMiwgZW5jb2RpbmcsIGVycm9ycyksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgiZGV2bWFqb3IiLCAwKSwgOCwgZm9ybWF0KSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtaW5vciIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICBzdG4oaW5mby5nZXQoInByZWZpeCIsICIiKSwgMTU1LCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIF0KCiAgICAgICAgYnVmID0gc3RydWN0LnBhY2soIiVkcyIgJSBCTE9DS1NJWkUsIGIiIi5qb2luKHBhcnRzKSkKICAgICAgICBjaGtzdW0gPSBjYWxjX2Noa3N1bXMoYnVmWy1CTE9DS1NJWkU6XSlbMF0KICAgICAgICBidWYgPSBidWZbOi0zNjRdICsgKCIlMDZvXDAiICUgY2hrc3VtKS5lbmNvZGUoImFzY2lpIikgKyBidWZbLTM1NzpdCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY3JlYXRlX3BheWxvYWQocGF5bG9hZCk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJpbmcgcGF5bG9hZCBmaWxsZWQgd2l0aCB6ZXJvIGJ5dGVzCiAgICAgICAgICAgdXAgdG8gdGhlIG5leHQgNTEyIGJ5dGUgYm9yZGVyLgogICAgICAgICIiIgogICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbihwYXlsb2FkKSwgQkxPQ0tTSVpFKQogICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CiAgICAgICAgICAgIHBheWxvYWQgKz0gKEJMT0NLU0laRSAtIHJlbWFpbmRlcikgKiBOVUwKICAgICAgICByZXR1cm4gcGF5bG9hZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGNscywgbmFtZSwgdHlwZSwgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiUmV0dXJuIGEgR05VVFlQRV9MT05HTkFNRSBvciBHTlVUWVBFX0xPTkdMSU5LIHNlcXVlbmNlCiAgICAgICAgICAgZm9yIG5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSA9IG5hbWUuZW5jb2RlKGVuY29kaW5nLCBlcnJvcnMpICsgTlVMCgogICAgICAgIGluZm8gPSB7fQogICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQExvbmdMaW5rIgogICAgICAgIGluZm9bInR5cGUiXSA9IHR5cGUKICAgICAgICBpbmZvWyJzaXplIl0gPSBsZW4obmFtZSkKICAgICAgICBpbmZvWyJtYWdpYyJdID0gR05VX01BR0lDCgogICAgICAgICMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlciArIG5hbWUgYmxvY2tzLgogICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFULCBlbmNvZGluZywgZXJyb3JzKSArIFwKICAgICAgICAgICAgICAgIGNscy5fY3JlYXRlX3BheWxvYWQobmFtZSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfY3JlYXRlX3BheF9nZW5lcmljX2hlYWRlcihjbHMsIHBheF9oZWFkZXJzLCB0eXBlLCBlbmNvZGluZyk6CiAgICAgICAgIiIiUmV0dXJuIGEgUE9TSVguMS0yMDA4IGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgc2VxdWVuY2UKICAgICAgICAgICB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBrZXl3b3JkLCB2YWx1ZSBwYWlycy4gVGhlIHZhbHVlcwogICAgICAgICAgIG11c3QgYmUgc3RyaW5ncy4KICAgICAgICAiIiIKICAgICAgICAjIENoZWNrIGlmIG9uZSBvZiB0aGUgZmllbGRzIGNvbnRhaW5zIHN1cnJvZ2F0ZSBjaGFyYWN0ZXJzIGFuZCB0aGVyZWJ5CiAgICAgICAgIyBmb3JjZXMgaGRyY2hhcnNldD1CSU5BUlksIHNlZSBfcHJvY19wYXgoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICBiaW5hcnkgPSBGYWxzZQogICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2YWx1ZS5lbmNvZGUoInV0ZjgiLCAic3RyaWN0IikKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgICAgIGJpbmFyeSA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHJlY29yZHMgPSBiIiIKICAgICAgICBpZiBiaW5hcnk6CiAgICAgICAgICAgICMgUHV0IHRoZSBoZHJjaGFyc2V0IGZpZWxkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlYWRlci4KICAgICAgICAgICAgcmVjb3JkcyArPSBiIjIxIGhkcmNoYXJzZXQ9QklOQVJZXG4iCgogICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICBrZXl3b3JkID0ga2V5d29yZC5lbmNvZGUoInV0ZjgiKQogICAgICAgICAgICBpZiBiaW5hcnk6CiAgICAgICAgICAgICAgICAjIFRyeSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBieXRlIHJlcHJlc2VudGF0aW9uIG9mIGB2YWx1ZScuCiAgICAgICAgICAgICAgICAjIE5lZWRsZXNzIHRvIHNheSwgdGhhdCB0aGUgZW5jb2RpbmcgbXVzdCBtYXRjaCB0aGUgc3RyaW5nLgogICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5lbmNvZGUoZW5jb2RpbmcsICJzdXJyb2dhdGVlc2NhcGUiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5lbmNvZGUoInV0ZjgiKQoKICAgICAgICAgICAgbCA9IGxlbihrZXl3b3JkKSArIGxlbih2YWx1ZSkgKyAzICAgIyAnICcgKyAnPScgKyAnXG4nCiAgICAgICAgICAgIG4gPSBwID0gMAogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgbiA9IGwgKyBsZW4oc3RyKHApKQogICAgICAgICAgICAgICAgaWYgbiA9PSBwOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBwID0gbgogICAgICAgICAgICByZWNvcmRzICs9IGJ5dGVzKHN0cihwKSwgImFzY2lpIikgKyBiIiAiICsga2V5d29yZCArIGIiPSIgKyB2YWx1ZSArIGIiXG4iCgogICAgICAgICMgV2UgdXNlIGEgaGFyZGNvZGVkICIuLy4vQFBheEhlYWRlciIgbmFtZSBsaWtlIHN0YXIgZG9lcwogICAgICAgICMgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgUE9TSVggcmVjb21tZW5kcy4KICAgICAgICBpbmZvID0ge30KICAgICAgICBpbmZvWyJuYW1lIl0gPSAiLi8uL0BQYXhIZWFkZXIiCiAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQogICAgICAgIGluZm9bInNpemUiXSA9IGxlbihyZWNvcmRzKQogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQwoKICAgICAgICAjIENyZWF0ZSBwYXggaGVhZGVyICsgcmVjb3JkIGJsb2Nrcy4KICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCwgImFzY2lpIiwgInJlcGxhY2UiKSArIFwKICAgICAgICAgICAgICAgIGNscy5fY3JlYXRlX3BheWxvYWQocmVjb3JkcykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tYnVmKGNscywgYnVmLCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJbmZvIG9iamVjdCBmcm9tIGEgNTEyIGJ5dGUgYnl0ZXMgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihidWYpID09IDA6CiAgICAgICAgICAgIHJhaXNlIEVtcHR5SGVhZGVyRXJyb3IoImVtcHR5IGhlYWRlciIpCiAgICAgICAgaWYgbGVuKGJ1ZikgIT0gQkxPQ0tTSVpFOgogICAgICAgICAgICByYWlzZSBUcnVuY2F0ZWRIZWFkZXJFcnJvcigidHJ1bmNhdGVkIGhlYWRlciIpCiAgICAgICAgaWYgYnVmLmNvdW50KE5VTCkgPT0gQkxPQ0tTSVpFOgogICAgICAgICAgICByYWlzZSBFT0ZIZWFkZXJFcnJvcigiZW5kIG9mIGZpbGUgaGVhZGVyIikKCiAgICAgICAgY2hrc3VtID0gbnRpKGJ1ZlsxNDg6MTU2XSkKICAgICAgICBpZiBjaGtzdW0gbm90IGluIGNhbGNfY2hrc3VtcyhidWYpOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyRXJyb3IoImJhZCBjaGVja3N1bSIpCgogICAgICAgIG9iaiA9IGNscygpCiAgICAgICAgb2JqLm5hbWUgPSBudHMoYnVmWzA6MTAwXSwgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBvYmoubW9kZSA9IG50aShidWZbMTAwOjEwOF0pCiAgICAgICAgb2JqLnVpZCA9IG50aShidWZbMTA4OjExNl0pCiAgICAgICAgb2JqLmdpZCA9IG50aShidWZbMTE2OjEyNF0pCiAgICAgICAgb2JqLnNpemUgPSBudGkoYnVmWzEyNDoxMzZdKQogICAgICAgIG9iai5tdGltZSA9IG50aShidWZbMTM2OjE0OF0pCiAgICAgICAgb2JqLmNoa3N1bSA9IGNoa3N1bQogICAgICAgIG9iai50eXBlID0gYnVmWzE1NjoxNTddCiAgICAgICAgb2JqLmxpbmtuYW1lID0gbnRzKGJ1ZlsxNTc6MjU3XSwgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBvYmoudW5hbWUgPSBudHMoYnVmWzI2NToyOTddLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIG9iai5nbmFtZSA9IG50cyhidWZbMjk3OjMyOV0sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgb2JqLmRldm1ham9yID0gbnRpKGJ1ZlszMjk6MzM3XSkKICAgICAgICBvYmouZGV2bWlub3IgPSBudGkoYnVmWzMzNzozNDVdKQogICAgICAgIHByZWZpeCA9IG50cyhidWZbMzQ1OjUwMF0sIGVuY29kaW5nLCBlcnJvcnMpCgogICAgICAgICMgT2xkIFY3IHRhciBmb3JtYXQgcmVwcmVzZW50cyBhIGRpcmVjdG9yeSBhcyBhIHJlZ3VsYXIKICAgICAgICAjIGZpbGUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgogICAgICAgIGlmIG9iai50eXBlID09IEFSRUdUWVBFIGFuZCBvYmoubmFtZS5lbmRzd2l0aCgiLyIpOgogICAgICAgICAgICBvYmoudHlwZSA9IERJUlRZUEUKCiAgICAgICAgIyBUaGUgb2xkIEdOVSBzcGFyc2UgZm9ybWF0IG9jY3VwaWVzIHNvbWUgb2YgdGhlIHVudXNlZAogICAgICAgICMgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgdXAgdG8gNCBzcGFyc2Ugc3RydWN0dXJlcy4KICAgICAgICAjIFNhdmUgdGhlIHRoZW0gZm9yIGxhdGVyIHByb2Nlc3NpbmcgaW4gX3Byb2Nfc3BhcnNlKCkuCiAgICAgICAgaWYgb2JqLnR5cGUgPT0gR05VVFlQRV9TUEFSU0U6CiAgICAgICAgICAgIHBvcyA9IDM4NgogICAgICAgICAgICBzdHJ1Y3RzID0gW10KICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQogICAgICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgc3RydWN0cy5hcHBlbmQoKG9mZnNldCwgbnVtYnl0ZXMpKQogICAgICAgICAgICAgICAgcG9zICs9IDI0CiAgICAgICAgICAgIGlzZXh0ZW5kZWQgPSBib29sKGJ1Zls0ODJdKQogICAgICAgICAgICBvcmlnc2l6ZSA9IG50aShidWZbNDgzOjQ5NV0pCiAgICAgICAgICAgIG9iai5fc3BhcnNlX3N0cnVjdHMgPSAoc3RydWN0cywgaXNleHRlbmRlZCwgb3JpZ3NpemUpCgogICAgICAgICMgUmVtb3ZlIHJlZHVuZGFudCBzbGFzaGVzIGZyb20gZGlyZWN0b3JpZXMuCiAgICAgICAgaWYgb2JqLmlzZGlyKCk6CiAgICAgICAgICAgIG9iai5uYW1lID0gb2JqLm5hbWUucnN0cmlwKCIvIikKCiAgICAgICAgIyBSZWNvbnN0cnVjdCBhIHVzdGFyIGxvbmduYW1lLgogICAgICAgIGlmIHByZWZpeCBhbmQgb2JqLnR5cGUgbm90IGluIEdOVV9UWVBFUzoKICAgICAgICAgICAgb2JqLm5hbWUgPSBwcmVmaXggKyAiLyIgKyBvYmoubmFtZQogICAgICAgIHJldHVybiBvYmoKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tdGFyZmlsZShjbHMsIHRhcmZpbGUpOgogICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBUYXJJbmZvIG9iamVjdCBmcm9tIFRhckZpbGUgb2JqZWN0CiAgICAgICAgICAgdGFyZmlsZS4KICAgICAgICAiIiIKICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCiAgICAgICAgb2JqID0gY2xzLmZyb21idWYoYnVmLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKICAgICAgICBvYmoub2Zmc2V0ID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKSAtIEJMT0NLU0laRQogICAgICAgIHJldHVybiBvYmouX3Byb2NfbWVtYmVyKHRhcmZpbGUpCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhCiAgICAjIG1lbWJlci4gVGhlIGVudHJ5IHBvaW50IGlzIF9wcm9jX21lbWJlcigpIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGluIGEKICAgICMgc3ViY2xhc3MgdG8gYWRkIGN1c3RvbSBfcHJvY18qKCkgbWV0aG9kcy4gQSBfcHJvY18qKCkgbWV0aG9kIE1VU1QKICAgICMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKICAgICMgb3BlcmF0aW9uczoKICAgICMgMS4gU2V0IHNlbGYub2Zmc2V0X2RhdGEgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBiZWdpbiwKICAgICMgICAgaWYgdGhlcmUgaXMgZGF0YSB0aGF0IGZvbGxvd3MuCiAgICAjIDIuIFNldCB0YXJmaWxlLm9mZnNldCB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG5leHQgbWVtYmVyJ3MgaGVhZGVyIHdpbGwKICAgICMgICAgYmVnaW4uCiAgICAjIDMuIFJldHVybiBzZWxmIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCiAgICBkZWYgX3Byb2NfbWVtYmVyKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIkNob29zZSB0aGUgcmlnaHQgcHJvY2Vzc2luZyBtZXRob2QgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgdGhlIHR5cGUgYW5kIGNhbGwgaXQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi50eXBlIGluIChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfZ251bG9uZyh0YXJmaWxlKQogICAgICAgIGVsaWYgc2VsZi50eXBlID09IEdOVVRZUEVfU1BBUlNFOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19zcGFyc2UodGFyZmlsZSkKICAgICAgICBlbGlmIHNlbGYudHlwZSBpbiAoWEhEVFlQRSwgWEdMVFlQRSwgU09MQVJJU19YSERUWVBFKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfcGF4KHRhcmZpbGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfYnVpbHRpbih0YXJmaWxlKQoKICAgIGRlZiBfcHJvY19idWlsdGluKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgYSBidWlsdGluIHR5cGUgb3IgYW4gdW5rbm93biB0eXBlIHdoaWNoCiAgICAgICAgICAgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBmaWxlLgogICAgICAgICIiIgogICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCiAgICAgICAgb2Zmc2V0ID0gc2VsZi5vZmZzZXRfZGF0YQogICAgICAgIGlmIHNlbGYuaXNyZWcoKSBvciBzZWxmLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCiAgICAgICAgICAgIG9mZnNldCArPSBzZWxmLl9ibG9jayhzZWxmLnNpemUpCiAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBvZmZzZXQKCiAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aCBzYXZlZCBnbG9iYWwKICAgICAgICAjIGhlYWRlciBpbmZvcm1hdGlvbi4KICAgICAgICBzZWxmLl9hcHBseV9wYXhfaW5mbyh0YXJmaWxlLnBheF9oZWFkZXJzLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX3Byb2NfZ251bG9uZyhzZWxmLCB0YXJmaWxlKToKICAgICAgICAiIiJQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBob2xkIGEgR05VIGxvbmduYW1lCiAgICAgICAgICAgb3IgbG9uZ2xpbmsgbWVtYmVyLgogICAgICAgICIiIgogICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkpCgogICAgICAgICMgRmV0Y2ggdGhlIG5leHQgaGVhZGVyIGFuZCBwcm9jZXNzIGl0LgogICAgICAgIHRyeToKICAgICAgICAgICAgbmV4dCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKICAgICAgICBleGNlcHQgSGVhZGVyRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFN1YnNlcXVlbnRIZWFkZXJFcnJvcigibWlzc2luZyBvciBiYWQgc3Vic2VxdWVudCBoZWFkZXIiKQoKICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCBmcm9tIHRoZSBuZXh0IGhlYWRlciB3aXRoCiAgICAgICAgIyB0aGUgbG9uZ25hbWUgaW5mb3JtYXRpb24uCiAgICAgICAgbmV4dC5vZmZzZXQgPSBzZWxmLm9mZnNldAogICAgICAgIGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX0xPTkdOQU1FOgogICAgICAgICAgICBuZXh0Lm5hbWUgPSBudHMoYnVmLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX0xPTkdMSU5LOgogICAgICAgICAgICBuZXh0LmxpbmtuYW1lID0gbnRzKGJ1ZiwgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCgogICAgICAgIHJldHVybiBuZXh0CgogICAgZGVmIF9wcm9jX3NwYXJzZShzZWxmLCB0YXJmaWxlKToKICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHNwYXJzZSBoZWFkZXIgcGx1cyBleHRyYSBoZWFkZXJzLgogICAgICAgICIiIgogICAgICAgICMgV2UgYWxyZWFkeSBjb2xsZWN0ZWQgc29tZSBzcGFyc2Ugc3RydWN0dXJlcyBpbiBmcm9tYnVmKCkuCiAgICAgICAgc3RydWN0cywgaXNleHRlbmRlZCwgb3JpZ3NpemUgPSBzZWxmLl9zcGFyc2Vfc3RydWN0cwogICAgICAgIGRlbCBzZWxmLl9zcGFyc2Vfc3RydWN0cwoKICAgICAgICAjIENvbGxlY3Qgc3BhcnNlIHN0cnVjdHVyZXMgZnJvbSBleHRlbmRlZCBoZWFkZXIgYmxvY2tzLgogICAgICAgIHdoaWxlIGlzZXh0ZW5kZWQ6CiAgICAgICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKICAgICAgICAgICAgcG9zID0gMAogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyMSk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQogICAgICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGFuZCBudW1ieXRlczoKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RzLmFwcGVuZCgob2Zmc2V0LCBudW1ieXRlcykpCiAgICAgICAgICAgICAgICBwb3MgKz0gMjQKICAgICAgICAgICAgaXNleHRlbmRlZCA9IGJvb2woYnVmWzUwNF0pCiAgICAgICAgc2VsZi5zcGFyc2UgPSBzdHJ1Y3RzCgogICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCiAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBzZWxmLm9mZnNldF9kYXRhICsgc2VsZi5fYmxvY2soc2VsZi5zaXplKQogICAgICAgIHNlbGYuc2l6ZSA9IG9yaWdzaXplCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX3Byb2NfcGF4KHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgYW4gZXh0ZW5kZWQgb3IgZ2xvYmFsIGhlYWRlciBhcyBkZXNjcmliZWQgaW4KICAgICAgICAgICBQT1NJWC4xLTIwMDguCiAgICAgICAgIiIiCiAgICAgICAgIyBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24uCiAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoc2VsZi5fYmxvY2soc2VsZi5zaXplKSkKCiAgICAgICAgIyBBIHBheCBoZWFkZXIgc3RvcmVzIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbiBmb3IgZWl0aGVyCiAgICAgICAgIyB0aGUgZm9sbG93aW5nIGZpbGUgKGV4dGVuZGVkKSBvciBhbGwgZm9sbG93aW5nIGZpbGVzCiAgICAgICAgIyAoZ2xvYmFsKS4KICAgICAgICBpZiBzZWxmLnR5cGUgPT0gWEdMVFlQRToKICAgICAgICAgICAgcGF4X2hlYWRlcnMgPSB0YXJmaWxlLnBheF9oZWFkZXJzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF4X2hlYWRlcnMgPSB0YXJmaWxlLnBheF9oZWFkZXJzLmNvcHkoKQoKICAgICAgICAjIENoZWNrIGlmIHRoZSBwYXggaGVhZGVyIGNvbnRhaW5zIGEgaGRyY2hhcnNldCBmaWVsZC4gVGhpcyB0ZWxscyB1cwogICAgICAgICMgdGhlIGVuY29kaW5nIG9mIHRoZSBwYXRoLCBsaW5rcGF0aCwgdW5hbWUgYW5kIGduYW1lIGZpZWxkcy4gTm9ybWFsbHksCiAgICAgICAgIyB0aGVzZSBmaWVsZHMgYXJlIFVURi04IGVuY29kZWQgYnV0IHNpbmNlIFBPU0lYLjEtMjAwOCB0YXIKICAgICAgICAjIGltcGxlbWVudGF0aW9ucyBhcmUgYWxsb3dlZCB0byBzdG9yZSB0aGVtIGFzIHJhdyBiaW5hcnkgc3RyaW5ncyBpZgogICAgICAgICMgdGhlIHRyYW5zbGF0aW9uIHRvIFVURi04IGZhaWxzLgogICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKGJyIlxkKyBoZHJjaGFyc2V0PShbXlxuXSspXG4iLCBidWYpCiAgICAgICAgaWYgbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBheF9oZWFkZXJzWyJoZHJjaGFyc2V0Il0gPSBtYXRjaC5ncm91cCgxKS5kZWNvZGUoInV0ZjgiKQoKICAgICAgICAjIEZvciB0aGUgdGltZSBiZWluZywgd2UgZG9uJ3QgY2FyZSBhYm91dCBhbnl0aGluZyBvdGhlciB0aGFuICJCSU5BUlkiLgogICAgICAgICMgVGhlIG9ubHkgb3RoZXIgdmFsdWUgdGhhdCBpcyBjdXJyZW50bHkgYWxsb3dlZCBieSB0aGUgc3RhbmRhcmQgaXMKICAgICAgICAjICJJU08tSVIgMTA2NDYgMjAwMCBVVEYtOCIgaW4gb3RoZXIgd29yZHMgVVRGLTguCiAgICAgICAgaGRyY2hhcnNldCA9IHBheF9oZWFkZXJzLmdldCgiaGRyY2hhcnNldCIpCiAgICAgICAgaWYgaGRyY2hhcnNldCA9PSAiQklOQVJZIjoKICAgICAgICAgICAgZW5jb2RpbmcgPSB0YXJmaWxlLmVuY29kaW5nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW5jb2RpbmcgPSAidXRmOCIKCiAgICAgICAgIyBQYXJzZSBwYXggaGVhZGVyIGluZm9ybWF0aW9uLiBBIHJlY29yZCBsb29rcyBsaWtlIHRoYXQ6CiAgICAgICAgIyAiJWQgJXM9JXNcbiIgJSAobGVuZ3RoLCBrZXl3b3JkLCB2YWx1ZSkuIGxlbmd0aCBpcyB0aGUgc2l6ZQogICAgICAgICMgb2YgdGhlIGNvbXBsZXRlIHJlY29yZCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYgYW5kCiAgICAgICAgIyB0aGUgbmV3bGluZS4ga2V5d29yZCBhbmQgdmFsdWUgYXJlIGJvdGggVVRGLTggZW5jb2RlZCBzdHJpbmdzLgogICAgICAgIHJlZ2V4ID0gcmUuY29tcGlsZShiciIoXGQrKSAoW149XSspPSIpCiAgICAgICAgcG9zID0gMAogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIG1hdGNoID0gcmVnZXgubWF0Y2goYnVmLCBwb3MpCiAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICBsZW5ndGgsIGtleXdvcmQgPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICBsZW5ndGggPSBpbnQobGVuZ3RoKQogICAgICAgICAgICB2YWx1ZSA9IGJ1ZlttYXRjaC5lbmQoMikgKyAxOm1hdGNoLnN0YXJ0KDEpICsgbGVuZ3RoIC0gMV0KCiAgICAgICAgICAgICMgTm9ybWFsbHksIHdlIGNvdWxkIGp1c3QgdXNlICJ1dGY4IiBhcyB0aGUgZW5jb2RpbmcgYW5kICJzdHJpY3QiCiAgICAgICAgICAgICMgYXMgdGhlIGVycm9yIGhhbmRsZXIsIGJ1dCB3ZSBiZXR0ZXIgbm90IHRha2UgdGhlIHJpc2suIEZvcgogICAgICAgICAgICAjIGV4YW1wbGUsIEdOVSB0YXIgPD0gMS4yMyBpcyBrbm93biB0byBzdG9yZSBmaWxlbmFtZXMgaXQgY2Fubm90CiAgICAgICAgICAgICMgdHJhbnNsYXRlIHRvIFVURi04IGFzIHJhdyBzdHJpbmdzICh1bmZvcnR1bmF0ZWx5IHdpdGhvdXQgYQogICAgICAgICAgICAjIGhkcmNoYXJzZXQ9QklOQVJZIGhlYWRlcikuCiAgICAgICAgICAgICMgV2UgZmlyc3QgdHJ5IHRoZSBzdHJpY3Qgc3RhbmRhcmQgZW5jb2RpbmcsIGFuZCBpZiB0aGF0IGZhaWxzIHdlCiAgICAgICAgICAgICMgZmFsbCBiYWNrIG9uIHRoZSB1c2VyJ3MgZW5jb2RpbmcgYW5kIGVycm9yIGhhbmRsZXIuCiAgICAgICAgICAgIGtleXdvcmQgPSBzZWxmLl9kZWNvZGVfcGF4X2ZpZWxkKGtleXdvcmQsICJ1dGY4IiwgInV0ZjgiLAogICAgICAgICAgICAgICAgICAgIHRhcmZpbGUuZXJyb3JzKQogICAgICAgICAgICBpZiBrZXl3b3JkIGluIFBBWF9OQU1FX0ZJRUxEUzoKICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZGVjb2RlX3BheF9maWVsZCh2YWx1ZSwgZW5jb2RpbmcsIHRhcmZpbGUuZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmZpbGUuZXJyb3JzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9kZWNvZGVfcGF4X2ZpZWxkKHZhbHVlLCAidXRmOCIsICJ1dGY4IiwKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZmlsZS5lcnJvcnMpCgogICAgICAgICAgICBwYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCiAgICAgICAgICAgIHBvcyArPSBsZW5ndGgKCiAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBuZXh0ID0gc2VsZi5mcm9tdGFyZmlsZSh0YXJmaWxlKQogICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvcjoKICAgICAgICAgICAgcmFpc2UgU3Vic2VxdWVudEhlYWRlckVycm9yKCJtaXNzaW5nIG9yIGJhZCBzdWJzZXF1ZW50IGhlYWRlciIpCgogICAgICAgICMgUHJvY2VzcyBHTlUgc3BhcnNlIGluZm9ybWF0aW9uLgogICAgICAgIGlmICJHTlUuc3BhcnNlLm1hcCIgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICMgR05VIGV4dGVuZGVkIHNwYXJzZSBmb3JtYXQgdmVyc2lvbiAwLjEuCiAgICAgICAgICAgIHNlbGYuX3Byb2NfZ251c3BhcnNlXzAxKG5leHQsIHBheF9oZWFkZXJzKQoKICAgICAgICBlbGlmICJHTlUuc3BhcnNlLnNpemUiIGluIHBheF9oZWFkZXJzOgogICAgICAgICAgICAjIEdOVSBleHRlbmRlZCBzcGFyc2UgZm9ybWF0IHZlcnNpb24gMC4wLgogICAgICAgICAgICBzZWxmLl9wcm9jX2dudXNwYXJzZV8wMChuZXh0LCBwYXhfaGVhZGVycywgYnVmKQoKICAgICAgICBlbGlmIHBheF9oZWFkZXJzLmdldCgiR05VLnNwYXJzZS5tYWpvciIpID09ICIxIiBhbmQgcGF4X2hlYWRlcnMuZ2V0KCJHTlUuc3BhcnNlLm1pbm9yIikgPT0gIjAiOgogICAgICAgICAgICAjIEdOVSBleHRlbmRlZCBzcGFyc2UgZm9ybWF0IHZlcnNpb24gMS4wLgogICAgICAgICAgICBzZWxmLl9wcm9jX2dudXNwYXJzZV8xMChuZXh0LCBwYXhfaGVhZGVycywgdGFyZmlsZSkKCiAgICAgICAgaWYgc2VsZi50eXBlIGluIChYSERUWVBFLCBTT0xBUklTX1hIRFRZUEUpOgogICAgICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHRoZSBleHRlbmRlZCBoZWFkZXIgaW5mby4KICAgICAgICAgICAgbmV4dC5fYXBwbHlfcGF4X2luZm8ocGF4X2hlYWRlcnMsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQogICAgICAgICAgICBuZXh0Lm9mZnNldCA9IHNlbGYub2Zmc2V0CgogICAgICAgICAgICBpZiAic2l6ZSIgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICAgICAjIElmIHRoZSBleHRlbmRlZCBoZWFkZXIgcmVwbGFjZXMgdGhlIHNpemUgZmllbGQsCiAgICAgICAgICAgICAgICAjIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIG9mZnNldCB3aGVyZSB0aGUgbmV4dAogICAgICAgICAgICAgICAgIyBoZWFkZXIgc3RhcnRzLgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dC5vZmZzZXRfZGF0YQogICAgICAgICAgICAgICAgaWYgbmV4dC5pc3JlZygpIG9yIG5leHQudHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgogICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBuZXh0Ll9ibG9jayhuZXh0LnNpemUpCiAgICAgICAgICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAoKICAgICAgICByZXR1cm4gbmV4dAoKICAgIGRlZiBfcHJvY19nbnVzcGFyc2VfMDAoc2VsZiwgbmV4dCwgcGF4X2hlYWRlcnMsIGJ1Zik6CiAgICAgICAgIiIiUHJvY2VzcyBhIEdOVSB0YXIgZXh0ZW5kZWQgc3BhcnNlIGhlYWRlciwgdmVyc2lvbiAwLjAuCiAgICAgICAgIiIiCiAgICAgICAgb2Zmc2V0cyA9IFtdCiAgICAgICAgZm9yIG1hdGNoIGluIHJlLmZpbmRpdGVyKGJyIlxkKyBHTlUuc3BhcnNlLm9mZnNldD0oXGQrKVxuIiwgYnVmKToKICAgICAgICAgICAgb2Zmc2V0cy5hcHBlbmQoaW50KG1hdGNoLmdyb3VwKDEpKSkKICAgICAgICBudW1ieXRlcyA9IFtdCiAgICAgICAgZm9yIG1hdGNoIGluIHJlLmZpbmRpdGVyKGJyIlxkKyBHTlUuc3BhcnNlLm51bWJ5dGVzPShcZCspXG4iLCBidWYpOgogICAgICAgICAgICBudW1ieXRlcy5hcHBlbmQoaW50KG1hdGNoLmdyb3VwKDEpKSkKICAgICAgICBuZXh0LnNwYXJzZSA9IGxpc3QoemlwKG9mZnNldHMsIG51bWJ5dGVzKSkKCiAgICBkZWYgX3Byb2NfZ251c3BhcnNlXzAxKHNlbGYsIG5leHQsIHBheF9oZWFkZXJzKToKICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHRhciBleHRlbmRlZCBzcGFyc2UgaGVhZGVyLCB2ZXJzaW9uIDAuMS4KICAgICAgICAiIiIKICAgICAgICBzcGFyc2UgPSBbaW50KHgpIGZvciB4IGluIHBheF9oZWFkZXJzWyJHTlUuc3BhcnNlLm1hcCJdLnNwbGl0KCIsIildCiAgICAgICAgbmV4dC5zcGFyc2UgPSBsaXN0KHppcChzcGFyc2VbOjoyXSwgc3BhcnNlWzE6OjJdKSkKCiAgICBkZWYgX3Byb2NfZ251c3BhcnNlXzEwKHNlbGYsIG5leHQsIHBheF9oZWFkZXJzLCB0YXJmaWxlKToKICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHRhciBleHRlbmRlZCBzcGFyc2UgaGVhZGVyLCB2ZXJzaW9uIDEuMC4KICAgICAgICAiIiIKICAgICAgICBmaWVsZHMgPSBOb25lCiAgICAgICAgc3BhcnNlID0gW10KICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCiAgICAgICAgZmllbGRzLCBidWYgPSBidWYuc3BsaXQoYiJcbiIsIDEpCiAgICAgICAgZmllbGRzID0gaW50KGZpZWxkcykKICAgICAgICB3aGlsZSBsZW4oc3BhcnNlKSA8IGZpZWxkcyAqIDI6CiAgICAgICAgICAgIGlmIGIiXG4iIG5vdCBpbiBidWY6CiAgICAgICAgICAgICAgICBidWYgKz0gdGFyZmlsZS5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQogICAgICAgICAgICBudW1iZXIsIGJ1ZiA9IGJ1Zi5zcGxpdChiIlxuIiwgMSkKICAgICAgICAgICAgc3BhcnNlLmFwcGVuZChpbnQobnVtYmVyKSkKICAgICAgICBuZXh0Lm9mZnNldF9kYXRhID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKQogICAgICAgIG5leHQuc3BhcnNlID0gbGlzdCh6aXAoc3BhcnNlWzo6Ml0sIHNwYXJzZVsxOjoyXSkpCgogICAgZGVmIF9hcHBseV9wYXhfaW5mbyhzZWxmLCBwYXhfaGVhZGVycywgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiUmVwbGFjZSBmaWVsZHMgd2l0aCBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gZnJvbSBhIHByZXZpb3VzCiAgICAgICAgICAgcGF4IGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGtleXdvcmQgPT0gIkdOVS5zcGFyc2UubmFtZSI6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsICJwYXRoIiwgdmFsdWUpCiAgICAgICAgICAgIGVsaWYga2V5d29yZCA9PSAiR05VLnNwYXJzZS5zaXplIjoKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgInNpemUiLCBpbnQodmFsdWUpKQogICAgICAgICAgICBlbGlmIGtleXdvcmQgPT0gIkdOVS5zcGFyc2UucmVhbHNpemUiOgogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCAic2l6ZSIsIGludCh2YWx1ZSkpCiAgICAgICAgICAgIGVsaWYga2V5d29yZCBpbiBQQVhfRklFTERTOgogICAgICAgICAgICAgICAgaWYga2V5d29yZCBpbiBQQVhfTlVNQkVSX0ZJRUxEUzoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUEFYX05VTUJFUl9GSUVMRFNba2V5d29yZF0odmFsdWUpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMAogICAgICAgICAgICAgICAgaWYga2V5d29yZCA9PSAicGF0aCI6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yc3RyaXAoIi8iKQogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXl3b3JkLCB2YWx1ZSkKCiAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzLmNvcHkoKQoKICAgIGRlZiBfZGVjb2RlX3BheF9maWVsZChzZWxmLCB2YWx1ZSwgZW5jb2RpbmcsIGZhbGxiYWNrX2VuY29kaW5nLCBmYWxsYmFja19lcnJvcnMpOgogICAgICAgICIiIkRlY29kZSBhIHNpbmdsZSBmaWVsZCBmcm9tIGEgcGF4IHJlY29yZC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGUoZW5jb2RpbmcsICJzdHJpY3QiKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGUoZmFsbGJhY2tfZW5jb2RpbmcsIGZhbGxiYWNrX2Vycm9ycykKCiAgICBkZWYgX2Jsb2NrKHNlbGYsIGNvdW50KToKICAgICAgICAiIiJSb3VuZCB1cCBhIGJ5dGUgY291bnQgYnkgQkxPQ0tTSVpFIGFuZCByZXR1cm4gaXQsCiAgICAgICAgICAgZS5nLiBfYmxvY2soODM0KSA9PiAxMDI0LgogICAgICAgICIiIgogICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGNvdW50LCBCTE9DS1NJWkUpCiAgICAgICAgaWYgcmVtYWluZGVyOgogICAgICAgICAgICBibG9ja3MgKz0gMQogICAgICAgIHJldHVybiBibG9ja3MgKiBCTE9DS1NJWkUKCiAgICBkZWYgaXNyZWcoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiBSRUdVTEFSX1RZUEVTCiAgICBkZWYgaXNmaWxlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmlzcmVnKCkKICAgIGRlZiBpc2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IERJUlRZUEUKICAgIGRlZiBpc3N5bShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IFNZTVRZUEUKICAgIGRlZiBpc2xuayhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IExOS1RZUEUKICAgIGRlZiBpc2NocihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IENIUlRZUEUKICAgIGRlZiBpc2JsayhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IEJMS1RZUEUKICAgIGRlZiBpc2ZpZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBGSUZPVFlQRQogICAgZGVmIGlzc3BhcnNlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnNwYXJzZSBpcyBub3QgTm9uZQogICAgZGVmIGlzZGV2KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgaW4gKENIUlRZUEUsIEJMS1RZUEUsIEZJRk9UWVBFKQojIGNsYXNzIFRhckluZm8KCmNsYXNzIFRhckZpbGUob2JqZWN0KToKICAgICIiIlRoZSBUYXJGaWxlIENsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0YXIgYXJjaGl2ZXMuCiAgICAiIiIKCiAgICBkZWJ1ZyA9IDAgICAgICAgICAgICAgICAgICAgIyBNYXkgYmUgc2V0IGZyb20gMCAobm8gbXNncykgdG8gMyAoYWxsIG1zZ3MpCgogICAgZGVyZWZlcmVuY2UgPSBGYWxzZSAgICAgICAgICMgSWYgdHJ1ZSwgYWRkIGNvbnRlbnQgb2YgbGlua2VkIGZpbGUgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0YXIgZmlsZSwgZWxzZSB0aGUgbGluay4KCiAgICBpZ25vcmVfemVyb3MgPSBGYWxzZSAgICAgICAgIyBJZiB0cnVlLCBza2lwcyBlbXB0eSBvciBpbnZhbGlkIGJsb2NrcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlcyBwcm9jZXNzaW5nLgoKICAgIGVycm9ybGV2ZWwgPSAxICAgICAgICAgICAgICAjIElmIDAsIGZhdGFsIGVycm9ycyBvbmx5IGFwcGVhciBpbiBkZWJ1ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVzc2FnZXMgKGlmIGRlYnVnID49IDApLiBJZiA+IDAsIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJlIHBhc3NlZCB0byB0aGUgY2FsbGVyIGFzIGV4Y2VwdGlvbnMuCgogICAgZm9ybWF0ID0gREVGQVVMVF9GT1JNQVQgICAgICMgVGhlIGZvcm1hdCB0byB1c2Ugd2hlbiBjcmVhdGluZyBhbiBhcmNoaXZlLgoKICAgIGVuY29kaW5nID0gRU5DT0RJTkcgICAgICAgICAjIEVuY29kaW5nIGZvciA4LWJpdCBjaGFyYWN0ZXIgc3RyaW5ncy4KCiAgICBlcnJvcnMgPSBOb25lICAgICAgICAgICAgICAgIyBFcnJvciBoYW5kbGVyIGZvciB1bmljb2RlIGNvbnZlcnNpb24uCgogICAgdGFyaW5mbyA9IFRhckluZm8gICAgICAgICAgICMgVGhlIGRlZmF1bHQgVGFySW5mbyBjbGFzcyB0byB1c2UuCgogICAgZmlsZW9iamVjdCA9IEV4RmlsZU9iamVjdCAgICMgVGhlIGRlZmF1bHQgRXhGaWxlT2JqZWN0IGNsYXNzIHRvIHVzZS4KCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBmb3JtYXQ9Tm9uZSwKICAgICAgICAgICAgdGFyaW5mbz1Ob25lLCBkZXJlZmVyZW5jZT1Ob25lLCBpZ25vcmVfemVyb3M9Tm9uZSwgZW5jb2Rpbmc9Tm9uZSwKICAgICAgICAgICAgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiLCBwYXhfaGVhZGVycz1Ob25lLCBkZWJ1Zz1Ob25lLCBlcnJvcmxldmVsPU5vbmUpOgogICAgICAgICIiIk9wZW4gYW4gKHVuY29tcHJlc3NlZCkgdGFyIGFyY2hpdmUgYG5hbWUnLiBgbW9kZScgaXMgZWl0aGVyICdyJyB0bwogICAgICAgICAgIHJlYWQgZnJvbSBhbiBleGlzdGluZyBhcmNoaXZlLCAnYScgdG8gYXBwZW5kIGRhdGEgdG8gYW4gZXhpc3RpbmcKICAgICAgICAgICBmaWxlIG9yICd3JyB0byBjcmVhdGUgYSBuZXcgZmlsZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUuIGBtb2RlJwogICAgICAgICAgIGRlZmF1bHRzIHRvICdyJy4KICAgICAgICAgICBJZiBgZmlsZW9iaicgaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyBkYXRhLiBJZiBpdAogICAgICAgICAgIGNhbiBiZSBkZXRlcm1pbmVkLCBgbW9kZScgaXMgb3ZlcnJpZGRlbiBieSBgZmlsZW9iaidzIG1vZGUuCiAgICAgICAgICAgYGZpbGVvYmonIGlzIG5vdCBjbG9zZWQsIHdoZW4gVGFyRmlsZSBpcyBjbG9zZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCiAgICAgICAgc2VsZi5tb2RlID0gbW9kZQogICAgICAgIHNlbGYuX21vZGUgPSB7InIiOiAicmIiLCAiYSI6ICJyK2IiLCAidyI6ICJ3YiJ9W21vZGVdCgogICAgICAgIGlmIG5vdCBmaWxlb2JqOgogICAgICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImEiIGFuZCBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6CiAgICAgICAgICAgICAgICAjIENyZWF0ZSBub25leGlzdGVudCBmaWxlcyBpbiBhcHBlbmQgbW9kZS4KICAgICAgICAgICAgICAgIHNlbGYubW9kZSA9ICJ3IgogICAgICAgICAgICAgICAgc2VsZi5fbW9kZSA9ICJ3YiIKICAgICAgICAgICAgZmlsZW9iaiA9IGJsdG5fb3BlbihuYW1lLCBzZWxmLl9tb2RlKQogICAgICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBuYW1lIGlzIE5vbmUgYW5kIGhhc2F0dHIoZmlsZW9iaiwgIm5hbWUiKToKICAgICAgICAgICAgICAgIG5hbWUgPSBmaWxlb2JqLm5hbWUKICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAibW9kZSIpOgogICAgICAgICAgICAgICAgc2VsZi5fbW9kZSA9IGZpbGVvYmoubW9kZQogICAgICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gVHJ1ZQogICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguYWJzcGF0aChuYW1lKSBpZiBuYW1lIGVsc2UgTm9uZQogICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKCiAgICAgICAgIyBJbml0IGF0dHJpYnV0ZXMuCiAgICAgICAgaWYgZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmZvcm1hdCA9IGZvcm1hdAogICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYudGFyaW5mbyA9IHRhcmluZm8KICAgICAgICBpZiBkZXJlZmVyZW5jZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5kZXJlZmVyZW5jZSA9IGRlcmVmZXJlbmNlCiAgICAgICAgaWYgaWdub3JlX3plcm9zIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmlnbm9yZV96ZXJvcyA9IGlnbm9yZV96ZXJvcwogICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycwoKICAgICAgICBpZiBwYXhfaGVhZGVycyBpcyBub3QgTm9uZSBhbmQgc2VsZi5mb3JtYXQgPT0gUEFYX0ZPUk1BVDoKICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9CgogICAgICAgIGlmIGRlYnVnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmRlYnVnID0gZGVidWcKICAgICAgICBpZiBlcnJvcmxldmVsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmVycm9ybGV2ZWwgPSBlcnJvcmxldmVsCgogICAgICAgICMgSW5pdCBkYXRhc3RydWN0dXJlcy4KICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5tZW1iZXJzID0gW10gICAgICAgIyBsaXN0IG9mIG1lbWJlcnMgYXMgVGFySW5mbyBvYmplY3RzCiAgICAgICAgc2VsZi5fbG9hZGVkID0gRmFsc2UgICAgIyBmbGFnIGlmIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkCiAgICAgICAgc2VsZi5vZmZzZXQgPSBzZWxmLmZpbGVvYmoudGVsbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBhcmNoaXZlIGZpbGUKICAgICAgICBzZWxmLmlub2RlcyA9IHt9ICAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlIG1lbWJlcnMgYWxyZWFkeSBhZGRlZAoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiciI6CiAgICAgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQogICAgICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IHNlbGYubmV4dCgpCgogICAgICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImEiOgogICAgICAgICAgICAgICAgIyBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUsCiAgICAgICAgICAgICAgICAjIGJlZm9yZSB0aGUgZmlyc3QgZW1wdHkgYmxvY2suCiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mby5mcm9tdGFyZmlsZShzZWxmKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEVPRkhlYWRlckVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBleGNlcHQgSGVhZGVyRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKHN0cihlKSkKCiAgICAgICAgICAgIGlmIHNlbGYubW9kZSBpbiAiYXciOgogICAgICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQoKICAgICAgICAgICAgICAgIGlmIHNlbGYucGF4X2hlYWRlcnM6CiAgICAgICAgICAgICAgICAgICAgYnVmID0gc2VsZi50YXJpbmZvLmNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcihzZWxmLnBheF9oZWFkZXJzLmNvcHkoKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQogICAgICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQogICAgICAgICAgICByYWlzZQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBCZWxvdyBhcmUgdGhlIGNsYXNzbWV0aG9kcyB3aGljaCBhY3QgYXMgYWx0ZXJuYXRlIGNvbnN0cnVjdG9ycyB0byB0aGUKICAgICMgVGFyRmlsZSBjbGFzcy4gVGhlIG9wZW4oKSBtZXRob2QgaXMgdGhlIG9ubHkgb25lIHRoYXQgaXMgbmVlZGVkIGZvcgogICAgIyBwdWJsaWMgdXNlOyBpdCBpcyB0aGUgInN1cGVyIi1jb25zdHJ1Y3RvciBhbmQgaXMgYWJsZSB0byBzZWxlY3QgYW4KICAgICMgYWRlcXVhdGUgInN1YiItY29uc3RydWN0b3IgZm9yIGEgcGFydGljdWxhciBjb21wcmVzc2lvbiB1c2luZyB0aGUgbWFwcGluZwogICAgIyBmcm9tIE9QRU5fTUVUSC4KICAgICMKICAgICMgVGhpcyBjb25jZXB0IGFsbG93cyBvbmUgdG8gc3ViY2xhc3MgVGFyRmlsZSB3aXRob3V0IGxvc2luZyB0aGUgY29tZm9ydCBvZgogICAgIyB0aGUgc3VwZXItY29uc3RydWN0b3IuIEEgc3ViLWNvbnN0cnVjdG9yIGlzIHJlZ2lzdGVyZWQgYW5kIG1hZGUgYXZhaWxhYmxlCiAgICAjIGJ5IGFkZGluZyBpdCB0byB0aGUgbWFwcGluZyBpbiBPUEVOX01FVEguCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgb3BlbihjbHMsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgYnVmc2l6ZT1SRUNPUkRTSVpFLCAqKmt3YXJncyk6CiAgICAgICAgIiIiT3BlbiBhIHRhciBhcmNoaXZlIGZvciByZWFkaW5nLCB3cml0aW5nIG9yIGFwcGVuZGluZy4gUmV0dXJuCiAgICAgICAgICAgYW4gYXBwcm9wcmlhdGUgVGFyRmlsZSBjbGFzcy4KCiAgICAgICAgICAgbW9kZToKICAgICAgICAgICAncicgb3IgJ3I6Kicgb3BlbiBmb3IgcmVhZGluZyB3aXRoIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uCiAgICAgICAgICAgJ3I6JyAgICAgICAgIG9wZW4gZm9yIHJlYWRpbmcgZXhjbHVzaXZlbHkgdW5jb21wcmVzc2VkCiAgICAgICAgICAgJ3I6Z3onICAgICAgIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uCiAgICAgICAgICAgJ3I6YnoyJyAgICAgIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCBiemlwMiBjb21wcmVzc2lvbgogICAgICAgICAgICdhJyBvciAnYTonICBvcGVuIGZvciBhcHBlbmRpbmcsIGNyZWF0aW5nIHRoZSBmaWxlIGlmIG5lY2Vzc2FyeQogICAgICAgICAgICd3JyBvciAndzonICBvcGVuIGZvciB3cml0aW5nIHdpdGhvdXQgY29tcHJlc3Npb24KICAgICAgICAgICAndzpneicgICAgICAgb3BlbiBmb3Igd3JpdGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24KICAgICAgICAgICAndzpiejInICAgICAgb3BlbiBmb3Igd3JpdGluZyB3aXRoIGJ6aXAyIGNvbXByZXNzaW9uCgogICAgICAgICAgICdyfConICAgICAgICBvcGVuIGEgc3RyZWFtIG9mIHRhciBibG9ja3Mgd2l0aCB0cmFuc3BhcmVudCBjb21wcmVzc2lvbgogICAgICAgICAgICdyfCcgICAgICAgICBvcGVuIGFuIHVuY29tcHJlc3NlZCBzdHJlYW0gb2YgdGFyIGJsb2NrcyBmb3IgcmVhZGluZwogICAgICAgICAgICdyfGd6JyAgICAgICBvcGVuIGEgZ3ppcCBjb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzCiAgICAgICAgICAgJ3J8YnoyJyAgICAgIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzCiAgICAgICAgICAgJ3d8JyAgICAgICAgIG9wZW4gYW4gdW5jb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZwogICAgICAgICAgICd3fGd6JyAgICAgICBvcGVuIGEgZ3ppcCBjb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZwogICAgICAgICAgICd3fGJ6MicgICAgICBvcGVuIGEgYnppcDIgY29tcHJlc3NlZCBzdHJlYW0gZm9yIHdyaXRpbmcKICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IG5hbWUgYW5kIG5vdCBmaWxlb2JqOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJub3RoaW5nIHRvIG9wZW4iKQoKICAgICAgICBpZiBtb2RlIGluICgiciIsICJyOioiKToKICAgICAgICAgICAgIyBGaW5kIG91dCB3aGljaCAqb3BlbigpIGlzIGFwcHJvcHJpYXRlIGZvciBvcGVuaW5nIHRoZSBmaWxlLgogICAgICAgICAgICBmb3IgY29tcHR5cGUgaW4gY2xzLk9QRU5fTUVUSDoKICAgICAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKGNscywgY2xzLk9QRU5fTUVUSFtjb21wdHlwZV0pCiAgICAgICAgICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNhdmVkX3BvcyA9IGZpbGVvYmoudGVsbCgpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgInIiLCBmaWxlb2JqLCAqKmt3YXJncykKICAgICAgICAgICAgICAgIGV4Y2VwdCAoUmVhZEVycm9yLCBDb21wcmVzc2lvbkVycm9yKSBhcyBlOgogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlayhzYXZlZF9wb3MpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5IikKCiAgICAgICAgZWxpZiAiOiIgaW4gbW9kZToKICAgICAgICAgICAgZmlsZW1vZGUsIGNvbXB0eXBlID0gbW9kZS5zcGxpdCgiOiIsIDEpCiAgICAgICAgICAgIGZpbGVtb2RlID0gZmlsZW1vZGUgb3IgInIiCiAgICAgICAgICAgIGNvbXB0eXBlID0gY29tcHR5cGUgb3IgInRhciIKCiAgICAgICAgICAgICMgU2VsZWN0IHRoZSAqb3BlbigpIGZ1bmN0aW9uIGFjY29yZGluZyB0bwogICAgICAgICAgICAjIGdpdmVuIGNvbXByZXNzaW9uLgogICAgICAgICAgICBpZiBjb21wdHlwZSBpbiBjbHMuT1BFTl9NRVRIOgogICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoY2xzLCBjbHMuT1BFTl9NRVRIW2NvbXB0eXBlXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoInVua25vd24gY29tcHJlc3Npb24gdHlwZSAlciIgJSBjb21wdHlwZSkKICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgZmlsZW1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQoKICAgICAgICBlbGlmICJ8IiBpbiBtb2RlOgogICAgICAgICAgICBmaWxlbW9kZSwgY29tcHR5cGUgPSBtb2RlLnNwbGl0KCJ8IiwgMSkKICAgICAgICAgICAgZmlsZW1vZGUgPSBmaWxlbW9kZSBvciAiciIKICAgICAgICAgICAgY29tcHR5cGUgPSBjb21wdHlwZSBvciAidGFyIgoKICAgICAgICAgICAgaWYgZmlsZW1vZGUgbm90IGluICJydyI6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIpCgogICAgICAgICAgICBzdHJlYW0gPSBfU3RyZWFtKG5hbWUsIGZpbGVtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdCA9IGNscyhuYW1lLCBmaWxlbW9kZSwgc3RyZWFtLCAqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCkKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgICAgICByZXR1cm4gdAoKICAgICAgICBlbGlmIG1vZGUgaW4gImF3IjoKICAgICAgICAgICAgcmV0dXJuIGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmRpc2Nlcm5pYmxlIG1vZGUiKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHRhcm9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgIiIiT3BlbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJhdyI6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQogICAgICAgIHJldHVybiBjbHMobmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ3pvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05LCAqKmt3YXJncyk6CiAgICAgICAgIiIiT3BlbiBnemlwIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAgIEFwcGVuZGluZyBpcyBub3QgYWxsb3dlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJydyI6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgZ3ppcAogICAgICAgICAgICBnemlwLkd6aXBGaWxlCiAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJnemlwIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKCiAgICAgICAgZXh0ZmlsZW9iaiA9IGZpbGVvYmogaXMgbm90IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmogPSBnemlwLkd6aXBGaWxlKG5hbWUsIG1vZGUgKyAiYiIsIGNvbXByZXNzbGV2ZWwsIGZpbGVvYmopCiAgICAgICAgICAgIHQgPSBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgaWYgbm90IGV4dGZpbGVvYmogYW5kIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgaWYgbm90IGV4dGZpbGVvYmogYW5kIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgcmFpc2UKICAgICAgICB0Ll9leHRmaWxlb2JqID0gZXh0ZmlsZW9iagogICAgICAgIHJldHVybiB0CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYnoyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSwgKiprd2FyZ3MpOgogICAgICAgICIiIk9wZW4gYnppcDIgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCiAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndycuIikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgYnoyCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQoKICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmaWxlb2JqID0gX0JaMlByb3h5KGZpbGVvYmosIG1vZGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmlsZW9iaiA9IGJ6Mi5CWjJGaWxlKG5hbWUsIG1vZGUsIGNvbXByZXNzbGV2ZWw9Y29tcHJlc3NsZXZlbCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBFT0ZFcnJvcik6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGJ6aXAyIGZpbGUiKQogICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgIHJldHVybiB0CgogICAgIyBBbGwgKm9wZW4oKSBtZXRob2RzIGFyZSByZWdpc3RlcmVkIGhlcmUuCiAgICBPUEVOX01FVEggPSB7CiAgICAgICAgInRhciI6ICJ0YXJvcGVuIiwgICAjIHVuY29tcHJlc3NlZCB0YXIKICAgICAgICAiZ3oiOiAgImd6b3BlbiIsICAgICMgZ3ppcCBjb21wcmVzc2VkIHRhcgogICAgICAgICJiejIiOiAiYnoyb3BlbiIgICAgIyBiemlwMiBjb21wcmVzc2VkIHRhcgogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBUaGUgcHVibGljIG1ldGhvZHMgd2hpY2ggVGFyRmlsZSBwcm92aWRlczoKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiQ2xvc2UgdGhlIFRhckZpbGUuIEluIHdyaXRlLW1vZGUsIHR3byBmaW5pc2hpbmcgemVybyBibG9ja3MgYXJlCiAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIGFyY2hpdmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBzZWxmLm1vZGUgaW4gImF3IjoKICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChCTE9DS1NJWkUgKiAyKSkKICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gKEJMT0NLU0laRSAqIDIpCiAgICAgICAgICAgICMgZmlsbCB1cCB0aGUgZW5kIHdpdGggemVyby1ibG9ja3MKICAgICAgICAgICAgIyAobGlrZSBvcHRpb24gLWIyMCBmb3IgdGFyIGRvZXMpCiAgICAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHNlbGYub2Zmc2V0LCBSRUNPUkRTSVpFKQogICAgICAgICAgICBpZiByZW1haW5kZXIgPiAwOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChSRUNPUkRTSVpFIC0gcmVtYWluZGVyKSkKCiAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCgogICAgZGVmIGdldG1lbWJlcihzZWxmLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBUYXJJbmZvIG9iamVjdCBmb3IgbWVtYmVyIGBuYW1lJy4gSWYgYG5hbWUnIGNhbiBub3QgYmUKICAgICAgICAgICBmb3VuZCBpbiB0aGUgYXJjaGl2ZSwgS2V5RXJyb3IgaXMgcmFpc2VkLiBJZiBhIG1lbWJlciBvY2N1cnMgbW9yZQogICAgICAgICAgIHRoYW4gb25jZSBpbiB0aGUgYXJjaGl2ZSwgaXRzIGxhc3Qgb2NjdXJyZW5jZSBpcyBhc3N1bWVkIHRvIGJlIHRoZQogICAgICAgICAgIG1vc3QgdXAtdG8tZGF0ZSB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHRhcmluZm8gPSBzZWxmLl9nZXRtZW1iZXIobmFtZSkKICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJmaWxlbmFtZSAlciBub3QgZm91bmQiICUgbmFtZSkKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgIGRlZiBnZXRtZW1iZXJzKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSBhcyBhIGxpc3Qgb2YgVGFySW5mbyBvYmplY3RzLiBUaGUKICAgICAgICAgICBsaXN0IGhhcyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbWVtYmVycyBpbiB0aGUgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygpCiAgICAgICAgaWYgbm90IHNlbGYuX2xvYWRlZDogICAgIyBpZiB3ZSB3YW50IHRvIG9idGFpbiBhIGxpc3Qgb2YKICAgICAgICAgICAgc2VsZi5fbG9hZCgpICAgICAgICAjIGFsbCBtZW1iZXJzLCB3ZSBmaXJzdCBoYXZlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzY2FuIHRoZSB3aG9sZSBhcmNoaXZlLgogICAgICAgIHJldHVybiBzZWxmLm1lbWJlcnMKCiAgICBkZWYgZ2V0bmFtZXMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlIGFzIGEgbGlzdCBvZiB0aGVpciBuYW1lcy4gSXQgaGFzCiAgICAgICAgICAgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGxpc3QgcmV0dXJuZWQgYnkgZ2V0bWVtYmVycygpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBbdGFyaW5mby5uYW1lIGZvciB0YXJpbmZvIGluIHNlbGYuZ2V0bWVtYmVycygpXQoKICAgIGRlZiBnZXR0YXJpbmZvKHNlbGYsIG5hbWU9Tm9uZSwgYXJjbmFtZT1Ob25lLCBmaWxlb2JqPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSBhIFRhckluZm8gb2JqZWN0IGZvciBlaXRoZXIgdGhlIGZpbGUgYG5hbWUnIG9yIHRoZSBmaWxlCiAgICAgICAgICAgb2JqZWN0IGBmaWxlb2JqJyAodXNpbmcgb3MuZnN0YXQgb24gaXRzIGZpbGUgZGVzY3JpcHRvcikuIFlvdSBjYW4KICAgICAgICAgICBtb2RpZnkgc29tZSBvZiB0aGUgVGFySW5mbydzIGF0dHJpYnV0ZXMgYmVmb3JlIHlvdSBhZGQgaXQgdXNpbmcKICAgICAgICAgICBhZGRmaWxlKCkuIElmIGdpdmVuLCBgYXJjbmFtZScgc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoZQogICAgICAgICAgIGZpbGUgaW4gdGhlIGFyY2hpdmUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soImF3IikKCiAgICAgICAgIyBXaGVuIGZpbGVvYmogaXMgZ2l2ZW4sIHJlcGxhY2UgbmFtZSBieQogICAgICAgICMgZmlsZW9iaidzIHJlYWwgbmFtZS4KICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICBuYW1lID0gZmlsZW9iai5uYW1lCgogICAgICAgICMgQnVpbGRpbmcgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciBpbiB0aGUgYXJjaGl2ZS4KICAgICAgICAjIEJhY2t3YXJkIHNsYXNoZXMgYXJlIGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXMsCiAgICAgICAgIyBBYnNvbHV0ZSBwYXRocyBhcmUgdHVybmVkIHRvIHJlbGF0aXZlIHBhdGhzLgogICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKICAgICAgICAgICAgYXJjbmFtZSA9IG5hbWUKICAgICAgICBkcnYsIGFyY25hbWUgPSBvcy5wYXRoLnNwbGl0ZHJpdmUoYXJjbmFtZSkKICAgICAgICBhcmNuYW1lID0gYXJjbmFtZS5yZXBsYWNlKG9zLnNlcCwgIi8iKQogICAgICAgIGFyY25hbWUgPSBhcmNuYW1lLmxzdHJpcCgiLyIpCgogICAgICAgICMgTm93LCBmaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoCiAgICAgICAgIyBpbmZvcm1hdGlvbiBzcGVjaWZpYyBmb3IgdGhlIGZpbGUuCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mbygpCiAgICAgICAgdGFyaW5mby50YXJmaWxlID0gc2VsZgoKICAgICAgICAjIFVzZSBvcy5zdGF0IG9yIG9zLmxzdGF0LCBkZXBlbmRpbmcgb24gcGxhdGZvcm0KICAgICAgICAjIGFuZCBpZiBzeW1saW5rcyBzaGFsbCBiZSByZXNvbHZlZC4KICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJsc3RhdCIpIGFuZCBub3Qgc2VsZi5kZXJlZmVyZW5jZToKICAgICAgICAgICAgICAgIHN0YXRyZXMgPSBvcy5sc3RhdChuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3RhdHJlcyA9IG9zLnN0YXQobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGF0cmVzID0gb3MuZnN0YXQoZmlsZW9iai5maWxlbm8oKSkKICAgICAgICBsaW5rbmFtZSA9ICIiCgogICAgICAgIHN0bWQgPSBzdGF0cmVzLnN0X21vZGUKICAgICAgICBpZiBzdGF0LlNfSVNSRUcoc3RtZCk6CiAgICAgICAgICAgIGlub2RlID0gKHN0YXRyZXMuc3RfaW5vLCBzdGF0cmVzLnN0X2RldikKICAgICAgICAgICAgaWYgbm90IHNlbGYuZGVyZWZlcmVuY2UgYW5kIHN0YXRyZXMuc3RfbmxpbmsgPiAxIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgaW5vZGUgaW4gc2VsZi5pbm9kZXMgYW5kIGFyY25hbWUgIT0gc2VsZi5pbm9kZXNbaW5vZGVdOgogICAgICAgICAgICAgICAgIyBJcyBpdCBhIGhhcmRsaW5rIHRvIGFuIGFscmVhZHkKICAgICAgICAgICAgICAgICMgYXJjaGl2ZWQgZmlsZT8KICAgICAgICAgICAgICAgIHR5cGUgPSBMTktUWVBFCiAgICAgICAgICAgICAgICBsaW5rbmFtZSA9IHNlbGYuaW5vZGVzW2lub2RlXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBUaGUgaW5vZGUgaXMgYWRkZWQgb25seSBpZiBpdHMgdmFsaWQuCiAgICAgICAgICAgICAgICAjIEZvciB3aW4zMiBpdCBpcyBhbHdheXMgMC4KICAgICAgICAgICAgICAgIHR5cGUgPSBSRUdUWVBFCiAgICAgICAgICAgICAgICBpZiBpbm9kZVswXToKICAgICAgICAgICAgICAgICAgICBzZWxmLmlub2Rlc1tpbm9kZV0gPSBhcmNuYW1lCiAgICAgICAgZWxpZiBzdGF0LlNfSVNESVIoc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBESVJUWVBFCiAgICAgICAgZWxpZiBzdGF0LlNfSVNGSUZPKHN0bWQpOgogICAgICAgICAgICB0eXBlID0gRklGT1RZUEUKICAgICAgICBlbGlmIHN0YXQuU19JU0xOSyhzdG1kKToKICAgICAgICAgICAgdHlwZSA9IFNZTVRZUEUKICAgICAgICAgICAgbGlua25hbWUgPSBvcy5yZWFkbGluayhuYW1lKQogICAgICAgIGVsaWYgc3RhdC5TX0lTQ0hSKHN0bWQpOgogICAgICAgICAgICB0eXBlID0gQ0hSVFlQRQogICAgICAgIGVsaWYgc3RhdC5TX0lTQkxLKHN0bWQpOgogICAgICAgICAgICB0eXBlID0gQkxLVFlQRQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgRmlsbCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aCBhbGwKICAgICAgICAjIGluZm9ybWF0aW9uIHdlIGNhbiBnZXQuCiAgICAgICAgdGFyaW5mby5uYW1lID0gYXJjbmFtZQogICAgICAgIHRhcmluZm8ubW9kZSA9IHN0bWQKICAgICAgICB0YXJpbmZvLnVpZCA9IHN0YXRyZXMuc3RfdWlkCiAgICAgICAgdGFyaW5mby5naWQgPSBzdGF0cmVzLnN0X2dpZAogICAgICAgIGlmIHR5cGUgPT0gUkVHVFlQRToKICAgICAgICAgICAgdGFyaW5mby5zaXplID0gc3RhdHJlcy5zdF9zaXplCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGFyaW5mby5zaXplID0gMAogICAgICAgIHRhcmluZm8ubXRpbWUgPSBzdGF0cmVzLnN0X210aW1lCiAgICAgICAgdGFyaW5mby50eXBlID0gdHlwZQogICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBsaW5rbmFtZQogICAgICAgIGlmIHB3ZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9IHB3ZC5nZXRwd3VpZCh0YXJpbmZvLnVpZClbMF0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGlmIGdycDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyaW5mby5nbmFtZSA9IGdycC5nZXRncmdpZCh0YXJpbmZvLmdpZClbMF0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiB0eXBlIGluIChDSFJUWVBFLCBCTEtUWVBFKToKICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgIm1ham9yIikgYW5kIGhhc2F0dHIob3MsICJtaW5vciIpOgogICAgICAgICAgICAgICAgdGFyaW5mby5kZXZtYWpvciA9IG9zLm1ham9yKHN0YXRyZXMuc3RfcmRldikKICAgICAgICAgICAgICAgIHRhcmluZm8uZGV2bWlub3IgPSBvcy5taW5vcihzdGF0cmVzLnN0X3JkZXYpCiAgICAgICAgcmV0dXJuIHRhcmluZm8KCiAgICBkZWYgbGlzdChzZWxmLCB2ZXJib3NlPVRydWUpOgogICAgICAgICIiIlByaW50IGEgdGFibGUgb2YgY29udGVudHMgdG8gc3lzLnN0ZG91dC4gSWYgYHZlcmJvc2UnIGlzIEZhbHNlLCBvbmx5CiAgICAgICAgICAgdGhlIG5hbWVzIG9mIHRoZSBtZW1iZXJzIGFyZSBwcmludGVkLiBJZiBpdCBpcyBUcnVlLCBhbiBgbHMgLWwnLWxpa2UKICAgICAgICAgICBvdXRwdXQgaXMgcHJvZHVjZWQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soKQoKICAgICAgICBmb3IgdGFyaW5mbyBpbiBzZWxmOgogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgcHJpbnQoZmlsZW1vZGUodGFyaW5mby5tb2RlKSwgZW5kPScgJykKICAgICAgICAgICAgICAgIHByaW50KCIlcy8lcyIgJSAodGFyaW5mby51bmFtZSBvciB0YXJpbmZvLnVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5nbmFtZSBvciB0YXJpbmZvLmdpZCksIGVuZD0nICcpCiAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzY2hyKCkgb3IgdGFyaW5mby5pc2JsaygpOgogICAgICAgICAgICAgICAgICAgIHByaW50KCIlMTBzIiAlICgiJWQsJWQiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodGFyaW5mby5kZXZtYWpvciwgdGFyaW5mby5kZXZtaW5vcikpLCBlbmQ9JyAnKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwcmludCgiJTEwZCIgJSB0YXJpbmZvLnNpemUsIGVuZD0nICcpCiAgICAgICAgICAgICAgICBwcmludCgiJWQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiBcCiAgICAgICAgICAgICAgICAgICAgICAlIHRpbWUubG9jYWx0aW1lKHRhcmluZm8ubXRpbWUpWzo2XSwgZW5kPScgJykKCiAgICAgICAgICAgIHByaW50KHRhcmluZm8ubmFtZSArICgiLyIgaWYgdGFyaW5mby5pc2RpcigpIGVsc2UgIiIpLCBlbmQ9JyAnKQoKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgICAgICAgICBwcmludCgiLT4iLCB0YXJpbmZvLmxpbmtuYW1lLCBlbmQ9JyAnKQogICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpOgogICAgICAgICAgICAgICAgICAgIHByaW50KCJsaW5rIHRvIiwgdGFyaW5mby5saW5rbmFtZSwgZW5kPScgJykKICAgICAgICAgICAgcHJpbnQoKQoKICAgIGRlZiBhZGQoc2VsZiwgbmFtZSwgYXJjbmFtZT1Ob25lLCByZWN1cnNpdmU9VHJ1ZSwgZXhjbHVkZT1Ob25lLCBmaWx0ZXI9Tm9uZSk6CiAgICAgICAgIiIiQWRkIHRoZSBmaWxlIGBuYW1lJyB0byB0aGUgYXJjaGl2ZS4gYG5hbWUnIG1heSBiZSBhbnkgdHlwZSBvZiBmaWxlCiAgICAgICAgICAgKGRpcmVjdG9yeSwgZmlmbywgc3ltYm9saWMgbGluaywgZXRjLikuIElmIGdpdmVuLCBgYXJjbmFtZScKICAgICAgICAgICBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUuCiAgICAgICAgICAgRGlyZWN0b3JpZXMgYXJlIGFkZGVkIHJlY3Vyc2l2ZWx5IGJ5IGRlZmF1bHQuIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkKICAgICAgICAgICBzZXR0aW5nIGByZWN1cnNpdmUnIHRvIEZhbHNlLiBgZXhjbHVkZScgaXMgYSBmdW5jdGlvbiB0aGF0IHNob3VsZAogICAgICAgICAgIHJldHVybiBUcnVlIGZvciBlYWNoIGZpbGVuYW1lIHRvIGJlIGV4Y2x1ZGVkLiBgZmlsdGVyJyBpcyBhIGZ1bmN0aW9uCiAgICAgICAgICAgdGhhdCBleHBlY3RzIGEgVGFySW5mbyBvYmplY3QgYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIGNoYW5nZWQKICAgICAgICAgICBUYXJJbmZvIG9iamVjdCwgaWYgaXQgcmV0dXJucyBOb25lIHRoZSBUYXJJbmZvIG9iamVjdCB3aWxsIGJlCiAgICAgICAgICAgZXhjbHVkZWQgZnJvbSB0aGUgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiYXciKQoKICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIGFyY25hbWUgPSBuYW1lCgogICAgICAgICMgRXhjbHVkZSBwYXRobmFtZXMuCiAgICAgICAgaWYgZXhjbHVkZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVzZSB0aGUgZmlsdGVyIGFyZ3VtZW50IGluc3RlYWQiLAogICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKICAgICAgICAgICAgaWYgZXhjbHVkZShuYW1lKToKICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogRXhjbHVkZWQgJXIiICUgbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFNraXAgaWYgc29tZWJvZHkgdHJpZXMgdG8gYXJjaGl2ZSB0aGUgYXJjaGl2ZS4uLgogICAgICAgIGlmIHNlbGYubmFtZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5hYnNwYXRoKG5hbWUpID09IHNlbGYubmFtZToKICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBTa2lwcGVkICVyIiAlIG5hbWUpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLl9kYmcoMSwgbmFtZSkKCiAgICAgICAgIyBDcmVhdGUgYSBUYXJJbmZvIG9iamVjdCBmcm9tIHRoZSBmaWxlLgogICAgICAgIHRhcmluZm8gPSBzZWxmLmdldHRhcmluZm8obmFtZSwgYXJjbmFtZSkKCiAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IFVuc3VwcG9ydGVkIHR5cGUgJXIiICUgbmFtZSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQ2hhbmdlIG9yIGV4Y2x1ZGUgdGhlIFRhckluZm8gb2JqZWN0LgogICAgICAgIGlmIGZpbHRlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGFyaW5mbyA9IGZpbHRlcih0YXJpbmZvKQogICAgICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IEV4Y2x1ZGVkICVyIiAlIG5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBBcHBlbmQgdGhlIHRhciBoZWFkZXIgYW5kIGRhdGEgdG8gdGhlIGFyY2hpdmUuCiAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICBmID0gYmx0bl9vcGVuKG5hbWUsICJyYiIpCiAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvLCBmKQogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvKQogICAgICAgICAgICBpZiByZWN1cnNpdmU6CiAgICAgICAgICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKG5hbWUpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKG9zLnBhdGguam9pbihuYW1lLCBmKSwgb3MucGF0aC5qb2luKGFyY25hbWUsIGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlLCBleGNsdWRlLCBmaWx0ZXI9ZmlsdGVyKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmFkZGZpbGUodGFyaW5mbykKCiAgICBkZWYgYWRkZmlsZShzZWxmLCB0YXJpbmZvLCBmaWxlb2JqPU5vbmUpOgogICAgICAgICIiIkFkZCB0aGUgVGFySW5mbyBvYmplY3QgYHRhcmluZm8nIHRvIHRoZSBhcmNoaXZlLiBJZiBgZmlsZW9iaicgaXMKICAgICAgICAgICBnaXZlbiwgdGFyaW5mby5zaXplIGJ5dGVzIGFyZSByZWFkIGZyb20gaXQgYW5kIGFkZGVkIHRvIHRoZSBhcmNoaXZlLgogICAgICAgICAgIFlvdSBjYW4gY3JlYXRlIFRhckluZm8gb2JqZWN0cyB1c2luZyBnZXR0YXJpbmZvKCkuCiAgICAgICAgICAgT24gV2luZG93cyBwbGF0Zm9ybXMsIGBmaWxlb2JqJyBzaG91bGQgYWx3YXlzIGJlIG9wZW5lZCB3aXRoIG1vZGUKICAgICAgICAgICAncmInIHRvIGF2b2lkIGlycml0YXRpb24gYWJvdXQgdGhlIGZpbGUgc2l6ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiYXciKQoKICAgICAgICB0YXJpbmZvID0gY29weS5jb3B5KHRhcmluZm8pCgogICAgICAgIGJ1ZiA9IHRhcmluZm8udG9idWYoc2VsZi5mb3JtYXQsIHNlbGYuZW5jb2RpbmcsIHNlbGYuZXJyb3JzKQogICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAgICAgICAgc2VsZi5vZmZzZXQgKz0gbGVuKGJ1ZikKCiAgICAgICAgIyBJZiB0aGVyZSdzIGRhdGEgdG8gZm9sbG93LCBhcHBlbmQgaXQuCiAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29weWZpbGVvYmooZmlsZW9iaiwgc2VsZi5maWxlb2JqLCB0YXJpbmZvLnNpemUpCiAgICAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHRhcmluZm8uc2l6ZSwgQkxPQ0tTSVpFKQogICAgICAgICAgICBpZiByZW1haW5kZXIgPiAwOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChCTE9DS1NJWkUgLSByZW1haW5kZXIpKQogICAgICAgICAgICAgICAgYmxvY2tzICs9IDEKICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gYmxvY2tzICogQkxPQ0tTSVpFCgogICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKCiAgICBkZWYgZXh0cmFjdGFsbChzZWxmLCBwYXRoPSIuIiwgbWVtYmVycz1Ob25lKToKICAgICAgICAiIiJFeHRyYWN0IGFsbCBtZW1iZXJzIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZwogICAgICAgICAgIGRpcmVjdG9yeSBhbmQgc2V0IG93bmVyLCBtb2RpZmljYXRpb24gdGltZSBhbmQgcGVybWlzc2lvbnMgb24KICAgICAgICAgICBkaXJlY3RvcmllcyBhZnRlcndhcmRzLiBgcGF0aCcgc3BlY2lmaWVzIGEgZGlmZmVyZW50IGRpcmVjdG9yeQogICAgICAgICAgIHRvIGV4dHJhY3QgdG8uIGBtZW1iZXJzJyBpcyBvcHRpb25hbCBhbmQgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUKICAgICAgICAgICBsaXN0IHJldHVybmVkIGJ5IGdldG1lbWJlcnMoKS4KICAgICAgICAiIiIKICAgICAgICBkaXJlY3RvcmllcyA9IFtdCgogICAgICAgIGlmIG1lbWJlcnMgaXMgTm9uZToKICAgICAgICAgICAgbWVtYmVycyA9IHNlbGYKCiAgICAgICAgZm9yIHRhcmluZm8gaW4gbWVtYmVyczoKICAgICAgICAgICAgaWYgdGFyaW5mby5pc2RpcigpOgogICAgICAgICAgICAgICAgIyBFeHRyYWN0IGRpcmVjdG9yaWVzIHdpdGggYSBzYWZlIG1vZGUuCiAgICAgICAgICAgICAgICBkaXJlY3Rvcmllcy5hcHBlbmQodGFyaW5mbykKICAgICAgICAgICAgICAgIHRhcmluZm8gPSBjb3B5LmNvcHkodGFyaW5mbykKICAgICAgICAgICAgICAgIHRhcmluZm8ubW9kZSA9IDBvNzAwCiAgICAgICAgICAgICMgRG8gbm90IHNldF9hdHRycyBkaXJlY3RvcmllcywgYXMgd2Ugd2lsbCBkbyB0aGF0IGZ1cnRoZXIgZG93bgogICAgICAgICAgICBzZWxmLmV4dHJhY3QodGFyaW5mbywgcGF0aCwgc2V0X2F0dHJzPW5vdCB0YXJpbmZvLmlzZGlyKCkpCgogICAgICAgICMgUmV2ZXJzZSBzb3J0IGRpcmVjdG9yaWVzLgogICAgICAgIGRpcmVjdG9yaWVzLnNvcnQoa2V5PWxhbWJkYSBhOiBhLm5hbWUpCiAgICAgICAgZGlyZWN0b3JpZXMucmV2ZXJzZSgpCgogICAgICAgICMgU2V0IGNvcnJlY3Qgb3duZXIsIG10aW1lIGFuZCBmaWxlbW9kZSBvbiBkaXJlY3Rvcmllcy4KICAgICAgICBmb3IgdGFyaW5mbyBpbiBkaXJlY3RvcmllczoKICAgICAgICAgICAgZGlycGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB0YXJpbmZvLm5hbWUpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuY2hvd24odGFyaW5mbywgZGlycGF0aCkKICAgICAgICAgICAgICAgIHNlbGYudXRpbWUodGFyaW5mbywgZGlycGF0aCkKICAgICAgICAgICAgICAgIHNlbGYuY2htb2QodGFyaW5mbywgZGlycGF0aCkKICAgICAgICAgICAgZXhjZXB0IEV4dHJhY3RFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMToKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUpCgogICAgZGVmIGV4dHJhY3Qoc2VsZiwgbWVtYmVyLCBwYXRoPSIiLCBzZXRfYXR0cnM9VHJ1ZSk6CiAgICAgICAgIiIiRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LAogICAgICAgICAgIHVzaW5nIGl0cyBmdWxsIG5hbWUuIEl0cyBmaWxlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBhcyBhY2N1cmF0ZWx5CiAgICAgICAgICAgYXMgcG9zc2libGUuIGBtZW1iZXInIG1heSBiZSBhIGZpbGVuYW1lIG9yIGEgVGFySW5mbyBvYmplY3QuIFlvdSBjYW4KICAgICAgICAgICBzcGVjaWZ5IGEgZGlmZmVyZW50IGRpcmVjdG9yeSB1c2luZyBgcGF0aCcuIEZpbGUgYXR0cmlidXRlcyAob3duZXIsCiAgICAgICAgICAgbXRpbWUsIG1vZGUpIGFyZSBzZXQgdW5sZXNzIGBzZXRfYXR0cnMnIGlzIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJyIikKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIHN0cik6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldG1lbWJlcihtZW1iZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgoKICAgICAgICAjIFByZXBhcmUgdGhlIGxpbmsgdGFyZ2V0IGZvciBtYWtlbGluaygpLgogICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKToKICAgICAgICAgICAgdGFyaW5mby5fbGlua190YXJnZXQgPSBvcy5wYXRoLmpvaW4ocGF0aCwgdGFyaW5mby5saW5rbmFtZSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcih0YXJpbmZvLCBvcy5wYXRoLmpvaW4ocGF0aCwgdGFyaW5mby5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2F0dHJzPXNldF9hdHRycykKICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLmVycm9ybGV2ZWwgPiAwOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGUuZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUuc3RyZXJyb3IpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMgJXIiICUgKGUuc3RyZXJyb3IsIGUuZmlsZW5hbWUpKQogICAgICAgIGV4Y2VwdCBFeHRyYWN0RXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUpCgogICAgZGVmIGV4dHJhY3RmaWxlKHNlbGYsIG1lbWJlcik6CiAgICAgICAgIiIiRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIGFzIGEgZmlsZSBvYmplY3QuIGBtZW1iZXInIG1heSBiZQogICAgICAgICAgIGEgZmlsZW5hbWUgb3IgYSBUYXJJbmZvIG9iamVjdC4gSWYgYG1lbWJlcicgaXMgYSByZWd1bGFyIGZpbGUsIGEKICAgICAgICAgICBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJldHVybmVkLiBJZiBgbWVtYmVyJyBpcyBhIGxpbmssIGEgZmlsZS1saWtlCiAgICAgICAgICAgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGxpbmsncyB0YXJnZXQuIElmIGBtZW1iZXInIGlzIG5vbmUgb2YKICAgICAgICAgICB0aGUgYWJvdmUsIE5vbmUgaXMgcmV0dXJuZWQuCiAgICAgICAgICAgVGhlIGZpbGUtbGlrZSBvYmplY3QgaXMgcmVhZC1vbmx5IGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgbWV0aG9kczogcmVhZCgpLCByZWFkbGluZSgpLCByZWFkbGluZXMoKSwgc2VlaygpIGFuZCB0ZWxsKCkKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiciIpCgogICAgICAgIGlmIGlzaW5zdGFuY2UobWVtYmVyLCBzdHIpOgogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXRtZW1iZXIobWVtYmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRhcmluZm8gPSBtZW1iZXIKCiAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqZWN0KHNlbGYsIHRhcmluZm8pCgogICAgICAgIGVsaWYgdGFyaW5mby50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CiAgICAgICAgICAgICMgSWYgYSBtZW1iZXIncyB0eXBlIGlzIHVua25vd24sIGl0IGlzIHRyZWF0ZWQgYXMgYQogICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZS4KICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iamVjdChzZWxmLCB0YXJpbmZvKQoKICAgICAgICBlbGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5maWxlb2JqLCBfU3RyZWFtKToKICAgICAgICAgICAgICAgICMgQSBzbWFsbCBidXQgdWdseSB3b3JrYXJvdW5kIGZvciB0aGUgY2FzZSB0aGF0IHNvbWVvbmUgdHJpZXMKICAgICAgICAgICAgICAgICMgdG8gZXh0cmFjdCBhIChzeW0pbGluayBhcyBhIGZpbGUtb2JqZWN0IGZyb20gYSBub24tc2Vla2FibGUKICAgICAgICAgICAgICAgICMgc3RyZWFtIG9mIHRhciBibG9ja3MuCiAgICAgICAgICAgICAgICByYWlzZSBTdHJlYW1FcnJvcigiY2Fubm90IGV4dHJhY3QgKHN5bSlsaW5rIGFzIGZpbGUgb2JqZWN0IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgQSAoc3ltKWxpbmsncyBmaWxlIG9iamVjdCBpcyBpdHMgdGFyZ2V0J3MgZmlsZSBvYmplY3QuCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5leHRyYWN0ZmlsZShzZWxmLl9maW5kX2xpbmtfdGFyZ2V0KHRhcmluZm8pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgSWYgdGhlcmUncyBubyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtYmVyIChkaXJlY3RvcnksIGNocmRldiwKICAgICAgICAgICAgIyBibGtkZXYsIGV0Yy4pLCByZXR1cm4gTm9uZSBpbnN0ZWFkIG9mIGEgZmlsZSBvYmplY3QuCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9leHRyYWN0X21lbWJlcihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoLCBzZXRfYXR0cnM9VHJ1ZSk6CiAgICAgICAgIiIiRXh0cmFjdCB0aGUgVGFySW5mbyBvYmplY3QgdGFyaW5mbyB0byBhIHBoeXNpY2FsCiAgICAgICAgICAgZmlsZSBjYWxsZWQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICAjIEZldGNoIHRoZSBUYXJJbmZvIG9iamVjdCBmb3IgdGhlIGdpdmVuIG5hbWUKICAgICAgICAjIGFuZCBidWlsZCB0aGUgZGVzdGluYXRpb24gcGF0aG5hbWUsIHJlcGxhY2luZwogICAgICAgICMgZm9yd2FyZCBzbGFzaGVzIHRvIHBsYXRmb3JtIHNwZWNpZmljIHNlcGFyYXRvcnMuCiAgICAgICAgdGFyZ2V0cGF0aCA9IHRhcmdldHBhdGgucnN0cmlwKCIvIikKICAgICAgICB0YXJnZXRwYXRoID0gdGFyZ2V0cGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICAgICAgICAjIENyZWF0ZSBhbGwgdXBwZXIgZGlyZWN0b3JpZXMuCiAgICAgICAgdXBwZXJkaXJzID0gb3MucGF0aC5kaXJuYW1lKHRhcmdldHBhdGgpCiAgICAgICAgaWYgdXBwZXJkaXJzIGFuZCBub3Qgb3MucGF0aC5leGlzdHModXBwZXJkaXJzKToKICAgICAgICAgICAgIyBDcmVhdGUgZGlyZWN0b3JpZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGFyY2hpdmUgd2l0aAogICAgICAgICAgICAjIGRlZmF1bHQgcGVybWlzc2lvbnMuCiAgICAgICAgICAgIG9zLm1ha2VkaXJzKHVwcGVyZGlycykKCiAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpIG9yIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgc2VsZi5fZGJnKDEsICIlcyAtPiAlcyIgJSAodGFyaW5mby5uYW1lLCB0YXJpbmZvLmxpbmtuYW1lKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9kYmcoMSwgdGFyaW5mby5uYW1lKQoKICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8uaXNkaXIoKToKICAgICAgICAgICAgc2VsZi5tYWtlZGlyKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzZmlmbygpOgogICAgICAgICAgICBzZWxmLm1ha2VmaWZvKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzY2hyKCkgb3IgdGFyaW5mby5pc2JsaygpOgogICAgICAgICAgICBzZWxmLm1ha2VkZXYodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWxpbmsodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgogICAgICAgICAgICBzZWxmLm1ha2V1bmtub3duKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYWtlZmlsZSh0YXJpbmZvLCB0YXJnZXRwYXRoKQoKICAgICAgICBpZiBzZXRfYXR0cnM6CiAgICAgICAgICAgIHNlbGYuY2hvd24odGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgaWYgbm90IHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgICAgIHNlbGYuY2htb2QodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgICAgIHNlbGYudXRpbWUodGFyaW5mbywgdGFyZ2V0cGF0aCkKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgQmVsb3cgYXJlIHRoZSBkaWZmZXJlbnQgZmlsZSBtZXRob2RzLiBUaGV5IGFyZSBjYWxsZWQgdmlhCiAgICAjIF9leHRyYWN0X21lbWJlcigpIHdoZW4gZXh0cmFjdCgpIGlzIGNhbGxlZC4gVGhleSBjYW4gYmUgcmVwbGFjZWQgaW4gYQogICAgIyBzdWJjbGFzcyB0byBpbXBsZW1lbnQgb3RoZXIgZnVuY3Rpb25hbGl0eS4KCiAgICBkZWYgbWFrZWRpcihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgZGlyZWN0b3J5IGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBVc2UgYSBzYWZlIG1vZGUgZm9yIHRoZSBkaXJlY3RvcnksIHRoZSByZWFsIG1vZGUgaXMgc2V0CiAgICAgICAgICAgICMgbGF0ZXIgaW4gX2V4dHJhY3RfbWVtYmVyKCkuCiAgICAgICAgICAgIG9zLm1rZGlyKHRhcmdldHBhdGgsIDBvNzAwKQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICAgICAgcmFpc2UKCiAgICBkZWYgbWFrZWZpbGUoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIGZpbGUgY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgc291cmNlID0gc2VsZi5maWxlb2JqCiAgICAgICAgc291cmNlLnNlZWsodGFyaW5mby5vZmZzZXRfZGF0YSkKICAgICAgICB0YXJnZXQgPSBibHRuX29wZW4odGFyZ2V0cGF0aCwgIndiIikKICAgICAgICBpZiB0YXJpbmZvLnNwYXJzZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIG9mZnNldCwgc2l6ZSBpbiB0YXJpbmZvLnNwYXJzZToKICAgICAgICAgICAgICAgIHRhcmdldC5zZWVrKG9mZnNldCkKICAgICAgICAgICAgICAgIGNvcHlmaWxlb2JqKHNvdXJjZSwgdGFyZ2V0LCBzaXplKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvcHlmaWxlb2JqKHNvdXJjZSwgdGFyZ2V0LCB0YXJpbmZvLnNpemUpCiAgICAgICAgdGFyZ2V0LnNlZWsodGFyaW5mby5zaXplKQogICAgICAgIHRhcmdldC50cnVuY2F0ZSgpCiAgICAgICAgdGFyZ2V0LmNsb3NlKCkKCiAgICBkZWYgbWFrZXVua25vd24oc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIGZpbGUgZnJvbSBhIFRhckluZm8gb2JqZWN0IHdpdGggYW4gdW5rbm93biB0eXBlCiAgICAgICAgICAgYXQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiBVbmtub3duIGZpbGUgdHlwZSAlciwgIiBcCiAgICAgICAgICAgICAgICAgICAgICJleHRyYWN0ZWQgYXMgcmVndWxhciBmaWxlLiIgJSB0YXJpbmZvLnR5cGUpCgogICAgZGVmIG1ha2VmaWZvKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBmaWZvIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIGlmIGhhc2F0dHIob3MsICJta2ZpZm8iKToKICAgICAgICAgICAgb3MubWtmaWZvKHRhcmdldHBhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJmaWZvIG5vdCBzdXBwb3J0ZWQgYnkgc3lzdGVtIikKCiAgICBkZWYgbWFrZWRldihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgY2hhcmFjdGVyIG9yIGJsb2NrIGRldmljZSBjYWxsZWQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgIm1rbm9kIikgb3Igbm90IGhhc2F0dHIob3MsICJtYWtlZGV2Iik6CiAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigic3BlY2lhbCBkZXZpY2VzIG5vdCBzdXBwb3J0ZWQgYnkgc3lzdGVtIikKCiAgICAgICAgbW9kZSA9IHRhcmluZm8ubW9kZQogICAgICAgIGlmIHRhcmluZm8uaXNibGsoKToKICAgICAgICAgICAgbW9kZSB8PSBzdGF0LlNfSUZCTEsKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RlIHw9IHN0YXQuU19JRkNIUgoKICAgICAgICBvcy5ta25vZCh0YXJnZXRwYXRoLCBtb2RlLAogICAgICAgICAgICAgICAgIG9zLm1ha2VkZXYodGFyaW5mby5kZXZtYWpvciwgdGFyaW5mby5kZXZtaW5vcikpCgogICAgZGVmIG1ha2VsaW5rKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSAoc3ltYm9saWMpIGxpbmsgY2FsbGVkIHRhcmdldHBhdGguIElmIGl0IGNhbm5vdCBiZSBjcmVhdGVkCiAgICAgICAgICAocGxhdGZvcm0gbGltaXRhdGlvbiksIHdlIHRyeSB0byBtYWtlIGEgY29weSBvZiB0aGUgcmVmZXJlbmNlZCBmaWxlCiAgICAgICAgICBpbnN0ZWFkIG9mIGEgbGluay4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgRm9yIHN5c3RlbXMgdGhhdCBzdXBwb3J0IHN5bWJvbGljIGFuZCBoYXJkIGxpbmtzLgogICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgICAgICBvcy5zeW1saW5rKHRhcmluZm8ubGlua25hbWUsIHRhcmdldHBhdGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFNlZSBleHRyYWN0KCkuCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0YXJpbmZvLl9saW5rX3RhcmdldCk6CiAgICAgICAgICAgICAgICAgICAgb3MubGluayh0YXJpbmZvLl9saW5rX3RhcmdldCwgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9tZW1iZXIoc2VsZi5fZmluZF9saW5rX3RhcmdldCh0YXJpbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRwYXRoKQogICAgICAgIGV4Y2VwdCBzeW1saW5rX2V4Y2VwdGlvbjoKICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAgICAgbGlua3BhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHRhcmluZm8ubmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGlua3BhdGggPSB0YXJpbmZvLmxpbmtuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9tZW1iZXIoc2VsZi5fZmluZF9saW5rX3RhcmdldCh0YXJpbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHBhdGgpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigidW5hYmxlIHRvIHJlc29sdmUgbGluayBpbnNpZGUgYXJjaGl2ZSIpCgogICAgZGVmIGNob3duKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIlNldCBvd25lciBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgogICAgICAgICIiIgogICAgICAgIGlmIHB3ZCBhbmQgaGFzYXR0cihvcywgImdldGV1aWQiKSBhbmQgb3MuZ2V0ZXVpZCgpID09IDA6CiAgICAgICAgICAgICMgV2UgaGF2ZSB0byBiZSByb290IHRvIGRvIHNvLgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBnID0gZ3JwLmdldGdybmFtKHRhcmluZm8uZ25hbWUpWzJdCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIGcgPSB0YXJpbmZvLmdpZAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB1ID0gcHdkLmdldHB3bmFtKHRhcmluZm8udW5hbWUpWzJdCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHUgPSB0YXJpbmZvLnVpZAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCkgYW5kIGhhc2F0dHIob3MsICJsY2hvd24iKToKICAgICAgICAgICAgICAgICAgICBvcy5sY2hvd24odGFyZ2V0cGF0aCwgdSwgZykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJvczJlbXgiOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5jaG93bih0YXJnZXRwYXRoLCB1LCBnKQogICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG93bmVyIikKCiAgICBkZWYgY2htb2Qoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiU2V0IGZpbGUgcGVybWlzc2lvbnMgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KICAgICAgICAiIiIKICAgICAgICBpZiBoYXNhdHRyKG9zLCAnY2htb2QnKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MuY2htb2QodGFyZ2V0cGF0aCwgdGFyaW5mby5tb2RlKQogICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG1vZGUiKQoKICAgIGRlZiB1dGltZShzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJTZXQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgJ3V0aW1lJyk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRyeToKICAgICAgICAgICAgb3MudXRpbWUodGFyZ2V0cGF0aCwgKHRhcmluZm8ubXRpbWUsIHRhcmluZm8ubXRpbWUpKQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiY291bGQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gdGltZSIpCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGFzIGEgVGFySW5mbyBvYmplY3QsIHdoZW4KICAgICAgICAgICBUYXJGaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZy4gUmV0dXJuIE5vbmUgaWYgdGhlcmUgaXMgbm8gbW9yZQogICAgICAgICAgIGF2YWlsYWJsZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygicmEiKQogICAgICAgIGlmIHNlbGYuZmlyc3RtZW1iZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG0gPSBzZWxmLmZpcnN0bWVtYmVyCiAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCiAgICAgICAgICAgIHJldHVybiBtCgogICAgICAgICMgUmVhZCB0aGUgbmV4dCBibG9jay4KICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCkKICAgICAgICB0YXJpbmZvID0gTm9uZQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmluZm8uZnJvbXRhcmZpbGUoc2VsZikKICAgICAgICAgICAgZXhjZXB0IEVPRkhlYWRlckVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgIjB4JVg6ICVzIiAlIChzZWxmLm9mZnNldCwgZSkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRIZWFkZXJFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVfemVyb3M6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiAlcyIgJSAoc2VsZi5vZmZzZXQsIGUpKQogICAgICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYub2Zmc2V0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKHN0cihlKSkKICAgICAgICAgICAgZXhjZXB0IEVtcHR5SGVhZGVyRXJyb3I6CiAgICAgICAgICAgICAgICBpZiBzZWxmLm9mZnNldCA9PSAwOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiZW1wdHkgZmlsZSIpCiAgICAgICAgICAgIGV4Y2VwdCBUcnVuY2F0ZWRIZWFkZXJFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5vZmZzZXQgPT0gMDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQogICAgICAgICAgICBleGNlcHQgU3Vic2VxdWVudEhlYWRlckVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQogICAgICAgICAgICBicmVhawoKICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQoKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBMaXR0bGUgaGVscGVyIG1ldGhvZHM6CgogICAgZGVmIF9nZXRtZW1iZXIoc2VsZiwgbmFtZSwgdGFyaW5mbz1Ob25lLCBub3JtYWxpemU9RmFsc2UpOgogICAgICAgICIiIkZpbmQgYW4gYXJjaGl2ZSBtZW1iZXIgYnkgbmFtZSBmcm9tIGJvdHRvbSB0byB0b3AuCiAgICAgICAgICAgSWYgdGFyaW5mbyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICAgIiIiCiAgICAgICAgIyBFbnN1cmUgdGhhdCBhbGwgbWVtYmVycyBoYXZlIGJlZW4gbG9hZGVkLgogICAgICAgIG1lbWJlcnMgPSBzZWxmLmdldG1lbWJlcnMoKQoKICAgICAgICAjIExpbWl0IHRoZSBtZW1iZXIgc2VhcmNoIGxpc3QgdXAgdG8gdGFyaW5mby4KICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgogICAgICAgICAgICBtZW1iZXJzID0gbWVtYmVyc1s6bWVtYmVycy5pbmRleCh0YXJpbmZvKV0KCiAgICAgICAgaWYgbm9ybWFsaXplOgogICAgICAgICAgICBuYW1lID0gb3MucGF0aC5ub3JtcGF0aChuYW1lKQoKICAgICAgICBmb3IgbWVtYmVyIGluIHJldmVyc2VkKG1lbWJlcnMpOgogICAgICAgICAgICBpZiBub3JtYWxpemU6CiAgICAgICAgICAgICAgICBtZW1iZXJfbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgobWVtYmVyLm5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtZW1iZXJfbmFtZSA9IG1lbWJlci5uYW1lCgogICAgICAgICAgICBpZiBuYW1lID09IG1lbWJlcl9uYW1lOgogICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcgoKICAgIGRlZiBfbG9hZChzZWxmKToKICAgICAgICAiIiJSZWFkIHRocm91Z2ggdGhlIGVudGlyZSBhcmNoaXZlIGZpbGUgYW5kIGxvb2sgZm9yIHJlYWRhYmxlCiAgICAgICAgICAgbWVtYmVycy4KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5uZXh0KCkKICAgICAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCgogICAgZGVmIF9jaGVjayhzZWxmLCBtb2RlPU5vbmUpOgogICAgICAgICIiIkNoZWNrIGlmIFRhckZpbGUgaXMgc3RpbGwgb3BlbiwgYW5kIGlmIHRoZSBvcGVyYXRpb24ncyBtb2RlCiAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gVGFyRmlsZSdzIG1vZGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIiVzIGlzIGNsb3NlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKICAgICAgICBpZiBtb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLm1vZGUgbm90IGluIG1vZGU6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImJhZCBvcGVyYXRpb24gZm9yIG1vZGUgJXIiICUgc2VsZi5tb2RlKQoKICAgIGRlZiBfZmluZF9saW5rX3RhcmdldChzZWxmLCB0YXJpbmZvKToKICAgICAgICAiIiJGaW5kIHRoZSB0YXJnZXQgbWVtYmVyIG9mIGEgc3ltbGluayBvciBoYXJkbGluayBtZW1iZXIgaW4gdGhlCiAgICAgICAgICAgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgICMgQWx3YXlzIHNlYXJjaCB0aGUgZW50aXJlIGFyY2hpdmUuCiAgICAgICAgICAgIGxpbmtuYW1lID0gb3MucGF0aC5kaXJuYW1lKHRhcmluZm8ubmFtZSkgKyAiLyIgKyB0YXJpbmZvLmxpbmtuYW1lCiAgICAgICAgICAgIGxpbWl0ID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgU2VhcmNoIHRoZSBhcmNoaXZlIGJlZm9yZSB0aGUgbGluaywgYmVjYXVzZSBhIGhhcmQgbGluayBpcwogICAgICAgICAgICAjIGp1c3QgYSByZWZlcmVuY2UgdG8gYW4gYWxyZWFkeSBhcmNoaXZlZCBmaWxlLgogICAgICAgICAgICBsaW5rbmFtZSA9IHRhcmluZm8ubGlua25hbWUKICAgICAgICAgICAgbGltaXQgPSB0YXJpbmZvCgogICAgICAgIG1lbWJlciA9IHNlbGYuX2dldG1lbWJlcihsaW5rbmFtZSwgdGFyaW5mbz1saW1pdCwgbm9ybWFsaXplPVRydWUpCiAgICAgICAgaWYgbWVtYmVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJsaW5rbmFtZSAlciBub3QgZm91bmQiICUgbGlua25hbWUpCiAgICAgICAgcmV0dXJuIG1lbWJlcgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJQcm92aWRlIGFuIGl0ZXJhdG9yIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9sb2FkZWQ6CiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYubWVtYmVycykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gVGFySXRlcihzZWxmKQoKICAgIGRlZiBfZGJnKHNlbGYsIGxldmVsLCBtc2cpOgogICAgICAgICIiIldyaXRlIGRlYnVnZ2luZyBvdXRwdXQgdG8gc3lzLnN0ZGVyci4KICAgICAgICAiIiIKICAgICAgICBpZiBsZXZlbCA8PSBzZWxmLmRlYnVnOgogICAgICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVycikKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICBpZiB0eXBlIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQW4gZXhjZXB0aW9uIG9jY3VycmVkLiBXZSBtdXN0IG5vdCBjYWxsIGNsb3NlKCkgYmVjYXVzZQogICAgICAgICAgICAjIGl0IHdvdWxkIHRyeSB0byB3cml0ZSBlbmQtb2YtYXJjaGl2ZSBibG9ja3MgYW5kIHBhZGRpbmcuCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCiMgY2xhc3MgVGFyRmlsZQoKY2xhc3MgVGFySXRlcihvYmplY3QpOgogICAgIiIiSXRlcmF0b3IgQ2xhc3MuCgogICAgICAgZm9yIHRhcmluZm8gaW4gVGFyRmlsZSguLi4pOgogICAgICAgICAgIHN1aXRlLi4uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySXRlciBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi50YXJmaWxlID0gdGFyZmlsZQogICAgICAgIHNlbGYuaW5kZXggPSAwCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGl0ZXJhdG9yIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX25leHRfXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgaXRlbSB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KICAgICAgICAgICBXaGVuIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkLCBzZXQgVGFyRmlsZSBhcyBfbG9hZGVkLgogICAgICAgICIiIgogICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgogICAgICAgICMgaGFwcGVuIHRoYXQgZ2V0bWVtYmVycygpIGlzIGNhbGxlZCBkdXJpbmcgaXRlcmF0aW9uLAogICAgICAgICMgd2hpY2ggd2lsbCBjYXVzZSBUYXJJdGVyIHRvIHN0b3AgcHJlbWF0dXJlbHkuCiAgICAgICAgaWYgbm90IHNlbGYudGFyZmlsZS5fbG9hZGVkOgogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm5leHQoKQogICAgICAgICAgICBpZiBub3QgdGFyaW5mbzoKICAgICAgICAgICAgICAgIHNlbGYudGFyZmlsZS5fbG9hZGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubWVtYmVyc1tzZWxmLmluZGV4XQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBzZWxmLmluZGV4ICs9IDEKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgIG5leHQgPSBfX25leHRfXyAjIGZvciBQeXRob24gMi54CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBleHBvcnRlZCBmdW5jdGlvbnMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tCmRlZiBpc190YXJmaWxlKG5hbWUpOgogICAgIiIiUmV0dXJuIFRydWUgaWYgbmFtZSBwb2ludHMgdG8gYSB0YXIgYXJjaGl2ZSB0aGF0IHdlCiAgICAgICBhcmUgYWJsZSB0byBoYW5kbGUsIGVsc2UgcmV0dXJuIEZhbHNlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgdCA9IG9wZW4obmFtZSkKICAgICAgICB0LmNsb3NlKCkKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0IFRhckVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQoKYmx0bl9vcGVuID0gb3BlbgpvcGVuID0gVGFyRmlsZS5vcGVuClBLAwQUAAAAAAAAACEAXwlzYGGfAABhnwAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9jb21wYXQucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3lzCgp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHNzbCA9IE5vbmUKCmlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKICAgIGZyb20gdHlwZXMgaW1wb3J0IEZpbGVUeXBlIGFzIGZpbGVfdHlwZQogICAgaW1wb3J0IF9fYnVpbHRpbl9fIGFzIGJ1aWx0aW5zCiAgICBpbXBvcnQgQ29uZmlnUGFyc2VyIGFzIGNvbmZpZ3BhcnNlcgogICAgZnJvbSAuX2JhY2twb3J0IGltcG9ydCBzaHV0aWwKICAgIGZyb20gdXJscGFyc2UgaW1wb3J0IHVybHBhcnNlLCB1cmx1bnBhcnNlLCB1cmxqb2luLCB1cmxzcGxpdCwgdXJsdW5zcGxpdAogICAgZnJvbSB1cmxsaWIgaW1wb3J0ICh1cmxyZXRyaWV2ZSwgcXVvdGUgYXMgX3F1b3RlLCB1bnF1b3RlLCB1cmwycGF0aG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lMnVybCwgQ29udGVudFRvb1Nob3J0RXJyb3IsIHNwbGl0dHlwZSkKCiAgICBkZWYgcXVvdGUocyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCB1bmljb2RlKToKICAgICAgICAgICAgcyA9IHMuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcmV0dXJuIF9xdW90ZShzKQoKICAgIGltcG9ydCB1cmxsaWIyCiAgICBmcm9tIHVybGxpYjIgaW1wb3J0IChSZXF1ZXN0LCB1cmxvcGVuLCBVUkxFcnJvciwgSFRUUEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2ljQXV0aEhhbmRsZXIsIEhUVFBQYXNzd29yZE1nciwKICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBIYW5kbGVyLCBIVFRQUmVkaXJlY3RIYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfb3BlbmVyKQogICAgaWYgc3NsOgogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgSFRUUFNIYW5kbGVyCiAgICBpbXBvcnQgaHR0cGxpYgogICAgaW1wb3J0IHhtbHJwY2xpYgogICAgaW1wb3J0IFF1ZXVlIGFzIHF1ZXVlCiAgICBmcm9tIEhUTUxQYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIKICAgIGltcG9ydCBodG1sZW50aXR5ZGVmcwogICAgcmF3X2lucHV0ID0gcmF3X2lucHV0CiAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaWZpbHRlciBhcyBmaWx0ZXIKICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBpZmlsdGVyZmFsc2UgYXMgZmlsdGVyZmFsc2UKCiAgICBfdXNlcnByb2cgPSBOb25lCiAgICBkZWYgc3BsaXR1c2VyKGhvc3QpOgogICAgICAgICIiInNwbGl0dXNlcigndXNlcls6cGFzc3dkXUBob3N0Wzpwb3J0XScpIC0tPiAndXNlcls6cGFzc3dkXScsICdob3N0Wzpwb3J0XScuIiIiCiAgICAgICAgZ2xvYmFsIF91c2VycHJvZwogICAgICAgIGlmIF91c2VycHJvZyBpcyBOb25lOgogICAgICAgICAgICBpbXBvcnQgcmUKICAgICAgICAgICAgX3VzZXJwcm9nID0gcmUuY29tcGlsZSgnXiguKilAKC4qKSQnKQoKICAgICAgICBtYXRjaCA9IF91c2VycHJvZy5tYXRjaChob3N0KQogICAgICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKICAgICAgICByZXR1cm4gTm9uZSwgaG9zdAoKZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KICAgIHN0cmluZ190eXBlcyA9IHN0ciwKICAgIHRleHRfdHlwZSA9IHN0cgogICAgZnJvbSBpbyBpbXBvcnQgVGV4dElPV3JhcHBlciBhcyBmaWxlX3R5cGUKICAgIGltcG9ydCBidWlsdGlucwogICAgaW1wb3J0IGNvbmZpZ3BhcnNlcgogICAgaW1wb3J0IHNodXRpbAogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0ICh1cmxwYXJzZSwgdXJsdW5wYXJzZSwgdXJsam9pbiwgc3BsaXR1c2VyLCBxdW90ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5xdW90ZSwgdXJsc3BsaXQsIHVybHVuc3BsaXQsIHNwbGl0dHlwZSkKICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0ICh1cmxvcGVuLCB1cmxyZXRyaWV2ZSwgUmVxdWVzdCwgdXJsMnBhdGhuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lMnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzaWNBdXRoSGFuZGxlciwgSFRUUFBhc3N3b3JkTWdyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBIYW5kbGVyLCBIVFRQUmVkaXJlY3RIYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX29wZW5lcikKICAgIGlmIHNzbDoKICAgICAgICBmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCBIVFRQU0hhbmRsZXIKICAgIGZyb20gdXJsbGliLmVycm9yIGltcG9ydCBIVFRQRXJyb3IsIFVSTEVycm9yLCBDb250ZW50VG9vU2hvcnRFcnJvcgogICAgaW1wb3J0IGh0dHAuY2xpZW50IGFzIGh0dHBsaWIKICAgIGltcG9ydCB1cmxsaWIucmVxdWVzdCBhcyB1cmxsaWIyCiAgICBpbXBvcnQgeG1scnBjLmNsaWVudCBhcyB4bWxycGNsaWIKICAgIGltcG9ydCBxdWV1ZQogICAgZnJvbSBodG1sLnBhcnNlciBpbXBvcnQgSFRNTFBhcnNlcgogICAgaW1wb3J0IGh0bWwuZW50aXRpZXMgYXMgaHRtbGVudGl0eWRlZnMKICAgIHJhd19pbnB1dCA9IGlucHV0CiAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgZmlsdGVyZmFsc2UKICAgIGZpbHRlciA9IGZpbHRlcgoKdHJ5OgogICAgZnJvbSBzc2wgaW1wb3J0IG1hdGNoX2hvc3RuYW1lLCBDZXJ0aWZpY2F0ZUVycm9yCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBjbGFzcyBDZXJ0aWZpY2F0ZUVycm9yKFZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCgogICAgZGVmIF9kbnNuYW1lX21hdGNoKGRuLCBob3N0bmFtZSwgbWF4X3dpbGRjYXJkcz0xKToKICAgICAgICAiIiJNYXRjaGluZyBhY2NvcmRpbmcgdG8gUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMKCiAgICAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjEyNSNzZWN0aW9uLTYuNC4zCiAgICAgICAgIiIiCiAgICAgICAgcGF0cyA9IFtdCiAgICAgICAgaWYgbm90IGRuOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcGFydHMgPSBkbi5zcGxpdCgnLicpCiAgICAgICAgbGVmdG1vc3QsIHJlbWFpbmRlciA9IHBhcnRzWzBdLCBwYXJ0c1sxOl0KCiAgICAgICAgd2lsZGNhcmRzID0gbGVmdG1vc3QuY291bnQoJyonKQogICAgICAgIGlmIHdpbGRjYXJkcyA+IG1heF93aWxkY2FyZHM6CiAgICAgICAgICAgICMgSXNzdWUgIzE3OTgwOiBhdm9pZCBkZW5pYWxzIG9mIHNlcnZpY2UgYnkgcmVmdXNpbmcgbW9yZQogICAgICAgICAgICAjIHRoYW4gb25lIHdpbGRjYXJkIHBlciBmcmFnbWVudC4gIEEgc3VydmV5IG9mIGVzdGFibGlzaGVkCiAgICAgICAgICAgICMgcG9saWN5IGFtb25nIFNTTCBpbXBsZW1lbnRhdGlvbnMgc2hvd2VkIGl0IHRvIGJlIGEKICAgICAgICAgICAgIyByZWFzb25hYmxlIGNob2ljZS4KICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigKICAgICAgICAgICAgICAgICJ0b28gbWFueSB3aWxkY2FyZHMgaW4gY2VydGlmaWNhdGUgRE5TIG5hbWU6ICIgKyByZXByKGRuKSkKCiAgICAgICAgIyBzcGVlZCB1cCBjb21tb24gY2FzZSB3L28gd2lsZGNhcmRzCiAgICAgICAgaWYgbm90IHdpbGRjYXJkczoKICAgICAgICAgICAgcmV0dXJuIGRuLmxvd2VyKCkgPT0gaG9zdG5hbWUubG93ZXIoKQoKICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDEuCiAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyIGluIHdoaWNoCiAgICAgICAgIyB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGNvbXByaXNlcyBhIGxhYmVsIG90aGVyIHRoYW4gdGhlIGxlZnQtbW9zdCBsYWJlbC4KICAgICAgICBpZiBsZWZ0bW9zdCA9PSAnKic6CiAgICAgICAgICAgICMgV2hlbiAnKicgaXMgYSBmcmFnbWVudCBieSBpdHNlbGYsIGl0IG1hdGNoZXMgYSBub24tZW1wdHkgZG90bGVzcwogICAgICAgICAgICAjIGZyYWdtZW50LgogICAgICAgICAgICBwYXRzLmFwcGVuZCgnW14uXSsnKQogICAgICAgIGVsaWYgbGVmdG1vc3Quc3RhcnRzd2l0aCgneG4tLScpIG9yIGhvc3RuYW1lLnN0YXJ0c3dpdGgoJ3huLS0nKToKICAgICAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAzLgogICAgICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIKICAgICAgICAgICAgIyB3aGVyZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGlzIGVtYmVkZGVkIHdpdGhpbiBhbiBBLWxhYmVsIG9yCiAgICAgICAgICAgICMgVS1sYWJlbCBvZiBhbiBpbnRlcm5hdGlvbmFsaXplZCBkb21haW4gbmFtZS4KICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE90aGVyd2lzZSwgJyonIG1hdGNoZXMgYW55IGRvdGxlc3Mgc3RyaW5nLCBlLmcuIHd3dyoKICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KS5yZXBsYWNlKHInXConLCAnW14uXSonKSkKCiAgICAgICAgIyBhZGQgdGhlIHJlbWFpbmluZyBmcmFnbWVudHMsIGlnbm9yZSBhbnkgd2lsZGNhcmRzCiAgICAgICAgZm9yIGZyYWcgaW4gcmVtYWluZGVyOgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUoZnJhZykpCgogICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocidcQScgKyByJ1wuJy5qb2luKHBhdHMpICsgcidcWicsIHJlLklHTk9SRUNBU0UpCiAgICAgICAgcmV0dXJuIHBhdC5tYXRjaChob3N0bmFtZSkKCgogICAgZGVmIG1hdGNoX2hvc3RuYW1lKGNlcnQsIGhvc3RuYW1lKToKICAgICAgICAiIiJWZXJpZnkgdGhhdCAqY2VydCogKGluIGRlY29kZWQgZm9ybWF0IGFzIHJldHVybmVkIGJ5CiAgICAgICAgU1NMU29ja2V0LmdldHBlZXJjZXJ0KCkpIG1hdGNoZXMgdGhlICpob3N0bmFtZSouICBSRkMgMjgxOCBhbmQgUkZDIDYxMjUKICAgICAgICBydWxlcyBhcmUgZm9sbG93ZWQsIGJ1dCBJUCBhZGRyZXNzZXMgYXJlIG5vdCBhY2NlcHRlZCBmb3IgKmhvc3RuYW1lKi4KCiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciBpcyByYWlzZWQgb24gZmFpbHVyZS4gT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJucyBub3RoaW5nLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBjZXJ0OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBvciBubyBjZXJ0aWZpY2F0ZSwgbWF0Y2hfaG9zdG5hbWUgbmVlZHMgYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNTTCBzb2NrZXQgb3IgU1NMIGNvbnRleHQgd2l0aCBlaXRoZXIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRVJUX09QVElPTkFMIG9yIENFUlRfUkVRVUlSRUQiKQogICAgICAgIGRuc25hbWVzID0gW10KICAgICAgICBzYW4gPSBjZXJ0LmdldCgnc3ViamVjdEFsdE5hbWUnLCAoKSkKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzYW46CiAgICAgICAgICAgIGlmIGtleSA9PSAnRE5TJzoKICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICAgICAgaWYgbm90IGRuc25hbWVzOgogICAgICAgICAgICAjIFRoZSBzdWJqZWN0IGlzIG9ubHkgY2hlY2tlZCB3aGVuIHRoZXJlIGlzIG5vIGROU05hbWUgZW50cnkKICAgICAgICAgICAgIyBpbiBzdWJqZWN0QWx0TmFtZQogICAgICAgICAgICBmb3Igc3ViIGluIGNlcnQuZ2V0KCdzdWJqZWN0JywgKCkpOgogICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc3ViOgogICAgICAgICAgICAgICAgICAgICMgWFhYIGFjY29yZGluZyB0byBSRkMgMjgxOCwgdGhlIG1vc3Qgc3BlY2lmaWMgQ29tbW9uIE5hbWUKICAgICAgICAgICAgICAgICAgICAjIG11c3QgYmUgdXNlZC4KICAgICAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1vbk5hbWUnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBsZW4oZG5zbmFtZXMpID4gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggZWl0aGVyIG9mICVzIgogICAgICAgICAgICAgICAgJSAoaG9zdG5hbWUsICcsICcuam9pbihtYXAocmVwciwgZG5zbmFtZXMpKSkpCiAgICAgICAgZWxpZiBsZW4oZG5zbmFtZXMpID09IDE6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgICAgICJkb2Vzbid0IG1hdGNoICVyIgogICAgICAgICAgICAgICAgJSAoaG9zdG5hbWUsIGRuc25hbWVzWzBdKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJubyBhcHByb3ByaWF0ZSBjb21tb25OYW1lIG9yICIKICAgICAgICAgICAgICAgICJzdWJqZWN0QWx0TmFtZSBmaWVsZHMgd2VyZSBmb3VuZCIpCgoKdHJ5OgogICAgZnJvbSB0eXBlcyBpbXBvcnQgU2ltcGxlTmFtZXNwYWNlIGFzIENvbnRhaW5lcgpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIGNsYXNzIENvbnRhaW5lcihvYmplY3QpOgogICAgICAgICIiIgogICAgICAgIEEgZ2VuZXJpYyBjb250YWluZXIgZm9yIHdoZW4gbXVsdGlwbGUgdmFsdWVzIG5lZWQgdG8gYmUgcmV0dXJuZWQKICAgICAgICAiIiIKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShrd2FyZ3MpCgoKdHJ5OgogICAgZnJvbSBzaHV0aWwgaW1wb3J0IHdoaWNoCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgIyBJbXBsZW1lbnRhdGlvbiBmcm9tIFB5dGhvbiAzLjMKICAgIGRlZiB3aGljaChjbWQsIG1vZGU9b3MuRl9PSyB8IG9zLlhfT0ssIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiR2l2ZW4gYSBjb21tYW5kLCBtb2RlLCBhbmQgYSBQQVRIIHN0cmluZywgcmV0dXJuIHRoZSBwYXRoIHdoaWNoCiAgICAgICAgY29uZm9ybXMgdG8gdGhlIGdpdmVuIG1vZGUgb24gdGhlIFBBVEgsIG9yIE5vbmUgaWYgdGhlcmUgaXMgbm8gc3VjaAogICAgICAgIGZpbGUuCgogICAgICAgIGBtb2RlYCBkZWZhdWx0cyB0byBvcy5GX09LIHwgb3MuWF9PSy4gYHBhdGhgIGRlZmF1bHRzIHRvIHRoZSByZXN1bHQKICAgICAgICBvZiBvcy5lbnZpcm9uLmdldCgiUEFUSCIpLCBvciBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY3VzdG9tIHNlYXJjaAogICAgICAgIHBhdGguCgogICAgICAgICIiIgogICAgICAgICMgQ2hlY2sgdGhhdCBhIGdpdmVuIGZpbGUgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIGNvcnJlY3QgbW9kZS4KICAgICAgICAjIEFkZGl0aW9uYWxseSBjaGVjayB0aGF0IGBmaWxlYCBpcyBub3QgYSBkaXJlY3RvcnksIGFzIG9uIFdpbmRvd3MKICAgICAgICAjIGRpcmVjdG9yaWVzIHBhc3MgdGhlIG9zLmFjY2VzcyBjaGVjay4KICAgICAgICBkZWYgX2FjY2Vzc19jaGVjayhmbiwgbW9kZSk6CiAgICAgICAgICAgIHJldHVybiAob3MucGF0aC5leGlzdHMoZm4pIGFuZCBvcy5hY2Nlc3MoZm4sIG1vZGUpCiAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKGZuKSkKCiAgICAgICAgIyBJZiB3ZSdyZSBnaXZlbiBhIHBhdGggd2l0aCBhIGRpcmVjdG9yeSBwYXJ0LCBsb29rIGl0IHVwIGRpcmVjdGx5IHJhdGhlcgogICAgICAgICMgdGhhbiByZWZlcnJpbmcgdG8gUEFUSCBkaXJlY3Rvcmllcy4gVGhpcyBpbmNsdWRlcyBjaGVja2luZyByZWxhdGl2ZSB0byB0aGUKICAgICAgICAjIGN1cnJlbnQgZGlyZWN0b3J5LCBlLmcuIC4vc2NyaXB0CiAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGNtZCk6CiAgICAgICAgICAgIGlmIF9hY2Nlc3NfY2hlY2soY21kLCBtb2RlKToKICAgICAgICAgICAgICAgIHJldHVybiBjbWQKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICBwYXRoID0gb3MuZW52aXJvbi5nZXQoIlBBVEgiLCBvcy5kZWZwYXRoKQogICAgICAgIGlmIG5vdCBwYXRoOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KG9zLnBhdGhzZXApCgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgICAgICAgICAjIFRoZSBjdXJyZW50IGRpcmVjdG9yeSB0YWtlcyBwcmVjZWRlbmNlIG9uIFdpbmRvd3MuCiAgICAgICAgICAgIGlmIG5vdCBvcy5jdXJkaXIgaW4gcGF0aDoKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKCiAgICAgICAgICAgICMgUEFUSEVYVCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sgb24gV2luZG93cy4KICAgICAgICAgICAgcGF0aGV4dCA9IG9zLmVudmlyb24uZ2V0KCJQQVRIRVhUIiwgIiIpLnNwbGl0KG9zLnBhdGhzZXApCiAgICAgICAgICAgICMgU2VlIGlmIHRoZSBnaXZlbiBmaWxlIG1hdGNoZXMgYW55IG9mIHRoZSBleHBlY3RlZCBwYXRoIGV4dGVuc2lvbnMuCiAgICAgICAgICAgICMgVGhpcyB3aWxsIGFsbG93IHVzIHRvIHNob3J0IGNpcmN1aXQgd2hlbiBnaXZlbiAicHl0aG9uLmV4ZSIuCiAgICAgICAgICAgICMgSWYgaXQgZG9lcyBtYXRjaCwgb25seSB0ZXN0IHRoYXQgb25lLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byB0cnkKICAgICAgICAgICAgIyBvdGhlcnMuCiAgICAgICAgICAgIGlmIGFueShjbWQubG93ZXIoKS5lbmRzd2l0aChleHQubG93ZXIoKSkgZm9yIGV4dCBpbiBwYXRoZXh0KToKICAgICAgICAgICAgICAgIGZpbGVzID0gW2NtZF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpbGVzID0gW2NtZCArIGV4dCBmb3IgZXh0IGluIHBhdGhleHRdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPbiBvdGhlciBwbGF0Zm9ybXMgeW91IGRvbid0IGhhdmUgdGhpbmdzIGxpa2UgUEFUSEVYVCB0byB0ZWxsIHlvdQogICAgICAgICAgICAjIHdoYXQgZmlsZSBzdWZmaXhlcyBhcmUgZXhlY3V0YWJsZSwgc28ganVzdCBwYXNzIG9uIGNtZCBhcy1pcy4KICAgICAgICAgICAgZmlsZXMgPSBbY21kXQoKICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBmb3IgZGlyIGluIHBhdGg6CiAgICAgICAgICAgIG5vcm1kaXIgPSBvcy5wYXRoLm5vcm1jYXNlKGRpcikKICAgICAgICAgICAgaWYgbm90IG5vcm1kaXIgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHNlZW4uYWRkKG5vcm1kaXIpCiAgICAgICAgICAgICAgICBmb3IgdGhlZmlsZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKGRpciwgdGhlZmlsZSkKICAgICAgICAgICAgICAgICAgICBpZiBfYWNjZXNzX2NoZWNrKG5hbWUsIG1vZGUpOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZQogICAgICAgIHJldHVybiBOb25lCgoKIyBaaXBGaWxlIGlzIGEgY29udGV4dCBtYW5hZ2VyIGluIDIuNywgYnV0IG5vdCBpbiAyLjYKCmZyb20gemlwZmlsZSBpbXBvcnQgWmlwRmlsZSBhcyBCYXNlWmlwRmlsZQoKaWYgaGFzYXR0cihCYXNlWmlwRmlsZSwgJ19fZW50ZXJfXycpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBaaXBGaWxlID0gQmFzZVppcEZpbGUKZWxzZToKICAgIGZyb20gemlwZmlsZSBpbXBvcnQgWmlwRXh0RmlsZSBhcyBCYXNlWmlwRXh0RmlsZQoKICAgIGNsYXNzIFppcEV4dEZpbGUoQmFzZVppcEV4dEZpbGUpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlKToKICAgICAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoYmFzZS5fX2RpY3RfXykKCiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKCiAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICAjIHJldHVybiBOb25lLCBzbyBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQsIGl0IHdpbGwgcHJvcGFnYXRlCgogICAgY2xhc3MgWmlwRmlsZShCYXNlWmlwRmlsZSk6CiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKCiAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICAjIHJldHVybiBOb25lLCBzbyBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQsIGl0IHdpbGwgcHJvcGFnYXRlCgogICAgICAgIGRlZiBvcGVuKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIGJhc2UgPSBCYXNlWmlwRmlsZS5vcGVuKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgcmV0dXJuIFppcEV4dEZpbGUoYmFzZSkKCnRyeToKICAgIGZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl9pbXBsZW1lbnRhdGlvbgpleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZGVmIHB5dGhvbl9pbXBsZW1lbnRhdGlvbigpOgogICAgICAgICIiIlJldHVybiBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLiIiIgogICAgICAgIGlmICdQeVB5JyBpbiBzeXMudmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuICdQeVB5JwogICAgICAgIGlmIG9zLm5hbWUgPT0gJ2phdmEnOgogICAgICAgICAgICByZXR1cm4gJ0p5dGhvbicKICAgICAgICBpZiBzeXMudmVyc2lvbi5zdGFydHN3aXRoKCdJcm9uUHl0aG9uJyk6CiAgICAgICAgICAgIHJldHVybiAnSXJvblB5dGhvbicKICAgICAgICByZXR1cm4gJ0NQeXRob24nCgp0cnk6CiAgICBpbXBvcnQgc3lzY29uZmlnCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIC5fYmFja3BvcnQgaW1wb3J0IHN5c2NvbmZpZwoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOiAgICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2FsbGFibGUKCiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvYmosIENhbGxhYmxlKQoKCnRyeToKICAgIGZzZW5jb2RlID0gb3MuZnNlbmNvZGUKICAgIGZzZGVjb2RlID0gb3MuZnNkZWNvZGUKZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBfZnNlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQogICAgaWYgX2ZzZW5jb2RpbmcgPT0gJ21iY3MnOgogICAgICAgIF9mc2Vycm9ycyA9ICdzdHJpY3QnCiAgICBlbHNlOgogICAgICAgIF9mc2Vycm9ycyA9ICdzdXJyb2dhdGVlc2NhcGUnCgogICAgZGVmIGZzZW5jb2RlKGZpbGVuYW1lKToKICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmVuY29kZShfZnNlbmNvZGluZywgX2ZzZXJyb3JzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0IGJ5dGVzIG9yIHN0ciwgbm90ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKGZpbGVuYW1lKS5fX25hbWVfXykKCiAgICBkZWYgZnNkZWNvZGUoZmlsZW5hbWUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIHRleHRfdHlwZSk6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgYnl0ZXMpOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZGVjb2RlKF9mc2VuY29kaW5nLCBfZnNlcnJvcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3QgYnl0ZXMgb3Igc3RyLCBub3QgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUoZmlsZW5hbWUpLl9fbmFtZV9fKQoKdHJ5OgogICAgZnJvbSB0b2tlbml6ZSBpbXBvcnQgZGV0ZWN0X2VuY29kaW5nCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIGNvZGVjcyBpbXBvcnQgQk9NX1VURjgsIGxvb2t1cAogICAgaW1wb3J0IHJlCgogICAgY29va2llX3JlID0gcmUuY29tcGlsZSgiY29kaW5nWzo9XVxzKihbLVx3Ll0rKSIpCgogICAgZGVmIF9nZXRfbm9ybWFsX25hbWUob3JpZ19lbmMpOgogICAgICAgICIiIkltaXRhdGVzIGdldF9ub3JtYWxfbmFtZSBpbiB0b2tlbml6ZXIuYy4iIiIKICAgICAgICAjIE9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgMTIgY2hhcmFjdGVycy4KICAgICAgICBlbmMgPSBvcmlnX2VuY1s6MTJdLmxvd2VyKCkucmVwbGFjZSgiXyIsICItIikKICAgICAgICBpZiBlbmMgPT0gInV0Zi04IiBvciBlbmMuc3RhcnRzd2l0aCgidXRmLTgtIik6CiAgICAgICAgICAgIHJldHVybiAidXRmLTgiCiAgICAgICAgaWYgZW5jIGluICgibGF0aW4tMSIsICJpc28tODg1OS0xIiwgImlzby1sYXRpbi0xIikgb3IgXAogICAgICAgICAgIGVuYy5zdGFydHN3aXRoKCgibGF0aW4tMS0iLCAiaXNvLTg4NTktMS0iLCAiaXNvLWxhdGluLTEtIikpOgogICAgICAgICAgICByZXR1cm4gImlzby04ODU5LTEiCiAgICAgICAgcmV0dXJuIG9yaWdfZW5jCgogICAgZGVmIGRldGVjdF9lbmNvZGluZyhyZWFkbGluZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGhlIGRldGVjdF9lbmNvZGluZygpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBlbmNvZGluZyB0aGF0IHNob3VsZAogICAgICAgIGJlIHVzZWQgdG8gZGVjb2RlIGEgUHl0aG9uIHNvdXJjZSBmaWxlLiAgSXQgcmVxdWlyZXMgb25lIGFyZ3VtZW50LCByZWFkbGluZSwKICAgICAgICBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIHRva2VuaXplKCkgZ2VuZXJhdG9yLgoKICAgICAgICBJdCB3aWxsIGNhbGwgcmVhZGxpbmUgYSBtYXhpbXVtIG9mIHR3aWNlLCBhbmQgcmV0dXJuIHRoZSBlbmNvZGluZyB1c2VkCiAgICAgICAgKGFzIGEgc3RyaW5nKSBhbmQgYSBsaXN0IG9mIGFueSBsaW5lcyAobGVmdCBhcyBieXRlcykgaXQgaGFzIHJlYWQgaW4uCgogICAgICAgIEl0IGRldGVjdHMgdGhlIGVuY29kaW5nIGZyb20gdGhlIHByZXNlbmNlIG9mIGEgdXRmLTggYm9tIG9yIGFuIGVuY29kaW5nCiAgICAgICAgY29va2llIGFzIHNwZWNpZmllZCBpbiBwZXAtMDI2My4gIElmIGJvdGggYSBib20gYW5kIGEgY29va2llIGFyZSBwcmVzZW50LAogICAgICAgIGJ1dCBkaXNhZ3JlZSwgYSBTeW50YXhFcnJvciB3aWxsIGJlIHJhaXNlZC4gIElmIHRoZSBlbmNvZGluZyBjb29raWUgaXMgYW4KICAgICAgICBpbnZhbGlkIGNoYXJzZXQsIHJhaXNlIGEgU3ludGF4RXJyb3IuICBOb3RlIHRoYXQgaWYgYSB1dGYtOCBib20gaXMgZm91bmQsCiAgICAgICAgJ3V0Zi04LXNpZycgaXMgcmV0dXJuZWQuCgogICAgICAgIElmIG5vIGVuY29kaW5nIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgZGVmYXVsdCBvZiAndXRmLTgnIHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlbmFtZSA9IHJlYWRsaW5lLl9fc2VsZl9fLm5hbWUKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZQogICAgICAgIGJvbV9mb3VuZCA9IEZhbHNlCiAgICAgICAgZW5jb2RpbmcgPSBOb25lCiAgICAgICAgZGVmYXVsdCA9ICd1dGYtOCcKICAgICAgICBkZWYgcmVhZF9vcl9zdG9wKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiByZWFkbGluZSgpCiAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICAgICAgcmV0dXJuIGInJwoKICAgICAgICBkZWYgZmluZF9jb29raWUobGluZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgRGVjb2RlIGFzIFVURi04LiBFaXRoZXIgdGhlIGxpbmUgaXMgYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24sCiAgICAgICAgICAgICAgICAjIGluIHdoaWNoIGNhc2UgaXQgc2hvdWxkIGJlIHB1cmUgQVNDSUksIG9yIGl0IG11c3QgYmUgVVRGLTgKICAgICAgICAgICAgICAgICMgcGVyIGRlZmF1bHQgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICBsaW5lX3N0cmluZyA9IGxpbmUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICBtc2cgPSAiaW52YWxpZCBvciBtaXNzaW5nIGVuY29kaW5nIGRlY2xhcmF0aW9uIgogICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gJ3t9IGZvciB7IXJ9Jy5mb3JtYXQobXNnLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKG1zZykKCiAgICAgICAgICAgIG1hdGNoZXMgPSBjb29raWVfcmUuZmluZGFsbChsaW5lX3N0cmluZykKICAgICAgICAgICAgaWYgbm90IG1hdGNoZXM6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbmNvZGluZyA9IF9nZXRfbm9ybWFsX25hbWUobWF0Y2hlc1swXSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29kZWMgPSBsb29rdXAoZW5jb2RpbmcpCiAgICAgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKICAgICAgICAgICAgICAgICMgVGhpcyBiZWhhdmlvdXIgbWltaWNzIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gInVua25vd24gZW5jb2Rpbmc6ICIgKyBlbmNvZGluZwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAidW5rbm93biBlbmNvZGluZyBmb3IgeyFyfToge30iLmZvcm1hdChmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IobXNnKQoKICAgICAgICAgICAgaWYgYm9tX2ZvdW5kOgogICAgICAgICAgICAgICAgaWYgY29kZWMubmFtZSAhPSAndXRmLTgnOgogICAgICAgICAgICAgICAgICAgICMgVGhpcyBiZWhhdmlvdXIgbWltaWNzIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKICAgICAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAnZW5jb2RpbmcgcHJvYmxlbTogdXRmLTgnCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gJ2VuY29kaW5nIHByb2JsZW0gZm9yIHshcn06IHV0Zi04Jy5mb3JtYXQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IobXNnKQogICAgICAgICAgICAgICAgZW5jb2RpbmcgKz0gJy1zaWcnCiAgICAgICAgICAgIHJldHVybiBlbmNvZGluZwoKICAgICAgICBmaXJzdCA9IHJlYWRfb3Jfc3RvcCgpCiAgICAgICAgaWYgZmlyc3Quc3RhcnRzd2l0aChCT01fVVRGOCk6CiAgICAgICAgICAgIGJvbV9mb3VuZCA9IFRydWUKICAgICAgICAgICAgZmlyc3QgPSBmaXJzdFszOl0KICAgICAgICAgICAgZGVmYXVsdCA9ICd1dGYtOC1zaWcnCiAgICAgICAgaWYgbm90IGZpcnN0OgogICAgICAgICAgICByZXR1cm4gZGVmYXVsdCwgW10KCiAgICAgICAgZW5jb2RpbmcgPSBmaW5kX2Nvb2tpZShmaXJzdCkKICAgICAgICBpZiBlbmNvZGluZzoKICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLCBbZmlyc3RdCgogICAgICAgIHNlY29uZCA9IHJlYWRfb3Jfc3RvcCgpCiAgICAgICAgaWYgbm90IHNlY29uZDoKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQsIFtmaXJzdF0KCiAgICAgICAgZW5jb2RpbmcgPSBmaW5kX2Nvb2tpZShzZWNvbmQpCiAgICAgICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgICAgIHJldHVybiBlbmNvZGluZywgW2ZpcnN0LCBzZWNvbmRdCgogICAgICAgIHJldHVybiBkZWZhdWx0LCBbZmlyc3QsIHNlY29uZF0KCiMgRm9yIGNvbnZlcnRpbmcgJiA8LT4gJmFtcDsgZXRjLgp0cnk6CiAgICBmcm9tIGh0bWwgaW1wb3J0IGVzY2FwZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGNnaSBpbXBvcnQgZXNjYXBlCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdIDwgKDMsIDQpOgogICAgdW5lc2NhcGUgPSBIVE1MUGFyc2VyKCkudW5lc2NhcGUKZWxzZToKICAgIGZyb20gaHRtbCBpbXBvcnQgdW5lc2NhcGUKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IENoYWluTWFwCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNdXRhYmxlTWFwcGluZwoKICAgIHRyeToKICAgICAgICBmcm9tIHJlcHJsaWIgaW1wb3J0IHJlY3Vyc2l2ZV9yZXByIGFzIF9yZWN1cnNpdmVfcmVwcgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGRlZiBfcmVjdXJzaXZlX3JlcHIoZmlsbHZhbHVlPScuLi4nKToKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIERlY29yYXRvciB0byBtYWtlIGEgcmVwciBmdW5jdGlvbiByZXR1cm4gZmlsbHZhbHVlIGZvciBhIHJlY3Vyc2l2ZQogICAgICAgICAgICBjYWxsCiAgICAgICAgICAgICcnJwoKICAgICAgICAgICAgZGVmIGRlY29yYXRpbmdfZnVuY3Rpb24odXNlcl9mdW5jdGlvbik6CiAgICAgICAgICAgICAgICByZXByX3J1bm5pbmcgPSBzZXQoKQoKICAgICAgICAgICAgICAgIGRlZiB3cmFwcGVyKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIGtleSA9IGlkKHNlbGYpLCBnZXRfaWRlbnQoKQogICAgICAgICAgICAgICAgICAgIGlmIGtleSBpbiByZXByX3J1bm5pbmc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxsdmFsdWUKICAgICAgICAgICAgICAgICAgICByZXByX3J1bm5pbmcuYWRkKGtleSkKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHVzZXJfZnVuY3Rpb24oc2VsZikKICAgICAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgICAgICByZXByX3J1bm5pbmcuZGlzY2FyZChrZXkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICAgICAgICAgICMgQ2FuJ3QgdXNlIGZ1bmN0b29scy53cmFwcygpIGhlcmUgYmVjYXVzZSBvZiBib290c3RyYXAgaXNzdWVzCiAgICAgICAgICAgICAgICB3cmFwcGVyLl9fbW9kdWxlX18gPSBnZXRhdHRyKHVzZXJfZnVuY3Rpb24sICdfX21vZHVsZV9fJykKICAgICAgICAgICAgICAgIHdyYXBwZXIuX19kb2NfXyA9IGdldGF0dHIodXNlcl9mdW5jdGlvbiwgJ19fZG9jX18nKQogICAgICAgICAgICAgICAgd3JhcHBlci5fX25hbWVfXyA9IGdldGF0dHIodXNlcl9mdW5jdGlvbiwgJ19fbmFtZV9fJykKICAgICAgICAgICAgICAgIHdyYXBwZXIuX19hbm5vdGF0aW9uc19fID0gZ2V0YXR0cih1c2VyX2Z1bmN0aW9uLCAnX19hbm5vdGF0aW9uc19fJywge30pCiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlcgoKICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRpbmdfZnVuY3Rpb24KCiAgICBjbGFzcyBDaGFpbk1hcChNdXRhYmxlTWFwcGluZyk6CiAgICAgICAgJycnIEEgQ2hhaW5NYXAgZ3JvdXBzIG11bHRpcGxlIGRpY3RzIChvciBvdGhlciBtYXBwaW5ncykgdG9nZXRoZXIKICAgICAgICB0byBjcmVhdGUgYSBzaW5nbGUsIHVwZGF0ZWFibGUgdmlldy4KCiAgICAgICAgVGhlIHVuZGVybHlpbmcgbWFwcGluZ3MgYXJlIHN0b3JlZCBpbiBhIGxpc3QuICBUaGF0IGxpc3QgaXMgcHVibGljIGFuZCBjYW4KICAgICAgICBhY2Nlc3NlZCBvciB1cGRhdGVkIHVzaW5nIHRoZSAqbWFwcyogYXR0cmlidXRlLiAgVGhlcmUgaXMgbm8gb3RoZXIgc3RhdGUuCgogICAgICAgIExvb2t1cHMgc2VhcmNoIHRoZSB1bmRlcmx5aW5nIG1hcHBpbmdzIHN1Y2Nlc3NpdmVseSB1bnRpbCBhIGtleSBpcyBmb3VuZC4KICAgICAgICBJbiBjb250cmFzdCwgd3JpdGVzLCB1cGRhdGVzLCBhbmQgZGVsZXRpb25zIG9ubHkgb3BlcmF0ZSBvbiB0aGUgZmlyc3QKICAgICAgICBtYXBwaW5nLgoKICAgICAgICAnJycKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICptYXBzKToKICAgICAgICAgICAgJycnSW5pdGlhbGl6ZSBhIENoYWluTWFwIGJ5IHNldHRpbmcgKm1hcHMqIHRvIHRoZSBnaXZlbiBtYXBwaW5ncy4KICAgICAgICAgICAgSWYgbm8gbWFwcGluZ3MgYXJlIHByb3ZpZGVkLCBhIHNpbmdsZSBlbXB0eSBkaWN0aW9uYXJ5IGlzIHVzZWQuCgogICAgICAgICAgICAnJycKICAgICAgICAgICAgc2VsZi5tYXBzID0gbGlzdChtYXBzKSBvciBbe31dICAgICAgICAgICMgYWx3YXlzIGF0IGxlYXN0IG9uZSBtYXAKCiAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKCiAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIGZvciBtYXBwaW5nIGluIHNlbGYubWFwczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZ1trZXldICAgICAgICAgICAgICMgY2FuJ3QgdXNlICdrZXkgaW4gbWFwcGluZycgd2l0aCBkZWZhdWx0ZGljdAogICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19taXNzaW5nX18oa2V5KSAgICAgICAgICAgICMgc3VwcG9ydCBzdWJjbGFzc2VzIHRoYXQgZGVmaW5lIF9fbWlzc2luZ19fCgogICAgICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgICAgICByZXR1cm4gc2VsZltrZXldIGlmIGtleSBpbiBzZWxmIGVsc2UgZGVmYXVsdAoKICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGxlbihzZXQoKS51bmlvbigqc2VsZi5tYXBzKSkgICAgICMgcmV1c2VzIHN0b3JlZCBoYXNoIHZhbHVlcyBpZiBwb3NzaWJsZQoKICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBpdGVyKHNldCgpLnVuaW9uKCpzZWxmLm1hcHMpKQoKICAgICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHJldHVybiBhbnkoa2V5IGluIG0gZm9yIG0gaW4gc2VsZi5tYXBzKQoKICAgICAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBhbnkoc2VsZi5tYXBzKQoKICAgICAgICBAX3JlY3Vyc2l2ZV9yZXByKCkKICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiAnezAuX19jbGFzc19fLl9fbmFtZV9ffSh7MX0pJy5mb3JtYXQoCiAgICAgICAgICAgICAgICBzZWxmLCAnLCAnLmpvaW4obWFwKHJlcHIsIHNlbGYubWFwcykpKQoKICAgICAgICBAY2xhc3NtZXRob2QKICAgICAgICBkZWYgZnJvbWtleXMoY2xzLCBpdGVyYWJsZSwgKmFyZ3MpOgogICAgICAgICAgICAnQ3JlYXRlIGEgQ2hhaW5NYXAgd2l0aCBhIHNpbmdsZSBkaWN0IGNyZWF0ZWQgZnJvbSB0aGUgaXRlcmFibGUuJwogICAgICAgICAgICByZXR1cm4gY2xzKGRpY3QuZnJvbWtleXMoaXRlcmFibGUsICphcmdzKSkKCiAgICAgICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgICAgICdOZXcgQ2hhaW5NYXAgb3Igc3ViY2xhc3Mgd2l0aCBhIG5ldyBjb3B5IG9mIG1hcHNbMF0gYW5kIHJlZnMgdG8gbWFwc1sxOl0nCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLm1hcHNbMF0uY29weSgpLCAqc2VsZi5tYXBzWzE6XSkKCiAgICAgICAgX19jb3B5X18gPSBjb3B5CgogICAgICAgIGRlZiBuZXdfY2hpbGQoc2VsZik6ICAgICAgICAgICAgICAgICAgICAgICAgIyBsaWtlIERqYW5nbydzIENvbnRleHQucHVzaCgpCiAgICAgICAgICAgICdOZXcgQ2hhaW5NYXAgd2l0aCBhIG5ldyBkaWN0IGZvbGxvd2VkIGJ5IGFsbCBwcmV2aW91cyBtYXBzLicKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHt9LCAqc2VsZi5tYXBzKQoKICAgICAgICBAcHJvcGVydHkKICAgICAgICBkZWYgcGFyZW50cyhzZWxmKTogICAgICAgICAgICAgICAgICAgICAgICAgICMgbGlrZSBEamFuZ28ncyBDb250ZXh0LnBvcCgpCiAgICAgICAgICAgICdOZXcgQ2hhaW5NYXAgZnJvbSBtYXBzWzE6XS4nCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXygqc2VsZi5tYXBzWzE6XSkKCiAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICAgICBzZWxmLm1hcHNbMF1ba2V5XSA9IHZhbHVlCgogICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5tYXBzWzBdW2tleV0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0tleSBub3QgZm91bmQgaW4gdGhlIGZpcnN0IG1hcHBpbmc6IHshcn0nLmZvcm1hdChrZXkpKQoKICAgICAgICBkZWYgcG9waXRlbShzZWxmKToKICAgICAgICAgICAgJ1JlbW92ZSBhbmQgcmV0dXJuIGFuIGl0ZW0gcGFpciBmcm9tIG1hcHNbMF0uIFJhaXNlIEtleUVycm9yIGlzIG1hcHNbMF0gaXMgZW1wdHkuJwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5tYXBzWzBdLnBvcGl0ZW0oKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignTm8ga2V5cyBmb3VuZCBpbiB0aGUgZmlyc3QgbWFwcGluZy4nKQoKICAgICAgICBkZWYgcG9wKHNlbGYsIGtleSwgKmFyZ3MpOgogICAgICAgICAgICAnUmVtb3ZlICprZXkqIGZyb20gbWFwc1swXSBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4gUmFpc2UgS2V5RXJyb3IgaWYgKmtleSogbm90IGluIG1hcHNbMF0uJwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5tYXBzWzBdLnBvcChrZXksICphcmdzKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignS2V5IG5vdCBmb3VuZCBpbiB0aGUgZmlyc3QgbWFwcGluZzogeyFyfScuZm9ybWF0KGtleSkpCgogICAgICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAgICAgJ0NsZWFyIG1hcHNbMF0sIGxlYXZpbmcgbWFwc1sxOl0gaW50YWN0LicKICAgICAgICAgICAgc2VsZi5tYXBzWzBdLmNsZWFyKCkKCnRyeToKICAgIGZyb20gaW1wIGltcG9ydCBjYWNoZV9mcm9tX3NvdXJjZQpleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZGVmIGNhY2hlX2Zyb21fc291cmNlKHBhdGgsIGRlYnVnX292ZXJyaWRlPU5vbmUpOgogICAgICAgIGFzc2VydCBwYXRoLmVuZHN3aXRoKCcucHknKQogICAgICAgIGlmIGRlYnVnX292ZXJyaWRlIGlzIE5vbmU6CiAgICAgICAgICAgIGRlYnVnX292ZXJyaWRlID0gX19kZWJ1Z19fCiAgICAgICAgaWYgZGVidWdfb3ZlcnJpZGU6CiAgICAgICAgICAgIHN1ZmZpeCA9ICdjJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1ZmZpeCA9ICdvJwogICAgICAgIHJldHVybiBwYXRoICsgc3VmZml4Cgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgojIyB7e3sgaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvNTc2NjkzLyAocjkpCiMgQmFja3BvcnQgb2YgT3JkZXJlZERpY3QoKSBjbGFzcyB0aGF0IHJ1bnMgb24gUHl0aG9uIDIuNCwgMi41LCAyLjYsIDIuNyBhbmQgcHlweS4KIyBQYXNzZXMgUHl0aG9uMi43J3MgdGVzdCBzdWl0ZSBhbmQgaW5jb3Jwb3JhdGVzIGFsbCB0aGUgbGF0ZXN0IHVwZGF0ZXMuCiAgICB0cnk6CiAgICAgICAgZnJvbSB0aHJlYWQgaW1wb3J0IGdldF9pZGVudCBhcyBfZ2V0X2lkZW50CiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgZnJvbSBkdW1teV90aHJlYWQgaW1wb3J0IGdldF9pZGVudCBhcyBfZ2V0X2lkZW50CgogICAgdHJ5OgogICAgICAgIGZyb20gX2FiY29sbCBpbXBvcnQgS2V5c1ZpZXcsIFZhbHVlc1ZpZXcsIEl0ZW1zVmlldwogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCgogICAgY2xhc3MgT3JkZXJlZERpY3QoZGljdCk6CiAgICAgICAgJ0RpY3Rpb25hcnkgdGhhdCByZW1lbWJlcnMgaW5zZXJ0aW9uIG9yZGVyJwogICAgICAgICMgQW4gaW5oZXJpdGVkIGRpY3QgbWFwcyBrZXlzIHRvIHZhbHVlcy4KICAgICAgICAjIFRoZSBpbmhlcml0ZWQgZGljdCBwcm92aWRlcyBfX2dldGl0ZW1fXywgX19sZW5fXywgX19jb250YWluc19fLCBhbmQgZ2V0LgogICAgICAgICMgVGhlIHJlbWFpbmluZyBtZXRob2RzIGFyZSBvcmRlci1hd2FyZS4KICAgICAgICAjIEJpZy1PIHJ1bm5pbmcgdGltZXMgZm9yIGFsbCBtZXRob2RzIGFyZSB0aGUgc2FtZSBhcyBmb3IgcmVndWxhciBkaWN0aW9uYXJpZXMuCgogICAgICAgICMgVGhlIGludGVybmFsIHNlbGYuX19tYXAgZGljdGlvbmFyeSBtYXBzIGtleXMgdG8gbGlua3MgaW4gYSBkb3VibHkgbGlua2VkIGxpc3QuCiAgICAgICAgIyBUaGUgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IHN0YXJ0cyBhbmQgZW5kcyB3aXRoIGEgc2VudGluZWwgZWxlbWVudC4KICAgICAgICAjIFRoZSBzZW50aW5lbCBlbGVtZW50IG5ldmVyIGdldHMgZGVsZXRlZCAodGhpcyBzaW1wbGlmaWVzIHRoZSBhbGdvcml0aG0pLgogICAgICAgICMgRWFjaCBsaW5rIGlzIHN0b3JlZCBhcyBhIGxpc3Qgb2YgbGVuZ3RoIHRocmVlOiAgW1BSRVYsIE5FWFQsIEtFWV0uCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2RzKToKICAgICAgICAgICAgJycnSW5pdGlhbGl6ZSBhbiBvcmRlcmVkIGRpY3Rpb25hcnkuICBTaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yCiAgICAgICAgICAgIHJlZ3VsYXIgZGljdGlvbmFyaWVzLCBidXQga2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdCByZWNvbW1lbmRlZAogICAgICAgICAgICBiZWNhdXNlIHRoZWlyIGluc2VydGlvbiBvcmRlciBpcyBhcmJpdHJhcnkuCgogICAgICAgICAgICAnJycKICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gMToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXhwZWN0ZWQgYXQgbW9zdCAxIGFyZ3VtZW50cywgZ290ICVkJyAlIGxlbihhcmdzKSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5fX3Jvb3QKICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgc2VsZi5fX3Jvb3QgPSByb290ID0gW10gICAgICAgICAgICAgICAgICAgICAjIHNlbnRpbmVsIG5vZGUKICAgICAgICAgICAgICAgIHJvb3RbOl0gPSBbcm9vdCwgcm9vdCwgTm9uZV0KICAgICAgICAgICAgICAgIHNlbGYuX19tYXAgPSB7fQogICAgICAgICAgICBzZWxmLl9fdXBkYXRlKCphcmdzLCAqKmt3ZHMpCgogICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlLCBkaWN0X3NldGl0ZW09ZGljdC5fX3NldGl0ZW1fXyk6CiAgICAgICAgICAgICdvZC5fX3NldGl0ZW1fXyhpLCB5KSA8PT0+IG9kW2ldPXknCiAgICAgICAgICAgICMgU2V0dGluZyBhIG5ldyBpdGVtIGNyZWF0ZXMgYSBuZXcgbGluayB3aGljaCBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmtlZAogICAgICAgICAgICAjIGxpc3QsIGFuZCB0aGUgaW5oZXJpdGVkIGRpY3Rpb25hcnkgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcga2V5L3ZhbHVlIHBhaXIuCiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKICAgICAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICAgICAgbGFzdCA9IHJvb3RbMF0KICAgICAgICAgICAgICAgIGxhc3RbMV0gPSByb290WzBdID0gc2VsZi5fX21hcFtrZXldID0gW2xhc3QsIHJvb3QsIGtleV0KICAgICAgICAgICAgZGljdF9zZXRpdGVtKHNlbGYsIGtleSwgdmFsdWUpCgogICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXksIGRpY3RfZGVsaXRlbT1kaWN0Ll9fZGVsaXRlbV9fKToKICAgICAgICAgICAgJ29kLl9fZGVsaXRlbV9fKHkpIDw9PT4gZGVsIG9kW3ldJwogICAgICAgICAgICAjIERlbGV0aW5nIGFuIGV4aXN0aW5nIGl0ZW0gdXNlcyBzZWxmLl9fbWFwIHRvIGZpbmQgdGhlIGxpbmsgd2hpY2ggaXMKICAgICAgICAgICAgIyB0aGVuIHJlbW92ZWQgYnkgdXBkYXRpbmcgdGhlIGxpbmtzIGluIHRoZSBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIG5vZGVzLgogICAgICAgICAgICBkaWN0X2RlbGl0ZW0oc2VsZiwga2V5KQogICAgICAgICAgICBsaW5rX3ByZXYsIGxpbmtfbmV4dCwga2V5ID0gc2VsZi5fX21hcC5wb3Aoa2V5KQogICAgICAgICAgICBsaW5rX3ByZXZbMV0gPSBsaW5rX25leHQKICAgICAgICAgICAgbGlua19uZXh0WzBdID0gbGlua19wcmV2CgogICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgJ29kLl9faXRlcl9fKCkgPD09PiBpdGVyKG9kKScKICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgIGN1cnIgPSByb290WzFdCiAgICAgICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IHJvb3Q6CiAgICAgICAgICAgICAgICB5aWVsZCBjdXJyWzJdCiAgICAgICAgICAgICAgICBjdXJyID0gY3VyclsxXQoKICAgICAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgogICAgICAgICAgICAnb2QuX19yZXZlcnNlZF9fKCkgPD09PiByZXZlcnNlZChvZCknCiAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICBjdXJyID0gcm9vdFswXQogICAgICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCByb290OgogICAgICAgICAgICAgICAgeWllbGQgY3VyclsyXQogICAgICAgICAgICAgICAgY3VyciA9IGN1cnJbMF0KCiAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICAgICAnb2QuY2xlYXIoKSAtPiBOb25lLiAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIG9kLicKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5fX21hcC5pdGVydmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgZGVsIG5vZGVbOl0KICAgICAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICAgICAgcm9vdFs6XSA9IFtyb290LCByb290LCBOb25lXQogICAgICAgICAgICAgICAgc2VsZi5fX21hcC5jbGVhcigpCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZGljdC5jbGVhcihzZWxmKQoKICAgICAgICBkZWYgcG9waXRlbShzZWxmLCBsYXN0PVRydWUpOgogICAgICAgICAgICAnJydvZC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZXR1cm4gYW5kIHJlbW92ZSBhIChrZXksIHZhbHVlKSBwYWlyLgogICAgICAgICAgICBQYWlycyBhcmUgcmV0dXJuZWQgaW4gTElGTyBvcmRlciBpZiBsYXN0IGlzIHRydWUgb3IgRklGTyBvcmRlciBpZiBmYWxzZS4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBub3Qgc2VsZjoKICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdkaWN0aW9uYXJ5IGlzIGVtcHR5JykKICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgIGlmIGxhc3Q6CiAgICAgICAgICAgICAgICBsaW5rID0gcm9vdFswXQogICAgICAgICAgICAgICAgbGlua19wcmV2ID0gbGlua1swXQogICAgICAgICAgICAgICAgbGlua19wcmV2WzFdID0gcm9vdAogICAgICAgICAgICAgICAgcm9vdFswXSA9IGxpbmtfcHJldgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGluayA9IHJvb3RbMV0KICAgICAgICAgICAgICAgIGxpbmtfbmV4dCA9IGxpbmtbMV0KICAgICAgICAgICAgICAgIHJvb3RbMV0gPSBsaW5rX25leHQKICAgICAgICAgICAgICAgIGxpbmtfbmV4dFswXSA9IHJvb3QKICAgICAgICAgICAga2V5ID0gbGlua1syXQogICAgICAgICAgICBkZWwgc2VsZi5fX21hcFtrZXldCiAgICAgICAgICAgIHZhbHVlID0gZGljdC5wb3Aoc2VsZiwga2V5KQogICAgICAgICAgICByZXR1cm4ga2V5LCB2YWx1ZQoKICAgICAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgLS0KCiAgICAgICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgICAgICdvZC5rZXlzKCkgLT4gbGlzdCBvZiBrZXlzIGluIG9kJwogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmKQoKICAgICAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgICAgICAnb2QudmFsdWVzKCkgLT4gbGlzdCBvZiB2YWx1ZXMgaW4gb2QnCiAgICAgICAgICAgIHJldHVybiBbc2VsZltrZXldIGZvciBrZXkgaW4gc2VsZl0KCiAgICAgICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgICAgICAnb2QuaXRlbXMoKSAtPiBsaXN0IG9mIChrZXksIHZhbHVlKSBwYWlycyBpbiBvZCcKICAgICAgICAgICAgcmV0dXJuIFsoa2V5LCBzZWxmW2tleV0pIGZvciBrZXkgaW4gc2VsZl0KCiAgICAgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgogICAgICAgICAgICAnb2QuaXRlcmtleXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIGluIG9kJwogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmKQoKICAgICAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKICAgICAgICAgICAgJ29kLml0ZXJ2YWx1ZXMgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIGluIG9kJwogICAgICAgICAgICBmb3IgayBpbiBzZWxmOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZltrXQoKICAgICAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgogICAgICAgICAgICAnb2QuaXRlcml0ZW1zIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBpdGVtcyBpbiBvZCcKICAgICAgICAgICAgZm9yIGsgaW4gc2VsZjoKICAgICAgICAgICAgICAgIHlpZWxkIChrLCBzZWxmW2tdKQoKICAgICAgICBkZWYgdXBkYXRlKCphcmdzLCAqKmt3ZHMpOgogICAgICAgICAgICAnJydvZC51cGRhdGUoRSwgKipGKSAtPiBOb25lLiAgVXBkYXRlIG9kIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLgoKICAgICAgICAgICAgSWYgRSBpcyBhIGRpY3QgaW5zdGFuY2UsIGRvZXM6ICAgICAgICAgICBmb3IgayBpbiBFOiBvZFtrXSA9IEVba10KICAgICAgICAgICAgSWYgRSBoYXMgYSAua2V5cygpIG1ldGhvZCwgZG9lczogICAgICAgICBmb3IgayBpbiBFLmtleXMoKTogb2Rba10gPSBFW2tdCiAgICAgICAgICAgIE9yIGlmIEUgaXMgYW4gaXRlcmFibGUgb2YgaXRlbXMsIGRvZXM6ICAgZm9yIGssIHYgaW4gRTogb2Rba10gPSB2CiAgICAgICAgICAgIEluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiAgICAgZm9yIGssIHYgaW4gRi5pdGVtcygpOiBvZFtrXSA9IHYKCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBsZW4oYXJncykgPiAyOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1cGRhdGUoKSB0YWtlcyBhdCBtb3N0IDIgcG9zaXRpb25hbCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50cyAoJWQgZ2l2ZW4pJyAlIChsZW4oYXJncyksKSkKICAgICAgICAgICAgZWxpZiBub3QgYXJnczoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndXBkYXRlKCkgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudCAoMCBnaXZlbiknKQogICAgICAgICAgICBzZWxmID0gYXJnc1swXQogICAgICAgICAgICAjIE1ha2UgcHJvZ3Jlc3NpdmVseSB3ZWFrZXIgYXNzdW1wdGlvbnMgYWJvdXQgIm90aGVyIgogICAgICAgICAgICBvdGhlciA9ICgpCiAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAyOgogICAgICAgICAgICAgICAgb3RoZXIgPSBhcmdzWzFdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRpY3QpOgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCiAgICAgICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgJ2tleXMnKToKICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXIua2V5cygpOgogICAgICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyOgogICAgICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGt3ZHMuaXRlbXMoKToKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCgogICAgICAgIF9fdXBkYXRlID0gdXBkYXRlICAjIGxldCBzdWJjbGFzc2VzIG92ZXJyaWRlIHVwZGF0ZSB3aXRob3V0IGJyZWFraW5nIF9faW5pdF9fCgogICAgICAgIF9fbWFya2VyID0gb2JqZWN0KCkKCiAgICAgICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9X19tYXJrZXIpOgogICAgICAgICAgICAnJydvZC5wb3Aoa1ssZF0pIC0+IHYsIHJlbW92ZSBzcGVjaWZpZWQga2V5IGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuCiAgICAgICAgICAgIElmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWQuCgogICAgICAgICAgICAnJycKICAgICAgICAgICAgaWYga2V5IGluIHNlbGY6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmW2tleV0KICAgICAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgogICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAoKICAgICAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgICAgICdvZC5zZXRkZWZhdWx0KGtbLGRdKSAtPiBvZC5nZXQoayxkKSwgYWxzbyBzZXQgb2Rba109ZCBpZiBrIG5vdCBpbiBvZCcKICAgICAgICAgICAgaWYga2V5IGluIHNlbGY6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCiAgICAgICAgICAgIHNlbGZba2V5XSA9IGRlZmF1bHQKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKCiAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYsIF9yZXByX3J1bm5pbmc9Tm9uZSk6CiAgICAgICAgICAgICdvZC5fX3JlcHJfXygpIDw9PT4gcmVwcihvZCknCiAgICAgICAgICAgIGlmIG5vdCBfcmVwcl9ydW5uaW5nOiBfcmVwcl9ydW5uaW5nID0ge30KICAgICAgICAgICAgY2FsbF9rZXkgPSBpZChzZWxmKSwgX2dldF9pZGVudCgpCiAgICAgICAgICAgIGlmIGNhbGxfa2V5IGluIF9yZXByX3J1bm5pbmc6CiAgICAgICAgICAgICAgICByZXR1cm4gJy4uLicKICAgICAgICAgICAgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0gPSAxCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMoKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sKQogICAgICAgICAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLml0ZW1zKCkpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBkZWwgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0KCiAgICAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgICAgICdSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nJwogICAgICAgICAgICBpdGVtcyA9IFtbaywgc2VsZltrXV0gZm9yIGsgaW4gc2VsZl0KICAgICAgICAgICAgaW5zdF9kaWN0ID0gdmFycyhzZWxmKS5jb3B5KCkKICAgICAgICAgICAgZm9yIGsgaW4gdmFycyhPcmRlcmVkRGljdCgpKToKICAgICAgICAgICAgICAgIGluc3RfZGljdC5wb3AoaywgTm9uZSkKICAgICAgICAgICAgaWYgaW5zdF9kaWN0OgogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCksIGluc3RfZGljdCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKQoKICAgICAgICBkZWYgY29weShzZWxmKToKICAgICAgICAgICAgJ29kLmNvcHkoKSAtPiBhIHNoYWxsb3cgY29weSBvZiBvZCcKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYpCgogICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKToKICAgICAgICAgICAgJycnT0QuZnJvbWtleXMoU1ssIHZdKSAtPiBOZXcgb3JkZXJlZCBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tIFMKICAgICAgICAgICAgYW5kIHZhbHVlcyBlcXVhbCB0byB2ICh3aGljaCBkZWZhdWx0cyB0byBOb25lKS4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBkID0gY2xzKCkKICAgICAgICAgICAgZm9yIGtleSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCiAgICAgICAgICAgIHJldHVybiBkCgogICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAgICAnJydvZC5fX2VxX18oeSkgPD09PiBvZD09eS4gIENvbXBhcmlzb24gdG8gYW5vdGhlciBPRCBpcyBvcmRlci1zZW5zaXRpdmUKICAgICAgICAgICAgd2hpbGUgY29tcGFyaXNvbiB0byBhIHJlZ3VsYXIgbWFwcGluZyBpcyBvcmRlci1pbnNlbnNpdGl2ZS4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBPcmRlcmVkRGljdCk6CiAgICAgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYpPT1sZW4ob3RoZXIpIGFuZCBzZWxmLml0ZW1zKCkgPT0gb3RoZXIuaXRlbXMoKQogICAgICAgICAgICByZXR1cm4gZGljdC5fX2VxX18oc2VsZiwgb3RoZXIpCgogICAgICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICAgICAgIyAtLSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIG9ubHkgdXNlZCBpbiBQeXRob24gMi43IC0tCgogICAgICAgIGRlZiB2aWV3a2V5cyhzZWxmKToKICAgICAgICAgICAgIm9kLnZpZXdrZXlzKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIGtleXMiCiAgICAgICAgICAgIHJldHVybiBLZXlzVmlldyhzZWxmKQoKICAgICAgICBkZWYgdmlld3ZhbHVlcyhzZWxmKToKICAgICAgICAgICAgIm9kLnZpZXd2YWx1ZXMoKSAtPiBhbiBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIHZhbHVlcyIKICAgICAgICAgICAgcmV0dXJuIFZhbHVlc1ZpZXcoc2VsZikKCiAgICAgICAgZGVmIHZpZXdpdGVtcyhzZWxmKToKICAgICAgICAgICAgIm9kLnZpZXdpdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyBpdGVtcyIKICAgICAgICAgICAgcmV0dXJuIEl0ZW1zVmlldyhzZWxmKQoKdHJ5OgogICAgZnJvbSBsb2dnaW5nLmNvbmZpZyBpbXBvcnQgQmFzZUNvbmZpZ3VyYXRvciwgdmFsaWRfaWRlbnQKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIElERU5USUZJRVIgPSByZS5jb21waWxlKCdeW2Etel9dW2EtejAtOV9dKiQnLCByZS5JKQoKCiAgICBkZWYgdmFsaWRfaWRlbnQocyk6CiAgICAgICAgbSA9IElERU5USUZJRVIubWF0Y2gocykKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm90IGEgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXI6ICVyJyAlIHMpCiAgICAgICAgcmV0dXJuIFRydWUKCgogICAgIyBUaGUgQ29udmVydGluZ1hYWCBjbGFzc2VzIGFyZSB3cmFwcGVycyBhcm91bmQgc3RhbmRhcmQgUHl0aG9uIGNvbnRhaW5lcnMsCiAgICAjIGFuZCB0aGV5IHNlcnZlIHRvIGNvbnZlcnQgYW55IHN1aXRhYmxlIHZhbHVlcyBpbiB0aGUgY29udGFpbmVyLiBUaGUKICAgICMgY29udmVyc2lvbiBjb252ZXJ0cyBiYXNlIGRpY3RzLCBsaXN0cyBhbmQgdHVwbGVzIHRvIHRoZWlyIHdyYXBwZWQKICAgICMgZXF1aXZhbGVudHMsIHdoZXJlYXMgc3RyaW5ncyB3aGljaCBtYXRjaCBhIGNvbnZlcnNpb24gZm9ybWF0IGFyZSBjb252ZXJ0ZWQKICAgICMgYXBwcm9wcmlhdGVseS4KICAgICMKICAgICMgRWFjaCB3cmFwcGVyIHNob3VsZCBoYXZlIGEgY29uZmlndXJhdG9yIGF0dHJpYnV0ZSBob2xkaW5nIHRoZSBhY3R1YWwKICAgICMgY29uZmlndXJhdG9yIHRvIHVzZSBmb3IgY29udmVyc2lvbi4KCiAgICBjbGFzcyBDb252ZXJ0aW5nRGljdChkaWN0KToKICAgICAgICAiIiJBIGNvbnZlcnRpbmcgZGljdGlvbmFyeSB3cmFwcGVyLiIiIgoKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgICAgdmFsdWUgPSBkaWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAgICAgI0lmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgICAgIHZhbHVlID0gZGljdC5nZXQoc2VsZiwga2V5LCBkZWZhdWx0KQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICAgICAjSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CiAgICAgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHZhbHVlID0gZGljdC5wb3Aoc2VsZiwga2V5LCBkZWZhdWx0KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGNsYXNzIENvbnZlcnRpbmdMaXN0KGxpc3QpOgogICAgICAgICIiIkEgY29udmVydGluZyBsaXN0IHdyYXBwZXIuIiIiCiAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHZhbHVlID0gbGlzdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIGRlZiBwb3Aoc2VsZiwgaWR4PS0xKToKICAgICAgICAgICAgdmFsdWUgPSBsaXN0LnBvcChzZWxmLCBpZHgpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgY2xhc3MgQ29udmVydGluZ1R1cGxlKHR1cGxlKToKICAgICAgICAiIiJBIGNvbnZlcnRpbmcgdHVwbGUgd3JhcHBlci4iIiIKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgICAgdmFsdWUgPSB0dXBsZS5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGNsYXNzIEJhc2VDb25maWd1cmF0b3Iob2JqZWN0KToKICAgICAgICAiIiIKICAgICAgICBUaGUgY29uZmlndXJhdG9yIGJhc2UgY2xhc3Mgd2hpY2ggZGVmaW5lcyBzb21lIHVzZWZ1bCBkZWZhdWx0cy4KICAgICAgICAiIiIKCiAgICAgICAgQ09OVkVSVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ14oP1A8cHJlZml4PlthLXpdKyk6Ly8oP1A8c3VmZml4Pi4qKSQnKQoKICAgICAgICBXT1JEX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxzKihcdyspXHMqJykKICAgICAgICBET1RfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXC5ccyooXHcrKVxzKicpCiAgICAgICAgSU5ERVhfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXFtccyooXHcrKVxzKlxdXHMqJykKICAgICAgICBESUdJVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cZCskJykKCiAgICAgICAgdmFsdWVfY29udmVydGVycyA9IHsKICAgICAgICAgICAgJ2V4dCcgOiAnZXh0X2NvbnZlcnQnLAogICAgICAgICAgICAnY2ZnJyA6ICdjZmdfY29udmVydCcsCiAgICAgICAgfQoKICAgICAgICAjIFdlIG1pZ2h0IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG9uZSwgZS5nLiBpbXBvcnRsaWIKICAgICAgICBpbXBvcnRlciA9IHN0YXRpY21ldGhvZChfX2ltcG9ydF9fKQoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnKToKICAgICAgICAgICAgc2VsZi5jb25maWcgPSBDb252ZXJ0aW5nRGljdChjb25maWcpCiAgICAgICAgICAgIHNlbGYuY29uZmlnLmNvbmZpZ3VyYXRvciA9IHNlbGYKCiAgICAgICAgZGVmIHJlc29sdmUoc2VsZiwgcyk6CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBSZXNvbHZlIHN0cmluZ3MgdG8gb2JqZWN0cyB1c2luZyBzdGFuZGFyZCBpbXBvcnQgYW5kIGF0dHJpYnV0ZQogICAgICAgICAgICBzeW50YXguCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBuYW1lID0gcy5zcGxpdCgnLicpCiAgICAgICAgICAgIHVzZWQgPSBuYW1lLnBvcCgwKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuaW1wb3J0ZXIodXNlZCkKICAgICAgICAgICAgICAgIGZvciBmcmFnIGluIG5hbWU6CiAgICAgICAgICAgICAgICAgICAgdXNlZCArPSAnLicgKyBmcmFnCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGdldGF0dHIoZm91bmQsIGZyYWcpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltcG9ydGVyKHVzZWQpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZ2V0YXR0cihmb3VuZCwgZnJhZykKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZAogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBlLCB0YiA9IHN5cy5leGNfaW5mbygpWzE6XQogICAgICAgICAgICAgICAgdiA9IFZhbHVlRXJyb3IoJ0Nhbm5vdCByZXNvbHZlICVyOiAlcycgJSAocywgZSkpCiAgICAgICAgICAgICAgICB2Ll9fY2F1c2VfXywgdi5fX3RyYWNlYmFja19fID0gZSwgdGIKICAgICAgICAgICAgICAgIHJhaXNlIHYKCiAgICAgICAgZGVmIGV4dF9jb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBleHQ6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlc29sdmUodmFsdWUpCgogICAgICAgIGRlZiBjZmdfY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgY2ZnOi8vIHByb3RvY29sLiIiIgogICAgICAgICAgICByZXN0ID0gdmFsdWUKICAgICAgICAgICAgbSA9IHNlbGYuV09SRF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVyIiAlIHZhbHVlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdCA9IHJlc3RbbS5lbmQoKTpdCiAgICAgICAgICAgICAgICBkID0gc2VsZi5jb25maWdbbS5ncm91cHMoKVswXV0KICAgICAgICAgICAgICAgICNwcmludCBkLCByZXN0CiAgICAgICAgICAgICAgICB3aGlsZSByZXN0OgogICAgICAgICAgICAgICAgICAgIG0gPSBzZWxmLkRPVF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbbS5ncm91cHMoKVswXV0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBtID0gc2VsZi5JTkRFWF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBtLmdyb3VwcygpWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5ESUdJVF9QQVRURVJOLm1hdGNoKGlkeCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpbnQoaWR4KSAjIHRyeSBhcyBudW1iZXIgZmlyc3QgKG1vc3QgbGlrZWx5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW2lkeF0KICAgICAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29udmVydCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGF0ICVyJyAlICh2YWx1ZSwgcmVzdCkpCiAgICAgICAgICAgICNyZXN0IHNob3VsZCBiZSBlbXB0eQogICAgICAgICAgICByZXR1cm4gZAoKICAgICAgICBkZWYgY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDb252ZXJ0IHZhbHVlcyB0byBhbiBhcHByb3ByaWF0ZSB0eXBlLiBkaWN0cywgbGlzdHMgYW5kIHR1cGxlcyBhcmUKICAgICAgICAgICAgcmVwbGFjZWQgYnkgdGhlaXIgY29udmVydGluZyBhbHRlcm5hdGl2ZXMuIFN0cmluZ3MgYXJlIGNoZWNrZWQgdG8KICAgICAgICAgICAgc2VlIGlmIHRoZXkgaGF2ZSBhIGNvbnZlcnNpb24gZm9ybWF0IGFuZCBhcmUgY29udmVydGVkIGlmIHRoZXkgZG8uCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ0RpY3QpIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKICAgICAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ0RpY3QodmFsdWUpCiAgICAgICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdMaXN0KSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdMaXN0KHZhbHVlKQogICAgICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nVHVwbGUpIGFuZFwKICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nVHVwbGUodmFsdWUpCiAgICAgICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIG0gPSBzZWxmLkNPTlZFUlRfUEFUVEVSTi5tYXRjaCh2YWx1ZSkKICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgZCA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBkWydwcmVmaXgnXQogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IHNlbGYudmFsdWVfY29udmVydGVycy5nZXQocHJlZml4LCBOb25lKQogICAgICAgICAgICAgICAgICAgIGlmIGNvbnZlcnRlcjoKICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gZFsnc3VmZml4J10KICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyID0gZ2V0YXR0cihzZWxmLCBjb252ZXJ0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29udmVydGVyKHN1ZmZpeCkKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGRlZiBjb25maWd1cmVfY3VzdG9tKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgICAgICIiIkNvbmZpZ3VyZSBhbiBvYmplY3Qgd2l0aCBhIHVzZXItc3VwcGxpZWQgZmFjdG9yeS4iIiIKICAgICAgICAgICAgYyA9IGNvbmZpZy5wb3AoJygpJykKICAgICAgICAgICAgaWYgbm90IGNhbGxhYmxlKGMpOgogICAgICAgICAgICAgICAgYyA9IHNlbGYucmVzb2x2ZShjKQogICAgICAgICAgICBwcm9wcyA9IGNvbmZpZy5wb3AoJy4nLCBOb25lKQogICAgICAgICAgICAjIENoZWNrIGZvciB2YWxpZCBpZGVudGlmaWVycwogICAgICAgICAgICBrd2FyZ3MgPSBkaWN0KFsoaywgY29uZmlnW2tdKSBmb3IgayBpbiBjb25maWcgaWYgdmFsaWRfaWRlbnQoayldKQogICAgICAgICAgICByZXN1bHQgPSBjKCoqa3dhcmdzKQogICAgICAgICAgICBpZiBwcm9wczoKICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBwcm9wcy5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgIHNldGF0dHIocmVzdWx0LCBuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBkZWYgYXNfdHVwbGUoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICAiIiJVdGlsaXR5IGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGxpc3RzIHRvIHR1cGxlcy4iIiIKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHR1cGxlKHZhbHVlKQogICAgICAgICAgICByZXR1cm4gdmFsdWUKUEsDBBQAAAAAAAAAIQA6CsO8CMIAAAjCAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2RhdGFiYXNlLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMi0yMDE2IFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiUEVQIDM3NiBpbXBsZW1lbnRhdGlvbi4iIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGJhc2U2NAppbXBvcnQgY29kZWNzCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBoYXNobGliCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCBzeXMKaW1wb3J0IHppcGltcG9ydAoKZnJvbSAuIGltcG9ydCBEaXN0bGliRXhjZXB0aW9uLCByZXNvdXJjZXMKZnJvbSAuY29tcGF0IGltcG9ydCBTdHJpbmdJTwpmcm9tIC52ZXJzaW9uIGltcG9ydCBnZXRfc2NoZW1lLCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcgpmcm9tIC5tZXRhZGF0YSBpbXBvcnQgTWV0YWRhdGEsIE1FVEFEQVRBX0ZJTEVOQU1FLCBXSEVFTF9NRVRBREFUQV9GSUxFTkFNRQpmcm9tIC51dGlsIGltcG9ydCAocGFyc2VfcmVxdWlyZW1lbnQsIGNhY2hlZF9wcm9wZXJ0eSwgcGFyc2VfbmFtZV9hbmRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgIHJlYWRfZXhwb3J0cywgd3JpdGVfZXhwb3J0cywgQ1NWUmVhZGVyLCBDU1ZXcml0ZXIpCgoKX19hbGxfXyA9IFsnRGlzdHJpYnV0aW9uJywgJ0Jhc2VJbnN0YWxsZWREaXN0cmlidXRpb24nLAogICAgICAgICAgICdJbnN0YWxsZWREaXN0cmlidXRpb24nLCAnRWdnSW5mb0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgJ0Rpc3RyaWJ1dGlvblBhdGgnXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKRVhQT1JUU19GSUxFTkFNRSA9ICdweWRpc3QtZXhwb3J0cy5qc29uJwpDT01NQU5EU19GSUxFTkFNRSA9ICdweWRpc3QtY29tbWFuZHMuanNvbicKCkRJU1RfRklMRVMgPSAoJ0lOU1RBTExFUicsIE1FVEFEQVRBX0ZJTEVOQU1FLCAnUkVDT1JEJywgJ1JFUVVFU1RFRCcsCiAgICAgICAgICAgICAgJ1JFU09VUkNFUycsIEVYUE9SVFNfRklMRU5BTUUsICdTSEFSRUQnKQoKRElTVElORk9fRVhUID0gJy5kaXN0LWluZm8nCgoKY2xhc3MgX0NhY2hlKG9iamVjdCk6CiAgICAiIiIKICAgIEEgc2ltcGxlIGNhY2hlIG1hcHBpbmcgbmFtZXMgYW5kIC5kaXN0LWluZm8gcGF0aHMgdG8gZGlzdHJpYnV0aW9ucwogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4gVGhlcmUgaXMgbm9ybWFsbHkgb25lIGZvciBlYWNoIERpc3RyaWJ1dGlvblBhdGguCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lID0ge30KICAgICAgICBzZWxmLnBhdGggPSB7fQogICAgICAgIHNlbGYuZ2VuZXJhdGVkID0gRmFsc2UKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYXIgdGhlIGNhY2hlLCBzZXR0aW5nIGl0IHRvIGl0cyBpbml0aWFsIHN0YXRlLgogICAgICAgICIiIgogICAgICAgIHNlbGYubmFtZS5jbGVhcigpCiAgICAgICAgc2VsZi5wYXRoLmNsZWFyKCkKICAgICAgICBzZWxmLmdlbmVyYXRlZCA9IEZhbHNlCgogICAgZGVmIGFkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBkaXN0cmlidXRpb24gdG8gdGhlIGNhY2hlLgogICAgICAgIDpwYXJhbSBkaXN0OiBUaGUgZGlzdHJpYnV0aW9uIHRvIGFkZC4KICAgICAgICAiIiIKICAgICAgICBpZiBkaXN0LnBhdGggbm90IGluIHNlbGYucGF0aDoKICAgICAgICAgICAgc2VsZi5wYXRoW2Rpc3QucGF0aF0gPSBkaXN0CiAgICAgICAgICAgIHNlbGYubmFtZS5zZXRkZWZhdWx0KGRpc3Qua2V5LCBbXSkuYXBwZW5kKGRpc3QpCgoKY2xhc3MgRGlzdHJpYnV0aW9uUGF0aChvYmplY3QpOgogICAgIiIiCiAgICBSZXByZXNlbnRzIGEgc2V0IG9mIGRpc3RyaWJ1dGlvbnMgaW5zdGFsbGVkIG9uIGEgcGF0aCAodHlwaWNhbGx5IHN5cy5wYXRoKS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSwgaW5jbHVkZV9lZ2c9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIENyZWF0ZSBhbiBpbnN0YW5jZSBmcm9tIGEgcGF0aCwgb3B0aW9uYWxseSBpbmNsdWRpbmcgbGVnYWN5IChkaXN0dXRpbHMvCiAgICAgICAgc2V0dXB0b29scy9kaXN0cmlidXRlKSBkaXN0cmlidXRpb25zLgogICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCB0byB1c2UsIGFzIGEgbGlzdCBvZiBkaXJlY3Rvcmllcy4gSWYgbm90IHNwZWNpZmllZCwKICAgICAgICAgICAgICAgICAgICAgc3lzLnBhdGggaXMgdXNlZC4KICAgICAgICA6cGFyYW0gaW5jbHVkZV9lZ2c6IElmIFRydWUsIHRoaXMgaW5zdGFuY2Ugd2lsbCBsb29rIGZvciBhbmQgcmV0dXJuIGxlZ2FjeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucyBhcyB3ZWxsIGFzIHRob3NlIGJhc2VkIG9uIFBFUCAzNzYuCiAgICAgICAgIiIiCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgc2VsZi5faW5jbHVkZV9kaXN0ID0gVHJ1ZQogICAgICAgIHNlbGYuX2luY2x1ZGVfZWdnID0gaW5jbHVkZV9lZ2cKCiAgICAgICAgc2VsZi5fY2FjaGUgPSBfQ2FjaGUoKQogICAgICAgIHNlbGYuX2NhY2hlX2VnZyA9IF9DYWNoZSgpCiAgICAgICAgc2VsZi5fY2FjaGVfZW5hYmxlZCA9IFRydWUKICAgICAgICBzZWxmLl9zY2hlbWUgPSBnZXRfc2NoZW1lKCdkZWZhdWx0JykKCiAgICBkZWYgX2dldF9jYWNoZV9lbmFibGVkKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jYWNoZV9lbmFibGVkCgogICAgZGVmIF9zZXRfY2FjaGVfZW5hYmxlZChzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fY2FjaGVfZW5hYmxlZCA9IHZhbHVlCgogICAgY2FjaGVfZW5hYmxlZCA9IHByb3BlcnR5KF9nZXRfY2FjaGVfZW5hYmxlZCwgX3NldF9jYWNoZV9lbmFibGVkKQoKICAgIGRlZiBjbGVhcl9jYWNoZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbGVhcnMgdGhlIGludGVybmFsIGNhY2hlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NhY2hlLmNsZWFyKCkKICAgICAgICBzZWxmLl9jYWNoZV9lZ2cuY2xlYXIoKQoKCiAgICBkZWYgX3lpZWxkX2Rpc3RyaWJ1dGlvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgWWllbGQgLmRpc3QtaW5mbyBhbmQvb3IgLmVnZygtaW5mbykgZGlzdHJpYnV0aW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIFdlIG5lZWQgdG8gY2hlY2sgaWYgd2UndmUgc2VlbiBzb21lIHJlc291cmNlcyBhbHJlYWR5LCBiZWNhdXNlIG9uCiAgICAgICAgIyBzb21lIExpbnV4IHN5c3RlbXMgKGUuZy4gc29tZSBEZWJpYW4vVWJ1bnR1IHZhcmlhbnRzKSB0aGVyZSBhcmUKICAgICAgICAjIHN5bWxpbmtzIHdoaWNoIGFsaWFzIG90aGVyIGZpbGVzIGluIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnBhdGg6CiAgICAgICAgICAgIGZpbmRlciA9IHJlc291cmNlcy5maW5kZXJfZm9yX3BhdGgocGF0aCkKICAgICAgICAgICAgaWYgZmluZGVyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICByID0gZmluZGVyLmZpbmQoJycpCiAgICAgICAgICAgIGlmIG5vdCByIG9yIG5vdCByLmlzX2NvbnRhaW5lcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJzZXQgPSBzb3J0ZWQoci5yZXNvdXJjZXMpCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiByc2V0OgogICAgICAgICAgICAgICAgciA9IGZpbmRlci5maW5kKGVudHJ5KQogICAgICAgICAgICAgICAgaWYgbm90IHIgb3Igci5wYXRoIGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2luY2x1ZGVfZGlzdCBhbmQgZW50cnkuZW5kc3dpdGgoRElTVElORk9fRVhUKToKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZV9maWxlbmFtZXMgPSBbTUVUQURBVEFfRklMRU5BTUUsIFdIRUVMX01FVEFEQVRBX0ZJTEVOQU1FXQogICAgICAgICAgICAgICAgICAgIGZvciBtZXRhZGF0YV9maWxlbmFtZSBpbiBwb3NzaWJsZV9maWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhX3BhdGggPSBwb3NpeHBhdGguam9pbihlbnRyeSwgbWV0YWRhdGFfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHB5ZGlzdCA9IGZpbmRlci5maW5kKG1ldGFkYXRhX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHB5ZGlzdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLmNsb3NpbmcocHlkaXN0LmFzX3N0cmVhbSgpKSBhcyBzdHJlYW06CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoZmlsZW9iaj1zdHJlYW0sIHNjaGVtZT0nbGVnYWN5JykKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kICVzJywgci5wYXRoKQogICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKHIucGF0aCkKICAgICAgICAgICAgICAgICAgICB5aWVsZCBuZXdfZGlzdF9jbGFzcyhyLnBhdGgsIG1ldGFkYXRhPW1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1zZWxmKQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9pbmNsdWRlX2VnZyBhbmQgZW50cnkuZW5kc3dpdGgoKCcuZWdnLWluZm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5lZ2cnKSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCAlcycsIHIucGF0aCkKICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChyLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgeWllbGQgb2xkX2Rpc3RfY2xhc3Moci5wYXRoLCBzZWxmKQoKICAgIGRlZiBfZ2VuZXJhdGVfY2FjaGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2NhbiB0aGUgcGF0aCBmb3IgZGlzdHJpYnV0aW9ucyBhbmQgcG9wdWxhdGUgdGhlIGNhY2hlIHdpdGgKICAgICAgICB0aG9zZSB0aGF0IGFyZSBmb3VuZC4KICAgICAgICAiIiIKICAgICAgICBnZW5fZGlzdCA9IG5vdCBzZWxmLl9jYWNoZS5nZW5lcmF0ZWQKICAgICAgICBnZW5fZWdnID0gc2VsZi5faW5jbHVkZV9lZ2cgYW5kIG5vdCBzZWxmLl9jYWNoZV9lZ2cuZ2VuZXJhdGVkCiAgICAgICAgaWYgZ2VuX2Rpc3Qgb3IgZ2VuX2VnZzoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5feWllbGRfZGlzdHJpYnV0aW9ucygpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkaXN0LCBJbnN0YWxsZWREaXN0cmlidXRpb24pOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlLmFkZChkaXN0KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYWNoZV9lZ2cuYWRkKGRpc3QpCgogICAgICAgICAgICBpZiBnZW5fZGlzdDoKICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlLmdlbmVyYXRlZCA9IFRydWUKICAgICAgICAgICAgaWYgZ2VuX2VnZzoKICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlX2VnZy5nZW5lcmF0ZWQgPSBUcnVlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZGlzdGluZm9fZGlybmFtZShjbHMsIG5hbWUsIHZlcnNpb24pOgogICAgICAgICIiIgogICAgICAgIFRoZSAqbmFtZSogYW5kICp2ZXJzaW9uKiBwYXJhbWV0ZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0aGVpcgogICAgICAgIGZpbGVuYW1lLWVzY2FwZWQgZm9ybSwgaS5lLiBhbnkgYGAnLSdgYCBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZAogICAgICAgIHdpdGggYGAnXydgYCBvdGhlciB0aGFuIHRoZSBvbmUgaW4gYGAnZGlzdC1pbmZvJ2BgIGFuZCB0aGUgb25lCiAgICAgICAgc2VwYXJhdGluZyB0aGUgbmFtZSBmcm9tIHRoZSB2ZXJzaW9uIG51bWJlci4KCiAgICAgICAgOnBhcmFtZXRlciBuYW1lOiBpcyBjb252ZXJ0ZWQgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZSBieSByZXBsYWNpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBydW5zIG9mIG5vbi0gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZQogICAgICAgICAgICAgICAgICAgICAgICAgYGAnLSdgYC4KICAgICAgICA6dHlwZSBuYW1lOiBzdHJpbmcKICAgICAgICA6cGFyYW1ldGVyIHZlcnNpb246IGlzIGNvbnZlcnRlZCB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nLiBTcGFjZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY29tZSBkb3RzLCBhbmQgYWxsIG90aGVyIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4Y2VwdCBkb3RzKSBiZWNvbWUgZGFzaGVzLCB3aXRoIHJ1bnMgb2YgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hlcyBjb25kZW5zZWQgdG8gYSBzaW5nbGUgZGFzaC4KICAgICAgICA6dHlwZSB2ZXJzaW9uOiBzdHJpbmcKICAgICAgICA6cmV0dXJuczogZGlyZWN0b3J5IG5hbWUKICAgICAgICA6cnR5cGU6IHN0cmluZyIiIgogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCiAgICAgICAgcmV0dXJuICctJy5qb2luKFtuYW1lLCB2ZXJzaW9uXSkgKyBESVNUSU5GT19FWFQKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUHJvdmlkZXMgYW4gaXRlcmF0b3IgdGhhdCBsb29rcyBmb3IgZGlzdHJpYnV0aW9ucyBhbmQgcmV0dXJucwogICAgICAgIDpjbGFzczpgSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBvcgogICAgICAgIDpjbGFzczpgRWdnSW5mb0Rpc3RyaWJ1dGlvbmAgaW5zdGFuY2VzIGZvciBlYWNoIG9uZSBvZiB0aGVtLgoKICAgICAgICA6cnR5cGU6IGl0ZXJhdG9yIG9mIDpjbGFzczpgSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBhbmQKICAgICAgICAgICAgICAgIDpjbGFzczpgRWdnSW5mb0Rpc3RyaWJ1dGlvbmAgaW5zdGFuY2VzCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX2NhY2hlX2VuYWJsZWQ6CiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYuX3lpZWxkX2Rpc3RyaWJ1dGlvbnMoKToKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9nZW5lcmF0ZV9jYWNoZSgpCgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLl9jYWNoZS5wYXRoLnZhbHVlcygpOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKICAgICAgICAgICAgaWYgc2VsZi5faW5jbHVkZV9lZ2c6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLl9jYWNoZV9lZ2cucGF0aC52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgZGVmIGdldF9kaXN0cmlidXRpb24oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgTG9va3MgZm9yIGEgbmFtZWQgZGlzdHJpYnV0aW9uIG9uIHRoZSBwYXRoLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IGZvdW5kLCBhcyBubyBtb3JlIHRoYW4gb25lCiAgICAgICAgdmFsdWUgaXMgZXhwZWN0ZWQuIElmIG5vdGhpbmcgaXMgZm91bmQsIGBgTm9uZWBgIGlzIHJldHVybmVkLgoKICAgICAgICA6cnR5cGU6IDpjbGFzczpgSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCwgOmNsYXNzOmBFZ2dJbmZvRGlzdHJpYnV0aW9uYAogICAgICAgICAgICAgICAgb3IgYGBOb25lYGAKICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQogICAgICAgIGlmIG5vdCBzZWxmLl9jYWNoZV9lbmFibGVkOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLl95aWVsZF9kaXN0cmlidXRpb25zKCk6CiAgICAgICAgICAgICAgICBpZiBkaXN0LmtleSA9PSBuYW1lOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRpc3QKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX2NhY2hlKCkKCiAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fY2FjaGUubmFtZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2NhY2hlLm5hbWVbbmFtZV1bMF0KICAgICAgICAgICAgZWxpZiBzZWxmLl9pbmNsdWRlX2VnZyBhbmQgbmFtZSBpbiBzZWxmLl9jYWNoZV9lZ2cubmFtZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2NhY2hlX2VnZy5uYW1lW25hbWVdWzBdCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwcm92aWRlc19kaXN0cmlidXRpb24oc2VsZiwgbmFtZSwgdmVyc2lvbj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlcyBvdmVyIGFsbCBkaXN0cmlidXRpb25zIHRvIGZpbmQgd2hpY2ggZGlzdHJpYnV0aW9ucyBwcm92aWRlICpuYW1lKi4KICAgICAgICBJZiBhICp2ZXJzaW9uKiBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0cy4KCiAgICAgICAgVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBmb3VuZCwgc2luY2Ugbm8gbW9yZSB0aGFuCiAgICAgICAgb25lIHZhbHVlcyBhcmUgZXhwZWN0ZWQuIElmIHRoZSBkaXJlY3RvcnkgaXMgbm90IGZvdW5kLCByZXR1cm5zIGBgTm9uZWBgLgoKICAgICAgICA6cGFyYW1ldGVyIHZlcnNpb246IGEgdmVyc2lvbiBzcGVjaWZpZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLCBjb25mb3JtaW5nIHRvIHRoZSBmb3JtYXQgaW4gYGBQRVAtMzQ1YGAKCiAgICAgICAgOnR5cGUgbmFtZTogc3RyaW5nCiAgICAgICAgOnR5cGUgdmVyc2lvbjogc3RyaW5nCiAgICAgICAgIiIiCiAgICAgICAgbWF0Y2hlciA9IE5vbmUKICAgICAgICBpZiBub3QgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtYXRjaGVyID0gc2VsZi5fc2NoZW1lLm1hdGNoZXIoJyVzICglcyknICUgKG5hbWUsIHZlcnNpb24pKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgbmFtZSBvciB2ZXJzaW9uOiAlciwgJXInICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgdmVyc2lvbikpCgogICAgICAgIGZvciBkaXN0IGluIHNlbGYuZ2V0X2Rpc3RyaWJ1dGlvbnMoKToKICAgICAgICAgICAgcHJvdmlkZWQgPSBkaXN0LnByb3ZpZGVzCgogICAgICAgICAgICBmb3IgcCBpbiBwcm92aWRlZDoKICAgICAgICAgICAgICAgIHBfbmFtZSwgcF92ZXIgPSBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApCiAgICAgICAgICAgICAgICBpZiBtYXRjaGVyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgaWYgcF9uYW1lID09IG5hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgcF9uYW1lID09IG5hbWUgYW5kIG1hdGNoZXIubWF0Y2gocF92ZXIpOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgZGVmIGdldF9maWxlX3BhdGgoc2VsZiwgbmFtZSwgcmVsYXRpdmVfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gc2VsZi5nZXRfZGlzdHJpYnV0aW9uKG5hbWUpCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBMb29rdXBFcnJvcignbm8gZGlzdHJpYnV0aW9uIG5hbWVkICVyIGZvdW5kJyAlIG5hbWUpCiAgICAgICAgcmV0dXJuIGRpc3QuZ2V0X3Jlc291cmNlX3BhdGgocmVsYXRpdmVfcGF0aCkKCiAgICBkZWYgZ2V0X2V4cG9ydGVkX2VudHJpZXMoc2VsZiwgY2F0ZWdvcnksIG5hbWU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCBvZiB0aGUgZXhwb3J0ZWQgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIgY2F0ZWdvcnkuCgogICAgICAgIDpwYXJhbSBjYXRlZ29yeTogVGhlIGNhdGVnb3J5IHRvIHNlYXJjaCBmb3IgZW50cmllcy4KICAgICAgICA6cGFyYW0gbmFtZTogSWYgc3BlY2lmaWVkLCBvbmx5IGVudHJpZXMgd2l0aCB0aGF0IG5hbWUgYXJlIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGZvciBkaXN0IGluIHNlbGYuZ2V0X2Rpc3RyaWJ1dGlvbnMoKToKICAgICAgICAgICAgciA9IGRpc3QuZXhwb3J0cwogICAgICAgICAgICBpZiBjYXRlZ29yeSBpbiByOgogICAgICAgICAgICAgICAgZCA9IHJbY2F0ZWdvcnldCiAgICAgICAgICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gZDoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZFtuYW1lXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmb3IgdiBpbiBkLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB2CgoKY2xhc3MgRGlzdHJpYnV0aW9uKG9iamVjdCk6CiAgICAiIiIKICAgIEEgYmFzZSBjbGFzcyBmb3IgZGlzdHJpYnV0aW9ucywgd2hldGhlciBpbnN0YWxsZWQgb3IgZnJvbSBpbmRleGVzLgogICAgRWl0aGVyIHdheSwgaXQgbXVzdCBoYXZlIHNvbWUgbWV0YWRhdGEsIHNvIHRoYXQncyBhbGwgdGhhdCdzIG5lZWRlZAogICAgZm9yIGNvbnN0cnVjdGlvbi4KICAgICIiIgoKICAgIGJ1aWxkX3RpbWVfZGVwZW5kZW5jeSA9IEZhbHNlCiAgICAiIiIKICAgIFNldCB0byBUcnVlIGlmIGl0J3Mga25vd24gdG8gYmUgb25seSBhIGJ1aWxkLXRpbWUgZGVwZW5kZW5jeSAoaS5lLgogICAgbm90IG5lZWRlZCBhZnRlciBpbnN0YWxsYXRpb24pLgogICAgIiIiCgogICAgcmVxdWVzdGVkID0gRmFsc2UKICAgICIiIkEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBgYFJFUVVFU1RFRGBgIG1ldGFkYXRhIGZpbGUgaXMKICAgIHByZXNlbnQgKGluIG90aGVyIHdvcmRzLCB3aGV0aGVyIHRoZSBwYWNrYWdlIHdhcyBpbnN0YWxsZWQgYnkgdXNlcgogICAgcmVxdWVzdCBvciBpdCB3YXMgaW5zdGFsbGVkIGFzIGEgZGVwZW5kZW5jeSkuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGFkYXRhKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBtZXRhZGF0YTogVGhlIGluc3RhbmNlIG9mIDpjbGFzczpgTWV0YWRhdGFgIGRlc2NyaWJpbmcgdGhpcwogICAgICAgIGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEKICAgICAgICBzZWxmLm5hbWUgPSBtZXRhZGF0YS5uYW1lCiAgICAgICAgc2VsZi5rZXkgPSBzZWxmLm5hbWUubG93ZXIoKSAgICAjIGZvciBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zCiAgICAgICAgc2VsZi52ZXJzaW9uID0gbWV0YWRhdGEudmVyc2lvbgogICAgICAgIHNlbGYubG9jYXRvciA9IE5vbmUKICAgICAgICBzZWxmLmRpZ2VzdCA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhcyA9IE5vbmUgICAgICAjIGFkZGl0aW9uYWwgZmVhdHVyZXMgcmVxdWVzdGVkCiAgICAgICAgc2VsZi5jb250ZXh0ID0gTm9uZSAgICAgIyBlbnZpcm9ubWVudCBtYXJrZXIgb3ZlcnJpZGVzCiAgICAgICAgc2VsZi5kb3dubG9hZF91cmxzID0gc2V0KCkKICAgICAgICBzZWxmLmRpZ2VzdHMgPSB7fQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNvdXJjZV91cmwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGhlIHNvdXJjZSBhcmNoaXZlIGRvd25sb2FkIFVSTCBmb3IgdGhpcyBkaXN0cmlidXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYubWV0YWRhdGEuc291cmNlX3VybAoKICAgIGRvd25sb2FkX3VybCA9IHNvdXJjZV91cmwgICAjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuYW1lX2FuZF92ZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgdXRpbGl0eSBwcm9wZXJ0eSB3aGljaCBkaXNwbGF5cyB0aGUgbmFtZSBhbmQgdmVyc2lvbiBpbiBwYXJlbnRoZXNlcy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJyVzICglcyknICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb3ZpZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgc2V0IG9mIGRpc3RyaWJ1dGlvbiBuYW1lcyBhbmQgdmVyc2lvbnMgcHJvdmlkZWQgYnkgdGhpcyBkaXN0cmlidXRpb24uCiAgICAgICAgOnJldHVybjogQSBzZXQgb2YgIm5hbWUgKHZlcnNpb24pIiBzdHJpbmdzLgogICAgICAgICIiIgogICAgICAgIHBsaXN0ID0gc2VsZi5tZXRhZGF0YS5wcm92aWRlcwogICAgICAgIHMgPSAnJXMgKCVzKScgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaWYgcyBub3QgaW4gcGxpc3Q6CiAgICAgICAgICAgIHBsaXN0LmFwcGVuZChzKQogICAgICAgIHJldHVybiBwbGlzdAoKICAgIGRlZiBfZ2V0X3JlcXVpcmVtZW50cyhzZWxmLCByZXFfYXR0cik6CiAgICAgICAgbWQgPSBzZWxmLm1ldGFkYXRhCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdHZXR0aW5nIHJlcXVpcmVtZW50cyBmcm9tIG1ldGFkYXRhICVyJywgbWQudG9kaWN0KCkpCiAgICAgICAgcmVxdHMgPSBnZXRhdHRyKG1kLCByZXFfYXR0cikKICAgICAgICByZXR1cm4gc2V0KG1kLmdldF9yZXF1aXJlbWVudHMocmVxdHMsIGV4dHJhcz1zZWxmLmV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PXNlbGYuY29udGV4dCkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcnVuX3JlcXVpcmVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfcmVxdWlyZW1lbnRzKCdydW5fcmVxdWlyZXMnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1ldGFfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9yZXF1aXJlbWVudHMoJ21ldGFfcmVxdWlyZXMnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJ1aWxkX3JlcXVpcmVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfcmVxdWlyZW1lbnRzKCdidWlsZF9yZXF1aXJlcycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdGVzdF9yZXF1aXJlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3JlcXVpcmVtZW50cygndGVzdF9yZXF1aXJlcycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGV2X3JlcXVpcmVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfcmVxdWlyZW1lbnRzKCdkZXZfcmVxdWlyZXMnKQoKICAgIGRlZiBtYXRjaGVzX3JlcXVpcmVtZW50KHNlbGYsIHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgU2F5IGlmIHRoaXMgaW5zdGFuY2UgbWF0Y2hlcyAoZnVsZmlsbHMpIGEgcmVxdWlyZW1lbnQuCiAgICAgICAgOnBhcmFtIHJlcTogVGhlIHJlcXVpcmVtZW50IHRvIG1hdGNoLgogICAgICAgIDpydHlwZSByZXE6IHN0cgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgaXQgbWF0Y2hlcywgZWxzZSBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICAjIFJlcXVpcmVtZW50IG1heSBjb250YWluIGV4dHJhcyAtIHBhcnNlIHRvIGxvc2UgdGhvc2UKICAgICAgICAjIGZyb20gd2hhdCdzIHBhc3NlZCB0byB0aGUgbWF0Y2hlcgogICAgICAgIHIgPSBwYXJzZV9yZXF1aXJlbWVudChyZXEpCiAgICAgICAgc2NoZW1lID0gZ2V0X3NjaGVtZShzZWxmLm1ldGFkYXRhLnNjaGVtZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihyLnJlcXVpcmVtZW50KQogICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgIyBYWFggY29tcGF0LW1vZGUgaWYgY2Fubm90IHJlYWQgdGhlIHZlcnNpb24KICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2NvdWxkIG5vdCByZWFkIHZlcnNpb24gJXIgLSB1c2luZyBuYW1lIG9ubHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXEpCiAgICAgICAgICAgIG5hbWUgPSByZXEuc3BsaXQoKVswXQogICAgICAgICAgICBtYXRjaGVyID0gc2NoZW1lLm1hdGNoZXIobmFtZSkKCiAgICAgICAgbmFtZSA9IG1hdGNoZXIua2V5ICAgIyBjYXNlLWluc2Vuc2l0aXZlCgogICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZm9yIHAgaW4gc2VsZi5wcm92aWRlczoKICAgICAgICAgICAgcF9uYW1lLCBwX3ZlciA9IHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCkKICAgICAgICAgICAgaWYgcF9uYW1lICE9IG5hbWU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBtYXRjaGVyLm1hdGNoKHBfdmVyKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGluc3RhbmNlLAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuc291cmNlX3VybDoKICAgICAgICAgICAgc3VmZml4ID0gJyBbJXNdJyAlIHNlbGYuc291cmNlX3VybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1ZmZpeCA9ICcnCiAgICAgICAgcmV0dXJuICc8RGlzdHJpYnV0aW9uICVzICglcyklcz4nICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uLCBzdWZmaXgpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgU2VlIGlmIHRoaXMgZGlzdHJpYnV0aW9uIGlzIHRoZSBzYW1lIGFzIGFub3RoZXIuCiAgICAgICAgOnBhcmFtIG90aGVyOiBUaGUgZGlzdHJpYnV0aW9uIHRvIGNvbXBhcmUgd2l0aC4gVG8gYmUgZXF1YWwgdG8gb25lCiAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyLiBkaXN0cmlidXRpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLCBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBhbmQgc291cmNlX3VybC4KICAgICAgICA6cmV0dXJuOiBUcnVlIGlmIGl0IGlzIHRoZSBzYW1lLCBlbHNlIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIGlmIHR5cGUob3RoZXIpIGlzIG5vdCB0eXBlKHNlbGYpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IChzZWxmLm5hbWUgPT0gb3RoZXIubmFtZSBhbmQKICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9PSBvdGhlci52ZXJzaW9uIGFuZAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2VfdXJsID09IG90aGVyLnNvdXJjZV91cmwpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb21wdXRlIGhhc2ggaW4gYSB3YXkgd2hpY2ggbWF0Y2hlcyB0aGUgZXF1YWxpdHkgdGVzdC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzaChzZWxmLm5hbWUpICsgaGFzaChzZWxmLnZlcnNpb24pICsgaGFzaChzZWxmLnNvdXJjZV91cmwpCgoKY2xhc3MgQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgIiIiCiAgICBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBpbnN0YWxsZWQgZGlzdHJpYnV0aW9ucyAod2hldGhlciBQRVAgMzc2IG9yCiAgICBsZWdhY3kpLgogICAgIiIiCgogICAgaGFzaGVyID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRhZGF0YSwgcGF0aCwgZW52PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIG1ldGFkYXRhOiBBbiBpbnN0YW5jZSBvZiA6Y2xhc3M6YE1ldGFkYXRhYCB3aGljaCBkZXNjcmliZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24uIFRoaXMgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gaW5pdGlhbGlzZWQKICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYSBtZXRhZGF0YSBmaWxlIGluIHRoZSBgYHBhdGhgYC4KICAgICAgICA6cGFyYW0gcGF0aDogICAgIFRoZSBwYXRoIG9mIHRoZSBgYC5kaXN0LWluZm9gYCBvciBgYC5lZ2ctaW5mb2BgCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgZm9yIHRoZSBkaXN0cmlidXRpb24uCiAgICAgICAgOnBhcmFtIGVudjogICAgICBUaGlzIGlzIG5vcm1hbGx5IHRoZSA6Y2xhc3M6YERpc3RyaWJ1dGlvblBhdGhgCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSB3aGVyZSB0aGlzIGRpc3RyaWJ1dGlvbiB3YXMgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbiwgc2VsZikuX19pbml0X18obWV0YWRhdGEpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYuZGlzdF9wYXRoID0gZW52CgogICAgZGVmIGdldF9oYXNoKHNlbGYsIGRhdGEsIGhhc2hlcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGhhc2ggb2Ygc29tZSBkYXRhLCB1c2luZyBhIHBhcnRpY3VsYXIgaGFzaCBhbGdvcml0aG0sIGlmCiAgICAgICAgc3BlY2lmaWVkLgoKICAgICAgICA6cGFyYW0gZGF0YTogVGhlIGRhdGEgdG8gYmUgaGFzaGVkLgogICAgICAgIDp0eXBlIGRhdGE6IGJ5dGVzCiAgICAgICAgOnBhcmFtIGhhc2hlcjogVGhlIG5hbWUgb2YgYSBoYXNoIGltcGxlbWVudGF0aW9uLCBzdXBwb3J0ZWQgYnkgaGFzaGxpYiwKICAgICAgICAgICAgICAgICAgICAgICBvciBgYE5vbmVgYC4gRXhhbXBsZXMgb2YgdmFsaWQgdmFsdWVzIGFyZSBgYCdzaGExJ2BgLAogICAgICAgICAgICAgICAgICAgICAgIGBgJ3NoYTIyNCdgYCwgYGAnc2hhMzg0J2BgLCAnYGBzaGEyNTYnYGAsIGBgJ21kNSdgYCBhbmQKICAgICAgICAgICAgICAgICAgICAgICBgYCdzaGE1MTInYGAuIElmIG5vIGhhc2hlciBpcyBzcGVjaWZpZWQsIHRoZSBgYGhhc2hlcmBgCiAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIG9mIHRoZSA6Y2xhc3M6YEluc3RhbGxlZERpc3RyaWJ1dGlvbmAgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkLiBJZiB0aGUgaGFzaGVyIGlzIGRldGVybWluZWQgdG8gYmUgYGBOb25lYGAsIE1ENQogICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgYXMgdGhlIGhhc2hpbmcgYWxnb3JpdGhtLgogICAgICAgIDpyZXR1cm5zOiBUaGUgaGFzaCBvZiB0aGUgZGF0YS4gSWYgYSBoYXNoZXIgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLAogICAgICAgICAgICAgICAgICB0aGUgcmV0dXJuZWQgaGFzaCB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIHNwZWNpZmllZCBoYXNoZXIKICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgJz0nLgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGFzaGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGhhc2hlciA9IHNlbGYuaGFzaGVyCiAgICAgICAgaWYgaGFzaGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGhhc2hlciA9IGhhc2hsaWIubWQ1CiAgICAgICAgICAgIHByZWZpeCA9ICcnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaGFzaGVyID0gZ2V0YXR0cihoYXNobGliLCBoYXNoZXIpCiAgICAgICAgICAgIHByZWZpeCA9ICclcz0nICUgc2VsZi5oYXNoZXIKICAgICAgICBkaWdlc3QgPSBoYXNoZXIoZGF0YSkuZGlnZXN0KCkKICAgICAgICBkaWdlc3QgPSBiYXNlNjQudXJsc2FmZV9iNjRlbmNvZGUoZGlnZXN0KS5yc3RyaXAoYic9JykuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuICclcyVzJyAlIChwcmVmaXgsIGRpZ2VzdCkKCgpjbGFzcyBJbnN0YWxsZWREaXN0cmlidXRpb24oQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbik6CiAgICAiIiIKICAgIENyZWF0ZWQgd2l0aCB0aGUgKnBhdGgqIG9mIHRoZSBgYC5kaXN0LWluZm9gYCBkaXJlY3RvcnkgcHJvdmlkZWQgdG8gdGhlCiAgICBjb25zdHJ1Y3Rvci4gSXQgcmVhZHMgdGhlIG1ldGFkYXRhIGNvbnRhaW5lZCBpbiBgYHB5ZGlzdC5qc29uYGAgd2hlbiBpdCBpcwogICAgaW5zdGFudGlhdGVkLiwgb3IgdXNlcyBhIHBhc3NlZCBpbiBNZXRhZGF0YSBpbnN0YW5jZSAodXNlZnVsIGZvciB3aGVuCiAgICBkcnktcnVuIG1vZGUgaXMgYmVpbmcgdXNlZCkuCiAgICAiIiIKCiAgICBoYXNoZXIgPSAnc2hhMjU2JwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBtZXRhZGF0YT1Ob25lLCBlbnY9Tm9uZSk6CiAgICAgICAgc2VsZi5maW5kZXIgPSBmaW5kZXIgPSByZXNvdXJjZXMuZmluZGVyX2Zvcl9wYXRoKHBhdGgpCiAgICAgICAgaWYgZmluZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UgKCkKICAgICAgICBpZiBlbnYgYW5kIGVudi5fY2FjaGVfZW5hYmxlZCBhbmQgcGF0aCBpbiBlbnYuX2NhY2hlLnBhdGg6CiAgICAgICAgICAgIG1ldGFkYXRhID0gZW52Ll9jYWNoZS5wYXRoW3BhdGhdLm1ldGFkYXRhCiAgICAgICAgZWxpZiBtZXRhZGF0YSBpcyBOb25lOgogICAgICAgICAgICByID0gZmluZGVyLmZpbmQoTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgICAgICMgVGVtcG9yYXJ5IC0gZm9yIFdoZWVsIDAuMjMgc3VwcG9ydAogICAgICAgICAgICBpZiByIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByID0gZmluZGVyLmZpbmQoV0hFRUxfTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgICAgICMgVGVtcG9yYXJ5IC0gZm9yIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgIGlmIHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZCgnTUVUQURBVEEnKQogICAgICAgICAgICBpZiByIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdubyAlcyBmb3VuZCBpbiAlcycgJSAoTUVUQURBVEFfRklMRU5BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCkpCiAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHIuYXNfc3RyZWFtKCkpIGFzIHN0cmVhbToKICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoZmlsZW9iaj1zdHJlYW0sIHNjaGVtZT0nbGVnYWN5JykKCiAgICAgICAgc3VwZXIoSW5zdGFsbGVkRGlzdHJpYnV0aW9uLCBzZWxmKS5fX2luaXRfXyhtZXRhZGF0YSwgcGF0aCwgZW52KQoKICAgICAgICBpZiBlbnYgYW5kIGVudi5fY2FjaGVfZW5hYmxlZDoKICAgICAgICAgICAgZW52Ll9jYWNoZS5hZGQoc2VsZikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByID0gZmluZGVyLmZpbmQoJ1JFUVVFU1RFRCcpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlICgpCiAgICAgICAgc2VsZi5yZXF1ZXN0ZWQgPSByIGlzIG5vdCBOb25lCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPEluc3RhbGxlZERpc3RyaWJ1dGlvbiAlciAlcyBhdCAlcj4nICUgKAogICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYudmVyc2lvbiwgc2VsZi5wYXRoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQoKICAgIGRlZiBfZ2V0X3JlY29yZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyBmb3IgdGhlIGRpc3RyaWJ1dGlvbgogICAgICAgIDpyZXR1cm46IEEgbGlzdCBvZiB0dXBsZXMgb2YgcGF0aCwgaGFzaCBhbmQgc2l6ZS4gTm90ZSB0aGF0IGhhc2ggYW5kCiAgICAgICAgICAgICAgICAgc2l6ZSBtaWdodCBiZSBgYE5vbmVgYCBmb3Igc29tZSBlbnRyaWVzLiBUaGUgcGF0aCBpcyBleGFjdGx5CiAgICAgICAgICAgICAgICAgYXMgc3RvcmVkIGluIHRoZSBmaWxlICh3aGljaCBpcyBhcyBpbiBQRVAgMzc2KS4KICAgICAgICAiIiIKICAgICAgICByZXN1bHRzID0gW10KICAgICAgICByID0gc2VsZi5nZXRfZGlzdGluZm9fcmVzb3VyY2UoJ1JFQ09SRCcpCiAgICAgICAgd2l0aCBjb250ZXh0bGliLmNsb3Npbmcoci5hc19zdHJlYW0oKSkgYXMgc3RyZWFtOgogICAgICAgICAgICB3aXRoIENTVlJlYWRlcihzdHJlYW09c3RyZWFtKSBhcyByZWNvcmRfcmVhZGVyOgogICAgICAgICAgICAgICAgIyBCYXNlIGxvY2F0aW9uIGlzIHBhcmVudCBkaXIgb2YgLmRpc3QtaW5mbyBkaXIKICAgICAgICAgICAgICAgICNiYXNlX2xvY2F0aW9uID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICNiYXNlX2xvY2F0aW9uID0gb3MucGF0aC5hYnNwYXRoKGJhc2VfbG9jYXRpb24pCiAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJlY29yZF9yZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgbWlzc2luZyA9IFtOb25lIGZvciBpIGluIHJhbmdlKGxlbihyb3cpLCAzKV0KICAgICAgICAgICAgICAgICAgICBwYXRoLCBjaGVja3N1bSwgc2l6ZSA9IHJvdyArIG1pc3NpbmcKICAgICAgICAgICAgICAgICAgICAjaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgIyAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCcvJywgb3Muc2VwKQogICAgICAgICAgICAgICAgICAgICMgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlX2xvY2F0aW9uLCBwYXRoKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKChwYXRoLCBjaGVja3N1bSwgc2l6ZSkpCiAgICAgICAgcmV0dXJuIHJlc3VsdHMKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgZXhwb3J0cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGluZm9ybWF0aW9uIGV4cG9ydGVkIGJ5IHRoaXMgZGlzdHJpYnV0aW9uLgogICAgICAgIDpyZXR1cm46IEEgZGljdGlvbmFyeSBvZiBleHBvcnRzLCBtYXBwaW5nIGFuIGV4cG9ydCBjYXRlZ29yeSB0byBhIGRpY3QKICAgICAgICAgICAgICAgICBvZiA6Y2xhc3M6YEV4cG9ydEVudHJ5YCBpbnN0YW5jZXMgZGVzY3JpYmluZyB0aGUgaW5kaXZpZHVhbAogICAgICAgICAgICAgICAgIGV4cG9ydCBlbnRyaWVzLCBhbmQga2V5ZWQgYnkgbmFtZS4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSB7fQogICAgICAgIHIgPSBzZWxmLmdldF9kaXN0aW5mb19yZXNvdXJjZShFWFBPUlRTX0ZJTEVOQU1FKQogICAgICAgIGlmIHI6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucmVhZF9leHBvcnRzKCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHJlYWRfZXhwb3J0cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWFkIGV4cG9ydHMgZGF0YSBmcm9tIGEgZmlsZSBpbiAuaW5pIGZvcm1hdC4KCiAgICAgICAgOnJldHVybjogQSBkaWN0aW9uYXJ5IG9mIGV4cG9ydHMsIG1hcHBpbmcgYW4gZXhwb3J0IGNhdGVnb3J5IHRvIGEgbGlzdAogICAgICAgICAgICAgICAgIG9mIDpjbGFzczpgRXhwb3J0RW50cnlgIGluc3RhbmNlcyBkZXNjcmliaW5nIHRoZSBpbmRpdmlkdWFsCiAgICAgICAgICAgICAgICAgZXhwb3J0IGVudHJpZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICByID0gc2VsZi5nZXRfZGlzdGluZm9fcmVzb3VyY2UoRVhQT1JUU19GSUxFTkFNRSkKICAgICAgICBpZiByOgogICAgICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhyLmFzX3N0cmVhbSgpKSBhcyBzdHJlYW06CiAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkX2V4cG9ydHMoc3RyZWFtKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgd3JpdGVfZXhwb3J0cyhzZWxmLCBleHBvcnRzKToKICAgICAgICAiIiIKICAgICAgICBXcml0ZSBhIGRpY3Rpb25hcnkgb2YgZXhwb3J0cyB0byBhIGZpbGUgaW4gLmluaSBmb3JtYXQuCiAgICAgICAgOnBhcmFtIGV4cG9ydHM6IEEgZGljdGlvbmFyeSBvZiBleHBvcnRzLCBtYXBwaW5nIGFuIGV4cG9ydCBjYXRlZ29yeSB0bwogICAgICAgICAgICAgICAgICAgICAgICBhIGxpc3Qgb2YgOmNsYXNzOmBFeHBvcnRFbnRyeWAgaW5zdGFuY2VzIGRlc2NyaWJpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGl2aWR1YWwgZXhwb3J0IGVudHJpZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmYgPSBzZWxmLmdldF9kaXN0aW5mb19maWxlKEVYUE9SVFNfRklMRU5BTUUpCiAgICAgICAgd2l0aCBvcGVuKHJmLCAndycpIGFzIGY6CiAgICAgICAgICAgIHdyaXRlX2V4cG9ydHMoZXhwb3J0cywgZikKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3BhdGgoc2VsZiwgcmVsYXRpdmVfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgTk9URTogVGhpcyBBUEkgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgoKICAgICAgICBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggdG8gYSByZXNvdXJjZSBmaWxlIHdpdGggdGhlIGdpdmVuIHJlbGF0aXZlCiAgICAgICAgcGF0aC4KCiAgICAgICAgOnBhcmFtIHJlbGF0aXZlX3BhdGg6IFRoZSBwYXRoLCByZWxhdGl2ZSB0byAuZGlzdC1pbmZvLCBvZiB0aGUgcmVzb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgaW50ZXJlc3QuCiAgICAgICAgOnJldHVybjogVGhlIGFic29sdXRlIHBhdGggd2hlcmUgdGhlIHJlc291cmNlIGlzIHRvIGJlIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIHIgPSBzZWxmLmdldF9kaXN0aW5mb19yZXNvdXJjZSgnUkVTT1VSQ0VTJykKICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhyLmFzX3N0cmVhbSgpKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHdpdGggQ1NWUmVhZGVyKHN0cmVhbT1zdHJlYW0pIGFzIHJlc291cmNlc19yZWFkZXI6CiAgICAgICAgICAgICAgICBmb3IgcmVsYXRpdmUsIGRlc3RpbmF0aW9uIGluIHJlc291cmNlc19yZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgaWYgcmVsYXRpdmUgPT0gcmVsYXRpdmVfcGF0aDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uCiAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ25vIHJlc291cmNlIGZpbGUgd2l0aCByZWxhdGl2ZSBwYXRoICVyICcKICAgICAgICAgICAgICAgICAgICAgICAnaXMgaW5zdGFsbGVkJyAlIHJlbGF0aXZlX3BhdGgpCgogICAgZGVmIGxpc3RfaW5zdGFsbGVkX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGVzIG92ZXIgdGhlIGBgUkVDT1JEYGAgZW50cmllcyBhbmQgcmV0dXJucyBhIHR1cGxlCiAgICAgICAgYGAocGF0aCwgaGFzaCwgc2l6ZSlgYCBmb3IgZWFjaCBsaW5lLgoKICAgICAgICA6cmV0dXJuczogaXRlcmF0b3Igb2YgKHBhdGgsIGhhc2gsIHNpemUpCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHJlc3VsdCBpbiBzZWxmLl9nZXRfcmVjb3JkcygpOgogICAgICAgICAgICB5aWVsZCByZXN1bHQKCiAgICBkZWYgd3JpdGVfaW5zdGFsbGVkX2ZpbGVzKHNlbGYsIHBhdGhzLCBwcmVmaXgsIGRyeV9ydW49RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFdyaXRlcyB0aGUgYGBSRUNPUkRgYCBmaWxlLCB1c2luZyB0aGUgYGBwYXRoc2BgIGl0ZXJhYmxlIHBhc3NlZCBpbi4gQW55CiAgICAgICAgZXhpc3RpbmcgYGBSRUNPUkRgYCBmaWxlIGlzIHNpbGVudGx5IG92ZXJ3cml0dGVuLgoKICAgICAgICBwcmVmaXggaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiB0byB3cml0ZSBhYnNvbHV0ZSBwYXRocy4KICAgICAgICAiIiIKICAgICAgICBwcmVmaXggPSBvcy5wYXRoLmpvaW4ocHJlZml4LCAnJykKICAgICAgICBiYXNlID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICBiYXNlX3VuZGVyX3ByZWZpeCA9IGJhc2Uuc3RhcnRzd2l0aChwcmVmaXgpCiAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbihiYXNlLCAnJykKICAgICAgICByZWNvcmRfcGF0aCA9IHNlbGYuZ2V0X2Rpc3RpbmZvX2ZpbGUoJ1JFQ09SRCcpCiAgICAgICAgbG9nZ2VyLmluZm8oJ2NyZWF0aW5nICVzJywgcmVjb3JkX3BhdGgpCiAgICAgICAgaWYgZHJ5X3J1bjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICB3aXRoIENTVldyaXRlcihyZWNvcmRfcGF0aCkgYXMgd3JpdGVyOgogICAgICAgICAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCkgb3IgcGF0aC5lbmRzd2l0aCgoJy5weWMnLCAnLnB5bycpKToKICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBwdXQgc2l6ZSBhbmQgaGFzaCwgYXMgaW4gUEVQLTM3NgogICAgICAgICAgICAgICAgICAgIGhhc2hfdmFsdWUgPSBzaXplID0gJycKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9ICclZCcgJSBvcy5wYXRoLmdldHNpemUocGF0aCkKICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfdmFsdWUgPSBzZWxmLmdldF9oYXNoKGZwLnJlYWQoKSkKICAgICAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChiYXNlKSBvciAoYmFzZV91bmRlcl9wcmVmaXggYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguc3RhcnRzd2l0aChwcmVmaXgpKToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWxwYXRoKHBhdGgsIGJhc2UpCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKHBhdGgsIGhhc2hfdmFsdWUsIHNpemUpKQoKICAgICAgICAgICAgIyBhZGQgdGhlIFJFQ09SRCBmaWxlIGl0c2VsZgogICAgICAgICAgICBpZiByZWNvcmRfcGF0aC5zdGFydHN3aXRoKGJhc2UpOgogICAgICAgICAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLnJlbHBhdGgocmVjb3JkX3BhdGgsIGJhc2UpCiAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygocmVjb3JkX3BhdGgsICcnLCAnJykpCiAgICAgICAgcmV0dXJuIHJlY29yZF9wYXRoCgogICAgZGVmIGNoZWNrX2luc3RhbGxlZF9maWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVja3MgdGhhdCB0aGUgaGFzaGVzIGFuZCBzaXplcyBvZiB0aGUgZmlsZXMgaW4gYGBSRUNPUkRgYCBhcmUKICAgICAgICBtYXRjaGVkIGJ5IHRoZSBmaWxlcyB0aGVtc2VsdmVzLiBSZXR1cm5zIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mCiAgICAgICAgbWlzbWF0Y2hlcy4gRWFjaCBlbnRyeSBpbiB0aGUgbWlzbWF0Y2ggbGlzdCB3aWxsIGJlIGEgdHVwbGUgY29uc2lzdGluZwogICAgICAgIG9mIHRoZSBwYXRoLCAnZXhpc3RzJywgJ3NpemUnIG9yICdoYXNoJyBhY2NvcmRpbmcgdG8gd2hhdCBkaWRuJ3QgbWF0Y2gKICAgICAgICAoZXhpc3RlbmNlIGlzIGNoZWNrZWQgZmlyc3QsIHRoZW4gc2l6ZSwgdGhlbiBoYXNoKSwgdGhlIGV4cGVjdGVkCiAgICAgICAgdmFsdWUgYW5kIHRoZSBhY3R1YWwgdmFsdWUuCiAgICAgICAgIiIiCiAgICAgICAgbWlzbWF0Y2hlcyA9IFtdCiAgICAgICAgYmFzZSA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCiAgICAgICAgcmVjb3JkX3BhdGggPSBzZWxmLmdldF9kaXN0aW5mb19maWxlKCdSRUNPUkQnKQogICAgICAgIGZvciBwYXRoLCBoYXNoX3ZhbHVlLCBzaXplIGluIHNlbGYubGlzdF9pbnN0YWxsZWRfZmlsZXMoKToKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsIHBhdGgpCiAgICAgICAgICAgIGlmIHBhdGggPT0gcmVjb3JkX3BhdGg6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZCgocGF0aCwgJ2V4aXN0cycsIFRydWUsIEZhbHNlKSkKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgIGFjdHVhbF9zaXplID0gc3RyKG9zLnBhdGguZ2V0c2l6ZShwYXRoKSkKICAgICAgICAgICAgICAgIGlmIHNpemUgYW5kIGFjdHVhbF9zaXplICE9IHNpemU6CiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQoKHBhdGgsICdzaXplJywgc2l6ZSwgYWN0dWFsX3NpemUpKQogICAgICAgICAgICAgICAgZWxpZiBoYXNoX3ZhbHVlOgogICAgICAgICAgICAgICAgICAgIGlmICc9JyBpbiBoYXNoX3ZhbHVlOgogICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXIgPSBoYXNoX3ZhbHVlLnNwbGl0KCc9JywgMSlbMF0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXIgPSBOb25lCgogICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfaGFzaCA9IHNlbGYuZ2V0X2hhc2goZi5yZWFkKCksIGhhc2hlcikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgYWN0dWFsX2hhc2ggIT0gaGFzaF92YWx1ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKChwYXRoLCAnaGFzaCcsIGhhc2hfdmFsdWUsIGFjdHVhbF9oYXNoKSkKICAgICAgICByZXR1cm4gbWlzbWF0Y2hlcwoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBzaGFyZWRfbG9jYXRpb25zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgZGljdGlvbmFyeSBvZiBzaGFyZWQgbG9jYXRpb25zIHdob3NlIGtleXMgYXJlIGluIHRoZSBzZXQgJ3ByZWZpeCcsCiAgICAgICAgJ3B1cmVsaWInLCAncGxhdGxpYicsICdzY3JpcHRzJywgJ2hlYWRlcnMnLCAnZGF0YScgYW5kICduYW1lc3BhY2UnLgogICAgICAgIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoYXQgY2F0ZWdvcnkgZm9yCiAgICAgICAgdGhpcyBkaXN0cmlidXRpb24sIGFuZCB0YWtlcyBpbnRvIGFjY291bnQgYW55IHBhdGhzIHNlbGVjdGVkIGJ5IHRoZQogICAgICAgIHVzZXIgYXQgaW5zdGFsbGF0aW9uIHRpbWUgKGUuZy4gdmlhIGNvbW1hbmQtbGluZSBhcmd1bWVudHMpLiBJbiB0aGUKICAgICAgICBjYXNlIG9mIHRoZSAnbmFtZXNwYWNlJyBrZXksIHRoaXMgd291bGQgYmUgYSBsaXN0IG9mIGFic29sdXRlIHBhdGhzCiAgICAgICAgZm9yIHRoZSByb290cyBvZiBuYW1lc3BhY2UgcGFja2FnZXMgaW4gdGhpcyBkaXN0cmlidXRpb24uCgogICAgICAgIFRoZSBmaXJzdCB0aW1lIHRoaXMgcHJvcGVydHkgaXMgYWNjZXNzZWQsIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBpcwogICAgICAgIHJlYWQgZnJvbSB0aGUgU0hBUkVEIGZpbGUgaW4gdGhlIC5kaXN0LWluZm8gZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgc2hhcmVkX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnU0hBUkVEJykKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzaGFyZWRfcGF0aCk6CiAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4oc2hhcmVkX3BhdGgsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgICAgIGxpbmVzID0gZi5yZWFkKCkuc3BsaXRsaW5lcygpCiAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3BsaXQoJz0nLCAxKQogICAgICAgICAgICAgICAgaWYga2V5ID09ICduYW1lc3BhY2UnOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRkZWZhdWx0KGtleSwgW10pLmFwcGVuZCh2YWx1ZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgd3JpdGVfc2hhcmVkX2xvY2F0aW9ucyhzZWxmLCBwYXRocywgZHJ5X3J1bj1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGUgc2hhcmVkIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIHRoZSBTSEFSRUQgZmlsZSBpbiAuZGlzdC1pbmZvLgogICAgICAgIDpwYXJhbSBwYXRoczogQSBkaWN0aW9uYXJ5IGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKICAgICAgICA6bWV0aDpgc2hhcmVkX2xvY2F0aW9uc2AuCiAgICAgICAgOnBhcmFtIGRyeV9ydW46IElmIFRydWUsIHRoZSBhY3Rpb24gaXMgbG9nZ2VkIGJ1dCBubyBmaWxlIGlzIGFjdHVhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4uCiAgICAgICAgOnJldHVybjogVGhlIHBhdGggb2YgdGhlIGZpbGUgd3JpdHRlbiB0by4KICAgICAgICAiIiIKICAgICAgICBzaGFyZWRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdTSEFSRUQnKQogICAgICAgIGxvZ2dlci5pbmZvKCdjcmVhdGluZyAlcycsIHNoYXJlZF9wYXRoKQogICAgICAgIGlmIGRyeV9ydW46CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgbGluZXMgPSBbXQogICAgICAgIGZvciBrZXkgaW4gKCdwcmVmaXgnLCAnbGliJywgJ2hlYWRlcnMnLCAnc2NyaXB0cycsICdkYXRhJyk6CiAgICAgICAgICAgIHBhdGggPSBwYXRoc1trZXldCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aHNba2V5XSk6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyVzPSVzJyAlIChrZXksICBwYXRoKSkKICAgICAgICBmb3IgbnMgaW4gcGF0aHMuZ2V0KCduYW1lc3BhY2UnLCAoKSk6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnbmFtZXNwYWNlPSVzJyAlIG5zKQoKICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHNoYXJlZF9wYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKGxpbmVzKSkKICAgICAgICByZXR1cm4gc2hhcmVkX3BhdGgKCiAgICBkZWYgZ2V0X2Rpc3RpbmZvX3Jlc291cmNlKHNlbGYsIHBhdGgpOgogICAgICAgIGlmIHBhdGggbm90IGluIERJU1RfRklMRVM6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgcGF0aCBmb3IgYSBkaXN0LWluZm8gZmlsZTogJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclciBhdCAlcicgJSAocGF0aCwgc2VsZi5wYXRoKSkKICAgICAgICBmaW5kZXIgPSByZXNvdXJjZXMuZmluZGVyX2Zvcl9wYXRoKHNlbGYucGF0aCkKICAgICAgICBpZiBmaW5kZXIgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignVW5hYmxlIHRvIGdldCBhIGZpbmRlciBmb3IgJXMnICUgc2VsZi5wYXRoKQogICAgICAgIHJldHVybiBmaW5kZXIuZmluZChwYXRoKQoKICAgIGRlZiBnZXRfZGlzdGluZm9fZmlsZShzZWxmLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgcGF0aCBsb2NhdGVkIHVuZGVyIHRoZSBgYC5kaXN0LWluZm9gYCBkaXJlY3RvcnkuIFJldHVybnMgYQogICAgICAgIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGguCgogICAgICAgIDpwYXJhbWV0ZXIgcGF0aDogYSBgYCcvJ2BgLXNlcGFyYXRlZCBwYXRoIHJlbGF0aXZlIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgYGAuZGlzdC1pbmZvYGAgZGlyZWN0b3J5IG9yIGFuIGFic29sdXRlIHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICBJZiAqcGF0aCogaXMgYW4gYWJzb2x1dGUgcGF0aCBhbmQgZG9lc24ndCBzdGFydAogICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgYGAuZGlzdC1pbmZvYGAgZGlyZWN0b3J5IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICBhIDpjbGFzczpgRGlzdGxpYkV4Y2VwdGlvbmAgaXMgcmFpc2VkCiAgICAgICAgOnR5cGUgcGF0aDogc3RyCiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICAjIENoZWNrIGlmIGl0IGlzIGFuIGFic29sdXRlIHBhdGggICMgWFhYIHVzZSByZWxwYXRoLCBhZGQgdGVzdHMKICAgICAgICBpZiBwYXRoLmZpbmQob3Muc2VwKSA+PSAwOgogICAgICAgICAgICAjIGl0J3MgYW4gYWJzb2x1dGUgcGF0aD8KICAgICAgICAgICAgZGlzdGluZm9fZGlybmFtZSwgcGF0aCA9IHBhdGguc3BsaXQob3Muc2VwKVstMjpdCiAgICAgICAgICAgIGlmIGRpc3RpbmZvX2Rpcm5hbWUgIT0gc2VsZi5wYXRoLnNwbGl0KG9zLnNlcClbLTFdOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAnZGlzdC1pbmZvIGZpbGUgJXIgZG9lcyBub3QgYmVsb25nIHRvIHRoZSAlciAlcyAnCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3RyaWJ1dGlvbicgJSAocGF0aCwgc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pKQoKICAgICAgICAjIFRoZSBmaWxlIG11c3QgYmUgcmVsYXRpdmUKICAgICAgICBpZiBwYXRoIG5vdCBpbiBESVNUX0ZJTEVTOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIHBhdGggZm9yIGEgZGlzdC1pbmZvIGZpbGU6ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgYXQgJXInICUgKHBhdGgsIHNlbGYucGF0aCkpCgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBwYXRoKQoKICAgIGRlZiBsaXN0X2Rpc3RpbmZvX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGVzIG92ZXIgdGhlIGBgUkVDT1JEYGAgZW50cmllcyBhbmQgcmV0dXJucyBwYXRocyBmb3IgZWFjaCBsaW5lIGlmCiAgICAgICAgdGhlIHBhdGggaXMgcG9pbnRpbmcgdG8gYSBmaWxlIGxvY2F0ZWQgaW4gdGhlIGBgLmRpc3QtaW5mb2BgIGRpcmVjdG9yeQogICAgICAgIG9yIG9uZSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMuCgogICAgICAgIDpyZXR1cm5zOiBpdGVyYXRvciBvZiBwYXRocwogICAgICAgICIiIgogICAgICAgIGJhc2UgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQogICAgICAgIGZvciBwYXRoLCBjaGVja3N1bSwgc2l6ZSBpbiBzZWxmLl9nZXRfcmVjb3JkcygpOgogICAgICAgICAgICAjIFhYWCBhZGQgc2VwYXJhdG9yIG9yIHVzZSByZWFsIHJlbHBhdGggYWxnbwogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgcGF0aCkKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKHNlbGYucGF0aCk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRoCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIChpc2luc3RhbmNlKG90aGVyLCBJbnN0YWxsZWREaXN0cmlidXRpb24pIGFuZAogICAgICAgICAgICAgICAgc2VsZi5wYXRoID09IG90aGVyLnBhdGgpCgogICAgIyBTZWUgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9yZWZlcmVuY2UvZGF0YW1vZGVsI29iamVjdC5fX2hhc2hfXwogICAgX19oYXNoX18gPSBvYmplY3QuX19oYXNoX18KCgpjbGFzcyBFZ2dJbmZvRGlzdHJpYnV0aW9uKEJhc2VJbnN0YWxsZWREaXN0cmlidXRpb24pOgogICAgIiIiQ3JlYXRlZCB3aXRoIHRoZSAqcGF0aCogb2YgdGhlIGBgLmVnZy1pbmZvYGAgZGlyZWN0b3J5IG9yIGZpbGUgcHJvdmlkZWQKICAgIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSXQgcmVhZHMgdGhlIG1ldGFkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBpdHNlbGYsIG9yCiAgICBpZiB0aGUgZ2l2ZW4gcGF0aCBoYXBwZW5zIHRvIGJlIGEgZGlyZWN0b3J5LCB0aGUgbWV0YWRhdGEgaXMgcmVhZCBmcm9tIHRoZQogICAgZmlsZSBgYFBLRy1JTkZPYGAgdW5kZXIgdGhhdCBkaXJlY3RvcnkuIiIiCgogICAgcmVxdWVzdGVkID0gVHJ1ZSAgICAjIGFzIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcsIGFzc3VtZSBpdCB3YXMKICAgIHNoYXJlZF9sb2NhdGlvbnMgPSB7fQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBlbnY9Tm9uZSk6CiAgICAgICAgZGVmIHNldF9uYW1lX2FuZF92ZXJzaW9uKHMsIG4sIHYpOgogICAgICAgICAgICBzLm5hbWUgPSBuCiAgICAgICAgICAgIHMua2V5ID0gbi5sb3dlcigpICAgIyBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucwogICAgICAgICAgICBzLnZlcnNpb24gPSB2CgogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKICAgICAgICBzZWxmLmRpc3RfcGF0aCA9IGVudgogICAgICAgIGlmIGVudiBhbmQgZW52Ll9jYWNoZV9lbmFibGVkIGFuZCBwYXRoIGluIGVudi5fY2FjaGVfZWdnLnBhdGg6CiAgICAgICAgICAgIG1ldGFkYXRhID0gZW52Ll9jYWNoZV9lZ2cucGF0aFtwYXRoXS5tZXRhZGF0YQogICAgICAgICAgICBzZXRfbmFtZV9hbmRfdmVyc2lvbihzZWxmLCBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1ldGFkYXRhID0gc2VsZi5fZ2V0X21ldGFkYXRhKHBhdGgpCgogICAgICAgICAgICAjIE5lZWQgdG8gYmUgc2V0IGJlZm9yZSBjYWNoaW5nCiAgICAgICAgICAgIHNldF9uYW1lX2FuZF92ZXJzaW9uKHNlbGYsIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLnZlcnNpb24pCgogICAgICAgICAgICBpZiBlbnYgYW5kIGVudi5fY2FjaGVfZW5hYmxlZDoKICAgICAgICAgICAgICAgIGVudi5fY2FjaGVfZWdnLmFkZChzZWxmKQogICAgICAgIHN1cGVyKEVnZ0luZm9EaXN0cmlidXRpb24sIHNlbGYpLl9faW5pdF9fKG1ldGFkYXRhLCBwYXRoLCBlbnYpCgogICAgZGVmIF9nZXRfbWV0YWRhdGEoc2VsZiwgcGF0aCk6CiAgICAgICAgcmVxdWlyZXMgPSBOb25lCgogICAgICAgIGRlZiBwYXJzZV9yZXF1aXJlc19kYXRhKGRhdGEpOgogICAgICAgICAgICAiIiJDcmVhdGUgYSBsaXN0IG9mIGRlcGVuZGVuY2llcyBmcm9tIGEgcmVxdWlyZXMudHh0IGZpbGUuCgogICAgICAgICAgICAqZGF0YSo6IHRoZSBjb250ZW50cyBvZiBhIHNldHVwdG9vbHMtcHJvZHVjZWQgcmVxdWlyZXMudHh0IGZpbGUuCiAgICAgICAgICAgICIiIgogICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgbGluZXMgPSBkYXRhLnNwbGl0bGluZXMoKQogICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnWycpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdVbmV4cGVjdGVkIGxpbmU6IHF1aXR0aW5nIHJlcXVpcmVtZW50IHNjYW46ICVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICByID0gcGFyc2VfcmVxdWlyZW1lbnQobGluZSkKICAgICAgICAgICAgICAgIGlmIG5vdCByOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdOb3QgcmVjb2duaXNlZCBhcyBhIHJlcXVpcmVtZW50OiAlcicsIGxpbmUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHIuZXh0cmFzOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdleHRyYSByZXF1aXJlbWVudHMgaW4gcmVxdWlyZXMudHh0IGFyZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdCBzdXBwb3J0ZWQnKQogICAgICAgICAgICAgICAgaWYgbm90IHIuY29uc3RyYWludHM6CiAgICAgICAgICAgICAgICAgICAgcmVxcy5hcHBlbmQoci5uYW1lKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb25zID0gJywgJy5qb2luKCclcyVzJyAlIGMgZm9yIGMgaW4gci5jb25zdHJhaW50cykKICAgICAgICAgICAgICAgICAgICByZXFzLmFwcGVuZCgnJXMgKCVzKScgJSAoci5uYW1lLCBjb25zKSkKICAgICAgICAgICAgcmV0dXJuIHJlcXMKCiAgICAgICAgZGVmIHBhcnNlX3JlcXVpcmVzX3BhdGgocmVxX3BhdGgpOgogICAgICAgICAgICAiIiJDcmVhdGUgYSBsaXN0IG9mIGRlcGVuZGVuY2llcyBmcm9tIGEgcmVxdWlyZXMudHh0IGZpbGUuCgogICAgICAgICAgICAqcmVxX3BhdGgqOiB0aGUgcGF0aCB0byBhIHNldHVwdG9vbHMtcHJvZHVjZWQgcmVxdWlyZXMudHh0IGZpbGUuCiAgICAgICAgICAgICIiIgoKICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocmVxX3BhdGgsICdyJywgJ3V0Zi04JykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgcmVxcyA9IHBhcnNlX3JlcXVpcmVzX2RhdGEoZnAucmVhZCgpKQogICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgcmV0dXJuIHJlcXMKCiAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLmVnZycpOgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgbWV0YV9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycsICdQS0ctSU5GTycpCiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKHBhdGg9bWV0YV9wYXRoLCBzY2hlbWU9J2xlZ2FjeScpCiAgICAgICAgICAgICAgICByZXFfcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nLCAncmVxdWlyZXMudHh0JykKICAgICAgICAgICAgICAgIHJlcXVpcmVzID0gcGFyc2VfcmVxdWlyZXNfcGF0aChyZXFfcGF0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgRklYTUUgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHppcGZpbGUgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgICAgemlwZiA9IHppcGltcG9ydC56aXBpbXBvcnRlcihwYXRoKQogICAgICAgICAgICAgICAgZmlsZW9iaiA9IFN0cmluZ0lPKAogICAgICAgICAgICAgICAgICAgIHppcGYuZ2V0X2RhdGEoJ0VHRy1JTkZPL1BLRy1JTkZPJykuZGVjb2RlKCd1dGY4JykpCiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKGZpbGVvYmo9ZmlsZW9iaiwgc2NoZW1lPSdsZWdhY3knKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSB6aXBmLmdldF9kYXRhKCdFR0ctSU5GTy9yZXF1aXJlcy50eHQnKQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzID0gcGFyc2VfcmVxdWlyZXNfZGF0YShkYXRhLmRlY29kZSgndXRmLTgnKSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzID0gTm9uZQogICAgICAgIGVsaWYgcGF0aC5lbmRzd2l0aCgnLmVnZy1pbmZvJyk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgICAgICByZXFfcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAncmVxdWlyZXMudHh0JykKICAgICAgICAgICAgICAgIHJlcXVpcmVzID0gcGFyc2VfcmVxdWlyZXNfcGF0aChyZXFfcGF0aCkKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ1BLRy1JTkZPJykKICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShwYXRoPXBhdGgsIHNjaGVtZT0nbGVnYWN5JykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdwYXRoIG11c3QgZW5kIHdpdGggLmVnZy1pbmZvIG9yIC5lZ2csICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ290ICVyJyAlIHBhdGgpCgogICAgICAgIGlmIHJlcXVpcmVzOgogICAgICAgICAgICBtZXRhZGF0YS5hZGRfcmVxdWlyZW1lbnRzKHJlcXVpcmVzKQogICAgICAgIHJldHVybiBtZXRhZGF0YQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxFZ2dJbmZvRGlzdHJpYnV0aW9uICVyICVzIGF0ICVyPicgJSAoCiAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uLCBzZWxmLnBhdGgpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIGNoZWNrX2luc3RhbGxlZF9maWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVja3MgdGhhdCB0aGUgaGFzaGVzIGFuZCBzaXplcyBvZiB0aGUgZmlsZXMgaW4gYGBSRUNPUkRgYCBhcmUKICAgICAgICBtYXRjaGVkIGJ5IHRoZSBmaWxlcyB0aGVtc2VsdmVzLiBSZXR1cm5zIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mCiAgICAgICAgbWlzbWF0Y2hlcy4gRWFjaCBlbnRyeSBpbiB0aGUgbWlzbWF0Y2ggbGlzdCB3aWxsIGJlIGEgdHVwbGUgY29uc2lzdGluZwogICAgICAgIG9mIHRoZSBwYXRoLCAnZXhpc3RzJywgJ3NpemUnIG9yICdoYXNoJyBhY2NvcmRpbmcgdG8gd2hhdCBkaWRuJ3QgbWF0Y2gKICAgICAgICAoZXhpc3RlbmNlIGlzIGNoZWNrZWQgZmlyc3QsIHRoZW4gc2l6ZSwgdGhlbiBoYXNoKSwgdGhlIGV4cGVjdGVkCiAgICAgICAgdmFsdWUgYW5kIHRoZSBhY3R1YWwgdmFsdWUuCiAgICAgICAgIiIiCiAgICAgICAgbWlzbWF0Y2hlcyA9IFtdCiAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnaW5zdGFsbGVkLWZpbGVzLnR4dCcpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVjb3JkX3BhdGgpOgogICAgICAgICAgICBmb3IgcGF0aCwgXywgXyBpbiBzZWxmLmxpc3RfaW5zdGFsbGVkX2ZpbGVzKCk6CiAgICAgICAgICAgICAgICBpZiBwYXRoID09IHJlY29yZF9wYXRoOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQoKHBhdGgsICdleGlzdHMnLCBUcnVlLCBGYWxzZSkpCiAgICAgICAgcmV0dXJuIG1pc21hdGNoZXMKCiAgICBkZWYgbGlzdF9pbnN0YWxsZWRfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZXMgb3ZlciB0aGUgYGBpbnN0YWxsZWQtZmlsZXMudHh0YGAgZW50cmllcyBhbmQgcmV0dXJucyBhIHR1cGxlCiAgICAgICAgYGAocGF0aCwgaGFzaCwgc2l6ZSlgYCBmb3IgZWFjaCBsaW5lLgoKICAgICAgICA6cmV0dXJuczogYSBsaXN0IG9mIChwYXRoLCBoYXNoLCBzaXplKQogICAgICAgICIiIgoKICAgICAgICBkZWYgX21kNShwYXRoKToKICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgJ3JiJykKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubWQ1KGNvbnRlbnQpLmhleGRpZ2VzdCgpCgogICAgICAgIGRlZiBfc2l6ZShwYXRoKToKICAgICAgICAgICAgcmV0dXJuIG9zLnN0YXQocGF0aCkuc3Rfc2l6ZQoKICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlY29yZF9wYXRoKToKICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihyZWNvcmRfcGF0aCwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgcCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNlbGYucGF0aCwgbGluZSkpCiAgICAgICAgICAgICAgICAgICAgIyAiLi8iIGlzIHByZXNlbnQgYXMgYSBtYXJrZXIgYmV0d2VlbiBpbnN0YWxsZWQgZmlsZXMKICAgICAgICAgICAgICAgICAgICAjIGFuZCBpbnN0YWxsYXRpb24gbWV0YWRhdGEgZmlsZXMKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdOb24tZXhpc3RlbnQgZmlsZTogJXMnLCBwKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBwLmVuZHN3aXRoKCgnLnB5YycsICcucHlvJykpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgI290aGVyd2lzZSBmYWxsIHRocm91Z2ggYW5kIGZhaWwKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwKToKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgocCwgX21kNShwKSwgX3NpemUocCkpKQogICAgICAgICAgICByZXN1bHQuYXBwZW5kKChyZWNvcmRfcGF0aCwgTm9uZSwgTm9uZSkpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBsaXN0X2Rpc3RpbmZvX2ZpbGVzKHNlbGYsIGFic29sdXRlPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlcyBvdmVyIHRoZSBgYGluc3RhbGxlZC1maWxlcy50eHRgYCBlbnRyaWVzIGFuZCByZXR1cm5zIHBhdGhzIGZvcgogICAgICAgIGVhY2ggbGluZSBpZiB0aGUgcGF0aCBpcyBwb2ludGluZyB0byBhIGZpbGUgbG9jYXRlZCBpbiB0aGUKICAgICAgICBgYC5lZ2ctaW5mb2BgIGRpcmVjdG9yeSBvciBvbmUgb2YgaXRzIHN1YmRpcmVjdG9yaWVzLgoKICAgICAgICA6cGFyYW1ldGVyIGFic29sdXRlOiBJZiAqYWJzb2x1dGUqIGlzIGBgVHJ1ZWBgLCBlYWNoIHJldHVybmVkIHBhdGggaXMKICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCBpbnRvIGEgbG9jYWwgYWJzb2x1dGUgcGF0aC4gT3RoZXJ3aXNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgIHJhdyB2YWx1ZSBmcm9tIGBgaW5zdGFsbGVkLWZpbGVzLnR4dGBgIGlzIHJldHVybmVkLgogICAgICAgIDp0eXBlIGFic29sdXRlOiBib29sZWFuCiAgICAgICAgOnJldHVybnM6IGl0ZXJhdG9yIG9mIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnaW5zdGFsbGVkLWZpbGVzLnR4dCcpCiAgICAgICAgc2tpcCA9IFRydWUKICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHJlY29yZF9wYXRoLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICBpZiBsaW5lID09ICcuLyc6CiAgICAgICAgICAgICAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIG5vdCBza2lwOgogICAgICAgICAgICAgICAgICAgIHAgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihzZWxmLnBhdGgsIGxpbmUpKQogICAgICAgICAgICAgICAgICAgIGlmIHAuc3RhcnRzd2l0aChzZWxmLnBhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBhYnNvbHV0ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHAKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gKGlzaW5zdGFuY2Uob3RoZXIsIEVnZ0luZm9EaXN0cmlidXRpb24pIGFuZAogICAgICAgICAgICAgICAgc2VsZi5wYXRoID09IG90aGVyLnBhdGgpCgogICAgIyBTZWUgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9yZWZlcmVuY2UvZGF0YW1vZGVsI29iamVjdC5fX2hhc2hfXwogICAgX19oYXNoX18gPSBvYmplY3QuX19oYXNoX18KCm5ld19kaXN0X2NsYXNzID0gSW5zdGFsbGVkRGlzdHJpYnV0aW9uCm9sZF9kaXN0X2NsYXNzID0gRWdnSW5mb0Rpc3RyaWJ1dGlvbgoKCmNsYXNzIERlcGVuZGVuY3lHcmFwaChvYmplY3QpOgogICAgIiIiCiAgICBSZXByZXNlbnRzIGEgZGVwZW5kZW5jeSBncmFwaCBiZXR3ZWVuIGRpc3RyaWJ1dGlvbnMuCgogICAgVGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwcyBhcmUgc3RvcmVkIGluIGFuIGBgYWRqYWNlbmN5X2xpc3RgYCB0aGF0IG1hcHMKICAgIGRpc3RyaWJ1dGlvbnMgdG8gYSBsaXN0IG9mIGBgKG90aGVyLCBsYWJlbClgYCB0dXBsZXMgd2hlcmUgIGBgb3RoZXJgYAogICAgaXMgYSBkaXN0cmlidXRpb24gYW5kIHRoZSBlZGdlIGlzIGxhYmVsZWQgd2l0aCBgYGxhYmVsYGAgKGkuZS4gdGhlIHZlcnNpb24KICAgIHNwZWNpZmllciwgaWYgc3VjaCB3YXMgcHJvdmlkZWQpLiBBbHNvLCBmb3IgbW9yZSBlZmZpY2llbnQgdHJhdmVyc2FsLCBmb3IKICAgIGV2ZXJ5IGRpc3RyaWJ1dGlvbiBgYHhgYCwgYSBsaXN0IG9mIHByZWRlY2Vzc29ycyBpcyBrZXB0IGluCiAgICBgYHJldmVyc2VfbGlzdFt4XWBgLiBBbiBlZGdlIGZyb20gZGlzdHJpYnV0aW9uIGBgYWBgIHRvCiAgICBkaXN0cmlidXRpb24gYGBiYGAgbWVhbnMgdGhhdCBgYGFgYCBkZXBlbmRzIG9uIGBgYmBgLiBJZiBhbnkgbWlzc2luZwogICAgZGVwZW5kZW5jaWVzIGFyZSBmb3VuZCwgdGhleSBhcmUgc3RvcmVkIGluIGBgbWlzc2luZ2BgLCB3aGljaCBpcyBhCiAgICBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBkaXN0cmlidXRpb25zIHRvIGEgbGlzdCBvZiByZXF1aXJlbWVudHMgdGhhdCB3ZXJlIG5vdAogICAgcHJvdmlkZWQgYnkgYW55IG90aGVyIGRpc3RyaWJ1dGlvbnMuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5hZGphY2VuY3lfbGlzdCA9IHt9CiAgICAgICAgc2VsZi5yZXZlcnNlX2xpc3QgPSB7fQogICAgICAgIHNlbGYubWlzc2luZyA9IHt9CgogICAgZGVmIGFkZF9kaXN0cmlidXRpb24oc2VsZiwgZGlzdHJpYnV0aW9uKToKICAgICAgICAiIiJBZGQgdGhlICpkaXN0cmlidXRpb24qIHRvIHRoZSBncmFwaC4KCiAgICAgICAgOnR5cGUgZGlzdHJpYnV0aW9uOiA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuSW5zdGFsbGVkRGlzdHJpYnV0aW9uYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkVnZ0luZm9EaXN0cmlidXRpb25gCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hZGphY2VuY3lfbGlzdFtkaXN0cmlidXRpb25dID0gW10KICAgICAgICBzZWxmLnJldmVyc2VfbGlzdFtkaXN0cmlidXRpb25dID0gW10KICAgICAgICAjc2VsZi5taXNzaW5nW2Rpc3RyaWJ1dGlvbl0gPSBbXQoKICAgIGRlZiBhZGRfZWRnZShzZWxmLCB4LCB5LCBsYWJlbD1Ob25lKToKICAgICAgICAiIiJBZGQgYW4gZWRnZSBmcm9tIGRpc3RyaWJ1dGlvbiAqeCogdG8gZGlzdHJpYnV0aW9uICp5KiB3aXRoIHRoZSBnaXZlbgogICAgICAgICpsYWJlbCouCgogICAgICAgIDp0eXBlIHg6IDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5JbnN0YWxsZWREaXN0cmlidXRpb25gIG9yCiAgICAgICAgICAgICAgICAgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkVnZ0luZm9EaXN0cmlidXRpb25gCiAgICAgICAgOnR5cGUgeTogOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkluc3RhbGxlZERpc3RyaWJ1dGlvbmAgb3IKICAgICAgICAgICAgICAgICA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuRWdnSW5mb0Rpc3RyaWJ1dGlvbmAKICAgICAgICA6dHlwZSBsYWJlbDogYGBzdHJgYCBvciBgYE5vbmVgYAogICAgICAgICIiIgogICAgICAgIHNlbGYuYWRqYWNlbmN5X2xpc3RbeF0uYXBwZW5kKCh5LCBsYWJlbCkpCiAgICAgICAgIyBtdWx0aXBsZSBlZGdlcyBhcmUgYWxsb3dlZCwgc28gYmUgY2FyZWZ1bAogICAgICAgIGlmIHggbm90IGluIHNlbGYucmV2ZXJzZV9saXN0W3ldOgogICAgICAgICAgICBzZWxmLnJldmVyc2VfbGlzdFt5XS5hcHBlbmQoeCkKCiAgICBkZWYgYWRkX21pc3Npbmcoc2VsZiwgZGlzdHJpYnV0aW9uLCByZXF1aXJlbWVudCk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgbWlzc2luZyAqcmVxdWlyZW1lbnQqIGZvciB0aGUgZ2l2ZW4gKmRpc3RyaWJ1dGlvbiouCgogICAgICAgIDp0eXBlIGRpc3RyaWJ1dGlvbjogOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkluc3RhbGxlZERpc3RyaWJ1dGlvbmAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5FZ2dJbmZvRGlzdHJpYnV0aW9uYAogICAgICAgIDp0eXBlIHJlcXVpcmVtZW50OiBgYHN0cmBgCiAgICAgICAgIiIiCiAgICAgICAgbG9nZ2VyLmRlYnVnKCclcyBtaXNzaW5nICVyJywgZGlzdHJpYnV0aW9uLCByZXF1aXJlbWVudCkKICAgICAgICBzZWxmLm1pc3Npbmcuc2V0ZGVmYXVsdChkaXN0cmlidXRpb24sIFtdKS5hcHBlbmQocmVxdWlyZW1lbnQpCgogICAgZGVmIF9yZXByX2Rpc3Qoc2VsZiwgZGlzdCk6CiAgICAgICAgcmV0dXJuICclcyAlcycgJSAoZGlzdC5uYW1lLCBkaXN0LnZlcnNpb24pCgogICAgZGVmIHJlcHJfbm9kZShzZWxmLCBkaXN0LCBsZXZlbD0xKToKICAgICAgICAiIiJQcmludHMgb25seSBhIHN1YmdyYXBoIiIiCiAgICAgICAgb3V0cHV0ID0gW3NlbGYuX3JlcHJfZGlzdChkaXN0KV0KICAgICAgICBmb3Igb3RoZXIsIGxhYmVsIGluIHNlbGYuYWRqYWNlbmN5X2xpc3RbZGlzdF06CiAgICAgICAgICAgIGRpc3QgPSBzZWxmLl9yZXByX2Rpc3Qob3RoZXIpCiAgICAgICAgICAgIGlmIGxhYmVsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZGlzdCA9ICclcyBbJXNdJyAlIChkaXN0LCBsYWJlbCkKICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgnICAgICcgKiBsZXZlbCArIHN0cihkaXN0KSkKICAgICAgICAgICAgc3Vib3V0cHV0ID0gc2VsZi5yZXByX25vZGUob3RoZXIsIGxldmVsICsgMSkKICAgICAgICAgICAgc3VicyA9IHN1Ym91dHB1dC5zcGxpdCgnXG4nKQogICAgICAgICAgICBvdXRwdXQuZXh0ZW5kKHN1YnNbMTpdKQogICAgICAgIHJldHVybiAnXG4nLmpvaW4ob3V0cHV0KQoKICAgIGRlZiB0b19kb3Qoc2VsZiwgZiwgc2tpcF9kaXNjb25uZWN0ZWQ9VHJ1ZSk6CiAgICAgICAgIiIiV3JpdGVzIGEgRE9UIG91dHB1dCBmb3IgdGhlIGdyYXBoIHRvIHRoZSBwcm92aWRlZCBmaWxlICpmKi4KCiAgICAgICAgSWYgKnNraXBfZGlzY29ubmVjdGVkKiBpcyBzZXQgdG8gYGBUcnVlYGAsIHRoZW4gYWxsIGRpc3RyaWJ1dGlvbnMKICAgICAgICB0aGF0IGFyZSBub3QgZGVwZW5kZW50IG9uIGFueSBvdGhlciBkaXN0cmlidXRpb24gYXJlIHNraXBwZWQuCgogICAgICAgIDp0eXBlIGY6IGhhcyB0byBzdXBwb3J0IGBgZmlsZWBgLWxpa2Ugb3BlcmF0aW9ucwogICAgICAgIDp0eXBlIHNraXBfZGlzY29ubmVjdGVkOiBgYGJvb2xgYAogICAgICAgICIiIgogICAgICAgIGRpc2Nvbm5lY3RlZCA9IFtdCgogICAgICAgIGYud3JpdGUoImRpZ3JhcGggZGVwZW5kZW5jaWVzIHtcbiIpCiAgICAgICAgZm9yIGRpc3QsIGFkanMgaW4gc2VsZi5hZGphY2VuY3lfbGlzdC5pdGVtcygpOgogICAgICAgICAgICBpZiBsZW4oYWRqcykgPT0gMCBhbmQgbm90IHNraXBfZGlzY29ubmVjdGVkOgogICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkLmFwcGVuZChkaXN0KQogICAgICAgICAgICBmb3Igb3RoZXIsIGxhYmVsIGluIGFkanM6CiAgICAgICAgICAgICAgICBpZiBub3QgbGFiZWwgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCciJXMiIC0+ICIlcyIgW2xhYmVsPSIlcyJdXG4nICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXN0Lm5hbWUsIG90aGVyLm5hbWUsIGxhYmVsKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnIiVzIiAtPiAiJXMiXG4nICUgKGRpc3QubmFtZSwgb3RoZXIubmFtZSkpCiAgICAgICAgaWYgbm90IHNraXBfZGlzY29ubmVjdGVkIGFuZCBsZW4oZGlzY29ubmVjdGVkKSA+IDA6CiAgICAgICAgICAgIGYud3JpdGUoJ3N1YmdyYXBoIGRpc2Nvbm5lY3RlZCB7XG4nKQogICAgICAgICAgICBmLndyaXRlKCdsYWJlbCA9ICJEaXNjb25uZWN0ZWQiXG4nKQogICAgICAgICAgICBmLndyaXRlKCdiZ2NvbG9yID0gcmVkXG4nKQoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzY29ubmVjdGVkOgogICAgICAgICAgICAgICAgZi53cml0ZSgnIiVzIicgJSBkaXN0Lm5hbWUpCiAgICAgICAgICAgICAgICBmLndyaXRlKCdcbicpCiAgICAgICAgICAgIGYud3JpdGUoJ31cbicpCiAgICAgICAgZi53cml0ZSgnfVxuJykKCiAgICBkZWYgdG9wb2xvZ2ljYWxfc29ydChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQZXJmb3JtIGEgdG9wb2xvZ2ljYWwgc29ydCBvZiB0aGUgZ3JhcGguCiAgICAgICAgOnJldHVybjogQSB0dXBsZSwgdGhlIGZpcnN0IGVsZW1lbnQgb2Ygd2hpY2ggaXMgYSB0b3BvbG9naWNhbGx5IHNvcnRlZAogICAgICAgICAgICAgICAgIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucywgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB3aGljaCBpcyBhCiAgICAgICAgICAgICAgICAgbGlzdCBvZiBkaXN0cmlidXRpb25zIHRoYXQgY2Fubm90IGJlIHNvcnRlZCBiZWNhdXNlIHRoZXkgaGF2ZQogICAgICAgICAgICAgICAgIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBhbmQgc28gZm9ybSBhIGN5Y2xlLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgIyBNYWtlIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBhZGphY2VuY3kgbGlzdAogICAgICAgIGFsaXN0ID0ge30KICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmFkamFjZW5jeV9saXN0Lml0ZW1zKCk6CiAgICAgICAgICAgIGFsaXN0W2tdID0gdls6XQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgU2VlIHdoYXQgd2UgY2FuIHJlbW92ZSBpbiB0aGlzIHJ1bgogICAgICAgICAgICB0b19yZW1vdmUgPSBbXQogICAgICAgICAgICBmb3IgaywgdiBpbiBsaXN0KGFsaXN0Lml0ZW1zKCkpWzpdOgogICAgICAgICAgICAgICAgaWYgbm90IHY6CiAgICAgICAgICAgICAgICAgICAgdG9fcmVtb3ZlLmFwcGVuZChrKQogICAgICAgICAgICAgICAgICAgIGRlbCBhbGlzdFtrXQogICAgICAgICAgICBpZiBub3QgdG9fcmVtb3ZlOgogICAgICAgICAgICAgICAgIyBXaGF0J3MgbGVmdCBpbiBhbGlzdCAoaWYgYW55dGhpbmcpIGlzIGEgY3ljbGUuCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAjIFJlbW92ZSBmcm9tIHRoZSBhZGphY2VuY3kgbGlzdCBvZiBvdGhlcnMKICAgICAgICAgICAgZm9yIGssIHYgaW4gYWxpc3QuaXRlbXMoKToKICAgICAgICAgICAgICAgIGFsaXN0W2tdID0gWyhkLCByKSBmb3IgZCwgciBpbiB2IGlmIGQgbm90IGluIHRvX3JlbW92ZV0KICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdNb3ZpbmcgdG8gcmVzdWx0OiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICBbJyVzICglcyknICUgKGQubmFtZSwgZC52ZXJzaW9uKSBmb3IgZCBpbiB0b19yZW1vdmVdKQogICAgICAgICAgICByZXN1bHQuZXh0ZW5kKHRvX3JlbW92ZSkKICAgICAgICByZXR1cm4gcmVzdWx0LCBsaXN0KGFsaXN0LmtleXMoKSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIiIiUmVwcmVzZW50YXRpb24gb2YgdGhlIGdyYXBoIiIiCiAgICAgICAgb3V0cHV0ID0gW10KICAgICAgICBmb3IgZGlzdCwgYWRqcyBpbiBzZWxmLmFkamFjZW5jeV9saXN0Lml0ZW1zKCk6CiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoc2VsZi5yZXByX25vZGUoZGlzdCkpCiAgICAgICAgcmV0dXJuICdcbicuam9pbihvdXRwdXQpCgoKZGVmIG1ha2VfZ3JhcGgoZGlzdHMsIHNjaGVtZT0nZGVmYXVsdCcpOgogICAgIiIiTWFrZXMgYSBkZXBlbmRlbmN5IGdyYXBoIGZyb20gdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbnMuCgogICAgOnBhcmFtZXRlciBkaXN0czogYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMKICAgIDp0eXBlIGRpc3RzOiBsaXN0IG9mIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5JbnN0YWxsZWREaXN0cmlidXRpb25gIGFuZAogICAgICAgICAgICAgICAgIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5FZ2dJbmZvRGlzdHJpYnV0aW9uYCBpbnN0YW5jZXMKICAgIDpydHlwZTogYSA6Y2xhc3M6YERlcGVuZGVuY3lHcmFwaGAgaW5zdGFuY2UKICAgICIiIgogICAgc2NoZW1lID0gZ2V0X3NjaGVtZShzY2hlbWUpCiAgICBncmFwaCA9IERlcGVuZGVuY3lHcmFwaCgpCiAgICBwcm92aWRlZCA9IHt9ICAjIG1hcHMgbmFtZXMgdG8gbGlzdHMgb2YgKHZlcnNpb24sIGRpc3QpIHR1cGxlcwoKICAgICMgZmlyc3QsIGJ1aWxkIHRoZSBncmFwaCBhbmQgZmluZCBvdXQgd2hhdCdzIHByb3ZpZGVkCiAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICBncmFwaC5hZGRfZGlzdHJpYnV0aW9uKGRpc3QpCgogICAgICAgIGZvciBwIGluIGRpc3QucHJvdmlkZXM6CiAgICAgICAgICAgIG5hbWUsIHZlcnNpb24gPSBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQWRkIHRvIHByb3ZpZGVkOiAlcywgJXMsICVzJywgbmFtZSwgdmVyc2lvbiwgZGlzdCkKICAgICAgICAgICAgcHJvdmlkZWQuc2V0ZGVmYXVsdChuYW1lLCBbXSkuYXBwZW5kKCh2ZXJzaW9uLCBkaXN0KSkKCiAgICAjIG5vdyBtYWtlIHRoZSBlZGdlcwogICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgcmVxdWlyZXMgPSAoZGlzdC5ydW5fcmVxdWlyZXMgfCBkaXN0Lm1ldGFfcmVxdWlyZXMgfAogICAgICAgICAgICAgICAgICAgIGRpc3QuYnVpbGRfcmVxdWlyZXMgfCBkaXN0LmRldl9yZXF1aXJlcykKICAgICAgICBmb3IgcmVxIGluIHJlcXVpcmVzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtYXRjaGVyID0gc2NoZW1lLm1hdGNoZXIocmVxKQogICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICAjIFhYWCBjb21wYXQtbW9kZSBpZiBjYW5ub3QgcmVhZCB0aGUgdmVyc2lvbgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2NvdWxkIG5vdCByZWFkIHZlcnNpb24gJXIgLSB1c2luZyBuYW1lIG9ubHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxKQogICAgICAgICAgICAgICAgbmFtZSA9IHJlcS5zcGxpdCgpWzBdCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gc2NoZW1lLm1hdGNoZXIobmFtZSkKCiAgICAgICAgICAgIG5hbWUgPSBtYXRjaGVyLmtleSAgICMgY2FzZS1pbnNlbnNpdGl2ZQoKICAgICAgICAgICAgbWF0Y2hlZCA9IEZhbHNlCiAgICAgICAgICAgIGlmIG5hbWUgaW4gcHJvdmlkZWQ6CiAgICAgICAgICAgICAgICBmb3IgdmVyc2lvbiwgcHJvdmlkZXIgaW4gcHJvdmlkZWRbbmFtZV06CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXIubWF0Y2godmVyc2lvbikKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gRmFsc2UKCiAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLmFkZF9lZGdlKGRpc3QsIHByb3ZpZGVyLCByZXEpCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIG5vdCBtYXRjaGVkOgogICAgICAgICAgICAgICAgZ3JhcGguYWRkX21pc3NpbmcoZGlzdCwgcmVxKQogICAgcmV0dXJuIGdyYXBoCgoKZGVmIGdldF9kZXBlbmRlbnRfZGlzdHMoZGlzdHMsIGRpc3QpOgogICAgIiIiUmVjdXJzaXZlbHkgZ2VuZXJhdGUgYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMgZnJvbSAqZGlzdHMqIHRoYXQgYXJlCiAgICBkZXBlbmRlbnQgb24gKmRpc3QqLgoKICAgIDpwYXJhbSBkaXN0czogYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMKICAgIDpwYXJhbSBkaXN0OiBhIGRpc3RyaWJ1dGlvbiwgbWVtYmVyIG9mICpkaXN0cyogZm9yIHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAiIiIKICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgogICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2dpdmVuIGRpc3RyaWJ1dGlvbiAlciBpcyBub3QgYSBtZW1iZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHRoZSBsaXN0JyAlIGRpc3QubmFtZSkKICAgIGdyYXBoID0gbWFrZV9ncmFwaChkaXN0cykKCiAgICBkZXAgPSBbZGlzdF0gICMgZGVwZW5kZW50IGRpc3RyaWJ1dGlvbnMKICAgIHRvZG8gPSBncmFwaC5yZXZlcnNlX2xpc3RbZGlzdF0gICMgbGlzdCBvZiBub2RlcyB3ZSBzaG91bGQgaW5zcGVjdAoKICAgIHdoaWxlIHRvZG86CiAgICAgICAgZCA9IHRvZG8ucG9wKCkKICAgICAgICBkZXAuYXBwZW5kKGQpCiAgICAgICAgZm9yIHN1Y2MgaW4gZ3JhcGgucmV2ZXJzZV9saXN0W2RdOgogICAgICAgICAgICBpZiBzdWNjIG5vdCBpbiBkZXA6CiAgICAgICAgICAgICAgICB0b2RvLmFwcGVuZChzdWNjKQoKICAgIGRlcC5wb3AoMCkgICMgcmVtb3ZlIGRpc3QgZnJvbSBkZXAsIHdhcyB0aGVyZSB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzCiAgICByZXR1cm4gZGVwCgoKZGVmIGdldF9yZXF1aXJlZF9kaXN0cyhkaXN0cywgZGlzdCk6CiAgICAiIiJSZWN1cnNpdmVseSBnZW5lcmF0ZSBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmcm9tICpkaXN0cyogdGhhdCBhcmUKICAgIHJlcXVpcmVkIGJ5ICpkaXN0Ki4KCiAgICA6cGFyYW0gZGlzdHM6IGEgbGlzdCBvZiBkaXN0cmlidXRpb25zCiAgICA6cGFyYW0gZGlzdDogYSBkaXN0cmlidXRpb24sIG1lbWJlciBvZiAqZGlzdHMqIGZvciB3aGljaCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgIiIiCiAgICBpZiBkaXN0IG5vdCBpbiBkaXN0czoKICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdnaXZlbiBkaXN0cmlidXRpb24gJXIgaXMgbm90IGEgbWVtYmVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZiB0aGUgbGlzdCcgJSBkaXN0Lm5hbWUpCiAgICBncmFwaCA9IG1ha2VfZ3JhcGgoZGlzdHMpCgogICAgcmVxID0gW10gICMgcmVxdWlyZWQgZGlzdHJpYnV0aW9ucwogICAgdG9kbyA9IGdyYXBoLmFkamFjZW5jeV9saXN0W2Rpc3RdICAjIGxpc3Qgb2Ygbm9kZXMgd2Ugc2hvdWxkIGluc3BlY3QKCiAgICB3aGlsZSB0b2RvOgogICAgICAgIGQgPSB0b2RvLnBvcCgpWzBdCiAgICAgICAgcmVxLmFwcGVuZChkKQogICAgICAgIGZvciBwcmVkIGluIGdyYXBoLmFkamFjZW5jeV9saXN0W2RdOgogICAgICAgICAgICBpZiBwcmVkIG5vdCBpbiByZXE6CiAgICAgICAgICAgICAgICB0b2RvLmFwcGVuZChwcmVkKQoKICAgIHJldHVybiByZXEKCgpkZWYgbWFrZV9kaXN0KG5hbWUsIHZlcnNpb24sICoqa3dhcmdzKToKICAgICIiIgogICAgQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIG1ha2luZyBhIGRpc3QgZ2l2ZW4ganVzdCBhIG5hbWUgYW5kIHZlcnNpb24uCiAgICAiIiIKICAgIHN1bW1hcnkgPSBrd2FyZ3MucG9wKCdzdW1tYXJ5JywgJ1BsYWNlaG9sZGVyIGZvciBzdW1tYXJ5JykKICAgIG1kID0gTWV0YWRhdGEoKiprd2FyZ3MpCiAgICBtZC5uYW1lID0gbmFtZQogICAgbWQudmVyc2lvbiA9IHZlcnNpb24KICAgIG1kLnN1bW1hcnkgPSBzdW1tYXJ5IG9yICdQbGFjZWhvbGRlciBmb3Igc3VtbWFyeScKICAgIHJldHVybiBEaXN0cmlidXRpb24obWQpClBLAwQUAAAAAAAAACEAgzjiLV1SAABdUgAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9pbmRleC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTMgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwppbXBvcnQgaGFzaGxpYgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHNodXRpbAppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgdGVtcGZpbGUKdHJ5OgogICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGR1bW15X3RocmVhZGluZyBpbXBvcnQgVGhyZWFkCgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24KZnJvbSAuY29tcGF0IGltcG9ydCAoSFRUUEJhc2ljQXV0aEhhbmRsZXIsIFJlcXVlc3QsIEhUVFBQYXNzd29yZE1nciwKICAgICAgICAgICAgICAgICAgICAgdXJscGFyc2UsIGJ1aWxkX29wZW5lciwgc3RyaW5nX3R5cGVzKQpmcm9tIC51dGlsIGltcG9ydCBjYWNoZWRfcHJvcGVydHksIHppcF9kaXIsIFNlcnZlclByb3h5Cgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCkRFRkFVTFRfSU5ERVggPSAnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScKREVGQVVMVF9SRUFMTSA9ICdweXBpJwoKY2xhc3MgUGFja2FnZUluZGV4KG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHBhY2thZ2UgaW5kZXggY29tcGF0aWJsZSB3aXRoIFB5UEksIHRoZSBQeXRob24KICAgIFBhY2thZ2UgSW5kZXguCiAgICAiIiIKCiAgICBib3VuZGFyeSA9IGInLS0tLS0tLS0tLVRoSXNfSXNfdEhlX2Rpc3RsaWJfaW5kZXhfYm91TmRhUllfJCcKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSBVUkwgb2YgdGhlIGluZGV4LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgVVJMIGZvciBQeVBJIGlzCiAgICAgICAgICAgICAgICAgICAgdXNlZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnVybCA9IHVybCBvciBERUZBVUxUX0lOREVYCiAgICAgICAgc2VsZi5yZWFkX2NvbmZpZ3VyYXRpb24oKQogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2Uoc2VsZi51cmwpCiAgICAgICAgaWYgcGFyYW1zIG9yIHF1ZXJ5IG9yIGZyYWcgb3Igc2NoZW1lIG5vdCBpbiAoJ2h0dHAnLCAnaHR0cHMnKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCByZXBvc2l0b3J5OiAlcycgJSBzZWxmLnVybCkKICAgICAgICBzZWxmLnBhc3N3b3JkX2hhbmRsZXIgPSBOb25lCiAgICAgICAgc2VsZi5zc2xfdmVyaWZpZXIgPSBOb25lCiAgICAgICAgc2VsZi5ncGcgPSBOb25lCiAgICAgICAgc2VsZi5ncGdfaG9tZSA9IE5vbmUKICAgICAgICBzZWxmLnJwY19wcm94eSA9IE5vbmUKICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3cnKSBhcyBzaW5rOgogICAgICAgICAgICAjIFVzZSBncGcgYnkgZGVmYXVsdCByYXRoZXIgdGhhbiBncGcyLCBhcyBncGcyIGluc2lzdHMgb24KICAgICAgICAgICAgIyBwcm9tcHRpbmcgZm9yIHBhc3N3b3JkcwogICAgICAgICAgICBmb3IgcyBpbiAoJ2dwZycsICdncGcyJyk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoW3MsICctLXZlcnNpb24nXSwgc3Rkb3V0PXNpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXNpbmspCiAgICAgICAgICAgICAgICAgICAgaWYgcmMgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ncGcgPSBzCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICAgICBwYXNzCgogICAgZGVmIF9nZXRfcHlwaXJjX2NvbW1hbmQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBkaXN0dXRpbHMgY29tbWFuZCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBQeVBJIGNvbmZpZ3VyYXRpb25zLgogICAgICAgIDpyZXR1cm46IHRoZSBjb21tYW5kLgogICAgICAgICIiIgogICAgICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgogICAgICAgIGZyb20gZGlzdHV0aWxzLmNvbmZpZyBpbXBvcnQgUHlQSVJDQ29tbWFuZAogICAgICAgIGQgPSBEaXN0cmlidXRpb24oKQogICAgICAgIHJldHVybiBQeVBJUkNDb21tYW5kKGQpCgogICAgZGVmIHJlYWRfY29uZmlndXJhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWFkIHRoZSBQeVBJIGFjY2VzcyBjb25maWd1cmF0aW9uIGFzIHN1cHBvcnRlZCBieSBkaXN0dXRpbHMsIGdldHRpbmcKICAgICAgICBQeVBJIHRvIGRvIHRoZSBhY3R1YWwgd29yay4gVGhpcyBwb3B1bGF0ZXMgYGB1c2VybmFtZWBgLCBgYHBhc3N3b3JkYGAsCiAgICAgICAgYGByZWFsbWBgIGFuZCBgYHVybGBgIGF0dHJpYnV0ZXMgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KICAgICAgICAiIiIKICAgICAgICAjIGdldCBkaXN0dXRpbHMgdG8gZG8gdGhlIHdvcmsKICAgICAgICBjID0gc2VsZi5fZ2V0X3B5cGlyY19jb21tYW5kKCkKICAgICAgICBjLnJlcG9zaXRvcnkgPSBzZWxmLnVybAogICAgICAgIGNmZyA9IGMuX3JlYWRfcHlwaXJjKCkKICAgICAgICBzZWxmLnVzZXJuYW1lID0gY2ZnLmdldCgndXNlcm5hbWUnKQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBjZmcuZ2V0KCdwYXNzd29yZCcpCiAgICAgICAgc2VsZi5yZWFsbSA9IGNmZy5nZXQoJ3JlYWxtJywgJ3B5cGknKQogICAgICAgIHNlbGYudXJsID0gY2ZnLmdldCgncmVwb3NpdG9yeScsIHNlbGYudXJsKQoKICAgIGRlZiBzYXZlX2NvbmZpZ3VyYXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2F2ZSB0aGUgUHlQSSBhY2Nlc3MgY29uZmlndXJhdGlvbi4gWW91IG11c3QgaGF2ZSBzZXQgYGB1c2VybmFtZWBgIGFuZAogICAgICAgIGBgcGFzc3dvcmRgYCBhdHRyaWJ1dGVzIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgoKICAgICAgICBBZ2FpbiwgZGlzdHV0aWxzIGlzIHVzZWQgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2hlY2tfY3JlZGVudGlhbHMoKQogICAgICAgICMgZ2V0IGRpc3R1dGlscyB0byBkbyB0aGUgd29yawogICAgICAgIGMgPSBzZWxmLl9nZXRfcHlwaXJjX2NvbW1hbmQoKQogICAgICAgIGMuX3N0b3JlX3B5cGlyYyhzZWxmLnVzZXJuYW1lLCBzZWxmLnBhc3N3b3JkKQoKICAgIGRlZiBjaGVja19jcmVkZW50aWFscyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayB0aGF0IGBgdXNlcm5hbWVgYCBhbmQgYGBwYXNzd29yZGBgIGhhdmUgYmVlbiBzZXQsIGFuZCByYWlzZSBhbgogICAgICAgIGV4Y2VwdGlvbiBpZiBub3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi51c2VybmFtZSBpcyBOb25lIG9yIHNlbGYucGFzc3dvcmQgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigndXNlcm5hbWUgYW5kIHBhc3N3b3JkIG11c3QgYmUgc2V0JykKICAgICAgICBwbSA9IEhUVFBQYXNzd29yZE1ncigpCiAgICAgICAgXywgbmV0bG9jLCBfLCBfLCBfLCBfID0gdXJscGFyc2Uoc2VsZi51cmwpCiAgICAgICAgcG0uYWRkX3Bhc3N3b3JkKHNlbGYucmVhbG0sIG5ldGxvYywgc2VsZi51c2VybmFtZSwgc2VsZi5wYXNzd29yZCkKICAgICAgICBzZWxmLnBhc3N3b3JkX2hhbmRsZXIgPSBIVFRQQmFzaWNBdXRoSGFuZGxlcihwbSkKCiAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgbWV0YWRhdGEpOgogICAgICAgICIiIgogICAgICAgIFJlZ2lzdGVyIGEgZGlzdHJpYnV0aW9uIG9uIFB5UEksIHVzaW5nIHRoZSBwcm92aWRlZCBtZXRhZGF0YS4KCiAgICAgICAgOnBhcmFtIG1ldGFkYXRhOiBBIDpjbGFzczpgTWV0YWRhdGFgIGluc3RhbmNlIGRlZmluaW5nIGF0IGxlYXN0IGEgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgZGlzdHJpYnV0aW9uIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkLgogICAgICAgIDpyZXR1cm46IFRoZSBIVFRQIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gUHlQSSB1cG9uIHN1Ym1pc3Npb24gb2YgdGhlCiAgICAgICAgICAgICAgICByZXF1ZXN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2hlY2tfY3JlZGVudGlhbHMoKQogICAgICAgIG1ldGFkYXRhLnZhbGlkYXRlKCkKICAgICAgICBkID0gbWV0YWRhdGEudG9kaWN0KCkKICAgICAgICBkWyc6YWN0aW9uJ10gPSAndmVyaWZ5JwogICAgICAgIHJlcXVlc3QgPSBzZWxmLmVuY29kZV9yZXF1ZXN0KGQuaXRlbXMoKSwgW10pCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnNlbmRfcmVxdWVzdChyZXF1ZXN0KQogICAgICAgIGRbJzphY3Rpb24nXSA9ICdzdWJtaXQnCiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZW5jb2RlX3JlcXVlc3QoZC5pdGVtcygpLCBbXSkKICAgICAgICByZXR1cm4gc2VsZi5zZW5kX3JlcXVlc3QocmVxdWVzdCkKCiAgICBkZWYgX3JlYWRlcihzZWxmLCBuYW1lLCBzdHJlYW0sIG91dGJ1Zik6CiAgICAgICAgIiIiCiAgICAgICAgVGhyZWFkIHJ1bm5lciBmb3IgcmVhZGluZyBsaW5lcyBvZiBmcm9tIGEgc3VicHJvY2VzcyBpbnRvIGEgYnVmZmVyLgoKICAgICAgICA6cGFyYW0gbmFtZTogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgc3RyZWFtICh1c2VkIGZvciBsb2dnaW5nIG9ubHkpLgogICAgICAgIDpwYXJhbSBzdHJlYW06IFRoZSBzdHJlYW0gdG8gcmVhZCBmcm9tLiBUaGlzIHdpbGwgdHlwaWNhbGx5IGEgcGlwZQogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byB0aGUgb3V0cHV0IHN0cmVhbSBvZiBhIHN1YnByb2Nlc3MuCiAgICAgICAgOnBhcmFtIG91dGJ1ZjogVGhlIGxpc3QgdG8gYXBwZW5kIHRoZSByZWFkIGxpbmVzIHRvLgogICAgICAgICIiIgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHMgPSBzdHJlYW0ucmVhZGxpbmUoKQogICAgICAgICAgICBpZiBub3QgczoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHMgPSBzLmRlY29kZSgndXRmLTgnKS5yc3RyaXAoKQogICAgICAgICAgICBvdXRidWYuYXBwZW5kKHMpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXM6ICVzJyAlIChuYW1lLCBzKSkKICAgICAgICBzdHJlYW0uY2xvc2UoKQoKICAgIGRlZiBnZXRfc2lnbl9jb21tYW5kKHNlbGYsIGZpbGVuYW1lLCBzaWduZXIsIHNpZ25fcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzdWl0YWJsZSBjb21tYW5kIGZvciBzaWduaW5nIGEgZmlsZS4KCiAgICAgICAgOnBhcmFtIGZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgdG8gYmUgc2lnbmVkLgogICAgICAgIDpwYXJhbSBzaWduZXI6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzaWduZXIgb2YgdGhlIGZpbGUuCiAgICAgICAgOnBhcmFtIHNpZ25fcGFzc3dvcmQ6IFRoZSBwYXNzcGhyYXNlIGZvciB0aGUgc2lnbmVyJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBrZXkgdXNlZCBmb3Igc2lnbmluZy4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHZlcmlmaWNhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSdzIGBgZ3BnX2hvbWVgYCBhdHRyaWJ1dGUgaXMgdXNlZCBpbnN0ZWFkLgogICAgICAgIDpyZXR1cm46IFRoZSBzaWduaW5nIGNvbW1hbmQgYXMgYSBsaXN0IHN1aXRhYmxlIHRvIGJlCiAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIDpjbGFzczpgc3VicHJvY2Vzcy5Qb3BlbmAuCiAgICAgICAgIiIiCiAgICAgICAgY21kID0gW3NlbGYuZ3BnLCAnLS1zdGF0dXMtZmQnLCAnMicsICctLW5vLXR0eSddCiAgICAgICAgaWYga2V5c3RvcmUgaXMgTm9uZToKICAgICAgICAgICAga2V5c3RvcmUgPSBzZWxmLmdwZ19ob21lCiAgICAgICAgaWYga2V5c3RvcmU6CiAgICAgICAgICAgIGNtZC5leHRlbmQoWyctLWhvbWVkaXInLCBrZXlzdG9yZV0pCiAgICAgICAgaWYgc2lnbl9wYXNzd29yZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY21kLmV4dGVuZChbJy0tYmF0Y2gnLCAnLS1wYXNzcGhyYXNlLWZkJywgJzAnXSkKICAgICAgICB0ZCA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgIHNmID0gb3MucGF0aC5qb2luKHRkLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSArICcuYXNjJykKICAgICAgICBjbWQuZXh0ZW5kKFsnLS1kZXRhY2gtc2lnbicsICctLWFybW9yJywgJy0tbG9jYWwtdXNlcicsCiAgICAgICAgICAgICAgICAgICAgc2lnbmVyLCAnLS1vdXRwdXQnLCBzZiwgZmlsZW5hbWVdKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnaW52b2tpbmc6ICVzJywgJyAnLmpvaW4oY21kKSkKICAgICAgICByZXR1cm4gY21kLCBzZgoKICAgIGRlZiBydW5fY29tbWFuZChzZWxmLCBjbWQsIGlucHV0X2RhdGE9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUnVuIGEgY29tbWFuZCBpbiBhIGNoaWxkIHByb2Nlc3MgLCBwYXNzaW5nIGl0IGFueSBpbnB1dCBkYXRhIHNwZWNpZmllZC4KCiAgICAgICAgOnBhcmFtIGNtZDogVGhlIGNvbW1hbmQgdG8gcnVuLgogICAgICAgIDpwYXJhbSBpbnB1dF9kYXRhOiBJZiBzcGVjaWZpZWQsIHRoaXMgbXVzdCBiZSBhIGJ5dGUgc3RyaW5nIGNvbnRhaW5pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0byBiZSBzZW50IHRvIHRoZSBjaGlsZCBwcm9jZXNzLgogICAgICAgIDpyZXR1cm46IEEgdHVwbGUgY29uc2lzdGluZyBvZiB0aGUgc3VicHJvY2VzcycgZXhpdCBjb2RlLCBhIGxpc3Qgb2YKICAgICAgICAgICAgICAgICBsaW5lcyByZWFkIGZyb20gdGhlIHN1YnByb2Nlc3MnIGBgc3Rkb3V0YGAsIGFuZCBhIGxpc3Qgb2YKICAgICAgICAgICAgICAgICBsaW5lcyByZWFkIGZyb20gdGhlIHN1YnByb2Nlc3MnIGBgc3RkZXJyYGAuCiAgICAgICAgIiIiCiAgICAgICAga3dhcmdzID0gewogICAgICAgICAgICAnc3Rkb3V0Jzogc3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAnc3RkZXJyJzogc3VicHJvY2Vzcy5QSVBFLAogICAgICAgIH0KICAgICAgICBpZiBpbnB1dF9kYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICBrd2FyZ3NbJ3N0ZGluJ10gPSBzdWJwcm9jZXNzLlBJUEUKICAgICAgICBzdGRvdXQgPSBbXQogICAgICAgIHN0ZGVyciA9IFtdCiAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCAqKmt3YXJncykKICAgICAgICAjIFdlIGRvbid0IHVzZSBjb21tdW5pY2F0ZSgpIGhlcmUgYmVjYXVzZSB3ZSBtYXkgbmVlZCB0bwogICAgICAgICMgZ2V0IGNsZXZlciB3aXRoIGludGVyYWN0aW5nIHdpdGggdGhlIGNvbW1hbmQKICAgICAgICB0MSA9IFRocmVhZCh0YXJnZXQ9c2VsZi5fcmVhZGVyLCBhcmdzPSgnc3Rkb3V0JywgcC5zdGRvdXQsIHN0ZG91dCkpCiAgICAgICAgdDEuc3RhcnQoKQogICAgICAgIHQyID0gVGhyZWFkKHRhcmdldD1zZWxmLl9yZWFkZXIsIGFyZ3M9KCdzdGRlcnInLCBwLnN0ZGVyciwgc3RkZXJyKSkKICAgICAgICB0Mi5zdGFydCgpCiAgICAgICAgaWYgaW5wdXRfZGF0YSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcC5zdGRpbi53cml0ZShpbnB1dF9kYXRhKQogICAgICAgICAgICBwLnN0ZGluLmNsb3NlKCkKCiAgICAgICAgcC53YWl0KCkKICAgICAgICB0MS5qb2luKCkKICAgICAgICB0Mi5qb2luKCkKICAgICAgICByZXR1cm4gcC5yZXR1cm5jb2RlLCBzdGRvdXQsIHN0ZGVycgoKICAgIGRlZiBzaWduX2ZpbGUoc2VsZiwgZmlsZW5hbWUsIHNpZ25lciwgc2lnbl9wYXNzd29yZCwga2V5c3RvcmU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2lnbiBhIGZpbGUuCgogICAgICAgIDpwYXJhbSBmaWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIHRoZSBmaWxlIHRvIGJlIHNpZ25lZC4KICAgICAgICA6cGFyYW0gc2lnbmVyOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2lnbmVyIG9mIHRoZSBmaWxlLgogICAgICAgIDpwYXJhbSBzaWduX3Bhc3N3b3JkOiBUaGUgcGFzc3BocmFzZSBmb3IgdGhlIHNpZ25lcidzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUga2V5IHVzZWQgZm9yIHNpZ25pbmcuCiAgICAgICAgOnBhcmFtIGtleXN0b3JlOiBUaGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBzaWduaW5nLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgaW5zdGFuY2UncwogICAgICAgICAgICAgICAgICAgICAgICAgYGBncGdfaG9tZWBgIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQuCiAgICAgICAgOnJldHVybjogVGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIHRoZSBzaWduYXR1cmUgaXMKICAgICAgICAgICAgICAgICBzdG9yZWQuCiAgICAgICAgIiIiCiAgICAgICAgY21kLCBzaWdfZmlsZSA9IHNlbGYuZ2V0X3NpZ25fY29tbWFuZChmaWxlbmFtZSwgc2lnbmVyLCBzaWduX3Bhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmUpCiAgICAgICAgcmMsIHN0ZG91dCwgc3RkZXJyID0gc2VsZi5ydW5fY29tbWFuZChjbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduX3Bhc3N3b3JkLmVuY29kZSgndXRmLTgnKSkKICAgICAgICBpZiByYyAhPSAwOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdzaWduIGNvbW1hbmQgZmFpbGVkIHdpdGggZXJyb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2RlICVzJyAlIHJjKQogICAgICAgIHJldHVybiBzaWdfZmlsZQoKICAgIGRlZiB1cGxvYWRfZmlsZShzZWxmLCBtZXRhZGF0YSwgZmlsZW5hbWUsIHNpZ25lcj1Ob25lLCBzaWduX3Bhc3N3b3JkPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgZmlsZXR5cGU9J3NkaXN0JywgcHl2ZXJzaW9uPSdzb3VyY2UnLCBrZXlzdG9yZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBVcGxvYWQgYSByZWxlYXNlIGZpbGUgdG8gdGhlIGluZGV4LgoKICAgICAgICA6cGFyYW0gbWV0YWRhdGE6IEEgOmNsYXNzOmBNZXRhZGF0YWAgaW5zdGFuY2UgZGVmaW5pbmcgYXQgbGVhc3QgYSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBmaWxlIHRvIGJlIHVwbG9hZGVkLgogICAgICAgIDpwYXJhbSBmaWxlbmFtZTogVGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIHVwbG9hZGVkLgogICAgICAgIDpwYXJhbSBzaWduZXI6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzaWduZXIgb2YgdGhlIGZpbGUuCiAgICAgICAgOnBhcmFtIHNpZ25fcGFzc3dvcmQ6IFRoZSBwYXNzcGhyYXNlIGZvciB0aGUgc2lnbmVyJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBrZXkgdXNlZCBmb3Igc2lnbmluZy4KICAgICAgICA6cGFyYW0gZmlsZXR5cGU6IFRoZSB0eXBlIG9mIHRoZSBmaWxlIGJlaW5nIHVwbG9hZGVkLiBUaGlzIGlzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICBkaXN0dXRpbHMgY29tbWFuZCB3aGljaCBwcm9kdWNlZCB0aGF0IGZpbGUsIGUuZy4KICAgICAgICAgICAgICAgICAgICAgICAgYGBzZGlzdGBgIG9yIGBgYmRpc3Rfd2hlZWxgYC4KICAgICAgICA6cGFyYW0gcHl2ZXJzaW9uOiBUaGUgdmVyc2lvbiBvZiBQeXRob24gd2hpY2ggdGhlIHJlbGVhc2UgcmVsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgIHRvLiBGb3IgY29kZSBjb21wYXRpYmxlIHdpdGggYW55IFB5dGhvbiwgdGhpcyB3b3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGBgc291cmNlYGAsIG90aGVyd2lzZSBpdCB3b3VsZCBiZSBlLmcuIGBgMy4yYGAuCiAgICAgICAgOnBhcmFtIGtleXN0b3JlOiBUaGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBzaWduaW5nLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgaW5zdGFuY2UncwogICAgICAgICAgICAgICAgICAgICAgICAgYGBncGdfaG9tZWBgIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQuCiAgICAgICAgOnJldHVybjogVGhlIEhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBQeVBJIHVwb24gc3VibWlzc2lvbiBvZiB0aGUKICAgICAgICAgICAgICAgIHJlcXVlc3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jaGVja19jcmVkZW50aWFscygpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignbm90IGZvdW5kOiAlcycgJSBmaWxlbmFtZSkKICAgICAgICBtZXRhZGF0YS52YWxpZGF0ZSgpCiAgICAgICAgZCA9IG1ldGFkYXRhLnRvZGljdCgpCiAgICAgICAgc2lnX2ZpbGUgPSBOb25lCiAgICAgICAgaWYgc2lnbmVyOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5ncGc6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnbm8gc2lnbmluZyBwcm9ncmFtIGF2YWlsYWJsZSAtIG5vdCBzaWduZWQnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2lnX2ZpbGUgPSBzZWxmLnNpZ25fZmlsZShmaWxlbmFtZSwgc2lnbmVyLCBzaWduX3Bhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZSkKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGZpbGVfZGF0YSA9IGYucmVhZCgpCiAgICAgICAgbWQ1X2RpZ2VzdCA9IGhhc2hsaWIubWQ1KGZpbGVfZGF0YSkuaGV4ZGlnZXN0KCkKICAgICAgICBzaGEyNTZfZGlnZXN0ID0gaGFzaGxpYi5zaGEyNTYoZmlsZV9kYXRhKS5oZXhkaWdlc3QoKQogICAgICAgIGQudXBkYXRlKHsKICAgICAgICAgICAgJzphY3Rpb24nOiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAncHJvdG9jb2xfdmVyc2lvbic6ICcxJywKICAgICAgICAgICAgJ2ZpbGV0eXBlJzogZmlsZXR5cGUsCiAgICAgICAgICAgICdweXZlcnNpb24nOiBweXZlcnNpb24sCiAgICAgICAgICAgICdtZDVfZGlnZXN0JzogbWQ1X2RpZ2VzdCwKICAgICAgICAgICAgJ3NoYTI1Nl9kaWdlc3QnOiBzaGEyNTZfZGlnZXN0LAogICAgICAgIH0pCiAgICAgICAgZmlsZXMgPSBbKCdjb250ZW50Jywgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIGZpbGVfZGF0YSldCiAgICAgICAgaWYgc2lnX2ZpbGU6CiAgICAgICAgICAgIHdpdGggb3BlbihzaWdfZmlsZSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgIHNpZ19kYXRhID0gZi5yZWFkKCkKICAgICAgICAgICAgZmlsZXMuYXBwZW5kKCgnZ3BnX3NpZ25hdHVyZScsIG9zLnBhdGguYmFzZW5hbWUoc2lnX2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgc2lnX2RhdGEpKQogICAgICAgICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguZGlybmFtZShzaWdfZmlsZSkpCiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZW5jb2RlX3JlcXVlc3QoZC5pdGVtcygpLCBmaWxlcykKICAgICAgICByZXR1cm4gc2VsZi5zZW5kX3JlcXVlc3QocmVxdWVzdCkKCiAgICBkZWYgdXBsb2FkX2RvY3VtZW50YXRpb24oc2VsZiwgbWV0YWRhdGEsIGRvY19kaXIpOgogICAgICAgICIiIgogICAgICAgIFVwbG9hZCBkb2N1bWVudGF0aW9uIHRvIHRoZSBpbmRleC4KCiAgICAgICAgOnBhcmFtIG1ldGFkYXRhOiBBIDpjbGFzczpgTWV0YWRhdGFgIGluc3RhbmNlIGRlZmluaW5nIGF0IGxlYXN0IGEgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgZG9jdW1lbnRhdGlvbiB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkZWQuCiAgICAgICAgOnBhcmFtIGRvY19kaXI6IFRoZSBwYXRobmFtZSBvZiB0aGUgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uLiBUaGlzIHNob3VsZCBiZSB0aGUgZGlyZWN0b3J5IHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGBgaW5kZXguaHRtbGBgIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4KICAgICAgICA6cmV0dXJuOiBUaGUgSFRUUCByZXNwb25zZSByZWNlaXZlZCBmcm9tIFB5UEkgdXBvbiBzdWJtaXNzaW9uIG9mIHRoZQogICAgICAgICAgICAgICAgcmVxdWVzdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNoZWNrX2NyZWRlbnRpYWxzKCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcihkb2NfZGlyKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignbm90IGEgZGlyZWN0b3J5OiAlcicgJSBkb2NfZGlyKQogICAgICAgIGZuID0gb3MucGF0aC5qb2luKGRvY19kaXIsICdpbmRleC5odG1sJykKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm4pOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdub3QgZm91bmQ6ICVyJyAlIGZuKQogICAgICAgIG1ldGFkYXRhLnZhbGlkYXRlKCkKICAgICAgICBuYW1lLCB2ZXJzaW9uID0gbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEudmVyc2lvbgogICAgICAgIHppcF9kYXRhID0gemlwX2Rpcihkb2NfZGlyKS5nZXR2YWx1ZSgpCiAgICAgICAgZmllbGRzID0gWygnOmFjdGlvbicsICdkb2NfdXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICgnbmFtZScsIG5hbWUpLCAoJ3ZlcnNpb24nLCB2ZXJzaW9uKV0KICAgICAgICBmaWxlcyA9IFsoJ2NvbnRlbnQnLCBuYW1lLCB6aXBfZGF0YSldCiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZW5jb2RlX3JlcXVlc3QoZmllbGRzLCBmaWxlcykKICAgICAgICByZXR1cm4gc2VsZi5zZW5kX3JlcXVlc3QocmVxdWVzdCkKCiAgICBkZWYgZ2V0X3ZlcmlmeV9jb21tYW5kKHNlbGYsIHNpZ25hdHVyZV9maWxlbmFtZSwgZGF0YV9maWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc3VpdGFibGUgY29tbWFuZCBmb3IgdmVyaWZ5aW5nIGEgZmlsZS4KCiAgICAgICAgOnBhcmFtIHNpZ25hdHVyZV9maWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLgogICAgICAgIDpwYXJhbSBkYXRhX2ZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGRhdGEuCiAgICAgICAgOnBhcmFtIGtleXN0b3JlOiBUaGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB2ZXJpZmljYXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UncyBgYGdwZ19ob21lYGAgYXR0cmlidXRlIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICA6cmV0dXJuOiBUaGUgdmVyaWZ5aW5nIGNvbW1hbmQgYXMgYSBsaXN0IHN1aXRhYmxlIHRvIGJlCiAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIDpjbGFzczpgc3VicHJvY2Vzcy5Qb3BlbmAuCiAgICAgICAgIiIiCiAgICAgICAgY21kID0gW3NlbGYuZ3BnLCAnLS1zdGF0dXMtZmQnLCAnMicsICctLW5vLXR0eSddCiAgICAgICAgaWYga2V5c3RvcmUgaXMgTm9uZToKICAgICAgICAgICAga2V5c3RvcmUgPSBzZWxmLmdwZ19ob21lCiAgICAgICAgaWYga2V5c3RvcmU6CiAgICAgICAgICAgIGNtZC5leHRlbmQoWyctLWhvbWVkaXInLCBrZXlzdG9yZV0pCiAgICAgICAgY21kLmV4dGVuZChbJy0tdmVyaWZ5Jywgc2lnbmF0dXJlX2ZpbGVuYW1lLCBkYXRhX2ZpbGVuYW1lXSkKICAgICAgICBsb2dnZXIuZGVidWcoJ2ludm9raW5nOiAlcycsICcgJy5qb2luKGNtZCkpCiAgICAgICAgcmV0dXJuIGNtZAoKICAgIGRlZiB2ZXJpZnlfc2lnbmF0dXJlKHNlbGYsIHNpZ25hdHVyZV9maWxlbmFtZSwgZGF0YV9maWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFZlcmlmeSBhIHNpZ25hdHVyZSBmb3IgYSBmaWxlLgoKICAgICAgICA6cGFyYW0gc2lnbmF0dXJlX2ZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUuCiAgICAgICAgOnBhcmFtIGRhdGFfZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgZGF0YS4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHZlcmlmaWNhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSdzIGBgZ3BnX2hvbWVgYCBhdHRyaWJ1dGUgaXMgdXNlZCBpbnN0ZWFkLgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQsIGVsc2UgRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZ3BnOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCd2ZXJpZmljYXRpb24gdW5hdmFpbGFibGUgYmVjYXVzZSBncGcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmF2YWlsYWJsZScpCiAgICAgICAgY21kID0gc2VsZi5nZXRfdmVyaWZ5X2NvbW1hbmQoc2lnbmF0dXJlX2ZpbGVuYW1lLCBkYXRhX2ZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlKQogICAgICAgIHJjLCBzdGRvdXQsIHN0ZGVyciA9IHNlbGYucnVuX2NvbW1hbmQoY21kKQogICAgICAgIGlmIHJjIG5vdCBpbiAoMCwgMSk6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3ZlcmlmeSBjb21tYW5kIGZhaWxlZCB3aXRoIGVycm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29kZSAlcycgJSByYykKICAgICAgICByZXR1cm4gcmMgPT0gMAoKICAgIGRlZiBkb3dubG9hZF9maWxlKHNlbGYsIHVybCwgZGVzdGZpbGUsIGRpZ2VzdD1Ob25lLCByZXBvcnRob29rPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGRvd25sb2FkaW5nIGEgZmlsZSBmcm9tIGFuIFVSTC4KICAgICAgICBOb3JtYWxseSwgdGhpcyB3aWxsIGJlIGEgZmlsZSBmcm9tIHRoZSBpbmRleCwgdGhvdWdoIGN1cnJlbnRseQogICAgICAgIG5vIGNoZWNrIGlzIG1hZGUgZm9yIHRoaXMgKGkuZS4gYSBmaWxlIGNhbiBiZSBkb3dubG9hZGVkIGZyb20KICAgICAgICBhbnl3aGVyZSkuCgogICAgICAgIFRoZSBtZXRob2QgaXMganVzdCBsaWtlIHRoZSA6ZnVuYzpgdXJscmV0cmlldmVgIGZ1bmN0aW9uIGluIHRoZQogICAgICAgIHN0YW5kYXJkIGxpYnJhcnksIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBkaWdlc3QgY29tcHV0YXRpb24gdG8gYmUKICAgICAgICBkb25lIGR1cmluZyBkb3dubG9hZCBhbmQgY2hlY2tpbmcgdGhhdCB0aGUgZG93bmxvYWRlZCBkYXRhCiAgICAgICAgbWF0Y2hlZCBhbnkgZXhwZWN0ZWQgdmFsdWUuCgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSBVUkwgb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZCAoYXNzdW1lZCB0byBiZQogICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB2aWEgYW4gSFRUUCBHRVQgcmVxdWVzdCkuCiAgICAgICAgOnBhcmFtIGRlc3RmaWxlOiBUaGUgcGF0aG5hbWUgd2hlcmUgdGhlIGRvd25sb2FkZWQgZmlsZSBpcyB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQuCiAgICAgICAgOnBhcmFtIGRpZ2VzdDogSWYgc3BlY2lmaWVkLCB0aGlzIG11c3QgYmUgYSAoaGFzaGVyLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICB0dXBsZSwgd2hlcmUgaGFzaGVyIGlzIHRoZSBhbGdvcml0aG0gdXNlZCAoZS5nLgogICAgICAgICAgICAgICAgICAgICAgIGBgJ21kNSdgYCkgYW5kIGBgdmFsdWVgYCBpcyB0aGUgZXhwZWN0ZWQgdmFsdWUuCiAgICAgICAgOnBhcmFtIHJlcG9ydGhvb2s6IFRoZSBzYW1lIGFzIGZvciA6ZnVuYzpgdXJscmV0cmlldmVgIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCBsaWJyYXJ5LgogICAgICAgICIiIgogICAgICAgIGlmIGRpZ2VzdCBpcyBOb25lOgogICAgICAgICAgICBkaWdlc3RlciA9IE5vbmUKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyBkaWdlc3Qgc3BlY2lmaWVkJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRpZ2VzdCwgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICBoYXNoZXIsIGRpZ2VzdCA9IGRpZ2VzdAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaGFzaGVyID0gJ21kNScKICAgICAgICAgICAgZGlnZXN0ZXIgPSBnZXRhdHRyKGhhc2hsaWIsIGhhc2hlcikoKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0RpZ2VzdCBzcGVjaWZpZWQ6ICVzJyAlIGRpZ2VzdCkKICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBlcXVpdmFsZW50IHRvIHVybHJldHJpZXZlLgogICAgICAgICMgV2UgbmVlZCB0byBkbyBpdCB0aGlzIHdheSBzbyB0aGF0IHdlIGNhbiBjb21wdXRlIHRoZQogICAgICAgICMgZGlnZXN0IG9mIHRoZSBmaWxlIGFzIHdlIGdvLgogICAgICAgIHdpdGggb3BlbihkZXN0ZmlsZSwgJ3diJykgYXMgZGZwOgogICAgICAgICAgICAjIGFkZGluZm91cmwgaXMgbm90IGEgY29udGV4dCBtYW5hZ2VyIG9uIDIueAogICAgICAgICAgICAjIHNvIHdlIGhhdmUgdG8gdXNlIHRyeS9maW5hbGx5CiAgICAgICAgICAgIHNmcCA9IHNlbGYuc2VuZF9yZXF1ZXN0KFJlcXVlc3QodXJsKSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaGVhZGVycyA9IHNmcC5pbmZvKCkKICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IDgxOTIKICAgICAgICAgICAgICAgIHNpemUgPSAtMQogICAgICAgICAgICAgICAgcmVhZCA9IDAKICAgICAgICAgICAgICAgIGJsb2NrbnVtID0gMAogICAgICAgICAgICAgICAgaWYgImNvbnRlbnQtbGVuZ3RoIiBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgICAgIHNpemUgPSBpbnQoaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSkKICAgICAgICAgICAgICAgIGlmIHJlcG9ydGhvb2s6CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0aG9vayhibG9ja251bSwgYmxvY2tzaXplLCBzaXplKQogICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICBibG9jayA9IHNmcC5yZWFkKGJsb2Nrc2l6ZSkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgYmxvY2s6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgcmVhZCArPSBsZW4oYmxvY2spCiAgICAgICAgICAgICAgICAgICAgZGZwLndyaXRlKGJsb2NrKQogICAgICAgICAgICAgICAgICAgIGlmIGRpZ2VzdGVyOgogICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3Rlci51cGRhdGUoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgYmxvY2tudW0gKz0gMQogICAgICAgICAgICAgICAgICAgIGlmIHJlcG9ydGhvb2s6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGhvb2soYmxvY2tudW0sIGJsb2Nrc2l6ZSwgc2l6ZSkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNmcC5jbG9zZSgpCgogICAgICAgICMgY2hlY2sgdGhhdCB3ZSBnb3QgdGhlIHdob2xlIGZpbGUsIGlmIHdlIGNhbgogICAgICAgIGlmIHNpemUgPj0gMCBhbmQgcmVhZCA8IHNpemU6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAncmV0cmlldmFsIGluY29tcGxldGU6IGdvdCBvbmx5ICVkIG91dCBvZiAlZCBieXRlcycKICAgICAgICAgICAgICAgICUgKHJlYWQsIHNpemUpKQogICAgICAgICMgaWYgd2UgaGF2ZSBhIGRpZ2VzdCwgaXQgbXVzdCBtYXRjaC4KICAgICAgICBpZiBkaWdlc3RlcjoKICAgICAgICAgICAgYWN0dWFsID0gZGlnZXN0ZXIuaGV4ZGlnZXN0KCkKICAgICAgICAgICAgaWYgZGlnZXN0ICE9IGFjdHVhbDoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJyVzIGRpZ2VzdCBtaXNtYXRjaCBmb3IgJXM6IGV4cGVjdGVkICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzLCBnb3QgJXMnICUgKGhhc2hlciwgZGVzdGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3QsIGFjdHVhbCkpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRGlnZXN0IHZlcmlmaWVkOiAlcycsIGRpZ2VzdCkKCiAgICBkZWYgc2VuZF9yZXF1ZXN0KHNlbGYsIHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgU2VuZCBhIHN0YW5kYXJkIGxpYnJhcnkgOmNsYXNzOmBSZXF1ZXN0YCB0byBQeVBJIGFuZCByZXR1cm4gaXRzCiAgICAgICAgcmVzcG9uc2UuCgogICAgICAgIDpwYXJhbSByZXE6IFRoZSByZXF1ZXN0IHRvIHNlbmQuCiAgICAgICAgOnJldHVybjogVGhlIEhUVFAgcmVzcG9uc2UgZnJvbSBQeVBJIChhIHN0YW5kYXJkIGxpYnJhcnkgSFRUUFJlc3BvbnNlKS4KICAgICAgICAiIiIKICAgICAgICBoYW5kbGVycyA9IFtdCiAgICAgICAgaWYgc2VsZi5wYXNzd29yZF9oYW5kbGVyOgogICAgICAgICAgICBoYW5kbGVycy5hcHBlbmQoc2VsZi5wYXNzd29yZF9oYW5kbGVyKQogICAgICAgIGlmIHNlbGYuc3NsX3ZlcmlmaWVyOgogICAgICAgICAgICBoYW5kbGVycy5hcHBlbmQoc2VsZi5zc2xfdmVyaWZpZXIpCiAgICAgICAgb3BlbmVyID0gYnVpbGRfb3BlbmVyKCpoYW5kbGVycykKICAgICAgICByZXR1cm4gb3BlbmVyLm9wZW4ocmVxKQoKICAgIGRlZiBlbmNvZGVfcmVxdWVzdChzZWxmLCBmaWVsZHMsIGZpbGVzKToKICAgICAgICAiIiIKICAgICAgICBFbmNvZGUgZmllbGRzIGFuZCBmaWxlcyBmb3IgcG9zdGluZyB0byBhbiBIVFRQIHNlcnZlci4KCiAgICAgICAgOnBhcmFtIGZpZWxkczogVGhlIGZpZWxkcyB0byBzZW5kIGFzIGEgbGlzdCBvZiAoZmllbGRuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICB0dXBsZXMuCiAgICAgICAgOnBhcmFtIGZpbGVzOiBUaGUgZmlsZXMgdG8gc2VuZCBhcyBhIGxpc3Qgb2YgKGZpZWxkbmFtZSwgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBmaWxlX2J5dGVzKSB0dXBsZS4KICAgICAgICAiIiIKICAgICAgICAjIEFkYXB0ZWQgZnJvbSBwYWNrYWdpbmcsIHdoaWNoIGluIHR1cm4gd2FzIGFkYXB0ZWQgZnJvbQogICAgICAgICMgaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvMTQ2MzA2CgogICAgICAgIHBhcnRzID0gW10KICAgICAgICBib3VuZGFyeSA9IHNlbGYuYm91bmRhcnkKICAgICAgICBmb3IgaywgdmFsdWVzIGluIGZpZWxkczoKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWVzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdCgogICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CiAgICAgICAgICAgICAgICBwYXJ0cy5leHRlbmQoKAogICAgICAgICAgICAgICAgICAgIGInLS0nICsgYm91bmRhcnksCiAgICAgICAgICAgICAgICAgICAgKCdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicgJQogICAgICAgICAgICAgICAgICAgICBrKS5lbmNvZGUoJ3V0Zi04JyksCiAgICAgICAgICAgICAgICAgICAgYicnLAogICAgICAgICAgICAgICAgICAgIHYuZW5jb2RlKCd1dGYtOCcpKSkKICAgICAgICBmb3Iga2V5LCBmaWxlbmFtZSwgdmFsdWUgaW4gZmlsZXM6CiAgICAgICAgICAgIHBhcnRzLmV4dGVuZCgoCiAgICAgICAgICAgICAgICBiJy0tJyArIGJvdW5kYXJ5LAogICAgICAgICAgICAgICAgKCdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIjsgZmlsZW5hbWU9IiVzIicgJQogICAgICAgICAgICAgICAgIChrZXksIGZpbGVuYW1lKSkuZW5jb2RlKCd1dGYtOCcpLAogICAgICAgICAgICAgICAgYicnLAogICAgICAgICAgICAgICAgdmFsdWUpKQoKICAgICAgICBwYXJ0cy5leHRlbmQoKGInLS0nICsgYm91bmRhcnkgKyBiJy0tJywgYicnKSkKCiAgICAgICAgYm9keSA9IGInXHJcbicuam9pbihwYXJ0cykKICAgICAgICBjdCA9IGInbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JyArIGJvdW5kYXJ5CiAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZSc6IGN0LAogICAgICAgICAgICAnQ29udGVudC1sZW5ndGgnOiBzdHIobGVuKGJvZHkpKQogICAgICAgIH0KICAgICAgICByZXR1cm4gUmVxdWVzdChzZWxmLnVybCwgYm9keSwgaGVhZGVycykKCiAgICBkZWYgc2VhcmNoKHNlbGYsIHRlcm1zLCBvcGVyYXRvcj1Ob25lKToKICAgICAgICBpZiBpc2luc3RhbmNlKHRlcm1zLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0ZXJtcyA9IHsnbmFtZSc6IHRlcm1zfQogICAgICAgIGlmIHNlbGYucnBjX3Byb3h5IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYucnBjX3Byb3h5ID0gU2VydmVyUHJveHkoc2VsZi51cmwsIHRpbWVvdXQ9My4wKQogICAgICAgIHJldHVybiBzZWxmLnJwY19wcm94eS5zZWFyY2godGVybXMsIG9wZXJhdG9yIG9yICdhbmQnKQpQSwMEFAAAAAAAAAAhANHFeK9FxwAARccAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbG9jYXRvcnMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTUgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoKaW1wb3J0IGd6aXAKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgcmUKdHJ5OgogICAgaW1wb3J0IHRocmVhZGluZwpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgdGhyZWFkaW5nCmltcG9ydCB6bGliCgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24KZnJvbSAuY29tcGF0IGltcG9ydCAodXJsam9pbiwgdXJscGFyc2UsIHVybHVucGFyc2UsIHVybDJwYXRobmFtZSwgcGF0aG5hbWUydXJsLAogICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgcXVvdGUsIHVuZXNjYXBlLCBzdHJpbmdfdHlwZXMsIGJ1aWxkX29wZW5lciwKICAgICAgICAgICAgICAgICAgICAgSFRUUFJlZGlyZWN0SGFuZGxlciBhcyBCYXNlUmVkaXJlY3RIYW5kbGVyLCB0ZXh0X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3QsIEhUVFBFcnJvciwgVVJMRXJyb3IpCmZyb20gLmRhdGFiYXNlIGltcG9ydCBEaXN0cmlidXRpb24sIERpc3RyaWJ1dGlvblBhdGgsIG1ha2VfZGlzdApmcm9tIC5tZXRhZGF0YSBpbXBvcnQgTWV0YWRhdGEKZnJvbSAudXRpbCBpbXBvcnQgKGNhY2hlZF9wcm9wZXJ0eSwgcGFyc2VfY3JlZGVudGlhbHMsIGVuc3VyZV9zbGFzaCwKICAgICAgICAgICAgICAgICAgIHNwbGl0X2ZpbGVuYW1lLCBnZXRfcHJvamVjdF9kYXRhLCBwYXJzZV9yZXF1aXJlbWVudCwKICAgICAgICAgICAgICAgICAgIHBhcnNlX25hbWVfYW5kX3ZlcnNpb24sIFNlcnZlclByb3h5LCBub3JtYWxpemVfbmFtZSkKZnJvbSAudmVyc2lvbiBpbXBvcnQgZ2V0X3NjaGVtZSwgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IKZnJvbSAud2hlZWwgaW1wb3J0IFdoZWVsLCBpc19jb21wYXRpYmxlCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCkhBU0hFUl9IQVNIID0gcmUuY29tcGlsZSgnXihcdyspPShbYS1mMC05XSspJykKQ0hBUlNFVCA9IHJlLmNvbXBpbGUocic7XHMqY2hhcnNldFxzKj1ccyooLiopXHMqJCcsIHJlLkkpCkhUTUxfQ09OVEVOVF9UWVBFID0gcmUuY29tcGlsZSgndGV4dC9odG1sfGFwcGxpY2F0aW9uL3goaHQpP21sJykKREVGQVVMVF9JTkRFWCA9ICdodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpJwoKZGVmIGdldF9hbGxfZGlzdHJpYnV0aW9uX25hbWVzKHVybD1Ob25lKToKICAgICIiIgogICAgUmV0dXJuIGFsbCBkaXN0cmlidXRpb24gbmFtZXMga25vd24gYnkgYW4gaW5kZXguCiAgICA6cGFyYW0gdXJsOiBUaGUgVVJMIG9mIHRoZSBpbmRleC4KICAgIDpyZXR1cm46IEEgbGlzdCBvZiBhbGwga25vd24gZGlzdHJpYnV0aW9uIG5hbWVzLgogICAgIiIiCiAgICBpZiB1cmwgaXMgTm9uZToKICAgICAgICB1cmwgPSBERUZBVUxUX0lOREVYCiAgICBjbGllbnQgPSBTZXJ2ZXJQcm94eSh1cmwsIHRpbWVvdXQ9My4wKQogICAgcmV0dXJuIGNsaWVudC5saXN0X3BhY2thZ2VzKCkKCmNsYXNzIFJlZGlyZWN0SGFuZGxlcihCYXNlUmVkaXJlY3RIYW5kbGVyKToKICAgICIiIgogICAgQSBjbGFzcyB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBzb21lIFB5dGhvbiAzLjIueCByZWxlYXNlcy4KICAgICIiIgogICAgIyBUaGVyZSdzIGEgYnVnIGluIHRoZSBiYXNlIHZlcnNpb24gZm9yIHNvbWUgMy4yLngKICAgICMgKGUuZy4gMy4yLjIgb24gVWJ1bnR1IE9uZWlyaWMpLiBJZiBhIExvY2F0aW9uIGhlYWRlcgogICAgIyByZXR1cm5zIGUuZy4gL2FiYywgaXQgYmFpbHMgYmVjYXVzZSBpdCBzYXlzIHRoZSBzY2hlbWUgJycKICAgICMgaXMgYm9ndXMsIHdoZW4gYWN0dWFsbHkgaXQgc2hvdWxkIHVzZSB0aGUgcmVxdWVzdCdzCiAgICAjIFVSTCBmb3IgdGhlIHNjaGVtZS4gU2VlIFB5dGhvbiBpc3N1ZSAjMTM2OTYuCiAgICBkZWYgaHR0cF9lcnJvcl8zMDIoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzKToKICAgICAgICAjIFNvbWUgc2VydmVycyAoaW5jb3JyZWN0bHkpIHJldHVybiBtdWx0aXBsZSBMb2NhdGlvbiBoZWFkZXJzCiAgICAgICAgIyAoc28gcHJvYmFibHkgc2FtZSBnb2VzIGZvciBVUkkpLiAgVXNlIGZpcnN0IGhlYWRlci4KICAgICAgICBuZXd1cmwgPSBOb25lCiAgICAgICAgZm9yIGtleSBpbiAoJ2xvY2F0aW9uJywgJ3VyaScpOgogICAgICAgICAgICBpZiBrZXkgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgIG5ld3VybCA9IGhlYWRlcnNba2V5XQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBuZXd1cmwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdXJscGFydHMgPSB1cmxwYXJzZShuZXd1cmwpCiAgICAgICAgaWYgdXJscGFydHMuc2NoZW1lID09ICcnOgogICAgICAgICAgICBuZXd1cmwgPSB1cmxqb2luKHJlcS5nZXRfZnVsbF91cmwoKSwgbmV3dXJsKQogICAgICAgICAgICBpZiBoYXNhdHRyKGhlYWRlcnMsICdyZXBsYWNlX2hlYWRlcicpOgogICAgICAgICAgICAgICAgaGVhZGVycy5yZXBsYWNlX2hlYWRlcihrZXksIG5ld3VybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IG5ld3VybAogICAgICAgIHJldHVybiBCYXNlUmVkaXJlY3RIYW5kbGVyLmh0dHBfZXJyb3JfMzAyKHNlbGYsIHJlcSwgZnAsIGNvZGUsIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzKQoKICAgIGh0dHBfZXJyb3JfMzAxID0gaHR0cF9lcnJvcl8zMDMgPSBodHRwX2Vycm9yXzMwNyA9IGh0dHBfZXJyb3JfMzAyCgpjbGFzcyBMb2NhdG9yKG9iamVjdCk6CiAgICAiIiIKICAgIEEgYmFzZSBjbGFzcyBmb3IgbG9jYXRvcnMgLSB0aGluZ3MgdGhhdCBsb2NhdGUgZGlzdHJpYnV0aW9ucy4KICAgICIiIgogICAgc291cmNlX2V4dGVuc2lvbnMgPSAoJy50YXIuZ3onLCAnLnRhci5iejInLCAnLnRhcicsICcuemlwJywgJy50Z3onLCAnLnRieicpCiAgICBiaW5hcnlfZXh0ZW5zaW9ucyA9ICgnLmVnZycsICcuZXhlJywgJy53aGwnKQogICAgZXhjbHVkZWRfZXh0ZW5zaW9ucyA9ICgnLnBkZicsKQoKICAgICMgQSBsaXN0IG9mIHRhZ3MgaW5kaWNhdGluZyB3aGljaCB3aGVlbHMgeW91IHdhbnQgdG8gbWF0Y2guIFRoZSBkZWZhdWx0CiAgICAjIHZhbHVlIG9mIE5vbmUgbWF0Y2hlcyBhZ2FpbnN0IHRoZSB0YWdzIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVubmluZwogICAgIyBQeXRob24uIElmIHlvdSB3YW50IHRvIG1hdGNoIG90aGVyIHZhbHVlcywgc2V0IHdoZWVsX3RhZ3Mgb24gYSBsb2NhdG9yCiAgICAjIGluc3RhbmNlIHRvIGEgbGlzdCBvZiB0dXBsZXMgKHB5dmVyLCBhYmksIGFyY2gpIHdoaWNoIHlvdSB3YW50IHRvIG1hdGNoLgogICAgd2hlZWxfdGFncyA9IE5vbmUKCiAgICBkb3dubG9hZGFibGVfZXh0ZW5zaW9ucyA9IHNvdXJjZV9leHRlbnNpb25zICsgKCcud2hsJywpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjaGVtZT0nZGVmYXVsdCcpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIHNjaGVtZTogQmVjYXVzZSBsb2NhdG9ycyBsb29rIGZvciBtb3N0IHJlY2VudCB2ZXJzaW9ucywgdGhleQogICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8ga25vdyB0aGUgdmVyc2lvbiBzY2hlbWUgdG8gdXNlLiBUaGlzIHNwZWNpZmllcwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IFBFUC1yZWNvbW1lbmRlZCBzY2hlbWUgLSB1c2UgYGAnbGVnYWN5J2BgCiAgICAgICAgICAgICAgICAgICAgICAgaWYgeW91IG5lZWQgdG8gc3VwcG9ydCBleGlzdGluZyBkaXN0cmlidXRpb25zIG9uIFB5UEkuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2FjaGUgPSB7fQogICAgICAgIHNlbGYuc2NoZW1lID0gc2NoZW1lCiAgICAgICAgIyBCZWNhdXNlIG9mIGJ1Z3MgaW4gc29tZSBvZiB0aGUgaGFuZGxlcnMgb24gc29tZSBvZiB0aGUgcGxhdGZvcm1zLAogICAgICAgICMgd2UgdXNlIG91ciBvd24gb3BlbmVyIHJhdGhlciB0aGFuIGp1c3QgdXNpbmcgdXJsb3Blbi4KICAgICAgICBzZWxmLm9wZW5lciA9IGJ1aWxkX29wZW5lcihSZWRpcmVjdEhhbmRsZXIoKSkKICAgICAgICAjIElmIGdldF9wcm9qZWN0KCkgaXMgY2FsbGVkIGZyb20gbG9jYXRlKCksIHRoZSBtYXRjaGVyIGluc3RhbmNlCiAgICAgICAgIyBpcyBzZXQgZnJvbSB0aGUgcmVxdWlyZW1lbnQgcGFzc2VkIHRvIGxvY2F0ZSgpLiBTZWUgaXNzdWUgIzE4IGZvcgogICAgICAgICMgd2h5IHRoaXMgY2FuIGJlIHVzZWZ1bCB0byBrbm93LgogICAgICAgIHNlbGYubWF0Y2hlciA9IE5vbmUKICAgICAgICBzZWxmLmVycm9ycyA9IHF1ZXVlLlF1ZXVlKCkKCiAgICBkZWYgZ2V0X2Vycm9ycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYW55IGVycm9ycyB3aGljaCBoYXZlIG9jY3VycmVkLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgd2hpbGUgbm90IHNlbGYuZXJyb3JzLmVtcHR5KCk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZSA9IHNlbGYuZXJyb3JzLmdldChGYWxzZSkKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZSkKICAgICAgICAgICAgZXhjZXB0IHNlbGYuZXJyb3JzLkVtcHR5OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc2VsZi5lcnJvcnMudGFza19kb25lKCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGNsZWFyX2Vycm9ycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbGVhciBhbnkgZXJyb3JzIHdoaWNoIG1heSBoYXZlIGJlZW4gbG9nZ2VkLgogICAgICAgICIiIgogICAgICAgICMgSnVzdCBnZXQgdGhlIGVycm9ycyBhbmQgdGhyb3cgdGhlbSBhd2F5CiAgICAgICAgc2VsZi5nZXRfZXJyb3JzKCkKCiAgICBkZWYgY2xlYXJfY2FjaGUoc2VsZik6CiAgICAgICAgc2VsZi5fY2FjaGUuY2xlYXIoKQoKICAgIGRlZiBfZ2V0X3NjaGVtZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc2NoZW1lCgogICAgZGVmIF9zZXRfc2NoZW1lKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9zY2hlbWUgPSB2YWx1ZQoKICAgIHNjaGVtZSA9IHByb3BlcnR5KF9nZXRfc2NoZW1lLCBfc2V0X3NjaGVtZSkKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIGdpdmVuIHByb2plY3QsIGdldCBhIGRpY3Rpb25hcnkgbWFwcGluZyBhdmFpbGFibGUgdmVyc2lvbnMgdG8gRGlzdHJpYnV0aW9uCiAgICAgICAgaW5zdGFuY2VzLgoKICAgICAgICBUaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzLgoKICAgICAgICBJZiBjYWxsZWQgZnJvbSBhIGxvY2F0ZSgpIHJlcXVlc3QsIHNlbGYubWF0Y2hlciB3aWxsIGJlIHNldCB0byBhCiAgICAgICAgbWF0Y2hlciBmb3IgdGhlIHJlcXVpcmVtZW50IHRvIHNhdGlzZnksIG90aGVyd2lzZSBpdCB3aWxsIGJlIE5vbmUuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUGxlYXNlIGltcGxlbWVudCBpbiB0aGUgc3ViY2xhc3MnKQoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUGxlYXNlIGltcGxlbWVudCBpbiB0aGUgc3ViY2xhc3MnKQoKICAgIGRlZiBnZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSBnaXZlbiBwcm9qZWN0LCBnZXQgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgYXZhaWxhYmxlIHZlcnNpb25zIHRvIERpc3RyaWJ1dGlvbgogICAgICAgIGluc3RhbmNlcy4KCiAgICAgICAgVGhpcyBjYWxscyBfZ2V0X3Byb2plY3QgdG8gZG8gYWxsIHRoZSB3b3JrLCBhbmQganVzdCBpbXBsZW1lbnRzIGEgY2FjaGluZyBsYXllciBvbiB0b3AuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fY2FjaGUgaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZ2V0X3Byb2plY3QobmFtZSkKICAgICAgICBlbGlmIG5hbWUgaW4gc2VsZi5fY2FjaGU6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2NhY2hlW25hbWVdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jbGVhcl9lcnJvcnMoKQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXRfcHJvamVjdChuYW1lKQogICAgICAgICAgICBzZWxmLl9jYWNoZVtuYW1lXSA9IHJlc3VsdAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgc2NvcmVfdXJsKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZSBhbiB1cmwgYSBzY29yZSB3aGljaCBjYW4gYmUgdXNlZCB0byBjaG9vc2UgcHJlZmVycmVkIFVSTHMKICAgICAgICBmb3IgYSBnaXZlbiBwcm9qZWN0IHJlbGVhc2UuCiAgICAgICAgIiIiCiAgICAgICAgdCA9IHVybHBhcnNlKHVybCkKICAgICAgICBiYXNlbmFtZSA9IHBvc2l4cGF0aC5iYXNlbmFtZSh0LnBhdGgpCiAgICAgICAgY29tcGF0aWJsZSA9IFRydWUKICAgICAgICBpc193aGVlbCA9IGJhc2VuYW1lLmVuZHN3aXRoKCcud2hsJykKICAgICAgICBpZiBpc193aGVlbDoKICAgICAgICAgICAgY29tcGF0aWJsZSA9IGlzX2NvbXBhdGlibGUoV2hlZWwoYmFzZW5hbWUpLCBzZWxmLndoZWVsX3RhZ3MpCiAgICAgICAgcmV0dXJuICh0LnNjaGVtZSAhPSAnaHR0cHMnLCAncHlwaS5weXRob24ub3JnJyBpbiB0Lm5ldGxvYywKICAgICAgICAgICAgICAgIGlzX3doZWVsLCBjb21wYXRpYmxlLCBiYXNlbmFtZSkKCiAgICBkZWYgcHJlZmVyX3VybChzZWxmLCB1cmwxLCB1cmwyKToKICAgICAgICAiIiIKICAgICAgICBDaG9vc2Ugb25lIG9mIHR3byBVUkxzIHdoZXJlIGJvdGggYXJlIGNhbmRpZGF0ZXMgZm9yIGRpc3RyaWJ1dGlvbgogICAgICAgIGFyY2hpdmVzIGZvciB0aGUgc2FtZSB2ZXJzaW9uIG9mIGEgZGlzdHJpYnV0aW9uIChmb3IgZXhhbXBsZSwKICAgICAgICAudGFyLmd6IHZzLiB6aXApLgoKICAgICAgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBmYXZvdXJzIGh0dHBzOi8vIFVSTHMgb3ZlciBodHRwOi8vLCBhcmNoaXZlcwogICAgICAgIGZyb20gUHlQSSBvdmVyIHRob3NlIGZyb20gb3RoZXIgbG9jYXRpb25zLCB3aGVlbCBjb21wYXRpYmlsaXR5IChpZiBhCiAgICAgICAgd2hlZWwpIGFuZCB0aGVuIHRoZSBhcmNoaXZlIG5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gdXJsMgogICAgICAgIGlmIHVybDE6CiAgICAgICAgICAgIHMxID0gc2VsZi5zY29yZV91cmwodXJsMSkKICAgICAgICAgICAgczIgPSBzZWxmLnNjb3JlX3VybCh1cmwyKQogICAgICAgICAgICBpZiBzMSA+IHMyOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gdXJsMQogICAgICAgICAgICBpZiByZXN1bHQgIT0gdXJsMjoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm90IHJlcGxhY2luZyAlciB3aXRoICVyJywgdXJsMSwgdXJsMikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVwbGFjaW5nICVyIHdpdGggJXInLCB1cmwxLCB1cmwyKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgc3BsaXRfZmlsZW5hbWUoc2VsZiwgZmlsZW5hbWUsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgQXR0ZW1wdCB0byBzcGxpdCBhIGZpbGVuYW1lIGluIHByb2plY3QgbmFtZSwgdmVyc2lvbiBhbmQgUHl0aG9uIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNwbGl0X2ZpbGVuYW1lKGZpbGVuYW1lLCBwcm9qZWN0X25hbWUpCgogICAgZGVmIGNvbnZlcnRfdXJsX3RvX2Rvd25sb2FkX2luZm8oc2VsZiwgdXJsLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIgogICAgICAgIFNlZSBpZiBhIFVSTCBpcyBhIGNhbmRpZGF0ZSBmb3IgYSBkb3dubG9hZCBVUkwgZm9yIGEgcHJvamVjdCAodGhlIFVSTAogICAgICAgIGhhcyB0eXBpY2FsbHkgYmVlbiBzY3JhcGVkIGZyb20gYW4gSFRNTCBwYWdlKS4KCiAgICAgICAgSWYgaXQgaXMsIGEgZGljdGlvbmFyeSBpcyByZXR1cm5lZCB3aXRoIGtleXMgIm5hbWUiLCAidmVyc2lvbiIsCiAgICAgICAgImZpbGVuYW1lIiBhbmQgInVybCI7IG90aGVyd2lzZSwgTm9uZSBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBkZWYgc2FtZV9wcm9qZWN0KG5hbWUxLCBuYW1lMik6CiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVfbmFtZShuYW1lMSkgPT0gbm9ybWFsaXplX25hbWUobmFtZTIpCgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZyA9IHVybHBhcnNlKHVybCkKICAgICAgICBpZiBmcmFnLmxvd2VyKCkuc3RhcnRzd2l0aCgnZWdnPScpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzOiB2ZXJzaW9uIGhpbnQgaW4gZnJhZ21lbnQ6ICVyJywKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgZnJhZykKICAgICAgICBtID0gSEFTSEVSX0hBU0gubWF0Y2goZnJhZykKICAgICAgICBpZiBtOgogICAgICAgICAgICBhbGdvLCBkaWdlc3QgPSBtLmdyb3VwcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWxnbywgZGlnZXN0ID0gTm9uZSwgTm9uZQogICAgICAgIG9yaWdwYXRoID0gcGF0aAogICAgICAgIGlmIHBhdGggYW5kIHBhdGhbLTFdID09ICcvJzoKICAgICAgICAgICAgcGF0aCA9IHBhdGhbOi0xXQogICAgICAgIGlmIHBhdGguZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2hlZWwgPSBXaGVlbChwYXRoKQogICAgICAgICAgICAgICAgaWYgaXNfY29tcGF0aWJsZSh3aGVlbCwgc2VsZi53aGVlbF90YWdzKToKICAgICAgICAgICAgICAgICAgICBpZiBwcm9qZWN0X25hbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gc2FtZV9wcm9qZWN0KHdoZWVsLm5hbWUsIHByb2plY3RfbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBpbmNsdWRlOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IHdoZWVsLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbic6IHdoZWVsLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnOiB3aGVlbC5maWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnOiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgb3JpZ3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBxdWVyeSwgJycpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweXRob24tdmVyc2lvbic6ICcsICcuam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy4nLmpvaW4obGlzdCh2WzI6XSkpIGZvciB2IGluIHdoZWVsLnB5dmVyXSksCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnaW52YWxpZCBwYXRoIGZvciB3aGVlbDogJXMnLCBwYXRoKQogICAgICAgIGVsaWYgcGF0aC5lbmRzd2l0aChzZWxmLmRvd25sb2FkYWJsZV9leHRlbnNpb25zKToKICAgICAgICAgICAgcGF0aCA9IGZpbGVuYW1lID0gcG9zaXhwYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgICAgIGZvciBleHQgaW4gc2VsZi5kb3dubG9hZGFibGVfZXh0ZW5zaW9uczoKICAgICAgICAgICAgICAgIGlmIHBhdGguZW5kc3dpdGgoZXh0KToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFs6LWxlbihleHQpXQogICAgICAgICAgICAgICAgICAgIHQgPSBzZWxmLnNwbGl0X2ZpbGVuYW1lKHBhdGgsIHByb2plY3RfbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgdDoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyBtYXRjaCBmb3IgcHJvamVjdC92ZXJzaW9uOiAlcycsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmVyc2lvbiwgcHl2ZXIgPSB0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwcm9qZWN0X25hbWUgb3Igc2FtZV9wcm9qZWN0KHByb2plY3RfbmFtZSwgbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJzogdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnOiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXJsJzogdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIG9yaWdwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHF1ZXJ5LCAnJykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMncGFja2FnZXR5cGUnOiAnc2Rpc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHl2ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydweXRob24tdmVyc2lvbiddID0gcHl2ZXIKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHJlc3VsdCBhbmQgYWxnbzoKICAgICAgICAgICAgcmVzdWx0Wyclc19kaWdlc3QnICUgYWxnb10gPSBkaWdlc3QKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9nZXRfZGlnZXN0KHNlbGYsIGluZm8pOgogICAgICAgICIiIgogICAgICAgIEdldCBhIGRpZ2VzdCBmcm9tIGEgZGljdGlvbmFyeSBieSBsb29raW5nIGF0IGtleXMgb2YgdGhlIGZvcm0KICAgICAgICAnYWxnb19kaWdlc3QnLgoKICAgICAgICBSZXR1cm5zIGEgMi10dXBsZSAoYWxnbywgZGlnZXN0KSBpZiBmb3VuZCwgZWxzZSBOb25lLiBDdXJyZW50bHkKICAgICAgICBsb29rcyBvbmx5IGZvciBTSEEyNTYsIHRoZW4gTUQ1LgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBmb3IgYWxnbyBpbiAoJ3NoYTI1NicsICdtZDUnKToKICAgICAgICAgICAga2V5ID0gJyVzX2RpZ2VzdCcgJSBhbGdvCiAgICAgICAgICAgIGlmIGtleSBpbiBpbmZvOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gKGFsZ28sIGluZm9ba2V5XSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfdXBkYXRlX3ZlcnNpb25fZGF0YShzZWxmLCByZXN1bHQsIGluZm8pOgogICAgICAgICIiIgogICAgICAgIFVwZGF0ZSBhIHJlc3VsdCBkaWN0aW9uYXJ5ICh0aGUgZmluYWwgcmVzdWx0IGZyb20gX2dldF9wcm9qZWN0KSB3aXRoIGEKICAgICAgICBkaWN0aW9uYXJ5IGZvciBhIHNwZWNpZmljIHZlcnNpb24sIHdoaWNoIHR5cGljYWxseSBob2xkcyBpbmZvcm1hdGlvbgogICAgICAgIGdsZWFuZWQgZnJvbSBhIGZpbGVuYW1lIG9yIFVSTCBmb3IgYW4gYXJjaGl2ZSBmb3IgdGhlIGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gaW5mby5wb3AoJ25hbWUnKQogICAgICAgIHZlcnNpb24gPSBpbmZvLnBvcCgndmVyc2lvbicpCiAgICAgICAgaWYgdmVyc2lvbiBpbiByZXN1bHQ6CiAgICAgICAgICAgIGRpc3QgPSByZXN1bHRbdmVyc2lvbl0KICAgICAgICAgICAgbWQgPSBkaXN0Lm1ldGFkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzdCA9IG1ha2VfZGlzdChuYW1lLCB2ZXJzaW9uLCBzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgIG1kID0gZGlzdC5tZXRhZGF0YQogICAgICAgIGRpc3QuZGlnZXN0ID0gZGlnZXN0ID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgIHVybCA9IGluZm9bJ3VybCddCiAgICAgICAgcmVzdWx0WydkaWdlc3RzJ11bdXJsXSA9IGRpZ2VzdAogICAgICAgIGlmIG1kLnNvdXJjZV91cmwgIT0gaW5mb1sndXJsJ106CiAgICAgICAgICAgIG1kLnNvdXJjZV91cmwgPSBzZWxmLnByZWZlcl91cmwobWQuc291cmNlX3VybCwgdXJsKQogICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KHZlcnNpb24sIHNldCgpKS5hZGQodXJsKQogICAgICAgIGRpc3QubG9jYXRvciA9IHNlbGYKICAgICAgICByZXN1bHRbdmVyc2lvbl0gPSBkaXN0CgogICAgZGVmIGxvY2F0ZShzZWxmLCByZXF1aXJlbWVudCwgcHJlcmVsZWFzZXM9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgdGhlIG1vc3QgcmVjZW50IGRpc3RyaWJ1dGlvbiB3aGljaCBtYXRjaGVzIHRoZSBnaXZlbgogICAgICAgIHJlcXVpcmVtZW50LgoKICAgICAgICA6cGFyYW0gcmVxdWlyZW1lbnQ6IEEgcmVxdWlyZW1lbnQgb2YgdGhlIGZvcm0gJ2ZvbyAoMS4wKScgb3IgcGVyaGFwcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbyAoPj0gMS4wLCA8IDIuMCwgIT0gMS4zKScKICAgICAgICA6cGFyYW0gcHJlcmVsZWFzZXM6IElmIGBgVHJ1ZWBgLCBhbGxvdyBwcmUtcmVsZWFzZSB2ZXJzaW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgbG9jYXRlZC4gT3RoZXJ3aXNlLCBwcmUtcmVsZWFzZSB2ZXJzaW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCByZXR1cm5lZC4KICAgICAgICA6cmV0dXJuOiBBIDpjbGFzczpgRGlzdHJpYnV0aW9uYCBpbnN0YW5jZSwgb3IgYGBOb25lYGAgaWYgbm8gc3VjaAogICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbiBjb3VsZCBiZSBsb2NhdGVkLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICByID0gcGFyc2VfcmVxdWlyZW1lbnQocmVxdWlyZW1lbnQpCiAgICAgICAgaWYgciBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdOb3QgYSB2YWxpZCByZXF1aXJlbWVudDogJXInICUgcmVxdWlyZW1lbnQpCiAgICAgICAgc2NoZW1lID0gZ2V0X3NjaGVtZShzZWxmLnNjaGVtZSkKICAgICAgICBzZWxmLm1hdGNoZXIgPSBtYXRjaGVyID0gc2NoZW1lLm1hdGNoZXIoci5yZXF1aXJlbWVudCkKICAgICAgICBsb2dnZXIuZGVidWcoJ21hdGNoZXI6ICVzICglcyknLCBtYXRjaGVyLCB0eXBlKG1hdGNoZXIpLl9fbmFtZV9fKQogICAgICAgIHZlcnNpb25zID0gc2VsZi5nZXRfcHJvamVjdChyLm5hbWUpCiAgICAgICAgaWYgbGVuKHZlcnNpb25zKSA+IDI6ICAgIyB1cmxzIGFuZCBkaWdlc3RzIGtleXMgYXJlIHByZXNlbnQKICAgICAgICAgICAgIyBzb21ldGltZXMsIHZlcnNpb25zIGFyZSBpbnZhbGlkCiAgICAgICAgICAgIHNsaXN0ID0gW10KICAgICAgICAgICAgdmNscyA9IG1hdGNoZXIudmVyc2lvbl9jbGFzcwogICAgICAgICAgICBmb3IgayBpbiB2ZXJzaW9uczoKICAgICAgICAgICAgICAgIGlmIGsgaW4gKCd1cmxzJywgJ2RpZ2VzdHMnKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtYXRjaGVyLm1hdGNoKGspOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzIGRpZCBub3QgbWF0Y2ggJXInLCBtYXRjaGVyLCBrKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByZXJlbGVhc2VzIG9yIG5vdCB2Y2xzKGspLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoaykKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnc2tpcHBpbmcgcHJlLXJlbGVhc2UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uICVzIG9mICVzJywgaywgbWF0Y2hlci5uYW1lKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdlcnJvciBtYXRjaGluZyAlcyB3aXRoICVyJywgbWF0Y2hlciwgaykKICAgICAgICAgICAgICAgICAgICBwYXNzICMgc2xpc3QuYXBwZW5kKGspCiAgICAgICAgICAgIGlmIGxlbihzbGlzdCkgPiAxOgogICAgICAgICAgICAgICAgc2xpc3QgPSBzb3J0ZWQoc2xpc3QsIGtleT1zY2hlbWUua2V5KQogICAgICAgICAgICBpZiBzbGlzdDoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnc29ydGVkIGxpc3Q6ICVzJywgc2xpc3QpCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc2xpc3RbLTFdCiAgICAgICAgICAgICAgICByZXN1bHQgPSB2ZXJzaW9uc1t2ZXJzaW9uXQogICAgICAgIGlmIHJlc3VsdDoKICAgICAgICAgICAgaWYgci5leHRyYXM6CiAgICAgICAgICAgICAgICByZXN1bHQuZXh0cmFzID0gci5leHRyYXMKICAgICAgICAgICAgcmVzdWx0LmRvd25sb2FkX3VybHMgPSB2ZXJzaW9ucy5nZXQoJ3VybHMnLCB7fSkuZ2V0KHZlcnNpb24sIHNldCgpKQogICAgICAgICAgICBkID0ge30KICAgICAgICAgICAgc2QgPSB2ZXJzaW9ucy5nZXQoJ2RpZ2VzdHMnLCB7fSkKICAgICAgICAgICAgZm9yIHVybCBpbiByZXN1bHQuZG93bmxvYWRfdXJsczoKICAgICAgICAgICAgICAgIGlmIHVybCBpbiBzZDoKICAgICAgICAgICAgICAgICAgICBkW3VybF0gPSBzZFt1cmxdCiAgICAgICAgICAgIHJlc3VsdC5kaWdlc3RzID0gZAogICAgICAgIHNlbGYubWF0Y2hlciA9IE5vbmUKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgUHlQSVJQQ0xvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgbG9jYXRvciB1c2VzIFhNTC1SUEMgdG8gbG9jYXRlIGRpc3RyaWJ1dGlvbnMuIEl0IHRoZXJlZm9yZQogICAgY2Fubm90IGJlIHVzZWQgd2l0aCBzaW1wbGUgbWlycm9ycyAodGhhdCBvbmx5IG1pcnJvciBmaWxlIGNvbnRlbnQpLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIHVybDogVGhlIFVSTCB0byB1c2UgZm9yIFhNTC1SUEMuCiAgICAgICAgOnBhcmFtIGt3YXJnczogUGFzc2VkIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKFB5UElSUENMb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBzZWxmLmJhc2VfdXJsID0gdXJsCiAgICAgICAgc2VsZi5jbGllbnQgPSBTZXJ2ZXJQcm94eSh1cmwsIHRpbWVvdXQ9My4wKQoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNldChzZWxmLmNsaWVudC5saXN0X3BhY2thZ2VzKCkpCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICB2ZXJzaW9ucyA9IHNlbGYuY2xpZW50LnBhY2thZ2VfcmVsZWFzZXMobmFtZSwgVHJ1ZSkKICAgICAgICBmb3IgdiBpbiB2ZXJzaW9uczoKICAgICAgICAgICAgdXJscyA9IHNlbGYuY2xpZW50LnJlbGVhc2VfdXJscyhuYW1lLCB2KQogICAgICAgICAgICBkYXRhID0gc2VsZi5jbGllbnQucmVsZWFzZV9kYXRhKG5hbWUsIHYpCiAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoc2NoZW1lPXNlbGYuc2NoZW1lKQogICAgICAgICAgICBtZXRhZGF0YS5uYW1lID0gZGF0YVsnbmFtZSddCiAgICAgICAgICAgIG1ldGFkYXRhLnZlcnNpb24gPSBkYXRhWyd2ZXJzaW9uJ10KICAgICAgICAgICAgbWV0YWRhdGEubGljZW5zZSA9IGRhdGEuZ2V0KCdsaWNlbnNlJykKICAgICAgICAgICAgbWV0YWRhdGEua2V5d29yZHMgPSBkYXRhLmdldCgna2V5d29yZHMnLCBbXSkKICAgICAgICAgICAgbWV0YWRhdGEuc3VtbWFyeSA9IGRhdGEuZ2V0KCdzdW1tYXJ5JykKICAgICAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihtZXRhZGF0YSkKICAgICAgICAgICAgaWYgdXJsczoKICAgICAgICAgICAgICAgIGluZm8gPSB1cmxzWzBdCiAgICAgICAgICAgICAgICBtZXRhZGF0YS5zb3VyY2VfdXJsID0gaW5mb1sndXJsJ10KICAgICAgICAgICAgICAgIGRpc3QuZGlnZXN0ID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgICAgICAgICAgZGlzdC5sb2NhdG9yID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0W3ZdID0gZGlzdAogICAgICAgICAgICAgICAgZm9yIGluZm8gaW4gdXJsczoKICAgICAgICAgICAgICAgICAgICB1cmwgPSBpbmZvWyd1cmwnXQogICAgICAgICAgICAgICAgICAgIGRpZ2VzdCA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KHYsIHNldCgpKS5hZGQodXJsKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnZGlnZXN0cyddW3VybF0gPSBkaWdlc3QKICAgICAgICByZXR1cm4gcmVzdWx0CgpjbGFzcyBQeVBJSlNPTkxvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgbG9jYXRvciB1c2VzIFB5UEkncyBKU09OIGludGVyZmFjZS4gSXQncyB2ZXJ5IGxpbWl0ZWQgaW4gZnVuY3Rpb25hbGl0eQogICAgYW5kIHByb2JhYmx5IG5vdCB3b3J0aCB1c2luZy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFB5UElKU09OTG9jYXRvciwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5iYXNlX3VybCA9IGVuc3VyZV9zbGFzaCh1cmwpCgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdOb3QgYXZhaWxhYmxlIGZyb20gdGhpcyBsb2NhdG9yJykKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIHVybCA9IHVybGpvaW4oc2VsZi5iYXNlX3VybCwgJyVzL2pzb24nICUgcXVvdGUobmFtZSkpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXNwID0gc2VsZi5vcGVuZXIub3Blbih1cmwpCiAgICAgICAgICAgIGRhdGEgPSByZXNwLnJlYWQoKS5kZWNvZGUoKSAjIGZvciBub3cKICAgICAgICAgICAgZCA9IGpzb24ubG9hZHMoZGF0YSkKICAgICAgICAgICAgbWQgPSBNZXRhZGF0YShzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgIGRhdGEgPSBkWydpbmZvJ10KICAgICAgICAgICAgbWQubmFtZSA9IGRhdGFbJ25hbWUnXQogICAgICAgICAgICBtZC52ZXJzaW9uID0gZGF0YVsndmVyc2lvbiddCiAgICAgICAgICAgIG1kLmxpY2Vuc2UgPSBkYXRhLmdldCgnbGljZW5zZScpCiAgICAgICAgICAgIG1kLmtleXdvcmRzID0gZGF0YS5nZXQoJ2tleXdvcmRzJywgW10pCiAgICAgICAgICAgIG1kLnN1bW1hcnkgPSBkYXRhLmdldCgnc3VtbWFyeScpCiAgICAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24obWQpCiAgICAgICAgICAgIGRpc3QubG9jYXRvciA9IHNlbGYKICAgICAgICAgICAgdXJscyA9IGRbJ3VybHMnXQogICAgICAgICAgICByZXN1bHRbbWQudmVyc2lvbl0gPSBkaXN0CiAgICAgICAgICAgIGZvciBpbmZvIGluIGRbJ3VybHMnXToKICAgICAgICAgICAgICAgIHVybCA9IGluZm9bJ3VybCddCiAgICAgICAgICAgICAgICBkaXN0LmRvd25sb2FkX3VybHMuYWRkKHVybCkKICAgICAgICAgICAgICAgIGRpc3QuZGlnZXN0c1t1cmxdID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgICAgICAgICAgcmVzdWx0Wyd1cmxzJ10uc2V0ZGVmYXVsdChtZC52ZXJzaW9uLCBzZXQoKSkuYWRkKHVybCkKICAgICAgICAgICAgICAgIHJlc3VsdFsnZGlnZXN0cyddW3VybF0gPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgICAgICMgTm93IGdldCBvdGhlciByZWxlYXNlcwogICAgICAgICAgICBmb3IgdmVyc2lvbiwgaW5mb3MgaW4gZFsncmVsZWFzZXMnXS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgdmVyc2lvbiA9PSBtZC52ZXJzaW9uOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgYWxyZWFkeSBkb25lCiAgICAgICAgICAgICAgICBvbWQgPSBNZXRhZGF0YShzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgICAgICBvbWQubmFtZSA9IG1kLm5hbWUKICAgICAgICAgICAgICAgIG9tZC52ZXJzaW9uID0gdmVyc2lvbgogICAgICAgICAgICAgICAgb2Rpc3QgPSBEaXN0cmlidXRpb24ob21kKQogICAgICAgICAgICAgICAgb2Rpc3QubG9jYXRvciA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdFt2ZXJzaW9uXSA9IG9kaXN0CiAgICAgICAgICAgICAgICBmb3IgaW5mbyBpbiBpbmZvczoKICAgICAgICAgICAgICAgICAgICB1cmwgPSBpbmZvWyd1cmwnXQogICAgICAgICAgICAgICAgICAgIG9kaXN0LmRvd25sb2FkX3VybHMuYWRkKHVybCkKICAgICAgICAgICAgICAgICAgICBvZGlzdC5kaWdlc3RzW3VybF0gPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd1cmxzJ10uc2V0ZGVmYXVsdCh2ZXJzaW9uLCBzZXQoKSkuYWRkKHVybCkKICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2RpZ2VzdHMnXVt1cmxdID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQojICAgICAgICAgICAgZm9yIGluZm8gaW4gdXJsczoKIyAgICAgICAgICAgICAgICBtZC5zb3VyY2VfdXJsID0gaW5mb1sndXJsJ10KIyAgICAgICAgICAgICAgICBkaXN0LmRpZ2VzdCA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKIyAgICAgICAgICAgICAgICBkaXN0LmxvY2F0b3IgPSBzZWxmCiMgICAgICAgICAgICAgICAgZm9yIGluZm8gaW4gdXJsczoKIyAgICAgICAgICAgICAgICAgICAgdXJsID0gaW5mb1sndXJsJ10KIyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd1cmxzJ10uc2V0ZGVmYXVsdChtZC52ZXJzaW9uLCBzZXQoKSkuYWRkKHVybCkKIyAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydkaWdlc3RzJ11bdXJsXSA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHNlbGYuZXJyb3JzLnB1dCh0ZXh0X3R5cGUoZSkpCiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0pTT04gZmV0Y2ggZmFpbGVkOiAlcycsIGUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIFBhZ2Uob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2NyYXBlZCBIVE1MIHBhZ2UuCiAgICAiIiIKICAgICMgVGhlIGZvbGxvd2luZyBzbGlnaHRseSBoYWlyeS1sb29raW5nIHJlZ2V4IGp1c3QgbG9va3MgZm9yIHRoZSBjb250ZW50cyBvZgogICAgIyBhbiBhbmNob3IgbGluaywgd2hpY2ggaGFzIGFuIGF0dHJpYnV0ZSAiaHJlZiIgZWl0aGVyIGltbWVkaWF0ZWx5IHByZWNlZGVkCiAgICAjIG9yIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgInJlbCIgYXR0cmlidXRlLiBUaGUgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUKICAgICMgZGVjbGFyZWQgd2l0aCBkb3VibGUgcXVvdGVzLCBzaW5nbGUgcXVvdGVzIG9yIG5vIHF1b3RlcyAtIHdoaWNoIGxlYWRzIHRvCiAgICAjIHRoZSBsZW5ndGggb2YgdGhlIGV4cHJlc3Npb24uCiAgICBfaHJlZiA9IHJlLmNvbXBpbGUoIiIiCihyZWxccyo9XHMqKD86Iig/UDxyZWwxPlteIl0qKSJ8Jyg/UDxyZWwyPlteJ10qKSd8KD9QPHJlbDM+W14+XHNcbl0qKSlccyspPwpocmVmXHMqPVxzKig/OiIoP1A8dXJsMT5bXiJdKikifCcoP1A8dXJsMj5bXiddKiknfCg/UDx1cmwzPltePlxzXG5dKikpCihccytyZWxccyo9XHMqKD86Iig/UDxyZWw0PlteIl0qKSJ8Jyg/UDxyZWw1PlteJ10qKSd8KD9QPHJlbDY+W14+XHNcbl0qKSkpPwoiIiIsIHJlLkkgfCByZS5TIHwgcmUuWCkKICAgIF9iYXNlID0gcmUuY29tcGlsZShyIiIiPGJhc2VccytocmVmXHMqPVxzKlsnIl0/KFteJyI+XSspIiIiLCByZS5JIHwgcmUuUykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlIHdpdGggdGhlIFVuaWNvZGUgcGFnZSBjb250ZW50cyBhbmQgdGhlIFVSTCB0aGV5CiAgICAgICAgY2FtZSBmcm9tLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKICAgICAgICBzZWxmLmJhc2VfdXJsID0gc2VsZi51cmwgPSB1cmwKICAgICAgICBtID0gc2VsZi5fYmFzZS5zZWFyY2goc2VsZi5kYXRhKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIHNlbGYuYmFzZV91cmwgPSBtLmdyb3VwKDEpCgogICAgX2NsZWFuX3JlID0gcmUuY29tcGlsZShyJ1teYS16MC05JCYrLC86Oz0/QC4jJV9cXHwtXScsIHJlLkkpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGxpbmtzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgVVJMcyBvZiBhbGwgdGhlIGxpbmtzIG9uIGEgcGFnZSB0b2dldGhlciB3aXRoIGluZm9ybWF0aW9uCiAgICAgICAgYWJvdXQgdGhlaXIgInJlbCIgYXR0cmlidXRlLCBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggb25lcyB0byB0cmVhdCBhcwogICAgICAgIGRvd25sb2FkcyBhbmQgd2hpY2ggb25lcyB0byBxdWV1ZSBmb3IgZnVydGhlciBzY3JhcGluZy4KICAgICAgICAiIiIKICAgICAgICBkZWYgY2xlYW4odXJsKToKICAgICAgICAgICAgIlRpZHkgdXAgYW4gVVJMLiIKICAgICAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcgPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcXVvdGUocGF0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHF1ZXJ5LCBmcmFnKSkKCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBmb3IgbWF0Y2ggaW4gc2VsZi5faHJlZi5maW5kaXRlcihzZWxmLmRhdGEpOgogICAgICAgICAgICBkID0gbWF0Y2guZ3JvdXBkaWN0KCcnKQogICAgICAgICAgICByZWwgPSAoZFsncmVsMSddIG9yIGRbJ3JlbDInXSBvciBkWydyZWwzJ10gb3IKICAgICAgICAgICAgICAgICAgIGRbJ3JlbDQnXSBvciBkWydyZWw1J10gb3IgZFsncmVsNiddKQogICAgICAgICAgICB1cmwgPSBkWyd1cmwxJ10gb3IgZFsndXJsMiddIG9yIGRbJ3VybDMnXQogICAgICAgICAgICB1cmwgPSB1cmxqb2luKHNlbGYuYmFzZV91cmwsIHVybCkKICAgICAgICAgICAgdXJsID0gdW5lc2NhcGUodXJsKQogICAgICAgICAgICB1cmwgPSBzZWxmLl9jbGVhbl9yZS5zdWIobGFtYmRhIG06ICclJSUyeCcgJSBvcmQobS5ncm91cCgwKSksIHVybCkKICAgICAgICAgICAgcmVzdWx0LmFkZCgodXJsLCByZWwpKQogICAgICAgICMgV2Ugc29ydCB0aGUgcmVzdWx0LCBob3BpbmcgdG8gYnJpbmcgdGhlIG1vc3QgcmVjZW50IHZlcnNpb25zCiAgICAgICAgIyB0byB0aGUgZnJvbnQKICAgICAgICByZXN1bHQgPSBzb3J0ZWQocmVzdWx0LCBrZXk9bGFtYmRhIHQ6IHRbMF0sIHJldmVyc2U9VHJ1ZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgU2ltcGxlU2NyYXBpbmdMb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBBIGxvY2F0b3Igd2hpY2ggc2NyYXBlcyBIVE1MIHBhZ2VzIHRvIGxvY2F0ZSBkb3dubG9hZHMgZm9yIGEgZGlzdHJpYnV0aW9uLgogICAgVGhpcyBydW5zIG11bHRpcGxlIHRocmVhZHMgdG8gZG8gdGhlIEkvTzsgcGVyZm9ybWFuY2UgaXMgYXQgbGVhc3QgYXMgZ29vZAogICAgYXMgcGlwJ3MgUGFja2FnZUZpbmRlciwgd2hpY2ggd29ya3MgaW4gYW4gYW5hbG9nb3VzIGZhc2hpb24uCiAgICAiIiIKCiAgICAjIFRoZXNlIGFyZSB1c2VkIHRvIGRlYWwgd2l0aCB2YXJpb3VzIENvbnRlbnQtRW5jb2Rpbmcgc2NoZW1lcy4KICAgIGRlY29kZXJzID0gewogICAgICAgICdkZWZsYXRlJzogemxpYi5kZWNvbXByZXNzLAogICAgICAgICdnemlwJzogbGFtYmRhIGI6IGd6aXAuR3ppcEZpbGUoZmlsZW9iaj1CeXRlc0lPKGQpKS5yZWFkKCksCiAgICAgICAgJ25vbmUnOiBsYW1iZGEgYjogYiwKICAgIH0KCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCB0aW1lb3V0PU5vbmUsIG51bV93b3JrZXJzPTEwLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gdXJsOiBUaGUgcm9vdCBVUkwgdG8gdXNlIGZvciBzY3JhcGluZy4KICAgICAgICA6cGFyYW0gdGltZW91dDogVGhlIHRpbWVvdXQsIGluIHNlY29uZHMsIHRvIGJlIGFwcGxpZWQgdG8gcmVxdWVzdHMuCiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZGVmYXVsdHMgdG8gYGBOb25lYGAgKG5vIHRpbWVvdXQgc3BlY2lmaWVkKS4KICAgICAgICA6cGFyYW0gbnVtX3dvcmtlcnM6IFRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgeW91IHdhbnQgdG8gZG8gSS9PLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBkZWZhdWx0cyB0byAxMC4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBQYXNzZWQgdG8gdGhlIHN1cGVyY2xhc3MuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoU2ltcGxlU2NyYXBpbmdMb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBzZWxmLmJhc2VfdXJsID0gZW5zdXJlX3NsYXNoKHVybCkKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CiAgICAgICAgc2VsZi5fcGFnZV9jYWNoZSA9IHt9CiAgICAgICAgc2VsZi5fc2VlbiA9IHNldCgpCiAgICAgICAgc2VsZi5fdG9fZmV0Y2ggPSBxdWV1ZS5RdWV1ZSgpCiAgICAgICAgc2VsZi5fYmFkX2hvc3RzID0gc2V0KCkKICAgICAgICBzZWxmLnNraXBfZXh0ZXJuYWxzID0gRmFsc2UKICAgICAgICBzZWxmLm51bV93b3JrZXJzID0gbnVtX3dvcmtlcnMKICAgICAgICBzZWxmLl9sb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKICAgICAgICAjIFNlZSBpc3N1ZSAjNDU6IHdlIG5lZWQgdG8gYmUgcmVzaWxpZW50IHdoZW4gdGhlIGxvY2F0b3IgaXMgdXNlZAogICAgICAgICMgaW4gYSB0aHJlYWQsIGUuZy4gd2l0aCBjb25jdXJyZW50LmZ1dHVyZXMuIFdlIGNhbid0IHVzZSBzZWxmLl9sb2NrCiAgICAgICAgIyBhcyBpdCBpcyBmb3IgY29vcmRpbmF0aW5nIG91ciBpbnRlcm5hbCB0aHJlYWRzIC0gdGhlIG9uZXMgY3JlYXRlZAogICAgICAgICMgaW4gX3ByZXBhcmVfdGhyZWFkcy4KICAgICAgICBzZWxmLl9ncGxvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQoKICAgIGRlZiBfcHJlcGFyZV90aHJlYWRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRocmVhZHMgYXJlIGNyZWF0ZWQgb25seSB3aGVuIGdldF9wcm9qZWN0IGlzIGNhbGxlZCwgYW5kIHRlcm1pbmF0ZQogICAgICAgIGJlZm9yZSBpdCByZXR1cm5zLiBUaGV5IGFyZSB0aGVyZSBwcmltYXJpbHkgdG8gcGFyYWxsZWxpc2UgSS9PIChpLmUuCiAgICAgICAgZmV0Y2hpbmcgd2ViIHBhZ2VzKS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl90aHJlYWRzID0gW10KICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLm51bV93b3JrZXJzKToKICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuX2ZldGNoKQogICAgICAgICAgICB0LnNldERhZW1vbihUcnVlKQogICAgICAgICAgICB0LnN0YXJ0KCkKICAgICAgICAgICAgc2VsZi5fdGhyZWFkcy5hcHBlbmQodCkKCiAgICBkZWYgX3dhaXRfdGhyZWFkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZWxsIGFsbCB0aGUgdGhyZWFkcyB0byB0ZXJtaW5hdGUgKGJ5IHNlbmRpbmcgYSBzZW50aW5lbCB2YWx1ZSkgYW5kCiAgICAgICAgd2FpdCBmb3IgdGhlbSB0byBkbyBzby4KICAgICAgICAiIiIKICAgICAgICAjIE5vdGUgdGhhdCB5b3UgbmVlZCB0d28gbG9vcHMsIHNpbmNlIHlvdSBjYW4ndCBzYXkgd2hpY2gKICAgICAgICAjIHRocmVhZCB3aWxsIGdldCBlYWNoIHNlbnRpbmVsCiAgICAgICAgZm9yIHQgaW4gc2VsZi5fdGhyZWFkczoKICAgICAgICAgICAgc2VsZi5fdG9fZmV0Y2gucHV0KE5vbmUpICAgICMgc2VudGluZWwKICAgICAgICBmb3IgdCBpbiBzZWxmLl90aHJlYWRzOgogICAgICAgICAgICB0LmpvaW4oKQogICAgICAgIHNlbGYuX3RocmVhZHMgPSBbXQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgd2l0aCBzZWxmLl9ncGxvY2s6CiAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gcmVzdWx0CiAgICAgICAgICAgIHNlbGYucHJvamVjdF9uYW1lID0gbmFtZQogICAgICAgICAgICB1cmwgPSB1cmxqb2luKHNlbGYuYmFzZV91cmwsICclcy8nICUgcXVvdGUobmFtZSkpCiAgICAgICAgICAgIHNlbGYuX3NlZW4uY2xlYXIoKQogICAgICAgICAgICBzZWxmLl9wYWdlX2NhY2hlLmNsZWFyKCkKICAgICAgICAgICAgc2VsZi5fcHJlcGFyZV90aHJlYWRzKCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdRdWV1ZWluZyAlcycsIHVybCkKICAgICAgICAgICAgICAgIHNlbGYuX3RvX2ZldGNoLnB1dCh1cmwpCiAgICAgICAgICAgICAgICBzZWxmLl90b19mZXRjaC5qb2luKCkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNlbGYuX3dhaXRfdGhyZWFkcygpCiAgICAgICAgICAgIGRlbCBzZWxmLnJlc3VsdAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBwbGF0Zm9ybV9kZXBlbmRlbnQgPSByZS5jb21waWxlKHInXGIobGludXgtKGlcZDg2fHg4Nl82NHxhcm1cdyspfCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcid3aW4oMzJ8LWFtZDY0KXxtYWNvc3gtP1xkKylcYicsIHJlLkkpCgogICAgZGVmIF9pc19wbGF0Zm9ybV9kZXBlbmRlbnQoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBEb2VzIGFuIFVSTCByZWZlciB0byBhIHBsYXRmb3JtLXNwZWNpZmljIGRvd25sb2FkPwogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnBsYXRmb3JtX2RlcGVuZGVudC5zZWFyY2godXJsKQoKICAgIGRlZiBfcHJvY2Vzc19kb3dubG9hZChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIFNlZSBpZiBhbiBVUkwgaXMgYSBzdWl0YWJsZSBkb3dubG9hZCBmb3IgYSBwcm9qZWN0LgoKICAgICAgICBJZiBpdCBpcywgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3VsdCBkaWN0aW9uYXJ5IChmb3IKICAgICAgICBfZ2V0X3Byb2plY3QpIGFib3V0IHRoZSBzcGVjaWZpYyB2ZXJzaW9uIGl0J3MgZm9yLgoKICAgICAgICBOb3RlIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpc24ndCBhY3R1YWxseSB1c2VkIG90aGVyIHRoYW4gYXMgYSBib29sZWFuCiAgICAgICAgdmFsdWUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5faXNfcGxhdGZvcm1fZGVwZW5kZW50KHVybCk6CiAgICAgICAgICAgIGluZm8gPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW5mbyA9IHNlbGYuY29udmVydF91cmxfdG9fZG93bmxvYWRfaW5mbyh1cmwsIHNlbGYucHJvamVjdF9uYW1lKQogICAgICAgIGxvZ2dlci5kZWJ1ZygncHJvY2Vzc19kb3dubG9hZDogJXMgLT4gJXMnLCB1cmwsIGluZm8pCiAgICAgICAgaWYgaW5mbzoKICAgICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOiAgICAjIG5lZWRlZCBiZWNhdXNlIHNlbGYucmVzdWx0IGlzIHNoYXJlZAogICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX3ZlcnNpb25fZGF0YShzZWxmLnJlc3VsdCwgaW5mbykKICAgICAgICByZXR1cm4gaW5mbwoKICAgIGRlZiBfc2hvdWxkX3F1ZXVlKHNlbGYsIGxpbmssIHJlZmVycmVyLCByZWwpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZSB3aGV0aGVyIGEgbGluayBVUkwgZnJvbSBhIHJlZmVycmluZyBwYWdlIGFuZCB3aXRoIGEKICAgICAgICBwYXJ0aWN1bGFyICJyZWwiIGF0dHJpYnV0ZSBzaG91bGQgYmUgcXVldWVkIGZvciBzY3JhcGluZy4KICAgICAgICAiIiIKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgXywgXywgXyA9IHVybHBhcnNlKGxpbmspCiAgICAgICAgaWYgcGF0aC5lbmRzd2l0aChzZWxmLnNvdXJjZV9leHRlbnNpb25zICsgc2VsZi5iaW5hcnlfZXh0ZW5zaW9ucyArCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV4Y2x1ZGVkX2V4dGVuc2lvbnMpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsaWYgc2VsZi5za2lwX2V4dGVybmFscyBhbmQgbm90IGxpbmsuc3RhcnRzd2l0aChzZWxmLmJhc2VfdXJsKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbGlmIG5vdCByZWZlcnJlci5zdGFydHN3aXRoKHNlbGYuYmFzZV91cmwpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsaWYgcmVsIG5vdCBpbiAoJ2hvbWVwYWdlJywgJ2Rvd25sb2FkJyk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxpZiBzY2hlbWUgbm90IGluICgnaHR0cCcsICdodHRwcycsICdmdHAnKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbGlmIHNlbGYuX2lzX3BsYXRmb3JtX2RlcGVuZGVudChsaW5rKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBob3N0ID0gbmV0bG9jLnNwbGl0KCc6JywgMSlbMF0KICAgICAgICAgICAgaWYgaG9zdC5sb3dlcigpID09ICdsb2NhbGhvc3QnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICBsb2dnZXIuZGVidWcoJ3Nob3VsZF9xdWV1ZTogJXMgKCVzKSBmcm9tICVzIC0+ICVzJywgbGluaywgcmVsLAogICAgICAgICAgICAgICAgICAgICByZWZlcnJlciwgcmVzdWx0KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2ZldGNoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIFVSTCB0byBmZXRjaCBmcm9tIHRoZSB3b3JrIHF1ZXVlLCBnZXQgdGhlIEhUTUwgcGFnZSwgZXhhbWluZSBpdHMKICAgICAgICBsaW5rcyBmb3IgZG93bmxvYWQgY2FuZGlkYXRlcyBhbmQgY2FuZGlkYXRlcyBmb3IgZnVydGhlciBzY3JhcGluZy4KCiAgICAgICAgVGhpcyBpcyBhIGhhbmR5IG1ldGhvZCB0byBydW4gaW4gYSB0aHJlYWQuCiAgICAgICAgIiIiCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdXJsID0gc2VsZi5fdG9fZmV0Y2guZ2V0KCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgdXJsOgogICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBzZWxmLmdldF9wYWdlKHVybCkKICAgICAgICAgICAgICAgICAgICBpZiBwYWdlIGlzIE5vbmU6ICAgICMgZS5nLiBhZnRlciBhbiBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGZvciBsaW5rLCByZWwgaW4gcGFnZS5saW5rczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluayBub3QgaW4gc2VsZi5fc2VlbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlZW4uYWRkKGxpbmspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm90IHNlbGYuX3Byb2Nlc3NfZG93bmxvYWQobGluaykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2hvdWxkX3F1ZXVlKGxpbmssIHVybCwgcmVsKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdRdWV1ZWluZyAlcyBmcm9tICVzJywgbGluaywgdXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RvX2ZldGNoLnB1dChsaW5rKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JzLnB1dCh0ZXh0X3R5cGUoZSkpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAjIGFsd2F5cyBkbyB0aGlzLCB0byBhdm9pZCBoYW5ncyA6LSkKICAgICAgICAgICAgICAgIHNlbGYuX3RvX2ZldGNoLnRhc2tfZG9uZSgpCiAgICAgICAgICAgIGlmIG5vdCB1cmw6CiAgICAgICAgICAgICAgICAjbG9nZ2VyLmRlYnVnKCdTZW50aW5lbCBzZWVuLCBxdWl0dGluZy4nKQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgZ2V0X3BhZ2Uoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIEhUTUwgZm9yIGFuIFVSTCwgcG9zc2libHkgZnJvbSBhbiBpbi1tZW1vcnkgY2FjaGUuCgogICAgICAgIFhYWCBUT0RPIE5vdGU6IHRoaXMgY2FjaGUgaXMgbmV2ZXIgYWN0dWFsbHkgY2xlYXJlZC4gSXQncyBhc3N1bWVkIHRoYXQKICAgICAgICB0aGUgZGF0YSB3b24ndCBnZXQgc3RhbGUgb3ZlciB0aGUgbGlmZXRpbWUgb2YgYSBsb2NhdG9yIGluc3RhbmNlIChub3QKICAgICAgICBuZWNlc3NhcmlseSB0cnVlIGZvciB0aGUgZGVmYXVsdF9sb2NhdG9yKS4KICAgICAgICAiIiIKICAgICAgICAjIGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0RldkNlbnRlci9FYXN5SW5zdGFsbCNwYWNrYWdlLWluZGV4LWFwaQogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBfLCBfLCBfID0gdXJscGFyc2UodXJsKQogICAgICAgIGlmIHNjaGVtZSA9PSAnZmlsZScgYW5kIG9zLnBhdGguaXNkaXIodXJsMnBhdGhuYW1lKHBhdGgpKToKICAgICAgICAgICAgdXJsID0gdXJsam9pbihlbnN1cmVfc2xhc2godXJsKSwgJ2luZGV4Lmh0bWwnKQoKICAgICAgICBpZiB1cmwgaW4gc2VsZi5fcGFnZV9jYWNoZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fcGFnZV9jYWNoZVt1cmxdCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmV0dXJuaW5nICVzIGZyb20gY2FjaGU6ICVzJywgdXJsLCByZXN1bHQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaG9zdCA9IG5ldGxvYy5zcGxpdCgnOicsIDEpWzBdCiAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICAgICAgaWYgaG9zdCBpbiBzZWxmLl9iYWRfaG9zdHM6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nICVzIGR1ZSB0byBiYWQgaG9zdCAlcycsIHVybCwgaG9zdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPXsnQWNjZXB0LWVuY29kaW5nJzogJ2lkZW50aXR5J30pCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGZXRjaGluZyAlcycsIHVybCkKICAgICAgICAgICAgICAgICAgICByZXNwID0gc2VsZi5vcGVuZXIub3BlbihyZXEsIHRpbWVvdXQ9c2VsZi50aW1lb3V0KQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmV0Y2hlZCAlcycsIHVybCkKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gcmVzcC5pbmZvKCkKICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgPSBoZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJywgJycpCiAgICAgICAgICAgICAgICAgICAgaWYgSFRNTF9DT05URU5UX1RZUEUubWF0Y2goY29udGVudF90eXBlKToKICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfdXJsID0gcmVzcC5nZXR1cmwoKQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzcC5yZWFkKCkKICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBoZWFkZXJzLmdldCgnQ29udGVudC1FbmNvZGluZycpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciA9IHNlbGYuZGVjb2RlcnNbZW5jb2RpbmddICAgIyBmYWlsIGlmIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRlY29kZXIoZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAndXRmLTgnCiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBDSEFSU0VULnNlYXJjaChjb250ZW50X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IG0uZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKGVuY29kaW5nKQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoJ2xhdGluLTEnKSAgICAjIGZhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFBhZ2UoZGF0YSwgZmluYWxfdXJsKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYWdlX2NhY2hlW2ZpbmFsX3VybF0gPSByZXN1bHQKICAgICAgICAgICAgICAgIGV4Y2VwdCBIVFRQRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICBpZiBlLmNvZGUgIT0gNDA0OgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdGZXRjaCBmYWlsZWQ6ICVzOiAlcycsIHVybCwgZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBVUkxFcnJvciBhcyBlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRmV0Y2ggZmFpbGVkOiAlczogJXMnLCB1cmwsIGUpCiAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9iYWRfaG9zdHMuYWRkKGhvc3QpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdGZXRjaCBmYWlsZWQ6ICVzOiAlcycsIHVybCwgZSkKICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFnZV9jYWNoZVt1cmxdID0gcmVzdWx0ICAgIyBldmVuIGlmIE5vbmUgKGZhaWx1cmUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIF9kaXN0bmFtZV9yZSA9IHJlLmNvbXBpbGUoJzxhIGhyZWY9W14+XSo+KFtePF0rKTwnKQoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBwYWdlID0gc2VsZi5nZXRfcGFnZShzZWxmLmJhc2VfdXJsKQogICAgICAgIGlmIG5vdCBwYWdlOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdVbmFibGUgdG8gZ2V0ICVzJyAlIHNlbGYuYmFzZV91cmwpCiAgICAgICAgZm9yIG1hdGNoIGluIHNlbGYuX2Rpc3RuYW1lX3JlLmZpbmRpdGVyKHBhZ2UuZGF0YSk6CiAgICAgICAgICAgIHJlc3VsdC5hZGQobWF0Y2guZ3JvdXAoMSkpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKY2xhc3MgRGlyZWN0b3J5TG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBjbGFzcyBsb2NhdGVzIGRpc3RyaWJ1dGlvbnMgaW4gYSBkaXJlY3RvcnkgdHJlZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gcGF0aDogVGhlIHJvb3Qgb2YgdGhlIGRpcmVjdG9yeSB0cmVlIHRvIHNlYXJjaC4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBQYXNzZWQgdG8gdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGZvcjoKICAgICAgICAgICAgICAgICAgICAgICAqIHJlY3Vyc2l2ZSAtIGlmIFRydWUgKHRoZSBkZWZhdWx0KSwgc3ViZGlyZWN0b3JpZXMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlZCBpbnRvLiBJZiBGYWxzZSwgb25seSB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgICAgICAgICAgaXMgc2VhcmNoZWQsCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5yZWN1cnNpdmUgPSBrd2FyZ3MucG9wKCdyZWN1cnNpdmUnLCBUcnVlKQogICAgICAgIHN1cGVyKERpcmVjdG9yeUxvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHBhdGggPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdOb3QgYSBkaXJlY3Rvcnk6ICVyJyAlIHBhdGgpCiAgICAgICAgc2VsZi5iYXNlX2RpciA9IHBhdGgKCiAgICBkZWYgc2hvdWxkX2luY2x1ZGUoc2VsZiwgZmlsZW5hbWUsIHBhcmVudCk6CiAgICAgICAgIiIiCiAgICAgICAgU2hvdWxkIGEgZmlsZW5hbWUgYmUgY29uc2lkZXJlZCBhcyBhIGNhbmRpZGF0ZSBmb3IgYSBkaXN0cmlidXRpb24KICAgICAgICBhcmNoaXZlPyBBcyB3ZWxsIGFzIHRoZSBmaWxlbmFtZSwgdGhlIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBpdAogICAgICAgIGlzIHByb3ZpZGVkLCB0aG91Z2ggbm90IHVzZWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmVuZHN3aXRoKHNlbGYuZG93bmxvYWRhYmxlX2V4dGVuc2lvbnMpCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzZWxmLmJhc2VfZGlyKToKICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaWYgc2VsZi5zaG91bGRfaW5jbHVkZShmbiwgcm9vdCk6CiAgICAgICAgICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4ocm9vdCwgZm4pCiAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsdW5wYXJzZSgoJ2ZpbGUnLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTJ1cmwob3MucGF0aC5hYnNwYXRoKGZuKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsICcnLCAnJykpCiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHNlbGYuY29udmVydF91cmxfdG9fZG93bmxvYWRfaW5mbyh1cmwsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgaW5mbzoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX3ZlcnNpb25fZGF0YShyZXN1bHQsIGluZm8pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlY3Vyc2l2ZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzZWxmLmJhc2VfZGlyKToKICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaWYgc2VsZi5zaG91bGRfaW5jbHVkZShmbiwgcm9vdCk6CiAgICAgICAgICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4ocm9vdCwgZm4pCiAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsdW5wYXJzZSgoJ2ZpbGUnLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTJ1cmwob3MucGF0aC5hYnNwYXRoKGZuKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsICcnLCAnJykpCiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHNlbGYuY29udmVydF91cmxfdG9fZG93bmxvYWRfaW5mbyh1cmwsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgaWYgaW5mbzoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChpbmZvWyduYW1lJ10pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlY3Vyc2l2ZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKY2xhc3MgSlNPTkxvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgbG9jYXRvciB1c2VzIHNwZWNpYWwgZXh0ZW5kZWQgbWV0YWRhdGEgKG5vdCBhdmFpbGFibGUgb24gUHlQSSkgYW5kIGlzCiAgICB0aGUgYmFzaXMgb2YgcGVyZm9ybWFudCBkZXBlbmRlbmN5IHJlc29sdXRpb24gaW4gZGlzdGxpYi4gT3RoZXIgbG9jYXRvcnMKICAgIHJlcXVpcmUgYXJjaGl2ZSBkb3dubG9hZHMgYmVmb3JlIGRlcGVuZGVuY2llcyBjYW4gYmUgZGV0ZXJtaW5lZCEgQXMgeW91CiAgICBtaWdodCBpbWFnaW5lLCB0aGF0IGNhbiBiZSBzbG93LgogICAgIiIiCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ05vdCBhdmFpbGFibGUgZnJvbSB0aGlzIGxvY2F0b3InKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgZGF0YSA9IGdldF9wcm9qZWN0X2RhdGEobmFtZSkKICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICBmb3IgaW5mbyBpbiBkYXRhLmdldCgnZmlsZXMnLCBbXSk6CiAgICAgICAgICAgICAgICBpZiBpbmZvWydwdHlwZSddICE9ICdzZGlzdCcgb3IgaW5mb1sncHl2ZXJzaW9uJ10gIT0gJ3NvdXJjZSc6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICMgV2UgZG9uJ3Qgc3RvcmUgc3VtbWFyeSBpbiBwcm9qZWN0IG1ldGFkYXRhIGFzIGl0IG1ha2VzCiAgICAgICAgICAgICAgICAjIHRoZSBkYXRhIGJpZ2dlciBmb3Igbm8gYmVuZWZpdCBkdXJpbmcgZGVwZW5kZW5jeQogICAgICAgICAgICAgICAgIyByZXNvbHV0aW9uCiAgICAgICAgICAgICAgICBkaXN0ID0gbWFrZV9kaXN0KGRhdGFbJ25hbWUnXSwgaW5mb1sndmVyc2lvbiddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5PWRhdGEuZ2V0KCdzdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGxhY2Vob2xkZXIgZm9yIHN1bW1hcnknKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lPXNlbGYuc2NoZW1lKQogICAgICAgICAgICAgICAgbWQgPSBkaXN0Lm1ldGFkYXRhCiAgICAgICAgICAgICAgICBtZC5zb3VyY2VfdXJsID0gaW5mb1sndXJsJ10KICAgICAgICAgICAgICAgICMgVE9ETyBTSEEyNTYgZGlnZXN0CiAgICAgICAgICAgICAgICBpZiAnZGlnZXN0JyBpbiBpbmZvIGFuZCBpbmZvWydkaWdlc3QnXToKICAgICAgICAgICAgICAgICAgICBkaXN0LmRpZ2VzdCA9ICgnbWQ1JywgaW5mb1snZGlnZXN0J10pCiAgICAgICAgICAgICAgICBtZC5kZXBlbmRlbmNpZXMgPSBpbmZvLmdldCgncmVxdWlyZW1lbnRzJywge30pCiAgICAgICAgICAgICAgICBkaXN0LmV4cG9ydHMgPSBpbmZvLmdldCgnZXhwb3J0cycsIHt9KQogICAgICAgICAgICAgICAgcmVzdWx0W2Rpc3QudmVyc2lvbl0gPSBkaXN0CiAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KGRpc3QudmVyc2lvbiwgc2V0KCkpLmFkZChpbmZvWyd1cmwnXSkKICAgICAgICByZXR1cm4gcmVzdWx0CgpjbGFzcyBEaXN0UGF0aExvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgbG9jYXRvciBmaW5kcyBpbnN0YWxsZWQgZGlzdHJpYnV0aW9ucyBpbiBhIHBhdGguIEl0IGNhbiBiZSB1c2VmdWwgZm9yCiAgICBhZGRpbmcgdG8gYW4gOmNsYXNzOmBBZ2dyZWdhdGluZ0xvY2F0b3JgLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdHBhdGgsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gZGlzdHBhdGg6IEEgOmNsYXNzOmBEaXN0cmlidXRpb25QYXRoYCBpbnN0YW5jZSB0byBzZWFyY2guCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoRGlzdFBhdGhMb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkaXN0cGF0aCwgRGlzdHJpYnV0aW9uUGF0aCkKICAgICAgICBzZWxmLmRpc3RwYXRoID0gZGlzdHBhdGgKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIGRpc3QgPSBzZWxmLmRpc3RwYXRoLmdldF9kaXN0cmlidXRpb24obmFtZSkKICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgIGRpc3QudmVyc2lvbjogZGlzdCwKICAgICAgICAgICAgICAgICd1cmxzJzoge2Rpc3QudmVyc2lvbjogc2V0KFtkaXN0LnNvdXJjZV91cmxdKX0sCiAgICAgICAgICAgICAgICAnZGlnZXN0cyc6IHtkaXN0LnZlcnNpb246IHNldChbTm9uZV0pfQogICAgICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIEFnZ3JlZ2F0aW5nTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBjbGFzcyBhbGxvd3MgeW91IHRvIGNoYWluIGFuZC9vciBtZXJnZSBhIGxpc3Qgb2YgbG9jYXRvcnMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqbG9jYXRvcnMsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gbG9jYXRvcnM6IFRoZSBsaXN0IG9mIGxvY2F0b3JzIHRvIHNlYXJjaC4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBQYXNzZWQgdG8gdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGZvcjoKICAgICAgICAgICAgICAgICAgICAgICAqIG1lcmdlIC0gaWYgRmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaCBmcm9tIGFueSBvZiB0aGUgbG9jYXRvcnMgaXMgcmV0dXJuZWQuIElmIFRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0cyBmcm9tIGFsbCBsb2NhdG9ycyBhcmUgbWVyZ2VkICh0aGlzIGNhbiBiZQogICAgICAgICAgICAgICAgICAgICAgICAgc2xvdykuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5tZXJnZSA9IGt3YXJncy5wb3AoJ21lcmdlJywgRmFsc2UpCiAgICAgICAgc2VsZi5sb2NhdG9ycyA9IGxvY2F0b3JzCiAgICAgICAgc3VwZXIoQWdncmVnYXRpbmdMb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKCiAgICBkZWYgY2xlYXJfY2FjaGUoc2VsZik6CiAgICAgICAgc3VwZXIoQWdncmVnYXRpbmdMb2NhdG9yLCBzZWxmKS5jbGVhcl9jYWNoZSgpCiAgICAgICAgZm9yIGxvY2F0b3IgaW4gc2VsZi5sb2NhdG9yczoKICAgICAgICAgICAgbG9jYXRvci5jbGVhcl9jYWNoZSgpCgogICAgZGVmIF9zZXRfc2NoZW1lKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9zY2hlbWUgPSB2YWx1ZQogICAgICAgIGZvciBsb2NhdG9yIGluIHNlbGYubG9jYXRvcnM6CiAgICAgICAgICAgIGxvY2F0b3Iuc2NoZW1lID0gdmFsdWUKCiAgICBzY2hlbWUgPSBwcm9wZXJ0eShMb2NhdG9yLnNjaGVtZS5mZ2V0LCBfc2V0X3NjaGVtZSkKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgZm9yIGxvY2F0b3IgaW4gc2VsZi5sb2NhdG9yczoKICAgICAgICAgICAgZCA9IGxvY2F0b3IuZ2V0X3Byb2plY3QobmFtZSkKICAgICAgICAgICAgaWYgZDoKICAgICAgICAgICAgICAgIGlmIHNlbGYubWVyZ2U6CiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSByZXN1bHQuZ2V0KCd1cmxzJywge30pCiAgICAgICAgICAgICAgICAgICAgZGlnZXN0cyA9IHJlc3VsdC5nZXQoJ2RpZ2VzdHMnLCB7fSkKICAgICAgICAgICAgICAgICAgICAjIG5leHQgbGluZSBjb3VsZCBvdmVyd3JpdGUgcmVzdWx0Wyd1cmxzJ10sIHJlc3VsdFsnZGlnZXN0cyddCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnVwZGF0ZShkKQogICAgICAgICAgICAgICAgICAgIGRmID0gcmVzdWx0LmdldCgndXJscycpCiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZXMgYW5kIGRmOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBmaWxlcy5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgayBpbiBkZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZltrXSB8PSB2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmW2tdID0gdgogICAgICAgICAgICAgICAgICAgIGRkID0gcmVzdWx0LmdldCgnZGlnZXN0cycpCiAgICAgICAgICAgICAgICAgICAgaWYgZGlnZXN0cyBhbmQgZGQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGRkLnVwZGF0ZShkaWdlc3RzKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIFNlZSBpc3N1ZSAjMTguIElmIGFueSBkaXN0cyBhcmUgZm91bmQgYW5kIHdlJ3JlIGxvb2tpbmcKICAgICAgICAgICAgICAgICAgICAjIGZvciBzcGVjaWZpYyBjb25zdHJhaW50cywgd2Ugb25seSByZXR1cm4gc29tZXRoaW5nIGlmCiAgICAgICAgICAgICAgICAgICAgIyBhIG1hdGNoIGlzIGZvdW5kLiBGb3IgZXhhbXBsZSwgaWYgYSBEaXJlY3RvcnlMb2NhdG9yCiAgICAgICAgICAgICAgICAgICAgIyByZXR1cm5zIGp1c3QgZm9vICgxLjApIHdoaWxlIHdlJ3JlIGxvb2tpbmcgZm9yCiAgICAgICAgICAgICAgICAgICAgIyBmb28gKD49IDIuMCksIHdlJ2xsIHByZXRlbmQgdGhlcmUgd2FzIG5vdGhpbmcgdGhlcmUgc28KICAgICAgICAgICAgICAgICAgICAjIHRoYXQgc3Vic2VxdWVudCBsb2NhdG9ycyBjYW4gYmUgcXVlcmllZC4gT3RoZXJ3aXNlIHdlCiAgICAgICAgICAgICAgICAgICAgIyB3b3VsZCBqdXN0IHJldHVybiBmb28gKDEuMCkgd2hpY2ggd291bGQgdGhlbiBsZWFkIHRvIGEKICAgICAgICAgICAgICAgICAgICAjIGZhaWx1cmUgdG8gZmluZCBmb28gKD49IDIuMCksIGJlY2F1c2Ugb3RoZXIgbG9jYXRvcnMKICAgICAgICAgICAgICAgICAgICAjIHdlcmVuJ3Qgc2VhcmNoZWQuIE5vdGUgdGhhdCB0aGlzIG9ubHkgbWF0dGVycyB3aGVuCiAgICAgICAgICAgICAgICAgICAgIyBtZXJnZT1GYWxzZS4KICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm1hdGNoZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5tYXRjaGVyLm1hdGNoKGspOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgaWYgZm91bmQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGQKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIGZvciBsb2NhdG9yIGluIHNlbGYubG9jYXRvcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBsb2NhdG9yLmdldF9kaXN0cmlidXRpb25fbmFtZXMoKQogICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKIyBXZSB1c2UgYSBsZWdhY3kgc2NoZW1lIHNpbXBseSBiZWNhdXNlIG1vc3Qgb2YgdGhlIGRpc3RzIG9uIFB5UEkgdXNlIGxlZ2FjeQojIHZlcnNpb25zIHdoaWNoIGRvbid0IGNvbmZvcm0gdG8gUEVQIDQyNiAvIFBFUCA0NDAuCmRlZmF1bHRfbG9jYXRvciA9IEFnZ3JlZ2F0aW5nTG9jYXRvcigKICAgICAgICAgICAgICAgICAgICBKU09OTG9jYXRvcigpLAogICAgICAgICAgICAgICAgICAgIFNpbXBsZVNjcmFwaW5nTG9jYXRvcignaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvc2ltcGxlLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9My4wKSwKICAgICAgICAgICAgICAgICAgICBzY2hlbWU9J2xlZ2FjeScpCgpsb2NhdGUgPSBkZWZhdWx0X2xvY2F0b3IubG9jYXRlCgpOQU1FX1ZFUlNJT05fUkUgPSByZS5jb21waWxlKHInKD9QPG5hbWU+W1x3LV0rKVxzKicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1woXHMqKD09XHMqKT8oP1A8dmVyPlteKV0rKVwpJCcpCgpjbGFzcyBEZXBlbmRlbmN5RmluZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIExvY2F0ZSBkZXBlbmRlbmNpZXMgZm9yIGRpc3RyaWJ1dGlvbnMuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYXRvcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLCB1c2luZyB0aGUgc3BlY2lmaWVkIGxvY2F0b3IKICAgICAgICB0byBsb2NhdGUgZGlzdHJpYnV0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmxvY2F0b3IgPSBsb2NhdG9yIG9yIGRlZmF1bHRfbG9jYXRvcgogICAgICAgIHNlbGYuc2NoZW1lID0gZ2V0X3NjaGVtZShzZWxmLmxvY2F0b3Iuc2NoZW1lKQoKICAgIGRlZiBhZGRfZGlzdHJpYnV0aW9uKHNlbGYsIGRpc3QpOgogICAgICAgICIiIgogICAgICAgIEFkZCBhIGRpc3RyaWJ1dGlvbiB0byB0aGUgZmluZGVyLiBUaGlzIHdpbGwgdXBkYXRlIGludGVybmFsIGluZm9ybWF0aW9uCiAgICAgICAgYWJvdXQgd2hvIHByb3ZpZGVzIHdoYXQuCiAgICAgICAgOnBhcmFtIGRpc3Q6IFRoZSBkaXN0cmlidXRpb24gdG8gYWRkLgogICAgICAgICIiIgogICAgICAgIGxvZ2dlci5kZWJ1ZygnYWRkaW5nIGRpc3RyaWJ1dGlvbiAlcycsIGRpc3QpCiAgICAgICAgbmFtZSA9IGRpc3Qua2V5CiAgICAgICAgc2VsZi5kaXN0c19ieV9uYW1lW25hbWVdID0gZGlzdAogICAgICAgIHNlbGYuZGlzdHNbKG5hbWUsIGRpc3QudmVyc2lvbildID0gZGlzdAogICAgICAgIGZvciBwIGluIGRpc3QucHJvdmlkZXM6CiAgICAgICAgICAgIG5hbWUsIHZlcnNpb24gPSBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQWRkIHRvIHByb3ZpZGVkOiAlcywgJXMsICVzJywgbmFtZSwgdmVyc2lvbiwgZGlzdCkKICAgICAgICAgICAgc2VsZi5wcm92aWRlZC5zZXRkZWZhdWx0KG5hbWUsIHNldCgpKS5hZGQoKHZlcnNpb24sIGRpc3QpKQoKICAgIGRlZiByZW1vdmVfZGlzdHJpYnV0aW9uKHNlbGYsIGRpc3QpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSBmaW5kZXIuIFRoaXMgd2lsbCB1cGRhdGUgaW50ZXJuYWwKICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB3aG8gcHJvdmlkZXMgd2hhdC4KICAgICAgICA6cGFyYW0gZGlzdDogVGhlIGRpc3RyaWJ1dGlvbiB0byByZW1vdmUuCiAgICAgICAgIiIiCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdyZW1vdmluZyBkaXN0cmlidXRpb24gJXMnLCBkaXN0KQogICAgICAgIG5hbWUgPSBkaXN0LmtleQogICAgICAgIGRlbCBzZWxmLmRpc3RzX2J5X25hbWVbbmFtZV0KICAgICAgICBkZWwgc2VsZi5kaXN0c1sobmFtZSwgZGlzdC52ZXJzaW9uKV0KICAgICAgICBmb3IgcCBpbiBkaXN0LnByb3ZpZGVzOgogICAgICAgICAgICBuYW1lLCB2ZXJzaW9uID0gcGFyc2VfbmFtZV9hbmRfdmVyc2lvbihwKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92ZSBmcm9tIHByb3ZpZGVkOiAlcywgJXMsICVzJywgbmFtZSwgdmVyc2lvbiwgZGlzdCkKICAgICAgICAgICAgcyA9IHNlbGYucHJvdmlkZWRbbmFtZV0KICAgICAgICAgICAgcy5yZW1vdmUoKHZlcnNpb24sIGRpc3QpKQogICAgICAgICAgICBpZiBub3QgczoKICAgICAgICAgICAgICAgIGRlbCBzZWxmLnByb3ZpZGVkW25hbWVdCgogICAgZGVmIGdldF9tYXRjaGVyKHNlbGYsIHJlcXQpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIHZlcnNpb24gbWF0Y2hlciBmb3IgYSByZXF1aXJlbWVudC4KICAgICAgICA6cGFyYW0gcmVxdDogVGhlIHJlcXVpcmVtZW50CiAgICAgICAgOnR5cGUgcmVxdDogc3RyCiAgICAgICAgOnJldHVybjogQSB2ZXJzaW9uIG1hdGNoZXIgKGFuIGluc3RhbmNlIG9mCiAgICAgICAgICAgICAgICAgOmNsYXNzOmBkaXN0bGliLnZlcnNpb24uTWF0Y2hlcmApLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgbWF0Y2hlciA9IHNlbGYuc2NoZW1lLm1hdGNoZXIocmVxdCkKICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgIyBYWFggY29tcGF0LW1vZGUgaWYgY2Fubm90IHJlYWQgdGhlIHZlcnNpb24KICAgICAgICAgICAgbmFtZSA9IHJlcXQuc3BsaXQoKVswXQogICAgICAgICAgICBtYXRjaGVyID0gc2VsZi5zY2hlbWUubWF0Y2hlcihuYW1lKQogICAgICAgIHJldHVybiBtYXRjaGVyCgogICAgZGVmIGZpbmRfcHJvdmlkZXJzKHNlbGYsIHJlcXQpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgdGhlIGRpc3RyaWJ1dGlvbnMgd2hpY2ggY2FuIGZ1bGZpbGwgYSByZXF1aXJlbWVudC4KCiAgICAgICAgOnBhcmFtIHJlcXQ6IFRoZSByZXF1aXJlbWVudC4KICAgICAgICAgOnR5cGUgcmVxdDogc3RyCiAgICAgICAgOnJldHVybjogQSBzZXQgb2YgZGlzdHJpYnV0aW9uIHdoaWNoIGNhbiBmdWxmaWxsIHRoZSByZXF1aXJlbWVudC4KICAgICAgICAiIiIKICAgICAgICBtYXRjaGVyID0gc2VsZi5nZXRfbWF0Y2hlcihyZXF0KQogICAgICAgIG5hbWUgPSBtYXRjaGVyLmtleSAgICMgY2FzZS1pbnNlbnNpdGl2ZQogICAgICAgIHJlc3VsdCA9IHNldCgpCiAgICAgICAgcHJvdmlkZWQgPSBzZWxmLnByb3ZpZGVkCiAgICAgICAgaWYgbmFtZSBpbiBwcm92aWRlZDoKICAgICAgICAgICAgZm9yIHZlcnNpb24sIHByb3ZpZGVyIGluIHByb3ZpZGVkW25hbWVdOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hlci5tYXRjaCh2ZXJzaW9uKQogICAgICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gRmFsc2UKCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB0cnlfdG9fcmVwbGFjZShzZWxmLCBwcm92aWRlciwgb3RoZXIsIHByb2JsZW1zKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIHJlcGxhY2Ugb25lIHByb3ZpZGVyIHdpdGggYW5vdGhlci4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZAogICAgICAgIHdoZW4gcmVzb2x2aW5nIGRlcGVuZGVuY2llcyBmcm9tIG11bHRpcGxlIHNvdXJjZXMsIGUuZy4gQSByZXF1aXJlcwogICAgICAgIChCID49IDEuMCkgd2hpbGUgQyByZXF1aXJlcyAoQiA+PSAxLjEpLgoKICAgICAgICBGb3Igc3VjY2Vzc2Z1bCByZXBsYWNlbWVudCwgYGBwcm92aWRlcmBgIG11c3QgbWVldCBhbGwgdGhlIHJlcXVpcmVtZW50cwogICAgICAgIHdoaWNoIGBgb3RoZXJgYCBmdWxmaWxscy4KCiAgICAgICAgOnBhcmFtIHByb3ZpZGVyOiBUaGUgcHJvdmlkZXIgd2UgYXJlIHRyeWluZyB0byByZXBsYWNlIHdpdGguCiAgICAgICAgOnBhcmFtIG90aGVyOiBUaGUgcHJvdmlkZXIgd2UncmUgdHJ5aW5nIHRvIHJlcGxhY2UuCiAgICAgICAgOnBhcmFtIHByb2JsZW1zOiBJZiBGYWxzZSBpcyByZXR1cm5lZCwgdGhpcyB3aWxsIGNvbnRhaW4gd2hhdAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbXMgcHJldmVudGVkIHJlcGxhY2VtZW50LiBUaGlzIGlzIGN1cnJlbnRseQogICAgICAgICAgICAgICAgICAgICAgICAgYSB0dXBsZSBvZiB0aGUgbGl0ZXJhbCBzdHJpbmcgJ2NhbnRyZXBsYWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgIGBgcHJvdmlkZXJgYCwgYGBvdGhlcmBgICBhbmQgdGhlIHNldCBvZiByZXF1aXJlbWVudHMKICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYGBwcm92aWRlcmBgIGNvdWxkbid0IGZ1bGZpbGwuCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiB3ZSBjYW4gcmVwbGFjZSBgYG90aGVyYGAgd2l0aCBgYHByb3ZpZGVyYGAsIGVsc2UKICAgICAgICAgICAgICAgICBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBybGlzdCA9IHNlbGYucmVxdHNbb3RoZXJdCiAgICAgICAgdW5tYXRjaGVkID0gc2V0KCkKICAgICAgICBmb3IgcyBpbiBybGlzdDoKICAgICAgICAgICAgbWF0Y2hlciA9IHNlbGYuZ2V0X21hdGNoZXIocykKICAgICAgICAgICAgaWYgbm90IG1hdGNoZXIubWF0Y2gocHJvdmlkZXIudmVyc2lvbik6CiAgICAgICAgICAgICAgICB1bm1hdGNoZWQuYWRkKHMpCiAgICAgICAgaWYgdW5tYXRjaGVkOgogICAgICAgICAgICAjIGNhbid0IHJlcGxhY2Ugb3RoZXIgd2l0aCBwcm92aWRlcgogICAgICAgICAgICBwcm9ibGVtcy5hZGQoKCdjYW50cmVwbGFjZScsIHByb3ZpZGVyLCBvdGhlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQodW5tYXRjaGVkKSkpCiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBjYW4gcmVwbGFjZSBvdGhlciB3aXRoIHByb3ZpZGVyCiAgICAgICAgICAgIHNlbGYucmVtb3ZlX2Rpc3RyaWJ1dGlvbihvdGhlcikKICAgICAgICAgICAgZGVsIHNlbGYucmVxdHNbb3RoZXJdCiAgICAgICAgICAgIGZvciBzIGluIHJsaXN0OgogICAgICAgICAgICAgICAgc2VsZi5yZXF0cy5zZXRkZWZhdWx0KHByb3ZpZGVyLCBzZXQoKSkuYWRkKHMpCiAgICAgICAgICAgIHNlbGYuYWRkX2Rpc3RyaWJ1dGlvbihwcm92aWRlcikKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZmluZChzZWxmLCByZXF1aXJlbWVudCwgbWV0YV9leHRyYXM9Tm9uZSwgcHJlcmVsZWFzZXM9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgYSBkaXN0cmlidXRpb24gYW5kIGFsbCBkaXN0cmlidXRpb25zIGl0IGRlcGVuZHMgb24uCgogICAgICAgIDpwYXJhbSByZXF1aXJlbWVudDogVGhlIHJlcXVpcmVtZW50IHNwZWNpZnlpbmcgdGhlIGRpc3RyaWJ1dGlvbiB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZCwgb3IgYSBEaXN0cmlidXRpb24gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIG1ldGFfZXh0cmFzOiBBIGxpc3Qgb2YgbWV0YSBleHRyYXMgc3VjaCBhcyA6dGVzdDosIDpidWlsZDogYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBvbi4KICAgICAgICA6cGFyYW0gcHJlcmVsZWFzZXM6IElmIGBgVHJ1ZWBgLCBhbGxvdyBwcmUtcmVsZWFzZSB2ZXJzaW9ucyB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgLSBvdGhlcndpc2UsIGRvbid0IHJldHVybiBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHRoZXkncmUgYWxsIHRoYXQncyBhdmFpbGFibGUuCgogICAgICAgIFJldHVybiBhIHNldCBvZiA6Y2xhc3M6YERpc3RyaWJ1dGlvbmAgaW5zdGFuY2VzIGFuZCBhIHNldCBvZgogICAgICAgIHByb2JsZW1zLgoKICAgICAgICBUaGUgZGlzdHJpYnV0aW9ucyByZXR1cm5lZCBzaG91bGQgYmUgc3VjaCB0aGF0IHRoZXkgaGF2ZSB0aGUKICAgICAgICA6YXR0cjpgcmVxdWlyZWRgIGF0dHJpYnV0ZSBzZXQgdG8gYGBUcnVlYGAgaWYgdGhleSB3ZXJlCiAgICAgICAgZnJvbSB0aGUgYGByZXF1aXJlbWVudGBgIHBhc3NlZCB0byBgYGZpbmQoKWBgLCBhbmQgdGhleSBoYXZlIHRoZQogICAgICAgIDphdHRyOmBidWlsZF90aW1lX2RlcGVuZGVuY3lgIGF0dHJpYnV0ZSBzZXQgdG8gYGBUcnVlYGAgdW5sZXNzIHRoZXkKICAgICAgICBhcmUgcG9zdC1pbnN0YWxsYXRpb24gZGVwZW5kZW5jaWVzIG9mIHRoZSBgYHJlcXVpcmVtZW50YGAuCgogICAgICAgIFRoZSBwcm9ibGVtcyBzaG91bGQgYmUgYSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBzdHJpbmcKICAgICAgICBgYCd1bnNhdGlzZmllZCdgYCBhbmQgdGhlIHJlcXVpcmVtZW50IHdoaWNoIGNvdWxkbid0IGJlIHNhdGlzZmllZAogICAgICAgIGJ5IGFueSBkaXN0cmlidXRpb24ga25vd24gdG8gdGhlIGxvY2F0b3IuCiAgICAgICAgIiIiCgogICAgICAgIHNlbGYucHJvdmlkZWQgPSB7fQogICAgICAgIHNlbGYuZGlzdHMgPSB7fQogICAgICAgIHNlbGYuZGlzdHNfYnlfbmFtZSA9IHt9CiAgICAgICAgc2VsZi5yZXF0cyA9IHt9CgogICAgICAgIG1ldGFfZXh0cmFzID0gc2V0KG1ldGFfZXh0cmFzIG9yIFtdKQogICAgICAgIGlmICc6KjonIGluIG1ldGFfZXh0cmFzOgogICAgICAgICAgICBtZXRhX2V4dHJhcy5yZW1vdmUoJzoqOicpCiAgICAgICAgICAgICMgOm1ldGE6IGFuZCA6cnVuOiBhcmUgaW1wbGljaXRseSBpbmNsdWRlZAogICAgICAgICAgICBtZXRhX2V4dHJhcyB8PSBzZXQoWyc6dGVzdDonLCAnOmJ1aWxkOicsICc6ZGV2OiddKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHJlcXVpcmVtZW50LCBEaXN0cmlidXRpb24pOgogICAgICAgICAgICBkaXN0ID0gb2Rpc3QgPSByZXF1aXJlbWVudAogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ3Bhc3NlZCAlcyBhcyByZXF1aXJlbWVudCcsIG9kaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpc3QgPSBvZGlzdCA9IHNlbGYubG9jYXRvci5sb2NhdGUocmVxdWlyZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ1VuYWJsZSB0byBsb2NhdGUgJXInICUgcmVxdWlyZW1lbnQpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnbG9jYXRlZCAlcycsIG9kaXN0KQogICAgICAgIGRpc3QucmVxdWVzdGVkID0gVHJ1ZQogICAgICAgIHByb2JsZW1zID0gc2V0KCkKICAgICAgICB0b2RvID0gc2V0KFtkaXN0XSkKICAgICAgICBpbnN0YWxsX2Rpc3RzID0gc2V0KFtvZGlzdF0pCiAgICAgICAgd2hpbGUgdG9kbzoKICAgICAgICAgICAgZGlzdCA9IHRvZG8ucG9wKCkKICAgICAgICAgICAgbmFtZSA9IGRpc3Qua2V5ICAgICAjIGNhc2UtaW5zZW5zaXRpdmUKICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5kaXN0c19ieV9uYW1lOgogICAgICAgICAgICAgICAgc2VsZi5hZGRfZGlzdHJpYnV0aW9uKGRpc3QpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuZGlzdHNfYnlfbmFtZVtuYW1lXQogICAgICAgICAgICAgICAgaWYgb3RoZXIgIT0gZGlzdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyeV90b19yZXBsYWNlKGRpc3QsIG90aGVyLCBwcm9ibGVtcykKCiAgICAgICAgICAgIGlyZXF0cyA9IGRpc3QucnVuX3JlcXVpcmVzIHwgZGlzdC5tZXRhX3JlcXVpcmVzCiAgICAgICAgICAgIHNyZXF0cyA9IGRpc3QuYnVpbGRfcmVxdWlyZXMKICAgICAgICAgICAgZXJlcXRzID0gc2V0KCkKICAgICAgICAgICAgaWYgZGlzdCBpbiBpbnN0YWxsX2Rpc3RzOgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ3Rlc3QnLCAnYnVpbGQnLCAnZGV2Jyk6CiAgICAgICAgICAgICAgICAgICAgZSA9ICc6JXM6JyAlIGtleQogICAgICAgICAgICAgICAgICAgIGlmIGUgaW4gbWV0YV9leHRyYXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGVyZXF0cyB8PSBnZXRhdHRyKGRpc3QsICclc19yZXF1aXJlcycgJSBrZXkpCiAgICAgICAgICAgIGFsbF9yZXF0cyA9IGlyZXF0cyB8IHNyZXF0cyB8IGVyZXF0cwogICAgICAgICAgICBmb3IgciBpbiBhbGxfcmVxdHM6CiAgICAgICAgICAgICAgICBwcm92aWRlcnMgPSBzZWxmLmZpbmRfcHJvdmlkZXJzKHIpCiAgICAgICAgICAgICAgICBpZiBub3QgcHJvdmlkZXJzOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gcHJvdmlkZXJzIGZvdW5kIGZvciAlcicsIHIpCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBzZWxmLmxvY2F0b3IubG9jYXRlKHIsIHByZXJlbGVhc2VzPXByZXJlbGVhc2VzKQogICAgICAgICAgICAgICAgICAgICMgSWYgbm8gcHJvdmlkZXIgaXMgZm91bmQgYW5kIHdlIGRpZG4ndCBjb25zaWRlcgogICAgICAgICAgICAgICAgICAgICMgcHJlcmVsZWFzZXMsIGNvbnNpZGVyIHRoZW0gbm93LgogICAgICAgICAgICAgICAgICAgIGlmIHByb3ZpZGVyIGlzIE5vbmUgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBzZWxmLmxvY2F0b3IubG9jYXRlKHIsIHByZXJlbGVhc2VzPVRydWUpCiAgICAgICAgICAgICAgICAgICAgaWYgcHJvdmlkZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYW5ub3Qgc2F0aXNmeSAlcicsIHIpCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW1zLmFkZCgoJ3Vuc2F0aXNmaWVkJywgcikpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbiwgdiA9IHByb3ZpZGVyLmtleSwgcHJvdmlkZXIudmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobiwgdikgbm90IGluIHNlbGYuZGlzdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RvLmFkZChwcm92aWRlcikKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmFkZChwcm92aWRlcikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgciBpbiBpcmVxdHMgYW5kIGRpc3QgaW4gaW5zdGFsbF9kaXN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfZGlzdHMuYWRkKHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBZGRpbmcgJXMgdG8gaW5zdGFsbF9kaXN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubmFtZV9hbmRfdmVyc2lvbikKICAgICAgICAgICAgICAgIGZvciBwIGluIHByb3ZpZGVyczoKICAgICAgICAgICAgICAgICAgICBuYW1lID0gcC5rZXkKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmRpc3RzX2J5X25hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdHMuc2V0ZGVmYXVsdChwLCBzZXQoKSkuYWRkKHIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmRpc3RzX2J5X25hbWVbbmFtZV0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3RoZXIgIT0gcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VlIGlmIG90aGVyIGNhbiBiZSByZXBsYWNlZCBieSBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyeV90b19yZXBsYWNlKHAsIG90aGVyLCBwcm9ibGVtcykKCiAgICAgICAgZGlzdHMgPSBzZXQoc2VsZi5kaXN0cy52YWx1ZXMoKSkKICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgZGlzdC5idWlsZF90aW1lX2RlcGVuZGVuY3kgPSBkaXN0IG5vdCBpbiBpbnN0YWxsX2Rpc3RzCiAgICAgICAgICAgIGlmIGRpc3QuYnVpbGRfdGltZV9kZXBlbmRlbmN5OgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclcyBpcyBhIGJ1aWxkLXRpbWUgZGVwZW5kZW5jeSBvbmx5LicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdC5uYW1lX2FuZF92ZXJzaW9uKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnZmluZCBkb25lIGZvciAlcycsIG9kaXN0KQogICAgICAgIHJldHVybiBkaXN0cywgcHJvYmxlbXMKUEsDBBQAAAAAAAAAIQCGl7Wb2jkAANo5AAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL21hbmlmZXN0LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiIKQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBsaXN0IG9mIGZpbGVzIGluIGEgZGlzdHJpYnV0aW9uLgoKRXF1aXZhbGVudCB0byBkaXN0dXRpbHMuZmlsZWxpc3QsIGJ1dCBmaXhlcyBzb21lIHByb2JsZW1zLgoiIiIKaW1wb3J0IGZubWF0Y2gKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3lzCgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24KZnJvbSAuY29tcGF0IGltcG9ydCBmc2RlY29kZQpmcm9tIC51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKCgpfX2FsbF9fID0gWydNYW5pZmVzdCddCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCiMgYSBcIGZvbGxvd2VkIGJ5IHNvbWUgc3BhY2VzICsgRU9MCl9DT0xMQVBTRV9QQVRURVJOID0gcmUuY29tcGlsZSgnXFxcdypcbicsIHJlLk0pCl9DT01NRU5URURfTElORSA9IHJlLmNvbXBpbGUoJyMuKj8oPz1cbil8XG4oPz0kKScsIHJlLk0gfCByZS5TKQoKIwojIER1ZSB0byB0aGUgZGlmZmVyZW50IHJlc3VsdHMgcmV0dXJuZWQgYnkgZm5tYXRjaC50cmFuc2xhdGUsIHdlIG5lZWQKIyB0byBkbyBzbGlnaHRseSBkaWZmZXJlbnQgcHJvY2Vzc2luZyBmb3IgUHl0aG9uIDIuNyBhbmQgMy4yIC4uLiB0aGlzIG5lZWRlZAojIHRvIGJlIGJyb3VnaHQgaW4gZm9yIFB5dGhvbiAzLjYgb253YXJkcy4KIwpfUFlUSE9OX1ZFUlNJT04gPSBzeXMudmVyc2lvbl9pbmZvWzoyXQoKY2xhc3MgTWFuaWZlc3Qob2JqZWN0KToKICAgICIiIkEgbGlzdCBvZiBmaWxlcyBidWlsdCBieSBvbiBleHBsb3JpbmcgdGhlIGZpbGVzeXN0ZW0gYW5kIGZpbHRlcmVkIGJ5CiAgICBhcHBseWluZyB2YXJpb3VzIHBhdHRlcm5zIHRvIHdoYXQgd2UgZmluZCB0aGVyZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBiYXNlOiBUaGUgYmFzZSBkaXJlY3RvcnkgdG8gZXhwbG9yZSB1bmRlci4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmJhc2UgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aChiYXNlIG9yIG9zLmdldGN3ZCgpKSkKICAgICAgICBzZWxmLnByZWZpeCA9IHNlbGYuYmFzZSArIG9zLnNlcAogICAgICAgIHNlbGYuYWxsZmlsZXMgPSBOb25lCiAgICAgICAgc2VsZi5maWxlcyA9IHNldCgpCgogICAgIwogICAgIyBQdWJsaWMgQVBJCiAgICAjCgogICAgZGVmIGZpbmRhbGwoc2VsZik6CiAgICAgICAgIiIiRmluZCBhbGwgZmlsZXMgdW5kZXIgdGhlIGJhc2UgYW5kIHNldCBgYGFsbGZpbGVzYGAgdG8gdGhlIGFic29sdXRlCiAgICAgICAgcGF0aG5hbWVzIG9mIGZpbGVzIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIGZyb20gc3RhdCBpbXBvcnQgU19JU1JFRywgU19JU0RJUiwgU19JU0xOSwoKICAgICAgICBzZWxmLmFsbGZpbGVzID0gYWxsZmlsZXMgPSBbXQogICAgICAgIHJvb3QgPSBzZWxmLmJhc2UKICAgICAgICBzdGFjayA9IFtyb290XQogICAgICAgIHBvcCA9IHN0YWNrLnBvcAogICAgICAgIHB1c2ggPSBzdGFjay5hcHBlbmQKCiAgICAgICAgd2hpbGUgc3RhY2s6CiAgICAgICAgICAgIHJvb3QgPSBwb3AoKQogICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIocm9vdCkKCiAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKCiAgICAgICAgICAgICAgICAjIEF2b2lkIGV4Y2VzcyBzdGF0IGNhbGxzIC0tIGp1c3Qgb25lIHdpbGwgZG8sIHRoYW5rIHlvdSEKICAgICAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQogICAgICAgICAgICAgICAgbW9kZSA9IHN0YXQuc3RfbW9kZQogICAgICAgICAgICAgICAgaWYgU19JU1JFRyhtb2RlKToKICAgICAgICAgICAgICAgICAgICBhbGxmaWxlcy5hcHBlbmQoZnNkZWNvZGUoZnVsbG5hbWUpKQogICAgICAgICAgICAgICAgZWxpZiBTX0lTRElSKG1vZGUpIGFuZCBub3QgU19JU0xOSyhtb2RlKToKICAgICAgICAgICAgICAgICAgICBwdXNoKGZ1bGxuYW1lKQoKICAgIGRlZiBhZGQoc2VsZiwgaXRlbSk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgZmlsZSB0byB0aGUgbWFuaWZlc3QuCgogICAgICAgIDpwYXJhbSBpdGVtOiBUaGUgcGF0aG5hbWUgdG8gYWRkLiBUaGlzIGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZS4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXRlbS5zdGFydHN3aXRoKHNlbGYucHJlZml4KToKICAgICAgICAgICAgaXRlbSA9IG9zLnBhdGguam9pbihzZWxmLmJhc2UsIGl0ZW0pCiAgICAgICAgc2VsZi5maWxlcy5hZGQob3MucGF0aC5ub3JtcGF0aChpdGVtKSkKCiAgICBkZWYgYWRkX21hbnkoc2VsZiwgaXRlbXMpOgogICAgICAgICIiIgogICAgICAgIEFkZCBhIGxpc3Qgb2YgZmlsZXMgdG8gdGhlIG1hbmlmZXN0LgoKICAgICAgICA6cGFyYW0gaXRlbXM6IFRoZSBwYXRobmFtZXMgdG8gYWRkLiBUaGVzZSBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgIHNlbGYuYWRkKGl0ZW0pCgogICAgZGVmIHNvcnRlZChzZWxmLCB3YW50ZGlycz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHNvcnRlZCBmaWxlcyBpbiBkaXJlY3Rvcnkgb3JkZXIKICAgICAgICAiIiIKCiAgICAgICAgZGVmIGFkZF9kaXIoZGlycywgZCk6CiAgICAgICAgICAgIGRpcnMuYWRkKGQpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnYWRkX2RpciBhZGRlZCAlcycsIGQpCiAgICAgICAgICAgIGlmIGQgIT0gc2VsZi5iYXNlOgogICAgICAgICAgICAgICAgcGFyZW50LCBfID0gb3MucGF0aC5zcGxpdChkKQogICAgICAgICAgICAgICAgYXNzZXJ0IHBhcmVudCBub3QgaW4gKCcnLCAnLycpCiAgICAgICAgICAgICAgICBhZGRfZGlyKGRpcnMsIHBhcmVudCkKCiAgICAgICAgcmVzdWx0ID0gc2V0KHNlbGYuZmlsZXMpICAgICMgbWFrZSBhIGNvcHkhCiAgICAgICAgaWYgd2FudGRpcnM6CiAgICAgICAgICAgIGRpcnMgPSBzZXQoKQogICAgICAgICAgICBmb3IgZiBpbiByZXN1bHQ6CiAgICAgICAgICAgICAgICBhZGRfZGlyKGRpcnMsIG9zLnBhdGguZGlybmFtZShmKSkKICAgICAgICAgICAgcmVzdWx0IHw9IGRpcnMKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbigqcGF0aF90dXBsZSkgZm9yIHBhdGhfdHVwbGUgaW4KICAgICAgICAgICAgICAgIHNvcnRlZChvcy5wYXRoLnNwbGl0KHBhdGgpIGZvciBwYXRoIGluIHJlc3VsdCldCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICIiIkNsZWFyIGFsbCBjb2xsZWN0ZWQgZmlsZXMuIiIiCiAgICAgICAgc2VsZi5maWxlcyA9IHNldCgpCiAgICAgICAgc2VsZi5hbGxmaWxlcyA9IFtdCgogICAgZGVmIHByb2Nlc3NfZGlyZWN0aXZlKHNlbGYsIGRpcmVjdGl2ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUHJvY2VzcyBhIGRpcmVjdGl2ZSB3aGljaCBlaXRoZXIgYWRkcyBzb21lIGZpbGVzIGZyb20gYGBhbGxmaWxlc2BgIHRvCiAgICAgICAgYGBmaWxlc2BgLCBvciByZW1vdmVzIHNvbWUgZmlsZXMgZnJvbSBgYGZpbGVzYGAuCgogICAgICAgIDpwYXJhbSBkaXJlY3RpdmU6IFRoZSBkaXJlY3RpdmUgdG8gcHJvY2Vzcy4gVGhpcyBzaG91bGQgYmUgaW4gYSBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSB3aXRoIGRpc3R1dGlscyBgYE1BTklGRVNULmluYGAgZmlsZXM6CgogICAgICAgICAgICAgICAgICAgICBodHRwOi8vZG9jcy5weXRob24ub3JnL2Rpc3R1dGlscy9zb3VyY2VkaXN0Lmh0bWwjY29tbWFuZHMKICAgICAgICAiIiIKICAgICAgICAjIFBhcnNlIHRoZSBsaW5lOiBzcGxpdCBpdCB1cCwgbWFrZSBzdXJlIHRoZSByaWdodCBudW1iZXIgb2Ygd29yZHMKICAgICAgICAjIGlzIHRoZXJlLCBhbmQgcmV0dXJuIHRoZSByZWxldmFudCB3b3Jkcy4gICdhY3Rpb24nIGlzIGFsd2F5cwogICAgICAgICMgZGVmaW5lZDogaXQncyB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgbGluZS4gIFdoaWNoIG9mIHRoZSBvdGhlcgogICAgICAgICMgdGhyZWUgYXJlIGRlZmluZWQgZGVwZW5kcyBvbiB0aGUgYWN0aW9uOyBpdCdsbCBiZSBlaXRoZXIKICAgICAgICAjIHBhdHRlcm5zLCAoZGlyIGFuZCBwYXR0ZXJucyksIG9yIChkaXJwYXR0ZXJuKS4KICAgICAgICBhY3Rpb24sIHBhdHRlcm5zLCB0aGVkaXIsIGRpcnBhdHRlcm4gPSBzZWxmLl9wYXJzZV9kaXJlY3RpdmUoZGlyZWN0aXZlKQoKICAgICAgICAjIE9LLCBub3cgd2Uga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgdmFsaWQgYW5kIHdlIGhhdmUgdGhlCiAgICAgICAgIyByaWdodCBudW1iZXIgb2Ygd29yZHMgb24gdGhlIGxpbmUgZm9yIHRoYXQgYWN0aW9uIC0tIHNvIHdlCiAgICAgICAgIyBjYW4gcHJvY2VlZCB3aXRoIG1pbmltYWwgZXJyb3ItY2hlY2tpbmcuCiAgICAgICAgaWYgYWN0aW9uID09ICdpbmNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5faW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj1UcnVlKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJXInLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZXhjbHVkZSc6CiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLl9leGNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPVRydWUpCiAgICAgICAgICAgICAgICAjaWYgbm90IGZvdW5kOgogICAgICAgICAgICAgICAgIyAgICBsb2dnZXIud2FybmluZygnbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyAnCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICdmb3VuZCBtYXRjaGluZyAlcicsIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtaW5jbHVkZSc6CiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2luY2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3I9RmFsc2UpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FueXdoZXJlIGluIGRpc3RyaWJ1dGlvbicsIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtZXhjbHVkZSc6CiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLl9leGNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPUZhbHNlKQogICAgICAgICAgICAgICAgI2lmIG5vdCBmb3VuZDoKICAgICAgICAgICAgICAgICMgICAgbG9nZ2VyLndhcm5pbmcoJ25vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgJwogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAnbWF0Y2hpbmcgJXIgZm91bmQgYW55d2hlcmUgaW4gJwogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAnZGlzdHJpYnV0aW9uJywgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1pbmNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5faW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIHByZWZpeD10aGVkaXIpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVyIGRpcmVjdG9yeSAlcicsIHBhdHRlcm4sIHRoZWRpcikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1leGNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuX2V4Y2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBwcmVmaXg9dGhlZGlyKQogICAgICAgICAgICAgICAgI2lmIG5vdCBmb3VuZDoKICAgICAgICAgICAgICAgICMgICAgbG9nZ2VyLndhcm5pbmcoJ25vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgJwogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAnbWF0Y2hpbmcgJXIgZm91bmQgdW5kZXIgZGlyZWN0b3J5ICVyJywKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgdGhlZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ3JhZnQnOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5faW5jbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1kaXJwYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBkaXJlY3RvcmllcyBmb3VuZCBtYXRjaGluZyAlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncHJ1bmUnOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXhjbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1kaXJwYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBwcmV2aW91c2x5LWluY2x1ZGVkIGRpcmVjdG9yaWVzIGZvdW5kICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXRjaGluZyAlcicsIGRpcnBhdHRlcm4pCiAgICAgICAgZWxzZTogICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGFzIGl0IHNob3VsZCBiZSBjYXVnaHQgaW4KICAgICAgICAgICAgIyBfcGFyc2VfdGVtcGxhdGVfbGluZQogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJ2ludmFsaWQgYWN0aW9uICVyJyAlIGFjdGlvbikKCiAgICAjCiAgICAjIFByaXZhdGUgQVBJCiAgICAjCgogICAgZGVmIF9wYXJzZV9kaXJlY3RpdmUoc2VsZiwgZGlyZWN0aXZlKToKICAgICAgICAiIiIKICAgICAgICBWYWxpZGF0ZSBhIGRpcmVjdGl2ZS4KICAgICAgICA6cGFyYW0gZGlyZWN0aXZlOiBUaGUgZGlyZWN0aXZlIHRvIHZhbGlkYXRlLgogICAgICAgIDpyZXR1cm46IEEgdHVwbGUgb2YgYWN0aW9uLCBwYXR0ZXJucywgdGhlZGlyLCBkaXJfcGF0dGVybnMKICAgICAgICAiIiIKICAgICAgICB3b3JkcyA9IGRpcmVjdGl2ZS5zcGxpdCgpCiAgICAgICAgaWYgbGVuKHdvcmRzKSA9PSAxIGFuZCB3b3Jkc1swXSBub3QgaW4gKCdpbmNsdWRlJywgJ2V4Y2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsLWluY2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsLWV4Y2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVjdXJzaXZlLWluY2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVjdXJzaXZlLWV4Y2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3JhZnQnLCAncHJ1bmUnKToKICAgICAgICAgICAgIyBubyBhY3Rpb24gZ2l2ZW4sIGxldCdzIHVzZSB0aGUgZGVmYXVsdCAnaW5jbHVkZScKICAgICAgICAgICAgd29yZHMuaW5zZXJ0KDAsICdpbmNsdWRlJykKCiAgICAgICAgYWN0aW9uID0gd29yZHNbMF0KICAgICAgICBwYXR0ZXJucyA9IHRoZWRpciA9IGRpcl9wYXR0ZXJuID0gTm9uZQoKICAgICAgICBpZiBhY3Rpb24gaW4gKCdpbmNsdWRlJywgJ2V4Y2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbC1pbmNsdWRlJywgJ2dsb2JhbC1leGNsdWRlJyk6CiAgICAgICAgICAgIGlmIGxlbih3b3JkcykgPCAyOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAnJXIgZXhwZWN0cyA8cGF0dGVybjE+IDxwYXR0ZXJuMj4gLi4uJyAlIGFjdGlvbikKCiAgICAgICAgICAgIHBhdHRlcm5zID0gW2NvbnZlcnRfcGF0aCh3b3JkKSBmb3Igd29yZCBpbiB3b3Jkc1sxOl1dCgogICAgICAgIGVsaWYgYWN0aW9uIGluICgncmVjdXJzaXZlLWluY2x1ZGUnLCAncmVjdXJzaXZlLWV4Y2x1ZGUnKToKICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSA8IDM6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICclciBleHBlY3RzIDxkaXI+IDxwYXR0ZXJuMT4gPHBhdHRlcm4yPiAuLi4nICUgYWN0aW9uKQoKICAgICAgICAgICAgdGhlZGlyID0gY29udmVydF9wYXRoKHdvcmRzWzFdKQogICAgICAgICAgICBwYXR0ZXJucyA9IFtjb252ZXJ0X3BhdGgod29yZCkgZm9yIHdvcmQgaW4gd29yZHNbMjpdXQoKICAgICAgICBlbGlmIGFjdGlvbiBpbiAoJ2dyYWZ0JywgJ3BydW5lJyk6CiAgICAgICAgICAgIGlmIGxlbih3b3JkcykgIT0gMjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgJyVyIGV4cGVjdHMgYSBzaW5nbGUgPGRpcl9wYXR0ZXJuPicgJSBhY3Rpb24pCgogICAgICAgICAgICBkaXJfcGF0dGVybiA9IGNvbnZlcnRfcGF0aCh3b3Jkc1sxXSkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigndW5rbm93biBhY3Rpb24gJXInICUgYWN0aW9uKQoKICAgICAgICByZXR1cm4gYWN0aW9uLCBwYXR0ZXJucywgdGhlZGlyLCBkaXJfcGF0dGVybgoKICAgIGRlZiBfaW5jbHVkZV9wYXR0ZXJuKHNlbGYsIHBhdHRlcm4sIGFuY2hvcj1UcnVlLCBwcmVmaXg9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZ2V4PUZhbHNlKToKICAgICAgICAiIiJTZWxlY3Qgc3RyaW5ncyAocHJlc3VtYWJseSBmaWxlbmFtZXMpIGZyb20gJ3NlbGYuZmlsZXMnIHRoYXQKICAgICAgICBtYXRjaCAncGF0dGVybicsIGEgVW5peC1zdHlsZSB3aWxkY2FyZCAoZ2xvYikgcGF0dGVybi4KCiAgICAgICAgUGF0dGVybnMgYXJlIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyBpbXBsZW1lbnRlZCBieSB0aGUgJ2ZubWF0Y2gnCiAgICAgICAgbW9kdWxlOiAnKicgYW5kICc/JyAgbWF0Y2ggbm9uLXNwZWNpYWwgY2hhcmFjdGVycywgd2hlcmUgInNwZWNpYWwiCiAgICAgICAgaXMgcGxhdGZvcm0tZGVwZW5kZW50OiBzbGFzaCBvbiBVbml4OyBjb2xvbiwgc2xhc2gsIGFuZCBiYWNrc2xhc2ggb24KICAgICAgICBET1MvV2luZG93czsgYW5kIGNvbG9uIG9uIE1hYyBPUy4KCiAgICAgICAgSWYgJ2FuY2hvcicgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGVuIHRoZSBwYXR0ZXJuIG1hdGNoIGlzIG1vcmUKICAgICAgICBzdHJpbmdlbnQ6ICIqLnB5IiB3aWxsIG1hdGNoICJmb28ucHkiIGJ1dCBub3QgImZvby9iYXIucHkiLiAgSWYKICAgICAgICAnYW5jaG9yJyBpcyBmYWxzZSwgYm90aCBvZiB0aGVzZSB3aWxsIG1hdGNoLgoKICAgICAgICBJZiAncHJlZml4JyBpcyBzdXBwbGllZCwgdGhlbiBvbmx5IGZpbGVuYW1lcyBzdGFydGluZyB3aXRoICdwcmVmaXgnCiAgICAgICAgKGl0c2VsZiBhIHBhdHRlcm4pIGFuZCBlbmRpbmcgd2l0aCAncGF0dGVybicsIHdpdGggYW55dGhpbmcgaW4gYmV0d2VlbgogICAgICAgIHRoZW0sIHdpbGwgbWF0Y2guICAnYW5jaG9yJyBpcyBpZ25vcmVkIGluIHRoaXMgY2FzZS4KCiAgICAgICAgSWYgJ2lzX3JlZ2V4JyBpcyB0cnVlLCAnYW5jaG9yJyBhbmQgJ3ByZWZpeCcgYXJlIGlnbm9yZWQsIGFuZAogICAgICAgICdwYXR0ZXJuJyBpcyBhc3N1bWVkIHRvIGJlIGVpdGhlciBhIHN0cmluZyBjb250YWluaW5nIGEgcmVnZXggb3IgYQogICAgICAgIHJlZ2V4IG9iamVjdCAtLSBubyB0cmFuc2xhdGlvbiBpcyBkb25lLCB0aGUgcmVnZXggaXMganVzdCBjb21waWxlZAogICAgICAgIGFuZCB1c2VkIGFzLWlzLgoKICAgICAgICBTZWxlY3RlZCBzdHJpbmdzIHdpbGwgYmUgYWRkZWQgdG8gc2VsZi5maWxlcy4KCiAgICAgICAgUmV0dXJuIFRydWUgaWYgZmlsZXMgYXJlIGZvdW5kLgogICAgICAgICIiIgogICAgICAgICMgWFhYIGRvY3N0cmluZyBseWluZyBhYm91dCB3aGF0IHRoZSBzcGVjaWFsIGNoYXJzIGFyZT8KICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgcGF0dGVybl9yZSA9IHNlbGYuX3RyYW5zbGF0ZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvciwgcHJlZml4LCBpc19yZWdleCkKCiAgICAgICAgIyBkZWxheWVkIGxvYWRpbmcgb2YgYWxsZmlsZXMgbGlzdAogICAgICAgIGlmIHNlbGYuYWxsZmlsZXMgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5maW5kYWxsKCkKCiAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5hbGxmaWxlczoKICAgICAgICAgICAgaWYgcGF0dGVybl9yZS5zZWFyY2gobmFtZSk6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVzLmFkZChuYW1lKQogICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgcmV0dXJuIGZvdW5kCgogICAgZGVmIF9leGNsdWRlX3BhdHRlcm4oc2VsZiwgcGF0dGVybiwgYW5jaG9yPVRydWUsIHByZWZpeD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnZXg9RmFsc2UpOgogICAgICAgICIiIlJlbW92ZSBzdHJpbmdzIChwcmVzdW1hYmx5IGZpbGVuYW1lcykgZnJvbSAnZmlsZXMnIHRoYXQgbWF0Y2gKICAgICAgICAncGF0dGVybicuCgogICAgICAgIE90aGVyIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIGZvciAnaW5jbHVkZV9wYXR0ZXJuKCknLCBhYm92ZS4KICAgICAgICBUaGUgbGlzdCAnc2VsZi5maWxlcycgaXMgbW9kaWZpZWQgaW4gcGxhY2UuIFJldHVybiBUcnVlIGlmIGZpbGVzIGFyZQogICAgICAgIGZvdW5kLgoKICAgICAgICBUaGlzIEFQSSBpcyBwdWJsaWMgdG8gYWxsb3cgZS5nLiBleGNsdXNpb24gb2YgU0NNIHN1YmRpcnMsIGUuZy4gd2hlbgogICAgICAgIHBhY2thZ2luZyBzb3VyY2UgZGlzdHJpYnV0aW9ucwogICAgICAgICIiIgogICAgICAgIGZvdW5kID0gRmFsc2UKICAgICAgICBwYXR0ZXJuX3JlID0gc2VsZi5fdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yLCBwcmVmaXgsIGlzX3JlZ2V4KQogICAgICAgIGZvciBmIGluIGxpc3Qoc2VsZi5maWxlcyk6CiAgICAgICAgICAgIGlmIHBhdHRlcm5fcmUuc2VhcmNoKGYpOgogICAgICAgICAgICAgICAgc2VsZi5maWxlcy5yZW1vdmUoZikKICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgIHJldHVybiBmb3VuZAoKICAgIGRlZiBfdHJhbnNsYXRlX3BhdHRlcm4oc2VsZiwgcGF0dGVybiwgYW5jaG9yPVRydWUsIHByZWZpeD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdleD1GYWxzZSk6CiAgICAgICAgIiIiVHJhbnNsYXRlIGEgc2hlbGwtbGlrZSB3aWxkY2FyZCBwYXR0ZXJuIHRvIGEgY29tcGlsZWQgcmVndWxhcgogICAgICAgIGV4cHJlc3Npb24uCgogICAgICAgIFJldHVybiB0aGUgY29tcGlsZWQgcmVnZXguICBJZiAnaXNfcmVnZXgnIHRydWUsCiAgICAgICAgdGhlbiAncGF0dGVybicgaXMgZGlyZWN0bHkgY29tcGlsZWQgdG8gYSByZWdleCAoaWYgaXQncyBhIHN0cmluZykKICAgICAgICBvciBqdXN0IHJldHVybmVkIGFzLWlzIChhc3N1bWVzIGl0J3MgYSByZWdleCBvYmplY3QpLgogICAgICAgICIiIgogICAgICAgIGlmIGlzX3JlZ2V4OgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIHN0cik6CiAgICAgICAgICAgICAgICByZXR1cm4gcmUuY29tcGlsZShwYXR0ZXJuKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4KCiAgICAgICAgaWYgX1BZVEhPTl9WRVJTSU9OID4gKDMsIDIpOgogICAgICAgICAgICAjIGRpdGNoIHN0YXJ0IGFuZCBlbmQgY2hhcmFjdGVycwogICAgICAgICAgICBzdGFydCwgXywgZW5kID0gc2VsZi5fZ2xvYl90b19yZSgnXycpLnBhcnRpdGlvbignXycpCgogICAgICAgIGlmIHBhdHRlcm46CiAgICAgICAgICAgIHBhdHRlcm5fcmUgPSBzZWxmLl9nbG9iX3RvX3JlKHBhdHRlcm4pCiAgICAgICAgICAgIGlmIF9QWVRIT05fVkVSU0lPTiA+ICgzLCAyKToKICAgICAgICAgICAgICAgIGFzc2VydCBwYXR0ZXJuX3JlLnN0YXJ0c3dpdGgoc3RhcnQpIGFuZCBwYXR0ZXJuX3JlLmVuZHN3aXRoKGVuZCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXR0ZXJuX3JlID0gJycKCiAgICAgICAgYmFzZSA9IHJlLmVzY2FwZShvcy5wYXRoLmpvaW4oc2VsZi5iYXNlLCAnJykpCiAgICAgICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIGRpdGNoIGVuZCBvZiBwYXR0ZXJuIGNoYXJhY3RlcgogICAgICAgICAgICBpZiBfUFlUSE9OX1ZFUlNJT04gPD0gKDMsIDIpOgogICAgICAgICAgICAgICAgZW1wdHlfcGF0dGVybiA9IHNlbGYuX2dsb2JfdG9fcmUoJycpCiAgICAgICAgICAgICAgICBwcmVmaXhfcmUgPSBzZWxmLl9nbG9iX3RvX3JlKHByZWZpeClbOi1sZW4oZW1wdHlfcGF0dGVybildCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmVmaXhfcmUgPSBzZWxmLl9nbG9iX3RvX3JlKHByZWZpeCkKICAgICAgICAgICAgICAgIGFzc2VydCBwcmVmaXhfcmUuc3RhcnRzd2l0aChzdGFydCkgYW5kIHByZWZpeF9yZS5lbmRzd2l0aChlbmQpCiAgICAgICAgICAgICAgICBwcmVmaXhfcmUgPSBwcmVmaXhfcmVbbGVuKHN0YXJ0KTogbGVuKHByZWZpeF9yZSkgLSBsZW4oZW5kKV0KICAgICAgICAgICAgc2VwID0gb3Muc2VwCiAgICAgICAgICAgIGlmIG9zLnNlcCA9PSAnXFwnOgogICAgICAgICAgICAgICAgc2VwID0gcidcXCcKICAgICAgICAgICAgaWYgX1BZVEhPTl9WRVJTSU9OIDw9ICgzLCAyKToKICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUgPSAnXicgKyBiYXNlICsgc2VwLmpvaW4oKHByZWZpeF9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuKicgKyBwYXR0ZXJuX3JlKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUgPSBwYXR0ZXJuX3JlW2xlbihzdGFydCk6IGxlbihwYXR0ZXJuX3JlKSAtIGxlbihlbmQpXQogICAgICAgICAgICAgICAgcGF0dGVybl9yZSA9IHInJXMlcyVzJXMuKiVzJXMnICUgKHN0YXJ0LCBiYXNlLCBwcmVmaXhfcmUsIHNlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlLCBlbmQpCiAgICAgICAgZWxzZTogICMgbm8gcHJlZml4IC0tIHJlc3BlY3QgYW5jaG9yIGZsYWcKICAgICAgICAgICAgaWYgYW5jaG9yOgogICAgICAgICAgICAgICAgaWYgX1BZVEhPTl9WRVJTSU9OIDw9ICgzLCAyKToKICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlID0gJ14nICsgYmFzZSArIHBhdHRlcm5fcmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9yZSA9IHInJXMlcyVzJyAlIChzdGFydCwgYmFzZSwgcGF0dGVybl9yZVtsZW4oc3RhcnQpOl0pCgogICAgICAgIHJldHVybiByZS5jb21waWxlKHBhdHRlcm5fcmUpCgogICAgZGVmIF9nbG9iX3RvX3JlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIlRyYW5zbGF0ZSBhIHNoZWxsLWxpa2UgZ2xvYiBwYXR0ZXJuIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgoKICAgICAgICBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmVnZXguICBEaWZmZXJzIGZyb20KICAgICAgICAnZm5tYXRjaC50cmFuc2xhdGUoKScgaW4gdGhhdCAnKicgZG9lcyBub3QgbWF0Y2ggInNwZWNpYWwgY2hhcmFjdGVycyIKICAgICAgICAod2hpY2ggYXJlIHBsYXRmb3JtLXNwZWNpZmljKS4KICAgICAgICAiIiIKICAgICAgICBwYXR0ZXJuX3JlID0gZm5tYXRjaC50cmFuc2xhdGUocGF0dGVybikKCiAgICAgICAgIyAnPycgYW5kICcqJyBpbiB0aGUgZ2xvYiBwYXR0ZXJuIGJlY29tZSAnLicgYW5kICcuKicgaW4gdGhlIFJFLCB3aGljaAogICAgICAgICMgSU1ITyBpcyB3cm9uZyAtLSAnPycgYW5kICcqJyBhcmVuJ3Qgc3VwcG9zZWQgdG8gbWF0Y2ggc2xhc2ggaW4gVW5peCwKICAgICAgICAjIGFuZCBieSBleHRlbnNpb24gdGhleSBzaG91bGRuJ3QgbWF0Y2ggc3VjaCAic3BlY2lhbCBjaGFyYWN0ZXJzIiB1bmRlcgogICAgICAgICMgYW55IE9TLiAgU28gY2hhbmdlIGFsbCBub24tZXNjYXBlZCBkb3RzIGluIHRoZSBSRSB0byBtYXRjaCBhbnkKICAgICAgICAjIGNoYXJhY3RlciBleGNlcHQgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyAoY3VycmVudGx5OiBqdXN0IG9zLnNlcCkuCiAgICAgICAgc2VwID0gb3Muc2VwCiAgICAgICAgaWYgb3Muc2VwID09ICdcXCc6CiAgICAgICAgICAgICMgd2UncmUgdXNpbmcgYSByZWdleCB0byBtYW5pcHVsYXRlIGEgcmVnZXgsIHNvIHdlIG5lZWQKICAgICAgICAgICAgIyB0byBlc2NhcGUgdGhlIGJhY2tzbGFzaCB0d2ljZQogICAgICAgICAgICBzZXAgPSByJ1xcXFwnCiAgICAgICAgZXNjYXBlZCA9IHInXDFbXiVzXScgJSBzZXAKICAgICAgICBwYXR0ZXJuX3JlID0gcmUuc3ViKHInKCg/PCFcXCkoXFxcXCkqKVwuJywgZXNjYXBlZCwgcGF0dGVybl9yZSkKICAgICAgICByZXR1cm4gcGF0dGVybl9yZQpQSwMEFAAAAAAAAAAhAD0RrgKKGAAAihgAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWFya2Vycy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIlBhcnNlciBmb3IgdGhlIGVudmlyb25tZW50IG1hcmtlcnMgbWljcm8tbGFuZ3VhZ2UgZGVmaW5lZCBpbiBQRVAgMzQ1LiIiIgoKaW1wb3J0IGFzdAppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgcGxhdGZvcm0KCmZyb20gLmNvbXBhdCBpbXBvcnQgcHl0aG9uX2ltcGxlbWVudGF0aW9uLCBzdHJpbmdfdHlwZXMKZnJvbSAudXRpbCBpbXBvcnQgaW5fdmVudgoKX19hbGxfXyA9IFsnaW50ZXJwcmV0J10KCgpjbGFzcyBFdmFsdWF0b3Iob2JqZWN0KToKICAgICIiIgogICAgQSBsaW1pdGVkIGV2YWx1YXRvciBmb3IgUHl0aG9uIGV4cHJlc3Npb25zLgogICAgIiIiCgogICAgb3BlcmF0b3JzID0gewogICAgICAgICdlcSc6IGxhbWJkYSB4LCB5OiB4ID09IHksCiAgICAgICAgJ2d0JzogbGFtYmRhIHgsIHk6IHggPiB5LAogICAgICAgICdndGUnOiBsYW1iZGEgeCwgeTogeCA+PSB5LAogICAgICAgICdpbic6IGxhbWJkYSB4LCB5OiB4IGluIHksCiAgICAgICAgJ2x0JzogbGFtYmRhIHgsIHk6IHggPCB5LAogICAgICAgICdsdGUnOiBsYW1iZGEgeCwgeTogeCA8PSB5LAogICAgICAgICdub3QnOiBsYW1iZGEgeDogbm90IHgsCiAgICAgICAgJ25vdGVxJzogbGFtYmRhIHgsIHk6IHggIT0geSwKICAgICAgICAnbm90aW4nOiBsYW1iZGEgeCwgeTogeCBub3QgaW4geSwKICAgIH0KCiAgICBhbGxvd2VkX3ZhbHVlcyA9IHsKICAgICAgICAnc3lzX3BsYXRmb3JtJzogc3lzLnBsYXRmb3JtLAogICAgICAgICdweXRob25fdmVyc2lvbic6ICclcy4lcycgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKICAgICAgICAjIHBhcnNpbmcgc3lzLnBsYXRmb3JtIGlzIG5vdCByZWxpYWJsZSwgYnV0IHRoZXJlIGlzIG5vIG90aGVyCiAgICAgICAgIyB3YXkgdG8gZ2V0IGUuZy4gMi43LjIrLCBhbmQgdGhlIFBFUCBpcyBkZWZpbmVkIHdpdGggc3lzLnZlcnNpb24KICAgICAgICAncHl0aG9uX2Z1bGxfdmVyc2lvbic6IHN5cy52ZXJzaW9uLnNwbGl0KCcgJywgMSlbMF0sCiAgICAgICAgJ29zX25hbWUnOiBvcy5uYW1lLAogICAgICAgICdwbGF0Zm9ybV9pbl92ZW52Jzogc3RyKGluX3ZlbnYoKSksCiAgICAgICAgJ3BsYXRmb3JtX3JlbGVhc2UnOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgJ3BsYXRmb3JtX3ZlcnNpb24nOiBwbGF0Zm9ybS52ZXJzaW9uKCksCiAgICAgICAgJ3BsYXRmb3JtX21hY2hpbmUnOiBwbGF0Zm9ybS5tYWNoaW5lKCksCiAgICAgICAgJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbic6IHB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLAogICAgfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZXh0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBjb250ZXh0OiBJZiBzcGVjaWZpZWQsIG5hbWVzIGFyZSBsb29rZWQgdXAgaW4gdGhpcyBtYXBwaW5nLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQgb3Ige30KICAgICAgICBzZWxmLnNvdXJjZSA9IE5vbmUKCiAgICBkZWYgZ2V0X2ZyYWdtZW50KHNlbGYsIG9mZnNldCk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBwYXJ0IG9mIHRoZSBzb3VyY2Ugd2hpY2ggaXMgY2F1c2luZyBhIHByb2JsZW0uCiAgICAgICAgIiIiCiAgICAgICAgZnJhZ21lbnRfbGVuID0gMTAKICAgICAgICBzID0gJyVyJyAlIChzZWxmLnNvdXJjZVtvZmZzZXQ6b2Zmc2V0ICsgZnJhZ21lbnRfbGVuXSkKICAgICAgICBpZiBvZmZzZXQgKyBmcmFnbWVudF9sZW4gPCBsZW4oc2VsZi5zb3VyY2UpOgogICAgICAgICAgICBzICs9ICcuLi4nCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgZ2V0X2hhbmRsZXIoc2VsZiwgbm9kZV90eXBlKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSBoYW5kbGVyIGZvciB0aGUgc3BlY2lmaWVkIEFTVCBub2RlIHR5cGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgJ2RvXyVzJyAlIG5vZGVfdHlwZSwgTm9uZSkKCiAgICBkZWYgZXZhbHVhdGUoc2VsZiwgbm9kZSwgZmlsZW5hbWU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRXZhbHVhdGUgYSBzb3VyY2Ugc3RyaW5nIG9yIG5vZGUsIHVzaW5nIGBgZmlsZW5hbWVgYCB3aGVuCiAgICAgICAgZGlzcGxheWluZyBlcnJvcnMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBzZWxmLnNvdXJjZSA9IG5vZGUKICAgICAgICAgICAga3dhcmdzID0geydtb2RlJzogJ2V2YWwnfQogICAgICAgICAgICBpZiBmaWxlbmFtZToKICAgICAgICAgICAgICAgIGt3YXJnc1snZmlsZW5hbWUnXSA9IGZpbGVuYW1lCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5vZGUgPSBhc3QucGFyc2Uobm9kZSwgKiprd2FyZ3MpCiAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcyA9IHNlbGYuZ2V0X2ZyYWdtZW50KGUub2Zmc2V0KQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJ3N5bnRheCBlcnJvciAlcycgJSBzKQogICAgICAgIG5vZGVfdHlwZSA9IG5vZGUuX19jbGFzc19fLl9fbmFtZV9fLmxvd2VyKCkKICAgICAgICBoYW5kbGVyID0gc2VsZi5nZXRfaGFuZGxlcihub2RlX3R5cGUpCiAgICAgICAgaWYgaGFuZGxlciBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLnNvdXJjZSBpcyBOb25lOgogICAgICAgICAgICAgICAgcyA9ICcoc291cmNlIG5vdCBhdmFpbGFibGUpJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcyA9IHNlbGYuZ2V0X2ZyYWdtZW50KG5vZGUuY29sX29mZnNldCkKICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoImRvbid0IGtub3cgaG93IHRvIGV2YWx1YXRlICVyICVzIiAlICgKICAgICAgICAgICAgICAgIG5vZGVfdHlwZSwgcykpCiAgICAgICAgcmV0dXJuIGhhbmRsZXIobm9kZSkKCiAgICBkZWYgZ2V0X2F0dHJfa2V5KHNlbGYsIG5vZGUpOgogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5vZGUsIGFzdC5BdHRyaWJ1dGUpLCAnYXR0cmlidXRlIG5vZGUgZXhwZWN0ZWQnCiAgICAgICAgcmV0dXJuICclcy4lcycgJSAobm9kZS52YWx1ZS5pZCwgbm9kZS5hdHRyKQoKICAgIGRlZiBkb19hdHRyaWJ1dGUoc2VsZiwgbm9kZSk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZS52YWx1ZSwgYXN0Lk5hbWUpOgogICAgICAgICAgICB2YWxpZCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAga2V5ID0gc2VsZi5nZXRfYXR0cl9rZXkobm9kZSkKICAgICAgICAgICAgdmFsaWQgPSBrZXkgaW4gc2VsZi5jb250ZXh0IG9yIGtleSBpbiBzZWxmLmFsbG93ZWRfdmFsdWVzCiAgICAgICAgaWYgbm90IHZhbGlkOgogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcignaW52YWxpZCBleHByZXNzaW9uOiAlcycgJSBrZXkpCiAgICAgICAgaWYga2V5IGluIHNlbGYuY29udGV4dDoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb250ZXh0W2tleV0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmFsbG93ZWRfdmFsdWVzW2tleV0KICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGRvX2Jvb2xvcChzZWxmLCBub2RlKToKICAgICAgICByZXN1bHQgPSBzZWxmLmV2YWx1YXRlKG5vZGUudmFsdWVzWzBdKQogICAgICAgIGlzX29yID0gbm9kZS5vcC5fX2NsYXNzX18gaXMgYXN0Lk9yCiAgICAgICAgaXNfYW5kID0gbm9kZS5vcC5fX2NsYXNzX18gaXMgYXN0LkFuZAogICAgICAgIGFzc2VydCBpc19vciBvciBpc19hbmQKICAgICAgICBpZiAoaXNfYW5kIGFuZCByZXN1bHQpIG9yIChpc19vciBhbmQgbm90IHJlc3VsdCk6CiAgICAgICAgICAgIGZvciBuIGluIG5vZGUudmFsdWVzWzE6XToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZXZhbHVhdGUobikKICAgICAgICAgICAgICAgIGlmIChpc19vciBhbmQgcmVzdWx0KSBvciAoaXNfYW5kIGFuZCBub3QgcmVzdWx0KToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZG9fY29tcGFyZShzZWxmLCBub2RlKToKICAgICAgICBkZWYgc2FuaXR5X2NoZWNrKGxoc25vZGUsIHJoc25vZGUpOgogICAgICAgICAgICB2YWxpZCA9IFRydWUKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaHNub2RlLCBhc3QuU3RyKSBhbmQgaXNpbnN0YW5jZShyaHNub2RlLCBhc3QuU3RyKToKICAgICAgICAgICAgICAgIHZhbGlkID0gRmFsc2UKICAgICAgICAgICAgI2VsaWYgKGlzaW5zdGFuY2UobGhzbm9kZSwgYXN0LkF0dHJpYnV0ZSkKICAgICAgICAgICAgIyAgICAgIGFuZCBpc2luc3RhbmNlKHJoc25vZGUsIGFzdC5BdHRyaWJ1dGUpKToKICAgICAgICAgICAgIyAgICBrbGhzID0gc2VsZi5nZXRfYXR0cl9rZXkobGhzbm9kZSkKICAgICAgICAgICAgIyAgICBrcmhzID0gc2VsZi5nZXRfYXR0cl9rZXkocmhzbm9kZSkKICAgICAgICAgICAgIyAgICB2YWxpZCA9IGtsaHMgIT0ga3JocwogICAgICAgICAgICBpZiBub3QgdmFsaWQ6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5nZXRfZnJhZ21lbnQobm9kZS5jb2xfb2Zmc2V0KQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJ0ludmFsaWQgY29tcGFyaXNvbjogJXMnICUgcykKCiAgICAgICAgbGhzbm9kZSA9IG5vZGUubGVmdAogICAgICAgIGxocyA9IHNlbGYuZXZhbHVhdGUobGhzbm9kZSkKICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgZm9yIG9wLCByaHNub2RlIGluIHppcChub2RlLm9wcywgbm9kZS5jb21wYXJhdG9ycyk6CiAgICAgICAgICAgIHNhbml0eV9jaGVjayhsaHNub2RlLCByaHNub2RlKQogICAgICAgICAgICBvcCA9IG9wLl9fY2xhc3NfXy5fX25hbWVfXy5sb3dlcigpCiAgICAgICAgICAgIGlmIG9wIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCd1bnN1cHBvcnRlZCBvcGVyYXRpb246ICVyJyAlIG9wKQogICAgICAgICAgICByaHMgPSBzZWxmLmV2YWx1YXRlKHJoc25vZGUpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYub3BlcmF0b3JzW29wXShsaHMsIHJocykKICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGxocyA9IHJocwogICAgICAgICAgICBsaHNub2RlID0gcmhzbm9kZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZG9fZXhwcmVzc2lvbihzZWxmLCBub2RlKToKICAgICAgICByZXR1cm4gc2VsZi5ldmFsdWF0ZShub2RlLmJvZHkpCgogICAgZGVmIGRvX25hbWUoc2VsZiwgbm9kZSk6CiAgICAgICAgdmFsaWQgPSBGYWxzZQogICAgICAgIGlmIG5vZGUuaWQgaW4gc2VsZi5jb250ZXh0OgogICAgICAgICAgICB2YWxpZCA9IFRydWUKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb250ZXh0W25vZGUuaWRdCiAgICAgICAgZWxpZiBub2RlLmlkIGluIHNlbGYuYWxsb3dlZF92YWx1ZXM6CiAgICAgICAgICAgIHZhbGlkID0gVHJ1ZQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmFsbG93ZWRfdmFsdWVzW25vZGUuaWRdCiAgICAgICAgaWYgbm90IHZhbGlkOgogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcignaW52YWxpZCBleHByZXNzaW9uOiAlcycgJSBub2RlLmlkKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZG9fc3RyKHNlbGYsIG5vZGUpOgogICAgICAgIHJldHVybiBub2RlLnMKCgpkZWYgaW50ZXJwcmV0KG1hcmtlciwgZXhlY3V0aW9uX2NvbnRleHQ9Tm9uZSk6CiAgICAiIiIKICAgIEludGVycHJldCBhIG1hcmtlciBhbmQgcmV0dXJuIGEgcmVzdWx0IGRlcGVuZGluZyBvbiBlbnZpcm9ubWVudC4KCiAgICA6cGFyYW0gbWFya2VyOiBUaGUgbWFya2VyIHRvIGludGVycHJldC4KICAgIDp0eXBlIG1hcmtlcjogc3RyCiAgICA6cGFyYW0gZXhlY3V0aW9uX2NvbnRleHQ6IFRoZSBjb250ZXh0IHVzZWQgZm9yIG5hbWUgbG9va3VwLgogICAgOnR5cGUgZXhlY3V0aW9uX2NvbnRleHQ6IG1hcHBpbmcKICAgICIiIgogICAgcmV0dXJuIEV2YWx1YXRvcihleGVjdXRpb25fY29udGV4dCkuZXZhbHVhdGUobWFya2VyLnN0cmlwKCkpClBLAwQUAAAAAAAAACEADaZs8bGXAACxlwAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9tZXRhZGF0YS5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWV0YWRhdGEgZm9yIFB5dGhvbiBwYWNrYWdlcyBQRVBzLgoKU3VwcG9ydHMgYWxsIG1ldGFkYXRhIGZvcm1hdHMgKDEuMCwgMS4xLCAxLjIsIGFuZCAyLjAgZXhwZXJpbWVudGFsKS4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGNvZGVjcwpmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlX2Zyb21fZmlsZQppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKCgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24sIF9fdmVyc2lvbl9fCmZyb20gLmNvbXBhdCBpbXBvcnQgU3RyaW5nSU8sIHN0cmluZ190eXBlcywgdGV4dF90eXBlCmZyb20gLm1hcmtlcnMgaW1wb3J0IGludGVycHJldApmcm9tIC51dGlsIGltcG9ydCBleHRyYWN0X2J5X2tleSwgZ2V0X2V4dHJhcwpmcm9tIC52ZXJzaW9uIGltcG9ydCBnZXRfc2NoZW1lLCBQRVA0NDBfVkVSU0lPTl9SRQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgTWV0YWRhdGFNaXNzaW5nRXJyb3IoRGlzdGxpYkV4Y2VwdGlvbik6CiAgICAiIiJBIHJlcXVpcmVkIG1ldGFkYXRhIGlzIG1pc3NpbmciIiIKCgpjbGFzcyBNZXRhZGF0YUNvbmZsaWN0RXJyb3IoRGlzdGxpYkV4Y2VwdGlvbik6CiAgICAiIiJBdHRlbXB0IHRvIHJlYWQgb3Igd3JpdGUgbWV0YWRhdGEgZmllbGRzIHRoYXQgYXJlIGNvbmZsaWN0dWFsLiIiIgoKCmNsYXNzIE1ldGFkYXRhVW5yZWNvZ25pemVkVmVyc2lvbkVycm9yKERpc3RsaWJFeGNlcHRpb24pOgogICAgIiIiVW5rbm93biBtZXRhZGF0YSB2ZXJzaW9uIG51bWJlci4iIiIKCgpjbGFzcyBNZXRhZGF0YUludmFsaWRFcnJvcihEaXN0bGliRXhjZXB0aW9uKToKICAgICIiIkEgbWV0YWRhdGEgdmFsdWUgaXMgaW52YWxpZCIiIgoKIyBwdWJsaWMgQVBJIG9mIHRoaXMgbW9kdWxlCl9fYWxsX18gPSBbJ01ldGFkYXRhJywgJ1BLR19JTkZPX0VOQ09ESU5HJywgJ1BLR19JTkZPX1BSRUZFUlJFRF9WRVJTSU9OJ10KCiMgRW5jb2RpbmcgdXNlZCBmb3IgdGhlIFBLRy1JTkZPIGZpbGVzClBLR19JTkZPX0VOQ09ESU5HID0gJ3V0Zi04JwoKIyBwcmVmZXJyZWQgdmVyc2lvbi4gSG9wZWZ1bGx5IHdpbGwgYmUgY2hhbmdlZAojIHRvIDEuMiBvbmNlIFBFUCAzNDUgaXMgc3VwcG9ydGVkIGV2ZXJ5d2hlcmUKUEtHX0lORk9fUFJFRkVSUkVEX1ZFUlNJT04gPSAnMS4xJwoKX0xJTkVfUFJFRklYXzFfMiA9IHJlLmNvbXBpbGUoJ1xuICAgICAgIFx8JykKX0xJTkVfUFJFRklYX1BSRV8xXzIgPSByZS5jb21waWxlKCdcbiAgICAgICAgJykKXzI0MV9GSUVMRFMgPSAoJ01ldGFkYXRhLVZlcnNpb24nLCAnTmFtZScsICdWZXJzaW9uJywgJ1BsYXRmb3JtJywKICAgICAgICAgICAgICAgJ1N1bW1hcnknLCAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAnS2V5d29yZHMnLCAnSG9tZS1wYWdlJywgJ0F1dGhvcicsICdBdXRob3ItZW1haWwnLAogICAgICAgICAgICAgICAnTGljZW5zZScpCgpfMzE0X0ZJRUxEUyA9ICgnTWV0YWRhdGEtVmVyc2lvbicsICdOYW1lJywgJ1ZlcnNpb24nLCAnUGxhdGZvcm0nLAogICAgICAgICAgICAgICAnU3VwcG9ydGVkLVBsYXRmb3JtJywgJ1N1bW1hcnknLCAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAnS2V5d29yZHMnLCAnSG9tZS1wYWdlJywgJ0F1dGhvcicsICdBdXRob3ItZW1haWwnLAogICAgICAgICAgICAgICAnTGljZW5zZScsICdDbGFzc2lmaWVyJywgJ0Rvd25sb2FkLVVSTCcsICdPYnNvbGV0ZXMnLAogICAgICAgICAgICAgICAnUHJvdmlkZXMnLCAnUmVxdWlyZXMnKQoKXzMxNF9NQVJLRVJTID0gKCdPYnNvbGV0ZXMnLCAnUHJvdmlkZXMnLCAnUmVxdWlyZXMnLCAnQ2xhc3NpZmllcicsCiAgICAgICAgICAgICAgICAnRG93bmxvYWQtVVJMJykKCl8zNDVfRklFTERTID0gKCdNZXRhZGF0YS1WZXJzaW9uJywgJ05hbWUnLCAnVmVyc2lvbicsICdQbGF0Zm9ybScsCiAgICAgICAgICAgICAgICdTdXBwb3J0ZWQtUGxhdGZvcm0nLCAnU3VtbWFyeScsICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICdLZXl3b3JkcycsICdIb21lLXBhZ2UnLCAnQXV0aG9yJywgJ0F1dGhvci1lbWFpbCcsCiAgICAgICAgICAgICAgICdNYWludGFpbmVyJywgJ01haW50YWluZXItZW1haWwnLCAnTGljZW5zZScsCiAgICAgICAgICAgICAgICdDbGFzc2lmaWVyJywgJ0Rvd25sb2FkLVVSTCcsICdPYnNvbGV0ZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdQcm9qZWN0LVVSTCcsICdQcm92aWRlcy1EaXN0JywgJ1JlcXVpcmVzLURpc3QnLAogICAgICAgICAgICAgICAnUmVxdWlyZXMtUHl0aG9uJywgJ1JlcXVpcmVzLUV4dGVybmFsJykKCl8zNDVfTUFSS0VSUyA9ICgnUHJvdmlkZXMtRGlzdCcsICdSZXF1aXJlcy1EaXN0JywgJ1JlcXVpcmVzLVB5dGhvbicsCiAgICAgICAgICAgICAgICAnT2Jzb2xldGVzLURpc3QnLCAnUmVxdWlyZXMtRXh0ZXJuYWwnLCAnTWFpbnRhaW5lcicsCiAgICAgICAgICAgICAgICAnTWFpbnRhaW5lci1lbWFpbCcsICdQcm9qZWN0LVVSTCcpCgpfNDI2X0ZJRUxEUyA9ICgnTWV0YWRhdGEtVmVyc2lvbicsICdOYW1lJywgJ1ZlcnNpb24nLCAnUGxhdGZvcm0nLAogICAgICAgICAgICAgICAnU3VwcG9ydGVkLVBsYXRmb3JtJywgJ1N1bW1hcnknLCAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAnS2V5d29yZHMnLCAnSG9tZS1wYWdlJywgJ0F1dGhvcicsICdBdXRob3ItZW1haWwnLAogICAgICAgICAgICAgICAnTWFpbnRhaW5lcicsICdNYWludGFpbmVyLWVtYWlsJywgJ0xpY2Vuc2UnLAogICAgICAgICAgICAgICAnQ2xhc3NpZmllcicsICdEb3dubG9hZC1VUkwnLCAnT2Jzb2xldGVzLURpc3QnLAogICAgICAgICAgICAgICAnUHJvamVjdC1VUkwnLCAnUHJvdmlkZXMtRGlzdCcsICdSZXF1aXJlcy1EaXN0JywKICAgICAgICAgICAgICAgJ1JlcXVpcmVzLVB5dGhvbicsICdSZXF1aXJlcy1FeHRlcm5hbCcsICdQcml2YXRlLVZlcnNpb24nLAogICAgICAgICAgICAgICAnT2Jzb2xldGVkLUJ5JywgJ1NldHVwLVJlcXVpcmVzLURpc3QnLCAnRXh0ZW5zaW9uJywKICAgICAgICAgICAgICAgJ1Byb3ZpZGVzLUV4dHJhJykKCl80MjZfTUFSS0VSUyA9ICgnUHJpdmF0ZS1WZXJzaW9uJywgJ1Byb3ZpZGVzLUV4dHJhJywgJ09ic29sZXRlZC1CeScsCiAgICAgICAgICAgICAgICAnU2V0dXAtUmVxdWlyZXMtRGlzdCcsICdFeHRlbnNpb24nKQoKX0FMTF9GSUVMRFMgPSBzZXQoKQpfQUxMX0ZJRUxEUy51cGRhdGUoXzI0MV9GSUVMRFMpCl9BTExfRklFTERTLnVwZGF0ZShfMzE0X0ZJRUxEUykKX0FMTF9GSUVMRFMudXBkYXRlKF8zNDVfRklFTERTKQpfQUxMX0ZJRUxEUy51cGRhdGUoXzQyNl9GSUVMRFMpCgpFWFRSQV9SRSA9IHJlLmNvbXBpbGUocicnJ2V4dHJhXHMqPT1ccyooIihbXiJdKykifCcoW14nXSspJyknJycpCgoKZGVmIF92ZXJzaW9uMmZpZWxkbGlzdCh2ZXJzaW9uKToKICAgIGlmIHZlcnNpb24gPT0gJzEuMCc6CiAgICAgICAgcmV0dXJuIF8yNDFfRklFTERTCiAgICBlbGlmIHZlcnNpb24gPT0gJzEuMSc6CiAgICAgICAgcmV0dXJuIF8zMTRfRklFTERTCiAgICBlbGlmIHZlcnNpb24gPT0gJzEuMic6CiAgICAgICAgcmV0dXJuIF8zNDVfRklFTERTCiAgICBlbGlmIHZlcnNpb24gPT0gJzIuMCc6CiAgICAgICAgcmV0dXJuIF80MjZfRklFTERTCiAgICByYWlzZSBNZXRhZGF0YVVucmVjb2duaXplZFZlcnNpb25FcnJvcih2ZXJzaW9uKQoKCmRlZiBfYmVzdF92ZXJzaW9uKGZpZWxkcyk6CiAgICAiIiJEZXRlY3QgdGhlIGJlc3QgdmVyc2lvbiBkZXBlbmRpbmcgb24gdGhlIGZpZWxkcyB1c2VkLiIiIgogICAgZGVmIF9oYXNfbWFya2VyKGtleXMsIG1hcmtlcnMpOgogICAgICAgIGZvciBtYXJrZXIgaW4gbWFya2VyczoKICAgICAgICAgICAgaWYgbWFya2VyIGluIGtleXM6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGtleXMgPSBbXQogICAgZm9yIGtleSwgdmFsdWUgaW4gZmllbGRzLml0ZW1zKCk6CiAgICAgICAgaWYgdmFsdWUgaW4gKFtdLCAnVU5LTk9XTicsIE5vbmUpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGtleXMuYXBwZW5kKGtleSkKCiAgICBwb3NzaWJsZV92ZXJzaW9ucyA9IFsnMS4wJywgJzEuMScsICcxLjInLCAnMi4wJ10KCiAgICAjIGZpcnN0IGxldCdzIHRyeSB0byBzZWUgaWYgYSBmaWVsZCBpcyBub3QgcGFydCBvZiBvbmUgb2YgdGhlIHZlcnNpb24KICAgIGZvciBrZXkgaW4ga2V5czoKICAgICAgICBpZiBrZXkgbm90IGluIF8yNDFfRklFTERTIGFuZCAnMS4wJyBpbiBwb3NzaWJsZV92ZXJzaW9uczoKICAgICAgICAgICAgcG9zc2libGVfdmVyc2lvbnMucmVtb3ZlKCcxLjAnKQogICAgICAgIGlmIGtleSBub3QgaW4gXzMxNF9GSUVMRFMgYW5kICcxLjEnIGluIHBvc3NpYmxlX3ZlcnNpb25zOgogICAgICAgICAgICBwb3NzaWJsZV92ZXJzaW9ucy5yZW1vdmUoJzEuMScpCiAgICAgICAgaWYga2V5IG5vdCBpbiBfMzQ1X0ZJRUxEUyBhbmQgJzEuMicgaW4gcG9zc2libGVfdmVyc2lvbnM6CiAgICAgICAgICAgIHBvc3NpYmxlX3ZlcnNpb25zLnJlbW92ZSgnMS4yJykKICAgICAgICBpZiBrZXkgbm90IGluIF80MjZfRklFTERTIGFuZCAnMi4wJyBpbiBwb3NzaWJsZV92ZXJzaW9uczoKICAgICAgICAgICAgcG9zc2libGVfdmVyc2lvbnMucmVtb3ZlKCcyLjAnKQoKICAgICMgcG9zc2libGVfdmVyc2lvbiBjb250YWlucyBxdWFsaWZpZWQgdmVyc2lvbnMKICAgIGlmIGxlbihwb3NzaWJsZV92ZXJzaW9ucykgPT0gMToKICAgICAgICByZXR1cm4gcG9zc2libGVfdmVyc2lvbnNbMF0gICAjIGZvdW5kICEKICAgIGVsaWYgbGVuKHBvc3NpYmxlX3ZlcnNpb25zKSA9PSAwOgogICAgICAgIHJhaXNlIE1ldGFkYXRhQ29uZmxpY3RFcnJvcignVW5rbm93biBtZXRhZGF0YSBzZXQnKQoKICAgICMgbGV0J3Mgc2VlIGlmIG9uZSB1bmlxdWUgbWFya2VyIGlzIGZvdW5kCiAgICBpc18xXzEgPSAnMS4xJyBpbiBwb3NzaWJsZV92ZXJzaW9ucyBhbmQgX2hhc19tYXJrZXIoa2V5cywgXzMxNF9NQVJLRVJTKQogICAgaXNfMV8yID0gJzEuMicgaW4gcG9zc2libGVfdmVyc2lvbnMgYW5kIF9oYXNfbWFya2VyKGtleXMsIF8zNDVfTUFSS0VSUykKICAgIGlzXzJfMCA9ICcyLjAnIGluIHBvc3NpYmxlX3ZlcnNpb25zIGFuZCBfaGFzX21hcmtlcihrZXlzLCBfNDI2X01BUktFUlMpCiAgICBpZiBpbnQoaXNfMV8xKSArIGludChpc18xXzIpICsgaW50KGlzXzJfMCkgPiAxOgogICAgICAgIHJhaXNlIE1ldGFkYXRhQ29uZmxpY3RFcnJvcignWW91IHVzZWQgaW5jb21wYXRpYmxlIDEuMS8xLjIvMi4wIGZpZWxkcycpCgogICAgIyB3ZSBoYXZlIHRoZSBjaG9pY2UsIDEuMCwgb3IgMS4yLCBvciAyLjAKICAgICMgICAtIDEuMCBoYXMgYSBicm9rZW4gU3VtbWFyeSBmaWVsZCBidXQgd29ya3Mgd2l0aCBhbGwgdG9vbHMKICAgICMgICAtIDEuMSBpcyB0byBhdm9pZAogICAgIyAgIC0gMS4yIGZpeGVzIFN1bW1hcnkgYnV0IGhhcyBsaXR0bGUgYWRvcHRpb24KICAgICMgICAtIDIuMCBhZGRzIG1vcmUgZmVhdHVyZXMgYW5kIGlzIHZlcnkgbmV3CiAgICBpZiBub3QgaXNfMV8xIGFuZCBub3QgaXNfMV8yIGFuZCBub3QgaXNfMl8wOgogICAgICAgICMgd2UgY291bGRuJ3QgZmluZCBhbnkgc3BlY2lmaWMgbWFya2VyCiAgICAgICAgaWYgUEtHX0lORk9fUFJFRkVSUkVEX1ZFUlNJT04gaW4gcG9zc2libGVfdmVyc2lvbnM6CiAgICAgICAgICAgIHJldHVybiBQS0dfSU5GT19QUkVGRVJSRURfVkVSU0lPTgogICAgaWYgaXNfMV8xOgogICAgICAgIHJldHVybiAnMS4xJwogICAgaWYgaXNfMV8yOgogICAgICAgIHJldHVybiAnMS4yJwoKICAgIHJldHVybiAnMi4wJwoKX0FUVFIyRklFTEQgPSB7CiAgICAnbWV0YWRhdGFfdmVyc2lvbic6ICdNZXRhZGF0YS1WZXJzaW9uJywKICAgICduYW1lJzogJ05hbWUnLAogICAgJ3ZlcnNpb24nOiAnVmVyc2lvbicsCiAgICAncGxhdGZvcm0nOiAnUGxhdGZvcm0nLAogICAgJ3N1cHBvcnRlZF9wbGF0Zm9ybSc6ICdTdXBwb3J0ZWQtUGxhdGZvcm0nLAogICAgJ3N1bW1hcnknOiAnU3VtbWFyeScsCiAgICAnZGVzY3JpcHRpb24nOiAnRGVzY3JpcHRpb24nLAogICAgJ2tleXdvcmRzJzogJ0tleXdvcmRzJywKICAgICdob21lX3BhZ2UnOiAnSG9tZS1wYWdlJywKICAgICdhdXRob3InOiAnQXV0aG9yJywKICAgICdhdXRob3JfZW1haWwnOiAnQXV0aG9yLWVtYWlsJywKICAgICdtYWludGFpbmVyJzogJ01haW50YWluZXInLAogICAgJ21haW50YWluZXJfZW1haWwnOiAnTWFpbnRhaW5lci1lbWFpbCcsCiAgICAnbGljZW5zZSc6ICdMaWNlbnNlJywKICAgICdjbGFzc2lmaWVyJzogJ0NsYXNzaWZpZXInLAogICAgJ2Rvd25sb2FkX3VybCc6ICdEb3dubG9hZC1VUkwnLAogICAgJ29ic29sZXRlc19kaXN0JzogJ09ic29sZXRlcy1EaXN0JywKICAgICdwcm92aWRlc19kaXN0JzogJ1Byb3ZpZGVzLURpc3QnLAogICAgJ3JlcXVpcmVzX2Rpc3QnOiAnUmVxdWlyZXMtRGlzdCcsCiAgICAnc2V0dXBfcmVxdWlyZXNfZGlzdCc6ICdTZXR1cC1SZXF1aXJlcy1EaXN0JywKICAgICdyZXF1aXJlc19weXRob24nOiAnUmVxdWlyZXMtUHl0aG9uJywKICAgICdyZXF1aXJlc19leHRlcm5hbCc6ICdSZXF1aXJlcy1FeHRlcm5hbCcsCiAgICAncmVxdWlyZXMnOiAnUmVxdWlyZXMnLAogICAgJ3Byb3ZpZGVzJzogJ1Byb3ZpZGVzJywKICAgICdvYnNvbGV0ZXMnOiAnT2Jzb2xldGVzJywKICAgICdwcm9qZWN0X3VybCc6ICdQcm9qZWN0LVVSTCcsCiAgICAncHJpdmF0ZV92ZXJzaW9uJzogJ1ByaXZhdGUtVmVyc2lvbicsCiAgICAnb2Jzb2xldGVkX2J5JzogJ09ic29sZXRlZC1CeScsCiAgICAnZXh0ZW5zaW9uJzogJ0V4dGVuc2lvbicsCiAgICAncHJvdmlkZXNfZXh0cmEnOiAnUHJvdmlkZXMtRXh0cmEnLAp9CgpfUFJFRElDQVRFX0ZJRUxEUyA9ICgnUmVxdWlyZXMtRGlzdCcsICdPYnNvbGV0ZXMtRGlzdCcsICdQcm92aWRlcy1EaXN0JykKX1ZFUlNJT05TX0ZJRUxEUyA9ICgnUmVxdWlyZXMtUHl0aG9uJywpCl9WRVJTSU9OX0ZJRUxEUyA9ICgnVmVyc2lvbicsKQpfTElTVEZJRUxEUyA9ICgnUGxhdGZvcm0nLCAnQ2xhc3NpZmllcicsICdPYnNvbGV0ZXMnLAogICAgICAgICAgICAgICAnUmVxdWlyZXMnLCAnUHJvdmlkZXMnLCAnT2Jzb2xldGVzLURpc3QnLAogICAgICAgICAgICAgICAnUHJvdmlkZXMtRGlzdCcsICdSZXF1aXJlcy1EaXN0JywgJ1JlcXVpcmVzLUV4dGVybmFsJywKICAgICAgICAgICAgICAgJ1Byb2plY3QtVVJMJywgJ1N1cHBvcnRlZC1QbGF0Zm9ybScsICdTZXR1cC1SZXF1aXJlcy1EaXN0JywKICAgICAgICAgICAgICAgJ1Byb3ZpZGVzLUV4dHJhJywgJ0V4dGVuc2lvbicpCl9MSVNUVFVQTEVGSUVMRFMgPSAoJ1Byb2plY3QtVVJMJywpCgpfRUxFTUVOVFNGSUVMRCA9ICgnS2V5d29yZHMnLCkKCl9VTklDT0RFRklFTERTID0gKCdBdXRob3InLCAnTWFpbnRhaW5lcicsICdTdW1tYXJ5JywgJ0Rlc2NyaXB0aW9uJykKCl9NSVNTSU5HID0gb2JqZWN0KCkKCl9GSUxFU0FGRSA9IHJlLmNvbXBpbGUoJ1teQS1aYS16MC05Ll0rJykKCgpkZWYgX2dldF9uYW1lX2FuZF92ZXJzaW9uKG5hbWUsIHZlcnNpb24sIGZvcl9maWxlbmFtZT1GYWxzZSk6CiAgICAiIiJSZXR1cm4gdGhlIGRpc3RyaWJ1dGlvbiBuYW1lIHdpdGggdmVyc2lvbi4KCiAgICBJZiBmb3JfZmlsZW5hbWUgaXMgdHJ1ZSwgcmV0dXJuIGEgZmlsZW5hbWUtZXNjYXBlZCBmb3JtLiIiIgogICAgaWYgZm9yX2ZpbGVuYW1lOgogICAgICAgICMgRm9yIGJvdGggbmFtZSBhbmQgdmVyc2lvbiBhbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljIG9yICcuJwogICAgICAgICMgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnLScuICBBZGRpdGlvbmFsbHkgYW55CiAgICAgICAgIyBzcGFjZXMgaW4gdGhlIHZlcnNpb24gc3RyaW5nIGJlY29tZSAnLicKICAgICAgICBuYW1lID0gX0ZJTEVTQUZFLnN1YignLScsIG5hbWUpCiAgICAgICAgdmVyc2lvbiA9IF9GSUxFU0FGRS5zdWIoJy0nLCB2ZXJzaW9uLnJlcGxhY2UoJyAnLCAnLicpKQogICAgcmV0dXJuICclcy0lcycgJSAobmFtZSwgdmVyc2lvbikKCgpjbGFzcyBMZWdhY3lNZXRhZGF0YShvYmplY3QpOgogICAgIiIiVGhlIGxlZ2FjeSBtZXRhZGF0YSBvZiBhIHJlbGVhc2UuCgogICAgU3VwcG9ydHMgdmVyc2lvbnMgMS4wLCAxLjEgYW5kIDEuMiAoYXV0by1kZXRlY3RlZCkuIFlvdSBjYW4KICAgIGluc3RhbnRpYXRlIHRoZSBjbGFzcyB3aXRoIG9uZSBvZiB0aGVzZSBhcmd1bWVudHMgKG9yIG5vbmUpOgogICAgLSAqcGF0aCosIHRoZSBwYXRoIHRvIGEgbWV0YWRhdGEgZmlsZQogICAgLSAqZmlsZW9iaiogZ2l2ZSBhIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBtZXRhZGF0YSBhcyBjb250ZW50CiAgICAtICptYXBwaW5nKiBpcyBhIGRpY3QtbGlrZSBvYmplY3QKICAgIC0gKnNjaGVtZSogaXMgYSB2ZXJzaW9uIHNjaGVtZSBuYW1lCiAgICAiIiIKICAgICMgVE9ETyBkb2N1bWVudCB0aGUgbWFwcGluZyBBUEkgYW5kIFVOS05PV04gZGVmYXVsdCBrZXkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD1Ob25lLCBmaWxlb2JqPU5vbmUsIG1hcHBpbmc9Tm9uZSwKICAgICAgICAgICAgICAgICBzY2hlbWU9J2RlZmF1bHQnKToKICAgICAgICBpZiBbcGF0aCwgZmlsZW9iaiwgbWFwcGluZ10uY291bnQoTm9uZSkgPCAyOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3BhdGgsIGZpbGVvYmogYW5kIG1hcHBpbmcgYXJlIGV4Y2x1c2l2ZScpCiAgICAgICAgc2VsZi5fZmllbGRzID0ge30KICAgICAgICBzZWxmLnJlcXVpcmVzX2ZpbGVzID0gW10KICAgICAgICBzZWxmLl9kZXBlbmRlbmNpZXMgPSBOb25lCiAgICAgICAgc2VsZi5zY2hlbWUgPSBzY2hlbWUKICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnJlYWQocGF0aCkKICAgICAgICBlbGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYucmVhZF9maWxlKGZpbGVvYmopCiAgICAgICAgZWxpZiBtYXBwaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnVwZGF0ZShtYXBwaW5nKQogICAgICAgICAgICBzZWxmLnNldF9tZXRhZGF0YV92ZXJzaW9uKCkKCiAgICBkZWYgc2V0X21ldGFkYXRhX3ZlcnNpb24oc2VsZik6CiAgICAgICAgc2VsZi5fZmllbGRzWydNZXRhZGF0YS1WZXJzaW9uJ10gPSBfYmVzdF92ZXJzaW9uKHNlbGYuX2ZpZWxkcykKCiAgICBkZWYgX3dyaXRlX2ZpZWxkKHNlbGYsIGZpbGVvYmosIG5hbWUsIHZhbHVlKToKICAgICAgICBmaWxlb2JqLndyaXRlKCclczogJXNcbicgJSAobmFtZSwgdmFsdWUpKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5nZXQobmFtZSkKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgIHJldHVybiBzZWxmLnNldChuYW1lLCB2YWx1ZSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgZmllbGRfbmFtZSA9IHNlbGYuX2NvbnZlcnRfbmFtZShuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIHNlbGYuX2ZpZWxkc1tmaWVsZF9uYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IobmFtZSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiAobmFtZSBpbiBzZWxmLl9maWVsZHMgb3IKICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnRfbmFtZShuYW1lKSBpbiBzZWxmLl9maWVsZHMpCgogICAgZGVmIF9jb252ZXJ0X25hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSBpbiBfQUxMX0ZJRUxEUzoKICAgICAgICAgICAgcmV0dXJuIG5hbWUKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCctJywgJ18nKS5sb3dlcigpCiAgICAgICAgcmV0dXJuIF9BVFRSMkZJRUxELmdldChuYW1lLCBuYW1lKQoKICAgIGRlZiBfZGVmYXVsdF92YWx1ZShzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lIGluIF9MSVNURklFTERTIG9yIG5hbWUgaW4gX0VMRU1FTlRTRklFTEQ6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIHJldHVybiAnVU5LTk9XTicKCiAgICBkZWYgX3JlbW92ZV9saW5lX3ByZWZpeChzZWxmLCB2YWx1ZSk6CiAgICAgICAgaWYgc2VsZi5tZXRhZGF0YV92ZXJzaW9uIGluICgnMS4wJywgJzEuMScpOgogICAgICAgICAgICByZXR1cm4gX0xJTkVfUFJFRklYX1BSRV8xXzIuc3ViKCdcbicsIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBfTElORV9QUkVGSVhfMV8yLnN1YignXG4nLCB2YWx1ZSkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSBpbiBfQVRUUjJGSUVMRDoKICAgICAgICAgICAgcmV0dXJuIHNlbGZbbmFtZV0KICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihuYW1lKQoKICAgICMKICAgICMgUHVibGljIEFQSQogICAgIwoKIyAgICBkZXBlbmRlbmNpZXMgPSBwcm9wZXJ0eShfZ2V0X2RlcGVuZGVuY2llcywgX3NldF9kZXBlbmRlbmNpZXMpCgogICAgZGVmIGdldF9mdWxsbmFtZShzZWxmLCBmaWxlc2FmZT1GYWxzZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBkaXN0cmlidXRpb24gbmFtZSB3aXRoIHZlcnNpb24uCgogICAgICAgIElmIGZpbGVzYWZlIGlzIHRydWUsIHJldHVybiBhIGZpbGVuYW1lLWVzY2FwZWQgZm9ybS4iIiIKICAgICAgICByZXR1cm4gX2dldF9uYW1lX2FuZF92ZXJzaW9uKHNlbGZbJ05hbWUnXSwgc2VsZlsnVmVyc2lvbiddLCBmaWxlc2FmZSkKCiAgICBkZWYgaXNfZmllbGQoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIicmV0dXJuIFRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIG1ldGFkYXRhIGtleSIiIgogICAgICAgIG5hbWUgPSBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkKICAgICAgICByZXR1cm4gbmFtZSBpbiBfQUxMX0ZJRUxEUwoKICAgIGRlZiBpc19tdWx0aV9maWVsZChzZWxmLCBuYW1lKToKICAgICAgICBuYW1lID0gc2VsZi5fY29udmVydF9uYW1lKG5hbWUpCiAgICAgICAgcmV0dXJuIG5hbWUgaW4gX0xJU1RGSUVMRFMKCiAgICBkZWYgcmVhZChzZWxmLCBmaWxlcGF0aCk6CiAgICAgICAgIiIiUmVhZCB0aGUgbWV0YWRhdGEgdmFsdWVzIGZyb20gYSBmaWxlIHBhdGguIiIiCiAgICAgICAgZnAgPSBjb2RlY3Mub3BlbihmaWxlcGF0aCwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5yZWFkX2ZpbGUoZnApCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZnAuY2xvc2UoKQoKICAgIGRlZiByZWFkX2ZpbGUoc2VsZiwgZmlsZW9iKToKICAgICAgICAiIiJSZWFkIHRoZSBtZXRhZGF0YSB2YWx1ZXMgZnJvbSBhIGZpbGUgb2JqZWN0LiIiIgogICAgICAgIG1zZyA9IG1lc3NhZ2VfZnJvbV9maWxlKGZpbGVvYikKICAgICAgICBzZWxmLl9maWVsZHNbJ01ldGFkYXRhLVZlcnNpb24nXSA9IG1zZ1snbWV0YWRhdGEtdmVyc2lvbiddCgogICAgICAgICMgV2hlbiByZWFkaW5nLCBnZXQgYWxsIHRoZSBmaWVsZHMgd2UgY2FuCiAgICAgICAgZm9yIGZpZWxkIGluIF9BTExfRklFTERTOgogICAgICAgICAgICBpZiBmaWVsZCBub3QgaW4gbXNnOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgZmllbGQgaW4gX0xJU1RGSUVMRFM6CiAgICAgICAgICAgICAgICAjIHdlIGNhbiBoYXZlIG11bHRpcGxlIGxpbmVzCiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBtc2cuZ2V0X2FsbChmaWVsZCkKICAgICAgICAgICAgICAgIGlmIGZpZWxkIGluIF9MSVNUVFVQTEVGSUVMRFMgYW5kIHZhbHVlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdHVwbGUodmFsdWUuc3BsaXQoJywnKSkgZm9yIHZhbHVlIGluIHZhbHVlc10KICAgICAgICAgICAgICAgIHNlbGYuc2V0KGZpZWxkLCB2YWx1ZXMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1zZ1tmaWVsZF0KICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lIGFuZCB2YWx1ZSAhPSAnVU5LTk9XTic6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXQoZmllbGQsIHZhbHVlKQogICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgIGRlZiB3cml0ZShzZWxmLCBmaWxlcGF0aCwgc2tpcF91bmtub3duPUZhbHNlKToKICAgICAgICAiIiJXcml0ZSB0aGUgbWV0YWRhdGEgZmllbGRzIHRvIGZpbGVwYXRoLiIiIgogICAgICAgIGZwID0gY29kZWNzLm9wZW4oZmlsZXBhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZShmcCwgc2tpcF91bmtub3duKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZwLmNsb3NlKCkKCiAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCBmaWxlb2JqZWN0LCBza2lwX3Vua25vd249RmFsc2UpOgogICAgICAgICIiIldyaXRlIHRoZSBQS0ctSU5GTyBmb3JtYXQgZGF0YSB0byBhIGZpbGUgb2JqZWN0LiIiIgogICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgICAgICBmb3IgZmllbGQgaW4gX3ZlcnNpb24yZmllbGRsaXN0KHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSk6CiAgICAgICAgICAgIHZhbHVlcyA9IHNlbGYuZ2V0KGZpZWxkKQogICAgICAgICAgICBpZiBza2lwX3Vua25vd24gYW5kIHZhbHVlcyBpbiAoJ1VOS05PV04nLCBbXSwgWydVTktOT1dOJ10pOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgZmllbGQgaW4gX0VMRU1FTlRTRklFTEQ6CiAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlb2JqZWN0LCBmaWVsZCwgJywnLmpvaW4odmFsdWVzKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGZpZWxkIG5vdCBpbiBfTElTVEZJRUxEUzoKICAgICAgICAgICAgICAgIGlmIGZpZWxkID09ICdEZXNjcmlwdGlvbic6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5tZXRhZGF0YV92ZXJzaW9uIGluICgnMS4wJywgJzEuMScpOgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMucmVwbGFjZSgnXG4nLCAnXG4gICAgICAgICcpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLnJlcGxhY2UoJ1xuJywgJ1xuICAgICAgIHwnKQogICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc10KCiAgICAgICAgICAgIGlmIGZpZWxkIGluIF9MSVNUVFVQTEVGSUVMRFM6CiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbJywnLmpvaW4odmFsdWUpIGZvciB2YWx1ZSBpbiB2YWx1ZXNdCgogICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgogICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZW9iamVjdCwgZmllbGQsIHZhbHVlKQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgb3RoZXI9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICIiIlNldCBtZXRhZGF0YSB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gaXRlcmFibGUgYG90aGVyYCBhbmQga3dhcmdzLgoKICAgICAgICBCZWhhdmlvciBpcyBsaWtlIGBkaWN0LnVwZGF0ZWA6IElmIGBvdGhlcmAgaGFzIGEgYGBrZXlzYGAgbWV0aG9kLAogICAgICAgIHRoZXkgYXJlIGxvb3BlZCBvdmVyIGFuZCBgYHNlbGZba2V5XWBgIGlzIGFzc2lnbmVkIGBgb3RoZXJba2V5XWBgLgogICAgICAgIEVsc2UsIGBgb3RoZXJgYCBpcyBhbiBpdGVyYWJsZSBvZiBgYChrZXksIHZhbHVlKWBgIGl0ZXJhYmxlcy4KCiAgICAgICAgS2V5cyB0aGF0IGRvbid0IG1hdGNoIGEgbWV0YWRhdGEgZmllbGQgb3IgdGhhdCBoYXZlIGFuIGVtcHR5IHZhbHVlIGFyZQogICAgICAgIGRyb3BwZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGVmIF9zZXQoa2V5LCB2YWx1ZSk6CiAgICAgICAgICAgIGlmIGtleSBpbiBfQVRUUjJGSUVMRCBhbmQgdmFsdWU6CiAgICAgICAgICAgICAgICBzZWxmLnNldChzZWxmLl9jb252ZXJ0X25hbWUoa2V5KSwgdmFsdWUpCgogICAgICAgIGlmIG5vdCBvdGhlcjoKICAgICAgICAgICAgIyBvdGhlciBpcyBOb25lIG9yIGVtcHR5IGNvbnRhaW5lcgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCAna2V5cycpOgogICAgICAgICAgICBmb3IgayBpbiBvdGhlci5rZXlzKCk6CiAgICAgICAgICAgICAgICBfc2V0KGssIG90aGVyW2tdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBrLCB2IGluIG90aGVyOgogICAgICAgICAgICAgICAgX3NldChrLCB2KQoKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIGZvciBrLCB2IGluIGt3YXJncy5pdGVtcygpOgogICAgICAgICAgICAgICAgX3NldChrLCB2KQoKICAgIGRlZiBzZXQoc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkNvbnRyb2wgdGhlbiBzZXQgYSBtZXRhZGF0YSBmaWVsZC4iIiIKICAgICAgICBuYW1lID0gc2VsZi5fY29udmVydF9uYW1lKG5hbWUpCgogICAgICAgIGlmICgobmFtZSBpbiBfRUxFTUVOVFNGSUVMRCBvciBuYW1lID09ICdQbGF0Zm9ybScpIGFuZAogICAgICAgICAgICBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSkpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBbdi5zdHJpcCgpIGZvciB2IGluIHZhbHVlLnNwbGl0KCcsJyldCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdCiAgICAgICAgZWxpZiAobmFtZSBpbiBfTElTVEZJRUxEUyBhbmQKICAgICAgICAgICAgICBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSkpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWVdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdCgogICAgICAgIGlmIGxvZ2dlci5pc0VuYWJsZWRGb3IobG9nZ2luZy5XQVJOSU5HKToKICAgICAgICAgICAgcHJvamVjdF9uYW1lID0gc2VsZlsnTmFtZSddCgogICAgICAgICAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYuc2NoZW1lKQogICAgICAgICAgICBpZiBuYW1lIGluIF9QUkVESUNBVEVfRklFTERTIGFuZCB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGZvciB2IGluIHZhbHVlOgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdGhhdCB0aGUgdmFsdWVzIGFyZSB2YWxpZAogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzY2hlbWUuaXNfdmFsaWRfbWF0Y2hlcih2LnNwbGl0KCc7JylbMF0pOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnOiAnJXMnIGlzIG5vdCB2YWxpZCAoZmllbGQgJyVzJykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2LCBuYW1lKQogICAgICAgICAgICAjIEZJWE1FIHRoaXMgcmVqZWN0cyBVTktOT1dOLCBpcyB0aGF0IHJpZ2h0PwogICAgICAgICAgICBlbGlmIG5hbWUgaW4gX1ZFUlNJT05TX0ZJRUxEUyBhbmQgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2NoZW1lLmlzX3ZhbGlkX2NvbnN0cmFpbnRfbGlzdCh2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIiclcyc6ICclcycgaXMgbm90IGEgdmFsaWQgdmVyc2lvbiAoZmllbGQgJyVzJykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgdmFsdWUsIG5hbWUpCiAgICAgICAgICAgIGVsaWYgbmFtZSBpbiBfVkVSU0lPTl9GSUVMRFMgYW5kIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgbm90IHNjaGVtZS5pc192YWxpZF92ZXJzaW9uKHZhbHVlKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiJyVzJzogJyVzJyBpcyBub3QgYSB2YWxpZCB2ZXJzaW9uIChmaWVsZCAnJXMnKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2YWx1ZSwgbmFtZSkKCiAgICAgICAgaWYgbmFtZSBpbiBfVU5JQ09ERUZJRUxEUzoKICAgICAgICAgICAgaWYgbmFtZSA9PSAnRGVzY3JpcHRpb24nOgogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9yZW1vdmVfbGluZV9wcmVmaXgodmFsdWUpCgogICAgICAgIHNlbGYuX2ZpZWxkc1tuYW1lXSA9IHZhbHVlCgogICAgZGVmIGdldChzZWxmLCBuYW1lLCBkZWZhdWx0PV9NSVNTSU5HKToKICAgICAgICAiIiJHZXQgYSBtZXRhZGF0YSBmaWVsZC4iIiIKICAgICAgICBuYW1lID0gc2VsZi5fY29udmVydF9uYW1lKG5hbWUpCiAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fZmllbGRzOgogICAgICAgICAgICBpZiBkZWZhdWx0IGlzIF9NSVNTSU5HOgogICAgICAgICAgICAgICAgZGVmYXVsdCA9IHNlbGYuX2RlZmF1bHRfdmFsdWUobmFtZSkKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICBpZiBuYW1lIGluIF9VTklDT0RFRklFTERTOgogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2ZpZWxkc1tuYW1lXQogICAgICAgICAgICByZXR1cm4gdmFsdWUKICAgICAgICBlbGlmIG5hbWUgaW4gX0xJU1RGSUVMRFM6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZmllbGRzW25hbWVdCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KICAgICAgICAgICAgcmVzID0gW10KICAgICAgICAgICAgZm9yIHZhbCBpbiB2YWx1ZToKICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIF9MSVNUVFVQTEVGSUVMRFM6CiAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZCh2YWwpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgVGhhdCdzIGZvciBQcm9qZWN0LVVSTAogICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoKHZhbFswXSwgdmFsWzFdKSkKICAgICAgICAgICAgcmV0dXJuIHJlcwoKICAgICAgICBlbGlmIG5hbWUgaW4gX0VMRU1FTlRTRklFTEQ6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZmllbGRzW25hbWVdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoJywnKQogICAgICAgIHJldHVybiBzZWxmLl9maWVsZHNbbmFtZV0KCiAgICBkZWYgY2hlY2soc2VsZiwgc3RyaWN0PUZhbHNlKToKICAgICAgICAiIiJDaGVjayBpZiB0aGUgbWV0YWRhdGEgaXMgY29tcGxpYW50LiBJZiBzdHJpY3QgaXMgVHJ1ZSB0aGVuIHJhaXNlIGlmCiAgICAgICAgbm8gTmFtZSBvciBWZXJzaW9uIGFyZSBwcm92aWRlZCIiIgogICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgICAgICAjIFhYWCBzaG91bGQgY2hlY2sgdGhlIHZlcnNpb25zIChpZiB0aGUgZmlsZSB3YXMgbG9hZGVkKQogICAgICAgIG1pc3NpbmcsIHdhcm5pbmdzID0gW10sIFtdCgogICAgICAgIGZvciBhdHRyIGluICgnTmFtZScsICdWZXJzaW9uJyk6ICAjIHJlcXVpcmVkIGJ5IFBFUCAzNDUKICAgICAgICAgICAgaWYgYXR0ciBub3QgaW4gc2VsZjoKICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKGF0dHIpCgogICAgICAgIGlmIHN0cmljdCBhbmQgbWlzc2luZyAhPSBbXToKICAgICAgICAgICAgbXNnID0gJ21pc3NpbmcgcmVxdWlyZWQgbWV0YWRhdGE6ICVzJyAlICcsICcuam9pbihtaXNzaW5nKQogICAgICAgICAgICByYWlzZSBNZXRhZGF0YU1pc3NpbmdFcnJvcihtc2cpCgogICAgICAgIGZvciBhdHRyIGluICgnSG9tZS1wYWdlJywgJ0F1dGhvcicpOgogICAgICAgICAgICBpZiBhdHRyIG5vdCBpbiBzZWxmOgogICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoYXR0cikKCiAgICAgICAgIyBjaGVja2luZyBtZXRhZGF0YSAxLjIgKFhYWCBuZWVkcyB0byBjaGVjayAxLjEsIDEuMCkKICAgICAgICBpZiBzZWxmWydNZXRhZGF0YS1WZXJzaW9uJ10gIT0gJzEuMic6CiAgICAgICAgICAgIHJldHVybiBtaXNzaW5nLCB3YXJuaW5ncwoKICAgICAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYuc2NoZW1lKQoKICAgICAgICBkZWYgYXJlX3ZhbGlkX2NvbnN0cmFpbnRzKHZhbHVlKToKICAgICAgICAgICAgZm9yIHYgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2NoZW1lLmlzX3ZhbGlkX21hdGNoZXIodi5zcGxpdCgnOycpWzBdKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZm9yIGZpZWxkcywgY29udHJvbGxlciBpbiAoKF9QUkVESUNBVEVfRklFTERTLCBhcmVfdmFsaWRfY29uc3RyYWludHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfVkVSU0lPTlNfRklFTERTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWUuaXNfdmFsaWRfY29uc3RyYWludF9saXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1ZFUlNJT05fRklFTERTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWUuaXNfdmFsaWRfdmVyc2lvbikpOgogICAgICAgICAgICBmb3IgZmllbGQgaW4gZmllbGRzOgogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmdldChmaWVsZCwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lIGFuZCBub3QgY29udHJvbGxlcih2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuYXBwZW5kKCJXcm9uZyB2YWx1ZSBmb3IgJyVzJzogJXMiICUgKGZpZWxkLCB2YWx1ZSkpCgogICAgICAgIHJldHVybiBtaXNzaW5nLCB3YXJuaW5ncwoKICAgIGRlZiB0b2RpY3Qoc2VsZiwgc2tpcF9taXNzaW5nPUZhbHNlKToKICAgICAgICAiIiJSZXR1cm4gZmllbGRzIGFzIGEgZGljdC4KCiAgICAgICAgRmllbGQgbmFtZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdXNlIHRoZSB1bmRlcnNjb3JlLWxvd2VyY2FzZSBzdHlsZQogICAgICAgIGluc3RlYWQgb2YgaHlwaGVuLW1peGVkIGNhc2UgKGkuZS4gaG9tZV9wYWdlIGluc3RlYWQgb2YgSG9tZS1wYWdlKS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnNldF9tZXRhZGF0YV92ZXJzaW9uKCkKCiAgICAgICAgbWFwcGluZ18xXzAgPSAoCiAgICAgICAgICAgICgnbWV0YWRhdGFfdmVyc2lvbicsICdNZXRhZGF0YS1WZXJzaW9uJyksCiAgICAgICAgICAgICgnbmFtZScsICdOYW1lJyksCiAgICAgICAgICAgICgndmVyc2lvbicsICdWZXJzaW9uJyksCiAgICAgICAgICAgICgnc3VtbWFyeScsICdTdW1tYXJ5JyksCiAgICAgICAgICAgICgnaG9tZV9wYWdlJywgJ0hvbWUtcGFnZScpLAogICAgICAgICAgICAoJ2F1dGhvcicsICdBdXRob3InKSwKICAgICAgICAgICAgKCdhdXRob3JfZW1haWwnLCAnQXV0aG9yLWVtYWlsJyksCiAgICAgICAgICAgICgnbGljZW5zZScsICdMaWNlbnNlJyksCiAgICAgICAgICAgICgnZGVzY3JpcHRpb24nLCAnRGVzY3JpcHRpb24nKSwKICAgICAgICAgICAgKCdrZXl3b3JkcycsICdLZXl3b3JkcycpLAogICAgICAgICAgICAoJ3BsYXRmb3JtJywgJ1BsYXRmb3JtJyksCiAgICAgICAgICAgICgnY2xhc3NpZmllcnMnLCAnQ2xhc3NpZmllcicpLAogICAgICAgICAgICAoJ2Rvd25sb2FkX3VybCcsICdEb3dubG9hZC1VUkwnKSwKICAgICAgICApCgogICAgICAgIGRhdGEgPSB7fQogICAgICAgIGZvciBrZXksIGZpZWxkX25hbWUgaW4gbWFwcGluZ18xXzA6CiAgICAgICAgICAgIGlmIG5vdCBza2lwX21pc3Npbmcgb3IgZmllbGRfbmFtZSBpbiBzZWxmLl9maWVsZHM6CiAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBzZWxmW2ZpZWxkX25hbWVdCgogICAgICAgIGlmIHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSA9PSAnMS4yJzoKICAgICAgICAgICAgbWFwcGluZ18xXzIgPSAoCiAgICAgICAgICAgICAgICAoJ3JlcXVpcmVzX2Rpc3QnLCAnUmVxdWlyZXMtRGlzdCcpLAogICAgICAgICAgICAgICAgKCdyZXF1aXJlc19weXRob24nLCAnUmVxdWlyZXMtUHl0aG9uJyksCiAgICAgICAgICAgICAgICAoJ3JlcXVpcmVzX2V4dGVybmFsJywgJ1JlcXVpcmVzLUV4dGVybmFsJyksCiAgICAgICAgICAgICAgICAoJ3Byb3ZpZGVzX2Rpc3QnLCAnUHJvdmlkZXMtRGlzdCcpLAogICAgICAgICAgICAgICAgKCdvYnNvbGV0ZXNfZGlzdCcsICdPYnNvbGV0ZXMtRGlzdCcpLAogICAgICAgICAgICAgICAgKCdwcm9qZWN0X3VybCcsICdQcm9qZWN0LVVSTCcpLAogICAgICAgICAgICAgICAgKCdtYWludGFpbmVyJywgJ01haW50YWluZXInKSwKICAgICAgICAgICAgICAgICgnbWFpbnRhaW5lcl9lbWFpbCcsICdNYWludGFpbmVyLWVtYWlsJyksCiAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIGtleSwgZmllbGRfbmFtZSBpbiBtYXBwaW5nXzFfMjoKICAgICAgICAgICAgICAgIGlmIG5vdCBza2lwX21pc3Npbmcgb3IgZmllbGRfbmFtZSBpbiBzZWxmLl9maWVsZHM6CiAgICAgICAgICAgICAgICAgICAgaWYga2V5ICE9ICdwcm9qZWN0X3VybCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IHNlbGZbZmllbGRfbmFtZV0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBbJywnLmpvaW4odSkgZm9yIHUgaW4gc2VsZltmaWVsZF9uYW1lXV0KCiAgICAgICAgZWxpZiBzZWxmWydNZXRhZGF0YS1WZXJzaW9uJ10gPT0gJzEuMSc6CiAgICAgICAgICAgIG1hcHBpbmdfMV8xID0gKAogICAgICAgICAgICAgICAgKCdwcm92aWRlcycsICdQcm92aWRlcycpLAogICAgICAgICAgICAgICAgKCdyZXF1aXJlcycsICdSZXF1aXJlcycpLAogICAgICAgICAgICAgICAgKCdvYnNvbGV0ZXMnLCAnT2Jzb2xldGVzJyksCiAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIGtleSwgZmllbGRfbmFtZSBpbiBtYXBwaW5nXzFfMToKICAgICAgICAgICAgICAgIGlmIG5vdCBza2lwX21pc3Npbmcgb3IgZmllbGRfbmFtZSBpbiBzZWxmLl9maWVsZHM6CiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gc2VsZltmaWVsZF9uYW1lXQoKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBhZGRfcmVxdWlyZW1lbnRzKHNlbGYsIHJlcXVpcmVtZW50cyk6CiAgICAgICAgaWYgc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddID09ICcxLjEnOgogICAgICAgICAgICAjIHdlIGNhbid0IGhhdmUgMS4xIG1ldGFkYXRhICphbmQqIFNldHVwdG9vbHMgcmVxdWlyZXMKICAgICAgICAgICAgZm9yIGZpZWxkIGluICgnT2Jzb2xldGVzJywgJ1JlcXVpcmVzJywgJ1Byb3ZpZGVzJyk6CiAgICAgICAgICAgICAgICBpZiBmaWVsZCBpbiBzZWxmOgogICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmW2ZpZWxkXQogICAgICAgIHNlbGZbJ1JlcXVpcmVzLURpc3QnXSArPSByZXF1aXJlbWVudHMKCiAgICAjIE1hcHBpbmcgQVBJCiAgICAjIFRPRE8gY291bGQgYWRkIGl0ZXIqIHZhcmlhbnRzCgogICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3QoX3ZlcnNpb24yZmllbGRsaXN0KHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSkpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzKCk6CiAgICAgICAgICAgIHlpZWxkIGtleQoKICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtzZWxmW2tleV0gZm9yIGtleSBpbiBzZWxmLmtleXMoKV0KCiAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFsoa2V5LCBzZWxmW2tleV0pIGZvciBrZXkgaW4gc2VsZi5rZXlzKCldCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPCVzICVzICVzPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmVyc2lvbikKCgpNRVRBREFUQV9GSUxFTkFNRSA9ICdweWRpc3QuanNvbicKV0hFRUxfTUVUQURBVEFfRklMRU5BTUUgPSAnbWV0YWRhdGEuanNvbicKCgpjbGFzcyBNZXRhZGF0YShvYmplY3QpOgogICAgIiIiCiAgICBUaGUgbWV0YWRhdGEgb2YgYSByZWxlYXNlLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgMi4wIChKU09OKQogICAgbWV0YWRhdGEgd2hlcmUgcG9zc2libGUuIElmIG5vdCBwb3NzaWJsZSwgaXQgd3JhcHMgYSBMZWdhY3lNZXRhZGF0YQogICAgaW5zdGFuY2Ugd2hpY2ggaGFuZGxlcyB0aGUga2V5LXZhbHVlIG1ldGFkYXRhIGZvcm1hdC4KICAgICIiIgoKICAgIE1FVEFEQVRBX1ZFUlNJT05fTUFUQ0hFUiA9IHJlLmNvbXBpbGUoJ15cZCsoXC5cZCspKiQnKQoKICAgIE5BTUVfTUFUQ0hFUiA9IHJlLmNvbXBpbGUoJ15bMC05QS1aXShbMC05QS1aXy4tXSpbMC05QS1aXSk/JCcsIHJlLkkpCgogICAgVkVSU0lPTl9NQVRDSEVSID0gUEVQNDQwX1ZFUlNJT05fUkUKCiAgICBTVU1NQVJZX01BVENIRVIgPSByZS5jb21waWxlKCcuezEsMjA0N30nKQoKICAgIE1FVEFEQVRBX1ZFUlNJT04gPSAnMi4wJwoKICAgIEdFTkVSQVRPUiA9ICdkaXN0bGliICglcyknICUgX192ZXJzaW9uX18KCiAgICBNQU5EQVRPUllfS0VZUyA9IHsKICAgICAgICAnbmFtZSc6ICgpLAogICAgICAgICd2ZXJzaW9uJzogKCksCiAgICAgICAgJ3N1bW1hcnknOiAoJ2xlZ2FjeScsKSwKICAgIH0KCiAgICBJTkRFWF9LRVlTID0gKCduYW1lIHZlcnNpb24gbGljZW5zZSBzdW1tYXJ5IGRlc2NyaXB0aW9uIGF1dGhvciAnCiAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwga2V5d29yZHMgcGxhdGZvcm0gaG9tZV9wYWdlIGNsYXNzaWZpZXJzICcKICAgICAgICAgICAgICAgICAgJ2Rvd25sb2FkX3VybCcpCgogICAgREVQRU5ERU5DWV9LRVlTID0gKCdleHRyYXMgcnVuX3JlcXVpcmVzIHRlc3RfcmVxdWlyZXMgYnVpbGRfcmVxdWlyZXMgJwogICAgICAgICAgICAgICAgICAgICAgICdkZXZfcmVxdWlyZXMgcHJvdmlkZXMgbWV0YV9yZXF1aXJlcyBvYnNvbGV0ZWRfYnkgJwogICAgICAgICAgICAgICAgICAgICAgICdzdXBwb3J0c19lbnZpcm9ubWVudHMnKQoKICAgIFNZTlRBWF9WQUxJREFUT1JTID0gewogICAgICAgICdtZXRhZGF0YV92ZXJzaW9uJzogKE1FVEFEQVRBX1ZFUlNJT05fTUFUQ0hFUiwgKCkpLAogICAgICAgICduYW1lJzogKE5BTUVfTUFUQ0hFUiwgKCdsZWdhY3knLCkpLAogICAgICAgICd2ZXJzaW9uJzogKFZFUlNJT05fTUFUQ0hFUiwgKCdsZWdhY3knLCkpLAogICAgICAgICdzdW1tYXJ5JzogKFNVTU1BUllfTUFUQ0hFUiwgKCdsZWdhY3knLCkpLAogICAgfQoKICAgIF9fc2xvdHNfXyA9ICgnX2xlZ2FjeScsICdfZGF0YScsICdzY2hlbWUnKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUsIGZpbGVvYmo9Tm9uZSwgbWFwcGluZz1Ob25lLAogICAgICAgICAgICAgICAgIHNjaGVtZT0nZGVmYXVsdCcpOgogICAgICAgIGlmIFtwYXRoLCBmaWxlb2JqLCBtYXBwaW5nXS5jb3VudChOb25lKSA8IDI6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigncGF0aCwgZmlsZW9iaiBhbmQgbWFwcGluZyBhcmUgZXhjbHVzaXZlJykKICAgICAgICBzZWxmLl9sZWdhY3kgPSBOb25lCiAgICAgICAgc2VsZi5fZGF0YSA9IE5vbmUKICAgICAgICBzZWxmLnNjaGVtZSA9IHNjaGVtZQogICAgICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICBpZiBtYXBwaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9tYXBwaW5nKG1hcHBpbmcsIHNjaGVtZSkKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGEgPSBtYXBwaW5nCiAgICAgICAgICAgIGV4Y2VwdCBNZXRhZGF0YVVucmVjb2duaXplZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgIHNlbGYuX2xlZ2FjeSA9IExlZ2FjeU1ldGFkYXRhKG1hcHBpbmc9bWFwcGluZywgc2NoZW1lPXNjaGVtZSkKICAgICAgICAgICAgICAgIHNlbGYudmFsaWRhdGUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRhdGEgPSBOb25lCiAgICAgICAgICAgIGlmIHBhdGg6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKICAgICAgICAgICAgZWxpZiBmaWxlb2JqOgogICAgICAgICAgICAgICAgZGF0YSA9IGZpbGVvYmoucmVhZCgpCiAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgSW5pdGlhbGlzZWQgd2l0aCBubyBhcmdzIC0gdG8gYmUgYWRkZWQKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgJ21ldGFkYXRhX3ZlcnNpb24nOiBzZWxmLk1FVEFEQVRBX1ZFUlNJT04sCiAgICAgICAgICAgICAgICAgICAgJ2dlbmVyYXRvcic6IHNlbGYuR0VORVJBVE9SLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhID0ganNvbi5sb2FkcyhkYXRhKQogICAgICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX21hcHBpbmcoc2VsZi5fZGF0YSwgc2NoZW1lKQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIyBOb3RlOiBNZXRhZGF0YVVucmVjb2duaXplZFZlcnNpb25FcnJvciBkb2VzIG5vdAogICAgICAgICAgICAgICAgICAgICMgaW5oZXJpdCBmcm9tIFZhbHVlRXJyb3IgKGl0J3MgYSBEaXN0bGliRXhjZXB0aW9uLAogICAgICAgICAgICAgICAgICAgICMgd2hpY2ggc2hvdWxkIG5vdCBpbmhlcml0IGZyb20gVmFsdWVFcnJvcikuCiAgICAgICAgICAgICAgICAgICAgIyBUaGUgVmFsdWVFcnJvciBjb21lcyBmcm9tIHRoZSBqc29uLmxvYWQgLSBpZiB0aGF0CiAgICAgICAgICAgICAgICAgICAgIyBzdWNjZWVkcyBhbmQgd2UgZ2V0IGEgdmFsaWRhdGlvbiBlcnJvciwgd2Ugd2FudAogICAgICAgICAgICAgICAgICAgICMgdGhhdCB0byBwcm9wYWdhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sZWdhY3kgPSBMZWdhY3lNZXRhZGF0YShmaWxlb2JqPVN0cmluZ0lPKGRhdGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZT1zY2hlbWUpCiAgICAgICAgICAgICAgICAgICAgc2VsZi52YWxpZGF0ZSgpCgogICAgY29tbW9uX2tleXMgPSBzZXQoKCduYW1lJywgJ3ZlcnNpb24nLCAnbGljZW5zZScsICdrZXl3b3JkcycsICdzdW1tYXJ5JykpCgogICAgbm9uZV9saXN0ID0gKE5vbmUsIGxpc3QpCiAgICBub25lX2RpY3QgPSAoTm9uZSwgZGljdCkKCiAgICBtYXBwZWRfa2V5cyA9IHsKICAgICAgICAncnVuX3JlcXVpcmVzJzogKCdSZXF1aXJlcy1EaXN0JywgbGlzdCksCiAgICAgICAgJ2J1aWxkX3JlcXVpcmVzJzogKCdTZXR1cC1SZXF1aXJlcy1EaXN0JywgbGlzdCksCiAgICAgICAgJ2Rldl9yZXF1aXJlcyc6IG5vbmVfbGlzdCwKICAgICAgICAndGVzdF9yZXF1aXJlcyc6IG5vbmVfbGlzdCwKICAgICAgICAnbWV0YV9yZXF1aXJlcyc6IG5vbmVfbGlzdCwKICAgICAgICAnZXh0cmFzJzogKCdQcm92aWRlcy1FeHRyYScsIGxpc3QpLAogICAgICAgICdtb2R1bGVzJzogbm9uZV9saXN0LAogICAgICAgICduYW1lc3BhY2VzJzogbm9uZV9saXN0LAogICAgICAgICdleHBvcnRzJzogbm9uZV9kaWN0LAogICAgICAgICdjb21tYW5kcyc6IG5vbmVfZGljdCwKICAgICAgICAnY2xhc3NpZmllcnMnOiAoJ0NsYXNzaWZpZXInLCBsaXN0KSwKICAgICAgICAnc291cmNlX3VybCc6ICgnRG93bmxvYWQtVVJMJywgTm9uZSksCiAgICAgICAgJ21ldGFkYXRhX3ZlcnNpb24nOiAoJ01ldGFkYXRhLVZlcnNpb24nLCBOb25lKSwKICAgIH0KCiAgICBkZWwgbm9uZV9saXN0LCBub25lX2RpY3QKCiAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBrZXkpOgogICAgICAgIGNvbW1vbiA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdjb21tb25fa2V5cycpCiAgICAgICAgbWFwcGVkID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ21hcHBlZF9rZXlzJykKICAgICAgICBpZiBrZXkgaW4gbWFwcGVkOgogICAgICAgICAgICBsaywgbWFrZXIgPSBtYXBwZWRba2V5XQogICAgICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgICAgICBpZiBsayBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUgaWYgbWFrZXIgaXMgTm9uZSBlbHNlIG1ha2VyKCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fbGVnYWN5LmdldChsaykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gTm9uZSBpZiBtYWtlciBpcyBOb25lIGVsc2UgbWFrZXIoKQogICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiAoJ2NvbW1hbmRzJywgJ2V4cG9ydHMnLCAnbW9kdWxlcycsICduYW1lc3BhY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbGFzc2lmaWVycycpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2RhdGEuZ2V0KGtleSwgdmFsdWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgc3BlY2lhbCBjYXNlcyBmb3IgUEVQIDQ1OQogICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsID0gb2JqZWN0KCkKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZW50aW5lbAogICAgICAgICAgICAgICAgICAgIGQgPSBzZWxmLl9kYXRhLmdldCgnZXh0ZW5zaW9ucycpCiAgICAgICAgICAgICAgICAgICAgaWYgZDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYga2V5ID09ICdjb21tYW5kcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkLmdldCgncHl0aG9uLmNvbW1hbmRzJywgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYga2V5ID09ICdjbGFzc2lmaWVycyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZC5nZXQoJ3B5dGhvbi5kZXRhaWxzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZC5nZXQoa2V5LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkLmdldCgncHl0aG9uLmV4cG9ydHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHNlbGYuX2RhdGEuZ2V0KCdweXRob24uZXhwb3J0cycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGQuZ2V0KGtleSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGlzIHNlbnRpbmVsOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZQogICAgICAgIGVsaWYga2V5IG5vdCBpbiBjb21tb246CiAgICAgICAgICAgIHJlc3VsdCA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIGtleSkKICAgICAgICBlbGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fbGVnYWN5LmdldChrZXkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZGF0YS5nZXQoa2V5KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX3ZhbGlkYXRlX3ZhbHVlKHNlbGYsIGtleSwgdmFsdWUsIHNjaGVtZT1Ob25lKToKICAgICAgICBpZiBrZXkgaW4gc2VsZi5TWU5UQVhfVkFMSURBVE9SUzoKICAgICAgICAgICAgcGF0dGVybiwgZXhjbHVzaW9ucyA9IHNlbGYuU1lOVEFYX1ZBTElEQVRPUlNba2V5XQogICAgICAgICAgICBpZiAoc2NoZW1lIG9yIHNlbGYuc2NoZW1lKSBub3QgaW4gZXhjbHVzaW9uczoKICAgICAgICAgICAgICAgIG0gPSBwYXR0ZXJuLm1hdGNoKHZhbHVlKQogICAgICAgICAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTWV0YWRhdGFJbnZhbGlkRXJyb3IoIiclcycgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgJyVzJyBwcm9wZXJ0eSIgJSAodmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KSkKCiAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fdmFsaWRhdGVfdmFsdWUoa2V5LCB2YWx1ZSkKICAgICAgICBjb21tb24gPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnY29tbW9uX2tleXMnKQogICAgICAgIG1hcHBlZCA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdtYXBwZWRfa2V5cycpCiAgICAgICAgaWYga2V5IGluIG1hcHBlZDoKICAgICAgICAgICAgbGssIF8gPSBtYXBwZWRba2V5XQogICAgICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgICAgICBpZiBsayBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICAgICAgICAgIHNlbGYuX2xlZ2FjeVtsa10gPSB2YWx1ZQogICAgICAgICAgICBlbGlmIGtleSBub3QgaW4gKCdjb21tYW5kcycsICdleHBvcnRzJywgJ21vZHVsZXMnLCAnbmFtZXNwYWNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJyk6CiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW2tleV0gPSB2YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBzcGVjaWFsIGNhc2VzIGZvciBQRVAgNDU5CiAgICAgICAgICAgICAgICBkID0gc2VsZi5fZGF0YS5zZXRkZWZhdWx0KCdleHRlbnNpb25zJywge30pCiAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1hbmRzJzoKICAgICAgICAgICAgICAgICAgICBkWydweXRob24uY29tbWFuZHMnXSA9IHZhbHVlCiAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAnY2xhc3NpZmllcnMnOgogICAgICAgICAgICAgICAgICAgIGQgPSBkLnNldGRlZmF1bHQoJ3B5dGhvbi5kZXRhaWxzJywge30pCiAgICAgICAgICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZCA9IGQuc2V0ZGVmYXVsdCgncHl0aG9uLmV4cG9ydHMnLCB7fSkKICAgICAgICAgICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQogICAgICAgIGVsaWYga2V5IG5vdCBpbiBjb21tb246CiAgICAgICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBrZXksIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGtleSA9PSAna2V5d29yZHMnOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZToKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdCgpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbXQogICAgICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgICAgICBzZWxmLl9sZWdhY3lba2V5XSA9IHZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW2tleV0gPSB2YWx1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5hbWVfYW5kX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIF9nZXRfbmFtZV9hbmRfdmVyc2lvbihzZWxmLm5hbWUsIHNlbGYudmVyc2lvbiwgVHJ1ZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcm92aWRlcyhzZWxmKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2xlZ2FjeVsnUHJvdmlkZXMtRGlzdCddCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZGF0YS5zZXRkZWZhdWx0KCdwcm92aWRlcycsIFtdKQogICAgICAgIHMgPSAnJXMgKCVzKScgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaWYgcyBub3QgaW4gcmVzdWx0OgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHMpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBwcm92aWRlcy5zZXR0ZXIKICAgIGRlZiBwcm92aWRlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICBzZWxmLl9sZWdhY3lbJ1Byb3ZpZGVzLURpc3QnXSA9IHZhbHVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZGF0YVsncHJvdmlkZXMnXSA9IHZhbHVlCgogICAgZGVmIGdldF9yZXF1aXJlbWVudHMoc2VsZiwgcmVxdHMsIGV4dHJhcz1Ob25lLCBlbnY9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQmFzZSBtZXRob2QgdG8gZ2V0IGRlcGVuZGVuY2llcywgZ2l2ZW4gYSBzZXQgb2YgZXh0cmFzCiAgICAgICAgdG8gc2F0aXNmeSBhbmQgYW4gb3B0aW9uYWwgZW52aXJvbm1lbnQgY29udGV4dC4KICAgICAgICA6cGFyYW0gcmVxdHM6IEEgbGlzdCBvZiBzb21ldGltZXMtd2FudGVkIGRlcGVuZGVuY2llcywKICAgICAgICAgICAgICAgICAgICAgIHBlcmhhcHMgZGVwZW5kZW50IG9uIGV4dHJhcyBhbmQgZW52aXJvbm1lbnQuCiAgICAgICAgOnBhcmFtIGV4dHJhczogQSBsaXN0IG9mIG9wdGlvbmFsIGNvbXBvbmVudHMgYmVpbmcgcmVxdWVzdGVkLgogICAgICAgIDpwYXJhbSBlbnY6IEFuIG9wdGlvbmFsIGVudmlyb25tZW50IGZvciBtYXJrZXIgZXZhbHVhdGlvbi4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJlc3VsdCA9IHJlcXRzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAgICAgZXh0cmFzID0gZ2V0X2V4dHJhcyhleHRyYXMgb3IgW10sIHNlbGYuZXh0cmFzKQogICAgICAgICAgICBmb3IgZCBpbiByZXF0czoKICAgICAgICAgICAgICAgIGlmICdleHRyYScgbm90IGluIGQgYW5kICdlbnZpcm9ubWVudCcgbm90IGluIGQ6CiAgICAgICAgICAgICAgICAgICAgIyB1bmNvbmRpdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IFRydWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgJ2V4dHJhJyBub3QgaW4gZDoKICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3QgZXh0cmEtZGVwZW5kZW50IC0gb25seSBlbnZpcm9ubWVudC1kZXBlbmRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gZC5nZXQoJ2V4dHJhJykgaW4gZXh0cmFzCiAgICAgICAgICAgICAgICAgICAgaWYgaW5jbHVkZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3QgZXhjbHVkZWQgYmVjYXVzZSBvZiBleHRyYXMsIGNoZWNrIGVudmlyb25tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGQuZ2V0KCdlbnZpcm9ubWVudCcpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1hcmtlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBpbnRlcnByZXQobWFya2VyLCBlbnYpCiAgICAgICAgICAgICAgICBpZiBpbmNsdWRlOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoZFsncmVxdWlyZXMnXSkKICAgICAgICAgICAgZm9yIGtleSBpbiAoJ2J1aWxkJywgJ2RldicsICd0ZXN0Jyk6CiAgICAgICAgICAgICAgICBlID0gJzolczonICUga2V5CiAgICAgICAgICAgICAgICBpZiBlIGluIGV4dHJhczoKICAgICAgICAgICAgICAgICAgICBleHRyYXMucmVtb3ZlKGUpCiAgICAgICAgICAgICAgICAgICAgIyBBIHJlY3Vyc2l2ZSBjYWxsLCBidXQgaXQgc2hvdWxkIHRlcm1pbmF0ZSBzaW5jZSAndGVzdCcKICAgICAgICAgICAgICAgICAgICAjIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZXh0cmFzCiAgICAgICAgICAgICAgICAgICAgcmVxdHMgPSBzZWxmLl9kYXRhLmdldCgnJXNfcmVxdWlyZXMnICUga2V5LCBbXSkKICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKHNlbGYuZ2V0X3JlcXVpcmVtZW50cyhyZXF0cywgZXh0cmFzPWV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52KSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQHByb3BlcnR5CiAgICBkZWYgZGljdGlvbmFyeShzZWxmKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mcm9tX2xlZ2FjeSgpCiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkZXBlbmRlbmNpZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RfYnlfa2V5KHNlbGYuX2RhdGEsIHNlbGYuREVQRU5ERU5DWV9LRVlTKQoKICAgIEBkZXBlbmRlbmNpZXMuc2V0dGVyCiAgICBkZWYgZGVwZW5kZW5jaWVzKHNlbGYsIHZhbHVlKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9kYXRhLnVwZGF0ZSh2YWx1ZSkKCiAgICBkZWYgX3ZhbGlkYXRlX21hcHBpbmcoc2VsZiwgbWFwcGluZywgc2NoZW1lKToKICAgICAgICBpZiBtYXBwaW5nLmdldCgnbWV0YWRhdGFfdmVyc2lvbicpICE9IHNlbGYuTUVUQURBVEFfVkVSU0lPTjoKICAgICAgICAgICAgcmFpc2UgTWV0YWRhdGFVbnJlY29nbml6ZWRWZXJzaW9uRXJyb3IoKQogICAgICAgIG1pc3NpbmcgPSBbXQogICAgICAgIGZvciBrZXksIGV4Y2x1c2lvbnMgaW4gc2VsZi5NQU5EQVRPUllfS0VZUy5pdGVtcygpOgogICAgICAgICAgICBpZiBrZXkgbm90IGluIG1hcHBpbmc6CiAgICAgICAgICAgICAgICBpZiBzY2hlbWUgbm90IGluIGV4Y2x1c2lvbnM6CiAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoa2V5KQogICAgICAgIGlmIG1pc3Npbmc6CiAgICAgICAgICAgIG1zZyA9ICdNaXNzaW5nIG1ldGFkYXRhIGl0ZW1zOiAlcycgJSAnLCAnLmpvaW4obWlzc2luZykKICAgICAgICAgICAgcmFpc2UgTWV0YWRhdGFNaXNzaW5nRXJyb3IobXNnKQogICAgICAgIGZvciBrLCB2IGluIG1hcHBpbmcuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfdmFsdWUoaywgdiwgc2NoZW1lKQoKICAgIGRlZiB2YWxpZGF0ZShzZWxmKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIG1pc3NpbmcsIHdhcm5pbmdzID0gc2VsZi5fbGVnYWN5LmNoZWNrKFRydWUpCiAgICAgICAgICAgIGlmIG1pc3Npbmcgb3Igd2FybmluZ3M6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnTWV0YWRhdGE6IG1pc3Npbmc6ICVzLCB3YXJuaW5nczogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZywgd2FybmluZ3MpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfbWFwcGluZyhzZWxmLl9kYXRhLCBzZWxmLnNjaGVtZSkKCiAgICBkZWYgdG9kaWN0KHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xlZ2FjeS50b2RpY3QoVHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBleHRyYWN0X2J5X2tleShzZWxmLl9kYXRhLCBzZWxmLklOREVYX0tFWVMpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2Zyb21fbGVnYWN5KHNlbGYpOgogICAgICAgIGFzc2VydCBzZWxmLl9sZWdhY3kgYW5kIG5vdCBzZWxmLl9kYXRhCiAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAnbWV0YWRhdGFfdmVyc2lvbic6IHNlbGYuTUVUQURBVEFfVkVSU0lPTiwKICAgICAgICAgICAgJ2dlbmVyYXRvcic6IHNlbGYuR0VORVJBVE9SLAogICAgICAgIH0KICAgICAgICBsbWQgPSBzZWxmLl9sZWdhY3kudG9kaWN0KFRydWUpICAgICAjIHNraXAgbWlzc2luZyBvbmVzCiAgICAgICAgZm9yIGsgaW4gKCduYW1lJywgJ3ZlcnNpb24nLCAnbGljZW5zZScsICdzdW1tYXJ5JywgJ2Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgJ2NsYXNzaWZpZXInKToKICAgICAgICAgICAgaWYgayBpbiBsbWQ6CiAgICAgICAgICAgICAgICBpZiBrID09ICdjbGFzc2lmaWVyJzoKICAgICAgICAgICAgICAgICAgICBuayA9ICdjbGFzc2lmaWVycycKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmsgPSBrCiAgICAgICAgICAgICAgICByZXN1bHRbbmtdID0gbG1kW2tdCiAgICAgICAga3cgPSBsbWQuZ2V0KCdLZXl3b3JkcycsIFtdKQogICAgICAgIGlmIGt3ID09IFsnJ106CiAgICAgICAgICAgIGt3ID0gW10KICAgICAgICByZXN1bHRbJ2tleXdvcmRzJ10gPSBrdwogICAgICAgIGtleXMgPSAoKCdyZXF1aXJlc19kaXN0JywgJ3J1bl9yZXF1aXJlcycpLAogICAgICAgICAgICAgICAgKCdzZXR1cF9yZXF1aXJlc19kaXN0JywgJ2J1aWxkX3JlcXVpcmVzJykpCiAgICAgICAgZm9yIG9rLCBuayBpbiBrZXlzOgogICAgICAgICAgICBpZiBvayBpbiBsbWQgYW5kIGxtZFtva106CiAgICAgICAgICAgICAgICByZXN1bHRbbmtdID0gW3sncmVxdWlyZXMnOiBsbWRbb2tdfV0KICAgICAgICByZXN1bHRbJ3Byb3ZpZGVzJ10gPSBzZWxmLnByb3ZpZGVzCiAgICAgICAgYXV0aG9yID0ge30KICAgICAgICBtYWludGFpbmVyID0ge30KICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgTEVHQUNZX01BUFBJTkcgPSB7CiAgICAgICAgJ25hbWUnOiAnTmFtZScsCiAgICAgICAgJ3ZlcnNpb24nOiAnVmVyc2lvbicsCiAgICAgICAgJ2xpY2Vuc2UnOiAnTGljZW5zZScsCiAgICAgICAgJ3N1bW1hcnknOiAnU3VtbWFyeScsCiAgICAgICAgJ2Rlc2NyaXB0aW9uJzogJ0Rlc2NyaXB0aW9uJywKICAgICAgICAnY2xhc3NpZmllcnMnOiAnQ2xhc3NpZmllcicsCiAgICB9CgogICAgZGVmIF90b19sZWdhY3koc2VsZik6CiAgICAgICAgZGVmIHByb2Nlc3NfZW50cmllcyhlbnRyaWVzKToKICAgICAgICAgICAgcmVxdHMgPSBzZXQoKQogICAgICAgICAgICBmb3IgZSBpbiBlbnRyaWVzOgogICAgICAgICAgICAgICAgZXh0cmEgPSBlLmdldCgnZXh0cmEnKQogICAgICAgICAgICAgICAgZW52ID0gZS5nZXQoJ2Vudmlyb25tZW50JykKICAgICAgICAgICAgICAgIHJsaXN0ID0gZVsncmVxdWlyZXMnXQogICAgICAgICAgICAgICAgZm9yIHIgaW4gcmxpc3Q6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGVudiBhbmQgbm90IGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICByZXF0cy5hZGQocikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSAnJwogICAgICAgICAgICAgICAgICAgICAgICBpZiBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9ICdleHRyYSA9PSAiJXMiJyAlIGV4dHJhCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1hcmtlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSAnKCVzKSBhbmQgJXMnICUgKGVudiwgbWFya2VyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBlbnYKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdHMuYWRkKCc7Jy5qb2luKChyLCBtYXJrZXIpKSkKICAgICAgICAgICAgcmV0dXJuIHJlcXRzCgogICAgICAgIGFzc2VydCBzZWxmLl9kYXRhIGFuZCBub3Qgc2VsZi5fbGVnYWN5CiAgICAgICAgcmVzdWx0ID0gTGVnYWN5TWV0YWRhdGEoKQogICAgICAgIG5tZCA9IHNlbGYuX2RhdGEKICAgICAgICBmb3IgbmssIG9rIGluIHNlbGYuTEVHQUNZX01BUFBJTkcuaXRlbXMoKToKICAgICAgICAgICAgaWYgbmsgaW4gbm1kOgogICAgICAgICAgICAgICAgcmVzdWx0W29rXSA9IG5tZFtua10KICAgICAgICByMSA9IHByb2Nlc3NfZW50cmllcyhzZWxmLnJ1bl9yZXF1aXJlcyArIHNlbGYubWV0YV9yZXF1aXJlcykKICAgICAgICByMiA9IHByb2Nlc3NfZW50cmllcyhzZWxmLmJ1aWxkX3JlcXVpcmVzICsgc2VsZi5kZXZfcmVxdWlyZXMpCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHJlc3VsdFsnUHJvdmlkZXMtRXh0cmEnXSA9IHNvcnRlZChzZWxmLmV4dHJhcykKICAgICAgICByZXN1bHRbJ1JlcXVpcmVzLURpc3QnXSA9IHNvcnRlZChyMSkKICAgICAgICByZXN1bHRbJ1NldHVwLVJlcXVpcmVzLURpc3QnXSA9IHNvcnRlZChyMikKICAgICAgICAjIFRPRE86IG90aGVyIGZpZWxkcyBzdWNoIGFzIGNvbnRhY3RzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB3cml0ZShzZWxmLCBwYXRoPU5vbmUsIGZpbGVvYmo9Tm9uZSwgbGVnYWN5PUZhbHNlLCBza2lwX3Vua25vd249VHJ1ZSk6CiAgICAgICAgaWYgW3BhdGgsIGZpbGVvYmpdLmNvdW50KE5vbmUpICE9IDE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0V4YWN0bHkgb25lIG9mIHBhdGggYW5kIGZpbGVvYmogaXMgbmVlZGVkJykKICAgICAgICBzZWxmLnZhbGlkYXRlKCkKICAgICAgICBpZiBsZWdhY3k6CiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIGxlZ2FjeV9tZCA9IHNlbGYuX2xlZ2FjeQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGVnYWN5X21kID0gc2VsZi5fdG9fbGVnYWN5KCkKICAgICAgICAgICAgaWYgcGF0aDoKICAgICAgICAgICAgICAgIGxlZ2FjeV9tZC53cml0ZShwYXRoLCBza2lwX3Vua25vd249c2tpcF91bmtub3duKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGVnYWN5X21kLndyaXRlX2ZpbGUoZmlsZW9iaiwgc2tpcF91bmtub3duPXNraXBfdW5rbm93bikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgICAgICBkID0gc2VsZi5fZnJvbV9sZWdhY3koKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZCA9IHNlbGYuX2RhdGEKICAgICAgICAgICAgaWYgZmlsZW9iajoKICAgICAgICAgICAgICAgIGpzb24uZHVtcChkLCBmaWxlb2JqLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgaW5kZW50PTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydF9rZXlzPVRydWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHBhdGgsICd3JywgJ3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgICAgICAgICBqc29uLmR1bXAoZCwgZiwgZW5zdXJlX2FzY2lpPVRydWUsIGluZGVudD0yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0X2tleXM9VHJ1ZSkKCiAgICBkZWYgYWRkX3JlcXVpcmVtZW50cyhzZWxmLCByZXF1aXJlbWVudHMpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgc2VsZi5fbGVnYWN5LmFkZF9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJ1bl9yZXF1aXJlcyA9IHNlbGYuX2RhdGEuc2V0ZGVmYXVsdCgncnVuX3JlcXVpcmVzJywgW10pCiAgICAgICAgICAgIGFsd2F5cyA9IE5vbmUKICAgICAgICAgICAgZm9yIGVudHJ5IGluIHJ1bl9yZXF1aXJlczoKICAgICAgICAgICAgICAgIGlmICdlbnZpcm9ubWVudCcgbm90IGluIGVudHJ5IGFuZCAnZXh0cmEnIG5vdCBpbiBlbnRyeToKICAgICAgICAgICAgICAgICAgICBhbHdheXMgPSBlbnRyeQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIGFsd2F5cyBpcyBOb25lOgogICAgICAgICAgICAgICAgYWx3YXlzID0geyAncmVxdWlyZXMnOiByZXF1aXJlbWVudHMgfQogICAgICAgICAgICAgICAgcnVuX3JlcXVpcmVzLmluc2VydCgwLCBhbHdheXMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByc2V0ID0gc2V0KGFsd2F5c1sncmVxdWlyZXMnXSkgfCBzZXQocmVxdWlyZW1lbnRzKQogICAgICAgICAgICAgICAgYWx3YXlzWydyZXF1aXJlcyddID0gc29ydGVkKHJzZXQpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIG5hbWUgPSBzZWxmLm5hbWUgb3IgJyhubyBuYW1lKScKICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uIG9yICdubyB2ZXJzaW9uJwogICAgICAgIHJldHVybiAnPCVzICVzICVzICglcyk+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YV92ZXJzaW9uLCBuYW1lLCB2ZXJzaW9uKQpQSwMEFAAAAAAAAAAhAMi3RZgOKgAADioAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvcmVzb3VyY2VzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMy0yMDE2IFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgYmlzZWN0CmltcG9ydCBpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwppbXBvcnQgemlwaW1wb3J0Cgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24KZnJvbSAudXRpbCBpbXBvcnQgY2FjaGVkX3Byb3BlcnR5LCBnZXRfY2FjaGVfYmFzZSwgcGF0aF90b19jYWNoZV9kaXIsIENhY2hlCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjYWNoZSA9IE5vbmUgICAgIyBjcmVhdGVkIHdoZW4gbmVlZGVkCgoKY2xhc3MgUmVzb3VyY2VDYWNoZShDYWNoZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgYmFzZT1Ob25lKToKICAgICAgICBpZiBiYXNlIGlzIE5vbmU6CiAgICAgICAgICAgICMgVXNlIG5hdGl2ZSBzdHJpbmcgdG8gYXZvaWQgaXNzdWVzIG9uIDIueDogc2VlIFB5dGhvbiAjMjAxNDAuCiAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oZ2V0X2NhY2hlX2Jhc2UoKSwgc3RyKCdyZXNvdXJjZS1jYWNoZScpKQogICAgICAgIHN1cGVyKFJlc291cmNlQ2FjaGUsIHNlbGYpLl9faW5pdF9fKGJhc2UpCgogICAgZGVmIGlzX3N0YWxlKHNlbGYsIHJlc291cmNlLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBJcyB0aGUgY2FjaGUgc3RhbGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZT8KCiAgICAgICAgOnBhcmFtIHJlc291cmNlOiBUaGUgOmNsYXNzOmBSZXNvdXJjZWAgYmVpbmcgY2FjaGVkLgogICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIGNhY2hlLgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgdGhlIGNhY2hlIGlzIHN0YWxlLgogICAgICAgICIiIgogICAgICAgICMgQ2FjaGUgaW52YWxpZGF0aW9uIGlzIGEgaGFyZCBwcm9ibGVtIDotKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGdldChzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgcmVzb3VyY2UgaW50byB0aGUgY2FjaGUsCgogICAgICAgIDpwYXJhbSByZXNvdXJjZTogQSA6Y2xhc3M6YFJlc291cmNlYCBpbnN0YW5jZS4KICAgICAgICA6cmV0dXJuOiBUaGUgcGF0aG5hbWUgb2YgdGhlIHJlc291cmNlIGluIHRoZSBjYWNoZS4KICAgICAgICAiIiIKICAgICAgICBwcmVmaXgsIHBhdGggPSByZXNvdXJjZS5maW5kZXIuZ2V0X2NhY2hlX2luZm8ocmVzb3VyY2UpCiAgICAgICAgaWYgcHJlZml4IGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IHBhdGgKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlLCBzZWxmLnByZWZpeF90b19kaXIocHJlZml4KSwgcGF0aCkKICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShyZXN1bHQpCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoZGlybmFtZSkKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHJlc3VsdCk6CiAgICAgICAgICAgICAgICBzdGFsZSA9IFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN0YWxlID0gc2VsZi5pc19zdGFsZShyZXNvdXJjZSwgcGF0aCkKICAgICAgICAgICAgaWYgc3RhbGU6CiAgICAgICAgICAgICAgICAjIHdyaXRlIHRoZSBieXRlcyBvZiB0aGUgcmVzb3VyY2UgdG8gdGhlIGNhY2hlIGxvY2F0aW9uCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocmVzdWx0LCAnd2InKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUocmVzb3VyY2UuYnl0ZXMpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIFJlc291cmNlQmFzZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbmRlciwgbmFtZSk6CiAgICAgICAgc2VsZi5maW5kZXIgPSBmaW5kZXIKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCgoKY2xhc3MgUmVzb3VyY2UoUmVzb3VyY2VCYXNlKToKICAgICIiIgogICAgQSBjbGFzcyByZXByZXNlbnRpbmcgYW4gaW4tcGFja2FnZSByZXNvdXJjZSwgc3VjaCBhcyBhIGRhdGEgZmlsZS4gVGhpcyBpcwogICAgbm90IG5vcm1hbGx5IGluc3RhbnRpYXRlZCBieSB1c2VyIGNvZGUsIGJ1dCByYXRoZXIgYnkgYQogICAgOmNsYXNzOmBSZXNvdXJjZUZpbmRlcmAgd2hpY2ggbWFuYWdlcyB0aGUgcmVzb3VyY2UuCiAgICAiIiIKICAgIGlzX2NvbnRhaW5lciA9IEZhbHNlICAgICAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgogICAgZGVmIGFzX3N0cmVhbShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIHJlc291cmNlIGFzIGEgc3RyZWFtLgoKICAgICAgICBUaGlzIGlzIG5vdCBhIHByb3BlcnR5IHRvIG1ha2UgaXQgb2J2aW91cyB0aGF0IGl0IHJldHVybnMgYSBuZXcgc3RyZWFtCiAgICAgICAgZWFjaCB0aW1lLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmZpbmRlci5nZXRfc3RyZWFtKHNlbGYpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGZpbGVfcGF0aChzZWxmKToKICAgICAgICBnbG9iYWwgY2FjaGUKICAgICAgICBpZiBjYWNoZSBpcyBOb25lOgogICAgICAgICAgICBjYWNoZSA9IFJlc291cmNlQ2FjaGUoKQogICAgICAgIHJldHVybiBjYWNoZS5nZXQoc2VsZikKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgYnl0ZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmluZGVyLmdldF9ieXRlcyhzZWxmKQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBzaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmZpbmRlci5nZXRfc2l6ZShzZWxmKQoKCmNsYXNzIFJlc291cmNlQ29udGFpbmVyKFJlc291cmNlQmFzZSk6CiAgICBpc19jb250YWluZXIgPSBUcnVlICAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIHJlc291cmNlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5maW5kZXIuZ2V0X3Jlc291cmNlcyhzZWxmKQoKCmNsYXNzIFJlc291cmNlRmluZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIFJlc291cmNlIGZpbmRlciBmb3IgZmlsZSBzeXN0ZW0gcmVzb3VyY2VzLgogICAgIiIiCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICAgICBza2lwcGVkX2V4dGVuc2lvbnMgPSAoJy5weWMnLCAnLnB5bycsICcuY2xhc3MnKQogICAgZWxzZToKICAgICAgICBza2lwcGVkX2V4dGVuc2lvbnMgPSAoJy5weWMnLCAnLnB5bycpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgc2VsZi5tb2R1bGUgPSBtb2R1bGUKICAgICAgICBzZWxmLmxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgICAgc2VsZi5iYXNlID0gb3MucGF0aC5kaXJuYW1lKGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCAnJykpCgogICAgZGVmIF9hZGp1c3RfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5yZWFscGF0aChwYXRoKQoKICAgIGRlZiBfbWFrZV9wYXRoKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgICMgSXNzdWUgIzUwOiBuZWVkIHRvIHByZXNlcnZlIHR5cGUgb2YgcGF0aCBvbiBQeXRob24gMi54CiAgICAgICAgIyBsaWtlIG9zLnBhdGguX2dldF9zZXAKICAgICAgICBpZiBpc2luc3RhbmNlKHJlc291cmNlX25hbWUsIGJ5dGVzKTogICAgIyBzaG91bGQgb25seSBoYXBwZW4gb24gMi54CiAgICAgICAgICAgIHNlcCA9IGInLycKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZXAgPSAnLycKICAgICAgICBwYXJ0cyA9IHJlc291cmNlX25hbWUuc3BsaXQoc2VwKQogICAgICAgIHBhcnRzLmluc2VydCgwLCBzZWxmLmJhc2UpCiAgICAgICAgcmVzdWx0ID0gb3MucGF0aC5qb2luKCpwYXJ0cykKICAgICAgICByZXR1cm4gc2VsZi5fYWRqdXN0X3BhdGgocmVzdWx0KQoKICAgIGRlZiBfZmluZChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKCiAgICBkZWYgZ2V0X2NhY2hlX2luZm8oc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBOb25lLCByZXNvdXJjZS5wYXRoCgogICAgZGVmIGZpbmQoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcGF0aCA9IHNlbGYuX21ha2VfcGF0aChyZXNvdXJjZV9uYW1lKQogICAgICAgIGlmIG5vdCBzZWxmLl9maW5kKHBhdGgpOgogICAgICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc2VsZi5faXNfZGlyZWN0b3J5KHBhdGgpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzb3VyY2VDb250YWluZXIoc2VsZiwgcmVzb3VyY2VfbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc291cmNlKHNlbGYsIHJlc291cmNlX25hbWUpCiAgICAgICAgICAgIHJlc3VsdC5wYXRoID0gcGF0aAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0X3N0cmVhbShzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIG9wZW4ocmVzb3VyY2UucGF0aCwgJ3JiJykKCiAgICBkZWYgZ2V0X2J5dGVzKHNlbGYsIHJlc291cmNlKToKICAgICAgICB3aXRoIG9wZW4ocmVzb3VyY2UucGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCgogICAgZGVmIGdldF9zaXplKHNlbGYsIHJlc291cmNlKToKICAgICAgICByZXR1cm4gb3MucGF0aC5nZXRzaXplKHJlc291cmNlLnBhdGgpCgogICAgZGVmIGdldF9yZXNvdXJjZXMoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIGRlZiBhbGxvd2VkKGYpOgogICAgICAgICAgICByZXR1cm4gKGYgIT0gJ19fcHljYWNoZV9fJyBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgZi5lbmRzd2l0aChzZWxmLnNraXBwZWRfZXh0ZW5zaW9ucykpCiAgICAgICAgcmV0dXJuIHNldChbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKHJlc291cmNlLnBhdGgpIGlmIGFsbG93ZWQoZildKQoKICAgIGRlZiBpc19jb250YWluZXIoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBzZWxmLl9pc19kaXJlY3RvcnkocmVzb3VyY2UucGF0aCkKCiAgICBfaXNfZGlyZWN0b3J5ID0gc3RhdGljbWV0aG9kKG9zLnBhdGguaXNkaXIpCgogICAgZGVmIGl0ZXJhdG9yKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJlc291cmNlID0gc2VsZi5maW5kKHJlc291cmNlX25hbWUpCiAgICAgICAgaWYgcmVzb3VyY2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRvZG8gPSBbcmVzb3VyY2VdCiAgICAgICAgICAgIHdoaWxlIHRvZG86CiAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHRvZG8ucG9wKDApCiAgICAgICAgICAgICAgICB5aWVsZCByZXNvdXJjZQogICAgICAgICAgICAgICAgaWYgcmVzb3VyY2UuaXNfY29udGFpbmVyOgogICAgICAgICAgICAgICAgICAgIHJuYW1lID0gcmVzb3VyY2UubmFtZQogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHJlc291cmNlLnJlc291cmNlczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJuYW1lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X25hbWUgPSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZSA9ICcvJy5qb2luKFtybmFtZSwgbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gc2VsZi5maW5kKG5ld19uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGlsZC5pc19jb250YWluZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RvLmFwcGVuZChjaGlsZCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGNoaWxkCgoKY2xhc3MgWmlwUmVzb3VyY2VGaW5kZXIoUmVzb3VyY2VGaW5kZXIpOgogICAgIiIiCiAgICBSZXNvdXJjZSBmaW5kZXIgZm9yIHJlc291cmNlcyBpbiAuemlwIGZpbGVzLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBzdXBlcihaaXBSZXNvdXJjZUZpbmRlciwgc2VsZikuX19pbml0X18obW9kdWxlKQogICAgICAgIGFyY2hpdmUgPSBzZWxmLmxvYWRlci5hcmNoaXZlCiAgICAgICAgc2VsZi5wcmVmaXhfbGVuID0gMSArIGxlbihhcmNoaXZlKQogICAgICAgICMgUHlQeSBkb2Vzbid0IGhhdmUgYSBfZmlsZXMgYXR0ciBvbiB6aXBpbXBvcnRlciwgYW5kIHlvdSBjYW4ndCBzZXQgb25lCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLmxvYWRlciwgJ19maWxlcycpOgogICAgICAgICAgICBzZWxmLl9maWxlcyA9IHNlbGYubG9hZGVyLl9maWxlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2ZpbGVzID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW2FyY2hpdmVdCiAgICAgICAgc2VsZi5pbmRleCA9IHNvcnRlZChzZWxmLl9maWxlcykKCiAgICBkZWYgX2FkanVzdF9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9maW5kKHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSBwYXRoW3NlbGYucHJlZml4X2xlbjpdCiAgICAgICAgaWYgcGF0aCBpbiBzZWxmLl9maWxlczoKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHBhdGggYW5kIHBhdGhbLTFdICE9IG9zLnNlcDoKICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoICsgb3Muc2VwCiAgICAgICAgICAgIGkgPSBiaXNlY3QuYmlzZWN0KHNlbGYuaW5kZXgsIHBhdGgpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuaW5kZXhbaV0uc3RhcnRzd2l0aChwYXRoKQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdfZmluZCBmYWlsZWQ6ICVyICVyJywgcGF0aCwgc2VsZi5sb2FkZXIucHJlZml4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnX2ZpbmQgd29ya2VkOiAlciAlcicsIHBhdGgsIHNlbGYubG9hZGVyLnByZWZpeCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldF9jYWNoZV9pbmZvKHNlbGYsIHJlc291cmNlKToKICAgICAgICBwcmVmaXggPSBzZWxmLmxvYWRlci5hcmNoaXZlCiAgICAgICAgcGF0aCA9IHJlc291cmNlLnBhdGhbMSArIGxlbihwcmVmaXgpOl0KICAgICAgICByZXR1cm4gcHJlZml4LCBwYXRoCgogICAgZGVmIGdldF9ieXRlcyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmdldF9kYXRhKHJlc291cmNlLnBhdGgpCgogICAgZGVmIGdldF9zdHJlYW0oc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBpby5CeXRlc0lPKHNlbGYuZ2V0X2J5dGVzKHJlc291cmNlKSkKCiAgICBkZWYgZ2V0X3NpemUoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHBhdGggPSByZXNvdXJjZS5wYXRoW3NlbGYucHJlZml4X2xlbjpdCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzW3BhdGhdWzNdCgogICAgZGVmIGdldF9yZXNvdXJjZXMoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHBhdGggPSByZXNvdXJjZS5wYXRoW3NlbGYucHJlZml4X2xlbjpdCiAgICAgICAgaWYgcGF0aCBhbmQgcGF0aFstMV0gIT0gb3Muc2VwOgogICAgICAgICAgICBwYXRoICs9IG9zLnNlcAogICAgICAgIHBsZW4gPSBsZW4ocGF0aCkKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIGkgPSBiaXNlY3QuYmlzZWN0KHNlbGYuaW5kZXgsIHBhdGgpCiAgICAgICAgd2hpbGUgaSA8IGxlbihzZWxmLmluZGV4KToKICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5kZXhbaV0uc3RhcnRzd2l0aChwYXRoKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHMgPSBzZWxmLmluZGV4W2ldW3BsZW46XQogICAgICAgICAgICByZXN1bHQuYWRkKHMuc3BsaXQob3Muc2VwLCAxKVswXSkgICAjIG9ubHkgaW1tZWRpYXRlIGNoaWxkcmVuCiAgICAgICAgICAgIGkgKz0gMQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2lzX2RpcmVjdG9yeShzZWxmLCBwYXRoKToKICAgICAgICBwYXRoID0gcGF0aFtzZWxmLnByZWZpeF9sZW46XQogICAgICAgIGlmIHBhdGggYW5kIHBhdGhbLTFdICE9IG9zLnNlcDoKICAgICAgICAgICAgcGF0aCArPSBvcy5zZXAKICAgICAgICBpID0gYmlzZWN0LmJpc2VjdChzZWxmLmluZGV4LCBwYXRoKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5pbmRleFtpXS5zdGFydHN3aXRoKHBhdGgpCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKX2ZpbmRlcl9yZWdpc3RyeSA9IHsKICAgIHR5cGUoTm9uZSk6IFJlc291cmNlRmluZGVyLAogICAgemlwaW1wb3J0LnppcGltcG9ydGVyOiBaaXBSZXNvdXJjZUZpbmRlcgp9Cgp0cnk6CiAgICAjIEluIFB5dGhvbiAzLjYsIF9mcm96ZW5faW1wb3J0bGliIC0+IF9mcm96ZW5faW1wb3J0bGliX2V4dGVybmFsCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IF9mcm96ZW5faW1wb3J0bGliX2V4dGVybmFsIGFzIF9maQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGltcG9ydCBfZnJvemVuX2ltcG9ydGxpYiBhcyBfZmkKICAgIF9maW5kZXJfcmVnaXN0cnlbX2ZpLlNvdXJjZUZpbGVMb2FkZXJdID0gUmVzb3VyY2VGaW5kZXIKICAgIF9maW5kZXJfcmVnaXN0cnlbX2ZpLkZpbGVGaW5kZXJdID0gUmVzb3VyY2VGaW5kZXIKICAgIGRlbCBfZmkKZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgcGFzcwoKCmRlZiByZWdpc3Rlcl9maW5kZXIobG9hZGVyLCBmaW5kZXJfbWFrZXIpOgogICAgX2ZpbmRlcl9yZWdpc3RyeVt0eXBlKGxvYWRlcildID0gZmluZGVyX21ha2VyCgpfZmluZGVyX2NhY2hlID0ge30KCgpkZWYgZmluZGVyKHBhY2thZ2UpOgogICAgIiIiCiAgICBSZXR1cm4gYSByZXNvdXJjZSBmaW5kZXIgZm9yIGEgcGFja2FnZS4KICAgIDpwYXJhbSBwYWNrYWdlOiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZS4KICAgIDpyZXR1cm46IEEgOmNsYXNzOmBSZXNvdXJjZUZpbmRlcmAgaW5zdGFuY2UgZm9yIHRoZSBwYWNrYWdlLgogICAgIiIiCiAgICBpZiBwYWNrYWdlIGluIF9maW5kZXJfY2FjaGU6CiAgICAgICAgcmVzdWx0ID0gX2ZpbmRlcl9jYWNoZVtwYWNrYWdlXQogICAgZWxzZToKICAgICAgICBpZiBwYWNrYWdlIG5vdCBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgX19pbXBvcnRfXyhwYWNrYWdlKQogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW3BhY2thZ2VdCiAgICAgICAgcGF0aCA9IGdldGF0dHIobW9kdWxlLCAnX19wYXRoX18nLCBOb25lKQogICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignWW91IGNhbm5vdCBnZXQgYSBmaW5kZXIgZm9yIGEgbW9kdWxlLCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHkgZm9yIGEgcGFja2FnZScpCiAgICAgICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgICAgICBmaW5kZXJfbWFrZXIgPSBfZmluZGVyX3JlZ2lzdHJ5LmdldCh0eXBlKGxvYWRlcikpCiAgICAgICAgaWYgZmluZGVyX21ha2VyIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ1VuYWJsZSB0byBsb2NhdGUgZmluZGVyIGZvciAlcicgJSBwYWNrYWdlKQogICAgICAgIHJlc3VsdCA9IGZpbmRlcl9tYWtlcihtb2R1bGUpCiAgICAgICAgX2ZpbmRlcl9jYWNoZVtwYWNrYWdlXSA9IHJlc3VsdAogICAgcmV0dXJuIHJlc3VsdAoKCl9kdW1teV9tb2R1bGUgPSB0eXBlcy5Nb2R1bGVUeXBlKHN0cignX19kdW1teV9fJykpCgoKZGVmIGZpbmRlcl9mb3JfcGF0aChwYXRoKToKICAgICIiIgogICAgUmV0dXJuIGEgcmVzb3VyY2UgZmluZGVyIGZvciBhIHBhdGgsIHdoaWNoIHNob3VsZCByZXByZXNlbnQgYSBjb250YWluZXIuCgogICAgOnBhcmFtIHBhdGg6IFRoZSBwYXRoLgogICAgOnJldHVybjogQSA6Y2xhc3M6YFJlc291cmNlRmluZGVyYCBpbnN0YW5jZSBmb3IgdGhlIHBhdGguCiAgICAiIiIKICAgIHJlc3VsdCA9IE5vbmUKICAgICMgY2FsbHMgYW55IHBhdGggaG9va3MsIGdldHMgaW1wb3J0ZXIgaW50byBjYWNoZQogICAgcGtndXRpbC5nZXRfaW1wb3J0ZXIocGF0aCkKICAgIGxvYWRlciA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmdldChwYXRoKQogICAgZmluZGVyID0gX2ZpbmRlcl9yZWdpc3RyeS5nZXQodHlwZShsb2FkZXIpKQogICAgaWYgZmluZGVyOgogICAgICAgIG1vZHVsZSA9IF9kdW1teV9tb2R1bGUKICAgICAgICBtb2R1bGUuX19maWxlX18gPSBvcy5wYXRoLmpvaW4ocGF0aCwgJycpCiAgICAgICAgbW9kdWxlLl9fbG9hZGVyX18gPSBsb2FkZXIKICAgICAgICByZXN1bHQgPSBmaW5kZXIobW9kdWxlKQogICAgcmV0dXJuIHJlc3VsdApQSwMEFAAAAAAAAAAhALr/69t4OwAAeDsAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvc2NyaXB0cy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNSBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3RydWN0CmltcG9ydCBzeXMKCmZyb20gLmNvbXBhdCBpbXBvcnQgc3lzY29uZmlnLCBkZXRlY3RfZW5jb2RpbmcsIFppcEZpbGUKZnJvbSAucmVzb3VyY2VzIGltcG9ydCBmaW5kZXIKZnJvbSAudXRpbCBpbXBvcnQgKEZpbGVPcGVyYXRvciwgZ2V0X2V4cG9ydF9lbnRyeSwgY29udmVydF9wYXRoLAogICAgICAgICAgICAgICAgICAgZ2V0X2V4ZWN1dGFibGUsIGluX3ZlbnYpCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCl9ERUZBVUxUX01BTklGRVNUID0gJycnCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPGFzc2VtYmx5IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiPgogPGFzc2VtYmx5SWRlbnRpdHkgdmVyc2lvbj0iMS4wLjAuMCIKIHByb2Nlc3NvckFyY2hpdGVjdHVyZT0iWDg2IgogbmFtZT0iJXMiCiB0eXBlPSJ3aW4zMiIvPgoKIDwhLS0gSWRlbnRpZnkgdGhlIGFwcGxpY2F0aW9uIHNlY3VyaXR5IHJlcXVpcmVtZW50cy4gLS0+CiA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+CiA8c2VjdXJpdHk+CiA8cmVxdWVzdGVkUHJpdmlsZWdlcz4KIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiLz4KIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4KIDwvc2VjdXJpdHk+CiA8L3RydXN0SW5mbz4KPC9hc3NlbWJseT4nJycuc3RyaXAoKQoKIyBjaGVjayBpZiBQeXRob24gaXMgY2FsbGVkIG9uIHRoZSBmaXJzdCBsaW5lIHdpdGggdGhpcyBleHByZXNzaW9uCkZJUlNUX0xJTkVfUkUgPSByZS5jb21waWxlKGInXiMhLipweXRob253P1swLTkuXSooWyBcdF0uKik/JCcpClNDUklQVF9URU1QTEFURSA9ICcnJyMgLSotIGNvZGluZzogdXRmLTggLSotCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpbXBvcnQgc3lzLCByZQoKICAgIGRlZiBfcmVzb2x2ZShtb2R1bGUsIGZ1bmMpOgogICAgICAgIF9faW1wb3J0X18obW9kdWxlKQogICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW21vZHVsZV0KICAgICAgICBwYXJ0cyA9IGZ1bmMuc3BsaXQoJy4nKQogICAgICAgIHJlc3VsdCA9IGdldGF0dHIobW9kLCBwYXJ0cy5wb3AoMCkpCiAgICAgICAgZm9yIHAgaW4gcGFydHM6CiAgICAgICAgICAgIHJlc3VsdCA9IGdldGF0dHIocmVzdWx0LCBwKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICB0cnk6CiAgICAgICAgc3lzLmFyZ3ZbMF0gPSByZS5zdWIocicoLXNjcmlwdFwucHl3P3xcLmV4ZSk/JCcsICcnLCBzeXMuYXJndlswXSkKCiAgICAgICAgZnVuYyA9IF9yZXNvbHZlKCclKG1vZHVsZSlzJywgJyUoZnVuYylzJykKICAgICAgICByYyA9IGZ1bmMoKSAjIE5vbmUgaW50ZXJwcmV0ZWQgYXMgMAogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAgIyBvbmx5IHN1cHBvcnRpbmcgUHl0aG9uID49IDIuNgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJyUlc1xcbicgJSUgZSkKICAgICAgICByYyA9IDEKICAgIHN5cy5leGl0KHJjKQonJycKCgpkZWYgX2VucXVvdGVfZXhlY3V0YWJsZShleGVjdXRhYmxlKToKICAgIGlmICcgJyBpbiBleGVjdXRhYmxlOgogICAgICAgICMgbWFrZSBzdXJlIHdlIHF1b3RlIG9ubHkgdGhlIGV4ZWN1dGFibGUgaW4gY2FzZSBvZiBlbnYKICAgICAgICAjIGZvciBleGFtcGxlIC91c3IvYmluL2VudiAiL2RpciB3aXRoIHNwYWNlcy9iaW4vanl0aG9uIgogICAgICAgICMgaW5zdGVhZCBvZiAiL3Vzci9iaW4vZW52IC9kaXIgd2l0aCBzcGFjZXMvYmluL2p5dGhvbiIKICAgICAgICAjIG90aGVyd2lzZSB3aG9sZQogICAgICAgIGlmIGV4ZWN1dGFibGUuc3RhcnRzd2l0aCgnL3Vzci9iaW4vZW52ICcpOgogICAgICAgICAgICBlbnYsIF9leGVjdXRhYmxlID0gZXhlY3V0YWJsZS5zcGxpdCgnICcsIDEpCiAgICAgICAgICAgIGlmICcgJyBpbiBfZXhlY3V0YWJsZSBhbmQgbm90IF9leGVjdXRhYmxlLnN0YXJ0c3dpdGgoJyInKToKICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSAnJXMgIiVzIicgJSAoZW52LCBfZXhlY3V0YWJsZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3QgZXhlY3V0YWJsZS5zdGFydHN3aXRoKCciJyk6CiAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gJyIlcyInICUgZXhlY3V0YWJsZQogICAgcmV0dXJuIGV4ZWN1dGFibGUKCgpjbGFzcyBTY3JpcHRNYWtlcihvYmplY3QpOgogICAgIiIiCiAgICBBIGNsYXNzIHRvIGNvcHkgb3IgY3JlYXRlIHNjcmlwdHMgZnJvbSBzb3VyY2Ugc2NyaXB0cyBvciBjYWxsYWJsZQogICAgc3BlY2lmaWNhdGlvbnMuCiAgICAiIiIKICAgIHNjcmlwdF90ZW1wbGF0ZSA9IFNDUklQVF9URU1QTEFURQoKICAgIGV4ZWN1dGFibGUgPSBOb25lICAjIGZvciBzaGViYW5ncwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2VfZGlyLCB0YXJnZXRfZGlyLCBhZGRfbGF1bmNoZXJzPVRydWUsCiAgICAgICAgICAgICAgICAgZHJ5X3J1bj1GYWxzZSwgZmlsZW9wPU5vbmUpOgogICAgICAgIHNlbGYuc291cmNlX2RpciA9IHNvdXJjZV9kaXIKICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSB0YXJnZXRfZGlyCiAgICAgICAgc2VsZi5hZGRfbGF1bmNoZXJzID0gYWRkX2xhdW5jaGVycwogICAgICAgIHNlbGYuZm9yY2UgPSBGYWxzZQogICAgICAgIHNlbGYuY2xvYmJlciA9IEZhbHNlCiAgICAgICAgIyBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIHNldCBtb2RlIGJpdHMgb24gUE9TSVguCiAgICAgICAgc2VsZi5zZXRfbW9kZSA9IChvcy5uYW1lID09ICdwb3NpeCcpIG9yIChvcy5uYW1lID09ICdqYXZhJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLl9uYW1lID09ICdwb3NpeCcpCiAgICAgICAgc2VsZi52YXJpYW50cyA9IHNldCgoJycsICdYLlknKSkKICAgICAgICBzZWxmLl9maWxlb3AgPSBmaWxlb3Agb3IgRmlsZU9wZXJhdG9yKGRyeV9ydW4pCgogICAgICAgIHNlbGYuX2lzX250ID0gb3MubmFtZSA9PSAnbnQnIG9yICgKICAgICAgICAgICAgb3MubmFtZSA9PSAnamF2YScgYW5kIG9zLl9uYW1lID09ICdudCcpCgogICAgZGVmIF9nZXRfYWx0ZXJuYXRlX2V4ZWN1dGFibGUoc2VsZiwgZXhlY3V0YWJsZSwgb3B0aW9ucyk6CiAgICAgICAgaWYgb3B0aW9ucy5nZXQoJ2d1aScsIEZhbHNlKSBhbmQgc2VsZi5faXNfbnQ6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgZG4sIGZuID0gb3MucGF0aC5zcGxpdChleGVjdXRhYmxlKQogICAgICAgICAgICBmbiA9IGZuLnJlcGxhY2UoJ3B5dGhvbicsICdweXRob253JykKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbihkbiwgZm4pCiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgZGVmIF9pc19zaGVsbChzZWxmLCBleGVjdXRhYmxlKToKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIERldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIGV4ZWN1dGFibGUgaXMgYSBzY3JpcHQKICAgICAgICAgICAgKGNvbnRhaW5zIGEgIyEgbGluZSkKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggb3BlbihleGVjdXRhYmxlKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnAucmVhZCgyKSA9PSAnIyEnCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnRmFpbGVkIHRvIG9wZW4gJXMnLCBleGVjdXRhYmxlKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGRlZiBfZml4X2p5dGhvbl9leGVjdXRhYmxlKHNlbGYsIGV4ZWN1dGFibGUpOgogICAgICAgICAgICBpZiBzZWxmLl9pc19zaGVsbChleGVjdXRhYmxlKToKICAgICAgICAgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgSnl0aG9uIGlzIG5vdCBuZWVkZWQgb24gTGludXggc3lzdGVtcy4KICAgICAgICAgICAgICAgIGltcG9ydCBqYXZhCgogICAgICAgICAgICAgICAgaWYgamF2YS5sYW5nLlN5c3RlbS5nZXRQcm9wZXJ0eSgnb3MubmFtZScpID09ICdMaW51eCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKICAgICAgICAgICAgZWxpZiBleGVjdXRhYmxlLmxvd2VyKCkuZW5kc3dpdGgoJ2p5dGhvbi5leGUnKToKICAgICAgICAgICAgICAgICMgVXNlIHdyYXBwZXIgZXhlIGZvciBKeXRob24gb24gV2luZG93cwogICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKICAgICAgICAgICAgcmV0dXJuICcvdXNyL2Jpbi9lbnYgJXMnICUgZXhlY3V0YWJsZQoKICAgIGRlZiBfZ2V0X3NoZWJhbmcoc2VsZiwgZW5jb2RpbmcsIHBvc3RfaW50ZXJwPWInJywgb3B0aW9ucz1Ob25lKToKICAgICAgICBlbnF1b3RlID0gVHJ1ZQogICAgICAgIGlmIHNlbGYuZXhlY3V0YWJsZToKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHNlbGYuZXhlY3V0YWJsZQogICAgICAgICAgICBlbnF1b3RlID0gRmFsc2UgICAgICMgYXNzdW1lIHRoaXMgd2lsbCBiZSB0YWtlbiBjYXJlIG9mCiAgICAgICAgZWxpZiBub3Qgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgogICAgICAgICAgICBleGVjdXRhYmxlID0gZ2V0X2V4ZWN1dGFibGUoKQogICAgICAgIGVsaWYgaW5fdmVudigpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBvcy5wYXRoLmpvaW4oc3lzY29uZmlnLmdldF9wYXRoKCdzY3JpcHRzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHl0aG9uJXMnICUgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdFWEUnKSkKICAgICAgICBlbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0JJTkRJUicpLAogICAgICAgICAgICAgICAncHl0aG9uJXMlcycgJSAoc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdWRVJTSU9OJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0VYRScpKSkKICAgICAgICBpZiBvcHRpb25zOgogICAgICAgICAgICBleGVjdXRhYmxlID0gc2VsZi5fZ2V0X2FsdGVybmF0ZV9leGVjdXRhYmxlKGV4ZWN1dGFibGUsIG9wdGlvbnMpCgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHNlbGYuX2ZpeF9qeXRob25fZXhlY3V0YWJsZShleGVjdXRhYmxlKQogICAgICAgICMgTm9ybWFsaXNlIGNhc2UgZm9yIFdpbmRvd3MKICAgICAgICBleGVjdXRhYmxlID0gb3MucGF0aC5ub3JtY2FzZShleGVjdXRhYmxlKQogICAgICAgICMgSWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYW4gZXhlY3V0YWJsZSwgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0bwogICAgICAgICMgY2F0ZXIgZm9yIGV4ZWN1dGFibGUgcGF0aHMgd2l0aCBzcGFjZXMgKG5vdCB1bmNvbW1vbiBvbiBXaW5kb3dzKQogICAgICAgIGlmIGVucXVvdGU6CiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBfZW5xdW90ZV9leGVjdXRhYmxlKGV4ZWN1dGFibGUpCiAgICAgICAgIyBJc3N1ZSAjNTE6IGRvbid0IHVzZSBmc2VuY29kZSwgc2luY2Ugd2UgbGF0ZXIgdHJ5IHRvCiAgICAgICAgIyBjaGVjayB0aGF0IHRoZSBzaGViYW5nIGlzIGRlY29kYWJsZSB1c2luZyB1dGYtOC4KICAgICAgICBleGVjdXRhYmxlID0gZXhlY3V0YWJsZS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAjIGluIGNhc2Ugb2YgSXJvblB5dGhvbiwgcGxheSBzYWZlIGFuZCBlbmFibGUgZnJhbWVzIHN1cHBvcnQKICAgICAgICBpZiAoc3lzLnBsYXRmb3JtID09ICdjbGknIGFuZCAnLVg6RnJhbWVzJyBub3QgaW4gcG9zdF9pbnRlcnAKICAgICAgICAgICAgYW5kICctWDpGdWxsRnJhbWVzJyBub3QgaW4gcG9zdF9pbnRlcnApOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHBvc3RfaW50ZXJwICs9IGInIC1YOkZyYW1lcycKICAgICAgICBzaGViYW5nID0gYicjIScgKyBleGVjdXRhYmxlICsgcG9zdF9pbnRlcnAgKyBiJ1xuJwogICAgICAgICMgUHl0aG9uIHBhcnNlciBzdGFydHMgdG8gcmVhZCBhIHNjcmlwdCB1c2luZyBVVEYtOCB1bnRpbAogICAgICAgICMgaXQgZ2V0cyBhICNjb2Rpbmc6eHh4IGNvb2tpZS4gVGhlIHNoZWJhbmcgaGFzIHRvIGJlIHRoZQogICAgICAgICMgZmlyc3QgbGluZSBvZiBhIGZpbGUsIHRoZSAjY29kaW5nOnh4eCBjb29raWUgY2Fubm90IGJlCiAgICAgICAgIyB3cml0dGVuIGJlZm9yZS4gU28gdGhlIHNoZWJhbmcgaGFzIHRvIGJlIGRlY29kYWJsZSBmcm9tCiAgICAgICAgIyBVVEYtOC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNoZWJhbmcuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgJ1RoZSBzaGViYW5nICglcikgaXMgbm90IGRlY29kYWJsZSBmcm9tIHV0Zi04JyAlIHNoZWJhbmcpCiAgICAgICAgIyBJZiB0aGUgc2NyaXB0IGlzIGVuY29kZWQgdG8gYSBjdXN0b20gZW5jb2RpbmcgKHVzZSBhCiAgICAgICAgIyAjY29kaW5nOnh4eCBjb29raWUpLCB0aGUgc2hlYmFuZyBoYXMgdG8gYmUgZGVjb2RhYmxlIGZyb20KICAgICAgICAjIHRoZSBzY3JpcHQgZW5jb2RpbmcgdG9vLgogICAgICAgIGlmIGVuY29kaW5nICE9ICd1dGYtOCc6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNoZWJhbmcuZGVjb2RlKGVuY29kaW5nKQogICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgICAgICdUaGUgc2hlYmFuZyAoJXIpIGlzIG5vdCBkZWNvZGFibGUgJwogICAgICAgICAgICAgICAgICAgICdmcm9tIHRoZSBzY3JpcHQgZW5jb2RpbmcgKCVyKScgJSAoc2hlYmFuZywgZW5jb2RpbmcpKQogICAgICAgIHJldHVybiBzaGViYW5nCgogICAgZGVmIF9nZXRfc2NyaXB0X3RleHQoc2VsZiwgZW50cnkpOgogICAgICAgIHJldHVybiBzZWxmLnNjcmlwdF90ZW1wbGF0ZSAlIGRpY3QobW9kdWxlPWVudHJ5LnByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmM9ZW50cnkuc3VmZml4KQoKICAgIG1hbmlmZXN0ID0gX0RFRkFVTFRfTUFOSUZFU1QKCiAgICBkZWYgZ2V0X21hbmlmZXN0KHNlbGYsIGV4ZW5hbWUpOgogICAgICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lKGV4ZW5hbWUpCiAgICAgICAgcmV0dXJuIHNlbGYubWFuaWZlc3QgJSBiYXNlCgogICAgZGVmIF93cml0ZV9zY3JpcHQoc2VsZiwgbmFtZXMsIHNoZWJhbmcsIHNjcmlwdF9ieXRlcywgZmlsZW5hbWVzLCBleHQpOgogICAgICAgIHVzZV9sYXVuY2hlciA9IHNlbGYuYWRkX2xhdW5jaGVycyBhbmQgc2VsZi5faXNfbnQKICAgICAgICBsaW5lc2VwID0gb3MubGluZXNlcC5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBpZiBub3QgdXNlX2xhdW5jaGVyOgogICAgICAgICAgICBzY3JpcHRfYnl0ZXMgPSBzaGViYW5nICsgbGluZXNlcCArIHNjcmlwdF9ieXRlcwogICAgICAgIGVsc2U6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgaWYgZXh0ID09ICdweSc6CiAgICAgICAgICAgICAgICBsYXVuY2hlciA9IHNlbGYuX2dldF9sYXVuY2hlcigndCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsYXVuY2hlciA9IHNlbGYuX2dldF9sYXVuY2hlcigndycpCiAgICAgICAgICAgIHN0cmVhbSA9IEJ5dGVzSU8oKQogICAgICAgICAgICB3aXRoIFppcEZpbGUoc3RyZWFtLCAndycpIGFzIHpmOgogICAgICAgICAgICAgICAgemYud3JpdGVzdHIoJ19fbWFpbl9fLnB5Jywgc2NyaXB0X2J5dGVzKQogICAgICAgICAgICB6aXBfZGF0YSA9IHN0cmVhbS5nZXR2YWx1ZSgpCiAgICAgICAgICAgIHNjcmlwdF9ieXRlcyA9IGxhdW5jaGVyICsgc2hlYmFuZyArIGxpbmVzZXAgKyB6aXBfZGF0YQogICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICAgICBvdXRuYW1lID0gb3MucGF0aC5qb2luKHNlbGYudGFyZ2V0X2RpciwgbmFtZSkKICAgICAgICAgICAgaWYgdXNlX2xhdW5jaGVyOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBuLCBlID0gb3MucGF0aC5zcGxpdGV4dChvdXRuYW1lKQogICAgICAgICAgICAgICAgaWYgZS5zdGFydHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBvdXRuYW1lID0gbgogICAgICAgICAgICAgICAgb3V0bmFtZSA9ICclcy5leGUnICUgb3V0bmFtZQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC53cml0ZV9iaW5hcnlfZmlsZShvdXRuYW1lLCBzY3JpcHRfYnl0ZXMpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICMgRmFpbGVkIHdyaXRpbmcgYW4gZXhlY3V0YWJsZSAtIGl0IG1pZ2h0IGJlIGluIHVzZS4KICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnRmFpbGVkIHRvIHdyaXRlIGV4ZWN1dGFibGUgLSB0cnlpbmcgdG8gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2UgLmRlbGV0ZW1lIGxvZ2ljJykKICAgICAgICAgICAgICAgICAgICBkZm5hbWUgPSAnJXMuZGVsZXRlbWUnICUgb3V0bmFtZQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRmbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShkZm5hbWUpICAgICAgICMgTm90IGFsbG93ZWQgdG8gZmFpbCBoZXJlCiAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKG91dG5hbWUsIGRmbmFtZSkgICMgbm9yIGhlcmUKICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlb3Aud3JpdGVfYmluYXJ5X2ZpbGUob3V0bmFtZSwgc2NyaXB0X2J5dGVzKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQWJsZSB0byByZXBsYWNlIGV4ZWN1dGFibGUgdXNpbmcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmRlbGV0ZW1lIGxvZ2ljJykKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShkZm5hbWUpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAgICAjIHN0aWxsIGluIHVzZSAtIGlnbm9yZSBlcnJvcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfbnQgYW5kIG5vdCBvdXRuYW1lLmVuZHN3aXRoKCcuJyArIGV4dCk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBvdXRuYW1lID0gJyVzLiVzJyAlIChvdXRuYW1lLCBleHQpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvdXRuYW1lKSBhbmQgbm90IHNlbGYuY2xvYmJlcjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnU2tpcHBpbmcgZXhpc3RpbmcgZmlsZSAlcycsIG91dG5hbWUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC53cml0ZV9iaW5hcnlfZmlsZShvdXRuYW1lLCBzY3JpcHRfYnl0ZXMpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnNldF9tb2RlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC5zZXRfZXhlY3V0YWJsZV9tb2RlKFtvdXRuYW1lXSkKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChvdXRuYW1lKQoKICAgIGRlZiBfbWFrZV9zY3JpcHQoc2VsZiwgZW50cnksIGZpbGVuYW1lcywgb3B0aW9ucz1Ob25lKToKICAgICAgICBwb3N0X2ludGVycCA9IGInJwogICAgICAgIGlmIG9wdGlvbnM6CiAgICAgICAgICAgIGFyZ3MgPSBvcHRpb25zLmdldCgnaW50ZXJwcmV0ZXJfYXJncycsIFtdKQogICAgICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICAgICAgYXJncyA9ICcgJXMnICUgJyAnLmpvaW4oYXJncykKICAgICAgICAgICAgICAgIHBvc3RfaW50ZXJwID0gYXJncy5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBzaGViYW5nID0gc2VsZi5fZ2V0X3NoZWJhbmcoJ3V0Zi04JywgcG9zdF9pbnRlcnAsIG9wdGlvbnM9b3B0aW9ucykKICAgICAgICBzY3JpcHQgPSBzZWxmLl9nZXRfc2NyaXB0X3RleHQoZW50cnkpLmVuY29kZSgndXRmLTgnKQogICAgICAgIG5hbWUgPSBlbnRyeS5uYW1lCiAgICAgICAgc2NyaXB0bmFtZXMgPSBzZXQoKQogICAgICAgIGlmICcnIGluIHNlbGYudmFyaWFudHM6CiAgICAgICAgICAgIHNjcmlwdG5hbWVzLmFkZChuYW1lKQogICAgICAgIGlmICdYJyBpbiBzZWxmLnZhcmlhbnRzOgogICAgICAgICAgICBzY3JpcHRuYW1lcy5hZGQoJyVzJXMnICUgKG5hbWUsIHN5cy52ZXJzaW9uWzBdKSkKICAgICAgICBpZiAnWC5ZJyBpbiBzZWxmLnZhcmlhbnRzOgogICAgICAgICAgICBzY3JpcHRuYW1lcy5hZGQoJyVzLSVzJyAlIChuYW1lLCBzeXMudmVyc2lvbls6M10pKQogICAgICAgIGlmIG9wdGlvbnMgYW5kIG9wdGlvbnMuZ2V0KCdndWknLCBGYWxzZSk6CiAgICAgICAgICAgIGV4dCA9ICdweXcnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZXh0ID0gJ3B5JwogICAgICAgIHNlbGYuX3dyaXRlX3NjcmlwdChzY3JpcHRuYW1lcywgc2hlYmFuZywgc2NyaXB0LCBmaWxlbmFtZXMsIGV4dCkKCiAgICBkZWYgX2NvcHlfc2NyaXB0KHNlbGYsIHNjcmlwdCwgZmlsZW5hbWVzKToKICAgICAgICBhZGp1c3QgPSBGYWxzZQogICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihzZWxmLnNvdXJjZV9kaXIsIGNvbnZlcnRfcGF0aChzY3JpcHQpKQogICAgICAgIG91dG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi50YXJnZXRfZGlyLCBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdCkpCiAgICAgICAgaWYgbm90IHNlbGYuZm9yY2UgYW5kIG5vdCBzZWxmLl9maWxlb3AubmV3ZXIoc2NyaXB0LCBvdXRuYW1lKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdub3QgY29weWluZyAlcyAodXAtdG8tZGF0ZSknLCBzY3JpcHQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFsd2F5cyBvcGVuIHRoZSBmaWxlLCBidXQgaWdub3JlIGZhaWx1cmVzIGluIGRyeS1ydW4gbW9kZSAtLQogICAgICAgICMgdGhhdCB3YXksIHdlJ2xsIGdldCBhY2N1cmF0ZSBmZWVkYmFjayBpZiB3ZSBjYW4gcmVhZCB0aGUKICAgICAgICAjIHNjcmlwdC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIGYgPSBvcGVuKHNjcmlwdCwgJ3JiJykKICAgICAgICBleGNlcHQgSU9FcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZiA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaXJzdF9saW5lID0gZi5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBmaXJzdF9saW5lOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnJXM6ICVzIGlzIGFuIGVtcHR5IGZpbGUgKHNraXBwaW5nKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9jb21tYW5kX25hbWUoKSwgIHNjcmlwdCkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgbWF0Y2ggPSBGSVJTVF9MSU5FX1JFLm1hdGNoKGZpcnN0X2xpbmUucmVwbGFjZShiJ1xyXG4nLCBiJ1xuJykpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgYWRqdXN0ID0gVHJ1ZQogICAgICAgICAgICAgICAgcG9zdF9pbnRlcnAgPSBtYXRjaC5ncm91cCgxKSBvciBiJycKCiAgICAgICAgaWYgbm90IGFkanVzdDoKICAgICAgICAgICAgaWYgZjoKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICBzZWxmLl9maWxlb3AuY29weV9maWxlKHNjcmlwdCwgb3V0bmFtZSkKICAgICAgICAgICAgaWYgc2VsZi5zZXRfbW9kZToKICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC5zZXRfZXhlY3V0YWJsZV9tb2RlKFtvdXRuYW1lXSkKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChvdXRuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdjb3B5aW5nIGFuZCBhZGp1c3RpbmcgJXMgLT4gJXMnLCBzY3JpcHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpcikKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZpbGVvcC5kcnlfcnVuOgogICAgICAgICAgICAgICAgZW5jb2RpbmcsIGxpbmVzID0gZGV0ZWN0X2VuY29kaW5nKGYucmVhZGxpbmUpCiAgICAgICAgICAgICAgICBmLnNlZWsoMCkKICAgICAgICAgICAgICAgIHNoZWJhbmcgPSBzZWxmLl9nZXRfc2hlYmFuZyhlbmNvZGluZywgcG9zdF9pbnRlcnApCiAgICAgICAgICAgICAgICBpZiBiJ3B5dGhvbncnIGluIGZpcnN0X2xpbmU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBleHQgPSAncHl3JwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBleHQgPSAncHknCiAgICAgICAgICAgICAgICBuID0gb3MucGF0aC5iYXNlbmFtZShvdXRuYW1lKQogICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfc2NyaXB0KFtuXSwgc2hlYmFuZywgZi5yZWFkKCksIGZpbGVuYW1lcywgZXh0KQogICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZHJ5X3J1bihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW9wLmRyeV9ydW4KCiAgICBAZHJ5X3J1bi5zZXR0ZXIKICAgIGRlZiBkcnlfcnVuKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9maWxlb3AuZHJ5X3J1biA9IHZhbHVlCgogICAgaWYgb3MubmFtZSA9PSAnbnQnIG9yIChvcy5uYW1lID09ICdqYXZhJyBhbmQgb3MuX25hbWUgPT0gJ250Jyk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAjIEV4ZWN1dGFibGUgbGF1bmNoZXIgc3VwcG9ydC4KICAgICAgICAjIExhdW5jaGVycyBhcmUgZnJvbSBodHRwczovL2JpdGJ1Y2tldC5vcmcvdmluYXkuc2FqaXAvc2ltcGxlX2xhdW5jaGVyLwoKICAgICAgICBkZWYgX2dldF9sYXVuY2hlcihzZWxmLCBraW5kKToKICAgICAgICAgICAgaWYgc3RydWN0LmNhbGNzaXplKCdQJykgPT0gODogICAjIDY0LWJpdAogICAgICAgICAgICAgICAgYml0cyA9ICc2NCcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJpdHMgPSAnMzInCiAgICAgICAgICAgIG5hbWUgPSAnJXMlcy5leGUnICUgKGtpbmQsIGJpdHMpCiAgICAgICAgICAgICMgSXNzdWUgMzE6IGRvbid0IGhhcmRjb2RlIGFuIGFic29sdXRlIHBhY2thZ2UgbmFtZSwgYnV0CiAgICAgICAgICAgICMgZGV0ZXJtaW5lIGl0IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBhY2thZ2UKICAgICAgICAgICAgZGlzdGxpYl9wYWNrYWdlID0gX19uYW1lX18ucnNwbGl0KCcuJywgMSlbMF0KICAgICAgICAgICAgcmVzdWx0ID0gZmluZGVyKGRpc3RsaWJfcGFja2FnZSkuZmluZChuYW1lKS5ieXRlcwogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgIyBQdWJsaWMgQVBJIGZvbGxvd3MKCiAgICBkZWYgbWFrZShzZWxmLCBzcGVjaWZpY2F0aW9uLCBvcHRpb25zPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIE1ha2UgYSBzY3JpcHQuCgogICAgICAgIDpwYXJhbSBzcGVjaWZpY2F0aW9uOiBUaGUgc3BlY2lmaWNhdGlvbiwgd2hpY2ggaXMgZWl0aGVyIGEgdmFsaWQgZXhwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5IHNwZWNpZmljYXRpb24gKHRvIG1ha2UgYSBzY3JpcHQgZnJvbSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlKSBvciBhIGZpbGVuYW1lICh0byBtYWtlIGEgc2NyaXB0IGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlpbmcgZnJvbSBhIHNvdXJjZSBsb2NhdGlvbikuCiAgICAgICAgOnBhcmFtIG9wdGlvbnM6IEEgZGljdGlvbmFyeSBvZiBvcHRpb25zIGNvbnRyb2xsaW5nIHNjcmlwdCBnZW5lcmF0aW9uLgogICAgICAgIDpyZXR1cm46IEEgbGlzdCBvZiBhbGwgYWJzb2x1dGUgcGF0aG5hbWVzIHdyaXR0ZW4gdG8uCiAgICAgICAgIiIiCiAgICAgICAgZmlsZW5hbWVzID0gW10KICAgICAgICBlbnRyeSA9IGdldF9leHBvcnRfZW50cnkoc3BlY2lmaWNhdGlvbikKICAgICAgICBpZiBlbnRyeSBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9jb3B5X3NjcmlwdChzcGVjaWZpY2F0aW9uLCBmaWxlbmFtZXMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbWFrZV9zY3JpcHQoZW50cnksIGZpbGVuYW1lcywgb3B0aW9ucz1vcHRpb25zKQogICAgICAgIHJldHVybiBmaWxlbmFtZXMKCiAgICBkZWYgbWFrZV9tdWx0aXBsZShzZWxmLCBzcGVjaWZpY2F0aW9ucywgb3B0aW9ucz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUYWtlIGEgbGlzdCBvZiBzcGVjaWZpY2F0aW9ucyBhbmQgbWFrZSBzY3JpcHRzIGZyb20gdGhlbSwKICAgICAgICA6cGFyYW0gc3BlY2lmaWNhdGlvbnM6IEEgbGlzdCBvZiBzcGVjaWZpY2F0aW9ucy4KICAgICAgICA6cmV0dXJuOiBBIGxpc3Qgb2YgYWxsIGFic29sdXRlIHBhdGhuYW1lcyB3cml0dGVuIHRvLAogICAgICAgICIiIgogICAgICAgIGZpbGVuYW1lcyA9IFtdCiAgICAgICAgZm9yIHNwZWNpZmljYXRpb24gaW4gc3BlY2lmaWNhdGlvbnM6CiAgICAgICAgICAgIGZpbGVuYW1lcy5leHRlbmQoc2VsZi5tYWtlKHNwZWNpZmljYXRpb24sIG9wdGlvbnMpKQogICAgICAgIHJldHVybiBmaWxlbmFtZXMKUEsDBBQAAAAAAAAAIQD1mJAMAFwBAABcAQA4AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3QzMi5leGVNWpAAAwAAAAQAAAD//wAAuAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAADh+6DgC0Cc0huAFMzSFUaGlzIHByb2dyYW0gY2Fubm90IGJlIHJ1biBpbiBET1MgbW9kZS4NDQokAAAAAAAAAAyL4RhI6o9LSOqPS0jqj0vbpBdLSeqPS1N3JEtW6o9LU3cRS0fqj0tTdyVLOOqPS0GSHEtN6o9LSOqOSxDqj0tTdyFLSeqPS1N3FUtJ6o9LU3cSS0nqj0tSaWNoSOqPSwAAAAAAAAAAUEUAAEwBBQBo51JXAAAAAAAAAADgAAIBCwEKAAC6AAAAngAAAAAAAPAlAAAAEAAAANAAAAAAQAAAEAAAAAIAAAUAAQAAAAAABQABAAAAAAAAoAEAAAQAAKp5AQADAECBAAAQAAAQAAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAACw8gAAPAAAAAAwAQCkUAAAAAAAAAAAAAAAAAAAAAAAAACQAQDUCAAAgNEAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7gAAQAAAAAAAAAAAAAAAANAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAudGV4dAAAAIq4AAAAEAAAALoAAAAEAAAAAAAAAAAAAAAAAAAgAABgLnJkYXRhAAAEKgAAANAAAAAsAAAAvgAAAAAAAAAAAAAAAAAAQAAAQC5kYXRhAAAAxC4AAAAAAQAAEAAAAOoAAAAAAAAAAAAAAAAAAEAAAMAucnNyYwAAAKRQAAAAMAEAAFIAAAD6AAAAAAAAAAAAAAAAAABAAABALnJlbG9jAAAiDgAAAJABAAAQAAAATAEAAAAAAAAAAAAAAAAAQAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVYvsgewEBAAAoYQCQQAzxYlF/IN9CAB1RY1FEFD/dQyNhfz7//9o/wMAAGgABAAAUOiyLgAAg8QUjYX8+///UGgg6kAA6OcJAACDwEBQ6NIOAACDxAxqAf8VANBAAItN/DPN6IAHAADJw1WL7ItNCFcz/41G/FAPvgXADkEAUFHoawsAAIPEDIXAdBu5wA5BAIsJOwh1Aov4jUgBi0UIK8GNRDD868+Lx19dw1WL7IPsLFdoQOpAAI1F/DP/aGAbQQBQiX38iX3w6OcHAAAzyTvHD5TBaEjqQABR6CD///9qAlf/dfzoHhIAAP91/OgnEQAAmYlF6AX8/v//g8QkiVXsiUX4O8d9A4l9+FNWV/91+P91/OjvEQAA/3X8uwQBAABTagH/dQjo2w0AAP91CIvw6DP///+DxCA7x3Qdi/BqBVmNfdTzpYt9CCvHA0X4mYvwiVXs6YEAAAC+AAAQBFboNwgAAIlF9ItF6AUAAPD7WYlF+DvHfQOJffhX/3X4/3X86IERAAD/dfxWagH/dfTocg0AAP919Ivw6Mr+//+L8DPAO/cPlcBoZOpAAIl17FDoSf7//4tF7CtF9GoFA0X4Wf919JmNfdTzpYvwiVXs6E0HAACLfQiDxCwrdeQrdeAr83kCM/ZqAFb/dfzoFhEAAP91/FNqAVfoCQ0AAIvwM8A7xhvA99hoiOpAAFDo7P3//4PEJI1EPv9eW+sOZosQuaTqQABmOxF0B0g7x3Pu6wOJRfD/dfzotBEAAItF8FlfycNVi+xWi/D/FRDQQACDJgBqAmoBagBWUP91CFD/FUDQQACL8IX2dQz/FTjQQACD+AZ1AUaLxl5dw1WL7IN9CAB1EqFoHUEAhcB0CWoAUP8VGNBAADPAQF3DVYvsg+T4gezcAAAAoYQCQQAzxImEJNgAAACLRQhTVlcz/1dXiUQkHP8VMNBAAIvYjUQkEFBqcI1EJHhQaglT/xUo0EAAhcB0DIN8JBBwdQUzwEDrAjPAaKzqQABQ6AH9//+BjCSIAAAAADAAAFlZanCNRCR0UGoJU/8VCNBAAGjM6kAAUOjZ/P//akReVo1EJDRXUOgaOAAAg8QUiXQkKIs1NNBAAGr2/9ZQjUQkZOj0/v//xwQk7OpAAFDoovz//1lZavX/1lCNRCRo6Nf+///HBCQI60AAUOiF/P//WVlq9P/WUI1EJGzouv7//8cEJCTrQABQ6Gj8//9ZWWoBaH0SQADHRCRcAAEAAP8VPNBAAI1EJBhQjUQkLFBXV1dqAVdX/3QkNFf/FQzQQAD/dCQUaEDrQABQ6Cb8//+LRCQsg8QM/3QkGKNoHUEAU/8VHNBAAP90JBz/FUTQQABq//90JBz/FRTQQACNRCQQUP90JBz/FSDQQABoZOtAAFDo3/v//1lZ/3QkEP8VANBAAMxVi+xRU1ZXiz040UAAu4jrQABT/3UI6yWNRgiJRfwPtwBmhcB0H4P4InQaaghQ6NALAABZWYXAdQxT/3X8/9eL8IX2ddMzwIX2D5XAaJTrQABQ6Hv7//+LfQhZWYPGCGaDPyJqAlt1HzPAZoM+ImjY60AAD5TAUOhW+///M8BZZokGA/NZA/szwGaDPiJoIOxAAA+VwFDoN/v//w+3BllZZoXAdCVqCFDoVgsAAFlZhcB0FzPAZokG6w5qCFDoQQsAAFlZhcB0CgPzD7cGZoXAdeiLRQyJMIvHX15bycNVi+yB7CQDAAChhAJBADPFiUX8U1ZX/xUE0EAAZoM4InQEaiDrBWoig8AEWVFQ6L0DAABZWYXAdQzHheD8//+o6kAA6ySNcALrEWoIUOjTCgAAWVmFwHQLg8YCD7cGZoXAdeeJteD8//+7BAEAAFO+YBtBAFZqAP8VJNBAAGaDPWAbQQAidAiJtej8///rDceF6Pz//2IbQQCD6AKLlej8//8zyWaJDEKNhfD8//9QxgXADkEAUOjl+v//i/gzwIX/D5XAxwQkbOxAAFDoI/r//1mNhwQBAAAz9lmLzzv4cxWKEYD6DXQMgPoKdAdBO8hy7+sCi/EzwIX2D5XAaITsQABQ6Oz5//9ZWVONhfT9//9QxgYAK/dWV2oIaOn9AAD/FSzQQACL8DPAM9s78w+VwGiw7EAAUOi4+f//M8BmiYR19P3//1lZjbX0/f//Zjmd9P3//3QZD7cGaghQ6MMJAABZWYXAdAiDxgJmOR515zPAZoM+I2jc7EAAD5TAUOhw+f//WVlqAl/rDmoIUOiSCQAAWVmFwHQKA/cPtwZmO8N16DPAZoM+IWgM7UAAD5TAUOg9+f//WVnrDmoIUOhiCQAAWVmFwHQKA/cPtwZmO8N16I2F7Pz//1BWiZ3s/P//6Dz9//+JheT8//8zwDmd5Pz//2hA7UAAD5XAUOjy+P//M8A5nez8//9obO1AAA+VwFDo3Pj//4uF5Pz//4PEGI1IAmaLEAPHZjvTdfYrwdH4i/CLhez8//+NSAJmixADx2Y703X2K8HR+ImF3Pz//4uF6Pz//41IAmaLEAPHZjvTdfYrwdH4i8iLheD8//+NUAJmixgDx2aF23X2K8LR+APIA43c/P//V410MQhW6L0BAACL+DPAhf8PlcBoqO1AAFDoTPj///+14Pz///+16Pz///+17Pz///+15Pz//2jc7UAAVlZX6MQEAACDxDBX6Lv6///M6ST9//87DYQCQQB1AvPD6QMOAABqDGjQ7kAA6B0VAAAz/4l95DPAi10IO98PlcA7x3UU6K0UAADHABYAAADoUBQAADPA63szwIt1DDv3D5XAO8d03jPAZjk+D5XAO8d00uhwEQAAiUUIO8d1DehzFAAAxwAYAAAA68mJffxmOTt1IOheFAAAxwAWAAAAav6NRfBQaIQCQQDokBYAAIPEDOuhUP91EFZT6HAOAACDxBCJReTHRfz+////6AkAAACLReTouxQAAMP/dQjoyAIAAFnDi/9Vi+xWi3UIhfZ1E+gBFAAAahZeiTDopRMAAIvG6yRogAAAAP91EP91DOgS////g8QMiQaFwHQEM8DrB+jREwAAiwBeXcOL/1WL7ItFCGaLVQzrCGY7ynQSg8ACD7cIZoXJdfBmORB0AjPAXcOL/1WL7IN9CAB0Lf91CGoA/zUYEkEA/xVI0EAAhcB1GFbofxMAAIvw/xU40EAAUOgvEwAAWYkGXl3Di/9Vi+xRg2X8AFaNRfxQ/3UM/3UI6AkXAACL8IPEDIX2dRg5Rfx0E+g+EwAAhcB0Cug1EwAAi038iQiLxl7Jw4v/VYvsU4tdCIP74HdvVleDPRgSQQAAdRjoBxwAAGoe6FEaAABo/wAAAOhhFwAAWVmF23QEi8PrAzPAQFBqAP81GBJBAP8VTNBAAIv4hf91JmoMXjkFfBhBAHQNU+gLHAAAWYXAdanrB+i9EgAAiTDothIAAIkwi8dfXusUU+jqGwAAWeiiEgAAxwAMAAAAM8BbXcO4AABBAMOhwC5BAFZqFF6FwHUHuAACAADrBjvGfQeLxqPALkEAagRQ6F4eAABZWaOkHkEAhcB1HmoEVok1wC5BAOhFHgAAWVmjpB5BAIXAdQVqGlhewzPSuQAAQQDrBaGkHkEAiQwCg8Egg8IEgfmAAkEAfOpq/l4z0rkQAEEAV4vCwfgFiwSFgB1BAIv6g+cfwecGiwQHg/j/dAg7xnQEhcB1Aokxg8EgQoH5cABBAHzOXzPAXsPojyAAAIA9RBJBAAB0BehbHgAA/zWkHkEA6B3+//9Zw4v/VYvsVot1CLgAAEEAO/ByIoH+YAJBAHcai84ryMH5BYPBEFHozSEAAIFODACAAABZ6wqDxiBW/xVQ0EAAXl3Di/9Vi+yLRQiD+BR9FoPAEFDooCEAAItFDIFIDACAAABZXcOLRQyDwCBQ/xVQ0EAAXcOL/1WL7ItFCLkAAEEAO8FyHz1gAkEAdxiBYAz/f///K8HB+AWDwBBQ6H4gAABZXcODwCBQ/xVU0EAAXcOL/1WL7ItNCItFDIP5FH0TgWAM/3///4PBEFHoTyAAAFldw4PAIFD/FVTQQABdw8zMzMzMzMzMzMyLRCQMU4XAdFKLVCQIM9uKXCQM98IDAAAAdBaKCoPCATLLdHKD6AF0MvfCAwAAAHXqg+gEchJXi/vB4wgD34v7weMQA9/rG1+DwAR0DooKg8IBMst0QIPoAXXyW8OD6ARy5YsKM8u///7+fgP5g/H/M8+DwgSB4QABAYF04ItK/DLLdCMy63QZwekQMst0DDLrdALryF+NQv9bw41C/l9bw41C/V9bw41C/F9bw4v/VYvsjUUYUGoA/3UU/3UQ/3UM/3UI6DAlAACDxBhdw4v/VYvsg+wQi00IU4tdDFZXi30QiU34iV38hf90GoN9FAB0FIXJdRfo3Q8AAMcAFgAAAOiADwAAM8BfXlvJw4t1GIX2dAyDyP8z0vf3OUUUdiGD+/90DFNqAFHoMi4AAIPEDIX2dMGDyP8z0vf3OUUUd7UPr30U90YMDAEAAIl98IvfdAiLRhiJRfTrB8dF9AAQAACF/w+E2gAAAPdGDAwBAAB0RItGBIXAdD0PiPIAAACL+zvYcgKL+Dt9/A+HuwAAAFf/Nv91/P91+Og/LQAAKX4EAT4Bffgr34PEECl9/It98OmFAAAAO130clyDffQAdB+5////fzPSO9l2CYvB93X0i8HrB4vD93X0i8MrwusLuP///3872HcCi8M7Rfx3W1D/dfhW6L0sAABZUOjAKwAAg8QMhcB0e4P4/3RkAUX4K9gpRfzrJFboyyQAAFmD+P90UoN9/AB0IotN+P9F+IgBi0YYS/9N/IlF9IXbD4Um////i0UU6bz+//+DfQz/dBD/dQxqAP91COgBLQAAg8QM6HEOAADHACIAAADpj/7//4NODCCLxyvDM9L3dRDphP7//4NODBDr7GoMaPDuQADomg4AADP2iXXkOXUQdC85dRR0Kjl1GHUtg30M/3QP/3UMVv91COikLAAAg8QM6BQOAADHABYAAADotw0AADPA6J8OAADD/3UY6Dn8//9ZiXX8/3UY/3UU/3UQ/3UM/3UI6Nf9//+DxBSJReTHRfz+////6AUAAACLReTrw/91GOh1/P//WcOL/1WL7P91FP91EP91DGr//3UI6Fr///+DxBRdw2oMaBDvQADo7w0AADPbiV3kM8CLfQg7+w+VwDvDdRjofw0AAMcAFgAAAOgiDQAAg8j/6cUAAAAzwDldDA+VwDvDdNyJfQhX6Jf7//9ZiV389kcMQHVvV+gnKwAAWYP4/3Qbg/j+dBaL0MH6BYvIg+EfweEGAwyVgB1BAOsFuQAEQQD2QSR/dSmD+P90GYP4/nQUi8jB+QWD4B/B4AYDBI2AHUEA6wW4AARBAPZAJIB0FOjtDAAAxwAWAAAA6JAMAACDTeT/OV3kdSNX6NUrAACL8I1FEFBT/3UMV+jILAAAiUXkV1boVywAAIPEHMdF/P7////oCQAAAItF5Og/DQAAw/91COhM+///WcOL/1WL7FG4//8AAGY5RQh1BDPAycO4AAEAAGY5RQhzEA+3RQiLDWwGQQAPtwRB6x2NRfxQagGNRQhQagH/FVjQQACFwHUDIUX8D7dF/A+3TQwjwcnDi/9Vi+yD7AxTV4t9CDPbO/t1GOgqDAAAxwAWAAAA6M0LAACDyP/pZQEAAFZX6PApAACL8FmJdfg5XwR9A4lfBGoBU1boezgAAIPEDIlF/DvDD4z7AAAAi1cM98IIAQAAdQgrRwTpJQEAAIsHi08Ii9gr2Yld9PbCA3Q8i9bB+gWLFJWAHUEAg+YfweYG9kQyBIB0FovRO9BzEIvwgDoKdQFDQjvWcvWJXfSDffwAdRuLw+nYAAAAhNJ47+iCCwAAxwAWAAAA6YcAAAD2RwwBD4S0AAAAi1cEhdJ1CCFV9OmlAAAAi134i3X4K8EDwsH7BYPmH40cnYAdQQCJRQiLA8HmBvZEMASAdHlqAmoA/3X46K43AACDxAw7Rfx1IItHCItNCAPI6wmAOAp1A/9FCEA7wXLz90cMACAAAOtAagD/dfz/dfjoeTcAAIPEDIXAeQWDyP/rOLgAAgAAOUUIdxCLTwz2wQh0CPfBAAQAAHQDi0cYiUUIiwP2RDAEBHQD/0UIi0UIKUX8i0X0A0X8Xl9bycNqDGgw70AA6PoKAAAzwDlFCA+VwIXAdRXokQoAAMcAFgAAAOg0CgAAg8j/6yj/dQjoufj//1mDZfwA/3UI6Cr+//9ZiUXkx0X8/v///+gJAAAAi0Xk6PEKAADD/3UI6P74//9Zw4v/VYvsVot1CItGDKiDdRDoNAoAAMcAFgAAAIPI/+tng+Dvg30QAYlGDHUOVujV/f//AUUMg2UQAFlW6DMXAACLRgxZhMB5CIPg/IlGDOsWqAF0EqgIdA6pAAQAAHUHx0YYAAIAAP91EP91DFbotycAAFlQ6FI2AAAzyYPEDIP4/w+VwY1B/15dw2oMaFDvQADoCwoAADPAOUUID5XAhcB1FeiiCQAAxwAWAAAA6EUJAACDyP/rP4t1EIX2dAqD/gF0BYP+AnXa/3UI6Ln3//9Zg2X8AFb/dQz/dQjoH////4PEDIlF5MdF/P7////oCQAAAItF5OjrCQAAw/91COj49///WcOL/1WL7FaLdQhXg8//hfZ1FOgtCQAAxwAWAAAA6NAIAAALx+tE9kYMg3Q4Vug8FgAAVov46MA3AABW6OQmAABQ6PA2AACDxBCFwHkFg8//6xKLRhyFwHQLUOhA9f//g2YcAFmDZgwAi8dfXl3DagxocO9AAOgiCQAAg03k/zPAi3UIhfYPlcCFwHUV6LMIAADHABYAAADoVggAAIPI/+sN9kYMQHQNg2YMAItF5OguCQAAw1boyvb//1mDZfwAVug8////WYlF5MdF/P7////oBQAAAOvUi3UIVugX9///WcOL/1WL7IM97A5BAAJ0BehJEQAA/3UI6JIPAABo/wAAAOiiDAAAWVldw2oUaJDvQADohQgAADP2OTWgHkEAdQtWVmoBVv8VYNBAALhNWgAAZjkFAABAAHQFiXXk6zahPABAAIG4AABAAFBFAAB16rkLAQAAZjmIGABAAHXcg7h0AEAADnbTM8k5sOgAQAAPlcGJTeToZAsAAIXAdQhqHOhd////WehHPwAAhcB1CGoQ6Ez///9Z6PE7AACJdfzoChEAAIXAeQhqG+icDgAAWf8VXNBAAKOcHkEA6DY7AACj5A5BAOhxOgAAhcB5CGoI6HYOAABZ6Oo3AACFwHkIagnoZQ4AAFlqAeg8DAAAWTvGdAdQ6FIOAABZoSwSQQCjMBJBAFD/NSQSQQD/NSASQQDoSfL//4PEDIlF4Dl15HUGUOjaDQAA6AEOAADrLotF7IsIiwmJTdxQUeg8NgAAWVnDi2Xoi0XciUXgg33kAHUGUOjADQAA6OANAADHRfz+////i0Xg6HYHAADD6Nw/AADplf7//4v/VYvsgewoAwAAo/gPQQCJDfQPQQCJFfAPQQCJHewPQQCJNegPQQCJPeQPQQBmjBUQEEEAZowNBBBBAGaMHeAPQQBmjAXcD0EAZowl2A9BAGaMLdQPQQCcjwUIEEEAi0UAo/wPQQCLRQSjABBBAI1FCKMMEEEAi4Xg/P//xwVID0EAAQABAKEAEEEAo/wOQQDHBfAOQQAJBADAxwX0DkEAAQAAAKGEAkEAiYXY/P//oYgCQQCJhdz8////FXDQQACjQA9BAGoB6KU/AABZagD/FWzQQABonNFAAP8VaNBAAIM9QA9BAAB1CGoB6IE/AABZaAkEAMD/FRDQQABQ/xVk0EAAycOL/1WL7IPsEKH4GkEAM9JTVot1DIlF/IlV9IlV+IlV8OsDg8YCZoM+IHT3D7cGg/hhdDCD+HJ0I4P4d3QX6IYFAADHABYAAADoKQUAADPA6WECAAC7AQMAAOsNM9uDTfwB6wm7CQEAAINN/AKDxgIPtwYzyUFXZjvCD4TWAQAAjXl/ugBAAACFyQ+EHAEAAA+3wIP4Uw+PkwAAAHR/g+ggD4T2AAAAg+gLdFJIdEOD6Bh0LYPoCnQhg+gED4WhAQAAOUX4D4XMAAAAx0X4AQAAAIPLEOnDAAAAC9/pvAAAAPbDQA+FrQAAAIPLQOmrAAAAx0XwAQAAAOmZAAAA9sMCD4WQAAAAi0X8g+P+g+D8g8sCC8eJRfzpgAAAAIN9+AB1dMdF+AEAAACDyyDrboPoVHRag+gOdEVIdDCD6At0FYPoBg+FGQEAAPfDAMAAAHVFC9rrR4N99AB1O4Fl/P+////HRfQBAAAA6zGDffQAdSUJVfzHRfQBAAAA6x/3wwDAAAB1EYHLAIAAAOsPuAAQAACF2HQEM8nrAgvYg8YCD7cGZoXAD4Xc/v//g33wAA+EoAAAAGogX+sDg8YCZjk+dPhqA1ZopNFAAOhBRwAAg8QMhcAPhYgAAACDxgbrA4PGAmY5PnT4ZoM+PXV1g8YCZjk+dPhqBWis0UAAVuhwRgAAg8QMhcB1C4PGCoHLAAAEAOtBaghouNFAAFboUUYAAIPEDIXAdQuDxhCBywAAAgDrImoHaMzRQABW6DJGAACDxAyFwHUbg8YOgcsAAAEA6wODxgJmgz4gdPcz/2Y5PnQS6GEDAADHABYAAADoBAMAAOscaIABAAD/dRCNRQxT/3UIUOjkRAAAg8QUhcB0BDPA6yCLRRT/BeAOQQCLTfyJSAyLTQyJeASJOIl4CIl4HIlIEF9eW8nDahBosO9AAOhbAwAAM9sz/4l95GoB6CwTAABZiV38M/aJdeA7NcAuQQAPjcoAAAChpB5BAI0EsDkYdFuLAItADKiDdUipAIAAAHVBjUb9g/gQdxKNRhBQ6CgSAABZhcAPhJQAAAChpB5BAP80sFboHfH//1lZoaQeQQCLBLD2QAyDdAxQVuh08f//WVlG65GL+Il95OtjajjoIQ4AAFmLDaQeQQCJBLE7w3ROaKAPAAChpB5BAIsEsIPAIFD/FXTQQACFwKGkHkEAdRP/NLDol+7//1mhpB5BAIkcsOsbiwSwg8AgUP8VUNBAAKGkHkEAizywiX3kiV8MO/t0FoFnDACAAACJXwSJXwiJH4lfHINPEP/HRfz+////6AsAAACLx+iGAgAAw4t95GoB6DwRAABZw4v/VYvsi0UIoxQSQQBdw4v/VYvsgewoAwAAoYQCQQAzxYlF/FOLXQhXg/v/dAdT6Ew7AABZg6Xg/P//AGpMjYXk/P//agBQ6BggAACNheD8//+Jhdj8//+NhTD9//+DxAyJhdz8//+JheD9//+Jjdz9//+Jldj9//+JndT9//+JtdD9//+Jvcz9//9mjJX4/f//ZoyN7P3//2aMncj9//9mjIXE/f//ZoylwP3//2aMrbz9//+cj4Xw/f//i0UEjU0EiY30/f//x4Uw/f//AQABAImF6P3//4tJ/ImN5P3//4tNDImN4Pz//4tNEImN5Pz//4mF7Pz///8VcNBAAGoAi/j/FWzQQACNhdj8//9Q/xVo0EAAhcB1EIX/dQyD+/90B1PoVzoAAFmLTfxfM81b6Mbr///Jw4v/VmoBvhcEAMBWagLoxf7//4PEDFb/FRDQQABQ/xVk0EAAXsOL/1WL7P81FBJBAP8VfNBAAIXAdANd/+D/dRj/dRT/dRD/dQz/dQjor////8wzwFBQUFBQ6Mf///+DxBTDi/9Vi+yLRQgzyTsEzZACQQB0E0GD+S1y8Y1I7YP5EXcOag1YXcOLBM2UAkEAXcMFRP///2oOWTvIG8AjwYPACF3D6Mc1AACFwHUGuPgDQQDDg8AIw+i0NQAAhcB1Brj8A0EAw4PADMOL/1WL7Fbo4v///4tNCFGJCOiC////WYvw6Lz///+JMF5dw8zMzMzMzMzMzMzMzMzMzGiALUAAZP81AAAAAItEJBCJbCQQjWwkECvgU1ZXoYQCQQAxRfwzxVCJZej/dfiLRfzHRfz+////iUX4jUXwZKMAAAAAw4tN8GSJDQAAAABZX19eW4vlXVHDzMzMzMzMzIv/VYvsg+wYU4tdDFaLcwgzNYQCQQBXiwbGRf8Ax0X0AQAAAI17EIP4/nQNi04EA88zDDjoL+r//4tODItGCAPPMww46B/q//+LRQj2QARmD4UZAQAAi00QjVXoiVP8i1sMiUXoiU3sg/v+dF+NSQCNBFuLTIYUjUSGEIlF8IsAiUX4hcl0FIvX6PQBAADGRf8BhcB4QH9Hi0X4i9iD+P51zoB9/wB0JIsGg/j+dA2LTgQDzzMMOOis6f//i04Mi1YIA88zDDronOn//4tF9F9eW4vlXcPHRfQAAAAA68mLTQiBOWNzbeB1KYM9mB5BAAB0IGiYHkEA6GNCAACDxASFwHQPi1UIagFS/xWYHkEAg8QIi00Mi1UI6JQBAACLRQw5WAx0EmiEAkEAV4vTi8jolgEAAItFDItN+IlIDIsGg/j+dA2LTgQDzzMMOOgW6f//i04Mi1YIA88zDDroBun//4tF8ItICIvX6CoBAAC6/v///zlTDA+ET////2iEAkEAV4vL6EEBAADpGf///8xTVleLVCQQi0QkFItMJBhVUlBRUWigL0AAZP81AAAAAKGEAkEAM8SJRCQIZIklAAAAAItEJDCLWAiLTCQsMxmLcAyD/v50O4tUJDSD+v50BDvydi6NNHaNXLMQiwuJSAyDewQAdcxoAQEAAItDCOgyQwAAuQEAAACLQwjoREMAAOuwZI8FAAAAAIPEGF9eW8OLTCQE90EEBgAAALgBAAAAdDOLRCQIi0gIM8joKOj//1WLaBj/cAz/cBD/cBToPv///4PEDF2LRCQIi1QkEIkCuAMAAADDVYtMJAiLKf9xHP9xGP9xKOgV////g8QMXcIEAFVWV1OL6jPAM9sz0jP2M///0VtfXl3Di+qL8YvBagHoj0IAADPAM9szyTPSM///5lWL7FNWV2oAUmhGMEAAUeg+mAAAX15bXcNVi2wkCFJR/3QkFOi1/v//g8QMXcIIAGoAaAAQAABqAP8VhNBAADPJhcAPlcGjGBJBAIvBw4v/VYvsi00Ihcl0G2rgM9JY9/E7RQxzD+gr/P//xwAMAAAAM8Bdww+vTQxWi/GF9nUBRjPAg/7gdxNWagj/NRgSQQD/FUzQQACFwHUygz18GEEAAHQcVuguBQAAWYXAddKLRRCFwHQGxwAMAAAAM8DrDYtNEIXJdAbHAQwAAABeXcOL/1WL7Gjs0UAA/xWM0EAAhcB0FWjc0UAAUP8ViNBAAIXAdAX/dQj/0F3Di/9Vi+z/dQjoyP///1n/dQj/FQDQQADMagjoswsAAFnDagjo0QoAAFnDi/9W6P4vAACL8FbolAQAAFbof/n//1bowkMAAFborUMAAFbookEAAFboi0EAAIPEGF7Di/9Vi+xWi3UIM8DrD4XAdRCLDoXJdAL/0YPGBDt1DHLsXl3Di/9Vi+yDPZAeQQAAdBlokB5BAOgaPwAAWYXAdAr/dQj/FZAeQQBZ6KREAABoYNFAAGhI0UAA6KH///9ZWYXAdVRWV2g3YUAA6GxEAAC4QNFAAL5E0UAAWYv4O8ZzD4sHhcB0Av/Qg8cEO/5y8YM9lB5BAABfXnQbaJQeQQDosD4AAFmFwHQMagBqAmoA/xWUHkEAM8Bdw2ogaNDvQADoz/r//2oI6KcKAABZg2X8ADPAQDkFTBJBAA+E2AAAAKNIEkEAikUQokQSQQCDfQwAD4WgAAAA/zWIHkEAizV80EAA/9aL2Ild0IXbdGj/NYQeQQD/1ov4iX3UiV3ciX3Yg+8EiX3UO/tyS+ihLgAAOQd07Tv7cj7/N//Wi9joji4AAIkH/9P/NYgeQQD/1ovY/zWEHkEA/9Y5Xdx1BTlF2HQOiV3ciV3QiUXYi/iJfdSLXdDrq8dF5GTRQACBfeRw0UAAcxGLReSLAIXAdAL/0INF5ATr5sdF4HTRQACBfeB40UAAcxGLReCLAIXAdAL/0INF4ATr5sdF/P7////oIAAAAIN9EAB1KccFTBJBAAEAAABqCOi/CAAAWf91COi9/f//g30QAHQIagjoqQgAAFnD6OH5///Di/9Vi+xqAGoA/3UI6K/+//+DxAxdw4v/VYvsagBqAf91COiZ/v//g8QMXcNqAWoAagDoif7//4PEDMNqAWoBagDoev7//4PEDMOL/1WL7OjpAQAA/3UI6DIAAABZaP8AAADor////8yL/1WL7DPAi00IOwzFiNpAAHQKQIP4FnLuM8Bdw4sExYzaQABdw4v/VYvsgez8AQAAoYQCQQAzxYlF/FNWi3UIV1bouf///4v4M9tZib0E/v//O/sPhGwBAABqA+gZRgAAWYP4AQ+EBwEAAGoD6AhGAABZhcB1DYM9gAJBAAEPhO4AAACB/vwAAAAPhDYBAABoxNtAAGgUAwAAv1ASQQBX6HJFAACDxAyFwA+FuAAAAGgEAQAAvoISQQBWU2ajihRBAP8VJNBAALv7AgAAhcB1H2iU20AAU1boOkUAAIPEDIXAdAwzwFBQUFBQ6Ef3//9W6AZFAABAWYP4PHYqVuj5RAAAjQRFDBJBAIvIK85qA9H5aIzbQAAr2VNQ6A9EAACDxBSFwHW9aITbQAC+FAMAAFZX6IJDAACDxAyFwHWl/7UE/v//VlfobkMAAIPEDIXAdZFoECABAGg420AAV+jrQQAAg8QM615TU1NTU+l5////avT/FTTQQACL8DvzdEaD/v90QTPAigxHiIwFCP7//2Y5HEd0CEA99AEAAHLoU42FBP7//1CNhQj+//9QiF376A1BAABZUI2FCP7//1BW/xWQ0EAAi038X14zzVvoKOL//8nDagPonkQAAFmD+AF0FWoD6JFEAABZhcB1H4M9gAJBAAF1Fmj8AAAA6CX+//9o/wAAAOgb/v//WVnDi/9Vi+yLRQijeBhBAF3Di/9Vi+z/NXgYQQD/FXzQQACFwHQP/3UI/9BZhcB0BTPAQF3DM8Bdw4v/VYvsg+xMVo1FtFD/FZzQQABqQGogXlbobAIAAFlZM8k7wXUIg8j/6Q8CAACNkAAIAACjgB1BAIk1dB1BADvCczaDwAWDSPv/ZsdA/wAKiUgDZsdAHwAKxkAhColIM4hIL4s1gB1BAIPAQI1Q+4HGAAgAADvWcs1TV2Y5TeYPhA4BAACLReg7wQ+EAwEAAIsYg8AEiUX8A8O+AAgAAIlF+DvefAKL3jkddB1BAH1rv4QdQQBqQGog6MwBAABZWYXAdFGDBXQdQQAgjYgACAAAiQc7wXMxg8AFg0j7/4NgAwCAYB+Ag2AzAGbHQP8ACmbHQCAKCsZALwCLD4PAQAPOjVD7O9Fy0oPHBDkddB1BAHyi6waLHXQdQQAz/4XbfnKLRfiLAIP4/3Rcg/j+dFeLTfyKCfbBAXRN9sEIdQtQ/xWY0EAAhcB0PYv3g+Yfi8fB+AXB5gYDNIWAHUEAi0X4iwCJBotF/IoAiEYEaKAPAACNRgxQ/xV00EAAhcAPhLwAAAD/RgiDRfgER/9F/Dv7fI4z24vzweYGAzWAHUEAiwaD+P90C4P4/nQGgE4EgOtxxkYEgYXbdQVq9ljrCo1D//fYG8CDwPVQ/xU00EAAi/iD//90QoX/dD5X/xWY0EAAhcB0MyX/AAAAiT6D+AJ1BoBOBEDrCYP4A3UEgE4ECGigDwAAjUYMUP8VdNBAAIXAdCz/RgjrCoBOBEDHBv7///9Dg/sDD4xo/////zV0HUEA/xWU0EAAM8BfW17Jw4PI/+v2i/9Vi+xWVzP2/3UI6BXh//+L+FmF/3UnOQWAGEEAdh9W/xWk0EAAjYboAwAAOwWAGEEAdgODyP+L8IP4/3XKi8dfXl3Di/9Vi+xWVzP2agD/dQz/dQjorvf//4v4g8QMhf91JzkFgBhBAHYfVv8VpNBAAI2G6AMAADsFgBhBAHYDg8j/i/CD+P91w4vHX15dw4v/VYvsVlcz9v91DP91COiKQQAAi/hZWYX/dSw5RQx0JzkFgBhBAHYfVv8VpNBAAI2G6AMAADsFgBhBAHYDg8j/i/CD+P91wYvHX15dw2oQaPDvQADovvP//zPbiV3kagHokQMAAFmJXfxqA1+JfeA7PcAuQQB9VIv3oaQeQQA5HLB0RYsEsPZADIN0D1DoV+r//1mD+P90A/9F5IP/FHwooaQeQQCLBLCDwCBQ/xWg0EAAoaQeQQD/NLDoW9///1mhpB5BAIkcsEfrocdF/P7////oCQAAAItF5Oh98///w2oB6DYCAABZw4v/VYvsU1aLdQiLRgyLyIDhAzPbgPkCdUCpCAEAAHQ5i0YIV4s+K/iF/34sV1BW6IIQAABZUOgjSAAAg8QMO8d1D4tGDITAeQ+D4P2JRgzrB4NODCCDy/9fi0YIg2YEAIkGXovDW13Di/9Vi+xWi3UIhfZ1CVboNQAAAFnrL1bofP///1mFwHQFg8j/6x/3RgwAQAAAdBRW6BkQAABQ6I9IAABZ99hZG8DrAjPAXl3DahRoEPBAAOhy8v//M/+JfeSJfdxqAehCAgAAWYl9/DP2iXXgOzXALkEAD42DAAAAoaQeQQCNBLA5OHReiwD2QAyDdFZQVuhc4P//WVkz0kKJVfyhpB5BAIsEsItIDPbBg3QvOVUIdRFQ6Er///9Zg/j/dB7/ReTrGTl9CHUU9sECdA9Q6C////9Zg/j/dQMJRdyJffzoCAAAAEbrhDP/i3XgoaQeQQD/NLBW6GXg//9ZWcPHRfz+////6BIAAACDfQgBi0XkdAOLRdzo8/H//8NqAeisAAAAWcNqAegf////WcOL/1ZXM/a/iBhBAIM89UQEQQABdR2NBPVABEEAiThooA8AAP8wg8cY/xV00EAAhcB0DEaD/iR80zPAQF9ew4Mk9UAEQQAAM8Dr8Yv/U4sdoNBAAFa+QARBAFeLPoX/dBODfgQBdA1X/9NX6C/d//+DJgBZg8YIgf5gBUEAfNy+QARBAF+LBoXAdAmDfgQBdQNQ/9ODxgiB/mAFQQB85l5bw4v/VYvsi0UI/zTFQARBAP8VVNBAAF3DagxoOPBAAOjX8P//M/9HiX3kM9s5HRgSQQB1GOhk+f//ah7orvf//2j/AAAA6L70//9ZWYt1CI009UAEQQA5HnQEi8frbWoY6O37//9Zi/g7+3UP6DLw///HAAwAAAAzwOtQagroWAAAAFmJXfw5HnUraKAPAABX/xV00EAAhcB1F1foXtz//1no/e///8cADAAAAIld5OsLiT7rB1foQ9z//1nHRfz+////6AkAAACLReTocPD//8NqCugp////WcOL/1WL7ItFCFaNNMVABEEAgz4AdRNQ6CP///9ZhcB1CGoR6Kn2//9Z/zb/FVDQQABeXcOL/1WL7IPsIFNXM9tqBzPAWY195Ild4POrOV0UdRjoc+///8cAFgAAAOgW7///g8j/6ZAAAACLfRBWi3UMO/t0GTvzdRXoTO///8cAFgAAAOjv7v//g8j/62u4////f4lF5Dv4dwOJfeT/dRyNReD/dRjHRexCAAAA/3UUiXXoUIl14P9VCIPEEIlFFDvzdDU7w3wi/03keAeLReCIGOsRjUXgUFPoLAEAAFlZg/j/dAWLRRTrDzPAOV3kiFw+/w+dwIPoAl5fW8nDi/9Vi+yDfRQAdRXovO7//8cAFgAAAOhf7v//g8j/XcNTi10QVot1CFeF23UQhfZ1EDl1DHUSM8DpqgAAAIX2dAeLfQyF/3UQ6H/u///HABYAAADphwAAAOhv7v///3Uc/3UY/3UUO/t2Kos4Q1NWaF+EQADovf7//4PEGIP4/nVH6Ebu//+DOCJ1Weg87v//iTjrUIsYV1ZoX4RAAOiU/v//g8QYxkQ+/wCD+P51GYN9EP91F+gS7v//gzgidSXoCO7//4kY6xyFwHkbxgYAg/j+dRDo8+3//8cAIgAAAOiW7f//g8j/X15bXcOL/1WL7P91GGoA/3UU/3UQ/3UM/3UI6Pn+//+DxBhdw4v/VYvsUVaLdQxW6JALAACJRQyLRgxZqIJ1F+ig7f//xwAJAAAAg04MIIPI/+kvAQAAqEB0DeiF7f//xwAiAAAA6+NTM9uoAXQWiV4EqBAPhIcAAACLTgiD4P6JDolGDItGDIPg74PIAolGDIleBIld/KkMAQAAdSzoq9r//4PAIDvwdAzon9r//4PAQDvwdQ3/dQzoqlIAAFmFwHUHVuhWUgAAWfdGDAgBAABXD4SAAAAAi0YIiz6NSAGJDotOGCv4SYlOBDv7fh1XUP91DOh0QgAAg8QMiUX8602DyCCJRgyDyP/reYtNDIP5/3Qbg/n+dBaLwYPgH4vRwfoFweAGAwSVgB1BAOsFuAAEQQD2QAQgdBRqAlNTUejxUAAAI8KDxBCD+P90JYtGCIpNCIgI6xYz/0dXjUUIUP91DOgFQgAAg8QMiUX8OX38dAmDTgwgg8j/6wiLRQgl/wAAAF9bXsnDi/9Vi+yLRQhWi/HGRgwAhcB1Y+iJIgAAiUYIi0hsiQ6LSGiJTgSLDjsNKA5BAHQSiw3gC0EAhUhwdQfomVsAAIkGi0YEOwXoCkEAdBaLRgiLDeALQQCFSHB1COj4UwAAiUYEi0YI9kBwAnUUg0hwAsZGDAHrCosIiQ6LQASJRgSLxl5dwgQAi/9Vi+yD7CBTVzPbagczwFmNfeSJXeDzqzldFHUY6LLr///HABYAAADoVev//4PI/+m8AAAAi30QVot1DDv7dBw783UY6Ivr///HABYAAADoLuv//4PI/+mUAAAAx0XsQgAAAIl16Il14IH/////P3YJx0Xk////f+sGjQQ/iUXk/3UcjUXg/3UY/3UUUP9VCIPEEIlFFDvzdFY7w3xC/03keAqLReCIGP9F4OsRjUXgUFPoXf3//1lZg/j/dCL/TeR4B4tF4IgY6xGNReBQU+hA/f//WVmD+P90BYtFFOsQM8A5XeRmiUR+/g+dwIPoAl5fW8nDi/9Vi+yDfRQAdRXoz+r//8cAFgAAAOhy6v//g8j/XcNTi10QVot1CFeF23UQhfZ1EDl1DHUSM8DprgAAAIX2dAeLfQyF/3UQ6JLq///HABYAAADpiwAAAOiC6v///3Uc/3UY/3UUO/t2Kos4Q1NWaAuhQADokf7//4PEGIP4/nVJ6Fnq//+DOCJ1XehP6v//iTjrVIsYV1ZoC6FAAOho/v//M8mDxBhmiUx+/oP4/nUZg30Q/3UX6CPq//+DOCJ1J+gZ6v//iRjrHoXAeR0zyWaJDoP4/nUQ6ALq///HACIAAADopen//4PI/19eW13Di/9Vi+xWi3UIhfZ1Fejd6f//xwAWAAAA6IDp///p+gAAAItGDKiDD4TvAAAAqEAPhecAAACoAnQLg8ggiUYM6dgAAACDyAGJRgypDAEAAHUJVujSTgAAWesFi0YIiQb/dhj/dghW6GQHAABZUOhnBgAAg8QMiUYEhcAPhIsAAACD+P8PhIIAAAD2RgyCdVFW6DoHAABZg/j/dDBW6C4HAABZg/j+dCRXVughBwAAwfgFVo08hYAdQQDoEQcAAIPgH1nB4AYDB1lf6wW4AARBAIpABCSCPIJ1B4FODAAgAACBfhgAAgAAdRWLRgyoCHQOqQAEAAB1B8dGGAAQAACLDv9OBA+2AUGJDusU99gbwIPgEIPAEAlGDINmBACDyP9eXcOL/1WL7IPsHItVEFaLdQhq/liJReyJVeQ78HUb6L/o//+DIADopOj//8cACQAAAIPI/+l9BQAAUzPbO/N8CDs1dB1BAHIf6JXo//+JGOh76P//xwAJAAAA6B7o//+DyP/pTgUAAIvGwfgFV4PmH408hYAdQQCLB8HmBopMMAT2wQF1FOhY6P//iRjoPuj//8cACQAAAOtogfr///9/d06JXfQ70w+EBgUAAPbBAg+F/QQAADldDHQ1ikQwJALA0PiIRf4PvsBIagRZdBlIdQ6LwvfQqAF0FoPi/olVEItdDIld8Ot6i8L30KgBdRno7uf//4kY6NTn///HABYAAADod+f//+s2i8LR6IlNEDvBcgOJRRD/dRDoYPP//4vYWYld8IXbdR7oouf//8cADAAAAOiq5///xwAIAAAAg8j/6W4EAABqAWoAagD/dQjoRksAAIsPiUQOKIPEEIlUDiyLDwPO9kEESIvDdHqKSQWA+Qp0coN9EAB0bP9NEIB9/gCIC4sPjUMBx0X0AQAAAMZEDgUKdFCLD4pMDiWA+Qp0RYN9EAB0P4gIiw9A/00QgH3+AcdF9AIAAADGRA4lCnUliw+KTA4mgPkKdBqDfRAAdBSICIsPQP9NEMdF9AMAAADGRA4mCmoAjU3oUf91EFCLB/80Bv8VqNBAAIXAD4R4AwAAi03ohckPiG0DAAA7TRAPh2QDAACLBwFN9I1EBgT2AIAPhOQBAACAff4CD4QUAgAAhcl0CoA7CnUFgAgE6wOAIPuLXfCLRfQDw4ldEIlF9DvYD4PRAAAAi00QigE8Gg+ErwAAADwNdAyIA0NBiU0Q6ZEAAACLRfRIO8hzGI1BAYA4CnULg8ECiU0QxgMK63WJRRDrbf9FEGoAjUXoUGoBjUX/UIsH/zQG/xWo0EAAhcB1Cv8VONBAAIXAdUWDfegAdD+LB/ZEBgRIdBSAff8KdLnGAw2LB4pN/4hMBgXrJTtd8HUGgH3/CnSgagFq/2r//3UI6J5JAACDxBCAff8KdATGAw1Di0X0OUUQD4JG////6xWLB41EBgT2AEB1BYAIAusFigGIA0OLwytF8IB9/gGJRfQPhdAAAACFwA+EyAAAAEuKC4TJeAZD6YYAAAAzwEAPtsnrD4P4BH8TO13wcg5LD7YLQIC5YAVBAAB06IoTD7bKD76JYAVBAIXJdQ3oR+X//8cAKgAAAOt6QTvIdQQD2OtAiw/2RDEESHQlQ4hUMQWD+AJ8CYoTiw+IVA4lQ4P4A3UJihOLD4hUDiZDK9jrEvfYmWoBUlD/dQjoxEgAAIPEEItF5Ctd8NHoUP91DFP/dfBqAGjp/QAA/xUs0EAAiUX0hcB1NP8VONBAAFDo7OT//1mDTez/i0XwO0UMdAdQ6A7R//9Zi0Xsg/j+D4WLAQAAi0X06YMBAACLRfSLFzPJO8MPlcEDwIlF9IlMFjDrxoXJdAtmgzsKdQWACATrA4Ag+4td8ItF9APDiV0QiUX0O9gPgwEBAACLRRAPtwiD+RoPhNkAAACD+Q10EWaJC4PDAoPAAolFEOm1AAAAi030g8H+O8FzHo1IAmaDOQp1DYPABIlFEGoK6Y4AAACJTRDphAAAAINFEAJqAI1F6FBqAo1F+FCLB/80Bv8VqNBAAIXAdQr/FTjQQACFwHVbg33oAHRViwf2RAYESHQoZoN9+Ap0smoNWGaJA4sHik34iEwGBYsHik35iEwGJYsHxkQGJgrrKjtd8HUHZoN9+Ap0hWoBav9q/v91COhjRwAAg8QQZoN9+Ap0CWoNWGaJA4PDAotF9DlFEA+CGv///+sZiw+NdA4E9gZAdQWADgLrCWaLAGaJA4PDAitd8Ild9OmS/v///xU40EAAagVeO8Z1F+hB4///xwAJAAAA6Enj//+JMOlq/v//g/htD4Va/v//g2XsAOlc/v//M8BfW17Jw2oQaFjwQADoYuP//4tdCIP7/nUb6BDj//+DIADo9eL//8cACQAAAIPI/+m2AAAAhdt4CDsddB1BAHIa6Oni//+DIADozuL//8cACQAAAOhx4v//69KLw8H4BY08hYAdQQCL84PmH8HmBosHD75EMASD4AF0xrj///9/O0UQG8BAdRXoouL//4MgAOiH4v//xwAWAAAA67dT6OxjAABZg2X8AIsH9kQwBAF0FP91EP91DFPokvn//4PEDIlF5OsX6FLi///HAAkAAADoWuL//4MgAINN5P/HRfz+////6AwAAACLReToyeL//8OLXQhT6DRkAABZw4v/VYvsi0UIhcB1FegP4v//xwAWAAAA6LLh//+DyP9dw4tAEF3Di/9Vi+xWi3UUhfZ1BDPA62GDfQgAdRPo3uH//2oWXokw6ILh//+LxutIg30QAHQWOXUMchFW/3UQ/3UI6JFlAACDxAzrx/91DGoA/3UI6C8AAACDxAyDfRAAdLs5dQxzDuiU4f//aiJZiQiL8euyahZYXl3DzMzMzMzMzMzMzMzMzItUJAyLTCQEhdJ0aTPAikQkCITAdRaB+oAAAAByDoM9bB1BAAB0BemFaAAAV4v5g/oEcjH32YPhA3QMK9GIB4PHAYPpAXX2i8jB4AgDwYvIweAQA8GLyoPiA8HpAnQG86uF0nQKiAeDxwGD6gF19otEJAhfw4tEJATDi/9Vi+xWi3UIVujP/v//UOhsRgAAWVmFwHR86EfO//+DwCA78HUEM8DrD+g3zv//g8BAO/B1YDPAQP8F4A5BAPdGDAwBAAB1TlNXjTyF2BlBAIM/ALsAEAAAdSBT6Evs//9ZiQeFwHUTjUYUagKJRgiJBliJRhiJRgTrDYs/iX4IiT6JXhiJXgSBTgwCEQAAM8BfQFvrAjPAXl3Di/9Vi+yDfQgAdCdWi3UM90YMABAAAHQZVuhu7f//gWYM/+7//4NmGACDJgCDZggAWV5dw/ZBDEB0BoN5CAB0JP9JBHgLixGIAv8BD7bA6wwPvsBRUOhI8v//WVmD+P91AwkGw/8Gw4v/VYvsgeyAAgAAoYQCQQAzxYlF/FOLXQxWi3UIM8BXi30U/3UQjY2k/f//ibXQ/f//ib3k/f//iYW0/f//iYXw/f//iYXI/f//iYXo/f//iYXM/f//iYW8/f//iYXE/f//6Djz///oj9///4mFlP3//4X2dSvogN///8cAFgAAAOgj3///gL2w/f//AHQKi4Ws/f//g2Bw/YPI/+k3CwAA9kYMQHVeVugu/f//WboABEEAg/j/dBuD+P50FovIg+Efi/DB/gXB4QYDDLWAHUEA6wKLyvZBJH91m4P4/3QZg/j+dBSLyIPgH8H5BcHgBgMEjYAdQQDrAovC9kAkgA+Fcf///zPJO9kPhGf///+KE4mN3P3//4mN2P3//4mNuP3//4iV7/3//4TSD4SOCgAAQzP2iZ3A/f//ObXc/f//D4x5CgAAjULgPFh3Dw++wg++gPDbQACD4A/rAjPAD76EwRDcQABqB8H4BFmJhYz9//87wQ+HIAoAAP8khbVYQACDjej9////ibWI/f//ibW8/f//ibXI/f//ibXM/f//ibXw/f//ibXE/f//6ekJAAAPvsKD6CB0SoPoA3Q2g+gIdCVISHQVg+gDD4XKCQAAg43w/f//COm+CQAAg43w/f//BOmyCQAAg43w/f//AemmCQAAgY3w/f//gAAAAOmXCQAAg43w/f//AumLCQAAgPoqdSyDxwSJveT9//+Lf/yJvcj9//87/g+NbAkAAION8P3//wT3ncj9///pWgkAAIuFyP3//2vACg++yo1ECNCJhcj9///pPwkAAIm16P3//+k0CQAAgPoqdSaDxwSJveT9//+Lf/yJvej9//87/g+NFQkAAION6P3////pCQkAAIuF6P3//2vACg++yo1ECNCJhej9///p7ggAAID6SXRVgPpodESA+mx0GID6dw+F1ggAAIGN8P3//wAIAADpxwgAAIA7bHUWQ4GN8P3//wAQAACJncD9///prAgAAION8P3//xDpoAgAAION8P3//yDplAgAAIoDPDZ1HoB7ATR1GIPDAoGN8P3//wCAAACJncD9///pcAgAADwzdR6AewEydRiDwwKBpfD9////f///iZ3A/f//6U4IAAA8ZA+ERggAADxpD4Q+CAAAPG8PhDYIAAA8dQ+ELggAADx4D4QmCAAAPFgPhB4IAACJtYz9//8htcT9//+NhaT9//9QD7bCUOgmTwAAWYXAioXv/f//WXQii43Q/f//jbXc/f//6Bj8//+KA0OJncD9//+EwA+EsPz//4uN0P3//4213P3//+j2+///6b4HAAAPvsKD+GQPj7YBAAAPhFgCAACD+FMPj7oAAAB0TIPoQXQQSEh0JEhIdAhISA+FqwUAAIDCIMeFiP3//wEAAACIle/9///pVgIAAPeF8P3//zAIAAAPhZ4AAACBjfD9//8ACAAA6Y8AAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJveT9//+Lf/yJveD9//8PhP4EAACF/3ULoWQGQQCJheD9//+LheD9///HhcT9//8BAAAA6cwEAACD6FgPhCIDAABISHR/K8EPhLYBAABISA+F6wQAAIu95P3//4PHBPeF8P3//xAIAACJveT9//90MA+3R/xQaAACAACNhfT9//9QjYXY/f//UOhNZAAAg8QQhcB0H8eFvP3//wEAAADrE4pH/IiF9P3//8eF2P3//wEAAACNhfT9//+JheD9///pfAQAAIsHg8cEib3k/f//hcB0O4tIBIXJdDT3hfD9//8ACAAAD78AiY3g/f//dBSZK8LR+MeFxP3//wEAAADpNwQAACG1xP3//+ksBAAAoWAGQQCJheD9//9Q6EskAABZ6RUEAACD+HAPjz0CAAAPhCUCAACD+GUPjAMEAACD+GcPjrcAAACD+Gl0fIP4bnQug/hvD4XnAwAA9oXw/f//gIu95P3//8eF2P3//wgAAAB0bIGN8P3//wACAADrYIOF5P3//wSLheT9//+LcPzobEsAAIXAD4Ri+v//9oXw/f//IHQMZouF3P3//2aJBusIi4Xc/f//iQbHhbz9//8BAAAA6T4FAACLveT9//+DjfD9//9Ax4XY/f//CgAAAIuN8P3///fBAIAAAA+E4AEAAIsHi1cEg8cI6QwCAACLveT9//+DjfD9//9AjZ30/f//uAACAACJneD9//+JhaD9//85tej9//99DMeF6P3//wYAAADranURgPpndWPHhej9//8BAAAA61c5hej9//9+BomF6P3//4G96P3//6MAAAB+PYu16P3//4HGXQEAAFboveT//4qV7/3//1mJhbj9//+FwHQQiYXg/f//ibWg/f//i9jrCseF6P3//6MAAACLB4s1fNBAAIPHCImFgP3//4tH/ImFhP3//42FpP3//1D/tYj9//8PvsL/tej9//+JveT9//9Q/7Wg/f//jYWA/f//U1D/NagGQQD/1v/Qi73w/f//g8QcgeeAAAAAdB2Dvej9//8AdRSNhaT9//9QU/81tAZBAP/W/9BZWYC97/3//2d1GIX/dRSNhaT9//9QU/81sAZBAP/W/9BZWYA7LXURgY3w/f//AAEAAEOJneD9//9T6cH9///Hhej9//8IAAAAiY20/f//6yqD6HMPhG78//9ISA+EWP7//4PoAw+FuwEAAIu95P3//8eFtP3//ycAAAD2hfD9//+Ax4XY/f//EAAAAA+EMv7//4qFtP3//wRRxoXU/f//MIiF1f3//8eFzP3//wIAAADpDv7///fBABAAAA+FFP7//4PHBPbBIHQYib3k/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om95P3///bBQHQahdJ/FnwEhcBzEPfYE9b32oGN8P3//wABAAD3hfD9//8AkAAAi/qL2HUCM/85tej9//99DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8MLx3UGIbXM/f//jXXzi4Xo/f///43o/f//hcB/BovDC8d0LYuF2P3//5lSUFdT6PdJAACDwTCJnaD9//+L2Iv6g/k5fgYDjbT9//+IDk7rvY1F8yvGRveF8P3//wACAACJhdj9//+JteD9//90YoXAdAeLzoA5MHRX/43g/f//i43g/f//xgEwQOs/SWY5MHQHg8AChcl18yuF4P3//9H46yiF/3ULoWAGQQCJheD9//+LheD9///rB0mAOAB0BUCFyXX1K4Xg/f//iYXY/f//g728/f//AA+FuAEAAIuN8P3///bBQHQ198EAAQAAdAnGhdT9//8t6xr2wQF0CcaF1P3//yvrDPbBAnQRxoXU/f//IMeFzP3//wEAAACLhcj9//8rhdj9//8rhcz9//+JhaD9///2wQx1JYv46x2LjdD9//+Ntdz9//+wIE/okvX//4O93P3///90BIX/f9//tcz9//+LvZT9//+LndD9//+NhdT9//9QjYXc/f//6MQsAAD2hfD9//8IWVl0LvaF8P3//wR1JYu9oP3//+sZjbXc/f//i8uwME/oNfX//4O93P3///90BIX/f+ODvcT9//8Ai4XY/f//dHWFwH5xi7Xg/f//iYWY/f//D7cG/42Y/f//UGoGjUX0UI2FkP3//1CDxgLocF4AAIPEEIXAdTY5hZD9//90Lv+1kP3//4u9lP3//4ud0P3//41F9FCNhdz9///oHSwAAIO9mP3//wBZWXWm6yODjdz9////6xqLvZT9//9Q/7Xg/f//jYXc/f//6O8rAABZWYO93P3//wB8MvaF8P3//wR0KYu9oP3//+sdi43Q/f//jbXc/f//sCBP6Fz0//+Dvdz9////dASF/3/fg724/f//AHQT/7W4/f//6MTA//+Dpbj9//8AWYudwP3//4oDiIXv/f//hMB0E4uNjP3//4u95P3//4rQ6XL1//+AvbD9//8AdAqLhaz9//+DYHD9i4Xc/f//i038X14zzVvoNr///8nDkE9QQABOTkAAfk5AANxOQAAoT0AAM09AAHlPQACpUEAAi/9Vi+xWi3UIVujuVAAAWYP4/3UQ6NnT///HAAkAAACDyP/rTVf/dRBqAP91DFD/FazQQACL+IP//3UI/xU40EAA6wIzwIXAdAxQ6MnT//9Zg8j/6xuLxsH4BYsEhYAdQQCD5h/B5gaNRDAEgCD9i8dfXl3DahBoePBAAOjK0///i10Ig/v+dRvoeNP//4MgAOhd0///xwAJ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hUjl//8r8GoAjYUo5f//UFaNhUjl//9Qi4Uk5f//iwD/NAf/FZDQQACFwA+EaQEAAIuFKOX//wGFOOX//zvGD4xhAQAAi8MrhTTl//87RRAPgkf////pSwEAAIuFNOX//4mFLOX//zlNEA+GdQEAAIuNLOX//4OlQOX//wArjTTl//9qAo2FSPn//147TRBzO4uVLOX//w+3EgG1LOX//wPOg/oKdQ5qDVtmiRgDxgG1QOX//wG1QOX//2aJEAPGgb1A5f//qAYAAHLAM/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xW40EAAi9g73g+ElwAAAGoAjYUo5f//UIvDK8ZQjYQ18Ov//1CLhSTl//+LAP80B/8VkNBAAIXAdAwDtSjl//873n/L6wz/FTjQQACJhUTl//873n9ci4Us5f//K4U05f//iYU45f//O0UQD4IL////6z9RjY0o5f//Uf91EP+1NOX///80OP8VkNBAAIXAdBWLhSjl//+DpUTl//8AiYU45f//6wz/FTjQQACJhUTl//+DvTjl//8AdWyDvUTl//8AdC1qBV45tUTl//91FOjmqv//xwAJAAAA6O6q//+JMOs//7VE5f//6PKq//9Z6zGLhSTl//+LAPZEBwRAdA+LhTTl//+AOBp1BDPA6yTopqr//8cAHAAAAOiuqv//gyAAg8j/6wyLhTjl//8rhTDl//9bi038XzPNXuialf//ycNqEGio8UAA6MSq//+LXQiD+/51G+hyqv//gyAA6Feq///HAAkAAACDyP/plAAAAIXbeAg7HXQdQQByGuhLqv//gyAA6DCq///HAAkAAADo06n//+vSi8PB+AWNPIWAHUEAi/OD5h/B5gaLBw++RDAEg+ABdMZT6HArAABZg2X8AIsH9kQwBAF0FP91EP91DFPobvj//4PEDIlF5OsX6Nap///HAAkAAADo3qn//4MgAINN5P/HRfz+////6AwAAACLReToTar//8OLXQhT6LgrAABZw2oQaMjxQADo8Kn//4tdCIP7/nUT6Iup///HAAkAAACDyP/poQAAAIXbeAg7HXQdQQByEuhsqf//xwAJAAAA6A+p///r2ovDwfgFjTyFgB1BAIvzg+YfweYGiwcPvkQGBIPgAXTOU+isKgAAWYNl/ACLB/ZEBgQBdDFT6C8qAABZUP8VBNFAAIXAdQv/FTjQQACJReTrBINl5ACDfeQAdBnoEqn//4tN5IkI6PWo///HAAkAAACDTeT/x0X8/v///+gMAAAAi0Xk6HSp///Di10IU+jfKgAAWcOL/1WL7FH2QwxAVovwiweJRfx0DYN7CAB1B4tFDAEG6z6DJwCDfQwAfjCLRQiKAP9NDIvL6GTI////RQiDPv91DoM/KnUPi8uwP+hOyP//g30MAH/Vgz8AdQWLRfyJB17Jw4v/VYvsgeyAAgAAoYQCQQAzxYlF/FOLXQxWi3UIM8BXi30U/3UQjY2s/f//ibXQ/f//ib3k/f//iYWo/f//iYXw/f//iYXI/f//iYXo/f//iYXM/f//iYWk/f//iYXE/f//6Ka7///o/af//4mFnP3//4X2dSvo7qf//8cAFgAAAOiRp///gL24/f//AHQKi4W0/f//g2Bw/YPI/+lhCwAA9kYMQHVeVuicxf//WboABEEAg/j/dBuD+P50FovIg+Efi/DB/gXB4QYDDLWAHUEA6wKLyvZBJH91m4P4/3QZg/j+dBSLyIPgH8H5BcHgBgMEjYAdQQDrAovC9kAkgA+Fcf///zP2O94PhGf///+KE4m13P3//4m12P3//4m1vP3//4m1oP3//4iV7/3//4TSD4SyCgAAQ4mdwP3//zm13P3//w+MiQoAAI1C4DxYdw8PvsIPtoDA5UAAg+AP6wIzwIuNvP3//2vACQ+2hAjg5UAAagjB6AReiYW8/f//O8YPhO/+//9qB1k7wQ+HIAoAAP8khXOQQAAzwION6P3///+JhYz9//+JhaT9//+Jhcj9//+Jhcz9//+JhfD9//+JhcT9///p5wkAAA++woPoIHRIg+gDdDQrxnQkSEh0FIPoAw+FyQkAAAm18P3//+m+CQAAg43w/f//BOmyCQAAg43w/f//AemmCQAAgY3w/f//gAAAAOmXCQAAg43w/f//AumLCQAAgPoqdSyDxwSJveT9//+Lf/yJvcj9//+F/w+JbAkAAION8P3//wT3ncj9///pWgkAAIuFyP3//2vACg++yo1ECNCJhcj9///pPwkAAIOl6P3//wDpMwkAAID6KnUmg8cEib3k/f//i3/8ib3o/f//hf8PiRQJAACDjej9////6QgJAACLhej9//9rwAoPvsqNRAjQiYXo/f//6e0IAACA+kl0VYD6aHREgPpsdBiA+ncPhdUIAACBjfD9//8ACAAA6cYIAACAO2x1FkOBjfD9//8AEAAAiZ3A/f//6asIAACDjfD9//8Q6Z8IAACDjfD9//8g6ZMIAACKAzw2dR6AewE0dRiDwwKBjfD9//8AgAAAiZ3A/f//6W8IAAA8M3UegHsBMnUYg8MCgaXw/f///3///4mdwP3//+lNCAAAPGQPhEUIAAA8aQ+EPQgAADxvD4Q1CAAAPHUPhC0IAAA8eA+EJQgAADxYD4QdCAAAg6W8/f//AIOlxP3//wCNhaz9//9QD7bCUOh5FwAAWYXAioXv/f//WXQii43Q/f//jbXc/f//6GvE//+KA0OJncD9//+EwA+Elfz//4uN0P3//4213P3//+hJxP//6bsHAAAPvsKD+GQPj7cBAAAPhFUCAACD+FMPj7oAAAB0TIPoQXQQSEh0JEhIdAhISA+FqAUAAIDCIMeFjP3//wEAAACIle/9///pUwIAAPeF8P3//zAIAAAPhZ4AAACBjfD9//8ACAAA6Y8AAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJveT9//+Lf/yJveD9//8PhPsEAACF/3ULoWQGQQCJheD9//+LheD9///HhcT9//8BAAAA6ckEAACD6FgPhBwDAABISHR/K8EPhLMBAABISA+F6AQAAIu95P3//4PHBPeF8P3//xAIAACJveT9//90MA+3R/xQaAACAACNhfT9//9QjYXY/f//UOigLAAAg8QQhcB0H8eFpP3//wEAAADrE4pH/IiF9P3//8eF2P3//wEAAACNhfT9//+JheD9///peQQAAIsHg8cEib3k/f//hcB0PItIBIXJdDX3hfD9//8ACAAAD78AiY3g/f//dBSZK8LR+MeFxP3//wEAAADpNAQAAIOlxP3//wDpKAQAAKFgBkEAiYXg/f//UOid7P//WekRBAAAg/hwD482AgAAD4QiAgAAg/hlD4z/AwAAg/hnD46zAAAAg/hpdHiD+G50KoP4bw+F4wMAAPaF8P3//4CLveT9//+Jtdj9//90bIGN8P3//wACAADrYIOF5P3//wSLheT9//+LcPzowhMAAIXAD4RK+v//9oXw/f//IHQMZouF3P3//2aJBusIi4Xc/f//iQbHhaT9//8BAAAA6T4FAACLveT9//+DjfD9//9Ax4XY/f//CgAAAIuN8P3///fBAIAAAA+E3QEAAAP+i0f4i1f86QkCAACLveT9//+DjfD9//9Ag73o/f//AI2d9P3//7gAAgAAiZ3g/f//iYWY/f//fQzHhej9//8GAAAA62p1EYD6Z3Vjx4Xo/f//AQAAAOtXOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj2Ltej9//+Bxl0BAABW6BKt//+Kle/9//9ZiYWg/f//hcB0EImF4P3//4m1mP3//4vY6wrHhej9//+jAAAAiweLNXzQQACDxwiJhYD9//+LR/yJhYT9//+Nhaz9//9Q/7WM/f//D77C/7Xo/f//ib3k/f//UP+1mP3//42FgP3//1NQ/zWoBkEA/9b/0Iu98P3//4PEHIHngAAAAHQdg73o/f//AHUUjYWs/f//UFP/NbQGQQD/1v/QWVmAve/9//9ndRiF/3UUjYWs/f//UFP/NbAGQQD/1v/QWVmAOy11EYGN8P3//wABAABDiZ3g/f//U+nE/f//ibXo/f//iY2o/f//6yqD6HMPhHT8//9ISA+EW/7//4PoAw+FvgEAAIu95P3//8eFqP3//ycAAAD2hfD9//+Ax4XY/f//EAAAAA+ENf7//4qFqP3//wRRxoXU/f//MIiF1f3//8eFzP3//wIAAADpEf7///fBABAAAA+FF/7//4PHBPbBIHQYib3k/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om95P3///bBQHQbhdJ/F3wEhcBzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIv6i9h1AjP/g73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LwwvHdQYhhcz9//+NdfOLhej9////jej9//+FwH8Gi8MLx3Qti4XY/f//mVJQV1PoThIAAIPBMImdmP3//4vYi/qD+Tl+BgONqP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF2P3//4m14P3//3RjhcB0B4vOgDkwdFj/jeD9//+LjeD9///GATBA60BJZoM4AHQHg8AChcl18iuF4P3//9H46yiF/3ULoWAGQQCJheD9//+LheD9///rB0mAOAB0BUCFyXX1K4Xg/f//iYXY/f//g72k/f//AA+FuAEAAIuN8P3///bBQHQ198EAAQAAdAnGhdT9//8t6xr2wQF0CcaF1P3//yvrDPbBAnQRxoXU/f//IMeFzP3//wEAAACLhcj9//8rhdj9//8rhcz9//+JhZj9///2wQx1JYv46x2LjdD9//+Ntdz9//+wIE/o6L3//4O93P3///90BIX/f9//tcz9//+LvZz9//+LndD9//+NhdT9//9QjYXc/f//6Br1///2hfD9//8IWVl0LvaF8P3//wR1JYu9mP3//+sZjbXc/f//i8uwME/oi73//4O93P3///90BIX/f+ODvcT9//8Ai4XY/f//dHWFwH5xi7Xg/f//iYWQ/f//D7cG/42Q/f//UGoGjUX0UI2FiP3//1CDxgLoxiYAAIPEEIXAdTY5hYj9//90Lv+1iP3//4u9nP3//4ud0P3//41F9FCNhdz9///oc/T//4O9kP3//wBZWXWm6yODjdz9////6xqLvZz9//9Q/7Xg/f//jYXc/f//6EX0//9ZWYO93P3//wB8MvaF8P3//wR0KYu9mP3//+sdi43Q/f//jbXc/f//sCBP6LK8//+Dvdz9////dASF/3/fg72g/f//AHQT/7Wg/f//6BqJ//+DpaD9//8AWYudwP3//4oDiIXv/f//hMB0D4u95P3//zP2itDpZPX//4O9vP3//wB0DYO9vP3//wcPhY30//+Avbj9//8AdAqLhbT9//+DYHD9i4Xc/f//i038X14zzVvoeof//8nDjUkA+4dAAPiFQAAqhkAAhoZAANKGQADehkAAJIdAAFaIQACL/1WL7FFRi0UMVot1CIlF+ItFEFdWiUX86CEdAACDz/9ZO8d1EegKnP//xwAJAAAAi8eL1+tK/3UUjU38Uf91+FD/FazQQACJRfg7x3UT/xU40EAAhcB0CVDo/Jv//1nrz4vGwfgFiwSFgB1BAIPmH8HmBo1EMASAIP2LRfiLVfxfXsnDahRo6PFAAOj8m///g8v/iV3ciV3gi0UIg/j+dRzooZv//4MgAOiGm///xwAJAAAAi8OL0+mhAAAAhcB4CDsFdB1BAHIa6Hmb//+DIADoXpv//8cACQAAAOgBm///69GLyMH5BY08jYAdQQCL8IPmH8HmBosPD75MMQSD4QF0xlDonhwAAFmDZfwAiwf2RDAEAXQc/3UU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DgkAAION9Pv////pAgkAAIuF9Pv//2vACg+3yo1ECNCJhfT7///p5wgAAA+3woP4SXRRg/hodECD+Gx0GIP4dw+FzAgAAIGN+Pv//wAIAADpvQgAAGaDP2x1EQP5gY34+///ABAAAOmmCAAAg434+///EOmaCAAAg434+///IOmOCAAAD7cHg/g2dRlmg38CNHUSg8cEgY34+///AIAAAOltCAAAg/gzdRlmg38CMnUSg8cEgaX4+////3///+lPCAAAg/hkD4RGCAAAg/hpD4Q9CAAAg/hvD4Q0CAAAg/h1D4QrCAAAg/h4D4QiCAAAg/hYD4QZCAAAg6XE+///AIuF1Pv//1KNtej7///HhdD7//8BAAAA6Bf8//9Z6fAHAAAPt8KD+GQPjzECAAAPhL8CAACD+FMPjxwBAAB0f4PoQXQQK8F0WivBdAgrwQ+F4QUAAIPCIMeFmPv//wEAAACJleD7//+LjfT7//+Djfj7//9Ajb38+///uAACAACJvfD7//+Jhez7//+FyQ+JjgIAAMeF9Pv//wYAAADp3gIAAPeF+Pv//zAIAAAPhckAAACDjfj7//8g6b0AAAD3hfj7//8wCAAAdQeDjfj7//8gi730+///g///dQW/////f4PDBPaF+Pv//yCJneT7//+LW/yJnfD7//8PhPkEAACF23ULoWAGQQCJhfD7//+Dpez7//8Ai7Xw+///hf8PjhEFAACKBoTAD4QHBQAAjY20+///D7bAUVDoC/r//1lZhcB0AUZG/4Xs+///Ob3s+///fNDp3AQAAIPoWA+E3wIAACvBD4SVAAAAg+gHD4T0/v//K8EPhboEAAAPtwODwwQz9kb2hfj7//8gibXQ+///iZ3k+///iYWk+///dEKIhcj7//+NhbT7//9Qi4W0+///xoXJ+///AP+wrAAAAI2FyPv//1CNhfz7//9Q6Ef4//+DxBCFwHkPibWw+///6wdmiYX8+///jYX8+///iYXw+///ibXs+///6TYEAACLA4PDBImd5Pv//4XAdDqLSASFyXQz94X4+///AAgAAA+/AImN8Pv//3QSmSvCx4XQ+///AQAAAOnxAwAAg6XQ+///AOnnAwAAoWAGQQCJhfD7//9Q6BXQ//9Z6dADAACD+HAPj+UBAAAPhM0BAACD+GUPjL4DAACD+GcPjuf9//+D+Gl0boP4bnQkg/hvD4WiAwAA9oX4+///gIm14Pv//3RigY34+///AAIAAOtWg8MEiZ3k+///i1v86ET3//+FwA+EePr///aF+Pv//yB0DGaLhej7//9miQPrCIuF6Pv//4kDx4Ww+///AQAAAOn3BAAAg434+///QMeF4Pv//woAAAD3hfj7//8AgAAAD4SZAQAAA96LQ/iLU/zp1QEAAHUSZoP6Z3VXx4X0+///AQAAAOtLO8h+CImF9Pv//4vIgfmjAAAAfjeNsV0BAABW6OCQ//+LleD7//9ZiYWo+///hcB0EImF8Pv//4m17Pv//4v46wrHhfT7//+jAAAAiwOLNXzQQACDwwiJhZD7//+LQ/yJhZT7//+NhbT7//9Q/7WY+///D77C/7X0+///iZ3k+///UP+17Pv//42FkPv//1dQ/zWoBkEA/9b/0Iud+Pv//4PEHIHjgAAAAHQdg730+///AHUUjYW0+///UFf/NbQGQQD/1v/QWVlmg73g+///Z3UYhdt1FI2FtPv//1BX/zWwBkEA/9b/0FlZgD8tdRGBjfj7//8AAQAAR4m98Pv//1fpGf7//4m19Pv//8eFrPv//wcAAADrJIPocw+Ee/z//yvBD4Sc/v//g+gDD4XOAQAAx4Ws+///JwAAAPaF+Pv//4DHheD7//8QAAAAD4R8/v//ajBYZomFzPv//4uFrPv//4PAUWaJhc77//+Jjdz7///pV/7///eF+Pv//wAQAAAPhVf+//+DwwT2hfj7//8gdBz2hfj7//9AiZ3k+///dAYPv0P86wQPt0P8mesX9oX4+///QItD/HQDmesCM9KJneT7///2hfj7//9AdBuF0n8XfASFwHMR99iD0gD32oGN+Pv//wABAAD3hfj7//8AkAAAi/qL2HUCM/+DvfT7//8AfQzHhfT7//8BAAAA6xqDpfj7///3uAACAAA5hfT7//9+BomF9Pv//4vDC8d1BiGF3Pv//421+/3//4uF9Pv///+N9Pv//4XAfwaLwwvHdC2LheD7//+ZUlBXU+gF9v//g8EwiZ2M+///i9iL+oP5OX4GA42s+///iA5O672Nhfv9//8rxkb3hfj7//8AAgAAiYXs+///ibXw+///dF6FwHQHi8aAODB0U/+N8Pv//4uF8Pv///+F7Pv//8YAMOs8hdt1C6FkBkEAiYXw+///i4Xw+///x4XQ+///AQAAAOsJT2aDOAB0BgPBhf918yuF8Pv//9H4iYXs+///g72w+///AA+FqAEAAIuF+Pv//6hAdCupAAEAAHQEai3rDqgBdARqK+sGqAJ0FGogWWaJjcz7///Hhdz7//8BAAAAi73Y+///K73s+///K73c+///ib3g+///qAx1JOsei4XU+///aiCNtej7//9P6Ir1//+Dvej7////WXQEhf9/3v+13Pv//4u9nPv//4ud1Pv//42FzPv//1CNhej7///oh/X///aF+Pv//whZWXQv9oX4+///BHUmi73g+///6xpqMI216Pv//4vDT+gs9f//g73o+////1l0BIX/f+KDvdD7//8AdWuLnez7//+F235hi73w+///jYW0+///UIuFtPv///+wrAAAAI2FpPv//1dQS+jK8v//g8QQiYWM+///hcB+JP+1pPv//4uF1Pv//4216Pv//+jA9P//A72M+///WYXbf7DrLoON6Pv////rJf+17Pv//4u9nPv///+18Pv//4ud1Pv//42F6Pv//+i29P//WVmDvej7//8AfDP2hfj7//8EdCqLveD7///rHouF1Pv//2ogjbXo+///T+hX9P//g73o+////1l0BIX/f96Dvaj7//8AdBP/taj7///o42z//4OlqPv//wBZi72g+///i53k+///D7cHM/aJheD7//9mO8Z0B4vQ6XH1//85tcT7//90DYO9xPv//wcPhQH1//+AvcD7//8AdAqLhbz7//+DYHD9i4Xo+///i038X14zzVvoQmv//8nDjUkAQqRAAEKiQAB0okAAz6JAABujQAAno0AAbaNAAGSkQACL/1WL7ItFCFZXhcB4WTsFdB1BAHNRi8jB+QWL8IPmH408jYAdQQCLD8HmBoM8Dv91NYM9gAJBAAFTi10MdR6D6AB0EEh0CEh1E1Nq9OsIU2r16wNTavb/FRjRQACLB4kcBjPAW+sW6JF////HAAkAAADomX///4MgAIPI/19eXcOL/1WL7ItNCFMz21ZXO8t8WzsNdB1BAHNTi8HB+AWL8YPmH408hYAdQQCLB8HmBvZEMAQBdDaDPDD/dDCDPYACQQABdR0ry3QQSXQISXUTU2r06whTavXrA1Nq9v8VGNFAAIsHgwwG/zPA6xXoC3///8cACQAAAOgTf///iRiDyP9f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/3ZY6LlZ////dlzosVn///92YOipWf///3Zk6KFZ////dmjomVn///92bOiRWf///3Zw6IlZ////dnTogVn///92eOh5Wf///3Z86HFZ//+DxED/toAAAADoY1n///+2hAAAAOhYWf///7aIAAAA6E1Z////towAAADoQln///+2kAAAAOg3Wf///7aUAAAA6CxZ////tpgAAADoIVn///+2nAAAAOgWWf///7agAAAA6AtZ////tqQAAADoAFn///+2qAAAAOj1WP///7a8AAAA6OpY////tsAAAADo31j///+2xAAAAOjUWP///7bIAAAA6MlY////tswAAADovlj//4PEQP+20AAAAOiwWP///7a4AAAA6KVY////ttgAAADomlj///+23AAAAOiPWP///7bgAAAA6IRY////tuQAAADoeVj///+26AAAAOhuWP///7bsAAAA6GNY////ttQAAADoWFj///+28AAAAOhNWP///7b0AAAA6EJY////tvgAAADoN1j///+2/AAAAOgsWP///7YAAQAA6CFY////tgQBAADoFlj///+2CAEAAOgLWP//g8RA/7YMAQAA6P1X////thABAADo8lf///+2FAEAAOjnV////7YYAQAA6NxX////thwBAADo0Vf///+2IAEAAOjGV////7YkAQAA6LtX////tigBAADosFf///+2LAEAAOilV////7YwAQAA6JpX////tjQBAADoj1f///+2OAEAAOiEV////7Y8AQAA6HlX////tkABAADoblf///+2RAEAAOhjV////7ZIAQAA6FhX//+DxED/tkwBAADoSlf///+2UAEAAOg/V////7ZUAQAA6DRX////tlgBAADoKVf///+2XAEAAOgeV////7ZgAQAA6BNX//+DxBheXcOL/1WL7FaLdQiF9nRZiwY7BUgOQQB0B1Do8Fb//1mLRgQ7BUwOQQB0B1Do3lb//1mLRgg7BVAOQQB0B1DozFb//1mLRjA7BXgOQQB0B1Doulb//1mLdjQ7NXwOQQB0B1boqFb//1leXcOL/1WL7FaLdQiF9g+E6gAAAItGDDsFVA5BAHQHUOiCVv//WYtGEDsFWA5BAHQHUOhwVv//WYtGFDsFXA5BAHQHUOheVv//WYtGGDsFYA5BAHQHUOhMVv//WYtGHDsFZA5BAHQHUOg6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cABwAGwAaQBjAGEAdABpAG8AbgAuACAASQB0ACAAaQBzACAAbQBvAHMAdAAgAGwAaQBrAGUAbAB5ACAAdABoAGUAIAByAGUAcwB1AGwAdAAgAG8AZgAgAGMAYQBsAGwAaQBuAGcAIABhAG4AIABNAFMASQBMAC0AYwBvAG0AcABpAGwAZQBkACAAKAAvAGMAbAByACkAIABmAHUAbgBjAHQAaQBvAG4AIABmAHIAbwBtACAAYQAgAG4AYQB0AGkAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACAAbwByACAAZgByAG8AbQAgAEQAbABsAE0AYQBpAG4ALgANAAoAAAAAAFIANgAwADMAMgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwBjAGEAbABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuAA0ACgAAAAAAUgA2ADAAMwAxAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIAB0AGgAZQAgAEMAUgBUACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AYwBlAC4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4ADQAKAAAAAABSADYAMAAzADAADQAKAC0AIABDAFIAVAAgAG4AbwB0ACAAaQBuAGkAdABpAGEAbABpAHoAZQBkAA0ACgAAAAAAUgA2ADAAMgA4AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAaABlAGEAcAANAAoAAAAAAAAAAABSADYAMAAyADcADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AdwBpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA2AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAcwB0AGQAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANQANAAoALQAgAHAAdQByAGUAIAB2AGkAcgB0AHUAYQBsACAAZgB1AG4AYwB0AGkAbwBuACAAYwBhAGwAbAANAAoAAAAAAAAAUgA2ADAAMgA0AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAXwBvAG4AZQB4AGkAdAAvAGEAdABlAHgAaQB0ACAAdABhAGIAbABlAA0ACgAAAAAAAAAAAFIANgAwADEAOQANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAbwBwAGUAbgAgAGMAbwBuAHMAbwBsAGUAIABkAGUAdgBpAGMAZQANAAoAAAAAAAAAAABSADYAMAAxADgADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAaABlAGEAcAAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADcADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAbQB1AGwAdABpAHQAaAByAGUAYQBkACAAbABvAGMAawAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIAB0AGgAcgBlAGEAZAAgAGQAYQB0AGEADQAKAAAAUgA2ADAAMQAwAA0ACgAtACAAYQBiAG8AcgB0ACgAKQAgAGgAYQBzACAAYgBlAGUAbgAgAGMAYQBsAGwAZQBkAA0ACgAAAAAAUgA2ADAAMAA5AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AA0ACgAAAFIANgAwADAAOAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGEAcgBnAHUAbQBlAG4AdABzAA0ACgAAAAAAAABSADYAMAAwADIADQAKAC0AIABmAGwAbwBhAHQAaQBuAGcAIABwAG8AaQBuAHQAIABzAHUAcABwAG8AcgB0ACAAbgBvAHQAIABsAG8AYQBkAGUAZAANAAoAAAAAAAAAAAACAAAAKNpAAAgAAADQ2UAACQAAAHjZQAAKAAAAMNlAABAAAADY2EAAEQAAAHjYQAASAAAAMNhAABMAAADY10AAGAAAAGjXQAAZAAAAGNdAABoAAACo1kAAGwAAADjWQAAcAAAA6NVAAB4AAACo1UAAHwAAAODUQAAgAAAAeNRAACEAAACI0kAAeAAAAGTSQAB5AAAASNJAAHoAAAAs0kAA/AAAACTSQAD/AAAABNJAAE0AaQBjAHIAbwBzAG8AZgB0ACAAVgBpAHMAdQBhAGwAIABDACsAKwAgAFIAdQBuAHQAaQBtAGUAIABMAGkAYgByAGEAcgB5AAAAAAAKAAoAAAAAAC4ALgAuAAAAPABwAHIAbwBnAHIAYQBtACAAbgBhAG0AZQAgAHUAbgBrAG4AbwB3AG4APgAAAAAAUgB1AG4AdABpAG0AZQAgAEUAcgByAG8AcgAhAAoACgBQAHIAbwBnAHIAYQBtADoAIAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAYAAAYAAQAAEAADBgAGAhAERUVFBQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABQAEAAQABAAEAAQABQAEAAQABAAEAAQABAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAAQEBAQEBAQEBAQEBAQECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQAAIBAgECAQIBAgECAQIBAgEBAQAAAACAgYKDhIWGh4iJ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AABQTQAAQU0AAERlY2VtYmVyAAAAAE5vdmVtYmVyAAAAAE9jdG9iZXIAU2VwdGVtYmVyAAAAQXVndXN0AABKdWx5AAAAAEp1bmUAAAAAQXByaWwAAABNYXJjaAAAAEZlYnJ1YXJ5AAAAAEphbnVhcnkARGVjAE5vdgBPY3QAU2VwAEF1ZwBKdWwASnVuAE1heQBBcHIATWFyAEZlYgBKYW4AU2F0dXJkYXkAAAAARnJpZGF5AABUaHVyc2RheQAAAABXZWRuZXNkYXkAAABUdWVzZGF5AE1vbmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AAAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8AQwBPAE4ATwBVAFQAJAAAAEZhdGFsIGVycm9yIGluIGxhdW5jaGVyOiAlcwoAAAAAcgBiAAAAAABGYWlsZWQgdG8gb3BlbiBleGVjdXRhYmxlAAAAVW5hYmxlIHRvIGZpbmQgYW4gYXBwZW5kZWQgYXJjaGl2ZS4AVW5hYmxlIHRvIHJlYWQgZnJvbSBmaWxlAAAAACMhAAAAAAAASm9iIGluZm9ybWF0aW9uIHF1ZXJ5aW5nIGZhaWxlZABKb2IgaW5mb3JtYXRpb24gc2V0dGluZyBmYWlsZWQAAHN0ZGluIGR1cGxpY2F0aW9uIGZhaWxlZAAAAABzdGRvdXQgZHVwbGljYXRpb24gZmFpbGVkAAAAc3RkZXJyIGR1cGxpY2F0aW9uIGZhaWxlZAAAAFVuYWJsZSB0byBjcmVhdGUgcHJvY2VzcyB1c2luZyAnJXMnAEZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIG9mIHByb2Nlc3MAAC4AZQB4AGUAAAAAAEV4cGVjdGVkIHRvIGZpbmQgYSBjb21tYW5kIGVuZGluZyBpbiAnLmV4ZScgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAARXhwZWN0ZWQgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAVGVybWluYXRpbmcgcXVvdGUgd2l0aG91dCBzdGFydGluZyBxdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAEZhaWxlZCB0byBmaW5kIHNoZWJhbmcAAEV4cGVjdGVkIHRvIGZpbmQgdGVybWluYXRvciBpbiBzaGViYW5nIGxpbmUARXhwZWN0ZWQgdG8gZGVjb2RlIHNoZWJhbmcgbGluZSB1c2luZyBVVEYtOABFeHBlY3RlZCB0byBmaW5kICcjJyBhdCBzdGFydCBvZiBzaGViYW5nIGxpbmUAAABFeHBlY3RlZCB0byBmaW5kICchJyBmb2xsb3dpbmcgJyMnIGluIHNoZWJhbmcgbGluZQAARXhwZWN0ZWQgdG8gZmluZCBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZQBFeHBlY3RlZCB0byBmaW5kIGFyZ3VtZW50cyAoZXZlbiBpZiBlbXB0eSkgaW4gc2hlYmFuZyBsaW5lAABFeHBlY3RlZCB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIGNvbW1hbmQgbGluZSBtZW1vcnkAIgAlAHMAIgAgACUAcwAgACIAJQBzACIAIAAlAHMAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAJBALDuQAADAAAAUlNEU8W2ANLXBtxNkkrmGq52uKYCAAAAQzpcVXNlcnNcVmluYXlcUHJvamVjdHNcc2ltcGxlX2xhdW5jaGVyXFJlbGVhc2VcQ0xJU2ltcGxlTGF1bmNoZXIucGRiAAAAAAAAAAAAAACALQAAoC8AAMBxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAKsYQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA/h5AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAnIEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAHUiQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAeyNAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABbJEAAAAAAAP7///8AAAAAzP///wAAAAD+////siVAAMYlQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA4CpAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAABwM0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOk5QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAcztAAAAAAAAAAAAAPztAAP7///8AAAAA1P///wAAAAD+////AAAAAPY8QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAnUpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAATWkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAHNbQAAAAAAA/v///wAAAADY////AAAAAP7///8AAAAAfGJAAP7///8AAAAAi2JAAP7///8AAAAA2P///wAAAAD+////AAAAAD5kQAD+////AAAAAEpkQAD+////AAAAAMz///8AAAAA/v///wAAAAA6bkAAAAAAAP7///8AAAAA2P///wAAAAD+////a3FAAH5xQAAAAAAA/v///wAAAADY////AAAAAP7////3ckAA+3JAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAADkdEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAGF2QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAGYNAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADyg0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAPiRQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAXJVAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAAumUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAALKcQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAzK5AAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAACRsEAAAAAAAAAAAADNr0AA7PIAAAAAAAAAAAAApPUAAADQAAAk9AAAAAAAAAAAAAC+9QAAONEAAAAAAAAAAAAAAAAAAAAAAAAAAAAALPQAADr0AABM9AAAZvQAAHj0AACM9AAAovQAAL70AADa9AAA8PQAAAb1AAAi9QAAOPUAAEz1AABc9QAAbPUAAIT1AACW9QAAyvUAANb1AADi9QAA+vUAABL2AAAk9gAANvYAAEz2AABg9gAAfPYAAJr2AACu9gAA1vYAAOb2AAD29gAAAvcAABD3AAAi9wAANvcAAEL3AABU9wAAYvcAAHT3AACM9wAAlPcAAKD3AACy9wAAyPcAAOL3AAD49wAAEvgAAB74AAAs+AAAOvgAAET4AABc+AAAbPgAAIL4AACa+AAAtPgAAMT4AADa+AAA9PgAAAL5AAAS+QAAIPkAADD5AABC+QAAVvkAAGL5AABs+QAAePkAAIr5AACa+QAAtvkAAMb5AADY+QAA5PkAAPT5AAAAAAAAsvUAAAAAAAAZAUV4aXRQcm9jZXNzAIcBR2V0Q29tbWFuZExpbmVXAHEEU2V0SW5mb3JtYXRpb25Kb2JPYmplY3QAqABDcmVhdGVQcm9jZXNzVwAAwAFHZXRDdXJyZW50UHJvY2VzcwD5BFdhaXRGb3JTaW5nbGVPYmplY3QAZwFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAABYAQXNzaWduUHJvY2Vzc1RvSm9iT2JqZWN0AADfAUdldEV4aXRDb2RlUHJvY2VzcwAAFAJHZXRNb2R1bGVGaWxlTmFtZVcAAKUDUXVlcnlJbmZvcm1hdGlvbkpvYk9iamVjdABnA011bHRpQnl0ZVRvV2lkZUNoYXIAlQBDcmVhdGVKb2JPYmplY3RBAABkAkdldFN0ZEhhbmRsZQAAAgJHZXRMYXN0RXJyb3IAAC0EU2V0Q29uc29sZUN0cmxIYW5kbGVyAOgARHVwbGljYXRlSGFuZGxlAFIAQ2xvc2VIYW5kbGUAS0VSTkVMMzIuZGxsAABFAVN0clN0cklXAABTSExXQVBJLmRsbADPAkhlYXBGcmVlAADLAkhlYXBBbGxvYwDuAEVudGVyQ3JpdGljYWxTZWN0aW9uAAA5A0xlYXZlQ3JpdGljYWxTZWN0aW9uAABpAkdldFN0cmluZ1R5cGVXAACGAUdldENvbW1hbmRMaW5lQQDTAkhlYXBTZXRJbmZvcm1hdGlvbgAAwARUZXJtaW5hdGVQcm9jZXNzAADTBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAApQRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAANJc0RlYnVnZ2VyUHJlc2VudADjAkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQA6gBFbmNvZGVQb2ludGVyAMoARGVjb2RlUG9pbnRlcgAYBFJ0bFVud2luZADNAkhlYXBDcmVhdGUAAEUCR2V0UHJvY0FkZHJlc3MAABgCR2V0TW9kdWxlSGFuZGxlVwAAJQVXcml0ZUZpbGUAbwRTZXRIYW5kbGVDb3VudAAA8wFHZXRGaWxlVHlwZQBjAkdldFN0YXJ0dXBJbmZvVwDRAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgCyBFNsZWVwAMADUmVhZEZpbGUAAGYEU2V0RmlsZVBvaW50ZXIAABMCR2V0TW9kdWxlRmlsZU5hbWVBAABhAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXABEFV2lkZUNoYXJUb011bHRpQnl0ZQDaAUdldEVudmlyb25tZW50U3RyaW5nc1cAAMUEVGxzQWxsb2MAAMcEVGxzR2V0VmFsdWUAyARUbHNTZXRWYWx1ZQDGBFRsc0ZyZWUA7wJJbnRlcmxvY2tlZEluY3JlbWVudAAAcwRTZXRMYXN0RXJyb3IAAMUBR2V0Q3VycmVudFRocmVhZElkAADrAkludGVybG9ja2VkRGVjcmVtZW50AACnA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAJMCR2V0VGlja0NvdW50AADBAUdldEN1cnJlbnRQcm9jZXNzSWQAeQJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCPAENyZWF0ZUZpbGVXAD8DTG9hZExpYnJhcnlXAADSAkhlYXBSZUFsbG9jAJoBR2V0Q29uc29sZUNQAACsAUdldENvbnNvbGVNb2RlAABXAUZsdXNoRmlsZUJ1ZmZlcnMAAHIBR2V0Q1BJbmZvAGgBR2V0QUNQAAA3AkdldE9FTUNQAAAKA0lzVmFsaWRDb2RlUGFnZQCHBFNldFN0ZEhhbmRsZQAABANJc1Byb2Nlc3NvckZlYXR1cmVQcmVzZW50AFMEU2V0RW5kT2ZGaWxlAABKAkdldFByb2Nlc3NIZWFwAADUAkhlYXBTaXplAAAkBVdyaXRlQ29uc29sZVcALQNMQ01hcFN0cmluZ1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAHkEAAAAAAMAeQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAABn29vb/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/q6ur/6urq/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+fn5//l5eX//v7+/1fe//9H2P//Q9X//z/S//87zv//Nsv//zLI//9u1///9vz//2bR//8wvv//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn39/f/x8fHjDMzMyLT09OE7u7u/8TExP/u7u7/7e3t/+3t7f/t7e3/5+fn/9XV1f/p6en/6+vr/+vr6//r6+v/6urq/+rq6v/Q0ND/2NjY/9ra2v/X19f/zs7O/9LS0v+zs7P//////0/e//9L2///R9j//0LU//8+0f//Os7//zXK//9w2P//9vz//2nT//8kvP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn4+Pj/ISEhNAAAABc4ODgm7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/09PT/8jIyP/o6Oj/7Ozs/9HR0f/Ly8v/6+vr/+vr6//Pz8//29vb/7+/v//Jycn/v7+//8nJyf/Kysr//////1Ph//9O3v//Str//0bX//9C1P//PdD//znN//81yv//MMX//yzC//8ov////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn4+Pj/wcHBkSUlJTXHx8eO8PDw/8fHx//v7+//7+/v/+7u7v/u7u7/7u7u/97e3v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/Q0ND/3t7e/+Dg4P/v7+//+vr6/////////////////1bk//9S4f//Tt3//0na//9F1///sO3/////////////////////////////////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs//v7+//RuZ3/pXxK/5pxP/+Wb0D//////1rm//9V4///UeD//03d//9J2f//RNb//0DT//88z///N8z//zPJ//8vxP//K8H//ya+//8iuv//Lbz//47c///+///MAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/ycnJjDQ0NCLW1taE8fHx/8jIyP/x8fH/8PDw//Dw8P/w8PD/6enp/9fX1//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/S0tL/6+vr/9/MtP+ndzz/o3U9/55zPv+acT///////13p//9Z5v//VeP//1Df//9M3P//SNn//0PV//8/0v//O8///zfL//8yyP//LsT//yrA//8lvf//Ibr//x+4//+q5f//////gQAAAAAAAAAAAAAAAAAAABn5+fn/IiIiNAAAABc4ODgm8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/5+fn/83Nzf/v7+//7+/v/9PT0//Nzc3/7u7u/+7u7v/S0tL//Pz8/8CXZP+reTz/pnc9/6J1Pf+dcz7//////2Hs//9c6f//WOX//1Ti//9Q3///S9v//0fY//9D1f//PtH//zrO//82y///Mcf//y3D//8pwP//Jbz//yC5//9PyP//////zgAAAAAAAAAAAAAAAAAAABn5+fn/w8PDkSUlJTXKysqO8/Pz/8rKyv/y8vL/8vLy//Ly8v/x8fH/8PDw/9/f3//w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//S0tL//v7+/7WBQf+uezv/qnk8/6V3Pf+hdD7//////3Pv//9g6///XOj//1fl//9T4f//T97//0rb//9G1///QtT//z7R//85zf//Ncr//zHH//8swv//KL///yS8//8ou///////9wAAAAAAAAAAAAAAAAAAABn6+vr/9fX1//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/v7+///////7d/Of+yfDr/rno7/6l4PP+ldj3/9fDq/9f6//9z7///X+v//1vn//9X5P//UuH//07d//9K2v//Rdf//0HT//890P//OM3//zTJ//8wxf//LML//ye///8ju////////wAAAAAAAAAAAAAAAAAAABn6+vr/zMzMjDU1NSLZ2dmE9PT0/8vLy//09PT/5+fn//Pz8//m5ub/8/Pz//Ly8v/n5+f/3Nzc/+Tk5P/k5OT/5ubm/+Pj4//U1NT//////7qAOf+2fjn/sXw6/616O/+oeDz/vJlv//Tv6f/////////////////////////////////////////////////p+v//bdv//zjM//8zyf//L8X//yvB//8nvv///////wAAAAAAAAAAAAAAAAAAABn7+/v/IiIiNAAAABc6Ojom9fX1//X19f/19fX/19fX//Pz8//U1NT/8vLy//Pz8//m5ub/0dHR/8/Pz//MzMz/0NDQ/87Ozv/V1dX//////76COP+5gDn/tX46/7B8O/+sejv/p3c8/6N1Pf+ecz7/mnE//5VvQP+RbUH/jGtC/4hpQ/+DZ0P/f2RE/4t1Wv/e19D/6fr//zvP//83zP//M8j//y7E//8qwf///////wAAAAAAAAAAAAAAAAAAABn7+/v/x8fHkSUlJTXMzMyO9fX1/8zMzP/19fX/1dXV//Ly8v/Kysr/5ubm//T09P/n5+f/4ODg/+Xl5f/k5OT/5OTk/+rq6v/U1NT//v7+/8OIPv+9gjj/uIA5/7R9Ov+wezv/q3k8/6d3PP+idT3/nnM+/5lxP/+Vb0D/kG1B/4xqQv+HaEP/g2ZE/35kRf+LdVr//////z/S//86zv//Nsv//zLI//81xf//////9wAAAAAAAAAAAAAAAAAAABn8/Pz/+Pj4//f39//39/f/qKio/6urq//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//y8vL//f39/9CeYf/Bgzf/vIE4/7h/Of+zfTr/r3s7/6p5PP+mdz3/oXU+/51yPv+YcD//lG5A/49sQf+LakL/hmhD/4JmRP99ZEX//////0LU//8+0f//Os7//zXK//9e0///////zgAAAAAAAAAAAAAAAAAAABn8/Pz/z8/PjDU1NSLc3NyE+Pj4/4aGhv+srKz/9/f3//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//T09P/z8/P/+Pj4/+jRs//ChDf/wIM3/7uBOP+3fzn/sn06/657O/+peDz/pXY9/6B0Pv+ccj//l3BA/5NuQP+ObEH/impC/4VnQ/+BZUT//////0bX//9B1P//PdD//znN//+z6///////gQAAAAAAAAAAAAAAAAAAABn8/Pz/IiIiNAAAABc7Ozsm+Pj4//X19f+IiIj/rKys//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//39/P/hwZr/xYxD/7+DOP+7gDn/tn45/7J8Ov+tejv/qHg8/6R2Pf+gdD7/m3I//5dwQP+SbUH/jmtB/4lpQv+FZ0P//////0na//9F1v//TNb//53n///+///LAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/ycnJkVFRUUpubm7K9/f3/87Ozv/MzMz/fn5+/6ysrP/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//X19f/7+/v//v7+////////////////////////////////////////////18Su/5pxP/+Wb0D/kW1B/41rQv+IaUP/////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/8/Pz/0hISP8iIiL/qamp//r6+v/s7Oz/iYmJ/3Z2dv+srKz/+Pj4//j4+P/39/f/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT//////7mAOf+0fjr/sHs7/6t5PP+ndzz/onU9/55zPv+ZcT//lW9A/5BtQf+Ma0L//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn+/v7/kJCQwTo6Ov8nJyf/X19f/6Wlpf/5+fn/c3Nz/3R0dP+MjIz/qKio/93d3f/l5eX/6enp//j4+P/39/f/9/f3//f39//29vb/9fX1/9zc3P/m5ub/6+vr/97e3v/a2tr//////7yBOP/PpnX//Pr3/8ejdv+qeTz/pnc9/6J1Pf+dcz7/mXA//5RuQP+QbEH//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vLwPODg4VAAAABn+/v7/LS0tNmZmZm5kZGTrJSUl/yIiIv+ioqL/T09P/1NTU/+NjY3/lpaW/5SUlP/a2tr/wsLC//b29v/4+Pj/0dHR/9fX1//39/f/9/f3/9jY2P/c3Nz/1NTU/87Ozv/Ly8v//v7+/8SLRP/Sp3X//Pr2/8qkdv+uezv/qnk8/6V2Pf+hdD7/nHI//5hwP/+aeE3/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8iU1NTYH9/f3/zMzMkSYmJjW1tbWsOzs7/zw8PP94eHj/UVFR/zs7O/9LS0v/8PDw/8XFxf/09PT/9vb2//f39//5+fn/+Pj4//j4+P/4+Pj/9/f3/9ra2v/s7Oz/6Ojo/+7u7v/m5ub/+/v7/+HBmv+/gzj/u4E4/7Z+Of+yfDr/rXo7/6l4PP+kdj3/oHQ+/5tyP//Mt5///Pz8mwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk5OZSZmZn/1tbW//f39//9/f3/ycnJ/4CAgP9WVlb/IyMj/ykpKf80NDT/7u7u//v7+//6+vr/+vr6//r6+v/6+vr/+fn5//n5+f/5+fn/+Pj4//j4+P/4+Pj/9/f3//f39//19fX/9/f3//39/f/o0bP/zZ1i/7yFQP+1fjn/sXw6/6x6O/+rfUP/t5Nn/9vLtv/29fXTjY2NHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmYmJj/hISE85GRkf+CgoL1Wlpa/2xsbP87Ozv/ISEh/yIiIv8pKSn/X19f/9bW1v/4+Pj/+/v7//v7+//6+vr/+vr6//r6+v/i4uL/6urq/+vr6//n5+f/3d3d/+Hh4f+/v7//6+vr/+Pj4//09PT/9/f3///////////////////////////5+fn53u7u7v8mJiYyAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn/////Ojo6oHBwcN97e3v+X19f/1dXV/9XV1f/Ojo6/yEhIf8iIiL/Kioq/3d3d//u7u7//Pz8/9fX1//Q0ND/+/v7//r6+v/d3d3/6urq/87Ozv/W1tb/zc3N/9bW1v/Y2Nj/0dHR/9TU1P/39/f/9/f3//f39//29vb/8vLy/yIiIjQAAAAXODg4Jtvb2/8AAAAsAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn+/v7/zMzMkTk5OaGBgYHUlpaW/0pKSv98fHz/bGxs/zo6Ov8iIiL/QkJC/1hYWP98fHz/+Pj4//z8/P/8/Pz//Pz8//v7+//g4OD/7+/v/+3t7f/x8fH/5ubm//f39//m5ub/9fX1/+rq6v/4+Pj/+Pj4//f39//Kysr/7+/v/7y8vJIkJCQ2tLS0j9LS0v8AAAAsAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn+/v7//f39//39/f+YmJj/ubm5//7+/v/8/Pz/uLi4/3V1df9LS0v/Q0ND/0BAQP8uLi7/d3d3//z8/P/9/f3//Pz8//z8/P/8/Pz/+/v7//v7+//7+/v/+vr6//r6+v/6+vr/+fn5//j4+P/5+fn/+Pj4//T09P/w8PD/6+vr/+Xl5f/d3d3/09PT/8jIyP8AAAAqAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn+/v7/0tLSjDY2NiLg4OCEmZmZ/729vf/+/v7/7+/v/7q6uv+EhIT/S0tL/2FhYf9MTEz/V1dX/6SkpP/9/f3/8fHx/+3t7f/9/f3/+/v7/+Li4v/s7Oz/8fHx/+Tk5P/Y2Nj/z8/P/7+/v//j4+P/4eHh/+/v7//CwsL/5eXl/qSkpIQYGBhAlpaWosTExOgAAAAkAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/IiIiNAAAABc7Ozsm/Pz8//39/f/9/f3/39/f/+Li4v+0tLT/bm5u/2ZmZv8hISH/JCQk/zk5Of/Kysr/3t7e//r6+v/9/f3//f39/97e3v/i4uL/2tra/9PT0//Ly8v/srKy/66urv+oqKj/r6+v/8rKyv/IyMj/vb296DQ0NF10dHR8xMTEwsjIyIcAAAAXAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn8/Pz/ycnJkSYmJjXQ0NCO/Pz8/9HR0f/8/Pz/3t7e//j4+P/u7u7/vLy8/3Z2dv9tbW3/VlZW/3t7e/9PT0//5+fn//X19f/+/v7//f39/+Dg4P/y8vL/7e3t//T09P/k5OT/ycnJ//7+/v////////////7+/v/4+Pj/8fHx/+Hh4f/p6en/2trapQAAABwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn8/Pz/+vr6//r6+v/6+vr/+/v7//v7+//7+/v//Pz8//z8/P/8/Pz//f39/9HR0f9hYWH/Q0ND/4eHh/9wcHD/oqKi//////////////////7+/v/+/v7//v7+//39/f/29vb/zc3N///////j4+P/1dXV/9XV1f/x8fH/ycnJ/5+fn/+zs7OgAgICHAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn8/Pz/z8/PjDU1NSLe3t6E+vr6/9DQ0P/7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/n5+f/fHx8/01NTf+Ghob/ZmZm/+jo6P/+/v7//////////////////v7+//39/f/19fX/y8vL//7+/v/AwMD/wsLC/66urv/p6en/pKSk/5iYmJgAAAAcAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn8/Pz/IiIiNAAAABc7Ozsm+fn5//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//8/Pz/+/v7/8PDw/9cXFz/l5eX/7Kysv/+/v7//v7+//7+/v/+/v7//v7+//v7+//y8vL/yMjI//7+/v/U1NT/rq6u/8LCwv/q6ur/rKysnQAAABwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn7+/v/x8fHkSUlJTXOzs6O+Pj4/87Ozv/5+fn/2tra/+np6f/Pz8//6+vr/9bW1v/7+/v/+/v7//z8/P/19fX/tra2/5qamv/4+Pj//f39//39/f/9/f3/+vr6//b29v/u7u7/xcXF//r6+v/x8fH/6enp/+rq6v/d3d2nAwMDHAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn7+/v/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7+/+goKD/9/f3//z8/P/5+fn/9fX1//Hx8f/o6Oj/v7+///b29v/p6en/6urq/9zc3KYCAgIcAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn6+vr/zc3NjDU1NSLb29uE9/f3/87Ozv/39/f/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/7u7u/+3t7f/n5+f/5+fn/+vr6//u7u7/mpqa/+Li4v/j4+P/z8/P/+Dg4P/ExMT/u7u7//Hx8f/q6ur/29vbpQAAABwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn6+vr/IiIiNAAAABc6Ojom9vb2//b29v/39/f/9/f3//f39//4+Pj/+Pj4//j4+P/5+fn/3Nzc/9fX1//4+Pj/2dnZ/9nZ2f/W1tb/2dnZ/8bGxv/e3t7/zs7O/8DAwP+urq7/u7u7//Ly8v/a2tqkAAAAHAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/w8PDkSUlJTXLy8uO9fX1/8zMzP/29vb/2NjY/+bm5v/Nzc3/6Ojo/9PT0//v7+//4uLi//Pz8//n5+f/7e3t//Dw8P/n5+f/6+vr/+3t7f/k5OT/0dHR/9DQ0P+1tbX/29vb/9zc3KQAAAAcAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn7+/v/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//8/Pz/+/v7//r6+v/4+Pj/9fX1//Ly8v/v7+//6enp/+Pj4/7l5eXo19fXhwAAABoAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASAAAACgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+A////v3d3/AAH//4/d3fgAAA/8D93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAADd3fgAAAAAAF3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAXd34AAAAAADd3fgAAAAAD93d+AAAAAAP3d3gAAAAAA/d3fAAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAB/d3fgAAAAAP93d+AAAAAB/3d34AAAAAP/d3fgAAAAB/93d+AAAAAP/3d34AAAAB//d3fgAAAAP/93d+AAAAB//3d34AAAAP//d3fgAAAB//93dygAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABwAAAAcAAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///4H////J////9v////////////////////b////I////gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAYISEhMFxcXEplZWVRNjY2RDU1NUEAAAAwAAAAJAAAABUAAAAKAAAAAgAAAAD///+B3fj//3bi//9I1v//PM///zbL//8wxf//MsP//1zO///W8v//////gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcBQUFN4GBgXHp6en45ubm/+Hh4fXW1tbp29vb7Nzc3Nq0tLSidnZ2aiYmJkQAAAAxAAAAIv7+/u9n5P//TNz//0bX//9A0///O87//zXK///U8///z/H//z/E///////uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHcDAwKPm5ub46Ojo/+fn5//l5eX/5ubm/+bm5v/k5OT/5OTk/97e3v/i4uL+4uLi89jY2NPQ0NC6/////1bk//9R4P//S9v//0XX//8/0v//Oc3//9X0///Q8v//KL////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8/Pz/4KCgmGUlJRW6Ojo/8LCwv/Kysr/z8/P/83Nzf/c3Nz/0dHR/8nJyf/FxcX/ysrK/8nJyf//////W+j//1Xj//9Q3///Str//0TW//8+0f//OM3//zLI//8tw////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/09PT/dXV1bnt7e2rq6ur/zs7O/9LS0v/c3Nz/1dXV/+fn5//e3t7/4uLi//39/f////////////////9g6///Wuf//1Ti//9P3v//tPD////////////////////////////////////////////v////gQAAAAAAAAAAAAAAH/T09P/s7Oz/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo//Dw8P/t5dr/p4NW/5VvQP+ObEH//////2Lt//9f6v//Web//1Pi//9N3f//R9j//0LU//88z///Nsv//zDF//8rwf//Jbz//zzB///V8v//////gQAAAAAAAAAf9fX1/4SEhGGXl5dW7Ozs/+zs7P/r6+v/5ubm/8PDw//q6ur/+vr6/7uZbf+gdD7/mnE//5NuQP//////Yu3//2Lt//9e6v//WOX//1Lh//9M3P//Rtj//0HT//87z///Ncr//y/F//8pwP//JLz//1nL///////IAAAAAAAAAB/29vb/d3d3bn19fWrt7e3/7e3t/+zs7P/r6+v/1tbW/+vr6//+/v7/rn5D/6V2Pf+ecz7/mHA///////9i7f//Yu3//2Hs//9d6f//V+T//1Hg//9L2///Rdf//0DS//86zv//NMn//y7E//8ov///K73///////YAAAAAAAAAH/f39//w8PD/7+/v/+/v7//u7u7/7u7u/+3t7f/t7e3/7Ozs//////+wezv/qXg8/6N2Pf+dcz7/9O/q/4Hx//9i7f//Yu3//2Hs//9b6P//VuP//1Df//9K2v//RNb//z/R//85zf//M8j//y3D//8nvv///////wAAAAAAAAAf9/f3/4aGhmGZmZlW8PDw/+/v7//v7+//7e3t/8nJyf/t7e3//////7V+Ov+uezv/qHg8/6J1Pf+2l3D/9O/p///////////////////////////////////////q+v//ct///z3R//83zP//Msj//yzC////////AAAAAAAAAB/4+Pj/eXl5bn9/f2rx8fH/8fHx//Dw8P/v7+//3d3d/+7u7v//////uYA5/7N9Ov+tejv/p3c8/6F1Pv+bcj//lW9A/49sQf+JaUL/g2ZE/31kRf98Y0X/fGNF/5aCaf/q+v//QtT//zzQ//82y///Mcf///////8AAAAAAAAAH/j4+P/z8/P/8/Pz//Ly8v/y8vL/8fHx//Hx8f/w8PD/8PDw//7+/v/Bhz//uH85/7J9Ov+sejv/pnc9/6B0Pv+acT//lG5A/45rQf+IaUP/gmZE/31jRf98Y0X/fWRG//////9H2P//QdP//zvP//89zP//////9gAAAAAAAAAf+fn5/4mJiWGcnJxW9PT0/+Hh4f/j4+P/7u7u//Ly8v/d3d3/8vLy/9Kjaf+9gjj/t385/7F8Ov+reTz/pXY9/59zPv+ZcT//k25A/41rQv+HaEP/gGVE/3xjRf98Y0X//////0zc//9G1///QNP//23b///////IAAAAAAAAAB/6+vr/enp6boGBgWr19fX/3Nzc/+Dg4P/a2tr/8/Pz/97e3v/x8fH/9OjZ/8qTUP+8gTj/tn45/7B7O/+qeTz/pHY9/55zPv+YcD//km1B/4tqQv+FZ0P/f2VE/3xjRf//////UN///0rb//9c2///3Pf//////4EAAAAAAAAAH/v7+//39/f/9vb2/9fX1//29vb/9fX1//X19f/09PT/9PT0//Pz8//5+fn//v7+///////////////////////////////////////Twq//kG1B/4pqQv+EZ0P/fmRF/////////////////////+////+BAAAAAAAAAAAAAAAf+/v7/4uLi2Genp5Wqamp/7W1tf/X19f/8vLy/8jIyP/U1NT/29vb//T09P/e3t7/6urq//Ly8v//////tH06/656O/+oeDz/onU9/5tyP/+Vb0D/j2xB/4lpQv+DZkT//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAOAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/B+AP+ABAB+AAAAfgAAAH4AAAB+AAAABgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAYAAAB+AAAAfgAAAHwAAAB8AAAA/gAAAP4AAAD+AAAB/gAAAf4AAAP+AAAH/gAAD/4AAB/+AAA//gAAf/4AAP/8oAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ2dnUOfn5+0oqKi9qSkpO6lpaWSpqamDgAAAAAAAAAAAAAAAKysrO+rq6tvqqqqDgAAAAClpaUEo6OjSaCgoL6tra3/5eXl//39/f//////+/v7//Hx8dYAAAAAAAAAAAAAAACvr6//wcHB/66urvuqqqrgqKio9LOzs//Nzc3/9vb2/67x//9T2///PdD//z/L//+b4v//////twAAAAAAAAAAs7Oz/9zc3P/z8/P/5OTk/+fn5//p6en/6Ojo//7+/v9f6f//UeD//0bX///S9P//NMf///////YAAAAAAAAAALa2tv/Nzc3/4uLi/+3t7f/t7e3/+fn5//7+/v//////Ye3//1rn//+38v//////////////////////9f///7a5ubn/3d3d//b29v/w8PD/+vr6/9C8pP+Rb0X//////2Pt//9h7P//WOX//03d//9C1P//N8z//zDD//+Z4P//vb29/87Ozv/k5OT/8vLy//7+/v+pfkn/mXE///Pv6v+b9P//Y+3//2Dr//9W4///S9v//0DS//81yv//OMX//8DAwP/Gxsb/7e3t//X19f//////rXo7/6J1Pf+zlXH/8+/q/////////////////+v7//924v//PtH//zPI//+zs7P/ra2t/6SkpP/v7+///////7uGRf+reTz/oHQ+/5RuQP+JaUL/fmRF/31kRv+snIn/6/v//0fY//9I0v//r6+v/1lZWf91dXX/sbGx//b29v/gxKH/toA9/6l4PP+ecz7/km1B/4do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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQSwMEFAAAAAAAAAAhAJ7ixVkAfgEAAH4BADgAAABwaXB0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5En//0iLiwgBAADo2En//0iLixABAADozEn//0iLixgBAADowEn//0iLiyABAADotEn//0iLiygBAADoqEn//0iLizABAADonEn//0iLizgBAADokEn//0iLi0ABAADohEn//0iLi0gBAADoeEn//0iLi1ABAADobEn//0iLi3ABAADoYEn//0iLi3gBAADoVEn//0iLi4ABAADoSEn//0iLi4gBAADoPEn//0iLi5ABAADoMEn//0iLi5gBAADoJEn//0iLi2gBAADoGEn//0iLi6gBAADoDEn//0iLi7ABAADoAEn//0iLi7gBAADo9Ej//0iLi8ABAADo6Ej//0iLi8gBAADo3Ej//0iLi9ABAADo0Ej//0iLi6ABAADoxEj//0iLi9gBAADouEj//0iLi+ABAADorEj//0iLi+gBAADooEj//0iLi/ABAADolEj//0iLi/gBAADoiEj//0iLiwACAADofEj//0iLiwgCAADocEj//0iLixACAADoZEj//0iLixgCAADoWEj//0iLiyACAADoTEj//0iLiygCAADoQEj//0iLizACAADoNEj//0iLizgCAADoKEj//0iLi0ACAADoHEj//0iLi0gCAADoEEj//0iLi1ACAADoBEj//0iLi1gCAADo+Ef//0iLi2ACAADo7Ef//0iLi2gCAADo4Ef//0iLi3ACAADo1Ef//0iLi3gCAADoyEf//0iLi4ACAADovEf//0iLi4gCAADosEf//0iLi5ACAADopEf//0iLi5gCAADomEf//0iLi6ACAADojEf//0iLi6gCAADogEf//0iLi7ACAADodEf//0iLi7gCAADoaEf//0iDxCBbw8zMSIXJdGZTSIPsIEiL2UiLCUg7DbVfAAB0BehCR///SItLCEg7DatfAAB0BegwR///SItLEEg7DaFfAAB0BegeR///SItLWEg7DddfAAB0BegMR///SItLYEg7Dc1fAAB0Bej6Rv//SIPEIFvDSIXJD4QAAQAAU0iD7CBIi9lIi0kYSDsNXF8AAHQF6NFG//9Ii0sgSDsNUl8AAHQF6L9G//9Ii0soSDsNSF8AAHQF6K1G//9Ii0swSDsNPl8AAHQF6JtG//9Ii0s4SDsNNF8AAHQF6IlG//9Ii0tASDsNKl8AAHQF6HdG//9Ii0tISDsNIF8AAHQF6GVG//9I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IAB0AG8AIAB1AHMAZQAgAE0AUwBJAEwAIABjAG8AZABlACAAZgByAG8AbQAgAHQAaABpAHMAIABhAHMAcwBlAG0AYgBsAHkAIABkAHUAcgBpAG4AZwAgAG4AYQB0AGkAdgBlACAAYwBvAGQAZQAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgAgAEkAdAAgAGkAcwAgAG0AbwBzAHQAIABsAGkAawBlAGwAeQAgAHQAaABlACAAcgBlAHMAdQBsAHQAIABvAGYAIABjAGEAbABsAGkAbgBnACAAYQBuACAATQBTAEkATAAtAGMAbwBtAHAAaQBsAGUAZAAgACgALwBjAGwAcgApACAAZgB1AG4AYwB0AGkAbwBuACAAZgByAG8AbQAgAGEAIABuAGEAdABpAHYAZQAgAGMAbwBuAHMAdAByAHUAYwB0AG8AcgAgAG8AcgAgAGYAcgBvAG0AIABEAGwAbABNAGEAaQBuAC4ADQAKAAAAAABSADYAMAAzADIADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AYwBhAGwAZQAgAGkAbgBmAG8AcgBtAGEAdABpAG8AbgANAAoAAAAAAAAAAAAAAAAAUgA2ADAAMwAxAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIAB0AGgAZQAgAEMAUgBUACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AYwBlAC4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4ADQAKAAAAAABSADYAMAAzADAADQAKAC0AIABDAFIAVAAgAG4AbwB0ACAAaQBuAGkAdABpAGEAbABpAHoAZQBkAA0ACgAAAAAAAAAAAAAAAABSADYAMAAyADgADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIABoAGUAYQBwAA0ACgAAAAAAAAAAAFIANgAwADIANwANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwB3AGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABzAHQAZABpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA1AA0ACgAtACAAcAB1AHIAZQAgAHYAaQByAHQAdQBhAGwAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAbABsAA0ACgAAAAAAAABSADYAMAAyADQADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABfAG8AbgBlAHgAaQB0AC8AYQB0AGUAeABpAHQAIAB0AGEAYgBsAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA5AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABvAHAAZQBuACAAYwBvAG4AcwBvAGwAZQAgAGQAZQB2AGkAYwBlAA0ACgAAAAAAAAAAAAAAAAAAAAAAUgA2ADAAMQA4AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAGgAZQBhAHAAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAAAAAAAAAAABSADYAMAAxADcADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAbQB1AGwAdABpAHQAaAByAGUAYQBkACAAbABvAGMAawAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIAB0AGgAcgBlAGEAZAAgAGQAYQB0AGEADQAKAAAAAAAAAAAAAABSADYAMAAxADAADQAKAC0AIABhAGIAbwByAHQAKAApACAAaABhAHMAIABiAGUAZQBuACAAYwBhAGwAbABlAGQADQAKAAAAAAAAAAAAAAAAAFIANgAwADAAOQANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAANAAoAAAAAAAAAAAAAAFIANgAwADAAOAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGEAcgBnAHUAbQBlAG4AdABzAA0ACgAAAAAAAAAAAAAAAAAAAFIANgAwADAAMgANAAoALQAgAGYAbABvAGEAdABpAG4AZwAgAHAAbwBpAG4AdAAgAHMAdQBwAHAAbwByAHQAIABuAG8AdAAgAGwAbwBhAGQAZQBkAA0ACgAAAAAAAAAAAAIAAAAAAAAAAOwAQAEAAAAIAAAAAAAAAKDrAEABAAAACQAAAAAAAABA6wBAAQAAAAoAAAAAAAAA8OoAQAEAAAAQAAAAAAAAAJDqAEABAAAAEQAAAAAAAAAw6gBAAQAAABIAAAAAAAAA4OkAQAEAAAATAAAAAAAAAIDpAEABAAAAGAAAAAAAAAAQ6QBAAQAAABkAAAAAAAAAwOgAQAEAAAAaAAAAAAAAAFDoAEABAAAAGwAAAAAAAADg5wBAAQAAABwAAAAAAAAAkOcAQAEAAAAeAAAAAAAAAEjnAEABAAAAHwAAAAAAAACA5gBAAQAAACAAAAAAAAAAEOYAQAEAAAAhAAAAAAAAACDkAEABAAAAeAAAAAAAAAAA5ABAAQAAAHkAAAAAAAAA4OMAQAEAAAB6AAAAAAAAAMDjAEABAAAA/AAAAAAAAAC44wBAAQAAAP8AAAAAAAAAmOMAQAEAAABNAGkAYwByAG8AcwBvAGYAdAAgAFYAaQBzAHUAYQBsACAAQwArACsAIABSAHUAbgB0AGkAbQBlACAATABpAGIAcgBhAHIAeQAAAAAACgAKAAAAAAAAAAAALgAuAC4AAAA8AHAAcgBvAGcAcgBhAG0AIABuAGEAbQBlACAAdQBuAGsAbgBvAHcAbgA+AAAAAABSAHUAbgB0AGkAbQBlACAARQByAHIAbwByACEACgAKAFAAcgBvAGcAcgBhAG0AOgAgAAAAAAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAYAAAYAAQAAEAADBgAGAhAERUVFBQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAA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XV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8AQwBPAE4ATwBVAFQAJAAAAEZhdGFsIGVycm9yIGluIGxhdW5jaGVyOiAlcwoAAAAAcgBiAAAAAABGYWlsZWQgdG8gb3BlbiBleGVjdXRhYmxlAAAAAAAAAFVuYWJsZSB0byBmaW5kIGFuIGFwcGVuZGVkIGFyY2hpdmUuAAAAAABVbmFibGUgdG8gcmVhZCBmcm9tIGZpbGUAAAAAIyEAAAAAAAAAAAAASm9iIGluZm9ybWF0aW9uIHF1ZXJ5aW5nIGZhaWxlZABKb2IgaW5mb3JtYXRpb24gc2V0dGluZyBmYWlsZWQAAHN0ZGluIGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAAAAc3Rkb3V0IGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAABzdGRlcnIgZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAFVuYWJsZSB0byBjcmVhdGUgcHJvY2VzcyB1c2luZyAnJXMnAAAAAABGYWlsZWQgdG8gZ2V0IGV4aXQgY29kZSBvZiBwcm9jZXNzAAAAAAAALgBlAHgAZQAAAAAAAAAAAEV4cGVjdGVkIHRvIGZpbmQgYSBjb21tYW5kIGVuZGluZyBpbiAnLmV4ZScgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAAAAAAAEV4cGVjdGVkIHRlcm1pbmF0aW5nIGRvdWJsZS1xdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAAAAAAAAAAAAVGVybWluYXRpbmcgcXVvdGUgd2l0aG91dCBzdGFydGluZyBxdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAABGYWlsZWQgdG8gZmluZCBzaGViYW5nAABFeHBlY3RlZCB0byBmaW5kIHRlcm1pbmF0b3IgaW4gc2hlYmFuZyBsaW5lAAAAAABFeHBlY3RlZCB0byBkZWNvZGUgc2hlYmFuZyBsaW5lIHVzaW5nIFVURi04AAAAAABFeHBlY3RlZCB0byBmaW5kICcjJyBhdCBzdGFydCBvZiBzaGViYW5nIGxpbmUAAABFeHBlY3RlZCB0byBmaW5kICchJyBmb2xsb3dpbmcgJyMnIGluIHNo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+BMBAAAAAAAIFAEAAAAAABYUAQAAAAAAJhQBAAAAAAA4FAEAAAAAAEwUAQAAAAAAWBQBAAAAAABiFAEAAAAAAG4UAQAAAAAAgBQBAAAAAACQFAEAAAAAAKAUAQAAAAAAshQBAAAAAAC+FAEAAAAAAM4UAQAAAAAAAAAAAAAAAACGEAEAAAAAAAAAAAAAAAAAHwFFeGl0UHJvY2VzcwCNAUdldENvbW1hbmRMaW5lVwB+BFNldEluZm9ybWF0aW9uSm9iT2JqZWN0AKgAQ3JlYXRlUHJvY2Vzc1cAAMYBR2V0Q3VycmVudFByb2Nlc3MACAVXYWl0Rm9yU2luZ2xlT2JqZWN0AG0BR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AAAWAEFzc2lnblByb2Nlc3NUb0pvYk9iamVjdAAA5gFHZXRFeGl0Q29kZVByb2Nlc3MAABoCR2V0TW9kdWxlRmlsZU5hbWVXAACnA1F1ZXJ5SW5mb3JtYXRpb25Kb2JPYmplY3QAaQNNdWx0aUJ5dGVUb1dpZGVDaGFyAJUAQ3JlYXRlSm9iT2JqZWN0QQAAawJHZXRTdGRIYW5kbGUAAAgCR2V0TGFzdEVycm9yAAA7BFNldENvbnNvbGVDdHJsSGFuZGxlcgDsAER1cGxpY2F0ZUhhbmRsZQBSAENsb3NlSGFuZGxlAEtFUk5FTDMyLmRsbAAARQFTdHJTdHJJVwAAU0hMV0FQSS5kbGwA1wJIZWFwRnJlZQAA0wJIZWFwQWxsb2MA8gBFbnRlckNyaXRpY2FsU2VjdGlvbgAAOwNMZWF2ZUNyaXRpY2FsU2VjdGlvbgAAcAJHZXRTdHJpbmdUeXBlVwAAjAFHZXRDb21tYW5kTGluZUEAzgRUZXJtaW5hdGVQcm9jZXNzAADiBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAswRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAgNJc0RlYnVnZ2VyUHJlc2VudAAmBFJ0bFZpcnR1YWxVbndpbmQAAB8EUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAGARSdGxDYXB0dXJlQ29udGV4dAAlBFJ0bFVud2luZEV4AOsCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudADuAEVuY29kZVBvaW50ZXIAywBEZWNvZGVQb2ludGVyANsCSGVhcFNldEluZm9ybWF0aW9uAACqAkdldFZlcnNpb24AANUCSGVhcENyZWF0ZQAATAJHZXRQcm9jQWRkcmVzcwAAHgJHZXRNb2R1bGVIYW5kbGVXAAA0BVdyaXRlRmlsZQB8BFNldEhhbmRsZUNvdW50AAD6AUdldEZpbGVUeXBlAGoCR2V0U3RhcnR1cEluZm9XANIARGVsZXRlQ3JpdGljYWxTZWN0aW9uAMAEU2xlZXAAwwNSZWFkRmlsZQAAdARTZXRGaWxlUG9pbnRlcgAAGQJHZXRNb2R1bGVGaWxlTmFtZUEAAGcBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAIAVXaWRlQ2hhclRvTXVsdGlCeXRlAOEBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAWgFGbHNHZXRWYWx1ZQBbAUZsc1NldFZhbHVlAFkBRmxzRnJlZQCABFNldExhc3RFcnJvcgAAywFHZXRDdXJyZW50VGhyZWFkSWQAAFgBRmxzQWxsb2MAAKkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAmgJHZXRUaWNrQ291bnQAAMcBR2V0Q3VycmVudFByb2Nlc3NJZACAAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAI8AQ3JlYXRlRmlsZVcAQQNMb2FkTGlicmFyeVcAANoCSGVhcFJlQWxsb2MAoAFHZXRDb25zb2xlQ1AAALIBR2V0Q29uc29sZU1vZGUAAF0BRmx1c2hGaWxlQnVmZmVycwAAeAFHZXRDUEluZm8AbgFHZXRBQ1AAAD4CR2V0T0VNQ1AAAAwDSXNWYWxpZENvZGVQYWdlAJQEU2V0U3RkSGFuZGxlAABhBFNldEVuZE9mRmlsZQAAUQJHZXRQcm9jZXNzSGVhcAAA3AJIZWFwU2l6ZQAAMwVXcml0ZUNvbnNvbGVXAC8DTENNYXBTdHJpbmdXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBIAUABAAAAAAAAAAAAAACASAFAAQAAAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAMqLfLZkrAADNXSDSZtT//wAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAD//////////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgIDAwMDAwMDAwAAAAAAAAAAmO4AQAEAAACI7gBAAQAAAADwAEABAAAAAvIAQAEAAAD/////AAAAAAAAAAAAAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAg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39/f/9HR0f/b29v/6urq/9ra2v/p6en/6urq/+Li4v/e3t7/3t7e/+Li4v/c3Nz/4eHh/9DQ0P/j4+P/2NjY/+fn5//Ly8v/9fX1/6Ls//9E1v//QNL//zvP//83zP//M8j//y/E//8qwf//Jr3//yK6//+O3P///Pz8nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn29vb/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/q6ur/6urq/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+fn5//l5eX//v7+/1fe//9H2P//Q9X//z/S//87zv//Nsv//zLI//9u1///9vz//2bR//8wvv//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn39/f/x8fHjDMzMyLT09OE7u7u/8TExP/u7u7/7e3t/+3t7f/t7e3/5+fn/9XV1f/p6en/6+vr/+vr6//r6+v/6urq/+rq6v/Q0ND/2NjY/9ra2v/X19f/zs7O/9LS0v+zs7P//////0/e//9L2///R9j//0LU//8+0f//Os7//zXK//9w2P//9vz//2nT//8kvP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn4+Pj/ISEhNAAAABc4ODgm7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/09PT/8jIyP/o6Oj/7Ozs/9HR0f/Ly8v/6+vr/+vr6//Pz8//29vb/7+/v//Jycn/v7+//8nJyf/Kysr//////1Ph//9O3v//Str//0bX//9C1P//PdD//znN//81yv//MMX//yzC//8ov////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn4+Pj/wcHBkSUlJTXHx8eO8PDw/8fHx//v7+//7+/v/+7u7v/u7u7/7u7u/97e3v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/Q0ND/3t7e/+Dg4P/v7+//+vr6/////////////////1bk//9S4f//Tt3//0na//9F1///sO3/////////////////////////////////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs//v7+//RuZ3/pXxK/5pxP/+Wb0D//////1rm//9V4///UeD//03d//9J2f//RNb//0DT//88z///N8z//zPJ//8vxP//K8H//ya+//8iuv//Lbz//47c///+///MAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/ycnJjDQ0NCLW1taE8fHx/8jIyP/x8fH/8PDw//Dw8P/w8PD/6enp/9fX1//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/S0tL/6+vr/9/MtP+ndzz/o3U9/55zPv+acT///////13p//9Z5v//VeP//1Df//9M3P//SNn//0PV//8/0v//O8///zfL//8yyP//LsT//yrA//8lvf//Ibr//x+4//+q5f//////gQAAAAAAAAAAAAAAAAAAABn5+fn/IiIiNAAAABc4ODgm8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/5+fn/83Nzf/v7+//7+/v/9PT0//Nzc3/7u7u/+7u7v/S0tL//Pz8/8CXZP+reTz/pnc9/6J1Pf+dcz7//////2Hs//9c6f//WOX//1Ti//9Q3///S9v//0fY//9D1f//PtH//zrO//82y///Mcf//y3D//8pwP//Jbz//yC5//9PyP//////zgAAAAAAAAAAAAAAAAAAABn5+fn/w8PDkSUlJTXKysqO8/Pz/8rKyv/y8vL/8vLy//Ly8v/x8fH/8PDw/9/f3//w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//S0tL//v7+/7WBQf+uezv/qnk8/6V3Pf+hdD7//////3Pv//9g6///XOj//1fl//9T4f//T97//0rb//9G1///QtT//z7R//85zf//Ncr//zHH//8swv//KL///yS8//8ou///////9wAAAAAAAAAAAAAAAAAAABn6+vr/9fX1//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/v7+///////7d/Of+yfDr/rno7/6l4PP+ldj3/9fDq/9f6//9z7///X+v//1vn//9X5P//UuH//07d//9K2v//Rdf//0HT//890P//OM3//zTJ//8wxf//LML//ye///8ju////////wAAAAAAAAAAAAAAAAAAABn6+vr/zMzMjDU1NSLZ2dmE9PT0/8vLy//09PT/5+fn//Pz8//m5ub/8/Pz//Ly8v/n5+f/3Nzc/+Tk5P/k5OT/5ubm/+Pj4//U1NT//////7qAOf+2fjn/sXw6/616O/+oeDz/vJlv//Tv6f/////////////////////////////////////////////////p+v//bdv//zjM//8zyf//L8X//yvB//8nvv///////wAAAAAAAAAAAAAAAAAAABn7+/v/IiIiNAAAABc6Ojom9fX1//X19f/19fX/19fX//Pz8//U1NT/8vLy//Pz8//m5ub/0dHR/8/Pz//MzMz/0NDQ/87Ozv/V1dX//////76COP+5gDn/tX46/7B8O/+sejv/p3c8/6N1Pf+ecz7/mnE//5VvQP+RbUH/jGtC/4hpQ/+DZ0P/f2RE/4t1Wv/e19D/6fr//zvP//83zP//M8j//y7E//8qwf///////wAAAAAAAAAAAAAAAAAAABn7+/v/x8fHkSUlJTXMzMyO9fX1/8zMzP/19fX/1dXV//Ly8v/Kysr/5ubm//T09P/n5+f/4ODg/+Xl5f/k5OT/5OTk/+rq6v/U1NT//v7+/8OIPv+9gjj/uIA5/7R9Ov+wezv/q3k8/6d3PP+idT3/nnM+/5lxP/+Vb0D/kG1B/4xqQv+HaEP/g2ZE/35kRf+LdVr//////z/S//86zv//Nsv//zLI//81xf//////9wAAAAAAAAAAAAAAAAAAABn8/Pz/+Pj4//f39//39/f/qKio/6urq//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//y8vL//f39/9CeYf/Bgzf/vIE4/7h/Of+zfTr/r3s7/6p5PP+mdz3/oXU+/51yPv+YcD//lG5A/49sQf+LakL/hmhD/4JmRP99ZEX//////0LU//8+0f//Os7//zXK//9e0///////zgAAAAAAAAAAAAAAAAAAABn8/Pz/z8/PjDU1NSLc3NyE+Pj4/4aGhv+srKz/9/f3//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//T09P/z8/P/+Pj4/+jRs//ChDf/wIM3/7uBOP+3fzn/sn06/657O/+peDz/pXY9/6B0Pv+ccj//l3BA/5NuQP+ObEH/impC/4VnQ/+BZUT//////0bX//9B1P//PdD//znN//+z6///////gQAAAAAAAAAAAAAAAAAAABn8/Pz/IiIiNAAAABc7Ozsm+Pj4//X19f+IiIj/rKys//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//39/P/hwZr/xYxD/7+DOP+7gDn/tn45/7J8Ov+tejv/qHg8/6R2Pf+gdD7/m3I//5dwQP+SbUH/jmtB/4lpQv+FZ0P//////0na//9F1v//TNb//53n///+///LAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/ycnJkVFRUUpubm7K9/f3/87Ozv/MzMz/fn5+/6ysrP/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//X19f/7+/v//v7+////////////////////////////////////////////18Su/5pxP/+Wb0D/kW1B/41rQv+IaUP/////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/8/Pz/0hISP8iIiL/qamp//r6+v/s7Oz/iYmJ/3Z2dv+srKz/+Pj4//j4+P/39/f/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT//////7mAOf+0fjr/sHs7/6t5PP+ndzz/onU9/55zPv+ZcT//lW9A/5BtQf+Ma0L//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn+/v7/kJCQwTo6Ov8nJyf/X19f/6Wlpf/5+fn/c3Nz/3R0dP+MjIz/qKio/93d3f/l5eX/6enp//j4+P/39/f/9/f3//f39//29vb/9fX1/9zc3P/m5ub/6+vr/97e3v/a2tr//////7yBOP/PpnX//Pr3/8ejdv+qeTz/pnc9/6J1Pf+dcz7/mXA//5RuQP+QbEH//////wAAAAAAAAAAAAAAAAAAAAAAAAAA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////gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcBQUFN4GBgXHp6en45ubm/+Hh4fXW1tbp29vb7Nzc3Nq0tLSidnZ2aiYmJkQAAAAxAAAAIv7+/u9n5P//TNz//0bX//9A0///O87//zXK///U8///z/H//z/E///////uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHcDAwKPm5ub46Ojo/+fn5//l5eX/5ubm/+bm5v/k5OT/5OTk/97e3v/i4uL+4uLi89jY2NPQ0NC6/////1bk//9R4P//S9v//0XX//8/0v//Oc3//9X0///Q8v//KL////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8/Pz/4KCgmGUlJRW6Ojo/8LCwv/Kysr/z8/P/83Nzf/c3Nz/0dHR/8nJyf/FxcX/ysrK/8nJyf//////W+j//1Xj//9Q3///Str//0TW//8+0f//OM3//zLI//8tw////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/09PT/dXV1bnt7e2rq6ur/zs7O/9LS0v/c3Nz/1dXV/+fn5//e3t7/4uLi//39/f////////////////9g6///Wuf//1Ti//9P3v//tPD////////////////////////////////////////////v////gQAAAAAAAAAAAAAAH/T09P/s7Oz/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo//Dw8P/t5dr/p4NW/5VvQP+ObEH//////2Lt//9f6v//Web//1Pi//9N3f//R9j//0LU//88z///Nsv//zDF//8rwf//Jbz//zzB///V8v//////gQAAAAAAAAAf9fX1/4SEhGGXl5dW7Ozs/+zs7P/r6+v/5ubm/8PDw//q6ur/+vr6/7uZbf+gdD7/mnE//5NuQP//////Yu3//2Lt//9e6v//WOX//1Lh//9M3P//Rtj//0HT//87z///Ncr//y/F//8pwP//JLz//1nL///////IAAAAAAAAAB/29vb/d3d3bn19fWrt7e3/7e3t/+zs7P/r6+v/1tbW/+vr6//+/v7/rn5D/6V2Pf+ecz7/mHA///////9i7f//Yu3//2Hs//9d6f//V+T//1Hg//9L2///Rdf//0DS//86zv//NMn//y7E//8ov///K73///////YAAAAAAAAAH/f39//w8PD/7+/v/+/v7//u7u7/7u7u/+3t7f/t7e3/7Ozs//////+wezv/qXg8/6N2Pf+dcz7/9O/q/4Hx//9i7f//Yu3//2Hs//9b6P//VuP//1Df//9K2v//RNb//z/R//85zf//M8j//y3D//8nvv///////wAAAAAAAAAf9/f3/4aGhmGZmZlW8PDw/+/v7//v7+//7e3t/8nJyf/t7e3//////7V+Ov+uezv/qHg8/6J1Pf+2l3D/9O/p///////////////////////////////////////q+v//ct///z3R//83zP//Msj//yzC////////AAAAAAAAAB/4+Pj/eXl5bn9/f2rx8fH/8fHx//Dw8P/v7+//3d3d/+7u7v//////uYA5/7N9Ov+tejv/p3c8/6F1Pv+bcj//lW9A/49sQf+JaUL/g2ZE/31kRf98Y0X/fGNF/5aCaf/q+v//QtT//zzQ//82y///Mcf///////8AAAAAAAAAH/j4+P/z8/P/8/Pz//Ly8v/y8vL/8fHx//Hx8f/w8PD/8PDw//7+/v/Bhz//uH85/7J9Ov+sejv/pnc9/6B0Pv+acT//lG5A/45rQf+IaUP/gmZE/31jRf98Y0X/fWRG//////9H2P//QdP//zvP//89zP//////9gAAAAAAAAAf+fn5/4mJiWGcnJxW9PT0/+Hh4f/j4+P/7u7u//Ly8v/d3d3/8vLy/9Kjaf+9gjj/t385/7F8Ov+reTz/pXY9/59zPv+ZcT//k25A/41rQv+HaEP/gGVE/3xjRf98Y0X//////0zc//9G1///QNP//23b///////IAAAAAAAAAB/6+vr/enp6boGBgWr19fX/3Nzc/+Dg4P/a2tr/8/Pz/97e3v/x8fH/9OjZ/8qTUP+8gTj/tn45/7B7O/+qeTz/pHY9/55zPv+YcD//km1B/4tqQv+FZ0P/f2VE/3xjRf//////UN///0rb//9c2///3Pf//////4EAAAAAAAAAH/v7+//39/f/9vb2/9fX1//29vb/9fX1//X19f/09PT/9PT0//Pz8//5+fn//v7+///////////////////////////////////////Twq//kG1B/4pqQv+EZ0P/fmRF////////////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AAAAAAAAAAAAAAAAAAAAH/r6+v/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//39/f/8vLy/+Xl5f+wsLD/19fX7cvLy4kAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAOAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/B+AP+ABAB+AAAAfgAAAH4AAAB+AAAABgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAYAAAB+AAAAfgAAAHwAAAB8AAAA/gAAAP4AAAD+AAAB/gAAAf4AAAP+AAAH/gAAD/4AAB/+AAA//gAAf/4AAP/8oAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ2dnUOfn5+0oqKi9qSkpO6lpaWSpqamDgAAAAAAAAAAAAAAAKysrO+rq6tvqqqqDgAAAAClpaUEo6OjSaCgoL6tra3/5eXl//39/f//////+/v7//Hx8dYAAAAAAAAAAAAAAACvr6//wcHB/66urvuqqqrgqKio9LOzs//Nzc3/9vb2/67x//9T2///PdD//z/L//+b4v//////twAAAAAAAAAAs7Oz/9zc3P/z8/P/5OTk/+fn5//p6en/6Ojo//7+/v9f6f//UeD//0bX///S9P//NMf///////YAAAAAAAAAALa2tv/Nzc3/4uLi/+3t7f/t7e3/+fn5//7+/v//////Ye3//1rn//+38v//////////////////////9f///7a5ubn/3d3d//b29v/w8PD/+vr6/9C8pP+Rb0X//////2Pt//9h7P//WOX//03d//9C1P//N8z//zDD//+Z4P//vb29/87Ozv/k5OT/8vLy//7+/v+pfkn/mXE///Pv6v+b9P//Y+3//2Dr//9W4///S9v//0DS//81yv//OMX//8DAwP/Gxsb/7e3t//X19f//////rXo7/6J1Pf+zlXH/8+/q/////////////////+v7//924v//PtH//zPI//+zs7P/ra2t/6SkpP/v7+///////7uGRf+reTz/oHQ+/5RuQP+JaUL/fmRF/31kRv+snIn/6/v//0fY//9I0v//r6+v/1lZWf91dXX/sbGx//b29v/gxKH/toA9/6l4PP+ecz7/km1B/4doQ/99ZEX/fWVH//////9T3///qOz//5ubm/9/f3//NDQ0/3x8fP/c3Nz//f39//7+/v/////////////////QwbD/hWdD/31jRf//////////9f///7W9vb3/oaGh/6ioqP9NTU3/lpaW//7+/v/9/f3//////7F+Pv/q4NP/mXE//45rQf+FaUf/////9AAAAAAAAAAAwcHB/8/Pz//l5eX/ubm5/1JSUv/AwMD/+Pj4//r6+v/ewqL/soJH/6N1Pf+deEv/yrqn/////7UAAAAAAAAAAL6+vv/e3t7/9/f3//n5+f+7u7v/nJyc/+3t7f/h4eH//v7+//39/f///////v7+/+zs7P8AAAAAAAAAAAAAAAC7u7v/zs7O/+Tk5P/29vb/+Pj4//f39//f39//+vr6//z8/P/IyMj/+fn5/8zMzP+/v79/AAAAAAAAAAAAAAAAt7e3/7m5uf+7u7v/vb29/7+/v//BwcH/w8PD/8XFxf/IyMj/ycnJ/8fHx//ExMR/AAAAAAAAAAAAAAAAAAAAAH4HrEEQB6xBAAOsQQADrEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAAOsQQADrEEAB6xBAAesQQAPrEEAAAEABwAgIBAAAQAEAOgCAAABABAQEAABAAQAKAEAAAIAICAAAAEACACoCAAAAwAQEAAAAQAIAGgFAAAEADAwAAABACAAqCUAAAUAICAAAAEAIACoEAAABgAQEAAAAQAgAGgEAAAHADxhc3NlbWJseSB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIj4NCiAgPHRydXN0SW5mbyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjMiPg0KICAgIDxzZWN1cml0eT4NCiAgICAgIDxyZXF1ZXN0ZWRQcml2aWxlZ2VzPg0KICAgICAgICA8cmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWwgbGV2ZWw9ImFzSW52b2tlciIgdWlBY2Nlc3M9ImZhbHNlIj48L3JlcXVlc3RlZEV4ZWN1dGlvbkxldmVsPg0KICAgICAgPC9yZXF1ZXN0ZWRQcml2aWxlZ2VzPg0KICAgIDwvc2VjdXJpdHk+DQogIDwvdHJ1c3RJbmZvPg0KPC9hc3NlbWJseT5QQVBBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRADgAABEAAAAoKKoorCiuKLQotiiIKMoo2iseKyIrJisqKy4rMis2KzorPisCK0YrSitOK1IrVitaK14rYitmK2orbitACABAIAAAAAAoBCg8Kj4qACpCKkgqSipMKk4qUCpSKlQqVipYKloqaCtsK64rsCuyK7Qrtiu4K7orvCu+K4ArwivEK8YryCvKK8wrzivQK9Ir1CvWK9gr2ivcK94r4CviK+Qr5ivoK+or7CvuK/Ar8iv0K/Yr+Cv6K/wr/ivAAAAMAEAoAAAAACgGKAgoCigMKA4oECgSKBQoFigYKBooHCgeKCAoIigkKCYoKCgqKCwoLigwKDIoNCg2KDgoOig8KD4oAChCKEQoRihIKEooTChOKFAoUihUKFYoWChaKHYofihGKI4oliimKKworiiwKLIotCi4KL4ogCjCKMQoxijIKMoozCjOKNAo0ijWKNgo2ijcKN4o4CjiKOQowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQSwMEFAAAAAAAAAAhADfYASX/zgAA/84AADgAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdXRpbC5weSMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmltcG9ydCBjb2RlY3MKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGNzdgpmcm9tIGdsb2IgaW1wb3J0IGlnbG9iIGFzIHN0ZF9pZ2xvYgppbXBvcnQgaW8KaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBweV9jb21waWxlCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzb2NrZXQKdHJ5OgogICAgaW1wb3J0IHNzbApleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIHNzbCA9IE5vbmUKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwppbXBvcnQgdGFyZmlsZQppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHRleHR3cmFwCgp0cnk6CiAgICBpbXBvcnQgdGhyZWFkaW5nCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyB0aHJlYWRpbmcKaW1wb3J0IHRpbWUKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0IChzdHJpbmdfdHlwZXMsIHRleHRfdHlwZSwgc2h1dGlsLCByYXdfaW5wdXQsIFN0cmluZ0lPLAogICAgICAgICAgICAgICAgICAgICBjYWNoZV9mcm9tX3NvdXJjZSwgdXJsb3BlbiwgdXJsam9pbiwgaHR0cGxpYiwgeG1scnBjbGliLAogICAgICAgICAgICAgICAgICAgICBzcGxpdHR5cGUsIEhUVFBIYW5kbGVyLCBCYXNlQ29uZmlndXJhdG9yLCB2YWxpZF9pZGVudCwKICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyLCBjb25maWdwYXJzZXIsIFVSTEVycm9yLCBaaXBGaWxlLCBmc2RlY29kZSwKICAgICAgICAgICAgICAgICAgICAgdW5xdW90ZSkKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKIwojIFJlcXVpcmVtZW50IHBhcnNpbmcgY29kZSBmb3IgbmFtZSArIG9wdGlvbmFsIGNvbnN0cmFpbnRzICsgb3B0aW9uYWwgZXh0cmFzCiMKIyBlLmcuICdmb28gPj0gMS4yLCA8IDIuMCBbYmFyLCBiYXpdJwojCiMgVGhlIHJlZ2V4IGNhbiBzZWVtIGEgYml0IGhhaXJ5LCBzbyB3ZSBidWlsZCBpdCB1cCBvdXQgb2Ygc21hbGxlciBwaWVjZXMKIyB3aGljaCBhcmUgbWFuYWdlYWJsZS4KIwoKQ09NTUEgPSByJ1xzKixccyonCkNPTU1BX1JFID0gcmUuY29tcGlsZShDT01NQSkKCklERU5UID0gcicoXHd8Wy4tXSkrJwpFWFRSQV9JREVOVCA9IHInKFwqfDooXCp8XHcrKTp8JyArIElERU5UICsgJyknClZFUlNQRUMgPSBJREVOVCArIHInXCo/JwoKUkVMT1AgPSAnKFs8Pj0hfl09KXxbPD5dJwoKIwojIFRoZSBmaXJzdCByZWxvcCBpcyBvcHRpb25hbCAtIGlmIGFic2VudCwgd2lsbCBiZSB0YWtlbiBhcyAnfj0nCiMKQkFSRV9DT05TVFJBSU5UUyA9ICgnKCcgKyBSRUxPUCArIHInKT9ccyooJyArIFZFUlNQRUMgKyAnKSgnICsgQ09NTUEgKyAnKCcgKwogICAgICAgICAgICAgICAgICAgIFJFTE9QICsgcicpXHMqKCcgKyBWRVJTUEVDICsgJykpKicpCgpESVJFQ1RfUkVGID0gJyhmcm9tXHMrKD9QPGRpcmVmPi4qKSknCgojCiMgRWl0aGVyIHRoZSBiYXJlIGNvbnN0cmFpbnRzIG9yIHRoZSBiYXJlIGNvbnN0cmFpbnRzIGluIHBhcmVudGhlc2VzCiMKQ09OU1RSQUlOVFMgPSAocidcKFxzKig/UDxjMT4nICsgQkFSRV9DT05TVFJBSU5UUyArICd8JyArIERJUkVDVF9SRUYgKwogICAgICAgICAgICAgICByJylccypcKXwoP1A8YzI+JyArIEJBUkVfQ09OU1RSQUlOVFMgKyAnXHMqKScpCgpFWFRSQV9MSVNUID0gRVhUUkFfSURFTlQgKyAnKCcgKyBDT01NQSArIEVYVFJBX0lERU5UICsgJykqJwpFWFRSQVMgPSByJ1xbXHMqKD9QPGV4PicgKyBFWFRSQV9MSVNUICsgcicpP1xzKlxdJwpSRVFVSVJFTUVOVCA9ICgnKD9QPGRuPicgICsgSURFTlQgKyByJylccyooJyArIEVYVFJBUyArIHInXHMqKT8oXHMqJyArCiAgICAgICAgICAgICAgIENPTlNUUkFJTlRTICsgJyk/JCcpClJFUVVJUkVNRU5UX1JFID0gcmUuY29tcGlsZShSRVFVSVJFTUVOVCkKCiMKIyBVc2VkIHRvIHNjYW4gdGhyb3VnaCB0aGUgY29uc3RyYWludHMKIwpSRUxPUF9JREVOVCA9ICcoP1A8b3A+JyArIFJFTE9QICsgcicpXHMqKD9QPHZuPicgKyBWRVJTUEVDICsgJyknClJFTE9QX0lERU5UX1JFID0gcmUuY29tcGlsZShSRUxPUF9JREVOVCkKCmRlZiBwYXJzZV9yZXF1aXJlbWVudChzKToKCiAgICBkZWYgZ2V0X2NvbnN0cmFpbnQobSk6CiAgICAgICAgZCA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICByZXR1cm4gZFsnb3AnXSwgZFsndm4nXQoKICAgIHJlc3VsdCA9IE5vbmUKICAgIG0gPSBSRVFVSVJFTUVOVF9SRS5tYXRjaChzKQogICAgaWYgbToKICAgICAgICBkID0gbS5ncm91cGRpY3QoKQogICAgICAgIG5hbWUgPSBkWydkbiddCiAgICAgICAgY29ucyA9IGRbJ2MxJ10gb3IgZFsnYzInXQogICAgICAgIGlmIG5vdCBkWydkaXJlZiddOgogICAgICAgICAgICB1cmwgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBkaXJlY3QgcmVmZXJlbmNlCiAgICAgICAgICAgIGNvbnMgPSBOb25lCiAgICAgICAgICAgIHVybCA9IGRbJ2RpcmVmJ10uc3RyaXAoKQogICAgICAgIGlmIG5vdCBjb25zOgogICAgICAgICAgICBjb25zID0gTm9uZQogICAgICAgICAgICBjb25zdHIgPSAnJwogICAgICAgICAgICBycyA9IGRbJ2RuJ10KICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBjb25zWzBdIG5vdCBpbiAnPD4hPSc6CiAgICAgICAgICAgICAgICBjb25zID0gJ349JyArIGNvbnMKICAgICAgICAgICAgaXRlcmF0b3IgPSBSRUxPUF9JREVOVF9SRS5maW5kaXRlcihjb25zKQogICAgICAgICAgICBjb25zID0gW2dldF9jb25zdHJhaW50KG0pIGZvciBtIGluIGl0ZXJhdG9yXQogICAgICAgICAgICBycyA9ICclcyAoJXMpJyAlIChuYW1lLCAnLCAnLmpvaW4oWyclcyAlcycgJSBjb24gZm9yIGNvbiBpbiBjb25zXSkpCiAgICAgICAgaWYgbm90IGRbJ2V4J106CiAgICAgICAgICAgIGV4dHJhcyA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBleHRyYXMgPSBDT01NQV9SRS5zcGxpdChkWydleCddKQogICAgICAgIHJlc3VsdCA9IENvbnRhaW5lcihuYW1lPW5hbWUsIGNvbnN0cmFpbnRzPWNvbnMsIGV4dHJhcz1leHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50PXJzLCBzb3VyY2U9cywgdXJsPXVybCkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgZ2V0X3Jlc291cmNlc19kZXN0cyhyZXNvdXJjZXNfcm9vdCwgcnVsZXMpOgogICAgIiIiRmluZCBkZXN0aW5hdGlvbnMgZm9yIHJlc291cmNlcyBmaWxlcyIiIgoKICAgIGRlZiBnZXRfcmVsX3BhdGgoYmFzZSwgcGF0aCk6CiAgICAgICAgIyBub3JtYWxpemVzIGFuZCByZXR1cm5zIGEgbHN0cmlwcGVkLS8tc2VwYXJhdGVkIHBhdGgKICAgICAgICBiYXNlID0gYmFzZS5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKQogICAgICAgIGFzc2VydCBwYXRoLnN0YXJ0c3dpdGgoYmFzZSkKICAgICAgICByZXR1cm4gcGF0aFtsZW4oYmFzZSk6XS5sc3RyaXAoJy8nKQoKCiAgICBkZXN0aW5hdGlvbnMgPSB7fQogICAgZm9yIGJhc2UsIHN1ZmZpeCwgZGVzdCBpbiBydWxlczoKICAgICAgICBwcmVmaXggPSBvcy5wYXRoLmpvaW4ocmVzb3VyY2VzX3Jvb3QsIGJhc2UpCiAgICAgICAgZm9yIGFic19iYXNlIGluIGlnbG9iKHByZWZpeCk6CiAgICAgICAgICAgIGFic19nbG9iID0gb3MucGF0aC5qb2luKGFic19iYXNlLCBzdWZmaXgpCiAgICAgICAgICAgIGZvciBhYnNfcGF0aCBpbiBpZ2xvYihhYnNfZ2xvYik6CiAgICAgICAgICAgICAgICByZXNvdXJjZV9maWxlID0gZ2V0X3JlbF9wYXRoKHJlc291cmNlc19yb290LCBhYnNfcGF0aCkKICAgICAgICAgICAgICAgIGlmIGRlc3QgaXMgTm9uZTogICMgcmVtb3ZlIHRoZSBlbnRyeSBpZiBpdCB3YXMgaGVyZQogICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9ucy5wb3AocmVzb3VyY2VfZmlsZSwgTm9uZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVsX3BhdGggPSBnZXRfcmVsX3BhdGgoYWJzX2Jhc2UsIGFic19wYXRoKQogICAgICAgICAgICAgICAgICAgIHJlbF9kZXN0ID0gZGVzdC5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpLnJzdHJpcCgnLycpCiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25zW3Jlc291cmNlX2ZpbGVdID0gcmVsX2Rlc3QgKyAnLycgKyByZWxfcGF0aAogICAgcmV0dXJuIGRlc3RpbmF0aW9ucwoKCmRlZiBpbl92ZW52KCk6CiAgICBpZiBoYXNhdHRyKHN5cywgJ3JlYWxfcHJlZml4Jyk6CiAgICAgICAgIyB2aXJ0dWFsZW52IHZlbnZzCiAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgZWxzZToKICAgICAgICAjIFBFUCA0MDUgdmVudnMKICAgICAgICByZXN1bHQgPSBzeXMucHJlZml4ICE9IGdldGF0dHIoc3lzLCAnYmFzZV9wcmVmaXgnLCBzeXMucHJlZml4KQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBnZXRfZXhlY3V0YWJsZSgpOgojIFRoZSBfX1BZVkVOVl9MQVVOQ0hFUl9fIGRhbmNlIGlzIGFwcGFyZW50bHkgbm8gbG9uZ2VyIG5lZWRlZCwgYXMKIyBjaGFuZ2VzIHRvIHRoZSBzdHViIGxhdW5jaGVyIG1lYW4gdGhhdCBzeXMuZXhlY3V0YWJsZSBhbHdheXMgcG9pbnRzCiMgdG8gdGhlIHN0dWIgb24gbWFjT1MKIyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICgnX19QWVZFTlZfTEFVTkNIRVJfXycKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBvcy5lbnZpcm9uKToKIyAgICAgICAgcmVzdWx0ID0gIG9zLmVudmlyb25bJ19fUFlWRU5WX0xBVU5DSEVSX18nXQojICAgIGVsc2U6CiMgICAgICAgIHJlc3VsdCA9IHN5cy5leGVjdXRhYmxlCiMgICAgcmV0dXJuIHJlc3VsdAogICAgcmVzdWx0ID0gb3MucGF0aC5ub3JtY2FzZShzeXMuZXhlY3V0YWJsZSkKICAgIGlmIG5vdCBpc2luc3RhbmNlKHJlc3VsdCwgdGV4dF90eXBlKToKICAgICAgICByZXN1bHQgPSBmc2RlY29kZShyZXN1bHQpCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIHByb2NlZWQocHJvbXB0LCBhbGxvd2VkX2NoYXJzLCBlcnJvcl9wcm9tcHQ9Tm9uZSwgZGVmYXVsdD1Ob25lKToKICAgIHAgPSBwcm9tcHQKICAgIHdoaWxlIFRydWU6CiAgICAgICAgcyA9IHJhd19pbnB1dChwKQogICAgICAgIHAgPSBwcm9tcHQKICAgICAgICBpZiBub3QgcyBhbmQgZGVmYXVsdDoKICAgICAgICAgICAgcyA9IGRlZmF1bHQKICAgICAgICBpZiBzOgogICAgICAgICAgICBjID0gc1swXS5sb3dlcigpCiAgICAgICAgICAgIGlmIGMgaW4gYWxsb3dlZF9jaGFyczoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIGVycm9yX3Byb21wdDoKICAgICAgICAgICAgICAgIHAgPSAnJWM6ICVzXG4lcycgJSAoYywgZXJyb3JfcHJvbXB0LCBwcm9tcHQpCiAgICByZXR1cm4gYwoKCmRlZiBleHRyYWN0X2J5X2tleShkLCBrZXlzKToKICAgIGlmIGlzaW5zdGFuY2Uoa2V5cywgc3RyaW5nX3R5cGVzKToKICAgICAgICBrZXlzID0ga2V5cy5zcGxpdCgpCiAgICByZXN1bHQgPSB7fQogICAgZm9yIGtleSBpbiBrZXlzOgogICAgICAgIGlmIGtleSBpbiBkOgogICAgICAgICAgICByZXN1bHRba2V5XSA9IGRba2V5XQogICAgcmV0dXJuIHJlc3VsdAoKZGVmIHJlYWRfZXhwb3J0cyhzdHJlYW0pOgogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzOgogICAgICAgICMgbmVlZHMgdG8gYmUgYSB0ZXh0IHN0cmVhbQogICAgICAgIHN0cmVhbSA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04Jykoc3RyZWFtKQogICAgIyBUcnkgdG8gbG9hZCBhcyBKU09OLCBmYWxsaW5nIGJhY2sgb24gbGVnYWN5IGZvcm1hdAogICAgZGF0YSA9IHN0cmVhbS5yZWFkKCkKICAgIHN0cmVhbSA9IFN0cmluZ0lPKGRhdGEpCiAgICB0cnk6CiAgICAgICAgamRhdGEgPSBqc29uLmxvYWQoc3RyZWFtKQogICAgICAgIHJlc3VsdCA9IGpkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5leHBvcnRzJ11bJ2V4cG9ydHMnXQogICAgICAgIGZvciBncm91cCwgZW50cmllcyBpbiByZXN1bHQuaXRlbXMoKToKICAgICAgICAgICAgZm9yIGssIHYgaW4gZW50cmllcy5pdGVtcygpOgogICAgICAgICAgICAgICAgcyA9ICclcyA9ICVzJyAlIChrLCB2KQogICAgICAgICAgICAgICAgZW50cnkgPSBnZXRfZXhwb3J0X2VudHJ5KHMpCiAgICAgICAgICAgICAgICBhc3NlcnQgZW50cnkgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGVudHJpZXNba10gPSBlbnRyeQogICAgICAgIHJldHVybiByZXN1bHQKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgc3RyZWFtLnNlZWsoMCwgMCkKCiAgICBkZWYgcmVhZF9zdHJlYW0oY3AsIHN0cmVhbSk6CiAgICAgICAgaWYgaGFzYXR0cihjcCwgJ3JlYWRfZmlsZScpOgogICAgICAgICAgICBjcC5yZWFkX2ZpbGUoc3RyZWFtKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNwLnJlYWRmcChzdHJlYW0pCgogICAgY3AgPSBjb25maWdwYXJzZXIuQ29uZmlnUGFyc2VyKCkKICAgIHRyeToKICAgICAgICByZWFkX3N0cmVhbShjcCwgc3RyZWFtKQogICAgZXhjZXB0IGNvbmZpZ3BhcnNlci5NaXNzaW5nU2VjdGlvbkhlYWRlckVycm9yOgogICAgICAgIHN0cmVhbS5jbG9zZSgpCiAgICAgICAgZGF0YSA9IHRleHR3cmFwLmRlZGVudChkYXRhKQogICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPKGRhdGEpCiAgICAgICAgcmVhZF9zdHJlYW0oY3AsIHN0cmVhbSkKCiAgICByZXN1bHQgPSB7fQogICAgZm9yIGtleSBpbiBjcC5zZWN0aW9ucygpOgogICAgICAgIHJlc3VsdFtrZXldID0gZW50cmllcyA9IHt9CiAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGNwLml0ZW1zKGtleSk6CiAgICAgICAgICAgIHMgPSAnJXMgPSAlcycgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgIGVudHJ5ID0gZ2V0X2V4cG9ydF9lbnRyeShzKQogICAgICAgICAgICBhc3NlcnQgZW50cnkgaXMgbm90IE5vbmUKICAgICAgICAgICAgI2VudHJ5LmRpc3QgPSBzZWxmCiAgICAgICAgICAgIGVudHJpZXNbbmFtZV0gPSBlbnRyeQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiB3cml0ZV9leHBvcnRzKGV4cG9ydHMsIHN0cmVhbSk6CiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CiAgICAgICAgIyBuZWVkcyB0byBiZSBhIHRleHQgc3RyZWFtCiAgICAgICAgc3RyZWFtID0gY29kZWNzLmdldHdyaXRlcigndXRmLTgnKShzdHJlYW0pCiAgICBjcCA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQogICAgZm9yIGssIHYgaW4gZXhwb3J0cy5pdGVtcygpOgogICAgICAgICMgVE9ETyBjaGVjayBrLCB2IGZvciB2YWxpZCB2YWx1ZXMKICAgICAgICBjcC5hZGRfc2VjdGlvbihrKQogICAgICAgIGZvciBlbnRyeSBpbiB2LnZhbHVlcygpOgogICAgICAgICAgICBpZiBlbnRyeS5zdWZmaXggaXMgTm9uZToKICAgICAgICAgICAgICAgIHMgPSBlbnRyeS5wcmVmaXgKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHMgPSAnJXM6JXMnICUgKGVudHJ5LnByZWZpeCwgZW50cnkuc3VmZml4KQogICAgICAgICAgICBpZiBlbnRyeS5mbGFnczoKICAgICAgICAgICAgICAgIHMgPSAnJXMgWyVzXScgJSAocywgJywgJy5qb2luKGVudHJ5LmZsYWdzKSkKICAgICAgICAgICAgY3Auc2V0KGssIGVudHJ5Lm5hbWUsIHMpCiAgICBjcC53cml0ZShzdHJlYW0pCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHRlbXBkaXIoKToKICAgIHRkID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICB0cnk6CiAgICAgICAgeWllbGQgdGQKICAgIGZpbmFsbHk6CiAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZCkKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBjaGRpcihkKToKICAgIGN3ZCA9IG9zLmdldGN3ZCgpCiAgICB0cnk6CiAgICAgICAgb3MuY2hkaXIoZCkKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBvcy5jaGRpcihjd2QpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNvY2tldF90aW1lb3V0KHNlY29uZHM9MTUpOgogICAgY3RvID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKICAgIHRyeToKICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoc2Vjb25kcykKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoY3RvKQoKCmNsYXNzIGNhY2hlZF9wcm9wZXJ0eShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMpOgogICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKICAgICAgICAjZm9yIGF0dHIgaW4gKCdfX25hbWVfXycsICdfX21vZHVsZV9fJywgJ19fZG9jX18nKToKICAgICAgICAjICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgZ2V0YXR0cihmdW5jLCBhdHRyLCBOb25lKSkKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIGNscz1Ob25lKToKICAgICAgICBpZiBvYmogaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICB2YWx1ZSA9IHNlbGYuZnVuYyhvYmopCiAgICAgICAgb2JqZWN0Ll9fc2V0YXR0cl9fKG9iaiwgc2VsZi5mdW5jLl9fbmFtZV9fLCB2YWx1ZSkKICAgICAgICAjb2JqLl9fZGljdF9fW3NlbGYuZnVuYy5fX25hbWVfX10gPSB2YWx1ZSA9IHNlbGYuZnVuYyhvYmopCiAgICAgICAgcmV0dXJuIHZhbHVlCgpkZWYgY29udmVydF9wYXRoKHBhdGhuYW1lKToKICAgICIiIlJldHVybiAncGF0aG5hbWUnIGFzIGEgbmFtZSB0aGF0IHdpbGwgd29yayBvbiB0aGUgbmF0aXZlIGZpbGVzeXN0ZW0uCgogICAgVGhlIHBhdGggaXMgc3BsaXQgb24gJy8nIGFuZCBwdXQgYmFjayB0b2dldGhlciBhZ2FpbiB1c2luZyB0aGUgY3VycmVudAogICAgZGlyZWN0b3J5IHNlcGFyYXRvci4gIE5lZWRlZCBiZWNhdXNlIGZpbGVuYW1lcyBpbiB0aGUgc2V0dXAgc2NyaXB0IGFyZQogICAgYWx3YXlzIHN1cHBsaWVkIGluIFVuaXggc3R5bGUsIGFuZCBoYXZlIHRvIGJlIGNvbnZlcnRlZCB0byB0aGUgbG9jYWwKICAgIGNvbnZlbnRpb24gYmVmb3JlIHdlIGNhbiBhY3R1YWxseSB1c2UgdGhlbSBpbiB0aGUgZmlsZXN5c3RlbS4gIFJhaXNlcwogICAgVmFsdWVFcnJvciBvbiBub24tVW5peC1pc2ggc3lzdGVtcyBpZiAncGF0aG5hbWUnIGVpdGhlciBzdGFydHMgb3IKICAgIGVuZHMgd2l0aCBhIHNsYXNoLgogICAgIiIiCiAgICBpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgIHJldHVybiBwYXRobmFtZQogICAgaWYgbm90IHBhdGhuYW1lOgogICAgICAgIHJldHVybiBwYXRobmFtZQogICAgaWYgcGF0aG5hbWVbMF0gPT0gJy8nOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInBhdGggJyVzJyBjYW5ub3QgYmUgYWJzb2x1dGUiICUgcGF0aG5hbWUpCiAgICBpZiBwYXRobmFtZVstMV0gPT0gJy8nOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInBhdGggJyVzJyBjYW5ub3QgZW5kIHdpdGggJy8nIiAlIHBhdGhuYW1lKQoKICAgIHBhdGhzID0gcGF0aG5hbWUuc3BsaXQoJy8nKQogICAgd2hpbGUgb3MuY3VyZGlyIGluIHBhdGhzOgogICAgICAgIHBhdGhzLnJlbW92ZShvcy5jdXJkaXIpCiAgICBpZiBub3QgcGF0aHM6CiAgICAgICAgcmV0dXJuIG9zLmN1cmRpcgogICAgcmV0dXJuIG9zLnBhdGguam9pbigqcGF0aHMpCgoKY2xhc3MgRmlsZU9wZXJhdG9yKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZHJ5X3J1bj1GYWxzZSk6CiAgICAgICAgc2VsZi5kcnlfcnVuID0gZHJ5X3J1bgogICAgICAgIHNlbGYuZW5zdXJlZCA9IHNldCgpCiAgICAgICAgc2VsZi5faW5pdF9yZWNvcmQoKQoKICAgIGRlZiBfaW5pdF9yZWNvcmQoc2VsZik6CiAgICAgICAgc2VsZi5yZWNvcmQgPSBGYWxzZQogICAgICAgIHNlbGYuZmlsZXNfd3JpdHRlbiA9IHNldCgpCiAgICAgICAgc2VsZi5kaXJzX2NyZWF0ZWQgPSBzZXQoKQoKICAgIGRlZiByZWNvcmRfYXNfd3JpdHRlbihzZWxmLCBwYXRoKToKICAgICAgICBpZiBzZWxmLnJlY29yZDoKICAgICAgICAgICAgc2VsZi5maWxlc193cml0dGVuLmFkZChwYXRoKQoKICAgIGRlZiBuZXdlcihzZWxmLCBzb3VyY2UsIHRhcmdldCk6CiAgICAgICAgIiIiVGVsbCBpZiB0aGUgdGFyZ2V0IGlzIG5ld2VyIHRoYW4gdGhlIHNvdXJjZS4KCiAgICAgICAgUmV0dXJucyB0cnVlIGlmICdzb3VyY2UnIGV4aXN0cyBhbmQgaXMgbW9yZSByZWNlbnRseSBtb2RpZmllZCB0aGFuCiAgICAgICAgJ3RhcmdldCcsIG9yIGlmICdzb3VyY2UnIGV4aXN0cyBhbmQgJ3RhcmdldCcgZG9lc24ndC4KCiAgICAgICAgUmV0dXJucyBmYWxzZSBpZiBib3RoIGV4aXN0IGFuZCAndGFyZ2V0JyBpcyB0aGUgc2FtZSBhZ2Ugb3IgeW91bmdlcgogICAgICAgIHRoYW4gJ3NvdXJjZScuIFJhaXNlIFBhY2thZ2luZ0ZpbGVFcnJvciBpZiAnc291cmNlJyBkb2VzIG5vdCBleGlzdC4KCiAgICAgICAgTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBub3QgdmVyeSBhY2N1cmF0ZTogZmlsZXMgY3JlYXRlZCBpbiB0aGUgc2FtZQogICAgICAgIHNlY29uZCB3aWxsIGhhdmUgdGhlIHNhbWUgImFnZSIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNvdXJjZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oImZpbGUgJyVyJyBkb2VzIG5vdCBleGlzdCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChzb3VyY2UpKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0YXJnZXQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gb3Muc3RhdChzb3VyY2UpLnN0X210aW1lID4gb3Muc3RhdCh0YXJnZXQpLnN0X210aW1lCgogICAgZGVmIGNvcHlfZmlsZShzZWxmLCBpbmZpbGUsIG91dGZpbGUsIGNoZWNrPVRydWUpOgogICAgICAgICIiIkNvcHkgYSBmaWxlIHJlc3BlY3RpbmcgZHJ5LXJ1biBhbmQgZm9yY2UgZmxhZ3MuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShvdXRmaWxlKSkKICAgICAgICBsb2dnZXIuaW5mbygnQ29weWluZyAlcyB0byAlcycsIGluZmlsZSwgb3V0ZmlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBtc2cgPSBOb25lCiAgICAgICAgICAgIGlmIGNoZWNrOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsob3V0ZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gJyVzIGlzIGEgc3ltbGluaycgJSBvdXRmaWxlCiAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKG91dGZpbGUpIGFuZCBub3Qgb3MucGF0aC5pc2ZpbGUob3V0ZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gJyVzIGlzIGEgbm9uLXJlZ3VsYXIgZmlsZScgJSBvdXRmaWxlCiAgICAgICAgICAgIGlmIG1zZzoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICsgJyB3aGljaCB3b3VsZCBiZSBvdmVyd3JpdHRlbicpCiAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShpbmZpbGUsIG91dGZpbGUpCiAgICAgICAgc2VsZi5yZWNvcmRfYXNfd3JpdHRlbihvdXRmaWxlKQoKICAgIGRlZiBjb3B5X3N0cmVhbShzZWxmLCBpbnN0cmVhbSwgb3V0ZmlsZSwgZW5jb2Rpbmc9Tm9uZSk6CiAgICAgICAgYXNzZXJ0IG5vdCBvcy5wYXRoLmlzZGlyKG91dGZpbGUpCiAgICAgICAgc2VsZi5lbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShvdXRmaWxlKSkKICAgICAgICBsb2dnZXIuaW5mbygnQ29weWluZyBzdHJlYW0gJXMgdG8gJXMnLCBpbnN0cmVhbSwgb3V0ZmlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgogICAgICAgICAgICAgICAgb3V0c3RyZWFtID0gb3BlbihvdXRmaWxlLCAnd2InKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3V0c3RyZWFtID0gY29kZWNzLm9wZW4ob3V0ZmlsZSwgJ3cnLCBlbmNvZGluZz1lbmNvZGluZykKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKGluc3RyZWFtLCBvdXRzdHJlYW0pCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBvdXRzdHJlYW0uY2xvc2UoKQogICAgICAgIHNlbGYucmVjb3JkX2FzX3dyaXR0ZW4ob3V0ZmlsZSkKCiAgICBkZWYgd3JpdGVfYmluYXJ5X2ZpbGUoc2VsZiwgcGF0aCwgZGF0YSk6CiAgICAgICAgc2VsZi5lbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShwYXRoKSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKICAgICAgICBzZWxmLnJlY29yZF9hc193cml0dGVuKHBhdGgpCgogICAgZGVmIHdyaXRlX3RleHRfZmlsZShzZWxmLCBwYXRoLCBkYXRhLCBlbmNvZGluZyk6CiAgICAgICAgc2VsZi5lbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShwYXRoKSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YS5lbmNvZGUoZW5jb2RpbmcpKQogICAgICAgIHNlbGYucmVjb3JkX2FzX3dyaXR0ZW4ocGF0aCkKCiAgICBkZWYgc2V0X21vZGUoc2VsZiwgYml0cywgbWFzaywgZmlsZXMpOgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JyBvciAob3MubmFtZSA9PSAnamF2YScgYW5kIG9zLl9uYW1lID09ICdwb3NpeCcpOgogICAgICAgICAgICAjIFNldCB0aGUgZXhlY3V0YWJsZSBiaXRzIChvd25lciwgZ3JvdXAsIGFuZCB3b3JsZCkgb24KICAgICAgICAgICAgIyBhbGwgdGhlIGZpbGVzIHNwZWNpZmllZC4KICAgICAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNoYW5naW5nIG1vZGUgb2YgJXMiLCBmKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtb2RlID0gKG9zLnN0YXQoZikuc3RfbW9kZSB8IGJpdHMpICYgbWFzawogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjaGFuZ2luZyBtb2RlIG9mICVzIHRvICVvIiwgZiwgbW9kZSkKICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChmLCBtb2RlKQoKICAgIHNldF9leGVjdXRhYmxlX21vZGUgPSBsYW1iZGEgcywgZjogcy5zZXRfbW9kZSgwbzU1NSwgMG83Nzc3LCBmKQoKICAgIGRlZiBlbnN1cmVfZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKICAgICAgICBpZiBwYXRoIG5vdCBpbiBzZWxmLmVuc3VyZWQgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgc2VsZi5lbnN1cmVkLmFkZChwYXRoKQogICAgICAgICAgICBkLCBmID0gb3MucGF0aC5zcGxpdChwYXRoKQogICAgICAgICAgICBzZWxmLmVuc3VyZV9kaXIoZCkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NyZWF0aW5nICVzJyAlIHBhdGgpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBvcy5ta2RpcihwYXRoKQogICAgICAgICAgICBpZiBzZWxmLnJlY29yZDoKICAgICAgICAgICAgICAgIHNlbGYuZGlyc19jcmVhdGVkLmFkZChwYXRoKQoKICAgIGRlZiBieXRlX2NvbXBpbGUoc2VsZiwgcGF0aCwgb3B0aW1pemU9RmFsc2UsIGZvcmNlPUZhbHNlLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgZHBhdGggPSBjYWNoZV9mcm9tX3NvdXJjZShwYXRoLCBub3Qgb3B0aW1pemUpCiAgICAgICAgbG9nZ2VyLmluZm8oJ0J5dGUtY29tcGlsaW5nICVzIHRvICVzJywgcGF0aCwgZHBhdGgpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgaWYgZm9yY2Ugb3Igc2VsZi5uZXdlcihwYXRoLCBkcGF0aCk6CiAgICAgICAgICAgICAgICBpZiBub3QgcHJlZml4OgogICAgICAgICAgICAgICAgICAgIGRpYWdwYXRoID0gTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcGF0aC5zdGFydHN3aXRoKHByZWZpeCkKICAgICAgICAgICAgICAgICAgICBkaWFncGF0aCA9IHBhdGhbbGVuKHByZWZpeCk6XQogICAgICAgICAgICBweV9jb21waWxlLmNvbXBpbGUocGF0aCwgZHBhdGgsIGRpYWdwYXRoLCBUcnVlKSAgICAgIyByYWlzZSBlcnJvcgogICAgICAgIHNlbGYucmVjb3JkX2FzX3dyaXR0ZW4oZHBhdGgpCiAgICAgICAgcmV0dXJuIGRwYXRoCgogICAgZGVmIGVuc3VyZV9yZW1vdmVkKHNlbGYsIHBhdGgpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsocGF0aCk6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92aW5nIGRpcmVjdG9yeSB0cmVlIGF0ICVzJywgcGF0aCkKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShwYXRoKQogICAgICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBpbiBzZWxmLmRpcnNfY3JlYXRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJzX2NyZWF0ZWQucmVtb3ZlKHBhdGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhwYXRoKToKICAgICAgICAgICAgICAgICAgICBzID0gJ2xpbmsnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHMgPSAnZmlsZScKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZpbmcgJXMgJXMnLCBzLCBwYXRoKQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKICAgICAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgICAgIGlmIHBhdGggaW4gc2VsZi5maWxlc193cml0dGVuOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVzX3dyaXR0ZW4ucmVtb3ZlKHBhdGgpCgogICAgZGVmIGlzX3dyaXRhYmxlKHNlbGYsIHBhdGgpOgogICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgd2hpbGUgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBvcy5hY2Nlc3MocGF0aCwgb3MuV19PSykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHBhcmVudCA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICBpZiBwYXJlbnQgPT0gcGF0aDoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHBhdGggPSBwYXJlbnQKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGNvbW1pdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb21taXQgcmVjb3JkZWQgY2hhbmdlcywgdHVybiBvZmYgcmVjb3JkaW5nLCByZXR1cm4KICAgICAgICBjaGFuZ2VzLgogICAgICAgICIiIgogICAgICAgIGFzc2VydCBzZWxmLnJlY29yZAogICAgICAgIHJlc3VsdCA9IHNlbGYuZmlsZXNfd3JpdHRlbiwgc2VsZi5kaXJzX2NyZWF0ZWQKICAgICAgICBzZWxmLl9pbml0X3JlY29yZCgpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiByb2xsYmFjayhzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmb3IgZiBpbiBsaXN0KHNlbGYuZmlsZXNfd3JpdHRlbik6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZikKICAgICAgICAgICAgIyBkaXJzIHNob3VsZCBhbGwgYmUgZW1wdHkgbm93LCBleGNlcHQgcGVyaGFwcyBmb3IKICAgICAgICAgICAgIyBfX3B5Y2FjaGVfXyBzdWJkaXJzCiAgICAgICAgICAgICMgcmV2ZXJzZSBzbyB0aGF0IHN1YmRpcnMgYXBwZWFyIGJlZm9yZSB0aGVpciBwYXJlbnRzCiAgICAgICAgICAgIGRpcnMgPSBzb3J0ZWQoc2VsZi5kaXJzX2NyZWF0ZWQsIHJldmVyc2U9VHJ1ZSkKICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgIGZsaXN0ID0gb3MubGlzdGRpcihkKQogICAgICAgICAgICAgICAgaWYgZmxpc3Q6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZsaXN0ID09IFsnX19weWNhY2hlX18nXQogICAgICAgICAgICAgICAgICAgIHNkID0gb3MucGF0aC5qb2luKGQsIGZsaXN0WzBdKQogICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKHNkKQogICAgICAgICAgICAgICAgb3Mucm1kaXIoZCkgICAgICMgc2hvdWxkIGZhaWwgaWYgbm9uLWVtcHR5CiAgICAgICAgc2VsZi5faW5pdF9yZWNvcmQoKQoKZGVmIHJlc29sdmUobW9kdWxlX25hbWUsIGRvdHRlZF9wYXRoKToKICAgIGlmIG1vZHVsZV9uYW1lIGluIHN5cy5tb2R1bGVzOgogICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXQogICAgZWxzZToKICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKG1vZHVsZV9uYW1lKQogICAgaWYgZG90dGVkX3BhdGggaXMgTm9uZToKICAgICAgICByZXN1bHQgPSBtb2QKICAgIGVsc2U6CiAgICAgICAgcGFydHMgPSBkb3R0ZWRfcGF0aC5zcGxpdCgnLicpCiAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihtb2QsIHBhcnRzLnBvcCgwKSkKICAgICAgICBmb3IgcCBpbiBwYXJ0czoKICAgICAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihyZXN1bHQsIHApCiAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgRXhwb3J0RW50cnkob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIHN1ZmZpeCwgZmxhZ3MpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAogICAgICAgIHNlbGYuc3VmZml4ID0gc3VmZml4CiAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIHZhbHVlKHNlbGYpOgogICAgICAgIHJldHVybiByZXNvbHZlKHNlbGYucHJlZml4LCBzZWxmLnN1ZmZpeCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICByZXR1cm4gJzxFeHBvcnRFbnRyeSAlcyA9ICVzOiVzICVzPicgJSAoc2VsZi5uYW1lLCBzZWxmLnByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWZmaXgsIHNlbGYuZmxhZ3MpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEV4cG9ydEVudHJ5KToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSAoc2VsZi5uYW1lID09IG90aGVyLm5hbWUgYW5kCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByZWZpeCA9PSBvdGhlci5wcmVmaXggYW5kCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN1ZmZpeCA9PSBvdGhlci5zdWZmaXggYW5kCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZsYWdzID09IG90aGVyLmZsYWdzKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBfX2hhc2hfXyA9IG9iamVjdC5fX2hhc2hfXwoKCkVOVFJZX1JFID0gcmUuY29tcGlsZShyJycnKD9QPG5hbWU+KFx3fFstLitdKSspCiAgICAgICAgICAgICAgICAgICAgICBccyo9XHMqKD9QPGNhbGxhYmxlPihcdyspKFs6XC5dXHcrKSopCiAgICAgICAgICAgICAgICAgICAgICBccyooXFtccyooP1A8ZmxhZ3M+XHcrKD1cdyspPygsXHMqXHcrKD1cdyspPykqKVxzKlxdKT8KICAgICAgICAgICAgICAgICAgICAgICcnJywgcmUuVkVSQk9TRSkKCmRlZiBnZXRfZXhwb3J0X2VudHJ5KHNwZWNpZmljYXRpb24pOgogICAgbSA9IEVOVFJZX1JFLnNlYXJjaChzcGVjaWZpY2F0aW9uKQogICAgaWYgbm90IG06CiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGlmICdbJyBpbiBzcGVjaWZpY2F0aW9uIG9yICddJyBpbiBzcGVjaWZpY2F0aW9uOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCJJbnZhbGlkIHNwZWNpZmljYXRpb24gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIiAlIHNwZWNpZmljYXRpb24pCiAgICBlbHNlOgogICAgICAgIGQgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgbmFtZSA9IGRbJ25hbWUnXQogICAgICAgIHBhdGggPSBkWydjYWxsYWJsZSddCiAgICAgICAgY29sb25zID0gcGF0aC5jb3VudCgnOicpCiAgICAgICAgaWYgY29sb25zID09IDA6CiAgICAgICAgICAgIHByZWZpeCwgc3VmZml4ID0gcGF0aCwgTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGNvbG9ucyAhPSAxOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigiSW52YWxpZCBzcGVjaWZpY2F0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcyciICUgc3BlY2lmaWNhdGlvbikKICAgICAgICAgICAgcHJlZml4LCBzdWZmaXggPSBwYXRoLnNwbGl0KCc6JykKICAgICAgICBmbGFncyA9IGRbJ2ZsYWdzJ10KICAgICAgICBpZiBmbGFncyBpcyBOb25lOgogICAgICAgICAgICBpZiAnWycgaW4gc3BlY2lmaWNhdGlvbiBvciAnXScgaW4gc3BlY2lmaWNhdGlvbjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oIkludmFsaWQgc3BlY2lmaWNhdGlvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIiAlIHNwZWNpZmljYXRpb24pCiAgICAgICAgICAgIGZsYWdzID0gW10KICAgICAgICBlbHNlOgogICAgICAgICAgICBmbGFncyA9IFtmLnN0cmlwKCkgZm9yIGYgaW4gZmxhZ3Muc3BsaXQoJywnKV0KICAgICAgICByZXN1bHQgPSBFeHBvcnRFbnRyeShuYW1lLCBwcmVmaXgsIHN1ZmZpeCwgZmxhZ3MpCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIGdldF9jYWNoZV9iYXNlKHN1ZmZpeD1Ob25lKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBkZWZhdWx0IGJhc2UgbG9jYXRpb24gZm9yIGRpc3RsaWIgY2FjaGVzLiBJZiB0aGUgZGlyZWN0b3J5IGRvZXMKICAgIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4gVXNlIHRoZSBzdWZmaXggcHJvdmlkZWQgZm9yIHRoZSBiYXNlIGRpcmVjdG9yeSwKICAgIGFuZCBkZWZhdWx0IHRvICcuZGlzdGxpYicgaWYgaXQgaXNuJ3QgcHJvdmlkZWQuCgogICAgT24gV2luZG93cywgaWYgTE9DQUxBUFBEQVRBIGlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LCB0aGVuIGl0IGlzCiAgICBhc3N1bWVkIHRvIGJlIGEgZGlyZWN0b3J5LCBhbmQgd2lsbCBiZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0LgogICAgT24gUE9TSVgsIGFuZCBvbiBXaW5kb3dzIGlmIExPQ0FMQVBQREFUQSBpcyBub3QgZGVmaW5lZCwgdGhlIHVzZXIncyBob21lCiAgICBkaXJlY3RvcnkgLSB1c2luZyBvcy5leHBhbmR1c2VyKCd+JykgLSB3aWxsIGJlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mCiAgICB0aGUgcmVzdWx0LgoKICAgIFRoZSByZXN1bHQgaXMganVzdCB0aGUgZGlyZWN0b3J5ICcuZGlzdGxpYicgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkgYXMKICAgIGRldGVybWluZWQgYWJvdmUsIG9yIHdpdGggdGhlIG5hbWUgc3BlY2lmaWVkIHdpdGggYGBzdWZmaXhgYC4KICAgICIiIgogICAgaWYgc3VmZml4IGlzIE5vbmU6CiAgICAgICAgc3VmZml4ID0gJy5kaXN0bGliJwogICAgaWYgb3MubmFtZSA9PSAnbnQnIGFuZCAnTE9DQUxBUFBEQVRBJyBpbiBvcy5lbnZpcm9uOgogICAgICAgIHJlc3VsdCA9IG9zLnBhdGguZXhwYW5kdmFycygnJGxvY2FsYXBwZGF0YScpCiAgICBlbHNlOgogICAgICAgICMgQXNzdW1lIHBvc2l4LCBvciBvbGQgV2luZG93cwogICAgICAgIHJlc3VsdCA9IG9zLnBhdGguZXhwYW5kdXNlcignficpCiAgICAjIHdlIHVzZSAnaXNkaXInIGluc3RlYWQgb2YgJ2V4aXN0cycsIGJlY2F1c2Ugd2Ugd2FudCB0bwogICAgIyBmYWlsIGlmIHRoZXJlJ3MgYSBmaWxlIHdpdGggdGhhdCBuYW1lCiAgICBpZiBvcy5wYXRoLmlzZGlyKHJlc3VsdCk6CiAgICAgICAgdXNhYmxlID0gb3MuYWNjZXNzKHJlc3VsdCwgb3MuV19PSykKICAgICAgICBpZiBub3QgdXNhYmxlOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnRGlyZWN0b3J5IGV4aXN0cyBidXQgaXMgbm90IHdyaXRhYmxlOiAlcycsIHJlc3VsdCkKICAgIGVsc2U6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy5tYWtlZGlycyhyZXN1bHQpCiAgICAgICAgICAgIHVzYWJsZSA9IFRydWUKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ1VuYWJsZSB0byBjcmVhdGUgJXMnLCByZXN1bHQsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgIHVzYWJsZSA9IEZhbHNlCiAgICBpZiBub3QgdXNhYmxlOgogICAgICAgIHJlc3VsdCA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgIGxvZ2dlci53YXJuaW5nKCdEZWZhdWx0IGxvY2F0aW9uIHVudXNhYmxlLCB1c2luZyAlcycsIHJlc3VsdCkKICAgIHJldHVybiBvcy5wYXRoLmpvaW4ocmVzdWx0LCBzdWZmaXgpCgoKZGVmIHBhdGhfdG9fY2FjaGVfZGlyKHBhdGgpOgogICAgIiIiCiAgICBDb252ZXJ0IGFuIGFic29sdXRlIHBhdGggdG8gYSBkaXJlY3RvcnkgbmFtZSBmb3IgdXNlIGluIGEgY2FjaGUuCgogICAgVGhlIGFsZ29yaXRobSB1c2VkIGlzOgoKICAgICMuIE9uIFdpbmRvd3MsIGFueSBgYCc6J2BgIGluIHRoZSBkcml2ZSBpcyByZXBsYWNlZCB3aXRoIGBgJy0tLSdgYC4KICAgICMuIEFueSBvY2N1cnJlbmNlIG9mIGBgb3Muc2VwYGAgaXMgcmVwbGFjZWQgd2l0aCBgYCctLSdgYC4KICAgICMuIGBgJy5jYWNoZSdgYCBpcyBhcHBlbmRlZC4KICAgICIiIgogICAgZCwgcCA9IG9zLnBhdGguc3BsaXRkcml2ZShvcy5wYXRoLmFic3BhdGgocGF0aCkpCiAgICBpZiBkOgogICAgICAgIGQgPSBkLnJlcGxhY2UoJzonLCAnLS0tJykKICAgIHAgPSBwLnJlcGxhY2Uob3Muc2VwLCAnLS0nKQogICAgcmV0dXJuIGQgKyBwICsgJy5jYWNoZScKCgpkZWYgZW5zdXJlX3NsYXNoKHMpOgogICAgaWYgbm90IHMuZW5kc3dpdGgoJy8nKToKICAgICAgICByZXR1cm4gcyArICcvJwogICAgcmV0dXJuIHMKCgpkZWYgcGFyc2VfY3JlZGVudGlhbHMobmV0bG9jKToKICAgIHVzZXJuYW1lID0gcGFzc3dvcmQgPSBOb25lCiAgICBpZiAnQCcgaW4gbmV0bG9jOgogICAgICAgIHByZWZpeCwgbmV0bG9jID0gbmV0bG9jLnNwbGl0KCdAJywgMSkKICAgICAgICBpZiAnOicgbm90IGluIHByZWZpeDoKICAgICAgICAgICAgdXNlcm5hbWUgPSBwcmVmaXgKICAgICAgICBlbHNlOgogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBwcmVmaXguc3BsaXQoJzonLCAxKQogICAgcmV0dXJuIHVzZXJuYW1lLCBwYXNzd29yZCwgbmV0bG9jCgoKZGVmIGdldF9wcm9jZXNzX3VtYXNrKCk6CiAgICByZXN1bHQgPSBvcy51bWFzaygwbzIyKQogICAgb3MudW1hc2socmVzdWx0KQogICAgcmV0dXJuIHJlc3VsdAoKZGVmIGlzX3N0cmluZ19zZXF1ZW5jZShzZXEpOgogICAgcmVzdWx0ID0gVHJ1ZQogICAgaSA9IE5vbmUKICAgIGZvciBpLCBzIGluIGVudW1lcmF0ZShzZXEpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICBhc3NlcnQgaSBpcyBub3QgTm9uZQogICAgcmV0dXJuIHJlc3VsdAoKUFJPSkVDVF9OQU1FX0FORF9WRVJTSU9OID0gcmUuY29tcGlsZSgnKFthLXowLTlfXSsoWy4tXVthLXpfXVthLXowLTlfXSopKiktJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoW2EtejAtOV8uKy1dKyknLCByZS5JKQpQWVRIT05fVkVSU0lPTiA9IHJlLmNvbXBpbGUocictcHkoXGRcLj9cZD8pJykKCgpkZWYgc3BsaXRfZmlsZW5hbWUoZmlsZW5hbWUsIHByb2plY3RfbmFtZT1Ob25lKToKICAgICIiIgogICAgRXh0cmFjdCBuYW1lLCB2ZXJzaW9uLCBweXRob24gdmVyc2lvbiBmcm9tIGEgZmlsZW5hbWUgKG5vIGV4dGVuc2lvbikKCiAgICBSZXR1cm4gbmFtZSwgdmVyc2lvbiwgcHl2ZXIgb3IgTm9uZQogICAgIiIiCiAgICByZXN1bHQgPSBOb25lCiAgICBweXZlciA9IE5vbmUKICAgIGZpbGVuYW1lID0gdW5xdW90ZShmaWxlbmFtZSkucmVwbGFjZSgnICcsICctJykKICAgIG0gPSBQWVRIT05fVkVSU0lPTi5zZWFyY2goZmlsZW5hbWUpCiAgICBpZiBtOgogICAgICAgIHB5dmVyID0gbS5ncm91cCgxKQogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOm0uc3RhcnQoKV0KICAgIGlmIHByb2plY3RfbmFtZSBhbmQgbGVuKGZpbGVuYW1lKSA+IGxlbihwcm9qZWN0X25hbWUpICsgMToKICAgICAgICBtID0gcmUubWF0Y2gocmUuZXNjYXBlKHByb2plY3RfbmFtZSkgKyByJ1xiJywgZmlsZW5hbWUpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgbiA9IG0uZW5kKCkKICAgICAgICAgICAgcmVzdWx0ID0gZmlsZW5hbWVbOm5dLCBmaWxlbmFtZVtuICsgMTpdLCBweXZlcgogICAgaWYgcmVzdWx0IGlzIE5vbmU6CiAgICAgICAgbSA9IFBST0pFQ1RfTkFNRV9BTkRfVkVSU0lPTi5tYXRjaChmaWxlbmFtZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICByZXN1bHQgPSBtLmdyb3VwKDEpLCBtLmdyb3VwKDMpLCBweXZlcgogICAgcmV0dXJuIHJlc3VsdAoKIyBBbGxvdyBzcGFjZXMgaW4gbmFtZSBiZWNhdXNlIG9mIGxlZ2FjeSBkaXN0cyBsaWtlICJUd2lzdGVkIENvcmUiCk5BTUVfVkVSU0lPTl9SRSA9IHJlLmNvbXBpbGUocicoP1A8bmFtZT5bXHcgLi1dKylccyonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidcKFxzKig/UDx2ZXI+W15ccyldKylcKSQnKQoKZGVmIHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCk6CiAgICAiIiIKICAgIEEgdXRpbGl0eSBtZXRob2QgdXNlZCB0byBnZXQgbmFtZSBhbmQgdmVyc2lvbiBmcm9tIGEgc3RyaW5nLgoKICAgIEZyb20gZS5nLiBhIFByb3ZpZGVzLURpc3QgdmFsdWUuCgogICAgOnBhcmFtIHA6IEEgdmFsdWUgaW4gYSBmb3JtICdmb28gKDEuMCknCiAgICA6cmV0dXJuOiBUaGUgbmFtZSBhbmQgdmVyc2lvbiBhcyBhIHR1cGxlLgogICAgIiIiCiAgICBtID0gTkFNRV9WRVJTSU9OX1JFLm1hdGNoKHApCiAgICBpZiBub3QgbToKICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdJbGwtZm9ybWVkIG5hbWUvdmVyc2lvbiBzdHJpbmc6IFwnJXNcJycgJSBwKQogICAgZCA9IG0uZ3JvdXBkaWN0KCkKICAgIHJldHVybiBkWyduYW1lJ10uc3RyaXAoKS5sb3dlcigpLCBkWyd2ZXInXQoKZGVmIGdldF9leHRyYXMocmVxdWVzdGVkLCBhdmFpbGFibGUpOgogICAgcmVzdWx0ID0gc2V0KCkKICAgIHJlcXVlc3RlZCA9IHNldChyZXF1ZXN0ZWQgb3IgW10pCiAgICBhdmFpbGFibGUgPSBzZXQoYXZhaWxhYmxlIG9yIFtdKQogICAgaWYgJyonIGluIHJlcXVlc3RlZDoKICAgICAgICByZXF1ZXN0ZWQucmVtb3ZlKCcqJykKICAgICAgICByZXN1bHQgfD0gYXZhaWxhYmxlCiAgICBmb3IgciBpbiByZXF1ZXN0ZWQ6CiAgICAgICAgaWYgciA9PSAnLSc6CiAgICAgICAgICAgIHJlc3VsdC5hZGQocikKICAgICAgICBlbGlmIHIuc3RhcnRzd2l0aCgnLScpOgogICAgICAgICAgICB1bndhbnRlZCA9IHJbMTpdCiAgICAgICAgICAgIGlmIHVud2FudGVkIG5vdCBpbiBhdmFpbGFibGU6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygndW5kZWNsYXJlZCBleHRyYTogJXMnICUgdW53YW50ZWQpCiAgICAgICAgICAgIGlmIHVud2FudGVkIGluIHJlc3VsdDoKICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmUodW53YW50ZWQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgciBub3QgaW4gYXZhaWxhYmxlOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ3VuZGVjbGFyZWQgZXh0cmE6ICVzJyAlIHIpCiAgICAgICAgICAgIHJlc3VsdC5hZGQocikKICAgIHJldHVybiByZXN1bHQKIwojIEV4dGVuZGVkIG1ldGFkYXRhIGZ1bmN0aW9uYWxpdHkKIwoKZGVmIF9nZXRfZXh0ZXJuYWxfZGF0YSh1cmwpOgogICAgcmVzdWx0ID0ge30KICAgIHRyeToKICAgICAgICAjIHVybG9wZW4gbWlnaHQgZmFpbCBpZiBpdCBydW5zIGludG8gcmVkaXJlY3Rpb25zLAogICAgICAgICMgYmVjYXVzZSBvZiBQeXRob24gaXNzdWUgIzEzNjk2LiBGaXhlZCBpbiBsb2NhdG9ycwogICAgICAgICMgdXNpbmcgYSBjdXN0b20gcmVkaXJlY3QgaGFuZGxlci4KICAgICAgICByZXNwID0gdXJsb3Blbih1cmwpCiAgICAgICAgaGVhZGVycyA9IHJlc3AuaW5mbygpCiAgICAgICAgY3QgPSBoZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykKICAgICAgICBpZiBub3QgY3Quc3RhcnRzd2l0aCgnYXBwbGljYXRpb24vanNvbicpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1VuZXhwZWN0ZWQgcmVzcG9uc2UgZm9yIEpTT04gcmVxdWVzdDogJXMnLCBjdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpKHJlc3ApCiAgICAgICAgICAgICNkYXRhID0gcmVhZGVyLnJlYWQoKS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgI3Jlc3VsdCA9IGpzb24ubG9hZHMoZGF0YSkKICAgICAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkKHJlYWRlcikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdGYWlsZWQgdG8gZ2V0IGV4dGVybmFsIGRhdGEgZm9yICVzOiAlcycsIHVybCwgZSkKICAgIHJldHVybiByZXN1bHQKCl9leHRlcm5hbF9kYXRhX2Jhc2VfdXJsID0gJ2h0dHBzOi8vd3d3LnJlZC1kb3ZlLmNvbS9weXBpL3Byb2plY3RzLycKCmRlZiBnZXRfcHJvamVjdF9kYXRhKG5hbWUpOgogICAgdXJsID0gJyVzLyVzL3Byb2plY3QuanNvbicgJSAobmFtZVswXS51cHBlcigpLCBuYW1lKQogICAgdXJsID0gdXJsam9pbihfZXh0ZXJuYWxfZGF0YV9iYXNlX3VybCwgdXJsKQogICAgcmVzdWx0ID0gX2dldF9leHRlcm5hbF9kYXRhKHVybCkKICAgIHJldHVybiByZXN1bHQKCmRlZiBnZXRfcGFja2FnZV9kYXRhKG5hbWUsIHZlcnNpb24pOgogICAgdXJsID0gJyVzLyVzL3BhY2thZ2UtJXMuanNvbicgJSAobmFtZVswXS51cHBlcigpLCBuYW1lLCB2ZXJzaW9uKQogICAgdXJsID0gdXJsam9pbihfZXh0ZXJuYWxfZGF0YV9iYXNlX3VybCwgdXJsKQogICAgcmV0dXJuIF9nZXRfZXh0ZXJuYWxfZGF0YSh1cmwpCgoKY2xhc3MgQ2FjaGUob2JqZWN0KToKICAgICIiIgogICAgQSBjbGFzcyBpbXBsZW1lbnRpbmcgYSBjYWNoZSBmb3IgcmVzb3VyY2VzIHRoYXQgbmVlZCB0byBsaXZlIGluIHRoZSBmaWxlIHN5c3RlbQogICAgZS5nLiBzaGFyZWQgbGlicmFyaWVzLiBUaGlzIGNsYXNzIHdhcyBtb3ZlZCBmcm9tIHJlc291cmNlcyB0byBoZXJlIGJlY2F1c2UgaXQKICAgIGNvdWxkIGJlIHVzZWQgYnkgb3RoZXIgbW9kdWxlcywgZS5nLiB0aGUgd2hlZWwgbW9kdWxlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2UpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBiYXNlOiBUaGUgYmFzZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNhY2hlIHNob3VsZCBiZSBsb2NhdGVkLgogICAgICAgICIiIgogICAgICAgICMgd2UgdXNlICdpc2RpcicgaW5zdGVhZCBvZiAnZXhpc3RzJywgYmVjYXVzZSB3ZSB3YW50IHRvCiAgICAgICAgIyBmYWlsIGlmIHRoZXJlJ3MgYSBmaWxlIHdpdGggdGhhdCBuYW1lCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoYmFzZSk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgb3MubWFrZWRpcnMoYmFzZSkKICAgICAgICBpZiAob3Muc3RhdChiYXNlKS5zdF9tb2RlICYgMG83NykgIT0gMDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RpcmVjdG9yeSBcJyVzXCcgaXMgbm90IHByaXZhdGUnLCBiYXNlKQogICAgICAgIHNlbGYuYmFzZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKGJhc2UpKQoKICAgIGRlZiBwcmVmaXhfdG9fZGlyKHNlbGYsIHByZWZpeCk6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydHMgYSByZXNvdXJjZSBwcmVmaXggdG8gYSBkaXJlY3RvcnkgbmFtZSBpbiB0aGUgY2FjaGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHBhdGhfdG9fY2FjaGVfZGlyKHByZWZpeCkKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYXIgdGhlIGNhY2hlLgogICAgICAgICIiIgogICAgICAgIG5vdF9yZW1vdmVkID0gW10KICAgICAgICBmb3IgZm4gaW4gb3MubGlzdGRpcihzZWxmLmJhc2UpOgogICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihzZWxmLmJhc2UsIGZuKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhmbikgb3Igb3MucGF0aC5pc2ZpbGUoZm4pOgogICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShmbikKICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2Rpcihmbik6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShmbikKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIG5vdF9yZW1vdmVkLmFwcGVuZChmbikKICAgICAgICByZXR1cm4gbm90X3JlbW92ZWQKCgpjbGFzcyBFdmVudE1peGluKG9iamVjdCk6CiAgICAiIiIKICAgIEEgdmVyeSBzaW1wbGUgcHVibGlzaC9zdWJzY3JpYmUgc3lzdGVtLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fc3Vic2NyaWJlcnMgPSB7fQoKICAgIGRlZiBhZGQoc2VsZiwgZXZlbnQsIHN1YnNjcmliZXIsIGFwcGVuZD1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBzdWJzY3JpYmVyIGZvciBhbiBldmVudC4KCiAgICAgICAgOnBhcmFtIGV2ZW50OiBUaGUgbmFtZSBvZiBhbiBldmVudC4KICAgICAgICA6cGFyYW0gc3Vic2NyaWJlcjogVGhlIHN1YnNjcmliZXIgdG8gYmUgYWRkZWQgKGFuZCBjYWxsZWQgd2hlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaXMgcHVibGlzaGVkKS4KICAgICAgICA6cGFyYW0gYXBwZW5kOiBXaGV0aGVyIHRvIGFwcGVuZCBvciBwcmVwZW5kIHRoZSBzdWJzY3JpYmVyIHRvIGFuCiAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcgc3Vic2NyaWJlciBsaXN0IGZvciB0aGUgZXZlbnQuCiAgICAgICAgIiIiCiAgICAgICAgc3VicyA9IHNlbGYuX3N1YnNjcmliZXJzCiAgICAgICAgaWYgZXZlbnQgbm90IGluIHN1YnM6CiAgICAgICAgICAgIHN1YnNbZXZlbnRdID0gZGVxdWUoW3N1YnNjcmliZXJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNxID0gc3Vic1tldmVudF0KICAgICAgICAgICAgaWYgYXBwZW5kOgogICAgICAgICAgICAgICAgc3EuYXBwZW5kKHN1YnNjcmliZXIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzcS5hcHBlbmRsZWZ0KHN1YnNjcmliZXIpCgogICAgZGVmIHJlbW92ZShzZWxmLCBldmVudCwgc3Vic2NyaWJlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGEgc3Vic2NyaWJlciBmb3IgYW4gZXZlbnQuCgogICAgICAgIDpwYXJhbSBldmVudDogVGhlIG5hbWUgb2YgYW4gZXZlbnQuCiAgICAgICAgOnBhcmFtIHN1YnNjcmliZXI6IFRoZSBzdWJzY3JpYmVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICAgIiIiCiAgICAgICAgc3VicyA9IHNlbGYuX3N1YnNjcmliZXJzCiAgICAgICAgaWYgZXZlbnQgbm90IGluIHN1YnM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05vIHN1YnNjcmliZXJzOiAlcicgJSBldmVudCkKICAgICAgICBzdWJzW2V2ZW50XS5yZW1vdmUoc3Vic2NyaWJlcikKCiAgICBkZWYgZ2V0X3N1YnNjcmliZXJzKHNlbGYsIGV2ZW50KToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHRoZSBzdWJzY3JpYmVycyBmb3IgYW4gZXZlbnQuCiAgICAgICAgOnBhcmFtIGV2ZW50OiBUaGUgZXZlbnQgdG8gcmV0dXJuIHN1YnNjcmliZXJzIGZvci4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9zdWJzY3JpYmVycy5nZXQoZXZlbnQsICgpKSkKCiAgICBkZWYgcHVibGlzaChzZWxmLCBldmVudCwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBQdWJsaXNoIGEgZXZlbnQgYW5kIHJldHVybiBhIGxpc3Qgb2YgdmFsdWVzIHJldHVybmVkIGJ5IGl0cwogICAgICAgIHN1YnNjcmliZXJzLgoKICAgICAgICA6cGFyYW0gZXZlbnQ6IFRoZSBldmVudCB0byBwdWJsaXNoLgogICAgICAgIDpwYXJhbSBhcmdzOiBUaGUgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZXZlbnQncwogICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVycy4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBUaGUga2V5d29yZCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZXZlbnQncwogICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJzLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgZm9yIHN1YnNjcmliZXIgaW4gc2VsZi5nZXRfc3Vic2NyaWJlcnMoZXZlbnQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHN1YnNjcmliZXIoZXZlbnQsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0V4Y2VwdGlvbiBkdXJpbmcgZXZlbnQgcHVibGljYXRpb24nKQogICAgICAgICAgICAgICAgdmFsdWUgPSBOb25lCiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodmFsdWUpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdwdWJsaXNoICVzOiBhcmdzID0gJXMsIGt3YXJncyA9ICVzLCByZXN1bHQgPSAlcycsCiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCBhcmdzLCBrd2FyZ3MsIHJlc3VsdCkKICAgICAgICByZXR1cm4gcmVzdWx0CgojCiMgU2ltcGxlIHNlcXVlbmNpbmcKIwpjbGFzcyBTZXF1ZW5jZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9wcmVkcyA9IHt9CiAgICAgICAgc2VsZi5fc3VjY3MgPSB7fQogICAgICAgIHNlbGYuX25vZGVzID0gc2V0KCkgICAgICMgbm9kZXMgd2l0aCBubyBwcmVkcy9zdWNjcwoKICAgIGRlZiBhZGRfbm9kZShzZWxmLCBub2RlKToKICAgICAgICBzZWxmLl9ub2Rlcy5hZGQobm9kZSkKCiAgICBkZWYgcmVtb3ZlX25vZGUoc2VsZiwgbm9kZSwgZWRnZXM9RmFsc2UpOgogICAgICAgIGlmIG5vZGUgaW4gc2VsZi5fbm9kZXM6CiAgICAgICAgICAgIHNlbGYuX25vZGVzLnJlbW92ZShub2RlKQogICAgICAgIGlmIGVkZ2VzOgogICAgICAgICAgICBmb3IgcCBpbiBzZXQoc2VsZi5fcHJlZHMuZ2V0KG5vZGUsICgpKSk6CiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZShwLCBub2RlKQogICAgICAgICAgICBmb3IgcyBpbiBzZXQoc2VsZi5fc3VjY3MuZ2V0KG5vZGUsICgpKSk6CiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZShub2RlLCBzKQogICAgICAgICAgICAjIFJlbW92ZSBlbXB0aWVzCiAgICAgICAgICAgIGZvciBrLCB2IGluIGxpc3Qoc2VsZi5fcHJlZHMuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICBpZiBub3QgdjoKICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5fcHJlZHNba10KICAgICAgICAgICAgZm9yIGssIHYgaW4gbGlzdChzZWxmLl9zdWNjcy5pdGVtcygpKToKICAgICAgICAgICAgICAgIGlmIG5vdCB2OgogICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9zdWNjc1trXQoKICAgIGRlZiBhZGQoc2VsZiwgcHJlZCwgc3VjYyk6CiAgICAgICAgYXNzZXJ0IHByZWQgIT0gc3VjYwogICAgICAgIHNlbGYuX3ByZWRzLnNldGRlZmF1bHQoc3VjYywgc2V0KCkpLmFkZChwcmVkKQogICAgICAgIHNlbGYuX3N1Y2NzLnNldGRlZmF1bHQocHJlZCwgc2V0KCkpLmFkZChzdWNjKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgcHJlZCwgc3VjYyk6CiAgICAgICAgYXNzZXJ0IHByZWQgIT0gc3VjYwogICAgICAgIHRyeToKICAgICAgICAgICAgcHJlZHMgPSBzZWxmLl9wcmVkc1tzdWNjXQogICAgICAgICAgICBzdWNjcyA9IHNlbGYuX3N1Y2NzW3ByZWRdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVyIG5vdCBhIHN1Y2Nlc3NvciBvZiBhbnl0aGluZycgJSBzdWNjKQogICAgICAgIHRyeToKICAgICAgICAgICAgcHJlZHMucmVtb3ZlKHByZWQpCiAgICAgICAgICAgIHN1Y2NzLnJlbW92ZShzdWNjKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclciBub3QgYSBzdWNjZXNzb3Igb2YgJXInICUgKHN1Y2MsIHByZWQpKQoKICAgIGRlZiBpc19zdGVwKHNlbGYsIHN0ZXApOgogICAgICAgIHJldHVybiAoc3RlcCBpbiBzZWxmLl9wcmVkcyBvciBzdGVwIGluIHNlbGYuX3N1Y2NzIG9yCiAgICAgICAgICAgICAgICBzdGVwIGluIHNlbGYuX25vZGVzKQoKICAgIGRlZiBnZXRfc3RlcHMoc2VsZiwgZmluYWwpOgogICAgICAgIGlmIG5vdCBzZWxmLmlzX3N0ZXAoZmluYWwpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duOiAlcicgJSBmaW5hbCkKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHRvZG8gPSBbXQogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIHRvZG8uYXBwZW5kKGZpbmFsKQogICAgICAgIHdoaWxlIHRvZG86CiAgICAgICAgICAgIHN0ZXAgPSB0b2RvLnBvcCgwKQogICAgICAgICAgICBpZiBzdGVwIGluIHNlZW46CiAgICAgICAgICAgICAgICAjIGlmIGEgc3RlcCB3YXMgYWxyZWFkeSBzZWVuLAogICAgICAgICAgICAgICAgIyBtb3ZlIGl0IHRvIHRoZSBlbmQgKHNvIGl0IHdpbGwgYXBwZWFyIGVhcmxpZXIKICAgICAgICAgICAgICAgICMgd2hlbiByZXZlcnNlZCBvbiByZXR1cm4pIC4uLiBidXQgbm90IGZvciB0aGUKICAgICAgICAgICAgICAgICMgZmluYWwgc3RlcCwgYXMgdGhhdCB3b3VsZCBiZSBjb25mdXNpbmcgZm9yCiAgICAgICAgICAgICAgICAjIHVzZXJzCiAgICAgICAgICAgICAgICBpZiBzdGVwICE9IGZpbmFsOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmUoc3RlcCkKICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHN0ZXApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWVuLmFkZChzdGVwKQogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzdGVwKQogICAgICAgICAgICAgICAgcHJlZHMgPSBzZWxmLl9wcmVkcy5nZXQoc3RlcCwgKCkpCiAgICAgICAgICAgICAgICB0b2RvLmV4dGVuZChwcmVkcykKICAgICAgICByZXR1cm4gcmV2ZXJzZWQocmVzdWx0KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN0cm9uZ19jb25uZWN0aW9ucyhzZWxmKToKICAgICAgICAjaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UYXJqYW4lMjdzX3N0cm9uZ2x5X2Nvbm5lY3RlZF9jb21wb25lbnRzX2FsZ29yaXRobQogICAgICAgIGluZGV4X2NvdW50ZXIgPSBbMF0KICAgICAgICBzdGFjayA9IFtdCiAgICAgICAgbG93bGlua3MgPSB7fQogICAgICAgIGluZGV4ID0ge30KICAgICAgICByZXN1bHQgPSBbXQoKICAgICAgICBncmFwaCA9IHNlbGYuX3N1Y2NzCgogICAgICAgIGRlZiBzdHJvbmdjb25uZWN0KG5vZGUpOgogICAgICAgICAgICAjIHNldCB0aGUgZGVwdGggaW5kZXggZm9yIHRoaXMgbm9kZSB0byB0aGUgc21hbGxlc3QgdW51c2VkIGluZGV4CiAgICAgICAgICAgIGluZGV4W25vZGVdID0gaW5kZXhfY291bnRlclswXQogICAgICAgICAgICBsb3dsaW5rc1tub2RlXSA9IGluZGV4X2NvdW50ZXJbMF0KICAgICAgICAgICAgaW5kZXhfY291bnRlclswXSArPSAxCiAgICAgICAgICAgIHN0YWNrLmFwcGVuZChub2RlKQoKICAgICAgICAgICAgIyBDb25zaWRlciBzdWNjZXNzb3JzCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHN1Y2Nlc3NvcnMgPSBncmFwaFtub2RlXQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgc3VjY2Vzc29ycyA9IFtdCiAgICAgICAgICAgIGZvciBzdWNjZXNzb3IgaW4gc3VjY2Vzc29yczoKICAgICAgICAgICAgICAgIGlmIHN1Y2Nlc3NvciBub3QgaW4gbG93bGlua3M6CiAgICAgICAgICAgICAgICAgICAgIyBTdWNjZXNzb3IgaGFzIG5vdCB5ZXQgYmVlbiB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgc3Ryb25nY29ubmVjdChzdWNjZXNzb3IpCiAgICAgICAgICAgICAgICAgICAgbG93bGlua3Nbbm9kZV0gPSBtaW4obG93bGlua3Nbbm9kZV0sbG93bGlua3Nbc3VjY2Vzc29yXSkKICAgICAgICAgICAgICAgIGVsaWYgc3VjY2Vzc29yIGluIHN0YWNrOgogICAgICAgICAgICAgICAgICAgICMgdGhlIHN1Y2Nlc3NvciBpcyBpbiB0aGUgc3RhY2sgYW5kIGhlbmNlIGluIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAgICAgIyBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50IChTQ0MpCiAgICAgICAgICAgICAgICAgICAgbG93bGlua3Nbbm9kZV0gPSBtaW4obG93bGlua3Nbbm9kZV0saW5kZXhbc3VjY2Vzc29yXSkKCiAgICAgICAgICAgICMgSWYgYG5vZGVgIGlzIGEgcm9vdCBub2RlLCBwb3AgdGhlIHN0YWNrIGFuZCBnZW5lcmF0ZSBhbiBTQ0MKICAgICAgICAgICAgaWYgbG93bGlua3Nbbm9kZV0gPT0gaW5kZXhbbm9kZV06CiAgICAgICAgICAgICAgICBjb25uZWN0ZWRfY29tcG9uZW50ID0gW10KCiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NvciA9IHN0YWNrLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkX2NvbXBvbmVudC5hcHBlbmQoc3VjY2Vzc29yKQogICAgICAgICAgICAgICAgICAgIGlmIHN1Y2Nlc3NvciA9PSBub2RlOiBicmVhawogICAgICAgICAgICAgICAgY29tcG9uZW50ID0gdHVwbGUoY29ubmVjdGVkX2NvbXBvbmVudCkKICAgICAgICAgICAgICAgICMgc3RvcmluZyB0aGUgcmVzdWx0CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGNvbXBvbmVudCkKCiAgICAgICAgZm9yIG5vZGUgaW4gZ3JhcGg6CiAgICAgICAgICAgIGlmIG5vZGUgbm90IGluIGxvd2xpbmtzOgogICAgICAgICAgICAgICAgc3Ryb25nY29ubmVjdChub2RlKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQHByb3BlcnR5CiAgICBkZWYgZG90KHNlbGYpOgogICAgICAgIHJlc3VsdCA9IFsnZGlncmFwaCBHIHsnXQogICAgICAgIGZvciBzdWNjIGluIHNlbGYuX3ByZWRzOgogICAgICAgICAgICBwcmVkcyA9IHNlbGYuX3ByZWRzW3N1Y2NdCiAgICAgICAgICAgIGZvciBwcmVkIGluIHByZWRzOgogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICAlcyAtPiAlczsnICUgKHByZWQsIHN1Y2MpKQogICAgICAgIGZvciBub2RlIGluIHNlbGYuX25vZGVzOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgICVzOycgJSBub2RlKQogICAgICAgIHJlc3VsdC5hcHBlbmQoJ30nKQogICAgICAgIHJldHVybiAnXG4nLmpvaW4ocmVzdWx0KQoKIwojIFVuYXJjaGl2aW5nIGZ1bmN0aW9uYWxpdHkgZm9yIHppcCwgdGFyLCB0Z3osIHRieiwgd2hsCiMKCkFSQ0hJVkVfRVhURU5TSU9OUyA9ICgnLnRhci5neicsICcudGFyLmJ6MicsICcudGFyJywgJy56aXAnLAogICAgICAgICAgICAgICAgICAgICAgJy50Z3onLCAnLnRieicsICcud2hsJykKCmRlZiB1bmFyY2hpdmUoYXJjaGl2ZV9maWxlbmFtZSwgZGVzdF9kaXIsIGZvcm1hdD1Ob25lLCBjaGVjaz1UcnVlKToKCiAgICBkZWYgY2hlY2tfcGF0aChwYXRoKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYXRoLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICBwYXRoID0gcGF0aC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBwID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihkZXN0X2RpciwgcGF0aCkpCiAgICAgICAgaWYgbm90IHAuc3RhcnRzd2l0aChkZXN0X2Rpcikgb3IgcFtwbGVuXSAhPSBvcy5zZXA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3BhdGggb3V0c2lkZSBkZXN0aW5hdGlvbjogJXInICUgcCkKCiAgICBkZXN0X2RpciA9IG9zLnBhdGguYWJzcGF0aChkZXN0X2RpcikKICAgIHBsZW4gPSBsZW4oZGVzdF9kaXIpCiAgICBhcmNoaXZlID0gTm9uZQogICAgaWYgZm9ybWF0IGlzIE5vbmU6CiAgICAgICAgaWYgYXJjaGl2ZV9maWxlbmFtZS5lbmRzd2l0aCgoJy56aXAnLCAnLndobCcpKToKICAgICAgICAgICAgZm9ybWF0ID0gJ3ppcCcKICAgICAgICBlbGlmIGFyY2hpdmVfZmlsZW5hbWUuZW5kc3dpdGgoKCcudGFyLmd6JywgJy50Z3onKSk6CiAgICAgICAgICAgIGZvcm1hdCA9ICd0Z3onCiAgICAgICAgICAgIG1vZGUgPSAncjpneicKICAgICAgICBlbGlmIGFyY2hpdmVfZmlsZW5hbWUuZW5kc3dpdGgoKCcudGFyLmJ6MicsICcudGJ6JykpOgogICAgICAgICAgICBmb3JtYXQgPSAndGJ6JwogICAgICAgICAgICBtb2RlID0gJ3I6YnoyJwogICAgICAgIGVsaWYgYXJjaGl2ZV9maWxlbmFtZS5lbmRzd2l0aCgnLnRhcicpOgogICAgICAgICAgICBmb3JtYXQgPSAndGFyJwogICAgICAgICAgICBtb2RlID0gJ3InCiAgICAgICAgZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duIGZvcm1hdCBmb3IgJXInICUgYXJjaGl2ZV9maWxlbmFtZSkKICAgIHRyeToKICAgICAgICBpZiBmb3JtYXQgPT0gJ3ppcCc6CiAgICAgICAgICAgIGFyY2hpdmUgPSBaaXBGaWxlKGFyY2hpdmVfZmlsZW5hbWUsICdyJykKICAgICAgICAgICAgaWYgY2hlY2s6CiAgICAgICAgICAgICAgICBuYW1lcyA9IGFyY2hpdmUubmFtZWxpc3QoKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgY2hlY2tfcGF0aChuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hpdmUgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9maWxlbmFtZSwgbW9kZSkKICAgICAgICAgICAgaWYgY2hlY2s6CiAgICAgICAgICAgICAgICBuYW1lcyA9IGFyY2hpdmUuZ2V0bmFtZXMoKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgY2hlY2tfcGF0aChuYW1lKQogICAgICAgIGlmIGZvcm1hdCAhPSAnemlwJyBhbmQgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgICAgICMgU2VlIFB5dGhvbiBpc3N1ZSAxNzE1My4gSWYgdGhlIGRlc3QgcGF0aCBjb250YWlucyBVbmljb2RlLAogICAgICAgICAgICAjIHRhcmZpbGUgZXh0cmFjdGlvbiBmYWlscyBvbiBQeXRob24gMi54IGlmIGEgbWVtYmVyIHBhdGggbmFtZQogICAgICAgICAgICAjIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIC0gaXQgbGVhZHMgdG8gYW4gaW1wbGljaXQKICAgICAgICAgICAgIyBieXRlcyAtPiB1bmljb2RlIGNvbnZlcnNpb24gdXNpbmcgQVNDSUkgdG8gZGVjb2RlLgogICAgICAgICAgICBmb3IgdGFyaW5mbyBpbiBhcmNoaXZlLmdldG1lbWJlcnMoKToKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRhcmluZm8ubmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLm5hbWUgPSB0YXJpbmZvLm5hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgYXJjaGl2ZS5leHRyYWN0YWxsKGRlc3RfZGlyKQoKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgYXJjaGl2ZToKICAgICAgICAgICAgYXJjaGl2ZS5jbG9zZSgpCgoKZGVmIHppcF9kaXIoZGlyZWN0b3J5KToKICAgICIiInppcCBhIGRpcmVjdG9yeSB0cmVlIGludG8gYSBCeXRlc0lPIG9iamVjdCIiIgogICAgcmVzdWx0ID0gaW8uQnl0ZXNJTygpCiAgICBkbGVuID0gbGVuKGRpcmVjdG9yeSkKICAgIHdpdGggWmlwRmlsZShyZXN1bHQsICJ3IikgYXMgemY6CiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoZGlyZWN0b3J5KToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBmdWxsID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCiAgICAgICAgICAgICAgICByZWwgPSByb290W2RsZW46XQogICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihyZWwsIG5hbWUpCiAgICAgICAgICAgICAgICB6Zi53cml0ZShmdWxsLCBkZXN0KQogICAgcmV0dXJuIHJlc3VsdAoKIwojIFNpbXBsZSBwcm9ncmVzcyBiYXIKIwoKVU5JVFMgPSAoJycsICdLJywgJ00nLCAnRycsJ1QnLCdQJykKCgpjbGFzcyBQcm9ncmVzcyhvYmplY3QpOgogICAgdW5rbm93biA9ICdVTktOT1dOJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtaW52YWw9MCwgbWF4dmFsPTEwMCk6CiAgICAgICAgYXNzZXJ0IG1heHZhbCBpcyBOb25lIG9yIG1heHZhbCA+PSBtaW52YWwKICAgICAgICBzZWxmLm1pbiA9IHNlbGYuY3VyID0gbWludmFsCiAgICAgICAgc2VsZi5tYXggPSBtYXh2YWwKICAgICAgICBzZWxmLnN0YXJ0ZWQgPSBOb25lCiAgICAgICAgc2VsZi5lbGFwc2VkID0gMAogICAgICAgIHNlbGYuZG9uZSA9IEZhbHNlCgogICAgZGVmIHVwZGF0ZShzZWxmLCBjdXJ2YWwpOgogICAgICAgIGFzc2VydCBzZWxmLm1pbiA8PSBjdXJ2YWwKICAgICAgICBhc3NlcnQgc2VsZi5tYXggaXMgTm9uZSBvciBjdXJ2YWwgPD0gc2VsZi5tYXgKICAgICAgICBzZWxmLmN1ciA9IGN1cnZhbAogICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgc2VsZi5zdGFydGVkIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RhcnRlZCA9IG5vdwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZWxhcHNlZCA9IG5vdyAtIHNlbGYuc3RhcnRlZAoKICAgIGRlZiBpbmNyZW1lbnQoc2VsZiwgaW5jcik6CiAgICAgICAgYXNzZXJ0IGluY3IgPj0gMAogICAgICAgIHNlbGYudXBkYXRlKHNlbGYuY3VyICsgaW5jcikKCiAgICBkZWYgc3RhcnQoc2VsZik6CiAgICAgICAgc2VsZi51cGRhdGUoc2VsZi5taW4pCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc3RvcChzZWxmKToKICAgICAgICBpZiBzZWxmLm1heCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi51cGRhdGUoc2VsZi5tYXgpCiAgICAgICAgc2VsZi5kb25lID0gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1heGltdW0oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudW5rbm93biBpZiBzZWxmLm1heCBpcyBOb25lIGVsc2Ugc2VsZi5tYXgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwZXJjZW50YWdlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZG9uZToKICAgICAgICAgICAgcmVzdWx0ID0gJzEwMCAlJwogICAgICAgIGVsaWYgc2VsZi5tYXggaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gJyA/PyAlJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHYgPSAxMDAuMCAqIChzZWxmLmN1ciAtIHNlbGYubWluKSAvIChzZWxmLm1heCAtIHNlbGYubWluKQogICAgICAgICAgICByZXN1bHQgPSAnJTNkICUlJyAlIHYKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGZvcm1hdF9kdXJhdGlvbihzZWxmLCBkdXJhdGlvbik6CiAgICAgICAgaWYgKGR1cmF0aW9uIDw9IDApIGFuZCBzZWxmLm1heCBpcyBOb25lIG9yIHNlbGYuY3VyID09IHNlbGYubWluOgogICAgICAgICAgICByZXN1bHQgPSAnPz86Pz86Pz8nCiAgICAgICAgI2VsaWYgZHVyYXRpb24gPCAxOgogICAgICAgICMgICAgcmVzdWx0ID0gJy0tOi0tOi0tJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHRpbWUuc3RyZnRpbWUoJyVIOiVNOiVTJywgdGltZS5nbXRpbWUoZHVyYXRpb24pKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBFVEEoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kb25lOgogICAgICAgICAgICBwcmVmaXggPSAnRG9uZScKICAgICAgICAgICAgdCA9IHNlbGYuZWxhcHNlZAogICAgICAgICAgICAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJlZml4ID0gJ0VUQSAnCiAgICAgICAgICAgIGlmIHNlbGYubWF4IGlzIE5vbmU6CiAgICAgICAgICAgICAgICB0ID0gLTEKICAgICAgICAgICAgZWxpZiBzZWxmLmVsYXBzZWQgPT0gMCBvciAoc2VsZi5jdXIgPT0gc2VsZi5taW4pOgogICAgICAgICAgICAgICAgdCA9IDAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICAgICAgICAgIHQgPSBmbG9hdChzZWxmLm1heCAtIHNlbGYubWluKQogICAgICAgICAgICAgICAgdCAvPSBzZWxmLmN1ciAtIHNlbGYubWluCiAgICAgICAgICAgICAgICB0ID0gKHQgLSAxKSAqIHNlbGYuZWxhcHNlZAogICAgICAgIHJldHVybiAnJXM6ICVzJyAlIChwcmVmaXgsIHNlbGYuZm9ybWF0X2R1cmF0aW9uKHQpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNwZWVkKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZWxhcHNlZCA9PSAwOgogICAgICAgICAgICByZXN1bHQgPSAwLjAKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSAoc2VsZi5jdXIgLSBzZWxmLm1pbikgLyBzZWxmLmVsYXBzZWQKICAgICAgICBmb3IgdW5pdCBpbiBVTklUUzoKICAgICAgICAgICAgaWYgcmVzdWx0IDwgMTAwMDoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHJlc3VsdCAvPSAxMDAwLjAKICAgICAgICByZXR1cm4gJyVkICVzQi9zJyAlIChyZXN1bHQsIHVuaXQpCgojCiMgR2xvYiBmdW5jdGlvbmFsaXR5CiMKClJJQ0hfR0xPQiA9IHJlLmNvbXBpbGUocidceyhbXn1dKilcfScpCl9DSEVDS19SRUNVUlNJVkVfR0xPQiA9IHJlLmNvbXBpbGUocidbXi9cXCx7XVwqXCp8XCpcKlteL1xcLH1dJykKX0NIRUNLX01JU01BVENIX1NFVCA9IHJlLmNvbXBpbGUocideW157XSpcfXxce1tefV0qJCcpCgoKZGVmIGlnbG9iKHBhdGhfZ2xvYik6CiAgICAiIiJFeHRlbmRlZCBnbG9iYmluZyBmdW5jdGlvbiB0aGF0IHN1cHBvcnRzICoqIGFuZCB7b3B0MSxvcHQyLG9wdDN9LiIiIgogICAgaWYgX0NIRUNLX1JFQ1VSU0lWRV9HTE9CLnNlYXJjaChwYXRoX2dsb2IpOgogICAgICAgIG1zZyA9ICIiImludmFsaWQgZ2xvYiAlcjogcmVjdXJzaXZlIGdsb2IgIioqIiBtdXN0IGJlIHVzZWQgYWxvbmUiIiIKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIHBhdGhfZ2xvYikKICAgIGlmIF9DSEVDS19NSVNNQVRDSF9TRVQuc2VhcmNoKHBhdGhfZ2xvYik6CiAgICAgICAgbXNnID0gIiIiaW52YWxpZCBnbG9iICVyOiBtaXNtYXRjaGluZyBzZXQgbWFya2VyICd7JyBvciAnfSciIiIKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIHBhdGhfZ2xvYikKICAgIHJldHVybiBfaWdsb2IocGF0aF9nbG9iKQoKCmRlZiBfaWdsb2IocGF0aF9nbG9iKToKICAgIHJpY2hfcGF0aF9nbG9iID0gUklDSF9HTE9CLnNwbGl0KHBhdGhfZ2xvYiwgMSkKICAgIGlmIGxlbihyaWNoX3BhdGhfZ2xvYikgPiAxOgogICAgICAgIGFzc2VydCBsZW4ocmljaF9wYXRoX2dsb2IpID09IDMsIHJpY2hfcGF0aF9nbG9iCiAgICAgICAgcHJlZml4LCBzZXQsIHN1ZmZpeCA9IHJpY2hfcGF0aF9nbG9iCiAgICAgICAgZm9yIGl0ZW0gaW4gc2V0LnNwbGl0KCcsJyk6CiAgICAgICAgICAgIGZvciBwYXRoIGluIF9pZ2xvYignJy5qb2luKChwcmVmaXgsIGl0ZW0sIHN1ZmZpeCkpKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGgKICAgIGVsc2U6CiAgICAgICAgaWYgJyoqJyBub3QgaW4gcGF0aF9nbG9iOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzdGRfaWdsb2IocGF0aF9nbG9iKToKICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmVmaXgsIHJhZGljYWwgPSBwYXRoX2dsb2Iuc3BsaXQoJyoqJywgMSkKICAgICAgICAgICAgaWYgcHJlZml4ID09ICcnOgogICAgICAgICAgICAgICAgcHJlZml4ID0gJy4nCiAgICAgICAgICAgIGlmIHJhZGljYWwgPT0gJyc6CiAgICAgICAgICAgICAgICByYWRpY2FsID0gJyonCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHdlIHN1cHBvcnQgYm90aAogICAgICAgICAgICAgICAgcmFkaWNhbCA9IHJhZGljYWwubHN0cmlwKCcvJykKICAgICAgICAgICAgICAgIHJhZGljYWwgPSByYWRpY2FsLmxzdHJpcCgnXFwnKQogICAgICAgICAgICBmb3IgcGF0aCwgZGlyLCBmaWxlcyBpbiBvcy53YWxrKHByZWZpeCk6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChwYXRoKQogICAgICAgICAgICAgICAgZm9yIGZuIGluIF9pZ2xvYihvcy5wYXRoLmpvaW4ocGF0aCwgcmFkaWNhbCkpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGZuCgppZiBzc2w6CiAgICBmcm9tIC5jb21wYXQgaW1wb3J0IChIVFRQU0hhbmRsZXIgYXMgQmFzZUhUVFBTSGFuZGxlciwgbWF0Y2hfaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUVycm9yKQoKCiMKIyBIVFRQU0Nvbm5lY3Rpb24gd2hpY2ggdmVyaWZpZXMgY2VydGlmaWNhdGVzL21hdGNoZXMgZG9tYWlucwojCgogICAgY2xhc3MgSFRUUFNDb25uZWN0aW9uKGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uKToKICAgICAgICBjYV9jZXJ0cyA9IE5vbmUgIyBzZXQgdGhpcyB0byB0aGUgcGF0aCB0byB0aGUgY2VydHMgZmlsZSAoLnBlbSkKICAgICAgICBjaGVja19kb21haW4gPSBUcnVlICMgb25seSB1c2VkIGlmIGNhX2NlcnRzIGlzIG5vdCBOb25lCgogICAgICAgICMgbm9pbnNwZWN0aW9uIFB5UHJvcGVydHlBY2Nlc3MKICAgICAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICAgICAgc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLCBzZWxmLnRpbWVvdXQpCiAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ190dW5uZWxfaG9zdCcsIEZhbHNlKToKICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2sKICAgICAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCgogICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdTU0xDb250ZXh0Jyk6CiAgICAgICAgICAgICAgICAjIEZvciAyLngKICAgICAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHM6CiAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzID0gc3NsLkNFUlRfTk9ORQogICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc3NsLndyYXBfc29ja2V0KHNvY2ssIHNlbGYua2V5X2ZpbGUsIHNlbGYuY2VydF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1jZXJ0X3JlcXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1zZWxmLmNhX2NlcnRzKQogICAgICAgICAgICBlbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBjb250ZXh0ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKICAgICAgICAgICAgICAgIGNvbnRleHQub3B0aW9ucyB8PSBzc2wuT1BfTk9fU1NMdjIKICAgICAgICAgICAgICAgIGlmIHNlbGYuY2VydF9maWxlOgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZF9jZXJ0X2NoYWluKHNlbGYuY2VydF9maWxlLCBzZWxmLmtleV9maWxlKQogICAgICAgICAgICAgICAga3dhcmdzID0ge30KICAgICAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHM6CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FmaWxlPXNlbGYuY2FfY2VydHMpCiAgICAgICAgICAgICAgICAgICAgaWYgZ2V0YXR0cihzc2wsICdIQVNfU05JJywgRmFsc2UpOgogICAgICAgICAgICAgICAgICAgICAgICBrd2FyZ3NbJ3NlcnZlcl9ob3N0bmFtZSddID0gc2VsZi5ob3N0CiAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBjb250ZXh0LndyYXBfc29ja2V0KHNvY2ssICoqa3dhcmdzKQogICAgICAgICAgICBpZiBzZWxmLmNhX2NlcnRzIGFuZCBzZWxmLmNoZWNrX2RvbWFpbjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBtYXRjaF9ob3N0bmFtZShzZWxmLnNvY2suZ2V0cGVlcmNlcnQoKSwgc2VsZi5ob3N0KQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnSG9zdCB2ZXJpZmllZDogJXMnLCBzZWxmLmhvc3QpCiAgICAgICAgICAgICAgICBleGNlcHQgQ2VydGlmaWNhdGVFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5zaHV0ZG93bihzb2NrZXQuU0hVVF9SRFdSKQogICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICBjbGFzcyBIVFRQU0hhbmRsZXIoQmFzZUhUVFBTSGFuZGxlcik6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhX2NlcnRzLCBjaGVja19kb21haW49VHJ1ZSk6CiAgICAgICAgICAgIEJhc2VIVFRQU0hhbmRsZXIuX19pbml0X18oc2VsZikKICAgICAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IGNhX2NlcnRzCiAgICAgICAgICAgIHNlbGYuY2hlY2tfZG9tYWluID0gY2hlY2tfZG9tYWluCgogICAgICAgIGRlZiBfY29ubl9tYWtlcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyBpcyBjYWxsZWQgdG8gY3JlYXRlIGEgY29ubmVjdGlvbiBpbnN0YW5jZS4gTm9ybWFsbHkgeW91J2QKICAgICAgICAgICAgcGFzcyBhIGNvbm5lY3Rpb24gY2xhc3MgdG8gZG9fb3BlbiwgYnV0IGl0IGRvZXNuJ3QgYWN0dWFsbHkgY2hlY2sgZm9yCiAgICAgICAgICAgIGEgY2xhc3MsIGFuZCBqdXN0IGV4cGVjdHMgYSBjYWxsYWJsZS4gQXMgbG9uZyBhcyB3ZSBiZWhhdmUganVzdCBhcyBhCiAgICAgICAgICAgIGNvbnN0cnVjdG9yIHdvdWxkIGhhdmUsIHdlIHNob3VsZCBiZSBPSy4gSWYgaXQgZXZlciBjaGFuZ2VzIHNvIHRoYXQKICAgICAgICAgICAgd2UgKm11c3QqIHBhc3MgYSBjbGFzcywgd2UnbGwgY3JlYXRlIGFuIFVuc2FmZUhUVFBTQ29ubmVjdGlvbiBjbGFzcwogICAgICAgICAgICB3aGljaCBqdXN0IHNldHMgY2hlY2tfZG9tYWluIHRvIEZhbHNlIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLCBhbmQKICAgICAgICAgICAgY2hvb3NlIHdoaWNoIG9uZSB0byBwYXNzIHRvIGRvX29wZW4uCiAgICAgICAgICAgICIiIgogICAgICAgICAgICByZXN1bHQgPSBIVFRQU0Nvbm5lY3Rpb24oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBpZiBzZWxmLmNhX2NlcnRzOgogICAgICAgICAgICAgICAgcmVzdWx0LmNhX2NlcnRzID0gc2VsZi5jYV9jZXJ0cwogICAgICAgICAgICAgICAgcmVzdWx0LmNoZWNrX2RvbWFpbiA9IHNlbGYuY2hlY2tfZG9tYWluCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgZGVmIGh0dHBzX29wZW4oc2VsZiwgcmVxKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbihzZWxmLl9jb25uX21ha2VyLCByZXEpCiAgICAgICAgICAgIGV4Y2VwdCBVUkxFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgaWYgJ2NlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQnIGluIHN0cihlLnJlYXNvbik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcignVW5hYmxlIHRvIHZlcmlmeSBzZXJ2ZXIgY2VydGlmaWNhdGUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciAlcycgJSByZXEuaG9zdCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICAjCiAgICAjIFRvIHByZXZlbnQgYWdhaW5zdCBtaXhpbmcgSFRUUCB0cmFmZmljIHdpdGggSFRUUFMgKGV4YW1wbGVzOiBBIE1hbi1Jbi1UaGUtCiAgICAjIE1pZGRsZSBwcm94eSB1c2luZyBIVFRQIGxpc3RlbnMgb24gcG9ydCA0NDMsIG9yIGFuIGluZGV4IG1pc3Rha2VubHkgc2VydmVzCiAgICAjIEhUTUwgY29udGFpbmluZyBhIGh0dHA6Ly94eXogbGluayB3aGVuIGl0IHNob3VsZCBiZSBodHRwczovL3h5eiksCiAgICAjIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgaGFuZGxlciBjbGFzcywgd2hpY2ggZG9lcyBub3QgYWxsb3cgSFRUUCB0cmFmZmljLgogICAgIwogICAgIyBJdCB3b3JrcyBieSBpbmhlcml0aW5nIGZyb20gSFRUUEhhbmRsZXIgLSBzbyBidWlsZF9vcGVuZXIgd29uJ3QgYWRkIGEKICAgICMgaGFuZGxlciBmb3IgSFRUUCBpdHNlbGYuCiAgICAjCiAgICBjbGFzcyBIVFRQU09ubHlIYW5kbGVyKEhUVFBTSGFuZGxlciwgSFRUUEhhbmRsZXIpOgogICAgICAgIGRlZiBodHRwX29wZW4oc2VsZiwgcmVxKToKICAgICAgICAgICAgcmFpc2UgVVJMRXJyb3IoJ1VuZXhwZWN0ZWQgSFRUUCByZXF1ZXN0IG9uIHdoYXQgc2hvdWxkIGJlIGEgc2VjdXJlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nvbm5lY3Rpb246ICVzJyAlIHJlcSkKCiMKIyBYTUwtUlBDIHdpdGggdGltZW91dHMKIwoKX3Zlcl9pbmZvID0gc3lzLnZlcnNpb25faW5mb1s6Ml0KCmlmIF92ZXJfaW5mbyA9PSAoMiwgNik6CiAgICBjbGFzcyBIVFRQKGh0dHBsaWIuSFRUUCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9JycsIHBvcnQ9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICAgICBpZiBwb3J0ID09IDA6ICAgIyAwIG1lYW5zIHVzZSBwb3J0IDAsIG5vdCB0aGUgZGVmYXVsdCBwb3J0CiAgICAgICAgICAgICAgICBwb3J0ID0gTm9uZQogICAgICAgICAgICBzZWxmLl9zZXR1cChzZWxmLl9jb25uZWN0aW9uX2NsYXNzKGhvc3QsIHBvcnQsICoqa3dhcmdzKSkKCgogICAgaWYgc3NsOgogICAgICAgIGNsYXNzIEhUVFBTKGh0dHBsaWIuSFRUUFMpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nJywgcG9ydD1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgICAgICAgICBpZiBwb3J0ID09IDA6ICAgIyAwIG1lYW5zIHVzZSBwb3J0IDAsIG5vdCB0aGUgZGVmYXVsdCBwb3J0CiAgICAgICAgICAgICAgICAgICAgcG9ydCA9IE5vbmUKICAgICAgICAgICAgICAgIHNlbGYuX3NldHVwKHNlbGYuX2Nvbm5lY3Rpb25fY2xhc3MoaG9zdCwgcG9ydCwgKiprd2FyZ3MpKQoKCmNsYXNzIFRyYW5zcG9ydCh4bWxycGNsaWIuVHJhbnNwb3J0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aW1lb3V0LCB1c2VfZGF0ZXRpbWU9MCk6CiAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAogICAgICAgIHhtbHJwY2xpYi5UcmFuc3BvcnQuX19pbml0X18oc2VsZiwgdXNlX2RhdGV0aW1lKQoKICAgIGRlZiBtYWtlX2Nvbm5lY3Rpb24oc2VsZiwgaG9zdCk6CiAgICAgICAgaCwgZWgsIHg1MDkgPSBzZWxmLmdldF9ob3N0X2luZm8oaG9zdCkKICAgICAgICBpZiBfdmVyX2luZm8gPT0gKDIsIDYpOgogICAgICAgICAgICByZXN1bHQgPSBIVFRQKGgsIHRpbWVvdXQ9c2VsZi50aW1lb3V0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jb25uZWN0aW9uIG9yIGhvc3QgIT0gc2VsZi5fY29ubmVjdGlvblswXToKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhX2hlYWRlcnMgPSBlaAogICAgICAgICAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IGhvc3QsIGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oaCkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY29ubmVjdGlvblsxXQogICAgICAgIHJldHVybiByZXN1bHQKCmlmIHNzbDoKICAgIGNsYXNzIFNhZmVUcmFuc3BvcnQoeG1scnBjbGliLlNhZmVUcmFuc3BvcnQpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aW1lb3V0LCB1c2VfZGF0ZXRpbWU9MCk6CiAgICAgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKICAgICAgICAgICAgeG1scnBjbGliLlNhZmVUcmFuc3BvcnQuX19pbml0X18oc2VsZiwgdXNlX2RhdGV0aW1lKQoKICAgICAgICBkZWYgbWFrZV9jb25uZWN0aW9uKHNlbGYsIGhvc3QpOgogICAgICAgICAgICBoLCBlaCwga3dhcmdzID0gc2VsZi5nZXRfaG9zdF9pbmZvKGhvc3QpCiAgICAgICAgICAgIGlmIG5vdCBrd2FyZ3M6CiAgICAgICAgICAgICAgICBrd2FyZ3MgPSB7fQogICAgICAgICAgICBrd2FyZ3NbJ3RpbWVvdXQnXSA9IHNlbGYudGltZW91dAogICAgICAgICAgICBpZiBfdmVyX2luZm8gPT0gKDIsIDYpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gSFRUUFMoaG9zdCwgTm9uZSwgKiprd2FyZ3MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY29ubmVjdGlvbiBvciBob3N0ICE9IHNlbGYuX2Nvbm5lY3Rpb25bMF06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFfaGVhZGVycyA9IGVoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IGhvc3QsIGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uKGgsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKQogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY29ubmVjdGlvblsxXQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgU2VydmVyUHJveHkoeG1scnBjbGliLlNlcnZlclByb3h5KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmksICoqa3dhcmdzKToKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0ID0ga3dhcmdzLnBvcCgndGltZW91dCcsIE5vbmUpCiAgICAgICAgIyBUaGUgYWJvdmUgY2xhc3NlcyBvbmx5IGNvbWUgaW50byBwbGF5IGlmIGEgdGltZW91dAogICAgICAgICMgaXMgc3BlY2lmaWVkCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2NoZW1lLCBfID0gc3BsaXR0eXBlKHVyaSkKICAgICAgICAgICAgdXNlX2RhdGV0aW1lID0ga3dhcmdzLmdldCgndXNlX2RhdGV0aW1lJywgMCkKICAgICAgICAgICAgaWYgc2NoZW1lID09ICdodHRwcyc6CiAgICAgICAgICAgICAgICB0Y2xzID0gU2FmZVRyYW5zcG9ydAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdGNscyA9IFRyYW5zcG9ydAogICAgICAgICAgICBrd2FyZ3NbJ3RyYW5zcG9ydCddID0gdCA9IHRjbHModGltZW91dCwgdXNlX2RhdGV0aW1lPXVzZV9kYXRldGltZSkKICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSB0CiAgICAgICAgeG1scnBjbGliLlNlcnZlclByb3h5Ll9faW5pdF9fKHNlbGYsIHVyaSwgKiprd2FyZ3MpCgojCiMgQ1NWIGZ1bmN0aW9uYWxpdHkuIFRoaXMgaXMgcHJvdmlkZWQgYmVjYXVzZSBvbiAyLngsIHRoZSBjc3YgbW9kdWxlIGNhbid0CiMgaGFuZGxlIFVuaWNvZGUuIEhvd2V2ZXIsIHdlIG5lZWQgdG8gZGVhbCB3aXRoIFVuaWNvZGUgaW4gZS5nLiBSRUNPUkQgZmlsZXMuCiMKCmRlZiBfY3N2X29wZW4oZm4sIG1vZGUsICoqa3dhcmdzKToKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgIG1vZGUgKz0gJ2InCiAgICBlbHNlOgogICAgICAgIGt3YXJnc1snbmV3bGluZSddID0gJycKICAgIHJldHVybiBvcGVuKGZuLCBtb2RlLCAqKmt3YXJncykKCgpjbGFzcyBDU1ZCYXNlKG9iamVjdCk6CiAgICBkZWZhdWx0cyA9IHsKICAgICAgICAnZGVsaW1pdGVyJzogc3RyKCcsJyksICAgICAgIyBUaGUgc3RycyBhcmUgdXNlZCBiZWNhdXNlIHdlIG5lZWQgbmF0aXZlCiAgICAgICAgJ3F1b3RlY2hhcic6IHN0cignIicpLCAgICAgICMgc3RyIGluIHRoZSBjc3YgQVBJICgyLnggd29uJ3QgdGFrZQogICAgICAgICdsaW5ldGVybWluYXRvcic6IHN0cignXG4nKSAjIFVuaWNvZGUpCiAgICB9CgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgogICAgICAgIHNlbGYuc3RyZWFtLmNsb3NlKCkKCgpjbGFzcyBDU1ZSZWFkZXIoQ1NWQmFzZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgIGlmICdzdHJlYW0nIGluIGt3YXJnczoKICAgICAgICAgICAgc3RyZWFtID0ga3dhcmdzWydzdHJlYW0nXQogICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CiAgICAgICAgICAgICAgICAjIG5lZWRzIHRvIGJlIGEgdGV4dCBzdHJlYW0KICAgICAgICAgICAgICAgIHN0cmVhbSA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04Jykoc3RyZWFtKQogICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gX2Nzdl9vcGVuKGt3YXJnc1sncGF0aCddLCAncicpCiAgICAgICAgc2VsZi5yZWFkZXIgPSBjc3YucmVhZGVyKHNlbGYuc3RyZWFtLCAqKnNlbGYuZGVmYXVsdHMpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgcmVzdWx0ID0gbmV4dChzZWxmLnJlYWRlcikKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICAgICAgZm9yIGksIGl0ZW0gaW4gZW51bWVyYXRlKHJlc3VsdCk6CiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGl0ZW0uZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIF9fbmV4dF9fID0gbmV4dAoKY2xhc3MgQ1NWV3JpdGVyKENTVkJhc2UpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZuLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi5zdHJlYW0gPSBfY3N2X29wZW4oZm4sICd3JykKICAgICAgICBzZWxmLndyaXRlciA9IGNzdi53cml0ZXIoc2VsZi5zdHJlYW0sICoqc2VsZi5kZWZhdWx0cykKCiAgICBkZWYgd3JpdGVyb3coc2VsZiwgcm93KToKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICAgICAgciA9IFtdCiAgICAgICAgICAgIGZvciBpdGVtIGluIHJvdzoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHIuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgIHJvdyA9IHIKICAgICAgICBzZWxmLndyaXRlci53cml0ZXJvdyhyb3cpCgojCiMgICBDb25maWd1cmF0b3IgZnVuY3Rpb25hbGl0eQojCgpjbGFzcyBDb25maWd1cmF0b3IoQmFzZUNvbmZpZ3VyYXRvcik6CgogICAgdmFsdWVfY29udmVydGVycyA9IGRpY3QoQmFzZUNvbmZpZ3VyYXRvci52YWx1ZV9jb252ZXJ0ZXJzKQogICAgdmFsdWVfY29udmVydGVyc1snaW5jJ10gPSAnaW5jX2NvbnZlcnQnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZywgYmFzZT1Ob25lKToKICAgICAgICBzdXBlcihDb25maWd1cmF0b3IsIHNlbGYpLl9faW5pdF9fKGNvbmZpZykKICAgICAgICBzZWxmLmJhc2UgPSBiYXNlIG9yIG9zLmdldGN3ZCgpCgogICAgZGVmIGNvbmZpZ3VyZV9jdXN0b20oc2VsZiwgY29uZmlnKToKICAgICAgICBkZWYgY29udmVydChvKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHR5cGUobykoW2NvbnZlcnQoaSkgZm9yIGkgaW4gb10pCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvLCBkaWN0KToKICAgICAgICAgICAgICAgIGlmICcoKScgaW4gbzoKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20obykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBvOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba10gPSBjb252ZXJ0KG9ba10pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbnZlcnQobykKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBjID0gY29uZmlnLnBvcCgnKCknKQogICAgICAgIGlmIG5vdCBjYWxsYWJsZShjKToKICAgICAgICAgICAgYyA9IHNlbGYucmVzb2x2ZShjKQogICAgICAgIHByb3BzID0gY29uZmlnLnBvcCgnLicsIE5vbmUpCiAgICAgICAgIyBDaGVjayBmb3IgdmFsaWQgaWRlbnRpZmllcnMKICAgICAgICBhcmdzID0gY29uZmlnLnBvcCgnW10nLCAoKSkKICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICBhcmdzID0gdHVwbGUoW2NvbnZlcnQobykgZm9yIG8gaW4gYXJnc10pCiAgICAgICAgaXRlbXMgPSBbKGssIGNvbnZlcnQoY29uZmlnW2tdKSkgZm9yIGsgaW4gY29uZmlnIGlmIHZhbGlkX2lkZW50KGspXQogICAgICAgIGt3YXJncyA9IGRpY3QoaXRlbXMpCiAgICAgICAgcmVzdWx0ID0gYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgaWYgcHJvcHM6CiAgICAgICAgICAgIGZvciBuLCB2IGluIHByb3BzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHJlc3VsdCwgbiwgY29udmVydCh2KSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWdba2V5XQogICAgICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0LCBkaWN0KSBhbmQgJygpJyBpbiByZXN1bHQ6CiAgICAgICAgICAgIHNlbGYuY29uZmlnW2tleV0gPSByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20ocmVzdWx0KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgaW5jX2NvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgaW5jOi8vIHByb3RvY29sLiIiIgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHZhbHVlKToKICAgICAgICAgICAgdmFsdWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlLCB2YWx1ZSkKICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHZhbHVlLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgIHJlc3VsdCA9IGpzb24ubG9hZChmKQogICAgICAgIHJldHVybiByZXN1bHQKCiMKIyBNaXhpbiBmb3IgcnVubmluZyBzdWJwcm9jZXNzZXMgYW5kIGNhcHR1cmluZyB0aGVpciBvdXRwdXQKIwoKY2xhc3MgU3VicHJvY2Vzc01peGluKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyYm9zZT1GYWxzZSwgcHJvZ3Jlc3M9Tm9uZSk6CiAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQogICAgICAgIHNlbGYucHJvZ3Jlc3MgPSBwcm9ncmVzcwoKICAgIGRlZiByZWFkZXIoc2VsZiwgc3RyZWFtLCBjb250ZXh0KToKICAgICAgICAiIiIKICAgICAgICBSZWFkIGxpbmVzIGZyb20gYSBzdWJwcm9jZXNzJyBvdXRwdXQgc3RyZWFtIGFuZCBlaXRoZXIgcGFzcyB0byBhIHByb2dyZXNzCiAgICAgICAgY2FsbGFibGUgKGlmIHNwZWNpZmllZCkgb3Igd3JpdGUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gdG8gc3lzLnN0ZGVyci4KICAgICAgICAiIiIKICAgICAgICBwcm9ncmVzcyA9IHNlbGYucHJvZ3Jlc3MKICAgICAgICB2ZXJib3NlID0gc2VsZi52ZXJib3NlCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgcyA9IHN0cmVhbS5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBzOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgcHJvZ3Jlc3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBwcm9ncmVzcyhzLCBjb250ZXh0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbm90IHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnLicpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUocy5kZWNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKICAgICAgICBzdHJlYW0uY2xvc2UoKQoKICAgIGRlZiBydW5fY29tbWFuZChzZWxmLCBjbWQsICoqa3dhcmdzKToKICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgKiprd2FyZ3MpCiAgICAgICAgdDEgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnJlYWRlciwgYXJncz0ocC5zdGRvdXQsICdzdGRvdXQnKSkKICAgICAgICB0MS5zdGFydCgpCiAgICAgICAgdDIgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnJlYWRlciwgYXJncz0ocC5zdGRlcnIsICdzdGRlcnInKSkKICAgICAgICB0Mi5zdGFydCgpCiAgICAgICAgcC53YWl0KCkKICAgICAgICB0MS5qb2luKCkKICAgICAgICB0Mi5qb2luKCkKICAgICAgICBpZiBzZWxmLnByb2dyZXNzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnByb2dyZXNzKCdkb25lLicsICdtYWluJykKICAgICAgICBlbGlmIHNlbGYudmVyYm9zZToKICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnZG9uZS5cbicpCiAgICAgICAgcmV0dXJuIHAKCgpkZWYgbm9ybWFsaXplX25hbWUobmFtZSk6CiAgICAiIiJOb3JtYWxpemUgYSBweXRob24gcGFja2FnZSBuYW1lIGEgbGEgUEVQIDUwMyIiIgogICAgIyBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNTAzLyNub3JtYWxpemVkLW5hbWVzCiAgICByZXR1cm4gcmUuc3ViKCdbLV8uXSsnLCAnLScsIG5hbWUpLmxvd2VyKCkKUEsDBBQAAAAAAAAAIQCg/QVWn1wAAJ9cAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3ZlcnNpb24ucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiIKSW1wbGVtZW50YXRpb24gb2YgYSBmbGV4aWJsZSB2ZXJzaW9uaW5nIHNjaGVtZSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgUEVQLTQ0MCwKc2V0dXB0b29scy1jb21wYXRpYmxlIGFuZCBzZW1hbnRpYyB2ZXJzaW9uaW5nLgoiIiIKCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKZnJvbSAuY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMKCl9fYWxsX18gPSBbJ05vcm1hbGl6ZWRWZXJzaW9uJywgJ05vcm1hbGl6ZWRNYXRjaGVyJywKICAgICAgICAgICAnTGVnYWN5VmVyc2lvbicsICdMZWdhY3lNYXRjaGVyJywKICAgICAgICAgICAnU2VtYW50aWNWZXJzaW9uJywgJ1NlbWFudGljTWF0Y2hlcicsCiAgICAgICAgICAgJ1Vuc3VwcG9ydGVkVmVyc2lvbkVycm9yJywgJ2dldF9zY2hlbWUnXQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IoVmFsdWVFcnJvcik6CiAgICAiIiJUaGlzIGlzIGFuIHVuc3VwcG9ydGVkIHZlcnNpb24uIiIiCiAgICBwYXNzCgoKY2xhc3MgVmVyc2lvbihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHMpOgogICAgICAgIHNlbGYuX3N0cmluZyA9IHMgPSBzLnN0cmlwKCkKICAgICAgICBzZWxmLl9wYXJ0cyA9IHBhcnRzID0gc2VsZi5wYXJzZShzKQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHBhcnRzLCB0dXBsZSkKICAgICAgICBhc3NlcnQgbGVuKHBhcnRzKSA+IDAKCiAgICBkZWYgcGFyc2Uoc2VsZiwgcyk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigncGxlYXNlIGltcGxlbWVudCBpbiBhIHN1YmNsYXNzJykKCiAgICBkZWYgX2NoZWNrX2NvbXBhdGlibGUoc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIHR5cGUoc2VsZikgIT0gdHlwZShvdGhlcik6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignY2Fubm90IGNvbXBhcmUgJXIgYW5kICVyJyAlIChzZWxmLCBvdGhlcikpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgc2VsZi5fY2hlY2tfY29tcGF0aWJsZShvdGhlcikKICAgICAgICByZXR1cm4gc2VsZi5fcGFydHMgPT0gb3RoZXIuX3BhcnRzCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBzZWxmLl9jaGVja19jb21wYXRpYmxlKG90aGVyKQogICAgICAgIHJldHVybiBzZWxmLl9wYXJ0cyA8IG90aGVyLl9wYXJ0cwoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgKHNlbGYuX19sdF9fKG90aGVyKSBvciBzZWxmLl9fZXFfXyhvdGhlcikpCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19sdF9fKG90aGVyKSBvciBzZWxmLl9fZXFfXyhvdGhlcikKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fX2d0X18ob3RoZXIpIG9yIHNlbGYuX19lcV9fKG90aGVyKQoKICAgICMgU2VlIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvcmVmZXJlbmNlL2RhdGFtb2RlbCNvYmplY3QuX19oYXNoX18KICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9wYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcygnJXMnKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX3N0cmluZykKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3RyaW5nCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQbGVhc2UgaW1wbGVtZW50IGluIHN1YmNsYXNzZXMuJykKCgpjbGFzcyBNYXRjaGVyKG9iamVjdCk6CiAgICB2ZXJzaW9uX2NsYXNzID0gTm9uZQoKICAgIGRpc3RfcmUgPSByZS5jb21waWxlKHIiXihcd1tcc1x3Jy4tXSopKFwoKC4qKVwpKT8iKQogICAgY29tcF9yZSA9IHJlLmNvbXBpbGUocideKDw9fD49fDx8PnwhPXw9ezIsM318fj0pP1xzKihbXlxzLF0rKSQnKQogICAgbnVtX3JlID0gcmUuY29tcGlsZShyJ15cZCsoXC5cZCspKiQnKQoKICAgICMgdmFsdWUgaXMgZWl0aGVyIGEgY2FsbGFibGUgb3IgdGhlIG5hbWUgb2YgYSBtZXRob2QKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgJzwnOiBsYW1iZGEgdiwgYywgcDogdiA8IGMsCiAgICAgICAgJz4nOiBsYW1iZGEgdiwgYywgcDogdiA+IGMsCiAgICAgICAgJzw9JzogbGFtYmRhIHYsIGMsIHA6IHYgPT0gYyBvciB2IDwgYywKICAgICAgICAnPj0nOiBsYW1iZGEgdiwgYywgcDogdiA9PSBjIG9yIHYgPiBjLAogICAgICAgICc9PSc6IGxhbWJkYSB2LCBjLCBwOiB2ID09IGMsCiAgICAgICAgJz09PSc6IGxhbWJkYSB2LCBjLCBwOiB2ID09IGMsCiAgICAgICAgIyBieSBkZWZhdWx0LCBjb21wYXRpYmxlID0+ID49LgogICAgICAgICd+PSc6IGxhbWJkYSB2LCBjLCBwOiB2ID09IGMgb3IgdiA+IGMsCiAgICAgICAgJyE9JzogbGFtYmRhIHYsIGMsIHA6IHYgIT0gYywKICAgIH0KCiAgICBkZWYgX19pbml0X18oc2VsZiwgcyk6CiAgICAgICAgaWYgc2VsZi52ZXJzaW9uX2NsYXNzIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1BsZWFzZSBzcGVjaWZ5IGEgdmVyc2lvbiBjbGFzcycpCiAgICAgICAgc2VsZi5fc3RyaW5nID0gcyA9IHMuc3RyaXAoKQogICAgICAgIG0gPSBzZWxmLmRpc3RfcmUubWF0Y2gocykKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm90IHZhbGlkOiAlcicgJSBzKQogICAgICAgIGdyb3VwcyA9IG0uZ3JvdXBzKCcnKQogICAgICAgIHNlbGYubmFtZSA9IGdyb3Vwc1swXS5zdHJpcCgpCiAgICAgICAgc2VsZi5rZXkgPSBzZWxmLm5hbWUubG93ZXIoKSAgICAjIGZvciBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zCiAgICAgICAgY2xpc3QgPSBbXQogICAgICAgIGlmIGdyb3Vwc1syXToKICAgICAgICAgICAgY29uc3RyYWludHMgPSBbYy5zdHJpcCgpIGZvciBjIGluIGdyb3Vwc1syXS5zcGxpdCgnLCcpXQogICAgICAgICAgICBmb3IgYyBpbiBjb25zdHJhaW50czoKICAgICAgICAgICAgICAgIG0gPSBzZWxmLmNvbXBfcmUubWF0Y2goYykKICAgICAgICAgICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgJXIgaW4gJXInICUgKGMsIHMpKQogICAgICAgICAgICAgICAgZ3JvdXBzID0gbS5ncm91cHMoKQogICAgICAgICAgICAgICAgb3AgPSBncm91cHNbMF0gb3IgJ349JwogICAgICAgICAgICAgICAgcyA9IGdyb3Vwc1sxXQogICAgICAgICAgICAgICAgaWYgcy5lbmRzd2l0aCgnLionKToKICAgICAgICAgICAgICAgICAgICBpZiBvcCBub3QgaW4gKCc9PScsICchPScpOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdcJy4qXCcgbm90IGFsbG93ZWQgZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgY29uc3RyYWludHMnICUgb3ApCiAgICAgICAgICAgICAgICAgICAgIyBDb3VsZCBiZSBhIHBhcnRpYWwgdmVyc2lvbiAoZS5nLiBmb3IgJzIuKicpIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgIyB3b24ndCBwYXJzZSBhcyBhIHZlcnNpb24sIHNvIGtlZXAgaXQgYXMgYSBzdHJpbmcKICAgICAgICAgICAgICAgICAgICB2biwgcHJlZml4ID0gc1s6LTJdLCBUcnVlCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubnVtX3JlLm1hdGNoKHZuKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBKdXN0IHRvIGNoZWNrIHRoYXQgdm4gaXMgYSB2YWxpZCB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmVyc2lvbl9jbGFzcyh2bikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBTaG91bGQgcGFyc2UgYXMgYSB2ZXJzaW9uLCBzbyB3ZSBjYW4gY3JlYXRlIGFuCiAgICAgICAgICAgICAgICAgICAgIyBpbnN0YW5jZSBmb3IgdGhlIGNvbXBhcmlzb24KICAgICAgICAgICAgICAgICAgICB2biwgcHJlZml4ID0gc2VsZi52ZXJzaW9uX2NsYXNzKHMpLCBGYWxzZQogICAgICAgICAgICAgICAgY2xpc3QuYXBwZW5kKChvcCwgdm4sIHByZWZpeCkpCiAgICAgICAgc2VsZi5fcGFydHMgPSB0dXBsZShjbGlzdCkKCiAgICBkZWYgbWF0Y2goc2VsZiwgdmVyc2lvbik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIHZlcnNpb24gbWF0Y2hlcyB0aGUgY29uc3RyYWludHMuCgogICAgICAgIDpwYXJhbSB2ZXJzaW9uOiBUaGUgdmVyc2lvbiB0byBtYXRjaCBhZ2FpbnN0IHRoaXMgaW5zdGFuY2UuCiAgICAgICAgOnR5cGUgdmVyc2lvbjogU3RyaW5nIG9yIDpjbGFzczpgVmVyc2lvbmAgaW5zdGFuY2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2ZXJzaW9uLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uX2NsYXNzKHZlcnNpb24pCiAgICAgICAgZm9yIG9wZXJhdG9yLCBjb25zdHJhaW50LCBwcmVmaXggaW4gc2VsZi5fcGFydHM6CiAgICAgICAgICAgIGYgPSBzZWxmLl9vcGVyYXRvcnMuZ2V0KG9wZXJhdG9yKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGYsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBmID0gZ2V0YXR0cihzZWxmLCBmKQogICAgICAgICAgICBpZiBub3QgZjoKICAgICAgICAgICAgICAgIG1zZyA9ICgnJXIgbm90IGltcGxlbWVudGVkICcKICAgICAgICAgICAgICAgICAgICAgICAnZm9yICVzJyAlIChvcGVyYXRvciwgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pKQogICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihtc2cpCiAgICAgICAgICAgIGlmIG5vdCBmKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4YWN0X3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGlmIGxlbihzZWxmLl9wYXJ0cykgPT0gMSBhbmQgc2VsZi5fcGFydHNbMF1bMF0gaW4gKCc9PScsICc9PT0nKToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fcGFydHNbMF1bMV0KICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9jaGVja19jb21wYXRpYmxlKHNlbGYsIG90aGVyKToKICAgICAgICBpZiB0eXBlKHNlbGYpICE9IHR5cGUob3RoZXIpIG9yIHNlbGYubmFtZSAhPSBvdGhlci5uYW1lOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2Nhbm5vdCBjb21wYXJlICVzIGFuZCAlcycgJSAoc2VsZiwgb3RoZXIpKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHNlbGYuX2NoZWNrX2NvbXBhdGlibGUob3RoZXIpCiAgICAgICAgcmV0dXJuIHNlbGYua2V5ID09IG90aGVyLmtleSBhbmQgc2VsZi5fcGFydHMgPT0gb3RoZXIuX3BhcnRzCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKCiAgICAjIFNlZSBodHRwOi8vZG9jcy5weXRob24ub3JnL3JlZmVyZW5jZS9kYXRhbW9kZWwjb2JqZWN0Ll9faGFzaF9fCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5rZXkpICsgaGFzaChzZWxmLl9wYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcyglcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLl9zdHJpbmcpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3N0cmluZwoKClBFUDQ0MF9WRVJTSU9OX1JFID0gcmUuY29tcGlsZShyJ152PyhcZCshKT8oXGQrKFwuXGQrKSopKChhfGJ8Y3xyYykoXGQrKSk/JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoXC4ocG9zdCkoXGQrKSk/KFwuKGRldikoXGQrKSk/JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoXCsoW2EtekEtWlxkXSsoXC5bYS16QS1aXGRdKyk/KSk/JCcpCgoKZGVmIF9wZXBfNDQwX2tleShzKToKICAgIHMgPSBzLnN0cmlwKCkKICAgIG0gPSBQRVA0NDBfVkVSU0lPTl9SRS5tYXRjaChzKQogICAgaWYgbm90IG06CiAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IoJ05vdCBhIHZhbGlkIHZlcnNpb246ICVzJyAlIHMpCiAgICBncm91cHMgPSBtLmdyb3VwcygpCiAgICBudW1zID0gdHVwbGUoaW50KHYpIGZvciB2IGluIGdyb3Vwc1sxXS5zcGxpdCgnLicpKQogICAgd2hpbGUgbGVuKG51bXMpID4gMSBhbmQgbnVtc1stMV0gPT0gMDoKICAgICAgICBudW1zID0gbnVtc1s6LTFdCgogICAgaWYgbm90IGdyb3Vwc1swXToKICAgICAgICBlcG9jaCA9IDAKICAgIGVsc2U6CiAgICAgICAgZXBvY2ggPSBpbnQoZ3JvdXBzWzBdKQogICAgcHJlID0gZ3JvdXBzWzQ6Nl0KICAgIHBvc3QgPSBncm91cHNbNzo5XQogICAgZGV2ID0gZ3JvdXBzWzEwOjEyXQogICAgbG9jYWwgPSBncm91cHNbMTNdCiAgICBpZiBwcmUgPT0gKE5vbmUsIE5vbmUpOgogICAgICAgIHByZSA9ICgpCiAgICBlbHNlOgogICAgICAgIHByZSA9IHByZVswXSwgaW50KHByZVsxXSkKICAgIGlmIHBvc3QgPT0gKE5vbmUsIE5vbmUpOgogICAgICAgIHBvc3QgPSAoKQogICAgZWxzZToKICAgICAgICBwb3N0ID0gcG9zdFswXSwgaW50KHBvc3RbMV0pCiAgICBpZiBkZXYgPT0gKE5vbmUsIE5vbmUpOgogICAgICAgIGRldiA9ICgpCiAgICBlbHNlOgogICAgICAgIGRldiA9IGRldlswXSwgaW50KGRldlsxXSkKICAgIGlmIGxvY2FsIGlzIE5vbmU6CiAgICAgICAgbG9jYWwgPSAoKQogICAgZWxzZToKICAgICAgICBwYXJ0cyA9IFtdCiAgICAgICAgZm9yIHBhcnQgaW4gbG9jYWwuc3BsaXQoJy4nKToKICAgICAgICAgICAgIyB0byBlbnN1cmUgdGhhdCBudW1lcmljIGNvbXBhcmVzIGFzID4gbGV4aWNvZ3JhcGhpYywgYXZvaWQKICAgICAgICAgICAgIyBjb21wYXJpbmcgdGhlbSBkaXJlY3RseSwgYnV0IGVuY29kZSBhIHR1cGxlIHdoaWNoIGVuc3VyZXMKICAgICAgICAgICAgIyBjb3JyZWN0IHNvcnRpbmcKICAgICAgICAgICAgaWYgcGFydC5pc2RpZ2l0KCk6CiAgICAgICAgICAgICAgICBwYXJ0ID0gKDEsIGludChwYXJ0KSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhcnQgPSAoMCwgcGFydCkKICAgICAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICAgICAgbG9jYWwgPSB0dXBsZShwYXJ0cykKICAgIGlmIG5vdCBwcmU6CiAgICAgICAgIyBlaXRoZXIgYmVmb3JlIHByZS1yZWxlYXNlLCBvciBmaW5hbCByZWxlYXNlIGFuZCBhZnRlcgogICAgICAgIGlmIG5vdCBwb3N0IGFuZCBkZXY6CiAgICAgICAgICAgICMgYmVmb3JlIHByZS1yZWxlYXNlCiAgICAgICAgICAgIHByZSA9ICgnYScsIC0xKSAgICAgIyB0byBzb3J0IGJlZm9yZSBhMAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByZSA9ICgneicsKSAgICAgICAgIyB0byBzb3J0IGFmdGVyIGFsbCBwcmUtcmVsZWFzZXMKICAgICMgbm93IGxvb2sgYXQgdGhlIHN0YXRlIG9mIHBvc3QgYW5kIGRldi4KICAgIGlmIG5vdCBwb3N0OgogICAgICAgIHBvc3QgPSAoJ18nLCkgICAjIHNvcnQgYmVmb3JlICdhJwogICAgaWYgbm90IGRldjoKICAgICAgICBkZXYgPSAoJ2ZpbmFsJywpCgogICAgI3ByaW50KCclcyAtPiAlcycgJSAocywgbS5ncm91cHMoKSkpCiAgICByZXR1cm4gZXBvY2gsIG51bXMsIHByZSwgcG9zdCwgZGV2LCBsb2NhbAoKCl9ub3JtYWxpemVkX2tleSA9IF9wZXBfNDQwX2tleQoKCmNsYXNzIE5vcm1hbGl6ZWRWZXJzaW9uKFZlcnNpb24pOgogICAgIiIiQSByYXRpb25hbCB2ZXJzaW9uLgoKICAgIEdvb2Q6CiAgICAgICAgMS4yICAgICAgICAgIyBlcXVpdmFsZW50IHRvICIxLjIuMCIKICAgICAgICAxLjIuMAogICAgICAgIDEuMmExCiAgICAgICAgMS4yLjNhMgogICAgICAgIDEuMi4zYjEKICAgICAgICAxLjIuM2MxCiAgICAgICAgMS4yLjMuNAogICAgICAgIFRPRE86IGZpbGwgdGhpcyBvdXQKCiAgICBCYWQ6CiAgICAgICAgMSAgICAgICAgICAgIyBtaW5pbXVtIHR3byBudW1iZXJzCiAgICAgICAgMS4yYSAgICAgICAgIyByZWxlYXNlIGxldmVsIG11c3QgaGF2ZSBhIHJlbGVhc2Ugc2VyaWFsCiAgICAgICAgMS4yLjNiCiAgICAiIiIKICAgIGRlZiBwYXJzZShzZWxmLCBzKToKICAgICAgICByZXN1bHQgPSBfbm9ybWFsaXplZF9rZXkocykKICAgICAgICAjIF9ub3JtYWxpemVkX2tleSBsb3NlcyB0cmFpbGluZyB6ZXJvZXMgaW4gdGhlIHJlbGVhc2UKICAgICAgICAjIGNsYXVzZSwgc2luY2UgdGhhdCdzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCBYLlkgPT0gWC5ZLjAgPT0gWC5ZLjAuMAogICAgICAgICMgSG93ZXZlciwgUEVQIDQ0MCBwcmVmaXggbWF0Y2hpbmcgbmVlZHMgaXQ6IGZvciBleGFtcGxlLAogICAgICAgICMgKH49IDEuNC41LjApIG1hdGNoZXMgZGlmZmVyZW50bHkgdG8gKH49IDEuNC41LjAuMCkuCiAgICAgICAgbSA9IFBFUDQ0MF9WRVJTSU9OX1JFLm1hdGNoKHMpICAgICAgIyBtdXN0IHN1Y2NlZWQKICAgICAgICBncm91cHMgPSBtLmdyb3VwcygpCiAgICAgICAgc2VsZi5fcmVsZWFzZV9jbGF1c2UgPSB0dXBsZShpbnQodikgZm9yIHYgaW4gZ3JvdXBzWzFdLnNwbGl0KCcuJykpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIFBSRVJFTF9UQUdTID0gc2V0KFsnYScsICdiJywgJ2MnLCAncmMnLCAnZGV2J10pCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYW55KHRbMF0gaW4gc2VsZi5QUkVSRUxfVEFHUyBmb3IgdCBpbiBzZWxmLl9wYXJ0cyBpZiB0KQoKCmRlZiBfbWF0Y2hfcHJlZml4KHgsIHkpOgogICAgeCA9IHN0cih4KQogICAgeSA9IHN0cih5KQogICAgaWYgeCA9PSB5OgogICAgICAgIHJldHVybiBUcnVlCiAgICBpZiBub3QgeC5zdGFydHN3aXRoKHkpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgbiA9IGxlbih5KQogICAgcmV0dXJuIHhbbl0gPT0gJy4nCgoKY2xhc3MgTm9ybWFsaXplZE1hdGNoZXIoTWF0Y2hlcik6CiAgICB2ZXJzaW9uX2NsYXNzID0gTm9ybWFsaXplZFZlcnNpb24KCiAgICAjIHZhbHVlIGlzIGVpdGhlciBhIGNhbGxhYmxlIG9yIHRoZSBuYW1lIG9mIGEgbWV0aG9kCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICd+PSc6ICdfbWF0Y2hfY29tcGF0aWJsZScsCiAgICAgICAgJzwnOiAnX21hdGNoX2x0JywKICAgICAgICAnPic6ICdfbWF0Y2hfZ3QnLAogICAgICAgICc8PSc6ICdfbWF0Y2hfbGUnLAogICAgICAgICc+PSc6ICdfbWF0Y2hfZ2UnLAogICAgICAgICc9PSc6ICdfbWF0Y2hfZXEnLAogICAgICAgICc9PT0nOiAnX21hdGNoX2FyYml0cmFyeScsCiAgICAgICAgJyE9JzogJ19tYXRjaF9uZScsCiAgICB9CgogICAgZGVmIF9hZGp1c3RfbG9jYWwoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICBpZiBwcmVmaXg6CiAgICAgICAgICAgIHN0cmlwX2xvY2FsID0gJysnIG5vdCBpbiBjb25zdHJhaW50IGFuZCB2ZXJzaW9uLl9wYXJ0c1stMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICAjIGJvdGggY29uc3RyYWludCBhbmQgdmVyc2lvbiBhcmUKICAgICAgICAgICAgIyBOb3JtYWxpemVkVmVyc2lvbiBpbnN0YW5jZXMuCiAgICAgICAgICAgICMgSWYgY29uc3RyYWludCBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgY29tcG9uZW50LAogICAgICAgICAgICAjIGVuc3VyZSB0aGUgdmVyc2lvbiBkb2Vzbid0LCBlaXRoZXIuCiAgICAgICAgICAgIHN0cmlwX2xvY2FsID0gbm90IGNvbnN0cmFpbnQuX3BhcnRzWy0xXSBhbmQgdmVyc2lvbi5fcGFydHNbLTFdCiAgICAgICAgaWYgc3RyaXBfbG9jYWw6CiAgICAgICAgICAgIHMgPSB2ZXJzaW9uLl9zdHJpbmcuc3BsaXQoJysnLCAxKVswXQogICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uX2NsYXNzKHMpCiAgICAgICAgcmV0dXJuIHZlcnNpb24sIGNvbnN0cmFpbnQKCiAgICBkZWYgX21hdGNoX2x0KHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgdmVyc2lvbiA+PSBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZWxlYXNlX2NsYXVzZSA9IGNvbnN0cmFpbnQuX3JlbGVhc2VfY2xhdXNlCiAgICAgICAgcGZ4ID0gJy4nLmpvaW4oW3N0cihpKSBmb3IgaSBpbiByZWxlYXNlX2NsYXVzZV0pCiAgICAgICAgcmV0dXJuIG5vdCBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIHBmeCkKCiAgICBkZWYgX21hdGNoX2d0KHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgdmVyc2lvbiA8PSBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZWxlYXNlX2NsYXVzZSA9IGNvbnN0cmFpbnQuX3JlbGVhc2VfY2xhdXNlCiAgICAgICAgcGZ4ID0gJy4nLmpvaW4oW3N0cihpKSBmb3IgaSBpbiByZWxlYXNlX2NsYXVzZV0pCiAgICAgICAgcmV0dXJuIG5vdCBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIHBmeCkKCiAgICBkZWYgX21hdGNoX2xlKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgcmV0dXJuIHZlcnNpb24gPD0gY29uc3RyYWludAoKICAgIGRlZiBfbWF0Y2hfZ2Uoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICByZXR1cm4gdmVyc2lvbiA+PSBjb25zdHJhaW50CgogICAgZGVmIF9tYXRjaF9lcShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIGlmIG5vdCBwcmVmaXg6CiAgICAgICAgICAgIHJlc3VsdCA9ICh2ZXJzaW9uID09IGNvbnN0cmFpbnQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gX21hdGNoX3ByZWZpeCh2ZXJzaW9uLCBjb25zdHJhaW50KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX21hdGNoX2FyYml0cmFyeShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHJldHVybiBzdHIodmVyc2lvbikgPT0gc3RyKGNvbnN0cmFpbnQpCgogICAgZGVmIF9tYXRjaF9uZShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIGlmIG5vdCBwcmVmaXg6CiAgICAgICAgICAgIHJlc3VsdCA9ICh2ZXJzaW9uICE9IGNvbnN0cmFpbnQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gbm90IF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgY29uc3RyYWludCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9tYXRjaF9jb21wYXRpYmxlKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgdmVyc2lvbiA9PSBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGlmIHZlcnNpb24gPCBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKIyAgICAgICAgaWYgbm90IHByZWZpeDoKIyAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmVsZWFzZV9jbGF1c2UgPSBjb25zdHJhaW50Ll9yZWxlYXNlX2NsYXVzZQogICAgICAgIGlmIGxlbihyZWxlYXNlX2NsYXVzZSkgPiAxOgogICAgICAgICAgICByZWxlYXNlX2NsYXVzZSA9IHJlbGVhc2VfY2xhdXNlWzotMV0KICAgICAgICBwZnggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHJlbGVhc2VfY2xhdXNlXSkKICAgICAgICByZXR1cm4gX21hdGNoX3ByZWZpeCh2ZXJzaW9uLCBwZngpCgpfUkVQTEFDRU1FTlRTID0gKAogICAgKHJlLmNvbXBpbGUoJ1suKy1dJCcpLCAnJyksICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgcHVuY3RzCiAgICAocmUuY29tcGlsZShyJ15bLl0oXGQpJyksIHInMC5cMScpLCAgICAgICAgICAgICAjIC5OIC0+IDAuTiBhdCBzdGFydAogICAgKHJlLmNvbXBpbGUoJ15bLi1dJyksICcnKSwgICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgbGVhZGluZyBwdW5jdHMKICAgIChyZS5jb21waWxlKHInXlwoKC4qKVwpJCcpLCByJ1wxJyksICAgICAgICAgICAgICMgcmVtb3ZlIHBhcmVudGhlc2VzCiAgICAocmUuY29tcGlsZShyJ152KGVyc2lvbik/XHMqKFxkKyknKSwgcidcMicpLCAgICAjIHJlbW92ZSBsZWFkaW5nIHYoZXJzaW9uKQogICAgKHJlLmNvbXBpbGUocidecihldik/XHMqKFxkKyknKSwgcidcMicpLCAgICAgICAgIyByZW1vdmUgbGVhZGluZyB2KGVyc2lvbikKICAgIChyZS5jb21waWxlKCdbLl17Mix9JyksICcuJyksICAgICAgICAgICAgICAgICAgICMgbXVsdGlwbGUgcnVucyBvZiAnLicKICAgIChyZS5jb21waWxlKHInXGIoYWxmYXxhcGhhKVxiJyksICdhbHBoYScpLCAgICAgICMgbWlzc3BlbHQgYWxwaGEKICAgIChyZS5jb21waWxlKHInXGIocHJlLWFscGhhfHByZWFscGhhKVxiJyksCiAgICAgICAgICAgICAgICAncHJlLmFscGhhJyksICAgICAgICAgICAgICAgICAgICAgICAjIHN0YW5kYXJkaXNlCiAgICAocmUuY29tcGlsZShyJ1woYmV0YVwpJCcpLCAnYmV0YScpLCAgICAgICAgICAgICAjIHJlbW92ZSBwYXJlbnRoZXNlcwopCgpfU1VGRklYX1JFUExBQ0VNRU5UUyA9ICgKICAgIChyZS5jb21waWxlKCdeWzp+Ll8rLV0rJyksICcnKSwgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgbGVhZGluZyBwdW5jdHMKICAgIChyZS5jb21waWxlKCdbLCoiKShbXF1dJyksICcnKSwgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdW53YW50ZWQgY2hhcnMKICAgIChyZS5jb21waWxlKCdbfjorXyAtXScpLCAnLicpLCAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlIGlsbGVnYWwgY2hhcnMKICAgIChyZS5jb21waWxlKCdbLl17Mix9JyksICcuJyksICAgICAgICAgICAgICAgICAgICMgbXVsdGlwbGUgcnVucyBvZiAnLicKICAgIChyZS5jb21waWxlKHInXC4kJyksICcnKSwgICAgICAgICAgICAgICAgICAgICAgICMgdHJhaWxpbmcgJy4nCikKCl9OVU1FUklDX1BSRUZJWCA9IHJlLmNvbXBpbGUocicoXGQrKFwuXGQrKSopJykKCgpkZWYgX3N1Z2dlc3Rfc2VtYW50aWNfdmVyc2lvbihzKToKICAgICIiIgogICAgVHJ5IHRvIHN1Z2dlc3QgYSBzZW1hbnRpYyBmb3JtIGZvciBhIHZlcnNpb24gZm9yIHdoaWNoCiAgICBfc3VnZ2VzdF9ub3JtYWxpemVkX3ZlcnNpb24gY291bGRuJ3QgY29tZSB1cCB3aXRoIGFueXRoaW5nLgogICAgIiIiCiAgICByZXN1bHQgPSBzLnN0cmlwKCkubG93ZXIoKQogICAgZm9yIHBhdCwgcmVwbCBpbiBfUkVQTEFDRU1FTlRTOgogICAgICAgIHJlc3VsdCA9IHBhdC5zdWIocmVwbCwgcmVzdWx0KQogICAgaWYgbm90IHJlc3VsdDoKICAgICAgICByZXN1bHQgPSAnMC4wLjAnCgogICAgIyBOb3cgbG9vayBmb3IgbnVtZXJpYyBwcmVmaXgsIGFuZCBzZXBhcmF0ZSBpdCBvdXQgZnJvbQogICAgIyB0aGUgcmVzdC4KICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgIG0gPSBfTlVNRVJJQ19QUkVGSVgubWF0Y2gocmVzdWx0KQogICAgaWYgbm90IG06CiAgICAgICAgcHJlZml4ID0gJzAuMC4wJwogICAgICAgIHN1ZmZpeCA9IHJlc3VsdAogICAgZWxzZToKICAgICAgICBwcmVmaXggPSBtLmdyb3VwcygpWzBdLnNwbGl0KCcuJykKICAgICAgICBwcmVmaXggPSBbaW50KGkpIGZvciBpIGluIHByZWZpeF0KICAgICAgICB3aGlsZSBsZW4ocHJlZml4KSA8IDM6CiAgICAgICAgICAgIHByZWZpeC5hcHBlbmQoMCkKICAgICAgICBpZiBsZW4ocHJlZml4KSA9PSAzOgogICAgICAgICAgICBzdWZmaXggPSByZXN1bHRbbS5lbmQoKTpdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VmZml4ID0gJy4nLmpvaW4oW3N0cihpKSBmb3IgaSBpbiBwcmVmaXhbMzpdXSkgKyByZXN1bHRbbS5lbmQoKTpdCiAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6M10KICAgICAgICBwcmVmaXggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHByZWZpeF0pCiAgICAgICAgc3VmZml4ID0gc3VmZml4LnN0cmlwKCkKICAgIGlmIHN1ZmZpeDoKICAgICAgICAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgIyBtYXNzYWdlIHRoZSBzdWZmaXguCiAgICAgICAgZm9yIHBhdCwgcmVwbCBpbiBfU1VGRklYX1JFUExBQ0VNRU5UUzoKICAgICAgICAgICAgc3VmZml4ID0gcGF0LnN1YihyZXBsLCBzdWZmaXgpCgogICAgaWYgbm90IHN1ZmZpeDoKICAgICAgICByZXN1bHQgPSBwcmVmaXgKICAgIGVsc2U6CiAgICAgICAgc2VwID0gJy0nIGlmICdkZXYnIGluIHN1ZmZpeCBlbHNlICcrJwogICAgICAgIHJlc3VsdCA9IHByZWZpeCArIHNlcCArIHN1ZmZpeAogICAgaWYgbm90IGlzX3NlbXZlcihyZXN1bHQpOgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgIHJldHVybiByZXN1bHQKCgpkZWYgX3N1Z2dlc3Rfbm9ybWFsaXplZF92ZXJzaW9uKHMpOgogICAgIiIiU3VnZ2VzdCBhIG5vcm1hbGl6ZWQgdmVyc2lvbiBjbG9zZSB0byB0aGUgZ2l2ZW4gdmVyc2lvbiBzdHJpbmcuCgogICAgSWYgeW91IGhhdmUgYSB2ZXJzaW9uIHN0cmluZyB0aGF0IGlzbid0IHJhdGlvbmFsIChpLmUuIE5vcm1hbGl6ZWRWZXJzaW9uCiAgICBkb2Vzbid0IGxpa2UgaXQpIHRoZW4geW91IG1pZ2h0IGJlIGFibGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgKG9yIGNsb3NlKQogICAgcmF0aW9uYWwgdmVyc2lvbiBmcm9tIHRoaXMgZnVuY3Rpb24uCgogICAgVGhpcyBkb2VzIGEgbnVtYmVyIG9mIHNpbXBsZSBub3JtYWxpemF0aW9ucyB0byB0aGUgZ2l2ZW4gc3RyaW5nLCBiYXNlZAogICAgb24gb2JzZXJ2YXRpb24gb2YgdmVyc2lvbnMgY3VycmVudGx5IGluIHVzZSBvbiBQeVBJLiBHaXZlbiBhIGR1bXAgb2YKICAgIHRob3NlIHZlcnNpb24gZHVyaW5nIFB5Q29uIDIwMDksIDQyODcgb2YgdGhlbToKICAgIC0gMjMxMiAoNTMuOTMlKSBtYXRjaCBOb3JtYWxpemVkVmVyc2lvbiB3aXRob3V0IGNoYW5nZQogICAgICB3aXRoIHRoZSBhdXRvbWF0aWMgc3VnZ2VzdGlvbgogICAgLSAzNDc0ICg4MS4wNCUpIG1hdGNoIHdoZW4gdXNpbmcgdGhpcyBzdWdnZXN0aW9uIG1ldGhvZAoKICAgIEBwYXJhbSBzIHtzdHJ9IEFuIGlycmF0aW9uYWwgdmVyc2lvbiBzdHJpbmcuCiAgICBAcmV0dXJucyBBIHJhdGlvbmFsIHZlcnNpb24gc3RyaW5nLCBvciBOb25lLCBpZiBjb3VsZG4ndCBkZXRlcm1pbmUgb25lLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgX25vcm1hbGl6ZWRfa2V5KHMpCiAgICAgICAgcmV0dXJuIHMgICAjIGFscmVhZHkgcmF0aW9uYWwKICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICBwYXNzCgogICAgcnMgPSBzLmxvd2VyKCkKCiAgICAjIHBhcnQgb2YgdGhpcyBjb3VsZCB1c2UgbWFrZXRyYW5zCiAgICBmb3Igb3JpZywgcmVwbCBpbiAoKCctYWxwaGEnLCAnYScpLCAoJy1iZXRhJywgJ2InKSwgKCdhbHBoYScsICdhJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCdiZXRhJywgJ2InKSwgKCdyYycsICdjJyksICgnLWZpbmFsJywgJycpLAogICAgICAgICAgICAgICAgICAgICAgICgnLXByZScsICdjJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCctcmVsZWFzZScsICcnKSwgKCcucmVsZWFzZScsICcnKSwgKCctc3RhYmxlJywgJycpLAogICAgICAgICAgICAgICAgICAgICAgICgnKycsICcuJyksICgnXycsICcuJyksICgnICcsICcnKSwgKCcuZmluYWwnLCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCdmaW5hbCcsICcnKSk6CiAgICAgICAgcnMgPSBycy5yZXBsYWNlKG9yaWcsIHJlcGwpCgogICAgIyBpZiBzb21ldGhpbmcgZW5kcyB3aXRoIGRldiBvciBwcmUsIHdlIGFkZCBhIDAKICAgIHJzID0gcmUuc3ViKHIicHJlJCIsIHIicHJlMCIsIHJzKQogICAgcnMgPSByZS5zdWIociJkZXYkIiwgciJkZXYwIiwgcnMpCgogICAgIyBpZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlICJiLTIiIG9yICJhLjIiIGF0IHRoZSBlbmQgb2YgdGhlCiAgICAjIHZlcnNpb24sIHRoYXQgaXMgcHJvYmFibHkgYmV0YSwgYWxwaGEsIGV0YwogICAgIyBsZXQncyByZW1vdmUgdGhlIGRhc2ggb3IgZG90CiAgICBycyA9IHJlLnN1YihyIihbYWJjXXxyYylbXC1cLl0oXGQrKSQiLCByIlwxXDIiLCBycykKCiAgICAjIDEuMC1kZXYtcjM3MSAtPiAxLjAuZGV2MzcxCiAgICAjIDAuMS1kZXYtcjc5IC0+IDAuMS5kZXY3OQogICAgcnMgPSByZS5zdWIociJbXC1cLl0oZGV2KVtcLVwuXT9yPyhcZCspJCIsIHIiLlwxXDIiLCBycykKCiAgICAjIENsZWFuOiAyLjAuYS4zLCAyLjAuYjEsIDAuOS4wfmMxCiAgICBycyA9IHJlLnN1YihyIlsufl0/KFthYmNdKVwuPyIsIHIiXDEiLCBycykKCiAgICAjIENsZWFuOiB2MC4zLCB2MS4wCiAgICBpZiBycy5zdGFydHN3aXRoKCd2Jyk6CiAgICAgICAgcnMgPSByc1sxOl0KCiAgICAjIENsZWFuIGxlYWRpbmcgJzAncyBvbiBudW1iZXJzLgogICAgI1RPRE86IHVuaW50ZW5kZWQgc2lkZS1lZmZlY3Qgb24sIGUuZy4sICIyMDAzLjA1LjA5IgogICAgIyBQeVBJIHN0YXRzOiA3NyAofjIlKSBiZXR0ZXIKICAgIHJzID0gcmUuc3ViKHIiXGIwKyhcZCspKD8hXGQpIiwgciJcMSIsIHJzKQoKICAgICMgQ2xlYW4gYS9iL2Mgd2l0aCBubyB2ZXJzaW9uLiBFLmcuICIxLjBhIiAtPiAiMS4wYTAiLiBTZXR1cHRvb2xzIGluZmVycwogICAgIyB6ZXJvLgogICAgIyBQeVBJIHN0YXRzOiAyNDUgKDcuNTYlKSBiZXR0ZXIKICAgIHJzID0gcmUuc3ViKHIiKFxkK1thYmNdKSQiLCByIlxnPDE+MCIsIHJzKQoKICAgICMgdGhlICdkZXYtck5OTicgdGFnIGlzIGEgZGV2IHRhZwogICAgcnMgPSByZS5zdWIociJcLj8oZGV2LXJ8ZGV2XC5yKVwuPyhcZCspJCIsIHIiLmRldlwyIiwgcnMpCgogICAgIyBjbGVhbiB0aGUgLSB3aGVuIHVzZWQgYXMgYSBwcmUgZGVsaW1pdGVyCiAgICBycyA9IHJlLnN1YihyIi0oYXxifGMpKFxkKykkIiwgciJcMVwyIiwgcnMpCgogICAgIyBhIHRlcm1pbmFsICJkZXYiIG9yICJkZXZlbCIgY2FuIGJlIGNoYW5nZWQgaW50byAiLmRldjAiCiAgICBycyA9IHJlLnN1YihyIltcLlwtXShkZXZ8ZGV2ZWwpJCIsIHIiLmRldjAiLCBycykKCiAgICAjIGEgdGVybWluYWwgImRldiIgY2FuIGJlIGNoYW5nZWQgaW50byAiLmRldjAiCiAgICBycyA9IHJlLnN1YihyIig/IVtcLlwtXSlkZXYkIiwgciIuZGV2MCIsIHJzKQoKICAgICMgYSB0ZXJtaW5hbCAiZmluYWwiIG9yICJzdGFibGUiIGNhbiBiZSByZW1vdmVkCiAgICBycyA9IHJlLnN1YihyIihmaW5hbHxzdGFibGUpJCIsICIiLCBycykKCiAgICAjIFRoZSAncicgYW5kIHRoZSAnLScgdGFncyBhcmUgcG9zdCByZWxlYXNlIHRhZ3MKICAgICMgICAwLjRhMS5yMTAgICAgICAgLT4gIDAuNGExLnBvc3QxMAogICAgIyAgIDAuOS4zMy0xNzIyMiAgICAtPiAgMC45LjMzLnBvc3QxNzIyMgogICAgIyAgIDAuOS4zMy1yMTcyMjIgICAtPiAgMC45LjMzLnBvc3QxNzIyMgogICAgcnMgPSByZS5zdWIociJcLj8ocnwtfC1yKVwuPyhcZCspJCIsIHIiLnBvc3RcMiIsIHJzKQoKICAgICMgQ2xlYW4gJ3InIGluc3RlYWQgb2YgJ2RldicgdXNhZ2U6CiAgICAjICAgMC45LjMzK3IxNzIyMiAgIC0+ICAwLjkuMzMuZGV2MTcyMjIKICAgICMgICAxLjBkZXYxMjMgICAgICAgLT4gIDEuMC5kZXYxMjMKICAgICMgICAxLjAuZ2l0MTIzICAgICAgLT4gIDEuMC5kZXYxMjMKICAgICMgICAxLjAuYnpyMTIzICAgICAgLT4gIDEuMC5kZXYxMjMKICAgICMgICAwLjFhMGRldi4xMjMgICAgLT4gIDAuMWEwLmRldjEyMwogICAgIyBQeVBJIHN0YXRzOiAgfjE1MCAofjQlKSBiZXR0ZXIKICAgIHJzID0gcmUuc3ViKHIiXC4/KGRldnxnaXR8YnpyKVwuPyhcZCspJCIsIHIiLmRldlwyIiwgcnMpCgogICAgIyBDbGVhbiAnLnByZScgKG5vcm1hbGl6ZWQgZnJvbSAnLXByZScgYWJvdmUpIGluc3RlYWQgb2YgJ2MnIHVzYWdlOgogICAgIyAgIDAuMi5wcmUxICAgICAgICAtPiAgMC4yYzEKICAgICMgICAwLjItYzEgICAgICAgICAtPiAgMC4yYzEKICAgICMgICAxLjBwcmV2aWV3MTIzICAgLT4gIDEuMGMxMjMKICAgICMgUHlQSSBzdGF0czogfjIxICgwLjYyJSkgYmV0dGVyCiAgICBycyA9IHJlLnN1YihyIlwuPyhwcmV8cHJldmlld3wtYykoXGQrKSQiLCByImNcZzwyPiIsIHJzKQoKICAgICMgVGNsL1RrIHVzZXMgInB4IiBmb3IgdGhlaXIgcG9zdCByZWxlYXNlIG1hcmtlcnMKICAgIHJzID0gcmUuc3ViKHIicChcZCspJCIsIHIiLnBvc3RcMSIsIHJzKQoKICAgIHRyeToKICAgICAgICBfbm9ybWFsaXplZF9rZXkocnMpCiAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgcnMgPSBOb25lCiAgICByZXR1cm4gcnMKCiMKIyAgIExlZ2FjeSB2ZXJzaW9uIHByb2Nlc3NpbmcgKGRpc3RyaWJ1dGUtY29tcGF0aWJsZSkKIwoKX1ZFUlNJT05fUEFSVCA9IHJlLmNvbXBpbGUocicoW2Etel0rfFxkK3xbXC4tXSknLCByZS5JKQpfVkVSU0lPTl9SRVBMQUNFID0gewogICAgJ3ByZSc6ICdjJywKICAgICdwcmV2aWV3JzogJ2MnLAogICAgJy0nOiAnZmluYWwtJywKICAgICdyYyc6ICdjJywKICAgICdkZXYnOiAnQCcsCiAgICAnJzogTm9uZSwKICAgICcuJzogTm9uZSwKfQoKCmRlZiBfbGVnYWN5X2tleShzKToKICAgIGRlZiBnZXRfcGFydHMocyk6CiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICBmb3IgcCBpbiBfVkVSU0lPTl9QQVJULnNwbGl0KHMubG93ZXIoKSk6CiAgICAgICAgICAgIHAgPSBfVkVSU0lPTl9SRVBMQUNFLmdldChwLCBwKQogICAgICAgICAgICBpZiBwOgogICAgICAgICAgICAgICAgaWYgJzAnIDw9IHBbOjFdIDw9ICc5JzoKICAgICAgICAgICAgICAgICAgICBwID0gcC56ZmlsbCg4KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwID0gJyonICsgcAogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwKQogICAgICAgIHJlc3VsdC5hcHBlbmQoJypmaW5hbCcpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIHJlc3VsdCA9IFtdCiAgICBmb3IgcCBpbiBnZXRfcGFydHMocyk6CiAgICAgICAgaWYgcC5zdGFydHN3aXRoKCcqJyk6CiAgICAgICAgICAgIGlmIHAgPCAnKmZpbmFsJzoKICAgICAgICAgICAgICAgIHdoaWxlIHJlc3VsdCBhbmQgcmVzdWx0Wy0xXSA9PSAnKmZpbmFsLSc6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBvcCgpCiAgICAgICAgICAgIHdoaWxlIHJlc3VsdCBhbmQgcmVzdWx0Wy0xXSA9PSAnMDAwMDAwMDAnOgogICAgICAgICAgICAgICAgcmVzdWx0LnBvcCgpCiAgICAgICAgcmVzdWx0LmFwcGVuZChwKQogICAgcmV0dXJuIHR1cGxlKHJlc3VsdCkKCgpjbGFzcyBMZWdhY3lWZXJzaW9uKFZlcnNpb24pOgogICAgZGVmIHBhcnNlKHNlbGYsIHMpOgogICAgICAgIHJldHVybiBfbGVnYWN5X2tleShzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBmb3IgeCBpbiBzZWxmLl9wYXJ0czoKICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UoeCwgc3RyaW5nX3R5cGVzKSBhbmQgeC5zdGFydHN3aXRoKCcqJykgYW5kCiAgICAgICAgICAgICAgICB4IDwgJypmaW5hbCcpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTGVnYWN5TWF0Y2hlcihNYXRjaGVyKToKICAgIHZlcnNpb25fY2xhc3MgPSBMZWdhY3lWZXJzaW9uCgogICAgX29wZXJhdG9ycyA9IGRpY3QoTWF0Y2hlci5fb3BlcmF0b3JzKQogICAgX29wZXJhdG9yc1snfj0nXSA9ICdfbWF0Y2hfY29tcGF0aWJsZScKCiAgICBudW1lcmljX3JlID0gcmUuY29tcGlsZSgnXihcZCsoXC5cZCspKiknKQoKICAgIGRlZiBfbWF0Y2hfY29tcGF0aWJsZShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIGlmIHZlcnNpb24gPCBjb25zdHJhaW50OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBtID0gc2VsZi5udW1lcmljX3JlLm1hdGNoKHN0cihjb25zdHJhaW50KSkKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0Nhbm5vdCBjb21wdXRlIGNvbXBhdGlibGUgbWF0Y2ggZm9yIHZlcnNpb24gJXMgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAnIGFuZCBjb25zdHJhaW50ICVzJywgdmVyc2lvbiwgY29uc3RyYWludCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBzID0gbS5ncm91cHMoKVswXQogICAgICAgIGlmICcuJyBpbiBzOgogICAgICAgICAgICBzID0gcy5yc3BsaXQoJy4nLCAxKVswXQogICAgICAgIHJldHVybiBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIHMpCgojCiMgICBTZW1hbnRpYyB2ZXJzaW9uaW5nCiMKCl9TRU1WRVJfUkUgPSByZS5jb21waWxlKHInXihcZCspXC4oXGQrKVwuKFxkKyknCiAgICAgICAgICAgICAgICAgICAgICAgIHInKC1bYS16MC05XSsoXC5bYS16MC05LV0rKSopPycKICAgICAgICAgICAgICAgICAgICAgICAgcicoXCtbYS16MC05XSsoXC5bYS16MC05LV0rKSopPyQnLCByZS5JKQoKCmRlZiBpc19zZW12ZXIocyk6CiAgICByZXR1cm4gX1NFTVZFUl9SRS5tYXRjaChzKQoKCmRlZiBfc2VtYW50aWNfa2V5KHMpOgogICAgZGVmIG1ha2VfdHVwbGUocywgYWJzZW50KToKICAgICAgICBpZiBzIGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IChhYnNlbnQsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhcnRzID0gc1sxOl0uc3BsaXQoJy4nKQogICAgICAgICAgICAjIFdlIGNhbid0IGNvbXBhcmUgaW50cyBhbmQgc3RyaW5ncyBvbiBQeXRob24gMywgc28gZnVkZ2UgaXQKICAgICAgICAgICAgIyBieSB6ZXJvLWZpbGxpbmcgbnVtZXJpYyB2YWx1ZXMgc28gc2ltdWxhdGUgYSBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgcmVzdWx0ID0gdHVwbGUoW3AuemZpbGwoOCkgaWYgcC5pc2RpZ2l0KCkgZWxzZSBwIGZvciBwIGluIHBhcnRzXSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgbSA9IGlzX3NlbXZlcihzKQogICAgaWYgbm90IG06CiAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IocykKICAgIGdyb3VwcyA9IG0uZ3JvdXBzKCkKICAgIG1ham9yLCBtaW5vciwgcGF0Y2ggPSBbaW50KGkpIGZvciBpIGluIGdyb3Vwc1s6M11dCiAgICAjIGNob29zZSB0aGUgJ3wnIGFuZCAnKicgc28gdGhhdCB2ZXJzaW9ucyBzb3J0IGNvcnJlY3RseQogICAgcHJlLCBidWlsZCA9IG1ha2VfdHVwbGUoZ3JvdXBzWzNdLCAnfCcpLCBtYWtlX3R1cGxlKGdyb3Vwc1s1XSwgJyonKQogICAgcmV0dXJuIChtYWpvciwgbWlub3IsIHBhdGNoKSwgcHJlLCBidWlsZAoKCmNsYXNzIFNlbWFudGljVmVyc2lvbihWZXJzaW9uKToKICAgIGRlZiBwYXJzZShzZWxmLCBzKToKICAgICAgICByZXR1cm4gX3NlbWFudGljX2tleShzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnRzWzFdWzBdICE9ICd8JwoKCmNsYXNzIFNlbWFudGljTWF0Y2hlcihNYXRjaGVyKToKICAgIHZlcnNpb25fY2xhc3MgPSBTZW1hbnRpY1ZlcnNpb24KCgpjbGFzcyBWZXJzaW9uU2NoZW1lKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCBtYXRjaGVyLCBzdWdnZXN0ZXI9Tm9uZSk6CiAgICAgICAgc2VsZi5rZXkgPSBrZXkKICAgICAgICBzZWxmLm1hdGNoZXIgPSBtYXRjaGVyCiAgICAgICAgc2VsZi5zdWdnZXN0ZXIgPSBzdWdnZXN0ZXIKCiAgICBkZWYgaXNfdmFsaWRfdmVyc2lvbihzZWxmLCBzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYubWF0Y2hlci52ZXJzaW9uX2NsYXNzKHMpCiAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBpc192YWxpZF9tYXRjaGVyKHNlbGYsIHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5tYXRjaGVyKHMpCiAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBpc192YWxpZF9jb25zdHJhaW50X2xpc3Qoc2VsZiwgcyk6CiAgICAgICAgIiIiCiAgICAgICAgVXNlZCBmb3IgcHJvY2Vzc2luZyBzb21lIG1ldGFkYXRhIGZpZWxkcwogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmlzX3ZhbGlkX21hdGNoZXIoJ2R1bW15X25hbWUgKCVzKScgJSBzKQoKICAgIGRlZiBzdWdnZXN0KHNlbGYsIHMpOgogICAgICAgIGlmIHNlbGYuc3VnZ2VzdGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLnN1Z2dlc3RlcihzKQogICAgICAgIHJldHVybiByZXN1bHQKCl9TQ0hFTUVTID0gewogICAgJ25vcm1hbGl6ZWQnOiBWZXJzaW9uU2NoZW1lKF9ub3JtYWxpemVkX2tleSwgTm9ybWFsaXplZE1hdGNoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1Z2dlc3Rfbm9ybWFsaXplZF92ZXJzaW9uKSwKICAgICdsZWdhY3knOiBWZXJzaW9uU2NoZW1lKF9sZWdhY3lfa2V5LCBMZWdhY3lNYXRjaGVyLCBsYW1iZGEgc2VsZiwgczogcyksCiAgICAnc2VtYW50aWMnOiBWZXJzaW9uU2NoZW1lKF9zZW1hbnRpY19rZXksIFNlbWFudGljTWF0Y2hlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1Z2dlc3Rfc2VtYW50aWNfdmVyc2lvbiksCn0KCl9TQ0hFTUVTWydkZWZhdWx0J10gPSBfU0NIRU1FU1snbm9ybWFsaXplZCddCgoKZGVmIGdldF9zY2hlbWUo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dQz/dQjoH////4PEDIlF5MdF/P7////oCQAAAItF5OikCwAAw/91COjTBAAAWcOL/1WL7FaLdQhXg8//hfZ1FOjuCgAAxwAWAAAA6JEKAAALx+tE9kYMg3Q4VujrLgAAVov46NYxAABW6DUqAABQ6AYxAACDxBCFwHkFg8//6xKLRhyFwHQLUOj99///g2YcAFmDZgwAi8dfXl3DagxokN9AAOjbCgAAg03k/zPAi3UIhfYPlcCFwHUV6HQKAADHABYAAADoFwoAAIPI/+sN9kYMQHQNg2YMAItF5OjnCgAAw1bopQMAAFmDZfwAVug8////WYlF5MdF/P7////oBQAAAOvUi3UIVujyAwAAWcOL/1WL7IM9HP9AAAF1BegxGwAA/3UI6HoZAABo/wAAAOiV9P//WVldw2pYaLDfQADoPgoAAI1FmFD/FXDAQAAz9jk1yB5BAHULVlZqAVb/FWzAQAC4TVoAAGY5BQAAQAB0BYl15Os2oTwAQACBuAAAQABQRQAAdeq5CwEAAGY5iBgAQAB13IO4dABAAA520zPJObDoAEAAD5XBiU3k6NsaAACFwHUIahzoU////1noTBQAAIXAdQhqEOhC////WejwFgAAiXX86OEpAACFwHkIahvohfb//1n/FWjAQACjxB5BAOihNQAAoxT/QADo3DQAAIXAeQhqCOhf9v//WehVMgAAhcB5CGoJ6E72//9ZagHoJfT//1k7xnQHUOg79v//WejSMQAA9kXEAXQGD7dNyOsDagpZUVBWaAAAQADoC/L//4lF4Dl15HUGUOjB9f//6Oj1///rLotF7IsIiwmJTdxQUehGMAAAWVnDi2Xoi0XciUXgg33kAHUGUOin9f//6Mf1///HRfz+////i0Xg6CMJAADD6IU1AADpif7//4v/VYvsgewoAwAAoygAQQCJDSQAQQCJFSAAQQCJHRwAQQCJNRgAQQCJPRQAQQBmjBVAAEEAZowNNABBAGaMHRAAQQBmjAUMAEEAZowlCABBAGaMLQQAQQCcjwU4AEEAi0UAoywAQQCLRQSjMABBAI1FCKM8AEEAi4Xg/P//xwV4/0AAAQABAKEwAEEAoyz/QADHBSD/QAAJBADAxwUk/0AAAQAAAKEE8EAAiYXY/P//oQjwQACJhdz8////FYDAQACjcP9AAGoB6E41AABZagD/FXzA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sD/ofv///4N9DAB/1YM/AHUFi0X8iQdeycOL/1WL7IHsgAIAAKEE8EAAM8WJRfxTi10MVot1CDPAV4t9FP91EI2NrP3//4m10P3//4m95P3//4mFqP3//4mF8P3//4mFyP3//4mF6P3//4mFzP3//4mFpP3//4mFxP3//+gCyP//6Mmy//+JhZz9//+F9nUr6Lqy///HABYAAADoXbL//4C9uP3//wB0CouFtP3//4NgcP2DyP/pYQsAAPZGDEB1Xlbo+NH//1m6WPZAAIP4/3Qbg/j+dBaLyIPhH4vwwf4FweEGAwy1oA1BAOsCi8r2QSR/dZuD+P90GYP4/nQUi8iD4B/B+QXB4AYDBI2gDUEA6wKLwvZAJIAPhXH///8z9jveD4Rn////ihOJtdz9//+Jtdj9//+Jtbz9//+JtaD9//+Ile/9//+E0g+EsgoAAEOJncD9//85tdz9//8PjIkKAACNQuA8WHcPD77CD7aAINlAAIPgD+sCM8CLjbz9//9rwAkPtoQIQNlAAGoIwegEXomFvP3//zvGD4Tv/v//agdZO8EPhyAKAAD/JIXfh0AAM8CDjej9////iYWM/f//iYWk/f//iYXI/f//iYXM/f//iYXw/f//iYXE/f//6ecJAAAPvsKD6CB0SIPoA3Q0K8Z0JEhIdBSD6AMPhckJAAAJtfD9///pvgkAAION8P3//wTpsgkAAION8P3//wHppgkAAIGN8P3//4AAAADplwkAAION8P3//wLpiwkAAID6KnUsg8cEib3k/f//i3/8ib3I/f//hf8PiWwJAACDjfD9//8E953I/f//6VoJAACLhcj9//9rwAoPvsqNRAjQiYXI/f//6T8JAACDpej9//8A6TMJAACA+ip1JoPHBIm95P3//4t//Im96P3//4X/D4kUCQAAg43o/f///+kICQAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+ntCAAAgPpJdFWA+mh0RID6bHQYgPp3D4XVCAAAgY3w/f//AAgAAOnGCAAAgDtsdRZDgY3w/f//ABAAAImdwP3//+mrCAAAg43w/f//EOmfCAAAg43w/f//IOmTCAAAigM8NnUegHsBNHUYg8MCgY3w/f//AIAAAImdwP3//+lvCAAAPDN1HoB7ATJ1GIPDAoGl8P3///9///+JncD9///pTQgAADxkD4RFCAAAPGkPhD0IAAA8bw+ENQgAADx1D4QtCAAAPHgPhCUIAAA8WA+EHQgAAIOlvP3//wCDpcT9//8AjYWs/f//UA+2wlDoLRUAAFmFwIqF7/3//1l0IouN0P3//4213P3//+ib+///igNDiZ3A/f//hMAPhJX8//+LjdD9//+Ntdz9///oefv//+m7BwAAD77Cg/hkD4+3AQAAD4RVAgAAg/hTD4+6AAAAdEyD6EF0EEhIdCRISHQISEgPhagFAACAwiDHhYz9//8BAAAAiJXv/f//6VMCAAD3hfD9//8wCAAAD4WeAAAAgY3w/f//AAgAAOmPAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3k/f//i3/8ib3g/f//D4T7BAAAhf91C6E0/kAAiYXg/f//i4Xg/f//x4XE/f//AQAAAOnJBAAAg+hYD4QcAwAASEh0fyvBD4SzAQAASEgPhegEAACLveT9//+DxwT3hfD9//8QCAAAib3k/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F2P3//1Do5zUAAIPEEIXAdB/HhaT9//8BAAAA6xOKR/yIhfT9///Hhdj9//8BAAAAjYX0/f//iYXg/f//6XkEAACLB4PHBIm95P3//4XAdDyLSASFyXQ194Xw/f//AAgAAA+/AImN4P3//3QUmSvC0fjHhcT9//8BAAAA6TQEAACDpcT9//8A6SgEAAChMP5AAImF4P3//1DowfX//1npEQQAAIP4cA+PNgIAAA+EIgIAAIP4ZQ+M/wMAAIP4Zw+OswAAAIP4aXR4g/hudCqD+G8PheMDAAD2hfD9//+Ai73k/f//ibXY/f//dGyBjfD9//8AAgAA62CDheT9//8Ei4Xk/f//i3D86HYRAACFwA+ESvr///aF8P3//yB0DGaLhdz9//9miQbrCIuF3P3//4kGx4Wk/f//AQAAAOk+BQAAi73k/f//g43w/f//QMeF2P3//woAAACLjfD9///3wQCAAAAPhN0BAAAD/otH+ItX/OkJAgAAi73k/f//g43w/f//QIO96P3//wCNnfT9//+4AAIAAImd4P3//4mFmP3//30Mx4Xo/f//BgAAAOtqdRGA+md1Y8eF6P3//wEAAADrVzmF6P3//34GiYXo/f//gb3o/f//owAAAH49i7Xo/f//gcZdAQAAVujP2f//ipXv/f//WYmFoP3//4XAdBCJheD9//+JtZj9//+L2OsKx4Xo/f//owAAAIsHizVYwEAAg8cIiYWA/f//i0f8iYWE/f//jYWs/f//UP+1jP3//w++wv+16P3//4m95P3//1D/tZj9//+NhYD9//9TUP81QPVAAP/W/9CLvfD9//+DxByB54AAAAB0HYO96P3//wB1FI2FrP3//1BT/zVM9UAA/9b/0FlZgL3v/f//Z3UYhf91FI2FrP3//1BT/zVI9UAA/9b/0FlZgDstdRGBjfD9//8AAQAAQ4md4P3//1PpxP3//4m16P3//4mNqP3//+sqg+hzD4R0/P//SEgPhFv+//+D6AMPhb4BAACLveT9///Hhaj9//8nAAAA9oXw/f//gMeF2P3//xAAAAAPhDX+//+Khaj9//8EUcaF1P3//zCIhdX9///Hhcz9//8CAAAA6RH+///3wQAQAAAPhRf+//+DxwT2wSB0GIm95P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJveT9///2wUB0G4XSfxd8BIXAcxH32IPSAPfagY3w/f//AAEAAPeF8P3//wCQAACL+ovYdQIz/4O96P3//wB9DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8MLx3UGIYXM/f//jXXzi4Xo/f///43o/f//hcB/BovDC8d0LYuF2P3//5lSUFdT6AIQAACDwTCJnZj9//+L2Iv6g/k5fgYDjaj9//+IDk7rvY1F8yvGRveF8P3//wACAACJhdj9//+JteD9//90Y4XAdAeLzoA5MHRY/43g/f//i43g/f//xgEwQOtASWaDOAB0B4PAAoXJdfIrheD9///R+Osohf91C6Ew/kAAiYXg/f//i4Xg/f//6wdJgDgAdAVAhcl19SuF4P3//4mF2P3//4O9pP3//wAPhbgBAACLjfD9///2wUB0NffBAAEAAHQJxoXU/f//Lesa9sEBdAnGhdT9//8r6wz2wQJ0EcaF1P3//yDHhcz9//8BAAAAi4XI/f//K4XY/f//K4XM/f//iYWY/f//9sEMdSWL+Osdi43Q/f//jbXc/f//sCBP6Bj1//+Dvdz9////dASF/3/f/7XM/f//i72c/f//i53Q/f//jYXU/f//UI2F3P3//+ga9f//9oXw/f//CFlZdC72hfD9//8EdSWLvZj9///rGY213P3//4vLsDBP6Lv0//+Dvdz9////dASF/3/jg73E/f//AIuF2P3//3R1hcB+cYu14P3//4mFkP3//w+3Bv+NkP3//1BqBo1F9FCNhYj9//9Qg8YC6A0wAACDxBCFwHU2OYWI/f//dC7/tYj9//+LvZz9//+LndD9//+NRfRQjYXc/f//6HP0//+DvZD9//8AWVl1pusjg43c/f///+sai72c/f//UP+14P3//42F3P3//+hF9P//WVmDvdz9//8AfDL2hfD9//8EdCmLvZj9///rHYuN0P3//4213P3//7AgT+ji8///g73c/f///3QEhf9/34O9oP3//wB0E/+1oP3//+jilP//g6Wg/f//AFmLncD9//+KA4iF7/3//4TAdA+LveT9//8z9orQ6WT1//+Dvbz9//8AdA2Dvbz9//8HD4WN9P//gL24/f//AHQKi4W0/f//g2Bw/YuF3P3//4tN/F9eM81b6FeQ///Jw41JAGd/QABkfUAAln1AAPJ9QAA+fkAASn5AAJB+QADCf0AAi/9Vi+xRUYtFDFaLdQiJRfiLRRBXVolF/OjVGgAAg8//WTvHdRHo1qb//8cACQAAAIvHi9frSv91FI1N/FH/dfhQ/xXUwEAAiUX4O8d1E/8VPMBAAIXAdAlQ6Mim//9Z68+LxsH4BYsEhaANQQCD5h/B5gaNRDAEgCD9i0X4i1X8X17Jw2oUaAjiQADowKb//4PL/4ld3Ild4ItFCIP4/nUc6G2m//+DIADoUqb//8cACQAAAIvDi9PpoQAAAIXAeAg7BYANQQByGuhFpv//gyAA6Cqm///HAAkAAADozaX//+vRi8jB+QWNPI2gDUEAi/CD5h/B5gaLDw++TDEEg+EBdMZQ6FIaAABZg2X8AIsH9kQwBAF0HP91FP91EP91DP91COjX/v//g8QQiUXciVXg6xnoyKX//8cACQAAAOjQpf//gyAAiV3ciV3gx0X8/v///+gMAAAAi0Xci1Xg6DKm///D/3UI6I4aAABZw4v/VYvsuOQaAADowy0AAKEE8EAAM8WJRfyLRQxWi3UIVzP/iYU05f//ib045f//ib0w5f//OX0QdQczwOmuBgAAO8d1H+hbpf//iTjoQaX//8cAFgAAAOjkpP//g8j/6YsGAACLxsH4BYv+U40chaANQQCLA4PnH8HnBopMOCQCydD5iZ0k5f//iI0/5f//gPkCdAWA+QF1J4tNEPfR9sEBdR3o/aT//4MgAOjipP//xwAWAAAA6IWk///pHQYAAPZEOAQgdA9qAmoAagBW6L79//+DxBBW6D4HAABZhcAPhJkCAACLA/ZEBwSAD4SMAgAA6C6u//+LQGwzyTlIFI2FIOX//w+UwVCLA/80B4vx/xUYwUAAM8k7wQ+EYAIAADvxdAw4jT/l//8PhFACAAD/FRTBQACLnTTl//+JhSDl//8zwImFLOX//zlFEA+GIwUAAImFQOX//4qFP+X//4TAD4VnAQAAiguLtSTl//8zwID5Cg+UwImFHOX//4sGA8eDeDgAdBWKUDSIVfSITfWDYDgAagKNRfRQ60sPvsFQ6NAJAABZhcB0OouNNOX//yvLA00QM8BAO8gPhqUBAABqAo2FROX//1NQ6FQJAACDxAyD+P8PhJIEAABD/4VA5f//6xtqAVONhUTl//9Q6DAJAACDxAyD+P8PhG4EAAAzwFBQagWNTfRRagGNjUTl//9RUP+1IOX//0P/hUDl////FeDAQACL8IX2D4Q9BAAAagCNhSzl//9QVo1F9FCLhSTl//+LAP80B/8VwMBAAIXAD4QKBAAAi4VA5f//i40w5f//A8GJhTjl//85tSzl//8PjPYDAACDvRzl//8AD4TNAAAAagCNhSzl//9QagGNRfRQi4Uk5f//iwDGRfQN/zQH/xXAwEAAhcAPhLEDAACDvSzl//8BD4ywAwAA/4Uw5f///4U45f//6YMAAAA8AXQEPAJ1IQ+3MzPJg/4KD5TBg8MCg4VA5f//Aom1ROX//4mNHOX//zwBdAQ8AnVS/7VE5f//6HgqAABZZjuFROX//w+FSQMAAIOFOOX//wKDvRzl//8AdClqDVhQiYVE5f//6EsqAABZZjuFROX//w+FHAMAAP+FOOX///+FMOX//4tFEDmFQOX//w+C+f3//+kIAwAAiw6KE/+FOOX//4hUDzSLDolEDzjp7wIAADPJiwP2RDgEgA+EoQIAAIC9P+X//wCJjUTl//8PhagAAACLnTTl//85TRAPhv0CAACLyzP2K4005f//jYVI5f//O00QcyaKE0NBiZ0g5f//gPoKdQv/hTDl///GAA1ARogQQEaB/v8TAABy1YvwjYVI5f//K/BqAI2FKOX//1BWjYVI5f//UIuFJOX//4sA/zQH/xXAwEAAhcAPhEMCAACLhSjl//8BhTjl//87xg+MOwIAAIvDK4U05f//O0UQD4Js////6SUCAACAvT/l//8CD4XNAAAAi5005f//OU0QD4ZIAgAAg6VA5f//AIvLK4005f//agKNhUjl//9eO00Qc0MPtxMD3gPOiZ0g5f//g/oKdRoBtTDl//9qDVtmiRiLnSDl//8DxgG1QOX//wG1QOX//2aJEAPGgb1A5f///hMAAHK4i/CNhUjl//8r8GoAjYUo5f//UFaNhUjl//9Qi4Uk5f//iwD/NAf/FcDAQACFwA+EaQEAAIuFKOX//wGFOOX//zvGD4xhAQAAi8MrhTTl//87RRAPgkf////pSwEAAIuFNOX//4mFLOX//zlNEA+GdQEAAIuNLOX//4OlQOX//wArjTTl//9qAo2FSPn//147TRBzO4uVLOX//w+3EgG1LOX//wPOg/oKdQ5qDVtmiRgDxgG1QOX//wG1QOX//2aJEAPGgb1A5f//qAYAAHLAM/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xXgwEAAi9g73g+ElwAAAGoAjYUo5f//UIvDK8ZQjYQ18Ov//1CLhSTl//+LAP80B/8VwMBAAIXAdAwDtSjl//873n/L6wz/FTzAQACJhUTl//873n9ci4Us5f//K4U05f//iYU45f//O0UQD4IL////6z9RjY0o5f//Uf91EP+1NOX///80OP8VwMBAAIXAdBWLhSjl//+DpUTl//8AiYU45f//6wz/FTzAQACJhUTl//+DvTjl//8AdWyDvUTl//8AdC1qBV45tUTl//91FOgDn///xwAJAAAA6Auf//+JMOs//7VE5f//6A+f//9Z6zGLhSTl//+LAPZEBwRAdA+LhTTl//+AOBp1BDPA6yTow57//8cAHAAAAOjLnv//gyAAg8j/6wyLhTjl//8rhTDl//9bi038XzPNXujIh///ycNqEGgo4kAA6Nme//+LXQiD+/51G+iPnv//gyAA6HSe///HAAkAAACDyP/plAAAAIXbeAg7HYANQQByGuhonv//gyAA6E2e///HAAkAAADo8J3//+vSi8PB+AWNPIWg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nwkAAIGN+Pv//4AAAADpkAkAAAmN+Pv//+mFCQAAZoP6KnUriwODwwSJneT7//+Jhdj7//+FwA+JZgkAAION+Pv//wT3ndj7///pVAkAAIuF2Pv//2vACg+3yo1ECNCJhdj7///pOQkAAIOl9Pv//wDpLQkAAGaD+ip1JYsDg8MEiZ3k+///iYX0+///hcAPiQ4JAACDjfT7////6QIJAACLhfT7//9rwAoPt8qNRAjQiYX0+///6ecIAAAPt8KD+El0UYP4aHRAg/hsdBiD+HcPhcwIAACBjfj7//8ACAAA6b0IAABmgz9sdRED+YGN+Pv//wAQAADppggAAION+Pv//xDpmggAAION+Pv//yDpjggAAA+3B4P4NnUZZoN/AjR1EoPHBIGN+Pv//wCAAADpbQgAAIP4M3UZZoN/AjJ1EoPHBIGl+Pv///9////pTwgAAIP4ZA+ERggAAIP4aQ+EPQgAAIP4bw+ENAgAAIP4dQ+EKwgAAIP4eA+EIggAAIP4WA+EGQgAAIOlxPv//wCLhdT7//9SjbXo+///x4XQ+///AQAAAOgX/P//WenwBwAAD7fCg/hkD48xAgAAD4S/AgAAg/hTD48cAQAAdH+D6EF0ECvBdForwXQIK8EPheEFAACDwiDHhZj7//8BAAAAiZXg+///i430+///g434+///QI29/Pv//7gAAgAAib3w+///iYXs+///hckPiY4CAADHhfT7//8GAAAA6d4CAAD3hfj7//8wCAAAD4XJAAAAg434+///IOm9AAAA94X4+///MAgAAHUHg434+///IIu99Pv//4P//3UFv////3+DwwT2hfj7//8giZ3k+///i1v8iZ3w+///D4T5BAAAhdt1C6Ew/kAAiYXw+///g6Xs+///AIu18Pv//4X/D44RBQAAigaEwA+EBwUAAI2NtPv//w+2wFFQ6Av6//9ZWYXAdAFGRv+F7Pv//zm97Pv//3zQ6dwEAACD6FgPhN8CAAArwQ+ElQAAAIPoBw+E9P7//yvBD4W6BAAAD7cDg8MEM/ZG9oX4+///IIm10Pv//4md5Pv//4mFpPv//3RCiIXI+///jYW0+///UIuFtPv//8aFyfv//wD/sKwAAACNhcj7//9QjYX8+///UOhH+P//g8QQhcB5D4m1sPv//+sHZomF/Pv//42F/Pv//4mF8Pv//4m17Pv//+k2BAAAiwODwwSJneT7//+FwHQ6i0gEhcl0M/eF+Pv//wAIAAAPvwCJjfD7//90EpkrwseF0Pv//wEAAADp8QMAAIOl0Pv//wDp5wMAAKEw/kAAiYXw+///UOiF2///WenQAwAAg/hwD4/lAQAAD4TNAQAAg/hlD4y+AwAAg/hnD47n/f//g/hpdG6D+G50JIP4bw+FogMAAPaF+Pv//4CJteD7//90YoGN+Pv//wACAADrVoPDBImd5Pv//4tb/OhE9///hcAPhHj6///2hfj7//8gdAxmi4Xo+///ZokD6wiLhej7//+JA8eFsPv//wEAAADp9wQAAION+Pv//0DHheD7//8KAAAA94X4+///AIAAAA+EmQEAAAPei0P4i1P86dUBAAB1EmaD+md1V8eF9Pv//wEAAADrSzvIfgiJhfT7//+LyIH5owAAAH43jbFdAQAAVujpv///i5Xg+///WYmFqPv//4XAdBCJhfD7//+Jtez7//+L+OsKx4X0+///owAAAIsDizVYwEAAg8MIiYWQ+///i0P8iYWU+///jYW0+///UP+1mPv//w++wv+19Pv//4md5Pv//1D/tez7//+NhZD7//9XUP81QPVAAP/W/9CLnfj7//+DxByB44AAAAB0HYO99Pv//wB1FI2FtPv//1BX/zVM9UAA/9b/0FlZZoO94Pv//2d1GIXbdRSNhbT7//9QV/81SPVAAP/W/9BZWYA/LXURgY34+///AAEAAEeJvfD7//9X6Rn+//+JtfT7///Hhaz7//8HAAAA6ySD6HMPhHv8//8rwQ+EnP7//4PoAw+FzgEAAMeFrPv//ycAAAD2hfj7//+Ax4Xg+///EAAAAA+EfP7//2owWGaJhcz7//+Lhaz7//+DwFFmiYXO+///iY3c+///6Vf+///3hfj7//8AEAAAD4VX/v//g8ME9oX4+///IHQc9oX4+///QImd5Pv//3QGD79D/OsED7dD/JnrF/aF+Pv//0CLQ/x0A5nrAjPSiZ3k+///9oX4+///QHQbhdJ/F3wEhcBzEffYg9IA99qBjfj7//8AAQAA94X4+///AJAAAIv6i9h1AjP/g730+///AH0Mx4X0+///AQAAAOsag6X4+///97gAAgAAOYX0+///fgaJhfT7//+LwwvHdQYhhdz7//+Ntfv9//+LhfT7////jfT7//+FwH8Gi8MLx3Qti4Xg+///mVJQV1PoBfb//4PBMImdjPv//4vYi/qD+Tl+BgONrPv//4gOTuu9jYX7/f//K8ZG94X4+///AAIAAImF7Pv//4m18Pv//3RehcB0B4vGgDgwdFP/jfD7//+LhfD7////hez7///GADDrPIXbdQuhNP5AAImF8Pv//4uF8Pv//8eF0Pv//wEAAADrCU9mgzgAdAYDwYX/dfMrhfD7///R+ImF7Pv//4O9sPv//wAPhagBAACLhfj7//+oQHQrqQABAAB0BGot6w6oAXQEaivrBqgCdBRqIFlmiY3M+///x4Xc+///AQAAAIu92Pv//yu97Pv//yu93Pv//4m94Pv//6gMdSTrHouF1Pv//2ogjbXo+///T+iK9f//g73o+////1l0BIX/f97/tdz7//+LvZz7//+LndT7//+Nhcz7//9QjYXo+///6If1///2hfj7//8IWVl0L/aF+Pv//wR1Jou94Pv//+saajCNtej7//+Lw0/oLPX//4O96Pv///9ZdASF/3/ig73Q+///AHVri53s+///hdt+YYu98Pv//42FtPv//1CLhbT7////sKwAAACNhaT7//9XUEvoyvL//4PEEImFjPv//4XAfiT/taT7//+LhdT7//+Ntej7///owPT//wO9jPv//1mF23+w6y6Djej7////6yX/tez7//+LvZz7////tfD7//+LndT7//+Nhej7///otvT//1lZg73o+///AHwz9oX4+///BHQqi73g+///6x6LhdT7//9qII216Pv//0/oV/T//4O96Pv///9ZdASF/3/eg72o+///AHQT/7Wo+///6Pd6//+Dpaj7//8AWYu9oPv//4ud5Pv//w+3BzP2iYXg+///ZjvGdAeL0Olx9f//ObXE+///dA2DvcT7//8HD4UB9f//gL3A+///AHQKi4W8+///g2Bw/YuF6Pv//4tN/F9eM81b6Gt2///Jw41JAGKZQABil0AAlJdAAO+XQAA7mEAAR5hAAI2YQACEmUAAi/9Vi+yLRQhWV4XAeFk7BYANQQBzUYvIwfkFi/CD5h+NPI2gDUEAiw/B5gaDPA7/dTWDPQDwQAABU4tdDHUeg+gAdBBIdAhIdRNTavTrCFNq9esDU2r2/xUcwUAAiweJHAYzwFvrFuipjP//xwAJAAAA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ylGLwovIg+EDdAmKFogXRkdJdffB6AJ0DYsWiReNdgSNfwRIdfNZ6Qv////MzMzMzMzMzMzMzFGNTCQIK8iD4Q8DwRvJC8FZ6QoKAABRjUwkCCvIg+EHA8EbyQvBWen0CQAAi/9Vi+xWi3UIhfYPhGMDAAD/dgTo8m7///92COjqbv///3YM6OJu////dhDo2m7///92FOjSbv///3YY6Mpu////NujDbv///3Yg6Ltu////diTos27///92KOirbv///3Ys6KNu////djDom27///92NOiTbv///3Yc6Itu////djjog27///92POh7bv//g8RA/3ZA6HBu////dkToaG7///92SOhgbv///3ZM6Fhu////dlDoUG7///92VOhIbv///3ZY6EBu////dlzoOG7///92YOgwbv///3Zk6Chu////dmjoIG7///92bOgYbv///3Zw6BBu////dnToCG7///92eOgAbv///3Z86Pht//+DxED/toAAAADo6m3///+2hAAAAOjfbf///7aIAAAA6NRt////towAAADoyW3///+2kAAAAOi+bf///7aUAAAA6LNt////tpgAAADoqG3///+2nAAAAOidbf///7agAAAA6JJt////tqQAAADoh23///+2qAAAAOh8bf///7a8AAAA6HFt////tsAAAADoZm3///+2xAAAAOhbbf///7bIAAAA6FBt////tswAAADoRW3//4PEQP+20AAAAOg3bf///7a4AAAA6Cxt////ttgAAADoIW3///+23AAAAOgWbf///7bgAAAA6Att////tuQAAADoAG3///+26AAAAOj1bP///7bsAAAA6Ops////ttQAAADo32z///+28AAAAOjUbP///7b0AAAA6Mls////tvgAAADovmz///+2/AAAAOizbP///7YAAQAA6Khs////tgQBAADonWz///+2CAEAAOiSbP//g8RA/7YMAQAA6IRs////thABAADoeWz///+2FAEAAOhubP///7YYAQAA6GNs////thwBAADoWGz///+2IAEAAOhNbP///7YkAQAA6EJs////tigBAADoN2z///+2LAEAAOgsbP///7YwAQAA6CFs////tjQBAADoFmz///+2OAEAAOgLbP///7Y8AQAA6ABs////tkABAADo9Wv///+2RAEAAOjqa///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AAoAAAAAAFQATABPAFMAUwAgAGUAcgByAG8AcgANAAoAAABTAEkATgBHACAAZQByAHIAbwByAA0ACgAAAAAARABPAE0AQQBJAE4AIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAUgA2ADAAMwAzAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAHUAcwBlACAATQBTAEkATAAgAGMAbwBkAGUAIABmAHIAbwBtACAAdABoAGkAcwAgAGEAcwBzAGUAbQBiAGwAeQAgAGQAdQByAGkAbgBnACAAbgBhAHQAaQB2AGUAIABjAG8AZABlACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuACAASQB0ACAAaQBzACAAbQBvAHMAdAAgAGwAaQBrAGUAbAB5ACAAdABoAGUAIAByAGUAcwB1AGwAdAAgAG8AZgAgAGMAYQBsAGwAaQBuAGcAIABhAG4AIABNAFMASQBMAC0AYwBvAG0AcABpAGwAZQBkACAAKAAvAGMAbAByACkAIABmAHUAbgBjAHQAaQBvAG4AIABmAHIAbwBtACAAYQAgAG4AYQB0AGkAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACAAbwByACAAZgByAG8AbQAgAEQAbABsAE0AYQBpAG4ALgANAAoAAAAAAFIANgAwADMAMgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwBjAGEAbABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuAA0ACgAAAAAAUgA2ADAAMwAxAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIAB0AGgAZQAgAEMAUgBUACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AYwBlAC4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4ADQAKAAAAAABSADYAMAAzADAADQAKAC0AIABDAFIAVAAgAG4AbwB0ACAAaQBuAGkAdABpAGEAbABpAHoAZQBkAA0ACgAAAAAAUgA2ADAAMgA4AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAaABlAGEAcAANAAoAAAAAAAAAAABSADYAMAAyADcADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AdwBpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA2AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAcwB0AGQAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANQANAAoALQAgAHAAdQByAGUAIAB2AGkAcgB0AHUAYQBsACAAZgB1AG4AYwB0AGkAbwBuACAAYwBhAGwAbAANAAoAAAAAAAAAUgA2ADAAMgA0AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAXwBvAG4AZQB4AGkAdAAvAGEAdABlAHgAaQB0ACAAdABhAGIAbABlAA0ACgAAAAAAAAAAAFIANgAwADEAOQANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAbwBwAGUAbgAgAGMAbwBuAHMAbwBsAGUAIABkAGUAdgBpAGMAZQANAAoAAAAAAAAAAABSADYAMAAxADgADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAaABlAGEAcAAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADcADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAbQB1AGwAdABpAHQAaAByAGUAYQBkACAAbABvAGMAawAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIAB0AGgAcgBlAGEAZAAgAGQAYQB0AGEADQAKAAAAUgA2ADAAMQAwAA0ACgAtACAAYQBiAG8AcgB0ACgAKQAgAGgAYQBzACAAYgBlAGUAbgAgAGMAYQBsAGwAZQBkAA0ACgAAAAAAUgA2ADAAMAA5AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AA0ACgAAAFIANgAwADAAOAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGEAcgBnAHUAbQBlAG4AdABzAA0ACgAAAAAAAABSADYAMAAwADIADQAKAC0AIABmAGwAbwBhAHQAaQBuAGcAIABwAG8AaQBuAHQAIABzAHUAcABwAG8AcgB0ACAAbgBvAHQAIABsAG8AYQBkAGUAZAANAAoAAAAAAAAAAAACAAAAgMpAAAgAAAAoykAACQAAANDJQAAKAAAAiMlAABAAAAAwyUAAEQAAANDIQAASAAAAiMhAABMAAAAwyEAAGAAAAMDHQAAZAAAAcMdAABoAAAAAx0AAGwAAAJDGQAAcAAAAQMZAAB4AAAAAxkAAHwAAADjFQAAgAAAA0MRAACEAAADgwkAAeAAAALzCQAB5AAAAoMJAAHoAAACEwkAA/AAAAHzCQAD/AAAAXMJAAE0AaQBjAHIAbwBzAG8AZgB0ACAAVgBpAHMAdQBhAGwAIABDACsAKwAgAFIAdQBuAHQAaQBtAGUAIABMAGkAYgByAGEAcgB5AAAAAAAKAAoAAAAAAC4ALgAuAAAAPABwAHIAbwBnAHIAYQBtACAAbgBhAG0AZQAgAHUAbgBrAG4AbwB3AG4APgAAAAAAUgB1AG4AdABpAG0AZQAgAEUAcgByAG8AcgAhAAoACgBQAHIAbwBnAHIAYQBtADoAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAg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IGR1cGxpY2F0aW9uIGZhaWxlZAAAAABzdGRvdXQgZHVwbGljYXRpb24gZmFpbGVkAAAAc3RkZXJyIGR1cGxpY2F0aW9uIGZhaWxlZAAAAFVuYWJsZSB0byBjcmVhdGUgcHJvY2VzcyB1c2luZyAnJXMnAEZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIG9mIHByb2Nlc3MAAC4AZQB4AGUAAAAAAEV4cGVjdGVkIHRvIGZpbmQgYSBjb21tYW5kIGVuZGluZyBpbiAnLmV4ZScgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAARXhwZWN0ZWQgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAVGVybWluYXRpbmcgcXVvdGUgd2l0aG91dCBzdGFydGluZyBxdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAEZhaWxlZCB0byBmaW5kIHNoZWJhbmcAAEV4cGVjdGVkIHRvIGZpbmQgdGVybWluYXRvciBpbiBzaGViYW5nIGxpbmUARXhwZWN0ZWQgdG8gZGVjb2RlIHNoZWJhbmcgbGluZSB1c2luZyBVVEYtOABFeHBlY3RlZCB0byBmaW5kICcjJyBhdCBzdGFydCBvZiBzaGViYW5nIGxpbmUAAABFeHBlY3RlZCB0byBmaW5kICchJyBmb2xsb3dpbmcgJyMnIGluIHNoZWJhbmcgbGluZQAARXhwZWN0ZWQgdG8gZmluZCBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZQBFeHBlY3RlZCB0byBmaW5kIGFyZ3VtZW50cyAoZXZlbiBpZiBlbXB0eSkgaW4gc2hlYmFuZyBsaW5lAABFeHBlY3RlZCB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIGNvbW1hbmQgbGluZSBtZW1vcnkAIgAlAHMAIgAgACUAcwAgACIAJQBzACIAIAAlAHMAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPBAANDeQAADAAAAUlNEU6ctt0pARdpMkzSjehel4eICAAAAQzpcVXNlcnNcVmluYXlcUHJvamVjdHNcc2ltcGxlX2xhdW5jaGVyXFJlbGVhc2VcR1VJU2ltcGxlTGF1bmNoZXIucGRiAAAAsC8AANAxAAAQaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAD0GEAAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAANobQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAgSBAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADsIkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAPIjQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA0iRAAAAAAAD+////AAAAAIj///8AAAAA/v///zUmQABJJkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAABgtQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAAzRAAAAAAAD+////AAAAANj///8AAAAA/v///180QABjNEAAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAEw2QAAAAAAA/v///wAAAADY////AAAAAP7///8AAAAAAjhAAP7///8AAAAAEThAAP7///8AAAAA2P///wAAAAD+////AAAAAMQ5QAD+////AAAAANA5QAD+////AAAAANT///8AAAAA/v///wAAAAB0PEAAAAAAAP7///8AAAAA2P///wAAAAD+////Gz5AAC4+QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAZU5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAANU0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAJlUQAAAAAAAAAAAAGVUQAD+////AAAAAND///8AAAAA/v///wAAAAAAVkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAABJeQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAA4WVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAOcEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANVyQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAp3ZAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAABkiUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAADSRQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA7KNAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAACxpUAAAAAAAAAAAADtpEAA/v///wAAAADQ////AAAAAP7///8AAAAAUqdAAOjiAAAAAAAAAAAAANjlAAAAwAAAKOQAAAAAAAAAAAAA8uUAAEDBAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDkAAA+5AAAUOQAAGrkAAB45AAAiuQAAJ7kAAC05AAA0OQAAOzkAAAC5QAAGOUAADTlAABK5QAAXuUAAG7lAAB+5QAAkOUAAKDlAAC45QAAyuUAAP7lAAAS5gAAIuYAAC7mAAA65gAATOYAAF7mAAB05gAAhuYAAJrmAAC25gAA1OYAAOjmAAAA5wAAGOcAAEDnAABQ5wAAXOcAAHTnAACE5wAAkOcAAJ7nAACs5wAAtucAAM7nAADe5wAA9OcAAAzoAAAY6AAAJugAADLoAABE6AAAUugAAGToAAB66AAAlOgAAKroAADE6AAA3ugAAO7oAAAE6QAAHukAACbpAAA06QAAQOkAAErpAABW6QAAaOkAAHTpAACE6QAAlukAAKbpAADC6QAA1ukAAOTpAAD06QAABuoAABbqAAAAAAAA5uUAAAAAAAAZAUV4aXRQcm9jZXNzAIcBR2V0Q29tbWFuZExpbmVXAHEEU2V0SW5mb3JtYXRpb25Kb2JPYmplY3QAYgFGcmVlTGlicmFyeQCoAENyZWF0ZVByb2Nlc3NXAADAAUdldEN1cnJlbnRQcm9jZXNzAPkEV2FpdEZvclNpbmdsZU9iamVjdABnAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAFgBBc3NpZ25Qcm9jZXNzVG9Kb2JPYmplY3QAAN8BR2V0RXhpdENvZGVQcm9jZXNzAAAUAkdldE1vZHVsZUZpbGVOYW1lVwAApQNRdWVyeUluZm9ybWF0aW9uSm9iT2JqZWN0AGcDTXVsdGlCeXRlVG9XaWRlQ2hhcgCVAENyZWF0ZUpvYk9iamVjdEEAAGQCR2V0U3RkSGFuZGxlAAACAkdldExhc3RFcnJvcgAARQJHZXRQcm9jQWRkcmVzcwAAPANMb2FkTGlicmFyeUEAAC0EU2V0Q29uc29sZUN0cmxIYW5kbGVyAOgARHVwbGljYXRlSGFuZGxlAFIAQ2xvc2VIYW5kbGUAS0VSTkVMMzIuZGxsAABFAVN0clN0cklXAABTSExXQVBJLmRsbAAYAkdldE1vZHVsZUhhbmRsZVcAAMoARGVjb2RlUG9pbnRlcgDPAkhlYXBGcmVlAADLAkhlYXBBbGxvYwBpAkdldFN0cmluZ1R5cGVXAACGAUdldENvbW1hbmRMaW5lQQDTAkhlYXBTZXRJbmZvcm1hdGlvbgAAYwJHZXRTdGFydHVwSW5mb1cAwARUZXJtaW5hdGVQcm9jZXNzAADTBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAApQRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAANJc0RlYnVnZ2VyUHJlc2VudADuAEVudGVyQ3JpdGljYWxTZWN0aW9uAAA5A0xlYXZlQ3JpdGljYWxTZWN0aW9uAADjAkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQA6gBFbmNvZGVQb2ludGVyABgEUnRsVW53aW5kANEARGVsZXRlQ3JpdGljYWxTZWN0aW9uAD8DTG9hZExpYnJhcnlXAADFBFRsc0FsbG9jAADHBFRsc0dldFZhbHVlAMgEVGxzU2V0VmFsdWUAxgRUbHNGcmVlAO8CSW50ZXJsb2NrZWRJbmNyZW1lbnQAAHMEU2V0TGFzdEVycm9yAADFAUdldEN1cnJlbnRUaHJlYWRJZAAA6wJJbnRlcmxvY2tlZERlY3JlbWVudAAAJQVXcml0ZUZpbGUAzQJIZWFwQ3JlYXRlAADAA1JlYWRGaWxlAABvBFNldEhhbmRsZUNvdW50AADzAUdldEZpbGVUeXBlAGYEU2V0RmlsZVBvaW50ZXIAABMCR2V0TW9kdWxlRmlsZU5hbWVBAABhAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXABEFV2lkZUNoYXJUb011bHRpQnl0ZQDaAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKcDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAkwJHZXRUaWNrQ291bnQAAMEBR2V0Q3VycmVudFByb2Nlc3NJZAB5AkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lALIEU2xlZXAAjwBDcmVhdGVGaWxlVwByAUdldENQSW5mbwBoAUdldEFDUAAANwJHZXRPRU1DUAAACgNJc1ZhbGlkQ29kZVBhZ2UA1AJIZWFwU2l6ZQAAmgFHZXRDb25zb2xlQ1AAAKwBR2V0Q29uc29sZU1vZGUAAIcEU2V0U3RkSGFuZGxlAAAEA0lzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQAVwFGbHVzaEZpbGVCdWZmZXJzAADSAkhlYXBSZUFsbG9jAFMEU2V0RW5kT2ZGaWxlAABKAkdldFByb2Nlc3NIZWFwAAAtA0xDTWFwU3RyaW5nVwAAJAVXcml0ZUNvbnNvbGVXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAABO5kC7sRm/RAAAAADADkEAAAAAAMAOQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAA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AAAA/v///wAAAAAAAAAAAAAAAABLBQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAMAAwAAACgAAIAOAAAAcAAAgBgAAACIAACAAAAAAAAAAAAEAAAAAAAHAAEAAACgAACAAgAAALgAAIADAAAA0AAAgAQAAADoAACABQAAAAABAIAGAAAAGAEAgAcAAAAwAQCAAAAAAAAAAAAEAAAAAAABAGUAAABIAQCAAAAAAAAAAAAEAAAAAAABAAEAAABgAQCAAAAAAAAAAAAEAAAAAAABAAAAAAB4AQAAAAAAAAAAAAAEAAAAAAABAAAAAACIAQAAAAAAAAAAAAAEAAAAAAABAAAAAACYAQAAAAAAAAAAAAAEAAAAAAABAAAAAACoAQAAAAAAAAAAAAAEAAAAAAABAAAAAAC4AQAAAAAAAAAAAAAEAAAAAAABAAAAAADIAQAAAAAAAAAAAAAEAAAAAAABAAAAAADYAQAAAAAAAAAAAAAEAAAAAAABAAAAAADoAQAAAAAAAAAAAAAEAAAAAAABAAkEAAD4AQAACCIBAOgCAADkBAAAAAAAAPAkAQAoAQAA5AQAAAAAAAAYJgEAqAgAAOQEAAAAAAAAwC4BAGgFAADkBAAAAAAAACg0AQCoJQAA5AQAAAAAAADQWQEAqBAAAOQEAAAAAAAAeGoBAGgEAADkBAAAAAAAAOBuAQBoAAAA5AQAAAAAAABIbwEAWgEAAOQEAAAAAAAAKAAAACAAAABAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuLi4AR0dHAFdXVwBpaWkAdXV1AIAAAAAAgIAAgICAAJiYmACnp6cAubm5AMDAwADX19cA/v7+AP///wAAAACAAIAAAAD////wAAAAAAwAj8yADAAPx3d3zwAAAAwAz//v/IAM/Hd3fHzwAAAA7//M/M//zPd3d8/H8AAACPzP/+/////3d3d3d/AAAAjoz8zMzP//93d3/////wAI////7//8Zvd3d3d3d3zwCOzP/8z/xmb3d3d3d3d3zwj4z//v/2Zm/Hd3d3d3d38I////zM9mZs/Hd3d3d3d/CPzP/+//ZmZs/////Hd3fwjoz8z8z2ZmZmZmZs/Hd38I////7/9mZmZmZmZs93d/CPzPzMzPxmZmZmZmZvd3zwj4z9/v//xmZmZmZmb3fPAI//+Lz8z//////GZm//8ACPzP+d/////2ZmZmZvAAAAjogvyKzPzM9s/GZmbwAAAI/lJcSd////xsZmZs8AAABbzJFCmczM//xmZmzwAAAAjYrYET7/////////gAAAAI/YUyEUzMz8zP/4zwAAAACPypmjE47///////8AAAAAj4zc+kIqzM+AAAAAgAAAAI////7EE8//j///gMAAAACPzPzM6jVMz4/M+AwAAAAAj4z////VW/+Pz4DAAAAAAI///MzMzpnPj/gMAAAAAACPzP/////+zo+AwAAAAAAAj4z8zMzMzM2IDAAAAAAAAI//////////gMAAAAAAAACIiIiIiIiIiIwAAAAAAAAPwfwH/gA4A/gAAAH4AAAB+AAAAfgAAAA4AAAAGAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAYAAAAOAAAAfgAAAH4AAAB+AAAA/gAAAP4AAAD+AAAA/gAAAP4AAAD+AAAB/gAAA/4AAAf+AAAP/gAAH/4AAD/+AAB//KAAAABAAAAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQATU1NAFNTUwB6enoAgAAAAACAgACAgIAAkJCQAKqqqgC0tLQAwMDAANbW1gDl5eUA/v7+AP///wBwAAALALAAAHCwtwf///AAe3B7/7ZmvwB/v++/ZmtvAH/v//9mv///f7/rX2ZmZmt/7vVftmZmZn+e5Vv///tmfcnlVVVVv2ZMNKtVVVVfa0pxT///tV//foknv1tVXwB//6O/tVW/AH+/uY7///AAf///7ff3sAB3d3d3d3sAAH4fH/8QBx//AAMf/wADH/8AAB//AAAf/wAAH/8AAB//AAAf/wAAH/8AAB//AAMf/wADH/8ABx//AAcf/wAPH/8oAAAAIAAAAEAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJQArKysAMDAwAD09PQBBQUEASUlJAE1NTQBRUVEAVlZWAFlZWQBdXV0AfmRGAGdnZwBqamoAbW1tAHJycgB1dXUAfX19AKF1PwCrej0As347AINnRQCMa0MAlG9BAJtyQAC7gToArYBJAJqBYgC3mHAAxo9LANCjawAovv8ALML/ADHG/wA/xP8ANcr/ADzO/wBczf8AQ9T/AEva/wBR3/8Ac9//AFXi/wBb5/8AY+D/AGLs/wCBgYEAiYmJAJGRkQCXl5cAmZmZAJycnACgoKAApaWlAKqqqgCwsLAAtbW1ALm5uQC8vLwA08OwAILx/wC18P8AxcXFAMnJyQDNzc0A0dHRANTU1ADa2toA3d3dAO/l2ADT8v8A4eHhAOXl5QDp6ekA9O/qAOP5/wDw8PAA9/f3AP7+/gAAAAAAAi8AAARQAAAGcAAACJAAAAqwAAALzwAADvAAACD/EgA9/zEAW/9RAHn/cQCY/5EAtf+xANT/0QD///8AAAAAABQvAAAiUAAAMHAAAD2QAABMsAAAWc8AAGfwAAB4/xEAiv8xAJz/UQCu/3EAwP+RANL/sQDk/9EA////AAAAAAAmLwAAQFAAAFpwAAB0kAAAjrAAAKnPAADC8AAA0f8RANj/MQDe/1EA4/9xAOn/kQDv/7EA9v/RAP///wAAAAAALyYAAFBBAABwWwAAkHQAALCOAADPqQAA8MMAAP/SEQD/2DEA/91RAP/kcQD/6pEA//CxAP/20QD///8AAAAAAC8UAABQIgAAcDAAAJA+AACwTQAAz1sAAPBpAAD/eREA/4oxAP+dUQD/r3EA/8GRAP/SsQD/5dEA////AAAAAAAvAwAAUAQAAHAGAACQCQAAsAoAAM8MAADwDgAA/yASAP8+MQD/XFEA/3pxAP+XkQD/trEA/9TRAP///wAAAAAALwAOAFAAFwBwACEAkAArALAANgDPAEAA8ABJAP8RWgD/MXAA/1GGAP9xnAD/kbIA/7HIAP/R3wD///8AAAAAAC8AIABQADYAcABMAJAAYgCwAHgAzwCOAPAApAD/EbMA/zG+AP9RxwD/cdEA/5HcAP+x5QD/0fAA////AAAAAAAsAC8ASwBQAGkAcACHAJAApQCwAMQAzwDhAPAA8BH/APIx/wD0Uf8A9nH/APeR/wD5sf8A+9H/AP///wAAAAAAGwAvAC0AUAA/AHAAUgCQAGMAsAB2AM8AiADwAJkR/wCmMf8AtFH/AMJx/wDPkf8A3LH/AOvR/wD///8AAAAAAAgALwAOAFAAFQBwABsAkAAhALAAJgDPACwA8AA+Ef8AWDH/AHFR/wCMcf8AppH/AL+x/wDa0f8A////AAAAAAAAAAAAAAAAAAAAAAAAAF9fX19fX18AAAAAAAAAAAAAAABDQ0JBQkFEAAAAAABMKiglJCIiJkcAAAAAAAAAAABBQkpJSURESkM/P0FEXy0oJyclJEdHI18AAAAAAAAARElKSUlKSUlJRElKRERfKykoJyclR0cgXwAAAAAAAEpNQ0VKP0FCQUVDQT9CQV8sKykoJyUlIiFfAAAAAAAASU1AQUpBQ0RDSURJX19fXy4sKys+X19fX19fX18AAABKTUpKSkpKSkpKSkYbGBdfLi4sKykoJyUkIiEgI0cAAElNQ0VKSkpJP0pfHRMZGF8uLi4sKygoJyUkIiEgJl8ASk0/QUpKSkpDSl8bExMZXy4uLiwrKSgnJyUkIiAgXwBJTUpKSkpKSkpKXxUUExNLPS4uLiwrKygnJyUkISBfAEpNQ0RKSkpKQUpfFRQUEx1LX19fX19fX0wqJSQiIV8ASV8/QU1OSkpFSl8aFRQTExkYFxcWDAwMHEwnJSQiXwBJX01NTU1NTUpKXxoaFRQTExkYFxcWDAwMXygnJSVfAElfQ0VNSUpKTUVNHxoaFRQTExkYFxcWDAxfKCcnKl8ASV8/Qk1ESkVNRE1GHhoVFRQTExkYFxYMDF8pKC1MAABJX01NTUNNTU1NTV9fX19fX19fXzwYFxYMX19fXwAAAElfQ0VNMTtNQUNETUVKTV8VFBQTGRgXFxZfAAAAAAAASV8/QV9EMUBJSkpNSk1NXxpGRhMTExgXF18AAAAAAABJX182Bl9AL0VNTU1OTU1fHkZGFBMTGRgcXwAAAAAAAElfQw8FDzgOMEVKRE1KQ0pGHxoVFBMTHUYAAAAAAAAAPzpBQTIDDwUwP19NX01JRU1fX19fX19NAAAAAAAAAABJQzRCQy8EAQpOX19fX19fTU1NTUpJREEAAAAAAAAAAElfOS8QCQYBARFISkpNTUpNTU1KPz9CQQAAAAAAAAAASV9BNzUwMwkDCBJJSk1NQ0JDQkE0NENDAAAAAAAAAABJX19fQkFPOw4HBTZfX19DX01KSURJRE0AAAAAAAAAAElfQ0lfX19POw0CB0BfX0NfQz9KP0FKAAAAAAAAAAAASV8/QV9ESkpJQAsRDk9fQ00/O0k/SgAAAAAAAAAAAABJX19fX19fX19fSBAROU1BSUpKSUoAAAAAAAAAAAAAAElfQ0RfX19fX0pKSTczQztJSklKAAAAAAAAAAAAAAAASV8/QU1ESkpESU1KSUU1OkpJSgAAAAAAAAAAAAAAAABJX19fX19fX19fX01NSUE6SUoAAAAAAAAAAAAAAAAAAEpKSkpKSkpKSkpKSkpKSk1KAAAAAAAAAAAAAAAAAAD//8B/+A+AP+AAAB/AAAAfgAAAH4AAAAOAAAABgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAGAAAADgAAAH4AAAB+AAAAfgAAAP4AAAH+AAAB/gAAAf4AAAH+AAAB/gAAA/4AAAf+AAAP/gAAH/4AAD/+AAB//gAA//ygAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0AE1NTQBSUlIAWVlZAH5lRwB1dXUAfX19AKd4PgCIaUUAmHJDALSCRQCwmn4AN8j/AD/R/wBI1/8AVuL/AGLs/wB44v8AlpaWAJubmwCdnZ0AoaGhAKSkpACqqqoAs7OzALS0tAC6uroAvLy8ANXApwCb5/8AsPD/AMTExADOzs4A3d3dAOTi3wDi4uIA5OTkAOvr6wDs7OwA8vHvAOP5/wD19fUA/f39AJH3/wCx+f8A0fv/AP///wAAAAAAAC8hAABQNwAAcEwAAJBjAACweQAAz48AAPCmABH/tAAx/74AUf/IAHH/0wCR/9wAsf/lANH/8AD///8AAAAAAAAvDgAAUBgAAHAiAACQLAAAsDYAAM9AAADwSgAR/1sAMf9xAFH/hwBx/50Akf+yALH/yQDR/98A////AAAAAAACLwAABFAAAAZwAAAIkAAACrAAAAvPAAAO8AAAIP8SAD3/MQBb/1EAef9xAJj/kQC1/7EA1P/RAP///wAAAAAAFC8AACJQAAAwcAAAPZAAAEywAABZzwAAZ/AAAHj/EQCK/zEAnP9RAK7/cQDA/5EA0v+xAOT/0QD///8AAAAAACYvAABAUAAAWnAAAHSQAACOsAAAqc8AAMLwAADR/xEA2P8xAN7/UQDj/3EA6f+RAO//sQD2/9EA////AAAAAAAvJgAAUEEAAHBbAACQdAAAsI4AAM+pAADwwwAA/9IRAP/YMQD/3VEA/+RxAP/qkQD/8LEA//bRAP///wAAAAAALxQAAFAiAABwMAAAkD4AALBNAADPWwAA8GkAAP95EQD/ijEA/51RAP+vcQD/wZEA/9KxAP/l0QD///8AAAAAAC8DAABQBAAAcAYAAJAJAACwCgAAzwwAAPAOAAD/IBIA/z4xAP9cUQD/enEA/5eRAP+2sQD/1NEA////AAAAAAAvAA4AUAAXAHAAIQCQACsAsAA2AM8AQADwAEkA/xFaAP8xcAD/UYYA/3GcAP+RsgD/scgA/9HfAP///wAAAAAALwAgAFAANgBwAEwAkABiALAAeADPAI4A8ACkAP8RswD/Mb4A/1HHAP9x0QD/kdwA/7HlAP/R8AD///8AAAAAACwALwBLAFAAaQBwAIcAkAClALAAxADPAOEA8ADwEf8A8jH/APRR/wD2cf8A95H/APmx/wD70f8A////AAAAAAAbAC8ALQBQAD8AcABSAJAAYwCwAHYAzwCIAPAAmRH/AKYx/wC0Uf8AwnH/AM+R/wDcsf8A69H/AP///wAAAAAACAAvAA4AUAAVAHAAGwCQACEAsAAmAM8ALADwAD4R/wBYMf8AcVH/AIxx/wCmkf8Av7H/ANrR/wD///8AGgAAAAAAAAAaGhohAAAAABkZAAAAABoYJS8vLyoAAAAaIBoaGBohKh8QDg4eLwAAGSIoJSUnJS8REA8pDS8AABohIycnLy8vERAfLysvKwAcIiooLx0KLxEREA8ODQ0eHCElKC8LCigeEREQDw4NDSAgKCovCAgMKC8vLykSDg0aGBcqLwsICAoJBQUMKQ8PGgQGGiodCwgKCgkFBS8QHxUHAQciLy8vLy8dCQUvKwAcFhgCEy8vLwsjCgkJKwAAICElGwMcLy8dCwgKHSsAABwiKiscFCcjKy8vKycAAAAcISUqKyskKyshKyEAAAAAHBwcHCAgICAhISEAAAAAAH8PAAA8BwAAAAMAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAADAAAABwAAAA8AAAAfAAAoAAAAMAAAAGAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAGAAAABgAAAAYAAAAFAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAsAAAAVHx8fIQAAACEAAAAkAAAAJgkJCSYAAAAiAAAAHwAAABsAAAAUAAAADQAAAAcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAA0AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAABAAAAAaAAAAIJ+fn1fi4uK77+/v5u7u7ufr6+vi7e3t5evr69/09PTv8PDw5Nzc3LHHx8eLAQEBKzw8PC8AAAAfAAAAGAAAABAAAAAJAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAASJiYmIwAAACYAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFtbWz82NjY2AAAAG9fX14/p6en/v7+//+fn5//Ozs7/1tbW/8zMzP/f39//1NTU/+np6f/c3Nz/3d3d3ejo6Onv7+/h0tLSnsHBwX9CQkIzAAAAIgAAABwAAAAXAAAAEQAAAA4AAAALAAAACgAAAAoAAAALAAAADQAAABEAAAAWAAAAHQAAABdtbW0z+Pj4+gAAACwAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGeLi4s8hISE0AAAAFzc3Nybp6en/6Ojo/+fn5//Kysr/ubm5/9LS0v+4uLj/3Nzc/+Xl5f/m5ub/0NDQ/9HR0f/n5+f/6enp/+zs7P/m5ubkysrKn7GxsX23t7d9X19fRYODg09wcHBEjo6OUBMTEywAAAApAAAAKxcXFzOJiYlaMjIyNgAAABhEREQo5ubm/wAAACwAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfPz8/+8vLyRIyMjNcHBwY7q6ur/wMDA/+np6f/c3Nz/z8/P/9nZ2f/n5+f/19fX/+bm5v/n5+f/4ODg/9vb2//m5ub/5eXl/+Xl5f/l5eX/5OTk/+Xl5f/r6+v08fHx+PT09Pvq6uro+vr6//Ly8vPV1dW54+Pj38HBwfnl5eX/t7e3kx8fHzW8vLyO5OTk/wAAACwAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfX19f/r6+v/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6enp/+np6f/o6Oj/6Ojo/+jo6P/n5+f/5ubm/+fn5//n5+f/5ubm/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4uLi/+Li4v/i4uL/4+Pj/+Pj4//j4+P/4+Pj/wAAACwAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfX19f/Dw8OMMjIyItDQ0ITr6+v/wsLC/+rq6v/R0dH/2tra/8/Pz//h4eH/0dHR/+bm5v/W1tb/x8fH/9bW1v/T09P/09PT/9TU1P/b29v/1NTU/9zc3P/Ozs7/4eHh/8vLy//k5OT/2dnZ//Dw8P/6+vr//v7+//////////////////7+/vv6+vr88PDw/yYmJjIAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfb29v8gICA0AAAAFzg4OCbs7Oz/7Ozs/+rq6v/Nzc3/u7u7/9XV1f+6urr/39/f/+jo6P/p6en/ycnJ/8nJyf/T09P/yMjI/8rKyv/Y2Nj/yMjI/9TU1P+/v7//19fX/9DQ0P/n5+f/8PDw/7bu//9l2v//P87//zTJ//8vxf//K8H//y7A//9Syv//quX///X29tOOjo4cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfb29v++vr6RJCQkNcTExI7t7e3/w8PD/+zs7P/f39//0dHR/9vb2//q6ur/2tra/+np6f/q6ur/4uLi/97e3v/e3t7/4uLi/9zc3P/h4eH/0NDQ/+Pj4//Y2Nj/5+fn/8vLy//19fX/ouz//0TW//9A0v//O8///zfM//8zyP//L8T//yrB//8mvf//Irr//47c///8/PycAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfb29v/u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/5+fn/+Xl5f/+/v7/V97//0fY//9D1f//P9L//zvO//82y///Msj//27X///2/P//ZtH//zC+///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGff39//Hx8eMMzMzItPT04Tu7u7/xMTE/+7u7v/t7e3/7e3t/+3t7f/n5+f/1dXV/+np6f/r6+v/6+vr/+vr6//q6ur/6urq/9DQ0P/Y2Nj/2tra/9fX1//Ozs7/0tLS/7Ozs///////T97//0vb//9H2P//QtT//z7R//86zv//Ncr//3DY///2/P//adP//yS8////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfj4+P8hISE0AAAAFzg4OCbv7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/T09P/yMjI/+jo6P/s7Oz/0dHR/8vLy//r6+v/6+vr/8/Pz//b29v/v7+//8nJyf+/v7//ycnJ/8rKyv//////U+H//07e//9K2v//Rtf//0LU//890P//Oc3//zXK//8wxf//LML//yi/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfj4+P/BwcGRJSUlNcfHx47w8PD/x8fH/+/v7//v7+//7u7u/+7u7v/u7u7/3t7e/+3t7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/9DQ0P/e3t7/4ODg/+/v7//6+vr/////////////////VuT//1Lh//9O3f//Sdr//0XX//+w7f/////////////////////////////////////////////////x////mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfn5+f/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/+/v7/9G5nf+lfEr/mnE//5ZvQP//////Wub//1Xj//9R4P//Td3//0nZ//9E1v//QNP//zzP//83zP//M8n//y/E//8rwf//Jr7//yK6//8tvP//jtz///7//8wAAAAAAAAAAAAAAAAAAAAAAAAAGfn5+f/JycmMNDQ0ItbW1oTx8fH/yMjI//Hx8f/w8PD/8PDw//Dw8P/p6en/19fX/+/v7//u7u7/7u7u/+7u7v/u7u7/7e3t/9LS0v/r6+v/38y0/6d3PP+jdT3/nnM+/5pxP///////Xen//1nm//9V4///UN///0zc//9I2f//Q9X//z/S//87z///N8v//zLI//8uxP//KsD//yW9//8huv//H7j//6rl//////+BAAAAAAAAAAAAAAAAAAAAGfn5+f8iIiI0AAAAFzg4OCby8vL/8vLy//Hx8f/x8fH/8fHx//Dw8P/n5+f/zc3N/+/v7//v7+//09PT/83Nzf/u7u7/7u7u/9LS0v/8/Pz/wJdk/6t5PP+mdz3/onU9/51zPv//////Yez//1zp//9Y5f//VOL//1Df//9L2///R9j//0PV//8+0f//Os7//zbL//8xx///LcP//ynA//8lvP//ILn//0/I///////OAAAAAAAAAAAAAAAAAAAAGfn5+f/Dw8ORJSUlNcrKyo7z8/P/ysrK//Ly8v/y8vL/8vLy//Hx8f/w8PD/39/f//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/9LS0v/+/v7/tYFB/657O/+qeTz/pXc9/6F0Pv//////c+///2Dr//9c6P//V+X//1Ph//9P3v//Stv//0bX//9C1P//PtH//znN//81yv//Mcf//yzC//8ov///JLz//yi7///////3AAAAAAAAAAAAAAAAAAAAGfr6+v/19fX/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw/+/v7///////t385/7J8Ov+uejv/qXg8/6V2Pf/18Or/1/r//3Pv//9f6///W+f//1fk//9S4f//Tt3//0ra//9F1///QdP//z3Q//84zf//NMn//zDF//8swv//J7///yO7////////AAAAAAAAAAAAAAAAAAAAGfr6+v/MzMyMNTU1ItnZ2YT09PT/y8vL//T09P/n5+f/8/Pz/+bm5v/z8/P/8vLy/+fn5//c3Nz/5OTk/+Tk5P/m5ub/4+Pj/9TU1P//////uoA5/7Z+Of+xfDr/rXo7/6h4PP+8mW//9O/p/////////////////////////////////////////////////+n6//9t2///OMz//zPJ//8vxf//K8H//ye+////////AAAAAAAAAAAAAAAAAAAAGfv7+/8iIiI0AAAAFzo6Oib19fX/9fX1//X19f/X19f/8/Pz/9TU1P/y8vL/8/Pz/+bm5v/R0dH/z8/P/8zMzP/Q0ND/zs7O/9XV1f//////voI4/7mAOf+1fjr/sHw7/6x6O/+ndzz/o3U9/55zPv+acT//lW9A/5FtQf+Ma0L/iGlD/4NnQ/9/ZET/i3Va/97X0P/p+v//O8///zfM//8zyP//LsT//yrB////////AAAAAAAAAAAAAAAAAAAAGfv7+//Hx8eRJSUlNczMzI719fX/zMzM//X19f/V1dX/8vLy/8rKyv/m5ub/9PT0/+fn5//g4OD/5eXl/+Tk5P/k5OT/6urq/9TU1P/+/v7/w4g+/72COP+4gDn/tH06/7B7O/+reTz/p3c8/6J1Pf+ecz7/mXE//5VvQP+QbUH/jGpC/4doQ/+DZkT/fmRF/4t1Wv//////P9L//zrO//82y///Msj//zXF///////3AAAAAAAAAAAAAAAAAAAAGfz8/P/4+Pj/9/f3//f39/+oqKj/q6ur//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/9/f3/0J5h/8GDN/+8gTj/uH85/7N9Ov+vezv/qnk8/6Z3Pf+hdT7/nXI+/5hwP/+UbkD/j2xB/4tqQv+GaEP/gmZE/31kRf//////QtT//z7R//86zv//Ncr//17T///////OAAAAAAAAAAAAAAAAAAAAGfz8/P/Pz8+MNTU1Itzc3IT4+Pj/hoaG/6ysrP/39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT/9PT0//Pz8//4+Pj/6NGz/8KEN//Agzf/u4E4/7d/Of+yfTr/rns7/6l4PP+ldj3/oHQ+/5xyP/+XcED/k25A/45sQf+KakL/hWdD/4FlRP//////Rtf//0HU//890P//Oc3//7Pr//////+BAAAAAAAAAAAAAAAAAAAAGfz8/P8iIiI0AAAAFzs7Oyb4+Pj/9fX1/4iIiP+srKz/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT//f38/+HBmv/FjEP/v4M4/7uAOf+2fjn/snw6/616O/+oeDz/pHY9/6B0Pv+bcj//l3BA/5JtQf+Oa0H/iWlC/4VnQ///////Sdr//0XW//9M1v//nef///7//8sAAAAAAAAAAAAAAAAAAAAAAAAAGf39/f/JycmRUVFRSm5ubsr39/f/zs7O/8zMzP9+fn7/rKys//j4+P/39/f/9/f3//f39//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9fX1//v7+//+/v7////////////////////////////////////////////XxK7/mnE//5ZvQP+RbUH/jWtC/4hpQ//////////////////////x////mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf39/f/z8/P/SEhI/yIiIv+pqan/+vr6/+zs7P+JiYn/dnZ2/6ysrP/4+Pj/+Pj4//f39//39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P//////uYA5/7R+Ov+wezv/q3k8/6d3PP+idT3/nnM+/5lxP/+Vb0D/kG1B/4xrQv//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf7+/v+QkJDBOjo6/ycnJ/9fX1//paWl//n5+f9zc3P/dHR0/4yMjP+oqKj/3d3d/+Xl5f/p6en/+Pj4//f39//39/f/9/f3//b29v/1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AAAAAAAABwAAABghISEwXFxcSmVlZVE2NjZENTU1QQAAADAAAAAkAAAAFQAAAAoAAAACAAAAAP///4Hd+P//duL//0jW//88z///Nsv//zDF//8yw///XM7//9by//////+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABwFBQU3gYGBcenp6fjm5ub/4eHh9dbW1unb29vs3Nzc2rS0tKJ2dnZqJiYmRAAAADEAAAAi/v7+72fk//9M3P//Rtf//0DT//87zv//Ncr//9Tz///P8f//P8T//////+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwMDAo+bm5vjo6Oj/5+fn/+Xl5f/m5ub/5ubm/+Tk5P/k5OT/3t7e/+Li4v7i4uLz2NjY09DQ0Lr/////VuT//1Hg//9L2///Rdf//z/S//85zf//1fT//9Dy//8ov////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/z8/P/goKCYZSUlFbo6Oj/wsLC/8rKyv/Pz8//zc3N/9zc3P/R0dH/ycnJ/8XFxf/Kysr/ycnJ//////9b6P//VeP//1Df//9K2v//RNb//z7R//84zf//Msj//y3D////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/T09P91dXVue3t7aurq6v/Ozs7/0tLS/9zc3P/V1dX/5+fn/97e3v/i4uL//f39/////////////////2Dr//9a5///VOL//0/e//+08P///////////////////////////////////////////+////+BAAAAAAAAAAAAAAAf9PT0/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/o6Oj/8PDw/+3l2v+ng1b/lW9A/45sQf//////Yu3//1/q//9Z5v//U+L//03d//9H2P//QtT//zzP//82y///MMX//yvB//8lvP//PMH//9Xy//////+BAAAAAAAAAB/19fX/hISEYZeXl1bs7Oz/7Ozs/+vr6//m5ub/w8PD/+rq6v/6+vr/u5lt/6B0Pv+acT//k25A//////9i7f//Yu3//17q//9Y5f//UuH//0zc//9G2P//QdP//zvP//81yv//L8X//ynA//8kvP//Wcv//////8gAAAAAAAAAH/b29v93d3dufX19au3t7f/t7e3/7Ozs/+vr6//W1tb/6+vr//7+/v+ufkP/pXY9/55zPv+YcD///////2Lt//9i7f//Yez//13p//9X5P//UeD//0vb//9F1///QNL//zrO//80yf//LsT//yi///8rvf//////9gAAAAAAAAAf9/f3//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+3t7f/s7Oz//////7B7O/+peDz/o3Y9/51zPv/07+r/gfH//2Lt//9i7f//Yez//1vo//9W4///UN///0ra//9E1v//P9H//znN//8zyP//LcP//ye+////////AAAAAAAAAB/39/f/hoaGYZmZmVbw8PD/7+/v/+/v7//t7e3/ycnJ/+3t7f//////tX46/657O/+oeDz/onU9/7aXcP/07+n//////////////////////////////////////+r6//9y3///PdH//zfM//8yyP//LML///////8AAAAAAAAAH/j4+P95eXluf39/avHx8f/x8fH/8PDw/+/v7//d3d3/7u7u//////+5gDn/s306/616O/+ndzz/oXU+/5tyP/+Vb0D/j2xB/4lpQv+DZkT/fWRF/3xjRf98Y0X/loJp/+r6//9C1P//PND//zbL//8xx////////wAAAAAAAAAf+Pj4//Pz8//z8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD//v7+/8GHP/+4fzn/sn06/6x6O/+mdz3/oHQ+/5pxP/+UbkD/jmtB/4hpQ/+CZkT/fWNF/3xjRf99ZEb//////0fY//9B0///O8///z3M///////2AAAAAAAAAB/5+fn/iYmJYZycnFb09PT/4eHh/+Pj4//u7u7/8vLy/93d3f/y8vL/0qNp/72COP+3fzn/sXw6/6t5PP+ldj3/n3M+/5lxP/+TbkD/jWtC/4doQ/+AZUT/fGNF/3xjRf//////TNz//0bX//9A0///bdv//////8gAAAAAAAAAH/r6+v96enpugYGBavX19f/c3Nz/4ODg/9ra2v/z8/P/3t7e//Hx8f/06Nn/ypNQ/7yBOP+2fjn/sHs7/6p5PP+kdj3/nnM+/5hwP/+SbUH/i2pC/4VnQ/9/ZUT/fGNF//////9Q3///Stv//1zb///c9///////gQAAAAAAAAAf+/v7//f39//29vb/19fX//b29v/19fX/9fX1//T09P/09PT/8/Pz//n5+f/+/v7//////////////////////////////////////9PCr/+QbUH/impC/4RnQ/9+ZEX/////////////////////7////4EAAAAAAAAAAAAAAB/7+/v/i4uLYZ6enlapqan/tbW1/9fX1//y8vL/yMjI/9TU1P/b29v/9PT0/97e3v/q6ur/8vLy//////+0fTr/rno7/6h4PP+idT3/m3I//5VvQP+PbEH/iWlC/4NmRP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/z8/P98fHxuh4eHbff39/+Pj4//w8PD/+jo6P/k5OT/5+fn/+7u7v/19fX/8PDw//Ly8v/09PT//////7mAOf/u4tT/7eLW/6d3Pf+gdD7/mnE//5RuQP+ObEH/iGlD//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/f39/6SkpP9KSkr/+fn5/8bGxv9/f3//1tbW//j4+P/39/f/9/f3//b29v/29vb/9fX1//X19f/+/v7/xZFQ//Dk1P/v49b/q3k8/6V2Pf+fdD7/mXE//5NuQP+bfln/////7gAAAAAAAAAAAAAAAAAAAAAAAAAA1tbWAgAAAB/9/f3/VlZW4T8/P/93d3f/q6ur/2lpaf+Kior/wMDA//n5+f/v7+//3d3d//f39//w8PD/19fX/+Tk5P/z6Nr/zqFr/7mDQf+wfDv/qnk8/6R2Pf+ieUb/spVw/+vk3P////+BAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4zQEBAef7+/v9+fn5vYmJixzAwMP9ra2v/QEBA/46Ojv+2trb/+vr6//j4+P/09PT/+Pj4//Ly8v/i4uL/3t7e//b29v/9/f3///////////////////////7+/v/y8vLS+/v7gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLS1VnJyc/9DQ0P/V1dX/gICA/zw8PP8mJib/W1tb/+/v7//7+/v/+vr6//r6+v/6+vr/+fn5//j4+P/4+Pj/9/f3//f39//29vb/9PT0/+zs7P/j4+P/2NjY/wAAADYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/Q0ND/dXV16nNzc/9X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zP//MMP//5ng//+9vb3/zs7O/+Tk5P/y8vL//v7+/6l+Sf+ZcT//8+/q/5v0//9j7f//YOv//1bj//9L2///QNL//zXK//84xf//wMDA/8bGxv/t7e3/9fX1//////+tejv/onU9/7OVcf/z7+r/////////////////6/v//3bi//8+0f//M8j//7Ozs/+tra3/pKSk/+/v7///////u4ZF/6t5PP+gdD7/lG5A/4lpQv9+ZEX/fWRG/6ycif/r+///R9j//0jS//+vr6//WVlZ/3V1df+xsbH/9vb2/+DEof+2gD3/qXg8/55zPv+SbUH/h2hD/31kRf99ZUf//////1Pf//+o7P//m5ub/39/f/80NDT/fHx8/9zc3P/9/f3//v7+/////////////////9DBsP+FZ0P/fWNF///////////1////tb29vf+hoaH/qKio/01NTf+Wlpb//v7+//39/f//////sX4+/+rg0/+ZcT//jmtB/4VpR//////0AAAAAAAAAADBwcH/z8/P/+Xl5f+5ubn/UlJS/8DAwP/4+Pj/+vr6/97Cov+ygkf/o3U9/514S//Kuqf/////tQAAAAAAAAAAvr6+/97e3v/39/f/+fn5/7u7u/+cnJz/7e3t/+Hh4f/+/v7//f39///////+/v7/7Ozs/wAAAAAAAAAAAAAAALu7u//Ozs7/5OTk//b29v/4+Pj/9/f3/9/f3//6+vr//Pz8/8jIyP/5+fn/zMzM/7+/v38AAAAAAAAAAAAAAAC3t7f/ubm5/7u7u/+9vb3/v7+//8HBwf/Dw8P/xcXF/8jIyP/Jycn/x8fH/8TExH8AAAAAAAAAAAAAAAAAAAAAfgesQRAHrEEAA6xBAAOsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAA6xBAAOsQQAHrEEAB6xBAA+sQQAAAQAHACAgEAABAAQA6AIAAAEAEBAQAAEABAAoAQAAAgAgIAAAAQAIAKgIAAADABAQAAABAAgAaAUAAAQAMDAAAAEAIACoJQAABQAgIAAAAQAgAKgQAAAGABAQAAABACAAaAQAAAcAPGFzc2VtYmx5IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiPg0KICA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+DQogICAgPHNlY3VyaXR5Pg0KICAgICAgPHJlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgICAgIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiPjwvcmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWw+DQogICAgICA8L3JlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgPC9zZWN1cml0eT4NCiAgPC90cnVzdEluZm8+DQo8L2Fzc2VtYmx5PlBBUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFEABAAAOAAAAAFMAswEjAfMCYwKzBAMFAwYzCiMMIw1TD8MAYxHjHyMVIyazKVMqoytjLPMtwy8jIPMyYzPTNgM2UzhzOcM7kz1jPlM/MzDzQYNC40NTQ/NEs0WjRfNHE0fzSENMM05TQENV41bDWTNcQ1zTXUNek1BTYbNlI2djaGNss2/jZJN1838jcVODM4QzjAOHI5eDmBOYg5qjkfOic6OjpFOko6XDpmOms6hzqROqc6sjrMOtc63zrvOvU6Bjs/O0k7bzt2O5A7lzvCO2k8bzyBPOM8Ej0YPSc9AAAAIAAA5AAAAAAwzjDmMIAx9DGUMoMzbDTkNAk1GDUgNS01OTVFNUs1XTVlNXA1tzW8NcY1FzaJNo82lTab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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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zEiJXCQQZolMJAhVSIvsSIPsULj//wAAZjvID4SqAAAASI1N4Oivjv//SItd4IN7FAB1Jw+3VRCNQr9mg/gZdwRmg8IggH34AHQLSItN8IOhyAAAAP0Pt8LrcA+3TRC6AAEAAGY7ynMlugEAAADoHmj//4XAdQYPt0UQ6z0Pt00QSIuDSAEAAA+2BAjrLItLFEiNRSBBuQEAAABEiUwkKEyNRRBIiUQkIOgDDwAAhcAPt0UQdAQPt0UggH34AHQLSItN8IOhyAAAAP1Ii1wkaEiDxFBdw8zMzMzMzMzMzMzMzMzMzMzMZmYPH4QAAAAAAEiD7BBMiRQkTIlcJAhNM9tMjVQkGEwr0E0PQtNlTIscJRAAAABNO9NzFmZBgeIA8E2NmwDw//9BxgMATTvTdfBMixQkTItcJAhIg8QQw8zMSIXJD4TkAwAAU0iD7CBIi9lIi0kI6Lpi//9Ii0sQ6LFi//9Ii0sY6Khi//9Ii0sg6J9i//9Ii0so6JZi//9Ii0sw6I1i//9IiwvohWL//0iLS0DofGL//0iLS0joc2L//0iLS1DoamL//0iLS1joYWL//0iLS2DoWGL//0iLS2joT2L//0iLSzjoRmL//0iLS3DoPWL//0iLS3joNGL//0iLi4AAAADoKGL//0iLi4gAAADoHGL//0iLi5AAAADoEGL//0iLi5gAAADoBGL//0iLi6AAAADo+GH//0iLi6gAAADo7GH//0iLi7AAAADo4GH//0iLi7gAAADo1GH//0iLi8AAAADoyGH//0iLi8gAAADovGH//0iLi9AAAADosGH//0iLi9gAAADopGH//0iLi+AAAADomGH//0iLi+gAAADojGH//0iLi/AAAADogGH//0iLi/gAAADodGH//0iLiwABAADoaGH//0iLiwgBAADoXGH//0iLixABAADoUGH//0iLixgBAADoRGH//0iLiyABAADoOGH//0iLiygBAADoLGH//0iLizABAADoIGH//0iLizgBAADoFGH//0iLi0ABAADoCGH//0iLi0gBAADo/GD//0iLi1ABAADo8GD//0iLi3ABAADo5GD//0iLi3gBAADo2GD//0iLi4ABAADozGD//0iLi4gBAADowGD//0iLi5ABAADotGD//0iLi5gBAADoqGD//0iLi2gBAADonGD//0iLi6gBAADokGD//0iLi7ABAADohGD//0iLi7gBAADoeGD//0iLi8ABAADobGD//0iLi8gBAADoYGD//0iLi9ABAADoVGD//0iLi6ABAADoSGD//0iLi9gBAADoPGD//0iLi+ABAADoMGD//0iLi+gBAADoJGD//0iLi/ABAADoGGD//0iLi/gBAADoDGD//0iLiwACAADoAGD//0iLiwgCAADo9F///0iLixACAADo6F///0iLixgCAADo3F///0iLiyACAADo0F///0iLiygCAADoxF///0iLizACAADouF///0iLizgCAADorF///0iLi0ACAADooF///0iLi0gCAADolF///0iLi1ACAADoiF///0iLi1gCAADofF///0iLi2ACAADocF///0iLi2gCAADoZF///0iLi3ACAADoWF///0iLi3gCAADoTF///0iLi4ACAADoQF///0iLi4gCAADoNF///0iLi5ACAADoKF///0iLi5gCAADoHF///0iLi6ACAADoEF///0iLi6gCAADoBF///0iLi7ACAADo+F7//0iLi7gCAADo7F7//0iDxCBbw8zMSIXJdGZTSIPsIEiL2UiLCUg7DRlzAAB0BejGXv//SItLCEg7DQ9zAAB0Bei0Xv//SItLEEg7DQVzAAB0BeiiXv//SItLWEg7DTtzAAB0BeiQXv//SItLYEg7DTFzAAB0Beh+Xv//SIPEIFvDSIXJD4QAAQAAU0iD7CBIi9lIi0kYSDsNwHIAAHQF6FVe//9Ii0sgSDsNtnIAAHQF6ENe//9Ii0soSDsNrHIAAHQF6DFe//9Ii0swSDsNonIAAHQF6B9e//9Ii0s4SDsNmHIAAHQF6A1e//9Ii0tASDsNjnIAAHQF6Ptd//9Ii0tISDsNhHIAAHQF6Old//9Ii0toSDsNknIAAHQF6Ndd//9Ii0twSDsNiHIAAHQF6MVd//9Ii0t4SDsNfnIAAHQF6LNd//9Ii4uAAAAASDsNcXIAAHQF6J5d//9Ii4uIAAAASDsNZHIAAHQF6Ild//9Ii4uQAAAASDsNV3IAAHQF6HRd//9Ig8QgW8PMzEBVQVRBVUFWQVdIg+xQSI1sJEBIiV1ASIl1SEiJfVBIiwWaXgAASDPFSIlFCItdYDP/TYvxRYv4iVUAhdt+KkSL00mLwUH/ykA4OHQMSP/ARYXSdfBBg8r/i8NBK8L/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AGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgAgAEkAdAAgAGkAcwAgAG0AbwBzAHQAIABsAGkAawBlAGwAeQAgAHQAaABlACAAcgBlAHMAdQBsAHQAIABvAGYAIABjAGEAbABsAGkAbgBnACAAYQBuACAATQBTAEkATAAtAGMAbwBtAHAAaQBsAGUAZAAgACgALwBjAGwAcgApACAAZgB1AG4AYwB0AGkAbwBuACAAZgByAG8AbQAgAGEAIABuAGEAdABpAHYAZQAgAGMAbwBuAHMAdAByAHUAYwB0AG8AcgAgAG8AcgAgAGYAcgBvAG0AIABEAGwAbABNAGEAaQBuAC4ADQAKAAAAAABSADYAMAAzADIADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AYwBhAGwAZQAgAGkAbgBmAG8AcgBtAGEAdABpAG8AbgANAAoAAAAAAAAAAAAAAAAAUgA2ADAAMwAxAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIAB0AGgAZQAgAEMAUgBUACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AYwBlAC4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4ADQAKAAAAAABSADYAMAAzADAADQAKAC0AIABDAFIAVAAgAG4AbwB0ACAAaQBuAGkAdABpAGEAbABpAHoAZQBkAA0ACgAAAAAAAAAAAAAAAABSADYAMAAyADgADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIABoAGUAYQBwAA0ACgAAAAAAAAAAAFIANgAwADIANwANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwB3AGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABzAHQAZABpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA1AA0ACgAtACAAcAB1AHIAZQAgAHYAaQByAHQAdQBhAGwAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAbABsAA0ACgAAAAAAAABSADYAMAAyADQADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABfAG8AbgBlAHgAaQB0AC8AYQB0AGUAeABpAHQAIAB0AGEAYgBsAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA5AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABvAHAAZQBuACAAYwBvAG4AcwBvAGwAZQAgAGQAZQB2AGkAYwBlAA0ACgAAAAAAAAAAAAAAAAAAAAAAUgA2ADAAMQA4AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAGgAZQBhAHAAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAAAAAAAAAAABSADYAMAAxADcADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAbQB1AGwAdABpAHQAaAByAGUAYQBkACAAbABvAGMAawAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIAB0AGgAcgBlAGEAZAAgAGQAYQB0AGEADQAKAAAAAAAAAAAAAABSADYAMAAxADAADQAKAC0AIABhAGIAbwByAHQAKAApACAAaABhAHMAIABiAGUAZQBuACAAYwBhAGwAbABlAGQADQAKAAAAAAAAAAAAAAAAAFIANgAwADAAOQANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAANAAoAAAAAAAAAAAAAAFIANgAwADAAOAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGEAcgBnAHUAbQBlAG4AdABzAA0ACgAAAAAAAAAAAAAAAAAAAFIANgAwADAAMgANAAoALQAgAGYAbABvAGEAdABpAG4AZwAgAHAAbwBpAG4AdAAgAHMAdQBwAHAAbwByAHQAIABuAG8AdAAgAGwAbwBhAGQAZQBkAA0ACgAAAAAAAAAAAAIAAAAAAAAAEOwAQAEAAAAIAAAAAAAAALDrAEABAAAACQAAAAAAAABQ6wBAAQAAAAoAAAAAAAAAAOsAQAEAAAAQAAAAAAAAAKDqAEABAAAAEQAAAAAAAABA6gBAAQAAABIAAAAAAAAA8OkAQAEAAAATAAAAAAAAAJDpAEABAAAAGAAAAAAAAAAg6QBAAQAAABkAAAAAAAAA0OgAQAEAAAAaAAAAAAAAAGDoAEABAAAAGwAAAAAAAADw5wBAAQAAABwAAAAAAAAAoOcAQAEAAAAeAAAAAAAAAFjnAEABAAAAHwAAAAAAAACQ5gBAAQAAACAAAAAAAAAAIOYAQAEAAAAhAAAAAAAAADDkAEABAAAAeAAAAAAAAAAQ5ABAAQAAAHkAAAAAAAAA8OMAQAEAAAB6AAAAAAAAANDjAEABAAAA/AAAAAAAAADI4wBAAQAAAP8AAAAAAAAAqOMAQAEAAABNAGkAYwByAG8AcwBvAGYAdAAgAFYAaQBzAHUAYQBsACAAQwArACsAIABSAHUAbgB0AGkAbQBlACAATABpAGIAcgBhAHIAeQAAAAAACgAKAAAAAAAAAAAALgAuAC4AAAA8AHAAcgBvAGcAcgBhAG0AIABuAGEAbQBlACAAdQBuAGsAbgBvAHcAbgA+AAAAAABSAHUAbgB0AGkAbQBlACAARQByAHIAbwByACEACgAKAFAAcgBvAGcAcgBhAG0AOgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAEAAQABAAEAAQAIIBggGCAYIBggGCAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQABAAEAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAg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YWwgRXJyb3IgaW4gTGF1bmNoZXIAcgBiAAAAAABGYWlsZWQgdG8gb3BlbiBleGVjdXRhYmxlAAAAAAAAAFVuYWJsZSB0byBmaW5kIGFuIGFwcGVuZGVkIGFyY2hpdmUuAAAAAABVbmFibGUgdG8gcmVhZCBmcm9tIGZpbGUAAAAAIyEAAAAAAAAAAAAASm9iIGluZm9ybWF0aW9uIHF1ZXJ5aW5nIGZhaWxlZABKb2IgaW5mb3JtYXRpb24gc2V0dGluZyBmYWlsZWQAAHN0ZGluIGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAAAAc3Rkb3V0IGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAABzdGRlcnIgZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAFVuYWJsZSB0byBjcmVhdGUgcHJvY2VzcyB1c2luZyAnJXMnAAAAAABGYWlsZWQgdG8gZ2V0IGV4aXQgY29kZSBvZiBwcm9jZXNzAAAAAAAALgBlAHgAZQAAAAAAAAAAAEV4cGVjdGVkIHRvIGZpbmQgYSBjb21tYW5kIGVuZGluZyBpbiAnLmV4ZScgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAAAAAAAEV4cGVjdGVkIHRlcm1pbmF0aW5nIGRvdWJsZS1xdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAAAAAAAAAAAAVGVybWluYXRpbmcgcXVvdGUgd2l0aG91dCBzdGFydGluZyBxdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAABGYWlsZWQgdG8gZmluZCBzaGViYW5nAABFeHBlY3RlZCB0byBmaW5kIHRlcm1pbmF0b3IgaW4gc2hlYmFuZyBsaW5lAAAAAABFeHBlY3RlZCB0byBkZWNvZGUgc2hlYmFuZyBsaW5lIHVzaW5nIFVURi04AAAAAABFeHBlY3RlZCB0byBmaW5kICcjJyBhdCBzdGFydCBvZiBzaGViYW5nIGxpbmUAAABFeHBlY3RlZCB0byBmaW5kICchJyBmb2xsb3dpbmcgJyMnIGluIHNoZWJhbmcgbGluZQAAAAAAAEV4cGVjdGVkIHRvIGZpbmQgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUAAAAA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AOoUAQAAAAAA/BQBAAAAAAAMFQEAAAAAAAAAAAAAAAAA1hABAAAAAAAAAAAAAAAAAB8BRXhpdFByb2Nlc3MAjQFHZXRDb21tYW5kTGluZVcAfgRTZXRJbmZvcm1hdGlvbkpvYk9iamVjdABoAUZyZWVMaWJyYXJ5AKgAQ3JlYXRlUHJvY2Vzc1cAAMYBR2V0Q3VycmVudFByb2Nlc3MACAVXYWl0Rm9yU2luZ2xlT2JqZWN0AG0BR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AAAWAEFzc2lnblByb2Nlc3NUb0pvYk9iamVjdAAA5gFHZXRFeGl0Q29kZVByb2Nlc3MAABoCR2V0TW9kdWxlRmlsZU5hbWVXAACnA1F1ZXJ5SW5mb3JtYXRpb25Kb2JPYmplY3QAaQNNdWx0aUJ5dGVUb1dpZGVDaGFyAJUAQ3JlYXRlSm9iT2JqZWN0QQAAawJHZXRTdGRIYW5kbGUAAAgCR2V0TGFzdEVycm9yAABMAkdldFByb2NBZGRyZXNzAAA+A0xvYWRMaWJyYXJ5QQAAOwRTZXRDb25zb2xlQ3RybEhhbmRsZXIA7ABEdXBsaWNhdGVIYW5kbGUAUgBDbG9zZUhhbmRsZQBLRVJORUwzMi5kbGwAAEUBU3RyU3RySVcAAFNITFdBUEkuZGxsAB4CR2V0TW9kdWxlSGFuZGxlVwAAywBEZWNvZGVQb2ludGVyANcCSGVhcEZyZWUAANMCSGVhcEFsbG9jAHACR2V0U3RyaW5nVHlwZVcAAIwBR2V0Q29tbWFuZExpbmVBAGoCR2V0U3RhcnR1cEluZm9XAM4EVGVybWluYXRlUHJvY2VzcwAA4gRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAALMEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAIDSXNEZWJ1Z2dlclByZXNlbnQAJgRSdGxWaXJ0dWFsVW53aW5kAAAfBFJ0bExvb2t1cEZ1bmN0aW9uRW50cnkAABgEUnRsQ2FwdHVyZUNvbnRleHQAJQRSdGxVbndpbmRFeADyAEVudGVyQ3JpdGljYWxTZWN0aW9uAAA7A0xlYXZlQ3JpdGljYWxTZWN0aW9uAADrAkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQA7gBFbmNvZGVQb2ludGVyANIARGVsZXRlQ3JpdGljYWxTZWN0aW9uAEEDTG9hZExpYnJhcnlXAABaAUZsc0dldFZhbHVlAFsBRmxzU2V0VmFsdWUAWQFGbHNGcmVlAIAEU2V0TGFzdEVycm9yAADLAUdldEN1cnJlbnRUaHJlYWRJZAAAWAFGbHNBbGxvYwAANAVXcml0ZUZpbGUA2wJIZWFwU2V0SW5mb3JtYXRpb24AAKoCR2V0VmVyc2lvbgAA1QJIZWFwQ3JlYXRlAADDA1JlYWRGaWxlAAB8BFNldEhhbmRsZUNvdW50AAD6AUdldEZpbGVUeXBlAHQEU2V0RmlsZVBvaW50ZXIAABkCR2V0TW9kdWxlRmlsZU5hbWVBAABnAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXACAFV2lkZUNoYXJUb011bHRpQnl0ZQDhAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAmgJHZXRUaWNrQ291bnQAAMcBR2V0Q3VycmVudFByb2Nlc3NJZACAAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAMAEU2xlZXAAjwBDcmVhdGVGaWxlVwB4AUdldENQSW5mbwBuAUdldEFDUAAAPgJHZXRPRU1DUAAADANJc1ZhbGlkQ29kZVBhZ2UA3AJIZWFwU2l6ZQAAoAFHZXRDb25zb2xlQ1AAALIBR2V0Q29uc29sZU1vZGUAAJQEU2V0U3RkSGFuZGxlAABdAUZsdXNoRmlsZUJ1ZmZlcnMAANoCSGVhcFJlQWxsb2MAYQRTZXRFbmRPZkZpbGUAAFECR2V0UHJvY2Vzc0hlYXAAAC8DTENNYXBTdHJpbmdXAAAzBVdyaXRlQ29uc29sZVcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAyot8tmSsAAM1dINJm1P//AAAAAAAAAABASAFAAQAAAAAAAAAAAAAAQEgBQAEAAAABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgMDAwMDAwMDAAAAAAAAAACg7wBAAQAAAKLxAEABAAAA//////////+ACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAQwAAAAAAAAAAAAAAAAAAADD7AEABAAAALPsAQAEAAAAo+wBAAQAAACT7AEABAAAAIPsAQAEAAAAc+wBAAQAAABj7AEABAAAAEPsAQAEAAAAI+wBAAQAAAAD7AEABAAAA8PoAQAEAAADg+gBAAQAAANT6AEABAAAAyPoAQAEAAADE+gBAAQAAAMD6AEABAAAAvPoAQAEAAAC4+gBAAQAAALT6AEABAAAAsPoAQAEAAACs+gBAAQAAAKj6AEABAAAApPoAQAEAAACg+gBAAQAAAJz6AEABAAAAmPoAQAEAAACQ+gBAAQAAAID6AEABAAAAdPoAQAEAAABs+gBAAQAAALT6AEABAAAAZPoAQAEAAABc+gBAAQAAAFT6AEABAAAASPoA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AKQGAQDYXQAAlF4AACgDAQCUXgAAV18AAOQGAQBYXwAAj18AANgHAQCQXwAA0V8AAEAMAQDUXwAA7F8AAEAMAQDsXwAAvGEAAOQJAQC8YQAANWIAACgDAQA4YgAAaGMAAAgEAQBoYwAAN2UAAAwHAQA4ZQAALmYAACgHAQAwZgAAJGcAAMAHAQAkZwAA12cAADgHAQDgZwAAXmgAAEQHAQBgaAAA42gAAEQHAQDkaAAAaWkAAEQHAQBsaQAAFmoAAFwHAQAYagAAwHEAAIQHAQDAcQAAknIAAJwHAQCUcgAAxnIAALgFAQDIcgAA3nMAAMAHAQDgcwAAeHQAAEAMAQCkdAAAB3UAANgHAQAIdQAAJXUAAEAMAQAodQAAaHUAAEAMAQCAdQAAtHgAAOAHAQDkeQAAXXsAAKAKAQBgewAAt3sAANgHAQC4ewAALXwAAOQHAQAwfAAAvHwAAOQJAQC8fAAArH4AAAQIAQCsfgAAZn8AACQIAQBofwAA+H8AAKAJAQD4fwAAbYIAAEgIAQBwggAAToQAAGQIAQBQhAAAeIQAAEAMAQB4hAAAsYQAAEAMAQDQhAAAeIUAAJgIAQB4hQAAgIcAAJwIAQCAhwAABYgAANgHAQAIiAAA14gAANgHAQD0iAAAX4kAANgHAQBgiQAAoIkAAEAMAQCgiQAA5okAANgHAQDoiQAAOYoAALgIAQA8igAA0YoAAKgJAQDUigAAo5UAAMwIAQCklQAAOZYAACgDAQA8lgAAH5cAAPAIAQAglwAAgJ4AABwJAQCAngAAX58AAEAJAQBgnwAAs58AANgHAQC0nwAAE6AAAEAMAQAUoAAAE6IAAGwJAQAsogAAoaMAAIgJAQCsowAA8aMAAKAJAQD0owAAO6QAAKAJAQA8pAAAc6QAANgHAQB0pAAAxaQAALgIAQDIpAAAYqUAAKgJAQBkpQAAvrAAAMAJAQDAsAAAbbEAAOQJAQBwsQAAGrIAAPgJAQAcsgAAkLIAAEAMAQCQsgAANbMAAAgKAQBgswAAaLUAADgKAQBotQAAP7YAAHgKAQBAtgAAu7YAALwLAQDQtgAAMbcAANgHAQA0twAAB7gAAKAKAQAIuAAAoLkAALAKAQCguQAAbroAAMwKAQBwugAAn7oAAEAMAQCgugAAdbsAANQKAQCQuwAA3rsAAOAKAQDguwAAzr8A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/8nJyf/Kysr//////1Ph//9O3v//Str//0bX//9C1P//PdD//znN//81yv//MMX//yzC//8ov////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn4+Pj/wcHBkSUlJTXHx8eO8PDw/8fHx//v7+//7+/v/+7u7v/u7u7/7u7u/97e3v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/Q0ND/3t7e/+Dg4P/v7+//+vr6/////////////////1bk//9S4f//Tt3//0na//9F1///sO3/////////////////////////////////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs//v7+//RuZ3/pXxK/5pxP/+Wb0D//////1rm//9V4///UeD//03d//9J2f//RNb//0DT//88z///N8z//zPJ//8vxP//K8H//ya+//8iuv//Lbz//47c///+///MAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/ycnJjDQ0NCLW1taE8fHx/8jIyP/x8fH/8PDw//Dw8P/w8PD/6enp/9fX1//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/S0tL/6+vr/9/MtP+ndzz/o3U9/55zPv+acT///////13p//9Z5v//VeP//1Df//9M3P//SNn//0PV//8/0v//O8///zfL//8yyP//LsT//yrA//8lvf//Ibr//x+4//+q5f//////gQAAAAAAAAAAAAAAAAAAABn5+fn/IiIiNAAAABc4ODgm8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/5+fn/83Nzf/v7+//7+/v/9PT0//Nzc3/7u7u/+7u7v/S0tL//Pz8/8CXZP+reTz/pnc9/6J1Pf+dcz7//////2Hs//9c6f//WOX//1Ti//9Q3///S9v//0fY//9D1f//PtH//zrO//82y///Mcf//y3D//8pwP//Jbz//yC5//9PyP//////zgAAAAAAAAAAAAAAAAAAABn5+fn/w8PDkSUlJTXKysqO8/Pz/8rKyv/y8vL/8vLy//Ly8v/x8fH/8PDw/9/f3//w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//S0tL//v7+/7WBQf+uezv/qnk8/6V3Pf+hdD7//////3Pv//9g6///XOj//1fl//9T4f//T97//0rb//9G1///QtT//z7R//85zf//Ncr//zHH//8swv//KL///yS8//8ou///////9wAAAAAAAAAAAAAAAAAAABn6+vr/9fX1//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/v7+///////7d/Of+yfDr/rno7/6l4PP+ldj3/9fDq/9f6//9z7///X+v//1vn//9X5P//UuH//07d//9K2v//Rdf//0HT//890P//OM3//zTJ//8wxf//LML//ye///8ju////////wAAAAAAAAAAAAAAAAAAABn6+vr/zMzMjDU1NSLZ2dmE9PT0/8vLy//09PT/5+fn//Pz8//m5ub/8/Pz//Ly8v/n5+f/3Nzc/+Tk5P/k5OT/5ubm/+Pj4//U1NT//////7qAOf+2fjn/sXw6/616O/+oeDz/vJlv//Tv6f/////////////////////////////////////////////////p+v//bdv//zjM//8zyf//L8X//yvB//8nvv///////wAAAAAAAAAAAAAAAAAAABn7+/v/IiIiNAAAABc6Ojom9fX1//X19f/19fX/19fX//Pz8//U1NT/8vLy//Pz8//m5ub/0dHR/8/Pz//MzMz/0NDQ/87Ozv/V1dX//////76COP+5gDn/tX46/7B8O/+sejv/p3c8/6N1Pf+ecz7/mnE//5VvQP+RbUH/jGtC/4hpQ/+DZ0P/f2RE/4t1Wv/e19D/6fr//zvP//83zP//M8j//y7E//8qwf///////wAAAAAAAAAAAAAAAAAAABn7+/v/x8fHkSUlJTXMzMyO9fX1/8zMzP/19fX/1dXV//Ly8v/Kysr/5ubm//T09P/n5+f/4ODg/+Xl5f/k5OT/5OTk/+rq6v/U1NT//v7+/8OIPv+9gjj/uIA5/7R9Ov+wezv/q3k8/6d3PP+idT3/nnM+/5lxP/+Vb0D/kG1B/4xqQv+HaEP/g2ZE/35kRf+LdVr//////z/S//86zv//Nsv//zLI//81xf//////9wAAAAAAAAAAAAAAAAAAABn8/Pz/+Pj4//f39//39/f/qKio/6urq//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//y8vL//f39/9CeYf/Bgzf/vIE4/7h/Of+zfTr/r3s7/6p5PP+mdz3/oXU+/51yPv+YcD//lG5A/49sQf+LakL/hmhD/4JmRP99ZEX//////0LU//8+0f//Os7//zXK//9e0///////zgAAAAAAAAAAAAAAAAAAABn8/Pz/z8/PjDU1NSLc3NyE+Pj4/4aGhv+srKz/9/f3//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//T09P/z8/P/+Pj4/+jRs//ChDf/wIM3/7uBOP+3fzn/sn06/657O/+peDz/pXY9/6B0Pv+ccj//l3BA/5NuQP+ObEH/impC/4VnQ/+BZUT//////0bX//9B1P//PdD//znN//+z6///////gQAAAAAAAAAAAAAAAAAAABn8/Pz/IiIiNAAAABc7Ozsm+Pj4//X19f+IiIj/rKys//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//39/P/hwZr/xYxD/7+DOP+7gDn/tn45/7J8Ov+tejv/qHg8/6R2Pf+gdD7/m3I//5dwQP+SbUH/jmtB/4lpQv+FZ0P//////0na//9F1v//TNb//53n///+///LAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/ycnJkVFRUUpubm7K9/f3/87Ozv/MzMz/fn5+/6ysrP/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//X19f/7+/v//v7+////////////////////////////////////////////18Su/5pxP/+Wb0D/kW1B/41rQv+IaUP/////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/8/Pz/0hISP8iIiL/qamp//r6+v/s7Oz/iYmJ/3Z2dv+srKz/+Pj4//j4+P/39/f/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT/////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AAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABwAAAAcAAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///4H////J////9v////////////////////b////I////gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAYISEhMFxcXEplZWVRNjY2RDU1NUEAAAAwAAAAJAAAABUAAAAKAAAAAgAAAAD///+B3fj//3bi//9I1v//PM///zbL//8wxf//MsP//1zO///W8v//////gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcBQUFN4GBgXHp6en45ubm/+Hh4fXW1tbp29vb7Nzc3Nq0tLSidnZ2aiYmJkQAAAAxAAAAIv7+/u9n5P//TNz//0bX//9A0///O87//zXK///U8///z/H//z/E///////uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHcDAwKPm5ub46Ojo/+fn5//l5eX/5ubm/+bm5v/k5OT/5OTk/97e3v/i4uL+4uLi89jY2NPQ0NC6/////1bk//9R4P//S9v//0XX//8/0v//Oc3//9X0///Q8v//KL////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8/Pz/4KCgmGUlJRW6Ojo/8LCwv/Kysr/z8/P/83Nzf/c3Nz/0dHR/8nJyf/FxcX/ysrK/8nJyf//////W+j//1Xj//9Q3///Str//0TW//8+0f//OM3//zLI//8tw////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/09PT/dXV1bnt7e2rq6ur/zs7O/9LS0v/c3Nz/1dXV/+fn5//e3t7/4uLi//39/f////////////////9g6///Wuf//1Ti//9P3v//tPD////////////////////////////////////////////v////gQAAAAAAAAAAAAAAH/T09P/s7Oz/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo//Dw8P/t5dr/p4NW/5VvQP+ObEH//////2Lt//9f6v//Web//1Pi//9N3f//R9j//0LU//88z///Nsv//zDF//8rwf//Jbz//zzB///V8v//////gQAAAAAAAAAf9fX1/4SEhGGXl5dW7Ozs/+zs7P/r6+v/5ubm/8PDw//q6ur/+vr6/7uZbf+gdD7/mnE//5NuQP//////Yu3//2Lt//9e6v//WOX//1Lh//9M3P//Rtj//0HT//87z///Ncr//y/F//8pwP//JLz//1nL///////IAAAAAAAAAB/29vb/d3d3bn19fWrt7e3/7e3t/+zs7P/r6+v/1tbW/+vr6//+/v7/rn5D/6V2Pf+ecz7/mHA///////9i7f//Yu3//2Hs//9d6f//V+T//1Hg//9L2///Rdf//0DS//86zv//NMn//y7E//8ov///K73///////YAAAAAAAAAH/f39//w8PD/7+/v/+/v7//u7u7/7u7u/+3t7f/t7e3/7Ozs//////+wezv/qXg8/6N2Pf+dcz7/9O/q/4Hx//9i7f//Yu3//2Hs//9b6P//VuP//1Df//9K2v//RNb//z/R//85zf//M8j//y3D//8nvv///////wAAAAAAAAAf9/f3/4aGhmGZmZlW8PDw/+/v7//v7+//7e3t/8nJyf/t7e3//////7V+Ov+uezv/qHg8/6J1Pf+2l3D/9O/p///////////////////////////////////////q+v//ct///z3R//83zP//Msj//yzC////////AAAAAAAAAB/4+Pj/eXl5bn9/f2rx8fH/8fHx//Dw8P/v7+//3d3d/+7u7v//////uYA5/7N9Ov+tejv/p3c8/6F1Pv+bcj//lW9A/49sQf+JaUL/g2ZE/31kRf98Y0X/fGNF/5aCaf/q+v//QtT//zzQ//82y///Mcf///////8AAAAAAAAAH/j4+P/z8/P/8/Pz//Ly8v/y8vL/8fHx//Hx8f/w8PD/8PDw//7+/v/Bhz//uH85/7J9Ov+sejv/pnc9/6B0Pv+acT//lG5A/45rQf+IaUP/gmZE/31jRf98Y0X/fWRG//////9H2P//QdP//zvP//89zP//////9gAAAAAAAAAf+fn5/4mJiWGcnJxW9PT0/+Hh4f/j4+P/7u7u//Ly8v/d3d3/8vLy/9Kjaf+9gjj/t385/7F8Ov+reTz/pXY9/59zPv+ZcT//k25A/41rQv+HaEP/gGVE/3xjRf98Y0X//////0zc//9G1///QNP//23b///////IAAAAAAAAAB/6+vr/enp6boGBgWr19fX/3Nzc/+Dg4P/a2tr/8/Pz/97e3v/x8fH/9OjZ/8qTUP+8gTj/tn45/7B7O/+qeTz/pHY9/55zPv+YcD//km1B/4tqQv+FZ0P/f2VE/3xjRf//////UN///0rb//9c2///3Pf//////4EAAAAAAAAAH/v7+//39/f/9vb2/9fX1//29vb/9fX1//X19f/09PT/9PT0//Pz8//5+fn//v7+///////////////////////////////////////Twq//kG1B/4pqQv+EZ0P/fmRF/////////////////////+////+BAAAAAAAAAAAAAAAf+/v7/4uLi2Genp5Wqamp/7W1tf/X19f/8vLy/8jIyP/U1NT/29vb//T09P/e3t7/6urq//Ly8v//////tH06/656O/+oeDz/onU9/5tyP/+Vb0D/j2xB/4lpQv+DZkT//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8/Pz/fHx8boeHh2339/f/j4+P/8PDw//o6Oj/5OTk/+fn5//u7u7/9fX1//Dw8P/y8vL/9PT0//////+5gDn/7uLU/+3i1v+ndz3/oHQ+/5pxP/+UbkD/jmxB/4hpQ///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/39/f+kpKT/SkpK//n5+f/Gxsb/f39//9bW1v/4+Pj/9/f3//f39//29vb/9vb2//X19f/19fX//v7+/8WRUP/w5NT/7+PW/6t5PP+ldj3/n3Q+/5lxP/+TbkD/m35Z/////+4AAAAAAAAAAAAAAAAAAAAAAAAAANbW1gIAAAAf/f39/1ZWVuE/Pz//d3d3/6urq/9paWn/ioqK/8DAwP/5+fn/7+/v/93d3f/39/f/8PDw/9fX1//k5OT/8+ja/86ha/+5g0H/sHw7/6p5PP+kdj3/onlG/7KVcP/r5Nz/////gQAAAAAAAAAAAAAAAAAAAAAAAAAAPj4+M0BAQHn+/v7/fn5+b2JiYscwMDD/a2tr/0BAQP+Ojo7/tra2//r6+v/4+Pj/9PT0//j4+P/y8vL/4uLi/97e3v/29vb//f39///////////////////////+/v7/8vLy0vv7+4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0tVZycnP/Q0ND/1dXV/4CAgP88PDz/JiYm/1tbW//v7+//+/v7//r6+v/6+vr/+vr6//n5+f/4+Pj/+Pj4//f39//39/f/9vb2//T09P/s7Oz/4+Pj/9jY2P8AAAA2AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf0NDQ/3V1depzc3P/V1dX/0lJSf8kJCT/JiYm/3Fxcf/d3d3/4ODg/+vr6//j4+P/9vb2//X19f/s7Oz/8fHx//X19f/19fX/7e3t/GxsbGd8fHxzysrK/gAAADQAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+/v7/YmJikGhoaMaRkZH/mJiY/1VVVf8wMDD/UVFR/319ff/x8fH/5ubm/+Li4v/29vb/9vb2/9HR0f/Pz8//0dHR/8/Pz//Jycn6LS0te2JiYp/MzMztAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/39/f/8/Pz/z8/P/8rKyv/7+/v/vLy8/2lpaf9MTEz/QkJC/6SkpP/+/v7//f39//39/f/5+fn/1NTU//z8/P/29vb/7Ozs/+Hh4f/a2tr/5ubm/7+/v48AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/Pz8/4yMjGGhoaFW+/v7//z8/P/6+vr/vLy8/2dnZ/8rKyv/Tk5O/8rKyv/+/v7//v7+//z8/P/X19f/+vr6/9XV1f/Dw8P/6Ojo/8fHx/+ysrKhAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/7+/v/fHx8boODg2r6+vr/39/f/+3t7f/u7u7/urq6/11dXf90dHT/a2tr//v7+////////f39/9XV1f/x8fH/wsLC/7m5uf/l5eX/oaGhnAAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/v7+//4+Pj/+Pj4//n5+f/5+fn/+vr6//r6+v/7+/v/3Nzc/3Jycv93d3f/s7Oz//z8/P/19fX/z8/P/+bm5v/o6Oj/6urq/9PT06YAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+vr6/4qKimGenp5W+Pj4//j4+P/5+fn/+fn5//r6+v/p6en/6Ojo/7Gxsf+dnZ3/y8vL/9bW1v+7u7v/4uLi/+rq6v/T09OmAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/5+fn/enp6boGBgWr29vb/3Nzc/+rq6v/q6ur/3d3d/+Pj4//09PT/6Ojo/+Hh4f+oqKj/zMzM/7e3t//v7+//09PTpgAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/r6+v/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//39/f/8vLy/+Xl5f+wsLD/19fX7cvLy4kAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAOAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/B+AP+ABAB+AAAAfgAAAH4AAAB+AAAABgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAYAAAB+AAAAfgAAAHwAAAB8AAAA/gAAAP4AAAD+AAAB/gAAAf4AAAP+AAAH/gAAD/4AAB/+AAA//gAAf/4AAP/8oAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ2dnUOfn5+0oqKi9qSkpO6lpaWSpqamDgAAAAAAAAAAAAAAAKysrO+rq6tvqqqqDgAAAAClpaUEo6OjSaCgoL6tra3/5eXl//39/f//////+/v7//Hx8dYAAAAAAAAAAAAAAACvr6//wcHB/66urvuqqqrgqKio9LOzs//Nzc3/9vb2/67x//9T2///PdD//z/L//+b4v//////twAAAAAAAAAAs7Oz/9zc3P/z8/P/5OTk/+fn5//p6en/6Ojo//7+/v9f6f//UeD//0bX///S9P//NMf///////YAAAAAAAAAALa2tv/Nzc3/4uLi/+3t7f/t7e3/+fn5//7+/v//////Ye3//1rn//+38v//////////////////////9f///7a5ubn/3d3d//b29v/w8PD/+vr6/9C8pP+Rb0X//////2Pt//9h7P//WOX//03d//9C1P//N8z//zDD//+Z4P//vb29/87Ozv/k5OT/8vLy//7+/v+pfkn/mXE///Pv6v+b9P//Y+3//2Dr//9W4///S9v//0DS//81yv//OMX//8DAwP/Gxsb/7e3t//X19f//////rXo7/6J1Pf+zlXH/8+/q/////////////////+v7//924v//PtH//zPI//+zs7P/ra2t/6SkpP/v7+///////7uGRf+reTz/oHQ+/5RuQP+JaUL/fmRF/31kRv+snIn/6/v//0fY//9I0v//r6+v/1lZWf91dXX/sbGx//b29v/gxKH/toA9/6l4PP+ecz7/km1B/4doQ/99ZEX/fWVH//////9T3///qOz//5ubm/9/f3//NDQ0/3x8fP/c3Nz//f39//7+/v/////////////////QwbD/hWdD/31jRf//////////9f///7W9vb3/oaGh/6ioqP9NTU3/lpaW//7+/v/9/f3//////7F+Pv/q4NP/mXE//45rQf+FaUf/////9AAAAAAAAAAAwcHB/8/Pz//l5eX/ubm5/1JSUv/AwMD/+Pj4//r6+v/ewqL/soJH/6N1Pf+deEv/yrqn/////7UAAAAAAAAAAL6+vv/e3t7/9/f3//n5+f+7u7v/nJyc/+3t7f/h4eH//v7+//39/f///////v7+/+zs7P8AAAAAAAAAAAAAAAC7u7v/zs7O/+Tk5P/29vb/+Pj4//f39//f39//+vr6//z8/P/IyMj/+fn5/8zMzP+/v79/AAAAAAAAAAAAAAAAt7e3/7m5uf+7u7v/vb29/7+/v//BwcH/w8PD/8XFxf/IyMj/ycnJ/8fHx//ExMR/AAAAAAAAAAAAAAAAAAAAAH4HrEEQB6xBAAOsQQADrEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAAOsQQADrEEAB6xBAAesQQAPrEEAAAEABwAgIBAAAQAEAOgCAAABABAQEAABAAQAKAEAAAIAICAAAAEACACoCAAAAwAQEAAAAQAIAGgFAAAEADAwAAABACAAqCUAAAUAICAAAAEAIACoEAAABgAQEAAAAQAgAGgEAAAHADxhc3NlbWJseSB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIj4NCiAgPHRydXN0SW5mbyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjMiPg0KICAgIDxzZWN1cml0eT4NCiAgICAgIDxyZXF1ZXN0ZWRQcml2aWxlZ2VzPg0KICAgICAgICA8cmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWwgbGV2ZWw9ImFzSW52b2tlciIgdWlBY2Nlc3M9ImZhbHNlIj48L3JlcXVlc3RlZEV4ZWN1dGlvbkxldmVsPg0KICAgICAgPC9yZXF1ZXN0ZWRQcml2aWxlZ2VzPg0KICAgIDwvc2VjdXJpdHk+DQogIDwvdHJ1c3RJbmZvPg0KPC9hc3NlbWJseT5QQVBBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRADgAABEAAAAsKK4osCiyKLgouiiWKNgo3isiKyYrKisuKzIrNis6Kz4rAitGK0orTitSK1YrWiteK2IrZitqK24rcitACABAOgAAAAgoDCgoKeop7CnuKfAp8in0KfYp+Cn6KfwqPiocKl4qYCpiKmQqZipoKmoqbCpuKnAqcip0KnYqeCp6KnwqfipAKoIqhCqGKogqiiqMKo4qkCqSKpQqliqYKpoqnCqeKqAqoiqkKqYqqCqqKqwqriqwKrYquCq6KrwqviqAKsIqxCrGKsgqyirMKs4q0CrSKtQq1irYKtoq3CreKuAq4irkKuYq6CrqKuwq7irwKvIq9Cr2Kvgq+ir8Kv4qwCsCKwQrBisIKworJisuKzYrPisGK1YrXCteK2ArYitkK0AAAAwAQA4AAAA0KHQotii6KL4ogCjCKMQoxijIKMoozCjOKNAo0ijWKNgo2ijcKN4o4CjiKOQowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQSwMEFAAAAAAAAAAhAF/UoKnLmAAAy5gAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvd2hlZWwucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBiYXNlNjQKaW1wb3J0IGNvZGVjcwppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IGRpc3R1dGlscy51dGlsCmZyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2VfZnJvbV9maWxlCmltcG9ydCBoYXNobGliCmltcG9ydCBpbXAKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKCmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18sIERpc3RsaWJFeGNlcHRpb24KZnJvbSAuY29tcGF0IGltcG9ydCBzeXNjb25maWcsIFppcEZpbGUsIGZzZGVjb2RlLCB0ZXh0X3R5cGUsIGZpbHRlcgpmcm9tIC5kYXRhYmFzZSBpbXBvcnQgSW5zdGFsbGVkRGlzdHJpYnV0aW9uCmZyb20gLm1ldGFkYXRhIGltcG9ydCBNZXRhZGF0YSwgTUVUQURBVEFfRklMRU5BTUUKZnJvbSAudXRpbCBpbXBvcnQgKEZpbGVPcGVyYXRvciwgY29udmVydF9wYXRoLCBDU1ZSZWFkZXIsIENTVldyaXRlciwgQ2FjaGUsCiAgICAgICAgICAgICAgICAgICBjYWNoZWRfcHJvcGVydHksIGdldF9jYWNoZV9iYXNlLCByZWFkX2V4cG9ydHMsIHRlbXBkaXIpCmZyb20gLnZlcnNpb24gaW1wb3J0IE5vcm1hbGl6ZWRWZXJzaW9uLCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpjYWNoZSA9IE5vbmUgICAgIyBjcmVhdGVkIHdoZW4gbmVlZGVkCgppZiBoYXNhdHRyKHN5cywgJ3B5cHlfdmVyc2lvbl9pbmZvJyk6CiAgICBJTVBfUFJFRklYID0gJ3BwJwplbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICBJTVBfUFJFRklYID0gJ2p5JwplbGlmIHN5cy5wbGF0Zm9ybSA9PSAnY2xpJzoKICAgIElNUF9QUkVGSVggPSAnaXAnCmVsc2U6CiAgICBJTVBfUFJFRklYID0gJ2NwJwoKVkVSX1NVRkZJWCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigncHlfdmVyc2lvbl9ub2RvdCcpCmlmIG5vdCBWRVJfU1VGRklYOiAgICMgcHJhZ21hOiBubyBjb3ZlcgogICAgVkVSX1NVRkZJWCA9ICclcyVzJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdClBZVkVSID0gJ3B5JyArIFZFUl9TVUZGSVgKSU1QVkVSID0gSU1QX1BSRUZJWCArIFZFUl9TVUZGSVgKCkFSQ0ggPSBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKS5yZXBsYWNlKCctJywgJ18nKS5yZXBsYWNlKCcuJywgJ18nKQoKQUJJID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdTT0FCSScpCmlmIEFCSSBhbmQgQUJJLnN0YXJ0c3dpdGgoJ2NweXRob24tJyk6CiAgICBBQkkgPSBBQkkucmVwbGFjZSgnY3B5dGhvbi0nLCAnY3AnKQplbHNlOgogICAgZGVmIF9kZXJpdmVfYWJpKCk6CiAgICAgICAgcGFydHMgPSBbJ2NwJywgVkVSX1NVRkZJWF0KICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X0RFQlVHJyk6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnZCcpCiAgICAgICAgaWYgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdXSVRIX1BZTUFMTE9DJyk6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnbScpCiAgICAgICAgaWYgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdQeV9VTklDT0RFX1NJWkUnKSA9PSA0OgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJ3UnKQogICAgICAgIHJldHVybiAnJy5qb2luKHBhcnRzKQogICAgQUJJID0gX2Rlcml2ZV9hYmkoKQogICAgZGVsIF9kZXJpdmVfYWJpCgpGSUxFTkFNRV9SRSA9IHJlLmNvbXBpbGUocicnJwooP1A8bm0+W14tXSspCi0oP1A8dm4+XGQrW14tXSopCigtKD9QPGJuPlxkK1teLV0qKSk/Ci0oP1A8cHk+XHcrXGQrKFwuXHcrXGQrKSopCi0oP1A8Ymk+XHcrKQotKD9QPGFyPlx3KyhcLlx3KykqKQpcLndobCQKJycnLCByZS5JR05PUkVDQVNFIHwgcmUuVkVSQk9TRSkKCk5BTUVfVkVSU0lPTl9SRSA9IHJlLmNvbXBpbGUocicnJwooP1A8bm0+W14tXSspCi0oP1A8dm4+XGQrW14tXSopCigtKD9QPGJuPlxkK1teLV0qKSk/JAonJycsIHJlLklHTk9SRUNBU0UgfCByZS5WRVJCT1NFKQoKU0hFQkFOR19SRSA9IHJlLmNvbXBpbGUoYnInXHMqIyFbXlxyXG5dKicpClNIRUJBTkdfREVUQUlMX1JFID0gcmUuY29tcGlsZShicideKFxzKiMhKCJbXiJdKyJ8XFMrKSlccysoLiopJCcpClNIRUJBTkdfUFlUSE9OID0gYicjIXB5dGhvbicKU0hFQkFOR19QWVRIT05XID0gYicjIXB5dGhvbncnCgppZiBvcy5zZXAgPT0gJy8nOgogICAgdG9fcG9zaXggPSBsYW1iZGEgbzogbwplbHNlOgogICAgdG9fcG9zaXggPSBsYW1iZGEgbzogby5yZXBsYWNlKG9zLnNlcCwgJy8nKQoKCmNsYXNzIE1vdW50ZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmltcHVyZV93aGVlbHMgPSB7fQogICAgICAgIHNlbGYubGlicyA9IHt9CgogICAgZGVmIGFkZChzZWxmLCBwYXRobmFtZSwgZXh0ZW5zaW9ucyk6CiAgICAgICAgc2VsZi5pbXB1cmVfd2hlZWxzW3BhdGhuYW1lXSA9IGV4dGVuc2lvbnMKICAgICAgICBzZWxmLmxpYnMudXBkYXRlKGV4dGVuc2lvbnMpCgogICAgZGVmIHJlbW92ZShzZWxmLCBwYXRobmFtZSk6CiAgICAgICAgZXh0ZW5zaW9ucyA9IHNlbGYuaW1wdXJlX3doZWVscy5wb3AocGF0aG5hbWUpCiAgICAgICAgZm9yIGssIHYgaW4gZXh0ZW5zaW9uczoKICAgICAgICAgICAgaWYgayBpbiBzZWxmLmxpYnM6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5saWJzW2tdCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYubGliczoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgcmVzdWx0ID0gc3lzLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgZnVsbG5hbWUgbm90IGluIHNlbGYubGliczoKICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCd1bmFibGUgdG8gZmluZCBleHRlbnNpb24gZm9yICVzJyAlIGZ1bGxuYW1lKQogICAgICAgICAgICByZXN1bHQgPSBpbXAubG9hZF9keW5hbWljKGZ1bGxuYW1lLCBzZWxmLmxpYnNbZnVsbG5hbWVdKQogICAgICAgICAgICByZXN1bHQuX19sb2FkZXJfXyA9IHNlbGYKICAgICAgICAgICAgcGFydHMgPSBmdWxsbmFtZS5yc3BsaXQoJy4nLCAxKQogICAgICAgICAgICBpZiBsZW4ocGFydHMpID4gMToKICAgICAgICAgICAgICAgIHJlc3VsdC5fX3BhY2thZ2VfXyA9IHBhcnRzWzBdCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKX2hvb2sgPSBNb3VudGVyKCkKCgpjbGFzcyBXaGVlbChvYmplY3QpOgogICAgIiIiCiAgICBDbGFzcyB0byBidWlsZCBhbmQgaW5zdGFsbCBmcm9tIFdoZWVsIGZpbGVzIChQRVAgNDI3KS4KICAgICIiIgoKICAgIHdoZWVsX3ZlcnNpb24gPSAoMSwgMSkKICAgIGhhc2hfa2luZCA9ICdzaGEyNTYnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lPU5vbmUsIHNpZ249RmFsc2UsIHZlcmlmeT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZSB1c2luZyBhICh2YWxpZCkgZmlsZW5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5zaWduID0gc2lnbgogICAgICAgIHNlbGYuc2hvdWxkX3ZlcmlmeSA9IHZlcmlmeQogICAgICAgIHNlbGYuYnVpbGR2ZXIgPSAnJwogICAgICAgIHNlbGYucHl2ZXIgPSBbUFlWRVJdCiAgICAgICAgc2VsZi5hYmkgPSBbJ25vbmUnXQogICAgICAgIHNlbGYuYXJjaCA9IFsnYW55J10KICAgICAgICBzZWxmLmRpcm5hbWUgPSBvcy5nZXRjd2QoKQogICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYubmFtZSA9ICdkdW1teScKICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gJzAuMScKICAgICAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbSA9IE5BTUVfVkVSU0lPTl9SRS5tYXRjaChmaWxlbmFtZSkKICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgIGluZm8gPSBtLmdyb3VwZGljdCgnJykKICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IGluZm9bJ25tJ10KICAgICAgICAgICAgICAgICMgUmVpbnN0YXRlIHRoZSBsb2NhbCB2ZXJzaW9uIHNlcGFyYXRvcgogICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gaW5mb1sndm4nXS5yZXBsYWNlKCdfJywgJy0nKQogICAgICAgICAgICAgICAgc2VsZi5idWlsZHZlciA9IGluZm9bJ2JuJ10KICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gc2VsZi5maWxlbmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGlybmFtZSwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQogICAgICAgICAgICAgICAgbSA9IEZJTEVOQU1FX1JFLm1hdGNoKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignSW52YWxpZCBuYW1lIG9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlbmFtZTogJXInICUgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBpZiBkaXJuYW1lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlybmFtZSA9IG9zLnBhdGguYWJzcGF0aChkaXJuYW1lKQogICAgICAgICAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaW5mbyA9IG0uZ3JvdXBkaWN0KCcnKQogICAgICAgICAgICAgICAgc2VsZi5uYW1lID0gaW5mb1snbm0nXQogICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gaW5mb1sndm4nXQogICAgICAgICAgICAgICAgc2VsZi5idWlsZHZlciA9IGluZm9bJ2JuJ10KICAgICAgICAgICAgICAgIHNlbGYucHl2ZXIgPSBpbmZvWydweSddLnNwbGl0KCcuJykKICAgICAgICAgICAgICAgIHNlbGYuYWJpID0gaW5mb1snYmknXS5zcGxpdCgnLicpCiAgICAgICAgICAgICAgICBzZWxmLmFyY2ggPSBpbmZvWydhciddLnNwbGl0KCcuJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBmaWxlbmFtZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZW5hbWUgZnJvbSB0aGUgdmFyaW91cyBjb21wb25lbnRzLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuYnVpbGR2ZXI6CiAgICAgICAgICAgIGJ1aWxkdmVyID0gJy0nICsgc2VsZi5idWlsZHZlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ1aWxkdmVyID0gJycKICAgICAgICBweXZlciA9ICcuJy5qb2luKHNlbGYucHl2ZXIpCiAgICAgICAgYWJpID0gJy4nLmpvaW4oc2VsZi5hYmkpCiAgICAgICAgYXJjaCA9ICcuJy5qb2luKHNlbGYuYXJjaCkKICAgICAgICAjIHJlcGxhY2UgLSB3aXRoIF8gYXMgYSBsb2NhbCB2ZXJzaW9uIHNlcGFyYXRvcgogICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb24ucmVwbGFjZSgnLScsICdfJykKICAgICAgICByZXR1cm4gJyVzLSVzJXMtJXMtJXMtJXMud2hsJyAlIChzZWxmLm5hbWUsIHZlcnNpb24sIGJ1aWxkdmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dmVyLCBhYmksIGFyY2gpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXhpc3RzKHNlbGYpOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIHJldHVybiBvcy5wYXRoLmlzZmlsZShwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgZm9yIHB5dmVyIGluIHNlbGYucHl2ZXI6CiAgICAgICAgICAgIGZvciBhYmkgaW4gc2VsZi5hYmk6CiAgICAgICAgICAgICAgICBmb3IgYXJjaCBpbiBzZWxmLmFyY2g6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcHl2ZXIsIGFiaSwgYXJjaAoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBtZXRhZGF0YShzZWxmKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgogICAgICAgIHdyYXBwZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCiAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAncicpIGFzIHpmOgogICAgICAgICAgICB3aGVlbF9tZXRhZGF0YSA9IHNlbGYuZ2V0X3doZWVsX21ldGFkYXRhKHpmKQogICAgICAgICAgICB3diA9IHdoZWVsX21ldGFkYXRhWydXaGVlbC1WZXJzaW9uJ10uc3BsaXQoJy4nLCAxKQogICAgICAgICAgICBmaWxlX3ZlcnNpb24gPSB0dXBsZShbaW50KGkpIGZvciBpIGluIHd2XSkKICAgICAgICAgICAgaWYgZmlsZV92ZXJzaW9uIDwgKDEsIDEpOgogICAgICAgICAgICAgICAgZm4gPSAnTUVUQURBVEEnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmbiA9IE1FVEFEQVRBX0ZJTEVOQU1FCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG1ldGFkYXRhX2ZpbGVuYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsIGZuKQogICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKG1ldGFkYXRhX2ZpbGVuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICB3ZiA9IHdyYXBwZXIoYmYpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTWV0YWRhdGEoZmlsZW9iaj13ZikKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCB3aGVlbCwgYmVjYXVzZSAlcyBpcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaXNzaW5nJyAlIGZuKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0X3doZWVsX21ldGFkYXRhKHNlbGYsIHpmKToKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCiAgICAgICAgbWV0YWRhdGFfZmlsZW5hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1dIRUVMJykKICAgICAgICB3aXRoIHpmLm9wZW4obWV0YWRhdGFfZmlsZW5hbWUpIGFzIGJmOgogICAgICAgICAgICB3ZiA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykoYmYpCiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlX2Zyb21fZmlsZSh3ZikKICAgICAgICByZXR1cm4gZGljdChtZXNzYWdlKQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBpbmZvKHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0X3doZWVsX21ldGFkYXRhKHpmKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgcHJvY2Vzc19zaGViYW5nKHNlbGYsIGRhdGEpOgogICAgICAgIG0gPSBTSEVCQU5HX1JFLm1hdGNoKGRhdGEpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgZW5kID0gbS5lbmQoKQogICAgICAgICAgICBzaGViYW5nLCBkYXRhX2FmdGVyX3NoZWJhbmcgPSBkYXRhWzplbmRdLCBkYXRhW2VuZDpdCiAgICAgICAgICAgICMgUHJlc2VydmUgYW55IGFyZ3VtZW50cyBhZnRlciB0aGUgaW50ZXJwcmV0ZXIKICAgICAgICAgICAgaWYgYidweXRob253JyBpbiBzaGViYW5nLmxvd2VyKCk6CiAgICAgICAgICAgICAgICBzaGViYW5nX3B5dGhvbiA9IFNIRUJBTkdfUFlUSE9OVwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2hlYmFuZ19weXRob24gPSBTSEVCQU5HX1BZVEhPTgogICAgICAgICAgICBtID0gU0hFQkFOR19ERVRBSUxfUkUubWF0Y2goc2hlYmFuZykKICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgIGFyZ3MgPSBiJyAnICsgbS5ncm91cHMoKVstMV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyZ3MgPSBiJycKICAgICAgICAgICAgc2hlYmFuZyA9IHNoZWJhbmdfcHl0aG9uICsgYXJncwogICAgICAgICAgICBkYXRhID0gc2hlYmFuZyArIGRhdGFfYWZ0ZXJfc2hlYmFuZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNyID0gZGF0YS5maW5kKGInXHInKQogICAgICAgICAgICBsZiA9IGRhdGEuZmluZChiJ1xuJykKICAgICAgICAgICAgaWYgY3IgPCAwIG9yIGNyID4gbGY6CiAgICAgICAgICAgICAgICB0ZXJtID0gYidcbicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGRhdGFbY3I6Y3IgKyAyXSA9PSBiJ1xyXG4nOgogICAgICAgICAgICAgICAgICAgIHRlcm0gPSBiJ1xyXG4nCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHRlcm0gPSBiJ1xyJwogICAgICAgICAgICBkYXRhID0gU0hFQkFOR19QWVRIT04gKyB0ZXJtICsgZGF0YQogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIGdldF9oYXNoKHNlbGYsIGRhdGEsIGhhc2hfa2luZD1Ob25lKToKICAgICAgICBpZiBoYXNoX2tpbmQgaXMgTm9uZToKICAgICAgICAgICAgaGFzaF9raW5kID0gc2VsZi5oYXNoX2tpbmQKICAgICAgICB0cnk6CiAgICAgICAgICAgIGhhc2hlciA9IGdldGF0dHIoaGFzaGxpYiwgaGFzaF9raW5kKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignVW5zdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG06ICVyJyAlIGhhc2hfa2luZCkKICAgICAgICByZXN1bHQgPSBoYXNoZXIoZGF0YSkuZGlnZXN0KCkKICAgICAgICByZXN1bHQgPSBiYXNlNjQudXJsc2FmZV9iNjRlbmNvZGUocmVzdWx0KS5yc3RyaXAoYic9JykuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIGhhc2hfa2luZCwgcmVzdWx0CgogICAgZGVmIHdyaXRlX3JlY29yZChzZWxmLCByZWNvcmRzLCByZWNvcmRfcGF0aCwgYmFzZSk6CiAgICAgICAgcmVjb3JkcyA9IGxpc3QocmVjb3JkcykgIyBtYWtlIGEgY29weSBmb3Igc29ydGluZwogICAgICAgIHAgPSB0b19wb3NpeChvcy5wYXRoLnJlbHBhdGgocmVjb3JkX3BhdGgsIGJhc2UpKQogICAgICAgIHJlY29yZHMuYXBwZW5kKChwLCAnJywgJycpKQogICAgICAgIHJlY29yZHMuc29ydCgpCiAgICAgICAgd2l0aCBDU1ZXcml0ZXIocmVjb3JkX3BhdGgpIGFzIHdyaXRlcjoKICAgICAgICAgICAgZm9yIHJvdyBpbiByZWNvcmRzOgogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHJvdykKCiAgICBkZWYgd3JpdGVfcmVjb3JkcyhzZWxmLCBpbmZvLCBsaWJkaXIsIGFyY2hpdmVfcGF0aHMpOgogICAgICAgIHJlY29yZHMgPSBbXQogICAgICAgIGRpc3RpbmZvLCBpbmZvX2RpciA9IGluZm8KICAgICAgICBoYXNoZXIgPSBnZXRhdHRyKGhhc2hsaWIsIHNlbGYuaGFzaF9raW5kKQogICAgICAgIGZvciBhcCwgcCBpbiBhcmNoaXZlX3BhdGhzOgogICAgICAgICAgICB3aXRoIG9wZW4ocCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICBkaWdlc3QgPSAnJXM9JXMnICUgc2VsZi5nZXRfaGFzaChkYXRhKQogICAgICAgICAgICBzaXplID0gb3MucGF0aC5nZXRzaXplKHApCiAgICAgICAgICAgIHJlY29yZHMuYXBwZW5kKChhcCwgZGlnZXN0LCBzaXplKSkKCiAgICAgICAgcCA9IG9zLnBhdGguam9pbihkaXN0aW5mbywgJ1JFQ09SRCcpCiAgICAgICAgc2VsZi53cml0ZV9yZWNvcmQocmVjb3JkcywgcCwgbGliZGlyKQogICAgICAgIGFwID0gdG9fcG9zaXgob3MucGF0aC5qb2luKGluZm9fZGlyLCAnUkVDT1JEJykpCiAgICAgICAgYXJjaGl2ZV9wYXRocy5hcHBlbmQoKGFwLCBwKSkKCiAgICBkZWYgYnVpbGRfemlwKHNlbGYsIHBhdGhuYW1lLCBhcmNoaXZlX3BhdGhzKToKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICd3JywgemlwZmlsZS5aSVBfREVGTEFURUQpIGFzIHpmOgogICAgICAgICAgICBmb3IgYXAsIHAgaW4gYXJjaGl2ZV9wYXRoczoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV3JvdGUgJXMgdG8gJXMgaW4gd2hlZWwnLCBwLCBhcCkKICAgICAgICAgICAgICAgIHpmLndyaXRlKHAsIGFwKQoKICAgIGRlZiBidWlsZChzZWxmLCBwYXRocywgdGFncz1Ob25lLCB3aGVlbF92ZXJzaW9uPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgd2hlZWwgZnJvbSBmaWxlcyBpbiBzcGVjaWZpZWQgcGF0aHMsIGFuZCB1c2UgYW55IHNwZWNpZmllZCB0YWdzCiAgICAgICAgd2hlbiBkZXRlcm1pbmluZyB0aGUgbmFtZSBvZiB0aGUgd2hlZWwuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdGFncyBpcyBOb25lOgogICAgICAgICAgICB0YWdzID0ge30KCiAgICAgICAgbGlia2V5ID0gbGlzdChmaWx0ZXIobGFtYmRhIG86IG8gaW4gcGF0aHMsICgncHVyZWxpYicsICdwbGF0bGliJykpKVswXQogICAgICAgIGlmIGxpYmtleSA9PSAncGxhdGxpYic6CiAgICAgICAgICAgIGlzX3B1cmUgPSAnZmFsc2UnCiAgICAgICAgICAgIGRlZmF1bHRfcHl2ZXIgPSBbSU1QVkVSXQogICAgICAgICAgICBkZWZhdWx0X2FiaSA9IFtBQkldCiAgICAgICAgICAgIGRlZmF1bHRfYXJjaCA9IFtBUkNIXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlzX3B1cmUgPSAndHJ1ZScKICAgICAgICAgICAgZGVmYXVsdF9weXZlciA9IFtQWVZFUl0KICAgICAgICAgICAgZGVmYXVsdF9hYmkgPSBbJ25vbmUnXQogICAgICAgICAgICBkZWZhdWx0X2FyY2ggPSBbJ2FueSddCgogICAgICAgIHNlbGYucHl2ZXIgPSB0YWdzLmdldCgncHl2ZXInLCBkZWZhdWx0X3B5dmVyKQogICAgICAgIHNlbGYuYWJpID0gdGFncy5nZXQoJ2FiaScsIGRlZmF1bHRfYWJpKQogICAgICAgIHNlbGYuYXJjaCA9IHRhZ3MuZ2V0KCdhcmNoJywgZGVmYXVsdF9hcmNoKQoKICAgICAgICBsaWJkaXIgPSBwYXRoc1tsaWJrZXldCgogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBkYXRhX2RpciA9ICclcy5kYXRhJyAlIG5hbWVfdmVyCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCgogICAgICAgIGFyY2hpdmVfcGF0aHMgPSBbXQoKICAgICAgICAjIEZpcnN0LCBzdHVmZiB3aGljaCBpcyBub3QgaW4gc2l0ZS1wYWNrYWdlcwogICAgICAgIGZvciBrZXkgaW4gKCdkYXRhJywgJ2hlYWRlcnMnLCAnc2NyaXB0cycpOgogICAgICAgICAgICBpZiBrZXkgbm90IGluIHBhdGhzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcGF0aCA9IHBhdGhzW2tleV0KICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBmaWxlczoKICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGZzZGVjb2RlKG9zLnBhdGguam9pbihyb290LCBmbikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJwID0gb3MucGF0aC5yZWxwYXRoKHAsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gdG9fcG9zaXgob3MucGF0aC5qb2luKGRhdGFfZGlyLCBrZXksIHJwKSkKICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRocy5hcHBlbmQoKGFwLCBwKSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYga2V5ID09ICdzY3JpcHRzJyBhbmQgbm90IHAuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihwLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYucHJvY2Vzc19zaGViYW5nKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocCwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCgogICAgICAgICMgTm93LCBzdHVmZiB3aGljaCBpcyBpbiBzaXRlLXBhY2thZ2VzLCBvdGhlciB0aGFuIHRoZQogICAgICAgICMgZGlzdGluZm8gc3R1ZmYuCiAgICAgICAgcGF0aCA9IGxpYmRpcgogICAgICAgIGRpc3RpbmZvID0gTm9uZQogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgpOgogICAgICAgICAgICBpZiByb290ID09IHBhdGg6CiAgICAgICAgICAgICAgICAjIEF0IHRoZSB0b3AgbGV2ZWwgb25seSwgc2F2ZSBkaXN0aW5mbyBmb3IgbGF0ZXIKICAgICAgICAgICAgICAgICMgYW5kIHNraXAgaXQgZm9yIG5vdwogICAgICAgICAgICAgICAgZm9yIGksIGRuIGluIGVudW1lcmF0ZShkaXJzKToKICAgICAgICAgICAgICAgICAgICBkbiA9IGZzZGVjb2RlKGRuKQogICAgICAgICAgICAgICAgICAgIGlmIGRuLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RpbmZvID0gb3MucGF0aC5qb2luKHJvb3QsIGRuKQogICAgICAgICAgICAgICAgICAgICAgICBkZWwgZGlyc1tpXQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgYXNzZXJ0IGRpc3RpbmZvLCAnLmRpc3QtaW5mbyBkaXJlY3RvcnkgZXhwZWN0ZWQsIG5vdCBmb3VuZCcKCiAgICAgICAgICAgIGZvciBmbiBpbiBmaWxlczoKICAgICAgICAgICAgICAgICMgY29tbWVudCBvdXQgbmV4dCBzdWl0ZSB0byBsZWF2ZSAucHljIGZpbGVzIGluCiAgICAgICAgICAgICAgICBpZiBmc2RlY29kZShmbikuZW5kc3dpdGgoKCcucHljJywgJy5weW8nKSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHAgPSBvcy5wYXRoLmpvaW4ocm9vdCwgZm4pCiAgICAgICAgICAgICAgICBycCA9IHRvX3Bvc2l4KG9zLnBhdGgucmVscGF0aChwLCBwYXRoKSkKICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aHMuYXBwZW5kKChycCwgcCkpCgogICAgICAgICMgTm93IGRpc3RpbmZvLiBBc3N1bWVkIHRvIGJlIGZsYXQsIGkuZS4gb3MubGlzdGRpciBpcyBlbm91Z2guCiAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpc3RpbmZvKQogICAgICAgIGZvciBmbiBpbiBmaWxlczoKICAgICAgICAgICAgaWYgZm4gbm90IGluICgnUkVDT1JEJywgJ0lOU1RBTExFUicsICdTSEFSRUQnLCAnV0hFRUwnKToKICAgICAgICAgICAgICAgIHAgPSBmc2RlY29kZShvcy5wYXRoLmpvaW4oZGlzdGluZm8sIGZuKSkKICAgICAgICAgICAgICAgIGFwID0gdG9fcG9zaXgob3MucGF0aC5qb2luKGluZm9fZGlyLCBmbikpCiAgICAgICAgICAgICAgICBhcmNoaXZlX3BhdGhzLmFwcGVuZCgoYXAsIHApKQoKICAgICAgICB3aGVlbF9tZXRhZGF0YSA9IFsKICAgICAgICAgICAgJ1doZWVsLVZlcnNpb246ICVkLiVkJyAlICh3aGVlbF92ZXJzaW9uIG9yIHNlbGYud2hlZWxfdmVyc2lvbiksCiAgICAgICAgICAgICdHZW5lcmF0b3I6IGRpc3RsaWIgJXMnICUgX192ZXJzaW9uX18sCiAgICAgICAgICAgICdSb290LUlzLVB1cmVsaWI6ICVzJyAlIGlzX3B1cmUsCiAgICAgICAgXQogICAgICAgIGZvciBweXZlciwgYWJpLCBhcmNoIGluIHNlbGYudGFnczoKICAgICAgICAgICAgd2hlZWxfbWV0YWRhdGEuYXBwZW5kKCdUYWc6ICVzLSVzLSVzJyAlIChweXZlciwgYWJpLCBhcmNoKSkKICAgICAgICBwID0gb3MucGF0aC5qb2luKGRpc3RpbmZvLCAnV0hFRUwnKQogICAgICAgIHdpdGggb3BlbihwLCAndycpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKHdoZWVsX21ldGFkYXRhKSkKICAgICAgICBhcCA9IHRvX3Bvc2l4KG9zLnBhdGguam9pbihpbmZvX2RpciwgJ1dIRUVMJykpCiAgICAgICAgYXJjaGl2ZV9wYXRocy5hcHBlbmQoKGFwLCBwKSkKCiAgICAgICAgIyBOb3csIGF0IGxhc3QsIFJFQ09SRC4KICAgICAgICAjIFBhdGhzIGluIGhlcmUgYXJlIGFyY2hpdmUgcGF0aHMgLSBub3RoaW5nIGVsc2UgbWFrZXMgc2Vuc2UuCiAgICAgICAgc2VsZi53cml0ZV9yZWNvcmRzKChkaXN0aW5mbywgaW5mb19kaXIpLCBsaWJkaXIsIGFyY2hpdmVfcGF0aHMpCiAgICAgICAgIyBOb3csIHJlYWR5IHRvIGJ1aWxkIHRoZSB6aXAgZmlsZQogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBzZWxmLmJ1aWxkX3ppcChwYXRobmFtZSwgYXJjaGl2ZV9wYXRocykKICAgICAgICByZXR1cm4gcGF0aG5hbWUKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBwYXRocywgbWFrZXIsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIGEgd2hlZWwgdG8gdGhlIHNwZWNpZmllZCBwYXRocy4gSWYga3dhcmcgYGB3YXJuZXJgYCBpcwogICAgICAgIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgY2FsbGFibGUsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggdHdvCiAgICAgICAgdHVwbGVzIGluZGljYXRpbmcgdGhlIHdoZWVsIHZlcnNpb24gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgdGhlIHdoZWVsCiAgICAgICAgdmVyc2lvbiBpbiB0aGUgZmlsZSwgaWYgdGhlcmUgaXMgYSBkaXNjcmVwYW5jeSBpbiB0aGUgdmVyc2lvbnMuCiAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byBpc3N1ZSBhbnkgd2FybmluZ3MgdG8gcmFpc2UgYW55IGV4Y2VwdGlvbnMuCiAgICAgICAgSWYga3dhcmcgYGBsaWJfb25seWBgIGlzIFRydWUsIG9ubHkgdGhlIHB1cmVsaWIvcGxhdGxpYiBmaWxlcyBhcmUKICAgICAgICBpbnN0YWxsZWQsIGFuZCB0aGUgaGVhZGVycywgc2NyaXB0cywgZGF0YSBhbmQgZGlzdC1pbmZvIG1ldGFkYXRhIGFyZQogICAgICAgIG5vdCB3cml0dGVuLgoKICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgOmNsYXNzOmBJbnN0YWxsZWREaXN0cmlidXRpb25gIGluc3RhbmNlIHVubGVzcwogICAgICAgIGBgb3B0aW9ucy5saWJfb25seWBgIGlzIFRydWUsIGluIHdoaWNoIGNhc2UgdGhlIHJldHVybiB2YWx1ZSBpcyBgYE5vbmVgYC4KICAgICAgICAiIiIKCiAgICAgICAgZHJ5X3J1biA9IG1ha2VyLmRyeV9ydW4KICAgICAgICB3YXJuZXIgPSBrd2FyZ3MuZ2V0KCd3YXJuZXInKQogICAgICAgIGxpYl9vbmx5ID0ga3dhcmdzLmdldCgnbGliX29ubHknLCBGYWxzZSkKCiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBkYXRhX2RpciA9ICclcy5kYXRhJyAlIG5hbWVfdmVyCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCgogICAgICAgIG1ldGFkYXRhX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgd2hlZWxfbWV0YWRhdGFfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnV0hFRUwnKQogICAgICAgIHJlY29yZF9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdSRUNPUkQnKQoKICAgICAgICB3cmFwcGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKQoKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHdpdGggemYub3Blbih3aGVlbF9tZXRhZGF0YV9uYW1lKSBhcyBid2Y6CiAgICAgICAgICAgICAgICB3ZiA9IHdyYXBwZXIoYndmKQogICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VfZnJvbV9maWxlKHdmKQogICAgICAgICAgICB3diA9IG1lc3NhZ2VbJ1doZWVsLVZlcnNpb24nXS5zcGxpdCgnLicsIDEpCiAgICAgICAgICAgIGZpbGVfdmVyc2lvbiA9IHR1cGxlKFtpbnQoaSkgZm9yIGkgaW4gd3ZdKQogICAgICAgICAgICBpZiAoZmlsZV92ZXJzaW9uICE9IHNlbGYud2hlZWxfdmVyc2lvbikgYW5kIHdhcm5lcjoKICAgICAgICAgICAgICAgIHdhcm5lcihzZWxmLndoZWVsX3ZlcnNpb24sIGZpbGVfdmVyc2lvbikKCiAgICAgICAgICAgIGlmIG1lc3NhZ2VbJ1Jvb3QtSXMtUHVyZWxpYiddID09ICd0cnVlJzoKICAgICAgICAgICAgICAgIGxpYmRpciA9IHBhdGhzWydwdXJlbGliJ10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxpYmRpciA9IHBhdGhzWydwbGF0bGliJ10KCiAgICAgICAgICAgIHJlY29yZHMgPSB7fQogICAgICAgICAgICB3aXRoIHpmLm9wZW4ocmVjb3JkX25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgd2l0aCBDU1ZSZWFkZXIoc3RyZWFtPWJmKSBhcyByZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSByb3dbMF0KICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc1twXSA9IHJvdwoKICAgICAgICAgICAgZGF0YV9wZnggPSBwb3NpeHBhdGguam9pbihkYXRhX2RpciwgJycpCiAgICAgICAgICAgIGluZm9fcGZ4ID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICcnKQogICAgICAgICAgICBzY3JpcHRfcGZ4ID0gcG9zaXhwYXRoLmpvaW4oZGF0YV9kaXIsICdzY3JpcHRzJywgJycpCgogICAgICAgICAgICAjIG1ha2UgYSBuZXcgaW5zdGFuY2UgcmF0aGVyIHRoYW4gYSBjb3B5IG9mIG1ha2VyJ3MsCiAgICAgICAgICAgICMgYXMgd2UgbXV0YXRlIGl0CiAgICAgICAgICAgIGZpbGVvcCA9IEZpbGVPcGVyYXRvcihkcnlfcnVuPWRyeV9ydW4pCiAgICAgICAgICAgIGZpbGVvcC5yZWNvcmQgPSBUcnVlICAgICMgc28gd2UgY2FuIHJvbGxiYWNrIGlmIG5lZWRlZAoKICAgICAgICAgICAgYmMgPSBub3Qgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgICAgIyBEb3VibGUgbmVnYXRpdmVzLiBMb3ZlbHkhCgogICAgICAgICAgICBvdXRmaWxlcyA9IFtdICAgIyBmb3IgUkVDT1JEIHdyaXRpbmcKCiAgICAgICAgICAgICMgZm9yIHNjcmlwdCBjb3B5aW5nL3NoZWJhbmcgcHJvY2Vzc2luZwogICAgICAgICAgICB3b3JrZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgICAgICMgc2V0IHRhcmdldCBkaXIgbGF0ZXIKICAgICAgICAgICAgIyB3ZSBkZWZhdWx0IGFkZF9sYXVuY2hlcnMgdG8gRmFsc2UsIGFzIHRoZQogICAgICAgICAgICAjIFB5dGhvbiBMYXVuY2hlciBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCiAgICAgICAgICAgIG1ha2VyLnNvdXJjZV9kaXIgPSB3b3JrZGlyCiAgICAgICAgICAgIG1ha2VyLnRhcmdldF9kaXIgPSBOb25lCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZvciB6aW5mbyBpbiB6Zi5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgICAgIGFyY25hbWUgPSB6aW5mby5maWxlbmFtZQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJjbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHVfYXJjbmFtZSA9IGFyY25hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICAgICAgIyBUaGUgc2lnbmF0dXJlIGZpbGUgd29uJ3QgYmUgaW4gUkVDT1JELAogICAgICAgICAgICAgICAgICAgICMgYW5kIHdlICBkb24ndCBjdXJyZW50bHkgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIGlmIHVfYXJjbmFtZS5lbmRzd2l0aCgnL1JFQ09SRC5qd3MnKToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICByb3cgPSByZWNvcmRzW3VfYXJjbmFtZV0KICAgICAgICAgICAgICAgICAgICBpZiByb3dbMl0gYW5kIHN0cih6aW5mby5maWxlX3NpemUpICE9IHJvd1syXToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignc2l6ZSBtaXNtYXRjaCBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcycgJSB1X2FyY25hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgcm93WzFdOgogICAgICAgICAgICAgICAgICAgICAgICBraW5kLCB2YWx1ZSA9IHJvd1sxXS5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihhcmNuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBiZi5yZWFkKCkKICAgICAgICAgICAgICAgICAgICAgICAgXywgZGlnZXN0ID0gc2VsZi5nZXRfaGFzaChkYXRhLCBraW5kKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBkaWdlc3QgIT0gdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdkaWdlc3QgbWlzbWF0Y2ggZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzJyAlIGFyY25hbWUpCgogICAgICAgICAgICAgICAgICAgIGlmIGxpYl9vbmx5IGFuZCB1X2FyY25hbWUuc3RhcnRzd2l0aCgoaW5mb19wZngsIGRhdGFfcGZ4KSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnbGliX29ubHk6IHNraXBwaW5nICVzJywgdV9hcmNuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGlzX3NjcmlwdCA9ICh1X2FyY25hbWUuc3RhcnRzd2l0aChzY3JpcHRfcGZ4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IHVfYXJjbmFtZS5lbmRzd2l0aCgnLmV4ZScpKQoKICAgICAgICAgICAgICAgICAgICBpZiB1X2FyY25hbWUuc3RhcnRzd2l0aChkYXRhX3BmeCk6CiAgICAgICAgICAgICAgICAgICAgICAgIF8sIHdoZXJlLCBycCA9IHVfYXJjbmFtZS5zcGxpdCgnLycsIDIpCiAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBvcy5wYXRoLmpvaW4ocGF0aHNbd2hlcmVdLCBjb252ZXJ0X3BhdGgocnApKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICMgbWVhbnQgZm9yIHNpdGUtcGFja2FnZXMuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHVfYXJjbmFtZSBpbiAod2hlZWxfbWV0YWRhdGFfbmFtZSwgcmVjb3JkX25hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IG9zLnBhdGguam9pbihsaWJkaXIsIGNvbnZlcnRfcGF0aCh1X2FyY25hbWUpKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc19zY3JpcHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihhcmNuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvcC5jb3B5X3N0cmVhbShiZiwgb3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKG91dGZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICMgRG91YmxlIGNoZWNrIHRoZSBkaWdlc3Qgb2YgdGhlIHdyaXR0ZW4gZmlsZQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZHJ5X3J1biBhbmQgcm93WzFdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKG91dGZpbGUsICdyYicpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBiZi5yZWFkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLCBuZXdkaWdlc3QgPSBzZWxmLmdldF9oYXNoKGRhdGEsIGtpbmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV3ZGlnZXN0ICE9IGRpZ2VzdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignZGlnZXN0IG1pc21hdGNoICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb24gd3JpdGUgZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgb3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgYmMgYW5kIG91dGZpbGUuZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5YyA9IGZpbGVvcC5ieXRlX2NvbXBpbGUob3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlcy5hcHBlbmQocHljKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIERvbid0IGdpdmUgdXAgaWYgYnl0ZS1jb21waWxhdGlvbiBmYWlscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGJ1dCBsb2cgaXQgYW5kIHBlcmhhcHMgd2FybiB0aGUgdXNlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdCeXRlLWNvbXBpbGF0aW9uIGZhaWxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjX2luZm89VHJ1ZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmbiA9IG9zLnBhdGguYmFzZW5hbWUoY29udmVydF9wYXRoKGFyY25hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICB3b3JrbmFtZSA9IG9zLnBhdGguam9pbih3b3JrZGlyLCBmbikKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGFyY25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLmNvcHlfc3RyZWFtKGJmLCB3b3JrbmFtZSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGRuLCBmbiA9IG9zLnBhdGguc3BsaXQob3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXIudGFyZ2V0X2RpciA9IGRuCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcyA9IG1ha2VyLm1ha2UoZm4pCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvcC5zZXRfZXhlY3V0YWJsZV9tb2RlKGZpbGVuYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZXMuZXh0ZW5kKGZpbGVuYW1lcykKCiAgICAgICAgICAgICAgICBpZiBsaWJfb25seToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2xpYl9vbmx5OiByZXR1cm5pbmcgTm9uZScpCiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBHZW5lcmF0ZSBzY3JpcHRzCgogICAgICAgICAgICAgICAgICAgICMgVHJ5IHRvIGdldCBweWRpc3QuanNvbiBzbyB3ZSBjYW4gc2VlIGlmIHRoZXJlIGFyZQogICAgICAgICAgICAgICAgICAgICMgYW55IGNvbW1hbmRzIHRvIGdlbmVyYXRlLiBJZiB0aGlzIGZhaWxzIChlLmcuIGJlY2F1c2UKICAgICAgICAgICAgICAgICAgICAjIG9mIGEgbGVnYWN5IHdoZWVsKSwgbG9nIGEgd2FybmluZyBidXQgZG9uJ3QgZ2l2ZSB1cC4KICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBmaWxlX3ZlcnNpb24gPSBzZWxmLmluZm9bJ1doZWVsLVZlcnNpb24nXQogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVfdmVyc2lvbiA9PSAnMS4wJzoKICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgbGVnYWN5IGluZm8KICAgICAgICAgICAgICAgICAgICAgICAgZXAgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ2VudHJ5X3BvaW50cy50eHQnKQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oZXApIGFzIGJ3ZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGRhdGEgPSByZWFkX2V4cG9ydHMoYndmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgPSB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ2NvbnNvbGUnLCAnZ3VpJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9ICclc19zY3JpcHRzJyAlIGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgaW4gZXBkYXRhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1snd3JhcF8lcycgJSBrZXldID0gZCA9IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2IGluIGVwZGF0YVtrXS52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAnJXM6JXMnICUgKHYucHJlZml4LCB2LnN1ZmZpeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHYuZmxhZ3M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArPSAnICVzJyAlIHYuZmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbdi5uYW1lXSA9IHMKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdVbmFibGUgdG8gcmVhZCBsZWdhY3kgc2NyaXB0ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXRhZGF0YSwgc28gY2Fubm90IGdlbmVyYXRlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzJykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4obWV0YWRhdGFfbmFtZSkgYXMgYndmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdmID0gd3JhcHBlcihid2YpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBqc29uLmxvYWQod2YpLmdldCgnZXh0ZW5zaW9ucycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29tbWFuZHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gY29tbWFuZHMuZ2V0KCdweXRob24uY29tbWFuZHMnKQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ1VuYWJsZSB0byByZWFkIEpTT04gbWV0YWRhdGEsIHNvICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYW5ub3QgZ2VuZXJhdGUgc2NyaXB0cycpCiAgICAgICAgICAgICAgICAgICAgaWYgY29tbWFuZHM6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVfc2NyaXB0cyA9IGNvbW1hbmRzLmdldCgnd3JhcF9jb25zb2xlJywge30pCiAgICAgICAgICAgICAgICAgICAgICAgIGd1aV9zY3JpcHRzID0gY29tbWFuZHMuZ2V0KCd3cmFwX2d1aScsIHt9KQogICAgICAgICAgICAgICAgICAgICAgICBpZiBjb25zb2xlX3NjcmlwdHMgb3IgZ3VpX3NjcmlwdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfZGlyID0gcGF0aHMuZ2V0KCdzY3JpcHRzJywgJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihzY3JpcHRfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdWYWxpZCBzY3JpcHQgcGF0aCBub3QgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlci50YXJnZXRfZGlyID0gc2NyaXB0X2RpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gY29uc29sZV9zY3JpcHRzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0ID0gJyVzID0gJXMnICUgKGssIHYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVzID0gbWFrZXIubWFrZShzY3JpcHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoZmlsZW5hbWVzKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGd1aV9zY3JpcHRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7J2d1aSc6IFRydWUgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGd1aV9zY3JpcHRzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdCA9ICclcyA9ICVzJyAlIChrLCB2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBtYWtlci5tYWtlKHNjcmlwdCwgb3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoZmlsZW5hbWVzKQoKICAgICAgICAgICAgICAgICAgICBwID0gb3MucGF0aC5qb2luKGxpYmRpciwgaW5mb19kaXIpCiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IEluc3RhbGxlZERpc3RyaWJ1dGlvbihwKQoKICAgICAgICAgICAgICAgICAgICAjIFdyaXRlIFNIQVJFRAogICAgICAgICAgICAgICAgICAgIHBhdGhzID0gZGljdChwYXRocykgICAgICMgZG9uJ3QgY2hhbmdlIHBhc3NlZCBpbiBkaWN0CiAgICAgICAgICAgICAgICAgICAgZGVsIHBhdGhzWydwdXJlbGliJ10KICAgICAgICAgICAgICAgICAgICBkZWwgcGF0aHNbJ3BsYXRsaWInXQogICAgICAgICAgICAgICAgICAgIHBhdGhzWydsaWInXSA9IGxpYmRpcgogICAgICAgICAgICAgICAgICAgIHAgPSBkaXN0LndyaXRlX3NoYXJlZF9sb2NhdGlvbnMocGF0aHMsIGRyeV9ydW4pCiAgICAgICAgICAgICAgICAgICAgaWYgcDoKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKHApCgogICAgICAgICAgICAgICAgICAgICMgV3JpdGUgUkVDT1JECiAgICAgICAgICAgICAgICAgICAgZGlzdC53cml0ZV9pbnN0YWxsZWRfZmlsZXMob3V0ZmlsZXMsIHBhdGhzWydwcmVmaXgnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnlfcnVuKQogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignaW5zdGFsbGF0aW9uIGZhaWxlZC4nKQogICAgICAgICAgICAgICAgZmlsZW9wLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHdvcmtkaXIpCgogICAgZGVmIF9nZXRfZHlsaWJfY2FjaGUoc2VsZik6CiAgICAgICAgZ2xvYmFsIGNhY2hlCiAgICAgICAgaWYgY2FjaGUgaXMgTm9uZToKICAgICAgICAgICAgIyBVc2UgbmF0aXZlIHN0cmluZyB0byBhdm9pZCBpc3N1ZXMgb24gMi54OiBzZWUgUHl0aG9uICMyMDE0MC4KICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbihnZXRfY2FjaGVfYmFzZSgpLCBzdHIoJ2R5bGliLWNhY2hlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdKQogICAgICAgICAgICBjYWNoZSA9IENhY2hlKGJhc2UpCiAgICAgICAgcmV0dXJuIGNhY2hlCgogICAgZGVmIF9nZXRfZXh0ZW5zaW9ucyhzZWxmKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgogICAgICAgIGFyY25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ0VYVEVOU0lPTlMnKQogICAgICAgIHdyYXBwZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihhcmNuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICB3ZiA9IHdyYXBwZXIoYmYpCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IGpzb24ubG9hZCh3ZikKICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IHNlbGYuX2dldF9keWxpYl9jYWNoZSgpCiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY2FjaGUucHJlZml4X3RvX2RpcihwYXRobmFtZSkKICAgICAgICAgICAgICAgICAgICBjYWNoZV9iYXNlID0gb3MucGF0aC5qb2luKGNhY2hlLmJhc2UsIHByZWZpeCkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihjYWNoZV9iYXNlKToKICAgICAgICAgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoY2FjaGVfYmFzZSkKICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgcmVscGF0aCBpbiBleHRlbnNpb25zLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4oY2FjaGVfYmFzZSwgY29udmVydF9wYXRoKHJlbHBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGVzdCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV90aW1lID0gb3Muc3RhdChkZXN0KS5zdF9tdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV90aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChmaWxlX3RpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gemYuZ2V0aW5mbyhyZWxwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxfdGltZSA9IGRhdGV0aW1lLmRhdGV0aW1lKCppbmZvLmRhdGVfdGltZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3QgPSB3aGVlbF90aW1lID4gZmlsZV90aW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhY3Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Zi5leHRyYWN0KHJlbHBhdGgsIGNhY2hlX2Jhc2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKG5hbWUsIGRlc3QpKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBpc19jb21wYXRpYmxlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZSBpZiBhIHdoZWVsIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVubmluZyBzeXN0ZW0uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGlzX2NvbXBhdGlibGUoc2VsZikKCiAgICBkZWYgaXNfbW91bnRhYmxlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZSBpZiBhIHdoZWVsIGlzIGFzc2VydGVkIGFzIG1vdW50YWJsZSBieSBpdHMgbWV0YWRhdGEuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFRydWUgIyBmb3Igbm93IC0gbWV0YWRhdGEgZGV0YWlscyBUQkQKCiAgICBkZWYgbW91bnQoc2VsZiwgYXBwZW5kPUZhbHNlKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKSkKICAgICAgICBpZiBub3Qgc2VsZi5pc19jb21wYXRpYmxlKCk6CiAgICAgICAgICAgIG1zZyA9ICdXaGVlbCAlcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgUHl0aG9uLicgJSBwYXRobmFtZQogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKG1zZykKICAgICAgICBpZiBub3Qgc2VsZi5pc19tb3VudGFibGUoKToKICAgICAgICAgICAgbXNnID0gJ1doZWVsICVzIGlzIG1hcmtlZCBhcyBub3QgbW91bnRhYmxlLicgJSBwYXRobmFtZQogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKG1zZykKICAgICAgICBpZiBwYXRobmFtZSBpbiBzeXMucGF0aDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclcyBhbHJlYWR5IGluIHBhdGgnLCBwYXRobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBhcHBlbmQ6CiAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQocGF0aG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcGF0aG5hbWUpCiAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBzZWxmLl9nZXRfZXh0ZW5zaW9ucygpCiAgICAgICAgICAgIGlmIGV4dGVuc2lvbnM6CiAgICAgICAgICAgICAgICBpZiBfaG9vayBub3QgaW4gc3lzLm1ldGFfcGF0aDoKICAgICAgICAgICAgICAgICAgICBzeXMubWV0YV9wYXRoLmFwcGVuZChfaG9vaykKICAgICAgICAgICAgICAgIF9ob29rLmFkZChwYXRobmFtZSwgZXh0ZW5zaW9ucykKCiAgICBkZWYgdW5tb3VudChzZWxmKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKSkKICAgICAgICBpZiBwYXRobmFtZSBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXMgbm90IGluIHBhdGgnLCBwYXRobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzeXMucGF0aC5yZW1vdmUocGF0aG5hbWUpCiAgICAgICAgICAgIGlmIHBhdGhuYW1lIGluIF9ob29rLmltcHVyZV93aGVlbHM6CiAgICAgICAgICAgICAgICBfaG9vay5yZW1vdmUocGF0aG5hbWUpCiAgICAgICAgICAgIGlmIG5vdCBfaG9vay5pbXB1cmVfd2hlZWxzOgogICAgICAgICAgICAgICAgaWYgX2hvb2sgaW4gc3lzLm1ldGFfcGF0aDoKICAgICAgICAgICAgICAgICAgICBzeXMubWV0YV9wYXRoLnJlbW92ZShfaG9vaykKCiAgICBkZWYgdmVyaWZ5KHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgZGF0YV9kaXIgPSAnJXMuZGF0YScgJSBuYW1lX3ZlcgogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgoKICAgICAgICBtZXRhZGF0YV9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsIE1FVEFEQVRBX0ZJTEVOQU1FKQogICAgICAgIHdoZWVsX21ldGFkYXRhX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1dIRUVMJykKICAgICAgICByZWNvcmRfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnUkVDT1JEJykKCiAgICAgICAgd3JhcHBlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKCiAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAncicpIGFzIHpmOgogICAgICAgICAgICB3aXRoIHpmLm9wZW4od2hlZWxfbWV0YWRhdGFfbmFtZSkgYXMgYndmOgogICAgICAgICAgICAgICAgd2YgPSB3cmFwcGVyKGJ3ZikKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlX2Zyb21fZmlsZSh3ZikKICAgICAgICAgICAgd3YgPSBtZXNzYWdlWydXaGVlbC1WZXJzaW9uJ10uc3BsaXQoJy4nLCAxKQogICAgICAgICAgICBmaWxlX3ZlcnNpb24gPSB0dXBsZShbaW50KGkpIGZvciBpIGluIHd2XSkKICAgICAgICAgICAgIyBUT0RPIHZlcnNpb24gdmVyaWZpY2F0aW9uCgogICAgICAgICAgICByZWNvcmRzID0ge30KICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKHJlY29yZF9uYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgIHdpdGggQ1NWUmVhZGVyKHN0cmVhbT1iZikgYXMgcmVhZGVyOgogICAgICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmVhZGVyOgogICAgICAgICAgICAgICAgICAgICAgICBwID0gcm93WzBdCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHNbcF0gPSByb3cKCiAgICAgICAgICAgIGZvciB6aW5mbyBpbiB6Zi5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgYXJjbmFtZSA9IHppbmZvLmZpbGVuYW1lCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyY25hbWUsIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgaWYgJy4uJyBpbiB1X2FyY25hbWU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCBlbnRyeSBpbiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlZWw6ICVyJyAlIHVfYXJjbmFtZSkKCiAgICAgICAgICAgICAgICAjIFRoZSBzaWduYXR1cmUgZmlsZSB3b24ndCBiZSBpbiBSRUNPUkQsCiAgICAgICAgICAgICAgICAjIGFuZCB3ZSAgZG9uJ3QgY3VycmVudGx5IGRvbid0IGRvIGFueXRoaW5nIHdpdGggaXQKICAgICAgICAgICAgICAgIGlmIHVfYXJjbmFtZS5lbmRzd2l0aCgnL1JFQ09SRC5qd3MnKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcm93ID0gcmVjb3Jkc1t1X2FyY25hbWVdCiAgICAgICAgICAgICAgICBpZiByb3dbMl0gYW5kIHN0cih6aW5mby5maWxlX3NpemUpICE9IHJvd1syXToKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdzaXplIG1pc21hdGNoIGZvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgdV9hcmNuYW1lKQogICAgICAgICAgICAgICAgaWYgcm93WzFdOgogICAgICAgICAgICAgICAgICAgIGtpbmQsIHZhbHVlID0gcm93WzFdLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oYXJjbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBiZi5yZWFkKCkKICAgICAgICAgICAgICAgICAgICBfLCBkaWdlc3QgPSBzZWxmLmdldF9oYXNoKGRhdGEsIGtpbmQpCiAgICAgICAgICAgICAgICAgICAgaWYgZGlnZXN0ICE9IHZhbHVlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdkaWdlc3QgbWlzbWF0Y2ggZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgYXJjbmFtZSkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIG1vZGlmaWVyLCBkZXN0X2Rpcj1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIHRoZSBjb250ZW50cyBvZiBhIHdoZWVsIGluIGEgZ2VuZXJpYyB3YXkuIFRoZSBtb2RpZmllciBzaG91bGQKICAgICAgICBiZSBhIGNhbGxhYmxlIHdoaWNoIGV4cGVjdHMgYSBkaWN0aW9uYXJ5IGFyZ3VtZW50OiBpdHMga2V5cyBhcmUKICAgICAgICBhcmNoaXZlLWVudHJ5IHBhdGhzLCBhbmQgaXRzIHZhbHVlcyBhcmUgYWJzb2x1dGUgZmlsZXN5c3RlbSBwYXRocwogICAgICAgIHdoZXJlIHRoZSBjb250ZW50cyB0aGUgY29ycmVzcG9uZGluZyBhcmNoaXZlIGVudHJpZXMgY2FuIGJlIGZvdW5kLiBUaGUKICAgICAgICBtb2RpZmllciBpcyBmcmVlIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVzIHBvaW50ZWQgdG8sIGFkZAogICAgICAgIG5ldyBlbnRyaWVzIGFuZCByZW1vdmUgZW50cmllcywgYmVmb3JlIHJldHVybmluZy4gVGhpcyBtZXRob2Qgd2lsbAogICAgICAgIGV4dHJhY3QgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgd2hlZWwgdG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24sIGNhbGwKICAgICAgICB0aGUgbW9kaWZpZXIsIGFuZCB0aGVuIHVzZSB0aGUgcGFzc2VkIChhbmQgcG9zc2libHkgdXBkYXRlZCkKICAgICAgICBkaWN0aW9uYXJ5IHRvIHdyaXRlIGEgbmV3IHdoZWVsLiBJZiBgYGRlc3RfZGlyYGAgaXMgc3BlY2lmaWVkLCB0aGUgbmV3CiAgICAgICAgd2hlZWwgaXMgd3JpdHRlbiB0aGVyZSAtLSBvdGhlcndpc2UsIHRoZSBvcmlnaW5hbCB3aGVlbCBpcyBvdmVyd3JpdHRlbi4KCiAgICAgICAgVGhlIG1vZGlmaWVyIHNob3VsZCByZXR1cm4gVHJ1ZSBpZiBpdCB1cGRhdGVkIHRoZSB3aGVlbCwgZWxzZSBGYWxzZS4KICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIHRoZSBtb2RpZmllciByZXR1cm5zLgogICAgICAgICIiIgoKICAgICAgICBkZWYgZ2V0X3ZlcnNpb24ocGF0aF9tYXAsIGluZm9fZGlyKToKICAgICAgICAgICAgdmVyc2lvbiA9IHBhdGggPSBOb25lCiAgICAgICAgICAgIGtleSA9ICclcy8lcycgJSAoaW5mb19kaXIsIE1FVEFEQVRBX0ZJTEVOQU1FKQogICAgICAgICAgICBpZiBrZXkgbm90IGluIHBhdGhfbWFwOgogICAgICAgICAgICAgICAga2V5ID0gJyVzL1BLRy1JTkZPJyAlIGluZm9fZGlyCiAgICAgICAgICAgIGlmIGtleSBpbiBwYXRoX21hcDoKICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoX21hcFtrZXldCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gTWV0YWRhdGEocGF0aD1wYXRoKS52ZXJzaW9uCiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uLCBwYXRoCgogICAgICAgIGRlZiB1cGRhdGVfdmVyc2lvbih2ZXJzaW9uLCBwYXRoKToKICAgICAgICAgICAgdXBkYXRlZCA9IE5vbmUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdiA9IE5vcm1hbGl6ZWRWZXJzaW9uKHZlcnNpb24pCiAgICAgICAgICAgICAgICBpID0gdmVyc2lvbi5maW5kKCctJykKICAgICAgICAgICAgICAgIGlmIGkgPCAwOgogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSAnJXMrMScgJSB2ZXJzaW9uCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhcnRzID0gW2ludChzKSBmb3IgcyBpbiB2ZXJzaW9uW2kgKyAxOl0uc3BsaXQoJy4nKV0KICAgICAgICAgICAgICAgICAgICBwYXJ0c1stMV0gKz0gMQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSAnJXMrJXMnICUgKHZlcnNpb25bOmldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJy5qb2luKHN0cihpKSBmb3IgaSBpbiBwYXJ0cykpCiAgICAgICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2Fubm90IHVwZGF0ZSBub24tY29tcGxpYW50IChQRVAtNDQwKSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24gJXInLCB2ZXJzaW9uKQogICAgICAgICAgICBpZiB1cGRhdGVkOgogICAgICAgICAgICAgICAgbWQgPSBNZXRhZGF0YShwYXRoPXBhdGgpCiAgICAgICAgICAgICAgICBtZC52ZXJzaW9uID0gdXBkYXRlZAogICAgICAgICAgICAgICAgbGVnYWN5ID0gbm90IHBhdGguZW5kc3dpdGgoTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgICAgICAgICBtZC53cml0ZShwYXRoPXBhdGgsIGxlZ2FjeT1sZWdhY3kpCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1ZlcnNpb24gdXBkYXRlZCBmcm9tICVyIHRvICVyJywgdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkKQoKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgogICAgICAgIHJlY29yZF9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdSRUNPUkQnKQogICAgICAgIHdpdGggdGVtcGRpcigpIGFzIHdvcmtkaXI6CiAgICAgICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgICAgIHBhdGhfbWFwID0ge30KICAgICAgICAgICAgICAgIGZvciB6aW5mbyBpbiB6Zi5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgICAgIGFyY25hbWUgPSB6aW5mby5maWxlbmFtZQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJjbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHVfYXJjbmFtZSA9IGFyY25hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICAgICAgaWYgdV9hcmNuYW1lID09IHJlY29yZF9uYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGlmICcuLicgaW4gdV9hcmNuYW1lOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIGVudHJ5IGluICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlZWw6ICVyJyAlIHVfYXJjbmFtZSkKICAgICAgICAgICAgICAgICAgICB6Zi5leHRyYWN0KHppbmZvLCB3b3JrZGlyKQogICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4od29ya2RpciwgY29udmVydF9wYXRoKHVfYXJjbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgcGF0aF9tYXBbdV9hcmNuYW1lXSA9IHBhdGgKCiAgICAgICAgICAgICMgUmVtZW1iZXIgdGhlIHZlcnNpb24uCiAgICAgICAgICAgIG9yaWdpbmFsX3ZlcnNpb24sIF8gPSBnZXRfdmVyc2lvbihwYXRoX21hcCwgaW5mb19kaXIpCiAgICAgICAgICAgICMgRmlsZXMgZXh0cmFjdGVkLiBDYWxsIHRoZSBtb2RpZmllci4KICAgICAgICAgICAgbW9kaWZpZWQgPSBtb2RpZmllcihwYXRoX21hcCwgKiprd2FyZ3MpCiAgICAgICAgICAgIGlmIG1vZGlmaWVkOgogICAgICAgICAgICAgICAgIyBTb21ldGhpbmcgY2hhbmdlZCAtIG5lZWQgdG8gYnVpbGQgYSBuZXcgd2hlZWwuCiAgICAgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb24sIHBhdGggPSBnZXRfdmVyc2lvbihwYXRoX21hcCwgaW5mb19kaXIpCiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X3ZlcnNpb24gYW5kIChjdXJyZW50X3ZlcnNpb24gPT0gb3JpZ2luYWxfdmVyc2lvbik6CiAgICAgICAgICAgICAgICAgICAgIyBBZGQgb3IgdXBkYXRlIGxvY2FsIHZlcnNpb24gdG8gc2lnbmlmeSBjaGFuZ2VzLgogICAgICAgICAgICAgICAgICAgIHVwZGF0ZV92ZXJzaW9uKGN1cnJlbnRfdmVyc2lvbiwgcGF0aCkKICAgICAgICAgICAgICAgICMgRGVjaWRlIHdoZXJlIHRoZSBuZXcgd2hlZWwgZ29lcy4KICAgICAgICAgICAgICAgIGlmIGRlc3RfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZmQsIG5ld3BhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKHN1ZmZpeD0nLndobCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD0nd2hlZWwtdXBkYXRlLScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj13b3JrZGlyKQogICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkZXN0X2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ05vdCBhIGRpcmVjdG9yeTogJXInICUgZGVzdF9kaXIpCiAgICAgICAgICAgICAgICAgICAgbmV3cGF0aCA9IG9zLnBhdGguam9pbihkZXN0X2Rpciwgc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aHMgPSBsaXN0KHBhdGhfbWFwLml0ZW1zKCkpCiAgICAgICAgICAgICAgICBkaXN0aW5mbyA9IG9zLnBhdGguam9pbih3b3JrZGlyLCBpbmZvX2RpcikKICAgICAgICAgICAgICAgIGluZm8gPSBkaXN0aW5mbywgaW5mb19kaXIKICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfcmVjb3JkcyhpbmZvLCB3b3JrZGlyLCBhcmNoaXZlX3BhdGhzKQogICAgICAgICAgICAgICAgc2VsZi5idWlsZF96aXAobmV3cGF0aCwgYXJjaGl2ZV9wYXRocykKICAgICAgICAgICAgICAgIGlmIGRlc3RfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKG5ld3BhdGgsIHBhdGhuYW1lKQogICAgICAgIHJldHVybiBtb2RpZmllZAoKZGVmIGNvbXBhdGlibGVfdGFncygpOgogICAgIiIiCiAgICBSZXR1cm4gKHB5dmVyLCBhYmksIGFyY2gpIHR1cGxlcyBjb21wYXRpYmxlIHdpdGggdGhpcyBQeXRob24uCiAgICAiIiIKICAgIHZlcnNpb25zID0gW1ZFUl9TVUZGSVhdCiAgICBtYWpvciA9IFZFUl9TVUZGSVhbMF0KICAgIGZvciBtaW5vciBpbiByYW5nZShzeXMudmVyc2lvbl9pbmZvWzFdIC0gMSwgLSAxLCAtMSk6CiAgICAgICAgdmVyc2lvbnMuYXBwZW5kKCcnLmpvaW4oW21ham9yLCBzdHIobWlub3IpXSkpCgogICAgYWJpcyA9IFtdCiAgICBmb3Igc3VmZml4LCBfLCBfIGluIGltcC5nZXRfc3VmZml4ZXMoKToKICAgICAgICBpZiBzdWZmaXguc3RhcnRzd2l0aCgnLmFiaScpOgogICAgICAgICAgICBhYmlzLmFwcGVuZChzdWZmaXguc3BsaXQoJy4nLCAyKVsxXSkKICAgIGFiaXMuc29ydCgpCiAgICBpZiBBQkkgIT0gJ25vbmUnOgogICAgICAgIGFiaXMuaW5zZXJ0KDAsIEFCSSkKICAgIGFiaXMuYXBwZW5kKCdub25lJykKICAgIHJlc3VsdCA9IFtdCgogICAgYXJjaGVzID0gW0FSQ0hdCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgbSA9IHJlLm1hdGNoKCcoXHcrKV8oXGQrKV8oXGQrKV8oXHcrKSQnLCBBUkNIKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIG5hbWUsIG1ham9yLCBtaW5vciwgYXJjaCA9IG0uZ3JvdXBzKCkKICAgICAgICAgICAgbWlub3IgPSBpbnQobWlub3IpCiAgICAgICAgICAgIG1hdGNoZXMgPSBbYXJjaF0KICAgICAgICAgICAgaWYgYXJjaCBpbiAoJ2kzODYnLCAncHBjJyk6CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgnZmF0JykKICAgICAgICAgICAgaWYgYXJjaCBpbiAoJ2kzODYnLCAncHBjJywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoJ2ZhdDMnKQogICAgICAgICAgICBpZiBhcmNoIGluICgncHBjNjQnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgnZmF0NjQnKQogICAgICAgICAgICBpZiBhcmNoIGluICgnaTM4NicsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCdpbnRlbCcpCiAgICAgICAgICAgIGlmIGFyY2ggaW4gKCdpMzg2JywgJ3g4Nl82NCcsICdpbnRlbCcsICdwcGMnLCAncHBjNjQnKToKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCd1bml2ZXJzYWwnKQogICAgICAgICAgICB3aGlsZSBtaW5vciA+PSAwOgogICAgICAgICAgICAgICAgZm9yIG1hdGNoIGluIG1hdGNoZXM6CiAgICAgICAgICAgICAgICAgICAgcyA9ICclc18lc18lc18lcycgJSAobmFtZSwgbWFqb3IsIG1pbm9yLCBtYXRjaCkKICAgICAgICAgICAgICAgICAgICBpZiBzICE9IEFSQ0g6ICAgIyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hlcy5hcHBlbmQocykKICAgICAgICAgICAgICAgIG1pbm9yIC09IDEKCiAgICAjIE1vc3Qgc3BlY2lmaWMgLSBvdXIgUHl0aG9uIHZlcnNpb24sIEFCSSBhbmQgYXJjaAogICAgZm9yIGFiaSBpbiBhYmlzOgogICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycuam9pbigoSU1QX1BSRUZJWCwgdmVyc2lvbnNbMF0pKSwgYWJpLCBhcmNoKSkKCiAgICAjIHdoZXJlIG5vIEFCSSAvIGFyY2ggZGVwZW5kZW5jeSwgYnV0IElNUF9QUkVGSVggZGVwZW5kZW5jeQogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICByZXN1bHQuYXBwZW5kKCgnJy5qb2luKChJTVBfUFJFRklYLCB2ZXJzaW9uKSksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycuam9pbigoSU1QX1BSRUZJWCwgdmVyc2lvblswXSkpLCAnbm9uZScsICdhbnknKSkKCiAgICAjIG5vIElNUF9QUkVGSVgsIEFCSSBvciBhcmNoIGRlcGVuZGVuY3kKICAgIGZvciBpLCB2ZXJzaW9uIGluIGVudW1lcmF0ZSh2ZXJzaW9ucyk6CiAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycuam9pbigoJ3B5JywgdmVyc2lvbikpLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKCcnLmpvaW4oKCdweScsIHZlcnNpb25bMF0pKSwgJ25vbmUnLCAnYW55JykpCiAgICByZXR1cm4gc2V0KHJlc3VsdCkKCgpDT01QQVRJQkxFX1RBR1MgPSBjb21wYXRpYmxlX3RhZ3MoKQoKZGVsIGNvbXBhdGlibGVfdGFncwoKCmRlZiBpc19jb21wYXRpYmxlKHdoZWVsLCB0YWdzPU5vbmUpOgogICAgaWYgbm90IGlzaW5zdGFuY2Uod2hlZWwsIFdoZWVsKToKICAgICAgICB3aGVlbCA9IFdoZWVsKHdoZWVsKSAgICAjIGFzc3VtZSBpdCdzIGEgZmlsZW5hbWUKICAgIHJlc3VsdCA9IEZhbHNlCiAgICBpZiB0YWdzIGlzIE5vbmU6CiAgICAgICAgdGFncyA9IENPTVBBVElCTEVfVEFHUwogICAgZm9yIHZlciwgYWJpLCBhcmNoIGluIHRhZ3M6CiAgICAgICAgaWYgdmVyIGluIHdoZWVsLnB5dmVyIGFuZCBhYmkgaW4gd2hlZWwuYWJpIGFuZCBhcmNoIGluIHdoZWVsLmFyY2g6CiAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIHJldHVybiByZXN1bHQKUEsDBBQAAAAAAAAAIQCRwcCuzZUAAM2VAAAyAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0cm8ucHkjIENvcHlyaWdodCAyMDE1LDIwMTYgTmlyIENvaGVuCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiIiIgpUaGUgYGBkaXN0cm9gYCBwYWNrYWdlIChgYGRpc3Ryb2BgIHN0YW5kcyBmb3IgTGludXggRGlzdHJpYnV0aW9uKSBwcm92aWRlcwppbmZvcm1hdGlvbiBhYm91dCB0aGUgTGludXggZGlzdHJpYnV0aW9uIGl0IHJ1bnMgb24sIHN1Y2ggYXMgYSByZWxpYWJsZQptYWNoaW5lLXJlYWRhYmxlIGRpc3RybyBJRCwgb3IgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCkl0IGlzIGEgcmVuZXdlZCBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBmb3IgUHl0aG9uJ3Mgb3JpZ2luYWwKOnB5OmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAgZnVuY3Rpb24sIGJ1dCBpdCBwcm92aWRlcyBtdWNoIG1vcmUKZnVuY3Rpb25hbGl0eS4gQW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gYmVjYW1lIG5lY2Vzc2FyeSBiZWNhdXNlIFB5dGhvbgozLjUgZGVwcmVjYXRlZCB0aGlzIGZ1bmN0aW9uLCBhbmQgUHl0aG9uIDMuNyBpcyBleHBlY3RlZCB0byByZW1vdmUgaXQKYWx0b2dldGhlci4gSXRzIHByZWRlY2Vzc29yIGZ1bmN0aW9uIDpweTpmdW5jOmBwbGF0Zm9ybS5kaXN0YCB3YXMgYWxyZWFkeQpkZXByZWNhdGVkIHNpbmNlIFB5dGhvbiAyLjYgYW5kIGlzIGFsc28gZXhwZWN0ZWQgdG8gYmUgcmVtb3ZlZCBpbiBQeXRob24gMy43LgpTdGlsbCwgdGhlcmUgYXJlIG1hbnkgY2FzZXMgaW4gd2hpY2ggYWNjZXNzIHRvIExpbnV4IGRpc3RyaWJ1dGlvbiBpbmZvcm1hdGlvbgppcyBuZWVkZWQuIFNlZSBgUHl0aG9uIGlzc3VlIDEzMjIgPGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTMyMj5gXyBmb3IKbW9yZSBpbmZvcm1hdGlvbi4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IGpzb24KaW1wb3J0IHNobGV4CmltcG9ydCBsb2dnaW5nCmltcG9ydCBzdWJwcm9jZXNzCgoKaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpOgogICAgcmFpc2UgSW1wb3J0RXJyb3IoJ1Vuc3VwcG9ydGVkIHBsYXRmb3JtOiB7MH0nLmZvcm1hdChzeXMucGxhdGZvcm0pKQoKX1VOSVhDT05GRElSID0gJy9ldGMnCl9PU19SRUxFQVNFX0JBU0VOQU1FID0gJ29zLXJlbGVhc2UnCgojOiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Igbm9ybWFsaXppbmcgdGhlICJJRCIgYXR0cmlidXRlIGRlZmluZWQgaW4gb3MtcmVsZWFzZQojOiBmaWxlcywgZm9yIHVzZSBieSB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAgbWV0aG9kLgojOgojOiAqIEtleTogVmFsdWUgYXMgZGVmaW5lZCBpbiB0aGUgb3MtcmVsZWFzZSBmaWxlLCB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UsCiM6ICAgd2l0aCBibGFua3MgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3Jlcy4KIzoKIzogKiBWYWx1ZTogTm9ybWFsaXplZCB2YWx1ZS4KTk9STUFMSVpFRF9PU19JRCA9IHt9CgojOiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Igbm9ybWFsaXppbmcgdGhlICJEaXN0cmlidXRvciBJRCIgYXR0cmlidXRlIHJldHVybmVkIGJ5CiM6IHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLCBmb3IgdXNlIGJ5IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYCBtZXRob2QuCiM6CiM6ICogS2V5OiBWYWx1ZSBhcyByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCwgdHJhbnNsYXRlZCB0byBsb3dlcgojOiAgIGNhc2UsIHdpdGggYmxhbmtzIHRyYW5zbGF0ZWQgdG8gdW5kZXJzY29yZXMuCiM6CiM6ICogVmFsdWU6IE5vcm1hbGl6ZWQgdmFsdWUuCk5PUk1BTElaRURfTFNCX0lEID0gewogICAgJ2VudGVycHJpc2VlbnRlcnByaXNlJzogJ29yYWNsZScsICAjIE9yYWNsZSBFbnRlcnByaXNlIExpbnV4CiAgICAncmVkaGF0ZW50ZXJwcmlzZXdvcmtzdGF0aW9uJzogJ3JoZWwnLCAgIyBSSEVMIDYuNwp9CgojOiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Igbm9ybWFsaXppbmcgdGhlIGRpc3RybyBJRCBkZXJpdmVkIGZyb20gdGhlIGZpbGUgbmFtZQojOiBvZiBkaXN0cm8gcmVsZWFzZSBmaWxlcywgZm9yIHVzZSBieSB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAgbWV0aG9kLgojOgojOiAqIEtleTogVmFsdWUgYXMgZGVyaXZlZCBmcm9tIHRoZSBmaWxlIG5hbWUgb2YgYSBkaXN0cm8gcmVsZWFzZSBmaWxlLAojOiAgIHRyYW5zbGF0ZWQgdG8gbG93ZXIgY2FzZSwgd2l0aCBibGFua3MgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3Jlcy4KIzoKIzogKiBWYWx1ZTogTm9ybWFsaXplZCB2YWx1ZS4KTk9STUFMSVpFRF9ESVNUUk9fSUQgPSB7CiAgICAncmVkaGF0JzogJ3JoZWwnLCAgIyBSSEVMIDYueCwgNy54Cn0KCiMgUGF0dGVybiBmb3IgY29udGVudCBvZiBkaXN0cm8gcmVsZWFzZSBmaWxlIChyZXZlcnNlZCkKX0RJU1RST19SRUxFQVNFX0NPTlRFTlRfUkVWRVJTRURfUEFUVEVSTiA9IHJlLmNvbXBpbGUoCiAgICByJyg/OlteKV0qXCkoLiopXCgpPyAqKD86U1RMICk/KFtcZC4rXC1hLXpdKlxkKSAqKD86ZXNhZWxlciAqKT8oLispJykKCiMgUGF0dGVybiBmb3IgYmFzZSBmaWxlIG5hbWUgb2YgZGlzdHJvIHJlbGVhc2UgZmlsZQpfRElTVFJPX1JFTEVBU0VfQkFTRU5BTUVfUEFUVEVSTiA9IHJlLmNvbXBpbGUoCiAgICByJyhcdyspWy1fXShyZWxlYXNlfHZlcnNpb24pJCcpCgojIEJhc2UgZmlsZSBuYW1lcyB0byBiZSBpZ25vcmVkIHdoZW4gc2VhcmNoaW5nIGZvciBkaXN0cm8gcmVsZWFzZSBmaWxlCl9ESVNUUk9fUkVMRUFTRV9JR05PUkVfQkFTRU5BTUVTID0gKAogICAgJ2RlYmlhbl92ZXJzaW9uJywKICAgICdsc2ItcmVsZWFzZScsCiAgICAnb2VtLXJlbGVhc2UnLAogICAgX09TX1JFTEVBU0VfQkFTRU5BTUUsCiAgICAnc3lzdGVtLXJlbGVhc2UnCikKCgpkZWYgbGludXhfZGlzdHJpYnV0aW9uKGZ1bGxfZGlzdHJpYnV0aW9uX25hbWU9VHJ1ZSk6CiAgICAiIiIKICAgIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24gYXMgYSB0dXBsZQogICAgYGAoaWRfbmFtZSwgdmVyc2lvbiwgY29kZW5hbWUpYGAgd2l0aCBpdGVtcyBhcyBmb2xsb3dzOgoKICAgICogYGBpZF9uYW1lYGA6ICBJZiAqZnVsbF9kaXN0cmlidXRpb25fbmFtZSogaXMgZmFsc2UsIHRoZSByZXN1bHQgb2YKICAgICAgOmZ1bmM6YGRpc3Ryby5pZGAuIE90aGVyd2lzZSwgdGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm5hbWVgLgoKICAgICogYGB2ZXJzaW9uYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAuCgogICAgKiBgYGNvZGVuYW1lYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgoKICAgIFRoZSBpbnRlcmZhY2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9yaWdpbmFsCiAgICA6cHk6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCBmdW5jdGlvbiwgc3VwcG9ydGluZyBhIHN1YnNldCBvZgogICAgaXRzIHBhcmFtZXRlcnMuCgogICAgVGhlIGRhdGEgaXQgcmV0dXJucyBtYXkgbm90IGV4YWN0bHkgYmUgdGhlIHNhbWUsIGJlY2F1c2UgaXQgdXNlcyBtb3JlIGRhdGEKICAgIHNvdXJjZXMgdGhhbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGFuZCB0aGF0IG1heSBsZWFkIHRvIGRpZmZlcmVudCBkYXRhIGlmCiAgICB0aGUgTGludXggZGlzdHJpYnV0aW9uIGlzIG5vdCBjb25zaXN0ZW50IGFjcm9zcyBtdWx0aXBsZSBkYXRhIHNvdXJjZXMgaXQKICAgIHByb3ZpZGVzICh0aGVyZSBhcmUgaW5kZWVkIHN1Y2ggZGlzdHJpYnV0aW9ucyAuLi4pLgoKICAgIEFub3RoZXIgcmVhc29uIGZvciBkaWZmZXJlbmNlcyBpcyB0aGUgZmFjdCB0aGF0IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYAogICAgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlIGRpc3RybyBJRCBzdHJpbmcgdG8gYSByZWxpYWJsZSBtYWNoaW5lLXJlYWRhYmxlIHZhbHVlCiAgICBmb3IgYSBudW1iZXIgb2YgcG9wdWxhciBMaW51eCBkaXN0cmlidXRpb25zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5saW51eF9kaXN0cmlidXRpb24oZnVsbF9kaXN0cmlidXRpb25fbmFtZSkKCgpkZWYgaWQoKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBkaXN0cm8gSUQgb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhCiAgICBtYWNoaW5lLXJlYWRhYmxlIHN0cmluZy4KCiAgICBGb3IgYSBudW1iZXIgb2YgTGludXggZGlzdHJpYnV0aW9ucywgdGhlIHJldHVybmVkIGRpc3RybyBJRCB2YWx1ZSBpcwogICAgKnJlbGlhYmxlKiwgaW4gdGhlIHNlbnNlIHRoYXQgaXQgaXMgZG9jdW1lbnRlZCBhbmQgdGhhdCBpdCBkb2VzIG5vdCBjaGFuZ2UKICAgIGFjcm9zcyByZWxlYXNlcyBvZiB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIFRoaXMgcGFja2FnZSBtYWludGFpbnMgdGhlIGZvbGxvd2luZyByZWxpYWJsZSBkaXN0cm8gSUQgdmFsdWVzOgoKICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgRGlzdHJvIElEICAgICAgIERpc3RyaWJ1dGlvbgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAidWJ1bnR1IiAgICAgICAgVWJ1bnR1CiAgICAiZGViaWFuIiAgICAgICAgRGViaWFuCiAgICAicmhlbCIgICAgICAgICAgUmVkSGF0IEVudGVycHJpc2UgTGludXgKICAgICJjZW50b3MiICAgICAgICBDZW50T1MKICAgICJmZWRvcmEiICAgICAgICBGZWRvcmEKICAgICJzbGVzIiAgICAgICAgICBTVVNFIExpbnV4IEVudGVycHJpc2UgU2VydmVyCiAgICAib3BlbnN1c2UiICAgICAgb3BlblNVU0UKICAgICJhbWF6b24iICAgICAgICBBbWF6b24gTGludXgKICAgICJhcmNoIiAgICAgICAgICBBcmNoIExpbnV4CiAgICAiY2xvdWRsaW51eCIgICAgQ2xvdWRMaW51eCBPUwogICAgImV4aGVyYm8iICAgICAgIEV4aGVyYm8gTGludXgKICAgICJnZW50b28iICAgICAgICBHZW5Ub28gTGludXgKICAgICJpYm1fcG93ZXJrdm0iICBJQk0gUG93ZXJLVk0KICAgICJrdm1pYm0iICAgICAgICBLVk0gZm9yIElCTSB6IFN5c3RlbXMKICAgICJsaW51eG1pbnQiICAgICBMaW51eCBNaW50CiAgICAibWFnZWlhIiAgICAgICAgTWFnZWlhCiAgICAibWFuZHJpdmEiICAgICAgTWFuZHJpdmEgTGludXgKICAgICJwYXJhbGxlbHMiICAgICBQYXJhbGxlbHMKICAgICJwaWRvcmEiICAgICAgICBQaWRvcmEKICAgICJyYXNwYmlhbiIgICAgICBSYXNwYmlhbgogICAgIm9yYWNsZSIgICAgICAgIE9yYWNsZSBMaW51eCAoYW5kIE9yYWNsZSBFbnRlcnByaXNlIExpbnV4KQogICAgInNjaWVudGlmaWMiICAgIFNjaWVudGlmaWMgTGludXgKICAgICJzbGFja3dhcmUiICAgICBTbGFja3dhcmUKICAgICJ4ZW5zZXJ2ZXIiICAgICBYZW5TZXJ2ZXIKICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIElmIHlvdSBoYXZlIGEgbmVlZCB0byBnZXQgZGlzdHJvcyBmb3IgcmVsaWFibGUgSURzIGFkZGVkIGludG8gdGhpcyBzZXQsCiAgICBvciBpZiB5b3UgZmluZCB0aGF0IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYCBmdW5jdGlvbiByZXR1cm5zIGEgZGlmZmVyZW50CiAgICBkaXN0cm8gSUQgZm9yIG9uZSBvZiB0aGUgbGlzdGVkIGRpc3Ryb3MsIHBsZWFzZSBjcmVhdGUgYW4gaXNzdWUgaW4gdGhlCiAgICBgZGlzdHJvIGlzc3VlIHRyYWNrZXJgXy4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHkgYW5kIHRyYW5zZm9ybWF0aW9uczoqKgoKICAgIEZpcnN0LCB0aGUgSUQgaXMgb2J0YWluZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMsIGluIHRoZSBzcGVjaWZpZWQKICAgIG9yZGVyLiBUaGUgZmlyc3QgYXZhaWxhYmxlIGFuZCBub24tZW1wdHkgdmFsdWUgaXMgdXNlZDoKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIklEIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIkRpc3RyaWJ1dG9yIElEIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCgogICAgKiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZmlsZSBuYW1lIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLAoKICAgIFRoZSBzbyBkZXRlcm1pbmVkIElEIHZhbHVlIHRoZW4gcGFzc2VzIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtYXRpb25zLAogICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kOgoKICAgICogaXQgaXMgdHJhbnNsYXRlZCB0byBsb3dlciBjYXNlLAoKICAgICogYmxhbmtzICh3aGljaCBzaG91bGQgbm90IGJlIHRoZXJlIGFueXdheSkgYXJlIHRyYW5zbGF0ZWQgdG8gdW5kZXJzY29yZXMsCgogICAgKiBhIG5vcm1hbGl6YXRpb24gb2YgdGhlIElEIGlzIHBlcmZvcm1lZCwgYmFzZWQgdXBvbgogICAgICBgbm9ybWFsaXphdGlvbiB0YWJsZXNgXy4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBub3JtYWxpemF0aW9uIGlzIHRvIGVuc3VyZQogICAgICB0aGF0IHRoZSBJRCBpcyBhcyByZWxpYWJsZSBhcyBwb3NzaWJsZSwgZXZlbiBhY3Jvc3MgaW5jb21wYXRpYmxlIGNoYW5nZXMKICAgICAgaW4gdGhlIExpbnV4IGRpc3RyaWJ1dGlvbnMuIEEgY29tbW9uIHJlYXNvbiBmb3IgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSBpcwogICAgICB0aGUgYWRkaXRpb24gb2YgYW4gb3MtcmVsZWFzZSBmaWxlLCBvciB0aGUgYWRkaXRpb24gb2YgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsIHdpdGggSUQgdmFsdWVzIHRoYXQgZGlmZmVyIGZyb20gd2hhdCB3YXMgcHJldmlvdXNseSBkZXRlcm1pbmVkCiAgICAgIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUgbmFtZS4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uaWQoKQoKCmRlZiBuYW1lKHByZXR0eT1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgaHVtYW4tcmVhZGFibGUKICAgIHN0cmluZy4KCiAgICBJZiAqcHJldHR5KiBpcyBmYWxzZSwgdGhlIG5hbWUgaXMgcmV0dXJuZWQgd2l0aG91dCB2ZXJzaW9uIG9yIGNvZGVuYW1lLgogICAgKGUuZy4gIkNlbnRPUyBMaW51eCIpCgogICAgSWYgKnByZXR0eSogaXMgdHJ1ZSwgdGhlIHZlcnNpb24gYW5kIGNvZGVuYW1lIGFyZSBhcHBlbmRlZC4KICAgIChlLmcuICJDZW50T1MgTGludXggNy4xLjE1MDMgKENvcmUpIikKCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICBUaGUgbmFtZSBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcywgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4KICAgIFRoZSBmaXJzdCBhdmFpbGFibGUgYW5kIG5vbi1lbXB0eSB2YWx1ZSBpcyB1c2VkOgoKICAgICogSWYgKnByZXR0eSogaXMgZmFsc2U6CgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIk5BTUUiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICJEaXN0cmlidXRvciBJRCIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICAgIGNvbW1hbmQsCgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIjxuYW1lPiIgZmllbGQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgKiBJZiAqcHJldHR5KiBpcyB0cnVlOgoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICJQUkVUVFlfTkFNRSIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIkRlc2NyaXB0aW9uIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgICAgY29tbWFuZCwKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiPG5hbWU+IiBmaWVsZCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwgYXBwZW5kZWQKICAgICAgICB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgcHJldHR5IHZlcnNpb24gKCI8dmVyc2lvbl9pZD4iIGFuZCAiPGNvZGVuYW1lPiIKICAgICAgICBmaWVsZHMpIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLCBpZiBhdmFpbGFibGUuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm5hbWUocHJldHR5KQoKCmRlZiB2ZXJzaW9uKHByZXR0eT1GYWxzZSwgYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgaHVtYW4tcmVhZGFibGUKICAgIHN0cmluZy4KCiAgICBJZiAqcHJldHR5KiBpcyBmYWxzZSwgdGhlIHZlcnNpb24gaXMgcmV0dXJuZWQgd2l0aG91dCBjb2RlbmFtZSAoZS5nLgogICAgIjcuMCIpLgoKICAgIElmICpwcmV0dHkqIGlzIHRydWUsIHRoZSBjb2RlbmFtZSBpbiBwYXJlbnRoZXNpcyBpcyBhcHBlbmRlZCwgaWYgdGhlCiAgICBjb2RlbmFtZSBpcyBub24tZW1wdHkgKGUuZy4gIjcuMCAoTWFpcG8pIikuCgogICAgU29tZSBkaXN0cmlidXRpb25zIHByb3ZpZGUgdmVyc2lvbiBudW1iZXJzIHdpdGggZGlmZmVyZW50IHByZWNpc2lvbnMgaW4KICAgIHRoZSBkaWZmZXJlbnQgc291cmNlcyBvZiBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24uIEV4YW1pbmluZyB0aGUgZGlmZmVyZW50CiAgICBzb3VyY2VzIGluIGEgZml4ZWQgcHJpb3JpdHkgb3JkZXIgZG9lcyBub3QgYWx3YXlzIHlpZWxkIHRoZSBtb3N0IHByZWNpc2UKICAgIHZlcnNpb24gKGUuZy4gZm9yIERlYmlhbiA4LjIsIG9yIENlbnRPUyA3LjEpLgoKICAgIFRoZSAqYmVzdCogcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGFwcHJvYWNoIGZvciB0aGUgcmV0dXJuZWQKICAgIHZlcnNpb246CgogICAgSWYgKmJlc3QqIGlzIGZhbHNlLCB0aGUgZmlyc3Qgbm9uLWVtcHR5IHZlcnNpb24gbnVtYmVyIGluIHByaW9yaXR5IG9yZGVyIG9mCiAgICB0aGUgZXhhbWluZWQgc291cmNlcyBpcyByZXR1cm5lZC4KCiAgICBJZiAqYmVzdCogaXMgdHJ1ZSwgdGhlIG1vc3QgcHJlY2lzZSB2ZXJzaW9uIG51bWJlciBvdXQgb2YgYWxsIGV4YW1pbmVkCiAgICBzb3VyY2VzIGlzIHJldHVybmVkLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgIEluIGFsbCBjYXNlcywgdGhlIHZlcnNpb24gbnVtYmVyIGlzIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzLgogICAgSWYgKmJlc3QqIGlzIGZhbHNlLCB0aGlzIG9yZGVyIHJlcHJlc2VudHMgdGhlIHByaW9yaXR5IG9yZGVyOgoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiVkVSU0lPTl9JRCIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIlJlbGVhc2UiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiPHZlcnNpb25faWQ+IiBmaWVsZCBvZiB0aGUgZmlyc3QgbGluZQogICAgICBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwKICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiUFJFVFRZX05BTUUiIGF0dHJpYnV0ZSBvZiB0aGUKICAgICAgb3MtcmVsZWFzZSBmaWxlLCBpZiBpdCBmb2xsb3dzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGVzLgogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICJEZXNjcmlwdGlvbiIgYXR0cmlidXRlIHJldHVybmVkIGJ5CiAgICAgIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLCBpZiBpdCBmb2xsb3dzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc3RybyByZWxlYXNlCiAgICAgIGZpbGVzLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby52ZXJzaW9uKHByZXR0eSwgYmVzdCkKCgpkZWYgdmVyc2lvbl9wYXJ0cyhiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiBhcyBhIHR1cGxlCiAgICBgYChtYWpvciwgbWlub3IsIGJ1aWxkX251bWJlcilgYCB3aXRoIGl0ZW1zIGFzIGZvbGxvd3M6CgogICAgKiBgYG1ham9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWFqb3JfdmVyc2lvbmAuCgogICAgKiBgYG1pbm9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWlub3JfdmVyc2lvbmAuCgogICAgKiBgYGJ1aWxkX251bWJlcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmJ1aWxkX251bWJlcmAuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpiZXN0KiBwYXJhbWV0ZXIsIHNlZSB0aGUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYAogICAgbWV0aG9kLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby52ZXJzaW9uX3BhcnRzKGJlc3QpCgoKZGVmIG1ham9yX3ZlcnNpb24oYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLAogICAgaWYgcHJvdmlkZWQuCiAgICBPdGhlcndpc2UsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuIFRoZSBtYWpvciB2ZXJzaW9uIGlzIHRoZSBmaXJzdAogICAgcGFydCBvZiB0aGUgZG90LXNlcGFyYXRlZCB2ZXJzaW9uIHN0cmluZy4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKmJlc3QqIHBhcmFtZXRlciwgc2VlIHRoZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gCiAgICBtZXRob2QuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm1ham9yX3ZlcnNpb24oYmVzdCkKCgpkZWYgbWlub3JfdmVyc2lvbihiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcsCiAgICBpZiBwcm92aWRlZC4KICAgIE90aGVyd2lzZSwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4gVGhlIG1pbm9yIHZlcnNpb24gaXMgdGhlIHNlY29uZAogICAgcGFydCBvZiB0aGUgZG90LXNlcGFyYXRlZCB2ZXJzaW9uIHN0cmluZy4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKmJlc3QqIHBhcmFtZXRlciwgc2VlIHRoZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gCiAgICBtZXRob2QuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm1pbm9yX3ZlcnNpb24oYmVzdCkKCgpkZWYgYnVpbGRfbnVtYmVyKGJlc3Q9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGJ1aWxkIG51bWJlciBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLAogICAgaWYgcHJvdmlkZWQuCiAgICBPdGhlcndpc2UsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuIFRoZSBidWlsZCBudW1iZXIgaXMgdGhlIHRoaXJkIHBhcnQKICAgIG9mIHRoZSBkb3Qtc2VwYXJhdGVkIHZlcnNpb24gc3RyaW5nLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqYmVzdCogcGFyYW1ldGVyLCBzZWUgdGhlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAKICAgIG1ldGhvZC4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uYnVpbGRfbnVtYmVyKGJlc3QpCgoKZGVmIGxpa2UoKToKICAgICIiIgogICAgUmV0dXJuIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZGlzdHJvIElEcyBvZiBkaXN0cmlidXRpb25zIHRoYXQgYXJlCiAgICBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uIGluIHJlZ2FyZHMgdG8gcGFja2FnaW5nCiAgICBhbmQgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcywgZm9yIGV4YW1wbGUgZGlzdHJpYnV0aW9ucyB0aGUgY3VycmVudAogICAgZGlzdHJpYnV0aW9uIGlzIGEgZGVyaXZhdGl2ZSBmcm9tLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgIFRoaXMgaW5mb3JtYXRpb24gaXRlbSBpcyBvbmx5IHByb3ZpZGVkIGJ5IHRoZSBvcy1yZWxlYXNlIGZpbGUuCiAgICBGb3IgZGV0YWlscywgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgIklEX0xJS0UiIGF0dHJpYnV0ZSBpbiB0aGUKICAgIGBvcy1yZWxlYXNlIG1hbiBwYWdlCiAgICA8aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvc3lzdGVtZC9tYW4vb3MtcmVsZWFzZS5odG1sPmBfLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5saWtlKCkKCgpkZWYgY29kZW5hbWUoKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBjb2RlbmFtZSBmb3IgdGhlIHJlbGVhc2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLAogICAgYXMgYSBzdHJpbmcuCgogICAgSWYgdGhlIGRpc3RyaWJ1dGlvbiBkb2VzIG5vdCBoYXZlIGEgY29kZW5hbWUsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KCiAgICBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGNvZGVuYW1lIGlzIG5vdCBhbHdheXMgcmVhbGx5IGEgY29kZW5hbWUuIEZvcgogICAgZXhhbXBsZSwgb3BlblNVU0UgcmV0dXJucyAieDg2XzY0Ii4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgc3VjaAogICAgY2FzZXMgaW4gYW55IHNwZWNpYWwgd2F5IGFuZCBqdXN0IHJldHVybnMgdGhlIHN0cmluZyBpdCBmaW5kcywgaWYgYW55LgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgICogdGhlIGNvZGVuYW1lIHdpdGhpbiB0aGUgIlZFUlNJT04iIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLCBpZgogICAgICBwcm92aWRlZCwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIkNvZGVuYW1lIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICI8Y29kZW5hbWU+IiBmaWVsZCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uY29kZW5hbWUoKQoKCmRlZiBpbmZvKHByZXR0eT1GYWxzZSwgYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiBjZXJ0YWluIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gaXRlbXMgYWJvdXQgdGhlIGN1cnJlbnQgTGludXgKICAgIGRpc3RyaWJ1dGlvbiBpbiBhIGRpY3Rpb25hcnksIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKCiAgICAuLiBzb3VyY2Vjb2RlOjogcHl0aG9uCgogICAgICAgIHsKICAgICAgICAgICAgJ2lkJzogJ3JoZWwnLAogICAgICAgICAgICAndmVyc2lvbic6ICc3LjAnLAogICAgICAgICAgICAndmVyc2lvbl9wYXJ0cyc6IHsKICAgICAgICAgICAgICAgICdtYWpvcic6ICc3JywKICAgICAgICAgICAgICAgICdtaW5vcic6ICcwJywKICAgICAgICAgICAgICAgICdidWlsZF9udW1iZXInOiAnJwogICAgICAgICAgICB9LAogICAgICAgICAgICAnbGlrZSc6ICdmZWRvcmEnLAogICAgICAgICAgICAnY29kZW5hbWUnOiAnTWFpcG8nCiAgICAgICAgfQoKICAgIFRoZSBkaWN0aW9uYXJ5IHN0cnVjdHVyZSBhbmQga2V5cyBhcmUgYWx3YXlzIHRoZSBzYW1lLCByZWdhcmRsZXNzIG9mIHdoaWNoCiAgICBpbmZvcm1hdGlvbiBpdGVtcyBhcmUgYXZhaWxhYmxlIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlcy4gVGhlIHZhbHVlcwogICAgZm9yIHRoZSB2YXJpb3VzIGtleXMgYXJlIGFzIGZvbGxvd3M6CgogICAgKiBgYGlkYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uaWRgLgoKICAgICogYGB2ZXJzaW9uYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAuCgogICAgKiBgYHZlcnNpb25fcGFydHMgLT4gbWFqb3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5tYWpvcl92ZXJzaW9uYC4KCiAgICAqIGBgdmVyc2lvbl9wYXJ0cyAtPiBtaW5vcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm1pbm9yX3ZlcnNpb25gLgoKICAgICogYGB2ZXJzaW9uX3BhcnRzIC0+IGJ1aWxkX251bWJlcmBgOiAgVGhlIHJlc3VsdCBvZgogICAgICA6ZnVuYzpgZGlzdHJvLmJ1aWxkX251bWJlcmAuCgogICAgKiBgYGxpa2VgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5saWtlYC4KCiAgICAqIGBgY29kZW5hbWVgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5jb2RlbmFtZWAuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpwcmV0dHkqIGFuZCAqYmVzdCogcGFyYW1ldGVycywgc2VlIHRoZQogICAgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYCBtZXRob2QuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmluZm8ocHJldHR5LCBiZXN0KQoKCmRlZiBvc19yZWxlYXNlX2luZm8oKToKICAgICIiIgogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uIGl0ZW1zCiAgICBmcm9tIHRoZSBvcy1yZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgb3MtcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm9zX3JlbGVhc2VfaW5mbygpCgoKZGVmIGxzYl9yZWxlYXNlX2luZm8oKToKICAgICIiIgogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uIGl0ZW1zCiAgICBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBTZWUgYGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0YF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24KICAgIGl0ZW1zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5sc2JfcmVsZWFzZV9pbmZvKCkKCgpkZWYgZGlzdHJvX3JlbGVhc2VfaW5mbygpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5kaXN0cm9fcmVsZWFzZV9pbmZvKCkKCgpkZWYgb3NfcmVsZWFzZV9hdHRyKGF0dHJpYnV0ZSk6CiAgICAiIiIKICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZQogICAgb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFBhcmFtZXRlcnM6CgogICAgKiBgYGF0dHJpYnV0ZWBgIChzdHJpbmcpOiBLZXkgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0uCgogICAgUmV0dXJuczoKCiAgICAqIChzdHJpbmcpOiBWYWx1ZSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbSwgaWYgdGhlIGl0ZW0gZXhpc3RzLgogICAgICBUaGUgZW1wdHkgc3RyaW5nLCBpZiB0aGUgaXRlbSBkb2VzIG5vdCBleGlzdC4KCiAgICBTZWUgYG9zLXJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5vc19yZWxlYXNlX2F0dHIoYXR0cmlidXRlKQoKCmRlZiBsc2JfcmVsZWFzZV9hdHRyKGF0dHJpYnV0ZSk6CiAgICAiIiIKICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0CiAgICBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgUGFyYW1ldGVyczoKCiAgICAqIGBgYXR0cmlidXRlYGAgKHN0cmluZyk6IEtleSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbS4KCiAgICBSZXR1cm5zOgoKICAgICogKHN0cmluZyk6IFZhbHVlIG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLCBpZiB0aGUgaXRlbSBleGlzdHMuCiAgICAgIFRoZSBlbXB0eSBzdHJpbmcsIGlmIHRoZSBpdGVtIGRvZXMgbm90IGV4aXN0LgoKICAgIFNlZSBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbgogICAgaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmxzYl9yZWxlYXNlX2F0dHIoYXR0cmlidXRlKQoKCmRlZiBkaXN0cm9fcmVsZWFzZV9hdHRyKGF0dHJpYnV0ZSk6CiAgICAiIiIKICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUKICAgIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBQYXJhbWV0ZXJzOgoKICAgICogYGBhdHRyaWJ1dGVgYCAoc3RyaW5nKTogS2V5IG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLgoKICAgIFJldHVybnM6CgogICAgKiAoc3RyaW5nKTogVmFsdWUgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0sIGlmIHRoZSBpdGVtIGV4aXN0cy4KICAgICAgVGhlIGVtcHR5IHN0cmluZywgaWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QuCgogICAgU2VlIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2F0dHIoYXR0cmlidXRlKQoKCmNsYXNzIExpbnV4RGlzdHJpYnV0aW9uKG9iamVjdCk6CiAgICAiIiIKICAgIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFRoaXMgcGFja2FnZSBjcmVhdGVzIGEgcHJpdmF0ZSBtb2R1bGUtZ2xvYmFsIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aAogICAgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMsIHRoYXQgaXMgdXNlZCBieSB0aGUKICAgIGBjb25zb2xpZGF0ZWQgYWNjZXNzb3IgZnVuY3Rpb25zYF8gYW5kIGBzaW5nbGUgc291cmNlIGFjY2Vzc29yIGZ1bmN0aW9uc2BfLgogICAgQnkgdXNpbmcgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMsIHRoYXQgbW9kdWxlLWdsb2JhbCBpbnN0YW5jZQogICAgcmV0dXJucyBkYXRhIGFib3V0IHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiAoaS5lLiB0aGUgZGlzdHJvIHRoaXMKICAgIHBhY2thZ2UgcnVucyBvbikuCgogICAgTm9ybWFsbHksIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY3JlYXRlIGFkZGl0aW9uYWwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCiAgICBIb3dldmVyLCBpbiBzaXR1YXRpb25zIHdoZXJlIGNvbnRyb2wgaXMgbmVlZGVkIG92ZXIgdGhlIGV4YWN0IGRhdGEgc291cmNlcwogICAgdGhhdCBhcmUgdXNlZCwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgY2FuIGJlIGNyZWF0ZWQgd2l0aCBhIHNwZWNpZmljCiAgICBkaXN0cm8gcmVsZWFzZSBmaWxlLCBvciBhIHNwZWNpZmljIG9zLXJlbGVhc2UgZmlsZSwgb3Igd2l0aG91dCBpbnZva2luZyB0aGUKICAgIGxzYl9yZWxlYXNlIGNvbW1hbmQuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwKICAgICAgICAgICAgICAgICBpbmNsdWRlX2xzYj1UcnVlLAogICAgICAgICAgICAgICAgIG9zX3JlbGVhc2VfZmlsZT0nJywKICAgICAgICAgICAgICAgICBkaXN0cm9fcmVsZWFzZV9maWxlPScnKToKICAgICAgICAiIiIKICAgICAgICBUaGUgaW5pdGlhbGl6YXRpb24gbWV0aG9kIG9mIHRoaXMgY2xhc3MgZ2F0aGVycyBpbmZvcm1hdGlvbiBmcm9tIHRoZQogICAgICAgIGF2YWlsYWJsZSBkYXRhIHNvdXJjZXMsIGFuZCBzdG9yZXMgdGhhdCBpbiBwcml2YXRlIGluc3RhbmNlIGF0dHJpYnV0ZXMuCiAgICAgICAgU3Vic2VxdWVudCBhY2Nlc3MgdG8gdGhlIGluZm9ybWF0aW9uIGl0ZW1zIHVzZXMgdGhlc2UgcHJpdmF0ZSBpbnN0YW5jZQogICAgICAgIGF0dHJpYnV0ZXMsIHNvIHRoYXQgdGhlIGRhdGEgc291cmNlcyBhcmUgcmVhZCBvbmx5IG9uY2UuCgogICAgICAgIFBhcmFtZXRlcnM6CgogICAgICAgICogYGBpbmNsdWRlX2xzYmBgIChib29sKTogQ29udHJvbHMgd2hldGhlciB0aGUKICAgICAgICAgIGBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dGBfIGlzIGluY2x1ZGVkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICAgSWYgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgcHJvZ3JhbSBleGVjdXRpb24KICAgICAgICAgIHBhdGgsIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgd2lsbCBiZSBlbXB0eS4KCiAgICAgICAgKiBgYG9zX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYG9zLXJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgdG8gYmUgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIEFuIGVtcHR5IHN0cmluZyAodGhlIGRlZmF1bHQpIHdpbGwgY2F1c2UgdGhlIGRlZmF1bHQgcGF0aCBuYW1lIHRvCiAgICAgICAgICBiZSB1c2VkIChzZWUgYG9zLXJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzKS4KCiAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIG9yIGRlZmF1bHRlZCBvcy1yZWxlYXNlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZQogICAgICAgICAgZGF0YSBzb3VyY2UgZm9yIHRoZSBvcy1yZWxlYXNlIGZpbGUgd2lsbCBiZSBlbXB0eS4KCiAgICAgICAgKiBgYGRpc3Ryb19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyB0byBiZSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICAgQW4gZW1wdHkgc3RyaW5nICh0aGUgZGVmYXVsdCkgd2lsbCBjYXVzZSBhIGRlZmF1bHQgc2VhcmNoIGFsZ29yaXRobQogICAgICAgICAgdG8gYmUgdXNlZCAoc2VlIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMpLgoKICAgICAgICAgIElmIHRoZSBzcGVjaWZpZWQgZGlzdHJvIHJlbGVhc2UgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3IgaWYgbm8gZGVmYXVsdAogICAgICAgICAgZGlzdHJvIHJlbGVhc2UgZmlsZSBjYW4gYmUgZm91bmQsIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGRpc3RybwogICAgICAgICAgcmVsZWFzZSBmaWxlIHdpbGwgYmUgZW1wdHkuCgogICAgICAgIFB1YmxpYyBpbnN0YW5jZSBhdHRyaWJ1dGVzOgoKICAgICAgICAqIGBgb3NfcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgb3MtcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyBhY3R1YWxseSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuIFRoZQogICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vIGRpc3RybyByZWxlYXNlIGZpbGUgaXMgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAqIGBgZGlzdHJvX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYGRpc3RybyByZWxlYXNlIGZpbGVgXyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4gVGhlCiAgICAgICAgICBlbXB0eSBzdHJpbmcgaWYgbm8gZGlzdHJvIHJlbGVhc2UgZmlsZSBpcyB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgIFJhaXNlczoKCiAgICAgICAgKiA6cHk6ZXhjOmBJT0Vycm9yYDogU29tZSBJL08gaXNzdWUgd2l0aCBhbiBvcy1yZWxlYXNlIGZpbGUgb3IgZGlzdHJvCiAgICAgICAgICByZWxlYXNlIGZpbGUuCgogICAgICAgICogOnB5OmV4Yzpgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3JgOiBUaGUgbHNiX3JlbGVhc2UgY29tbWFuZCBoYWQKICAgICAgICAgIHNvbWUgaXNzdWUgKG90aGVyIHRoYW4gbm90IGJlaW5nIGF2YWlsYWJsZSBpbiB0aGUgcHJvZ3JhbSBleGVjdXRpb24KICAgICAgICAgIHBhdGgpLgoKICAgICAgICAqIDpweTpleGM6YFVuaWNvZGVFcnJvcmA6IEEgZGF0YSBzb3VyY2UgaGFzIHVuZXhwZWN0ZWQgY2hhcmFjdGVycyBvcgogICAgICAgICAgdXNlcyBhbiB1bmV4cGVjdGVkIGVuY29kaW5nLgogICAgICAgICIiIgogICAgICAgIHNlbGYub3NfcmVsZWFzZV9maWxlID0gb3NfcmVsZWFzZV9maWxlIG9yIFwKICAgICAgICAgICAgb3MucGF0aC5qb2luKF9VTklYQ09ORkRJUiwgX09TX1JFTEVBU0VfQkFTRU5BTUUpCiAgICAgICAgc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlID0gZGlzdHJvX3JlbGVhc2VfZmlsZSBvciAnJyAgIyB1cGRhdGVkIGxhdGVyCiAgICAgICAgc2VsZi5fb3NfcmVsZWFzZV9pbmZvID0gc2VsZi5fZ2V0X29zX3JlbGVhc2VfaW5mbygpCiAgICAgICAgc2VsZi5fbHNiX3JlbGVhc2VfaW5mbyA9IHNlbGYuX2dldF9sc2JfcmVsZWFzZV9pbmZvKCkgXAogICAgICAgICAgICBpZiBpbmNsdWRlX2xzYiBlbHNlIHt9CiAgICAgICAgc2VsZi5fZGlzdHJvX3JlbGVhc2VfaW5mbyA9IHNlbGYuX2dldF9kaXN0cm9fcmVsZWFzZV9pbmZvKCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHJlcHIgb2YgYWxsIGluZm8KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gXAogICAgICAgICAgICAiTGludXhEaXN0cmlidXRpb24oIiBcCiAgICAgICAgICAgICJvc19yZWxlYXNlX2ZpbGU9ezAhcn0sICIgXAogICAgICAgICAgICAiZGlzdHJvX3JlbGVhc2VfZmlsZT17MSFyfSwgIiBcCiAgICAgICAgICAgICJfb3NfcmVsZWFzZV9pbmZvPXsyIXJ9LCAiIFwKICAgICAgICAgICAgIl9sc2JfcmVsZWFzZV9pbmZvPXszIXJ9LCAiIFwKICAgICAgICAgICAgIl9kaXN0cm9fcmVsZWFzZV9pbmZvPXs0IXJ9KSIuZm9ybWF0KAogICAgICAgICAgICAgICAgc2VsZi5vc19yZWxlYXNlX2ZpbGUsCiAgICAgICAgICAgICAgICBzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGUsCiAgICAgICAgICAgICAgICBzZWxmLl9vc19yZWxlYXNlX2luZm8sCiAgICAgICAgICAgICAgICBzZWxmLl9sc2JfcmVsZWFzZV9pbmZvLAogICAgICAgICAgICAgICAgc2VsZi5fZGlzdHJvX3JlbGVhc2VfaW5mbykKCiAgICBkZWYgbGludXhfZGlzdHJpYnV0aW9uKHNlbGYsIGZ1bGxfZGlzdHJpYnV0aW9uX25hbWU9VHJ1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBMaW51eCBkaXN0cmlidXRpb24gdGhhdCBpcyBjb21wYXRpYmxlCiAgICAgICAgd2l0aCBQeXRob24ncyA6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCwgc3VwcG9ydGluZyBhIHN1YnNldAogICAgICAgIG9mIGl0cyBwYXJhbWV0ZXJzLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubGludXhfZGlzdHJpYnV0aW9uYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLm5hbWUoKSBpZiBmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lIGVsc2Ugc2VsZi5pZCgpLAogICAgICAgICAgICBzZWxmLnZlcnNpb24oKSwKICAgICAgICAgICAgc2VsZi5jb2RlbmFtZSgpCiAgICAgICAgKQoKICAgIGRlZiBpZChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGRpc3RybyBJRCBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZy4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmlkYC4KICAgICAgICAiIiIKICAgICAgICBkZWYgbm9ybWFsaXplKGRpc3Ryb19pZCwgdGFibGUpOgogICAgICAgICAgICBkaXN0cm9faWQgPSBkaXN0cm9faWQubG93ZXIoKS5yZXBsYWNlKCcgJywgJ18nKQogICAgICAgICAgICByZXR1cm4gdGFibGUuZ2V0KGRpc3Ryb19pZCwgZGlzdHJvX2lkKQoKICAgICAgICBkaXN0cm9faWQgPSBzZWxmLm9zX3JlbGVhc2VfYXR0cignaWQnKQogICAgICAgIGlmIGRpc3Ryb19pZDoKICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShkaXN0cm9faWQsIE5PUk1BTElaRURfT1NfSUQpCgogICAgICAgIGRpc3Ryb19pZCA9IHNlbGYubHNiX3JlbGVhc2VfYXR0cignZGlzdHJpYnV0b3JfaWQnKQogICAgICAgIGlmIGRpc3Ryb19pZDoKICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShkaXN0cm9faWQsIE5PUk1BTElaRURfTFNCX0lEKQoKICAgICAgICBkaXN0cm9faWQgPSBzZWxmLmRpc3Ryb19yZWxlYXNlX2F0dHIoJ2lkJykKICAgICAgICBpZiBkaXN0cm9faWQ6CiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoZGlzdHJvX2lkLCBOT1JNQUxJWkVEX0RJU1RST19JRCkKCiAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIG5hbWUoc2VsZiwgcHJldHR5PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5uYW1lYC4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gc2VsZi5vc19yZWxlYXNlX2F0dHIoJ25hbWUnKSBcCiAgICAgICAgICAgIG9yIHNlbGYubHNiX3JlbGVhc2VfYXR0cignZGlzdHJpYnV0b3JfaWQnKSBcCiAgICAgICAgICAgIG9yIHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cignbmFtZScpCiAgICAgICAgaWYgcHJldHR5OgogICAgICAgICAgICBuYW1lID0gc2VsZi5vc19yZWxlYXNlX2F0dHIoJ3ByZXR0eV9uYW1lJykgXAogICAgICAgICAgICAgICAgb3Igc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdkZXNjcmlwdGlvbicpCiAgICAgICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cignbmFtZScpCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uKHByZXR0eT1UcnVlKQogICAgICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArICcgJyArIHZlcnNpb24KICAgICAgICByZXR1cm4gbmFtZSBvciAnJwoKICAgIGRlZiB2ZXJzaW9uKHNlbGYsIHByZXR0eT1GYWxzZSwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAuCiAgICAgICAgIiIiCiAgICAgICAgdmVyc2lvbnMgPSBbCiAgICAgICAgICAgIHNlbGYub3NfcmVsZWFzZV9hdHRyKCd2ZXJzaW9uX2lkJyksCiAgICAgICAgICAgIHNlbGYubHNiX3JlbGVhc2VfYXR0cigncmVsZWFzZScpLAogICAgICAgICAgICBzZWxmLmRpc3Ryb19yZWxlYXNlX2F0dHIoJ3ZlcnNpb25faWQnKSwKICAgICAgICAgICAgc2VsZi5fcGFyc2VfZGlzdHJvX3JlbGVhc2VfY29udGVudCgKICAgICAgICAgICAgICAgIHNlbGYub3NfcmVsZWFzZV9hdHRyKCdwcmV0dHlfbmFtZScpKS5nZXQoJ3ZlcnNpb25faWQnLCAnJyksCiAgICAgICAgICAgIHNlbGYuX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2NvbnRlbnQoCiAgICAgICAgICAgICAgICBzZWxmLmxzYl9yZWxlYXNlX2F0dHIoJ2Rlc2NyaXB0aW9uJykpLmdldCgndmVyc2lvbl9pZCcsICcnKQogICAgICAgIF0KICAgICAgICB2ZXJzaW9uID0gJycKICAgICAgICBpZiBiZXN0OgogICAgICAgICAgICAjIFRoaXMgYWxnb3JpdGhtIHVzZXMgdGhlIGxhc3QgdmVyc2lvbiBpbiBwcmlvcml0eSBvcmRlciB0aGF0IGhhcwogICAgICAgICAgICAjIHRoZSBiZXN0IHByZWNpc2lvbi4gSWYgdGhlIHZlcnNpb25zIGFyZSBub3QgaW4gY29uZmxpY3QsIHRoYXQKICAgICAgICAgICAgIyBkb2VzIG5vdCBtYXR0ZXI7IG90aGVyd2lzZSwgdXNpbmcgdGhlIGxhc3Qgb25lIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICMgZmlyc3Qgb25lIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYSBzdXJwcmlzZS4KICAgICAgICAgICAgZm9yIHYgaW4gdmVyc2lvbnM6CiAgICAgICAgICAgICAgICBpZiB2LmNvdW50KCIuIikgPiB2ZXJzaW9uLmNvdW50KCIuIikgb3IgdmVyc2lvbiA9PSAnJzoKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciB2IGluIHZlcnNpb25zOgogICAgICAgICAgICAgICAgaWYgdiAhPSAnJzoKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgcHJldHR5IGFuZCB2ZXJzaW9uIGFuZCBzZWxmLmNvZGVuYW1lKCk6CiAgICAgICAgICAgIHZlcnNpb24gPSB1J3swfSAoezF9KScuZm9ybWF0KHZlcnNpb24sIHNlbGYuY29kZW5hbWUoKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiB2ZXJzaW9uX3BhcnRzKHNlbGYsIGJlc3Q9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHR1cGxlIG9mIHZlcnNpb24KICAgICAgICBudW1iZXJzLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8udmVyc2lvbl9wYXJ0c2AuCiAgICAgICAgIiIiCiAgICAgICAgdmVyc2lvbl9zdHIgPSBzZWxmLnZlcnNpb24oYmVzdD1iZXN0KQogICAgICAgIGlmIHZlcnNpb25fc3RyOgogICAgICAgICAgICB2ZXJzaW9uX3JlZ2V4ID0gcmUuY29tcGlsZShyJyhcZCspXC4/KFxkKyk/XC4/KFxkKyk/JykKICAgICAgICAgICAgbWF0Y2hlcyA9IHZlcnNpb25fcmVnZXgubWF0Y2godmVyc2lvbl9zdHIpCiAgICAgICAgICAgIGlmIG1hdGNoZXM6CiAgICAgICAgICAgICAgICBtYWpvciwgbWlub3IsIGJ1aWxkX251bWJlciA9IG1hdGNoZXMuZ3JvdXBzKCkKICAgICAgICAgICAgICAgIHJldHVybiBtYWpvciwgbWlub3Igb3IgJycsIGJ1aWxkX251bWJlciBvciAnJwogICAgICAgIHJldHVybiAnJywgJycsICcnCgogICAgZGVmIG1ham9yX3ZlcnNpb24oc2VsZiwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5tYWpvcl92ZXJzaW9uYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX3BhcnRzKGJlc3QpWzBdCgogICAgZGVmIG1pbm9yX3ZlcnNpb24oc2VsZiwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubWlub3JfdmVyc2lvbmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbl9wYXJ0cyhiZXN0KVsxXQoKICAgIGRlZiBidWlsZF9udW1iZXIoc2VsZiwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBidWlsZCBudW1iZXIgb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmJ1aWxkX251bWJlcmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbl9wYXJ0cyhiZXN0KVsyXQoKICAgIGRlZiBsaWtlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgSURzIG9mIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgbGlrZSB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubGlrZWAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYub3NfcmVsZWFzZV9hdHRyKCdpZF9saWtlJykgb3IgJycKCiAgICBkZWYgY29kZW5hbWUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBjb2RlbmFtZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLm9zX3JlbGVhc2VfYXR0cignY29kZW5hbWUnKSBcCiAgICAgICAgICAgIG9yIHNlbGYubHNiX3JlbGVhc2VfYXR0cignY29kZW5hbWUnKSBcCiAgICAgICAgICAgIG9yIHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cignY29kZW5hbWUnKSBcCiAgICAgICAgICAgIG9yICcnCgogICAgZGVmIGluZm8oc2VsZiwgcHJldHR5PUZhbHNlLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gY2VydGFpbiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBMaW51eAogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmluZm9gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBkaWN0KAogICAgICAgICAgICBpZD1zZWxmLmlkKCksCiAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKHByZXR0eSwgYmVzdCksCiAgICAgICAgICAgIHZlcnNpb25fcGFydHM9ZGljdCgKICAgICAgICAgICAgICAgIG1ham9yPXNlbGYubWFqb3JfdmVyc2lvbihiZXN0KSwKICAgICAgICAgICAgICAgIG1pbm9yPXNlbGYubWlub3JfdmVyc2lvbihiZXN0KSwKICAgICAgICAgICAgICAgIGJ1aWxkX251bWJlcj1zZWxmLmJ1aWxkX251bWJlcihiZXN0KQogICAgICAgICAgICApLAogICAgICAgICAgICBsaWtlPXNlbGYubGlrZSgpLAogICAgICAgICAgICBjb2RlbmFtZT1zZWxmLmNvZGVuYW1lKCksCiAgICAgICAgKQoKICAgIGRlZiBvc19yZWxlYXNlX2luZm8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uCiAgICAgICAgaXRlbXMgZnJvbSB0aGUgb3MtcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5vc19yZWxlYXNlX2luZm9gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9vc19yZWxlYXNlX2luZm8KCiAgICBkZWYgbHNiX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24KICAgICAgICBpdGVtcyBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGRhdGEgc291cmNlIG9mIHRoZSBMaW51eAogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmxzYl9yZWxlYXNlX2luZm9gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9sc2JfcmVsZWFzZV9pbmZvCgogICAgZGVmIGRpc3Ryb19yZWxlYXNlX2luZm8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uCiAgICAgICAgaXRlbXMgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgTGludXgKICAgICAgICBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5kaXN0cm9fcmVsZWFzZV9pbmZvYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZGlzdHJvX3JlbGVhc2VfaW5mbwoKICAgIGRlZiBvc19yZWxlYXNlX2F0dHIoc2VsZiwgYXR0cmlidXRlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBvcy1yZWxlYXNlIGZpbGUgZGF0YQogICAgICAgIHNvdXJjZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ub3NfcmVsZWFzZV9hdHRyYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fb3NfcmVsZWFzZV9pbmZvLmdldChhdHRyaWJ1dGUsICcnKQoKICAgIGRlZiBsc2JfcmVsZWFzZV9hdHRyKHNlbGYsIGF0dHJpYnV0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZAogICAgICAgIG91dHB1dCBkYXRhIHNvdXJjZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubHNiX3JlbGVhc2VfYXR0cmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2xzYl9yZWxlYXNlX2luZm8uZ2V0KGF0dHJpYnV0ZSwgJycpCgogICAgZGVmIGRpc3Ryb19yZWxlYXNlX2F0dHIoc2VsZiwgYXR0cmlidXRlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlCiAgICAgICAgZGF0YSBzb3VyY2Ugb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2F0dHJgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9kaXN0cm9fcmVsZWFzZV9pbmZvLmdldChhdHRyaWJ1dGUsICcnKQoKICAgIGRlZiBfZ2V0X29zX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBvcy1yZWxlYXNlIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLm9zX3JlbGVhc2VfZmlsZSk6CiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLm9zX3JlbGVhc2VfZmlsZSkgYXMgcmVsZWFzZV9maWxlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX29zX3JlbGVhc2VfY29udGVudChyZWxlYXNlX2ZpbGUpCiAgICAgICAgcmV0dXJuIHt9CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9wYXJzZV9vc19yZWxlYXNlX2NvbnRlbnQobGluZXMpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIHRoZSBsaW5lcyBvZiBhbiBvcy1yZWxlYXNlIGZpbGUuCgogICAgICAgIFBhcmFtZXRlcnM6CgogICAgICAgICogbGluZXM6IEl0ZXJhYmxlIHRocm91Z2ggdGhlIGxpbmVzIGluIHRoZSBvcy1yZWxlYXNlIGZpbGUuCiAgICAgICAgICAgICAgICAgRWFjaCBsaW5lIG11c3QgYmUgYSB1bmljb2RlIHN0cmluZyBvciBhIFVURi04IGVuY29kZWQgYnl0ZQogICAgICAgICAgICAgICAgIHN0cmluZy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIHByb3BzID0ge30KICAgICAgICBsZXhlciA9IHNobGV4LnNobGV4KGxpbmVzLCBwb3NpeD1UcnVlKQogICAgICAgIGxleGVyLndoaXRlc3BhY2Vfc3BsaXQgPSBUcnVlCgogICAgICAgICMgVGhlIHNobGV4IG1vZHVsZSBkZWZpbmVzIGl0cyBgd29yZGNoYXJzYCB2YXJpYWJsZSB1c2luZyBsaXRlcmFscywKICAgICAgICAjIG1ha2luZyBpdCBkZXBlbmRlbnQgb24gdGhlIGVuY29kaW5nIG9mIHRoZSBQeXRob24gc291cmNlIGZpbGUuCiAgICAgICAgIyBJbiBQeXRob24gMi42IGFuZCAyLjcsIHRoZSBzaGxleCBzb3VyY2UgZmlsZSBpcyBlbmNvZGVkIGluCiAgICAgICAgIyAnaXNvLTg4NTktMScsIGFuZCB0aGUgYHdvcmRjaGFyc2AgdmFyaWFibGUgaXMgZGVmaW5lZCBhcyBhIGJ5dGUKICAgICAgICAjIHN0cmluZy4gVGhpcyBjYXVzZXMgYSBVbmljb2RlRGVjb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gdGhlCiAgICAgICAgIyBwYXJzZWQgY29udGVudCBpcyBhIHVuaWNvZGUgb2JqZWN0LiBUaGUgZm9sbG93aW5nIGZpeCByZXNvbHZlcyB0aGF0CiAgICAgICAgIyAoLi4uIGJ1dCBpdCBzaG91bGQgYmUgZml4ZWQgaW4gc2hsZXguLi4pOgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgaXNpbnN0YW5jZShsZXhlci53b3JkY2hhcnMsIGJ5dGVzKToKICAgICAgICAgICAgbGV4ZXIud29yZGNoYXJzID0gbGV4ZXIud29yZGNoYXJzLmRlY29kZSgnaXNvLTg4NTktMScpCgogICAgICAgIHRva2VucyA9IGxpc3QobGV4ZXIpCiAgICAgICAgZm9yIHRva2VuIGluIHRva2VuczoKICAgICAgICAgICAgIyBBdCB0aGlzIHBvaW50LCBhbGwgc2hlbGwtbGlrZSBwYXJzaW5nIGhhcyBiZWVuIGRvbmUgKGkuZS4KICAgICAgICAgICAgIyBjb21tZW50cyBwcm9jZXNzZWQsIHF1b3RlcyBhbmQgYmFja3NsYXNoIGVzY2FwZSBzZXF1ZW5jZXMKICAgICAgICAgICAgIyBwcm9jZXNzZWQsIG11bHRpLWxpbmUgdmFsdWVzIGFzc2VtYmxlZCwgdHJhaWxpbmcgbmV3bGluZXMKICAgICAgICAgICAgIyBzdHJpcHBlZCwgZXRjLiksIHNvIHRoZSB0b2tlbnMgYXJlIG5vdyBlaXRoZXI6CiAgICAgICAgICAgICMgKiB2YXJpYWJsZSBhc3NpZ25tZW50czogdmFyPXZhbHVlCiAgICAgICAgICAgICMgKiBjb21tYW5kcyBvciB0aGVpciBhcmd1bWVudHMgKG5vdCBhbGxvd2VkIGluIG9zLXJlbGVhc2UpCiAgICAgICAgICAgIGlmICc9JyBpbiB0b2tlbjoKICAgICAgICAgICAgICAgIGssIHYgPSB0b2tlbi5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsIGJ5dGVzKToKICAgICAgICAgICAgICAgICAgICB2ID0gdi5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHByb3BzW2subG93ZXIoKV0gPSB2CiAgICAgICAgICAgICAgICBpZiBrID09ICdWRVJTSU9OJzoKICAgICAgICAgICAgICAgICAgICAjIHRoaXMgaGFuZGxlcyBjYXNlcyBpbiB3aGljaCB0aGUgY29kZW5hbWUgaXMgaW4KICAgICAgICAgICAgICAgICAgICAjIHRoZSBgKENPREVOQU1FKWAgKHJoZWwsIGNlbnRvcywgZmVkb3JhKSBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAjIG9yIGluIHRoZSBgLCBDT0RFTkFNRWAgZm9ybWF0IChVYnVudHUpLgogICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lID0gcmUuc2VhcmNoKHInKFwoXEQrXCkpfCwoXHMrKT9cRCsnLCB2KQogICAgICAgICAgICAgICAgICAgIGlmIGNvZGVuYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSA9IGNvZGVuYW1lLmdyb3VwKCkKICAgICAgICAgICAgICAgICAgICAgICAgY29kZW5hbWUgPSBjb2RlbmFtZS5zdHJpcCgnKCknKQogICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSA9IGNvZGVuYW1lLnN0cmlwKCcsJykKICAgICAgICAgICAgICAgICAgICAgICAgY29kZW5hbWUgPSBjb2RlbmFtZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29kZW5hbWUgYXBwZWFycyB3aXRoaW4gcGFyYW50aGVzZS4KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbJ2NvZGVuYW1lJ10gPSBjb2RlbmFtZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzWydjb2RlbmFtZSddID0gJycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgSWdub3JlIGFueSB0b2tlbnMgdGhhdCBhcmUgbm90IHZhcmlhYmxlIGFzc2lnbm1lbnRzCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHByb3BzCgogICAgZGVmIF9nZXRfbHNiX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGl0ZW1zIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0LgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgY21kID0gJ2xzYl9yZWxlYXNlIC1hJwogICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKAogICAgICAgICAgICBjbWQsCiAgICAgICAgICAgIHNoZWxsPVRydWUsCiAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCiAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHN0ZG91dC5kZWNvZGUoJ3V0Zi04JyksIHN0ZGVyci5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBjb2RlID0gcHJvY2Vzcy5yZXR1cm5jb2RlCiAgICAgICAgaWYgY29kZSA9PSAwOgogICAgICAgICAgICBjb250ZW50ID0gc3Rkb3V0LnNwbGl0bGluZXMoKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfbHNiX3JlbGVhc2VfY29udGVudChjb250ZW50KQogICAgICAgIGVsaWYgY29kZSA9PSAxMjc6ICAjIENvbW1hbmQgbm90IGZvdW5kCiAgICAgICAgICAgIHJldHVybiB7fQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID49ICgzLCA1KToKICAgICAgICAgICAgICAgIHJhaXNlIHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKGNvZGUsIGNtZCwgc3Rkb3V0LCBzdGRlcnIpCiAgICAgICAgICAgIGVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPj0gKDIsIDcpOgogICAgICAgICAgICAgICAgcmFpc2Ugc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoY29kZSwgY21kLCBzdGRvdXQpCiAgICAgICAgICAgIGVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDIsIDYpOgogICAgICAgICAgICAgICAgcmFpc2Ugc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoY29kZSwgY21kKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcGFyc2VfbHNiX3JlbGVhc2VfY29udGVudChsaW5lcyk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgdGhlIG91dHB1dCBvZiB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZC4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBsaW5lczogSXRlcmFibGUgdGhyb3VnaCB0aGUgbGluZXMgb2YgdGhlIGxzYl9yZWxlYXNlIG91dHB1dC4KICAgICAgICAgICAgICAgICBFYWNoIGxpbmUgbXVzdCBiZSBhIHVuaWNvZGUgc3RyaW5nIG9yIGEgVVRGLTggZW5jb2RlZCBieXRlCiAgICAgICAgICAgICAgICAgc3RyaW5nLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgcHJvcHMgPSB7fQogICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZShsaW5lLCBieXRlcykgZWxzZSBsaW5lCiAgICAgICAgICAgIGt2ID0gbGluZS5zdHJpcCgnXG4nKS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgIGlmIGxlbihrdikgIT0gMjoKICAgICAgICAgICAgICAgICMgSWdub3JlIGxpbmVzIHdpdGhvdXQgY29sb24uCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBrLCB2ID0ga3YKICAgICAgICAgICAgcHJvcHMudXBkYXRlKHtrLnJlcGxhY2UoJyAnLCAnXycpLmxvd2VyKCk6IHYuc3RyaXAoKX0pCiAgICAgICAgcmV0dXJuIHByb3BzCgogICAgZGVmIF9nZXRfZGlzdHJvX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlOgogICAgICAgICAgICAjIElmIGl0IHdhcyBzcGVjaWZpZWQsIHdlIHVzZSBpdCBhbmQgcGFyc2Ugd2hhdCB3ZSBjYW4sIGV2ZW4gaWYKICAgICAgICAgICAgIyBpdHMgZmlsZSBuYW1lIG9yIGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHBhdHRlcm4uCiAgICAgICAgICAgIGRpc3Ryb19pbmZvID0gc2VsZi5fcGFyc2VfZGlzdHJvX3JlbGVhc2VfZmlsZSgKICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSkKICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSkKICAgICAgICAgICAgIyBUaGUgZmlsZSBuYW1lIHBhdHRlcm4gZm9yIHVzZXItc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGVzCiAgICAgICAgICAgICMgaXMgc29tZXdoYXQgbW9yZSB0b2xlcmFudCAoY29tcGFyZWQgdG8gd2hlbiBzZWFyY2hpbmcgZm9yIHRoZQogICAgICAgICAgICAjIGZpbGUpLCBiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIHdoYXQgd2FzIHNwZWNpZmllZCBhcyBiZXN0IGFzCiAgICAgICAgICAgICMgcG9zc2libGUuCiAgICAgICAgICAgIG1hdGNoID0gX0RJU1RST19SRUxFQVNFX0JBU0VOQU1FX1BBVFRFUk4ubWF0Y2goYmFzZW5hbWUpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgZGlzdHJvX2luZm9bJ2lkJ10gPSBtYXRjaC5ncm91cCgxKQogICAgICAgICAgICByZXR1cm4gZGlzdHJvX2luZm8KICAgICAgICBlbHNlOgogICAgICAgICAgICBiYXNlbmFtZXMgPSBvcy5saXN0ZGlyKF9VTklYQ09ORkRJUikKICAgICAgICAgICAgIyBXZSBzb3J0IGZvciByZXBlYXRhYmlsaXR5IGluIGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZQogICAgICAgICAgICAjIGRpc3RybyBzcGVjaWZpYyBmaWxlczsgZS5nLiBDZW50T1MsIE9yYWNsZSwgRW50ZXJwcmlzZSBhbGwKICAgICAgICAgICAgIyBjb250YWluaW5nIGByZWRoYXQtcmVsZWFzZWAgb24gdG9wIG9mIHRoZWlyIG93bi4KICAgICAgICAgICAgYmFzZW5hbWVzLnNvcnQoKQogICAgICAgICAgICBmb3IgYmFzZW5hbWUgaW4gYmFzZW5hbWVzOgogICAgICAgICAgICAgICAgaWYgYmFzZW5hbWUgaW4gX0RJU1RST19SRUxFQVNFX0lHTk9SRV9CQVNFTkFNRVM6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIG1hdGNoID0gX0RJU1RST19SRUxFQVNFX0JBU0VOQU1FX1BBVFRFUk4ubWF0Y2goYmFzZW5hbWUpCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihfVU5JWENPTkZESVIsIGJhc2VuYW1lKQogICAgICAgICAgICAgICAgICAgIGRpc3Ryb19pbmZvID0gc2VsZi5fcGFyc2VfZGlzdHJvX3JlbGVhc2VfZmlsZShmaWxlcGF0aCkKICAgICAgICAgICAgICAgICAgICBpZiAnbmFtZScgaW4gZGlzdHJvX2luZm86CiAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgaXMgYWx3YXlzIHByZXNlbnQgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGUgPSBmaWxlcGF0aAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0cm9faW5mb1snaWQnXSA9IG1hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0cm9faW5mbwogICAgICAgICAgICByZXR1cm4ge30KCiAgICBkZWYgX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2ZpbGUoc2VsZiwgZmlsZXBhdGgpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIGEgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBmaWxlcGF0aDogUGF0aCBuYW1lIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZXBhdGgpOgogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZXBhdGgpIGFzIGZwOgogICAgICAgICAgICAgICAgIyBPbmx5IHBhcnNlIHRoZSBmaXJzdCBsaW5lLiBGb3IgaW5zdGFuY2UsIG9uIFNMRVMgdGhlcmUKICAgICAgICAgICAgICAgICMgYXJlIG11bHRpcGxlIGxpbmVzLiBXZSBkb24ndCB3YW50IHRoZW0uLi4KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9jb250ZW50KGZwLnJlYWRsaW5lKCkpCiAgICAgICAgcmV0dXJuIHt9CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9wYXJzZV9kaXN0cm9fcmVsZWFzZV9jb250ZW50KGxpbmUpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIGEgbGluZSBmcm9tIGEgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgUGFyYW1ldGVyczoKICAgICAgICAqIGxpbmU6IExpbmUgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4gTXVzdCBiZSBhIHVuaWNvZGUgc3RyaW5nCiAgICAgICAgICAgICAgICBvciBhIFVURi04IGVuY29kZWQgYnl0ZSBzdHJpbmcuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGxpbmUsIGJ5dGVzKToKICAgICAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgbWF0Y2hlcyA9IF9ESVNUUk9fUkVMRUFTRV9DT05URU5UX1JFVkVSU0VEX1BBVFRFUk4ubWF0Y2goCiAgICAgICAgICAgIGxpbmUuc3RyaXAoKVs6Oi0xXSkKICAgICAgICBkaXN0cm9faW5mbyA9IHt9CiAgICAgICAgaWYgbWF0Y2hlczoKICAgICAgICAgICAgIyByZWdleHAgZW5zdXJlcyBub24tTm9uZQogICAgICAgICAgICBkaXN0cm9faW5mb1snbmFtZSddID0gbWF0Y2hlcy5ncm91cCgzKVs6Oi0xXQogICAgICAgICAgICBpZiBtYXRjaGVzLmdyb3VwKDIpOgogICAgICAgICAgICAgICAgZGlzdHJvX2luZm9bJ3ZlcnNpb25faWQnXSA9IG1hdGNoZXMuZ3JvdXAoMilbOjotMV0KICAgICAgICAgICAgaWYgbWF0Y2hlcy5ncm91cCgxKToKICAgICAgICAgICAgICAgIGRpc3Ryb19pbmZvWydjb2RlbmFtZSddID0gbWF0Y2hlcy5ncm91cCgxKVs6Oi0xXQogICAgICAgIGVsaWYgbGluZToKICAgICAgICAgICAgZGlzdHJvX2luZm9bJ25hbWUnXSA9IGxpbmUuc3RyaXAoKQogICAgICAgIHJldHVybiBkaXN0cm9faW5mbwoKCl9kaXN0cm8gPSBMaW51eERpc3RyaWJ1dGlvbigpCgoKZGVmIG1haW4oKToKICAgIGltcG9ydCBhcmdwYXJzZQoKICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCiAgICBsb2dnZXIuYWRkSGFuZGxlcihsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc3lzLnN0ZG91dCkpCgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IkxpbnV4IGRpc3RybyBpbmZvIHRvb2wiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAnLS1qc29uJywKICAgICAgICAnLWonLAogICAgICAgIGhlbHA9Ik91dHB1dCBpbiBtYWNoaW5lIHJlYWRhYmxlIGZvcm1hdCIsCiAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIikKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCgogICAgaWYgYXJncy5qc29uOgogICAgICAgIGxvZ2dlci5pbmZvKGpzb24uZHVtcHMoaW5mbygpLCBpbmRlbnQ9NCwgc29ydF9rZXlzPVRydWUpKQogICAgZWxzZToKICAgICAgICBsb2dnZXIuaW5mbygnTmFtZTogJXMnLCBuYW1lKHByZXR0eT1UcnVlKSkKICAgICAgICBkaXN0cmlidXRpb25fdmVyc2lvbiA9IHZlcnNpb24ocHJldHR5PVRydWUpCiAgICAgICAgaWYgZGlzdHJpYnV0aW9uX3ZlcnNpb246CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdWZXJzaW9uOiAlcycsIGRpc3RyaWJ1dGlvbl92ZXJzaW9uKQogICAgICAgIGRpc3RyaWJ1dGlvbl9jb2RlbmFtZSA9IGNvZGVuYW1lKCkKICAgICAgICBpZiBkaXN0cmlidXRpb25fY29kZW5hbWU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDb2RlbmFtZTogJXMnLCBkaXN0cmlidXRpb25fY29kZW5hbWUpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhAKKbmZwMAwAADAMAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19faW5pdF9fLnB5IiIiCkhUTUwgcGFyc2luZyBsaWJyYXJ5IGJhc2VkIG9uIHRoZSBXSEFUV0cgIkhUTUw1IgpzcGVjaWZpY2F0aW9uLiBUaGUgcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZwpIVE1MIGZvdW5kIGluIHRoZSB3aWxkIGFuZCBpbXBsZW1lbnRzIHdlbGwtZGVmaW5lZCBlcnJvciByZWNvdmVyeSB0aGF0CmlzIGxhcmdlbHkgY29tcGF0aWJsZSB3aXRoIG1vZGVybiBkZXNrdG9wIHdlYiBicm93c2Vycy4KCkV4YW1wbGUgdXNhZ2U6CgppbXBvcnQgaHRtbDVsaWIKZiA9IG9wZW4oIm15X2RvY3VtZW50Lmh0bWwiKQp0cmVlID0gaHRtbDVsaWIucGFyc2UoZikKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLmh0bWw1cGFyc2VyIGltcG9ydCBIVE1MUGFyc2VyLCBwYXJzZSwgcGFyc2VGcmFnbWVudApmcm9tIC50cmVlYnVpbGRlcnMgaW1wb3J0IGdldFRyZWVCdWlsZGVyCmZyb20gLnRyZWV3YWxrZXJzIGltcG9ydCBnZXRUcmVlV2Fsa2VyCmZyb20gLnNlcmlhbGl6ZXIgaW1wb3J0IHNlcmlhbGl6ZQoKX19hbGxfXyA9IFsiSFRNTFBhcnNlciIsICJwYXJzZSIsICJwYXJzZUZyYWdtZW50IiwgImdldFRyZWVCdWlsZGVyIiwKICAgICAgICAgICAiZ2V0VHJlZVdhbGtlciIsICJzZXJpYWxpemUiXQoKIyB0aGlzIGhhcyB0byBiZSBhdCB0aGUgdG9wIGxldmVsLCBzZWUgaG93IHNldHVwLnB5IHBhcnNlcyB0aGlzCl9fdmVyc2lvbl9fID0gIjEuMGIxMCIKUEsDBBQAAAAAAAAAIQDVeA7iQUEAAEFBAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9faWhhdGV4bWwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCByZQppbXBvcnQgd2FybmluZ3MKCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgRGF0YUxvc3NXYXJuaW5nCgpiYXNlQ2hhciA9ICIiIgpbI3gwMDQxLSN4MDA1QV0gfCBbI3gwMDYxLSN4MDA3QV0gfCBbI3gwMEMwLSN4MDBENl0gfCBbI3gwMEQ4LSN4MDBGNl0gfApbI3gwMEY4LSN4MDBGRl0gfCBbI3gwMTAwLSN4MDEzMV0gfCBbI3gwMTM0LSN4MDEzRV0gfCBbI3gwMTQxLSN4MDE0OF0gfApbI3gwMTRBLSN4MDE3RV0gfCBbI3gwMTgwLSN4MDFDM10gfCBbI3gwMUNELSN4MDFGMF0gfCBbI3gwMUY0LSN4MDFGNV0gfApbI3gwMUZBLSN4MDIxN10gfCBbI3gwMjUwLSN4MDJBOF0gfCBbI3gwMkJCLSN4MDJDMV0gfCAjeDAzODYgfApbI3gwMzg4LSN4MDM4QV0gfCAjeDAzOEMgfCBbI3gwMzhFLSN4MDNBMV0gfCBbI3gwM0EzLSN4MDNDRV0gfApbI3gwM0QwLSN4MDNENl0gfCAjeDAzREEgfCAjeDAzREMgfCAjeDAzREUgfCAjeDAzRTAgfCBbI3gwM0UyLSN4MDNGM10gfApbI3gwNDAxLSN4MDQwQ10gfCBbI3gwNDBFLSN4MDQ0Rl0gfCBbI3gwNDUxLSN4MDQ1Q10gfCBbI3gwNDVFLSN4MDQ4MV0gfApbI3gwNDkwLSN4MDRDNF0gfCBbI3gwNEM3LSN4MDRDOF0gfCBbI3gwNENCLSN4MDRDQ10gfCBbI3gwNEQwLSN4MDRFQl0gfApbI3gwNEVFLSN4MDRGNV0gfCBbI3gwNEY4LSN4MDRGOV0gfCBbI3gwNTMxLSN4MDU1Nl0gfCAjeDA1NTkgfApbI3gwNTYxLSN4MDU4Nl0gfCBbI3gwNUQwLSN4MDVFQV0gfCBbI3gwNUYwLSN4MDVGMl0gfCBbI3gwNjIxLSN4MDYzQV0gfApbI3gwNjQxLSN4MDY0QV0gfCBbI3gwNjcxLSN4MDZCN10gfCBbI3gwNkJBLSN4MDZCRV0gfCBbI3gwNkMwLSN4MDZDRV0gfApbI3gwNkQwLSN4MDZEM10gfCAjeDA2RDUgfCBbI3gwNkU1LSN4MDZFNl0gfCBbI3gwOTA1LSN4MDkzOV0gfCAjeDA5M0QgfApbI3gwOTU4LSN4MDk2MV0gfCBbI3gwOTg1LSN4MDk4Q10gfCBbI3gwOThGLSN4MDk5MF0gfCBbI3gwOTkzLSN4MDlBOF0gfApbI3gwOUFBLSN4MDlCMF0gfCAjeDA5QjIgfCBbI3gwOUI2LSN4MDlCOV0gfCBbI3gwOURDLSN4MDlERF0gfApbI3gwOURGLSN4MDlFMV0gfCBbI3gwOUYwLSN4MDlGMV0gfCBbI3gwQTA1LSN4MEEwQV0gfCBbI3gwQTBGLSN4MEExMF0gfApbI3gwQTEzLSN4MEEyOF0gfCBbI3gwQTJBLSN4MEEzMF0gfCBbI3gwQTMyLSN4MEEzM10gfCBbI3gwQTM1LSN4MEEzNl0gfApbI3gwQTM4LSN4MEEzOV0gfCBbI3gwQTU5LSN4MEE1Q10gfCAjeDBBNUUgfCBbI3gwQTcyLSN4MEE3NF0gfApbI3gwQTg1LSN4MEE4Ql0gfCAjeDBBOEQgfCBbI3gwQThGLSN4MEE5MV0gfCBbI3gwQTkzLSN4MEFBOF0gfApbI3gwQUFBLSN4MEFCMF0gfCBbI3gwQUIyLSN4MEFCM10gfCBbI3gwQUI1LSN4MEFCOV0gfCAjeDBBQkQgfCAjeDBBRTAgfApbI3gwQjA1LSN4MEIwQ10gfCBbI3gwQjBGLSN4MEIxMF0gfCBbI3gwQjEzLSN4MEIyOF0gfCBbI3gwQjJBLSN4MEIzMF0gfApbI3gwQjMyLSN4MEIzM10gfCBbI3gwQjM2LSN4MEIzOV0gfCAjeDBCM0QgfCBbI3gwQjVDLSN4MEI1RF0gfApbI3gwQjVGLSN4MEI2MV0gfCBbI3gwQjg1LSN4MEI4QV0gfCBbI3gwQjhFLSN4MEI5MF0gfCBbI3gwQjkyLSN4MEI5NV0gfApbI3gwQjk5LSN4MEI5QV0gfCAjeDBCOUMgfCBbI3gwQjlFLSN4MEI5Rl0gfCBbI3gwQkEzLSN4MEJBNF0gfApbI3gwQkE4LSN4MEJBQV0gfCBbI3gwQkFFLSN4MEJCNV0gfCBbI3gwQkI3LSN4MEJCOV0gfCBbI3gwQzA1LSN4MEMwQ10gfApbI3gwQzBFLSN4MEMxMF0gfCBbI3gwQzEyLSN4MEMyOF0gfCBbI3gwQzJBLSN4MEMzM10gfCBbI3gwQzM1LSN4MEMzOV0gfApbI3gwQzYwLSN4MEM2MV0gfCBbI3gwQzg1LSN4MEM4Q10gfCBbI3gwQzhFLSN4MEM5MF0gfCBbI3gwQzkyLSN4MENBOF0gfApbI3gwQ0FBLSN4MENCM10gfCBbI3gwQ0I1LSN4MENCOV0gfCAjeDBDREUgfCBbI3gwQ0UwLSN4MENFMV0gfApbI3gwRDA1LSN4MEQwQ10gfCBbI3gwRDBFLSN4MEQxMF0gfCBbI3gwRDEyLSN4MEQyOF0gfCBbI3gwRDJBLSN4MEQzOV0gfApbI3gwRDYwLSN4MEQ2MV0gfCBbI3gwRTAxLSN4MEUyRV0gfCAjeDBFMzAgfCBbI3gwRTMyLSN4MEUzM10gfApbI3gwRTQwLSN4MEU0NV0gfCBbI3gwRTgxLSN4MEU4Ml0gfCAjeDBFODQgfCBbI3gwRTg3LSN4MEU4OF0gfCAjeDBFOEEgfAojeDBFOEQgfCBbI3gwRTk0LSN4MEU5N10gfCBbI3gwRTk5LSN4MEU5Rl0gfCBbI3gwRUExLSN4MEVBM10gfCAjeDBFQTUgfAojeDBFQTcgfCBbI3gwRUFBLSN4MEVBQl0gfCBbI3gwRUFELSN4MEVBRV0gfCAjeDBFQjAgfCBbI3gwRUIyLSN4MEVCM10gfAojeDBFQkQgfCBbI3gwRUMwLSN4MEVDNF0gfCBbI3gwRjQwLSN4MEY0N10gfCBbI3gwRjQ5LSN4MEY2OV0gfApbI3gxMEEwLSN4MTBDNV0gfCBbI3gxMEQwLSN4MTBGNl0gfCAjeDExMDAgfCBbI3gxMTAyLSN4MTEwM10gfApbI3gxMTA1LSN4MTEwN10gfCAjeDExMDkgfCBbI3gxMTBCLSN4MTEwQ10gfCBbI3gxMTBFLSN4MTExMl0gfCAjeDExM0MgfAojeDExM0UgfCAjeDExNDAgfCAjeDExNEMgfCAjeDExNEUgfCAjeDExNTAgfCBbI3gxMTU0LSN4MTE1NV0gfCAjeDExNTkgfApbI3gxMTVGLSN4MTE2MV0gfCAjeDExNjMgfCAjeDExNjUgfCAjeDExNjcgfCAjeDExNjkgfCBbI3gxMTZELSN4MTE2RV0gfApbI3gxMTcyLSN4MTE3M10gfCAjeDExNzUgfCAjeDExOUUgfCAjeDExQTggfCAjeDExQUIgfCBbI3gxMUFFLSN4MTFBRl0gfApbI3gxMUI3LSN4MTFCOF0gfCAjeDExQkEgfCBbI3gxMUJDLSN4MTFDMl0gfCAjeDExRUIgfCAjeDExRjAgfCAjeDExRjkgfApbI3gxRTAwLSN4MUU5Ql0gfCBbI3gxRUEwLSN4MUVGOV0gfCBbI3gxRjAwLSN4MUYxNV0gfCBbI3gxRjE4LSN4MUYxRF0gfApbI3gxRjIwLSN4MUY0NV0gfCBbI3gxRjQ4LSN4MUY0RF0gfCBbI3gxRjUwLSN4MUY1N10gfCAjeDFGNTkgfCAjeDFGNUIgfAojeDFGNUQgfCBbI3gxRjVGLSN4MUY3RF0gfCBbI3gxRjgwLSN4MUZCNF0gfCBbI3gxRkI2LSN4MUZCQ10gfCAjeDFGQkUgfApbI3gxRkMyLSN4MUZDNF0gfCBbI3gxRkM2LSN4MUZDQ10gfCBbI3gxRkQwLSN4MUZEM10gfCBbI3gxRkQ2LSN4MUZEQl0gfApbI3gxRkUwLSN4MUZFQ10gfCBbI3gxRkYyLSN4MUZGNF0gfCBbI3gxRkY2LSN4MUZGQ10gfCAjeDIxMjYgfApbI3gyMTJBLSN4MjEyQl0gfCAjeDIxMkUgfCBbI3gyMTgwLSN4MjE4Ml0gfCBbI3gzMDQxLSN4MzA5NF0gfApbI3gzMEExLSN4MzBGQV0gfCBbI3gzMTA1LSN4MzEyQ10gfCBbI3hBQzAwLSN4RDdBM10iIiIKCmlkZW9ncmFwaGljID0gIiIiWyN4NEUwMC0jeDlGQTVdIHwgI3gzMDA3IHwgWyN4MzAyMS0jeDMwMjldIiIiCgpjb21iaW5pbmdDaGFyYWN0ZXIgPSAiIiIKWyN4MDMwMC0jeDAzNDVdIHwgWyN4MDM2MC0jeDAzNjFdIHwgWyN4MDQ4My0jeDA0ODZdIHwgWyN4MDU5MS0jeDA1QTFdIHwKWyN4MDVBMy0jeDA1QjldIHwgWyN4MDVCQi0jeDA1QkRdIHwgI3gwNUJGIHwgWyN4MDVDMS0jeDA1QzJdIHwgI3gwNUM0IHwKWyN4MDY0Qi0jeDA2NTJdIHwgI3gwNjcwIHwgWyN4MDZENi0jeDA2RENdIHwgWyN4MDZERC0jeDA2REZdIHwKWyN4MDZFMC0jeDA2RTRdIHwgWyN4MDZFNy0jeDA2RThdIHwgWyN4MDZFQS0jeDA2RURdIHwgWyN4MDkwMS0jeDA5MDNdIHwKI3gwOTNDIHwgWyN4MDkzRS0jeDA5NENdIHwgI3gwOTREIHwgWyN4MDk1MS0jeDA5NTRdIHwgWyN4MDk2Mi0jeDA5NjNdIHwKWyN4MDk4MS0jeDA5ODNdIHwgI3gwOUJDIHwgI3gwOUJFIHwgI3gwOUJGIHwgWyN4MDlDMC0jeDA5QzRdIHwKWyN4MDlDNy0jeDA5QzhdIHwgWyN4MDlDQi0jeDA5Q0RdIHwgI3gwOUQ3IHwgWyN4MDlFMi0jeDA5RTNdIHwgI3gwQTAyIHwKI3gwQTNDIHwgI3gwQTNFIHwgI3gwQTNGIHwgWyN4MEE0MC0jeDBBNDJdIHwgWyN4MEE0Ny0jeDBBNDhdIHwKWyN4MEE0Qi0jeDBBNERdIHwgWyN4MEE3MC0jeDBBNzFdIHwgWyN4MEE4MS0jeDBBODNdIHwgI3gwQUJDIHwKWyN4MEFCRS0jeDBBQzVdIHwgWyN4MEFDNy0jeDBBQzldIHwgWyN4MEFDQi0jeDBBQ0RdIHwgWyN4MEIwMS0jeDBCMDNdIHwKI3gwQjNDIHwgWyN4MEIzRS0jeDBCNDNdIHwgWyN4MEI0Ny0jeDBCNDhdIHwgWyN4MEI0Qi0jeDBCNERdIHwKWyN4MEI1Ni0jeDBCNTddIHwgWyN4MEI4Mi0jeDBCODNdIHwgWyN4MEJCRS0jeDBCQzJdIHwgWyN4MEJDNi0jeDBCQzhdIHwKWyN4MEJDQS0jeDBCQ0RdIHwgI3gwQkQ3IHwgWyN4MEMwMS0jeDBDMDNdIHwgWyN4MEMzRS0jeDBDNDRdIHwKWyN4MEM0Ni0jeDBDNDhdIHwgWyN4MEM0QS0jeDBDNERdIHwgWyN4MEM1NS0jeDBDNTZdIHwgWyN4MEM4Mi0jeDBDODNdIHwKWyN4MENCRS0jeDBDQzRdIHwgWyN4MENDNi0jeDBDQzhdIHwgWyN4MENDQS0jeDBDQ0RdIHwgWyN4MENENS0jeDBDRDZdIHwKWyN4MEQwMi0jeDBEMDNdIHwgWyN4MEQzRS0jeDBENDNdIHwgWyN4MEQ0Ni0jeDBENDhdIHwgWyN4MEQ0QS0jeDBENERdIHwKI3gwRDU3IHwgI3gwRTMxIHwgWyN4MEUzNC0jeDBFM0FdIHwgWyN4MEU0Ny0jeDBFNEVdIHwgI3gwRUIxIHwKWyN4MEVCNC0jeDBFQjldIHwgWyN4MEVCQi0jeDBFQkNdIHwgWyN4MEVDOC0jeDBFQ0RdIHwgWyN4MEYxOC0jeDBGMTldIHwKI3gwRjM1IHwgI3gwRjM3IHwgI3gwRjM5IHwgI3gwRjNFIHwgI3gwRjNGIHwgWyN4MEY3MS0jeDBGODRdIHwKWyN4MEY4Ni0jeDBGOEJdIHwgWyN4MEY5MC0jeDBGOTVdIHwgI3gwRjk3IHwgWyN4MEY5OS0jeDBGQURdIHwKWyN4MEZCMS0jeDBGQjddIHwgI3gwRkI5IHwgWyN4MjBEMC0jeDIwRENdIHwgI3gyMEUxIHwgWyN4MzAyQS0jeDMwMkZdIHwKI3gzMDk5IHwgI3gzMDlBIiIiCgpkaWdpdCA9ICIiIgpbI3gwMDMwLSN4MDAzOV0gfCBbI3gwNjYwLSN4MDY2OV0gfCBbI3gwNkYwLSN4MDZGOV0gfCBbI3gwOTY2LSN4MDk2Rl0gfApbI3gwOUU2LSN4MDlFRl0gfCBbI3gwQTY2LSN4MEE2Rl0gfCBbI3gwQUU2LSN4MEFFRl0gfCBbI3gwQjY2LSN4MEI2Rl0gfApbI3gwQkU3LSN4MEJFRl0gfCBbI3gwQzY2LSN4MEM2Rl0gfCBbI3gwQ0U2LSN4MENFRl0gfCBbI3gwRDY2LSN4MEQ2Rl0gfApbI3gwRTUwLSN4MEU1OV0gfCBbI3gwRUQwLSN4MEVEOV0gfCBbI3gwRjIwLSN4MEYyOV0iIiIKCmV4dGVuZGVyID0gIiIiCiN4MDBCNyB8ICN4MDJEMCB8ICN4MDJEMSB8ICN4MDM4NyB8ICN4MDY0MCB8ICN4MEU0NiB8ICN4MEVDNiB8ICN4MzAwNSB8CiNbI3gzMDMxLSN4MzAzNV0gfCBbI3gzMDlELSN4MzA5RV0gfCBbI3gzMEZDLSN4MzBGRV0iIiIKCmxldHRlciA9ICIgfCAiLmpvaW4oW2Jhc2VDaGFyLCBpZGVvZ3JhcGhpY10pCgojIFdpdGhvdXQgdGhlCm5hbWUgPSAiIHwgIi5qb2luKFtsZXR0ZXIsIGRpZ2l0LCAiLiIsICItIiwgIl8iLCBjb21iaW5pbmdDaGFyYWN0ZXIsCiAgICAgICAgICAgICAgICAgICBleHRlbmRlcl0pCm5hbWVGaXJzdCA9ICIgfCAiLmpvaW4oW2xldHRlciwgIl8iXSkKCnJlQ2hhciA9IHJlLmNvbXBpbGUociIjeChbXGR8QS1GXXs0LDR9KSIpCnJlQ2hhclJhbmdlID0gcmUuY29tcGlsZShyIlxbI3goW1xkfEEtRl17NCw0fSktI3goW1xkfEEtRl17NCw0fSlcXSIpCgoKZGVmIGNoYXJTdHJpbmdUb0xpc3QoY2hhcnMpOgogICAgY2hhclJhbmdlcyA9IFtpdGVtLnN0cmlwKCkgZm9yIGl0ZW0gaW4gY2hhcnMuc3BsaXQoIiB8ICIpXQogICAgcnYgPSBbXQogICAgZm9yIGl0ZW0gaW4gY2hhclJhbmdlczoKICAgICAgICBmb3VuZE1hdGNoID0gRmFsc2UKICAgICAgICBmb3IgcmVnZXhwIGluIChyZUNoYXIsIHJlQ2hhclJhbmdlKToKICAgICAgICAgICAgbWF0Y2ggPSByZWdleHAubWF0Y2goaXRlbSkKICAgICAgICAgICAgaWYgbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoW2hleFRvSW50KGl0ZW0pIGZvciBpdGVtIGluIG1hdGNoLmdyb3VwcygpXSkKICAgICAgICAgICAgICAgIGlmIGxlbihydlstMV0pID09IDE6CiAgICAgICAgICAgICAgICAgICAgcnZbLTFdID0gcnZbLTFdICogMgogICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgbm90IGZvdW5kTWF0Y2g6CiAgICAgICAgICAgIGFzc2VydCBsZW4oaXRlbSkgPT0gMQoKICAgICAgICAgICAgcnYuYXBwZW5kKFtvcmQoaXRlbSldICogMikKICAgIHJ2ID0gbm9ybWFsaXNlQ2hhckxpc3QocnYpCiAgICByZXR1cm4gcnYKCgpkZWYgbm9ybWFsaXNlQ2hhckxpc3QoY2hhckxpc3QpOgogICAgY2hhckxpc3QgPSBzb3J0ZWQoY2hhckxpc3QpCiAgICBmb3IgaXRlbSBpbiBjaGFyTGlzdDoKICAgICAgICBhc3NlcnQgaXRlbVsxXSA+PSBpdGVtWzBdCiAgICBydiA9IFtdCiAgICBpID0gMAogICAgd2hpbGUgaSA8IGxlbihjaGFyTGlzdCk6CiAgICAgICAgaiA9IDEKICAgICAgICBydi5hcHBlbmQoY2hhckxpc3RbaV0pCiAgICAgICAgd2hpbGUgaSArIGogPCBsZW4oY2hhckxpc3QpIGFuZCBjaGFyTGlzdFtpICsgal1bMF0gPD0gcnZbLTFdWzFdICsgMToKICAgICAgICAgICAgcnZbLTFdWzFdID0gY2hhckxpc3RbaSArIGpdWzFdCiAgICAgICAgICAgIGogKz0gMQogICAgICAgIGkgKz0gagogICAgcmV0dXJuIHJ2CgojIFdlIGRvbid0IHJlYWxseSBzdXBwb3J0IGNoYXJhY3RlcnMgYWJvdmUgdGhlIEJNUCA6KAptYXhfdW5pY29kZSA9IGludCgiRkZGRiIsIDE2KQoKCmRlZiBtaXNzaW5nUmFuZ2VzKGNoYXJMaXN0KToKICAgIHJ2ID0gW10KICAgIGlmIGNoYXJMaXN0WzBdICE9IDA6CiAgICAgICAgcnYuYXBwZW5kKFswLCBjaGFyTGlzdFswXVswXSAtIDFdKQogICAgZm9yIGksIGl0ZW0gaW4gZW51bWVyYXRlKGNoYXJMaXN0WzotMV0pOgogICAgICAgIHJ2LmFwcGVuZChbaXRlbVsxXSArIDEsIGNoYXJMaXN0W2kgKyAxXVswXSAtIDFdKQogICAgaWYgY2hhckxpc3RbLTFdWzFdICE9IG1heF91bmljb2RlOgogICAgICAgIHJ2LmFwcGVuZChbY2hhckxpc3RbLTFdWzFdICsgMSwgbWF4X3VuaWNvZGVdKQogICAgcmV0dXJuIHJ2CgoKZGVmIGxpc3RUb1JlZ2V4cFN0cihjaGFyTGlzdCk6CiAgICBydiA9IFtdCiAgICBmb3IgaXRlbSBpbiBjaGFyTGlzdDoKICAgICAgICBpZiBpdGVtWzBdID09IGl0ZW1bMV06CiAgICAgICAgICAgIHJ2LmFwcGVuZChlc2NhcGVSZWdleHAoY2hyKGl0ZW1bMF0pKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBydi5hcHBlbmQoZXNjYXBlUmVnZXhwKGNocihpdGVtWzBdKSkgKyAiLSIgKwogICAgICAgICAgICAgICAgICAgICAgZXNjYXBlUmVnZXhwKGNocihpdGVtWzFdKSkpCiAgICByZXR1cm4gIlslc10iICUgIiIuam9pbihydikKCgpkZWYgaGV4VG9JbnQoaGV4X3N0cik6CiAgICByZXR1cm4gaW50KGhleF9zdHIsIDE2KQoKCmRlZiBlc2NhcGVSZWdleHAoc3RyaW5nKToKICAgIHNwZWNpYWxDaGFyYWN0ZXJzID0gKCIuIiwgIl4iLCAiJCIsICIqIiwgIisiLCAiPyIsICJ7IiwgIn0iLAogICAgICAgICAgICAgICAgICAgICAgICAgIlsiLCAiXSIsICJ8IiwgIigiLCAiKSIsICItIikKICAgIGZvciBjaGFyIGluIHNwZWNpYWxDaGFyYWN0ZXJzOgogICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGNoYXIsICJcXCIgKyBjaGFyKQoKICAgIHJldHVybiBzdHJpbmcKCiMgb3V0cHV0IGZyb20gdGhlIGFib3ZlCm5vblhtbE5hbWVCTVBSZWdleHAgPSByZS5jb21waWxlKCdbXHgwMC0sLzotQFxcWy1cXF5gXFx7LVx4YjZceGI4LVx4YmZceGQ3XHhmN1x1MDEzMi1cdTAxMzNcdTAxM2YtXHUwMTQwXHUwMTQ5XHUwMTdmXHUwMWM0LVx1MDFjY1x1MDFmMS1cdTAxZjNcdTAxZjYtXHUwMWY5XHUwMjE4LVx1MDI0Zlx1MDJhOS1cdTAyYmFcdTAyYzItXHUwMmNmXHUwMmQyLVx1MDJmZlx1MDM0Ni1cdTAzNWZcdTAzNjItXHUwMzg1XHUwMzhiXHUwMzhkXHUwM2EyXHUwM2NmXHUwM2Q3LVx1MDNkOVx1MDNkYlx1MDNkZFx1MDNkZlx1MDNlMVx1MDNmNC1cdTA0MDBcdTA0MGRcdTA0NTBcdTA0NWRcdTA0ODJcdTA0ODctXHUwNDhmXHUwNGM1LVx1MDRjNlx1MDRjOS1cdTA0Y2FcdTA0Y2QtXHUwNGNmXHUwNGVjLVx1MDRlZFx1MDRmNi1cdTA0ZjdcdTA0ZmEtXHUwNTMwXHUwNTU3LVx1MDU1OFx1MDU1YS1cdTA1NjBcdTA1ODctXHUwNTkwXHUwNWEyXHUwNWJhXHUwNWJlXHUwNWMwXHUwNWMzXHUwNWM1LVx1MDVjZlx1MDVlYi1cdTA1ZWZcdTA1ZjMtXHUwNjIwXHUwNjNiLVx1MDYzZlx1MDY1My1cdTA2NWZcdTA2NmEtXHUwNjZmXHUwNmI4LVx1MDZiOVx1MDZiZlx1MDZjZlx1MDZkNFx1MDZlOVx1MDZlZS1cdTA2ZWZcdTA2ZmEtXHUwOTAwXHUwOTA0XHUwOTNhLVx1MDkzYlx1MDk0ZS1cdTA5NTBcdTA5NTUtXHUwOTU3XHUwOTY0LVx1MDk2NVx1MDk3MC1cdTA5ODBcdTA5ODRcdTA5OGQtXHUwOThlXHUwOTkxLVx1MDk5Mlx1MDlhOVx1MDliMVx1MDliMy1cdTA5YjVcdTA5YmEtXHUwOWJiXHUwOWJkXHUwOWM1LVx1MDljNlx1MDljOS1cdTA5Y2FcdTA5Y2UtXHUwOWQ2XHUwOWQ4LVx1MDlkYlx1MDlkZVx1MDllNC1cdTA5ZTVcdTA5ZjItXHUwYTAxXHUwYTAzLVx1MGEwNFx1MGEwYi1cdTBhMGVcdTBhMTEtXHUwYTEyXHUwYTI5XHUwYTMxXHUwYTM0XHUwYTM3XHUwYTNhLVx1MGEzYlx1MGEzZFx1MGE0My1cdTBhNDZcdTBhNDktXHUwYTRhXHUwYTRlLVx1MGE1OFx1MGE1ZFx1MGE1Zi1cdTBhNjVcdTBhNzUtXHUwYTgwXHUwYTg0XHUwYThjXHUwYThlXHUwYTkyXHUwYWE5XHUwYWIxXHUwYWI0XHUwYWJhLVx1MGFiYlx1MGFjNlx1MGFjYVx1MGFjZS1cdTBhZGZcdTBhZTEtXHUwYWU1XHUwYWYwLVx1MGIwMFx1MGIwNFx1MGIwZC1cdTBiMGVcdTBiMTEtXHUwYjEyXHUwYjI5XHUwYjMxXHUwYjM0LVx1MGIzNVx1MGIzYS1cdTBiM2JcdTBiNDQtXHUwYjQ2XHUwYjQ5LVx1MGI0YVx1MGI0ZS1cdTBiNTVcdTBiNTgtXHUwYjViXHUwYjVlXHUwYjYyLVx1MGI2NVx1MGI3MC1cdTBiODFcdTBiODRcdTBiOGItXHUwYjhkXHUwYjkxXHUwYjk2LVx1MGI5OFx1MGI5Ylx1MGI5ZFx1MGJhMC1cdTBiYTJcdTBiYTUtXHUwYmE3XHUwYmFiLVx1MGJhZFx1MGJiNlx1MGJiYS1cdTBiYmRcdTBiYzMtXHUwYmM1XHUwYmM5XHUwYmNlLVx1MGJkNlx1MGJkOC1cdTBiZTZcdTBiZjAtXHUwYzAwXHUwYzA0XHUwYzBkXHUwYzExXHUwYzI5XHUwYzM0XHUwYzNhLVx1MGMzZFx1MGM0NVx1MGM0OVx1MGM0ZS1cdTBjNTRcdTBjNTctXHUwYzVmXHUwYzYyLVx1MGM2NVx1MGM3MC1cdTBjODFcdTBjODRcdTBjOGRcdTBjOTFcdTBjYTlcdTBjYjRcdTBjYmEtXHUwY2JkXHUwY2M1XHUwY2M5XHUwY2NlLVx1MGNkNFx1MGNkNy1cdTBjZGRcdTBjZGZcdTBjZTItXHUwY2U1XHUwY2YwLVx1MGQwMVx1MGQwNFx1MGQwZFx1MGQxMVx1MGQyOVx1MGQzYS1cdTBkM2RcdTBkNDQtXHUwZDQ1XHUwZDQ5XHUwZDRlLVx1MGQ1Nlx1MGQ1OC1cdTBkNWZcdTBkNjItXHUwZDY1XHUwZDcwLVx1MGUwMFx1MGUyZlx1MGUzYi1cdTBlM2ZcdTBlNGZcdTBlNWEtXHUwZTgwXHUwZTgzXHUwZTg1LVx1MGU4Nlx1MGU4OVx1MGU4Yi1cdTBlOGNcdTBlOGUtXHUwZTkzXHUwZTk4XHUwZWEwXHUwZWE0XHUwZWE2XHUwZWE4LVx1MGVhOVx1MGVhY1x1MGVhZlx1MGViYVx1MGViZS1cdTBlYmZcdTBlYzVcdTBlYzdcdTBlY2UtXHUwZWNmXHUwZWRhLVx1MGYxN1x1MGYxYS1cdTBmMWZcdTBmMmEtXHUwZjM0XHUwZjM2XHUwZjM4XHUwZjNhLVx1MGYzZFx1MGY0OFx1MGY2YS1cdTBmNzBcdTBmODVcdTBmOGMtXHUwZjhmXHUwZjk2XHUwZjk4XHUwZmFlLVx1MGZiMFx1MGZiOFx1MGZiYS1cdTEwOWZcdTEwYzYtXHUxMGNmXHUxMGY3LVx1MTBmZlx1MTEwMVx1MTEwNFx1MTEwOFx1MTEwYVx1MTEwZFx1MTExMy1cdTExM2JcdTExM2RcdTExM2ZcdTExNDEtXHUxMTRiXHUxMTRkXHUxMTRmXHUxMTUxLVx1MTE1M1x1MTE1Ni1cdTExNThcdTExNWEtXHUxMTVlXHUxMTYyXHUxMTY0XHUxMTY2XHUxMTY4XHUxMTZhLVx1MTE2Y1x1MTE2Zi1cdTExNzFcdTExNzRcdTExNzYtXHUxMTlkXHUxMTlmLVx1MTFhN1x1MTFhOS1cdTExYWFcdTExYWMtXHUxMWFkXHUxMWIwLVx1MTFiNlx1MTFiOVx1MTFiYlx1MTFjMy1cdTExZWFcdTExZWMtXHUxMWVmXHUxMWYxLVx1MTFmOFx1MTFmYS1cdTFkZmZcdTFlOWMtXHUxZTlmXHUxZWZhLVx1MWVmZlx1MWYxNi1cdTFmMTdcdTFmMWUtXHUxZjFmXHUxZjQ2LVx1MWY0N1x1MWY0ZS1cdTFmNGZcdTFmNThcdTFmNWFcdTFmNWNcdTFmNWVcdTFmN2UtXHUxZjdmXHUxZmI1XHUxZmJkXHUxZmJmLVx1MWZjMVx1MWZjNVx1MWZjZC1cdTFmY2ZcdTFmZDQtXHUxZmQ1XHUxZmRjLVx1MWZkZlx1MWZlZC1cdTFmZjFcdTFmZjVcdTFmZmQtXHUyMGNmXHUyMGRkLVx1MjBlMFx1MjBlMi1cdTIxMjVcdTIxMjctXHUyMTI5XHUyMTJjLVx1MjEyZFx1MjEyZi1cdTIxN2ZcdTIxODMtXHUzMDA0XHUzMDA2XHUzMDA4LVx1MzAyMFx1MzAzMFx1MzAzNi1cdTMwNDBcdTMwOTUtXHUzMDk4XHUzMDliLVx1MzA5Y1x1MzA5Zi1cdTMwYTBcdTMwZmJcdTMwZmYtXHUzMTA0XHUzMTJkLVx1NGRmZlx1OWZhNi1cdWFiZmZcdWQ3YTQtXHVmZmZmXScpICAjIG5vcWEKCm5vblhtbE5hbWVGaXJzdEJNUFJlZ2V4cCA9IHJlLmNvbXBpbGUoJ1tceDAwLUBcXFstXFxeYFxcey1ceGJmXHhkN1x4ZjdcdTAxMzItXHUwMTMzXHUwMTNmLVx1MDE0MFx1MDE0OVx1MDE3Zlx1MDFjNC1cdTAxY2NcdTAxZjEtXHUwMWYzXHUwMWY2LVx1MDFmOVx1MDIxOC1cdTAyNGZcdTAyYTktXHUwMmJhXHUwMmMyLVx1MDM4NVx1MDM4N1x1MDM4Ylx1MDM4ZFx1MDNhMlx1MDNjZlx1MDNkNy1cdTAzZDlcdTAzZGJcdTAzZGRcdTAzZGZcdTAzZTFcdTAzZjQtXHUwNDAwXHUwNDBkXHUwNDUwXHUwNDVkXHUwNDgyLVx1MDQ4Zlx1MDRjNS1cdTA0YzZcdTA0YzktXHUwNGNhXHUwNGNkLVx1MDRjZlx1MDRlYy1cdTA0ZWRcdTA0ZjYtXHUwNGY3XHUwNGZhLVx1MDUzMFx1MDU1Ny1cdTA1NThcdTA1NWEtXHUwNTYwXHUwNTg3LVx1MDVjZlx1MDVlYi1cdTA1ZWZcdTA1ZjMtXHUwNjIwXHUwNjNiLVx1MDY0MFx1MDY0Yi1cdTA2NzBcdTA2YjgtXHUwNmI5XHUwNmJmXHUwNmNmXHUwNmQ0XHUwNmQ2LVx1MDZlNFx1MDZlNy1cdTA5MDRcdTA5M2EtXHUwOTNjXHUwOTNlLVx1MDk1N1x1MDk2Mi1cdTA5ODRcdTA5OGQtXHUwOThlXHUwOTkxLVx1MDk5Mlx1MDlhOVx1MDliMVx1MDliMy1cdTA5YjVcdTA5YmEtXHUwOWRiXHUwOWRlXHUwOWUyLVx1MDllZlx1MDlmMi1cdTBhMDRcdTBhMGItXHUwYTBlXHUwYTExLVx1MGExMlx1MGEyOVx1MGEzMVx1MGEzNFx1MGEzN1x1MGEzYS1cdTBhNThcdTBhNWRcdTBhNWYtXHUwYTcxXHUwYTc1LVx1MGE4NFx1MGE4Y1x1MGE4ZVx1MGE5Mlx1MGFhOVx1MGFiMVx1MGFiNFx1MGFiYS1cdTBhYmNcdTBhYmUtXHUwYWRmXHUwYWUxLVx1MGIwNFx1MGIwZC1cdTBiMGVcdTBiMTEtXHUwYjEyXHUwYjI5XHUwYjMxXHUwYjM0LVx1MGIzNVx1MGIzYS1cdTBiM2NcdTBiM2UtXHUwYjViXHUwYjVlXHUwYjYyLVx1MGI4NFx1MGI4Yi1cdTBiOGRcdTBiOTFcdTBiOTYtXHUwYjk4XHUwYjliXHUwYjlkXHUwYmEwLVx1MGJhMlx1MGJhNS1cdTBiYTdcdTBiYWItXHUwYmFkXHUwYmI2XHUwYmJhLVx1MGMwNFx1MGMwZFx1MGMxMVx1MGMyOVx1MGMzNFx1MGMzYS1cdTBjNWZcdTBjNjItXHUwYzg0XHUwYzhkXHUwYzkxXHUwY2E5XHUwY2I0XHUwY2JhLVx1MGNkZFx1MGNkZlx1MGNlMi1cdTBkMDRcdTBkMGRcdTBkMTFcdTBkMjlcdTBkM2EtXHUwZDVmXHUwZDYyLVx1MGUwMFx1MGUyZlx1MGUzMVx1MGUzNC1cdTBlM2ZcdTBlNDYtXHUwZTgwXHUwZTgzXHUwZTg1LVx1MGU4Nlx1MGU4OVx1MGU4Yi1cdTBlOGNcdTBlOGUtXHUwZTkzXHUwZTk4XHUwZWEwXHUwZWE0XHUwZWE2XHUwZWE4LVx1MGVhOVx1MGVhY1x1MGVhZlx1MGViMVx1MGViNC1cdTBlYmNcdTBlYmUtXHUwZWJmXHUwZWM1LVx1MGYzZlx1MGY0OFx1MGY2YS1cdTEwOWZcdTEwYzYtXHUxMGNmXHUxMGY3LVx1MTBmZlx1MTEwMVx1MTEwNFx1MTEwOFx1MTEwYVx1MTEwZFx1MTExMy1cdTExM2JcdTExM2RcdTExM2ZcdTExNDEtXHUxMTRiXHUxMTRkXHUxMTRmXHUxMTUxLVx1MTE1M1x1MTE1Ni1cdTExNThcdTExNWEtXHUxMTVlXHUxMTYyXHUxMTY0XHUxMTY2XHUxMTY4XHUxMTZhLVx1MTE2Y1x1MTE2Zi1cdTExNzFcdTExNzRcdTExNzYtXHUxMTlkXHUxMTlmLVx1MTFhN1x1MTFhOS1cdTExYWFcdTExYWMtXHUxMWFkXHUxMWIwLVx1MTFiNlx1MTFiOVx1MTFiYlx1MTFjMy1cdTExZWFcdTExZWMtXHUxMWVmXHUxMWYxLVx1MTFmOFx1MTFmYS1cdTFkZmZcdTFlOWMtXHUxZTlmXHUxZWZhLVx1MWVmZlx1MWYxNi1cdTFmMTdcdTFmMWUtXHUxZjFmXHUxZjQ2LVx1MWY0N1x1MWY0ZS1cdTFmNGZcdTFmNThcdTFmNWFcdTFmNWNcdTFmNWVcdTFmN2UtXHUxZjdmXHUxZmI1XHUxZmJkXHUxZmJmLVx1MWZjMVx1MWZjNVx1MWZjZC1cdTFmY2ZcdTFmZDQtXHUxZmQ1XHUxZmRjLVx1MWZkZlx1MWZlZC1cdTFmZjFcdTFmZjVcdTFmZmQtXHUyMTI1XHUyMTI3LVx1MjEyOVx1MjEyYy1cdTIxMmRcdTIxMmYtXHUyMTdmXHUyMTgzLVx1MzAwNlx1MzAwOC1cdTMwMjBcdTMwMmEtXHUzMDQwXHUzMDk1LVx1MzBhMFx1MzBmYi1cdTMxMDRcdTMxMmQtXHU0ZGZmXHU5ZmE2LVx1YWJmZlx1ZDdhNC1cdWZmZmZdJykgICMgbm9xYQoKIyBTaW1wbGVyIHRoaW5ncwpub25QdWJpZENoYXJSZWdleHAgPSByZS5jb21waWxlKCJbXlx4MjBceDBEXHgwQWEtekEtWjAtOVwtXCcoKSssLi86PT87ISojQCRfJV0iKQoKCmNsYXNzIEluZm9zZXRGaWx0ZXIob2JqZWN0KToKICAgIHJlcGxhY2VtZW50UmVnZXhwID0gcmUuY29tcGlsZShyIlVbXGRBLUZdezUsNX0iKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIGRyb3BYbWxuc0xvY2FsTmFtZT1GYWxzZSwKICAgICAgICAgICAgICAgICBkcm9wWG1sbnNBdHRyTnM9RmFsc2UsCiAgICAgICAgICAgICAgICAgcHJldmVudERvdWJsZURhc2hDb21tZW50cz1GYWxzZSwKICAgICAgICAgICAgICAgICBwcmV2ZW50RGFzaEF0Q29tbWVudEVuZD1GYWxzZSwKICAgICAgICAgICAgICAgICByZXBsYWNlRm9ybUZlZWRDaGFyYWN0ZXJzPVRydWUsCiAgICAgICAgICAgICAgICAgcHJldmVudFNpbmdsZVF1b3RlUHViaWQ9RmFsc2UpOgoKICAgICAgICBzZWxmLmRyb3BYbWxuc0xvY2FsTmFtZSA9IGRyb3BYbWxuc0xvY2FsTmFtZQogICAgICAgIHNlbGYuZHJvcFhtbG5zQXR0ck5zID0gZHJvcFhtbG5zQXR0ck5zCgogICAgICAgIHNlbGYucHJldmVudERvdWJsZURhc2hDb21tZW50cyA9IHByZXZlbnREb3VibGVEYXNoQ29tbWVudHMKICAgICAgICBzZWxmLnByZXZlbnREYXNoQXRDb21tZW50RW5kID0gcHJldmVudERhc2hBdENvbW1lbnRFbmQKCiAgICAgICAgc2VsZi5yZXBsYWNlRm9ybUZlZWRDaGFyYWN0ZXJzID0gcmVwbGFjZUZvcm1GZWVkQ2hhcmFjdGVycwoKICAgICAgICBzZWxmLnByZXZlbnRTaW5nbGVRdW90ZVB1YmlkID0gcHJldmVudFNpbmdsZVF1b3RlUHViaWQKCiAgICAgICAgc2VsZi5yZXBsYWNlQ2FjaGUgPSB7fQoKICAgIGRlZiBjb2VyY2VBdHRyaWJ1dGUoc2VsZiwgbmFtZSwgbmFtZXNwYWNlPU5vbmUpOgogICAgICAgIGlmIHNlbGYuZHJvcFhtbG5zTG9jYWxOYW1lIGFuZCBuYW1lLnN0YXJ0c3dpdGgoInhtbG5zOiIpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJBdHRyaWJ1dGVzIGNhbm5vdCBiZWdpbiB3aXRoIHhtbG5zIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGVsaWYgKHNlbGYuZHJvcFhtbG5zQXR0ck5zIGFuZAogICAgICAgICAgICAgIG5hbWVzcGFjZSA9PSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQXR0cmlidXRlcyBjYW5ub3QgYmUgaW4gdGhlIHhtbCBuYW1lc3BhY2UiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9YbWxOYW1lKG5hbWUpCgogICAgZGVmIGNvZXJjZUVsZW1lbnQoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYudG9YbWxOYW1lKG5hbWUpCgogICAgZGVmIGNvZXJjZUNvbW1lbnQoc2VsZiwgZGF0YSk6CiAgICAgICAgaWYgc2VsZi5wcmV2ZW50RG91YmxlRGFzaENvbW1lbnRzOgogICAgICAgICAgICB3aGlsZSAiLS0iIGluIGRhdGE6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb21tZW50cyBjYW5ub3QgY29udGFpbiBhZGphY2VudCBkYXNoZXMiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCItLSIsICItIC0iKQogICAgICAgICAgICBpZiBkYXRhLmVuZHN3aXRoKCItIik6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb21tZW50cyBjYW5ub3QgZW5kIGluIGEgZGFzaCIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgICAgIGRhdGEgKz0gIiAiCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgY29lcmNlQ2hhcmFjdGVycyhzZWxmLCBkYXRhKToKICAgICAgICBpZiBzZWxmLnJlcGxhY2VGb3JtRmVlZENoYXJhY3RlcnM6CiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKGRhdGEuY291bnQoIlx4MEMiKSk6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJUZXh0IGNhbm5vdCBjb250YWluIFUrMDAwQyIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHgwQyIsICIgIikKICAgICAgICAjIE90aGVyIG5vbi14bWwgY2hhcmFjdGVycwogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIGNvZXJjZVB1YmlkKHNlbGYsIGRhdGEpOgogICAgICAgIGRhdGFPdXRwdXQgPSBkYXRhCiAgICAgICAgZm9yIGNoYXIgaW4gbm9uUHViaWRDaGFyUmVnZXhwLmZpbmRhbGwoZGF0YSk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvZXJjaW5nIG5vbi1YTUwgcHViaWQiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5nZXRSZXBsYWNlbWVudENoYXJhY3RlcihjaGFyKQogICAgICAgICAgICBkYXRhT3V0cHV0ID0gZGF0YU91dHB1dC5yZXBsYWNlKGNoYXIsIHJlcGxhY2VtZW50KQogICAgICAgIGlmIHNlbGYucHJldmVudFNpbmdsZVF1b3RlUHViaWQgYW5kIGRhdGFPdXRwdXQuZmluZCgiJyIpID49IDA6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlB1YmlkIGNhbm5vdCBjb250YWluIHNpbmdsZSBxdW90ZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgZGF0YU91dHB1dCA9IGRhdGFPdXRwdXQucmVwbGFjZSgiJyIsIHNlbGYuZ2V0UmVwbGFjZW1lbnRDaGFyYWN0ZXIoIiciKSkKICAgICAgICByZXR1cm4gZGF0YU91dHB1dAoKICAgIGRlZiB0b1htbE5hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgbmFtZUZpcnN0ID0gbmFtZVswXQogICAgICAgIG5hbWVSZXN0ID0gbmFtZVsxOl0KICAgICAgICBtID0gbm9uWG1sTmFtZUZpcnN0Qk1QUmVnZXhwLm1hdGNoKG5hbWVGaXJzdCkKICAgICAgICBpZiBtOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb2VyY2luZyBub24tWE1MIG5hbWUiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIG5hbWVGaXJzdE91dHB1dCA9IHNlbGYuZ2V0UmVwbGFjZW1lbnRDaGFyYWN0ZXIobmFtZUZpcnN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWVGaXJzdE91dHB1dCA9IG5hbWVGaXJzdAoKICAgICAgICBuYW1lUmVzdE91dHB1dCA9IG5hbWVSZXN0CiAgICAgICAgcmVwbGFjZUNoYXJzID0gc2V0KG5vblhtbE5hbWVCTVBSZWdleHAuZmluZGFsbChuYW1lUmVzdCkpCiAgICAgICAgZm9yIGNoYXIgaW4gcmVwbGFjZUNoYXJzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb2VyY2luZyBub24tWE1MIG5hbWUiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5nZXRSZXBsYWNlbWVudENoYXJhY3RlcihjaGFyKQogICAgICAgICAgICBuYW1lUmVzdE91dHB1dCA9IG5hbWVSZXN0T3V0cHV0LnJlcGxhY2UoY2hhciwgcmVwbGFjZW1lbnQpCiAgICAgICAgcmV0dXJuIG5hbWVGaXJzdE91dHB1dCArIG5hbWVSZXN0T3V0cHV0CgogICAgZGVmIGdldFJlcGxhY2VtZW50Q2hhcmFjdGVyKHNlbGYsIGNoYXIpOgogICAgICAgIGlmIGNoYXIgaW4gc2VsZi5yZXBsYWNlQ2FjaGU6CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5yZXBsYWNlQ2FjaGVbY2hhcl0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXBsYWNlbWVudCA9IHNlbGYuZXNjYXBlQ2hhcihjaGFyKQogICAgICAgIHJldHVybiByZXBsYWNlbWVudAoKICAgIGRlZiBmcm9tWG1sTmFtZShzZWxmLCBuYW1lKToKICAgICAgICBmb3IgaXRlbSBpbiBzZXQoc2VsZi5yZXBsYWNlbWVudFJlZ2V4cC5maW5kYWxsKG5hbWUpKToKICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShpdGVtLCBzZWxmLnVuZXNjYXBlQ2hhcihpdGVtKSkKICAgICAgICByZXR1cm4gbmFtZQoKICAgIGRlZiBlc2NhcGVDaGFyKHNlbGYsIGNoYXIpOgogICAgICAgIHJlcGxhY2VtZW50ID0gIlUlMDVYIiAlIG9yZChjaGFyKQogICAgICAgIHNlbGYucmVwbGFjZUNhY2hlW2NoYXJdID0gcmVwbGFjZW1lbnQKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQKCiAgICBkZWYgdW5lc2NhcGVDaGFyKHNlbGYsIGNoYXJjb2RlKToKICAgICAgICByZXR1cm4gY2hyKGludChjaGFyY29kZVsxOl0sIDE2KSkKUEsDBBQAAAAAAAAAIQAeDG01FH8AABR/AABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9faW5wdXRzdHJlYW0ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUsIGJpbmFyeV90eXBlCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudCwgdXJsbGliCgppbXBvcnQgY29kZWNzCmltcG9ydCByZQoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgd2ViZW5jb2RpbmdzCgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IEVPRiwgc3BhY2VDaGFyYWN0ZXJzLCBhc2NpaUxldHRlcnMsIGFzY2lpVXBwZXJjYXNlCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgUmVwYXJzZUV4Y2VwdGlvbgpmcm9tIC4gaW1wb3J0IF91dGlscwoKZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KCnRyeToKICAgIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KZXhjZXB0IEltcG9ydEVycm9yOgogICAgQnl0ZXNJTyA9IFN0cmluZ0lPCgojIE5vbi11bmljb2RlIHZlcnNpb25zIG9mIGNvbnN0YW50cyBmb3IgdXNlIGluIHRoZSBwcmUtcGFyc2VyCnNwYWNlQ2hhcmFjdGVyc0J5dGVzID0gZnJvemVuc2V0KFtpdGVtLmVuY29kZSgiYXNjaWkiKSBmb3IgaXRlbSBpbiBzcGFjZUNoYXJhY3RlcnNdKQphc2NpaUxldHRlcnNCeXRlcyA9IGZyb3plbnNldChbaXRlbS5lbmNvZGUoImFzY2lpIikgZm9yIGl0ZW0gaW4gYXNjaWlMZXR0ZXJzXSkKYXNjaWlVcHBlcmNhc2VCeXRlcyA9IGZyb3plbnNldChbaXRlbS5lbmNvZGUoImFzY2lpIikgZm9yIGl0ZW0gaW4gYXNjaWlVcHBlcmNhc2VdKQpzcGFjZXNBbmdsZUJyYWNrZXRzID0gc3BhY2VDaGFyYWN0ZXJzQnl0ZXMgfCBmcm96ZW5zZXQoW2IiPiIsIGIiPCJdKQoKCmludmFsaWRfdW5pY29kZV9ub19zdXJyb2dhdGUgPSAiW1x1MDAwMS1cdTAwMDhcdTAwMEJcdTAwMEUtXHUwMDFGXHUwMDdGLVx1MDA5Rlx1RkREMC1cdUZERUZcdUZGRkVcdUZGRkZcVTAwMDFGRkZFXFUwMDAxRkZGRlxVMDAwMkZGRkVcVTAwMDJGRkZGXFUwMDAzRkZGRVxVMDAwM0ZGRkZcVTAwMDRGRkZFXFUwMDA0RkZGRlxVMDAwNUZGRkVcVTAwMDVGRkZGXFUwMDA2RkZGRVxVMDAwNkZGRkZcVTAwMDdGRkZFXFUwMDA3RkZGRlxVMDAwOEZGRkVcVTAwMDhGRkZGXFUwMDA5RkZGRVxVMDAwOUZGRkZcVTAwMEFGRkZFXFUwMDBBRkZGRlxVMDAwQkZGRkVcVTAwMEJGRkZGXFUwMDBDRkZGRVxVMDAwQ0ZGRkZcVTAwMERGRkZFXFUwMDBERkZGRlxVMDAwRUZGRkVcVTAwMEVGRkZGXFUwMDBGRkZGRVxVMDAwRkZGRkZcVTAwMTBGRkZFXFUwMDEwRkZGRl0iICAjIG5vcWEKCmlmIF91dGlscy5zdXBwb3J0c19sb25lX3N1cnJvZ2F0ZXM6CiAgICAjIFVzZSBvbmUgZXh0cmEgc3RlcCBvZiBpbmRpcmVjdGlvbiBhbmQgY3JlYXRlIHN1cnJvZ2F0ZXMgd2l0aAogICAgIyBldmFsLiBOb3QgdXNpbmcgdGhpcyBpbmRpcmVjdGlvbiB3b3VsZCBpbnRyb2R1Y2UgYW4gaWxsZWdhbAogICAgIyB1bmljb2RlIGxpdGVyYWwgb24gcGxhdGZvcm1zIG5vdCBzdXBwb3J0aW5nIHN1Y2ggbG9uZQogICAgIyBzdXJyb2dhdGVzLgogICAgYXNzZXJ0IGludmFsaWRfdW5pY29kZV9ub19zdXJyb2dhdGVbLTFdID09ICJdIiBhbmQgaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZS5jb3VudCgiXSIpID09IDEKICAgIGludmFsaWRfdW5pY29kZV9yZSA9IHJlLmNvbXBpbGUoaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZVs6LTFdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbCgnIlxcdUQ4MDAtXFx1REZGRiInKSArICAjIHB5bGludDpkaXNhYmxlPWV2YWwtdXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSIpCmVsc2U6CiAgICBpbnZhbGlkX3VuaWNvZGVfcmUgPSByZS5jb21waWxlKGludmFsaWRfdW5pY29kZV9ub19zdXJyb2dhdGUpCgpub25fYm1wX2ludmFsaWRfY29kZXBvaW50cyA9IHNldChbMHgxRkZGRSwgMHgxRkZGRiwgMHgyRkZGRSwgMHgyRkZGRiwgMHgzRkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGRkYsIDB4NEZGRkUsIDB4NEZGRkYsIDB4NUZGRkUsIDB4NUZGRkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZGRkZFLCAweDZGRkZGLCAweDdGRkZFLCAweDdGRkZGLCAweDhGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RkZGRiwgMHg5RkZGRSwgMHg5RkZGRiwgMHhBRkZGRSwgMHhBRkZGRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkUsIDB4QkZGRkYsIDB4Q0ZGRkUsIDB4Q0ZGRkYsIDB4REZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGLCAweEVGRkZFLCAweEVGRkZGLCAweEZGRkZFLCAweEZGRkZGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEZGRkUsIDB4MTBGRkZGXSkKCmFzY2lpX3B1bmN0dWF0aW9uX3JlID0gcmUuY29tcGlsZSgiW1x1MDAwOS1cdTAwMERcdTAwMjAtXHUwMDJGXHUwMDNBLVx1MDA0MFx1MDA1Qi1cdTAwNjBcdTAwN0ItXHUwMDdFXSIpCgojIENhY2hlIGZvciBjaGFyc1VudGlsKCkKY2hhcnNVbnRpbFJlZ0V4ID0ge30KCgpjbGFzcyBCdWZmZXJlZFN0cmVhbShvYmplY3QpOgogICAgIiIiQnVmZmVyaW5nIGZvciBzdHJlYW1zIHRoYXQgZG8gbm90IGhhdmUgYnVmZmVyaW5nIG9mIHRoZWlyIG93bgoKICAgIFRoZSBidWZmZXIgaXMgaW1wbGVtZW50ZWQgYXMgYSBsaXN0IG9mIGNodW5rcyBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CiAgICBqb2luaW5nIG1hbnkgc3RyaW5ncyB3aWxsIGJlIHNsb3cgc2luY2UgaXQgaXMgTyhuKioyKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CiAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KICAgICAgICBzZWxmLmJ1ZmZlciA9IFtdCiAgICAgICAgc2VsZi5wb3NpdGlvbiA9IFstMSwgMF0gICMgY2h1bmsgbnVtYmVyLCBvZmZzZXQKCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICBwb3MgPSAwCiAgICAgICAgZm9yIGNodW5rIGluIHNlbGYuYnVmZmVyWzpzZWxmLnBvc2l0aW9uWzBdXToKICAgICAgICAgICAgcG9zICs9IGxlbihjaHVuaykKICAgICAgICBwb3MgKz0gc2VsZi5wb3NpdGlvblsxXQogICAgICAgIHJldHVybiBwb3MKCiAgICBkZWYgc2VlayhzZWxmLCBwb3MpOgogICAgICAgIGFzc2VydCBwb3MgPD0gc2VsZi5fYnVmZmVyZWRCeXRlcygpCiAgICAgICAgb2Zmc2V0ID0gcG9zCiAgICAgICAgaSA9IDAKICAgICAgICB3aGlsZSBsZW4oc2VsZi5idWZmZXJbaV0pIDwgb2Zmc2V0OgogICAgICAgICAgICBvZmZzZXQgLT0gbGVuKHNlbGYuYnVmZmVyW2ldKQogICAgICAgICAgICBpICs9IDEKICAgICAgICBzZWxmLnBvc2l0aW9uID0gW2ksIG9mZnNldF0KCiAgICBkZWYgcmVhZChzZWxmLCBieXRlcyk6CiAgICAgICAgaWYgbm90IHNlbGYuYnVmZmVyOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZFN0cmVhbShieXRlcykKICAgICAgICBlbGlmIChzZWxmLnBvc2l0aW9uWzBdID09IGxlbihzZWxmLmJ1ZmZlcikgYW5kCiAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvblsxXSA9PSBsZW4oc2VsZi5idWZmZXJbLTFdKSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkU3RyZWFtKGJ5dGVzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkRnJvbUJ1ZmZlcihieXRlcykKCiAgICBkZWYgX2J1ZmZlcmVkQnl0ZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHN1bShbbGVuKGl0ZW0pIGZvciBpdGVtIGluIHNlbGYuYnVmZmVyXSkKCiAgICBkZWYgX3JlYWRTdHJlYW0oc2VsZiwgYnl0ZXMpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5yZWFkKGJ5dGVzKQogICAgICAgIHNlbGYuYnVmZmVyLmFwcGVuZChkYXRhKQogICAgICAgIHNlbGYucG9zaXRpb25bMF0gKz0gMQogICAgICAgIHNlbGYucG9zaXRpb25bMV0gPSBsZW4oZGF0YSkKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBfcmVhZEZyb21CdWZmZXIoc2VsZiwgYnl0ZXMpOgogICAgICAgIHJlbWFpbmluZ0J5dGVzID0gYnl0ZXMKICAgICAgICBydiA9IFtdCiAgICAgICAgYnVmZmVySW5kZXggPSBzZWxmLnBvc2l0aW9uWzBdCiAgICAgICAgYnVmZmVyT2Zmc2V0ID0gc2VsZi5wb3NpdGlvblsxXQogICAgICAgIHdoaWxlIGJ1ZmZlckluZGV4IDwgbGVuKHNlbGYuYnVmZmVyKSBhbmQgcmVtYWluaW5nQnl0ZXMgIT0gMDoKICAgICAgICAgICAgYXNzZXJ0IHJlbWFpbmluZ0J5dGVzID4gMAogICAgICAgICAgICBidWZmZXJlZERhdGEgPSBzZWxmLmJ1ZmZlcltidWZmZXJJbmRleF0KCiAgICAgICAgICAgIGlmIHJlbWFpbmluZ0J5dGVzIDw9IGxlbihidWZmZXJlZERhdGEpIC0gYnVmZmVyT2Zmc2V0OgogICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQgPSByZW1haW5pbmdCeXRlcwogICAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IFtidWZmZXJJbmRleCwgYnVmZmVyT2Zmc2V0ICsgYnl0ZXNUb1JlYWRdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCA9IGxlbihidWZmZXJlZERhdGEpIC0gYnVmZmVyT2Zmc2V0CiAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gW2J1ZmZlckluZGV4LCBsZW4oYnVmZmVyZWREYXRhKV0KICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4ICs9IDEKICAgICAgICAgICAgcnYuYXBwZW5kKGJ1ZmZlcmVkRGF0YVtidWZmZXJPZmZzZXQ6YnVmZmVyT2Zmc2V0ICsgYnl0ZXNUb1JlYWRdKQogICAgICAgICAgICByZW1haW5pbmdCeXRlcyAtPSBieXRlc1RvUmVhZAoKICAgICAgICAgICAgYnVmZmVyT2Zmc2V0ID0gMAoKICAgICAgICBpZiByZW1haW5pbmdCeXRlczoKICAgICAgICAgICAgcnYuYXBwZW5kKHNlbGYuX3JlYWRTdHJlYW0ocmVtYWluaW5nQnl0ZXMpKQoKICAgICAgICByZXR1cm4gYiIiLmpvaW4ocnYpCgoKZGVmIEhUTUxJbnB1dFN0cmVhbShzb3VyY2UsICoqa3dhcmdzKToKICAgICMgV29yayBhcm91bmQgUHl0aG9uIGJ1ZyAjMjAwMDc6IHJlYWQoMCkgY2xvc2VzIHRoZSBjb25uZWN0aW9uLgogICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjAwMDcKICAgIGlmIChpc2luc3RhbmNlKHNvdXJjZSwgaHR0cF9jbGllbnQuSFRUUFJlc3BvbnNlKSBvcgogICAgICAgICMgQWxzbyBjaGVjayBmb3IgYWRkaW5mb3VybCB3cmFwcGluZyBIVFRQUmVzcG9uc2UKICAgICAgICAoaXNpbnN0YW5jZShzb3VyY2UsIHVybGxpYi5yZXNwb25zZS5hZGRiYXNlKSBhbmQKICAgICAgICAgaXNpbnN0YW5jZShzb3VyY2UuZnAsIGh0dHBfY2xpZW50LkhUVFBSZXNwb25zZSkpKToKICAgICAgICBpc1VuaWNvZGUgPSBGYWxzZQogICAgZWxpZiBoYXNhdHRyKHNvdXJjZSwgInJlYWQiKToKICAgICAgICBpc1VuaWNvZGUgPSBpc2luc3RhbmNlKHNvdXJjZS5yZWFkKDApLCB0ZXh0X3R5cGUpCiAgICBlbHNlOgogICAgICAgIGlzVW5pY29kZSA9IGlzaW5zdGFuY2Uoc291cmNlLCB0ZXh0X3R5cGUpCgogICAgaWYgaXNVbmljb2RlOgogICAgICAgIGVuY29kaW5ncyA9IFt4IGZvciB4IGluIGt3YXJncyBpZiB4LmVuZHN3aXRoKCJfZW5jb2RpbmciKV0KICAgICAgICBpZiBlbmNvZGluZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2Fubm90IHNldCBhbiBlbmNvZGluZyB3aXRoIGEgdW5pY29kZSBpbnB1dCwgc2V0ICVyIiAlIGVuY29kaW5ncykKCiAgICAgICAgcmV0dXJuIEhUTUxVbmljb2RlSW5wdXRTdHJlYW0oc291cmNlLCAqKmt3YXJncykKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIEhUTUxCaW5hcnlJbnB1dFN0cmVhbShzb3VyY2UsICoqa3dhcmdzKQoKCmNsYXNzIEhUTUxVbmljb2RlSW5wdXRTdHJlYW0ob2JqZWN0KToKICAgICIiIlByb3ZpZGVzIGEgdW5pY29kZSBzdHJlYW0gb2YgY2hhcmFjdGVycyB0byB0aGUgSFRNTFRva2VuaXplci4KCiAgICBUaGlzIGNsYXNzIHRha2VzIGNhcmUgb2YgY2hhcmFjdGVyIGVuY29kaW5nIGFuZCByZW1vdmluZyBvciByZXBsYWNpbmcKICAgIGluY29ycmVjdCBieXRlLXNlcXVlbmNlcyBhbmQgYWxzbyBwcm92aWRlcyBjb2x1bW4gYW5kIGxpbmUgdHJhY2tpbmcuCgogICAgIiIiCgogICAgX2RlZmF1bHRDaHVua1NpemUgPSAxMDI0MAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UpOgogICAgICAgICIiIkluaXRpYWxpc2VzIHRoZSBIVE1MSW5wdXRTdHJlYW0uCgogICAgICAgIEhUTUxJbnB1dFN0cmVhbShzb3VyY2UsIFtlbmNvZGluZ10pIC0+IE5vcm1hbGl6ZWQgc3RyZWFtIGZyb20gc291cmNlCiAgICAgICAgZm9yIHVzZSBieSBodG1sNWxpYi4KCiAgICAgICAgc291cmNlIGNhbiBiZSBlaXRoZXIgYSBmaWxlLW9iamVjdCwgbG9jYWwgZmlsZW5hbWUgb3IgYSBzdHJpbmcuCgogICAgICAgIFRoZSBvcHRpb25hbCBlbmNvZGluZyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyB0aGF0IGluZGljYXRlcwogICAgICAgIHRoZSBlbmNvZGluZy4gIElmIHNwZWNpZmllZCwgdGhhdCBlbmNvZGluZyB3aWxsIGJlIHVzZWQsCiAgICAgICAgcmVnYXJkbGVzcyBvZiBhbnkgQk9NIG9yIGxhdGVyIGRlY2xhcmF0aW9uIChzdWNoIGFzIGluIGEgbWV0YQogICAgICAgIGVsZW1lbnQpCgogICAgICAgICIiIgoKICAgICAgICBpZiBub3QgX3V0aWxzLnN1cHBvcnRzX2xvbmVfc3Vycm9nYXRlczoKICAgICAgICAgICAgIyBTdWNoIHBsYXRmb3JtcyB3aWxsIGhhdmUgYWxyZWFkeSBjaGVja2VkIGZvciBzdWNoCiAgICAgICAgICAgICMgc3Vycm9nYXRlIGVycm9ycywgc28gbm8gbmVlZCB0byBkbyB0aGlzIGNoZWNraW5nLgogICAgICAgICAgICBzZWxmLnJlcG9ydENoYXJhY3RlckVycm9ycyA9IE5vbmUKICAgICAgICBlbGlmIGxlbigiXFUwMDEwRkZGRiIpID09IDE6CiAgICAgICAgICAgIHNlbGYucmVwb3J0Q2hhcmFjdGVyRXJyb3JzID0gc2VsZi5jaGFyYWN0ZXJFcnJvcnNVQ1M0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5yZXBvcnRDaGFyYWN0ZXJFcnJvcnMgPSBzZWxmLmNoYXJhY3RlckVycm9yc1VDUzIKCiAgICAgICAgIyBMaXN0IG9mIHdoZXJlIG5ldyBsaW5lcyBvY2N1cgogICAgICAgIHNlbGYubmV3TGluZXMgPSBbMF0KCiAgICAgICAgc2VsZi5jaGFyRW5jb2RpbmcgPSAobG9va3VwRW5jb2RpbmcoInV0Zi04IiksICJjZXJ0YWluIikKICAgICAgICBzZWxmLmRhdGFTdHJlYW0gPSBzZWxmLm9wZW5TdHJlYW0oc291cmNlKQoKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5jaHVuayA9ICIiCiAgICAgICAgc2VsZi5jaHVua1NpemUgPSAwCiAgICAgICAgc2VsZi5jaHVua09mZnNldCA9IDAKICAgICAgICBzZWxmLmVycm9ycyA9IFtdCgogICAgICAgICMgbnVtYmVyIG9mIChjb21wbGV0ZSkgbGluZXMgaW4gcHJldmlvdXMgY2h1bmtzCiAgICAgICAgc2VsZi5wcmV2TnVtTGluZXMgPSAwCiAgICAgICAgIyBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBwcmV2aW91cyBjaHVuawogICAgICAgIHNlbGYucHJldk51bUNvbHMgPSAwCgogICAgICAgICMgRGVhbCB3aXRoIENSIExGIGFuZCBzdXJyb2dhdGVzIHNwbGl0IG92ZXIgY2h1bmsgYm91bmRhcmllcwogICAgICAgIHNlbGYuX2J1ZmZlcmVkQ2hhcmFjdGVyID0gTm9uZQoKICAgIGRlZiBvcGVuU3RyZWFtKHNlbGYsIHNvdXJjZSk6CiAgICAgICAgIiIiUHJvZHVjZXMgYSBmaWxlIG9iamVjdCBmcm9tIHNvdXJjZS4KCiAgICAgICAgc291cmNlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9iamVjdCwgbG9jYWwgZmlsZW5hbWUgb3IgYSBzdHJpbmcuCgogICAgICAgICIiIgogICAgICAgICMgQWxyZWFkeSBhIGZpbGUgb2JqZWN0CiAgICAgICAgaWYgaGFzYXR0cihzb3VyY2UsICdyZWFkJyk6CiAgICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPKHNvdXJjZSkKCiAgICAgICAgcmV0dXJuIHN0cmVhbQoKICAgIGRlZiBfcG9zaXRpb24oc2VsZiwgb2Zmc2V0KToKICAgICAgICBjaHVuayA9IHNlbGYuY2h1bmsKICAgICAgICBuTGluZXMgPSBjaHVuay5jb3VudCgnXG4nLCAwLCBvZmZzZXQpCiAgICAgICAgcG9zaXRpb25MaW5lID0gc2VsZi5wcmV2TnVtTGluZXMgKyBuTGluZXMKICAgICAgICBsYXN0TGluZVBvcyA9IGNodW5rLnJmaW5kKCdcbicsIDAsIG9mZnNldCkKICAgICAgICBpZiBsYXN0TGluZVBvcyA9PSAtMToKICAgICAgICAgICAgcG9zaXRpb25Db2x1bW4gPSBzZWxmLnByZXZOdW1Db2xzICsgb2Zmc2V0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcG9zaXRpb25Db2x1bW4gPSBvZmZzZXQgLSAobGFzdExpbmVQb3MgKyAxKQogICAgICAgIHJldHVybiAocG9zaXRpb25MaW5lLCBwb3NpdGlvbkNvbHVtbikKCiAgICBkZWYgcG9zaXRpb24oc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyAobGluZSwgY29sKSBvZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLiIiIgogICAgICAgIGxpbmUsIGNvbCA9IHNlbGYuX3Bvc2l0aW9uKHNlbGYuY2h1bmtPZmZzZXQpCiAgICAgICAgcmV0dXJuIChsaW5lICsgMSwgY29sKQoKICAgIGRlZiBjaGFyKHNlbGYpOgogICAgICAgICIiIiBSZWFkIG9uZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3RyZWFtIG9yIHF1ZXVlIGlmIGF2YWlsYWJsZS4gUmV0dXJuCiAgICAgICAgICAgIEVPRiB3aGVuIEVPRiBpcyByZWFjaGVkLgogICAgICAgICIiIgogICAgICAgICMgUmVhZCBhIG5ldyBjaHVuayBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaWYgbmVjZXNzYXJ5CiAgICAgICAgaWYgc2VsZi5jaHVua09mZnNldCA+PSBzZWxmLmNodW5rU2l6ZToKICAgICAgICAgICAgaWYgbm90IHNlbGYucmVhZENodW5rKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gRU9GCgogICAgICAgIGNodW5rT2Zmc2V0ID0gc2VsZi5jaHVua09mZnNldAogICAgICAgIGNoYXIgPSBzZWxmLmNodW5rW2NodW5rT2Zmc2V0XQogICAgICAgIHNlbGYuY2h1bmtPZmZzZXQgPSBjaHVua09mZnNldCArIDEKCiAgICAgICAgcmV0dXJuIGNoYXIKCiAgICBkZWYgcmVhZENodW5rKHNlbGYsIGNodW5rU2l6ZT1Ob25lKToKICAgICAgICBpZiBjaHVua1NpemUgaXMgTm9uZToKICAgICAgICAgICAgY2h1bmtTaXplID0gc2VsZi5fZGVmYXVsdENodW5rU2l6ZQoKICAgICAgICBzZWxmLnByZXZOdW1MaW5lcywgc2VsZi5wcmV2TnVtQ29scyA9IHNlbGYuX3Bvc2l0aW9uKHNlbGYuY2h1bmtTaXplKQoKICAgICAgICBzZWxmLmNodW5rID0gIiIKICAgICAgICBzZWxmLmNodW5rU2l6ZSA9IDAKICAgICAgICBzZWxmLmNodW5rT2Zmc2V0ID0gMAoKICAgICAgICBkYXRhID0gc2VsZi5kYXRhU3RyZWFtLnJlYWQoY2h1bmtTaXplKQoKICAgICAgICAjIERlYWwgd2l0aCBDUiBMRiBhbmQgc3Vycm9nYXRlcyBicm9rZW4gYWNyb3NzIGNodW5rcwogICAgICAgIGlmIHNlbGYuX2J1ZmZlcmVkQ2hhcmFjdGVyOgogICAgICAgICAgICBkYXRhID0gc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXIgKyBkYXRhCiAgICAgICAgICAgIHNlbGYuX2J1ZmZlcmVkQ2hhcmFjdGVyID0gTm9uZQogICAgICAgIGVsaWYgbm90IGRhdGE6CiAgICAgICAgICAgICMgV2UgaGF2ZSBubyBtb3JlIGRhdGEsIGJ5ZS1ieWUgc3RyZWFtCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiBsZW4oZGF0YSkgPiAxOgogICAgICAgICAgICBsYXN0diA9IG9yZChkYXRhWy0xXSkKICAgICAgICAgICAgaWYgbGFzdHYgPT0gMHgwRCBvciAweEQ4MDAgPD0gbGFzdHYgPD0gMHhEQkZGOgogICAgICAgICAgICAgICAgc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXIgPSBkYXRhWy0xXQogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbOi0xXQoKICAgICAgICBpZiBzZWxmLnJlcG9ydENoYXJhY3RlckVycm9yczoKICAgICAgICAgICAgc2VsZi5yZXBvcnRDaGFyYWN0ZXJFcnJvcnMoZGF0YSkKCiAgICAgICAgIyBSZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycwogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyXG4iLCAiXG4iKQogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyIiwgIlxuIikKCiAgICAgICAgc2VsZi5jaHVuayA9IGRhdGEKICAgICAgICBzZWxmLmNodW5rU2l6ZSA9IGxlbihkYXRhKQoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjaGFyYWN0ZXJFcnJvcnNVQ1M0KHNlbGYsIGRhdGEpOgogICAgICAgIGZvciBfIGluIHJhbmdlKGxlbihpbnZhbGlkX3VuaWNvZGVfcmUuZmluZGFsbChkYXRhKSkpOgogICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoImludmFsaWQtY29kZXBvaW50IikKCiAgICBkZWYgY2hhcmFjdGVyRXJyb3JzVUNTMihzZWxmLCBkYXRhKToKICAgICAgICAjIFNvbWVvbmUgcGlja2VkIHRoZSB3cm9uZyBjb21waWxlIG9wdGlvbgogICAgICAgICMgWW91IGxvc2UKICAgICAgICBza2lwID0gRmFsc2UKICAgICAgICBmb3IgbWF0Y2ggaW4gaW52YWxpZF91bmljb2RlX3JlLmZpbmRpdGVyKGRhdGEpOgogICAgICAgICAgICBpZiBza2lwOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY29kZXBvaW50ID0gb3JkKG1hdGNoLmdyb3VwKCkpCiAgICAgICAgICAgIHBvcyA9IG1hdGNoLnN0YXJ0KCkKICAgICAgICAgICAgIyBQcmV0dHkgc3VyZSB0aGVyZSBzaG91bGQgYmUgZW5kaWFubmVzcyBpc3N1ZXMgaGVyZQogICAgICAgICAgICBpZiBfdXRpbHMuaXNTdXJyb2dhdGVQYWlyKGRhdGFbcG9zOnBvcyArIDJdKToKICAgICAgICAgICAgICAgICMgV2UgaGF2ZSBhIHN1cnJvZ2F0ZSBwYWlyIQogICAgICAgICAgICAgICAgY2hhcl92YWwgPSBfdXRpbHMuc3Vycm9nYXRlUGFpclRvQ29kZXBvaW50KGRhdGFbcG9zOnBvcyArIDJdKQogICAgICAgICAgICAgICAgaWYgY2hhcl92YWwgaW4gbm9uX2JtcF9pbnZhbGlkX2NvZGVwb2ludHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKCJpbnZhbGlkLWNvZGVwb2ludCIpCiAgICAgICAgICAgICAgICBza2lwID0gVHJ1ZQogICAgICAgICAgICBlbGlmIChjb2RlcG9pbnQgPj0gMHhEODAwIGFuZCBjb2RlcG9pbnQgPD0gMHhERkZGIGFuZAogICAgICAgICAgICAgICAgICBwb3MgPT0gbGVuKGRhdGEpIC0gMSk6CiAgICAgICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoImludmFsaWQtY29kZXBvaW50IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNraXAgPSBGYWxzZQogICAgICAgICAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKCJpbnZhbGlkLWNvZGVwb2ludCIpCgogICAgZGVmIGNoYXJzVW50aWwoc2VsZiwgY2hhcmFjdGVycywgb3Bwb3NpdGU9RmFsc2UpOgogICAgICAgICIiIiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyZWFtIHVwIHRvIGJ1dCBub3QKICAgICAgICBpbmNsdWRpbmcgYW55IGNoYXJhY3RlciBpbiAnY2hhcmFjdGVycycgb3IgRU9GLiAnY2hhcmFjdGVycycgbXVzdCBiZQogICAgICAgIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgdGhlICdpbicgbWV0aG9kIGFuZCBpdGVyYXRpb24gb3ZlciBpdHMKICAgICAgICBjaGFyYWN0ZXJzLgogICAgICAgICIiIgoKICAgICAgICAjIFVzZSBhIGNhY2hlIG9mIHJlZ2V4cHMgdG8gZmluZCB0aGUgcmVxdWlyZWQgY2hhcmFjdGVycwogICAgICAgIHRyeToKICAgICAgICAgICAgY2hhcnMgPSBjaGFyc1VudGlsUmVnRXhbKGNoYXJhY3RlcnMsIG9wcG9zaXRlKV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKICAgICAgICAgICAgICAgIGZvciBjIGluIGNoYXJhY3RlcnM6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KG9yZChjKSA8IDEyOCkKICAgICAgICAgICAgcmVnZXggPSAiIi5qb2luKFsiXFx4JTAyeCIgJSBvcmQoYykgZm9yIGMgaW4gY2hhcmFjdGVyc10pCiAgICAgICAgICAgIGlmIG5vdCBvcHBvc2l0ZToKICAgICAgICAgICAgICAgIHJlZ2V4ID0gIl4lcyIgJSByZWdleAogICAgICAgICAgICBjaGFycyA9IGNoYXJzVW50aWxSZWdFeFsoY2hhcmFjdGVycywgb3Bwb3NpdGUpXSA9IHJlLmNvbXBpbGUoIlslc10rIiAlIHJlZ2V4KQoKICAgICAgICBydiA9IFtdCgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgRmluZCB0aGUgbG9uZ2VzdCBtYXRjaGluZyBwcmVmaXgKICAgICAgICAgICAgbSA9IGNoYXJzLm1hdGNoKHNlbGYuY2h1bmssIHNlbGYuY2h1bmtPZmZzZXQpCiAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKICAgICAgICAgICAgICAgICMgSWYgbm90aGluZyBtYXRjaGVkLCBhbmQgaXQgd2Fzbid0IGJlY2F1c2Ugd2UgcmFuIG91dCBvZiBjaHVuaywKICAgICAgICAgICAgICAgICMgdGhlbiBzdG9wCiAgICAgICAgICAgICAgICBpZiBzZWxmLmNodW5rT2Zmc2V0ICE9IHNlbGYuY2h1bmtTaXplOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBlbmQgPSBtLmVuZCgpCiAgICAgICAgICAgICAgICAjIElmIG5vdCB0aGUgd2hvbGUgY2h1bmsgbWF0Y2hlZCwgcmV0dXJuIGV2ZXJ5dGhpbmcKICAgICAgICAgICAgICAgICMgdXAgdG8gdGhlIHBhcnQgdGhhdCBkaWRuJ3QgbWF0Y2gKICAgICAgICAgICAgICAgIGlmIGVuZCAhPSBzZWxmLmNodW5rU2l6ZToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoc2VsZi5jaHVua1tzZWxmLmNodW5rT2Zmc2V0OmVuZF0pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaHVua09mZnNldCA9IGVuZAogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICMgSWYgdGhlIHdob2xlIHJlbWFpbmRlciBvZiB0aGUgY2h1bmsgbWF0Y2hlZCwKICAgICAgICAgICAgIyB1c2UgaXQgYWxsIGFuZCByZWFkIHRoZSBuZXh0IGNodW5rCiAgICAgICAgICAgIHJ2LmFwcGVuZChzZWxmLmNodW5rW3NlbGYuY2h1bmtPZmZzZXQ6XSkKICAgICAgICAgICAgaWYgbm90IHNlbGYucmVhZENodW5rKCk6CiAgICAgICAgICAgICAgICAjIFJlYWNoZWQgRU9GCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICByID0gIiIuam9pbihydikKICAgICAgICByZXR1cm4gcgoKICAgIGRlZiB1bmdldChzZWxmLCBjaGFyKToKICAgICAgICAjIE9ubHkgb25lIGNoYXJhY3RlciBpcyBhbGxvd2VkIHRvIGJlIHVuZ290dGVuIGF0IG9uY2UgLSBpdCBtdXN0CiAgICAgICAgIyBiZSBjb25zdW1lZCBhZ2FpbiBiZWZvcmUgYW55IGZ1cnRoZXIgY2FsbCB0byB1bmdldAogICAgICAgIGlmIGNoYXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYuY2h1bmtPZmZzZXQgPT0gMDoKICAgICAgICAgICAgICAgICMgdW5nZXQgaXMgY2FsbGVkIHF1aXRlIHJhcmVseSwgc28gaXQncyBhIGdvb2QgaWRlYSB0byBkbwogICAgICAgICAgICAgICAgIyBtb3JlIHdvcmsgaGVyZSBpZiBpdCBzYXZlcyBhIGJpdCBvZiB3b3JrIGluIHRoZSBmcmVxdWVudGx5CiAgICAgICAgICAgICAgICAjIGNhbGxlZCBjaGFyIGFuZCBjaGFyc1VudGlsLgogICAgICAgICAgICAgICAgIyBTbywganVzdCBwcmVwZW5kIHRoZSB1bmdvdHRlbiBjaGFyYWN0ZXIgb250byB0aGUgY3VycmVudAogICAgICAgICAgICAgICAgIyBjaHVuazoKICAgICAgICAgICAgICAgIHNlbGYuY2h1bmsgPSBjaGFyICsgc2VsZi5jaHVuawogICAgICAgICAgICAgICAgc2VsZi5jaHVua1NpemUgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5jaHVua09mZnNldCAtPSAxCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5jaHVua1tzZWxmLmNodW5rT2Zmc2V0XSA9PSBjaGFyCgoKY2xhc3MgSFRNTEJpbmFyeUlucHV0U3RyZWFtKEhUTUxVbmljb2RlSW5wdXRTdHJlYW0pOgogICAgIiIiUHJvdmlkZXMgYSB1bmljb2RlIHN0cmVhbSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBIVE1MVG9rZW5pemVyLgoKICAgIFRoaXMgY2xhc3MgdGFrZXMgY2FyZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYW5kIHJlbW92aW5nIG9yIHJlcGxhY2luZwogICAgaW5jb3JyZWN0IGJ5dGUtc2VxdWVuY2VzIGFuZCBhbHNvIHByb3ZpZGVzIGNvbHVtbiBhbmQgbGluZSB0cmFja2luZy4KCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCBvdmVycmlkZV9lbmNvZGluZz1Ob25lLCB0cmFuc3BvcnRfZW5jb2Rpbmc9Tm9uZSwKICAgICAgICAgICAgICAgICBzYW1lX29yaWdpbl9wYXJlbnRfZW5jb2Rpbmc9Tm9uZSwgbGlrZWx5X2VuY29kaW5nPU5vbmUsCiAgICAgICAgICAgICAgICAgZGVmYXVsdF9lbmNvZGluZz0id2luZG93cy0xMjUyIiwgdXNlQ2hhcmRldD1UcnVlKToKICAgICAgICAiIiJJbml0aWFsaXNlcyB0aGUgSFRNTElucHV0U3RyZWFtLgoKICAgICAgICBIVE1MSW5wdXRTdHJlYW0oc291cmNlLCBbZW5jb2RpbmddKSAtPiBOb3JtYWxpemVkIHN0cmVhbSBmcm9tIHNvdXJjZQogICAgICAgIGZvciB1c2UgYnkgaHRtbDVsaWIuCgogICAgICAgIHNvdXJjZSBjYW4gYmUgZWl0aGVyIGEgZmlsZS1vYmplY3QsIGxvY2FsIGZpbGVuYW1lIG9yIGEgc3RyaW5nLgoKICAgICAgICBUaGUgb3B0aW9uYWwgZW5jb2RpbmcgcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMKICAgICAgICB0aGUgZW5jb2RpbmcuICBJZiBzcGVjaWZpZWQsIHRoYXQgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkLAogICAgICAgIHJlZ2FyZGxlc3Mgb2YgYW55IEJPTSBvciBsYXRlciBkZWNsYXJhdGlvbiAoc3VjaCBhcyBpbiBhIG1ldGEKICAgICAgICBlbGVtZW50KQoKICAgICAgICAiIiIKICAgICAgICAjIFJhdyBTdHJlYW0gLSBmb3IgdW5pY29kZSBvYmplY3RzIHRoaXMgd2lsbCBlbmNvZGUgdG8gdXRmLTggYW5kIHNldAogICAgICAgICMgICAgICAgICAgICAgIHNlbGYuY2hhckVuY29kaW5nIGFzIGFwcHJvcHJpYXRlCiAgICAgICAgc2VsZi5yYXdTdHJlYW0gPSBzZWxmLm9wZW5TdHJlYW0oc291cmNlKQoKICAgICAgICBIVE1MVW5pY29kZUlucHV0U3RyZWFtLl9faW5pdF9fKHNlbGYsIHNlbGYucmF3U3RyZWFtKQoKICAgICAgICAjIEVuY29kaW5nIEluZm9ybWF0aW9uCiAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gdXNlIHdoZW4gbG9va2luZyBmb3IgYSBtZXRhIGVsZW1lbnQgd2l0aAogICAgICAgICMgZW5jb2RpbmcgaW5mb3JtYXRpb24KICAgICAgICBzZWxmLm51bUJ5dGVzTWV0YSA9IDEwMjQKICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byB1c2Ugd2hlbiB1c2luZyBkZXRlY3RpbmcgZW5jb2RpbmcgdXNpbmcgY2hhcmRldAogICAgICAgIHNlbGYubnVtQnl0ZXNDaGFyZGV0ID0gMTAwCiAgICAgICAgIyBUaGluZ3MgZnJvbSBhcmdzCiAgICAgICAgc2VsZi5vdmVycmlkZV9lbmNvZGluZyA9IG92ZXJyaWRlX2VuY29kaW5nCiAgICAgICAgc2VsZi50cmFuc3BvcnRfZW5jb2RpbmcgPSB0cmFuc3BvcnRfZW5jb2RpbmcKICAgICAgICBzZWxmLnNhbWVfb3JpZ2luX3BhcmVudF9lbmNvZGluZyA9IHNhbWVfb3JpZ2luX3BhcmVudF9lbmNvZGluZwogICAgICAgIHNlbGYubGlrZWx5X2VuY29kaW5nID0gbGlrZWx5X2VuY29kaW5nCiAgICAgICAgc2VsZi5kZWZhdWx0X2VuY29kaW5nID0gZGVmYXVsdF9lbmNvZGluZwoKICAgICAgICAjIERldGVybWluZSBlbmNvZGluZwogICAgICAgIHNlbGYuY2hhckVuY29kaW5nID0gc2VsZi5kZXRlcm1pbmVFbmNvZGluZyh1c2VDaGFyZGV0KQogICAgICAgIGFzc2VydCBzZWxmLmNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZQoKICAgICAgICAjIENhbGwgc3VwZXJjbGFzcwogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLmRhdGFTdHJlYW0gPSBzZWxmLmNoYXJFbmNvZGluZ1swXS5jb2RlY19pbmZvLnN0cmVhbXJlYWRlcihzZWxmLnJhd1N0cmVhbSwgJ3JlcGxhY2UnKQogICAgICAgIEhUTUxVbmljb2RlSW5wdXRTdHJlYW0ucmVzZXQoc2VsZikKCiAgICBkZWYgb3BlblN0cmVhbShzZWxmLCBzb3VyY2UpOgogICAgICAgICIiIlByb2R1Y2VzIGEgZmlsZSBvYmplY3QgZnJvbSBzb3VyY2UuCgogICAgICAgIHNvdXJjZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvYmplY3QsIGxvY2FsIGZpbGVuYW1lIG9yIGEgc3RyaW5nLgoKICAgICAgICAiIiIKICAgICAgICAjIEFscmVhZHkgYSBmaWxlIG9iamVjdAogICAgICAgIGlmIGhhc2F0dHIoc291cmNlLCAncmVhZCcpOgogICAgICAgICAgICBzdHJlYW0gPSBzb3VyY2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdHJlYW0gPSBCeXRlc0lPKHNvdXJjZSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdHJlYW0uc2VlayhzdHJlYW0udGVsbCgpKQogICAgICAgIGV4Y2VwdDogICMgcHlsaW50OmRpc2FibGU9YmFyZS1leGNlcHQKICAgICAgICAgICAgc3RyZWFtID0gQnVmZmVyZWRTdHJlYW0oc3RyZWFtKQoKICAgICAgICByZXR1cm4gc3RyZWFtCgogICAgZGVmIGRldGVybWluZUVuY29kaW5nKHNlbGYsIGNoYXJkZXQ9VHJ1ZSk6CiAgICAgICAgIyBCT01zIHRha2UgcHJlY2VkZW5jZSBvdmVyIGV2ZXJ5dGhpbmcKICAgICAgICAjIFRoaXMgd2lsbCBhbHNvIHJlYWQgcGFzdCB0aGUgQk9NIGlmIHByZXNlbnQKICAgICAgICBjaGFyRW5jb2RpbmcgPSBzZWxmLmRldGVjdEJPTSgpLCAiY2VydGFpbiIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBJZiB3ZSd2ZSBiZWVuIG92ZXJyaWRlbiwgd2UndmUgYmVlbiBvdmVycmlkZW4KICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLm92ZXJyaWRlX2VuY29kaW5nKSwgImNlcnRhaW4iCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgTm93IGNoZWNrIHRoZSB0cmFuc3BvcnQgbGF5ZXIKICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLnRyYW5zcG9ydF9lbmNvZGluZyksICJjZXJ0YWluIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjIExvb2sgZm9yIG1ldGEgZWxlbWVudHMgd2l0aCBlbmNvZGluZyBpbmZvcm1hdGlvbgogICAgICAgIGNoYXJFbmNvZGluZyA9IHNlbGYuZGV0ZWN0RW5jb2RpbmdNZXRhKCksICJ0ZW50YXRpdmUiCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgUGFyZW50IGRvY3VtZW50IGVuY29kaW5nCiAgICAgICAgY2hhckVuY29kaW5nID0gbG9va3VwRW5jb2Rpbmcoc2VsZi5zYW1lX29yaWdpbl9wYXJlbnRfZW5jb2RpbmcpLCAidGVudGF0aXZlIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZSBhbmQgbm90IGNoYXJFbmNvZGluZ1swXS5uYW1lLnN0YXJ0c3dpdGgoInV0Zi0xNiIpOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgImxpa2VseSIgZW5jb2RpbmcKICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLmxpa2VseV9lbmNvZGluZyksICJ0ZW50YXRpdmUiCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgR3Vlc3Mgd2l0aCBjaGFyZGV0LCBpZiBhdmFpbGFibGUKICAgICAgICBpZiBjaGFyZGV0OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmcm9tIGNoYXJkZXQudW5pdmVyc2FsZGV0ZWN0b3IgaW1wb3J0IFVuaXZlcnNhbERldGVjdG9yCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ1ZmZlcnMgPSBbXQogICAgICAgICAgICAgICAgZGV0ZWN0b3IgPSBVbml2ZXJzYWxEZXRlY3RvcigpCiAgICAgICAgICAgICAgICB3aGlsZSBub3QgZGV0ZWN0b3IuZG9uZToKICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBzZWxmLnJhd1N0cmVhbS5yZWFkKHNlbGYubnVtQnl0ZXNDaGFyZGV0KQogICAgICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGJ1ZmZlciwgYnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZmZlcjoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBidWZmZXJzLmFwcGVuZChidWZmZXIpCiAgICAgICAgICAgICAgICAgICAgZGV0ZWN0b3IuZmVlZChidWZmZXIpCiAgICAgICAgICAgICAgICBkZXRlY3Rvci5jbG9zZSgpCiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKGRldGVjdG9yLnJlc3VsdFsnZW5jb2RpbmcnXSkKICAgICAgICAgICAgICAgIHNlbGYucmF3U3RyZWFtLnNlZWsoMCkKICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGluZywgInRlbnRhdGl2ZSIKCiAgICAgICAgIyBUcnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcKICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLmRlZmF1bHRfZW5jb2RpbmcpLCAidGVudGF0aXZlIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjIEZhbGxiYWNrIHRvIGh0bWw1bGliJ3MgZGVmYXVsdCBpZiBldmVuIHRoYXQgaGFzbid0IHdvcmtlZAogICAgICAgIHJldHVybiBsb29rdXBFbmNvZGluZygid2luZG93cy0xMjUyIiksICJ0ZW50YXRpdmUiCgogICAgZGVmIGNoYW5nZUVuY29kaW5nKHNlbGYsIG5ld0VuY29kaW5nKToKICAgICAgICBhc3NlcnQgc2VsZi5jaGFyRW5jb2RpbmdbMV0gIT0gImNlcnRhaW4iCiAgICAgICAgbmV3RW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhuZXdFbmNvZGluZykKICAgICAgICBpZiBuZXdFbmNvZGluZyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBuZXdFbmNvZGluZy5uYW1lIGluICgidXRmLTE2YmUiLCAidXRmLTE2bGUiKToKICAgICAgICAgICAgbmV3RW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZygidXRmLTgiKQogICAgICAgICAgICBhc3NlcnQgbmV3RW5jb2RpbmcgaXMgbm90IE5vbmUKICAgICAgICBlbGlmIG5ld0VuY29kaW5nID09IHNlbGYuY2hhckVuY29kaW5nWzBdOgogICAgICAgICAgICBzZWxmLmNoYXJFbmNvZGluZyA9IChzZWxmLmNoYXJFbmNvZGluZ1swXSwgImNlcnRhaW4iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucmF3U3RyZWFtLnNlZWsoMCkKICAgICAgICAgICAgc2VsZi5jaGFyRW5jb2RpbmcgPSAobmV3RW5jb2RpbmcsICJjZXJ0YWluIikKICAgICAgICAgICAgc2VsZi5yZXNldCgpCiAgICAgICAgICAgIHJhaXNlIFJlcGFyc2VFeGNlcHRpb24oIkVuY29kaW5nIGNoYW5nZWQgZnJvbSAlcyB0byAlcyIgJSAoc2VsZi5jaGFyRW5jb2RpbmdbMF0sIG5ld0VuY29kaW5nKSkKCiAgICBkZWYgZGV0ZWN0Qk9NKHNlbGYpOgogICAgICAgICIiIkF0dGVtcHRzIHRvIGRldGVjdCBhdCBCT00gYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0uIElmCiAgICAgICAgYW4gZW5jb2RpbmcgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgQk9NIHJldHVybiB0aGUgbmFtZSBvZiB0aGUKICAgICAgICBlbmNvZGluZyBvdGhlcndpc2UgcmV0dXJuIE5vbmUiIiIKICAgICAgICBib21EaWN0ID0gewogICAgICAgICAgICBjb2RlY3MuQk9NX1VURjg6ICd1dGYtOCcsCiAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMTZfTEU6ICd1dGYtMTZsZScsIGNvZGVjcy5CT01fVVRGMTZfQkU6ICd1dGYtMTZiZScsCiAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMzJfTEU6ICd1dGYtMzJsZScsIGNvZGVjcy5CT01fVVRGMzJfQkU6ICd1dGYtMzJiZScKICAgICAgICB9CgogICAgICAgICMgR28gdG8gYmVnaW5uaW5nIG9mIGZpbGUgYW5kIHJlYWQgaW4gNCBieXRlcwogICAgICAgIHN0cmluZyA9IHNlbGYucmF3U3RyZWFtLnJlYWQoNCkKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShzdHJpbmcsIGJ5dGVzKQoKICAgICAgICAjIFRyeSBkZXRlY3RpbmcgdGhlIEJPTSB1c2luZyBieXRlcyBmcm9tIHRoZSBzdHJpbmcKICAgICAgICBlbmNvZGluZyA9IGJvbURpY3QuZ2V0KHN0cmluZ1s6M10pICAgICAgICAgIyBVVEYtOAogICAgICAgIHNlZWsgPSAzCiAgICAgICAgaWYgbm90IGVuY29kaW5nOgogICAgICAgICAgICAjIE5lZWQgdG8gZGV0ZWN0IFVURi0zMiBiZWZvcmUgVVRGLTE2CiAgICAgICAgICAgIGVuY29kaW5nID0gYm9tRGljdC5nZXQoc3RyaW5nKSAgICAgICAgICMgVVRGLTMyCiAgICAgICAgICAgIHNlZWsgPSA0CiAgICAgICAgICAgIGlmIG5vdCBlbmNvZGluZzoKICAgICAgICAgICAgICAgIGVuY29kaW5nID0gYm9tRGljdC5nZXQoc3RyaW5nWzoyXSkgICMgVVRGLTE2CiAgICAgICAgICAgICAgICBzZWVrID0gMgoKICAgICAgICAjIFNldCB0aGUgcmVhZCBwb3NpdGlvbiBwYXN0IHRoZSBCT00gaWYgb25lIHdhcyBmb3VuZCwgb3RoZXJ3aXNlCiAgICAgICAgIyBzZXQgaXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0KICAgICAgICBpZiBlbmNvZGluZzoKICAgICAgICAgICAgc2VsZi5yYXdTdHJlYW0uc2VlayhzZWVrKQogICAgICAgICAgICByZXR1cm4gbG9va3VwRW5jb2RpbmcoZW5jb2RpbmcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5yYXdTdHJlYW0uc2VlaygwKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBkZXRlY3RFbmNvZGluZ01ldGEoc2VsZik6CiAgICAgICAgIiIiUmVwb3J0IHRoZSBlbmNvZGluZyBkZWNsYXJlZCBieSB0aGUgbWV0YSBlbGVtZW50CiAgICAgICAgIiIiCiAgICAgICAgYnVmZmVyID0gc2VsZi5yYXdTdHJlYW0ucmVhZChzZWxmLm51bUJ5dGVzTWV0YSkKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidWZmZXIsIGJ5dGVzKQogICAgICAgIHBhcnNlciA9IEVuY29kaW5nUGFyc2VyKGJ1ZmZlcikKICAgICAgICBzZWxmLnJhd1N0cmVhbS5zZWVrKDApCiAgICAgICAgZW5jb2RpbmcgPSBwYXJzZXIuZ2V0RW5jb2RpbmcoKQoKICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZSBhbmQgZW5jb2RpbmcubmFtZSBpbiAoInV0Zi0xNmJlIiwgInV0Zi0xNmxlIik6CiAgICAgICAgICAgIGVuY29kaW5nID0gbG9va3VwRW5jb2RpbmcoInV0Zi04IikKCiAgICAgICAgcmV0dXJuIGVuY29kaW5nCgoKY2xhc3MgRW5jb2RpbmdCeXRlcyhieXRlcyk6CiAgICAiIiJTdHJpbmctbGlrZSBvYmplY3Qgd2l0aCBhbiBhc3NvY2lhdGVkIHBvc2l0aW9uIGFuZCB2YXJpb3VzIGV4dHJhIG1ldGhvZHMKICAgIElmIHRoZSBwb3NpdGlvbiBpcyBldmVyIGdyZWF0ZXIgdGhhbiB0aGUgc3RyaW5nIGxlbmd0aCB0aGVuIGFuIGV4Y2VwdGlvbiBpcwogICAgcmFpc2VkIiIiCiAgICBkZWYgX19uZXdfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmFsdWUsIGJ5dGVzKQogICAgICAgIHJldHVybiBieXRlcy5fX25ld19fKHNlbGYsIHZhbHVlLmxvd2VyKCkpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKICAgICAgICAjIHB5bGludDpkaXNhYmxlPXVudXNlZC1hcmd1bWVudAogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gLTEKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19uZXh0X18oc2VsZik6CiAgICAgICAgcCA9IHNlbGYuX3Bvc2l0aW9uID0gc2VsZi5fcG9zaXRpb24gKyAxCiAgICAgICAgaWYgcCA+PSBsZW4oc2VsZik6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBlbGlmIHAgPCAwOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKICAgICAgICByZXR1cm4gc2VsZltwOnAgKyAxXQoKICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICMgUHkyIGNvbXBhdAogICAgICAgIHJldHVybiBzZWxmLl9fbmV4dF9fKCkKCiAgICBkZWYgcHJldmlvdXMoc2VsZik6CiAgICAgICAgcCA9IHNlbGYuX3Bvc2l0aW9uCiAgICAgICAgaWYgcCA+PSBsZW4oc2VsZik6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBlbGlmIHAgPCAwOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHAgPSBwIC0gMQogICAgICAgIHJldHVybiBzZWxmW3A6cCArIDFdCgogICAgZGVmIHNldFBvc2l0aW9uKHNlbGYsIHBvc2l0aW9uKToKICAgICAgICBpZiBzZWxmLl9wb3NpdGlvbiA+PSBsZW4oc2VsZik6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHBvc2l0aW9uCgogICAgZGVmIGdldFBvc2l0aW9uKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX3Bvc2l0aW9uID49IGxlbihzZWxmKToKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIGlmIHNlbGYuX3Bvc2l0aW9uID49IDA6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wb3NpdGlvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgcG9zaXRpb24gPSBwcm9wZXJ0eShnZXRQb3NpdGlvbiwgc2V0UG9zaXRpb24pCgogICAgZGVmIGdldEN1cnJlbnRCeXRlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmW3NlbGYucG9zaXRpb246c2VsZi5wb3NpdGlvbiArIDFdCgogICAgY3VycmVudEJ5dGUgPSBwcm9wZXJ0eShnZXRDdXJyZW50Qnl0ZSkKCiAgICBkZWYgc2tpcChzZWxmLCBjaGFycz1zcGFjZUNoYXJhY3RlcnNCeXRlcyk6CiAgICAgICAgIiIiU2tpcCBwYXN0IGEgbGlzdCBvZiBjaGFyYWN0ZXJzIiIiCiAgICAgICAgcCA9IHNlbGYucG9zaXRpb24gICAgICAgICAgICAgICAjIHVzZSBwcm9wZXJ0eSBmb3IgdGhlIGVycm9yLWNoZWNraW5nCiAgICAgICAgd2hpbGUgcCA8IGxlbihzZWxmKToKICAgICAgICAgICAgYyA9IHNlbGZbcDpwICsgMV0KICAgICAgICAgICAgaWYgYyBub3QgaW4gY2hhcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHAKICAgICAgICAgICAgICAgIHJldHVybiBjCiAgICAgICAgICAgIHAgKz0gMQogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcAogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIHNraXBVbnRpbChzZWxmLCBjaGFycyk6CiAgICAgICAgcCA9IHNlbGYucG9zaXRpb24KICAgICAgICB3aGlsZSBwIDwgbGVuKHNlbGYpOgogICAgICAgICAgICBjID0gc2VsZltwOnAgKyAxXQogICAgICAgICAgICBpZiBjIGluIGNoYXJzOgogICAgICAgICAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBwCiAgICAgICAgICAgICAgICByZXR1cm4gYwogICAgICAgICAgICBwICs9IDEKICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHAKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBtYXRjaEJ5dGVzKHNlbGYsIGJ5dGVzKToKICAgICAgICAiIiJMb29rIGZvciBhIHNlcXVlbmNlIG9mIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiBhIHN0cmluZy4gSWYgdGhlIGJ5dGVzCiAgICAgICAgYXJlIGZvdW5kIHJldHVybiBUcnVlIGFuZCBhZHZhbmNlIHRoZSBwb3NpdGlvbiB0byB0aGUgYnl0ZSBhZnRlciB0aGUKICAgICAgICBtYXRjaC4gT3RoZXJ3aXNlIHJldHVybiBGYWxzZSBhbmQgbGVhdmUgdGhlIHBvc2l0aW9uIGFsb25lIiIiCiAgICAgICAgcCA9IHNlbGYucG9zaXRpb24KICAgICAgICBkYXRhID0gc2VsZltwOnAgKyBsZW4oYnl0ZXMpXQogICAgICAgIHJ2ID0gZGF0YS5zdGFydHN3aXRoKGJ5dGVzKQogICAgICAgIGlmIHJ2OgogICAgICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbihieXRlcykKICAgICAgICByZXR1cm4gcnYKCiAgICBkZWYganVtcFRvKHNlbGYsIGJ5dGVzKToKICAgICAgICAiIiJMb29rIGZvciB0aGUgbmV4dCBzZXF1ZW5jZSBvZiBieXRlcyBtYXRjaGluZyBhIGdpdmVuIHNlcXVlbmNlLiBJZgogICAgICAgIGEgbWF0Y2ggaXMgZm91bmQgYWR2YW5jZSB0aGUgcG9zaXRpb24gdG8gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWF0Y2giIiIKICAgICAgICBuZXdQb3NpdGlvbiA9IHNlbGZbc2VsZi5wb3NpdGlvbjpdLmZpbmQoYnl0ZXMpCiAgICAgICAgaWYgbmV3UG9zaXRpb24gPiAtMToKICAgICAgICAgICAgIyBYWFg6IFRoaXMgaXMgdWdseSwgYnV0IEkgY2FuJ3Qgc2VlIGEgbmljZXIgd2F5IHRvIGZpeCB0aGlzLgogICAgICAgICAgICBpZiBzZWxmLl9wb3NpdGlvbiA9PSAtMToKICAgICAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gMAogICAgICAgICAgICBzZWxmLl9wb3NpdGlvbiArPSAobmV3UG9zaXRpb24gKyBsZW4oYnl0ZXMpIC0gMSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCgoKY2xhc3MgRW5jb2RpbmdQYXJzZXIob2JqZWN0KToKICAgICIiIk1pbmkgcGFyc2VyIGZvciBkZXRlY3RpbmcgY2hhcmFjdGVyIGVuY29kaW5nIGZyb20gbWV0YSBlbGVtZW50cyIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICAiIiJzdHJpbmcgLSB0aGUgZGF0YSB0byB3b3JrIG9uIGZvciBlbmNvZGluZyBkZXRlY3Rpb24iIiIKICAgICAgICBzZWxmLmRhdGEgPSBFbmNvZGluZ0J5dGVzKGRhdGEpCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUKCiAgICBkZWYgZ2V0RW5jb2Rpbmcoc2VsZik6CiAgICAgICAgbWV0aG9kRGlzcGF0Y2ggPSAoCiAgICAgICAgICAgIChiIjwhLS0iLCBzZWxmLmhhbmRsZUNvbW1lbnQpLAogICAgICAgICAgICAoYiI8bWV0YSIsIHNlbGYuaGFuZGxlTWV0YSksCiAgICAgICAgICAgIChiIjwvIiwgc2VsZi5oYW5kbGVQb3NzaWJsZUVuZFRhZyksCiAgICAgICAgICAgIChiIjwhIiwgc2VsZi5oYW5kbGVPdGhlciksCiAgICAgICAgICAgIChiIjw/Iiwgc2VsZi5oYW5kbGVPdGhlciksCiAgICAgICAgICAgIChiIjwiLCBzZWxmLmhhbmRsZVBvc3NpYmxlU3RhcnRUYWcpKQogICAgICAgIGZvciBfIGluIHNlbGYuZGF0YToKICAgICAgICAgICAga2VlcFBhcnNpbmcgPSBUcnVlCiAgICAgICAgICAgIGZvciBrZXksIG1ldGhvZCBpbiBtZXRob2REaXNwYXRjaDoKICAgICAgICAgICAgICAgIGlmIHNlbGYuZGF0YS5tYXRjaEJ5dGVzKGtleSk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBrZWVwUGFyc2luZyA9IG1ldGhvZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBQYXJzaW5nID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbm90IGtlZXBQYXJzaW5nOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RpbmcKCiAgICBkZWYgaGFuZGxlQ29tbWVudChzZWxmKToKICAgICAgICAiIiJTa2lwIG92ZXIgY29tbWVudHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmp1bXBUbyhiIi0tPiIpCgogICAgZGVmIGhhbmRsZU1ldGEoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kYXRhLmN1cnJlbnRCeXRlIG5vdCBpbiBzcGFjZUNoYXJhY3RlcnNCeXRlczoKICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIDxtZXRhIG5vdCBmb2xsb3dlZCBieSBhIHNwYWNlIHNvIGp1c3Qga2VlcCBnb2luZwogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICMgV2UgaGF2ZSBhIHZhbGlkIG1ldGEgZWxlbWVudCB3ZSB3YW50IHRvIHNlYXJjaCBmb3IgYXR0cmlidXRlcwogICAgICAgIGhhc1ByYWdtYSA9IEZhbHNlCiAgICAgICAgcGVuZGluZ0VuY29kaW5nID0gTm9uZQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgVHJ5IHRvIGZpbmQgdGhlIG5leHQgYXR0cmlidXRlIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uCiAgICAgICAgICAgIGF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZSgpCiAgICAgICAgICAgIGlmIGF0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBhdHRyWzBdID09IGIiaHR0cC1lcXVpdiI6CiAgICAgICAgICAgICAgICAgICAgaGFzUHJhZ21hID0gYXR0clsxXSA9PSBiImNvbnRlbnQtdHlwZSIKICAgICAgICAgICAgICAgICAgICBpZiBoYXNQcmFnbWEgYW5kIHBlbmRpbmdFbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IHBlbmRpbmdFbmNvZGluZwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIGVsaWYgYXR0clswXSA9PSBiImNoYXJzZXQiOgogICAgICAgICAgICAgICAgICAgIHRlbnRhdGl2ZUVuY29kaW5nID0gYXR0clsxXQogICAgICAgICAgICAgICAgICAgIGNvZGVjID0gbG9va3VwRW5jb2RpbmcodGVudGF0aXZlRW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgICAgaWYgY29kZWMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBjb2RlYwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIGVsaWYgYXR0clswXSA9PSBiImNvbnRlbnQiOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQYXJzZXIgPSBDb250ZW50QXR0clBhcnNlcihFbmNvZGluZ0J5dGVzKGF0dHJbMV0pKQogICAgICAgICAgICAgICAgICAgIHRlbnRhdGl2ZUVuY29kaW5nID0gY29udGVudFBhcnNlci5wYXJzZSgpCiAgICAgICAgICAgICAgICAgICAgaWYgdGVudGF0aXZlRW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjID0gbG9va3VwRW5jb2RpbmcodGVudGF0aXZlRW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvZGVjIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzUHJhZ21hOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBjb2RlYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nRW5jb2RpbmcgPSBjb2RlYwoKICAgIGRlZiBoYW5kbGVQb3NzaWJsZVN0YXJ0VGFnKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmhhbmRsZVBvc3NpYmxlVGFnKEZhbHNlKQoKICAgIGRlZiBoYW5kbGVQb3NzaWJsZUVuZFRhZyhzZWxmKToKICAgICAgICBuZXh0KHNlbGYuZGF0YSkKICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVQb3NzaWJsZVRhZyhUcnVlKQoKICAgIGRlZiBoYW5kbGVQb3NzaWJsZVRhZyhzZWxmLCBlbmRUYWcpOgogICAgICAgIGRhdGEgPSBzZWxmLmRhdGEKICAgICAgICBpZiBkYXRhLmN1cnJlbnRCeXRlIG5vdCBpbiBhc2NpaUxldHRlcnNCeXRlczoKICAgICAgICAgICAgIyBJZiB0aGUgbmV4dCBieXRlIGlzIG5vdCBhbiBhc2NpaSBsZXR0ZXIgZWl0aGVyIGlnbm9yZSB0aGlzCiAgICAgICAgICAgICMgZnJhZ21lbnQgKHBvc3NpYmxlIHN0YXJ0IHRhZyBjYXNlKSBvciB0cmVhdCBpdCBhY2NvcmRpbmcgdG8KICAgICAgICAgICAgIyBoYW5kbGVPdGhlcgogICAgICAgICAgICBpZiBlbmRUYWc6CiAgICAgICAgICAgICAgICBkYXRhLnByZXZpb3VzKCkKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlT3RoZXIoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBjID0gZGF0YS5za2lwVW50aWwoc3BhY2VzQW5nbGVCcmFja2V0cykKICAgICAgICBpZiBjID09IGIiPCI6CiAgICAgICAgICAgICMgcmV0dXJuIHRvIHRoZSBmaXJzdCBzdGVwIGluIHRoZSBvdmVyYWxsICJ0d28gc3RlcCIgYWxnb3JpdGhtCiAgICAgICAgICAgICMgcmVwcm9jZXNzaW5nIHRoZSA8IGJ5dGUKICAgICAgICAgICAgZGF0YS5wcmV2aW91cygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBSZWFkIGFsbCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZSgpCiAgICAgICAgICAgIHdoaWxlIGF0dHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBhdHRyID0gc2VsZi5nZXRBdHRyaWJ1dGUoKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGhhbmRsZU90aGVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEuanVtcFRvKGIiPiIpCgogICAgZGVmIGdldEF0dHJpYnV0ZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBuYW1lLHZhbHVlIHBhaXIgZm9yIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtLAogICAgICAgIGlmIG9uZSBpcyBmb3VuZCwgb3IgTm9uZSIiIgogICAgICAgIGRhdGEgPSBzZWxmLmRhdGEKICAgICAgICAjIFN0ZXAgMSAoc2tpcCBjaGFycykKICAgICAgICBjID0gZGF0YS5za2lwKHNwYWNlQ2hhcmFjdGVyc0J5dGVzIHwgZnJvemVuc2V0KFtiIi8iXSkpCiAgICAgICAgYXNzZXJ0IGMgaXMgTm9uZSBvciBsZW4oYykgPT0gMQogICAgICAgICMgU3RlcCAyCiAgICAgICAgaWYgYyBpbiAoYiI+IiwgTm9uZSk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIyBTdGVwIDMKICAgICAgICBhdHRyTmFtZSA9IFtdCiAgICAgICAgYXR0clZhbHVlID0gW10KICAgICAgICAjIFN0ZXAgNCBhdHRyaWJ1dGUgbmFtZQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGlmIGMgPT0gYiI9IiBhbmQgYXR0ck5hbWU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGMgaW4gc3BhY2VDaGFyYWN0ZXJzQnl0ZXM6CiAgICAgICAgICAgICAgICAjIFN0ZXAgNiEKICAgICAgICAgICAgICAgIGMgPSBkYXRhLnNraXAoKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjIGluIChiIi8iLCBiIj4iKToKICAgICAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihhdHRyTmFtZSksIGIiIgogICAgICAgICAgICBlbGlmIGMgaW4gYXNjaWlVcHBlcmNhc2VCeXRlczoKICAgICAgICAgICAgICAgIGF0dHJOYW1lLmFwcGVuZChjLmxvd2VyKCkpCiAgICAgICAgICAgIGVsaWYgYyBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGF0dHJOYW1lLmFwcGVuZChjKQogICAgICAgICAgICAjIFN0ZXAgNQogICAgICAgICAgICBjID0gbmV4dChkYXRhKQogICAgICAgICMgU3RlcCA3CiAgICAgICAgaWYgYyAhPSBiIj0iOgogICAgICAgICAgICBkYXRhLnByZXZpb3VzKCkKICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGF0dHJOYW1lKSwgYiIiCiAgICAgICAgIyBTdGVwIDgKICAgICAgICBuZXh0KGRhdGEpCiAgICAgICAgIyBTdGVwIDkKICAgICAgICBjID0gZGF0YS5za2lwKCkKICAgICAgICAjIFN0ZXAgMTAKICAgICAgICBpZiBjIGluIChiIiciLCBiJyInKToKICAgICAgICAgICAgIyAxMC4xCiAgICAgICAgICAgIHF1b3RlQ2hhciA9IGMKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICMgMTAuMgogICAgICAgICAgICAgICAgYyA9IG5leHQoZGF0YSkKICAgICAgICAgICAgICAgICMgMTAuMwogICAgICAgICAgICAgICAgaWYgYyA9PSBxdW90ZUNoYXI6CiAgICAgICAgICAgICAgICAgICAgbmV4dChkYXRhKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihhdHRyTmFtZSksIGIiIi5qb2luKGF0dHJWYWx1ZSkKICAgICAgICAgICAgICAgICMgMTAuNAogICAgICAgICAgICAgICAgZWxpZiBjIGluIGFzY2lpVXBwZXJjYXNlQnl0ZXM6CiAgICAgICAgICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjLmxvd2VyKCkpCiAgICAgICAgICAgICAgICAjIDEwLjUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjKQogICAgICAgIGVsaWYgYyA9PSBiIj4iOgogICAgICAgICAgICByZXR1cm4gYiIiLmpvaW4oYXR0ck5hbWUpLCBiIiIKICAgICAgICBlbGlmIGMgaW4gYXNjaWlVcHBlcmNhc2VCeXRlczoKICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjLmxvd2VyKCkpCiAgICAgICAgZWxpZiBjIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjKQogICAgICAgICMgU3RlcCAxMQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGMgPSBuZXh0KGRhdGEpCiAgICAgICAgICAgIGlmIGMgaW4gc3BhY2VzQW5nbGVCcmFja2V0czoKICAgICAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihhdHRyTmFtZSksIGIiIi5qb2luKGF0dHJWYWx1ZSkKICAgICAgICAgICAgZWxpZiBjIGluIGFzY2lpVXBwZXJjYXNlQnl0ZXM6CiAgICAgICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMubG93ZXIoKSkKICAgICAgICAgICAgZWxpZiBjIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjKQoKCmNsYXNzIENvbnRlbnRBdHRyUGFyc2VyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGF0YSwgYnl0ZXMpCiAgICAgICAgc2VsZi5kYXRhID0gZGF0YQoKICAgIGRlZiBwYXJzZShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIGF0dHIgbmFtZSBpcyBjaGFyc2V0CiAgICAgICAgICAgICMgb3RoZXJ3aXNlIHJldHVybgogICAgICAgICAgICBzZWxmLmRhdGEuanVtcFRvKGIiY2hhcnNldCIpCiAgICAgICAgICAgIHNlbGYuZGF0YS5wb3NpdGlvbiArPSAxCiAgICAgICAgICAgIHNlbGYuZGF0YS5za2lwKCkKICAgICAgICAgICAgaWYgbm90IHNlbGYuZGF0YS5jdXJyZW50Qnl0ZSA9PSBiIj0iOgogICAgICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyA9IHNpZ24ga2VlcCBsb29raW5nIGZvciBhdHRycwogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgc2VsZi5kYXRhLnBvc2l0aW9uICs9IDEKICAgICAgICAgICAgc2VsZi5kYXRhLnNraXAoKQogICAgICAgICAgICAjIExvb2sgZm9yIGFuIGVuY29kaW5nIGJldHdlZW4gbWF0Y2hpbmcgcXVvdGUgbWFya3MKICAgICAgICAgICAgaWYgc2VsZi5kYXRhLmN1cnJlbnRCeXRlIGluIChiJyInLCBiIiciKToKICAgICAgICAgICAgICAgIHF1b3RlTWFyayA9IHNlbGYuZGF0YS5jdXJyZW50Qnl0ZQogICAgICAgICAgICAgICAgc2VsZi5kYXRhLnBvc2l0aW9uICs9IDEKICAgICAgICAgICAgICAgIG9sZFBvc2l0aW9uID0gc2VsZi5kYXRhLnBvc2l0aW9uCiAgICAgICAgICAgICAgICBpZiBzZWxmLmRhdGEuanVtcFRvKHF1b3RlTWFyayk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtvbGRQb3NpdGlvbjpzZWxmLmRhdGEucG9zaXRpb25dCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFVucXVvdGVkIHZhbHVlCiAgICAgICAgICAgICAgICBvbGRQb3NpdGlvbiA9IHNlbGYuZGF0YS5wb3NpdGlvbgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5za2lwVW50aWwoc3BhY2VDaGFyYWN0ZXJzQnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtvbGRQb3NpdGlvbjpzZWxmLmRhdGEucG9zaXRpb25dCiAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgICAgICAgICAjIFJldHVybiB0aGUgd2hvbGUgcmVtYWluaW5nIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtvbGRQb3NpdGlvbjpdCiAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgIHJldHVybiBOb25lCgoKZGVmIGxvb2t1cEVuY29kaW5nKGVuY29kaW5nKToKICAgICIiIlJldHVybiB0aGUgcHl0aG9uIGNvZGVjIG5hbWUgY29ycmVzcG9uZGluZyB0byBhbiBlbmNvZGluZyBvciBOb25lIGlmIHRoZQogICAgc3RyaW5nIGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIGVuY29kaW5nLiIiIgogICAgaWYgaXNpbnN0YW5jZShlbmNvZGluZywgYmluYXJ5X3R5cGUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy5kZWNvZGUoImFzY2lpIikKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHdlYmVuY29kaW5ncy5sb29rdXAoZW5jb2RpbmcpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgZWxzZToKICAgICAgICByZXR1cm4gTm9uZQpQSwMEFAAAAAAAAAAhAMRGahYkKwEAJCsBAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190b2tlbml6ZXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB1bmljaHIgYXMgY2hyCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBzcGFjZUNoYXJhY3RlcnMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBlbnRpdGllcwpmcm9tIC5jb25zdGFudHMgaW1wb3J0IGFzY2lpTGV0dGVycywgYXNjaWlVcHBlcjJMb3dlcgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IGRpZ2l0cywgaGV4RGlnaXRzLCBFT0YKZnJvbSAuY29uc3RhbnRzIGltcG9ydCB0b2tlblR5cGVzLCB0YWdUb2tlblR5cGVzCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgcmVwbGFjZW1lbnRDaGFyYWN0ZXJzCgpmcm9tIC5faW5wdXRzdHJlYW0gaW1wb3J0IEhUTUxJbnB1dFN0cmVhbQoKZnJvbSAuX3RyaWUgaW1wb3J0IFRyaWUKCmVudGl0aWVzVHJpZSA9IFRyaWUoZW50aXRpZXMpCgoKY2xhc3MgSFRNTFRva2VuaXplcihvYmplY3QpOgogICAgIiIiIFRoaXMgY2xhc3MgdGFrZXMgY2FyZSBvZiB0b2tlbml6aW5nIEhUTUwuCgogICAgKiBzZWxmLmN1cnJlbnRUb2tlbgogICAgICBIb2xkcyB0aGUgdG9rZW4gdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLgoKICAgICogc2VsZi5zdGF0ZQogICAgICBIb2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQuLi4gWFhYCgogICAgKiBzZWxmLnN0cmVhbQogICAgICBQb2ludHMgdG8gSFRNTElucHV0U3RyZWFtIG9iamVjdC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIHBhcnNlcj1Ob25lLCAqKmt3YXJncyk6CgogICAgICAgIHNlbGYuc3RyZWFtID0gSFRNTElucHV0U3RyZWFtKHN0cmVhbSwgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5wYXJzZXIgPSBwYXJzZXIKCiAgICAgICAgIyBTZXR1cCB0aGUgaW5pdGlhbCB0b2tlbml6ZXIgc3RhdGUKICAgICAgICBzZWxmLmVzY2FwZUZsYWcgPSBGYWxzZQogICAgICAgIHNlbGYubGFzdEZvdXJDaGFycyA9IFtdCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgc2VsZi5lc2NhcGUgPSBGYWxzZQoKICAgICAgICAjIFRoZSBjdXJyZW50IHRva2VuIGJlaW5nIGNyZWF0ZWQKICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IE5vbmUKICAgICAgICBzdXBlcihIVE1MVG9rZW5pemVyLCBzZWxmKS5fX2luaXRfXygpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLgoKICAgICAgICBXZSBkbyBvdXIgdXN1YWxseSBwcm9jZXNzaW5nIHRocm91Z2ggdGhlIHN0YXRlcyBhbmQgd2hlbiB3ZSBoYXZlIGEgdG9rZW4KICAgICAgICB0byByZXR1cm4gd2UgeWllbGQgdGhlIHRva2VuIHdoaWNoIHBhdXNlcyBwcm9jZXNzaW5nIHVudGlsIHRoZSBuZXh0IHRva2VuCiAgICAgICAgaXMgcmVxdWVzdGVkLgogICAgICAgICIiIgogICAgICAgIHNlbGYudG9rZW5RdWV1ZSA9IGRlcXVlKFtdKQogICAgICAgICMgU3RhcnQgcHJvY2Vzc2luZy4gV2hlbiBFT0YgaXMgcmVhY2hlZCBzZWxmLnN0YXRlIHdpbGwgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBpbnN0ZWFkIG9mIFRydWUgYW5kIHRoZSBsb29wIHdpbGwgdGVybWluYXRlLgogICAgICAgIHdoaWxlIHNlbGYuc3RhdGUoKToKICAgICAgICAgICAgd2hpbGUgc2VsZi5zdHJlYW0uZXJyb3JzOgogICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6IHNlbGYuc3RyZWFtLmVycm9ycy5wb3AoMCl9CiAgICAgICAgICAgIHdoaWxlIHNlbGYudG9rZW5RdWV1ZToKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYudG9rZW5RdWV1ZS5wb3BsZWZ0KCkKCiAgICBkZWYgY29uc3VtZU51bWJlckVudGl0eShzZWxmLCBpc0hleCk6CiAgICAgICAgIiIiVGhpcyBmdW5jdGlvbiByZXR1cm5zIGVpdGhlciBVK0ZGRkQgb3IgdGhlIGNoYXJhY3RlciBiYXNlZCBvbiB0aGUKICAgICAgICBkZWNpbWFsIG9yIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLiBJdCBhbHNvIGRpc2NhcmRzICI7IiBpZiBwcmVzZW50LgogICAgICAgIElmIG5vdCBwcmVzZW50IHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdfSkgaXMgaW52b2tlZC4KICAgICAgICAiIiIKCiAgICAgICAgYWxsb3dlZCA9IGRpZ2l0cwogICAgICAgIHJhZGl4ID0gMTAKICAgICAgICBpZiBpc0hleDoKICAgICAgICAgICAgYWxsb3dlZCA9IGhleERpZ2l0cwogICAgICAgICAgICByYWRpeCA9IDE2CgogICAgICAgIGNoYXJTdGFjayA9IFtdCgogICAgICAgICMgQ29uc3VtZSBhbGwgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcmUgaW4gcmFuZ2Ugd2hpbGUgbWFraW5nIHN1cmUgd2UKICAgICAgICAjIGRvbid0IGhpdCBhbiBFT0YuCiAgICAgICAgYyA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIHdoaWxlIGMgaW4gYWxsb3dlZCBhbmQgYyBpcyBub3QgRU9GOgogICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKGMpCiAgICAgICAgICAgIGMgPSBzZWxmLnN0cmVhbS5jaGFyKCkKCiAgICAgICAgIyBDb252ZXJ0IHRoZSBzZXQgb2YgY2hhcmFjdGVycyBjb25zdW1lZCB0byBhbiBpbnQuCiAgICAgICAgY2hhckFzSW50ID0gaW50KCIiLmpvaW4oY2hhclN0YWNrKSwgcmFkaXgpCgogICAgICAgICMgQ2VydGFpbiBjaGFyYWN0ZXJzIGdldCByZXBsYWNlZCB3aXRoIG90aGVycwogICAgICAgIGlmIGNoYXJBc0ludCBpbiByZXBsYWNlbWVudENoYXJhY3RlcnM6CiAgICAgICAgICAgIGNoYXIgPSByZXBsYWNlbWVudENoYXJhY3RlcnNbY2hhckFzSW50XQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbC1jb2RlcG9pbnQtZm9yLW51bWVyaWMtZW50aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGF2YXJzIjogeyJjaGFyQXNJbnQiOiBjaGFyQXNJbnR9fSkKICAgICAgICBlbGlmICgoMHhEODAwIDw9IGNoYXJBc0ludCA8PSAweERGRkYpIG9yCiAgICAgICAgICAgICAgKGNoYXJBc0ludCA+IDB4MTBGRkZGKSk6CiAgICAgICAgICAgIGNoYXIgPSAiXHVGRkZEIgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbC1jb2RlcG9pbnQtZm9yLW51bWVyaWMtZW50aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGF2YXJzIjogeyJjaGFyQXNJbnQiOiBjaGFyQXNJbnR9fSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFNob3VsZCBzcGVlZCB1cCB0aGlzIGNoZWNrIHNvbWVob3cgKGUuZy4gbW92ZSB0aGUgc2V0IHRvIGEgY29uc3RhbnQpCiAgICAgICAgICAgIGlmICgoMHgwMDAxIDw9IGNoYXJBc0ludCA8PSAweDAwMDgpIG9yCiAgICAgICAgICAgICAgICAoMHgwMDBFIDw9IGNoYXJBc0ludCA8PSAweDAwMUYpIG9yCiAgICAgICAgICAgICAgICAoMHgwMDdGIDw9IGNoYXJBc0ludCA8PSAweDAwOUYpIG9yCiAgICAgICAgICAgICAgICAoMHhGREQwIDw9IGNoYXJBc0ludCA8PSAweEZERUYpIG9yCiAgICAgICAgICAgICAgICBjaGFyQXNJbnQgaW4gZnJvemVuc2V0KFsweDAwMEIsIDB4RkZGRSwgMHhGRkZGLCAweDFGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRkZGRiwgMHgyRkZGRSwgMHgyRkZGRiwgMHgzRkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGRkYsIDB4NEZGRkUsIDB4NEZGRkYsIDB4NUZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVGRkZGLCAweDZGRkZFLCAweDZGRkZGLCAweDdGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RkZGRiwgMHg4RkZGRSwgMHg4RkZGRiwgMHg5RkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OUZGRkYsIDB4QUZGRkUsIDB4QUZGRkYsIDB4QkZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGLCAweENGRkZFLCAweENGRkZGLCAweERGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERkZGRiwgMHhFRkZGRSwgMHhFRkZGRiwgMHhGRkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkYsIDB4MTBGRkZFLCAweDEwRkZGRl0pKToKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwtY29kZXBvaW50LWZvci1udW1lcmljLWVudGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YXZhcnMiOiB7ImNoYXJBc0ludCI6IGNoYXJBc0ludH19KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIFRyeS9leGNlcHQgbmVlZGVkIGFzIFVDUy0yIFB5dGhvbiBidWlsZHMnIHVuaWNoYXIgb25seSB3b3JrcwogICAgICAgICAgICAgICAgIyB3aXRoaW4gdGhlIEJNUC4KICAgICAgICAgICAgICAgIGNoYXIgPSBjaHIoY2hhckFzSW50KQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHYgPSBjaGFyQXNJbnQgLSAweDEwMDAwCiAgICAgICAgICAgICAgICBjaGFyID0gY2hyKDB4RDgwMCB8ICh2ID4+IDEwKSkgKyBjaHIoMHhEQzAwIHwgKHYgJiAweDNGRikpCgogICAgICAgICMgRGlzY2FyZCB0aGUgOyBpZiBwcmVzZW50LiBPdGhlcndpc2UsIHB1dCBpdCBiYWNrIG9uIHRoZSBxdWV1ZSBhbmQKICAgICAgICAjIGludm9rZSBwYXJzZUVycm9yIG9uIHBhcnNlci4KICAgICAgICBpZiBjICE9ICI7IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMtZW50aXR5LXdpdGhvdXQtc2VtaWNvbG9uIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGMpCgogICAgICAgIHJldHVybiBjaGFyCgogICAgZGVmIGNvbnN1bWVFbnRpdHkoc2VsZiwgYWxsb3dlZENoYXI9Tm9uZSwgZnJvbUF0dHJpYnV0ZT1GYWxzZSk6CiAgICAgICAgIyBJbml0aWFsaXNlIHRvIHRoZSBkZWZhdWx0IG91dHB1dCBmb3Igd2hlbiBubyBlbnRpdHkgaXMgbWF0Y2hlZAogICAgICAgIG91dHB1dCA9ICImIgoKICAgICAgICBjaGFyU3RhY2sgPSBbc2VsZi5zdHJlYW0uY2hhcigpXQogICAgICAgIGlmIChjaGFyU3RhY2tbMF0gaW4gc3BhY2VDaGFyYWN0ZXJzIG9yIGNoYXJTdGFja1swXSBpbiAoRU9GLCAiPCIsICImIikgb3IKICAgICAgICAgICAgICAgIChhbGxvd2VkQ2hhciBpcyBub3QgTm9uZSBhbmQgYWxsb3dlZENoYXIgPT0gY2hhclN0YWNrWzBdKSk6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFja1swXSkKCiAgICAgICAgZWxpZiBjaGFyU3RhY2tbMF0gPT0gIiMiOgogICAgICAgICAgICAjIFJlYWQgdGhlIG5leHQgY2hhcmFjdGVyIHRvIHNlZSBpZiBpdCdzIGhleCBvciBkZWNpbWFsCiAgICAgICAgICAgIGhleCA9IEZhbHNlCiAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQogICAgICAgICAgICBpZiBjaGFyU3RhY2tbLTFdIGluICgieCIsICJYIik6CiAgICAgICAgICAgICAgICBoZXggPSBUcnVlCiAgICAgICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKCiAgICAgICAgICAgICMgY2hhclN0YWNrWy0xXSBzaG91bGQgYmUgdGhlIGZpcnN0IGRpZ2l0CiAgICAgICAgICAgIGlmIChoZXggYW5kIGNoYXJTdGFja1stMV0gaW4gaGV4RGlnaXRzKSBcCiAgICAgICAgICAgICAgICAgICAgb3IgKG5vdCBoZXggYW5kIGNoYXJTdGFja1stMV0gaW4gZGlnaXRzKToKICAgICAgICAgICAgICAgICMgQXQgbGVhc3Qgb25lIGRpZ2l0IGZvdW5kLCBzbyBjb25zdW1lIHRoZSB3aG9sZSBudW1iZXIKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFja1stMV0pCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBzZWxmLmNvbnN1bWVOdW1iZXJFbnRpdHkoaGV4KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBObyBkaWdpdHMgZm91bmQKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiZXhwZWN0ZWQtbnVtZXJpYy1lbnRpdHkifSkKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICAgICAgICAgIG91dHB1dCA9ICImIiArICIiLmpvaW4oY2hhclN0YWNrKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEF0IHRoaXMgcG9pbnQgaW4gdGhlIHByb2Nlc3MgbWlnaHQgaGF2ZSBuYW1lZCBlbnRpdHkuIEVudGl0aWVzCiAgICAgICAgICAgICMgYXJlIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlICJlbnRpdGllcyIuCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBDb25zdW1lIGNoYXJhY3RlcnMgYW5kIGNvbXBhcmUgdG8gdGhlc2UgdG8gYSBzdWJzdHJpbmcgb2YgdGhlCiAgICAgICAgICAgICMgZW50aXR5IG5hbWVzIGluIHRoZSBsaXN0IHVudGlsIHRoZSBzdWJzdHJpbmcgbm8gbG9uZ2VyIG1hdGNoZXMuCiAgICAgICAgICAgIHdoaWxlIChjaGFyU3RhY2tbLTFdIGlzIG5vdCBFT0YpOgogICAgICAgICAgICAgICAgaWYgbm90IGVudGl0aWVzVHJpZS5oYXNfa2V5c193aXRoX3ByZWZpeCgiIi5qb2luKGNoYXJTdGFjaykpOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKCiAgICAgICAgICAgICMgQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggc29tZSBjaGFyYWN0ZXJzCiAgICAgICAgICAgICMgdGhhdCBtYXkgbWF0Y2ggYW4gZW50aXR5CiAgICAgICAgICAgICMgVHJ5IHRvIGZpbmQgdGhlIGxvbmdlc3QgZW50aXR5IHRoZSBzdHJpbmcgd2lsbCBtYXRjaCB0byB0YWtlIGNhcmUKICAgICAgICAgICAgIyBvZiAmbm90aSBmb3IgaW5zdGFuY2UuCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGVudGl0eU5hbWUgPSBlbnRpdGllc1RyaWUubG9uZ2VzdF9wcmVmaXgoIiIuam9pbihjaGFyU3RhY2tbOi0xXSkpCiAgICAgICAgICAgICAgICBlbnRpdHlMZW5ndGggPSBsZW4oZW50aXR5TmFtZSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgZW50aXR5TmFtZSA9IE5vbmUKCiAgICAgICAgICAgIGlmIGVudGl0eU5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBlbnRpdHlOYW1lWy0xXSAhPSAiOyI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZWQtZW50aXR5LXdpdGhvdXQtc2VtaWNvbG9uIn0pCiAgICAgICAgICAgICAgICBpZiAoZW50aXR5TmFtZVstMV0gIT0gIjsiIGFuZCBmcm9tQXR0cmlidXRlIGFuZAogICAgICAgICAgICAgICAgICAgIChjaGFyU3RhY2tbZW50aXR5TGVuZ3RoXSBpbiBhc2NpaUxldHRlcnMgb3IKICAgICAgICAgICAgICAgICAgICAgY2hhclN0YWNrW2VudGl0eUxlbmd0aF0gaW4gZGlnaXRzIG9yCiAgICAgICAgICAgICAgICAgICAgIGNoYXJTdGFja1tlbnRpdHlMZW5ndGhdID09ICI9IikpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAiJiIgKyAiIi5qb2luKGNoYXJTdGFjaykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gZW50aXRpZXNbZW50aXR5TmFtZV0KICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChjaGFyU3RhY2sucG9wKCkpCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9ICIiLmpvaW4oY2hhclN0YWNrW2VudGl0eUxlbmd0aDpdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1uYW1lZC1lbnRpdHkifSkKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICAgICAgICAgIG91dHB1dCA9ICImIiArICIiLmpvaW4oY2hhclN0YWNrKQoKICAgICAgICBpZiBmcm9tQXR0cmlidXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBvdXRwdXQKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBvdXRwdXQgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICAgICAgdG9rZW5UeXBlID0gIlNwYWNlQ2hhcmFjdGVycyIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRva2VuVHlwZSA9ICJDaGFyYWN0ZXJzIgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbdG9rZW5UeXBlXSwgImRhdGEiOiBvdXRwdXR9KQoKICAgIGRlZiBwcm9jZXNzRW50aXR5SW5BdHRyaWJ1dGUoc2VsZiwgYWxsb3dlZENoYXIpOgogICAgICAgICIiIlRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBuZWVkIGZvciAiZW50aXR5SW5BdHRyaWJ1dGVWYWx1ZVN0YXRlIi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNvbnN1bWVFbnRpdHkoYWxsb3dlZENoYXI9YWxsb3dlZENoYXIsIGZyb21BdHRyaWJ1dGU9VHJ1ZSkKCiAgICBkZWYgZW1pdEN1cnJlbnRUb2tlbihzZWxmKToKICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBhIGdlbmVyaWMgaGFuZGxlciBmb3IgZW1pdHRpbmcgdGhlIHRhZ3MuIEl0IGFsc28gc2V0cwogICAgICAgIHRoZSBzdGF0ZSB0byAiZGF0YSIgYmVjYXVzZSB0aGF0J3Mgd2hhdCdzIG5lZWRlZCBhZnRlciBhIHRva2VuIGhhcyBiZWVuCiAgICAgICAgZW1pdHRlZC4KICAgICAgICAiIiIKICAgICAgICB0b2tlbiA9IHNlbGYuY3VycmVudFRva2VuCiAgICAgICAgIyBBZGQgdG9rZW4gdG8gdGhlIHF1ZXVlIHRvIGJlIHlpZWxkZWQKICAgICAgICBpZiAodG9rZW5bInR5cGUiXSBpbiB0YWdUb2tlblR5cGVzKToKICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSA9IHRva2VuWyJuYW1lIl0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpCiAgICAgICAgICAgIGlmIHRva2VuWyJ0eXBlIl0gPT0gdG9rZW5UeXBlc1siRW5kVGFnIl06CiAgICAgICAgICAgICAgICBpZiB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImF0dHJpYnV0ZXMtaW4tZW5kLXRhZyJ9KQogICAgICAgICAgICAgICAgaWYgdG9rZW5bInNlbGZDbG9zaW5nIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAic2VsZi1jbG9zaW5nLWZsYWctb24tZW5kLXRhZyJ9KQogICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQodG9rZW4pCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCgogICAgIyBCZWxvdyBhcmUgdGhlIHZhcmlvdXMgdG9rZW5pemVyIHN0YXRlcyB3b3JrZWQgb3V0LgogICAgZGVmIGRhdGFTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmVudGl0eURhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnRhZ09wZW5TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdTAwMDAifSkKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICAjIFRva2VuaXphdGlvbiBlbmRzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICAjIERpcmVjdGx5IGFmdGVyIGVtaXR0aW5nIGEgdG9rZW4geW91IHN3aXRjaCBiYWNrIHRvIHRoZSAiZGF0YQogICAgICAgICAgICAjIHN0YXRlIi4gQXQgdGhhdCBwb2ludCBzcGFjZUNoYXJhY3RlcnMgYXJlIGltcG9ydGFudCBzbyB0aGV5IGFyZQogICAgICAgICAgICAjIGVtaXR0ZWQgc2VwYXJhdGVseS4KICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJTcGFjZUNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbChzcGFjZUNoYXJhY3RlcnMsIFRydWUpfSkKICAgICAgICAgICAgIyBObyBuZWVkIHRvIHVwZGF0ZSBsYXN0Rm91ckNoYXJzIGhlcmUsIHNpbmNlIHRoZSBmaXJzdCBzcGFjZSB3aWxsCiAgICAgICAgICAgICMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwZW5kZWQgdG8gbGFzdEZvdXJDaGFycyBhbmQgd2lsbCBoYXZlIGJyb2tlbgogICAgICAgICAgICAjIGFueSA8IS0tIG9yIC0tPiBzZXF1ZW5jZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFycyA9IHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCImIiwgIjwiLCAiXHUwMDAwIikpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBjaGFyc30pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZW50aXR5RGF0YVN0YXRlKHNlbGYpOgogICAgICAgIHNlbGYuY29uc3VtZUVudGl0eSgpCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmNkYXRhU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiYiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jaGFyYWN0ZXJSZWZlcmVuY2VJblJjZGF0YQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YUxlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgIyBUb2tlbml6YXRpb24gZW5kcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgICMgRGlyZWN0bHkgYWZ0ZXIgZW1pdHRpbmcgYSB0b2tlbiB5b3Ugc3dpdGNoIGJhY2sgdG8gdGhlICJkYXRhCiAgICAgICAgICAgICMgc3RhdGUiLiBBdCB0aGF0IHBvaW50IHNwYWNlQ2hhcmFjdGVycyBhcmUgaW1wb3J0YW50IHNvIHRoZXkgYXJlCiAgICAgICAgICAgICMgZW1pdHRlZCBzZXBhcmF0ZWx5LgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlNwYWNlQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKHNwYWNlQ2hhcmFjdGVycywgVHJ1ZSl9KQogICAgICAgICAgICAjIE5vIG5lZWQgdG8gdXBkYXRlIGxhc3RGb3VyQ2hhcnMgaGVyZSwgc2luY2UgdGhlIGZpcnN0IHNwYWNlIHdpbGwKICAgICAgICAgICAgIyBoYXZlIGFscmVhZHkgYmVlbiBhcHBlbmRlZCB0byBsYXN0Rm91ckNoYXJzIGFuZCB3aWxsIGhhdmUgYnJva2VuCiAgICAgICAgICAgICMgYW55IDwhLS0gb3IgLS0+IHNlcXVlbmNlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJzID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIiYiLCAiPCIsICJcdTAwMDAiKSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIGNoYXJzfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjaGFyYWN0ZXJSZWZlcmVuY2VJblJjZGF0YShzZWxmKToKICAgICAgICBzZWxmLmNvbnN1bWVFbnRpdHkoKQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmF3dGV4dFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmF3dGV4dExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgICMgVG9rZW5pemF0aW9uIGVuZHMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJzID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIjwiLCAiXHUwMDAwIikpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBjaGFyc30pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUxlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgICMgVG9rZW5pemF0aW9uIGVuZHMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJzID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIjwiLCAiXHUwMDAwIikpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBjaGFyc30pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcGxhaW50ZXh0U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICAjIFRva2VuaXphdGlvbiBlbmRzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoIlx1MDAwMCIpfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiB0YWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiEiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5tYXJrdXBEZWNsYXJhdGlvbk9wZW5TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNsb3NlVGFnT3BlblN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJTdGFydFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IGRhdGEsICJkYXRhIjogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmQ2xvc2luZyI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYudGFnTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgIyBYWFggSW4gdGhlb3J5IGl0IGNvdWxkIGJlIHNvbWV0aGluZyBiZXNpZGVzIGEgdGFnIG5hbWUuIEJ1dAogICAgICAgICAgICAjIGRvIHdlIHJlYWxseSBjYXJlPwogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtdGFnLW5hbWUtYnV0LWdvdC1yaWdodC1icmFja2V0In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8PiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj8iOgogICAgICAgICAgICAjIFhYWCBJbiB0aGVvcnkgaXQgY291bGQgYmUgc29tZXRoaW5nIGJlc2lkZXMgYSB0YWcgbmFtZS4gQnV0CiAgICAgICAgICAgICMgZG8gd2UgcmVhbGx5IGNhcmU/CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC10YWctbmFtZS1idXQtZ290LXF1ZXN0aW9uLW1hcmsifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNDb21tZW50U3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWAogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtdGFnLW5hbWUifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2xvc2VUYWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLCAibmFtZSI6IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi50YWdOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1yaWdodC1icmFja2V0In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBYWFggZGF0YSBjYW4gYmUgXydfLi4uCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LWNoYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YXZhcnMiOiB7ImRhdGEiOiBkYXRhfX0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzQ29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgdGFnTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLXRhZy1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdICs9IGRhdGEKICAgICAgICAgICAgIyAoRG9uJ3QgdXNlIGNoYXJzVW50aWwgaGVyZSwgYmVjYXVzZSB0YWcgbmFtZXMgYXJlCiAgICAgICAgICAgICMgdmVyeSBzaG9ydCBhbmQgaXQncyBmYXN0ZXIgdG8gbm90IGRvIGFueXRoaW5nIGZhbmN5KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJjZGF0YUxlc3NUaGFuU2lnblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFFbmRUYWdPcGVuU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJjZGF0YUVuZFRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhRW5kVGFnTmFtZVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwvIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmNkYXRhRW5kVGFnTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGFwcHJvcHJpYXRlID0gc2VsZi5jdXJyZW50VG9rZW4gYW5kIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpCiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIjwvIiArIHNlbGYudGVtcG9yYXJ5QnVmZmVyfSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByYXd0ZXh0TGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRFbmRUYWdPcGVuU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByYXd0ZXh0RW5kVGFnT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0RW5kVGFnTmFtZVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwvIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJhd3RleHRFbmRUYWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgYXBwcm9wcmlhdGUgPSBzZWxmLmN1cnJlbnRUb2tlbiBhbmQgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS5sb3dlcigpID09IHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnMgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiPC8iICsgc2VsZi50ZW1wb3JhcnlCdWZmZXJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhTGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFbmRUYWdPcGVuU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiEiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCEifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZVN0YXJ0U3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRW5kVGFnT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRW5kVGFnTmFtZVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwvIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFbmRUYWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgYXBwcm9wcmlhdGUgPSBzZWxmLmN1cnJlbnRUb2tlbiBhbmQgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS5sb3dlcigpID09IHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnMgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiPC8iICsgc2VsZi50ZW1wb3JhcnlCdWZmZXJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlU3RhcnRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVTdGFydERhc2hTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVTdGFydERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkRGFzaERhc2hTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiPCIsICItIiwgIlx1MDAwMCIpKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgY2hhcnN9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkRGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWREYXNoRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWREYXNoRGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIj4ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZEVuZFRhZ09wZW5TdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8IiArIGRhdGF9KQogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZVN0YXJ0U3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWRFbmRUYWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRFbmRUYWdOYW1lU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkRW5kVGFnTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGFwcHJvcHJpYXRlID0gc2VsZi5jdXJyZW50VG9rZW4gYW5kIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpCiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIjwvIiArIHNlbGYudGVtcG9yYXJ5QnVmZmVyfSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVTdGFydFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIChzcGFjZUNoYXJhY3RlcnMgfCBmcm96ZW5zZXQoKCIvIiwgIj4iKSkpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgaWYgc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKSA9PSAic2NyaXB0IjoKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWREYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tc2NyaXB0LWluLXNjcmlwdCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlZERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLXNjcmlwdC1pbi1zY3JpcHQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlZERhc2hEYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLXNjcmlwdC1pbi1zY3JpcHQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi8ifSkKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlRW5kU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YURvdWJsZUVzY2FwZUVuZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIChzcGFjZUNoYXJhY3RlcnMgfCBmcm96ZW5zZXQoKCIvIiwgIj4iKSkpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgaWYgc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKSA9PSAic2NyaXB0IjoKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBiZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKHNwYWNlQ2hhcmFjdGVycywgVHJ1ZSkKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiAoIiciLCAnIicsICI9IiwgIjwiKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQtY2hhcmFjdGVyLWluLWF0dHJpYnV0ZS1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFtkYXRhLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFsiXHVGRkZEIiwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtYXR0cmlidXRlLW5hbWUtYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYXR0cmlidXRlTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBsZWF2aW5nVGhpc1N0YXRlID0gVHJ1ZQogICAgICAgIGVtaXRUb2tlbiA9IEZhbHNlCiAgICAgICAgaWYgZGF0YSA9PSAiPSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZVZhbHVlU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSArPSBkYXRhICtcCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKGFzY2lpTGV0dGVycywgVHJ1ZSkKICAgICAgICAgICAgbGVhdmluZ1RoaXNTdGF0ZSA9IEZhbHNlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgIyBYWFggSWYgd2UgZW1pdCBoZXJlIHRoZSBhdHRyaWJ1dGVzIGFyZSBjb252ZXJ0ZWQgdG8gYSBkaWN0CiAgICAgICAgICAgICMgd2l0aG91dCBiZWluZyBjaGVja2VkIGFuZCB3aGVuIHRoZSBjb2RlIGJlbG93IHJ1bnMgd2UgZXJyb3IKICAgICAgICAgICAgIyBiZWNhdXNlIGRhdGEgaXMgYSBkaWN0IG5vdCBhIGxpc3QKICAgICAgICAgICAgZW1pdFRva2VuID0gVHJ1ZQogICAgICAgIGVsaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0gKz0gIlx1RkZGRCIKICAgICAgICAgICAgbGVhdmluZ1RoaXNTdGF0ZSA9IEZhbHNlCiAgICAgICAgZWxpZiBkYXRhIGluICgiJyIsICciJywgIjwiKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQtY2hhcmFjdGVyLWluLWF0dHJpYnV0ZS1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdICs9IGRhdGEKICAgICAgICAgICAgbGVhdmluZ1RoaXNTdGF0ZSA9IEZhbHNlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImVvZi1pbi1hdHRyaWJ1dGUtbmFtZSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSArPSBkYXRhCiAgICAgICAgICAgIGxlYXZpbmdUaGlzU3RhdGUgPSBGYWxzZQoKICAgICAgICBpZiBsZWF2aW5nVGhpc1N0YXRlOgogICAgICAgICAgICAjIEF0dHJpYnV0ZXMgYXJlIG5vdCBkcm9wcGVkIGF0IHRoaXMgc3RhZ2UuIFRoYXQgaGFwcGVucyB3aGVuIHRoZQogICAgICAgICAgICAjIHN0YXJ0IHRhZyB0b2tlbiBpcyBlbWl0dGVkIHNvIHZhbHVlcyBjYW4gc3RpbGwgYmUgc2FmZWx5IGFwcGVuZGVkCiAgICAgICAgICAgICMgdG8gYXR0cmlidXRlcywgYnV0IHdlIGRvIHdhbnQgdG8gcmVwb3J0IHRoZSBwYXJzZSBlcnJvciBpbiB0aW1lLgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSA9ICgKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSkKICAgICAgICAgICAgZm9yIG5hbWUsIF8gaW4gc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVs6LTFdOgogICAgICAgICAgICAgICAgaWYgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0gPT0gbmFtZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXBsaWNhdGUtYXR0cmlidXRlIn0pCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIyBYWFggRml4IGZvciBhYm92ZSBYWFgKICAgICAgICAgICAgaWYgZW1pdFRva2VuOgogICAgICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckF0dHJpYnV0ZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoc3BhY2VDaGFyYWN0ZXJzLCBUcnVlKQogICAgICAgIGVsaWYgZGF0YSA9PSAiPSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZVZhbHVlU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFtkYXRhLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFsiXHVGRkZEIiwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gKCInIiwgJyInLCAiPCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZC1jaGFyYWN0ZXItYWZ0ZXItYXR0cmlidXRlLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWVuZC1vZi10YWctYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmVmb3JlQXR0cmlidXRlVmFsdWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoc3BhY2VDaGFyYWN0ZXJzLCBUcnVlKQogICAgICAgIGVsaWYgZGF0YSA9PSAiXCIiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZURvdWJsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVVblF1b3RlZFN0YXRlCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgZWxpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVTaW5nbGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtdmFsdWUtYnV0LWdvdC1yaWdodC1icmFja2V0In0pCiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gIlx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVVblF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluICgiPSIsICI8IiwgImAiKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVxdWFscy1pbi11bnF1b3RlZC1hdHRyaWJ1dGUtdmFsdWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVVuUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtYXR0cmlidXRlLXZhbHVlLWJ1dC1nb3QtZW9mIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVVblF1b3RlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYXR0cmlidXRlVmFsdWVEb3VibGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiXCIiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckF0dHJpYnV0ZVZhbHVlU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiYiOgogICAgICAgICAgICBzZWxmLnByb2Nlc3NFbnRpdHlJbkF0dHJpYnV0ZSgnIicpCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWF0dHJpYnV0ZS12YWx1ZS1kb3VibGUtcXVvdGUifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YSArXAogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIlwiIiwgIiYiLCAiXHUwMDAwIikpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYXR0cmlidXRlVmFsdWVTaW5nbGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyQXR0cmlidXRlVmFsdWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VudGl0eUluQXR0cmlidXRlKCInIikKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLXNpbmdsZS1xdW90ZSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhICtcCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiJyIsICImIiwgIlx1MDAwMCIpKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGF0dHJpYnV0ZVZhbHVlVW5RdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VudGl0eUluQXR0cmlidXRlKCI+IikKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSBpbiAoJyInLCAiJyIsICI9IiwgIjwiLCAiYCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItaW4tdW5xdW90ZWQtYXR0cmlidXRlLXZhbHVlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLW5vLXF1b3RlcyJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhICsgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgKICAgICAgICAgICAgICAgIGZyb3plbnNldCgoIiYiLCAiPiIsICciJywgIiciLCAiPSIsICI8IiwgImAiLCAiXHUwMDAwIikpIHwgc3BhY2VDaGFyYWN0ZXJzKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyQXR0cmlidXRlVmFsdWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtRU9GLWFmdGVyLWF0dHJpYnV0ZS12YWx1ZSJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItYXR0cmlidXRlLXZhbHVlIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzZWxmQ2xvc2luZyJdID0gVHJ1ZQogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLUVPRi1hZnRlci1zb2xpZHVzLWluLXRhZyJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItc29saWR1cy1pbi10YWcifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYm9ndXNDb21tZW50U3RhdGUoc2VsZik6CiAgICAgICAgIyBNYWtlIGEgbmV3IGNvbW1lbnQgdG9rZW4gYW5kIGdpdmUgaXQgYXMgdmFsdWUgYWxsIHRoZSBjaGFyYWN0ZXJzCiAgICAgICAgIyB1bnRpbCB0aGUgZmlyc3QgPiBvciBFT0YgKGNoYXJzVW50aWwgY2hlY2tzIGZvciBFT0YgYXV0b21hdGljYWxseSkKICAgICAgICAjIGFuZCBlbWl0IGl0LgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCI+IikKICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcdTAwMDAiLCAiXHVGRkZEIikKICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKAogICAgICAgICAgICB7InR5cGUiOiB0b2tlblR5cGVzWyJDb21tZW50Il0sICJkYXRhIjogZGF0YX0pCgogICAgICAgICMgRWF0IHRoZSBjaGFyYWN0ZXIgZGlyZWN0bHkgYWZ0ZXIgdGhlIGJvZ3VzIGNvbW1lbnQgd2hpY2ggaXMgZWl0aGVyIGEKICAgICAgICAjICI+IiBvciBhbiBFT0YuCiAgICAgICAgc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgbWFya3VwRGVjbGFyYXRpb25PcGVuU3RhdGUoc2VsZik6CiAgICAgICAgY2hhclN0YWNrID0gW3NlbGYuc3RyZWFtLmNoYXIoKV0KICAgICAgICBpZiBjaGFyU3RhY2tbLTFdID09ICItIjoKICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyKCkpCiAgICAgICAgICAgIGlmIGNoYXJTdGFja1stMV0gPT0gIi0iOgogICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJDb21tZW50Il0sICJkYXRhIjogIiJ9CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhcnRTdGF0ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIGNoYXJTdGFja1stMV0gaW4gKCdkJywgJ0QnKToKICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgoJ28nLCAnTycpLCAoJ2MnLCAnQycpLCAoJ3QnLCAnVCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgneScsICdZJyksICgncCcsICdQJyksICgnZScsICdFJykpOgogICAgICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyKCkpCiAgICAgICAgICAgICAgICBpZiBjaGFyU3RhY2tbLTFdIG5vdCBpbiBleHBlY3RlZDoKICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBtYXRjaGVkOgogICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJEb2N0eXBlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1YmxpY0lkIjogTm9uZSwgInN5c3RlbUlkIjogTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JyZWN0IjogVHJ1ZX0KICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTdGF0ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIChjaGFyU3RhY2tbLTFdID09ICJbIiBhbmQKICAgICAgICAgICAgICBzZWxmLnBhcnNlciBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICBzZWxmLnBhcnNlci50cmVlLm9wZW5FbGVtZW50cyBhbmQKICAgICAgICAgICAgICBzZWxmLnBhcnNlci50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZXNwYWNlICE9IHNlbGYucGFyc2VyLnRyZWUuZGVmYXVsdE5hbWVzcGFjZSk6CiAgICAgICAgICAgIG1hdGNoZWQgPSBUcnVlCiAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiBbIkMiLCAiRCIsICJBIiwgIlQiLCAiQSIsICJbIl06CiAgICAgICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKICAgICAgICAgICAgICAgIGlmIGNoYXJTdGFja1stMV0gIT0gZXhwZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbWF0Y2hlZDoKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNkYXRhU2VjdGlvblN0YXRlCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1kYXNoZXMtb3ItZG9jdHlwZSJ9KQoKICAgICAgICB3aGlsZSBjaGFyU3RhY2s6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0NvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNvbW1lbnRTdGFydFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXJ0RGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3QtY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNvbW1lbnRTdGFydERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRFbmRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi1cdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY29ycmVjdC1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItIiArIGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudEVuZERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiZW9mLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSBkYXRhICsgXAogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIi0iLCAiXHUwMDAwIikpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudEVuZERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRFbmRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi1cdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudC1lbmQtZGFzaCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItIiArIGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudEVuZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS1cdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiISI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWJhbmctYWZ0ZXItZG91YmxlLWRhc2gtaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50RW5kQmFuZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZGFzaC1hZnRlci1kb3VibGUtZGFzaC1pbi1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gZGF0YQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudC1kb3VibGUtZGFzaCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWAogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS0iICsgZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50RW5kQmFuZ1N0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS0hIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50RW5kRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS0hXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWNvbW1lbnQtZW5kLWJhbmctc3RhdGUifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS0hIiArIGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1kb2N0eXBlLW5hbWUtYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkLXNwYWNlLWFmdGVyLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJlZm9yZURvY3R5cGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWRvY3R5cGUtbmFtZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gPSAiXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWRvY3R5cGUtbmFtZS1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSA9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdID0gc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSA9IHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gKz0gIlx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZS1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdID0gc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSArPSBkYXRhCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJEb2N0eXBlTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgZGF0YSBpbiAoInAiLCAiUCIpOgogICAgICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKICAgICAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoKCJ1IiwgIlUiKSwgKCJiIiwgIkIiKSwgKCJsIiwgIkwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgIkkiKSwgKCJjIiwgIkMiKSk6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgbm90IGluIGV4cGVjdGVkOgogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmIG1hdGNoZWQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlUHVibGljS2V5d29yZFN0YXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxpZiBkYXRhIGluICgicyIsICJTIik6CiAgICAgICAgICAgICAgICBtYXRjaGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgoInkiLCAiWSIpLCAoInMiLCAiUyIpLCAoInQiLCAiVCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImUiLCAiRSIpLCAoIm0iLCAiTSIpKToKICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSBub3QgaW4gZXhwZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgbWF0Y2hlZDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVTeXN0ZW1LZXl3b3JkU3RhdGUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAgICAgIyBBbGwgdGhlIGNoYXJhY3RlcnMgcmVhZCBiZWZvcmUgdGhlIGN1cnJlbnQgJ2RhdGEnIHdpbGwgYmUKICAgICAgICAgICAgIyBbYS16QS1aXSwgc28gdGhleSdyZSBnYXJiYWdlIGluIHRoZSBib2d1cyBkb2N0eXBlIGFuZCBjYW4gYmUKICAgICAgICAgICAgIyBkaXNjYXJkZWQ7IG9ubHkgdGhlIGxhdGVzdCBjaGFyYWN0ZXIgbWlnaHQgYmUgJz4nIG9yIEVPRgogICAgICAgICAgICAjIGFuZCBuZWVkcyB0byBiZSB1bmdldHRlZAogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtc3BhY2Utb3ItcmlnaHQtYnJhY2tldC1pbi1kb2N0eXBlIiwgImRhdGF2YXJzIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJkYXRhIjogZGF0YX19KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJEb2N0eXBlUHVibGljS2V5d29yZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiAoIiciLCAnIicpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJlZm9yZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVB1YmxpY0lkZW50aWZpZXJEb3VibGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBkb2N0eXBlUHVibGljSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gKz0gZGF0YQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsicHVibGljSWQiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdICs9IGRhdGEKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZXR3ZWVuRG9jdHlwZVB1YmxpY0FuZFN5c3RlbUlkZW50aWZpZXJzU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gJyInOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJldHdlZW5Eb2N0eXBlUHVibGljQW5kU3lzdGVtSWRlbnRpZmllcnNTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gJyInOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVTeXN0ZW1LZXl3b3JkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluICgiJyIsICciJyk6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllclNpbmdsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBkb2N0eXBlU3lzdGVtSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gKz0gZGF0YQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdICs9IGRhdGEKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBib2d1c0RvY3R5cGVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgICMgWFhYIEVNSVQKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNkYXRhU2VjdGlvblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBbXQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGRhdGEuYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoIl0iKSkKICAgICAgICAgICAgZGF0YS5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgiPiIpKQogICAgICAgICAgICBjaGFyID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgICAgIGlmIGNoYXIgPT0gRU9GOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBjaGFyID09ICI+IgogICAgICAgICAgICAgICAgaWYgZGF0YVstMV1bLTI6XSA9PSAiXV0iOgogICAgICAgICAgICAgICAgICAgIGRhdGFbLTFdID0gZGF0YVstMV1bOi0yXQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKGNoYXIpCgogICAgICAgIGRhdGEgPSAiIi5qb2luKGRhdGEpICAjIHB5bGludDpkaXNhYmxlPXJlZGVmaW5lZC12YXJpYWJsZS10eXBlCiAgICAgICAgIyBEZWFsIHdpdGggbnVsbCBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBwYXJzZXIKICAgICAgICBudWxsQ291bnQgPSBkYXRhLmNvdW50KCJcdTAwMDAiKQogICAgICAgIGlmIG51bGxDb3VudCA+IDA6CiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKG51bGxDb3VudCk6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlx1MDAwMCIsICJcdUZGRkQiKQogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGRhdGF9KQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlClBLAwQUAAAAAAAAACEA79OvDyEBAAAhAQAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLnB5IGltcG9ydCBUcmllIGFzIFB5VHJpZQoKVHJpZSA9IFB5VHJpZQoKIyBweWxpbnQ6ZGlzYWJsZT13cm9uZy1pbXBvcnQtcG9zaXRpb24KdHJ5OgogICAgZnJvbSAuZGF0cmllIGltcG9ydCBUcmllIGFzIERBVHJpZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCmVsc2U6CiAgICBUcmllID0gREFUcmllCiMgcHlsaW50OmVuYWJsZT13cm9uZy1pbXBvcnQtcG9zaXRpb24KUEsDBBQAAAAAAAAAIQDMlT6W0wMAANMDAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fYmFzZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTWFwcGluZwoKCmNsYXNzIFRyaWUoTWFwcGluZyk6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0cmllcyIiIgoKICAgIGRlZiBrZXlzKHNlbGYsIHByZWZpeD1Ob25lKToKICAgICAgICAjIHB5bGludDpkaXNhYmxlPWFyZ3VtZW50cy1kaWZmZXIKICAgICAgICBrZXlzID0gc3VwZXIoVHJpZSwgc2VsZikua2V5cygpCgogICAgICAgIGlmIHByZWZpeCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gc2V0KGtleXMpCgogICAgICAgICMgUHl0aG9uIDIuNjogbm8gc2V0IGNvbXByZWhlbnNpb25zCiAgICAgICAgcmV0dXJuIHNldChbeCBmb3IgeCBpbiBrZXlzIGlmIHguc3RhcnRzd2l0aChwcmVmaXgpXSkKCiAgICBkZWYgaGFzX2tleXNfd2l0aF9wcmVmaXgoc2VsZiwgcHJlZml4KToKICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5cygpOgogICAgICAgICAgICBpZiBrZXkuc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGxvbmdlc3RfcHJlZml4KHNlbGYsIHByZWZpeCk6CiAgICAgICAgaWYgcHJlZml4IGluIHNlbGY6CiAgICAgICAgICAgIHJldHVybiBwcmVmaXgKCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHByZWZpeCkgKyAxKToKICAgICAgICAgICAgaWYgcHJlZml4WzotaV0gaW4gc2VsZjoKICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXhbOi1pXQoKICAgICAgICByYWlzZSBLZXlFcnJvcihwcmVmaXgpCgogICAgZGVmIGxvbmdlc3RfcHJlZml4X2l0ZW0oc2VsZiwgcHJlZml4KToKICAgICAgICBscHJlZml4ID0gc2VsZi5sb25nZXN0X3ByZWZpeChwcmVmaXgpCiAgICAgICAgcmV0dXJuIChscHJlZml4LCBzZWxmW2xwcmVmaXhdKQpQSwMEFAAAAAAAAAAhACRVnamaBAAAmgQAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL2RhdHJpZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBkYXRyaWUgaW1wb3J0IFRyaWUgYXMgREFUcmllCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmZyb20gLl9iYXNlIGltcG9ydCBUcmllIGFzIEFCQ1RyaWUKCgpjbGFzcyBUcmllKEFCQ1RyaWUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgIGNoYXJzID0gc2V0KCkKICAgICAgICBmb3Iga2V5IGluIGRhdGEua2V5cygpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrZXksIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkFsbCBrZXlzIG11c3QgYmUgc3RyaW5ncyIpCiAgICAgICAgICAgIGZvciBjaGFyIGluIGtleToKICAgICAgICAgICAgICAgIGNoYXJzLmFkZChjaGFyKQoKICAgICAgICBzZWxmLl9kYXRhID0gREFUcmllKCIiLmpvaW4oY2hhcnMpKQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRhdGEuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5fZGF0YVtrZXldID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl9kYXRhCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9kYXRhKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YVtrZXldCgogICAgZGVmIGtleXMoc2VsZiwgcHJlZml4PU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhLmtleXMocHJlZml4KQoKICAgIGRlZiBoYXNfa2V5c193aXRoX3ByZWZpeChzZWxmLCBwcmVmaXgpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhLmhhc19rZXlzX3dpdGhfcHJlZml4KHByZWZpeCkKCiAgICBkZWYgbG9uZ2VzdF9wcmVmaXgoc2VsZiwgcHJlZml4KToKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YS5sb25nZXN0X3ByZWZpeChwcmVmaXgpCgogICAgZGVmIGxvbmdlc3RfcHJlZml4X2l0ZW0oc2VsZiwgcHJlZml4KToKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YS5sb25nZXN0X3ByZWZpeF9pdGVtKHByZWZpeCkKUEsDBBQAAAAAAAAAIQBLT27O7wYAAO8GAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9weS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgpmcm9tIGJpc2VjdCBpbXBvcnQgYmlzZWN0X2xlZnQKCmZyb20gLl9iYXNlIGltcG9ydCBUcmllIGFzIEFCQ1RyaWUKCgpjbGFzcyBUcmllKEFCQ1RyaWUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgIGlmIG5vdCBhbGwoaXNpbnN0YW5jZSh4LCB0ZXh0X3R5cGUpIGZvciB4IGluIGRhdGEua2V5cygpKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJBbGwga2V5cyBtdXN0IGJlIHN0cmluZ3MiKQoKICAgICAgICBzZWxmLl9kYXRhID0gZGF0YQogICAgICAgIHNlbGYuX2tleXMgPSBzb3J0ZWQoZGF0YS5rZXlzKCkpCiAgICAgICAgc2VsZi5fY2FjaGVzdHIgPSAiIgogICAgICAgIHNlbGYuX2NhY2hlcG9pbnRzID0gKDAsIGxlbihkYXRhKSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl9kYXRhCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9kYXRhKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9kYXRhKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhW2tleV0KCiAgICBkZWYga2V5cyhzZWxmLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgaWYgcHJlZml4IGlzIE5vbmUgb3IgcHJlZml4ID09ICIiIG9yIG5vdCBzZWxmLl9rZXlzOgogICAgICAgICAgICByZXR1cm4gc2V0KHNlbGYuX2tleXMpCgogICAgICAgIGlmIHByZWZpeC5zdGFydHN3aXRoKHNlbGYuX2NhY2hlc3RyKToKICAgICAgICAgICAgbG8sIGhpID0gc2VsZi5fY2FjaGVwb2ludHMKICAgICAgICAgICAgc3RhcnQgPSBpID0gYmlzZWN0X2xlZnQoc2VsZi5fa2V5cywgcHJlZml4LCBsbywgaGkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RhcnQgPSBpID0gYmlzZWN0X2xlZnQoc2VsZi5fa2V5cywgcHJlZml4KQoKICAgICAgICBrZXlzID0gc2V0KCkKICAgICAgICBpZiBzdGFydCA9PSBsZW4oc2VsZi5fa2V5cyk6CiAgICAgICAgICAgIHJldHVybiBrZXlzCgogICAgICAgIHdoaWxlIHNlbGYuX2tleXNbaV0uc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICBrZXlzLmFkZChzZWxmLl9rZXlzW2ldKQogICAgICAgICAgICBpICs9IDEKCiAgICAgICAgc2VsZi5fY2FjaGVzdHIgPSBwcmVmaXgKICAgICAgICBzZWxmLl9jYWNoZXBvaW50cyA9IChzdGFydCwgaSkKCiAgICAgICAgcmV0dXJuIGtleXMKCiAgICBkZWYgaGFzX2tleXNfd2l0aF9wcmVmaXgoc2VsZiwgcHJlZml4KToKICAgICAgICBpZiBwcmVmaXggaW4gc2VsZi5fZGF0YToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgaWYgcHJlZml4LnN0YXJ0c3dpdGgoc2VsZi5fY2FjaGVzdHIpOgogICAgICAgICAgICBsbywgaGkgPSBzZWxmLl9jYWNoZXBvaW50cwogICAgICAgICAgICBpID0gYmlzZWN0X2xlZnQoc2VsZi5fa2V5cywgcHJlZml4LCBsbywgaGkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaSA9IGJpc2VjdF9sZWZ0KHNlbGYuX2tleXMsIHByZWZpeCkKCiAgICAgICAgaWYgaSA9PSBsZW4oc2VsZi5fa2V5cyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gc2VsZi5fa2V5c1tpXS5zdGFydHN3aXRoKHByZWZpeCkKUEsDBBQAAAAAAAAAIQAm465YABAAAAAQAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdXRpbHMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBzeXMKZnJvbSB0eXBlcyBpbXBvcnQgTW9kdWxlVHlwZQoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKdHJ5OgogICAgaW1wb3J0IHhtbC5ldHJlZS5jRWxlbWVudFRyZWUgYXMgZGVmYXVsdF9ldHJlZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIGRlZmF1bHRfZXRyZWUKCgpfX2FsbF9fID0gWyJkZWZhdWx0X2V0cmVlIiwgIk1ldGhvZERpc3BhdGNoZXIiLCAiaXNTdXJyb2dhdGVQYWlyIiwKICAgICAgICAgICAic3Vycm9nYXRlUGFpclRvQ29kZXBvaW50IiwgIm1vZHVsZUZhY3RvcnlGYWN0b3J5IiwKICAgICAgICAgICAic3VwcG9ydHNfbG9uZV9zdXJyb2dhdGVzIiwgIlBZMjciXQoKClBZMjcgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIHN5cy52ZXJzaW9uX2luZm9bMV0gPj0gNwoKIyBQbGF0Zm9ybXMgbm90IHN1cHBvcnRpbmcgbG9uZSBzdXJyb2dhdGVzIChcdUQ4MDAtXHVERkZGKSBzaG91bGQgYmUKIyBjYXVnaHQgYnkgdGhlIGJlbG93IHRlc3QuIEluIGdlbmVyYWwgdGhpcyB3b3VsZCBiZSBhbnkgcGxhdGZvcm0KIyB1c2luZyBVVEYtMTYgYXMgaXRzIGVuY29kaW5nIG9mIHVuaWNvZGUgc3RyaW5ncywgc3VjaCBhcwojIEp5dGhvbi4gVGhpcyBpcyBiZWNhdXNlIFVURi0xNiBpdHNlbGYgaXMgYmFzZWQgb24gdGhlIHVzZSBvZiBzdWNoCiMgc3Vycm9nYXRlcywgYW5kIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSB0byBmdXJ0aGVyIGVzY2FwZSBzdWNoCiMgZXNjYXBlcy4KdHJ5OgogICAgX3ggPSBldmFsKCciXFx1RDgwMCInKSAgIyBweWxpbnQ6ZGlzYWJsZT1ldmFsLXVzZWQKICAgIGlmIG5vdCBpc2luc3RhbmNlKF94LCB0ZXh0X3R5cGUpOgogICAgICAgICMgV2UgbmVlZCB0aGlzIHdpdGggdSIiIGJlY2F1c2Ugb2YgaHR0cDovL2J1Z3Muanl0aG9uLm9yZy9pc3N1ZTIwMzkKICAgICAgICBfeCA9IGV2YWwoJ3UiXFx1RDgwMCInKSAgIyBweWxpbnQ6ZGlzYWJsZT1ldmFsLXVzZWQKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShfeCwgdGV4dF90eXBlKQpleGNlcHQ6ICAjIHB5bGludDpkaXNhYmxlPWJhcmUtZXhjZXB0CiAgICBzdXBwb3J0c19sb25lX3N1cnJvZ2F0ZXMgPSBGYWxzZQplbHNlOgogICAgc3VwcG9ydHNfbG9uZV9zdXJyb2dhdGVzID0gVHJ1ZQoKCmNsYXNzIE1ldGhvZERpc3BhdGNoZXIoZGljdCk6CiAgICAiIiJEaWN0IHdpdGggMiBzcGVjaWFsIHByb3BlcnRpZXM6CgogICAgT24gaW5pdGlhdGlvbiwga2V5cyB0aGF0IGFyZSBsaXN0cywgc2V0cyBvciB0dXBsZXMgYXJlIGNvbnZlcnRlZCB0bwogICAgbXVsdGlwbGUga2V5cyBzbyBhY2Nlc3NpbmcgYW55IG9uZSBvZiB0aGUgaXRlbXMgaW4gdGhlIG9yaWdpbmFsCiAgICBsaXN0LWxpa2Ugb2JqZWN0IHJldHVybnMgdGhlIG1hdGNoaW5nIHZhbHVlCgogICAgbWQgPSBNZXRob2REaXNwYXRjaGVyKHsoImZvbyIsICJiYXIiKToiYmF6In0pCiAgICBtZFsiZm9vIl0gPT0gImJheiIKCiAgICBBIGRlZmF1bHQgdmFsdWUgd2hpY2ggY2FuIGJlIHNldCB0aHJvdWdoIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVtcz0oKSk6CiAgICAgICAgIyBVc2luZyBfZGljdEVudHJpZXMgaW5zdGVhZCBvZiBkaXJlY3RseSBhc3NpZ25pbmcgdG8gc2VsZiBpcyBhYm91dAogICAgICAgICMgdHdpY2UgYXMgZmFzdC4gUGxlYXNlIGRvIGNhcmVmdWwgcGVyZm9ybWFuY2UgdGVzdGluZyBiZWZvcmUgY2hhbmdpbmcKICAgICAgICAjIGFueXRoaW5nIGhlcmUuCiAgICAgICAgX2RpY3RFbnRyaWVzID0gW10KICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gaXRlbXM6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgKGxpc3QsIHR1cGxlLCBmcm96ZW5zZXQsIHNldCkpOgogICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbmFtZToKICAgICAgICAgICAgICAgICAgICBfZGljdEVudHJpZXMuYXBwZW5kKChpdGVtLCB2YWx1ZSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBfZGljdEVudHJpZXMuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCiAgICAgICAgZGljdC5fX2luaXRfXyhzZWxmLCBfZGljdEVudHJpZXMpCiAgICAgICAgYXNzZXJ0IGxlbihzZWxmKSA9PSBsZW4oX2RpY3RFbnRyaWVzKQogICAgICAgIHNlbGYuZGVmYXVsdCA9IE5vbmUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gZGljdC5nZXQoc2VsZiwga2V5LCBzZWxmLmRlZmF1bHQpCgoKIyBTb21lIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCB3ZWlyZG5lc3MgYXJvdW5kIFVDUzIgdnMgVUNTNAojIHB5dGhvbiBidWlsZHMKCmRlZiBpc1N1cnJvZ2F0ZVBhaXIoZGF0YSk6CiAgICByZXR1cm4gKGxlbihkYXRhKSA9PSAyIGFuZAogICAgICAgICAgICBvcmQoZGF0YVswXSkgPj0gMHhEODAwIGFuZCBvcmQoZGF0YVswXSkgPD0gMHhEQkZGIGFuZAogICAgICAgICAgICBvcmQoZGF0YVsxXSkgPj0gMHhEQzAwIGFuZCBvcmQoZGF0YVsxXSkgPD0gMHhERkZGKQoKCmRlZiBzdXJyb2dhdGVQYWlyVG9Db2RlcG9pbnQoZGF0YSk6CiAgICBjaGFyX3ZhbCA9ICgweDEwMDAwICsgKG9yZChkYXRhWzBdKSAtIDB4RDgwMCkgKiAweDQwMCArCiAgICAgICAgICAgICAgICAob3JkKGRhdGFbMV0pIC0gMHhEQzAwKSkKICAgIHJldHVybiBjaGFyX3ZhbAoKIyBNb2R1bGUgRmFjdG9yeSBGYWN0b3J5IChubywgdGhpcyBpc24ndCBKYXZhLCBJIGtub3cpCiMgSGVyZSB0byBzdG9wIHRoaXMgYmVpbmcgZHVwbGljYXRlZCBhbGwgb3ZlciB0aGUgcGxhY2UuCgoKZGVmIG1vZHVsZUZhY3RvcnlGYWN0b3J5KGZhY3RvcnkpOgogICAgbW9kdWxlQ2FjaGUgPSB7fQoKICAgIGRlZiBtb2R1bGVGYWN0b3J5KGJhc2VNb2R1bGUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShNb2R1bGVUeXBlLl9fbmFtZV9fLCB0eXBlKCIiKSk6CiAgICAgICAgICAgIG5hbWUgPSAiXyVzX2ZhY3RvcnkiICUgYmFzZU1vZHVsZS5fX25hbWVfXwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSBiIl8lc19mYWN0b3J5IiAlIGJhc2VNb2R1bGUuX19uYW1lX18KCiAgICAgICAga3dhcmdzX3R1cGxlID0gdHVwbGUoa3dhcmdzLml0ZW1zKCkpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdW2t3YXJnc190dXBsZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIG1vZCA9IE1vZHVsZVR5cGUobmFtZSkKICAgICAgICAgICAgb2JqcyA9IGZhY3RvcnkoYmFzZU1vZHVsZSwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBtb2QuX19kaWN0X18udXBkYXRlKG9ianMpCiAgICAgICAgICAgIGlmICJuYW1lIiBub3QgaW4gbW9kdWxlQ2FjaGU6CiAgICAgICAgICAgICAgICBtb2R1bGVDYWNoZVtuYW1lXSA9IHt9CiAgICAgICAgICAgIGlmICJhcmdzIiBub3QgaW4gbW9kdWxlQ2FjaGVbbmFtZV06CiAgICAgICAgICAgICAgICBtb2R1bGVDYWNoZVtuYW1lXVthcmdzXSA9IHt9CiAgICAgICAgICAgIGlmICJrd2FyZ3MiIG5vdCBpbiBtb2R1bGVDYWNoZVtuYW1lXVthcmdzXToKICAgICAgICAgICAgICAgIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdW2t3YXJnc190dXBsZV0gPSB7fQogICAgICAgICAgICBtb2R1bGVDYWNoZVtuYW1lXVthcmdzXVtrd2FyZ3NfdHVwbGVdID0gbW9kCiAgICAgICAgICAgIHJldHVybiBtb2QKCiAgICByZXR1cm4gbW9kdWxlRmFjdG9yeQoKCmRlZiBtZW1vaXplKGZ1bmMpOgogICAgY2FjaGUgPSB7fQoKICAgIGRlZiB3cmFwcGVkKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAga2V5ID0gKHR1cGxlKGFyZ3MpLCB0dXBsZShrd2FyZ3MuaXRlbXMoKSkpCiAgICAgICAgaWYga2V5IG5vdCBpbiBjYWNoZToKICAgICAgICAgICAgY2FjaGVba2V5XSA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBjYWNoZVtrZXldCgogICAgcmV0dXJuIHdyYXBwZWQKUEsDBBQAAAAAAAAAIQDIpH3+u0UBALtFAQA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9jb25zdGFudHMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBzdHJpbmcKCkVPRiA9IE5vbmUKCkUgPSB7CiAgICAibnVsbC1jaGFyYWN0ZXIiOgogICAgICAgICJOdWxsIGNoYXJhY3RlciBpbiBpbnB1dCBzdHJlYW0sIHJlcGxhY2VkIHdpdGggVStGRkZELiIsCiAgICAiaW52YWxpZC1jb2RlcG9pbnQiOgogICAgICAgICJJbnZhbGlkIGNvZGVwb2ludCBpbiBzdHJlYW0uIiwKICAgICJpbmNvcnJlY3RseS1wbGFjZWQtc29saWR1cyI6CiAgICAgICAgIlNvbGlkdXMgKC8pIGluY29ycmVjdGx5IHBsYWNlZCBpbiB0YWcuIiwKICAgICJpbmNvcnJlY3QtY3ItbmV3bGluZS1lbnRpdHkiOgogICAgICAgICJJbmNvcnJlY3QgQ1IgbmV3bGluZSBlbnRpdHksIHJlcGxhY2VkIHdpdGggTEYuIiwKICAgICJpbGxlZ2FsLXdpbmRvd3MtMTI1Mi1lbnRpdHkiOgogICAgICAgICJFbnRpdHkgdXNlZCB3aXRoIGlsbGVnYWwgbnVtYmVyICh3aW5kb3dzLTEyNTIgcmVmZXJlbmNlKS4iLAogICAgImNhbnQtY29udmVydC1udW1lcmljLWVudGl0eSI6CiAgICAgICAgIk51bWVyaWMgZW50aXR5IGNvdWxkbid0IGJlIGNvbnZlcnRlZCB0byBjaGFyYWN0ZXIgIgogICAgICAgICIoY29kZXBvaW50IFUrJShjaGFyQXNJbnQpMDh4KS4iLAogICAgImlsbGVnYWwtY29kZXBvaW50LWZvci1udW1lcmljLWVudGl0eSI6CiAgICAgICAgIk51bWVyaWMgZW50aXR5IHJlcHJlc2VudHMgYW4gaWxsZWdhbCBjb2RlcG9pbnQ6ICIKICAgICAgICAiVSslKGNoYXJBc0ludCkwOHguIiwKICAgICJudW1lcmljLWVudGl0eS13aXRob3V0LXNlbWljb2xvbiI6CiAgICAgICAgIk51bWVyaWMgZW50aXR5IGRpZG4ndCBlbmQgd2l0aCAnOycuIiwKICAgICJleHBlY3RlZC1udW1lcmljLWVudGl0eS1idXQtZ290LWVvZiI6CiAgICAgICAgIk51bWVyaWMgZW50aXR5IGV4cGVjdGVkLiBHb3QgZW5kIG9mIGZpbGUgaW5zdGVhZC4iLAogICAgImV4cGVjdGVkLW51bWVyaWMtZW50aXR5IjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgZXhwZWN0ZWQgYnV0IG5vbmUgZm91bmQuIiwKICAgICJuYW1lZC1lbnRpdHktd2l0aG91dC1zZW1pY29sb24iOgogICAgICAgICJOYW1lZCBlbnRpdHkgZGlkbid0IGVuZCB3aXRoICc7Jy4iLAogICAgImV4cGVjdGVkLW5hbWVkLWVudGl0eSI6CiAgICAgICAgIk5hbWVkIGVudGl0eSBleHBlY3RlZC4gR290IG5vbmUuIiwKICAgICJhdHRyaWJ1dGVzLWluLWVuZC10YWciOgogICAgICAgICJFbmQgdGFnIGNvbnRhaW5zIHVuZXhwZWN0ZWQgYXR0cmlidXRlcy4iLAogICAgJ3NlbGYtY2xvc2luZy1mbGFnLW9uLWVuZC10YWcnOgogICAgICAgICJFbmQgdGFnIGNvbnRhaW5zIHVuZXhwZWN0ZWQgc2VsZi1jbG9zaW5nIGZsYWcuIiwKICAgICJleHBlY3RlZC10YWctbmFtZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQiOgogICAgICAgICJFeHBlY3RlZCB0YWcgbmFtZS4gR290ICc+JyBpbnN0ZWFkLiIsCiAgICAiZXhwZWN0ZWQtdGFnLW5hbWUtYnV0LWdvdC1xdWVzdGlvbi1tYXJrIjoKICAgICAgICAiRXhwZWN0ZWQgdGFnIG5hbWUuIEdvdCAnPycgaW5zdGVhZC4gKEhUTUwgZG9lc24ndCAiCiAgICAgICAgInN1cHBvcnQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMuKSIsCiAgICAiZXhwZWN0ZWQtdGFnLW5hbWUiOgogICAgICAgICJFeHBlY3RlZCB0YWcgbmFtZS4gR290IHNvbWV0aGluZyBlbHNlIGluc3RlYWQiLAogICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCI6CiAgICAgICAgIkV4cGVjdGVkIGNsb3NpbmcgdGFnLiBHb3QgJz4nIGluc3RlYWQuIElnbm9yaW5nICc8Lz4nLiIsCiAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1lb2YiOgogICAgICAgICJFeHBlY3RlZCBjbG9zaW5nIHRhZy4gVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4iLAogICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtY2hhciI6CiAgICAgICAgIkV4cGVjdGVkIGNsb3NpbmcgdGFnLiBVbmV4cGVjdGVkIGNoYXJhY3RlciAnJShkYXRhKXMnIGZvdW5kLiIsCiAgICAiZW9mLWluLXRhZy1uYW1lIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiB0aGUgdGFnIG5hbWUuIiwKICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtbmFtZS1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGF0dHJpYnV0ZSBuYW1lIGluc3RlYWQuIiwKICAgICJlb2YtaW4tYXR0cmlidXRlLW5hbWUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGF0dHJpYnV0ZSBuYW1lLiIsCiAgICAiaW52YWxpZC1jaGFyYWN0ZXItaW4tYXR0cmlidXRlLW5hbWUiOgogICAgICAgICJJbnZhbGlkIGNoYXJhY3RlciBpbiBhdHRyaWJ1dGUgbmFtZSIsCiAgICAiZHVwbGljYXRlLWF0dHJpYnV0ZSI6CiAgICAgICAgIkRyb3BwZWQgZHVwbGljYXRlIGF0dHJpYnV0ZSBvbiB0YWcuIiwKICAgICJleHBlY3RlZC1lbmQtb2YtdGFnLW5hbWUtYnV0LWdvdC1lb2YiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCA9IG9yIGVuZCBvZiB0YWcuIiwKICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtdmFsdWUtYnV0LWdvdC1lb2YiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBhdHRyaWJ1dGUgdmFsdWUuIiwKICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtdmFsdWUtYnV0LWdvdC1yaWdodC1icmFja2V0IjoKICAgICAgICAiRXhwZWN0ZWQgYXR0cmlidXRlIHZhbHVlLiBHb3QgJz4nIGluc3RlYWQuIiwKICAgICdlcXVhbHMtaW4tdW5xdW90ZWQtYXR0cmlidXRlLXZhbHVlJzoKICAgICAgICAiVW5leHBlY3RlZCA9IGluIHVucXVvdGVkIGF0dHJpYnV0ZSIsCiAgICAndW5leHBlY3RlZC1jaGFyYWN0ZXItaW4tdW5xdW90ZWQtYXR0cmlidXRlLXZhbHVlJzoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gdW5xdW90ZWQgYXR0cmlidXRlIiwKICAgICJpbnZhbGlkLWNoYXJhY3Rlci1hZnRlci1hdHRyaWJ1dGUtbmFtZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGF0dHJpYnV0ZSBuYW1lLiIsCiAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItYXR0cmlidXRlLXZhbHVlIjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgYXR0cmlidXRlIHZhbHVlLiIsCiAgICAiZW9mLWluLWF0dHJpYnV0ZS12YWx1ZS1kb3VibGUtcXVvdGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGF0dHJpYnV0ZSB2YWx1ZSAoXCIpLiIsCiAgICAiZW9mLWluLWF0dHJpYnV0ZS12YWx1ZS1zaW5nbGUtcXVvdGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGF0dHJpYnV0ZSB2YWx1ZSAoJykuIiwKICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLW5vLXF1b3RlcyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gYXR0cmlidXRlIHZhbHVlLiIsCiAgICAidW5leHBlY3RlZC1FT0YtYWZ0ZXItc29saWR1cy1pbi10YWciOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIHRhZy4gRXhwZWN0ZWQgPiIsCiAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItc29saWR1cy1pbi10YWciOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciAvIGluIHRhZy4gRXhwZWN0ZWQgPiIsCiAgICAiZXhwZWN0ZWQtZGFzaGVzLW9yLWRvY3R5cGUiOgogICAgICAgICJFeHBlY3RlZCAnLS0nIG9yICdET0NUWVBFJy4gTm90IGZvdW5kLiIsCiAgICAidW5leHBlY3RlZC1iYW5nLWFmdGVyLWRvdWJsZS1kYXNoLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkICEgYWZ0ZXIgLS0gaW4gY29tbWVudCIsCiAgICAidW5leHBlY3RlZC1zcGFjZS1hZnRlci1kb3VibGUtZGFzaC1pbi1jb21tZW50IjoKICAgICAgICAiVW5leHBlY3RlZCBzcGFjZSBhZnRlciAtLSBpbiBjb21tZW50IiwKICAgICJpbmNvcnJlY3QtY29tbWVudCI6CiAgICAgICAgIkluY29ycmVjdCBjb21tZW50LiIsCiAgICAiZW9mLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGNvbW1lbnQuIiwKICAgICJlb2YtaW4tY29tbWVudC1lbmQtZGFzaCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gY29tbWVudCAoLSkiLAogICAgInVuZXhwZWN0ZWQtZGFzaC1hZnRlci1kb3VibGUtZGFzaC1pbi1jb21tZW50IjoKICAgICAgICAiVW5leHBlY3RlZCAnLScgYWZ0ZXIgJy0tJyBmb3VuZCBpbiBjb21tZW50LiIsCiAgICAiZW9mLWluLWNvbW1lbnQtZG91YmxlLWRhc2giOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGNvbW1lbnQgKC0tKS4iLAogICAgImVvZi1pbi1jb21tZW50LWVuZC1zcGFjZS1zdGF0ZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gY29tbWVudC4iLAogICAgImVvZi1pbi1jb21tZW50LWVuZC1iYW5nLXN0YXRlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBjb21tZW50LiIsCiAgICAidW5leHBlY3RlZC1jaGFyLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBpbiBjb21tZW50IGZvdW5kLiIsCiAgICAibmVlZC1zcGFjZS1hZnRlci1kb2N0eXBlIjoKICAgICAgICAiTm8gc3BhY2UgYWZ0ZXIgbGl0ZXJhbCBzdHJpbmcgJ0RPQ1RZUEUnLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1uYW1lLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgPiBjaGFyYWN0ZXIuIEV4cGVjdGVkIERPQ1RZUEUgbmFtZS4iLAogICAgImV4cGVjdGVkLWRvY3R5cGUtbmFtZS1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIERPQ1RZUEUgbmFtZS4iLAogICAgImVvZi1pbi1kb2N0eXBlLW5hbWUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIERPQ1RZUEUgbmFtZS4iLAogICAgImVvZi1pbi1kb2N0eXBlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBET0NUWVBFLiIsCiAgICAiZXhwZWN0ZWQtc3BhY2Utb3ItcmlnaHQtYnJhY2tldC1pbi1kb2N0eXBlIjoKICAgICAgICAiRXhwZWN0ZWQgc3BhY2Ugb3IgJz4nLiBHb3QgJyUoZGF0YSlzJyIsCiAgICAidW5leHBlY3RlZC1lbmQtb2YtZG9jdHlwZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIERPQ1RZUEUuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGluIERPQ1RZUEUuIiwKICAgICJlb2YtaW4taW5uZXJodG1sIjoKICAgICAgICAiWFhYIGlubmVySFRNTCBFT0YiLAogICAgInVuZXhwZWN0ZWQtZG9jdHlwZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgRE9DVFlQRS4gSWdub3JlZC4iLAogICAgIm5vbi1odG1sLXJvb3QiOgogICAgICAgICJodG1sIG5lZWRzIHRvIGJlIHRoZSBmaXJzdCBzdGFydCB0YWcuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBFbmQgb2YgZmlsZS4gRXhwZWN0ZWQgRE9DVFlQRS4iLAogICAgInVua25vd24tZG9jdHlwZSI6CiAgICAgICAgIkVycm9uZW91cyBET0NUWVBFLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LWNoYXJzIjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVycy4gRXhwZWN0ZWQgRE9DVFlQRS4iLAogICAgImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1zdGFydC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpLiBFeHBlY3RlZCBET0NUWVBFLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LWVuZC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKS4gRXhwZWN0ZWQgRE9DVFlQRS4iLAogICAgImVuZC10YWctYWZ0ZXItaW1wbGllZC1yb290IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgYWZ0ZXIgdGhlIChpbXBsaWVkKSByb290IGVsZW1lbnQuIiwKICAgICJleHBlY3RlZC1uYW1lZC1jbG9zaW5nLXRhZy1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKS4iLAogICAgInR3by1oZWFkcy1hcmUtbm90LWJldHRlci10aGFuLW9uZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnIGhlYWQgaW4gZXhpc3RpbmcgaGVhZC4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctb3V0LW9mLW15LWhlYWQiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpIHRoYXQgY2FuIGJlIGluIGhlYWQuIE1vdmVkLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpLiIsCiAgICAibWlzc2luZy1lbmQtdGFnIjoKICAgICAgICAiTWlzc2luZyBlbmQgdGFnICglKG5hbWUpcykuIiwKICAgICJtaXNzaW5nLWVuZC10YWdzIjoKICAgICAgICAiTWlzc2luZyBlbmQgdGFncyAoJShuYW1lKXMpLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctaW1wbGllcy1lbmQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUoc3RhcnROYW1lKXMpICIKICAgICAgICAiaW1wbGllcyBlbmQgdGFnICglKGVuZE5hbWUpcykuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy10cmVhdGVkLWFzIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUob3JpZ2luYWxOYW1lKXMpLiBUcmVhdGVkIGFzICUobmV3TmFtZSlzLiIsCiAgICAiZGVwcmVjYXRlZC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAlKG5hbWUpcy4gRG9uJ3QgdXNlIGl0ISIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctaWdub3JlZCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICUobmFtZSlzLiBJZ25vcmVkLiIsCiAgICAiZXhwZWN0ZWQtb25lLWVuZC10YWctYnV0LWdvdC1hbm90aGVyIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKGdvdE5hbWUpcykuICIKICAgICAgICAiTWlzc2luZyBlbmQgdGFnICglKGV4cGVjdGVkTmFtZSlzKS4iLAogICAgImVuZC10YWctdG9vLWVhcmx5IjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHNlZW4gdG9vIGVhcmx5LiBFeHBlY3RlZCBvdGhlciBlbmQgdGFnLiIsCiAgICAiZW5kLXRhZy10b28tZWFybHktbmFtZWQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUoZ290TmFtZSlzKS4gRXhwZWN0ZWQgZW5kIHRhZyAoJShleHBlY3RlZE5hbWUpcykuIiwKICAgICJlbmQtdGFnLXRvby1lYXJseS1pZ25vcmVkIjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHNlZW4gdG9vIGVhcmx5LiBJZ25vcmVkLiIsCiAgICAiYWRvcHRpb24tYWdlbmN5LTEuMSI6CiAgICAgICAgIkVuZCB0YWcgKCUobmFtZSlzKSB2aW9sYXRlcyBzdGVwIDEsICIKICAgICAgICAicGFyYWdyYXBoIDEgb2YgdGhlIGFkb3B0aW9uIGFnZW5jeSBhbGdvcml0aG0uIiwKICAgICJhZG9wdGlvbi1hZ2VuY3ktMS4yIjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHZpb2xhdGVzIHN0ZXAgMSwgIgogICAgICAgICJwYXJhZ3JhcGggMiBvZiB0aGUgYWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobS4iLAogICAgImFkb3B0aW9uLWFnZW5jeS0xLjMiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgdmlvbGF0ZXMgc3RlcCAxLCAiCiAgICAgICAgInBhcmFncmFwaCAzIG9mIHRoZSBhZG9wdGlvbiBhZ2VuY3kgYWxnb3JpdGhtLiIsCiAgICAiYWRvcHRpb24tYWdlbmN5LTQuNCI6CiAgICAgICAgIkVuZCB0YWcgKCUobmFtZSlzKSB2aW9sYXRlcyBzdGVwIDQsICIKICAgICAgICAicGFyYWdyYXBoIDQgb2YgdGhlIGFkb3B0aW9uIGFnZW5jeSBhbGdvcml0aG0uIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctdHJlYXRlZC1hcyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShvcmlnaW5hbE5hbWUpcykuIFRyZWF0ZWQgYXMgJShuZXdOYW1lKXMuIiwKICAgICJuby1lbmQtdGFnIjoKICAgICAgICAiVGhpcyBlbGVtZW50ICglKG5hbWUpcykgaGFzIG5vIGVuZCB0YWcuIiwKICAgICJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgaW1wbGllZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUtYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgaW1wbGllZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItaW1wbGllcy10YWJsZS12b29kb28iOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXJzIGluICIKICAgICAgICAidGFibGUgY29udGV4dCBjYXVzZWQgdm9vZG9vIG1vZGUuIiwKICAgICJ1bmV4cGVjdGVkLWhpZGRlbi1pbnB1dC1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgaW5wdXQgd2l0aCB0eXBlIGhpZGRlbiBpbiB0YWJsZSBjb250ZXh0LiIsCiAgICAidW5leHBlY3RlZC1mb3JtLWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCBmb3JtIGluIHRhYmxlIGNvbnRleHQuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLXRhYmxlLXZvb2RvbyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykgaW4gIgogICAgICAgICJ0YWJsZSBjb250ZXh0IGNhdXNlZCB2b29kb28gbW9kZS4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbXBsaWVzLXRhYmxlLXZvb2RvbyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIGluICIKICAgICAgICAidGFibGUgY29udGV4dCBjYXVzZWQgdm9vZG9vIG1vZGUuIiwKICAgICJ1bmV4cGVjdGVkLWNlbGwtaW4tdGFibGUtYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgdGFibGUgY2VsbCBzdGFydCB0YWcgKCUobmFtZSlzKSAiCiAgICAgICAgImluIHRoZSB0YWJsZSBib2R5IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1jZWxsLWVuZC10YWciOgogICAgICAgICJHb3QgdGFibGUgY2VsbCBlbmQgdGFnICglKG5hbWUpcykgIgogICAgICAgICJ3aGlsZSByZXF1aXJlZCBlbmQgdGFncyBhcmUgbWlzc2luZy4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIGJvZHkgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZS1yb3ciOgogICAgICAgICJVbmV4cGVjdGVkIGltcGxpZWQgZW5kIHRhZyAoJShuYW1lKXMpIGluIHRoZSB0YWJsZSByb3cgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctaW4tdGFibGUtcm93IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIHJvdyBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtc2VsZWN0LWluLXNlbGVjdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc2VsZWN0IHN0YXJ0IHRhZyBpbiB0aGUgc2VsZWN0IHBoYXNlICIKICAgICAgICAidHJlYXRlZCBhcyBzZWxlY3QgZW5kIHRhZy4iLAogICAgInVuZXhwZWN0ZWQtaW5wdXQtaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBpbnB1dCBzdGFydCB0YWcgaW4gdGhlIHNlbGVjdCBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWluLXNlbGVjdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnIHRva2VuICglKG5hbWUpcyBpbiB0aGUgc2VsZWN0IHBoYXNlLiAiCiAgICAgICAgIklnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHNlbGVjdCBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtdGFibGUtZWxlbWVudC1zdGFydC10YWctaW4tc2VsZWN0LWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCB0YWJsZSBlbGVtZW50IHN0YXJ0IHRhZyAoJShuYW1lKXMpIGluIHRoZSBzZWxlY3QgaW4gdGFibGUgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLXRhYmxlLWVsZW1lbnQtZW5kLXRhZy1pbi1zZWxlY3QtaW4tdGFibGUiOgogICAgICAgICJVbmV4cGVjdGVkIHRhYmxlIGVsZW1lbnQgZW5kIHRhZyAoJShuYW1lKXMpIGluIHRoZSBzZWxlY3QgaW4gdGFibGUgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItYWZ0ZXItYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlIGFmdGVyIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1hZnRlci1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgdG9rZW4gKCUobmFtZSlzKSIKICAgICAgICAiIGluIHRoZSBhZnRlciBib2R5IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWJvZHkiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgdG9rZW4gKCUobmFtZSlzKSIKICAgICAgICAiIGluIHRoZSBhZnRlciBib2R5IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1jaGFyLWluLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGluIHRoZSBmcmFtZXNldCBwaGFzZS4gQ2hhcmFjdGVycyBpZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctaW4tZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyB0b2tlbiAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1mcmFtZXNldC1pbi1mcmFtZXNldC1pbm5lcmh0bWwiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgdG9rZW4gKGZyYW1lc2V0KSAiCiAgICAgICAgImluIHRoZSBmcmFtZXNldCBwaGFzZSAoaW5uZXJIVE1MKS4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyB0b2tlbiAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1jaGFyLWFmdGVyLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgIgogICAgICAgICJhZnRlciBmcmFtZXNldCBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWFmdGVyLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUobmFtZSlzKSIKICAgICAgICAiIGluIHRoZSBhZnRlciBmcmFtZXNldCBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1hZnRlci1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGFmdGVyIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWJvZHktaW5uZXJodG1sIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnIGFmdGVyIGJvZHkoaW5uZXJIdG1sKSIsCiAgICAiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtY2hhciI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3RlcnMuIEV4cGVjdGVkIGVuZCBvZiBmaWxlLiIsCiAgICAiZXhwZWN0ZWQtZW9mLWJ1dC1nb3Qtc3RhcnQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUobmFtZSlzKSIKICAgICAgICAiLiBFeHBlY3RlZCBlbmQgb2YgZmlsZS4iLAogICAgImV4cGVjdGVkLWVvZi1idXQtZ290LWVuZC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSIKICAgICAgICAiLiBFeHBlY3RlZCBlbmQgb2YgZmlsZS4iLAogICAgImVvZi1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIHRhYmxlIGNvbnRlbnQuIiwKICAgICJlb2YtaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgc2VsZWN0IGNvbnRlbnQuIiwKICAgICJlb2YtaW4tZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBmcmFtZXNldCBjb250ZW50LiIsCiAgICAiZW9mLWluLXNjcmlwdC1pbi1zY3JpcHQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBzY3JpcHQgY29udGVudC4iLAogICAgImVvZi1pbi1mb3JlaWduLWxhbmRzIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgZm9yZWlnbiBjb250ZW50IiwKICAgICJub24tdm9pZC1lbGVtZW50LXdpdGgtdHJhaWxpbmctc29saWR1cyI6CiAgICAgICAgIlRyYWlsaW5nIHNvbGlkdXMgbm90IGFsbG93ZWQgb24gZWxlbWVudCAlKG5hbWUpcyIsCiAgICAidW5leHBlY3RlZC1odG1sLWVsZW1lbnQtaW4tZm9yZWlnbi1jb250ZW50IjoKICAgICAgICAiRWxlbWVudCAlKG5hbWUpcyBub3QgYWxsb3dlZCBpbiBhIG5vbi1odG1sIGNvbnRleHQiLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1iZWZvcmUtaHRtbCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIGJlZm9yZSBodG1sLiIsCiAgICAidW5leHBlY3RlZC1pbmhlYWQtbm9zY3JpcHQtdGFnIjoKICAgICAgICAiRWxlbWVudCAlKG5hbWUpcyBub3QgYWxsb3dlZCBpbiBhIGluaGVhZC1ub3NjcmlwdCBjb250ZXh0IiwKICAgICJlb2YtaW4taGVhZC1ub3NjcmlwdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGluaGVhZC1ub3NjcmlwdCBjb250ZW50IiwKICAgICJjaGFyLWluLWhlYWQtbm9zY3JpcHQiOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXIuIEV4cGVjdGVkIGluaGVhZC1ub3NjcmlwdCBjb250ZW50IiwKICAgICJYWFgtdW5kZWZpbmVkLWVycm9yIjoKICAgICAgICAiVW5kZWZpbmVkIGVycm9yICh0aGlzIHN1Y2tzIGFuZCBzaG91bGQgYmUgZml4ZWQpIiwKfQoKbmFtZXNwYWNlcyA9IHsKICAgICJodG1sIjogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLAogICAgIm1hdGhtbCI6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIiwKICAgICJzdmciOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgInhsaW5rIjogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLAogICAgInhtbCI6ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAogICAgInhtbG5zIjogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgp9CgpzY29waW5nRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFwcGxldCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNhcHRpb24iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJodG1sIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibWFycXVlZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm9iamVjdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRhYmxlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0aCIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibWkiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1vIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtbiIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibXMiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm10ZXh0IiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJhbm5vdGF0aW9uLXhtbCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZm9yZWlnbk9iamVjdCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZGVzYyIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAidGl0bGUiKSwKXSkKCmZvcm1hdHRpbmdFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJiaWciKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjb2RlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZW0iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmb250IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5vYnIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic21hbGwiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzdHJpa2UiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzdHJvbmciKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0dCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInUiKQpdKQoKc3BlY2lhbEVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhZGRyZXNzIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYXBwbGV0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYXJlYSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFydGljbGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhc2lkZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJhc2UiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJiYXNlZm9udCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJnc291bmQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJibG9ja3F1b3RlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYm9keSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYnV0dG9uIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY2FwdGlvbiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNlbnRlciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNvbCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNvbGdyb3VwIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY29tbWFuZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImRkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGV0YWlscyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImRpciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImRpdiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImRsIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZHQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJlbWJlZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZpZWxkc2V0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZmlndXJlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZm9vdGVyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZm9ybSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZyYW1lIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZnJhbWVzZXQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoMSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImgyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDMiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoNCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImg1IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDYiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoZWFkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaGVhZGVyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaHIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJodG1sIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaWZyYW1lIiksCiAgICAjIE5vdGUgdGhhdCBpbWFnZSBpcyBjb21tZW50ZWQgb3V0IGluIHRoZSBzcGVjIGFzICJ0aGlzIGlzbid0IGFuCiAgICAjIGVsZW1lbnQgdGhhdCBjYW4gZW5kIHVwIG9uIHRoZSBzdGFjaywgc28gaXQgZG9lc24ndCBtYXR0ZXIsIgogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImltYWdlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaW1nIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaW5wdXQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpc2luZGV4IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibGkiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJsaW5rIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibGlzdGluZyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm1hcnF1ZWUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJtZW51IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibWV0YSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5hdiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5vZW1iZWQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJub2ZyYW1lcyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5vc2NyaXB0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAib2JqZWN0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAib2wiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJwIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAicGFyYW0iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJwbGFpbnRleHQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJwcmUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzY3JpcHQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzZWN0aW9uIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic2VsZWN0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic3R5bGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0YWJsZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRib2R5IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0ZXh0YXJlYSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRmb290IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGgiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0aGVhZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRpdGxlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidHIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ1bCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIndiciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInhtcCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZm9yZWlnbk9iamVjdCIpCl0pCgpodG1sSW50ZWdyYXRpb25Qb2ludEVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgImFubm90YWlvbi14bWwiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgImZvcmVpZ25PYmplY3QiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgImRlc2MiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgInRpdGxlIikKXSkKCm1hdGhtbFRleHRJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibWkiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1vIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtbiIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibXMiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm10ZXh0IikKXSkKCmFkanVzdFNWR0F0dHJpYnV0ZXMgPSB7CiAgICAiYXR0cmlidXRlbmFtZSI6ICJhdHRyaWJ1dGVOYW1lIiwKICAgICJhdHRyaWJ1dGV0eXBlIjogImF0dHJpYnV0ZVR5cGUiLAogICAgImJhc2VmcmVxdWVuY3kiOiAiYmFzZUZyZXF1ZW5jeSIsCiAgICAiYmFzZXByb2ZpbGUiOiAiYmFzZVByb2ZpbGUiLAogICAgImNhbGNtb2RlIjogImNhbGNNb2RlIiwKICAgICJjbGlwcGF0aHVuaXRzIjogImNsaXBQYXRoVW5pdHMiLAogICAgImNvbnRlbnRzY3JpcHR0eXBlIjogImNvbnRlbnRTY3JpcHRUeXBlIiwKICAgICJjb250ZW50c3R5bGV0eXBlIjogImNvbnRlbnRTdHlsZVR5cGUiLAogICAgImRpZmZ1c2Vjb25zdGFudCI6ICJkaWZmdXNlQ29uc3RhbnQiLAogICAgImVkZ2Vtb2RlIjogImVkZ2VNb2RlIiwKICAgICJleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkIjogImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLAogICAgImZpbHRlcnJlcyI6ICJmaWx0ZXJSZXMiLAogICAgImZpbHRlcnVuaXRzIjogImZpbHRlclVuaXRzIiwKICAgICJnbHlwaHJlZiI6ICJnbHlwaFJlZiIsCiAgICAiZ3JhZGllbnR0cmFuc2Zvcm0iOiAiZ3JhZGllbnRUcmFuc2Zvcm0iLAogICAgImdyYWRpZW50dW5pdHMiOiAiZ3JhZGllbnRVbml0cyIsCiAgICAia2VybmVsbWF0cml4IjogImtlcm5lbE1hdHJpeCIsCiAgICAia2VybmVsdW5pdGxlbmd0aCI6ICJrZXJuZWxVbml0TGVuZ3RoIiwKICAgICJrZXlwb2ludHMiOiAia2V5UG9pbnRzIiwKICAgICJrZXlzcGxpbmVzIjogImtleVNwbGluZXMiLAogICAgImtleXRpbWVzIjogImtleVRpbWVzIiwKICAgICJsZW5ndGhhZGp1c3QiOiAibGVuZ3RoQWRqdXN0IiwKICAgICJsaW1pdGluZ2NvbmVhbmdsZSI6ICJsaW1pdGluZ0NvbmVBbmdsZSIsCiAgICAibWFya2VyaGVpZ2h0IjogIm1hcmtlckhlaWdodCIsCiAgICAibWFya2VydW5pdHMiOiAibWFya2VyVW5pdHMiLAogICAgIm1hcmtlcndpZHRoIjogIm1hcmtlcldpZHRoIiwKICAgICJtYXNrY29udGVudHVuaXRzIjogIm1hc2tDb250ZW50VW5pdHMiLAogICAgIm1hc2t1bml0cyI6ICJtYXNrVW5pdHMiLAogICAgIm51bW9jdGF2ZXMiOiAibnVtT2N0YXZlcyIsCiAgICAicGF0aGxlbmd0aCI6ICJwYXRoTGVuZ3RoIiwKICAgICJwYXR0ZXJuY29udGVudHVuaXRzIjogInBhdHRlcm5Db250ZW50VW5pdHMiLAogICAgInBhdHRlcm50cmFuc2Zvcm0iOiAicGF0dGVyblRyYW5zZm9ybSIsCiAgICAicGF0dGVybnVuaXRzIjogInBhdHRlcm5Vbml0cyIsCiAgICAicG9pbnRzYXR4IjogInBvaW50c0F0WCIsCiAgICAicG9pbnRzYXR5IjogInBvaW50c0F0WSIsCiAgICAicG9pbnRzYXR6IjogInBvaW50c0F0WiIsCiAgICAicHJlc2VydmVhbHBoYSI6ICJwcmVzZXJ2ZUFscGhhIiwKICAgICJwcmVzZXJ2ZWFzcGVjdHJhdGlvIjogInByZXNlcnZlQXNwZWN0UmF0aW8iLAogICAgInByaW1pdGl2ZXVuaXRzIjogInByaW1pdGl2ZVVuaXRzIiwKICAgICJyZWZ4IjogInJlZlgiLAogICAgInJlZnkiOiAicmVmWSIsCiAgICAicmVwZWF0Y291bnQiOiAicmVwZWF0Q291bnQiLAogICAgInJlcGVhdGR1ciI6ICJyZXBlYXREdXIiLAogICAgInJlcXVpcmVkZXh0ZW5zaW9ucyI6ICJyZXF1aXJlZEV4dGVuc2lvbnMiLAogICAgInJlcXVpcmVkZmVhdHVyZXMiOiAicmVxdWlyZWRGZWF0dXJlcyIsCiAgICAic3BlY3VsYXJjb25zdGFudCI6ICJzcGVjdWxhckNvbnN0YW50IiwKICAgICJzcGVjdWxhcmV4cG9uZW50IjogInNwZWN1bGFyRXhwb25lbnQiLAogICAgInNwcmVhZG1ldGhvZCI6ICJzcHJlYWRNZXRob2QiLAogICAgInN0YXJ0b2Zmc2V0IjogInN0YXJ0T2Zmc2V0IiwKICAgICJzdGRkZXZpYXRpb24iOiAic3RkRGV2aWF0aW9uIiwKICAgICJzdGl0Y2h0aWxlcyI6ICJzdGl0Y2hUaWxlcyIsCiAgICAic3VyZmFjZXNjYWxlIjogInN1cmZhY2VTY2FsZSIsCiAgICAic3lzdGVtbGFuZ3VhZ2UiOiAic3lzdGVtTGFuZ3VhZ2UiLAogICAgInRhYmxldmFsdWVzIjogInRhYmxlVmFsdWVzIiwKICAgICJ0YXJnZXR4IjogInRhcmdldFgiLAogICAgInRhcmdldHkiOiAidGFyZ2V0WSIsCiAgICAidGV4dGxlbmd0aCI6ICJ0ZXh0TGVuZ3RoIiwKICAgICJ2aWV3Ym94IjogInZpZXdCb3giLAogICAgInZpZXd0YXJnZXQiOiAidmlld1RhcmdldCIsCiAgICAieGNoYW5uZWxzZWxlY3RvciI6ICJ4Q2hhbm5lbFNlbGVjdG9yIiwKICAgICJ5Y2hhbm5lbHNlbGVjdG9yIjogInlDaGFubmVsU2VsZWN0b3IiLAogICAgInpvb21hbmRwYW4iOiAiem9vbUFuZFBhbiIKfQoKYWRqdXN0TWF0aE1MQXR0cmlidXRlcyA9IHsiZGVmaW5pdGlvbnVybCI6ICJkZWZpbml0aW9uVVJMIn0KCmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzID0gewogICAgInhsaW5rOmFjdHVhdGUiOiAoInhsaW5rIiwgImFjdHVhdGUiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazphcmNyb2xlIjogKCJ4bGluayIsICJhcmNyb2xlIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6aHJlZiI6ICgieGxpbmsiLCAiaHJlZiIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhsaW5rOnJvbGUiOiAoInhsaW5rIiwgInJvbGUiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazpzaG93IjogKCJ4bGluayIsICJzaG93IiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6dGl0bGUiOiAoInhsaW5rIiwgInRpdGxlIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6dHlwZSI6ICgieGxpbmsiLCAidHlwZSIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhtbDpiYXNlIjogKCJ4bWwiLCAiYmFzZSIsIG5hbWVzcGFjZXNbInhtbCJdKSwKICAgICJ4bWw6bGFuZyI6ICgieG1sIiwgImxhbmciLCBuYW1lc3BhY2VzWyJ4bWwiXSksCiAgICAieG1sOnNwYWNlIjogKCJ4bWwiLCAic3BhY2UiLCBuYW1lc3BhY2VzWyJ4bWwiXSksCiAgICAieG1sbnMiOiAoTm9uZSwgInhtbG5zIiwgbmFtZXNwYWNlc1sieG1sbnMiXSksCiAgICAieG1sbnM6eGxpbmsiOiAoInhtbG5zIiwgInhsaW5rIiwgbmFtZXNwYWNlc1sieG1sbnMiXSkKfQoKdW5hZGp1c3RGb3JlaWduQXR0cmlidXRlcyA9IGRpY3QoWygobnMsIGxvY2FsKSwgcW5hbWUpIGZvciBxbmFtZSwgKHByZWZpeCwgbG9jYWwsIG5zKSBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMuaXRlbXMoKV0pCgpzcGFjZUNoYXJhY3RlcnMgPSBmcm96ZW5zZXQoWwogICAgIlx0IiwKICAgICJcbiIsCiAgICAiXHUwMDBDIiwKICAgICIgIiwKICAgICJcciIKXSkKCnRhYmxlSW5zZXJ0TW9kZUVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgICJ0YWJsZSIsCiAgICAidGJvZHkiLAogICAgInRmb290IiwKICAgICJ0aGVhZCIsCiAgICAidHIiCl0pCgphc2NpaUxvd2VyY2FzZSA9IGZyb3plbnNldChzdHJpbmcuYXNjaWlfbG93ZXJjYXNlKQphc2NpaVVwcGVyY2FzZSA9IGZyb3plbnNldChzdHJpbmcuYXNjaWlfdXBwZXJjYXNlKQphc2NpaUxldHRlcnMgPSBmcm96ZW5zZXQoc3RyaW5nLmFzY2lpX2xldHRlcnMpCmRpZ2l0cyA9IGZyb3plbnNldChzdHJpbmcuZGlnaXRzKQpoZXhEaWdpdHMgPSBmcm96ZW5zZXQoc3RyaW5nLmhleGRpZ2l0cykKCmFzY2lpVXBwZXIyTG93ZXIgPSBkaWN0KFsob3JkKGMpLCBvcmQoYy5sb3dlcigpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIHN0cmluZy5hc2NpaV91cHBlcmNhc2VdKQoKIyBIZWFkaW5nIGVsZW1lbnRzIG5lZWQgdG8gYmUgb3JkZXJlZApoZWFkaW5nRWxlbWVudHMgPSAoCiAgICAiaDEiLAogICAgImgyIiwKICAgICJoMyIsCiAgICAiaDQiLAogICAgImg1IiwKICAgICJoNiIKKQoKdm9pZEVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgICJiYXNlIiwKICAgICJjb21tYW5kIiwKICAgICJldmVudC1zb3VyY2UiLAogICAgImxpbmsiLAogICAgIm1ldGEiLAogICAgImhyIiwKICAgICJiciIsCiAgICAiaW1nIiwKICAgICJlbWJlZCIsCiAgICAicGFyYW0iLAogICAgImFyZWEiLAogICAgImNvbCIsCiAgICAiaW5wdXQiLAogICAgInNvdXJjZSIsCiAgICAidHJhY2siCl0pCgpjZGF0YUVsZW1lbnRzID0gZnJvemVuc2V0KFsndGl0bGUnLCAndGV4dGFyZWEnXSkKCnJjZGF0YUVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgICdzdHlsZScsCiAgICAnc2NyaXB0JywKICAgICd4bXAnLAogICAgJ2lmcmFtZScsCiAgICAnbm9lbWJlZCcsCiAgICAnbm9mcmFtZXMnLAogICAgJ25vc2NyaXB0JwpdKQoKYm9vbGVhbkF0dHJpYnV0ZXMgPSB7CiAgICAiIjogZnJvemVuc2V0KFsiaXJyZWxldmFudCJdKSwKICAgICJzdHlsZSI6IGZyb3plbnNldChbInNjb3BlZCJdKSwKICAgICJpbWciOiBmcm96ZW5zZXQoWyJpc21hcCJdKSwKICAgICJhdWRpbyI6IGZyb3plbnNldChbImF1dG9wbGF5IiwgImNvbnRyb2xzIl0pLAogICAgInZpZGVvIjogZnJvemVuc2V0KFsiYXV0b3BsYXkiLCAiY29udHJvbHMiXSksCiAgICAic2NyaXB0IjogZnJvemVuc2V0KFsiZGVmZXIiLCAiYXN5bmMiXSksCiAgICAiZGV0YWlscyI6IGZyb3plbnNldChbIm9wZW4iXSksCiAgICAiZGF0YWdyaWQiOiBmcm96ZW5zZXQoWyJtdWx0aXBsZSIsICJkaXNhYmxlZCJdKSwKICAgICJjb21tYW5kIjogZnJvemVuc2V0KFsiaGlkZGVuIiwgImRpc2FibGVkIiwgImNoZWNrZWQiLCAiZGVmYXVsdCJdKSwKICAgICJociI6IGZyb3plbnNldChbIm5vc2hhZGUiXSksCiAgICAibWVudSI6IGZyb3plbnNldChbImF1dG9zdWJtaXQiXSksCiAgICAiZmllbGRzZXQiOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJyZWFkb25seSJdKSwKICAgICJvcHRpb24iOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJyZWFkb25seSIsICJzZWxlY3RlZCJdKSwKICAgICJvcHRncm91cCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5Il0pLAogICAgImJ1dHRvbiI6IGZyb3plbnNldChbImRpc2FibGVkIiwgImF1dG9mb2N1cyJdKSwKICAgICJpbnB1dCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5IiwgInJlcXVpcmVkIiwgImF1dG9mb2N1cyIsICJjaGVja2VkIiwgImlzbWFwIl0pLAogICAgInNlbGVjdCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5IiwgImF1dG9mb2N1cyIsICJtdWx0aXBsZSJdKSwKICAgICJvdXRwdXQiOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJyZWFkb25seSJdKSwKfQoKIyBlbnRpdGllc1dpbmRvd3MxMjUyIGhhcyB0byBiZSBfb3JkZXJlZF8gYW5kIG5lZWRzIHRvIGhhdmUgYW4gaW5kZXguIEl0CiMgdGhlcmVmb3JlIGNhbid0IGJlIGEgZnJvemVuc2V0LgplbnRpdGllc1dpbmRvd3MxMjUyID0gKAogICAgODM2NCwgICAjIDB4ODAgIDB4MjBBQyAgRVVSTyBTSUdOCiAgICA2NTUzMywgICMgMHg4MSAgICAgICAgICBVTkRFRklORUQKICAgIDgyMTgsICAgIyAweDgyICAweDIwMUEgIFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSwogICAgNDAyLCAgICAjIDB4ODMgIDB4MDE5MiAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCiAgICA4MjIyLCAgICMgMHg4NCAgMHgyMDFFICBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKICAgIDgyMzAsICAgIyAweDg1ICAweDIwMjYgIEhPUklaT05UQUwgRUxMSVBTSVMKICAgIDgyMjQsICAgIyAweDg2ICAweDIwMjAgIERBR0dFUgogICAgODIyNSwgICAjIDB4ODcgIDB4MjAyMSAgRE9VQkxFIERBR0dFUgogICAgNzEwLCAgICAjIDB4ODggIDB4MDJDNiAgTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UCiAgICA4MjQwLCAgICMgMHg4OSAgMHgyMDMwICBQRVIgTUlMTEUgU0lHTgogICAgMzUyLCAgICAjIDB4OEEgIDB4MDE2MCAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCiAgICA4MjQ5LCAgICMgMHg4QiAgMHgyMDM5ICBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSwogICAgMzM4LCAgICAjIDB4OEMgIDB4MDE1MiAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQogICAgNjU1MzMsICAjIDB4OEQgICAgICAgICAgVU5ERUZJTkVECiAgICAzODEsICAgICMgMHg4RSAgMHgwMTdEICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KICAgIDY1NTMzLCAgIyAweDhGICAgICAgICAgIFVOREVGSU5FRAogICAgNjU1MzMsICAjIDB4OTAgICAgICAgICAgVU5ERUZJTkVECiAgICA4MjE2LCAgICMgMHg5MSAgMHgyMDE4ICBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSwogICAgODIxNywgICAjIDB4OTIgIDB4MjAxOSAgUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCiAgICA4MjIwLCAgICMgMHg5MyAgMHgyMDFDICBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSwogICAgODIyMSwgICAjIDB4OTQgIDB4MjAxRCAgUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCiAgICA4MjI2LCAgICMgMHg5NSAgMHgyMDIyICBCVUxMRVQKICAgIDgyMTEsICAgIyAweDk2ICAweDIwMTMgIEVOIERBU0gKICAgIDgyMTIsICAgIyAweDk3ICAweDIwMTQgIEVNIERBU0gKICAgIDczMiwgICAgIyAweDk4ICAweDAyREMgIFNNQUxMIFRJTERFCiAgICA4NDgyLCAgICMgMHg5OSAgMHgyMTIyICBUUkFERSBNQVJLIFNJR04KICAgIDM1MywgICAgIyAweDlBICAweDAxNjEgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KICAgIDgyNTAsICAgIyAweDlCICAweDIwM0EgIFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSwogICAgMzM5LCAgICAjIDB4OUMgIDB4MDE1MyAgTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKICAgIDY1NTMzLCAgIyAweDlEICAgICAgICAgIFVOREVGSU5FRAogICAgMzgyLCAgICAjIDB4OUUgIDB4MDE3RSAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgogICAgMzc2ICAgICAjIDB4OUYgIDB4MDE3OCAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUwopCgp4bWxFbnRpdGllcyA9IGZyb3plbnNldChbJ2x0OycsICdndDsnLCAnYW1wOycsICdhcG9zOycsICdxdW90OyddKQoKZW50aXRpZXMgPSB7CiAgICAiQUVsaWciOiAiXHhjNiIsCiAgICAiQUVsaWc7IjogIlx4YzYiLAogICAgIkFNUCI6ICImIiwKICAgICJBTVA7IjogIiYiLAogICAgIkFhY3V0ZSI6ICJceGMxIiwKICAgICJBYWN1dGU7IjogIlx4YzEiLAogICAgIkFicmV2ZTsiOiAiXHUwMTAyIiwKICAgICJBY2lyYyI6ICJceGMyIiwKICAgICJBY2lyYzsiOiAiXHhjMiIsCiAgICAiQWN5OyI6ICJcdTA0MTAiLAogICAgIkFmcjsiOiAiXFUwMDAxZDUwNCIsCiAgICAiQWdyYXZlIjogIlx4YzAiLAogICAgIkFncmF2ZTsiOiAiXHhjMCIsCiAgICAiQWxwaGE7IjogIlx1MDM5MSIsCiAgICAiQW1hY3I7IjogIlx1MDEwMCIsCiAgICAiQW5kOyI6ICJcdTJhNTMiLAogICAgIkFvZ29uOyI6ICJcdTAxMDQiLAogICAgIkFvcGY7IjogIlxVMDAwMWQ1MzgiLAogICAgIkFwcGx5RnVuY3Rpb247IjogIlx1MjA2MSIsCiAgICAiQXJpbmciOiAiXHhjNSIsCiAgICAiQXJpbmc7IjogIlx4YzUiLAogICAgIkFzY3I7IjogIlxVMDAwMWQ0OWMiLAogICAgIkFzc2lnbjsiOiAiXHUyMjU0IiwKICAgICJBdGlsZGUiOiAiXHhjMyIsCiAgICAiQXRpbGRlOyI6ICJceGMzIiwKICAgICJBdW1sIjogIlx4YzQiLAogICAgIkF1bWw7IjogIlx4YzQiLAogICAgIkJhY2tzbGFzaDsiOiAiXHUyMjE2IiwKICAgICJCYXJ2OyI6ICJcdTJhZTciLAogICAgIkJhcndlZDsiOiAiXHUyMzA2IiwKICAgICJCY3k7IjogIlx1MDQxMSIsCiAgICAiQmVjYXVzZTsiOiAiXHUyMjM1IiwKICAgICJCZXJub3VsbGlzOyI6ICJcdTIxMmMiLAogICAgIkJldGE7IjogIlx1MDM5MiIsCiAgICAiQmZyOyI6ICJcVTAwMDFkNTA1IiwKICAgICJCb3BmOyI6ICJcVTAwMDFkNTM5IiwKICAgICJCcmV2ZTsiOiAiXHUwMmQ4IiwKICAgICJCc2NyOyI6ICJcdTIxMmMiLAogICAgIkJ1bXBlcTsiOiAiXHUyMjRlIiwKICAgICJDSGN5OyI6ICJcdTA0MjciLAogICAgIkNPUFkiOiAiXHhhOSIsCiAgICAiQ09QWTsiOiAiXHhhOSIsCiAgICAiQ2FjdXRlOyI6ICJcdTAxMDYiLAogICAgIkNhcDsiOiAiXHUyMmQyIiwKICAgICJDYXBpdGFsRGlmZmVyZW50aWFsRDsiOiAiXHUyMTQ1IiwKICAgICJDYXlsZXlzOyI6ICJcdTIxMmQiLAogICAgIkNjYXJvbjsiOiAiXHUwMTBjIiwKICAgICJDY2VkaWwiOiAiXHhjNyIsCiAgICAiQ2NlZGlsOyI6ICJceGM3IiwKICAgICJDY2lyYzsiOiAiXHUwMTA4IiwKICAgICJDY29uaW50OyI6ICJcdTIyMzAiLAogICAgIkNkb3Q7IjogIlx1MDEwYSIsCiAgICAiQ2VkaWxsYTsiOiAiXHhiOCIsCiAgICAiQ2VudGVyRG90OyI6ICJceGI3IiwKICAgICJDZnI7IjogIlx1MjEyZCIsCiAgICAiQ2hpOyI6ICJcdTAzYTciLAogICAgIkNpcmNsZURvdDsiOiAiXHUyMjk5IiwKICAgICJDaXJjbGVNaW51czsiOiAiXHUyMjk2IiwKICAgICJDaXJjbGVQbHVzOyI6ICJcdTIyOTUiLAogICAgIkNpcmNsZVRpbWVzOyI6ICJcdTIyOTciLAogICAgIkNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbDsiOiAiXHUyMjMyIiwKICAgICJDbG9zZUN1cmx5RG91YmxlUXVvdGU7IjogIlx1MjAxZCIsCiAgICAiQ2xvc2VDdXJseVF1b3RlOyI6ICJcdTIwMTkiLAogICAgIkNvbG9uOyI6ICJcdTIyMzciLAogICAgIkNvbG9uZTsiOiAiXHUyYTc0IiwKICAgICJDb25ncnVlbnQ7IjogIlx1MjI2MSIsCiAgICAiQ29uaW50OyI6ICJcdTIyMmYiLAogICAgIkNvbnRvdXJJbnRlZ3JhbDsiOiAiXHUyMjJlIiwKICAgICJDb3BmOyI6ICJcdTIxMDIiLAogICAgIkNvcHJvZHVjdDsiOiAiXHUyMjEwIiwKICAgICJDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsOyI6ICJcdTIyMzMiLAogICAgIkNyb3NzOyI6ICJcdTJhMmYiLAogICAgIkNzY3I7IjogIlxVMDAwMWQ0OWUiLAogICAgIkN1cDsiOiAiXHUyMmQzIiwKICAgICJDdXBDYXA7IjogIlx1MjI0ZCIsCiAgICAiREQ7IjogIlx1MjE0NSIsCiAgICAiRERvdHJhaGQ7IjogIlx1MjkxMSIsCiAgICAiREpjeTsiOiAiXHUwNDAyIiwKICAgICJEU2N5OyI6ICJcdTA0MDUiLAogICAgIkRaY3k7IjogIlx1MDQwZiIsCiAgICAiRGFnZ2VyOyI6ICJcdTIwMjEiLAogICAgIkRhcnI7IjogIlx1MjFhMSIsCiAgICAiRGFzaHY7IjogIlx1MmFlNCIsCiAgICAiRGNhcm9uOyI6ICJcdTAxMGUiLAogICAgIkRjeTsiOiAiXHUwNDE0IiwKICAgICJEZWw7IjogIlx1MjIwNyIsCiAgICAiRGVsdGE7IjogIlx1MDM5NCIsCiAgICAiRGZyOyI6ICJcVTAwMDFkNTA3IiwKICAgICJEaWFjcml0aWNhbEFjdXRlOyI6ICJceGI0IiwKICAgICJEaWFjcml0aWNhbERvdDsiOiAiXHUwMmQ5IiwKICAgICJEaWFjcml0aWNhbERvdWJsZUFjdXRlOyI6ICJcdTAyZGQiLAogICAgIkRpYWNyaXRpY2FsR3JhdmU7IjogImAiLAogICAgIkRpYWNyaXRpY2FsVGlsZGU7IjogIlx1MDJkYyIsCiAgICAiRGlhbW9uZDsiOiAiXHUyMmM0IiwKICAgICJEaWZmZXJlbnRpYWxEOyI6ICJcdTIxNDYiLAogICAgIkRvcGY7IjogIlxVMDAwMWQ1M2IiLAogICAgIkRvdDsiOiAiXHhhOCIsCiAgICAiRG90RG90OyI6ICJcdTIwZGMiLAogICAgIkRvdEVxdWFsOyI6ICJcdTIyNTAiLAogICAgIkRvdWJsZUNvbnRvdXJJbnRlZ3JhbDsiOiAiXHUyMjJmIiwKICAgICJEb3VibGVEb3Q7IjogIlx4YTgiLAogICAgIkRvdWJsZURvd25BcnJvdzsiOiAiXHUyMWQzIiwKICAgICJEb3VibGVMZWZ0QXJyb3c7IjogIlx1MjFkMCIsCiAgICAiRG91YmxlTGVmdFJpZ2h0QXJyb3c7IjogIlx1MjFkNCIsCiAgICAiRG91YmxlTGVmdFRlZTsiOiAiXHUyYWU0IiwKICAgICJEb3VibGVMb25nTGVmdEFycm93OyI6ICJcdTI3ZjgiLAogICAgIkRvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvdzsiOiAiXHUyN2ZhIiwKICAgICJEb3VibGVMb25nUmlnaHRBcnJvdzsiOiAiXHUyN2Y5IiwKICAgICJEb3VibGVSaWdodEFycm93OyI6ICJcdTIxZDIiLAogICAgIkRvdWJsZVJpZ2h0VGVlOyI6ICJcdTIyYTgiLAogICAgIkRvdWJsZVVwQXJyb3c7IjogIlx1MjFkMSIsCiAgICAiRG91YmxlVXBEb3duQXJyb3c7IjogIlx1MjFkNSIsCiAgICAiRG91YmxlVmVydGljYWxCYXI7IjogIlx1MjIyNSIsCiAgICAiRG93bkFycm93OyI6ICJcdTIxOTMiLAogICAgIkRvd25BcnJvd0JhcjsiOiAiXHUyOTEzIiwKICAgICJEb3duQXJyb3dVcEFycm93OyI6ICJcdTIxZjUiLAogICAgIkRvd25CcmV2ZTsiOiAiXHUwMzExIiwKICAgICJEb3duTGVmdFJpZ2h0VmVjdG9yOyI6ICJcdTI5NTAiLAogICAgIkRvd25MZWZ0VGVlVmVjdG9yOyI6ICJcdTI5NWUiLAogICAgIkRvd25MZWZ0VmVjdG9yOyI6ICJcdTIxYmQiLAogICAgIkRvd25MZWZ0VmVjdG9yQmFyOyI6ICJcdTI5NTYiLAogICAgIkRvd25SaWdodFRlZVZlY3RvcjsiOiAiXHUyOTVmIiwKICAgICJEb3duUmlnaHRWZWN0b3I7IjogIlx1MjFjMSIsCiAgICAiRG93blJpZ2h0VmVjdG9yQmFyOyI6ICJcdTI5NTciLAogICAgIkRvd25UZWU7IjogIlx1MjJhNCIsCiAgICAiRG93blRlZUFycm93OyI6ICJcdTIxYTciLAogICAgIkRvd25hcnJvdzsiOiAiXHUyMWQzIiwKICAgICJEc2NyOyI6ICJcVTAwMDFkNDlmIiwKICAgICJEc3Ryb2s7IjogIlx1MDExMCIsCiAgICAiRU5HOyI6ICJcdTAxNGEiLAogICAgIkVUSCI6ICJceGQwIiwKICAgICJFVEg7IjogIlx4ZDAiLAogICAgIkVhY3V0ZSI6ICJceGM5IiwKICAgICJFYWN1dGU7IjogIlx4YzkiLAogICAgIkVjYXJvbjsiOiAiXHUwMTFhIiwKICAgICJFY2lyYyI6ICJceGNhIiwKICAgICJFY2lyYzsiOiAiXHhjYSIsCiAgICAiRWN5OyI6ICJcdTA0MmQiLAogICAgIkVkb3Q7IjogIlx1MDExNiIsCiAgICAiRWZyOyI6ICJcVTAwMDFkNTA4IiwKICAgICJFZ3JhdmUiOiAiXHhjOCIsCiAgICAiRWdyYXZlOyI6ICJceGM4IiwKICAgICJFbGVtZW50OyI6ICJcdTIyMDgiLAogICAgIkVtYWNyOyI6ICJcdTAxMTIiLAogICAgIkVtcHR5U21hbGxTcXVhcmU7IjogIlx1MjVmYiIsCiAgICAiRW1wdHlWZXJ5U21hbGxTcXVhcmU7IjogIlx1MjVhYiIsCiAgICAiRW9nb247IjogIlx1MDExOCIsCiAgICAiRW9wZjsiOiAiXFUwMDAxZDUzYyIsCiAgICAiRXBzaWxvbjsiOiAiXHUwMzk1IiwKICAgICJFcXVhbDsiOiAiXHUyYTc1IiwKICAgICJFcXVhbFRpbGRlOyI6ICJcdTIyNDIiLAogICAgIkVxdWlsaWJyaXVtOyI6ICJcdTIxY2MiLAogICAgIkVzY3I7IjogIlx1MjEzMCIsCiAgICAiRXNpbTsiOiAiXHUyYTczIiwKICAgICJFdGE7IjogIlx1MDM5NyIsCiAgICAiRXVtbCI6ICJceGNiIiwKICAgICJFdW1sOyI6ICJceGNiIiwKICAgICJFeGlzdHM7IjogIlx1MjIwMyIsCiAgICAiRXhwb25lbnRpYWxFOyI6ICJcdTIxNDciLAogICAgIkZjeTsiOiAiXHUwNDI0IiwKICAgICJGZnI7IjogIlxVMDAwMWQ1MDkiLAogICAgIkZpbGxlZFNtYWxsU3F1YXJlOyI6ICJcdTI1ZmMiLAogICAgIkZpbGxlZFZlcnlTbWFsbFNxdWFyZTsiOiAiXHUyNWFhIiwKICAgICJGb3BmOyI6ICJcVTAwMDFkNTNkIiwKICAgICJGb3JBbGw7IjogIlx1MjIwMCIsCiAgICAiRm91cmllcnRyZjsiOiAiXHUyMTMxIiwKICAgICJGc2NyOyI6ICJcdTIxMzEiLAogICAgIkdKY3k7IjogIlx1MDQwMyIsCiAgICAiR1QiOiAiPiIsCiAgICAiR1Q7IjogIj4iLAogICAgIkdhbW1hOyI6ICJcdTAzOTMiLAogICAgIkdhbW1hZDsiOiAiXHUwM2RjIiwKICAgICJHYnJldmU7IjogIlx1MDExZSIsCiAgICAiR2NlZGlsOyI6ICJcdTAxMjIiLAogICAgIkdjaXJjOyI6ICJcdTAxMWMiLAogICAgIkdjeTsiOiAiXHUwNDEzIiwKICAgICJHZG90OyI6ICJcdTAxMjAiLAogICAgIkdmcjsiOiAiXFUwMDAxZDUwYSIsCiAgICAiR2c7IjogIlx1MjJkOSIsCiAgICAiR29wZjsiOiAiXFUwMDAxZDUzZSIsCiAgICAiR3JlYXRlckVxdWFsOyI6ICJcdTIyNjUiLAogICAgIkdyZWF0ZXJFcXVhbExlc3M7IjogIlx1MjJkYiIsCiAgICAiR3JlYXRlckZ1bGxFcXVhbDsiOiAiXHUyMjY3IiwKICAgICJHcmVhdGVyR3JlYXRlcjsiOiAiXHUyYWEyIiwKICAgICJHcmVhdGVyTGVzczsiOiAiXHUyMjc3IiwKICAgICJHcmVhdGVyU2xhbnRFcXVhbDsiOiAiXHUyYTdlIiwKICAgICJHcmVhdGVyVGlsZGU7IjogIlx1MjI3MyIsCiAgICAiR3NjcjsiOiAiXFUwMDAxZDRhMiIsCiAgICAiR3Q7IjogIlx1MjI2YiIsCiAgICAiSEFSRGN5OyI6ICJcdTA0MmEiLAogICAgIkhhY2VrOyI6ICJcdTAyYzciLAogICAgIkhhdDsiOiAiXiIsCiAgICAiSGNpcmM7IjogIlx1MDEyNCIsCiAgICAiSGZyOyI6ICJcdTIxMGMiLAogICAgIkhpbGJlcnRTcGFjZTsiOiAiXHUyMTBiIiwKICAgICJIb3BmOyI6ICJcdTIxMGQiLAogICAgIkhvcml6b250YWxMaW5lOyI6ICJcdTI1MDAiLAogICAgIkhzY3I7IjogIlx1MjEwYiIsCiAgICAiSHN0cm9rOyI6ICJcdTAxMjYiLAogICAgIkh1bXBEb3duSHVtcDsiOiAiXHUyMjRlIiwKICAgICJIdW1wRXF1YWw7IjogIlx1MjI0ZiIsCiAgICAiSUVjeTsiOiAiXHUwNDE1IiwKICAgICJJSmxpZzsiOiAiXHUwMTMyIiwKICAgICJJT2N5OyI6ICJcdTA0MDEiLAogICAgIklhY3V0ZSI6ICJceGNkIiwKICAgICJJYWN1dGU7IjogIlx4Y2QiLAogICAgIkljaXJjIjogIlx4Y2UiLAogICAgIkljaXJjOyI6ICJceGNlIiwKICAgICJJY3k7IjogIlx1MDQxOCIsCiAgICAiSWRvdDsiOiAiXHUwMTMwIiwKICAgICJJZnI7IjogIlx1MjExMSIsCiAgICAiSWdyYXZlIjogIlx4Y2MiLAogICAgIklncmF2ZTsiOiAiXHhjYyIsCiAgICAiSW07IjogIlx1MjExMSIsCiAgICAiSW1hY3I7IjogIlx1MDEyYSIsCiAgICAiSW1hZ2luYXJ5STsiOiAiXHUyMTQ4IiwKICAgICJJbXBsaWVzOyI6ICJcdTIxZDIiLAogICAgIkludDsiOiAiXHUyMjJjIiwKICAgICJJbnRlZ3JhbDsiOiAiXHUyMjJiIiwKICAgICJJbnRlcnNlY3Rpb247IjogIlx1MjJjMiIsCiAgICAiSW52aXNpYmxlQ29tbWE7IjogIlx1MjA2MyIsCiAgICAiSW52aXNpYmxlVGltZXM7IjogIlx1MjA2MiIsCiAgICAiSW9nb247IjogIlx1MDEyZSIsCiAgICAiSW9wZjsiOiAiXFUwMDAxZDU0MCIsCiAgICAiSW90YTsiOiAiXHUwMzk5IiwKICAgICJJc2NyOyI6ICJcdTIxMTAiLAogICAgIkl0aWxkZTsiOiAiXHUwMTI4IiwKICAgICJJdWtjeTsiOiAiXHUwNDA2IiwKICAgICJJdW1sIjogIlx4Y2YiLAogICAgIkl1bWw7IjogIlx4Y2YiLAogICAgIkpjaXJjOyI6ICJcdTAxMzQiLAogICAgIkpjeTsiOiAiXHUwNDE5IiwKICAgICJKZnI7IjogIlxVMDAwMWQ1MGQiLAogICAgIkpvcGY7IjogIlxVMDAwMWQ1NDEiLAogICAgIkpzY3I7IjogIlxVMDAwMWQ0YTUiLAogICAgIkpzZXJjeTsiOiAiXHUwNDA4IiwKICAgICJKdWtjeTsiOiAiXHUwNDA0IiwKICAgICJLSGN5OyI6ICJcdTA0MjUiLAogICAgIktKY3k7IjogIlx1MDQwYyIsCiAgICAiS2FwcGE7IjogIlx1MDM5YSIsCiAgICAiS2NlZGlsOyI6ICJcdTAxMzYiLAogICAgIktjeTsiOiAiXHUwNDFhIiwKICAgICJLZnI7IjogIlxVMDAwMWQ1MGUiLAogICAgIktvcGY7IjogIlxVMDAwMWQ1NDIiLAogICAgIktzY3I7IjogIlxVMDAwMWQ0YTYiLAogICAgIkxKY3k7IjogIlx1MDQwOSIsCiAgICAiTFQiOiAiPCIsCiAgICAiTFQ7IjogIjwiLAogICAgIkxhY3V0ZTsiOiAiXHUwMTM5IiwKICAgICJMYW1iZGE7IjogIlx1MDM5YiIsCiAgICAiTGFuZzsiOiAiXHUyN2VhIiwKICAgICJMYXBsYWNldHJmOyI6ICJcdTIxMTIiLAogICAgIkxhcnI7IjogIlx1MjE5ZSIsCiAgICAiTGNhcm9uOyI6ICJcdTAxM2QiLAogICAgIkxjZWRpbDsiOiAiXHUwMTNiIiwKICAgICJMY3k7IjogIlx1MDQxYiIsCiAgICAiTGVmdEFuZ2xlQnJhY2tldDsiOiAiXHUyN2U4IiwKICAgICJMZWZ0QXJyb3c7IjogIlx1MjE5MCIsCiAgICAiTGVmdEFycm93QmFyOyI6ICJcdTIxZTQiLAogICAgIkxlZnRBcnJvd1JpZ2h0QXJyb3c7IjogIlx1MjFjNiIsCiAgICAiTGVmdENlaWxpbmc7IjogIlx1MjMwOCIsCiAgICAiTGVmdERvdWJsZUJyYWNrZXQ7IjogIlx1MjdlNiIsCiAgICAiTGVmdERvd25UZWVWZWN0b3I7IjogIlx1Mjk2MSIsCiAgICAiTGVmdERvd25WZWN0b3I7IjogIlx1MjFjMyIsCiAgICAiTGVmdERvd25WZWN0b3JCYXI7IjogIlx1Mjk1OSIsCiAgICAiTGVmdEZsb29yOyI6ICJcdTIzMGEiLAogICAgIkxlZnRSaWdodEFycm93OyI6ICJcdTIxOTQiLAogICAgIkxlZnRSaWdodFZlY3RvcjsiOiAiXHUyOTRlIiwKICAgICJMZWZ0VGVlOyI6ICJcdTIyYTMiLAogICAgIkxlZnRUZWVBcnJvdzsiOiAiXHUyMWE0IiwKICAgICJMZWZ0VGVlVmVjdG9yOyI6ICJcdTI5NWEiLAogICAgIkxlZnRUcmlhbmdsZTsiOiAiXHUyMmIyIiwKICAgICJMZWZ0VHJpYW5nbGVCYXI7IjogIlx1MjljZiIsCiAgICAiTGVmdFRyaWFuZ2xlRXF1YWw7IjogIlx1MjJiNCIsCiAgICAiTGVmdFVwRG93blZlY3RvcjsiOiAiXHUyOTUxIiwKICAgICJMZWZ0VXBUZWVWZWN0b3I7IjogIlx1Mjk2MCIsCiAgICAiTGVmdFVwVmVjdG9yOyI6ICJcdTIxYmYiLAogICAgIkxlZnRVcFZlY3RvckJhcjsiOiAiXHUyOTU4IiwKICAgICJMZWZ0VmVjdG9yOyI6ICJcdTIxYmMiLAogICAgIkxlZnRWZWN0b3JCYXI7IjogIlx1Mjk1MiIsCiAgICAiTGVmdGFycm93OyI6ICJcdTIxZDAiLAogICAgIkxlZnRyaWdodGFycm93OyI6ICJcdTIxZDQiLAogICAgIkxlc3NFcXVhbEdyZWF0ZXI7IjogIlx1MjJkYSIsCiAgICAiTGVzc0Z1bGxFcXVhbDsiOiAiXHUyMjY2IiwKICAgICJMZXNzR3JlYXRlcjsiOiAiXHUyMjc2IiwKICAgICJMZXNzTGVzczsiOiAiXHUyYWExIiwKICAgICJMZXNzU2xhbnRFcXVhbDsiOiAiXHUyYTdkIiwKICAgICJMZXNzVGlsZGU7IjogIlx1MjI3MiIsCiAgICAiTGZyOyI6ICJcVTAwMDFkNTBmIiwKICAgICJMbDsiOiAiXHUyMmQ4IiwKICAgICJMbGVmdGFycm93OyI6ICJcdTIxZGEiLAogICAgIkxtaWRvdDsiOiAiXHUwMTNmIiwKICAgICJMb25nTGVmdEFycm93OyI6ICJcdTI3ZjUiLAogICAgIkxvbmdMZWZ0UmlnaHRBcnJvdzsiOiAiXHUyN2Y3IiwKICAgICJMb25nUmlnaHRBcnJvdzsiOiAiXHUyN2Y2IiwKICAgICJMb25nbGVmdGFycm93OyI6ICJcdTI3ZjgiLAogICAgIkxvbmdsZWZ0cmlnaHRhcnJvdzsiOiAiXHUyN2ZhIiwKICAgICJMb25ncmlnaHRhcnJvdzsiOiAiXHUyN2Y5IiwKICAgICJMb3BmOyI6ICJcVTAwMDFkNTQzIiwKICAgICJMb3dlckxlZnRBcnJvdzsiOiAiXHUyMTk5IiwKICAgICJMb3dlclJpZ2h0QXJyb3c7IjogIlx1MjE5OCIsCiAgICAiTHNjcjsiOiAiXHUyMTEyIiwKICAgICJMc2g7IjogIlx1MjFiMCIsCiAgICAiTHN0cm9rOyI6ICJcdTAxNDEiLAogICAgIkx0OyI6ICJcdTIyNmEiLAogICAgIk1hcDsiOiAiXHUyOTA1IiwKICAgICJNY3k7IjogIlx1MDQxYyIsCiAgICAiTWVkaXVtU3BhY2U7IjogIlx1MjA1ZiIsCiAgICAiTWVsbGludHJmOyI6ICJcdTIxMzMiLAogICAgIk1mcjsiOiAiXFUwMDAxZDUxMCIsCiAgICAiTWludXNQbHVzOyI6ICJcdTIyMTMiLAogICAgIk1vcGY7IjogIlxVMDAwMWQ1NDQiLAogICAgIk1zY3I7IjogIlx1MjEzMyIsCiAgICAiTXU7IjogIlx1MDM5YyIsCiAgICAiTkpjeTsiOiAiXHUwNDBhIiwKICAgICJOYWN1dGU7IjogIlx1MDE0MyIsCiAgICAiTmNhcm9uOyI6ICJcdTAxNDciLAogICAgIk5jZWRpbDsiOiAiXHUwMTQ1IiwKICAgICJOY3k7IjogIlx1MDQxZCIsCiAgICAiTmVnYXRpdmVNZWRpdW1TcGFjZTsiOiAiXHUyMDBiIiwKICAgICJOZWdhdGl2ZVRoaWNrU3BhY2U7IjogIlx1MjAwYiIsCiAgICAiTmVnYXRpdmVUaGluU3BhY2U7IjogIlx1MjAwYiIsCiAgICAiTmVnYXRpdmVWZXJ5VGhpblNwYWNlOyI6ICJcdTIwMGIiLAogICAgIk5lc3RlZEdyZWF0ZXJHcmVhdGVyOyI6ICJcdTIyNmIiLAogICAgIk5lc3RlZExlc3NMZXNzOyI6ICJcdTIyNmEiLAogICAgIk5ld0xpbmU7IjogIlxuIiwKICAgICJOZnI7IjogIlxVMDAwMWQ1MTEiLAogICAgIk5vQnJlYWs7IjogIlx1MjA2MCIsCiAgICAiTm9uQnJlYWtpbmdTcGFjZTsiOiAiXHhhMCIsCiAgICAiTm9wZjsiOiAiXHUyMTE1IiwKICAgICJOb3Q7IjogIlx1MmFlYyIsCiAgICAiTm90Q29uZ3J1ZW50OyI6ICJcdTIyNjIiLAogICAgIk5vdEN1cENhcDsiOiAiXHUyMjZkIiwKICAgICJOb3REb3VibGVWZXJ0aWNhbEJhcjsiOiAiXHUyMjI2IiwKICAgICJOb3RFbGVtZW50OyI6ICJcdTIyMDkiLAogICAgIk5vdEVxdWFsOyI6ICJcdTIyNjAiLAogICAgIk5vdEVxdWFsVGlsZGU7IjogIlx1MjI0Mlx1MDMzOCIsCiAgICAiTm90RXhpc3RzOyI6ICJcdTIyMDQiLAogICAgIk5vdEdyZWF0ZXI7IjogIlx1MjI2ZiIsCiAgICAiTm90R3JlYXRlckVxdWFsOyI6ICJcdTIyNzEiLAogICAgIk5vdEdyZWF0ZXJGdWxsRXF1YWw7IjogIlx1MjI2N1x1MDMzOCIsCiAgICAiTm90R3JlYXRlckdyZWF0ZXI7IjogIlx1MjI2Ylx1MDMzOCIsCiAgICAiTm90R3JlYXRlckxlc3M7IjogIlx1MjI3OSIsCiAgICAiTm90R3JlYXRlclNsYW50RXF1YWw7IjogIlx1MmE3ZVx1MDMzOCIsCiAgICAiTm90R3JlYXRlclRpbGRlOyI6ICJcdTIyNzUiLAogICAgIk5vdEh1bXBEb3duSHVtcDsiOiAiXHUyMjRlXHUwMzM4IiwKICAgICJOb3RIdW1wRXF1YWw7IjogIlx1MjI0Zlx1MDMzOCIsCiAgICAiTm90TGVmdFRyaWFuZ2xlOyI6ICJcdTIyZWEiLAogICAgIk5vdExlZnRUcmlhbmdsZUJhcjsiOiAiXHUyOWNmXHUwMzM4IiwKICAgICJOb3RMZWZ0VHJpYW5nbGVFcXVhbDsiOiAiXHUyMmVjIiwKICAgICJOb3RMZXNzOyI6ICJcdTIyNmUiLAogICAgIk5vdExlc3NFcXVhbDsiOiAiXHUyMjcwIiwKICAgICJOb3RMZXNzR3JlYXRlcjsiOiAiXHUyMjc4IiwKICAgICJOb3RMZXNzTGVzczsiOiAiXHUyMjZhXHUwMzM4IiwKICAgICJOb3RMZXNzU2xhbnRFcXVhbDsiOiAiXHUyYTdkXHUwMzM4IiwKICAgICJOb3RMZXNzVGlsZGU7IjogIlx1MjI3NCIsCiAgICAiTm90TmVzdGVkR3JlYXRlckdyZWF0ZXI7IjogIlx1MmFhMlx1MDMzOCIsCiAgICAiTm90TmVzdGVkTGVzc0xlc3M7IjogIlx1MmFhMVx1MDMzOCIsCiAgICAiTm90UHJlY2VkZXM7IjogIlx1MjI4MCIsCiAgICAiTm90UHJlY2VkZXNFcXVhbDsiOiAiXHUyYWFmXHUwMzM4IiwKICAgICJOb3RQcmVjZWRlc1NsYW50RXF1YWw7IjogIlx1MjJlMCIsCiAgICAiTm90UmV2ZXJzZUVsZW1lbnQ7IjogIlx1MjIwYyIsCiAgICAiTm90UmlnaHRUcmlhbmdsZTsiOiAiXHUyMmViIiwKICAgICJOb3RSaWdodFRyaWFuZ2xlQmFyOyI6ICJcdTI5ZDBcdTAzMzgiLAogICAgIk5vdFJpZ2h0VHJpYW5nbGVFcXVhbDsiOiAiXHUyMmVkIiwKICAgICJOb3RTcXVhcmVTdWJzZXQ7IjogIlx1MjI4Zlx1MDMzOCIsCiAgICAiTm90U3F1YXJlU3Vic2V0RXF1YWw7IjogIlx1MjJlMiIsCiAgICAiTm90U3F1YXJlU3VwZXJzZXQ7IjogIlx1MjI5MFx1MDMzOCIsCiAgICAiTm90U3F1YXJlU3VwZXJzZXRFcXVhbDsiOiAiXHUyMmUzIiwKICAgICJOb3RTdWJzZXQ7IjogIlx1MjI4Mlx1MjBkMiIsCiAgICAiTm90U3Vic2V0RXF1YWw7IjogIlx1MjI4OCIsCiAgICAiTm90U3VjY2VlZHM7IjogIlx1MjI4MSIsCiAgICAiTm90U3VjY2VlZHNFcXVhbDsiOiAiXHUyYWIwXHUwMzM4IiwKICAgICJOb3RTdWNjZWVkc1NsYW50RXF1YWw7IjogIlx1MjJlMSIsCiAgICAiTm90U3VjY2VlZHNUaWxkZTsiOiAiXHUyMjdmXHUwMzM4IiwKICAgICJOb3RTdXBlcnNldDsiOiAiXHUyMjgzXHUyMGQyIiwKICAgICJOb3RTdXBlcnNldEVxdWFsOyI6ICJcdTIyODkiLAogICAgIk5vdFRpbGRlOyI6ICJcdTIyNDEiLAogICAgIk5vdFRpbGRlRXF1YWw7IjogIlx1MjI0NCIsCiAgICAiTm90VGlsZGVGdWxsRXF1YWw7IjogIlx1MjI0NyIsCiAgICAiTm90VGlsZGVUaWxkZTsiOiAiXHUyMjQ5IiwKICAgICJOb3RWZXJ0aWNhbEJhcjsiOiAiXHUyMjI0IiwKICAgICJOc2NyOyI6ICJcVTAwMDFkNGE5IiwKICAgICJOdGlsZGUiOiAiXHhkMSIsCiAgICAiTnRpbGRlOyI6ICJceGQxIiwKICAgICJOdTsiOiAiXHUwMzlkIiwKICAgICJPRWxpZzsiOiAiXHUwMTUyIiwKICAgICJPYWN1dGUiOiAiXHhkMyIsCiAgICAiT2FjdXRlOyI6ICJceGQzIiwKICAgICJPY2lyYyI6ICJceGQ0IiwKICAgICJPY2lyYzsiOiAiXHhkNCIsCiAgICAiT2N5OyI6ICJcdTA0MWUiLAogICAgIk9kYmxhYzsiOiAiXHUwMTUwIiwKICAgICJPZnI7IjogIlxVMDAwMWQ1MTIiLAogICAgIk9ncmF2ZSI6ICJceGQyIiwKICAgICJPZ3JhdmU7IjogIlx4ZDIiLAogICAgIk9tYWNyOyI6ICJcdTAxNGMiLAogICAgIk9tZWdhOyI6ICJcdTAzYTkiLAogICAgIk9taWNyb247IjogIlx1MDM5ZiIsCiAgICAiT29wZjsiOiAiXFUwMDAxZDU0NiIsCiAgICAiT3BlbkN1cmx5RG91YmxlUXVvdGU7IjogIlx1MjAxYyIsCiAgICAiT3BlbkN1cmx5UXVvdGU7IjogIlx1MjAxOCIsCiAgICAiT3I7IjogIlx1MmE1NCIsCiAgICAiT3NjcjsiOiAiXFUwMDAxZDRhYSIsCiAgICAiT3NsYXNoIjogIlx4ZDgiLAogICAgIk9zbGFzaDsiOiAiXHhkOCIsCiAgICAiT3RpbGRlIjogIlx4ZDUiLAogICAgIk90aWxkZTsiOiAiXHhkNSIsCiAgICAiT3RpbWVzOyI6ICJcdTJhMzciLAogICAgIk91bWwiOiAiXHhkNiIsCiAgICAiT3VtbDsiOiAiXHhkNiIsCiAgICAiT3ZlckJhcjsiOiAiXHUyMDNlIiwKICAgICJPdmVyQnJhY2U7IjogIlx1MjNkZSIsCiAgICAiT3ZlckJyYWNrZXQ7IjogIlx1MjNiNCIsCiAgICAiT3ZlclBhcmVudGhlc2lzOyI6ICJcdTIzZGMiLAogICAgIlBhcnRpYWxEOyI6ICJcdTIyMDIiLAogICAgIlBjeTsiOiAiXHUwNDFmIiwKICAgICJQZnI7IjogIlxVMDAwMWQ1MTMiLAogICAgIlBoaTsiOiAiXHUwM2E2IiwKICAgICJQaTsiOiAiXHUwM2EwIiwKICAgICJQbHVzTWludXM7IjogIlx4YjEiLAogICAgIlBvaW5jYXJlcGxhbmU7IjogIlx1MjEwYyIsCiAgICAiUG9wZjsiOiAiXHUyMTE5IiwKICAgICJQcjsiOiAiXHUyYWJiIiwKICAgICJQcmVjZWRlczsiOiAiXHUyMjdhIiwKICAgICJQcmVjZWRlc0VxdWFsOyI6ICJcdTJhYWYiLAogICAgIlByZWNlZGVzU2xhbnRFcXVhbDsiOiAiXHUyMjdjIiwKICAgICJQcmVjZWRlc1RpbGRlOyI6ICJcdTIyN2UiLAogICAgIlByaW1lOyI6ICJcdTIwMzMiLAogICAgIlByb2R1Y3Q7IjogIlx1MjIwZiIsCiAgICAiUHJvcG9ydGlvbjsiOiAiXHUyMjM3IiwKICAgICJQcm9wb3J0aW9uYWw7IjogIlx1MjIxZCIsCiAgICAiUHNjcjsiOiAiXFUwMDAxZDRhYiIsCiAgICAiUHNpOyI6ICJcdTAzYTgiLAogICAgIlFVT1QiOiAiXCIiLAogICAgIlFVT1Q7IjogIlwiIiwKICAgICJRZnI7IjogIlxVMDAwMWQ1MTQiLAogICAgIlFvcGY7IjogIlx1MjExYSIsCiAgICAiUXNjcjsiOiAiXFUwMDAxZDRhYyIsCiAgICAiUkJhcnI7IjogIlx1MjkxMCIsCiAgICAiUkVHIjogIlx4YWUiLAogICAgIlJFRzsiOiAiXHhhZSIsCiAgICAiUmFjdXRlOyI6ICJcdTAxNTQiLAogICAgIlJhbmc7IjogIlx1MjdlYiIsCiAgICAiUmFycjsiOiAiXHUyMWEwIiwKICAgICJSYXJydGw7IjogIlx1MjkxNiIsCiAgICAiUmNhcm9uOyI6ICJcdTAxNTgiLAogICAgIlJjZWRpbDsiOiAiXHUwMTU2IiwKICAgICJSY3k7IjogIlx1MDQyMCIsCiAgICAiUmU7IjogIlx1MjExYyIsCiAgICAiUmV2ZXJzZUVsZW1lbnQ7IjogIlx1MjIwYiIsCiAgICAiUmV2ZXJzZUVxdWlsaWJyaXVtOyI6ICJcdTIxY2IiLAogICAgIlJldmVyc2VVcEVxdWlsaWJyaXVtOyI6ICJcdTI5NmYiLAogICAgIlJmcjsiOiAiXHUyMTFjIiwKICAgICJSaG87IjogIlx1MDNhMSIsCiAgICAiUmlnaHRBbmdsZUJyYWNrZXQ7IjogIlx1MjdlOSIsCiAgICAiUmlnaHRBcnJvdzsiOiAiXHUyMTkyIiwKICAgICJSaWdodEFycm93QmFyOyI6ICJcdTIxZTUiLAogICAgIlJpZ2h0QXJyb3dMZWZ0QXJyb3c7IjogIlx1MjFjNCIsCiAgICAiUmlnaHRDZWlsaW5nOyI6ICJcdTIzMDkiLAogICAgIlJpZ2h0RG91YmxlQnJhY2tldDsiOiAiXHUyN2U3IiwKICAgICJSaWdodERvd25UZWVWZWN0b3I7IjogIlx1Mjk1ZCIsCiAgICAiUmlnaHREb3duVmVjdG9yOyI6ICJcdTIxYzIiLAogICAgIlJpZ2h0RG93blZlY3RvckJhcjsiOiAiXHUyOTU1IiwKICAgICJSaWdodEZsb29yOyI6ICJcdTIzMGIiLAogICAgIlJpZ2h0VGVlOyI6ICJcdTIyYTIiLAogICAgIlJpZ2h0VGVlQXJyb3c7IjogIlx1MjFhNiIsCiAgICAiUmlnaHRUZWVWZWN0b3I7IjogIlx1Mjk1YiIsCiAgICAiUmlnaHRUcmlhbmdsZTsiOiAiXHUyMmIzIiwKICAgICJSaWdodFRyaWFuZ2xlQmFyOyI6ICJcdTI5ZDAiLAogICAgIlJpZ2h0VHJpYW5nbGVFcXVhbDsiOiAiXHUyMmI1IiwKICAgICJSaWdodFVwRG93blZlY3RvcjsiOiAiXHUyOTRmIiwKICAgICJSaWdodFVwVGVlVmVjdG9yOyI6ICJcdTI5NWMiLAogICAgIlJpZ2h0VXBWZWN0b3I7IjogIlx1MjFiZSIsCiAgICAiUmlnaHRVcFZlY3RvckJhcjsiOiAiXHUyOTU0IiwKICAgICJSaWdodFZlY3RvcjsiOiAiXHUyMWMwIiwKICAgICJSaWdodFZlY3RvckJhcjsiOiAiXHUyOTUzIiwKICAgICJSaWdodGFycm93OyI6ICJcdTIxZDIiLAogICAgIlJvcGY7IjogIlx1MjExZCIsCiAgICAiUm91bmRJbXBsaWVzOyI6ICJcdTI5NzAiLAogICAgIlJyaWdodGFycm93OyI6ICJcdTIxZGIiLAogICAgIlJzY3I7IjogIlx1MjExYiIsCiAgICAiUnNoOyI6ICJcdTIxYjEiLAogICAgIlJ1bGVEZWxheWVkOyI6ICJcdTI5ZjQiLAogICAgIlNIQ0hjeTsiOiAiXHUwNDI5IiwKICAgICJTSGN5OyI6ICJcdTA0MjgiLAogICAgIlNPRlRjeTsiOiAiXHUwNDJjIiwKICAgICJTYWN1dGU7IjogIlx1MDE1YSIsCiAgICAiU2M7IjogIlx1MmFiYyIsCiAgICAiU2Nhcm9uOyI6ICJcdTAxNjAiLAogICAgIlNjZWRpbDsiOiAiXHUwMTVlIiwKICAgICJTY2lyYzsiOiAiXHUwMTVjIiwKICAgICJTY3k7IjogIlx1MDQyMSIsCiAgICAiU2ZyOyI6ICJcVTAwMDFkNTE2IiwKICAgICJTaG9ydERvd25BcnJvdzsiOiAiXHUyMTkzIiwKICAgICJTaG9ydExlZnRBcnJvdzsiOiAiXHUyMTkwIiwKICAgICJTaG9ydFJpZ2h0QXJyb3c7IjogIlx1MjE5MiIsCiAgICAiU2hvcnRVcEFycm93OyI6ICJcdTIxOTEiLAogICAgIlNpZ21hOyI6ICJcdTAzYTMiLAogICAgIlNtYWxsQ2lyY2xlOyI6ICJcdTIyMTgiLAogICAgIlNvcGY7IjogIlxVMDAwMWQ1NGEiLAogICAgIlNxcnQ7IjogIlx1MjIxYSIsCiAgICAiU3F1YXJlOyI6ICJcdTI1YTEiLAogICAgIlNxdWFyZUludGVyc2VjdGlvbjsiOiAiXHUyMjkzIiwKICAgICJTcXVhcmVTdWJzZXQ7IjogIlx1MjI4ZiIsCiAgICAiU3F1YXJlU3Vic2V0RXF1YWw7IjogIlx1MjI5MSIsCiAgICAiU3F1YXJlU3VwZXJzZXQ7IjogIlx1MjI5MCIsCiAgICAiU3F1YXJlU3VwZXJzZXRFcXVhbDsiOiAiXHUyMjkyIiwKICAgICJTcXVhcmVVbmlvbjsiOiAiXHUyMjk0IiwKICAgICJTc2NyOyI6ICJcVTAwMDFkNGFlIiwKICAgICJTdGFyOyI6ICJcdTIyYzYiLAogICAgIlN1YjsiOiAiXHUyMmQwIiwKICAgICJTdWJzZXQ7IjogIlx1MjJkMCIsCiAgICAiU3Vic2V0RXF1YWw7IjogIlx1MjI4NiIsCiAgICAiU3VjY2VlZHM7IjogIlx1MjI3YiIsCiAgICAiU3VjY2VlZHNFcXVhbDsiOiAiXHUyYWIwIiwKICAgICJTdWNjZWVkc1NsYW50RXF1YWw7IjogIlx1MjI3ZCIsCiAgICAiU3VjY2VlZHNUaWxkZTsiOiAiXHUyMjdmIiwKICAgICJTdWNoVGhhdDsiOiAiXHUyMjBiIiwKICAgICJTdW07IjogIlx1MjIxMSIsCiAgICAiU3VwOyI6ICJcdTIyZDEiLAogICAgIlN1cGVyc2V0OyI6ICJcdTIyODMiLAogICAgIlN1cGVyc2V0RXF1YWw7IjogIlx1MjI4NyIsCiAgICAiU3Vwc2V0OyI6ICJcdTIyZDEiLAogICAgIlRIT1JOIjogIlx4ZGUiLAogICAgIlRIT1JOOyI6ICJceGRlIiwKICAgICJUUkFERTsiOiAiXHUyMTIyIiwKICAgICJUU0hjeTsiOiAiXHUwNDBiIiwKICAgICJUU2N5OyI6ICJcdTA0MjYiLAogICAgIlRhYjsiOiAiXHQiLAogICAgIlRhdTsiOiAiXHUwM2E0IiwKICAgICJUY2Fyb247IjogIlx1MDE2NCIsCiAgICAiVGNlZGlsOyI6ICJcdTAxNjIiLAogICAgIlRjeTsiOiAiXHUwNDIyIiwKICAgICJUZnI7IjogIlxVMDAwMWQ1MTciLAogICAgIlRoZXJlZm9yZTsiOiAiXHUyMjM0IiwKICAgICJUaGV0YTsiOiAiXHUwMzk4IiwKICAgICJUaGlja1NwYWNlOyI6ICJcdTIwNWZcdTIwMGEiLAogICAgIlRoaW5TcGFjZTsiOiAiXHUyMDA5IiwKICAgICJUaWxkZTsiOiAiXHUyMjNjIiwKICAgICJUaWxkZUVxdWFsOyI6ICJcdTIyNDMiLAogICAgIlRpbGRlRnVsbEVxdWFsOyI6ICJcdTIyNDUiLAogICAgIlRpbGRlVGlsZGU7IjogIlx1MjI0OCIsCiAgICAiVG9wZjsiOiAiXFUwMDAxZDU0YiIsCiAgICAiVHJpcGxlRG90OyI6ICJcdTIwZGIiLAogICAgIlRzY3I7IjogIlxVMDAwMWQ0YWYiLAogICAgIlRzdHJvazsiOiAiXHUwMTY2IiwKICAgICJVYWN1dGUiOiAiXHhkYSIsCiAgICAiVWFjdXRlOyI6ICJceGRhIiwKICAgICJVYXJyOyI6ICJcdTIxOWYiLAogICAgIlVhcnJvY2lyOyI6ICJcdTI5NDkiLAogICAgIlVicmN5OyI6ICJcdTA0MGUiLAogICAgIlVicmV2ZTsiOiAiXHUwMTZjIiwKICAgICJVY2lyYyI6ICJceGRiIiwKICAgICJVY2lyYzsiOiAiXHhkYiIsCiAgICAiVWN5OyI6ICJcdTA0MjMiLAogICAgIlVkYmxhYzsiOiAiXHUwMTcwIiwKICAgICJVZnI7IjogIlxVMDAwMWQ1MTgiLAogICAgIlVncmF2ZSI6ICJceGQ5IiwKICAgICJVZ3JhdmU7IjogIlx4ZDkiLAogICAgIlVtYWNyOyI6ICJcdTAxNmEiLAogICAgIlVuZGVyQmFyOyI6ICJfIiwKICAgICJVbmRlckJyYWNlOyI6ICJcdTIzZGYiLAogICAgIlVuZGVyQnJhY2tldDsiOiAiXHUyM2I1IiwKICAgICJVbmRlclBhcmVudGhlc2lzOyI6ICJcdTIzZGQiLAogICAgIlVuaW9uOyI6ICJcdTIyYzMiLAogICAgIlVuaW9uUGx1czsiOiAiXHUyMjhlIiwKICAgICJVb2dvbjsiOiAiXHUwMTcyIiwKICAgICJVb3BmOyI6ICJcVTAwMDFkNTRjIiwKICAgICJVcEFycm93OyI6ICJcdTIxOTEiLAogICAgIlVwQXJyb3dCYXI7IjogIlx1MjkxMiIsCiAgICAiVXBBcnJvd0Rvd25BcnJvdzsiOiAiXHUyMWM1IiwKICAgICJVcERvd25BcnJvdzsiOiAiXHUyMTk1IiwKICAgICJVcEVxdWlsaWJyaXVtOyI6ICJcdTI5NmUiLAogICAgIlVwVGVlOyI6ICJcdTIyYTUiLAogICAgIlVwVGVlQXJyb3c7IjogIlx1MjFhNSIsCiAgICAiVXBhcnJvdzsiOiAiXHUyMWQxIiwKICAgICJVcGRvd25hcnJvdzsiOiAiXHUyMWQ1IiwKICAgICJVcHBlckxlZnRBcnJvdzsiOiAiXHUyMTk2IiwKICAgICJVcHBlclJpZ2h0QXJyb3c7IjogIlx1MjE5NyIsCiAgICAiVXBzaTsiOiAiXHUwM2QyIiwKICAgICJVcHNpbG9uOyI6ICJcdTAzYTUiLAogICAgIlVyaW5nOyI6ICJcdTAxNmUiLAogICAgIlVzY3I7IjogIlxVMDAwMWQ0YjAiLAogICAgIlV0aWxkZTsiOiAiXHUwMTY4IiwKICAgICJVdW1sIjogIlx4ZGMiLAogICAgIlV1bWw7IjogIlx4ZGMiLAogICAgIlZEYXNoOyI6ICJcdTIyYWIiLAogICAgIlZiYXI7IjogIlx1MmFlYiIsCiAgICAiVmN5OyI6ICJcdTA0MTIiLAogICAgIlZkYXNoOyI6ICJcdTIyYTkiLAogICAgIlZkYXNobDsiOiAiXHUyYWU2IiwKICAgICJWZWU7IjogIlx1MjJjMSIsCiAgICAiVmVyYmFyOyI6ICJcdTIwMTYiLAogICAgIlZlcnQ7IjogIlx1MjAxNiIsCiAgICAiVmVydGljYWxCYXI7IjogIlx1MjIyMyIsCiAgICAiVmVydGljYWxMaW5lOyI6ICJ8IiwKICAgICJWZXJ0aWNhbFNlcGFyYXRvcjsiOiAiXHUyNzU4IiwKICAgICJWZXJ0aWNhbFRpbGRlOyI6ICJcdTIyNDAiLAogICAgIlZlcnlUaGluU3BhY2U7IjogIlx1MjAwYSIsCiAgICAiVmZyOyI6ICJcVTAwMDFkNTE5IiwKICAgICJWb3BmOyI6ICJcVTAwMDFkNTRkIiwKICAgICJWc2NyOyI6ICJcVTAwMDFkNGIxIiwKICAgICJWdmRhc2g7IjogIlx1MjJhYSIsCiAgICAiV2NpcmM7IjogIlx1MDE3NCIsCiAgICAiV2VkZ2U7IjogIlx1MjJjMCIsCiAgICAiV2ZyOyI6ICJcVTAwMDFkNTFhIiwKICAgICJXb3BmOyI6ICJcVTAwMDFkNTRlIiwKICAgICJXc2NyOyI6ICJcVTAwMDFkNGIyIiwKICAgICJYZnI7IjogIlxVMDAwMWQ1MWIiLAogICAgIlhpOyI6ICJcdTAzOWUiLAogICAgIlhvcGY7IjogIlxVMDAwMWQ1NGYiLAogICAgIlhzY3I7IjogIlxVMDAwMWQ0YjMiLAogICAgIllBY3k7IjogIlx1MDQyZiIsCiAgICAiWUljeTsiOiAiXHUwNDA3IiwKICAgICJZVWN5OyI6ICJcdTA0MmUiLAogICAgIllhY3V0ZSI6ICJceGRkIiwKICAgICJZYWN1dGU7IjogIlx4ZGQiLAogICAgIlljaXJjOyI6ICJcdTAxNzYiLAogICAgIlljeTsiOiAiXHUwNDJiIiwKICAgICJZZnI7IjogIlxVMDAwMWQ1MWMiLAogICAgIllvcGY7IjogIlxVMDAwMWQ1NTAiLAogICAgIllzY3I7IjogIlxVMDAwMWQ0YjQiLAogICAgIll1bWw7IjogIlx1MDE3OCIsCiAgICAiWkhjeTsiOiAiXHUwNDE2IiwKICAgICJaYWN1dGU7IjogIlx1MDE3OSIsCiAgICAiWmNhcm9uOyI6ICJcdTAxN2QiLAogICAgIlpjeTsiOiAiXHUwNDE3IiwKICAgICJaZG90OyI6ICJcdTAxN2IiLAogICAgIlplcm9XaWR0aFNwYWNlOyI6ICJcdTIwMGIiLAogICAgIlpldGE7IjogIlx1MDM5NiIsCiAgICAiWmZyOyI6ICJcdTIxMjgiLAogICAgIlpvcGY7IjogIlx1MjEyNCIsCiAgICAiWnNjcjsiOiAiXFUwMDAxZDRiNSIsCiAgICAiYWFjdXRlIjogIlx4ZTEiLAogICAgImFhY3V0ZTsiOiAiXHhlMSIsCiAgICAiYWJyZXZlOyI6ICJcdTAxMDMiLAogICAgImFjOyI6ICJcdTIyM2UiLAogICAgImFjRTsiOiAiXHUyMjNlXHUwMzMzIiwKICAgICJhY2Q7IjogIlx1MjIzZiIsCiAgICAiYWNpcmMiOiAiXHhlMiIsCiAgICAiYWNpcmM7IjogIlx4ZTIiLAogICAgImFjdXRlIjogIlx4YjQiLAogICAgImFjdXRlOyI6ICJceGI0IiwKICAgICJhY3k7IjogIlx1MDQzMCIsCiAgICAiYWVsaWciOiAiXHhlNiIsCiAgICAiYWVsaWc7IjogIlx4ZTYiLAogICAgImFmOyI6ICJcdTIwNjEiLAogICAgImFmcjsiOiAiXFUwMDAxZDUxZSIsCiAgICAiYWdyYXZlIjogIlx4ZTAiLAogICAgImFncmF2ZTsiOiAiXHhlMCIsCiAgICAiYWxlZnN5bTsiOiAiXHUyMTM1IiwKICAgICJhbGVwaDsiOiAiXHUyMTM1IiwKICAgICJhbHBoYTsiOiAiXHUwM2IxIiwKICAgICJhbWFjcjsiOiAiXHUwMTAxIiwKICAgICJhbWFsZzsiOiAiXHUyYTNmIiwKICAgICJhbXAiOiAiJiIsCiAgICAiYW1wOyI6ICImIiwKICAgICJhbmQ7IjogIlx1MjIyNyIsCiAgICAiYW5kYW5kOyI6ICJcdTJhNTUiLAogICAgImFuZGQ7IjogIlx1MmE1YyIsCiAgICAiYW5kc2xvcGU7IjogIlx1MmE1OCIsCiAgICAiYW5kdjsiOiAiXHUyYTVhIiwKICAgICJhbmc7IjogIlx1MjIyMCIsCiAgICAiYW5nZTsiOiAiXHUyOWE0IiwKICAgICJhbmdsZTsiOiAiXHUyMjIwIiwKICAgICJhbmdtc2Q7IjogIlx1MjIyMSIsCiAgICAiYW5nbXNkYWE7IjogIlx1MjlhOCIsCiAgICAiYW5nbXNkYWI7IjogIlx1MjlhOSIsCiAgICAiYW5nbXNkYWM7IjogIlx1MjlhYSIsCiAgICAiYW5nbXNkYWQ7IjogIlx1MjlhYiIsCiAgICAiYW5nbXNkYWU7IjogIlx1MjlhYyIsCiAgICAiYW5nbXNkYWY7IjogIlx1MjlhZCIsCiAgICAiYW5nbXNkYWc7IjogIlx1MjlhZSIsCiAgICAiYW5nbXNkYWg7IjogIlx1MjlhZiIsCiAgICAiYW5ncnQ7IjogIlx1MjIxZiIsCiAgICAiYW5ncnR2YjsiOiAiXHUyMmJlIiwKICAgICJhbmdydHZiZDsiOiAiXHUyOTlkIiwKICAgICJhbmdzcGg7IjogIlx1MjIyMiIsCiAgICAiYW5nc3Q7IjogIlx4YzUiLAogICAgImFuZ3phcnI7IjogIlx1MjM3YyIsCiAgICAiYW9nb247IjogIlx1MDEwNSIsCiAgICAiYW9wZjsiOiAiXFUwMDAxZDU1MiIsCiAgICAiYXA7IjogIlx1MjI0OCIsCiAgICAiYXBFOyI6ICJcdTJhNzAiLAogICAgImFwYWNpcjsiOiAiXHUyYTZmIiwKICAgICJhcGU7IjogIlx1MjI0YSIsCiAgICAiYXBpZDsiOiAiXHUyMjRiIiwKICAgICJhcG9zOyI6ICInIiwKICAgICJhcHByb3g7IjogIlx1MjI0OCIsCiAgICAiYXBwcm94ZXE7IjogIlx1MjI0YSIsCiAgICAiYXJpbmciOiAiXHhlNSIsCiAgICAiYXJpbmc7IjogIlx4ZTUiLAogICAgImFzY3I7IjogIlxVMDAwMWQ0YjYiLAogICAgImFzdDsiOiAiKiIsCiAgICAiYXN5bXA7IjogIlx1MjI0OCIsCiAgICAiYXN5bXBlcTsiOiAiXHUyMjRkIiwKICAgICJhdGlsZGUiOiAiXHhlMyIsCiAgICAiYXRpbGRlOyI6ICJceGUzIiwKICAgICJhdW1sIjogIlx4ZTQiLAogICAgImF1bWw7IjogIlx4ZTQiLAogICAgImF3Y29uaW50OyI6ICJcdTIyMzMiLAogICAgImF3aW50OyI6ICJcdTJhMTEiLAogICAgImJOb3Q7IjogIlx1MmFlZCIsCiAgICAiYmFja2Nvbmc7IjogIlx1MjI0YyIsCiAgICAiYmFja2Vwc2lsb247IjogIlx1MDNmNiIsCiAgICAiYmFja3ByaW1lOyI6ICJcdTIwMzUiLAogICAgImJhY2tzaW07IjogIlx1MjIzZCIsCiAgICAiYmFja3NpbWVxOyI6ICJcdTIyY2QiLAogICAgImJhcnZlZTsiOiAiXHUyMmJkIiwKICAgICJiYXJ3ZWQ7IjogIlx1MjMwNSIsCiAgICAiYmFyd2VkZ2U7IjogIlx1MjMwNSIsCiAgICAiYmJyazsiOiAiXHUyM2I1IiwKICAgICJiYnJrdGJyazsiOiAiXHUyM2I2IiwKICAgICJiY29uZzsiOiAiXHUyMjRjIiwKICAgICJiY3k7IjogIlx1MDQzMSIsCiAgICAiYmRxdW87IjogIlx1MjAxZSIsCiAgICAiYmVjYXVzOyI6ICJcdTIyMzUiLAogICAgImJlY2F1c2U7IjogIlx1MjIzNSIsCiAgICAiYmVtcHR5djsiOiAiXHUyOWIwIiwKICAgICJiZXBzaTsiOiAiXHUwM2Y2IiwKICAgICJiZXJub3U7IjogIlx1MjEyYyIsCiAgICAiYmV0YTsiOiAiXHUwM2IyIiwKICAgICJiZXRoOyI6ICJcdTIxMzYiLAogICAgImJldHdlZW47IjogIlx1MjI2YyIsCiAgICAiYmZyOyI6ICJcVTAwMDFkNTFmIiwKICAgICJiaWdjYXA7IjogIlx1MjJjMiIsCiAgICAiYmlnY2lyYzsiOiAiXHUyNWVmIiwKICAgICJiaWdjdXA7IjogIlx1MjJjMyIsCiAgICAiYmlnb2RvdDsiOiAiXHUyYTAwIiwKICAgICJiaWdvcGx1czsiOiAiXHUyYTAxIiwKICAgICJiaWdvdGltZXM7IjogIlx1MmEwMiIsCiAgICAiYmlnc3FjdXA7IjogIlx1MmEwNiIsCiAgICAiYmlnc3RhcjsiOiAiXHUyNjA1IiwKICAgICJiaWd0cmlhbmdsZWRvd247IjogIlx1MjViZCIsCiAgICAiYmlndHJpYW5nbGV1cDsiOiAiXHUyNWIzIiwKICAgICJiaWd1cGx1czsiOiAiXHUyYTA0IiwKICAgICJiaWd2ZWU7IjogIlx1MjJjMSIsCiAgICAiYmlnd2VkZ2U7IjogIlx1MjJjMCIsCiAgICAiYmthcm93OyI6ICJcdTI5MGQiLAogICAgImJsYWNrbG96ZW5nZTsiOiAiXHUyOWViIiwKICAgICJibGFja3NxdWFyZTsiOiAiXHUyNWFhIiwKICAgICJibGFja3RyaWFuZ2xlOyI6ICJcdTI1YjQiLAogICAgImJsYWNrdHJpYW5nbGVkb3duOyI6ICJcdTI1YmUiLAogICAgImJsYWNrdHJpYW5nbGVsZWZ0OyI6ICJcdTI1YzIiLAogICAgImJsYWNrdHJpYW5nbGVyaWdodDsiOiAiXHUyNWI4IiwKICAgICJibGFuazsiOiAiXHUyNDIzIiwKICAgICJibGsxMjsiOiAiXHUyNTkyIiwKICAgICJibGsxNDsiOiAiXHUyNTkxIiwKICAgICJibGszNDsiOiAiXHUyNTkzIiwKICAgICJibG9jazsiOiAiXHUyNTg4IiwKICAgICJibmU7IjogIj1cdTIwZTUiLAogICAgImJuZXF1aXY7IjogIlx1MjI2MVx1MjBlNSIsCiAgICAiYm5vdDsiOiAiXHUyMzEwIiwKICAgICJib3BmOyI6ICJcVTAwMDFkNTUzIiwKICAgICJib3Q7IjogIlx1MjJhNSIsCiAgICAiYm90dG9tOyI6ICJcdTIyYTUiLAogICAgImJvd3RpZTsiOiAiXHUyMmM4IiwKICAgICJib3hETDsiOiAiXHUyNTU3IiwKICAgICJib3hEUjsiOiAiXHUyNTU0IiwKICAgICJib3hEbDsiOiAiXHUyNTU2IiwKICAgICJib3hEcjsiOiAiXHUyNTUzIiwKICAgICJib3hIOyI6ICJcdTI1NTAiLAogICAgImJveEhEOyI6ICJcdTI1NjYiLAogICAgImJveEhVOyI6ICJcdTI1NjkiLAogICAgImJveEhkOyI6ICJcdTI1NjQiLAogICAgImJveEh1OyI6ICJcdTI1NjciLAogICAgImJveFVMOyI6ICJcdTI1NWQiLAogICAgImJveFVSOyI6ICJcdTI1NWEiLAogICAgImJveFVsOyI6ICJcdTI1NWMiLAogICAgImJveFVyOyI6ICJcdTI1NTkiLAogICAgImJveFY7IjogIlx1MjU1MSIsCiAgICAiYm94Vkg7IjogIlx1MjU2YyIsCiAgICAiYm94Vkw7IjogIlx1MjU2MyIsCiAgICAiYm94VlI7IjogIlx1MjU2MCIsCiAgICAiYm94Vmg7IjogIlx1MjU2YiIsCiAgICAiYm94Vmw7IjogIlx1MjU2MiIsCiAgICAiYm94VnI7IjogIlx1MjU1ZiIsCiAgICAiYm94Ym94OyI6ICJcdTI5YzkiLAogICAgImJveGRMOyI6ICJcdTI1NTUiLAogICAgImJveGRSOyI6ICJcdTI1NTIiLAogICAgImJveGRsOyI6ICJcdTI1MTAiLAogICAgImJveGRyOyI6ICJcdTI1MGMiLAogICAgImJveGg7IjogIlx1MjUwMCIsCiAgICAiYm94aEQ7IjogIlx1MjU2NSIsCiAgICAiYm94aFU7IjogIlx1MjU2OCIsCiAgICAiYm94aGQ7IjogIlx1MjUyYyIsCiAgICAiYm94aHU7IjogIlx1MjUzNCIsCiAgICAiYm94bWludXM7IjogIlx1MjI5ZiIsCiAgICAiYm94cGx1czsiOiAiXHUyMjllIiwKICAgICJib3h0aW1lczsiOiAiXHUyMmEwIiwKICAgICJib3h1TDsiOiAiXHUyNTViIiwKICAgICJib3h1UjsiOiAiXHUyNTU4IiwKICAgICJib3h1bDsiOiAiXHUyNTE4IiwKICAgICJib3h1cjsiOiAiXHUyNTE0IiwKICAgICJib3h2OyI6ICJcdTI1MDIiLAogICAgImJveHZIOyI6ICJcdTI1NmEiLAogICAgImJveHZMOyI6ICJcdTI1NjEiLAogICAgImJveHZSOyI6ICJcdTI1NWUiLAogICAgImJveHZoOyI6ICJcdTI1M2MiLAogICAgImJveHZsOyI6ICJcdTI1MjQiLAogICAgImJveHZyOyI6ICJcdTI1MWMiLAogICAgImJwcmltZTsiOiAiXHUyMDM1IiwKICAgICJicmV2ZTsiOiAiXHUwMmQ4IiwKICAgICJicnZiYXIiOiAiXHhhNiIsCiAgICAiYnJ2YmFyOyI6ICJceGE2IiwKICAgICJic2NyOyI6ICJcVTAwMDFkNGI3IiwKICAgICJic2VtaTsiOiAiXHUyMDRmIiwKICAgICJic2ltOyI6ICJcdTIyM2QiLAogICAgImJzaW1lOyI6ICJcdTIyY2QiLAogICAgImJzb2w7IjogIlxcIiwKICAgICJic29sYjsiOiAiXHUyOWM1IiwKICAgICJic29saHN1YjsiOiAiXHUyN2M4IiwKICAgICJidWxsOyI6ICJcdTIwMjIiLAogICAgImJ1bGxldDsiOiAiXHUyMDIyIiwKICAgICJidW1wOyI6ICJcdTIyNGUiLAogICAgImJ1bXBFOyI6ICJcdTJhYWUiLAogICAgImJ1bXBlOyI6ICJcdTIyNGYiLAogICAgImJ1bXBlcTsiOiAiXHUyMjRmIiwKICAgICJjYWN1dGU7IjogIlx1MDEwNyIsCiAgICAiY2FwOyI6ICJcdTIyMjkiLAogICAgImNhcGFuZDsiOiAiXHUyYTQ0IiwKICAgICJjYXBicmN1cDsiOiAiXHUyYTQ5IiwKICAgICJjYXBjYXA7IjogIlx1MmE0YiIsCiAgICAiY2FwY3VwOyI6ICJcdTJhNDciLAogICAgImNhcGRvdDsiOiAiXHUyYTQwIiwKICAgICJjYXBzOyI6ICJcdTIyMjlcdWZlMDAiLAogICAgImNhcmV0OyI6ICJcdTIwNDEiLAogICAgImNhcm9uOyI6ICJcdTAyYzciLAogICAgImNjYXBzOyI6ICJcdTJhNGQiLAogICAgImNjYXJvbjsiOiAiXHUwMTBkIiwKICAgICJjY2VkaWwiOiAiXHhlNyIsCiAgICAiY2NlZGlsOyI6ICJceGU3IiwKICAgICJjY2lyYzsiOiAiXHUwMTA5IiwKICAgICJjY3VwczsiOiAiXHUyYTRjIiwKICAgICJjY3Vwc3NtOyI6ICJcdTJhNTAiLAogICAgImNkb3Q7IjogIlx1MDEwYiIsCiAgICAiY2VkaWwiOiAiXHhiOCIsCiAgICAiY2VkaWw7IjogIlx4YjgiLAogICAgImNlbXB0eXY7IjogIlx1MjliMiIsCiAgICAiY2VudCI6ICJceGEyIiwKICAgICJjZW50OyI6ICJceGEyIiwKICAgICJjZW50ZXJkb3Q7IjogIlx4YjciLAogICAgImNmcjsiOiAiXFUwMDAxZDUyMCIsCiAgICAiY2hjeTsiOiAiXHUwNDQ3IiwKICAgICJjaGVjazsiOiAiXHUyNzEzIiwKICAgICJjaGVja21hcms7IjogIlx1MjcxMyIsCiAgICAiY2hpOyI6ICJcdTAzYzciLAogICAgImNpcjsiOiAiXHUyNWNiIiwKICAgICJjaXJFOyI6ICJcdTI5YzMiLAogICAgImNpcmM7IjogIlx1MDJjNiIsCiAgICAiY2lyY2VxOyI6ICJcdTIyNTciLAogICAgImNpcmNsZWFycm93bGVmdDsiOiAiXHUyMWJhIiwKICAgICJjaXJjbGVhcnJvd3JpZ2h0OyI6ICJcdTIxYmIiLAogICAgImNpcmNsZWRSOyI6ICJceGFlIiwKICAgICJjaXJjbGVkUzsiOiAiXHUyNGM4IiwKICAgICJjaXJjbGVkYXN0OyI6ICJcdTIyOWIiLAogICAgImNpcmNsZWRjaXJjOyI6ICJcdTIyOWEiLAogICAgImNpcmNsZWRkYXNoOyI6ICJcdTIyOWQiLAogICAgImNpcmU7IjogIlx1MjI1NyIsCiAgICAiY2lyZm5pbnQ7IjogIlx1MmExMCIsCiAgICAiY2lybWlkOyI6ICJcdTJhZWYiLAogICAgImNpcnNjaXI7IjogIlx1MjljMiIsCiAgICAiY2x1YnM7IjogIlx1MjY2MyIsCiAgICAiY2x1YnN1aXQ7IjogIlx1MjY2MyIsCiAgICAiY29sb247IjogIjoiLAogICAgImNvbG9uZTsiOiAiXHUyMjU0IiwKICAgICJjb2xvbmVxOyI6ICJcdTIyNTQiLAogICAgImNvbW1hOyI6ICIsIiwKICAgICJjb21tYXQ7IjogIkAiLAogICAgImNvbXA7IjogIlx1MjIwMSIsCiAgICAiY29tcGZuOyI6ICJcdTIyMTgiLAogICAgImNvbXBsZW1lbnQ7IjogIlx1MjIwMSIsCiAgICAiY29tcGxleGVzOyI6ICJcdTIxMDIiLAogICAgImNvbmc7IjogIlx1MjI0NSIsCiAgICAiY29uZ2RvdDsiOiAiXHUyYTZkIiwKICAgICJjb25pbnQ7IjogIlx1MjIyZSIsCiAgICAiY29wZjsiOiAiXFUwMDAxZDU1NCIsCiAgICAiY29wcm9kOyI6ICJcdTIyMTAiLAogICAgImNvcHkiOiAiXHhhOSIsCiAgICAiY29weTsiOiAiXHhhOSIsCiAgICAiY29weXNyOyI6ICJcdTIxMTciLAogICAgImNyYXJyOyI6ICJcdTIxYjUiLAogICAgImNyb3NzOyI6ICJcdTI3MTciLAogICAgImNzY3I7IjogIlxVMDAwMWQ0YjgiLAogICAgImNzdWI7IjogIlx1MmFjZiIsCiAgICAiY3N1YmU7IjogIlx1MmFkMSIsCiAgICAiY3N1cDsiOiAiXHUyYWQwIiwKICAgICJjc3VwZTsiOiAiXHUyYWQyIiwKICAgICJjdGRvdDsiOiAiXHUyMmVmIiwKICAgICJjdWRhcnJsOyI6ICJcdTI5MzgiLAogICAgImN1ZGFycnI7IjogIlx1MjkzNSIsCiAgICAiY3VlcHI7IjogIlx1MjJkZSIsCiAgICAiY3Vlc2M7IjogIlx1MjJkZiIsCiAgICAiY3VsYXJyOyI6ICJcdTIxYjYiLAogICAgImN1bGFycnA7IjogIlx1MjkzZCIsCiAgICAiY3VwOyI6ICJcdTIyMmEiLAogICAgImN1cGJyY2FwOyI6ICJcdTJhNDgiLAogICAgImN1cGNhcDsiOiAiXHUyYTQ2IiwKICAgICJjdXBjdXA7IjogIlx1MmE0YSIsCiAgICAiY3VwZG90OyI6ICJcdTIyOGQiLAogICAgImN1cG9yOyI6ICJcdTJhNDUiLAogICAgImN1cHM7IjogIlx1MjIyYVx1ZmUwMCIsCiAgICAiY3VyYXJyOyI6ICJcdTIxYjciLAogICAgImN1cmFycm07IjogIlx1MjkzYyIsCiAgICAiY3VybHllcXByZWM7IjogIlx1MjJkZSIsCiAgICAiY3VybHllcXN1Y2M7IjogIlx1MjJkZiIsCiAgICAiY3VybHl2ZWU7IjogIlx1MjJjZSIsCiAgICAiY3VybHl3ZWRnZTsiOiAiXHUyMmNmIiwKICAgICJjdXJyZW4iOiAiXHhhNCIsCiAgICAiY3VycmVuOyI6ICJceGE0IiwKICAgICJjdXJ2ZWFycm93bGVmdDsiOiAiXHUyMWI2IiwKICAgICJjdXJ2ZWFycm93cmlnaHQ7IjogIlx1MjFiNyIsCiAgICAiY3V2ZWU7IjogIlx1MjJjZSIsCiAgICAiY3V3ZWQ7IjogIlx1MjJjZiIsCiAgICAiY3djb25pbnQ7IjogIlx1MjIzMiIsCiAgICAiY3dpbnQ7IjogIlx1MjIzMSIsCiAgICAiY3lsY3R5OyI6ICJcdTIzMmQiLAogICAgImRBcnI7IjogIlx1MjFkMyIsCiAgICAiZEhhcjsiOiAiXHUyOTY1IiwKICAgICJkYWdnZXI7IjogIlx1MjAyMCIsCiAgICAiZGFsZXRoOyI6ICJcdTIxMzgiLAogICAgImRhcnI7IjogIlx1MjE5MyIsCiAgICAiZGFzaDsiOiAiXHUyMDEwIiwKICAgICJkYXNodjsiOiAiXHUyMmEzIiwKICAgICJkYmthcm93OyI6ICJcdTI5MGYiLAogICAgImRibGFjOyI6ICJcdTAyZGQiLAogICAgImRjYXJvbjsiOiAiXHUwMTBmIiwKICAgICJkY3k7IjogIlx1MDQzNCIsCiAgICAiZGQ7IjogIlx1MjE0NiIsCiAgICAiZGRhZ2dlcjsiOiAiXHUyMDIxIiwKICAgICJkZGFycjsiOiAiXHUyMWNhIiwKICAgICJkZG90c2VxOyI6ICJcdTJhNzciLAogICAgImRlZyI6ICJceGIwIiwKICAgICJkZWc7IjogIlx4YjAiLAogICAgImRlbHRhOyI6ICJcdTAzYjQiLAogICAgImRlbXB0eXY7IjogIlx1MjliMSIsCiAgICAiZGZpc2h0OyI6ICJcdTI5N2YiLAogICAgImRmcjsiOiAiXFUwMDAxZDUyMSIsCiAgICAiZGhhcmw7IjogIlx1MjFjMyIsCiAgICAiZGhhcnI7IjogIlx1MjFjMiIsCiAgICAiZGlhbTsiOiAiXHUyMmM0IiwKICAgICJkaWFtb25kOyI6ICJcdTIyYzQiLAogICAgImRpYW1vbmRzdWl0OyI6ICJcdTI2NjYiLAogICAgImRpYW1zOyI6ICJcdTI2NjYiLAogICAgImRpZTsiOiAiXHhhOCIsCiAgICAiZGlnYW1tYTsiOiAiXHUwM2RkIiwKICAgICJkaXNpbjsiOiAiXHUyMmYyIiwKICAgICJkaXY7IjogIlx4ZjciLAogICAgImRpdmlkZSI6ICJceGY3IiwKICAgICJkaXZpZGU7IjogIlx4ZjciLAogICAgImRpdmlkZW9udGltZXM7IjogIlx1MjJjNyIsCiAgICAiZGl2b254OyI6ICJcdTIyYzciLAogICAgImRqY3k7IjogIlx1MDQ1MiIsCiAgICAiZGxjb3JuOyI6ICJcdTIzMWUiLAogICAgImRsY3JvcDsiOiAiXHUyMzBkIiwKICAgICJkb2xsYXI7IjogIiQiLAogICAgImRvcGY7IjogIlxVMDAwMWQ1NTUiLAogICAgImRvdDsiOiAiXHUwMmQ5IiwKICAgICJkb3RlcTsiOiAiXHUyMjUwIiwKICAgICJkb3RlcWRvdDsiOiAiXHUyMjUxIiwKICAgICJkb3RtaW51czsiOiAiXHUyMjM4IiwKICAgICJkb3RwbHVzOyI6ICJcdTIyMTQiLAogICAgImRvdHNxdWFyZTsiOiAiXHUyMmExIiwKICAgICJkb3VibGViYXJ3ZWRnZTsiOiAiXHUyMzA2IiwKICAgICJkb3duYXJyb3c7IjogIlx1MjE5MyIsCiAgICAiZG93bmRvd25hcnJvd3M7IjogIlx1MjFjYSIsCiAgICAiZG93bmhhcnBvb25sZWZ0OyI6ICJcdTIxYzMiLAogICAgImRvd25oYXJwb29ucmlnaHQ7IjogIlx1MjFjMiIsCiAgICAiZHJia2Fyb3c7IjogIlx1MjkxMCIsCiAgICAiZHJjb3JuOyI6ICJcdTIzMWYiLAogICAgImRyY3JvcDsiOiAiXHUyMzBjIiwKICAgICJkc2NyOyI6ICJcVTAwMDFkNGI5IiwKICAgICJkc2N5OyI6ICJcdTA0NTUiLAogICAgImRzb2w7IjogIlx1MjlmNiIsCiAgICAiZHN0cm9rOyI6ICJcdTAxMTEiLAogICAgImR0ZG90OyI6ICJcdTIyZjEiLAogICAgImR0cmk7IjogIlx1MjViZiIsCiAgICAiZHRyaWY7IjogIlx1MjViZSIsCiAgICAiZHVhcnI7IjogIlx1MjFmNSIsCiAgICAiZHVoYXI7IjogIlx1Mjk2ZiIsCiAgICAiZHdhbmdsZTsiOiAiXHUyOWE2IiwKICAgICJkemN5OyI6ICJcdTA0NWYiLAogICAgImR6aWdyYXJyOyI6ICJcdTI3ZmYiLAogICAgImVERG90OyI6ICJcdTJhNzciLAogICAgImVEb3Q7IjogIlx1MjI1MSIsCiAgICAiZWFjdXRlIjogIlx4ZTkiLAogICAgImVhY3V0ZTsiOiAiXHhlOSIsCiAgICAiZWFzdGVyOyI6ICJcdTJhNmUiLAogICAgImVjYXJvbjsiOiAiXHUwMTFiIiwKICAgICJlY2lyOyI6ICJcdTIyNTYiLAogICAgImVjaXJjIjogIlx4ZWEiLAogICAgImVjaXJjOyI6ICJceGVhIiwKICAgICJlY29sb247IjogIlx1MjI1NSIsCiAgICAiZWN5OyI6ICJcdTA0NGQiLAogICAgImVkb3Q7IjogIlx1MDExNyIsCiAgICAiZWU7IjogIlx1MjE0NyIsCiAgICAiZWZEb3Q7IjogIlx1MjI1MiIsCiAgICAiZWZyOyI6ICJcVTAwMDFkNTIyIiwKICAgICJlZzsiOiAiXHUyYTlhIiwKICAgICJlZ3JhdmUiOiAiXHhlOCIsCiAgICAiZWdyYXZlOyI6ICJceGU4IiwKICAgICJlZ3M7IjogIlx1MmE5NiIsCiAgICAiZWdzZG90OyI6ICJcdTJhOTgiLAogICAgImVsOyI6ICJcdTJhOTkiLAogICAgImVsaW50ZXJzOyI6ICJcdTIzZTciLAogICAgImVsbDsiOiAiXHUyMTEzIiwKICAgICJlbHM7IjogIlx1MmE5NSIsCiAgICAiZWxzZG90OyI6ICJcdTJhOTciLAogICAgImVtYWNyOyI6ICJcdTAxMTMiLAogICAgImVtcHR5OyI6ICJcdTIyMDUiLAogICAgImVtcHR5c2V0OyI6ICJcdTIyMDUiLAogICAgImVtcHR5djsiOiAiXHUyMjA1IiwKICAgICJlbXNwMTM7IjogIlx1MjAwNCIsCiAgICAiZW1zcDE0OyI6ICJcdTIwMDUiLAogICAgImVtc3A7IjogIlx1MjAwMyIsCiAgICAiZW5nOyI6ICJcdTAxNGIiLAogICAgImVuc3A7IjogIlx1MjAwMiIsCiAgICAiZW9nb247IjogIlx1MDExOSIsCiAgICAiZW9wZjsiOiAiXFUwMDAxZDU1NiIsCiAgICAiZXBhcjsiOiAiXHUyMmQ1IiwKICAgICJlcGFyc2w7IjogIlx1MjllMyIsCiAgICAiZXBsdXM7IjogIlx1MmE3MSIsCiAgICAiZXBzaTsiOiAiXHUwM2I1IiwKICAgICJlcHNpbG9uOyI6ICJcdTAzYjUiLAogICAgImVwc2l2OyI6ICJcdTAzZjUiLAogICAgImVxY2lyYzsiOiAiXHUyMjU2IiwKICAgICJlcWNvbG9uOyI6ICJcdTIyNTUiLAogICAgImVxc2ltOyI6ICJcdTIyNDIiLAogICAgImVxc2xhbnRndHI7IjogIlx1MmE5NiIsCiAgICAiZXFzbGFudGxlc3M7IjogIlx1MmE5NSIsCiAgICAiZXF1YWxzOyI6ICI9IiwKICAgICJlcXVlc3Q7IjogIlx1MjI1ZiIsCiAgICAiZXF1aXY7IjogIlx1MjI2MSIsCiAgICAiZXF1aXZERDsiOiAiXHUyYTc4IiwKICAgICJlcXZwYXJzbDsiOiAiXHUyOWU1IiwKICAgICJlckRvdDsiOiAiXHUyMjUzIiwKICAgICJlcmFycjsiOiAiXHUyOTcxIiwKICAgICJlc2NyOyI6ICJcdTIxMmYiLAogICAgImVzZG90OyI6ICJcdTIyNTAiLAogICAgImVzaW07IjogIlx1MjI0MiIsCiAgICAiZXRhOyI6ICJcdTAzYjciLAogICAgImV0aCI6ICJceGYwIiwKICAgICJldGg7IjogIlx4ZjAiLAogICAgImV1bWwiOiAiXHhlYiIsCiAgICAiZXVtbDsiOiAiXHhlYiIsCiAgICAiZXVybzsiOiAiXHUyMGFjIiwKICAgICJleGNsOyI6ICIhIiwKICAgICJleGlzdDsiOiAiXHUyMjAzIiwKICAgICJleHBlY3RhdGlvbjsiOiAiXHUyMTMwIiwKICAgICJleHBvbmVudGlhbGU7IjogIlx1MjE0NyIsCiAgICAiZmFsbGluZ2RvdHNlcTsiOiAiXHUyMjUyIiwKICAgICJmY3k7IjogIlx1MDQ0NCIsCiAgICAiZmVtYWxlOyI6ICJcdTI2NDAiLAogICAgImZmaWxpZzsiOiAiXHVmYjAzIiwKICAgICJmZmxpZzsiOiAiXHVmYjAwIiwKICAgICJmZmxsaWc7IjogIlx1ZmIwNCIsCiAgICAiZmZyOyI6ICJcVTAwMDFkNTIzIiwKICAgICJmaWxpZzsiOiAiXHVmYjAxIiwKICAgICJmamxpZzsiOiAiZmoiLAogICAgImZsYXQ7IjogIlx1MjY2ZCIsCiAgICAiZmxsaWc7IjogIlx1ZmIwMiIsCiAgICAiZmx0bnM7IjogIlx1MjViMSIsCiAgICAiZm5vZjsiOiAiXHUwMTkyIiwKICAgICJmb3BmOyI6ICJcVTAwMDFkNTU3IiwKICAgICJmb3JhbGw7IjogIlx1MjIwMCIsCiAgICAiZm9yazsiOiAiXHUyMmQ0IiwKICAgICJmb3JrdjsiOiAiXHUyYWQ5IiwKICAgICJmcGFydGludDsiOiAiXHUyYTBkIiwKICAgICJmcmFjMTIiOiAiXHhiZCIsCiAgICAiZnJhYzEyOyI6ICJceGJkIiwKICAgICJmcmFjMTM7IjogIlx1MjE1MyIsCiAgICAiZnJhYzE0IjogIlx4YmMiLAogICAgImZyYWMxNDsiOiAiXHhiYyIsCiAgICAiZnJhYzE1OyI6ICJcdTIxNTUiLAogICAgImZyYWMxNjsiOiAiXHUyMTU5IiwKICAgICJmcmFjMTg7IjogIlx1MjE1YiIsCiAgICAiZnJhYzIzOyI6ICJcdTIxNTQiLAogICAgImZyYWMyNTsiOiAiXHUyMTU2IiwKICAgICJmcmFjMzQiOiAiXHhiZSIsCiAgICAiZnJhYzM0OyI6ICJceGJlIiwKICAgICJmcmFjMzU7IjogIlx1MjE1NyIsCiAgICAiZnJhYzM4OyI6ICJcdTIxNWMiLAogICAgImZyYWM0NTsiOiAiXHUyMTU4IiwKICAgICJmcmFjNTY7IjogIlx1MjE1YSIsCiAgICAiZnJhYzU4OyI6ICJcdTIxNWQiLAogICAgImZyYWM3ODsiOiAiXHUyMTVlIiwKICAgICJmcmFzbDsiOiAiXHUyMDQ0IiwKICAgICJmcm93bjsiOiAiXHUyMzIyIiwKICAgICJmc2NyOyI6ICJcVTAwMDFkNGJiIiwKICAgICJnRTsiOiAiXHUyMjY3IiwKICAgICJnRWw7IjogIlx1MmE4YyIsCiAgICAiZ2FjdXRlOyI6ICJcdTAxZjUiLAogICAgImdhbW1hOyI6ICJcdTAzYjMiLAogICAgImdhbW1hZDsiOiAiXHUwM2RkIiwKICAgICJnYXA7IjogIlx1MmE4NiIsCiAgICAiZ2JyZXZlOyI6ICJcdTAxMWYiLAogICAgImdjaXJjOyI6ICJcdTAxMWQiLAogICAgImdjeTsiOiAiXHUwNDMzIiwKICAgICJnZG90OyI6ICJcdTAxMjEiLAogICAgImdlOyI6ICJcdTIyNjUiLAogICAgImdlbDsiOiAiXHUyMmRiIiwKICAgICJnZXE7IjogIlx1MjI2NSIsCiAgICAiZ2VxcTsiOiAiXHUyMjY3IiwKICAgICJnZXFzbGFudDsiOiAiXHUyYTdlIiwKICAgICJnZXM7IjogIlx1MmE3ZSIsCiAgICAiZ2VzY2M7IjogIlx1MmFhOSIsCiAgICAiZ2VzZG90OyI6ICJcdTJhODAiLAogICAgImdlc2RvdG87IjogIlx1MmE4MiIsCiAgICAiZ2VzZG90b2w7IjogIlx1MmE4NCIsCiAgICAiZ2VzbDsiOiAiXHUyMmRiXHVmZTAwIiwKICAgICJnZXNsZXM7IjogIlx1MmE5NCIsCiAgICAiZ2ZyOyI6ICJcVTAwMDFkNTI0IiwKICAgICJnZzsiOiAiXHUyMjZiIiwKICAgICJnZ2c7IjogIlx1MjJkOSIsCiAgICAiZ2ltZWw7IjogIlx1MjEzNyIsCiAgICAiZ2pjeTsiOiAiXHUwNDUzIiwKICAgICJnbDsiOiAiXHUyMjc3IiwKICAgICJnbEU7IjogIlx1MmE5MiIsCiAgICAiZ2xhOyI6ICJcdTJhYTUiLAogICAgImdsajsiOiAiXHUyYWE0IiwKICAgICJnbkU7IjogIlx1MjI2OSIsCiAgICAiZ25hcDsiOiAiXHUyYThhIiwKICAgICJnbmFwcHJveDsiOiAiXHUyYThhIiwKICAgICJnbmU7IjogIlx1MmE4OCIsCiAgICAiZ25lcTsiOiAiXHUyYTg4IiwKICAgICJnbmVxcTsiOiAiXHUyMjY5IiwKICAgICJnbnNpbTsiOiAiXHUyMmU3IiwKICAgICJnb3BmOyI6ICJcVTAwMDFkNTU4IiwKICAgICJncmF2ZTsiOiAiYCIsCiAgICAiZ3NjcjsiOiAiXHUyMTBhIiwKICAgICJnc2ltOyI6ICJcdTIyNzMiLAogICAgImdzaW1lOyI6ICJcdTJhOGUiLAogICAgImdzaW1sOyI6ICJcdTJhOTAiLAogICAgImd0IjogIj4iLAogICAgImd0OyI6ICI+IiwKICAgICJndGNjOyI6ICJcdTJhYTciLAogICAgImd0Y2lyOyI6ICJcdTJhN2EiLAogICAgImd0ZG90OyI6ICJcdTIyZDciLAogICAgImd0bFBhcjsiOiAiXHUyOTk1IiwKICAgICJndHF1ZXN0OyI6ICJcdTJhN2MiLAogICAgImd0cmFwcHJveDsiOiAiXHUyYTg2IiwKICAgICJndHJhcnI7IjogIlx1Mjk3OCIsCiAgICAiZ3RyZG90OyI6ICJcdTIyZDciLAogICAgImd0cmVxbGVzczsiOiAiXHUyMmRiIiwKICAgICJndHJlcXFsZXNzOyI6ICJcdTJhOGMiLAogICAgImd0cmxlc3M7IjogIlx1MjI3NyIsCiAgICAiZ3Ryc2ltOyI6ICJcdTIyNzMiLAogICAgImd2ZXJ0bmVxcTsiOiAiXHUyMjY5XHVmZTAwIiwKICAgICJndm5FOyI6ICJcdTIyNjlcdWZlMDAiLAogICAgImhBcnI7IjogIlx1MjFkNCIsCiAgICAiaGFpcnNwOyI6ICJcdTIwMGEiLAogICAgImhhbGY7IjogIlx4YmQiLAogICAgImhhbWlsdDsiOiAiXHUyMTBiIiwKICAgICJoYXJkY3k7IjogIlx1MDQ0YSIsCiAgICAiaGFycjsiOiAiXHUyMTk0IiwKICAgICJoYXJyY2lyOyI6ICJcdTI5NDgiLAogICAgImhhcnJ3OyI6ICJcdTIxYWQiLAogICAgImhiYXI7IjogIlx1MjEwZiIsCiAgICAiaGNpcmM7IjogIlx1MDEyNSIsCiAgICAiaGVhcnRzOyI6ICJcdTI2NjUiLAogICAgImhlYXJ0c3VpdDsiOiAiXHUyNjY1IiwKICAgICJoZWxsaXA7IjogIlx1MjAyNiIsCiAgICAiaGVyY29uOyI6ICJcdTIyYjkiLAogICAgImhmcjsiOiAiXFUwMDAxZDUyNSIsCiAgICAiaGtzZWFyb3c7IjogIlx1MjkyNSIsCiAgICAiaGtzd2Fyb3c7IjogIlx1MjkyNiIsCiAgICAiaG9hcnI7IjogIlx1MjFmZiIsCiAgICAiaG9tdGh0OyI6ICJcdTIyM2IiLAogICAgImhvb2tsZWZ0YXJyb3c7IjogIlx1MjFhOSIsCiAgICAiaG9va3JpZ2h0YXJyb3c7IjogIlx1MjFhYSIsCiAgICAiaG9wZjsiOiAiXFUwMDAxZDU1OSIsCiAgICAiaG9yYmFyOyI6ICJcdTIwMTUiLAogICAgImhzY3I7IjogIlxVMDAwMWQ0YmQiLAogICAgImhzbGFzaDsiOiAiXHUyMTBmIiwKICAgICJoc3Ryb2s7IjogIlx1MDEyNyIsCiAgICAiaHlidWxsOyI6ICJcdTIwNDMiLAogICAgImh5cGhlbjsiOiAiXHUyMDEwIiwKICAgICJpYWN1dGUiOiAiXHhlZCIsCiAgICAiaWFjdXRlOyI6ICJceGVkIiwKICAgICJpYzsiOiAiXHUyMDYzIiwKICAgICJpY2lyYyI6ICJceGVlIiwKICAgICJpY2lyYzsiOiAiXHhlZSIsCiAgICAiaWN5OyI6ICJcdTA0MzgiLAogICAgImllY3k7IjogIlx1MDQzNSIsCiAgICAiaWV4Y2wiOiAiXHhhMSIsCiAgICAiaWV4Y2w7IjogIlx4YTEiLAogICAgImlmZjsiOiAiXHUyMWQ0IiwKICAgICJpZnI7IjogIlxVMDAwMWQ1MjYiLAogICAgImlncmF2ZSI6ICJceGVjIiwKICAgICJpZ3JhdmU7IjogIlx4ZWMiLAogICAgImlpOyI6ICJcdTIxNDgiLAogICAgImlpaWludDsiOiAiXHUyYTBjIiwKICAgICJpaWludDsiOiAiXHUyMjJkIiwKICAgICJpaW5maW47IjogIlx1MjlkYyIsCiAgICAiaWlvdGE7IjogIlx1MjEyOSIsCiAgICAiaWpsaWc7IjogIlx1MDEzMyIsCiAgICAiaW1hY3I7IjogIlx1MDEyYiIsCiAgICAiaW1hZ2U7IjogIlx1MjExMSIsCiAgICAiaW1hZ2xpbmU7IjogIlx1MjExMCIsCiAgICAiaW1hZ3BhcnQ7IjogIlx1MjExMSIsCiAgICAiaW1hdGg7IjogIlx1MDEzMSIsCiAgICAiaW1vZjsiOiAiXHUyMmI3IiwKICAgICJpbXBlZDsiOiAiXHUwMWI1IiwKICAgICJpbjsiOiAiXHUyMjA4IiwKICAgICJpbmNhcmU7IjogIlx1MjEwNSIsCiAgICAiaW5maW47IjogIlx1MjIxZSIsCiAgICAiaW5maW50aWU7IjogIlx1MjlkZCIsCiAgICAiaW5vZG90OyI6ICJcdTAxMzEiLAogICAgImludDsiOiAiXHUyMjJiIiwKICAgICJpbnRjYWw7IjogIlx1MjJiYSIsCiAgICAiaW50ZWdlcnM7IjogIlx1MjEyNCIsCiAgICAiaW50ZXJjYWw7IjogIlx1MjJiYSIsCiAgICAiaW50bGFyaGs7IjogIlx1MmExNyIsCiAgICAiaW50cHJvZDsiOiAiXHUyYTNjIiwKICAgICJpb2N5OyI6ICJcdTA0NTEiLAogICAgImlvZ29uOyI6ICJcdTAxMmYiLAogICAgImlvcGY7IjogIlxVMDAwMWQ1NWEiLAogICAgImlvdGE7IjogIlx1MDNiOSIsCiAgICAiaXByb2Q7IjogIlx1MmEzYyIsCiAgICAiaXF1ZXN0IjogIlx4YmYiLAogICAgImlxdWVzdDsiOiAiXHhiZiIsCiAgICAiaXNjcjsiOiAiXFUwMDAxZDRiZSIsCiAgICAiaXNpbjsiOiAiXHUyMjA4IiwKICAgICJpc2luRTsiOiAiXHUyMmY5IiwKICAgICJpc2luZG90OyI6ICJcdTIyZjUiLAogICAgImlzaW5zOyI6ICJcdTIyZjQiLAogICAgImlzaW5zdjsiOiAiXHUyMmYzIiwKICAgICJpc2ludjsiOiAiXHUyMjA4IiwKICAgICJpdDsiOiAiXHUyMDYyIiwKICAgICJpdGlsZGU7IjogIlx1MDEyOSIsCiAgICAiaXVrY3k7IjogIlx1MDQ1NiIsCiAgICAiaXVtbCI6ICJceGVmIiwKICAgICJpdW1sOyI6ICJceGVmIiwKICAgICJqY2lyYzsiOiAiXHUwMTM1IiwKICAgICJqY3k7IjogIlx1MDQzOSIsCiAgICAiamZyOyI6ICJcVTAwMDFkNTI3IiwKICAgICJqbWF0aDsiOiAiXHUwMjM3IiwKICAgICJqb3BmOyI6ICJcVTAwMDFkNTViIiwKICAgICJqc2NyOyI6ICJcVTAwMDFkNGJmIiwKICAgICJqc2VyY3k7IjogIlx1MDQ1OCIsCiAgICAianVrY3k7IjogIlx1MDQ1NCIsCiAgICAia2FwcGE7IjogIlx1MDNiYSIsCiAgICAia2FwcGF2OyI6ICJcdTAzZjAiLAogICAgImtjZWRpbDsiOiAiXHUwMTM3IiwKICAgICJrY3k7IjogIlx1MDQzYSIsCiAgICAia2ZyOyI6ICJcVTAwMDFkNTI4IiwKICAgICJrZ3JlZW47IjogIlx1MDEzOCIsCiAgICAia2hjeTsiOiAiXHUwNDQ1IiwKICAgICJramN5OyI6ICJcdTA0NWMiLAogICAgImtvcGY7IjogIlxVMDAwMWQ1NWMiLAogICAgImtzY3I7IjogIlxVMDAwMWQ0YzAiLAogICAgImxBYXJyOyI6ICJcdTIxZGEiLAogICAgImxBcnI7IjogIlx1MjFkMCIsCiAgICAibEF0YWlsOyI6ICJcdTI5MWIiLAogICAgImxCYXJyOyI6ICJcdTI5MGUiLAogICAgImxFOyI6ICJcdTIyNjYiLAogICAgImxFZzsiOiAiXHUyYThiIiwKICAgICJsSGFyOyI6ICJcdTI5NjIiLAogICAgImxhY3V0ZTsiOiAiXHUwMTNhIiwKICAgICJsYWVtcHR5djsiOiAiXHUyOWI0IiwKICAgICJsYWdyYW47IjogIlx1MjExMiIsCiAgICAibGFtYmRhOyI6ICJcdTAzYmIiLAogICAgImxhbmc7IjogIlx1MjdlOCIsCiAgICAibGFuZ2Q7IjogIlx1Mjk5MSIsCiAgICAibGFuZ2xlOyI6ICJcdTI3ZTgiLAogICAgImxhcDsiOiAiXHUyYTg1IiwKICAgICJsYXF1byI6ICJceGFiIiwKICAgICJsYXF1bzsiOiAiXHhhYiIsCiAgICAibGFycjsiOiAiXHUyMTkwIiwKICAgICJsYXJyYjsiOiAiXHUyMWU0IiwKICAgICJsYXJyYmZzOyI6ICJcdTI5MWYiLAogICAgImxhcnJmczsiOiAiXHUyOTFkIiwKICAgICJsYXJyaGs7IjogIlx1MjFhOSIsCiAgICAibGFycmxwOyI6ICJcdTIxYWIiLAogICAgImxhcnJwbDsiOiAiXHUyOTM5IiwKICAgICJsYXJyc2ltOyI6ICJcdTI5NzMiLAogICAgImxhcnJ0bDsiOiAiXHUyMWEyIiwKICAgICJsYXQ7IjogIlx1MmFhYiIsCiAgICAibGF0YWlsOyI6ICJcdTI5MTkiLAogICAgImxhdGU7IjogIlx1MmFhZCIsCiAgICAibGF0ZXM7IjogIlx1MmFhZFx1ZmUwMCIsCiAgICAibGJhcnI7IjogIlx1MjkwYyIsCiAgICAibGJicms7IjogIlx1Mjc3MiIsCiAgICAibGJyYWNlOyI6ICJ7IiwKICAgICJsYnJhY2s7IjogIlsiLAogICAgImxicmtlOyI6ICJcdTI5OGIiLAogICAgImxicmtzbGQ7IjogIlx1Mjk4ZiIsCiAgICAibGJya3NsdTsiOiAiXHUyOThkIiwKICAgICJsY2Fyb247IjogIlx1MDEzZSIsCiAgICAibGNlZGlsOyI6ICJcdTAxM2MiLAogICAgImxjZWlsOyI6ICJcdTIzMDgiLAogICAgImxjdWI7IjogInsiLAogICAgImxjeTsiOiAiXHUwNDNiIiwKICAgICJsZGNhOyI6ICJcdTI5MzYiLAogICAgImxkcXVvOyI6ICJcdTIwMWMiLAogICAgImxkcXVvcjsiOiAiXHUyMDFlIiwKICAgICJsZHJkaGFyOyI6ICJcdTI5NjciLAogICAgImxkcnVzaGFyOyI6ICJcdTI5NGIiLAogICAgImxkc2g7IjogIlx1MjFiMiIsCiAgICAibGU7IjogIlx1MjI2NCIsCiAgICAibGVmdGFycm93OyI6ICJcdTIxOTAiLAogICAgImxlZnRhcnJvd3RhaWw7IjogIlx1MjFhMiIsCiAgICAibGVmdGhhcnBvb25kb3duOyI6ICJcdTIxYmQiLAogICAgImxlZnRoYXJwb29udXA7IjogIlx1MjFiYyIsCiAgICAibGVmdGxlZnRhcnJvd3M7IjogIlx1MjFjNyIsCiAgICAibGVmdHJpZ2h0YXJyb3c7IjogIlx1MjE5NCIsCiAgICAibGVmdHJpZ2h0YXJyb3dzOyI6ICJcdTIxYzYiLAogICAgImxlZnRyaWdodGhhcnBvb25zOyI6ICJcdTIxY2IiLAogICAgImxlZnRyaWdodHNxdWlnYXJyb3c7IjogIlx1MjFhZCIsCiAgICAibGVmdHRocmVldGltZXM7IjogIlx1MjJjYiIsCiAgICAibGVnOyI6ICJcdTIyZGEiLAogICAgImxlcTsiOiAiXHUyMjY0IiwKICAgICJsZXFxOyI6ICJcdTIyNjYiLAogICAgImxlcXNsYW50OyI6ICJcdTJhN2QiLAogICAgImxlczsiOiAiXHUyYTdkIiwKICAgICJsZXNjYzsiOiAiXHUyYWE4IiwKICAgICJsZXNkb3Q7IjogIlx1MmE3ZiIsCiAgICAibGVzZG90bzsiOiAiXHUyYTgxIiwKICAgICJsZXNkb3RvcjsiOiAiXHUyYTgzIiwKICAgICJsZXNnOyI6ICJcdTIyZGFcdWZlMDAiLAogICAgImxlc2dlczsiOiAiXHUyYTkzIiwKICAgICJsZXNzYXBwcm94OyI6ICJcdTJhODUiLAogICAgImxlc3Nkb3Q7IjogIlx1MjJkNiIsCiAgICAibGVzc2VxZ3RyOyI6ICJcdTIyZGEiLAogICAgImxlc3NlcXFndHI7IjogIlx1MmE4YiIsCiAgICAibGVzc2d0cjsiOiAiXHUyMjc2IiwKICAgICJsZXNzc2ltOyI6ICJcdTIyNzIiLAogICAgImxmaXNodDsiOiAiXHUyOTdjIiwKICAgICJsZmxvb3I7IjogIlx1MjMwYSIsCiAgICAibGZyOyI6ICJcVTAwMDFkNTI5IiwKICAgICJsZzsiOiAiXHUyMjc2IiwKICAgICJsZ0U7IjogIlx1MmE5MSIsCiAgICAibGhhcmQ7IjogIlx1MjFiZCIsCiAgICAibGhhcnU7IjogIlx1MjFiYyIsCiAgICAibGhhcnVsOyI6ICJcdTI5NmEiLAogICAgImxoYmxrOyI6ICJcdTI1ODQiLAogICAgImxqY3k7IjogIlx1MDQ1OSIsCiAgICAibGw7IjogIlx1MjI2YSIsCiAgICAibGxhcnI7IjogIlx1MjFjNyIsCiAgICAibGxjb3JuZXI7IjogIlx1MjMxZSIsCiAgICAibGxoYXJkOyI6ICJcdTI5NmIiLAogICAgImxsdHJpOyI6ICJcdTI1ZmEiLAogICAgImxtaWRvdDsiOiAiXHUwMTQwIiwKICAgICJsbW91c3Q7IjogIlx1MjNiMCIsCiAgICAibG1vdXN0YWNoZTsiOiAiXHUyM2IwIiwKICAgICJsbkU7IjogIlx1MjI2OCIsCiAgICAibG5hcDsiOiAiXHUyYTg5IiwKICAgICJsbmFwcHJveDsiOiAiXHUyYTg5IiwKICAgICJsbmU7IjogIlx1MmE4NyIsCiAgICAibG5lcTsiOiAiXHUyYTg3IiwKICAgICJsbmVxcTsiOiAiXHUyMjY4IiwKICAgICJsbnNpbTsiOiAiXHUyMmU2IiwKICAgICJsb2FuZzsiOiAiXHUyN2VjIiwKICAgICJsb2FycjsiOiAiXHUyMWZkIiwKICAgICJsb2JyazsiOiAiXHUyN2U2IiwKICAgICJsb25nbGVmdGFycm93OyI6ICJcdTI3ZjUiLAogICAgImxvbmdsZWZ0cmlnaHRhcnJvdzsiOiAiXHUyN2Y3IiwKICAgICJsb25nbWFwc3RvOyI6ICJcdTI3ZmMiLAogICAgImxvbmdyaWdodGFycm93OyI6ICJcdTI3ZjYiLAogICAgImxvb3BhcnJvd2xlZnQ7IjogIlx1MjFhYiIsCiAgICAibG9vcGFycm93cmlnaHQ7IjogIlx1MjFhYyIsCiAgICAibG9wYXI7IjogIlx1Mjk4NSIsCiAgICAibG9wZjsiOiAiXFUwMDAxZDU1ZCIsCiAgICAibG9wbHVzOyI6ICJcdTJhMmQiLAogICAgImxvdGltZXM7IjogIlx1MmEzNCIsCiAgICAibG93YXN0OyI6ICJcdTIyMTciLAogICAgImxvd2JhcjsiOiAiXyIsCiAgICAibG96OyI6ICJcdTI1Y2EiLAogICAgImxvemVuZ2U7IjogIlx1MjVjYSIsCiAgICAibG96ZjsiOiAiXHUyOWViIiwKICAgICJscGFyOyI6ICIoIiwKICAgICJscGFybHQ7IjogIlx1Mjk5MyIsCiAgICAibHJhcnI7IjogIlx1MjFjNiIsCiAgICAibHJjb3JuZXI7IjogIlx1MjMxZiIsCiAgICAibHJoYXI7IjogIlx1MjFjYiIsCiAgICAibHJoYXJkOyI6ICJcdTI5NmQiLAogICAgImxybTsiOiAiXHUyMDBlIiwKICAgICJscnRyaTsiOiAiXHUyMmJmIiwKICAgICJsc2FxdW87IjogIlx1MjAzOSIsCiAgICAibHNjcjsiOiAiXFUwMDAxZDRjMSIsCiAgICAibHNoOyI6ICJcdTIxYjAiLAogICAgImxzaW07IjogIlx1MjI3MiIsCiAgICAibHNpbWU7IjogIlx1MmE4ZCIsCiAgICAibHNpbWc7IjogIlx1MmE4ZiIsCiAgICAibHNxYjsiOiAiWyIsCiAgICAibHNxdW87IjogIlx1MjAxOCIsCiAgICAibHNxdW9yOyI6ICJcdTIwMWEiLAogICAgImxzdHJvazsiOiAiXHUwMTQyIiwKICAgICJsdCI6ICI8IiwKICAgICJsdDsiOiAiPCIsCiAgICAibHRjYzsiOiAiXHUyYWE2IiwKICAgICJsdGNpcjsiOiAiXHUyYTc5IiwKICAgICJsdGRvdDsiOiAiXHUyMmQ2IiwKICAgICJsdGhyZWU7IjogIlx1MjJjYiIsCiAgICAibHRpbWVzOyI6ICJcdTIyYzkiLAogICAgImx0bGFycjsiOiAiXHUyOTc2IiwKICAgICJsdHF1ZXN0OyI6ICJcdTJhN2IiLAogICAgImx0clBhcjsiOiAiXHUyOTk2IiwKICAgICJsdHJpOyI6ICJcdTI1YzMiLAogICAgImx0cmllOyI6ICJcdTIyYjQiLAogICAgImx0cmlmOyI6ICJcdTI1YzIiLAogICAgImx1cmRzaGFyOyI6ICJcdTI5NGEiLAogICAgImx1cnVoYXI7IjogIlx1Mjk2NiIsCiAgICAibHZlcnRuZXFxOyI6ICJcdTIyNjhcdWZlMDAiLAogICAgImx2bkU7IjogIlx1MjI2OFx1ZmUwMCIsCiAgICAibUREb3Q7IjogIlx1MjIzYSIsCiAgICAibWFjciI6ICJceGFmIiwKICAgICJtYWNyOyI6ICJceGFmIiwKICAgICJtYWxlOyI6ICJcdTI2NDIiLAogICAgIm1hbHQ7IjogIlx1MjcyMCIsCiAgICAibWFsdGVzZTsiOiAiXHUyNzIwIiwKICAgICJtYXA7IjogIlx1MjFhNiIsCiAgICAibWFwc3RvOyI6ICJcdTIxYTYiLAogICAgIm1hcHN0b2Rvd247IjogIlx1MjFhNyIsCiAgICAibWFwc3RvbGVmdDsiOiAiXHUyMWE0IiwKICAgICJtYXBzdG91cDsiOiAiXHUyMWE1IiwKICAgICJtYXJrZXI7IjogIlx1MjVhZSIsCiAgICAibWNvbW1hOyI6ICJcdTJhMjkiLAogICAgIm1jeTsiOiAiXHUwNDNjIiwKICAgICJtZGFzaDsiOiAiXHUyMDE0IiwKICAgICJtZWFzdXJlZGFuZ2xlOyI6ICJcdTIyMjEiLAogICAgIm1mcjsiOiAiXFUwMDAxZDUyYSIsCiAgICAibWhvOyI6ICJcdTIxMjciLAogICAgIm1pY3JvIjogIlx4YjUiLAogICAgIm1pY3JvOyI6ICJceGI1IiwKICAgICJtaWQ7IjogIlx1MjIyMyIsCiAgICAibWlkYXN0OyI6ICIqIiwKICAgICJtaWRjaXI7IjogIlx1MmFmMCIsCiAgICAibWlkZG90IjogIlx4YjciLAogICAgIm1pZGRvdDsiOiAiXHhiNyIsCiAgICAibWludXM7IjogIlx1MjIxMiIsCiAgICAibWludXNiOyI6ICJcdTIyOWYiLAogICAgIm1pbnVzZDsiOiAiXHUyMjM4IiwKICAgICJtaW51c2R1OyI6ICJcdTJhMmEiLAogICAgIm1sY3A7IjogIlx1MmFkYiIsCiAgICAibWxkcjsiOiAiXHUyMDI2IiwKICAgICJtbnBsdXM7IjogIlx1MjIxMyIsCiAgICAibW9kZWxzOyI6ICJcdTIyYTciLAogICAgIm1vcGY7IjogIlxVMDAwMWQ1NWUiLAogICAgIm1wOyI6ICJcdTIyMTMiLAogICAgIm1zY3I7IjogIlxVMDAwMWQ0YzIiLAogICAgIm1zdHBvczsiOiAiXHUyMjNlIiwKICAgICJtdTsiOiAiXHUwM2JjIiwKICAgICJtdWx0aW1hcDsiOiAiXHUyMmI4IiwKICAgICJtdW1hcDsiOiAiXHUyMmI4IiwKICAgICJuR2c7IjogIlx1MjJkOVx1MDMzOCIsCiAgICAibkd0OyI6ICJcdTIyNmJcdTIwZDIiLAogICAgIm5HdHY7IjogIlx1MjI2Ylx1MDMzOCIsCiAgICAibkxlZnRhcnJvdzsiOiAiXHUyMWNkIiwKICAgICJuTGVmdHJpZ2h0YXJyb3c7IjogIlx1MjFjZSIsCiAgICAibkxsOyI6ICJcdTIyZDhcdTAzMzgiLAogICAgIm5MdDsiOiAiXHUyMjZhXHUyMGQyIiwKICAgICJuTHR2OyI6ICJcdTIyNmFcdTAzMzgiLAogICAgIm5SaWdodGFycm93OyI6ICJcdTIxY2YiLAogICAgIm5WRGFzaDsiOiAiXHUyMmFmIiwKICAgICJuVmRhc2g7IjogIlx1MjJhZSIsCiAgICAibmFibGE7IjogIlx1MjIwNyIsCiAgICAibmFjdXRlOyI6ICJcdTAxNDQiLAogICAgIm5hbmc7IjogIlx1MjIyMFx1MjBkMiIsCiAgICAibmFwOyI6ICJcdTIyNDkiLAogICAgIm5hcEU7IjogIlx1MmE3MFx1MDMzOCIsCiAgICAibmFwaWQ7IjogIlx1MjI0Ylx1MDMzOCIsCiAgICAibmFwb3M7IjogIlx1MDE0OSIsCiAgICAibmFwcHJveDsiOiAiXHUyMjQ5IiwKICAgICJuYXR1cjsiOiAiXHUyNjZlIiwKICAgICJuYXR1cmFsOyI6ICJcdTI2NmUiLAogICAgIm5hdHVyYWxzOyI6ICJcdTIxMTUiLAogICAgIm5ic3AiOiAiXHhhMCIsCiAgICAibmJzcDsiOiAiXHhhMCIsCiAgICAibmJ1bXA7IjogIlx1MjI0ZVx1MDMzOCIsCiAgICAibmJ1bXBlOyI6ICJcdTIyNGZcdTAzMzgiLAogICAgIm5jYXA7IjogIlx1MmE0MyIsCiAgICAibmNhcm9uOyI6ICJcdTAxNDgiLAogICAgIm5jZWRpbDsiOiAiXHUwMTQ2IiwKICAgICJuY29uZzsiOiAiXHUyMjQ3IiwKICAgICJuY29uZ2RvdDsiOiAiXHUyYTZkXHUwMzM4IiwKICAgICJuY3VwOyI6ICJcdTJhNDIiLAogICAgIm5jeTsiOiAiXHUwNDNkIiwKICAgICJuZGFzaDsiOiAiXHUyMDEzIiwKICAgICJuZTsiOiAiXHUyMjYwIiwKICAgICJuZUFycjsiOiAiXHUyMWQ3IiwKICAgICJuZWFyaGs7IjogIlx1MjkyNCIsCiAgICAibmVhcnI7IjogIlx1MjE5NyIsCiAgICAibmVhcnJvdzsiOiAiXHUyMTk3IiwKICAgICJuZWRvdDsiOiAiXHUyMjUwXHUwMzM4IiwKICAgICJuZXF1aXY7IjogIlx1MjI2MiIsCiAgICAibmVzZWFyOyI6ICJcdTI5MjgiLAogICAgIm5lc2ltOyI6ICJcdTIyNDJcdTAzMzgiLAogICAgIm5leGlzdDsiOiAiXHUyMjA0IiwKICAgICJuZXhpc3RzOyI6ICJcdTIyMDQiLAogICAgIm5mcjsiOiAiXFUwMDAxZDUyYiIsCiAgICAibmdFOyI6ICJcdTIyNjdcdTAzMzgiLAogICAgIm5nZTsiOiAiXHUyMjcxIiwKICAgICJuZ2VxOyI6ICJcdTIyNzEiLAogICAgIm5nZXFxOyI6ICJcdTIyNjdcdTAzMzgiLAogICAgIm5nZXFzbGFudDsiOiAiXHUyYTdlXHUwMzM4IiwKICAgICJuZ2VzOyI6ICJcdTJhN2VcdTAzMzgiLAogICAgIm5nc2ltOyI6ICJcdTIyNzUiLAogICAgIm5ndDsiOiAiXHUyMjZmIiwKICAgICJuZ3RyOyI6ICJcdTIyNmYiLAogICAgIm5oQXJyOyI6ICJcdTIxY2UiLAogICAgIm5oYXJyOyI6ICJcdTIxYWUiLAogICAgIm5ocGFyOyI6ICJcdTJhZjIiLAogICAgIm5pOyI6ICJcdTIyMGIiLAogICAgIm5pczsiOiAiXHUyMmZjIiwKICAgICJuaXNkOyI6ICJcdTIyZmEiLAogICAgIm5pdjsiOiAiXHUyMjBiIiwKICAgICJuamN5OyI6ICJcdTA0NWEiLAogICAgIm5sQXJyOyI6ICJcdTIxY2QiLAogICAgIm5sRTsiOiAiXHUyMjY2XHUwMzM4IiwKICAgICJubGFycjsiOiAiXHUyMTlhIiwKICAgICJubGRyOyI6ICJcdTIwMjUiLAogICAgIm5sZTsiOiAiXHUyMjcwIiwKICAgICJubGVmdGFycm93OyI6ICJcdTIxOWEiLAogICAgIm5sZWZ0cmlnaHRhcnJvdzsiOiAiXHUyMWFlIiwKICAgICJubGVxOyI6ICJcdTIyNzAiLAogICAgIm5sZXFxOyI6ICJcdTIyNjZcdTAzMzgiLAogICAgIm5sZXFzbGFudDsiOiAiXHUyYTdkXHUwMzM4IiwKICAgICJubGVzOyI6ICJcdTJhN2RcdTAzMzgiLAogICAgIm5sZXNzOyI6ICJcdTIyNmUiLAogICAgIm5sc2ltOyI6ICJcdTIyNzQiLAogICAgIm5sdDsiOiAiXHUyMjZlIiwKICAgICJubHRyaTsiOiAiXHUyMmVhIiwKICAgICJubHRyaWU7IjogIlx1MjJlYyIsCiAgICAibm1pZDsiOiAiXHUyMjI0IiwKICAgICJub3BmOyI6ICJcVTAwMDFkNTVmIiwKICAgICJub3QiOiAiXHhhYyIsCiAgICAibm90OyI6ICJceGFjIiwKICAgICJub3RpbjsiOiAiXHUyMjA5IiwKICAgICJub3RpbkU7IjogIlx1MjJmOVx1MDMzOCIsCiAgICAibm90aW5kb3Q7IjogIlx1MjJmNVx1MDMzOCIsCiAgICAibm90aW52YTsiOiAiXHUyMjA5IiwKICAgICJub3RpbnZiOyI6ICJcdTIyZjciLAogICAgIm5vdGludmM7IjogIlx1MjJmNiIsCiAgICAibm90bmk7IjogIlx1MjIwYyIsCiAgICAibm90bml2YTsiOiAiXHUyMjBjIiwKICAgICJub3RuaXZiOyI6ICJcdTIyZmUiLAogICAgIm5vdG5pdmM7IjogIlx1MjJmZCIsCiAgICAibnBhcjsiOiAiXHUyMjI2IiwKICAgICJucGFyYWxsZWw7IjogIlx1MjIyNiIsCiAgICAibnBhcnNsOyI6ICJcdTJhZmRcdTIwZTUiLAogICAgIm5wYXJ0OyI6ICJcdTIyMDJcdTAzMzgiLAogICAgIm5wb2xpbnQ7IjogIlx1MmExNCIsCiAgICAibnByOyI6ICJcdTIyODAiLAogICAgIm5wcmN1ZTsiOiAiXHUyMmUwIiwKICAgICJucHJlOyI6ICJcdTJhYWZcdTAzMzgiLAogICAgIm5wcmVjOyI6ICJcdTIyODAiLAogICAgIm5wcmVjZXE7IjogIlx1MmFhZlx1MDMzOCIsCiAgICAibnJBcnI7IjogIlx1MjFjZiIsCiAgICAibnJhcnI7IjogIlx1MjE5YiIsCiAgICAibnJhcnJjOyI6ICJcdTI5MzNcdTAzMzgiLAogICAgIm5yYXJydzsiOiAiXHUyMTlkXHUwMzM4IiwKICAgICJucmlnaHRhcnJvdzsiOiAiXHUyMTliIiwKICAgICJucnRyaTsiOiAiXHUyMmViIiwKICAgICJucnRyaWU7IjogIlx1MjJlZCIsCiAgICAibnNjOyI6ICJcdTIyODEiLAogICAgIm5zY2N1ZTsiOiAiXHUyMmUxIiwKICAgICJuc2NlOyI6ICJcdTJhYjBcdTAzMzgiLAogICAgIm5zY3I7IjogIlxVMDAwMWQ0YzMiLAogICAgIm5zaG9ydG1pZDsiOiAiXHUyMjI0IiwKICAgICJuc2hvcnRwYXJhbGxlbDsiOiAiXHUyMjI2IiwKICAgICJuc2ltOyI6ICJcdTIyNDEiLAogICAgIm5zaW1lOyI6ICJcdTIyNDQiLAogICAgIm5zaW1lcTsiOiAiXHUyMjQ0IiwKICAgICJuc21pZDsiOiAiXHUyMjI0IiwKICAgICJuc3BhcjsiOiAiXHUyMjI2IiwKICAgICJuc3FzdWJlOyI6ICJcdTIyZTIiLAogICAgIm5zcXN1cGU7IjogIlx1MjJlMyIsCiAgICAibnN1YjsiOiAiXHUyMjg0IiwKICAgICJuc3ViRTsiOiAiXHUyYWM1XHUwMzM4IiwKICAgICJuc3ViZTsiOiAiXHUyMjg4IiwKICAgICJuc3Vic2V0OyI6ICJcdTIyODJcdTIwZDIiLAogICAgIm5zdWJzZXRlcTsiOiAiXHUyMjg4IiwKICAgICJuc3Vic2V0ZXFxOyI6ICJcdTJhYzVcdTAzMzgiLAogICAgIm5zdWNjOyI6ICJcdTIyODEiLAogICAgIm5zdWNjZXE7IjogIlx1MmFiMFx1MDMzOCIsCiAgICAibnN1cDsiOiAiXHUyMjg1IiwKICAgICJuc3VwRTsiOiAiXHUyYWM2XHUwMzM4IiwKICAgICJuc3VwZTsiOiAiXHUyMjg5IiwKICAgICJuc3Vwc2V0OyI6ICJcdTIyODNcdTIwZDIiLAogICAgIm5zdXBzZXRlcTsiOiAiXHUyMjg5IiwKICAgICJuc3Vwc2V0ZXFxOyI6ICJcdTJhYzZcdTAzMzgiLAogICAgIm50Z2w7IjogIlx1MjI3OSIsCiAgICAibnRpbGRlIjogIlx4ZjEiLAogICAgIm50aWxkZTsiOiAiXHhmMSIsCiAgICAibnRsZzsiOiAiXHUyMjc4IiwKICAgICJudHJpYW5nbGVsZWZ0OyI6ICJcdTIyZWEiLAogICAgIm50cmlhbmdsZWxlZnRlcTsiOiAiXHUyMmVjIiwKICAgICJudHJpYW5nbGVyaWdodDsiOiAiXHUyMmViIiwKICAgICJudHJpYW5nbGVyaWdodGVxOyI6ICJcdTIyZWQiLAogICAgIm51OyI6ICJcdTAzYmQiLAogICAgIm51bTsiOiAiIyIsCiAgICAibnVtZXJvOyI6ICJcdTIxMTYiLAogICAgIm51bXNwOyI6ICJcdTIwMDciLAogICAgIm52RGFzaDsiOiAiXHUyMmFkIiwKICAgICJudkhhcnI7IjogIlx1MjkwNCIsCiAgICAibnZhcDsiOiAiXHUyMjRkXHUyMGQyIiwKICAgICJudmRhc2g7IjogIlx1MjJhYyIsCiAgICAibnZnZTsiOiAiXHUyMjY1XHUyMGQyIiwKICAgICJudmd0OyI6ICI+XHUyMGQyIiwKICAgICJudmluZmluOyI6ICJcdTI5ZGUiLAogICAgIm52bEFycjsiOiAiXHUyOTAyIiwKICAgICJudmxlOyI6ICJcdTIyNjRcdTIwZDIiLAogICAgIm52bHQ7IjogIjxcdTIwZDIiLAogICAgIm52bHRyaWU7IjogIlx1MjJiNFx1MjBkMiIsCiAgICAibnZyQXJyOyI6ICJcdTI5MDMiLAogICAgIm52cnRyaWU7IjogIlx1MjJiNVx1MjBkMiIsCiAgICAibnZzaW07IjogIlx1MjIzY1x1MjBkMiIsCiAgICAibndBcnI7IjogIlx1MjFkNiIsCiAgICAibndhcmhrOyI6ICJcdTI5MjMiLAogICAgIm53YXJyOyI6ICJcdTIxOTYiLAogICAgIm53YXJyb3c7IjogIlx1MjE5NiIsCiAgICAibnduZWFyOyI6ICJcdTI5MjciLAogICAgIm9TOyI6ICJcdTI0YzgiLAogICAgIm9hY3V0ZSI6ICJceGYzIiwKICAgICJvYWN1dGU7IjogIlx4ZjMiLAogICAgIm9hc3Q7IjogIlx1MjI5YiIsCiAgICAib2NpcjsiOiAiXHUyMjlhIiwKICAgICJvY2lyYyI6ICJceGY0IiwKICAgICJvY2lyYzsiOiAiXHhmNCIsCiAgICAib2N5OyI6ICJcdTA0M2UiLAogICAgIm9kYXNoOyI6ICJcdTIyOWQiLAogICAgIm9kYmxhYzsiOiAiXHUwMTUxIiwKICAgICJvZGl2OyI6ICJcdTJhMzgiLAogICAgIm9kb3Q7IjogIlx1MjI5OSIsCiAgICAib2Rzb2xkOyI6ICJcdTI5YmMiLAogICAgIm9lbGlnOyI6ICJcdTAxNTMiLAogICAgIm9mY2lyOyI6ICJcdTI5YmYiLAogICAgIm9mcjsiOiAiXFUwMDAxZDUyYyIsCiAgICAib2dvbjsiOiAiXHUwMmRiIiwKICAgICJvZ3JhdmUiOiAiXHhmMiIsCiAgICAib2dyYXZlOyI6ICJceGYyIiwKICAgICJvZ3Q7IjogIlx1MjljMSIsCiAgICAib2hiYXI7IjogIlx1MjliNSIsCiAgICAib2htOyI6ICJcdTAzYTkiLAogICAgIm9pbnQ7IjogIlx1MjIyZSIsCiAgICAib2xhcnI7IjogIlx1MjFiYSIsCiAgICAib2xjaXI7IjogIlx1MjliZSIsCiAgICAib2xjcm9zczsiOiAiXHUyOWJiIiwKICAgICJvbGluZTsiOiAiXHUyMDNlIiwKICAgICJvbHQ7IjogIlx1MjljMCIsCiAgICAib21hY3I7IjogIlx1MDE0ZCIsCiAgICAib21lZ2E7IjogIlx1MDNjOSIsCiAgICAib21pY3JvbjsiOiAiXHUwM2JmIiwKICAgICJvbWlkOyI6ICJcdTI5YjYiLAogICAgIm9taW51czsiOiAiXHUyMjk2IiwKICAgICJvb3BmOyI6ICJcVTAwMDFkNTYwIiwKICAgICJvcGFyOyI6ICJcdTI5YjciLAogICAgIm9wZXJwOyI6ICJcdTI5YjkiLAogICAgIm9wbHVzOyI6ICJcdTIyOTUiLAogICAgIm9yOyI6ICJcdTIyMjgiLAogICAgIm9yYXJyOyI6ICJcdTIxYmIiLAogICAgIm9yZDsiOiAiXHUyYTVkIiwKICAgICJvcmRlcjsiOiAiXHUyMTM0IiwKICAgICJvcmRlcm9mOyI6ICJcdTIxMzQiLAogICAgIm9yZGYiOiAiXHhhYSIsCiAgICAib3JkZjsiOiAiXHhhYSIsCiAgICAib3JkbSI6ICJceGJhIiwKICAgICJvcmRtOyI6ICJceGJhIiwKICAgICJvcmlnb2Y7IjogIlx1MjJiNiIsCiAgICAib3JvcjsiOiAiXHUyYTU2IiwKICAgICJvcnNsb3BlOyI6ICJcdTJhNTciLAogICAgIm9ydjsiOiAiXHUyYTViIiwKICAgICJvc2NyOyI6ICJcdTIxMzQiLAogICAgIm9zbGFzaCI6ICJceGY4IiwKICAgICJvc2xhc2g7IjogIlx4ZjgiLAogICAgIm9zb2w7IjogIlx1MjI5OCIsCiAgICAib3RpbGRlIjogIlx4ZjUiLAogICAgIm90aWxkZTsiOiAiXHhmNSIsCiAgICAib3RpbWVzOyI6ICJcdTIyOTciLAogICAgIm90aW1lc2FzOyI6ICJcdTJhMzYiLAogICAgIm91bWwiOiAiXHhmNiIsCiAgICAib3VtbDsiOiAiXHhmNiIsCiAgICAib3ZiYXI7IjogIlx1MjMzZCIsCiAgICAicGFyOyI6ICJcdTIyMjUiLAogICAgInBhcmEiOiAiXHhiNiIsCiAgICAicGFyYTsiOiAiXHhiNiIsCiAgICAicGFyYWxsZWw7IjogIlx1MjIyNSIsCiAgICAicGFyc2ltOyI6ICJcdTJhZjMiLAogICAgInBhcnNsOyI6ICJcdTJhZmQiLAogICAgInBhcnQ7IjogIlx1MjIwMiIsCiAgICAicGN5OyI6ICJcdTA0M2YiLAogICAgInBlcmNudDsiOiAiJSIsCiAgICAicGVyaW9kOyI6ICIuIiwKICAgICJwZXJtaWw7IjogIlx1MjAzMCIsCiAgICAicGVycDsiOiAiXHUyMmE1IiwKICAgICJwZXJ0ZW5rOyI6ICJcdTIwMzEiLAogICAgInBmcjsiOiAiXFUwMDAxZDUyZCIsCiAgICAicGhpOyI6ICJcdTAzYzYiLAogICAgInBoaXY7IjogIlx1MDNkNSIsCiAgICAicGhtbWF0OyI6ICJcdTIxMzMiLAogICAgInBob25lOyI6ICJcdTI2MGUiLAogICAgInBpOyI6ICJcdTAzYzAiLAogICAgInBpdGNoZm9yazsiOiAiXHUyMmQ0IiwKICAgICJwaXY7IjogIlx1MDNkNiIsCiAgICAicGxhbmNrOyI6ICJcdTIxMGYiLAogICAgInBsYW5ja2g7IjogIlx1MjEwZSIsCiAgICAicGxhbmt2OyI6ICJcdTIxMGYiLAogICAgInBsdXM7IjogIisiLAogICAgInBsdXNhY2lyOyI6ICJcdTJhMjMiLAogICAgInBsdXNiOyI6ICJcdTIyOWUiLAogICAgInBsdXNjaXI7IjogIlx1MmEyMiIsCiAgICAicGx1c2RvOyI6ICJcdTIyMTQiLAogICAgInBsdXNkdTsiOiAiXHUyYTI1IiwKICAgICJwbHVzZTsiOiAiXHUyYTcyIiwKICAgICJwbHVzbW4iOiAiXHhiMSIsCiAgICAicGx1c21uOyI6ICJceGIxIiwKICAgICJwbHVzc2ltOyI6ICJcdTJhMjYiLAogICAgInBsdXN0d287IjogIlx1MmEyNyIsCiAgICAicG07IjogIlx4YjEiLAogICAgInBvaW50aW50OyI6ICJcdTJhMTUiLAogICAgInBvcGY7IjogIlxVMDAwMWQ1NjEiLAogICAgInBvdW5kIjogIlx4YTMiLAogICAgInBvdW5kOyI6ICJceGEzIiwKICAgICJwcjsiOiAiXHUyMjdhIiwKICAgICJwckU7IjogIlx1MmFiMyIsCiAgICAicHJhcDsiOiAiXHUyYWI3IiwKICAgICJwcmN1ZTsiOiAiXHUyMjdjIiwKICAgICJwcmU7IjogIlx1MmFhZiIsCiAgICAicHJlYzsiOiAiXHUyMjdhIiwKICAgICJwcmVjYXBwcm94OyI6ICJcdTJhYjciLAogICAgInByZWNjdXJseWVxOyI6ICJcdTIyN2MiLAogICAgInByZWNlcTsiOiAiXHUyYWFmIiwKICAgICJwcmVjbmFwcHJveDsiOiAiXHUyYWI5IiwKICAgICJwcmVjbmVxcTsiOiAiXHUyYWI1IiwKICAgICJwcmVjbnNpbTsiOiAiXHUyMmU4IiwKICAgICJwcmVjc2ltOyI6ICJcdTIyN2UiLAogICAgInByaW1lOyI6ICJcdTIwMzIiLAogICAgInByaW1lczsiOiAiXHUyMTE5IiwKICAgICJwcm5FOyI6ICJcdTJhYjUiLAogICAgInBybmFwOyI6ICJcdTJhYjkiLAogICAgInBybnNpbTsiOiAiXHUyMmU4IiwKICAgICJwcm9kOyI6ICJcdTIyMGYiLAogICAgInByb2ZhbGFyOyI6ICJcdTIzMmUiLAogICAgInByb2ZsaW5lOyI6ICJcdTIzMTIiLAogICAgInByb2ZzdXJmOyI6ICJcdTIzMTMiLAogICAgInByb3A7IjogIlx1MjIxZCIsCiAgICAicHJvcHRvOyI6ICJcdTIyMWQiLAogICAgInByc2ltOyI6ICJcdTIyN2UiLAogICAgInBydXJlbDsiOiAiXHUyMmIwIiwKICAgICJwc2NyOyI6ICJcVTAwMDFkNGM1IiwKICAgICJwc2k7IjogIlx1MDNjOCIsCiAgICAicHVuY3NwOyI6ICJcdTIwMDgiLAogICAgInFmcjsiOiAiXFUwMDAxZDUyZSIsCiAgICAicWludDsiOiAiXHUyYTBjIiwKICAgICJxb3BmOyI6ICJcVTAwMDFkNTYyIiwKICAgICJxcHJpbWU7IjogIlx1MjA1NyIsCiAgICAicXNjcjsiOiAiXFUwMDAxZDRjNiIsCiAgICAicXVhdGVybmlvbnM7IjogIlx1MjEwZCIsCiAgICAicXVhdGludDsiOiAiXHUyYTE2IiwKICAgICJxdWVzdDsiOiAiPyIsCiAgICAicXVlc3RlcTsiOiAiXHUyMjVmIiwKICAgICJxdW90IjogIlwiIiwKICAgICJxdW90OyI6ICJcIiIsCiAgICAickFhcnI7IjogIlx1MjFkYiIsCiAgICAickFycjsiOiAiXHUyMWQyIiwKICAgICJyQXRhaWw7IjogIlx1MjkxYyIsCiAgICAickJhcnI7IjogIlx1MjkwZiIsCiAgICAickhhcjsiOiAiXHUyOTY0IiwKICAgICJyYWNlOyI6ICJcdTIyM2RcdTAzMzEiLAogICAgInJhY3V0ZTsiOiAiXHUwMTU1IiwKICAgICJyYWRpYzsiOiAiXHUyMjFhIiwKICAgICJyYWVtcHR5djsiOiAiXHUyOWIzIiwKICAgICJyYW5nOyI6ICJcdTI3ZTkiLAogICAgInJhbmdkOyI6ICJcdTI5OTIiLAogICAgInJhbmdlOyI6ICJcdTI5YTUiLAogICAgInJhbmdsZTsiOiAiXHUyN2U5IiwKICAgICJyYXF1byI6ICJceGJiIiwKICAgICJyYXF1bzsiOiAiXHhiYiIsCiAgICAicmFycjsiOiAiXHUyMTkyIiwKICAgICJyYXJyYXA7IjogIlx1Mjk3NSIsCiAgICAicmFycmI7IjogIlx1MjFlNSIsCiAgICAicmFycmJmczsiOiAiXHUyOTIwIiwKICAgICJyYXJyYzsiOiAiXHUyOTMzIiwKICAgICJyYXJyZnM7IjogIlx1MjkxZSIsCiAgICAicmFycmhrOyI6ICJcdTIxYWEiLAogICAgInJhcnJscDsiOiAiXHUyMWFjIiwKICAgICJyYXJycGw7IjogIlx1Mjk0NSIsCiAgICAicmFycnNpbTsiOiAiXHUyOTc0IiwKICAgICJyYXJydGw7IjogIlx1MjFhMyIsCiAgICAicmFycnc7IjogIlx1MjE5ZCIsCiAgICAicmF0YWlsOyI6ICJcdTI5MWEiLAogICAgInJhdGlvOyI6ICJcdTIyMzYiLAogICAgInJhdGlvbmFsczsiOiAiXHUyMTFhIiwKICAgICJyYmFycjsiOiAiXHUyOTBkIiwKICAgICJyYmJyazsiOiAiXHUyNzczIiwKICAgICJyYnJhY2U7IjogIn0iLAogICAgInJicmFjazsiOiAiXSIsCiAgICAicmJya2U7IjogIlx1Mjk4YyIsCiAgICAicmJya3NsZDsiOiAiXHUyOThlIiwKICAgICJyYnJrc2x1OyI6ICJcdTI5OTAiLAogICAgInJjYXJvbjsiOiAiXHUwMTU5IiwKICAgICJyY2VkaWw7IjogIlx1MDE1NyIsCiAgICAicmNlaWw7IjogIlx1MjMwOSIsCiAgICAicmN1YjsiOiAifSIsCiAgICAicmN5OyI6ICJcdTA0NDAiLAogICAgInJkY2E7IjogIlx1MjkzNyIsCiAgICAicmRsZGhhcjsiOiAiXHUyOTY5IiwKICAgICJyZHF1bzsiOiAiXHUyMDFkIiwKICAgICJyZHF1b3I7IjogIlx1MjAxZCIsCiAgICAicmRzaDsiOiAiXHUyMWIzIiwKICAgICJyZWFsOyI6ICJcdTIxMWMiLAogICAgInJlYWxpbmU7IjogIlx1MjExYiIsCiAgICAicmVhbHBhcnQ7IjogIlx1MjExYyIsCiAgICAicmVhbHM7IjogIlx1MjExZCIsCiAgICAicmVjdDsiOiAiXHUyNWFkIiwKICAgICJyZWciOiAiXHhhZSIsCiAgICAicmVnOyI6ICJceGFlIiwKICAgICJyZmlzaHQ7IjogIlx1Mjk3ZCIsCiAgICAicmZsb29yOyI6ICJcdTIzMGIiLAogICAgInJmcjsiOiAiXFUwMDAxZDUyZiIsCiAgICAicmhhcmQ7IjogIlx1MjFjMSIsCiAgICAicmhhcnU7IjogIlx1MjFjMCIsCiAgICAicmhhcnVsOyI6ICJcdTI5NmMiLAogICAgInJobzsiOiAiXHUwM2MxIiwKICAgICJyaG92OyI6ICJcdTAzZjEiLAogICAgInJpZ2h0YXJyb3c7IjogIlx1MjE5MiIsCiAgICAicmlnaHRhcnJvd3RhaWw7IjogIlx1MjFhMyIsCiAgICAicmlnaHRoYXJwb29uZG93bjsiOiAiXHUyMWMxIiwKICAgICJyaWdodGhhcnBvb251cDsiOiAiXHUyMWMwIiwKICAgICJyaWdodGxlZnRhcnJvd3M7IjogIlx1MjFjNCIsCiAgICAicmlnaHRsZWZ0aGFycG9vbnM7IjogIlx1MjFjYyIsCiAgICAicmlnaHRyaWdodGFycm93czsiOiAiXHUyMWM5IiwKICAgICJyaWdodHNxdWlnYXJyb3c7IjogIlx1MjE5ZCIsCiAgICAicmlnaHR0aHJlZXRpbWVzOyI6ICJcdTIyY2MiLAogICAgInJpbmc7IjogIlx1MDJkYSIsCiAgICAicmlzaW5nZG90c2VxOyI6ICJcdTIyNTMiLAogICAgInJsYXJyOyI6ICJcdTIxYzQiLAogICAgInJsaGFyOyI6ICJcdTIxY2MiLAogICAgInJsbTsiOiAiXHUyMDBmIiwKICAgICJybW91c3Q7IjogIlx1MjNiMSIsCiAgICAicm1vdXN0YWNoZTsiOiAiXHUyM2IxIiwKICAgICJybm1pZDsiOiAiXHUyYWVlIiwKICAgICJyb2FuZzsiOiAiXHUyN2VkIiwKICAgICJyb2FycjsiOiAiXHUyMWZlIiwKICAgICJyb2JyazsiOiAiXHUyN2U3IiwKICAgICJyb3BhcjsiOiAiXHUyOTg2IiwKICAgICJyb3BmOyI6ICJcVTAwMDFkNTYzIiwKICAgICJyb3BsdXM7IjogIlx1MmEyZSIsCiAgICAicm90aW1lczsiOiAiXHUyYTM1IiwKICAgICJycGFyOyI6ICIpIiwKICAgICJycGFyZ3Q7IjogIlx1Mjk5NCIsCiAgICAicnBwb2xpbnQ7IjogIlx1MmExMiIsCiAgICAicnJhcnI7IjogIlx1MjFjOSIsCiAgICAicnNhcXVvOyI6ICJcdTIwM2EiLAogICAgInJzY3I7IjogIlxVMDAwMWQ0YzciLAogICAgInJzaDsiOiAiXHUyMWIxIiwKICAgICJyc3FiOyI6ICJdIiwKICAgICJyc3F1bzsiOiAiXHUyMDE5IiwKICAgICJyc3F1b3I7IjogIlx1MjAxOSIsCiAgICAicnRocmVlOyI6ICJcdTIyY2MiLAogICAgInJ0aW1lczsiOiAiXHUyMmNhIiwKICAgICJydHJpOyI6ICJcdTI1YjkiLAogICAgInJ0cmllOyI6ICJcdTIyYjUiLAogICAgInJ0cmlmOyI6ICJcdTI1YjgiLAogICAgInJ0cmlsdHJpOyI6ICJcdTI5Y2UiLAogICAgInJ1bHVoYXI7IjogIlx1Mjk2OCIsCiAgICAicng7IjogIlx1MjExZSIsCiAgICAic2FjdXRlOyI6ICJcdTAxNWIiLAogICAgInNicXVvOyI6ICJcdTIwMWEiLAogICAgInNjOyI6ICJcdTIyN2IiLAogICAgInNjRTsiOiAiXHUyYWI0IiwKICAgICJzY2FwOyI6ICJcdTJhYjgiLAogICAgInNjYXJvbjsiOiAiXHUwMTYxIiwKICAgICJzY2N1ZTsiOiAiXHUyMjdkIiwKICAgICJzY2U7IjogIlx1MmFiMCIsCiAgICAic2NlZGlsOyI6ICJcdTAxNWYiLAogICAgInNjaXJjOyI6ICJcdTAxNWQiLAogICAgInNjbkU7IjogIlx1MmFiNiIsCiAgICAic2NuYXA7IjogIlx1MmFiYSIsCiAgICAic2Nuc2ltOyI6ICJcdTIyZTkiLAogICAgInNjcG9saW50OyI6ICJcdTJhMTMiLAogICAgInNjc2ltOyI6ICJcdTIyN2YiLAogICAgInNjeTsiOiAiXHUwNDQxIiwKICAgICJzZG90OyI6ICJcdTIyYzUiLAogICAgInNkb3RiOyI6ICJcdTIyYTEiLAogICAgInNkb3RlOyI6ICJcdTJhNjYiLAogICAgInNlQXJyOyI6ICJcdTIxZDgiLAogICAgInNlYXJoazsiOiAiXHUyOTI1IiwKICAgICJzZWFycjsiOiAiXHUyMTk4IiwKICAgICJzZWFycm93OyI6ICJcdTIxOTgiLAogICAgInNlY3QiOiAiXHhhNyIsCiAgICAic2VjdDsiOiAiXHhhNyIsCiAgICAic2VtaTsiOiAiOyIsCiAgICAic2Vzd2FyOyI6ICJcdTI5MjkiLAogICAgInNldG1pbnVzOyI6ICJcdTIyMTYiLAogICAgInNldG1uOyI6ICJcdTIyMTYiLAogICAgInNleHQ7IjogIlx1MjczNiIsCiAgICAic2ZyOyI6ICJcVTAwMDFkNTMwIiwKICAgICJzZnJvd247IjogIlx1MjMyMiIsCiAgICAic2hhcnA7IjogIlx1MjY2ZiIsCiAgICAic2hjaGN5OyI6ICJcdTA0NDkiLAogICAgInNoY3k7IjogIlx1MDQ0OCIsCiAgICAic2hvcnRtaWQ7IjogIlx1MjIyMyIsCiAgICAic2hvcnRwYXJhbGxlbDsiOiAiXHUyMjI1IiwKICAgICJzaHkiOiAiXHhhZCIsCiAgICAic2h5OyI6ICJceGFkIiwKICAgICJzaWdtYTsiOiAiXHUwM2MzIiwKICAgICJzaWdtYWY7IjogIlx1MDNjMiIsCiAgICAic2lnbWF2OyI6ICJcdTAzYzIiLAogICAgInNpbTsiOiAiXHUyMjNjIiwKICAgICJzaW1kb3Q7IjogIlx1MmE2YSIsCiAgICAic2ltZTsiOiAiXHUyMjQzIiwKICAgICJzaW1lcTsiOiAiXHUyMjQzIiwKICAgICJzaW1nOyI6ICJcdTJhOWUiLAogICAgInNpbWdFOyI6ICJcdTJhYTAiLAogICAgInNpbWw7IjogIlx1MmE5ZCIsCiAgICAic2ltbEU7IjogIlx1MmE5ZiIsCiAgICAic2ltbmU7IjogIlx1MjI0NiIsCiAgICAic2ltcGx1czsiOiAiXHUyYTI0IiwKICAgICJzaW1yYXJyOyI6ICJcdTI5NzIiLAogICAgInNsYXJyOyI6ICJcdTIxOTAiLAogICAgInNtYWxsc2V0bWludXM7IjogIlx1MjIxNiIsCiAgICAic21hc2hwOyI6ICJcdTJhMzMiLAogICAgInNtZXBhcnNsOyI6ICJcdTI5ZTQiLAogICAgInNtaWQ7IjogIlx1MjIyMyIsCiAgICAic21pbGU7IjogIlx1MjMyMyIsCiAgICAic210OyI6ICJcdTJhYWEiLAogICAgInNtdGU7IjogIlx1MmFhYyIsCiAgICAic210ZXM7IjogIlx1MmFhY1x1ZmUwMCIsCiAgICAic29mdGN5OyI6ICJcdTA0NGMiLAogICAgInNvbDsiOiAiLyIsCiAgICAic29sYjsiOiAiXHUyOWM0IiwKICAgICJzb2xiYXI7IjogIlx1MjMzZiIsCiAgICAic29wZjsiOiAiXFUwMDAxZDU2NCIsCiAgICAic3BhZGVzOyI6ICJcdTI2NjAiLAogICAgInNwYWRlc3VpdDsiOiAiXHUyNjYwIiwKICAgICJzcGFyOyI6ICJcdTIyMjUiLAogICAgInNxY2FwOyI6ICJcdTIyOTMiLAogICAgInNxY2FwczsiOiAiXHUyMjkzXHVmZTAwIiwKICAgICJzcWN1cDsiOiAiXHUyMjk0IiwKICAgICJzcWN1cHM7IjogIlx1MjI5NFx1ZmUwMCIsCiAgICAic3FzdWI7IjogIlx1MjI4ZiIsCiAgICAic3FzdWJlOyI6ICJcdTIyOTEiLAogICAgInNxc3Vic2V0OyI6ICJcdTIyOGYiLAogICAgInNxc3Vic2V0ZXE7IjogIlx1MjI5MSIsCiAgICAic3FzdXA7IjogIlx1MjI5MCIsCiAgICAic3FzdXBlOyI6ICJcdTIyOTIiLAogICAgInNxc3Vwc2V0OyI6ICJcdTIyOTAiLAogICAgInNxc3Vwc2V0ZXE7IjogIlx1MjI5MiIsCiAgICAic3F1OyI6ICJcdTI1YTEiLAogICAgInNxdWFyZTsiOiAiXHUyNWExIiwKICAgICJzcXVhcmY7IjogIlx1MjVhYSIsCiAgICAic3F1ZjsiOiAiXHUyNWFhIiwKICAgICJzcmFycjsiOiAiXHUyMTkyIiwKICAgICJzc2NyOyI6ICJcVTAwMDFkNGM4IiwKICAgICJzc2V0bW47IjogIlx1MjIxNiIsCiAgICAic3NtaWxlOyI6ICJcdTIzMjMiLAogICAgInNzdGFyZjsiOiAiXHUyMmM2IiwKICAgICJzdGFyOyI6ICJcdTI2MDYiLAogICAgInN0YXJmOyI6ICJcdTI2MDUiLAogICAgInN0cmFpZ2h0ZXBzaWxvbjsiOiAiXHUwM2Y1IiwKICAgICJzdHJhaWdodHBoaTsiOiAiXHUwM2Q1IiwKICAgICJzdHJuczsiOiAiXHhhZiIsCiAgICAic3ViOyI6ICJcdTIyODIiLAogICAgInN1YkU7IjogIlx1MmFjNSIsCiAgICAic3ViZG90OyI6ICJcdTJhYmQiLAogICAgInN1YmU7IjogIlx1MjI4NiIsCiAgICAic3ViZWRvdDsiOiAiXHUyYWMzIiwKICAgICJzdWJtdWx0OyI6ICJcdTJhYzEiLAogICAgInN1Ym5FOyI6ICJcdTJhY2IiLAogICAgInN1Ym5lOyI6ICJcdTIyOGEiLAogICAgInN1YnBsdXM7IjogIlx1MmFiZiIsCiAgICAic3VicmFycjsiOiAiXHUyOTc5IiwKICAgICJzdWJzZXQ7IjogIlx1MjI4MiIsCiAgICAic3Vic2V0ZXE7IjogIlx1MjI4NiIsCiAgICAic3Vic2V0ZXFxOyI6ICJcdTJhYzUiLAogICAgInN1YnNldG5lcTsiOiAiXHUyMjhhIiwKICAgICJzdWJzZXRuZXFxOyI6ICJcdTJhY2IiLAogICAgInN1YnNpbTsiOiAiXHUyYWM3IiwKICAgICJzdWJzdWI7IjogIlx1MmFkNSIsCiAgICAic3Vic3VwOyI6ICJcdTJhZDMiLAogICAgInN1Y2M7IjogIlx1MjI3YiIsCiAgICAic3VjY2FwcHJveDsiOiAiXHUyYWI4IiwKICAgICJzdWNjY3VybHllcTsiOiAiXHUyMjdkIiwKICAgICJzdWNjZXE7IjogIlx1MmFiMCIsCiAgICAic3VjY25hcHByb3g7IjogIlx1MmFiYSIsCiAgICAic3VjY25lcXE7IjogIlx1MmFiNiIsCiAgICAic3VjY25zaW07IjogIlx1MjJlOSIsCiAgICAic3VjY3NpbTsiOiAiXHUyMjdmIiwKICAgICJzdW07IjogIlx1MjIxMSIsCiAgICAic3VuZzsiOiAiXHUyNjZhIiwKICAgICJzdXAxIjogIlx4YjkiLAogICAgInN1cDE7IjogIlx4YjkiLAogICAgInN1cDIiOiAiXHhiMiIsCiAgICAic3VwMjsiOiAiXHhiMiIsCiAgICAic3VwMyI6ICJceGIzIiwKICAgICJzdXAzOyI6ICJceGIzIiwKICAgICJzdXA7IjogIlx1MjI4MyIsCiAgICAic3VwRTsiOiAiXHUyYWM2IiwKICAgICJzdXBkb3Q7IjogIlx1MmFiZSIsCiAgICAic3VwZHN1YjsiOiAiXHUyYWQ4IiwKICAgICJzdXBlOyI6ICJcdTIyODciLAogICAgInN1cGVkb3Q7IjogIlx1MmFjNCIsCiAgICAic3VwaHNvbDsiOiAiXHUyN2M5IiwKICAgICJzdXBoc3ViOyI6ICJcdTJhZDciLAogICAgInN1cGxhcnI7IjogIlx1Mjk3YiIsCiAgICAic3VwbXVsdDsiOiAiXHUyYWMyIiwKICAgICJzdXBuRTsiOiAiXHUyYWNjIiwKICAgICJzdXBuZTsiOiAiXHUyMjhiIiwKICAgICJzdXBwbHVzOyI6ICJcdTJhYzAiLAogICAgInN1cHNldDsiOiAiXHUyMjgzIiwKICAgICJzdXBzZXRlcTsiOiAiXHUyMjg3IiwKICAgICJzdXBzZXRlcXE7IjogIlx1MmFjNiIsCiAgICAic3Vwc2V0bmVxOyI6ICJcdTIyOGIiLAogICAgInN1cHNldG5lcXE7IjogIlx1MmFjYyIsCiAgICAic3Vwc2ltOyI6ICJcdTJhYzgiLAogICAgInN1cHN1YjsiOiAiXHUyYWQ0IiwKICAgICJzdXBzdXA7IjogIlx1MmFkNiIsCiAgICAic3dBcnI7IjogIlx1MjFkOSIsCiAgICAic3dhcmhrOyI6ICJcdTI5MjYiLAogICAgInN3YXJyOyI6ICJcdTIxOTkiLAogICAgInN3YXJyb3c7IjogIlx1MjE5OSIsCiAgICAic3dud2FyOyI6ICJcdTI5MmEiLAogICAgInN6bGlnIjogIlx4ZGYiLAogICAgInN6bGlnOyI6ICJceGRmIiwKICAgICJ0YXJnZXQ7IjogIlx1MjMxNiIsCiAgICAidGF1OyI6ICJcdTAzYzQiLAogICAgInRicms7IjogIlx1MjNiNCIsCiAgICAidGNhcm9uOyI6ICJcdTAxNjUiLAogICAgInRjZWRpbDsiOiAiXHUwMTYzIiwKICAgICJ0Y3k7IjogIlx1MDQ0MiIsCiAgICAidGRvdDsiOiAiXHUyMGRiIiwKICAgICJ0ZWxyZWM7IjogIlx1MjMxNSIsCiAgICAidGZyOyI6ICJcVTAwMDFkNTMxIiwKICAgICJ0aGVyZTQ7IjogIlx1MjIzNCIsCiAgICAidGhlcmVmb3JlOyI6ICJcdTIyMzQiLAogICAgInRoZXRhOyI6ICJcdTAzYjgiLAogICAgInRoZXRhc3ltOyI6ICJcdTAzZDEiLAogICAgInRoZXRhdjsiOiAiXHUwM2QxIiwKICAgICJ0aGlja2FwcHJveDsiOiAiXHUyMjQ4IiwKICAgICJ0aGlja3NpbTsiOiAiXHUyMjNjIiwKICAgICJ0aGluc3A7IjogIlx1MjAwOSIsCiAgICAidGhrYXA7IjogIlx1MjI0OCIsCiAgICAidGhrc2ltOyI6ICJcdTIyM2MiLAogICAgInRob3JuIjogIlx4ZmUiLAogICAgInRob3JuOyI6ICJceGZlIiwKICAgICJ0aWxkZTsiOiAiXHUwMmRjIiwKICAgICJ0aW1lcyI6ICJceGQ3IiwKICAgICJ0aW1lczsiOiAiXHhkNyIsCiAgICAidGltZXNiOyI6ICJcdTIyYTAiLAogICAgInRpbWVzYmFyOyI6ICJcdTJhMzEiLAogICAgInRpbWVzZDsiOiAiXHUyYTMwIiwKICAgICJ0aW50OyI6ICJcdTIyMmQiLAogICAgInRvZWE7IjogIlx1MjkyOCIsCiAgICAidG9wOyI6ICJcdTIyYTQiLAogICAgInRvcGJvdDsiOiAiXHUyMzM2IiwKICAgICJ0b3BjaXI7IjogIlx1MmFmMSIsCiAgICAidG9wZjsiOiAiXFUwMDAxZDU2NSIsCiAgICAidG9wZm9yazsiOiAiXHUyYWRhIiwKICAgICJ0b3NhOyI6ICJcdTI5MjkiLAogICAgInRwcmltZTsiOiAiXHUyMDM0IiwKICAgICJ0cmFkZTsiOiAiXHUyMTIyIiwKICAgICJ0cmlhbmdsZTsiOiAiXHUyNWI1IiwKICAgICJ0cmlhbmdsZWRvd247IjogIlx1MjViZiIsCiAgICAidHJpYW5nbGVsZWZ0OyI6ICJcdTI1YzMiLAogICAgInRyaWFuZ2xlbGVmdGVxOyI6ICJcdTIyYjQiLAogICAgInRyaWFuZ2xlcTsiOiAiXHUyMjVjIiwKICAgICJ0cmlhbmdsZXJpZ2h0OyI6ICJcdTI1YjkiLAogICAgInRyaWFuZ2xlcmlnaHRlcTsiOiAiXHUyMmI1IiwKICAgICJ0cmlkb3Q7IjogIlx1MjVlYyIsCiAgICAidHJpZTsiOiAiXHUyMjVjIiwKICAgICJ0cmltaW51czsiOiAiXHUyYTNhIiwKICAgICJ0cmlwbHVzOyI6ICJcdTJhMzkiLAogICAgInRyaXNiOyI6ICJcdTI5Y2QiLAogICAgInRyaXRpbWU7IjogIlx1MmEzYiIsCiAgICAidHJwZXppdW07IjogIlx1MjNlMiIsCiAgICAidHNjcjsiOiAiXFUwMDAxZDRjOSIsCiAgICAidHNjeTsiOiAiXHUwNDQ2IiwKICAgICJ0c2hjeTsiOiAiXHUwNDViIiwKICAgICJ0c3Ryb2s7IjogIlx1MDE2NyIsCiAgICAidHdpeHQ7IjogIlx1MjI2YyIsCiAgICAidHdvaGVhZGxlZnRhcnJvdzsiOiAiXHUyMTllIiwKICAgICJ0d29oZWFkcmlnaHRhcnJvdzsiOiAiXHUyMWEwIiwKICAgICJ1QXJyOyI6ICJcdTIxZDEiLAogICAgInVIYXI7IjogIlx1Mjk2MyIsCiAgICAidWFjdXRlIjogIlx4ZmEiLAogICAgInVhY3V0ZTsiOiAiXHhmYSIsCiAgICAidWFycjsiOiAiXHUyMTkxIiwKICAgICJ1YnJjeTsiOiAiXHUwNDVlIiwKICAgICJ1YnJldmU7IjogIlx1MDE2ZCIsCiAgICAidWNpcmMiOiAiXHhmYiIsCiAgICAidWNpcmM7IjogIlx4ZmIiLAogICAgInVjeTsiOiAiXHUwNDQzIiwKICAgICJ1ZGFycjsiOiAiXHUyMWM1IiwKICAgICJ1ZGJsYWM7IjogIlx1MDE3MSIsCiAgICAidWRoYXI7IjogIlx1Mjk2ZSIsCiAgICAidWZpc2h0OyI6ICJcdTI5N2UiLAogICAgInVmcjsiOiAiXFUwMDAxZDUzMiIsCiAgICAidWdyYXZlIjogIlx4ZjkiLAogICAgInVncmF2ZTsiOiAiXHhmOSIsCiAgICAidWhhcmw7IjogIlx1MjFiZiIsCiAgICAidWhhcnI7IjogIlx1MjFiZSIsCiAgICAidWhibGs7IjogIlx1MjU4MCIsCiAgICAidWxjb3JuOyI6ICJcdTIzMWMiLAogICAgInVsY29ybmVyOyI6ICJcdTIzMWMiLAogICAgInVsY3JvcDsiOiAiXHUyMzBmIiwKICAgICJ1bHRyaTsiOiAiXHUyNWY4IiwKICAgICJ1bWFjcjsiOiAiXHUwMTZiIiwKICAgICJ1bWwiOiAiXHhhOCIsCiAgICAidW1sOyI6ICJceGE4IiwKICAgICJ1b2dvbjsiOiAiXHUwMTczIiwKICAgICJ1b3BmOyI6ICJcVTAwMDFkNTY2IiwKICAgICJ1cGFycm93OyI6ICJcdTIxOTEiLAogICAgInVwZG93bmFycm93OyI6ICJcdTIxOTUiLAogICAgInVwaGFycG9vbmxlZnQ7IjogIlx1MjFiZiIsCiAgICAidXBoYXJwb29ucmlnaHQ7IjogIlx1MjFiZSIsCiAgICAidXBsdXM7IjogIlx1MjI4ZSIsCiAgICAidXBzaTsiOiAiXHUwM2M1IiwKICAgICJ1cHNpaDsiOiAiXHUwM2QyIiwKICAgICJ1cHNpbG9uOyI6ICJcdTAzYzUiLAogICAgInVwdXBhcnJvd3M7IjogIlx1MjFjOCIsCiAgICAidXJjb3JuOyI6ICJcdTIzMWQiLAogICAgInVyY29ybmVyOyI6ICJcdTIzMWQiLAogICAgInVyY3JvcDsiOiAiXHUyMzBlIiwKICAgICJ1cmluZzsiOiAiXHUwMTZmIiwKICAgICJ1cnRyaTsiOiAiXHUyNWY5IiwKICAgICJ1c2NyOyI6ICJcVTAwMDFkNGNhIiwKICAgICJ1dGRvdDsiOiAiXHUyMmYwIiwKICAgICJ1dGlsZGU7IjogIlx1MDE2OSIsCiAgICAidXRyaTsiOiAiXHUyNWI1IiwKICAgICJ1dHJpZjsiOiAiXHUyNWI0IiwKICAgICJ1dWFycjsiOiAiXHUyMWM4IiwKICAgICJ1dW1sIjogIlx4ZmMiLAogICAgInV1bWw7IjogIlx4ZmMiLAogICAgInV3YW5nbGU7IjogIlx1MjlhNyIsCiAgICAidkFycjsiOiAiXHUyMWQ1IiwKICAgICJ2QmFyOyI6ICJcdTJhZTgiLAogICAgInZCYXJ2OyI6ICJcdTJhZTkiLAogICAgInZEYXNoOyI6ICJcdTIyYTgiLAogICAgInZhbmdydDsiOiAiXHUyOTljIiwKICAgICJ2YXJlcHNpbG9uOyI6ICJcdTAzZjUiLAogICAgInZhcmthcHBhOyI6ICJcdTAzZjAiLAogICAgInZhcm5vdGhpbmc7IjogIlx1MjIwNSIsCiAgICAidmFycGhpOyI6ICJcdTAzZDUiLAogICAgInZhcnBpOyI6ICJcdTAzZDYiLAogICAgInZhcnByb3B0bzsiOiAiXHUyMjFkIiwKICAgICJ2YXJyOyI6ICJcdTIxOTUiLAogICAgInZhcnJobzsiOiAiXHUwM2YxIiwKICAgICJ2YXJzaWdtYTsiOiAiXHUwM2MyIiwKICAgICJ2YXJzdWJzZXRuZXE7IjogIlx1MjI4YVx1ZmUwMCIsCiAgICAidmFyc3Vic2V0bmVxcTsiOiAiXHUyYWNiXHVmZTAwIiwKICAgICJ2YXJzdXBzZXRuZXE7IjogIlx1MjI4Ylx1ZmUwMCIsCiAgICAidmFyc3Vwc2V0bmVxcTsiOiAiXHUyYWNjXHVmZTAwIiwKICAgICJ2YXJ0aGV0YTsiOiAiXHUwM2QxIiwKICAgICJ2YXJ0cmlhbmdsZWxlZnQ7IjogIlx1MjJiMiIsCiAgICAidmFydHJpYW5nbGVyaWdodDsiOiAiXHUyMmIzIiwKICAgICJ2Y3k7IjogIlx1MDQzMiIsCiAgICAidmRhc2g7IjogIlx1MjJhMiIsCiAgICAidmVlOyI6ICJcdTIyMjgiLAogICAgInZlZWJhcjsiOiAiXHUyMmJiIiwKICAgICJ2ZWVlcTsiOiAiXHUyMjVhIiwKICAgICJ2ZWxsaXA7IjogIlx1MjJlZSIsCiAgICAidmVyYmFyOyI6ICJ8IiwKICAgICJ2ZXJ0OyI6ICJ8IiwKICAgICJ2ZnI7IjogIlxVMDAwMWQ1MzMiLAogICAgInZsdHJpOyI6ICJcdTIyYjIiLAogICAgInZuc3ViOyI6ICJcdTIyODJcdTIwZDIiLAogICAgInZuc3VwOyI6ICJcdTIyODNcdTIwZDIiLAogICAgInZvcGY7IjogIlxVMDAwMWQ1NjciLAogICAgInZwcm9wOyI6ICJcdTIyMWQiLAogICAgInZydHJpOyI6ICJcdTIyYjMiLAogICAgInZzY3I7IjogIlxVMDAwMWQ0Y2IiLAogICAgInZzdWJuRTsiOiAiXHUyYWNiXHVmZTAwIiwKICAgICJ2c3VibmU7IjogIlx1MjI4YVx1ZmUwMCIsCiAgICAidnN1cG5FOyI6ICJcdTJhY2NcdWZlMDAiLAogICAgInZzdXBuZTsiOiAiXHUyMjhiXHVmZTAwIiwKICAgICJ2emlnemFnOyI6ICJcdTI5OWEiLAogICAgIndjaXJjOyI6ICJcdTAxNzUiLAogICAgIndlZGJhcjsiOiAiXHUyYTVmIiwKICAgICJ3ZWRnZTsiOiAiXHUyMjI3IiwKICAgICJ3ZWRnZXE7IjogIlx1MjI1OSIsCiAgICAid2VpZXJwOyI6ICJcdTIxMTgiLAogICAgIndmcjsiOiAiXFUwMDAxZDUzNCIsCiAgICAid29wZjsiOiAiXFUwMDAxZDU2OCIsCiAgICAid3A7IjogIlx1MjExOCIsCiAgICAid3I7IjogIlx1MjI0MCIsCiAgICAid3JlYXRoOyI6ICJcdTIyNDAiLAogICAgIndzY3I7IjogIlxVMDAwMWQ0Y2MiLAogICAgInhjYXA7IjogIlx1MjJjMiIsCiAgICAieGNpcmM7IjogIlx1MjVlZiIsCiAgICAieGN1cDsiOiAiXHUyMmMzIiwKICAgICJ4ZHRyaTsiOiAiXHUyNWJkIiwKICAgICJ4ZnI7IjogIlxVMDAwMWQ1MzUiLAogICAgInhoQXJyOyI6ICJcdTI3ZmEiLAogICAgInhoYXJyOyI6ICJcdTI3ZjciLAogICAgInhpOyI6ICJcdTAzYmUiLAogICAgInhsQXJyOyI6ICJcdTI3ZjgiLAogICAgInhsYXJyOyI6ICJcdTI3ZjUiLAogICAgInhtYXA7IjogIlx1MjdmYyIsCiAgICAieG5pczsiOiAiXHUyMmZiIiwKICAgICJ4b2RvdDsiOiAiXHUyYTAwIiwKICAgICJ4b3BmOyI6ICJcVTAwMDFkNTY5IiwKICAgICJ4b3BsdXM7IjogIlx1MmEwMSIsCiAgICAieG90aW1lOyI6ICJcdTJhMDIiLAogICAgInhyQXJyOyI6ICJcdTI3ZjkiLAogICAgInhyYXJyOyI6ICJcdTI3ZjYiLAogICAgInhzY3I7IjogIlxVMDAwMWQ0Y2QiLAogICAgInhzcWN1cDsiOiAiXHUyYTA2IiwKICAgICJ4dXBsdXM7IjogIlx1MmEwNCIsCiAgICAieHV0cmk7IjogIlx1MjViMyIsCiAgICAieHZlZTsiOiAiXHUyMmMxIiwKICAgICJ4d2VkZ2U7IjogIlx1MjJjMCIsCiAgICAieWFjdXRlIjogIlx4ZmQiLAogICAgInlhY3V0ZTsiOiAiXHhmZCIsCiAgICAieWFjeTsiOiAiXHUwNDRmIiwKICAgICJ5Y2lyYzsiOiAiXHUwMTc3IiwKICAgICJ5Y3k7IjogIlx1MDQ0YiIsCiAgICAieWVuIjogIlx4YTUiLAogICAgInllbjsiOiAiXHhhNSIsCiAgICAieWZyOyI6ICJcVTAwMDFkNTM2IiwKICAgICJ5aWN5OyI6ICJcdTA0NTciLAogICAgInlvcGY7IjogIlxVMDAwMWQ1NmEiLAogICAgInlzY3I7IjogIlxVMDAwMWQ0Y2UiLAogICAgInl1Y3k7IjogIlx1MDQ0ZSIsCiAgICAieXVtbCI6ICJceGZmIiwKICAgICJ5dW1sOyI6ICJceGZmIiwKICAgICJ6YWN1dGU7IjogIlx1MDE3YSIsCiAgICAiemNhcm9uOyI6ICJcdTAxN2UiLAogICAgInpjeTsiOiAiXHUwNDM3IiwKICAgICJ6ZG90OyI6ICJcdTAxN2MiLAogICAgInplZXRyZjsiOiAiXHUyMTI4IiwKICAgICJ6ZXRhOyI6ICJcdTAzYjYiLAogICAgInpmcjsiOiAiXFUwMDAxZDUzNyIsCiAgICAiemhjeTsiOiAiXHUwNDM2IiwKICAgICJ6aWdyYXJyOyI6ICJcdTIxZGQiLAogICAgInpvcGY7IjogIlxVMDAwMWQ1NmIiLAogICAgInpzY3I7IjogIlxVMDAwMWQ0Y2YiLAogICAgInp3ajsiOiAiXHUyMDBkIiwKICAgICJ6d25qOyI6ICJcdTIwMGMiLAp9CgpyZXBsYWNlbWVudENoYXJhY3RlcnMgPSB7CiAgICAweDA6ICJcdUZGRkQiLAogICAgMHgwZDogIlx1MDAwRCIsCiAgICAweDgwOiAiXHUyMEFDIiwKICAgIDB4ODE6ICJcdTAwODEiLAogICAgMHg4MjogIlx1MjAxQSIsCiAgICAweDgzOiAiXHUwMTkyIiwKICAgIDB4ODQ6ICJcdTIwMUUiLAogICAgMHg4NTogIlx1MjAyNiIsCiAgICAweDg2OiAiXHUyMDIwIiwKICAgIDB4ODc6ICJcdTIwMjEiLAogICAgMHg4ODogIlx1MDJDNiIsCiAgICAweDg5OiAiXHUyMDMwIiwKICAgIDB4OEE6ICJcdTAxNjAiLAogICAgMHg4QjogIlx1MjAzOSIsCiAgICAweDhDOiAiXHUwMTUyIiwKICAgIDB4OEQ6ICJcdTAwOEQiLAogICAgMHg4RTogIlx1MDE3RCIsCiAgICAweDhGOiAiXHUwMDhGIiwKICAgIDB4OTA6ICJcdTAwOTAiLAogICAgMHg5MTogIlx1MjAxOCIsCiAgICAweDkyOiAiXHUyMDE5IiwKICAgIDB4OTM6ICJcdTIwMUMiLAogICAgMHg5NDogIlx1MjAxRCIsCiAgICAweDk1OiAiXHUyMDIyIiwKICAgIDB4OTY6ICJcdTIwMTMiLAogICAgMHg5NzogIlx1MjAxNCIsCiAgICAweDk4OiAiXHUwMkRDIiwKICAgIDB4OTk6ICJcdTIxMjIiLAogICAgMHg5QTogIlx1MDE2MSIsCiAgICAweDlCOiAiXHUyMDNBIiwKICAgIDB4OUM6ICJcdTAxNTMiLAogICAgMHg5RDogIlx1MDA5RCIsCiAgICAweDlFOiAiXHUwMTdFIiwKICAgIDB4OUY6ICJcdTAxNzgiLAp9Cgp0b2tlblR5cGVzID0gewogICAgIkRvY3R5cGUiOiAwLAogICAgIkNoYXJhY3RlcnMiOiAxLAogICAgIlNwYWNlQ2hhcmFjdGVycyI6IDIsCiAgICAiU3RhcnRUYWciOiAzLAogICAgIkVuZFRhZyI6IDQsCiAgICAiRW1wdHlUYWciOiA1LAogICAgIkNvbW1lbnQiOiA2LAogICAgIlBhcnNlRXJyb3IiOiA3Cn0KCnRhZ1Rva2VuVHlwZXMgPSBmcm96ZW5zZXQoW3Rva2VuVHlwZXNbIlN0YXJ0VGFnIl0sIHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblR5cGVzWyJFbXB0eVRhZyJdXSkKCgpwcmVmaXhlcyA9IGRpY3QoWyh2LCBrKSBmb3IgaywgdiBpbiBuYW1lc3BhY2VzLml0ZW1zKCldKQpwcmVmaXhlc1siaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCJdID0gIm1hdGgiCgoKY2xhc3MgRGF0YUxvc3NXYXJuaW5nKFVzZXJXYXJuaW5nKToKICAgIHBhc3MKCgpjbGFzcyBSZXBhcnNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICBwYXNzClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAARQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAbtB8gG0CAABtAgAAUwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9hbHBoYWJldGljYWxhdHRyaWJ1dGVzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4gaW1wb3J0IGJhc2UKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gb3JkZXJlZGRpY3QgaW1wb3J0IE9yZGVyZWREaWN0CgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBmb3IgdG9rZW4gaW4gYmFzZS5GaWx0ZXIuX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIGlmIHRva2VuWyJ0eXBlIl0gaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgYXR0cnMgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc29ydGVkKHRva2VuWyJkYXRhIl0uaXRlbXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PWxhbWJkYSB4OiB4WzBdKToKICAgICAgICAgICAgICAgICAgICBhdHRyc1tuYW1lXSA9IHZhbHVlCiAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gYXR0cnMKICAgICAgICAgICAgeWllbGQgdG9rZW4KUEsDBBQAAAAAAAAAIQAigPvEHgEAAB4BAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2Jhc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCgpjbGFzcyBGaWx0ZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UpOgogICAgICAgIHNlbGYuc291cmNlID0gc291cmNlCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuc291cmNlKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnNvdXJjZSwgbmFtZSkKUEsDBBQAAAAAAAAAIQAhwDyMtgoAALYKAABQAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2luamVjdF9tZXRhX2NoYXJzZXQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLiBpbXBvcnQgYmFzZQoKCmNsYXNzIEZpbHRlcihiYXNlLkZpbHRlcik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCBlbmNvZGluZyk6CiAgICAgICAgYmFzZS5GaWx0ZXIuX19pbml0X18oc2VsZiwgc291cmNlKQogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZwoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBzdGF0ZSA9ICJwcmVfaGVhZCIKICAgICAgICBtZXRhX2ZvdW5kID0gKHNlbGYuZW5jb2RpbmcgaXMgTm9uZSkKICAgICAgICBwZW5kaW5nID0gW10KCiAgICAgICAgZm9yIHRva2VuIGluIGJhc2UuRmlsdGVyLl9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdLmxvd2VyKCkgPT0gImhlYWQiOgogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gImluX2hlYWQiCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVtcHR5VGFnIjoKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSAibWV0YSI6CiAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlIGNoYXJzZXQgd2l0aCBhY3R1YWwgZW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICBoYXNfaHR0cF9lcXVpdl9jb250ZW50X3R5cGUgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGZvciAobmFtZXNwYWNlLCBuYW1lKSwgdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBuYW1lc3BhY2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5hbWUubG93ZXIoKSA9PSAnY2hhcnNldCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdWyhuYW1lc3BhY2UsIG5hbWUpXSA9IHNlbGYuZW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5hbWUgPT0gJ2h0dHAtZXF1aXYnIGFuZCB2YWx1ZS5sb3dlcigpID09ICdjb250ZW50LXR5cGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2h0dHBfZXF1aXZfY29udGVudF90eXBlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc19odHRwX2VxdWl2X2NvbnRlbnRfdHlwZSBhbmQgKE5vbmUsICJjb250ZW50IikgaW4gdG9rZW5bImRhdGEiXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl1bKE5vbmUsICJjb250ZW50IildID0gJ3RleHQvaHRtbDsgY2hhcnNldD0lcycgJSBzZWxmLmVuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2ZvdW5kID0gVHJ1ZQoKICAgICAgICAgICAgICAgIGVsaWYgdG9rZW5bIm5hbWUiXS5sb3dlcigpID09ICJoZWFkIiBhbmQgbm90IG1ldGFfZm91bmQ6CiAgICAgICAgICAgICAgICAgICAgIyBpbnNlcnQgbWV0YSBpbnRvIGVtcHR5IGhlYWQKICAgICAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiU3RhcnRUYWciLCAibmFtZSI6ICJoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiB0b2tlblsiZGF0YSJdfQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJFbXB0eVRhZyIsICJuYW1lIjogIm1ldGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsoTm9uZSwgImNoYXJzZXQiKTogc2VsZi5lbmNvZGluZ319CiAgICAgICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIkVuZFRhZyIsICJuYW1lIjogImhlYWQifQogICAgICAgICAgICAgICAgICAgIG1ldGFfZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSAiaGVhZCIgYW5kIHBlbmRpbmc6CiAgICAgICAgICAgICAgICAgICAgIyBpbnNlcnQgbWV0YSBpbnRvIGhlYWQgKGlmIG5lY2Vzc2FyeSkgYW5kIGZsdXNoIHBlbmRpbmcgcXVldWUKICAgICAgICAgICAgICAgICAgICB5aWVsZCBwZW5kaW5nLnBvcCgwKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtZXRhX2ZvdW5kOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiRW1wdHlUYWciLCAibmFtZSI6ICJtZXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogeyhOb25lLCAiY2hhcnNldCIpOiBzZWxmLmVuY29kaW5nfX0KICAgICAgICAgICAgICAgICAgICB3aGlsZSBwZW5kaW5nOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBwZW5kaW5nLnBvcCgwKQogICAgICAgICAgICAgICAgICAgIG1ldGFfZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAicG9zdF9oZWFkIgoKICAgICAgICAgICAgaWYgc3RhdGUgPT0gImluX2hlYWQiOgogICAgICAgICAgICAgICAgcGVuZGluZy5hcHBlbmQodG9rZW4pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgpQSwMEFAAAAAAAAAAhAH3r0rUlDQAAJQ0AAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvbGludC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMsIHZvaWRFbGVtZW50cwoKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgc3BhY2VDaGFyYWN0ZXJzCnNwYWNlQ2hhcmFjdGVycyA9ICIiLmpvaW4oc3BhY2VDaGFyYWN0ZXJzKQoKCmNsYXNzIEZpbHRlcihiYXNlLkZpbHRlcik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCByZXF1aXJlX21hdGNoaW5nX3RhZ3M9VHJ1ZSk6CiAgICAgICAgc3VwZXIoRmlsdGVyLCBzZWxmKS5fX2luaXRfXyhzb3VyY2UpCiAgICAgICAgc2VsZi5yZXF1aXJlX21hdGNoaW5nX3RhZ3MgPSByZXF1aXJlX21hdGNoaW5nX3RhZ3MKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgb3Blbl9lbGVtZW50cyA9IFtdCiAgICAgICAgZm9yIHRva2VuIGluIGJhc2UuRmlsdGVyLl9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHRva2VuWyJuYW1lc3BhY2UiXQogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lc3BhY2UgaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWVzcGFjZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSAhPSAiIgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gIiIKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRva2VuWyJkYXRhIl0sIGRpY3QpCiAgICAgICAgICAgICAgICBpZiAobm90IG5hbWVzcGFjZSBvciBuYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1siaHRtbCJdKSBhbmQgbmFtZSBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUgPT0gIkVtcHR5VGFnIgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSA9PSAiU3RhcnRUYWciCiAgICAgICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyIgYW5kIHNlbGYucmVxdWlyZV9tYXRjaGluZ190YWdzOgogICAgICAgICAgICAgICAgICAgIG9wZW5fZWxlbWVudHMuYXBwZW5kKChuYW1lc3BhY2UsIG5hbWUpKQogICAgICAgICAgICAgICAgZm9yIChuYW1lc3BhY2UsIG5hbWUpLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZXNwYWNlLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSAhPSAiIgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSAiIgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHZhbHVlLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSB0b2tlblsibmFtZXNwYWNlIl0KICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lc3BhY2UsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lc3BhY2UgIT0gIiIKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lICE9ICIiCiAgICAgICAgICAgICAgICBpZiAobm90IG5hbWVzcGFjZSBvciBuYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1siaHRtbCJdKSBhbmQgbmFtZSBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiVm9pZCBlbGVtZW50IHJlcG9ydGVkIGFzIEVuZFRhZyB0b2tlbjogJSh0YWcpcyIgJSB7InRhZyI6IG5hbWV9CiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucmVxdWlyZV9tYXRjaGluZ190YWdzOgogICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gb3Blbl9lbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIGFzc2VydCBzdGFydCA9PSAobmFtZXNwYWNlLCBuYW1lKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgICAgIGRhdGEgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkYXRhLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgaW4gKCJDaGFyYWN0ZXJzIiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICAgICAgZGF0YSA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRhdGEsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCBkYXRhICE9ICIiCiAgICAgICAgICAgICAgICBpZiB0eXBlID09ICJTcGFjZUNoYXJhY3RlcnMiOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBkYXRhLnN0cmlwKHNwYWNlQ2hhcmFjdGVycykgPT0gIiIKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRG9jdHlwZSI6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUgaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCB0b2tlblsicHVibGljSWQiXSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IHRva2VuWyJzeXN0ZW1JZCJdIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVudGl0eSI6CiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0b2tlblsibmFtZSJdLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIlNlcmlhbGl6ZXJFcnJvciI6CiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0b2tlblsiZGF0YSJdLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiVW5rbm93biB0b2tlbiB0eXBlOiAlKHR5cGUpcyIgJSB7InR5cGUiOiB0eXBlfQoKICAgICAgICAgICAgeWllbGQgdG9rZW4KUEsDBBQAAAAAAAAAIQAh7Z0kJikAACYpAABJAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL29wdGlvbmFsdGFncy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuIGltcG9ydCBiYXNlCgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgIGRlZiBzbGlkZXIoc2VsZik6CiAgICAgICAgcHJldmlvdXMxID0gcHJldmlvdXMyID0gTm9uZQogICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnNvdXJjZToKICAgICAgICAgICAgaWYgcHJldmlvdXMxIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgeWllbGQgcHJldmlvdXMyLCBwcmV2aW91czEsIHRva2VuCiAgICAgICAgICAgIHByZXZpb3VzMiA9IHByZXZpb3VzMQogICAgICAgICAgICBwcmV2aW91czEgPSB0b2tlbgogICAgICAgIGlmIHByZXZpb3VzMSBpcyBub3QgTm9uZToKICAgICAgICAgICAgeWllbGQgcHJldmlvdXMyLCBwcmV2aW91czEsIE5vbmUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgZm9yIHByZXZpb3VzLCB0b2tlbiwgbmV4dCBpbiBzZWxmLnNsaWRlcigpOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICBpZiAodG9rZW5bImRhdGEiXSBvcgogICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi5pc19vcHRpb25hbF9zdGFydCh0b2tlblsibmFtZSJdLCBwcmV2aW91cywgbmV4dCkpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX29wdGlvbmFsX2VuZCh0b2tlblsibmFtZSJdLCBuZXh0KToKICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KCiAgICBkZWYgaXNfb3B0aW9uYWxfc3RhcnQoc2VsZiwgdGFnbmFtZSwgcHJldmlvdXMsIG5leHQpOgogICAgICAgIHR5cGUgPSBuZXh0IGFuZCBuZXh0WyJ0eXBlIl0gb3IgTm9uZQogICAgICAgIGlmIHRhZ25hbWUgaW4gJ2h0bWwnOgogICAgICAgICAgICAjIEFuIGh0bWwgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIGh0bWwgZWxlbWVudCBpcyBub3QgYSBzcGFjZSBjaGFyYWN0ZXIgb3IgYSBjb21tZW50LgogICAgICAgICAgICByZXR1cm4gdHlwZSBub3QgaW4gKCJDb21tZW50IiwgIlNwYWNlQ2hhcmFjdGVycyIpCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdoZWFkJzoKICAgICAgICAgICAgIyBBIGhlYWQgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIGhlYWQgZWxlbWVudCBpcyBhbiBlbGVtZW50LgogICAgICAgICAgICAjIFhYWDogd2UgYWxzbyBvbWl0IHRoZSBzdGFydCB0YWcgaWYgdGhlIGhlYWQgZWxlbWVudCBpcyBlbXB0eQogICAgICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gPT0gImhlYWQiCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdib2R5JzoKICAgICAgICAgICAgIyBBIGJvZHkgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIGJvZHkgZWxlbWVudCBpcyBub3QgYSBzcGFjZSBjaGFyYWN0ZXIgb3IgYSBjb21tZW50LAogICAgICAgICAgICAjIGV4Y2VwdCBpZiB0aGUgZmlyc3QgdGhpbmcgaW5zaWRlIHRoZSBib2R5IGVsZW1lbnQgaXMgYSBzY3JpcHQKICAgICAgICAgICAgIyBvciBzdHlsZSBlbGVtZW50IGFuZCB0aGUgbm9kZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGJvZHkKICAgICAgICAgICAgIyBlbGVtZW50IGlzIGEgaGVhZCBlbGVtZW50IHdob3NlIGVuZCB0YWcgaGFzIGJlZW4gb21pdHRlZC4KICAgICAgICAgICAgaWYgdHlwZSBpbiAoIkNvbW1lbnQiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICAjIFhYWDogd2UgZG8gbm90IGxvb2sgYXQgdGhlIHByZWNlZGluZyBldmVudCwgc28gd2UgbmV2ZXIgb21pdAogICAgICAgICAgICAgICAgIyB0aGUgYm9keSBlbGVtZW50J3Mgc3RhcnQgdGFnIGlmIGl0J3MgZm9sbG93ZWQgYnkgYSBzY3JpcHQgb3IKICAgICAgICAgICAgICAgICMgYSBzdHlsZSBlbGVtZW50LgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBub3QgaW4gKCdzY3JpcHQnLCAnc3R5bGUnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ2NvbGdyb3VwJzoKICAgICAgICAgICAgIyBBIGNvbGdyb3VwIGVsZW1lbnQncyBzdGFydCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGZpcnN0IHRoaW5nCiAgICAgICAgICAgICMgaW5zaWRlIHRoZSBjb2xncm91cCBlbGVtZW50IGlzIGEgY29sIGVsZW1lbnQsIGFuZCBpZiB0aGUgZWxlbWVudAogICAgICAgICAgICAjIGlzIG5vdCBpbW1lZGlhdGVseSBwcmVjZWRlZCBieSBhbm90aGVyIGNvbGdyb3VwIGVsZW1lbnQgd2hvc2UKICAgICAgICAgICAgIyBlbmQgdGFnIGhhcyBiZWVuIG9taXR0ZWQuCiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgIyBYWFg6IHdlIGRvIG5vdCBsb29rIGF0IHRoZSBwcmVjZWRpbmcgZXZlbnQsIHNvIGluc3RlYWQgd2UgbmV2ZXIKICAgICAgICAgICAgICAgICMgb21pdCB0aGUgY29sZ3JvdXAgZWxlbWVudCdzIGVuZCB0YWcgd2hlbiBpdCBpcyBpbW1lZGlhdGVseQogICAgICAgICAgICAgICAgIyBmb2xsb3dlZCBieSBhbm90aGVyIGNvbGdyb3VwIGVsZW1lbnQuIFNlZSBpc19vcHRpb25hbF9lbmQuCiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdID09ICJjb2wiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ3Rib2R5JzoKICAgICAgICAgICAgIyBBIHRib2R5IGVsZW1lbnQncyBzdGFydCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGZpcnN0IHRoaW5nCiAgICAgICAgICAgICMgaW5zaWRlIHRoZSB0Ym9keSBlbGVtZW50IGlzIGEgdHIgZWxlbWVudCwgYW5kIGlmIHRoZSBlbGVtZW50IGlzCiAgICAgICAgICAgICMgbm90IGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgdGJvZHksIHRoZWFkLCBvciB0Zm9vdCBlbGVtZW50CiAgICAgICAgICAgICMgd2hvc2UgZW5kIHRhZyBoYXMgYmVlbiBvbWl0dGVkLgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICAjIG9taXQgdGhlIHRoZWFkIGFuZCB0Zm9vdCBlbGVtZW50cycgZW5kIHRhZyB3aGVuIHRoZXkgYXJlCiAgICAgICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGJvZHkgZWxlbWVudC4gU2VlIGlzX29wdGlvbmFsX2VuZC4KICAgICAgICAgICAgICAgIGlmIHByZXZpb3VzIGFuZCBwcmV2aW91c1sndHlwZSddID09ICdFbmRUYWcnIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzWyduYW1lJ10gaW4gKCd0Ym9keScsICd0aGVhZCcsICd0Zm9vdCcpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSA9PSAndHInCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgaXNfb3B0aW9uYWxfZW5kKHNlbGYsIHRhZ25hbWUsIG5leHQpOgogICAgICAgIHR5cGUgPSBuZXh0IGFuZCBuZXh0WyJ0eXBlIl0gb3IgTm9uZQogICAgICAgIGlmIHRhZ25hbWUgaW4gKCdodG1sJywgJ2hlYWQnLCAnYm9keScpOgogICAgICAgICAgICAjIEFuIGh0bWwgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGh0bWwgZWxlbWVudAogICAgICAgICAgICAjIGlzIG5vdCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHNwYWNlIGNoYXJhY3RlciBvciBhIGNvbW1lbnQuCiAgICAgICAgICAgIHJldHVybiB0eXBlIG5vdCBpbiAoIkNvbW1lbnQiLCAiU3BhY2VDaGFyYWN0ZXJzIikKICAgICAgICBlbGlmIHRhZ25hbWUgaW4gKCdsaScsICdvcHRncm91cCcsICd0cicpOgogICAgICAgICAgICAjIEEgbGkgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGxpIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIGxpIGVsZW1lbnQgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIEFuIG9wdGdyb3VwIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBvcHRncm91cAogICAgICAgICAgICAjIGVsZW1lbnQgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBvcHRncm91cCBlbGVtZW50LAogICAgICAgICAgICAjIG9yIGlmIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgQSB0ciBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdHIgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgdHIgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdID09IHRhZ25hbWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIGVsaWYgdGFnbmFtZSBpbiAoJ2R0JywgJ2RkJyk6CiAgICAgICAgICAgICMgQSBkdCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZHQgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgZHQgZWxlbWVudCBvciBhIGRkIGVsZW1lbnQuCiAgICAgICAgICAgICMgQSBkZCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZGQgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgZGQgZWxlbWVudCBvciBhIGR0IGVsZW1lbnQsCiAgICAgICAgICAgICMgb3IgaWYgdGhlcmUgaXMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ2R0JywgJ2RkJykKICAgICAgICAgICAgZWxpZiB0YWduYW1lID09ICdkZCc6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAncCc6CiAgICAgICAgICAgICMgQSBwIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBwIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbiBhZGRyZXNzLCBhcnRpY2xlLCBhc2lkZSwKICAgICAgICAgICAgIyBibG9ja3F1b3RlLCBkYXRhZ3JpZCwgZGlhbG9nLCBkaXIsIGRpdiwgZGwsIGZpZWxkc2V0LAogICAgICAgICAgICAjIGZvb3RlciwgZm9ybSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaGVhZGVyLCBociwgbWVudSwKICAgICAgICAgICAgIyBuYXYsIG9sLCBwLCBwcmUsIHNlY3Rpb24sIHRhYmxlLCBvciB1bCwgZWxlbWVudCwgb3IgaWYKICAgICAgICAgICAgIyB0aGVyZSBpcyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gaW4gKCdhZGRyZXNzJywgJ2FydGljbGUnLCAnYXNpZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jsb2NrcXVvdGUnLCAnZGF0YWdyaWQnLCAnZGlhbG9nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXInLCAnZGl2JywgJ2RsJywgJ2ZpZWxkc2V0JywgJ2Zvb3RlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9ybScsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVhZGVyJywgJ2hyJywgJ21lbnUnLCAnbmF2JywgJ29sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJywgJ3ByZScsICdzZWN0aW9uJywgJ3RhYmxlJywgJ3VsJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAnb3B0aW9uJzoKICAgICAgICAgICAgIyBBbiBvcHRpb24gZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIG9wdGlvbgogICAgICAgICAgICAjIGVsZW1lbnQgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBvcHRpb24gZWxlbWVudCwKICAgICAgICAgICAgIyBvciBpZiBpdCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbiA8Y29kZT5vcHRncm91cDwvY29kZT4KICAgICAgICAgICAgIyBlbGVtZW50LCBvciBpZiB0aGVyZSBpcyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudAogICAgICAgICAgICAjIGVsZW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gaW4gKCdvcHRpb24nLCAnb3B0Z3JvdXAnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lIGluICgncnQnLCAncnAnKToKICAgICAgICAgICAgIyBBbiBydCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgcnQgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIHJ0IG9yIHJwIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzCiAgICAgICAgICAgICMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBBbiBycCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgcnAgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIHJ0IG9yIHJwIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzCiAgICAgICAgICAgICMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ3J0JywgJ3JwJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAnY29sZ3JvdXAnOgogICAgICAgICAgICAjIEEgY29sZ3JvdXAgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGNvbGdyb3VwCiAgICAgICAgICAgICMgZWxlbWVudCBpcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBzcGFjZSBjaGFyYWN0ZXIgb3IKICAgICAgICAgICAgIyBhIGNvbW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJDb21tZW50IiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgIyBYWFg6IHdlIGFsc28gbG9vayBmb3IgYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNvbGdyb3VwCiAgICAgICAgICAgICAgICAjIGVsZW1lbnQuIFNlZSBpc19vcHRpb25hbF9zdGFydC4KICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gIT0gJ2NvbGdyb3VwJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIHRhZ25hbWUgaW4gKCd0aGVhZCcsICd0Ym9keScpOgogICAgICAgICAgICAjIEEgdGhlYWQgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRoZWFkIGVsZW1lbnQKICAgICAgICAgICAgIyBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRib2R5IG9yIHRmb290IGVsZW1lbnQuCiAgICAgICAgICAgICMgQSB0Ym9keSBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGJvZHkgZWxlbWVudAogICAgICAgICAgICAjIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGJvZHkgb3IgdGZvb3QgZWxlbWVudCwgb3IgaWYKICAgICAgICAgICAgIyB0aGVyZSBpcyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIEEgdGZvb3QgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRmb290IGVsZW1lbnQKICAgICAgICAgICAgIyBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRib2R5IGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzIG5vCiAgICAgICAgICAgICMgbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBYWFg6IHdlIG5ldmVyIG9taXQgdGhlIGVuZCB0YWcgd2hlbiB0aGUgZm9sbG93aW5nIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBhIHRib2R5LiBTZWUgaXNfb3B0aW9uYWxfc3RhcnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gaW4gWyd0Ym9keScsICd0Zm9vdCddCiAgICAgICAgICAgIGVsaWYgdGFnbmFtZSA9PSAndGJvZHknOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ3Rmb290JzoKICAgICAgICAgICAgIyBBIHRmb290IGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0Zm9vdCBlbGVtZW50CiAgICAgICAgICAgICMgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0Ym9keSBlbGVtZW50LCBvciBpZiB0aGVyZSBpcyBubwogICAgICAgICAgICAjIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgWFhYOiB3ZSBuZXZlciBvbWl0IHRoZSBlbmQgdGFnIHdoZW4gdGhlIGZvbGxvd2luZyBlbGVtZW50IGlzCiAgICAgICAgICAgICMgYSB0Ym9keS4gU2VlIGlzX29wdGlvbmFsX3N0YXJ0LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdID09ICd0Ym9keScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIGVsaWYgdGFnbmFtZSBpbiAoJ3RkJywgJ3RoJyk6CiAgICAgICAgICAgICMgQSB0ZCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGQgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGQgb3IgdGggZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIEEgdGggZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRoIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRkIG9yIHRoIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzCiAgICAgICAgICAgICMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ3RkJywgJ3RoJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIHJldHVybiBGYWxzZQpQSwMEFAAAAAAAAAAhAJoeVJgYYgAAGGIAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvc2FuaXRpemVyLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgcmUKZnJvbSB4bWwuc2F4LnNheHV0aWxzIGltcG9ydCBlc2NhcGUsIHVuZXNjYXBlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliX3BhcnNlIGFzIHVybHBhcnNlCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgbmFtZXNwYWNlcywgcHJlZml4ZXMKCl9fYWxsX18gPSBbIkZpbHRlciJdCgoKYWxsb3dlZF9lbGVtZW50cyA9IGZyb3plbnNldCgoCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2FiYnInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhY3JvbnltJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYWRkcmVzcycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2FyZWEnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhcnRpY2xlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYXNpZGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhdWRpbycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2InKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdiaWcnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdibG9ja3F1b3RlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYnInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdidXR0b24nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjYW52YXMnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjYXB0aW9uJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY2VudGVyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY2l0ZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NvZGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjb2wnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjb2xncm91cCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NvbW1hbmQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkYXRhZ3JpZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RhdGFsaXN0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkZWwnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkZXRhaWxzJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGZuJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGlhbG9nJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGlyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGl2JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGwnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkdCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2VtJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZXZlbnQtc291cmNlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZmllbGRzZXQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmaWdjYXB0aW9uJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZmlndXJlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZm9vdGVyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZm9udCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2Zvcm0nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoZWFkZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoMScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2gyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDMnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoNCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2g1JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDYnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdocicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2knKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdpbWcnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdpbnB1dCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2lucycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2tleWdlbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2tiZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2xhYmVsJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbGVnZW5kJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbGknKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdtJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbWFwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbWVudScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ21ldGVyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbXVsdGljb2wnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICduYXYnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICduZXh0aWQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdvbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ291dHB1dCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ29wdGdyb3VwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnb3B0aW9uJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3ByZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3Byb2dyZXNzJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3MnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzYW1wJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc2VjdGlvbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NlbGVjdCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NtYWxsJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc291bmQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzb3VyY2UnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzcGFjZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzcGFuJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3RyaWtlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3Ryb25nJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3ViJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3VwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGFibGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0Ym9keScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGV4dGFyZWEnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0aW1lJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGZvb3QnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0aCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RoZWFkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndHInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0dCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3UnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd1bCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3ZhcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3ZpZGVvJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtYWN0aW9uJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtYXRoJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtZXJyb3InKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21mcmFjJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtaScpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbW11bHRpc2NyaXB0cycpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbW4nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21vJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtb3ZlcicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXBhZGRlZCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXBoYW50b20nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21wcmVzY3JpcHRzJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtcm9vdCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXJvdycpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXNwYWNlJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3FydCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXN0eWxlJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3ViJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3Vic3VwJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3VwJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdGFibGUnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ210ZCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXRleHQnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ210cicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXVuZGVyJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdW5kZXJvdmVyJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdub25lJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdhJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdhbmltYXRlJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdhbmltYXRlQ29sb3InKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2FuaW1hdGVNb3Rpb24nKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2FuaW1hdGVUcmFuc2Zvcm0nKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2NsaXBQYXRoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdjaXJjbGUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2RlZnMnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2Rlc2MnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2VsbGlwc2UnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2ZvbnQtZmFjZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZm9udC1mYWNlLW5hbWUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2ZvbnQtZmFjZS1zcmMnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2cnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2dseXBoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdoa2VybicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbGluZWFyR3JhZGllbnQnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2xpbmUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ21hcmtlcicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbWV0YWRhdGEnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ21pc3NpbmctZ2x5cGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ21wYXRoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdwYXRoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdwb2x5Z29uJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdwb2x5bGluZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAncmFkaWFsR3JhZGllbnQnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3JlY3QnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3NldCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnc3RvcCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnc3ZnJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdzd2l0Y2gnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3RleHQnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3RpdGxlJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICd0c3BhbicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAndXNlJyksCikpCgphbGxvd2VkX2F0dHJpYnV0ZXMgPSBmcm96ZW5zZXQoKAogICAgIyBIVE1MIGF0dHJpYnV0ZXMKICAgIChOb25lLCAnYWJicicpLAogICAgKE5vbmUsICdhY2NlcHQnKSwKICAgIChOb25lLCAnYWNjZXB0LWNoYXJzZXQnKSwKICAgIChOb25lLCAnYWNjZXNza2V5JyksCiAgICAoTm9uZSwgJ2FjdGlvbicpLAogICAgKE5vbmUsICdhbGlnbicpLAogICAgKE5vbmUsICdhbHQnKSwKICAgIChOb25lLCAnYXV0b2NvbXBsZXRlJyksCiAgICAoTm9uZSwgJ2F1dG9mb2N1cycpLAogICAgKE5vbmUsICdheGlzJyksCiAgICAoTm9uZSwgJ2JhY2tncm91bmQnKSwKICAgIChOb25lLCAnYmFsYW5jZScpLAogICAgKE5vbmUsICdiZ2NvbG9yJyksCiAgICAoTm9uZSwgJ2JncHJvcGVydGllcycpLAogICAgKE5vbmUsICdib3JkZXInKSwKICAgIChOb25lLCAnYm9yZGVyY29sb3InKSwKICAgIChOb25lLCAnYm9yZGVyY29sb3JkYXJrJyksCiAgICAoTm9uZSwgJ2JvcmRlcmNvbG9ybGlnaHQnKSwKICAgIChOb25lLCAnYm90dG9tcGFkZGluZycpLAogICAgKE5vbmUsICdjZWxscGFkZGluZycpLAogICAgKE5vbmUsICdjZWxsc3BhY2luZycpLAogICAgKE5vbmUsICdjaCcpLAogICAgKE5vbmUsICdjaGFsbGVuZ2UnKSwKICAgIChOb25lLCAnY2hhcicpLAogICAgKE5vbmUsICdjaGFyb2ZmJyksCiAgICAoTm9uZSwgJ2Nob2ZmJyksCiAgICAoTm9uZSwgJ2NoYXJzZXQnKSwKICAgIChOb25lLCAnY2hlY2tlZCcpLAogICAgKE5vbmUsICdjaXRlJyksCiAgICAoTm9uZSwgJ2NsYXNzJyksCiAgICAoTm9uZSwgJ2NsZWFyJyksCiAgICAoTm9uZSwgJ2NvbG9yJyksCiAgICAoTm9uZSwgJ2NvbHMnKSwKICAgIChOb25lLCAnY29sc3BhbicpLAogICAgKE5vbmUsICdjb21wYWN0JyksCiAgICAoTm9uZSwgJ2NvbnRlbnRlZGl0YWJsZScpLAogICAgKE5vbmUsICdjb250cm9scycpLAogICAgKE5vbmUsICdjb29yZHMnKSwKICAgIChOb25lLCAnZGF0YScpLAogICAgKE5vbmUsICdkYXRhZmxkJyksCiAgICAoTm9uZSwgJ2RhdGFwYWdlc2l6ZScpLAogICAgKE5vbmUsICdkYXRhc3JjJyksCiAgICAoTm9uZSwgJ2RhdGV0aW1lJyksCiAgICAoTm9uZSwgJ2RlZmF1bHQnKSwKICAgIChOb25lLCAnZGVsYXknKSwKICAgIChOb25lLCAnZGlyJyksCiAgICAoTm9uZSwgJ2Rpc2FibGVkJyksCiAgICAoTm9uZSwgJ2RyYWdnYWJsZScpLAogICAgKE5vbmUsICdkeW5zcmMnKSwKICAgIChOb25lLCAnZW5jdHlwZScpLAogICAgKE5vbmUsICdlbmQnKSwKICAgIChOb25lLCAnZmFjZScpLAogICAgKE5vbmUsICdmb3InKSwKICAgIChOb25lLCAnZm9ybScpLAogICAgKE5vbmUsICdmcmFtZScpLAogICAgKE5vbmUsICdnYWxsZXJ5aW1nJyksCiAgICAoTm9uZSwgJ2d1dHRlcicpLAogICAgKE5vbmUsICdoZWFkZXJzJyksCiAgICAoTm9uZSwgJ2hlaWdodCcpLAogICAgKE5vbmUsICdoaWRlZm9jdXMnKSwKICAgIChOb25lLCAnaGlkZGVuJyksCiAgICAoTm9uZSwgJ2hpZ2gnKSwKICAgIChOb25lLCAnaHJlZicpLAogICAgKE5vbmUsICdocmVmbGFuZycpLAogICAgKE5vbmUsICdoc3BhY2UnKSwKICAgIChOb25lLCAnaWNvbicpLAogICAgKE5vbmUsICdpZCcpLAogICAgKE5vbmUsICdpbnB1dG1vZGUnKSwKICAgIChOb25lLCAnaXNtYXAnKSwKICAgIChOb25lLCAna2V5dHlwZScpLAogICAgKE5vbmUsICdsYWJlbCcpLAogICAgKE5vbmUsICdsZWZ0c3BhY2luZycpLAogICAgKE5vbmUsICdsYW5nJyksCiAgICAoTm9uZSwgJ2xpc3QnKSwKICAgIChOb25lLCAnbG9uZ2Rlc2MnKSwKICAgIChOb25lLCAnbG9vcCcpLAogICAgKE5vbmUsICdsb29wY291bnQnKSwKICAgIChOb25lLCAnbG9vcGVuZCcpLAogICAgKE5vbmUsICdsb29wc3RhcnQnKSwKICAgIChOb25lLCAnbG93JyksCiAgICAoTm9uZSwgJ2xvd3NyYycpLAogICAgKE5vbmUsICdtYXgnKSwKICAgIChOb25lLCAnbWF4bGVuZ3RoJyksCiAgICAoTm9uZSwgJ21lZGlhJyksCiAgICAoTm9uZSwgJ21ldGhvZCcpLAogICAgKE5vbmUsICdtaW4nKSwKICAgIChOb25lLCAnbXVsdGlwbGUnKSwKICAgIChOb25lLCAnbmFtZScpLAogICAgKE5vbmUsICdub2hyZWYnKSwKICAgIChOb25lLCAnbm9zaGFkZScpLAogICAgKE5vbmUsICdub3dyYXAnKSwKICAgIChOb25lLCAnb3BlbicpLAogICAgKE5vbmUsICdvcHRpbXVtJyksCiAgICAoTm9uZSwgJ3BhdHRlcm4nKSwKICAgIChOb25lLCAncGluZycpLAogICAgKE5vbmUsICdwb2ludC1zaXplJyksCiAgICAoTm9uZSwgJ3Bvc3RlcicpLAogICAgKE5vbmUsICdwcWcnKSwKICAgIChOb25lLCAncHJlbG9hZCcpLAogICAgKE5vbmUsICdwcm9tcHQnKSwKICAgIChOb25lLCAncmFkaW9ncm91cCcpLAogICAgKE5vbmUsICdyZWFkb25seScpLAogICAgKE5vbmUsICdyZWwnKSwKICAgIChOb25lLCAncmVwZWF0LW1heCcpLAogICAgKE5vbmUsICdyZXBlYXQtbWluJyksCiAgICAoTm9uZSwgJ3JlcGxhY2UnKSwKICAgIChOb25lLCAncmVxdWlyZWQnKSwKICAgIChOb25lLCAncmV2JyksCiAgICAoTm9uZSwgJ3JpZ2h0c3BhY2luZycpLAogICAgKE5vbmUsICdyb3dzJyksCiAgICAoTm9uZSwgJ3Jvd3NwYW4nKSwKICAgIChOb25lLCAncnVsZXMnKSwKICAgIChOb25lLCAnc2NvcGUnKSwKICAgIChOb25lLCAnc2VsZWN0ZWQnKSwKICAgIChOb25lLCAnc2hhcGUnKSwKICAgIChOb25lLCAnc2l6ZScpLAogICAgKE5vbmUsICdzcGFuJyksCiAgICAoTm9uZSwgJ3NyYycpLAogICAgKE5vbmUsICdzdGFydCcpLAogICAgKE5vbmUsICdzdGVwJyksCiAgICAoTm9uZSwgJ3N0eWxlJyksCiAgICAoTm9uZSwgJ3N1bW1hcnknKSwKICAgIChOb25lLCAnc3VwcHJlc3MnKSwKICAgIChOb25lLCAndGFiaW5kZXgnKSwKICAgIChOb25lLCAndGFyZ2V0JyksCiAgICAoTm9uZSwgJ3RlbXBsYXRlJyksCiAgICAoTm9uZSwgJ3RpdGxlJyksCiAgICAoTm9uZSwgJ3RvcHBhZGRpbmcnKSwKICAgIChOb25lLCAndHlwZScpLAogICAgKE5vbmUsICd1bnNlbGVjdGFibGUnKSwKICAgIChOb25lLCAndXNlbWFwJyksCiAgICAoTm9uZSwgJ3VybicpLAogICAgKE5vbmUsICd2YWxpZ24nKSwKICAgIChOb25lLCAndmFsdWUnKSwKICAgIChOb25lLCAndmFyaWFibGUnKSwKICAgIChOb25lLCAndm9sdW1lJyksCiAgICAoTm9uZSwgJ3ZzcGFjZScpLAogICAgKE5vbmUsICd2cm1sJyksCiAgICAoTm9uZSwgJ3dpZHRoJyksCiAgICAoTm9uZSwgJ3dyYXAnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ2xhbmcnKSwKICAgICMgTWF0aE1MIGF0dHJpYnV0ZXMKICAgIChOb25lLCAnYWN0aW9udHlwZScpLAogICAgKE5vbmUsICdhbGlnbicpLAogICAgKE5vbmUsICdjb2x1bW5hbGlnbicpLAogICAgKE5vbmUsICdjb2x1bW5hbGlnbicpLAogICAgKE5vbmUsICdjb2x1bW5hbGlnbicpLAogICAgKE5vbmUsICdjb2x1bW5saW5lcycpLAogICAgKE5vbmUsICdjb2x1bW5zcGFjaW5nJyksCiAgICAoTm9uZSwgJ2NvbHVtbnNwYW4nKSwKICAgIChOb25lLCAnZGVwdGgnKSwKICAgIChOb25lLCAnZGlzcGxheScpLAogICAgKE5vbmUsICdkaXNwbGF5c3R5bGUnKSwKICAgIChOb25lLCAnZXF1YWxjb2x1bW5zJyksCiAgICAoTm9uZSwgJ2VxdWFscm93cycpLAogICAgKE5vbmUsICdmZW5jZScpLAogICAgKE5vbmUsICdmb250c3R5bGUnKSwKICAgIChOb25lLCAnZm9udHdlaWdodCcpLAogICAgKE5vbmUsICdmcmFtZScpLAogICAgKE5vbmUsICdoZWlnaHQnKSwKICAgIChOb25lLCAnbGluZXRoaWNrbmVzcycpLAogICAgKE5vbmUsICdsc3BhY2UnKSwKICAgIChOb25lLCAnbWF0aGJhY2tncm91bmQnKSwKICAgIChOb25lLCAnbWF0aGNvbG9yJyksCiAgICAoTm9uZSwgJ21hdGh2YXJpYW50JyksCiAgICAoTm9uZSwgJ21hdGh2YXJpYW50JyksCiAgICAoTm9uZSwgJ21heHNpemUnKSwKICAgIChOb25lLCAnbWluc2l6ZScpLAogICAgKE5vbmUsICdvdGhlcicpLAogICAgKE5vbmUsICdyb3dhbGlnbicpLAogICAgKE5vbmUsICdyb3dhbGlnbicpLAogICAgKE5vbmUsICdyb3dhbGlnbicpLAogICAgKE5vbmUsICdyb3dsaW5lcycpLAogICAgKE5vbmUsICdyb3dzcGFjaW5nJyksCiAgICAoTm9uZSwgJ3Jvd3NwYW4nKSwKICAgIChOb25lLCAncnNwYWNlJyksCiAgICAoTm9uZSwgJ3NjcmlwdGxldmVsJyksCiAgICAoTm9uZSwgJ3NlbGVjdGlvbicpLAogICAgKE5vbmUsICdzZXBhcmF0b3InKSwKICAgIChOb25lLCAnc3RyZXRjaHknKSwKICAgIChOb25lLCAnd2lkdGgnKSwKICAgIChOb25lLCAnd2lkdGgnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdzaG93JyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3R5cGUnKSwKICAgICMgU1ZHIGF0dHJpYnV0ZXMKICAgIChOb25lLCAnYWNjZW50LWhlaWdodCcpLAogICAgKE5vbmUsICdhY2N1bXVsYXRlJyksCiAgICAoTm9uZSwgJ2FkZGl0aXZlJyksCiAgICAoTm9uZSwgJ2FscGhhYmV0aWMnKSwKICAgIChOb25lLCAnYXJhYmljLWZvcm0nKSwKICAgIChOb25lLCAnYXNjZW50JyksCiAgICAoTm9uZSwgJ2F0dHJpYnV0ZU5hbWUnKSwKICAgIChOb25lLCAnYXR0cmlidXRlVHlwZScpLAogICAgKE5vbmUsICdiYXNlUHJvZmlsZScpLAogICAgKE5vbmUsICdiYm94JyksCiAgICAoTm9uZSwgJ2JlZ2luJyksCiAgICAoTm9uZSwgJ2J5JyksCiAgICAoTm9uZSwgJ2NhbGNNb2RlJyksCiAgICAoTm9uZSwgJ2NhcC1oZWlnaHQnKSwKICAgIChOb25lLCAnY2xhc3MnKSwKICAgIChOb25lLCAnY2xpcC1wYXRoJyksCiAgICAoTm9uZSwgJ2NvbG9yJyksCiAgICAoTm9uZSwgJ2NvbG9yLXJlbmRlcmluZycpLAogICAgKE5vbmUsICdjb250ZW50JyksCiAgICAoTm9uZSwgJ2N4JyksCiAgICAoTm9uZSwgJ2N5JyksCiAgICAoTm9uZSwgJ2QnKSwKICAgIChOb25lLCAnZHgnKSwKICAgIChOb25lLCAnZHknKSwKICAgIChOb25lLCAnZGVzY2VudCcpLAogICAgKE5vbmUsICdkaXNwbGF5JyksCiAgICAoTm9uZSwgJ2R1cicpLAogICAgKE5vbmUsICdlbmQnKSwKICAgIChOb25lLCAnZmlsbCcpLAogICAgKE5vbmUsICdmaWxsLW9wYWNpdHknKSwKICAgIChOb25lLCAnZmlsbC1ydWxlJyksCiAgICAoTm9uZSwgJ2ZvbnQtZmFtaWx5JyksCiAgICAoTm9uZSwgJ2ZvbnQtc2l6ZScpLAogICAgKE5vbmUsICdmb250LXN0cmV0Y2gnKSwKICAgIChOb25lLCAnZm9udC1zdHlsZScpLAogICAgKE5vbmUsICdmb250LXZhcmlhbnQnKSwKICAgIChOb25lLCAnZm9udC13ZWlnaHQnKSwKICAgIChOb25lLCAnZnJvbScpLAogICAgKE5vbmUsICdmeCcpLAogICAgKE5vbmUsICdmeScpLAogICAgKE5vbmUsICdnMScpLAogICAgKE5vbmUsICdnMicpLAogICAgKE5vbmUsICdnbHlwaC1uYW1lJyksCiAgICAoTm9uZSwgJ2dyYWRpZW50VW5pdHMnKSwKICAgIChOb25lLCAnaGFuZ2luZycpLAogICAgKE5vbmUsICdoZWlnaHQnKSwKICAgIChOb25lLCAnaG9yaXotYWR2LXgnKSwKICAgIChOb25lLCAnaG9yaXotb3JpZ2luLXgnKSwKICAgIChOb25lLCAnaWQnKSwKICAgIChOb25lLCAnaWRlb2dyYXBoaWMnKSwKICAgIChOb25lLCAnaycpLAogICAgKE5vbmUsICdrZXlQb2ludHMnKSwKICAgIChOb25lLCAna2V5U3BsaW5lcycpLAogICAgKE5vbmUsICdrZXlUaW1lcycpLAogICAgKE5vbmUsICdsYW5nJyksCiAgICAoTm9uZSwgJ21hcmtlci1lbmQnKSwKICAgIChOb25lLCAnbWFya2VyLW1pZCcpLAogICAgKE5vbmUsICdtYXJrZXItc3RhcnQnKSwKICAgIChOb25lLCAnbWFya2VySGVpZ2h0JyksCiAgICAoTm9uZSwgJ21hcmtlclVuaXRzJyksCiAgICAoTm9uZSwgJ21hcmtlcldpZHRoJyksCiAgICAoTm9uZSwgJ21hdGhlbWF0aWNhbCcpLAogICAgKE5vbmUsICdtYXgnKSwKICAgIChOb25lLCAnbWluJyksCiAgICAoTm9uZSwgJ25hbWUnKSwKICAgIChOb25lLCAnb2Zmc2V0JyksCiAgICAoTm9uZSwgJ29wYWNpdHknKSwKICAgIChOb25lLCAnb3JpZW50JyksCiAgICAoTm9uZSwgJ29yaWdpbicpLAogICAgKE5vbmUsICdvdmVybGluZS1wb3NpdGlvbicpLAogICAgKE5vbmUsICdvdmVybGluZS10aGlja25lc3MnKSwKICAgIChOb25lLCAncGFub3NlLTEnKSwKICAgIChOb25lLCAncGF0aCcpLAogICAgKE5vbmUsICdwYXRoTGVuZ3RoJyksCiAgICAoTm9uZSwgJ3BvaW50cycpLAogICAgKE5vbmUsICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyksCiAgICAoTm9uZSwgJ3InKSwKICAgIChOb25lLCAncmVmWCcpLAogICAgKE5vbmUsICdyZWZZJyksCiAgICAoTm9uZSwgJ3JlcGVhdENvdW50JyksCiAgICAoTm9uZSwgJ3JlcGVhdER1cicpLAogICAgKE5vbmUsICdyZXF1aXJlZEV4dGVuc2lvbnMnKSwKICAgIChOb25lLCAncmVxdWlyZWRGZWF0dXJlcycpLAogICAgKE5vbmUsICdyZXN0YXJ0JyksCiAgICAoTm9uZSwgJ3JvdGF0ZScpLAogICAgKE5vbmUsICdyeCcpLAogICAgKE5vbmUsICdyeScpLAogICAgKE5vbmUsICdzbG9wZScpLAogICAgKE5vbmUsICdzdGVtaCcpLAogICAgKE5vbmUsICdzdGVtdicpLAogICAgKE5vbmUsICdzdG9wLWNvbG9yJyksCiAgICAoTm9uZSwgJ3N0b3Atb3BhY2l0eScpLAogICAgKE5vbmUsICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJyksCiAgICAoTm9uZSwgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJyksCiAgICAoTm9uZSwgJ3N0cm9rZScpLAogICAgKE5vbmUsICdzdHJva2UtZGFzaGFycmF5JyksCiAgICAoTm9uZSwgJ3N0cm9rZS1kYXNob2Zmc2V0JyksCiAgICAoTm9uZSwgJ3N0cm9rZS1saW5lY2FwJyksCiAgICAoTm9uZSwgJ3N0cm9rZS1saW5lam9pbicpLAogICAgKE5vbmUsICdzdHJva2UtbWl0ZXJsaW1pdCcpLAogICAgKE5vbmUsICdzdHJva2Utb3BhY2l0eScpLAogICAgKE5vbmUsICdzdHJva2Utd2lkdGgnKSwKICAgIChOb25lLCAnc3lzdGVtTGFuZ3VhZ2UnKSwKICAgIChOb25lLCAndGFyZ2V0JyksCiAgICAoTm9uZSwgJ3RleHQtYW5jaG9yJyksCiAgICAoTm9uZSwgJ3RvJyksCiAgICAoTm9uZSwgJ3RyYW5zZm9ybScpLAogICAgKE5vbmUsICd0eXBlJyksCiAgICAoTm9uZSwgJ3UxJyksCiAgICAoTm9uZSwgJ3UyJyksCiAgICAoTm9uZSwgJ3VuZGVybGluZS1wb3NpdGlvbicpLAogICAgKE5vbmUsICd1bmRlcmxpbmUtdGhpY2tuZXNzJyksCiAgICAoTm9uZSwgJ3VuaWNvZGUnKSwKICAgIChOb25lLCAndW5pY29kZS1yYW5nZScpLAogICAgKE5vbmUsICd1bml0cy1wZXItZW0nKSwKICAgIChOb25lLCAndmFsdWVzJyksCiAgICAoTm9uZSwgJ3ZlcnNpb24nKSwKICAgIChOb25lLCAndmlld0JveCcpLAogICAgKE5vbmUsICd2aXNpYmlsaXR5JyksCiAgICAoTm9uZSwgJ3dpZHRoJyksCiAgICAoTm9uZSwgJ3dpZHRocycpLAogICAgKE5vbmUsICd4JyksCiAgICAoTm9uZSwgJ3gtaGVpZ2h0JyksCiAgICAoTm9uZSwgJ3gxJyksCiAgICAoTm9uZSwgJ3gyJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2FjdHVhdGUnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnYXJjcm9sZScpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3JvbGUnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnc2hvdycpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICd0aXRsZScpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICd0eXBlJyksCiAgICAobmFtZXNwYWNlc1sneG1sJ10sICdiYXNlJyksCiAgICAobmFtZXNwYWNlc1sneG1sJ10sICdsYW5nJyksCiAgICAobmFtZXNwYWNlc1sneG1sJ10sICdzcGFjZScpLAogICAgKE5vbmUsICd5JyksCiAgICAoTm9uZSwgJ3kxJyksCiAgICAoTm9uZSwgJ3kyJyksCiAgICAoTm9uZSwgJ3pvb21BbmRQYW4nKSwKKSkKCmF0dHJfdmFsX2lzX3VyaSA9IGZyb3plbnNldCgoCiAgICAoTm9uZSwgJ2hyZWYnKSwKICAgIChOb25lLCAnc3JjJyksCiAgICAoTm9uZSwgJ2NpdGUnKSwKICAgIChOb25lLCAnYWN0aW9uJyksCiAgICAoTm9uZSwgJ2xvbmdkZXNjJyksCiAgICAoTm9uZSwgJ3Bvc3RlcicpLAogICAgKE5vbmUsICdiYWNrZ3JvdW5kJyksCiAgICAoTm9uZSwgJ2RhdGFzcmMnKSwKICAgIChOb25lLCAnZHluc3JjJyksCiAgICAoTm9uZSwgJ2xvd3NyYycpLAogICAgKE5vbmUsICdwaW5nJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2hyZWYnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ2Jhc2UnKSwKKSkKCnN2Z19hdHRyX3ZhbF9hbGxvd3NfcmVmID0gZnJvemVuc2V0KCgKICAgIChOb25lLCAnY2xpcC1wYXRoJyksCiAgICAoTm9uZSwgJ2NvbG9yLXByb2ZpbGUnKSwKICAgIChOb25lLCAnY3Vyc29yJyksCiAgICAoTm9uZSwgJ2ZpbGwnKSwKICAgIChOb25lLCAnZmlsdGVyJyksCiAgICAoTm9uZSwgJ21hcmtlcicpLAogICAgKE5vbmUsICdtYXJrZXItc3RhcnQnKSwKICAgIChOb25lLCAnbWFya2VyLW1pZCcpLAogICAgKE5vbmUsICdtYXJrZXItZW5kJyksCiAgICAoTm9uZSwgJ21hc2snKSwKICAgIChOb25lLCAnc3Ryb2tlJyksCikpCgpzdmdfYWxsb3dfbG9jYWxfaHJlZiA9IGZyb3plbnNldCgoCiAgICAoTm9uZSwgJ2FsdEdseXBoJyksCiAgICAoTm9uZSwgJ2FuaW1hdGUnKSwKICAgIChOb25lLCAnYW5pbWF0ZUNvbG9yJyksCiAgICAoTm9uZSwgJ2FuaW1hdGVNb3Rpb24nKSwKICAgIChOb25lLCAnYW5pbWF0ZVRyYW5zZm9ybScpLAogICAgKE5vbmUsICdjdXJzb3InKSwKICAgIChOb25lLCAnZmVJbWFnZScpLAogICAgKE5vbmUsICdmaWx0ZXInKSwKICAgIChOb25lLCAnbGluZWFyR3JhZGllbnQnKSwKICAgIChOb25lLCAncGF0dGVybicpLAogICAgKE5vbmUsICdyYWRpYWxHcmFkaWVudCcpLAogICAgKE5vbmUsICd0ZXh0cGF0aCcpLAogICAgKE5vbmUsICd0cmVmJyksCiAgICAoTm9uZSwgJ3NldCcpLAogICAgKE5vbmUsICd1c2UnKQopKQoKYWxsb3dlZF9jc3NfcHJvcGVydGllcyA9IGZyb3plbnNldCgoCiAgICAnYXppbXV0aCcsCiAgICAnYmFja2dyb3VuZC1jb2xvcicsCiAgICAnYm9yZGVyLWJvdHRvbS1jb2xvcicsCiAgICAnYm9yZGVyLWNvbGxhcHNlJywKICAgICdib3JkZXItY29sb3InLAogICAgJ2JvcmRlci1sZWZ0LWNvbG9yJywKICAgICdib3JkZXItcmlnaHQtY29sb3InLAogICAgJ2JvcmRlci10b3AtY29sb3InLAogICAgJ2NsZWFyJywKICAgICdjb2xvcicsCiAgICAnY3Vyc29yJywKICAgICdkaXJlY3Rpb24nLAogICAgJ2Rpc3BsYXknLAogICAgJ2VsZXZhdGlvbicsCiAgICAnZmxvYXQnLAogICAgJ2ZvbnQnLAogICAgJ2ZvbnQtZmFtaWx5JywKICAgICdmb250LXNpemUnLAogICAgJ2ZvbnQtc3R5bGUnLAogICAgJ2ZvbnQtdmFyaWFudCcsCiAgICAnZm9udC13ZWlnaHQnLAogICAgJ2hlaWdodCcsCiAgICAnbGV0dGVyLXNwYWNpbmcnLAogICAgJ2xpbmUtaGVpZ2h0JywKICAgICdvdmVyZmxvdycsCiAgICAncGF1c2UnLAogICAgJ3BhdXNlLWFmdGVyJywKICAgICdwYXVzZS1iZWZvcmUnLAogICAgJ3BpdGNoJywKICAgICdwaXRjaC1yYW5nZScsCiAgICAncmljaG5lc3MnLAogICAgJ3NwZWFrJywKICAgICdzcGVhay1oZWFkZXInLAogICAgJ3NwZWFrLW51bWVyYWwnLAogICAgJ3NwZWFrLXB1bmN0dWF0aW9uJywKICAgICdzcGVlY2gtcmF0ZScsCiAgICAnc3RyZXNzJywKICAgICd0ZXh0LWFsaWduJywKICAgICd0ZXh0LWRlY29yYXRpb24nLAogICAgJ3RleHQtaW5kZW50JywKICAgICd1bmljb2RlLWJpZGknLAogICAgJ3ZlcnRpY2FsLWFsaWduJywKICAgICd2b2ljZS1mYW1pbHknLAogICAgJ3ZvbHVtZScsCiAgICAnd2hpdGUtc3BhY2UnLAogICAgJ3dpZHRoJywKKSkKCmFsbG93ZWRfY3NzX2tleXdvcmRzID0gZnJvemVuc2V0KCgKICAgICdhdXRvJywKICAgICdhcXVhJywKICAgICdibGFjaycsCiAgICAnYmxvY2snLAogICAgJ2JsdWUnLAogICAgJ2JvbGQnLAogICAgJ2JvdGgnLAogICAgJ2JvdHRvbScsCiAgICAnYnJvd24nLAogICAgJ2NlbnRlcicsCiAgICAnY29sbGFwc2UnLAogICAgJ2Rhc2hlZCcsCiAgICAnZG90dGVkJywKICAgICdmdWNoc2lhJywKICAgICdncmF5JywKICAgICdncmVlbicsCiAgICAnIWltcG9ydGFudCcsCiAgICAnaXRhbGljJywKICAgICdsZWZ0JywKICAgICdsaW1lJywKICAgICdtYXJvb24nLAogICAgJ21lZGl1bScsCiAgICAnbm9uZScsCiAgICAnbmF2eScsCiAgICAnbm9ybWFsJywKICAgICdub3dyYXAnLAogICAgJ29saXZlJywKICAgICdwb2ludGVyJywKICAgICdwdXJwbGUnLAogICAgJ3JlZCcsCiAgICAncmlnaHQnLAogICAgJ3NvbGlkJywKICAgICdzaWx2ZXInLAogICAgJ3RlYWwnLAogICAgJ3RvcCcsCiAgICAndHJhbnNwYXJlbnQnLAogICAgJ3VuZGVybGluZScsCiAgICAnd2hpdGUnLAogICAgJ3llbGxvdycsCikpCgphbGxvd2VkX3N2Z19wcm9wZXJ0aWVzID0gZnJvemVuc2V0KCgKICAgICdmaWxsJywKICAgICdmaWxsLW9wYWNpdHknLAogICAgJ2ZpbGwtcnVsZScsCiAgICAnc3Ryb2tlJywKICAgICdzdHJva2Utd2lkdGgnLAogICAgJ3N0cm9rZS1saW5lY2FwJywKICAgICdzdHJva2UtbGluZWpvaW4nLAogICAgJ3N0cm9rZS1vcGFjaXR5JywKKSkKCmFsbG93ZWRfcHJvdG9jb2xzID0gZnJvemVuc2V0KCgKICAgICdlZDJrJywKICAgICdmdHAnLAogICAgJ2h0dHAnLAogICAgJ2h0dHBzJywKICAgICdpcmMnLAogICAgJ21haWx0bycsCiAgICAnbmV3cycsCiAgICAnZ29waGVyJywKICAgICdubnRwJywKICAgICd0ZWxuZXQnLAogICAgJ3dlYmNhbCcsCiAgICAneG1wcCcsCiAgICAnY2FsbHRvJywKICAgICdmZWVkJywKICAgICd1cm4nLAogICAgJ2FpbScsCiAgICAncnN5bmMnLAogICAgJ3RhZycsCiAgICAnc3NoJywKICAgICdzZnRwJywKICAgICdydHNwJywKICAgICdhZnMnLAogICAgJ2RhdGEnLAopKQoKYWxsb3dlZF9jb250ZW50X3R5cGVzID0gZnJvemVuc2V0KCgKICAgICdpbWFnZS9wbmcnLAogICAgJ2ltYWdlL2pwZWcnLAogICAgJ2ltYWdlL2dpZicsCiAgICAnaW1hZ2Uvd2VicCcsCiAgICAnaW1hZ2UvYm1wJywKICAgICd0ZXh0L3BsYWluJywKKSkKCgpkYXRhX2NvbnRlbnRfdHlwZSA9IHJlLmNvbXBpbGUocicnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hdGNoIGEgY29udGVudCB0eXBlIDxhcHBsaWNhdGlvbj4vPHR5cGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD9QPGNvbnRlbnRfdHlwZT5bLWEtekEtWjAtOS5dKy9bLWEtekEtWjAtOS5dKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hdGNoIGFueSBjaGFyYWN0ZXIgc2V0IGFuZCBlbmNvZGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg/Oig/OjtjaGFyc2V0PSg/OlstYS16QS1aMC05XSspKD86Oyg/OmJhc2U2NCkpPykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwoPzo7KD86YmFzZTY0KSk/KD86O2NoYXJzZXQ9KD86Wy1hLXpBLVowLTldKykpPykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFzc3VtZSB0aGUgcmVzdCBpcyBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLC4qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLlZFUkJPU0UpCgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgICIiIiBzYW5pdGl6YXRpb24gb2YgWEhUTUwrTWF0aE1MK1NWRyBhbmQgb2YgaW5saW5lIHN0eWxlIGF0dHJpYnV0ZXMuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwKICAgICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9lbGVtZW50cz1hbGxvd2VkX2VsZW1lbnRzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfYXR0cmlidXRlcz1hbGxvd2VkX2F0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9jc3NfcHJvcGVydGllcz1hbGxvd2VkX2Nzc19wcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfY3NzX2tleXdvcmRzPWFsbG93ZWRfY3NzX2tleXdvcmRzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfc3ZnX3Byb3BlcnRpZXM9YWxsb3dlZF9zdmdfcHJvcGVydGllcywKICAgICAgICAgICAgICAgICBhbGxvd2VkX3Byb3RvY29scz1hbGxvd2VkX3Byb3RvY29scywKICAgICAgICAgICAgICAgICBhbGxvd2VkX2NvbnRlbnRfdHlwZXM9YWxsb3dlZF9jb250ZW50X3R5cGVzLAogICAgICAgICAgICAgICAgIGF0dHJfdmFsX2lzX3VyaT1hdHRyX3ZhbF9pc191cmksCiAgICAgICAgICAgICAgICAgc3ZnX2F0dHJfdmFsX2FsbG93c19yZWY9c3ZnX2F0dHJfdmFsX2FsbG93c19yZWYsCiAgICAgICAgICAgICAgICAgc3ZnX2FsbG93X2xvY2FsX2hyZWY9c3ZnX2FsbG93X2xvY2FsX2hyZWYpOgogICAgICAgIHN1cGVyKEZpbHRlciwgc2VsZikuX19pbml0X18oc291cmNlKQogICAgICAgIHNlbGYuYWxsb3dlZF9lbGVtZW50cyA9IGFsbG93ZWRfZWxlbWVudHMKICAgICAgICBzZWxmLmFsbG93ZWRfYXR0cmlidXRlcyA9IGFsbG93ZWRfYXR0cmlidXRlcwogICAgICAgIHNlbGYuYWxsb3dlZF9jc3NfcHJvcGVydGllcyA9IGFsbG93ZWRfY3NzX3Byb3BlcnRpZXMKICAgICAgICBzZWxmLmFsbG93ZWRfY3NzX2tleXdvcmRzID0gYWxsb3dlZF9jc3Nfa2V5d29yZHMKICAgICAgICBzZWxmLmFsbG93ZWRfc3ZnX3Byb3BlcnRpZXMgPSBhbGxvd2VkX3N2Z19wcm9wZXJ0aWVzCiAgICAgICAgc2VsZi5hbGxvd2VkX3Byb3RvY29scyA9IGFsbG93ZWRfcHJvdG9jb2xzCiAgICAgICAgc2VsZi5hbGxvd2VkX2NvbnRlbnRfdHlwZXMgPSBhbGxvd2VkX2NvbnRlbnRfdHlwZXMKICAgICAgICBzZWxmLmF0dHJfdmFsX2lzX3VyaSA9IGF0dHJfdmFsX2lzX3VyaQogICAgICAgIHNlbGYuc3ZnX2F0dHJfdmFsX2FsbG93c19yZWYgPSBzdmdfYXR0cl92YWxfYWxsb3dzX3JlZgogICAgICAgIHNlbGYuc3ZnX2FsbG93X2xvY2FsX2hyZWYgPSBzdmdfYWxsb3dfbG9jYWxfaHJlZgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBmb3IgdG9rZW4gaW4gYmFzZS5GaWx0ZXIuX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHRva2VuID0gc2VsZi5zYW5pdGl6ZV90b2tlbih0b2tlbikKICAgICAgICAgICAgaWYgdG9rZW46CiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgoKICAgICMgU2FuaXRpemUgdGhlICtodG1sKywgZXNjYXBpbmcgYWxsIGVsZW1lbnRzIG5vdCBpbiBBTExPV0VEX0VMRU1FTlRTLCBhbmQKICAgICMgc3RyaXBwaW5nIG91dCBhbGwgIyBhdHRyaWJ1dGVzIG5vdCBpbiBBTExPV0VEX0FUVFJJQlVURVMuIFN0eWxlCiAgICAjIGF0dHJpYnV0ZXMgYXJlIHBhcnNlZCwgYW5kIGEgcmVzdHJpY3RlZCBzZXQsICMgc3BlY2lmaWVkIGJ5CiAgICAjIEFMTE9XRURfQ1NTX1BST1BFUlRJRVMgYW5kIEFMTE9XRURfQ1NTX0tFWVdPUkRTLCBhcmUgYWxsb3dlZCB0aHJvdWdoLgogICAgIyBhdHRyaWJ1dGVzIGluIEFUVFJfVkFMX0lTX1VSSSBhcmUgc2Nhbm5lZCwgYW5kIG9ubHkgVVJJIHNjaGVtZXMgc3BlY2lmaWVkCiAgICAjIGluIEFMTE9XRURfUFJPVE9DT0xTIGFyZSBhbGxvd2VkLgogICAgIwogICAgIyAgIHNhbml0aXplX2h0bWwoJzxzY3JpcHQ+IGRvX25hc3R5X3N0dWZmKCkgPC9zY3JpcHQ+JykKICAgICMgICAgPT4gJmx0O3NjcmlwdD4gZG9fbmFzdHlfc3R1ZmYoKSAmbHQ7L3NjcmlwdD4KICAgICMgICBzYW5pdGl6ZV9odG1sKCc8YSBocmVmPSJqYXZhc2NyaXB0OiBzdWNrZXIoKTsiPkNsaWNrIGhlcmUgZm9yICQxMDA8L2E+JykKICAgICMgICAgPT4gPGE+Q2xpY2sgaGVyZSBmb3IgJDEwMDwvYT4KICAgIGRlZiBzYW5pdGl6ZV90b2tlbihzZWxmLCB0b2tlbik6CgogICAgICAgICMgYWNjb21tb2RhdGUgZmlsdGVycyB3aGljaCB1c2UgdG9rZW5fdHlwZSBkaWZmZXJlbnRseQogICAgICAgIHRva2VuX3R5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdG9rZW5fdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVuZFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICBuYW1lc3BhY2UgPSB0b2tlblsibmFtZXNwYWNlIl0KICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UsIG5hbWUpIGluIHNlbGYuYWxsb3dlZF9lbGVtZW50cyBvcgogICAgICAgICAgICAgICAgKG5hbWVzcGFjZSBpcyBOb25lIGFuZAogICAgICAgICAgICAgICAgIChuYW1lc3BhY2VzWyJodG1sIl0sIG5hbWUpIGluIHNlbGYuYWxsb3dlZF9lbGVtZW50cykpOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYWxsb3dlZF90b2tlbih0b2tlbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc2FsbG93ZWRfdG9rZW4odG9rZW4pCiAgICAgICAgZWxpZiB0b2tlbl90eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGRlZiBhbGxvd2VkX3Rva2VuKHNlbGYsIHRva2VuKToKICAgICAgICBpZiAiZGF0YSIgaW4gdG9rZW46CiAgICAgICAgICAgIGF0dHJzID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICBhdHRyX25hbWVzID0gc2V0KGF0dHJzLmtleXMoKSkKCiAgICAgICAgICAgICMgUmVtb3ZlIGZvcmJpZGRlbiBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGZvciB0b19yZW1vdmUgaW4gKGF0dHJfbmFtZXMgLSBzZWxmLmFsbG93ZWRfYXR0cmlidXRlcyk6CiAgICAgICAgICAgICAgICBkZWwgdG9rZW5bImRhdGEiXVt0b19yZW1vdmVdCiAgICAgICAgICAgICAgICBhdHRyX25hbWVzLnJlbW92ZSh0b19yZW1vdmUpCgogICAgICAgICAgICAjIFJlbW92ZSBhdHRyaWJ1dGVzIHdpdGggZGlzYWxsb3dlZCBVUkwgdmFsdWVzCiAgICAgICAgICAgIGZvciBhdHRyIGluIChhdHRyX25hbWVzICYgc2VsZi5hdHRyX3ZhbF9pc191cmkpOgogICAgICAgICAgICAgICAgYXNzZXJ0IGF0dHIgaW4gYXR0cnMKICAgICAgICAgICAgICAgICMgSSBkb24ndCBoYXZlIGEgY2x1ZSB3aGVyZSB0aGlzIHJlZ2V4cCBjb21lcyBmcm9tIG9yIHdoeSBpdCBtYXRjaGVzIHRob3NlCiAgICAgICAgICAgICAgICAjIGNoYXJhY3RlcnMsIG5vciB3aHkgd2UgY2FsbCB1bmVzY2FwZS4gSSBqdXN0IGtub3cgaXQncyBhbHdheXMgYmVlbiBoZXJlLgogICAgICAgICAgICAgICAgIyBTaG91bGQgeW91IGJlIHdvcnJpZWQgYnkgdGhpcyBjb21tZW50IGluIGEgc2FuaXRpemVyPyBZZXMuIE9uIHRoZSBvdGhlciBoYW5kLCBhbGwKICAgICAgICAgICAgICAgICMgdGhpcyB3aWxsIGRvIGlzIHJlbW92ZSAqbW9yZSogdGhhbiBpdCBvdGhlcndpc2Ugd291bGQuCiAgICAgICAgICAgICAgICB2YWxfdW5lc2NhcGVkID0gcmUuc3ViKCJbYFx4MDAtXHgyMFx4N2YtXHhhMFxzXSsiLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGUoYXR0cnNbYXR0cl0pKS5sb3dlcigpCiAgICAgICAgICAgICAgICAjIHJlbW92ZSByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGZyb20gdW5lc2NhcGVkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgIHZhbF91bmVzY2FwZWQgPSB2YWxfdW5lc2NhcGVkLnJlcGxhY2UoIlx1ZmZmZCIsICIiKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHVyaSA9IHVybHBhcnNlLnVybHBhcnNlKHZhbF91bmVzY2FwZWQpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICB1cmkgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgZGVsIGF0dHJzW2F0dHJdCiAgICAgICAgICAgICAgICBpZiB1cmkgYW5kIHVyaS5zY2hlbWU6CiAgICAgICAgICAgICAgICAgICAgaWYgdXJpLnNjaGVtZSBub3QgaW4gc2VsZi5hbGxvd2VkX3Byb3RvY29sczoKICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGF0dHJzW2F0dHJdCiAgICAgICAgICAgICAgICAgICAgaWYgdXJpLnNjaGVtZSA9PSAnZGF0YSc6CiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBkYXRhX2NvbnRlbnRfdHlwZS5tYXRjaCh1cmkucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYXR0cnNbYXR0cl0KICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBtLmdyb3VwKCdjb250ZW50X3R5cGUnKSBub3QgaW4gc2VsZi5hbGxvd2VkX2NvbnRlbnRfdHlwZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYXR0cnNbYXR0cl0KCiAgICAgICAgICAgIGZvciBhdHRyIGluIHNlbGYuc3ZnX2F0dHJfdmFsX2FsbG93c19yZWY6CiAgICAgICAgICAgICAgICBpZiBhdHRyIGluIGF0dHJzOgogICAgICAgICAgICAgICAgICAgIGF0dHJzW2F0dHJdID0gcmUuc3ViKHIndXJsXHMqXChccypbXiNcc11bXildKz9cKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlKGF0dHJzW2F0dHJdKSkKICAgICAgICAgICAgaWYgKHRva2VuWyJuYW1lIl0gaW4gc2VsZi5zdmdfYWxsb3dfbG9jYWxfaHJlZiBhbmQKICAgICAgICAgICAgICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpIGluIGF0dHJzIGFuZCByZS5zZWFyY2goJ15ccypbXiNcc10uKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzWyhuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpXSkpOgogICAgICAgICAgICAgICAgZGVsIGF0dHJzWyhuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpXQogICAgICAgICAgICBpZiAoTm9uZSwgJ3N0eWxlJykgaW4gYXR0cnM6CiAgICAgICAgICAgICAgICBhdHRyc1soTm9uZSwgJ3N0eWxlJyldID0gc2VsZi5zYW5pdGl6ZV9jc3MoYXR0cnNbKE5vbmUsICdzdHlsZScpXSkKICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9IGF0dHJzCiAgICAgICAgcmV0dXJuIHRva2VuCgogICAgZGVmIGRpc2FsbG93ZWRfdG9rZW4oc2VsZiwgdG9rZW4pOgogICAgICAgIHRva2VuX3R5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdG9rZW5fdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9ICI8LyVzPiIgJSB0b2tlblsibmFtZSJdCiAgICAgICAgZWxpZiB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICBhc3NlcnQgdG9rZW5fdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIikKICAgICAgICAgICAgYXR0cnMgPSBbXQogICAgICAgICAgICBmb3IgKG5zLCBuYW1lKSwgdiBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoJyAlcz0iJXMiJyAlIChuYW1lIGlmIG5zIGlzIE5vbmUgZWxzZSAiJXM6JXMiICUgKHByZWZpeGVzW25zXSwgbmFtZSksIGVzY2FwZSh2KSkpCiAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSAiPCVzJXM+IiAlICh0b2tlblsibmFtZSJdLCAnJy5qb2luKGF0dHJzKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gIjwlcz4iICUgdG9rZW5bIm5hbWUiXQogICAgICAgIGlmIHRva2VuLmdldCgic2VsZkNsb3NpbmciKToKICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9IHRva2VuWyJkYXRhIl1bOi0xXSArICIvPiIKCiAgICAgICAgdG9rZW5bInR5cGUiXSA9ICJDaGFyYWN0ZXJzIgoKICAgICAgICBkZWwgdG9rZW5bIm5hbWUiXQogICAgICAgIHJldHVybiB0b2tlbgoKICAgIGRlZiBzYW5pdGl6ZV9jc3Moc2VsZiwgc3R5bGUpOgogICAgICAgICMgZGlzYWxsb3cgdXJscwogICAgICAgIHN0eWxlID0gcmUuY29tcGlsZSgndXJsXHMqXChccypbXlxzKV0rP1xzKlwpXHMqJykuc3ViKCcgJywgc3R5bGUpCgogICAgICAgICMgZ2F1bnRsZXQKICAgICAgICBpZiBub3QgcmUubWF0Y2goIiIiXihbOiw7IyUuXHNhLXpBLVowLTkhXXxcdy1cd3wnW1xzXHddKyd8Iltcc1x3XSsifFwoW1xkLFxzXStcKSkqJCIiIiwgc3R5bGUpOgogICAgICAgICAgICByZXR1cm4gJycKICAgICAgICBpZiBub3QgcmUubWF0Y2goIl5ccyooWy1cd10rXHMqOlteOjtdKig7XHMqfCQpKSokIiwgc3R5bGUpOgogICAgICAgICAgICByZXR1cm4gJycKCiAgICAgICAgY2xlYW4gPSBbXQogICAgICAgIGZvciBwcm9wLCB2YWx1ZSBpbiByZS5maW5kYWxsKCIoWy1cd10rKVxzKjpccyooW146O10qKSIsIHN0eWxlKToKICAgICAgICAgICAgaWYgbm90IHZhbHVlOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcHJvcC5sb3dlcigpIGluIHNlbGYuYWxsb3dlZF9jc3NfcHJvcGVydGllczoKICAgICAgICAgICAgICAgIGNsZWFuLmFwcGVuZChwcm9wICsgJzogJyArIHZhbHVlICsgJzsnKQogICAgICAgICAgICBlbGlmIHByb3Auc3BsaXQoJy0nKVswXS5sb3dlcigpIGluIFsnYmFja2dyb3VuZCcsICdib3JkZXInLCAnbWFyZ2luJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmcnXToKICAgICAgICAgICAgICAgIGZvciBrZXl3b3JkIGluIHZhbHVlLnNwbGl0KCk6CiAgICAgICAgICAgICAgICAgICAgaWYga2V5d29yZCBub3QgaW4gc2VsZi5hbGxvd2VkX2Nzc19rZXl3b3JkcyBhbmQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHJlLm1hdGNoKCJeKCNbMC05YS1mXSt8cmdiXChcZCslPyxcZColPyw/XGQqJT9cKT98XGR7MCwyfVwuP1xkezAsMn0oY218ZW18ZXh8aW58bW18cGN8cHR8cHh8JXwsfFwpKT8pJCIsIGtleXdvcmQpOiAgIyBub3FhCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNsZWFuLmFwcGVuZChwcm9wICsgJzogJyArIHZhbHVlICsgJzsnKQogICAgICAgICAgICBlbGlmIHByb3AubG93ZXIoKSBpbiBzZWxmLmFsbG93ZWRfc3ZnX3Byb3BlcnRpZXM6CiAgICAgICAgICAgICAgICBjbGVhbi5hcHBlbmQocHJvcCArICc6ICcgKyB2YWx1ZSArICc7JykKCiAgICAgICAgcmV0dXJuICcgJy5qb2luKGNsZWFuKQpQSwMEFAAAAAAAAAAhAJ+Oaq1zBAAAcwQAAEcAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvd2hpdGVzcGFjZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IHJlCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgcmNkYXRhRWxlbWVudHMsIHNwYWNlQ2hhcmFjdGVycwpzcGFjZUNoYXJhY3RlcnMgPSAiIi5qb2luKHNwYWNlQ2hhcmFjdGVycykKClNQQUNFU19SRUdFWCA9IHJlLmNvbXBpbGUoIlslc10rIiAlIHNwYWNlQ2hhcmFjdGVycykKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgoKICAgIHNwYWNlUHJlc2VydmVFbGVtZW50cyA9IGZyb3plbnNldChbInByZSIsICJ0ZXh0YXJlYSJdICsgbGlzdChyY2RhdGFFbGVtZW50cykpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHByZXNlcnZlID0gMAogICAgICAgIGZvciB0b2tlbiBpbiBiYXNlLkZpbHRlci5fX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciIFwKICAgICAgICAgICAgICAgICAgICBhbmQgKHByZXNlcnZlIG9yIHRva2VuWyJuYW1lIl0gaW4gc2VsZi5zcGFjZVByZXNlcnZlRWxlbWVudHMpOgogICAgICAgICAgICAgICAgcHJlc2VydmUgKz0gMQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciIGFuZCBwcmVzZXJ2ZToKICAgICAgICAgICAgICAgIHByZXNlcnZlIC09IDEKCiAgICAgICAgICAgIGVsaWYgbm90IHByZXNlcnZlIGFuZCB0eXBlID09ICJTcGFjZUNoYXJhY3RlcnMiIGFuZCB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICAgICAgIyBUZXN0IG9uIHRva2VuWyJkYXRhIl0gYWJvdmUgdG8gbm90IGludHJvZHVjZSBzcGFjZXMgd2hlcmUgdGhlcmUgd2VyZSBub3QKICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSAiICIKCiAgICAgICAgICAgIGVsaWYgbm90IHByZXNlcnZlIGFuZCB0eXBlID09ICJDaGFyYWN0ZXJzIjoKICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSBjb2xsYXBzZV9zcGFjZXModG9rZW5bImRhdGEiXSkKCiAgICAgICAgICAgIHlpZWxkIHRva2VuCgoKZGVmIGNvbGxhcHNlX3NwYWNlcyh0ZXh0KToKICAgIHJldHVybiBTUEFDRVNfUkVHRVguc3ViKCcgJywgdGV4dCkKUEsDBBQAAAAAAAAAIQBj2HfcsskBALLJAQBAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9odG1sNXBhcnNlci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgd2l0aF9tZXRhY2xhc3MsIHZpZXdrZXlzLCBQWTMKCmltcG9ydCB0eXBlcwoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBwaXAuX3ZlbmRvci5vcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKCmZyb20gLiBpbXBvcnQgX2lucHV0c3RyZWFtCmZyb20gLiBpbXBvcnQgX3Rva2VuaXplcgoKZnJvbSAuIGltcG9ydCB0cmVlYnVpbGRlcnMKZnJvbSAudHJlZWJ1aWxkZXJzLmJhc2UgaW1wb3J0IE1hcmtlcgoKZnJvbSAuIGltcG9ydCBfdXRpbHMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCAoCiAgICBzcGFjZUNoYXJhY3RlcnMsIGFzY2lpVXBwZXIyTG93ZXIsCiAgICBzcGVjaWFsRWxlbWVudHMsIGhlYWRpbmdFbGVtZW50cywgY2RhdGFFbGVtZW50cywgcmNkYXRhRWxlbWVudHMsCiAgICB0b2tlblR5cGVzLCB0YWdUb2tlblR5cGVzLAogICAgbmFtZXNwYWNlcywKICAgIGh0bWxJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMsIG1hdGhtbFRleHRJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMsCiAgICBhZGp1c3RGb3JlaWduQXR0cmlidXRlcyBhcyBhZGp1c3RGb3JlaWduQXR0cmlidXRlc01hcCwKICAgIGFkanVzdE1hdGhNTEF0dHJpYnV0ZXMsIGFkanVzdFNWR0F0dHJpYnV0ZXMsCiAgICBFLAogICAgUmVwYXJzZUV4Y2VwdGlvbgopCgoKZGVmIHBhcnNlKGRvYywgdHJlZWJ1aWxkZXI9ImV0cmVlIiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPVRydWUsICoqa3dhcmdzKToKICAgICIiIlBhcnNlIGEgc3RyaW5nIG9yIGZpbGUtbGlrZSBvYmplY3QgaW50byBhIHRyZWUiIiIKICAgIHRiID0gdHJlZWJ1aWxkZXJzLmdldFRyZWVCdWlsZGVyKHRyZWVidWlsZGVyKQogICAgcCA9IEhUTUxQYXJzZXIodGIsIG5hbWVzcGFjZUhUTUxFbGVtZW50cz1uYW1lc3BhY2VIVE1MRWxlbWVudHMpCiAgICByZXR1cm4gcC5wYXJzZShkb2MsICoqa3dhcmdzKQoKCmRlZiBwYXJzZUZyYWdtZW50KGRvYywgY29udGFpbmVyPSJkaXYiLCB0cmVlYnVpbGRlcj0iZXRyZWUiLCBuYW1lc3BhY2VIVE1MRWxlbWVudHM9VHJ1ZSwgKiprd2FyZ3MpOgogICAgdGIgPSB0cmVlYnVpbGRlcnMuZ2V0VHJlZUJ1aWxkZXIodHJlZWJ1aWxkZXIpCiAgICBwID0gSFRNTFBhcnNlcih0YiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPW5hbWVzcGFjZUhUTUxFbGVtZW50cykKICAgIHJldHVybiBwLnBhcnNlRnJhZ21lbnQoZG9jLCBjb250YWluZXI9Y29udGFpbmVyLCAqKmt3YXJncykKCgpkZWYgbWV0aG9kX2RlY29yYXRvcl9tZXRhY2xhc3MoZnVuY3Rpb24pOgogICAgY2xhc3MgRGVjb3JhdGVkKHR5cGUpOgogICAgICAgIGRlZiBfX25ld19fKG1ldGEsIGNsYXNzbmFtZSwgYmFzZXMsIGNsYXNzRGljdCk6CiAgICAgICAgICAgIGZvciBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGUgaW4gY2xhc3NEaWN0Lml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGF0dHJpYnV0ZSwgdHlwZXMuRnVuY3Rpb25UeXBlKToKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBmdW5jdGlvbihhdHRyaWJ1dGUpCgogICAgICAgICAgICAgICAgY2xhc3NEaWN0W2F0dHJpYnV0ZU5hbWVdID0gYXR0cmlidXRlCiAgICAgICAgICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YSwgY2xhc3NuYW1lLCBiYXNlcywgY2xhc3NEaWN0KQogICAgcmV0dXJuIERlY29yYXRlZAoKCmNsYXNzIEhUTUxQYXJzZXIob2JqZWN0KToKICAgICIiIkhUTUwgcGFyc2VyLiBHZW5lcmF0ZXMgYSB0cmVlIHN0cnVjdHVyZSBmcm9tIGEgc3RyZWFtIG9mIChwb3NzaWJseQogICAgICAgIG1hbGZvcm1lZCkgSFRNTCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmVlPU5vbmUsIHN0cmljdD1GYWxzZSwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPVRydWUsIGRlYnVnPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBzdHJpY3QgLSByYWlzZSBhbiBleGNlcHRpb24gd2hlbiBhIHBhcnNlIGVycm9yIGlzIGVuY291bnRlcmVkCgogICAgICAgIHRyZWUgLSBhIHRyZWVidWlsZGVyIGNsYXNzIGNvbnRyb2xsaW5nIHRoZSB0eXBlIG9mIHRyZWUgdGhhdCB3aWxsIGJlCiAgICAgICAgcmV0dXJuZWQuIEJ1aWx0IGluIHRyZWVidWlsZGVycyBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaAogICAgICAgIGh0bWw1bGliLnRyZWVidWlsZGVycy5nZXRUcmVlQnVpbGRlcih0cmVlVHlwZSkKICAgICAgICAiIiIKCiAgICAgICAgIyBSYWlzZSBhbiBleGNlcHRpb24gb24gdGhlIGZpcnN0IGVycm9yIGVuY291bnRlcmVkCiAgICAgICAgc2VsZi5zdHJpY3QgPSBzdHJpY3QKCiAgICAgICAgaWYgdHJlZSBpcyBOb25lOgogICAgICAgICAgICB0cmVlID0gdHJlZWJ1aWxkZXJzLmdldFRyZWVCdWlsZGVyKCJldHJlZSIpCiAgICAgICAgc2VsZi50cmVlID0gdHJlZShuYW1lc3BhY2VIVE1MRWxlbWVudHMpCiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQoKICAgICAgICBzZWxmLnBoYXNlcyA9IGRpY3QoWyhuYW1lLCBjbHMoc2VsZiwgc2VsZi50cmVlKSkgZm9yIG5hbWUsIGNscyBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGhhc2VzKGRlYnVnKS5pdGVtcygpXSkKCiAgICBkZWYgX3BhcnNlKHNlbGYsIHN0cmVhbSwgaW5uZXJIVE1MPUZhbHNlLCBjb250YWluZXI9ImRpdiIsIHNjcmlwdGluZz1GYWxzZSwgKiprd2FyZ3MpOgoKICAgICAgICBzZWxmLmlubmVySFRNTE1vZGUgPSBpbm5lckhUTUwKICAgICAgICBzZWxmLmNvbnRhaW5lciA9IGNvbnRhaW5lcgogICAgICAgIHNlbGYuc2NyaXB0aW5nID0gc2NyaXB0aW5nCiAgICAgICAgc2VsZi50b2tlbml6ZXIgPSBfdG9rZW5pemVyLkhUTUxUb2tlbml6ZXIoc3RyZWFtLCBwYXJzZXI9c2VsZiwgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5tYWluTG9vcCgpCiAgICAgICAgZXhjZXB0IFJlcGFyc2VFeGNlcHRpb246CiAgICAgICAgICAgIHNlbGYucmVzZXQoKQogICAgICAgICAgICBzZWxmLm1haW5Mb29wKCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi50cmVlLnJlc2V0KCkKICAgICAgICBzZWxmLmZpcnN0U3RhcnRUYWcgPSBGYWxzZQogICAgICAgIHNlbGYuZXJyb3JzID0gW10KICAgICAgICBzZWxmLmxvZyA9IFtdICAjIG9ubHkgdXNlZCB3aXRoIGRlYnVnIG1vZGUKICAgICAgICAjICJxdWlya3MiIC8gImxpbWl0ZWQgcXVpcmtzIiAvICJubyBxdWlya3MiCiAgICAgICAgc2VsZi5jb21wYXRNb2RlID0gIm5vIHF1aXJrcyIKCiAgICAgICAgaWYgc2VsZi5pbm5lckhUTUxNb2RlOgogICAgICAgICAgICBzZWxmLmlubmVySFRNTCA9IHNlbGYuY29udGFpbmVyLmxvd2VyKCkKCiAgICAgICAgICAgIGlmIHNlbGYuaW5uZXJIVE1MIGluIGNkYXRhRWxlbWVudHM6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLnJjZGF0YVN0YXRlCiAgICAgICAgICAgIGVsaWYgc2VsZi5pbm5lckhUTUwgaW4gcmNkYXRhRWxlbWVudHM6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLnJhd3RleHRTdGF0ZQogICAgICAgICAgICBlbGlmIHNlbGYuaW5uZXJIVE1MID09ICdwbGFpbnRleHQnOgogICAgICAgICAgICAgICAgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5wbGFpbnRleHRTdGF0ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBzdGF0ZSBhbHJlYWR5IGlzIGRhdGEgc3RhdGUKICAgICAgICAgICAgICAgICMgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5kYXRhU3RhdGUKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgc2VsZi5waGFzZSA9IHNlbGYucGhhc2VzWyJiZWZvcmVIdG1sIl0KICAgICAgICAgICAgc2VsZi5waGFzZS5pbnNlcnRIdG1sRWxlbWVudCgpCiAgICAgICAgICAgIHNlbGYucmVzZXRJbnNlcnRpb25Nb2RlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmlubmVySFRNTCA9IEZhbHNlICAjIHB5bGludDpkaXNhYmxlPXJlZGVmaW5lZC12YXJpYWJsZS10eXBlCiAgICAgICAgICAgIHNlbGYucGhhc2UgPSBzZWxmLnBoYXNlc1siaW5pdGlhbCJdCgogICAgICAgIHNlbGYubGFzdFBoYXNlID0gTm9uZQoKICAgICAgICBzZWxmLmJlZm9yZVJDRGF0YVBoYXNlID0gTm9uZQoKICAgICAgICBzZWxmLmZyYW1lc2V0T0sgPSBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgZG9jdW1lbnRFbmNvZGluZyhzZWxmKToKICAgICAgICAiIiJUaGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nCiAgICAgICAgdGhhdCB3YXMgdXNlZCB0byBkZWNvZGUgdGhlIGlucHV0IHN0cmVhbSwKICAgICAgICBvciA6b2JqOmBOb25lYCBpZiB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHlldC4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ3Rva2VuaXplcicpOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBzZWxmLnRva2VuaXplci5zdHJlYW0uY2hhckVuY29kaW5nWzBdLm5hbWUKCiAgICBkZWYgaXNIVE1MSW50ZWdyYXRpb25Qb2ludChzZWxmLCBlbGVtZW50KToKICAgICAgICBpZiAoZWxlbWVudC5uYW1lID09ICJhbm5vdGF0aW9uLXhtbCIgYW5kCiAgICAgICAgICAgICAgICBlbGVtZW50Lm5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJtYXRobWwiXSk6CiAgICAgICAgICAgIHJldHVybiAoImVuY29kaW5nIiBpbiBlbGVtZW50LmF0dHJpYnV0ZXMgYW5kCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVzWyJlbmNvZGluZyJdLnRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgYXNjaWlVcHBlcjJMb3dlcikgaW4KICAgICAgICAgICAgICAgICAgICAoInRleHQvaHRtbCIsICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gKGVsZW1lbnQubmFtZXNwYWNlLCBlbGVtZW50Lm5hbWUpIGluIGh0bWxJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMKCiAgICBkZWYgaXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludChzZWxmLCBlbGVtZW50KToKICAgICAgICByZXR1cm4gKGVsZW1lbnQubmFtZXNwYWNlLCBlbGVtZW50Lm5hbWUpIGluIG1hdGhtbFRleHRJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMKCiAgICBkZWYgbWFpbkxvb3Aoc2VsZik6CiAgICAgICAgQ2hhcmFjdGVyc1Rva2VuID0gdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdCiAgICAgICAgU3BhY2VDaGFyYWN0ZXJzVG9rZW4gPSB0b2tlblR5cGVzWyJTcGFjZUNoYXJhY3RlcnMiXQogICAgICAgIFN0YXJ0VGFnVG9rZW4gPSB0b2tlblR5cGVzWyJTdGFydFRhZyJdCiAgICAgICAgRW5kVGFnVG9rZW4gPSB0b2tlblR5cGVzWyJFbmRUYWciXQogICAgICAgIENvbW1lbnRUb2tlbiA9IHRva2VuVHlwZXNbIkNvbW1lbnQiXQogICAgICAgIERvY3R5cGVUb2tlbiA9IHRva2VuVHlwZXNbIkRvY3R5cGUiXQogICAgICAgIFBhcnNlRXJyb3JUb2tlbiA9IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXQoKICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi5ub3JtYWxpemVkVG9rZW5zKCk6CiAgICAgICAgICAgIHByZXZfdG9rZW4gPSBOb25lCiAgICAgICAgICAgIG5ld190b2tlbiA9IHRva2VuCiAgICAgICAgICAgIHdoaWxlIG5ld190b2tlbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHByZXZfdG9rZW4gPSBuZXdfdG9rZW4KICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0gaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50cyBlbHNlIE5vbmUKICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlTmFtZXNwYWNlID0gY3VycmVudE5vZGUubmFtZXNwYWNlIGlmIGN1cnJlbnROb2RlIGVsc2UgTm9uZQogICAgICAgICAgICAgICAgY3VycmVudE5vZGVOYW1lID0gY3VycmVudE5vZGUubmFtZSBpZiBjdXJyZW50Tm9kZSBlbHNlIE5vbmUKCiAgICAgICAgICAgICAgICB0eXBlID0gbmV3X3Rva2VuWyJ0eXBlIl0KCiAgICAgICAgICAgICAgICBpZiB0eXBlID09IFBhcnNlRXJyb3JUb2tlbjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlRXJyb3IobmV3X3Rva2VuWyJkYXRhIl0sIG5ld190b2tlbi5nZXQoImRhdGF2YXJzIiwge30pKQogICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzKSA9PSAwIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlTmFtZXNwYWNlID09IHNlbGYudHJlZS5kZWZhdWx0TmFtZXNwYWNlIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmlzTWF0aE1MVGV4dEludGVncmF0aW9uUG9pbnQoY3VycmVudE5vZGUpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgKCh0eXBlID09IFN0YXJ0VGFnVG9rZW4gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0gbm90IGluIGZyb3plbnNldChbIm1nbHlwaCIsICJtYWxpZ25tYXJrIl0pKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaW4gKENoYXJhY3RlcnNUb2tlbiwgU3BhY2VDaGFyYWN0ZXJzVG9rZW4pKSkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnROb2RlTmFtZXNwYWNlID09IG5hbWVzcGFjZXNbIm1hdGhtbCJdIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVOYW1lID09ICJhbm5vdGF0aW9uLXhtbCIgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFN0YXJ0VGFnVG9rZW4gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdID09ICJzdmciKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5pc0hUTUxJbnRlZ3JhdGlvblBvaW50KGN1cnJlbnROb2RlKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaW4gKFN0YXJ0VGFnVG9rZW4sIENoYXJhY3RlcnNUb2tlbiwgU3BhY2VDaGFyYWN0ZXJzVG9rZW4pKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlID0gc2VsZi5waGFzZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlID0gc2VsZi5waGFzZXNbImluRm9yZWlnbkNvbnRlbnQiXQoKICAgICAgICAgICAgICAgICAgICBpZiB0eXBlID09IENoYXJhY3RlcnNUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc0NoYXJhY3RlcnMobmV3X3Rva2VuKQogICAgICAgICAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBTcGFjZUNoYXJhY3RlcnNUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhuZXdfdG9rZW4pCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09IFN0YXJ0VGFnVG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHBoYXNlLnByb2Nlc3NTdGFydFRhZyhuZXdfdG9rZW4pCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09IEVuZFRhZ1Rva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzRW5kVGFnKG5ld190b2tlbikKICAgICAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gQ29tbWVudFRva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzQ29tbWVudChuZXdfdG9rZW4pCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09IERvY3R5cGVUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc0RvY3R5cGUobmV3X3Rva2VuKQoKICAgICAgICAgICAgaWYgKHR5cGUgPT0gU3RhcnRUYWdUb2tlbiBhbmQgcHJldl90b2tlblsic2VsZkNsb3NpbmciXSBhbmQKICAgICAgICAgICAgICAgICAgICBub3QgcHJldl90b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlRXJyb3IoIm5vbi12b2lkLWVsZW1lbnQtd2l0aC10cmFpbGluZy1zb2xpZHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBwcmV2X3Rva2VuWyJuYW1lIl19KQoKICAgICAgICAjIFdoZW4gdGhlIGxvb3AgZmluaXNoZXMgaXQncyBFT0YKICAgICAgICByZXByb2Nlc3MgPSBUcnVlCiAgICAgICAgcGhhc2VzID0gW10KICAgICAgICB3aGlsZSByZXByb2Nlc3M6CiAgICAgICAgICAgIHBoYXNlcy5hcHBlbmQoc2VsZi5waGFzZSkKICAgICAgICAgICAgcmVwcm9jZXNzID0gc2VsZi5waGFzZS5wcm9jZXNzRU9GKCkKICAgICAgICAgICAgaWYgcmVwcm9jZXNzOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGhhc2Ugbm90IGluIHBoYXNlcwoKICAgIGRlZiBub3JtYWxpemVkVG9rZW5zKHNlbGYpOgogICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnRva2VuaXplcjoKICAgICAgICAgICAgeWllbGQgc2VsZi5ub3JtYWxpemVUb2tlbih0b2tlbikKCiAgICBkZWYgcGFyc2Uoc2VsZiwgc3RyZWFtLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlBhcnNlIGEgSFRNTCBkb2N1bWVudCBpbnRvIGEgd2VsbC1mb3JtZWQgdHJlZQoKICAgICAgICBzdHJlYW0gLSBhIGZpbGVsaWtlIG9iamVjdCBvciBzdHJpbmcgY29udGFpbmluZyB0aGUgSFRNTCB0byBiZSBwYXJzZWQKCiAgICAgICAgVGhlIG9wdGlvbmFsIGVuY29kaW5nIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzCiAgICAgICAgdGhlIGVuY29kaW5nLiAgSWYgc3BlY2lmaWVkLCB0aGF0IGVuY29kaW5nIHdpbGwgYmUgdXNlZCwKICAgICAgICByZWdhcmRsZXNzIG9mIGFueSBCT00gb3IgbGF0ZXIgZGVjbGFyYXRpb24gKHN1Y2ggYXMgaW4gYSBtZXRhCiAgICAgICAgZWxlbWVudCkKCiAgICAgICAgc2NyaXB0aW5nIC0gdHJlYXQgbm9zY3JpcHQgZWxlbWVudHMgYXMgaWYgamF2YXNjcmlwdCB3YXMgdHVybmVkIG9uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fcGFyc2Uoc3RyZWFtLCBGYWxzZSwgTm9uZSwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBzZWxmLnRyZWUuZ2V0RG9jdW1lbnQoKQoKICAgIGRlZiBwYXJzZUZyYWdtZW50KHNlbGYsIHN0cmVhbSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJQYXJzZSBhIEhUTUwgZnJhZ21lbnQgaW50byBhIHdlbGwtZm9ybWVkIHRyZWUgZnJhZ21lbnQKCiAgICAgICAgY29udGFpbmVyIC0gbmFtZSBvZiB0aGUgZWxlbWVudCB3ZSdyZSBzZXR0aW5nIHRoZSBpbm5lckhUTUwgcHJvcGVydHkKICAgICAgICBpZiBzZXQgdG8gTm9uZSwgZGVmYXVsdCB0byAnZGl2JwoKICAgICAgICBzdHJlYW0gLSBhIGZpbGVsaWtlIG9iamVjdCBvciBzdHJpbmcgY29udGFpbmluZyB0aGUgSFRNTCB0byBiZSBwYXJzZWQKCiAgICAgICAgVGhlIG9wdGlvbmFsIGVuY29kaW5nIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzCiAgICAgICAgdGhlIGVuY29kaW5nLiAgSWYgc3BlY2lmaWVkLCB0aGF0IGVuY29kaW5nIHdpbGwgYmUgdXNlZCwKICAgICAgICByZWdhcmRsZXNzIG9mIGFueSBCT00gb3IgbGF0ZXIgZGVjbGFyYXRpb24gKHN1Y2ggYXMgaW4gYSBtZXRhCiAgICAgICAgZWxlbWVudCkKCiAgICAgICAgc2NyaXB0aW5nIC0gdHJlYXQgbm9zY3JpcHQgZWxlbWVudHMgYXMgaWYgamF2YXNjcmlwdCB3YXMgdHVybmVkIG9uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fcGFyc2Uoc3RyZWFtLCBUcnVlLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYudHJlZS5nZXRGcmFnbWVudCgpCgogICAgZGVmIHBhcnNlRXJyb3Ioc2VsZiwgZXJyb3Jjb2RlPSJYWFgtdW5kZWZpbmVkLWVycm9yIiwgZGF0YXZhcnM9Tm9uZSk6CiAgICAgICAgIyBYWFggVGhlIGlkZWEgaXMgdG8gbWFrZSBlcnJvcmNvZGUgbWFuZGF0b3J5LgogICAgICAgIGlmIGRhdGF2YXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGRhdGF2YXJzID0ge30KICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoKHNlbGYudG9rZW5pemVyLnN0cmVhbS5wb3NpdGlvbigpLCBlcnJvcmNvZGUsIGRhdGF2YXJzKSkKICAgICAgICBpZiBzZWxmLnN0cmljdDoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcihFW2Vycm9yY29kZV0gJSBkYXRhdmFycykKCiAgICBkZWYgbm9ybWFsaXplVG9rZW4oc2VsZiwgdG9rZW4pOgogICAgICAgICIiIiBIVE1MNSBzcGVjaWZpYyBub3JtYWxpemF0aW9ucyB0byB0aGUgdG9rZW4gc3RyZWFtICIiIgoKICAgICAgICBpZiB0b2tlblsidHlwZSJdID09IHRva2VuVHlwZXNbIlN0YXJ0VGFnIl06CiAgICAgICAgICAgIHJhdyA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9IE9yZGVyZWREaWN0KHJhdykKICAgICAgICAgICAgaWYgbGVuKHJhdykgPiBsZW4odG9rZW5bImRhdGEiXSk6CiAgICAgICAgICAgICAgICAjIHdlIGhhZCBzb21lIGR1cGxpY2F0ZWQgYXR0cmlidXRlLCBmaXggc28gZmlyc3Qgd2lucwogICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXS51cGRhdGUocmF3Wzo6LTFdKQoKICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBkZWYgYWRqdXN0TWF0aE1MQXR0cmlidXRlcyhzZWxmLCB0b2tlbik6CiAgICAgICAgYWRqdXN0X2F0dHJpYnV0ZXModG9rZW4sIGFkanVzdE1hdGhNTEF0dHJpYnV0ZXMpCgogICAgZGVmIGFkanVzdFNWR0F0dHJpYnV0ZXMoc2VsZiwgdG9rZW4pOgogICAgICAgIGFkanVzdF9hdHRyaWJ1dGVzKHRva2VuLCBhZGp1c3RTVkdBdHRyaWJ1dGVzKQoKICAgIGRlZiBhZGp1c3RGb3JlaWduQXR0cmlidXRlcyhzZWxmLCB0b2tlbik6CiAgICAgICAgYWRqdXN0X2F0dHJpYnV0ZXModG9rZW4sIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzTWFwKQoKICAgIGRlZiByZXBhcnNlVG9rZW5Ob3JtYWwoc2VsZiwgdG9rZW4pOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9dW51c2VkLWFyZ3VtZW50CiAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UoKQoKICAgIGRlZiByZXNldEluc2VydGlvbk1vZGUoc2VsZik6CiAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGlzIG1ldGhvZCBpcyBtb3N0bHkgaGlzdG9yaWNhbC4gKEl0J3MgYWxzbyB1c2VkIGluIHRoZQogICAgICAgICMgc3BlY2lmaWNhdGlvbi4pCiAgICAgICAgbGFzdCA9IEZhbHNlCiAgICAgICAgbmV3TW9kZXMgPSB7CiAgICAgICAgICAgICJzZWxlY3QiOiAiaW5TZWxlY3QiLAogICAgICAgICAgICAidGQiOiAiaW5DZWxsIiwKICAgICAgICAgICAgInRoIjogImluQ2VsbCIsCiAgICAgICAgICAgICJ0ciI6ICJpblJvdyIsCiAgICAgICAgICAgICJ0Ym9keSI6ICJpblRhYmxlQm9keSIsCiAgICAgICAgICAgICJ0aGVhZCI6ICJpblRhYmxlQm9keSIsCiAgICAgICAgICAgICJ0Zm9vdCI6ICJpblRhYmxlQm9keSIsCiAgICAgICAgICAgICJjYXB0aW9uIjogImluQ2FwdGlvbiIsCiAgICAgICAgICAgICJjb2xncm91cCI6ICJpbkNvbHVtbkdyb3VwIiwKICAgICAgICAgICAgInRhYmxlIjogImluVGFibGUiLAogICAgICAgICAgICAiaGVhZCI6ICJpbkJvZHkiLAogICAgICAgICAgICAiYm9keSI6ICJpbkJvZHkiLAogICAgICAgICAgICAiZnJhbWVzZXQiOiAiaW5GcmFtZXNldCIsCiAgICAgICAgICAgICJodG1sIjogImJlZm9yZUhlYWQiCiAgICAgICAgfQogICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5uYW1lCiAgICAgICAgICAgIG5ld19waGFzZSA9IE5vbmUKICAgICAgICAgICAgaWYgbm9kZSA9PSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzBdOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBsYXN0ID0gVHJ1ZQogICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBzZWxmLmlubmVySFRNTAogICAgICAgICAgICAjIENoZWNrIGZvciBjb25kaXRpb25zIHRoYXQgc2hvdWxkIG9ubHkgaGFwcGVuIGluIHRoZSBpbm5lckhUTUwKICAgICAgICAgICAgIyBjYXNlCiAgICAgICAgICAgIGlmIG5vZGVOYW1lIGluICgic2VsZWN0IiwgImNvbGdyb3VwIiwgImhlYWQiLCAiaHRtbCIpOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuaW5uZXJIVE1MCgogICAgICAgICAgICBpZiBub3QgbGFzdCBhbmQgbm9kZS5uYW1lc3BhY2UgIT0gc2VsZi50cmVlLmRlZmF1bHROYW1lc3BhY2U6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgbm9kZU5hbWUgaW4gbmV3TW9kZXM6CiAgICAgICAgICAgICAgICBuZXdfcGhhc2UgPSBzZWxmLnBoYXNlc1tuZXdNb2Rlc1tub2RlTmFtZV1dCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGxhc3Q6CiAgICAgICAgICAgICAgICBuZXdfcGhhc2UgPSBzZWxmLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHNlbGYucGhhc2UgPSBuZXdfcGhhc2UKCiAgICBkZWYgcGFyc2VSQ0RhdGFSYXd0ZXh0KHNlbGYsIHRva2VuLCBjb250ZW50VHlwZSk6CiAgICAgICAgIiIiR2VuZXJpYyBSQ0RBVEEvUkFXVEVYVCBQYXJzaW5nIGFsZ29yaXRobQogICAgICAgIGNvbnRlbnRUeXBlIC0gUkNEQVRBIG9yIFJBV1RFWFQKICAgICAgICAiIiIKICAgICAgICBhc3NlcnQgY29udGVudFR5cGUgaW4gKCJSQVdURVhUIiwgIlJDREFUQSIpCgogICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBpZiBjb250ZW50VHlwZSA9PSAiUkFXVEVYVCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5pemVyLnN0YXRlID0gc2VsZi50b2tlbml6ZXIucmF3dGV4dFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5yY2RhdGFTdGF0ZQoKICAgICAgICBzZWxmLm9yaWdpbmFsUGhhc2UgPSBzZWxmLnBoYXNlCgogICAgICAgIHNlbGYucGhhc2UgPSBzZWxmLnBoYXNlc1sidGV4dCJdCgoKQF91dGlscy5tZW1vaXplCmRlZiBnZXRQaGFzZXMoZGVidWcpOgogICAgZGVmIGxvZyhmdW5jdGlvbik6CiAgICAgICAgIiIiTG9nZ2VyIHRoYXQgcmVjb3JkcyB3aGljaCBwaGFzZSBwcm9jZXNzZXMgZWFjaCB0b2tlbiIiIgogICAgICAgIHR5cGVfbmFtZXMgPSBkaWN0KCh2YWx1ZSwga2V5KSBmb3Iga2V5LCB2YWx1ZSBpbgogICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXMuaXRlbXMoKSkKCiAgICAgICAgZGVmIHdyYXBwZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgaWYgZnVuY3Rpb24uX19uYW1lX18uc3RhcnRzd2l0aCgicHJvY2VzcyIpIGFuZCBsZW4oYXJncykgPiAwOgogICAgICAgICAgICAgICAgdG9rZW4gPSBhcmdzWzBdCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHsidHlwZSI6IHR5cGVfbmFtZXNbdG9rZW5bJ3R5cGUnXV19CiAgICAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGlmIHRva2VuWyd0eXBlJ10gaW4gdGFnVG9rZW5UeXBlczoKICAgICAgICAgICAgICAgICAgICBpbmZvWyJuYW1lIl0gPSB0b2tlblsnbmFtZSddCgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIubG9nLmFwcGVuZCgoc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0YXRlLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UuX19jbGFzc19fLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pKQogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHdyYXBwZWQKCiAgICBkZWYgZ2V0TWV0YWNsYXNzKHVzZV9tZXRhY2xhc3MsIG1ldGFjbGFzc19mdW5jKToKICAgICAgICBpZiB1c2VfbWV0YWNsYXNzOgogICAgICAgICAgICByZXR1cm4gbWV0aG9kX2RlY29yYXRvcl9tZXRhY2xhc3MobWV0YWNsYXNzX2Z1bmMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHR5cGUKCiAgICAjIHB5bGludDpkaXNhYmxlPXVudXNlZC1hcmd1bWVudAogICAgY2xhc3MgUGhhc2Uod2l0aF9tZXRhY2xhc3MoZ2V0TWV0YWNsYXNzKGRlYnVnLCBsb2cpKSk6CiAgICAgICAgIiIiQmFzZSBjbGFzcyBmb3IgaGVscGVyIG9iamVjdCB0aGF0IGltcGxlbWVudHMgZWFjaCBwaGFzZSBvZiBwcm9jZXNzaW5nCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBzZWxmLnBhcnNlciA9IHBhcnNlcgogICAgICAgICAgICBzZWxmLnRyZWUgPSB0cmVlCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgRm9yIG1vc3QgcGhhc2VzIHRoZSBmb2xsb3dpbmcgaXMgY29ycmVjdC4gV2hlcmUgaXQncyBub3QgaXQgd2lsbCBiZQogICAgICAgICAgICAjIG92ZXJyaWRkZW4uCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRDb21tZW50KHRva2VuLCBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXSkKCiAgICAgICAgZGVmIHByb2Nlc3NEb2N0eXBlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1kb2N0eXBlIikKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQoKICAgICAgICBkZWYgcHJvY2Vzc1N0YXJ0VGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhcnRUYWdIYW5kbGVyW3Rva2VuWyJuYW1lIl1dKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgbm90IHNlbGYucGFyc2VyLmZpcnN0U3RhcnRUYWcgYW5kIHRva2VuWyJuYW1lIl0gPT0gImh0bWwiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigibm9uLWh0bWwtcm9vdCIpCiAgICAgICAgICAgICMgWFhYIE5lZWQgYSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGUgZmlyc3Qgc3RhcnQgdGFnIHRva2VuIGVtaXR0ZWQgaXMKICAgICAgICAgICAgIyB0aGlzIHRva2VuLi4uIElmIGl0J3Mgbm90LCBpbnZva2Ugc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpLgogICAgICAgICAgICBmb3IgYXR0ciwgdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgYXR0ciBub3QgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1swXS5hdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMF0uYXR0cmlidXRlc1thdHRyXSA9IHZhbHVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZpcnN0U3RhcnRUYWcgPSBGYWxzZQoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmVuZFRhZ0hhbmRsZXJbdG9rZW5bIm5hbWUiXV0odG9rZW4pCgogICAgY2xhc3MgSW5pdGlhbFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5kb2N1bWVudCkKCiAgICAgICAgZGVmIHByb2Nlc3NEb2N0eXBlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgcHVibGljSWQgPSB0b2tlblsicHVibGljSWQiXQogICAgICAgICAgICBzeXN0ZW1JZCA9IHRva2VuWyJzeXN0ZW1JZCJdCiAgICAgICAgICAgIGNvcnJlY3QgPSB0b2tlblsiY29ycmVjdCJdCgogICAgICAgICAgICBpZiAobmFtZSAhPSAiaHRtbCIgb3IgcHVibGljSWQgaXMgbm90IE5vbmUgb3IKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCBpcyBub3QgTm9uZSBhbmQgc3lzdGVtSWQgIT0gImFib3V0OmxlZ2FjeS1jb21wYXQiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVua25vd24tZG9jdHlwZSIpCgogICAgICAgICAgICBpZiBwdWJsaWNJZCBpcyBOb25lOgogICAgICAgICAgICAgICAgcHVibGljSWQgPSAiIgoKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydERvY3R5cGUodG9rZW4pCgogICAgICAgICAgICBpZiBwdWJsaWNJZCAhPSAiIjoKICAgICAgICAgICAgICAgIHB1YmxpY0lkID0gcHVibGljSWQudHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpCgogICAgICAgICAgICBpZiAobm90IGNvcnJlY3Qgb3IgdG9rZW5bIm5hbWUiXSAhPSAiaHRtbCIgb3IKICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICAoIisvL3NpbG1hcmlsLy9kdGQgaHRtbCBwcm8gdjByMTEgMTk5NzAxMDEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vYWR2YXNvZnQgbHRkLy9kdGQgaHRtbCAzLjAgYXN3ZWRpdCArIGV4dGVuc2lvbnMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vYXMvL2R0ZCBodG1sIDMuMCBhc3dlZGl0ICsgZXh0ZW5zaW9ucy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAgbGV2ZWwgMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAgbGV2ZWwgMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAgc3RyaWN0IGxldmVsIDEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdCBsZXZlbCAyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBzdHJpY3QvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMWUvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMy4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDMuMiBmaW5hbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAzLjIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAwLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIGxldmVsIDEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgbGV2ZWwgMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAwLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAxLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9tZXRyaXVzLy9kdGQgbWV0cml1cyBwcmVzZW50YXRpb25hbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAyLjAgaHRtbCBzdHJpY3QvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMi4wIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMi4wIHRhYmxlcy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAzLjAgaHRtbCBzdHJpY3QvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMy4wIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMy4wIHRhYmxlcy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9uZXRzY2FwZSBjb21tLiBjb3JwLi8vZHRkIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbmV0c2NhcGUgY29tbS4gY29ycC4vL2R0ZCBzdHJpY3QgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9vJ3JlaWxseSBhbmQgYXNzb2NpYXRlcy8vZHRkIGh0bWwgMi4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL28ncmVpbGx5IGFuZCBhc3NvY2lhdGVzLy9kdGQgaHRtbCBleHRlbmRlZCAxLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbydyZWlsbHkgYW5kIGFzc29jaWF0ZXMvL2R0ZCBodG1sIGV4dGVuZGVkIHJlbGF4ZWQgMS4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3NvZnRxdWFkIHNvZnR3YXJlLy9kdGQgaG90bWV0YWwgcHJvIDYuMDo6MTk5OTA2MDE6OmV4dGVuc2lvbnMgdG8gaHRtbCA0LjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc29mdHF1YWQvL2R0ZCBob3RtZXRhbCBwcm8gNC4wOjoxOTk3MTAxMDo6ZXh0ZW5zaW9ucyB0byBodG1sIDQuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9zcHlnbGFzcy8vZHRkIGh0bWwgMi4wIGV4dGVuZGVkLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3NxLy9kdGQgaHRtbCAyLjAgaG90bWV0YWwgKyBleHRlbnNpb25zLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3N1biBtaWNyb3N5c3RlbXMgY29ycC4vL2R0ZCBob3RqYXZhIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc3VuIG1pY3Jvc3lzdGVtcyBjb3JwLi8vZHRkIGhvdGphdmEgc3RyaWN0IGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzIDE5OTUtMDMtMjQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzLjIgZHJhZnQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzLjIgZmluYWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzLjIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzLjJzIGRyYWZ0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgNC4wIGZyYW1lc2V0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIGV4cGVyaW1lbnRhbCAxOTk2MDcxMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIGV4cGVyaW1lbnRhbCA5NzA0MjEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgdzMgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M28vL2R0ZCB3MyBodG1sIDMuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93ZWJ0ZWNocy8vZHRkIG1vemlsbGEgaHRtbCAyLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vd2VidGVjaHMvL2R0ZCBtb3ppbGxhIGh0bWwvLyIpKSBvcgogICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkIGluICgiLS8vdzNvLy9kdGQgdzMgaHRtbCBzdHJpY3QgMy4wLy9lbi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0vdzNjL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbCIpIG9yCiAgICAgICAgICAgICAgICAgICAgcHVibGljSWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgKCItLy93M2MvL2R0ZCBodG1sIDQuMDEgZnJhbWVzZXQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCA0LjAxIHRyYW5zaXRpb25hbC8vIikpIGFuZAogICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkIGlzIE5vbmUgb3IKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCBhbmQgc3lzdGVtSWQubG93ZXIoKSA9PSAiaHR0cDovL3d3dy5pYm0uY29tL2RhdGEvZHRkL3YxMS9pYm14aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuY29tcGF0TW9kZSA9ICJxdWlya3MiCiAgICAgICAgICAgIGVsaWYgKHB1YmxpY0lkLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgKCItLy93M2MvL2R0ZCB4aHRtbCAxLjAgZnJhbWVzZXQvLyIsCiAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCB4aHRtbCAxLjAgdHJhbnNpdGlvbmFsLy8iKSkgb3IKICAgICAgICAgICAgICAgICAgcHVibGljSWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICgiLS8vdzNjLy9kdGQgaHRtbCA0LjAxIGZyYW1lc2V0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDQuMDEgdHJhbnNpdGlvbmFsLy8iKSkgYW5kCiAgICAgICAgICAgICAgICAgIHN5c3RlbUlkIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmNvbXBhdE1vZGUgPSAibGltaXRlZCBxdWlya3MiCgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYmVmb3JlSHRtbCJdCgogICAgICAgIGRlZiBhbnl0aGluZ0Vsc2Uoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLmNvbXBhdE1vZGUgPSAicXVpcmtzIgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYmVmb3JlSHRtbCJdCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1jaGFycyIpCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzU3RhcnRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3Qtc3RhcnQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtZW9mIikKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGNsYXNzIEJlZm9yZUh0bWxQaGFzZShQaGFzZSk6CiAgICAgICAgIyBoZWxwZXIgbWV0aG9kcwogICAgICAgIGRlZiBpbnNlcnRIdG1sRWxlbWVudChzZWxmKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFJvb3QoaW1wbGllZFRhZ1Rva2VuKCJodG1sIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJiZWZvcmVIZWFkIl0KCiAgICAgICAgIyBvdGhlcgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLmluc2VydEh0bWxFbGVtZW50KCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5kb2N1bWVudCkKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuaW5zZXJ0SHRtbEVsZW1lbnQoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NTdGFydFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0gPT0gImh0bWwiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZmlyc3RTdGFydFRhZyA9IFRydWUKICAgICAgICAgICAgc2VsZi5pbnNlcnRIdG1sRWxlbWVudCgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0gbm90IGluICgiaGVhZCIsICJib2R5IiwgImh0bWwiLCAiYnIiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1iZWZvcmUtaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5pbnNlcnRIdG1sRWxlbWVudCgpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBjbGFzcyBCZWZvcmVIZWFkUGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiaGVhZCIsIHNlbGYuc3RhcnRUYWdIZWFkKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoKCJoZWFkIiwgImJvZHkiLCAiaHRtbCIsICJiciIpLCBzZWxmLmVuZFRhZ0ltcGx5SGVhZCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGVhZChpbXBsaWVkVGFnVG9rZW4oImhlYWQiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIZWFkKGltcGxpZWRUYWdUb2tlbigiaGVhZCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUuaGVhZFBvaW50ZXIgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0KCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGVhZChpbXBsaWVkVGFnVG9rZW4oImhlYWQiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdJbXBseUhlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGVhZChpbXBsaWVkVGFnVG9rZW4oImhlYWQiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctYWZ0ZXItaW1wbGllZC1yb290IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICBjbGFzcyBJbkhlYWRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJ0aXRsZSIsIHNlbGYuc3RhcnRUYWdUaXRsZSksCiAgICAgICAgICAgICAgICAoKCJub2ZyYW1lcyIsICJzdHlsZSIpLCBzZWxmLnN0YXJ0VGFnTm9GcmFtZXNTdHlsZSksCiAgICAgICAgICAgICAgICAoIm5vc2NyaXB0Iiwgc2VsZi5zdGFydFRhZ05vc2NyaXB0KSwKICAgICAgICAgICAgICAgICgic2NyaXB0Iiwgc2VsZi5zdGFydFRhZ1NjcmlwdCksCiAgICAgICAgICAgICAgICAoKCJiYXNlIiwgImJhc2Vmb250IiwgImJnc291bmQiLCAiY29tbWFuZCIsICJsaW5rIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0Jhc2VMaW5rQ29tbWFuZCksCiAgICAgICAgICAgICAgICAoIm1ldGEiLCBzZWxmLnN0YXJ0VGFnTWV0YSksCiAgICAgICAgICAgICAgICAoImhlYWQiLCBzZWxmLnN0YXJ0VGFnSGVhZCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJoZWFkIiwgc2VsZi5lbmRUYWdIZWFkKSwKICAgICAgICAgICAgICAgICgoImJyIiwgImh0bWwiLCAiYm9keSIpLCBzZWxmLmVuZFRhZ0h0bWxCb2R5QnIpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIHRoZSByZWFsIHRoaW5nCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInR3by1oZWFkcy1hcmUtbm90LWJldHRlci10aGFuLW9uZSIpCgogICAgICAgIGRlZiBzdGFydFRhZ0Jhc2VMaW5rQ29tbWFuZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdNZXRhKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgICAgICBhdHRyaWJ1dGVzID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RyZWFtLmNoYXJFbmNvZGluZ1sxXSA9PSAidGVudGF0aXZlIjoKICAgICAgICAgICAgICAgIGlmICJjaGFyc2V0IiBpbiBhdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnRva2VuaXplci5zdHJlYW0uY2hhbmdlRW5jb2RpbmcoYXR0cmlidXRlc1siY2hhcnNldCJdKQogICAgICAgICAgICAgICAgZWxpZiAoImNvbnRlbnQiIGluIGF0dHJpYnV0ZXMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAiaHR0cC1lcXVpdiIgaW4gYXR0cmlidXRlcyBhbmQKICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbImh0dHAtZXF1aXYiXS5sb3dlcigpID09ICJjb250ZW50LXR5cGUiKToKICAgICAgICAgICAgICAgICAgICAjIEVuY29kaW5nIGl0IGFzIFVURi04IGhlcmUgaXMgYSBoYWNrLCBhcyByZWFsbHkgd2Ugc2hvdWxkIHBhc3MKICAgICAgICAgICAgICAgICAgICAjIHRoZSBhYnN0cmFjdCBVbmljb2RlIHN0cmluZywgYW5kIGp1c3QgdXNlIHRoZQogICAgICAgICAgICAgICAgICAgICMgQ29udGVudEF0dHJQYXJzZXIgb24gdGhhdCwgYnV0IHVzaW5nIFVURi04IGFsbG93cyBhbGwgY2hhcnMKICAgICAgICAgICAgICAgICAgICAjIHRvIGJlIGVuY29kZWQgYW5kIGFzIGEgQVNDSUktc3VwZXJzZXQgd29ya3MuCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IF9pbnB1dHN0cmVhbS5FbmNvZGluZ0J5dGVzKGF0dHJpYnV0ZXNbImNvbnRlbnQiXS5lbmNvZGUoInV0Zi04IikpCiAgICAgICAgICAgICAgICAgICAgcGFyc2VyID0gX2lucHV0c3RyZWFtLkNvbnRlbnRBdHRyUGFyc2VyKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgY29kZWMgPSBwYXJzZXIucGFyc2UoKQogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnRva2VuaXplci5zdHJlYW0uY2hhbmdlRW5jb2RpbmcoY29kZWMpCgogICAgICAgIGRlZiBzdGFydFRhZ1RpdGxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkNEQVRBIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9GcmFtZXNTdHlsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgTmVlZCB0byBkZWNpZGUgd2hldGhlciB0byBpbXBsZW1lbnQgdGhlIHNjcmlwdGluZy1kaXNhYmxlZCBjYXNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlUkNEYXRhUmF3dGV4dCh0b2tlbiwgIlJBV1RFWFQiKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb3NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnNjcmlwdGluZzoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlUkNEYXRhUmF3dGV4dCh0b2tlbiwgIlJBV1RFWFQiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkTm9zY3JpcHQiXQoKICAgICAgICBkZWYgc3RhcnRUYWdTY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0YXRlID0gc2VsZi5wYXJzZXIudG9rZW5pemVyLnNjcmlwdERhdGFTdGF0ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5vcmlnaW5hbFBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbInRleHQiXQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdIZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZSA9IHNlbGYucGFyc2VyLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGFzc2VydCBub2RlLm5hbWUgPT0gImhlYWQiLCAiRXhwZWN0ZWQgaGVhZCBnb3QgJXMiICUgbm9kZS5uYW1lCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJhZnRlckhlYWQiXQoKICAgICAgICBkZWYgZW5kVGFnSHRtbEJvZHlCcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgYW55dGhpbmdFbHNlKHNlbGYpOgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hlYWQoaW1wbGllZFRhZ1Rva2VuKCJoZWFkIikpCgogICAgY2xhc3MgSW5IZWFkTm9zY3JpcHRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCgiYmFzZWZvbnQiLCAiYmdzb3VuZCIsICJsaW5rIiwgIm1ldGEiLCAibm9mcmFtZXMiLCAic3R5bGUiKSwgc2VsZi5zdGFydFRhZ0Jhc2VMaW5rQ29tbWFuZCksCiAgICAgICAgICAgICAgICAoKCJoZWFkIiwgIm5vc2NyaXB0IiksIHNlbGYuc3RhcnRUYWdIZWFkTm9zY3JpcHQpLAogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoIm5vc2NyaXB0Iiwgc2VsZi5lbmRUYWdOb3NjcmlwdCksCiAgICAgICAgICAgICAgICAoImJyIiwgc2VsZi5lbmRUYWdCciksCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW9mLWluLWhlYWQtbm9zY3JpcHQiKQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NDb21tZW50KHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJjaGFyLWluLWhlYWQtbm9zY3JpcHQiKQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0Jhc2VMaW5rQ29tbWFuZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZE5vc2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWluaGVhZC1ub3NjcmlwdC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ05vc2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZSA9IHNlbGYucGFyc2VyLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGFzc2VydCBub2RlLm5hbWUgPT0gIm5vc2NyaXB0IiwgIkV4cGVjdGVkIG5vc2NyaXB0IGdvdCAlcyIgJSBub2RlLm5hbWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdCgogICAgICAgIGRlZiBlbmRUYWdCcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW5oZWFkLW5vc2NyaXB0LXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGFueXRoaW5nRWxzZShzZWxmKToKICAgICAgICAgICAgIyBDYWxsZXIgbXVzdCByYWlzZSBwYXJzZSBlcnJvciBmaXJzdCEKICAgICAgICAgICAgc2VsZi5lbmRUYWdOb3NjcmlwdChpbXBsaWVkVGFnVG9rZW4oIm5vc2NyaXB0IikpCgogICAgY2xhc3MgQWZ0ZXJIZWFkUGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiYm9keSIsIHNlbGYuc3RhcnRUYWdCb2R5KSwKICAgICAgICAgICAgICAgICgiZnJhbWVzZXQiLCBzZWxmLnN0YXJ0VGFnRnJhbWVzZXQpLAogICAgICAgICAgICAgICAgKCgiYmFzZSIsICJiYXNlZm9udCIsICJiZ3NvdW5kIiwgImxpbmsiLCAibWV0YSIsICJub2ZyYW1lcyIsICJzY3JpcHQiLAogICAgICAgICAgICAgICAgICAic3R5bGUiLCAidGl0bGUiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnRnJvbUhlYWQpLAogICAgICAgICAgICAgICAgKCJoZWFkIiwgc2VsZi5zdGFydFRhZ0hlYWQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWygoImJvZHkiLCAiaHRtbCIsICJiciIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnSHRtbEJvZHlCcildKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQm9keShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCgogICAgICAgIGRlZiBzdGFydFRhZ0ZyYW1lc2V0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkZyYW1lc2V0Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJvbUhlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1vdXQtb2YtbXktaGVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMuYXBwZW5kKHNlbGYudHJlZS5oZWFkUG9pbnRlcikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgPT0gImhlYWQiOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucmVtb3ZlKG5vZGUpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0h0bWxCb2R5QnIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGFueXRoaW5nRWxzZShzZWxmKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQoaW1wbGllZFRhZ1Rva2VuKCJib2R5IiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gVHJ1ZQoKICAgIGNsYXNzIEluQm9keVBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI3BhcnNpbmctbWFpbi1pbmJvZHkKICAgICAgICAjIHRoZSByZWFsbHktcmVhbGx5LXJlYWxseS12ZXJ5IGNyYXp5IG1vZGUKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgIyBTZXQgdGhpcyB0byB0aGUgZGVmYXVsdCBoYW5kbGVyCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyA9IHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc05vblByZQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJiYXNlIiwgImJhc2Vmb250IiwgImJnc291bmQiLCAiY29tbWFuZCIsICJsaW5rIiwgIm1ldGEiLAogICAgICAgICAgICAgICAgICAic2NyaXB0IiwgInN0eWxlIiwgInRpdGxlIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1Byb2Nlc3NJbkhlYWQpLAogICAgICAgICAgICAgICAgKCJib2R5Iiwgc2VsZi5zdGFydFRhZ0JvZHkpLAogICAgICAgICAgICAgICAgKCJmcmFtZXNldCIsIHNlbGYuc3RhcnRUYWdGcmFtZXNldCksCiAgICAgICAgICAgICAgICAoKCJhZGRyZXNzIiwgImFydGljbGUiLCAiYXNpZGUiLCAiYmxvY2txdW90ZSIsICJjZW50ZXIiLCAiZGV0YWlscyIsCiAgICAgICAgICAgICAgICAgICJkaXIiLCAiZGl2IiwgImRsIiwgImZpZWxkc2V0IiwgImZpZ2NhcHRpb24iLCAiZmlndXJlIiwKICAgICAgICAgICAgICAgICAgImZvb3RlciIsICJoZWFkZXIiLCAiaGdyb3VwIiwgIm1haW4iLCAibWVudSIsICJuYXYiLCAib2wiLCAicCIsCiAgICAgICAgICAgICAgICAgICJzZWN0aW9uIiwgInN1bW1hcnkiLCAidWwiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnQ2xvc2VQKSwKICAgICAgICAgICAgICAgIChoZWFkaW5nRWxlbWVudHMsIHNlbGYuc3RhcnRUYWdIZWFkaW5nKSwKICAgICAgICAgICAgICAgICgoInByZSIsICJsaXN0aW5nIiksIHNlbGYuc3RhcnRUYWdQcmVMaXN0aW5nKSwKICAgICAgICAgICAgICAgICgiZm9ybSIsIHNlbGYuc3RhcnRUYWdGb3JtKSwKICAgICAgICAgICAgICAgICgoImxpIiwgImRkIiwgImR0IiksIHNlbGYuc3RhcnRUYWdMaXN0SXRlbSksCiAgICAgICAgICAgICAgICAoInBsYWludGV4dCIsIHNlbGYuc3RhcnRUYWdQbGFpbnRleHQpLAogICAgICAgICAgICAgICAgKCJhIiwgc2VsZi5zdGFydFRhZ0EpLAogICAgICAgICAgICAgICAgKCgiYiIsICJiaWciLCAiY29kZSIsICJlbSIsICJmb250IiwgImkiLCAicyIsICJzbWFsbCIsICJzdHJpa2UiLAogICAgICAgICAgICAgICAgICAic3Ryb25nIiwgInR0IiwgInUiKSwgc2VsZi5zdGFydFRhZ0Zvcm1hdHRpbmcpLAogICAgICAgICAgICAgICAgKCJub2JyIiwgc2VsZi5zdGFydFRhZ05vYnIpLAogICAgICAgICAgICAgICAgKCJidXR0b24iLCBzZWxmLnN0YXJ0VGFnQnV0dG9uKSwKICAgICAgICAgICAgICAgICgoImFwcGxldCIsICJtYXJxdWVlIiwgIm9iamVjdCIpLCBzZWxmLnN0YXJ0VGFnQXBwbGV0TWFycXVlZU9iamVjdCksCiAgICAgICAgICAgICAgICAoInhtcCIsIHNlbGYuc3RhcnRUYWdYbXApLAogICAgICAgICAgICAgICAgKCJ0YWJsZSIsIHNlbGYuc3RhcnRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJhcmVhIiwgImJyIiwgImVtYmVkIiwgImltZyIsICJrZXlnZW4iLCAid2JyIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1ZvaWRGb3JtYXR0aW5nKSwKICAgICAgICAgICAgICAgICgoInBhcmFtIiwgInNvdXJjZSIsICJ0cmFjayIpLCBzZWxmLnN0YXJ0VGFnUGFyYW1Tb3VyY2UpLAogICAgICAgICAgICAgICAgKCJpbnB1dCIsIHNlbGYuc3RhcnRUYWdJbnB1dCksCiAgICAgICAgICAgICAgICAoImhyIiwgc2VsZi5zdGFydFRhZ0hyKSwKICAgICAgICAgICAgICAgICgiaW1hZ2UiLCBzZWxmLnN0YXJ0VGFnSW1hZ2UpLAogICAgICAgICAgICAgICAgKCJpc2luZGV4Iiwgc2VsZi5zdGFydFRhZ0lzSW5kZXgpLAogICAgICAgICAgICAgICAgKCJ0ZXh0YXJlYSIsIHNlbGYuc3RhcnRUYWdUZXh0YXJlYSksCiAgICAgICAgICAgICAgICAoImlmcmFtZSIsIHNlbGYuc3RhcnRUYWdJRnJhbWUpLAogICAgICAgICAgICAgICAgKCJub3NjcmlwdCIsIHNlbGYuc3RhcnRUYWdOb3NjcmlwdCksCiAgICAgICAgICAgICAgICAoKCJub2VtYmVkIiwgIm5vZnJhbWVzIiksIHNlbGYuc3RhcnRUYWdSYXd0ZXh0KSwKICAgICAgICAgICAgICAgICgic2VsZWN0Iiwgc2VsZi5zdGFydFRhZ1NlbGVjdCksCiAgICAgICAgICAgICAgICAoKCJycCIsICJydCIpLCBzZWxmLnN0YXJ0VGFnUnBSdCksCiAgICAgICAgICAgICAgICAoKCJvcHRpb24iLCAib3B0Z3JvdXAiKSwgc2VsZi5zdGFydFRhZ09wdCksCiAgICAgICAgICAgICAgICAoKCJtYXRoIiksIHNlbGYuc3RhcnRUYWdNYXRoKSwKICAgICAgICAgICAgICAgICgoInN2ZyIpLCBzZWxmLnN0YXJ0VGFnU3ZnKSwKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImZyYW1lIiwgImhlYWQiLAogICAgICAgICAgICAgICAgICAidGJvZHkiLCAidGQiLCAidGZvb3QiLCAidGgiLCAidGhlYWQiLAogICAgICAgICAgICAgICAgICAidHIiKSwgc2VsZi5zdGFydFRhZ01pc3BsYWNlZCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJib2R5Iiwgc2VsZi5lbmRUYWdCb2R5KSwKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuZW5kVGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJhZGRyZXNzIiwgImFydGljbGUiLCAiYXNpZGUiLCAiYmxvY2txdW90ZSIsICJidXR0b24iLCAiY2VudGVyIiwKICAgICAgICAgICAgICAgICAgImRldGFpbHMiLCAiZGlhbG9nIiwgImRpciIsICJkaXYiLCAiZGwiLCAiZmllbGRzZXQiLCAiZmlnY2FwdGlvbiIsICJmaWd1cmUiLAogICAgICAgICAgICAgICAgICAiZm9vdGVyIiwgImhlYWRlciIsICJoZ3JvdXAiLCAibGlzdGluZyIsICJtYWluIiwgIm1lbnUiLCAibmF2IiwgIm9sIiwgInByZSIsCiAgICAgICAgICAgICAgICAgICJzZWN0aW9uIiwgInN1bW1hcnkiLCAidWwiKSwgc2VsZi5lbmRUYWdCbG9jayksCiAgICAgICAgICAgICAgICAoImZvcm0iLCBzZWxmLmVuZFRhZ0Zvcm0pLAogICAgICAgICAgICAgICAgKCJwIiwgc2VsZi5lbmRUYWdQKSwKICAgICAgICAgICAgICAgICgoImRkIiwgImR0IiwgImxpIiksIHNlbGYuZW5kVGFnTGlzdEl0ZW0pLAogICAgICAgICAgICAgICAgKGhlYWRpbmdFbGVtZW50cywgc2VsZi5lbmRUYWdIZWFkaW5nKSwKICAgICAgICAgICAgICAgICgoImEiLCAiYiIsICJiaWciLCAiY29kZSIsICJlbSIsICJmb250IiwgImkiLCAibm9iciIsICJzIiwgInNtYWxsIiwKICAgICAgICAgICAgICAgICAgInN0cmlrZSIsICJzdHJvbmciLCAidHQiLCAidSIpLCBzZWxmLmVuZFRhZ0Zvcm1hdHRpbmcpLAogICAgICAgICAgICAgICAgKCgiYXBwbGV0IiwgIm1hcnF1ZWUiLCAib2JqZWN0IiksIHNlbGYuZW5kVGFnQXBwbGV0TWFycXVlZU9iamVjdCksCiAgICAgICAgICAgICAgICAoImJyIiwgc2VsZi5lbmRUYWdCciksCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgaXNNYXRjaGluZ0Zvcm1hdHRpbmdFbGVtZW50KHNlbGYsIG5vZGUxLCBub2RlMik6CiAgICAgICAgICAgIHJldHVybiAobm9kZTEubmFtZSA9PSBub2RlMi5uYW1lIGFuZAogICAgICAgICAgICAgICAgICAgIG5vZGUxLm5hbWVzcGFjZSA9PSBub2RlMi5uYW1lc3BhY2UgYW5kCiAgICAgICAgICAgICAgICAgICAgbm9kZTEuYXR0cmlidXRlcyA9PSBub2RlMi5hdHRyaWJ1dGVzKQoKICAgICAgICAjIGhlbHBlcgogICAgICAgIGRlZiBhZGRGb3JtYXR0aW5nRWxlbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBlbGVtZW50ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KCiAgICAgICAgICAgIG1hdGNoaW5nRWxlbWVudHMgPSBbXQogICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICAgICAgaWYgbm9kZSBpcyBNYXJrZXI6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5pc01hdGNoaW5nRm9ybWF0dGluZ0VsZW1lbnQobm9kZSwgZWxlbWVudCk6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdFbGVtZW50cy5hcHBlbmQobm9kZSkKCiAgICAgICAgICAgIGFzc2VydCBsZW4obWF0Y2hpbmdFbGVtZW50cykgPD0gMwogICAgICAgICAgICBpZiBsZW4obWF0Y2hpbmdFbGVtZW50cykgPT0gMzoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlKG1hdGNoaW5nRWxlbWVudHNbLTFdKQogICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmFwcGVuZChlbGVtZW50KQoKICAgICAgICAjIHRoZSByZWFsIGRlYWwKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgYWxsb3dlZF9lbGVtZW50cyA9IGZyb3plbnNldCgoImRkIiwgImR0IiwgImxpIiwgInAiLCAidGJvZHkiLCAidGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGZvb3QiLCAidGgiLCAidGhlYWQiLCAidHIiLCAiYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sIikpCiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgbm90IGluIGFsbG93ZWRfZWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1lb2YiKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICMgU3RvcCBwYXJzaW5nCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzRHJvcE5ld2xpbmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFNvbWV0aW1lcyAoc3RhcnQgb2YgPHByZT4sIDxsaXN0aW5nPiwgYW5kIDx0ZXh0YXJlYT4gYmxvY2tzKSB3ZQogICAgICAgICAgICAjIHdhbnQgdG8gZHJvcCBsZWFkaW5nIG5ld2xpbmVzCiAgICAgICAgICAgIGRhdGEgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyA9IHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc05vblByZQogICAgICAgICAgICBpZiAoZGF0YS5zdGFydHN3aXRoKCJcbiIpIGFuZAogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSBpbiAoInByZSIsICJsaXN0aW5nIiwgInRleHRhcmVhIikgYW5kCiAgICAgICAgICAgICAgICAgICAgbm90IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLmhhc0NvbnRlbnQoKSk6CiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVsxOl0KICAgICAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dChkYXRhKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsiZGF0YSJdID09ICJcdTAwMDAiOgogICAgICAgICAgICAgICAgIyBUaGUgdG9rZW5pemVyIHNob3VsZCBhbHdheXMgZW1pdCBudWxsIG9uIGl0cyBvd24KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQogICAgICAgICAgICAjIFRoaXMgbXVzdCBiZSBiYWQgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgICAgIGlmIChzZWxmLnBhcnNlci5mcmFtZXNldE9LIGFuZAogICAgICAgICAgICAgICAgYW55KFtjaGFyIG5vdCBpbiBzcGFjZUNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgZm9yIGNoYXIgaW4gdG9rZW5bImRhdGEiXV0pKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc05vblByZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCgogICAgICAgIGRlZiBzdGFydFRhZ1Byb2Nlc3NJbkhlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0JvZHkoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6ICJib2R5In0pCiAgICAgICAgICAgIGlmIChsZW4oc2VsZi50cmVlLm9wZW5FbGVtZW50cykgPT0gMSBvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0ubmFtZSAhPSAiYm9keSIpOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgICAgICBmb3IgYXR0ciwgdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgIGlmIGF0dHIgbm90IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0uYXR0cmlidXRlczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5hdHRyaWJ1dGVzW2F0dHJdID0gdmFsdWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJhbWVzZXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6ICJmcmFtZXNldCJ9KQogICAgICAgICAgICBpZiAobGVuKHNlbGYudHJlZS5vcGVuRWxlbWVudHMpID09IDEgb3Igc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5uYW1lICE9ICJib2R5Iik6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgIGVsaWYgbm90IHNlbGYucGFyc2VyLmZyYW1lc2V0T0s6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLnBhcmVudDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLnBhcmVudC5yZW1vdmVDaGlsZChzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdKQogICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiaHRtbCI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5GcmFtZXNldCJdCgogICAgICAgIGRlZiBzdGFydFRhZ0Nsb3NlUChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnUHJlTGlzdGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyA9IHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc0Ryb3BOZXdsaW5lCgogICAgICAgIGRlZiBzdGFydFRhZ0Zvcm0oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZm9ybVBvaW50ZXI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6ICJmb3JtIn0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5mb3JtUG9pbnRlciA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCgogICAgICAgIGRlZiBzdGFydFRhZ0xpc3RJdGVtKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgICAgICBzdG9wTmFtZXNNYXAgPSB7ImxpIjogWyJsaSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImR0IjogWyJkdCIsICJkZCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRkIjogWyJkdCIsICJkZCJdfQogICAgICAgICAgICBzdG9wTmFtZXMgPSBzdG9wTmFtZXNNYXBbdG9rZW5bIm5hbWUiXV0KICAgICAgICAgICAgZm9yIG5vZGUgaW4gcmV2ZXJzZWQoc2VsZi50cmVlLm9wZW5FbGVtZW50cyk6CiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgaW4gc3RvcE5hbWVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NFbmRUYWcoCiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpZWRUYWdUb2tlbihub2RlLm5hbWUsICJFbmRUYWciKSkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgKG5vZGUubmFtZVR1cGxlIGluIHNwZWNpYWxFbGVtZW50cyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lIG5vdCBpbiAoImFkZHJlc3MiLCAiZGl2IiwgInAiKSk6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZygKICAgICAgICAgICAgICAgICAgICBpbXBsaWVkVGFnVG9rZW4oInAiLCAiRW5kVGFnIikpCgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnUGxhaW50ZXh0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnBhcnNlci50b2tlbml6ZXIucGxhaW50ZXh0U3RhdGUKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lIGluIGhlYWRpbmdFbGVtZW50czoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdBKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgYWZlQUVsZW1lbnQgPSBzZWxmLnRyZWUuZWxlbWVudEluQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCJhIikKICAgICAgICAgICAgaWYgYWZlQUVsZW1lbnQ6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InN0YXJ0TmFtZSI6ICJhIiwgImVuZE5hbWUiOiAiYSJ9KQogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdGb3JtYXR0aW5nKGltcGxpZWRUYWdUb2tlbigiYSIpKQogICAgICAgICAgICAgICAgaWYgYWZlQUVsZW1lbnQgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnJlbW92ZShhZmVBRWxlbWVudCkKICAgICAgICAgICAgICAgIGlmIGFmZUFFbGVtZW50IGluIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmUoYWZlQUVsZW1lbnQpCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYuYWRkRm9ybWF0dGluZ0VsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0Zvcm1hdHRpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLmFkZEZvcm1hdHRpbmdFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb2JyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJub2JyIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InN0YXJ0TmFtZSI6ICJub2JyIiwgImVuZE5hbWUiOiAibm9iciJ9KQogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigibm9iciIpKQogICAgICAgICAgICAgICAgIyBYWFggTmVlZCB0ZXN0cyB0aGF0IHRyaWdnZXIgdGhlIGZvbGxvd2luZwogICAgICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5hZGRGb3JtYXR0aW5nRWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQnV0dG9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic3RhcnROYW1lIjogImJ1dHRvbiIsICJlbmROYW1lIjogImJ1dHRvbiJ9KQogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigiYnV0dG9uIikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICBkZWYgc3RhcnRUYWdBcHBsZXRNYXJxdWVlT2JqZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYXBwZW5kKE1hcmtlcikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ1htcChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkFXVEVYVCIpCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuY29tcGF0TW9kZSAhPSAicXVpcmtzIjoKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdCgogICAgICAgIGRlZiBzdGFydFRhZ1ZvaWRGb3JtYXR0aW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICBkZWYgc3RhcnRUYWdJbnB1dChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGZyYW1lc2V0T0sgPSBzZWxmLnBhcnNlci5mcmFtZXNldE9LCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdWb2lkRm9ybWF0dGluZyh0b2tlbikKICAgICAgICAgICAgaWYgKCJ0eXBlIiBpbiB0b2tlblsiZGF0YSJdIGFuZAogICAgICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl1bInR5cGUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikgPT0gImhpZGRlbiIpOgogICAgICAgICAgICAgICAgIyBpbnB1dCB0eXBlPWhpZGRlbiBkb2Vzbid0IGNoYW5nZSBmcmFtZXNldE9LCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gZnJhbWVzZXRPSwoKICAgICAgICBkZWYgc3RhcnRUYWdQYXJhbVNvdXJjZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdIcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0ltYWdlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBObyByZWFsbHkuLi4KICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctdHJlYXRlZC1hcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJvcmlnaW5hbE5hbWUiOiAiaW1hZ2UiLCAibmV3TmFtZSI6ICJpbWcifSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJpbWciLCAiU3RhcnRUYWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcz10b2tlblsiZGF0YSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZkNsb3Npbmc9dG9rZW5bInNlbGZDbG9zaW5nIl0pKQoKICAgICAgICBkZWYgc3RhcnRUYWdJc0luZGV4KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZGVwcmVjYXRlZC10YWciLCB7Im5hbWUiOiAiaXNpbmRleCJ9KQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZm9ybVBvaW50ZXI6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZm9ybV9hdHRycyA9IHt9CiAgICAgICAgICAgIGlmICJhY3Rpb24iIGluIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgICAgICBmb3JtX2F0dHJzWyJhY3Rpb24iXSA9IHRva2VuWyJkYXRhIl1bImFjdGlvbiJdCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigiZm9ybSIsICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzPWZvcm1fYXR0cnMpKQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTdGFydFRhZyhpbXBsaWVkVGFnVG9rZW4oImhyIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigibGFiZWwiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgIyBYWFggTG9jYWxpemF0aW9uIC4uLgogICAgICAgICAgICBpZiAicHJvbXB0IiBpbiB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICAgICAgcHJvbXB0ID0gdG9rZW5bImRhdGEiXVsicHJvbXB0Il0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByb21wdCA9ICJUaGlzIGlzIGEgc2VhcmNoYWJsZSBpbmRleC4gRW50ZXIgc2VhcmNoIGtleXdvcmRzOiAiCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0NoYXJhY3RlcnMoCiAgICAgICAgICAgICAgICB7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogcHJvbXB0fSkKICAgICAgICAgICAgYXR0cmlidXRlcyA9IHRva2VuWyJkYXRhIl0uY29weSgpCiAgICAgICAgICAgIGlmICJhY3Rpb24iIGluIGF0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICBkZWwgYXR0cmlidXRlc1siYWN0aW9uIl0KICAgICAgICAgICAgaWYgInByb21wdCIgaW4gYXR0cmlidXRlczoKICAgICAgICAgICAgICAgIGRlbCBhdHRyaWJ1dGVzWyJwcm9tcHQiXQogICAgICAgICAgICBhdHRyaWJ1dGVzWyJuYW1lIl0gPSAiaXNpbmRleCIKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJpbnB1dCIsICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzPWF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmQ2xvc2luZz10b2tlblsic2VsZkNsb3NpbmciXSkpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oImxhYmVsIikpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigiaHIiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigiZm9ybSIpKQoKICAgICAgICBkZWYgc3RhcnRUYWdUZXh0YXJlYShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnBhcnNlci50b2tlbml6ZXIucmNkYXRhU3RhdGUKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzRHJvcE5ld2xpbmUKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0lGcmFtZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnUmF3dGV4dCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9zY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5zY3JpcHRpbmc6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnUmF3dGV4dCh0b2tlbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdPdGhlcih0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnUmF3dGV4dChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICIiImlmcmFtZSwgbm9lbWJlZCBub2ZyYW1lcywgbm9zY3JpcHQoaWYgc2NyaXB0aW5nIGVuYWJsZWQpIiIiCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlUkNEYXRhUmF3dGV4dCh0b2tlbiwgIlJBV1RFWFQiKQoKICAgICAgICBkZWYgc3RhcnRUYWdPcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRpb24iOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oIm9wdGlvbiIpKQogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1NlbGVjdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIucGhhc2UgaW4gKHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNhcHRpb24iXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Db2x1bW5Hcm91cCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlQm9keSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblJvdyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNlbGwiXSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3RJblRhYmxlIl0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdCJdCgogICAgICAgIGRlZiBzdGFydFRhZ1JwUnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInJ1YnkiKToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gInJ1YnkiOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTWF0aChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdE1hdGhNTEF0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICB0b2tlblsibmFtZXNwYWNlIl0gPSBuYW1lc3BhY2VzWyJtYXRobWwiXQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgIyBOZWVkIHRvIGdldCB0aGUgcGFyc2UgZXJyb3IgcmlnaHQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB0b2tlbgogICAgICAgICAgICAjIGhhcyBhIG5hbWVzcGFjZSBub3QgZXF1YWwgdG8gdGhlIHhtbG5zIGF0dHJpYnV0ZQogICAgICAgICAgICBpZiB0b2tlblsic2VsZkNsb3NpbmciXToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdTdmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RTVkdBdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RGb3JlaWduQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgdG9rZW5bIm5hbWVzcGFjZSJdID0gbmFtZXNwYWNlc1sic3ZnIl0KICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICMgTmVlZCB0byBnZXQgdGhlIHBhcnNlIGVycm9yIHJpZ2h0IGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdG9rZW4KICAgICAgICAgICAgIyBoYXMgYSBuYW1lc3BhY2Ugbm90IGVxdWFsIHRvIHRoZSB4bWxucyBhdHRyaWJ1dGUKICAgICAgICAgICAgaWYgdG9rZW5bInNlbGZDbG9zaW5nIl06CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnTWlzcGxhY2VkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIiIiIEVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGNoaWxkcmVuIG9mIG90aGVyIGVsZW1lbnRzIHRoYXQgaGF2ZSBhCiAgICAgICAgICAgIGRpZmZlcmVudCBpbnNlcnRpb24gbW9kZTsgaGVyZSB0aGV5IGFyZSBpZ25vcmVkCiAgICAgICAgICAgICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJmcmFtZSIsICJmcmFtZXNldCIsICJoZWFkIiwKICAgICAgICAgICAgIm9wdGlvbiIsICJvcHRncm91cCIsICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsICJ0aGVhZCIsCiAgICAgICAgICAgICJ0ciIsICJub3NjcmlwdCIKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWlnbm9yZWQiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ1Aoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnQ2xvc2VQKGltcGxpZWRUYWdUb2tlbigicCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogInAifSkKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiLCAiRW5kVGFnIikpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygicCIpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJwIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiAicCJ9KQogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUubmFtZSAhPSAicCI6CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIGVuZFRhZ0JvZHkoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJib2R5Iik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImJvZHkiOgogICAgICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1syOl06CiAgICAgICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lIG5vdCBpbiBmcm96ZW5zZXQoKCJkZCIsICJkdCIsICJsaSIsICJvcHRncm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24iLCAicCIsICJycCIsICJydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aCIsICJ0aGVhZCIsICJ0ciIsICJib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWwiKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgTm90IHN1cmUgdGhpcyBpcyB0aGUgY29ycmVjdCBuYW1lIGZvciB0aGUgcGFyc2UgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1vbmUtZW5kLXRhZy1idXQtZ290LWFub3RoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJnb3ROYW1lIjogImJvZHkiLCAiZXhwZWN0ZWROYW1lIjogbm9kZS5uYW1lfSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImFmdGVyQm9keSJdCgogICAgICAgIGRlZiBlbmRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBXZSByZXBlYXQgdGhlIHRlc3QgZm9yIHRoZSBib2R5IGVuZCB0YWcgdG9rZW4gYmVpbmcgaWdub3JlZCBoZXJlCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgiYm9keSIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdCb2R5KGltcGxpZWRUYWdUb2tlbigiYm9keSIpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdCbG9jayhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgUHV0IHVzIGJhY2sgaW4gdGhlIHJpZ2h0IHdoaXRlc3BhY2UgaGFuZGxpbmcgbW9kZQogICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdID09ICJwcmUiOgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzTm9uUHJlCiAgICAgICAgICAgIGluU2NvcGUgPSBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgaWYgaW5TY29wZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW5kLXRhZy10b28tZWFybHkiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgaWYgaW5TY29wZToKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB3aGlsZSBub2RlLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgZW5kVGFnRm9ybShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUuZm9ybVBvaW50ZXIKICAgICAgICAgICAgc2VsZi50cmVlLmZvcm1Qb2ludGVyID0gTm9uZQogICAgICAgICAgICBpZiBub2RlIGlzIE5vbmUgb3Igbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZShub2RlKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJmb3JtIn0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXSAhPSBub2RlOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctdG9vLWVhcmx5LWlnbm9yZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogImZvcm0ifSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucmVtb3ZlKG5vZGUpCgogICAgICAgIGRlZiBlbmRUYWdMaXN0SXRlbShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0gPT0gImxpIjoKICAgICAgICAgICAgICAgIHZhcmlhbnQgPSAibGlzdCIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhcmlhbnQgPSBOb25lCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD12YXJpYW50KToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoZXhjbHVkZT10b2tlblsibmFtZSJdKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJlbmQtdGFnLXRvby1lYXJseSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBlbmRUYWdIZWFkaW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaGVhZGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKGl0ZW0pOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLXRvby1lYXJseSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaGVhZGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKGl0ZW0pOgogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgaXRlbS5uYW1lIG5vdCBpbiBoZWFkaW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZGVmIGVuZFRhZ0Zvcm1hdHRpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAiIiJUaGUgbXVjaC1mZWFyZWQgYWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobSIiIgogICAgICAgICAgICAjIGh0dHA6Ly9zdm4ud2hhdHdnLm9yZy93ZWJhcHBzL2NvbXBsZXRlLmh0bWwjYWRvcHRpb25BZ2VuY3kgcmV2aXNpb24gNzg2NwogICAgICAgICAgICAjIFhYWCBCZXR0ZXIgcGFyc2VFcnJvciBtZXNzYWdlcyBhcHByZWNpYXRlZC4KCiAgICAgICAgICAgICMgU3RlcCAxCiAgICAgICAgICAgIG91dGVyTG9vcENvdW50ZXIgPSAwCgogICAgICAgICAgICAjIFN0ZXAgMgogICAgICAgICAgICB3aGlsZSBvdXRlckxvb3BDb3VudGVyIDwgODoKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMwogICAgICAgICAgICAgICAgb3V0ZXJMb29wQ291bnRlciArPSAxCgogICAgICAgICAgICAgICAgIyBTdGVwIDQ6CgogICAgICAgICAgICAgICAgIyBMZXQgdGhlIGZvcm1hdHRpbmcgZWxlbWVudCBiZSB0aGUgbGFzdCBlbGVtZW50IGluCiAgICAgICAgICAgICAgICAjIHRoZSBsaXN0IG9mIGFjdGl2ZSBmb3JtYXR0aW5nIGVsZW1lbnRzIHRoYXQ6CiAgICAgICAgICAgICAgICAjIC0gaXMgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCB0aGUgbGFzdCBzY29wZQogICAgICAgICAgICAgICAgIyBtYXJrZXIgaW4gdGhlIGxpc3QsIGlmIGFueSwgb3IgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0CiAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgYW5kCiAgICAgICAgICAgICAgICAjIC0gaGFzIHRoZSBzYW1lIHRhZyBuYW1lIGFzIHRoZSB0b2tlbi4KICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdFbGVtZW50ID0gc2VsZi50cmVlLmVsZW1lbnRJbkFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygKICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdKQogICAgICAgICAgICAgICAgaWYgKG5vdCBmb3JtYXR0aW5nRWxlbWVudCBvcgogICAgICAgICAgICAgICAgICAgIChmb3JtYXR0aW5nRWxlbWVudCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzIGFuZAogICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKGZvcm1hdHRpbmdFbGVtZW50Lm5hbWUpKSk6CiAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUsIHRoZW4gYWJvcnQgdGhlc2Ugc3RlcHMKICAgICAgICAgICAgICAgICAgICAjIGFuZCBpbnN0ZWFkIGFjdCBhcyBkZXNjcmliZWQgaW4gdGhlICJhbnkgb3RoZXIKICAgICAgICAgICAgICAgICAgICAjIGVuZCB0YWciIGVudHJ5IGJlbG93LgogICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnT3RoZXIodG9rZW4pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgIyBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIHN1Y2ggYSBub2RlLCBidXQgdGhhdCBub2RlIGlzCiAgICAgICAgICAgICAgICAjIG5vdCBpbiB0aGUgc3RhY2sgb2Ygb3BlbiBlbGVtZW50cywgdGhlbiB0aGlzIGlzIGEKICAgICAgICAgICAgICAgICMgcGFyc2UgZXJyb3I7IHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBsaXN0LCBhbmQKICAgICAgICAgICAgICAgICMgYWJvcnQgdGhlc2Ugc3RlcHMuCiAgICAgICAgICAgICAgICBlbGlmIGZvcm1hdHRpbmdFbGVtZW50IG5vdCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImFkb3B0aW9uLWFnZW5jeS0xLjIiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZShmb3JtYXR0aW5nRWxlbWVudCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgc3VjaCBhIG5vZGUsIGFuZCB0aGF0IG5vZGUgaXMKICAgICAgICAgICAgICAgICMgYWxzbyBpbiB0aGUgc3RhY2sgb2Ygb3BlbiBlbGVtZW50cywgYnV0IHRoZSBlbGVtZW50CiAgICAgICAgICAgICAgICAjIGlzIG5vdCBpbiBzY29wZSwgdGhlbiB0aGlzIGlzIGEgcGFyc2UgZXJyb3I7IGlnbm9yZQogICAgICAgICAgICAgICAgIyB0aGUgdG9rZW4sIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KICAgICAgICAgICAgICAgIGVsaWYgbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZShmb3JtYXR0aW5nRWxlbWVudC5uYW1lKToKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJhZG9wdGlvbi1hZ2VuY3ktNC40IiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgIyBPdGhlcndpc2UsIHRoZXJlIGlzIGEgZm9ybWF0dGluZyBlbGVtZW50IGFuZCB0aGF0CiAgICAgICAgICAgICAgICAjIGVsZW1lbnQgaXMgaW4gdGhlIHN0YWNrIGFuZCBpcyBpbiBzY29wZS4gSWYgdGhlCiAgICAgICAgICAgICAgICAjIGVsZW1lbnQgaXMgbm90IHRoZSBjdXJyZW50IG5vZGUsIHRoaXMgaXMgYSBwYXJzZQogICAgICAgICAgICAgICAgIyBlcnJvci4gSW4gYW55IGNhc2UsIHByb2NlZWQgd2l0aCB0aGUgYWxnb3JpdGhtIGFzCiAgICAgICAgICAgICAgICAjIHdyaXR0ZW4gaW4gdGhlIGZvbGxvd2luZyBzdGVwcy4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgZm9ybWF0dGluZ0VsZW1lbnQgIT0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV06CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImFkb3B0aW9uLWFnZW5jeS0xLjMiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgNToKCiAgICAgICAgICAgICAgICAjIExldCB0aGUgZnVydGhlc3QgYmxvY2sgYmUgdGhlIHRvcG1vc3Qgbm9kZSBpbiB0aGUKICAgICAgICAgICAgICAgICMgc3RhY2sgb2Ygb3BlbiBlbGVtZW50cyB0aGF0IGlzIGxvd2VyIGluIHRoZSBzdGFjawogICAgICAgICAgICAgICAgIyB0aGFuIHRoZSBmb3JtYXR0aW5nIGVsZW1lbnQsIGFuZCBpcyBhbiBlbGVtZW50IGluCiAgICAgICAgICAgICAgICAjIHRoZSBzcGVjaWFsIGNhdGVnb3J5LiBUaGVyZSBtaWdodCBub3QgYmUgb25lLgogICAgICAgICAgICAgICAgYWZlSW5kZXggPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluZGV4KGZvcm1hdHRpbmdFbGVtZW50KQogICAgICAgICAgICAgICAgZnVydGhlc3RCbG9jayA9IE5vbmUKICAgICAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbYWZlSW5kZXg6XToKICAgICAgICAgICAgICAgICAgICBpZiBlbGVtZW50Lm5hbWVUdXBsZSBpbiBzcGVjaWFsRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1cnRoZXN0QmxvY2sgPSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgIyBTdGVwIDY6CgogICAgICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBmdXJ0aGVzdCBibG9jaywgdGhlbiB0aGUgVUEgbXVzdAogICAgICAgICAgICAgICAgIyBmaXJzdCBwb3AgYWxsIHRoZSBub2RlcyBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrCiAgICAgICAgICAgICAgICAjIG9mIG9wZW4gZWxlbWVudHMsIGZyb20gdGhlIGN1cnJlbnQgbm9kZSB1cCB0byBhbmQKICAgICAgICAgICAgICAgICMgaW5jbHVkaW5nIHRoZSBmb3JtYXR0aW5nIGVsZW1lbnQsIHRoZW4gcmVtb3ZlIHRoZQogICAgICAgICAgICAgICAgIyBmb3JtYXR0aW5nIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUKICAgICAgICAgICAgICAgICMgZm9ybWF0dGluZyBlbGVtZW50cywgYW5kIGZpbmFsbHkgYWJvcnQgdGhlc2Ugc3RlcHMuCiAgICAgICAgICAgICAgICBpZiBmdXJ0aGVzdEJsb2NrIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICB3aGlsZSBlbGVtZW50ICE9IGZvcm1hdHRpbmdFbGVtZW50OgogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgIyBTdGVwIDcKICAgICAgICAgICAgICAgIGNvbW1vbkFuY2VzdG9yID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1thZmVJbmRleCAtIDFdCgogICAgICAgICAgICAgICAgIyBTdGVwIDg6CiAgICAgICAgICAgICAgICAjIFRoZSBib29rbWFyayBpcyBzdXBwb3NlZCB0byBoZWxwIHVzIGlkZW50aWZ5IHdoZXJlIHRvIHJlaW5zZXJ0CiAgICAgICAgICAgICAgICAjIG5vZGVzIGluIHN0ZXAgMTUuIFdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgd2UgcmVpbnNlcnQgbm9kZXMgYWZ0ZXIKICAgICAgICAgICAgICAgICMgdGhlIG5vZGUgYmVmb3JlIHRoZSBhY3RpdmUgZm9ybWF0dGluZyBlbGVtZW50LiBOb3RlIHRoZSBib29rbWFyawogICAgICAgICAgICAgICAgIyBjYW4gbW92ZSBpbiBzdGVwIDkuNwogICAgICAgICAgICAgICAgYm9va21hcmsgPSBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluZGV4KGZvcm1hdHRpbmdFbGVtZW50KQoKICAgICAgICAgICAgICAgICMgU3RlcCA5CiAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGUgPSBmdXJ0aGVzdEJsb2NrCiAgICAgICAgICAgICAgICBpbm5lckxvb3BDb3VudGVyID0gMAoKICAgICAgICAgICAgICAgIGluZGV4ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5pbmRleChub2RlKQogICAgICAgICAgICAgICAgd2hpbGUgaW5uZXJMb29wQ291bnRlciA8IDM6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJMb29wQ291bnRlciArPSAxCiAgICAgICAgICAgICAgICAgICAgIyBOb2RlIGlzIGVsZW1lbnQgYmVmb3JlIG5vZGUgaW4gb3BlbiBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgIGluZGV4IC09IDEKICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1tpbmRleF0KICAgICAgICAgICAgICAgICAgICBpZiBub2RlIG5vdCBpbiBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnJlbW92ZShub2RlKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICMgU3RlcCA5LjYKICAgICAgICAgICAgICAgICAgICBpZiBub2RlID09IGZvcm1hdHRpbmdFbGVtZW50OgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICMgU3RlcCA5LjcKICAgICAgICAgICAgICAgICAgICBpZiBsYXN0Tm9kZSA9PSBmdXJ0aGVzdEJsb2NrOgogICAgICAgICAgICAgICAgICAgICAgICBib29rbWFyayA9IHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5kZXgobm9kZSkgKyAxCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuOAogICAgICAgICAgICAgICAgICAgIGNsb25lID0gbm9kZS5jbG9uZU5vZGUoKQogICAgICAgICAgICAgICAgICAgICMgUmVwbGFjZSBub2RlIHdpdGggY2xvbmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzWwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluZGV4KG5vZGUpXSA9IGNsb25lCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1sKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5pbmRleChub2RlKV0gPSBjbG9uZQogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBjbG9uZQogICAgICAgICAgICAgICAgICAgICMgU3RlcCA5LjkKICAgICAgICAgICAgICAgICAgICAjIFJlbW92ZSBsYXN0Tm9kZSBmcm9tIGl0cyBwYXJlbnRzLCBpZiBhbnkKICAgICAgICAgICAgICAgICAgICBpZiBsYXN0Tm9kZS5wYXJlbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlLnBhcmVudC5yZW1vdmVDaGlsZChsYXN0Tm9kZSkKICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGxhc3ROb2RlKQogICAgICAgICAgICAgICAgICAgICMgU3RlcCA5LjEwCiAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlCgogICAgICAgICAgICAgICAgIyBTdGVwIDEwCiAgICAgICAgICAgICAgICAjIEZvc3RlciBwYXJlbnQgbGFzdE5vZGUgaWYgY29tbW9uQW5jZXN0b3IgaXMgYQogICAgICAgICAgICAgICAgIyB0YWJsZSwgdGJvZHksIHRmb290LCB0aGVhZCwgb3IgdHIgd2UgbmVlZCB0byBmb3N0ZXIKICAgICAgICAgICAgICAgICMgcGFyZW50IHRoZSBsYXN0Tm9kZQogICAgICAgICAgICAgICAgaWYgbGFzdE5vZGUucGFyZW50OgogICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlLnBhcmVudC5yZW1vdmVDaGlsZChsYXN0Tm9kZSkKCiAgICAgICAgICAgICAgICBpZiBjb21tb25BbmNlc3Rvci5uYW1lIGluIGZyb3plbnNldCgoInRhYmxlIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiwgInRyIikpOgogICAgICAgICAgICAgICAgICAgIHBhcmVudCwgaW5zZXJ0QmVmb3JlID0gc2VsZi50cmVlLmdldFRhYmxlTWlzbmVzdGVkTm9kZVBvc2l0aW9uKCkKICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGxhc3ROb2RlLCBpbnNlcnRCZWZvcmUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbW1vbkFuY2VzdG9yLmFwcGVuZENoaWxkKGxhc3ROb2RlKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxMQogICAgICAgICAgICAgICAgY2xvbmUgPSBmb3JtYXR0aW5nRWxlbWVudC5jbG9uZU5vZGUoKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxMgogICAgICAgICAgICAgICAgZnVydGhlc3RCbG9jay5yZXBhcmVudENoaWxkcmVuKGNsb25lKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxMwogICAgICAgICAgICAgICAgZnVydGhlc3RCbG9jay5hcHBlbmRDaGlsZChjbG9uZSkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMTQKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlKGZvcm1hdHRpbmdFbGVtZW50KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbnNlcnQoYm9va21hcmssIGNsb25lKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxNQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5yZW1vdmUoZm9ybWF0dGluZ0VsZW1lbnQpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluc2VydCgKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluZGV4KGZ1cnRoZXN0QmxvY2spICsgMSwgY2xvbmUpCgogICAgICAgIGRlZiBlbmRUYWdBcHBsZXRNYXJxdWVlT2JqZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0pOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLXRvby1lYXJseSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0pOgogICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIGVsZW1lbnQubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuY2xlYXJBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQoKICAgICAgICBkZWYgZW5kVGFnQnIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctdHJlYXRlZC1hcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJvcmlnaW5hbE5hbWUiOiAiYnIiLCAibmV3TmFtZSI6ICJiciBlbGVtZW50In0pCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KGltcGxpZWRUYWdUb2tlbigiYnIiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lID09IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoZXhjbHVkZT10b2tlblsibmFtZSJdKQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKSAhPSBub2RlOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lVHVwbGUgaW4gc3BlY2lhbEVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICBjbGFzcyBUZXh0UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoW10pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJzY3JpcHQiLCBzZWxmLmVuZFRhZ1NjcmlwdCldKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLW5hbWVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtZW9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJUcmllZCB0byBwcm9jZXNzIHN0YXJ0IHRhZyAlcyBpbiBSQ0RBVEEvUkFXVEVYVCBtb2RlIiAlIHRva2VuWyduYW1lJ10KCiAgICAgICAgZGVmIGVuZFRhZ1NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGFzc2VydCBub2RlLm5hbWUgPT0gInNjcmlwdCIKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgICMgVGhlIHJlc3Qgb2YgdGhpcyBtZXRob2QgaXMgYWxsIHN0dWZmIHRoYXQgb25seSBoYXBwZW5zIGlmCiAgICAgICAgICAgICMgZG9jdW1lbnQud3JpdGUgd29ya3MKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLm9yaWdpbmFsUGhhc2UKCiAgICBjbGFzcyBJblRhYmxlUGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tdGFibGUKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiY2FwdGlvbiIsIHNlbGYuc3RhcnRUYWdDYXB0aW9uKSwKICAgICAgICAgICAgICAgICgiY29sZ3JvdXAiLCBzZWxmLnN0YXJ0VGFnQ29sZ3JvdXApLAogICAgICAgICAgICAgICAgKCJjb2wiLCBzZWxmLnN0YXJ0VGFnQ29sKSwKICAgICAgICAgICAgICAgICgoInRib2R5IiwgInRmb290IiwgInRoZWFkIiksIHNlbGYuc3RhcnRUYWdSb3dHcm91cCksCiAgICAgICAgICAgICAgICAoKCJ0ZCIsICJ0aCIsICJ0ciIpLCBzZWxmLnN0YXJ0VGFnSW1wbHlUYm9keSksCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5zdGFydFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoInN0eWxlIiwgInNjcmlwdCIpLCBzZWxmLnN0YXJ0VGFnU3R5bGVTY3JpcHQpLAogICAgICAgICAgICAgICAgKCJpbnB1dCIsIHNlbGYuc3RhcnRUYWdJbnB1dCksCiAgICAgICAgICAgICAgICAoImZvcm0iLCBzZWxmLnN0YXJ0VGFnRm9ybSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJ0YWJsZSIsIHNlbGYuZW5kVGFnVGFibGUpLAogICAgICAgICAgICAgICAgKCgiYm9keSIsICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJodG1sIiwgInRib2R5IiwgInRkIiwKICAgICAgICAgICAgICAgICAgInRmb290IiwgInRoIiwgInRoZWFkIiwgInRyIiksIHNlbGYuZW5kVGFnSWdub3JlKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgIyBoZWxwZXIgbWV0aG9kcwogICAgICAgIGRlZiBjbGVhclN0YWNrVG9UYWJsZUNvbnRleHQoc2VsZik6CiAgICAgICAgICAgICMgImNsZWFyIHRoZSBzdGFjayBiYWNrIHRvIGEgdGFibGUgY29udGV4dCIKICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSBub3QgaW4gKCJ0YWJsZSIsICJodG1sIik6CiAgICAgICAgICAgICAgICAjIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW1wbGllZC1lbmQtdGFnLWluLXRhYmxlIiwKICAgICAgICAgICAgICAgICMgIHsibmFtZSI6ICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgIyBXaGVuIHRoZSBjdXJyZW50IG5vZGUgaXMgPGh0bWw+IGl0J3MgYW4gaW5uZXJIVE1MIGNhc2UKCiAgICAgICAgIyBwcm9jZXNzaW5nIG1ldGhvZHMKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiaHRtbCI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlb2YtaW4tdGFibGUiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAjIFN0b3AgcGFyc2luZwoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG9yaWdpbmFsUGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZVRleHQiXQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5vcmlnaW5hbFBoYXNlID0gb3JpZ2luYWxQaGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBvcmlnaW5hbFBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVUZXh0Il0KICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2Uub3JpZ2luYWxQaGFzZSA9IG9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBJZiB3ZSBnZXQgaGVyZSB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIKICAgICAgICAgICAgIyBEbyB0aGUgdGFibGUgbWFnaWMhCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBUcnVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBGYWxzZQoKICAgICAgICBkZWYgc3RhcnRUYWdDYXB0aW9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUNvbnRleHQoKQogICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmFwcGVuZChNYXJrZXIpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5DYXB0aW9uIl0KCiAgICAgICAgZGVmIHN0YXJ0VGFnQ29sZ3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQ29udGV4dCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Db2x1bW5Hcm91cCJdCgogICAgICAgIGRlZiBzdGFydFRhZ0NvbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdDb2xncm91cChpbXBsaWVkVGFnVG9rZW4oImNvbGdyb3VwIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdSb3dHcm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVDb250ZXh0KCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlQm9keSJdCgogICAgICAgIGRlZiBzdGFydFRhZ0ltcGx5VGJvZHkoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnUm93R3JvdXAoaW1wbGllZFRhZ1Rva2VuKCJ0Ym9keSIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic3RhcnROYW1lIjogInRhYmxlIiwgImVuZE5hbWUiOiAidGFibGUifSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oInRhYmxlIikpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlci5pbm5lckhUTUw6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnU3R5bGVTY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0lucHV0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgKCJ0eXBlIiBpbiB0b2tlblsiZGF0YSJdIGFuZAogICAgICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl1bInR5cGUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikgPT0gImhpZGRlbiIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1oaWRkZW4taW5wdXQtaW4tdGFibGUiKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICAjIFhYWCBhc3NvY2lhdGUgd2l0aCBmb3JtCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnT3RoZXIodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0Zvcm0oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWZvcm0taW4tdGFibGUiKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZm9ybVBvaW50ZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmZvcm1Qb2ludGVyID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLXRhYmxlLXZvb2RvbyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAjIERvIHRoZSB0YWJsZSBtYWdpYyEKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IFRydWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBGYWxzZQoKICAgICAgICBkZWYgZW5kVGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRhYmxlIiwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gInRhYmxlIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLXRvby1lYXJseS1uYW1lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImdvdE5hbWUiOiAidGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZE5hbWUiOiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gInRhYmxlIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5yZXNldEluc2VydGlvbk1vZGUoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdJZ25vcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWltcGxpZXMtdGFibGUtdm9vZG9vIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICMgRG8gdGhlIHRhYmxlIG1hZ2ljIQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RnJvbVRhYmxlID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBGYWxzZQoKICAgIGNsYXNzIEluVGFibGVUZXh0UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYub3JpZ2luYWxQaGFzZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5jaGFyYWN0ZXJUb2tlbnMgPSBbXQoKICAgICAgICBkZWYgZmx1c2hDaGFyYWN0ZXJzKHNlbGYpOgogICAgICAgICAgICBkYXRhID0gIiIuam9pbihbaXRlbVsiZGF0YSJdIGZvciBpdGVtIGluIHNlbGYuY2hhcmFjdGVyVG9rZW5zXSkKICAgICAgICAgICAgaWYgYW55KFtpdGVtIG5vdCBpbiBzcGFjZUNoYXJhY3RlcnMgZm9yIGl0ZW0gaW4gZGF0YV0pOgogICAgICAgICAgICAgICAgdG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0KICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLmluc2VydFRleHQodG9rZW4pCiAgICAgICAgICAgIGVsaWYgZGF0YToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuY2hhcmFjdGVyVG9rZW5zID0gW10KCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5mbHVzaENoYXJhY3RlcnMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuZmx1c2hDaGFyYWN0ZXJzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bImRhdGEiXSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBzZWxmLmNoYXJhY3RlclRva2Vucy5hcHBlbmQodG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBwcmV0dHkgc3VyZSB3ZSBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZQogICAgICAgICAgICBzZWxmLmNoYXJhY3RlclRva2Vucy5hcHBlbmQodG9rZW4pCiAgICAjICAgICAgICBhc3NlcnQgRmFsc2UKCiAgICAgICAgZGVmIHByb2Nlc3NTdGFydFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuZmx1c2hDaGFyYWN0ZXJzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5mbHVzaENoYXJhY3RlcnMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBjbGFzcyBJbkNhcHRpb25QaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1jYXB0aW9uCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAidGJvZHkiLCAidGQiLCAidGZvb3QiLCAidGgiLAogICAgICAgICAgICAgICAgICAidGhlYWQiLCAidHIiKSwgc2VsZi5zdGFydFRhZ1RhYmxlRWxlbWVudCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJjYXB0aW9uIiwgc2VsZi5lbmRUYWdDYXB0aW9uKSwKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLmVuZFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoImJvZHkiLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiLCAidGJvZHkiLCAidGQiLCAidGZvb3QiLCAidGgiLAogICAgICAgICAgICAgICAgICAidGhlYWQiLCAidHIiKSwgc2VsZi5lbmRUYWdJZ25vcmUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgaWdub3JlRW5kVGFnQ2FwdGlvbihzZWxmKToKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoImNhcHRpb24iLCB2YXJpYW50PSJ0YWJsZSIpCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NFT0YoKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVFbGVtZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCiAgICAgICAgICAgICMgWFhYIEhhdmUgdG8gZHVwbGljYXRlIGxvZ2ljIGhlcmUgdG8gZmluZCBvdXQgaWYgdGhlIHRhZyBpcyBpZ25vcmVkCiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ2FwdGlvbigpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJjYXB0aW9uIikpCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdDYXB0aW9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlRW5kVGFnQ2FwdGlvbigpOgogICAgICAgICAgICAgICAgIyBBVCB0aGlzIGNvZGUgaXMgcXVpdGUgc2ltaWxhciB0byBlbmRUYWdUYWJsZSBpbiAiSW5UYWJsZSIKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImNhcHRpb24iOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLW9uZS1lbmQtdGFnLWJ1dC1nb3QtYW5vdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImdvdE5hbWUiOiAiY2FwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkTmFtZSI6IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiY2FwdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmNsZWFyQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDYXB0aW9uKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oImNhcHRpb24iKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnSWdub3JlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCgogICAgY2xhc3MgSW5Db2x1bW5Hcm91cFBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLWNvbHVtbgoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoImNvbCIsIHNlbGYuc3RhcnRUYWdDb2wpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiY29sZ3JvdXAiLCBzZWxmLmVuZFRhZ0NvbGdyb3VwKSwKICAgICAgICAgICAgICAgICgiY29sIiwgc2VsZi5lbmRUYWdDb2wpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgaWdub3JlRW5kVGFnQ29sZ3JvdXAoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJodG1sIgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAiaHRtbCI6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ29sZ3JvdXAoKQogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdDb2xncm91cChpbXBsaWVkVGFnVG9rZW4oImNvbGdyb3VwIikpCiAgICAgICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ29sZ3JvdXAoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdDb2woc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ0NvbGdyb3VwKCkKICAgICAgICAgICAgc2VsZi5lbmRUYWdDb2xncm91cChpbXBsaWVkVGFnVG9rZW4oImNvbGdyb3VwIikpCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0NvbGdyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVFbmRUYWdDb2xncm91cCgpOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdCgogICAgICAgIGRlZiBlbmRUYWdDb2woc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJuby1lbmQtdGFnIiwgeyJuYW1lIjogImNvbCJ9KQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ0NvbGdyb3VwKCkKICAgICAgICAgICAgc2VsZi5lbmRUYWdDb2xncm91cChpbXBsaWVkVGFnVG9rZW4oImNvbGdyb3VwIikpCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBjbGFzcyBJblRhYmxlQm9keVBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLXRhYmxlMAogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJ0ciIsIHNlbGYuc3RhcnRUYWdUciksCiAgICAgICAgICAgICAgICAoKCJ0ZCIsICJ0aCIpLCBzZWxmLnN0YXJ0VGFnVGFibGVDZWxsKSwKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1RhYmxlT3RoZXIpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgoInRib2R5IiwgInRmb290IiwgInRoZWFkIiksIHNlbGYuZW5kVGFnVGFibGVSb3dHcm91cCksCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5lbmRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJib2R5IiwgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiLCAidGQiLCAidGgiLAogICAgICAgICAgICAgICAgICAidHIiKSwgc2VsZi5lbmRUYWdJZ25vcmUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGhlbHBlciBtZXRob2RzCiAgICAgICAgZGVmIGNsZWFyU3RhY2tUb1RhYmxlQm9keUNvbnRleHQoc2VsZik6CiAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgbm90IGluICgidGJvZHkiLCAidGZvb3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZWFkIiwgImh0bWwiKToKICAgICAgICAgICAgICAgICMgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUiLAogICAgICAgICAgICAgICAgIyAgeyJuYW1lIjogc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZX0pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gImh0bWwiOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAoKICAgICAgICAjIHRoZSByZXN0CiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NFT0YoKQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1RyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUJvZHlDb250ZXh0KCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblJvdyJdCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlQ2VsbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtY2VsbC1pbi10YWJsZS1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1RyKGltcGxpZWRUYWdUb2tlbigidHIiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFhYWCBBVCBBbnkgaWRlYXMgb24gaG93IHRvIHNoYXJlIHRoaXMgd2l0aCBlbmRUYWdUYWJsZT8KICAgICAgICAgICAgaWYgKHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGJvZHkiLCB2YXJpYW50PSJ0YWJsZSIpIG9yCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRoZWFkIiwgdmFyaWFudD0idGFibGUiKSBvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGZvb3QiLCB2YXJpYW50PSJ0YWJsZSIpKToKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVCb2R5Q29udGV4dCgpCiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlUm93R3JvdXAoCiAgICAgICAgICAgICAgICAgICAgaW1wbGllZFRhZ1Rva2VuKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgZW5kVGFnVGFibGVSb3dHcm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUJvZHlDb250ZXh0KCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIChzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRib2R5IiwgdmFyaWFudD0idGFibGUiKSBvcgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0aGVhZCIsIHZhcmlhbnQ9InRhYmxlIikgb3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRmb290IiwgdmFyaWFudD0idGFibGUiKSk6CiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQm9keUNvbnRleHQoKQogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUYWJsZVJvd0dyb3VwKAogICAgICAgICAgICAgICAgICAgIGltcGxpZWRUYWdUb2tlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdJZ25vcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tdGFibGUtYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzRW5kVGFnKHRva2VuKQoKICAgIGNsYXNzIEluUm93UGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tcm93CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJ0ZCIsICJ0aCIpLCBzZWxmLnN0YXJ0VGFnVGFibGVDZWxsKSwKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiwKICAgICAgICAgICAgICAgICAgInRyIiksIHNlbGYuc3RhcnRUYWdUYWJsZU90aGVyKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoInRyIiwgc2VsZi5lbmRUYWdUciksCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5lbmRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIpLCBzZWxmLmVuZFRhZ1RhYmxlUm93R3JvdXApLAogICAgICAgICAgICAgICAgKCgiYm9keSIsICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJodG1sIiwgInRkIiwgInRoIiksCiAgICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdJZ25vcmUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGhlbHBlciBtZXRob2RzIChYWFggdW5pZnkgdGhpcyB3aXRoIG90aGVyIHRhYmxlIGhlbHBlciBtZXRob2RzKQogICAgICAgIGRlZiBjbGVhclN0YWNrVG9UYWJsZVJvd0NvbnRleHQoc2VsZik6CiAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgbm90IGluICgidHIiLCAiaHRtbCIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUtcm93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZX0pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBpZ25vcmVFbmRUYWdUcihzZWxmKToKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRyIiwgdmFyaWFudD0idGFibGUiKQoKICAgICAgICAjIHRoZSByZXN0CiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NFT0YoKQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlQ2VsbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVSb3dDb250ZXh0KCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNlbGwiXQogICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmFwcGVuZChNYXJrZXIpCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ1RyKCkKICAgICAgICAgICAgc2VsZi5lbmRUYWdUcihpbXBsaWVkVGFnVG9rZW4oInRyIikpCiAgICAgICAgICAgICMgWFhYIGhvdyBhcmUgd2Ugc3VyZSBpdCdzIGFsd2F5cyBpZ25vcmVkIGluIHRoZSBpbm5lckhUTUwgY2FzZT8KICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdUcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlnbm9yZUVuZFRhZ1RyKCk6CiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlUm93Q29udGV4dCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZUJvZHkiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnVHIoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ1RyKGltcGxpZWRUYWdUb2tlbigidHIiKSkKICAgICAgICAgICAgIyBSZXByb2Nlc3MgdGhlIGN1cnJlbnQgdGFnIGlmIHRoZSB0ciBlbmQgdGFnIHdhcyBub3QgaWdub3JlZAogICAgICAgICAgICAjIFhYWCBob3cgYXJlIHdlIHN1cmUgaXQncyBhbHdheXMgaWdub3JlZCBpbiB0aGUgaW5uZXJIVE1MIGNhc2U/CiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlUm93R3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnVHIoaW1wbGllZFRhZ1Rva2VuKCJ0ciIpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ0lnbm9yZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1yb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKCiAgICBjbGFzcyBJbkNlbGxQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1jZWxsCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsCiAgICAgICAgICAgICAgICAgICJ0aGVhZCIsICJ0ciIpLCBzZWxmLnN0YXJ0VGFnVGFibGVPdGhlcikKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCgidGQiLCAidGgiKSwgc2VsZi5lbmRUYWdUYWJsZUNlbGwpLAogICAgICAgICAgICAgICAgKCgiYm9keSIsICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJodG1sIiksIHNlbGYuZW5kVGFnSWdub3JlKSwKICAgICAgICAgICAgICAgICgoInRhYmxlIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiwgInRyIiksIHNlbGYuZW5kVGFnSW1wbHkpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGhlbHBlcgogICAgICAgIGRlZiBjbG9zZUNlbGwoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGQiLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUYWJsZUNlbGwoaW1wbGllZFRhZ1Rva2VuKCJ0ZCIpKQogICAgICAgICAgICBlbGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGgiLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUYWJsZUNlbGwoaW1wbGllZFRhZ1Rva2VuKCJ0aCIpKQoKICAgICAgICAjIHRoZSByZXN0CiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VPRigpCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZU90aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgKHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGQiLCB2YXJpYW50PSJ0YWJsZSIpIG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0aCIsIHZhcmlhbnQ9InRhYmxlIikpOgogICAgICAgICAgICAgICAgc2VsZi5jbG9zZUNlbGwoKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZUNlbGwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1jZWxsLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lID09IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuY2xlYXJBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluUm93Il0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnSWdub3JlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdJbXBseShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5jbG9zZUNlbGwoKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHNvbWV0aW1lcyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCgogICAgY2xhc3MgSW5TZWxlY3RQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJvcHRpb24iLCBzZWxmLnN0YXJ0VGFnT3B0aW9uKSwKICAgICAgICAgICAgICAgICgib3B0Z3JvdXAiLCBzZWxmLnN0YXJ0VGFnT3B0Z3JvdXApLAogICAgICAgICAgICAgICAgKCJzZWxlY3QiLCBzZWxmLnN0YXJ0VGFnU2VsZWN0KSwKICAgICAgICAgICAgICAgICgoImlucHV0IiwgImtleWdlbiIsICJ0ZXh0YXJlYSIpLCBzZWxmLnN0YXJ0VGFnSW5wdXQpLAogICAgICAgICAgICAgICAgKCJzY3JpcHQiLCBzZWxmLnN0YXJ0VGFnU2NyaXB0KQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoIm9wdGlvbiIsIHNlbGYuZW5kVGFnT3B0aW9uKSwKICAgICAgICAgICAgICAgICgib3B0Z3JvdXAiLCBzZWxmLmVuZFRhZ09wdGdyb3VwKSwKICAgICAgICAgICAgICAgICgic2VsZWN0Iiwgc2VsZi5lbmRUYWdTZWxlY3QpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLXNlbGVjdAogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJodG1sIjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVvZi1pbi1zZWxlY3QiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsiZGF0YSJdID09ICJcdTAwMDAiOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCgogICAgICAgIGRlZiBzdGFydFRhZ09wdGlvbihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgV2UgbmVlZCB0byBpbXBseSA8L29wdGlvbj4gaWYgPG9wdGlvbj4gaXMgdGhlIGN1cnJlbnQgbm9kZS4KICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0aW9uIjoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ09wdGdyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0aW9uIjoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0Z3JvdXAiOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnU2VsZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zZWxlY3QtaW4tc2VsZWN0IikKICAgICAgICAgICAgc2VsZi5lbmRUYWdTZWxlY3QoaW1wbGllZFRhZ1Rva2VuKCJzZWxlY3QiKSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnSW5wdXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWlucHV0LWluLXNlbGVjdCIpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgic2VsZWN0IiwgdmFyaWFudD0ic2VsZWN0Iik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1NlbGVjdChpbXBsaWVkVGFnVG9rZW4oInNlbGVjdCIpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCgogICAgICAgIGRlZiBzdGFydFRhZ1NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbi1zZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnT3B0aW9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0aW9uIjoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1zZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiAib3B0aW9uIn0pCgogICAgICAgIGRlZiBlbmRUYWdPcHRncm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgPC9vcHRncm91cD4gaW1wbGljaXRseSBjbG9zZXMgPG9wdGlvbj4KICAgICAgICAgICAgaWYgKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGlvbiIgYW5kCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMl0ubmFtZSA9PSAib3B0Z3JvdXAiKToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgIyBJdCBhbHNvIGNsb3NlcyA8L29wdGdyb3VwPgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRncm91cCI6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICMgQnV0IG5vdGhpbmcgZWxzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJvcHRncm91cCJ9KQoKICAgICAgICBkZWYgZW5kVGFnU2VsZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJzZWxlY3QiLCB2YXJpYW50PSJzZWxlY3QiKToKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB3aGlsZSBub2RlLm5hbWUgIT0gInNlbGVjdCI6CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlc2V0SW5zZXJ0aW9uTW9kZSgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgY2xhc3MgSW5TZWxlY3RJblRhYmxlUGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAidGFibGUiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLCAidHIiLCAidGQiLCAidGgiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnVGFibGUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAidGFibGUiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLCAidHIiLCAidGQiLCAidGgiKSwKICAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3QiXS5wcm9jZXNzRU9GKCkKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3QiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXRhYmxlLWVsZW1lbnQtc3RhcnQtdGFnLWluLXNlbGVjdC1pbi10YWJsZSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLmVuZFRhZ090aGVyKGltcGxpZWRUYWdUb2tlbigic2VsZWN0IikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluU2VsZWN0Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgZW5kVGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXRhYmxlLWVsZW1lbnQtZW5kLXRhZy1pbi1zZWxlY3QtaW4tdGFibGUiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0sIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ090aGVyKGltcGxpZWRUYWdUb2tlbigic2VsZWN0IikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3QiXS5wcm9jZXNzRW5kVGFnKHRva2VuKQoKICAgIGNsYXNzIEluRm9yZWlnbkNvbnRlbnRQaGFzZShQaGFzZSk6CiAgICAgICAgYnJlYWtvdXRFbGVtZW50cyA9IGZyb3plbnNldChbImIiLCAiYmlnIiwgImJsb2NrcXVvdGUiLCAiYm9keSIsICJiciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNlbnRlciIsICJjb2RlIiwgImRkIiwgImRpdiIsICJkbCIsICJkdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVtIiwgImVtYmVkIiwgImgxIiwgImgyIiwgImgzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaDQiLCAiaDUiLCAiaDYiLCAiaGVhZCIsICJociIsICJpIiwgImltZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpIiwgImxpc3RpbmciLCAibWVudSIsICJtZXRhIiwgIm5vYnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbCIsICJwIiwgInByZSIsICJydWJ5IiwgInMiLCAic21hbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFuIiwgInN0cm9uZyIsICJzdHJpa2UiLCAic3ViIiwgInN1cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhYmxlIiwgInR0IiwgInUiLCAidWwiLCAidmFyIl0pCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgIGRlZiBhZGp1c3RTVkdUYWdOYW1lcyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJlcGxhY2VtZW50cyA9IHsiYWx0Z2x5cGgiOiAiYWx0R2x5cGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsdGdseXBoZGVmIjogImFsdEdseXBoRGVmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHRnbHlwaGl0ZW0iOiAiYWx0R2x5cGhJdGVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmltYXRlY29sb3IiOiAiYW5pbWF0ZUNvbG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmltYXRlbW90aW9uIjogImFuaW1hdGVNb3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuaW1hdGV0cmFuc2Zvcm0iOiAiYW5pbWF0ZVRyYW5zZm9ybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpcHBhdGgiOiAiY2xpcFBhdGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlYmxlbmQiOiAiZmVCbGVuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVjb2xvcm1hdHJpeCI6ICJmZUNvbG9yTWF0cml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWNvbXBvbmVudHRyYW5zZmVyIjogImZlQ29tcG9uZW50VHJhbnNmZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlY29tcG9zaXRlIjogImZlQ29tcG9zaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWNvbnZvbHZlbWF0cml4IjogImZlQ29udm9sdmVNYXRyaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZGlmZnVzZWxpZ2h0aW5nIjogImZlRGlmZnVzZUxpZ2h0aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWRpc3BsYWNlbWVudG1hcCI6ICJmZURpc3BsYWNlbWVudE1hcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVkaXN0YW50bGlnaHQiOiAiZmVEaXN0YW50TGlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZmxvb2QiOiAiZmVGbG9vZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVmdW5jYSI6ICJmZUZ1bmNBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWZ1bmNiIjogImZlRnVuY0IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZnVuY2ciOiAiZmVGdW5jRyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVmdW5jciI6ICJmZUZ1bmNSIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWdhdXNzaWFuYmx1ciI6ICJmZUdhdXNzaWFuQmx1ciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVpbWFnZSI6ICJmZUltYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZW1lcmdlIjogImZlTWVyZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbWVyZ2Vub2RlIjogImZlTWVyZ2VOb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZW1vcnBob2xvZ3kiOiAiZmVNb3JwaG9sb2d5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZW9mZnNldCI6ICJmZU9mZnNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVwb2ludGxpZ2h0IjogImZlUG9pbnRMaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVzcGVjdWxhcmxpZ2h0aW5nIjogImZlU3BlY3VsYXJMaWdodGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVzcG90bGlnaHQiOiAiZmVTcG90TGlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZldGlsZSI6ICJmZVRpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZldHVyYnVsZW5jZSI6ICJmZVR1cmJ1bGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcmVpZ25vYmplY3QiOiAiZm9yZWlnbk9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2x5cGhyZWYiOiAiZ2x5cGhSZWYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmVhcmdyYWRpZW50IjogImxpbmVhckdyYWRpZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYWRpYWxncmFkaWVudCI6ICJyYWRpYWxHcmFkaWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dHBhdGgiOiAidGV4dFBhdGgifQoKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXSBpbiByZXBsYWNlbWVudHM6CiAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdID0gcmVwbGFjZW1lbnRzW3Rva2VuWyJuYW1lIl1dCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJkYXRhIl0gPT0gIlx1MDAwMCI6CiAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gIlx1RkZGRCIKICAgICAgICAgICAgZWxpZiAoc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyBhbmQKICAgICAgICAgICAgICAgICAgYW55KGNoYXIgbm90IGluIHNwYWNlQ2hhcmFjdGVycyBmb3IgY2hhciBpbiB0b2tlblsiZGF0YSJdKSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgUGhhc2UucHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzU3RhcnRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCiAgICAgICAgICAgIGlmICh0b2tlblsibmFtZSJdIGluIHNlbGYuYnJlYWtvdXRFbGVtZW50cyBvcgogICAgICAgICAgICAgICAgKHRva2VuWyJuYW1lIl0gPT0gImZvbnQiIGFuZAogICAgICAgICAgICAgICAgIHNldCh0b2tlblsiZGF0YSJdLmtleXMoKSkgJiBzZXQoWyJjb2xvciIsICJmYWNlIiwgInNpemUiXSkpKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaHRtbC1lbGVtZW50LWluLWZvcmVpZ24tY29udGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgd2hpbGUgKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWVzcGFjZSAhPQogICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5kZWZhdWx0TmFtZXNwYWNlIGFuZAogICAgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLnBhcnNlci5pc0hUTUxJbnRlZ3JhdGlvblBvaW50KHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi5wYXJzZXIuaXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludChzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXSkpOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLm5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJtYXRobWwiXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RNYXRoTUxBdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5uYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1sic3ZnIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGp1c3RTVkdUYWdOYW1lcyh0b2tlbikKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RTVkdBdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgICAgICB0b2tlblsibmFtZXNwYWNlIl0gPSBjdXJyZW50Tm9kZS5uYW1lc3BhY2UKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgaWYgdG9rZW5bInNlbGZDbG9zaW5nIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5vZGVJbmRleCA9IGxlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzKSAtIDEKICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCiAgICAgICAgICAgIGlmIG5vZGUubmFtZS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikgPT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICAjIFhYWCB0aGlzIGlzbid0IGluIHRoZSBzcGVjIGJ1dCBpdCBzZWVtcyBuZWNlc3NhcnkKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5waGFzZSA9PSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVUZXh0Il06CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLmZsdXNoQ2hhcmFjdGVycygpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2Uub3JpZ2luYWxQaGFzZQogICAgICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkgIT0gbm9kZToKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYudHJlZS5vcGVuRWxlbWVudHMKICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBOb25lCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIG5vZGVJbmRleCAtPSAxCgogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbbm9kZUluZGV4XQogICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lc3BhY2UgIT0gc2VsZi50cmVlLmRlZmF1bHROYW1lc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyh0b2tlbikKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICByZXR1cm4gbmV3X3Rva2VuCgogICAgY2xhc3MgQWZ0ZXJCb2R5UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbKCJodG1sIiwgc2VsZi5lbmRUYWdIdG1sKV0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgIyBTdG9wIHBhcnNpbmcKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgZGF0YSBpcyB0byBiZSBhcHBlbmRlZCB0byB0aGUgPGh0bWw+IGVsZW1lbnQKICAgICAgICAgICAgIyBoZXJlIGFuZCBub3QgdG8gd2hhdGV2ZXIgaXMgY3VycmVudGx5IG9wZW4uCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRDb21tZW50KHRva2VuLCBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzBdKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWNoYXItYWZ0ZXItYm9keSIpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1hZnRlci1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnSHRtbChzZWxmLCBuYW1lKToKICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuaW5uZXJIVE1MOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWJvZHktaW5uZXJodG1sIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJhZnRlckFmdGVyQm9keSJdCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1hZnRlci1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGNsYXNzIEluRnJhbWVzZXRQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1mcmFtZXNldAogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiZnJhbWVzZXQiLCBzZWxmLnN0YXJ0VGFnRnJhbWVzZXQpLAogICAgICAgICAgICAgICAgKCJmcmFtZSIsIHNlbGYuc3RhcnRUYWdGcmFtZSksCiAgICAgICAgICAgICAgICAoIm5vZnJhbWVzIiwgc2VsZi5zdGFydFRhZ05vZnJhbWVzKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImZyYW1lc2V0Iiwgc2VsZi5lbmRUYWdGcmFtZXNldCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJodG1sIjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVvZi1pbi1mcmFtZXNldCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtY2hhci1pbi1mcmFtZXNldCIpCgogICAgICAgIGRlZiBzdGFydFRhZ0ZyYW1lc2V0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0ZyYW1lKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9mcmFtZXMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaW4tZnJhbWVzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnRnJhbWVzZXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJodG1sIjoKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZnJhbWVzZXQtaW4tZnJhbWVzZXQtaW5uZXJodG1sIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgaWYgKG5vdCBzZWxmLnBhcnNlci5pbm5lckhUTUwgYW5kCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiZnJhbWVzZXQiKToKICAgICAgICAgICAgICAgICMgSWYgd2UncmUgbm90IGluIGlubmVySFRNTCBtb2RlIGFuZCB0aGUgY3VycmVudCBub2RlIGlzIG5vdCBhCiAgICAgICAgICAgICAgICAjICJmcmFtZXNldCIgZWxlbWVudCAoYW55bW9yZSkgdGhlbiBzd2l0Y2guCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYWZ0ZXJGcmFtZXNldCJdCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1mcmFtZXNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgY2xhc3MgQWZ0ZXJGcmFtZXNldFBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2FmdGVyMwogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgibm9mcmFtZXMiLCBzZWxmLnN0YXJ0VGFnTm9mcmFtZXMpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuZW5kVGFnSHRtbCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICAjIFN0b3AgcGFyc2luZwogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtY2hhci1hZnRlci1mcmFtZXNldCIpCgogICAgICAgIGRlZiBzdGFydFRhZ05vZnJhbWVzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWFmdGVyLWZyYW1lc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYWZ0ZXJBZnRlckZyYW1lc2V0Il0KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWZyYW1lc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICBjbGFzcyBBZnRlckFmdGVyQm9keVBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLmRvY3VtZW50KQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LWNoYXIiKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3Qtc3RhcnQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgY2xhc3MgQWZ0ZXJBZnRlckZyYW1lc2V0UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgibm9mcmFtZXMiLCBzZWxmLnN0YXJ0VGFnTm9GcmFtZXMpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5kb2N1bWVudCkKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1jaGFyIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9GcmFtZXMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3Qtc3RhcnQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICMgcHlsaW50OmVuYWJsZT11bnVzZWQtYXJndW1lbnQKCiAgICByZXR1cm4gewogICAgICAgICJpbml0aWFsIjogSW5pdGlhbFBoYXNlLAogICAgICAgICJiZWZvcmVIdG1sIjogQmVmb3JlSHRtbFBoYXNlLAogICAgICAgICJiZWZvcmVIZWFkIjogQmVmb3JlSGVhZFBoYXNlLAogICAgICAgICJpbkhlYWQiOiBJbkhlYWRQaGFzZSwKICAgICAgICAiaW5IZWFkTm9zY3JpcHQiOiBJbkhlYWROb3NjcmlwdFBoYXNlLAogICAgICAgICJhZnRlckhlYWQiOiBBZnRlckhlYWRQaGFzZSwKICAgICAgICAiaW5Cb2R5IjogSW5Cb2R5UGhhc2UsCiAgICAgICAgInRleHQiOiBUZXh0UGhhc2UsCiAgICAgICAgImluVGFibGUiOiBJblRhYmxlUGhhc2UsCiAgICAgICAgImluVGFibGVUZXh0IjogSW5UYWJsZVRleHRQaGFzZSwKICAgICAgICAiaW5DYXB0aW9uIjogSW5DYXB0aW9uUGhhc2UsCiAgICAgICAgImluQ29sdW1uR3JvdXAiOiBJbkNvbHVtbkdyb3VwUGhhc2UsCiAgICAgICAgImluVGFibGVCb2R5IjogSW5UYWJsZUJvZHlQaGFzZSwKICAgICAgICAiaW5Sb3ciOiBJblJvd1BoYXNlLAogICAgICAgICJpbkNlbGwiOiBJbkNlbGxQaGFzZSwKICAgICAgICAiaW5TZWxlY3QiOiBJblNlbGVjdFBoYXNlLAogICAgICAgICJpblNlbGVjdEluVGFibGUiOiBJblNlbGVjdEluVGFibGVQaGFzZSwKICAgICAgICAiaW5Gb3JlaWduQ29udGVudCI6IEluRm9yZWlnbkNvbnRlbnRQaGFzZSwKICAgICAgICAiYWZ0ZXJCb2R5IjogQWZ0ZXJCb2R5UGhhc2UsCiAgICAgICAgImluRnJhbWVzZXQiOiBJbkZyYW1lc2V0UGhhc2UsCiAgICAgICAgImFmdGVyRnJhbWVzZXQiOiBBZnRlckZyYW1lc2V0UGhhc2UsCiAgICAgICAgImFmdGVyQWZ0ZXJCb2R5IjogQWZ0ZXJBZnRlckJvZHlQaGFzZSwKICAgICAgICAiYWZ0ZXJBZnRlckZyYW1lc2V0IjogQWZ0ZXJBZnRlckZyYW1lc2V0UGhhc2UsCiAgICAgICAgIyBYWFggYWZ0ZXIgYWZ0ZXIgZnJhbWVzZXQKICAgIH0KCgpkZWYgYWRqdXN0X2F0dHJpYnV0ZXModG9rZW4sIHJlcGxhY2VtZW50cyk6CiAgICBpZiBQWTMgb3IgX3V0aWxzLlBZMjc6CiAgICAgICAgbmVlZHNfYWRqdXN0bWVudCA9IHZpZXdrZXlzKHRva2VuWydkYXRhJ10pICYgdmlld2tleXMocmVwbGFjZW1lbnRzKQogICAgZWxzZToKICAgICAgICBuZWVkc19hZGp1c3RtZW50ID0gZnJvemVuc2V0KHRva2VuWydkYXRhJ10pICYgZnJvemVuc2V0KHJlcGxhY2VtZW50cykKICAgIGlmIG5lZWRzX2FkanVzdG1lbnQ6CiAgICAgICAgdG9rZW5bJ2RhdGEnXSA9IE9yZGVyZWREaWN0KChyZXBsYWNlbWVudHMuZ2V0KGssIGspLCB2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiB0b2tlblsnZGF0YSddLml0ZW1zKCkpCgoKZGVmIGltcGxpZWRUYWdUb2tlbihuYW1lLCB0eXBlPSJFbmRUYWciLCBhdHRyaWJ1dGVzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgc2VsZkNsb3Npbmc9RmFsc2UpOgogICAgaWYgYXR0cmlidXRlcyBpcyBOb25lOgogICAgICAgIGF0dHJpYnV0ZXMgPSB7fQogICAgcmV0dXJuIHsidHlwZSI6IHRva2VuVHlwZXNbdHlwZV0sICJuYW1lIjogbmFtZSwgImRhdGEiOiBhdHRyaWJ1dGVzLAogICAgICAgICAgICAic2VsZkNsb3NpbmciOiBzZWxmQ2xvc2luZ30KCgpjbGFzcyBQYXJzZUVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJFcnJvciBpbiBwYXJzZWQgZG9jdW1lbnQiIiIKICAgIHBhc3MKUEsDBBQAAAAAAAAAIQDcx7s0YTcAAGE3AAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9zZXJpYWxpemVyLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmltcG9ydCByZQoKZnJvbSBjb2RlY3MgaW1wb3J0IHJlZ2lzdGVyX2Vycm9yLCB4bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMKCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgdm9pZEVsZW1lbnRzLCBib29sZWFuQXR0cmlidXRlcywgc3BhY2VDaGFyYWN0ZXJzCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgcmNkYXRhRWxlbWVudHMsIGVudGl0aWVzLCB4bWxFbnRpdGllcwpmcm9tIC4gaW1wb3J0IHRyZWV3YWxrZXJzLCBfdXRpbHMKZnJvbSB4bWwuc2F4LnNheHV0aWxzIGltcG9ydCBlc2NhcGUKCl9xdW90ZUF0dHJpYnV0ZVNwZWNDaGFycyA9ICIiLmpvaW4oc3BhY2VDaGFyYWN0ZXJzKSArICJcIic9PD5gIgpfcXVvdGVBdHRyaWJ1dGVTcGVjID0gcmUuY29tcGlsZSgiWyIgKyBfcXVvdGVBdHRyaWJ1dGVTcGVjQ2hhcnMgKyAiXSIpCl9xdW90ZUF0dHJpYnV0ZUxlZ2FjeSA9IHJlLmNvbXBpbGUoIlsiICsgX3F1b3RlQXR0cmlidXRlU3BlY0NoYXJzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwYlx4MGNcclx4MGVceDBmXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDE2XHgxN1x4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHgyZlx4NjBceGEwXHUxNjgwXHUxODBlXHUxODBmXHUyMDAwIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MjAwOFx1MjAwOVx1MjAwYVx1MjAyOFx1MjAyOVx1MjAyZlx1MjA1ZiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDAwXSIpCgoKX2VuY29kZV9lbnRpdHlfbWFwID0ge30KX2lzX3VjczQgPSBsZW4oIlxVMDAxMEZGRkYiKSA9PSAxCmZvciBrLCB2IGluIGxpc3QoZW50aXRpZXMuaXRlbXMoKSk6CiAgICAjIHNraXAgbXVsdGktY2hhcmFjdGVyIGVudGl0aWVzCiAgICBpZiAoKF9pc191Y3M0IGFuZCBsZW4odikgPiAxKSBvcgogICAgICAgICAgICAobm90IF9pc191Y3M0IGFuZCBsZW4odikgPiAyKSk6CiAgICAgICAgY29udGludWUKICAgIGlmIHYgIT0gIiYiOgogICAgICAgIGlmIGxlbih2KSA9PSAyOgogICAgICAgICAgICB2ID0gX3V0aWxzLnN1cnJvZ2F0ZVBhaXJUb0NvZGVwb2ludCh2KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHYgPSBvcmQodikKICAgICAgICBpZiB2IG5vdCBpbiBfZW5jb2RlX2VudGl0eV9tYXAgb3Igay5pc2xvd2VyKCk6CiAgICAgICAgICAgICMgcHJlZmVyICZsdDsgb3ZlciAmTFQ7IGFuZCBzaW1pbGFybHkgZm9yICZhbXA7LCAmZ3Q7LCBldGMuCiAgICAgICAgICAgIF9lbmNvZGVfZW50aXR5X21hcFt2XSA9IGsKCgpkZWYgaHRtbGVudGl0eXJlcGxhY2VfZXJyb3JzKGV4Yyk6CiAgICBpZiBpc2luc3RhbmNlKGV4YywgKFVuaWNvZGVFbmNvZGVFcnJvciwgVW5pY29kZVRyYW5zbGF0ZUVycm9yKSk6CiAgICAgICAgcmVzID0gW10KICAgICAgICBjb2RlcG9pbnRzID0gW10KICAgICAgICBza2lwID0gRmFsc2UKICAgICAgICBmb3IgaSwgYyBpbiBlbnVtZXJhdGUoZXhjLm9iamVjdFtleGMuc3RhcnQ6ZXhjLmVuZF0pOgogICAgICAgICAgICBpZiBza2lwOgogICAgICAgICAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpbmRleCA9IGkgKyBleGMuc3RhcnQKICAgICAgICAgICAgaWYgX3V0aWxzLmlzU3Vycm9nYXRlUGFpcihleGMub2JqZWN0W2luZGV4Om1pbihbZXhjLmVuZCwgaW5kZXggKyAyXSldKToKICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9IF91dGlscy5zdXJyb2dhdGVQYWlyVG9Db2RlcG9pbnQoZXhjLm9iamVjdFtpbmRleDppbmRleCArIDJdKQogICAgICAgICAgICAgICAgc2tpcCA9IFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9IG9yZChjKQogICAgICAgICAgICBjb2RlcG9pbnRzLmFwcGVuZChjb2RlcG9pbnQpCiAgICAgICAgZm9yIGNwIGluIGNvZGVwb2ludHM6CiAgICAgICAgICAgIGUgPSBfZW5jb2RlX2VudGl0eV9tYXAuZ2V0KGNwKQogICAgICAgICAgICBpZiBlOgogICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgiJiIpCiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKGUpCiAgICAgICAgICAgICAgICBpZiBub3QgZS5lbmRzd2l0aCgiOyIpOgogICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoIjsiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgiJiN4JXM7IiAlIChoZXgoY3ApWzI6XSkpCiAgICAgICAgcmV0dXJuICgiIi5qb2luKHJlcyksIGV4Yy5lbmQpCiAgICBlbHNlOgogICAgICAgIHJldHVybiB4bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMoZXhjKQoKcmVnaXN0ZXJfZXJyb3IoImh0bWxlbnRpdHlyZXBsYWNlIiwgaHRtbGVudGl0eXJlcGxhY2VfZXJyb3JzKQoKCmRlZiBzZXJpYWxpemUoaW5wdXQsIHRyZWU9ImV0cmVlIiwgZW5jb2Rpbmc9Tm9uZSwgKipzZXJpYWxpemVyX29wdHMpOgogICAgIyBYWFg6IFNob3VsZCB3ZSBjYWNoZSB0aGlzPwogICAgd2Fsa2VyID0gdHJlZXdhbGtlcnMuZ2V0VHJlZVdhbGtlcih0cmVlKQogICAgcyA9IEhUTUxTZXJpYWxpemVyKCoqc2VyaWFsaXplcl9vcHRzKQogICAgcmV0dXJuIHMucmVuZGVyKHdhbGtlcihpbnB1dCksIGVuY29kaW5nKQoKCmNsYXNzIEhUTUxTZXJpYWxpemVyKG9iamVjdCk6CgogICAgIyBhdHRyaWJ1dGUgcXVvdGluZyBvcHRpb25zCiAgICBxdW90ZV9hdHRyX3ZhbHVlcyA9ICJsZWdhY3kiICAjIGJlIHNlY3VyZSBieSBkZWZhdWx0CiAgICBxdW90ZV9jaGFyID0gJyInCiAgICB1c2VfYmVzdF9xdW90ZV9jaGFyID0gVHJ1ZQoKICAgICMgdGFnIHN5bnRheCBvcHRpb25zCiAgICBvbWl0X29wdGlvbmFsX3RhZ3MgPSBUcnVlCiAgICBtaW5pbWl6ZV9ib29sZWFuX2F0dHJpYnV0ZXMgPSBUcnVlCiAgICB1c2VfdHJhaWxpbmdfc29saWR1cyA9IEZhbHNlCiAgICBzcGFjZV9iZWZvcmVfdHJhaWxpbmdfc29saWR1cyA9IFRydWUKCiAgICAjIGVzY2FwaW5nIG9wdGlvbnMKICAgIGVzY2FwZV9sdF9pbl9hdHRycyA9IEZhbHNlCiAgICBlc2NhcGVfcmNkYXRhID0gRmFsc2UKICAgIHJlc29sdmVfZW50aXRpZXMgPSBUcnVlCgogICAgIyBtaXNjZWxsYW5lb3VzIG9wdGlvbnMKICAgIGFscGhhYmV0aWNhbF9hdHRyaWJ1dGVzID0gRmFsc2UKICAgIGluamVjdF9tZXRhX2NoYXJzZXQgPSBUcnVlCiAgICBzdHJpcF93aGl0ZXNwYWNlID0gRmFsc2UKICAgIHNhbml0aXplID0gRmFsc2UKCiAgICBvcHRpb25zID0gKCJxdW90ZV9hdHRyX3ZhbHVlcyIsICJxdW90ZV9jaGFyIiwgInVzZV9iZXN0X3F1b3RlX2NoYXIiLAogICAgICAgICAgICAgICAib21pdF9vcHRpb25hbF90YWdzIiwgIm1pbmltaXplX2Jvb2xlYW5fYXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICJ1c2VfdHJhaWxpbmdfc29saWR1cyIsICJzcGFjZV9iZWZvcmVfdHJhaWxpbmdfc29saWR1cyIsCiAgICAgICAgICAgICAgICJlc2NhcGVfbHRfaW5fYXR0cnMiLCAiZXNjYXBlX3JjZGF0YSIsICJyZXNvbHZlX2VudGl0aWVzIiwKICAgICAgICAgICAgICAgImFscGhhYmV0aWNhbF9hdHRyaWJ1dGVzIiwgImluamVjdF9tZXRhX2NoYXJzZXQiLAogICAgICAgICAgICAgICAic3RyaXBfd2hpdGVzcGFjZSIsICJzYW5pdGl6ZSIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKICAgICAgICAiIiJJbml0aWFsaXplIEhUTUxTZXJpYWxpemVyLgoKICAgICAgICBLZXl3b3JkIG9wdGlvbnMgKGRlZmF1bHQgZ2l2ZW4gZmlyc3QgdW5sZXNzIHNwZWNpZmllZCkgaW5jbHVkZToKCiAgICAgICAgaW5qZWN0X21ldGFfY2hhcnNldD1UcnVlfEZhbHNlCiAgICAgICAgICBXaGV0aGVyIGl0IGluc2VydCBhIG1ldGEgZWxlbWVudCB0byBkZWZpbmUgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlCiAgICAgICAgICBkb2N1bWVudC4KICAgICAgICBxdW90ZV9hdHRyX3ZhbHVlcz0ibGVnYWN5Inwic3BlYyJ8ImFsd2F5cyIKICAgICAgICAgIFdoZXRoZXIgdG8gcXVvdGUgYXR0cmlidXRlIHZhbHVlcyB0aGF0IGRvbid0IHJlcXVpcmUgcXVvdGluZwogICAgICAgICAgcGVyIGxlZ2FjeSBicm93c2VyIGJlaGF2aW91ciwgd2hlbiByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQsIG9yIGFsd2F5cy4KICAgICAgICBxdW90ZV9jaGFyPXUnIid8dSInIgogICAgICAgICAgVXNlIGdpdmVuIHF1b3RlIGNoYXJhY3RlciBmb3IgYXR0cmlidXRlIHF1b3RpbmcuIERlZmF1bHQgaXMgdG8KICAgICAgICAgIHVzZSBkb3VibGUgcXVvdGUgdW5sZXNzIGF0dHJpYnV0ZSB2YWx1ZSBjb250YWlucyBhIGRvdWJsZSBxdW90ZSwKICAgICAgICAgIGluIHdoaWNoIGNhc2Ugc2luZ2xlIHF1b3RlcyBhcmUgdXNlZCBpbnN0ZWFkLgogICAgICAgIGVzY2FwZV9sdF9pbl9hdHRycz1GYWxzZXxUcnVlCiAgICAgICAgICBXaGV0aGVyIHRvIGVzY2FwZSA8IGluIGF0dHJpYnV0ZSB2YWx1ZXMuCiAgICAgICAgZXNjYXBlX3JjZGF0YT1GYWxzZXxUcnVlCiAgICAgICAgICBXaGV0aGVyIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgbmVlZCB0byBiZSBlc2NhcGVkIHdpdGhpbiBub3JtYWwKICAgICAgICAgIGVsZW1lbnRzIHdpdGhpbiByY2RhdGEgZWxlbWVudHMgc3VjaCBhcyBzdHlsZS4KICAgICAgICByZXNvbHZlX2VudGl0aWVzPVRydWV8RmFsc2UKICAgICAgICAgIFdoZXRoZXIgdG8gcmVzb2x2ZSBuYW1lZCBjaGFyYWN0ZXIgZW50aXRpZXMgdGhhdCBhcHBlYXIgaW4gdGhlCiAgICAgICAgICBzb3VyY2UgdHJlZS4gVGhlIFhNTCBwcmVkZWZpbmVkIGVudGl0aWVzICZsdDsgJmd0OyAmYW1wOyAmcXVvdDsgJmFwb3M7CiAgICAgICAgICBhcmUgdW5hZmZlY3RlZCBieSB0aGlzIHNldHRpbmcuCiAgICAgICAgc3RyaXBfd2hpdGVzcGFjZT1GYWxzZXxUcnVlCiAgICAgICAgICBXaGV0aGVyIHRvIHJlbW92ZSBzZW1hbnRpY2FsbHkgbWVhbmluZ2xlc3Mgd2hpdGVzcGFjZS4gKFRoaXMKICAgICAgICAgIGNvbXByZXNzZXMgYWxsIHdoaXRlc3BhY2UgdG8gYSBzaW5nbGUgc3BhY2UgZXhjZXB0IHdpdGhpbiBwcmUuKQogICAgICAgIG1pbmltaXplX2Jvb2xlYW5fYXR0cmlidXRlcz1UcnVlfEZhbHNlCiAgICAgICAgICBTaG9ydGVucyBib29sZWFuIGF0dHJpYnV0ZXMgdG8gZ2l2ZSBqdXN0IHRoZSBhdHRyaWJ1dGUgdmFsdWUsCiAgICAgICAgICBmb3IgZXhhbXBsZSA8aW5wdXQgZGlzYWJsZWQ9ImRpc2FibGVkIj4gYmVjb21lcyA8aW5wdXQgZGlzYWJsZWQ+LgogICAgICAgIHVzZV90cmFpbGluZ19zb2xpZHVzPUZhbHNlfFRydWUKICAgICAgICAgIEluY2x1ZGVzIGEgY2xvc2UtdGFnIHNsYXNoIGF0IHRoZSBlbmQgb2YgdGhlIHN0YXJ0IHRhZyBvZiB2b2lkCiAgICAgICAgICBlbGVtZW50cyAoZW1wdHkgZWxlbWVudHMgd2hvc2UgZW5kIHRhZyBpcyBmb3JiaWRkZW4pLiBFLmcuIDxoci8+LgogICAgICAgIHNwYWNlX2JlZm9yZV90cmFpbGluZ19zb2xpZHVzPVRydWV8RmFsc2UKICAgICAgICAgIFBsYWNlcyBhIHNwYWNlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY2xvc2luZyBzbGFzaCBpbiBhIHRhZwogICAgICAgICAgdXNpbmcgYSB0cmFpbGluZyBzb2xpZHVzLiBFLmcuIDxociAvPi4gUmVxdWlyZXMgdXNlX3RyYWlsaW5nX3NvbGlkdXMuCiAgICAgICAgc2FuaXRpemU9RmFsc2V8VHJ1ZQogICAgICAgICAgU3RyaXAgYWxsIHVuc2FmZSBvciB1bmtub3duIGNvbnN0cnVjdHMgZnJvbSBvdXRwdXQuCiAgICAgICAgICBTZWUgYGh0bWw1bGliIHVzZXIgZG9jdW1lbnRhdGlvbmBfCiAgICAgICAgb21pdF9vcHRpb25hbF90YWdzPVRydWV8RmFsc2UKICAgICAgICAgIE9taXQgc3RhcnQvZW5kIHRhZ3MgdGhhdCBhcmUgb3B0aW9uYWwuCiAgICAgICAgYWxwaGFiZXRpY2FsX2F0dHJpYnV0ZXM9RmFsc2V8VHJ1ZQogICAgICAgICAgUmVvcmRlciBhdHRyaWJ1dGVzIHRvIGJlIGluIGFscGhhYmV0aWNhbCBvcmRlci4KCiAgICAgICAgLi4gX2h0bWw1bGliIHVzZXIgZG9jdW1lbnRhdGlvbjogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2h0bWw1bGliL3dpa2kvVXNlckRvY3VtZW50YXRpb24KICAgICAgICAiIiIKICAgICAgICB1bmV4cGVjdGVkX2FyZ3MgPSBmcm96ZW5zZXQoa3dhcmdzKSAtIGZyb3plbnNldChzZWxmLm9wdGlvbnMpCiAgICAgICAgaWYgbGVuKHVuZXhwZWN0ZWRfYXJncykgPiAwOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIl9faW5pdF9fKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlIG5leHQoaXRlcih1bmV4cGVjdGVkX2FyZ3MpKSkKICAgICAgICBpZiAncXVvdGVfY2hhcicgaW4ga3dhcmdzOgogICAgICAgICAgICBzZWxmLnVzZV9iZXN0X3F1b3RlX2NoYXIgPSBGYWxzZQogICAgICAgIGZvciBhdHRyIGluIHNlbGYub3B0aW9uczoKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBrd2FyZ3MuZ2V0KGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0cikpKQogICAgICAgIHNlbGYuZXJyb3JzID0gW10KICAgICAgICBzZWxmLnN0cmljdCA9IEZhbHNlCgogICAgZGVmIGVuY29kZShzZWxmLCBzdHJpbmcpOgogICAgICAgIGFzc2VydChpc2luc3RhbmNlKHN0cmluZywgdGV4dF90eXBlKSkKICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgogICAgICAgICAgICByZXR1cm4gc3RyaW5nLmVuY29kZShzZWxmLmVuY29kaW5nLCAiaHRtbGVudGl0eXJlcGxhY2UiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcKCiAgICBkZWYgZW5jb2RlU3RyaWN0KHNlbGYsIHN0cmluZyk6CiAgICAgICAgYXNzZXJ0KGlzaW5zdGFuY2Uoc3RyaW5nLCB0ZXh0X3R5cGUpKQogICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdHJpY3QiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYsIHRyZWV3YWxrZXIsIGVuY29kaW5nPU5vbmUpOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9dG9vLW1hbnktbmVzdGVkLWJsb2NrcwogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZwogICAgICAgIGluX2NkYXRhID0gRmFsc2UKICAgICAgICBzZWxmLmVycm9ycyA9IFtdCgogICAgICAgIGlmIGVuY29kaW5nIGFuZCBzZWxmLmluamVjdF9tZXRhX2NoYXJzZXQ6CiAgICAgICAgICAgIGZyb20gLmZpbHRlcnMuaW5qZWN0X21ldGFfY2hhcnNldCBpbXBvcnQgRmlsdGVyCiAgICAgICAgICAgIHRyZWV3YWxrZXIgPSBGaWx0ZXIodHJlZXdhbGtlciwgZW5jb2RpbmcpCiAgICAgICAgIyBBbHBoYWJldGljYWwgYXR0cmlidXRlcyBpcyBoZXJlIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgbm9uZSBvZgogICAgICAgICMgdGhlIGxhdGVyIGZpbHRlcnMgYWRkIG9yIGNoYW5nZSBvcmRlciBvZiBhdHRyaWJ1dGVzOyBpdCBuZWVkcyB0byBiZQogICAgICAgICMgYmVmb3JlIHRoZSBzYW5pdGl6ZXIgc28gZXNjYXBlZCBlbGVtZW50cyBjb21lIG91dCBjb3JyZWN0bHkKICAgICAgICBpZiBzZWxmLmFscGhhYmV0aWNhbF9hdHRyaWJ1dGVzOgogICAgICAgICAgICBmcm9tIC5maWx0ZXJzLmFscGhhYmV0aWNhbGF0dHJpYnV0ZXMgaW1wb3J0IEZpbHRlcgogICAgICAgICAgICB0cmVld2Fsa2VyID0gRmlsdGVyKHRyZWV3YWxrZXIpCiAgICAgICAgIyBXaGl0ZXNwYWNlRmlsdGVyIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBPcHRpb25hbFRhZ0ZpbHRlcgogICAgICAgICMgZm9yIG1heGltdW0gZWZmaWNpZW50bHkgb2YgdGhpcyBsYXR0ZXIgZmlsdGVyCiAgICAgICAgaWYgc2VsZi5zdHJpcF93aGl0ZXNwYWNlOgogICAgICAgICAgICBmcm9tIC5maWx0ZXJzLndoaXRlc3BhY2UgaW1wb3J0IEZpbHRlcgogICAgICAgICAgICB0cmVld2Fsa2VyID0gRmlsdGVyKHRyZWV3YWxrZXIpCiAgICAgICAgaWYgc2VsZi5zYW5pdGl6ZToKICAgICAgICAgICAgZnJvbSAuZmlsdGVycy5zYW5pdGl6ZXIgaW1wb3J0IEZpbHRlcgogICAgICAgICAgICB0cmVld2Fsa2VyID0gRmlsdGVyKHRyZWV3YWxrZXIpCiAgICAgICAgaWYgc2VsZi5vbWl0X29wdGlvbmFsX3RhZ3M6CiAgICAgICAgICAgIGZyb20gLmZpbHRlcnMub3B0aW9uYWx0YWdzIGltcG9ydCBGaWx0ZXIKICAgICAgICAgICAgdHJlZXdhbGtlciA9IEZpbHRlcih0cmVld2Fsa2VyKQoKICAgICAgICBmb3IgdG9rZW4gaW4gdHJlZXdhbGtlcjoKICAgICAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICAgICAgaWYgdHlwZSA9PSAiRG9jdHlwZSI6CiAgICAgICAgICAgICAgICBkb2N0eXBlID0gIjwhRE9DVFlQRSAlcyIgJSB0b2tlblsibmFtZSJdCgogICAgICAgICAgICAgICAgaWYgdG9rZW5bInB1YmxpY0lkIl06CiAgICAgICAgICAgICAgICAgICAgZG9jdHlwZSArPSAnIFBVQkxJQyAiJXMiJyAlIHRva2VuWyJwdWJsaWNJZCJdCiAgICAgICAgICAgICAgICBlbGlmIHRva2VuWyJzeXN0ZW1JZCJdOgogICAgICAgICAgICAgICAgICAgIGRvY3R5cGUgKz0gIiBTWVNURU0iCiAgICAgICAgICAgICAgICBpZiB0b2tlblsic3lzdGVtSWQiXToKICAgICAgICAgICAgICAgICAgICBpZiB0b2tlblsic3lzdGVtSWQiXS5maW5kKCciJykgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5bInN5c3RlbUlkIl0uZmluZCgiJyIpID49IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKCJTeXN0ZW0gaWRlbnRpZmVyIGNvbnRhaW5zIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgcXVvdGUgY2hhcmFjdGVycyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAiJyIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJyInCiAgICAgICAgICAgICAgICAgICAgZG9jdHlwZSArPSAiICVzJXMlcyIgJSAocXVvdGVfY2hhciwgdG9rZW5bInN5c3RlbUlkIl0sIHF1b3RlX2NoYXIpCgogICAgICAgICAgICAgICAgZG9jdHlwZSArPSAiPiIKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KGRvY3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgaW4gKCJDaGFyYWN0ZXJzIiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3BhY2VDaGFyYWN0ZXJzIiBvciBpbl9jZGF0YToKICAgICAgICAgICAgICAgICAgICBpZiBpbl9jZGF0YSBhbmQgdG9rZW5bImRhdGEiXS5maW5kKCI8LyIpID49IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIlVuZXhwZWN0ZWQgPC8gaW4gQ0RBVEEiKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlKHRva2VuWyJkYXRhIl0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlKGVzY2FwZSh0b2tlblsiZGF0YSJdKSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIjwlcyIgJSBuYW1lKQogICAgICAgICAgICAgICAgaWYgbmFtZSBpbiByY2RhdGFFbGVtZW50cyBhbmQgbm90IHNlbGYuZXNjYXBlX3JjZGF0YToKICAgICAgICAgICAgICAgICAgICBpbl9jZGF0YSA9IFRydWUKICAgICAgICAgICAgICAgIGVsaWYgaW5fY2RhdGE6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiVW5leHBlY3RlZCBjaGlsZCBlbGVtZW50IG9mIGEgQ0RBVEEgZWxlbWVudCIpCiAgICAgICAgICAgICAgICBmb3IgKF8sIGF0dHJfbmFtZSksIGF0dHJfdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICMgVE9ETzogQWRkIG5hbWVzcGFjZSBzdXBwb3J0IGhlcmUKICAgICAgICAgICAgICAgICAgICBrID0gYXR0cl9uYW1lCiAgICAgICAgICAgICAgICAgICAgdiA9IGF0dHJfdmFsdWUKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgnICcpCgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KGspCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubWluaW1pemVfYm9vbGVhbl9hdHRyaWJ1dGVzIG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgKGsgbm90IGluIGJvb2xlYW5BdHRyaWJ1dGVzLmdldChuYW1lLCB0dXBsZSgpKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIGsgbm90IGluIGJvb2xlYW5BdHRyaWJ1dGVzLmdldCgiIiwgdHVwbGUoKSkpOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiPSIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucXVvdGVfYXR0cl92YWx1ZXMgPT0gImFsd2F5cyIgb3IgbGVuKHYpID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9hdHRyID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYucXVvdGVfYXR0cl92YWx1ZXMgPT0gInNwZWMiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfYXR0ciA9IF9xdW90ZUF0dHJpYnV0ZVNwZWMuc2VhcmNoKHYpIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5xdW90ZV9hdHRyX3ZhbHVlcyA9PSAibGVnYWN5IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2F0dHIgPSBfcXVvdGVBdHRyaWJ1dGVMZWdhY3kuc2VhcmNoKHYpIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJxdW90ZV9hdHRyX3ZhbHVlcyBtdXN0IGJlIG9uZSBvZjogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ2Fsd2F5cycsICdzcGVjJywgb3IgJ2xlZ2FjeSciKQogICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCImIiwgIiZhbXA7IikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NhcGVfbHRfaW5fYXR0cnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCI8IiwgIiZsdDsiKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBxdW90ZV9hdHRyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9IHNlbGYucXVvdGVfY2hhcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi51c2VfYmVzdF9xdW90ZV9jaGFyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICInIiBpbiB2IGFuZCAnIicgbm90IGluIHY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAnIicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmICciJyBpbiB2IGFuZCAiJyIgbm90IGluIHY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAiJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHF1b3RlX2NoYXIgPT0gIiciOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoIiciLCAiJiMzOTsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCciJywgIiZxdW90OyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdChxdW90ZV9jaGFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGUodikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KHF1b3RlX2NoYXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZSh2KQogICAgICAgICAgICAgICAgaWYgbmFtZSBpbiB2b2lkRWxlbWVudHMgYW5kIHNlbGYudXNlX3RyYWlsaW5nX3NvbGlkdXM6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zcGFjZV9iZWZvcmVfdHJhaWxpbmdfc29saWR1czoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIiAvIikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiLyIpCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZSgiPiIpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAgaWYgbmFtZSBpbiByY2RhdGFFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBpbl9jZGF0YSA9IEZhbHNlCiAgICAgICAgICAgICAgICBlbGlmIGluX2NkYXRhOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIlVuZXhwZWN0ZWQgY2hpbGQgZWxlbWVudCBvZiBhIENEQVRBIGVsZW1lbnQiKQogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIjwvJXM+IiAlIG5hbWUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICAgICAgZGF0YSA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgICAgIGlmIGRhdGEuZmluZCgiLS0iKSA+PSAwOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIkNvbW1lbnQgY29udGFpbnMgLS0iKQogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIjwhLS0lcy0tPiIgJSB0b2tlblsiZGF0YSJdKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbnRpdHkiOgogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgICAgIGtleSA9IG5hbWUgKyAiOyIKICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gZW50aXRpZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiRW50aXR5ICVzIG5vdCByZWNvZ25pemVkIiAlIG5hbWUpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnJlc29sdmVfZW50aXRpZXMgYW5kIGtleSBub3QgaW4geG1sRW50aXRpZXM6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVudGl0aWVzW2tleV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICImJXM7IiAlIG5hbWUKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KGRhdGEpCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcih0b2tlblsiZGF0YSJdKQoKICAgIGRlZiByZW5kZXIoc2VsZiwgdHJlZXdhbGtlciwgZW5jb2Rpbmc9Tm9uZSk6CiAgICAgICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihsaXN0KHNlbGYuc2VyaWFsaXplKHRyZWV3YWxrZXIsIGVuY29kaW5nKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4obGlzdChzZWxmLnNlcmlhbGl6ZSh0cmVld2Fsa2VyKSkpCgogICAgZGVmIHNlcmlhbGl6ZUVycm9yKHNlbGYsIGRhdGE9IlhYWCBFUlJPUiBNRVNTQUdFIE5FRURFRCIpOgogICAgICAgICMgWFhYIFRoZSBpZGVhIGlzIHRvIG1ha2UgZGF0YSBtYW5kYXRvcnkuCiAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKGRhdGEpCiAgICAgICAgaWYgc2VsZi5zdHJpY3Q6CiAgICAgICAgICAgIHJhaXNlIFNlcmlhbGl6ZUVycm9yCgoKY2xhc3MgU2VyaWFsaXplRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkVycm9yIGluIHNlcmlhbGl6ZWQgdHJlZSIiIgogICAgcGFzcwpQSwMEFAAAAAAAAAAhAIIyYyTQAAAA0AAAAEoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuIGltcG9ydCBzYXgKCl9fYWxsX18gPSBbInNheCJdCgp0cnk6CiAgICBmcm9tIC4gaW1wb3J0IGdlbnNoaSAgIyBub3FhCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKZWxzZToKICAgIF9fYWxsX18uYXBwZW5kKCJnZW5zaGkiKQpQSwMEFAAAAAAAAAAhADEnx74TBgAAEwYAAEgAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9nZW5zaGkucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFFOYW1lLCBBdHRycwpmcm9tIGdlbnNoaS5jb3JlIGltcG9ydCBTVEFSVCwgRU5ELCBURVhULCBDT01NRU5ULCBET0NUWVBFCgoKZGVmIHRvX2dlbnNoaSh3YWxrZXIpOgogICAgdGV4dCA9IFtdCiAgICBmb3IgdG9rZW4gaW4gd2Fsa2VyOgogICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgIHRleHQuYXBwZW5kKHRva2VuWyJkYXRhIl0pCiAgICAgICAgZWxpZiB0ZXh0OgogICAgICAgICAgICB5aWVsZCBURVhULCAiIi5qb2luKHRleHQpLCAoTm9uZSwgLTEsIC0xKQogICAgICAgICAgICB0ZXh0ID0gW10KCiAgICAgICAgaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lc3BhY2UiXToKICAgICAgICAgICAgICAgIG5hbWUgPSAieyVzfSVzIiAlICh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICBhdHRycyA9IEF0dHJzKFsoUU5hbWUoInslc30lcyIgJSBhdHRyIGlmIGF0dHJbMF0gaXMgbm90IE5vbmUgZWxzZSBhdHRyWzFdKSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCldKQogICAgICAgICAgICB5aWVsZCAoU1RBUlQsIChRTmFtZShuYW1lKSwgYXR0cnMpLCAoTm9uZSwgLTEsIC0xKSkKICAgICAgICAgICAgaWYgdHlwZSA9PSAiRW1wdHlUYWciOgogICAgICAgICAgICAgICAgdHlwZSA9ICJFbmRUYWciCgogICAgICAgIGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lc3BhY2UiXToKICAgICAgICAgICAgICAgIG5hbWUgPSAieyVzfSVzIiAlICh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQoKICAgICAgICAgICAgeWllbGQgRU5ELCBRTmFtZShuYW1lKSwgKE5vbmUsIC0xLCAtMSkKCiAgICAgICAgZWxpZiB0eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgeWllbGQgQ09NTUVOVCwgdG9rZW5bImRhdGEiXSwgKE5vbmUsIC0xLCAtMSkKCiAgICAgICAgZWxpZiB0eXBlID09ICJEb2N0eXBlIjoKICAgICAgICAgICAgeWllbGQgRE9DVFlQRSwgKHRva2VuWyJuYW1lIl0sIHRva2VuWyJwdWJsaWNJZCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bInN5c3RlbUlkIl0pLCAoTm9uZSwgLTEsIC0xKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXNzICAjIEZJWE1FOiBXaGF0IHRvIGRvPwoKICAgIGlmIHRleHQ6CiAgICAgICAgeWllbGQgVEVYVCwgIiIuam9pbih0ZXh0KSwgKE5vbmUsIC0xLCAtMSkKUEsDBBQAAAAAAAAAIQDkXF8QfQYAAH0GAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvc2F4LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIHhtbC5zYXgueG1scmVhZGVyIGltcG9ydCBBdHRyaWJ1dGVzTlNJbXBsCgpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBhZGp1c3RGb3JlaWduQXR0cmlidXRlcywgdW5hZGp1c3RGb3JlaWduQXR0cmlidXRlcwoKcHJlZml4X21hcHBpbmcgPSB7fQpmb3IgcHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZSBpbiBhZGp1c3RGb3JlaWduQXR0cmlidXRlcy52YWx1ZXMoKToKICAgIGlmIHByZWZpeCBpcyBub3QgTm9uZToKICAgICAgICBwcmVmaXhfbWFwcGluZ1twcmVmaXhdID0gbmFtZXNwYWNlCgoKZGVmIHRvX3NheCh3YWxrZXIsIGhhbmRsZXIpOgogICAgIiIiQ2FsbCBTQVgtbGlrZSBjb250ZW50IGhhbmRsZXIgYmFzZWQgb24gdHJlZXdhbGtlciB3YWxrZXIiIiIKICAgIGhhbmRsZXIuc3RhcnREb2N1bWVudCgpCiAgICBmb3IgcHJlZml4LCBuYW1lc3BhY2UgaW4gcHJlZml4X21hcHBpbmcuaXRlbXMoKToKICAgICAgICBoYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIG5hbWVzcGFjZSkKCiAgICBmb3IgdG9rZW4gaW4gd2Fsa2VyOgogICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdHlwZSA9PSAiRG9jdHlwZSI6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZWxpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgYXR0cnMgPSBBdHRyaWJ1dGVzTlNJbXBsKHRva2VuWyJkYXRhIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzKQogICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RWxlbWVudE5TKCh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMpCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIkVtcHR5VGFnIjoKICAgICAgICAgICAgICAgIGhhbmRsZXIuZW5kRWxlbWVudE5TKCh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSkKICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgIGhhbmRsZXIuZW5kRWxlbWVudE5TKCh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdKQogICAgICAgIGVsaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgIGhhbmRsZXIuY2hhcmFjdGVycyh0b2tlblsiZGF0YSJdKQogICAgICAgIGVsaWYgdHlwZSA9PSAiQ29tbWVudCI6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJVbmtub3duIHRva2VuIHR5cGUiCgogICAgZm9yIHByZWZpeCwgbmFtZXNwYWNlIGluIHByZWZpeF9tYXBwaW5nLml0ZW1zKCk6CiAgICAgICAgaGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCkKICAgIGhhbmRsZXIuZW5kRG9jdW1lbnQoKQpQSwMEFAAAAAAAAAAhAEfZN25ODQAATg0AAEoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9fX2luaXRfXy5weSIiIkEgY29sbGVjdGlvbiBvZiBtb2R1bGVzIGZvciBidWlsZGluZyBkaWZmZXJlbnQga2luZHMgb2YgdHJlZSBmcm9tCkhUTUwgZG9jdW1lbnRzLgoKVG8gY3JlYXRlIGEgdHJlZWJ1aWxkZXIgZm9yIGEgbmV3IHR5cGUgb2YgdHJlZSwgeW91IG5lZWQgdG8gZG8KaW1wbGVtZW50IHNldmVyYWwgdGhpbmdzOgoKMSkgQSBzZXQgb2YgY2xhc3NlcyBmb3IgdmFyaW91cyB0eXBlcyBvZiBlbGVtZW50czogRG9jdW1lbnQsIERvY3R5cGUsCkNvbW1lbnQsIEVsZW1lbnQuIFRoZXNlIG11c3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2Ugb2YKX2Jhc2UudHJlZWJ1aWxkZXJzLk5vZGUgKGFsdGhvdWdoIGNvbW1lbnQgbm9kZXMgaGF2ZSBhIGRpZmZlcmVudApzaWduYXR1cmUgZm9yIHRoZWlyIGNvbnN0cnVjdG9yLCBzZWUgdHJlZWJ1aWxkZXJzLmV0cmVlLkNvbW1lbnQpClRleHR1YWwgY29udGVudCBtYXkgYWxzbyBiZSBpbXBsZW1lbnRlZCBhcyBhbm90aGVyIG5vZGUgdHlwZSwgb3Igbm90LCBhcwp5b3VyIHRyZWUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMuCgoyKSBBIHRyZWVidWlsZGVyIG9iamVjdCAoY2FsbGVkIFRyZWVCdWlsZGVyIGJ5IGNvbnZlbnRpb24pIHRoYXQKaW5oZXJpdHMgZnJvbSB0cmVlYnVpbGRlcnMuX2Jhc2UuVHJlZUJ1aWxkZXIuIFRoaXMgaGFzIDQgcmVxdWlyZWQgYXR0cmlidXRlczoKZG9jdW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIHRoZSBib3R0b21tb3N0IG5vZGUgb2YgYSBkb2N1bWVudAplbGVtZW50Q2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciBIVE1MIEVsZW1lbnRzCmNvbW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIGNvbW1lbnRzCmRvY3R5cGVDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIGRvY3R5cGVzCkl0IGFsc28gaGFzIG9uZSByZXF1aXJlZCBtZXRob2Q6CmdldERvY3VtZW50IC0gUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSBjb21wbGV0ZSBkb2N1bWVudCB0cmVlCgozKSBJZiB5b3Ugd2lzaCB0byBydW4gdGhlIHVuaXQgdGVzdHMsIHlvdSBtdXN0IGFsc28gY3JlYXRlIGEKdGVzdFNlcmlhbGl6ZXIgbWV0aG9kIG9uIHlvdXIgdHJlZWJ1aWxkZXIgd2hpY2ggYWNjZXB0cyBhIG5vZGUgYW5kCnJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBOb2RlIGFuZCBpdHMgY2hpbGRyZW4gc2VyaWFsaXplZCBhY2NvcmRpbmcKdG8gdGhlIGZvcm1hdCB1c2VkIGluIHRoZSB1bml0dGVzdHMKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLi5fdXRpbHMgaW1wb3J0IGRlZmF1bHRfZXRyZWUKCnRyZWVCdWlsZGVyQ2FjaGUgPSB7fQoKCmRlZiBnZXRUcmVlQnVpbGRlcih0cmVlVHlwZSwgaW1wbGVtZW50YXRpb249Tm9uZSwgKiprd2FyZ3MpOgogICAgIiIiR2V0IGEgVHJlZUJ1aWxkZXIgY2xhc3MgZm9yIHZhcmlvdXMgdHlwZXMgb2YgdHJlZSB3aXRoIGJ1aWx0LWluIHN1cHBvcnQKCiAgICB0cmVlVHlwZSAtIHRoZSBuYW1lIG9mIHRoZSB0cmVlIHR5cGUgcmVxdWlyZWQgKGNhc2UtaW5zZW5zaXRpdmUpLiBTdXBwb3J0ZWQKICAgICAgICAgICAgICAgdmFsdWVzIGFyZToKCiAgICAgICAgICAgICAgICJkb20iIC0gQSBnZW5lcmljIGJ1aWxkZXIgZm9yIERPTSBpbXBsZW1lbnRhdGlvbnMsIGRlZmF1bHRpbmcgdG8KICAgICAgICAgICAgICAgICAgICAgICBhIHhtbC5kb20ubWluaWRvbSBiYXNlZCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICAgICAgImV0cmVlIiAtIEEgZ2VuZXJpYyBidWlsZGVyIGZvciB0cmVlIGltcGxlbWVudGF0aW9ucyBleHBvc2luZyBhbgogICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFRyZWUtbGlrZSBpbnRlcmZhY2UsIGRlZmF1bHRpbmcgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIHhtbC5ldHJlZS5jRWxlbWVudFRyZWUgaWYgYXZhaWxhYmxlIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGlmIG5vdC4KICAgICAgICAgICAgICAgImx4bWwiIC0gQSBldHJlZS1iYXNlZCBidWlsZGVyIGZvciBseG1sLmV0cmVlLCBoYW5kbGluZwogICAgICAgICAgICAgICAgICAgICAgICBsaW1pdGF0aW9ucyBvZiBseG1sJ3MgaW1wbGVtZW50YXRpb24uCgogICAgaW1wbGVtZW50YXRpb24gLSAoQ3VycmVudGx5IGFwcGxpZXMgdG8gdGhlICJldHJlZSIgYW5kICJkb20iIHRyZWUgdHlwZXMpLiBBCiAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaW1wbGVtZW50aW5nIHRoZSB0cmVlIHR5cGUgZS5nLgogICAgICAgICAgICAgICAgICAgICAgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIG9yIHhtbC5ldHJlZS5jRWxlbWVudFRyZWUuIiIiCgogICAgdHJlZVR5cGUgPSB0cmVlVHlwZS5sb3dlcigpCiAgICBpZiB0cmVlVHlwZSBub3QgaW4gdHJlZUJ1aWxkZXJDYWNoZToKICAgICAgICBpZiB0cmVlVHlwZSA9PSAiZG9tIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBkb20KICAgICAgICAgICAgIyBDb21lIHVwIHdpdGggYSBzYW5lIGRlZmF1bHQgKHByZWYuIGZyb20gdGhlIHN0ZGxpYikKICAgICAgICAgICAgaWYgaW1wbGVtZW50YXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGZyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbQogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gPSBtaW5pZG9tCiAgICAgICAgICAgICMgTkVWRVIgY2FjaGUgaGVyZSwgY2FjaGluZyBpcyBkb25lIGluIHRoZSBkb20gc3VibW9kdWxlCiAgICAgICAgICAgIHJldHVybiBkb20uZ2V0RG9tTW9kdWxlKGltcGxlbWVudGF0aW9uLCAqKmt3YXJncykuVHJlZUJ1aWxkZXIKICAgICAgICBlbGlmIHRyZWVUeXBlID09ICJseG1sIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBldHJlZV9seG1sCiAgICAgICAgICAgIHRyZWVCdWlsZGVyQ2FjaGVbdHJlZVR5cGVdID0gZXRyZWVfbHhtbC5UcmVlQnVpbGRlcgogICAgICAgIGVsaWYgdHJlZVR5cGUgPT0gImV0cmVlIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBldHJlZQogICAgICAgICAgICBpZiBpbXBsZW1lbnRhdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gPSBkZWZhdWx0X2V0cmVlCiAgICAgICAgICAgICMgTkVWRVIgY2FjaGUgaGVyZSwgY2FjaGluZyBpcyBkb25lIGluIHRoZSBldHJlZSBzdWJtb2R1bGUKICAgICAgICAgICAgcmV0dXJuIGV0cmVlLmdldEVUcmVlTW9kdWxlKGltcGxlbWVudGF0aW9uLCAqKmt3YXJncykuVHJlZUJ1aWxkZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCIiIlVucmVjb2duaXNlZCB0cmVlYnVpbGRlciAiJXMiICIiIiAlIHRyZWVUeXBlKQogICAgcmV0dXJuIHRyZWVCdWlsZGVyQ2FjaGUuZ2V0KHRyZWVUeXBlKQpQSwMEFAAAAAAAAAAhAETKVqp2NgAAdjYAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9iYXNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IHNjb3BpbmdFbGVtZW50cywgdGFibGVJbnNlcnRNb2RlRWxlbWVudHMsIG5hbWVzcGFjZXMKCiMgVGhlIHNjb3BlIG1hcmtlcnMgYXJlIGluc2VydGVkIHdoZW4gZW50ZXJpbmcgb2JqZWN0IGVsZW1lbnRzLAojIG1hcnF1ZWVzLCB0YWJsZSBjZWxscywgYW5kIHRhYmxlIGNhcHRpb25zLCBhbmQgYXJlIHVzZWQgdG8gcHJldmVudCBmb3JtYXR0aW5nCiMgZnJvbSAibGVha2luZyIgaW50byB0YWJsZXMsIG9iamVjdCBlbGVtZW50cywgYW5kIG1hcnF1ZWVzLgpNYXJrZXIgPSBOb25lCgpsaXN0RWxlbWVudHNNYXAgPSB7CiAgICBOb25lOiAoZnJvemVuc2V0KHNjb3BpbmdFbGVtZW50cyksIEZhbHNlKSwKICAgICJidXR0b24iOiAoZnJvemVuc2V0KHNjb3BpbmdFbGVtZW50cyB8IHNldChbKG5hbWVzcGFjZXNbImh0bWwiXSwgImJ1dHRvbiIpXSkpLCBGYWxzZSksCiAgICAibGlzdCI6IChmcm96ZW5zZXQoc2NvcGluZ0VsZW1lbnRzIHwgc2V0KFsobmFtZXNwYWNlc1siaHRtbCJdLCAib2wiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ1bCIpXSkpLCBGYWxzZSksCiAgICAidGFibGUiOiAoZnJvemVuc2V0KFsobmFtZXNwYWNlc1siaHRtbCJdLCAiaHRtbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRhYmxlIildKSwgRmFsc2UpLAogICAgInNlbGVjdCI6IChmcm96ZW5zZXQoWyhuYW1lc3BhY2VzWyJodG1sIl0sICJvcHRncm91cCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJvcHRpb24iKV0pLCBUcnVlKQp9CgoKY2xhc3MgTm9kZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgICIiIk5vZGUgcmVwcmVzZW50aW5nIGFuIGl0ZW0gaW4gdGhlIHRyZWUuCiAgICAgICAgbmFtZSAtIFRoZSB0YWcgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUKICAgICAgICBwYXJlbnQgLSBUaGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgKG9yIE5vbmUgZm9yIHRoZSBkb2N1bWVudCBub2RlKQogICAgICAgIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IG5vZGUgKGFwcGxpZXMgdG8gdGV4dCBub2RlcyBhbmQKICAgICAgICBjb21tZW50cwogICAgICAgIGF0dHJpYnV0ZXMgLSBhIGRpY3QgaG9sZGluZyBuYW1lLCB2YWx1ZSBwYWlycyBmb3IgYXR0cmlidXRlcyBvZiB0aGUgbm9kZQogICAgICAgIGNoaWxkTm9kZXMgLSBhIGxpc3Qgb2YgY2hpbGQgbm9kZXMgb2YgdGhlIGN1cnJlbnQgbm9kZS4gVGhpcyBtdXN0CiAgICAgICAgaW5jbHVkZSBhbGwgZWxlbWVudHMgYnV0IG5vdCBuZWNlc3NhcmlseSBvdGhlciBub2RlIHR5cGVzCiAgICAgICAgX2ZsYWdzIC0gQSBsaXN0IG9mIG1pc2NlbGxhbmVvdXMgZmxhZ3MgdGhhdCBjYW4gYmUgc2V0IG9uIHRoZSBub2RlCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQogICAgICAgIHNlbGYudmFsdWUgPSBOb25lCiAgICAgICAgc2VsZi5hdHRyaWJ1dGVzID0ge30KICAgICAgICBzZWxmLmNoaWxkTm9kZXMgPSBbXQogICAgICAgIHNlbGYuX2ZsYWdzID0gW10KCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBhdHRyaWJ1dGVzU3RyID0gIiAiLmpvaW4oWyIlcz1cIiVzXCIiICUgKG5hbWUsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZXMuaXRlbXMoKV0pCiAgICAgICAgaWYgYXR0cmlidXRlc1N0cjoKICAgICAgICAgICAgcmV0dXJuICI8JXMgJXM+IiAlIChzZWxmLm5hbWUsIGF0dHJpYnV0ZXNTdHIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICI8JXM+IiAlIChzZWxmLm5hbWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPCVzPiIgJSAoc2VsZi5uYW1lKQoKICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAiIiJJbnNlcnQgbm9kZSBhcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IG5vZGUKICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgaW5zZXJ0QmVmb3JlPU5vbmUpOgogICAgICAgICIiIkluc2VydCBkYXRhIGFzIHRleHQgaW4gdGhlIGN1cnJlbnQgbm9kZSwgcG9zaXRpb25lZCBiZWZvcmUgdGhlCiAgICAgICAgc3RhcnQgb2Ygbm9kZSBpbnNlcnRCZWZvcmUgb3IgdG8gdGhlIGVuZCBvZiB0aGUgbm9kZSdzIHRleHQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbm9kZSwgcmVmTm9kZSk6CiAgICAgICAgIiIiSW5zZXJ0IG5vZGUgYXMgYSBjaGlsZCBvZiB0aGUgY3VycmVudCBub2RlLCBiZWZvcmUgcmVmTm9kZSBpbiB0aGUKICAgICAgICBsaXN0IG9mIGNoaWxkIG5vZGVzLiBSYWlzZXMgVmFsdWVFcnJvciBpZiByZWZOb2RlIGlzIG5vdCBhIGNoaWxkIG9mCiAgICAgICAgdGhlIGN1cnJlbnQgbm9kZSIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgIiIiUmVtb3ZlIG5vZGUgZnJvbSB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZQogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgcmVwYXJlbnRDaGlsZHJlbihzZWxmLCBuZXdQYXJlbnQpOgogICAgICAgICIiIk1vdmUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBub2RlIHRvIG5ld1BhcmVudC4KICAgICAgICBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IHRyZWVzIHRoYXQgZG9uJ3Qgc3RvcmUgdGV4dCBhcyBub2RlcyBtb3ZlIHRoZQogICAgICAgIHRleHQgaW4gdGhlIGNvcnJlY3Qgd2F5CiAgICAgICAgIiIiCiAgICAgICAgIyBYWFggLSBzaG91bGQgdGhpcyBtZXRob2QgYmUgbWFkZSBtb3JlIGdlbmVyYWw/CiAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hpbGROb2RlczoKICAgICAgICAgICAgbmV3UGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKQogICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IFtdCgogICAgZGVmIGNsb25lTm9kZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGN1cnJlbnQgbm9kZSBpLmUuIGEgbm9kZSB3aXRoIHRoZSBzYW1lCiAgICAgICAgbmFtZSBhbmQgYXR0cmlidXRlcyBidXQgd2l0aCBubyBwYXJlbnQgb3IgY2hpbGQgbm9kZXMKICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGhhc0NvbnRlbnQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaGFzIGNoaWxkcmVuIG9yIHRleHQsIGZhbHNlIG90aGVyd2lzZQogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMobGlzdCk6CiAgICBkZWYgYXBwZW5kKHNlbGYsIG5vZGUpOgogICAgICAgIGVxdWFsQ291bnQgPSAwCiAgICAgICAgaWYgbm9kZSAhPSBNYXJrZXI6CiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHNlbGZbOjotMV06CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50ID09IE1hcmtlcjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgc2VsZi5ub2Rlc0VxdWFsKGVsZW1lbnQsIG5vZGUpOgogICAgICAgICAgICAgICAgICAgIGVxdWFsQ291bnQgKz0gMQogICAgICAgICAgICAgICAgaWYgZXF1YWxDb3VudCA9PSAzOgogICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBsaXN0LmFwcGVuZChzZWxmLCBub2RlKQoKICAgIGRlZiBub2Rlc0VxdWFsKHNlbGYsIG5vZGUxLCBub2RlMik6CiAgICAgICAgaWYgbm90IG5vZGUxLm5hbWVUdXBsZSA9PSBub2RlMi5uYW1lVHVwbGU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiBub3Qgbm9kZTEuYXR0cmlidXRlcyA9PSBub2RlMi5hdHRyaWJ1dGVzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIFRydWUKCgpjbGFzcyBUcmVlQnVpbGRlcihvYmplY3QpOgogICAgIiIiQmFzZSB0cmVlYnVpbGRlciBpbXBsZW1lbnRhdGlvbgogICAgZG9jdW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIHRoZSBib3R0b21tb3N0IG5vZGUgb2YgYSBkb2N1bWVudAogICAgZWxlbWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgSFRNTCBFbGVtZW50cwogICAgY29tbWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgY29tbWVudHMKICAgIGRvY3R5cGVDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIGRvY3R5cGVzCiAgICAiIiIKICAgICMgcHlsaW50OmRpc2FibGU9bm90LWNhbGxhYmxlCgogICAgIyBEb2N1bWVudCBjbGFzcwogICAgZG9jdW1lbnRDbGFzcyA9IE5vbmUKCiAgICAjIFRoZSBjbGFzcyB0byB1c2UgZm9yIGNyZWF0aW5nIGEgbm9kZQogICAgZWxlbWVudENsYXNzID0gTm9uZQoKICAgICMgVGhlIGNsYXNzIHRvIHVzZSBmb3IgY3JlYXRpbmcgY29tbWVudHMKICAgIGNvbW1lbnRDbGFzcyA9IE5vbmUKCiAgICAjIFRoZSBjbGFzcyB0byB1c2UgZm9yIGNyZWF0aW5nIGRvY3R5cGVzCiAgICBkb2N0eXBlQ2xhc3MgPSBOb25lCgogICAgIyBGcmFnbWVudCBjbGFzcwogICAgZnJhZ21lbnRDbGFzcyA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzKToKICAgICAgICBpZiBuYW1lc3BhY2VIVE1MRWxlbWVudHM6CiAgICAgICAgICAgIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMgPSBbXQogICAgICAgIHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzID0gQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKCiAgICAgICAgIyBYWFggLSByZW5hbWUgdGhlc2UgdG8gaGVhZEVsZW1lbnQsIGZvcm1FbGVtZW50CiAgICAgICAgc2VsZi5oZWFkUG9pbnRlciA9IE5vbmUKICAgICAgICBzZWxmLmZvcm1Qb2ludGVyID0gTm9uZQoKICAgICAgICBzZWxmLmluc2VydEZyb21UYWJsZSA9IEZhbHNlCgogICAgICAgIHNlbGYuZG9jdW1lbnQgPSBzZWxmLmRvY3VtZW50Q2xhc3MoKQoKICAgIGRlZiBlbGVtZW50SW5TY29wZShzZWxmLCB0YXJnZXQsIHZhcmlhbnQ9Tm9uZSk6CgogICAgICAgICMgSWYgd2UgcGFzcyBhIG5vZGUgaW4gd2UgbWF0Y2ggdGhhdC4gaWYgd2UgcGFzcyBhIHN0cmluZwogICAgICAgICMgbWF0Y2ggYW55IG5vZGUgd2l0aCB0aGF0IG5hbWUKICAgICAgICBleGFjdE5vZGUgPSBoYXNhdHRyKHRhcmdldCwgIm5hbWVUdXBsZSIpCiAgICAgICAgaWYgbm90IGV4YWN0Tm9kZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0YXJnZXQsIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSAobmFtZXNwYWNlc1siaHRtbCJdLCB0YXJnZXQpCiAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRhcmdldCwgdHVwbGUpCgogICAgICAgIGxpc3RFbGVtZW50cywgaW52ZXJ0ID0gbGlzdEVsZW1lbnRzTWFwW3ZhcmlhbnRdCgogICAgICAgIGZvciBub2RlIGluIHJldmVyc2VkKHNlbGYub3BlbkVsZW1lbnRzKToKICAgICAgICAgICAgaWYgZXhhY3ROb2RlIGFuZCBub2RlID09IHRhcmdldDoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGV4YWN0Tm9kZSBhbmQgbm9kZS5uYW1lVHVwbGUgPT0gdGFyZ2V0OgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxpZiAoaW52ZXJ0IF4gKG5vZGUubmFtZVR1cGxlIGluIGxpc3RFbGVtZW50cykpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGFzc2VydCBGYWxzZSAgIyBXZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludAoKICAgIGRlZiByZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyhzZWxmKToKICAgICAgICAjIFdpdGhpbiB0aGlzIGFsZ29yaXRobSB0aGUgb3JkZXIgb2Ygc3RlcHMgZGVzY3JpYmVkIGluIHRoZQogICAgICAgICMgc3BlY2lmaWNhdGlvbiBpcyBub3QgcXVpdGUgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIG9mIHN0ZXBzIGluIHRoZQogICAgICAgICMgY29kZS4gSXQgc2hvdWxkIHN0aWxsIGRvIHRoZSBzYW1lIHRob3VnaC4KCiAgICAgICAgIyBTdGVwIDE6IHN0b3AgdGhlIGFsZ29yaXRobSB3aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KICAgICAgICBpZiBub3Qgc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFN0ZXAgMiBhbmQgc3RlcCAzOiB3ZSBzdGFydCB3aXRoIHRoZSBsYXN0IGVsZW1lbnQuIFNvIGkgaXMgLTEuCiAgICAgICAgaSA9IGxlbihzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cykgLSAxCiAgICAgICAgZW50cnkgPSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1tpXQogICAgICAgIGlmIGVudHJ5ID09IE1hcmtlciBvciBlbnRyeSBpbiBzZWxmLm9wZW5FbGVtZW50czoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgU3RlcCA2CiAgICAgICAgd2hpbGUgZW50cnkgIT0gTWFya2VyIGFuZCBlbnRyeSBub3QgaW4gc2VsZi5vcGVuRWxlbWVudHM6CiAgICAgICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIGJlIHJlc2V0IHRvIDAgYmVsb3cKICAgICAgICAgICAgICAgIGkgPSAtMQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaSAtPSAxCiAgICAgICAgICAgICMgU3RlcCA1OiBsZXQgZW50cnkgYmUgb25lIGVhcmxpZXIgaW4gdGhlIGxpc3QuCiAgICAgICAgICAgIGVudHJ5ID0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbaV0KCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBTdGVwIDcKICAgICAgICAgICAgaSArPSAxCgogICAgICAgICAgICAjIFN0ZXAgOAogICAgICAgICAgICBlbnRyeSA9IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzW2ldCiAgICAgICAgICAgIGNsb25lID0gZW50cnkuY2xvbmVOb2RlKCkgICMgTWFpbmx5IHRvIGdldCBhIG5ldyBjb3B5IG9mIHRoZSBhdHRyaWJ1dGVzCgogICAgICAgICAgICAjIFN0ZXAgOQogICAgICAgICAgICBlbGVtZW50ID0gc2VsZi5pbnNlcnRFbGVtZW50KHsidHlwZSI6ICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY2xvbmUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWVzcGFjZSI6IGNsb25lLm5hbWVzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBjbG9uZS5hdHRyaWJ1dGVzfSkKCiAgICAgICAgICAgICMgU3RlcCAxMAogICAgICAgICAgICBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1tpXSA9IGVsZW1lbnQKCiAgICAgICAgICAgICMgU3RlcCAxMQogICAgICAgICAgICBpZiBlbGVtZW50ID09IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzWy0xXToKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgZGVmIGNsZWFyQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKHNlbGYpOgogICAgICAgIGVudHJ5ID0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucG9wKCkKICAgICAgICB3aGlsZSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyBhbmQgZW50cnkgIT0gTWFya2VyOgogICAgICAgICAgICBlbnRyeSA9IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnBvcCgpCgogICAgZGVmIGVsZW1lbnRJbkFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyhzZWxmLCBuYW1lKToKICAgICAgICAiIiJDaGVjayBpZiBhbiBlbGVtZW50IGV4aXN0cyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIGFjdGl2ZQogICAgICAgIGZvcm1hdHRpbmcgZWxlbWVudHMgYW5kIHRoZSBsYXN0IG1hcmtlci4gSWYgaXQgZG9lcywgcmV0dXJuIGl0LCBlbHNlCiAgICAgICAgcmV0dXJuIGZhbHNlIiIiCgogICAgICAgIGZvciBpdGVtIGluIHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICAjIENoZWNrIGZvciBNYXJrZXIgZmlyc3QgYmVjYXVzZSBpZiBpdCdzIGEgTWFya2VyIGl0IGRvZXNuJ3QgaGF2ZSBhCiAgICAgICAgICAgICMgbmFtZSBhdHRyaWJ1dGUuCiAgICAgICAgICAgIGlmIGl0ZW0gPT0gTWFya2VyOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBpdGVtLm5hbWUgPT0gbmFtZToKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGluc2VydFJvb3Qoc2VsZiwgdG9rZW4pOgogICAgICAgIGVsZW1lbnQgPSBzZWxmLmNyZWF0ZUVsZW1lbnQodG9rZW4pCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgc2VsZi5kb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KQoKICAgIGRlZiBpbnNlcnREb2N0eXBlKHNlbGYsIHRva2VuKToKICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgIHB1YmxpY0lkID0gdG9rZW5bInB1YmxpY0lkIl0KICAgICAgICBzeXN0ZW1JZCA9IHRva2VuWyJzeXN0ZW1JZCJdCgogICAgICAgIGRvY3R5cGUgPSBzZWxmLmRvY3R5cGVDbGFzcyhuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpCiAgICAgICAgc2VsZi5kb2N1bWVudC5hcHBlbmRDaGlsZChkb2N0eXBlKQoKICAgIGRlZiBpbnNlcnRDb21tZW50KHNlbGYsIHRva2VuLCBwYXJlbnQ9Tm9uZSk6CiAgICAgICAgaWYgcGFyZW50IGlzIE5vbmU6CiAgICAgICAgICAgIHBhcmVudCA9IHNlbGYub3BlbkVsZW1lbnRzWy0xXQogICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChzZWxmLmNvbW1lbnRDbGFzcyh0b2tlblsiZGF0YSJdKSkKCiAgICBkZWYgY3JlYXRlRWxlbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgIiIiQ3JlYXRlIGFuIGVsZW1lbnQgYnV0IGRvbid0IGluc2VydCBpdCBhbnl3aGVyZSIiIgogICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgbmFtZXNwYWNlID0gdG9rZW4uZ2V0KCJuYW1lc3BhY2UiLCBzZWxmLmRlZmF1bHROYW1lc3BhY2UpCiAgICAgICAgZWxlbWVudCA9IHNlbGYuZWxlbWVudENsYXNzKG5hbWUsIG5hbWVzcGFjZSkKICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgcmV0dXJuIGVsZW1lbnQKCiAgICBkZWYgX2dldEluc2VydEZyb21UYWJsZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faW5zZXJ0RnJvbVRhYmxlCgogICAgZGVmIF9zZXRJbnNlcnRGcm9tVGFibGUoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlN3aXRjaCB0aGUgZnVuY3Rpb24gdXNlZCB0byBpbnNlcnQgYW4gZWxlbWVudCBmcm9tIHRoZQogICAgICAgIG5vcm1hbCBvbmUgdG8gdGhlIG1pc25lc3RlZCB0YWJsZSBvbmUgYW5kIGJhY2sgYWdhaW4iIiIKICAgICAgICBzZWxmLl9pbnNlcnRGcm9tVGFibGUgPSB2YWx1ZQogICAgICAgIGlmIHZhbHVlOgogICAgICAgICAgICBzZWxmLmluc2VydEVsZW1lbnQgPSBzZWxmLmluc2VydEVsZW1lbnRUYWJsZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zZXJ0RWxlbWVudCA9IHNlbGYuaW5zZXJ0RWxlbWVudE5vcm1hbAoKICAgIGluc2VydEZyb21UYWJsZSA9IHByb3BlcnR5KF9nZXRJbnNlcnRGcm9tVGFibGUsIF9zZXRJbnNlcnRGcm9tVGFibGUpCgogICAgZGVmIGluc2VydEVsZW1lbnROb3JtYWwoc2VsZiwgdG9rZW4pOgogICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKSwgIkVsZW1lbnQgJXMgbm90IHVuaWNvZGUiICUgbmFtZQogICAgICAgIG5hbWVzcGFjZSA9IHRva2VuLmdldCgibmFtZXNwYWNlIiwgc2VsZi5kZWZhdWx0TmFtZXNwYWNlKQogICAgICAgIGVsZW1lbnQgPSBzZWxmLmVsZW1lbnRDbGFzcyhuYW1lLCBuYW1lc3BhY2UpCiAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVzID0gdG9rZW5bImRhdGEiXQogICAgICAgIHNlbGYub3BlbkVsZW1lbnRzWy0xXS5hcHBlbmRDaGlsZChlbGVtZW50KQogICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLmFwcGVuZChlbGVtZW50KQogICAgICAgIHJldHVybiBlbGVtZW50CgogICAgZGVmIGluc2VydEVsZW1lbnRUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgIiIiQ3JlYXRlIGFuIGVsZW1lbnQgYW5kIGluc2VydCBpdCBpbnRvIHRoZSB0cmVlIiIiCiAgICAgICAgZWxlbWVudCA9IHNlbGYuY3JlYXRlRWxlbWVudCh0b2tlbikKICAgICAgICBpZiBzZWxmLm9wZW5FbGVtZW50c1stMV0ubmFtZSBub3QgaW4gdGFibGVJbnNlcnRNb2RlRWxlbWVudHM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmluc2VydEVsZW1lbnROb3JtYWwodG9rZW4pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXZSBzaG91bGQgYmUgaW4gdGhlIEluVGFibGUgbW9kZS4gVGhpcyBtZWFucyB3ZSB3YW50IHRvIGRvCiAgICAgICAgICAgICMgc3BlY2lhbCBtYWdpYyBlbGVtZW50IHJlYXJyYW5naW5nCiAgICAgICAgICAgIHBhcmVudCwgaW5zZXJ0QmVmb3JlID0gc2VsZi5nZXRUYWJsZU1pc25lc3RlZE5vZGVQb3NpdGlvbigpCiAgICAgICAgICAgIGlmIGluc2VydEJlZm9yZSBpcyBOb25lOgogICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGluc2VydEJlZm9yZSkKICAgICAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgcmV0dXJuIGVsZW1lbnQKCiAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBwYXJlbnQ9Tm9uZSk6CiAgICAgICAgIiIiSW5zZXJ0IHRleHQgZGF0YS4iIiIKICAgICAgICBpZiBwYXJlbnQgaXMgTm9uZToKICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbLTFdCgogICAgICAgIGlmIChub3Qgc2VsZi5pbnNlcnRGcm9tVGFibGUgb3IgKHNlbGYuaW5zZXJ0RnJvbVRhYmxlIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3BlbkVsZW1lbnRzWy0xXS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGluIHRhYmxlSW5zZXJ0TW9kZUVsZW1lbnRzKSk6CiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRUZXh0KGRhdGEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXZSBzaG91bGQgYmUgaW4gdGhlIEluVGFibGUgbW9kZS4gVGhpcyBtZWFucyB3ZSB3YW50IHRvIGRvCiAgICAgICAgICAgICMgc3BlY2lhbCBtYWdpYyBlbGVtZW50IHJlYXJyYW5naW5nCiAgICAgICAgICAgIHBhcmVudCwgaW5zZXJ0QmVmb3JlID0gc2VsZi5nZXRUYWJsZU1pc25lc3RlZE5vZGVQb3NpdGlvbigpCiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRUZXh0KGRhdGEsIGluc2VydEJlZm9yZSkKCiAgICBkZWYgZ2V0VGFibGVNaXNuZXN0ZWROb2RlUG9zaXRpb24oc2VsZik6CiAgICAgICAgIiIiR2V0IHRoZSBmb3N0ZXIgcGFyZW50IGVsZW1lbnQsIGFuZCBzaWJsaW5nIHRvIGluc2VydCBiZWZvcmUKICAgICAgICAob3IgTm9uZSkgd2hlbiBpbnNlcnRpbmcgYSBtaXNuZXN0ZWQgdGFibGUgbm9kZSIiIgogICAgICAgICMgVGhlIGZvc3RlciBwYXJlbnQgZWxlbWVudCBpcyB0aGUgb25lIHdoaWNoIGNvbWVzIGJlZm9yZSB0aGUgbW9zdAogICAgICAgICMgcmVjZW50bHkgb3BlbmVkIHRhYmxlIGVsZW1lbnQKICAgICAgICAjIFhYWCAtIHRoaXMgaXMgcmVhbGx5IGluZWxlZ2FudAogICAgICAgIGxhc3RUYWJsZSA9IE5vbmUKICAgICAgICBmb3N0ZXJQYXJlbnQgPSBOb25lCiAgICAgICAgaW5zZXJ0QmVmb3JlID0gTm9uZQogICAgICAgIGZvciBlbG0gaW4gc2VsZi5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgIGlmIGVsbS5uYW1lID09ICJ0YWJsZSI6CiAgICAgICAgICAgICAgICBsYXN0VGFibGUgPSBlbG0KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgbGFzdFRhYmxlOgogICAgICAgICAgICAjIFhYWCAtIHdlIHNob3VsZCByZWFsbHkgY2hlY2sgdGhhdCB0aGlzIHBhcmVudCBpcyBhY3R1YWxseSBhCiAgICAgICAgICAgICMgbm9kZSBoZXJlCiAgICAgICAgICAgIGlmIGxhc3RUYWJsZS5wYXJlbnQ6CiAgICAgICAgICAgICAgICBmb3N0ZXJQYXJlbnQgPSBsYXN0VGFibGUucGFyZW50CiAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmUgPSBsYXN0VGFibGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZvc3RlclBhcmVudCA9IHNlbGYub3BlbkVsZW1lbnRzWwogICAgICAgICAgICAgICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLmluZGV4KGxhc3RUYWJsZSkgLSAxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvc3RlclBhcmVudCA9IHNlbGYub3BlbkVsZW1lbnRzWzBdCiAgICAgICAgcmV0dXJuIGZvc3RlclBhcmVudCwgaW5zZXJ0QmVmb3JlCgogICAgZGVmIGdlbmVyYXRlSW1wbGllZEVuZFRhZ3Moc2VsZiwgZXhjbHVkZT1Ob25lKToKICAgICAgICBuYW1lID0gc2VsZi5vcGVuRWxlbWVudHNbLTFdLm5hbWUKICAgICAgICAjIFhYWCB0ZCwgdGggYW5kIHRyIGFyZSBub3QgYWN0dWFsbHkgbmVlZGVkCiAgICAgICAgaWYgKG5hbWUgaW4gZnJvemVuc2V0KCgiZGQiLCAiZHQiLCAibGkiLCAib3B0aW9uIiwgIm9wdGdyb3VwIiwgInAiLCAicnAiLCAicnQiKSkgYW5kCiAgICAgICAgICAgICAgICBuYW1lICE9IGV4Y2x1ZGUpOgogICAgICAgICAgICBzZWxmLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAjIFhYWCBUaGlzIGlzIG5vdCBlbnRpcmVseSB3aGF0IHRoZSBzcGVjaWZpY2F0aW9uIHNheXMuIFdlIHNob3VsZAogICAgICAgICAgICAjIGludmVzdGlnYXRlIGl0IG1vcmUgY2xvc2VseS4KICAgICAgICAgICAgc2VsZi5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKGV4Y2x1ZGUpCgogICAgZGVmIGdldERvY3VtZW50KHNlbGYpOgogICAgICAgICJSZXR1cm4gdGhlIGZpbmFsIHRyZWUiCiAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQKCiAgICBkZWYgZ2V0RnJhZ21lbnQoc2VsZik6CiAgICAgICAgIlJldHVybiB0aGUgZmluYWwgZnJhZ21lbnQiCiAgICAgICAgIyBhc3NlcnQgc2VsZi5pbm5lckhUTUwKICAgICAgICBmcmFnbWVudCA9IHNlbGYuZnJhZ21lbnRDbGFzcygpCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHNbMF0ucmVwYXJlbnRDaGlsZHJlbihmcmFnbWVudCkKICAgICAgICByZXR1cm4gZnJhZ21lbnQKCiAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoc2VsZiwgbm9kZSk6CiAgICAgICAgIiIiU2VyaWFsaXplIHRoZSBzdWJ0cmVlIG9mIG5vZGUgaW4gdGhlIGZvcm1hdCByZXF1aXJlZCBieSB1bml0IHRlc3RzCiAgICAgICAgbm9kZSAtIHRoZSBub2RlIGZyb20gd2hpY2ggdG8gc3RhcnQgc2VyaWFsaXppbmciIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yClBLAwQUAAAAAAAAACEACOou+IMiAACDIgAARQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2RvbS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE11dGFibGVNYXBwaW5nCmZyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbSwgTm9kZQppbXBvcnQgd2Vha3JlZgoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi4gaW1wb3J0IGNvbnN0YW50cwpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzCmZyb20gLi5fdXRpbHMgaW1wb3J0IG1vZHVsZUZhY3RvcnlGYWN0b3J5CgoKZGVmIGdldERvbUJ1aWxkZXIoRG9tSW1wbGVtZW50YXRpb24pOgogICAgRG9tID0gRG9tSW1wbGVtZW50YXRpb24KCiAgICBjbGFzcyBBdHRyTGlzdChNdXRhYmxlTWFwcGluZyk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW1lbnQpOgogICAgICAgICAgICBzZWxmLmVsZW1lbnQgPSBlbGVtZW50CgogICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXMua2V5cygpKQoKICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIHR1cGxlKToKICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGF0dHIgPSBzZWxmLmVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobmFtZSkKICAgICAgICAgICAgICAgIGF0dHIudmFsdWUgPSB2YWx1ZQogICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0gPSBhdHRyCgogICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzKQoKICAgICAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzLml0ZW1zKCkpCgogICAgICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzLnZhbHVlcygpKQoKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdLnZhbHVlCgogICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCB0dXBsZSk6CiAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0KCiAgICBjbGFzcyBOb2RlQnVpbGRlcihiYXNlLk5vZGUpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbGVtZW50KToKICAgICAgICAgICAgYmFzZS5Ob2RlLl9faW5pdF9fKHNlbGYsIGVsZW1lbnQubm9kZU5hbWUpCiAgICAgICAgICAgIHNlbGYuZWxlbWVudCA9IGVsZW1lbnQKCiAgICAgICAgbmFtZXNwYWNlID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IGhhc2F0dHIoc2VsZi5lbGVtZW50LCAibmFtZXNwYWNlVVJJIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50Lm5hbWVzcGFjZVVSSSBvciBOb25lKQoKICAgICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gc2VsZgogICAgICAgICAgICBzZWxmLmVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZS5lbGVtZW50KQoKICAgICAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmU9Tm9uZSk6CiAgICAgICAgICAgIHRleHQgPSBzZWxmLmVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKQogICAgICAgICAgICBpZiBpbnNlcnRCZWZvcmU6CiAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRleHQsIGluc2VydEJlZm9yZS5lbGVtZW50KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LmFwcGVuZENoaWxkKHRleHQpCgogICAgICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbm9kZSwgcmVmTm9kZSk6CiAgICAgICAgICAgIHNlbGYuZWxlbWVudC5pbnNlcnRCZWZvcmUobm9kZS5lbGVtZW50LCByZWZOb2RlLmVsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gc2VsZgoKICAgICAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIGlmIG5vZGUuZWxlbWVudC5wYXJlbnROb2RlID09IHNlbGYuZWxlbWVudDoKICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5yZW1vdmVDaGlsZChub2RlLmVsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gTm9uZQoKICAgICAgICBkZWYgcmVwYXJlbnRDaGlsZHJlbihzZWxmLCBuZXdQYXJlbnQpOgogICAgICAgICAgICB3aGlsZSBzZWxmLmVsZW1lbnQuaGFzQ2hpbGROb2RlcygpOgogICAgICAgICAgICAgICAgY2hpbGQgPSBzZWxmLmVsZW1lbnQuZmlyc3RDaGlsZAogICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKQogICAgICAgICAgICAgICAgbmV3UGFyZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpCiAgICAgICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IFtdCgogICAgICAgIGRlZiBnZXRBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gQXR0ckxpc3Qoc2VsZi5lbGVtZW50KQoKICAgICAgICBkZWYgc2V0QXR0cmlidXRlcyhzZWxmLCBhdHRyaWJ1dGVzKToKICAgICAgICAgICAgaWYgYXR0cmlidXRlczoKICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBsaXN0KGF0dHJpYnV0ZXMuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCB0dXBsZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWVbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lID0gKG5hbWVbMF0gKyAiOiIgKyBuYW1lWzFdKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSA9IG5hbWVbMV0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG5hbWVbMl0sIHF1YWxpZmllZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuc2V0QXR0cmlidXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUpCiAgICAgICAgYXR0cmlidXRlcyA9IHByb3BlcnR5KGdldEF0dHJpYnV0ZXMsIHNldEF0dHJpYnV0ZXMpCgogICAgICAgIGRlZiBjbG9uZU5vZGUoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBOb2RlQnVpbGRlcihzZWxmLmVsZW1lbnQuY2xvbmVOb2RlKEZhbHNlKSkKCiAgICAgICAgZGVmIGhhc0NvbnRlbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmVsZW1lbnQuaGFzQ2hpbGROb2RlcygpCgogICAgICAgIGRlZiBnZXROYW1lVHVwbGUoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYubmFtZXNwYWNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlc1siaHRtbCJdLCBzZWxmLm5hbWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWVzcGFjZSwgc2VsZi5uYW1lCgogICAgICAgIG5hbWVUdXBsZSA9IHByb3BlcnR5KGdldE5hbWVUdXBsZSkKCiAgICBjbGFzcyBUcmVlQnVpbGRlcihiYXNlLlRyZWVCdWlsZGVyKTogICMgcHlsaW50OmRpc2FibGU9dW51c2VkLXZhcmlhYmxlCiAgICAgICAgZGVmIGRvY3VtZW50Q2xhc3Moc2VsZik6CiAgICAgICAgICAgIHNlbGYuZG9tID0gRG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQoTm9uZSwgTm9uZSwgTm9uZSkKICAgICAgICAgICAgcmV0dXJuIHdlYWtyZWYucHJveHkoc2VsZikKCiAgICAgICAgZGVmIGluc2VydERvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICBwdWJsaWNJZCA9IHRva2VuWyJwdWJsaWNJZCJdCiAgICAgICAgICAgIHN5c3RlbUlkID0gdG9rZW5bInN5c3RlbUlkIl0KCiAgICAgICAgICAgIGRvbWltcGwgPSBEb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKQogICAgICAgICAgICBkb2N0eXBlID0gZG9taW1wbC5jcmVhdGVEb2N1bWVudFR5cGUobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKQogICAgICAgICAgICBzZWxmLmRvY3VtZW50LmFwcGVuZENoaWxkKE5vZGVCdWlsZGVyKGRvY3R5cGUpKQogICAgICAgICAgICBpZiBEb20gPT0gbWluaWRvbToKICAgICAgICAgICAgICAgIGRvY3R5cGUub3duZXJEb2N1bWVudCA9IHNlbGYuZG9tCgogICAgICAgIGRlZiBlbGVtZW50Q2xhc3Moc2VsZiwgbmFtZSwgbmFtZXNwYWNlPU5vbmUpOgogICAgICAgICAgICBpZiBuYW1lc3BhY2UgaXMgTm9uZSBhbmQgc2VsZi5kZWZhdWx0TmFtZXNwYWNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5kb20uY3JlYXRlRWxlbWVudChuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuZG9tLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIG5hbWUpCgogICAgICAgICAgICByZXR1cm4gTm9kZUJ1aWxkZXIobm9kZSkKCiAgICAgICAgZGVmIGNvbW1lbnRDbGFzcyhzZWxmLCBkYXRhKToKICAgICAgICAgICAgcmV0dXJuIE5vZGVCdWlsZGVyKHNlbGYuZG9tLmNyZWF0ZUNvbW1lbnQoZGF0YSkpCgogICAgICAgIGRlZiBmcmFnbWVudENsYXNzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gTm9kZUJ1aWxkZXIoc2VsZi5kb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKQoKICAgICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIHNlbGYuZG9tLmFwcGVuZENoaWxkKG5vZGUuZWxlbWVudCkKCiAgICAgICAgZGVmIHRlc3RTZXJpYWxpemVyKHNlbGYsIGVsZW1lbnQpOgogICAgICAgICAgICByZXR1cm4gdGVzdFNlcmlhbGl6ZXIoZWxlbWVudCkKCiAgICAgICAgZGVmIGdldERvY3VtZW50KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5kb20KCiAgICAgICAgZGVmIGdldEZyYWdtZW50KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gYmFzZS5UcmVlQnVpbGRlci5nZXRGcmFnbWVudChzZWxmKS5lbGVtZW50CgogICAgICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIHBhcmVudD1Ob25lKToKICAgICAgICAgICAgZGF0YSA9IGRhdGEKICAgICAgICAgICAgaWYgcGFyZW50ICE9IHNlbGY6CiAgICAgICAgICAgICAgICBiYXNlLlRyZWVCdWlsZGVyLmluc2VydFRleHQoc2VsZiwgZGF0YSwgcGFyZW50KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBIQUNLOiBhbGxvdyB0ZXh0IG5vZGVzIGFzIGNoaWxkcmVuIG9mIHRoZSBkb2N1bWVudCBub2RlCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuZG9tLCAnX2NoaWxkX25vZGVfdHlwZXMnKToKICAgICAgICAgICAgICAgICAgICAjIHB5bGludDpkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKICAgICAgICAgICAgICAgICAgICBpZiBOb2RlLlRFWFRfTk9ERSBub3QgaW4gc2VsZi5kb20uX2NoaWxkX25vZGVfdHlwZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9tLl9jaGlsZF9ub2RlX3R5cGVzID0gbGlzdChzZWxmLmRvbS5fY2hpbGRfbm9kZV90eXBlcykKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kb20uX2NoaWxkX25vZGVfdHlwZXMuYXBwZW5kKE5vZGUuVEVYVF9OT0RFKQogICAgICAgICAgICAgICAgc2VsZi5kb20uYXBwZW5kQ2hpbGQoc2VsZi5kb20uY3JlYXRlVGV4dE5vZGUoZGF0YSkpCgogICAgICAgIGltcGxlbWVudGF0aW9uID0gRG9tSW1wbGVtZW50YXRpb24KICAgICAgICBuYW1lID0gTm9uZQoKICAgIGRlZiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KToKICAgICAgICBlbGVtZW50Lm5vcm1hbGl6ZSgpCiAgICAgICAgcnYgPSBbXQoKICAgICAgICBkZWYgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCBpbmRlbnQ9MCk6CiAgICAgICAgICAgIGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50Lm5hbWU6CiAgICAgICAgICAgICAgICAgICAgaWYgZWxlbWVudC5wdWJsaWNJZCBvciBlbGVtZW50LnN5c3RlbUlkOgogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZCA9IGVsZW1lbnQucHVibGljSWQgb3IgIiIKICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgPSBlbGVtZW50LnN5c3RlbUlkIG9yICIiCiAgICAgICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiIiJ8JXM8IURPQ1RZUEUgJXMgIiVzIiAiJXMiPiIiIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJyAnICogaW5kZW50LCBlbGVtZW50Lm5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8IURPQ1RZUEUgJXM+IiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQubmFtZSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCFET0NUWVBFID4iICUgKCcgJyAqIGluZGVudCwpKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIjZG9jdW1lbnQiKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIjZG9jdW1lbnQtZnJhZ21lbnQiKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5DT01NRU5UX05PREU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwhLS0gJXMgLS0+IiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQubm9kZVZhbHVlKSkKICAgICAgICAgICAgZWxpZiBlbGVtZW50Lm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC5ub2RlVmFsdWUpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgKGhhc2F0dHIoZWxlbWVudCwgIm5hbWVzcGFjZVVSSSIpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm5hbWVzcGFjZVVSSSBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIlcyAlcyIgJSAoY29uc3RhbnRzLnByZWZpeGVzW2VsZW1lbnQubmFtZXNwYWNlVVJJXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm5vZGVOYW1lKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gZWxlbWVudC5ub2RlTmFtZQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8JXM+IiAlICgnICcgKiBpbmRlbnQsIG5hbWUpKQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCk6CiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGVsZW1lbnQuYXR0cmlidXRlcykpOgogICAgICAgICAgICAgICAgICAgICAgICBhdHRyID0gZWxlbWVudC5hdHRyaWJ1dGVzLml0ZW0oaSkKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGF0dHIubm9kZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhdHRyLnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIG5zID0gYXR0ci5uYW1lc3BhY2VVUkkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiVzICVzIiAlIChjb25zdGFudHMucHJlZml4ZXNbbnNdLCBhdHRyLmxvY2FsTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdHRyLm5vZGVOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCgogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3J0ZWQoYXR0cmlidXRlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgnfCVzJXM9IiVzIicgJSAoJyAnICogKGluZGVudCArIDIpLCBuYW1lLCB2YWx1ZSkpCiAgICAgICAgICAgIGluZGVudCArPSAyCiAgICAgICAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50LmNoaWxkTm9kZXM6CiAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkLCBpbmRlbnQpCiAgICAgICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCAwKQoKICAgICAgICByZXR1cm4gIlxuIi5qb2luKHJ2KQoKICAgIHJldHVybiBsb2NhbHMoKQoKCiMgVGhlIGFjdHVhbCBtZWFucyB0byBnZXQgYSBtb2R1bGUhCmdldERvbU1vZHVsZSA9IG1vZHVsZUZhY3RvcnlGYWN0b3J5KGdldERvbUJ1aWxkZXIpClBLAwQUAAAAAAAAACEAoX2X8NwxAADcMQAARwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCiMgcHlsaW50OmRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKaW1wb3J0IHJlCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLiBpbXBvcnQgX2loYXRleG1sCmZyb20gLi4gaW1wb3J0IGNvbnN0YW50cwpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzCmZyb20gLi5fdXRpbHMgaW1wb3J0IG1vZHVsZUZhY3RvcnlGYWN0b3J5Cgp0YWdfcmVnZXhwID0gcmUuY29tcGlsZSgieyhbXn1dKil9KC4qKSIpCgoKZGVmIGdldEVUcmVlQnVpbGRlcihFbGVtZW50VHJlZUltcGxlbWVudGF0aW9uLCBmdWxsVHJlZT1GYWxzZSk6CiAgICBFbGVtZW50VHJlZSA9IEVsZW1lbnRUcmVlSW1wbGVtZW50YXRpb24KICAgIEVsZW1lbnRUcmVlQ29tbWVudFR5cGUgPSBFbGVtZW50VHJlZS5Db21tZW50KCJhc2QiKS50YWcKCiAgICBjbGFzcyBFbGVtZW50KGJhc2UuTm9kZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG5hbWVzcGFjZT1Ob25lKToKICAgICAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKICAgICAgICAgICAgc2VsZi5fbmFtZXNwYWNlID0gbmFtZXNwYWNlCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQgPSBFbGVtZW50VHJlZS5FbGVtZW50KHNlbGYuX2dldEVUcmVlVGFnKG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSkpCiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5uYW1lVHVwbGUgPSBuYW1lc3BhY2VzWyJodG1sIl0sIHNlbGYuX25hbWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYubmFtZVR1cGxlID0gc2VsZi5fbmFtZXNwYWNlLCBzZWxmLl9uYW1lCiAgICAgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzID0gW10KICAgICAgICAgICAgc2VsZi5fZmxhZ3MgPSBbXQoKICAgICAgICBkZWYgX2dldEVUcmVlVGFnKHNlbGYsIG5hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZXRyZWVfdGFnID0gbmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZXRyZWVfdGFnID0gInslc30lcyIgJSAobmFtZXNwYWNlLCBuYW1lKQogICAgICAgICAgICByZXR1cm4gZXRyZWVfdGFnCgogICAgICAgIGRlZiBfc2V0TmFtZShzZWxmLCBuYW1lKToKICAgICAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50YWcgPSBzZWxmLl9nZXRFVHJlZVRhZyhzZWxmLl9uYW1lLCBzZWxmLl9uYW1lc3BhY2UpCgogICAgICAgIGRlZiBfZ2V0TmFtZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKCiAgICAgICAgbmFtZSA9IHByb3BlcnR5KF9nZXROYW1lLCBfc2V0TmFtZSkKCiAgICAgICAgZGVmIF9zZXROYW1lc3BhY2Uoc2VsZiwgbmFtZXNwYWNlKToKICAgICAgICAgICAgc2VsZi5fbmFtZXNwYWNlID0gbmFtZXNwYWNlCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGFnID0gc2VsZi5fZ2V0RVRyZWVUYWcoc2VsZi5fbmFtZSwgc2VsZi5fbmFtZXNwYWNlKQoKICAgICAgICBkZWYgX2dldE5hbWVzcGFjZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX25hbWVzcGFjZQoKICAgICAgICBuYW1lc3BhY2UgPSBwcm9wZXJ0eShfZ2V0TmFtZXNwYWNlLCBfc2V0TmFtZXNwYWNlKQoKICAgICAgICBkZWYgX2dldEF0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbGVtZW50LmF0dHJpYgoKICAgICAgICBkZWYgX3NldEF0dHJpYnV0ZXMoc2VsZiwgYXR0cmlidXRlcyk6CiAgICAgICAgICAgICMgRGVsZXRlIGV4aXN0aW5nIGF0dHJpYnV0ZXMgZmlyc3QKICAgICAgICAgICAgIyBYWFggLSB0aGVyZSBtYXkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMuLi4KICAgICAgICAgICAgZm9yIGtleSBpbiBsaXN0KHNlbGYuX2VsZW1lbnQuYXR0cmliLmtleXMoKSk6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5fZWxlbWVudC5hdHRyaWJba2V5XQogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBhdHRyaWJ1dGVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgdHVwbGUpOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAieyVzfSVzIiAlIChrZXlbMl0sIGtleVsxXSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGtleQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5zZXQobmFtZSwgdmFsdWUpCgogICAgICAgIGF0dHJpYnV0ZXMgPSBwcm9wZXJ0eShfZ2V0QXR0cmlidXRlcywgX3NldEF0dHJpYnV0ZXMpCgogICAgICAgIGRlZiBfZ2V0Q2hpbGROb2RlcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkTm9kZXMKCiAgICAgICAgZGVmIF9zZXRDaGlsZE5vZGVzKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgZGVsIHNlbGYuX2VsZW1lbnRbOl0KICAgICAgICAgICAgc2VsZi5fY2hpbGROb2RlcyA9IFtdCiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgogICAgICAgICAgICAgICAgc2VsZi5pbnNlcnRDaGlsZChlbGVtZW50KQoKICAgICAgICBjaGlsZE5vZGVzID0gcHJvcGVydHkoX2dldENoaWxkTm9kZXMsIF9zZXRDaGlsZE5vZGVzKQoKICAgICAgICBkZWYgaGFzQ29udGVudChzZWxmKToKICAgICAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaGFzIGNoaWxkcmVuIG9yIHRleHQiIiIKICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fZWxlbWVudC50ZXh0IG9yIGxlbihzZWxmLl9lbGVtZW50KSkKCiAgICAgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzLmFwcGVuZChub2RlKQogICAgICAgICAgICBzZWxmLl9lbGVtZW50LmFwcGVuZChub2RlLl9lbGVtZW50KQogICAgICAgICAgICBub2RlLnBhcmVudCA9IHNlbGYKCiAgICAgICAgZGVmIGluc2VydEJlZm9yZShzZWxmLCBub2RlLCByZWZOb2RlKToKICAgICAgICAgICAgaW5kZXggPSBsaXN0KHNlbGYuX2VsZW1lbnQpLmluZGV4KHJlZk5vZGUuX2VsZW1lbnQpCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuaW5zZXJ0KGluZGV4LCBub2RlLl9lbGVtZW50KQogICAgICAgICAgICBub2RlLnBhcmVudCA9IHNlbGYKCiAgICAgICAgZGVmIHJlbW92ZUNoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzLnJlbW92ZShub2RlKQogICAgICAgICAgICBzZWxmLl9lbGVtZW50LnJlbW92ZShub2RlLl9lbGVtZW50KQogICAgICAgICAgICBub2RlLnBhcmVudCA9IE5vbmUKCiAgICAgICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgaW5zZXJ0QmVmb3JlPU5vbmUpOgogICAgICAgICAgICBpZiBub3QobGVuKHNlbGYuX2VsZW1lbnQpKToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gIiIKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCArPSBkYXRhCiAgICAgICAgICAgIGVsaWYgaW5zZXJ0QmVmb3JlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIEluc2VydCB0aGUgdGV4dCBhcyB0aGUgdGFpbCBvZiB0aGUgbGFzdCBjaGlsZCBlbGVtZW50CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZWxlbWVudFstMV0udGFpbDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50Wy0xXS50YWlsID0gIiIKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnRbLTFdLnRhaWwgKz0gZGF0YQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBJbnNlcnQgdGhlIHRleHQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbm9kZQogICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBsaXN0KHNlbGYuX2VsZW1lbnQpCiAgICAgICAgICAgICAgICBpbmRleCA9IGNoaWxkcmVuLmluZGV4KGluc2VydEJlZm9yZS5fZWxlbWVudCkKICAgICAgICAgICAgICAgIGlmIGluZGV4ID4gMDoKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZWxlbWVudFtpbmRleCAtIDFdLnRhaWw6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnRbaW5kZXggLSAxXS50YWlsID0gIiIKICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50W2luZGV4IC0gMV0udGFpbCArPSBkYXRhCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCA9ICIiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ICs9IGRhdGEKCiAgICAgICAgZGVmIGNsb25lTm9kZShzZWxmKToKICAgICAgICAgICAgZWxlbWVudCA9IHR5cGUoc2VsZikoc2VsZi5uYW1lLCBzZWxmLm5hbWVzcGFjZSkKICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYuYXR0cmlidXRlcy5pdGVtcygpOgogICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWUKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQKCiAgICAgICAgZGVmIHJlcGFyZW50Q2hpbGRyZW4oc2VsZiwgbmV3UGFyZW50KToKICAgICAgICAgICAgaWYgbmV3UGFyZW50LmNoaWxkTm9kZXM6CiAgICAgICAgICAgICAgICBuZXdQYXJlbnQuY2hpbGROb2Rlc1stMV0uX2VsZW1lbnQudGFpbCArPSBzZWxmLl9lbGVtZW50LnRleHQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXdQYXJlbnQuX2VsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICBuZXdQYXJlbnQuX2VsZW1lbnQudGV4dCA9ICIiCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9lbGVtZW50LnRleHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50Ll9lbGVtZW50LnRleHQgKz0gc2VsZi5fZWxlbWVudC50ZXh0CiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCA9ICIiCiAgICAgICAgICAgIGJhc2UuTm9kZS5yZXBhcmVudENoaWxkcmVuKHNlbGYsIG5ld1BhcmVudCkKCiAgICBjbGFzcyBDb21tZW50KEVsZW1lbnQpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICAgICAgIyBVc2UgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgdG8gc2V0IGFsbCBwcm9wZXJ0aWVzIG9uIHRoZQogICAgICAgICAgICAjIHdyYXBwZXIgZWxlbWVudAogICAgICAgICAgICBzZWxmLl9lbGVtZW50ID0gRWxlbWVudFRyZWUuQ29tbWVudChkYXRhKQogICAgICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fY2hpbGROb2RlcyA9IFtdCiAgICAgICAgICAgIHNlbGYuX2ZsYWdzID0gW10KCiAgICAgICAgZGVmIF9nZXREYXRhKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZWxlbWVudC50ZXh0CgogICAgICAgIGRlZiBfc2V0RGF0YShzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCA9IHZhbHVlCgogICAgICAgIGRhdGEgPSBwcm9wZXJ0eShfZ2V0RGF0YSwgX3NldERhdGEpCgogICAgY2xhc3MgRG9jdW1lbnRUeXBlKEVsZW1lbnQpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgogICAgICAgICAgICBFbGVtZW50Ll9faW5pdF9fKHNlbGYsICI8IURPQ1RZUEU+IikKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gbmFtZQogICAgICAgICAgICBzZWxmLnB1YmxpY0lkID0gcHVibGljSWQKICAgICAgICAgICAgc2VsZi5zeXN0ZW1JZCA9IHN5c3RlbUlkCgogICAgICAgIGRlZiBfZ2V0UHVibGljSWQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbGVtZW50LmdldCgicHVibGljSWQiLCAiIikKCiAgICAgICAgZGVmIF9zZXRQdWJsaWNJZChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5zZXQoInB1YmxpY0lkIiwgdmFsdWUpCgogICAgICAgIHB1YmxpY0lkID0gcHJvcGVydHkoX2dldFB1YmxpY0lkLCBfc2V0UHVibGljSWQpCgogICAgICAgIGRlZiBfZ2V0U3lzdGVtSWQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbGVtZW50LmdldCgic3lzdGVtSWQiLCAiIikKCiAgICAgICAgZGVmIF9zZXRTeXN0ZW1JZChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5zZXQoInN5c3RlbUlkIiwgdmFsdWUpCgogICAgICAgIHN5c3RlbUlkID0gcHJvcGVydHkoX2dldFN5c3RlbUlkLCBfc2V0U3lzdGVtSWQpCgogICAgY2xhc3MgRG9jdW1lbnQoRWxlbWVudCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBFbGVtZW50Ll9faW5pdF9fKHNlbGYsICJET0NVTUVOVF9ST09UIikKCiAgICBjbGFzcyBEb2N1bWVudEZyYWdtZW50KEVsZW1lbnQpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgRWxlbWVudC5fX2luaXRfXyhzZWxmLCAiRE9DVU1FTlRfRlJBR01FTlQiKQoKICAgIGRlZiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KToKICAgICAgICBydiA9IFtdCgogICAgICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIGluZGVudD0wKToKICAgICAgICAgICAgaWYgbm90KGhhc2F0dHIoZWxlbWVudCwgInRhZyIpKToKICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmdldHJvb3QoKQogICAgICAgICAgICBpZiBlbGVtZW50LnRhZyA9PSAiPCFET0NUWVBFPiI6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LmdldCgicHVibGljSWQiKSBvciBlbGVtZW50LmdldCgic3lzdGVtSWQiKToKICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZCA9IGVsZW1lbnQuZ2V0KCJwdWJsaWNJZCIpIG9yICIiCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgPSBlbGVtZW50LmdldCgic3lzdGVtSWQiKSBvciAiIgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiIiI8IURPQ1RZUEUgJXMgIiVzIiAiJXMiPiIiIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbGVtZW50LnRleHQsIHB1YmxpY0lkLCBzeXN0ZW1JZCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCFET0NUWVBFICVzPiIgJSAoZWxlbWVudC50ZXh0LCkpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gIkRPQ1VNRU5UX1JPT1QiOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIjZG9jdW1lbnQiKQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiAoaW5kZW50ICsgMiksIGVsZW1lbnQudGV4dCkpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRhaWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJEb2N1bWVudCBub2RlIGNhbm5vdCBoYXZlIHRhaWwiKQogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIikgYW5kIGxlbihlbGVtZW50LmF0dHJpYik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJEb2N1bWVudCBub2RlIGNhbm5vdCBoYXZlIGF0dHJpYnV0ZXMiKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQudGFnID09IEVsZW1lbnRUcmVlQ29tbWVudFR5cGU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwhLS0gJXMgLS0+IiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQudGV4dCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShlbGVtZW50LnRhZywgdGV4dF90eXBlKSwgXAogICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCB1bmljb2RlLCBnb3QgJXMsICVzIiAlICh0eXBlKGVsZW1lbnQudGFnKSwgZWxlbWVudC50YWcpCiAgICAgICAgICAgICAgICBuc21hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChlbGVtZW50LnRhZykKCiAgICAgICAgICAgICAgICBpZiBuc21hdGNoIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGVsZW1lbnQudGFnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5zLCBuYW1lID0gbnNtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnN0YW50cy5wcmVmaXhlc1tuc10KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiVzICVzIiAlIChwcmVmaXgsIG5hbWUpCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwlcz4iICUgKCcgJyAqIGluZGVudCwgbmFtZSkpCgogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIik6CiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGVsZW1lbnQuYXR0cmliLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIG5zbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5zbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucywgbmFtZSA9IG5zbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnN0YW50cy5wcmVmaXhlc1tuc10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfc3RyaW5nID0gIiVzICVzIiAlIChwcmVmaXgsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3N0cmluZyA9IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hcHBlbmQoKGF0dHJfc3RyaW5nLCB2YWx1ZSkpCgogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3J0ZWQoYXR0cmlidXRlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgnfCVzJXM9IiVzIicgJSAoJyAnICogKGluZGVudCArIDIpLCBuYW1lLCB2YWx1ZSkpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgZWxlbWVudC50ZXh0KSkKICAgICAgICAgICAgaW5kZW50ICs9IDIKICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkLCBpbmRlbnQpCiAgICAgICAgICAgIGlmIGVsZW1lbnQudGFpbDoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiAoaW5kZW50IC0gMiksIGVsZW1lbnQudGFpbCkpCiAgICAgICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCAwKQoKICAgICAgICByZXR1cm4gIlxuIi5qb2luKHJ2KQoKICAgIGRlZiB0b3N0cmluZyhlbGVtZW50KTogICMgcHlsaW50OmRpc2FibGU9dW51c2VkLXZhcmlhYmxlCiAgICAgICAgIiIiU2VyaWFsaXplIGFuIGVsZW1lbnQgYW5kIGl0cyBjaGlsZCBub2RlcyB0byBhIHN0cmluZyIiIgogICAgICAgIHJ2ID0gW10KICAgICAgICBmaWx0ZXIgPSBfaWhhdGV4bWwuSW5mb3NldEZpbHRlcigpCgogICAgICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVsZW1lbnQsIEVsZW1lbnRUcmVlLkVsZW1lbnRUcmVlKToKICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmdldHJvb3QoKQoKICAgICAgICAgICAgaWYgZWxlbWVudC50YWcgPT0gIjwhRE9DVFlQRT4iOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC5nZXQoInB1YmxpY0lkIikgb3IgZWxlbWVudC5nZXQoInN5c3RlbUlkIik6CiAgICAgICAgICAgICAgICAgICAgcHVibGljSWQgPSBlbGVtZW50LmdldCgicHVibGljSWQiKSBvciAiIgogICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkID0gZWxlbWVudC5nZXQoInN5c3RlbUlkIikgb3IgIiIKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiIiPCFET0NUWVBFICVzIFBVQkxJQyAiJXMiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQudGV4dCwgcHVibGljSWQsIHN5c3RlbUlkKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8IURPQ1RZUEUgJXM+IiAlIChlbGVtZW50LnRleHQsKSkKICAgICAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSAiRE9DVU1FTlRfUk9PVCI6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGV4dCkKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGFpbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkRvY3VtZW50IG5vZGUgY2Fubm90IGhhdmUgdGFpbCIpCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJhdHRyaWIiKSBhbmQgbGVuKGVsZW1lbnQuYXR0cmliKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkRvY3VtZW50IG5vZGUgY2Fubm90IGhhdmUgYXR0cmlidXRlcyIpCgogICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChjaGlsZCkKCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gRWxlbWVudFRyZWVDb21tZW50VHlwZToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCEtLSVzLS0+IiAlIChlbGVtZW50LnRleHQsKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhc3N1bWVkIHRvIGJlIGFuIG9yZGluYXJ5IGVsZW1lbnQKICAgICAgICAgICAgICAgIGlmIG5vdCBlbGVtZW50LmF0dHJpYjoKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwlcz4iICUgKGZpbHRlci5mcm9tWG1sTmFtZShlbGVtZW50LnRhZyksKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXR0ciA9ICIgIi5qb2luKFsiJXM9XCIlc1wiIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmZyb21YbWxOYW1lKG5hbWUpLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGVsZW1lbnQuYXR0cmliLml0ZW1zKCldKQogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCVzICVzPiIgJSAoZWxlbWVudC50YWcsIGF0dHIpKQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChlbGVtZW50LnRleHQpCgogICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChjaGlsZCkKCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwvJXM+IiAlIChlbGVtZW50LnRhZywpKQoKICAgICAgICAgICAgaWYgZWxlbWVudC50YWlsOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGFpbCkKCiAgICAgICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50KQoKICAgICAgICByZXR1cm4gIiIuam9pbihydikKCiAgICBjbGFzcyBUcmVlQnVpbGRlcihiYXNlLlRyZWVCdWlsZGVyKTogICMgcHlsaW50OmRpc2FibGU9dW51c2VkLXZhcmlhYmxlCiAgICAgICAgZG9jdW1lbnRDbGFzcyA9IERvY3VtZW50CiAgICAgICAgZG9jdHlwZUNsYXNzID0gRG9jdW1lbnRUeXBlCiAgICAgICAgZWxlbWVudENsYXNzID0gRWxlbWVudAogICAgICAgIGNvbW1lbnRDbGFzcyA9IENvbW1lbnQKICAgICAgICBmcmFnbWVudENsYXNzID0gRG9jdW1lbnRGcmFnbWVudAogICAgICAgIGltcGxlbWVudGF0aW9uID0gRWxlbWVudFRyZWVJbXBsZW1lbnRhdGlvbgoKICAgICAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgICAgIHJldHVybiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KQoKICAgICAgICBkZWYgZ2V0RG9jdW1lbnQoc2VsZik6CiAgICAgICAgICAgIGlmIGZ1bGxUcmVlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudC5maW5kKAogICAgICAgICAgICAgICAgICAgICAgICAieyVzfWh0bWwiICUgc2VsZi5kZWZhdWx0TmFtZXNwYWNlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudC5maW5kKCJodG1sIikKCiAgICAgICAgZGVmIGdldEZyYWdtZW50KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gYmFzZS5UcmVlQnVpbGRlci5nZXRGcmFnbWVudChzZWxmKS5fZWxlbWVudAoKICAgIHJldHVybiBsb2NhbHMoKQoKCmdldEVUcmVlTW9kdWxlID0gbW9kdWxlRmFjdG9yeUZhY3RvcnkoZ2V0RVRyZWVCdWlsZGVyKQpQSwMEFAAAAAAAAAAhANr+StBRNwAAUTcAAEwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9ldHJlZV9seG1sLnB5IiIiTW9kdWxlIGZvciBzdXBwb3J0aW5nIHRoZSBseG1sLmV0cmVlIGxpYnJhcnkuIFRoZSBpZGVhIGhlcmUgaXMgdG8gdXNlIGFzIG11Y2gKb2YgdGhlIG5hdGl2ZSBsaWJyYXJ5IGFzIHBvc3NpYmxlLCB3aXRob3V0IHVzaW5nIGZyYWdpbGUgaGFja3MgbGlrZSBjdXN0b20gZWxlbWVudApuYW1lcyB0aGF0IGJyZWFrIGJldHdlZW4gcmVsZWFzZXMuIFRoZSBkb3duc2lkZSBvZiB0aGlzIGlzIHRoYXQgd2UgY2Fubm90IHJlcHJlc2VudAphbGwgcG9zc2libGUgdHJlZXM7IHNwZWNpZmljYWxseSB0aGUgZm9sbG93aW5nIGFyZSBrbm93biB0byBjYXVzZSBwcm9ibGVtczoKClRleHQgb3IgY29tbWVudHMgYXMgc2libGluZ3Mgb2YgdGhlIHJvb3QgZWxlbWVudApEb2N5cGVzIHdpdGggbm8gbmFtZQoKV2hlbiBhbnkgb2YgdGhlc2UgdGhpbmdzIG9jY3VyLCB3ZSBlbWl0IGEgRGF0YUxvc3NXYXJuaW5nCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCiMgcHlsaW50OmRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwoKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCByZQppbXBvcnQgc3lzCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgRGF0YUxvc3NXYXJuaW5nCmZyb20gLi4gaW1wb3J0IGNvbnN0YW50cwpmcm9tIC4gaW1wb3J0IGV0cmVlIGFzIGV0cmVlX2J1aWxkZXJzCmZyb20gLi4gaW1wb3J0IF9paGF0ZXhtbAoKaW1wb3J0IGx4bWwuZXRyZWUgYXMgZXRyZWUKCgpmdWxsVHJlZSA9IFRydWUKdGFnX3JlZ2V4cCA9IHJlLmNvbXBpbGUoInsoW159XSopfSguKikiKQoKY29tbWVudF90eXBlID0gZXRyZWUuQ29tbWVudCgiYXNkIikudGFnCgoKY2xhc3MgRG9jdW1lbnRUeXBlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5wdWJsaWNJZCA9IHB1YmxpY0lkCiAgICAgICAgc2VsZi5zeXN0ZW1JZCA9IHN5c3RlbUlkCgoKY2xhc3MgRG9jdW1lbnQob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9lbGVtZW50VHJlZSA9IE5vbmUKICAgICAgICBzZWxmLl9jaGlsZE5vZGVzID0gW10KCiAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgc2VsZi5fZWxlbWVudFRyZWUuZ2V0cm9vdCgpLmFkZG5leHQoZWxlbWVudC5fZWxlbWVudCkKCiAgICBkZWYgX2dldENoaWxkTm9kZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkTm9kZXMKCiAgICBjaGlsZE5vZGVzID0gcHJvcGVydHkoX2dldENoaWxkTm9kZXMpCgoKZGVmIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpOgogICAgcnYgPSBbXQogICAgaW5mb3NldEZpbHRlciA9IF9paGF0ZXhtbC5JbmZvc2V0RmlsdGVyKHByZXZlbnREb3VibGVEYXNoQ29tbWVudHM9VHJ1ZSkKCiAgICBkZWYgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCBpbmRlbnQ9MCk6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoZWxlbWVudCwgInRhZyIpOgogICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJnZXRyb290Iik6CiAgICAgICAgICAgICAgICAjIEZ1bGwgdHJlZSBjYXNlCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiNkb2N1bWVudCIpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LmRvY2luZm8uaW50ZXJuYWxEVEQ6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IChlbGVtZW50LmRvY2luZm8ucHVibGljX2lkIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRvY2luZm8uc3lzdGVtX3VybCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGR0ZF9zdHIgPSAiPCFET0NUWVBFICVzPiIgJSBlbGVtZW50LmRvY2luZm8ucm9vdF9uYW1lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZHRkX3N0ciA9ICIiIjwhRE9DVFlQRSAlcyAiJXMiICIlcyI+IiIiICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kb2NpbmZvLnJvb3RfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZG9jaW5mby5wdWJsaWNfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRvY2luZm8uc3lzdGVtX3VybCkKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlcyVzIiAlICgnICcgKiAoaW5kZW50ICsgMiksIGR0ZF9zdHIpKQogICAgICAgICAgICAgICAgbmV4dF9lbGVtZW50ID0gZWxlbWVudC5nZXRyb290KCkKICAgICAgICAgICAgICAgIHdoaWxlIG5leHRfZWxlbWVudC5nZXRwcmV2aW91cygpIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG5leHRfZWxlbWVudCA9IG5leHRfZWxlbWVudC5nZXRwcmV2aW91cygpCiAgICAgICAgICAgICAgICB3aGlsZSBuZXh0X2VsZW1lbnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChuZXh0X2VsZW1lbnQsIGluZGVudCArIDIpCiAgICAgICAgICAgICAgICAgICAgbmV4dF9lbGVtZW50ID0gbmV4dF9lbGVtZW50LmdldG5leHQoKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgc3RyKSBvciBpc2luc3RhbmNlKGVsZW1lbnQsIGJ5dGVzKToKICAgICAgICAgICAgICAgICMgVGV4dCBpbiBhIGZyYWdtZW50CiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShlbGVtZW50LCBzdHIpIG9yIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIGluZGVudCwgZWxlbWVudCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEZyYWdtZW50IGNhc2UKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiI2RvY3VtZW50LWZyYWdtZW50IikKICAgICAgICAgICAgICAgIGZvciBuZXh0X2VsZW1lbnQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KG5leHRfZWxlbWVudCwgaW5kZW50ICsgMikKICAgICAgICBlbGlmIGVsZW1lbnQudGFnID09IGNvbW1lbnRfdHlwZToKICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8IS0tICVzIC0tPiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50LnRleHQpKQogICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJ0YWlsIikgYW5kIGVsZW1lbnQudGFpbDoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQudGFpbCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZWxlbWVudCwgZXRyZWUuX0VsZW1lbnQpCiAgICAgICAgICAgIG5zbWF0Y2ggPSBldHJlZV9idWlsZGVycy50YWdfcmVnZXhwLm1hdGNoKGVsZW1lbnQudGFnKQogICAgICAgICAgICBpZiBuc21hdGNoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgbnMgPSBuc21hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgICAgICB0YWcgPSBuc21hdGNoLmdyb3VwKDIpCiAgICAgICAgICAgICAgICBwcmVmaXggPSBjb25zdGFudHMucHJlZml4ZXNbbnNdCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwlcyAlcz4iICUgKCcgJyAqIGluZGVudCwgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvc2V0RmlsdGVyLmZyb21YbWxOYW1lKHRhZykpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8JXM+IiAlICgnICcgKiBpbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9zZXRGaWx0ZXIuZnJvbVhtbE5hbWUoZWxlbWVudC50YWcpKSkKCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgImF0dHJpYiIpOgogICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IFtdCiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gZWxlbWVudC5hdHRyaWIuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICBuc21hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChuYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIG5zbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIG5zLCBuYW1lID0gbnNtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5mb3NldEZpbHRlci5mcm9tWG1sTmFtZShuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjb25zdGFudHMucHJlZml4ZXNbbnNdCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfc3RyaW5nID0gIiVzICVzIiAlIChwcmVmaXgsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9zdHJpbmcgPSBpbmZvc2V0RmlsdGVyLmZyb21YbWxOYW1lKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hcHBlbmQoKGF0dHJfc3RyaW5nLCB2YWx1ZSkpCgogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNvcnRlZChhdHRyaWJ1dGVzKToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoJ3wlcyVzPSIlcyInICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgbmFtZSwgdmFsdWUpKQoKICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgZWxlbWVudC50ZXh0KSkKICAgICAgICAgICAgaW5kZW50ICs9IDIKICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkLCBpbmRlbnQpCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgInRhaWwiKSBhbmQgZWxlbWVudC50YWlsOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgLSAyKSwgZWxlbWVudC50YWlsKSkKICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCwgMCkKCiAgICByZXR1cm4gIlxuIi5qb2luKHJ2KQoKCmRlZiB0b3N0cmluZyhlbGVtZW50KToKICAgICIiIlNlcmlhbGl6ZSBhbiBlbGVtZW50IGFuZCBpdHMgY2hpbGQgbm9kZXMgdG8gYSBzdHJpbmciIiIKICAgIHJ2ID0gW10KCiAgICBkZWYgc2VyaWFsaXplRWxlbWVudChlbGVtZW50KToKICAgICAgICBpZiBub3QgaGFzYXR0cihlbGVtZW50LCAidGFnIik6CiAgICAgICAgICAgIGlmIGVsZW1lbnQuZG9jaW5mby5pbnRlcm5hbERURDoKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQuZG9jaW5mby5kb2N0eXBlOgogICAgICAgICAgICAgICAgICAgIGR0ZF9zdHIgPSBlbGVtZW50LmRvY2luZm8uZG9jdHlwZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkdGRfc3RyID0gIjwhRE9DVFlQRSAlcz4iICUgZWxlbWVudC5kb2NpbmZvLnJvb3RfbmFtZQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKGR0ZF9zdHIpCiAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudC5nZXRyb290KCkpCgogICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gY29tbWVudF90eXBlOgogICAgICAgICAgICBydi5hcHBlbmQoIjwhLS0lcy0tPiIgJSAoZWxlbWVudC50ZXh0LCkpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgVGhpcyBpcyBhc3N1bWVkIHRvIGJlIGFuIG9yZGluYXJ5IGVsZW1lbnQKICAgICAgICAgICAgaWYgbm90IGVsZW1lbnQuYXR0cmliOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8JXM+IiAlIChlbGVtZW50LnRhZywpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXR0ciA9ICIgIi5qb2luKFsiJXM9XCIlc1wiIiAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGVsZW1lbnQuYXR0cmliLml0ZW1zKCldKQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8JXMgJXM+IiAlIChlbGVtZW50LnRhZywgYXR0cikpCiAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChlbGVtZW50LnRleHQpCgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQpCgogICAgICAgICAgICBydi5hcHBlbmQoIjwvJXM+IiAlIChlbGVtZW50LnRhZywpKQoKICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJ0YWlsIikgYW5kIGVsZW1lbnQudGFpbDoKICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGFpbCkKCiAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpCgogICAgcmV0dXJuICIiLmpvaW4ocnYpCgoKY2xhc3MgVHJlZUJ1aWxkZXIoYmFzZS5UcmVlQnVpbGRlcik6CiAgICBkb2N1bWVudENsYXNzID0gRG9jdW1lbnQKICAgIGRvY3R5cGVDbGFzcyA9IERvY3VtZW50VHlwZQogICAgZWxlbWVudENsYXNzID0gTm9uZQogICAgY29tbWVudENsYXNzID0gTm9uZQogICAgZnJhZ21lbnRDbGFzcyA9IERvY3VtZW50CiAgICBpbXBsZW1lbnRhdGlvbiA9IGV0cmVlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZUhUTUxFbGVtZW50cywgZnVsbFRyZWU9RmFsc2UpOgogICAgICAgIGJ1aWxkZXIgPSBldHJlZV9idWlsZGVycy5nZXRFVHJlZU1vZHVsZShldHJlZSwgZnVsbFRyZWU9ZnVsbFRyZWUpCiAgICAgICAgaW5mb3NldEZpbHRlciA9IHNlbGYuaW5mb3NldEZpbHRlciA9IF9paGF0ZXhtbC5JbmZvc2V0RmlsdGVyKHByZXZlbnREb3VibGVEYXNoQ29tbWVudHM9VHJ1ZSkKICAgICAgICBzZWxmLm5hbWVzcGFjZUhUTUxFbGVtZW50cyA9IG5hbWVzcGFjZUhUTUxFbGVtZW50cwoKICAgICAgICBjbGFzcyBBdHRyaWJ1dGVzKGRpY3QpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudCwgdmFsdWU9Tm9uZSk6CiAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge30KICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQgPSBlbGVtZW50CiAgICAgICAgICAgICAgICBkaWN0Ll9faW5pdF9fKHNlbGYsIHZhbHVlKSAgIyBweWxpbnQ6ZGlzYWJsZT1ub24tcGFyZW50LWluaXQtY2FsbGVkCiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHR1cGxlKToKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKGtleVsyXSwgaW5mb3NldEZpbHRlci5jb2VyY2VBdHRyaWJ1dGUoa2V5WzFdKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5mb3NldEZpbHRlci5jb2VyY2VBdHRyaWJ1dGUoa2V5KQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuX2VsZW1lbnQuYXR0cmliW25hbWVdID0gdmFsdWUKCiAgICAgICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgICAgICAgIGRpY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSkKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCB0dXBsZSk6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKGtleVsyXSwgaW5mb3NldEZpbHRlci5jb2VyY2VBdHRyaWJ1dGUoa2V5WzFdKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlQXR0cmlidXRlKGtleSkKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuX2VsZW1lbnQuYXR0cmliW25hbWVdID0gdmFsdWUKCiAgICAgICAgY2xhc3MgRWxlbWVudChidWlsZGVyLkVsZW1lbnQpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICAgICAgICAgIG5hbWUgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUVsZW1lbnQobmFtZSkKICAgICAgICAgICAgICAgIGJ1aWxkZXIuRWxlbWVudC5fX2luaXRfXyhzZWxmLCBuYW1lLCBuYW1lc3BhY2U9bmFtZXNwYWNlKQogICAgICAgICAgICAgICAgc2VsZi5fYXR0cmlidXRlcyA9IEF0dHJpYnV0ZXMoc2VsZikKCiAgICAgICAgICAgIGRlZiBfc2V0TmFtZShzZWxmLCBuYW1lKToKICAgICAgICAgICAgICAgIHNlbGYuX25hbWUgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUVsZW1lbnQobmFtZSkKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGFnID0gc2VsZi5fZ2V0RVRyZWVUYWcoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbmFtZSwgc2VsZi5fbmFtZXNwYWNlKQoKICAgICAgICAgICAgZGVmIF9nZXROYW1lKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIGluZm9zZXRGaWx0ZXIuZnJvbVhtbE5hbWUoc2VsZi5fbmFtZSkKCiAgICAgICAgICAgIG5hbWUgPSBwcm9wZXJ0eShfZ2V0TmFtZSwgX3NldE5hbWUpCgogICAgICAgICAgICBkZWYgX2dldEF0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0cmlidXRlcwoKICAgICAgICAgICAgZGVmIF9zZXRBdHRyaWJ1dGVzKHNlbGYsIGF0dHJpYnV0ZXMpOgogICAgICAgICAgICAgICAgc2VsZi5fYXR0cmlidXRlcyA9IEF0dHJpYnV0ZXMoc2VsZiwgYXR0cmlidXRlcykKCiAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBwcm9wZXJ0eShfZ2V0QXR0cmlidXRlcywgX3NldEF0dHJpYnV0ZXMpCgogICAgICAgICAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmU9Tm9uZSk6CiAgICAgICAgICAgICAgICBkYXRhID0gaW5mb3NldEZpbHRlci5jb2VyY2VDaGFyYWN0ZXJzKGRhdGEpCiAgICAgICAgICAgICAgICBidWlsZGVyLkVsZW1lbnQuaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmUpCgogICAgICAgICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgY2hpbGQpOgogICAgICAgICAgICAgICAgYnVpbGRlci5FbGVtZW50LmFwcGVuZENoaWxkKHNlbGYsIGNoaWxkKQoKICAgICAgICBjbGFzcyBDb21tZW50KGJ1aWxkZXIuQ29tbWVudCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICAgICAgICAgIGRhdGEgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUNvbW1lbnQoZGF0YSkKICAgICAgICAgICAgICAgIGJ1aWxkZXIuQ29tbWVudC5fX2luaXRfXyhzZWxmLCBkYXRhKQoKICAgICAgICAgICAgZGVmIF9zZXREYXRhKHNlbGYsIGRhdGEpOgogICAgICAgICAgICAgICAgZGF0YSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlQ29tbWVudChkYXRhKQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gZGF0YQoKICAgICAgICAgICAgZGVmIF9nZXREYXRhKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1lbnQudGV4dAoKICAgICAgICAgICAgZGF0YSA9IHByb3BlcnR5KF9nZXREYXRhLCBfc2V0RGF0YSkKCiAgICAgICAgc2VsZi5lbGVtZW50Q2xhc3MgPSBFbGVtZW50CiAgICAgICAgc2VsZi5jb21tZW50Q2xhc3MgPSBDb21tZW50CiAgICAgICAgIyBzZWxmLmZyYWdtZW50Q2xhc3MgPSBidWlsZGVyLkRvY3VtZW50RnJhZ21lbnQKICAgICAgICBiYXNlLlRyZWVCdWlsZGVyLl9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZUhUTUxFbGVtZW50cykKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgYmFzZS5UcmVlQnVpbGRlci5yZXNldChzZWxmKQogICAgICAgIHNlbGYuaW5zZXJ0Q29tbWVudCA9IHNlbGYuaW5zZXJ0Q29tbWVudEluaXRpYWwKICAgICAgICBzZWxmLmluaXRpYWxfY29tbWVudHMgPSBbXQogICAgICAgIHNlbGYuZG9jdHlwZSA9IE5vbmUKCiAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgcmV0dXJuIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpCgogICAgZGVmIGdldERvY3VtZW50KHNlbGYpOgogICAgICAgIGlmIGZ1bGxUcmVlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudFRyZWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudFRyZWUuZ2V0cm9vdCgpCgogICAgZGVmIGdldEZyYWdtZW50KHNlbGYpOgogICAgICAgIGZyYWdtZW50ID0gW10KICAgICAgICBlbGVtZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbMF0uX2VsZW1lbnQKICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZChlbGVtZW50LnRleHQpCiAgICAgICAgZnJhZ21lbnQuZXh0ZW5kKGxpc3QoZWxlbWVudCkpCiAgICAgICAgaWYgZWxlbWVudC50YWlsOgogICAgICAgICAgICBmcmFnbWVudC5hcHBlbmQoZWxlbWVudC50YWlsKQogICAgICAgIHJldHVybiBmcmFnbWVudAoKICAgIGRlZiBpbnNlcnREb2N0eXBlKHNlbGYsIHRva2VuKToKICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgIHB1YmxpY0lkID0gdG9rZW5bInB1YmxpY0lkIl0KICAgICAgICBzeXN0ZW1JZCA9IHRva2VuWyJzeXN0ZW1JZCJdCgogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJseG1sIGNhbm5vdCByZXByZXNlbnQgZW1wdHkgZG9jdHlwZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgc2VsZi5kb2N0eXBlID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvZXJjZWROYW1lID0gc2VsZi5pbmZvc2V0RmlsdGVyLmNvZXJjZUVsZW1lbnQobmFtZSkKICAgICAgICAgICAgaWYgY29lcmNlZE5hbWUgIT0gbmFtZToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImx4bWwgY2Fubm90IHJlcHJlc2VudCBub24teG1sIGRvY3R5cGUiLCBEYXRhTG9zc1dhcm5pbmcpCgogICAgICAgICAgICBkb2N0eXBlID0gc2VsZi5kb2N0eXBlQ2xhc3MoY29lcmNlZE5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkKICAgICAgICAgICAgc2VsZi5kb2N0eXBlID0gZG9jdHlwZQoKICAgIGRlZiBpbnNlcnRDb21tZW50SW5pdGlhbChzZWxmLCBkYXRhLCBwYXJlbnQ9Tm9uZSk6CiAgICAgICAgYXNzZXJ0IHBhcmVudCBpcyBOb25lIG9yIHBhcmVudCBpcyBzZWxmLmRvY3VtZW50CiAgICAgICAgYXNzZXJ0IHNlbGYuZG9jdW1lbnQuX2VsZW1lbnRUcmVlIGlzIE5vbmUKICAgICAgICBzZWxmLmluaXRpYWxfY29tbWVudHMuYXBwZW5kKGRhdGEpCgogICAgZGVmIGluc2VydENvbW1lbnRNYWluKHNlbGYsIGRhdGEsIHBhcmVudD1Ob25lKToKICAgICAgICBpZiAocGFyZW50ID09IHNlbGYuZG9jdW1lbnQgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmRvY3VtZW50Ll9lbGVtZW50VHJlZS5nZXRyb290KClbLTFdLnRhZyA9PSBjb21tZW50X3R5cGUpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJseG1sIGNhbm5vdCByZXByZXNlbnQgYWRqYWNlbnQgY29tbWVudHMgYmV5b25kIHRoZSByb290IGVsZW1lbnRzIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgIHN1cGVyKFRyZWVCdWlsZGVyLCBzZWxmKS5pbnNlcnRDb21tZW50KGRhdGEsIHBhcmVudCkKCiAgICBkZWYgaW5zZXJ0Um9vdChzZWxmLCB0b2tlbik6CiAgICAgICAgIiIiQ3JlYXRlIHRoZSBkb2N1bWVudCByb290IiIiCiAgICAgICAgIyBCZWNhdXNlIG9mIHRoZSB3YXkgbGlieG1sMiB3b3JrcywgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHBvc3NpYmxlIHRvCiAgICAgICAgIyBhbHRlciBpbmZvcm1hdGlvbiBsaWtlIHRoZSBkb2N0eXBlIGFmdGVyIHRoZSB0cmVlIGhhcyBiZWVuIHBhcnNlZC4KICAgICAgICAjIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHVzZSB0aGUgYnVpbHQtaW4gcGFyc2VyIHRvIGNyZWF0ZSBvdXIgaW5pdGlhbAogICAgICAgICMgdHJlZSwgYWZ0ZXIgd2hpY2ggd2UgY2FuIGFkZCBlbGVtZW50cyBsaWtlIG5vcm1hbAogICAgICAgIGRvY1N0ciA9ICIiCiAgICAgICAgaWYgc2VsZi5kb2N0eXBlOgogICAgICAgICAgICBhc3NlcnQgc2VsZi5kb2N0eXBlLm5hbWUKICAgICAgICAgICAgZG9jU3RyICs9ICI8IURPQ1RZUEUgJXMiICUgc2VsZi5kb2N0eXBlLm5hbWUKICAgICAgICAgICAgaWYgKHNlbGYuZG9jdHlwZS5wdWJsaWNJZCBpcyBub3QgTm9uZSBvcgogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9jdHlwZS5zeXN0ZW1JZCBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBkb2NTdHIgKz0gKCcgUFVCTElDICIlcyIgJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmluZm9zZXRGaWx0ZXIuY29lcmNlUHViaWQoc2VsZi5kb2N0eXBlLnB1YmxpY0lkIG9yICIiKSkpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmRvY3R5cGUuc3lzdGVtSWQ6CiAgICAgICAgICAgICAgICAgICAgc3lzaWQgPSBzZWxmLmRvY3R5cGUuc3lzdGVtSWQKICAgICAgICAgICAgICAgICAgICBpZiBzeXNpZC5maW5kKCInIikgPj0gMCBhbmQgc3lzaWQuZmluZCgnIicpID49IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkRPQ1RZUEUgc3lzdGVtIGNhbm5vdCBjb250YWluIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcyIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgICAgICAgICAgICAgc3lzaWQgPSBzeXNpZC5yZXBsYWNlKCInIiwgJ1UwMDAyNycpCiAgICAgICAgICAgICAgICAgICAgaWYgc3lzaWQuZmluZCgiJyIpID49IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY1N0ciArPSAnIiVzIicgJSBzeXNpZAogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY1N0ciArPSAiJyVzJyIgJSBzeXNpZAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkb2NTdHIgKz0gIicnIgogICAgICAgICAgICBkb2NTdHIgKz0gIj4iCiAgICAgICAgICAgIGlmIHNlbGYuZG9jdHlwZS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJseG1sIGNhbm5vdCByZXByZXNlbnQgZG9jdHlwZSB3aXRoIGEgZGlmZmVyZW50IG5hbWUgdG8gdGhlIHJvb3QgZWxlbWVudCIsIERhdGFMb3NzV2FybmluZykKICAgICAgICBkb2NTdHIgKz0gIjxUSElTX1NIT1VMRF9ORVZFUl9BUFBFQVJfUFVCTElDTFkvPiIKICAgICAgICByb290ID0gZXRyZWUuZnJvbXN0cmluZyhkb2NTdHIpCgogICAgICAgICMgQXBwZW5kIHRoZSBpbml0aWFsIGNvbW1lbnRzOgogICAgICAgIGZvciBjb21tZW50X3Rva2VuIGluIHNlbGYuaW5pdGlhbF9jb21tZW50czoKICAgICAgICAgICAgY29tbWVudCA9IHNlbGYuY29tbWVudENsYXNzKGNvbW1lbnRfdG9rZW5bImRhdGEiXSkKICAgICAgICAgICAgcm9vdC5hZGRwcmV2aW91cyhjb21tZW50Ll9lbGVtZW50KQoKICAgICAgICAjIENyZWF0ZSB0aGUgcm9vdCBkb2N1bWVudCBhbmQgYWRkIHRoZSBFbGVtZW50VHJlZSB0byBpdAogICAgICAgIHNlbGYuZG9jdW1lbnQgPSBzZWxmLmRvY3VtZW50Q2xhc3MoKQogICAgICAgIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnRUcmVlID0gcm9vdC5nZXRyb290dHJlZSgpCgogICAgICAgICMgR2l2ZSB0aGUgcm9vdCBlbGVtZW50IHRoZSByaWdodCBuYW1lCiAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICBuYW1lc3BhY2UgPSB0b2tlbi5nZXQoIm5hbWVzcGFjZSIsIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSkKICAgICAgICBpZiBuYW1lc3BhY2UgaXMgTm9uZToKICAgICAgICAgICAgZXRyZWVfdGFnID0gbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGV0cmVlX3RhZyA9ICJ7JXN9JXMiICUgKG5hbWVzcGFjZSwgbmFtZSkKICAgICAgICByb290LnRhZyA9IGV0cmVlX3RhZwoKICAgICAgICAjIEFkZCB0aGUgcm9vdCBlbGVtZW50IHRvIHRoZSBpbnRlcm5hbCBjaGlsZC9vcGVuIGRhdGEgc3RydWN0dXJlcwogICAgICAgIHJvb3RfZWxlbWVudCA9IHNlbGYuZWxlbWVudENsYXNzKG5hbWUsIG5hbWVzcGFjZSkKICAgICAgICByb290X2VsZW1lbnQuX2VsZW1lbnQgPSByb290CiAgICAgICAgc2VsZi5kb2N1bWVudC5fY2hpbGROb2Rlcy5hcHBlbmQocm9vdF9lbGVtZW50KQogICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLmFwcGVuZChyb290X2VsZW1lbnQpCgogICAgICAgICMgUmVzZXQgdG8gdGhlIGRlZmF1bHQgaW5zZXJ0IGNvbW1lbnQgZnVuY3Rpb24KICAgICAgICBzZWxmLmluc2VydENvbW1lbnQgPSBzZWxmLmluc2VydENvbW1lbnRNYWluClBLAwQUAAAAAAAAACEAc0QhlqgVAACoFQAASQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvX19pbml0X18ucHkiIiJBIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBmb3IgaXRlcmF0aW5nIHRocm91Z2ggZGlmZmVyZW50IGtpbmRzIG9mCnRyZWUsIGdlbmVyYXRpbmcgdG9rZW5zIGlkZW50aWNhbCB0byB0aG9zZSBwcm9kdWNlZCBieSB0aGUgdG9rZW5pemVyCm1vZHVsZS4KClRvIGNyZWF0ZSBhIHRyZWUgd2Fsa2VyIGZvciBhIG5ldyB0eXBlIG9mIHRyZWUsIHlvdSBuZWVkIHRvIGRvCmltcGxlbWVudCBhIHRyZWUgd2Fsa2VyIG9iamVjdCAoY2FsbGVkIFRyZWVXYWxrZXIgYnkgY29udmVudGlvbikgdGhhdAppbXBsZW1lbnRzIGEgJ3NlcmlhbGl6ZScgbWV0aG9kIHRha2luZyBhIHRyZWUgYXMgc29sZSBhcmd1bWVudCBhbmQKcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIGdlbmVyYXRpbmcgdG9rZW5zLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuLiBpbXBvcnQgY29uc3RhbnRzCmZyb20gLi5fdXRpbHMgaW1wb3J0IGRlZmF1bHRfZXRyZWUKCl9fYWxsX18gPSBbImdldFRyZWVXYWxrZXIiLCAicHByaW50IiwgImRvbSIsICJldHJlZSIsICJnZW5zaGkiLCAiZXRyZWVfbHhtbCJdCgp0cmVlV2Fsa2VyQ2FjaGUgPSB7fQoKCmRlZiBnZXRUcmVlV2Fsa2VyKHRyZWVUeXBlLCBpbXBsZW1lbnRhdGlvbj1Ob25lLCAqKmt3YXJncyk6CiAgICAiIiJHZXQgYSBUcmVlV2Fsa2VyIGNsYXNzIGZvciB2YXJpb3VzIHR5cGVzIG9mIHRyZWUgd2l0aCBidWlsdC1pbiBzdXBwb3J0CgogICAgQXJnczoKICAgICAgICB0cmVlVHlwZSAoc3RyKTogdGhlIG5hbWUgb2YgdGhlIHRyZWUgdHlwZSByZXF1aXJlZCAoY2FzZS1pbnNlbnNpdGl2ZSkuCiAgICAgICAgICAgIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOgoKICAgICAgICAgICAgLSAiZG9tIjogVGhlIHhtbC5kb20ubWluaWRvbSBET00gaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgLSAiZXRyZWUiOiBBIGdlbmVyaWMgd2Fsa2VyIGZvciB0cmVlIGltcGxlbWVudGF0aW9ucyBleHBvc2luZyBhbgogICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnR0cmVlLWxpa2UgaW50ZXJmYWNlIChrbm93biB0byB3b3JrIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50VHJlZSwgY0VsZW1lbnRUcmVlIGFuZCBseG1sLmV0cmVlKS4KICAgICAgICAgICAgLSAibHhtbCI6IE9wdGltaXplZCB3YWxrZXIgZm9yIGx4bWwuZXRyZWUKICAgICAgICAgICAgLSAiZ2Vuc2hpIjogYSBHZW5zaGkgc3RyZWFtCgogICAgICAgIEltcGxlbWVudGF0aW9uOiBBIG1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIHRyZWUgdHlwZSBlLmcuCiAgICAgICAgICAgIHhtbC5ldHJlZS5FbGVtZW50VHJlZSBvciBjRWxlbWVudFRyZWUgKEN1cnJlbnRseSBhcHBsaWVzIHRvIHRoZQogICAgICAgICAgICAiZXRyZWUiIHRyZWUgdHlwZSBvbmx5KS4KICAgICIiIgoKICAgIHRyZWVUeXBlID0gdHJlZVR5cGUubG93ZXIoKQogICAgaWYgdHJlZVR5cGUgbm90IGluIHRyZWVXYWxrZXJDYWNoZToKICAgICAgICBpZiB0cmVlVHlwZSA9PSAiZG9tIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBkb20KICAgICAgICAgICAgdHJlZVdhbGtlckNhY2hlW3RyZWVUeXBlXSA9IGRvbS5UcmVlV2Fsa2VyCiAgICAgICAgZWxpZiB0cmVlVHlwZSA9PSAiZ2Vuc2hpIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBnZW5zaGkKICAgICAgICAgICAgdHJlZVdhbGtlckNhY2hlW3RyZWVUeXBlXSA9IGdlbnNoaS5UcmVlV2Fsa2VyCiAgICAgICAgZWxpZiB0cmVlVHlwZSA9PSAibHhtbCI6CiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZXRyZWVfbHhtbAogICAgICAgICAgICB0cmVlV2Fsa2VyQ2FjaGVbdHJlZVR5cGVdID0gZXRyZWVfbHhtbC5UcmVlV2Fsa2VyCiAgICAgICAgZWxpZiB0cmVlVHlwZSA9PSAiZXRyZWUiOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGV0cmVlCiAgICAgICAgICAgIGlmIGltcGxlbWVudGF0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IGRlZmF1bHRfZXRyZWUKICAgICAgICAgICAgIyBYWFg6IE5FVkVSIGNhY2hlIGhlcmUsIGNhY2hpbmcgaXMgZG9uZSBpbiB0aGUgZXRyZWUgc3VibW9kdWxlCiAgICAgICAgICAgIHJldHVybiBldHJlZS5nZXRFVHJlZU1vZHVsZShpbXBsZW1lbnRhdGlvbiwgKiprd2FyZ3MpLlRyZWVXYWxrZXIKICAgIHJldHVybiB0cmVlV2Fsa2VyQ2FjaGUuZ2V0KHRyZWVUeXBlKQoKCmRlZiBjb25jYXRlbmF0ZUNoYXJhY3RlclRva2Vucyh0b2tlbnMpOgogICAgcGVuZGluZ0NoYXJhY3RlcnMgPSBbXQogICAgZm9yIHRva2VuIGluIHRva2VuczoKICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgIGlmIHR5cGUgaW4gKCJDaGFyYWN0ZXJzIiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICBwZW5kaW5nQ2hhcmFjdGVycy5hcHBlbmQodG9rZW5bImRhdGEiXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBwZW5kaW5nQ2hhcmFjdGVyczoKICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJDaGFyYWN0ZXJzIiwgImRhdGEiOiAiIi5qb2luKHBlbmRpbmdDaGFyYWN0ZXJzKX0KICAgICAgICAgICAgICAgIHBlbmRpbmdDaGFyYWN0ZXJzID0gW10KICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgIGlmIHBlbmRpbmdDaGFyYWN0ZXJzOgogICAgICAgIHlpZWxkIHsidHlwZSI6ICJDaGFyYWN0ZXJzIiwgImRhdGEiOiAiIi5qb2luKHBlbmRpbmdDaGFyYWN0ZXJzKX0KCgpkZWYgcHByaW50KHdhbGtlcik6CiAgICAiIiJQcmV0dHkgcHJpbnRlciBmb3IgdHJlZSB3YWxrZXJzIiIiCiAgICBvdXRwdXQgPSBbXQogICAgaW5kZW50ID0gMAogICAgZm9yIHRva2VuIGluIGNvbmNhdGVuYXRlQ2hhcmFjdGVyVG9rZW5zKHdhbGtlcik6CiAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgIyB0YWcgbmFtZQogICAgICAgICAgICBpZiB0b2tlblsibmFtZXNwYWNlIl0gYW5kIHRva2VuWyJuYW1lc3BhY2UiXSAhPSBjb25zdGFudHMubmFtZXNwYWNlc1siaHRtbCJdOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWVzcGFjZSJdIGluIGNvbnN0YW50cy5wcmVmaXhlczoKICAgICAgICAgICAgICAgICAgICBucyA9IGNvbnN0YW50cy5wcmVmaXhlc1t0b2tlblsibmFtZXNwYWNlIl1dCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5zID0gdG9rZW5bIm5hbWVzcGFjZSJdCiAgICAgICAgICAgICAgICBuYW1lID0gIiVzICVzIiAlIChucywgdG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzPCVzPiIgJSAoIiAiICogaW5kZW50LCBuYW1lKSkKICAgICAgICAgICAgaW5kZW50ICs9IDIKICAgICAgICAgICAgIyBhdHRyaWJ1dGVzIChzb3J0ZWQgZm9yIGNvbnNpc3RlbnQgb3JkZXJpbmcpCiAgICAgICAgICAgIGF0dHJzID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICBmb3IgKG5hbWVzcGFjZSwgbG9jYWxuYW1lKSwgdmFsdWUgaW4gc29ydGVkKGF0dHJzLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgaWYgbmFtZXNwYWNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpbiBjb25zdGFudHMucHJlZml4ZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIG5zID0gY29uc3RhbnRzLnByZWZpeGVzW25hbWVzcGFjZV0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBucyA9IG5hbWVzcGFjZQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiJXMgJXMiICUgKG5zLCBsb2NhbG5hbWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBsb2NhbG5hbWUKICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzJXM9XCIlc1wiIiAlICgiICIgKiBpbmRlbnQsIG5hbWUsIHZhbHVlKSkKICAgICAgICAgICAgIyBzZWxmLWNsb3NpbmcKICAgICAgICAgICAgaWYgdHlwZSA9PSAiRW1wdHlUYWciOgogICAgICAgICAgICAgICAgaW5kZW50IC09IDIKCiAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICBpbmRlbnQgLT0gMgoKICAgICAgICBlbGlmIHR5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlczwhLS0gJXMgLS0+IiAlICgiICIgKiBpbmRlbnQsIHRva2VuWyJkYXRhIl0pKQoKICAgICAgICBlbGlmIHR5cGUgPT0gIkRvY3R5cGUiOgogICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bInB1YmxpY0lkIl06CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiIiIlczwhRE9DVFlQRSAlcyAiJXMiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiICIgKiBpbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsicHVibGljSWQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsic3lzdGVtSWQiXSBpZiB0b2tlblsic3lzdGVtSWQiXSBlbHNlICIiKSkKICAgICAgICAgICAgICAgIGVsaWYgdG9rZW5bInN5c3RlbUlkIl06CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiIiIlczwhRE9DVFlQRSAlcyAiIiAiJXMiPiIiIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiAiICogaW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bInN5c3RlbUlkIl0pKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlczwhRE9DVFlQRSAlcz4iICUgKCIgIiAqIGluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0pKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXM8IURPQ1RZUEUgPiIgJSAoIiAiICogaW5kZW50LCkpCgogICAgICAgIGVsaWYgdHlwZSA9PSAiQ2hhcmFjdGVycyI6CiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzXCIlc1wiIiAlICgiICIgKiBpbmRlbnQsIHRva2VuWyJkYXRhIl0pKQoKICAgICAgICBlbGlmIHR5cGUgPT0gIlNwYWNlQ2hhcmFjdGVycyI6CiAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgImNvbmNhdGVuYXRlQ2hhcmFjdGVyVG9rZW5zIHNob3VsZCBoYXZlIGdvdCByaWQgb2YgYWxsIFNwYWNlIHRva2VucyIKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biB0b2tlbiB0eXBlLCAlcyIgJSB0eXBlKQoKICAgIHJldHVybiAiXG4iLmpvaW4ob3V0cHV0KQpQSwMEFAAAAAAAAAAhAE0jmMBLEwAASxMAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2Jhc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20geG1sLmRvbSBpbXBvcnQgTm9kZQpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzLCB2b2lkRWxlbWVudHMsIHNwYWNlQ2hhcmFjdGVycwoKX19hbGxfXyA9IFsiRE9DVU1FTlQiLCAiRE9DVFlQRSIsICJURVhUIiwgIkVMRU1FTlQiLCAiQ09NTUVOVCIsICJFTlRJVFkiLCAiVU5LTk9XTiIsCiAgICAgICAgICAgIlRyZWVXYWxrZXIiLCAiTm9uUmVjdXJzaXZlVHJlZVdhbGtlciJdCgpET0NVTUVOVCA9IE5vZGUuRE9DVU1FTlRfTk9ERQpET0NUWVBFID0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUKVEVYVCA9IE5vZGUuVEVYVF9OT0RFCkVMRU1FTlQgPSBOb2RlLkVMRU1FTlRfTk9ERQpDT01NRU5UID0gTm9kZS5DT01NRU5UX05PREUKRU5USVRZID0gTm9kZS5FTlRJVFlfTk9ERQpVTktOT1dOID0gIjwjVU5LTk9XTiM+IgoKc3BhY2VDaGFyYWN0ZXJzID0gIiIuam9pbihzcGFjZUNoYXJhY3RlcnMpCgoKY2xhc3MgVHJlZVdhbGtlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyZWUpOgogICAgICAgIHNlbGYudHJlZSA9IHRyZWUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBlcnJvcihzZWxmLCBtc2cpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiU2VyaWFsaXplRXJyb3IiLCAiZGF0YSI6IG1zZ30KCiAgICBkZWYgZW1wdHlUYWcoc2VsZiwgbmFtZXNwYWNlLCBuYW1lLCBhdHRycywgaGFzQ2hpbGRyZW49RmFsc2UpOgogICAgICAgIHlpZWxkIHsidHlwZSI6ICJFbXB0eVRhZyIsICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgIm5hbWVzcGFjZSI6IG5hbWVzcGFjZSwKICAgICAgICAgICAgICAgImRhdGEiOiBhdHRyc30KICAgICAgICBpZiBoYXNDaGlsZHJlbjoKICAgICAgICAgICAgeWllbGQgc2VsZi5lcnJvcigiVm9pZCBlbGVtZW50IGhhcyBjaGlsZHJlbiIpCgogICAgZGVmIHN0YXJ0VGFnKHNlbGYsIG5hbWVzcGFjZSwgbmFtZSwgYXR0cnMpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiU3RhcnRUYWciLAogICAgICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAgICAgIm5hbWVzcGFjZSI6IG5hbWVzcGFjZSwKICAgICAgICAgICAgICAgICJkYXRhIjogYXR0cnN9CgogICAgZGVmIGVuZFRhZyhzZWxmLCBuYW1lc3BhY2UsIG5hbWUpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiRW5kVGFnIiwKICAgICAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgICJuYW1lc3BhY2UiOiBuYW1lc3BhY2V9CgogICAgZGVmIHRleHQoc2VsZiwgZGF0YSk6CiAgICAgICAgZGF0YSA9IGRhdGEKICAgICAgICBtaWRkbGUgPSBkYXRhLmxzdHJpcChzcGFjZUNoYXJhY3RlcnMpCiAgICAgICAgbGVmdCA9IGRhdGFbOmxlbihkYXRhKSAtIGxlbihtaWRkbGUpXQogICAgICAgIGlmIGxlZnQ6CiAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJTcGFjZUNoYXJhY3RlcnMiLCAiZGF0YSI6IGxlZnR9CiAgICAgICAgZGF0YSA9IG1pZGRsZQogICAgICAgIG1pZGRsZSA9IGRhdGEucnN0cmlwKHNwYWNlQ2hhcmFjdGVycykKICAgICAgICByaWdodCA9IGRhdGFbbGVuKG1pZGRsZSk6XQogICAgICAgIGlmIG1pZGRsZToKICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIkNoYXJhY3RlcnMiLCAiZGF0YSI6IG1pZGRsZX0KICAgICAgICBpZiByaWdodDoKICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIlNwYWNlQ2hhcmFjdGVycyIsICJkYXRhIjogcmlnaHR9CgogICAgZGVmIGNvbW1lbnQoc2VsZiwgZGF0YSk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJDb21tZW50IiwgImRhdGEiOiBkYXRhfQoKICAgIGRlZiBkb2N0eXBlKHNlbGYsIG5hbWUsIHB1YmxpY0lkPU5vbmUsIHN5c3RlbUlkPU5vbmUpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiRG9jdHlwZSIsCiAgICAgICAgICAgICAgICAibmFtZSI6IG5hbWUsCiAgICAgICAgICAgICAgICAicHVibGljSWQiOiBwdWJsaWNJZCwKICAgICAgICAgICAgICAgICJzeXN0ZW1JZCI6IHN5c3RlbUlkfQoKICAgIGRlZiBlbnRpdHkoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJFbnRpdHkiLCAibmFtZSI6IG5hbWV9CgogICAgZGVmIHVua25vd24oc2VsZiwgbm9kZVR5cGUpOgogICAgICAgIHJldHVybiBzZWxmLmVycm9yKCJVbmtub3duIG5vZGUgdHlwZTogIiArIG5vZGVUeXBlKQoKCmNsYXNzIE5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIoVHJlZVdhbGtlcik6CiAgICBkZWYgZ2V0Tm9kZURldGFpbHMoc2VsZiwgbm9kZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRGaXJzdENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZ2V0TmV4dFNpYmxpbmcoc2VsZiwgbm9kZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRQYXJlbnROb2RlKHNlbGYsIG5vZGUpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgY3VycmVudE5vZGUgPSBzZWxmLnRyZWUKICAgICAgICB3aGlsZSBjdXJyZW50Tm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZGV0YWlscyA9IHNlbGYuZ2V0Tm9kZURldGFpbHMoY3VycmVudE5vZGUpCiAgICAgICAgICAgIHR5cGUsIGRldGFpbHMgPSBkZXRhaWxzWzBdLCBkZXRhaWxzWzE6XQogICAgICAgICAgICBoYXNDaGlsZHJlbiA9IEZhbHNlCgogICAgICAgICAgICBpZiB0eXBlID09IERPQ1RZUEU6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmRvY3R5cGUoKmRldGFpbHMpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gVEVYVDoKICAgICAgICAgICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnRleHQoKmRldGFpbHMpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gRUxFTUVOVDoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwgbmFtZSwgYXR0cmlidXRlcywgaGFzQ2hpbGRyZW4gPSBkZXRhaWxzCiAgICAgICAgICAgICAgICBpZiAobm90IG5hbWVzcGFjZSBvciBuYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1siaHRtbCJdKSBhbmQgbmFtZSBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYuZW1wdHlUYWcobmFtZXNwYWNlLCBuYW1lLCBhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuKToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbiA9IEZhbHNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuc3RhcnRUYWcobmFtZXNwYWNlLCBuYW1lLCBhdHRyaWJ1dGVzKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09IENPTU1FTlQ6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmNvbW1lbnQoZGV0YWlsc1swXSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBFTlRJVFk6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVudGl0eShkZXRhaWxzWzBdKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09IERPQ1VNRU5UOgogICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW4gPSBUcnVlCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi51bmtub3duKGRldGFpbHNbMF0pCgogICAgICAgICAgICBpZiBoYXNDaGlsZHJlbjoKICAgICAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBzZWxmLmdldEZpcnN0Q2hpbGQoY3VycmVudE5vZGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmaXJzdENoaWxkID0gTm9uZQoKICAgICAgICAgICAgaWYgZmlyc3RDaGlsZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gZmlyc3RDaGlsZAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgd2hpbGUgY3VycmVudE5vZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZGV0YWlscyA9IHNlbGYuZ2V0Tm9kZURldGFpbHMoY3VycmVudE5vZGUpCiAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGV0YWlscyA9IGRldGFpbHNbMF0sIGRldGFpbHNbMTpdCiAgICAgICAgICAgICAgICAgICAgaWYgdHlwZSA9PSBFTEVNRU5UOgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsIG5hbWUsIGF0dHJpYnV0ZXMsIGhhc0NoaWxkcmVuID0gZGV0YWlscwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlIGFuZCBuYW1lc3BhY2UgIT0gbmFtZXNwYWNlc1siaHRtbCJdKSBvciBuYW1lIG5vdCBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuZFRhZyhuYW1lc3BhY2UsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlIGlzIGN1cnJlbnROb2RlOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBuZXh0U2libGluZyA9IHNlbGYuZ2V0TmV4dFNpYmxpbmcoY3VycmVudE5vZGUpCiAgICAgICAgICAgICAgICAgICAgaWYgbmV4dFNpYmxpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHNlbGYuZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSkKUEsDBBQAAAAAAAAAIQBlim+phQUAAIUFAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9kb20ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20geG1sLmRvbSBpbXBvcnQgTm9kZQoKZnJvbSAuIGltcG9ydCBiYXNlCgoKY2xhc3MgVHJlZVdhbGtlcihiYXNlLk5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIpOgogICAgZGVmIGdldE5vZGVEZXRhaWxzKHNlbGYsIG5vZGUpOgogICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6CiAgICAgICAgICAgIHJldHVybiBiYXNlLkRPQ1RZUEUsIG5vZGUubmFtZSwgbm9kZS5wdWJsaWNJZCwgbm9kZS5zeXN0ZW1JZAoKICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgaW4gKE5vZGUuVEVYVF9OT0RFLCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSk6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlRFWFQsIG5vZGUubm9kZVZhbHVlCgogICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKICAgICAgICAgICAgYXR0cnMgPSB7fQogICAgICAgICAgICBmb3IgYXR0ciBpbiBsaXN0KG5vZGUuYXR0cmlidXRlcy5rZXlzKCkpOgogICAgICAgICAgICAgICAgYXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlTm9kZShhdHRyKQogICAgICAgICAgICAgICAgaWYgYXR0ci5uYW1lc3BhY2VVUkk6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbKGF0dHIubmFtZXNwYWNlVVJJLCBhdHRyLmxvY2FsTmFtZSldID0gYXR0ci52YWx1ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhdHRyc1soTm9uZSwgYXR0ci5uYW1lKV0gPSBhdHRyLnZhbHVlCiAgICAgICAgICAgIHJldHVybiAoYmFzZS5FTEVNRU5ULCBub2RlLm5hbWVzcGFjZVVSSSwgbm9kZS5ub2RlTmFtZSwKICAgICAgICAgICAgICAgICAgICBhdHRycywgbm9kZS5oYXNDaGlsZE5vZGVzKCkpCgogICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkNPTU1FTlRfTk9ERToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuQ09NTUVOVCwgbm9kZS5ub2RlVmFsdWUKCiAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlIGluIChOb2RlLkRPQ1VNRU5UX05PREUsIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSk6CiAgICAgICAgICAgIHJldHVybiAoYmFzZS5ET0NVTUVOVCwpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlVOS05PV04sIG5vZGUubm9kZVR5cGUKCiAgICBkZWYgZ2V0Rmlyc3RDaGlsZChzZWxmLCBub2RlKToKICAgICAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkCgogICAgZGVmIGdldE5leHRTaWJsaW5nKHNlbGYsIG5vZGUpOgogICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nCgogICAgZGVmIGdldFBhcmVudE5vZGUoc2VsZiwgbm9kZSk6CiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQpQSwMEFAAAAAAAAAAhACLBEDFMEgAATBIAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2V0cmVlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB0cnk6CiAgICAgICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBPcmRlcmVkRGljdCA9IGRpY3QKCmltcG9ydCByZQoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHN0cmluZ190eXBlcwoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi5fdXRpbHMgaW1wb3J0IG1vZHVsZUZhY3RvcnlGYWN0b3J5Cgp0YWdfcmVnZXhwID0gcmUuY29tcGlsZSgieyhbXn1dKil9KC4qKSIpCgoKZGVmIGdldEVUcmVlQnVpbGRlcihFbGVtZW50VHJlZUltcGxlbWVudGF0aW9uKToKICAgIEVsZW1lbnRUcmVlID0gRWxlbWVudFRyZWVJbXBsZW1lbnRhdGlvbgogICAgRWxlbWVudFRyZWVDb21tZW50VHlwZSA9IEVsZW1lbnRUcmVlLkNvbW1lbnQoImFzZCIpLnRhZwoKICAgIGNsYXNzIFRyZWVXYWxrZXIoYmFzZS5Ob25SZWN1cnNpdmVUcmVlV2Fsa2VyKTogICMgcHlsaW50OmRpc2FibGU9dW51c2VkLXZhcmlhYmxlCiAgICAgICAgIiIiR2l2ZW4gdGhlIHBhcnRpY3VsYXIgRWxlbWVudFRyZWUgcmVwcmVzZW50YXRpb24sIHRoaXMgaW1wbGVtZW50YXRpb24sCiAgICAgICAgdG8gYXZvaWQgdXNpbmcgcmVjdXJzaW9uLCByZXR1cm5zICJub2RlcyIgYXMgdHVwbGVzIHdpdGggdGhlIGZvbGxvd2luZwogICAgICAgIGNvbnRlbnQ6CgogICAgICAgIDEuIFRoZSBjdXJyZW50IGVsZW1lbnQKCiAgICAgICAgMi4gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQKCiAgICAgICAgMy4gQSBzdGFjayBvZiBhbmNlc3RvciBlbGVtZW50cwoKICAgICAgICA0LiBBIGZsYWcgInRleHQiLCAidGFpbCIgb3IgTm9uZSB0byBpbmRpY2F0ZSBpZiB0aGUgY3VycmVudCBub2RlIGlzIGEKICAgICAgICAgICB0ZXh0IG5vZGU7IGVpdGhlciB0aGUgdGV4dCBvciB0YWlsIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgKDEpCiAgICAgICAgIiIiCiAgICAgICAgZGVmIGdldE5vZGVEZXRhaWxzKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKTogICMgSXQgbWlnaHQgYmUgdGhlIHJvb3QgRWxlbWVudAogICAgICAgICAgICAgICAgZWx0LCBfLCBfLCBmbGFnID0gbm9kZQogICAgICAgICAgICAgICAgaWYgZmxhZyBpbiAoInRleHQiLCAidGFpbCIpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLlRFWFQsIGdldGF0dHIoZWx0LCBmbGFnKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBub2RlID0gZWx0CgogICAgICAgICAgICBpZiBub3QoaGFzYXR0cihub2RlLCAidGFnIikpOgogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0cm9vdCgpCgogICAgICAgICAgICBpZiBub2RlLnRhZyBpbiAoIkRPQ1VNRU5UX1JPT1QiLCAiRE9DVU1FTlRfRlJBR01FTlQiKToKICAgICAgICAgICAgICAgIHJldHVybiAoYmFzZS5ET0NVTUVOVCwpCgogICAgICAgICAgICBlbGlmIG5vZGUudGFnID09ICI8IURPQ1RZUEU+IjoKICAgICAgICAgICAgICAgIHJldHVybiAoYmFzZS5ET0NUWVBFLCBub2RlLnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0KCJwdWJsaWNJZCIpLCBub2RlLmdldCgic3lzdGVtSWQiKSkKCiAgICAgICAgICAgIGVsaWYgbm9kZS50YWcgPT0gRWxlbWVudFRyZWVDb21tZW50VHlwZToKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLkNPTU1FTlQsIG5vZGUudGV4dAoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5vZGUudGFnLCBzdHJpbmdfdHlwZXMpLCB0eXBlKG5vZGUudGFnKQogICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gb3JkaW5hcnkgZWxlbWVudAogICAgICAgICAgICAgICAgbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKG5vZGUudGFnKQogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLCB0YWcgPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgdGFnID0gbm9kZS50YWcKICAgICAgICAgICAgICAgIGF0dHJzID0gT3JkZXJlZERpY3QoKQogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGxpc3Qobm9kZS5hdHRyaWIuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzWyhtYXRjaC5ncm91cCgxKSwgbWF0Y2guZ3JvdXAoMikpXSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbKE5vbmUsIG5hbWUpXSA9IHZhbHVlCiAgICAgICAgICAgICAgICByZXR1cm4gKGJhc2UuRUxFTUVOVCwgbmFtZXNwYWNlLCB0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLCBsZW4obm9kZSkgb3Igbm9kZS50ZXh0KQoKICAgICAgICBkZWYgZ2V0Rmlyc3RDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICBlbGVtZW50LCBrZXksIHBhcmVudHMsIGZsYWcgPSBub2RlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBlbGVtZW50LCBrZXksIHBhcmVudHMsIGZsYWcgPSBub2RlLCBOb25lLCBbXSwgTm9uZQoKICAgICAgICAgICAgaWYgZmxhZyBpbiAoInRleHQiLCAidGFpbCIpOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudCwga2V5LCBwYXJlbnRzLCAidGV4dCIKICAgICAgICAgICAgICAgIGVsaWYgbGVuKGVsZW1lbnQpOgogICAgICAgICAgICAgICAgICAgIHBhcmVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRbMF0sIDAsIHBhcmVudHMsIE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZGVmIGdldE5leHRTaWJsaW5nKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKToKICAgICAgICAgICAgICAgIGVsZW1lbnQsIGtleSwgcGFyZW50cywgZmxhZyA9IG5vZGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICBpZiBmbGFnID09ICJ0ZXh0IjoKICAgICAgICAgICAgICAgIGlmIGxlbihlbGVtZW50KToKICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLmFwcGVuZChlbGVtZW50KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50WzBdLCAwLCBwYXJlbnRzLCBOb25lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRhaWwgYW5kIGZsYWcgIT0gInRhaWwiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LCBrZXksIHBhcmVudHMsICJ0YWlsIgogICAgICAgICAgICAgICAgZWxpZiBrZXkgPCBsZW4ocGFyZW50c1stMV0pIC0gMToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50c1stMV1ba2V5ICsgMV0sIGtleSArIDEsIHBhcmVudHMsIE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZGVmIGdldFBhcmVudE5vZGUoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgZWxlbWVudCwga2V5LCBwYXJlbnRzLCBmbGFnID0gbm9kZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGlmIGZsYWcgPT0gInRleHQiOgogICAgICAgICAgICAgICAgaWYgbm90IHBhcmVudHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQsIGtleSwgcGFyZW50cywgTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50cy5wb3AoKQogICAgICAgICAgICAgICAgaWYgbm90IHBhcmVudHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbGlzdChwYXJlbnRzWy0xXSkuY291bnQocGFyZW50KSA9PSAxCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudCwgbGlzdChwYXJlbnRzWy0xXSkuaW5kZXgocGFyZW50KSwgcGFyZW50cywgTm9uZQoKICAgIHJldHVybiBsb2NhbHMoKQoKZ2V0RVRyZWVNb2R1bGUgPSBtb2R1bGVGYWN0b3J5RmFjdG9yeShnZXRFVHJlZUJ1aWxkZXIpClBLAwQUAAAAAAAAACEAlg2cR6UYAAClGAAASwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWVfbHhtbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgpmcm9tIGx4bWwgaW1wb3J0IGV0cmVlCmZyb20gLi50cmVlYnVpbGRlcnMuZXRyZWUgaW1wb3J0IHRhZ19yZWdleHAKCmZyb20gLiBpbXBvcnQgYmFzZQoKZnJvbSAuLiBpbXBvcnQgX2loYXRleG1sCgoKZGVmIGVuc3VyZV9zdHIocyk6CiAgICBpZiBzIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGVsaWYgaXNpbnN0YW5jZShzLCB0ZXh0X3R5cGUpOgogICAgICAgIHJldHVybiBzCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzLmRlY29kZSgiYXNjaWkiLCAic3RyaWN0IikKCgpjbGFzcyBSb290KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZXQpOgogICAgICAgIHNlbGYuZWxlbWVudHRyZWUgPSBldAogICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGV0LmRvY2luZm8uaW50ZXJuYWxEVEQ6CiAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChEb2N0eXBlKHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZV9zdHIoZXQuZG9jaW5mby5yb290X25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVfc3RyKGV0LmRvY2luZm8ucHVibGljX2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlX3N0cihldC5kb2NpbmZvLnN5c3RlbV91cmwpKSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBub2RlID0gZXQuZ2V0cm9vdCgpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBub2RlID0gZXQKCiAgICAgICAgd2hpbGUgbm9kZS5nZXRwcmV2aW91cygpIGlzIG5vdCBOb25lOgogICAgICAgICAgICBub2RlID0gbm9kZS5nZXRwcmV2aW91cygpCiAgICAgICAgd2hpbGUgbm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQobm9kZSkKICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0bmV4dCgpCgogICAgICAgIHNlbGYudGV4dCA9IE5vbmUKICAgICAgICBzZWxmLnRhaWwgPSBOb25lCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY2hpbGRyZW5ba2V5XQoKICAgIGRlZiBnZXRuZXh0KHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIDEKCgpjbGFzcyBEb2N0eXBlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdF9ub2RlLCBuYW1lLCBwdWJsaWNfaWQsIHN5c3RlbV9pZCk6CiAgICAgICAgc2VsZi5yb290X25vZGUgPSByb290X25vZGUKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5wdWJsaWNfaWQgPSBwdWJsaWNfaWQKICAgICAgICBzZWxmLnN5c3RlbV9pZCA9IHN5c3RlbV9pZAoKICAgICAgICBzZWxmLnRleHQgPSBOb25lCiAgICAgICAgc2VsZi50YWlsID0gTm9uZQoKICAgIGRlZiBnZXRuZXh0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJvb3Rfbm9kZS5jaGlsZHJlblsxXQoKCmNsYXNzIEZyYWdtZW50Um9vdChSb290KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjaGlsZHJlbik6CiAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtGcmFnbWVudFdyYXBwZXIoc2VsZiwgY2hpbGQpIGZvciBjaGlsZCBpbiBjaGlsZHJlbl0KICAgICAgICBzZWxmLnRleHQgPSBzZWxmLnRhaWwgPSBOb25lCgogICAgZGVmIGdldG5leHQoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCgpjbGFzcyBGcmFnbWVudFdyYXBwZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcmFnbWVudF9yb290LCBvYmopOgogICAgICAgIHNlbGYucm9vdF9ub2RlID0gZnJhZ21lbnRfcm9vdAogICAgICAgIHNlbGYub2JqID0gb2JqCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLm9iaiwgJ3RleHQnKToKICAgICAgICAgICAgc2VsZi50ZXh0ID0gZW5zdXJlX3N0cihzZWxmLm9iai50ZXh0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudGV4dCA9IE5vbmUKICAgICAgICBpZiBoYXNhdHRyKHNlbGYub2JqLCAndGFpbCcpOgogICAgICAgICAgICBzZWxmLnRhaWwgPSBlbnN1cmVfc3RyKHNlbGYub2JqLnRhaWwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50YWlsID0gTm9uZQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLm9iaiwgbmFtZSkKCiAgICBkZWYgZ2V0bmV4dChzZWxmKToKICAgICAgICBzaWJsaW5ncyA9IHNlbGYucm9vdF9ub2RlLmNoaWxkcmVuCiAgICAgICAgaWR4ID0gc2libGluZ3MuaW5kZXgoc2VsZikKICAgICAgICBpZiBpZHggPCBsZW4oc2libGluZ3MpIC0gMToKICAgICAgICAgICAgcmV0dXJuIHNpYmxpbmdzW2lkeCArIDFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5vYmpba2V5XQoKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLm9iaikKCiAgICBkZWYgZ2V0cGFyZW50KHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmLm9iaikKCiAgICBkZWYgX191bmljb2RlX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmLm9iaikKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYub2JqKQoKCmNsYXNzIFRyZWVXYWxrZXIoYmFzZS5Ob25SZWN1cnNpdmVUcmVlV2Fsa2VyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmVlKToKICAgICAgICAjIHB5bGludDpkaXNhYmxlPXJlZGVmaW5lZC12YXJpYWJsZS10eXBlCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0cmVlLCBsaXN0KToKICAgICAgICAgICAgc2VsZi5mcmFnbWVudENoaWxkcmVuID0gc2V0KHRyZWUpCiAgICAgICAgICAgIHRyZWUgPSBGcmFnbWVudFJvb3QodHJlZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmZyYWdtZW50Q2hpbGRyZW4gPSBzZXQoKQogICAgICAgICAgICB0cmVlID0gUm9vdCh0cmVlKQogICAgICAgIGJhc2UuTm9uUmVjdXJzaXZlVHJlZVdhbGtlci5fX2luaXRfXyhzZWxmLCB0cmVlKQogICAgICAgIHNlbGYuZmlsdGVyID0gX2loYXRleG1sLkluZm9zZXRGaWx0ZXIoKQoKICAgIGRlZiBnZXROb2RlRGV0YWlscyhzZWxmLCBub2RlKToKICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKTogICMgVGV4dCBub2RlCiAgICAgICAgICAgIG5vZGUsIGtleSA9IG5vZGUKICAgICAgICAgICAgYXNzZXJ0IGtleSBpbiAoInRleHQiLCAidGFpbCIpLCAiVGV4dCBub2RlcyBhcmUgdGV4dCBvciB0YWlsLCBmb3VuZCAlcyIgJSBrZXkKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVEVYVCwgZW5zdXJlX3N0cihnZXRhdHRyKG5vZGUsIGtleSkpCgogICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBSb290KToKICAgICAgICAgICAgcmV0dXJuIChiYXNlLkRPQ1VNRU5ULCkKCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIERvY3R5cGUpOgogICAgICAgICAgICByZXR1cm4gYmFzZS5ET0NUWVBFLCBub2RlLm5hbWUsIG5vZGUucHVibGljX2lkLCBub2RlLnN5c3RlbV9pZAoKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgRnJhZ21lbnRXcmFwcGVyKSBhbmQgbm90IGhhc2F0dHIobm9kZSwgInRhZyIpOgogICAgICAgICAgICByZXR1cm4gYmFzZS5URVhULCBlbnN1cmVfc3RyKG5vZGUub2JqKQoKICAgICAgICBlbGlmIG5vZGUudGFnID09IGV0cmVlLkNvbW1lbnQ6CiAgICAgICAgICAgIHJldHVybiBiYXNlLkNPTU1FTlQsIGVuc3VyZV9zdHIobm9kZS50ZXh0KQoKICAgICAgICBlbGlmIG5vZGUudGFnID09IGV0cmVlLkVudGl0eToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuRU5USVRZLCBlbnN1cmVfc3RyKG5vZGUudGV4dClbMTotMV0gICMgc3RyaXAgJjsKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gb3JkaW5hcnkgZWxlbWVudAogICAgICAgICAgICBtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2goZW5zdXJlX3N0cihub2RlLnRhZykpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlLCB0YWcgPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gTm9uZQogICAgICAgICAgICAgICAgdGFnID0gZW5zdXJlX3N0cihub2RlLnRhZykKICAgICAgICAgICAgYXR0cnMgPSB7fQogICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gbGlzdChub2RlLmF0dHJpYi5pdGVtcygpKToKICAgICAgICAgICAgICAgIG5hbWUgPSBlbnN1cmVfc3RyKG5hbWUpCiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVuc3VyZV9zdHIodmFsdWUpCiAgICAgICAgICAgICAgICBtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2gobmFtZSkKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIGF0dHJzWyhtYXRjaC5ncm91cCgxKSwgbWF0Y2guZ3JvdXAoMikpXSA9IHZhbHVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGF0dHJzWyhOb25lLCBuYW1lKV0gPSB2YWx1ZQogICAgICAgICAgICByZXR1cm4gKGJhc2UuRUxFTUVOVCwgbmFtZXNwYWNlLCBzZWxmLmZpbHRlci5mcm9tWG1sTmFtZSh0YWcpLAogICAgICAgICAgICAgICAgICAgIGF0dHJzLCBsZW4obm9kZSkgPiAwIG9yIG5vZGUudGV4dCkKCiAgICBkZWYgZ2V0Rmlyc3RDaGlsZChzZWxmLCBub2RlKToKICAgICAgICBhc3NlcnQgbm90IGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpLCAiVGV4dCBub2RlcyBoYXZlIG5vIGNoaWxkcmVuIgoKICAgICAgICBhc3NlcnQgbGVuKG5vZGUpIG9yIG5vZGUudGV4dCwgIk5vZGUgaGFzIG5vIGNoaWxkcmVuIgogICAgICAgIGlmIG5vZGUudGV4dDoKICAgICAgICAgICAgcmV0dXJuIChub2RlLCAidGV4dCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIG5vZGVbMF0KCiAgICBkZWYgZ2V0TmV4dFNpYmxpbmcoc2VsZiwgbm9kZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6ICAjIFRleHQgbm9kZQogICAgICAgICAgICBub2RlLCBrZXkgPSBub2RlCiAgICAgICAgICAgIGFzc2VydCBrZXkgaW4gKCJ0ZXh0IiwgInRhaWwiKSwgIlRleHQgbm9kZXMgYXJlIHRleHQgb3IgdGFpbCwgZm91bmQgJXMiICUga2V5CiAgICAgICAgICAgIGlmIGtleSA9PSAidGV4dCI6CiAgICAgICAgICAgICAgICAjIFhYWDogd2UgY2Fubm90IHVzZSBhICJib29sKG5vZGUpIGFuZCBub2RlWzBdIG9yIE5vbmUiIGNvbnN0cnVjdCBoZXJlCiAgICAgICAgICAgICAgICAjIGJlY2F1c2Ugbm9kZVswXSBtaWdodCBldmFsdWF0ZSB0byBGYWxzZSBpZiBpdCBoYXMgbm8gY2hpbGQgZWxlbWVudAogICAgICAgICAgICAgICAgaWYgbGVuKG5vZGUpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlWzBdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6ICAjIHRhaWwKICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmdldG5leHQoKQoKICAgICAgICByZXR1cm4gKG5vZGUsICJ0YWlsIikgaWYgbm9kZS50YWlsIGVsc2Ugbm9kZS5nZXRuZXh0KCkKCiAgICBkZWYgZ2V0UGFyZW50Tm9kZShzZWxmLCBub2RlKToKICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKTogICMgVGV4dCBub2RlCiAgICAgICAgICAgIG5vZGUsIGtleSA9IG5vZGUKICAgICAgICAgICAgYXNzZXJ0IGtleSBpbiAoInRleHQiLCAidGFpbCIpLCAiVGV4dCBub2RlcyBhcmUgdGV4dCBvciB0YWlsLCBmb3VuZCAlcyIgJSBrZXkKICAgICAgICAgICAgaWYga2V5ID09ICJ0ZXh0IjoKICAgICAgICAgICAgICAgIHJldHVybiBub2RlCiAgICAgICAgICAgICMgZWxzZTogZmFsbGJhY2sgdG8gIm5vcm1hbCIgcHJvY2Vzc2luZwogICAgICAgIGVsaWYgbm9kZSBpbiBzZWxmLmZyYWdtZW50Q2hpbGRyZW46CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHJldHVybiBub2RlLmdldHBhcmVudCgpClBLAwQUAAAAAAAAACEAE19tEAUJAAAFCQAARwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZ2Vuc2hpLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIGdlbnNoaS5jb3JlIGltcG9ydCBRTmFtZQpmcm9tIGdlbnNoaS5jb3JlIGltcG9ydCBTVEFSVCwgRU5ELCBYTUxfTkFNRVNQQUNFLCBET0NUWVBFLCBURVhUCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFNUQVJUX05TLCBFTkRfTlMsIFNUQVJUX0NEQVRBLCBFTkRfQ0RBVEEsIFBJLCBDT01NRU5UCgpmcm9tIC4gaW1wb3J0IGJhc2UKCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IHZvaWRFbGVtZW50cywgbmFtZXNwYWNlcwoKCmNsYXNzIFRyZWVXYWxrZXIoYmFzZS5UcmVlV2Fsa2VyKToKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAjIEJ1ZmZlciB0aGUgZXZlbnRzIHNvIHdlIGNhbiBwYXNzIGluIHRoZSBmb2xsb3dpbmcgb25lCiAgICAgICAgcHJldmlvdXMgPSBOb25lCiAgICAgICAgZm9yIGV2ZW50IGluIHNlbGYudHJlZToKICAgICAgICAgICAgaWYgcHJldmlvdXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi50b2tlbnMocHJldmlvdXMsIGV2ZW50KToKICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgICAgICAgICBwcmV2aW91cyA9IGV2ZW50CgogICAgICAgICMgRG9uJ3QgZm9yZ2V0IHRoZSBmaW5hbCBldmVudCEKICAgICAgICBpZiBwcmV2aW91cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYudG9rZW5zKHByZXZpb3VzLCBOb25lKToKICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCgogICAgZGVmIHRva2VucyhzZWxmLCBldmVudCwgbmV4dCk6CiAgICAgICAga2luZCwgZGF0YSwgXyA9IGV2ZW50CiAgICAgICAgaWYga2luZCA9PSBTVEFSVDoKICAgICAgICAgICAgdGFnLCBhdHRyaWJzID0gZGF0YQogICAgICAgICAgICBuYW1lID0gdGFnLmxvY2FsbmFtZQogICAgICAgICAgICBuYW1lc3BhY2UgPSB0YWcubmFtZXNwYWNlCiAgICAgICAgICAgIGNvbnZlcnRlZF9hdHRyaWJzID0ge30KICAgICAgICAgICAgZm9yIGssIHYgaW4gYXR0cmliczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaywgUU5hbWUpOgogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZF9hdHRyaWJzWyhrLm5hbWVzcGFjZSwgay5sb2NhbG5hbWUpXSA9IHYKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkX2F0dHJpYnNbKE5vbmUsIGspXSA9IHYKCiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJodG1sIl0gYW5kIG5hbWUgaW4gdm9pZEVsZW1lbnRzOgogICAgICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYuZW1wdHlUYWcobmFtZXNwYWNlLCBuYW1lLCBjb252ZXJ0ZWRfYXR0cmlicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBuZXh0IG9yIG5leHRbMF0gIT0gRU5EIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0WzFdICE9IHRhZyk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuc3RhcnRUYWcobmFtZXNwYWNlLCBuYW1lLCBjb252ZXJ0ZWRfYXR0cmlicykKCiAgICAgICAgZWxpZiBraW5kID09IEVORDoKICAgICAgICAgICAgbmFtZSA9IGRhdGEubG9jYWxuYW1lCiAgICAgICAgICAgIG5hbWVzcGFjZSA9IGRhdGEubmFtZXNwYWNlCiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSAhPSBuYW1lc3BhY2VzWyJodG1sIl0gb3IgbmFtZSBub3QgaW4gdm9pZEVsZW1lbnRzOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmRUYWcobmFtZXNwYWNlLCBuYW1lKQoKICAgICAgICBlbGlmIGtpbmQgPT0gQ09NTUVOVDoKICAgICAgICAgICAgeWllbGQgc2VsZi5jb21tZW50KGRhdGEpCgogICAgICAgIGVsaWYga2luZCA9PSBURVhUOgogICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi50ZXh0KGRhdGEpOgogICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KCiAgICAgICAgZWxpZiBraW5kID09IERPQ1RZUEU6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuZG9jdHlwZSgqZGF0YSkKCiAgICAgICAgZWxpZiBraW5kIGluIChYTUxfTkFNRVNQQUNFLCBET0NUWVBFLCBTVEFSVF9OUywgRU5EX05TLAogICAgICAgICAgICAgICAgICAgICAgU1RBUlRfQ0RBVEEsIEVORF9DREFUQSwgUEkpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkIHNlbGYudW5rbm93bihraW5kKQpQSwMEFAAAAAAAAAAhAABHXJs6AAAAOgAAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvX19pbml0X18ucHlmcm9tIC5wYWNrYWdlX2RhdGEgaW1wb3J0IF9fdmVyc2lvbl9fCmZyb20gLmNvcmUgaW1wb3J0ICoKUEsDBBQAAAAAAAAAIQDzSNTp4wwAAOMMAAA2AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvZGVjLnB5ZnJvbSAuY29yZSBpbXBvcnQgZW5jb2RlLCBkZWNvZGUsIGFsYWJlbCwgdWxhYmVsLCBJRE5BRXJyb3IKaW1wb3J0IGNvZGVjcwppbXBvcnQgcmUKCl91bmljb2RlX2RvdHNfcmUgPSByZS5jb21waWxlKHUnW1x1MDAyZVx1MzAwMlx1ZmYwZVx1ZmY2MV0nKQoKY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKCiAgICBkZWYgZW5jb2RlKHNlbGYsIGRhdGEsIGVycm9ycz0nc3RyaWN0Jyk6CgogICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyBcInswfVwiIi5mb3JtYXQoZXJyb3JzKSkKCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiAiIiwgMAoKICAgICAgICByZXR1cm4gZW5jb2RlKGRhdGEpLCBsZW4oZGF0YSkKCiAgICBkZWYgZGVjb2RlKHNlbGYsIGRhdGEsIGVycm9ycz0nc3RyaWN0Jyk6CgogICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyBcInswfVwiIi5mb3JtYXQoZXJyb3JzKSkKCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiB1IiIsIDAKCiAgICAgICAgcmV0dXJuIGRlY29kZShkYXRhKSwgbGVuKGRhdGEpCgpjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxFbmNvZGVyKToKICAgIGRlZiBfYnVmZmVyX2VuY29kZShzZWxmLCBkYXRhLCBlcnJvcnMsIGZpbmFsKToKICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CiAgICAgICAgICAgIHJhaXNlIElETkFFcnJvcigiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgXCJ7MH1cIiIuZm9ybWF0KGVycm9ycykpCgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gKCIiLCAwKQoKICAgICAgICBsYWJlbHMgPSBfdW5pY29kZV9kb3RzX3JlLnNwbGl0KGRhdGEpCiAgICAgICAgdHJhaWxpbmdfZG90ID0gdScnCiAgICAgICAgaWYgbGFiZWxzOgogICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9ICcuJwogICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICAgICAgZWxpZiBub3QgZmluYWw6CiAgICAgICAgICAgICAgICAjIEtlZXAgcG90ZW50aWFsbHkgdW5maW5pc2hlZCBsYWJlbCB1bnRpbCB0aGUgbmV4dCBjYWxsCiAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgICAgICAgICAgaWYgbGFiZWxzOgogICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9ICcuJwoKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHNpemUgPSAwCiAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChhbGFiZWwobGFiZWwpKQogICAgICAgICAgICBpZiBzaXplOgogICAgICAgICAgICAgICAgc2l6ZSArPSAxCiAgICAgICAgICAgIHNpemUgKz0gbGVuKGxhYmVsKQoKICAgICAgICAjIEpvaW4gd2l0aCBVKzAwMkUKICAgICAgICByZXN1bHQgPSAiLiIuam9pbihyZXN1bHQpICsgdHJhaWxpbmdfZG90CiAgICAgICAgc2l6ZSArPSBsZW4odHJhaWxpbmdfZG90KQogICAgICAgIHJldHVybiAocmVzdWx0LCBzaXplKQoKY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CiAgICBkZWYgX2J1ZmZlcl9kZWNvZGUoc2VsZiwgZGF0YSwgZXJyb3JzLCBmaW5hbCk6CiAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nIFwiezB9XCIiLmZvcm1hdChlcnJvcnMpKQoKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuICh1IiIsIDApCgogICAgICAgICMgSUROQSBhbGxvd3MgZGVjb2RpbmcgdG8gb3BlcmF0ZSBvbiBVbmljb2RlIHN0cmluZ3MsIHRvby4KICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpOgogICAgICAgICAgICBsYWJlbHMgPSBfdW5pY29kZV9kb3RzX3JlLnNwbGl0KGRhdGEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBNdXN0IGJlIEFTQ0lJIHN0cmluZwogICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpCiAgICAgICAgICAgIHVuaWNvZGUoZGF0YSwgImFzY2lpIikKICAgICAgICAgICAgbGFiZWxzID0gZGF0YS5zcGxpdCgiLiIpCgogICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJwogICAgICAgIGlmIGxhYmVsczoKICAgICAgICAgICAgaWYgbm90IGxhYmVsc1stMV06CiAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSB1Jy4nCiAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgICAgICBlbGlmIG5vdCBmaW5hbDoKICAgICAgICAgICAgICAgICMgS2VlcCBwb3RlbnRpYWxseSB1bmZpbmlzaGVkIGxhYmVsIHVudGlsIHRoZSBuZXh0IGNhbGwKICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCiAgICAgICAgICAgICAgICBpZiBsYWJlbHM6CiAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gdScuJwoKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHNpemUgPSAwCiAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh1bGFiZWwobGFiZWwpKQogICAgICAgICAgICBpZiBzaXplOgogICAgICAgICAgICAgICAgc2l6ZSArPSAxCiAgICAgICAgICAgIHNpemUgKz0gbGVuKGxhYmVsKQoKICAgICAgICByZXN1bHQgPSB1Ii4iLmpvaW4ocmVzdWx0KSArIHRyYWlsaW5nX2RvdAogICAgICAgIHNpemUgKz0gbGVuKHRyYWlsaW5nX2RvdCkKICAgICAgICByZXR1cm4gKHJlc3VsdCwgc2l6ZSkKCgpjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgogICAgcGFzcwoKY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKICAgIHBhc3MKCmRlZiBnZXRyZWdlbnRyeSgpOgogICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCiAgICAgICAgbmFtZT0naWRuYScsCiAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAogICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAogICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCiAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAogICAgKQpQSwMEFAAAAAAAAAAhAHyBlnDoAAAA6AAAADcAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvY29tcGF0LnB5ZnJvbSAuY29yZSBpbXBvcnQgKgpmcm9tIC5jb2RlYyBpbXBvcnQgKgoKZGVmIFRvQVNDSUkobGFiZWwpOgogICAgcmV0dXJuIGVuY29kZShsYWJlbCkKCmRlZiBUb1VuaWNvZGUobGFiZWwpOgogICAgcmV0dXJuIGRlY29kZShsYWJlbCkKCmRlZiBuYW1lcHJlcChzKToKICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIklETkEgMjAwOCBkb2VzIG5vdCB1dGlsaXNlIG5hbWVwcmVwIHByb3RvY29sIikKClBLAwQUAAAAAAAAACEACS76cX4sAAB+LAAANQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb3JlLnB5ZnJvbSAuIGltcG9ydCBpZG5hZGF0YQppbXBvcnQgYmlzZWN0CmltcG9ydCB1bmljb2RlZGF0YQppbXBvcnQgcmUKaW1wb3J0IHN5cwpmcm9tIC5pbnRyYW5nZXMgaW1wb3J0IGludHJhbmdlc19jb250YWluCgpfdmlyYW1hX2NvbWJpbmluZ19jbGFzcyA9IDkKX2FsYWJlbF9wcmVmaXggPSBiJ3huLS0nCl91bmljb2RlX2RvdHNfcmUgPSByZS5jb21waWxlKHUnW1x1MDAyZVx1MzAwMlx1ZmYwZVx1ZmY2MV0nKQoKaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAzOgogICAgdW5pY29kZSA9IHN0cgogICAgdW5pY2hyID0gY2hyCgpjbGFzcyBJRE5BRXJyb3IoVW5pY29kZUVycm9yKToKICAgICIiIiBCYXNlIGV4Y2VwdGlvbiBmb3IgYWxsIElETkEtZW5jb2RpbmcgcmVsYXRlZCBwcm9ibGVtcyAiIiIKICAgIHBhc3MKCgpjbGFzcyBJRE5BQmlkaUVycm9yKElETkFFcnJvcik6CiAgICAiIiIgRXhjZXB0aW9uIHdoZW4gYmlkaXJlY3Rpb25hbCByZXF1aXJlbWVudHMgYXJlIG5vdCBzYXRpc2ZpZWQgIiIiCiAgICBwYXNzCgoKY2xhc3MgSW52YWxpZENvZGVwb2ludChJRE5BRXJyb3IpOgogICAgIiIiIEV4Y2VwdGlvbiB3aGVuIGEgZGlzYWxsb3dlZCBvciB1bmFsbG9jYXRlZCBjb2RlcG9pbnQgaXMgdXNlZCAiIiIKICAgIHBhc3MKCgpjbGFzcyBJbnZhbGlkQ29kZXBvaW50Q29udGV4dChJRE5BRXJyb3IpOgogICAgIiIiIEV4Y2VwdGlvbiB3aGVuIHRoZSBjb2RlcG9pbnQgaXMgbm90IHZhbGlkIGluIHRoZSBjb250ZXh0IGl0IGlzIHVzZWQgIiIiCiAgICBwYXNzCgoKZGVmIF9jb21iaW5pbmdfY2xhc3MoY3ApOgogICAgcmV0dXJuIHVuaWNvZGVkYXRhLmNvbWJpbmluZyh1bmljaHIoY3ApKQoKZGVmIF9pc19zY3JpcHQoY3AsIHNjcmlwdCk6CiAgICByZXR1cm4gaW50cmFuZ2VzX2NvbnRhaW4ob3JkKGNwKSwgaWRuYWRhdGEuc2NyaXB0c1tzY3JpcHRdKQoKZGVmIF9wdW55Y29kZShzKToKICAgIHJldHVybiBzLmVuY29kZSgncHVueWNvZGUnKQoKZGVmIF91bm90KHMpOgogICAgcmV0dXJuICdVK3swOjA0WH0nLmZvcm1hdChzKQoKCmRlZiB2YWxpZF9sYWJlbF9sZW5ndGgobGFiZWwpOgoKICAgIGlmIGxlbihsYWJlbCkgPiA2MzoKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKZGVmIHZhbGlkX3N0cmluZ19sZW5ndGgobGFiZWwsIHRyYWlsaW5nX2RvdCk6CgogICAgaWYgbGVuKGxhYmVsKSA+ICgyNTQgaWYgdHJhaWxpbmdfZG90IGVsc2UgMjUzKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKZGVmIGNoZWNrX2JpZGkobGFiZWwsIGNoZWNrX2x0cj1GYWxzZSk6CgogICAgIyBCaWRpIHJ1bGVzIHNob3VsZCBvbmx5IGJlIGFwcGxpZWQgaWYgc3RyaW5nIGNvbnRhaW5zIFJUTCBjaGFyYWN0ZXJzCiAgICBiaWRpX2xhYmVsID0gRmFsc2UKICAgIGZvciAoaWR4LCBjcCkgaW4gZW51bWVyYXRlKGxhYmVsLCAxKToKICAgICAgICBkaXJlY3Rpb24gPSB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKGNwKQogICAgICAgIGlmIGRpcmVjdGlvbiA9PSAnJzoKICAgICAgICAgICAgIyBTdHJpbmcgbGlrZWx5IGNvbWVzIGZyb20gYSBuZXdlciB2ZXJzaW9uIG9mIFVuaWNvZGUKICAgICAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignVW5rbm93biBkaXJlY3Rpb25hbGl0eSBpbiBsYWJlbCB7MH0gYXQgcG9zaXRpb24gezF9Jy5mb3JtYXQocmVwcihsYWJlbCksIGlkeCkpCiAgICAgICAgaWYgZGlyZWN0aW9uIGluIFsnUicsICdBTCcsICdBTiddOgogICAgICAgICAgICBiaWRpX2xhYmVsID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgbm90IGJpZGlfbGFiZWwgYW5kIG5vdCBjaGVja19sdHI6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIEJpZGkgcnVsZSAxCiAgICBkaXJlY3Rpb24gPSB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKGxhYmVsWzBdKQogICAgaWYgZGlyZWN0aW9uIGluIFsnUicsICdBTCddOgogICAgICAgIHJ0bCA9IFRydWUKICAgIGVsaWYgZGlyZWN0aW9uID09ICdMJzoKICAgICAgICBydGwgPSBGYWxzZQogICAgZWxzZToKICAgICAgICByYWlzZSBJRE5BQmlkaUVycm9yKCdGaXJzdCBjb2RlcG9pbnQgaW4gbGFiZWwgezB9IG11c3QgYmUgZGlyZWN0aW9uYWxpdHkgTCwgUiBvciBBTCcuZm9ybWF0KHJlcHIobGFiZWwpKSkKCiAgICB2YWxpZF9lbmRpbmcgPSBGYWxzZQogICAgbnVtYmVyX3R5cGUgPSBGYWxzZQogICAgZm9yIChpZHgsIGNwKSBpbiBlbnVtZXJhdGUobGFiZWwsIDEpOgogICAgICAgIGRpcmVjdGlvbiA9IHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwoY3ApCgogICAgICAgIGlmIHJ0bDoKICAgICAgICAgICAgIyBCaWRpIHJ1bGUgMgogICAgICAgICAgICBpZiBub3QgZGlyZWN0aW9uIGluIFsnUicsICdBTCcsICdBTicsICdFTicsICdFUycsICdDUycsICdFVCcsICdPTicsICdCTicsICdOU00nXToKICAgICAgICAgICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ0ludmFsaWQgZGlyZWN0aW9uIGZvciBjb2RlcG9pbnQgYXQgcG9zaXRpb24gezB9IGluIGEgcmlnaHQtdG8tbGVmdCBsYWJlbCcuZm9ybWF0KGlkeCkpCiAgICAgICAgICAgICMgQmlkaSBydWxlIDMKICAgICAgICAgICAgaWYgZGlyZWN0aW9uIGluIFsnUicsICdBTCcsICdFTicsICdBTiddOgogICAgICAgICAgICAgICAgdmFsaWRfZW5kaW5nID0gVHJ1ZQogICAgICAgICAgICBlbGlmIGRpcmVjdGlvbiAhPSAnTlNNJzoKICAgICAgICAgICAgICAgIHZhbGlkX2VuZGluZyA9IEZhbHNlCiAgICAgICAgICAgICMgQmlkaSBydWxlIDQKICAgICAgICAgICAgaWYgZGlyZWN0aW9uIGluIFsnQU4nLCAnRU4nXToKICAgICAgICAgICAgICAgIGlmIG5vdCBudW1iZXJfdHlwZToKICAgICAgICAgICAgICAgICAgICBudW1iZXJfdHlwZSA9IGRpcmVjdGlvbgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBudW1iZXJfdHlwZSAhPSBkaXJlY3Rpb246CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ0NhbiBub3QgbWl4IG51bWVyYWwgdHlwZXMgaW4gYSByaWdodC10by1sZWZ0IGxhYmVsJykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEJpZGkgcnVsZSA1CiAgICAgICAgICAgIGlmIG5vdCBkaXJlY3Rpb24gaW4gWydMJywgJ0VOJywgJ0VTJywgJ0NTJywgJ0VUJywgJ09OJywgJ0JOJywgJ05TTSddOgogICAgICAgICAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignSW52YWxpZCBkaXJlY3Rpb24gZm9yIGNvZGVwb2ludCBhdCBwb3NpdGlvbiB7MH0gaW4gYSBsZWZ0LXRvLXJpZ2h0IGxhYmVsJy5mb3JtYXQoaWR4KSkKICAgICAgICAgICAgIyBCaWRpIHJ1bGUgNgogICAgICAgICAgICBpZiBkaXJlY3Rpb24gaW4gWydMJywgJ0VOJ106CiAgICAgICAgICAgICAgICB2YWxpZF9lbmRpbmcgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgZGlyZWN0aW9uICE9ICdOU00nOgogICAgICAgICAgICAgICAgdmFsaWRfZW5kaW5nID0gRmFsc2UKCiAgICBpZiBub3QgdmFsaWRfZW5kaW5nOgogICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ0xhYmVsIGVuZHMgd2l0aCBpbGxlZ2FsIGNvZGVwb2ludCBkaXJlY3Rpb25hbGl0eScpCgogICAgcmV0dXJuIFRydWUKCgpkZWYgY2hlY2tfaW5pdGlhbF9jb21iaW5lcihsYWJlbCk6CgogICAgaWYgdW5pY29kZWRhdGEuY2F0ZWdvcnkobGFiZWxbMF0pWzBdID09ICdNJzoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIGJlZ2lucyB3aXRoIGFuIGlsbGVnYWwgY29tYmluaW5nIGNoYXJhY3RlcicpCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBjaGVja19oeXBoZW5fb2sobGFiZWwpOgoKICAgIGlmIGxhYmVsWzI6NF0gPT0gJy0tJzoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIGhhcyBkaXNhbGxvd2VkIGh5cGhlbnMgaW4gM3JkIGFuZCA0dGggcG9zaXRpb24nKQogICAgaWYgbGFiZWxbMF0gPT0gJy0nIG9yIGxhYmVsWy0xXSA9PSAnLSc6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdMYWJlbCBtdXN0IG5vdCBzdGFydCBvciBlbmQgd2l0aCBhIGh5cGhlbicpCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBjaGVja19uZmMobGFiZWwpOgoKICAgIGlmIHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgnTkZDJywgbGFiZWwpICE9IGxhYmVsOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgbXVzdCBiZSBpbiBOb3JtYWxpemF0aW9uIEZvcm0gQycpCgoKZGVmIHZhbGlkX2NvbnRleHRqKGxhYmVsLCBwb3MpOgoKICAgIGNwX3ZhbHVlID0gb3JkKGxhYmVsW3Bvc10pCgogICAgaWYgY3BfdmFsdWUgPT0gMHgyMDBjOgoKICAgICAgICBpZiBwb3MgPiAwOgogICAgICAgICAgICBpZiBfY29tYmluaW5nX2NsYXNzKG9yZChsYWJlbFtwb3MgLSAxXSkpID09IF92aXJhbWFfY29tYmluaW5nX2NsYXNzOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgb2sgPSBGYWxzZQogICAgICAgIGZvciBpIGluIHJhbmdlKHBvcy0xLCAtMSwgLTEpOgogICAgICAgICAgICBqb2luaW5nX3R5cGUgPSBpZG5hZGF0YS5qb2luaW5nX3R5cGVzLmdldChvcmQobGFiZWxbaV0pKQogICAgICAgICAgICBpZiBqb2luaW5nX3R5cGUgPT0gb3JkKCdUJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBqb2luaW5nX3R5cGUgaW4gW29yZCgnTCcpLCBvcmQoJ0QnKV06CiAgICAgICAgICAgICAgICBvayA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIG5vdCBvazoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIG9rID0gRmFsc2UKICAgICAgICBmb3IgaSBpbiByYW5nZShwb3MrMSwgbGVuKGxhYmVsKSk6CiAgICAgICAgICAgIGpvaW5pbmdfdHlwZSA9IGlkbmFkYXRhLmpvaW5pbmdfdHlwZXMuZ2V0KG9yZChsYWJlbFtpXSkpCiAgICAgICAgICAgIGlmIGpvaW5pbmdfdHlwZSA9PSBvcmQoJ1QnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGpvaW5pbmdfdHlwZSBpbiBbb3JkKCdSJyksIG9yZCgnRCcpXToKICAgICAgICAgICAgICAgIG9rID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gb2sKCiAgICBpZiBjcF92YWx1ZSA9PSAweDIwMGQ6CgogICAgICAgIGlmIHBvcyA+IDA6CiAgICAgICAgICAgIGlmIF9jb21iaW5pbmdfY2xhc3Mob3JkKGxhYmVsW3BvcyAtIDFdKSkgPT0gX3ZpcmFtYV9jb21iaW5pbmdfY2xhc3M6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGVsc2U6CgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiB2YWxpZF9jb250ZXh0byhsYWJlbCwgcG9zLCBleGNlcHRpb249RmFsc2UpOgoKICAgIGNwX3ZhbHVlID0gb3JkKGxhYmVsW3Bvc10pCgogICAgaWYgY3BfdmFsdWUgPT0gMHgwMGI3OgogICAgICAgIGlmIDAgPCBwb3MgPCBsZW4obGFiZWwpLTE6CiAgICAgICAgICAgIGlmIG9yZChsYWJlbFtwb3MgLSAxXSkgPT0gMHgwMDZjIGFuZCBvcmQobGFiZWxbcG9zICsgMV0pID09IDB4MDA2YzoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZWxpZiBjcF92YWx1ZSA9PSAweDAzNzU6CiAgICAgICAgaWYgcG9zIDwgbGVuKGxhYmVsKS0xIGFuZCBsZW4obGFiZWwpID4gMToKICAgICAgICAgICAgcmV0dXJuIF9pc19zY3JpcHQobGFiZWxbcG9zICsgMV0sICdHcmVlaycpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZWxpZiBjcF92YWx1ZSA9PSAweDA1ZjMgb3IgY3BfdmFsdWUgPT0gMHgwNWY0OgogICAgICAgIGlmIHBvcyA+IDA6CiAgICAgICAgICAgIHJldHVybiBfaXNfc2NyaXB0KGxhYmVsW3BvcyAtIDFdLCAnSGVicmV3JykKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBlbGlmIGNwX3ZhbHVlID09IDB4MzBmYjoKICAgICAgICBmb3IgY3AgaW4gbGFiZWw6CiAgICAgICAgICAgIGlmIGNwID09IHUnXHUzMGZiJzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIF9pc19zY3JpcHQoY3AsICdIaXJhZ2FuYScpIG9yIF9pc19zY3JpcHQoY3AsICdLYXRha2FuYScpIG9yIF9pc19zY3JpcHQoY3AsICdIYW4nKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZWxpZiAweDY2MCA8PSBjcF92YWx1ZSA8PSAweDY2OToKICAgICAgICBmb3IgY3AgaW4gbGFiZWw6CiAgICAgICAgICAgIGlmIDB4NmYwIDw9IG9yZChjcCkgPD0gMHgwNmY5OgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBlbGlmIDB4NmYwIDw9IGNwX3ZhbHVlIDw9IDB4NmY5OgogICAgICAgIGZvciBjcCBpbiBsYWJlbDoKICAgICAgICAgICAgaWYgMHg2NjAgPD0gb3JkKGNwKSA8PSAweDA2Njk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKCmRlZiBjaGVja19sYWJlbChsYWJlbCk6CgogICAgaWYgaXNpbnN0YW5jZShsYWJlbCwgKGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICBsYWJlbCA9IGxhYmVsLmRlY29kZSgndXRmLTgnKQogICAgaWYgbGVuKGxhYmVsKSA9PSAwOgogICAgICAgIHJhaXNlIElETkFFcnJvcignRW1wdHkgTGFiZWwnKQoKICAgIGNoZWNrX25mYyhsYWJlbCkKICAgIGNoZWNrX2h5cGhlbl9vayhsYWJlbCkKICAgIGNoZWNrX2luaXRpYWxfY29tYmluZXIobGFiZWwpCgogICAgZm9yIChwb3MsIGNwKSBpbiBlbnVtZXJhdGUobGFiZWwpOgogICAgICAgIGNwX3ZhbHVlID0gb3JkKGNwKQogICAgICAgIGlmIGludHJhbmdlc19jb250YWluKGNwX3ZhbHVlLCBpZG5hZGF0YS5jb2RlcG9pbnRfY2xhc3Nlc1snUFZBTElEJ10pOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGVsaWYgaW50cmFuZ2VzX2NvbnRhaW4oY3BfdmFsdWUsIGlkbmFkYXRhLmNvZGVwb2ludF9jbGFzc2VzWydDT05URVhUSiddKToKICAgICAgICAgICAgaWYgbm90IHZhbGlkX2NvbnRleHRqKGxhYmVsLCBwb3MpOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZENvZGVwb2ludENvbnRleHQoJ0pvaW5lciB7MH0gbm90IGFsbG93ZWQgYXQgcG9zaXRpb24gezF9IGluIHsyfScuZm9ybWF0KF91bm90KGNwX3ZhbHVlKSwgcG9zKzEsIHJlcHIobGFiZWwpKSkKICAgICAgICBlbGlmIGludHJhbmdlc19jb250YWluKGNwX3ZhbHVlLCBpZG5hZGF0YS5jb2RlcG9pbnRfY2xhc3Nlc1snQ09OVEVYVE8nXSk6CiAgICAgICAgICAgIGlmIG5vdCB2YWxpZF9jb250ZXh0byhsYWJlbCwgcG9zKToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRDb2RlcG9pbnRDb250ZXh0KCdDb2RlcG9pbnQgezB9IG5vdCBhbGxvd2VkIGF0IHBvc2l0aW9uIHsxfSBpbiB7Mn0nLmZvcm1hdChfdW5vdChjcF92YWx1ZSksIHBvcysxLCByZXByKGxhYmVsKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZENvZGVwb2ludCgnQ29kZXBvaW50IHswfSBhdCBwb3NpdGlvbiB7MX0gb2YgezJ9IG5vdCBhbGxvd2VkJy5mb3JtYXQoX3Vub3QoY3BfdmFsdWUpLCBwb3MrMSwgcmVwcihsYWJlbCkpKQoKICAgIGNoZWNrX2JpZGkobGFiZWwpCgoKZGVmIGFsYWJlbChsYWJlbCk6CgogICAgdHJ5OgogICAgICAgIGxhYmVsID0gbGFiZWwuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB1bGFiZWwobGFiZWwpCiAgICAgICAgZXhjZXB0IElETkFFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCdUaGUgbGFiZWwgezB9IGlzIG5vdCBhIHZhbGlkIEEtbGFiZWwnLmZvcm1hdChsYWJlbCkpCiAgICAgICAgaWYgbm90IHZhbGlkX2xhYmVsX2xlbmd0aChsYWJlbCk6CiAgICAgICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgdG9vIGxvbmcnKQogICAgICAgIHJldHVybiBsYWJlbAogICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgaWYgbm90IGxhYmVsOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTm8gSW5wdXQnKQoKICAgIGxhYmVsID0gdW5pY29kZShsYWJlbCkKICAgIGNoZWNrX2xhYmVsKGxhYmVsKQogICAgbGFiZWwgPSBfcHVueWNvZGUobGFiZWwpCiAgICBsYWJlbCA9IF9hbGFiZWxfcHJlZml4ICsgbGFiZWwKCiAgICBpZiBub3QgdmFsaWRfbGFiZWxfbGVuZ3RoKGxhYmVsKToKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIHRvbyBsb25nJykKCiAgICByZXR1cm4gbGFiZWwKCgpkZWYgdWxhYmVsKGxhYmVsKToKCiAgICBpZiBub3QgaXNpbnN0YW5jZShsYWJlbCwgKGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgY2hlY2tfbGFiZWwobGFiZWwpCiAgICAgICAgICAgIHJldHVybiBsYWJlbAoKICAgIGxhYmVsID0gbGFiZWwubG93ZXIoKQogICAgaWYgbGFiZWwuc3RhcnRzd2l0aChfYWxhYmVsX3ByZWZpeCk6CiAgICAgICAgbGFiZWwgPSBsYWJlbFtsZW4oX2FsYWJlbF9wcmVmaXgpOl0KICAgIGVsc2U6CiAgICAgICAgY2hlY2tfbGFiZWwobGFiZWwpCiAgICAgICAgcmV0dXJuIGxhYmVsLmRlY29kZSgnYXNjaWknKQoKICAgIGxhYmVsID0gbGFiZWwuZGVjb2RlKCdwdW55Y29kZScpCiAgICBjaGVja19sYWJlbChsYWJlbCkKICAgIHJldHVybiBsYWJlbAoKCmRlZiB1dHM0Nl9yZW1hcChkb21haW4sIHN0ZDNfcnVsZXM9VHJ1ZSwgdHJhbnNpdGlvbmFsPUZhbHNlKToKICAgICIiIlJlLW1hcCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFjY29yZGluZyB0byBVVFM0NiBwcm9jZXNzaW5nLiIiIgogICAgZnJvbSAudXRzNDZkYXRhIGltcG9ydCB1dHM0NmRhdGEKICAgIG91dHB1dCA9IHUiIgogICAgdHJ5OgogICAgICAgIGZvciBwb3MsIGNoYXIgaW4gZW51bWVyYXRlKGRvbWFpbik6CiAgICAgICAgICAgIGNvZGVfcG9pbnQgPSBvcmQoY2hhcikKICAgICAgICAgICAgdXRzNDZyb3cgPSB1dHM0NmRhdGFbY29kZV9wb2ludCBpZiBjb2RlX3BvaW50IDwgMjU2IGVsc2UKICAgICAgICAgICAgICAgIGJpc2VjdC5iaXNlY3RfbGVmdCh1dHM0NmRhdGEsIChjb2RlX3BvaW50LCAiWiIpKSAtIDFdCiAgICAgICAgICAgIHN0YXR1cyA9IHV0czQ2cm93WzFdCiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gdXRzNDZyb3dbMl0gaWYgbGVuKHV0czQ2cm93KSA9PSAzIGVsc2UgTm9uZQogICAgICAgICAgICBpZiAoc3RhdHVzID09ICJWIiBvcgogICAgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gIkQiIGFuZCBub3QgdHJhbnNpdGlvbmFsKSBvcgogICAgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gIjMiIGFuZCBzdGQzX3J1bGVzIGFuZCByZXBsYWNlbWVudCBpcyBOb25lKSk6CiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gY2hhcgogICAgICAgICAgICBlbGlmIHJlcGxhY2VtZW50IGlzIG5vdCBOb25lIGFuZCAoc3RhdHVzID09ICJNIiBvcgogICAgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gIjMiIGFuZCBzdGQzX3J1bGVzKSBvcgogICAgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gIkQiIGFuZCB0cmFuc2l0aW9uYWwpKToKICAgICAgICAgICAgICAgIG91dHB1dCArPSByZXBsYWNlbWVudAogICAgICAgICAgICBlbGlmIHN0YXR1cyAhPSAiSSI6CiAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKCkKICAgICAgICByZXR1cm4gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkMiLCBvdXRwdXQpCiAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICByYWlzZSBJbnZhbGlkQ29kZXBvaW50KAogICAgICAgICAgICAiQ29kZXBvaW50IHswfSBub3QgYWxsb3dlZCBhdCBwb3NpdGlvbiB7MX0gaW4gezJ9Ii5mb3JtYXQoCiAgICAgICAgICAgIF91bm90KGNvZGVfcG9pbnQpLCBwb3MgKyAxLCByZXByKGRvbWFpbikpKQoKCmRlZiBlbmNvZGUocywgc3RyaWN0PUZhbHNlLCB1dHM0Nj1GYWxzZSwgc3RkM19ydWxlcz1GYWxzZSwgdHJhbnNpdGlvbmFsPUZhbHNlKToKCiAgICBpZiBpc2luc3RhbmNlKHMsIChieXRlcywgYnl0ZWFycmF5KSk6CiAgICAgICAgcyA9IHMuZGVjb2RlKCJhc2NpaSIpCiAgICBpZiB1dHM0NjoKICAgICAgICBzID0gdXRzNDZfcmVtYXAocywgc3RkM19ydWxlcywgdHJhbnNpdGlvbmFsKQogICAgdHJhaWxpbmdfZG90ID0gRmFsc2UKICAgIHJlc3VsdCA9IFtdCiAgICBpZiBzdHJpY3Q6CiAgICAgICAgbGFiZWxzID0gcy5zcGxpdCgnLicpCiAgICBlbHNlOgogICAgICAgIGxhYmVscyA9IF91bmljb2RlX2RvdHNfcmUuc3BsaXQocykKICAgIHdoaWxlIGxhYmVscyBhbmQgbm90IGxhYmVsc1swXToKICAgICAgICBkZWwgbGFiZWxzWzBdCiAgICBpZiBub3QgbGFiZWxzOgogICAgICAgIHJhaXNlIElETkFFcnJvcignRW1wdHkgZG9tYWluJykKICAgIGlmIGxhYmVsc1stMV0gPT0gJyc6CiAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICB0cmFpbGluZ19kb3QgPSBUcnVlCiAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgogICAgICAgIHJlc3VsdC5hcHBlbmQoYWxhYmVsKGxhYmVsKSkKICAgIGlmIHRyYWlsaW5nX2RvdDoKICAgICAgICByZXN1bHQuYXBwZW5kKGInJykKICAgIHMgPSBiJy4nLmpvaW4ocmVzdWx0KQogICAgaWYgbm90IHZhbGlkX3N0cmluZ19sZW5ndGgocywgdHJhaWxpbmdfZG90KToKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0RvbWFpbiB0b28gbG9uZycpCiAgICByZXR1cm4gcwoKCmRlZiBkZWNvZGUocywgc3RyaWN0PUZhbHNlLCB1dHM0Nj1GYWxzZSwgc3RkM19ydWxlcz1GYWxzZSk6CgogICAgaWYgaXNpbnN0YW5jZShzLCAoYnl0ZXMsIGJ5dGVhcnJheSkpOgogICAgICAgIHMgPSBzLmRlY29kZSgiYXNjaWkiKQogICAgaWYgdXRzNDY6CiAgICAgICAgcyA9IHV0czQ2X3JlbWFwKHMsIHN0ZDNfcnVsZXMsIEZhbHNlKQogICAgdHJhaWxpbmdfZG90ID0gRmFsc2UKICAgIHJlc3VsdCA9IFtdCiAgICBpZiBub3Qgc3RyaWN0OgogICAgICAgIGxhYmVscyA9IF91bmljb2RlX2RvdHNfcmUuc3BsaXQocykKICAgIGVsc2U6CiAgICAgICAgbGFiZWxzID0gcy5zcGxpdCh1Jy4nKQogICAgd2hpbGUgbGFiZWxzIGFuZCBub3QgbGFiZWxzWzBdOgogICAgICAgIGRlbCBsYWJlbHNbMF0KICAgIGlmIG5vdCBsYWJlbHM6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdFbXB0eSBkb21haW4nKQogICAgaWYgbm90IGxhYmVsc1stMV06CiAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICB0cmFpbGluZ19kb3QgPSBUcnVlCiAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgogICAgICAgIHJlc3VsdC5hcHBlbmQodWxhYmVsKGxhYmVsKSkKICAgIGlmIHRyYWlsaW5nX2RvdDoKICAgICAgICByZXN1bHQuYXBwZW5kKHUnJykKICAgIHJldHVybiB1Jy4nLmpvaW4ocmVzdWx0KQpQSwMEFAAAAAAAAAAhAGO8+hHngAAA54AAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvaWRuYWRhdGEucHkjIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0b29scy9pZG5hLWRhdGEKCl9fdmVyc2lvbl9fID0gIjYuMy4wIgpzY3JpcHRzID0gewogICAgJ0dyZWVrJzogKAogICAgICAgIDB4MzcwMDAwMDAzNzQsCiAgICAgICAgMHgzNzUwMDAwMDM3OCwKICAgICAgICAweDM3YTAwMDAwMzdlLAogICAgICAgIDB4Mzg0MDAwMDAzODUsCiAgICAgICAgMHgzODYwMDAwMDM4NywKICAgICAgICAweDM4ODAwMDAwMzhiLAogICAgICAgIDB4MzhjMDAwMDAzOGQsCiAgICAgICAgMHgzOGUwMDAwMDNhMiwKICAgICAgICAweDNhMzAwMDAwM2UyLAogICAgICAgIDB4M2YwMDAwMDA0MDAsCiAgICAgICAgMHgxZDI2MDAwMDFkMmIsCiAgICAgICAgMHgxZDVkMDAwMDFkNjIsCiAgICAgICAgMHgxZDY2MDAwMDFkNmIsCiAgICAgICAgMHgxZGJmMDAwMDFkYzAsCiAgICAgICAgMHgxZjAwMDAwMDFmMTYsCiAgICAgICAgMHgxZjE4MDAwMDFmMWUsCiAgICAgICAgMHgxZjIwMDAwMDFmNDYsCiAgICAgICAgMHgxZjQ4MDAwMDFmNGUsCiAgICAgICAgMHgxZjUwMDAwMDFmNTgsCiAgICAgICAgMHgxZjU5MDAwMDFmNWEsCiAgICAgICAgMHgxZjViMDAwMDFmNWMsCiAgICAgICAgMHgxZjVkMDAwMDFmNWUsCiAgICAgICAgMHgxZjVmMDAwMDFmN2UsCiAgICAgICAgMHgxZjgwMDAwMDFmYjUsCiAgICAgICAgMHgxZmI2MDAwMDFmYzUsCiAgICAgICAgMHgxZmM2MDAwMDFmZDQsCiAgICAgICAgMHgxZmQ2MDAwMDFmZGMsCiAgICAgICAgMHgxZmRkMDAwMDFmZjAsCiAgICAgICAgMHgxZmYyMDAwMDFmZjUsCiAgICAgICAgMHgxZmY2MDAwMDFmZmYsCiAgICAgICAgMHgyMTI2MDAwMDIxMjcsCiAgICAgICAgMHgxMDE0MDAwMDEwMThiLAogICAgICAgIDB4MWQyMDAwMDAxZDI0NiwKICAgICksCiAgICAnSGFuJzogKAogICAgICAgIDB4MmU4MDAwMDAyZTlhLAogICAgICAgIDB4MmU5YjAwMDAyZWY0LAogICAgICAgIDB4MmYwMDAwMDAyZmQ2LAogICAgICAgIDB4MzAwNTAwMDAzMDA2LAogICAgICAgIDB4MzAwNzAwMDAzMDA4LAogICAgICAgIDB4MzAyMTAwMDAzMDJhLAogICAgICAgIDB4MzAzODAwMDAzMDNjLAogICAgICAgIDB4MzQwMDAwMDA0ZGI2LAogICAgICAgIDB4NGUwMDAwMDA5ZmNkLAogICAgICAgIDB4ZjkwMDAwMDBmYTZlLAogICAgICAgIDB4ZmE3MDAwMDBmYWRhLAogICAgICAgIDB4MjAwMDAwMDAyYTZkNywKICAgICAgICAweDJhNzAwMDAwMmI3MzUsCiAgICAgICAgMHgyYjc0MDAwMDJiODFlLAogICAgICAgIDB4MmY4MDAwMDAyZmExZSwKICAgICksCiAgICAnSGVicmV3JzogKAogICAgICAgIDB4NTkxMDAwMDA1YzgsCiAgICAgICAgMHg1ZDAwMDAwMDVlYiwKICAgICAgICAweDVmMDAwMDAwNWY1LAogICAgICAgIDB4ZmIxZDAwMDBmYjM3LAogICAgICAgIDB4ZmIzODAwMDBmYjNkLAogICAgICAgIDB4ZmIzZTAwMDBmYjNmLAogICAgICAgIDB4ZmI0MDAwMDBmYjQyLAogICAgICAgIDB4ZmI0MzAwMDBmYjQ1LAogICAgICAgIDB4ZmI0NjAwMDBmYjUwLAogICAgKSwKICAgICdIaXJhZ2FuYSc6ICgKICAgICAgICAweDMwNDEwMDAwMzA5NywKICAgICAgICAweDMwOWQwMDAwMzBhMCwKICAgICAgICAweDFiMDAxMDAwMWIwMDIsCiAgICAgICAgMHgxZjIwMDAwMDFmMjAxLAogICAgKSwKICAgICdLYXRha2FuYSc6ICgKICAgICAgICAweDMwYTEwMDAwMzBmYiwKICAgICAgICAweDMwZmQwMDAwMzEwMCwKICAgICAgICAweDMxZjAwMDAwMzIwMCwKICAgICAgICAweDMyZDAwMDAwMzJmZiwKICAgICAgICAweDMzMDAwMDAwMzM1OCwKICAgICAgICAweGZmNjYwMDAwZmY3MCwKICAgICAgICAweGZmNzEwMDAwZmY5ZSwKICAgICAgICAweDFiMDAwMDAwMWIwMDEsCiAgICApLAp9CmpvaW5pbmdfdHlwZXMgPSB7CiAgICAweDYwMDogODUsCiAgICAweDYwMTogODUsCiAgICAweDYwMjogODUsCiAgICAweDYwMzogODUsCiAgICAweDYwNDogODUsCiAgICAweDYwODogODUsCiAgICAweDYwYjogODUsCiAgICAweDYyMDogNjgsCiAgICAweDYyMTogODUsCiAgICAweDYyMjogODIsCiAgICAweDYyMzogODIsCiAgICAweDYyNDogODIsCiAgICAweDYyNTogODIsCiAgICAweDYyNjogNjgsCiAgICAweDYyNzogODIsCiAgICAweDYyODogNjgsCiAgICAweDYyOTogODIsCiAgICAweDYyYTogNjgsCiAgICAweDYyYjogNjgsCiAgICAweDYyYzogNjgsCiAgICAweDYyZDogNjgsCiAgICAweDYyZTogNjgsCiAgICAweDYyZjogODIsCiAgICAweDYzMDogODIsCiAgICAweDYzMTogODIsCiAgICAweDYzMjogODIsCiAgICAweDYzMzogNjgsCiAgICAweDYzNDogNjgsCiAgICAweDYzNTogNjgsCiAgICAweDYzNjogNjgsCiAgICAweDYzNzogNjgsCiAgICAweDYzODogNjgsCiAgICAweDYzOTogNjgsCiAgICAweDYzYTogNjgsCiAgICAweDYzYjogNjgsCiAgICAweDYzYzogNjgsCiAgICAweDYzZDogNjgsCiAgICAweDYzZTogNjgsCiAgICAweDYzZjogNjgsCiAgICAweDY0MDogNjcsCiAgICAweDY0MTogNjgsCiAgICAweDY0MjogNjgsCiAgICAweDY0MzogNjgsCiAgICAweDY0NDogNjgsCiAgICAweDY0NTogNjgsCiAgICAweDY0NjogNjgsCiAgICAweDY0NzogNjgsCiAgICAweDY0ODogODIsCiAgICAweDY0OTogNjgsCiAgICAweDY0YTogNjgsCiAgICAweDY2ZTogNjgsCiAgICAweDY2ZjogNjgsCiAgICAweDY3MTogODIsCiAgICAweDY3MjogODIsCiAgICAweDY3MzogODIsCiAgICAweDY3NDogODUsCiAgICAweDY3NTogODIsCiAgICAweDY3NjogODIsCiAgICAweDY3NzogODIsCiAgICAweDY3ODogNjgsCiAgICAweDY3OTogNjgsCiAgICAweDY3YTogNjgsCiAgICAweDY3YjogNjgsCiAgICAweDY3YzogNjgsCiAgICAweDY3ZDogNjgsCiAgICAweDY3ZTogNjgsCiAgICAweDY3ZjogNjgsCiAgICAweDY4MDogNjgsCiAgICAweDY4MTogNjgsCiAgICAweDY4MjogNjgsCiAgICAweDY4MzogNjgsCiAgICAweDY4NDogNjgsCiAgICAweDY4NTogNjgsCiAgICAweDY4NjogNjgsCiAgICAweDY4NzogNjgsCiAgICAweDY4ODogODIsCiAgICAweDY4OTogODIsCiAgICAweDY4YTogODIsCiAgICAweDY4YjogODIsCiAgICAweDY4YzogODIsCiAgICAweDY4ZDogODIsCiAgICAweDY4ZTogODIsCiAgICAweDY4ZjogODIsCiAgICAweDY5MDogODIsCiAgICAweDY5MTogODIsCiAgICAweDY5MjogODIsCiAgICAweDY5MzogODIsCiAgICAweDY5NDogODIsCiAgICAweDY5NTogODIsCiAgICAweDY5NjogODIsCiAgICAweDY5NzogODIsCiAgICAweDY5ODogODIsCiAgICAweDY5OTogODIsCiAgICAweDY5YTogNjgsCiAgICAweDY5YjogNjgsCiAgICAweDY5YzogNjgsCiAgICAweDY5ZDogNjgsCiAgICAweDY5ZTogNjgsCiAgICAweDY5ZjogNjgsCiAgICAweDZhMDogNjgsCiAgICAweDZhMTogNjgsCiAgICAweDZhMjogNjgsCiAgICAweDZhMzogNjgsCiAgICAweDZhNDogNjgsCiAgICAweDZhNTogNjgsCiAgICAweDZhNjogNjgsCiAgICAweDZhNzogNjgsCiAgICAweDZhODogNjgsCiAgICAweDZhOTogNjgsCiAgICAweDZhYTogNjgsCiAgICAweDZhYjogNjgsCiAgICAweDZhYzogNjgsCiAgICAweDZhZDogNjgsCiAgICAweDZhZTogNjgsCiAgICAweDZhZjogNjgsCiAgICAweDZiMDogNjgsCiAgICAweDZiMTogNjgsCiAgICAweDZiMjogNjgsCiAgICAweDZiMzogNjgsCiAgICAweDZiNDogNjgsCiAgICAweDZiNTogNjgsCiAgICAweDZiNjogNjgsCiAgICAweDZiNzogNjgsCiAgICAweDZiODogNjgsCiAgICAweDZiOTogNjgsCiAgICAweDZiYTogNjgsCiAgICAweDZiYjogNjgsCiAgICAweDZiYzogNjgsCiAgICAweDZiZDogNjgsCiAgICAweDZiZTogNjgsCiAgICAweDZiZjogNjgsCiAgICAweDZjMDogODIsCiAgICAweDZjMTogNjgsCiAgICAweDZjMjogNjgsCiAgICAweDZjMzogODIsCiAgICAweDZjNDogODIsCiAgICAweDZjNTogODIsCiAgICAweDZjNjogODIsCiAgICAweDZjNzogODIsCiAgICAweDZjODogODIsCiAgICAweDZjOTogODIsCiAgICAweDZjYTogODIsCiAgICAweDZjYjogODIsCiAgICAweDZjYzogNjgsCiAgICAweDZjZDogODIsCiAgICAweDZjZTogNjgsCiAgICAweDZjZjogODIsCiAgICAweDZkMDogNjgsCiAgICAweDZkMTogNjgsCiAgICAweDZkMjogODIsCiAgICAweDZkMzogODIsCiAgICAweDZkNTogODIsCiAgICAweDZkZDogODUsCiAgICAweDZlZTogODIsCiAgICAweDZlZjogODIsCiAgICAweDZmYTogNjgsCiAgICAweDZmYjogNjgsCiAgICAweDZmYzogNjgsCiAgICAweDZmZjogNjgsCiAgICAweDcxMDogODIsCiAgICAweDcxMjogNjgsCiAgICAweDcxMzogNjgsCiAgICAweDcxNDogNjgsCiAgICAweDcxNTogODIsCiAgICAweDcxNjogODIsCiAgICAweDcxNzogODIsCiAgICAweDcxODogODIsCiAgICAweDcxOTogODIsCiAgICAweDcxYTogNjgsCiAgICAweDcxYjogNjgsCiAgICAweDcxYzogNjgsCiAgICAweDcxZDogNjgsCiAgICAweDcxZTogODIsCiAgICAweDcxZjogNjgsCiAgICAweDcyMDogNjgsCiAgICAweDcyMTogNjgsCiAgICAweDcyMjogNjgsCiAgICAweDcyMzogNjgsCiAgICAweDcyNDogNjgsCiAgICAweDcyNTogNjgsCiAgICAweDcyNjogNjgsCiAgICAweDcyNzogNjgsCiAgICAweDcyODogODIsCiAgICAweDcyOTogNjgsCiAgICAweDcyYTogODIsCiAgICAweDcyYjogNjgsCiAgICAweDcyYzogODIsCiAgICAweDcyZDogNjgsCiAgICAweDcyZTogNjgsCiAgICAweDcyZjogODIsCiAgICAweDc0ZDogODIsCiAgICAweDc0ZTogNjgsCiAgICAweDc0ZjogNjgsCiAgICAweDc1MDogNjgsCiAgICAweDc1MTogNjgsCiAgICAweDc1MjogNjgsCiAgICAweDc1MzogNjgsCiAgICAweDc1NDogNjgsCiAgICAweDc1NTogNjgsCiAgICAweDc1NjogNjgsCiAgICAweDc1NzogNjgsCiAgICAweDc1ODogNjgsCiAgICAweDc1OTogODIsCiAgICAweDc1YTogODIsCiAgICAweDc1YjogODIsCiAgICAweDc1YzogNjgsCiAgICAweDc1ZDogNjgsCiAgICAweDc1ZTogNjgsCiAgICAweDc1ZjogNjgsCiAgICAweDc2MDogNjgsCiAgICAweDc2MTogNjgsCiAgICAweDc2MjogNjgsCiAgICAweDc2MzogNjgsCiAgICAweDc2NDogNjgsCiAgICAweDc2NTogNjgsCiAgICAweDc2NjogNjgsCiAgICAweDc2NzogNjgsCiAgICAweDc2ODogNjgsCiAgICAweDc2OTogNjgsCiAgICAweDc2YTogNjgsCiAgICAweDc2YjogODIsCiAgICAweDc2YzogODIsCiAgICAweDc2ZDogNjgsCiAgICAweDc2ZTogNjgsCiAgICAweDc2ZjogNjgsCiAgICAweDc3MDogNjgsCiAgICAweDc3MTogODIsCiAgICAweDc3MjogNjgsCiAgICAweDc3MzogODIsCiAgICAweDc3NDogODIsCiAgICAweDc3NTogNjgsCiAgICAweDc3NjogNjgsCiAgICAweDc3NzogNjgsCiAgICAweDc3ODogODIsCiAgICAweDc3OTogODIsCiAgICAweDc3YTogNjgsCiAgICAweDc3YjogNjgsCiAgICAweDc3YzogNjgsCiAgICAweDc3ZDogNjgsCiAgICAweDc3ZTogNjgsCiAgICAweDc3ZjogNjgsCiAgICAweDdjYTogNjgsCiAgICAweDdjYjogNjgsCiAgICAweDdjYzogNjgsCiAgICAweDdjZDogNjgsCiAgICAweDdjZTogNjgsCiAgICAweDdjZjogNjgsCiAgICAweDdkMDogNjgsCiAgICAweDdkMTogNjgsCiAgICAweDdkMjogNjgsCiAgICAweDdkMzogNjgsCiAgICAweDdkNDogNjgsCiAgICAweDdkNTogNjgsCiAgICAweDdkNjogNjgsCiAgICAweDdkNzogNjgsCiAgICAweDdkODogNjgsCiAgICAweDdkOTogNjgsCiAgICAweDdkYTogNjgsCiAgICAweDdkYjogNjgsCiAgICAweDdkYzogNjgsCiAgICAweDdkZDogNjgsCiAgICAweDdkZTogNjgsCiAgICAweDdkZjogNjgsCiAgICAweDdlMDogNjgsCiAgICAweDdlMTogNjgsCiAgICAweDdlMjogNjgsCiAgICAweDdlMzogNjgsCiAgICAweDdlNDogNjgsCiAgICAweDdlNTogNjgsCiAgICAweDdlNjogNjgsCiAgICAweDdlNzogNjgsCiAgICAweDdlODogNjgsCiAgICAweDdlOTogNjgsCiAgICAweDdlYTogNjgsCiAgICAweDdmYTogNjcsCiAgICAweDg0MDogODIsCiAgICAweDg0MTogNjgsCiAgICAweDg0MjogNjgsCiAgICAweDg0MzogNjgsCiAgICAweDg0NDogNjgsCiAgICAweDg0NTogNjgsCiAgICAweDg0NjogODIsCiAgICAweDg0NzogNjgsCiAgICAweDg0ODogNjgsCiAgICAweDg0OTogODIsCiAgICAweDg0YTogNjgsCiAgICAweDg0YjogNjgsCiAgICAweDg0YzogNjgsCiAgICAweDg0ZDogNjgsCiAgICAweDg0ZTogNjgsCiAgICAweDg0ZjogODIsCiAgICAweDg1MDogNjgsCiAgICAweDg1MTogNjgsCiAgICAweDg1MjogNjgsCiAgICAweDg1MzogNjgsCiAgICAweDg1NDogODIsCiAgICAweDg1NTogNjgsCiAgICAweDg1NjogODUsCiAgICAweDg1NzogODUsCiAgICAweDg1ODogODUsCiAgICAweDhhMDogNjgsCiAgICAweDhhMjogNjgsCiAgICAweDhhMzogNjgsCiAgICAweDhhNDogNjgsCiAgICAweDhhNTogNjgsCiAgICAweDhhNjogNjgsCiAgICAweDhhNzogNjgsCiAgICAweDhhODogNjgsCiAgICAweDhhOTogNjgsCiAgICAweDhhYTogODIsCiAgICAweDhhYjogODIsCiAgICAweDhhYzogODIsCiAgICAweDE4MDY6IDg1LAogICAgMHgxODA3OiA2OCwKICAgIDB4MTgwYTogNjcsCiAgICAweDE4MGU6IDg1LAogICAgMHgxODIwOiA2OCwKICAgIDB4MTgyMTogNjgsCiAgICAweDE4MjI6IDY4LAogICAgMHgxODIzOiA2OCwKICAgIDB4MTgyNDogNjgsCiAgICAweDE4MjU6IDY4LAogICAgMHgxODI2OiA2OCwKICAgIDB4MTgyNzogNjgsCiAgICAweDE4Mjg6IDY4LAogICAgMHgxODI5OiA2OCwKICAgIDB4MTgyYTogNjgsCiAgICAweDE4MmI6IDY4LAogICAgMHgxODJjOiA2OCwKICAgIDB4MTgyZDogNjgsCiAgICAweDE4MmU6IDY4LAogICAgMHgxODJmOiA2OCwKICAgIDB4MTgzMDogNjgsCiAgICAweDE4MzE6IDY4LAogICAgMHgxODMyOiA2OCwKICAgIDB4MTgzMzogNjgsCiAgICAweDE4MzQ6IDY4LAogICAgMHgxODM1OiA2OCwKICAgIDB4MTgzNjogNjgsCiAgICAweDE4Mzc6IDY4LAogICAgMHgxODM4OiA2OCwKICAgIDB4MTgzOTogNjgsCiAgICAweDE4M2E6IDY4LAogICAgMHgxODNiOiA2OCwKICAgIDB4MTgzYzogNjgsCiAgICAweDE4M2Q6IDY4LAogICAgMHgxODNlOiA2OCwKICAgIDB4MTgzZjogNjgsCiAgICAweDE4NDA6IDY4LAogICAgMHgxODQxOiA2OCwKICAgIDB4MTg0MjogNjgsCiAgICAweDE4NDM6IDY4LAogICAgMHgxODQ0OiA2OCwKICAgIDB4MTg0NTogNjgsCiAgICAweDE4NDY6IDY4LAogICAgMHgxODQ3OiA2OCwKICAgIDB4MTg0ODogNjgsCiAgICAweDE4NDk6IDY4LAogICAgMHgxODRhOiA2OCwKICAgIDB4MTg0YjogNjgsCiAgICAweDE4NGM6IDY4LAogICAgMHgxODRkOiA2OCwKICAgIDB4MTg0ZTogNjgsCiAgICAweDE4NGY6IDY4LAogICAgMHgxODUwOiA2OCwKICAgIDB4MTg1MTogNjgsCiAgICAweDE4NTI6IDY4LAogICAgMHgxODUzOiA2OCwKICAgIDB4MTg1NDogNjgsCiAgICAweDE4NTU6IDY4LAogICAgMHgxODU2OiA2OCwKICAgIDB4MTg1NzogNjgsCiAgICAweDE4NTg6IDY4LAogICAgMHgxODU5OiA2OCwKICAgIDB4MTg1YTogNjgsCiAgICAweDE4NWI6IDY4LAogICAgMHgxODVjOiA2OCwKICAgIDB4MTg1ZDogNjgsCiAgICAweDE4NWU6IDY4LAogICAgMHgxODVmOiA2OCwKICAgIDB4MTg2MDogNjgsCiAgICAweDE4NjE6IDY4LAogICAgMHgxODYyOiA2OCwKICAgIDB4MTg2MzogNjgsCiAgICAweDE4NjQ6IDY4LAogICAgMHgxODY1OiA2OCwKICAgIDB4MTg2NjogNjgsCiAgICAweDE4Njc6IDY4LAogICAgMHgxODY4OiA2OCwKICAgIDB4MTg2OTogNjgsCiAgICAweDE4NmE6IDY4LAogICAgMHgxODZiOiA2OCwKICAgIDB4MTg2YzogNjgsCiAgICAweDE4NmQ6IDY4LAogICAgMHgxODZlOiA2OCwKICAgIDB4MTg2ZjogNjgsCiAgICAweDE4NzA6IDY4LAogICAgMHgxODcxOiA2OCwKICAgIDB4MTg3MjogNjgsCiAgICAweDE4NzM6IDY4LAogICAgMHgxODc0OiA2OCwKICAgIDB4MTg3NTogNjgsCiAgICAweDE4NzY6IDY4LAogICAgMHgxODc3OiA2OCwKICAgIDB4MTg4MDogODUsCiAgICAweDE4ODE6IDg1LAogICAgMHgxODgyOiA4NSwKICAgIDB4MTg4MzogODUsCiAgICAweDE4ODQ6IDg1LAogICAgMHgxODg1OiA4NSwKICAgIDB4MTg4NjogODUsCiAgICAweDE4ODc6IDY4LAogICAgMHgxODg4OiA2OCwKICAgIDB4MTg4OTogNjgsCiAgICAweDE4OGE6IDY4LAogICAgMHgxODhiOiA2OCwKICAgIDB4MTg4YzogNjgsCiAgICAweDE4OGQ6IDY4LAogICAgMHgxODhlOiA2OCwKICAgIDB4MTg4ZjogNjgsCiAgICAweDE4OTA6IDY4LAogICAgMHgxODkxOiA2OCwKICAgIDB4MTg5MjogNjgsCiAgICAweDE4OTM6IDY4LAogICAgMHgxODk0OiA2OCwKICAgIDB4MTg5NTogNjgsCiAgICAweDE4OTY6IDY4LAogICAgMHgxODk3OiA2OCwKICAgIDB4MTg5ODogNjgsCiAgICAweDE4OTk6IDY4LAogICAgMHgxODlhOiA2OCwKICAgIDB4MTg5YjogNjgsCiAgICAweDE4OWM6IDY4LAogICAgMHgxODlkOiA2OCwKICAgIDB4MTg5ZTogNjgsCiAgICAweDE4OWY6IDY4LAogICAgMHgxOGEwOiA2OCwKICAgIDB4MThhMTogNjgsCiAgICAweDE4YTI6IDY4LAogICAgMHgxOGEzOiA2OCwKICAgIDB4MThhNDogNjgsCiAgICAweDE4YTU6IDY4LAogICAgMHgxOGE2OiA2OCwKICAgIDB4MThhNzogNjgsCiAgICAweDE4YTg6IDY4LAogICAgMHgxOGFhOiA2OCwKICAgIDB4MjAwYzogODUsCiAgICAweDIwMGQ6IDY3LAogICAgMHgyMDY2OiA4NSwKICAgIDB4MjA2NzogODUsCiAgICAweDIwNjg6IDg1LAogICAgMHgyMDY5OiA4NSwKICAgIDB4YTg0MDogNjgsCiAgICAweGE4NDE6IDY4LAogICAgMHhhODQyOiA2OCwKICAgIDB4YTg0MzogNjgsCiAgICAweGE4NDQ6IDY4LAogICAgMHhhODQ1OiA2OCwKICAgIDB4YTg0NjogNjgsCiAgICAweGE4NDc6IDY4LAogICAgMHhhODQ4OiA2OCwKICAgIDB4YTg0OTogNjgsCiAgICAweGE4NGE6IDY4LAogICAgMHhhODRiOiA2OCwKICAgIDB4YTg0YzogNjgsCiAgICAweGE4NGQ6IDY4LAogICAgMHhhODRlOiA2OCwKICAgIDB4YTg0ZjogNjgsCiAgICAweGE4NTA6IDY4LAogICAgMHhhODUxOiA2OCwKICAgIDB4YTg1MjogNjgsCiAgICAweGE4NTM6IDY4LAogICAgMHhhODU0OiA2OCwKICAgIDB4YTg1NTogNjgsCiAgICAweGE4NTY6IDY4LAogICAgMHhhODU3OiA2OCwKICAgIDB4YTg1ODogNjgsCiAgICAweGE4NTk6IDY4LAogICAgMHhhODVhOiA2OCwKICAgIDB4YTg1YjogNjgsCiAgICAweGE4NWM6IDY4LAogICAgMHhhODVkOiA2OCwKICAgIDB4YTg1ZTogNjgsCiAgICAweGE4NWY6IDY4LAogICAgMHhhODYwOiA2OCwKICAgIDB4YTg2MTogNjgsCiAgICAweGE4NjI6IDY4LAogICAgMHhhODYzOiA2OCwKICAgIDB4YTg2NDogNjgsCiAgICAweGE4NjU6IDY4LAogICAgMHhhODY2OiA2OCwKICAgIDB4YTg2NzogNjgsCiAgICAweGE4Njg6IDY4LAogICAgMHhhODY5OiA2OCwKICAgIDB4YTg2YTogNjgsCiAgICAweGE4NmI6IDY4LAogICAgMHhhODZjOiA2OCwKICAgIDB4YTg2ZDogNjgsCiAgICAweGE4NmU6IDY4LAogICAgMHhhODZmOiA2OCwKICAgIDB4YTg3MDogNjgsCiAgICAweGE4NzE6IDY4LAogICAgMHhhODcyOiA3NiwKICAgIDB4YTg3MzogODUsCn0KY29kZXBvaW50X2NsYXNzZXMgPSB7CiAgICAnUFZBTElEJzogKAogICAgICAgIDB4MmQwMDAwMDAyZSwKICAgICAgICAweDMwMDAwMDAwM2EsCiAgICAgICAgMHg2MTAwMDAwMDdiLAogICAgICAgIDB4ZGYwMDAwMDBmNywKICAgICAgICAweGY4MDAwMDAxMDAsCiAgICAgICAgMHgxMDEwMDAwMDEwMiwKICAgICAgICAweDEwMzAwMDAwMTA0LAogICAgICAgIDB4MTA1MDAwMDAxMDYsCiAgICAgICAgMHgxMDcwMDAwMDEwOCwKICAgICAgICAweDEwOTAwMDAwMTBhLAogICAgICAgIDB4MTBiMDAwMDAxMGMsCiAgICAgICAgMHgxMGQwMDAwMDEwZSwKICAgICAgICAweDEwZjAwMDAwMTEwLAogICAgICAgIDB4MTExMDAwMDAxMTIsCiAgICAgICAgMHgxMTMwMDAwMDExNCwKICAgICAgICAweDExNTAwMDAwMTE2LAogICAgICAgIDB4MTE3MDAwMDAxMTgsCiAgICAgICAgMHgxMTkwMDAwMDExYSwKICAgICAgICAweDExYjAwMDAwMTFjLAogICAgICAgIDB4MTFkMDAwMDAxMWUsCiAgICAgICAgMHgxMWYwMDAwMDEyMCwKICAgICAgICAweDEyMTAwMDAwMTIyLAogICAgICAgIDB4MTIzMDAwMDAxMjQsCiAgICAgICAgMHgxMjUwMDAwMDEyNiwKICAgICAgICAweDEyNzAwMDAwMTI4LAogICAgICAgIDB4MTI5MDAwMDAxMmEsCiAgICAgICAgMHgxMmIwMDAwMDEyYywKICAgICAgICAweDEyZDAwMDAwMTJlLAogICAgICAgIDB4MTJmMDAwMDAxMzAsCiAgICAgICAgMHgxMzEwMDAwMDEzMiwKICAgICAgICAweDEzNTAwMDAwMTM2LAogICAgICAgIDB4MTM3MDAwMDAxMzksCiAgICAgICAgMHgxM2EwMDAwMDEzYiwKICAgICAgICAweDEzYzAwMDAwMTNkLAogICAgICAgIDB4MTNlMDAwMDAxM2YsCiAgICAgICAgMHgxNDIwMDAwMDE0MywKICAgICAgICAweDE0NDAwMDAwMTQ1LAogICAgICAgIDB4MTQ2MDAwMDAxNDcsCiAgICAgICAgMHgxNDgwMDAwMDE0OSwKICAgICAgICAweDE0YjAwMDAwMTRjLAogICAgICAgIDB4MTRkMDAwMDAxNGUsCiAgICAgICAgMHgxNGYwMDAwMDE1MCwKICAgICAgICAweDE1MTAwMDAwMTUyLAogICAgICAgIDB4MTUzMDAwMDAxNTQsCiAgICAgICAgMHgxNTUwMDAwMDE1NiwKICAgICAgICAweDE1NzAwMDAwMTU4LAogICAgICAgIDB4MTU5MDAwMDAxNWEsCiAgICAgICAgMHgxNWIwMDAwMDE1YywKICAgICAgICAweDE1ZDAwMDAwMTVlLAogICAgICAgIDB4MTVmMDAwMDAxNjAsCiAgICAgICAgMHgxNjEwMDAwMDE2MiwKICAgICAgICAweDE2MzAwMDAwMTY0LAogICAgICAgIDB4MTY1MDAwMDAxNjYsCiAgICAgICAgMHgxNjcwMDAwMDE2OCwKICAgICAgICAweDE2OTAwMDAwMTZhLAogICAgICAgIDB4MTZiMDAwMDAxNmMsCiAgICAgICAgMHgxNmQwMDAwMDE2ZSwKICAgICAgICAweDE2ZjAwMDAwMTcwLAogICAgICAgIDB4MTcxMDAwMDAxNzIsCiAgICAgICAgMHgxNzMwMDAwMDE3NCwKICAgICAgICAweDE3NTAwMDAwMTc2LAogICAgICAgIDB4MTc3MDAwMDAxNzgsCiAgICAgICAgMHgxN2EwMDAwMDE3YiwKICAgICAgICAweDE3YzAwMDAwMTdkLAogICAgICAgIDB4MTdlMDAwMDAxN2YsCiAgICAgICAgMHgxODAwMDAwMDE4MSwKICAgICAgICAweDE4MzAwMDAwMTg0LAogICAgICAgIDB4MTg1MDAwMDAxODYsCiAgICAgICAgMHgxODgwMDAwMDE4OSwKICAgICAgICAweDE4YzAwMDAwMThlLAogICAgICAgIDB4MTkyMDAwMDAxOTMsCiAgICAgICAgMHgxOTUwMDAwMDE5NiwKICAgICAgICAweDE5OTAwMDAwMTljLAogICAgICAgIDB4MTllMDAwMDAxOWYsCiAgICAgICAgMHgxYTEwMDAwMDFhMiwKICAgICAgICAweDFhMzAwMDAwMWE0LAogICAgICAgIDB4MWE1MDAwMDAxYTYsCiAgICAgICAgMHgxYTgwMDAwMDFhOSwKICAgICAgICAweDFhYTAwMDAwMWFjLAogICAgICAgIDB4MWFkMDAwMDAxYWUsCiAgICAgICAgMHgxYjAwMDAwMDFiMSwKICAgICAgICAweDFiNDAwMDAwMWI1LAogICAgICAgIDB4MWI2MDAwMDAxYjcsCiAgICAgICAgMHgxYjkwMDAwMDFiYywKICAgICAgICAweDFiZDAwMDAwMWM0LAogICAgICAgIDB4MWNlMDAwMDAxY2YsCiAgICAgICAgMHgxZDAwMDAwMDFkMSwKICAgICAgICAweDFkMjAwMDAwMWQzLAogICAgICAgIDB4MWQ0MDAwMDAxZDUsCiAgICAgICAgMHgxZDYwMDAwMDFkNywKICAgICAgICAweDFkODAwMDAwMWQ5LAogICAgICAgIDB4MWRhMDAwMDAxZGIsCiAgICAgICAgMHgxZGMwMDAwMDFkZSwKICAgICAgICAweDFkZjAwMDAwMWUwLAogICAgICAgIDB4MWUxMDAwMDAxZTIsCiAgICAgICAgMHgxZTMwMDAwMDFlNCwKICAgICAgICAweDFlNTAwMDAwMWU2LAogICAgICAgIDB4MWU3MDAwMDAxZTgsCiAgICAgICAgMHgxZTkwMDAwMDFlYSwKICAgICAgICAweDFlYjAwMDAwMWVjLAogICAgICAgIDB4MWVkMDAwMDAxZWUsCiAgICAgICAgMHgxZWYwMDAwMDFmMSwKICAgICAgICAweDFmNTAwMDAwMWY2LAogICAgICAgIDB4MWY5MDAwMDAxZmEsCiAgICAgICAgMHgxZmIwMDAwMDFmYywKICAgICAgICAweDFmZDAwMDAwMWZlLAogICAgICAgIDB4MWZmMDAwMDAyMDAsCiAgICAgICAgMHgyMDEwMDAwMDIwMiwKICAgICAgICAweDIwMzAwMDAwMjA0LAogICAgICAgIDB4MjA1MDAwMDAyMDYsCiAgICAgICAgMHgyMDcwMDAwMDIwOCwKICAgICAgICAweDIwOTAwMDAwMjBhLAogICAgICAgIDB4MjBiMDAwMDAyMGMsCiAgICAgICAgMHgyMGQwMDAwMDIwZSwKICAgICAgICAweDIwZjAwMDAwMjEwLAogICAgICAgIDB4MjExMDAwMDAyMTIsCiAgICAgICAgMHgyMTMwMDAwMDIxNCwKICAgICAgICAweDIxNTAwMDAwMjE2LAogICAgICAgIDB4MjE3MDAwMDAyMTgsCiAgICAgICAgMHgyMTkwMDAwMDIxYSwKICAgICAgICAweDIxYjAwMDAwMjFjLAogICAgICAgIDB4MjFkMDAwMDAyMWUsCiAgICAgICAgMHgyMWYwMDAwMDIyMCwKICAgICAgICAweDIyMTAwMDAwMjIyLAogICAgICAgIDB4MjIzMDAwMDAyMjQsCiAgICAgICAgMHgyMjUwMDAwMDIyNiwKICAgICAgICAweDIyNzAwMDAwMjI4LAogICAgICAgIDB4MjI5MDAwMDAyMmEsCiAgICAgICAgMHgyMmIwMDAwMDIyYywKICAgICAgICAweDIyZDAwMDAwMjJlLAogICAgICAgIDB4MjJmMDAwMDAyMzAsCiAgICAgICAgMHgyMzEwMDAwMDIzMiwKICAgICAgICAweDIzMzAwMDAwMjNhLAogICAgICAgIDB4MjNjMDAwMDAyM2QsCiAgICAgICAgMHgyM2YwMDAwMDI0MSwKICAgICAgICAweDI0MjAwMDAwMjQzLAogICAgICAgIDB4MjQ3MDAwMDAyNDgsCiAgICAgICAgMHgyNDkwMDAwMDI0YSwKICAgICAgICAweDI0YjAwMDAwMjRjLAogICAgICAgIDB4MjRkMDAwMDAyNGUsCiAgICAgICAgMHgyNGYwMDAwMDJiMCwKICAgICAgICAweDJiOTAwMDAwMmMyLAogICAgICAgIDB4MmM2MDAwMDAyZDIsCiAgICAgICAgMHgyZWMwMDAwMDJlZCwKICAgICAgICAweDJlZTAwMDAwMmVmLAogICAgICAgIDB4MzAwMDAwMDAzNDAsCiAgICAgICAgMHgzNDIwMDAwMDM0MywKICAgICAgICAweDM0NjAwMDAwMzRmLAogICAgICAgIDB4MzUwMDAwMDAzNzAsCiAgICAgICAgMHgzNzEwMDAwMDM3MiwKICAgICAgICAweDM3MzAwMDAwMzc0LAogICAgICAgIDB4Mzc3MDAwMDAzNzgsCiAgICAgICAgMHgzN2IwMDAwMDM3ZSwKICAgICAgICAweDM5MDAwMDAwMzkxLAogICAgICAgIDB4M2FjMDAwMDAzY2YsCiAgICAgICAgMHgzZDcwMDAwMDNkOCwKICAgICAgICAweDNkOTAwMDAwM2RhLAogICAgICAgIDB4M2RiMDAwMDAzZGMsCiAgICAgICAgMHgzZGQwMDAwMDNkZSwKICAgICAgICAweDNkZjAwMDAwM2UwLAogICAgICAgIDB4M2UxMDAwMDAzZTIsCiAgICAgICAgMHgzZTMwMDAwMDNlNCwKICAgICAgICAweDNlNTAwMDAwM2U2LAogICAgICAgIDB4M2U3MDAwMDAzZTgsCiAgICAgICAgMHgzZTkwMDAwMDNlYSwKICAgICAgICAweDNlYjAwMDAwM2VjLAogICAgICAgIDB4M2VkMDAwMDAzZWUsCiAgICAgICAgMHgzZWYwMDAwMDNmMCwKICAgICAgICAweDNmMzAwMDAwM2Y0LAogICAgICAgIDB4M2Y4MDAwMDAzZjksCiAgICAgICAgMHgzZmIwMDAwMDNmZCwKICAgICAgICAweDQzMDAwMDAwNDYwLAogICAgICAgIDB4NDYxMDAwMDA0NjIsCiAgICAgICAgMHg0NjMwMDAwMDQ2NCwKICAgICAgICAweDQ2NTAwMDAwNDY2LAogICAgICAgIDB4NDY3MDAwMDA0NjgsCiAgICAgICAgMHg0NjkwMDAwMDQ2YSwKICAgICAgICAweDQ2YjAwMDAwNDZjLAogICAgICAgIDB4NDZkMDAwMDA0NmUsCiAgICAgICAgMHg0NmYwMDAwMDQ3MCwKICAgICAgICAweDQ3MTAwMDAwNDcyLAogICAgICAgIDB4NDczMDAwMDA0NzQsCiAgICAgICAgMHg0NzUwMDAwMDQ3NiwKICAgICAgICAweDQ3NzAwMDAwNDc4LAogICAgICAgIDB4NDc5MDAwMDA0N2EsCiAgICAgICAgMHg0N2IwMDAwMDQ3YywKICAgICAgICAweDQ3ZDAwMDAwNDdlLAogICAgICAgIDB4NDdmMDAwMDA0ODAsCiAgICAgICAgMHg0ODEwMDAwMDQ4MiwKICAgICAgICAweDQ4MzAwMDAwNDg4LAogICAgICAgIDB4NDhiMDAwMDA0OGMsCiAgICAgICAgMHg0OGQwMDAwMDQ4ZSwKICAgICAgICAweDQ4ZjAwMDAwNDkwLAogICAgICAgIDB4NDkxMDAwMDA0OTIsCiAgICAgICAgMHg0OTMwMDAwMDQ5NCwKICAgICAgICAweDQ5NTAwMDAwNDk2LAogICAgICAgIDB4NDk3MDAwMDA0OTgsCiAgICAgICAgMHg0OTkwMDAwMDQ5YSwKICAgICAgICAweDQ5YjAwMDAwNDljLAogICAgICAgIDB4NDlkMDAwMDA0OWUsCiAgICAgICAgMHg0OWYwMDAwMDRhMCwKICAgICAgICAweDRhMTAwMDAwNGEyLAogICAgICAgIDB4NGEzMDAwMDA0YTQsCiAgICAgICAgMHg0YTUwMDAwMDRhNiwKICAgICAgICAweDRhNzAwMDAwNGE4LAogICAgICAgIDB4NGE5MDAwMDA0YWEsCiAgICAgICAgMHg0YWIwMDAwMDRhYywKICAgICAgICAweDRhZDAwMDAwNGFlLAogICAgICAgIDB4NGFmMDAwMDA0YjAsCiAgICAgICAgMHg0YjEwMDAwMDRiMiwKICAgICAgICAweDRiMzAwMDAwNGI0LAogICAgICAgIDB4NGI1MDAwMDA0YjYsCiAgICAgICAgMHg0YjcwMDAwMDRiOCwKICAgICAgICAweDRiOTAwMDAwNGJhLAogICAgICAgIDB4NGJiMDAwMDA0YmMsCiAgICAgICAgMHg0YmQwMDAwMDRiZSwKICAgICAgICAweDRiZjAwMDAwNGMwLAogICAgICAgIDB4NGMyMDAwMDA0YzMsCiAgICAgICAgMHg0YzQwMDAwMDRjNSwKICAgICAgICAweDRjNjAwMDAwNGM3LAogICAgICAgIDB4NGM4MDAwMDA0YzksCiAgICAgICAgMHg0Y2EwMDAwMDRjYiwKICAgICAgICAweDRjYzAwMDAwNGNkLAogICAgICAgIDB4NGNlMDAwMDA0ZDAsCiAgICAgICAgMHg0ZDEwMDAwMDRkMiwKICAgICAgICAweDRkMzAwMDAwNGQ0LAogICAgICAgIDB4NGQ1MDAwMDA0ZDYsCiAgICAgICAgMHg0ZDcwMDAwMDRkOCwKICAgICAgICAweDRkOTAwMDAwNGRhLAogICAgICAgIDB4NGRiMDAwMDA0ZGMsCiAgICAgICAgMHg0ZGQwMDAwMDRkZSwKICAgICAgICAweDRkZjAwMDAwNGUwLAogICAgICAgIDB4NGUxMDAwMDA0ZTIsCiAgICAgICAgMHg0ZTMwMDAwMDRlNCwKICAgICAgICAweDRlNTAwMDAwNGU2LAogICAgICAgIDB4NGU3MDAwMDA0ZTgsCiAgICAgICAgMHg0ZTkwMDAwMDRlYSwKICAgICAgICAweDRlYjAwMDAwNGVjLAogICAgICAgIDB4NGVkMDAwMDA0ZWUsCiAgICAgICAgMHg0ZWYwMDAwMDRmMCwKICAgICAgICAweDRmMTAwMDAwNGYyLAogICAgICAgIDB4NGYzMDAwMDA0ZjQsCiAgICAgICAgMHg0ZjUwMDAwMDRmNiwKICAgICAgICAweDRmNzAwMDAwNGY4LAogICAgICAgIDB4NGY5MDAwMDA0ZmEsCiAgICAgICAgMHg0ZmIwMDAwMDRmYywKICAgICAgICAweDRmZDAwMDAwNGZlLAogICAgICAgIDB4NGZmMDAwMDA1MDAsCiAgICAgICAgMHg1MDEwMDAwMDUwMiwKICAgICAgICAweDUwMzAwMDAwNTA0LAogICAgICAgIDB4NTA1MDAwMDA1MDYsCiAgICAgICAgMHg1MDcwMDAwMDUwOCwKICAgICAgICAweDUwOTAwMDAwNTBhLAogICAgICAgIDB4NTBiMDAwMDA1MGMsCiAgICAgICAgMHg1MGQwMDAwMDUwZSwKICAgICAgICAweDUwZjAwMDAwNTEwLAogICAgICAgIDB4NTExMDAwMDA1MTIsCiAgICAgICAgMHg1MTMwMDAwMDUxNCwKICAgICAgICAweDUxNTAwMDAwNTE2LAogICAgICAgIDB4NTE3MDAwMDA1MTgsCiAgICAgICAgMHg1MTkwMDAwMDUxYSwKICAgICAgICAweDUxYjAwMDAwNTFjLAogICAgICAgIDB4NTFkMDAwMDA1MWUsCiAgICAgICAgMHg1MWYwMDAwMDUyMCwKICAgICAgICAweDUyMTAwMDAwNTIyLAogICAgICAgIDB4NTIzMDAwMDA1MjQsCiAgICAgICAgMHg1MjUwMDAwMDUyNiwKICAgICAgICAweDUyNzAwMDAwNTI4LAogICAgICAgIDB4NTU5MDAwMDA1NWEsCiAgICAgICAgMHg1NjEwMDAwMDU4NywKICAgICAgICAweDU5MTAwMDAwNWJlLAogICAgICAgIDB4NWJmMDAwMDA1YzAsCiAgICAgICAgMHg1YzEwMDAwMDVjMywKICAgICAgICAweDVjNDAwMDAwNWM2LAogICAgICAgIDB4NWM3MDAwMDA1YzgsCiAgICAgICAgMHg1ZDAwMDAwMDVlYiwKICAgICAgICAweDVmMDAwMDAwNWYzLAogICAgICAgIDB4NjEwMDAwMDA2MWIsCiAgICAgICAgMHg2MjAwMDAwMDY0MCwKICAgICAgICAweDY0MTAwMDAwNjYwLAogICAgICAgIDB4NjZlMDAwMDA2NzUsCiAgICAgICAgMHg2NzkwMDAwMDZkNCwKICAgICAgICAweDZkNTAwMDAwNmRkLAogICAgICAgIDB4NmRmMDAwMDA2ZTksCiAgICAgICAgMHg2ZWEwMDAwMDZmMCwKICAgICAgICAweDZmYTAwMDAwNzAwLAogICAgICAgIDB4NzEwMDAwMDA3NGIsCiAgICAgICAgMHg3NGQwMDAwMDdiMiwKICAgICAgICAweDdjMDAwMDAwN2Y2LAogICAgICAgIDB4ODAwMDAwMDA4MmUsCiAgICAgICAgMHg4NDAwMDAwMDg1YywKICAgICAgICAweDhhMDAwMDAwOGExLAogICAgICAgIDB4OGEyMDAwMDA4YWQsCiAgICAgICAgMHg4ZTQwMDAwMDhmZiwKICAgICAgICAweDkwMDAwMDAwOTU4LAogICAgICAgIDB4OTYwMDAwMDA5NjQsCiAgICAgICAgMHg5NjYwMDAwMDk3MCwKICAgICAgICAweDk3MTAwMDAwOTc4LAogICAgICAgIDB4OTc5MDAwMDA5ODAsCiAgICAgICAgMHg5ODEwMDAwMDk4NCwKICAgICAgICAweDk4NTAwMDAwOThkLAogICAgICAgIDB4OThmMDAwMDA5OTEsCiAgICAgICAgMHg5OTMwMDAwMDlhOSwKICAgICAgICAweDlhYTAwMDAwOWIxLAogICAgICAgIDB4OWIyMDAwMDA5YjMsCiAgICAgICAgMHg5YjYwMDAwMDliYSwKICAgICAgICAweDliYzAwMDAwOWM1LAogICAgICAgIDB4OWM3MDAwMDA5YzksCiAgICAgICAgMHg5Y2IwMDAwMDljZiwKICAgICAgICAweDlkNzAwMDAwOWQ4LAogICAgICAgIDB4OWUwMDAwMDA5ZTQsCiAgICAgICAgMHg5ZTYwMDAwMDlmMiwKICAgICAgICAweGEwMTAwMDAwYTA0LAogICAgICAgIDB4YTA1MDAwMDBhMGIsCiAgICAgICAgMHhhMGYwMDAwMGExMSwKICAgICAgICAweGExMzAwMDAwYTI5LAogICAgICAgIDB4YTJhMDAwMDBhMzEsCiAgICAgICAgMHhhMzIwMDAwMGEzMywKICAgICAgICAweGEzNTAwMDAwYTM2LAogICAgICAgIDB4YTM4MDAwMDBhM2EsCiAgICAgICAgMHhhM2MwMDAwMGEzZCwKICAgICAgICAweGEzZTAwMDAwYTQzLAogICAgICAgIDB4YTQ3MDAwMDBhNDksCiAgICAgICAgMHhhNGIwMDAwMGE0ZSwKICAgICAgICAweGE1MTAwMDAwYTUyLAogICAgICAgIDB4YTVjMDAwMDBhNWQsCiAgICAgICAgMHhhNjYwMDAwMGE3NiwKICAgICAgICAweGE4MTAwMDAwYTg0LAogICAgICAgIDB4YTg1MDAwMDBhOGUsCiAgICAgICAgMHhhOGYwMDAwMGE5MiwKICAgICAgICAweGE5MzAwMDAwYWE5LAogICAgICAgIDB4YWFhMDAwMDBhYjEsCiAgICAgICAgMHhhYjIwMDAwMGFiNCwKICAgICAgICAweGFiNTAwMDAwYWJhLAogICAgICAgIDB4YWJjMDAwMDBhYzYsCiAgICAgICAgMHhhYzcwMDAwMGFjYSwKICAgICAgICAweGFjYjAwMDAwYWNlLAogICAgICAgIDB4YWQwMDAwMDBhZDEsCiAgICAgICAgMHhhZTAwMDAwMGFlNCwKICAgICAgICAweGFlNjAwMDAwYWYwLAogICAgICAgIDB4YjAxMDAwMDBiMDQsCiAgICAgICAgMHhiMDUwMDAwMGIwZCwKICAgICAgICAweGIwZjAwMDAwYjExLAogICAgICAgIDB4YjEzMDAwMDBiMjksCiAgICAgICAgMHhiMmEwMDAwMGIzMSwKICAgICAgICAweGIzMjAwMDAwYjM0LAogICAgICAgIDB4YjM1MDAwMDBiM2EsCiAgICAgICAgMHhiM2MwMDAwMGI0NSwKICAgICAgICAweGI0NzAwMDAwYjQ5LAogICAgICAgIDB4YjRiMDAwMDBiNGUsCiAgICAgICAgMHhiNTYwMDAwMGI1OCwKICAgICAgICAweGI1ZjAwMDAwYjY0LAogICAgICAgIDB4YjY2MDAwMDBiNzAsCiAgICAgICAgMHhiNzEwMDAwMGI3MiwKICAgICAgICAweGI4MjAwMDAwYjg0LAogICAgICAgIDB4Yjg1MDAwMDBiOGIsCiAgICAgICAgMHhiOGUwMDAwMGI5MSwKICAgICAgICAweGI5MjAwMDAwYjk2LAogICAgICAgIDB4Yjk5MDAwMDBiOWIsCiAgICAgICAgMHhiOWMwMDAwMGI5ZCwKICAgICAgICAweGI5ZTAwMDAwYmEwLAogICAgICAgIDB4YmEzMDAwMDBiYTUsCiAgICAgICAgMHhiYTgwMDAwMGJhYiwKICAgICAgICAweGJhZTAwMDAwYmJhLAogICAgICAgIDB4YmJlMDAwMDBiYzMsCiAgICAgICAgMHhiYzYwMDAwMGJjOSwKICAgICAgICAweGJjYTAwMDAwYmNlLAogICAgICAgIDB4YmQwMDAwMDBiZDEsCiAgICAgICAgMHhiZDcwMDAwMGJkOCwKICAgICAgICAweGJlNjAwMDAwYmYwLAogICAgICAgIDB4YzAxMDAwMDBjMDQsCiAgICAgICAgMHhjMDUwMDAwMGMwZCwKICAgICAgICAweGMwZTAwMDAwYzExLAogICAgICAgIDB4YzEyMDAwMDBjMjksCiAgICAgICAgMHhjMmEwMDAwMGMzNCwKICAgICAgICAweGMzNTAwMDAwYzNhLAogICAgICAgIDB4YzNkMDAwMDBjNDUsCiAgICAgICAgMHhjNDYwMDAwMGM0OSwKICAgICAgICAweGM0YTAwMDAwYzRlLAogICAgICAgIDB4YzU1MDAwMDBjNTcsCiAgICAgICAgMHhjNTgwMDAwMGM1YSwKICAgICAgICAweGM2MDAwMDAwYzY0LAogICAgICAgIDB4YzY2MDAwMDBjNzAsCiAgICAgICAgMHhjODIwMDAwMGM4NCwKICAgICAgICAweGM4NTAwMDAwYzhkLAogICAgICAgIDB4YzhlMDAwMDBjOTEsCiAgICAgICAgMHhjOTIwMDAwMGNhOSwKICAgICAgICAweGNhYTAwMDAwY2I0LAogICAgICAgIDB4Y2I1MDAwMDBjYmEsCiAgICAgICAgMHhjYmMwMDAwMGNjNSwKICAgICAgICAweGNjNjAwMDAwY2M5LAogICAgICAgIDB4Y2NhMDAwMDBjY2UsCiAgICAgICAgMHhjZDUwMDAwMGNkNywKICAgICAgICAweGNkZTAwMDAwY2RmLAogICAgICAgIDB4Y2UwMDAwMDBjZTQsCiAgICAgICAgMHhjZTYwMDAwMGNmMCwKICAgICAgICAweGNmMTAwMDAwY2YzLAogICAgICAgIDB4ZDAyMDAwMDBkMDQsCiAgICAgICAgMHhkMDUwMDAwMGQwZCwKICAgICAgICAweGQwZTAwMDAwZDExLAogICAgICAgIDB4ZDEyMDAwMDBkM2IsCiAgICAgICAgMHhkM2QwMDAwMGQ0NSwKICAgICAgICAweGQ0NjAwMDAwZDQ5LAogICAgICAgIDB4ZDRhMDAwMDBkNGYsCiAgICAgICAgMHhkNTcwMDAwMGQ1OCwKICAgICAgICAweGQ2MDAwMDAwZDY0LAogICAgICAgIDB4ZDY2MDAwMDBkNzAsCiAgICAgICAgMHhkN2EwMDAwMGQ4MCwKICAgICAgICAweGQ4MjAwMDAwZDg0LAogICAgICAgIDB4ZDg1MDAwMDBkOTcsCiAgICAgICAgMHhkOWEwMDAwMGRiMiwKICAgICAgICAweGRiMzAwMDAwZGJjLAogICAgICAgIDB4ZGJkMDAwMDBkYmUsCiAgICAgICAgMHhkYzAwMDAwMGRjNywKICAgICAgICAweGRjYTAwMDAwZGNiLAogICAgICAgIDB4ZGNmMDAwMDBkZDUsCiAgICAgICAgMHhkZDYwMDAwMGRkNywKICAgICAgICAweGRkODAwMDAwZGUwLAogICAgICAgIDB4ZGYyMDAwMDBkZjQsCiAgICAgICAgMHhlMDEwMDAwMGUzMywKICAgICAgICAweGUzNDAwMDAwZTNiLAogICAgICAgIDB4ZTQwMDAwMDBlNGYsCiAgICAgICAgMHhlNTAwMDAwMGU1YSwKICAgICAgICAweGU4MTAwMDAwZTgzLAogICAgICAgIDB4ZTg0MDAwMDBlODUsCiAgICAgICAgMHhlODcwMDAwMGU4OSwKICAgICAgICAweGU4YTAwMDAwZThiLAogICAgICAgIDB4ZThkMDAwMDBlOGUsCiAgICAgICAgMHhlOTQwMDAwMGU5OCwKICAgICAgICAweGU5OTAwMDAwZWEwLAogICAgICAgIDB4ZWExMDAwMDBlYTQsCiAgICAgICAgMHhlYTUwMDAwMGVhNiwKICAgICAgICAweGVhNzAwMDAwZWE4LAogICAgICAgIDB4ZWFhMDAwMDBlYWMsCiAgICAgICAgMHhlYWQwMDAwMGViMywKICAgICAgICAweGViNDAwMDAwZWJhLAogICAgICAgIDB4ZWJiMDAwMDBlYmUsCiAgICAgICAgMHhlYzAwMDAwMGVjNSwKICAgICAgICAweGVjNjAwMDAwZWM3LAogICAgICAgIDB4ZWM4MDAwMDBlY2UsCiAgICAgICAgMHhlZDAwMDAwMGVkYSwKICAgICAgICAweGVkZTAwMDAwZWUwLAogICAgICAgIDB4ZjAwMDAwMDBmMDEsCiAgICAgICAgMHhmMGIwMDAwMGYwYywKICAgICAgICAweGYxODAwMDAwZjFhLAogICAgICAgIDB4ZjIwMDAwMDBmMmEsCiAgICAgICAgMHhmMzUwMDAwMGYzNiwKICAgICAgICAweGYzNzAwMDAwZjM4LAogICAgICAgIDB4ZjM5MDAwMDBmM2EsCiAgICAgICAgMHhmM2UwMDAwMGY0MywKICAgICAgICAweGY0NDAwMDAwZjQ4LAogICAgICAgIDB4ZjQ5MDAwMDBmNGQsCiAgICAgICAgMHhmNGUwMDAwMGY1MiwKICAgICAgICAweGY1MzAwMDAwZjU3LAogICAgICAgIDB4ZjU4MDAwMDBmNWMsCiAgICAgICAgMHhmNWQwMDAwMGY2OSwKICAgICAgICAweGY2YTAwMDAwZjZkLAogICAgICAgIDB4ZjcxMDAwMDBmNzMsCiAgICAgICAgMHhmNzQwMDAwMGY3NSwKICAgICAgICAweGY3YTAwMDAwZjgxLAogICAgICAgIDB4ZjgyMDAwMDBmODUsCiAgICAgICAgMHhmODYwMDAwMGY5MywKICAgICAgICAweGY5NDAwMDAwZjk4LAogICAgICAgIDB4Zjk5MDAwMDBmOWQsCiAgICAgICAgMHhmOWUwMDAwMGZhMiwKICAgICAgICAweGZhMzAwMDAwZmE3LAogICAgICAgIDB4ZmE4MDAwMDBmYWMsCiAgICAgICAgMHhmYWQwMDAwMGZiOSwKICAgICAgICAweGZiYTAwMDAwZmJkLAogICAgICAgIDB4ZmM2MDAwMDBmYzcsCiAgICAgICAgMHgxMDAwMDAwMDEwNGEsCiAgICAgICAgMHgxMDUwMDAwMDEwOWUsCiAgICAgICAgMHgxMGQwMDAwMDEwZmIsCiAgICAgICAgMHgxMGZkMDAwMDExMDAsCiAgICAgICAgMHgxMjAwMDAwMDEyNDksCiAgICAgICAgMHgxMjRhMDAwMDEyNGUsCiAgICAgICAgMHgxMjUwMDAwMDEyNTcsCiAgICAgICAgMHgxMjU4MDAwMDEyNTksCiAgICAgICAgMHgxMjVhMDAwMDEyNWUsCiAgICAgICAgMHgxMjYwMDAwMDEyODksCiAgICAgICAgMHgxMjhhMDAwMDEyOGUsCiAgICAgICAgMHgxMjkwMDAwMDEyYjEsCiAgICAgICAgMHgxMmIyMDAwMDEyYjYsCiAgICAgICAgMHgxMmI4MDAwMDEyYmYsCiAgICAgICAgMHgxMmMwMDAwMDEyYzEsCiAgICAgICAgMHgxMmMyMDAwMDEyYzYsCiAgICAgICAgMHgxMmM4MDAwMDEyZDcsCiAgICAgICAgMHgxMmQ4MDAwMDEzMTEsCiAgICAgICAgMHgxMzEyMDAwMDEzMTYsCiAgICAgICAgMHgxMzE4MDAwMDEzNWIsCiAgICAgICAgMHgxMzVkMDAwMDEzNjAsCiAgICAgICAgMHgxMzgwMDAwMDEzOTAsCiAgICAgICAgMHgxM2EwMDAwMDEzZjUsCiAgICAgICAgMHgxNDAxMDAwMDE2NmQsCiAgICAgICAgMHgxNjZmMDAwMDE2ODAsCiAgICAgICAgMHgxNjgxMDAwMDE2OWIsCiAgICAgICAgMHgxNmEwMDAwMDE2ZWIsCiAgICAgICAgMHgxNzAwMDAwMDE3MGQsCiAgICAgICAgMHgxNzBlMDAwMDE3MTUsCiAgICAgICAgMHgxNzIwMDAwMDE3MzUsCiAgICAgICAgMHgxNzQwMDAwMDE3NTQsCiAgICAgICAgMHgxNzYwMDAwMDE3NmQsCiAgICAgICAgMHgxNzZlMDAwMDE3NzEsCiAgICAgICAgMHgxNzcyMDAwMDE3NzQsCiAgICAgICAgMHgxNzgwMDAwMDE3YjQsCiAgICAgICAgMHgxN2I2MDAwMDE3ZDQsCiAgICAgICAgMHgxN2Q3MDAwMDE3ZDgsCiAgICAgICAgMHgxN2RjMDAwMDE3ZGUsCiAgICAgICAgMHgxN2UwMDAwMDE3ZWEsCiAgICAgICAgMHgxODEwMDAwMDE4MWEsCiAgICAgICAgMHgxODIwMDAwMDE4NzgsCiAgICAgICAgMHgxODgwMDAwMDE4YWIsCiAgICAgICAgMHgxOGIwMDAwMDE4ZjYsCiAgICAgICAgMHgxOTAwMDAwMDE5MWQsCiAgICAgICAgMHgxOTIwMDAwMDE5MmMsCiAgICAgICAgMHgxOTMwMDAwMDE5M2MsCiAgICAgICAgMHgxOTQ2MDAwMDE5NmUsCiAgICAgICAgMHgxOTcwMDAwMDE5NzUsCiAgICAgICAgMHgxOTgwMDAwMDE5YWMsCiAgICAgICAgMHgxOWIwMDAwMDE5Y2EsCiAgICAgICAgMHgxOWQwMDAwMDE5ZGEsCiAgICAgICAgMHgxYTAwMDAwMDFhMWMsCiAgICAgICAgMHgxYTIwMDAwMDFhNWYsCiAgICAgICAgMHgxYTYwMDAwMDFhN2QsCiAgICAgICAgMHgxYTdmMDAwMDFhOGEsCiAgICAgICAgMHgxYTkwMDAwMDFhOWEsCiAgICAgICAgMHgxYWE3MDAwMDFhYTgsCiAgICAgICAgMHgxYjAwMDAwMDFiNGMsCiAgICAgICAgMHgxYjUwMDAwMDFiNWEsCiAgICAgICAgMHgxYjZiMDAwMDFiNzQsCiAgICAgICAgMHgxYjgwMDAwMDFiZjQsCiAgICAgICAgMHgxYzAwMDAwMDFjMzgsCiAgICAgICAgMHgxYzQwMDAwMDFjNGEsCiAgICAgICAgMHgxYzRkMDAwMDFjN2UsCiAgICAgICAgMHgxY2QwMDAwMDFjZDMsCiAgICAgICAgMHgxY2Q0MDAwMDFjZjcsCiAgICAgICAgMHgxZDAwMDAwMDFkMmMsCiAgICAgICAgMHgxZDJmMDAwMDFkMzAsCiAgICAgICAgMHgxZDNiMDAwMDFkM2MsCiAgICAgICAgMHgxZDRlMDAwMDFkNGYsCiAgICAgICAgMHgxZDZiMDAwMDFkNzgsCiAgICAgICAgMHgxZDc5MDAwMDFkOWIsCiAgICAgICAgMHgxZGMwMDAwMDFkZTcsCiAgICAgICAgMHgxZGZjMDAwMDFlMDAsCiAgICAgICAgMHgxZTAxMDAwMDFlMDIsCiAgICAgICAgMHgxZTAzMDAwMDFlMDQsCiAgICAgICAgMHgxZTA1MDAwMDFlMDYsCiAgICAgICAgMHgxZTA3MDAwMDFlMDgsCiAgICAgICAgMHgxZTA5MDAwMDFlMGEsCiAgICAgICAgMHgxZTBiMDAwMDFlMGMsCiAgICAgICAgMHgxZTBkMDAwMDFlMGUsCiAgICAgICAgMHgxZTBmMDAwMDFlMTAsCiAgICAgICAgMHgxZTExMDAwMDFlMTIsCiAgICAgICAgMHgxZTEzMDAwMDFlMTQsCiAgICAgICAgMHgxZTE1MDAwMDFlMTYsCiAgICAgICAgMHgxZTE3MDAwMDFlMTgsCiAgICAgICAgMHgxZTE5MDAwMDFlMWEsCiAgICAgICAgMHgxZTFiMDAwMDFlMWMsCiAgICAgICAgMHgxZTFkMDAwMDFlMWUsCiAgICAgICAgMHgxZTFmMDAwMDFlMjAsCiAgICAgICAgMHgxZTIxMDAwMDFlMjIsCiAgICAgICAgMHgxZTIzMDAwMDFlMjQsCiAgICAgICAgMHgxZTI1MDAwMDFlMjYsCiAgICAgICAgMHgxZTI3MDAwMDFlMjgsCiAgICAgICAgMHgxZTI5MDAwMDFlMmEsCiAgICAgICAgMHgxZTJiMDAwMDFlMmMsCiAgICAgICAgMHgxZTJkMDAwMDFlMmUsCiAgICAgICAgMHgxZTJmMDAwMDFlMzAsCiAgICAgICAgMHgxZTMxMDAwMDFlMzIsCiAgICAgICAgMHgxZTMzMDAwMDFlMzQsCiAgICAgICAgMHgxZTM1MDAwMDFlMzYsCiAgICAgICAgMHgxZTM3MDAwMDFlMzgsCiAgICAgICAgMHgxZTM5MDAwMDFlM2EsCiAgICAgICAgMHgxZTNiMDAwMDFlM2MsCiAgICAgICAgMHgxZTNkMDAwMDFlM2UsCiAgICAgICAgMHgxZTNmMDAwMDFlNDAsCiAgICAgICAgMHgxZTQxMDAwMDFlNDIsCiAgICAgICAgMHgxZTQzMDAwMDFlNDQsCiAgICAgICAgMHgxZTQ1MDAwMDFlNDYsCiAgICAgICAgMHgxZTQ3MDAwMDFlNDgsCiAgICAgICAgMHgxZTQ5MDAwMDFlNGEsCiAgICAgICAgMHgxZTRiMDAwMDFlNGMsCiAgICAgICAgMHgxZTRkMDAwMDFlNGUsCiAgICAgICAgMHgxZTRmMDAwMDFlNTAsCiAgICAgICAgMHgxZTUxMDAwMDFlNTIsCiAgICAgICAgMHgxZTUzMDAwMDFlNTQsCiAgICAgICAgMHgxZTU1MDAwMDFlNTYsCiAgICAgICAgMHgxZTU3MDAwMDFlNTgsCiAgICAgICAgMHgxZTU5MDAwMDFlNWEsCiAgICAgICAgMHgxZTViMDAwMDFlNWMsCiAgICAgICAgMHgxZTVkMDAwMDFlNWUsCiAgICAgICAgMHgxZTVmMDAwMDFlNjAsCiAgICAgICAgMHgxZTYxMDAwMDFlNjIsCiAgICAgICAgMHgxZTYzMDAwMDFlNjQsCiAgICAgICAgMHgxZTY1MDAwMDFlNjYsCiAgICAgICAgMHgxZTY3MDAwMDFlNjgsCiAgICAgICAgMHgxZTY5MDAwMDFlNmEsCiAgICAgICAgMHgxZTZiMDAwMDFlNmMsCiAgICAgICAgMHgxZTZkMDAwMDFlNmUsCiAgICAgICAgMHgxZTZmMDAwMDFlNzAsCiAgICAgICAgMHgxZTcxMDAwMDFlNzIsCiAgICAgICAgMHgxZTczMDAwMDFlNzQsCiAgICAgICAgMHgxZTc1MDAwMDFlNzYsCiAgICAgICAgMHgxZTc3MDAwMDFlNzgsCiAgICAgICAgMHgxZTc5MDAwMDFlN2EsCiAgICAgICAgMHgxZTdiMDAwMDFlN2MsCiAgICAgICAgMHgxZTdkMDAwMDFlN2UsCiAgICAgICAgMHgxZTdmMDAwMDFlODAsCiAgICAgICAgMHgxZTgxMDAwMDFlODIsCiAgICAgICAgMHgxZTgzMDAwMDFlODQsCiAgICAgICAgMHgxZTg1MDAwMDFlODYsCiAgICAgICAgMHgxZTg3MDAwMDFlODgsCiAgICAgICAgMHgxZTg5MDAwMDFlOGEsCiAgICAgICAgMHgxZThiMDAwMDFlOGMsCiAgICAgICAgMHgxZThkMDAwMDFlOGUsCiAgICAgICAgMHgxZThmMDAwMDFlOTAsCiAgICAgICAgMHgxZTkxMDAwMDFlOTIsCiAgICAgICAgMHgxZTkzMDAwMDFlOTQsCiAgICAgICAgMHgxZTk1MDAwMDFlOWEsCiAgICAgICAgMHgxZTljMDAwMDFlOWUsCiAgICAgICAgMHgxZTlmMDAwMDFlYTAsCiAgICAgICAgMHgxZWExMDAwMDFlYTIsCiAgICAgICAgMHgxZWEzMDAwMDFlYTQsCiAgICAgICAgMHgxZWE1MDAwMDFlYTYsCiAgICAgICAgMHgxZWE3MDAwMDFlYTgsCiAgICAgICAgMHgxZWE5MDAwMDFlYWEsCiAgICAgICAgMHgxZWFiMDAwMDFlYWMsCiAgICAgICAgMHgxZWFkMDAwMDFlYWUsCiAgICAgICAgMHgxZWFmMDAwMDFlYjAsCiAgICAgICAgMHgxZWIxMDAwMDFlYjIsCiAgICAgICAgMHgxZWIzMDAwMDFlYjQsCiAgICAgICAgMHgxZWI1MDAwMDFlYjYsCiAgICAgICAgMHgxZWI3MDAwMDFlYjgsCiAgICAgICAgMHgxZWI5MDAwMDFlYmEsCiAgICAgICAgMHgxZWJiMDAwMDFlYmMsCiAgICAgICAgMHgxZWJkMDAwMDFlYmUsCiAgICAgICAgMHgxZWJmMDAwMDFlYzAsCiAgICAgICAgMHgxZWMxMDAwMDFlYzIsCiAgICAgICAgMHgxZWMzMDAwMDFlYzQsCiAgICAgICAgMHgxZWM1MDAwMDFlYzYsCiAgICAgICAgMHgxZWM3MDAwMDFlYzgsCiAgICAgICAgMHgxZWM5MDAwMDFlY2EsCiAgICAgICAgMHgxZWNiMDAwMDFlY2MsCiAgICAgICAgMHgxZWNkMDAwMDFlY2UsCiAgICAgICAgMHgxZWNmMDAwMDFlZDAsCiAgICAgICAgMHgxZWQxMDAwMDFlZDIsCiAgICAgICAgMHgxZWQzMDAwMDFlZDQsCiAgICAgICAgMHgxZWQ1MDAwMDFlZDYsCiAgICAgICAgMHgxZWQ3MDAwMDFlZDgsCiAgICAgICAgMHgxZWQ5MDAwMDFlZGEsCiAgICAgICAgMHgxZWRiMDAwMDFlZGMsCiAgICAgICAgMHgxZWRkMDAwMDFlZGUsCiAgICAgICAgMHgxZWRmMDAwMDFlZTAsCiAgICAgICAgMHgxZWUxMDAwMDFlZTIsCiAgICAgICAgMHgxZWUzMDAwMDFlZTQsCiAgICAgICAgMHgxZWU1MDAwMDFlZTYsCiAgICAgICAgMHgxZWU3MDAwMDFlZTgsCiAgICAgICAgMHgxZWU5MDAwMDFlZWEsCiAgICAgICAgMHgxZWViMDAwMDFlZWMsCiAgICAgICAgMHgxZWVkMDAwMDFlZWUsCiAgICAgICAgMHgxZWVmMDAwMDFlZjAsCiAgICAgICAgMHgxZWYxMDAwMDFlZjIsCiAgICAgICAgMHgxZWYzMDAwMDFlZjQsCiAgICAgICAgMHgxZWY1MDAwMDFlZjYsCiAgICAgICAgMHgxZWY3MDAwMDFlZjgsCiAgICAgICAgMHgxZWY5MDAwMDFlZmEsCiAgICAgICAgMHgxZWZiMDAwMDFlZmMsCiAgICAgICAgMHgxZWZkMDAwMDFlZmUsCiAgICAgICAgMHgxZWZmMDAwMDFmMDgsCiAgICAgICAgMHgxZjEwMDAwMDFmMTYsCiAgICAgICAgMHgxZjIwMDAwMDFmMjgsCiAgICAgICAgMHgxZjMwMDAwMDFmMzgsCiAgICAgICAgMHgxZjQwMDAwMDFmNDYsCiAgICAgICAgMHgxZjUwMDAwMDFmNTgsCiAgICAgICAgMHgxZjYwMDAwMDFmNjgsCiAgICAgICAgMHgxZjcwMDAwMDFmNzEsCiAgICAgICAgMHgxZjcyMDAwMDFmNzMsCiAgICAgICAgMHgxZjc0MDAwMDFmNzUsCiAgICAgICAgMHgxZjc2MDAwMDFmNzcsCiAgICAgICAgMHgxZjc4MDAwMDFmNzksCiAgICAgICAgMHgxZjdhMDAwMDFmN2IsCiAgICAgICAgMHgxZjdjMDAwMDFmN2QsCiAgICAgICAgMHgxZmIwMDAwMDFmYjIsCiAgICAgICAgMHgxZmI2MDAwMDFmYjcsCiAgICAgICAgMHgxZmM2MDAwMDFmYzcsCiAgICAgICAgMHgxZmQwMDAwMDFmZDMsCiAgICAgICAgMHgxZmQ2MDAwMDFmZDgsCiAgICAgICAgMHgxZmUwMDAwMDFmZTMsCiAgICAgICAgMHgxZmU0MDAwMDFmZTgsCiAgICAgICAgMHgxZmY2MDAwMDFmZjcsCiAgICAgICAgMHgyMTRlMDAwMDIxNGYsCiAgICAgICAgMHgyMTg0MDAwMDIxODUsCiAgICAgICAgMHgyYzMwMDAwMDJjNWYsCiAgICAgICAgMHgyYzYxMDAwMDJjNjIsCiAgICAgICAgMHgyYzY1MDAwMDJjNjcsCiAgICAgICAgMHgyYzY4MDAwMDJjNjksCiAgICAgICAgMHgyYzZhMDAwMDJjNmIsCiAgICAgICAgMHgyYzZjMDAwMDJjNmQsCiAgICAgICAgMHgyYzcxMDAwMDJjNzIsCiAgICAgICAgMHgyYzczMDAwMDJjNzUsCiAgICAgICAgMHgyYzc2MDAwMDJjN2MsCiAgICAgICAgMHgyYzgxMDAwMDJjODIsCiAgICAgICAgMHgyYzgzMDAwMDJjODQsCiAgICAgICAgMHgyYzg1MDAwMDJjODYsCiAgICAgICAgMHgyYzg3MDAwMDJjODgsCiAgICAgICAgMHgyYzg5MDAwMDJjOGEsCiAgICAgICAgMHgyYzhiMDAwMDJjOGMsCiAgICAgICAgMHgyYzhkMDAwMDJjOGUsCiAgICAgICAgMHgyYzhmMDAwMDJjOTAsCiAgICAgICAgMHgyYzkxMDAwMDJjOTIsCiAgICAgICAgMHgyYzkzMDAwMDJjOTQsCiAgICAgICAgMHgyYzk1MDAwMDJjOTYsCiAgICAgICAgMHgyYzk3MDAwMDJjOTgsCiAgICAgICAgMHgyYzk5MDAwMDJjOWEsCiAgICAgICAgMHgyYzliMDAwMDJjOWMsCiAgICAgICAgMHgyYzlkMDAwMDJjOWUsCiAgICAgICAgMHgyYzlmMDAwMDJjYTAsCiAgICAgICAgMHgyY2ExMDAwMDJjYTIsCiAgICAgICAgMHgyY2EzMDAwMDJjYTQsCiAgICAgICAgMHgyY2E1MDAwMDJjYTYsCiAgICAgICAgMHgyY2E3MDAwMDJjYTgsCiAgICAgICAgMHgyY2E5MDAwMDJjYWEsCiAgICAgICAgMHgyY2FiMDAwMDJjYWMsCiAgICAgICAgMHgyY2FkMDAwMDJjYWUsCiAgICAgICAgMHgyY2FmMDAwMDJjYjAsCiAgICAgICAgMHgyY2IxMDAwMDJjYjIsCiAgICAgICAgMHgyY2IzMDAwMDJjYjQsCiAgICAgICAgMHgyY2I1MDAwMDJjYjYsCiAgICAgICAgMHgyY2I3MDAwMDJjYjgsCiAgICAgICAgMHgyY2I5MDAwMDJjYmEsCiAgICAgICAgMHgyY2JiMDAwMDJjYmMsCiAgICAgICAgMHgyY2JkMDAwMDJjYmUsCiAgICAgICAgMHgyY2JmMDAwMDJjYzAsCiAgICAgICAgMHgyY2MxMDAwMDJjYzIsCiAgICAgICAgMHgyY2MzMDAwMDJjYzQsCiAgICAgICAgMHgyY2M1MDAwMDJjYzYsCiAgICAgICAgMHgyY2M3MDAwMDJjYzgsCiAgICAgICAgMHgyY2M5MDAwMDJjY2EsCiAgICAgICAgMHgyY2NiMDAwMDJjY2MsCiAgICAgICAgMHgyY2NkMDAwMDJjY2UsCiAgICAgICAgMHgyY2NmMDAwMDJjZDAsCiAgICAgICAgMHgyY2QxMDAwMDJjZDIsCiAgICAgICAgMHgyY2QzMDAwMDJjZDQsCiAgICAgICAgMHgyY2Q1MDAwMDJjZDYsCiAgICAgICAgMHgyY2Q3MDAwMDJjZDgsCiAgICAgICAgMHgyY2Q5MDAwMDJjZGEsCiAgICAgICAgMHgyY2RiMDAwMDJjZGMsCiAgICAgICAgMHgyY2RkMDAwMDJjZGUsCiAgICAgICAgMHgyY2RmMDAwMDJjZTAsCiAgICAgICAgMHgyY2UxMDAwMDJjZTIsCiAgICAgICAgMHgyY2UzMDAwMDJjZTUsCiAgICAgICAgMHgyY2VjMDAwMDJjZWQsCiAgICAgICAgMHgyY2VlMDAwMDJjZjIsCiAgICAgICAgMHgyY2YzMDAwMDJjZjQsCiAgICAgICAgMHgyZDAwMDAwMDJkMjYsCiAgICAgICAgMHgyZDI3MDAwMDJkMjgsCiAgICAgICAgMHgyZDJkMDAwMDJkMmUsCiAgICAgICAgMHgyZDMwMDAwMDJkNjgsCiAgICAgICAgMHgyZDdmMDAwMDJkOTcsCiAgICAgICAgMHgyZGEwMDAwMDJkYTcsCiAgICAgICAgMHgyZGE4MDAwMDJkYWYsCiAgICAgICAgMHgyZGIwMDAwMDJkYjcsCiAgICAgICAgMHgyZGI4MDAwMDJkYmYsCiAgICAgICAgMHgyZGMwMDAwMDJkYzcsCiAgICAgICAgMHgyZGM4MDAwMDJkY2YsCiAgICAgICAgMHgyZGQwMDAwMDJkZDcsCiAgICAgICAgMHgyZGQ4MDAwMDJkZGYsCiAgICAgICAgMHgyZGUwMDAwMDJlMDAsCiAgICAgICAgMHgyZTJmMDAwMDJlMzAsCiAgICAgICAgMHgzMDA1MDAwMDMwMDgsCiAgICAgICAgMHgzMDJhMDAwMDMwMmUsCiAgICAgICAgMHgzMDNjMDAwMDMwM2QsCiAgICAgICAgMHgzMDQxMDAwMDMwOTcsCiAgICAgICAgMHgzMDk5MDAwMDMwOWIsCiAgICAgICAgMHgzMDlkMDAwMDMwOWYsCiAgICAgICAgMHgzMGExMDAwMDMwZmIsCiAgICAgICAgMHgzMGZjMDAwMDMwZmYsCiAgICAgICAgMHgzMTA1MDAwMDMxMmUsCiAgICAgICAgMHgzMWEwMDAwMDMxYmIsCiAgICAgICAgMHgzMWYwMDAwMDMyMDAsCiAgICAgICAgMHgzNDAwMDAwMDRkYjYsCiAgICAgICAgMHg0ZTAwMDAwMDlmY2QsCiAgICAgICAgMHhhMDAwMDAwMGE0OGQsCiAgICAgICAgMHhhNGQwMDAwMGE0ZmUsCiAgICAgICAgMHhhNTAwMDAwMGE2MGQsCiAgICAgICAgMHhhNjEwMDAwMGE2MmMsCiAgICAgICAgMHhhNjQxMDAwMGE2NDIsCiAgICAgICAgMHhhNjQzMDAwMGE2NDQsCiAgICAgICAgMHhhNjQ1MDAwMGE2NDYsCiAgICAgICAgMHhhNjQ3MDAwMGE2NDgsCiAgICAgICAgMHhhNjQ5MDAwMGE2NGEsCiAgICAgICAgMHhhNjRiMDAwMGE2NGMsCiAgICAgICAgMHhhNjRkMDAwMGE2NGUsCiAgICAgICAgMHhhNjRmMDAwMGE2NTAsCiAgICAgICAgMHhhNjUxMDAwMGE2NTIsCiAgICAgICAgMHhhNjUzMDAwMGE2NTQsCiAgICAgICAgMHhhNjU1MDAwMGE2NTYsCiAgICAgICAgMHhhNjU3MDAwMGE2NTgsCiAgICAgICAgMHhhNjU5MDAwMGE2NWEsCiAgICAgICAgMHhhNjViMDAwMGE2NWMsCiAgICAgICAgMHhhNjVkMDAwMGE2NWUsCiAgICAgICAgMHhhNjVmMDAwMGE2NjAsCiAgICAgICAgMHhhNjYxMDAwMGE2NjIsCiAgICAgICAgMHhhNjYzMDAwMGE2NjQsCiAgICAgICAgMHhhNjY1MDAwMGE2NjYsCiAgICAgICAgMHhhNjY3MDAwMGE2NjgsCiAgICAgICAgMHhhNjY5MDAwMGE2NmEsCiAgICAgICAgMHhhNjZiMDAwMGE2NmMsCiAgICAgICAgMHhhNjZkMDAwMGE2NzAsCiAgICAgICAgMHhhNjc0MDAwMGE2N2UsCiAgICAgICAgMHhhNjdmMDAwMGE2ODAsCiAgICAgICAgMHhhNjgxMDAwMGE2ODIsCiAgICAgICAgMHhhNjgzMDAwMGE2ODQsCiAgICAgICAgMHhhNjg1MDAwMGE2ODYsCiAgICAgICAgMHhhNjg3MDAwMGE2ODgsCiAgICAgICAgMHhhNjg5MDAwMGE2OGEsCiAgICAgICAgMHhhNjhiMDAwMGE2OGMsCiAgICAgICAgMHhhNjhkMDAwMGE2OGUsCiAgICAgICAgMHhhNjhmMDAwMGE2OTAsCiAgICAgICAgMHhhNjkxMDAwMGE2OTIsCiAgICAgICAgMHhhNjkzMDAwMGE2OTQsCiAgICAgICAgMHhhNjk1MDAwMGE2OTYsCiAgICAgICAgMHhhNjk3MDAwMGE2OTgsCiAgICAgICAgMHhhNjlmMDAwMGE2ZTYsCiAgICAgICAgMHhhNmYwMDAwMGE2ZjIsCiAgICAgICAgMHhhNzE3MDAwMGE3MjAsCiAgICAgICAgMHhhNzIzMDAwMGE3MjQsCiAgICAgICAgMHhhNzI1MDAwMGE3MjYsCiAgICAgICAgMHhhNzI3MDAwMGE3MjgsCiAgICAgICAgMHhhNzI5MDAwMGE3MmEsCiAgICAgICAgMHhhNzJiMDAwMGE3MmMsCiAgICAgICAgMHhhNzJkMDAwMGE3MmUsCiAgICAgICAgMHhhNzJmMDAwMGE3MzIsCiAgICAgICAgMHhhNzMzMDAwMGE3MzQsCiAgICAgICAgMHhhNzM1MDAwMGE3MzYsCiAgICAgICAgMHhhNzM3MDAwMGE3MzgsCiAgICAgICAgMHhhNzM5MDAwMGE3M2EsCiAgICAgICAgMHhhNzNiMDAwMGE3M2MsCiAgICAgICAgMHhhNzNkMDAwMGE3M2UsCiAgICAgICAgMHhhNzNmMDAwMGE3NDAsCiAgICAgICAgMHhhNzQxMDAwMGE3NDIsCiAgICAgICAgMHhhNzQzMDAwMGE3NDQsCiAgICAgICAgMHhhNzQ1MDAwMGE3NDYsCiAgICAgICAgMHhhNzQ3MDAwMGE3NDgsCiAgICAgICAgMHhhNzQ5MDAwMGE3NGEsCiAgICAgICAgMHhhNzRiMDAwMGE3NGMsCiAgICAgICAgMHhhNzRkMDAwMGE3NGUsCiAgICAgICAgMHhhNzRmMDAwMGE3NTAsCiAgICAgICAgMHhhNzUxMDAwMGE3NTIsCiAgICAgICAgMHhhNzUzMDAwMGE3NTQsCiAgICAgICAgMHhhNzU1MDAwMGE3NTYsCiAgICAgICAgMHhhNzU3MDAwMGE3NTgsCiAgICAgICAgMHhhNzU5MDAwMGE3NWEsCiAgICAgICAgMHhhNzViMDAwMGE3NWMsCiAgICAgICAgMHhhNzVkMDAwMGE3NWUsCiAgICAgICAgMHhhNzVmMDAwMGE3NjAsCiAgICAgICAgMHhhNzYxMDAwMGE3NjIsCiAgICAgICAgMHhhNzYzMDAwMGE3NjQsCiAgICAgICAgMHhhNzY1MDAwMGE3NjYsCiAgICAgICAgMHhhNzY3MDAwMGE3NjgsCiAgICAgICAgMHhhNzY5MDAwMGE3NmEsCiAgICAgICAgMHhhNzZiMDAwMGE3NmMsCiAgICAgICAgMHhhNzZkMDAwMGE3NmUsCiAgICAgICAgMHhhNzZmMDAwMGE3NzAsCiAgICAgICAgMHhhNzcxMDAwMGE3NzksCiAgICAgICAgMHhhNzdhMDAwMGE3N2IsCiAgICAgICAgMHhhNzdjMDAwMGE3N2QsCiAgICAgICAgMHhhNzdmMDAwMGE3ODAsCiAgICAgICAgMHhhNzgxMDAwMGE3ODIsCiAgICAgICAgMHhhNzgzMDAwMGE3ODQsCiAgICAgICAgMHhhNzg1MDAwMGE3ODYsCiAgICAgICAgMHhhNzg3MDAwMGE3ODksCiAgICAgICAgMHhhNzhjMDAwMGE3OGQsCiAgICAgICAgMHhhNzhlMDAwMGE3OGYsCiAgICAgICAgMHhhNzkxMDAwMGE3OTIsCiAgICAgICAgMHhhNzkzMDAwMGE3OTQsCiAgICAgICAgMHhhN2ExMDAwMGE3YTIsCiAgICAgICAgMHhhN2EzMDAwMGE3YTQsCiAgICAgICAgMHhhN2E1MDAwMGE3YTYsCiAgICAgICAgMHhhN2E3MDAwMGE3YTgsCiAgICAgICAgMHhhN2E5MDAwMGE3YWEsCiAgICAgICAgMHhhN2ZhMDAwMGE4MjgsCiAgICAgICAgMHhhODQwMDAwMGE4NzQsCiAgICAgICAgMHhhODgwMDAwMGE4YzUsCiAgICAgICAgMHhhOGQwMDAwMGE4ZGEsCiAgICAgICAgMHhhOGUwMDAwMGE4ZjgsCiAgICAgICAgMHhhOGZiMDAwMGE4ZmMsCiAgICAgICAgMHhhOTAwMDAwMGE5MmUsCiAgICAgICAgMHhhOTMwMDAwMGE5NTQsCiAgICAgICAgMHhhOTgwMDAwMGE5YzEsCiAgICAgICAgMHhhOWNmMDAwMGE5ZGEsCiAgICAgICAgMHhhYTAwMDAwMGFhMzcsCiAgICAgICAgMHhhYTQwMDAwMGFhNGUsCiAgICAgICAgMHhhYTUwMDAwMGFhNWEsCiAgICAgICAgMHhhYTYwMDAwMGFhNzcsCiAgICAgICAgMHhhYTdhMDAwMGFhN2MsCiAgICAgICAgMHhhYTgwMDAwMGFhYzMsCiAgICAgICAgMHhhYWRiMDAwMGFhZGUsCiAgICAgICAgMHhhYWUwMDAwMGFhZjAsCiAgICAgICAgMHhhYWYyMDAwMGFhZjcsCiAgICAgICAgMHhhYjAxMDAwMGFiMDcsCiAgICAgICAgMHhhYjA5MDAwMGFiMGYsCiAgICAgICAgMHhhYjExMDAwMGFiMTcsCiAgICAgICAgMHhhYjIwMDAwMGFiMjcsCiAgICAgICAgMHhhYjI4MDAwMGFiMmYsCiAgICAgICAgMHhhYmMwMDAwMGFiZWIsCiAgICAgICAgMHhhYmVjMDAwMGFiZWUsCiAgICAgICAgMHhhYmYwMDAwMGFiZmEsCiAgICAgICAgMHhhYzAwMDAwMGQ3YTQsCiAgICAgICAgMHhmYTBlMDAwMGZhMTAsCiAgICAgICAgMHhmYTExMDAwMGZhMTIsCiAgICAgICAgMHhmYTEzMDAwMGZhMTUsCiAgICAgICAgMHhmYTFmMDAwMGZhMjAsCiAgICAgICAgMHhmYTIxMDAwMGZhMjIsCiAgICAgICAgMHhmYTIzMDAwMGZhMjUsCiAgICAgICAgMHhmYTI3MDAwMGZhMmEsCiAgICAgICAgMHhmYjFlMDAwMGZiMWYsCiAgICAgICAgMHhmZTIwMDAwMGZlMjcsCiAgICAgICAgMHhmZTczMDAwMGZlNzQsCiAgICAgICAgMHgxMDAwMDAwMDEwMDBjLAogICAgICAgIDB4MTAwMGQwMDAxMDAyNywKICAgICAgICAweDEwMDI4MDAwMTAwM2IsCiAgICAgICAgMHgxMDAzYzAwMDEwMDNlLAogICAgICAgIDB4MTAwM2YwMDAxMDA0ZSwKICAgICAgICAweDEwMDUwMDAwMTAwNWUsCiAgICAgICAgMHgxMDA4MDAwMDEwMGZiLAogICAgICAgIDB4MTAxZmQwMDAxMDFmZSwKICAgICAgICAweDEwMjgwMDAwMTAyOWQsCiAgICAgICAgMHgxMDJhMDAwMDEwMmQxLAogICAgICAgIDB4MTAzMDAwMDAxMDMxZiwKICAgICAgICAweDEwMzMwMDAwMTAzNDEsCiAgICAgICAgMHgxMDM0MjAwMDEwMzRhLAogICAgICAgIDB4MTAzODAwMDAxMDM5ZSwKICAgICAgICAweDEwM2EwMDAwMTAzYzQsCiAgICAgICAgMHgxMDNjODAwMDEwM2QwLAogICAgICAgIDB4MTA0MjgwMDAxMDQ5ZSwKICAgICAgICAweDEwNGEwMDAwMTA0YWEsCiAgICAgICAgMHgxMDgwMDAwMDEwODA2LAogICAgICAgIDB4MTA4MDgwMDAxMDgwOSwKICAgICAgICAweDEwODBhMDAwMTA4MzYsCiAgICAgICAgMHgxMDgzNzAwMDEwODM5LAogICAgICAgIDB4MTA4M2MwMDAxMDgzZCwKICAgICAgICAweDEwODNmMDAwMTA4NTYsCiAgICAgICAgMHgxMDkwMDAwMDEwOTE2LAogICAgICAgIDB4MTA5MjAwMDAxMDkzYSwKICAgICAgICAweDEwOTgwMDAwMTA5YjgsCiAgICAgICAgMHgxMDliZTAwMDEwOWMwLAogICAgICAgIDB4MTBhMDAwMDAxMGEwNCwKICAgICAgICAweDEwYTA1MDAwMTBhMDcsCiAgICAgICAgMHgxMGEwYzAwMDEwYTE0LAogICAgICAgIDB4MTBhMTUwMDAxMGExOCwKICAgICAgICAweDEwYTE5MDAwMTBhMzQsCiAgICAgICAgMHgxMGEzODAwMDEwYTNiLAogICAgICAgIDB4MTBhM2YwMDAxMGE0MCwKICAgICAgICAweDEwYTYwMDAwMTBhN2QsCiAgICAgICAgMHgxMGIwMDAwMDEwYjM2LAogICAgICAgIDB4MTBiNDAwMDAxMGI1NiwKICAgICAgICAweDEwYjYwMDAwMTBiNzMsCiAgICAgICAgMHgxMGMwMDAwMDEwYzQ5LAogICAgICAgIDB4MTEwMDAwMDAxMTA0NywKICAgICAgICAweDExMDY2MDAwMTEwNzAsCiAgICAgICAgMHgxMTA4MDAwMDExMGJiLAogICAgICAgIDB4MTEwZDAwMDAxMTBlOSwKICAgICAgICAweDExMGYwMDAwMTEwZmEsCiAgICAgICAgMHgxMTEwMDAwMDExMTM1LAogICAgICAgIDB4MTExMzYwMDAxMTE0MCwKICAgICAgICAweDExMTgwMDAwMTExYzUsCiAgICAgICAgMHgxMTFkMDAwMDExMWRhLAogICAgICAgIDB4MTE2ODAwMDAxMTZiOCwKICAgICAgICAweDExNmMwMDAwMTE2Y2EsCiAgICAgICAgMHgxMjAwMDAwMDEyMzZmLAogICAgICAgIDB4MTMwMDAwMDAxMzQyZiwKICAgICAgICAweDE2ODAwMDAwMTZhMzksCiAgICAgICAgMHgxNmYwMDAwMDE2ZjQ1LAogICAgICAgIDB4MTZmNTAwMDAxNmY3ZiwKICAgICAgICAweDE2ZjhmMDAwMTZmYTAsCiAgICAgICAgMHgxYjAwMDAwMDFiMDAyLAogICAgICAgIDB4MjAwMDAwMDAyYTZkNywKICAgICAgICAweDJhNzAwMDAwMmI3MzUsCiAgICAgICAgMHgyYjc0MDAwMDJiODFlLAogICAgKSwKICAgICdDT05URVhUSic6ICgKICAgICAgICAweDIwMGMwMDAwMjAwZSwKICAgICksCiAgICAnQ09OVEVYVE8nOiAoCiAgICAgICAgMHhiNzAwMDAwMGI4LAogICAgICAgIDB4Mzc1MDAwMDAzNzYsCiAgICAgICAgMHg1ZjMwMDAwMDVmNSwKICAgICAgICAweDY2MDAwMDAwNjZhLAogICAgICAgIDB4NmYwMDAwMDA2ZmEsCiAgICAgICAgMHgzMGZiMDAwMDMwZmMsCiAgICApLAp9ClBLAwQUAAAAAAAAACEAt2P0stUGAADVBgAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9pbnRyYW5nZXMucHkiIiIKR2l2ZW4gYSBsaXN0IG9mIGludGVnZXJzLCBtYWRlIHVwIG9mIChob3BlZnVsbHkpIGEgc21hbGwgbnVtYmVyIG9mIGxvbmcgcnVucwpvZiBjb25zZWN1dGl2ZSBpbnRlZ2VycywgY29tcHV0ZSBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtCigoc3RhcnQxLCBlbmQxKSwgKHN0YXJ0MiwgZW5kMikgLi4uKS4gVGhlbiBhbnN3ZXIgdGhlIHF1ZXN0aW9uICJ3YXMgeCBwcmVzZW50CmluIHRoZSBvcmlnaW5hbCBsaXN0PyIgaW4gdGltZSBPKGxvZygjIHJ1bnMpKS4KIiIiCgppbXBvcnQgYmlzZWN0CgpkZWYgaW50cmFuZ2VzX2Zyb21fbGlzdChsaXN0Xyk6CiAgICAiIiJSZXByZXNlbnQgYSBsaXN0IG9mIGludGVnZXJzIGFzIGEgc2VxdWVuY2Ugb2YgcmFuZ2VzOgogICAgKChzdGFydF8wLCBlbmRfMCksIChzdGFydF8xLCBlbmRfMSksIC4uLiksIHN1Y2ggdGhhdCB0aGUgb3JpZ2luYWwKICAgIGludGVnZXJzIGFyZSBleGFjdGx5IHRob3NlIHggc3VjaCB0aGF0IHN0YXJ0X2kgPD0geCA8IGVuZF9pIGZvciBzb21lIGkuCgogICAgUmFuZ2VzIGFyZSBlbmNvZGVkIGFzIHNpbmdsZSBpbnRlZ2VycyAoc3RhcnQgPDwgMzIgfCBlbmQpLCBub3QgYXMgdHVwbGVzLgogICAgIiIiCgogICAgc29ydGVkX2xpc3QgPSBzb3J0ZWQobGlzdF8pCiAgICByYW5nZXMgPSBbXQogICAgbGFzdF93cml0ZSA9IC0xCiAgICBmb3IgaSBpbiByYW5nZShsZW4oc29ydGVkX2xpc3QpKToKICAgICAgICBpZiBpKzEgPCBsZW4oc29ydGVkX2xpc3QpOgogICAgICAgICAgICBpZiBzb3J0ZWRfbGlzdFtpXSA9PSBzb3J0ZWRfbGlzdFtpKzFdLTE6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgIGN1cnJlbnRfcmFuZ2UgPSBzb3J0ZWRfbGlzdFtsYXN0X3dyaXRlKzE6aSsxXQogICAgICAgIHJhbmdlcy5hcHBlbmQoX2VuY29kZV9yYW5nZShjdXJyZW50X3JhbmdlWzBdLCBjdXJyZW50X3JhbmdlWy0xXSArIDEpKQogICAgICAgIGxhc3Rfd3JpdGUgPSBpCgogICAgcmV0dXJuIHR1cGxlKHJhbmdlcykKCmRlZiBfZW5jb2RlX3JhbmdlKHN0YXJ0LCBlbmQpOgogICAgcmV0dXJuIChzdGFydCA8PCAzMikgfCBlbmQKCmRlZiBfZGVjb2RlX3JhbmdlKHIpOgogICAgcmV0dXJuIChyID4+IDMyKSwgKHIgJiAoKDEgPDwgMzIpIC0gMSkpCgoKZGVmIGludHJhbmdlc19jb250YWluKGludF8sIHJhbmdlcyk6CiAgICAiIiJEZXRlcm1pbmUgaWYgYGludF9gIGZhbGxzIGludG8gb25lIG9mIHRoZSByYW5nZXMgaW4gYHJhbmdlc2AuIiIiCiAgICB0dXBsZV8gPSBfZW5jb2RlX3JhbmdlKGludF8sIDApCiAgICBwb3MgPSBiaXNlY3QuYmlzZWN0X2xlZnQocmFuZ2VzLCB0dXBsZV8pCiAgICAjIHdlIGNvdWxkIGJlIGltbWVkaWF0ZWx5IGFoZWFkIG9mIGEgdHVwbGUgKHN0YXJ0LCBlbmQpCiAgICAjIHdpdGggc3RhcnQgPCBpbnRfIDw9IGVuZAogICAgaWYgcG9zID4gMDoKICAgICAgICBsZWZ0LCByaWdodCA9IF9kZWNvZGVfcmFuZ2UocmFuZ2VzW3Bvcy0xXSkKICAgICAgICBpZiBsZWZ0IDw9IGludF8gPCByaWdodDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICMgb3Igd2UgY291bGQgYmUgaW1tZWRpYXRlbHkgYmVoaW5kIGEgdHVwbGUgKGludF8sIGVuZCkKICAgIGlmIHBvcyA8IGxlbihyYW5nZXMpOgogICAgICAgIGxlZnQsIF8gPSBfZGVjb2RlX3JhbmdlKHJhbmdlc1twb3NdKQogICAgICAgIGlmIGxlZnQgPT0gaW50XzoKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQpQSwMEFAAAAAAAAAAhABvnfaIVAAAAFQAAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvcGFja2FnZV9kYXRhLnB5X192ZXJzaW9uX18gPSAnMi42JwoKUEsDBBQAAAAAAAAAIQDJhYWFcNICAHDSAgA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL3V0czQ2ZGF0YS5weSMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRvb2xzL2lkbmEtZGF0YQojIHZpbTogc2V0IGZpbGVlbmNvZGluZz11dGYtOCA6CgoiIiJJRE5BIE1hcHBpbmcgVGFibGUgZnJvbSBVVFM0Ni4iIiIKCgpfX3ZlcnNpb25fXyA9ICI2LjMuMCIKZGVmIF9zZWdfMCgpOgogICAgcmV0dXJuIFsKICAgICgweDAsICczJyksCiAgICAoMHgxLCAnMycpLAogICAgKDB4MiwgJzMnKSwKICAgICgweDMsICczJyksCiAgICAoMHg0LCAnMycpLAogICAgKDB4NSwgJzMnKSwKICAgICgweDYsICczJyksCiAgICAoMHg3LCAnMycpLAogICAgKDB4OCwgJzMnKSwKICAgICgweDksICczJyksCiAgICAoMHhBLCAnMycpLAogICAgKDB4QiwgJzMnKSwKICAgICgweEMsICczJyksCiAgICAoMHhELCAnMycpLAogICAgKDB4RSwgJzMnKSwKICAgICgweEYsICczJyksCiAgICAoMHgxMCwgJzMnKSwKICAgICgweDExLCAnMycpLAogICAgKDB4MTIsICczJyksCiAgICAoMHgxMywgJzMnKSwKICAgICgweDE0LCAnMycpLAogICAgKDB4MTUsICczJyksCiAgICAoMHgxNiwgJzMnKSwKICAgICgweDE3LCAnMycpLAogICAgKDB4MTgsICczJyksCiAgICAoMHgxOSwgJzMnKSwKICAgICgweDFBLCAnMycpLAogICAgKDB4MUIsICczJyksCiAgICAoMHgxQywgJzMnKSwKICAgICgweDFELCAnMycpLAogICAgKDB4MUUsICczJyksCiAgICAoMHgxRiwgJzMnKSwKICAgICgweDIwLCAnMycpLAogICAgKDB4MjEsICczJyksCiAgICAoMHgyMiwgJzMnKSwKICAgICgweDIzLCAnMycpLAogICAgKDB4MjQsICczJyksCiAgICAoMHgyNSwgJzMnKSwKICAgICgweDI2LCAnMycpLAogICAgKDB4MjcsICczJyksCiAgICAoMHgyOCwgJzMnKSwKICAgICgweDI5LCAnMycpLAogICAgKDB4MkEsICczJyksCiAgICAoMHgyQiwgJzMnKSwKICAgICgweDJDLCAnMycpLAogICAgKDB4MkQsICdWJyksCiAgICAoMHgyRSwgJ1YnKSwKICAgICgweDJGLCAnMycpLAogICAgKDB4MzAsICdWJyksCiAgICAoMHgzMSwgJ1YnKSwKICAgICgweDMyLCAnVicpLAogICAgKDB4MzMsICdWJyksCiAgICAoMHgzNCwgJ1YnKSwKICAgICgweDM1LCAnVicpLAogICAgKDB4MzYsICdWJyksCiAgICAoMHgzNywgJ1YnKSwKICAgICgweDM4LCAnVicpLAogICAgKDB4MzksICdWJyksCiAgICAoMHgzQSwgJzMnKSwKICAgICgweDNCLCAnMycpLAogICAgKDB4M0MsICczJyksCiAgICAoMHgzRCwgJzMnKSwKICAgICgweDNFLCAnMycpLAogICAgKDB4M0YsICczJyksCiAgICAoMHg0MCwgJzMnKSwKICAgICgweDQxLCAnTScsIHUnYScpLAogICAgKDB4NDIsICdNJywgdSdiJyksCiAgICAoMHg0MywgJ00nLCB1J2MnKSwKICAgICgweDQ0LCAnTScsIHUnZCcpLAogICAgKDB4NDUsICdNJywgdSdlJyksCiAgICAoMHg0NiwgJ00nLCB1J2YnKSwKICAgICgweDQ3LCAnTScsIHUnZycpLAogICAgKDB4NDgsICdNJywgdSdoJyksCiAgICAoMHg0OSwgJ00nLCB1J2knKSwKICAgICgweDRBLCAnTScsIHUnaicpLAogICAgKDB4NEIsICdNJywgdSdrJyksCiAgICAoMHg0QywgJ00nLCB1J2wnKSwKICAgICgweDRELCAnTScsIHUnbScpLAogICAgKDB4NEUsICdNJywgdSduJyksCiAgICAoMHg0RiwgJ00nLCB1J28nKSwKICAgICgweDUwLCAnTScsIHUncCcpLAogICAgKDB4NTEsICdNJywgdSdxJyksCiAgICAoMHg1MiwgJ00nLCB1J3InKSwKICAgICgweDUzLCAnTScsIHUncycpLAogICAgKDB4NTQsICdNJywgdSd0JyksCiAgICAoMHg1NSwgJ00nLCB1J3UnKSwKICAgICgweDU2LCAnTScsIHUndicpLAogICAgKDB4NTcsICdNJywgdSd3JyksCiAgICAoMHg1OCwgJ00nLCB1J3gnKSwKICAgICgweDU5LCAnTScsIHUneScpLAogICAgKDB4NUEsICdNJywgdSd6JyksCiAgICAoMHg1QiwgJzMnKSwKICAgICgweDVDLCAnMycpLAogICAgKDB4NUQsICczJyksCiAgICAoMHg1RSwgJzMnKSwKICAgICgweDVGLCAnMycpLAogICAgKDB4NjAsICczJyksCiAgICAoMHg2MSwgJ1YnKSwKICAgICgweDYyLCAnVicpLAogICAgKDB4NjMsICdWJyksCiAgICBdCgpkZWYgX3NlZ18xKCk6CiAgICByZXR1cm4gWwogICAgKDB4NjQsICdWJyksCiAgICAoMHg2NSwgJ1YnKSwKICAgICgweDY2LCAnVicpLAogICAgKDB4NjcsICdWJyksCiAgICAoMHg2OCwgJ1YnKSwKICAgICgweDY5LCAnVicpLAogICAgKDB4NkEsICdWJyksCiAgICAoMHg2QiwgJ1YnKSwKICAgICgweDZDLCAnVicpLAogICAgKDB4NkQsICdWJyksCiAgICAoMHg2RSwgJ1YnKSwKICAgICgweDZGLCAnVicpLAogICAgKDB4NzAsICdWJyksCiAgICAoMHg3MSwgJ1YnKSwKICAgICgweDcyLCAnVicpLAogICAgKDB4NzMsICdWJyksCiAgICAoMHg3NCwgJ1YnKSwKICAgICgweDc1LCAnVicpLAogICAgKDB4NzYsICdWJyksCiAgICAoMHg3NywgJ1YnKSwKICAgICgweDc4LCAnVicpLAogICAgKDB4NzksICdWJyksCiAgICAoMHg3QSwgJ1YnKSwKICAgICgweDdCLCAnMycpLAogICAgKDB4N0MsICczJyksCiAgICAoMHg3RCwgJzMnKSwKICAgICgweDdFLCAnMycpLAogICAgKDB4N0YsICczJyksCiAgICAoMHg4MCwgJ1gnKSwKICAgICgweDgxLCAnWCcpLAogICAgKDB4ODIsICdYJyksCiAgICAoMHg4MywgJ1gnKSwKICAgICgweDg0LCAnWCcpLAogICAgKDB4ODUsICdYJyksCiAgICAoMHg4NiwgJ1gnKSwKICAgICgweDg3LCAnWCcpLAogICAgKDB4ODgsICdYJyksCiAgICAoMHg4OSwgJ1gnKSwKICAgICgweDhBLCAnWCcpLAogICAgKDB4OEIsICdYJyksCiAgICAoMHg4QywgJ1gnKSwKICAgICgweDhELCAnWCcpLAogICAgKDB4OEUsICdYJyksCiAgICAoMHg4RiwgJ1gnKSwKICAgICgweDkwLCAnWCcpLAogICAgKDB4OTEsICdYJyksCiAgICAoMHg5MiwgJ1gnKSwKICAgICgweDkzLCAnWCcpLAogICAgKDB4OTQsICdYJyksCiAgICAoMHg5NSwgJ1gnKSwKICAgICgweDk2LCAnWCcpLAogICAgKDB4OTcsICdYJyksCiAgICAoMHg5OCwgJ1gnKSwKICAgICgweDk5LCAnWCcpLAogICAgKDB4OUEsICdYJyksCiAgICAoMHg5QiwgJ1gnKSwKICAgICgweDlDLCAnWCcpLAogICAgKDB4OUQsICdYJyksCiAgICAoMHg5RSwgJ1gnKSwKICAgICgweDlGLCAnWCcpLAogICAgKDB4QTAsICczJywgdScgJyksCiAgICAoMHhBMSwgJ1YnKSwKICAgICgweEEyLCAnVicpLAogICAgKDB4QTMsICdWJyksCiAgICAoMHhBNCwgJ1YnKSwKICAgICgweEE1LCAnVicpLAogICAgKDB4QTYsICdWJyksCiAgICAoMHhBNywgJ1YnKSwKICAgICgweEE4LCAnMycsIHUnIMyIJyksCiAgICAoMHhBOSwgJ1YnKSwKICAgICgweEFBLCAnTScsIHUnYScpLAogICAgKDB4QUIsICdWJyksCiAgICAoMHhBQywgJ1YnKSwKICAgICgweEFELCAnSScpLAogICAgKDB4QUUsICdWJyksCiAgICAoMHhBRiwgJzMnLCB1JyDMhCcpLAogICAgKDB4QjAsICdWJyksCiAgICAoMHhCMSwgJ1YnKSwKICAgICgweEIyLCAnTScsIHUnMicpLAogICAgKDB4QjMsICdNJywgdSczJyksCiAgICAoMHhCNCwgJzMnLCB1JyDMgScpLAogICAgKDB4QjUsICdNJywgdSfOvCcpLAogICAgKDB4QjYsICdWJyksCiAgICAoMHhCNywgJ1YnKSwKICAgICgweEI4LCAnMycsIHUnIMynJyksCiAgICAoMHhCOSwgJ00nLCB1JzEnKSwKICAgICgweEJBLCAnTScsIHUnbycpLAogICAgKDB4QkIsICdWJyksCiAgICAoMHhCQywgJ00nLCB1JzHigYQ0JyksCiAgICAoMHhCRCwgJ00nLCB1JzHigYQyJyksCiAgICAoMHhCRSwgJ00nLCB1JzPigYQ0JyksCiAgICAoMHhCRiwgJ1YnKSwKICAgICgweEMwLCAnTScsIHUnw6AnKSwKICAgICgweEMxLCAnTScsIHUnw6EnKSwKICAgICgweEMyLCAnTScsIHUnw6InKSwKICAgICgweEMzLCAnTScsIHUnw6MnKSwKICAgICgweEM0LCAnTScsIHUnw6QnKSwKICAgICgweEM1LCAnTScsIHUnw6UnKSwKICAgICgweEM2LCAnTScsIHUnw6YnKSwKICAgICgweEM3LCAnTScsIHUnw6cnKSwKICAgIF0KCmRlZiBfc2VnXzIoKToKICAgIHJldHVybiBbCiAgICAoMHhDOCwgJ00nLCB1J8OoJyksCiAgICAoMHhDOSwgJ00nLCB1J8OpJyksCiAgICAoMHhDQSwgJ00nLCB1J8OqJyksCiAgICAoMHhDQiwgJ00nLCB1J8OrJyksCiAgICAoMHhDQywgJ00nLCB1J8OsJyksCiAgICAoMHhDRCwgJ00nLCB1J8OtJyksCiAgICAoMHhDRSwgJ00nLCB1J8OuJyksCiAgICAoMHhDRiwgJ00nLCB1J8OvJyksCiAgICAoMHhEMCwgJ00nLCB1J8OwJyksCiAgICAoMHhEMSwgJ00nLCB1J8OxJyksCiAgICAoMHhEMiwgJ00nLCB1J8OyJyksCiAgICAoMHhEMywgJ00nLCB1J8OzJyksCiAgICAoMHhENCwgJ00nLCB1J8O0JyksCiAgICAoMHhENSwgJ00nLCB1J8O1JyksCiAgICAoMHhENiwgJ00nLCB1J8O2JyksCiAgICAoMHhENywgJ1YnKSwKICAgICgweEQ4LCAnTScsIHUnw7gnKSwKICAgICgweEQ5LCAnTScsIHUnw7knKSwKICAgICgweERBLCAnTScsIHUnw7onKSwKICAgICgweERCLCAnTScsIHUnw7snKSwKICAgICgweERDLCAnTScsIHUnw7wnKSwKICAgICgweERELCAnTScsIHUnw70nKSwKICAgICgweERFLCAnTScsIHUnw74nKSwKICAgICgweERGLCAnRCcsIHUnc3MnKSwKICAgICgweEUwLCAnVicpLAogICAgKDB4RTEsICdWJyksCiAgICAoMHhFMiwgJ1YnKSwKICAgICgweEUzLCAnVicpLAogICAgKDB4RTQsICdWJyksCiAgICAoMHhFNSwgJ1YnKSwKICAgICgweEU2LCAnVicpLAogICAgKDB4RTcsICdWJyksCiAgICAoMHhFOCwgJ1YnKSwKICAgICgweEU5LCAnVicpLAogICAgKDB4RUEsICdWJyksCiAgICAoMHhFQiwgJ1YnKSwKICAgICgweEVDLCAnVicpLAogICAgKDB4RUQsICdWJyksCiAgICAoMHhFRSwgJ1YnKSwKICAgICgweEVGLCAnVicpLAogICAgKDB4RjAsICdWJyksCiAgICAoMHhGMSwgJ1YnKSwKICAgICgweEYyLCAnVicpLAogICAgKDB4RjMsICdWJyksCiAgICAoMHhGNCwgJ1YnKSwKICAgICgweEY1LCAnVicpLAogICAgKDB4RjYsICdWJyksCiAgICAoMHhGNywgJ1YnKSwKICAgICgweEY4LCAnVicpLAogICAgKDB4RjksICdWJyksCiAgICAoMHhGQSwgJ1YnKSwKICAgICgweEZCLCAnVicpLAogICAgKDB4RkMsICdWJyksCiAgICAoMHhGRCwgJ1YnKSwKICAgICgweEZFLCAnVicpLAogICAgKDB4RkYsICdWJyksCiAgICAoMHgxMDAsICdNJywgdSfEgScpLAogICAgKDB4MTAxLCAnVicpLAogICAgKDB4MTAyLCAnTScsIHUnxIMnKSwKICAgICgweDEwMywgJ1YnKSwKICAgICgweDEwNCwgJ00nLCB1J8SFJyksCiAgICAoMHgxMDUsICdWJyksCiAgICAoMHgxMDYsICdNJywgdSfEhycpLAogICAgKDB4MTA3LCAnVicpLAogICAgKDB4MTA4LCAnTScsIHUnxIknKSwKICAgICgweDEwOSwgJ1YnKSwKICAgICgweDEwQSwgJ00nLCB1J8SLJyksCiAgICAoMHgxMEIsICdWJyksCiAgICAoMHgxMEMsICdNJywgdSfEjScpLAogICAgKDB4MTBELCAnVicpLAogICAgKDB4MTBFLCAnTScsIHUnxI8nKSwKICAgICgweDEwRiwgJ1YnKSwKICAgICgweDExMCwgJ00nLCB1J8SRJyksCiAgICAoMHgxMTEsICdWJyksCiAgICAoMHgxMTIsICdNJywgdSfEkycpLAogICAgKDB4MTEzLCAnVicpLAogICAgKDB4MTE0LCAnTScsIHUnxJUnKSwKICAgICgweDExNSwgJ1YnKSwKICAgICgweDExNiwgJ00nLCB1J8SXJyksCiAgICAoMHgxMTcsICdWJyksCiAgICAoMHgxMTgsICdNJywgdSfEmScpLAogICAgKDB4MTE5LCAnVicpLAogICAgKDB4MTFBLCAnTScsIHUnxJsnKSwKICAgICgweDExQiwgJ1YnKSwKICAgICgweDExQywgJ00nLCB1J8SdJyksCiAgICAoMHgxMUQsICdWJyksCiAgICAoMHgxMUUsICdNJywgdSfEnycpLAogICAgKDB4MTFGLCAnVicpLAogICAgKDB4MTIwLCAnTScsIHUnxKEnKSwKICAgICgweDEyMSwgJ1YnKSwKICAgICgweDEyMiwgJ00nLCB1J8SjJyksCiAgICAoMHgxMjMsICdWJyksCiAgICAoMHgxMjQsICdNJywgdSfEpScpLAogICAgKDB4MTI1LCAnVicpLAogICAgKDB4MTI2LCAnTScsIHUnxKcnKSwKICAgICgweDEyNywgJ1YnKSwKICAgICgweDEyOCwgJ00nLCB1J8SpJyksCiAgICAoMHgxMjksICdWJyksCiAgICAoMHgxMkEsICdNJywgdSfEqycpLAogICAgKDB4MTJCLCAnVicpLAogICAgXQoKZGVmIF9zZWdfMygpOgogICAgcmV0dXJuIFsKICAgICgweDEyQywgJ00nLCB1J8StJyksCiAgICAoMHgxMkQsICdWJyksCiAgICAoMHgxMkUsICdNJywgdSfErycpLAogICAgKDB4MTJGLCAnVicpLAogICAgKDB4MTMwLCAnTScsIHUnacyHJyksCiAgICAoMHgxMzEsICdWJyksCiAgICAoMHgxMzIsICdNJywgdSdpaicpLAogICAgKDB4MTM0LCAnTScsIHUnxLUnKSwKICAgICgweDEzNSwgJ1YnKSwKICAgICgweDEzNiwgJ00nLCB1J8S3JyksCiAgICAoMHgxMzcsICdWJyksCiAgICAoMHgxMzksICdNJywgdSfEuicpLAogICAgKDB4MTNBLCAnVicpLAogICAgKDB4MTNCLCAnTScsIHUnxLwnKSwKICAgICgweDEzQywgJ1YnKSwKICAgICgweDEzRCwgJ00nLCB1J8S+JyksCiAgICAoMHgxM0UsICdWJyksCiAgICAoMHgxM0YsICdNJywgdSdswrcnKSwKICAgICgweDE0MSwgJ00nLCB1J8WCJyksCiAgICAoMHgxNDIsICdWJyksCiAgICAoMHgxNDMsICdNJywgdSfFhCcpLAogICAgKDB4MTQ0LCAnVicpLAogICAgKDB4MTQ1LCAnTScsIHUnxYYnKSwKICAgICgweDE0NiwgJ1YnKSwKICAgICgweDE0NywgJ00nLCB1J8WIJyksCiAgICAoMHgxNDgsICdWJyksCiAgICAoMHgxNDksICdNJywgdSfKvG4nKSwKICAgICgweDE0QSwgJ00nLCB1J8WLJyksCiAgICAoMHgxNEIsICdWJyksCiAgICAoMHgxNEMsICdNJywgdSfFjScpLAogICAgKDB4MTRELCAnVicpLAogICAgKDB4MTRFLCAnTScsIHUnxY8nKSwKICAgICgweDE0RiwgJ1YnKSwKICAgICgweDE1MCwgJ00nLCB1J8WRJyksCiAgICAoMHgxNTEsICdWJyksCiAgICAoMHgxNTIsICdNJywgdSfFkycpLAogICAgKDB4MTUzLCAnVicpLAogICAgKDB4MTU0LCAnTScsIHUnxZUnKSwKICAgICgweDE1NSwgJ1YnKSwKICAgICgweDE1NiwgJ00nLCB1J8WXJyksCiAgICAoMHgxNTcsICdWJyksCiAgICAoMHgxNTgsICdNJywgdSfFmScpLAogICAgKDB4MTU5LCAnVicpLAogICAgKDB4MTVBLCAnTScsIHUnxZsnKSwKICAgICgweDE1QiwgJ1YnKSwKICAgICgweDE1QywgJ00nLCB1J8WdJyksCiAgICAoMHgxNUQsICdWJyksCiAgICAoMHgxNUUsICdNJywgdSfFnycpLAogICAgKDB4MTVGLCAnVicpLAogICAgKDB4MTYwLCAnTScsIHUnxaEnKSwKICAgICgweDE2MSwgJ1YnKSwKICAgICgweDE2MiwgJ00nLCB1J8WjJyksCiAgICAoMHgxNjMsICdWJyksCiAgICAoMHgxNjQsICdNJywgdSfFpScpLAogICAgKDB4MTY1LCAnVicpLAogICAgKDB4MTY2LCAnTScsIHUnxacnKSwKICAgICgweDE2NywgJ1YnKSwKICAgICgweDE2OCwgJ00nLCB1J8WpJyksCiAgICAoMHgxNjksICdWJyksCiAgICAoMHgxNkEsICdNJywgdSfFqycpLAogICAgKDB4MTZCLCAnVicpLAogICAgKDB4MTZDLCAnTScsIHUnxa0nKSwKICAgICgweDE2RCwgJ1YnKSwKICAgICgweDE2RSwgJ00nLCB1J8WvJyksCiAgICAoMHgxNkYsICdWJyksCiAgICAoMHgxNzAsICdNJywgdSfFsScpLAogICAgKDB4MTcxLCAnVicpLAogICAgKDB4MTcyLCAnTScsIHUnxbMnKSwKICAgICgweDE3MywgJ1YnKSwKICAgICgweDE3NCwgJ00nLCB1J8W1JyksCiAgICAoMHgxNzUsICdWJyksCiAgICAoMHgxNzYsICdNJywgdSfFtycpLAogICAgKDB4MTc3LCAnVicpLAogICAgKDB4MTc4LCAnTScsIHUnw78nKSwKICAgICgweDE3OSwgJ00nLCB1J8W6JyksCiAgICAoMHgxN0EsICdWJyksCiAgICAoMHgxN0IsICdNJywgdSfFvCcpLAogICAgKDB4MTdDLCAnVicpLAogICAgKDB4MTdELCAnTScsIHUnxb4nKSwKICAgICgweDE3RSwgJ1YnKSwKICAgICgweDE3RiwgJ00nLCB1J3MnKSwKICAgICgweDE4MCwgJ1YnKSwKICAgICgweDE4MSwgJ00nLCB1J8mTJyksCiAgICAoMHgxODIsICdNJywgdSfGgycpLAogICAgKDB4MTgzLCAnVicpLAogICAgKDB4MTg0LCAnTScsIHUnxoUnKSwKICAgICgweDE4NSwgJ1YnKSwKICAgICgweDE4NiwgJ00nLCB1J8mUJyksCiAgICAoMHgxODcsICdNJywgdSfGiCcpLAogICAgKDB4MTg4LCAnVicpLAogICAgKDB4MTg5LCAnTScsIHUnyZYnKSwKICAgICgweDE4QSwgJ00nLCB1J8mXJyksCiAgICAoMHgxOEIsICdNJywgdSfGjCcpLAogICAgKDB4MThDLCAnVicpLAogICAgKDB4MThFLCAnTScsIHUnx50nKSwKICAgICgweDE4RiwgJ00nLCB1J8mZJyksCiAgICAoMHgxOTAsICdNJywgdSfJmycpLAogICAgKDB4MTkxLCAnTScsIHUnxpInKSwKICAgICgweDE5MiwgJ1YnKSwKICAgICgweDE5MywgJ00nLCB1J8mgJyksCiAgICBdCgpkZWYgX3NlZ180KCk6CiAgICByZXR1cm4gWwogICAgKDB4MTk0LCAnTScsIHUnyaMnKSwKICAgICgweDE5NSwgJ1YnKSwKICAgICgweDE5NiwgJ00nLCB1J8mpJyksCiAgICAoMHgxOTcsICdNJywgdSfJqCcpLAogICAgKDB4MTk4LCAnTScsIHUnxpknKSwKICAgICgweDE5OSwgJ1YnKSwKICAgICgweDE5QywgJ00nLCB1J8mvJyksCiAgICAoMHgxOUQsICdNJywgdSfJsicpLAogICAgKDB4MTlFLCAnVicpLAogICAgKDB4MTlGLCAnTScsIHUnybUnKSwKICAgICgweDFBMCwgJ00nLCB1J8ahJyksCiAgICAoMHgxQTEsICdWJyksCiAgICAoMHgxQTIsICdNJywgdSfGoycpLAogICAgKDB4MUEzLCAnVicpLAogICAgKDB4MUE0LCAnTScsIHUnxqUnKSwKICAgICgweDFBNSwgJ1YnKSwKICAgICgweDFBNiwgJ00nLCB1J8qAJyksCiAgICAoMHgxQTcsICdNJywgdSfGqCcpLAogICAgKDB4MUE4LCAnVicpLAogICAgKDB4MUE5LCAnTScsIHUnyoMnKSwKICAgICgweDFBQSwgJ1YnKSwKICAgICgweDFBQywgJ00nLCB1J8atJyksCiAgICAoMHgxQUQsICdWJyksCiAgICAoMHgxQUUsICdNJywgdSfKiCcpLAogICAgKDB4MUFGLCAnTScsIHUnxrAnKSwKICAgICgweDFCMCwgJ1YnKSwKICAgICgweDFCMSwgJ00nLCB1J8qKJyksCiAgICAoMHgxQjIsICdNJywgdSfKiycpLAogICAgKDB4MUIzLCAnTScsIHUnxrQnKSwKICAgICgweDFCNCwgJ1YnKSwKICAgICgweDFCNSwgJ00nLCB1J8a2JyksCiAgICAoMHgxQjYsICdWJyksCiAgICAoMHgxQjcsICdNJywgdSfKkicpLAogICAgKDB4MUI4LCAnTScsIHUnxrknKSwKICAgICgweDFCOSwgJ1YnKSwKICAgICgweDFCQywgJ00nLCB1J8a9JyksCiAgICAoMHgxQkQsICdWJyksCiAgICAoMHgxQzQsICdNJywgdSdkxb4nKSwKICAgICgweDFDNywgJ00nLCB1J2xqJyksCiAgICAoMHgxQ0EsICdNJywgdSduaicpLAogICAgKDB4MUNELCAnTScsIHUnx44nKSwKICAgICgweDFDRSwgJ1YnKSwKICAgICgweDFDRiwgJ00nLCB1J8eQJyksCiAgICAoMHgxRDAsICdWJyksCiAgICAoMHgxRDEsICdNJywgdSfHkicpLAogICAgKDB4MUQyLCAnVicpLAogICAgKDB4MUQzLCAnTScsIHUnx5QnKSwKICAgICgweDFENCwgJ1YnKSwKICAgICgweDFENSwgJ00nLCB1J8eWJyksCiAgICAoMHgxRDYsICdWJyksCiAgICAoMHgxRDcsICdNJywgdSfHmCcpLAogICAgKDB4MUQ4LCAnVicpLAogICAgKDB4MUQ5LCAnTScsIHUnx5onKSwKICAgICgweDFEQSwgJ1YnKSwKICAgICgweDFEQiwgJ00nLCB1J8ecJyksCiAgICAoMHgxREMsICdWJyksCiAgICAoMHgxREUsICdNJywgdSfHnycpLAogICAgKDB4MURGLCAnVicpLAogICAgKDB4MUUwLCAnTScsIHUnx6EnKSwKICAgICgweDFFMSwgJ1YnKSwKICAgICgweDFFMiwgJ00nLCB1J8ejJyksCiAgICAoMHgxRTMsICdWJyksCiAgICAoMHgxRTQsICdNJywgdSfHpScpLAogICAgKDB4MUU1LCAnVicpLAogICAgKDB4MUU2LCAnTScsIHUnx6cnKSwKICAgICgweDFFNywgJ1YnKSwKICAgICgweDFFOCwgJ00nLCB1J8epJyksCiAgICAoMHgxRTksICdWJyksCiAgICAoMHgxRUEsICdNJywgdSfHqycpLAogICAgKDB4MUVCLCAnVicpLAogICAgKDB4MUVDLCAnTScsIHUnx60nKSwKICAgICgweDFFRCwgJ1YnKSwKICAgICgweDFFRSwgJ00nLCB1J8evJyksCiAgICAoMHgxRUYsICdWJyksCiAgICAoMHgxRjEsICdNJywgdSdkeicpLAogICAgKDB4MUY0LCAnTScsIHUnx7UnKSwKICAgICgweDFGNSwgJ1YnKSwKICAgICgweDFGNiwgJ00nLCB1J8aVJyksCiAgICAoMHgxRjcsICdNJywgdSfGvycpLAogICAgKDB4MUY4LCAnTScsIHUnx7knKSwKICAgICgweDFGOSwgJ1YnKSwKICAgICgweDFGQSwgJ00nLCB1J8e7JyksCiAgICAoMHgxRkIsICdWJyksCiAgICAoMHgxRkMsICdNJywgdSfHvScpLAogICAgKDB4MUZELCAnVicpLAogICAgKDB4MUZFLCAnTScsIHUnx78nKSwKICAgICgweDFGRiwgJ1YnKSwKICAgICgweDIwMCwgJ00nLCB1J8iBJyksCiAgICAoMHgyMDEsICdWJyksCiAgICAoMHgyMDIsICdNJywgdSfIgycpLAogICAgKDB4MjAzLCAnVicpLAogICAgKDB4MjA0LCAnTScsIHUnyIUnKSwKICAgICgweDIwNSwgJ1YnKSwKICAgICgweDIwNiwgJ00nLCB1J8iHJyksCiAgICAoMHgyMDcsICdWJyksCiAgICAoMHgyMDgsICdNJywgdSfIiScpLAogICAgKDB4MjA5LCAnVicpLAogICAgKDB4MjBBLCAnTScsIHUnyIsnKSwKICAgICgweDIwQiwgJ1YnKSwKICAgICgweDIwQywgJ00nLCB1J8iNJyksCiAgICBdCgpkZWYgX3NlZ181KCk6CiAgICByZXR1cm4gWwogICAgKDB4MjBELCAnVicpLAogICAgKDB4MjBFLCAnTScsIHUnyI8nKSwKICAgICgweDIwRiwgJ1YnKSwKICAgICgweDIxMCwgJ00nLCB1J8iRJyksCiAgICAoMHgyMTEsICdWJyksCiAgICAoMHgyMTIsICdNJywgdSfIkycpLAogICAgKDB4MjEzLCAnVicpLAogICAgKDB4MjE0LCAnTScsIHUnyJUnKSwKICAgICgweDIxNSwgJ1YnKSwKICAgICgweDIxNiwgJ00nLCB1J8iXJyksCiAgICAoMHgyMTcsICdWJyksCiAgICAoMHgyMTgsICdNJywgdSfImScpLAogICAgKDB4MjE5LCAnVicpLAogICAgKDB4MjFBLCAnTScsIHUnyJsnKSwKICAgICgweDIxQiwgJ1YnKSwKICAgICgweDIxQywgJ00nLCB1J8idJyksCiAgICAoMHgyMUQsICdWJyksCiAgICAoMHgyMUUsICdNJywgdSfInycpLAogICAgKDB4MjFGLCAnVicpLAogICAgKDB4MjIwLCAnTScsIHUnxp4nKSwKICAgICgweDIyMSwgJ1YnKSwKICAgICgweDIyMiwgJ00nLCB1J8ijJyksCiAgICAoMHgyMjMsICdWJyksCiAgICAoMHgyMjQsICdNJywgdSfIpScpLAogICAgKDB4MjI1LCAnVicpLAogICAgKDB4MjI2LCAnTScsIHUnyKcnKSwKICAgICgweDIyNywgJ1YnKSwKICAgICgweDIyOCwgJ00nLCB1J8ipJyksCiAgICAoMHgyMjksICdWJyksCiAgICAoMHgyMkEsICdNJywgdSfIqycpLAogICAgKDB4MjJCLCAnVicpLAogICAgKDB4MjJDLCAnTScsIHUnyK0nKSwKICAgICgweDIyRCwgJ1YnKSwKICAgICgweDIyRSwgJ00nLCB1J8ivJyksCiAgICAoMHgyMkYsICdWJyksCiAgICAoMHgyMzAsICdNJywgdSfIsScpLAogICAgKDB4MjMxLCAnVicpLAogICAgKDB4MjMyLCAnTScsIHUnyLMnKSwKICAgICgweDIzMywgJ1YnKSwKICAgICgweDIzQSwgJ00nLCB1J+KxpScpLAogICAgKDB4MjNCLCAnTScsIHUnyLwnKSwKICAgICgweDIzQywgJ1YnKSwKICAgICgweDIzRCwgJ00nLCB1J8aaJyksCiAgICAoMHgyM0UsICdNJywgdSfisaYnKSwKICAgICgweDIzRiwgJ1YnKSwKICAgICgweDI0MSwgJ00nLCB1J8mCJyksCiAgICAoMHgyNDIsICdWJyksCiAgICAoMHgyNDMsICdNJywgdSfGgCcpLAogICAgKDB4MjQ0LCAnTScsIHUnyoknKSwKICAgICgweDI0NSwgJ00nLCB1J8qMJyksCiAgICAoMHgyNDYsICdNJywgdSfJhycpLAogICAgKDB4MjQ3LCAnVicpLAogICAgKDB4MjQ4LCAnTScsIHUnyYknKSwKICAgICgweDI0OSwgJ1YnKSwKICAgICgweDI0QSwgJ00nLCB1J8mLJyksCiAgICAoMHgyNEIsICdWJyksCiAgICAoMHgyNEMsICdNJywgdSfJjScpLAogICAgKDB4MjRELCAnVicpLAogICAgKDB4MjRFLCAnTScsIHUnyY8nKSwKICAgICgweDI0RiwgJ1YnKSwKICAgICgweDJCMCwgJ00nLCB1J2gnKSwKICAgICgweDJCMSwgJ00nLCB1J8mmJyksCiAgICAoMHgyQjIsICdNJywgdSdqJyksCiAgICAoMHgyQjMsICdNJywgdSdyJyksCiAgICAoMHgyQjQsICdNJywgdSfJuScpLAogICAgKDB4MkI1LCAnTScsIHUnybsnKSwKICAgICgweDJCNiwgJ00nLCB1J8qBJyksCiAgICAoMHgyQjcsICdNJywgdSd3JyksCiAgICAoMHgyQjgsICdNJywgdSd5JyksCiAgICAoMHgyQjksICdWJyksCiAgICAoMHgyRDgsICczJywgdScgzIYnKSwKICAgICgweDJEOSwgJzMnLCB1JyDMhycpLAogICAgKDB4MkRBLCAnMycsIHUnIMyKJyksCiAgICAoMHgyREIsICczJywgdScgzKgnKSwKICAgICgweDJEQywgJzMnLCB1JyDMgycpLAogICAgKDB4MkRELCAnMycsIHUnIMyLJyksCiAgICAoMHgyREUsICdWJyksCiAgICAoMHgyRTAsICdNJywgdSfJoycpLAogICAgKDB4MkUxLCAnTScsIHUnbCcpLAogICAgKDB4MkUyLCAnTScsIHUncycpLAogICAgKDB4MkUzLCAnTScsIHUneCcpLAogICAgKDB4MkU0LCAnTScsIHUnypUnKSwKICAgICgweDJFNSwgJ1YnKSwKICAgICgweDM0MCwgJ00nLCB1J8yAJyksCiAgICAoMHgzNDEsICdNJywgdSfMgScpLAogICAgKDB4MzQyLCAnVicpLAogICAgKDB4MzQzLCAnTScsIHUnzJMnKSwKICAgICgweDM0NCwgJ00nLCB1J8yIzIEnKSwKICAgICgweDM0NSwgJ00nLCB1J865JyksCiAgICAoMHgzNDYsICdWJyksCiAgICAoMHgzNEYsICdJJyksCiAgICAoMHgzNTAsICdWJyksCiAgICAoMHgzNzAsICdNJywgdSfNsScpLAogICAgKDB4MzcxLCAnVicpLAogICAgKDB4MzcyLCAnTScsIHUnzbMnKSwKICAgICgweDM3MywgJ1YnKSwKICAgICgweDM3NCwgJ00nLCB1J8q5JyksCiAgICAoMHgzNzUsICdWJyksCiAgICAoMHgzNzYsICdNJywgdSfNtycpLAogICAgKDB4Mzc3LCAnVicpLAogICAgXQoKZGVmIF9zZWdfNigpOgogICAgcmV0dXJuIFsKICAgICgweDM3OCwgJ1gnKSwKICAgICgweDM3QSwgJzMnLCB1JyDOuScpLAogICAgKDB4MzdCLCAnVicpLAogICAgKDB4MzdFLCAnMycsIHUnOycpLAogICAgKDB4MzdGLCAnWCcpLAogICAgKDB4Mzg0LCAnMycsIHUnIMyBJyksCiAgICAoMHgzODUsICczJywgdScgzIjMgScpLAogICAgKDB4Mzg2LCAnTScsIHUnzqwnKSwKICAgICgweDM4NywgJ00nLCB1J8K3JyksCiAgICAoMHgzODgsICdNJywgdSfOrScpLAogICAgKDB4Mzg5LCAnTScsIHUnzq4nKSwKICAgICgweDM4QSwgJ00nLCB1J86vJyksCiAgICAoMHgzOEIsICdYJyksCiAgICAoMHgzOEMsICdNJywgdSfPjCcpLAogICAgKDB4MzhELCAnWCcpLAogICAgKDB4MzhFLCAnTScsIHUnz40nKSwKICAgICgweDM4RiwgJ00nLCB1J8+OJyksCiAgICAoMHgzOTAsICdWJyksCiAgICAoMHgzOTEsICdNJywgdSfOsScpLAogICAgKDB4MzkyLCAnTScsIHUnzrInKSwKICAgICgweDM5MywgJ00nLCB1J86zJyksCiAgICAoMHgzOTQsICdNJywgdSfOtCcpLAogICAgKDB4Mzk1LCAnTScsIHUnzrUnKSwKICAgICgweDM5NiwgJ00nLCB1J862JyksCiAgICAoMHgzOTcsICdNJywgdSfOtycpLAogICAgKDB4Mzk4LCAnTScsIHUnzrgnKSwKICAgICgweDM5OSwgJ00nLCB1J865JyksCiAgICAoMHgzOUEsICdNJywgdSfOuicpLAogICAgKDB4MzlCLCAnTScsIHUnzrsnKSwKICAgICgweDM5QywgJ00nLCB1J868JyksCiAgICAoMHgzOUQsICdNJywgdSfOvScpLAogICAgKDB4MzlFLCAnTScsIHUnzr4nKSwKICAgICgweDM5RiwgJ00nLCB1J86/JyksCiAgICAoMHgzQTAsICdNJywgdSfPgCcpLAogICAgKDB4M0ExLCAnTScsIHUnz4EnKSwKICAgICgweDNBMiwgJ1gnKSwKICAgICgweDNBMywgJ00nLCB1J8+DJyksCiAgICAoMHgzQTQsICdNJywgdSfPhCcpLAogICAgKDB4M0E1LCAnTScsIHUnz4UnKSwKICAgICgweDNBNiwgJ00nLCB1J8+GJyksCiAgICAoMHgzQTcsICdNJywgdSfPhycpLAogICAgKDB4M0E4LCAnTScsIHUnz4gnKSwKICAgICgweDNBOSwgJ00nLCB1J8+JJyksCiAgICAoMHgzQUEsICdNJywgdSfPiicpLAogICAgKDB4M0FCLCAnTScsIHUnz4snKSwKICAgICgweDNBQywgJ1YnKSwKICAgICgweDNDMiwgJ0QnLCB1J8+DJyksCiAgICAoMHgzQzMsICdWJyksCiAgICAoMHgzQ0YsICdNJywgdSfPlycpLAogICAgKDB4M0QwLCAnTScsIHUnzrInKSwKICAgICgweDNEMSwgJ00nLCB1J864JyksCiAgICAoMHgzRDIsICdNJywgdSfPhScpLAogICAgKDB4M0QzLCAnTScsIHUnz40nKSwKICAgICgweDNENCwgJ00nLCB1J8+LJyksCiAgICAoMHgzRDUsICdNJywgdSfPhicpLAogICAgKDB4M0Q2LCAnTScsIHUnz4AnKSwKICAgICgweDNENywgJ1YnKSwKICAgICgweDNEOCwgJ00nLCB1J8+ZJyksCiAgICAoMHgzRDksICdWJyksCiAgICAoMHgzREEsICdNJywgdSfPmycpLAogICAgKDB4M0RCLCAnVicpLAogICAgKDB4M0RDLCAnTScsIHUnz50nKSwKICAgICgweDNERCwgJ1YnKSwKICAgICgweDNERSwgJ00nLCB1J8+fJyksCiAgICAoMHgzREYsICdWJyksCiAgICAoMHgzRTAsICdNJywgdSfPoScpLAogICAgKDB4M0UxLCAnVicpLAogICAgKDB4M0UyLCAnTScsIHUnz6MnKSwKICAgICgweDNFMywgJ1YnKSwKICAgICgweDNFNCwgJ00nLCB1J8+lJyksCiAgICAoMHgzRTUsICdWJyksCiAgICAoMHgzRTYsICdNJywgdSfPpycpLAogICAgKDB4M0U3LCAnVicpLAogICAgKDB4M0U4LCAnTScsIHUnz6knKSwKICAgICgweDNFOSwgJ1YnKSwKICAgICgweDNFQSwgJ00nLCB1J8+rJyksCiAgICAoMHgzRUIsICdWJyksCiAgICAoMHgzRUMsICdNJywgdSfPrScpLAogICAgKDB4M0VELCAnVicpLAogICAgKDB4M0VFLCAnTScsIHUnz68nKSwKICAgICgweDNFRiwgJ1YnKSwKICAgICgweDNGMCwgJ00nLCB1J866JyksCiAgICAoMHgzRjEsICdNJywgdSfPgScpLAogICAgKDB4M0YyLCAnTScsIHUnz4MnKSwKICAgICgweDNGMywgJ1YnKSwKICAgICgweDNGNCwgJ00nLCB1J864JyksCiAgICAoMHgzRjUsICdNJywgdSfOtScpLAogICAgKDB4M0Y2LCAnVicpLAogICAgKDB4M0Y3LCAnTScsIHUnz7gnKSwKICAgICgweDNGOCwgJ1YnKSwKICAgICgweDNGOSwgJ00nLCB1J8+DJyksCiAgICAoMHgzRkEsICdNJywgdSfPuycpLAogICAgKDB4M0ZCLCAnVicpLAogICAgKDB4M0ZELCAnTScsIHUnzbsnKSwKICAgICgweDNGRSwgJ00nLCB1J828JyksCiAgICAoMHgzRkYsICdNJywgdSfNvScpLAogICAgKDB4NDAwLCAnTScsIHUn0ZAnKSwKICAgICgweDQwMSwgJ00nLCB1J9GRJyksCiAgICAoMHg0MDIsICdNJywgdSfRkicpLAogICAgKDB4NDAzLCAnTScsIHUn0ZMnKSwKICAgIF0KCmRlZiBfc2VnXzcoKToKICAgIHJldHVybiBbCiAgICAoMHg0MDQsICdNJywgdSfRlCcpLAogICAgKDB4NDA1LCAnTScsIHUn0ZUnKSwKICAgICgweDQwNiwgJ00nLCB1J9GWJyksCiAgICAoMHg0MDcsICdNJywgdSfRlycpLAogICAgKDB4NDA4LCAnTScsIHUn0ZgnKSwKICAgICgweDQwOSwgJ00nLCB1J9GZJyksCiAgICAoMHg0MEEsICdNJywgdSfRmicpLAogICAgKDB4NDBCLCAnTScsIHUn0ZsnKSwKICAgICgweDQwQywgJ00nLCB1J9GcJyksCiAgICAoMHg0MEQsICdNJywgdSfRnScpLAogICAgKDB4NDBFLCAnTScsIHUn0Z4nKSwKICAgICgweDQwRiwgJ00nLCB1J9GfJyksCiAgICAoMHg0MTAsICdNJywgdSfQsCcpLAogICAgKDB4NDExLCAnTScsIHUn0LEnKSwKICAgICgweDQxMiwgJ00nLCB1J9CyJyksCiAgICAoMHg0MTMsICdNJywgdSfQsycpLAogICAgKDB4NDE0LCAnTScsIHUn0LQnKSwKICAgICgweDQxNSwgJ00nLCB1J9C1JyksCiAgICAoMHg0MTYsICdNJywgdSfQticpLAogICAgKDB4NDE3LCAnTScsIHUn0LcnKSwKICAgICgweDQxOCwgJ00nLCB1J9C4JyksCiAgICAoMHg0MTksICdNJywgdSfQuScpLAogICAgKDB4NDFBLCAnTScsIHUn0LonKSwKICAgICgweDQxQiwgJ00nLCB1J9C7JyksCiAgICAoMHg0MUMsICdNJywgdSfQvCcpLAogICAgKDB4NDFELCAnTScsIHUn0L0nKSwKICAgICgweDQxRSwgJ00nLCB1J9C+JyksCiAgICAoMHg0MUYsICdNJywgdSfQvycpLAogICAgKDB4NDIwLCAnTScsIHUn0YAnKSwKICAgICgweDQyMSwgJ00nLCB1J9GBJyksCiAgICAoMHg0MjIsICdNJywgdSfRgicpLAogICAgKDB4NDIzLCAnTScsIHUn0YMnKSwKICAgICgweDQyNCwgJ00nLCB1J9GEJyksCiAgICAoMHg0MjUsICdNJywgdSfRhScpLAogICAgKDB4NDI2LCAnTScsIHUn0YYnKSwKICAgICgweDQyNywgJ00nLCB1J9GHJyksCiAgICAoMHg0MjgsICdNJywgdSfRiCcpLAogICAgKDB4NDI5LCAnTScsIHUn0YknKSwKICAgICgweDQyQSwgJ00nLCB1J9GKJyksCiAgICAoMHg0MkIsICdNJywgdSfRiycpLAogICAgKDB4NDJDLCAnTScsIHUn0YwnKSwKICAgICgweDQyRCwgJ00nLCB1J9GNJyksCiAgICAoMHg0MkUsICdNJywgdSfRjicpLAogICAgKDB4NDJGLCAnTScsIHUn0Y8nKSwKICAgICgweDQzMCwgJ1YnKSwKICAgICgweDQ2MCwgJ00nLCB1J9GhJyksCiAgICAoMHg0NjEsICdWJyksCiAgICAoMHg0NjIsICdNJywgdSfRoycpLAogICAgKDB4NDYzLCAnVicpLAogICAgKDB4NDY0LCAnTScsIHUn0aUnKSwKICAgICgweDQ2NSwgJ1YnKSwKICAgICgweDQ2NiwgJ00nLCB1J9GnJyksCiAgICAoMHg0NjcsICdWJyksCiAgICAoMHg0NjgsICdNJywgdSfRqScpLAogICAgKDB4NDY5LCAnVicpLAogICAgKDB4NDZBLCAnTScsIHUn0asnKSwKICAgICgweDQ2QiwgJ1YnKSwKICAgICgweDQ2QywgJ00nLCB1J9GtJyksCiAgICAoMHg0NkQsICdWJyksCiAgICAoMHg0NkUsICdNJywgdSfRrycpLAogICAgKDB4NDZGLCAnVicpLAogICAgKDB4NDcwLCAnTScsIHUn0bEnKSwKICAgICgweDQ3MSwgJ1YnKSwKICAgICgweDQ3MiwgJ00nLCB1J9GzJyksCiAgICAoMHg0NzMsICdWJyksCiAgICAoMHg0NzQsICdNJywgdSfRtScpLAogICAgKDB4NDc1LCAnVicpLAogICAgKDB4NDc2LCAnTScsIHUn0bcnKSwKICAgICgweDQ3NywgJ1YnKSwKICAgICgweDQ3OCwgJ00nLCB1J9G5JyksCiAgICAoMHg0NzksICdWJyksCiAgICAoMHg0N0EsICdNJywgdSfRuycpLAogICAgKDB4NDdCLCAnVicpLAogICAgKDB4NDdDLCAnTScsIHUn0b0nKSwKICAgICgweDQ3RCwgJ1YnKSwKICAgICgweDQ3RSwgJ00nLCB1J9G/JyksCiAgICAoMHg0N0YsICdWJyksCiAgICAoMHg0ODAsICdNJywgdSfSgScpLAogICAgKDB4NDgxLCAnVicpLAogICAgKDB4NDhBLCAnTScsIHUn0osnKSwKICAgICgweDQ4QiwgJ1YnKSwKICAgICgweDQ4QywgJ00nLCB1J9KNJyksCiAgICAoMHg0OEQsICdWJyksCiAgICAoMHg0OEUsICdNJywgdSfSjycpLAogICAgKDB4NDhGLCAnVicpLAogICAgKDB4NDkwLCAnTScsIHUn0pEnKSwKICAgICgweDQ5MSwgJ1YnKSwKICAgICgweDQ5MiwgJ00nLCB1J9KTJyksCiAgICAoMHg0OTMsICdWJyksCiAgICAoMHg0OTQsICdNJywgdSfSlScpLAogICAgKDB4NDk1LCAnVicpLAogICAgKDB4NDk2LCAnTScsIHUn0pcnKSwKICAgICgweDQ5NywgJ1YnKSwKICAgICgweDQ5OCwgJ00nLCB1J9KZJyksCiAgICAoMHg0OTksICdWJyksCiAgICAoMHg0OUEsICdNJywgdSfSmycpLAogICAgKDB4NDlCLCAnVicpLAogICAgKDB4NDlDLCAnTScsIHUn0p0nKSwKICAgICgweDQ5RCwgJ1YnKSwKICAgICgweDQ5RSwgJ00nLCB1J9KfJyksCiAgICBdCgpkZWYgX3NlZ184KCk6CiAgICByZXR1cm4gWwogICAgKDB4NDlGLCAnVicpLAogICAgKDB4NEEwLCAnTScsIHUn0qEnKSwKICAgICgweDRBMSwgJ1YnKSwKICAgICgweDRBMiwgJ00nLCB1J9KjJyksCiAgICAoMHg0QTMsICdWJyksCiAgICAoMHg0QTQsICdNJywgdSfSpScpLAogICAgKDB4NEE1LCAnVicpLAogICAgKDB4NEE2LCAnTScsIHUn0qcnKSwKICAgICgweDRBNywgJ1YnKSwKICAgICgweDRBOCwgJ00nLCB1J9KpJyksCiAgICAoMHg0QTksICdWJyksCiAgICAoMHg0QUEsICdNJywgdSfSqycpLAogICAgKDB4NEFCLCAnVicpLAogICAgKDB4NEFDLCAnTScsIHUn0q0nKSwKICAgICgweDRBRCwgJ1YnKSwKICAgICgweDRBRSwgJ00nLCB1J9KvJyksCiAgICAoMHg0QUYsICdWJyksCiAgICAoMHg0QjAsICdNJywgdSfSsScpLAogICAgKDB4NEIxLCAnVicpLAogICAgKDB4NEIyLCAnTScsIHUn0rMnKSwKICAgICgweDRCMywgJ1YnKSwKICAgICgweDRCNCwgJ00nLCB1J9K1JyksCiAgICAoMHg0QjUsICdWJyksCiAgICAoMHg0QjYsICdNJywgdSfStycpLAogICAgKDB4NEI3LCAnVicpLAogICAgKDB4NEI4LCAnTScsIHUn0rknKSwKICAgICgweDRCOSwgJ1YnKSwKICAgICgweDRCQSwgJ00nLCB1J9K7JyksCiAgICAoMHg0QkIsICdWJyksCiAgICAoMHg0QkMsICdNJywgdSfSvScpLAogICAgKDB4NEJELCAnVicpLAogICAgKDB4NEJFLCAnTScsIHUn0r8nKSwKICAgICgweDRCRiwgJ1YnKSwKICAgICgweDRDMCwgJ1gnKSwKICAgICgweDRDMSwgJ00nLCB1J9OCJyksCiAgICAoMHg0QzIsICdWJyksCiAgICAoMHg0QzMsICdNJywgdSfThCcpLAogICAgKDB4NEM0LCAnVicpLAogICAgKDB4NEM1LCAnTScsIHUn04YnKSwKICAgICgweDRDNiwgJ1YnKSwKICAgICgweDRDNywgJ00nLCB1J9OIJyksCiAgICAoMHg0QzgsICdWJyksCiAgICAoMHg0QzksICdNJywgdSfTiicpLAogICAgKDB4NENBLCAnVicpLAogICAgKDB4NENCLCAnTScsIHUn04wnKSwKICAgICgweDRDQywgJ1YnKSwKICAgICgweDRDRCwgJ00nLCB1J9OOJyksCiAgICAoMHg0Q0UsICdWJyksCiAgICAoMHg0RDAsICdNJywgdSfTkScpLAogICAgKDB4NEQxLCAnVicpLAogICAgKDB4NEQyLCAnTScsIHUn05MnKSwKICAgICgweDREMywgJ1YnKSwKICAgICgweDRENCwgJ00nLCB1J9OVJyksCiAgICAoMHg0RDUsICdWJyksCiAgICAoMHg0RDYsICdNJywgdSfTlycpLAogICAgKDB4NEQ3LCAnVicpLAogICAgKDB4NEQ4LCAnTScsIHUn05knKSwKICAgICgweDREOSwgJ1YnKSwKICAgICgweDREQSwgJ00nLCB1J9ObJyksCiAgICAoMHg0REIsICdWJyksCiAgICAoMHg0REMsICdNJywgdSfTnScpLAogICAgKDB4NERELCAnVicpLAogICAgKDB4NERFLCAnTScsIHUn058nKSwKICAgICgweDRERiwgJ1YnKSwKICAgICgweDRFMCwgJ00nLCB1J9OhJyksCiAgICAoMHg0RTEsICdWJyksCiAgICAoMHg0RTIsICdNJywgdSfToycpLAogICAgKDB4NEUzLCAnVicpLAogICAgKDB4NEU0LCAnTScsIHUn06UnKSwKICAgICgweDRFNSwgJ1YnKSwKICAgICgweDRFNiwgJ00nLCB1J9OnJyksCiAgICAoMHg0RTcsICdWJyksCiAgICAoMHg0RTgsICdNJywgdSfTqScpLAogICAgKDB4NEU5LCAnVicpLAogICAgKDB4NEVBLCAnTScsIHUn06snKSwKICAgICgweDRFQiwgJ1YnKSwKICAgICgweDRFQywgJ00nLCB1J9OtJyksCiAgICAoMHg0RUQsICdWJyksCiAgICAoMHg0RUUsICdNJywgdSfTrycpLAogICAgKDB4NEVGLCAnVicpLAogICAgKDB4NEYwLCAnTScsIHUn07EnKSwKICAgICgweDRGMSwgJ1YnKSwKICAgICgweDRGMiwgJ00nLCB1J9OzJyksCiAgICAoMHg0RjMsICdWJyksCiAgICAoMHg0RjQsICdNJywgdSfTtScpLAogICAgKDB4NEY1LCAnVicpLAogICAgKDB4NEY2LCAnTScsIHUn07cnKSwKICAgICgweDRGNywgJ1YnKSwKICAgICgweDRGOCwgJ00nLCB1J9O5JyksCiAgICAoMHg0RjksICdWJyksCiAgICAoMHg0RkEsICdNJywgdSfTuycpLAogICAgKDB4NEZCLCAnVicpLAogICAgKDB4NEZDLCAnTScsIHUn070nKSwKICAgICgweDRGRCwgJ1YnKSwKICAgICgweDRGRSwgJ00nLCB1J9O/JyksCiAgICAoMHg0RkYsICdWJyksCiAgICAoMHg1MDAsICdNJywgdSfUgScpLAogICAgKDB4NTAxLCAnVicpLAogICAgKDB4NTAyLCAnTScsIHUn1IMnKSwKICAgICgweDUwMywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzkoKToKICAgIHJldHVybiBbCiAgICAoMHg1MDQsICdNJywgdSfUhScpLAogICAgKDB4NTA1LCAnVicpLAogICAgKDB4NTA2LCAnTScsIHUn1IcnKSwKICAgICgweDUwNywgJ1YnKSwKICAgICgweDUwOCwgJ00nLCB1J9SJJyksCiAgICAoMHg1MDksICdWJyksCiAgICAoMHg1MEEsICdNJywgdSfUiycpLAogICAgKDB4NTBCLCAnVicpLAogICAgKDB4NTBDLCAnTScsIHUn1I0nKSwKICAgICgweDUwRCwgJ1YnKSwKICAgICgweDUwRSwgJ00nLCB1J9SPJyksCiAgICAoMHg1MEYsICdWJyksCiAgICAoMHg1MTAsICdNJywgdSfUkScpLAogICAgKDB4NTExLCAnVicpLAogICAgKDB4NTEyLCAnTScsIHUn1JMnKSwKICAgICgweDUxMywgJ1YnKSwKICAgICgweDUxNCwgJ00nLCB1J9SVJyksCiAgICAoMHg1MTUsICdWJyksCiAgICAoMHg1MTYsICdNJywgdSfUlycpLAogICAgKDB4NTE3LCAnVicpLAogICAgKDB4NTE4LCAnTScsIHUn1JknKSwKICAgICgweDUxOSwgJ1YnKSwKICAgICgweDUxQSwgJ00nLCB1J9SbJyksCiAgICAoMHg1MUIsICdWJyksCiAgICAoMHg1MUMsICdNJywgdSfUnScpLAogICAgKDB4NTFELCAnVicpLAogICAgKDB4NTFFLCAnTScsIHUn1J8nKSwKICAgICgweDUxRiwgJ1YnKSwKICAgICgweDUyMCwgJ00nLCB1J9ShJyksCiAgICAoMHg1MjEsICdWJyksCiAgICAoMHg1MjIsICdNJywgdSfUoycpLAogICAgKDB4NTIzLCAnVicpLAogICAgKDB4NTI0LCAnTScsIHUn1KUnKSwKICAgICgweDUyNSwgJ1YnKSwKICAgICgweDUyNiwgJ00nLCB1J9SnJyksCiAgICAoMHg1MjcsICdWJyksCiAgICAoMHg1MjgsICdYJyksCiAgICAoMHg1MzEsICdNJywgdSfVoScpLAogICAgKDB4NTMyLCAnTScsIHUn1aInKSwKICAgICgweDUzMywgJ00nLCB1J9WjJyksCiAgICAoMHg1MzQsICdNJywgdSfVpCcpLAogICAgKDB4NTM1LCAnTScsIHUn1aUnKSwKICAgICgweDUzNiwgJ00nLCB1J9WmJyksCiAgICAoMHg1MzcsICdNJywgdSfVpycpLAogICAgKDB4NTM4LCAnTScsIHUn1agnKSwKICAgICgweDUzOSwgJ00nLCB1J9WpJyksCiAgICAoMHg1M0EsICdNJywgdSfVqicpLAogICAgKDB4NTNCLCAnTScsIHUn1asnKSwKICAgICgweDUzQywgJ00nLCB1J9WsJyksCiAgICAoMHg1M0QsICdNJywgdSfVrScpLAogICAgKDB4NTNFLCAnTScsIHUn1a4nKSwKICAgICgweDUzRiwgJ00nLCB1J9WvJyksCiAgICAoMHg1NDAsICdNJywgdSfVsCcpLAogICAgKDB4NTQxLCAnTScsIHUn1bEnKSwKICAgICgweDU0MiwgJ00nLCB1J9WyJyksCiAgICAoMHg1NDMsICdNJywgdSfVsycpLAogICAgKDB4NTQ0LCAnTScsIHUn1bQnKSwKICAgICgweDU0NSwgJ00nLCB1J9W1JyksCiAgICAoMHg1NDYsICdNJywgdSfVticpLAogICAgKDB4NTQ3LCAnTScsIHUn1bcnKSwKICAgICgweDU0OCwgJ00nLCB1J9W4JyksCiAgICAoMHg1NDksICdNJywgdSfVuScpLAogICAgKDB4NTRBLCAnTScsIHUn1bonKSwKICAgICgweDU0QiwgJ00nLCB1J9W7JyksCiAgICAoMHg1NEMsICdNJywgdSfVvCcpLAogICAgKDB4NTRELCAnTScsIHUn1b0nKSwKICAgICgweDU0RSwgJ00nLCB1J9W+JyksCiAgICAoMHg1NEYsICdNJywgdSfVvycpLAogICAgKDB4NTUwLCAnTScsIHUn1oAnKSwKICAgICgweDU1MSwgJ00nLCB1J9aBJyksCiAgICAoMHg1NTIsICdNJywgdSfWgicpLAogICAgKDB4NTUzLCAnTScsIHUn1oMnKSwKICAgICgweDU1NCwgJ00nLCB1J9aEJyksCiAgICAoMHg1NTUsICdNJywgdSfWhScpLAogICAgKDB4NTU2LCAnTScsIHUn1oYnKSwKICAgICgweDU1NywgJ1gnKSwKICAgICgweDU1OSwgJ1YnKSwKICAgICgweDU2MCwgJ1gnKSwKICAgICgweDU2MSwgJ1YnKSwKICAgICgweDU4NywgJ00nLCB1J9Wl1oInKSwKICAgICgweDU4OCwgJ1gnKSwKICAgICgweDU4OSwgJ1YnKSwKICAgICgweDU4QiwgJ1gnKSwKICAgICgweDU4RiwgJ1YnKSwKICAgICgweDU5MCwgJ1gnKSwKICAgICgweDU5MSwgJ1YnKSwKICAgICgweDVDOCwgJ1gnKSwKICAgICgweDVEMCwgJ1YnKSwKICAgICgweDVFQiwgJ1gnKSwKICAgICgweDVGMCwgJ1YnKSwKICAgICgweDVGNSwgJ1gnKSwKICAgICgweDYwNiwgJ1YnKSwKICAgICgweDYxQywgJ1gnKSwKICAgICgweDYxRSwgJ1YnKSwKICAgICgweDY3NSwgJ00nLCB1J9in2bQnKSwKICAgICgweDY3NiwgJ00nLCB1J9mI2bQnKSwKICAgICgweDY3NywgJ00nLCB1J9uH2bQnKSwKICAgICgweDY3OCwgJ00nLCB1J9mK2bQnKSwKICAgICgweDY3OSwgJ1YnKSwKICAgICgweDZERCwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzEwKCk6CiAgICByZXR1cm4gWwogICAgKDB4NkRFLCAnVicpLAogICAgKDB4NzBFLCAnWCcpLAogICAgKDB4NzEwLCAnVicpLAogICAgKDB4NzRCLCAnWCcpLAogICAgKDB4NzRELCAnVicpLAogICAgKDB4N0IyLCAnWCcpLAogICAgKDB4N0MwLCAnVicpLAogICAgKDB4N0ZCLCAnWCcpLAogICAgKDB4ODAwLCAnVicpLAogICAgKDB4ODJFLCAnWCcpLAogICAgKDB4ODMwLCAnVicpLAogICAgKDB4ODNGLCAnWCcpLAogICAgKDB4ODQwLCAnVicpLAogICAgKDB4ODVDLCAnWCcpLAogICAgKDB4ODVFLCAnVicpLAogICAgKDB4ODVGLCAnWCcpLAogICAgKDB4OEEwLCAnVicpLAogICAgKDB4OEExLCAnWCcpLAogICAgKDB4OEEyLCAnVicpLAogICAgKDB4OEFELCAnWCcpLAogICAgKDB4OEU0LCAnVicpLAogICAgKDB4OEZGLCAnWCcpLAogICAgKDB4OTAwLCAnVicpLAogICAgKDB4OTU4LCAnTScsIHUn4KSV4KS8JyksCiAgICAoMHg5NTksICdNJywgdSfgpJbgpLwnKSwKICAgICgweDk1QSwgJ00nLCB1J+Ckl+CkvCcpLAogICAgKDB4OTVCLCAnTScsIHUn4KSc4KS8JyksCiAgICAoMHg5NUMsICdNJywgdSfgpKHgpLwnKSwKICAgICgweDk1RCwgJ00nLCB1J+CkouCkvCcpLAogICAgKDB4OTVFLCAnTScsIHUn4KSr4KS8JyksCiAgICAoMHg5NUYsICdNJywgdSfgpK/gpLwnKSwKICAgICgweDk2MCwgJ1YnKSwKICAgICgweDk3OCwgJ1gnKSwKICAgICgweDk3OSwgJ1YnKSwKICAgICgweDk4MCwgJ1gnKSwKICAgICgweDk4MSwgJ1YnKSwKICAgICgweDk4NCwgJ1gnKSwKICAgICgweDk4NSwgJ1YnKSwKICAgICgweDk4RCwgJ1gnKSwKICAgICgweDk4RiwgJ1YnKSwKICAgICgweDk5MSwgJ1gnKSwKICAgICgweDk5MywgJ1YnKSwKICAgICgweDlBOSwgJ1gnKSwKICAgICgweDlBQSwgJ1YnKSwKICAgICgweDlCMSwgJ1gnKSwKICAgICgweDlCMiwgJ1YnKSwKICAgICgweDlCMywgJ1gnKSwKICAgICgweDlCNiwgJ1YnKSwKICAgICgweDlCQSwgJ1gnKSwKICAgICgweDlCQywgJ1YnKSwKICAgICgweDlDNSwgJ1gnKSwKICAgICgweDlDNywgJ1YnKSwKICAgICgweDlDOSwgJ1gnKSwKICAgICgweDlDQiwgJ1YnKSwKICAgICgweDlDRiwgJ1gnKSwKICAgICgweDlENywgJ1YnKSwKICAgICgweDlEOCwgJ1gnKSwKICAgICgweDlEQywgJ00nLCB1J+CmoeCmvCcpLAogICAgKDB4OURELCAnTScsIHUn4Kai4Ka8JyksCiAgICAoMHg5REUsICdYJyksCiAgICAoMHg5REYsICdNJywgdSfgpq/gprwnKSwKICAgICgweDlFMCwgJ1YnKSwKICAgICgweDlFNCwgJ1gnKSwKICAgICgweDlFNiwgJ1YnKSwKICAgICgweDlGQywgJ1gnKSwKICAgICgweEEwMSwgJ1YnKSwKICAgICgweEEwNCwgJ1gnKSwKICAgICgweEEwNSwgJ1YnKSwKICAgICgweEEwQiwgJ1gnKSwKICAgICgweEEwRiwgJ1YnKSwKICAgICgweEExMSwgJ1gnKSwKICAgICgweEExMywgJ1YnKSwKICAgICgweEEyOSwgJ1gnKSwKICAgICgweEEyQSwgJ1YnKSwKICAgICgweEEzMSwgJ1gnKSwKICAgICgweEEzMiwgJ1YnKSwKICAgICgweEEzMywgJ00nLCB1J+CosuCovCcpLAogICAgKDB4QTM0LCAnWCcpLAogICAgKDB4QTM1LCAnVicpLAogICAgKDB4QTM2LCAnTScsIHUn4Ki44Ki8JyksCiAgICAoMHhBMzcsICdYJyksCiAgICAoMHhBMzgsICdWJyksCiAgICAoMHhBM0EsICdYJyksCiAgICAoMHhBM0MsICdWJyksCiAgICAoMHhBM0QsICdYJyksCiAgICAoMHhBM0UsICdWJyksCiAgICAoMHhBNDMsICdYJyksCiAgICAoMHhBNDcsICdWJyksCiAgICAoMHhBNDksICdYJyksCiAgICAoMHhBNEIsICdWJyksCiAgICAoMHhBNEUsICdYJyksCiAgICAoMHhBNTEsICdWJyksCiAgICAoMHhBNTIsICdYJyksCiAgICAoMHhBNTksICdNJywgdSfgqJbgqLwnKSwKICAgICgweEE1QSwgJ00nLCB1J+Col+CovCcpLAogICAgKDB4QTVCLCAnTScsIHUn4Kic4Ki8JyksCiAgICAoMHhBNUMsICdWJyksCiAgICAoMHhBNUQsICdYJyksCiAgICAoMHhBNUUsICdNJywgdSfgqKvgqLwnKSwKICAgICgweEE1RiwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzExKCk6CiAgICByZXR1cm4gWwogICAgKDB4QTY2LCAnVicpLAogICAgKDB4QTc2LCAnWCcpLAogICAgKDB4QTgxLCAnVicpLAogICAgKDB4QTg0LCAnWCcpLAogICAgKDB4QTg1LCAnVicpLAogICAgKDB4QThFLCAnWCcpLAogICAgKDB4QThGLCAnVicpLAogICAgKDB4QTkyLCAnWCcpLAogICAgKDB4QTkzLCAnVicpLAogICAgKDB4QUE5LCAnWCcpLAogICAgKDB4QUFBLCAnVicpLAogICAgKDB4QUIxLCAnWCcpLAogICAgKDB4QUIyLCAnVicpLAogICAgKDB4QUI0LCAnWCcpLAogICAgKDB4QUI1LCAnVicpLAogICAgKDB4QUJBLCAnWCcpLAogICAgKDB4QUJDLCAnVicpLAogICAgKDB4QUM2LCAnWCcpLAogICAgKDB4QUM3LCAnVicpLAogICAgKDB4QUNBLCAnWCcpLAogICAgKDB4QUNCLCAnVicpLAogICAgKDB4QUNFLCAnWCcpLAogICAgKDB4QUQwLCAnVicpLAogICAgKDB4QUQxLCAnWCcpLAogICAgKDB4QUUwLCAnVicpLAogICAgKDB4QUU0LCAnWCcpLAogICAgKDB4QUU2LCAnVicpLAogICAgKDB4QUYyLCAnWCcpLAogICAgKDB4QjAxLCAnVicpLAogICAgKDB4QjA0LCAnWCcpLAogICAgKDB4QjA1LCAnVicpLAogICAgKDB4QjBELCAnWCcpLAogICAgKDB4QjBGLCAnVicpLAogICAgKDB4QjExLCAnWCcpLAogICAgKDB4QjEzLCAnVicpLAogICAgKDB4QjI5LCAnWCcpLAogICAgKDB4QjJBLCAnVicpLAogICAgKDB4QjMxLCAnWCcpLAogICAgKDB4QjMyLCAnVicpLAogICAgKDB4QjM0LCAnWCcpLAogICAgKDB4QjM1LCAnVicpLAogICAgKDB4QjNBLCAnWCcpLAogICAgKDB4QjNDLCAnVicpLAogICAgKDB4QjQ1LCAnWCcpLAogICAgKDB4QjQ3LCAnVicpLAogICAgKDB4QjQ5LCAnWCcpLAogICAgKDB4QjRCLCAnVicpLAogICAgKDB4QjRFLCAnWCcpLAogICAgKDB4QjU2LCAnVicpLAogICAgKDB4QjU4LCAnWCcpLAogICAgKDB4QjVDLCAnTScsIHUn4Kyh4Ky8JyksCiAgICAoMHhCNUQsICdNJywgdSfgrKLgrLwnKSwKICAgICgweEI1RSwgJ1gnKSwKICAgICgweEI1RiwgJ1YnKSwKICAgICgweEI2NCwgJ1gnKSwKICAgICgweEI2NiwgJ1YnKSwKICAgICgweEI3OCwgJ1gnKSwKICAgICgweEI4MiwgJ1YnKSwKICAgICgweEI4NCwgJ1gnKSwKICAgICgweEI4NSwgJ1YnKSwKICAgICgweEI4QiwgJ1gnKSwKICAgICgweEI4RSwgJ1YnKSwKICAgICgweEI5MSwgJ1gnKSwKICAgICgweEI5MiwgJ1YnKSwKICAgICgweEI5NiwgJ1gnKSwKICAgICgweEI5OSwgJ1YnKSwKICAgICgweEI5QiwgJ1gnKSwKICAgICgweEI5QywgJ1YnKSwKICAgICgweEI5RCwgJ1gnKSwKICAgICgweEI5RSwgJ1YnKSwKICAgICgweEJBMCwgJ1gnKSwKICAgICgweEJBMywgJ1YnKSwKICAgICgweEJBNSwgJ1gnKSwKICAgICgweEJBOCwgJ1YnKSwKICAgICgweEJBQiwgJ1gnKSwKICAgICgweEJBRSwgJ1YnKSwKICAgICgweEJCQSwgJ1gnKSwKICAgICgweEJCRSwgJ1YnKSwKICAgICgweEJDMywgJ1gnKSwKICAgICgweEJDNiwgJ1YnKSwKICAgICgweEJDOSwgJ1gnKSwKICAgICgweEJDQSwgJ1YnKSwKICAgICgweEJDRSwgJ1gnKSwKICAgICgweEJEMCwgJ1YnKSwKICAgICgweEJEMSwgJ1gnKSwKICAgICgweEJENywgJ1YnKSwKICAgICgweEJEOCwgJ1gnKSwKICAgICgweEJFNiwgJ1YnKSwKICAgICgweEJGQiwgJ1gnKSwKICAgICgweEMwMSwgJ1YnKSwKICAgICgweEMwNCwgJ1gnKSwKICAgICgweEMwNSwgJ1YnKSwKICAgICgweEMwRCwgJ1gnKSwKICAgICgweEMwRSwgJ1YnKSwKICAgICgweEMxMSwgJ1gnKSwKICAgICgweEMxMiwgJ1YnKSwKICAgICgweEMyOSwgJ1gnKSwKICAgICgweEMyQSwgJ1YnKSwKICAgICgweEMzNCwgJ1gnKSwKICAgICgweEMzNSwgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzEyKCk6CiAgICByZXR1cm4gWwogICAgKDB4QzNBLCAnWCcpLAogICAgKDB4QzNELCAnVicpLAogICAgKDB4QzQ1LCAnWCcpLAogICAgKDB4QzQ2LCAnVicpLAogICAgKDB4QzQ5LCAnWCcpLAogICAgKDB4QzRBLCAnVicpLAogICAgKDB4QzRFLCAnWCcpLAogICAgKDB4QzU1LCAnVicpLAogICAgKDB4QzU3LCAnWCcpLAogICAgKDB4QzU4LCAnVicpLAogICAgKDB4QzVBLCAnWCcpLAogICAgKDB4QzYwLCAnVicpLAogICAgKDB4QzY0LCAnWCcpLAogICAgKDB4QzY2LCAnVicpLAogICAgKDB4QzcwLCAnWCcpLAogICAgKDB4Qzc4LCAnVicpLAogICAgKDB4QzgwLCAnWCcpLAogICAgKDB4QzgyLCAnVicpLAogICAgKDB4Qzg0LCAnWCcpLAogICAgKDB4Qzg1LCAnVicpLAogICAgKDB4QzhELCAnWCcpLAogICAgKDB4QzhFLCAnVicpLAogICAgKDB4QzkxLCAnWCcpLAogICAgKDB4QzkyLCAnVicpLAogICAgKDB4Q0E5LCAnWCcpLAogICAgKDB4Q0FBLCAnVicpLAogICAgKDB4Q0I0LCAnWCcpLAogICAgKDB4Q0I1LCAnVicpLAogICAgKDB4Q0JBLCAnWCcpLAogICAgKDB4Q0JDLCAnVicpLAogICAgKDB4Q0M1LCAnWCcpLAogICAgKDB4Q0M2LCAnVicpLAogICAgKDB4Q0M5LCAnWCcpLAogICAgKDB4Q0NBLCAnVicpLAogICAgKDB4Q0NFLCAnWCcpLAogICAgKDB4Q0Q1LCAnVicpLAogICAgKDB4Q0Q3LCAnWCcpLAogICAgKDB4Q0RFLCAnVicpLAogICAgKDB4Q0RGLCAnWCcpLAogICAgKDB4Q0UwLCAnVicpLAogICAgKDB4Q0U0LCAnWCcpLAogICAgKDB4Q0U2LCAnVicpLAogICAgKDB4Q0YwLCAnWCcpLAogICAgKDB4Q0YxLCAnVicpLAogICAgKDB4Q0YzLCAnWCcpLAogICAgKDB4RDAyLCAnVicpLAogICAgKDB4RDA0LCAnWCcpLAogICAgKDB4RDA1LCAnVicpLAogICAgKDB4RDBELCAnWCcpLAogICAgKDB4RDBFLCAnVicpLAogICAgKDB4RDExLCAnWCcpLAogICAgKDB4RDEyLCAnVicpLAogICAgKDB4RDNCLCAnWCcpLAogICAgKDB4RDNELCAnVicpLAogICAgKDB4RDQ1LCAnWCcpLAogICAgKDB4RDQ2LCAnVicpLAogICAgKDB4RDQ5LCAnWCcpLAogICAgKDB4RDRBLCAnVicpLAogICAgKDB4RDRGLCAnWCcpLAogICAgKDB4RDU3LCAnVicpLAogICAgKDB4RDU4LCAnWCcpLAogICAgKDB4RDYwLCAnVicpLAogICAgKDB4RDY0LCAnWCcpLAogICAgKDB4RDY2LCAnVicpLAogICAgKDB4RDc2LCAnWCcpLAogICAgKDB4RDc5LCAnVicpLAogICAgKDB4RDgwLCAnWCcpLAogICAgKDB4RDgyLCAnVicpLAogICAgKDB4RDg0LCAnWCcpLAogICAgKDB4RDg1LCAnVicpLAogICAgKDB4RDk3LCAnWCcpLAogICAgKDB4RDlBLCAnVicpLAogICAgKDB4REIyLCAnWCcpLAogICAgKDB4REIzLCAnVicpLAogICAgKDB4REJDLCAnWCcpLAogICAgKDB4REJELCAnVicpLAogICAgKDB4REJFLCAnWCcpLAogICAgKDB4REMwLCAnVicpLAogICAgKDB4REM3LCAnWCcpLAogICAgKDB4RENBLCAnVicpLAogICAgKDB4RENCLCAnWCcpLAogICAgKDB4RENGLCAnVicpLAogICAgKDB4REQ1LCAnWCcpLAogICAgKDB4REQ2LCAnVicpLAogICAgKDB4REQ3LCAnWCcpLAogICAgKDB4REQ4LCAnVicpLAogICAgKDB4REUwLCAnWCcpLAogICAgKDB4REYyLCAnVicpLAogICAgKDB4REY1LCAnWCcpLAogICAgKDB4RTAxLCAnVicpLAogICAgKDB4RTMzLCAnTScsIHUn4LmN4LiyJyksCiAgICAoMHhFMzQsICdWJyksCiAgICAoMHhFM0IsICdYJyksCiAgICAoMHhFM0YsICdWJyksCiAgICAoMHhFNUMsICdYJyksCiAgICAoMHhFODEsICdWJyksCiAgICAoMHhFODMsICdYJyksCiAgICAoMHhFODQsICdWJyksCiAgICAoMHhFODUsICdYJyksCiAgICAoMHhFODcsICdWJyksCiAgICBdCgpkZWYgX3NlZ18xMygpOgogICAgcmV0dXJuIFsKICAgICgweEU4OSwgJ1gnKSwKICAgICgweEU4QSwgJ1YnKSwKICAgICgweEU4QiwgJ1gnKSwKICAgICgweEU4RCwgJ1YnKSwKICAgICgweEU4RSwgJ1gnKSwKICAgICgweEU5NCwgJ1YnKSwKICAgICgweEU5OCwgJ1gnKSwKICAgICgweEU5OSwgJ1YnKSwKICAgICgweEVBMCwgJ1gnKSwKICAgICgweEVBMSwgJ1YnKSwKICAgICgweEVBNCwgJ1gnKSwKICAgICgweEVBNSwgJ1YnKSwKICAgICgweEVBNiwgJ1gnKSwKICAgICgweEVBNywgJ1YnKSwKICAgICgweEVBOCwgJ1gnKSwKICAgICgweEVBQSwgJ1YnKSwKICAgICgweEVBQywgJ1gnKSwKICAgICgweEVBRCwgJ1YnKSwKICAgICgweEVCMywgJ00nLCB1J+C7jeC6sicpLAogICAgKDB4RUI0LCAnVicpLAogICAgKDB4RUJBLCAnWCcpLAogICAgKDB4RUJCLCAnVicpLAogICAgKDB4RUJFLCAnWCcpLAogICAgKDB4RUMwLCAnVicpLAogICAgKDB4RUM1LCAnWCcpLAogICAgKDB4RUM2LCAnVicpLAogICAgKDB4RUM3LCAnWCcpLAogICAgKDB4RUM4LCAnVicpLAogICAgKDB4RUNFLCAnWCcpLAogICAgKDB4RUQwLCAnVicpLAogICAgKDB4RURBLCAnWCcpLAogICAgKDB4RURDLCAnTScsIHUn4Lqr4LqZJyksCiAgICAoMHhFREQsICdNJywgdSfguqvguqEnKSwKICAgICgweEVERSwgJ1YnKSwKICAgICgweEVFMCwgJ1gnKSwKICAgICgweEYwMCwgJ1YnKSwKICAgICgweEYwQywgJ00nLCB1J+C8iycpLAogICAgKDB4RjBELCAnVicpLAogICAgKDB4RjQzLCAnTScsIHUn4L2C4L63JyksCiAgICAoMHhGNDQsICdWJyksCiAgICAoMHhGNDgsICdYJyksCiAgICAoMHhGNDksICdWJyksCiAgICAoMHhGNEQsICdNJywgdSfgvYzgvrcnKSwKICAgICgweEY0RSwgJ1YnKSwKICAgICgweEY1MiwgJ00nLCB1J+C9keC+tycpLAogICAgKDB4RjUzLCAnVicpLAogICAgKDB4RjU3LCAnTScsIHUn4L2W4L63JyksCiAgICAoMHhGNTgsICdWJyksCiAgICAoMHhGNUMsICdNJywgdSfgvZvgvrcnKSwKICAgICgweEY1RCwgJ1YnKSwKICAgICgweEY2OSwgJ00nLCB1J+C9gOC+tScpLAogICAgKDB4RjZBLCAnVicpLAogICAgKDB4RjZELCAnWCcpLAogICAgKDB4RjcxLCAnVicpLAogICAgKDB4RjczLCAnTScsIHUn4L2x4L2yJyksCiAgICAoMHhGNzQsICdWJyksCiAgICAoMHhGNzUsICdNJywgdSfgvbHgvbQnKSwKICAgICgweEY3NiwgJ00nLCB1J+C+suC+gCcpLAogICAgKDB4Rjc3LCAnTScsIHUn4L6y4L2x4L6AJyksCiAgICAoMHhGNzgsICdNJywgdSfgvrPgvoAnKSwKICAgICgweEY3OSwgJ00nLCB1J+C+s+C9seC+gCcpLAogICAgKDB4RjdBLCAnVicpLAogICAgKDB4RjgxLCAnTScsIHUn4L2x4L6AJyksCiAgICAoMHhGODIsICdWJyksCiAgICAoMHhGOTMsICdNJywgdSfgvpLgvrcnKSwKICAgICgweEY5NCwgJ1YnKSwKICAgICgweEY5OCwgJ1gnKSwKICAgICgweEY5OSwgJ1YnKSwKICAgICgweEY5RCwgJ00nLCB1J+C+nOC+tycpLAogICAgKDB4RjlFLCAnVicpLAogICAgKDB4RkEyLCAnTScsIHUn4L6h4L63JyksCiAgICAoMHhGQTMsICdWJyksCiAgICAoMHhGQTcsICdNJywgdSfgvqbgvrcnKSwKICAgICgweEZBOCwgJ1YnKSwKICAgICgweEZBQywgJ00nLCB1J+C+q+C+tycpLAogICAgKDB4RkFELCAnVicpLAogICAgKDB4RkI5LCAnTScsIHUn4L6Q4L61JyksCiAgICAoMHhGQkEsICdWJyksCiAgICAoMHhGQkQsICdYJyksCiAgICAoMHhGQkUsICdWJyksCiAgICAoMHhGQ0QsICdYJyksCiAgICAoMHhGQ0UsICdWJyksCiAgICAoMHhGREIsICdYJyksCiAgICAoMHgxMDAwLCAnVicpLAogICAgKDB4MTBBMCwgJ1gnKSwKICAgICgweDEwQzcsICdNJywgdSfitKcnKSwKICAgICgweDEwQzgsICdYJyksCiAgICAoMHgxMENELCAnTScsIHUn4rStJyksCiAgICAoMHgxMENFLCAnWCcpLAogICAgKDB4MTBEMCwgJ1YnKSwKICAgICgweDEwRkMsICdNJywgdSfhg5wnKSwKICAgICgweDEwRkQsICdWJyksCiAgICAoMHgxMTVGLCAnWCcpLAogICAgKDB4MTE2MSwgJ1YnKSwKICAgICgweDEyNDksICdYJyksCiAgICAoMHgxMjRBLCAnVicpLAogICAgKDB4MTI0RSwgJ1gnKSwKICAgICgweDEyNTAsICdWJyksCiAgICAoMHgxMjU3LCAnWCcpLAogICAgKDB4MTI1OCwgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzE0KCk6CiAgICByZXR1cm4gWwogICAgKDB4MTI1OSwgJ1gnKSwKICAgICgweDEyNUEsICdWJyksCiAgICAoMHgxMjVFLCAnWCcpLAogICAgKDB4MTI2MCwgJ1YnKSwKICAgICgweDEyODksICdYJyksCiAgICAoMHgxMjhBLCAnVicpLAogICAgKDB4MTI4RSwgJ1gnKSwKICAgICgweDEyOTAsICdWJyksCiAgICAoMHgxMkIxLCAnWCcpLAogICAgKDB4MTJCMiwgJ1YnKSwKICAgICgweDEyQjYsICdYJyksCiAgICAoMHgxMkI4LCAnVicpLAogICAgKDB4MTJCRiwgJ1gnKSwKICAgICgweDEyQzAsICdWJyksCiAgICAoMHgxMkMxLCAnWCcpLAogICAgKDB4MTJDMiwgJ1YnKSwKICAgICgweDEyQzYsICdYJyksCiAgICAoMHgxMkM4LCAnVicpLAogICAgKDB4MTJENywgJ1gnKSwKICAgICgweDEyRDgsICdWJyksCiAgICAoMHgxMzExLCAnWCcpLAogICAgKDB4MTMxMiwgJ1YnKSwKICAgICgweDEzMTYsICdYJyksCiAgICAoMHgxMzE4LCAnVicpLAogICAgKDB4MTM1QiwgJ1gnKSwKICAgICgweDEzNUQsICdWJyksCiAgICAoMHgxMzdELCAnWCcpLAogICAgKDB4MTM4MCwgJ1YnKSwKICAgICgweDEzOUEsICdYJyksCiAgICAoMHgxM0EwLCAnVicpLAogICAgKDB4MTNGNSwgJ1gnKSwKICAgICgweDE0MDAsICdWJyksCiAgICAoMHgxNjgwLCAnWCcpLAogICAgKDB4MTY4MSwgJ1YnKSwKICAgICgweDE2OUQsICdYJyksCiAgICAoMHgxNkEwLCAnVicpLAogICAgKDB4MTZGMSwgJ1gnKSwKICAgICgweDE3MDAsICdWJyksCiAgICAoMHgxNzBELCAnWCcpLAogICAgKDB4MTcwRSwgJ1YnKSwKICAgICgweDE3MTUsICdYJyksCiAgICAoMHgxNzIwLCAnVicpLAogICAgKDB4MTczNywgJ1gnKSwKICAgICgweDE3NDAsICdWJyksCiAgICAoMHgxNzU0LCAnWCcpLAogICAgKDB4MTc2MCwgJ1YnKSwKICAgICgweDE3NkQsICdYJyksCiAgICAoMHgxNzZFLCAnVicpLAogICAgKDB4MTc3MSwgJ1gnKSwKICAgICgweDE3NzIsICdWJyksCiAgICAoMHgxNzc0LCAnWCcpLAogICAgKDB4MTc4MCwgJ1YnKSwKICAgICgweDE3QjQsICdYJyksCiAgICAoMHgxN0I2LCAnVicpLAogICAgKDB4MTdERSwgJ1gnKSwKICAgICgweDE3RTAsICdWJyksCiAgICAoMHgxN0VBLCAnWCcpLAogICAgKDB4MTdGMCwgJ1YnKSwKICAgICgweDE3RkEsICdYJyksCiAgICAoMHgxODAwLCAnVicpLAogICAgKDB4MTgwNiwgJ1gnKSwKICAgICgweDE4MDcsICdWJyksCiAgICAoMHgxODBCLCAnSScpLAogICAgKDB4MTgwRSwgJ1gnKSwKICAgICgweDE4MTAsICdWJyksCiAgICAoMHgxODFBLCAnWCcpLAogICAgKDB4MTgyMCwgJ1YnKSwKICAgICgweDE4NzgsICdYJyksCiAgICAoMHgxODgwLCAnVicpLAogICAgKDB4MThBQiwgJ1gnKSwKICAgICgweDE4QjAsICdWJyksCiAgICAoMHgxOEY2LCAnWCcpLAogICAgKDB4MTkwMCwgJ1YnKSwKICAgICgweDE5MUQsICdYJyksCiAgICAoMHgxOTIwLCAnVicpLAogICAgKDB4MTkyQywgJ1gnKSwKICAgICgweDE5MzAsICdWJyksCiAgICAoMHgxOTNDLCAnWCcpLAogICAgKDB4MTk0MCwgJ1YnKSwKICAgICgweDE5NDEsICdYJyksCiAgICAoMHgxOTQ0LCAnVicpLAogICAgKDB4MTk2RSwgJ1gnKSwKICAgICgweDE5NzAsICdWJyksCiAgICAoMHgxOTc1LCAnWCcpLAogICAgKDB4MTk4MCwgJ1YnKSwKICAgICgweDE5QUMsICdYJyksCiAgICAoMHgxOUIwLCAnVicpLAogICAgKDB4MTlDQSwgJ1gnKSwKICAgICgweDE5RDAsICdWJyksCiAgICAoMHgxOURCLCAnWCcpLAogICAgKDB4MTlERSwgJ1YnKSwKICAgICgweDFBMUMsICdYJyksCiAgICAoMHgxQTFFLCAnVicpLAogICAgKDB4MUE1RiwgJ1gnKSwKICAgICgweDFBNjAsICdWJyksCiAgICAoMHgxQTdELCAnWCcpLAogICAgKDB4MUE3RiwgJ1YnKSwKICAgICgweDFBOEEsICdYJyksCiAgICAoMHgxQTkwLCAnVicpLAogICAgKDB4MUE5QSwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzE1KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUFBMCwgJ1YnKSwKICAgICgweDFBQUUsICdYJyksCiAgICAoMHgxQjAwLCAnVicpLAogICAgKDB4MUI0QywgJ1gnKSwKICAgICgweDFCNTAsICdWJyksCiAgICAoMHgxQjdELCAnWCcpLAogICAgKDB4MUI4MCwgJ1YnKSwKICAgICgweDFCRjQsICdYJyksCiAgICAoMHgxQkZDLCAnVicpLAogICAgKDB4MUMzOCwgJ1gnKSwKICAgICgweDFDM0IsICdWJyksCiAgICAoMHgxQzRBLCAnWCcpLAogICAgKDB4MUM0RCwgJ1YnKSwKICAgICgweDFDODAsICdYJyksCiAgICAoMHgxQ0MwLCAnVicpLAogICAgKDB4MUNDOCwgJ1gnKSwKICAgICgweDFDRDAsICdWJyksCiAgICAoMHgxQ0Y3LCAnWCcpLAogICAgKDB4MUQwMCwgJ1YnKSwKICAgICgweDFEMkMsICdNJywgdSdhJyksCiAgICAoMHgxRDJELCAnTScsIHUnw6YnKSwKICAgICgweDFEMkUsICdNJywgdSdiJyksCiAgICAoMHgxRDJGLCAnVicpLAogICAgKDB4MUQzMCwgJ00nLCB1J2QnKSwKICAgICgweDFEMzEsICdNJywgdSdlJyksCiAgICAoMHgxRDMyLCAnTScsIHUnx50nKSwKICAgICgweDFEMzMsICdNJywgdSdnJyksCiAgICAoMHgxRDM0LCAnTScsIHUnaCcpLAogICAgKDB4MUQzNSwgJ00nLCB1J2knKSwKICAgICgweDFEMzYsICdNJywgdSdqJyksCiAgICAoMHgxRDM3LCAnTScsIHUnaycpLAogICAgKDB4MUQzOCwgJ00nLCB1J2wnKSwKICAgICgweDFEMzksICdNJywgdSdtJyksCiAgICAoMHgxRDNBLCAnTScsIHUnbicpLAogICAgKDB4MUQzQiwgJ1YnKSwKICAgICgweDFEM0MsICdNJywgdSdvJyksCiAgICAoMHgxRDNELCAnTScsIHUnyKMnKSwKICAgICgweDFEM0UsICdNJywgdSdwJyksCiAgICAoMHgxRDNGLCAnTScsIHUncicpLAogICAgKDB4MUQ0MCwgJ00nLCB1J3QnKSwKICAgICgweDFENDEsICdNJywgdSd1JyksCiAgICAoMHgxRDQyLCAnTScsIHUndycpLAogICAgKDB4MUQ0MywgJ00nLCB1J2EnKSwKICAgICgweDFENDQsICdNJywgdSfJkCcpLAogICAgKDB4MUQ0NSwgJ00nLCB1J8mRJyksCiAgICAoMHgxRDQ2LCAnTScsIHUn4bSCJyksCiAgICAoMHgxRDQ3LCAnTScsIHUnYicpLAogICAgKDB4MUQ0OCwgJ00nLCB1J2QnKSwKICAgICgweDFENDksICdNJywgdSdlJyksCiAgICAoMHgxRDRBLCAnTScsIHUnyZknKSwKICAgICgweDFENEIsICdNJywgdSfJmycpLAogICAgKDB4MUQ0QywgJ00nLCB1J8mcJyksCiAgICAoMHgxRDRELCAnTScsIHUnZycpLAogICAgKDB4MUQ0RSwgJ1YnKSwKICAgICgweDFENEYsICdNJywgdSdrJyksCiAgICAoMHgxRDUwLCAnTScsIHUnbScpLAogICAgKDB4MUQ1MSwgJ00nLCB1J8WLJyksCiAgICAoMHgxRDUyLCAnTScsIHUnbycpLAogICAgKDB4MUQ1MywgJ00nLCB1J8mUJyksCiAgICAoMHgxRDU0LCAnTScsIHUn4bSWJyksCiAgICAoMHgxRDU1LCAnTScsIHUn4bSXJyksCiAgICAoMHgxRDU2LCAnTScsIHUncCcpLAogICAgKDB4MUQ1NywgJ00nLCB1J3QnKSwKICAgICgweDFENTgsICdNJywgdSd1JyksCiAgICAoMHgxRDU5LCAnTScsIHUn4bSdJyksCiAgICAoMHgxRDVBLCAnTScsIHUnya8nKSwKICAgICgweDFENUIsICdNJywgdSd2JyksCiAgICAoMHgxRDVDLCAnTScsIHUn4bSlJyksCiAgICAoMHgxRDVELCAnTScsIHUnzrInKSwKICAgICgweDFENUUsICdNJywgdSfOsycpLAogICAgKDB4MUQ1RiwgJ00nLCB1J860JyksCiAgICAoMHgxRDYwLCAnTScsIHUnz4YnKSwKICAgICgweDFENjEsICdNJywgdSfPhycpLAogICAgKDB4MUQ2MiwgJ00nLCB1J2knKSwKICAgICgweDFENjMsICdNJywgdSdyJyksCiAgICAoMHgxRDY0LCAnTScsIHUndScpLAogICAgKDB4MUQ2NSwgJ00nLCB1J3YnKSwKICAgICgweDFENjYsICdNJywgdSfOsicpLAogICAgKDB4MUQ2NywgJ00nLCB1J86zJyksCiAgICAoMHgxRDY4LCAnTScsIHUnz4EnKSwKICAgICgweDFENjksICdNJywgdSfPhicpLAogICAgKDB4MUQ2QSwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDZCLCAnVicpLAogICAgKDB4MUQ3OCwgJ00nLCB1J9C9JyksCiAgICAoMHgxRDc5LCAnVicpLAogICAgKDB4MUQ5QiwgJ00nLCB1J8mSJyksCiAgICAoMHgxRDlDLCAnTScsIHUnYycpLAogICAgKDB4MUQ5RCwgJ00nLCB1J8mVJyksCiAgICAoMHgxRDlFLCAnTScsIHUnw7AnKSwKICAgICgweDFEOUYsICdNJywgdSfJnCcpLAogICAgKDB4MURBMCwgJ00nLCB1J2YnKSwKICAgICgweDFEQTEsICdNJywgdSfJnycpLAogICAgKDB4MURBMiwgJ00nLCB1J8mhJyksCiAgICAoMHgxREEzLCAnTScsIHUnyaUnKSwKICAgICgweDFEQTQsICdNJywgdSfJqCcpLAogICAgKDB4MURBNSwgJ00nLCB1J8mpJyksCiAgICAoMHgxREE2LCAnTScsIHUnyaonKSwKICAgICgweDFEQTcsICdNJywgdSfhtbsnKSwKICAgICgweDFEQTgsICdNJywgdSfKnScpLAogICAgKDB4MURBOSwgJ00nLCB1J8mtJyksCiAgICBdCgpkZWYgX3NlZ18xNigpOgogICAgcmV0dXJuIFsKICAgICgweDFEQUEsICdNJywgdSfhtoUnKSwKICAgICgweDFEQUIsICdNJywgdSfKnycpLAogICAgKDB4MURBQywgJ00nLCB1J8mxJyksCiAgICAoMHgxREFELCAnTScsIHUnybAnKSwKICAgICgweDFEQUUsICdNJywgdSfJsicpLAogICAgKDB4MURBRiwgJ00nLCB1J8mzJyksCiAgICAoMHgxREIwLCAnTScsIHUnybQnKSwKICAgICgweDFEQjEsICdNJywgdSfJtScpLAogICAgKDB4MURCMiwgJ00nLCB1J8m4JyksCiAgICAoMHgxREIzLCAnTScsIHUnyoInKSwKICAgICgweDFEQjQsICdNJywgdSfKgycpLAogICAgKDB4MURCNSwgJ00nLCB1J8arJyksCiAgICAoMHgxREI2LCAnTScsIHUnyoknKSwKICAgICgweDFEQjcsICdNJywgdSfKiicpLAogICAgKDB4MURCOCwgJ00nLCB1J+G0nCcpLAogICAgKDB4MURCOSwgJ00nLCB1J8qLJyksCiAgICAoMHgxREJBLCAnTScsIHUnyownKSwKICAgICgweDFEQkIsICdNJywgdSd6JyksCiAgICAoMHgxREJDLCAnTScsIHUnypAnKSwKICAgICgweDFEQkQsICdNJywgdSfKkScpLAogICAgKDB4MURCRSwgJ00nLCB1J8qSJyksCiAgICAoMHgxREJGLCAnTScsIHUnzrgnKSwKICAgICgweDFEQzAsICdWJyksCiAgICAoMHgxREU3LCAnWCcpLAogICAgKDB4MURGQywgJ1YnKSwKICAgICgweDFFMDAsICdNJywgdSfhuIEnKSwKICAgICgweDFFMDEsICdWJyksCiAgICAoMHgxRTAyLCAnTScsIHUn4biDJyksCiAgICAoMHgxRTAzLCAnVicpLAogICAgKDB4MUUwNCwgJ00nLCB1J+G4hScpLAogICAgKDB4MUUwNSwgJ1YnKSwKICAgICgweDFFMDYsICdNJywgdSfhuIcnKSwKICAgICgweDFFMDcsICdWJyksCiAgICAoMHgxRTA4LCAnTScsIHUn4biJJyksCiAgICAoMHgxRTA5LCAnVicpLAogICAgKDB4MUUwQSwgJ00nLCB1J+G4iycpLAogICAgKDB4MUUwQiwgJ1YnKSwKICAgICgweDFFMEMsICdNJywgdSfhuI0nKSwKICAgICgweDFFMEQsICdWJyksCiAgICAoMHgxRTBFLCAnTScsIHUn4biPJyksCiAgICAoMHgxRTBGLCAnVicpLAogICAgKDB4MUUxMCwgJ00nLCB1J+G4kScpLAogICAgKDB4MUUxMSwgJ1YnKSwKICAgICgweDFFMTIsICdNJywgdSfhuJMnKSwKICAgICgweDFFMTMsICdWJyksCiAgICAoMHgxRTE0LCAnTScsIHUn4biVJyksCiAgICAoMHgxRTE1LCAnVicpLAogICAgKDB4MUUxNiwgJ00nLCB1J+G4lycpLAogICAgKDB4MUUxNywgJ1YnKSwKICAgICgweDFFMTgsICdNJywgdSfhuJknKSwKICAgICgweDFFMTksICdWJyksCiAgICAoMHgxRTFBLCAnTScsIHUn4bibJyksCiAgICAoMHgxRTFCLCAnVicpLAogICAgKDB4MUUxQywgJ00nLCB1J+G4nScpLAogICAgKDB4MUUxRCwgJ1YnKSwKICAgICgweDFFMUUsICdNJywgdSfhuJ8nKSwKICAgICgweDFFMUYsICdWJyksCiAgICAoMHgxRTIwLCAnTScsIHUn4bihJyksCiAgICAoMHgxRTIxLCAnVicpLAogICAgKDB4MUUyMiwgJ00nLCB1J+G4oycpLAogICAgKDB4MUUyMywgJ1YnKSwKICAgICgweDFFMjQsICdNJywgdSfhuKUnKSwKICAgICgweDFFMjUsICdWJyksCiAgICAoMHgxRTI2LCAnTScsIHUn4binJyksCiAgICAoMHgxRTI3LCAnVicpLAogICAgKDB4MUUyOCwgJ00nLCB1J+G4qScpLAogICAgKDB4MUUyOSwgJ1YnKSwKICAgICgweDFFMkEsICdNJywgdSfhuKsnKSwKICAgICgweDFFMkIsICdWJyksCiAgICAoMHgxRTJDLCAnTScsIHUn4bitJyksCiAgICAoMHgxRTJELCAnVicpLAogICAgKDB4MUUyRSwgJ00nLCB1J+G4rycpLAogICAgKDB4MUUyRiwgJ1YnKSwKICAgICgweDFFMzAsICdNJywgdSfhuLEnKSwKICAgICgweDFFMzEsICdWJyksCiAgICAoMHgxRTMyLCAnTScsIHUn4bizJyksCiAgICAoMHgxRTMzLCAnVicpLAogICAgKDB4MUUzNCwgJ00nLCB1J+G4tScpLAogICAgKDB4MUUzNSwgJ1YnKSwKICAgICgweDFFMzYsICdNJywgdSfhuLcnKSwKICAgICgweDFFMzcsICdWJyksCiAgICAoMHgxRTM4LCAnTScsIHUn4bi5JyksCiAgICAoMHgxRTM5LCAnVicpLAogICAgKDB4MUUzQSwgJ00nLCB1J+G4uycpLAogICAgKDB4MUUzQiwgJ1YnKSwKICAgICgweDFFM0MsICdNJywgdSfhuL0nKSwKICAgICgweDFFM0QsICdWJyksCiAgICAoMHgxRTNFLCAnTScsIHUn4bi/JyksCiAgICAoMHgxRTNGLCAnVicpLAogICAgKDB4MUU0MCwgJ00nLCB1J+G5gScpLAogICAgKDB4MUU0MSwgJ1YnKSwKICAgICgweDFFNDIsICdNJywgdSfhuYMnKSwKICAgICgweDFFNDMsICdWJyksCiAgICAoMHgxRTQ0LCAnTScsIHUn4bmFJyksCiAgICAoMHgxRTQ1LCAnVicpLAogICAgKDB4MUU0NiwgJ00nLCB1J+G5hycpLAogICAgKDB4MUU0NywgJ1YnKSwKICAgICgweDFFNDgsICdNJywgdSfhuYknKSwKICAgICgweDFFNDksICdWJyksCiAgICAoMHgxRTRBLCAnTScsIHUn4bmLJyksCiAgICBdCgpkZWYgX3NlZ18xNygpOgogICAgcmV0dXJuIFsKICAgICgweDFFNEIsICdWJyksCiAgICAoMHgxRTRDLCAnTScsIHUn4bmNJyksCiAgICAoMHgxRTRELCAnVicpLAogICAgKDB4MUU0RSwgJ00nLCB1J+G5jycpLAogICAgKDB4MUU0RiwgJ1YnKSwKICAgICgweDFFNTAsICdNJywgdSfhuZEnKSwKICAgICgweDFFNTEsICdWJyksCiAgICAoMHgxRTUyLCAnTScsIHUn4bmTJyksCiAgICAoMHgxRTUzLCAnVicpLAogICAgKDB4MUU1NCwgJ00nLCB1J+G5lScpLAogICAgKDB4MUU1NSwgJ1YnKSwKICAgICgweDFFNTYsICdNJywgdSfhuZcnKSwKICAgICgweDFFNTcsICdWJyksCiAgICAoMHgxRTU4LCAnTScsIHUn4bmZJyksCiAgICAoMHgxRTU5LCAnVicpLAogICAgKDB4MUU1QSwgJ00nLCB1J+G5mycpLAogICAgKDB4MUU1QiwgJ1YnKSwKICAgICgweDFFNUMsICdNJywgdSfhuZ0nKSwKICAgICgweDFFNUQsICdWJyksCiAgICAoMHgxRTVFLCAnTScsIHUn4bmfJyksCiAgICAoMHgxRTVGLCAnVicpLAogICAgKDB4MUU2MCwgJ00nLCB1J+G5oScpLAogICAgKDB4MUU2MSwgJ1YnKSwKICAgICgweDFFNjIsICdNJywgdSfhuaMnKSwKICAgICgweDFFNjMsICdWJyksCiAgICAoMHgxRTY0LCAnTScsIHUn4bmlJyksCiAgICAoMHgxRTY1LCAnVicpLAogICAgKDB4MUU2NiwgJ00nLCB1J+G5pycpLAogICAgKDB4MUU2NywgJ1YnKSwKICAgICgweDFFNjgsICdNJywgdSfhuaknKSwKICAgICgweDFFNjksICdWJyksCiAgICAoMHgxRTZBLCAnTScsIHUn4bmrJyksCiAgICAoMHgxRTZCLCAnVicpLAogICAgKDB4MUU2QywgJ00nLCB1J+G5rScpLAogICAgKDB4MUU2RCwgJ1YnKSwKICAgICgweDFFNkUsICdNJywgdSfhua8nKSwKICAgICgweDFFNkYsICdWJyksCiAgICAoMHgxRTcwLCAnTScsIHUn4bmxJyksCiAgICAoMHgxRTcxLCAnVicpLAogICAgKDB4MUU3MiwgJ00nLCB1J+G5sycpLAogICAgKDB4MUU3MywgJ1YnKSwKICAgICgweDFFNzQsICdNJywgdSfhubUnKSwKICAgICgweDFFNzUsICdWJyksCiAgICAoMHgxRTc2LCAnTScsIHUn4bm3JyksCiAgICAoMHgxRTc3LCAnVicpLAogICAgKDB4MUU3OCwgJ00nLCB1J+G5uScpLAogICAgKDB4MUU3OSwgJ1YnKSwKICAgICgweDFFN0EsICdNJywgdSfhubsnKSwKICAgICgweDFFN0IsICdWJyksCiAgICAoMHgxRTdDLCAnTScsIHUn4bm9JyksCiAgICAoMHgxRTdELCAnVicpLAogICAgKDB4MUU3RSwgJ00nLCB1J+G5vycpLAogICAgKDB4MUU3RiwgJ1YnKSwKICAgICgweDFFODAsICdNJywgdSfhuoEnKSwKICAgICgweDFFODEsICdWJyksCiAgICAoMHgxRTgyLCAnTScsIHUn4bqDJyksCiAgICAoMHgxRTgzLCAnVicpLAogICAgKDB4MUU4NCwgJ00nLCB1J+G6hScpLAogICAgKDB4MUU4NSwgJ1YnKSwKICAgICgweDFFODYsICdNJywgdSfhuocnKSwKICAgICgweDFFODcsICdWJyksCiAgICAoMHgxRTg4LCAnTScsIHUn4bqJJyksCiAgICAoMHgxRTg5LCAnVicpLAogICAgKDB4MUU4QSwgJ00nLCB1J+G6iycpLAogICAgKDB4MUU4QiwgJ1YnKSwKICAgICgweDFFOEMsICdNJywgdSfhuo0nKSwKICAgICgweDFFOEQsICdWJyksCiAgICAoMHgxRThFLCAnTScsIHUn4bqPJyksCiAgICAoMHgxRThGLCAnVicpLAogICAgKDB4MUU5MCwgJ00nLCB1J+G6kScpLAogICAgKDB4MUU5MSwgJ1YnKSwKICAgICgweDFFOTIsICdNJywgdSfhupMnKSwKICAgICgweDFFOTMsICdWJyksCiAgICAoMHgxRTk0LCAnTScsIHUn4bqVJyksCiAgICAoMHgxRTk1LCAnVicpLAogICAgKDB4MUU5QSwgJ00nLCB1J2HKvicpLAogICAgKDB4MUU5QiwgJ00nLCB1J+G5oScpLAogICAgKDB4MUU5QywgJ1YnKSwKICAgICgweDFFOUUsICdNJywgdSdzcycpLAogICAgKDB4MUU5RiwgJ1YnKSwKICAgICgweDFFQTAsICdNJywgdSfhuqEnKSwKICAgICgweDFFQTEsICdWJyksCiAgICAoMHgxRUEyLCAnTScsIHUn4bqjJyksCiAgICAoMHgxRUEzLCAnVicpLAogICAgKDB4MUVBNCwgJ00nLCB1J+G6pScpLAogICAgKDB4MUVBNSwgJ1YnKSwKICAgICgweDFFQTYsICdNJywgdSfhuqcnKSwKICAgICgweDFFQTcsICdWJyksCiAgICAoMHgxRUE4LCAnTScsIHUn4bqpJyksCiAgICAoMHgxRUE5LCAnVicpLAogICAgKDB4MUVBQSwgJ00nLCB1J+G6qycpLAogICAgKDB4MUVBQiwgJ1YnKSwKICAgICgweDFFQUMsICdNJywgdSfhuq0nKSwKICAgICgweDFFQUQsICdWJyksCiAgICAoMHgxRUFFLCAnTScsIHUn4bqvJyksCiAgICAoMHgxRUFGLCAnVicpLAogICAgKDB4MUVCMCwgJ00nLCB1J+G6sScpLAogICAgKDB4MUVCMSwgJ1YnKSwKICAgICgweDFFQjIsICdNJywgdSfhurMnKSwKICAgICgweDFFQjMsICdWJyksCiAgICBdCgpkZWYgX3NlZ18xOCgpOgogICAgcmV0dXJuIFsKICAgICgweDFFQjQsICdNJywgdSfhurUnKSwKICAgICgweDFFQjUsICdWJyksCiAgICAoMHgxRUI2LCAnTScsIHUn4bq3JyksCiAgICAoMHgxRUI3LCAnVicpLAogICAgKDB4MUVCOCwgJ00nLCB1J+G6uScpLAogICAgKDB4MUVCOSwgJ1YnKSwKICAgICgweDFFQkEsICdNJywgdSfhursnKSwKICAgICgweDFFQkIsICdWJyksCiAgICAoMHgxRUJDLCAnTScsIHUn4bq9JyksCiAgICAoMHgxRUJELCAnVicpLAogICAgKDB4MUVCRSwgJ00nLCB1J+G6vycpLAogICAgKDB4MUVCRiwgJ1YnKSwKICAgICgweDFFQzAsICdNJywgdSfhu4EnKSwKICAgICgweDFFQzEsICdWJyksCiAgICAoMHgxRUMyLCAnTScsIHUn4buDJyksCiAgICAoMHgxRUMzLCAnVicpLAogICAgKDB4MUVDNCwgJ00nLCB1J+G7hScpLAogICAgKDB4MUVDNSwgJ1YnKSwKICAgICgweDFFQzYsICdNJywgdSfhu4cnKSwKICAgICgweDFFQzcsICdWJyksCiAgICAoMHgxRUM4LCAnTScsIHUn4buJJyksCiAgICAoMHgxRUM5LCAnVicpLAogICAgKDB4MUVDQSwgJ00nLCB1J+G7iycpLAogICAgKDB4MUVDQiwgJ1YnKSwKICAgICgweDFFQ0MsICdNJywgdSfhu40nKSwKICAgICgweDFFQ0QsICdWJyksCiAgICAoMHgxRUNFLCAnTScsIHUn4buPJyksCiAgICAoMHgxRUNGLCAnVicpLAogICAgKDB4MUVEMCwgJ00nLCB1J+G7kScpLAogICAgKDB4MUVEMSwgJ1YnKSwKICAgICgweDFFRDIsICdNJywgdSfhu5MnKSwKICAgICgweDFFRDMsICdWJyksCiAgICAoMHgxRUQ0LCAnTScsIHUn4buVJyksCiAgICAoMHgxRUQ1LCAnVicpLAogICAgKDB4MUVENiwgJ00nLCB1J+G7lycpLAogICAgKDB4MUVENywgJ1YnKSwKICAgICgweDFFRDgsICdNJywgdSfhu5knKSwKICAgICgweDFFRDksICdWJyksCiAgICAoMHgxRURBLCAnTScsIHUn4bubJyksCiAgICAoMHgxRURCLCAnVicpLAogICAgKDB4MUVEQywgJ00nLCB1J+G7nScpLAogICAgKDB4MUVERCwgJ1YnKSwKICAgICgweDFFREUsICdNJywgdSfhu58nKSwKICAgICgweDFFREYsICdWJyksCiAgICAoMHgxRUUwLCAnTScsIHUn4buhJyksCiAgICAoMHgxRUUxLCAnVicpLAogICAgKDB4MUVFMiwgJ00nLCB1J+G7oycpLAogICAgKDB4MUVFMywgJ1YnKSwKICAgICgweDFFRTQsICdNJywgdSfhu6UnKSwKICAgICgweDFFRTUsICdWJyksCiAgICAoMHgxRUU2LCAnTScsIHUn4bunJyksCiAgICAoMHgxRUU3LCAnVicpLAogICAgKDB4MUVFOCwgJ00nLCB1J+G7qScpLAogICAgKDB4MUVFOSwgJ1YnKSwKICAgICgweDFFRUEsICdNJywgdSfhu6snKSwKICAgICgweDFFRUIsICdWJyksCiAgICAoMHgxRUVDLCAnTScsIHUn4butJyksCiAgICAoMHgxRUVELCAnVicpLAogICAgKDB4MUVFRSwgJ00nLCB1J+G7rycpLAogICAgKDB4MUVFRiwgJ1YnKSwKICAgICgweDFFRjAsICdNJywgdSfhu7EnKSwKICAgICgweDFFRjEsICdWJyksCiAgICAoMHgxRUYyLCAnTScsIHUn4buzJyksCiAgICAoMHgxRUYzLCAnVicpLAogICAgKDB4MUVGNCwgJ00nLCB1J+G7tScpLAogICAgKDB4MUVGNSwgJ1YnKSwKICAgICgweDFFRjYsICdNJywgdSfhu7cnKSwKICAgICgweDFFRjcsICdWJyksCiAgICAoMHgxRUY4LCAnTScsIHUn4bu5JyksCiAgICAoMHgxRUY5LCAnVicpLAogICAgKDB4MUVGQSwgJ00nLCB1J+G7uycpLAogICAgKDB4MUVGQiwgJ1YnKSwKICAgICgweDFFRkMsICdNJywgdSfhu70nKSwKICAgICgweDFFRkQsICdWJyksCiAgICAoMHgxRUZFLCAnTScsIHUn4bu/JyksCiAgICAoMHgxRUZGLCAnVicpLAogICAgKDB4MUYwOCwgJ00nLCB1J+G8gCcpLAogICAgKDB4MUYwOSwgJ00nLCB1J+G8gScpLAogICAgKDB4MUYwQSwgJ00nLCB1J+G8gicpLAogICAgKDB4MUYwQiwgJ00nLCB1J+G8gycpLAogICAgKDB4MUYwQywgJ00nLCB1J+G8hCcpLAogICAgKDB4MUYwRCwgJ00nLCB1J+G8hScpLAogICAgKDB4MUYwRSwgJ00nLCB1J+G8hicpLAogICAgKDB4MUYwRiwgJ00nLCB1J+G8hycpLAogICAgKDB4MUYxMCwgJ1YnKSwKICAgICgweDFGMTYsICdYJyksCiAgICAoMHgxRjE4LCAnTScsIHUn4byQJyksCiAgICAoMHgxRjE5LCAnTScsIHUn4byRJyksCiAgICAoMHgxRjFBLCAnTScsIHUn4bySJyksCiAgICAoMHgxRjFCLCAnTScsIHUn4byTJyksCiAgICAoMHgxRjFDLCAnTScsIHUn4byUJyksCiAgICAoMHgxRjFELCAnTScsIHUn4byVJyksCiAgICAoMHgxRjFFLCAnWCcpLAogICAgKDB4MUYyMCwgJ1YnKSwKICAgICgweDFGMjgsICdNJywgdSfhvKAnKSwKICAgICgweDFGMjksICdNJywgdSfhvKEnKSwKICAgICgweDFGMkEsICdNJywgdSfhvKInKSwKICAgICgweDFGMkIsICdNJywgdSfhvKMnKSwKICAgICgweDFGMkMsICdNJywgdSfhvKQnKSwKICAgICgweDFGMkQsICdNJywgdSfhvKUnKSwKICAgIF0KCmRlZiBfc2VnXzE5KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUYyRSwgJ00nLCB1J+G8picpLAogICAgKDB4MUYyRiwgJ00nLCB1J+G8pycpLAogICAgKDB4MUYzMCwgJ1YnKSwKICAgICgweDFGMzgsICdNJywgdSfhvLAnKSwKICAgICgweDFGMzksICdNJywgdSfhvLEnKSwKICAgICgweDFGM0EsICdNJywgdSfhvLInKSwKICAgICgweDFGM0IsICdNJywgdSfhvLMnKSwKICAgICgweDFGM0MsICdNJywgdSfhvLQnKSwKICAgICgweDFGM0QsICdNJywgdSfhvLUnKSwKICAgICgweDFGM0UsICdNJywgdSfhvLYnKSwKICAgICgweDFGM0YsICdNJywgdSfhvLcnKSwKICAgICgweDFGNDAsICdWJyksCiAgICAoMHgxRjQ2LCAnWCcpLAogICAgKDB4MUY0OCwgJ00nLCB1J+G9gCcpLAogICAgKDB4MUY0OSwgJ00nLCB1J+G9gScpLAogICAgKDB4MUY0QSwgJ00nLCB1J+G9gicpLAogICAgKDB4MUY0QiwgJ00nLCB1J+G9gycpLAogICAgKDB4MUY0QywgJ00nLCB1J+G9hCcpLAogICAgKDB4MUY0RCwgJ00nLCB1J+G9hScpLAogICAgKDB4MUY0RSwgJ1gnKSwKICAgICgweDFGNTAsICdWJyksCiAgICAoMHgxRjU4LCAnWCcpLAogICAgKDB4MUY1OSwgJ00nLCB1J+G9kScpLAogICAgKDB4MUY1QSwgJ1gnKSwKICAgICgweDFGNUIsICdNJywgdSfhvZMnKSwKICAgICgweDFGNUMsICdYJyksCiAgICAoMHgxRjVELCAnTScsIHUn4b2VJyksCiAgICAoMHgxRjVFLCAnWCcpLAogICAgKDB4MUY1RiwgJ00nLCB1J+G9lycpLAogICAgKDB4MUY2MCwgJ1YnKSwKICAgICgweDFGNjgsICdNJywgdSfhvaAnKSwKICAgICgweDFGNjksICdNJywgdSfhvaEnKSwKICAgICgweDFGNkEsICdNJywgdSfhvaInKSwKICAgICgweDFGNkIsICdNJywgdSfhvaMnKSwKICAgICgweDFGNkMsICdNJywgdSfhvaQnKSwKICAgICgweDFGNkQsICdNJywgdSfhvaUnKSwKICAgICgweDFGNkUsICdNJywgdSfhvaYnKSwKICAgICgweDFGNkYsICdNJywgdSfhvacnKSwKICAgICgweDFGNzAsICdWJyksCiAgICAoMHgxRjcxLCAnTScsIHUnzqwnKSwKICAgICgweDFGNzIsICdWJyksCiAgICAoMHgxRjczLCAnTScsIHUnzq0nKSwKICAgICgweDFGNzQsICdWJyksCiAgICAoMHgxRjc1LCAnTScsIHUnzq4nKSwKICAgICgweDFGNzYsICdWJyksCiAgICAoMHgxRjc3LCAnTScsIHUnzq8nKSwKICAgICgweDFGNzgsICdWJyksCiAgICAoMHgxRjc5LCAnTScsIHUnz4wnKSwKICAgICgweDFGN0EsICdWJyksCiAgICAoMHgxRjdCLCAnTScsIHUnz40nKSwKICAgICgweDFGN0MsICdWJyksCiAgICAoMHgxRjdELCAnTScsIHUnz44nKSwKICAgICgweDFGN0UsICdYJyksCiAgICAoMHgxRjgwLCAnTScsIHUn4byAzrknKSwKICAgICgweDFGODEsICdNJywgdSfhvIHOuScpLAogICAgKDB4MUY4MiwgJ00nLCB1J+G8gs65JyksCiAgICAoMHgxRjgzLCAnTScsIHUn4byDzrknKSwKICAgICgweDFGODQsICdNJywgdSfhvITOuScpLAogICAgKDB4MUY4NSwgJ00nLCB1J+G8hc65JyksCiAgICAoMHgxRjg2LCAnTScsIHUn4byGzrknKSwKICAgICgweDFGODcsICdNJywgdSfhvIfOuScpLAogICAgKDB4MUY4OCwgJ00nLCB1J+G8gM65JyksCiAgICAoMHgxRjg5LCAnTScsIHUn4byBzrknKSwKICAgICgweDFGOEEsICdNJywgdSfhvILOuScpLAogICAgKDB4MUY4QiwgJ00nLCB1J+G8g865JyksCiAgICAoMHgxRjhDLCAnTScsIHUn4byEzrknKSwKICAgICgweDFGOEQsICdNJywgdSfhvIXOuScpLAogICAgKDB4MUY4RSwgJ00nLCB1J+G8hs65JyksCiAgICAoMHgxRjhGLCAnTScsIHUn4byHzrknKSwKICAgICgweDFGOTAsICdNJywgdSfhvKDOuScpLAogICAgKDB4MUY5MSwgJ00nLCB1J+G8oc65JyksCiAgICAoMHgxRjkyLCAnTScsIHUn4byizrknKSwKICAgICgweDFGOTMsICdNJywgdSfhvKPOuScpLAogICAgKDB4MUY5NCwgJ00nLCB1J+G8pM65JyksCiAgICAoMHgxRjk1LCAnTScsIHUn4bylzrknKSwKICAgICgweDFGOTYsICdNJywgdSfhvKbOuScpLAogICAgKDB4MUY5NywgJ00nLCB1J+G8p865JyksCiAgICAoMHgxRjk4LCAnTScsIHUn4bygzrknKSwKICAgICgweDFGOTksICdNJywgdSfhvKHOuScpLAogICAgKDB4MUY5QSwgJ00nLCB1J+G8os65JyksCiAgICAoMHgxRjlCLCAnTScsIHUn4byjzrknKSwKICAgICgweDFGOUMsICdNJywgdSfhvKTOuScpLAogICAgKDB4MUY5RCwgJ00nLCB1J+G8pc65JyksCiAgICAoMHgxRjlFLCAnTScsIHUn4bymzrknKSwKICAgICgweDFGOUYsICdNJywgdSfhvKfOuScpLAogICAgKDB4MUZBMCwgJ00nLCB1J+G9oM65JyksCiAgICAoMHgxRkExLCAnTScsIHUn4b2hzrknKSwKICAgICgweDFGQTIsICdNJywgdSfhvaLOuScpLAogICAgKDB4MUZBMywgJ00nLCB1J+G9o865JyksCiAgICAoMHgxRkE0LCAnTScsIHUn4b2kzrknKSwKICAgICgweDFGQTUsICdNJywgdSfhvaXOuScpLAogICAgKDB4MUZBNiwgJ00nLCB1J+G9ps65JyksCiAgICAoMHgxRkE3LCAnTScsIHUn4b2nzrknKSwKICAgICgweDFGQTgsICdNJywgdSfhvaDOuScpLAogICAgKDB4MUZBOSwgJ00nLCB1J+G9oc65JyksCiAgICAoMHgxRkFBLCAnTScsIHUn4b2izrknKSwKICAgICgweDFGQUIsICdNJywgdSfhvaPOuScpLAogICAgKDB4MUZBQywgJ00nLCB1J+G9pM65JyksCiAgICAoMHgxRkFELCAnTScsIHUn4b2lzrknKSwKICAgICgweDFGQUUsICdNJywgdSfhvabOuScpLAogICAgXQoKZGVmIF9zZWdfMjAoKToKICAgIHJldHVybiBbCiAgICAoMHgxRkFGLCAnTScsIHUn4b2nzrknKSwKICAgICgweDFGQjAsICdWJyksCiAgICAoMHgxRkIyLCAnTScsIHUn4b2wzrknKSwKICAgICgweDFGQjMsICdNJywgdSfOsc65JyksCiAgICAoMHgxRkI0LCAnTScsIHUnzqzOuScpLAogICAgKDB4MUZCNSwgJ1gnKSwKICAgICgweDFGQjYsICdWJyksCiAgICAoMHgxRkI3LCAnTScsIHUn4b62zrknKSwKICAgICgweDFGQjgsICdNJywgdSfhvrAnKSwKICAgICgweDFGQjksICdNJywgdSfhvrEnKSwKICAgICgweDFGQkEsICdNJywgdSfhvbAnKSwKICAgICgweDFGQkIsICdNJywgdSfOrCcpLAogICAgKDB4MUZCQywgJ00nLCB1J86xzrknKSwKICAgICgweDFGQkQsICczJywgdScgzJMnKSwKICAgICgweDFGQkUsICdNJywgdSfOuScpLAogICAgKDB4MUZCRiwgJzMnLCB1JyDMkycpLAogICAgKDB4MUZDMCwgJzMnLCB1JyDNgicpLAogICAgKDB4MUZDMSwgJzMnLCB1JyDMiM2CJyksCiAgICAoMHgxRkMyLCAnTScsIHUn4b20zrknKSwKICAgICgweDFGQzMsICdNJywgdSfOt865JyksCiAgICAoMHgxRkM0LCAnTScsIHUnzq7OuScpLAogICAgKDB4MUZDNSwgJ1gnKSwKICAgICgweDFGQzYsICdWJyksCiAgICAoMHgxRkM3LCAnTScsIHUn4b+GzrknKSwKICAgICgweDFGQzgsICdNJywgdSfhvbInKSwKICAgICgweDFGQzksICdNJywgdSfOrScpLAogICAgKDB4MUZDQSwgJ00nLCB1J+G9tCcpLAogICAgKDB4MUZDQiwgJ00nLCB1J86uJyksCiAgICAoMHgxRkNDLCAnTScsIHUnzrfOuScpLAogICAgKDB4MUZDRCwgJzMnLCB1JyDMk8yAJyksCiAgICAoMHgxRkNFLCAnMycsIHUnIMyTzIEnKSwKICAgICgweDFGQ0YsICczJywgdScgzJPNgicpLAogICAgKDB4MUZEMCwgJ1YnKSwKICAgICgweDFGRDMsICdNJywgdSfOkCcpLAogICAgKDB4MUZENCwgJ1gnKSwKICAgICgweDFGRDYsICdWJyksCiAgICAoMHgxRkQ4LCAnTScsIHUn4b+QJyksCiAgICAoMHgxRkQ5LCAnTScsIHUn4b+RJyksCiAgICAoMHgxRkRBLCAnTScsIHUn4b22JyksCiAgICAoMHgxRkRCLCAnTScsIHUnzq8nKSwKICAgICgweDFGREMsICdYJyksCiAgICAoMHgxRkRELCAnMycsIHUnIMyUzIAnKSwKICAgICgweDFGREUsICczJywgdScgzJTMgScpLAogICAgKDB4MUZERiwgJzMnLCB1JyDMlM2CJyksCiAgICAoMHgxRkUwLCAnVicpLAogICAgKDB4MUZFMywgJ00nLCB1J86wJyksCiAgICAoMHgxRkU0LCAnVicpLAogICAgKDB4MUZFOCwgJ00nLCB1J+G/oCcpLAogICAgKDB4MUZFOSwgJ00nLCB1J+G/oScpLAogICAgKDB4MUZFQSwgJ00nLCB1J+G9uicpLAogICAgKDB4MUZFQiwgJ00nLCB1J8+NJyksCiAgICAoMHgxRkVDLCAnTScsIHUn4b+lJyksCiAgICAoMHgxRkVELCAnMycsIHUnIMyIzIAnKSwKICAgICgweDFGRUUsICczJywgdScgzIjMgScpLAogICAgKDB4MUZFRiwgJzMnLCB1J2AnKSwKICAgICgweDFGRjAsICdYJyksCiAgICAoMHgxRkYyLCAnTScsIHUn4b28zrknKSwKICAgICgweDFGRjMsICdNJywgdSfPic65JyksCiAgICAoMHgxRkY0LCAnTScsIHUnz47OuScpLAogICAgKDB4MUZGNSwgJ1gnKSwKICAgICgweDFGRjYsICdWJyksCiAgICAoMHgxRkY3LCAnTScsIHUn4b+2zrknKSwKICAgICgweDFGRjgsICdNJywgdSfhvbgnKSwKICAgICgweDFGRjksICdNJywgdSfPjCcpLAogICAgKDB4MUZGQSwgJ00nLCB1J+G9vCcpLAogICAgKDB4MUZGQiwgJ00nLCB1J8+OJyksCiAgICAoMHgxRkZDLCAnTScsIHUnz4nOuScpLAogICAgKDB4MUZGRCwgJzMnLCB1JyDMgScpLAogICAgKDB4MUZGRSwgJzMnLCB1JyDMlCcpLAogICAgKDB4MUZGRiwgJ1gnKSwKICAgICgweDIwMDAsICczJywgdScgJyksCiAgICAoMHgyMDBCLCAnSScpLAogICAgKDB4MjAwQywgJ0QnLCB1JycpLAogICAgKDB4MjAwRSwgJ1gnKSwKICAgICgweDIwMTAsICdWJyksCiAgICAoMHgyMDExLCAnTScsIHUn4oCQJyksCiAgICAoMHgyMDEyLCAnVicpLAogICAgKDB4MjAxNywgJzMnLCB1JyDMsycpLAogICAgKDB4MjAxOCwgJ1YnKSwKICAgICgweDIwMjQsICdYJyksCiAgICAoMHgyMDI3LCAnVicpLAogICAgKDB4MjAyOCwgJ1gnKSwKICAgICgweDIwMkYsICczJywgdScgJyksCiAgICAoMHgyMDMwLCAnVicpLAogICAgKDB4MjAzMywgJ00nLCB1J+KAsuKAsicpLAogICAgKDB4MjAzNCwgJ00nLCB1J+KAsuKAsuKAsicpLAogICAgKDB4MjAzNSwgJ1YnKSwKICAgICgweDIwMzYsICdNJywgdSfigLXigLUnKSwKICAgICgweDIwMzcsICdNJywgdSfigLXigLXigLUnKSwKICAgICgweDIwMzgsICdWJyksCiAgICAoMHgyMDNDLCAnMycsIHUnISEnKSwKICAgICgweDIwM0QsICdWJyksCiAgICAoMHgyMDNFLCAnMycsIHUnIMyFJyksCiAgICAoMHgyMDNGLCAnVicpLAogICAgKDB4MjA0NywgJzMnLCB1Jz8/JyksCiAgICAoMHgyMDQ4LCAnMycsIHUnPyEnKSwKICAgICgweDIwNDksICczJywgdSchPycpLAogICAgKDB4MjA0QSwgJ1YnKSwKICAgICgweDIwNTcsICdNJywgdSfigLLigLLigLLigLInKSwKICAgICgweDIwNTgsICdWJyksCiAgICBdCgpkZWYgX3NlZ18yMSgpOgogICAgcmV0dXJuIFsKICAgICgweDIwNUYsICczJywgdScgJyksCiAgICAoMHgyMDYwLCAnSScpLAogICAgKDB4MjA2MSwgJ1gnKSwKICAgICgweDIwNjQsICdJJyksCiAgICAoMHgyMDY1LCAnWCcpLAogICAgKDB4MjA3MCwgJ00nLCB1JzAnKSwKICAgICgweDIwNzEsICdNJywgdSdpJyksCiAgICAoMHgyMDcyLCAnWCcpLAogICAgKDB4MjA3NCwgJ00nLCB1JzQnKSwKICAgICgweDIwNzUsICdNJywgdSc1JyksCiAgICAoMHgyMDc2LCAnTScsIHUnNicpLAogICAgKDB4MjA3NywgJ00nLCB1JzcnKSwKICAgICgweDIwNzgsICdNJywgdSc4JyksCiAgICAoMHgyMDc5LCAnTScsIHUnOScpLAogICAgKDB4MjA3QSwgJzMnLCB1JysnKSwKICAgICgweDIwN0IsICdNJywgdSfiiJInKSwKICAgICgweDIwN0MsICczJywgdSc9JyksCiAgICAoMHgyMDdELCAnMycsIHUnKCcpLAogICAgKDB4MjA3RSwgJzMnLCB1JyknKSwKICAgICgweDIwN0YsICdNJywgdSduJyksCiAgICAoMHgyMDgwLCAnTScsIHUnMCcpLAogICAgKDB4MjA4MSwgJ00nLCB1JzEnKSwKICAgICgweDIwODIsICdNJywgdScyJyksCiAgICAoMHgyMDgzLCAnTScsIHUnMycpLAogICAgKDB4MjA4NCwgJ00nLCB1JzQnKSwKICAgICgweDIwODUsICdNJywgdSc1JyksCiAgICAoMHgyMDg2LCAnTScsIHUnNicpLAogICAgKDB4MjA4NywgJ00nLCB1JzcnKSwKICAgICgweDIwODgsICdNJywgdSc4JyksCiAgICAoMHgyMDg5LCAnTScsIHUnOScpLAogICAgKDB4MjA4QSwgJzMnLCB1JysnKSwKICAgICgweDIwOEIsICdNJywgdSfiiJInKSwKICAgICgweDIwOEMsICczJywgdSc9JyksCiAgICAoMHgyMDhELCAnMycsIHUnKCcpLAogICAgKDB4MjA4RSwgJzMnLCB1JyknKSwKICAgICgweDIwOEYsICdYJyksCiAgICAoMHgyMDkwLCAnTScsIHUnYScpLAogICAgKDB4MjA5MSwgJ00nLCB1J2UnKSwKICAgICgweDIwOTIsICdNJywgdSdvJyksCiAgICAoMHgyMDkzLCAnTScsIHUneCcpLAogICAgKDB4MjA5NCwgJ00nLCB1J8mZJyksCiAgICAoMHgyMDk1LCAnTScsIHUnaCcpLAogICAgKDB4MjA5NiwgJ00nLCB1J2snKSwKICAgICgweDIwOTcsICdNJywgdSdsJyksCiAgICAoMHgyMDk4LCAnTScsIHUnbScpLAogICAgKDB4MjA5OSwgJ00nLCB1J24nKSwKICAgICgweDIwOUEsICdNJywgdSdwJyksCiAgICAoMHgyMDlCLCAnTScsIHUncycpLAogICAgKDB4MjA5QywgJ00nLCB1J3QnKSwKICAgICgweDIwOUQsICdYJyksCiAgICAoMHgyMEEwLCAnVicpLAogICAgKDB4MjBBOCwgJ00nLCB1J3JzJyksCiAgICAoMHgyMEE5LCAnVicpLAogICAgKDB4MjBCQiwgJ1gnKSwKICAgICgweDIwRDAsICdWJyksCiAgICAoMHgyMEYxLCAnWCcpLAogICAgKDB4MjEwMCwgJzMnLCB1J2EvYycpLAogICAgKDB4MjEwMSwgJzMnLCB1J2EvcycpLAogICAgKDB4MjEwMiwgJ00nLCB1J2MnKSwKICAgICgweDIxMDMsICdNJywgdSfCsGMnKSwKICAgICgweDIxMDQsICdWJyksCiAgICAoMHgyMTA1LCAnMycsIHUnYy9vJyksCiAgICAoMHgyMTA2LCAnMycsIHUnYy91JyksCiAgICAoMHgyMTA3LCAnTScsIHUnyZsnKSwKICAgICgweDIxMDgsICdWJyksCiAgICAoMHgyMTA5LCAnTScsIHUnwrBmJyksCiAgICAoMHgyMTBBLCAnTScsIHUnZycpLAogICAgKDB4MjEwQiwgJ00nLCB1J2gnKSwKICAgICgweDIxMEYsICdNJywgdSfEpycpLAogICAgKDB4MjExMCwgJ00nLCB1J2knKSwKICAgICgweDIxMTIsICdNJywgdSdsJyksCiAgICAoMHgyMTE0LCAnVicpLAogICAgKDB4MjExNSwgJ00nLCB1J24nKSwKICAgICgweDIxMTYsICdNJywgdSdubycpLAogICAgKDB4MjExNywgJ1YnKSwKICAgICgweDIxMTksICdNJywgdSdwJyksCiAgICAoMHgyMTFBLCAnTScsIHUncScpLAogICAgKDB4MjExQiwgJ00nLCB1J3InKSwKICAgICgweDIxMUUsICdWJyksCiAgICAoMHgyMTIwLCAnTScsIHUnc20nKSwKICAgICgweDIxMjEsICdNJywgdSd0ZWwnKSwKICAgICgweDIxMjIsICdNJywgdSd0bScpLAogICAgKDB4MjEyMywgJ1YnKSwKICAgICgweDIxMjQsICdNJywgdSd6JyksCiAgICAoMHgyMTI1LCAnVicpLAogICAgKDB4MjEyNiwgJ00nLCB1J8+JJyksCiAgICAoMHgyMTI3LCAnVicpLAogICAgKDB4MjEyOCwgJ00nLCB1J3onKSwKICAgICgweDIxMjksICdWJyksCiAgICAoMHgyMTJBLCAnTScsIHUnaycpLAogICAgKDB4MjEyQiwgJ00nLCB1J8OlJyksCiAgICAoMHgyMTJDLCAnTScsIHUnYicpLAogICAgKDB4MjEyRCwgJ00nLCB1J2MnKSwKICAgICgweDIxMkUsICdWJyksCiAgICAoMHgyMTJGLCAnTScsIHUnZScpLAogICAgKDB4MjEzMSwgJ00nLCB1J2YnKSwKICAgICgweDIxMzIsICdYJyksCiAgICAoMHgyMTMzLCAnTScsIHUnbScpLAogICAgKDB4MjEzNCwgJ00nLCB1J28nKSwKICAgICgweDIxMzUsICdNJywgdSfXkCcpLAogICAgXQoKZGVmIF9zZWdfMjIoKToKICAgIHJldHVybiBbCiAgICAoMHgyMTM2LCAnTScsIHUn15EnKSwKICAgICgweDIxMzcsICdNJywgdSfXkicpLAogICAgKDB4MjEzOCwgJ00nLCB1J9eTJyksCiAgICAoMHgyMTM5LCAnTScsIHUnaScpLAogICAgKDB4MjEzQSwgJ1YnKSwKICAgICgweDIxM0IsICdNJywgdSdmYXgnKSwKICAgICgweDIxM0MsICdNJywgdSfPgCcpLAogICAgKDB4MjEzRCwgJ00nLCB1J86zJyksCiAgICAoMHgyMTNGLCAnTScsIHUnz4AnKSwKICAgICgweDIxNDAsICdNJywgdSfiiJEnKSwKICAgICgweDIxNDEsICdWJyksCiAgICAoMHgyMTQ1LCAnTScsIHUnZCcpLAogICAgKDB4MjE0NywgJ00nLCB1J2UnKSwKICAgICgweDIxNDgsICdNJywgdSdpJyksCiAgICAoMHgyMTQ5LCAnTScsIHUnaicpLAogICAgKDB4MjE0QSwgJ1YnKSwKICAgICgweDIxNTAsICdNJywgdScx4oGENycpLAogICAgKDB4MjE1MSwgJ00nLCB1JzHigYQ5JyksCiAgICAoMHgyMTUyLCAnTScsIHUnMeKBhDEwJyksCiAgICAoMHgyMTUzLCAnTScsIHUnMeKBhDMnKSwKICAgICgweDIxNTQsICdNJywgdScy4oGEMycpLAogICAgKDB4MjE1NSwgJ00nLCB1JzHigYQ1JyksCiAgICAoMHgyMTU2LCAnTScsIHUnMuKBhDUnKSwKICAgICgweDIxNTcsICdNJywgdScz4oGENScpLAogICAgKDB4MjE1OCwgJ00nLCB1JzTigYQ1JyksCiAgICAoMHgyMTU5LCAnTScsIHUnMeKBhDYnKSwKICAgICgweDIxNUEsICdNJywgdSc14oGENicpLAogICAgKDB4MjE1QiwgJ00nLCB1JzHigYQ4JyksCiAgICAoMHgyMTVDLCAnTScsIHUnM+KBhDgnKSwKICAgICgweDIxNUQsICdNJywgdSc14oGEOCcpLAogICAgKDB4MjE1RSwgJ00nLCB1JzfigYQ4JyksCiAgICAoMHgyMTVGLCAnTScsIHUnMeKBhCcpLAogICAgKDB4MjE2MCwgJ00nLCB1J2knKSwKICAgICgweDIxNjEsICdNJywgdSdpaScpLAogICAgKDB4MjE2MiwgJ00nLCB1J2lpaScpLAogICAgKDB4MjE2MywgJ00nLCB1J2l2JyksCiAgICAoMHgyMTY0LCAnTScsIHUndicpLAogICAgKDB4MjE2NSwgJ00nLCB1J3ZpJyksCiAgICAoMHgyMTY2LCAnTScsIHUndmlpJyksCiAgICAoMHgyMTY3LCAnTScsIHUndmlpaScpLAogICAgKDB4MjE2OCwgJ00nLCB1J2l4JyksCiAgICAoMHgyMTY5LCAnTScsIHUneCcpLAogICAgKDB4MjE2QSwgJ00nLCB1J3hpJyksCiAgICAoMHgyMTZCLCAnTScsIHUneGlpJyksCiAgICAoMHgyMTZDLCAnTScsIHUnbCcpLAogICAgKDB4MjE2RCwgJ00nLCB1J2MnKSwKICAgICgweDIxNkUsICdNJywgdSdkJyksCiAgICAoMHgyMTZGLCAnTScsIHUnbScpLAogICAgKDB4MjE3MCwgJ00nLCB1J2knKSwKICAgICgweDIxNzEsICdNJywgdSdpaScpLAogICAgKDB4MjE3MiwgJ00nLCB1J2lpaScpLAogICAgKDB4MjE3MywgJ00nLCB1J2l2JyksCiAgICAoMHgyMTc0LCAnTScsIHUndicpLAogICAgKDB4MjE3NSwgJ00nLCB1J3ZpJyksCiAgICAoMHgyMTc2LCAnTScsIHUndmlpJyksCiAgICAoMHgyMTc3LCAnTScsIHUndmlpaScpLAogICAgKDB4MjE3OCwgJ00nLCB1J2l4JyksCiAgICAoMHgyMTc5LCAnTScsIHUneCcpLAogICAgKDB4MjE3QSwgJ00nLCB1J3hpJyksCiAgICAoMHgyMTdCLCAnTScsIHUneGlpJyksCiAgICAoMHgyMTdDLCAnTScsIHUnbCcpLAogICAgKDB4MjE3RCwgJ00nLCB1J2MnKSwKICAgICgweDIxN0UsICdNJywgdSdkJyksCiAgICAoMHgyMTdGLCAnTScsIHUnbScpLAogICAgKDB4MjE4MCwgJ1YnKSwKICAgICgweDIxODMsICdYJyksCiAgICAoMHgyMTg0LCAnVicpLAogICAgKDB4MjE4OSwgJ00nLCB1JzDigYQzJyksCiAgICAoMHgyMThBLCAnWCcpLAogICAgKDB4MjE5MCwgJ1YnKSwKICAgICgweDIyMkMsICdNJywgdSfiiKviiKsnKSwKICAgICgweDIyMkQsICdNJywgdSfiiKviiKviiKsnKSwKICAgICgweDIyMkUsICdWJyksCiAgICAoMHgyMjJGLCAnTScsIHUn4oiu4oiuJyksCiAgICAoMHgyMjMwLCAnTScsIHUn4oiu4oiu4oiuJyksCiAgICAoMHgyMjMxLCAnVicpLAogICAgKDB4MjI2MCwgJzMnKSwKICAgICgweDIyNjEsICdWJyksCiAgICAoMHgyMjZFLCAnMycpLAogICAgKDB4MjI3MCwgJ1YnKSwKICAgICgweDIzMjksICdNJywgdSfjgIgnKSwKICAgICgweDIzMkEsICdNJywgdSfjgIknKSwKICAgICgweDIzMkIsICdWJyksCiAgICAoMHgyM0Y0LCAnWCcpLAogICAgKDB4MjQwMCwgJ1YnKSwKICAgICgweDI0MjcsICdYJyksCiAgICAoMHgyNDQwLCAnVicpLAogICAgKDB4MjQ0QiwgJ1gnKSwKICAgICgweDI0NjAsICdNJywgdScxJyksCiAgICAoMHgyNDYxLCAnTScsIHUnMicpLAogICAgKDB4MjQ2MiwgJ00nLCB1JzMnKSwKICAgICgweDI0NjMsICdNJywgdSc0JyksCiAgICAoMHgyNDY0LCAnTScsIHUnNScpLAogICAgKDB4MjQ2NSwgJ00nLCB1JzYnKSwKICAgICgweDI0NjYsICdNJywgdSc3JyksCiAgICAoMHgyNDY3LCAnTScsIHUnOCcpLAogICAgKDB4MjQ2OCwgJ00nLCB1JzknKSwKICAgICgweDI0NjksICdNJywgdScxMCcpLAogICAgKDB4MjQ2QSwgJ00nLCB1JzExJyksCiAgICAoMHgyNDZCLCAnTScsIHUnMTInKSwKICAgIF0KCmRlZiBfc2VnXzIzKCk6CiAgICByZXR1cm4gWwogICAgKDB4MjQ2QywgJ00nLCB1JzEzJyksCiAgICAoMHgyNDZELCAnTScsIHUnMTQnKSwKICAgICgweDI0NkUsICdNJywgdScxNScpLAogICAgKDB4MjQ2RiwgJ00nLCB1JzE2JyksCiAgICAoMHgyNDcwLCAnTScsIHUnMTcnKSwKICAgICgweDI0NzEsICdNJywgdScxOCcpLAogICAgKDB4MjQ3MiwgJ00nLCB1JzE5JyksCiAgICAoMHgyNDczLCAnTScsIHUnMjAnKSwKICAgICgweDI0NzQsICczJywgdScoMSknKSwKICAgICgweDI0NzUsICczJywgdScoMiknKSwKICAgICgweDI0NzYsICczJywgdScoMyknKSwKICAgICgweDI0NzcsICczJywgdScoNCknKSwKICAgICgweDI0NzgsICczJywgdScoNSknKSwKICAgICgweDI0NzksICczJywgdScoNiknKSwKICAgICgweDI0N0EsICczJywgdScoNyknKSwKICAgICgweDI0N0IsICczJywgdScoOCknKSwKICAgICgweDI0N0MsICczJywgdScoOSknKSwKICAgICgweDI0N0QsICczJywgdScoMTApJyksCiAgICAoMHgyNDdFLCAnMycsIHUnKDExKScpLAogICAgKDB4MjQ3RiwgJzMnLCB1JygxMiknKSwKICAgICgweDI0ODAsICczJywgdScoMTMpJyksCiAgICAoMHgyNDgxLCAnMycsIHUnKDE0KScpLAogICAgKDB4MjQ4MiwgJzMnLCB1JygxNSknKSwKICAgICgweDI0ODMsICczJywgdScoMTYpJyksCiAgICAoMHgyNDg0LCAnMycsIHUnKDE3KScpLAogICAgKDB4MjQ4NSwgJzMnLCB1JygxOCknKSwKICAgICgweDI0ODYsICczJywgdScoMTkpJyksCiAgICAoMHgyNDg3LCAnMycsIHUnKDIwKScpLAogICAgKDB4MjQ4OCwgJ1gnKSwKICAgICgweDI0OUMsICczJywgdScoYSknKSwKICAgICgweDI0OUQsICczJywgdScoYiknKSwKICAgICgweDI0OUUsICczJywgdScoYyknKSwKICAgICgweDI0OUYsICczJywgdScoZCknKSwKICAgICgweDI0QTAsICczJywgdScoZSknKSwKICAgICgweDI0QTEsICczJywgdScoZiknKSwKICAgICgweDI0QTIsICczJywgdScoZyknKSwKICAgICgweDI0QTMsICczJywgdScoaCknKSwKICAgICgweDI0QTQsICczJywgdScoaSknKSwKICAgICgweDI0QTUsICczJywgdScoaiknKSwKICAgICgweDI0QTYsICczJywgdScoayknKSwKICAgICgweDI0QTcsICczJywgdScobCknKSwKICAgICgweDI0QTgsICczJywgdScobSknKSwKICAgICgweDI0QTksICczJywgdScobiknKSwKICAgICgweDI0QUEsICczJywgdScobyknKSwKICAgICgweDI0QUIsICczJywgdScocCknKSwKICAgICgweDI0QUMsICczJywgdScocSknKSwKICAgICgweDI0QUQsICczJywgdScociknKSwKICAgICgweDI0QUUsICczJywgdScocyknKSwKICAgICgweDI0QUYsICczJywgdScodCknKSwKICAgICgweDI0QjAsICczJywgdScodSknKSwKICAgICgweDI0QjEsICczJywgdScodiknKSwKICAgICgweDI0QjIsICczJywgdScodyknKSwKICAgICgweDI0QjMsICczJywgdScoeCknKSwKICAgICgweDI0QjQsICczJywgdScoeSknKSwKICAgICgweDI0QjUsICczJywgdScoeiknKSwKICAgICgweDI0QjYsICdNJywgdSdhJyksCiAgICAoMHgyNEI3LCAnTScsIHUnYicpLAogICAgKDB4MjRCOCwgJ00nLCB1J2MnKSwKICAgICgweDI0QjksICdNJywgdSdkJyksCiAgICAoMHgyNEJBLCAnTScsIHUnZScpLAogICAgKDB4MjRCQiwgJ00nLCB1J2YnKSwKICAgICgweDI0QkMsICdNJywgdSdnJyksCiAgICAoMHgyNEJELCAnTScsIHUnaCcpLAogICAgKDB4MjRCRSwgJ00nLCB1J2knKSwKICAgICgweDI0QkYsICdNJywgdSdqJyksCiAgICAoMHgyNEMwLCAnTScsIHUnaycpLAogICAgKDB4MjRDMSwgJ00nLCB1J2wnKSwKICAgICgweDI0QzIsICdNJywgdSdtJyksCiAgICAoMHgyNEMzLCAnTScsIHUnbicpLAogICAgKDB4MjRDNCwgJ00nLCB1J28nKSwKICAgICgweDI0QzUsICdNJywgdSdwJyksCiAgICAoMHgyNEM2LCAnTScsIHUncScpLAogICAgKDB4MjRDNywgJ00nLCB1J3InKSwKICAgICgweDI0QzgsICdNJywgdSdzJyksCiAgICAoMHgyNEM5LCAnTScsIHUndCcpLAogICAgKDB4MjRDQSwgJ00nLCB1J3UnKSwKICAgICgweDI0Q0IsICdNJywgdSd2JyksCiAgICAoMHgyNENDLCAnTScsIHUndycpLAogICAgKDB4MjRDRCwgJ00nLCB1J3gnKSwKICAgICgweDI0Q0UsICdNJywgdSd5JyksCiAgICAoMHgyNENGLCAnTScsIHUneicpLAogICAgKDB4MjREMCwgJ00nLCB1J2EnKSwKICAgICgweDI0RDEsICdNJywgdSdiJyksCiAgICAoMHgyNEQyLCAnTScsIHUnYycpLAogICAgKDB4MjREMywgJ00nLCB1J2QnKSwKICAgICgweDI0RDQsICdNJywgdSdlJyksCiAgICAoMHgyNEQ1LCAnTScsIHUnZicpLAogICAgKDB4MjRENiwgJ00nLCB1J2cnKSwKICAgICgweDI0RDcsICdNJywgdSdoJyksCiAgICAoMHgyNEQ4LCAnTScsIHUnaScpLAogICAgKDB4MjREOSwgJ00nLCB1J2onKSwKICAgICgweDI0REEsICdNJywgdSdrJyksCiAgICAoMHgyNERCLCAnTScsIHUnbCcpLAogICAgKDB4MjREQywgJ00nLCB1J20nKSwKICAgICgweDI0REQsICdNJywgdSduJyksCiAgICAoMHgyNERFLCAnTScsIHUnbycpLAogICAgKDB4MjRERiwgJ00nLCB1J3AnKSwKICAgICgweDI0RTAsICdNJywgdSdxJyksCiAgICAoMHgyNEUxLCAnTScsIHUncicpLAogICAgKDB4MjRFMiwgJ00nLCB1J3MnKSwKICAgIF0KCmRlZiBfc2VnXzI0KCk6CiAgICByZXR1cm4gWwogICAgKDB4MjRFMywgJ00nLCB1J3QnKSwKICAgICgweDI0RTQsICdNJywgdSd1JyksCiAgICAoMHgyNEU1LCAnTScsIHUndicpLAogICAgKDB4MjRFNiwgJ00nLCB1J3cnKSwKICAgICgweDI0RTcsICdNJywgdSd4JyksCiAgICAoMHgyNEU4LCAnTScsIHUneScpLAogICAgKDB4MjRFOSwgJ00nLCB1J3onKSwKICAgICgweDI0RUEsICdNJywgdScwJyksCiAgICAoMHgyNEVCLCAnVicpLAogICAgKDB4MjcwMCwgJ1gnKSwKICAgICgweDI3MDEsICdWJyksCiAgICAoMHgyQTBDLCAnTScsIHUn4oir4oir4oir4oirJyksCiAgICAoMHgyQTBELCAnVicpLAogICAgKDB4MkE3NCwgJzMnLCB1Jzo6PScpLAogICAgKDB4MkE3NSwgJzMnLCB1Jz09JyksCiAgICAoMHgyQTc2LCAnMycsIHUnPT09JyksCiAgICAoMHgyQTc3LCAnVicpLAogICAgKDB4MkFEQywgJ00nLCB1J+Krncy4JyksCiAgICAoMHgyQURELCAnVicpLAogICAgKDB4MkI0RCwgJ1gnKSwKICAgICgweDJCNTAsICdWJyksCiAgICAoMHgyQjVBLCAnWCcpLAogICAgKDB4MkMwMCwgJ00nLCB1J+KwsCcpLAogICAgKDB4MkMwMSwgJ00nLCB1J+KwsScpLAogICAgKDB4MkMwMiwgJ00nLCB1J+KwsicpLAogICAgKDB4MkMwMywgJ00nLCB1J+KwsycpLAogICAgKDB4MkMwNCwgJ00nLCB1J+KwtCcpLAogICAgKDB4MkMwNSwgJ00nLCB1J+KwtScpLAogICAgKDB4MkMwNiwgJ00nLCB1J+KwticpLAogICAgKDB4MkMwNywgJ00nLCB1J+KwtycpLAogICAgKDB4MkMwOCwgJ00nLCB1J+KwuCcpLAogICAgKDB4MkMwOSwgJ00nLCB1J+KwuScpLAogICAgKDB4MkMwQSwgJ00nLCB1J+KwuicpLAogICAgKDB4MkMwQiwgJ00nLCB1J+KwuycpLAogICAgKDB4MkMwQywgJ00nLCB1J+KwvCcpLAogICAgKDB4MkMwRCwgJ00nLCB1J+KwvScpLAogICAgKDB4MkMwRSwgJ00nLCB1J+KwvicpLAogICAgKDB4MkMwRiwgJ00nLCB1J+KwvycpLAogICAgKDB4MkMxMCwgJ00nLCB1J+KxgCcpLAogICAgKDB4MkMxMSwgJ00nLCB1J+KxgScpLAogICAgKDB4MkMxMiwgJ00nLCB1J+KxgicpLAogICAgKDB4MkMxMywgJ00nLCB1J+KxgycpLAogICAgKDB4MkMxNCwgJ00nLCB1J+KxhCcpLAogICAgKDB4MkMxNSwgJ00nLCB1J+KxhScpLAogICAgKDB4MkMxNiwgJ00nLCB1J+KxhicpLAogICAgKDB4MkMxNywgJ00nLCB1J+KxhycpLAogICAgKDB4MkMxOCwgJ00nLCB1J+KxiCcpLAogICAgKDB4MkMxOSwgJ00nLCB1J+KxiScpLAogICAgKDB4MkMxQSwgJ00nLCB1J+KxiicpLAogICAgKDB4MkMxQiwgJ00nLCB1J+KxiycpLAogICAgKDB4MkMxQywgJ00nLCB1J+KxjCcpLAogICAgKDB4MkMxRCwgJ00nLCB1J+KxjScpLAogICAgKDB4MkMxRSwgJ00nLCB1J+KxjicpLAogICAgKDB4MkMxRiwgJ00nLCB1J+KxjycpLAogICAgKDB4MkMyMCwgJ00nLCB1J+KxkCcpLAogICAgKDB4MkMyMSwgJ00nLCB1J+KxkScpLAogICAgKDB4MkMyMiwgJ00nLCB1J+KxkicpLAogICAgKDB4MkMyMywgJ00nLCB1J+KxkycpLAogICAgKDB4MkMyNCwgJ00nLCB1J+KxlCcpLAogICAgKDB4MkMyNSwgJ00nLCB1J+KxlScpLAogICAgKDB4MkMyNiwgJ00nLCB1J+KxlicpLAogICAgKDB4MkMyNywgJ00nLCB1J+KxlycpLAogICAgKDB4MkMyOCwgJ00nLCB1J+KxmCcpLAogICAgKDB4MkMyOSwgJ00nLCB1J+KxmScpLAogICAgKDB4MkMyQSwgJ00nLCB1J+KxmicpLAogICAgKDB4MkMyQiwgJ00nLCB1J+KxmycpLAogICAgKDB4MkMyQywgJ00nLCB1J+KxnCcpLAogICAgKDB4MkMyRCwgJ00nLCB1J+KxnScpLAogICAgKDB4MkMyRSwgJ00nLCB1J+KxnicpLAogICAgKDB4MkMyRiwgJ1gnKSwKICAgICgweDJDMzAsICdWJyksCiAgICAoMHgyQzVGLCAnWCcpLAogICAgKDB4MkM2MCwgJ00nLCB1J+KxoScpLAogICAgKDB4MkM2MSwgJ1YnKSwKICAgICgweDJDNjIsICdNJywgdSfJqycpLAogICAgKDB4MkM2MywgJ00nLCB1J+G1vScpLAogICAgKDB4MkM2NCwgJ00nLCB1J8m9JyksCiAgICAoMHgyQzY1LCAnVicpLAogICAgKDB4MkM2NywgJ00nLCB1J+KxqCcpLAogICAgKDB4MkM2OCwgJ1YnKSwKICAgICgweDJDNjksICdNJywgdSfisaonKSwKICAgICgweDJDNkEsICdWJyksCiAgICAoMHgyQzZCLCAnTScsIHUn4rGsJyksCiAgICAoMHgyQzZDLCAnVicpLAogICAgKDB4MkM2RCwgJ00nLCB1J8mRJyksCiAgICAoMHgyQzZFLCAnTScsIHUnybEnKSwKICAgICgweDJDNkYsICdNJywgdSfJkCcpLAogICAgKDB4MkM3MCwgJ00nLCB1J8mSJyksCiAgICAoMHgyQzcxLCAnVicpLAogICAgKDB4MkM3MiwgJ00nLCB1J+KxsycpLAogICAgKDB4MkM3MywgJ1YnKSwKICAgICgweDJDNzUsICdNJywgdSfisbYnKSwKICAgICgweDJDNzYsICdWJyksCiAgICAoMHgyQzdDLCAnTScsIHUnaicpLAogICAgKDB4MkM3RCwgJ00nLCB1J3YnKSwKICAgICgweDJDN0UsICdNJywgdSfIvycpLAogICAgKDB4MkM3RiwgJ00nLCB1J8mAJyksCiAgICAoMHgyQzgwLCAnTScsIHUn4rKBJyksCiAgICAoMHgyQzgxLCAnVicpLAogICAgKDB4MkM4MiwgJ00nLCB1J+KygycpLAogICAgXQoKZGVmIF9zZWdfMjUoKToKICAgIHJldHVybiBbCiAgICAoMHgyQzgzLCAnVicpLAogICAgKDB4MkM4NCwgJ00nLCB1J+KyhScpLAogICAgKDB4MkM4NSwgJ1YnKSwKICAgICgweDJDODYsICdNJywgdSfisocnKSwKICAgICgweDJDODcsICdWJyksCiAgICAoMHgyQzg4LCAnTScsIHUn4rKJJyksCiAgICAoMHgyQzg5LCAnVicpLAogICAgKDB4MkM4QSwgJ00nLCB1J+KyiycpLAogICAgKDB4MkM4QiwgJ1YnKSwKICAgICgweDJDOEMsICdNJywgdSfiso0nKSwKICAgICgweDJDOEQsICdWJyksCiAgICAoMHgyQzhFLCAnTScsIHUn4rKPJyksCiAgICAoMHgyQzhGLCAnVicpLAogICAgKDB4MkM5MCwgJ00nLCB1J+KykScpLAogICAgKDB4MkM5MSwgJ1YnKSwKICAgICgweDJDOTIsICdNJywgdSfispMnKSwKICAgICgweDJDOTMsICdWJyksCiAgICAoMHgyQzk0LCAnTScsIHUn4rKVJyksCiAgICAoMHgyQzk1LCAnVicpLAogICAgKDB4MkM5NiwgJ00nLCB1J+KylycpLAogICAgKDB4MkM5NywgJ1YnKSwKICAgICgweDJDOTgsICdNJywgdSfispknKSwKICAgICgweDJDOTksICdWJyksCiAgICAoMHgyQzlBLCAnTScsIHUn4rKbJyksCiAgICAoMHgyQzlCLCAnVicpLAogICAgKDB4MkM5QywgJ00nLCB1J+KynScpLAogICAgKDB4MkM5RCwgJ1YnKSwKICAgICgweDJDOUUsICdNJywgdSfisp8nKSwKICAgICgweDJDOUYsICdWJyksCiAgICAoMHgyQ0EwLCAnTScsIHUn4rKhJyksCiAgICAoMHgyQ0ExLCAnVicpLAogICAgKDB4MkNBMiwgJ00nLCB1J+KyoycpLAogICAgKDB4MkNBMywgJ1YnKSwKICAgICgweDJDQTQsICdNJywgdSfisqUnKSwKICAgICgweDJDQTUsICdWJyksCiAgICAoMHgyQ0E2LCAnTScsIHUn4rKnJyksCiAgICAoMHgyQ0E3LCAnVicpLAogICAgKDB4MkNBOCwgJ00nLCB1J+KyqScpLAogICAgKDB4MkNBOSwgJ1YnKSwKICAgICgweDJDQUEsICdNJywgdSfisqsnKSwKICAgICgweDJDQUIsICdWJyksCiAgICAoMHgyQ0FDLCAnTScsIHUn4rKtJyksCiAgICAoMHgyQ0FELCAnVicpLAogICAgKDB4MkNBRSwgJ00nLCB1J+KyrycpLAogICAgKDB4MkNBRiwgJ1YnKSwKICAgICgweDJDQjAsICdNJywgdSfisrEnKSwKICAgICgweDJDQjEsICdWJyksCiAgICAoMHgyQ0IyLCAnTScsIHUn4rKzJyksCiAgICAoMHgyQ0IzLCAnVicpLAogICAgKDB4MkNCNCwgJ00nLCB1J+KytScpLAogICAgKDB4MkNCNSwgJ1YnKSwKICAgICgweDJDQjYsICdNJywgdSfisrcnKSwKICAgICgweDJDQjcsICdWJyksCiAgICAoMHgyQ0I4LCAnTScsIHUn4rK5JyksCiAgICAoMHgyQ0I5LCAnVicpLAogICAgKDB4MkNCQSwgJ00nLCB1J+KyuycpLAogICAgKDB4MkNCQiwgJ1YnKSwKICAgICgweDJDQkMsICdNJywgdSfisr0nKSwKICAgICgweDJDQkQsICdWJyksCiAgICAoMHgyQ0JFLCAnTScsIHUn4rK/JyksCiAgICAoMHgyQ0JGLCAnVicpLAogICAgKDB4MkNDMCwgJ00nLCB1J+KzgScpLAogICAgKDB4MkNDMSwgJ1YnKSwKICAgICgweDJDQzIsICdNJywgdSfis4MnKSwKICAgICgweDJDQzMsICdWJyksCiAgICAoMHgyQ0M0LCAnTScsIHUn4rOFJyksCiAgICAoMHgyQ0M1LCAnVicpLAogICAgKDB4MkNDNiwgJ00nLCB1J+KzhycpLAogICAgKDB4MkNDNywgJ1YnKSwKICAgICgweDJDQzgsICdNJywgdSfis4knKSwKICAgICgweDJDQzksICdWJyksCiAgICAoMHgyQ0NBLCAnTScsIHUn4rOLJyksCiAgICAoMHgyQ0NCLCAnVicpLAogICAgKDB4MkNDQywgJ00nLCB1J+KzjScpLAogICAgKDB4MkNDRCwgJ1YnKSwKICAgICgweDJDQ0UsICdNJywgdSfis48nKSwKICAgICgweDJDQ0YsICdWJyksCiAgICAoMHgyQ0QwLCAnTScsIHUn4rORJyksCiAgICAoMHgyQ0QxLCAnVicpLAogICAgKDB4MkNEMiwgJ00nLCB1J+KzkycpLAogICAgKDB4MkNEMywgJ1YnKSwKICAgICgweDJDRDQsICdNJywgdSfis5UnKSwKICAgICgweDJDRDUsICdWJyksCiAgICAoMHgyQ0Q2LCAnTScsIHUn4rOXJyksCiAgICAoMHgyQ0Q3LCAnVicpLAogICAgKDB4MkNEOCwgJ00nLCB1J+KzmScpLAogICAgKDB4MkNEOSwgJ1YnKSwKICAgICgweDJDREEsICdNJywgdSfis5snKSwKICAgICgweDJDREIsICdWJyksCiAgICAoMHgyQ0RDLCAnTScsIHUn4rOdJyksCiAgICAoMHgyQ0RELCAnVicpLAogICAgKDB4MkNERSwgJ00nLCB1J+KznycpLAogICAgKDB4MkNERiwgJ1YnKSwKICAgICgweDJDRTAsICdNJywgdSfis6EnKSwKICAgICgweDJDRTEsICdWJyksCiAgICAoMHgyQ0UyLCAnTScsIHUn4rOjJyksCiAgICAoMHgyQ0UzLCAnVicpLAogICAgKDB4MkNFQiwgJ00nLCB1J+KzrCcpLAogICAgKDB4MkNFQywgJ1YnKSwKICAgICgweDJDRUQsICdNJywgdSfis64nKSwKICAgIF0KCmRlZiBfc2VnXzI2KCk6CiAgICByZXR1cm4gWwogICAgKDB4MkNFRSwgJ1YnKSwKICAgICgweDJDRjIsICdNJywgdSfis7MnKSwKICAgICgweDJDRjMsICdWJyksCiAgICAoMHgyQ0Y0LCAnWCcpLAogICAgKDB4MkNGOSwgJ1YnKSwKICAgICgweDJEMjYsICdYJyksCiAgICAoMHgyRDI3LCAnVicpLAogICAgKDB4MkQyOCwgJ1gnKSwKICAgICgweDJEMkQsICdWJyksCiAgICAoMHgyRDJFLCAnWCcpLAogICAgKDB4MkQzMCwgJ1YnKSwKICAgICgweDJENjgsICdYJyksCiAgICAoMHgyRDZGLCAnTScsIHUn4rWhJyksCiAgICAoMHgyRDcwLCAnVicpLAogICAgKDB4MkQ3MSwgJ1gnKSwKICAgICgweDJEN0YsICdWJyksCiAgICAoMHgyRDk3LCAnWCcpLAogICAgKDB4MkRBMCwgJ1YnKSwKICAgICgweDJEQTcsICdYJyksCiAgICAoMHgyREE4LCAnVicpLAogICAgKDB4MkRBRiwgJ1gnKSwKICAgICgweDJEQjAsICdWJyksCiAgICAoMHgyREI3LCAnWCcpLAogICAgKDB4MkRCOCwgJ1YnKSwKICAgICgweDJEQkYsICdYJyksCiAgICAoMHgyREMwLCAnVicpLAogICAgKDB4MkRDNywgJ1gnKSwKICAgICgweDJEQzgsICdWJyksCiAgICAoMHgyRENGLCAnWCcpLAogICAgKDB4MkREMCwgJ1YnKSwKICAgICgweDJERDcsICdYJyksCiAgICAoMHgyREQ4LCAnVicpLAogICAgKDB4MkRERiwgJ1gnKSwKICAgICgweDJERTAsICdWJyksCiAgICAoMHgyRTNDLCAnWCcpLAogICAgKDB4MkU4MCwgJ1YnKSwKICAgICgweDJFOUEsICdYJyksCiAgICAoMHgyRTlCLCAnVicpLAogICAgKDB4MkU5RiwgJ00nLCB1J+avjScpLAogICAgKDB4MkVBMCwgJ1YnKSwKICAgICgweDJFRjMsICdNJywgdSfpvp8nKSwKICAgICgweDJFRjQsICdYJyksCiAgICAoMHgyRjAwLCAnTScsIHUn5LiAJyksCiAgICAoMHgyRjAxLCAnTScsIHUn5LioJyksCiAgICAoMHgyRjAyLCAnTScsIHUn5Li2JyksCiAgICAoMHgyRjAzLCAnTScsIHUn5Li/JyksCiAgICAoMHgyRjA0LCAnTScsIHUn5LmZJyksCiAgICAoMHgyRjA1LCAnTScsIHUn5LqFJyksCiAgICAoMHgyRjA2LCAnTScsIHUn5LqMJyksCiAgICAoMHgyRjA3LCAnTScsIHUn5LqgJyksCiAgICAoMHgyRjA4LCAnTScsIHUn5Lq6JyksCiAgICAoMHgyRjA5LCAnTScsIHUn5YS/JyksCiAgICAoMHgyRjBBLCAnTScsIHUn5YWlJyksCiAgICAoMHgyRjBCLCAnTScsIHUn5YWrJyksCiAgICAoMHgyRjBDLCAnTScsIHUn5YaCJyksCiAgICAoMHgyRjBELCAnTScsIHUn5YaWJyksCiAgICAoMHgyRjBFLCAnTScsIHUn5YarJyksCiAgICAoMHgyRjBGLCAnTScsIHUn5YegJyksCiAgICAoMHgyRjEwLCAnTScsIHUn5Ye1JyksCiAgICAoMHgyRjExLCAnTScsIHUn5YiAJyksCiAgICAoMHgyRjEyLCAnTScsIHUn5YqbJyksCiAgICAoMHgyRjEzLCAnTScsIHUn5Yu5JyksCiAgICAoMHgyRjE0LCAnTScsIHUn5YyVJyksCiAgICAoMHgyRjE1LCAnTScsIHUn5YyaJyksCiAgICAoMHgyRjE2LCAnTScsIHUn5Yy4JyksCiAgICAoMHgyRjE3LCAnTScsIHUn5Y2BJyksCiAgICAoMHgyRjE4LCAnTScsIHUn5Y2cJyksCiAgICAoMHgyRjE5LCAnTScsIHUn5Y2pJyksCiAgICAoMHgyRjFBLCAnTScsIHUn5Y6CJyksCiAgICAoMHgyRjFCLCAnTScsIHUn5Y62JyksCiAgICAoMHgyRjFDLCAnTScsIHUn5Y+IJyksCiAgICAoMHgyRjFELCAnTScsIHUn5Y+jJyksCiAgICAoMHgyRjFFLCAnTScsIHUn5ZuXJyksCiAgICAoMHgyRjFGLCAnTScsIHUn5ZyfJyksCiAgICAoMHgyRjIwLCAnTScsIHUn5aOrJyksCiAgICAoMHgyRjIxLCAnTScsIHUn5aSCJyksCiAgICAoMHgyRjIyLCAnTScsIHUn5aSKJyksCiAgICAoMHgyRjIzLCAnTScsIHUn5aSVJyksCiAgICAoMHgyRjI0LCAnTScsIHUn5aSnJyksCiAgICAoMHgyRjI1LCAnTScsIHUn5aWzJyksCiAgICAoMHgyRjI2LCAnTScsIHUn5a2QJyksCiAgICAoMHgyRjI3LCAnTScsIHUn5a6AJyksCiAgICAoMHgyRjI4LCAnTScsIHUn5a+4JyksCiAgICAoMHgyRjI5LCAnTScsIHUn5bCPJyksCiAgICAoMHgyRjJBLCAnTScsIHUn5bCiJyksCiAgICAoMHgyRjJCLCAnTScsIHUn5bC4JyksCiAgICAoMHgyRjJDLCAnTScsIHUn5bGuJyksCiAgICAoMHgyRjJELCAnTScsIHUn5bGxJyksCiAgICAoMHgyRjJFLCAnTScsIHUn5bebJyksCiAgICAoMHgyRjJGLCAnTScsIHUn5belJyksCiAgICAoMHgyRjMwLCAnTScsIHUn5bexJyksCiAgICAoMHgyRjMxLCAnTScsIHUn5be+JyksCiAgICAoMHgyRjMyLCAnTScsIHUn5bmyJyksCiAgICAoMHgyRjMzLCAnTScsIHUn5bm6JyksCiAgICAoMHgyRjM0LCAnTScsIHUn5bm/JyksCiAgICAoMHgyRjM1LCAnTScsIHUn5bu0JyksCiAgICAoMHgyRjM2LCAnTScsIHUn5bu+JyksCiAgICAoMHgyRjM3LCAnTScsIHUn5byLJyksCiAgICAoMHgyRjM4LCAnTScsIHUn5byTJyksCiAgICAoMHgyRjM5LCAnTScsIHUn5b2QJyksCiAgICBdCgpkZWYgX3NlZ18yNygpOgogICAgcmV0dXJuIFsKICAgICgweDJGM0EsICdNJywgdSflvaEnKSwKICAgICgweDJGM0IsICdNJywgdSflvbMnKSwKICAgICgweDJGM0MsICdNJywgdSflv4MnKSwKICAgICgweDJGM0QsICdNJywgdSfmiIgnKSwKICAgICgweDJGM0UsICdNJywgdSfmiLYnKSwKICAgICgweDJGM0YsICdNJywgdSfmiYsnKSwKICAgICgweDJGNDAsICdNJywgdSfmlK8nKSwKICAgICgweDJGNDEsICdNJywgdSfmlLQnKSwKICAgICgweDJGNDIsICdNJywgdSfmlocnKSwKICAgICgweDJGNDMsICdNJywgdSfmlpcnKSwKICAgICgweDJGNDQsICdNJywgdSfmlqQnKSwKICAgICgweDJGNDUsICdNJywgdSfmlrknKSwKICAgICgweDJGNDYsICdNJywgdSfml6AnKSwKICAgICgweDJGNDcsICdNJywgdSfml6UnKSwKICAgICgweDJGNDgsICdNJywgdSfmm7AnKSwKICAgICgweDJGNDksICdNJywgdSfmnIgnKSwKICAgICgweDJGNEEsICdNJywgdSfmnKgnKSwKICAgICgweDJGNEIsICdNJywgdSfmrKAnKSwKICAgICgweDJGNEMsICdNJywgdSfmraInKSwKICAgICgweDJGNEQsICdNJywgdSfmrbknKSwKICAgICgweDJGNEUsICdNJywgdSfmrrMnKSwKICAgICgweDJGNEYsICdNJywgdSfmr4snKSwKICAgICgweDJGNTAsICdNJywgdSfmr5QnKSwKICAgICgweDJGNTEsICdNJywgdSfmr5snKSwKICAgICgweDJGNTIsICdNJywgdSfmsI8nKSwKICAgICgweDJGNTMsICdNJywgdSfmsJQnKSwKICAgICgweDJGNTQsICdNJywgdSfmsLQnKSwKICAgICgweDJGNTUsICdNJywgdSfngasnKSwKICAgICgweDJGNTYsICdNJywgdSfniKonKSwKICAgICgweDJGNTcsICdNJywgdSfniLYnKSwKICAgICgweDJGNTgsICdNJywgdSfniLsnKSwKICAgICgweDJGNTksICdNJywgdSfniL8nKSwKICAgICgweDJGNUEsICdNJywgdSfniYcnKSwKICAgICgweDJGNUIsICdNJywgdSfniZknKSwKICAgICgweDJGNUMsICdNJywgdSfniZsnKSwKICAgICgweDJGNUQsICdNJywgdSfniqwnKSwKICAgICgweDJGNUUsICdNJywgdSfnjoQnKSwKICAgICgweDJGNUYsICdNJywgdSfnjoknKSwKICAgICgweDJGNjAsICdNJywgdSfnk5wnKSwKICAgICgweDJGNjEsICdNJywgdSfnk6YnKSwKICAgICgweDJGNjIsICdNJywgdSfnlJgnKSwKICAgICgweDJGNjMsICdNJywgdSfnlJ8nKSwKICAgICgweDJGNjQsICdNJywgdSfnlKgnKSwKICAgICgweDJGNjUsICdNJywgdSfnlLAnKSwKICAgICgweDJGNjYsICdNJywgdSfnlosnKSwKICAgICgweDJGNjcsICdNJywgdSfnlpInKSwKICAgICgweDJGNjgsICdNJywgdSfnmbYnKSwKICAgICgweDJGNjksICdNJywgdSfnmb0nKSwKICAgICgweDJGNkEsICdNJywgdSfnmq4nKSwKICAgICgweDJGNkIsICdNJywgdSfnmr8nKSwKICAgICgweDJGNkMsICdNJywgdSfnm64nKSwKICAgICgweDJGNkQsICdNJywgdSfnn5snKSwKICAgICgweDJGNkUsICdNJywgdSfnn6InKSwKICAgICgweDJGNkYsICdNJywgdSfnn7MnKSwKICAgICgweDJGNzAsICdNJywgdSfnpLonKSwKICAgICgweDJGNzEsICdNJywgdSfnprgnKSwKICAgICgweDJGNzIsICdNJywgdSfnpr4nKSwKICAgICgweDJGNzMsICdNJywgdSfnqbQnKSwKICAgICgweDJGNzQsICdNJywgdSfnq4snKSwKICAgICgweDJGNzUsICdNJywgdSfnq7knKSwKICAgICgweDJGNzYsICdNJywgdSfnsbMnKSwKICAgICgweDJGNzcsICdNJywgdSfns7gnKSwKICAgICgweDJGNzgsICdNJywgdSfnvLYnKSwKICAgICgweDJGNzksICdNJywgdSfnvZEnKSwKICAgICgweDJGN0EsICdNJywgdSfnvoonKSwKICAgICgweDJGN0IsICdNJywgdSfnvr0nKSwKICAgICgweDJGN0MsICdNJywgdSfogIEnKSwKICAgICgweDJGN0QsICdNJywgdSfogIwnKSwKICAgICgweDJGN0UsICdNJywgdSfogJInKSwKICAgICgweDJGN0YsICdNJywgdSfogLMnKSwKICAgICgweDJGODAsICdNJywgdSfogb8nKSwKICAgICgweDJGODEsICdNJywgdSfogoknKSwKICAgICgweDJGODIsICdNJywgdSfoh6MnKSwKICAgICgweDJGODMsICdNJywgdSfoh6onKSwKICAgICgweDJGODQsICdNJywgdSfoh7MnKSwKICAgICgweDJGODUsICdNJywgdSfoh7wnKSwKICAgICgweDJGODYsICdNJywgdSfoiIwnKSwKICAgICgweDJGODcsICdNJywgdSfoiJsnKSwKICAgICgweDJGODgsICdNJywgdSfoiJ8nKSwKICAgICgweDJGODksICdNJywgdSfoia4nKSwKICAgICgweDJGOEEsICdNJywgdSfoibInKSwKICAgICgweDJGOEIsICdNJywgdSfoibgnKSwKICAgICgweDJGOEMsICdNJywgdSfomY0nKSwKICAgICgweDJGOEQsICdNJywgdSfomasnKSwKICAgICgweDJGOEUsICdNJywgdSfooYAnKSwKICAgICgweDJGOEYsICdNJywgdSfooYwnKSwKICAgICgweDJGOTAsICdNJywgdSfooaMnKSwKICAgICgweDJGOTEsICdNJywgdSfopb4nKSwKICAgICgweDJGOTIsICdNJywgdSfoposnKSwKICAgICgweDJGOTMsICdNJywgdSfop5InKSwKICAgICgweDJGOTQsICdNJywgdSfoqIAnKSwKICAgICgweDJGOTUsICdNJywgdSfosLcnKSwKICAgICgweDJGOTYsICdNJywgdSfosYYnKSwKICAgICgweDJGOTcsICdNJywgdSfosZUnKSwKICAgICgweDJGOTgsICdNJywgdSfosbgnKSwKICAgICgweDJGOTksICdNJywgdSfosp0nKSwKICAgICgweDJGOUEsICdNJywgdSfotaQnKSwKICAgICgweDJGOUIsICdNJywgdSfotbAnKSwKICAgICgweDJGOUMsICdNJywgdSfotrMnKSwKICAgICgweDJGOUQsICdNJywgdSfouqsnKSwKICAgIF0KCmRlZiBfc2VnXzI4KCk6CiAgICByZXR1cm4gWwogICAgKDB4MkY5RSwgJ00nLCB1J+i7iicpLAogICAgKDB4MkY5RiwgJ00nLCB1J+i+mycpLAogICAgKDB4MkZBMCwgJ00nLCB1J+i+sCcpLAogICAgKDB4MkZBMSwgJ00nLCB1J+i+tScpLAogICAgKDB4MkZBMiwgJ00nLCB1J+mCkScpLAogICAgKDB4MkZBMywgJ00nLCB1J+mFiScpLAogICAgKDB4MkZBNCwgJ00nLCB1J+mHhicpLAogICAgKDB4MkZBNSwgJ00nLCB1J+mHjCcpLAogICAgKDB4MkZBNiwgJ00nLCB1J+mHkScpLAogICAgKDB4MkZBNywgJ00nLCB1J+mVtycpLAogICAgKDB4MkZBOCwgJ00nLCB1J+mWgCcpLAogICAgKDB4MkZBOSwgJ00nLCB1J+mYnCcpLAogICAgKDB4MkZBQSwgJ00nLCB1J+maticpLAogICAgKDB4MkZBQiwgJ00nLCB1J+mauScpLAogICAgKDB4MkZBQywgJ00nLCB1J+mbqCcpLAogICAgKDB4MkZBRCwgJ00nLCB1J+mdkScpLAogICAgKDB4MkZBRSwgJ00nLCB1J+mdnicpLAogICAgKDB4MkZBRiwgJ00nLCB1J+mdoicpLAogICAgKDB4MkZCMCwgJ00nLCB1J+mdqScpLAogICAgKDB4MkZCMSwgJ00nLCB1J+mfiycpLAogICAgKDB4MkZCMiwgJ00nLCB1J+mfrScpLAogICAgKDB4MkZCMywgJ00nLCB1J+mfsycpLAogICAgKDB4MkZCNCwgJ00nLCB1J+mggScpLAogICAgKDB4MkZCNSwgJ00nLCB1J+miqCcpLAogICAgKDB4MkZCNiwgJ00nLCB1J+mjmycpLAogICAgKDB4MkZCNywgJ00nLCB1J+mjnycpLAogICAgKDB4MkZCOCwgJ00nLCB1J+mmlicpLAogICAgKDB4MkZCOSwgJ00nLCB1J+mmmScpLAogICAgKDB4MkZCQSwgJ00nLCB1J+mmrCcpLAogICAgKDB4MkZCQiwgJ00nLCB1J+mqqCcpLAogICAgKDB4MkZCQywgJ00nLCB1J+mrmCcpLAogICAgKDB4MkZCRCwgJ00nLCB1J+mrnycpLAogICAgKDB4MkZCRSwgJ00nLCB1J+mspScpLAogICAgKDB4MkZCRiwgJ00nLCB1J+msrycpLAogICAgKDB4MkZDMCwgJ00nLCB1J+mssicpLAogICAgKDB4MkZDMSwgJ00nLCB1J+msvCcpLAogICAgKDB4MkZDMiwgJ00nLCB1J+mtmicpLAogICAgKDB4MkZDMywgJ00nLCB1J+mzpScpLAogICAgKDB4MkZDNCwgJ00nLCB1J+m5tScpLAogICAgKDB4MkZDNSwgJ00nLCB1J+m5vycpLAogICAgKDB4MkZDNiwgJ00nLCB1J+m6pScpLAogICAgKDB4MkZDNywgJ00nLCB1J+m6uycpLAogICAgKDB4MkZDOCwgJ00nLCB1J+m7gycpLAogICAgKDB4MkZDOSwgJ00nLCB1J+m7jScpLAogICAgKDB4MkZDQSwgJ00nLCB1J+m7kScpLAogICAgKDB4MkZDQiwgJ00nLCB1J+m7uScpLAogICAgKDB4MkZDQywgJ00nLCB1J+m7vScpLAogICAgKDB4MkZDRCwgJ00nLCB1J+m8jicpLAogICAgKDB4MkZDRSwgJ00nLCB1J+m8kycpLAogICAgKDB4MkZDRiwgJ00nLCB1J+m8oCcpLAogICAgKDB4MkZEMCwgJ00nLCB1J+m8uycpLAogICAgKDB4MkZEMSwgJ00nLCB1J+m9iicpLAogICAgKDB4MkZEMiwgJ00nLCB1J+m9kicpLAogICAgKDB4MkZEMywgJ00nLCB1J+m+jScpLAogICAgKDB4MkZENCwgJ00nLCB1J+m+nCcpLAogICAgKDB4MkZENSwgJ00nLCB1J+m+oCcpLAogICAgKDB4MkZENiwgJ1gnKSwKICAgICgweDMwMDAsICczJywgdScgJyksCiAgICAoMHgzMDAxLCAnVicpLAogICAgKDB4MzAwMiwgJ00nLCB1Jy4nKSwKICAgICgweDMwMDMsICdWJyksCiAgICAoMHgzMDM2LCAnTScsIHUn44CSJyksCiAgICAoMHgzMDM3LCAnVicpLAogICAgKDB4MzAzOCwgJ00nLCB1J+WNgScpLAogICAgKDB4MzAzOSwgJ00nLCB1J+WNhCcpLAogICAgKDB4MzAzQSwgJ00nLCB1J+WNhScpLAogICAgKDB4MzAzQiwgJ1YnKSwKICAgICgweDMwNDAsICdYJyksCiAgICAoMHgzMDQxLCAnVicpLAogICAgKDB4MzA5NywgJ1gnKSwKICAgICgweDMwOTksICdWJyksCiAgICAoMHgzMDlCLCAnMycsIHUnIOOCmScpLAogICAgKDB4MzA5QywgJzMnLCB1JyDjgponKSwKICAgICgweDMwOUQsICdWJyksCiAgICAoMHgzMDlGLCAnTScsIHUn44KI44KKJyksCiAgICAoMHgzMEEwLCAnVicpLAogICAgKDB4MzBGRiwgJ00nLCB1J+OCs+ODiCcpLAogICAgKDB4MzEwMCwgJ1gnKSwKICAgICgweDMxMDUsICdWJyksCiAgICAoMHgzMTJFLCAnWCcpLAogICAgKDB4MzEzMSwgJ00nLCB1J+GEgCcpLAogICAgKDB4MzEzMiwgJ00nLCB1J+GEgScpLAogICAgKDB4MzEzMywgJ00nLCB1J+GGqicpLAogICAgKDB4MzEzNCwgJ00nLCB1J+GEgicpLAogICAgKDB4MzEzNSwgJ00nLCB1J+GGrCcpLAogICAgKDB4MzEzNiwgJ00nLCB1J+GGrScpLAogICAgKDB4MzEzNywgJ00nLCB1J+GEgycpLAogICAgKDB4MzEzOCwgJ00nLCB1J+GEhCcpLAogICAgKDB4MzEzOSwgJ00nLCB1J+GEhScpLAogICAgKDB4MzEzQSwgJ00nLCB1J+GGsCcpLAogICAgKDB4MzEzQiwgJ00nLCB1J+GGsScpLAogICAgKDB4MzEzQywgJ00nLCB1J+GGsicpLAogICAgKDB4MzEzRCwgJ00nLCB1J+GGsycpLAogICAgKDB4MzEzRSwgJ00nLCB1J+GGtCcpLAogICAgKDB4MzEzRiwgJ00nLCB1J+GGtScpLAogICAgKDB4MzE0MCwgJ00nLCB1J+GEmicpLAogICAgKDB4MzE0MSwgJ00nLCB1J+GEhicpLAogICAgKDB4MzE0MiwgJ00nLCB1J+GEhycpLAogICAgKDB4MzE0MywgJ00nLCB1J+GEiCcpLAogICAgKDB4MzE0NCwgJ00nLCB1J+GEoScpLAogICAgXQoKZGVmIF9zZWdfMjkoKToKICAgIHJldHVybiBbCiAgICAoMHgzMTQ1LCAnTScsIHUn4YSJJyksCiAgICAoMHgzMTQ2LCAnTScsIHUn4YSKJyksCiAgICAoMHgzMTQ3LCAnTScsIHUn4YSLJyksCiAgICAoMHgzMTQ4LCAnTScsIHUn4YSMJyksCiAgICAoMHgzMTQ5LCAnTScsIHUn4YSNJyksCiAgICAoMHgzMTRBLCAnTScsIHUn4YSOJyksCiAgICAoMHgzMTRCLCAnTScsIHUn4YSPJyksCiAgICAoMHgzMTRDLCAnTScsIHUn4YSQJyksCiAgICAoMHgzMTRELCAnTScsIHUn4YSRJyksCiAgICAoMHgzMTRFLCAnTScsIHUn4YSSJyksCiAgICAoMHgzMTRGLCAnTScsIHUn4YWhJyksCiAgICAoMHgzMTUwLCAnTScsIHUn4YWiJyksCiAgICAoMHgzMTUxLCAnTScsIHUn4YWjJyksCiAgICAoMHgzMTUyLCAnTScsIHUn4YWkJyksCiAgICAoMHgzMTUzLCAnTScsIHUn4YWlJyksCiAgICAoMHgzMTU0LCAnTScsIHUn4YWmJyksCiAgICAoMHgzMTU1LCAnTScsIHUn4YWnJyksCiAgICAoMHgzMTU2LCAnTScsIHUn4YWoJyksCiAgICAoMHgzMTU3LCAnTScsIHUn4YWpJyksCiAgICAoMHgzMTU4LCAnTScsIHUn4YWqJyksCiAgICAoMHgzMTU5LCAnTScsIHUn4YWrJyksCiAgICAoMHgzMTVBLCAnTScsIHUn4YWsJyksCiAgICAoMHgzMTVCLCAnTScsIHUn4YWtJyksCiAgICAoMHgzMTVDLCAnTScsIHUn4YWuJyksCiAgICAoMHgzMTVELCAnTScsIHUn4YWvJyksCiAgICAoMHgzMTVFLCAnTScsIHUn4YWwJyksCiAgICAoMHgzMTVGLCAnTScsIHUn4YWxJyksCiAgICAoMHgzMTYwLCAnTScsIHUn4YWyJyksCiAgICAoMHgzMTYxLCAnTScsIHUn4YWzJyksCiAgICAoMHgzMTYyLCAnTScsIHUn4YW0JyksCiAgICAoMHgzMTYzLCAnTScsIHUn4YW1JyksCiAgICAoMHgzMTY0LCAnWCcpLAogICAgKDB4MzE2NSwgJ00nLCB1J+GElCcpLAogICAgKDB4MzE2NiwgJ00nLCB1J+GElScpLAogICAgKDB4MzE2NywgJ00nLCB1J+GHhycpLAogICAgKDB4MzE2OCwgJ00nLCB1J+GHiCcpLAogICAgKDB4MzE2OSwgJ00nLCB1J+GHjCcpLAogICAgKDB4MzE2QSwgJ00nLCB1J+GHjicpLAogICAgKDB4MzE2QiwgJ00nLCB1J+GHkycpLAogICAgKDB4MzE2QywgJ00nLCB1J+GHlycpLAogICAgKDB4MzE2RCwgJ00nLCB1J+GHmScpLAogICAgKDB4MzE2RSwgJ00nLCB1J+GEnCcpLAogICAgKDB4MzE2RiwgJ00nLCB1J+GHnScpLAogICAgKDB4MzE3MCwgJ00nLCB1J+GHnycpLAogICAgKDB4MzE3MSwgJ00nLCB1J+GEnScpLAogICAgKDB4MzE3MiwgJ00nLCB1J+GEnicpLAogICAgKDB4MzE3MywgJ00nLCB1J+GEoCcpLAogICAgKDB4MzE3NCwgJ00nLCB1J+GEoicpLAogICAgKDB4MzE3NSwgJ00nLCB1J+GEoycpLAogICAgKDB4MzE3NiwgJ00nLCB1J+GEpycpLAogICAgKDB4MzE3NywgJ00nLCB1J+GEqScpLAogICAgKDB4MzE3OCwgJ00nLCB1J+GEqycpLAogICAgKDB4MzE3OSwgJ00nLCB1J+GErCcpLAogICAgKDB4MzE3QSwgJ00nLCB1J+GErScpLAogICAgKDB4MzE3QiwgJ00nLCB1J+GEricpLAogICAgKDB4MzE3QywgJ00nLCB1J+GErycpLAogICAgKDB4MzE3RCwgJ00nLCB1J+GEsicpLAogICAgKDB4MzE3RSwgJ00nLCB1J+GEticpLAogICAgKDB4MzE3RiwgJ00nLCB1J+GFgCcpLAogICAgKDB4MzE4MCwgJ00nLCB1J+GFhycpLAogICAgKDB4MzE4MSwgJ00nLCB1J+GFjCcpLAogICAgKDB4MzE4MiwgJ00nLCB1J+GHsScpLAogICAgKDB4MzE4MywgJ00nLCB1J+GHsicpLAogICAgKDB4MzE4NCwgJ00nLCB1J+GFlycpLAogICAgKDB4MzE4NSwgJ00nLCB1J+GFmCcpLAogICAgKDB4MzE4NiwgJ00nLCB1J+GFmScpLAogICAgKDB4MzE4NywgJ00nLCB1J+GGhCcpLAogICAgKDB4MzE4OCwgJ00nLCB1J+GGhScpLAogICAgKDB4MzE4OSwgJ00nLCB1J+GGiCcpLAogICAgKDB4MzE4QSwgJ00nLCB1J+GGkScpLAogICAgKDB4MzE4QiwgJ00nLCB1J+GGkicpLAogICAgKDB4MzE4QywgJ00nLCB1J+GGlCcpLAogICAgKDB4MzE4RCwgJ00nLCB1J+GGnicpLAogICAgKDB4MzE4RSwgJ00nLCB1J+GGoScpLAogICAgKDB4MzE4RiwgJ1gnKSwKICAgICgweDMxOTAsICdWJyksCiAgICAoMHgzMTkyLCAnTScsIHUn5LiAJyksCiAgICAoMHgzMTkzLCAnTScsIHUn5LqMJyksCiAgICAoMHgzMTk0LCAnTScsIHUn5LiJJyksCiAgICAoMHgzMTk1LCAnTScsIHUn5ZubJyksCiAgICAoMHgzMTk2LCAnTScsIHUn5LiKJyksCiAgICAoMHgzMTk3LCAnTScsIHUn5LitJyksCiAgICAoMHgzMTk4LCAnTScsIHUn5LiLJyksCiAgICAoMHgzMTk5LCAnTScsIHUn55SyJyksCiAgICAoMHgzMTlBLCAnTScsIHUn5LmZJyksCiAgICAoMHgzMTlCLCAnTScsIHUn5LiZJyksCiAgICAoMHgzMTlDLCAnTScsIHUn5LiBJyksCiAgICAoMHgzMTlELCAnTScsIHUn5aSpJyksCiAgICAoMHgzMTlFLCAnTScsIHUn5ZywJyksCiAgICAoMHgzMTlGLCAnTScsIHUn5Lq6JyksCiAgICAoMHgzMUEwLCAnVicpLAogICAgKDB4MzFCQiwgJ1gnKSwKICAgICgweDMxQzAsICdWJyksCiAgICAoMHgzMUU0LCAnWCcpLAogICAgKDB4MzFGMCwgJ1YnKSwKICAgICgweDMyMDAsICczJywgdSco4YSAKScpLAogICAgKDB4MzIwMSwgJzMnLCB1JyjhhIIpJyksCiAgICAoMHgzMjAyLCAnMycsIHUnKOGEgyknKSwKICAgICgweDMyMDMsICczJywgdSco4YSFKScpLAogICAgKDB4MzIwNCwgJzMnLCB1JyjhhIYpJyksCiAgICBdCgpkZWYgX3NlZ18zMCgpOgogICAgcmV0dXJuIFsKICAgICgweDMyMDUsICczJywgdSco4YSHKScpLAogICAgKDB4MzIwNiwgJzMnLCB1JyjhhIkpJyksCiAgICAoMHgzMjA3LCAnMycsIHUnKOGEiyknKSwKICAgICgweDMyMDgsICczJywgdSco4YSMKScpLAogICAgKDB4MzIwOSwgJzMnLCB1JyjhhI4pJyksCiAgICAoMHgzMjBBLCAnMycsIHUnKOGEjyknKSwKICAgICgweDMyMEIsICczJywgdSco4YSQKScpLAogICAgKDB4MzIwQywgJzMnLCB1JyjhhJEpJyksCiAgICAoMHgzMjBELCAnMycsIHUnKOGEkiknKSwKICAgICgweDMyMEUsICczJywgdSco6rCAKScpLAogICAgKDB4MzIwRiwgJzMnLCB1JyjrgpgpJyksCiAgICAoMHgzMjEwLCAnMycsIHUnKOuLpCknKSwKICAgICgweDMyMTEsICczJywgdSco6528KScpLAogICAgKDB4MzIxMiwgJzMnLCB1Jyjrp4gpJyksCiAgICAoMHgzMjEzLCAnMycsIHUnKOuwlCknKSwKICAgICgweDMyMTQsICczJywgdSco7IKsKScpLAogICAgKDB4MzIxNSwgJzMnLCB1JyjslYQpJyksCiAgICAoMHgzMjE2LCAnMycsIHUnKOyekCknKSwKICAgICgweDMyMTcsICczJywgdSco7LCoKScpLAogICAgKDB4MzIxOCwgJzMnLCB1JyjsubQpJyksCiAgICAoMHgzMjE5LCAnMycsIHUnKO2DgCknKSwKICAgICgweDMyMUEsICczJywgdSco7YyMKScpLAogICAgKDB4MzIxQiwgJzMnLCB1JyjtlZgpJyksCiAgICAoMHgzMjFDLCAnMycsIHUnKOyjvCknKSwKICAgICgweDMyMUQsICczJywgdSco7Jik7KCEKScpLAogICAgKDB4MzIxRSwgJzMnLCB1JyjsmKTtm4QpJyksCiAgICAoMHgzMjFGLCAnWCcpLAogICAgKDB4MzIyMCwgJzMnLCB1JyjkuIApJyksCiAgICAoMHgzMjIxLCAnMycsIHUnKOS6jCknKSwKICAgICgweDMyMjIsICczJywgdSco5LiJKScpLAogICAgKDB4MzIyMywgJzMnLCB1Jyjlm5spJyksCiAgICAoMHgzMjI0LCAnMycsIHUnKOS6lCknKSwKICAgICgweDMyMjUsICczJywgdSco5YWtKScpLAogICAgKDB4MzIyNiwgJzMnLCB1JyjkuIMpJyksCiAgICAoMHgzMjI3LCAnMycsIHUnKOWFqyknKSwKICAgICgweDMyMjgsICczJywgdSco5LmdKScpLAogICAgKDB4MzIyOSwgJzMnLCB1JyjljYEpJyksCiAgICAoMHgzMjJBLCAnMycsIHUnKOaciCknKSwKICAgICgweDMyMkIsICczJywgdSco54GrKScpLAogICAgKDB4MzIyQywgJzMnLCB1JyjmsLQpJyksCiAgICAoMHgzMjJELCAnMycsIHUnKOacqCknKSwKICAgICgweDMyMkUsICczJywgdSco6YeRKScpLAogICAgKDB4MzIyRiwgJzMnLCB1JyjlnJ8pJyksCiAgICAoMHgzMjMwLCAnMycsIHUnKOaXpSknKSwKICAgICgweDMyMzEsICczJywgdSco5qCqKScpLAogICAgKDB4MzIzMiwgJzMnLCB1JyjmnIkpJyksCiAgICAoMHgzMjMzLCAnMycsIHUnKOekviknKSwKICAgICgweDMyMzQsICczJywgdSco5ZCNKScpLAogICAgKDB4MzIzNSwgJzMnLCB1JyjnibkpJyksCiAgICAoMHgzMjM2LCAnMycsIHUnKOiyoSknKSwKICAgICgweDMyMzcsICczJywgdSco56WdKScpLAogICAgKDB4MzIzOCwgJzMnLCB1JyjlirQpJyksCiAgICAoMHgzMjM5LCAnMycsIHUnKOS7oyknKSwKICAgICgweDMyM0EsICczJywgdSco5ZG8KScpLAogICAgKDB4MzIzQiwgJzMnLCB1JyjlraYpJyksCiAgICAoMHgzMjNDLCAnMycsIHUnKOeboyknKSwKICAgICgweDMyM0QsICczJywgdSco5LyBKScpLAogICAgKDB4MzIzRSwgJzMnLCB1Jyjos4cpJyksCiAgICAoMHgzMjNGLCAnMycsIHUnKOWNlCknKSwKICAgICgweDMyNDAsICczJywgdSco56WtKScpLAogICAgKDB4MzI0MSwgJzMnLCB1JyjkvJEpJyksCiAgICAoMHgzMjQyLCAnMycsIHUnKOiHqiknKSwKICAgICgweDMyNDMsICczJywgdSco6IezKScpLAogICAgKDB4MzI0NCwgJ00nLCB1J+WVjycpLAogICAgKDB4MzI0NSwgJ00nLCB1J+W5vCcpLAogICAgKDB4MzI0NiwgJ00nLCB1J+aWhycpLAogICAgKDB4MzI0NywgJ00nLCB1J+eujycpLAogICAgKDB4MzI0OCwgJ1YnKSwKICAgICgweDMyNTAsICdNJywgdSdwdGUnKSwKICAgICgweDMyNTEsICdNJywgdScyMScpLAogICAgKDB4MzI1MiwgJ00nLCB1JzIyJyksCiAgICAoMHgzMjUzLCAnTScsIHUnMjMnKSwKICAgICgweDMyNTQsICdNJywgdScyNCcpLAogICAgKDB4MzI1NSwgJ00nLCB1JzI1JyksCiAgICAoMHgzMjU2LCAnTScsIHUnMjYnKSwKICAgICgweDMyNTcsICdNJywgdScyNycpLAogICAgKDB4MzI1OCwgJ00nLCB1JzI4JyksCiAgICAoMHgzMjU5LCAnTScsIHUnMjknKSwKICAgICgweDMyNUEsICdNJywgdSczMCcpLAogICAgKDB4MzI1QiwgJ00nLCB1JzMxJyksCiAgICAoMHgzMjVDLCAnTScsIHUnMzInKSwKICAgICgweDMyNUQsICdNJywgdSczMycpLAogICAgKDB4MzI1RSwgJ00nLCB1JzM0JyksCiAgICAoMHgzMjVGLCAnTScsIHUnMzUnKSwKICAgICgweDMyNjAsICdNJywgdSfhhIAnKSwKICAgICgweDMyNjEsICdNJywgdSfhhIInKSwKICAgICgweDMyNjIsICdNJywgdSfhhIMnKSwKICAgICgweDMyNjMsICdNJywgdSfhhIUnKSwKICAgICgweDMyNjQsICdNJywgdSfhhIYnKSwKICAgICgweDMyNjUsICdNJywgdSfhhIcnKSwKICAgICgweDMyNjYsICdNJywgdSfhhIknKSwKICAgICgweDMyNjcsICdNJywgdSfhhIsnKSwKICAgICgweDMyNjgsICdNJywgdSfhhIwnKSwKICAgICgweDMyNjksICdNJywgdSfhhI4nKSwKICAgICgweDMyNkEsICdNJywgdSfhhI8nKSwKICAgICgweDMyNkIsICdNJywgdSfhhJAnKSwKICAgICgweDMyNkMsICdNJywgdSfhhJEnKSwKICAgICgweDMyNkQsICdNJywgdSfhhJInKSwKICAgICgweDMyNkUsICdNJywgdSfqsIAnKSwKICAgICgweDMyNkYsICdNJywgdSfrgpgnKSwKICAgIF0KCmRlZiBfc2VnXzMxKCk6CiAgICByZXR1cm4gWwogICAgKDB4MzI3MCwgJ00nLCB1J+uLpCcpLAogICAgKDB4MzI3MSwgJ00nLCB1J+udvCcpLAogICAgKDB4MzI3MiwgJ00nLCB1J+uniCcpLAogICAgKDB4MzI3MywgJ00nLCB1J+uwlCcpLAogICAgKDB4MzI3NCwgJ00nLCB1J+yCrCcpLAogICAgKDB4MzI3NSwgJ00nLCB1J+yVhCcpLAogICAgKDB4MzI3NiwgJ00nLCB1J+yekCcpLAogICAgKDB4MzI3NywgJ00nLCB1J+ywqCcpLAogICAgKDB4MzI3OCwgJ00nLCB1J+y5tCcpLAogICAgKDB4MzI3OSwgJ00nLCB1J+2DgCcpLAogICAgKDB4MzI3QSwgJ00nLCB1J+2MjCcpLAogICAgKDB4MzI3QiwgJ00nLCB1J+2VmCcpLAogICAgKDB4MzI3QywgJ00nLCB1J+ywuOqzoCcpLAogICAgKDB4MzI3RCwgJ00nLCB1J+yjvOydmCcpLAogICAgKDB4MzI3RSwgJ00nLCB1J+yasCcpLAogICAgKDB4MzI3RiwgJ1YnKSwKICAgICgweDMyODAsICdNJywgdSfkuIAnKSwKICAgICgweDMyODEsICdNJywgdSfkuownKSwKICAgICgweDMyODIsICdNJywgdSfkuIknKSwKICAgICgweDMyODMsICdNJywgdSflm5snKSwKICAgICgweDMyODQsICdNJywgdSfkupQnKSwKICAgICgweDMyODUsICdNJywgdSflha0nKSwKICAgICgweDMyODYsICdNJywgdSfkuIMnKSwKICAgICgweDMyODcsICdNJywgdSflhasnKSwKICAgICgweDMyODgsICdNJywgdSfkuZ0nKSwKICAgICgweDMyODksICdNJywgdSfljYEnKSwKICAgICgweDMyOEEsICdNJywgdSfmnIgnKSwKICAgICgweDMyOEIsICdNJywgdSfngasnKSwKICAgICgweDMyOEMsICdNJywgdSfmsLQnKSwKICAgICgweDMyOEQsICdNJywgdSfmnKgnKSwKICAgICgweDMyOEUsICdNJywgdSfph5EnKSwKICAgICgweDMyOEYsICdNJywgdSflnJ8nKSwKICAgICgweDMyOTAsICdNJywgdSfml6UnKSwKICAgICgweDMyOTEsICdNJywgdSfmoKonKSwKICAgICgweDMyOTIsICdNJywgdSfmnIknKSwKICAgICgweDMyOTMsICdNJywgdSfnpL4nKSwKICAgICgweDMyOTQsICdNJywgdSflkI0nKSwKICAgICgweDMyOTUsICdNJywgdSfnibknKSwKICAgICgweDMyOTYsICdNJywgdSfosqEnKSwKICAgICgweDMyOTcsICdNJywgdSfnpZ0nKSwKICAgICgweDMyOTgsICdNJywgdSflirQnKSwKICAgICgweDMyOTksICdNJywgdSfnp5gnKSwKICAgICgweDMyOUEsICdNJywgdSfnlLcnKSwKICAgICgweDMyOUIsICdNJywgdSflpbMnKSwKICAgICgweDMyOUMsICdNJywgdSfpgaknKSwKICAgICgweDMyOUQsICdNJywgdSflhKonKSwKICAgICgweDMyOUUsICdNJywgdSfljbAnKSwKICAgICgweDMyOUYsICdNJywgdSfms6gnKSwKICAgICgweDMyQTAsICdNJywgdSfpoIUnKSwKICAgICgweDMyQTEsICdNJywgdSfkvJEnKSwKICAgICgweDMyQTIsICdNJywgdSflhpknKSwKICAgICgweDMyQTMsICdNJywgdSfmraMnKSwKICAgICgweDMyQTQsICdNJywgdSfkuIonKSwKICAgICgweDMyQTUsICdNJywgdSfkuK0nKSwKICAgICgweDMyQTYsICdNJywgdSfkuIsnKSwKICAgICgweDMyQTcsICdNJywgdSflt6YnKSwKICAgICgweDMyQTgsICdNJywgdSflj7MnKSwKICAgICgweDMyQTksICdNJywgdSfljLsnKSwKICAgICgweDMyQUEsICdNJywgdSflrpcnKSwKICAgICgweDMyQUIsICdNJywgdSflraYnKSwKICAgICgweDMyQUMsICdNJywgdSfnm6MnKSwKICAgICgweDMyQUQsICdNJywgdSfkvIEnKSwKICAgICgweDMyQUUsICdNJywgdSfos4cnKSwKICAgICgweDMyQUYsICdNJywgdSfljZQnKSwKICAgICgweDMyQjAsICdNJywgdSflpJwnKSwKICAgICgweDMyQjEsICdNJywgdSczNicpLAogICAgKDB4MzJCMiwgJ00nLCB1JzM3JyksCiAgICAoMHgzMkIzLCAnTScsIHUnMzgnKSwKICAgICgweDMyQjQsICdNJywgdSczOScpLAogICAgKDB4MzJCNSwgJ00nLCB1JzQwJyksCiAgICAoMHgzMkI2LCAnTScsIHUnNDEnKSwKICAgICgweDMyQjcsICdNJywgdSc0MicpLAogICAgKDB4MzJCOCwgJ00nLCB1JzQzJyksCiAgICAoMHgzMkI5LCAnTScsIHUnNDQnKSwKICAgICgweDMyQkEsICdNJywgdSc0NScpLAogICAgKDB4MzJCQiwgJ00nLCB1JzQ2JyksCiAgICAoMHgzMkJDLCAnTScsIHUnNDcnKSwKICAgICgweDMyQkQsICdNJywgdSc0OCcpLAogICAgKDB4MzJCRSwgJ00nLCB1JzQ5JyksCiAgICAoMHgzMkJGLCAnTScsIHUnNTAnKSwKICAgICgweDMyQzAsICdNJywgdScx5pyIJyksCiAgICAoMHgzMkMxLCAnTScsIHUnMuaciCcpLAogICAgKDB4MzJDMiwgJ00nLCB1JzPmnIgnKSwKICAgICgweDMyQzMsICdNJywgdSc05pyIJyksCiAgICAoMHgzMkM0LCAnTScsIHUnNeaciCcpLAogICAgKDB4MzJDNSwgJ00nLCB1JzbmnIgnKSwKICAgICgweDMyQzYsICdNJywgdSc35pyIJyksCiAgICAoMHgzMkM3LCAnTScsIHUnOOaciCcpLAogICAgKDB4MzJDOCwgJ00nLCB1JznmnIgnKSwKICAgICgweDMyQzksICdNJywgdScxMOaciCcpLAogICAgKDB4MzJDQSwgJ00nLCB1JzEx5pyIJyksCiAgICAoMHgzMkNCLCAnTScsIHUnMTLmnIgnKSwKICAgICgweDMyQ0MsICdNJywgdSdoZycpLAogICAgKDB4MzJDRCwgJ00nLCB1J2VyZycpLAogICAgKDB4MzJDRSwgJ00nLCB1J2V2JyksCiAgICAoMHgzMkNGLCAnTScsIHUnbHRkJyksCiAgICAoMHgzMkQwLCAnTScsIHUn44KiJyksCiAgICAoMHgzMkQxLCAnTScsIHUn44KkJyksCiAgICAoMHgzMkQyLCAnTScsIHUn44KmJyksCiAgICAoMHgzMkQzLCAnTScsIHUn44KoJyksCiAgICBdCgpkZWYgX3NlZ18zMigpOgogICAgcmV0dXJuIFsKICAgICgweDMyRDQsICdNJywgdSfjgqonKSwKICAgICgweDMyRDUsICdNJywgdSfjgqsnKSwKICAgICgweDMyRDYsICdNJywgdSfjgq0nKSwKICAgICgweDMyRDcsICdNJywgdSfjgq8nKSwKICAgICgweDMyRDgsICdNJywgdSfjgrEnKSwKICAgICgweDMyRDksICdNJywgdSfjgrMnKSwKICAgICgweDMyREEsICdNJywgdSfjgrUnKSwKICAgICgweDMyREIsICdNJywgdSfjgrcnKSwKICAgICgweDMyREMsICdNJywgdSfjgrknKSwKICAgICgweDMyREQsICdNJywgdSfjgrsnKSwKICAgICgweDMyREUsICdNJywgdSfjgr0nKSwKICAgICgweDMyREYsICdNJywgdSfjgr8nKSwKICAgICgweDMyRTAsICdNJywgdSfjg4EnKSwKICAgICgweDMyRTEsICdNJywgdSfjg4QnKSwKICAgICgweDMyRTIsICdNJywgdSfjg4YnKSwKICAgICgweDMyRTMsICdNJywgdSfjg4gnKSwKICAgICgweDMyRTQsICdNJywgdSfjg4onKSwKICAgICgweDMyRTUsICdNJywgdSfjg4snKSwKICAgICgweDMyRTYsICdNJywgdSfjg4wnKSwKICAgICgweDMyRTcsICdNJywgdSfjg40nKSwKICAgICgweDMyRTgsICdNJywgdSfjg44nKSwKICAgICgweDMyRTksICdNJywgdSfjg48nKSwKICAgICgweDMyRUEsICdNJywgdSfjg5InKSwKICAgICgweDMyRUIsICdNJywgdSfjg5UnKSwKICAgICgweDMyRUMsICdNJywgdSfjg5gnKSwKICAgICgweDMyRUQsICdNJywgdSfjg5snKSwKICAgICgweDMyRUUsICdNJywgdSfjg54nKSwKICAgICgweDMyRUYsICdNJywgdSfjg58nKSwKICAgICgweDMyRjAsICdNJywgdSfjg6AnKSwKICAgICgweDMyRjEsICdNJywgdSfjg6EnKSwKICAgICgweDMyRjIsICdNJywgdSfjg6InKSwKICAgICgweDMyRjMsICdNJywgdSfjg6QnKSwKICAgICgweDMyRjQsICdNJywgdSfjg6YnKSwKICAgICgweDMyRjUsICdNJywgdSfjg6gnKSwKICAgICgweDMyRjYsICdNJywgdSfjg6knKSwKICAgICgweDMyRjcsICdNJywgdSfjg6onKSwKICAgICgweDMyRjgsICdNJywgdSfjg6snKSwKICAgICgweDMyRjksICdNJywgdSfjg6wnKSwKICAgICgweDMyRkEsICdNJywgdSfjg60nKSwKICAgICgweDMyRkIsICdNJywgdSfjg68nKSwKICAgICgweDMyRkMsICdNJywgdSfjg7AnKSwKICAgICgweDMyRkQsICdNJywgdSfjg7EnKSwKICAgICgweDMyRkUsICdNJywgdSfjg7InKSwKICAgICgweDMyRkYsICdYJyksCiAgICAoMHgzMzAwLCAnTScsIHUn44Ki44OR44O844OIJyksCiAgICAoMHgzMzAxLCAnTScsIHUn44Ki44Or44OV44KhJyksCiAgICAoMHgzMzAyLCAnTScsIHUn44Ki44Oz44Oa44KiJyksCiAgICAoMHgzMzAzLCAnTScsIHUn44Ki44O844OrJyksCiAgICAoMHgzMzA0LCAnTScsIHUn44Kk44OL44Oz44KwJyksCiAgICAoMHgzMzA1LCAnTScsIHUn44Kk44Oz44OBJyksCiAgICAoMHgzMzA2LCAnTScsIHUn44Km44Kp44OzJyksCiAgICAoMHgzMzA3LCAnTScsIHUn44Ko44K544Kv44O844OJJyksCiAgICAoMHgzMzA4LCAnTScsIHUn44Ko44O844Kr44O8JyksCiAgICAoMHgzMzA5LCAnTScsIHUn44Kq44Oz44K5JyksCiAgICAoMHgzMzBBLCAnTScsIHUn44Kq44O844OgJyksCiAgICAoMHgzMzBCLCAnTScsIHUn44Kr44Kk44OqJyksCiAgICAoMHgzMzBDLCAnTScsIHUn44Kr44Op44OD44OIJyksCiAgICAoMHgzMzBELCAnTScsIHUn44Kr44Ot44Oq44O8JyksCiAgICAoMHgzMzBFLCAnTScsIHUn44Ks44Ot44OzJyksCiAgICAoMHgzMzBGLCAnTScsIHUn44Ks44Oz44OeJyksCiAgICAoMHgzMzEwLCAnTScsIHUn44Ku44KsJyksCiAgICAoMHgzMzExLCAnTScsIHUn44Ku44OL44O8JyksCiAgICAoMHgzMzEyLCAnTScsIHUn44Kt44Ol44Oq44O8JyksCiAgICAoMHgzMzEzLCAnTScsIHUn44Ku44Or44OA44O8JyksCiAgICAoMHgzMzE0LCAnTScsIHUn44Kt44OtJyksCiAgICAoMHgzMzE1LCAnTScsIHUn44Kt44Ot44Kw44Op44OgJyksCiAgICAoMHgzMzE2LCAnTScsIHUn44Kt44Ot44Oh44O844OI44OrJyksCiAgICAoMHgzMzE3LCAnTScsIHUn44Kt44Ot44Ov44OD44OIJyksCiAgICAoMHgzMzE4LCAnTScsIHUn44Kw44Op44OgJyksCiAgICAoMHgzMzE5LCAnTScsIHUn44Kw44Op44Og44OI44OzJyksCiAgICAoMHgzMzFBLCAnTScsIHUn44Kv44Or44K844Kk44OtJyksCiAgICAoMHgzMzFCLCAnTScsIHUn44Kv44Ot44O844ONJyksCiAgICAoMHgzMzFDLCAnTScsIHUn44Kx44O844K5JyksCiAgICAoMHgzMzFELCAnTScsIHUn44Kz44Or44OKJyksCiAgICAoMHgzMzFFLCAnTScsIHUn44Kz44O844OdJyksCiAgICAoMHgzMzFGLCAnTScsIHUn44K144Kk44Kv44OrJyksCiAgICAoMHgzMzIwLCAnTScsIHUn44K144Oz44OB44O844OgJyksCiAgICAoMHgzMzIxLCAnTScsIHUn44K344Oq44Oz44KwJyksCiAgICAoMHgzMzIyLCAnTScsIHUn44K744Oz44OBJyksCiAgICAoMHgzMzIzLCAnTScsIHUn44K744Oz44OIJyksCiAgICAoMHgzMzI0LCAnTScsIHUn44OA44O844K5JyksCiAgICAoMHgzMzI1LCAnTScsIHUn44OH44K3JyksCiAgICAoMHgzMzI2LCAnTScsIHUn44OJ44OrJyksCiAgICAoMHgzMzI3LCAnTScsIHUn44OI44OzJyksCiAgICAoMHgzMzI4LCAnTScsIHUn44OK44OOJyksCiAgICAoMHgzMzI5LCAnTScsIHUn44OO44OD44OIJyksCiAgICAoMHgzMzJBLCAnTScsIHUn44OP44Kk44OEJyksCiAgICAoMHgzMzJCLCAnTScsIHUn44OR44O844K744Oz44OIJyksCiAgICAoMHgzMzJDLCAnTScsIHUn44OR44O844OEJyksCiAgICAoMHgzMzJELCAnTScsIHUn44OQ44O844Os44OrJyksCiAgICAoMHgzMzJFLCAnTScsIHUn44OU44Ki44K544OI44OrJyksCiAgICAoMHgzMzJGLCAnTScsIHUn44OU44Kv44OrJyksCiAgICAoMHgzMzMwLCAnTScsIHUn44OU44KzJyksCiAgICAoMHgzMzMxLCAnTScsIHUn44OT44OrJyksCiAgICAoMHgzMzMyLCAnTScsIHUn44OV44Kh44Op44OD44OJJyksCiAgICAoMHgzMzMzLCAnTScsIHUn44OV44Kj44O844OIJyksCiAgICAoMHgzMzM0LCAnTScsIHUn44OW44OD44K344Kn44OrJyksCiAgICAoMHgzMzM1LCAnTScsIHUn44OV44Op44OzJyksCiAgICAoMHgzMzM2LCAnTScsIHUn44OY44Kv44K/44O844OrJyksCiAgICAoMHgzMzM3LCAnTScsIHUn44Oa44K9JyksCiAgICBdCgpkZWYgX3NlZ18zMygpOgogICAgcmV0dXJuIFsKICAgICgweDMzMzgsICdNJywgdSfjg5rjg4vjg5InKSwKICAgICgweDMzMzksICdNJywgdSfjg5jjg6vjg4QnKSwKICAgICgweDMzM0EsICdNJywgdSfjg5rjg7PjgrknKSwKICAgICgweDMzM0IsICdNJywgdSfjg5rjg7zjgrgnKSwKICAgICgweDMzM0MsICdNJywgdSfjg5njg7zjgr8nKSwKICAgICgweDMzM0QsICdNJywgdSfjg53jgqTjg7Pjg4gnKSwKICAgICgweDMzM0UsICdNJywgdSfjg5zjg6vjg4gnKSwKICAgICgweDMzM0YsICdNJywgdSfjg5vjg7MnKSwKICAgICgweDMzNDAsICdNJywgdSfjg53jg7Pjg4knKSwKICAgICgweDMzNDEsICdNJywgdSfjg5vjg7zjg6snKSwKICAgICgweDMzNDIsICdNJywgdSfjg5vjg7zjg7MnKSwKICAgICgweDMzNDMsICdNJywgdSfjg57jgqTjgq/jg60nKSwKICAgICgweDMzNDQsICdNJywgdSfjg57jgqTjg6snKSwKICAgICgweDMzNDUsICdNJywgdSfjg57jg4Pjg48nKSwKICAgICgweDMzNDYsICdNJywgdSfjg57jg6vjgq8nKSwKICAgICgweDMzNDcsICdNJywgdSfjg57jg7Pjgrfjg6fjg7MnKSwKICAgICgweDMzNDgsICdNJywgdSfjg5/jgq/jg63jg7MnKSwKICAgICgweDMzNDksICdNJywgdSfjg5/jg6onKSwKICAgICgweDMzNEEsICdNJywgdSfjg5/jg6rjg5Djg7zjg6snKSwKICAgICgweDMzNEIsICdNJywgdSfjg6HjgqwnKSwKICAgICgweDMzNEMsICdNJywgdSfjg6Hjgqzjg4jjg7MnKSwKICAgICgweDMzNEQsICdNJywgdSfjg6Hjg7zjg4jjg6snKSwKICAgICgweDMzNEUsICdNJywgdSfjg6Tjg7zjg4knKSwKICAgICgweDMzNEYsICdNJywgdSfjg6Tjg7zjg6snKSwKICAgICgweDMzNTAsICdNJywgdSfjg6bjgqLjg7MnKSwKICAgICgweDMzNTEsICdNJywgdSfjg6rjg4Pjg4jjg6snKSwKICAgICgweDMzNTIsICdNJywgdSfjg6rjg6knKSwKICAgICgweDMzNTMsICdNJywgdSfjg6vjg5Tjg7wnKSwKICAgICgweDMzNTQsICdNJywgdSfjg6vjg7zjg5bjg6snKSwKICAgICgweDMzNTUsICdNJywgdSfjg6zjg6AnKSwKICAgICgweDMzNTYsICdNJywgdSfjg6zjg7Pjg4jjgrLjg7MnKSwKICAgICgweDMzNTcsICdNJywgdSfjg6/jg4Pjg4gnKSwKICAgICgweDMzNTgsICdNJywgdScw54K5JyksCiAgICAoMHgzMzU5LCAnTScsIHUnMeeCuScpLAogICAgKDB4MzM1QSwgJ00nLCB1JzLngrknKSwKICAgICgweDMzNUIsICdNJywgdScz54K5JyksCiAgICAoMHgzMzVDLCAnTScsIHUnNOeCuScpLAogICAgKDB4MzM1RCwgJ00nLCB1JzXngrknKSwKICAgICgweDMzNUUsICdNJywgdSc254K5JyksCiAgICAoMHgzMzVGLCAnTScsIHUnN+eCuScpLAogICAgKDB4MzM2MCwgJ00nLCB1JzjngrknKSwKICAgICgweDMzNjEsICdNJywgdSc554K5JyksCiAgICAoMHgzMzYyLCAnTScsIHUnMTDngrknKSwKICAgICgweDMzNjMsICdNJywgdScxMeeCuScpLAogICAgKDB4MzM2NCwgJ00nLCB1JzEy54K5JyksCiAgICAoMHgzMzY1LCAnTScsIHUnMTPngrknKSwKICAgICgweDMzNjYsICdNJywgdScxNOeCuScpLAogICAgKDB4MzM2NywgJ00nLCB1JzE154K5JyksCiAgICAoMHgzMzY4LCAnTScsIHUnMTbngrknKSwKICAgICgweDMzNjksICdNJywgdScxN+eCuScpLAogICAgKDB4MzM2QSwgJ00nLCB1JzE454K5JyksCiAgICAoMHgzMzZCLCAnTScsIHUnMTnngrknKSwKICAgICgweDMzNkMsICdNJywgdScyMOeCuScpLAogICAgKDB4MzM2RCwgJ00nLCB1JzIx54K5JyksCiAgICAoMHgzMzZFLCAnTScsIHUnMjLngrknKSwKICAgICgweDMzNkYsICdNJywgdScyM+eCuScpLAogICAgKDB4MzM3MCwgJ00nLCB1JzI054K5JyksCiAgICAoMHgzMzcxLCAnTScsIHUnaHBhJyksCiAgICAoMHgzMzcyLCAnTScsIHUnZGEnKSwKICAgICgweDMzNzMsICdNJywgdSdhdScpLAogICAgKDB4MzM3NCwgJ00nLCB1J2JhcicpLAogICAgKDB4MzM3NSwgJ00nLCB1J292JyksCiAgICAoMHgzMzc2LCAnTScsIHUncGMnKSwKICAgICgweDMzNzcsICdNJywgdSdkbScpLAogICAgKDB4MzM3OCwgJ00nLCB1J2RtMicpLAogICAgKDB4MzM3OSwgJ00nLCB1J2RtMycpLAogICAgKDB4MzM3QSwgJ00nLCB1J2l1JyksCiAgICAoMHgzMzdCLCAnTScsIHUn5bmz5oiQJyksCiAgICAoMHgzMzdDLCAnTScsIHUn5pit5ZKMJyksCiAgICAoMHgzMzdELCAnTScsIHUn5aSn5q2jJyksCiAgICAoMHgzMzdFLCAnTScsIHUn5piO5rK7JyksCiAgICAoMHgzMzdGLCAnTScsIHUn5qCq5byP5Lya56S+JyksCiAgICAoMHgzMzgwLCAnTScsIHUncGEnKSwKICAgICgweDMzODEsICdNJywgdSduYScpLAogICAgKDB4MzM4MiwgJ00nLCB1J868YScpLAogICAgKDB4MzM4MywgJ00nLCB1J21hJyksCiAgICAoMHgzMzg0LCAnTScsIHUna2EnKSwKICAgICgweDMzODUsICdNJywgdSdrYicpLAogICAgKDB4MzM4NiwgJ00nLCB1J21iJyksCiAgICAoMHgzMzg3LCAnTScsIHUnZ2InKSwKICAgICgweDMzODgsICdNJywgdSdjYWwnKSwKICAgICgweDMzODksICdNJywgdSdrY2FsJyksCiAgICAoMHgzMzhBLCAnTScsIHUncGYnKSwKICAgICgweDMzOEIsICdNJywgdSduZicpLAogICAgKDB4MzM4QywgJ00nLCB1J868ZicpLAogICAgKDB4MzM4RCwgJ00nLCB1J868ZycpLAogICAgKDB4MzM4RSwgJ00nLCB1J21nJyksCiAgICAoMHgzMzhGLCAnTScsIHUna2cnKSwKICAgICgweDMzOTAsICdNJywgdSdoeicpLAogICAgKDB4MzM5MSwgJ00nLCB1J2toeicpLAogICAgKDB4MzM5MiwgJ00nLCB1J21oeicpLAogICAgKDB4MzM5MywgJ00nLCB1J2doeicpLAogICAgKDB4MzM5NCwgJ00nLCB1J3RoeicpLAogICAgKDB4MzM5NSwgJ00nLCB1J868bCcpLAogICAgKDB4MzM5NiwgJ00nLCB1J21sJyksCiAgICAoMHgzMzk3LCAnTScsIHUnZGwnKSwKICAgICgweDMzOTgsICdNJywgdSdrbCcpLAogICAgKDB4MzM5OSwgJ00nLCB1J2ZtJyksCiAgICAoMHgzMzlBLCAnTScsIHUnbm0nKSwKICAgICgweDMzOUIsICdNJywgdSfOvG0nKSwKICAgIF0KCmRlZiBfc2VnXzM0KCk6CiAgICByZXR1cm4gWwogICAgKDB4MzM5QywgJ00nLCB1J21tJyksCiAgICAoMHgzMzlELCAnTScsIHUnY20nKSwKICAgICgweDMzOUUsICdNJywgdSdrbScpLAogICAgKDB4MzM5RiwgJ00nLCB1J21tMicpLAogICAgKDB4MzNBMCwgJ00nLCB1J2NtMicpLAogICAgKDB4MzNBMSwgJ00nLCB1J20yJyksCiAgICAoMHgzM0EyLCAnTScsIHUna20yJyksCiAgICAoMHgzM0EzLCAnTScsIHUnbW0zJyksCiAgICAoMHgzM0E0LCAnTScsIHUnY20zJyksCiAgICAoMHgzM0E1LCAnTScsIHUnbTMnKSwKICAgICgweDMzQTYsICdNJywgdSdrbTMnKSwKICAgICgweDMzQTcsICdNJywgdSdt4oiVcycpLAogICAgKDB4MzNBOCwgJ00nLCB1J23iiJVzMicpLAogICAgKDB4MzNBOSwgJ00nLCB1J3BhJyksCiAgICAoMHgzM0FBLCAnTScsIHUna3BhJyksCiAgICAoMHgzM0FCLCAnTScsIHUnbXBhJyksCiAgICAoMHgzM0FDLCAnTScsIHUnZ3BhJyksCiAgICAoMHgzM0FELCAnTScsIHUncmFkJyksCiAgICAoMHgzM0FFLCAnTScsIHUncmFk4oiVcycpLAogICAgKDB4MzNBRiwgJ00nLCB1J3JhZOKIlXMyJyksCiAgICAoMHgzM0IwLCAnTScsIHUncHMnKSwKICAgICgweDMzQjEsICdNJywgdSducycpLAogICAgKDB4MzNCMiwgJ00nLCB1J868cycpLAogICAgKDB4MzNCMywgJ00nLCB1J21zJyksCiAgICAoMHgzM0I0LCAnTScsIHUncHYnKSwKICAgICgweDMzQjUsICdNJywgdSdudicpLAogICAgKDB4MzNCNiwgJ00nLCB1J868dicpLAogICAgKDB4MzNCNywgJ00nLCB1J212JyksCiAgICAoMHgzM0I4LCAnTScsIHUna3YnKSwKICAgICgweDMzQjksICdNJywgdSdtdicpLAogICAgKDB4MzNCQSwgJ00nLCB1J3B3JyksCiAgICAoMHgzM0JCLCAnTScsIHUnbncnKSwKICAgICgweDMzQkMsICdNJywgdSfOvHcnKSwKICAgICgweDMzQkQsICdNJywgdSdtdycpLAogICAgKDB4MzNCRSwgJ00nLCB1J2t3JyksCiAgICAoMHgzM0JGLCAnTScsIHUnbXcnKSwKICAgICgweDMzQzAsICdNJywgdSdrz4knKSwKICAgICgweDMzQzEsICdNJywgdSdtz4knKSwKICAgICgweDMzQzIsICdYJyksCiAgICAoMHgzM0MzLCAnTScsIHUnYnEnKSwKICAgICgweDMzQzQsICdNJywgdSdjYycpLAogICAgKDB4MzNDNSwgJ00nLCB1J2NkJyksCiAgICAoMHgzM0M2LCAnTScsIHUnY+KIlWtnJyksCiAgICAoMHgzM0M3LCAnWCcpLAogICAgKDB4MzNDOCwgJ00nLCB1J2RiJyksCiAgICAoMHgzM0M5LCAnTScsIHUnZ3knKSwKICAgICgweDMzQ0EsICdNJywgdSdoYScpLAogICAgKDB4MzNDQiwgJ00nLCB1J2hwJyksCiAgICAoMHgzM0NDLCAnTScsIHUnaW4nKSwKICAgICgweDMzQ0QsICdNJywgdSdraycpLAogICAgKDB4MzNDRSwgJ00nLCB1J2ttJyksCiAgICAoMHgzM0NGLCAnTScsIHUna3QnKSwKICAgICgweDMzRDAsICdNJywgdSdsbScpLAogICAgKDB4MzNEMSwgJ00nLCB1J2xuJyksCiAgICAoMHgzM0QyLCAnTScsIHUnbG9nJyksCiAgICAoMHgzM0QzLCAnTScsIHUnbHgnKSwKICAgICgweDMzRDQsICdNJywgdSdtYicpLAogICAgKDB4MzNENSwgJ00nLCB1J21pbCcpLAogICAgKDB4MzNENiwgJ00nLCB1J21vbCcpLAogICAgKDB4MzNENywgJ00nLCB1J3BoJyksCiAgICAoMHgzM0Q4LCAnWCcpLAogICAgKDB4MzNEOSwgJ00nLCB1J3BwbScpLAogICAgKDB4MzNEQSwgJ00nLCB1J3ByJyksCiAgICAoMHgzM0RCLCAnTScsIHUnc3InKSwKICAgICgweDMzREMsICdNJywgdSdzdicpLAogICAgKDB4MzNERCwgJ00nLCB1J3diJyksCiAgICAoMHgzM0RFLCAnTScsIHUnduKIlW0nKSwKICAgICgweDMzREYsICdNJywgdSdh4oiVbScpLAogICAgKDB4MzNFMCwgJ00nLCB1JzHml6UnKSwKICAgICgweDMzRTEsICdNJywgdScy5pelJyksCiAgICAoMHgzM0UyLCAnTScsIHUnM+aXpScpLAogICAgKDB4MzNFMywgJ00nLCB1JzTml6UnKSwKICAgICgweDMzRTQsICdNJywgdSc15pelJyksCiAgICAoMHgzM0U1LCAnTScsIHUnNuaXpScpLAogICAgKDB4MzNFNiwgJ00nLCB1Jzfml6UnKSwKICAgICgweDMzRTcsICdNJywgdSc45pelJyksCiAgICAoMHgzM0U4LCAnTScsIHUnOeaXpScpLAogICAgKDB4MzNFOSwgJ00nLCB1JzEw5pelJyksCiAgICAoMHgzM0VBLCAnTScsIHUnMTHml6UnKSwKICAgICgweDMzRUIsICdNJywgdScxMuaXpScpLAogICAgKDB4MzNFQywgJ00nLCB1JzEz5pelJyksCiAgICAoMHgzM0VELCAnTScsIHUnMTTml6UnKSwKICAgICgweDMzRUUsICdNJywgdScxNeaXpScpLAogICAgKDB4MzNFRiwgJ00nLCB1JzE25pelJyksCiAgICAoMHgzM0YwLCAnTScsIHUnMTfml6UnKSwKICAgICgweDMzRjEsICdNJywgdScxOOaXpScpLAogICAgKDB4MzNGMiwgJ00nLCB1JzE55pelJyksCiAgICAoMHgzM0YzLCAnTScsIHUnMjDml6UnKSwKICAgICgweDMzRjQsICdNJywgdScyMeaXpScpLAogICAgKDB4MzNGNSwgJ00nLCB1JzIy5pelJyksCiAgICAoMHgzM0Y2LCAnTScsIHUnMjPml6UnKSwKICAgICgweDMzRjcsICdNJywgdScyNOaXpScpLAogICAgKDB4MzNGOCwgJ00nLCB1JzI15pelJyksCiAgICAoMHgzM0Y5LCAnTScsIHUnMjbml6UnKSwKICAgICgweDMzRkEsICdNJywgdScyN+aXpScpLAogICAgKDB4MzNGQiwgJ00nLCB1JzI45pelJyksCiAgICAoMHgzM0ZDLCAnTScsIHUnMjnml6UnKSwKICAgICgweDMzRkQsICdNJywgdSczMOaXpScpLAogICAgKDB4MzNGRSwgJ00nLCB1JzMx5pelJyksCiAgICAoMHgzM0ZGLCAnTScsIHUnZ2FsJyksCiAgICBdCgpkZWYgX3NlZ18zNSgpOgogICAgcmV0dXJuIFsKICAgICgweDM0MDAsICdWJyksCiAgICAoMHg0REI2LCAnWCcpLAogICAgKDB4NERDMCwgJ1YnKSwKICAgICgweDlGQ0QsICdYJyksCiAgICAoMHhBMDAwLCAnVicpLAogICAgKDB4QTQ4RCwgJ1gnKSwKICAgICgweEE0OTAsICdWJyksCiAgICAoMHhBNEM3LCAnWCcpLAogICAgKDB4QTREMCwgJ1YnKSwKICAgICgweEE2MkMsICdYJyksCiAgICAoMHhBNjQwLCAnTScsIHUn6pmBJyksCiAgICAoMHhBNjQxLCAnVicpLAogICAgKDB4QTY0MiwgJ00nLCB1J+qZgycpLAogICAgKDB4QTY0MywgJ1YnKSwKICAgICgweEE2NDQsICdNJywgdSfqmYUnKSwKICAgICgweEE2NDUsICdWJyksCiAgICAoMHhBNjQ2LCAnTScsIHUn6pmHJyksCiAgICAoMHhBNjQ3LCAnVicpLAogICAgKDB4QTY0OCwgJ00nLCB1J+qZiScpLAogICAgKDB4QTY0OSwgJ1YnKSwKICAgICgweEE2NEEsICdNJywgdSfqmYsnKSwKICAgICgweEE2NEIsICdWJyksCiAgICAoMHhBNjRDLCAnTScsIHUn6pmNJyksCiAgICAoMHhBNjRELCAnVicpLAogICAgKDB4QTY0RSwgJ00nLCB1J+qZjycpLAogICAgKDB4QTY0RiwgJ1YnKSwKICAgICgweEE2NTAsICdNJywgdSfqmZEnKSwKICAgICgweEE2NTEsICdWJyksCiAgICAoMHhBNjUyLCAnTScsIHUn6pmTJyksCiAgICAoMHhBNjUzLCAnVicpLAogICAgKDB4QTY1NCwgJ00nLCB1J+qZlScpLAogICAgKDB4QTY1NSwgJ1YnKSwKICAgICgweEE2NTYsICdNJywgdSfqmZcnKSwKICAgICgweEE2NTcsICdWJyksCiAgICAoMHhBNjU4LCAnTScsIHUn6pmZJyksCiAgICAoMHhBNjU5LCAnVicpLAogICAgKDB4QTY1QSwgJ00nLCB1J+qZmycpLAogICAgKDB4QTY1QiwgJ1YnKSwKICAgICgweEE2NUMsICdNJywgdSfqmZ0nKSwKICAgICgweEE2NUQsICdWJyksCiAgICAoMHhBNjVFLCAnTScsIHUn6pmfJyksCiAgICAoMHhBNjVGLCAnVicpLAogICAgKDB4QTY2MCwgJ00nLCB1J+qZoScpLAogICAgKDB4QTY2MSwgJ1YnKSwKICAgICgweEE2NjIsICdNJywgdSfqmaMnKSwKICAgICgweEE2NjMsICdWJyksCiAgICAoMHhBNjY0LCAnTScsIHUn6pmlJyksCiAgICAoMHhBNjY1LCAnVicpLAogICAgKDB4QTY2NiwgJ00nLCB1J+qZpycpLAogICAgKDB4QTY2NywgJ1YnKSwKICAgICgweEE2NjgsICdNJywgdSfqmaknKSwKICAgICgweEE2NjksICdWJyksCiAgICAoMHhBNjZBLCAnTScsIHUn6pmrJyksCiAgICAoMHhBNjZCLCAnVicpLAogICAgKDB4QTY2QywgJ00nLCB1J+qZrScpLAogICAgKDB4QTY2RCwgJ1YnKSwKICAgICgweEE2ODAsICdNJywgdSfqmoEnKSwKICAgICgweEE2ODEsICdWJyksCiAgICAoMHhBNjgyLCAnTScsIHUn6pqDJyksCiAgICAoMHhBNjgzLCAnVicpLAogICAgKDB4QTY4NCwgJ00nLCB1J+qahScpLAogICAgKDB4QTY4NSwgJ1YnKSwKICAgICgweEE2ODYsICdNJywgdSfqmocnKSwKICAgICgweEE2ODcsICdWJyksCiAgICAoMHhBNjg4LCAnTScsIHUn6pqJJyksCiAgICAoMHhBNjg5LCAnVicpLAogICAgKDB4QTY4QSwgJ00nLCB1J+qaiycpLAogICAgKDB4QTY4QiwgJ1YnKSwKICAgICgweEE2OEMsICdNJywgdSfqmo0nKSwKICAgICgweEE2OEQsICdWJyksCiAgICAoMHhBNjhFLCAnTScsIHUn6pqPJyksCiAgICAoMHhBNjhGLCAnVicpLAogICAgKDB4QTY5MCwgJ00nLCB1J+qakScpLAogICAgKDB4QTY5MSwgJ1YnKSwKICAgICgweEE2OTIsICdNJywgdSfqmpMnKSwKICAgICgweEE2OTMsICdWJyksCiAgICAoMHhBNjk0LCAnTScsIHUn6pqVJyksCiAgICAoMHhBNjk1LCAnVicpLAogICAgKDB4QTY5NiwgJ00nLCB1J+qalycpLAogICAgKDB4QTY5NywgJ1YnKSwKICAgICgweEE2OTgsICdYJyksCiAgICAoMHhBNjlGLCAnVicpLAogICAgKDB4QTZGOCwgJ1gnKSwKICAgICgweEE3MDAsICdWJyksCiAgICAoMHhBNzIyLCAnTScsIHUn6pyjJyksCiAgICAoMHhBNzIzLCAnVicpLAogICAgKDB4QTcyNCwgJ00nLCB1J+qcpScpLAogICAgKDB4QTcyNSwgJ1YnKSwKICAgICgweEE3MjYsICdNJywgdSfqnKcnKSwKICAgICgweEE3MjcsICdWJyksCiAgICAoMHhBNzI4LCAnTScsIHUn6pypJyksCiAgICAoMHhBNzI5LCAnVicpLAogICAgKDB4QTcyQSwgJ00nLCB1J+qcqycpLAogICAgKDB4QTcyQiwgJ1YnKSwKICAgICgweEE3MkMsICdNJywgdSfqnK0nKSwKICAgICgweEE3MkQsICdWJyksCiAgICAoMHhBNzJFLCAnTScsIHUn6pyvJyksCiAgICAoMHhBNzJGLCAnVicpLAogICAgKDB4QTczMiwgJ00nLCB1J+qcsycpLAogICAgKDB4QTczMywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzM2KCk6CiAgICByZXR1cm4gWwogICAgKDB4QTczNCwgJ00nLCB1J+qctScpLAogICAgKDB4QTczNSwgJ1YnKSwKICAgICgweEE3MzYsICdNJywgdSfqnLcnKSwKICAgICgweEE3MzcsICdWJyksCiAgICAoMHhBNzM4LCAnTScsIHUn6py5JyksCiAgICAoMHhBNzM5LCAnVicpLAogICAgKDB4QTczQSwgJ00nLCB1J+qcuycpLAogICAgKDB4QTczQiwgJ1YnKSwKICAgICgweEE3M0MsICdNJywgdSfqnL0nKSwKICAgICgweEE3M0QsICdWJyksCiAgICAoMHhBNzNFLCAnTScsIHUn6py/JyksCiAgICAoMHhBNzNGLCAnVicpLAogICAgKDB4QTc0MCwgJ00nLCB1J+qdgScpLAogICAgKDB4QTc0MSwgJ1YnKSwKICAgICgweEE3NDIsICdNJywgdSfqnYMnKSwKICAgICgweEE3NDMsICdWJyksCiAgICAoMHhBNzQ0LCAnTScsIHUn6p2FJyksCiAgICAoMHhBNzQ1LCAnVicpLAogICAgKDB4QTc0NiwgJ00nLCB1J+qdhycpLAogICAgKDB4QTc0NywgJ1YnKSwKICAgICgweEE3NDgsICdNJywgdSfqnYknKSwKICAgICgweEE3NDksICdWJyksCiAgICAoMHhBNzRBLCAnTScsIHUn6p2LJyksCiAgICAoMHhBNzRCLCAnVicpLAogICAgKDB4QTc0QywgJ00nLCB1J+qdjScpLAogICAgKDB4QTc0RCwgJ1YnKSwKICAgICgweEE3NEUsICdNJywgdSfqnY8nKSwKICAgICgweEE3NEYsICdWJyksCiAgICAoMHhBNzUwLCAnTScsIHUn6p2RJyksCiAgICAoMHhBNzUxLCAnVicpLAogICAgKDB4QTc1MiwgJ00nLCB1J+qdkycpLAogICAgKDB4QTc1MywgJ1YnKSwKICAgICgweEE3NTQsICdNJywgdSfqnZUnKSwKICAgICgweEE3NTUsICdWJyksCiAgICAoMHhBNzU2LCAnTScsIHUn6p2XJyksCiAgICAoMHhBNzU3LCAnVicpLAogICAgKDB4QTc1OCwgJ00nLCB1J+qdmScpLAogICAgKDB4QTc1OSwgJ1YnKSwKICAgICgweEE3NUEsICdNJywgdSfqnZsnKSwKICAgICgweEE3NUIsICdWJyksCiAgICAoMHhBNzVDLCAnTScsIHUn6p2dJyksCiAgICAoMHhBNzVELCAnVicpLAogICAgKDB4QTc1RSwgJ00nLCB1J+qdnycpLAogICAgKDB4QTc1RiwgJ1YnKSwKICAgICgweEE3NjAsICdNJywgdSfqnaEnKSwKICAgICgweEE3NjEsICdWJyksCiAgICAoMHhBNzYyLCAnTScsIHUn6p2jJyksCiAgICAoMHhBNzYzLCAnVicpLAogICAgKDB4QTc2NCwgJ00nLCB1J+qdpScpLAogICAgKDB4QTc2NSwgJ1YnKSwKICAgICgweEE3NjYsICdNJywgdSfqnacnKSwKICAgICgweEE3NjcsICdWJyksCiAgICAoMHhBNzY4LCAnTScsIHUn6p2pJyksCiAgICAoMHhBNzY5LCAnVicpLAogICAgKDB4QTc2QSwgJ00nLCB1J+qdqycpLAogICAgKDB4QTc2QiwgJ1YnKSwKICAgICgweEE3NkMsICdNJywgdSfqna0nKSwKICAgICgweEE3NkQsICdWJyksCiAgICAoMHhBNzZFLCAnTScsIHUn6p2vJyksCiAgICAoMHhBNzZGLCAnVicpLAogICAgKDB4QTc3MCwgJ00nLCB1J+qdrycpLAogICAgKDB4QTc3MSwgJ1YnKSwKICAgICgweEE3NzksICdNJywgdSfqnbonKSwKICAgICgweEE3N0EsICdWJyksCiAgICAoMHhBNzdCLCAnTScsIHUn6p28JyksCiAgICAoMHhBNzdDLCAnVicpLAogICAgKDB4QTc3RCwgJ00nLCB1J+G1uScpLAogICAgKDB4QTc3RSwgJ00nLCB1J+qdvycpLAogICAgKDB4QTc3RiwgJ1YnKSwKICAgICgweEE3ODAsICdNJywgdSfqnoEnKSwKICAgICgweEE3ODEsICdWJyksCiAgICAoMHhBNzgyLCAnTScsIHUn6p6DJyksCiAgICAoMHhBNzgzLCAnVicpLAogICAgKDB4QTc4NCwgJ00nLCB1J+qehScpLAogICAgKDB4QTc4NSwgJ1YnKSwKICAgICgweEE3ODYsICdNJywgdSfqnocnKSwKICAgICgweEE3ODcsICdWJyksCiAgICAoMHhBNzhCLCAnTScsIHUn6p6MJyksCiAgICAoMHhBNzhDLCAnVicpLAogICAgKDB4QTc4RCwgJ00nLCB1J8mlJyksCiAgICAoMHhBNzhFLCAnVicpLAogICAgKDB4QTc4RiwgJ1gnKSwKICAgICgweEE3OTAsICdNJywgdSfqnpEnKSwKICAgICgweEE3OTEsICdWJyksCiAgICAoMHhBNzkyLCAnTScsIHUn6p6TJyksCiAgICAoMHhBNzkzLCAnVicpLAogICAgKDB4QTc5NCwgJ1gnKSwKICAgICgweEE3QTAsICdNJywgdSfqnqEnKSwKICAgICgweEE3QTEsICdWJyksCiAgICAoMHhBN0EyLCAnTScsIHUn6p6jJyksCiAgICAoMHhBN0EzLCAnVicpLAogICAgKDB4QTdBNCwgJ00nLCB1J+qepScpLAogICAgKDB4QTdBNSwgJ1YnKSwKICAgICgweEE3QTYsICdNJywgdSfqnqcnKSwKICAgICgweEE3QTcsICdWJyksCiAgICAoMHhBN0E4LCAnTScsIHUn6p6pJyksCiAgICAoMHhBN0E5LCAnVicpLAogICAgKDB4QTdBQSwgJ00nLCB1J8mmJyksCiAgICAoMHhBN0FCLCAnWCcpLAogICAgKDB4QTdGOCwgJ00nLCB1J8SnJyksCiAgICBdCgpkZWYgX3NlZ18zNygpOgogICAgcmV0dXJuIFsKICAgICgweEE3RjksICdNJywgdSfFkycpLAogICAgKDB4QTdGQSwgJ1YnKSwKICAgICgweEE4MkMsICdYJyksCiAgICAoMHhBODMwLCAnVicpLAogICAgKDB4QTgzQSwgJ1gnKSwKICAgICgweEE4NDAsICdWJyksCiAgICAoMHhBODc4LCAnWCcpLAogICAgKDB4QTg4MCwgJ1YnKSwKICAgICgweEE4QzUsICdYJyksCiAgICAoMHhBOENFLCAnVicpLAogICAgKDB4QThEQSwgJ1gnKSwKICAgICgweEE4RTAsICdWJyksCiAgICAoMHhBOEZDLCAnWCcpLAogICAgKDB4QTkwMCwgJ1YnKSwKICAgICgweEE5NTQsICdYJyksCiAgICAoMHhBOTVGLCAnVicpLAogICAgKDB4QTk3RCwgJ1gnKSwKICAgICgweEE5ODAsICdWJyksCiAgICAoMHhBOUNFLCAnWCcpLAogICAgKDB4QTlDRiwgJ1YnKSwKICAgICgweEE5REEsICdYJyksCiAgICAoMHhBOURFLCAnVicpLAogICAgKDB4QTlFMCwgJ1gnKSwKICAgICgweEFBMDAsICdWJyksCiAgICAoMHhBQTM3LCAnWCcpLAogICAgKDB4QUE0MCwgJ1YnKSwKICAgICgweEFBNEUsICdYJyksCiAgICAoMHhBQTUwLCAnVicpLAogICAgKDB4QUE1QSwgJ1gnKSwKICAgICgweEFBNUMsICdWJyksCiAgICAoMHhBQTdDLCAnWCcpLAogICAgKDB4QUE4MCwgJ1YnKSwKICAgICgweEFBQzMsICdYJyksCiAgICAoMHhBQURCLCAnVicpLAogICAgKDB4QUFGNywgJ1gnKSwKICAgICgweEFCMDEsICdWJyksCiAgICAoMHhBQjA3LCAnWCcpLAogICAgKDB4QUIwOSwgJ1YnKSwKICAgICgweEFCMEYsICdYJyksCiAgICAoMHhBQjExLCAnVicpLAogICAgKDB4QUIxNywgJ1gnKSwKICAgICgweEFCMjAsICdWJyksCiAgICAoMHhBQjI3LCAnWCcpLAogICAgKDB4QUIyOCwgJ1YnKSwKICAgICgweEFCMkYsICdYJyksCiAgICAoMHhBQkMwLCAnVicpLAogICAgKDB4QUJFRSwgJ1gnKSwKICAgICgweEFCRjAsICdWJyksCiAgICAoMHhBQkZBLCAnWCcpLAogICAgKDB4QUMwMCwgJ1YnKSwKICAgICgweEQ3QTQsICdYJyksCiAgICAoMHhEN0IwLCAnVicpLAogICAgKDB4RDdDNywgJ1gnKSwKICAgICgweEQ3Q0IsICdWJyksCiAgICAoMHhEN0ZDLCAnWCcpLAogICAgKDB4RjkwMCwgJ00nLCB1J+ixiCcpLAogICAgKDB4RjkwMSwgJ00nLCB1J+abtCcpLAogICAgKDB4RjkwMiwgJ00nLCB1J+i7iicpLAogICAgKDB4RjkwMywgJ00nLCB1J+iziCcpLAogICAgKDB4RjkwNCwgJ00nLCB1J+a7kScpLAogICAgKDB4RjkwNSwgJ00nLCB1J+S4sicpLAogICAgKDB4RjkwNiwgJ00nLCB1J+WPpScpLAogICAgKDB4RjkwNywgJ00nLCB1J+m+nCcpLAogICAgKDB4RjkwOSwgJ00nLCB1J+WlkScpLAogICAgKDB4RjkwQSwgJ00nLCB1J+mHkScpLAogICAgKDB4RjkwQiwgJ00nLCB1J+WWhycpLAogICAgKDB4RjkwQywgJ00nLCB1J+WliCcpLAogICAgKDB4RjkwRCwgJ00nLCB1J+aHticpLAogICAgKDB4RjkwRSwgJ00nLCB1J+eZqScpLAogICAgKDB4RjkwRiwgJ00nLCB1J+e+hScpLAogICAgKDB4RjkxMCwgJ00nLCB1J+iYvycpLAogICAgKDB4RjkxMSwgJ00nLCB1J+ieuicpLAogICAgKDB4RjkxMiwgJ00nLCB1J+ijuCcpLAogICAgKDB4RjkxMywgJ00nLCB1J+mCjycpLAogICAgKDB4RjkxNCwgJ00nLCB1J+aogicpLAogICAgKDB4RjkxNSwgJ00nLCB1J+a0mycpLAogICAgKDB4RjkxNiwgJ00nLCB1J+eDmScpLAogICAgKDB4RjkxNywgJ00nLCB1J+ePnicpLAogICAgKDB4RjkxOCwgJ00nLCB1J+iQvScpLAogICAgKDB4RjkxOSwgJ00nLCB1J+mFqicpLAogICAgKDB4RjkxQSwgJ00nLCB1J+mnsScpLAogICAgKDB4RjkxQiwgJ00nLCB1J+S6gicpLAogICAgKDB4RjkxQywgJ00nLCB1J+WNtScpLAogICAgKDB4RjkxRCwgJ00nLCB1J+ashCcpLAogICAgKDB4RjkxRSwgJ00nLCB1J+eImycpLAogICAgKDB4RjkxRiwgJ00nLCB1J+iYrScpLAogICAgKDB4RjkyMCwgJ00nLCB1J+m4nicpLAogICAgKDB4RjkyMSwgJ00nLCB1J+W1kCcpLAogICAgKDB4RjkyMiwgJ00nLCB1J+a/qycpLAogICAgKDB4RjkyMywgJ00nLCB1J+iXjScpLAogICAgKDB4RjkyNCwgJ00nLCB1J+ilpCcpLAogICAgKDB4RjkyNSwgJ00nLCB1J+aLiScpLAogICAgKDB4RjkyNiwgJ00nLCB1J+iHmCcpLAogICAgKDB4RjkyNywgJ00nLCB1J+ignycpLAogICAgKDB4RjkyOCwgJ00nLCB1J+W7iicpLAogICAgKDB4RjkyOSwgJ00nLCB1J+aclycpLAogICAgKDB4RjkyQSwgJ00nLCB1J+a1qicpLAogICAgKDB4RjkyQiwgJ00nLCB1J+eLvCcpLAogICAgKDB4RjkyQywgJ00nLCB1J+mDjicpLAogICAgKDB4RjkyRCwgJ00nLCB1J+S+hicpLAogICAgXQoKZGVmIF9zZWdfMzgoKToKICAgIHJldHVybiBbCiAgICAoMHhGOTJFLCAnTScsIHUn5Ya3JyksCiAgICAoMHhGOTJGLCAnTScsIHUn5YueJyksCiAgICAoMHhGOTMwLCAnTScsIHUn5pOEJyksCiAgICAoMHhGOTMxLCAnTScsIHUn5quTJyksCiAgICAoMHhGOTMyLCAnTScsIHUn54iQJyksCiAgICAoMHhGOTMzLCAnTScsIHUn55unJyksCiAgICAoMHhGOTM0LCAnTScsIHUn6ICBJyksCiAgICAoMHhGOTM1LCAnTScsIHUn6JiGJyksCiAgICAoMHhGOTM2LCAnTScsIHUn6JmcJyksCiAgICAoMHhGOTM3LCAnTScsIHUn6LevJyksCiAgICAoMHhGOTM4LCAnTScsIHUn6ZyyJyksCiAgICAoMHhGOTM5LCAnTScsIHUn6a2vJyksCiAgICAoMHhGOTNBLCAnTScsIHUn6be6JyksCiAgICAoMHhGOTNCLCAnTScsIHUn56KMJyksCiAgICAoMHhGOTNDLCAnTScsIHUn56W/JyksCiAgICAoMHhGOTNELCAnTScsIHUn57agJyksCiAgICAoMHhGOTNFLCAnTScsIHUn6I+JJyksCiAgICAoMHhGOTNGLCAnTScsIHUn6YyEJyksCiAgICAoMHhGOTQwLCAnTScsIHUn6bm/JyksCiAgICAoMHhGOTQxLCAnTScsIHUn6KuWJyksCiAgICAoMHhGOTQyLCAnTScsIHUn5aOfJyksCiAgICAoMHhGOTQzLCAnTScsIHUn5byEJyksCiAgICAoMHhGOTQ0LCAnTScsIHUn57GgJyksCiAgICAoMHhGOTQ1LCAnTScsIHUn6IG+JyksCiAgICAoMHhGOTQ2LCAnTScsIHUn54miJyksCiAgICAoMHhGOTQ3LCAnTScsIHUn56OKJyksCiAgICAoMHhGOTQ4LCAnTScsIHUn6LOCJyksCiAgICAoMHhGOTQ5LCAnTScsIHUn6Zu3JyksCiAgICAoMHhGOTRBLCAnTScsIHUn5aOYJyksCiAgICAoMHhGOTRCLCAnTScsIHUn5bGiJyksCiAgICAoMHhGOTRDLCAnTScsIHUn5qiTJyksCiAgICAoMHhGOTRELCAnTScsIHUn5reaJyksCiAgICAoMHhGOTRFLCAnTScsIHUn5ryPJyksCiAgICAoMHhGOTRGLCAnTScsIHUn57SvJyksCiAgICAoMHhGOTUwLCAnTScsIHUn57i3JyksCiAgICAoMHhGOTUxLCAnTScsIHUn6ZmLJyksCiAgICAoMHhGOTUyLCAnTScsIHUn5YuSJyksCiAgICAoMHhGOTUzLCAnTScsIHUn6IKLJyksCiAgICAoMHhGOTU0LCAnTScsIHUn5YecJyksCiAgICAoMHhGOTU1LCAnTScsIHUn5YeMJyksCiAgICAoMHhGOTU2LCAnTScsIHUn56icJyksCiAgICAoMHhGOTU3LCAnTScsIHUn57a+JyksCiAgICAoMHhGOTU4LCAnTScsIHUn6I+xJyksCiAgICAoMHhGOTU5LCAnTScsIHUn6Zm1JyksCiAgICAoMHhGOTVBLCAnTScsIHUn6K6AJyksCiAgICAoMHhGOTVCLCAnTScsIHUn5ouPJyksCiAgICAoMHhGOTVDLCAnTScsIHUn5qiCJyksCiAgICAoMHhGOTVELCAnTScsIHUn6Ku+JyksCiAgICAoMHhGOTVFLCAnTScsIHUn5Li5JyksCiAgICAoMHhGOTVGLCAnTScsIHUn5a+nJyksCiAgICAoMHhGOTYwLCAnTScsIHUn5oCSJyksCiAgICAoMHhGOTYxLCAnTScsIHUn546HJyksCiAgICAoMHhGOTYyLCAnTScsIHUn55WwJyksCiAgICAoMHhGOTYzLCAnTScsIHUn5YyXJyksCiAgICAoMHhGOTY0LCAnTScsIHUn56O7JyksCiAgICAoMHhGOTY1LCAnTScsIHUn5L6/JyksCiAgICAoMHhGOTY2LCAnTScsIHUn5b6pJyksCiAgICAoMHhGOTY3LCAnTScsIHUn5LiNJyksCiAgICAoMHhGOTY4LCAnTScsIHUn5rOMJyksCiAgICAoMHhGOTY5LCAnTScsIHUn5pW4JyksCiAgICAoMHhGOTZBLCAnTScsIHUn57SiJyksCiAgICAoMHhGOTZCLCAnTScsIHUn5Y+DJyksCiAgICAoMHhGOTZDLCAnTScsIHUn5aGeJyksCiAgICAoMHhGOTZELCAnTScsIHUn55yBJyksCiAgICAoMHhGOTZFLCAnTScsIHUn6JGJJyksCiAgICAoMHhGOTZGLCAnTScsIHUn6KqqJyksCiAgICAoMHhGOTcwLCAnTScsIHUn5q66JyksCiAgICAoMHhGOTcxLCAnTScsIHUn6L6wJyksCiAgICAoMHhGOTcyLCAnTScsIHUn5rKIJyksCiAgICAoMHhGOTczLCAnTScsIHUn5ou+JyksCiAgICAoMHhGOTc0LCAnTScsIHUn6IulJyksCiAgICAoMHhGOTc1LCAnTScsIHUn5o6gJyksCiAgICAoMHhGOTc2LCAnTScsIHUn55WlJyksCiAgICAoMHhGOTc3LCAnTScsIHUn5LquJyksCiAgICAoMHhGOTc4LCAnTScsIHUn5YWpJyksCiAgICAoMHhGOTc5LCAnTScsIHUn5YeJJyksCiAgICAoMHhGOTdBLCAnTScsIHUn5qKBJyksCiAgICAoMHhGOTdCLCAnTScsIHUn57OnJyksCiAgICAoMHhGOTdDLCAnTScsIHUn6ImvJyksCiAgICAoMHhGOTdELCAnTScsIHUn6KuSJyksCiAgICAoMHhGOTdFLCAnTScsIHUn6YePJyksCiAgICAoMHhGOTdGLCAnTScsIHUn5Yu1JyksCiAgICAoMHhGOTgwLCAnTScsIHUn5ZGCJyksCiAgICAoMHhGOTgxLCAnTScsIHUn5aWzJyksCiAgICAoMHhGOTgyLCAnTScsIHUn5busJyksCiAgICAoMHhGOTgzLCAnTScsIHUn5peFJyksCiAgICAoMHhGOTg0LCAnTScsIHUn5r++JyksCiAgICAoMHhGOTg1LCAnTScsIHUn56SqJyksCiAgICAoMHhGOTg2LCAnTScsIHUn6ZatJyksCiAgICAoMHhGOTg3LCAnTScsIHUn6amqJyksCiAgICAoMHhGOTg4LCAnTScsIHUn6bqXJyksCiAgICAoMHhGOTg5LCAnTScsIHUn6buOJyksCiAgICAoMHhGOThBLCAnTScsIHUn5YqbJyksCiAgICAoMHhGOThCLCAnTScsIHUn5puGJyksCiAgICAoMHhGOThDLCAnTScsIHUn5q23JyksCiAgICAoMHhGOThELCAnTScsIHUn6L2iJyksCiAgICAoMHhGOThFLCAnTScsIHUn5bm0JyksCiAgICAoMHhGOThGLCAnTScsIHUn5oaQJyksCiAgICAoMHhGOTkwLCAnTScsIHUn5oiAJyksCiAgICAoMHhGOTkxLCAnTScsIHUn5pKaJyksCiAgICBdCgpkZWYgX3NlZ18zOSgpOgogICAgcmV0dXJuIFsKICAgICgweEY5OTIsICdNJywgdSfmvKMnKSwKICAgICgweEY5OTMsICdNJywgdSfnhYknKSwKICAgICgweEY5OTQsICdNJywgdSfnkoknKSwKICAgICgweEY5OTUsICdNJywgdSfnp4onKSwKICAgICgweEY5OTYsICdNJywgdSfnt7QnKSwKICAgICgweEY5OTcsICdNJywgdSfoga8nKSwKICAgICgweEY5OTgsICdNJywgdSfovKYnKSwKICAgICgweEY5OTksICdNJywgdSfok64nKSwKICAgICgweEY5OUEsICdNJywgdSfpgKMnKSwKICAgICgweEY5OUIsICdNJywgdSfpjYonKSwKICAgICgweEY5OUMsICdNJywgdSfliJcnKSwKICAgICgweEY5OUQsICdNJywgdSfliqMnKSwKICAgICgweEY5OUUsICdNJywgdSflkr0nKSwKICAgICgweEY5OUYsICdNJywgdSfng4gnKSwKICAgICgweEY5QTAsICdNJywgdSfoo4InKSwKICAgICgweEY5QTEsICdNJywgdSfoqqonKSwKICAgICgweEY5QTIsICdNJywgdSflu4knKSwKICAgICgweEY5QTMsICdNJywgdSflv7UnKSwKICAgICgweEY5QTQsICdNJywgdSfmjbsnKSwKICAgICgweEY5QTUsICdNJywgdSfmrq4nKSwKICAgICgweEY5QTYsICdNJywgdSfnsL4nKSwKICAgICgweEY5QTcsICdNJywgdSfnjbUnKSwKICAgICgweEY5QTgsICdNJywgdSfku6QnKSwKICAgICgweEY5QTksICdNJywgdSflm7knKSwKICAgICgweEY5QUEsICdNJywgdSflr6cnKSwKICAgICgweEY5QUIsICdNJywgdSfltronKSwKICAgICgweEY5QUMsICdNJywgdSfmgJwnKSwKICAgICgweEY5QUQsICdNJywgdSfnjrInKSwKICAgICgweEY5QUUsICdNJywgdSfnkaknKSwKICAgICgweEY5QUYsICdNJywgdSfnvponKSwKICAgICgweEY5QjAsICdNJywgdSfogYYnKSwKICAgICgweEY5QjEsICdNJywgdSfpiLQnKSwKICAgICgweEY5QjIsICdNJywgdSfpm7YnKSwKICAgICgweEY5QjMsICdNJywgdSfpnYgnKSwKICAgICgweEY5QjQsICdNJywgdSfpoJgnKSwKICAgICgweEY5QjUsICdNJywgdSfkvosnKSwKICAgICgweEY5QjYsICdNJywgdSfnpq4nKSwKICAgICgweEY5QjcsICdNJywgdSfphrQnKSwKICAgICgweEY5QjgsICdNJywgdSfpmrgnKSwKICAgICgweEY5QjksICdNJywgdSfmg6EnKSwKICAgICgweEY5QkEsICdNJywgdSfkuoYnKSwKICAgICgweEY5QkIsICdNJywgdSflg5onKSwKICAgICgweEY5QkMsICdNJywgdSflr64nKSwKICAgICgweEY5QkQsICdNJywgdSflsL8nKSwKICAgICgweEY5QkUsICdNJywgdSfmlpknKSwKICAgICgweEY5QkYsICdNJywgdSfmqIInKSwKICAgICgweEY5QzAsICdNJywgdSfnh44nKSwKICAgICgweEY5QzEsICdNJywgdSfnmYInKSwKICAgICgweEY5QzIsICdNJywgdSfok7wnKSwKICAgICgweEY5QzMsICdNJywgdSfpgbwnKSwKICAgICgweEY5QzQsICdNJywgdSfpvo0nKSwKICAgICgweEY5QzUsICdNJywgdSfmmognKSwKICAgICgweEY5QzYsICdNJywgdSfpmK4nKSwKICAgICgweEY5QzcsICdNJywgdSflioknKSwKICAgICgweEY5QzgsICdNJywgdSfmnbsnKSwKICAgICgweEY5QzksICdNJywgdSfmn7MnKSwKICAgICgweEY5Q0EsICdNJywgdSfmtYEnKSwKICAgICgweEY5Q0IsICdNJywgdSfmupwnKSwKICAgICgweEY5Q0MsICdNJywgdSfnkIknKSwKICAgICgweEY5Q0QsICdNJywgdSfnlZknKSwKICAgICgweEY5Q0UsICdNJywgdSfnoasnKSwKICAgICgweEY5Q0YsICdNJywgdSfntJAnKSwKICAgICgweEY5RDAsICdNJywgdSfpoZ4nKSwKICAgICgweEY5RDEsICdNJywgdSflha0nKSwKICAgICgweEY5RDIsICdNJywgdSfmiK4nKSwKICAgICgweEY5RDMsICdNJywgdSfpmbgnKSwKICAgICgweEY5RDQsICdNJywgdSflgKsnKSwKICAgICgweEY5RDUsICdNJywgdSfltJknKSwKICAgICgweEY5RDYsICdNJywgdSfmt6onKSwKICAgICgweEY5RDcsICdNJywgdSfovKonKSwKICAgICgweEY5RDgsICdNJywgdSflvosnKSwKICAgICgweEY5RDksICdNJywgdSfmhYQnKSwKICAgICgweEY5REEsICdNJywgdSfmoJcnKSwKICAgICgweEY5REIsICdNJywgdSfnjocnKSwKICAgICgweEY5REMsICdNJywgdSfpmoYnKSwKICAgICgweEY5REQsICdNJywgdSfliKknKSwKICAgICgweEY5REUsICdNJywgdSflkI8nKSwKICAgICgweEY5REYsICdNJywgdSflsaUnKSwKICAgICgweEY5RTAsICdNJywgdSfmmJMnKSwKICAgICgweEY5RTEsICdNJywgdSfmnY4nKSwKICAgICgweEY5RTIsICdNJywgdSfmoqgnKSwKICAgICgweEY5RTMsICdNJywgdSfms6UnKSwKICAgICgweEY5RTQsICdNJywgdSfnkIYnKSwKICAgICgweEY5RTUsICdNJywgdSfnl6InKSwKICAgICgweEY5RTYsICdNJywgdSfnvbknKSwKICAgICgweEY5RTcsICdNJywgdSfoo48nKSwKICAgICgweEY5RTgsICdNJywgdSfoo6EnKSwKICAgICgweEY5RTksICdNJywgdSfph4wnKSwKICAgICgweEY5RUEsICdNJywgdSfpm6InKSwKICAgICgweEY5RUIsICdNJywgdSfljL8nKSwKICAgICgweEY5RUMsICdNJywgdSfmuronKSwKICAgICgweEY5RUQsICdNJywgdSflkJ0nKSwKICAgICgweEY5RUUsICdNJywgdSfnh5AnKSwKICAgICgweEY5RUYsICdNJywgdSfnkpgnKSwKICAgICgweEY5RjAsICdNJywgdSfol7onKSwKICAgICgweEY5RjEsICdNJywgdSfpmqMnKSwKICAgICgweEY5RjIsICdNJywgdSfpsZcnKSwKICAgICgweEY5RjMsICdNJywgdSfpup8nKSwKICAgICgweEY5RjQsICdNJywgdSfmnpcnKSwKICAgICgweEY5RjUsICdNJywgdSfmt4snKSwKICAgIF0KCmRlZiBfc2VnXzQwKCk6CiAgICByZXR1cm4gWwogICAgKDB4RjlGNiwgJ00nLCB1J+iHqCcpLAogICAgKDB4RjlGNywgJ00nLCB1J+eriycpLAogICAgKDB4RjlGOCwgJ00nLCB1J+esoCcpLAogICAgKDB4RjlGOSwgJ00nLCB1J+eykicpLAogICAgKDB4RjlGQSwgJ00nLCB1J+eLgCcpLAogICAgKDB4RjlGQiwgJ00nLCB1J+eCmScpLAogICAgKDB4RjlGQywgJ00nLCB1J+itmCcpLAogICAgKDB4RjlGRCwgJ00nLCB1J+S7gCcpLAogICAgKDB4RjlGRSwgJ00nLCB1J+iMticpLAogICAgKDB4RjlGRiwgJ00nLCB1J+WIuicpLAogICAgKDB4RkEwMCwgJ00nLCB1J+WIhycpLAogICAgKDB4RkEwMSwgJ00nLCB1J+W6picpLAogICAgKDB4RkEwMiwgJ00nLCB1J+aLkycpLAogICAgKDB4RkEwMywgJ00nLCB1J+ezlicpLAogICAgKDB4RkEwNCwgJ00nLCB1J+WuhScpLAogICAgKDB4RkEwNSwgJ00nLCB1J+a0nicpLAogICAgKDB4RkEwNiwgJ00nLCB1J+aatCcpLAogICAgKDB4RkEwNywgJ00nLCB1J+i8uycpLAogICAgKDB4RkEwOCwgJ00nLCB1J+ihjCcpLAogICAgKDB4RkEwOSwgJ00nLCB1J+mZjScpLAogICAgKDB4RkEwQSwgJ00nLCB1J+imiycpLAogICAgKDB4RkEwQiwgJ00nLCB1J+W7kycpLAogICAgKDB4RkEwQywgJ00nLCB1J+WFgCcpLAogICAgKDB4RkEwRCwgJ00nLCB1J+WXgCcpLAogICAgKDB4RkEwRSwgJ1YnKSwKICAgICgweEZBMTAsICdNJywgdSfloZonKSwKICAgICgweEZBMTEsICdWJyksCiAgICAoMHhGQTEyLCAnTScsIHUn5pm0JyksCiAgICAoMHhGQTEzLCAnVicpLAogICAgKDB4RkExNSwgJ00nLCB1J+WHnicpLAogICAgKDB4RkExNiwgJ00nLCB1J+eMqicpLAogICAgKDB4RkExNywgJ00nLCB1J+ebiicpLAogICAgKDB4RkExOCwgJ00nLCB1J+ekvCcpLAogICAgKDB4RkExOSwgJ00nLCB1J+elnicpLAogICAgKDB4RkExQSwgJ00nLCB1J+elpScpLAogICAgKDB4RkExQiwgJ00nLCB1J+emjycpLAogICAgKDB4RkExQywgJ00nLCB1J+mdlicpLAogICAgKDB4RkExRCwgJ00nLCB1J+eyvicpLAogICAgKDB4RkExRSwgJ00nLCB1J+e+vScpLAogICAgKDB4RkExRiwgJ1YnKSwKICAgICgweEZBMjAsICdNJywgdSfomJInKSwKICAgICgweEZBMjEsICdWJyksCiAgICAoMHhGQTIyLCAnTScsIHUn6Ku4JyksCiAgICAoMHhGQTIzLCAnVicpLAogICAgKDB4RkEyNSwgJ00nLCB1J+mAuCcpLAogICAgKDB4RkEyNiwgJ00nLCB1J+mDvScpLAogICAgKDB4RkEyNywgJ1YnKSwKICAgICgweEZBMkEsICdNJywgdSfpo68nKSwKICAgICgweEZBMkIsICdNJywgdSfpo7wnKSwKICAgICgweEZBMkMsICdNJywgdSfppKgnKSwKICAgICgweEZBMkQsICdNJywgdSfptrQnKSwKICAgICgweEZBMkUsICdNJywgdSfpg54nKSwKICAgICgweEZBMkYsICdNJywgdSfpmrcnKSwKICAgICgweEZBMzAsICdNJywgdSfkvq4nKSwKICAgICgweEZBMzEsICdNJywgdSflg6cnKSwKICAgICgweEZBMzIsICdNJywgdSflhY0nKSwKICAgICgweEZBMzMsICdNJywgdSfli4knKSwKICAgICgweEZBMzQsICdNJywgdSfli6QnKSwKICAgICgweEZBMzUsICdNJywgdSfljZEnKSwKICAgICgweEZBMzYsICdNJywgdSfllp0nKSwKICAgICgweEZBMzcsICdNJywgdSflmIYnKSwKICAgICgweEZBMzgsICdNJywgdSflmagnKSwKICAgICgweEZBMzksICdNJywgdSfloYAnKSwKICAgICgweEZBM0EsICdNJywgdSfloqgnKSwKICAgICgweEZBM0IsICdNJywgdSflsaQnKSwKICAgICgweEZBM0MsICdNJywgdSflsa4nKSwKICAgICgweEZBM0QsICdNJywgdSfmgpQnKSwKICAgICgweEZBM0UsICdNJywgdSfmhagnKSwKICAgICgweEZBM0YsICdNJywgdSfmho4nKSwKICAgICgweEZBNDAsICdNJywgdSfmh7InKSwKICAgICgweEZBNDEsICdNJywgdSfmlY8nKSwKICAgICgweEZBNDIsICdNJywgdSfml6InKSwKICAgICgweEZBNDMsICdNJywgdSfmmpEnKSwKICAgICgweEZBNDQsICdNJywgdSfmooUnKSwKICAgICgweEZBNDUsICdNJywgdSfmtbcnKSwKICAgICgweEZBNDYsICdNJywgdSfmuJonKSwKICAgICgweEZBNDcsICdNJywgdSfmvKInKSwKICAgICgweEZBNDgsICdNJywgdSfnha4nKSwKICAgICgweEZBNDksICdNJywgdSfniKsnKSwKICAgICgweEZBNEEsICdNJywgdSfnkKInKSwKICAgICgweEZBNEIsICdNJywgdSfnopEnKSwKICAgICgweEZBNEMsICdNJywgdSfnpL4nKSwKICAgICgweEZBNEQsICdNJywgdSfnpYknKSwKICAgICgweEZBNEUsICdNJywgdSfnpYgnKSwKICAgICgweEZBNEYsICdNJywgdSfnpZAnKSwKICAgICgweEZBNTAsICdNJywgdSfnpZYnKSwKICAgICgweEZBNTEsICdNJywgdSfnpZ0nKSwKICAgICgweEZBNTIsICdNJywgdSfnpo0nKSwKICAgICgweEZBNTMsICdNJywgdSfnpo4nKSwKICAgICgweEZBNTQsICdNJywgdSfnqYAnKSwKICAgICgweEZBNTUsICdNJywgdSfnqoEnKSwKICAgICgweEZBNTYsICdNJywgdSfnr4AnKSwKICAgICgweEZBNTcsICdNJywgdSfnt7QnKSwKICAgICgweEZBNTgsICdNJywgdSfnuIknKSwKICAgICgweEZBNTksICdNJywgdSfnuYEnKSwKICAgICgweEZBNUEsICdNJywgdSfnvbInKSwKICAgICgweEZBNUIsICdNJywgdSfogIUnKSwKICAgICgweEZBNUMsICdNJywgdSfoh60nKSwKICAgICgweEZBNUQsICdNJywgdSfoibknKSwKICAgICgweEZBNUYsICdNJywgdSfokZcnKSwKICAgIF0KCmRlZiBfc2VnXzQxKCk6CiAgICByZXR1cm4gWwogICAgKDB4RkE2MCwgJ00nLCB1J+ikkCcpLAogICAgKDB4RkE2MSwgJ00nLCB1J+imlicpLAogICAgKDB4RkE2MiwgJ00nLCB1J+isgScpLAogICAgKDB4RkE2MywgJ00nLCB1J+isuScpLAogICAgKDB4RkE2NCwgJ00nLCB1J+izkycpLAogICAgKDB4RkE2NSwgJ00nLCB1J+i0iCcpLAogICAgKDB4RkE2NiwgJ00nLCB1J+i+ticpLAogICAgKDB4RkE2NywgJ00nLCB1J+mAuCcpLAogICAgKDB4RkE2OCwgJ00nLCB1J+mboycpLAogICAgKDB4RkE2OSwgJ00nLCB1J+mfvycpLAogICAgKDB4RkE2QSwgJ00nLCB1J+mguycpLAogICAgKDB4RkE2QiwgJ00nLCB1J+aBtScpLAogICAgKDB4RkE2QywgJ00nLCB1J/Cki64nKSwKICAgICgweEZBNkQsICdNJywgdSfoiJgnKSwKICAgICgweEZBNkUsICdYJyksCiAgICAoMHhGQTcwLCAnTScsIHUn5LimJyksCiAgICAoMHhGQTcxLCAnTScsIHUn5Ya1JyksCiAgICAoMHhGQTcyLCAnTScsIHUn5YWoJyksCiAgICAoMHhGQTczLCAnTScsIHUn5L6AJyksCiAgICAoMHhGQTc0LCAnTScsIHUn5YWFJyksCiAgICAoMHhGQTc1LCAnTScsIHUn5YaAJyksCiAgICAoMHhGQTc2LCAnTScsIHUn5YuHJyksCiAgICAoMHhGQTc3LCAnTScsIHUn5Yu6JyksCiAgICAoMHhGQTc4LCAnTScsIHUn5ZadJyksCiAgICAoMHhGQTc5LCAnTScsIHUn5ZWVJyksCiAgICAoMHhGQTdBLCAnTScsIHUn5ZaZJyksCiAgICAoMHhGQTdCLCAnTScsIHUn5ZeiJyksCiAgICAoMHhGQTdDLCAnTScsIHUn5aGaJyksCiAgICAoMHhGQTdELCAnTScsIHUn5aKzJyksCiAgICAoMHhGQTdFLCAnTScsIHUn5aWEJyksCiAgICAoMHhGQTdGLCAnTScsIHUn5aWUJyksCiAgICAoMHhGQTgwLCAnTScsIHUn5amiJyksCiAgICAoMHhGQTgxLCAnTScsIHUn5ayoJyksCiAgICAoMHhGQTgyLCAnTScsIHUn5buSJyksCiAgICAoMHhGQTgzLCAnTScsIHUn5buZJyksCiAgICAoMHhGQTg0LCAnTScsIHUn5b2pJyksCiAgICAoMHhGQTg1LCAnTScsIHUn5b6tJyksCiAgICAoMHhGQTg2LCAnTScsIHUn5oOYJyksCiAgICAoMHhGQTg3LCAnTScsIHUn5oWOJyksCiAgICAoMHhGQTg4LCAnTScsIHUn5oSIJyksCiAgICAoMHhGQTg5LCAnTScsIHUn5oaOJyksCiAgICAoMHhGQThBLCAnTScsIHUn5oWgJyksCiAgICAoMHhGQThCLCAnTScsIHUn5oeyJyksCiAgICAoMHhGQThDLCAnTScsIHUn5oi0JyksCiAgICAoMHhGQThELCAnTScsIHUn5o+EJyksCiAgICAoMHhGQThFLCAnTScsIHUn5pCcJyksCiAgICAoMHhGQThGLCAnTScsIHUn5pGSJyksCiAgICAoMHhGQTkwLCAnTScsIHUn5pWWJyksCiAgICAoMHhGQTkxLCAnTScsIHUn5pm0JyksCiAgICAoMHhGQTkyLCAnTScsIHUn5pyXJyksCiAgICAoMHhGQTkzLCAnTScsIHUn5pybJyksCiAgICAoMHhGQTk0LCAnTScsIHUn5p2WJyksCiAgICAoMHhGQTk1LCAnTScsIHUn5q25JyksCiAgICAoMHhGQTk2LCAnTScsIHUn5q66JyksCiAgICAoMHhGQTk3LCAnTScsIHUn5rWBJyksCiAgICAoMHhGQTk4LCAnTScsIHUn5rubJyksCiAgICAoMHhGQTk5LCAnTScsIHUn5ruLJyksCiAgICAoMHhGQTlBLCAnTScsIHUn5ryiJyksCiAgICAoMHhGQTlCLCAnTScsIHUn54CeJyksCiAgICAoMHhGQTlDLCAnTScsIHUn54WuJyksCiAgICAoMHhGQTlELCAnTScsIHUn556nJyksCiAgICAoMHhGQTlFLCAnTScsIHUn54i1JyksCiAgICAoMHhGQTlGLCAnTScsIHUn54qvJyksCiAgICAoMHhGQUEwLCAnTScsIHUn54yqJyksCiAgICAoMHhGQUExLCAnTScsIHUn55GxJyksCiAgICAoMHhGQUEyLCAnTScsIHUn55SGJyksCiAgICAoMHhGQUEzLCAnTScsIHUn55S7JyksCiAgICAoMHhGQUE0LCAnTScsIHUn55idJyksCiAgICAoMHhGQUE1LCAnTScsIHUn55ifJyksCiAgICAoMHhGQUE2LCAnTScsIHUn55uKJyksCiAgICAoMHhGQUE3LCAnTScsIHUn55ubJyksCiAgICAoMHhGQUE4LCAnTScsIHUn55u0JyksCiAgICAoMHhGQUE5LCAnTScsIHUn552KJyksCiAgICAoMHhGQUFBLCAnTScsIHUn552AJyksCiAgICAoMHhGQUFCLCAnTScsIHUn56OMJyksCiAgICAoMHhGQUFDLCAnTScsIHUn56qxJyksCiAgICAoMHhGQUFELCAnTScsIHUn56+AJyksCiAgICAoMHhGQUFFLCAnTScsIHUn57G7JyksCiAgICAoMHhGQUFGLCAnTScsIHUn57WbJyksCiAgICAoMHhGQUIwLCAnTScsIHUn57e0JyksCiAgICAoMHhGQUIxLCAnTScsIHUn57y+JyksCiAgICAoMHhGQUIyLCAnTScsIHUn6ICFJyksCiAgICAoMHhGQUIzLCAnTScsIHUn6I2SJyksCiAgICAoMHhGQUI0LCAnTScsIHUn6I+vJyksCiAgICAoMHhGQUI1LCAnTScsIHUn6J25JyksCiAgICAoMHhGQUI2LCAnTScsIHUn6KWBJyksCiAgICAoMHhGQUI3LCAnTScsIHUn6KaGJyksCiAgICAoMHhGQUI4LCAnTScsIHUn6KaWJyksCiAgICAoMHhGQUI5LCAnTScsIHUn6Kq/JyksCiAgICAoMHhGQUJBLCAnTScsIHUn6Ku4JyksCiAgICAoMHhGQUJCLCAnTScsIHUn6KuLJyksCiAgICAoMHhGQUJDLCAnTScsIHUn6KyBJyksCiAgICAoMHhGQUJELCAnTScsIHUn6Ku+JyksCiAgICAoMHhGQUJFLCAnTScsIHUn6KutJyksCiAgICAoMHhGQUJGLCAnTScsIHUn6Ky5JyksCiAgICAoMHhGQUMwLCAnTScsIHUn6K6KJyksCiAgICAoMHhGQUMxLCAnTScsIHUn6LSIJyksCiAgICAoMHhGQUMyLCAnTScsIHUn6Ly4JyksCiAgICAoMHhGQUMzLCAnTScsIHUn6YGyJyksCiAgICAoMHhGQUM0LCAnTScsIHUn6YaZJyksCiAgICBdCgpkZWYgX3NlZ180MigpOgogICAgcmV0dXJuIFsKICAgICgweEZBQzUsICdNJywgdSfpibYnKSwKICAgICgweEZBQzYsICdNJywgdSfpmbwnKSwKICAgICgweEZBQzcsICdNJywgdSfpm6MnKSwKICAgICgweEZBQzgsICdNJywgdSfpnZYnKSwKICAgICgweEZBQzksICdNJywgdSfpn5snKSwKICAgICgweEZBQ0EsICdNJywgdSfpn78nKSwKICAgICgweEZBQ0IsICdNJywgdSfpoIsnKSwKICAgICgweEZBQ0MsICdNJywgdSfpoLsnKSwKICAgICgweEZBQ0QsICdNJywgdSfprJInKSwKICAgICgweEZBQ0UsICdNJywgdSfpvpwnKSwKICAgICgweEZBQ0YsICdNJywgdSfwoqGKJyksCiAgICAoMHhGQUQwLCAnTScsIHUn8KKhhCcpLAogICAgKDB4RkFEMSwgJ00nLCB1J/Cjj5UnKSwKICAgICgweEZBRDIsICdNJywgdSfjrp0nKSwKICAgICgweEZBRDMsICdNJywgdSfkgJgnKSwKICAgICgweEZBRDQsICdNJywgdSfkgLknKSwKICAgICgweEZBRDUsICdNJywgdSfwpYmJJyksCiAgICAoMHhGQUQ2LCAnTScsIHUn8KWzkCcpLAogICAgKDB4RkFENywgJ00nLCB1J/Cnu5MnKSwKICAgICgweEZBRDgsICdNJywgdSfpvYMnKSwKICAgICgweEZBRDksICdNJywgdSfpvo4nKSwKICAgICgweEZBREEsICdYJyksCiAgICAoMHhGQjAwLCAnTScsIHUnZmYnKSwKICAgICgweEZCMDEsICdNJywgdSdmaScpLAogICAgKDB4RkIwMiwgJ00nLCB1J2ZsJyksCiAgICAoMHhGQjAzLCAnTScsIHUnZmZpJyksCiAgICAoMHhGQjA0LCAnTScsIHUnZmZsJyksCiAgICAoMHhGQjA1LCAnTScsIHUnc3QnKSwKICAgICgweEZCMDcsICdYJyksCiAgICAoMHhGQjEzLCAnTScsIHUn1bTVticpLAogICAgKDB4RkIxNCwgJ00nLCB1J9W01aUnKSwKICAgICgweEZCMTUsICdNJywgdSfVtNWrJyksCiAgICAoMHhGQjE2LCAnTScsIHUn1b7VticpLAogICAgKDB4RkIxNywgJ00nLCB1J9W01a0nKSwKICAgICgweEZCMTgsICdYJyksCiAgICAoMHhGQjFELCAnTScsIHUn15nWtCcpLAogICAgKDB4RkIxRSwgJ1YnKSwKICAgICgweEZCMUYsICdNJywgdSfXsta3JyksCiAgICAoMHhGQjIwLCAnTScsIHUn16InKSwKICAgICgweEZCMjEsICdNJywgdSfXkCcpLAogICAgKDB4RkIyMiwgJ00nLCB1J9eTJyksCiAgICAoMHhGQjIzLCAnTScsIHUn15QnKSwKICAgICgweEZCMjQsICdNJywgdSfXmycpLAogICAgKDB4RkIyNSwgJ00nLCB1J9ecJyksCiAgICAoMHhGQjI2LCAnTScsIHUn150nKSwKICAgICgweEZCMjcsICdNJywgdSfXqCcpLAogICAgKDB4RkIyOCwgJ00nLCB1J9eqJyksCiAgICAoMHhGQjI5LCAnMycsIHUnKycpLAogICAgKDB4RkIyQSwgJ00nLCB1J9ep14EnKSwKICAgICgweEZCMkIsICdNJywgdSfXqdeCJyksCiAgICAoMHhGQjJDLCAnTScsIHUn16nWvNeBJyksCiAgICAoMHhGQjJELCAnTScsIHUn16nWvNeCJyksCiAgICAoMHhGQjJFLCAnTScsIHUn15DWtycpLAogICAgKDB4RkIyRiwgJ00nLCB1J9eQ1rgnKSwKICAgICgweEZCMzAsICdNJywgdSfXkNa8JyksCiAgICAoMHhGQjMxLCAnTScsIHUn15HWvCcpLAogICAgKDB4RkIzMiwgJ00nLCB1J9eS1rwnKSwKICAgICgweEZCMzMsICdNJywgdSfXk9a8JyksCiAgICAoMHhGQjM0LCAnTScsIHUn15TWvCcpLAogICAgKDB4RkIzNSwgJ00nLCB1J9eV1rwnKSwKICAgICgweEZCMzYsICdNJywgdSfXlta8JyksCiAgICAoMHhGQjM3LCAnWCcpLAogICAgKDB4RkIzOCwgJ00nLCB1J9eY1rwnKSwKICAgICgweEZCMzksICdNJywgdSfXmda8JyksCiAgICAoMHhGQjNBLCAnTScsIHUn15rWvCcpLAogICAgKDB4RkIzQiwgJ00nLCB1J9eb1rwnKSwKICAgICgweEZCM0MsICdNJywgdSfXnNa8JyksCiAgICAoMHhGQjNELCAnWCcpLAogICAgKDB4RkIzRSwgJ00nLCB1J9ee1rwnKSwKICAgICgweEZCM0YsICdYJyksCiAgICAoMHhGQjQwLCAnTScsIHUn16DWvCcpLAogICAgKDB4RkI0MSwgJ00nLCB1J9eh1rwnKSwKICAgICgweEZCNDIsICdYJyksCiAgICAoMHhGQjQzLCAnTScsIHUn16PWvCcpLAogICAgKDB4RkI0NCwgJ00nLCB1J9ek1rwnKSwKICAgICgweEZCNDUsICdYJyksCiAgICAoMHhGQjQ2LCAnTScsIHUn16bWvCcpLAogICAgKDB4RkI0NywgJ00nLCB1J9en1rwnKSwKICAgICgweEZCNDgsICdNJywgdSfXqNa8JyksCiAgICAoMHhGQjQ5LCAnTScsIHUn16nWvCcpLAogICAgKDB4RkI0QSwgJ00nLCB1J9eq1rwnKSwKICAgICgweEZCNEIsICdNJywgdSfXlda5JyksCiAgICAoMHhGQjRDLCAnTScsIHUn15HWvycpLAogICAgKDB4RkI0RCwgJ00nLCB1J9eb1r8nKSwKICAgICgweEZCNEUsICdNJywgdSfXpNa/JyksCiAgICAoMHhGQjRGLCAnTScsIHUn15DXnCcpLAogICAgKDB4RkI1MCwgJ00nLCB1J9mxJyksCiAgICAoMHhGQjUyLCAnTScsIHUn2bsnKSwKICAgICgweEZCNTYsICdNJywgdSfZvicpLAogICAgKDB4RkI1QSwgJ00nLCB1J9qAJyksCiAgICAoMHhGQjVFLCAnTScsIHUn2bonKSwKICAgICgweEZCNjIsICdNJywgdSfZvycpLAogICAgKDB4RkI2NiwgJ00nLCB1J9m5JyksCiAgICAoMHhGQjZBLCAnTScsIHUn2qQnKSwKICAgICgweEZCNkUsICdNJywgdSfapicpLAogICAgKDB4RkI3MiwgJ00nLCB1J9qEJyksCiAgICAoMHhGQjc2LCAnTScsIHUn2oMnKSwKICAgICgweEZCN0EsICdNJywgdSfahicpLAogICAgKDB4RkI3RSwgJ00nLCB1J9qHJyksCiAgICAoMHhGQjgyLCAnTScsIHUn2o0nKSwKICAgIF0KCmRlZiBfc2VnXzQzKCk6CiAgICByZXR1cm4gWwogICAgKDB4RkI4NCwgJ00nLCB1J9qMJyksCiAgICAoMHhGQjg2LCAnTScsIHUn2o4nKSwKICAgICgweEZCODgsICdNJywgdSfaiCcpLAogICAgKDB4RkI4QSwgJ00nLCB1J9qYJyksCiAgICAoMHhGQjhDLCAnTScsIHUn2pEnKSwKICAgICgweEZCOEUsICdNJywgdSfaqScpLAogICAgKDB4RkI5MiwgJ00nLCB1J9qvJyksCiAgICAoMHhGQjk2LCAnTScsIHUn2rMnKSwKICAgICgweEZCOUEsICdNJywgdSfasScpLAogICAgKDB4RkI5RSwgJ00nLCB1J9q6JyksCiAgICAoMHhGQkEwLCAnTScsIHUn2rsnKSwKICAgICgweEZCQTQsICdNJywgdSfbgCcpLAogICAgKDB4RkJBNiwgJ00nLCB1J9uBJyksCiAgICAoMHhGQkFBLCAnTScsIHUn2r4nKSwKICAgICgweEZCQUUsICdNJywgdSfbkicpLAogICAgKDB4RkJCMCwgJ00nLCB1J9uTJyksCiAgICAoMHhGQkIyLCAnVicpLAogICAgKDB4RkJDMiwgJ1gnKSwKICAgICgweEZCRDMsICdNJywgdSfarScpLAogICAgKDB4RkJENywgJ00nLCB1J9uHJyksCiAgICAoMHhGQkQ5LCAnTScsIHUn24YnKSwKICAgICgweEZCREIsICdNJywgdSfbiCcpLAogICAgKDB4RkJERCwgJ00nLCB1J9uH2bQnKSwKICAgICgweEZCREUsICdNJywgdSfbiycpLAogICAgKDB4RkJFMCwgJ00nLCB1J9uFJyksCiAgICAoMHhGQkUyLCAnTScsIHUn24knKSwKICAgICgweEZCRTQsICdNJywgdSfbkCcpLAogICAgKDB4RkJFOCwgJ00nLCB1J9mJJyksCiAgICAoMHhGQkVBLCAnTScsIHUn2KbYpycpLAogICAgKDB4RkJFQywgJ00nLCB1J9im25UnKSwKICAgICgweEZCRUUsICdNJywgdSfYptmIJyksCiAgICAoMHhGQkYwLCAnTScsIHUn2KbbhycpLAogICAgKDB4RkJGMiwgJ00nLCB1J9im24YnKSwKICAgICgweEZCRjQsICdNJywgdSfYptuIJyksCiAgICAoMHhGQkY2LCAnTScsIHUn2KbbkCcpLAogICAgKDB4RkJGOSwgJ00nLCB1J9im2YknKSwKICAgICgweEZCRkMsICdNJywgdSfbjCcpLAogICAgKDB4RkMwMCwgJ00nLCB1J9im2KwnKSwKICAgICgweEZDMDEsICdNJywgdSfYptitJyksCiAgICAoMHhGQzAyLCAnTScsIHUn2KbZhScpLAogICAgKDB4RkMwMywgJ00nLCB1J9im2YknKSwKICAgICgweEZDMDQsICdNJywgdSfYptmKJyksCiAgICAoMHhGQzA1LCAnTScsIHUn2KjYrCcpLAogICAgKDB4RkMwNiwgJ00nLCB1J9io2K0nKSwKICAgICgweEZDMDcsICdNJywgdSfYqNiuJyksCiAgICAoMHhGQzA4LCAnTScsIHUn2KjZhScpLAogICAgKDB4RkMwOSwgJ00nLCB1J9io2YknKSwKICAgICgweEZDMEEsICdNJywgdSfYqNmKJyksCiAgICAoMHhGQzBCLCAnTScsIHUn2KrYrCcpLAogICAgKDB4RkMwQywgJ00nLCB1J9iq2K0nKSwKICAgICgweEZDMEQsICdNJywgdSfYqtiuJyksCiAgICAoMHhGQzBFLCAnTScsIHUn2KrZhScpLAogICAgKDB4RkMwRiwgJ00nLCB1J9iq2YknKSwKICAgICgweEZDMTAsICdNJywgdSfYqtmKJyksCiAgICAoMHhGQzExLCAnTScsIHUn2KvYrCcpLAogICAgKDB4RkMxMiwgJ00nLCB1J9ir2YUnKSwKICAgICgweEZDMTMsICdNJywgdSfYq9mJJyksCiAgICAoMHhGQzE0LCAnTScsIHUn2KvZiicpLAogICAgKDB4RkMxNSwgJ00nLCB1J9is2K0nKSwKICAgICgweEZDMTYsICdNJywgdSfYrNmFJyksCiAgICAoMHhGQzE3LCAnTScsIHUn2K3YrCcpLAogICAgKDB4RkMxOCwgJ00nLCB1J9it2YUnKSwKICAgICgweEZDMTksICdNJywgdSfYrtisJyksCiAgICAoMHhGQzFBLCAnTScsIHUn2K7YrScpLAogICAgKDB4RkMxQiwgJ00nLCB1J9iu2YUnKSwKICAgICgweEZDMUMsICdNJywgdSfYs9isJyksCiAgICAoMHhGQzFELCAnTScsIHUn2LPYrScpLAogICAgKDB4RkMxRSwgJ00nLCB1J9iz2K4nKSwKICAgICgweEZDMUYsICdNJywgdSfYs9mFJyksCiAgICAoMHhGQzIwLCAnTScsIHUn2LXYrScpLAogICAgKDB4RkMyMSwgJ00nLCB1J9i12YUnKSwKICAgICgweEZDMjIsICdNJywgdSfYttisJyksCiAgICAoMHhGQzIzLCAnTScsIHUn2LbYrScpLAogICAgKDB4RkMyNCwgJ00nLCB1J9i22K4nKSwKICAgICgweEZDMjUsICdNJywgdSfYttmFJyksCiAgICAoMHhGQzI2LCAnTScsIHUn2LfYrScpLAogICAgKDB4RkMyNywgJ00nLCB1J9i32YUnKSwKICAgICgweEZDMjgsICdNJywgdSfYuNmFJyksCiAgICAoMHhGQzI5LCAnTScsIHUn2LnYrCcpLAogICAgKDB4RkMyQSwgJ00nLCB1J9i52YUnKSwKICAgICgweEZDMkIsICdNJywgdSfYutisJyksCiAgICAoMHhGQzJDLCAnTScsIHUn2LrZhScpLAogICAgKDB4RkMyRCwgJ00nLCB1J9mB2KwnKSwKICAgICgweEZDMkUsICdNJywgdSfZgditJyksCiAgICAoMHhGQzJGLCAnTScsIHUn2YHYricpLAogICAgKDB4RkMzMCwgJ00nLCB1J9mB2YUnKSwKICAgICgweEZDMzEsICdNJywgdSfZgdmJJyksCiAgICAoMHhGQzMyLCAnTScsIHUn2YHZiicpLAogICAgKDB4RkMzMywgJ00nLCB1J9mC2K0nKSwKICAgICgweEZDMzQsICdNJywgdSfZgtmFJyksCiAgICAoMHhGQzM1LCAnTScsIHUn2YLZiScpLAogICAgKDB4RkMzNiwgJ00nLCB1J9mC2YonKSwKICAgICgweEZDMzcsICdNJywgdSfZg9inJyksCiAgICAoMHhGQzM4LCAnTScsIHUn2YPYrCcpLAogICAgKDB4RkMzOSwgJ00nLCB1J9mD2K0nKSwKICAgICgweEZDM0EsICdNJywgdSfZg9iuJyksCiAgICAoMHhGQzNCLCAnTScsIHUn2YPZhCcpLAogICAgKDB4RkMzQywgJ00nLCB1J9mD2YUnKSwKICAgICgweEZDM0QsICdNJywgdSfZg9mJJyksCiAgICAoMHhGQzNFLCAnTScsIHUn2YPZiicpLAogICAgXQoKZGVmIF9zZWdfNDQoKToKICAgIHJldHVybiBbCiAgICAoMHhGQzNGLCAnTScsIHUn2YTYrCcpLAogICAgKDB4RkM0MCwgJ00nLCB1J9mE2K0nKSwKICAgICgweEZDNDEsICdNJywgdSfZhNiuJyksCiAgICAoMHhGQzQyLCAnTScsIHUn2YTZhScpLAogICAgKDB4RkM0MywgJ00nLCB1J9mE2YknKSwKICAgICgweEZDNDQsICdNJywgdSfZhNmKJyksCiAgICAoMHhGQzQ1LCAnTScsIHUn2YXYrCcpLAogICAgKDB4RkM0NiwgJ00nLCB1J9mF2K0nKSwKICAgICgweEZDNDcsICdNJywgdSfZhdiuJyksCiAgICAoMHhGQzQ4LCAnTScsIHUn2YXZhScpLAogICAgKDB4RkM0OSwgJ00nLCB1J9mF2YknKSwKICAgICgweEZDNEEsICdNJywgdSfZhdmKJyksCiAgICAoMHhGQzRCLCAnTScsIHUn2YbYrCcpLAogICAgKDB4RkM0QywgJ00nLCB1J9mG2K0nKSwKICAgICgweEZDNEQsICdNJywgdSfZhtiuJyksCiAgICAoMHhGQzRFLCAnTScsIHUn2YbZhScpLAogICAgKDB4RkM0RiwgJ00nLCB1J9mG2YknKSwKICAgICgweEZDNTAsICdNJywgdSfZhtmKJyksCiAgICAoMHhGQzUxLCAnTScsIHUn2YfYrCcpLAogICAgKDB4RkM1MiwgJ00nLCB1J9mH2YUnKSwKICAgICgweEZDNTMsICdNJywgdSfZh9mJJyksCiAgICAoMHhGQzU0LCAnTScsIHUn2YfZiicpLAogICAgKDB4RkM1NSwgJ00nLCB1J9mK2KwnKSwKICAgICgweEZDNTYsICdNJywgdSfZititJyksCiAgICAoMHhGQzU3LCAnTScsIHUn2YrYricpLAogICAgKDB4RkM1OCwgJ00nLCB1J9mK2YUnKSwKICAgICgweEZDNTksICdNJywgdSfZitmJJyksCiAgICAoMHhGQzVBLCAnTScsIHUn2YrZiicpLAogICAgKDB4RkM1QiwgJ00nLCB1J9iw2bAnKSwKICAgICgweEZDNUMsICdNJywgdSfYsdmwJyksCiAgICAoMHhGQzVELCAnTScsIHUn2YnZsCcpLAogICAgKDB4RkM1RSwgJzMnLCB1JyDZjNmRJyksCiAgICAoMHhGQzVGLCAnMycsIHUnINmN2ZEnKSwKICAgICgweEZDNjAsICczJywgdScg2Y7ZkScpLAogICAgKDB4RkM2MSwgJzMnLCB1JyDZj9mRJyksCiAgICAoMHhGQzYyLCAnMycsIHUnINmQ2ZEnKSwKICAgICgweEZDNjMsICczJywgdScg2ZHZsCcpLAogICAgKDB4RkM2NCwgJ00nLCB1J9im2LEnKSwKICAgICgweEZDNjUsICdNJywgdSfYptiyJyksCiAgICAoMHhGQzY2LCAnTScsIHUn2KbZhScpLAogICAgKDB4RkM2NywgJ00nLCB1J9im2YYnKSwKICAgICgweEZDNjgsICdNJywgdSfYptmJJyksCiAgICAoMHhGQzY5LCAnTScsIHUn2KbZiicpLAogICAgKDB4RkM2QSwgJ00nLCB1J9io2LEnKSwKICAgICgweEZDNkIsICdNJywgdSfYqNiyJyksCiAgICAoMHhGQzZDLCAnTScsIHUn2KjZhScpLAogICAgKDB4RkM2RCwgJ00nLCB1J9io2YYnKSwKICAgICgweEZDNkUsICdNJywgdSfYqNmJJyksCiAgICAoMHhGQzZGLCAnTScsIHUn2KjZiicpLAogICAgKDB4RkM3MCwgJ00nLCB1J9iq2LEnKSwKICAgICgweEZDNzEsICdNJywgdSfYqtiyJyksCiAgICAoMHhGQzcyLCAnTScsIHUn2KrZhScpLAogICAgKDB4RkM3MywgJ00nLCB1J9iq2YYnKSwKICAgICgweEZDNzQsICdNJywgdSfYqtmJJyksCiAgICAoMHhGQzc1LCAnTScsIHUn2KrZiicpLAogICAgKDB4RkM3NiwgJ00nLCB1J9ir2LEnKSwKICAgICgweEZDNzcsICdNJywgdSfYq9iyJyksCiAgICAoMHhGQzc4LCAnTScsIHUn2KvZhScpLAogICAgKDB4RkM3OSwgJ00nLCB1J9ir2YYnKSwKICAgICgweEZDN0EsICdNJywgdSfYq9mJJyksCiAgICAoMHhGQzdCLCAnTScsIHUn2KvZiicpLAogICAgKDB4RkM3QywgJ00nLCB1J9mB2YknKSwKICAgICgweEZDN0QsICdNJywgdSfZgdmKJyksCiAgICAoMHhGQzdFLCAnTScsIHUn2YLZiScpLAogICAgKDB4RkM3RiwgJ00nLCB1J9mC2YonKSwKICAgICgweEZDODAsICdNJywgdSfZg9inJyksCiAgICAoMHhGQzgxLCAnTScsIHUn2YPZhCcpLAogICAgKDB4RkM4MiwgJ00nLCB1J9mD2YUnKSwKICAgICgweEZDODMsICdNJywgdSfZg9mJJyksCiAgICAoMHhGQzg0LCAnTScsIHUn2YPZiicpLAogICAgKDB4RkM4NSwgJ00nLCB1J9mE2YUnKSwKICAgICgweEZDODYsICdNJywgdSfZhNmJJyksCiAgICAoMHhGQzg3LCAnTScsIHUn2YTZiicpLAogICAgKDB4RkM4OCwgJ00nLCB1J9mF2KcnKSwKICAgICgweEZDODksICdNJywgdSfZhdmFJyksCiAgICAoMHhGQzhBLCAnTScsIHUn2YbYsScpLAogICAgKDB4RkM4QiwgJ00nLCB1J9mG2LInKSwKICAgICgweEZDOEMsICdNJywgdSfZhtmFJyksCiAgICAoMHhGQzhELCAnTScsIHUn2YbZhicpLAogICAgKDB4RkM4RSwgJ00nLCB1J9mG2YknKSwKICAgICgweEZDOEYsICdNJywgdSfZhtmKJyksCiAgICAoMHhGQzkwLCAnTScsIHUn2YnZsCcpLAogICAgKDB4RkM5MSwgJ00nLCB1J9mK2LEnKSwKICAgICgweEZDOTIsICdNJywgdSfZitiyJyksCiAgICAoMHhGQzkzLCAnTScsIHUn2YrZhScpLAogICAgKDB4RkM5NCwgJ00nLCB1J9mK2YYnKSwKICAgICgweEZDOTUsICdNJywgdSfZitmJJyksCiAgICAoMHhGQzk2LCAnTScsIHUn2YrZiicpLAogICAgKDB4RkM5NywgJ00nLCB1J9im2KwnKSwKICAgICgweEZDOTgsICdNJywgdSfYptitJyksCiAgICAoMHhGQzk5LCAnTScsIHUn2KbYricpLAogICAgKDB4RkM5QSwgJ00nLCB1J9im2YUnKSwKICAgICgweEZDOUIsICdNJywgdSfYptmHJyksCiAgICAoMHhGQzlDLCAnTScsIHUn2KjYrCcpLAogICAgKDB4RkM5RCwgJ00nLCB1J9io2K0nKSwKICAgICgweEZDOUUsICdNJywgdSfYqNiuJyksCiAgICAoMHhGQzlGLCAnTScsIHUn2KjZhScpLAogICAgKDB4RkNBMCwgJ00nLCB1J9io2YcnKSwKICAgICgweEZDQTEsICdNJywgdSfYqtisJyksCiAgICAoMHhGQ0EyLCAnTScsIHUn2KrYrScpLAogICAgXQoKZGVmIF9zZWdfNDUoKToKICAgIHJldHVybiBbCiAgICAoMHhGQ0EzLCAnTScsIHUn2KrYricpLAogICAgKDB4RkNBNCwgJ00nLCB1J9iq2YUnKSwKICAgICgweEZDQTUsICdNJywgdSfYqtmHJyksCiAgICAoMHhGQ0E2LCAnTScsIHUn2KvZhScpLAogICAgKDB4RkNBNywgJ00nLCB1J9is2K0nKSwKICAgICgweEZDQTgsICdNJywgdSfYrNmFJyksCiAgICAoMHhGQ0E5LCAnTScsIHUn2K3YrCcpLAogICAgKDB4RkNBQSwgJ00nLCB1J9it2YUnKSwKICAgICgweEZDQUIsICdNJywgdSfYrtisJyksCiAgICAoMHhGQ0FDLCAnTScsIHUn2K7ZhScpLAogICAgKDB4RkNBRCwgJ00nLCB1J9iz2KwnKSwKICAgICgweEZDQUUsICdNJywgdSfYs9itJyksCiAgICAoMHhGQ0FGLCAnTScsIHUn2LPYricpLAogICAgKDB4RkNCMCwgJ00nLCB1J9iz2YUnKSwKICAgICgweEZDQjEsICdNJywgdSfYtditJyksCiAgICAoMHhGQ0IyLCAnTScsIHUn2LXYricpLAogICAgKDB4RkNCMywgJ00nLCB1J9i12YUnKSwKICAgICgweEZDQjQsICdNJywgdSfYttisJyksCiAgICAoMHhGQ0I1LCAnTScsIHUn2LbYrScpLAogICAgKDB4RkNCNiwgJ00nLCB1J9i22K4nKSwKICAgICgweEZDQjcsICdNJywgdSfYttmFJyksCiAgICAoMHhGQ0I4LCAnTScsIHUn2LfYrScpLAogICAgKDB4RkNCOSwgJ00nLCB1J9i42YUnKSwKICAgICgweEZDQkEsICdNJywgdSfYudisJyksCiAgICAoMHhGQ0JCLCAnTScsIHUn2LnZhScpLAogICAgKDB4RkNCQywgJ00nLCB1J9i62KwnKSwKICAgICgweEZDQkQsICdNJywgdSfYutmFJyksCiAgICAoMHhGQ0JFLCAnTScsIHUn2YHYrCcpLAogICAgKDB4RkNCRiwgJ00nLCB1J9mB2K0nKSwKICAgICgweEZDQzAsICdNJywgdSfZgdiuJyksCiAgICAoMHhGQ0MxLCAnTScsIHUn2YHZhScpLAogICAgKDB4RkNDMiwgJ00nLCB1J9mC2K0nKSwKICAgICgweEZDQzMsICdNJywgdSfZgtmFJyksCiAgICAoMHhGQ0M0LCAnTScsIHUn2YPYrCcpLAogICAgKDB4RkNDNSwgJ00nLCB1J9mD2K0nKSwKICAgICgweEZDQzYsICdNJywgdSfZg9iuJyksCiAgICAoMHhGQ0M3LCAnTScsIHUn2YPZhCcpLAogICAgKDB4RkNDOCwgJ00nLCB1J9mD2YUnKSwKICAgICgweEZDQzksICdNJywgdSfZhNisJyksCiAgICAoMHhGQ0NBLCAnTScsIHUn2YTYrScpLAogICAgKDB4RkNDQiwgJ00nLCB1J9mE2K4nKSwKICAgICgweEZDQ0MsICdNJywgdSfZhNmFJyksCiAgICAoMHhGQ0NELCAnTScsIHUn2YTZhycpLAogICAgKDB4RkNDRSwgJ00nLCB1J9mF2KwnKSwKICAgICgweEZDQ0YsICdNJywgdSfZhditJyksCiAgICAoMHhGQ0QwLCAnTScsIHUn2YXYricpLAogICAgKDB4RkNEMSwgJ00nLCB1J9mF2YUnKSwKICAgICgweEZDRDIsICdNJywgdSfZhtisJyksCiAgICAoMHhGQ0QzLCAnTScsIHUn2YbYrScpLAogICAgKDB4RkNENCwgJ00nLCB1J9mG2K4nKSwKICAgICgweEZDRDUsICdNJywgdSfZhtmFJyksCiAgICAoMHhGQ0Q2LCAnTScsIHUn2YbZhycpLAogICAgKDB4RkNENywgJ00nLCB1J9mH2KwnKSwKICAgICgweEZDRDgsICdNJywgdSfZh9mFJyksCiAgICAoMHhGQ0Q5LCAnTScsIHUn2YfZsCcpLAogICAgKDB4RkNEQSwgJ00nLCB1J9mK2KwnKSwKICAgICgweEZDREIsICdNJywgdSfZititJyksCiAgICAoMHhGQ0RDLCAnTScsIHUn2YrYricpLAogICAgKDB4RkNERCwgJ00nLCB1J9mK2YUnKSwKICAgICgweEZDREUsICdNJywgdSfZitmHJyksCiAgICAoMHhGQ0RGLCAnTScsIHUn2KbZhScpLAogICAgKDB4RkNFMCwgJ00nLCB1J9im2YcnKSwKICAgICgweEZDRTEsICdNJywgdSfYqNmFJyksCiAgICAoMHhGQ0UyLCAnTScsIHUn2KjZhycpLAogICAgKDB4RkNFMywgJ00nLCB1J9iq2YUnKSwKICAgICgweEZDRTQsICdNJywgdSfYqtmHJyksCiAgICAoMHhGQ0U1LCAnTScsIHUn2KvZhScpLAogICAgKDB4RkNFNiwgJ00nLCB1J9ir2YcnKSwKICAgICgweEZDRTcsICdNJywgdSfYs9mFJyksCiAgICAoMHhGQ0U4LCAnTScsIHUn2LPZhycpLAogICAgKDB4RkNFOSwgJ00nLCB1J9i02YUnKSwKICAgICgweEZDRUEsICdNJywgdSfYtNmHJyksCiAgICAoMHhGQ0VCLCAnTScsIHUn2YPZhCcpLAogICAgKDB4RkNFQywgJ00nLCB1J9mD2YUnKSwKICAgICgweEZDRUQsICdNJywgdSfZhNmFJyksCiAgICAoMHhGQ0VFLCAnTScsIHUn2YbZhScpLAogICAgKDB4RkNFRiwgJ00nLCB1J9mG2YcnKSwKICAgICgweEZDRjAsICdNJywgdSfZitmFJyksCiAgICAoMHhGQ0YxLCAnTScsIHUn2YrZhycpLAogICAgKDB4RkNGMiwgJ00nLCB1J9mA2Y7ZkScpLAogICAgKDB4RkNGMywgJ00nLCB1J9mA2Y/ZkScpLAogICAgKDB4RkNGNCwgJ00nLCB1J9mA2ZDZkScpLAogICAgKDB4RkNGNSwgJ00nLCB1J9i32YknKSwKICAgICgweEZDRjYsICdNJywgdSfYt9mKJyksCiAgICAoMHhGQ0Y3LCAnTScsIHUn2LnZiScpLAogICAgKDB4RkNGOCwgJ00nLCB1J9i52YonKSwKICAgICgweEZDRjksICdNJywgdSfYutmJJyksCiAgICAoMHhGQ0ZBLCAnTScsIHUn2LrZiicpLAogICAgKDB4RkNGQiwgJ00nLCB1J9iz2YknKSwKICAgICgweEZDRkMsICdNJywgdSfYs9mKJyksCiAgICAoMHhGQ0ZELCAnTScsIHUn2LTZiScpLAogICAgKDB4RkNGRSwgJ00nLCB1J9i02YonKSwKICAgICgweEZDRkYsICdNJywgdSfYrdmJJyksCiAgICAoMHhGRDAwLCAnTScsIHUn2K3ZiicpLAogICAgKDB4RkQwMSwgJ00nLCB1J9is2YknKSwKICAgICgweEZEMDIsICdNJywgdSfYrNmKJyksCiAgICAoMHhGRDAzLCAnTScsIHUn2K7ZiScpLAogICAgKDB4RkQwNCwgJ00nLCB1J9iu2YonKSwKICAgICgweEZEMDUsICdNJywgdSfYtdmJJyksCiAgICAoMHhGRDA2LCAnTScsIHUn2LXZiicpLAogICAgXQoKZGVmIF9zZWdfNDYoKToKICAgIHJldHVybiBbCiAgICAoMHhGRDA3LCAnTScsIHUn2LbZiScpLAogICAgKDB4RkQwOCwgJ00nLCB1J9i22YonKSwKICAgICgweEZEMDksICdNJywgdSfYtNisJyksCiAgICAoMHhGRDBBLCAnTScsIHUn2LTYrScpLAogICAgKDB4RkQwQiwgJ00nLCB1J9i02K4nKSwKICAgICgweEZEMEMsICdNJywgdSfYtNmFJyksCiAgICAoMHhGRDBELCAnTScsIHUn2LTYsScpLAogICAgKDB4RkQwRSwgJ00nLCB1J9iz2LEnKSwKICAgICgweEZEMEYsICdNJywgdSfYtdixJyksCiAgICAoMHhGRDEwLCAnTScsIHUn2LbYsScpLAogICAgKDB4RkQxMSwgJ00nLCB1J9i32YknKSwKICAgICgweEZEMTIsICdNJywgdSfYt9mKJyksCiAgICAoMHhGRDEzLCAnTScsIHUn2LnZiScpLAogICAgKDB4RkQxNCwgJ00nLCB1J9i52YonKSwKICAgICgweEZEMTUsICdNJywgdSfYutmJJyksCiAgICAoMHhGRDE2LCAnTScsIHUn2LrZiicpLAogICAgKDB4RkQxNywgJ00nLCB1J9iz2YknKSwKICAgICgweEZEMTgsICdNJywgdSfYs9mKJyksCiAgICAoMHhGRDE5LCAnTScsIHUn2LTZiScpLAogICAgKDB4RkQxQSwgJ00nLCB1J9i02YonKSwKICAgICgweEZEMUIsICdNJywgdSfYrdmJJyksCiAgICAoMHhGRDFDLCAnTScsIHUn2K3ZiicpLAogICAgKDB4RkQxRCwgJ00nLCB1J9is2YknKSwKICAgICgweEZEMUUsICdNJywgdSfYrNmKJyksCiAgICAoMHhGRDFGLCAnTScsIHUn2K7ZiScpLAogICAgKDB4RkQyMCwgJ00nLCB1J9iu2YonKSwKICAgICgweEZEMjEsICdNJywgdSfYtdmJJyksCiAgICAoMHhGRDIyLCAnTScsIHUn2LXZiicpLAogICAgKDB4RkQyMywgJ00nLCB1J9i22YknKSwKICAgICgweEZEMjQsICdNJywgdSfYttmKJyksCiAgICAoMHhGRDI1LCAnTScsIHUn2LTYrCcpLAogICAgKDB4RkQyNiwgJ00nLCB1J9i02K0nKSwKICAgICgweEZEMjcsICdNJywgdSfYtNiuJyksCiAgICAoMHhGRDI4LCAnTScsIHUn2LTZhScpLAogICAgKDB4RkQyOSwgJ00nLCB1J9i02LEnKSwKICAgICgweEZEMkEsICdNJywgdSfYs9ixJyksCiAgICAoMHhGRDJCLCAnTScsIHUn2LXYsScpLAogICAgKDB4RkQyQywgJ00nLCB1J9i22LEnKSwKICAgICgweEZEMkQsICdNJywgdSfYtNisJyksCiAgICAoMHhGRDJFLCAnTScsIHUn2LTYrScpLAogICAgKDB4RkQyRiwgJ00nLCB1J9i02K4nKSwKICAgICgweEZEMzAsICdNJywgdSfYtNmFJyksCiAgICAoMHhGRDMxLCAnTScsIHUn2LPZhycpLAogICAgKDB4RkQzMiwgJ00nLCB1J9i02YcnKSwKICAgICgweEZEMzMsICdNJywgdSfYt9mFJyksCiAgICAoMHhGRDM0LCAnTScsIHUn2LPYrCcpLAogICAgKDB4RkQzNSwgJ00nLCB1J9iz2K0nKSwKICAgICgweEZEMzYsICdNJywgdSfYs9iuJyksCiAgICAoMHhGRDM3LCAnTScsIHUn2LTYrCcpLAogICAgKDB4RkQzOCwgJ00nLCB1J9i02K0nKSwKICAgICgweEZEMzksICdNJywgdSfYtNiuJyksCiAgICAoMHhGRDNBLCAnTScsIHUn2LfZhScpLAogICAgKDB4RkQzQiwgJ00nLCB1J9i42YUnKSwKICAgICgweEZEM0MsICdNJywgdSfYp9mLJyksCiAgICAoMHhGRDNFLCAnVicpLAogICAgKDB4RkQ0MCwgJ1gnKSwKICAgICgweEZENTAsICdNJywgdSfYqtis2YUnKSwKICAgICgweEZENTEsICdNJywgdSfYqtit2KwnKSwKICAgICgweEZENTMsICdNJywgdSfYqtit2YUnKSwKICAgICgweEZENTQsICdNJywgdSfYqtiu2YUnKSwKICAgICgweEZENTUsICdNJywgdSfYqtmF2KwnKSwKICAgICgweEZENTYsICdNJywgdSfYqtmF2K0nKSwKICAgICgweEZENTcsICdNJywgdSfYqtmF2K4nKSwKICAgICgweEZENTgsICdNJywgdSfYrNmF2K0nKSwKICAgICgweEZENUEsICdNJywgdSfYrdmF2YonKSwKICAgICgweEZENUIsICdNJywgdSfYrdmF2YknKSwKICAgICgweEZENUMsICdNJywgdSfYs9it2KwnKSwKICAgICgweEZENUQsICdNJywgdSfYs9is2K0nKSwKICAgICgweEZENUUsICdNJywgdSfYs9is2YknKSwKICAgICgweEZENUYsICdNJywgdSfYs9mF2K0nKSwKICAgICgweEZENjEsICdNJywgdSfYs9mF2KwnKSwKICAgICgweEZENjIsICdNJywgdSfYs9mF2YUnKSwKICAgICgweEZENjQsICdNJywgdSfYtdit2K0nKSwKICAgICgweEZENjYsICdNJywgdSfYtdmF2YUnKSwKICAgICgweEZENjcsICdNJywgdSfYtNit2YUnKSwKICAgICgweEZENjksICdNJywgdSfYtNis2YonKSwKICAgICgweEZENkEsICdNJywgdSfYtNmF2K4nKSwKICAgICgweEZENkMsICdNJywgdSfYtNmF2YUnKSwKICAgICgweEZENkUsICdNJywgdSfYttit2YknKSwKICAgICgweEZENkYsICdNJywgdSfYttiu2YUnKSwKICAgICgweEZENzEsICdNJywgdSfYt9mF2K0nKSwKICAgICgweEZENzMsICdNJywgdSfYt9mF2YUnKSwKICAgICgweEZENzQsICdNJywgdSfYt9mF2YonKSwKICAgICgweEZENzUsICdNJywgdSfYudis2YUnKSwKICAgICgweEZENzYsICdNJywgdSfYudmF2YUnKSwKICAgICgweEZENzgsICdNJywgdSfYudmF2YknKSwKICAgICgweEZENzksICdNJywgdSfYutmF2YUnKSwKICAgICgweEZEN0EsICdNJywgdSfYutmF2YonKSwKICAgICgweEZEN0IsICdNJywgdSfYutmF2YknKSwKICAgICgweEZEN0MsICdNJywgdSfZgdiu2YUnKSwKICAgICgweEZEN0UsICdNJywgdSfZgtmF2K0nKSwKICAgICgweEZEN0YsICdNJywgdSfZgtmF2YUnKSwKICAgICgweEZEODAsICdNJywgdSfZhNit2YUnKSwKICAgICgweEZEODEsICdNJywgdSfZhNit2YonKSwKICAgICgweEZEODIsICdNJywgdSfZhNit2YknKSwKICAgICgweEZEODMsICdNJywgdSfZhNis2KwnKSwKICAgICgweEZEODUsICdNJywgdSfZhNiu2YUnKSwKICAgICgweEZEODcsICdNJywgdSfZhNmF2K0nKSwKICAgICgweEZEODksICdNJywgdSfZhdit2KwnKSwKICAgICgweEZEOEEsICdNJywgdSfZhdit2YUnKSwKICAgIF0KCmRlZiBfc2VnXzQ3KCk6CiAgICByZXR1cm4gWwogICAgKDB4RkQ4QiwgJ00nLCB1J9mF2K3ZiicpLAogICAgKDB4RkQ4QywgJ00nLCB1J9mF2KzYrScpLAogICAgKDB4RkQ4RCwgJ00nLCB1J9mF2KzZhScpLAogICAgKDB4RkQ4RSwgJ00nLCB1J9mF2K7YrCcpLAogICAgKDB4RkQ4RiwgJ00nLCB1J9mF2K7ZhScpLAogICAgKDB4RkQ5MCwgJ1gnKSwKICAgICgweEZEOTIsICdNJywgdSfZhdis2K4nKSwKICAgICgweEZEOTMsICdNJywgdSfZh9mF2KwnKSwKICAgICgweEZEOTQsICdNJywgdSfZh9mF2YUnKSwKICAgICgweEZEOTUsICdNJywgdSfZhtit2YUnKSwKICAgICgweEZEOTYsICdNJywgdSfZhtit2YknKSwKICAgICgweEZEOTcsICdNJywgdSfZhtis2YUnKSwKICAgICgweEZEOTksICdNJywgdSfZhtis2YknKSwKICAgICgweEZEOUEsICdNJywgdSfZhtmF2YonKSwKICAgICgweEZEOUIsICdNJywgdSfZhtmF2YknKSwKICAgICgweEZEOUMsICdNJywgdSfZitmF2YUnKSwKICAgICgweEZEOUUsICdNJywgdSfYqNiu2YonKSwKICAgICgweEZEOUYsICdNJywgdSfYqtis2YonKSwKICAgICgweEZEQTAsICdNJywgdSfYqtis2YknKSwKICAgICgweEZEQTEsICdNJywgdSfYqtiu2YonKSwKICAgICgweEZEQTIsICdNJywgdSfYqtiu2YknKSwKICAgICgweEZEQTMsICdNJywgdSfYqtmF2YonKSwKICAgICgweEZEQTQsICdNJywgdSfYqtmF2YknKSwKICAgICgweEZEQTUsICdNJywgdSfYrNmF2YonKSwKICAgICgweEZEQTYsICdNJywgdSfYrNit2YknKSwKICAgICgweEZEQTcsICdNJywgdSfYrNmF2YknKSwKICAgICgweEZEQTgsICdNJywgdSfYs9iu2YknKSwKICAgICgweEZEQTksICdNJywgdSfYtdit2YonKSwKICAgICgweEZEQUEsICdNJywgdSfYtNit2YonKSwKICAgICgweEZEQUIsICdNJywgdSfYttit2YonKSwKICAgICgweEZEQUMsICdNJywgdSfZhNis2YonKSwKICAgICgweEZEQUQsICdNJywgdSfZhNmF2YonKSwKICAgICgweEZEQUUsICdNJywgdSfZitit2YonKSwKICAgICgweEZEQUYsICdNJywgdSfZitis2YonKSwKICAgICgweEZEQjAsICdNJywgdSfZitmF2YonKSwKICAgICgweEZEQjEsICdNJywgdSfZhdmF2YonKSwKICAgICgweEZEQjIsICdNJywgdSfZgtmF2YonKSwKICAgICgweEZEQjMsICdNJywgdSfZhtit2YonKSwKICAgICgweEZEQjQsICdNJywgdSfZgtmF2K0nKSwKICAgICgweEZEQjUsICdNJywgdSfZhNit2YUnKSwKICAgICgweEZEQjYsICdNJywgdSfYudmF2YonKSwKICAgICgweEZEQjcsICdNJywgdSfZg9mF2YonKSwKICAgICgweEZEQjgsICdNJywgdSfZhtis2K0nKSwKICAgICgweEZEQjksICdNJywgdSfZhdiu2YonKSwKICAgICgweEZEQkEsICdNJywgdSfZhNis2YUnKSwKICAgICgweEZEQkIsICdNJywgdSfZg9mF2YUnKSwKICAgICgweEZEQkMsICdNJywgdSfZhNis2YUnKSwKICAgICgweEZEQkQsICdNJywgdSfZhtis2K0nKSwKICAgICgweEZEQkUsICdNJywgdSfYrNit2YonKSwKICAgICgweEZEQkYsICdNJywgdSfYrdis2YonKSwKICAgICgweEZEQzAsICdNJywgdSfZhdis2YonKSwKICAgICgweEZEQzEsICdNJywgdSfZgdmF2YonKSwKICAgICgweEZEQzIsICdNJywgdSfYqNit2YonKSwKICAgICgweEZEQzMsICdNJywgdSfZg9mF2YUnKSwKICAgICgweEZEQzQsICdNJywgdSfYudis2YUnKSwKICAgICgweEZEQzUsICdNJywgdSfYtdmF2YUnKSwKICAgICgweEZEQzYsICdNJywgdSfYs9iu2YonKSwKICAgICgweEZEQzcsICdNJywgdSfZhtis2YonKSwKICAgICgweEZEQzgsICdYJyksCiAgICAoMHhGREYwLCAnTScsIHUn2LXZhNuSJyksCiAgICAoMHhGREYxLCAnTScsIHUn2YLZhNuSJyksCiAgICAoMHhGREYyLCAnTScsIHUn2KfZhNmE2YcnKSwKICAgICgweEZERjMsICdNJywgdSfYp9mD2KjYsScpLAogICAgKDB4RkRGNCwgJ00nLCB1J9mF2K3ZhdivJyksCiAgICAoMHhGREY1LCAnTScsIHUn2LXZhNi52YUnKSwKICAgICgweEZERjYsICdNJywgdSfYsdiz2YjZhCcpLAogICAgKDB4RkRGNywgJ00nLCB1J9i52YTZitmHJyksCiAgICAoMHhGREY4LCAnTScsIHUn2YjYs9mE2YUnKSwKICAgICgweEZERjksICdNJywgdSfYtdmE2YknKSwKICAgICgweEZERkEsICczJywgdSfYtdmE2Ykg2KfZhNmE2Ycg2LnZhNmK2Ycg2YjYs9mE2YUnKSwKICAgICgweEZERkIsICczJywgdSfYrNmEINis2YTYp9mE2YcnKSwKICAgICgweEZERkMsICdNJywgdSfYsduM2KfZhCcpLAogICAgKDB4RkRGRCwgJ1YnKSwKICAgICgweEZERkUsICdYJyksCiAgICAoMHhGRTAwLCAnSScpLAogICAgKDB4RkUxMCwgJzMnLCB1JywnKSwKICAgICgweEZFMTEsICdNJywgdSfjgIEnKSwKICAgICgweEZFMTIsICdYJyksCiAgICAoMHhGRTEzLCAnMycsIHUnOicpLAogICAgKDB4RkUxNCwgJzMnLCB1JzsnKSwKICAgICgweEZFMTUsICczJywgdSchJyksCiAgICAoMHhGRTE2LCAnMycsIHUnPycpLAogICAgKDB4RkUxNywgJ00nLCB1J+OAlicpLAogICAgKDB4RkUxOCwgJ00nLCB1J+OAlycpLAogICAgKDB4RkUxOSwgJ1gnKSwKICAgICgweEZFMjAsICdWJyksCiAgICAoMHhGRTI3LCAnWCcpLAogICAgKDB4RkUzMSwgJ00nLCB1J+KAlCcpLAogICAgKDB4RkUzMiwgJ00nLCB1J+KAkycpLAogICAgKDB4RkUzMywgJzMnLCB1J18nKSwKICAgICgweEZFMzUsICczJywgdScoJyksCiAgICAoMHhGRTM2LCAnMycsIHUnKScpLAogICAgKDB4RkUzNywgJzMnLCB1J3snKSwKICAgICgweEZFMzgsICczJywgdSd9JyksCiAgICAoMHhGRTM5LCAnTScsIHUn44CUJyksCiAgICAoMHhGRTNBLCAnTScsIHUn44CVJyksCiAgICAoMHhGRTNCLCAnTScsIHUn44CQJyksCiAgICAoMHhGRTNDLCAnTScsIHUn44CRJyksCiAgICAoMHhGRTNELCAnTScsIHUn44CKJyksCiAgICAoMHhGRTNFLCAnTScsIHUn44CLJyksCiAgICBdCgpkZWYgX3NlZ180OCgpOgogICAgcmV0dXJuIFsKICAgICgweEZFM0YsICdNJywgdSfjgIgnKSwKICAgICgweEZFNDAsICdNJywgdSfjgIknKSwKICAgICgweEZFNDEsICdNJywgdSfjgIwnKSwKICAgICgweEZFNDIsICdNJywgdSfjgI0nKSwKICAgICgweEZFNDMsICdNJywgdSfjgI4nKSwKICAgICgweEZFNDQsICdNJywgdSfjgI8nKSwKICAgICgweEZFNDUsICdWJyksCiAgICAoMHhGRTQ3LCAnMycsIHUnWycpLAogICAgKDB4RkU0OCwgJzMnLCB1J10nKSwKICAgICgweEZFNDksICczJywgdScgzIUnKSwKICAgICgweEZFNEQsICczJywgdSdfJyksCiAgICAoMHhGRTUwLCAnMycsIHUnLCcpLAogICAgKDB4RkU1MSwgJ00nLCB1J+OAgScpLAogICAgKDB4RkU1MiwgJ1gnKSwKICAgICgweEZFNTQsICczJywgdSc7JyksCiAgICAoMHhGRTU1LCAnMycsIHUnOicpLAogICAgKDB4RkU1NiwgJzMnLCB1Jz8nKSwKICAgICgweEZFNTcsICczJywgdSchJyksCiAgICAoMHhGRTU4LCAnTScsIHUn4oCUJyksCiAgICAoMHhGRTU5LCAnMycsIHUnKCcpLAogICAgKDB4RkU1QSwgJzMnLCB1JyknKSwKICAgICgweEZFNUIsICczJywgdSd7JyksCiAgICAoMHhGRTVDLCAnMycsIHUnfScpLAogICAgKDB4RkU1RCwgJ00nLCB1J+OAlCcpLAogICAgKDB4RkU1RSwgJ00nLCB1J+OAlScpLAogICAgKDB4RkU1RiwgJzMnLCB1JyMnKSwKICAgICgweEZFNjAsICczJywgdScmJyksCiAgICAoMHhGRTYxLCAnMycsIHUnKicpLAogICAgKDB4RkU2MiwgJzMnLCB1JysnKSwKICAgICgweEZFNjMsICdNJywgdSctJyksCiAgICAoMHhGRTY0LCAnMycsIHUnPCcpLAogICAgKDB4RkU2NSwgJzMnLCB1Jz4nKSwKICAgICgweEZFNjYsICczJywgdSc9JyksCiAgICAoMHhGRTY3LCAnWCcpLAogICAgKDB4RkU2OCwgJzMnLCB1J1xcJyksCiAgICAoMHhGRTY5LCAnMycsIHUnJCcpLAogICAgKDB4RkU2QSwgJzMnLCB1JyUnKSwKICAgICgweEZFNkIsICczJywgdSdAJyksCiAgICAoMHhGRTZDLCAnWCcpLAogICAgKDB4RkU3MCwgJzMnLCB1JyDZiycpLAogICAgKDB4RkU3MSwgJ00nLCB1J9mA2YsnKSwKICAgICgweEZFNzIsICczJywgdScg2YwnKSwKICAgICgweEZFNzMsICdWJyksCiAgICAoMHhGRTc0LCAnMycsIHUnINmNJyksCiAgICAoMHhGRTc1LCAnWCcpLAogICAgKDB4RkU3NiwgJzMnLCB1JyDZjicpLAogICAgKDB4RkU3NywgJ00nLCB1J9mA2Y4nKSwKICAgICgweEZFNzgsICczJywgdScg2Y8nKSwKICAgICgweEZFNzksICdNJywgdSfZgNmPJyksCiAgICAoMHhGRTdBLCAnMycsIHUnINmQJyksCiAgICAoMHhGRTdCLCAnTScsIHUn2YDZkCcpLAogICAgKDB4RkU3QywgJzMnLCB1JyDZkScpLAogICAgKDB4RkU3RCwgJ00nLCB1J9mA2ZEnKSwKICAgICgweEZFN0UsICczJywgdScg2ZInKSwKICAgICgweEZFN0YsICdNJywgdSfZgNmSJyksCiAgICAoMHhGRTgwLCAnTScsIHUn2KEnKSwKICAgICgweEZFODEsICdNJywgdSfYoicpLAogICAgKDB4RkU4MywgJ00nLCB1J9ijJyksCiAgICAoMHhGRTg1LCAnTScsIHUn2KQnKSwKICAgICgweEZFODcsICdNJywgdSfYpScpLAogICAgKDB4RkU4OSwgJ00nLCB1J9imJyksCiAgICAoMHhGRThELCAnTScsIHUn2KcnKSwKICAgICgweEZFOEYsICdNJywgdSfYqCcpLAogICAgKDB4RkU5MywgJ00nLCB1J9ipJyksCiAgICAoMHhGRTk1LCAnTScsIHUn2KonKSwKICAgICgweEZFOTksICdNJywgdSfYqycpLAogICAgKDB4RkU5RCwgJ00nLCB1J9isJyksCiAgICAoMHhGRUExLCAnTScsIHUn2K0nKSwKICAgICgweEZFQTUsICdNJywgdSfYricpLAogICAgKDB4RkVBOSwgJ00nLCB1J9ivJyksCiAgICAoMHhGRUFCLCAnTScsIHUn2LAnKSwKICAgICgweEZFQUQsICdNJywgdSfYsScpLAogICAgKDB4RkVBRiwgJ00nLCB1J9iyJyksCiAgICAoMHhGRUIxLCAnTScsIHUn2LMnKSwKICAgICgweEZFQjUsICdNJywgdSfYtCcpLAogICAgKDB4RkVCOSwgJ00nLCB1J9i1JyksCiAgICAoMHhGRUJELCAnTScsIHUn2LYnKSwKICAgICgweEZFQzEsICdNJywgdSfYtycpLAogICAgKDB4RkVDNSwgJ00nLCB1J9i4JyksCiAgICAoMHhGRUM5LCAnTScsIHUn2LknKSwKICAgICgweEZFQ0QsICdNJywgdSfYuicpLAogICAgKDB4RkVEMSwgJ00nLCB1J9mBJyksCiAgICAoMHhGRUQ1LCAnTScsIHUn2YInKSwKICAgICgweEZFRDksICdNJywgdSfZgycpLAogICAgKDB4RkVERCwgJ00nLCB1J9mEJyksCiAgICAoMHhGRUUxLCAnTScsIHUn2YUnKSwKICAgICgweEZFRTUsICdNJywgdSfZhicpLAogICAgKDB4RkVFOSwgJ00nLCB1J9mHJyksCiAgICAoMHhGRUVELCAnTScsIHUn2YgnKSwKICAgICgweEZFRUYsICdNJywgdSfZiScpLAogICAgKDB4RkVGMSwgJ00nLCB1J9mKJyksCiAgICAoMHhGRUY1LCAnTScsIHUn2YTYoicpLAogICAgKDB4RkVGNywgJ00nLCB1J9mE2KMnKSwKICAgICgweEZFRjksICdNJywgdSfZhNilJyksCiAgICAoMHhGRUZCLCAnTScsIHUn2YTYpycpLAogICAgKDB4RkVGRCwgJ1gnKSwKICAgICgweEZFRkYsICdJJyksCiAgICAoMHhGRjAwLCAnWCcpLAogICAgKDB4RkYwMSwgJzMnLCB1JyEnKSwKICAgICgweEZGMDIsICczJywgdSciJyksCiAgICBdCgpkZWYgX3NlZ180OSgpOgogICAgcmV0dXJuIFsKICAgICgweEZGMDMsICczJywgdScjJyksCiAgICAoMHhGRjA0LCAnMycsIHUnJCcpLAogICAgKDB4RkYwNSwgJzMnLCB1JyUnKSwKICAgICgweEZGMDYsICczJywgdScmJyksCiAgICAoMHhGRjA3LCAnMycsIHUnXCcnKSwKICAgICgweEZGMDgsICczJywgdScoJyksCiAgICAoMHhGRjA5LCAnMycsIHUnKScpLAogICAgKDB4RkYwQSwgJzMnLCB1JyonKSwKICAgICgweEZGMEIsICczJywgdScrJyksCiAgICAoMHhGRjBDLCAnMycsIHUnLCcpLAogICAgKDB4RkYwRCwgJ00nLCB1Jy0nKSwKICAgICgweEZGMEUsICdNJywgdScuJyksCiAgICAoMHhGRjBGLCAnMycsIHUnLycpLAogICAgKDB4RkYxMCwgJ00nLCB1JzAnKSwKICAgICgweEZGMTEsICdNJywgdScxJyksCiAgICAoMHhGRjEyLCAnTScsIHUnMicpLAogICAgKDB4RkYxMywgJ00nLCB1JzMnKSwKICAgICgweEZGMTQsICdNJywgdSc0JyksCiAgICAoMHhGRjE1LCAnTScsIHUnNScpLAogICAgKDB4RkYxNiwgJ00nLCB1JzYnKSwKICAgICgweEZGMTcsICdNJywgdSc3JyksCiAgICAoMHhGRjE4LCAnTScsIHUnOCcpLAogICAgKDB4RkYxOSwgJ00nLCB1JzknKSwKICAgICgweEZGMUEsICczJywgdSc6JyksCiAgICAoMHhGRjFCLCAnMycsIHUnOycpLAogICAgKDB4RkYxQywgJzMnLCB1JzwnKSwKICAgICgweEZGMUQsICczJywgdSc9JyksCiAgICAoMHhGRjFFLCAnMycsIHUnPicpLAogICAgKDB4RkYxRiwgJzMnLCB1Jz8nKSwKICAgICgweEZGMjAsICczJywgdSdAJyksCiAgICAoMHhGRjIxLCAnTScsIHUnYScpLAogICAgKDB4RkYyMiwgJ00nLCB1J2InKSwKICAgICgweEZGMjMsICdNJywgdSdjJyksCiAgICAoMHhGRjI0LCAnTScsIHUnZCcpLAogICAgKDB4RkYyNSwgJ00nLCB1J2UnKSwKICAgICgweEZGMjYsICdNJywgdSdmJyksCiAgICAoMHhGRjI3LCAnTScsIHUnZycpLAogICAgKDB4RkYyOCwgJ00nLCB1J2gnKSwKICAgICgweEZGMjksICdNJywgdSdpJyksCiAgICAoMHhGRjJBLCAnTScsIHUnaicpLAogICAgKDB4RkYyQiwgJ00nLCB1J2snKSwKICAgICgweEZGMkMsICdNJywgdSdsJyksCiAgICAoMHhGRjJELCAnTScsIHUnbScpLAogICAgKDB4RkYyRSwgJ00nLCB1J24nKSwKICAgICgweEZGMkYsICdNJywgdSdvJyksCiAgICAoMHhGRjMwLCAnTScsIHUncCcpLAogICAgKDB4RkYzMSwgJ00nLCB1J3EnKSwKICAgICgweEZGMzIsICdNJywgdSdyJyksCiAgICAoMHhGRjMzLCAnTScsIHUncycpLAogICAgKDB4RkYzNCwgJ00nLCB1J3QnKSwKICAgICgweEZGMzUsICdNJywgdSd1JyksCiAgICAoMHhGRjM2LCAnTScsIHUndicpLAogICAgKDB4RkYzNywgJ00nLCB1J3cnKSwKICAgICgweEZGMzgsICdNJywgdSd4JyksCiAgICAoMHhGRjM5LCAnTScsIHUneScpLAogICAgKDB4RkYzQSwgJ00nLCB1J3onKSwKICAgICgweEZGM0IsICczJywgdSdbJyksCiAgICAoMHhGRjNDLCAnMycsIHUnXFwnKSwKICAgICgweEZGM0QsICczJywgdSddJyksCiAgICAoMHhGRjNFLCAnMycsIHUnXicpLAogICAgKDB4RkYzRiwgJzMnLCB1J18nKSwKICAgICgweEZGNDAsICczJywgdSdgJyksCiAgICAoMHhGRjQxLCAnTScsIHUnYScpLAogICAgKDB4RkY0MiwgJ00nLCB1J2InKSwKICAgICgweEZGNDMsICdNJywgdSdjJyksCiAgICAoMHhGRjQ0LCAnTScsIHUnZCcpLAogICAgKDB4RkY0NSwgJ00nLCB1J2UnKSwKICAgICgweEZGNDYsICdNJywgdSdmJyksCiAgICAoMHhGRjQ3LCAnTScsIHUnZycpLAogICAgKDB4RkY0OCwgJ00nLCB1J2gnKSwKICAgICgweEZGNDksICdNJywgdSdpJyksCiAgICAoMHhGRjRBLCAnTScsIHUnaicpLAogICAgKDB4RkY0QiwgJ00nLCB1J2snKSwKICAgICgweEZGNEMsICdNJywgdSdsJyksCiAgICAoMHhGRjRELCAnTScsIHUnbScpLAogICAgKDB4RkY0RSwgJ00nLCB1J24nKSwKICAgICgweEZGNEYsICdNJywgdSdvJyksCiAgICAoMHhGRjUwLCAnTScsIHUncCcpLAogICAgKDB4RkY1MSwgJ00nLCB1J3EnKSwKICAgICgweEZGNTIsICdNJywgdSdyJyksCiAgICAoMHhGRjUzLCAnTScsIHUncycpLAogICAgKDB4RkY1NCwgJ00nLCB1J3QnKSwKICAgICgweEZGNTUsICdNJywgdSd1JyksCiAgICAoMHhGRjU2LCAnTScsIHUndicpLAogICAgKDB4RkY1NywgJ00nLCB1J3cnKSwKICAgICgweEZGNTgsICdNJywgdSd4JyksCiAgICAoMHhGRjU5LCAnTScsIHUneScpLAogICAgKDB4RkY1QSwgJ00nLCB1J3onKSwKICAgICgweEZGNUIsICczJywgdSd7JyksCiAgICAoMHhGRjVDLCAnMycsIHUnfCcpLAogICAgKDB4RkY1RCwgJzMnLCB1J30nKSwKICAgICgweEZGNUUsICczJywgdSd+JyksCiAgICAoMHhGRjVGLCAnTScsIHUn4qaFJyksCiAgICAoMHhGRjYwLCAnTScsIHUn4qaGJyksCiAgICAoMHhGRjYxLCAnTScsIHUnLicpLAogICAgKDB4RkY2MiwgJ00nLCB1J+OAjCcpLAogICAgKDB4RkY2MywgJ00nLCB1J+OAjScpLAogICAgKDB4RkY2NCwgJ00nLCB1J+OAgScpLAogICAgKDB4RkY2NSwgJ00nLCB1J+ODuycpLAogICAgKDB4RkY2NiwgJ00nLCB1J+ODsicpLAogICAgXQoKZGVmIF9zZWdfNTAoKToKICAgIHJldHVybiBbCiAgICAoMHhGRjY3LCAnTScsIHUn44KhJyksCiAgICAoMHhGRjY4LCAnTScsIHUn44KjJyksCiAgICAoMHhGRjY5LCAnTScsIHUn44KlJyksCiAgICAoMHhGRjZBLCAnTScsIHUn44KnJyksCiAgICAoMHhGRjZCLCAnTScsIHUn44KpJyksCiAgICAoMHhGRjZDLCAnTScsIHUn44OjJyksCiAgICAoMHhGRjZELCAnTScsIHUn44OlJyksCiAgICAoMHhGRjZFLCAnTScsIHUn44OnJyksCiAgICAoMHhGRjZGLCAnTScsIHUn44ODJyksCiAgICAoMHhGRjcwLCAnTScsIHUn44O8JyksCiAgICAoMHhGRjcxLCAnTScsIHUn44KiJyksCiAgICAoMHhGRjcyLCAnTScsIHUn44KkJyksCiAgICAoMHhGRjczLCAnTScsIHUn44KmJyksCiAgICAoMHhGRjc0LCAnTScsIHUn44KoJyksCiAgICAoMHhGRjc1LCAnTScsIHUn44KqJyksCiAgICAoMHhGRjc2LCAnTScsIHUn44KrJyksCiAgICAoMHhGRjc3LCAnTScsIHUn44KtJyksCiAgICAoMHhGRjc4LCAnTScsIHUn44KvJyksCiAgICAoMHhGRjc5LCAnTScsIHUn44KxJyksCiAgICAoMHhGRjdBLCAnTScsIHUn44KzJyksCiAgICAoMHhGRjdCLCAnTScsIHUn44K1JyksCiAgICAoMHhGRjdDLCAnTScsIHUn44K3JyksCiAgICAoMHhGRjdELCAnTScsIHUn44K5JyksCiAgICAoMHhGRjdFLCAnTScsIHUn44K7JyksCiAgICAoMHhGRjdGLCAnTScsIHUn44K9JyksCiAgICAoMHhGRjgwLCAnTScsIHUn44K/JyksCiAgICAoMHhGRjgxLCAnTScsIHUn44OBJyksCiAgICAoMHhGRjgyLCAnTScsIHUn44OEJyksCiAgICAoMHhGRjgzLCAnTScsIHUn44OGJyksCiAgICAoMHhGRjg0LCAnTScsIHUn44OIJyksCiAgICAoMHhGRjg1LCAnTScsIHUn44OKJyksCiAgICAoMHhGRjg2LCAnTScsIHUn44OLJyksCiAgICAoMHhGRjg3LCAnTScsIHUn44OMJyksCiAgICAoMHhGRjg4LCAnTScsIHUn44ONJyksCiAgICAoMHhGRjg5LCAnTScsIHUn44OOJyksCiAgICAoMHhGRjhBLCAnTScsIHUn44OPJyksCiAgICAoMHhGRjhCLCAnTScsIHUn44OSJyksCiAgICAoMHhGRjhDLCAnTScsIHUn44OVJyksCiAgICAoMHhGRjhELCAnTScsIHUn44OYJyksCiAgICAoMHhGRjhFLCAnTScsIHUn44ObJyksCiAgICAoMHhGRjhGLCAnTScsIHUn44OeJyksCiAgICAoMHhGRjkwLCAnTScsIHUn44OfJyksCiAgICAoMHhGRjkxLCAnTScsIHUn44OgJyksCiAgICAoMHhGRjkyLCAnTScsIHUn44OhJyksCiAgICAoMHhGRjkzLCAnTScsIHUn44OiJyksCiAgICAoMHhGRjk0LCAnTScsIHUn44OkJyksCiAgICAoMHhGRjk1LCAnTScsIHUn44OmJyksCiAgICAoMHhGRjk2LCAnTScsIHUn44OoJyksCiAgICAoMHhGRjk3LCAnTScsIHUn44OpJyksCiAgICAoMHhGRjk4LCAnTScsIHUn44OqJyksCiAgICAoMHhGRjk5LCAnTScsIHUn44OrJyksCiAgICAoMHhGRjlBLCAnTScsIHUn44OsJyksCiAgICAoMHhGRjlCLCAnTScsIHUn44OtJyksCiAgICAoMHhGRjlDLCAnTScsIHUn44OvJyksCiAgICAoMHhGRjlELCAnTScsIHUn44OzJyksCiAgICAoMHhGRjlFLCAnTScsIHUn44KZJyksCiAgICAoMHhGRjlGLCAnTScsIHUn44KaJyksCiAgICAoMHhGRkEwLCAnWCcpLAogICAgKDB4RkZBMSwgJ00nLCB1J+GEgCcpLAogICAgKDB4RkZBMiwgJ00nLCB1J+GEgScpLAogICAgKDB4RkZBMywgJ00nLCB1J+GGqicpLAogICAgKDB4RkZBNCwgJ00nLCB1J+GEgicpLAogICAgKDB4RkZBNSwgJ00nLCB1J+GGrCcpLAogICAgKDB4RkZBNiwgJ00nLCB1J+GGrScpLAogICAgKDB4RkZBNywgJ00nLCB1J+GEgycpLAogICAgKDB4RkZBOCwgJ00nLCB1J+GEhCcpLAogICAgKDB4RkZBOSwgJ00nLCB1J+GEhScpLAogICAgKDB4RkZBQSwgJ00nLCB1J+GGsCcpLAogICAgKDB4RkZBQiwgJ00nLCB1J+GGsScpLAogICAgKDB4RkZBQywgJ00nLCB1J+GGsicpLAogICAgKDB4RkZBRCwgJ00nLCB1J+GGsycpLAogICAgKDB4RkZBRSwgJ00nLCB1J+GGtCcpLAogICAgKDB4RkZBRiwgJ00nLCB1J+GGtScpLAogICAgKDB4RkZCMCwgJ00nLCB1J+GEmicpLAogICAgKDB4RkZCMSwgJ00nLCB1J+GEhicpLAogICAgKDB4RkZCMiwgJ00nLCB1J+GEhycpLAogICAgKDB4RkZCMywgJ00nLCB1J+GEiCcpLAogICAgKDB4RkZCNCwgJ00nLCB1J+GEoScpLAogICAgKDB4RkZCNSwgJ00nLCB1J+GEiScpLAogICAgKDB4RkZCNiwgJ00nLCB1J+GEiicpLAogICAgKDB4RkZCNywgJ00nLCB1J+GEiycpLAogICAgKDB4RkZCOCwgJ00nLCB1J+GEjCcpLAogICAgKDB4RkZCOSwgJ00nLCB1J+GEjScpLAogICAgKDB4RkZCQSwgJ00nLCB1J+GEjicpLAogICAgKDB4RkZCQiwgJ00nLCB1J+GEjycpLAogICAgKDB4RkZCQywgJ00nLCB1J+GEkCcpLAogICAgKDB4RkZCRCwgJ00nLCB1J+GEkScpLAogICAgKDB4RkZCRSwgJ00nLCB1J+GEkicpLAogICAgKDB4RkZCRiwgJ1gnKSwKICAgICgweEZGQzIsICdNJywgdSfhhaEnKSwKICAgICgweEZGQzMsICdNJywgdSfhhaInKSwKICAgICgweEZGQzQsICdNJywgdSfhhaMnKSwKICAgICgweEZGQzUsICdNJywgdSfhhaQnKSwKICAgICgweEZGQzYsICdNJywgdSfhhaUnKSwKICAgICgweEZGQzcsICdNJywgdSfhhaYnKSwKICAgICgweEZGQzgsICdYJyksCiAgICAoMHhGRkNBLCAnTScsIHUn4YWnJyksCiAgICAoMHhGRkNCLCAnTScsIHUn4YWoJyksCiAgICAoMHhGRkNDLCAnTScsIHUn4YWpJyksCiAgICAoMHhGRkNELCAnTScsIHUn4YWqJyksCiAgICBdCgpkZWYgX3NlZ181MSgpOgogICAgcmV0dXJuIFsKICAgICgweEZGQ0UsICdNJywgdSfhhasnKSwKICAgICgweEZGQ0YsICdNJywgdSfhhawnKSwKICAgICgweEZGRDAsICdYJyksCiAgICAoMHhGRkQyLCAnTScsIHUn4YWtJyksCiAgICAoMHhGRkQzLCAnTScsIHUn4YWuJyksCiAgICAoMHhGRkQ0LCAnTScsIHUn4YWvJyksCiAgICAoMHhGRkQ1LCAnTScsIHUn4YWwJyksCiAgICAoMHhGRkQ2LCAnTScsIHUn4YWxJyksCiAgICAoMHhGRkQ3LCAnTScsIHUn4YWyJyksCiAgICAoMHhGRkQ4LCAnWCcpLAogICAgKDB4RkZEQSwgJ00nLCB1J+GFsycpLAogICAgKDB4RkZEQiwgJ00nLCB1J+GFtCcpLAogICAgKDB4RkZEQywgJ00nLCB1J+GFtScpLAogICAgKDB4RkZERCwgJ1gnKSwKICAgICgweEZGRTAsICdNJywgdSfCoicpLAogICAgKDB4RkZFMSwgJ00nLCB1J8KjJyksCiAgICAoMHhGRkUyLCAnTScsIHUnwqwnKSwKICAgICgweEZGRTMsICczJywgdScgzIQnKSwKICAgICgweEZGRTQsICdNJywgdSfCpicpLAogICAgKDB4RkZFNSwgJ00nLCB1J8KlJyksCiAgICAoMHhGRkU2LCAnTScsIHUn4oKpJyksCiAgICAoMHhGRkU3LCAnWCcpLAogICAgKDB4RkZFOCwgJ00nLCB1J+KUgicpLAogICAgKDB4RkZFOSwgJ00nLCB1J+KGkCcpLAogICAgKDB4RkZFQSwgJ00nLCB1J+KGkScpLAogICAgKDB4RkZFQiwgJ00nLCB1J+KGkicpLAogICAgKDB4RkZFQywgJ00nLCB1J+KGkycpLAogICAgKDB4RkZFRCwgJ00nLCB1J+KWoCcpLAogICAgKDB4RkZFRSwgJ00nLCB1J+KXiycpLAogICAgKDB4RkZFRiwgJ1gnKSwKICAgICgweDEwMDAwLCAnVicpLAogICAgKDB4MTAwMEMsICdYJyksCiAgICAoMHgxMDAwRCwgJ1YnKSwKICAgICgweDEwMDI3LCAnWCcpLAogICAgKDB4MTAwMjgsICdWJyksCiAgICAoMHgxMDAzQiwgJ1gnKSwKICAgICgweDEwMDNDLCAnVicpLAogICAgKDB4MTAwM0UsICdYJyksCiAgICAoMHgxMDAzRiwgJ1YnKSwKICAgICgweDEwMDRFLCAnWCcpLAogICAgKDB4MTAwNTAsICdWJyksCiAgICAoMHgxMDA1RSwgJ1gnKSwKICAgICgweDEwMDgwLCAnVicpLAogICAgKDB4MTAwRkIsICdYJyksCiAgICAoMHgxMDEwMCwgJ1YnKSwKICAgICgweDEwMTAzLCAnWCcpLAogICAgKDB4MTAxMDcsICdWJyksCiAgICAoMHgxMDEzNCwgJ1gnKSwKICAgICgweDEwMTM3LCAnVicpLAogICAgKDB4MTAxOEIsICdYJyksCiAgICAoMHgxMDE5MCwgJ1YnKSwKICAgICgweDEwMTlDLCAnWCcpLAogICAgKDB4MTAxRDAsICdWJyksCiAgICAoMHgxMDFGRSwgJ1gnKSwKICAgICgweDEwMjgwLCAnVicpLAogICAgKDB4MTAyOUQsICdYJyksCiAgICAoMHgxMDJBMCwgJ1YnKSwKICAgICgweDEwMkQxLCAnWCcpLAogICAgKDB4MTAzMDAsICdWJyksCiAgICAoMHgxMDMxRiwgJ1gnKSwKICAgICgweDEwMzIwLCAnVicpLAogICAgKDB4MTAzMjQsICdYJyksCiAgICAoMHgxMDMzMCwgJ1YnKSwKICAgICgweDEwMzRCLCAnWCcpLAogICAgKDB4MTAzODAsICdWJyksCiAgICAoMHgxMDM5RSwgJ1gnKSwKICAgICgweDEwMzlGLCAnVicpLAogICAgKDB4MTAzQzQsICdYJyksCiAgICAoMHgxMDNDOCwgJ1YnKSwKICAgICgweDEwM0Q2LCAnWCcpLAogICAgKDB4MTA0MDAsICdNJywgdSfwkJCoJyksCiAgICAoMHgxMDQwMSwgJ00nLCB1J/CQkKknKSwKICAgICgweDEwNDAyLCAnTScsIHUn8JCQqicpLAogICAgKDB4MTA0MDMsICdNJywgdSfwkJCrJyksCiAgICAoMHgxMDQwNCwgJ00nLCB1J/CQkKwnKSwKICAgICgweDEwNDA1LCAnTScsIHUn8JCQrScpLAogICAgKDB4MTA0MDYsICdNJywgdSfwkJCuJyksCiAgICAoMHgxMDQwNywgJ00nLCB1J/CQkK8nKSwKICAgICgweDEwNDA4LCAnTScsIHUn8JCQsCcpLAogICAgKDB4MTA0MDksICdNJywgdSfwkJCxJyksCiAgICAoMHgxMDQwQSwgJ00nLCB1J/CQkLInKSwKICAgICgweDEwNDBCLCAnTScsIHUn8JCQsycpLAogICAgKDB4MTA0MEMsICdNJywgdSfwkJC0JyksCiAgICAoMHgxMDQwRCwgJ00nLCB1J/CQkLUnKSwKICAgICgweDEwNDBFLCAnTScsIHUn8JCQticpLAogICAgKDB4MTA0MEYsICdNJywgdSfwkJC3JyksCiAgICAoMHgxMDQxMCwgJ00nLCB1J/CQkLgnKSwKICAgICgweDEwNDExLCAnTScsIHUn8JCQuScpLAogICAgKDB4MTA0MTIsICdNJywgdSfwkJC6JyksCiAgICAoMHgxMDQxMywgJ00nLCB1J/CQkLsnKSwKICAgICgweDEwNDE0LCAnTScsIHUn8JCQvCcpLAogICAgKDB4MTA0MTUsICdNJywgdSfwkJC9JyksCiAgICAoMHgxMDQxNiwgJ00nLCB1J/CQkL4nKSwKICAgICgweDEwNDE3LCAnTScsIHUn8JCQvycpLAogICAgKDB4MTA0MTgsICdNJywgdSfwkJGAJyksCiAgICAoMHgxMDQxOSwgJ00nLCB1J/CQkYEnKSwKICAgICgweDEwNDFBLCAnTScsIHUn8JCRgicpLAogICAgKDB4MTA0MUIsICdNJywgdSfwkJGDJyksCiAgICAoMHgxMDQxQywgJ00nLCB1J/CQkYQnKSwKICAgICgweDEwNDFELCAnTScsIHUn8JCRhScpLAogICAgXQoKZGVmIF9zZWdfNTIoKToKICAgIHJldHVybiBbCiAgICAoMHgxMDQxRSwgJ00nLCB1J/CQkYYnKSwKICAgICgweDEwNDFGLCAnTScsIHUn8JCRhycpLAogICAgKDB4MTA0MjAsICdNJywgdSfwkJGIJyksCiAgICAoMHgxMDQyMSwgJ00nLCB1J/CQkYknKSwKICAgICgweDEwNDIyLCAnTScsIHUn8JCRiicpLAogICAgKDB4MTA0MjMsICdNJywgdSfwkJGLJyksCiAgICAoMHgxMDQyNCwgJ00nLCB1J/CQkYwnKSwKICAgICgweDEwNDI1LCAnTScsIHUn8JCRjScpLAogICAgKDB4MTA0MjYsICdNJywgdSfwkJGOJyksCiAgICAoMHgxMDQyNywgJ00nLCB1J/CQkY8nKSwKICAgICgweDEwNDI4LCAnVicpLAogICAgKDB4MTA0OUUsICdYJyksCiAgICAoMHgxMDRBMCwgJ1YnKSwKICAgICgweDEwNEFBLCAnWCcpLAogICAgKDB4MTA4MDAsICdWJyksCiAgICAoMHgxMDgwNiwgJ1gnKSwKICAgICgweDEwODA4LCAnVicpLAogICAgKDB4MTA4MDksICdYJyksCiAgICAoMHgxMDgwQSwgJ1YnKSwKICAgICgweDEwODM2LCAnWCcpLAogICAgKDB4MTA4MzcsICdWJyksCiAgICAoMHgxMDgzOSwgJ1gnKSwKICAgICgweDEwODNDLCAnVicpLAogICAgKDB4MTA4M0QsICdYJyksCiAgICAoMHgxMDgzRiwgJ1YnKSwKICAgICgweDEwODU2LCAnWCcpLAogICAgKDB4MTA4NTcsICdWJyksCiAgICAoMHgxMDg2MCwgJ1gnKSwKICAgICgweDEwOTAwLCAnVicpLAogICAgKDB4MTA5MUMsICdYJyksCiAgICAoMHgxMDkxRiwgJ1YnKSwKICAgICgweDEwOTNBLCAnWCcpLAogICAgKDB4MTA5M0YsICdWJyksCiAgICAoMHgxMDk0MCwgJ1gnKSwKICAgICgweDEwOTgwLCAnVicpLAogICAgKDB4MTA5QjgsICdYJyksCiAgICAoMHgxMDlCRSwgJ1YnKSwKICAgICgweDEwOUMwLCAnWCcpLAogICAgKDB4MTBBMDAsICdWJyksCiAgICAoMHgxMEEwNCwgJ1gnKSwKICAgICgweDEwQTA1LCAnVicpLAogICAgKDB4MTBBMDcsICdYJyksCiAgICAoMHgxMEEwQywgJ1YnKSwKICAgICgweDEwQTE0LCAnWCcpLAogICAgKDB4MTBBMTUsICdWJyksCiAgICAoMHgxMEExOCwgJ1gnKSwKICAgICgweDEwQTE5LCAnVicpLAogICAgKDB4MTBBMzQsICdYJyksCiAgICAoMHgxMEEzOCwgJ1YnKSwKICAgICgweDEwQTNCLCAnWCcpLAogICAgKDB4MTBBM0YsICdWJyksCiAgICAoMHgxMEE0OCwgJ1gnKSwKICAgICgweDEwQTUwLCAnVicpLAogICAgKDB4MTBBNTksICdYJyksCiAgICAoMHgxMEE2MCwgJ1YnKSwKICAgICgweDEwQTgwLCAnWCcpLAogICAgKDB4MTBCMDAsICdWJyksCiAgICAoMHgxMEIzNiwgJ1gnKSwKICAgICgweDEwQjM5LCAnVicpLAogICAgKDB4MTBCNTYsICdYJyksCiAgICAoMHgxMEI1OCwgJ1YnKSwKICAgICgweDEwQjczLCAnWCcpLAogICAgKDB4MTBCNzgsICdWJyksCiAgICAoMHgxMEI4MCwgJ1gnKSwKICAgICgweDEwQzAwLCAnVicpLAogICAgKDB4MTBDNDksICdYJyksCiAgICAoMHgxMEU2MCwgJ1YnKSwKICAgICgweDEwRTdGLCAnWCcpLAogICAgKDB4MTEwMDAsICdWJyksCiAgICAoMHgxMTA0RSwgJ1gnKSwKICAgICgweDExMDUyLCAnVicpLAogICAgKDB4MTEwNzAsICdYJyksCiAgICAoMHgxMTA4MCwgJ1YnKSwKICAgICgweDExMEJELCAnWCcpLAogICAgKDB4MTEwQkUsICdWJyksCiAgICAoMHgxMTBDMiwgJ1gnKSwKICAgICgweDExMEQwLCAnVicpLAogICAgKDB4MTEwRTksICdYJyksCiAgICAoMHgxMTBGMCwgJ1YnKSwKICAgICgweDExMEZBLCAnWCcpLAogICAgKDB4MTExMDAsICdWJyksCiAgICAoMHgxMTEzNSwgJ1gnKSwKICAgICgweDExMTM2LCAnVicpLAogICAgKDB4MTExNDQsICdYJyksCiAgICAoMHgxMTE4MCwgJ1YnKSwKICAgICgweDExMUM5LCAnWCcpLAogICAgKDB4MTExRDAsICdWJyksCiAgICAoMHgxMTFEQSwgJ1gnKSwKICAgICgweDExNjgwLCAnVicpLAogICAgKDB4MTE2QjgsICdYJyksCiAgICAoMHgxMTZDMCwgJ1YnKSwKICAgICgweDExNkNBLCAnWCcpLAogICAgKDB4MTIwMDAsICdWJyksCiAgICAoMHgxMjM2RiwgJ1gnKSwKICAgICgweDEyNDAwLCAnVicpLAogICAgKDB4MTI0NjMsICdYJyksCiAgICAoMHgxMjQ3MCwgJ1YnKSwKICAgICgweDEyNDc0LCAnWCcpLAogICAgKDB4MTMwMDAsICdWJyksCiAgICAoMHgxMzQyRiwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzUzKCk6CiAgICByZXR1cm4gWwogICAgKDB4MTY4MDAsICdWJyksCiAgICAoMHgxNkEzOSwgJ1gnKSwKICAgICgweDE2RjAwLCAnVicpLAogICAgKDB4MTZGNDUsICdYJyksCiAgICAoMHgxNkY1MCwgJ1YnKSwKICAgICgweDE2RjdGLCAnWCcpLAogICAgKDB4MTZGOEYsICdWJyksCiAgICAoMHgxNkZBMCwgJ1gnKSwKICAgICgweDFCMDAwLCAnVicpLAogICAgKDB4MUIwMDIsICdYJyksCiAgICAoMHgxRDAwMCwgJ1YnKSwKICAgICgweDFEMEY2LCAnWCcpLAogICAgKDB4MUQxMDAsICdWJyksCiAgICAoMHgxRDEyNywgJ1gnKSwKICAgICgweDFEMTI5LCAnVicpLAogICAgKDB4MUQxNUUsICdNJywgdSfwnYWX8J2FpScpLAogICAgKDB4MUQxNUYsICdNJywgdSfwnYWY8J2FpScpLAogICAgKDB4MUQxNjAsICdNJywgdSfwnYWY8J2FpfCdha4nKSwKICAgICgweDFEMTYxLCAnTScsIHUn8J2FmPCdhaXwnYWvJyksCiAgICAoMHgxRDE2MiwgJ00nLCB1J/CdhZjwnYWl8J2FsCcpLAogICAgKDB4MUQxNjMsICdNJywgdSfwnYWY8J2FpfCdhbEnKSwKICAgICgweDFEMTY0LCAnTScsIHUn8J2FmPCdhaXwnYWyJyksCiAgICAoMHgxRDE2NSwgJ1YnKSwKICAgICgweDFEMTczLCAnWCcpLAogICAgKDB4MUQxN0IsICdWJyksCiAgICAoMHgxRDFCQiwgJ00nLCB1J/CdhrnwnYWlJyksCiAgICAoMHgxRDFCQywgJ00nLCB1J/CdhrrwnYWlJyksCiAgICAoMHgxRDFCRCwgJ00nLCB1J/CdhrnwnYWl8J2FricpLAogICAgKDB4MUQxQkUsICdNJywgdSfwnYa68J2FpfCdha4nKSwKICAgICgweDFEMUJGLCAnTScsIHUn8J2GufCdhaXwnYWvJyksCiAgICAoMHgxRDFDMCwgJ00nLCB1J/CdhrrwnYWl8J2FrycpLAogICAgKDB4MUQxQzEsICdWJyksCiAgICAoMHgxRDFERSwgJ1gnKSwKICAgICgweDFEMjAwLCAnVicpLAogICAgKDB4MUQyNDYsICdYJyksCiAgICAoMHgxRDMwMCwgJ1YnKSwKICAgICgweDFEMzU3LCAnWCcpLAogICAgKDB4MUQzNjAsICdWJyksCiAgICAoMHgxRDM3MiwgJ1gnKSwKICAgICgweDFENDAwLCAnTScsIHUnYScpLAogICAgKDB4MUQ0MDEsICdNJywgdSdiJyksCiAgICAoMHgxRDQwMiwgJ00nLCB1J2MnKSwKICAgICgweDFENDAzLCAnTScsIHUnZCcpLAogICAgKDB4MUQ0MDQsICdNJywgdSdlJyksCiAgICAoMHgxRDQwNSwgJ00nLCB1J2YnKSwKICAgICgweDFENDA2LCAnTScsIHUnZycpLAogICAgKDB4MUQ0MDcsICdNJywgdSdoJyksCiAgICAoMHgxRDQwOCwgJ00nLCB1J2knKSwKICAgICgweDFENDA5LCAnTScsIHUnaicpLAogICAgKDB4MUQ0MEEsICdNJywgdSdrJyksCiAgICAoMHgxRDQwQiwgJ00nLCB1J2wnKSwKICAgICgweDFENDBDLCAnTScsIHUnbScpLAogICAgKDB4MUQ0MEQsICdNJywgdSduJyksCiAgICAoMHgxRDQwRSwgJ00nLCB1J28nKSwKICAgICgweDFENDBGLCAnTScsIHUncCcpLAogICAgKDB4MUQ0MTAsICdNJywgdSdxJyksCiAgICAoMHgxRDQxMSwgJ00nLCB1J3InKSwKICAgICgweDFENDEyLCAnTScsIHUncycpLAogICAgKDB4MUQ0MTMsICdNJywgdSd0JyksCiAgICAoMHgxRDQxNCwgJ00nLCB1J3UnKSwKICAgICgweDFENDE1LCAnTScsIHUndicpLAogICAgKDB4MUQ0MTYsICdNJywgdSd3JyksCiAgICAoMHgxRDQxNywgJ00nLCB1J3gnKSwKICAgICgweDFENDE4LCAnTScsIHUneScpLAogICAgKDB4MUQ0MTksICdNJywgdSd6JyksCiAgICAoMHgxRDQxQSwgJ00nLCB1J2EnKSwKICAgICgweDFENDFCLCAnTScsIHUnYicpLAogICAgKDB4MUQ0MUMsICdNJywgdSdjJyksCiAgICAoMHgxRDQxRCwgJ00nLCB1J2QnKSwKICAgICgweDFENDFFLCAnTScsIHUnZScpLAogICAgKDB4MUQ0MUYsICdNJywgdSdmJyksCiAgICAoMHgxRDQyMCwgJ00nLCB1J2cnKSwKICAgICgweDFENDIxLCAnTScsIHUnaCcpLAogICAgKDB4MUQ0MjIsICdNJywgdSdpJyksCiAgICAoMHgxRDQyMywgJ00nLCB1J2onKSwKICAgICgweDFENDI0LCAnTScsIHUnaycpLAogICAgKDB4MUQ0MjUsICdNJywgdSdsJyksCiAgICAoMHgxRDQyNiwgJ00nLCB1J20nKSwKICAgICgweDFENDI3LCAnTScsIHUnbicpLAogICAgKDB4MUQ0MjgsICdNJywgdSdvJyksCiAgICAoMHgxRDQyOSwgJ00nLCB1J3AnKSwKICAgICgweDFENDJBLCAnTScsIHUncScpLAogICAgKDB4MUQ0MkIsICdNJywgdSdyJyksCiAgICAoMHgxRDQyQywgJ00nLCB1J3MnKSwKICAgICgweDFENDJELCAnTScsIHUndCcpLAogICAgKDB4MUQ0MkUsICdNJywgdSd1JyksCiAgICAoMHgxRDQyRiwgJ00nLCB1J3YnKSwKICAgICgweDFENDMwLCAnTScsIHUndycpLAogICAgKDB4MUQ0MzEsICdNJywgdSd4JyksCiAgICAoMHgxRDQzMiwgJ00nLCB1J3knKSwKICAgICgweDFENDMzLCAnTScsIHUneicpLAogICAgKDB4MUQ0MzQsICdNJywgdSdhJyksCiAgICAoMHgxRDQzNSwgJ00nLCB1J2InKSwKICAgICgweDFENDM2LCAnTScsIHUnYycpLAogICAgKDB4MUQ0MzcsICdNJywgdSdkJyksCiAgICAoMHgxRDQzOCwgJ00nLCB1J2UnKSwKICAgICgweDFENDM5LCAnTScsIHUnZicpLAogICAgKDB4MUQ0M0EsICdNJywgdSdnJyksCiAgICAoMHgxRDQzQiwgJ00nLCB1J2gnKSwKICAgICgweDFENDNDLCAnTScsIHUnaScpLAogICAgXQoKZGVmIF9zZWdfNTQoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDQzRCwgJ00nLCB1J2onKSwKICAgICgweDFENDNFLCAnTScsIHUnaycpLAogICAgKDB4MUQ0M0YsICdNJywgdSdsJyksCiAgICAoMHgxRDQ0MCwgJ00nLCB1J20nKSwKICAgICgweDFENDQxLCAnTScsIHUnbicpLAogICAgKDB4MUQ0NDIsICdNJywgdSdvJyksCiAgICAoMHgxRDQ0MywgJ00nLCB1J3AnKSwKICAgICgweDFENDQ0LCAnTScsIHUncScpLAogICAgKDB4MUQ0NDUsICdNJywgdSdyJyksCiAgICAoMHgxRDQ0NiwgJ00nLCB1J3MnKSwKICAgICgweDFENDQ3LCAnTScsIHUndCcpLAogICAgKDB4MUQ0NDgsICdNJywgdSd1JyksCiAgICAoMHgxRDQ0OSwgJ00nLCB1J3YnKSwKICAgICgweDFENDRBLCAnTScsIHUndycpLAogICAgKDB4MUQ0NEIsICdNJywgdSd4JyksCiAgICAoMHgxRDQ0QywgJ00nLCB1J3knKSwKICAgICgweDFENDRELCAnTScsIHUneicpLAogICAgKDB4MUQ0NEUsICdNJywgdSdhJyksCiAgICAoMHgxRDQ0RiwgJ00nLCB1J2InKSwKICAgICgweDFENDUwLCAnTScsIHUnYycpLAogICAgKDB4MUQ0NTEsICdNJywgdSdkJyksCiAgICAoMHgxRDQ1MiwgJ00nLCB1J2UnKSwKICAgICgweDFENDUzLCAnTScsIHUnZicpLAogICAgKDB4MUQ0NTQsICdNJywgdSdnJyksCiAgICAoMHgxRDQ1NSwgJ1gnKSwKICAgICgweDFENDU2LCAnTScsIHUnaScpLAogICAgKDB4MUQ0NTcsICdNJywgdSdqJyksCiAgICAoMHgxRDQ1OCwgJ00nLCB1J2snKSwKICAgICgweDFENDU5LCAnTScsIHUnbCcpLAogICAgKDB4MUQ0NUEsICdNJywgdSdtJyksCiAgICAoMHgxRDQ1QiwgJ00nLCB1J24nKSwKICAgICgweDFENDVDLCAnTScsIHUnbycpLAogICAgKDB4MUQ0NUQsICdNJywgdSdwJyksCiAgICAoMHgxRDQ1RSwgJ00nLCB1J3EnKSwKICAgICgweDFENDVGLCAnTScsIHUncicpLAogICAgKDB4MUQ0NjAsICdNJywgdSdzJyksCiAgICAoMHgxRDQ2MSwgJ00nLCB1J3QnKSwKICAgICgweDFENDYyLCAnTScsIHUndScpLAogICAgKDB4MUQ0NjMsICdNJywgdSd2JyksCiAgICAoMHgxRDQ2NCwgJ00nLCB1J3cnKSwKICAgICgweDFENDY1LCAnTScsIHUneCcpLAogICAgKDB4MUQ0NjYsICdNJywgdSd5JyksCiAgICAoMHgxRDQ2NywgJ00nLCB1J3onKSwKICAgICgweDFENDY4LCAnTScsIHUnYScpLAogICAgKDB4MUQ0NjksICdNJywgdSdiJyksCiAgICAoMHgxRDQ2QSwgJ00nLCB1J2MnKSwKICAgICgweDFENDZCLCAnTScsIHUnZCcpLAogICAgKDB4MUQ0NkMsICdNJywgdSdlJyksCiAgICAoMHgxRDQ2RCwgJ00nLCB1J2YnKSwKICAgICgweDFENDZFLCAnTScsIHUnZycpLAogICAgKDB4MUQ0NkYsICdNJywgdSdoJyksCiAgICAoMHgxRDQ3MCwgJ00nLCB1J2knKSwKICAgICgweDFENDcxLCAnTScsIHUnaicpLAogICAgKDB4MUQ0NzIsICdNJywgdSdrJyksCiAgICAoMHgxRDQ3MywgJ00nLCB1J2wnKSwKICAgICgweDFENDc0LCAnTScsIHUnbScpLAogICAgKDB4MUQ0NzUsICdNJywgdSduJyksCiAgICAoMHgxRDQ3NiwgJ00nLCB1J28nKSwKICAgICgweDFENDc3LCAnTScsIHUncCcpLAogICAgKDB4MUQ0NzgsICdNJywgdSdxJyksCiAgICAoMHgxRDQ3OSwgJ00nLCB1J3InKSwKICAgICgweDFENDdBLCAnTScsIHUncycpLAogICAgKDB4MUQ0N0IsICdNJywgdSd0JyksCiAgICAoMHgxRDQ3QywgJ00nLCB1J3UnKSwKICAgICgweDFENDdELCAnTScsIHUndicpLAogICAgKDB4MUQ0N0UsICdNJywgdSd3JyksCiAgICAoMHgxRDQ3RiwgJ00nLCB1J3gnKSwKICAgICgweDFENDgwLCAnTScsIHUneScpLAogICAgKDB4MUQ0ODEsICdNJywgdSd6JyksCiAgICAoMHgxRDQ4MiwgJ00nLCB1J2EnKSwKICAgICgweDFENDgzLCAnTScsIHUnYicpLAogICAgKDB4MUQ0ODQsICdNJywgdSdjJyksCiAgICAoMHgxRDQ4NSwgJ00nLCB1J2QnKSwKICAgICgweDFENDg2LCAnTScsIHUnZScpLAogICAgKDB4MUQ0ODcsICdNJywgdSdmJyksCiAgICAoMHgxRDQ4OCwgJ00nLCB1J2cnKSwKICAgICgweDFENDg5LCAnTScsIHUnaCcpLAogICAgKDB4MUQ0OEEsICdNJywgdSdpJyksCiAgICAoMHgxRDQ4QiwgJ00nLCB1J2onKSwKICAgICgweDFENDhDLCAnTScsIHUnaycpLAogICAgKDB4MUQ0OEQsICdNJywgdSdsJyksCiAgICAoMHgxRDQ4RSwgJ00nLCB1J20nKSwKICAgICgweDFENDhGLCAnTScsIHUnbicpLAogICAgKDB4MUQ0OTAsICdNJywgdSdvJyksCiAgICAoMHgxRDQ5MSwgJ00nLCB1J3AnKSwKICAgICgweDFENDkyLCAnTScsIHUncScpLAogICAgKDB4MUQ0OTMsICdNJywgdSdyJyksCiAgICAoMHgxRDQ5NCwgJ00nLCB1J3MnKSwKICAgICgweDFENDk1LCAnTScsIHUndCcpLAogICAgKDB4MUQ0OTYsICdNJywgdSd1JyksCiAgICAoMHgxRDQ5NywgJ00nLCB1J3YnKSwKICAgICgweDFENDk4LCAnTScsIHUndycpLAogICAgKDB4MUQ0OTksICdNJywgdSd4JyksCiAgICAoMHgxRDQ5QSwgJ00nLCB1J3knKSwKICAgICgweDFENDlCLCAnTScsIHUneicpLAogICAgKDB4MUQ0OUMsICdNJywgdSdhJyksCiAgICAoMHgxRDQ5RCwgJ1gnKSwKICAgICgweDFENDlFLCAnTScsIHUnYycpLAogICAgKDB4MUQ0OUYsICdNJywgdSdkJyksCiAgICAoMHgxRDRBMCwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzU1KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ0QTIsICdNJywgdSdnJyksCiAgICAoMHgxRDRBMywgJ1gnKSwKICAgICgweDFENEE1LCAnTScsIHUnaicpLAogICAgKDB4MUQ0QTYsICdNJywgdSdrJyksCiAgICAoMHgxRDRBNywgJ1gnKSwKICAgICgweDFENEE5LCAnTScsIHUnbicpLAogICAgKDB4MUQ0QUEsICdNJywgdSdvJyksCiAgICAoMHgxRDRBQiwgJ00nLCB1J3AnKSwKICAgICgweDFENEFDLCAnTScsIHUncScpLAogICAgKDB4MUQ0QUQsICdYJyksCiAgICAoMHgxRDRBRSwgJ00nLCB1J3MnKSwKICAgICgweDFENEFGLCAnTScsIHUndCcpLAogICAgKDB4MUQ0QjAsICdNJywgdSd1JyksCiAgICAoMHgxRDRCMSwgJ00nLCB1J3YnKSwKICAgICgweDFENEIyLCAnTScsIHUndycpLAogICAgKDB4MUQ0QjMsICdNJywgdSd4JyksCiAgICAoMHgxRDRCNCwgJ00nLCB1J3knKSwKICAgICgweDFENEI1LCAnTScsIHUneicpLAogICAgKDB4MUQ0QjYsICdNJywgdSdhJyksCiAgICAoMHgxRDRCNywgJ00nLCB1J2InKSwKICAgICgweDFENEI4LCAnTScsIHUnYycpLAogICAgKDB4MUQ0QjksICdNJywgdSdkJyksCiAgICAoMHgxRDRCQSwgJ1gnKSwKICAgICgweDFENEJCLCAnTScsIHUnZicpLAogICAgKDB4MUQ0QkMsICdYJyksCiAgICAoMHgxRDRCRCwgJ00nLCB1J2gnKSwKICAgICgweDFENEJFLCAnTScsIHUnaScpLAogICAgKDB4MUQ0QkYsICdNJywgdSdqJyksCiAgICAoMHgxRDRDMCwgJ00nLCB1J2snKSwKICAgICgweDFENEMxLCAnTScsIHUnbCcpLAogICAgKDB4MUQ0QzIsICdNJywgdSdtJyksCiAgICAoMHgxRDRDMywgJ00nLCB1J24nKSwKICAgICgweDFENEM0LCAnWCcpLAogICAgKDB4MUQ0QzUsICdNJywgdSdwJyksCiAgICAoMHgxRDRDNiwgJ00nLCB1J3EnKSwKICAgICgweDFENEM3LCAnTScsIHUncicpLAogICAgKDB4MUQ0QzgsICdNJywgdSdzJyksCiAgICAoMHgxRDRDOSwgJ00nLCB1J3QnKSwKICAgICgweDFENENBLCAnTScsIHUndScpLAogICAgKDB4MUQ0Q0IsICdNJywgdSd2JyksCiAgICAoMHgxRDRDQywgJ00nLCB1J3cnKSwKICAgICgweDFENENELCAnTScsIHUneCcpLAogICAgKDB4MUQ0Q0UsICdNJywgdSd5JyksCiAgICAoMHgxRDRDRiwgJ00nLCB1J3onKSwKICAgICgweDFENEQwLCAnTScsIHUnYScpLAogICAgKDB4MUQ0RDEsICdNJywgdSdiJyksCiAgICAoMHgxRDREMiwgJ00nLCB1J2MnKSwKICAgICgweDFENEQzLCAnTScsIHUnZCcpLAogICAgKDB4MUQ0RDQsICdNJywgdSdlJyksCiAgICAoMHgxRDRENSwgJ00nLCB1J2YnKSwKICAgICgweDFENEQ2LCAnTScsIHUnZycpLAogICAgKDB4MUQ0RDcsICdNJywgdSdoJyksCiAgICAoMHgxRDREOCwgJ00nLCB1J2knKSwKICAgICgweDFENEQ5LCAnTScsIHUnaicpLAogICAgKDB4MUQ0REEsICdNJywgdSdrJyksCiAgICAoMHgxRDREQiwgJ00nLCB1J2wnKSwKICAgICgweDFENERDLCAnTScsIHUnbScpLAogICAgKDB4MUQ0REQsICdNJywgdSduJyksCiAgICAoMHgxRDRERSwgJ00nLCB1J28nKSwKICAgICgweDFENERGLCAnTScsIHUncCcpLAogICAgKDB4MUQ0RTAsICdNJywgdSdxJyksCiAgICAoMHgxRDRFMSwgJ00nLCB1J3InKSwKICAgICgweDFENEUyLCAnTScsIHUncycpLAogICAgKDB4MUQ0RTMsICdNJywgdSd0JyksCiAgICAoMHgxRDRFNCwgJ00nLCB1J3UnKSwKICAgICgweDFENEU1LCAnTScsIHUndicpLAogICAgKDB4MUQ0RTYsICdNJywgdSd3JyksCiAgICAoMHgxRDRFNywgJ00nLCB1J3gnKSwKICAgICgweDFENEU4LCAnTScsIHUneScpLAogICAgKDB4MUQ0RTksICdNJywgdSd6JyksCiAgICAoMHgxRDRFQSwgJ00nLCB1J2EnKSwKICAgICgweDFENEVCLCAnTScsIHUnYicpLAogICAgKDB4MUQ0RUMsICdNJywgdSdjJyksCiAgICAoMHgxRDRFRCwgJ00nLCB1J2QnKSwKICAgICgweDFENEVFLCAnTScsIHUnZScpLAogICAgKDB4MUQ0RUYsICdNJywgdSdmJyksCiAgICAoMHgxRDRGMCwgJ00nLCB1J2cnKSwKICAgICgweDFENEYxLCAnTScsIHUnaCcpLAogICAgKDB4MUQ0RjIsICdNJywgdSdpJyksCiAgICAoMHgxRDRGMywgJ00nLCB1J2onKSwKICAgICgweDFENEY0LCAnTScsIHUnaycpLAogICAgKDB4MUQ0RjUsICdNJywgdSdsJyksCiAgICAoMHgxRDRGNiwgJ00nLCB1J20nKSwKICAgICgweDFENEY3LCAnTScsIHUnbicpLAogICAgKDB4MUQ0RjgsICdNJywgdSdvJyksCiAgICAoMHgxRDRGOSwgJ00nLCB1J3AnKSwKICAgICgweDFENEZBLCAnTScsIHUncScpLAogICAgKDB4MUQ0RkIsICdNJywgdSdyJyksCiAgICAoMHgxRDRGQywgJ00nLCB1J3MnKSwKICAgICgweDFENEZELCAnTScsIHUndCcpLAogICAgKDB4MUQ0RkUsICdNJywgdSd1JyksCiAgICAoMHgxRDRGRiwgJ00nLCB1J3YnKSwKICAgICgweDFENTAwLCAnTScsIHUndycpLAogICAgKDB4MUQ1MDEsICdNJywgdSd4JyksCiAgICAoMHgxRDUwMiwgJ00nLCB1J3knKSwKICAgICgweDFENTAzLCAnTScsIHUneicpLAogICAgKDB4MUQ1MDQsICdNJywgdSdhJyksCiAgICAoMHgxRDUwNSwgJ00nLCB1J2InKSwKICAgICgweDFENTA2LCAnWCcpLAogICAgKDB4MUQ1MDcsICdNJywgdSdkJyksCiAgICBdCgpkZWYgX3NlZ181NigpOgogICAgcmV0dXJuIFsKICAgICgweDFENTA4LCAnTScsIHUnZScpLAogICAgKDB4MUQ1MDksICdNJywgdSdmJyksCiAgICAoMHgxRDUwQSwgJ00nLCB1J2cnKSwKICAgICgweDFENTBCLCAnWCcpLAogICAgKDB4MUQ1MEQsICdNJywgdSdqJyksCiAgICAoMHgxRDUwRSwgJ00nLCB1J2snKSwKICAgICgweDFENTBGLCAnTScsIHUnbCcpLAogICAgKDB4MUQ1MTAsICdNJywgdSdtJyksCiAgICAoMHgxRDUxMSwgJ00nLCB1J24nKSwKICAgICgweDFENTEyLCAnTScsIHUnbycpLAogICAgKDB4MUQ1MTMsICdNJywgdSdwJyksCiAgICAoMHgxRDUxNCwgJ00nLCB1J3EnKSwKICAgICgweDFENTE1LCAnWCcpLAogICAgKDB4MUQ1MTYsICdNJywgdSdzJyksCiAgICAoMHgxRDUxNywgJ00nLCB1J3QnKSwKICAgICgweDFENTE4LCAnTScsIHUndScpLAogICAgKDB4MUQ1MTksICdNJywgdSd2JyksCiAgICAoMHgxRDUxQSwgJ00nLCB1J3cnKSwKICAgICgweDFENTFCLCAnTScsIHUneCcpLAogICAgKDB4MUQ1MUMsICdNJywgdSd5JyksCiAgICAoMHgxRDUxRCwgJ1gnKSwKICAgICgweDFENTFFLCAnTScsIHUnYScpLAogICAgKDB4MUQ1MUYsICdNJywgdSdiJyksCiAgICAoMHgxRDUyMCwgJ00nLCB1J2MnKSwKICAgICgweDFENTIxLCAnTScsIHUnZCcpLAogICAgKDB4MUQ1MjIsICdNJywgdSdlJyksCiAgICAoMHgxRDUyMywgJ00nLCB1J2YnKSwKICAgICgweDFENTI0LCAnTScsIHUnZycpLAogICAgKDB4MUQ1MjUsICdNJywgdSdoJyksCiAgICAoMHgxRDUyNiwgJ00nLCB1J2knKSwKICAgICgweDFENTI3LCAnTScsIHUnaicpLAogICAgKDB4MUQ1MjgsICdNJywgdSdrJyksCiAgICAoMHgxRDUyOSwgJ00nLCB1J2wnKSwKICAgICgweDFENTJBLCAnTScsIHUnbScpLAogICAgKDB4MUQ1MkIsICdNJywgdSduJyksCiAgICAoMHgxRDUyQywgJ00nLCB1J28nKSwKICAgICgweDFENTJELCAnTScsIHUncCcpLAogICAgKDB4MUQ1MkUsICdNJywgdSdxJyksCiAgICAoMHgxRDUyRiwgJ00nLCB1J3InKSwKICAgICgweDFENTMwLCAnTScsIHUncycpLAogICAgKDB4MUQ1MzEsICdNJywgdSd0JyksCiAgICAoMHgxRDUzMiwgJ00nLCB1J3UnKSwKICAgICgweDFENTMzLCAnTScsIHUndicpLAogICAgKDB4MUQ1MzQsICdNJywgdSd3JyksCiAgICAoMHgxRDUzNSwgJ00nLCB1J3gnKSwKICAgICgweDFENTM2LCAnTScsIHUneScpLAogICAgKDB4MUQ1MzcsICdNJywgdSd6JyksCiAgICAoMHgxRDUzOCwgJ00nLCB1J2EnKSwKICAgICgweDFENTM5LCAnTScsIHUnYicpLAogICAgKDB4MUQ1M0EsICdYJyksCiAgICAoMHgxRDUzQiwgJ00nLCB1J2QnKSwKICAgICgweDFENTNDLCAnTScsIHUnZScpLAogICAgKDB4MUQ1M0QsICdNJywgdSdmJyksCiAgICAoMHgxRDUzRSwgJ00nLCB1J2cnKSwKICAgICgweDFENTNGLCAnWCcpLAogICAgKDB4MUQ1NDAsICdNJywgdSdpJyksCiAgICAoMHgxRDU0MSwgJ00nLCB1J2onKSwKICAgICgweDFENTQyLCAnTScsIHUnaycpLAogICAgKDB4MUQ1NDMsICdNJywgdSdsJyksCiAgICAoMHgxRDU0NCwgJ00nLCB1J20nKSwKICAgICgweDFENTQ1LCAnWCcpLAogICAgKDB4MUQ1NDYsICdNJywgdSdvJyksCiAgICAoMHgxRDU0NywgJ1gnKSwKICAgICgweDFENTRBLCAnTScsIHUncycpLAogICAgKDB4MUQ1NEIsICdNJywgdSd0JyksCiAgICAoMHgxRDU0QywgJ00nLCB1J3UnKSwKICAgICgweDFENTRELCAnTScsIHUndicpLAogICAgKDB4MUQ1NEUsICdNJywgdSd3JyksCiAgICAoMHgxRDU0RiwgJ00nLCB1J3gnKSwKICAgICgweDFENTUwLCAnTScsIHUneScpLAogICAgKDB4MUQ1NTEsICdYJyksCiAgICAoMHgxRDU1MiwgJ00nLCB1J2EnKSwKICAgICgweDFENTUzLCAnTScsIHUnYicpLAogICAgKDB4MUQ1NTQsICdNJywgdSdjJyksCiAgICAoMHgxRDU1NSwgJ00nLCB1J2QnKSwKICAgICgweDFENTU2LCAnTScsIHUnZScpLAogICAgKDB4MUQ1NTcsICdNJywgdSdmJyksCiAgICAoMHgxRDU1OCwgJ00nLCB1J2cnKSwKICAgICgweDFENTU5LCAnTScsIHUnaCcpLAogICAgKDB4MUQ1NUEsICdNJywgdSdpJyksCiAgICAoMHgxRDU1QiwgJ00nLCB1J2onKSwKICAgICgweDFENTVDLCAnTScsIHUnaycpLAogICAgKDB4MUQ1NUQsICdNJywgdSdsJyksCiAgICAoMHgxRDU1RSwgJ00nLCB1J20nKSwKICAgICgweDFENTVGLCAnTScsIHUnbicpLAogICAgKDB4MUQ1NjAsICdNJywgdSdvJyksCiAgICAoMHgxRDU2MSwgJ00nLCB1J3AnKSwKICAgICgweDFENTYyLCAnTScsIHUncScpLAogICAgKDB4MUQ1NjMsICdNJywgdSdyJyksCiAgICAoMHgxRDU2NCwgJ00nLCB1J3MnKSwKICAgICgweDFENTY1LCAnTScsIHUndCcpLAogICAgKDB4MUQ1NjYsICdNJywgdSd1JyksCiAgICAoMHgxRDU2NywgJ00nLCB1J3YnKSwKICAgICgweDFENTY4LCAnTScsIHUndycpLAogICAgKDB4MUQ1NjksICdNJywgdSd4JyksCiAgICAoMHgxRDU2QSwgJ00nLCB1J3knKSwKICAgICgweDFENTZCLCAnTScsIHUneicpLAogICAgKDB4MUQ1NkMsICdNJywgdSdhJyksCiAgICAoMHgxRDU2RCwgJ00nLCB1J2InKSwKICAgICgweDFENTZFLCAnTScsIHUnYycpLAogICAgXQoKZGVmIF9zZWdfNTcoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDU2RiwgJ00nLCB1J2QnKSwKICAgICgweDFENTcwLCAnTScsIHUnZScpLAogICAgKDB4MUQ1NzEsICdNJywgdSdmJyksCiAgICAoMHgxRDU3MiwgJ00nLCB1J2cnKSwKICAgICgweDFENTczLCAnTScsIHUnaCcpLAogICAgKDB4MUQ1NzQsICdNJywgdSdpJyksCiAgICAoMHgxRDU3NSwgJ00nLCB1J2onKSwKICAgICgweDFENTc2LCAnTScsIHUnaycpLAogICAgKDB4MUQ1NzcsICdNJywgdSdsJyksCiAgICAoMHgxRDU3OCwgJ00nLCB1J20nKSwKICAgICgweDFENTc5LCAnTScsIHUnbicpLAogICAgKDB4MUQ1N0EsICdNJywgdSdvJyksCiAgICAoMHgxRDU3QiwgJ00nLCB1J3AnKSwKICAgICgweDFENTdDLCAnTScsIHUncScpLAogICAgKDB4MUQ1N0QsICdNJywgdSdyJyksCiAgICAoMHgxRDU3RSwgJ00nLCB1J3MnKSwKICAgICgweDFENTdGLCAnTScsIHUndCcpLAogICAgKDB4MUQ1ODAsICdNJywgdSd1JyksCiAgICAoMHgxRDU4MSwgJ00nLCB1J3YnKSwKICAgICgweDFENTgyLCAnTScsIHUndycpLAogICAgKDB4MUQ1ODMsICdNJywgdSd4JyksCiAgICAoMHgxRDU4NCwgJ00nLCB1J3knKSwKICAgICgweDFENTg1LCAnTScsIHUneicpLAogICAgKDB4MUQ1ODYsICdNJywgdSdhJyksCiAgICAoMHgxRDU4NywgJ00nLCB1J2InKSwKICAgICgweDFENTg4LCAnTScsIHUnYycpLAogICAgKDB4MUQ1ODksICdNJywgdSdkJyksCiAgICAoMHgxRDU4QSwgJ00nLCB1J2UnKSwKICAgICgweDFENThCLCAnTScsIHUnZicpLAogICAgKDB4MUQ1OEMsICdNJywgdSdnJyksCiAgICAoMHgxRDU4RCwgJ00nLCB1J2gnKSwKICAgICgweDFENThFLCAnTScsIHUnaScpLAogICAgKDB4MUQ1OEYsICdNJywgdSdqJyksCiAgICAoMHgxRDU5MCwgJ00nLCB1J2snKSwKICAgICgweDFENTkxLCAnTScsIHUnbCcpLAogICAgKDB4MUQ1OTIsICdNJywgdSdtJyksCiAgICAoMHgxRDU5MywgJ00nLCB1J24nKSwKICAgICgweDFENTk0LCAnTScsIHUnbycpLAogICAgKDB4MUQ1OTUsICdNJywgdSdwJyksCiAgICAoMHgxRDU5NiwgJ00nLCB1J3EnKSwKICAgICgweDFENTk3LCAnTScsIHUncicpLAogICAgKDB4MUQ1OTgsICdNJywgdSdzJyksCiAgICAoMHgxRDU5OSwgJ00nLCB1J3QnKSwKICAgICgweDFENTlBLCAnTScsIHUndScpLAogICAgKDB4MUQ1OUIsICdNJywgdSd2JyksCiAgICAoMHgxRDU5QywgJ00nLCB1J3cnKSwKICAgICgweDFENTlELCAnTScsIHUneCcpLAogICAgKDB4MUQ1OUUsICdNJywgdSd5JyksCiAgICAoMHgxRDU5RiwgJ00nLCB1J3onKSwKICAgICgweDFENUEwLCAnTScsIHUnYScpLAogICAgKDB4MUQ1QTEsICdNJywgdSdiJyksCiAgICAoMHgxRDVBMiwgJ00nLCB1J2MnKSwKICAgICgweDFENUEzLCAnTScsIHUnZCcpLAogICAgKDB4MUQ1QTQsICdNJywgdSdlJyksCiAgICAoMHgxRDVBNSwgJ00nLCB1J2YnKSwKICAgICgweDFENUE2LCAnTScsIHUnZycpLAogICAgKDB4MUQ1QTcsICdNJywgdSdoJyksCiAgICAoMHgxRDVBOCwgJ00nLCB1J2knKSwKICAgICgweDFENUE5LCAnTScsIHUnaicpLAogICAgKDB4MUQ1QUEsICdNJywgdSdrJyksCiAgICAoMHgxRDVBQiwgJ00nLCB1J2wnKSwKICAgICgweDFENUFDLCAnTScsIHUnbScpLAogICAgKDB4MUQ1QUQsICdNJywgdSduJyksCiAgICAoMHgxRDVBRSwgJ00nLCB1J28nKSwKICAgICgweDFENUFGLCAnTScsIHUncCcpLAogICAgKDB4MUQ1QjAsICdNJywgdSdxJyksCiAgICAoMHgxRDVCMSwgJ00nLCB1J3InKSwKICAgICgweDFENUIyLCAnTScsIHUncycpLAogICAgKDB4MUQ1QjMsICdNJywgdSd0JyksCiAgICAoMHgxRDVCNCwgJ00nLCB1J3UnKSwKICAgICgweDFENUI1LCAnTScsIHUndicpLAogICAgKDB4MUQ1QjYsICdNJywgdSd3JyksCiAgICAoMHgxRDVCNywgJ00nLCB1J3gnKSwKICAgICgweDFENUI4LCAnTScsIHUneScpLAogICAgKDB4MUQ1QjksICdNJywgdSd6JyksCiAgICAoMHgxRDVCQSwgJ00nLCB1J2EnKSwKICAgICgweDFENUJCLCAnTScsIHUnYicpLAogICAgKDB4MUQ1QkMsICdNJywgdSdjJyksCiAgICAoMHgxRDVCRCwgJ00nLCB1J2QnKSwKICAgICgweDFENUJFLCAnTScsIHUnZScpLAogICAgKDB4MUQ1QkYsICdNJywgdSdmJyksCiAgICAoMHgxRDVDMCwgJ00nLCB1J2cnKSwKICAgICgweDFENUMxLCAnTScsIHUnaCcpLAogICAgKDB4MUQ1QzIsICdNJywgdSdpJyksCiAgICAoMHgxRDVDMywgJ00nLCB1J2onKSwKICAgICgweDFENUM0LCAnTScsIHUnaycpLAogICAgKDB4MUQ1QzUsICdNJywgdSdsJyksCiAgICAoMHgxRDVDNiwgJ00nLCB1J20nKSwKICAgICgweDFENUM3LCAnTScsIHUnbicpLAogICAgKDB4MUQ1QzgsICdNJywgdSdvJyksCiAgICAoMHgxRDVDOSwgJ00nLCB1J3AnKSwKICAgICgweDFENUNBLCAnTScsIHUncScpLAogICAgKDB4MUQ1Q0IsICdNJywgdSdyJyksCiAgICAoMHgxRDVDQywgJ00nLCB1J3MnKSwKICAgICgweDFENUNELCAnTScsIHUndCcpLAogICAgKDB4MUQ1Q0UsICdNJywgdSd1JyksCiAgICAoMHgxRDVDRiwgJ00nLCB1J3YnKSwKICAgICgweDFENUQwLCAnTScsIHUndycpLAogICAgKDB4MUQ1RDEsICdNJywgdSd4JyksCiAgICAoMHgxRDVEMiwgJ00nLCB1J3knKSwKICAgIF0KCmRlZiBfc2VnXzU4KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ1RDMsICdNJywgdSd6JyksCiAgICAoMHgxRDVENCwgJ00nLCB1J2EnKSwKICAgICgweDFENUQ1LCAnTScsIHUnYicpLAogICAgKDB4MUQ1RDYsICdNJywgdSdjJyksCiAgICAoMHgxRDVENywgJ00nLCB1J2QnKSwKICAgICgweDFENUQ4LCAnTScsIHUnZScpLAogICAgKDB4MUQ1RDksICdNJywgdSdmJyksCiAgICAoMHgxRDVEQSwgJ00nLCB1J2cnKSwKICAgICgweDFENURCLCAnTScsIHUnaCcpLAogICAgKDB4MUQ1REMsICdNJywgdSdpJyksCiAgICAoMHgxRDVERCwgJ00nLCB1J2onKSwKICAgICgweDFENURFLCAnTScsIHUnaycpLAogICAgKDB4MUQ1REYsICdNJywgdSdsJyksCiAgICAoMHgxRDVFMCwgJ00nLCB1J20nKSwKICAgICgweDFENUUxLCAnTScsIHUnbicpLAogICAgKDB4MUQ1RTIsICdNJywgdSdvJyksCiAgICAoMHgxRDVFMywgJ00nLCB1J3AnKSwKICAgICgweDFENUU0LCAnTScsIHUncScpLAogICAgKDB4MUQ1RTUsICdNJywgdSdyJyksCiAgICAoMHgxRDVFNiwgJ00nLCB1J3MnKSwKICAgICgweDFENUU3LCAnTScsIHUndCcpLAogICAgKDB4MUQ1RTgsICdNJywgdSd1JyksCiAgICAoMHgxRDVFOSwgJ00nLCB1J3YnKSwKICAgICgweDFENUVBLCAnTScsIHUndycpLAogICAgKDB4MUQ1RUIsICdNJywgdSd4JyksCiAgICAoMHgxRDVFQywgJ00nLCB1J3knKSwKICAgICgweDFENUVELCAnTScsIHUneicpLAogICAgKDB4MUQ1RUUsICdNJywgdSdhJyksCiAgICAoMHgxRDVFRiwgJ00nLCB1J2InKSwKICAgICgweDFENUYwLCAnTScsIHUnYycpLAogICAgKDB4MUQ1RjEsICdNJywgdSdkJyksCiAgICAoMHgxRDVGMiwgJ00nLCB1J2UnKSwKICAgICgweDFENUYzLCAnTScsIHUnZicpLAogICAgKDB4MUQ1RjQsICdNJywgdSdnJyksCiAgICAoMHgxRDVGNSwgJ00nLCB1J2gnKSwKICAgICgweDFENUY2LCAnTScsIHUnaScpLAogICAgKDB4MUQ1RjcsICdNJywgdSdqJyksCiAgICAoMHgxRDVGOCwgJ00nLCB1J2snKSwKICAgICgweDFENUY5LCAnTScsIHUnbCcpLAogICAgKDB4MUQ1RkEsICdNJywgdSdtJyksCiAgICAoMHgxRDVGQiwgJ00nLCB1J24nKSwKICAgICgweDFENUZDLCAnTScsIHUnbycpLAogICAgKDB4MUQ1RkQsICdNJywgdSdwJyksCiAgICAoMHgxRDVGRSwgJ00nLCB1J3EnKSwKICAgICgweDFENUZGLCAnTScsIHUncicpLAogICAgKDB4MUQ2MDAsICdNJywgdSdzJyksCiAgICAoMHgxRDYwMSwgJ00nLCB1J3QnKSwKICAgICgweDFENjAyLCAnTScsIHUndScpLAogICAgKDB4MUQ2MDMsICdNJywgdSd2JyksCiAgICAoMHgxRDYwNCwgJ00nLCB1J3cnKSwKICAgICgweDFENjA1LCAnTScsIHUneCcpLAogICAgKDB4MUQ2MDYsICdNJywgdSd5JyksCiAgICAoMHgxRDYwNywgJ00nLCB1J3onKSwKICAgICgweDFENjA4LCAnTScsIHUnYScpLAogICAgKDB4MUQ2MDksICdNJywgdSdiJyksCiAgICAoMHgxRDYwQSwgJ00nLCB1J2MnKSwKICAgICgweDFENjBCLCAnTScsIHUnZCcpLAogICAgKDB4MUQ2MEMsICdNJywgdSdlJyksCiAgICAoMHgxRDYwRCwgJ00nLCB1J2YnKSwKICAgICgweDFENjBFLCAnTScsIHUnZycpLAogICAgKDB4MUQ2MEYsICdNJywgdSdoJyksCiAgICAoMHgxRDYxMCwgJ00nLCB1J2knKSwKICAgICgweDFENjExLCAnTScsIHUnaicpLAogICAgKDB4MUQ2MTIsICdNJywgdSdrJyksCiAgICAoMHgxRDYxMywgJ00nLCB1J2wnKSwKICAgICgweDFENjE0LCAnTScsIHUnbScpLAogICAgKDB4MUQ2MTUsICdNJywgdSduJyksCiAgICAoMHgxRDYxNiwgJ00nLCB1J28nKSwKICAgICgweDFENjE3LCAnTScsIHUncCcpLAogICAgKDB4MUQ2MTgsICdNJywgdSdxJyksCiAgICAoMHgxRDYxOSwgJ00nLCB1J3InKSwKICAgICgweDFENjFBLCAnTScsIHUncycpLAogICAgKDB4MUQ2MUIsICdNJywgdSd0JyksCiAgICAoMHgxRDYxQywgJ00nLCB1J3UnKSwKICAgICgweDFENjFELCAnTScsIHUndicpLAogICAgKDB4MUQ2MUUsICdNJywgdSd3JyksCiAgICAoMHgxRDYxRiwgJ00nLCB1J3gnKSwKICAgICgweDFENjIwLCAnTScsIHUneScpLAogICAgKDB4MUQ2MjEsICdNJywgdSd6JyksCiAgICAoMHgxRDYyMiwgJ00nLCB1J2EnKSwKICAgICgweDFENjIzLCAnTScsIHUnYicpLAogICAgKDB4MUQ2MjQsICdNJywgdSdjJyksCiAgICAoMHgxRDYyNSwgJ00nLCB1J2QnKSwKICAgICgweDFENjI2LCAnTScsIHUnZScpLAogICAgKDB4MUQ2MjcsICdNJywgdSdmJyksCiAgICAoMHgxRDYyOCwgJ00nLCB1J2cnKSwKICAgICgweDFENjI5LCAnTScsIHUnaCcpLAogICAgKDB4MUQ2MkEsICdNJywgdSdpJyksCiAgICAoMHgxRDYyQiwgJ00nLCB1J2onKSwKICAgICgweDFENjJDLCAnTScsIHUnaycpLAogICAgKDB4MUQ2MkQsICdNJywgdSdsJyksCiAgICAoMHgxRDYyRSwgJ00nLCB1J20nKSwKICAgICgweDFENjJGLCAnTScsIHUnbicpLAogICAgKDB4MUQ2MzAsICdNJywgdSdvJyksCiAgICAoMHgxRDYzMSwgJ00nLCB1J3AnKSwKICAgICgweDFENjMyLCAnTScsIHUncScpLAogICAgKDB4MUQ2MzMsICdNJywgdSdyJyksCiAgICAoMHgxRDYzNCwgJ00nLCB1J3MnKSwKICAgICgweDFENjM1LCAnTScsIHUndCcpLAogICAgKDB4MUQ2MzYsICdNJywgdSd1JyksCiAgICBdCgpkZWYgX3NlZ181OSgpOgogICAgcmV0dXJuIFsKICAgICgweDFENjM3LCAnTScsIHUndicpLAogICAgKDB4MUQ2MzgsICdNJywgdSd3JyksCiAgICAoMHgxRDYzOSwgJ00nLCB1J3gnKSwKICAgICgweDFENjNBLCAnTScsIHUneScpLAogICAgKDB4MUQ2M0IsICdNJywgdSd6JyksCiAgICAoMHgxRDYzQywgJ00nLCB1J2EnKSwKICAgICgweDFENjNELCAnTScsIHUnYicpLAogICAgKDB4MUQ2M0UsICdNJywgdSdjJyksCiAgICAoMHgxRDYzRiwgJ00nLCB1J2QnKSwKICAgICgweDFENjQwLCAnTScsIHUnZScpLAogICAgKDB4MUQ2NDEsICdNJywgdSdmJyksCiAgICAoMHgxRDY0MiwgJ00nLCB1J2cnKSwKICAgICgweDFENjQzLCAnTScsIHUnaCcpLAogICAgKDB4MUQ2NDQsICdNJywgdSdpJyksCiAgICAoMHgxRDY0NSwgJ00nLCB1J2onKSwKICAgICgweDFENjQ2LCAnTScsIHUnaycpLAogICAgKDB4MUQ2NDcsICdNJywgdSdsJyksCiAgICAoMHgxRDY0OCwgJ00nLCB1J20nKSwKICAgICgweDFENjQ5LCAnTScsIHUnbicpLAogICAgKDB4MUQ2NEEsICdNJywgdSdvJyksCiAgICAoMHgxRDY0QiwgJ00nLCB1J3AnKSwKICAgICgweDFENjRDLCAnTScsIHUncScpLAogICAgKDB4MUQ2NEQsICdNJywgdSdyJyksCiAgICAoMHgxRDY0RSwgJ00nLCB1J3MnKSwKICAgICgweDFENjRGLCAnTScsIHUndCcpLAogICAgKDB4MUQ2NTAsICdNJywgdSd1JyksCiAgICAoMHgxRDY1MSwgJ00nLCB1J3YnKSwKICAgICgweDFENjUyLCAnTScsIHUndycpLAogICAgKDB4MUQ2NTMsICdNJywgdSd4JyksCiAgICAoMHgxRDY1NCwgJ00nLCB1J3knKSwKICAgICgweDFENjU1LCAnTScsIHUneicpLAogICAgKDB4MUQ2NTYsICdNJywgdSdhJyksCiAgICAoMHgxRDY1NywgJ00nLCB1J2InKSwKICAgICgweDFENjU4LCAnTScsIHUnYycpLAogICAgKDB4MUQ2NTksICdNJywgdSdkJyksCiAgICAoMHgxRDY1QSwgJ00nLCB1J2UnKSwKICAgICgweDFENjVCLCAnTScsIHUnZicpLAogICAgKDB4MUQ2NUMsICdNJywgdSdnJyksCiAgICAoMHgxRDY1RCwgJ00nLCB1J2gnKSwKICAgICgweDFENjVFLCAnTScsIHUnaScpLAogICAgKDB4MUQ2NUYsICdNJywgdSdqJyksCiAgICAoMHgxRDY2MCwgJ00nLCB1J2snKSwKICAgICgweDFENjYxLCAnTScsIHUnbCcpLAogICAgKDB4MUQ2NjIsICdNJywgdSdtJyksCiAgICAoMHgxRDY2MywgJ00nLCB1J24nKSwKICAgICgweDFENjY0LCAnTScsIHUnbycpLAogICAgKDB4MUQ2NjUsICdNJywgdSdwJyksCiAgICAoMHgxRDY2NiwgJ00nLCB1J3EnKSwKICAgICgweDFENjY3LCAnTScsIHUncicpLAogICAgKDB4MUQ2NjgsICdNJywgdSdzJyksCiAgICAoMHgxRDY2OSwgJ00nLCB1J3QnKSwKICAgICgweDFENjZBLCAnTScsIHUndScpLAogICAgKDB4MUQ2NkIsICdNJywgdSd2JyksCiAgICAoMHgxRDY2QywgJ00nLCB1J3cnKSwKICAgICgweDFENjZELCAnTScsIHUneCcpLAogICAgKDB4MUQ2NkUsICdNJywgdSd5JyksCiAgICAoMHgxRDY2RiwgJ00nLCB1J3onKSwKICAgICgweDFENjcwLCAnTScsIHUnYScpLAogICAgKDB4MUQ2NzEsICdNJywgdSdiJyksCiAgICAoMHgxRDY3MiwgJ00nLCB1J2MnKSwKICAgICgweDFENjczLCAnTScsIHUnZCcpLAogICAgKDB4MUQ2NzQsICdNJywgdSdlJyksCiAgICAoMHgxRDY3NSwgJ00nLCB1J2YnKSwKICAgICgweDFENjc2LCAnTScsIHUnZycpLAogICAgKDB4MUQ2NzcsICdNJywgdSdoJyksCiAgICAoMHgxRDY3OCwgJ00nLCB1J2knKSwKICAgICgweDFENjc5LCAnTScsIHUnaicpLAogICAgKDB4MUQ2N0EsICdNJywgdSdrJyksCiAgICAoMHgxRDY3QiwgJ00nLCB1J2wnKSwKICAgICgweDFENjdDLCAnTScsIHUnbScpLAogICAgKDB4MUQ2N0QsICdNJywgdSduJyksCiAgICAoMHgxRDY3RSwgJ00nLCB1J28nKSwKICAgICgweDFENjdGLCAnTScsIHUncCcpLAogICAgKDB4MUQ2ODAsICdNJywgdSdxJyksCiAgICAoMHgxRDY4MSwgJ00nLCB1J3InKSwKICAgICgweDFENjgyLCAnTScsIHUncycpLAogICAgKDB4MUQ2ODMsICdNJywgdSd0JyksCiAgICAoMHgxRDY4NCwgJ00nLCB1J3UnKSwKICAgICgweDFENjg1LCAnTScsIHUndicpLAogICAgKDB4MUQ2ODYsICdNJywgdSd3JyksCiAgICAoMHgxRDY4NywgJ00nLCB1J3gnKSwKICAgICgweDFENjg4LCAnTScsIHUneScpLAogICAgKDB4MUQ2ODksICdNJywgdSd6JyksCiAgICAoMHgxRDY4QSwgJ00nLCB1J2EnKSwKICAgICgweDFENjhCLCAnTScsIHUnYicpLAogICAgKDB4MUQ2OEMsICdNJywgdSdjJyksCiAgICAoMHgxRDY4RCwgJ00nLCB1J2QnKSwKICAgICgweDFENjhFLCAnTScsIHUnZScpLAogICAgKDB4MUQ2OEYsICdNJywgdSdmJyksCiAgICAoMHgxRDY5MCwgJ00nLCB1J2cnKSwKICAgICgweDFENjkxLCAnTScsIHUnaCcpLAogICAgKDB4MUQ2OTIsICdNJywgdSdpJyksCiAgICAoMHgxRDY5MywgJ00nLCB1J2onKSwKICAgICgweDFENjk0LCAnTScsIHUnaycpLAogICAgKDB4MUQ2OTUsICdNJywgdSdsJyksCiAgICAoMHgxRDY5NiwgJ00nLCB1J20nKSwKICAgICgweDFENjk3LCAnTScsIHUnbicpLAogICAgKDB4MUQ2OTgsICdNJywgdSdvJyksCiAgICAoMHgxRDY5OSwgJ00nLCB1J3AnKSwKICAgICgweDFENjlBLCAnTScsIHUncScpLAogICAgXQoKZGVmIF9zZWdfNjAoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDY5QiwgJ00nLCB1J3InKSwKICAgICgweDFENjlDLCAnTScsIHUncycpLAogICAgKDB4MUQ2OUQsICdNJywgdSd0JyksCiAgICAoMHgxRDY5RSwgJ00nLCB1J3UnKSwKICAgICgweDFENjlGLCAnTScsIHUndicpLAogICAgKDB4MUQ2QTAsICdNJywgdSd3JyksCiAgICAoMHgxRDZBMSwgJ00nLCB1J3gnKSwKICAgICgweDFENkEyLCAnTScsIHUneScpLAogICAgKDB4MUQ2QTMsICdNJywgdSd6JyksCiAgICAoMHgxRDZBNCwgJ00nLCB1J8SxJyksCiAgICAoMHgxRDZBNSwgJ00nLCB1J8i3JyksCiAgICAoMHgxRDZBNiwgJ1gnKSwKICAgICgweDFENkE4LCAnTScsIHUnzrEnKSwKICAgICgweDFENkE5LCAnTScsIHUnzrInKSwKICAgICgweDFENkFBLCAnTScsIHUnzrMnKSwKICAgICgweDFENkFCLCAnTScsIHUnzrQnKSwKICAgICgweDFENkFDLCAnTScsIHUnzrUnKSwKICAgICgweDFENkFELCAnTScsIHUnzrYnKSwKICAgICgweDFENkFFLCAnTScsIHUnzrcnKSwKICAgICgweDFENkFGLCAnTScsIHUnzrgnKSwKICAgICgweDFENkIwLCAnTScsIHUnzrknKSwKICAgICgweDFENkIxLCAnTScsIHUnzronKSwKICAgICgweDFENkIyLCAnTScsIHUnzrsnKSwKICAgICgweDFENkIzLCAnTScsIHUnzrwnKSwKICAgICgweDFENkI0LCAnTScsIHUnzr0nKSwKICAgICgweDFENkI1LCAnTScsIHUnzr4nKSwKICAgICgweDFENkI2LCAnTScsIHUnzr8nKSwKICAgICgweDFENkI3LCAnTScsIHUnz4AnKSwKICAgICgweDFENkI4LCAnTScsIHUnz4EnKSwKICAgICgweDFENkI5LCAnTScsIHUnzrgnKSwKICAgICgweDFENkJBLCAnTScsIHUnz4MnKSwKICAgICgweDFENkJCLCAnTScsIHUnz4QnKSwKICAgICgweDFENkJDLCAnTScsIHUnz4UnKSwKICAgICgweDFENkJELCAnTScsIHUnz4YnKSwKICAgICgweDFENkJFLCAnTScsIHUnz4cnKSwKICAgICgweDFENkJGLCAnTScsIHUnz4gnKSwKICAgICgweDFENkMwLCAnTScsIHUnz4knKSwKICAgICgweDFENkMxLCAnTScsIHUn4oiHJyksCiAgICAoMHgxRDZDMiwgJ00nLCB1J86xJyksCiAgICAoMHgxRDZDMywgJ00nLCB1J86yJyksCiAgICAoMHgxRDZDNCwgJ00nLCB1J86zJyksCiAgICAoMHgxRDZDNSwgJ00nLCB1J860JyksCiAgICAoMHgxRDZDNiwgJ00nLCB1J861JyksCiAgICAoMHgxRDZDNywgJ00nLCB1J862JyksCiAgICAoMHgxRDZDOCwgJ00nLCB1J863JyksCiAgICAoMHgxRDZDOSwgJ00nLCB1J864JyksCiAgICAoMHgxRDZDQSwgJ00nLCB1J865JyksCiAgICAoMHgxRDZDQiwgJ00nLCB1J866JyksCiAgICAoMHgxRDZDQywgJ00nLCB1J867JyksCiAgICAoMHgxRDZDRCwgJ00nLCB1J868JyksCiAgICAoMHgxRDZDRSwgJ00nLCB1J869JyksCiAgICAoMHgxRDZDRiwgJ00nLCB1J86+JyksCiAgICAoMHgxRDZEMCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDZEMSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDZEMiwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDZEMywgJ00nLCB1J8+DJyksCiAgICAoMHgxRDZENSwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDZENiwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDZENywgJ00nLCB1J8+GJyksCiAgICAoMHgxRDZEOCwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDZEOSwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDZEQSwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDZEQiwgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ2REMsICdNJywgdSfOtScpLAogICAgKDB4MUQ2REQsICdNJywgdSfOuCcpLAogICAgKDB4MUQ2REUsICdNJywgdSfOuicpLAogICAgKDB4MUQ2REYsICdNJywgdSfPhicpLAogICAgKDB4MUQ2RTAsICdNJywgdSfPgScpLAogICAgKDB4MUQ2RTEsICdNJywgdSfPgCcpLAogICAgKDB4MUQ2RTIsICdNJywgdSfOsScpLAogICAgKDB4MUQ2RTMsICdNJywgdSfOsicpLAogICAgKDB4MUQ2RTQsICdNJywgdSfOsycpLAogICAgKDB4MUQ2RTUsICdNJywgdSfOtCcpLAogICAgKDB4MUQ2RTYsICdNJywgdSfOtScpLAogICAgKDB4MUQ2RTcsICdNJywgdSfOticpLAogICAgKDB4MUQ2RTgsICdNJywgdSfOtycpLAogICAgKDB4MUQ2RTksICdNJywgdSfOuCcpLAogICAgKDB4MUQ2RUEsICdNJywgdSfOuScpLAogICAgKDB4MUQ2RUIsICdNJywgdSfOuicpLAogICAgKDB4MUQ2RUMsICdNJywgdSfOuycpLAogICAgKDB4MUQ2RUQsICdNJywgdSfOvCcpLAogICAgKDB4MUQ2RUUsICdNJywgdSfOvScpLAogICAgKDB4MUQ2RUYsICdNJywgdSfOvicpLAogICAgKDB4MUQ2RjAsICdNJywgdSfOvycpLAogICAgKDB4MUQ2RjEsICdNJywgdSfPgCcpLAogICAgKDB4MUQ2RjIsICdNJywgdSfPgScpLAogICAgKDB4MUQ2RjMsICdNJywgdSfOuCcpLAogICAgKDB4MUQ2RjQsICdNJywgdSfPgycpLAogICAgKDB4MUQ2RjUsICdNJywgdSfPhCcpLAogICAgKDB4MUQ2RjYsICdNJywgdSfPhScpLAogICAgKDB4MUQ2RjcsICdNJywgdSfPhicpLAogICAgKDB4MUQ2RjgsICdNJywgdSfPhycpLAogICAgKDB4MUQ2RjksICdNJywgdSfPiCcpLAogICAgKDB4MUQ2RkEsICdNJywgdSfPiScpLAogICAgKDB4MUQ2RkIsICdNJywgdSfiiIcnKSwKICAgICgweDFENkZDLCAnTScsIHUnzrEnKSwKICAgICgweDFENkZELCAnTScsIHUnzrInKSwKICAgICgweDFENkZFLCAnTScsIHUnzrMnKSwKICAgICgweDFENkZGLCAnTScsIHUnzrQnKSwKICAgICgweDFENzAwLCAnTScsIHUnzrUnKSwKICAgIF0KCmRlZiBfc2VnXzYxKCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ3MDEsICdNJywgdSfOticpLAogICAgKDB4MUQ3MDIsICdNJywgdSfOtycpLAogICAgKDB4MUQ3MDMsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3MDQsICdNJywgdSfOuScpLAogICAgKDB4MUQ3MDUsICdNJywgdSfOuicpLAogICAgKDB4MUQ3MDYsICdNJywgdSfOuycpLAogICAgKDB4MUQ3MDcsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3MDgsICdNJywgdSfOvScpLAogICAgKDB4MUQ3MDksICdNJywgdSfOvicpLAogICAgKDB4MUQ3MEEsICdNJywgdSfOvycpLAogICAgKDB4MUQ3MEIsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3MEMsICdNJywgdSfPgScpLAogICAgKDB4MUQ3MEQsICdNJywgdSfPgycpLAogICAgKDB4MUQ3MEYsICdNJywgdSfPhCcpLAogICAgKDB4MUQ3MTAsICdNJywgdSfPhScpLAogICAgKDB4MUQ3MTEsICdNJywgdSfPhicpLAogICAgKDB4MUQ3MTIsICdNJywgdSfPhycpLAogICAgKDB4MUQ3MTMsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3MTQsICdNJywgdSfPiScpLAogICAgKDB4MUQ3MTUsICdNJywgdSfiiIInKSwKICAgICgweDFENzE2LCAnTScsIHUnzrUnKSwKICAgICgweDFENzE3LCAnTScsIHUnzrgnKSwKICAgICgweDFENzE4LCAnTScsIHUnzronKSwKICAgICgweDFENzE5LCAnTScsIHUnz4YnKSwKICAgICgweDFENzFBLCAnTScsIHUnz4EnKSwKICAgICgweDFENzFCLCAnTScsIHUnz4AnKSwKICAgICgweDFENzFDLCAnTScsIHUnzrEnKSwKICAgICgweDFENzFELCAnTScsIHUnzrInKSwKICAgICgweDFENzFFLCAnTScsIHUnzrMnKSwKICAgICgweDFENzFGLCAnTScsIHUnzrQnKSwKICAgICgweDFENzIwLCAnTScsIHUnzrUnKSwKICAgICgweDFENzIxLCAnTScsIHUnzrYnKSwKICAgICgweDFENzIyLCAnTScsIHUnzrcnKSwKICAgICgweDFENzIzLCAnTScsIHUnzrgnKSwKICAgICgweDFENzI0LCAnTScsIHUnzrknKSwKICAgICgweDFENzI1LCAnTScsIHUnzronKSwKICAgICgweDFENzI2LCAnTScsIHUnzrsnKSwKICAgICgweDFENzI3LCAnTScsIHUnzrwnKSwKICAgICgweDFENzI4LCAnTScsIHUnzr0nKSwKICAgICgweDFENzI5LCAnTScsIHUnzr4nKSwKICAgICgweDFENzJBLCAnTScsIHUnzr8nKSwKICAgICgweDFENzJCLCAnTScsIHUnz4AnKSwKICAgICgweDFENzJDLCAnTScsIHUnz4EnKSwKICAgICgweDFENzJELCAnTScsIHUnzrgnKSwKICAgICgweDFENzJFLCAnTScsIHUnz4MnKSwKICAgICgweDFENzJGLCAnTScsIHUnz4QnKSwKICAgICgweDFENzMwLCAnTScsIHUnz4UnKSwKICAgICgweDFENzMxLCAnTScsIHUnz4YnKSwKICAgICgweDFENzMyLCAnTScsIHUnz4cnKSwKICAgICgweDFENzMzLCAnTScsIHUnz4gnKSwKICAgICgweDFENzM0LCAnTScsIHUnz4knKSwKICAgICgweDFENzM1LCAnTScsIHUn4oiHJyksCiAgICAoMHgxRDczNiwgJ00nLCB1J86xJyksCiAgICAoMHgxRDczNywgJ00nLCB1J86yJyksCiAgICAoMHgxRDczOCwgJ00nLCB1J86zJyksCiAgICAoMHgxRDczOSwgJ00nLCB1J860JyksCiAgICAoMHgxRDczQSwgJ00nLCB1J861JyksCiAgICAoMHgxRDczQiwgJ00nLCB1J862JyksCiAgICAoMHgxRDczQywgJ00nLCB1J863JyksCiAgICAoMHgxRDczRCwgJ00nLCB1J864JyksCiAgICAoMHgxRDczRSwgJ00nLCB1J865JyksCiAgICAoMHgxRDczRiwgJ00nLCB1J866JyksCiAgICAoMHgxRDc0MCwgJ00nLCB1J867JyksCiAgICAoMHgxRDc0MSwgJ00nLCB1J868JyksCiAgICAoMHgxRDc0MiwgJ00nLCB1J869JyksCiAgICAoMHgxRDc0MywgJ00nLCB1J86+JyksCiAgICAoMHgxRDc0NCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDc0NSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDc0NiwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDc0NywgJ00nLCB1J8+DJyksCiAgICAoMHgxRDc0OSwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDc0QSwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDc0QiwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDc0QywgJ00nLCB1J8+HJyksCiAgICAoMHgxRDc0RCwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDc0RSwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDc0RiwgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ3NTAsICdNJywgdSfOtScpLAogICAgKDB4MUQ3NTEsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3NTIsICdNJywgdSfOuicpLAogICAgKDB4MUQ3NTMsICdNJywgdSfPhicpLAogICAgKDB4MUQ3NTQsICdNJywgdSfPgScpLAogICAgKDB4MUQ3NTUsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3NTYsICdNJywgdSfOsScpLAogICAgKDB4MUQ3NTcsICdNJywgdSfOsicpLAogICAgKDB4MUQ3NTgsICdNJywgdSfOsycpLAogICAgKDB4MUQ3NTksICdNJywgdSfOtCcpLAogICAgKDB4MUQ3NUEsICdNJywgdSfOtScpLAogICAgKDB4MUQ3NUIsICdNJywgdSfOticpLAogICAgKDB4MUQ3NUMsICdNJywgdSfOtycpLAogICAgKDB4MUQ3NUQsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3NUUsICdNJywgdSfOuScpLAogICAgKDB4MUQ3NUYsICdNJywgdSfOuicpLAogICAgKDB4MUQ3NjAsICdNJywgdSfOuycpLAogICAgKDB4MUQ3NjEsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3NjIsICdNJywgdSfOvScpLAogICAgKDB4MUQ3NjMsICdNJywgdSfOvicpLAogICAgKDB4MUQ3NjQsICdNJywgdSfOvycpLAogICAgKDB4MUQ3NjUsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3NjYsICdNJywgdSfPgScpLAogICAgXQoKZGVmIF9zZWdfNjIoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDc2NywgJ00nLCB1J864JyksCiAgICAoMHgxRDc2OCwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDc2OSwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDc2QSwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDc2QiwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDc2QywgJ00nLCB1J8+HJyksCiAgICAoMHgxRDc2RCwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDc2RSwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDc2RiwgJ00nLCB1J+KIhycpLAogICAgKDB4MUQ3NzAsICdNJywgdSfOsScpLAogICAgKDB4MUQ3NzEsICdNJywgdSfOsicpLAogICAgKDB4MUQ3NzIsICdNJywgdSfOsycpLAogICAgKDB4MUQ3NzMsICdNJywgdSfOtCcpLAogICAgKDB4MUQ3NzQsICdNJywgdSfOtScpLAogICAgKDB4MUQ3NzUsICdNJywgdSfOticpLAogICAgKDB4MUQ3NzYsICdNJywgdSfOtycpLAogICAgKDB4MUQ3NzcsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3NzgsICdNJywgdSfOuScpLAogICAgKDB4MUQ3NzksICdNJywgdSfOuicpLAogICAgKDB4MUQ3N0EsICdNJywgdSfOuycpLAogICAgKDB4MUQ3N0IsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3N0MsICdNJywgdSfOvScpLAogICAgKDB4MUQ3N0QsICdNJywgdSfOvicpLAogICAgKDB4MUQ3N0UsICdNJywgdSfOvycpLAogICAgKDB4MUQ3N0YsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3ODAsICdNJywgdSfPgScpLAogICAgKDB4MUQ3ODEsICdNJywgdSfPgycpLAogICAgKDB4MUQ3ODMsICdNJywgdSfPhCcpLAogICAgKDB4MUQ3ODQsICdNJywgdSfPhScpLAogICAgKDB4MUQ3ODUsICdNJywgdSfPhicpLAogICAgKDB4MUQ3ODYsICdNJywgdSfPhycpLAogICAgKDB4MUQ3ODcsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3ODgsICdNJywgdSfPiScpLAogICAgKDB4MUQ3ODksICdNJywgdSfiiIInKSwKICAgICgweDFENzhBLCAnTScsIHUnzrUnKSwKICAgICgweDFENzhCLCAnTScsIHUnzrgnKSwKICAgICgweDFENzhDLCAnTScsIHUnzronKSwKICAgICgweDFENzhELCAnTScsIHUnz4YnKSwKICAgICgweDFENzhFLCAnTScsIHUnz4EnKSwKICAgICgweDFENzhGLCAnTScsIHUnz4AnKSwKICAgICgweDFENzkwLCAnTScsIHUnzrEnKSwKICAgICgweDFENzkxLCAnTScsIHUnzrInKSwKICAgICgweDFENzkyLCAnTScsIHUnzrMnKSwKICAgICgweDFENzkzLCAnTScsIHUnzrQnKSwKICAgICgweDFENzk0LCAnTScsIHUnzrUnKSwKICAgICgweDFENzk1LCAnTScsIHUnzrYnKSwKICAgICgweDFENzk2LCAnTScsIHUnzrcnKSwKICAgICgweDFENzk3LCAnTScsIHUnzrgnKSwKICAgICgweDFENzk4LCAnTScsIHUnzrknKSwKICAgICgweDFENzk5LCAnTScsIHUnzronKSwKICAgICgweDFENzlBLCAnTScsIHUnzrsnKSwKICAgICgweDFENzlCLCAnTScsIHUnzrwnKSwKICAgICgweDFENzlDLCAnTScsIHUnzr0nKSwKICAgICgweDFENzlELCAnTScsIHUnzr4nKSwKICAgICgweDFENzlFLCAnTScsIHUnzr8nKSwKICAgICgweDFENzlGLCAnTScsIHUnz4AnKSwKICAgICgweDFEN0EwLCAnTScsIHUnz4EnKSwKICAgICgweDFEN0ExLCAnTScsIHUnzrgnKSwKICAgICgweDFEN0EyLCAnTScsIHUnz4MnKSwKICAgICgweDFEN0EzLCAnTScsIHUnz4QnKSwKICAgICgweDFEN0E0LCAnTScsIHUnz4UnKSwKICAgICgweDFEN0E1LCAnTScsIHUnz4YnKSwKICAgICgweDFEN0E2LCAnTScsIHUnz4cnKSwKICAgICgweDFEN0E3LCAnTScsIHUnz4gnKSwKICAgICgweDFEN0E4LCAnTScsIHUnz4knKSwKICAgICgweDFEN0E5LCAnTScsIHUn4oiHJyksCiAgICAoMHgxRDdBQSwgJ00nLCB1J86xJyksCiAgICAoMHgxRDdBQiwgJ00nLCB1J86yJyksCiAgICAoMHgxRDdBQywgJ00nLCB1J86zJyksCiAgICAoMHgxRDdBRCwgJ00nLCB1J860JyksCiAgICAoMHgxRDdBRSwgJ00nLCB1J861JyksCiAgICAoMHgxRDdBRiwgJ00nLCB1J862JyksCiAgICAoMHgxRDdCMCwgJ00nLCB1J863JyksCiAgICAoMHgxRDdCMSwgJ00nLCB1J864JyksCiAgICAoMHgxRDdCMiwgJ00nLCB1J865JyksCiAgICAoMHgxRDdCMywgJ00nLCB1J866JyksCiAgICAoMHgxRDdCNCwgJ00nLCB1J867JyksCiAgICAoMHgxRDdCNSwgJ00nLCB1J868JyksCiAgICAoMHgxRDdCNiwgJ00nLCB1J869JyksCiAgICAoMHgxRDdCNywgJ00nLCB1J86+JyksCiAgICAoMHgxRDdCOCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDdCOSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDdCQSwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDdCQiwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDdCRCwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDdCRSwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDdCRiwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDdDMCwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDdDMSwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDdDMiwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDdDMywgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ3QzQsICdNJywgdSfOtScpLAogICAgKDB4MUQ3QzUsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3QzYsICdNJywgdSfOuicpLAogICAgKDB4MUQ3QzcsICdNJywgdSfPhicpLAogICAgKDB4MUQ3QzgsICdNJywgdSfPgScpLAogICAgKDB4MUQ3QzksICdNJywgdSfPgCcpLAogICAgKDB4MUQ3Q0EsICdNJywgdSfPnScpLAogICAgKDB4MUQ3Q0MsICdYJyksCiAgICAoMHgxRDdDRSwgJ00nLCB1JzAnKSwKICAgIF0KCmRlZiBfc2VnXzYzKCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ3Q0YsICdNJywgdScxJyksCiAgICAoMHgxRDdEMCwgJ00nLCB1JzInKSwKICAgICgweDFEN0QxLCAnTScsIHUnMycpLAogICAgKDB4MUQ3RDIsICdNJywgdSc0JyksCiAgICAoMHgxRDdEMywgJ00nLCB1JzUnKSwKICAgICgweDFEN0Q0LCAnTScsIHUnNicpLAogICAgKDB4MUQ3RDUsICdNJywgdSc3JyksCiAgICAoMHgxRDdENiwgJ00nLCB1JzgnKSwKICAgICgweDFEN0Q3LCAnTScsIHUnOScpLAogICAgKDB4MUQ3RDgsICdNJywgdScwJyksCiAgICAoMHgxRDdEOSwgJ00nLCB1JzEnKSwKICAgICgweDFEN0RBLCAnTScsIHUnMicpLAogICAgKDB4MUQ3REIsICdNJywgdSczJyksCiAgICAoMHgxRDdEQywgJ00nLCB1JzQnKSwKICAgICgweDFEN0RELCAnTScsIHUnNScpLAogICAgKDB4MUQ3REUsICdNJywgdSc2JyksCiAgICAoMHgxRDdERiwgJ00nLCB1JzcnKSwKICAgICgweDFEN0UwLCAnTScsIHUnOCcpLAogICAgKDB4MUQ3RTEsICdNJywgdSc5JyksCiAgICAoMHgxRDdFMiwgJ00nLCB1JzAnKSwKICAgICgweDFEN0UzLCAnTScsIHUnMScpLAogICAgKDB4MUQ3RTQsICdNJywgdScyJyksCiAgICAoMHgxRDdFNSwgJ00nLCB1JzMnKSwKICAgICgweDFEN0U2LCAnTScsIHUnNCcpLAogICAgKDB4MUQ3RTcsICdNJywgdSc1JyksCiAgICAoMHgxRDdFOCwgJ00nLCB1JzYnKSwKICAgICgweDFEN0U5LCAnTScsIHUnNycpLAogICAgKDB4MUQ3RUEsICdNJywgdSc4JyksCiAgICAoMHgxRDdFQiwgJ00nLCB1JzknKSwKICAgICgweDFEN0VDLCAnTScsIHUnMCcpLAogICAgKDB4MUQ3RUQsICdNJywgdScxJyksCiAgICAoMHgxRDdFRSwgJ00nLCB1JzInKSwKICAgICgweDFEN0VGLCAnTScsIHUnMycpLAogICAgKDB4MUQ3RjAsICdNJywgdSc0JyksCiAgICAoMHgxRDdGMSwgJ00nLCB1JzUnKSwKICAgICgweDFEN0YyLCAnTScsIHUnNicpLAogICAgKDB4MUQ3RjMsICdNJywgdSc3JyksCiAgICAoMHgxRDdGNCwgJ00nLCB1JzgnKSwKICAgICgweDFEN0Y1LCAnTScsIHUnOScpLAogICAgKDB4MUQ3RjYsICdNJywgdScwJyksCiAgICAoMHgxRDdGNywgJ00nLCB1JzEnKSwKICAgICgweDFEN0Y4LCAnTScsIHUnMicpLAogICAgKDB4MUQ3RjksICdNJywgdSczJyksCiAgICAoMHgxRDdGQSwgJ00nLCB1JzQnKSwKICAgICgweDFEN0ZCLCAnTScsIHUnNScpLAogICAgKDB4MUQ3RkMsICdNJywgdSc2JyksCiAgICAoMHgxRDdGRCwgJ00nLCB1JzcnKSwKICAgICgweDFEN0ZFLCAnTScsIHUnOCcpLAogICAgKDB4MUQ3RkYsICdNJywgdSc5JyksCiAgICAoMHgxRDgwMCwgJ1gnKSwKICAgICgweDFFRTAwLCAnTScsIHUn2KcnKSwKICAgICgweDFFRTAxLCAnTScsIHUn2KgnKSwKICAgICgweDFFRTAyLCAnTScsIHUn2KwnKSwKICAgICgweDFFRTAzLCAnTScsIHUn2K8nKSwKICAgICgweDFFRTA0LCAnWCcpLAogICAgKDB4MUVFMDUsICdNJywgdSfZiCcpLAogICAgKDB4MUVFMDYsICdNJywgdSfYsicpLAogICAgKDB4MUVFMDcsICdNJywgdSfYrScpLAogICAgKDB4MUVFMDgsICdNJywgdSfYtycpLAogICAgKDB4MUVFMDksICdNJywgdSfZiicpLAogICAgKDB4MUVFMEEsICdNJywgdSfZgycpLAogICAgKDB4MUVFMEIsICdNJywgdSfZhCcpLAogICAgKDB4MUVFMEMsICdNJywgdSfZhScpLAogICAgKDB4MUVFMEQsICdNJywgdSfZhicpLAogICAgKDB4MUVFMEUsICdNJywgdSfYsycpLAogICAgKDB4MUVFMEYsICdNJywgdSfYuScpLAogICAgKDB4MUVFMTAsICdNJywgdSfZgScpLAogICAgKDB4MUVFMTEsICdNJywgdSfYtScpLAogICAgKDB4MUVFMTIsICdNJywgdSfZgicpLAogICAgKDB4MUVFMTMsICdNJywgdSfYsScpLAogICAgKDB4MUVFMTQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFMTUsICdNJywgdSfYqicpLAogICAgKDB4MUVFMTYsICdNJywgdSfYqycpLAogICAgKDB4MUVFMTcsICdNJywgdSfYricpLAogICAgKDB4MUVFMTgsICdNJywgdSfYsCcpLAogICAgKDB4MUVFMTksICdNJywgdSfYticpLAogICAgKDB4MUVFMUEsICdNJywgdSfYuCcpLAogICAgKDB4MUVFMUIsICdNJywgdSfYuicpLAogICAgKDB4MUVFMUMsICdNJywgdSfZricpLAogICAgKDB4MUVFMUQsICdNJywgdSfauicpLAogICAgKDB4MUVFMUUsICdNJywgdSfaoScpLAogICAgKDB4MUVFMUYsICdNJywgdSfZrycpLAogICAgKDB4MUVFMjAsICdYJyksCiAgICAoMHgxRUUyMSwgJ00nLCB1J9ioJyksCiAgICAoMHgxRUUyMiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUUyMywgJ1gnKSwKICAgICgweDFFRTI0LCAnTScsIHUn2YcnKSwKICAgICgweDFFRTI1LCAnWCcpLAogICAgKDB4MUVFMjcsICdNJywgdSfYrScpLAogICAgKDB4MUVFMjgsICdYJyksCiAgICAoMHgxRUUyOSwgJ00nLCB1J9mKJyksCiAgICAoMHgxRUUyQSwgJ00nLCB1J9mDJyksCiAgICAoMHgxRUUyQiwgJ00nLCB1J9mEJyksCiAgICAoMHgxRUUyQywgJ00nLCB1J9mFJyksCiAgICAoMHgxRUUyRCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUUyRSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUUyRiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUUzMCwgJ00nLCB1J9mBJyksCiAgICAoMHgxRUUzMSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUUzMiwgJ00nLCB1J9mCJyksCiAgICBdCgpkZWYgX3NlZ182NCgpOgogICAgcmV0dXJuIFsKICAgICgweDFFRTMzLCAnWCcpLAogICAgKDB4MUVFMzQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFMzUsICdNJywgdSfYqicpLAogICAgKDB4MUVFMzYsICdNJywgdSfYqycpLAogICAgKDB4MUVFMzcsICdNJywgdSfYricpLAogICAgKDB4MUVFMzgsICdYJyksCiAgICAoMHgxRUUzOSwgJ00nLCB1J9i2JyksCiAgICAoMHgxRUUzQSwgJ1gnKSwKICAgICgweDFFRTNCLCAnTScsIHUn2LonKSwKICAgICgweDFFRTNDLCAnWCcpLAogICAgKDB4MUVFNDIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFNDMsICdYJyksCiAgICAoMHgxRUU0NywgJ00nLCB1J9itJyksCiAgICAoMHgxRUU0OCwgJ1gnKSwKICAgICgweDFFRTQ5LCAnTScsIHUn2YonKSwKICAgICgweDFFRTRBLCAnWCcpLAogICAgKDB4MUVFNEIsICdNJywgdSfZhCcpLAogICAgKDB4MUVFNEMsICdYJyksCiAgICAoMHgxRUU0RCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUU0RSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUU0RiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUU1MCwgJ1gnKSwKICAgICgweDFFRTUxLCAnTScsIHUn2LUnKSwKICAgICgweDFFRTUyLCAnTScsIHUn2YInKSwKICAgICgweDFFRTUzLCAnWCcpLAogICAgKDB4MUVFNTQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFNTUsICdYJyksCiAgICAoMHgxRUU1NywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUU1OCwgJ1gnKSwKICAgICgweDFFRTU5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRTVBLCAnWCcpLAogICAgKDB4MUVFNUIsICdNJywgdSfYuicpLAogICAgKDB4MUVFNUMsICdYJyksCiAgICAoMHgxRUU1RCwgJ00nLCB1J9q6JyksCiAgICAoMHgxRUU1RSwgJ1gnKSwKICAgICgweDFFRTVGLCAnTScsIHUn2a8nKSwKICAgICgweDFFRTYwLCAnWCcpLAogICAgKDB4MUVFNjEsICdNJywgdSfYqCcpLAogICAgKDB4MUVFNjIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFNjMsICdYJyksCiAgICAoMHgxRUU2NCwgJ00nLCB1J9mHJyksCiAgICAoMHgxRUU2NSwgJ1gnKSwKICAgICgweDFFRTY3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRTY4LCAnTScsIHUn2LcnKSwKICAgICgweDFFRTY5LCAnTScsIHUn2YonKSwKICAgICgweDFFRTZBLCAnTScsIHUn2YMnKSwKICAgICgweDFFRTZCLCAnWCcpLAogICAgKDB4MUVFNkMsICdNJywgdSfZhScpLAogICAgKDB4MUVFNkQsICdNJywgdSfZhicpLAogICAgKDB4MUVFNkUsICdNJywgdSfYsycpLAogICAgKDB4MUVFNkYsICdNJywgdSfYuScpLAogICAgKDB4MUVFNzAsICdNJywgdSfZgScpLAogICAgKDB4MUVFNzEsICdNJywgdSfYtScpLAogICAgKDB4MUVFNzIsICdNJywgdSfZgicpLAogICAgKDB4MUVFNzMsICdYJyksCiAgICAoMHgxRUU3NCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUU3NSwgJ00nLCB1J9iqJyksCiAgICAoMHgxRUU3NiwgJ00nLCB1J9irJyksCiAgICAoMHgxRUU3NywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUU3OCwgJ1gnKSwKICAgICgweDFFRTc5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRTdBLCAnTScsIHUn2LgnKSwKICAgICgweDFFRTdCLCAnTScsIHUn2LonKSwKICAgICgweDFFRTdDLCAnTScsIHUn2a4nKSwKICAgICgweDFFRTdELCAnWCcpLAogICAgKDB4MUVFN0UsICdNJywgdSfaoScpLAogICAgKDB4MUVFN0YsICdYJyksCiAgICAoMHgxRUU4MCwgJ00nLCB1J9inJyksCiAgICAoMHgxRUU4MSwgJ00nLCB1J9ioJyksCiAgICAoMHgxRUU4MiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUU4MywgJ00nLCB1J9ivJyksCiAgICAoMHgxRUU4NCwgJ00nLCB1J9mHJyksCiAgICAoMHgxRUU4NSwgJ00nLCB1J9mIJyksCiAgICAoMHgxRUU4NiwgJ00nLCB1J9iyJyksCiAgICAoMHgxRUU4NywgJ00nLCB1J9itJyksCiAgICAoMHgxRUU4OCwgJ00nLCB1J9i3JyksCiAgICAoMHgxRUU4OSwgJ00nLCB1J9mKJyksCiAgICAoMHgxRUU4QSwgJ1gnKSwKICAgICgweDFFRThCLCAnTScsIHUn2YQnKSwKICAgICgweDFFRThDLCAnTScsIHUn2YUnKSwKICAgICgweDFFRThELCAnTScsIHUn2YYnKSwKICAgICgweDFFRThFLCAnTScsIHUn2LMnKSwKICAgICgweDFFRThGLCAnTScsIHUn2LknKSwKICAgICgweDFFRTkwLCAnTScsIHUn2YEnKSwKICAgICgweDFFRTkxLCAnTScsIHUn2LUnKSwKICAgICgweDFFRTkyLCAnTScsIHUn2YInKSwKICAgICgweDFFRTkzLCAnTScsIHUn2LEnKSwKICAgICgweDFFRTk0LCAnTScsIHUn2LQnKSwKICAgICgweDFFRTk1LCAnTScsIHUn2KonKSwKICAgICgweDFFRTk2LCAnTScsIHUn2KsnKSwKICAgICgweDFFRTk3LCAnTScsIHUn2K4nKSwKICAgICgweDFFRTk4LCAnTScsIHUn2LAnKSwKICAgICgweDFFRTk5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRTlBLCAnTScsIHUn2LgnKSwKICAgICgweDFFRTlCLCAnTScsIHUn2LonKSwKICAgICgweDFFRTlDLCAnWCcpLAogICAgKDB4MUVFQTEsICdNJywgdSfYqCcpLAogICAgKDB4MUVFQTIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFQTMsICdNJywgdSfYrycpLAogICAgKDB4MUVFQTQsICdYJyksCiAgICBdCgpkZWYgX3NlZ182NSgpOgogICAgcmV0dXJuIFsKICAgICgweDFFRUE1LCAnTScsIHUn2YgnKSwKICAgICgweDFFRUE2LCAnTScsIHUn2LInKSwKICAgICgweDFFRUE3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRUE4LCAnTScsIHUn2LcnKSwKICAgICgweDFFRUE5LCAnTScsIHUn2YonKSwKICAgICgweDFFRUFBLCAnWCcpLAogICAgKDB4MUVFQUIsICdNJywgdSfZhCcpLAogICAgKDB4MUVFQUMsICdNJywgdSfZhScpLAogICAgKDB4MUVFQUQsICdNJywgdSfZhicpLAogICAgKDB4MUVFQUUsICdNJywgdSfYsycpLAogICAgKDB4MUVFQUYsICdNJywgdSfYuScpLAogICAgKDB4MUVFQjAsICdNJywgdSfZgScpLAogICAgKDB4MUVFQjEsICdNJywgdSfYtScpLAogICAgKDB4MUVFQjIsICdNJywgdSfZgicpLAogICAgKDB4MUVFQjMsICdNJywgdSfYsScpLAogICAgKDB4MUVFQjQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFQjUsICdNJywgdSfYqicpLAogICAgKDB4MUVFQjYsICdNJywgdSfYqycpLAogICAgKDB4MUVFQjcsICdNJywgdSfYricpLAogICAgKDB4MUVFQjgsICdNJywgdSfYsCcpLAogICAgKDB4MUVFQjksICdNJywgdSfYticpLAogICAgKDB4MUVFQkEsICdNJywgdSfYuCcpLAogICAgKDB4MUVFQkIsICdNJywgdSfYuicpLAogICAgKDB4MUVFQkMsICdYJyksCiAgICAoMHgxRUVGMCwgJ1YnKSwKICAgICgweDFFRUYyLCAnWCcpLAogICAgKDB4MUYwMDAsICdWJyksCiAgICAoMHgxRjAyQywgJ1gnKSwKICAgICgweDFGMDMwLCAnVicpLAogICAgKDB4MUYwOTQsICdYJyksCiAgICAoMHgxRjBBMCwgJ1YnKSwKICAgICgweDFGMEFGLCAnWCcpLAogICAgKDB4MUYwQjEsICdWJyksCiAgICAoMHgxRjBCRiwgJ1gnKSwKICAgICgweDFGMEMxLCAnVicpLAogICAgKDB4MUYwRDAsICdYJyksCiAgICAoMHgxRjBEMSwgJ1YnKSwKICAgICgweDFGMEUwLCAnWCcpLAogICAgKDB4MUYxMDEsICczJywgdScwLCcpLAogICAgKDB4MUYxMDIsICczJywgdScxLCcpLAogICAgKDB4MUYxMDMsICczJywgdScyLCcpLAogICAgKDB4MUYxMDQsICczJywgdSczLCcpLAogICAgKDB4MUYxMDUsICczJywgdSc0LCcpLAogICAgKDB4MUYxMDYsICczJywgdSc1LCcpLAogICAgKDB4MUYxMDcsICczJywgdSc2LCcpLAogICAgKDB4MUYxMDgsICczJywgdSc3LCcpLAogICAgKDB4MUYxMDksICczJywgdSc4LCcpLAogICAgKDB4MUYxMEEsICczJywgdSc5LCcpLAogICAgKDB4MUYxMEIsICdYJyksCiAgICAoMHgxRjExMCwgJzMnLCB1JyhhKScpLAogICAgKDB4MUYxMTEsICczJywgdScoYiknKSwKICAgICgweDFGMTEyLCAnMycsIHUnKGMpJyksCiAgICAoMHgxRjExMywgJzMnLCB1JyhkKScpLAogICAgKDB4MUYxMTQsICczJywgdScoZSknKSwKICAgICgweDFGMTE1LCAnMycsIHUnKGYpJyksCiAgICAoMHgxRjExNiwgJzMnLCB1JyhnKScpLAogICAgKDB4MUYxMTcsICczJywgdScoaCknKSwKICAgICgweDFGMTE4LCAnMycsIHUnKGkpJyksCiAgICAoMHgxRjExOSwgJzMnLCB1JyhqKScpLAogICAgKDB4MUYxMUEsICczJywgdScoayknKSwKICAgICgweDFGMTFCLCAnMycsIHUnKGwpJyksCiAgICAoMHgxRjExQywgJzMnLCB1JyhtKScpLAogICAgKDB4MUYxMUQsICczJywgdScobiknKSwKICAgICgweDFGMTFFLCAnMycsIHUnKG8pJyksCiAgICAoMHgxRjExRiwgJzMnLCB1JyhwKScpLAogICAgKDB4MUYxMjAsICczJywgdScocSknKSwKICAgICgweDFGMTIxLCAnMycsIHUnKHIpJyksCiAgICAoMHgxRjEyMiwgJzMnLCB1JyhzKScpLAogICAgKDB4MUYxMjMsICczJywgdScodCknKSwKICAgICgweDFGMTI0LCAnMycsIHUnKHUpJyksCiAgICAoMHgxRjEyNSwgJzMnLCB1Jyh2KScpLAogICAgKDB4MUYxMjYsICczJywgdScodyknKSwKICAgICgweDFGMTI3LCAnMycsIHUnKHgpJyksCiAgICAoMHgxRjEyOCwgJzMnLCB1Jyh5KScpLAogICAgKDB4MUYxMjksICczJywgdScoeiknKSwKICAgICgweDFGMTJBLCAnTScsIHUn44CUc+OAlScpLAogICAgKDB4MUYxMkIsICdNJywgdSdjJyksCiAgICAoMHgxRjEyQywgJ00nLCB1J3InKSwKICAgICgweDFGMTJELCAnTScsIHUnY2QnKSwKICAgICgweDFGMTJFLCAnTScsIHUnd3onKSwKICAgICgweDFGMTJGLCAnWCcpLAogICAgKDB4MUYxMzAsICdNJywgdSdhJyksCiAgICAoMHgxRjEzMSwgJ00nLCB1J2InKSwKICAgICgweDFGMTMyLCAnTScsIHUnYycpLAogICAgKDB4MUYxMzMsICdNJywgdSdkJyksCiAgICAoMHgxRjEzNCwgJ00nLCB1J2UnKSwKICAgICgweDFGMTM1LCAnTScsIHUnZicpLAogICAgKDB4MUYxMzYsICdNJywgdSdnJyksCiAgICAoMHgxRjEzNywgJ00nLCB1J2gnKSwKICAgICgweDFGMTM4LCAnTScsIHUnaScpLAogICAgKDB4MUYxMzksICdNJywgdSdqJyksCiAgICAoMHgxRjEzQSwgJ00nLCB1J2snKSwKICAgICgweDFGMTNCLCAnTScsIHUnbCcpLAogICAgKDB4MUYxM0MsICdNJywgdSdtJyksCiAgICAoMHgxRjEzRCwgJ00nLCB1J24nKSwKICAgICgweDFGMTNFLCAnTScsIHUnbycpLAogICAgKDB4MUYxM0YsICdNJywgdSdwJyksCiAgICAoMHgxRjE0MCwgJ00nLCB1J3EnKSwKICAgICgweDFGMTQxLCAnTScsIHUncicpLAogICAgKDB4MUYxNDIsICdNJywgdSdzJyksCiAgICBdCgpkZWYgX3NlZ182NigpOgogICAgcmV0dXJuIFsKICAgICgweDFGMTQzLCAnTScsIHUndCcpLAogICAgKDB4MUYxNDQsICdNJywgdSd1JyksCiAgICAoMHgxRjE0NSwgJ00nLCB1J3YnKSwKICAgICgweDFGMTQ2LCAnTScsIHUndycpLAogICAgKDB4MUYxNDcsICdNJywgdSd4JyksCiAgICAoMHgxRjE0OCwgJ00nLCB1J3knKSwKICAgICgweDFGMTQ5LCAnTScsIHUneicpLAogICAgKDB4MUYxNEEsICdNJywgdSdodicpLAogICAgKDB4MUYxNEIsICdNJywgdSdtdicpLAogICAgKDB4MUYxNEMsICdNJywgdSdzZCcpLAogICAgKDB4MUYxNEQsICdNJywgdSdzcycpLAogICAgKDB4MUYxNEUsICdNJywgdSdwcHYnKSwKICAgICgweDFGMTRGLCAnTScsIHUnd2MnKSwKICAgICgweDFGMTUwLCAnVicpLAogICAgKDB4MUYxNkEsICdNJywgdSdtYycpLAogICAgKDB4MUYxNkIsICdNJywgdSdtZCcpLAogICAgKDB4MUYxNkMsICdYJyksCiAgICAoMHgxRjE3MCwgJ1YnKSwKICAgICgweDFGMTkwLCAnTScsIHUnZGonKSwKICAgICgweDFGMTkxLCAnVicpLAogICAgKDB4MUYxOUIsICdYJyksCiAgICAoMHgxRjFFNiwgJ1YnKSwKICAgICgweDFGMjAwLCAnTScsIHUn44G744GLJyksCiAgICAoMHgxRjIwMSwgJ00nLCB1J+OCs+OCsycpLAogICAgKDB4MUYyMDIsICdNJywgdSfjgrUnKSwKICAgICgweDFGMjAzLCAnWCcpLAogICAgKDB4MUYyMTAsICdNJywgdSfmiYsnKSwKICAgICgweDFGMjExLCAnTScsIHUn5a2XJyksCiAgICAoMHgxRjIxMiwgJ00nLCB1J+WPjCcpLAogICAgKDB4MUYyMTMsICdNJywgdSfjg4cnKSwKICAgICgweDFGMjE0LCAnTScsIHUn5LqMJyksCiAgICAoMHgxRjIxNSwgJ00nLCB1J+WkmicpLAogICAgKDB4MUYyMTYsICdNJywgdSfop6MnKSwKICAgICgweDFGMjE3LCAnTScsIHUn5aSpJyksCiAgICAoMHgxRjIxOCwgJ00nLCB1J+S6pCcpLAogICAgKDB4MUYyMTksICdNJywgdSfmmKAnKSwKICAgICgweDFGMjFBLCAnTScsIHUn54ShJyksCiAgICAoMHgxRjIxQiwgJ00nLCB1J+aWmScpLAogICAgKDB4MUYyMUMsICdNJywgdSfliY0nKSwKICAgICgweDFGMjFELCAnTScsIHUn5b6MJyksCiAgICAoMHgxRjIxRSwgJ00nLCB1J+WGjScpLAogICAgKDB4MUYyMUYsICdNJywgdSfmlrAnKSwKICAgICgweDFGMjIwLCAnTScsIHUn5YidJyksCiAgICAoMHgxRjIyMSwgJ00nLCB1J+e1gicpLAogICAgKDB4MUYyMjIsICdNJywgdSfnlJ8nKSwKICAgICgweDFGMjIzLCAnTScsIHUn6LKpJyksCiAgICAoMHgxRjIyNCwgJ00nLCB1J+WjsCcpLAogICAgKDB4MUYyMjUsICdNJywgdSflkLknKSwKICAgICgweDFGMjI2LCAnTScsIHUn5ryUJyksCiAgICAoMHgxRjIyNywgJ00nLCB1J+aKlScpLAogICAgKDB4MUYyMjgsICdNJywgdSfmjZUnKSwKICAgICgweDFGMjI5LCAnTScsIHUn5LiAJyksCiAgICAoMHgxRjIyQSwgJ00nLCB1J+S4iScpLAogICAgKDB4MUYyMkIsICdNJywgdSfpgYonKSwKICAgICgweDFGMjJDLCAnTScsIHUn5bemJyksCiAgICAoMHgxRjIyRCwgJ00nLCB1J+S4rScpLAogICAgKDB4MUYyMkUsICdNJywgdSflj7MnKSwKICAgICgweDFGMjJGLCAnTScsIHUn5oyHJyksCiAgICAoMHgxRjIzMCwgJ00nLCB1J+i1sCcpLAogICAgKDB4MUYyMzEsICdNJywgdSfmiZMnKSwKICAgICgweDFGMjMyLCAnTScsIHUn56aBJyksCiAgICAoMHgxRjIzMywgJ00nLCB1J+epuicpLAogICAgKDB4MUYyMzQsICdNJywgdSflkIgnKSwKICAgICgweDFGMjM1LCAnTScsIHUn5rqAJyksCiAgICAoMHgxRjIzNiwgJ00nLCB1J+aciScpLAogICAgKDB4MUYyMzcsICdNJywgdSfmnIgnKSwKICAgICgweDFGMjM4LCAnTScsIHUn55SzJyksCiAgICAoMHgxRjIzOSwgJ00nLCB1J+WJsicpLAogICAgKDB4MUYyM0EsICdNJywgdSfllrYnKSwKICAgICgweDFGMjNCLCAnWCcpLAogICAgKDB4MUYyNDAsICdNJywgdSfjgJTmnKzjgJUnKSwKICAgICgweDFGMjQxLCAnTScsIHUn44CU5LiJ44CVJyksCiAgICAoMHgxRjI0MiwgJ00nLCB1J+OAlOS6jOOAlScpLAogICAgKDB4MUYyNDMsICdNJywgdSfjgJTlronjgJUnKSwKICAgICgweDFGMjQ0LCAnTScsIHUn44CU54K544CVJyksCiAgICAoMHgxRjI0NSwgJ00nLCB1J+OAlOaJk+OAlScpLAogICAgKDB4MUYyNDYsICdNJywgdSfjgJTnm5fjgJUnKSwKICAgICgweDFGMjQ3LCAnTScsIHUn44CU5Yud44CVJyksCiAgICAoMHgxRjI0OCwgJ00nLCB1J+OAlOaVl+OAlScpLAogICAgKDB4MUYyNDksICdYJyksCiAgICAoMHgxRjI1MCwgJ00nLCB1J+W+lycpLAogICAgKDB4MUYyNTEsICdNJywgdSflj68nKSwKICAgICgweDFGMjUyLCAnWCcpLAogICAgKDB4MUYzMDAsICdWJyksCiAgICAoMHgxRjMyMSwgJ1gnKSwKICAgICgweDFGMzMwLCAnVicpLAogICAgKDB4MUYzMzYsICdYJyksCiAgICAoMHgxRjMzNywgJ1YnKSwKICAgICgweDFGMzdELCAnWCcpLAogICAgKDB4MUYzODAsICdWJyksCiAgICAoMHgxRjM5NCwgJ1gnKSwKICAgICgweDFGM0EwLCAnVicpLAogICAgKDB4MUYzQzUsICdYJyksCiAgICAoMHgxRjNDNiwgJ1YnKSwKICAgICgweDFGM0NCLCAnWCcpLAogICAgKDB4MUYzRTAsICdWJyksCiAgICAoMHgxRjNGMSwgJ1gnKSwKICAgICgweDFGNDAwLCAnVicpLAogICAgKDB4MUY0M0YsICdYJyksCiAgICAoMHgxRjQ0MCwgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzY3KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUY0NDEsICdYJyksCiAgICAoMHgxRjQ0MiwgJ1YnKSwKICAgICgweDFGNEY4LCAnWCcpLAogICAgKDB4MUY0RjksICdWJyksCiAgICAoMHgxRjRGRCwgJ1gnKSwKICAgICgweDFGNTAwLCAnVicpLAogICAgKDB4MUY1M0UsICdYJyksCiAgICAoMHgxRjU0MCwgJ1YnKSwKICAgICgweDFGNTQ0LCAnWCcpLAogICAgKDB4MUY1NTAsICdWJyksCiAgICAoMHgxRjU2OCwgJ1gnKSwKICAgICgweDFGNUZCLCAnVicpLAogICAgKDB4MUY2NDEsICdYJyksCiAgICAoMHgxRjY0NSwgJ1YnKSwKICAgICgweDFGNjUwLCAnWCcpLAogICAgKDB4MUY2ODAsICdWJyksCiAgICAoMHgxRjZDNiwgJ1gnKSwKICAgICgweDFGNzAwLCAnVicpLAogICAgKDB4MUY3NzQsICdYJyksCiAgICAoMHgyMDAwMCwgJ1YnKSwKICAgICgweDJBNkQ3LCAnWCcpLAogICAgKDB4MkE3MDAsICdWJyksCiAgICAoMHgyQjczNSwgJ1gnKSwKICAgICgweDJCNzQwLCAnVicpLAogICAgKDB4MkI4MUUsICdYJyksCiAgICAoMHgyRjgwMCwgJ00nLCB1J+S4vScpLAogICAgKDB4MkY4MDEsICdNJywgdSfkuLgnKSwKICAgICgweDJGODAyLCAnTScsIHUn5LmBJyksCiAgICAoMHgyRjgwMywgJ00nLCB1J/CghKInKSwKICAgICgweDJGODA0LCAnTScsIHUn5L2gJyksCiAgICAoMHgyRjgwNSwgJ00nLCB1J+S+ricpLAogICAgKDB4MkY4MDYsICdNJywgdSfkvrsnKSwKICAgICgweDJGODA3LCAnTScsIHUn5YCCJyksCiAgICAoMHgyRjgwOCwgJ00nLCB1J+WBuicpLAogICAgKDB4MkY4MDksICdNJywgdSflgpknKSwKICAgICgweDJGODBBLCAnTScsIHUn5YOnJyksCiAgICAoMHgyRjgwQiwgJ00nLCB1J+WDjycpLAogICAgKDB4MkY4MEMsICdNJywgdSfjkp4nKSwKICAgICgweDJGODBELCAnTScsIHUn8KCYuicpLAogICAgKDB4MkY4MEUsICdNJywgdSflhY0nKSwKICAgICgweDJGODBGLCAnTScsIHUn5YWUJyksCiAgICAoMHgyRjgxMCwgJ00nLCB1J+WFpCcpLAogICAgKDB4MkY4MTEsICdNJywgdSflhbcnKSwKICAgICgweDJGODEyLCAnTScsIHUn8KCUnCcpLAogICAgKDB4MkY4MTMsICdNJywgdSfjkrknKSwKICAgICgweDJGODE0LCAnTScsIHUn5YWnJyksCiAgICAoMHgyRjgxNSwgJ00nLCB1J+WGjScpLAogICAgKDB4MkY4MTYsICdNJywgdSfwoJWLJyksCiAgICAoMHgyRjgxNywgJ00nLCB1J+WGlycpLAogICAgKDB4MkY4MTgsICdNJywgdSflhqQnKSwKICAgICgweDJGODE5LCAnTScsIHUn5LuMJyksCiAgICAoMHgyRjgxQSwgJ00nLCB1J+WGrCcpLAogICAgKDB4MkY4MUIsICdNJywgdSflhrUnKSwKICAgICgweDJGODFDLCAnTScsIHUn8KmHnycpLAogICAgKDB4MkY4MUQsICdNJywgdSflh7UnKSwKICAgICgweDJGODFFLCAnTScsIHUn5YiDJyksCiAgICAoMHgyRjgxRiwgJ00nLCB1J+OTnycpLAogICAgKDB4MkY4MjAsICdNJywgdSfliLsnKSwKICAgICgweDJGODIxLCAnTScsIHUn5YmGJyksCiAgICAoMHgyRjgyMiwgJ00nLCB1J+WJsicpLAogICAgKDB4MkY4MjMsICdNJywgdSflibcnKSwKICAgICgweDJGODI0LCAnTScsIHUn45SVJyksCiAgICAoMHgyRjgyNSwgJ00nLCB1J+WLhycpLAogICAgKDB4MkY4MjYsICdNJywgdSfli4knKSwKICAgICgweDJGODI3LCAnTScsIHUn5YukJyksCiAgICAoMHgyRjgyOCwgJ00nLCB1J+WLuicpLAogICAgKDB4MkY4MjksICdNJywgdSfljIUnKSwKICAgICgweDJGODJBLCAnTScsIHUn5YyGJyksCiAgICAoMHgyRjgyQiwgJ00nLCB1J+WMlycpLAogICAgKDB4MkY4MkMsICdNJywgdSfljYknKSwKICAgICgweDJGODJELCAnTScsIHUn5Y2RJyksCiAgICAoMHgyRjgyRSwgJ00nLCB1J+WNmicpLAogICAgKDB4MkY4MkYsICdNJywgdSfljbMnKSwKICAgICgweDJGODMwLCAnTScsIHUn5Y29JyksCiAgICAoMHgyRjgzMSwgJ00nLCB1J+WNvycpLAogICAgKDB4MkY4MzQsICdNJywgdSfwoKisJyksCiAgICAoMHgyRjgzNSwgJ00nLCB1J+eBsCcpLAogICAgKDB4MkY4MzYsICdNJywgdSflj4onKSwKICAgICgweDJGODM3LCAnTScsIHUn5Y+fJyksCiAgICAoMHgyRjgzOCwgJ00nLCB1J/CgraMnKSwKICAgICgweDJGODM5LCAnTScsIHUn5Y+rJyksCiAgICAoMHgyRjgzQSwgJ00nLCB1J+WPsScpLAogICAgKDB4MkY4M0IsICdNJywgdSflkIYnKSwKICAgICgweDJGODNDLCAnTScsIHUn5ZKeJyksCiAgICAoMHgyRjgzRCwgJ00nLCB1J+WQuCcpLAogICAgKDB4MkY4M0UsICdNJywgdSflkYgnKSwKICAgICgweDJGODNGLCAnTScsIHUn5ZGoJyksCiAgICAoMHgyRjg0MCwgJ00nLCB1J+WSoicpLAogICAgKDB4MkY4NDEsICdNJywgdSflk7YnKSwKICAgICgweDJGODQyLCAnTScsIHUn5ZSQJyksCiAgICAoMHgyRjg0MywgJ00nLCB1J+WVkycpLAogICAgKDB4MkY4NDQsICdNJywgdSfllaMnKSwKICAgICgweDJGODQ1LCAnTScsIHUn5ZaEJyksCiAgICAoMHgyRjg0NywgJ00nLCB1J+WWmScpLAogICAgKDB4MkY4NDgsICdNJywgdSfllqsnKSwKICAgICgweDJGODQ5LCAnTScsIHUn5ZazJyksCiAgICAoMHgyRjg0QSwgJ00nLCB1J+WXgicpLAogICAgKDB4MkY4NEIsICdNJywgdSflnJYnKSwKICAgICgweDJGODRDLCAnTScsIHUn5ZiGJyksCiAgICAoMHgyRjg0RCwgJ00nLCB1J+WclycpLAogICAgXQoKZGVmIF9zZWdfNjgoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjg0RSwgJ00nLCB1J+WZkScpLAogICAgKDB4MkY4NEYsICdNJywgdSflmbQnKSwKICAgICgweDJGODUwLCAnTScsIHUn5YiHJyksCiAgICAoMHgyRjg1MSwgJ00nLCB1J+WjricpLAogICAgKDB4MkY4NTIsICdNJywgdSfln44nKSwKICAgICgweDJGODUzLCAnTScsIHUn5Z+0JyksCiAgICAoMHgyRjg1NCwgJ00nLCB1J+WgjScpLAogICAgKDB4MkY4NTUsICdNJywgdSflnosnKSwKICAgICgweDJGODU2LCAnTScsIHUn5aCyJyksCiAgICAoMHgyRjg1NywgJ00nLCB1J+WgsScpLAogICAgKDB4MkY4NTgsICdNJywgdSfloqwnKSwKICAgICgweDJGODU5LCAnTScsIHUn8KGTpCcpLAogICAgKDB4MkY4NUEsICdNJywgdSflo7InKSwKICAgICgweDJGODVCLCAnTScsIHUn5aO3JyksCiAgICAoMHgyRjg1QywgJ00nLCB1J+WkhicpLAogICAgKDB4MkY4NUQsICdNJywgdSflpJonKSwKICAgICgweDJGODVFLCAnTScsIHUn5aSiJyksCiAgICAoMHgyRjg1RiwgJ00nLCB1J+WloicpLAogICAgKDB4MkY4NjAsICdNJywgdSfwoZqoJyksCiAgICAoMHgyRjg2MSwgJ00nLCB1J/Chm6onKSwKICAgICgweDJGODYyLCAnTScsIHUn5aesJyksCiAgICAoMHgyRjg2MywgJ00nLCB1J+WomycpLAogICAgKDB4MkY4NjQsICdNJywgdSflqKcnKSwKICAgICgweDJGODY1LCAnTScsIHUn5aeYJyksCiAgICAoMHgyRjg2NiwgJ00nLCB1J+WppicpLAogICAgKDB4MkY4NjcsICdNJywgdSfjm64nKSwKICAgICgweDJGODY4LCAnWCcpLAogICAgKDB4MkY4NjksICdNJywgdSflrIgnKSwKICAgICgweDJGODZBLCAnTScsIHUn5ay+JyksCiAgICAoMHgyRjg2QywgJ00nLCB1J/Chp4gnKSwKICAgICgweDJGODZELCAnTScsIHUn5a+DJyksCiAgICAoMHgyRjg2RSwgJ00nLCB1J+WvmCcpLAogICAgKDB4MkY4NkYsICdNJywgdSflr6cnKSwKICAgICgweDJGODcwLCAnTScsIHUn5a+zJyksCiAgICAoMHgyRjg3MSwgJ00nLCB1J/ChrJgnKSwKICAgICgweDJGODcyLCAnTScsIHUn5a+/JyksCiAgICAoMHgyRjg3MywgJ00nLCB1J+WwhicpLAogICAgKDB4MkY4NzQsICdYJyksCiAgICAoMHgyRjg3NSwgJ00nLCB1J+WwoicpLAogICAgKDB4MkY4NzYsICdNJywgdSfjnoEnKSwKICAgICgweDJGODc3LCAnTScsIHUn5bGgJyksCiAgICAoMHgyRjg3OCwgJ00nLCB1J+WxricpLAogICAgKDB4MkY4NzksICdNJywgdSfls4AnKSwKICAgICgweDJGODdBLCAnTScsIHUn5bKNJyksCiAgICAoMHgyRjg3QiwgJ00nLCB1J/Cht6QnKSwKICAgICgweDJGODdDLCAnTScsIHUn5bWDJyksCiAgICAoMHgyRjg3RCwgJ00nLCB1J/Cht6YnKSwKICAgICgweDJGODdFLCAnTScsIHUn5bWuJyksCiAgICAoMHgyRjg3RiwgJ00nLCB1J+W1qycpLAogICAgKDB4MkY4ODAsICdNJywgdSfltbwnKSwKICAgICgweDJGODgxLCAnTScsIHUn5behJyksCiAgICAoMHgyRjg4MiwgJ00nLCB1J+W3oicpLAogICAgKDB4MkY4ODMsICdNJywgdSfjoK8nKSwKICAgICgweDJGODg0LCAnTScsIHUn5be9JyksCiAgICAoMHgyRjg4NSwgJ00nLCB1J+W4qCcpLAogICAgKDB4MkY4ODYsICdNJywgdSfluL0nKSwKICAgICgweDJGODg3LCAnTScsIHUn5bmpJyksCiAgICAoMHgyRjg4OCwgJ00nLCB1J+OhoicpLAogICAgKDB4MkY4ODksICdNJywgdSfwooaDJyksCiAgICAoMHgyRjg4QSwgJ00nLCB1J+OhvCcpLAogICAgKDB4MkY4OEIsICdNJywgdSflurAnKSwKICAgICgweDJGODhDLCAnTScsIHUn5bqzJyksCiAgICAoMHgyRjg4RCwgJ00nLCB1J+W6ticpLAogICAgKDB4MkY4OEUsICdNJywgdSflu4onKSwKICAgICgweDJGODhGLCAnTScsIHUn8KqOkicpLAogICAgKDB4MkY4OTAsICdNJywgdSflu74nKSwKICAgICgweDJGODkxLCAnTScsIHUn8KKMsScpLAogICAgKDB4MkY4OTMsICdNJywgdSfoiIEnKSwKICAgICgweDJGODk0LCAnTScsIHUn5byiJyksCiAgICAoMHgyRjg5NiwgJ00nLCB1J+OjhycpLAogICAgKDB4MkY4OTcsICdNJywgdSfwo4q4JyksCiAgICAoMHgyRjg5OCwgJ00nLCB1J/Cmh5onKSwKICAgICgweDJGODk5LCAnTScsIHUn5b2iJyksCiAgICAoMHgyRjg5QSwgJ00nLCB1J+W9qycpLAogICAgKDB4MkY4OUIsICdNJywgdSfjo6MnKSwKICAgICgweDJGODlDLCAnTScsIHUn5b6aJyksCiAgICAoMHgyRjg5RCwgJ00nLCB1J+W/jScpLAogICAgKDB4MkY4OUUsICdNJywgdSflv5cnKSwKICAgICgweDJGODlGLCAnTScsIHUn5b+5JyksCiAgICAoMHgyRjhBMCwgJ00nLCB1J+aCgScpLAogICAgKDB4MkY4QTEsICdNJywgdSfjpLonKSwKICAgICgweDJGOEEyLCAnTScsIHUn46ScJyksCiAgICAoMHgyRjhBMywgJ00nLCB1J+aClCcpLAogICAgKDB4MkY4QTQsICdNJywgdSfwopuUJyksCiAgICAoMHgyRjhBNSwgJ00nLCB1J+aDhycpLAogICAgKDB4MkY4QTYsICdNJywgdSfmhYgnKSwKICAgICgweDJGOEE3LCAnTScsIHUn5oWMJyksCiAgICAoMHgyRjhBOCwgJ00nLCB1J+aFjicpLAogICAgKDB4MkY4QTksICdNJywgdSfmhYwnKSwKICAgICgweDJGOEFBLCAnTScsIHUn5oW6JyksCiAgICAoMHgyRjhBQiwgJ00nLCB1J+aGjicpLAogICAgKDB4MkY4QUMsICdNJywgdSfmhrInKSwKICAgICgweDJGOEFELCAnTScsIHUn5oakJyksCiAgICAoMHgyRjhBRSwgJ00nLCB1J+aGrycpLAogICAgKDB4MkY4QUYsICdNJywgdSfmh54nKSwKICAgICgweDJGOEIwLCAnTScsIHUn5oeyJyksCiAgICAoMHgyRjhCMSwgJ00nLCB1J+aHticpLAogICAgKDB4MkY4QjIsICdNJywgdSfmiJAnKSwKICAgICgweDJGOEIzLCAnTScsIHUn5oibJyksCiAgICAoMHgyRjhCNCwgJ00nLCB1J+aJnScpLAogICAgXQoKZGVmIF9zZWdfNjkoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjhCNSwgJ00nLCB1J+aKsScpLAogICAgKDB4MkY4QjYsICdNJywgdSfmi5QnKSwKICAgICgweDJGOEI3LCAnTScsIHUn5o2QJyksCiAgICAoMHgyRjhCOCwgJ00nLCB1J/CirIwnKSwKICAgICgweDJGOEI5LCAnTScsIHUn5oy9JyksCiAgICAoMHgyRjhCQSwgJ00nLCB1J+aLvCcpLAogICAgKDB4MkY4QkIsICdNJywgdSfmjagnKSwKICAgICgweDJGOEJDLCAnTScsIHUn5o6DJyksCiAgICAoMHgyRjhCRCwgJ00nLCB1J+aPpCcpLAogICAgKDB4MkY4QkUsICdNJywgdSfwoq+xJyksCiAgICAoMHgyRjhCRiwgJ00nLCB1J+aQoicpLAogICAgKDB4MkY4QzAsICdNJywgdSfmj4UnKSwKICAgICgweDJGOEMxLCAnTScsIHUn5o6pJyksCiAgICAoMHgyRjhDMiwgJ00nLCB1J+OoricpLAogICAgKDB4MkY4QzMsICdNJywgdSfmkaknKSwKICAgICgweDJGOEM0LCAnTScsIHUn5pG+JyksCiAgICAoMHgyRjhDNSwgJ00nLCB1J+aSnScpLAogICAgKDB4MkY4QzYsICdNJywgdSfmkbcnKSwKICAgICgweDJGOEM3LCAnTScsIHUn46msJyksCiAgICAoMHgyRjhDOCwgJ00nLCB1J+aVjycpLAogICAgKDB4MkY4QzksICdNJywgdSfmlawnKSwKICAgICgweDJGOENBLCAnTScsIHUn8KOAiicpLAogICAgKDB4MkY4Q0IsICdNJywgdSfml6MnKSwKICAgICgweDJGOENDLCAnTScsIHUn5pu4JyksCiAgICAoMHgyRjhDRCwgJ00nLCB1J+aZiScpLAogICAgKDB4MkY4Q0UsICdNJywgdSfjrJknKSwKICAgICgweDJGOENGLCAnTScsIHUn5pqRJyksCiAgICAoMHgyRjhEMCwgJ00nLCB1J+OsiCcpLAogICAgKDB4MkY4RDEsICdNJywgdSfjq6QnKSwKICAgICgweDJGOEQyLCAnTScsIHUn5YaSJyksCiAgICAoMHgyRjhEMywgJ00nLCB1J+WGlScpLAogICAgKDB4MkY4RDQsICdNJywgdSfmnIAnKSwKICAgICgweDJGOEQ1LCAnTScsIHUn5pqcJyksCiAgICAoMHgyRjhENiwgJ00nLCB1J+iCrScpLAogICAgKDB4MkY4RDcsICdNJywgdSfkj5knKSwKICAgICgweDJGOEQ4LCAnTScsIHUn5pyXJyksCiAgICAoMHgyRjhEOSwgJ00nLCB1J+acmycpLAogICAgKDB4MkY4REEsICdNJywgdSfmnKEnKSwKICAgICgweDJGOERCLCAnTScsIHUn5p2eJyksCiAgICAoMHgyRjhEQywgJ00nLCB1J+adkycpLAogICAgKDB4MkY4REQsICdNJywgdSfwo4+DJyksCiAgICAoMHgyRjhERSwgJ00nLCB1J+OtiScpLAogICAgKDB4MkY4REYsICdNJywgdSfmn7onKSwKICAgICgweDJGOEUwLCAnTScsIHUn5p6FJyksCiAgICAoMHgyRjhFMSwgJ00nLCB1J+ahkicpLAogICAgKDB4MkY4RTIsICdNJywgdSfmooUnKSwKICAgICgweDJGOEUzLCAnTScsIHUn8KORrScpLAogICAgKDB4MkY4RTQsICdNJywgdSfmoo4nKSwKICAgICgweDJGOEU1LCAnTScsIHUn5qCfJyksCiAgICAoMHgyRjhFNiwgJ00nLCB1J+aklCcpLAogICAgKDB4MkY4RTcsICdNJywgdSfjrp0nKSwKICAgICgweDJGOEU4LCAnTScsIHUn5qWCJyksCiAgICAoMHgyRjhFOSwgJ00nLCB1J+amoycpLAogICAgKDB4MkY4RUEsICdNJywgdSfmp6onKSwKICAgICgweDJGOEVCLCAnTScsIHUn5qqoJyksCiAgICAoMHgyRjhFQywgJ00nLCB1J/CjmqMnKSwKICAgICgweDJGOEVELCAnTScsIHUn5qubJyksCiAgICAoMHgyRjhFRSwgJ00nLCB1J+OwmCcpLAogICAgKDB4MkY4RUYsICdNJywgdSfmrKEnKSwKICAgICgweDJGOEYwLCAnTScsIHUn8KOipycpLAogICAgKDB4MkY4RjEsICdNJywgdSfmrZQnKSwKICAgICgweDJGOEYyLCAnTScsIHUn47GOJyksCiAgICAoMHgyRjhGMywgJ00nLCB1J+atsicpLAogICAgKDB4MkY4RjQsICdNJywgdSfmrp8nKSwKICAgICgweDJGOEY1LCAnTScsIHUn5q66JyksCiAgICAoMHgyRjhGNiwgJ00nLCB1J+auuycpLAogICAgKDB4MkY4RjcsICdNJywgdSfwo6qNJyksCiAgICAoMHgyRjhGOCwgJ00nLCB1J/ChtIsnKSwKICAgICgweDJGOEY5LCAnTScsIHUn8KOruicpLAogICAgKDB4MkY4RkEsICdNJywgdSfmsY4nKSwKICAgICgweDJGOEZCLCAnTScsIHUn8KOyvCcpLAogICAgKDB4MkY4RkMsICdNJywgdSfmsr8nKSwKICAgICgweDJGOEZELCAnTScsIHUn5rONJyksCiAgICAoMHgyRjhGRSwgJ00nLCB1J+axpycpLAogICAgKDB4MkY4RkYsICdNJywgdSfmtJYnKSwKICAgICgweDJGOTAwLCAnTScsIHUn5rS+JyksCiAgICAoMHgyRjkwMSwgJ00nLCB1J+a1tycpLAogICAgKDB4MkY5MDIsICdNJywgdSfmtYEnKSwKICAgICgweDJGOTAzLCAnTScsIHUn5rWpJyksCiAgICAoMHgyRjkwNCwgJ00nLCB1J+a1uCcpLAogICAgKDB4MkY5MDUsICdNJywgdSfmtoUnKSwKICAgICgweDJGOTA2LCAnTScsIHUn8KO0nicpLAogICAgKDB4MkY5MDcsICdNJywgdSfmtLQnKSwKICAgICgweDJGOTA4LCAnTScsIHUn5rivJyksCiAgICAoMHgyRjkwOSwgJ00nLCB1J+a5ricpLAogICAgKDB4MkY5MEEsICdNJywgdSfjtLMnKSwKICAgICgweDJGOTBCLCAnTScsIHUn5ruLJyksCiAgICAoMHgyRjkwQywgJ00nLCB1J+a7hycpLAogICAgKDB4MkY5MEQsICdNJywgdSfwo7uRJyksCiAgICAoMHgyRjkwRSwgJ00nLCB1J+a3uScpLAogICAgKDB4MkY5MEYsICdNJywgdSfmva4nKSwKICAgICgweDJGOTEwLCAnTScsIHUn8KO9nicpLAogICAgKDB4MkY5MTEsICdNJywgdSfwo76OJyksCiAgICAoMHgyRjkxMiwgJ00nLCB1J+a/hicpLAogICAgKDB4MkY5MTMsICdNJywgdSfngLknKSwKICAgICgweDJGOTE0LCAnTScsIHUn54CeJyksCiAgICAoMHgyRjkxNSwgJ00nLCB1J+eAmycpLAogICAgKDB4MkY5MTYsICdNJywgdSfjtpYnKSwKICAgICgweDJGOTE3LCAnTScsIHUn54GKJyksCiAgICAoMHgyRjkxOCwgJ00nLCB1J+eBvScpLAogICAgXQoKZGVmIF9zZWdfNzAoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjkxOSwgJ00nLCB1J+eBtycpLAogICAgKDB4MkY5MUEsICdNJywgdSfngq0nKSwKICAgICgweDJGOTFCLCAnTScsIHUn8KCUpScpLAogICAgKDB4MkY5MUMsICdNJywgdSfnhYUnKSwKICAgICgweDJGOTFELCAnTScsIHUn8KSJoycpLAogICAgKDB4MkY5MUUsICdNJywgdSfnhpwnKSwKICAgICgweDJGOTFGLCAnWCcpLAogICAgKDB4MkY5MjAsICdNJywgdSfniKgnKSwKICAgICgweDJGOTIxLCAnTScsIHUn54i1JyksCiAgICAoMHgyRjkyMiwgJ00nLCB1J+eJkCcpLAogICAgKDB4MkY5MjMsICdNJywgdSfwpJiIJyksCiAgICAoMHgyRjkyNCwgJ00nLCB1J+eKgCcpLAogICAgKDB4MkY5MjUsICdNJywgdSfnipUnKSwKICAgICgweDJGOTI2LCAnTScsIHUn8KSctScpLAogICAgKDB4MkY5MjcsICdNJywgdSfwpKCUJyksCiAgICAoMHgyRjkyOCwgJ00nLCB1J+eNuicpLAogICAgKDB4MkY5MjksICdNJywgdSfnjosnKSwKICAgICgweDJGOTJBLCAnTScsIHUn47qsJyksCiAgICAoMHgyRjkyQiwgJ00nLCB1J+eOpScpLAogICAgKDB4MkY5MkMsICdNJywgdSfjurgnKSwKICAgICgweDJGOTJFLCAnTScsIHUn55GHJyksCiAgICAoMHgyRjkyRiwgJ00nLCB1J+eRnCcpLAogICAgKDB4MkY5MzAsICdNJywgdSfnkbEnKSwKICAgICgweDJGOTMxLCAnTScsIHUn55KFJyksCiAgICAoMHgyRjkzMiwgJ00nLCB1J+eTiicpLAogICAgKDB4MkY5MzMsICdNJywgdSfjvJsnKSwKICAgICgweDJGOTM0LCAnTScsIHUn55SkJyksCiAgICAoMHgyRjkzNSwgJ00nLCB1J/CksLYnKSwKICAgICgweDJGOTM2LCAnTScsIHUn55S+JyksCiAgICAoMHgyRjkzNywgJ00nLCB1J/CkspInKSwKICAgICgweDJGOTM4LCAnTScsIHUn55WwJyksCiAgICAoMHgyRjkzOSwgJ00nLCB1J/Cihp8nKSwKICAgICgweDJGOTNBLCAnTScsIHUn55iQJyksCiAgICAoMHgyRjkzQiwgJ00nLCB1J/CkvqEnKSwKICAgICgweDJGOTNDLCAnTScsIHUn8KS+uCcpLAogICAgKDB4MkY5M0QsICdNJywgdSfwpYGEJyksCiAgICAoMHgyRjkzRSwgJ00nLCB1J+O/vCcpLAogICAgKDB4MkY5M0YsICdNJywgdSfkgIgnKSwKICAgICgweDJGOTQwLCAnTScsIHUn55u0JyksCiAgICAoMHgyRjk0MSwgJ00nLCB1J/Clg7MnKSwKICAgICgweDJGOTQyLCAnTScsIHUn8KWDsicpLAogICAgKDB4MkY5NDMsICdNJywgdSfwpYSZJyksCiAgICAoMHgyRjk0NCwgJ00nLCB1J/ClhLMnKSwKICAgICgweDJGOTQ1LCAnTScsIHUn55yeJyksCiAgICAoMHgyRjk0NiwgJ00nLCB1J+ecnycpLAogICAgKDB4MkY5NDgsICdNJywgdSfnnYonKSwKICAgICgweDJGOTQ5LCAnTScsIHUn5IC5JyksCiAgICAoMHgyRjk0QSwgJ00nLCB1J+eeiycpLAogICAgKDB4MkY5NEIsICdNJywgdSfkgYYnKSwKICAgICgweDJGOTRDLCAnTScsIHUn5IKWJyksCiAgICAoMHgyRjk0RCwgJ00nLCB1J/ClkJ0nKSwKICAgICgweDJGOTRFLCAnTScsIHUn56GOJyksCiAgICAoMHgyRjk0RiwgJ00nLCB1J+eijCcpLAogICAgKDB4MkY5NTAsICdNJywgdSfno4wnKSwKICAgICgweDJGOTUxLCAnTScsIHUn5IOjJyksCiAgICAoMHgyRjk1MiwgJ00nLCB1J/ClmKYnKSwKICAgICgweDJGOTUzLCAnTScsIHUn56WWJyksCiAgICAoMHgyRjk1NCwgJ00nLCB1J/ClmponKSwKICAgICgweDJGOTU1LCAnTScsIHUn8KWbhScpLAogICAgKDB4MkY5NTYsICdNJywgdSfnpo8nKSwKICAgICgweDJGOTU3LCAnTScsIHUn56erJyksCiAgICAoMHgyRjk1OCwgJ00nLCB1J+SErycpLAogICAgKDB4MkY5NTksICdNJywgdSfnqYAnKSwKICAgICgweDJGOTVBLCAnTScsIHUn56mKJyksCiAgICAoMHgyRjk1QiwgJ00nLCB1J+epjycpLAogICAgKDB4MkY5NUMsICdNJywgdSfwpaW8JyksCiAgICAoMHgyRjk1RCwgJ00nLCB1J/ClqqcnKSwKICAgICgweDJGOTVGLCAnWCcpLAogICAgKDB4MkY5NjAsICdNJywgdSfkiIInKSwKICAgICgweDJGOTYxLCAnTScsIHUn8KWuqycpLAogICAgKDB4MkY5NjIsICdNJywgdSfnr4YnKSwKICAgICgweDJGOTYzLCAnTScsIHUn56+JJyksCiAgICAoMHgyRjk2NCwgJ00nLCB1J+SIpycpLAogICAgKDB4MkY5NjUsICdNJywgdSfwpbKAJyksCiAgICAoMHgyRjk2NiwgJ00nLCB1J+ezkicpLAogICAgKDB4MkY5NjcsICdNJywgdSfkiqAnKSwKICAgICgweDJGOTY4LCAnTScsIHUn57OoJyksCiAgICAoMHgyRjk2OSwgJ00nLCB1J+ezoycpLAogICAgKDB4MkY5NkEsICdNJywgdSfntIAnKSwKICAgICgweDJGOTZCLCAnTScsIHUn8KW+hicpLAogICAgKDB4MkY5NkMsICdNJywgdSfntaMnKSwKICAgICgweDJGOTZELCAnTScsIHUn5IyBJyksCiAgICAoMHgyRjk2RSwgJ00nLCB1J+e3hycpLAogICAgKDB4MkY5NkYsICdNJywgdSfnuIInKSwKICAgICgweDJGOTcwLCAnTScsIHUn57mFJyksCiAgICAoMHgyRjk3MSwgJ00nLCB1J+SMtCcpLAogICAgKDB4MkY5NzIsICdNJywgdSfwpoioJyksCiAgICAoMHgyRjk3MywgJ00nLCB1J/CmiYcnKSwKICAgICgweDJGOTc0LCAnTScsIHUn5I2ZJyksCiAgICAoMHgyRjk3NSwgJ00nLCB1J/Cmi5knKSwKICAgICgweDJGOTc2LCAnTScsIHUn5726JyksCiAgICAoMHgyRjk3NywgJ00nLCB1J/CmjL4nKSwKICAgICgweDJGOTc4LCAnTScsIHUn576VJyksCiAgICAoMHgyRjk3OSwgJ00nLCB1J+e/uicpLAogICAgKDB4MkY5N0EsICdNJywgdSfogIUnKSwKICAgICgweDJGOTdCLCAnTScsIHUn8KaTmicpLAogICAgKDB4MkY5N0MsICdNJywgdSfwppSjJyksCiAgICAoMHgyRjk3RCwgJ00nLCB1J+iBoCcpLAogICAgKDB4MkY5N0UsICdNJywgdSfwppaoJyksCiAgICAoMHgyRjk3RiwgJ00nLCB1J+iBsCcpLAogICAgXQoKZGVmIF9zZWdfNzEoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjk4MCwgJ00nLCB1J/CjjZ8nKSwKICAgICgweDJGOTgxLCAnTScsIHUn5I+VJyksCiAgICAoMHgyRjk4MiwgJ00nLCB1J+iCsicpLAogICAgKDB4MkY5ODMsICdNJywgdSfohIMnKSwKICAgICgweDJGOTg0LCAnTScsIHUn5JCLJyksCiAgICAoMHgyRjk4NSwgJ00nLCB1J+iEvicpLAogICAgKDB4MkY5ODYsICdNJywgdSflqrUnKSwKICAgICgweDJGOTg3LCAnTScsIHUn8KaepycpLAogICAgKDB4MkY5ODgsICdNJywgdSfwpp61JyksCiAgICAoMHgyRjk4OSwgJ00nLCB1J/CjjpMnKSwKICAgICgweDJGOThBLCAnTScsIHUn8KOOnCcpLAogICAgKDB4MkY5OEIsICdNJywgdSfoiIEnKSwKICAgICgweDJGOThDLCAnTScsIHUn6IiEJyksCiAgICAoMHgyRjk4RCwgJ00nLCB1J+i+nicpLAogICAgKDB4MkY5OEUsICdNJywgdSfkkasnKSwKICAgICgweDJGOThGLCAnTScsIHUn6IqRJyksCiAgICAoMHgyRjk5MCwgJ00nLCB1J+iKiycpLAogICAgKDB4MkY5OTEsICdNJywgdSfoip0nKSwKICAgICgweDJGOTkyLCAnTScsIHUn5YqzJyksCiAgICAoMHgyRjk5MywgJ00nLCB1J+iKsScpLAogICAgKDB4MkY5OTQsICdNJywgdSfoirMnKSwKICAgICgweDJGOTk1LCAnTScsIHUn6Iq9JyksCiAgICAoMHgyRjk5NiwgJ00nLCB1J+iLpicpLAogICAgKDB4MkY5OTcsICdNJywgdSfwpqy8JyksCiAgICAoMHgyRjk5OCwgJ00nLCB1J+iLpScpLAogICAgKDB4MkY5OTksICdNJywgdSfojJ0nKSwKICAgICgweDJGOTlBLCAnTScsIHUn6I2jJyksCiAgICAoMHgyRjk5QiwgJ00nLCB1J+iOrScpLAogICAgKDB4MkY5OUMsICdNJywgdSfojKMnKSwKICAgICgweDJGOTlELCAnTScsIHUn6I69JyksCiAgICAoMHgyRjk5RSwgJ00nLCB1J+iPpycpLAogICAgKDB4MkY5OUYsICdNJywgdSfokZcnKSwKICAgICgweDJGOUEwLCAnTScsIHUn6I2TJyksCiAgICAoMHgyRjlBMSwgJ00nLCB1J+iPiicpLAogICAgKDB4MkY5QTIsICdNJywgdSfoj4wnKSwKICAgICgweDJGOUEzLCAnTScsIHUn6I+cJyksCiAgICAoMHgyRjlBNCwgJ00nLCB1J/CmsLYnKSwKICAgICgweDJGOUE1LCAnTScsIHUn8Ka1qycpLAogICAgKDB4MkY5QTYsICdNJywgdSfwprOVJyksCiAgICAoMHgyRjlBNywgJ00nLCB1J+SUqycpLAogICAgKDB4MkY5QTgsICdNJywgdSfok7EnKSwKICAgICgweDJGOUE5LCAnTScsIHUn6JOzJyksCiAgICAoMHgyRjlBQSwgJ00nLCB1J+iUlicpLAogICAgKDB4MkY5QUIsICdNJywgdSfwp4+KJyksCiAgICAoMHgyRjlBQywgJ00nLCB1J+iVpCcpLAogICAgKDB4MkY5QUQsICdNJywgdSfwprysJyksCiAgICAoMHgyRjlBRSwgJ00nLCB1J+SVnScpLAogICAgKDB4MkY5QUYsICdNJywgdSfklaEnKSwKICAgICgweDJGOUIwLCAnTScsIHUn8Ka+sScpLAogICAgKDB4MkY5QjEsICdNJywgdSfwp4OSJyksCiAgICAoMHgyRjlCMiwgJ00nLCB1J+SVqycpLAogICAgKDB4MkY5QjMsICdNJywgdSfomZAnKSwKICAgICgweDJGOUI0LCAnTScsIHUn6JmcJyksCiAgICAoMHgyRjlCNSwgJ00nLCB1J+iZpycpLAogICAgKDB4MkY5QjYsICdNJywgdSfomaknKSwKICAgICgweDJGOUI3LCAnTScsIHUn6JqpJyksCiAgICAoMHgyRjlCOCwgJ00nLCB1J+iaiCcpLAogICAgKDB4MkY5QjksICdNJywgdSfonI4nKSwKICAgICgweDJGOUJBLCAnTScsIHUn6JuiJyksCiAgICAoMHgyRjlCQiwgJ00nLCB1J+iduScpLAogICAgKDB4MkY5QkMsICdNJywgdSfonKgnKSwKICAgICgweDJGOUJELCAnTScsIHUn6J2rJyksCiAgICAoMHgyRjlCRSwgJ00nLCB1J+iehicpLAogICAgKDB4MkY5QkYsICdYJyksCiAgICAoMHgyRjlDMCwgJ00nLCB1J+ifoScpLAogICAgKDB4MkY5QzEsICdNJywgdSfooIEnKSwKICAgICgweDJGOUMyLCAnTScsIHUn5Je5JyksCiAgICAoMHgyRjlDMywgJ00nLCB1J+ihoCcpLAogICAgKDB4MkY5QzQsICdNJywgdSfooaMnKSwKICAgICgweDJGOUM1LCAnTScsIHUn8KeZpycpLAogICAgKDB4MkY5QzYsICdNJywgdSfoo5cnKSwKICAgICgweDJGOUM3LCAnTScsIHUn6KOeJyksCiAgICAoMHgyRjlDOCwgJ00nLCB1J+SYtScpLAogICAgKDB4MkY5QzksICdNJywgdSfoo7onKSwKICAgICgweDJGOUNBLCAnTScsIHUn45K7JyksCiAgICAoMHgyRjlDQiwgJ00nLCB1J/Cnoq4nKSwKICAgICgweDJGOUNDLCAnTScsIHUn8KelpicpLAogICAgKDB4MkY5Q0QsICdNJywgdSfkmr4nKSwKICAgICgweDJGOUNFLCAnTScsIHUn5JuHJyksCiAgICAoMHgyRjlDRiwgJ00nLCB1J+iqoCcpLAogICAgKDB4MkY5RDAsICdNJywgdSfoq60nKSwKICAgICgweDJGOUQxLCAnTScsIHUn6K6KJyksCiAgICAoMHgyRjlEMiwgJ00nLCB1J+ixlScpLAogICAgKDB4MkY5RDMsICdNJywgdSfwp7KoJyksCiAgICAoMHgyRjlENCwgJ00nLCB1J+iyqycpLAogICAgKDB4MkY5RDUsICdNJywgdSfos4EnKSwKICAgICgweDJGOUQ2LCAnTScsIHUn6LSbJyksCiAgICAoMHgyRjlENywgJ00nLCB1J+i1tycpLAogICAgKDB4MkY5RDgsICdNJywgdSfwp7yvJyksCiAgICAoMHgyRjlEOSwgJ00nLCB1J/CgoIQnKSwKICAgICgweDJGOURBLCAnTScsIHUn6LeLJyksCiAgICAoMHgyRjlEQiwgJ00nLCB1J+i2vCcpLAogICAgKDB4MkY5REMsICdNJywgdSfot7AnKSwKICAgICgweDJGOURELCAnTScsIHUn8KCjnicpLAogICAgKDB4MkY5REUsICdNJywgdSfou5QnKSwKICAgICgweDJGOURGLCAnTScsIHUn6Ly4JyksCiAgICAoMHgyRjlFMCwgJ00nLCB1J/Col5InKSwKICAgICgweDJGOUUxLCAnTScsIHUn8KiXrScpLAogICAgKDB4MkY5RTIsICdNJywgdSfpgpQnKSwKICAgICgweDJGOUUzLCAnTScsIHUn6YOxJyksCiAgICBdCgpkZWYgX3NlZ183MigpOgogICAgcmV0dXJuIFsKICAgICgweDJGOUU0LCAnTScsIHUn6YSRJyksCiAgICAoMHgyRjlFNSwgJ00nLCB1J/ConK4nKSwKICAgICgweDJGOUU2LCAnTScsIHUn6YSbJyksCiAgICAoMHgyRjlFNywgJ00nLCB1J+mIuCcpLAogICAgKDB4MkY5RTgsICdNJywgdSfpi5cnKSwKICAgICgweDJGOUU5LCAnTScsIHUn6YuYJyksCiAgICAoMHgyRjlFQSwgJ00nLCB1J+mJvCcpLAogICAgKDB4MkY5RUIsICdNJywgdSfpj7knKSwKICAgICgweDJGOUVDLCAnTScsIHUn6ZCVJyksCiAgICAoMHgyRjlFRCwgJ00nLCB1J/Cor7onKSwKICAgICgweDJGOUVFLCAnTScsIHUn6ZaLJyksCiAgICAoMHgyRjlFRiwgJ00nLCB1J+SmlScpLAogICAgKDB4MkY5RjAsICdNJywgdSfplrcnKSwKICAgICgweDJGOUYxLCAnTScsIHUn8Ki1tycpLAogICAgKDB4MkY5RjIsICdNJywgdSfkp6YnKSwKICAgICgweDJGOUYzLCAnTScsIHUn6ZuDJyksCiAgICAoMHgyRjlGNCwgJ00nLCB1J+W2sicpLAogICAgKDB4MkY5RjUsICdNJywgdSfpnKMnKSwKICAgICgweDJGOUY2LCAnTScsIHUn8KmFhScpLAogICAgKDB4MkY5RjcsICdNJywgdSfwqYiaJyksCiAgICAoMHgyRjlGOCwgJ00nLCB1J+SpricpLAogICAgKDB4MkY5RjksICdNJywgdSfkqbYnKSwKICAgICgweDJGOUZBLCAnTScsIHUn6Z+gJyksCiAgICAoMHgyRjlGQiwgJ00nLCB1J/CpkIonKSwKICAgICgweDJGOUZDLCAnTScsIHUn5KqyJyksCiAgICAoMHgyRjlGRCwgJ00nLCB1J/CpkpYnKSwKICAgICgweDJGOUZFLCAnTScsIHUn6aCLJyksCiAgICAoMHgyRkEwMCwgJ00nLCB1J+mgqScpLAogICAgKDB4MkZBMDEsICdNJywgdSfwqZa2JyksCiAgICAoMHgyRkEwMiwgJ00nLCB1J+mjoicpLAogICAgKDB4MkZBMDMsICdNJywgdSfkrLMnKSwKICAgICgweDJGQTA0LCAnTScsIHUn6aSpJyksCiAgICAoMHgyRkEwNSwgJ00nLCB1J+mmpycpLAogICAgKDB4MkZBMDYsICdNJywgdSfpp4InKSwKICAgICgweDJGQTA3LCAnTScsIHUn6ae+JyksCiAgICAoMHgyRkEwOCwgJ00nLCB1J+SvjicpLAogICAgKDB4MkZBMDksICdNJywgdSfwqaywJyksCiAgICAoMHgyRkEwQSwgJ00nLCB1J+mskicpLAogICAgKDB4MkZBMEIsICdNJywgdSfpsYAnKSwKICAgICgweDJGQTBDLCAnTScsIHUn6bO9JyksCiAgICAoMHgyRkEwRCwgJ00nLCB1J+SzjicpLAogICAgKDB4MkZBMEUsICdNJywgdSfks60nKSwKICAgICgweDJGQTBGLCAnTScsIHUn6bWnJyksCiAgICAoMHgyRkExMCwgJ00nLCB1J/Cqg44nKSwKICAgICgweDJGQTExLCAnTScsIHUn5LO4JyksCiAgICAoMHgyRkExMiwgJ00nLCB1J/CqhIUnKSwKICAgICgweDJGQTEzLCAnTScsIHUn8KqIjicpLAogICAgKDB4MkZBMTQsICdNJywgdSfwqoqRJyksCiAgICAoMHgyRkExNSwgJ00nLCB1J+m6uycpLAogICAgKDB4MkZBMTYsICdNJywgdSfktZYnKSwKICAgICgweDJGQTE3LCAnTScsIHUn6bu5JyksCiAgICAoMHgyRkExOCwgJ00nLCB1J+m7vicpLAogICAgKDB4MkZBMTksICdNJywgdSfpvIUnKSwKICAgICgweDJGQTFBLCAnTScsIHUn6byPJyksCiAgICAoMHgyRkExQiwgJ00nLCB1J+m8licpLAogICAgKDB4MkZBMUMsICdNJywgdSfpvLsnKSwKICAgICgweDJGQTFELCAnTScsIHUn8KqYgCcpLAogICAgKDB4MkZBMUUsICdYJyksCiAgICAoMHhFMDEwMCwgJ0knKSwKICAgICgweEUwMUYwLCAnWCcpLAogICAgXQoKdXRzNDZkYXRhID0gdHVwbGUoCiAgICBfc2VnXzAoKQogICAgKyBfc2VnXzEoKQogICAgKyBfc2VnXzIoKQogICAgKyBfc2VnXzMoKQogICAgKyBfc2VnXzQoKQogICAgKyBfc2VnXzUoKQogICAgKyBfc2VnXzYoKQogICAgKyBfc2VnXzcoKQogICAgKyBfc2VnXzgoKQogICAgKyBfc2VnXzkoKQogICAgKyBfc2VnXzEwKCkKICAgICsgX3NlZ18xMSgpCiAgICArIF9zZWdfMTIoKQogICAgKyBfc2VnXzEzKCkKICAgICsgX3NlZ18xNCgpCiAgICArIF9zZWdfMTUoKQogICAgKyBfc2VnXzE2KCkKICAgICsgX3NlZ18xNygpCiAgICArIF9zZWdfMTgoKQogICAgKyBfc2VnXzE5KCkKICAgICsgX3NlZ18yMCgpCiAgICArIF9zZWdfMjEoKQogICAgKyBfc2VnXzIyKCkKICAgICsgX3NlZ18yMygpCiAgICArIF9zZWdfMjQoKQogICAgKyBfc2VnXzI1KCkKICAgICsgX3NlZ18yNigpCiAgICArIF9zZWdfMjcoKQogICAgKyBfc2VnXzI4KCkKICAgICsgX3NlZ18yOSgpCiAgICArIF9zZWdfMzAoKQogICAgKyBfc2VnXzMxKCkKICAgICsgX3NlZ18zMigpCiAgICArIF9zZWdfMzMoKQogICAgKyBfc2VnXzM0KCkKICAgICsgX3NlZ18zNSgpCiAgICArIF9zZWdfMzYoKQogICAgKyBfc2VnXzM3KCkKICAgICsgX3NlZ18zOCgpCiAgICArIF9zZWdfMzkoKQogICAgKyBfc2VnXzQwKCkKICAgICsgX3NlZ180MSgpCiAgICArIF9zZWdfNDIoKQogICAgKyBfc2VnXzQzKCkKICAgICsgX3NlZ180NCgpCiAgICArIF9zZWdfNDUoKQogICAgKyBfc2VnXzQ2KCkKICAgICsgX3NlZ180NygpCiAgICArIF9zZWdfNDgoKQogICAgKyBfc2VnXzQ5KCkKICAgICsgX3NlZ181MCgpCiAgICArIF9zZWdfNTEoKQogICAgKyBfc2VnXzUyKCkKICAgICsgX3NlZ181MygpCiAgICArIF9zZWdfNTQoKQogICAgKyBfc2VnXzU1KCkKICAgICsgX3NlZ181NigpCiAgICArIF9zZWdfNTcoKQogICAgKyBfc2VnXzU4KCkKICAgICsgX3NlZ181OSgpCiAgICArIF9zZWdfNjAoKQogICAgKyBfc2VnXzYxKCkKICAgICsgX3NlZ182MigpCiAgICArIF9zZWdfNjMoKQogICAgKyBfc2VnXzY0KCkKICAgICsgX3NlZ182NSgpCiAgICArIF9zZWdfNjYoKQogICAgKyBfc2VnXzY3KCkKICAgICsgX3NlZ182OCgpCiAgICArIF9zZWdfNjkoKQogICAgKyBfc2VnXzcwKCkKICAgICsgX3NlZ183MSgpCiAgICArIF9zZWdfNzIoKQopClBLAwQUAAAAAAAAACEA3cSmBTA5AQAwOQEANQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaXBhZGRyZXNzLnB5IyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLgojICBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCgoiIiJBIGZhc3QsIGxpZ2h0d2VpZ2h0IElQdjQvSVB2NiBtYW5pcHVsYXRpb24gbGlicmFyeSBpbiBQeXRob24uCgpUaGlzIGxpYnJhcnkgaXMgdXNlZCB0byBjcmVhdGUvcG9rZS9tYW5pcHVsYXRlIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzCmFuZCBuZXR3b3Jrcy4KCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgoKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgc3RydWN0CgpfX3ZlcnNpb25fXyA9ICcxLjAuMTcnCgojIENvbXBhdGliaWxpdHkgZnVuY3Rpb25zCl9jb21wYXRfaW50X3R5cGVzID0gKGludCwpCnRyeToKICAgIF9jb21wYXRfaW50X3R5cGVzID0gKGludCwgbG9uZykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIHBhc3MKdHJ5OgogICAgX2NvbXBhdF9zdHIgPSB1bmljb2RlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBfY29tcGF0X3N0ciA9IHN0cgogICAgYXNzZXJ0IGJ5dGVzICE9IHN0cgppZiBiJ1wwJ1swXSA9PSAwOiAgIyBQeXRob24gMyBzZW1hbnRpY3MKICAgIGRlZiBfY29tcGF0X2J5dGVzX3RvX2J5dGVfdmFscyhieXQpOgogICAgICAgIHJldHVybiBieXQKZWxzZToKICAgIGRlZiBfY29tcGF0X2J5dGVzX3RvX2J5dGVfdmFscyhieXQpOgogICAgICAgIHJldHVybiBbc3RydWN0LnVucGFjayhiJyFCJywgYilbMF0gZm9yIGIgaW4gYnl0XQp0cnk6CiAgICBfY29tcGF0X2ludF9mcm9tX2J5dGVfdmFscyA9IGludC5mcm9tX2J5dGVzCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgIGRlZiBfY29tcGF0X2ludF9mcm9tX2J5dGVfdmFscyhieXR2YWxzLCBlbmRpYW5lc3MpOgogICAgICAgIGFzc2VydCBlbmRpYW5lc3MgPT0gJ2JpZycKICAgICAgICByZXMgPSAwCiAgICAgICAgZm9yIGJ2IGluIGJ5dHZhbHM6CiAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGJ2LCBfY29tcGF0X2ludF90eXBlcykKICAgICAgICAgICAgcmVzID0gKHJlcyA8PCA4KSArIGJ2CiAgICAgICAgcmV0dXJuIHJlcwoKCmRlZiBfY29tcGF0X3RvX2J5dGVzKGludHZhbCwgbGVuZ3RoLCBlbmRpYW5lc3MpOgogICAgYXNzZXJ0IGlzaW5zdGFuY2UoaW50dmFsLCBfY29tcGF0X2ludF90eXBlcykKICAgIGFzc2VydCBlbmRpYW5lc3MgPT0gJ2JpZycKICAgIGlmIGxlbmd0aCA9PSA0OgogICAgICAgIGlmIGludHZhbCA8IDAgb3IgaW50dmFsID49IDIgKiogMzI6CiAgICAgICAgICAgIHJhaXNlIHN0cnVjdC5lcnJvcigiaW50ZWdlciBvdXQgb2YgcmFuZ2UgZm9yICdJJyBmb3JtYXQgY29kZSIpCiAgICAgICAgcmV0dXJuIHN0cnVjdC5wYWNrKGInIUknLCBpbnR2YWwpCiAgICBlbGlmIGxlbmd0aCA9PSAxNjoKICAgICAgICBpZiBpbnR2YWwgPCAwIG9yIGludHZhbCA+PSAyICoqIDEyODoKICAgICAgICAgICAgcmFpc2Ugc3RydWN0LmVycm9yKCJpbnRlZ2VyIG91dCBvZiByYW5nZSBmb3IgJ1FRJyBmb3JtYXQgY29kZSIpCiAgICAgICAgcmV0dXJuIHN0cnVjdC5wYWNrKGInIVFRJywgaW50dmFsID4+IDY0LCBpbnR2YWwgJiAweGZmZmZmZmZmZmZmZmZmZmYpCiAgICBlbHNlOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQppZiBoYXNhdHRyKGludCwgJ2JpdF9sZW5ndGgnKToKICAgICMgTm90IGludC5iaXRfbGVuZ3RoICwgc2luY2UgdGhhdCB3b24ndCB3b3JrIGluIDIuNyB3aGVyZSBsb25nIGV4aXN0cwogICAgZGVmIF9jb21wYXRfYml0X2xlbmd0aChpKToKICAgICAgICByZXR1cm4gaS5iaXRfbGVuZ3RoKCkKZWxzZToKICAgIGRlZiBfY29tcGF0X2JpdF9sZW5ndGgoaSk6CiAgICAgICAgZm9yIHJlcyBpbiBpdGVydG9vbHMuY291bnQoKToKICAgICAgICAgICAgaWYgaSA+PiByZXMgPT0gMDoKICAgICAgICAgICAgICAgIHJldHVybiByZXMKCgpkZWYgX2NvbXBhdF9yYW5nZShzdGFydCwgZW5kLCBzdGVwPTEpOgogICAgYXNzZXJ0IHN0ZXAgPiAwCiAgICBpID0gc3RhcnQKICAgIHdoaWxlIGkgPCBlbmQ6CiAgICAgICAgeWllbGQgaQogICAgICAgIGkgKz0gc3RlcAoKCmNsYXNzIF9Ub3RhbE9yZGVyaW5nTWl4aW4ob2JqZWN0KToKICAgIF9fc2xvdHNfXyA9ICgpCgogICAgIyBIZWxwZXIgdGhhdCBkZXJpdmVzIHRoZSBvdGhlciBjb21wYXJpc29uIG9wZXJhdGlvbnMgZnJvbQogICAgIyBfX2x0X18gYW5kIF9fZXFfXwogICAgIyBXZSBhdm9pZCBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcgYmVjYXVzZSBpdCBkb2Vzbid0IGhhbmRsZQogICAgIyBOb3RJbXBsZW1lbnRlZCBjb3JyZWN0bHkgeWV0IChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTAwNDIpCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgZXF1YWwgPSBzZWxmLl9fZXFfXyhvdGhlcikKICAgICAgICBpZiBlcXVhbCBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIG5vdCBlcXVhbAoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBsZXNzID0gc2VsZi5fX2x0X18ob3RoZXIpCiAgICAgICAgaWYgbGVzcyBpcyBOb3RJbXBsZW1lbnRlZCBvciBub3QgbGVzczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19lcV9fKG90aGVyKQogICAgICAgIHJldHVybiBsZXNzCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgbGVzcyA9IHNlbGYuX19sdF9fKG90aGVyKQogICAgICAgIGlmIGxlc3MgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVxdWFsID0gc2VsZi5fX2VxX18ob3RoZXIpCiAgICAgICAgaWYgZXF1YWwgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBub3QgKGxlc3Mgb3IgZXF1YWwpCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgbGVzcyA9IHNlbGYuX19sdF9fKG90aGVyKQogICAgICAgIGlmIGxlc3MgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBub3QgbGVzcwoKCklQVjRMRU5HVEggPSAzMgpJUFY2TEVOR1RIID0gMTI4CgoKY2xhc3MgQWRkcmVzc1ZhbHVlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAiIiJBIFZhbHVlIEVycm9yIHJlbGF0ZWQgdG8gdGhlIGFkZHJlc3MuIiIiCgoKY2xhc3MgTmV0bWFza1ZhbHVlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAiIiJBIFZhbHVlIEVycm9yIHJlbGF0ZWQgdG8gdGhlIG5ldG1hc2suIiIiCgoKZGVmIGlwX2FkZHJlc3MoYWRkcmVzcyk6CiAgICAiIiJUYWtlIGFuIElQIHN0cmluZy9pbnQgYW5kIHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIsIHRoZSBJUCBhZGRyZXNzLiAgRWl0aGVyIElQdjQgb3IKICAgICAgICAgIElQdjYgYWRkcmVzc2VzIG1heSBiZSBzdXBwbGllZDsgaW50ZWdlcnMgbGVzcyB0aGFuIDIqKjMyIHdpbGwKICAgICAgICAgIGJlIGNvbnNpZGVyZWQgdG8gYmUgSVB2NCBieSBkZWZhdWx0LgoKICAgIFJldHVybnM6CiAgICAgICAgQW4gSVB2NEFkZHJlc3Mgb3IgSVB2NkFkZHJlc3Mgb2JqZWN0LgoKICAgIFJhaXNlczoKICAgICAgICBWYWx1ZUVycm9yOiBpZiB0aGUgKmFkZHJlc3MqIHBhc3NlZCBpc24ndCBlaXRoZXIgYSB2NCBvciBhIHY2CiAgICAgICAgICBhZGRyZXNzCgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIElQdjRBZGRyZXNzKGFkZHJlc3MpCiAgICBleGNlcHQgKEFkZHJlc3NWYWx1ZUVycm9yLCBOZXRtYXNrVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICByZXR1cm4gSVB2NkFkZHJlc3MoYWRkcmVzcykKICAgIGV4Y2VwdCAoQWRkcmVzc1ZhbHVlRXJyb3IsIE5ldG1hc2tWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgogICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBieXRlcyk6CiAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoCiAgICAgICAgICAgICclciBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW4gSVB2NCBvciBJUHY2IGFkZHJlc3MuICcKICAgICAgICAgICAgJ0RpZCB5b3UgcGFzcyBpbiBhIGJ5dGVzIChzdHIgaW4gUHl0aG9uIDIpIGluc3RlYWQgb2YnCiAgICAgICAgICAgICcgYSB1bmljb2RlIG9iamVjdD8nICUgYWRkcmVzcykKCiAgICByYWlzZSBWYWx1ZUVycm9yKCclciBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW4gSVB2NCBvciBJUHY2IGFkZHJlc3MnICUKICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcykKCgpkZWYgaXBfbmV0d29yayhhZGRyZXNzLCBzdHJpY3Q9VHJ1ZSk6CiAgICAiIiJUYWtlIGFuIElQIHN0cmluZy9pbnQgYW5kIHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIsIHRoZSBJUCBuZXR3b3JrLiAgRWl0aGVyIElQdjQgb3IKICAgICAgICAgIElQdjYgbmV0d29ya3MgbWF5IGJlIHN1cHBsaWVkOyBpbnRlZ2VycyBsZXNzIHRoYW4gMioqMzIgd2lsbAogICAgICAgICAgYmUgY29uc2lkZXJlZCB0byBiZSBJUHY0IGJ5IGRlZmF1bHQuCgogICAgUmV0dXJuczoKICAgICAgICBBbiBJUHY0TmV0d29yayBvciBJUHY2TmV0d29yayBvYmplY3QuCgogICAgUmFpc2VzOgogICAgICAgIFZhbHVlRXJyb3I6IGlmIHRoZSBzdHJpbmcgcGFzc2VkIGlzbid0IGVpdGhlciBhIHY0IG9yIGEgdjYKICAgICAgICAgIGFkZHJlc3MuIE9yIGlmIHRoZSBuZXR3b3JrIGhhcyBob3N0IGJpdHMgc2V0LgoKICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBJUHY0TmV0d29yayhhZGRyZXNzLCBzdHJpY3QpCiAgICBleGNlcHQgKEFkZHJlc3NWYWx1ZUVycm9yLCBOZXRtYXNrVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICByZXR1cm4gSVB2Nk5ldHdvcmsoYWRkcmVzcywgc3RyaWN0KQogICAgZXhjZXB0IChBZGRyZXNzVmFsdWVFcnJvciwgTmV0bWFza1ZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCiAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIGJ5dGVzKToKICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigKICAgICAgICAgICAgJyVyIGRvZXMgbm90IGFwcGVhciB0byBiZSBhbiBJUHY0IG9yIElQdjYgbmV0d29yay4gJwogICAgICAgICAgICAnRGlkIHlvdSBwYXNzIGluIGEgYnl0ZXMgKHN0ciBpbiBQeXRob24gMikgaW5zdGVhZCBvZicKICAgICAgICAgICAgJyBhIHVuaWNvZGUgb2JqZWN0PycgJSBhZGRyZXNzKQoKICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVyIGRvZXMgbm90IGFwcGVhciB0byBiZSBhbiBJUHY0IG9yIElQdjYgbmV0d29yaycgJQogICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKQoKCmRlZiBpcF9pbnRlcmZhY2UoYWRkcmVzcyk6CiAgICAiIiJUYWtlIGFuIElQIHN0cmluZy9pbnQgYW5kIHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIsIHRoZSBJUCBhZGRyZXNzLiAgRWl0aGVyIElQdjQgb3IKICAgICAgICAgIElQdjYgYWRkcmVzc2VzIG1heSBiZSBzdXBwbGllZDsgaW50ZWdlcnMgbGVzcyB0aGFuIDIqKjMyIHdpbGwKICAgICAgICAgIGJlIGNvbnNpZGVyZWQgdG8gYmUgSVB2NCBieSBkZWZhdWx0LgoKICAgIFJldHVybnM6CiAgICAgICAgQW4gSVB2NEludGVyZmFjZSBvciBJUHY2SW50ZXJmYWNlIG9iamVjdC4KCiAgICBSYWlzZXM6CiAgICAgICAgVmFsdWVFcnJvcjogaWYgdGhlIHN0cmluZyBwYXNzZWQgaXNuJ3QgZWl0aGVyIGEgdjQgb3IgYSB2NgogICAgICAgICAgYWRkcmVzcy4KCiAgICBOb3RlczoKICAgICAgICBUaGUgSVB2P0ludGVyZmFjZSBjbGFzc2VzIGRlc2NyaWJlIGFuIEFkZHJlc3Mgb24gYSBwYXJ0aWN1bGFyCiAgICAgICAgTmV0d29yaywgc28gdGhleSdyZSBiYXNpY2FsbHkgYSBjb21iaW5hdGlvbiBvZiBib3RoIHRoZSBBZGRyZXNzCiAgICAgICAgYW5kIE5ldHdvcmsgY2xhc3Nlcy4KCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gSVB2NEludGVyZmFjZShhZGRyZXNzKQogICAgZXhjZXB0IChBZGRyZXNzVmFsdWVFcnJvciwgTmV0bWFza1ZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIElQdjZJbnRlcmZhY2UoYWRkcmVzcykKICAgIGV4Y2VwdCAoQWRkcmVzc1ZhbHVlRXJyb3IsIE5ldG1hc2tWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgogICAgcmFpc2UgVmFsdWVFcnJvcignJXIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFuIElQdjQgb3IgSVB2NiBpbnRlcmZhY2UnICUKICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcykKCgpkZWYgdjRfaW50X3RvX3BhY2tlZChhZGRyZXNzKToKICAgICIiIlJlcHJlc2VudCBhbiBhZGRyZXNzIGFzIDQgcGFja2VkIGJ5dGVzIGluIG5ldHdvcmsgKGJpZy1lbmRpYW4pIG9yZGVyLgoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzczogQW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhbiBJUHY0IElQIGFkZHJlc3MuCgogICAgUmV0dXJuczoKICAgICAgICBUaGUgaW50ZWdlciBhZGRyZXNzIHBhY2tlZCBhcyA0IGJ5dGVzIGluIG5ldHdvcmsgKGJpZy1lbmRpYW4pIG9yZGVyLgoKICAgIFJhaXNlczoKICAgICAgICBWYWx1ZUVycm9yOiBJZiB0aGUgaW50ZWdlciBpcyBuZWdhdGl2ZSBvciB0b28gbGFyZ2UgdG8gYmUgYW4KICAgICAgICAgIElQdjQgSVAgYWRkcmVzcy4KCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gX2NvbXBhdF90b19ieXRlcyhhZGRyZXNzLCA0LCAnYmlnJykKICAgIGV4Y2VwdCAoc3RydWN0LmVycm9yLCBPdmVyZmxvd0Vycm9yKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBZGRyZXNzIG5lZ2F0aXZlIG9yIHRvbyBsYXJnZSBmb3IgSVB2NCIpCgoKZGVmIHY2X2ludF90b19wYWNrZWQoYWRkcmVzcyk6CiAgICAiIiJSZXByZXNlbnQgYW4gYWRkcmVzcyBhcyAxNiBwYWNrZWQgYnl0ZXMgaW4gbmV0d29yayAoYmlnLWVuZGlhbikgb3JkZXIuCgogICAgQXJnczoKICAgICAgICBhZGRyZXNzOiBBbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGFuIElQdjYgSVAgYWRkcmVzcy4KCiAgICBSZXR1cm5zOgogICAgICAgIFRoZSBpbnRlZ2VyIGFkZHJlc3MgcGFja2VkIGFzIDE2IGJ5dGVzIGluIG5ldHdvcmsgKGJpZy1lbmRpYW4pIG9yZGVyLgoKICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBfY29tcGF0X3RvX2J5dGVzKGFkZHJlc3MsIDE2LCAnYmlnJykKICAgIGV4Y2VwdCAoc3RydWN0LmVycm9yLCBPdmVyZmxvd0Vycm9yKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBZGRyZXNzIG5lZ2F0aXZlIG9yIHRvbyBsYXJnZSBmb3IgSVB2NiIpCgoKZGVmIF9zcGxpdF9vcHRpb25hbF9uZXRtYXNrKGFkZHJlc3MpOgogICAgIiIiSGVscGVyIHRvIHNwbGl0IHRoZSBuZXRtYXNrIGFuZCByYWlzZSBBZGRyZXNzVmFsdWVFcnJvciBpZiBuZWVkZWQiIiIKICAgIGFkZHIgPSBfY29tcGF0X3N0cihhZGRyZXNzKS5zcGxpdCgnLycpCiAgICBpZiBsZW4oYWRkcikgPiAyOgogICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCJPbmx5IG9uZSAnLycgcGVybWl0dGVkIGluICVyIiAlIGFkZHJlc3MpCiAgICByZXR1cm4gYWRkcgoKCmRlZiBfZmluZF9hZGRyZXNzX3JhbmdlKGFkZHJlc3Nlcyk6CiAgICAiIiJGaW5kIGEgc2VxdWVuY2Ugb2Ygc29ydGVkIGRlZHVwbGljYXRlZCBJUHYjQWRkcmVzcy4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3NlczogYSBsaXN0IG9mIElQdiNBZGRyZXNzIG9iamVjdHMuCgogICAgWWllbGRzOgogICAgICAgIEEgdHVwbGUgY29udGFpbmluZyB0aGUgZmlyc3QgYW5kIGxhc3QgSVAgYWRkcmVzc2VzIGluIHRoZSBzZXF1ZW5jZS4KCiAgICAiIiIKICAgIGl0ID0gaXRlcihhZGRyZXNzZXMpCiAgICBmaXJzdCA9IGxhc3QgPSBuZXh0KGl0KQogICAgZm9yIGlwIGluIGl0OgogICAgICAgIGlmIGlwLl9pcCAhPSBsYXN0Ll9pcCArIDE6CiAgICAgICAgICAgIHlpZWxkIGZpcnN0LCBsYXN0CiAgICAgICAgICAgIGZpcnN0ID0gaXAKICAgICAgICBsYXN0ID0gaXAKICAgIHlpZWxkIGZpcnN0LCBsYXN0CgoKZGVmIF9jb3VudF9yaWdodGhhbmRfemVyb19iaXRzKG51bWJlciwgYml0cyk6CiAgICAiIiJDb3VudCB0aGUgbnVtYmVyIG9mIHplcm8gYml0cyBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLgoKICAgIEFyZ3M6CiAgICAgICAgbnVtYmVyOiBhbiBpbnRlZ2VyLgogICAgICAgIGJpdHM6IG1heGltdW0gbnVtYmVyIG9mIGJpdHMgdG8gY291bnQuCgogICAgUmV0dXJuczoKICAgICAgICBUaGUgbnVtYmVyIG9mIHplcm8gYml0cyBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBudW1iZXIuCgogICAgIiIiCiAgICBpZiBudW1iZXIgPT0gMDoKICAgICAgICByZXR1cm4gYml0cwogICAgcmV0dXJuIG1pbihiaXRzLCBfY29tcGF0X2JpdF9sZW5ndGgofm51bWJlciAmIChudW1iZXIgLSAxKSkpCgoKZGVmIHN1bW1hcml6ZV9hZGRyZXNzX3JhbmdlKGZpcnN0LCBsYXN0KToKICAgICIiIlN1bW1hcml6ZSBhIG5ldHdvcmsgcmFuZ2UgZ2l2ZW4gdGhlIGZpcnN0IGFuZCBsYXN0IElQIGFkZHJlc3Nlcy4KCiAgICBFeGFtcGxlOgogICAgICAgID4+PiBsaXN0KHN1bW1hcml6ZV9hZGRyZXNzX3JhbmdlKElQdjRBZGRyZXNzKCcxOTIuMC4yLjAnKSwKICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHY0QWRkcmVzcygnMTkyLjAuMi4xMzAnKSkpCiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCiAgICAgICAgW0lQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjUnKSwgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTI4LzMxJyksCiAgICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4yLjEzMC8zMicpXQoKICAgIEFyZ3M6CiAgICAgICAgZmlyc3Q6IHRoZSBmaXJzdCBJUHY0QWRkcmVzcyBvciBJUHY2QWRkcmVzcyBpbiB0aGUgcmFuZ2UuCiAgICAgICAgbGFzdDogdGhlIGxhc3QgSVB2NEFkZHJlc3Mgb3IgSVB2NkFkZHJlc3MgaW4gdGhlIHJhbmdlLgoKICAgIFJldHVybnM6CiAgICAgICAgQW4gaXRlcmF0b3Igb2YgdGhlIHN1bW1hcml6ZWQgSVB2KDR8NikgbmV0d29yayBvYmplY3RzLgoKICAgIFJhaXNlOgogICAgICAgIFR5cGVFcnJvcjoKICAgICAgICAgICAgSWYgdGhlIGZpcnN0IGFuZCBsYXN0IG9iamVjdHMgYXJlIG5vdCBJUCBhZGRyZXNzZXMuCiAgICAgICAgICAgIElmIHRoZSBmaXJzdCBhbmQgbGFzdCBvYmplY3RzIGFyZSBub3QgdGhlIHNhbWUgdmVyc2lvbi4KICAgICAgICBWYWx1ZUVycm9yOgogICAgICAgICAgICBJZiB0aGUgbGFzdCBvYmplY3QgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgZmlyc3QuCiAgICAgICAgICAgIElmIHRoZSB2ZXJzaW9uIG9mIHRoZSBmaXJzdCBhZGRyZXNzIGlzIG5vdCA0IG9yIDYuCgogICAgIiIiCiAgICBpZiAobm90IChpc2luc3RhbmNlKGZpcnN0LCBfQmFzZUFkZHJlc3MpIGFuZAogICAgICAgICAgICAgaXNpbnN0YW5jZShsYXN0LCBfQmFzZUFkZHJlc3MpKSk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmaXJzdCBhbmQgbGFzdCBtdXN0IGJlIElQIGFkZHJlc3Nlcywgbm90IG5ldHdvcmtzJykKICAgIGlmIGZpcnN0LnZlcnNpb24gIT0gbGFzdC52ZXJzaW9uOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCBsYXN0KSkKICAgIGlmIGZpcnN0ID4gbGFzdDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsYXN0IElQIGFkZHJlc3MgbXVzdCBiZSBncmVhdGVyIHRoYW4gZmlyc3QnKQoKICAgIGlmIGZpcnN0LnZlcnNpb24gPT0gNDoKICAgICAgICBpcCA9IElQdjROZXR3b3JrCiAgICBlbGlmIGZpcnN0LnZlcnNpb24gPT0gNjoKICAgICAgICBpcCA9IElQdjZOZXR3b3JrCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Vua25vd24gSVAgdmVyc2lvbicpCgogICAgaXBfYml0cyA9IGZpcnN0Ll9tYXhfcHJlZml4bGVuCiAgICBmaXJzdF9pbnQgPSBmaXJzdC5faXAKICAgIGxhc3RfaW50ID0gbGFzdC5faXAKICAgIHdoaWxlIGZpcnN0X2ludCA8PSBsYXN0X2ludDoKICAgICAgICBuYml0cyA9IG1pbihfY291bnRfcmlnaHRoYW5kX3plcm9fYml0cyhmaXJzdF9pbnQsIGlwX2JpdHMpLAogICAgICAgICAgICAgICAgICAgIF9jb21wYXRfYml0X2xlbmd0aChsYXN0X2ludCAtIGZpcnN0X2ludCArIDEpIC0gMSkKICAgICAgICBuZXQgPSBpcCgoZmlyc3RfaW50LCBpcF9iaXRzIC0gbmJpdHMpKQogICAgICAgIHlpZWxkIG5ldAogICAgICAgIGZpcnN0X2ludCArPSAxIDw8IG5iaXRzCiAgICAgICAgaWYgZmlyc3RfaW50IC0gMSA9PSBpcC5fQUxMX09ORVM6CiAgICAgICAgICAgIGJyZWFrCgoKZGVmIF9jb2xsYXBzZV9hZGRyZXNzZXNfaW50ZXJuYWwoYWRkcmVzc2VzKToKICAgICIiIkxvb3BzIHRocm91Z2ggdGhlIGFkZHJlc3NlcywgY29sbGFwc2luZyBjb25jdXJyZW50IG5ldGJsb2Nrcy4KCiAgICBFeGFtcGxlOgoKICAgICAgICBpcDEgPSBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI2JykKICAgICAgICBpcDIgPSBJUHY0TmV0d29yaygnMTkyLjAuMi42NC8yNicpCiAgICAgICAgaXAzID0gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTI4LzI2JykKICAgICAgICBpcDQgPSBJUHY0TmV0d29yaygnMTkyLjAuMi4xOTIvMjYnKQoKICAgICAgICBfY29sbGFwc2VfYWRkcmVzc2VzX2ludGVybmFsKFtpcDEsIGlwMiwgaXAzLCBpcDRdKSAtPgogICAgICAgICAgW0lQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjQnKV0KCiAgICAgICAgVGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmVjdGx5OyBpdCBpcyBjYWxsZWQgdmlhCiAgICAgICAgICBjb2xsYXBzZV9hZGRyZXNzZXMoW10pLgoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzc2VzOiBBIGxpc3Qgb2YgSVB2NE5ldHdvcmsncyBvciBJUHY2TmV0d29yaydzCgogICAgUmV0dXJuczoKICAgICAgICBBIGxpc3Qgb2YgSVB2NE5ldHdvcmsncyBvciBJUHY2TmV0d29yaydzIGRlcGVuZGluZyBvbiB3aGF0IHdlIHdlcmUKICAgICAgICBwYXNzZWQuCgogICAgIiIiCiAgICAjIEZpcnN0IG1lcmdlCiAgICB0b19tZXJnZSA9IGxpc3QoYWRkcmVzc2VzKQogICAgc3VibmV0cyA9IHt9CiAgICB3aGlsZSB0b19tZXJnZToKICAgICAgICBuZXQgPSB0b19tZXJnZS5wb3AoKQogICAgICAgIHN1cGVybmV0ID0gbmV0LnN1cGVybmV0KCkKICAgICAgICBleGlzdGluZyA9IHN1Ym5ldHMuZ2V0KHN1cGVybmV0KQogICAgICAgIGlmIGV4aXN0aW5nIGlzIE5vbmU6CiAgICAgICAgICAgIHN1Ym5ldHNbc3VwZXJuZXRdID0gbmV0CiAgICAgICAgZWxpZiBleGlzdGluZyAhPSBuZXQ6CiAgICAgICAgICAgICMgTWVyZ2UgY29uc2VjdXRpdmUgc3VibmV0cwogICAgICAgICAgICBkZWwgc3VibmV0c1tzdXBlcm5ldF0KICAgICAgICAgICAgdG9fbWVyZ2UuYXBwZW5kKHN1cGVybmV0KQogICAgIyBUaGVuIGl0ZXJhdGUgb3ZlciByZXN1bHRpbmcgbmV0d29ya3MsIHNraXBwaW5nIHN1YnN1bWVkIHN1Ym5ldHMKICAgIGxhc3QgPSBOb25lCiAgICBmb3IgbmV0IGluIHNvcnRlZChzdWJuZXRzLnZhbHVlcygpKToKICAgICAgICBpZiBsYXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIFNpbmNlIHRoZXkgYXJlIHNvcnRlZCwKICAgICAgICAgICAgIyBsYXN0Lm5ldHdvcmtfYWRkcmVzcyA8PSBuZXQubmV0d29ya19hZGRyZXNzIGlzIGEgZ2l2ZW4uCiAgICAgICAgICAgIGlmIGxhc3QuYnJvYWRjYXN0X2FkZHJlc3MgPj0gbmV0LmJyb2FkY2FzdF9hZGRyZXNzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICB5aWVsZCBuZXQKICAgICAgICBsYXN0ID0gbmV0CgoKZGVmIGNvbGxhcHNlX2FkZHJlc3NlcyhhZGRyZXNzZXMpOgogICAgIiIiQ29sbGFwc2UgYSBsaXN0IG9mIElQIG9iamVjdHMuCgogICAgRXhhbXBsZToKICAgICAgICBjb2xsYXBzZV9hZGRyZXNzZXMoW0lQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4yLjEyOC8yNScpXSkgLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgW0lQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjQnKV0KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3NlczogQW4gaXRlcmF0b3Igb2YgSVB2NE5ldHdvcmsgb3IgSVB2Nk5ldHdvcmsgb2JqZWN0cy4KCiAgICBSZXR1cm5zOgogICAgICAgIEFuIGl0ZXJhdG9yIG9mIHRoZSBjb2xsYXBzZWQgSVB2KDR8NilOZXR3b3JrIG9iamVjdHMuCgogICAgUmFpc2VzOgogICAgICAgIFR5cGVFcnJvcjogSWYgcGFzc2VkIGEgbGlzdCBvZiBtaXhlZCB2ZXJzaW9uIG9iamVjdHMuCgogICAgIiIiCiAgICBhZGRycyA9IFtdCiAgICBpcHMgPSBbXQogICAgbmV0cyA9IFtdCgogICAgIyBzcGxpdCBJUCBhZGRyZXNzZXMgYW5kIG5ldHdvcmtzCiAgICBmb3IgaXAgaW4gYWRkcmVzc2VzOgogICAgICAgIGlmIGlzaW5zdGFuY2UoaXAsIF9CYXNlQWRkcmVzcyk6CiAgICAgICAgICAgIGlmIGlwcyBhbmQgaXBzWy0xXS5fdmVyc2lvbiAhPSBpcC5fdmVyc2lvbjoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAsIGlwc1stMV0pKQogICAgICAgICAgICBpcHMuYXBwZW5kKGlwKQogICAgICAgIGVsaWYgaXAuX3ByZWZpeGxlbiA9PSBpcC5fbWF4X3ByZWZpeGxlbjoKICAgICAgICAgICAgaWYgaXBzIGFuZCBpcHNbLTFdLl92ZXJzaW9uICE9IGlwLl92ZXJzaW9uOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB2ZXJzaW9uIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCwgaXBzWy0xXSkpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlwcy5hcHBlbmQoaXAuaXApCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIGlwcy5hcHBlbmQoaXAubmV0d29ya19hZGRyZXNzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5ldHMgYW5kIG5ldHNbLTFdLl92ZXJzaW9uICE9IGlwLl92ZXJzaW9uOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB2ZXJzaW9uIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCwgbmV0c1stMV0pKQogICAgICAgICAgICBuZXRzLmFwcGVuZChpcCkKCiAgICAjIHNvcnQgYW5kIGRlZHVwCiAgICBpcHMgPSBzb3J0ZWQoc2V0KGlwcykpCgogICAgIyBmaW5kIGNvbnNlY3V0aXZlIGFkZHJlc3MgcmFuZ2VzIGluIHRoZSBzb3J0ZWQgc2VxdWVuY2UgYW5kIHN1bW1hcml6ZSB0aGVtCiAgICBpZiBpcHM6CiAgICAgICAgZm9yIGZpcnN0LCBsYXN0IGluIF9maW5kX2FkZHJlc3NfcmFuZ2UoaXBzKToKICAgICAgICAgICAgYWRkcnMuZXh0ZW5kKHN1bW1hcml6ZV9hZGRyZXNzX3JhbmdlKGZpcnN0LCBsYXN0KSkKCiAgICByZXR1cm4gX2NvbGxhcHNlX2FkZHJlc3Nlc19pbnRlcm5hbChhZGRycyArIG5ldHMpCgoKZGVmIGdldF9taXhlZF90eXBlX2tleShvYmopOgogICAgIiIiUmV0dXJuIGEga2V5IHN1aXRhYmxlIGZvciBzb3J0aW5nIGJldHdlZW4gbmV0d29ya3MgYW5kIGFkZHJlc3Nlcy4KCiAgICBBZGRyZXNzIGFuZCBOZXR3b3JrIG9iamVjdHMgYXJlIG5vdCBzb3J0YWJsZSBieSBkZWZhdWx0OyB0aGV5J3JlCiAgICBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCBzbyB0aGUgZXhwcmVzc2lvbgoKICAgICAgICBJUHY0QWRkcmVzcygnMTkyLjAuMi4wJykgPD0gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNCcpCgogICAgZG9lc24ndCBtYWtlIGFueSBzZW5zZS4gIFRoZXJlIGFyZSBzb21lIHRpbWVzIGhvd2V2ZXIsIHdoZXJlIHlvdSBtYXkgd2lzaAogICAgdG8gaGF2ZSBpcGFkZHJlc3Mgc29ydCB0aGVzZSBmb3IgeW91IGFueXdheS4gSWYgeW91IG5lZWQgdG8gZG8gdGhpcywgeW91CiAgICBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gYXMgdGhlIGtleT0gYXJndW1lbnQgdG8gc29ydGVkKCkuCgogICAgQXJnczoKICAgICAgb2JqOiBlaXRoZXIgYSBOZXR3b3JrIG9yIEFkZHJlc3Mgb2JqZWN0LgogICAgUmV0dXJuczoKICAgICAgYXBwcm9wcmlhdGUga2V5LgoKICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShvYmosIF9CYXNlTmV0d29yayk6CiAgICAgICAgcmV0dXJuIG9iai5fZ2V0X25ldHdvcmtzX2tleSgpCiAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBfQmFzZUFkZHJlc3MpOgogICAgICAgIHJldHVybiBvYmouX2dldF9hZGRyZXNzX2tleSgpCiAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCgpjbGFzcyBfSVBBZGRyZXNzQmFzZShfVG90YWxPcmRlcmluZ01peGluKToKCiAgICAiIiJUaGUgbW90aGVyIGNsYXNzLiIiIgoKICAgIF9fc2xvdHNfXyA9ICgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXhwbG9kZWQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBsb25naGFuZCB2ZXJzaW9uIG9mIHRoZSBJUCBhZGRyZXNzIGFzIGEgc3RyaW5nLiIiIgogICAgICAgIHJldHVybiBzZWxmLl9leHBsb2RlX3Nob3J0aGFuZF9pcF9zdHJpbmcoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXByZXNzZWQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBzaG9ydGhhbmQgdmVyc2lvbiBvZiB0aGUgSVAgYWRkcmVzcyBhcyBhIHN0cmluZy4iIiIKICAgICAgICByZXR1cm4gX2NvbXBhdF9zdHIoc2VsZikKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXZlcnNlX3BvaW50ZXIoc2VsZik6CiAgICAgICAgIiIiVGhlIG5hbWUgb2YgdGhlIHJldmVyc2UgRE5TIHBvaW50ZXIgZm9yIHRoZSBJUCBhZGRyZXNzLCBlLmcuOgogICAgICAgICAgICA+Pj4gaXBhZGRyZXNzLmlwX2FkZHJlc3MoIjEyNy4wLjAuMSIpLnJldmVyc2VfcG9pbnRlcgogICAgICAgICAgICAnMS4wLjAuMTI3LmluLWFkZHIuYXJwYScKICAgICAgICAgICAgPj4+IGlwYWRkcmVzcy5pcF9hZGRyZXNzKCIyMDAxOmRiODo6MSIpLnJldmVyc2VfcG9pbnRlcgogICAgICAgICAgICAnMS4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuOC5iLmQuMC4xLjAuMC4yLmlwNi5hcnBhJwoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fcmV2ZXJzZV9wb2ludGVyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIG1zZyA9ICclMjAwcyBoYXMgbm8gdmVyc2lvbiBzcGVjaWZpZWQnICUgKHR5cGUoc2VsZiksKQogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IobXNnKQoKICAgIGRlZiBfY2hlY2tfaW50X2FkZHJlc3Moc2VsZiwgYWRkcmVzcyk6CiAgICAgICAgaWYgYWRkcmVzcyA8IDA6CiAgICAgICAgICAgIG1zZyA9ICIlZCAoPCAwKSBpcyBub3QgcGVybWl0dGVkIGFzIGFuIElQdiVkIGFkZHJlc3MiCiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIChhZGRyZXNzLCBzZWxmLl92ZXJzaW9uKSkKICAgICAgICBpZiBhZGRyZXNzID4gc2VsZi5fQUxMX09ORVM6CiAgICAgICAgICAgIG1zZyA9ICIlZCAoPj0gMioqJWQpIGlzIG5vdCBwZXJtaXR0ZWQgYXMgYW4gSVB2JWQgYWRkcmVzcyIKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgKGFkZHJlc3MsIHNlbGYuX21heF9wcmVmaXhsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92ZXJzaW9uKSkKCiAgICBkZWYgX2NoZWNrX3BhY2tlZF9hZGRyZXNzKHNlbGYsIGFkZHJlc3MsIGV4cGVjdGVkX2xlbik6CiAgICAgICAgYWRkcmVzc19sZW4gPSBsZW4oYWRkcmVzcykKICAgICAgICBpZiBhZGRyZXNzX2xlbiAhPSBleHBlY3RlZF9sZW46CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICclciAobGVuICVkICE9ICVkKSBpcyBub3QgcGVybWl0dGVkIGFzIGFuIElQdiVkIGFkZHJlc3MuICcKICAgICAgICAgICAgICAgICdEaWQgeW91IHBhc3MgaW4gYSBieXRlcyAoc3RyIGluIFB5dGhvbiAyKSBpbnN0ZWFkIG9mJwogICAgICAgICAgICAgICAgJyBhIHVuaWNvZGUgb2JqZWN0PycKICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSAoYWRkcmVzcywgYWRkcmVzc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9sZW4sIHNlbGYuX3ZlcnNpb24pKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9pcF9pbnRfZnJvbV9wcmVmaXgoY2xzLCBwcmVmaXhsZW4pOgogICAgICAgICIiIlR1cm4gdGhlIHByZWZpeCBsZW5ndGggaW50byBhIGJpdHdpc2UgbmV0bWFzawoKICAgICAgICBBcmdzOgogICAgICAgICAgICBwcmVmaXhsZW46IEFuIGludGVnZXIsIHRoZSBwcmVmaXggbGVuZ3RoLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpbnRlZ2VyLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gY2xzLl9BTExfT05FUyBeIChjbHMuX0FMTF9PTkVTID4+IHByZWZpeGxlbikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcHJlZml4X2Zyb21faXBfaW50KGNscywgaXBfaW50KToKICAgICAgICAiIiJSZXR1cm4gcHJlZml4IGxlbmd0aCBmcm9tIHRoZSBiaXR3aXNlIG5ldG1hc2suCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX2ludDogQW4gaW50ZWdlciwgdGhlIG5ldG1hc2sgaW4gZXhwYW5kZWQgYml0d2lzZSBmb3JtYXQKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gaW50ZWdlciwgdGhlIHByZWZpeCBsZW5ndGguCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogSWYgdGhlIGlucHV0IGludGVybWluZ2xlcyB6ZXJvZXMgJiBvbmVzCiAgICAgICAgIiIiCiAgICAgICAgdHJhaWxpbmdfemVyb2VzID0gX2NvdW50X3JpZ2h0aGFuZF96ZXJvX2JpdHMoaXBfaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5fbWF4X3ByZWZpeGxlbikKICAgICAgICBwcmVmaXhsZW4gPSBjbHMuX21heF9wcmVmaXhsZW4gLSB0cmFpbGluZ196ZXJvZXMKICAgICAgICBsZWFkaW5nX29uZXMgPSBpcF9pbnQgPj4gdHJhaWxpbmdfemVyb2VzCiAgICAgICAgYWxsX29uZXMgPSAoMSA8PCBwcmVmaXhsZW4pIC0gMQogICAgICAgIGlmIGxlYWRpbmdfb25lcyAhPSBhbGxfb25lczoKICAgICAgICAgICAgYnl0ZXNsZW4gPSBjbHMuX21heF9wcmVmaXhsZW4gLy8gOAogICAgICAgICAgICBkZXRhaWxzID0gX2NvbXBhdF90b19ieXRlcyhpcF9pbnQsIGJ5dGVzbGVuLCAnYmlnJykKICAgICAgICAgICAgbXNnID0gJ05ldG1hc2sgcGF0dGVybiAlciBtaXhlcyB6ZXJvZXMgJiBvbmVzJwogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIGRldGFpbHMpCiAgICAgICAgcmV0dXJuIHByZWZpeGxlbgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9yZXBvcnRfaW52YWxpZF9uZXRtYXNrKGNscywgbmV0bWFza19zdHIpOgogICAgICAgIG1zZyA9ICclciBpcyBub3QgYSB2YWxpZCBuZXRtYXNrJyAlIG5ldG1hc2tfc3RyCiAgICAgICAgcmFpc2UgTmV0bWFza1ZhbHVlRXJyb3IobXNnKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wcmVmaXhfZnJvbV9wcmVmaXhfc3RyaW5nKGNscywgcHJlZml4bGVuX3N0cik6CiAgICAgICAgIiIiUmV0dXJuIHByZWZpeCBsZW5ndGggZnJvbSBhIG51bWVyaWMgc3RyaW5nCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHByZWZpeGxlbl9zdHI6IFRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGludGVnZXIsIHRoZSBwcmVmaXggbGVuZ3RoLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIE5ldG1hc2tWYWx1ZUVycm9yOiBJZiB0aGUgaW5wdXQgaXMgbm90IGEgdmFsaWQgbmV0bWFzawogICAgICAgICIiIgogICAgICAgICMgaW50IGFsbG93cyBhIGxlYWRpbmcgKy8tIGFzIHdlbGwgYXMgc3Vycm91bmRpbmcgd2hpdGVzcGFjZSwKICAgICAgICAjIHNvIHdlIGVuc3VyZSB0aGF0IGlzbid0IHRoZSBjYXNlCiAgICAgICAgaWYgbm90IF9CYXNlVjQuX0RFQ0lNQUxfRElHSVRTLmlzc3VwZXJzZXQocHJlZml4bGVuX3N0cik6CiAgICAgICAgICAgIGNscy5fcmVwb3J0X2ludmFsaWRfbmV0bWFzayhwcmVmaXhsZW5fc3RyKQogICAgICAgIHRyeToKICAgICAgICAgICAgcHJlZml4bGVuID0gaW50KHByZWZpeGxlbl9zdHIpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGNscy5fcmVwb3J0X2ludmFsaWRfbmV0bWFzayhwcmVmaXhsZW5fc3RyKQogICAgICAgIGlmIG5vdCAoMCA8PSBwcmVmaXhsZW4gPD0gY2xzLl9tYXhfcHJlZml4bGVuKToKICAgICAgICAgICAgY2xzLl9yZXBvcnRfaW52YWxpZF9uZXRtYXNrKHByZWZpeGxlbl9zdHIpCiAgICAgICAgcmV0dXJuIHByZWZpeGxlbgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wcmVmaXhfZnJvbV9pcF9zdHJpbmcoY2xzLCBpcF9zdHIpOgogICAgICAgICIiIlR1cm4gYSBuZXRtYXNrL2hvc3RtYXNrIHN0cmluZyBpbnRvIGEgcHJlZml4IGxlbmd0aAoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9zdHI6IFRoZSBuZXRtYXNrL2hvc3RtYXNrIHRvIGJlIGNvbnZlcnRlZAoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpbnRlZ2VyLCB0aGUgcHJlZml4IGxlbmd0aC4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBOZXRtYXNrVmFsdWVFcnJvcjogSWYgdGhlIGlucHV0IGlzIG5vdCBhIHZhbGlkIG5ldG1hc2svaG9zdG1hc2sKICAgICAgICAiIiIKICAgICAgICAjIFBhcnNlIHRoZSBuZXRtYXNrL2hvc3RtYXNrIGxpa2UgYW4gSVAgYWRkcmVzcy4KICAgICAgICB0cnk6CiAgICAgICAgICAgIGlwX2ludCA9IGNscy5faXBfaW50X2Zyb21fc3RyaW5nKGlwX3N0cikKICAgICAgICBleGNlcHQgQWRkcmVzc1ZhbHVlRXJyb3I6CiAgICAgICAgICAgIGNscy5fcmVwb3J0X2ludmFsaWRfbmV0bWFzayhpcF9zdHIpCgogICAgICAgICMgVHJ5IG1hdGNoaW5nIGEgbmV0bWFzayAodGhpcyB3b3VsZCBiZSAvMSowKi8gYXMgYSBiaXR3aXNlIHJlZ2V4cCkuCiAgICAgICAgIyBOb3RlIHRoYXQgdGhlIHR3byBhbWJpZ3VvdXMgY2FzZXMgKGFsbC1vbmVzIGFuZCBhbGwtemVyb2VzKSBhcmUKICAgICAgICAjIHRyZWF0ZWQgYXMgbmV0bWFza3MuCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gY2xzLl9wcmVmaXhfZnJvbV9pcF9pbnQoaXBfaW50KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgICMgSW52ZXJ0IHRoZSBiaXRzLCBhbmQgdHJ5IG1hdGNoaW5nIGEgLzArMSsvIGhvc3RtYXNrIGluc3RlYWQuCiAgICAgICAgaXBfaW50IF49IGNscy5fQUxMX09ORVMKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBjbHMuX3ByZWZpeF9mcm9tX2lwX2ludChpcF9pbnQpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGNscy5fcmVwb3J0X2ludmFsaWRfbmV0bWFzayhpcF9zdHIpCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoX2NvbXBhdF9zdHIoc2VsZiksKQoKCmNsYXNzIF9CYXNlQWRkcmVzcyhfSVBBZGRyZXNzQmFzZSk6CgogICAgIiIiQSBnZW5lcmljIElQIG9iamVjdC4KCiAgICBUaGlzIElQIGNsYXNzIGNvbnRhaW5zIHRoZSB2ZXJzaW9uIGluZGVwZW5kZW50IG1ldGhvZHMgd2hpY2ggYXJlCiAgICB1c2VkIGJ5IHNpbmdsZSBJUCBhZGRyZXNzZXMuCiAgICAiIiIKCiAgICBfX3Nsb3RzX18gPSAoKQoKICAgIGRlZiBfX2ludF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pcAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9pcCA9PSBvdGhlci5faXAgYW5kCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9PSBvdGhlci5fdmVyc2lvbikKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfSVBBZGRyZXNzQmFzZSk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZUFkZHJlc3MpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUnICUgKAogICAgICAgICAgICAgICAgc2VsZiwgb3RoZXIpKQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24gIT0gb3RoZXIuX3ZlcnNpb246CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbicgJSAoCiAgICAgICAgICAgICAgICBzZWxmLCBvdGhlcikpCiAgICAgICAgaWYgc2VsZi5faXAgIT0gb3RoZXIuX2lwOgogICAgICAgICAgICByZXR1cm4gc2VsZi5faXAgPCBvdGhlci5faXAKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIFNob3J0aGFuZCBmb3IgSW50ZWdlciBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24uIFRoaXMgaXMgbm90CiAgICAjIG1lYW50IHRvIGV2ZXIgc3VwcG9ydCBhZGRpdGlvbi9zdWJ0cmFjdGlvbiBvZiBhZGRyZXNzZXMuCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9jb21wYXRfaW50X3R5cGVzKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGludChzZWxmKSArIG90aGVyKQoKICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX2NvbXBhdF9pbnRfdHlwZXMpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oaW50KHNlbGYpIC0gb3RoZXIpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMoJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX2NvbXBhdF9zdHIoc2VsZikpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIF9jb21wYXRfc3RyKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCkpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKGhleChpbnQoc2VsZi5faXApKSkKCiAgICBkZWYgX2dldF9hZGRyZXNzX2tleShzZWxmKToKICAgICAgICByZXR1cm4gKHNlbGYuX3ZlcnNpb24sIHNlbGYpCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoc2VsZi5faXAsKQoKCmNsYXNzIF9CYXNlTmV0d29yayhfSVBBZGRyZXNzQmFzZSk6CgogICAgIiIiQSBnZW5lcmljIElQIG5ldHdvcmsgb2JqZWN0LgoKICAgIFRoaXMgSVAgY2xhc3MgY29udGFpbnMgdGhlIHZlcnNpb24gaW5kZXBlbmRlbnQgbWV0aG9kcyB3aGljaCBhcmUKICAgIHVzZWQgYnkgbmV0d29ya3MuCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CiAgICAgICAgc2VsZi5fY2FjaGUgPSB7fQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF9jb21wYXRfc3RyKHNlbGYpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJWQnICUgKHNlbGYubmV0d29ya19hZGRyZXNzLCBzZWxmLnByZWZpeGxlbikKCiAgICBkZWYgaG9zdHMoc2VsZik6CiAgICAgICAgIiIiR2VuZXJhdGUgSXRlcmF0b3Igb3ZlciB1c2FibGUgaG9zdHMgaW4gYSBuZXR3b3JrLgoKICAgICAgICBUaGlzIGlzIGxpa2UgX19pdGVyX18gZXhjZXB0IGl0IGRvZXNuJ3QgcmV0dXJuIHRoZSBuZXR3b3JrCiAgICAgICAgb3IgYnJvYWRjYXN0IGFkZHJlc3Nlcy4KCiAgICAgICAgIiIiCiAgICAgICAgbmV0d29yayA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICBicm9hZGNhc3QgPSBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICBmb3IgeCBpbiBfY29tcGF0X3JhbmdlKG5ldHdvcmsgKyAxLCBicm9hZGNhc3QpOgogICAgICAgICAgICB5aWVsZCBzZWxmLl9hZGRyZXNzX2NsYXNzKHgpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIG5ldHdvcmsgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgYnJvYWRjYXN0ID0gaW50KHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpCiAgICAgICAgZm9yIHggaW4gX2NvbXBhdF9yYW5nZShuZXR3b3JrLCBicm9hZGNhc3QgKyAxKToKICAgICAgICAgICAgeWllbGQgc2VsZi5fYWRkcmVzc19jbGFzcyh4KQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuKToKICAgICAgICBuZXR3b3JrID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgIGJyb2FkY2FzdCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgIGlmIG4gPj0gMDoKICAgICAgICAgICAgaWYgbmV0d29yayArIG4gPiBicm9hZGNhc3Q6CiAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKCdhZGRyZXNzIG91dCBvZiByYW5nZScpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRyZXNzX2NsYXNzKG5ldHdvcmsgKyBuKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG4gKz0gMQogICAgICAgICAgICBpZiBicm9hZGNhc3QgKyBuIDwgbmV0d29yazoKICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IoJ2FkZHJlc3Mgb3V0IG9mIHJhbmdlJykKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZHJlc3NfY2xhc3MoYnJvYWRjYXN0ICsgbikKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0lQQWRkcmVzc0Jhc2UpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VOZXR3b3JrKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIG90aGVyKSkKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHZlcnNpb24nICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgb3RoZXIpKQogICAgICAgIGlmIHNlbGYubmV0d29ya19hZGRyZXNzICE9IG90aGVyLm5ldHdvcmtfYWRkcmVzczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV0d29ya19hZGRyZXNzIDwgb3RoZXIubmV0d29ya19hZGRyZXNzCiAgICAgICAgaWYgc2VsZi5uZXRtYXNrICE9IG90aGVyLm5ldG1hc2s6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5ldG1hc2sgPCBvdGhlci5uZXRtYXNrCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gKHNlbGYuX3ZlcnNpb24gPT0gb3RoZXIuX3ZlcnNpb24gYW5kCiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPT0gb3RoZXIubmV0d29ya19hZGRyZXNzIGFuZAogICAgICAgICAgICAgICAgICAgIGludChzZWxmLm5ldG1hc2spID09IGludChvdGhlci5uZXRtYXNrKSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpIF4gaW50KHNlbGYubmV0bWFzaykpCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIyBhbHdheXMgZmFsc2UgaWYgb25lIGlzIHY0IGFuZCB0aGUgb3RoZXIgaXMgdjYuCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbiAhPSBvdGhlci5fdmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBkZWFsaW5nIHdpdGggYW5vdGhlciBuZXR3b3JrLgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9CYXNlTmV0d29yayk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgZGVhbGluZyB3aXRoIGFub3RoZXIgYWRkcmVzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgYWRkcmVzcwogICAgICAgICAgICByZXR1cm4gKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgPD0gaW50KG90aGVyLl9pcCkgPD0KICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykpCgogICAgZGVmIG92ZXJsYXBzKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJUZWxsIGlmIHNlbGYgaXMgcGFydGx5IGNvbnRhaW5lZCBpbiBvdGhlci4iIiIKICAgICAgICByZXR1cm4gc2VsZi5uZXR3b3JrX2FkZHJlc3MgaW4gb3RoZXIgb3IgKAogICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzIGluIG90aGVyIG9yICgKICAgICAgICAgICAgICAgIG90aGVyLm5ldHdvcmtfYWRkcmVzcyBpbiBzZWxmIG9yICgKICAgICAgICAgICAgICAgICAgICBvdGhlci5icm9hZGNhc3RfYWRkcmVzcyBpbiBzZWxmKSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgYnJvYWRjYXN0X2FkZHJlc3Moc2VsZik6CiAgICAgICAgeCA9IHNlbGYuX2NhY2hlLmdldCgnYnJvYWRjYXN0X2FkZHJlc3MnKQogICAgICAgIGlmIHggaXMgTm9uZToKICAgICAgICAgICAgeCA9IHNlbGYuX2FkZHJlc3NfY2xhc3MoaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChzZWxmLmhvc3RtYXNrKSkKICAgICAgICAgICAgc2VsZi5fY2FjaGVbJ2Jyb2FkY2FzdF9hZGRyZXNzJ10gPSB4CiAgICAgICAgcmV0dXJuIHgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBob3N0bWFzayhzZWxmKToKICAgICAgICB4ID0gc2VsZi5fY2FjaGUuZ2V0KCdob3N0bWFzaycpCiAgICAgICAgaWYgeCBpcyBOb25lOgogICAgICAgICAgICB4ID0gc2VsZi5fYWRkcmVzc19jbGFzcyhpbnQoc2VsZi5uZXRtYXNrKSBeIHNlbGYuX0FMTF9PTkVTKQogICAgICAgICAgICBzZWxmLl9jYWNoZVsnaG9zdG1hc2snXSA9IHgKICAgICAgICByZXR1cm4geAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfcHJlZml4bGVuKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJWQnICUgKHNlbGYubmV0d29ya19hZGRyZXNzLCBzZWxmLl9wcmVmaXhsZW4pCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9uZXRtYXNrKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYubmV0d29ya19hZGRyZXNzLCBzZWxmLm5ldG1hc2spCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9ob3N0bWFzayhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLm5ldHdvcmtfYWRkcmVzcywgc2VsZi5ob3N0bWFzaykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBudW1fYWRkcmVzc2VzKHNlbGYpOgogICAgICAgICIiIk51bWJlciBvZiBob3N0cyBpbiB0aGUgY3VycmVudCBzdWJuZXQuIiIiCiAgICAgICAgcmV0dXJuIGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKSAtIGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgKyAxCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2FkZHJlc3NfY2xhc3Moc2VsZik6CiAgICAgICAgIyBSZXR1cm5pbmcgYmFyZSBhZGRyZXNzIG9iamVjdHMgKHJhdGhlciB0aGFuIGludGVyZmFjZXMpIGFsbG93cyBmb3IKICAgICAgICAjIG1vcmUgY29uc2lzdGVudCBiZWhhdmlvdXIgYWNyb3NzIHRoZSBuZXR3b3JrIGFkZHJlc3MsIGJyb2FkY2FzdAogICAgICAgICMgYWRkcmVzcyBhbmQgaW5kaXZpZHVhbCBob3N0IGFkZHJlc3Nlcy4KICAgICAgICBtc2cgPSAnJTIwMHMgaGFzIG5vIGFzc29jaWF0ZWQgYWRkcmVzcyBjbGFzcycgJSAodHlwZShzZWxmKSwpCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihtc2cpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlZml4bGVuKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9wcmVmaXhsZW4KCiAgICBkZWYgYWRkcmVzc19leGNsdWRlKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJSZW1vdmUgYW4gYWRkcmVzcyBmcm9tIGEgbGFyZ2VyIGJsb2NrLgoKICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIGFkZHIxID0gaXBfbmV0d29yaygnMTkyLjAuMi4wLzI4JykKICAgICAgICAgICAgYWRkcjIgPSBpcF9uZXR3b3JrKCcxOTIuMC4yLjEvMzInKQogICAgICAgICAgICBsaXN0KGFkZHIxLmFkZHJlc3NfZXhjbHVkZShhZGRyMikpID0KICAgICAgICAgICAgICAgIFtJUHY0TmV0d29yaygnMTkyLjAuMi4wLzMyJyksIElQdjROZXR3b3JrKCcxOTIuMC4yLjIvMzEnKSwKICAgICAgICAgICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMi40LzMwJyksIElQdjROZXR3b3JrKCcxOTIuMC4yLjgvMjknKV0KCiAgICAgICAgb3IgSVB2NjoKCiAgICAgICAgICAgIGFkZHIxID0gaXBfbmV0d29yaygnMjAwMTpkYjg6OjEvMzInKQogICAgICAgICAgICBhZGRyMiA9IGlwX25ldHdvcmsoJzIwMDE6ZGI4OjoxLzEyOCcpCiAgICAgICAgICAgIGxpc3QoYWRkcjEuYWRkcmVzc19leGNsdWRlKGFkZHIyKSkgPQogICAgICAgICAgICAgICAgW2lwX25ldHdvcmsoJzIwMDE6ZGI4OjoxLzEyOCcpLAogICAgICAgICAgICAgICAgIGlwX25ldHdvcmsoJzIwMDE6ZGI4OjoyLzEyNycpLAogICAgICAgICAgICAgICAgIGlwX25ldHdvcmsoJzIwMDE6ZGI4Ojo0LzEyNicpLAogICAgICAgICAgICAgICAgIGlwX25ldHdvcmsoJzIwMDE6ZGI4Ojo4LzEyNScpLAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIGlwX25ldHdvcmsoJzIwMDE6ZGI4OjgwMDA6Oi8zMycpXQoKICAgICAgICBBcmdzOgogICAgICAgICAgICBvdGhlcjogQW4gSVB2NE5ldHdvcmsgb3IgSVB2Nk5ldHdvcmsgb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGl0ZXJhdG9yIG9mIHRoZSBJUHYoNHw2KU5ldHdvcmsgb2JqZWN0cyB3aGljaCBpcyBzZWxmCiAgICAgICAgICAgIG1pbnVzIG90aGVyLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFR5cGVFcnJvcjogSWYgc2VsZiBhbmQgb3RoZXIgYXJlIG9mIGRpZmZlcmluZyBhZGRyZXNzCiAgICAgICAgICAgICAgdmVyc2lvbnMsIG9yIGlmIG90aGVyIGlzIG5vdCBhIG5ldHdvcmsgb2JqZWN0LgogICAgICAgICAgICBWYWx1ZUVycm9yOiBJZiBvdGhlciBpcyBub3QgY29tcGxldGVseSBjb250YWluZWQgYnkgc2VsZi4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX3ZlcnNpb24gPT0gb3RoZXIuX3ZlcnNpb246CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBvdGhlcikpCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZU5ldHdvcmspOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzIGlzIG5vdCBhIG5ldHdvcmsgb2JqZWN0IiAlIG90aGVyKQoKICAgICAgICBpZiBub3Qgb3RoZXIuc3VibmV0X29mKHNlbGYpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyBub3QgY29udGFpbmVkIGluICVzJyAlIChvdGhlciwgc2VsZikpCiAgICAgICAgaWYgb3RoZXIgPT0gc2VsZjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgTWFrZSBzdXJlIHdlJ3JlIGNvbXBhcmluZyB0aGUgbmV0d29yayBvZiBvdGhlci4KICAgICAgICBvdGhlciA9IG90aGVyLl9fY2xhc3NfXygnJXMvJXMnICUgKG90aGVyLm5ldHdvcmtfYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLnByZWZpeGxlbikpCgogICAgICAgIHMxLCBzMiA9IHNlbGYuc3VibmV0cygpCiAgICAgICAgd2hpbGUgczEgIT0gb3RoZXIgYW5kIHMyICE9IG90aGVyOgogICAgICAgICAgICBpZiBvdGhlci5zdWJuZXRfb2YoczEpOgogICAgICAgICAgICAgICAgeWllbGQgczIKICAgICAgICAgICAgICAgIHMxLCBzMiA9IHMxLnN1Ym5ldHMoKQogICAgICAgICAgICBlbGlmIG90aGVyLnN1Ym5ldF9vZihzMik6CiAgICAgICAgICAgICAgICB5aWVsZCBzMQogICAgICAgICAgICAgICAgczEsIHMyID0gczIuc3VibmV0cygpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIElmIHdlIGdvdCBoZXJlLCB0aGVyZSdzIGEgYnVnIHNvbWV3aGVyZS4KICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdFcnJvciBwZXJmb3JtaW5nIGV4Y2x1c2lvbjogJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MxOiAlcyBzMjogJXMgb3RoZXI6ICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoczEsIHMyLCBvdGhlcikpCiAgICAgICAgaWYgczEgPT0gb3RoZXI6CiAgICAgICAgICAgIHlpZWxkIHMyCiAgICAgICAgZWxpZiBzMiA9PSBvdGhlcjoKICAgICAgICAgICAgeWllbGQgczEKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIElmIHdlIGdvdCBoZXJlLCB0aGVyZSdzIGEgYnVnIHNvbWV3aGVyZS4KICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0Vycm9yIHBlcmZvcm1pbmcgZXhjbHVzaW9uOiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzMTogJXMgczI6ICVzIG90aGVyOiAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoczEsIHMyLCBvdGhlcikpCgogICAgZGVmIGNvbXBhcmVfbmV0d29ya3Moc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkNvbXBhcmUgdHdvIElQIG9iamVjdHMuCgogICAgICAgIFRoaXMgaXMgb25seSBjb25jZXJuZWQgYWJvdXQgdGhlIGNvbXBhcmlzb24gb2YgdGhlIGludGVnZXIKICAgICAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmV0d29yayBhZGRyZXNzZXMuICBUaGlzIG1lYW5zIHRoYXQgdGhlCiAgICAgICAgaG9zdCBiaXRzIGFyZW4ndCBjb25zaWRlcmVkIGF0IGFsbCBpbiB0aGlzIG1ldGhvZC4gIElmIHlvdSB3YW50CiAgICAgICAgdG8gY29tcGFyZSBob3N0IGJpdHMsIHlvdSBjYW4gZWFzaWx5IGVub3VnaCBkbyBhCiAgICAgICAgJ0hvc3RBLl9pcCA8IEhvc3RCLl9pcCcKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgb3RoZXI6IEFuIElQIG9iamVjdC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgSWYgdGhlIElQIHZlcnNpb25zIG9mIHNlbGYgYW5kIG90aGVyIGFyZSB0aGUgc2FtZSwgcmV0dXJuczoKCiAgICAgICAgICAgIC0xIGlmIHNlbGYgPCBvdGhlcjoKICAgICAgICAgICAgICBlZzogSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNScpIDwgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTI4LzI1JykKICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjEwMDAvMTI0JykgPAogICAgICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjIwMDAvMTI0JykKICAgICAgICAgICAgMCBpZiBzZWxmID09IG90aGVyCiAgICAgICAgICAgICAgZWc6IElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjQnKSA9PSBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI0JykKICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjEwMDAvMTI0JykgPT0KICAgICAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjoxMDAwLzEyNCcpCiAgICAgICAgICAgIDEgaWYgc2VsZiA+IG90aGVyCiAgICAgICAgICAgICAgZWc6IElQdjROZXR3b3JrKCcxOTIuMC4yLjEyOC8yNScpID4gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNScpCiAgICAgICAgICAgICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6MjAwMC8xMjQnKSA+CiAgICAgICAgICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjEwMDAvMTI0JykKCiAgICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgICAgVHlwZUVycm9yIGlmIHRoZSBJUCB2ZXJzaW9ucyBhcmUgZGlmZmVyZW50LgoKICAgICAgICAiIiIKICAgICAgICAjIGRvZXMgdGhpcyBuZWVkIHRvIHJhaXNlIGEgVmFsdWVFcnJvcj8KICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUnICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgb3RoZXIpKQogICAgICAgICMgc2VsZi5fdmVyc2lvbiA9PSBvdGhlci5fdmVyc2lvbiBiZWxvdyBoZXJlOgogICAgICAgIGlmIHNlbGYubmV0d29ya19hZGRyZXNzIDwgb3RoZXIubmV0d29ya19hZGRyZXNzOgogICAgICAgICAgICByZXR1cm4gLTEKICAgICAgICBpZiBzZWxmLm5ldHdvcmtfYWRkcmVzcyA+IG90aGVyLm5ldHdvcmtfYWRkcmVzczoKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAjIHNlbGYubmV0d29ya19hZGRyZXNzID09IG90aGVyLm5ldHdvcmtfYWRkcmVzcyBiZWxvdyBoZXJlOgogICAgICAgIGlmIHNlbGYubmV0bWFzayA8IG90aGVyLm5ldG1hc2s6CiAgICAgICAgICAgIHJldHVybiAtMQogICAgICAgIGlmIHNlbGYubmV0bWFzayA+IG90aGVyLm5ldG1hc2s6CiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgcmV0dXJuIDAKCiAgICBkZWYgX2dldF9uZXR3b3Jrc19rZXkoc2VsZik6CiAgICAgICAgIiIiTmV0d29yay1vbmx5IGtleSBmdW5jdGlvbi4KCiAgICAgICAgUmV0dXJucyBhbiBvYmplY3QgdGhhdCBpZGVudGlmaWVzIHRoaXMgYWRkcmVzcycgbmV0d29yayBhbmQKICAgICAgICBuZXRtYXNrLiBUaGlzIGZ1bmN0aW9uIGlzIGEgc3VpdGFibGUgImtleSIgYXJndW1lbnQgZm9yIHNvcnRlZCgpCiAgICAgICAgYW5kIGxpc3Quc29ydCgpLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYuX3ZlcnNpb24sIHNlbGYubmV0d29ya19hZGRyZXNzLCBzZWxmLm5ldG1hc2spCgogICAgZGVmIHN1Ym5ldHMoc2VsZiwgcHJlZml4bGVuX2RpZmY9MSwgbmV3X3ByZWZpeD1Ob25lKToKICAgICAgICAiIiJUaGUgc3VibmV0cyB3aGljaCBqb2luIHRvIG1ha2UgdGhlIGN1cnJlbnQgc3VibmV0LgoKICAgICAgICBJbiB0aGUgY2FzZSB0aGF0IHNlbGYgY29udGFpbnMgb25seSBvbmUgSVAKICAgICAgICAoc2VsZi5fcHJlZml4bGVuID09IDMyIGZvciBJUHY0IG9yIHNlbGYuX3ByZWZpeGxlbiA9PSAxMjgKICAgICAgICBmb3IgSVB2NiksIHlpZWxkIGFuIGl0ZXJhdG9yIHdpdGgganVzdCBvdXJzZWxmLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBwcmVmaXhsZW5fZGlmZjogQW4gaW50ZWdlciwgdGhlIGFtb3VudCB0aGUgcHJlZml4IGxlbmd0aAogICAgICAgICAgICAgIHNob3VsZCBiZSBpbmNyZWFzZWQgYnkuIFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgaWYKICAgICAgICAgICAgICBuZXdfcHJlZml4IGlzIGFsc28gc2V0LgogICAgICAgICAgICBuZXdfcHJlZml4OiBUaGUgZGVzaXJlZCBuZXcgcHJlZml4IGxlbmd0aC4gVGhpcyBtdXN0IGJlIGEKICAgICAgICAgICAgICBsYXJnZXIgbnVtYmVyIChzbWFsbGVyIHByZWZpeCkgdGhhbiB0aGUgZXhpc3RpbmcgcHJlZml4LgogICAgICAgICAgICAgIFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgaWYgcHJlZml4bGVuX2RpZmYgaXMgYWxzbyBzZXQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGl0ZXJhdG9yIG9mIElQdig0fDYpIG9iamVjdHMuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogVGhlIHByZWZpeGxlbl9kaWZmIGlzIHRvbyBzbWFsbCBvciB0b28gbGFyZ2UuCiAgICAgICAgICAgICAgICBPUgogICAgICAgICAgICBwcmVmaXhsZW5fZGlmZiBhbmQgbmV3X3ByZWZpeCBhcmUgYm90aCBzZXQgb3IgbmV3X3ByZWZpeAogICAgICAgICAgICAgIGlzIGEgc21hbGxlciBudW1iZXIgdGhhbiB0aGUgY3VycmVudCBwcmVmaXggKHNtYWxsZXIKICAgICAgICAgICAgICBudW1iZXIgbWVhbnMgYSBsYXJnZXIgbmV0d29yaykKCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fcHJlZml4bGVuID09IHNlbGYuX21heF9wcmVmaXhsZW46CiAgICAgICAgICAgIHlpZWxkIHNlbGYKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG5ld19wcmVmaXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIG5ld19wcmVmaXggPCBzZWxmLl9wcmVmaXhsZW46CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCduZXcgcHJlZml4IG11c3QgYmUgbG9uZ2VyJykKICAgICAgICAgICAgaWYgcHJlZml4bGVuX2RpZmYgIT0gMToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Nhbm5vdCBzZXQgcHJlZml4bGVuX2RpZmYgYW5kIG5ld19wcmVmaXgnKQogICAgICAgICAgICBwcmVmaXhsZW5fZGlmZiA9IG5ld19wcmVmaXggLSBzZWxmLl9wcmVmaXhsZW4KCiAgICAgICAgaWYgcHJlZml4bGVuX2RpZmYgPCAwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdwcmVmaXggbGVuZ3RoIGRpZmYgbXVzdCBiZSA+IDAnKQogICAgICAgIG5ld19wcmVmaXhsZW4gPSBzZWxmLl9wcmVmaXhsZW4gKyBwcmVmaXhsZW5fZGlmZgoKICAgICAgICBpZiBuZXdfcHJlZml4bGVuID4gc2VsZi5fbWF4X3ByZWZpeGxlbjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICdwcmVmaXggbGVuZ3RoIGRpZmYgJWQgaXMgaW52YWxpZCBmb3IgbmV0YmxvY2sgJXMnICUgKAogICAgICAgICAgICAgICAgICAgIG5ld19wcmVmaXhsZW4sIHNlbGYpKQoKICAgICAgICBzdGFydCA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICBlbmQgPSBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykgKyAxCiAgICAgICAgc3RlcCA9IChpbnQoc2VsZi5ob3N0bWFzaykgKyAxKSA+PiBwcmVmaXhsZW5fZGlmZgogICAgICAgIGZvciBuZXdfYWRkciBpbiBfY29tcGF0X3JhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApOgogICAgICAgICAgICBjdXJyZW50ID0gc2VsZi5fX2NsYXNzX18oKG5ld19hZGRyLCBuZXdfcHJlZml4bGVuKSkKICAgICAgICAgICAgeWllbGQgY3VycmVudAoKICAgIGRlZiBzdXBlcm5ldChzZWxmLCBwcmVmaXhsZW5fZGlmZj0xLCBuZXdfcHJlZml4PU5vbmUpOgogICAgICAgICIiIlRoZSBzdXBlcm5ldCBjb250YWluaW5nIHRoZSBjdXJyZW50IG5ldHdvcmsuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHByZWZpeGxlbl9kaWZmOiBBbiBpbnRlZ2VyLCB0aGUgYW1vdW50IHRoZSBwcmVmaXggbGVuZ3RoIG9mCiAgICAgICAgICAgICAgdGhlIG5ldHdvcmsgc2hvdWxkIGJlIGRlY3JlYXNlZCBieS4gIEZvciBleGFtcGxlLCBnaXZlbiBhCiAgICAgICAgICAgICAgLzI0IG5ldHdvcmsgYW5kIGEgcHJlZml4bGVuX2RpZmYgb2YgMywgYSBzdXBlcm5ldCB3aXRoIGEKICAgICAgICAgICAgICAvMjEgbmV0bWFzayBpcyByZXR1cm5lZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gSVB2NCBuZXR3b3JrIG9iamVjdC4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBWYWx1ZUVycm9yOiBJZiBzZWxmLnByZWZpeGxlbiAtIHByZWZpeGxlbl9kaWZmIDwgMC4gSS5lLiwgeW91IGhhdmUKICAgICAgICAgICAgICBhIG5lZ2F0aXZlIHByZWZpeCBsZW5ndGguCiAgICAgICAgICAgICAgICBPUgogICAgICAgICAgICBJZiBwcmVmaXhsZW5fZGlmZiBhbmQgbmV3X3ByZWZpeCBhcmUgYm90aCBzZXQgb3IgbmV3X3ByZWZpeCBpcyBhCiAgICAgICAgICAgICAgbGFyZ2VyIG51bWJlciB0aGFuIHRoZSBjdXJyZW50IHByZWZpeCAobGFyZ2VyIG51bWJlciBtZWFucyBhCiAgICAgICAgICAgICAgc21hbGxlciBuZXR3b3JrKQoKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9wcmVmaXhsZW4gPT0gMDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYKCiAgICAgICAgaWYgbmV3X3ByZWZpeCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgbmV3X3ByZWZpeCA+IHNlbGYuX3ByZWZpeGxlbjoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ25ldyBwcmVmaXggbXVzdCBiZSBzaG9ydGVyJykKICAgICAgICAgICAgaWYgcHJlZml4bGVuX2RpZmYgIT0gMToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Nhbm5vdCBzZXQgcHJlZml4bGVuX2RpZmYgYW5kIG5ld19wcmVmaXgnKQogICAgICAgICAgICBwcmVmaXhsZW5fZGlmZiA9IHNlbGYuX3ByZWZpeGxlbiAtIG5ld19wcmVmaXgKCiAgICAgICAgbmV3X3ByZWZpeGxlbiA9IHNlbGYucHJlZml4bGVuIC0gcHJlZml4bGVuX2RpZmYKICAgICAgICBpZiBuZXdfcHJlZml4bGVuIDwgMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICdjdXJyZW50IHByZWZpeGxlbiBpcyAlZCwgY2Fubm90IGhhdmUgYSBwcmVmaXhsZW5fZGlmZiBvZiAlZCcgJQogICAgICAgICAgICAgICAgKHNlbGYucHJlZml4bGVuLCBwcmVmaXhsZW5fZGlmZikpCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCgKICAgICAgICAgICAgaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSAmIChpbnQoc2VsZi5uZXRtYXNrKSA8PCBwcmVmaXhsZW5fZGlmZiksCiAgICAgICAgICAgIG5ld19wcmVmaXhsZW4KICAgICAgICApKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX211bHRpY2FzdChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBtdWx0aWNhc3QgdXNlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcy4KICAgICAgICAgICAgU2VlIFJGQyAyMzczIDIuNyBmb3IgZGV0YWlscy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc19tdWx0aWNhc3QgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX211bHRpY2FzdCkKCiAgICBkZWYgc3VibmV0X29mKHNlbGYsIG90aGVyKToKICAgICAgICAjIGFsd2F5cyBmYWxzZSBpZiBvbmUgaXMgdjQgYW5kIHRoZSBvdGhlciBpcyB2Ni4KICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIG5ldHdvcmsuCiAgICAgICAgaWYgKGhhc2F0dHIob3RoZXIsICduZXR3b3JrX2FkZHJlc3MnKSBhbmQKICAgICAgICAgICAgICAgIGhhc2F0dHIob3RoZXIsICdicm9hZGNhc3RfYWRkcmVzcycpKToKICAgICAgICAgICAgcmV0dXJuIChvdGhlci5uZXR3b3JrX2FkZHJlc3MgPD0gc2VsZi5uZXR3b3JrX2FkZHJlc3MgYW5kCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuYnJvYWRjYXN0X2FkZHJlc3MgPj0gc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIGFkZHJlc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1VuYWJsZSB0byB0ZXN0IHN1Ym5ldCBjb250YWlubWVudCB3aXRoIGVsZW1lbnQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHR5cGUgJXMnICUgdHlwZShvdGhlcikpCgogICAgZGVmIHN1cGVybmV0X29mKHNlbGYsIG90aGVyKToKICAgICAgICAjIGFsd2F5cyBmYWxzZSBpZiBvbmUgaXMgdjQgYW5kIHRoZSBvdGhlciBpcyB2Ni4KICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIG5ldHdvcmsuCiAgICAgICAgaWYgKGhhc2F0dHIob3RoZXIsICduZXR3b3JrX2FkZHJlc3MnKSBhbmQKICAgICAgICAgICAgICAgIGhhc2F0dHIob3RoZXIsICdicm9hZGNhc3RfYWRkcmVzcycpKToKICAgICAgICAgICAgcmV0dXJuIChvdGhlci5uZXR3b3JrX2FkZHJlc3MgPj0gc2VsZi5uZXR3b3JrX2FkZHJlc3MgYW5kCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuYnJvYWRjYXN0X2FkZHJlc3MgPD0gc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIGFkZHJlc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1VuYWJsZSB0byB0ZXN0IHN1Ym5ldCBjb250YWlubWVudCB3aXRoIGVsZW1lbnQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHR5cGUgJXMnICUgdHlwZShvdGhlcikpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcmVzZXJ2ZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyBvdGhlcndpc2UgSUVURiByZXNlcnZlZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBvbmUgb2YgdGhlCiAgICAgICAgICAgIHJlc2VydmVkIElQdjYgTmV0d29yayByYW5nZXMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5uZXR3b3JrX2FkZHJlc3MuaXNfcmVzZXJ2ZWQgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX3Jlc2VydmVkKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2xpbmtfbG9jYWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3IgbGluay1sb2NhbC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlciBSRkMgNDI5MS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc19saW5rX2xvY2FsIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc19saW5rX2xvY2FsKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByaXZhdGUoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgYWxsb2NhdGVkIGZvciBwcml2YXRlIG5ldHdvcmtzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyCiAgICAgICAgICAgIGlhbmEtaXB2NC1zcGVjaWFsLXJlZ2lzdHJ5IG9yIGlhbmEtaXB2Ni1zcGVjaWFsLXJlZ2lzdHJ5LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX3ByaXZhdGUgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX3ByaXZhdGUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfZ2xvYmFsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGFsbG9jYXRlZCBmb3IgcHVibGljIG5ldHdvcmtzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgbm90IHJlc2VydmVkIHBlcgogICAgICAgICAgICBpYW5hLWlwdjQtc3BlY2lhbC1yZWdpc3RyeSBvciBpYW5hLWlwdjYtc3BlY2lhbC1yZWdpc3RyeS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmlzX3ByaXZhdGUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc191bnNwZWNpZmllZChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHVuc3BlY2lmaWVkLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhpcyBpcyB0aGUgdW5zcGVjaWZpZWQgYWRkcmVzcyBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgIFJGQyAyMzczIDIuNS4yLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX3Vuc3BlY2lmaWVkIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc191bnNwZWNpZmllZCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19sb29wYmFjayhzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcyBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgIFJGQyAyMzczIDIuNS4zLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX2xvb3BiYWNrIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc19sb29wYmFjaykKCgpjbGFzcyBfQmFzZVY0KG9iamVjdCk6CgogICAgIiIiQmFzZSBJUHY0IG9iamVjdC4KCiAgICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgYnkgSVB2NCBvYmplY3RzIGluIGJvdGggc2luZ2xlIElQCiAgICBhZGRyZXNzZXMgYW5kIG5ldHdvcmtzLgoKICAgICIiIgoKICAgIF9fc2xvdHNfXyA9ICgpCiAgICBfdmVyc2lvbiA9IDQKICAgICMgRXF1aXZhbGVudCB0byAyNTUuMjU1LjI1NS4yNTUgb3IgMzIgYml0cyBvZiAxJ3MuCiAgICBfQUxMX09ORVMgPSAoMiAqKiBJUFY0TEVOR1RIKSAtIDEKICAgIF9ERUNJTUFMX0RJR0lUUyA9IGZyb3plbnNldCgnMDEyMzQ1Njc4OScpCgogICAgIyB0aGUgdmFsaWQgb2N0ZXRzIGZvciBob3N0IGFuZCBuZXRtYXNrcy4gb25seSB1c2VmdWwgZm9yIElQdjQuCiAgICBfdmFsaWRfbWFza19vY3RldHMgPSBmcm96ZW5zZXQoWzI1NSwgMjU0LCAyNTIsIDI0OCwgMjQwLCAyMjQsIDE5MiwgMTI4LCAwXSkKCiAgICBfbWF4X3ByZWZpeGxlbiA9IElQVjRMRU5HVEgKICAgICMgVGhlcmUgYXJlIG9ubHkgYSBoYW5kZnVsIG9mIHZhbGlkIHY0IG5ldG1hc2tzLCBzbyB3ZSBjYWNoZSB0aGVtIGFsbAogICAgIyB3aGVuIGNvbnN0cnVjdGVkIChzZWUgX21ha2VfbmV0bWFzaygpKS4KICAgIF9uZXRtYXNrX2NhY2hlID0ge30KCiAgICBkZWYgX2V4cGxvZGVfc2hvcnRoYW5kX2lwX3N0cmluZyhzZWxmKToKICAgICAgICByZXR1cm4gX2NvbXBhdF9zdHIoc2VsZikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfbWFrZV9uZXRtYXNrKGNscywgYXJnKToKICAgICAgICAiIiJNYWtlIGEgKG5ldG1hc2ssIHByZWZpeF9sZW4pIHR1cGxlIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50LgoKICAgICAgICBBcmd1bWVudCBjYW4gYmU6CiAgICAgICAgLSBhbiBpbnRlZ2VyICh0aGUgcHJlZml4IGxlbmd0aCkKICAgICAgICAtIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJlZml4IGxlbmd0aCAoZS5nLiAiMjQiKQogICAgICAgIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcmVmaXggbmV0bWFzayAoZS5nLiAiMjU1LjI1NS4yNTUuMCIpCiAgICAgICAgIiIiCiAgICAgICAgaWYgYXJnIG5vdCBpbiBjbHMuX25ldG1hc2tfY2FjaGU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBfY29tcGF0X2ludF90eXBlcyk6CiAgICAgICAgICAgICAgICBwcmVmaXhsZW4gPSBhcmcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBhIG5ldG1hc2sgaW4gcHJlZml4IGxlbmd0aCBmb3JtCiAgICAgICAgICAgICAgICAgICAgcHJlZml4bGVuID0gY2xzLl9wcmVmaXhfZnJvbV9wcmVmaXhfc3RyaW5nKGFyZykKICAgICAgICAgICAgICAgIGV4Y2VwdCBOZXRtYXNrVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBhIG5ldG1hc2sgb3IgaG9zdG1hc2sgaW4gZG90dGVkLXF1YWQgZm9ybS4KICAgICAgICAgICAgICAgICAgICAjIFRoaXMgbWF5IHJhaXNlIE5ldG1hc2tWYWx1ZUVycm9yLgogICAgICAgICAgICAgICAgICAgIHByZWZpeGxlbiA9IGNscy5fcHJlZml4X2Zyb21faXBfc3RyaW5nKGFyZykKICAgICAgICAgICAgbmV0bWFzayA9IElQdjRBZGRyZXNzKGNscy5faXBfaW50X2Zyb21fcHJlZml4KHByZWZpeGxlbikpCiAgICAgICAgICAgIGNscy5fbmV0bWFza19jYWNoZVthcmddID0gbmV0bWFzaywgcHJlZml4bGVuCiAgICAgICAgcmV0dXJuIGNscy5fbmV0bWFza19jYWNoZVthcmddCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2lwX2ludF9mcm9tX3N0cmluZyhjbHMsIGlwX3N0cik6CiAgICAgICAgIiIiVHVybiB0aGUgZ2l2ZW4gSVAgc3RyaW5nIGludG8gYW4gaW50ZWdlciBmb3IgY29tcGFyaXNvbi4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfc3RyOiBBIHN0cmluZywgdGhlIElQIGlwX3N0ci4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgVGhlIElQIGlwX3N0ciBhcyBhbiBpbnRlZ2VyLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIEFkZHJlc3NWYWx1ZUVycm9yOiBpZiBpcF9zdHIgaXNuJ3QgYSB2YWxpZCBJUHY0IEFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBpcF9zdHI6CiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCdBZGRyZXNzIGNhbm5vdCBiZSBlbXB0eScpCgogICAgICAgIG9jdGV0cyA9IGlwX3N0ci5zcGxpdCgnLicpCiAgICAgICAgaWYgbGVuKG9jdGV0cykgIT0gNDoKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoIkV4cGVjdGVkIDQgb2N0ZXRzIGluICVyIiAlIGlwX3N0cikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gX2NvbXBhdF9pbnRfZnJvbV9ieXRlX3ZhbHMoCiAgICAgICAgICAgICAgICBtYXAoY2xzLl9wYXJzZV9vY3RldCwgb2N0ZXRzKSwgJ2JpZycpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiJXMgaW4gJXIiICUgKGV4YywgaXBfc3RyKSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2Vfb2N0ZXQoY2xzLCBvY3RldF9zdHIpOgogICAgICAgICIiIkNvbnZlcnQgYSBkZWNpbWFsIG9jdGV0IGludG8gYW4gaW50ZWdlci4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgb2N0ZXRfc3RyOiBBIHN0cmluZywgdGhlIG51bWJlciB0byBwYXJzZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgVGhlIG9jdGV0IGFzIGFuIGludGVnZXIuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogaWYgdGhlIG9jdGV0IGlzbid0IHN0cmljdGx5IGEgZGVjaW1hbCBmcm9tIFswLi4yNTVdLgoKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgb2N0ZXRfc3RyOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFbXB0eSBvY3RldCBub3QgcGVybWl0dGVkIikKICAgICAgICAjIFdoaXRlbGlzdCB0aGUgY2hhcmFjdGVycywgc2luY2UgaW50KCkgYWxsb3dzIGEgbG90IG9mIGJpemFycmUgc3R1ZmYuCiAgICAgICAgaWYgbm90IGNscy5fREVDSU1BTF9ESUdJVFMuaXNzdXBlcnNldChvY3RldF9zdHIpOgogICAgICAgICAgICBtc2cgPSAiT25seSBkZWNpbWFsIGRpZ2l0cyBwZXJtaXR0ZWQgaW4gJXIiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgb2N0ZXRfc3RyKQogICAgICAgICMgV2UgZG8gdGhlIGxlbmd0aCBjaGVjayBzZWNvbmQsIHNpbmNlIHRoZSBpbnZhbGlkIGNoYXJhY3RlciBlcnJvcgogICAgICAgICMgaXMgbGlrZWx5IHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUgZm9yIHRoZSB1c2VyCiAgICAgICAgaWYgbGVuKG9jdGV0X3N0cikgPiAzOgogICAgICAgICAgICBtc2cgPSAiQXQgbW9zdCAzIGNoYXJhY3RlcnMgcGVybWl0dGVkIGluICVyIgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIG9jdGV0X3N0cikKICAgICAgICAjIENvbnZlcnQgdG8gaW50ZWdlciAod2Uga25vdyBkaWdpdHMgYXJlIGxlZ2FsKQogICAgICAgIG9jdGV0X2ludCA9IGludChvY3RldF9zdHIsIDEwKQogICAgICAgICMgQW55IG9jdGV0cyB0aGF0IGxvb2sgbGlrZSB0aGV5ICptaWdodCogYmUgd3JpdHRlbiBpbiBvY3RhbCwKICAgICAgICAjIGFuZCB3aGljaCBkb24ndCBsb29rIGV4YWN0bHkgdGhlIHNhbWUgaW4gYm90aCBvY3RhbCBhbmQKICAgICAgICAjIGRlY2ltYWwgYXJlIHJlamVjdGVkIGFzIGFtYmlndW91cwogICAgICAgIGlmIG9jdGV0X2ludCA+IDcgYW5kIG9jdGV0X3N0clswXSA9PSAnMCc6CiAgICAgICAgICAgIG1zZyA9ICJBbWJpZ3VvdXMgKG9jdGFsL2RlY2ltYWwpIHZhbHVlIGluICVyIG5vdCBwZXJtaXR0ZWQiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgb2N0ZXRfc3RyKQogICAgICAgIGlmIG9jdGV0X2ludCA+IDI1NToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiT2N0ZXQgJWQgKD4gMjU1KSBub3QgcGVybWl0dGVkIiAlIG9jdGV0X2ludCkKICAgICAgICByZXR1cm4gb2N0ZXRfaW50CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3N0cmluZ19mcm9tX2lwX2ludChjbHMsIGlwX2ludCk6CiAgICAgICAgIiIiVHVybnMgYSAzMi1iaXQgaW50ZWdlciBpbnRvIGRvdHRlZCBkZWNpbWFsIG5vdGF0aW9uLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9pbnQ6IEFuIGludGVnZXIsIHRoZSBJUCBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBUaGUgSVAgYWRkcmVzcyBhcyBhIHN0cmluZyBpbiBkb3R0ZWQgZGVjaW1hbCBub3RhdGlvbi4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICcuJy5qb2luKF9jb21wYXRfc3RyKHN0cnVjdC51bnBhY2soYichQicsIGIpWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgYnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYikKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGIgaW4gX2NvbXBhdF90b19ieXRlcyhpcF9pbnQsIDQsICdiaWcnKSkKCiAgICBkZWYgX2lzX2hvc3RtYXNrKHNlbGYsIGlwX3N0cik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgSVAgc3RyaW5nIGlzIGEgaG9zdG1hc2sgKHJhdGhlciB0aGFuIGEgbmV0bWFzaykuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX3N0cjogQSBzdHJpbmcsIHRoZSBwb3RlbnRpYWwgaG9zdG1hc2suCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgSVAgc3RyaW5nIGlzIGEgaG9zdG1hc2suCgogICAgICAgICIiIgogICAgICAgIGJpdHMgPSBpcF9zdHIuc3BsaXQoJy4nKQogICAgICAgIHRyeToKICAgICAgICAgICAgcGFydHMgPSBbeCBmb3IgeCBpbiBtYXAoaW50LCBiaXRzKSBpZiB4IGluIHNlbGYuX3ZhbGlkX21hc2tfb2N0ZXRzXQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBpZiBsZW4ocGFydHMpICE9IGxlbihiaXRzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgcGFydHNbMF0gPCBwYXJ0c1stMV06CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9yZXZlcnNlX3BvaW50ZXIoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSByZXZlcnNlIEROUyBwb2ludGVyIG5hbWUgZm9yIHRoZSBJUHY0IGFkZHJlc3MuCgogICAgICAgIFRoaXMgaW1wbGVtZW50cyB0aGUgbWV0aG9kIGRlc2NyaWJlZCBpbiBSRkMxMDM1IDMuNS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV2ZXJzZV9vY3RldHMgPSBfY29tcGF0X3N0cihzZWxmKS5zcGxpdCgnLicpWzo6LTFdCiAgICAgICAgcmV0dXJuICcuJy5qb2luKHJldmVyc2Vfb2N0ZXRzKSArICcuaW4tYWRkci5hcnBhJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1heF9wcmVmaXhsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX21heF9wcmVmaXhsZW4KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgoKY2xhc3MgSVB2NEFkZHJlc3MoX0Jhc2VWNCwgX0Jhc2VBZGRyZXNzKToKCiAgICAiIiJSZXByZXNlbnQgYW5kIG1hbmlwdWxhdGUgc2luZ2xlIElQdjQgQWRkcmVzc2VzLiIiIgoKICAgIF9fc2xvdHNfXyA9ICgnX2lwJywgJ19fd2Vha3JlZl9fJykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CgogICAgICAgICIiIgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBJUAoKICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIGFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCwgc28KICAgICAgICAgICAgICBJUHY0QWRkcmVzcygnMTkyLjAuMi4xJykgPT0gSVB2NEFkZHJlc3MoMzIyMTIyNTk4NSkuCiAgICAgICAgICAgICAgb3IsIG1vcmUgZ2VuZXJhbGx5CiAgICAgICAgICAgICAgSVB2NEFkZHJlc3MoaW50KElQdjRBZGRyZXNzKCcxOTIuMC4yLjEnKSkpID09CiAgICAgICAgICAgICAgICBJUHY0QWRkcmVzcygnMTkyLjAuMi4xJykKCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBBZGRyZXNzVmFsdWVFcnJvcjogSWYgaXBhZGRyZXNzIGlzbid0IGEgdmFsaWQgSVB2NCBhZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICAjIEVmZmljaWVudCBjb25zdHJ1Y3RvciBmcm9tIGludGVnZXIuCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBfY29tcGF0X2ludF90eXBlcyk6CiAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ludF9hZGRyZXNzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYuX2lwID0gYWRkcmVzcwogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBDb25zdHJ1Y3RpbmcgZnJvbSBhIHBhY2tlZCBhZGRyZXNzCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBieXRlcyk6CiAgICAgICAgICAgIHNlbGYuX2NoZWNrX3BhY2tlZF9hZGRyZXNzKGFkZHJlc3MsIDQpCiAgICAgICAgICAgIGJ2cyA9IF9jb21wYXRfYnl0ZXNfdG9fYnl0ZV92YWxzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYuX2lwID0gX2NvbXBhdF9pbnRfZnJvbV9ieXRlX3ZhbHMoYnZzLCAnYmlnJykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQXNzdW1lIGlucHV0IGFyZ3VtZW50IHRvIGJlIHN0cmluZyBvciBhbnkgb2JqZWN0IHJlcHJlc2VudGF0aW9uCiAgICAgICAgIyB3aGljaCBjb252ZXJ0cyBpbnRvIGEgZm9ybWF0dGVkIElQIHN0cmluZy4KICAgICAgICBhZGRyX3N0ciA9IF9jb21wYXRfc3RyKGFkZHJlc3MpCiAgICAgICAgaWYgJy8nIGluIGFkZHJfc3RyOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiVW5leHBlY3RlZCAnLycgaW4gJXIiICUgYWRkcmVzcykKICAgICAgICBzZWxmLl9pcCA9IHNlbGYuX2lwX2ludF9mcm9tX3N0cmluZyhhZGRyX3N0cikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYWNrZWQoc2VsZik6CiAgICAgICAgIiIiVGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFkZHJlc3MuIiIiCiAgICAgICAgcmV0dXJuIHY0X2ludF90b19wYWNrZWQoc2VsZi5faXApCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcmVzZXJ2ZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyBvdGhlcndpc2UgSUVURiByZXNlcnZlZC4KCiAgICAgICAgIFJldHVybnM6CiAgICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgd2l0aGluIHRoZQogICAgICAgICAgICAgcmVzZXJ2ZWQgSVB2NCBOZXR3b3JrIHJhbmdlLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX3Jlc2VydmVkX25ldHdvcmsKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcml2YXRlKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGFsbG9jYXRlZCBmb3IgcHJpdmF0ZSBuZXR3b3Jrcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlcgogICAgICAgICAgICBpYW5hLWlwdjQtc3BlY2lhbC1yZWdpc3RyeS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGFueShzZWxmIGluIG5ldCBmb3IgbmV0IGluIHNlbGYuX2NvbnN0YW50cy5fcHJpdmF0ZV9uZXR3b3JrcykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19nbG9iYWwoc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZiBub3QgaW4gc2VsZi5fY29uc3RhbnRzLl9wdWJsaWNfbmV0d29yayBhbmQKICAgICAgICAgICAgbm90IHNlbGYuaXNfcHJpdmF0ZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19tdWx0aWNhc3Qoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3IgbXVsdGljYXN0IHVzZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIG11bHRpY2FzdC4KICAgICAgICAgICAgU2VlIFJGQyAzMTcxIGZvciBkZXRhaWxzLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX211bHRpY2FzdF9uZXR3b3JrCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfdW5zcGVjaWZpZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyB1bnNwZWNpZmllZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoaXMgaXMgdGhlIHVuc3BlY2lmaWVkIGFkZHJlc3MgYXMgZGVmaW5lZCBpbgogICAgICAgICAgICBSRkMgNTczNSAzLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiA9PSBzZWxmLl9jb25zdGFudHMuX3Vuc3BlY2lmaWVkX2FkZHJlc3MKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19sb29wYmFjayhzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgcGVyIFJGQyAzMzMwLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX2xvb3BiYWNrX25ldHdvcmsKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19saW5rX2xvY2FsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIGxpbmstbG9jYWwuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBsaW5rLWxvY2FsIHBlciBSRkMgMzkyNy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgaW4gc2VsZi5fY29uc3RhbnRzLl9saW5rbG9jYWxfbmV0d29yawoKCmNsYXNzIElQdjRJbnRlcmZhY2UoSVB2NEFkZHJlc3MpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzKToKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIChieXRlcywgX2NvbXBhdF9pbnRfdHlwZXMpKToKICAgICAgICAgICAgSVB2NEFkZHJlc3MuX19pbml0X18oc2VsZiwgYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5uZXR3b3JrID0gSVB2NE5ldHdvcmsoc2VsZi5faXApCiAgICAgICAgICAgIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgdHVwbGUpOgogICAgICAgICAgICBJUHY0QWRkcmVzcy5fX2luaXRfXyhzZWxmLCBhZGRyZXNzWzBdKQogICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgogICAgICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gaW50KGFkZHJlc3NbMV0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYXhfcHJlZml4bGVuCgogICAgICAgICAgICBzZWxmLm5ldHdvcmsgPSBJUHY0TmV0d29yayhhZGRyZXNzLCBzdHJpY3Q9RmFsc2UpCiAgICAgICAgICAgIHNlbGYubmV0bWFzayA9IHNlbGYubmV0d29yay5uZXRtYXNrCiAgICAgICAgICAgIHNlbGYuaG9zdG1hc2sgPSBzZWxmLm5ldHdvcmsuaG9zdG1hc2sKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGFkZHIgPSBfc3BsaXRfb3B0aW9uYWxfbmV0bWFzayhhZGRyZXNzKQogICAgICAgIElQdjRBZGRyZXNzLl9faW5pdF9fKHNlbGYsIGFkZHJbMF0pCgogICAgICAgIHNlbGYubmV0d29yayA9IElQdjROZXR3b3JrKGFkZHJlc3MsIHN0cmljdD1GYWxzZSkKICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLm5ldHdvcmsuX3ByZWZpeGxlbgoKICAgICAgICBzZWxmLm5ldG1hc2sgPSBzZWxmLm5ldHdvcmsubmV0bWFzawogICAgICAgIHNlbGYuaG9zdG1hc2sgPSBzZWxmLm5ldHdvcmsuaG9zdG1hc2sKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVkJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29yay5wcmVmaXhsZW4pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgYWRkcmVzc19lcXVhbCA9IElQdjRBZGRyZXNzLl9fZXFfXyhzZWxmLCBvdGhlcikKICAgICAgICBpZiBub3QgYWRkcmVzc19lcXVhbCBvciBhZGRyZXNzX2VxdWFsIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gYWRkcmVzc19lcXVhbAogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV0d29yayA9PSBvdGhlci5uZXR3b3JrCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIEFuIGludGVyZmFjZSB3aXRoIGFuIGFzc29jaWF0ZWQgbmV0d29yayBpcyBOT1QgdGhlCiAgICAgICAgICAgICMgc2FtZSBhcyBhbiB1bmFzc29jaWF0ZWQgYWRkcmVzcy4gVGhhdCdzIHdoeSB0aGUgaGFzaAogICAgICAgICAgICAjIHRha2VzIHRoZSBleHRyYSBpbmZvIGludG8gYWNjb3VudC4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgYWRkcmVzc19sZXNzID0gSVB2NEFkZHJlc3MuX19sdF9fKHNlbGYsIG90aGVyKQogICAgICAgIGlmIGFkZHJlc3NfbGVzcyBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5uZXR3b3JrIDwgb3RoZXIubmV0d29yawogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBXZSAqZG8qIGFsbG93IGFkZHJlc3NlcyBhbmQgaW50ZXJmYWNlcyB0byBiZSBzb3J0ZWQuIFRoZQogICAgICAgICAgICAjIHVuYXNzb2NpYXRlZCBhZGRyZXNzIGlzIGNvbnNpZGVyZWQgbGVzcyB0aGFuIGFsbCBpbnRlcmZhY2VzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lwIF4gc2VsZi5fcHJlZml4bGVuIF4gaW50KHNlbGYubmV0d29yay5uZXR3b3JrX2FkZHJlc3MpCgogICAgX19yZWR1Y2VfXyA9IF9JUEFkZHJlc3NCYXNlLl9fcmVkdWNlX18KCiAgICBAcHJvcGVydHkKICAgIGRlZiBpcChzZWxmKToKICAgICAgICByZXR1cm4gSVB2NEFkZHJlc3Moc2VsZi5faXApCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9wcmVmaXhsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4pCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9uZXRtYXNrKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXRtYXNrKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfaG9zdG1hc2soc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RtYXNrKQoKCmNsYXNzIElQdjROZXR3b3JrKF9CYXNlVjQsIF9CYXNlTmV0d29yayk6CgogICAgIiIiVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuZCBtYW5pcHVsYXRlcyAzMi1iaXQgSVB2NCBuZXR3b3JrICsgYWRkcmVzc2VzLi4KCiAgICBBdHRyaWJ1dGVzOiBbZXhhbXBsZXMgZm9yIElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjcnKV0KICAgICAgICAubmV0d29ya19hZGRyZXNzOiBJUHY0QWRkcmVzcygnMTkyLjAuMi4wJykKICAgICAgICAuaG9zdG1hc2s6IElQdjRBZGRyZXNzKCcwLjAuMC4zMScpCiAgICAgICAgLmJyb2FkY2FzdF9hZGRyZXNzOiBJUHY0QWRkcmVzcygnMTkyLjAuMi4zMicpCiAgICAgICAgLm5ldG1hc2s6IElQdjRBZGRyZXNzKCcyNTUuMjU1LjI1NS4yMjQnKQogICAgICAgIC5wcmVmaXhsZW46IDI3CgogICAgIiIiCiAgICAjIENsYXNzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGFkZHJlc3Mgb2JqZWN0cwogICAgX2FkZHJlc3NfY2xhc3MgPSBJUHY0QWRkcmVzcwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzLCBzdHJpY3Q9VHJ1ZSk6CgogICAgICAgICIiIkluc3RhbnRpYXRlIGEgbmV3IElQdjQgbmV0d29yayBvYmplY3QuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBJUCBbJiBuZXR3b3JrXS4KICAgICAgICAgICAgICAnMTkyLjAuMi4wLzI0JwogICAgICAgICAgICAgICcxOTIuMC4yLjAvMjU1LjI1NS4yNTUuMCcKICAgICAgICAgICAgICAnMTkyLjAuMC4yLzAuMC4wLjI1NScKICAgICAgICAgICAgICBhcmUgYWxsIGZ1bmN0aW9uYWxseSB0aGUgc2FtZSBpbiBJUHY0LiBTaW1pbGFybHksCiAgICAgICAgICAgICAgJzE5Mi4wLjIuMScKICAgICAgICAgICAgICAnMTkyLjAuMi4xLzI1NS4yNTUuMjU1LjI1NScKICAgICAgICAgICAgICAnMTkyLjAuMi4xLzMyJwogICAgICAgICAgICAgIGFyZSBhbHNvIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50LiBUaGF0IGlzIHRvIHNheSwgZmFpbGluZyB0bwogICAgICAgICAgICAgIHByb3ZpZGUgYSBzdWJuZXRtYXNrIHdpbGwgY3JlYXRlIGFuIG9iamVjdCB3aXRoIGEgbWFzayBvZiAvMzIuCgogICAgICAgICAgICAgIElmIHRoZSBtYXNrIChwb3J0aW9uIGFmdGVyIHRoZSAvIGluIHRoZSBhcmd1bWVudCkgaXMgZ2l2ZW4gaW4KICAgICAgICAgICAgICBkb3R0ZWQgcXVhZCBmb3JtLCBpdCBpcyB0cmVhdGVkIGFzIGEgbmV0bWFzayBpZiBpdCBzdGFydHMgd2l0aCBhCiAgICAgICAgICAgICAgbm9uLXplcm8gZmllbGQgKGUuZy4gLzI1NS4wLjAuMCA9PSAvOCkgYW5kIGFzIGEgaG9zdG1hc2sgaWYgaXQKICAgICAgICAgICAgICBzdGFydHMgd2l0aCBhIHplcm8gZmllbGQgKGUuZy4gMC4yNTUuMjU1LjI1NSA9PSAvOCksIHdpdGggdGhlCiAgICAgICAgICAgICAgc2luZ2xlIGV4Y2VwdGlvbiBvZiBhbiBhbGwtemVybyBtYXNrIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYQogICAgICAgICAgICAgIG5ldG1hc2sgPT0gLzAuIElmIG5vIG1hc2sgaXMgZ2l2ZW4sIGEgZGVmYXVsdCBvZiAvMzIgaXMgdXNlZC4KCiAgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhbiBpbnRlZ2VyIGNhbiBiZSBwYXNzZWQsIHNvCiAgICAgICAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMScpID09IElQdjROZXR3b3JrKDMyMjEyMjU5ODUpCiAgICAgICAgICAgICAgb3IsIG1vcmUgZ2VuZXJhbGx5CiAgICAgICAgICAgICAgSVB2NEludGVyZmFjZShpbnQoSVB2NEludGVyZmFjZSgnMTkyLjAuMi4xJykpKSA9PQogICAgICAgICAgICAgICAgSVB2NEludGVyZmFjZSgnMTkyLjAuMi4xJykKCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBBZGRyZXNzVmFsdWVFcnJvcjogSWYgaXBhZGRyZXNzIGlzbid0IGEgdmFsaWQgSVB2NCBhZGRyZXNzLgogICAgICAgICAgICBOZXRtYXNrVmFsdWVFcnJvcjogSWYgdGhlIG5ldG1hc2sgaXNuJ3QgdmFsaWQgZm9yCiAgICAgICAgICAgICAgYW4gSVB2NCBhZGRyZXNzLgogICAgICAgICAgICBWYWx1ZUVycm9yOiBJZiBzdHJpY3QgaXMgVHJ1ZSBhbmQgYSBuZXR3b3JrIGFkZHJlc3MgaXMgbm90CiAgICAgICAgICAgICAgc3VwcGxpZWQuCgogICAgICAgICIiIgogICAgICAgIF9CYXNlTmV0d29yay5fX2luaXRfXyhzZWxmLCBhZGRyZXNzKQoKICAgICAgICAjIENvbnN0cnVjdGluZyBmcm9tIGEgcGFja2VkIGFkZHJlc3Mgb3IgaW50ZWdlcgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgKF9jb21wYXRfaW50X3R5cGVzLCBieXRlcykpOgogICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjRBZGRyZXNzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYubmV0bWFzaywgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWFrZV9uZXRtYXNrKAogICAgICAgICAgICAgICAgc2VsZi5fbWF4X3ByZWZpeGxlbikKICAgICAgICAgICAgIyBmaXhtZTogYWRkcmVzcy9uZXR3b3JrIHRlc3QgaGVyZS4KICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgdHVwbGUpOgogICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgogICAgICAgICAgICAgICAgYXJnID0gYWRkcmVzc1sxXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBXZSB3ZXJlbid0IGdpdmVuIGFuIGFkZHJlc3NbMV0KICAgICAgICAgICAgICAgIGFyZyA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY0QWRkcmVzcyhhZGRyZXNzWzBdKQogICAgICAgICAgICBzZWxmLm5ldG1hc2ssIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21ha2VfbmV0bWFzayhhcmcpCiAgICAgICAgICAgIHBhY2tlZCA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICAgICAgaWYgcGFja2VkICYgaW50KHNlbGYubmV0bWFzaykgIT0gcGFja2VkOgogICAgICAgICAgICAgICAgaWYgc3RyaWN0OgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIGhhcyBob3N0IGJpdHMgc2V0JyAlIHNlbGYpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NEFkZHJlc3MocGFja2VkICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChzZWxmLm5ldG1hc2spKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBBc3N1bWUgaW5wdXQgYXJndW1lbnQgdG8gYmUgc3RyaW5nIG9yIGFueSBvYmplY3QgcmVwcmVzZW50YXRpb24KICAgICAgICAjIHdoaWNoIGNvbnZlcnRzIGludG8gYSBmb3JtYXR0ZWQgSVAgcHJlZml4IHN0cmluZy4KICAgICAgICBhZGRyID0gX3NwbGl0X29wdGlvbmFsX25ldG1hc2soYWRkcmVzcykKICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjRBZGRyZXNzKHNlbGYuX2lwX2ludF9mcm9tX3N0cmluZyhhZGRyWzBdKSkKCiAgICAgICAgaWYgbGVuKGFkZHIpID09IDI6CiAgICAgICAgICAgIGFyZyA9IGFkZHJbMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmcgPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgc2VsZi5uZXRtYXNrLCBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYWtlX25ldG1hc2soYXJnKQoKICAgICAgICBpZiBzdHJpY3Q6CiAgICAgICAgICAgIGlmIChJUHY0QWRkcmVzcyhpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpICYgaW50KHNlbGYubmV0bWFzaykpICE9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MpOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgaGFzIGhvc3QgYml0cyBzZXQnICUgc2VsZikKICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjRBZGRyZXNzKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYubmV0bWFzaykpCgogICAgICAgIGlmIHNlbGYuX3ByZWZpeGxlbiA9PSAoc2VsZi5fbWF4X3ByZWZpeGxlbiAtIDEpOgogICAgICAgICAgICBzZWxmLmhvc3RzID0gc2VsZi5fX2l0ZXJfXwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2dsb2JhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBhbGxvY2F0ZWQgZm9yIHB1YmxpYyBuZXR3b3Jrcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIG5vdCByZXNlcnZlZCBwZXIKICAgICAgICAgICAgaWFuYS1pcHY0LXNwZWNpYWwtcmVnaXN0cnkuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAobm90IChzZWxmLm5ldHdvcmtfYWRkcmVzcyBpbiBJUHY0TmV0d29yaygnMTAwLjY0LjAuMC8xMCcpIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcyBpbiBJUHY0TmV0d29yaygnMTAwLjY0LjAuMC8xMCcpKSBhbmQKICAgICAgICAgICAgICAgIG5vdCBzZWxmLmlzX3ByaXZhdGUpCgoKY2xhc3MgX0lQdjRDb25zdGFudHMob2JqZWN0KToKCiAgICBfbGlua2xvY2FsX25ldHdvcmsgPSBJUHY0TmV0d29yaygnMTY5LjI1NC4wLjAvMTYnKQoKICAgIF9sb29wYmFja19uZXR3b3JrID0gSVB2NE5ldHdvcmsoJzEyNy4wLjAuMC84JykKCiAgICBfbXVsdGljYXN0X25ldHdvcmsgPSBJUHY0TmV0d29yaygnMjI0LjAuMC4wLzQnKQoKICAgIF9wdWJsaWNfbmV0d29yayA9IElQdjROZXR3b3JrKCcxMDAuNjQuMC4wLzEwJykKCiAgICBfcHJpdmF0ZV9uZXR3b3JrcyA9IFsKICAgICAgICBJUHY0TmV0d29yaygnMC4wLjAuMC84JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzEwLjAuMC4wLzgnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTI3LjAuMC4wLzgnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTY5LjI1NC4wLjAvMTYnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTcyLjE2LjAuMC8xMicpLAogICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4wLjAvMjknKSwKICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMC4xNzAvMzEnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI0JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4xNjguMC4wLzE2JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE5OC4xOC4wLjAvMTUnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTk4LjUxLjEwMC4wLzI0JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzIwMy4wLjExMy4wLzI0JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzI0MC4wLjAuMC80JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzI1NS4yNTUuMjU1LjI1NS8zMicpLAogICAgXQoKICAgIF9yZXNlcnZlZF9uZXR3b3JrID0gSVB2NE5ldHdvcmsoJzI0MC4wLjAuMC80JykKCiAgICBfdW5zcGVjaWZpZWRfYWRkcmVzcyA9IElQdjRBZGRyZXNzKCcwLjAuMC4wJykKCgpJUHY0QWRkcmVzcy5fY29uc3RhbnRzID0gX0lQdjRDb25zdGFudHMKCgpjbGFzcyBfQmFzZVY2KG9iamVjdCk6CgogICAgIiIiQmFzZSBJUHY2IG9iamVjdC4KCiAgICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgYnkgSVB2NiBvYmplY3RzIGluIGJvdGggc2luZ2xlIElQCiAgICBhZGRyZXNzZXMgYW5kIG5ldHdvcmtzLgoKICAgICIiIgoKICAgIF9fc2xvdHNfXyA9ICgpCiAgICBfdmVyc2lvbiA9IDYKICAgIF9BTExfT05FUyA9ICgyICoqIElQVjZMRU5HVEgpIC0gMQogICAgX0hFWFRFVF9DT1VOVCA9IDgKICAgIF9IRVhfRElHSVRTID0gZnJvemVuc2V0KCcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJykKICAgIF9tYXhfcHJlZml4bGVuID0gSVBWNkxFTkdUSAoKICAgICMgVGhlcmUgYXJlIG9ubHkgYSBidW5jaCBvZiB2YWxpZCB2NiBuZXRtYXNrcywgc28gd2UgY2FjaGUgdGhlbSBhbGwKICAgICMgd2hlbiBjb25zdHJ1Y3RlZCAoc2VlIF9tYWtlX25ldG1hc2soKSkuCiAgICBfbmV0bWFza19jYWNoZSA9IHt9CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX21ha2VfbmV0bWFzayhjbHMsIGFyZyk6CiAgICAgICAgIiIiTWFrZSBhIChuZXRtYXNrLCBwcmVmaXhfbGVuKSB0dXBsZSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudC4KCiAgICAgICAgQXJndW1lbnQgY2FuIGJlOgogICAgICAgIC0gYW4gaW50ZWdlciAodGhlIHByZWZpeCBsZW5ndGgpCiAgICAgICAgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByZWZpeCBsZW5ndGggKGUuZy4gIjI0IikKICAgICAgICAtIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJlZml4IG5ldG1hc2sgKGUuZy4gIjI1NS4yNTUuMjU1LjAiKQogICAgICAgICIiIgogICAgICAgIGlmIGFyZyBub3QgaW4gY2xzLl9uZXRtYXNrX2NhY2hlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgX2NvbXBhdF9pbnRfdHlwZXMpOgogICAgICAgICAgICAgICAgcHJlZml4bGVuID0gYXJnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmVmaXhsZW4gPSBjbHMuX3ByZWZpeF9mcm9tX3ByZWZpeF9zdHJpbmcoYXJnKQogICAgICAgICAgICBuZXRtYXNrID0gSVB2NkFkZHJlc3MoY2xzLl9pcF9pbnRfZnJvbV9wcmVmaXgocHJlZml4bGVuKSkKICAgICAgICAgICAgY2xzLl9uZXRtYXNrX2NhY2hlW2FyZ10gPSBuZXRtYXNrLCBwcmVmaXhsZW4KICAgICAgICByZXR1cm4gY2xzLl9uZXRtYXNrX2NhY2hlW2FyZ10KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfaXBfaW50X2Zyb21fc3RyaW5nKGNscywgaXBfc3RyKToKICAgICAgICAiIiJUdXJuIGFuIElQdjYgaXBfc3RyIGludG8gYW4gaW50ZWdlci4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfc3RyOiBBIHN0cmluZywgdGhlIElQdjYgaXBfc3RyLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpbnQsIHRoZSBJUHY2IGFkZHJlc3MKCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBBZGRyZXNzVmFsdWVFcnJvcjogaWYgaXBfc3RyIGlzbid0IGEgdmFsaWQgSVB2NiBBZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXBfc3RyOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcignQWRkcmVzcyBjYW5ub3QgYmUgZW1wdHknKQoKICAgICAgICBwYXJ0cyA9IGlwX3N0ci5zcGxpdCgnOicpCgogICAgICAgICMgQW4gSVB2NiBhZGRyZXNzIG5lZWRzIGF0IGxlYXN0IDIgY29sb25zICgzIHBhcnRzKS4KICAgICAgICBfbWluX3BhcnRzID0gMwogICAgICAgIGlmIGxlbihwYXJ0cykgPCBfbWluX3BhcnRzOgogICAgICAgICAgICBtc2cgPSAiQXQgbGVhc3QgJWQgcGFydHMgZXhwZWN0ZWQgaW4gJXIiICUgKF9taW5fcGFydHMsIGlwX3N0cikKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnKQoKICAgICAgICAjIElmIHRoZSBhZGRyZXNzIGhhcyBhbiBJUHY0LXN0eWxlIHN1ZmZpeCwgY29udmVydCBpdCB0byBoZXhhZGVjaW1hbC4KICAgICAgICBpZiAnLicgaW4gcGFydHNbLTFdOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpcHY0X2ludCA9IElQdjRBZGRyZXNzKHBhcnRzLnBvcCgpKS5faXAKICAgICAgICAgICAgZXhjZXB0IEFkZHJlc3NWYWx1ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCIlcyBpbiAlciIgJSAoZXhjLCBpcF9zdHIpKQogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJyV4JyAlICgoaXB2NF9pbnQgPj4gMTYpICYgMHhGRkZGKSkKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCcleCcgJSAoaXB2NF9pbnQgJiAweEZGRkYpKQoKICAgICAgICAjIEFuIElQdjYgYWRkcmVzcyBjYW4ndCBoYXZlIG1vcmUgdGhhbiA4IGNvbG9ucyAoOSBwYXJ0cykuCiAgICAgICAgIyBUaGUgZXh0cmEgY29sb24gY29tZXMgZnJvbSB1c2luZyB0aGUgIjo6IiBub3RhdGlvbiBmb3IgYSBzaW5nbGUKICAgICAgICAjIGxlYWRpbmcgb3IgdHJhaWxpbmcgemVybyBwYXJ0LgogICAgICAgIF9tYXhfcGFydHMgPSBjbHMuX0hFWFRFVF9DT1VOVCArIDEKICAgICAgICBpZiBsZW4ocGFydHMpID4gX21heF9wYXJ0czoKICAgICAgICAgICAgbXNnID0gIkF0IG1vc3QgJWQgY29sb25zIHBlcm1pdHRlZCBpbiAlciIgJSAoCiAgICAgICAgICAgICAgICBfbWF4X3BhcnRzIC0gMSwgaXBfc3RyKQogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cpCgogICAgICAgICMgRGlzcmVnYXJkaW5nIHRoZSBlbmRwb2ludHMsIGZpbmQgJzo6JyB3aXRoIG5vdGhpbmcgaW4gYmV0d2Vlbi4KICAgICAgICAjIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBydW4gb2YgemVyb2VzIGhhcyBiZWVuIHNraXBwZWQuCiAgICAgICAgc2tpcF9pbmRleCA9IE5vbmUKICAgICAgICBmb3IgaSBpbiBfY29tcGF0X3JhbmdlKDEsIGxlbihwYXJ0cykgLSAxKToKICAgICAgICAgICAgaWYgbm90IHBhcnRzW2ldOgogICAgICAgICAgICAgICAgaWYgc2tpcF9pbmRleCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAjIENhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSAnOjonCiAgICAgICAgICAgICAgICAgICAgbXNnID0gIkF0IG1vc3Qgb25lICc6OicgcGVybWl0dGVkIGluICVyIiAlIGlwX3N0cgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZykKICAgICAgICAgICAgICAgIHNraXBfaW5kZXggPSBpCgogICAgICAgICMgcGFydHNfaGkgaXMgdGhlIG51bWJlciBvZiBwYXJ0cyB0byBjb3B5IGZyb20gYWJvdmUvYmVmb3JlIHRoZSAnOjonCiAgICAgICAgIyBwYXJ0c19sbyBpcyB0aGUgbnVtYmVyIG9mIHBhcnRzIHRvIGNvcHkgZnJvbSBiZWxvdy9hZnRlciB0aGUgJzo6JwogICAgICAgIGlmIHNraXBfaW5kZXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgSWYgd2UgZm91bmQgYSAnOjonLCB0aGVuIGNoZWNrIGlmIGl0IGFsc28gY292ZXJzIHRoZSBlbmRwb2ludHMuCiAgICAgICAgICAgIHBhcnRzX2hpID0gc2tpcF9pbmRleAogICAgICAgICAgICBwYXJ0c19sbyA9IGxlbihwYXJ0cykgLSBza2lwX2luZGV4IC0gMQogICAgICAgICAgICBpZiBub3QgcGFydHNbMF06CiAgICAgICAgICAgICAgICBwYXJ0c19oaSAtPSAxCiAgICAgICAgICAgICAgICBpZiBwYXJ0c19oaToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAiTGVhZGluZyAnOicgb25seSBwZXJtaXR0ZWQgYXMgcGFydCBvZiAnOjonIGluICVyIgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIGlwX3N0cikgICMgXjogcmVxdWlyZXMgXjo6CiAgICAgICAgICAgIGlmIG5vdCBwYXJ0c1stMV06CiAgICAgICAgICAgICAgICBwYXJ0c19sbyAtPSAxCiAgICAgICAgICAgICAgICBpZiBwYXJ0c19sbzoKICAgICAgICAgICAgICAgICAgICBtc2cgPSAiVHJhaWxpbmcgJzonIG9ubHkgcGVybWl0dGVkIGFzIHBhcnQgb2YgJzo6JyBpbiAlciIKICAgICAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSBpcF9zdHIpICAjIDokIHJlcXVpcmVzIDo6JAogICAgICAgICAgICBwYXJ0c19za2lwcGVkID0gY2xzLl9IRVhURVRfQ09VTlQgLSAocGFydHNfaGkgKyBwYXJ0c19sbykKICAgICAgICAgICAgaWYgcGFydHNfc2tpcHBlZCA8IDE6CiAgICAgICAgICAgICAgICBtc2cgPSAiRXhwZWN0ZWQgYXQgbW9zdCAlZCBvdGhlciBwYXJ0cyB3aXRoICc6OicgaW4gJXIiCiAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSAoY2xzLl9IRVhURVRfQ09VTlQgLSAxLCBpcF9zdHIpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBhbGxvY2F0ZSB0aGUgZW50aXJlIGFkZHJlc3MgdG8gcGFydHNfaGkuICBUaGUKICAgICAgICAgICAgIyBlbmRwb2ludHMgY291bGQgc3RpbGwgYmUgZW1wdHksIGJ1dCBfcGFyc2VfaGV4dGV0KCkgd2lsbCBjaGVjawogICAgICAgICAgICAjIGZvciB0aGF0LgogICAgICAgICAgICBpZiBsZW4ocGFydHMpICE9IGNscy5fSEVYVEVUX0NPVU5UOgogICAgICAgICAgICAgICAgbXNnID0gIkV4YWN0bHkgJWQgcGFydHMgZXhwZWN0ZWQgd2l0aG91dCAnOjonIGluICVyIgogICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgKGNscy5fSEVYVEVUX0NPVU5ULCBpcF9zdHIpKQogICAgICAgICAgICBpZiBub3QgcGFydHNbMF06CiAgICAgICAgICAgICAgICBtc2cgPSAiTGVhZGluZyAnOicgb25seSBwZXJtaXR0ZWQgYXMgcGFydCBvZiAnOjonIGluICVyIgogICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgaXBfc3RyKSAgIyBeOiByZXF1aXJlcyBeOjoKICAgICAgICAgICAgaWYgbm90IHBhcnRzWy0xXToKICAgICAgICAgICAgICAgIG1zZyA9ICJUcmFpbGluZyAnOicgb25seSBwZXJtaXR0ZWQgYXMgcGFydCBvZiAnOjonIGluICVyIgogICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgaXBfc3RyKSAgIyA6JCByZXF1aXJlcyA6OiQKICAgICAgICAgICAgcGFydHNfaGkgPSBsZW4ocGFydHMpCiAgICAgICAgICAgIHBhcnRzX2xvID0gMAogICAgICAgICAgICBwYXJ0c19za2lwcGVkID0gMAoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgTm93LCBwYXJzZSB0aGUgaGV4dGV0cyBpbnRvIGEgMTI4LWJpdCBpbnRlZ2VyLgogICAgICAgICAgICBpcF9pbnQgPSAwCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHBhcnRzX2hpKToKICAgICAgICAgICAgICAgIGlwX2ludCA8PD0gMTYKICAgICAgICAgICAgICAgIGlwX2ludCB8PSBjbHMuX3BhcnNlX2hleHRldChwYXJ0c1tpXSkKICAgICAgICAgICAgaXBfaW50IDw8PSAxNiAqIHBhcnRzX3NraXBwZWQKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLXBhcnRzX2xvLCAwKToKICAgICAgICAgICAgICAgIGlwX2ludCA8PD0gMTYKICAgICAgICAgICAgICAgIGlwX2ludCB8PSBjbHMuX3BhcnNlX2hleHRldChwYXJ0c1tpXSkKICAgICAgICAgICAgcmV0dXJuIGlwX2ludAogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoIiVzIGluICVyIiAlIChleGMsIGlwX3N0cikpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2hleHRldChjbHMsIGhleHRldF9zdHIpOgogICAgICAgICIiIkNvbnZlcnQgYW4gSVB2NiBoZXh0ZXQgc3RyaW5nIGludG8gYW4gaW50ZWdlci4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaGV4dGV0X3N0cjogQSBzdHJpbmcsIHRoZSBudW1iZXIgdG8gcGFyc2UuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIFRoZSBoZXh0ZXQgYXMgYW4gaW50ZWdlci4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBWYWx1ZUVycm9yOiBpZiB0aGUgaW5wdXQgaXNuJ3Qgc3RyaWN0bHkgYSBoZXggbnVtYmVyIGZyb20KICAgICAgICAgICAgICBbMC4uRkZGRl0uCgogICAgICAgICIiIgogICAgICAgICMgV2hpdGVsaXN0IHRoZSBjaGFyYWN0ZXJzLCBzaW5jZSBpbnQoKSBhbGxvd3MgYSBsb3Qgb2YgYml6YXJyZSBzdHVmZi4KICAgICAgICBpZiBub3QgY2xzLl9IRVhfRElHSVRTLmlzc3VwZXJzZXQoaGV4dGV0X3N0cik6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk9ubHkgaGV4IGRpZ2l0cyBwZXJtaXR0ZWQgaW4gJXIiICUgaGV4dGV0X3N0cikKICAgICAgICAjIFdlIGRvIHRoZSBsZW5ndGggY2hlY2sgc2Vjb25kLCBzaW5jZSB0aGUgaW52YWxpZCBjaGFyYWN0ZXIgZXJyb3IKICAgICAgICAjIGlzIGxpa2VseSB0byBiZSBtb3JlIGluZm9ybWF0aXZlIGZvciB0aGUgdXNlcgogICAgICAgIGlmIGxlbihoZXh0ZXRfc3RyKSA+IDQ6CiAgICAgICAgICAgIG1zZyA9ICJBdCBtb3N0IDQgY2hhcmFjdGVycyBwZXJtaXR0ZWQgaW4gJXIiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgaGV4dGV0X3N0cikKICAgICAgICAjIExlbmd0aCBjaGVjayBtZWFucyB3ZSBjYW4gc2tpcCBjaGVja2luZyB0aGUgaW50ZWdlciB2YWx1ZQogICAgICAgIHJldHVybiBpbnQoaGV4dGV0X3N0ciwgMTYpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2NvbXByZXNzX2hleHRldHMoY2xzLCBoZXh0ZXRzKToKICAgICAgICAiIiJDb21wcmVzc2VzIGEgbGlzdCBvZiBoZXh0ZXRzLgoKICAgICAgICBDb21wcmVzc2VzIGEgbGlzdCBvZiBzdHJpbmdzLCByZXBsYWNpbmcgdGhlIGxvbmdlc3QgY29udGludW91cwogICAgICAgIHNlcXVlbmNlIG9mICIwIiBpbiB0aGUgbGlzdCB3aXRoICIiIGFuZCBhZGRpbmcgZW1wdHkgc3RyaW5ncyBhdAogICAgICAgIHRoZSBiZWdpbm5pbmcgb3IgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHN1Y2ggdGhhdCBzdWJzZXF1ZW50bHkKICAgICAgICBjYWxsaW5nICI6Ii5qb2luKGhleHRldHMpIHdpbGwgcHJvZHVjZSB0aGUgY29tcHJlc3NlZCB2ZXJzaW9uIG9mCiAgICAgICAgdGhlIElQdjYgYWRkcmVzcy4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaGV4dGV0czogQSBsaXN0IG9mIHN0cmluZ3MsIHRoZSBoZXh0ZXRzIHRvIGNvbXByZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGxpc3Qgb2Ygc3RyaW5ncy4KCiAgICAgICAgIiIiCiAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9zdGFydCA9IC0xCiAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9sZW4gPSAwCiAgICAgICAgZG91YmxlY29sb25fc3RhcnQgPSAtMQogICAgICAgIGRvdWJsZWNvbG9uX2xlbiA9IDAKICAgICAgICBmb3IgaW5kZXgsIGhleHRldCBpbiBlbnVtZXJhdGUoaGV4dGV0cyk6CiAgICAgICAgICAgIGlmIGhleHRldCA9PSAnMCc6CiAgICAgICAgICAgICAgICBkb3VibGVjb2xvbl9sZW4gKz0gMQogICAgICAgICAgICAgICAgaWYgZG91YmxlY29sb25fc3RhcnQgPT0gLTE6CiAgICAgICAgICAgICAgICAgICAgIyBTdGFydCBvZiBhIHNlcXVlbmNlIG9mIHplcm9zLgogICAgICAgICAgICAgICAgICAgIGRvdWJsZWNvbG9uX3N0YXJ0ID0gaW5kZXgKICAgICAgICAgICAgICAgIGlmIGRvdWJsZWNvbG9uX2xlbiA+IGJlc3RfZG91YmxlY29sb25fbGVuOgogICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgbG9uZ2VzdCBzZXF1ZW5jZSBvZiB6ZXJvcyBzbyBmYXIuCiAgICAgICAgICAgICAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9sZW4gPSBkb3VibGVjb2xvbl9sZW4KICAgICAgICAgICAgICAgICAgICBiZXN0X2RvdWJsZWNvbG9uX3N0YXJ0ID0gZG91YmxlY29sb25fc3RhcnQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRvdWJsZWNvbG9uX2xlbiA9IDAKICAgICAgICAgICAgICAgIGRvdWJsZWNvbG9uX3N0YXJ0ID0gLTEKCiAgICAgICAgaWYgYmVzdF9kb3VibGVjb2xvbl9sZW4gPiAxOgogICAgICAgICAgICBiZXN0X2RvdWJsZWNvbG9uX2VuZCA9IChiZXN0X2RvdWJsZWNvbG9uX3N0YXJ0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9sZW4pCiAgICAgICAgICAgICMgRm9yIHplcm9zIGF0IHRoZSBlbmQgb2YgdGhlIGFkZHJlc3MuCiAgICAgICAgICAgIGlmIGJlc3RfZG91YmxlY29sb25fZW5kID09IGxlbihoZXh0ZXRzKToKICAgICAgICAgICAgICAgIGhleHRldHMgKz0gWycnXQogICAgICAgICAgICBoZXh0ZXRzW2Jlc3RfZG91YmxlY29sb25fc3RhcnQ6YmVzdF9kb3VibGVjb2xvbl9lbmRdID0gWycnXQogICAgICAgICAgICAjIEZvciB6ZXJvcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhZGRyZXNzLgogICAgICAgICAgICBpZiBiZXN0X2RvdWJsZWNvbG9uX3N0YXJ0ID09IDA6CiAgICAgICAgICAgICAgICBoZXh0ZXRzID0gWycnXSArIGhleHRldHMKCiAgICAgICAgcmV0dXJuIGhleHRldHMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfc3RyaW5nX2Zyb21faXBfaW50KGNscywgaXBfaW50PU5vbmUpOgogICAgICAgICIiIlR1cm5zIGEgMTI4LWJpdCBpbnRlZ2VyIGludG8gaGV4YWRlY2ltYWwgbm90YXRpb24uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX2ludDogQW4gaW50ZWdlciwgdGhlIElQIGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgc3RyaW5nLCB0aGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkZHJlc3MuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogVGhlIGFkZHJlc3MgaXMgYmlnZ2VyIHRoYW4gMTI4IGJpdHMgb2YgYWxsIG9uZXMuCgogICAgICAgICIiIgogICAgICAgIGlmIGlwX2ludCBpcyBOb25lOgogICAgICAgICAgICBpcF9pbnQgPSBpbnQoY2xzLl9pcCkKCiAgICAgICAgaWYgaXBfaW50ID4gY2xzLl9BTExfT05FUzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSVB2NiBhZGRyZXNzIGlzIHRvbyBsYXJnZScpCgogICAgICAgIGhleF9zdHIgPSAnJTAzMngnICUgaXBfaW50CiAgICAgICAgaGV4dGV0cyA9IFsnJXgnICUgaW50KGhleF9zdHJbeDp4ICsgNF0sIDE2KSBmb3IgeCBpbiByYW5nZSgwLCAzMiwgNCldCgogICAgICAgIGhleHRldHMgPSBjbHMuX2NvbXByZXNzX2hleHRldHMoaGV4dGV0cykKICAgICAgICByZXR1cm4gJzonLmpvaW4oaGV4dGV0cykKCiAgICBkZWYgX2V4cGxvZGVfc2hvcnRoYW5kX2lwX3N0cmluZyhzZWxmKToKICAgICAgICAiIiJFeHBhbmQgYSBzaG9ydGVuZWQgSVB2NiBhZGRyZXNzLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9zdHI6IEEgc3RyaW5nLCB0aGUgSVB2NiBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIHN0cmluZywgdGhlIGV4cGFuZGVkIElQdjYgYWRkcmVzcy4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLCBJUHY2TmV0d29yayk6CiAgICAgICAgICAgIGlwX3N0ciA9IF9jb21wYXRfc3RyKHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLCBJUHY2SW50ZXJmYWNlKToKICAgICAgICAgICAgaXBfc3RyID0gX2NvbXBhdF9zdHIoc2VsZi5pcCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpcF9zdHIgPSBfY29tcGF0X3N0cihzZWxmKQoKICAgICAgICBpcF9pbnQgPSBzZWxmLl9pcF9pbnRfZnJvbV9zdHJpbmcoaXBfc3RyKQogICAgICAgIGhleF9zdHIgPSAnJTAzMngnICUgaXBfaW50CiAgICAgICAgcGFydHMgPSBbaGV4X3N0clt4OnggKyA0XSBmb3IgeCBpbiByYW5nZSgwLCAzMiwgNCldCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLCAoX0Jhc2VOZXR3b3JrLCBJUHY2SW50ZXJmYWNlKSk6CiAgICAgICAgICAgIHJldHVybiAnJXMvJWQnICUgKCc6Jy5qb2luKHBhcnRzKSwgc2VsZi5fcHJlZml4bGVuKQogICAgICAgIHJldHVybiAnOicuam9pbihwYXJ0cykKCiAgICBkZWYgX3JldmVyc2VfcG9pbnRlcihzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIHJldmVyc2UgRE5TIHBvaW50ZXIgbmFtZSBmb3IgdGhlIElQdjYgYWRkcmVzcy4KCiAgICAgICAgVGhpcyBpbXBsZW1lbnRzIHRoZSBtZXRob2QgZGVzY3JpYmVkIGluIFJGQzM1OTYgMi41LgoKICAgICAgICAiIiIKICAgICAgICByZXZlcnNlX2NoYXJzID0gc2VsZi5leHBsb2RlZFs6Oi0xXS5yZXBsYWNlKCc6JywgJycpCiAgICAgICAgcmV0dXJuICcuJy5qb2luKHJldmVyc2VfY2hhcnMpICsgJy5pcDYuYXJwYScKCiAgICBAcHJvcGVydHkKICAgIGRlZiBtYXhfcHJlZml4bGVuKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9tYXhfcHJlZml4bGVuCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKCmNsYXNzIElQdjZBZGRyZXNzKF9CYXNlVjYsIF9CYXNlQWRkcmVzcyk6CgogICAgIiIiUmVwcmVzZW50IGFuZCBtYW5pcHVsYXRlIHNpbmdsZSBJUHY2IEFkZHJlc3Nlcy4iIiIKCiAgICBfX3Nsb3RzX18gPSAoJ19pcCcsICdfX3dlYWtyZWZfXycpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MpOgogICAgICAgICIiIkluc3RhbnRpYXRlIGEgbmV3IElQdjYgYWRkcmVzcyBvYmplY3QuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBJUAoKICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIGFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCwgc28KICAgICAgICAgICAgICBJUHY2QWRkcmVzcygnMjAwMTpkYjg6OicpID09CiAgICAgICAgICAgICAgICBJUHY2QWRkcmVzcyg0MjU0MDc2NjQxMTI4MjU5Mjg1NjkwMzk4NDk1MTY1MzgyNjU2MCkKICAgICAgICAgICAgICBvciwgbW9yZSBnZW5lcmFsbHkKICAgICAgICAgICAgICBJUHY2QWRkcmVzcyhpbnQoSVB2NkFkZHJlc3MoJzIwMDE6ZGI4OjonKSkpID09CiAgICAgICAgICAgICAgICBJUHY2QWRkcmVzcygnMjAwMTpkYjg6OicpCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgQWRkcmVzc1ZhbHVlRXJyb3I6IElmIGFkZHJlc3MgaXNuJ3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgICMgRWZmaWNpZW50IGNvbnN0cnVjdG9yIGZyb20gaW50ZWdlci4KICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIF9jb21wYXRfaW50X3R5cGVzKToKICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW50X2FkZHJlc3MoYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5faXAgPSBhZGRyZXNzCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIENvbnN0cnVjdGluZyBmcm9tIGEgcGFja2VkIGFkZHJlc3MKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIGJ5dGVzKToKICAgICAgICAgICAgc2VsZi5fY2hlY2tfcGFja2VkX2FkZHJlc3MoYWRkcmVzcywgMTYpCiAgICAgICAgICAgIGJ2cyA9IF9jb21wYXRfYnl0ZXNfdG9fYnl0ZV92YWxzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYuX2lwID0gX2NvbXBhdF9pbnRfZnJvbV9ieXRlX3ZhbHMoYnZzLCAnYmlnJykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQXNzdW1lIGlucHV0IGFyZ3VtZW50IHRvIGJlIHN0cmluZyBvciBhbnkgb2JqZWN0IHJlcHJlc2VudGF0aW9uCiAgICAgICAgIyB3aGljaCBjb252ZXJ0cyBpbnRvIGEgZm9ybWF0dGVkIElQIHN0cmluZy4KICAgICAgICBhZGRyX3N0ciA9IF9jb21wYXRfc3RyKGFkZHJlc3MpCiAgICAgICAgaWYgJy8nIGluIGFkZHJfc3RyOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiVW5leHBlY3RlZCAnLycgaW4gJXIiICUgYWRkcmVzcykKICAgICAgICBzZWxmLl9pcCA9IHNlbGYuX2lwX2ludF9mcm9tX3N0cmluZyhhZGRyX3N0cikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYWNrZWQoc2VsZik6CiAgICAgICAgIiIiVGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFkZHJlc3MuIiIiCiAgICAgICAgcmV0dXJuIHY2X2ludF90b19wYWNrZWQoc2VsZi5faXApCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbXVsdGljYXN0KHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIG11bHRpY2FzdCB1c2UuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIG11bHRpY2FzdCBhZGRyZXNzLgogICAgICAgICAgICBTZWUgUkZDIDIzNzMgMi43IGZvciBkZXRhaWxzLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX211bHRpY2FzdF9uZXR3b3JrCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcmVzZXJ2ZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyBvdGhlcndpc2UgSUVURiByZXNlcnZlZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBvbmUgb2YgdGhlCiAgICAgICAgICAgIHJlc2VydmVkIElQdjYgTmV0d29yayByYW5nZXMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBhbnkoc2VsZiBpbiB4IGZvciB4IGluIHNlbGYuX2NvbnN0YW50cy5fcmVzZXJ2ZWRfbmV0d29ya3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbGlua19sb2NhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBsaW5rLWxvY2FsLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyIFJGQyA0MjkxLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX2xpbmtsb2NhbF9uZXR3b3JrCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfc2l0ZV9sb2NhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBzaXRlLWxvY2FsLgoKICAgICAgICBOb3RlIHRoYXQgdGhlIHNpdGUtbG9jYWwgYWRkcmVzcyBzcGFjZSBoYXMgYmVlbiBkZXByZWNhdGVkIGJ5IFJGQyAzODc5LgogICAgICAgIFVzZSBpc19wcml2YXRlIHRvIHRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGluIHRoZSBzcGFjZSBvZiB1bmlxdWUgbG9jYWwKICAgICAgICBhZGRyZXNzZXMgYXMgZGVmaW5lZCBieSBSRkMgNDE5My4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlciBSRkMgMzUxMyAyLjUuNi4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgaW4gc2VsZi5fY29uc3RhbnRzLl9zaXRlbG9jYWxfbmV0d29yawoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByaXZhdGUoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgYWxsb2NhdGVkIGZvciBwcml2YXRlIG5ldHdvcmtzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyCiAgICAgICAgICAgIGlhbmEtaXB2Ni1zcGVjaWFsLXJlZ2lzdHJ5LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gYW55KHNlbGYgaW4gbmV0IGZvciBuZXQgaW4gc2VsZi5fY29uc3RhbnRzLl9wcml2YXRlX25ldHdvcmtzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2dsb2JhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBhbGxvY2F0ZWQgZm9yIHB1YmxpYyBuZXR3b3Jrcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIG5vdCByZXNlcnZlZCBwZXIKICAgICAgICAgICAgaWFuYS1pcHY2LXNwZWNpYWwtcmVnaXN0cnkuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBub3Qgc2VsZi5pc19wcml2YXRlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfdW5zcGVjaWZpZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyB1bnNwZWNpZmllZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoaXMgaXMgdGhlIHVuc3BlY2lmaWVkIGFkZHJlc3MgYXMgZGVmaW5lZCBpbgogICAgICAgICAgICBSRkMgMjM3MyAyLjUuMi4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2lwID09IDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19sb29wYmFjayhzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcyBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgIFJGQyAyMzczIDIuNS4zLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5faXAgPT0gMQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlwdjRfbWFwcGVkKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgSVB2NCBtYXBwZWQgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgSWYgdGhlIElQdjYgYWRkcmVzcyBpcyBhIHY0IG1hcHBlZCBhZGRyZXNzLCByZXR1cm4gdGhlCiAgICAgICAgICAgIElQdjQgbWFwcGVkIGFkZHJlc3MuIFJldHVybiBOb25lIG90aGVyd2lzZS4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgKHNlbGYuX2lwID4+IDMyKSAhPSAweEZGRkY6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIElQdjRBZGRyZXNzKHNlbGYuX2lwICYgMHhGRkZGRkZGRikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0ZXJlZG8oc2VsZik6CiAgICAgICAgIiIiVHVwbGUgb2YgZW1iZWRkZWQgdGVyZWRvIElQcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgVHVwbGUgb2YgdGhlIChzZXJ2ZXIsIGNsaWVudCkgSVBzIG9yIE5vbmUgaWYgdGhlIGFkZHJlc3MKICAgICAgICAgICAgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB0ZXJlZG8gYWRkcmVzcyAoZG9lc24ndCBzdGFydCB3aXRoCiAgICAgICAgICAgIDIwMDE6Oi8zMikKCiAgICAgICAgIiIiCiAgICAgICAgaWYgKHNlbGYuX2lwID4+IDk2KSAhPSAweDIwMDEwMDAwOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiAoSVB2NEFkZHJlc3MoKHNlbGYuX2lwID4+IDY0KSAmIDB4RkZGRkZGRkYpLAogICAgICAgICAgICAgICAgSVB2NEFkZHJlc3MofnNlbGYuX2lwICYgMHhGRkZGRkZGRikpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l4dG9mb3VyKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgSVB2NCA2dG80IGVtYmVkZGVkIGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIFRoZSBJUHY0IDZ0bzQtZW1iZWRkZWQgYWRkcmVzcyBpZiBwcmVzZW50IG9yIE5vbmUgaWYgdGhlCiAgICAgICAgICAgIGFkZHJlc3MgZG9lc24ndCBhcHBlYXIgdG8gY29udGFpbiBhIDZ0bzQgZW1iZWRkZWQgYWRkcmVzcy4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgKHNlbGYuX2lwID4+IDExMikgIT0gMHgyMDAyOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBJUHY0QWRkcmVzcygoc2VsZi5faXAgPj4gODApICYgMHhGRkZGRkZGRikKCgpjbGFzcyBJUHY2SW50ZXJmYWNlKElQdjZBZGRyZXNzKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCAoYnl0ZXMsIF9jb21wYXRfaW50X3R5cGVzKSk6CiAgICAgICAgICAgIElQdjZBZGRyZXNzLl9faW5pdF9fKHNlbGYsIGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYubmV0d29yayA9IElQdjZOZXR3b3JrKHNlbGYuX2lwKQogICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgdHVwbGUpOgogICAgICAgICAgICBJUHY2QWRkcmVzcy5fX2luaXRfXyhzZWxmLCBhZGRyZXNzWzBdKQogICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgogICAgICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gaW50KGFkZHJlc3NbMV0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgICAgIHNlbGYubmV0d29yayA9IElQdjZOZXR3b3JrKGFkZHJlc3MsIHN0cmljdD1GYWxzZSkKICAgICAgICAgICAgc2VsZi5uZXRtYXNrID0gc2VsZi5uZXR3b3JrLm5ldG1hc2sKICAgICAgICAgICAgc2VsZi5ob3N0bWFzayA9IHNlbGYubmV0d29yay5ob3N0bWFzawogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYWRkciA9IF9zcGxpdF9vcHRpb25hbF9uZXRtYXNrKGFkZHJlc3MpCiAgICAgICAgSVB2NkFkZHJlc3MuX19pbml0X18oc2VsZiwgYWRkclswXSkKICAgICAgICBzZWxmLm5ldHdvcmsgPSBJUHY2TmV0d29yayhhZGRyZXNzLCBzdHJpY3Q9RmFsc2UpCiAgICAgICAgc2VsZi5uZXRtYXNrID0gc2VsZi5uZXR3b3JrLm5ldG1hc2sKICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLm5ldHdvcmsuX3ByZWZpeGxlbgogICAgICAgIHNlbGYuaG9zdG1hc2sgPSBzZWxmLm5ldHdvcmsuaG9zdG1hc2sKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVkJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29yay5wcmVmaXhsZW4pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgYWRkcmVzc19lcXVhbCA9IElQdjZBZGRyZXNzLl9fZXFfXyhzZWxmLCBvdGhlcikKICAgICAgICBpZiBub3QgYWRkcmVzc19lcXVhbCBvciBhZGRyZXNzX2VxdWFsIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gYWRkcmVzc19lcXVhbAogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV0d29yayA9PSBvdGhlci5uZXR3b3JrCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIEFuIGludGVyZmFjZSB3aXRoIGFuIGFzc29jaWF0ZWQgbmV0d29yayBpcyBOT1QgdGhlCiAgICAgICAgICAgICMgc2FtZSBhcyBhbiB1bmFzc29jaWF0ZWQgYWRkcmVzcy4gVGhhdCdzIHdoeSB0aGUgaGFzaAogICAgICAgICAgICAjIHRha2VzIHRoZSBleHRyYSBpbmZvIGludG8gYWNjb3VudC4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgYWRkcmVzc19sZXNzID0gSVB2NkFkZHJlc3MuX19sdF9fKHNlbGYsIG90aGVyKQogICAgICAgIGlmIGFkZHJlc3NfbGVzcyBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5uZXR3b3JrIDwgb3RoZXIubmV0d29yawogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBXZSAqZG8qIGFsbG93IGFkZHJlc3NlcyBhbmQgaW50ZXJmYWNlcyB0byBiZSBzb3J0ZWQuIFRoZQogICAgICAgICAgICAjIHVuYXNzb2NpYXRlZCBhZGRyZXNzIGlzIGNvbnNpZGVyZWQgbGVzcyB0aGFuIGFsbCBpbnRlcmZhY2VzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lwIF4gc2VsZi5fcHJlZml4bGVuIF4gaW50KHNlbGYubmV0d29yay5uZXR3b3JrX2FkZHJlc3MpCgogICAgX19yZWR1Y2VfXyA9IF9JUEFkZHJlc3NCYXNlLl9fcmVkdWNlX18KCiAgICBAcHJvcGVydHkKICAgIGRlZiBpcChzZWxmKToKICAgICAgICByZXR1cm4gSVB2NkFkZHJlc3Moc2VsZi5faXApCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9wcmVmaXhsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4pCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9uZXRtYXNrKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXRtYXNrKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfaG9zdG1hc2soc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RtYXNrKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Vuc3BlY2lmaWVkKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pcCA9PSAwIGFuZCBzZWxmLm5ldHdvcmsuaXNfdW5zcGVjaWZpZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19sb29wYmFjayhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faXAgPT0gMSBhbmQgc2VsZi5uZXR3b3JrLmlzX2xvb3BiYWNrCgoKY2xhc3MgSVB2Nk5ldHdvcmsoX0Jhc2VWNiwgX0Jhc2VOZXR3b3JrKToKCiAgICAiIiJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW5kIG1hbmlwdWxhdGVzIDEyOC1iaXQgSVB2NiBuZXR3b3Jrcy4KCiAgICBBdHRyaWJ1dGVzOiBbZXhhbXBsZXMgZm9yIElQdjYoJzIwMDE6ZGI4OjoxMDAwLzEyNCcpXQogICAgICAgIC5uZXR3b3JrX2FkZHJlc3M6IElQdjZBZGRyZXNzKCcyMDAxOmRiODo6MTAwMCcpCiAgICAgICAgLmhvc3RtYXNrOiBJUHY2QWRkcmVzcygnOjpmJykKICAgICAgICAuYnJvYWRjYXN0X2FkZHJlc3M6IElQdjZBZGRyZXNzKCcyMDAxOmRiODo6MTAwZicpCiAgICAgICAgLm5ldG1hc2s6IElQdjZBZGRyZXNzKCdmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZjAnKQogICAgICAgIC5wcmVmaXhsZW46IDEyNAoKICAgICIiIgoKICAgICMgQ2xhc3MgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYWRkcmVzcyBvYmplY3RzCiAgICBfYWRkcmVzc19jbGFzcyA9IElQdjZBZGRyZXNzCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MsIHN0cmljdD1UcnVlKToKICAgICAgICAiIiJJbnN0YW50aWF0ZSBhIG5ldyBJUHY2IE5ldHdvcmsgb2JqZWN0LgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBhZGRyZXNzOiBBIHN0cmluZyBvciBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgSVB2NiBuZXR3b3JrIG9yIHRoZQogICAgICAgICAgICAgIElQIGFuZCBwcmVmaXgvbmV0bWFzay4KICAgICAgICAgICAgICAnMjAwMTpkYjg6Oi8xMjgnCiAgICAgICAgICAgICAgJzIwMDE6ZGI4OjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwLzEyOCcKICAgICAgICAgICAgICAnMjAwMTpkYjg6OicKICAgICAgICAgICAgICBhcmUgYWxsIGZ1bmN0aW9uYWxseSB0aGUgc2FtZSBpbiBJUHY2LiAgVGhhdCBpcyB0byBzYXksCiAgICAgICAgICAgICAgZmFpbGluZyB0byBwcm92aWRlIGEgc3VibmV0bWFzayB3aWxsIGNyZWF0ZSBhbiBvYmplY3Qgd2l0aAogICAgICAgICAgICAgIGEgbWFzayBvZiAvMTI4LgoKICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIGFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCwgc28KICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OicpID09CiAgICAgICAgICAgICAgICBJUHY2TmV0d29yayg0MjU0MDc2NjQxMTI4MjU5Mjg1NjkwMzk4NDk1MTY1MzgyNjU2MCkKICAgICAgICAgICAgICBvciwgbW9yZSBnZW5lcmFsbHkKICAgICAgICAgICAgICBJUHY2TmV0d29yayhpbnQoSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjonKSkpID09CiAgICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OicpCgogICAgICAgICAgICBzdHJpY3Q6IEEgYm9vbGVhbi4gSWYgdHJ1ZSwgZW5zdXJlIHRoYXQgd2UgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAgIEEgdHJ1ZSBuZXR3b3JrIGFkZHJlc3MsIGVnLCAyMDAxOmRiODo6MTAwMC8xMjQgYW5kIG5vdCBhbgogICAgICAgICAgICAgIElQIGFkZHJlc3Mgb24gYSBuZXR3b3JrLCBlZywgMjAwMTpkYjg6OjEvMTI0LgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIEFkZHJlc3NWYWx1ZUVycm9yOiBJZiBhZGRyZXNzIGlzbid0IGEgdmFsaWQgSVB2NiBhZGRyZXNzLgogICAgICAgICAgICBOZXRtYXNrVmFsdWVFcnJvcjogSWYgdGhlIG5ldG1hc2sgaXNuJ3QgdmFsaWQgZm9yCiAgICAgICAgICAgICAgYW4gSVB2NiBhZGRyZXNzLgogICAgICAgICAgICBWYWx1ZUVycm9yOiBJZiBzdHJpY3Qgd2FzIFRydWUgYW5kIGEgbmV0d29yayBhZGRyZXNzIHdhcyBub3QKICAgICAgICAgICAgICBzdXBwbGllZC4KCiAgICAgICAgIiIiCiAgICAgICAgX0Jhc2VOZXR3b3JrLl9faW5pdF9fKHNlbGYsIGFkZHJlc3MpCgogICAgICAgICMgRWZmaWNpZW50IGNvbnN0cnVjdG9yIGZyb20gaW50ZWdlciBvciBwYWNrZWQgYWRkcmVzcwogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgKGJ5dGVzLCBfY29tcGF0X2ludF90eXBlcykpOgogICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjZBZGRyZXNzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYubmV0bWFzaywgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWFrZV9uZXRtYXNrKAogICAgICAgICAgICAgICAgc2VsZi5fbWF4X3ByZWZpeGxlbikKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgdHVwbGUpOgogICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgogICAgICAgICAgICAgICAgYXJnID0gYWRkcmVzc1sxXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJnID0gc2VsZi5fbWF4X3ByZWZpeGxlbgogICAgICAgICAgICBzZWxmLm5ldG1hc2ssIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21ha2VfbmV0bWFzayhhcmcpCiAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NkFkZHJlc3MoYWRkcmVzc1swXSkKICAgICAgICAgICAgcGFja2VkID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgICAgICBpZiBwYWNrZWQgJiBpbnQoc2VsZi5uZXRtYXNrKSAhPSBwYWNrZWQ6CiAgICAgICAgICAgICAgICBpZiBzdHJpY3Q6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgaGFzIGhvc3QgYml0cyBzZXQnICUgc2VsZikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY2QWRkcmVzcyhwYWNrZWQgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYubmV0bWFzaykpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFzc3VtZSBpbnB1dCBhcmd1bWVudCB0byBiZSBzdHJpbmcgb3IgYW55IG9iamVjdCByZXByZXNlbnRhdGlvbgogICAgICAgICMgd2hpY2ggY29udmVydHMgaW50byBhIGZvcm1hdHRlZCBJUCBwcmVmaXggc3RyaW5nLgogICAgICAgIGFkZHIgPSBfc3BsaXRfb3B0aW9uYWxfbmV0bWFzayhhZGRyZXNzKQoKICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjZBZGRyZXNzKHNlbGYuX2lwX2ludF9mcm9tX3N0cmluZyhhZGRyWzBdKSkKCiAgICAgICAgaWYgbGVuKGFkZHIpID09IDI6CiAgICAgICAgICAgIGFyZyA9IGFkZHJbMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmcgPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgc2VsZi5uZXRtYXNrLCBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYWtlX25ldG1hc2soYXJnKQoKICAgICAgICBpZiBzdHJpY3Q6CiAgICAgICAgICAgIGlmIChJUHY2QWRkcmVzcyhpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpICYgaW50KHNlbGYubmV0bWFzaykpICE9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MpOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgaGFzIGhvc3QgYml0cyBzZXQnICUgc2VsZikKICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjZBZGRyZXNzKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYubmV0bWFzaykpCgogICAgICAgIGlmIHNlbGYuX3ByZWZpeGxlbiA9PSAoc2VsZi5fbWF4X3ByZWZpeGxlbiAtIDEpOgogICAgICAgICAgICBzZWxmLmhvc3RzID0gc2VsZi5fX2l0ZXJfXwoKICAgIGRlZiBob3N0cyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBJdGVyYXRvciBvdmVyIHVzYWJsZSBob3N0cyBpbiBhIG5ldHdvcmsuCgogICAgICAgICAgVGhpcyBpcyBsaWtlIF9faXRlcl9fIGV4Y2VwdCBpdCBkb2Vzbid0IHJldHVybiB0aGUKICAgICAgICAgIFN1Ym5ldC1Sb3V0ZXIgYW55Y2FzdCBhZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICBuZXR3b3JrID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgIGJyb2FkY2FzdCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgIGZvciB4IGluIF9jb21wYXRfcmFuZ2UobmV0d29yayArIDEsIGJyb2FkY2FzdCArIDEpOgogICAgICAgICAgICB5aWVsZCBzZWxmLl9hZGRyZXNzX2NsYXNzKHgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfc2l0ZV9sb2NhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBzaXRlLWxvY2FsLgoKICAgICAgICBOb3RlIHRoYXQgdGhlIHNpdGUtbG9jYWwgYWRkcmVzcyBzcGFjZSBoYXMgYmVlbiBkZXByZWNhdGVkIGJ5IFJGQyAzODc5LgogICAgICAgIFVzZSBpc19wcml2YXRlIHRvIHRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGluIHRoZSBzcGFjZSBvZiB1bmlxdWUgbG9jYWwKICAgICAgICBhZGRyZXNzZXMgYXMgZGVmaW5lZCBieSBSRkMgNDE5My4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlciBSRkMgMzUxMyAyLjUuNi4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc19zaXRlX2xvY2FsIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc19zaXRlX2xvY2FsKQoKCmNsYXNzIF9JUHY2Q29uc3RhbnRzKG9iamVjdCk6CgogICAgX2xpbmtsb2NhbF9uZXR3b3JrID0gSVB2Nk5ldHdvcmsoJ2ZlODA6Oi8xMCcpCgogICAgX211bHRpY2FzdF9uZXR3b3JrID0gSVB2Nk5ldHdvcmsoJ2ZmMDA6Oi84JykKCiAgICBfcHJpdmF0ZV9uZXR3b3JrcyA9IFsKICAgICAgICBJUHY2TmV0d29yaygnOjoxLzEyOCcpLAogICAgICAgIElQdjZOZXR3b3JrKCc6Oi8xMjgnKSwKICAgICAgICBJUHY2TmV0d29yaygnOjpmZmZmOjA6MC85NicpLAogICAgICAgIElQdjZOZXR3b3JrKCcxMDA6Oi82NCcpLAogICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOjovMjMnKSwKICAgICAgICBJUHY2TmV0d29yaygnMjAwMToyOjovNDgnKSwKICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6Oi8zMicpLAogICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOjEwOjovMjgnKSwKICAgICAgICBJUHY2TmV0d29yaygnZmMwMDo6LzcnKSwKICAgICAgICBJUHY2TmV0d29yaygnZmU4MDo6LzEwJyksCiAgICBdCgogICAgX3Jlc2VydmVkX25ldHdvcmtzID0gWwogICAgICAgIElQdjZOZXR3b3JrKCc6Oi84JyksIElQdjZOZXR3b3JrKCcxMDA6Oi84JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDo6LzcnKSwgSVB2Nk5ldHdvcmsoJzQwMDo6LzYnKSwKICAgICAgICBJUHY2TmV0d29yaygnODAwOjovNScpLCBJUHY2TmV0d29yaygnMTAwMDo6LzQnKSwKICAgICAgICBJUHY2TmV0d29yaygnNDAwMDo6LzMnKSwgSVB2Nk5ldHdvcmsoJzYwMDA6Oi8zJyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzgwMDA6Oi8zJyksIElQdjZOZXR3b3JrKCdBMDAwOjovMycpLAogICAgICAgIElQdjZOZXR3b3JrKCdDMDAwOjovMycpLCBJUHY2TmV0d29yaygnRTAwMDo6LzQnKSwKICAgICAgICBJUHY2TmV0d29yaygnRjAwMDo6LzUnKSwgSVB2Nk5ldHdvcmsoJ0Y4MDA6Oi82JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJ0ZFMDA6Oi85JyksCiAgICBdCgogICAgX3NpdGVsb2NhbF9uZXR3b3JrID0gSVB2Nk5ldHdvcmsoJ2ZlYzA6Oi8xMCcpCgoKSVB2NkFkZHJlc3MuX2NvbnN0YW50cyA9IF9JUHY2Q29uc3RhbnRzClBLAwQUAAAAAAAAACEA85kjgJskAACbJAAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvX19pbml0X18ucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCmxvY2tmaWxlLnB5IC0gUGxhdGZvcm0taW5kZXBlbmRlbnQgYWR2aXNvcnkgZmlsZSBsb2Nrcy4KClJlcXVpcmVzIFB5dGhvbiAyLjUgdW5sZXNzIHlvdSBhcHBseSAyLjQuZGlmZgpMb2NraW5nIGlzIGRvbmUgb24gYSBwZXItdGhyZWFkIGJhc2lzIGluc3RlYWQgb2YgYSBwZXItcHJvY2VzcyBiYXNpcy4KClVzYWdlOgoKPj4+IGxvY2sgPSBMb2NrRmlsZSgnc29tZWZpbGUnKQo+Pj4gdHJ5OgouLi4gICAgIGxvY2suYWNxdWlyZSgpCi4uLiBleGNlcHQgQWxyZWFkeUxvY2tlZDoKLi4uICAgICBwcmludCAnc29tZWZpbGUnLCAnaXMgbG9ja2VkIGFscmVhZHkuJwouLi4gZXhjZXB0IExvY2tGYWlsZWQ6Ci4uLiAgICAgcHJpbnQgJ3NvbWVmaWxlJywgJ2NhblxcJ3QgYmUgbG9ja2VkLicKLi4uIGVsc2U6Ci4uLiAgICAgcHJpbnQgJ2dvdCBsb2NrJwpnb3QgbG9jawo+Pj4gcHJpbnQgbG9jay5pc19sb2NrZWQoKQpUcnVlCj4+PiBsb2NrLnJlbGVhc2UoKQoKPj4+IGxvY2sgPSBMb2NrRmlsZSgnc29tZWZpbGUnKQo+Pj4gcHJpbnQgbG9jay5pc19sb2NrZWQoKQpGYWxzZQo+Pj4gd2l0aCBsb2NrOgouLi4gICAgcHJpbnQgbG9jay5pc19sb2NrZWQoKQpUcnVlCj4+PiBwcmludCBsb2NrLmlzX2xvY2tlZCgpCkZhbHNlCgo+Pj4gbG9jayA9IExvY2tGaWxlKCdzb21lZmlsZScpCj4+PiAjIEl0IGlzIG9rYXkgdG8gbG9jayB0d2ljZSBmcm9tIHRoZSBzYW1lIHRocmVhZC4uLgo+Pj4gd2l0aCBsb2NrOgouLi4gICAgIGxvY2suYWNxdWlyZSgpCi4uLgo+Pj4gIyBUaG91Z2ggbm8gY291bnRlciBpcyBrZXB0LCBzbyB5b3UgY2FuJ3QgdW5sb2NrIG11bHRpcGxlIHRpbWVzLi4uCj4+PiBwcmludCBsb2NrLmlzX2xvY2tlZCgpCkZhbHNlCgpFeGNlcHRpb25zOgoKICAgIEVycm9yIC0gYmFzZSBjbGFzcyBmb3Igb3RoZXIgZXhjZXB0aW9ucwogICAgICAgIExvY2tFcnJvciAtIGJhc2UgY2xhc3MgZm9yIGFsbCBsb2NraW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgQWxyZWFkeUxvY2tlZCAtIEFub3RoZXIgdGhyZWFkIG9yIHByb2Nlc3MgYWxyZWFkeSBob2xkcyB0aGUgbG9jawogICAgICAgICAgICBMb2NrRmFpbGVkIC0gTG9jayBmYWlsZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uCiAgICAgICAgVW5sb2NrRXJyb3IgLSBiYXNlIGNsYXNzIGZvciBhbGwgdW5sb2NraW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgQWxyZWFkeVVubG9ja2VkIC0gRmlsZSB3YXMgbm90IGxvY2tlZC4KICAgICAgICAgICAgTm90TXlMb2NrIC0gRmlsZSB3YXMgbG9ja2VkIGJ1dCBub3QgYnkgdGhlIGN1cnJlbnQgdGhyZWFkL3Byb2Nlc3MKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgb3MKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB3YXJuaW5ncwoKIyBXb3JrIHdpdGggUEVQOCBhbmQgbm9uLVBFUDggdmVyc2lvbnMgb2YgdGhyZWFkaW5nIG1vZHVsZS4KaWYgbm90IGhhc2F0dHIodGhyZWFkaW5nLCAiY3VycmVudF90aHJlYWQiKToKICAgIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCA9IHRocmVhZGluZy5jdXJyZW50VGhyZWFkCmlmIG5vdCBoYXNhdHRyKHRocmVhZGluZy5UaHJlYWQsICJnZXRfbmFtZSIpOgogICAgdGhyZWFkaW5nLlRocmVhZC5nZXRfbmFtZSA9IHRocmVhZGluZy5UaHJlYWQuZ2V0TmFtZQoKX19hbGxfXyA9IFsnRXJyb3InLCAnTG9ja0Vycm9yJywgJ0xvY2tUaW1lb3V0JywgJ0FscmVhZHlMb2NrZWQnLAogICAgICAgICAgICdMb2NrRmFpbGVkJywgJ1VubG9ja0Vycm9yJywgJ05vdExvY2tlZCcsICdOb3RNeUxvY2snLAogICAgICAgICAgICdMaW5rRmlsZUxvY2snLCAnTWtkaXJGaWxlTG9jaycsICdTUUxpdGVGaWxlTG9jaycsCiAgICAgICAgICAgJ0xvY2tCYXNlJywgJ2xvY2tlZCddCgoKY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIgogICAgQmFzZSBjbGFzcyBmb3Igb3RoZXIgZXhjZXB0aW9ucy4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgRXJyb3IKICAgIC4uLiBleGNlcHQgRXhjZXB0aW9uOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTG9ja0Vycm9yKEVycm9yKToKICAgICIiIgogICAgQmFzZSBjbGFzcyBmb3IgZXJyb3IgYXJpc2luZyBmcm9tIGF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIGxvY2suCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIExvY2tFcnJvcgogICAgLi4uIGV4Y2VwdCBFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIExvY2tUaW1lb3V0KExvY2tFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBsb2NrIGNyZWF0aW9uIGZhaWxzIHdpdGhpbiBhIHVzZXItZGVmaW5lZCBwZXJpb2Qgb2YgdGltZS4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgTG9ja1RpbWVvdXQKICAgIC4uLiBleGNlcHQgTG9ja0Vycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgQWxyZWFkeUxvY2tlZChMb2NrRXJyb3IpOgogICAgIiIiU29tZSBvdGhlciB0aHJlYWQvcHJvY2VzcyBpcyBsb2NraW5nIHRoZSBmaWxlLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBBbHJlYWR5TG9ja2VkCiAgICAuLi4gZXhjZXB0IExvY2tFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIExvY2tGYWlsZWQoTG9ja0Vycm9yKToKICAgICIiIkxvY2sgZmlsZSBjcmVhdGlvbiBmYWlsZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBMb2NrRmFpbGVkCiAgICAuLi4gZXhjZXB0IExvY2tFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIFVubG9ja0Vycm9yKEVycm9yKToKICAgICIiIgogICAgQmFzZSBjbGFzcyBmb3IgZXJyb3JzIGFyaXNpbmcgZnJvbSBhdHRlbXB0cyB0byByZWxlYXNlIHRoZSBsb2NrLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBVbmxvY2tFcnJvcgogICAgLi4uIGV4Y2VwdCBFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIE5vdExvY2tlZChVbmxvY2tFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdW5sb2NrIGFuIHVubG9ja2VkIGZpbGUuCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIE5vdExvY2tlZAogICAgLi4uIGV4Y2VwdCBVbmxvY2tFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIE5vdE15TG9jayhVbmxvY2tFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdW5sb2NrIGEgZmlsZSBzb21lb25lIGVsc2UgbG9ja2VkLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBOb3RNeUxvY2sKICAgIC4uLiBleGNlcHQgVW5sb2NrRXJyb3I6CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBfU2hhcmVkQmFzZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEFjcXVpcmUgdGhlIGxvY2suCgogICAgICAgICogSWYgdGltZW91dCBpcyBvbWl0dGVkIChvciBOb25lKSwgd2FpdCBmb3JldmVyIHRyeWluZyB0byBsb2NrIHRoZQogICAgICAgICAgZmlsZS4KCiAgICAgICAgKiBJZiB0aW1lb3V0ID4gMCwgdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgZm9yIHRoYXQgbWFueSBzZWNvbmRzLiAgSWYKICAgICAgICAgIHRoZSBsb2NrIHBlcmlvZCBleHBpcmVzIGFuZCB0aGUgZmlsZSBpcyBzdGlsbCBsb2NrZWQsIHJhaXNlCiAgICAgICAgICBMb2NrVGltZW91dC4KCiAgICAgICAgKiBJZiB0aW1lb3V0IDw9IDAsIHJhaXNlIEFscmVhZHlMb2NrZWQgaW1tZWRpYXRlbHkgaWYgdGhlIGZpbGUgaXMKICAgICAgICAgIGFscmVhZHkgbG9ja2VkLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJpbXBsZW1lbnQgaW4gc3ViY2xhc3MiKQoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlbGVhc2UgdGhlIGxvY2suCgogICAgICAgIElmIHRoZSBmaWxlIGlzIG5vdCBsb2NrZWQsIHJhaXNlIE5vdExvY2tlZC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgiaW1wbGVtZW50IGluIHN1YmNsYXNzIikKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbnRleHQgbWFuYWdlciBzdXBwb3J0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuYWNxdWlyZSgpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgKl9leGMpOgogICAgICAgICIiIgogICAgICAgIENvbnRleHQgbWFuYWdlciBzdXBwb3J0LgogICAgICAgICIiIgogICAgICAgIHNlbGYucmVsZWFzZSgpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPCVzOiAlcj4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnBhdGgpCgoKY2xhc3MgTG9ja0Jhc2UoX1NoYXJlZEJhc2UpOgogICAgIiIiQmFzZSBjbGFzcyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgbG9jayBjbGFzc2VzLiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkPVRydWUsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgPj4+IGxvY2sgPSBMb2NrQmFzZSgnc29tZWZpbGUnKQogICAgICAgID4+PiBsb2NrID0gTG9ja0Jhc2UoJ3NvbWVmaWxlJywgdGhyZWFkZWQ9RmFsc2UpCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoTG9ja0Jhc2UsIHNlbGYpLl9faW5pdF9fKHBhdGgpCiAgICAgICAgc2VsZi5sb2NrX2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgocGF0aCkgKyAiLmxvY2siCiAgICAgICAgc2VsZi5ob3N0bmFtZSA9IHNvY2tldC5nZXRob3N0bmFtZSgpCiAgICAgICAgc2VsZi5waWQgPSBvcy5nZXRwaWQoKQogICAgICAgIGlmIHRocmVhZGVkOgogICAgICAgICAgICB0ID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKICAgICAgICAgICAgIyBUaHJlYWQgb2JqZWN0cyBpbiBQeXRob24gMi40IGFuZCBlYXJsaWVyIGRvIG5vdCBoYXZlIGlkZW50CiAgICAgICAgICAgICMgYXR0cnMuICBXb3JtIGFyb3VuZCB0aGF0LgogICAgICAgICAgICBpZGVudCA9IGdldGF0dHIodCwgImlkZW50IiwgaGFzaCh0KSkKICAgICAgICAgICAgc2VsZi50bmFtZSA9ICItJXgiICUgKGlkZW50ICYgMHhmZmZmZmZmZikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRuYW1lID0gIiIKICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHNlbGYubG9ja19maWxlKQoKICAgICAgICAjIHVuaXF1ZSBuYW1lIGlzIG1vc3RseSBhYm91dCB0aGUgY3VycmVudCBwcm9jZXNzLCBidXQgbXVzdAogICAgICAgICMgYWxzbyBjb250YWluIHRoZSBwYXRoIC0tIG90aGVyd2lzZSwgdHdvIGFkamFjZW50IGxvY2tlZAogICAgICAgICMgZmlsZXMgY29uZmxpY3QgKG9uZSBmaWxlIGdldHMgbG9ja2VkLCBjcmVhdGluZyBsb2NrLWZpbGUgYW5kCiAgICAgICAgIyB1bmlxdWUgZmlsZSwgdGhlIG90aGVyIG9uZSBnZXRzIGxvY2tlZCwgY3JlYXRpbmcgbG9jay1maWxlCiAgICAgICAgIyBhbmQgb3ZlcndyaXRpbmcgdGhlIGFscmVhZHkgZXhpc3RpbmcgbG9jay1maWxlLCB0aGVuIG9uZQogICAgICAgICMgZ2V0cyB1bmxvY2tlZCwgZGVsZXRpbmcgYm90aCBsb2NrLWZpbGUgYW5kIHVuaXF1ZSBmaWxlLAogICAgICAgICMgZmluYWxseSB0aGUgbGFzdCBsb2NrIGVycm9ycyBvdXQgdXBvbiByZWxlYXNpbmcuCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzJXMuJXMlcyIgJSAoc2VsZi5ob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2goc2VsZi5wYXRoKSkpCiAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAoKICAgIGRlZiBpc19sb2NrZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVsbCB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBpcyBsb2NrZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoImltcGxlbWVudCBpbiBzdWJjbGFzcyIpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGlzIG9iamVjdCBpcyBsb2NraW5nIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJpbXBsZW1lbnQgaW4gc3ViY2xhc3MiKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhIGxvY2suICBVc2VmdWwgaWYgYSBsb2NraW5nIHRocmVhZCBmYWlsZWQgdG8gdW5sb2NrLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJpbXBsZW1lbnQgaW4gc3ViY2xhc3MiKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjwlczogJXIgLS0gJXI+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi51bmlxdWVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCgoKZGVmIF9mbF9oZWxwZXIoY2xzLCBtb2QsICphcmdzLCAqKmt3ZHMpOgogICAgd2FybmluZ3Mud2FybigiSW1wb3J0IGZyb20gJXMgbW9kdWxlIGluc3RlYWQgb2YgbG9ja2ZpbGUgcGFja2FnZSIgJSBtb2QsCiAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgIyBUaGlzIGlzIGEgYml0IGZ1bmt5LCBidXQgaXQncyBvbmx5IGZvciBhd2hpbGUuICBUaGUgd2F5IHRoZSB1bml0IHRlc3RzCiAgICAjIGFyZSBjb25zdHJ1Y3RlZCB0aGlzIGZ1bmN0aW9uIHdpbmRzIHVwIGFzIGFuIHVuYm91bmQgbWV0aG9kLCBzbyBpdAogICAgIyBhY3R1YWxseSB0YWtlcyB0aHJlZSBhcmdzLCBub3QgdHdvLiAgV2Ugd2FudCB0byB0b3NzIG91dCBzZWxmLgogICAgaWYgbm90IGlzaW5zdGFuY2UoYXJnc1swXSwgc3RyKToKICAgICAgICAjIFdlIGFyZSB0ZXN0aW5nLCBhdm9pZCB0aGUgZmlyc3QgYXJnCiAgICAgICAgYXJncyA9IGFyZ3NbMTpdCiAgICBpZiBsZW4oYXJncykgPT0gMSBhbmQgbm90IGt3ZHM6CiAgICAgICAga3dkc1sidGhyZWFkZWQiXSA9IFRydWUKICAgIHJldHVybiBjbHMoKmFyZ3MsICoqa3dkcykKCgpkZWYgTGlua0ZpbGVMb2NrKCphcmdzLCAqKmt3ZHMpOgogICAgIiIiRmFjdG9yeSBmdW5jdGlvbiBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgRG8gbm90IHVzZSBpbiBuZXcgY29kZS4gIEluc3RlYWQsIGltcG9ydCBMaW5rTG9ja0ZpbGUgZnJvbSB0aGUKICAgIGxvY2tmaWxlLmxpbmtsb2NrZmlsZSBtb2R1bGUuCiAgICAiIiIKICAgIGZyb20gLiBpbXBvcnQgbGlua2xvY2tmaWxlCiAgICByZXR1cm4gX2ZsX2hlbHBlcihsaW5rbG9ja2ZpbGUuTGlua0xvY2tGaWxlLCAibG9ja2ZpbGUubGlua2xvY2tmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3ZHMpCgoKZGVmIE1rZGlyRmlsZUxvY2soKmFyZ3MsICoqa3dkcyk6CiAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICBEbyBub3QgdXNlIGluIG5ldyBjb2RlLiAgSW5zdGVhZCwgaW1wb3J0IE1rZGlyTG9ja0ZpbGUgZnJvbSB0aGUKICAgIGxvY2tmaWxlLm1rZGlybG9ja2ZpbGUgbW9kdWxlLgogICAgIiIiCiAgICBmcm9tIC4gaW1wb3J0IG1rZGlybG9ja2ZpbGUKICAgIHJldHVybiBfZmxfaGVscGVyKG1rZGlybG9ja2ZpbGUuTWtkaXJMb2NrRmlsZSwgImxvY2tmaWxlLm1rZGlybG9ja2ZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dkcykKCgpkZWYgU1FMaXRlRmlsZUxvY2soKmFyZ3MsICoqa3dkcyk6CiAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICBEbyBub3QgdXNlIGluIG5ldyBjb2RlLiAgSW5zdGVhZCwgaW1wb3J0IFNRTGl0ZUxvY2tGaWxlIGZyb20gdGhlCiAgICBsb2NrZmlsZS5ta2RpcmxvY2tmaWxlIG1vZHVsZS4KICAgICIiIgogICAgZnJvbSAuIGltcG9ydCBzcWxpdGVsb2NrZmlsZQogICAgcmV0dXJuIF9mbF9oZWxwZXIoc3FsaXRlbG9ja2ZpbGUuU1FMaXRlTG9ja0ZpbGUsICJsb2NrZmlsZS5zcWxpdGVsb2NrZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAqYXJncywgKiprd2RzKQoKCmRlZiBsb2NrZWQocGF0aCwgdGltZW91dD1Ob25lKToKICAgICIiIkRlY29yYXRvciB3aGljaCBlbmFibGVzIGxvY2tzIGZvciBkZWNvcmF0ZWQgZnVuY3Rpb24uCgogICAgQXJndW1lbnRzOgogICAgIC0gcGF0aDogcGF0aCBmb3IgbG9ja2ZpbGUuCiAgICAgLSB0aW1lb3V0IChvcHRpb25hbCk6IFRpbWVvdXQgZm9yIGFjcXVpcmluZyBsb2NrLgoKICAgICBVc2FnZToKICAgICAgICAgQGxvY2tlZCgnL3Zhci9ydW4vbXluYW1lJywgdGltZW91dD0wKQogICAgICAgICBkZWYgbXluYW1lKC4uLik6CiAgICAgICAgICAgICAuLi4KICAgICIiIgogICAgZGVmIGRlY29yKGZ1bmMpOgogICAgICAgIEBmdW5jdG9vbHMud3JhcHMoZnVuYykKICAgICAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBsb2NrID0gRmlsZUxvY2socGF0aCwgdGltZW91dD10aW1lb3V0KQogICAgICAgICAgICBsb2NrLmFjcXVpcmUoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBsb2NrLnJlbGVhc2UoKQogICAgICAgIHJldHVybiB3cmFwcGVyCiAgICByZXR1cm4gZGVjb3IKCgppZiBoYXNhdHRyKG9zLCAibGluayIpOgogICAgZnJvbSAuIGltcG9ydCBsaW5rbG9ja2ZpbGUgYXMgX2xsZgogICAgTG9ja0ZpbGUgPSBfbGxmLkxpbmtMb2NrRmlsZQplbHNlOgogICAgZnJvbSAuIGltcG9ydCBta2RpcmxvY2tmaWxlIGFzIF9tbGYKICAgIExvY2tGaWxlID0gX21sZi5Na2RpckxvY2tGaWxlCgpGaWxlTG9jayA9IExvY2tGaWxlClBLAwQUAAAAAAAAACEAK97yJ1wKAABcCgAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvbGlua2xvY2tmaWxlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCB0aW1lCmltcG9ydCBvcwoKZnJvbSAuIGltcG9ydCAoTG9ja0Jhc2UsIExvY2tGYWlsZWQsIE5vdExvY2tlZCwgTm90TXlMb2NrLCBMb2NrVGltZW91dCwKICAgICAgICAgICAgICAgQWxyZWFkeUxvY2tlZCkKCgpjbGFzcyBMaW5rTG9ja0ZpbGUoTG9ja0Jhc2UpOgogICAgIiIiTG9jayBhY2Nlc3MgdG8gYSBmaWxlIHVzaW5nIGF0b21pYyBwcm9wZXJ0eSBvZiBsaW5rKDIpLgoKICAgID4+PiBsb2NrID0gTGlua0xvY2tGaWxlKCdzb21lZmlsZScpCiAgICA+Pj4gbG9jayA9IExpbmtMb2NrRmlsZSgnc29tZWZpbGUnLCB0aHJlYWRlZD1GYWxzZSkKICAgICIiIgoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcGVuKHNlbGYudW5pcXVlX25hbWUsICJ3YiIpLmNsb3NlKCkKICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgcmFpc2UgTG9ja0ZhaWxlZCgiZmFpbGVkIHRvIGNyZWF0ZSAlcyIgJSBzZWxmLnVuaXF1ZV9uYW1lKQoKICAgICAgICB0aW1lb3V0ID0gdGltZW91dCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2Ugc2VsZi50aW1lb3V0CiAgICAgICAgZW5kX3RpbWUgPSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICBlbmRfdGltZSArPSB0aW1lb3V0CgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgVHJ5IGFuZCBjcmVhdGUgYSBoYXJkIGxpbmsgdG8gaXQuCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLmxpbmsoc2VsZi51bmlxdWVfbmFtZSwgc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgIyBMaW5rIGNyZWF0aW9uIGZhaWxlZC4gIE1heWJlIHdlJ3ZlIGRvdWJsZS1sb2NrZWQ/CiAgICAgICAgICAgICAgICBubGlua3MgPSBvcy5zdGF0KHNlbGYudW5pcXVlX25hbWUpLnN0X25saW5rCiAgICAgICAgICAgICAgICBpZiBubGlua3MgPT0gMjoKICAgICAgICAgICAgICAgICAgICAjIFRoZSBvcmlnaW5hbCBsaW5rIHBsdXMgdGhlIG9uZSBJIGNyZWF0ZWQgPT0gMi4gIFdlJ3JlCiAgICAgICAgICAgICAgICAgICAgIyBnb29kIHRvIGdvLgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSB0aGUgbG9jayBjcmVhdGlvbiBmYWlsZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZS50aW1lKCkgPiBlbmRfdGltZToKICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYudW5pcXVlX25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgPiAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja1RpbWVvdXQoIlRpbWVvdXQgd2FpdGluZyB0byBhY3F1aXJlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2NrIGZvciAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUxvY2tlZCgiJXMgaXMgYWxyZWFkeSBsb2NrZWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAodGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCAvIDEwIG9yIDAuMSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTGluayBjcmVhdGlvbiBzdWNjZWVkZWQuICBXZSdyZSBnb29kIHRvIGdvLgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuaXNfbG9ja2VkKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdExvY2tlZCgiJXMgaXMgbm90IGxvY2tlZCIgJSBzZWxmLnBhdGgpCiAgICAgICAgZWxpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi51bmlxdWVfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIE5vdE15TG9jaygiJXMgaXMgbG9ja2VkLCBidXQgbm90IGJ5IG1lIiAlIHNlbGYucGF0aCkKICAgICAgICBvcy51bmxpbmsoc2VsZi51bmlxdWVfbmFtZSkKICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICByZXR1cm4gKHNlbGYuaXNfbG9ja2VkKCkgYW5kCiAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKSBhbmQKICAgICAgICAgICAgICAgIG9zLnN0YXQoc2VsZi51bmlxdWVfbmFtZSkuc3RfbmxpbmsgPT0gMikKCiAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvY2tfZmlsZSk6CiAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmxvY2tfZmlsZSkKUEsDBBQAAAAAAAAAIQAhJrx+GAwAABgMAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9ta2RpcmxvY2tmaWxlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uCgppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgZXJybm8KCmZyb20gLiBpbXBvcnQgKExvY2tCYXNlLCBMb2NrRmFpbGVkLCBOb3RMb2NrZWQsIE5vdE15TG9jaywgTG9ja1RpbWVvdXQsCiAgICAgICAgICAgICAgIEFscmVhZHlMb2NrZWQpCgoKY2xhc3MgTWtkaXJMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiIiJMb2NrIGZpbGUgYnkgY3JlYXRpbmcgYSBkaXJlY3RvcnkuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9VHJ1ZSwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICA+Pj4gbG9jayA9IE1rZGlyTG9ja0ZpbGUoJ3NvbWVmaWxlJykKICAgICAgICA+Pj4gbG9jayA9IE1rZGlyTG9ja0ZpbGUoJ3NvbWVmaWxlJywgdGhyZWFkZWQ9RmFsc2UpCiAgICAgICAgIiIiCiAgICAgICAgTG9ja0Jhc2UuX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQsIHRpbWVvdXQpCiAgICAgICAgIyBMb2NrIGZpbGUgaXRzZWxmIGlzIGEgZGlyZWN0b3J5LiAgUGxhY2UgdGhlIHVuaXF1ZSBmaWxlIG5hbWUgaW50bwogICAgICAgICMgaXQuCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmxvY2tfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy4lcyVzIiAlIChzZWxmLmhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWQpKQoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIHNlbGYudGltZW91dAogICAgICAgIGVuZF90aW1lID0gdGltZS50aW1lKCkKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgZW5kX3RpbWUgKz0gdGltZW91dAoKICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CiAgICAgICAgICAgIHdhaXQgPSAwLjEKICAgICAgICBlbHNlOgogICAgICAgICAgICB3YWl0ID0gbWF4KDAsIHRpbWVvdXQgLyAxMCkKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgZXJyID0gc3lzLmV4Y19pbmZvKClbMV0KICAgICAgICAgICAgICAgIGlmIGVyci5lcnJubyA9PSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgICAgICAgICAgIyBBbHJlYWR5IGxvY2tlZC4KICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBBbHJlYWR5IGxvY2tlZCBieSBtZS4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZS50aW1lKCkgPiBlbmRfdGltZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvY2sgZm9yICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWVvbmUgZWxzZSBoYXMgdGhlIGxvY2suCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCh3YWl0KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIENvdWxkbid0IGNyZWF0ZSB0aGUgbG9jayBmb3Igc29tZSBvdGhlciByZWFzb24KICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrRmFpbGVkKCJmYWlsZWQgdG8gY3JlYXRlICVzIiAlIHNlbGYubG9ja19maWxlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3BlbihzZWxmLnVuaXF1ZV9uYW1lLCAid2IiKS5jbG9zZSgpCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgcmFpc2UgTm90TG9ja2VkKCIlcyBpcyBub3QgbG9ja2VkIiAlIHNlbGYucGF0aCkKICAgICAgICBlbGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUiICUgc2VsZi5wYXRoKQogICAgICAgIG9zLnVubGluayhzZWxmLnVuaXF1ZV9uYW1lKQogICAgICAgIG9zLnJtZGlyKHNlbGYubG9ja19maWxlKQoKICAgIGRlZiBpc19sb2NrZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHNlbGYubG9ja19maWxlKQoKICAgIGRlZiBpX2FtX2xvY2tpbmcoc2VsZik6CiAgICAgICAgcmV0dXJuIChzZWxmLmlzX2xvY2tlZCgpIGFuZAogICAgICAgICAgICAgICAgb3MucGF0aC5leGlzdHMoc2VsZi51bmlxdWVfbmFtZSkpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5sb2NrX2ZpbGUpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKHNlbGYubG9ja19maWxlKToKICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oc2VsZi5sb2NrX2ZpbGUsIG5hbWUpKQogICAgICAgICAgICBvcy5ybWRpcihzZWxmLmxvY2tfZmlsZSkKUEsDBBQAAAAAAAAAIQAgPHItyhcAAMoXAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9waWRsb2NrZmlsZS5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgojIHBpZGxvY2tmaWxlLnB5CiMKIyBDb3B5cmlnaHQgwqkgMjAwOOKAkzIwMDkgQmVuIEZpbm5leSA8YmVuK3B5dGhvbkBiZW5maW5uZXkuaWQuYXU+CiMKIyBUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBtYXkgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHdvcmsKIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2UsIHZlcnNpb24gMiBvcgojIGxhdGVyIGFzIHB1Ymxpc2hlZCBieSB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgTm8gd2FycmFudHkgZXhwcmVzc2VkIG9yIGltcGxpZWQuIFNlZSB0aGUgZmlsZSBMSUNFTlNFLlBTRi0yIGZvciBkZXRhaWxzLgoKIiIiIExvY2tmaWxlIGJlaGF2aW91ciBpbXBsZW1lbnRlZCB2aWEgVW5peCBQSUQgZmlsZXMuCiAgICAiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZXJybm8KaW1wb3J0IG9zCmltcG9ydCB0aW1lCgpmcm9tIC4gaW1wb3J0IChMb2NrQmFzZSwgQWxyZWFkeUxvY2tlZCwgTG9ja0ZhaWxlZCwgTm90TG9ja2VkLCBOb3RNeUxvY2ssCiAgICAgICAgICAgICAgIExvY2tUaW1lb3V0KQoKDApjbGFzcyBQSURMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiIiIgTG9ja2ZpbGUgaW1wbGVtZW50ZWQgYXMgYSBVbml4IFBJRCBmaWxlLgoKICAgIFRoZSBsb2NrIGZpbGUgaXMgYSBub3JtYWwgZmlsZSBuYW1lZCBieSB0aGUgYXR0cmlidXRlIGBwYXRoYC4KICAgIEEgbG9jaydzIFBJRCBmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIGxpbmUgb2YgdGV4dCwgY29udGFpbmluZwogICAgdGhlIHByb2Nlc3MgSUQgKFBJRCkgb2YgdGhlIHByb2Nlc3MgdGhhdCBhY3F1aXJlZCB0aGUgbG9jay4KCiAgICA+Pj4gbG9jayA9IFBJRExvY2tGaWxlKCdzb21lZmlsZScpCiAgICA+Pj4gbG9jayA9IFBJRExvY2tGaWxlKCdzb21lZmlsZScpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9RmFsc2UsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIyBwaWQgbG9ja2ZpbGVzIGRvbid0IHN1cHBvcnQgdGhyZWFkZWQgb3BlcmF0aW9uLCBzbyBhbHdheXMgZm9yY2UKICAgICAgICAjIEZhbHNlIGFzIHRoZSB0aHJlYWRlZCBhcmcuCiAgICAgICAgTG9ja0Jhc2UuX19pbml0X18oc2VsZiwgcGF0aCwgRmFsc2UsIHRpbWVvdXQpCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IHNlbGYucGF0aAoKICAgIGRlZiByZWFkX3BpZChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSBQSUQgZnJvbSB0aGUgbG9jayBmaWxlLgogICAgICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcmVhZF9waWRfZnJvbV9waWRmaWxlKHNlbGYucGF0aCkKCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgICIiIiBUZXN0IGlmIHRoZSBsb2NrIGlzIGN1cnJlbnRseSBoZWxkLgoKICAgICAgICAgICAgVGhlIGxvY2sgaXMgaGVsZCBpZiB0aGUgUElEIGZpbGUgZm9yIHRoaXMgbG9jayBleGlzdHMuCgogICAgICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMoc2VsZi5wYXRoKQoKICAgIGRlZiBpX2FtX2xvY2tpbmcoc2VsZik6CiAgICAgICAgIiIiIFRlc3QgaWYgdGhlIGxvY2sgaXMgaGVsZCBieSB0aGUgY3VycmVudCBwcm9jZXNzLgoKICAgICAgICBSZXR1cm5zIGBgVHJ1ZWBgIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgSUQgbWF0Y2hlcyB0aGUKICAgICAgICBudW1iZXIgc3RvcmVkIGluIHRoZSBQSUQgZmlsZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5pc19sb2NrZWQoKSBhbmQgb3MuZ2V0cGlkKCkgPT0gc2VsZi5yZWFkX3BpZCgpCgogICAgZGVmIGFjcXVpcmUoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIgQWNxdWlyZSB0aGUgbG9jay4KCiAgICAgICAgQ3JlYXRlcyB0aGUgUElEIGZpbGUgZm9yIHRoaXMgbG9jaywgb3IgcmFpc2VzIGFuIGVycm9yIGlmCiAgICAgICAgdGhlIGxvY2sgY291bGQgbm90IGJlIGFjcXVpcmVkLgogICAgICAgICIiIgoKICAgICAgICB0aW1lb3V0ID0gdGltZW91dCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2Ugc2VsZi50aW1lb3V0CiAgICAgICAgZW5kX3RpbWUgPSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICBlbmRfdGltZSArPSB0aW1lb3V0CgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdyaXRlX3BpZF90b19waWRmaWxlKHNlbGYucGF0aCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgaWYgZXhjLmVycm5vID09IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgICAgICAgICAjIFRoZSBsb2NrIGNyZWF0aW9uIGZhaWxlZC4gIE1heWJlIHNsZWVwIGEgYml0LgogICAgICAgICAgICAgICAgICAgIGlmIHRpbWUudGltZSgpID4gZW5kX3RpbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja1RpbWVvdXQoIlRpbWVvdXQgd2FpdGluZyB0byBhY3F1aXJlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2NrIGZvciAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUxvY2tlZCgiJXMgaXMgYWxyZWFkeSBsb2NrZWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAodGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCAvIDEwIG9yIDAuMSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja0ZhaWxlZCgiZmFpbGVkIHRvIGNyZWF0ZSAlcyIgJSBzZWxmLnBhdGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICAiIiIgUmVsZWFzZSB0aGUgbG9jay4KCiAgICAgICAgICAgIFJlbW92ZXMgdGhlIFBJRCBmaWxlIHRvIHJlbGVhc2UgdGhlIGxvY2ssIG9yIHJhaXNlcyBhbgogICAgICAgICAgICBlcnJvciBpZiB0aGUgY3VycmVudCBwcm9jZXNzIGRvZXMgbm90IGhvbGQgdGhlIGxvY2suCgogICAgICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgcmFpc2UgTm90TG9ja2VkKCIlcyBpcyBub3QgbG9ja2VkIiAlIHNlbGYucGF0aCkKICAgICAgICBpZiBub3Qgc2VsZi5pX2FtX2xvY2tpbmcoKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUiICUgc2VsZi5wYXRoKQogICAgICAgIHJlbW92ZV9leGlzdGluZ19waWRmaWxlKHNlbGYucGF0aCkKCiAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAgICAgICAiIiIgQnJlYWsgYW4gZXhpc3RpbmcgbG9jay4KCiAgICAgICAgICAgIFJlbW92ZXMgdGhlIFBJRCBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLCBvdGhlcndpc2UgZG9lcwogICAgICAgICAgICBub3RoaW5nLgoKICAgICAgICAgICAgIiIiCiAgICAgICAgcmVtb3ZlX2V4aXN0aW5nX3BpZGZpbGUoc2VsZi5wYXRoKQoKCmRlZiByZWFkX3BpZF9mcm9tX3BpZGZpbGUocGlkZmlsZV9wYXRoKToKICAgICIiIiBSZWFkIHRoZSBQSUQgcmVjb3JkZWQgaW4gdGhlIG5hbWVkIFBJRCBmaWxlLgoKICAgICAgICBSZWFkIGFuZCByZXR1cm4gdGhlIG51bWVyaWMgUElEIHJlY29yZGVkIGFzIHRleHQgaW4gdGhlIG5hbWVkCiAgICAgICAgUElEIGZpbGUuIElmIHRoZSBQSUQgZmlsZSBjYW5ub3QgYmUgcmVhZCwgb3IgaWYgdGhlIGNvbnRlbnQgaXMKICAgICAgICBub3QgYSB2YWxpZCBQSUQsIHJldHVybiBgYE5vbmVgYC4KCiAgICAgICAgIiIiCiAgICBwaWQgPSBOb25lCiAgICB0cnk6CiAgICAgICAgcGlkZmlsZSA9IG9wZW4ocGlkZmlsZV9wYXRoLCAncicpCiAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgICMgQWNjb3JkaW5nIHRvIHRoZSBGSFMgMi4zIHNlY3Rpb24gb24gUElEIGZpbGVzIGluIC92YXIvcnVuOgogICAgICAgICMKICAgICAgICAjICAgVGhlIGZpbGUgbXVzdCBjb25zaXN0IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZXIgaW4KICAgICAgICAjICAgQVNDSUktZW5jb2RlZCBkZWNpbWFsLCBmb2xsb3dlZCBieSBhIG5ld2xpbmUgY2hhcmFjdGVyLgogICAgICAgICMKICAgICAgICAjICAgUHJvZ3JhbXMgdGhhdCByZWFkIFBJRCBmaWxlcyBzaG91bGQgYmUgc29tZXdoYXQgZmxleGlibGUKICAgICAgICAjICAgaW4gd2hhdCB0aGV5IGFjY2VwdDsgaS5lLiwgdGhleSBzaG91bGQgaWdub3JlIGV4dHJhCiAgICAgICAgIyAgIHdoaXRlc3BhY2UsIGxlYWRpbmcgemVyb2VzLCBhYnNlbmNlIG9mIHRoZSB0cmFpbGluZwogICAgICAgICMgICBuZXdsaW5lLCBvciBhZGRpdGlvbmFsIGxpbmVzIGluIHRoZSBQSUQgZmlsZS4KCiAgICAgICAgbGluZSA9IHBpZGZpbGUucmVhZGxpbmUoKS5zdHJpcCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwaWQgPSBpbnQobGluZSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHBpZGZpbGUuY2xvc2UoKQoKICAgIHJldHVybiBwaWQKCgpkZWYgd3JpdGVfcGlkX3RvX3BpZGZpbGUocGlkZmlsZV9wYXRoKToKICAgICIiIiBXcml0ZSB0aGUgUElEIGluIHRoZSBuYW1lZCBQSUQgZmlsZS4KCiAgICAgICAgR2V0IHRoZSBudW1lcmljIHByb2Nlc3MgSUQgKOKAnFBJROKAnSkgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcwogICAgICAgIGFuZCB3cml0ZSBpdCB0byB0aGUgbmFtZWQgZmlsZSBhcyBhIGxpbmUgb2YgdGV4dC4KCiAgICAgICAgIiIiCiAgICBvcGVuX2ZsYWdzID0gKG9zLk9fQ1JFQVQgfCBvcy5PX0VYQ0wgfCBvcy5PX1dST05MWSkKICAgIG9wZW5fbW9kZSA9IDBvNjQ0CiAgICBwaWRmaWxlX2ZkID0gb3Mub3BlbihwaWRmaWxlX3BhdGgsIG9wZW5fZmxhZ3MsIG9wZW5fbW9kZSkKICAgIHBpZGZpbGUgPSBvcy5mZG9wZW4ocGlkZmlsZV9mZCwgJ3cnKQoKICAgICMgQWNjb3JkaW5nIHRvIHRoZSBGSFMgMi4zIHNlY3Rpb24gb24gUElEIGZpbGVzIGluIC92YXIvcnVuOgogICAgIwogICAgIyAgIFRoZSBmaWxlIG11c3QgY29uc2lzdCBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVyIGluCiAgICAjICAgQVNDSUktZW5jb2RlZCBkZWNpbWFsLCBmb2xsb3dlZCBieSBhIG5ld2xpbmUgY2hhcmFjdGVyLiBGb3IKICAgICMgICBleGFtcGxlLCBpZiBjcm9uZCB3YXMgcHJvY2VzcyBudW1iZXIgMjUsIC92YXIvcnVuL2Nyb25kLnBpZAogICAgIyAgIHdvdWxkIGNvbnRhaW4gdGhyZWUgY2hhcmFjdGVyczogdHdvLCBmaXZlLCBhbmQgbmV3bGluZS4KCiAgICBwaWQgPSBvcy5nZXRwaWQoKQogICAgcGlkZmlsZS53cml0ZSgiJXNcbiIgJSBwaWQpCiAgICBwaWRmaWxlLmNsb3NlKCkKCgpkZWYgcmVtb3ZlX2V4aXN0aW5nX3BpZGZpbGUocGlkZmlsZV9wYXRoKToKICAgICIiIiBSZW1vdmUgdGhlIG5hbWVkIFBJRCBmaWxlIGlmIGl0IGV4aXN0cy4KCiAgICAgICAgUmVtb3ZpbmcgYSBQSUQgZmlsZSB0aGF0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBwdXRzIHVzIGluIHRoZQogICAgICAgIGRlc2lyZWQgc3RhdGUsIHNvIHdlIGlnbm9yZSB0aGUgY29uZGl0aW9uIGlmIHRoZSBmaWxlIGRvZXMgbm90CiAgICAgICAgZXhpc3QuCgogICAgICAgICIiIgogICAgdHJ5OgogICAgICAgIG9zLnJlbW92ZShwaWRmaWxlX3BhdGgpCiAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgaWYgZXhjLmVycm5vID09IGVycm5vLkVOT0VOVDoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlClBLAwQUAAAAAAAAACEAu4XwvYIVAACCFQAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3FsaXRlbG9ja2ZpbGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24KCmltcG9ydCB0aW1lCmltcG9ydCBvcwoKdHJ5OgogICAgdW5pY29kZQpleGNlcHQgTmFtZUVycm9yOgogICAgdW5pY29kZSA9IHN0cgoKZnJvbSAuIGltcG9ydCBMb2NrQmFzZSwgTm90TG9ja2VkLCBOb3RNeUxvY2ssIExvY2tUaW1lb3V0LCBBbHJlYWR5TG9ja2VkCgoKY2xhc3MgU1FMaXRlTG9ja0ZpbGUoTG9ja0Jhc2UpOgogICAgIkRlbW9uc3RyYXRlIFNRTC1iYXNlZCBsb2NraW5nLiIKCiAgICB0ZXN0ZGIgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkPVRydWUsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgPj4+IGxvY2sgPSBTUUxpdGVMb2NrRmlsZSgnc29tZWZpbGUnKQogICAgICAgID4+PiBsb2NrID0gU1FMaXRlTG9ja0ZpbGUoJ3NvbWVmaWxlJywgdGhyZWFkZWQ9RmFsc2UpCiAgICAgICAgIiIiCiAgICAgICAgTG9ja0Jhc2UuX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQsIHRpbWVvdXQpCiAgICAgICAgc2VsZi5sb2NrX2ZpbGUgPSB1bmljb2RlKHNlbGYubG9ja19maWxlKQogICAgICAgIHNlbGYudW5pcXVlX25hbWUgPSB1bmljb2RlKHNlbGYudW5pcXVlX25hbWUpCgogICAgICAgIGlmIFNRTGl0ZUxvY2tGaWxlLnRlc3RkYiBpcyBOb25lOgogICAgICAgICAgICBpbXBvcnQgdGVtcGZpbGUKICAgICAgICAgICAgX2ZkLCB0ZXN0ZGIgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICAgICAgb3MuY2xvc2UoX2ZkKQogICAgICAgICAgICBvcy51bmxpbmsodGVzdGRiKQogICAgICAgICAgICBkZWwgX2ZkLCB0ZW1wZmlsZQogICAgICAgICAgICBTUUxpdGVMb2NrRmlsZS50ZXN0ZGIgPSB0ZXN0ZGIKCiAgICAgICAgaW1wb3J0IHNxbGl0ZTMKICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBzcWxpdGUzLmNvbm5lY3QoU1FMaXRlTG9ja0ZpbGUudGVzdGRiKQoKICAgICAgICBjID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICIoIgogICAgICAgICAgICAgICAgICAgICAgIiAgIGxvY2tfZmlsZSB2YXJjaGFyKDMyKSwiCiAgICAgICAgICAgICAgICAgICAgICAiICAgdW5pcXVlX25hbWUgdmFyY2hhcigzMikiCiAgICAgICAgICAgICAgICAgICAgICAiKSIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZTMuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5jb21taXQoKQogICAgICAgICAgICBpbXBvcnQgYXRleGl0CiAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3Rlcihvcy51bmxpbmssIFNRTGl0ZUxvY2tGaWxlLnRlc3RkYikKCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBzZWxmLnRpbWVvdXQKICAgICAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgIGVuZF90aW1lICs9IHRpbWVvdXQKCiAgICAgICAgaWYgdGltZW91dCBpcyBOb25lOgogICAgICAgICAgICB3YWl0ID0gMC4xCiAgICAgICAgZWxpZiB0aW1lb3V0IDw9IDA6CiAgICAgICAgICAgIHdhaXQgPSAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgd2FpdCA9IHRpbWVvdXQgLyAxMAoKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfbG9ja2VkKCk6CiAgICAgICAgICAgICAgICAjIE5vdCBsb2NrZWQuICBUcnkgdG8gbG9jayBpdC4KICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJpbnNlcnQgaW50byBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIChsb2NrX2ZpbGUsIHVuaXF1ZV9uYW1lKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZhbHVlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICg/LCA/KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsIHNlbGYudW5pcXVlX25hbWUpKQogICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpCgogICAgICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHRoZSBvbmx5IGxvY2sgaG9sZGVyLgogICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSB1bmlxdWVfbmFtZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsKSkKICAgICAgICAgICAgICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQogICAgICAgICAgICAgICAgaWYgbGVuKHJvd3MpID4gMToKICAgICAgICAgICAgICAgICAgICAjIE5vcGUuICBTb21lb25lIGVsc2UgZ290IHRoZXJlLiAgUmVtb3ZlIG91ciBsb2NrLgogICAgICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJkZWxldGUgZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSB1bmlxdWVfbmFtZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnVuaXF1ZV9uYW1lLCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgWXVwLiAgV2UncmUgZG9uZSwgc28gZ28gaG9tZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB0aGUgb25seSBsb2NrIGhvbGRlci4KICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgdW5pcXVlX25hbWUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnVuaXF1ZV9uYW1lLCkpCiAgICAgICAgICAgICAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKICAgICAgICAgICAgICAgIGlmIGxlbihyb3dzKSA9PSAxOgogICAgICAgICAgICAgICAgICAgICMgV2UncmUgdGhlIGxvY2tlciwgc28gZ28gaG9tZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICMgTWF5YmUgd2Ugc2hvdWxkIHdhaXQgYSBiaXQgbG9uZ2VyLgogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lLnRpbWUoKSA+IGVuZF90aW1lOgogICAgICAgICAgICAgICAgaWYgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgIyBObyBtb3JlIHdhaXRpbmcuCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja1RpbWVvdXQoIlRpbWVvdXQgd2FpdGluZyB0byBhY3F1aXJlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbG9jayBmb3IgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgU29tZW9uZSBlbHNlIGhhcyB0aGUgbG9jayBhbmQgd2UgYXJlIGltcGF0aWVudC4uCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUxvY2tlZCgiJXMgaXMgYWxyZWFkeSBsb2NrZWQiICUgc2VsZi5wYXRoKQoKICAgICAgICAgICAgIyBXZWxsLCBva2F5LiAgV2UnbGwgZ2l2ZSBpdCBhIGJpdCBsb25nZXIuCiAgICAgICAgICAgIHRpbWUuc2xlZXAod2FpdCkKCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgcmFpc2UgTm90TG9ja2VkKCIlcyBpcyBub3QgbG9ja2VkIiAlIHNlbGYucGF0aCkKICAgICAgICBpZiBub3Qgc2VsZi5pX2FtX2xvY2tpbmcoKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUgKGJ5ICVzKSIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsIHNlbGYuX3dob19pc19sb2NraW5nKCkpKQogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJkZWxldGUgZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSB1bmlxdWVfbmFtZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnVuaXF1ZV9uYW1lLCkpCiAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpCgogICAgZGVmIF93aG9faXNfbG9ja2luZyhzZWxmKToKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IHVuaXF1ZV9uYW1lIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgbG9ja19maWxlID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYubG9ja19maWxlLCkpCiAgICAgICAgcmV0dXJuIGN1cnNvci5mZXRjaG9uZSgpWzBdCgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSBsb2NrX2ZpbGUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsKSkKICAgICAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKICAgICAgICByZXR1cm4gbm90IG5vdCByb3dzCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSBsb2NrX2ZpbGUgPSA/IgogICAgICAgICAgICAgICAgICAgICAgICIgICAgYW5kIHVuaXF1ZV9uYW1lID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYubG9ja19maWxlLCBzZWxmLnVuaXF1ZV9uYW1lKSkKICAgICAgICByZXR1cm4gbm90IG5vdCBjdXJzb3IuZmV0Y2hhbGwoKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJkZWxldGUgZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSBsb2NrX2ZpbGUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsKSkKICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKUEsDBBQAAAAAAAAAIQCRIwnZOAoAADgKAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9zeW1saW5rbG9ja2ZpbGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgpmcm9tIC4gaW1wb3J0IChMb2NrQmFzZSwgTm90TG9ja2VkLCBOb3RNeUxvY2ssIExvY2tUaW1lb3V0LAogICAgICAgICAgICAgICBBbHJlYWR5TG9ja2VkKQoKCmNsYXNzIFN5bWxpbmtMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiIiJMb2NrIGFjY2VzcyB0byBhIGZpbGUgdXNpbmcgc3ltbGluaygyKS4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9VHJ1ZSwgdGltZW91dD1Ob25lKToKICAgICAgICAjIHN1cGVyKFN5bWxpbmtMb2NrRmlsZSkuX19pbml0KC4uLikKICAgICAgICBMb2NrQmFzZS5fX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZCwgdGltZW91dCkKICAgICAgICAjIHNwbGl0IGl0IGJhY2shCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi51bmlxdWVfbmFtZSlbMV0KCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICMgSG9wZWZ1bGx5IHVubmVjZXNzYXJ5IGZvciBzeW1saW5rLgogICAgICAgICMgdHJ5OgogICAgICAgICMgICAgIG9wZW4oc2VsZi51bmlxdWVfbmFtZSwgIndiIikuY2xvc2UoKQogICAgICAgICMgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgIyAgICAgcmFpc2UgTG9ja0ZhaWxlZCgiZmFpbGVkIHRvIGNyZWF0ZSAlcyIgJSBzZWxmLnVuaXF1ZV9uYW1lKQogICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBzZWxmLnRpbWVvdXQKICAgICAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgIGVuZF90aW1lICs9IHRpbWVvdXQKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBUcnkgYW5kIGNyZWF0ZSBhIHN5bWJvbGljIGxpbmsgdG8gaXQuCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsoc2VsZi51bmlxdWVfbmFtZSwgc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgIyBMaW5rIGNyZWF0aW9uIGZhaWxlZC4gIE1heWJlIHdlJ3ZlIGRvdWJsZS1sb2NrZWQ/CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlfYW1fbG9ja2luZygpOgogICAgICAgICAgICAgICAgICAgICMgTGlua2VkIHRvIG91dCB1bmlxdWUgbmFtZS4gUHJvY2VlZC4KICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBPdGhlcndpc2UgdGhlIGxvY2sgY3JlYXRpb24gZmFpbGVkLgogICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWUudGltZSgpID4gZW5kX3RpbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgPiAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja1RpbWVvdXQoIlRpbWVvdXQgd2FpdGluZyB0byBhY3F1aXJlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2NrIGZvciAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUxvY2tlZCgiJXMgaXMgYWxyZWFkeSBsb2NrZWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAodGltZW91dCAvIDEwIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSAwLjEpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIExpbmsgY3JlYXRpb24gc3VjY2VlZGVkLiAgV2UncmUgZ29vZCB0byBnby4KICAgICAgICAgICAgICAgIHJldHVybgoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICByYWlzZSBOb3RMb2NrZWQoIiVzIGlzIG5vdCBsb2NrZWQiICUgc2VsZi5wYXRoKQogICAgICAgIGVsaWYgbm90IHNlbGYuaV9hbV9sb2NraW5nKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdE15TG9jaygiJXMgaXMgbG9ja2VkLCBidXQgbm90IGJ5IG1lIiAlIHNlbGYucGF0aCkKICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2xpbmsoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICByZXR1cm4gKG9zLnBhdGguaXNsaW5rKHNlbGYubG9ja19maWxlKQogICAgICAgICAgICAgICAgYW5kIG9zLnJlYWRsaW5rKHNlbGYubG9ja19maWxlKSA9PSBzZWxmLnVuaXF1ZV9uYW1lKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHNlbGYubG9ja19maWxlKTogICMgZXhpc3RzICYmIGxpbmsKICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubG9ja19maWxlKQpQSwMEFAAAAAAAAAAhANZSGSP+DwAA/g8AADcAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL29yZGVyZWRkaWN0LnB5IyBDb3B5cmlnaHQgKGMpIDIwMDkgUmF5bW9uZCBIZXR0aW5nZXIKIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCiMgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKIyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAojIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCiMgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKIyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAojIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiMgICAgIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAojICAgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKIyAgICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKIyAgICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKIyAgICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCiMgICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwojICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCiMgICAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCmZyb20gVXNlckRpY3QgaW1wb3J0IERpY3RNaXhpbgoKY2xhc3MgT3JkZXJlZERpY3QoZGljdCwgRGljdE1peGluKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CiAgICAgICAgaWYgbGVuKGFyZ3MpID4gMToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgJWQnICUgbGVuKGFyZ3MpKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fX2VuZAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5jbGVhcigpCiAgICAgICAgc2VsZi51cGRhdGUoKmFyZ3MsICoqa3dkcykKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgc2VsZi5fX2VuZCA9IGVuZCA9IFtdCiAgICAgICAgZW5kICs9IFtOb25lLCBlbmQsIGVuZF0gICAgICAgICAjIHNlbnRpbmVsIG5vZGUgZm9yIGRvdWJseSBsaW5rZWQgbGlzdAogICAgICAgIHNlbGYuX19tYXAgPSB7fSAgICAgICAgICAgICAgICAgIyBrZXkgLS0+IFtrZXksIHByZXYsIG5leHRdCiAgICAgICAgZGljdC5jbGVhcihzZWxmKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CiAgICAgICAgICAgIGVuZCA9IHNlbGYuX19lbmQKICAgICAgICAgICAgY3VyciA9IGVuZFsxXQogICAgICAgICAgICBjdXJyWzJdID0gZW5kWzFdID0gc2VsZi5fX21hcFtrZXldID0gW2tleSwgY3VyciwgZW5kXQogICAgICAgIGRpY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICBkaWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSkKICAgICAgICBrZXksIHByZXYsIG5leHQgPSBzZWxmLl9fbWFwLnBvcChrZXkpCiAgICAgICAgcHJldlsyXSA9IG5leHQKICAgICAgICBuZXh0WzFdID0gcHJldgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBlbmQgPSBzZWxmLl9fZW5kCiAgICAgICAgY3VyciA9IGVuZFsyXQogICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IGVuZDoKICAgICAgICAgICAgeWllbGQgY3VyclswXQogICAgICAgICAgICBjdXJyID0gY3VyclsyXQoKICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CiAgICAgICAgZW5kID0gc2VsZi5fX2VuZAogICAgICAgIGN1cnIgPSBlbmRbMV0KICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCBlbmQ6CiAgICAgICAgICAgIHlpZWxkIGN1cnJbMF0KICAgICAgICAgICAgY3VyciA9IGN1cnJbMV0KCiAgICBkZWYgcG9waXRlbShzZWxmLCBsYXN0PVRydWUpOgogICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcignZGljdGlvbmFyeSBpcyBlbXB0eScpCiAgICAgICAgaWYgbGFzdDoKICAgICAgICAgICAga2V5ID0gcmV2ZXJzZWQoc2VsZikubmV4dCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAga2V5ID0gaXRlcihzZWxmKS5uZXh0KCkKICAgICAgICB2YWx1ZSA9IHNlbGYucG9wKGtleSkKICAgICAgICByZXR1cm4ga2V5LCB2YWx1ZQoKICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgIGl0ZW1zID0gW1trLCBzZWxmW2tdXSBmb3IgayBpbiBzZWxmXQogICAgICAgIHRtcCA9IHNlbGYuX19tYXAsIHNlbGYuX19lbmQKICAgICAgICBkZWwgc2VsZi5fX21hcCwgc2VsZi5fX2VuZAogICAgICAgIGluc3RfZGljdCA9IHZhcnMoc2VsZikuY29weSgpCiAgICAgICAgc2VsZi5fX21hcCwgc2VsZi5fX2VuZCA9IHRtcAogICAgICAgIGlmIGluc3RfZGljdDoKICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCksIGluc3RfZGljdCkKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChpdGVtcywpCgogICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKCiAgICBzZXRkZWZhdWx0ID0gRGljdE1peGluLnNldGRlZmF1bHQKICAgIHVwZGF0ZSA9IERpY3RNaXhpbi51cGRhdGUKICAgIHBvcCA9IERpY3RNaXhpbi5wb3AKICAgIHZhbHVlcyA9IERpY3RNaXhpbi52YWx1ZXMKICAgIGl0ZW1zID0gRGljdE1peGluLml0ZW1zCiAgICBpdGVya2V5cyA9IERpY3RNaXhpbi5pdGVya2V5cwogICAgaXRlcnZhbHVlcyA9IERpY3RNaXhpbi5pdGVydmFsdWVzCiAgICBpdGVyaXRlbXMgPSBEaWN0TWl4aW4uaXRlcml0ZW1zCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICByZXR1cm4gJyVzKCknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCkKICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaXRlbXMoKSkKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKToKICAgICAgICBkID0gY2xzKCkKICAgICAgICBmb3Iga2V5IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQogICAgICAgIHJldHVybiBkCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgT3JkZXJlZERpY3QpOgogICAgICAgICAgICBpZiBsZW4oc2VsZikgIT0gbGVuKG90aGVyKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBmb3IgcCwgcSBpbiAgemlwKHNlbGYuaXRlbXMoKSwgb3RoZXIuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICBpZiBwICE9IHE6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIGRpY3QuX19lcV9fKHNlbGYsIG90aGVyKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgpQSwMEFAAAAAAAAAAhADwpWMbQAgAA0AIAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsICJfX3N1bW1hcnlfXyIsICJfX3VyaV9fIiwgIl9fdmVyc2lvbl9fIiwgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsICJfX2xpY2Vuc2VfXyIsICJfX2NvcHlyaWdodF9fIiwKXQoKX190aXRsZV9fID0gInBhY2thZ2luZyIKX19zdW1tYXJ5X18gPSAiQ29yZSB1dGlsaXRpZXMgZm9yIFB5dGhvbiBwYWNrYWdlcyIKX191cmlfXyA9ICJodHRwczovL2dpdGh1Yi5jb20vcHlwYS9wYWNrYWdpbmciCgpfX3ZlcnNpb25fXyA9ICIxNi44IgoKX19hdXRob3JfXyA9ICJEb25hbGQgU3R1ZmZ0IGFuZCBpbmRpdmlkdWFsIGNvbnRyaWJ1dG9ycyIKX19lbWFpbF9fID0gImRvbmFsZEBzdHVmZnQuaW8iCgpfX2xpY2Vuc2VfXyA9ICJCU0Qgb3IgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgpfX2NvcHlyaWdodF9fID0gIkNvcHlyaWdodCAyMDE0LTIwMTYgJXMiICUgX19hdXRob3JfXwpQSwMEFAAAAAAAAAAhAIF2lsoBAgAAAQIAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmZyb20gLl9fYWJvdXRfXyBpbXBvcnQgKAogICAgX19hdXRob3JfXywgX19jb3B5cmlnaHRfXywgX19lbWFpbF9fLCBfX2xpY2Vuc2VfXywgX19zdW1tYXJ5X18sIF9fdGl0bGVfXywKICAgIF9fdXJpX18sIF9fdmVyc2lvbl9fCikKCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwgIl9fc3VtbWFyeV9fIiwgIl9fdXJpX18iLCAiX192ZXJzaW9uX18iLCAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwgIl9fbGljZW5zZV9fIiwgIl9fY29weXJpZ2h0X18iLApdClBLAwQUAAAAAAAAACEA5mlK41wDAABcAwAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3lzCgoKUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwoKIyBmbGFrZTg6IG5vcWEKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiIKICAgIENyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4KICAgICIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pClBLAwQUAAAAAAAAACEA+v2kEogFAACIBQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKCmNsYXNzIEluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBOZWdhdGl2ZUluZmluaXR5CgpJbmZpbml0eSA9IEluZmluaXR5KCkKCgpjbGFzcyBOZWdhdGl2ZUluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLUluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gSW5maW5pdHkKCk5lZ2F0aXZlSW5maW5pdHkgPSBOZWdhdGl2ZUluZmluaXR5KCkKUEsDBBQAAAAAAAAAIQB9LCtXJiAAACYgAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCAoCiAgICBQYXJzZUV4Y2VwdGlvbiwgUGFyc2VSZXN1bHRzLCBzdHJpbmdTdGFydCwgc3RyaW5nRW5kLAopCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBHcm91cCwgRm9yd2FyZCwgUXVvdGVkU3RyaW5nCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IFNwZWNpZmllciwgSW52YWxpZFNwZWNpZmllcgoKCl9fYWxsX18gPSBbCiAgICAiSW52YWxpZE1hcmtlciIsICJVbmRlZmluZWRDb21wYXJpc29uIiwgIlVuZGVmaW5lZEVudmlyb25tZW50TmFtZSIsCiAgICAiTWFya2VyIiwgImRlZmF1bHRfZW52aXJvbm1lbnQiLApdCgoKY2xhc3MgSW52YWxpZE1hcmtlcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBtYXJrZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZENvbXBhcmlzb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSB2YWx1ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZShWYWx1ZUVycm9yKToKICAgICIiIgogICAgQSBuYW1lIHdhcyBhdHRlbXB0ZWQgdG8gYmUgdXNlZCB0aGF0IGRvZXMgbm90IGV4aXN0IGluc2lkZSBvZiB0aGUKICAgIGVudmlyb25tZW50LgogICAgIiIiCgoKY2xhc3MgTm9kZShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmLnZhbHVlKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn0pPiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZikpCgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgoKY2xhc3MgVmFyaWFibGUoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgoKY2xhc3MgVmFsdWUoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gJyJ7MH0iJy5mb3JtYXQoc2VsZikKCgpjbGFzcyBPcChOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpWQVJJQUJMRSA9ICgKICAgIEwoImltcGxlbWVudGF0aW9uX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iKSB8CiAgICBMKCJpbXBsZW1lbnRhdGlvbl9uYW1lIikgfAogICAgTCgicHl0aG9uX2Z1bGxfdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3JlbGVhc2UiKSB8CiAgICBMKCJwbGF0Zm9ybV92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fbWFjaGluZSIpIHwKICAgIEwoInBsYXRmb3JtX3N5c3RlbSIpIHwKICAgIEwoInB5dGhvbl92ZXJzaW9uIikgfAogICAgTCgic3lzX3BsYXRmb3JtIikgfAogICAgTCgib3NfbmFtZSIpIHwKICAgIEwoIm9zLm5hbWUiKSB8ICAjIFBFUC0zNDUKICAgIEwoInN5cy5wbGF0Zm9ybSIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0udmVyc2lvbiIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0ubWFjaGluZSIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJweXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIHVuZG9jdW1lbnRlZCBzZXR1cHRvb2xzIGxlZ2FjeQogICAgTCgiZXh0cmEiKQopCkFMSUFTRVMgPSB7CiAgICAnb3MubmFtZSc6ICdvc19uYW1lJywKICAgICdzeXMucGxhdGZvcm0nOiAnc3lzX3BsYXRmb3JtJywKICAgICdwbGF0Zm9ybS52ZXJzaW9uJzogJ3BsYXRmb3JtX3ZlcnNpb24nLAogICAgJ3BsYXRmb3JtLm1hY2hpbmUnOiAncGxhdGZvcm1fbWFjaGluZScsCiAgICAncGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uJzogJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbicsCiAgICAncHl0aG9uX2ltcGxlbWVudGF0aW9uJzogJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbicKfQpWQVJJQUJMRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFyaWFibGUoQUxJQVNFUy5nZXQodFswXSwgdFswXSkpKQoKVkVSU0lPTl9DTVAgPSAoCiAgICBMKCI9PT0iKSB8CiAgICBMKCI9PSIpIHwKICAgIEwoIj49IikgfAogICAgTCgiPD0iKSB8CiAgICBMKCIhPSIpIHwKICAgIEwoIn49IikgfAogICAgTCgiPiIpIHwKICAgIEwoIjwiKQopCgpNQVJLRVJfT1AgPSBWRVJTSU9OX0NNUCB8IEwoIm5vdCBpbiIpIHwgTCgiaW4iKQpNQVJLRVJfT1Auc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IE9wKHRbMF0pKQoKTUFSS0VSX1ZBTFVFID0gUXVvdGVkU3RyaW5nKCInIikgfCBRdW90ZWRTdHJpbmcoJyInKQpNQVJLRVJfVkFMVUUuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IFZhbHVlKHRbMF0pKQoKQk9PTE9QID0gTCgiYW5kIikgfCBMKCJvciIpCgpNQVJLRVJfVkFSID0gVkFSSUFCTEUgfCBNQVJLRVJfVkFMVUUKCk1BUktFUl9JVEVNID0gR3JvdXAoTUFSS0VSX1ZBUiArIE1BUktFUl9PUCArIE1BUktFUl9WQVIpCk1BUktFUl9JVEVNLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0dXBsZSh0WzBdKSkKCkxQQVJFTiA9IEwoIigiKS5zdXBwcmVzcygpClJQQVJFTiA9IEwoIikiKS5zdXBwcmVzcygpCgpNQVJLRVJfRVhQUiA9IEZvcndhcmQoKQpNQVJLRVJfQVRPTSA9IE1BUktFUl9JVEVNIHwgR3JvdXAoTFBBUkVOICsgTUFSS0VSX0VYUFIgKyBSUEFSRU4pCk1BUktFUl9FWFBSIDw8IE1BUktFUl9BVE9NICsgWmVyb09yTW9yZShCT09MT1AgKyBNQVJLRVJfRVhQUikKCk1BUktFUiA9IHN0cmluZ1N0YXJ0ICsgTUFSS0VSX0VYUFIgKyBzdHJpbmdFbmQKCgpkZWYgX2NvZXJjZV9wYXJzZV9yZXN1bHQocmVzdWx0cyk6CiAgICBpZiBpc2luc3RhbmNlKHJlc3VsdHMsIFBhcnNlUmVzdWx0cyk6CiAgICAgICAgcmV0dXJuIFtfY29lcmNlX3BhcnNlX3Jlc3VsdChpKSBmb3IgaSBpbiByZXN1bHRzXQogICAgZWxzZToKICAgICAgICByZXR1cm4gcmVzdWx0cwoKCmRlZiBfZm9ybWF0X21hcmtlcihtYXJrZXIsIGZpcnN0PVRydWUpOgogICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgIyBTb21ldGltZXMgd2UgaGF2ZSBhIHN0cnVjdHVyZSBsaWtlIFtbLi4uXV0gd2hpY2ggaXMgYSBzaW5nbGUgaXRlbSBsaXN0CiAgICAjIHdoZXJlIHRoZSBzaW5nbGUgaXRlbSBpcyBpdHNlbGYgaXQncyBvd24gbGlzdC4gSW4gdGhhdCBjYXNlIHdlIHdhbnQgc2tpcAogICAgIyB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGV4dHJhbmVvdXMgKCkgb24gdGhlCiAgICAjIG91dHNpZGUuCiAgICBpZiAoaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpIGFuZCBsZW4obWFya2VyKSA9PSAxIGFuZAogICAgICAgICAgICBpc2luc3RhbmNlKG1hcmtlclswXSwgKGxpc3QsIHR1cGxlKSkpOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihtYXJrZXJbMF0pCgogICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgIGlubmVyID0gKF9mb3JtYXRfbWFya2VyKG0sIGZpcnN0PUZhbHNlKSBmb3IgbSBpbiBtYXJrZXIpCiAgICAgICAgaWYgZmlyc3Q6CiAgICAgICAgICAgIHJldHVybiAiICIuam9pbihpbm5lcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIigiICsgIiAiLmpvaW4oaW5uZXIpICsgIikiCiAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgcmV0dXJuICIgIi5qb2luKFttLnNlcmlhbGl6ZSgpIGZvciBtIGluIG1hcmtlcl0pCiAgICBlbHNlOgogICAgICAgIHJldHVybiBtYXJrZXIKCgpfb3BlcmF0b3JzID0gewogICAgImluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgaW4gcmhzLAogICAgIm5vdCBpbiI6IGxhbWJkYSBsaHMsIHJoczogbGhzIG5vdCBpbiByaHMsCiAgICAiPCI6IG9wZXJhdG9yLmx0LAogICAgIjw9Ijogb3BlcmF0b3IubGUsCiAgICAiPT0iOiBvcGVyYXRvci5lcSwKICAgICIhPSI6IG9wZXJhdG9yLm5lLAogICAgIj49Ijogb3BlcmF0b3IuZ2UsCiAgICAiPiI6IG9wZXJhdG9yLmd0LAp9CgoKZGVmIF9ldmFsX29wKGxocywgb3AsIHJocyk6CiAgICB0cnk6CiAgICAgICAgc3BlYyA9IFNwZWNpZmllcigiIi5qb2luKFtvcC5zZXJpYWxpemUoKSwgcmhzXSkpCiAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzcGVjLmNvbnRhaW5zKGxocykKCiAgICBvcGVyID0gX29wZXJhdG9ycy5nZXQob3Auc2VyaWFsaXplKCkpCiAgICBpZiBvcGVyIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkQ29tcGFyaXNvbigKICAgICAgICAgICAgIlVuZGVmaW5lZCB7MCFyfSBvbiB7MSFyfSBhbmQgezIhcn0uIi5mb3JtYXQob3AsIGxocywgcmhzKQogICAgICAgICkKCiAgICByZXR1cm4gb3BlcihsaHMsIHJocykKCgpfdW5kZWZpbmVkID0gb2JqZWN0KCkKCgpkZWYgX2dldF9lbnYoZW52aXJvbm1lbnQsIG5hbWUpOgogICAgdmFsdWUgPSBlbnZpcm9ubWVudC5nZXQobmFtZSwgX3VuZGVmaW5lZCkKCiAgICBpZiB2YWx1ZSBpcyBfdW5kZWZpbmVkOgogICAgICAgIHJhaXNlIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZSgKICAgICAgICAgICAgInswIXJ9IGRvZXMgbm90IGV4aXN0IGluIGV2YWx1YXRpb24gZW52aXJvbm1lbnQuIi5mb3JtYXQobmFtZSkKICAgICAgICApCgogICAgcmV0dXJuIHZhbHVlCgoKZGVmIF9ldmFsdWF0ZV9tYXJrZXJzKG1hcmtlcnMsIGVudmlyb25tZW50KToKICAgIGdyb3VwcyA9IFtbXV0KCiAgICBmb3IgbWFya2VyIGluIG1hcmtlcnM6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgICAgIGlmIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KToKICAgICAgICAgICAgZ3JvdXBzWy0xXS5hcHBlbmQoX2V2YWx1YXRlX21hcmtlcnMobWFya2VyLCBlbnZpcm9ubWVudCkpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1hcmtlciwgdHVwbGUpOgogICAgICAgICAgICBsaHMsIG9wLCByaHMgPSBtYXJrZXIKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobGhzLCBWYXJpYWJsZSk6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBfZ2V0X2VudihlbnZpcm9ubWVudCwgbGhzLnZhbHVlKQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gcmhzLnZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBsaHMudmFsdWUKICAgICAgICAgICAgICAgIHJoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCByaHMudmFsdWUpCgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbF9vcChsaHNfdmFsdWUsIG9wLCByaHNfdmFsdWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFzc2VydCBtYXJrZXIgaW4gWyJhbmQiLCAib3IiXQogICAgICAgICAgICBpZiBtYXJrZXIgPT0gIm9yIjoKICAgICAgICAgICAgICAgIGdyb3Vwcy5hcHBlbmQoW10pCgogICAgcmV0dXJuIGFueShhbGwoaXRlbSkgZm9yIGl0ZW0gaW4gZ3JvdXBzKQoKCmRlZiBmb3JtYXRfZnVsbF92ZXJzaW9uKGluZm8pOgogICAgdmVyc2lvbiA9ICd7MC5tYWpvcn0uezAubWlub3J9LnswLm1pY3JvfScuZm9ybWF0KGluZm8pCiAgICBraW5kID0gaW5mby5yZWxlYXNlbGV2ZWwKICAgIGlmIGtpbmQgIT0gJ2ZpbmFsJzoKICAgICAgICB2ZXJzaW9uICs9IGtpbmRbMF0gKyBzdHIoaW5mby5zZXJpYWwpCiAgICByZXR1cm4gdmVyc2lvbgoKCmRlZiBkZWZhdWx0X2Vudmlyb25tZW50KCk6CiAgICBpZiBoYXNhdHRyKHN5cywgJ2ltcGxlbWVudGF0aW9uJyk6CiAgICAgICAgaXZlciA9IGZvcm1hdF9mdWxsX3ZlcnNpb24oc3lzLmltcGxlbWVudGF0aW9uLnZlcnNpb24pCiAgICAgICAgaW1wbGVtZW50YXRpb25fbmFtZSA9IHN5cy5pbXBsZW1lbnRhdGlvbi5uYW1lCiAgICBlbHNlOgogICAgICAgIGl2ZXIgPSAnMCcKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gJycKCiAgICByZXR1cm4gewogICAgICAgICJpbXBsZW1lbnRhdGlvbl9uYW1lIjogaW1wbGVtZW50YXRpb25fbmFtZSwKICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6IGl2ZXIsCiAgICAgICAgIm9zX25hbWUiOiBvcy5uYW1lLAogICAgICAgICJwbGF0Zm9ybV9tYWNoaW5lIjogcGxhdGZvcm0ubWFjaGluZSgpLAogICAgICAgICJwbGF0Zm9ybV9yZWxlYXNlIjogcGxhdGZvcm0ucmVsZWFzZSgpLAogICAgICAgICJwbGF0Zm9ybV9zeXN0ZW0iOiBwbGF0Zm9ybS5zeXN0ZW0oKSwKICAgICAgICAicGxhdGZvcm1fdmVyc2lvbiI6IHBsYXRmb3JtLnZlcnNpb24oKSwKICAgICAgICAicHl0aG9uX2Z1bGxfdmVyc2lvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiI6IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLAogICAgICAgICJweXRob25fdmVyc2lvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKClbOjNdLAogICAgICAgICJzeXNfcGxhdGZvcm0iOiBzeXMucGxhdGZvcm0sCiAgICB9CgoKY2xhc3MgTWFya2VyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmtlcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9tYXJrZXJzID0gX2NvZXJjZV9wYXJzZV9yZXN1bHQoTUFSS0VSLnBhcnNlU3RyaW5nKG1hcmtlcikpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGVycl9zdHIgPSAiSW52YWxpZCBtYXJrZXI6IHswIXJ9LCBwYXJzZSBlcnJvciBhdCB7MSFyfSIuZm9ybWF0KAogICAgICAgICAgICAgICAgbWFya2VyLCBtYXJrZXJbZS5sb2M6ZS5sb2MgKyA4XSkKICAgICAgICAgICAgcmFpc2UgSW52YWxpZE1hcmtlcihlcnJfc3RyKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihzZWxmLl9tYXJrZXJzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxNYXJrZXIoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKCiAgICBkZWYgZXZhbHVhdGUoc2VsZiwgZW52aXJvbm1lbnQ9Tm9uZSk6CiAgICAgICAgIiIiRXZhbHVhdGUgYSBtYXJrZXIuCgogICAgICAgIFJldHVybiB0aGUgYm9vbGVhbiBmcm9tIGV2YWx1YXRpbmcgdGhlIGdpdmVuIG1hcmtlciBhZ2FpbnN0IHRoZQogICAgICAgIGVudmlyb25tZW50LiBlbnZpcm9ubWVudCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0byBvdmVycmlkZSBhbGwgb3IKICAgICAgICBwYXJ0IG9mIHRoZSBkZXRlcm1pbmVkIGVudmlyb25tZW50LgoKICAgICAgICBUaGUgZW52aXJvbm1lbnQgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjdXJyZW50IFB5dGhvbiBwcm9jZXNzLgogICAgICAgICIiIgogICAgICAgIGN1cnJlbnRfZW52aXJvbm1lbnQgPSBkZWZhdWx0X2Vudmlyb25tZW50KCkKICAgICAgICBpZiBlbnZpcm9ubWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudC51cGRhdGUoZW52aXJvbm1lbnQpCgogICAgICAgIHJldHVybiBfZXZhbHVhdGVfbWFya2VycyhzZWxmLl9tYXJrZXJzLCBjdXJyZW50X2Vudmlyb25tZW50KQpQSwMEFAAAAAAAAAAhAK4Rn/PnEAAA5xAAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3RyaW5nCmltcG9ydCByZQoKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0ICgKICAgIHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQsIG9yaWdpbmFsVGV4dEZvciwgUGFyc2VFeGNlcHRpb24KKQpmcm9tIHBpcC5fdmVuZG9yLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgV29yZCwgT3B0aW9uYWwsIFJlZ2V4LCBDb21iaW5lCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybHBhcnNlCgpmcm9tIC5tYXJrZXJzIGltcG9ydCBNQVJLRVJfRVhQUiwgTWFya2VyCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IExlZ2FjeVNwZWNpZmllciwgU3BlY2lmaWVyLCBTcGVjaWZpZXJTZXQKCgpjbGFzcyBJbnZhbGlkUmVxdWlyZW1lbnQoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgcmVxdWlyZW1lbnQgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCkFMUEhBTlVNID0gV29yZChzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMpCgpMQlJBQ0tFVCA9IEwoIlsiKS5zdXBwcmVzcygpClJCUkFDS0VUID0gTCgiXSIpLnN1cHByZXNzKCkKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKQ09NTUEgPSBMKCIsIikuc3VwcHJlc3MoKQpTRU1JQ09MT04gPSBMKCI7Iikuc3VwcHJlc3MoKQpBVCA9IEwoIkAiKS5zdXBwcmVzcygpCgpQVU5DVFVBVElPTiA9IFdvcmQoIi1fLiIpCklERU5USUZJRVJfRU5EID0gQUxQSEFOVU0gfCAoWmVyb09yTW9yZShQVU5DVFVBVElPTikgKyBBTFBIQU5VTSkKSURFTlRJRklFUiA9IENvbWJpbmUoQUxQSEFOVU0gKyBaZXJvT3JNb3JlKElERU5USUZJRVJfRU5EKSkKCk5BTUUgPSBJREVOVElGSUVSKCJuYW1lIikKRVhUUkEgPSBJREVOVElGSUVSCgpVUkkgPSBSZWdleChyJ1teIF0rJykoInVybCIpClVSTCA9IChBVCArIFVSSSkKCkVYVFJBU19MSVNUID0gRVhUUkEgKyBaZXJvT3JNb3JlKENPTU1BICsgRVhUUkEpCkVYVFJBUyA9IChMQlJBQ0tFVCArIE9wdGlvbmFsKEVYVFJBU19MSVNUKSArIFJCUkFDS0VUKSgiZXh0cmFzIikKClZFUlNJT05fUEVQNDQwID0gUmVnZXgoU3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQpWRVJTSU9OX0xFR0FDWSA9IFJlZ2V4KExlZ2FjeVNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKClZFUlNJT05fT05FID0gVkVSU0lPTl9QRVA0NDAgXiBWRVJTSU9OX0xFR0FDWQpWRVJTSU9OX01BTlkgPSBDb21iaW5lKFZFUlNJT05fT05FICsgWmVyb09yTW9yZShDT01NQSArIFZFUlNJT05fT05FKSwKICAgICAgICAgICAgICAgICAgICAgICBqb2luU3RyaW5nPSIsIiwgYWRqYWNlbnQ9RmFsc2UpKCJfcmF3X3NwZWMiKQpfVkVSU0lPTl9TUEVDID0gT3B0aW9uYWwoKChMUEFSRU4gKyBWRVJTSU9OX01BTlkgKyBSUEFSRU4pIHwgVkVSU0lPTl9NQU5ZKSkKX1ZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdC5fcmF3X3NwZWMgb3IgJycpCgpWRVJTSU9OX1NQRUMgPSBvcmlnaW5hbFRleHRGb3IoX1ZFUlNJT05fU1BFQykoInNwZWNpZmllciIpClZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdFsxXSkKCk1BUktFUl9FWFBSID0gb3JpZ2luYWxUZXh0Rm9yKE1BUktFUl9FWFBSKCkpKCJtYXJrZXIiKQpNQVJLRVJfRVhQUi5zZXRQYXJzZUFjdGlvbigKICAgIGxhbWJkYSBzLCBsLCB0OiBNYXJrZXIoc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdKQopCk1BUktFUl9TRVBFUkFUT1IgPSBTRU1JQ09MT04KTUFSS0VSID0gTUFSS0VSX1NFUEVSQVRPUiArIE1BUktFUl9FWFBSCgpWRVJTSU9OX0FORF9NQVJLRVIgPSBWRVJTSU9OX1NQRUMgKyBPcHRpb25hbChNQVJLRVIpClVSTF9BTkRfTUFSS0VSID0gVVJMICsgT3B0aW9uYWwoTUFSS0VSKQoKTkFNRURfUkVRVUlSRU1FTlQgPSBcCiAgICBOQU1FICsgT3B0aW9uYWwoRVhUUkFTKSArIChVUkxfQU5EX01BUktFUiB8IFZFUlNJT05fQU5EX01BUktFUikKClJFUVVJUkVNRU5UID0gc3RyaW5nU3RhcnQgKyBOQU1FRF9SRVFVSVJFTUVOVCArIHN0cmluZ0VuZAoKCmNsYXNzIFJlcXVpcmVtZW50KG9iamVjdCk6CiAgICAiIiJQYXJzZSBhIHJlcXVpcmVtZW50LgoKICAgIFBhcnNlIGEgZ2l2ZW4gcmVxdWlyZW1lbnQgc3RyaW5nIGludG8gaXRzIHBhcnRzLCBzdWNoIGFzIG5hbWUsIHNwZWNpZmllciwKICAgIFVSTCwgYW5kIGV4dHJhcy4gUmFpc2VzIEludmFsaWRSZXF1aXJlbWVudCBvbiBhIGJhZGx5LWZvcm1lZCByZXF1aXJlbWVudAogICAgc3RyaW5nLgogICAgIiIiCgogICAgIyBUT0RPOiBDYW4gd2UgdGVzdCB3aGV0aGVyIHNvbWV0aGluZyBpcyBjb250YWluZWQgd2l0aGluIGEgcmVxdWlyZW1lbnQ/CiAgICAjICAgICAgIElmIHNvIGhvdyBkbyB3ZSBkbyB0aGF0PyBEbyB3ZSBuZWVkIHRvIHRlc3QgYWdhaW5zdCB0aGUgX25hbWVfIG9mCiAgICAjICAgICAgIHRoZSB0aGluZyBhcyB3ZWxsIGFzIHRoZSB2ZXJzaW9uPyBXaGF0IGFib3V0IHRoZSBtYXJrZXJzPwogICAgIyBUT0RPOiBDYW4gd2Ugbm9ybWFsaXplIHRoZSBuYW1lIGFuZCBleHRyYSBuYW1lPwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVxID0gUkVRVUlSRU1FTlQucGFyc2VTdHJpbmcocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1aXJlbWVudCwgcGFyc2UgZXJyb3IgYXQgXCJ7MCFyfVwiIi5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc3RyaW5nW2UubG9jOmUubG9jICsgOF0pKQoKICAgICAgICBzZWxmLm5hbWUgPSByZXEubmFtZQogICAgICAgIGlmIHJlcS51cmw6CiAgICAgICAgICAgIHBhcnNlZF91cmwgPSB1cmxwYXJzZS51cmxwYXJzZShyZXEudXJsKQogICAgICAgICAgICBpZiBub3QgKHBhcnNlZF91cmwuc2NoZW1lIGFuZCBwYXJzZWRfdXJsLm5ldGxvYykgb3IgKAogICAgICAgICAgICAgICAgICAgIG5vdCBwYXJzZWRfdXJsLnNjaGVtZSBhbmQgbm90IHBhcnNlZF91cmwubmV0bG9jKToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgiSW52YWxpZCBVUkwgZ2l2ZW4iKQogICAgICAgICAgICBzZWxmLnVybCA9IHJlcS51cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybCA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhcyA9IHNldChyZXEuZXh0cmFzLmFzTGlzdCgpIGlmIHJlcS5leHRyYXMgZWxzZSBbXSkKICAgICAgICBzZWxmLnNwZWNpZmllciA9IFNwZWNpZmllclNldChyZXEuc3BlY2lmaWVyKQogICAgICAgIHNlbGYubWFya2VyID0gcmVxLm1hcmtlciBpZiByZXEubWFya2VyIGVsc2UgTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW3NlbGYubmFtZV0KCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiW3swfV0iLmZvcm1hdCgiLCIuam9pbihzb3J0ZWQoc2VsZi5leHRyYXMpKSkpCgogICAgICAgIGlmIHNlbGYuc3BlY2lmaWVyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc3RyKHNlbGYuc3BlY2lmaWVyKSkKCiAgICAgICAgaWYgc2VsZi51cmw6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiQCB7MH0iLmZvcm1hdChzZWxmLnVybCkpCgogICAgICAgIGlmIHNlbGYubWFya2VyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIjsgezB9Ii5mb3JtYXQoc2VsZi5tYXJrZXIpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8UmVxdWlyZW1lbnQoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKUEsDBBQAAAAAAAAAIQB8RYOMeW0AAHltAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBhYmMKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzLCB3aXRoX21ldGFjbGFzcwpmcm9tIC52ZXJzaW9uIGltcG9ydCBWZXJzaW9uLCBMZWdhY3lWZXJzaW9uLCBwYXJzZQoKCmNsYXNzIEludmFsaWRTcGVjaWZpZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgc3BlY2lmaWVyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBCYXNlU3BlY2lmaWVyKHdpdGhfbWV0YWNsYXNzKGFiYy5BQkNNZXRhLCBvYmplY3QpKToKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBzdHIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuIFRoaXMKICAgICAgICBzaG91bGQgYmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIFNwZWNpZmllciBpdHNlbGYuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBoYXNoIHZhbHVlIGZvciB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgbm90IGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3Rwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIFNldHMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gaXRlbSBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRha2VzIGFuIGl0ZXJhYmxlIG9mIGl0ZW1zIGFuZCBmaWx0ZXJzIHRoZW0gc28gdGhhdCBvbmx5IGl0ZW1zIHdoaWNoCiAgICAgICAgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIgYXJlIGFsbG93ZWQgaW4gaXQuCiAgICAgICAgIiIiCgoKY2xhc3MgX0luZGl2aWR1YWxTcGVjaWZpZXIoQmFzZVNwZWNpZmllcik6CgogICAgX29wZXJhdG9ycyA9IHt9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHNwZWMpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkU3BlY2lmaWVyKCJJbnZhbGlkIHNwZWNpZmllcjogJ3swfSciLmZvcm1hdChzcGVjKSkKCiAgICAgICAgc2VsZi5fc3BlYyA9ICgKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoIm9wZXJhdG9yIikuc3RyaXAoKSwKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInZlcnNpb24iKS5zdHJpcCgpLAogICAgICAgICkKCiAgICAgICAgIyBTdG9yZSB3aGV0aGVyIG9yIG5vdCB0aGlzIFNwZWNpZmllciBzaG91bGQgYWNjZXB0IHByZXJlbGVhc2VzCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9ezJ9KT4iLmZvcm1hdCgKICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgIHN0cihzZWxmKSwKICAgICAgICAgICAgcHJlLAogICAgICAgICkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gInswfXsxfSIuZm9ybWF0KCpzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgPT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjICE9IG90aGVyLl9zcGVjCgogICAgZGVmIF9nZXRfb3BlcmF0b3Ioc2VsZiwgb3ApOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICJfY29tcGFyZV97MH0iLmZvcm1hdChzZWxmLl9vcGVyYXRvcnNbb3BdKSkKCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIHZlcnNpb24gPSBwYXJzZSh2ZXJzaW9uKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3BlcmF0b3Ioc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiBwcmVyZWxlYXNlcyBhcmUgdG8gYmUgYWxsb3dlZCBvciBub3QuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgTm9ybWFsaXplIGl0ZW0gdG8gYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24sIHRoaXMgYWxsb3dzIHVzIHRvIGhhdmUKICAgICAgICAjIGEgc2hvcnRjdXQgZm9yIGBgIjIuMCIgaW4gU3BlY2lmaWVyKCI+PTIiKQogICAgICAgIGl0ZW0gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBzaG91bGQgYmUgc3VwcG9ydGluZyBwcmVyZWxlYXNlcyBpbiB0aGlzIHNwZWNpZmllcgogICAgICAgICMgb3Igbm90LCBpZiB3ZSBkbyBub3Qgc3VwcG9ydCBwcmVyZWxlYXNlcyB0aGFuIHdlIGNhbiBzaG9ydCBjaXJjdWl0CiAgICAgICAgIyBsb2dpYyBpZiB0aGlzIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBpdGVtLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgQWN0dWFsbHkgZG8gdGhlIGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXRlbSBpcyBjb250YWluZWQKICAgICAgICAjIHdpdGhpbiB0aGlzIFNwZWNpZmllciBvciBub3QuCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9vcGVyYXRvcihzZWxmLm9wZXJhdG9yKShpdGVtLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgeWllbGRlZCA9IEZhbHNlCiAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICBrdyA9IHsicHJlcmVsZWFzZXMiOiBwcmVyZWxlYXNlcyBpZiBwcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBlbHNlIFRydWV9CgogICAgICAgICMgQXR0ZW1wdCB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIGl0ZXJhYmxlIGFuZCBpZiBhbnkgb2YKICAgICAgICAjIHRoZW0gbWF0Y2gsIHlpZWxkIHRoZW0uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gaXRlcmFibGU6CiAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gc2VsZi5fY29lcmNlX3ZlcnNpb24odmVyc2lvbikKCiAgICAgICAgICAgIGlmIHNlbGYuY29udGFpbnMocGFyc2VkX3ZlcnNpb24sICoqa3cpOgogICAgICAgICAgICAgICAgIyBJZiBvdXIgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2UsIGFuZCB3ZSB3ZXJlIG5vdCBzZXQgdG8gYWxsb3cKICAgICAgICAgICAgICAgICMgcHJlcmVsZWFzZXMsIHRoZW4gd2UnbGwgc3RvcmUgaXQgZm9yIGxhdGVyIGluY2FzZSBub3RoaW5nCiAgICAgICAgICAgICAgICAjIGVsc2UgbWF0Y2hlcyB0aGlzIHNwZWNpZmllci4KICAgICAgICAgICAgICAgIGlmIChwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgKHByZXJlbGVhc2VzIG9yIHNlbGYucHJlcmVsZWFzZXMpKToKICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQodmVyc2lvbikKICAgICAgICAgICAgICAgICMgRWl0aGVyIHRoaXMgaXMgbm90IGEgcHJlcmVsZWFzZSwgb3Igd2Ugc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICAgICAgIyBhY2NlcHRpbmcgcHJlcmVsZWFzZXMgZnJvbSB0aGUgYmVnaW5pbmcuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKICAgICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGl0ZXJhdGVkIG92ZXIgZXZlcnl0aGluZywgZGV0ZXJtaW5lIGlmIHdlJ3ZlIHlpZWxkZWQKICAgICAgICAjIGFueSB2YWx1ZXMsIGFuZCBpZiB3ZSBoYXZlIG5vdCBhbmQgd2UgaGF2ZSBhbnkgcHJlcmVsZWFzZXMgc3RvcmVkIHVwCiAgICAgICAgIyB0aGVuIHdlIHdpbGwgZ28gYWhlYWQgYW5kIHlpZWxkIHRoZSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBub3QgeWllbGRlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIGZvciB2ZXJzaW9uIGluIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKCmNsYXNzIExlZ2FjeVNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9ICgKICAgICAgICByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPig9PXwhPXw8PXw+PXw8fD4pKQogICAgICAgIFxzKgogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICBbXiw7XHMpXSogIyBTaW5jZSB0aGlzIGlzIGEgImxlZ2FjeSIgc3BlY2lmaWVyLCBhbmQgdGhlIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICMgc3RyaW5nIGNhbiBiZSBqdXN0IGFib3V0IGFueXRoaW5nLCB3ZSBtYXRjaCBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAjIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZSwgYSBzZW1pLWNvbG9uIGZvciBtYXJrZXIgc3VwcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICMgYSBjbG9zaW5nIHBhcmVuIHNpbmNlIHZlcnNpb25zIGNhbiBiZSBlbmNsb3NlZCBpbgogICAgICAgICAgICAgICAgICAgICAgIyB0aGVtLCBhbmQgYSBjb21tYSBzaW5jZSBpdCdzIGEgdmVyc2lvbiBzZXBhcmF0b3IuCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgfQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgIHZlcnNpb24gPSBMZWdhY3lWZXJzaW9uKHN0cih2ZXJzaW9uKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlICE9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDwgc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPiBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKCmRlZiBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUoZm4pOgogICAgQGZ1bmN0b29scy53cmFwcyhmbikKICAgIGRlZiB3cmFwcGVkKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9zcGVjdGl2ZSwgVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBmbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYykKICAgIHJldHVybiB3cmFwcGVkCgoKY2xhc3MgU3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gKAogICAgICAgIHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KH49fD09fCE9fDw9fD49fDx8Pnw9PT0pKQogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGlkZW50aXR5IG9wZXJhdG9ycyBhbGxvdyBmb3IgYW4gZXNjYXBlIGhhdGNoIHRoYXQgd2lsbAogICAgICAgICAgICAgICAgIyBkbyBhbiBleGFjdCBzdHJpbmcgbWF0Y2ggb2YgdGhlIHZlcnNpb24geW91IHdpc2ggdG8gaW5zdGFsbC4KICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIG5vdCBiZSBwYXJzZWQgYnkgUEVQIDQ0MCBhbmQgd2UgY2Fubm90IGRldGVybWluZQogICAgICAgICAgICAgICAgIyBhbnkgc2VtYW50aWMgbWVhbmluZyBmcm9tIGl0LiBUaGlzIG9wZXJhdG9yIGlzIGRpc2NvdXJhZ2VkCiAgICAgICAgICAgICAgICAjIGJ1dCBpbmNsdWRlZCBlbnRpcmVseSBhcyBhbiBlc2NhcGUgaGF0Y2guCiAgICAgICAgICAgICAgICAoPzw9PT09KSAgIyBPbmx5IG1hdGNoIGZvciB0aGUgaWRlbnRpdHkgb3BlcmF0b3IKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgW15cc10qICAgICMgV2UganVzdCBtYXRjaCBldmVyeXRoaW5nLCBleGNlcHQgZm9yIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNpbmNlIHdlIGFyZSBvbmx5IHRlc3RpbmcgZm9yIHN0cmljdCBpZGVudGl0eS4KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIHdpbGQgY2FyZCBhbmQgbG9jYWwKICAgICAgICAgICAgICAgICMgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIHNvIHdlIGhhdmUgdG8gZGVmaW5lIHRoZXNlIHR3bwogICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc2VwYXJhdGVseSB0byBlbmFibGUgdGhhdC4KICAgICAgICAgICAgICAgICg/PD09PXwhPSkgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIGVxdWFscyBhbmQgbm90IGVxdWFscwoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwoKICAgICAgICAgICAgICAgICMgWW91IGNhbm5vdCB1c2UgYSB3aWxkIGNhcmQgYW5kIGEgZGV2IG9yIGxvY2FsIHZlcnNpb24KICAgICAgICAgICAgICAgICMgdG9nZXRoZXIgc28gZ3JvdXAgdGhlbSB3aXRoIGEgfCBhbmQgbWFrZSB0aGVtIG9wdGlvbmFsLgogICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzpcK1thLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKT8gIyBsb2NhbAogICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICBcLlwqICAjIFdpbGQgY2FyZCBzeW50YXggb2YgLioKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGNvbXBhdGlibGUgb3BlcmF0b3IgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGRpZ2l0cyBpbiB0aGUKICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICAgICAgKD88PX49KSAgICAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgdGhlIGNvbXBhdGlibGUgb3BlcmF0b3IKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKyAgICMgcmVsZWFzZSAgKFdlIGhhdmUgYSArIGluc3RlYWQgb2YgYSAqKQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBBbGwgb3RoZXIgb3BlcmF0b3JzIG9ubHkgYWxsb3cgYSBzdWIgc2V0IG9mIHdoYXQgdGhlCiAgICAgICAgICAgICAgICAjIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGRvLiBTcGVjaWZpY2FsbHkgdGhleSBkbyBub3QgYWxsb3cKICAgICAgICAgICAgICAgICMgbG9jYWwgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIG5vciBkbyB0aGV5IGFsbG93IHRoZSBwcmVmaXgKICAgICAgICAgICAgICAgICMgbWF0Y2hpbmcgd2lsZCBjYXJkcy4KICAgICAgICAgICAgICAgICg/PCE9PXwhPXx+PSkgICAgICAgICAjIFdlIGhhdmUgc3BlY2lhbCBjYXNlcyBmb3IgdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtYXRjaCBoZXJlLgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICJ+PSI6ICJjb21wYXRpYmxlIiwKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgICAgICAiPT09IjogImFyYml0cmFyeSIsCiAgICB9CgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2NvbXBhdGlibGUoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29tcGF0aWJsZSByZWxlYXNlcyBoYXZlIGFuIGVxdWl2YWxlbnQgY29tYmluYXRpb24gb2YgPj0gYW5kID09LiBUaGF0CiAgICAgICAgIyBpcyB0aGF0IH49Mi4yIGlzIGVxdWl2YWxlbnQgdG8gPj0yLjIsPT0yLiouIFRoaXMgYWxsb3dzIHVzIHRvCiAgICAgICAgIyBpbXBsZW1lbnQgdGhpcyBpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgc3BlY2lmaWVycyBpbnN0ZWFkIG9mCiAgICAgICAgIyBpbXBsZW1lbnRpbmcgaXQgb3Vyc2VsdmVzLiBUaGUgb25seSB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNvbnN0cnVjdAogICAgICAgICMgdGhlIG90aGVyIHNwZWNpZmllcnMuCgogICAgICAgICMgV2Ugd2FudCBldmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBpdGVtIGluIHRoZSB2ZXJzaW9uLCBidXQgd2Ugd2FudCB0bwogICAgICAgICMgaWdub3JlIHBvc3QgYW5kIGRldiByZWxlYXNlcyBhbmQgd2Ugd2FudCB0byB0cmVhdCB0aGUgcHJlLXJlbGVhc2UgYXMKICAgICAgICAjIGl0J3Mgb3duIHNlcGFyYXRlIHNlZ21lbnQuCiAgICAgICAgcHJlZml4ID0gIi4iLmpvaW4oCiAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICBpdGVydG9vbHMudGFrZXdoaWxlKAogICAgICAgICAgICAgICAgICAgIGxhbWJkYSB4OiAobm90IHguc3RhcnRzd2l0aCgicG9zdCIpIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguc3RhcnRzd2l0aCgiZGV2IikpLAogICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3NwbGl0KHNwZWMpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApWzotMV0KICAgICAgICApCgogICAgICAgICMgQWRkIHRoZSBwcmVmaXggbm90YXRpb24gdG8gdGhlIGVuZCBvZiBvdXIgc3RyaW5nCiAgICAgICAgcHJlZml4ICs9ICIuKiIKCiAgICAgICAgcmV0dXJuIChzZWxmLl9nZXRfb3BlcmF0b3IoIj49IikocHJvc3BlY3RpdmUsIHNwZWMpIGFuZAogICAgICAgICAgICAgICAgc2VsZi5fZ2V0X29wZXJhdG9yKCI9PSIpKHByb3NwZWN0aXZlLCBwcmVmaXgpKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBXZSBuZWVkIHNwZWNpYWwgbG9naWMgdG8gaGFuZGxlIHByZWZpeCBtYXRjaGluZwogICAgICAgIGlmIHNwZWMuZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgcHJlZml4IG1hdGNoaW5nIHdlIHdhbnQgdG8gaWdub3JlIGxvY2FsIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHNwZWMgb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYW4gaW1wbGljaXQKICAgICAgICAgICAgIyBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICBzcGVjID0gX3ZlcnNpb25fc3BsaXQoc3BlY1s6LTJdKSAgIyBSZW1vdmUgdGhlIHRyYWlsaW5nIC4qCgogICAgICAgICAgICAjIFNwbGl0IHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlCiAgICAgICAgICAgICMgaXMgYW4gaW1wbGljaXQgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2UKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IF92ZXJzaW9uX3NwbGl0KHN0cihwcm9zcGVjdGl2ZSkpCgogICAgICAgICAgICAjIFNob3J0ZW4gdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gdG8gYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzcGVjCiAgICAgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZXIgaXMgYSBwcmVmaXggb2YgdGhlCiAgICAgICAgICAgICMgcHJvc3BlY3RpdmUgdmVyc2lvbiBvciBub3QuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gcHJvc3BlY3RpdmVbOmxlbihzcGVjKV0KCiAgICAgICAgICAgICMgUGFkIG91dCBvdXIgdHdvIHNpZGVzIHdpdGggemVyb3Mgc28gdGhhdCB0aGV5IGJvdGggZXF1YWwgdGhlIHNhbWUKICAgICAgICAgICAgIyBsZW5ndGguCiAgICAgICAgICAgIHNwZWMsIHByb3NwZWN0aXZlID0gX3BhZF92ZXJzaW9uKHNwZWMsIHByb3NwZWN0aXZlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQ29udmVydCBvdXIgc3BlYyBzdHJpbmcgaW50byBhIFZlcnNpb24KICAgICAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgICAgICMgSWYgdGhlIHNwZWNpZmllciBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgc2VnbWVudCwgdGhlbiB3ZSB3YW50IHRvCiAgICAgICAgICAgICMgYWN0IGFzIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGFsc28gZG9lcyBub3QgaGF2ZSBhIGxvY2FsCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgaWYgbm90IHNwZWMubG9jYWw6CiAgICAgICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQoKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc3BlYwoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBub3Qgc2VsZi5fY29tcGFyZV9lcXVhbChwcm9zcGVjdGl2ZSwgc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPCBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgcHJlLXJlbGVhc2UKICAgICAgICAjIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllciAoZS5nLiA8My4xIHNob3VsZAogICAgICAgICMgbm90IG1hdGNoIDMuMS5kZXYwLCBidXQgc2hvdWxkIG1hdGNoIDMuMC5kZXYwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wcmVyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGxlc3MgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlIHNhbWUKICAgICAgICAjIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA+IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHBvc3QtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQKICAgICAgICAjIHBvc3QtcmVsZWFzZSB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIKICAgICAgICAjIChlLmcuID4zLjEgc2hvdWxkIG5vdCBtYXRjaCAzLjAucG9zdDAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4yLnBvc3QwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wb3N0cmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcG9zdHJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIGRvIG5vdCBhbGxvdyBhIGxvY2FsIHZlcnNpb24gb2YgdGhlIHZlcnNpb24gbWVudGlvbmVkCiAgICAgICAgIyBpbiB0aGUgc3BlY2lmaWVyLCB3aGljaCBpcyB0ZWNoaW5jYWxseSBncmVhdGVyIHRoYW4sIHRvIG1hdGNoLgogICAgICAgIGlmIHByb3NwZWN0aXZlLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlCiAgICAgICAgIyBzYW1lIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX2NvbXBhcmVfYXJiaXRyYXJ5KHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gc3RyKHByb3NwZWN0aXZlKS5sb3dlcigpID09IHN0cihzcGVjKS5sb3dlcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB0aGVyZSBpcyBhbiBleHBsaWNpdCBwcmVyZWxlYXNlcyBzZXQgZm9yIHRoaXMsIHRoZW4gd2UnbGwganVzdAogICAgICAgICMgYmxpbmRseSB1c2UgdGhhdC4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgTG9vayBhdCBhbGwgb2Ygb3VyIHNwZWNpZmllcnMgYW5kIGRldGVybWluZSBpZiB0aGV5IGFyZSBpbmNsdXNpdmUKICAgICAgICAjIG9wZXJhdG9ycywgYW5kIGlmIHRoZXkgYXJlIGlmIHRoZXkgYXJlIGluY2x1ZGluZyBhbiBleHBsaWNpdAogICAgICAgICMgcHJlcmVsZWFzZS4KICAgICAgICBvcGVyYXRvciwgdmVyc2lvbiA9IHNlbGYuX3NwZWMKICAgICAgICBpZiBvcGVyYXRvciBpbiBbIj09IiwgIj49IiwgIjw9IiwgIn49IiwgIj09PSJdOgogICAgICAgICAgICAjIFRoZSA9PSBzcGVjaWZpZXIgY2FuIGluY2x1ZGUgYSB0cmFpbGluZyAuKiwgaWYgaXQgZG9lcyB3ZQogICAgICAgICAgICAjIHdhbnQgdG8gcmVtb3ZlIGJlZm9yZSBwYXJzaW5nLgogICAgICAgICAgICBpZiBvcGVyYXRvciA9PSAiPT0iIGFuZCB2ZXJzaW9uLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bOi0yXQoKICAgICAgICAgICAgIyBQYXJzZSB0aGUgdmVyc2lvbiwgYW5kIGlmIGl0IGlzIGEgcHJlLXJlbGVhc2UgdGhhbiB0aGlzCiAgICAgICAgICAgICMgc3BlY2lmaWVyIGFsbG93cyBwcmUtcmVsZWFzZXMuCiAgICAgICAgICAgIGlmIHBhcnNlKHZlcnNpb24pLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCgpfcHJlZml4X3JlZ2V4ID0gcmUuY29tcGlsZShyIl4oWzAtOV0rKSgoPzphfGJ8Y3xyYylbMC05XSspJCIpCgoKZGVmIF92ZXJzaW9uX3NwbGl0KHZlcnNpb24pOgogICAgcmVzdWx0ID0gW10KICAgIGZvciBpdGVtIGluIHZlcnNpb24uc3BsaXQoIi4iKToKICAgICAgICBtYXRjaCA9IF9wcmVmaXhfcmVnZXguc2VhcmNoKGl0ZW0pCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJlc3VsdC5leHRlbmQobWF0Y2guZ3JvdXBzKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfcGFkX3ZlcnNpb24obGVmdCwgcmlnaHQpOgogICAgbGVmdF9zcGxpdCwgcmlnaHRfc3BsaXQgPSBbXSwgW10KCiAgICAjIEdldCB0aGUgcmVsZWFzZSBzZWdtZW50IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgbGVmdCkpKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIHJpZ2h0KSkpCgogICAgIyBHZXQgdGhlIHJlc3Qgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsZWZ0W2xlbihsZWZ0X3NwbGl0WzBdKTpdKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKHJpZ2h0W2xlbihyaWdodF9zcGxpdFswXSk6XSkKCiAgICAjIEluc2VydCBvdXIgcGFkZGluZwogICAgbGVmdF9zcGxpdC5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBbIjAiXSAqIG1heCgwLCBsZW4ocmlnaHRfc3BsaXRbMF0pIC0gbGVuKGxlZnRfc3BsaXRbMF0pKSwKICAgICkKICAgIHJpZ2h0X3NwbGl0Lmluc2VydCgKICAgICAgICAxLAogICAgICAgIFsiMCJdICogbWF4KDAsIGxlbihsZWZ0X3NwbGl0WzBdKSAtIGxlbihyaWdodF9zcGxpdFswXSkpLAogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgbGlzdChpdGVydG9vbHMuY2hhaW4oKmxlZnRfc3BsaXQpKSwKICAgICAgICBsaXN0KGl0ZXJ0b29scy5jaGFpbigqcmlnaHRfc3BsaXQpKSwKICAgICkKCgpjbGFzcyBTcGVjaWZpZXJTZXQoQmFzZVNwZWNpZmllcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgU3BsaXQgb24gLCB0byBicmVhayBlYWNoIGluZGlkaXZ1YWwgc3BlY2lmaWVyIGludG8gaXQncyBvd24gaXRlbSwgYW5kCiAgICAgICAgIyBzdHJpcCBlYWNoIGl0ZW0gdG8gcmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgICBzcGVjaWZpZXJzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGVjaWZpZXJzLnNwbGl0KCIsIikgaWYgcy5zdHJpcCgpXQoKICAgICAgICAjIFBhcnNlZCBlYWNoIGluZGl2aWR1YWwgc3BlY2lmaWVyLCBhdHRlbXB0aW5nIGZpcnN0IHRvIG1ha2UgaXQgYQogICAgICAgICMgU3BlY2lmaWVyIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBMZWdhY3lTcGVjaWZpZXIuCiAgICAgICAgcGFyc2VkID0gc2V0KCkKICAgICAgICBmb3Igc3BlY2lmaWVyIGluIHNwZWNpZmllcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoU3BlY2lmaWVyKHNwZWNpZmllcikpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChMZWdhY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkKCiAgICAgICAgIyBUdXJuIG91ciBwYXJzZWQgc3BlY2lmaWVycyBpbnRvIGEgZnJvemVuIHNldCBhbmQgc2F2ZSB0aGVtIGZvciBsYXRlci4KICAgICAgICBzZWxmLl9zcGVjcyA9IGZyb3plbnNldChwYXJzZWQpCgogICAgICAgICMgU3RvcmUgb3VyIHByZXJlbGVhc2VzIHZhbHVlIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIGlmCiAgICAgICAgIyB3ZSBhY2NlcHQgcHJlcmVsZWFzZXMgb3Igbm90LgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPFNwZWNpZmllclNldCh7MCFyfXsxfSk+Ii5mb3JtYXQoc3RyKHNlbGYpLCBwcmUpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIsIi5qb2luKHNvcnRlZChzdHIocykgZm9yIHMgaW4gc2VsZi5fc3BlY3MpKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjcykKCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHNwZWNpZmllciA9IFNwZWNpZmllclNldCgpCiAgICAgICAgc3BlY2lmaWVyLl9zcGVjcyA9IGZyb3plbnNldChzZWxmLl9zcGVjcyB8IG90aGVyLl9zcGVjcykKCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gb3RoZXIuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgPT0gb3RoZXIuX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCBjb21iaW5lIFNwZWNpZmllclNldHMgd2l0aCBUcnVlIGFuZCBGYWxzZSBwcmVyZWxlYXNlICIKICAgICAgICAgICAgICAgICJvdmVycmlkZXMuIgogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBzcGVjaWZpZXIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzID09IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgIT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zcGVjcykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fc3BlY3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYW4gZXhwbGljaXQgcHJlcmVsZWFzZSBtb2RpZmllciwgdGhlbiB3ZSdsbAogICAgICAgICMgcGFzcyB0aGF0IHRocm91Z2ggaGVyZS4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgYW5kIHdlIGRvbid0IGhhdmUgYSBmb3JjZWQgdmFsdWUsCiAgICAgICAgIyB0aGVuIHdlJ2xsIGp1c3QgcmV0dXJuIE5vbmUgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHNob3VsZCBoYXZlCiAgICAgICAgIyBwcmUtcmVsZWFzZXMgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLl9zcGVjczoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBPdGhlcndpc2Ugd2UnbGwgc2VlIGlmIGFueSBvZiB0aGUgZ2l2ZW4gc3BlY2lmaWVycyBhY2NlcHQKICAgICAgICAjIHByZXJlbGVhc2VzLCBpZiBhbnkgb2YgdGhlbSBkbyB3ZSdsbCByZXR1cm4gVHJ1ZSwgb3RoZXJ3aXNlIEZhbHNlLgogICAgICAgIHJldHVybiBhbnkocy5wcmVyZWxlYXNlcyBmb3IgcyBpbiBzZWxmLl9zcGVjcykKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRW5zdXJlIHRoYXQgb3VyIGl0ZW0gaXMgYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24gaW5zdGFuY2UuCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgaXRlbSA9IHBhcnNlKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIFdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgZ29pbmcgdG8gYWxsb3cgcHJlLXJlbGVhc2VzIGJ5IGxvb2tpbmcgdG8KICAgICAgICAjIHNlZSBpZiBhbnkgb2YgdGhlIHVuZGVybHlpbmcgaXRlbXMgc3VwcG9ydHMgdGhlbS4gSWYgbm9uZSBvZiB0aGVtIGRvCiAgICAgICAgIyBhbmQgdGhpcyBpdGVtIGlzIGEgcHJlLXJlbGVhc2UgdGhlbiB3ZSBkbyBub3QgYWxsb3cgaXQgYW5kIHdlIGNhbgogICAgICAgICMgc2hvcnQgY2lyY3VpdCB0aGF0IGhlcmUuCiAgICAgICAgIyBOb3RlOiBUaGlzIG1lYW5zIHRoYXQgMS4wLmRldjEgd291bGQgbm90IGJlIGNvbnRhaW5lZCBpbiBzb21ldGhpbmcKICAgICAgICAjICAgICAgIGxpa2UgPj0xLjAuZGV2YWJjIGhvd2V2ZXIgaXQgd291bGQgYmUgaW4gPj0xLjAuZGViYWJjLD4wLjAuZGV2MAogICAgICAgIGlmIG5vdCBwcmVyZWxlYXNlcyBhbmQgaXRlbS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBXZSBzaW1wbHkgZGlzcGF0Y2ggdG8gdGhlIHVuZGVybHlpbmcgc3BlY3MgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUKICAgICAgICAjIGdpdmVuIHZlcnNpb24gaXMgY29udGFpbmVkIHdpdGhpbiBhbGwgb2YgdGhlbS4KICAgICAgICAjIE5vdGU6IFRoaXMgdXNlIG9mIGFsbCgpIGhlcmUgbWVhbnMgdGhhdCBhbiBlbXB0eSBzZXQgb2Ygc3BlY2lmaWVycwogICAgICAgICMgICAgICAgd2lsbCBhbHdheXMgcmV0dXJuIFRydWUsIHRoaXMgaXMgYW4gZXhwbGljaXQgZGVzaWduIGRlY2lzaW9uLgogICAgICAgIHJldHVybiBhbGwoCiAgICAgICAgICAgIHMuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGZvciBzIGluIHNlbGYuX3NwZWNzCiAgICAgICAgKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2Ugd2FudCB0byB3cmFwIG91ciBpdGVyYWJsZSBpbiB0aGUKICAgICAgICAjIGZpbHRlciBtZXRob2QgZm9yIGVhY2ggb25lLCB0aGlzIHdpbGwgYWN0IGFzIGEgbG9naWNhbCBBTkQgYW1vbmdzdAogICAgICAgICMgZWFjaCBzcGVjaWZpZXIuCiAgICAgICAgaWYgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIGZvciBzcGVjIGluIHNlbGYuX3NwZWNzOgogICAgICAgICAgICAgICAgaXRlcmFibGUgPSBzcGVjLmZpbHRlcihpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Ym9vbChwcmVyZWxlYXNlcykpCiAgICAgICAgICAgIHJldHVybiBpdGVyYWJsZQogICAgICAgICMgSWYgd2UgZG8gbm90IGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2UgbmVlZCB0byBoYXZlIGEgcm91Z2ggZmlsdGVyCiAgICAgICAgIyB3aGljaCB3aWxsIGZpbHRlciBvdXQgYW55IHByZS1yZWxlYXNlcywgdW5sZXNzIHRoZXJlIGFyZSBubyBmaW5hbAogICAgICAgICMgcmVsZWFzZXMsIGFuZCB3aGljaCB3aWxsIGZpbHRlciBvdXQgTGVnYWN5VmVyc2lvbiBpbiBnZW5lcmFsLgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbHRlcmVkID0gW10KICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlcmFibGU6CiAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIHNvbWUga2luZCBvZiBWZXJzaW9uIGNsYXNzIGZvciB0aGlzIGl0ZW0uCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gcGFyc2UoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBpdGVtCgogICAgICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IGFueSBpdGVtIHdoaWNoIGlzIHBhcnNlZCBhcyBhIExlZ2FjeVZlcnNpb24KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgIyBTdG9yZSBhbnkgaXRlbSB3aGljaCBpcyBhIHByZS1yZWxlYXNlIGZvciBsYXRlciB1bmxlc3Mgd2UndmUKICAgICAgICAgICAgICAgICMgYWxyZWFkeSBmb3VuZCBhIGZpbmFsIHZlcnNpb24gb3Igd2UgYXJlIGFjY2VwdGluZyBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgaWYgcGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZDoKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZChpdGVtKQoKICAgICAgICAgICAgIyBJZiB3ZSd2ZSBmb3VuZCBubyBpdGVtcyBleGNlcHQgZm9yIHByZS1yZWxlYXNlcywgdGhlbiB3ZSdsbCBnbwogICAgICAgICAgICAjIGFoZWFkIGFuZCB1c2UgdGhlIHByZS1yZWxlYXNlcwogICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzIGFuZCBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kX3ByZXJlbGVhc2VzCgogICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQKUEsDBBQAAAAAAAAAIQDF6icPpQEAAKUBAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgcmUKCgpfY2Fub25pY2FsaXplX3JlZ2V4ID0gcmUuY29tcGlsZShyIlstXy5dKyIpCgoKZGVmIGNhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpOgogICAgIyBUaGlzIGlzIHRha2VuIGZyb20gUEVQIDUwMy4KICAgIHJldHVybiBfY2Fub25pY2FsaXplX3JlZ2V4LnN1YigiLSIsIG5hbWUpLmxvd2VyKCkKUEsDBBQAAAAAAAAAIQAO78ahJC0AACQtAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX3N0cnVjdHVyZXMgaW1wb3J0IEluZmluaXR5CgoKX19hbGxfXyA9IFsKICAgICJwYXJzZSIsICJWZXJzaW9uIiwgIkxlZ2FjeVZlcnNpb24iLCAiSW52YWxpZFZlcnNpb24iLCAiVkVSU0lPTl9QQVRURVJOIgpdCgoKX1ZlcnNpb24gPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKAogICAgIl9WZXJzaW9uIiwKICAgIFsiZXBvY2giLCAicmVsZWFzZSIsICJkZXYiLCAicHJlIiwgInBvc3QiLCAibG9jYWwiXSwKKQoKCmRlZiBwYXJzZSh2ZXJzaW9uKToKICAgICIiIgogICAgUGFyc2UgdGhlIGdpdmVuIHZlcnNpb24gc3RyaW5nIGFuZCByZXR1cm4gZWl0aGVyIGEgOmNsYXNzOmBWZXJzaW9uYCBvYmplY3QKICAgIG9yIGEgOmNsYXNzOmBMZWdhY3lWZXJzaW9uYCBvYmplY3QgZGVwZW5kaW5nIG9uIGlmIHRoZSBnaXZlbiB2ZXJzaW9uIGlzCiAgICBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiBvciBhIGxlZ2FjeSB2ZXJzaW9uLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFZlcnNpb24odmVyc2lvbikKICAgIGV4Y2VwdCBJbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gTGVnYWN5VmVyc2lvbih2ZXJzaW9uKQoKCmNsYXNzIEludmFsaWRWZXJzaW9uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHZlcnNpb24gd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIF9CYXNlVmVyc2lvbihvYmplY3QpOgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9rZXkpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDwgbykKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPD0gbykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPT0gbykKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPj0gbykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPiBvKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyAhPSBvKQoKICAgIGRlZiBfY29tcGFyZShzZWxmLCBvdGhlciwgbWV0aG9kKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBtZXRob2Qoc2VsZi5fa2V5LCBvdGhlci5fa2V5KQoKCmNsYXNzIExlZ2FjeVZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHN0cih2ZXJzaW9uKQogICAgICAgIHNlbGYuX2tleSA9IF9sZWdhY3lfY21wa2V5KHNlbGYuX3ZlcnNpb24pCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TGVnYWN5VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUoCiAgICByIihcZCsgfCBbYS16XSsgfCBcLnwgLSkiLCByZS5WRVJCT1NFLAopCgpfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwID0gewogICAgInByZSI6ICJjIiwgInByZXZpZXciOiAiYyIsICItIjogImZpbmFsLSIsICJyYyI6ICJjIiwgImRldiI6ICJAIiwKfQoKCmRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKICAgIGZvciBwYXJ0IGluIF9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUuc3BsaXQocyk6CiAgICAgICAgcGFydCA9IF9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAuZ2V0KHBhcnQsIHBhcnQpCgogICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQgPT0gIi4iOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBwYXJ0WzoxXSBpbiAiMDEyMzQ1Njc4OSI6CiAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkICIqIiArIHBhcnQKCiAgICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKICAgIHlpZWxkICIqZmluYWwiCgoKZGVmIF9sZWdhY3lfY21wa2V5KHZlcnNpb24pOgogICAgIyBXZSBoYXJkY29kZSBhbiBlcG9jaCBvZiAtMSBoZXJlLiBBIFBFUCA0NDAgdmVyc2lvbiBjYW4gb25seSBoYXZlIGEgZXBvY2gKICAgICMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuIFRoaXMgd2lsbCBlZmZlY3RpdmVseSBwdXQgdGhlIExlZ2FjeVZlcnNpb24sCiAgICAjIHdoaWNoIHVzZXMgdGhlIGRlZmFjdG8gc3RhbmRhcmQgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBieSBzZXR1cHRvb2xzLAogICAgIyBhcyBiZWZvcmUgYWxsIFBFUCA0NDAgdmVyc2lvbnMuCiAgICBlcG9jaCA9IC0xCgogICAgIyBUaGlzIHNjaGVtZSBpcyB0YWtlbiBmcm9tIHBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbiBzZXR1cHRvb2xzIHByaW9yIHRvCiAgICAjIGl0J3MgYWRvcHRpb24gb2YgdGhlIHBhY2thZ2luZyBsaWJyYXJ5LgogICAgcGFydHMgPSBbXQogICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHModmVyc2lvbi5sb3dlcigpKToKICAgICAgICBpZiBwYXJ0LnN0YXJ0c3dpdGgoIioiKToKICAgICAgICAgICAgIyByZW1vdmUgIi0iIGJlZm9yZSBhIHByZXJlbGVhc2UgdGFnCiAgICAgICAgICAgIGlmIHBhcnQgPCAiKmZpbmFsIjoKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIipmaW5hbC0iOgogICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiMDAwMDAwMDAiOgogICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICBwYXJ0cyA9IHR1cGxlKHBhcnRzKQoKICAgIHJldHVybiBlcG9jaCwgcGFydHMKCiMgRGVsaWJlcmF0ZWx5IG5vdCBhbmNob3JlZCB0byB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nLCB0byBtYWtlIGl0CiMgZWFzaWVyIGZvciAzcmQgcGFydHkgY29kZSB0byByZXVzZQpWRVJTSU9OX1BBVFRFUk4gPSByIiIiCiAgICB2PwogICAgKD86CiAgICAgICAgKD86KD9QPGVwb2NoPlswLTldKykhKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVwb2NoCiAgICAgICAgKD9QPHJlbGVhc2U+WzAtOV0rKD86XC5bMC05XSspKikgICAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudAogICAgICAgICg/UDxwcmU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmUtcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbD4oYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICAgICAoP1A8cG9zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICg/Oi0oP1A8cG9zdF9uMT5bMC05XSspKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbD5wb3N0fHJldnxyKQogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbjI+WzAtOV0rKT8KICAgICAgICAgICAgKQogICAgICAgICk/CiAgICAgICAgKD9QPGRldj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9sPmRldikKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X24+WzAtOV0rKT8KICAgICAgICApPwogICAgKQogICAgKD86XCsoP1A8bG9jYWw+W2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopKT8gICAgICAgIyBsb2NhbCB2ZXJzaW9uCiIiIgoKCmNsYXNzIFZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBWRVJTSU9OX1BBVFRFUk4gKyByIlxzKiQiLAogICAgICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFLAogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAjIFZhbGlkYXRlIHRoZSB2ZXJzaW9uIGFuZCBwYXJzZSBpdCBpbnRvIHBpZWNlcwogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHZlcnNpb24pCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVmVyc2lvbigiSW52YWxpZCB2ZXJzaW9uOiAnezB9JyIuZm9ybWF0KHZlcnNpb24pKQoKICAgICAgICAjIFN0b3JlIHRoZSBwYXJzZWQgb3V0IHBpZWNlcyBvZiB0aGUgdmVyc2lvbgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBfVmVyc2lvbigKICAgICAgICAgICAgZXBvY2g9aW50KG1hdGNoLmdyb3VwKCJlcG9jaCIpKSBpZiBtYXRjaC5ncm91cCgiZXBvY2giKSBlbHNlIDAsCiAgICAgICAgICAgIHJlbGVhc2U9dHVwbGUoaW50KGkpIGZvciBpIGluIG1hdGNoLmdyb3VwKCJyZWxlYXNlIikuc3BsaXQoIi4iKSksCiAgICAgICAgICAgIHByZT1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicHJlX2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBwb3N0PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X24xIikgb3IgbWF0Y2guZ3JvdXAoInBvc3RfbjIiKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgZGV2PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJkZXZfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGxvY2FsPV9wYXJzZV9sb2NhbF92ZXJzaW9uKG1hdGNoLmdyb3VwKCJsb2NhbCIpKSwKICAgICAgICApCgogICAgICAgICMgR2VuZXJhdGUgYSBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBzb3J0aW5nCiAgICAgICAgc2VsZi5fa2V5ID0gX2NtcGtleSgKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5lcG9jaCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5yZWxlYXNlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnByZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wb3N0LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmRldiwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5sb2NhbCwKICAgICAgICApCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgICMgUHJlLXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnByZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIiLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucHJlKSkKCiAgICAgICAgIyBQb3N0LXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnBvc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLnBvc3R7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLnBvc3RbMV0pKQoKICAgICAgICAjIERldmVsb3BtZW50IHJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmRldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIuZGV2ezB9Ii5mb3JtYXQoc2VsZi5fdmVyc2lvbi5kZXZbMV0pKQoKICAgICAgICAjIExvY2FsIHZlcnNpb24gc2VnbWVudAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICIrezB9Ii5mb3JtYXQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ubG9jYWwpKQogICAgICAgICAgICApCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpLnNwbGl0KCIrIiwgMSlbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHZlcnNpb25fc3RyaW5nID0gc3RyKHNlbGYpCiAgICAgICAgaWYgIisiIGluIHZlcnNpb25fc3RyaW5nOgogICAgICAgICAgICByZXR1cm4gdmVyc2lvbl9zdHJpbmcuc3BsaXQoIisiLCAxKVsxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5kZXYgb3Igc2VsZi5fdmVyc2lvbi5wcmUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5wb3N0KQoKCmRlZiBfcGFyc2VfbGV0dGVyX3ZlcnNpb24obGV0dGVyLCBudW1iZXIpOgogICAgaWYgbGV0dGVyOgogICAgICAgICMgV2UgY29uc2lkZXIgdGhlcmUgdG8gYmUgYW4gaW1wbGljaXQgMCBpbiBhIHByZS1yZWxlYXNlIGlmIHRoZXJlIGlzCiAgICAgICAgIyBub3QgYSBudW1lcmFsIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgICBpZiBudW1iZXIgaXMgTm9uZToKICAgICAgICAgICAgbnVtYmVyID0gMAoKICAgICAgICAjIFdlIG5vcm1hbGl6ZSBhbnkgbGV0dGVycyB0byB0aGVpciBsb3dlciBjYXNlIGZvcm0KICAgICAgICBsZXR0ZXIgPSBsZXR0ZXIubG93ZXIoKQoKICAgICAgICAjIFdlIGNvbnNpZGVyIHNvbWUgd29yZHMgdG8gYmUgYWx0ZXJuYXRlIHNwZWxsaW5ncyBvZiBvdGhlciB3b3JkcyBhbmQKICAgICAgICAjIGluIHRob3NlIGNhc2VzIHdlIHdhbnQgdG8gbm9ybWFsaXplIHRoZSBzcGVsbGluZ3MgdG8gb3VyIHByZWZlcnJlZAogICAgICAgICMgc3BlbGxpbmcuCiAgICAgICAgaWYgbGV0dGVyID09ICJhbHBoYSI6CiAgICAgICAgICAgIGxldHRlciA9ICJhIgogICAgICAgIGVsaWYgbGV0dGVyID09ICJiZXRhIjoKICAgICAgICAgICAgbGV0dGVyID0gImIiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJjIiwgInByZSIsICJwcmV2aWV3Il06CiAgICAgICAgICAgIGxldHRlciA9ICJyYyIKICAgICAgICBlbGlmIGxldHRlciBpbiBbInJldiIsICJyIl06CiAgICAgICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQogICAgaWYgbm90IGxldHRlciBhbmQgbnVtYmVyOgogICAgICAgICMgV2UgYXNzdW1lIGlmIHdlIGFyZSBnaXZlbiBhIG51bWJlciwgYnV0IHdlIGFyZSBub3QgZ2l2ZW4gYSBsZXR0ZXIKICAgICAgICAjIHRoZW4gdGhpcyBpcyB1c2luZyB0aGUgaW1wbGljaXQgcG9zdCByZWxlYXNlIHN5bnRheCAoZS5nLiAxLjAtMSkKICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKCgpfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzID0gcmUuY29tcGlsZShyIltcLl8tXSIpCgoKZGVmIF9wYXJzZV9sb2NhbF92ZXJzaW9uKGxvY2FsKToKICAgICIiIgogICAgVGFrZXMgYSBzdHJpbmcgbGlrZSBhYmMuMS50d2VsdmUgYW5kIHR1cm5zIGl0IGludG8gKCJhYmMiLCAxLCAidHdlbHZlIikuCiAgICAiIiIKICAgIGlmIGxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgIHJldHVybiB0dXBsZSgKICAgICAgICAgICAgcGFydC5sb3dlcigpIGlmIG5vdCBwYXJ0LmlzZGlnaXQoKSBlbHNlIGludChwYXJ0KQogICAgICAgICAgICBmb3IgcGFydCBpbiBfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzLnNwbGl0KGxvY2FsKQogICAgICAgICkKCgpkZWYgX2NtcGtleShlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsKToKICAgICMgV2hlbiB3ZSBjb21wYXJlIGEgcmVsZWFzZSB2ZXJzaW9uLCB3ZSB3YW50IHRvIGNvbXBhcmUgaXQgd2l0aCBhbGwgb2YgdGhlCiAgICAjIHRyYWlsaW5nIHplcm9zIHJlbW92ZWQuIFNvIHdlJ2xsIHVzZSBhIHJldmVyc2UgdGhlIGxpc3QsIGRyb3AgYWxsIHRoZSBub3cKICAgICMgbGVhZGluZyB6ZXJvcyB1bnRpbCB3ZSBjb21lIHRvIHNvbWV0aGluZyBub24gemVybywgdGhlbiB0YWtlIHRoZSByZXN0CiAgICAjIHJlLXJldmVyc2UgaXQgYmFjayBpbnRvIHRoZSBjb3JyZWN0IG9yZGVyIGFuZCBtYWtlIGl0IGEgdHVwbGUgYW5kIHVzZQogICAgIyB0aGF0IGZvciBvdXIgc29ydGluZyBrZXkuCiAgICByZWxlYXNlID0gdHVwbGUoCiAgICAgICAgcmV2ZXJzZWQobGlzdCgKICAgICAgICAgICAgaXRlcnRvb2xzLmRyb3B3aGlsZSgKICAgICAgICAgICAgICAgIGxhbWJkYSB4OiB4ID09IDAsCiAgICAgICAgICAgICAgICByZXZlcnNlZChyZWxlYXNlKSwKICAgICAgICAgICAgKQogICAgICAgICkpCiAgICApCgogICAgIyBXZSBuZWVkIHRvICJ0cmljayIgdGhlIHNvcnRpbmcgYWxnb3JpdGhtIHRvIHB1dCAxLjAuZGV2MCBiZWZvcmUgMS4wYTAuCiAgICAjIFdlJ2xsIGRvIHRoaXMgYnkgYWJ1c2luZyB0aGUgcHJlIHNlZ21lbnQsIGJ1dCB3ZSBfb25seV8gd2FudCB0byBkbyB0aGlzCiAgICAjIGlmIHRoZXJlIGlzIG5vdCBhIHByZSBvciBhIHBvc3Qgc2VnbWVudC4gSWYgd2UgaGF2ZSBvbmUgb2YgdGhvc2UgdGhlbgogICAgIyB0aGUgbm9ybWFsIHNvcnRpbmcgcnVsZXMgd2lsbCBoYW5kbGUgdGhpcyBjYXNlIGNvcnJlY3RseS4KICAgIGlmIHByZSBpcyBOb25lIGFuZCBwb3N0IGlzIE5vbmUgYW5kIGRldiBpcyBub3QgTm9uZToKICAgICAgICBwcmUgPSAtSW5maW5pdHkKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHByZS1yZWxlYXNlIChleGNlcHQgYXMgbm90ZWQgYWJvdmUpIHNob3VsZCBzb3J0IGFmdGVyCiAgICAjIHRob3NlIHdpdGggb25lLgogICAgZWxpZiBwcmUgaXMgTm9uZToKICAgICAgICBwcmUgPSBJbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHBvc3Qgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBwb3N0IGlzIE5vbmU6CiAgICAgICAgcG9zdCA9IC1JbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGRldmVsb3BtZW50IHNlZ21lbnQgc2hvdWxkIHNvcnQgYWZ0ZXIgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBkZXYgaXMgTm9uZToKICAgICAgICBkZXYgPSBJbmZpbml0eQoKICAgIGlmIGxvY2FsIGlzIE5vbmU6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgbG9jYWwgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICAgICAgbG9jYWwgPSAtSW5maW5pdHkKICAgIGVsc2U6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRoIGEgbG9jYWwgc2VnbWVudCBuZWVkIHRoYXQgc2VnbWVudCBwYXJzZWQgdG8gaW1wbGVtZW50CiAgICAgICAgIyB0aGUgc29ydGluZyBydWxlcyBpbiBQRVA0NDAuCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBiZWZvcmUgbnVtZXJpYyBzZWdtZW50cwogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgbGV4aWNvZ3JhcGhpY2FsbHkKICAgICAgICAjIC0gTnVtZXJpYyBzZWdtZW50cyBzb3J0IG51bWVyaWNhbGx5CiAgICAgICAgIyAtIFNob3J0ZXIgdmVyc2lvbnMgc29ydCBiZWZvcmUgbG9uZ2VyIHZlcnNpb25zIHdoZW4gdGhlIHByZWZpeGVzCiAgICAgICAgIyAgIG1hdGNoIGV4YWN0bHkKICAgICAgICBsb2NhbCA9IHR1cGxlKAogICAgICAgICAgICAoaSwgIiIpIGlmIGlzaW5zdGFuY2UoaSwgaW50KSBlbHNlICgtSW5maW5pdHksIGkpCiAgICAgICAgICAgIGZvciBpIGluIGxvY2FsCiAgICAgICAgKQoKICAgIHJldHVybiBlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsClBLAwQUAAAAAAAAACEAyS1AJj6TAQA+kwEAQgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSMgY29kaW5nOiB1dGYtOAoiIiIKUGFja2FnZSByZXNvdXJjZSBBUEkKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgcmVzb3VyY2UgaXMgYSBsb2dpY2FsIGZpbGUgY29udGFpbmVkIHdpdGhpbiBhIHBhY2thZ2UsIG9yIGEgbG9naWNhbApzdWJkaXJlY3RvcnkgdGhlcmVvZi4gIFRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBleHBlY3RzIHJlc291cmNlIG5hbWVzCnRvIGhhdmUgdGhlaXIgcGF0aCBwYXJ0cyBzZXBhcmF0ZWQgd2l0aCBgYC9gYCwgKm5vdCogd2hhdGV2ZXIgdGhlIGxvY2FsCnBhdGggc2VwYXJhdG9yIGlzLiAgRG8gbm90IHVzZSBvcy5wYXRoIG9wZXJhdGlvbnMgdG8gbWFuaXB1bGF0ZSByZXNvdXJjZQpuYW1lcyBiZWluZyBwYXNzZWQgaW50byB0aGUgQVBJLgoKVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBub3JtYWwgZmlsZXN5c3RlbSBwYWNrYWdlcywKLmVnZyBmaWxlcywgYW5kIHVucGFja2VkIC5lZ2cgZmlsZXMuICBJdCBjYW4gYWxzbyB3b3JrIGluIGEgbGltaXRlZCB3YXkgd2l0aAouemlwIGZpbGVzIGFuZCB3aXRoIGN1c3RvbSBQRVAgMzAyIGxvYWRlcnMgdGhhdCBzdXBwb3J0IHRoZSBgYGdldF9kYXRhKClgYAptZXRob2QuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBpbwppbXBvcnQgdGltZQppbXBvcnQgcmUKaW1wb3J0IHR5cGVzCmltcG9ydCB6aXBmaWxlCmltcG9ydCB6aXBpbXBvcnQKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBzdGF0CmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IHBsaXN0bGliCmltcG9ydCBlbWFpbC5wYXJzZXIKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgaXRlcnRvb2xzCmZyb20gcGtndXRpbCBpbXBvcnQgZ2V0X2ltcG9ydGVyCgp0cnk6CiAgICBpbXBvcnQgX2ltcApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIFB5dGhvbiAzLjIgY29tcGF0aWJpbGl0eQogICAgaW1wb3J0IGltcCBhcyBfaW1wCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBzaXgKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IHVybGxpYiwgbWFwLCBmaWx0ZXIKCiMgY2FwdHVyZSB0aGVzZSB0byBieXBhc3Mgc2FuZGJveGluZwpmcm9tIG9zIGltcG9ydCB1dGltZQp0cnk6CiAgICBmcm9tIG9zIGltcG9ydCBta2RpciwgcmVuYW1lLCB1bmxpbmsKICAgIFdSSVRFX1NVUFBPUlQgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgbm8gd3JpdGUgc3VwcG9ydCwgcHJvYmFibHkgdW5kZXIgR0FFCiAgICBXUklURV9TVVBQT1JUID0gRmFsc2UKCmZyb20gb3MgaW1wb3J0IG9wZW4gYXMgb3Nfb3Blbgpmcm9tIG9zLnBhdGggaW1wb3J0IGlzZGlyLCBzcGxpdAoKdHJ5OgogICAgaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkgYXMgaW1wb3J0bGliX21hY2hpbmVyeQogICAgIyBhY2Nlc3MgYXR0cmlidXRlIHRvIGZvcmNlIGltcG9ydCB1bmRlciBkZWxheWVkIGltcG9ydCBtZWNoYW5pc21zLgogICAgaW1wb3J0bGliX21hY2hpbmVyeS5fX25hbWVfXwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5ID0gTm9uZQoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgYXBwZGlycwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwYWNrYWdpbmcKX19pbXBvcnRfXygncGlwLl92ZW5kb3IucGFja2FnaW5nLnZlcnNpb24nKQpfX2ltcG9ydF9fKCdwaXAuX3ZlbmRvci5wYWNrYWdpbmcuc3BlY2lmaWVycycpCl9faW1wb3J0X18oJ3BpcC5fdmVuZG9yLnBhY2thZ2luZy5yZXF1aXJlbWVudHMnKQpfX2ltcG9ydF9fKCdwaXAuX3ZlbmRvci5wYWNrYWdpbmcubWFya2VycycpCgoKaWYgKDMsIDApIDwgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgIG1zZyA9ICgKICAgICAgICAiU3VwcG9ydCBmb3IgUHl0aG9uIDMuMC0zLjIgaGFzIGJlZW4gZHJvcHBlZC4gRnV0dXJlIHZlcnNpb25zICIKICAgICAgICAid2lsbCBmYWlsIGhlcmUuIgogICAgKQogICAgd2FybmluZ3Mud2Fybihtc2cpCgojIGRlY2xhcmUgc29tZSBnbG9iYWxzIHRoYXQgd2lsbCBiZSBkZWZpbmVkIGxhdGVyIHRvCiMgc2F0aXNmeSB0aGUgbGludGVycy4KcmVxdWlyZSA9IE5vbmUKd29ya2luZ19zZXQgPSBOb25lCgoKY2xhc3MgUEVQNDQwV2FybmluZyhSdW50aW1lV2FybmluZyk6CiAgICAiIiIKICAgIFVzZWQgd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSB3aXRoIGEgdmVyc2lvbiBvciBzcGVjaWZpZXIgbm90IGNvbXBseWluZyB3aXRoCiAgICBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4ob2JqZWN0KToKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9faGFzaF9fKCkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA8IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2x0X18ob3RoZXIpCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPD0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbGVfXyhvdGhlcikKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA9PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19lcV9fKG90aGVyKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID49IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2dlX18ob3RoZXIpCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPiBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19ndF9fKG90aGVyKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpICE9IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX25lX18ob3RoZXIpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpW2tleV0KCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgY29tcG9uZW50X3JlID0gcmUuY29tcGlsZShyJyhcZCsgfCBbYS16XSsgfCBcLnwgLSknLCByZS5WRVJCT1NFKQogICAgICAgIHJlcGxhY2UgPSB7CiAgICAgICAgICAgICdwcmUnOiAnYycsCiAgICAgICAgICAgICdwcmV2aWV3JzogJ2MnLAogICAgICAgICAgICAnLSc6ICdmaW5hbC0nLAogICAgICAgICAgICAncmMnOiAnYycsCiAgICAgICAgICAgICdkZXYnOiAnQCcsCiAgICAgICAgfS5nZXQKCiAgICAgICAgZGVmIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMpOgogICAgICAgICAgICBmb3IgcGFydCBpbiBjb21wb25lbnRfcmUuc3BsaXQocyk6CiAgICAgICAgICAgICAgICBwYXJ0ID0gcmVwbGFjZShwYXJ0LCBwYXJ0KQogICAgICAgICAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydCA9PSAnLic6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHBhcnRbOjFdIGluICcwMTIzNDU2Nzg5JzoKICAgICAgICAgICAgICAgICAgICAjIHBhZCBmb3IgbnVtZXJpYyBjb21wYXJpc29uCiAgICAgICAgICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB5aWVsZCAnKicgKyBwYXJ0CgogICAgICAgICAgICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKICAgICAgICAgICAgeWllbGQgJypmaW5hbCcKCiAgICAgICAgZGVmIG9sZF9wYXJzZV92ZXJzaW9uKHMpOgogICAgICAgICAgICBwYXJ0cyA9IFtdCiAgICAgICAgICAgIGZvciBwYXJ0IGluIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMubG93ZXIoKSk6CiAgICAgICAgICAgICAgICBpZiBwYXJ0LnN0YXJ0c3dpdGgoJyonKToKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSAnLScgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKICAgICAgICAgICAgICAgICAgICBpZiBwYXJ0IDwgJypmaW5hbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gJypmaW5hbC0nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKICAgICAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICcwMDAwMDAwMCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCiAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHBhcnRzKQoKICAgICAgICAjIFdhcm4gZm9yIHVzZSBvZiB0aGlzIGZ1bmN0aW9uCiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgIllvdSBoYXZlIGl0ZXJhdGVkIG92ZXIgdGhlIHJlc3VsdCBvZiAiCiAgICAgICAgICAgICJwa2dfcmVzb3VyY2VzLnBhcnNlX3ZlcnNpb24uIFRoaXMgaXMgYSBsZWdhY3kgYmVoYXZpb3Igd2hpY2ggaXMgIgogICAgICAgICAgICAiaW5jb25zaXN0ZW50IHdpdGggdGhlIG5ldyB2ZXJzaW9uIGNsYXNzIGludHJvZHVjZWQgaW4gc2V0dXB0b29scyAiCiAgICAgICAgICAgICI4LjAuIEluIG1vc3QgY2FzZXMsIGNvbnZlcnNpb24gdG8gYSB0dXBsZSBpcyB1bm5lY2Vzc2FyeS4gRm9yICIKICAgICAgICAgICAgImNvbXBhcmlzb24gb2YgdmVyc2lvbnMsIHNvcnQgdGhlIFZlcnNpb24gaW5zdGFuY2VzIGRpcmVjdGx5LiBJZiAiCiAgICAgICAgICAgICJ5b3UgaGF2ZSBhbm90aGVyIHVzZSBjYXNlIHJlcXVpcmluZyB0aGUgdHVwbGUsIHBsZWFzZSBmaWxlIGEgIgogICAgICAgICAgICAiYnVnIHdpdGggdGhlIHNldHVwdG9vbHMgcHJvamVjdCBkZXNjcmliaW5nIHRoYXQgbmVlZC4iLAogICAgICAgICAgICBSdW50aW1lV2FybmluZywKICAgICAgICAgICAgc3RhY2tsZXZlbD0xLAogICAgICAgICkKCiAgICAgICAgZm9yIHBhcnQgaW4gb2xkX3BhcnNlX3ZlcnNpb24oc3RyKHNlbGYpKToKICAgICAgICAgICAgeWllbGQgcGFydAoKCmNsYXNzIFNldHVwdG9vbHNWZXJzaW9uKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKToKICAgIHBhc3MKCgpjbGFzcyBTZXR1cHRvb2xzTGVnYWN5VmVyc2lvbihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnaW5nLnZlcnNpb24uTGVnYWN5VmVyc2lvbik6CiAgICBwYXNzCgoKZGVmIHBhcnNlX3ZlcnNpb24odik6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFNldHVwdG9vbHNWZXJzaW9uKHYpCiAgICBleGNlcHQgcGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb246CiAgICAgICAgcmV0dXJuIFNldHVwdG9vbHNMZWdhY3lWZXJzaW9uKHYpCgoKX3N0YXRlX3ZhcnMgPSB7fQoKCmRlZiBfZGVjbGFyZV9zdGF0ZSh2YXJ0eXBlLCAqKmt3KToKICAgIGdsb2JhbHMoKS51cGRhdGUoa3cpCiAgICBfc3RhdGVfdmFycy51cGRhdGUoZGljdC5mcm9ta2V5cyhrdywgdmFydHlwZSkpCgoKZGVmIF9fZ2V0c3RhdGVfXygpOgogICAgc3RhdGUgPSB7fQogICAgZyA9IGdsb2JhbHMoKQogICAgZm9yIGssIHYgaW4gX3N0YXRlX3ZhcnMuaXRlbXMoKToKICAgICAgICBzdGF0ZVtrXSA9IGdbJ19zZ2V0XycgKyB2XShnW2tdKQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIF9fc2V0c3RhdGVfXyhzdGF0ZSk6CiAgICBnID0gZ2xvYmFscygpCiAgICBmb3IgaywgdiBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgIGdbJ19zc2V0XycgKyBfc3RhdGVfdmFyc1trXV0oaywgZ1trXSwgdikKICAgIHJldHVybiBzdGF0ZQoKCmRlZiBfc2dldF9kaWN0KHZhbCk6CiAgICByZXR1cm4gdmFsLmNvcHkoKQoKCmRlZiBfc3NldF9kaWN0KGtleSwgb2IsIHN0YXRlKToKICAgIG9iLmNsZWFyKCkKICAgIG9iLnVwZGF0ZShzdGF0ZSkKCgpkZWYgX3NnZXRfb2JqZWN0KHZhbCk6CiAgICByZXR1cm4gdmFsLl9fZ2V0c3RhdGVfXygpCgoKZGVmIF9zc2V0X29iamVjdChrZXksIG9iLCBzdGF0ZSk6CiAgICBvYi5fX3NldHN0YXRlX18oc3RhdGUpCgoKX3NnZXRfbm9uZSA9IF9zc2V0X25vbmUgPSBsYW1iZGEgKmFyZ3M6IE5vbmUKCgpkZWYgZ2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBtYXhpbXVtIGNvbXBhdGlibGUgdmVyc2lvbi4KCiAgICBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKSBub3JtYWxseSByZXBvcnRzIHRoZSBtaW5pbXVtIHZlcnNpb24KICAgIG9mIE1hYyBPUyBYIHRoYXQgd291bGQgYmUgcmVxdWlyZWQgdG8gKnVzZSogZXh0ZW5zaW9ucyBwcm9kdWNlZCBieQogICAgZGlzdHV0aWxzLiAgQnV0IHdoYXQgd2Ugd2FudCB3aGVuIGNoZWNraW5nIGNvbXBhdGliaWxpdHkgaXMgdG8ga25vdyB0aGUKICAgIHZlcnNpb24gb2YgTWFjIE9TIFggdGhhdCB3ZSBhcmUgKnJ1bm5pbmcqLiAgVG8gYWxsb3cgdXNhZ2Ugb2YgcGFja2FnZXMgdGhhdAogICAgZXhwbGljaXRseSByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBNYWMgT1MgWCwgd2UgbXVzdCBhbHNvIGtub3cgdGhlCiAgICBjdXJyZW50IHZlcnNpb24gb2YgdGhlIE9TLgoKICAgIElmIHRoaXMgY29uZGl0aW9uIG9jY3VycyBmb3IgYW55IG90aGVyIHBsYXRmb3JtIHdpdGggYSB2ZXJzaW9uIGluIGl0cwogICAgcGxhdGZvcm0gc3RyaW5ncywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZXh0ZW5kZWQgYWNjb3JkaW5nbHkuCiAgICAiIiIKICAgIHBsYXQgPSBnZXRfYnVpbGRfcGxhdGZvcm0oKQogICAgbSA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwbGF0KQogICAgaWYgbSBpcyBub3QgTm9uZSBhbmQgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgIHRyeToKICAgICAgICAgICAgcGxhdCA9ICdtYWNvc3gtJXMtJXMnICUgKCcuJy5qb2luKF9tYWNvc3hfdmVycygpWzoyXSksIG0uZ3JvdXAoMykpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgbm90IE1hYyBPUyBYCiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwbGF0CgoKX19hbGxfXyA9IFsKICAgICMgQmFzaWMgcmVzb3VyY2UgYWNjZXNzIGFuZCBkaXN0cmlidXRpb24vZW50cnkgcG9pbnQgZGlzY292ZXJ5CiAgICAncmVxdWlyZScsICdydW5fc2NyaXB0JywgJ2dldF9wcm92aWRlcicsICdnZXRfZGlzdHJpYnV0aW9uJywKICAgICdsb2FkX2VudHJ5X3BvaW50JywgJ2dldF9lbnRyeV9tYXAnLCAnZ2V0X2VudHJ5X2luZm8nLAogICAgJ2l0ZXJfZW50cnlfcG9pbnRzJywKICAgICdyZXNvdXJjZV9zdHJpbmcnLCAncmVzb3VyY2Vfc3RyZWFtJywgJ3Jlc291cmNlX2ZpbGVuYW1lJywKICAgICdyZXNvdXJjZV9saXN0ZGlyJywgJ3Jlc291cmNlX2V4aXN0cycsICdyZXNvdXJjZV9pc2RpcicsCgogICAgIyBFbnZpcm9ubWVudGFsIGNvbnRyb2wKICAgICdkZWNsYXJlX25hbWVzcGFjZScsICd3b3JraW5nX3NldCcsICdhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcicsCiAgICAnZmluZF9kaXN0cmlidXRpb25zJywgJ3NldF9leHRyYWN0aW9uX3BhdGgnLCAnY2xlYW51cF9yZXNvdXJjZXMnLAogICAgJ2dldF9kZWZhdWx0X2NhY2hlJywKCiAgICAjIFByaW1hcnkgaW1wbGVtZW50YXRpb24gY2xhc3NlcwogICAgJ0Vudmlyb25tZW50JywgJ1dvcmtpbmdTZXQnLCAnUmVzb3VyY2VNYW5hZ2VyJywKICAgICdEaXN0cmlidXRpb24nLCAnUmVxdWlyZW1lbnQnLCAnRW50cnlQb2ludCcsCgogICAgIyBFeGNlcHRpb25zCiAgICAnUmVzb2x1dGlvbkVycm9yJywgJ1ZlcnNpb25Db25mbGljdCcsICdEaXN0cmlidXRpb25Ob3RGb3VuZCcsCiAgICAnVW5rbm93bkV4dHJhJywgJ0V4dHJhY3Rpb25FcnJvcicsCgogICAgIyBXYXJuaW5ncwogICAgJ1BFUDQ0MFdhcm5pbmcnLAoKICAgICMgUGFyc2luZyBmdW5jdGlvbnMgYW5kIHN0cmluZyB1dGlsaXRpZXMKICAgICdwYXJzZV9yZXF1aXJlbWVudHMnLCAncGFyc2VfdmVyc2lvbicsICdzYWZlX25hbWUnLCAnc2FmZV92ZXJzaW9uJywKICAgICdnZXRfcGxhdGZvcm0nLCAnY29tcGF0aWJsZV9wbGF0Zm9ybXMnLCAneWllbGRfbGluZXMnLCAnc3BsaXRfc2VjdGlvbnMnLAogICAgJ3NhZmVfZXh0cmEnLCAndG9fZmlsZW5hbWUnLCAnaW52YWxpZF9tYXJrZXInLCAnZXZhbHVhdGVfbWFya2VyJywKCiAgICAjIGZpbGVzeXN0ZW0gdXRpbGl0aWVzCiAgICAnZW5zdXJlX2RpcmVjdG9yeScsICdub3JtYWxpemVfcGF0aCcsCgogICAgIyBEaXN0cmlidXRpb24gInByZWNlZGVuY2UiIGNvbnN0YW50cwogICAgJ0VHR19ESVNUJywgJ0JJTkFSWV9ESVNUJywgJ1NPVVJDRV9ESVNUJywgJ0NIRUNLT1VUX0RJU1QnLCAnREVWRUxPUF9ESVNUJywKCiAgICAjICJQcm92aWRlciIgaW50ZXJmYWNlcywgaW1wbGVtZW50YXRpb25zLCBhbmQgcmVnaXN0cmF0aW9uL2xvb2t1cCBBUElzCiAgICAnSU1ldGFkYXRhUHJvdmlkZXInLCAnSVJlc291cmNlUHJvdmlkZXInLCAnRmlsZU1ldGFkYXRhJywKICAgICdQYXRoTWV0YWRhdGEnLCAnRWdnTWV0YWRhdGEnLCAnRW1wdHlQcm92aWRlcicsICdlbXB0eV9wcm92aWRlcicsCiAgICAnTnVsbFByb3ZpZGVyJywgJ0VnZ1Byb3ZpZGVyJywgJ0RlZmF1bHRQcm92aWRlcicsICdaaXBQcm92aWRlcicsCiAgICAncmVnaXN0ZXJfZmluZGVyJywgJ3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyJywgJ3JlZ2lzdGVyX2xvYWRlcl90eXBlJywKICAgICdmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMnLCAnZ2V0X2ltcG9ydGVyJywKCiAgICAjIERlcHJlY2F0ZWQvYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5CiAgICAncnVuX21haW4nLCAnQXZhaWxhYmxlRGlzdHJpYnV0aW9ucycsCl0KCgpjbGFzcyBSZXNvbHV0aW9uRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkFic3RyYWN0IGJhc2UgZm9yIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBlcnJvcnMiIiIKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgcmVwcihzZWxmLmFyZ3MpCgoKY2xhc3MgVmVyc2lvbkNvbmZsaWN0KFJlc29sdXRpb25FcnJvcik6CiAgICAiIiIKICAgIEFuIGFscmVhZHktaW5zdGFsbGVkIHZlcnNpb24gY29uZmxpY3RzIHdpdGggdGhlIHJlcXVlc3RlZCB2ZXJzaW9uLgoKICAgIFNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uIGFuZCB0aGUgcmVxdWVzdGVkCiAgICBSZXF1aXJlbWVudC4KICAgICIiIgoKICAgIF90ZW1wbGF0ZSA9ICJ7c2VsZi5kaXN0fSBpcyBpbnN0YWxsZWQgYnV0IHtzZWxmLnJlcX0gaXMgcmVxdWlyZWQiCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGlzdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMV0KCiAgICBkZWYgcmVwb3J0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90ZW1wbGF0ZS5mb3JtYXQoKipsb2NhbHMoKSkKCiAgICBkZWYgd2l0aF9jb250ZXh0KHNlbGYsIHJlcXVpcmVkX2J5KToKICAgICAgICAiIiIKICAgICAgICBJZiByZXF1aXJlZF9ieSBpcyBub24tZW1wdHksIHJldHVybiBhIHZlcnNpb24gb2Ygc2VsZiB0aGF0IGlzIGEKICAgICAgICBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCByZXF1aXJlZF9ieToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICBhcmdzID0gc2VsZi5hcmdzICsgKHJlcXVpcmVkX2J5LCkKICAgICAgICByZXR1cm4gQ29udGV4dHVhbFZlcnNpb25Db25mbGljdCgqYXJncykKCgpjbGFzcyBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0KFZlcnNpb25Db25mbGljdCk6CiAgICAiIiIKICAgIEEgVmVyc2lvbkNvbmZsaWN0IHRoYXQgYWNjZXB0cyBhIHRoaXJkIHBhcmFtZXRlciwgdGhlIHNldCBvZiB0aGUKICAgIHJlcXVpcmVtZW50cyB0aGF0IHJlcXVpcmVkIHRoZSBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uLgogICAgIiIiCgogICAgX3RlbXBsYXRlID0gVmVyc2lvbkNvbmZsaWN0Ll90ZW1wbGF0ZSArICcgYnkge3NlbGYucmVxdWlyZWRfYnl9JwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVkX2J5KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMl0KCgpjbGFzcyBEaXN0cmlidXRpb25Ob3RGb3VuZChSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiQSByZXF1ZXN0ZWQgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQiIiIKCiAgICBfdGVtcGxhdGUgPSAoIlRoZSAne3NlbGYucmVxfScgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQgIgogICAgICAgICAgICAgICAgICJhbmQgaXMgcmVxdWlyZWQgYnkge3NlbGYucmVxdWlyZXJzX3N0cn0iKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZXJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlcnNfc3RyKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLnJlcXVpcmVyczoKICAgICAgICAgICAgcmV0dXJuICd0aGUgYXBwbGljYXRpb24nCiAgICAgICAgcmV0dXJuICcsICcuam9pbihzZWxmLnJlcXVpcmVycykKCiAgICBkZWYgcmVwb3J0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90ZW1wbGF0ZS5mb3JtYXQoKipsb2NhbHMoKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5yZXBvcnQoKQoKCmNsYXNzIFVua25vd25FeHRyYShSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiRGlzdHJpYnV0aW9uIGRvZXNuJ3QgaGF2ZSBhbiAiZXh0cmEgZmVhdHVyZSIgb2YgdGhlIGdpdmVuIG5hbWUiIiIKCgpfcHJvdmlkZXJfZmFjdG9yaWVzID0ge30KClBZX01BSk9SID0gc3lzLnZlcnNpb25bOjNdCkVHR19ESVNUID0gMwpCSU5BUllfRElTVCA9IDIKU09VUkNFX0RJU1QgPSAxCkNIRUNLT1VUX0RJU1QgPSAwCkRFVkVMT1BfRElTVCA9IC0xCgoKZGVmIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl90eXBlLCBwcm92aWRlcl9mYWN0b3J5KToKICAgICIiIlJlZ2lzdGVyIGBwcm92aWRlcl9mYWN0b3J5YCB0byBtYWtlIHByb3ZpZGVycyBmb3IgYGxvYWRlcl90eXBlYAoKICAgIGBsb2FkZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyIGBgbW9kdWxlLl9fbG9hZGVyX19gYCwKICAgIGFuZCBgcHJvdmlkZXJfZmFjdG9yeWAgaXMgYSBmdW5jdGlvbiB0aGF0LCBwYXNzZWQgYSAqbW9kdWxlKiBvYmplY3QsCiAgICByZXR1cm5zIGFuIGBgSVJlc291cmNlUHJvdmlkZXJgYCBmb3IgdGhhdCBtb2R1bGUuCiAgICAiIiIKICAgIF9wcm92aWRlcl9mYWN0b3JpZXNbbG9hZGVyX3R5cGVdID0gcHJvdmlkZXJfZmFjdG9yeQoKCmRlZiBnZXRfcHJvdmlkZXIobW9kdWxlT3JSZXEpOgogICAgIiIiUmV0dXJuIGFuIElSZXNvdXJjZVByb3ZpZGVyIGZvciB0aGUgbmFtZWQgbW9kdWxlIG9yIHJlcXVpcmVtZW50IiIiCiAgICBpZiBpc2luc3RhbmNlKG1vZHVsZU9yUmVxLCBSZXF1aXJlbWVudCk6CiAgICAgICAgcmV0dXJuIHdvcmtpbmdfc2V0LmZpbmQobW9kdWxlT3JSZXEpIG9yIHJlcXVpcmUoc3RyKG1vZHVsZU9yUmVxKSlbMF0KICAgIHRyeToKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBfX2ltcG9ydF9fKG1vZHVsZU9yUmVxKQogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQogICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgIHJldHVybiBfZmluZF9hZGFwdGVyKF9wcm92aWRlcl9mYWN0b3JpZXMsIGxvYWRlcikobW9kdWxlKQoKCmRlZiBfbWFjb3N4X3ZlcnMoX2NhY2hlPVtdKToKICAgIGlmIG5vdCBfY2FjaGU6CiAgICAgICAgdmVyc2lvbiA9IHBsYXRmb3JtLm1hY192ZXIoKVswXQogICAgICAgICMgZmFsbGJhY2sgZm9yIE1hY1BvcnRzCiAgICAgICAgaWYgdmVyc2lvbiA9PSAnJzoKICAgICAgICAgICAgcGxpc3QgPSAnL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9TeXN0ZW1WZXJzaW9uLnBsaXN0JwogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwbGlzdCk6CiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHBsaXN0bGliLCAncmVhZFBsaXN0Jyk6CiAgICAgICAgICAgICAgICAgICAgcGxpc3RfY29udGVudCA9IHBsaXN0bGliLnJlYWRQbGlzdChwbGlzdCkKICAgICAgICAgICAgICAgICAgICBpZiAnUHJvZHVjdFZlcnNpb24nIGluIHBsaXN0X2NvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBwbGlzdF9jb250ZW50WydQcm9kdWN0VmVyc2lvbiddCgogICAgICAgIF9jYWNoZS5hcHBlbmQodmVyc2lvbi5zcGxpdCgnLicpKQogICAgcmV0dXJuIF9jYWNoZVswXQoKCmRlZiBfbWFjb3N4X2FyY2gobWFjaGluZSk6CiAgICByZXR1cm4geydQb3dlclBDJzogJ3BwYycsICdQb3dlcl9NYWNpbnRvc2gnOiAncHBjJ30uZ2V0KG1hY2hpbmUsIG1hY2hpbmUpCgoKZGVmIGdldF9idWlsZF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBzdHJpbmcgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGRpc3RyaWJ1dGlvbnMKCiAgICBYWFggQ3VycmVudGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgYGBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKWBgLCBidXQgaXQKICAgIG5lZWRzIHNvbWUgaGFja3MgZm9yIExpbnV4IGFuZCBNYWMgT1MgWC4KICAgICIiIgogICAgdHJ5OgogICAgICAgICMgUHl0aG9uIDIuNyBvciA+PTMuMgogICAgICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0KICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KCiAgICBwbGF0ID0gZ2V0X3BsYXRmb3JtKCkKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiBhbmQgbm90IHBsYXQuc3RhcnRzd2l0aCgnbWFjb3N4LScpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyc2lvbiA9IF9tYWNvc3hfdmVycygpCiAgICAgICAgICAgIG1hY2hpbmUgPSBvcy51bmFtZSgpWzRdLnJlcGxhY2UoIiAiLCAiXyIpCiAgICAgICAgICAgIHJldHVybiAibWFjb3N4LSVkLiVkLSVzIiAlIChpbnQodmVyc2lvblswXSksIGludCh2ZXJzaW9uWzFdKSwKICAgICAgICAgICAgICAgIF9tYWNvc3hfYXJjaChtYWNoaW5lKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBpZiBzb21lb25lIGlzIHJ1bm5pbmcgYSBub24tTWFjIGRhcndpbiBzeXN0ZW0sIHRoaXMgd2lsbCBmYWxsCiAgICAgICAgICAgICMgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGxhdAoKCm1hY29zVmVyc2lvblN0cmluZyA9IHJlLmNvbXBpbGUociJtYWNvc3gtKFxkKylcLihcZCspLSguKikiKQpkYXJ3aW5WZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyImRhcndpbi0oXGQrKVwuKFxkKylcLihcZCspLSguKikiKQojIFhYWCBiYWNrd2FyZCBjb21wYXQKZ2V0X3BsYXRmb3JtID0gZ2V0X2J1aWxkX3BsYXRmb3JtCgoKZGVmIGNvbXBhdGlibGVfcGxhdGZvcm1zKHByb3ZpZGVkLCByZXF1aXJlZCk6CiAgICAiIiJDYW4gY29kZSBmb3IgdGhlIGBwcm92aWRlZGAgcGxhdGZvcm0gcnVuIG9uIHRoZSBgcmVxdWlyZWRgIHBsYXRmb3JtPwoKICAgIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgcGxhdGZvcm0gaXMgYGBOb25lYGAsIG9yIHRoZSBwbGF0Zm9ybXMgYXJlIGVxdWFsLgoKICAgIFhYWCBOZWVkcyBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgTGludXggYW5kIG90aGVyIHVuaXh5IE9TZXMuCiAgICAiIiIKICAgIGlmIHByb3ZpZGVkIGlzIE5vbmUgb3IgcmVxdWlyZWQgaXMgTm9uZSBvciBwcm92aWRlZCA9PSByZXF1aXJlZDoKICAgICAgICAjIGVhc3kgY2FzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBNYWMgT1MgWCBzcGVjaWFsIGNhc2VzCiAgICByZXFNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocmVxdWlyZWQpCiAgICBpZiByZXFNYWM6CiAgICAgICAgcHJvdk1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKCiAgICAgICAgIyBpcyB0aGlzIGEgTWFjIHBhY2thZ2U/CiAgICAgICAgaWYgbm90IHByb3ZNYWM6CiAgICAgICAgICAgICMgdGhpcyBpcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgcGFja2FnZXMgYnVpbHQgYmVmb3JlCiAgICAgICAgICAgICMgc2V0dXB0b29scyAwLjYuIEFsbCBwYWNrYWdlcyBidWlsdCBhZnRlciB0aGlzIHBvaW50IHdpbGwKICAgICAgICAgICAgIyB1c2UgdGhlIG5ldyBtYWNvc3ggZGVzaWduYXRpb24uCiAgICAgICAgICAgIHByb3ZEYXJ3aW4gPSBkYXJ3aW5WZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQogICAgICAgICAgICBpZiBwcm92RGFyd2luOgogICAgICAgICAgICAgICAgZHZlcnNpb24gPSBpbnQocHJvdkRhcndpbi5ncm91cCgxKSkKICAgICAgICAgICAgICAgIG1hY29zdmVyc2lvbiA9ICIlcy4lcyIgJSAocmVxTWFjLmdyb3VwKDEpLCByZXFNYWMuZ3JvdXAoMikpCiAgICAgICAgICAgICAgICBpZiBkdmVyc2lvbiA9PSA3IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjMiIG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgZHZlcnNpb24gPT0gOCBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC40IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAjIGVnZyBpc24ndCBtYWNvc3ggb3IgbGVnYWN5IGRhcndpbgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBhcmUgdGhleSB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uIGFuZCBtYWNoaW5lIHR5cGU/CiAgICAgICAgaWYgcHJvdk1hYy5ncm91cCgxKSAhPSByZXFNYWMuZ3JvdXAoMSkgb3IgXAogICAgICAgICAgICAgICAgcHJvdk1hYy5ncm91cCgzKSAhPSByZXFNYWMuZ3JvdXAoMyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGlzIHRoZSByZXF1aXJlZCBPUyBtYWpvciB1cGRhdGUgPj0gdGhlIHByb3ZpZGVkIG9uZT8KICAgICAgICBpZiBpbnQocHJvdk1hYy5ncm91cCgyKSkgPiBpbnQocmVxTWFjLmdyb3VwKDIpKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBYWFggTGludXggYW5kIG90aGVyIHBsYXRmb3Jtcycgc3BlY2lhbCBjYXNlcyBzaG91bGQgZ28gaGVyZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIHJ1bl9zY3JpcHQoZGlzdF9zcGVjLCBzY3JpcHRfbmFtZSk6CiAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGBkaXN0X3NwZWNgIGFuZCBydW4gaXRzIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCiAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgIG5zLmNsZWFyKCkKICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgcmVxdWlyZShkaXN0X3NwZWMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQoKCiMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQpydW5fbWFpbiA9IHJ1bl9zY3JpcHQKCgpkZWYgZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KToKICAgICIiIlJldHVybiBhIGN1cnJlbnQgZGlzdHJpYnV0aW9uIG9iamVjdCBmb3IgYSBSZXF1aXJlbWVudCBvciBzdHJpbmciIiIKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgZGlzdCA9IFJlcXVpcmVtZW50LnBhcnNlKGRpc3QpCiAgICBpZiBpc2luc3RhbmNlKGRpc3QsIFJlcXVpcmVtZW50KToKICAgICAgICBkaXN0ID0gZ2V0X3Byb3ZpZGVyKGRpc3QpCiAgICBpZiBub3QgaXNpbnN0YW5jZShkaXN0LCBEaXN0cmlidXRpb24pOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRXhwZWN0ZWQgc3RyaW5nLCBSZXF1aXJlbWVudCwgb3IgRGlzdHJpYnV0aW9uIiwgZGlzdCkKICAgIHJldHVybiBkaXN0CgoKZGVmIGxvYWRfZW50cnlfcG9pbnQoZGlzdCwgZ3JvdXAsIG5hbWUpOgogICAgIiIiUmV0dXJuIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIGZvciBgZGlzdGAgb3IgcmFpc2UgSW1wb3J0RXJyb3IiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmxvYWRfZW50cnlfcG9pbnQoZ3JvdXAsIG5hbWUpCgoKZGVmIGdldF9lbnRyeV9tYXAoZGlzdCwgZ3JvdXA9Tm9uZSk6CiAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfbWFwKGdyb3VwKQoKCmRlZiBnZXRfZW50cnlfaW5mbyhkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQoKCmNsYXNzIElNZXRhZGF0YVByb3ZpZGVyOgogICAgZGVmIGhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlJ3MgZGlzdHJpYnV0aW9uIGNvbnRhaW4gdGhlIG5hbWVkIG1ldGFkYXRhPyIiIgoKICAgIGRlZiBnZXRfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgIiIiVGhlIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKICAgICAgICAiIiJZaWVsZCBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBsaXN0IG9mIG5vbi1ibGFuayBub24tY29tbWVudCBsaW5lcwoKICAgICAgIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQgZnJvbSBlYWNoIGxpbmUsIGFuZCBsaW5lcwogICAgICAgd2l0aCBgYCNgYCBhcyB0aGUgZmlyc3Qgbm9uLWJsYW5rIGNoYXJhY3RlciBhcmUgb21pdHRlZC4iIiIKCiAgICBkZWYgbWV0YWRhdGFfaXNkaXIobmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIG1ldGFkYXRhIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihuYW1lKToKICAgICAgICAiIiJMaXN0IG9mIG1ldGFkYXRhIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCiAgICBkZWYgcnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICAiIiJFeGVjdXRlIHRoZSBuYW1lZCBzY3JpcHQgaW4gdGhlIHN1cHBsaWVkIG5hbWVzcGFjZSBkaWN0aW9uYXJ5IiIiCgoKY2xhc3MgSVJlc291cmNlUHJvdmlkZXIoSU1ldGFkYXRhUHJvdmlkZXIpOgogICAgIiIiQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0obWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBoYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSBjb250YWluIHRoZSBuYW1lZCByZXNvdXJjZT8iIiIKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IG9mIHJlc291cmNlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCgpjbGFzcyBXb3JraW5nU2V0KG9iamVjdCk6CiAgICAiIiJBIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRpc3RyaWJ1dGlvbnMgb24gc3lzLnBhdGggKG9yIGEgc2ltaWxhciBsaXN0KSIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnRyaWVzPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSB3b3JraW5nIHNldCBmcm9tIGxpc3Qgb2YgcGF0aCBlbnRyaWVzIChkZWZhdWx0PXN5cy5wYXRoKSIiIgogICAgICAgIHNlbGYuZW50cmllcyA9IFtdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ge30KICAgICAgICBzZWxmLmJ5X2tleSA9IHt9CiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBbXQoKICAgICAgICBpZiBlbnRyaWVzIGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJpZXMgPSBzeXMucGF0aAoKICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKICAgICAgICAgICAgc2VsZi5hZGRfZW50cnkoZW50cnkpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX21hc3RlcihjbHMpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgdGhlIG1hc3RlciB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICB3cyA9IGNscygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIF9fbWFpbl9fIGltcG9ydCBfX3JlcXVpcmVzX18KICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICMgVGhlIG1haW4gcHJvZ3JhbSBkb2VzIG5vdCBsaXN0IGFueSByZXF1aXJlbWVudHMKICAgICAgICAgICAgcmV0dXJuIHdzCgogICAgICAgICMgZW5zdXJlIHRoZSByZXF1aXJlbWVudHMgYXJlIG1ldAogICAgICAgIHRyeToKICAgICAgICAgICAgd3MucmVxdWlyZShfX3JlcXVpcmVzX18pCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDoKICAgICAgICAgICAgcmV0dXJuIGNscy5fYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoX19yZXF1aXJlc19fKQoKICAgICAgICByZXR1cm4gd3MKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoY2xzLCByZXFfc3BlYyk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSB3b3JraW5nIHNldCBmcm9tIGEgcmVxdWlyZW1lbnQgc3BlYy4gUmV3cml0ZXMgc3lzLnBhdGguCiAgICAgICAgIiIiCiAgICAgICAgIyB0cnkgaXQgd2l0aG91dCBkZWZhdWx0cyBhbHJlYWR5IG9uIHN5cy5wYXRoCiAgICAgICAgIyBieSBzdGFydGluZyB3aXRoIGFuIGVtcHR5IHBhdGgKICAgICAgICB3cyA9IGNscyhbXSkKICAgICAgICByZXFzID0gcGFyc2VfcmVxdWlyZW1lbnRzKHJlcV9zcGVjKQogICAgICAgIGRpc3RzID0gd3MucmVzb2x2ZShyZXFzLCBFbnZpcm9ubWVudCgpKQogICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICB3cy5hZGQoZGlzdCkKCiAgICAgICAgIyBhZGQgYW55IG1pc3NpbmcgZW50cmllcyBmcm9tIHN5cy5wYXRoCiAgICAgICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgICAgICBpZiBlbnRyeSBub3QgaW4gd3MuZW50cmllczoKICAgICAgICAgICAgICAgIHdzLmFkZF9lbnRyeShlbnRyeSkKCiAgICAgICAgIyB0aGVuIGNvcHkgYmFjayB0byBzeXMucGF0aAogICAgICAgIHN5cy5wYXRoWzpdID0gd3MuZW50cmllcwogICAgICAgIHJldHVybiB3cwoKICAgIGRlZiBhZGRfZW50cnkoc2VsZiwgZW50cnkpOgogICAgICAgICIiIkFkZCBhIHBhdGggaXRlbSB0byBgYC5lbnRyaWVzYGAsIGZpbmRpbmcgYW55IGRpc3RyaWJ1dGlvbnMgb24gaXQKCiAgICAgICAgYGBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpYGAgaXMgdXNlZCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMKICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXRoIGVudHJ5LCBhbmQgdGhleSBhcmUgYWRkZWQuICBgZW50cnlgIGlzCiAgICAgICAgYWx3YXlzIGFwcGVuZGVkIHRvIGBgLmVudHJpZXNgYCwgZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuCiAgICAgICAgKFRoaXMgaXMgYmVjYXVzZSBgYHN5cy5wYXRoYGAgY2FuIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUgbW9yZSB0aGFuCiAgICAgICAgb25jZSwgYW5kIHRoZSBgYC5lbnRyaWVzYGAgb2YgdGhlIGBgc3lzLnBhdGhgYCBXb3JraW5nU2V0IHNob3VsZCBhbHdheXMKICAgICAgICBlcXVhbCBgYHN5cy5wYXRoYGAuKQogICAgICAgICIiIgogICAgICAgIHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBzZWxmLmVudHJpZXMuYXBwZW5kKGVudHJ5KQogICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSk6CiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QsIGVudHJ5LCBGYWxzZSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlRydWUgaWYgYGRpc3RgIGlzIHRoZSBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciBpdHMgcHJvamVjdCIiIgogICAgICAgIHJldHVybiBzZWxmLmJ5X2tleS5nZXQoZGlzdC5rZXkpID09IGRpc3QKCiAgICBkZWYgZmluZChzZWxmLCByZXEpOgogICAgICAgICIiIkZpbmQgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgcmVxdWlyZW1lbnQgYHJlcWAKCiAgICAgICAgSWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCB0aGlzCiAgICAgICAgcmV0dXJucyBpdCBhcyBsb25nIGFzIGl0IG1lZXRzIHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllZCBieQogICAgICAgIGByZXFgLiAgQnV0LCBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcHJvamVjdCBhbmQgaXQKICAgICAgICBkb2VzICpub3QqIG1lZXQgdGhlIGByZXFgIHJlcXVpcmVtZW50LCBgYFZlcnNpb25Db25mbGljdGBgIGlzIHJhaXNlZC4KICAgICAgICBJZiB0aGVyZSBpcyBubyBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIGBgTm9uZWBgCiAgICAgICAgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmUgYW5kIGRpc3Qgbm90IGluIHJlcToKICAgICAgICAgICAgIyBYWFggYWRkIG1vcmUgaW5mbwogICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCwgcmVxKQogICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIGl0ZXJfZW50cnlfcG9pbnRzKHNlbGYsIGdyb3VwLCBuYW1lPU5vbmUpOgogICAgICAgICIiIllpZWxkIGVudHJ5IHBvaW50IG9iamVjdHMgZnJvbSBgZ3JvdXBgIG1hdGNoaW5nIGBuYW1lYAoKICAgICAgICBJZiBgbmFtZWAgaXMgTm9uZSwgeWllbGRzIGFsbCBlbnRyeSBwb2ludHMgaW4gYGdyb3VwYCBmcm9tIGFsbAogICAgICAgIGRpc3RyaWJ1dGlvbnMgaW4gdGhlIHdvcmtpbmcgc2V0LCBvdGhlcndpc2Ugb25seSBvbmVzIG1hdGNoaW5nCiAgICAgICAgYm90aCBgZ3JvdXBgIGFuZCBgbmFtZWAgYXJlIHlpZWxkZWQgKGluIGRpc3RyaWJ1dGlvbiBvcmRlcikuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZjoKICAgICAgICAgICAgZW50cmllcyA9IGRpc3QuZ2V0X2VudHJ5X21hcChncm91cCkKICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZm9yIGVwIGluIGVudHJpZXMudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZXAKICAgICAgICAgICAgZWxpZiBuYW1lIGluIGVudHJpZXM6CiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyaWVzW25hbWVdCgogICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgcmVxdWlyZXMsIHNjcmlwdF9uYW1lKToKICAgICAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGZvciBgcmVxdWlyZXNgIGFuZCBydW4gYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgICAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICAgICAgbmFtZSA9IG5zWydfX25hbWVfXyddCiAgICAgICAgbnMuY2xlYXIoKQogICAgICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgICAgIHNlbGYucmVxdWlyZShyZXF1aXJlcylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgZm9yIG5vbi1kdXBsaWNhdGUgcHJvamVjdHMgaW4gdGhlIHdvcmtpbmcgc2V0CgogICAgICAgIFRoZSB5aWVsZCBvcmRlciBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGl0ZW1zJyBwYXRoIGVudHJpZXMgd2VyZQogICAgICAgIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBzZWVuID0ge30KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmVudHJpZXM6CiAgICAgICAgICAgIGlmIGl0ZW0gbm90IGluIHNlbGYuZW50cnlfa2V5czoKICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBhIGNhY2hlIGlzc3VlCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmVudHJ5X2tleXNbaXRlbV06CiAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2VlbltrZXldID0gMQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuYnlfa2V5W2tleV0KCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QsIGVudHJ5PU5vbmUsIGluc2VydD1UcnVlLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHdvcmtpbmcgc2V0LCBhc3NvY2lhdGVkIHdpdGggYGVudHJ5YAoKICAgICAgICBJZiBgZW50cnlgIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgYGAubG9jYXRpb25gYCBvZiBgZGlzdGAuCiAgICAgICAgT24gZXhpdCBmcm9tIHRoaXMgcm91dGluZSwgYGVudHJ5YCBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSB3b3JraW5nCiAgICAgICAgc2V0J3MgYGAuZW50cmllc2BgIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSBwcmVzZW50KS4KCiAgICAgICAgYGRpc3RgIGlzIG9ubHkgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGlmIGl0J3MgZm9yIGEgcHJvamVjdCB0aGF0CiAgICAgICAgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBkaXN0cmlidXRpb24gaW4gdGhlIHNldCwgdW5sZXNzIGByZXBsYWNlPVRydWVgLgogICAgICAgIElmIGl0J3MgYWRkZWQsIGFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgYHN1YnNjcmliZSgpYGAgbWV0aG9kCiAgICAgICAgd2lsbCBiZSBjYWxsZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaW5zZXJ0OgogICAgICAgICAgICBkaXN0Lmluc2VydF9vbihzZWxmLmVudHJpZXMsIGVudHJ5LCByZXBsYWNlPXJlcGxhY2UpCgogICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJ5ID0gZGlzdC5sb2NhdGlvbgogICAgICAgIGtleXMgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSwgW10pCiAgICAgICAga2V5czIgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChkaXN0LmxvY2F0aW9uLCBbXSkKICAgICAgICBpZiBub3QgcmVwbGFjZSBhbmQgZGlzdC5rZXkgaW4gc2VsZi5ieV9rZXk6CiAgICAgICAgICAgICMgaWdub3JlIGhpZGRlbiBkaXN0cm9zCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmJ5X2tleVtkaXN0LmtleV0gPSBkaXN0CiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXM6CiAgICAgICAgICAgIGtleXMuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzMjoKICAgICAgICAgICAga2V5czIuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIHNlbGYuX2FkZGVkX25ldyhkaXN0KQoKICAgIGRlZiByZXNvbHZlKHNlbGYsIHJlcXVpcmVtZW50cywgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLAogICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPUZhbHNlKToKICAgICAgICAiIiJMaXN0IGFsbCBkaXN0cmlidXRpb25zIG5lZWRlZCB0byAocmVjdXJzaXZlbHkpIG1lZXQgYHJlcXVpcmVtZW50c2AKCiAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzLiAgYGVudmAsCiAgICAgICAgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAgaW5zdGFuY2UuICBJZgogICAgICAgIG5vdCBzdXBwbGllZCwgaXQgZGVmYXVsdHMgdG8gYWxsIGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIHdpdGhpbiBhbnkKICAgICAgICBlbnRyeSBvciBkaXN0cmlidXRpb24gaW4gdGhlIHdvcmtpbmcgc2V0LiAgYGluc3RhbGxlcmAsIGlmIHN1cHBsaWVkLAogICAgICAgIHdpbGwgYmUgaW52b2tlZCB3aXRoIGVhY2ggcmVxdWlyZW1lbnQgdGhhdCBjYW5ub3QgYmUgbWV0IGJ5IGFuCiAgICAgICAgYWxyZWFkeS1pbnN0YWxsZWQgZGlzdHJpYnV0aW9uOyBpdCBzaG91bGQgcmV0dXJuIGEgYGBEaXN0cmlidXRpb25gYCBvcgogICAgICAgIGBgTm9uZWBgLgoKICAgICAgICBVbmxlc3MgYHJlcGxhY2VfY29uZmxpY3Rpbmc9VHJ1ZWAsIHJhaXNlcyBhIFZlcnNpb25Db25mbGljdCBleGNlcHRpb24gaWYKICAgICAgICBhbnkgcmVxdWlyZW1lbnRzIGFyZSBmb3VuZCBvbiB0aGUgcGF0aCB0aGF0IGhhdmUgdGhlIGNvcnJlY3QgbmFtZSBidXQKICAgICAgICB0aGUgd3JvbmcgdmVyc2lvbi4gIE90aGVyd2lzZSwgaWYgYW4gYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQgaXQgd2lsbCBiZQogICAgICAgIGludm9rZWQgdG8gb2J0YWluIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIHJlcXVpcmVtZW50IGFuZCBhY3RpdmF0ZQogICAgICAgIGl0LgogICAgICAgICIiIgoKICAgICAgICAjIHNldCB1cCB0aGUgc3RhY2sKICAgICAgICByZXF1aXJlbWVudHMgPSBsaXN0KHJlcXVpcmVtZW50cylbOjotMV0KICAgICAgICAjIHNldCBvZiBwcm9jZXNzZWQgcmVxdWlyZW1lbnRzCiAgICAgICAgcHJvY2Vzc2VkID0ge30KICAgICAgICAjIGtleSAtPiBkaXN0CiAgICAgICAgYmVzdCA9IHt9CiAgICAgICAgdG9fYWN0aXZhdGUgPSBbXQoKICAgICAgICByZXFfZXh0cmFzID0gX1JlcUV4dHJhcygpCgogICAgICAgICMgTWFwcGluZyBvZiByZXF1aXJlbWVudCB0byBzZXQgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IHJlcXVpcmVkIGl0OwogICAgICAgICMgdXNlZnVsIGZvciByZXBvcnRpbmcgaW5mbyBhYm91dCBjb25mbGljdHMuCiAgICAgICAgcmVxdWlyZWRfYnkgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChzZXQpCgogICAgICAgIHdoaWxlIHJlcXVpcmVtZW50czoKICAgICAgICAgICAgIyBwcm9jZXNzIGRlcGVuZGVuY2llcyBicmVhZHRoLWZpcnN0CiAgICAgICAgICAgIHJlcSA9IHJlcXVpcmVtZW50cy5wb3AoMCkKICAgICAgICAgICAgaWYgcmVxIGluIHByb2Nlc3NlZDoKICAgICAgICAgICAgICAgICMgSWdub3JlIGN5Y2xpYyBvciByZWR1bmRhbnQgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgbm90IHJlcV9leHRyYXMubWFya2Vyc19wYXNzKHJlcSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZGlzdCA9IGJlc3QuZ2V0KHJlcS5rZXkpCiAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgRmluZCB0aGUgYmVzdCBkaXN0cmlidXRpb24gYW5kIGFkZCBpdCB0byB0aGUgbWFwCiAgICAgICAgICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCiAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmUgb3IgKGRpc3Qgbm90IGluIHJlcSBhbmQgcmVwbGFjZV9jb25mbGljdGluZyk6CiAgICAgICAgICAgICAgICAgICAgd3MgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgaWYgZW52IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIGFuIGVtcHR5IGVudmlyb25tZW50IGFuZCB3b3JraW5nc2V0IHRvIGF2b2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSBmdXJ0aGVyIGNvbmZsaWN0cyB3aXRoIHRoZSBjb25mbGljdGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXN0cmlidXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KFtdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MgPSBXb3JraW5nU2V0KFtdKQogICAgICAgICAgICAgICAgICAgIGRpc3QgPSBiZXN0W3JlcS5rZXldID0gZW52LmJlc3RfbWF0Y2gocmVxLCB3cywgaW5zdGFsbGVyKQogICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXJzID0gcmVxdWlyZWRfYnkuZ2V0KHJlcSwgTm9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHJpYnV0aW9uTm90Rm91bmQocmVxLCByZXF1aXJlcnMpCiAgICAgICAgICAgICAgICB0b19hY3RpdmF0ZS5hcHBlbmQoZGlzdCkKICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gcmVxOgogICAgICAgICAgICAgICAgIyBPb3BzLCB0aGUgImJlc3QiIHNvIGZhciBjb25mbGljdHMgd2l0aCBhIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGRlcGVuZGVudF9yZXEgPSByZXF1aXJlZF9ieVtyZXFdCiAgICAgICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCwgcmVxKS53aXRoX2NvbnRleHQoZGVwZW5kZW50X3JlcSkKCiAgICAgICAgICAgICMgcHVzaCB0aGUgbmV3IHJlcXVpcmVtZW50cyBvbnRvIHRoZSBzdGFjawogICAgICAgICAgICBuZXdfcmVxdWlyZW1lbnRzID0gZGlzdC5yZXF1aXJlcyhyZXEuZXh0cmFzKVs6Oi0xXQogICAgICAgICAgICByZXF1aXJlbWVudHMuZXh0ZW5kKG5ld19yZXF1aXJlbWVudHMpCgogICAgICAgICAgICAjIFJlZ2lzdGVyIHRoZSBuZXcgcmVxdWlyZW1lbnRzIG5lZWRlZCBieSByZXEKICAgICAgICAgICAgZm9yIG5ld19yZXF1aXJlbWVudCBpbiBuZXdfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgcmVxdWlyZWRfYnlbbmV3X3JlcXVpcmVtZW50XS5hZGQocmVxLnByb2plY3RfbmFtZSkKICAgICAgICAgICAgICAgIHJlcV9leHRyYXNbbmV3X3JlcXVpcmVtZW50XSA9IHJlcS5leHRyYXMKCiAgICAgICAgICAgIHByb2Nlc3NlZFtyZXFdID0gVHJ1ZQoKICAgICAgICAjIHJldHVybiBsaXN0IG9mIGRpc3Ryb3MgdG8gYWN0aXZhdGUKICAgICAgICByZXR1cm4gdG9fYWN0aXZhdGUKCiAgICBkZWYgZmluZF9wbHVnaW5zKHNlbGYsIHBsdWdpbl9lbnYsIGZ1bGxfZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLAogICAgICAgICAgICBmYWxsYmFjaz1UcnVlKToKICAgICAgICAiIiJGaW5kIGFsbCBhY3RpdmF0YWJsZSBkaXN0cmlidXRpb25zIGluIGBwbHVnaW5fZW52YAoKICAgICAgICBFeGFtcGxlIHVzYWdlOjoKCiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMsIGVycm9ycyA9IHdvcmtpbmdfc2V0LmZpbmRfcGx1Z2lucygKICAgICAgICAgICAgICAgIEVudmlyb25tZW50KHBsdWdpbl9kaXJsaXN0KQogICAgICAgICAgICApCiAgICAgICAgICAgICMgYWRkIHBsdWdpbnMrbGlicyB0byBzeXMucGF0aAogICAgICAgICAgICBtYXAod29ya2luZ19zZXQuYWRkLCBkaXN0cmlidXRpb25zKQogICAgICAgICAgICAjIGRpc3BsYXkgZXJyb3JzCiAgICAgICAgICAgIHByaW50KCdDb3VsZCBub3QgbG9hZCcsIGVycm9ycykKCiAgICAgICAgVGhlIGBwbHVnaW5fZW52YCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlIHRoYXQgY29udGFpbnMKICAgICAgICBvbmx5IGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgaW4gdGhlIHByb2plY3QncyAicGx1Z2luIGRpcmVjdG9yeSIgb3IKICAgICAgICBkaXJlY3Rvcmllcy4gVGhlIGBmdWxsX2VudmAsIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgCiAgICAgICAgY29udGFpbnMgYWxsIGN1cnJlbnRseS1hdmFpbGFibGUgZGlzdHJpYnV0aW9ucy4gIElmIGBmdWxsX2VudmAgaXMgbm90CiAgICAgICAgc3VwcGxpZWQsIG9uZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgYGBXb3JraW5nU2V0YGAgdGhpcwogICAgICAgIG1ldGhvZCBpcyBjYWxsZWQgb24sIHdoaWNoIHdpbGwgdHlwaWNhbGx5IG1lYW4gdGhhdCBldmVyeSBkaXJlY3Rvcnkgb24KICAgICAgICBgYHN5cy5wYXRoYGAgd2lsbCBiZSBzY2FubmVkIGZvciBkaXN0cmlidXRpb25zLgoKICAgICAgICBgaW5zdGFsbGVyYCBpcyBhIHN0YW5kYXJkIGluc3RhbGxlciBjYWxsYmFjayBhcyB1c2VkIGJ5IHRoZQogICAgICAgIGBgcmVzb2x2ZSgpYGAgbWV0aG9kLiBUaGUgYGZhbGxiYWNrYCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZAogICAgICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSBvbGRlciB2ZXJzaW9ucyBvZiBhIHBsdWdpbiBpZiB0aGUgbmV3ZXN0IHZlcnNpb24KICAgICAgICBjYW5ub3QgYmUgcmVzb2x2ZWQuCgogICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSAyLXR1cGxlOiAoYGRpc3RyaWJ1dGlvbnNgLCBgZXJyb3JfaW5mb2ApLCB3aGVyZQogICAgICAgIGBkaXN0cmlidXRpb25zYCBpcyBhIGxpc3Qgb2YgdGhlIGRpc3RyaWJ1dGlvbnMgZm91bmQgaW4gYHBsdWdpbl9lbnZgCiAgICAgICAgdGhhdCB3ZXJlIGxvYWRhYmxlLCBhbG9uZyB3aXRoIGFueSBvdGhlciBkaXN0cmlidXRpb25zIHRoYXQgYXJlIG5lZWRlZAogICAgICAgIHRvIHJlc29sdmUgdGhlaXIgZGVwZW5kZW5jaWVzLiAgYGVycm9yX2luZm9gIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nCiAgICAgICAgdW5sb2FkYWJsZSBwbHVnaW4gZGlzdHJpYnV0aW9ucyB0byBhbiBleGNlcHRpb24gaW5zdGFuY2UgZGVzY3JpYmluZyB0aGUKICAgICAgICBlcnJvciB0aGF0IG9jY3VycmVkLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBhIGBgRGlzdHJpYnV0aW9uTm90Rm91bmRgYCBvcgogICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaW5zdGFuY2UuCiAgICAgICAgIiIiCgogICAgICAgIHBsdWdpbl9wcm9qZWN0cyA9IGxpc3QocGx1Z2luX2VudikKICAgICAgICAjIHNjYW4gcHJvamVjdCBuYW1lcyBpbiBhbHBoYWJldGljIG9yZGVyCiAgICAgICAgcGx1Z2luX3Byb2plY3RzLnNvcnQoKQoKICAgICAgICBlcnJvcl9pbmZvID0ge30KICAgICAgICBkaXN0cmlidXRpb25zID0ge30KCiAgICAgICAgaWYgZnVsbF9lbnYgaXMgTm9uZToKICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICBlbnYgKz0gcGx1Z2luX2VudgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVudiA9IGZ1bGxfZW52ICsgcGx1Z2luX2VudgoKICAgICAgICBzaGFkb3dfc2V0ID0gc2VsZi5fX2NsYXNzX18oW10pCiAgICAgICAgIyBwdXQgYWxsIG91ciBlbnRyaWVzIGluIHNoYWRvd19zZXQKICAgICAgICBsaXN0KG1hcChzaGFkb3dfc2V0LmFkZCwgc2VsZikpCgogICAgICAgIGZvciBwcm9qZWN0X25hbWUgaW4gcGx1Z2luX3Byb2plY3RzOgoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGx1Z2luX2Vudltwcm9qZWN0X25hbWVdOgoKICAgICAgICAgICAgICAgIHJlcSA9IFtkaXN0LmFzX3JlcXVpcmVtZW50KCldCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJlc29sdmVlcyA9IHNoYWRvd19zZXQucmVzb2x2ZShyZXEsIGVudiwgaW5zdGFsbGVyKQoKICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXNvbHV0aW9uRXJyb3IgYXMgdjoKICAgICAgICAgICAgICAgICAgICAjIHNhdmUgZXJyb3IgaW5mbwogICAgICAgICAgICAgICAgICAgIGVycm9yX2luZm9bZGlzdF0gPSB2CiAgICAgICAgICAgICAgICAgICAgaWYgZmFsbGJhY2s6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ5IHRoZSBuZXh0IG9sZGVyIHZlcnNpb24gb2YgcHJvamVjdAogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2l2ZSB1cCBvbiB0aGlzIHByb2plY3QsIGtlZXAgZ29pbmcKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCByZXNvbHZlZXMpKQogICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMudXBkYXRlKGRpY3QuZnJvbWtleXMocmVzb2x2ZWVzKSkKCiAgICAgICAgICAgICAgICAgICAgIyBzdWNjZXNzLCBubyBuZWVkIHRvIHRyeSBhbnkgbW9yZSB2ZXJzaW9ucyBvZiB0aGlzIHByb2plY3QKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBkaXN0cmlidXRpb25zID0gbGlzdChkaXN0cmlidXRpb25zKQogICAgICAgIGRpc3RyaWJ1dGlvbnMuc29ydCgpCgogICAgICAgIHJldHVybiBkaXN0cmlidXRpb25zLCBlcnJvcl9pbmZvCgogICAgZGVmIHJlcXVpcmUoc2VsZiwgKnJlcXVpcmVtZW50cyk6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgZGlzdHJpYnV0aW9ucyBtYXRjaGluZyBgcmVxdWlyZW1lbnRzYCBhcmUgYWN0aXZhdGVkCgogICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSAocG9zc2libHktbmVzdGVkKSBzZXF1ZW5jZQogICAgICAgIHRoZXJlb2YsIHNwZWNpZnlpbmcgdGhlIGRpc3RyaWJ1dGlvbnMgYW5kIHZlcnNpb25zIHJlcXVpcmVkLiAgVGhlCiAgICAgICAgcmV0dXJuIHZhbHVlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbnMgdGhhdCBuZWVkZWQgdG8gYmUKICAgICAgICBhY3RpdmF0ZWQgdG8gZnVsZmlsbCB0aGUgcmVxdWlyZW1lbnRzOyBhbGwgcmVsZXZhbnQgZGlzdHJpYnV0aW9ucyBhcmUKICAgICAgICBpbmNsdWRlZCwgZXZlbiBpZiB0aGV5IHdlcmUgYWxyZWFkeSBhY3RpdmF0ZWQgaW4gdGhpcyB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBuZWVkZWQgPSBzZWxmLnJlc29sdmUocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpCgogICAgICAgIGZvciBkaXN0IGluIG5lZWRlZDoKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICAgICAgcmV0dXJuIG5lZWRlZAoKICAgIGRlZiBzdWJzY3JpYmUoc2VsZiwgY2FsbGJhY2ssIGV4aXN0aW5nPVRydWUpOgogICAgICAgICIiIkludm9rZSBgY2FsbGJhY2tgIGZvciBhbGwgZGlzdHJpYnV0aW9ucwoKICAgICAgICBJZiBgZXhpc3Rpbmc9VHJ1ZWAgKGRlZmF1bHQpLAogICAgICAgIGNhbGwgb24gYWxsIGV4aXN0aW5nIG9uZXMsIGFzIHdlbGwuCiAgICAgICAgIiIiCiAgICAgICAgaWYgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjaykKICAgICAgICBpZiBub3QgZXhpc3Rpbmc6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZvciBkaXN0IGluIHNlbGY6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9hZGRlZF9uZXcoc2VsZiwgZGlzdCk6CiAgICAgICAgZm9yIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgogICAgICAgICAgICBjYWxsYmFjayhkaXN0KQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5lbnRyaWVzWzpdLCBzZWxmLmVudHJ5X2tleXMuY29weSgpLCBzZWxmLmJ5X2tleS5jb3B5KCksCiAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzWzpdCiAgICAgICAgKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZV9rX2JfYyk6CiAgICAgICAgZW50cmllcywga2V5cywgYnlfa2V5LCBjYWxsYmFja3MgPSBlX2tfYl9jCiAgICAgICAgc2VsZi5lbnRyaWVzID0gZW50cmllc1s6XQogICAgICAgIHNlbGYuZW50cnlfa2V5cyA9IGtleXMuY29weSgpCiAgICAgICAgc2VsZi5ieV9rZXkgPSBieV9rZXkuY29weSgpCiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBjYWxsYmFja3NbOl0KCgpjbGFzcyBfUmVxRXh0cmFzKGRpY3QpOgogICAgIiIiCiAgICBNYXAgZWFjaCByZXF1aXJlbWVudCB0byB0aGUgZXh0cmFzIHRoYXQgZGVtYW5kZWQgaXQuCiAgICAiIiIKCiAgICBkZWYgbWFya2Vyc19wYXNzKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgRXZhbHVhdGUgbWFya2VycyBmb3IgcmVxIGFnYWluc3QgZWFjaCBleHRyYSB0aGF0CiAgICAgICAgZGVtYW5kZWQgaXQuCgogICAgICAgIFJldHVybiBGYWxzZSBpZiB0aGUgcmVxIGhhcyBhIG1hcmtlciBhbmQgZmFpbHMKICAgICAgICBldmFsdWF0aW9uLiBPdGhlcndpc2UsIHJldHVybiBUcnVlLgogICAgICAgICIiIgogICAgICAgIGV4dHJhX2V2YWxzID0gKAogICAgICAgICAgICByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pCiAgICAgICAgICAgIGZvciBleHRyYSBpbiBzZWxmLmdldChyZXEsICgpKSArIChOb25lLCkKICAgICAgICApCiAgICAgICAgcmV0dXJuIG5vdCByZXEubWFya2VyIG9yIGFueShleHRyYV9ldmFscykKCgpjbGFzcyBFbnZpcm9ubWVudChvYmplY3QpOgogICAgIiIiU2VhcmNoYWJsZSBzbmFwc2hvdCBvZiBkaXN0cmlidXRpb25zIG9uIGEgc2VhcmNoIHBhdGgiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSwgcGxhdGZvcm09Z2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpLAogICAgICAgICAgICBweXRob249UFlfTUFKT1IpOgogICAgICAgICIiIlNuYXBzaG90IGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIG9uIGEgc2VhcmNoIHBhdGgKCiAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgb24gYHNlYXJjaF9wYXRoYCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgogICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90CiAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLgoKICAgICAgICBgcGxhdGZvcm1gIGlzIGFuIG9wdGlvbmFsIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybQogICAgICAgIHRoYXQgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aC4gIElmCiAgICAgICAgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgYHB5dGhvbmAgaXMgYW4KICAgICAgICBvcHRpb25hbCBzdHJpbmcgbmFtaW5nIHRoZSBkZXNpcmVkIHZlcnNpb24gb2YgUHl0aG9uIChlLmcuIGBgJzMuMydgYCk7CiAgICAgICAgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbi4KCiAgICAgICAgWW91IG1heSBleHBsaWNpdGx5IHNldCBgcGxhdGZvcm1gIChhbmQvb3IgYHB5dGhvbmApIHRvIGBgTm9uZWBgIGlmIHlvdQogICAgICAgIHdpc2ggdG8gbWFwICphbGwqIGRpc3RyaWJ1dGlvbnMsIG5vdCBqdXN0IHRob3NlIGNvbXBhdGlibGUgd2l0aCB0aGUKICAgICAgICBydW5uaW5nIHBsYXRmb3JtIG9yIFB5dGhvbiB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2Rpc3RtYXAgPSB7fQogICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgICAgIHNlbGYucHl0aG9uID0gcHl0aG9uCiAgICAgICAgc2VsZi5zY2FuKHNlYXJjaF9wYXRoKQoKICAgIGRlZiBjYW5fYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIklzIGRpc3RyaWJ1dGlvbiBgZGlzdGAgYWNjZXB0YWJsZSBmb3IgdGhpcyBlbnZpcm9ubWVudD8KCiAgICAgICAgVGhlIGRpc3RyaWJ1dGlvbiBtdXN0IG1hdGNoIHRoZSBwbGF0Zm9ybSBhbmQgcHl0aG9uIHZlcnNpb24KICAgICAgICByZXF1aXJlbWVudHMgc3BlY2lmaWVkIHdoZW4gdGhpcyBlbnZpcm9ubWVudCB3YXMgY3JlYXRlZCwgb3IgRmFsc2UKICAgICAgICBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYucHl0aG9uIGlzIE5vbmUgb3IgZGlzdC5weV92ZXJzaW9uIGlzIE5vbmUKICAgICAgICAgICAgb3IgZGlzdC5weV92ZXJzaW9uID09IHNlbGYucHl0aG9uKSBcCiAgICAgICAgICAgIGFuZCBjb21wYXRpYmxlX3BsYXRmb3JtcyhkaXN0LnBsYXRmb3JtLCBzZWxmLnBsYXRmb3JtKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBlbnZpcm9ubWVudCIiIgogICAgICAgIHNlbGYuX2Rpc3RtYXBbZGlzdC5rZXldLnJlbW92ZShkaXN0KQoKICAgIGRlZiBzY2FuKHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUpOgogICAgICAgICIiIlNjYW4gYHNlYXJjaF9wYXRoYCBmb3IgZGlzdHJpYnV0aW9ucyB1c2FibGUgaW4gdGhpcyBlbnZpcm9ubWVudAoKICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgogICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90CiAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLiAgT25seSBkaXN0cmlidXRpb25zIGNvbmZvcm1pbmcgdG8KICAgICAgICB0aGUgcGxhdGZvcm0vcHl0aG9uIHZlcnNpb24gZGVmaW5lZCBhdCBpbml0aWFsaXphdGlvbiBhcmUgYWRkZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VhcmNoX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgc2VhcmNoX3BhdGggPSBzeXMucGF0aAoKICAgICAgICBmb3IgaXRlbSBpbiBzZWFyY2hfcGF0aDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGl0ZW0pOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBuZXdlc3QtdG8tb2xkZXN0IGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmb3IgYHByb2plY3RfbmFtZWAKCiAgICAgICAgVXNlcyBjYXNlLWluc2Vuc2l0aXZlIGBwcm9qZWN0X25hbWVgIGNvbXBhcmlzb24sIGFzc3VtaW5nIGFsbCB0aGUKICAgICAgICBwcm9qZWN0J3MgZGlzdHJpYnV0aW9ucyB1c2UgdGhlaXIgcHJvamVjdCdzIG5hbWUgY29udmVydGVkIHRvIGFsbAogICAgICAgIGxvd2VyY2FzZSBhcyB0aGVpciBrZXkuCgogICAgICAgICIiIgogICAgICAgIGRpc3RyaWJ1dGlvbl9rZXkgPSBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIHJldHVybiBzZWxmLl9kaXN0bWFwLmdldChkaXN0cmlidXRpb25fa2V5LCBbXSkKCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkFkZCBgZGlzdGAgaWYgd2UgYGBjYW5fYWRkKClgYCBpdCBhbmQgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNhbl9hZGQoZGlzdCkgYW5kIGRpc3QuaGFzX3ZlcnNpb24oKToKICAgICAgICAgICAgZGlzdHMgPSBzZWxmLl9kaXN0bWFwLnNldGRlZmF1bHQoZGlzdC5rZXksIFtdKQogICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIGRpc3RzLmFwcGVuZChkaXN0KQogICAgICAgICAgICAgICAgZGlzdHMuc29ydChrZXk9b3BlcmF0b3IuYXR0cmdldHRlcignaGFzaGNtcCcpLCByZXZlcnNlPVRydWUpCgogICAgZGVmIGJlc3RfbWF0Y2goc2VsZiwgcmVxLCB3b3JraW5nX3NldCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgICIiIkZpbmQgZGlzdHJpYnV0aW9uIGJlc3QgbWF0Y2hpbmcgYHJlcWAgYW5kIHVzYWJsZSBvbiBgd29ya2luZ19zZXRgCgogICAgICAgIFRoaXMgY2FsbHMgdGhlIGBgZmluZChyZXEpYGAgbWV0aG9kIG9mIHRoZSBgd29ya2luZ19zZXRgIHRvIHNlZSBpZiBhCiAgICAgICAgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGlzIGFscmVhZHkgYWN0aXZlLiAgKFRoaXMgbWF5IHJhaXNlCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpZiBhbiB1bnN1aXRhYmxlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgaXMgYWxyZWFkeQogICAgICAgIGFjdGl2ZSBpbiB0aGUgc3BlY2lmaWVkIGB3b3JraW5nX3NldGAuKSAgSWYgYSBzdWl0YWJsZSBkaXN0cmlidXRpb24KICAgICAgICBpc24ndCBhY3RpdmUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5ld2VzdCBkaXN0cmlidXRpb24gaW4gdGhlCiAgICAgICAgZW52aXJvbm1lbnQgdGhhdCBtZWV0cyB0aGUgYGBSZXF1aXJlbWVudGBgIGluIGByZXFgLiAgSWYgbm8gc3VpdGFibGUKICAgICAgICBkaXN0cmlidXRpb24gaXMgZm91bmQsIGFuZCBgaW5zdGFsbGVyYCBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmVzdWx0IG9mCiAgICAgICAgY2FsbGluZyB0aGUgZW52aXJvbm1lbnQncyBgYG9idGFpbihyZXEsIGluc3RhbGxlcilgYCBtZXRob2Qgd2lsbCBiZQogICAgICAgIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGRpc3QgPSB3b3JraW5nX3NldC5maW5kKHJlcSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxLmtleV06CiAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxOgogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAjIHRyeSB0byBkb3dubG9hZC9pbnN0YWxsCiAgICAgICAgcmV0dXJuIHNlbGYub2J0YWluKHJlcSwgaW5zdGFsbGVyKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICAiIiJPYnRhaW4gYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYHJlcXVpcmVtZW50YCAoZS5nLiB2aWEgZG93bmxvYWQpCgogICAgICAgIE9idGFpbiBhIGRpc3RybyB0aGF0IG1hdGNoZXMgcmVxdWlyZW1lbnQgKGUuZy4gdmlhIGRvd25sb2FkKS4gIEluIHRoZQogICAgICAgIGJhc2UgYGBFbnZpcm9ubWVudGBgIGNsYXNzLCB0aGlzIHJvdXRpbmUganVzdCByZXR1cm5zCiAgICAgICAgYGBpbnN0YWxsZXIocmVxdWlyZW1lbnQpYGAsIHVubGVzcyBgaW5zdGFsbGVyYCBpcyBOb25lLCBpbiB3aGljaCBjYXNlCiAgICAgICAgTm9uZSBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhpcyBtZXRob2QgaXMgYSBob29rIHRoYXQgYWxsb3dzIHN1YmNsYXNzZXMKICAgICAgICB0byBhdHRlbXB0IG90aGVyIHdheXMgb2Ygb2J0YWluaW5nIGEgZGlzdHJpYnV0aW9uIGJlZm9yZSBmYWxsaW5nIGJhY2sKICAgICAgICB0byB0aGUgYGluc3RhbGxlcmAgYXJndW1lbnQuIiIiCiAgICAgICAgaWYgaW5zdGFsbGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gaW5zdGFsbGVyKHJlcXVpcmVtZW50KQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCB0aGUgdW5pcXVlIHByb2plY3QgbmFtZXMgb2YgdGhlIGF2YWlsYWJsZSBkaXN0cmlidXRpb25zIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaXN0bWFwLmtleXMoKToKICAgICAgICAgICAgaWYgc2VsZltrZXldOgogICAgICAgICAgICAgICAgeWllbGQga2V5CgogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJJbi1wbGFjZSBhZGRpdGlvbiBvZiBhIGRpc3RyaWJ1dGlvbiBvciBlbnZpcm9ubWVudCIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIHNlbGYuYWRkKG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgRW52aXJvbm1lbnQpOgogICAgICAgICAgICBmb3IgcHJvamVjdCBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIG90aGVyW3Byb2plY3RdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBhZGQgJXIgdG8gZW52aXJvbm1lbnQiICUgKG90aGVyLCkpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiQWRkIGFuIGVudmlyb25tZW50IG9yIGRpc3RyaWJ1dGlvbiB0byBhbiBlbnZpcm9ubWVudCIiIgogICAgICAgIG5ldyA9IHNlbGYuX19jbGFzc19fKFtdLCBwbGF0Zm9ybT1Ob25lLCBweXRob249Tm9uZSkKICAgICAgICBmb3IgZW52IGluIHNlbGYsIG90aGVyOgogICAgICAgICAgICBuZXcgKz0gZW52CiAgICAgICAgcmV0dXJuIG5ldwoKCiMgWFhYIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKQXZhaWxhYmxlRGlzdHJpYnV0aW9ucyA9IEVudmlyb25tZW50CgoKY2xhc3MgRXh0cmFjdGlvbkVycm9yKFJ1bnRpbWVFcnJvcik6CiAgICAiIiJBbiBlcnJvciBvY2N1cnJlZCBleHRyYWN0aW5nIGEgcmVzb3VyY2UKCiAgICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIGluc3RhbmNlcyBvZiB0aGlzIGV4Y2VwdGlvbjoKCiAgICBtYW5hZ2VyCiAgICAgICAgVGhlIHJlc291cmNlIG1hbmFnZXIgdGhhdCByYWlzZWQgdGhpcyBleGNlcHRpb24KCiAgICBjYWNoZV9wYXRoCiAgICAgICAgVGhlIGJhc2UgZGlyZWN0b3J5IGZvciByZXNvdXJjZSBleHRyYWN0aW9uCgogICAgb3JpZ2luYWxfZXJyb3IKICAgICAgICBUaGUgZXhjZXB0aW9uIGluc3RhbmNlIHRoYXQgY2F1c2VkIGV4dHJhY3Rpb24gdG8gZmFpbAogICAgIiIiCgoKY2xhc3MgUmVzb3VyY2VNYW5hZ2VyOgogICAgIiIiTWFuYWdlIHJlc291cmNlIGV4dHJhY3Rpb24gYW5kIHBhY2thZ2VzIiIiCiAgICBleHRyYWN0aW9uX3BhdGggPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzID0ge30KCiAgICBkZWYgcmVzb3VyY2VfZXhpc3RzKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIG5hbWVkIHJlc291cmNlIGV4aXN0PyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhbiBleGlzdGluZyBkaXJlY3Rvcnk/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9pc2RpcigKICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJlYW0oc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyZWFtKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJpbmcoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHNwZWNpZmllZCByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmluZygKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgcmVzb3VyY2UgZGlyZWN0b3J5IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9saXN0ZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiBleHRyYWN0aW9uX2Vycm9yKHNlbGYpOgogICAgICAgICIiIkdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbXMgZXh0cmFjdGluZyBmaWxlKHMpIiIiCgogICAgICAgIG9sZF9leGMgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgICAgIGNhY2hlX3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCgogICAgICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgICAgIENhbid0IGV4dHJhY3QgZmlsZShzKSB0byBlZ2cgY2FjaGUKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGV4dHJhY3QgZmlsZShzKSB0byB0aGUgUHl0aG9uIGVnZwogICAgICAgICAgICBjYWNoZToKCiAgICAgICAgICAgICAge29sZF9leGN9CgogICAgICAgICAgICBUaGUgUHl0aG9uIGVnZyBjYWNoZSBkaXJlY3RvcnkgaXMgY3VycmVudGx5IHNldCB0bzoKCiAgICAgICAgICAgICAge2NhY2hlX3BhdGh9CgogICAgICAgICAgICBQZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8gIFlvdSBjYW4KICAgICAgICAgICAgY2hhbmdlIHRoZSBjYWNoZSBkaXJlY3RvcnkgYnkgc2V0dGluZyB0aGUgUFlUSE9OX0VHR19DQUNIRSBlbnZpcm9ubWVudAogICAgICAgICAgICB2YXJpYWJsZSB0byBwb2ludCB0byBhbiBhY2Nlc3NpYmxlIGRpcmVjdG9yeS4KICAgICAgICAgICAgIiIiKS5sc3RyaXAoKQogICAgICAgIGVyciA9IEV4dHJhY3Rpb25FcnJvcih0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICBlcnIubWFuYWdlciA9IHNlbGYKICAgICAgICBlcnIuY2FjaGVfcGF0aCA9IGNhY2hlX3BhdGgKICAgICAgICBlcnIub3JpZ2luYWxfZXJyb3IgPSBvbGRfZXhjCiAgICAgICAgcmFpc2UgZXJyCgogICAgZGVmIGdldF9jYWNoZV9wYXRoKHNlbGYsIGFyY2hpdmVfbmFtZSwgbmFtZXM9KCkpOgogICAgICAgICIiIlJldHVybiBhYnNvbHV0ZSBsb2NhdGlvbiBpbiBjYWNoZSBmb3IgYGFyY2hpdmVfbmFtZWAgYW5kIGBuYW1lc2AKCiAgICAgICAgVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIHJlc3VsdGluZyBwYXRoIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzCiAgICAgICAgbm90IGFscmVhZHkgZXhpc3QuICBgYXJjaGl2ZV9uYW1lYCBzaG91bGQgYmUgdGhlIGJhc2UgZmlsZW5hbWUgb2YgdGhlCiAgICAgICAgZW5jbG9zaW5nIGVnZyAod2hpY2ggbWF5IG5vdCBiZSB0aGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIHppcGZpbGUhKSwKICAgICAgICBpbmNsdWRpbmcgaXRzICIuZWdnIiBleHRlbnNpb24uICBgbmFtZXNgLCBpZiBwcm92aWRlZCwgc2hvdWxkIGJlIGEKICAgICAgICBzZXF1ZW5jZSBvZiBwYXRoIG5hbWUgcGFydHMgInVuZGVyIiB0aGUgZWdnJ3MgZXh0cmFjdGlvbiBsb2NhdGlvbi4KCiAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHJlc291cmNlIHByb3ZpZGVycyB0aGF0IG5lZWQgdG8KICAgICAgICBvYnRhaW4gYW4gZXh0cmFjdGlvbiBsb2NhdGlvbiwgYW5kIG9ubHkgZm9yIG5hbWVzIHRoZXkgaW50ZW5kIHRvCiAgICAgICAgZXh0cmFjdCwgYXMgaXQgdHJhY2tzIHRoZSBnZW5lcmF0ZWQgbmFtZXMgZm9yIHBvc3NpYmxlIGNsZWFudXAgbGF0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFjdF9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQogICAgICAgIHRhcmdldF9wYXRoID0gb3MucGF0aC5qb2luKGV4dHJhY3RfcGF0aCwgYXJjaGl2ZV9uYW1lICsgJy10bXAnLCAqbmFtZXMpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkodGFyZ2V0X3BhdGgpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmV4dHJhY3Rpb25fZXJyb3IoKQoKICAgICAgICBzZWxmLl93YXJuX3Vuc2FmZV9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdF9wYXRoKQoKICAgICAgICBzZWxmLmNhY2hlZF9maWxlc1t0YXJnZXRfcGF0aF0gPSAxCiAgICAgICAgcmV0dXJuIHRhcmdldF9wYXRoCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF93YXJuX3Vuc2FmZV9leHRyYWN0aW9uX3BhdGgocGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgdGhlIGRlZmF1bHQgZXh0cmFjdGlvbiBwYXRoIGlzIG92ZXJyaWRkZW4gYW5kIHNldCB0byBhbiBpbnNlY3VyZQogICAgICAgIGxvY2F0aW9uLCBzdWNoIGFzIC90bXAsIGl0IG9wZW5zIHVwIGFuIG9wcG9ydHVuaXR5IGZvciBhbiBhdHRhY2tlciB0bwogICAgICAgIHJlcGxhY2UgYW4gZXh0cmFjdGVkIGZpbGUgd2l0aCBhbiB1bmF1dGhvcml6ZWQgcGF5bG9hZC4gV2FybiB0aGUgdXNlcgogICAgICAgIGlmIGEga25vd24gaW5zZWN1cmUgbG9jYXRpb24gaXMgdXNlZC4KCiAgICAgICAgU2VlIERpc3RyaWJ1dGUgIzM3NSBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICIiIgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgbm90IHBhdGguc3RhcnRzd2l0aChvcy5lbnZpcm9uWyd3aW5kaXInXSk6CiAgICAgICAgICAgICMgT24gV2luZG93cywgcGVybWlzc2lvbnMgYXJlIGdlbmVyYWxseSByZXN0cmljdGl2ZSBieSBkZWZhdWx0CiAgICAgICAgICAgICMgIGFuZCB0ZW1wIGRpcmVjdG9yaWVzIGFyZSBub3Qgd3JpdGFibGUgYnkgb3RoZXIgdXNlcnMsIHNvCiAgICAgICAgICAgICMgIGJ5cGFzcyB0aGUgd2FybmluZy4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbW9kZSA9IG9zLnN0YXQocGF0aCkuc3RfbW9kZQogICAgICAgIGlmIG1vZGUgJiBzdGF0LlNfSVdPVEggb3IgbW9kZSAmIHN0YXQuU19JV0dSUDoKICAgICAgICAgICAgbXNnID0gKCIlcyBpcyB3cml0YWJsZSBieSBncm91cC9vdGhlcnMgYW5kIHZ1bG5lcmFibGUgdG8gYXR0YWNrICIKICAgICAgICAgICAgICAgICJ3aGVuICIKICAgICAgICAgICAgICAgICJ1c2VkIHdpdGggZ2V0X3Jlc291cmNlX2ZpbGVuYW1lLiBDb25zaWRlciBhIG1vcmUgc2VjdXJlICIKICAgICAgICAgICAgICAgICJsb2NhdGlvbiAoc2V0IHdpdGggLnNldF9leHRyYWN0aW9uX3BhdGggb3IgdGhlICIKICAgICAgICAgICAgICAgICJQWVRIT05fRUdHX0NBQ0hFIGVudmlyb25tZW50IHZhcmlhYmxlKS4iICUgcGF0aCkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIFVzZXJXYXJuaW5nKQoKICAgIGRlZiBwb3N0cHJvY2VzcyhzZWxmLCB0ZW1wbmFtZSwgZmlsZW5hbWUpOgogICAgICAgICIiIlBlcmZvcm0gYW55IHBsYXRmb3JtLXNwZWNpZmljIHBvc3Rwcm9jZXNzaW5nIG9mIGB0ZW1wbmFtZWAKCiAgICAgICAgVGhpcyBpcyB3aGVyZSBNYWMgaGVhZGVyIHJld3JpdGVzIHNob3VsZCBiZSBkb25lOyBvdGhlciBwbGF0Zm9ybXMgZG9uJ3QKICAgICAgICBoYXZlIGFueXRoaW5nIHNwZWNpYWwgdGhleSBzaG91bGQgZG8uCgogICAgICAgIFJlc291cmNlIHByb3ZpZGVycyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBPTkxZIGFmdGVyIHN1Y2Nlc3NmdWxseQogICAgICAgIGV4dHJhY3RpbmcgYSBjb21wcmVzc2VkIHJlc291cmNlLiAgVGhleSBtdXN0IE5PVCBjYWxsIGl0IG9uIHJlc291cmNlcwogICAgICAgIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIGZpbGVzeXN0ZW0uCgogICAgICAgIGB0ZW1wbmFtZWAgaXMgdGhlIGN1cnJlbnQgKHRlbXBvcmFyeSkgbmFtZSBvZiB0aGUgZmlsZSwgYW5kIGBmaWxlbmFtZWAKICAgICAgICBpcyB0aGUgbmFtZSBpdCB3aWxsIGJlIHJlbmFtZWQgdG8gYnkgdGhlIGNhbGxlciBhZnRlciB0aGlzIHJvdXRpbmUKICAgICAgICByZXR1cm5zLgogICAgICAgICIiIgoKICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CiAgICAgICAgICAgICMgTWFrZSB0aGUgcmVzb3VyY2UgZXhlY3V0YWJsZQogICAgICAgICAgICBtb2RlID0gKChvcy5zdGF0KHRlbXBuYW1lKS5zdF9tb2RlKSB8IDBvNTU1KSAmIDBvNzc3NwogICAgICAgICAgICBvcy5jaG1vZCh0ZW1wbmFtZSwgbW9kZSkKCiAgICBkZWYgc2V0X2V4dHJhY3Rpb25fcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAiIiJTZXQgdGhlIGJhc2UgcGF0aCB3aGVyZSByZXNvdXJjZXMgd2lsbCBiZSBleHRyYWN0ZWQgdG8sIGlmIG5lZWRlZC4KCiAgICAgICAgSWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgcm91dGluZSBiZWZvcmUgYW55IGV4dHJhY3Rpb25zIHRha2UgcGxhY2UsIHRoZQogICAgICAgIHBhdGggZGVmYXVsdHMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgYGdldF9kZWZhdWx0X2NhY2hlKClgYC4gIChXaGljaAogICAgICAgIGlzIGJhc2VkIG9uIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2l0aCB2YXJpb3VzCiAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZmFsbGJhY2tzLiAgU2VlIHRoYXQgcm91dGluZSdzIGRvY3VtZW50YXRpb24gZm9yIG1vcmUKICAgICAgICBkZXRhaWxzLikKCiAgICAgICAgUmVzb3VyY2VzIGFyZSBleHRyYWN0ZWQgdG8gc3ViZGlyZWN0b3JpZXMgb2YgdGhpcyBwYXRoIGJhc2VkIHVwb24KICAgICAgICBpbmZvcm1hdGlvbiBnaXZlbiBieSB0aGUgYGBJUmVzb3VyY2VQcm92aWRlcmBgLiAgWW91IG1heSBzZXQgdGhpcyB0byBhCiAgICAgICAgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYnV0IHRoZW4geW91IG11c3QgY2FsbCBgYGNsZWFudXBfcmVzb3VyY2VzKClgYCB0bwogICAgICAgIGRlbGV0ZSB0aGUgZXh0cmFjdGVkIGZpbGVzIHdoZW4gZG9uZS4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0CiAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgd2lsbCBiZSBhYmxlIHRvIHJlbW92ZSBhbGwgZXh0cmFjdGVkIGZpbGVzLgoKICAgICAgICAoTm90ZTogeW91IG1heSBub3QgY2hhbmdlIHRoZSBleHRyYWN0aW9uIHBhdGggZm9yIGEgZ2l2ZW4gcmVzb3VyY2UKICAgICAgICBtYW5hZ2VyIG9uY2UgcmVzb3VyY2VzIGhhdmUgYmVlbiBleHRyYWN0ZWQsIHVubGVzcyB5b3UgZmlyc3QgY2FsbAogICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgLikKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNhY2hlZF9maWxlczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBjaGFuZ2UgZXh0cmFjdGlvbiBwYXRoLCBmaWxlcyBhbHJlYWR5IGV4dHJhY3RlZCIKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLmV4dHJhY3Rpb25fcGF0aCA9IHBhdGgKCiAgICBkZWYgY2xlYW51cF9yZXNvdXJjZXMoc2VsZiwgZm9yY2U9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIERlbGV0ZSBhbGwgZXh0cmFjdGVkIHJlc291cmNlIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgcmV0dXJuaW5nIGEgbGlzdAogICAgICAgIG9mIHRoZSBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMgdGhhdCBjb3VsZCBub3QgYmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuCiAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBjb25jdXJyZW5jeSBwcm90ZWN0aW9uLCBzbyBpdCBzaG91bGQKICAgICAgICBnZW5lcmFsbHkgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZXh0cmFjdGlvbiBwYXRoIGlzIGEgdGVtcG9yYXJ5CiAgICAgICAgZGlyZWN0b3J5IGV4Y2x1c2l2ZSB0byBhIHNpbmdsZSBwcm9jZXNzLiAgVGhpcyBtZXRob2QgaXMgbm90CiAgICAgICAgYXV0b21hdGljYWxseSBjYWxsZWQ7IHlvdSBtdXN0IGNhbGwgaXQgZXhwbGljaXRseSBvciByZWdpc3RlciBpdCBhcyBhbgogICAgICAgIGBgYXRleGl0YGAgZnVuY3Rpb24gaWYgeW91IHdpc2ggdG8gZW5zdXJlIGNsZWFudXAgb2YgYSB0ZW1wb3JhcnkKICAgICAgICBkaXJlY3RvcnkgdXNlZCBmb3IgZXh0cmFjdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBYWFgKCgpkZWYgZ2V0X2RlZmF1bHRfY2FjaGUoKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgb3IgYSBwbGF0Zm9ybS1yZWxldmFudCB1c2VyIGNhY2hlIGRpciBmb3IgYW4gYXBwCiAgICBuYW1lZCAiUHl0aG9uLUVnZ3MiLgogICAgIiIiCiAgICByZXR1cm4gKAogICAgICAgIG9zLmVudmlyb24uZ2V0KCdQWVRIT05fRUdHX0NBQ0hFJykKICAgICAgICBvciBhcHBkaXJzLnVzZXJfY2FjaGVfZGlyKGFwcG5hbWU9J1B5dGhvbi1FZ2dzJykKICAgICkKCgpkZWYgc2FmZV9uYW1lKG5hbWUpOgogICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIG5hbWUKCiAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljLy4gY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnLScuCiAgICAiIiIKICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCBuYW1lKQoKCmRlZiBzYWZlX3ZlcnNpb24odmVyc2lvbik6CiAgICAiIiIKICAgIENvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nCiAgICAiIiIKICAgIHRyeToKICAgICAgICAjIG5vcm1hbGl6ZSB0aGUgdmVyc2lvbgogICAgICAgIHJldHVybiBzdHIocGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbih2ZXJzaW9uKSkKICAgIGV4Y2VwdCBwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbjoKICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCcgJywgJy4nKQogICAgICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCB2ZXJzaW9uKQoKCmRlZiBzYWZlX2V4dHJhKGV4dHJhKToKICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkICdleHRyYScgbmFtZQoKICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnXycsCiAgICBhbmQgdGhlIHJlc3VsdCBpcyBhbHdheXMgbG93ZXJjYXNlZC4KICAgICIiIgogICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuLV0rJywgJ18nLCBleHRyYSkubG93ZXIoKQoKCmRlZiB0b19maWxlbmFtZShuYW1lKToKICAgICIiIkNvbnZlcnQgYSBwcm9qZWN0IG9yIHZlcnNpb24gbmFtZSB0byBpdHMgZmlsZW5hbWUtZXNjYXBlZCBmb3JtCgogICAgQW55ICctJyBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkgcmVwbGFjZWQgd2l0aCAnXycuCiAgICAiIiIKICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCgoKZGVmIGludmFsaWRfbWFya2VyKHRleHQpOgogICAgIiIiCiAgICBWYWxpZGF0ZSB0ZXh0IGFzIGEgUEVQIDUwOCBlbnZpcm9ubWVudCBtYXJrZXI7IHJldHVybiBhbiBleGNlcHRpb24KICAgIGlmIGludmFsaWQgb3IgRmFsc2Ugb3RoZXJ3aXNlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZXZhbHVhdGVfbWFya2VyKHRleHQpCiAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZToKICAgICAgICBlLmZpbGVuYW1lID0gTm9uZQogICAgICAgIGUubGluZW5vID0gTm9uZQogICAgICAgIHJldHVybiBlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgZXZhbHVhdGVfbWFya2VyKHRleHQsIGV4dHJhPU5vbmUpOgogICAgIiIiCiAgICBFdmFsdWF0ZSBhIFBFUCA1MDggZW52aXJvbm1lbnQgbWFya2VyLgogICAgUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoZSBtYXJrZXIgcmVzdWx0IGluIHRoaXMgZW52aXJvbm1lbnQuCiAgICBSYWlzZSBTeW50YXhFcnJvciBpZiBtYXJrZXIgaXMgaW52YWxpZC4KCiAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlICdweXBhcnNpbmcnIG1vZHVsZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIG1hcmtlciA9IHBhY2thZ2luZy5tYXJrZXJzLk1hcmtlcih0ZXh0KQogICAgICAgIHJldHVybiBtYXJrZXIuZXZhbHVhdGUoKQogICAgZXhjZXB0IHBhY2thZ2luZy5tYXJrZXJzLkludmFsaWRNYXJrZXIgYXMgZToKICAgICAgICByYWlzZSBTeW50YXhFcnJvcihlKQoKCmNsYXNzIE51bGxQcm92aWRlcjoKICAgICIiIlRyeSB0byBpbXBsZW1lbnQgcmVzb3VyY2VzIGFuZCBtZXRhZGF0YSBmb3IgYXJiaXRyYXJ5IFBFUCAzMDIgbG9hZGVycyIiIgoKICAgIGVnZ19uYW1lID0gTm9uZQogICAgZWdnX2luZm8gPSBOb25lCiAgICBsb2FkZXIgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgc2VsZi5sb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoZ2V0YXR0cihtb2R1bGUsICdfX2ZpbGVfXycsICcnKSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBpby5CeXRlc0lPKHNlbGYuZ2V0X3Jlc291cmNlX3N0cmluZyhtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBoYXNfcmVzb3VyY2Uoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9oYXMoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCgogICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfaW5mbzoKICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgdmFsdWUgPSBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCiAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZSgndXRmLTgnKSBpZiBzaXguUFkzIGVsc2UgdmFsdWUKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBtZXRhZGF0YV9pc2RpcihzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgc2VsZi5lZ2dfaW5mbzoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCiAgICAgICAgcmV0dXJuIFtdCgogICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgc2NyaXB0ID0gJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lCiAgICAgICAgaWYgbm90IHNlbGYuaGFzX21ldGFkYXRhKHNjcmlwdCk6CiAgICAgICAgICAgIHJhaXNlIFJlc29sdXRpb25FcnJvcigiTm8gc2NyaXB0IG5hbWVkICVyIiAlIHNjcmlwdF9uYW1lKQogICAgICAgIHNjcmlwdF90ZXh0ID0gc2VsZi5nZXRfbWV0YWRhdGEoc2NyaXB0KS5yZXBsYWNlKCdcclxuJywgJ1xuJykKICAgICAgICBzY3JpcHRfdGV4dCA9IHNjcmlwdF90ZXh0LnJlcGxhY2UoJ1xyJywgJ1xuJykKICAgICAgICBzY3JpcHRfZmlsZW5hbWUgPSBzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBzY3JpcHQpCiAgICAgICAgbmFtZXNwYWNlWydfX2ZpbGVfXyddID0gc2NyaXB0X2ZpbGVuYW1lCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2NyaXB0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc291cmNlID0gb3BlbihzY3JpcHRfZmlsZW5hbWUpLnJlYWQoKQogICAgICAgICAgICBjb2RlID0gY29tcGlsZShzb3VyY2UsIHNjcmlwdF9maWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICBleGVjKGNvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZyb20gbGluZWNhY2hlIGltcG9ydCBjYWNoZQogICAgICAgICAgICBjYWNoZVtzY3JpcHRfZmlsZW5hbWVdID0gKAogICAgICAgICAgICAgICAgbGVuKHNjcmlwdF90ZXh0KSwgMCwgc2NyaXB0X3RleHQuc3BsaXQoJ1xuJyksIHNjcmlwdF9maWxlbmFtZQogICAgICAgICAgICApCiAgICAgICAgICAgIHNjcmlwdF9jb2RlID0gY29tcGlsZShzY3JpcHRfdGV4dCwgc2NyaXB0X2ZpbGVuYW1lLCAnZXhlYycpCiAgICAgICAgICAgIGV4ZWMoc2NyaXB0X2NvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQoKICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfZm4oc2VsZiwgYmFzZSwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgaWYgcmVzb3VyY2VfbmFtZToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlLCAqcmVzb3VyY2VfbmFtZS5zcGxpdCgnLycpKQogICAgICAgIHJldHVybiBiYXNlCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLmxvYWRlciwgJ2dldF9kYXRhJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5nZXRfZGF0YShwYXRoKQogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciBsb2FkZXJzIHdpdGhvdXQgJ2dldF9kYXRhKCknIgogICAgICAgICkKCgpyZWdpc3Rlcl9sb2FkZXJfdHlwZShvYmplY3QsIE51bGxQcm92aWRlcikKCgpjbGFzcyBFZ2dQcm92aWRlcihOdWxsUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXIgYmFzZWQgb24gYSB2aXJ0dWFsIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBOdWxsUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCgogICAgZGVmIF9zZXR1cF9wcmVmaXgoc2VsZik6CiAgICAgICAgIyB3ZSBhc3N1bWUgaGVyZSB0aGF0IG91ciBtZXRhZGF0YSBtYXkgYmUgbmVzdGVkIGluc2lkZSBhICJiYXNrZXQiCiAgICAgICAgIyBvZiBtdWx0aXBsZSBlZ2dzOyB0aGF0J3Mgd2h5IHdlIHVzZSBtb2R1bGVfcGF0aCBpbnN0ZWFkIG9mIC5hcmNoaXZlCiAgICAgICAgcGF0aCA9IHNlbGYubW9kdWxlX3BhdGgKICAgICAgICBvbGQgPSBOb25lCiAgICAgICAgd2hpbGUgcGF0aCAhPSBvbGQ6CiAgICAgICAgICAgIGlmIF9pc191bnBhY2tlZF9lZ2cocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfcm9vdCA9IHBhdGgKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIG9sZCA9IHBhdGgKICAgICAgICAgICAgcGF0aCwgYmFzZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKCgpjbGFzcyBEZWZhdWx0UHJvdmlkZXIoRWdnUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIGluIHRoZSBmaWxlc3lzdGVtIiIiCgogICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2RpcihwYXRoKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBvcGVuKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpLCAncmInKQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucmVhZCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3JlZ2lzdGVyKGNscyk6CiAgICAgICAgbG9hZGVyX2NscyA9IGdldGF0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ1NvdXJjZUZpbGVMb2FkZXInLAogICAgICAgICAgICB0eXBlKE5vbmUpKQogICAgICAgIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl9jbHMsIGNscykKCgpEZWZhdWx0UHJvdmlkZXIuX3JlZ2lzdGVyKCkKCgpjbGFzcyBFbXB0eVByb3ZpZGVyKE51bGxQcm92aWRlcik6CiAgICAiIiJQcm92aWRlciB0aGF0IHJldHVybnMgbm90aGluZyBmb3IgYWxsIHJlcXVlc3RzIiIiCgogICAgX2lzZGlyID0gX2hhcyA9IGxhbWJkYSBzZWxmLCBwYXRoOiBGYWxzZQogICAgX2dldCA9IGxhbWJkYSBzZWxmLCBwYXRoOiAnJwogICAgX2xpc3RkaXIgPSBsYW1iZGEgc2VsZiwgcGF0aDogW10KICAgIG1vZHVsZV9wYXRoID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgoKZW1wdHlfcHJvdmlkZXIgPSBFbXB0eVByb3ZpZGVyKCkKCgpjbGFzcyBaaXBNYW5pZmVzdHMoZGljdCk6CiAgICAiIiIKICAgIHppcCBtYW5pZmVzdCBidWlsZGVyCiAgICAiIiIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBidWlsZChjbHMsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgZGljdGlvbmFyeSBzaW1pbGFyIHRvIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5CiAgICAgICAgY2FjaGVzLCBleGNlcHQgaW5zdGVhZCBvZiB0dXBsZXMsIHN0b3JlIFppcEluZm8gb2JqZWN0cy4KCiAgICAgICAgVXNlIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IgKG9zLnNlcCkgZm9yIHRoZSBwYXRoIGtleXMKICAgICAgICBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHB5cHkgb24gV2luZG93cy4KICAgICAgICAiIiIKICAgICAgICB3aXRoIENvbnRleHR1YWxaaXBGaWxlKHBhdGgpIGFzIHpmaWxlOgogICAgICAgICAgICBpdGVtcyA9ICgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBuYW1lLnJlcGxhY2UoJy8nLCBvcy5zZXApLAogICAgICAgICAgICAgICAgICAgIHpmaWxlLmdldGluZm8obmFtZSksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiB6ZmlsZS5uYW1lbGlzdCgpCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGRpY3QoaXRlbXMpCgogICAgbG9hZCA9IGJ1aWxkCgoKY2xhc3MgTWVtb2l6ZWRaaXBNYW5pZmVzdHMoWmlwTWFuaWZlc3RzKToKICAgICIiIgogICAgTWVtb2l6ZWQgemlwZmlsZSBtYW5pZmVzdHMuCiAgICAiIiIKICAgIG1hbmlmZXN0X21vZCA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ21hbmlmZXN0X21vZCcsICdtYW5pZmVzdCBtdGltZScpCgogICAgZGVmIGxvYWQoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCBhIG1hbmlmZXN0IGF0IHBhdGggb3IgcmV0dXJuIGEgc3VpdGFibGUgbWFuaWZlc3QgYWxyZWFkeSBsb2FkZWQuCiAgICAgICAgIiIiCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgocGF0aCkKICAgICAgICBtdGltZSA9IG9zLnN0YXQocGF0aCkuc3RfbXRpbWUKCiAgICAgICAgaWYgcGF0aCBub3QgaW4gc2VsZiBvciBzZWxmW3BhdGhdLm10aW1lICE9IG10aW1lOgogICAgICAgICAgICBtYW5pZmVzdCA9IHNlbGYuYnVpbGQocGF0aCkKICAgICAgICAgICAgc2VsZltwYXRoXSA9IHNlbGYubWFuaWZlc3RfbW9kKG1hbmlmZXN0LCBtdGltZSkKCiAgICAgICAgcmV0dXJuIHNlbGZbcGF0aF0ubWFuaWZlc3QKCgpjbGFzcyBDb250ZXh0dWFsWmlwRmlsZSh6aXBmaWxlLlppcEZpbGUpOgogICAgIiIiCiAgICBTdXBwbGVtZW50IFppcEZpbGUgY2xhc3MgdG8gc3VwcG9ydCBjb250ZXh0IG1hbmFnZXIgZm9yIFB5dGhvbiAyLjYKICAgICIiIgoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIENvbnN0cnVjdCBhIFppcEZpbGUgb3IgQ29udGV4dHVhbFppcEZpbGUgYXMgYXBwcm9wcmlhdGUKICAgICAgICAiIiIKICAgICAgICBpZiBoYXNhdHRyKHppcGZpbGUuWmlwRmlsZSwgJ19fZXhpdF9fJyk6CiAgICAgICAgICAgIHJldHVybiB6aXBmaWxlLlppcEZpbGUoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBzdXBlcihDb250ZXh0dWFsWmlwRmlsZSwgY2xzKS5fX25ld19fKGNscykKCgpjbGFzcyBaaXBQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJSZXNvdXJjZSBzdXBwb3J0IGZvciB6aXBzIGFuZCBlZ2dzIiIiCgogICAgZWFnZXJzID0gTm9uZQogICAgX3ppcF9tYW5pZmVzdHMgPSBNZW1vaXplZFppcE1hbmlmZXN0cygpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgRWdnUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuemlwX3ByZSA9IHNlbGYubG9hZGVyLmFyY2hpdmUgKyBvcy5zZXAKCiAgICBkZWYgX3ppcGluZm9fbmFtZShzZWxmLCBmc3BhdGgpOgogICAgICAgICMgQ29udmVydCBhIHZpcnR1YWwgZmlsZW5hbWUgKGZ1bGwgcGF0aCB0byBmaWxlKSBpbnRvIGEgemlwZmlsZSBzdWJwYXRoCiAgICAgICAgIyB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeSBjYWNoZSBmb3Igb3VyIHRhcmdldCBhcmNoaXZlCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi56aXBfcHJlKToKICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi56aXBfcHJlKTpdCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuemlwX3ByZSkKICAgICAgICApCgogICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydCBsaXN0LgogICAgICAgICMgcHNldWRvLWZzIHBhdGgKICAgICAgICBmc3BhdGggPSBzZWxmLnppcF9wcmUgKyB6aXBfcGF0aAogICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLmVnZ19yb290KSArIDE6XS5zcGxpdChvcy5zZXApCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHppcGluZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcF9tYW5pZmVzdHMubG9hZChzZWxmLmxvYWRlci5hcmNoaXZlKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX25hbWU6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90IC56aXAiCiAgICAgICAgICAgICkKICAgICAgICAjIG5vIG5lZWQgdG8gbG9jayBmb3IgZXh0cmFjdGlvbiwgc2luY2Ugd2UgdXNlIHRlbXAgbmFtZXMKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3Jlc291cmNlX3RvX3ppcChyZXNvdXJjZV9uYW1lKQogICAgICAgIGVhZ2VycyA9IHNlbGYuX2dldF9lYWdlcl9yZXNvdXJjZXMoKQogICAgICAgIGlmICcvJy5qb2luKHNlbGYuX3BhcnRzKHppcF9wYXRoKSkgaW4gZWFnZXJzOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBlYWdlcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHNlbGYuX2VhZ2VyX3RvX3ppcChuYW1lKSkKICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCB6aXBfcGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9kYXRlX2FuZF9zaXplKHppcF9zdGF0KToKICAgICAgICBzaXplID0gemlwX3N0YXQuZmlsZV9zaXplCiAgICAgICAgIyB5bWRobXMrd2RheSwgeWRheSwgZHN0CiAgICAgICAgZGF0ZV90aW1lID0gemlwX3N0YXQuZGF0ZV90aW1lICsgKDAsIDAsIC0xKQogICAgICAgICMgMTk4MCBvZmZzZXQgYWxyZWFkeSBkb25lCiAgICAgICAgdGltZXN0YW1wID0gdGltZS5ta3RpbWUoZGF0ZV90aW1lKQogICAgICAgIHJldHVybiB0aW1lc3RhbXAsIHNpemUKCiAgICBkZWYgX2V4dHJhY3RfcmVzb3VyY2Uoc2VsZiwgbWFuYWdlciwgemlwX3BhdGgpOgoKICAgICAgICBpZiB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLl9pbmRleCgpW3ppcF9wYXRoXToKICAgICAgICAgICAgICAgIGxhc3QgPSBzZWxmLl9leHRyYWN0X3Jlc291cmNlKAogICAgICAgICAgICAgICAgICAgIG1hbmFnZXIsIG9zLnBhdGguam9pbih6aXBfcGF0aCwgbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIyByZXR1cm4gdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgbmFtZQogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKGxhc3QpCgogICAgICAgIHRpbWVzdGFtcCwgc2l6ZSA9IHNlbGYuX2dldF9kYXRlX2FuZF9zaXplKHNlbGYuemlwaW5mb1t6aXBfcGF0aF0pCgogICAgICAgIGlmIG5vdCBXUklURV9TVVBQT1JUOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MucmVuYW1lIiBhbmQgIm9zLnVubGluayIgYXJlIG5vdCBzdXBwb3J0ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICdvbiB0aGlzIHBsYXRmb3JtJykKICAgICAgICB0cnk6CgogICAgICAgICAgICByZWFsX3BhdGggPSBtYW5hZ2VyLmdldF9jYWNoZV9wYXRoKAogICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSwgc2VsZi5fcGFydHMoemlwX3BhdGgpCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIHNlbGYuX2lzX2N1cnJlbnQocmVhbF9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCgogICAgICAgICAgICBvdXRmLCB0bXBuYW0gPSBfbWtzdGVtcCgiLiRleHRyYWN0IiwgZGlyPW9zLnBhdGguZGlybmFtZShyZWFsX3BhdGgpKQogICAgICAgICAgICBvcy53cml0ZShvdXRmLCBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkpCiAgICAgICAgICAgIG9zLmNsb3NlKG91dGYpCiAgICAgICAgICAgIHV0aW1lKHRtcG5hbSwgKHRpbWVzdGFtcCwgdGltZXN0YW1wKSkKICAgICAgICAgICAgbWFuYWdlci5wb3N0cHJvY2Vzcyh0bXBuYW0sIHJlYWxfcGF0aCkKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlbmFtZSh0bXBuYW0sIHJlYWxfcGF0aCkKCiAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHJlYWxfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfY3VycmVudChyZWFsX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZmlsZSBiZWNhbWUgY3VycmVudCBzaW5jZSBpdCB3YXMgY2hlY2tlZCBhYm92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIyAgc28gcHJvY2VlZC4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAogICAgICAgICAgICAgICAgICAgICMgV2luZG93cywgZGVsIG9sZCBmaWxlIGFuZCByZXRyeQogICAgICAgICAgICAgICAgICAgIGVsaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmsocmVhbF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgIyByZXBvcnQgYSB1c2VyLWZyaWVuZGx5IGVycm9yCiAgICAgICAgICAgIG1hbmFnZXIuZXh0cmFjdGlvbl9lcnJvcigpCgogICAgICAgIHJldHVybiByZWFsX3BhdGgKCiAgICBkZWYgX2lzX2N1cnJlbnQoc2VsZiwgZmlsZV9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIGZpbGVfcGF0aCBpcyBjdXJyZW50IGZvciB0aGlzIHppcF9wYXRoCiAgICAgICAgIiIiCiAgICAgICAgdGltZXN0YW1wLCBzaXplID0gc2VsZi5fZ2V0X2RhdGVfYW5kX3NpemUoc2VsZi56aXBpbmZvW3ppcF9wYXRoXSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZV9wYXRoKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgc3RhdCA9IG9zLnN0YXQoZmlsZV9wYXRoKQogICAgICAgIGlmIHN0YXQuc3Rfc2l6ZSAhPSBzaXplIG9yIHN0YXQuc3RfbXRpbWUgIT0gdGltZXN0YW1wOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIGNvbnRlbnRzIG1hdGNoCiAgICAgICAgemlwX2NvbnRlbnRzID0gc2VsZi5sb2FkZXIuZ2V0X2RhdGEoemlwX3BhdGgpCiAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGYucmVhZCgpCiAgICAgICAgcmV0dXJuIHppcF9jb250ZW50cyA9PSBmaWxlX2NvbnRlbnRzCgogICAgZGVmIF9nZXRfZWFnZXJfcmVzb3VyY2VzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZWFnZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGVhZ2VycyA9IFtdCiAgICAgICAgICAgIGZvciBuYW1lIGluICgnbmF0aXZlX2xpYnMudHh0JywgJ2VhZ2VyX3Jlc291cmNlcy50eHQnKToKICAgICAgICAgICAgICAgIGlmIHNlbGYuaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICAgICAgICAgIGVhZ2Vycy5leHRlbmQoc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSkpCiAgICAgICAgICAgIHNlbGYuZWFnZXJzID0gZWFnZXJzCiAgICAgICAgcmV0dXJuIHNlbGYuZWFnZXJzCgogICAgZGVmIF9pbmRleChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kaXJpbmRleAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgaW5kID0ge30KICAgICAgICAgICAgZm9yIHBhdGggaW4gc2VsZi56aXBpbmZvOgogICAgICAgICAgICAgICAgcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzOgogICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IG9zLnNlcC5qb2luKHBhcnRzWzotMV0pCiAgICAgICAgICAgICAgICAgICAgaWYgcGFyZW50IGluIGluZDoKICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0uYXBwZW5kKHBhcnRzWy0xXSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XSA9IFtwYXJ0cy5wb3AoKV0KICAgICAgICAgICAgc2VsZi5fZGlyaW5kZXggPSBpbmQKICAgICAgICAgICAgcmV0dXJuIGluZAoKICAgIGRlZiBfaGFzKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgemlwX3BhdGggPSBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKQogICAgICAgIHJldHVybiB6aXBfcGF0aCBpbiBzZWxmLnppcGluZm8gb3IgemlwX3BhdGggaW4gc2VsZi5faW5kZXgoKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgZnNwYXRoKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkgaW4gc2VsZi5faW5kZXgoKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBmc3BhdGgpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX2luZGV4KCkuZ2V0KHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpLCAoKSkpCgogICAgZGVmIF9lYWdlcl90b196aXAoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShzZWxmLl9mbihzZWxmLmVnZ19yb290LCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgX3Jlc291cmNlX3RvX3ppcChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKCnJlZ2lzdGVyX2xvYWRlcl90eXBlKHppcGltcG9ydC56aXBpbXBvcnRlciwgWmlwUHJvdmlkZXIpCgoKY2xhc3MgRmlsZU1ldGFkYXRhKEVtcHR5UHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgaGFuZGxlciBmb3Igc3RhbmRhbG9uZSBQS0ctSU5GTyBmaWxlcwoKICAgIFVzYWdlOjoKCiAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEoIi9wYXRoL3RvL1BLRy1JTkZPIikKCiAgICBUaGlzIHByb3ZpZGVyIHJlamVjdHMgYWxsIGRhdGEgYW5kIG1ldGFkYXRhIHJlcXVlc3RzIGV4Y2VwdCBmb3IgUEtHLUlORk8sCiAgICB3aGljaCBpcyB0cmVhdGVkIGFzIGV4aXN0aW5nLCBhbmQgd2lsbCBiZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXQKICAgIHRoZSBwcm92aWRlZCBsb2NhdGlvbi4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCgogICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gbmFtZSA9PSAnUEtHLUlORk8nIGFuZCBvcy5wYXRoLmlzZmlsZShzZWxmLnBhdGgpCgogICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lICE9ICdQS0ctSU5GTyc6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJObyBtZXRhZGF0YSBleGNlcHQgUEtHLUlORk8gaXMgYXZhaWxhYmxlIikKCiAgICAgICAgd2l0aCBpby5vcGVuKHNlbGYucGF0aCwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSJyZXBsYWNlIikgYXMgZjoKICAgICAgICAgICAgbWV0YWRhdGEgPSBmLnJlYWQoKQogICAgICAgIHNlbGYuX3dhcm5fb25fcmVwbGFjZW1lbnQobWV0YWRhdGEpCiAgICAgICAgcmV0dXJuIG1ldGFkYXRhCgogICAgZGVmIF93YXJuX29uX3JlcGxhY2VtZW50KHNlbGYsIG1ldGFkYXRhKToKICAgICAgICAjIFB5dGhvbiAyLjYgYW5kIDMuMiBjb21wYXQgZm9yOiByZXBsYWNlbWVudF9jaGFyID0gJ++/vScKICAgICAgICByZXBsYWNlbWVudF9jaGFyID0gYidceGVmXHhiZlx4YmQnLmRlY29kZSgndXRmLTgnKQogICAgICAgIGlmIHJlcGxhY2VtZW50X2NoYXIgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgIHRtcGwgPSAie3NlbGYucGF0aH0gY291bGQgbm90IGJlIHByb3Blcmx5IGRlY29kZWQgaW4gVVRGLTgiCiAgICAgICAgICAgIG1zZyA9IHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKCmNsYXNzIFBhdGhNZXRhZGF0YShEZWZhdWx0UHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIGVnZyBkaXJlY3RvcmllcwoKICAgIFVzYWdlOjoKCiAgICAgICAgIyBEZXZlbG9wbWVudCBlZ2dzOgoKICAgICAgICBlZ2dfaW5mbyA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS5lZ2ctaW5mbyIKICAgICAgICBiYXNlX2RpciA9IG9zLnBhdGguZGlybmFtZShlZ2dfaW5mbykKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShiYXNlX2RpciwgZWdnX2luZm8pCiAgICAgICAgZGlzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGVnZ19pbmZvKSlbMF0KICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGJhc2VkaXIsIHByb2plY3RfbmFtZT1kaXN0X25hbWUsIG1ldGFkYXRhPW1ldGFkYXRhKQoKICAgICAgICAjIFVucGFja2VkIGVnZyBkaXJlY3RvcmllczoKCiAgICAgICAgZWdnX3BhdGggPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUtdmVyLXB5dmVyLWV0Yy5lZ2ciCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoZWdnX3BhdGgsIG9zLnBhdGguam9pbihlZ2dfcGF0aCwnRUdHLUlORk8nKSkKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoZWdnX3BhdGgsIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGVnZ19pbmZvKToKICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gcGF0aAogICAgICAgIHNlbGYuZWdnX2luZm8gPSBlZ2dfaW5mbwoKCmNsYXNzIEVnZ01ldGFkYXRhKFppcFByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciAuZWdnIGZpbGVzIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGltcG9ydGVyKToKICAgICAgICAiIiJDcmVhdGUgYSBtZXRhZGF0YSBwcm92aWRlciBmcm9tIGEgemlwaW1wb3J0ZXIiIiIKCiAgICAgICAgc2VsZi56aXBfcHJlID0gaW1wb3J0ZXIuYXJjaGl2ZSArIG9zLnNlcAogICAgICAgIHNlbGYubG9hZGVyID0gaW1wb3J0ZXIKICAgICAgICBpZiBpbXBvcnRlci5wcmVmaXg6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oaW1wb3J0ZXIuYXJjaGl2ZSwgaW1wb3J0ZXIucHJlZml4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBpbXBvcnRlci5hcmNoaXZlCiAgICAgICAgc2VsZi5fc2V0dXBfcHJlZml4KCkKCgpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9kaXN0cmlidXRpb25fZmluZGVycz17fSkKCgpkZWYgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGVyX3R5cGUsIGRpc3RyaWJ1dGlvbl9maW5kZXIpOgogICAgIiIiUmVnaXN0ZXIgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIHRvIGZpbmQgZGlzdHJpYnV0aW9ucyBpbiBzeXMucGF0aCBpdGVtcwoKICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQogICAgaGFuZGxlciksIGFuZCBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgaXMgYSBjYWxsYWJsZSB0aGF0LCBwYXNzZWQgYSBwYXRoCiAgICBpdGVtIGFuZCB0aGUgaW1wb3J0ZXIgaW5zdGFuY2UsIHlpZWxkcyBgYERpc3RyaWJ1dGlvbmBgIGluc3RhbmNlcyBmb3VuZCBvbgogICAgdGhhdCBwYXRoIGl0ZW0uICBTZWUgYGBwa2dfcmVzb3VyY2VzLmZpbmRfb25fcGF0aGBgIGZvciBhbiBleGFtcGxlLiIiIgogICAgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzW2ltcG9ydGVyX3R5cGVdID0gZGlzdHJpYnV0aW9uX2ZpbmRlcgoKCmRlZiBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSB2aWEgYHBhdGhfaXRlbWAiIiIKICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKICAgIGZpbmRlciA9IF9maW5kX2FkYXB0ZXIoX2Rpc3RyaWJ1dGlvbl9maW5kZXJzLCBpbXBvcnRlcikKICAgIHJldHVybiBmaW5kZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSkKCgpkZWYgZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIgogICAgRmluZCBlZ2dzIGluIHppcCBmaWxlczsgcG9zc2libHkgbXVsdGlwbGUgbmVzdGVkIGVnZ3MuCiAgICAiIiIKICAgIGlmIGltcG9ydGVyLmFyY2hpdmUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAjIHdoZWVscyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgZmluZGVyCiAgICAgICAgIyB0aGV5IGRvbid0IGhhdmUgUEtHLUlORk8gbWV0YWRhdGEsIGFuZCB3b24ndCBldmVyIGNvbnRhaW4gZWdncwogICAgICAgIHJldHVybgogICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YShpbXBvcnRlcikKICAgIGlmIG1ldGFkYXRhLmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShwYXRoX2l0ZW0sIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgaWYgb25seToKICAgICAgICAjIGRvbid0IHlpZWxkIG5lc3RlZCBkaXN0cm9zCiAgICAgICAgcmV0dXJuCiAgICBmb3Igc3ViaXRlbSBpbiBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKCcvJyk6CiAgICAgICAgaWYgX2lzX3VucGFja2VkX2VnZyhzdWJpdGVtKToKICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgIGZvciBkaXN0IGluIGZpbmRfZWdnc19pbl96aXAoemlwaW1wb3J0LnppcGltcG9ydGVyKHN1YnBhdGgpLCBzdWJwYXRoKToKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCgpyZWdpc3Rlcl9maW5kZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaW5kX2VnZ3NfaW5femlwKQoKCmRlZiBmaW5kX25vdGhpbmcoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICByZXR1cm4gKCkKCgpyZWdpc3Rlcl9maW5kZXIob2JqZWN0LCBmaW5kX25vdGhpbmcpCgoKZGVmIF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpOgogICAgIiIiCiAgICBHaXZlbiBhIGxpc3Qgb2YgZmlsZW5hbWVzLCByZXR1cm4gdGhlbSBpbiBkZXNjZW5kaW5nIG9yZGVyCiAgICBieSB2ZXJzaW9uIG51bWJlci4KCiAgICA+Pj4gbmFtZXMgPSAnYmFyJywgJ2ZvbycsICdQeXRob24tMi43LjEwLmVnZycsICdQeXRob24tMi43LjIuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnLCAnZm9vJywgJ2JhciddCiAgICA+Pj4gbmFtZXMgPSAnU2V0dXB0b29scy0xLjIuM2IxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydTZXR1cHRvb2xzLTEuMi4zLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgIiIiCiAgICBkZWYgX2J5X3ZlcnNpb24obmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgZWFjaCBjb21wb25lbnQgb2YgdGhlIGZpbGVuYW1lCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQogICAgICAgIHBhcnRzID0gaXRlcnRvb2xzLmNoYWluKG5hbWUuc3BsaXQoJy0nKSwgW2V4dF0pCiAgICAgICAgcmV0dXJuIFtwYWNrYWdpbmcudmVyc2lvbi5wYXJzZShwYXJ0KSBmb3IgcGFydCBpbiBwYXJ0c10KCiAgICByZXR1cm4gc29ydGVkKG5hbWVzLCBrZXk9X2J5X3ZlcnNpb24sIHJldmVyc2U9VHJ1ZSkKCgpkZWYgZmluZF9vbl9wYXRoKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIG9uIGEgc3lzLnBhdGggZGlyZWN0b3J5IiIiCiAgICBwYXRoX2l0ZW0gPSBfbm9ybWFsaXplX2NhY2hlZChwYXRoX2l0ZW0pCgogICAgaWYgb3MucGF0aC5pc2RpcihwYXRoX2l0ZW0pIGFuZCBvcy5hY2Nlc3MocGF0aF9pdGVtLCBvcy5SX09LKToKICAgICAgICBpZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGhfaXRlbSk6CiAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAogICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBtZXRhZGF0YT1QYXRoTWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCAnRUdHLUlORk8nKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBzY2FuIGZvciAuZWdnIGFuZCAuZWdnLWluZm8gaW4gZGlyZWN0b3J5CiAgICAgICAgICAgIHBhdGhfaXRlbV9lbnRyaWVzID0gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhvcy5saXN0ZGlyKHBhdGhfaXRlbSkpCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBwYXRoX2l0ZW1fZW50cmllczoKICAgICAgICAgICAgICAgIGxvd2VyID0gZW50cnkubG93ZXIoKQogICAgICAgICAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctaW5mbycpIG9yIGxvd2VyLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBlbnRyeSkKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxwYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBlZ2ctaW5mbyBkaXJlY3RvcnksIGFsbG93IGdldHRpbmcgbWV0YWRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG9zLmxpc3RkaXIoZnVsbHBhdGgpKSA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFbXB0eSBlZ2cgZGlyZWN0b3J5LCBza2lwLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEocGF0aF9pdGVtLCBmdWxscGF0aCkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YShmdWxscGF0aCkKICAgICAgICAgICAgICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBlbnRyeSwgbWV0YWRhdGEsIHByZWNlZGVuY2U9REVWRUxPUF9ESVNUCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxpZiBub3Qgb25seSBhbmQgX2lzX3VucGFja2VkX2VnZyhlbnRyeSk6CiAgICAgICAgICAgICAgICAgICAgZGlzdHMgPSBmaW5kX2Rpc3RyaWJ1dGlvbnMob3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpKQogICAgICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgICAgICAgICBlbGlmIG5vdCBvbmx5IGFuZCBsb3dlci5lbmRzd2l0aCgnLmVnZy1saW5rJyk6CiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KSkgYXMgZW50cnlfZmlsZToKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfbGluZXMgPSBlbnRyeV9maWxlLnJlYWRsaW5lcygpCiAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZW50cnlfbGluZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0cmlwKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgbGluZS5yc3RyaXAoKSkKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHMgPSBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZGlzdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgoKcmVnaXN0ZXJfZmluZGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbmRfb25fcGF0aCkKCmlmIGhhc2F0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ0ZpbGVGaW5kZXInKToKICAgIHJlZ2lzdGVyX2ZpbmRlcihpbXBvcnRsaWJfbWFjaGluZXJ5LkZpbGVGaW5kZXIsIGZpbmRfb25fcGF0aCkKCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX25hbWVzcGFjZV9oYW5kbGVycz17fSkKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfbmFtZXNwYWNlX3BhY2thZ2VzPXt9KQoKCmRlZiByZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlcl90eXBlLCBuYW1lc3BhY2VfaGFuZGxlcik6CiAgICAiIiJSZWdpc3RlciBgbmFtZXNwYWNlX2hhbmRsZXJgIHRvIGRlY2xhcmUgbmFtZXNwYWNlIHBhY2thZ2VzCgogICAgYGltcG9ydGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiAiSW1wb3J0ZXIiIChzeXMucGF0aCBpdGVtCiAgICBoYW5kbGVyKSwgYW5kIGBuYW1lc3BhY2VfaGFuZGxlcmAgaXMgYSBjYWxsYWJsZSBsaWtlIHRoaXM6OgoKICAgICAgICBkZWYgbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfZW50cnksIG1vZHVsZU5hbWUsIG1vZHVsZSk6CiAgICAgICAgICAgICMgcmV0dXJuIGEgcGF0aF9lbnRyeSB0byB1c2UgZm9yIGNoaWxkIHBhY2thZ2VzCgogICAgTmFtZXNwYWNlIGhhbmRsZXJzIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgaW1wb3J0ZXIgb2JqZWN0IGhhcyBhbHJlYWR5CiAgICBhZ3JlZWQgdGhhdCBpdCBjYW4gaGFuZGxlIHRoZSByZWxldmFudCBwYXRoIGl0ZW0sIGFuZCB0aGV5IHNob3VsZCBvbmx5CiAgICByZXR1cm4gYSBzdWJwYXRoIGlmIHRoZSBtb2R1bGUgX19wYXRoX18gZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuCiAgICBlcXVpdmFsZW50IHN1YnBhdGguICBGb3IgYW4gZXhhbXBsZSBuYW1lc3BhY2UgaGFuZGxlciwgc2VlCiAgICBgYHBrZ19yZXNvdXJjZXMuZmlsZV9uc19oYW5kbGVyYGAuCiAgICAiIiIKICAgIF9uYW1lc3BhY2VfaGFuZGxlcnNbaW1wb3J0ZXJfdHlwZV0gPSBuYW1lc3BhY2VfaGFuZGxlcgoKCmRlZiBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pOgogICAgIiIiRW5zdXJlIHRoYXQgbmFtZWQgcGFja2FnZSBpbmNsdWRlcyBhIHN1YnBhdGggb2YgcGF0aF9pdGVtIChpZiBuZWVkZWQpIiIiCgogICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQogICAgaWYgaW1wb3J0ZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUocGFja2FnZU5hbWUpCiAgICBpZiBsb2FkZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgbW9kdWxlID0gc3lzLm1vZHVsZXMuZ2V0KHBhY2thZ2VOYW1lKQogICAgaWYgbW9kdWxlIGlzIE5vbmU6CiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdID0gdHlwZXMuTW9kdWxlVHlwZShwYWNrYWdlTmFtZSkKICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbXQogICAgICAgIF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKQogICAgZWxpZiBub3QgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYWNrYWdlTmFtZSkKICAgIGhhbmRsZXIgPSBfZmluZF9hZGFwdGVyKF9uYW1lc3BhY2VfaGFuZGxlcnMsIGltcG9ydGVyKQogICAgc3VicGF0aCA9IGhhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSkKICAgIGlmIHN1YnBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgcGF0aCA9IG1vZHVsZS5fX3BhdGhfXwogICAgICAgIHBhdGguYXBwZW5kKHN1YnBhdGgpCiAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKHBhY2thZ2VOYW1lKQogICAgICAgIF9yZWJ1aWxkX21vZF9wYXRoKHBhdGgsIHBhY2thZ2VOYW1lLCBtb2R1bGUpCiAgICByZXR1cm4gc3VicGF0aAoKCmRlZiBfcmVidWlsZF9tb2RfcGF0aChvcmlnX3BhdGgsIHBhY2thZ2VfbmFtZSwgbW9kdWxlKToKICAgICIiIgogICAgUmVidWlsZCBtb2R1bGUuX19wYXRoX18gZW5zdXJpbmcgdGhhdCBhbGwgZW50cmllcyBhcmUgb3JkZXJlZAogICAgY29ycmVzcG9uZGluZyB0byB0aGVpciBzeXMucGF0aCBvcmRlcgogICAgIiIiCiAgICBzeXNfcGF0aCA9IFtfbm9ybWFsaXplX2NhY2hlZChwKSBmb3IgcCBpbiBzeXMucGF0aF0KCiAgICBkZWYgc2FmZV9zeXNfcGF0aF9pbmRleChlbnRyeSk6CiAgICAgICAgIiIiCiAgICAgICAgV29ya2Fyb3VuZCBmb3IgIzUyMCBhbmQgIzUxMy4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzeXNfcGF0aC5pbmRleChlbnRyeSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIGZsb2F0KCdpbmYnKQoKICAgIGRlZiBwb3NpdGlvbl9pbl9zeXNfcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG9yZGluYWwgb2YgdGhlIHBhdGggYmFzZWQgb24gaXRzIHBvc2l0aW9uIGluIHN5cy5wYXRoCiAgICAgICAgIiIiCiAgICAgICAgcGF0aF9wYXJ0cyA9IHBhdGguc3BsaXQob3Muc2VwKQogICAgICAgIG1vZHVsZV9wYXJ0cyA9IHBhY2thZ2VfbmFtZS5jb3VudCgnLicpICsgMQogICAgICAgIHBhcnRzID0gcGF0aF9wYXJ0c1s6LW1vZHVsZV9wYXJ0c10KICAgICAgICByZXR1cm4gc2FmZV9zeXNfcGF0aF9pbmRleChfbm9ybWFsaXplX2NhY2hlZChvcy5zZXAuam9pbihwYXJ0cykpKQoKICAgIG9yaWdfcGF0aC5zb3J0KGtleT1wb3NpdGlvbl9pbl9zeXNfcGF0aCkKICAgIG1vZHVsZS5fX3BhdGhfX1s6XSA9IFtfbm9ybWFsaXplX2NhY2hlZChwKSBmb3IgcCBpbiBvcmlnX3BhdGhdCgoKZGVmIGRlY2xhcmVfbmFtZXNwYWNlKHBhY2thZ2VOYW1lKToKICAgICIiIkRlY2xhcmUgdGhhdCBwYWNrYWdlICdwYWNrYWdlTmFtZScgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSIiIgoKICAgIF9pbXAuYWNxdWlyZV9sb2NrKCkKICAgIHRyeToKICAgICAgICBpZiBwYWNrYWdlTmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcGF0aCwgcGFyZW50ID0gc3lzLnBhdGgsIE5vbmUKICAgICAgICBpZiAnLicgaW4gcGFja2FnZU5hbWU6CiAgICAgICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhY2thZ2VOYW1lLnNwbGl0KCcuJylbOi0xXSkKICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGFyZW50KQogICAgICAgICAgICBpZiBwYXJlbnQgbm90IGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKHBhcmVudCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzW3BhcmVudF0uX19wYXRoX18KICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhcmVudCkKCiAgICAgICAgIyBUcmFjayB3aGF0IHBhY2thZ2VzIGFyZSBuYW1lc3BhY2VzLCBzbyB3aGVuIG5ldyBwYXRoIGl0ZW1zIGFyZSBhZGRlZCwKICAgICAgICAjIHRoZXkgY2FuIGJlIHVwZGF0ZWQKICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFyZW50LCBbXSkuYXBwZW5kKHBhY2thZ2VOYW1lKQogICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYWNrYWdlTmFtZSwgW10pCgogICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gcGF0aDoKICAgICAgICAgICAgIyBFbnN1cmUgYWxsIHRoZSBwYXJlbnQncyBwYXRoIGl0ZW1zIGFyZSByZWZsZWN0ZWQgaW4gdGhlIGNoaWxkLAogICAgICAgICAgICAjIGlmIHRoZXkgYXBwbHkKICAgICAgICAgICAgX2hhbmRsZV9ucyhwYWNrYWdlTmFtZSwgcGF0aF9pdGVtKQoKICAgIGZpbmFsbHk6CiAgICAgICAgX2ltcC5yZWxlYXNlX2xvY2soKQoKCmRlZiBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMocGF0aF9pdGVtLCBwYXJlbnQ9Tm9uZSk6CiAgICAiIiJFbnN1cmUgdGhhdCBwcmV2aW91c2x5LWRlY2xhcmVkIG5hbWVzcGFjZSBwYWNrYWdlcyBpbmNsdWRlIHBhdGhfaXRlbSIiIgogICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgdHJ5OgogICAgICAgIGZvciBwYWNrYWdlIGluIF9uYW1lc3BhY2VfcGFja2FnZXMuZ2V0KHBhcmVudCwgKCkpOgogICAgICAgICAgICBzdWJwYXRoID0gX2hhbmRsZV9ucyhwYWNrYWdlLCBwYXRoX2l0ZW0pCiAgICAgICAgICAgIGlmIHN1YnBhdGg6CiAgICAgICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc3VicGF0aCwgcGFja2FnZSkKICAgIGZpbmFsbHk6CiAgICAgICAgX2ltcC5yZWxlYXNlX2xvY2soKQoKCmRlZiBmaWxlX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CiAgICAiIiJDb21wdXRlIGFuIG5zLXBhY2thZ2Ugc3VicGF0aCBmb3IgYSBmaWxlc3lzdGVtIG9yIHppcGZpbGUgaW1wb3J0ZXIiIiIKCiAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgcGFja2FnZU5hbWUuc3BsaXQoJy4nKVstMV0pCiAgICBub3JtYWxpemVkID0gX25vcm1hbGl6ZV9jYWNoZWQoc3VicGF0aCkKICAgIGZvciBpdGVtIGluIG1vZHVsZS5fX3BhdGhfXzoKICAgICAgICBpZiBfbm9ybWFsaXplX2NhY2hlZChpdGVtKSA9PSBub3JtYWxpemVkOgogICAgICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICAjIE9ubHkgcmV0dXJuIHRoZSBwYXRoIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUKICAgICAgICByZXR1cm4gc3VicGF0aAoKCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCgppZiBoYXNhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksICdGaWxlRmluZGVyJyk6CiAgICByZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRsaWJfbWFjaGluZXJ5LkZpbGVGaW5kZXIsIGZpbGVfbnNfaGFuZGxlcikKCgpkZWYgbnVsbF9uc19oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpOgogICAgcmV0dXJuIE5vbmUKCgpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihvYmplY3QsIG51bGxfbnNfaGFuZGxlcikKCgpkZWYgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpOgogICAgIiIiTm9ybWFsaXplIGEgZmlsZS9kaXIgbmFtZSBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcyIiIgogICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChmaWxlbmFtZSkpCgoKZGVmIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lLCBfY2FjaGU9e30pOgogICAgdHJ5OgogICAgICAgIHJldHVybiBfY2FjaGVbZmlsZW5hbWVdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgX2NhY2hlW2ZpbGVuYW1lXSA9IHJlc3VsdCA9IG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKQogICAgICAgIHJldHVybiByZXN1bHQKCgpkZWYgX2lzX3VucGFja2VkX2VnZyhwYXRoKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIGdpdmVuIHBhdGggYXBwZWFycyB0byBiZSBhbiB1bnBhY2tlZCBlZ2cuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgcGF0aC5sb3dlcigpLmVuZHN3aXRoKCcuZWdnJykKICAgICkKCgpkZWYgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpOgogICAgcGFydHMgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLicpCiAgICBuYW1lID0gcGFydHMucG9wKCkKICAgIGlmIHBhcnRzOgogICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhcnRzKQogICAgICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbcGFyZW50XSwgbmFtZSwgc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdKQoKCmRlZiB5aWVsZF9saW5lcyhzdHJzKToKICAgICIiIllpZWxkIG5vbi1lbXB0eS9ub24tY29tbWVudCBsaW5lcyBvZiBhIHN0cmluZyBvciBzZXF1ZW5jZSIiIgogICAgaWYgaXNpbnN0YW5jZShzdHJzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBmb3IgcyBpbiBzdHJzLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgcyA9IHMuc3RyaXAoKQogICAgICAgICAgICAjIHNraXAgYmxhbmsgbGluZXMvY29tbWVudHMKICAgICAgICAgICAgaWYgcyBhbmQgbm90IHMuc3RhcnRzd2l0aCgnIycpOgogICAgICAgICAgICAgICAgeWllbGQgcwogICAgZWxzZToKICAgICAgICBmb3Igc3MgaW4gc3RyczoKICAgICAgICAgICAgZm9yIHMgaW4geWllbGRfbGluZXMoc3MpOgogICAgICAgICAgICAgICAgeWllbGQgcwoKCk1PRFVMRSA9IHJlLmNvbXBpbGUociJcdysoXC5cdyspKiQiKS5tYXRjaApFR0dfTkFNRSA9IHJlLmNvbXBpbGUoCiAgICByIiIiCiAgICAoP1A8bmFtZT5bXi1dKykgKAogICAgICAgIC0oP1A8dmVyPlteLV0rKSAoCiAgICAgICAgICAgIC1weSg/UDxweXZlcj5bXi1dKykgKAogICAgICAgICAgICAgICAgLSg/UDxwbGF0Pi4rKQogICAgICAgICAgICApPwogICAgICAgICk/CiAgICApPwogICAgIiIiLAogICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCikubWF0Y2gKCgpjbGFzcyBFbnRyeVBvaW50KG9iamVjdCk6CiAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIGFuIGFkdmVydGlzZWQgaW1wb3J0YWJsZSBvYmplY3QiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kdWxlX25hbWUsIGF0dHJzPSgpLCBleHRyYXM9KCksIGRpc3Q9Tm9uZSk6CiAgICAgICAgaWYgbm90IE1PRFVMRShtb2R1bGVfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgbW9kdWxlIG5hbWUiLCBtb2R1bGVfbmFtZSkKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5tb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5hdHRycyA9IHR1cGxlKGF0dHJzKQogICAgICAgIHNlbGYuZXh0cmFzID0gUmVxdWlyZW1lbnQucGFyc2UoKCJ4WyVzXSIgJSAnLCcuam9pbihleHRyYXMpKSkuZXh0cmFzCiAgICAgICAgc2VsZi5kaXN0ID0gZGlzdAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHMgPSAiJXMgPSAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLm1vZHVsZV9uYW1lKQogICAgICAgIGlmIHNlbGYuYXR0cnM6CiAgICAgICAgICAgIHMgKz0gJzonICsgJy4nLmpvaW4oc2VsZi5hdHRycykKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcyArPSAnIFslc10nICUgJywnLmpvaW4oc2VsZi5leHRyYXMpCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJFbnRyeVBvaW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBkZWYgbG9hZChzZWxmLCByZXF1aXJlPVRydWUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVxdWlyZSBwYWNrYWdlcyBmb3IgdGhpcyBFbnRyeVBvaW50LCB0aGVuIHJlc29sdmUgaXQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmUgb3IgYXJncyBvciBrd2FyZ3M6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiUGFyYW1ldGVycyB0byBsb2FkIGFyZSBkZXByZWNhdGVkLiAgQ2FsbCAucmVzb2x2ZSBhbmQgIgogICAgICAgICAgICAgICAgIi5yZXF1aXJlIHNlcGFyYXRlbHkuIiwKICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MiwKICAgICAgICAgICAgKQogICAgICAgIGlmIHJlcXVpcmU6CiAgICAgICAgICAgIHNlbGYucmVxdWlyZSgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSgpCgogICAgZGVmIHJlc29sdmUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzb2x2ZSB0aGUgZW50cnkgcG9pbnQgZnJvbSBpdHMgbW9kdWxlIGFuZCBhdHRycy4KICAgICAgICAiIiIKICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKHNlbGYubW9kdWxlX25hbWUsIGZyb21saXN0PVsnX19uYW1lX18nXSwgbGV2ZWw9MCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmdW5jdG9vbHMucmVkdWNlKGdldGF0dHIsIHNlbGYuYXR0cnMsIG1vZHVsZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihzdHIoZXhjKSkKCiAgICBkZWYgcmVxdWlyZShzZWxmLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgIGlmIHNlbGYuZXh0cmFzIGFuZCBub3Qgc2VsZi5kaXN0OgogICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoIkNhbid0IHJlcXVpcmUoKSB3aXRob3V0IGEgZGlzdHJpYnV0aW9uIiwgc2VsZikKICAgICAgICByZXFzID0gc2VsZi5kaXN0LnJlcXVpcmVzKHNlbGYuZXh0cmFzKQogICAgICAgIGl0ZW1zID0gd29ya2luZ19zZXQucmVzb2x2ZShyZXFzLCBlbnYsIGluc3RhbGxlcikKICAgICAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGQsIGl0ZW1zKSkKCiAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgKICAgICAgICByJ1xzKicKICAgICAgICByJyg/UDxuYW1lPi4rPylccyonCiAgICAgICAgcic9XHMqJwogICAgICAgIHInKD9QPG1vZHVsZT5bXHcuXSspXHMqJwogICAgICAgIHInKDpccyooP1A8YXR0cj5bXHcuXSspKT9ccyonCiAgICAgICAgcicoP1A8ZXh0cmFzPlxbLipcXSk/XHMqJCcKICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZShjbHMsIHNyYywgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIHNpbmdsZSBlbnRyeSBwb2ludCBmcm9tIHN0cmluZyBgc3JjYAoKICAgICAgICBFbnRyeSBwb2ludCBzeW50YXggZm9sbG93cyB0aGUgZm9ybTo6CgogICAgICAgICAgICBuYW1lID0gc29tZS5tb2R1bGU6c29tZS5hdHRyIFtleHRyYTEsIGV4dHJhMl0KCiAgICAgICAgVGhlIGVudHJ5IG5hbWUgYW5kIG1vZHVsZSBuYW1lIGFyZSByZXF1aXJlZCwgYnV0IHRoZSBgYDphdHRyc2BgIGFuZAogICAgICAgIGBgW2V4dHJhc11gYCBwYXJ0cyBhcmUgb3B0aW9uYWwKICAgICAgICAiIiIKICAgICAgICBtID0gY2xzLnBhdHRlcm4ubWF0Y2goc3JjKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICBtc2cgPSAiRW50cnlQb2ludCBtdXN0IGJlIGluICduYW1lPW1vZHVsZTphdHRycyBbZXh0cmFzXScgZm9ybWF0IgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZywgc3JjKQogICAgICAgIHJlcyA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICBleHRyYXMgPSBjbHMuX3BhcnNlX2V4dHJhcyhyZXNbJ2V4dHJhcyddKQogICAgICAgIGF0dHJzID0gcmVzWydhdHRyJ10uc3BsaXQoJy4nKSBpZiByZXNbJ2F0dHInXSBlbHNlICgpCiAgICAgICAgcmV0dXJuIGNscyhyZXNbJ25hbWUnXSwgcmVzWydtb2R1bGUnXSwgYXR0cnMsIGV4dHJhcywgZGlzdCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZXh0cmFzKGNscywgZXh0cmFzX3NwZWMpOgogICAgICAgIGlmIG5vdCBleHRyYXNfc3BlYzoKICAgICAgICAgICAgcmV0dXJuICgpCiAgICAgICAgcmVxID0gUmVxdWlyZW1lbnQucGFyc2UoJ3gnICsgZXh0cmFzX3NwZWMpCiAgICAgICAgaWYgcmVxLnNwZWNzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkKICAgICAgICByZXR1cm4gcmVxLmV4dHJhcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlX2dyb3VwKGNscywgZ3JvdXAsIGxpbmVzLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGFuIGVudHJ5IHBvaW50IGdyb3VwIiIiCiAgICAgICAgaWYgbm90IE1PRFVMRShncm91cCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgIHRoaXMgPSB7fQogICAgICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKGxpbmVzKToKICAgICAgICAgICAgZXAgPSBjbHMucGFyc2UobGluZSwgZGlzdCkKICAgICAgICAgICAgaWYgZXAubmFtZSBpbiB0aGlzOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGVudHJ5IHBvaW50IiwgZ3JvdXAsIGVwLm5hbWUpCiAgICAgICAgICAgIHRoaXNbZXAubmFtZV0gPSBlcAogICAgICAgIHJldHVybiB0aGlzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfbWFwKGNscywgZGF0YSwgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIG1hcCBvZiBlbnRyeSBwb2ludCBncm91cHMiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgICAgICBkYXRhID0gZGF0YS5pdGVtcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGF0YSA9IHNwbGl0X3NlY3Rpb25zKGRhdGEpCiAgICAgICAgbWFwcyA9IHt9CiAgICAgICAgZm9yIGdyb3VwLCBsaW5lcyBpbiBkYXRhOgogICAgICAgICAgICBpZiBncm91cCBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgbm90IGxpbmVzOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFbnRyeSBwb2ludHMgbXVzdCBiZSBsaXN0ZWQgaW4gZ3JvdXBzIikKICAgICAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCiAgICAgICAgICAgIGlmIGdyb3VwIGluIG1hcHM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgICAgICBtYXBzW2dyb3VwXSA9IGNscy5wYXJzZV9ncm91cChncm91cCwgbGluZXMsIGRpc3QpCiAgICAgICAgcmV0dXJuIG1hcHMKCgpkZWYgX3JlbW92ZV9tZDVfZnJhZ21lbnQobG9jYXRpb24pOgogICAgaWYgbm90IGxvY2F0aW9uOgogICAgICAgIHJldHVybiAnJwogICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKGxvY2F0aW9uKQogICAgaWYgcGFyc2VkWy0xXS5zdGFydHN3aXRoKCdtZDU9Jyk6CiAgICAgICAgcmV0dXJuIHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnNlZFs6LTFdICsgKCcnLCkpCiAgICByZXR1cm4gbG9jYXRpb24KCgpkZWYgX3ZlcnNpb25fZnJvbV9maWxlKGxpbmVzKToKICAgICIiIgogICAgR2l2ZW4gYW4gaXRlcmFibGUgb2YgbGluZXMgZnJvbSBhIE1ldGFkYXRhIGZpbGUsIHJldHVybgogICAgdGhlIHZhbHVlIG9mIHRoZSBWZXJzaW9uIGZpZWxkLCBpZiBwcmVzZW50LCBvciBOb25lIG90aGVyd2lzZS4KICAgICIiIgogICAgaXNfdmVyc2lvbl9saW5lID0gbGFtYmRhIGxpbmU6IGxpbmUubG93ZXIoKS5zdGFydHN3aXRoKCd2ZXJzaW9uOicpCiAgICB2ZXJzaW9uX2xpbmVzID0gZmlsdGVyKGlzX3ZlcnNpb25fbGluZSwgbGluZXMpCiAgICBsaW5lID0gbmV4dChpdGVyKHZlcnNpb25fbGluZXMpLCAnJykKICAgIF8sIF8sIHZhbHVlID0gbGluZS5wYXJ0aXRpb24oJzonKQogICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2YWx1ZS5zdHJpcCgpKSBvciBOb25lCgoKY2xhc3MgRGlzdHJpYnV0aW9uKG9iamVjdCk6CiAgICAiIiJXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkgdy9tZXRhZGF0YSIiIgogICAgUEtHX0lORk8gPSAnUEtHLUlORk8nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2F0aW9uPU5vbmUsIG1ldGFkYXRhPU5vbmUsIHByb2plY3RfbmFtZT1Ob25lLAogICAgICAgICAgICB2ZXJzaW9uPU5vbmUsIHB5X3ZlcnNpb249UFlfTUFKT1IsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgIHByZWNlZGVuY2U9RUdHX0RJU1QpOgogICAgICAgIHNlbGYucHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHByb2plY3RfbmFtZSBvciAnVW5rbm93bicpCiAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNhZmVfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHNlbGYucHlfdmVyc2lvbiA9IHB5X3ZlcnNpb24KICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm0KICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICBzZWxmLnByZWNlZGVuY2UgPSBwcmVjZWRlbmNlCiAgICAgICAgc2VsZi5fcHJvdmlkZXIgPSBtZXRhZGF0YSBvciBlbXB0eV9wcm92aWRlcgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fbG9jYXRpb24oY2xzLCBsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUsICoqa3cpOgogICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBbTm9uZV0gKiA0CiAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpCiAgICAgICAgaWYgZXh0Lmxvd2VyKCkgaW4gX2Rpc3RyaWJ1dGlvbkltcGw6CiAgICAgICAgICAgIGNscyA9IF9kaXN0cmlidXRpb25JbXBsW2V4dC5sb3dlcigpXQoKICAgICAgICAgICAgbWF0Y2ggPSBFR0dfTkFNRShiYXNlbmFtZSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gbWF0Y2guZ3JvdXAoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnLCAndmVyJywgJ3B5dmVyJywgJ3BsYXQnCiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGNscygKICAgICAgICAgICAgbG9jYXRpb24sIG1ldGFkYXRhLCBwcm9qZWN0X25hbWU9cHJvamVjdF9uYW1lLCB2ZXJzaW9uPXZlcnNpb24sCiAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcGxhdGZvcm09cGxhdGZvcm0sICoqa3cKICAgICAgICApLl9yZWxvYWRfdmVyc2lvbigpCgogICAgZGVmIF9yZWxvYWRfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc2hjbXAoc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5wYXJzZWRfdmVyc2lvbiwKICAgICAgICAgICAgc2VsZi5wcmVjZWRlbmNlLAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgX3JlbW92ZV9tZDVfZnJhZ21lbnQoc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbiBvciAnJywKICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybSBvciAnJywKICAgICAgICApCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuaGFzaGNtcCkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wIDwgb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPD0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPiBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA+PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgIyBJdCdzIG5vdCBhIERpc3RyaWJ1dGlvbiwgc28gdGhleSBhcmUgbm90IGVxdWFsCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPT0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgICMgVGhlc2UgcHJvcGVydGllcyBoYXZlIHRvIGJlIGxhenkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGxvYWQgYW55CiAgICAjIG1ldGFkYXRhIHVudGlsL3VubGVzcyBpdCdzIGFjdHVhbGx5IG5lZWRlZC4gIChpLmUuLCBzb21lIGRpc3RyaWJ1dGlvbnMKICAgICMgbWF5IG5vdCBrbm93IHRoZWlyIG5hbWUgb3IgdmVyc2lvbiB3aXRob3V0IGxvYWRpbmcgUEtHLUlORk8pCgogICAgQHByb3BlcnR5CiAgICBkZWYga2V5KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2tleQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fa2V5ID0ga2V5ID0gc2VsZi5wcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgIl9wYXJzZWRfdmVyc2lvbiIpOgogICAgICAgICAgICBzZWxmLl9wYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi52ZXJzaW9uKQoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VkX3ZlcnNpb24KCiAgICBkZWYgX3dhcm5fbGVnYWN5X3ZlcnNpb24oc2VsZik6CiAgICAgICAgTFYgPSBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uCiAgICAgICAgaXNfbGVnYWN5ID0gaXNpbnN0YW5jZShzZWxmLl9wYXJzZWRfdmVyc2lvbiwgTFYpCiAgICAgICAgaWYgbm90IGlzX2xlZ2FjeToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgV2hpbGUgYW4gZW1wdHkgdmVyc2lvbiBpcyB0ZWNobmljYWxseSBhIGxlZ2FjeSB2ZXJzaW9uIGFuZAogICAgICAgICMgaXMgbm90IGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uLCBpdCdzIGFsc28gdW5saWtlbHkgdG8KICAgICAgICAjIGFjdHVhbGx5IGNvbWUgZnJvbSBzb21lb25lIGFuZCBpbnN0ZWFkIGl0IGlzIG1vcmUgbGlrZWx5IHRoYXQKICAgICAgICAjIGl0IGNvbWVzIGZyb20gc2V0dXB0b29scyBhdHRlbXB0aW5nIHRvIHBhcnNlIGEgZmlsZW5hbWUgYW5kCiAgICAgICAgIyBpbmNsdWRpbmcgaXQgaW4gdGhlIGxpc3QuIFNvIGZvciB0aGF0IHdlJ2xsIGdhdGUgdGhpcyB3YXJuaW5nCiAgICAgICAgIyBvbiBpZiB0aGUgdmVyc2lvbiBpcyBhbnl0aGluZyBhdCBhbGwgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLnZlcnNpb246CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICAgICAne3Byb2plY3RfbmFtZX0gKHt2ZXJzaW9ufSknIGlzIGJlaW5nIHBhcnNlZCBhcyBhIGxlZ2FjeSwKICAgICAgICAgICAgbm9uIFBFUCA0NDAsCiAgICAgICAgICAgIHZlcnNpb24uIFlvdSBtYXkgZmluZCBvZGQgYmVoYXZpb3IgYW5kIHNvcnQgb3JkZXIuCiAgICAgICAgICAgIEluIHBhcnRpY3VsYXIgaXQgd2lsbCBiZSBzb3J0ZWQgYXMgbGVzcyB0aGFuIDAuMC4gSXQKICAgICAgICAgICAgaXMgcmVjb21tZW5kZWQgdG8gbWlncmF0ZSB0byBQRVAgNDQwIGNvbXBhdGlibGUKICAgICAgICAgICAgdmVyc2lvbnMuCiAgICAgICAgICAgICIiIikuc3RyaXAoKS5yZXBsYWNlKCdcbicsICcgJykKCiAgICAgICAgd2FybmluZ3Mud2Fybih0bXBsLmZvcm1hdCgqKnZhcnMoc2VsZikpLCBQRVA0NDBXYXJuaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgdmVyc2lvbiA9IF92ZXJzaW9uX2Zyb21fZmlsZShzZWxmLl9nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykpCiAgICAgICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIHRtcGwgPSAiTWlzc2luZyAnVmVyc2lvbjonIGhlYWRlciBhbmQvb3IgJXMgZmlsZSIKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IodG1wbCAlIHNlbGYuUEtHX0lORk8sIHNlbGYpCiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2RlcF9tYXAoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGRtID0gc2VsZi5fX2RlcF9tYXAgPSB7Tm9uZTogW119CiAgICAgICAgICAgIGZvciBuYW1lIGluICdyZXF1aXJlcy50eHQnLCAnZGVwZW5kcy50eHQnOgogICAgICAgICAgICAgICAgZm9yIGV4dHJhLCByZXFzIGluIHNwbGl0X3NlY3Rpb25zKHNlbGYuX2dldF9tZXRhZGF0YShuYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICc6JyBpbiBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLCBtYXJrZXIgPSBleHRyYS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnZhbGlkX21hcmtlcihtYXJrZXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYIHdhcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbm90IGV2YWx1YXRlX21hcmtlcihtYXJrZXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICAgICAgICAgICAgICBleHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEpIG9yIE5vbmUKICAgICAgICAgICAgICAgICAgICBkbS5zZXRkZWZhdWx0KGV4dHJhLCBbXSkuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXFzKSkKICAgICAgICAgICAgcmV0dXJuIGRtCgogICAgZGVmIHJlcXVpcmVzKHNlbGYsIGV4dHJhcz0oKSk6CiAgICAgICAgIiIiTGlzdCBvZiBSZXF1aXJlbWVudHMgbmVlZGVkIGZvciB0aGlzIGRpc3RybyBpZiBgZXh0cmFzYCBhcmUgdXNlZCIiIgogICAgICAgIGRtID0gc2VsZi5fZGVwX21hcAogICAgICAgIGRlcHMgPSBbXQogICAgICAgIGRlcHMuZXh0ZW5kKGRtLmdldChOb25lLCAoKSkpCiAgICAgICAgZm9yIGV4dCBpbiBleHRyYXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRlcHMuZXh0ZW5kKGRtW3NhZmVfZXh0cmEoZXh0KV0pCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgKICAgICAgICAgICAgICAgICAgICAiJXMgaGFzIG5vIHN1Y2ggZXh0cmEgZmVhdHVyZSAlciIgJSAoc2VsZiwgZXh0KQogICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBkZXBzCgogICAgZGVmIF9nZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBwYXRoPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBkaXN0cmlidXRpb24gaXMgaW1wb3J0YWJsZSBvbiBgcGF0aGAgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKICAgICAgICBzZWxmLmluc2VydF9vbihwYXRoLCByZXBsYWNlPXJlcGxhY2UpCiAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHNlbGYubG9jYXRpb24pCiAgICAgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBwa2cgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGtnKQoKICAgIGRlZiBlZ2dfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gd2hhdCB0aGlzIGRpc3RyaWJ1dGlvbidzIHN0YW5kYXJkIC5lZ2cgZmlsZW5hbWUgc2hvdWxkIGJlIiIiCiAgICAgICAgZmlsZW5hbWUgPSAiJXMtJXMtcHklcyIgJSAoCiAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNlbGYucHJvamVjdF9uYW1lKSwgdG9fZmlsZW5hbWUoc2VsZi52ZXJzaW9uKSwKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yIFBZX01BSk9SCiAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLnBsYXRmb3JtOgogICAgICAgICAgICBmaWxlbmFtZSArPSAnLScgKyBzZWxmLnBsYXRmb3JtCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYubG9jYXRpb246CiAgICAgICAgICAgIHJldHVybiAiJXMgKCVzKSIgJSAoc2VsZiwgc2VsZi5sb2NhdGlvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gZ2V0YXR0cihzZWxmLCAndmVyc2lvbicsIE5vbmUpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHZlcnNpb24gPSBOb25lCiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gb3IgIlt1bmtub3duIHZlcnNpb25dIgogICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCB2ZXJzaW9uKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICAiIiJEZWxlZ2F0ZSBhbGwgdW5yZWNvZ25pemVkIHB1YmxpYyBhdHRyaWJ1dGVzIHRvIC5tZXRhZGF0YSBwcm92aWRlciIiIgogICAgICAgIGlmIGF0dHIuc3RhcnRzd2l0aCgnXycpOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhdHRyKQogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX3Byb3ZpZGVyLCBhdHRyKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZmlsZW5hbWUoY2xzLCBmaWxlbmFtZSwgbWV0YWRhdGE9Tm9uZSwgKiprdyk6CiAgICAgICAgcmV0dXJuIGNscy5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YSwKICAgICAgICAgICAgKiprdwogICAgICAgICkKCiAgICBkZWYgYXNfcmVxdWlyZW1lbnQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgYGBSZXF1aXJlbWVudGBgIHRoYXQgbWF0Y2hlcyB0aGlzIGRpc3RyaWJ1dGlvbiBleGFjdGx5IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnBhcnNlZF92ZXJzaW9uLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKToKICAgICAgICAgICAgc3BlYyA9ICIlcz09JXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnBhcnNlZF92ZXJzaW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNwZWMgPSAiJXM9PT0lcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYucGFyc2VkX3ZlcnNpb24pCgogICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQoKICAgIGRlZiBsb2FkX2VudHJ5X3BvaW50KHNlbGYsIGdyb3VwLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCiAgICAgICAgZXAgPSBzZWxmLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQogICAgICAgIGlmIGVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJFbnRyeSBwb2ludCAlciBub3QgZm91bmQiICUgKChncm91cCwgbmFtZSksKSkKICAgICAgICByZXR1cm4gZXAubG9hZCgpCgogICAgZGVmIGdldF9lbnRyeV9tYXAoc2VsZiwgZ3JvdXA9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAgPSBFbnRyeVBvaW50LnBhcnNlX21hcCgKICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tZXRhZGF0YSgnZW50cnlfcG9pbnRzLnR4dCcpLCBzZWxmCiAgICAgICAgICAgICkKICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGVwX21hcC5nZXQoZ3JvdXAsIHt9KQogICAgICAgIHJldHVybiBlcF9tYXAKCiAgICBkZWYgZ2V0X2VudHJ5X2luZm8oc2VsZiwgZ3JvdXAsIG5hbWUpOgogICAgICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgICAgIHJldHVybiBzZWxmLmdldF9lbnRyeV9tYXAoZ3JvdXApLmdldChuYW1lKQoKICAgIGRlZiBpbnNlcnRfb24oc2VsZiwgcGF0aCwgbG9jPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBzZWxmLmxvY2F0aW9uIGlzIG9uIHBhdGgKCiAgICAgICAgSWYgcmVwbGFjZT1GYWxzZSAoZGVmYXVsdCk6CiAgICAgICAgICAgIC0gSWYgbG9jYXRpb24gaXMgYWxyZWFkeSBpbiBwYXRoIGFueXdoZXJlLCBkbyBub3RoaW5nLgogICAgICAgICAgICAtIEVsc2U6CiAgICAgICAgICAgICAgLSBJZiBpdCdzIGFuIGVnZyBhbmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgb24gcGF0aCwKICAgICAgICAgICAgICAgIGluc2VydCBqdXN0IGFoZWFkIG9mIHRoZSBwYXJlbnQuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgdG8gdGhlIGVuZCBvZiBwYXRoLgogICAgICAgIElmIHJlcGxhY2U9VHJ1ZToKICAgICAgICAgICAgLSBJZiBsb2NhdGlvbiBpcyBhbHJlYWR5IG9uIHBhdGggYW55d2hlcmUgKG5vdCBlZ2dzKQogICAgICAgICAgICAgIG9yIGhpZ2hlciBwcmlvcml0eSB0aGFuIGl0cyBwYXJlbnQgKGVnZ3MpCiAgICAgICAgICAgICAgZG8gbm90aGluZy4KICAgICAgICAgICAgLSBFbHNlOgogICAgICAgICAgICAgIC0gSWYgaXQncyBhbiBlZ2cgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG9uIHBhdGgsCiAgICAgICAgICAgICAgICBpbnNlcnQganVzdCBhaGVhZCBvZiB0aGUgcGFyZW50LAogICAgICAgICAgICAgICAgcmVtb3ZpbmcgYW55IGxvd2VyLXByaW9yaXR5IGVudHJpZXMuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgaXQgdG8gdGhlIGZyb250IG9mIHBhdGguCiAgICAgICAgIiIiCgogICAgICAgIGxvYyA9IGxvYyBvciBzZWxmLmxvY2F0aW9uCiAgICAgICAgaWYgbm90IGxvYzoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG5sb2MgPSBfbm9ybWFsaXplX2NhY2hlZChsb2MpCiAgICAgICAgYmRpciA9IG9zLnBhdGguZGlybmFtZShubG9jKQogICAgICAgIG5wYXRoID0gWyhwIGFuZCBfbm9ybWFsaXplX2NhY2hlZChwKSBvciBwKSBmb3IgcCBpbiBwYXRoXQoKICAgICAgICBmb3IgcCwgaXRlbSBpbiBlbnVtZXJhdGUobnBhdGgpOgogICAgICAgICAgICBpZiBpdGVtID09IG5sb2M6CiAgICAgICAgICAgICAgICBpZiByZXBsYWNlOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbW9kaWZ5IHBhdGggKGV2ZW4gcmVtb3ZpbmcgZHVwbGljYXRlcykgaWYgZm91bmQgYW5kIG5vdCByZXBsYWNlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsaWYgaXRlbSA9PSBiZGlyIGFuZCBzZWxmLnByZWNlZGVuY2UgPT0gRUdHX0RJU1Q6CiAgICAgICAgICAgICAgICAjIGlmIGl0J3MgYW4gLmVnZywgZ2l2ZSBpdCBwcmVjZWRlbmNlIG92ZXIgaXRzIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIyBVTkxFU1MgaXQncyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gc3lzLnBhdGggYW5kIHJlcGxhY2U9RmFsc2UKICAgICAgICAgICAgICAgIGlmIChub3QgcmVwbGFjZSkgYW5kIG5sb2MgaW4gbnBhdGhbcDpdOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY29uZmxpY3QoKQogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQocCwgbG9jKQogICAgICAgICAgICAgICAgbnBhdGguaW5zZXJ0KHAsIG5sb2MpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY29uZmxpY3QoKQogICAgICAgICAgICBpZiByZXBsYWNlOgogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQoMCwgbG9jKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQobG9jKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBwIGlzIHRoZSBzcG90IHdoZXJlIHdlIGZvdW5kIG9yIGluc2VydGVkIGxvYzsgbm93IHJlbW92ZSBkdXBsaWNhdGVzCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbnAgPSBucGF0aC5pbmRleChubG9jLCBwICsgMSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGVsIG5wYXRoW25wXSwgcGF0aFtucF0KICAgICAgICAgICAgICAgICMgaGEhCiAgICAgICAgICAgICAgICBwID0gbnAKCiAgICAgICAgcmV0dXJuCgogICAgZGVmIGNoZWNrX3ZlcnNpb25fY29uZmxpY3Qoc2VsZik6CiAgICAgICAgaWYgc2VsZi5rZXkgPT0gJ3NldHVwdG9vbHMnOgogICAgICAgICAgICAjIGlnbm9yZSB0aGUgaW5ldml0YWJsZSBzZXR1cHRvb2xzIHNlbGYtY29uZmxpY3RzICA6KAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbnNwID0gZGljdC5mcm9ta2V5cyhzZWxmLl9nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKSkKICAgICAgICBsb2MgPSBub3JtYWxpemVfcGF0aChzZWxmLmxvY2F0aW9uKQogICAgICAgIGZvciBtb2RuYW1lIGluIHNlbGYuX2dldF9tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpOgogICAgICAgICAgICBpZiAobW9kbmFtZSBub3QgaW4gc3lzLm1vZHVsZXMgb3IgbW9kbmFtZSBpbiBuc3AKICAgICAgICAgICAgICAgICAgICBvciBtb2RuYW1lIGluIF9uYW1lc3BhY2VfcGFja2FnZXMpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbW9kbmFtZSBpbiAoJ3BrZ19yZXNvdXJjZXMnLCAnc2V0dXB0b29scycsICdzaXRlJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmbiA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kbmFtZV0sICdfX2ZpbGVfXycsIE5vbmUpCiAgICAgICAgICAgIGlmIGZuIGFuZCAobm9ybWFsaXplX3BhdGgoZm4pLnN0YXJ0c3dpdGgobG9jKSBvcgogICAgICAgICAgICAgICAgICAgICAgIGZuLnN0YXJ0c3dpdGgoc2VsZi5sb2NhdGlvbikpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaXNzdWVfd2FybmluZygKICAgICAgICAgICAgICAgICJNb2R1bGUgJXMgd2FzIGFscmVhZHkgaW1wb3J0ZWQgZnJvbSAlcywgYnV0ICVzIGlzIGJlaW5nIGFkZGVkIgogICAgICAgICAgICAgICAgIiB0byBzeXMucGF0aCIgJSAobW9kbmFtZSwgZm4sIHNlbGYubG9jYXRpb24pLAogICAgICAgICAgICApCgogICAgZGVmIGhhc192ZXJzaW9uKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi52ZXJzaW9uCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoIlVuYnVpbHQgZWdnIGZvciAiICsgcmVwcihzZWxmKSkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2xvbmUoc2VsZiwgKiprdyk6CiAgICAgICAgIiIiQ29weSB0aGlzIGRpc3RyaWJ1dGlvbiwgc3Vic3RpdHV0aW5nIGluIGFueSBjaGFuZ2VkIGtleXdvcmQgYXJncyIiIgogICAgICAgIG5hbWVzID0gJ3Byb2plY3RfbmFtZSB2ZXJzaW9uIHB5X3ZlcnNpb24gcGxhdGZvcm0gbG9jYXRpb24gcHJlY2VkZW5jZScKICAgICAgICBmb3IgYXR0ciBpbiBuYW1lcy5zcGxpdCgpOgogICAgICAgICAgICBrdy5zZXRkZWZhdWx0KGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpCiAgICAgICAga3cuc2V0ZGVmYXVsdCgnbWV0YWRhdGEnLCBzZWxmLl9wcm92aWRlcikKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oKiprdykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBleHRyYXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtkZXAgZm9yIGRlcCBpbiBzZWxmLl9kZXBfbWFwIGlmIGRlcF0KCgpjbGFzcyBFZ2dJbmZvRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICBkZWYgX3JlbG9hZF92ZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFBhY2thZ2VzIGluc3RhbGxlZCBieSBkaXN0dXRpbHMgKGUuZy4gbnVtcHkgb3Igc2NpcHkpLAogICAgICAgIHdoaWNoIHVzZXMgYW4gb2xkIHNhZmVfdmVyc2lvbiwgYW5kIHNvCiAgICAgICAgdGhlaXIgdmVyc2lvbiBudW1iZXJzIGNhbiBnZXQgbWFuZ2xlZCB3aGVuCiAgICAgICAgY29udmVydGVkIHRvIGZpbGVuYW1lcyAoZS5nLiwgMS4xMS4wLmRldjArMjMyOWVhZSB0bwogICAgICAgIDEuMTEuMC5kZXYwXzIzMjllYWUpLiBUaGVzZSBkaXN0cmlidXRpb25zIHdpbGwgbm90IGJlCiAgICAgICAgcGFyc2VkIHByb3Blcmx5CiAgICAgICAgZG93bnN0cmVhbSBieSBEaXN0cmlidXRpb24gYW5kIHNhZmVfdmVyc2lvbiwgc28KICAgICAgICB0YWtlIGFuIGV4dHJhIHN0ZXAgYW5kIHRyeSB0byBnZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20KICAgICAgICB0aGUgbWV0YWRhdGEgZmlsZSBpdHNlbGYgaW5zdGVhZCBvZiB0aGUgZmlsZW5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgbWRfdmVyc2lvbiA9IF92ZXJzaW9uX2Zyb21fZmlsZShzZWxmLl9nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykpCiAgICAgICAgaWYgbWRfdmVyc2lvbjoKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IG1kX3ZlcnNpb24KICAgICAgICByZXR1cm4gc2VsZgoKCmNsYXNzIERpc3RJbmZvRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICAiIiJXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkgdy9tZXRhZGF0YSwgLmRpc3QtaW5mbyBzdHlsZSIiIgogICAgUEtHX0lORk8gPSAnTUVUQURBVEEnCiAgICBFUUVRID0gcmUuY29tcGlsZShyIihbXCgsXSlccyooXGQuKj8pXHMqKFssXCldKSIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3BhcnNlZF9wa2dfaW5mbyhzZWxmKToKICAgICAgICAiIiJQYXJzZSBhbmQgY2FjaGUgbWV0YWRhdGEiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wa2dfaW5mbwogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmdldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKQogICAgICAgICAgICBzZWxmLl9wa2dfaW5mbyA9IGVtYWlsLnBhcnNlci5QYXJzZXIoKS5wYXJzZXN0cihtZXRhZGF0YSkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ19pbmZvCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2RlcF9tYXAoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX19kZXBfbWFwID0gc2VsZi5fY29tcHV0ZV9kZXBlbmRlbmNpZXMoKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKCiAgICBkZWYgX2NvbXB1dGVfZGVwZW5kZW5jaWVzKHNlbGYpOgogICAgICAgICIiIlJlY29tcHV0ZSB0aGlzIGRpc3RyaWJ1dGlvbidzIGRlcGVuZGVuY2llcy4iIiIKICAgICAgICBkbSA9IHNlbGYuX19kZXBfbWFwID0ge05vbmU6IFtdfQoKICAgICAgICByZXFzID0gW10KICAgICAgICAjIEluY2x1ZGluZyBhbnkgY29uZGl0aW9uIGV4cHJlc3Npb25zCiAgICAgICAgZm9yIHJlcSBpbiBzZWxmLl9wYXJzZWRfcGtnX2luZm8uZ2V0X2FsbCgnUmVxdWlyZXMtRGlzdCcpIG9yIFtdOgogICAgICAgICAgICByZXFzLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxKSkKCiAgICAgICAgZGVmIHJlcXNfZm9yX2V4dHJhKGV4dHJhKToKICAgICAgICAgICAgZm9yIHJlcSBpbiByZXFzOgogICAgICAgICAgICAgICAgaWYgbm90IHJlcS5tYXJrZXIgb3IgcmVxLm1hcmtlci5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KToKICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXEKCiAgICAgICAgY29tbW9uID0gZnJvemVuc2V0KHJlcXNfZm9yX2V4dHJhKE5vbmUpKQogICAgICAgIGRtW05vbmVdLmV4dGVuZChjb21tb24pCgogICAgICAgIGZvciBleHRyYSBpbiBzZWxmLl9wYXJzZWRfcGtnX2luZm8uZ2V0X2FsbCgnUHJvdmlkZXMtRXh0cmEnKSBvciBbXToKICAgICAgICAgICAgc19leHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEuc3RyaXAoKSkKICAgICAgICAgICAgZG1bc19leHRyYV0gPSBsaXN0KGZyb3plbnNldChyZXFzX2Zvcl9leHRyYShleHRyYSkpIC0gY29tbW9uKQoKICAgICAgICByZXR1cm4gZG0KCgpfZGlzdHJpYnV0aW9uSW1wbCA9IHsKICAgICcuZWdnJzogRGlzdHJpYnV0aW9uLAogICAgJy5lZ2ctaW5mbyc6IEVnZ0luZm9EaXN0cmlidXRpb24sCiAgICAnLmRpc3QtaW5mbyc6IERpc3RJbmZvRGlzdHJpYnV0aW9uLAogICAgfQoKCmRlZiBpc3N1ZV93YXJuaW5nKCphcmdzLCAqKmt3KToKICAgIGxldmVsID0gMQogICAgZyA9IGdsb2JhbHMoKQogICAgdHJ5OgogICAgICAgICMgZmluZCB0aGUgZmlyc3Qgc3RhY2sgZnJhbWUgdGhhdCBpcyAqbm90KiBjb2RlIGluCiAgICAgICAgIyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUsIHRvIHVzZSBmb3IgdGhlIHdhcm5pbmcKICAgICAgICB3aGlsZSBzeXMuX2dldGZyYW1lKGxldmVsKS5mX2dsb2JhbHMgaXMgZzoKICAgICAgICAgICAgbGV2ZWwgKz0gMQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgd2FybmluZ3Mud2FybihzdGFja2xldmVsPWxldmVsICsgMSwgKmFyZ3MsICoqa3cpCgoKY2xhc3MgUmVxdWlyZW1lbnRQYXJzZUVycm9yKFZhbHVlRXJyb3IpOgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICcgJy5qb2luKHNlbGYuYXJncykKCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnRzKHN0cnMpOgogICAgIiIiWWllbGQgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMgZm9yIGVhY2ggc3BlY2lmaWNhdGlvbiBpbiBgc3Ryc2AKCiAgICBgc3Ryc2AgbXVzdCBiZSBhIHN0cmluZywgb3IgYSAocG9zc2libHktbmVzdGVkKSBpdGVyYWJsZSB0aGVyZW9mLgogICAgIiIiCiAgICAjIGNyZWF0ZSBhIHN0ZXBwYWJsZSBpdGVyYXRvciwgc28gd2UgY2FuIGhhbmRsZSBcLWNvbnRpbnVhdGlvbnMKICAgIGxpbmVzID0gaXRlcih5aWVsZF9saW5lcyhzdHJzKSkKCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAjIERyb3AgY29tbWVudHMgLS0gYSBoYXNoIHdpdGhvdXQgYSBzcGFjZSBtYXkgYmUgaW4gYSBVUkwuCiAgICAgICAgaWYgJyAjJyBpbiBsaW5lOgogICAgICAgICAgICBsaW5lID0gbGluZVs6bGluZS5maW5kKCcgIycpXQogICAgICAgICMgSWYgdGhlcmUgaXMgYSBsaW5lIGNvbnRpbnVhdGlvbiwgZHJvcCBpdCwgYW5kIGFwcGVuZCB0aGUgbmV4dCBsaW5lLgogICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoJ1xcJyk6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0uc3RyaXAoKQogICAgICAgICAgICBsaW5lICs9IG5leHQobGluZXMpCiAgICAgICAgeWllbGQgUmVxdWlyZW1lbnQobGluZSkKCgpjbGFzcyBSZXF1aXJlbWVudChwYWNrYWdpbmcucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgICIiIkRPIE5PVCBDQUxMIFRISVMgVU5ET0NVTUVOVEVEIE1FVEhPRDsgdXNlIFJlcXVpcmVtZW50LnBhcnNlKCkhIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdXBlcihSZXF1aXJlbWVudCwgc2VsZikuX19pbml0X18ocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBwYWNrYWdpbmcucmVxdWlyZW1lbnRzLkludmFsaWRSZXF1aXJlbWVudCBhcyBlOgogICAgICAgICAgICByYWlzZSBSZXF1aXJlbWVudFBhcnNlRXJyb3Ioc3RyKGUpKQogICAgICAgIHNlbGYudW5zYWZlX25hbWUgPSBzZWxmLm5hbWUKICAgICAgICBwcm9qZWN0X25hbWUgPSBzYWZlX25hbWUoc2VsZi5uYW1lKQogICAgICAgIHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLmtleSA9IHByb2plY3RfbmFtZSwgcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICBzZWxmLnNwZWNzID0gWwogICAgICAgICAgICAoc3BlYy5vcGVyYXRvciwgc3BlYy52ZXJzaW9uKSBmb3Igc3BlYyBpbiBzZWxmLnNwZWNpZmllcl0KICAgICAgICBzZWxmLmV4dHJhcyA9IHR1cGxlKG1hcChzYWZlX2V4dHJhLCBzZWxmLmV4dHJhcykpCiAgICAgICAgc2VsZi5oYXNoQ21wID0gKAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgc2VsZi5zcGVjaWZpZXIsCiAgICAgICAgICAgIGZyb3plbnNldChzZWxmLmV4dHJhcyksCiAgICAgICAgICAgIHN0cihzZWxmLm1hcmtlcikgaWYgc2VsZi5tYXJrZXIgZWxzZSBOb25lLAogICAgICAgICkKICAgICAgICBzZWxmLl9faGFzaCA9IGhhc2goc2VsZi5oYXNoQ21wKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGlzaW5zdGFuY2Uob3RoZXIsIFJlcXVpcmVtZW50KSBhbmQKICAgICAgICAgICAgc2VsZi5oYXNoQ21wID09IG90aGVyLmhhc2hDbXAKICAgICAgICApCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIGlmIGl0ZW0ua2V5ICE9IHNlbGYua2V5OgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBpdGVtID0gaXRlbS52ZXJzaW9uCgogICAgICAgICMgQWxsb3cgcHJlcmVsZWFzZXMgYWx3YXlzIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBwcmV2aW91cyBiZWhhdmlvciBvZgogICAgICAgICMgdGhpcyBtZXRob2QuIEluIHRoZSBmdXR1cmUgdGhpcyBzaG91bGQgYmUgc21hcnRlciBhbmQgZm9sbG93IFBFUCA0NDAKICAgICAgICAjIG1vcmUgYWNjdXJhdGVseS4KICAgICAgICByZXR1cm4gc2VsZi5zcGVjaWZpZXIuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9VHJ1ZSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNoCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOiByZXR1cm4gIlJlcXVpcmVtZW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcGFyc2Uocyk6CiAgICAgICAgcmVxLCA9IHBhcnNlX3JlcXVpcmVtZW50cyhzKQogICAgICAgIHJldHVybiByZXEKCgpkZWYgX2dldF9tcm8oY2xzKToKICAgICIiIkdldCBhbiBtcm8gZm9yIGEgdHlwZSBvciBjbGFzc2ljIGNsYXNzIiIiCiAgICBpZiBub3QgaXNpbnN0YW5jZShjbHMsIHR5cGUpOgoKICAgICAgICBjbGFzcyBjbHMoY2xzLCBvYmplY3QpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIHJldHVybiBjbHMuX19tcm9fX1sxOl0KICAgIHJldHVybiBjbHMuX19tcm9fXwoKCmRlZiBfZmluZF9hZGFwdGVyKHJlZ2lzdHJ5LCBvYik6CiAgICAiIiJSZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciBgb2JgIGZyb20gYHJlZ2lzdHJ5YCIiIgogICAgZm9yIHQgaW4gX2dldF9tcm8oZ2V0YXR0cihvYiwgJ19fY2xhc3NfXycsIHR5cGUob2IpKSk6CiAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5W3RdCgoKZGVmIGVuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBgcGF0aGAgZXhpc3RzIiIiCiAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICBvcy5tYWtlZGlycyhkaXJuYW1lKQoKCmRlZiBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJTYW5kYm94LWJ5cGFzc2luZyB2ZXJzaW9uIG9mIGVuc3VyZV9kaXJlY3RvcnkoKSIiIgogICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgcmFpc2UgSU9FcnJvcignIm9zLm1rZGlyIiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uJykKICAgIGRpcm5hbWUsIGZpbGVuYW1lID0gc3BsaXQocGF0aCkKICAgIGlmIGRpcm5hbWUgYW5kIGZpbGVuYW1lIGFuZCBub3QgaXNkaXIoZGlybmFtZSk6CiAgICAgICAgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KGRpcm5hbWUpCiAgICAgICAgbWtkaXIoZGlybmFtZSwgMG83NTUpCgoKZGVmIHNwbGl0X3NlY3Rpb25zKHMpOgogICAgIiIiU3BsaXQgYSBzdHJpbmcgb3IgaXRlcmFibGUgdGhlcmVvZiBpbnRvIChzZWN0aW9uLCBjb250ZW50KSBwYWlycwoKICAgIEVhY2ggYGBzZWN0aW9uYGAgaXMgYSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBzZWN0aW9uIGhlYWRlciAoIltzZWN0aW9uXSIpCiAgICBhbmQgZWFjaCBgYGNvbnRlbnRgYCBpcyBhIGxpc3Qgb2Ygc3RyaXBwZWQgbGluZXMgZXhjbHVkaW5nIGJsYW5rIGxpbmVzIGFuZAogICAgY29tbWVudC1vbmx5IGxpbmVzLiAgSWYgdGhlcmUgYXJlIGFueSBzdWNoIGxpbmVzIGJlZm9yZSB0aGUgZmlyc3Qgc2VjdGlvbgogICAgaGVhZGVyLCB0aGV5J3JlIHJldHVybmVkIGluIGEgZmlyc3QgYGBzZWN0aW9uYGAgb2YgYGBOb25lYGAuCiAgICAiIiIKICAgIHNlY3Rpb24gPSBOb25lCiAgICBjb250ZW50ID0gW10KICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKHMpOgogICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiWyIpOgogICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJdIik6CiAgICAgICAgICAgICAgICBpZiBzZWN0aW9uIG9yIGNvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VjdGlvbiwgY29udGVudAogICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmVbMTotMV0uc3RyaXAoKQogICAgICAgICAgICAgICAgY29udGVudCA9IFtdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIHNlY3Rpb24gaGVhZGluZyIsIGxpbmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29udGVudC5hcHBlbmQobGluZSkKCiAgICAjIHdyYXAgdXAgbGFzdCBzZWdtZW50CiAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CgoKZGVmIF9ta3N0ZW1wKCphcmdzLCAqKmt3KToKICAgIG9sZF9vcGVuID0gb3Mub3BlbgogICAgdHJ5OgogICAgICAgICMgdGVtcG9yYXJpbHkgYnlwYXNzIHNhbmRib3hpbmcKICAgICAgICBvcy5vcGVuID0gb3Nfb3BlbgogICAgICAgIHJldHVybiB0ZW1wZmlsZS5ta3N0ZW1wKCphcmdzLCAqKmt3KQogICAgZmluYWxseToKICAgICAgICAjIGFuZCB0aGVuIHB1dCBpdCBiYWNrCiAgICAgICAgb3Mub3BlbiA9IG9sZF9vcGVuCgoKIyBTaWxlbmNlIHRoZSBQRVA0NDBXYXJuaW5nIGJ5IGRlZmF1bHQsIHNvIHRoYXQgZW5kIHVzZXJzIGRvbid0IGdldCBoaXQgYnkgaXQKIyByYW5kb21seSBqdXN0IGJlY2F1c2UgdGhleSB1c2UgcGtnX3Jlc291cmNlcy4gV2Ugd2FudCB0byBhcHBlbmQgdGhlIHJ1bGUKIyBiZWNhdXNlIHdlIHdhbnQgZWFybGllciB1c2VzIG9mIGZpbHRlcndhcm5pbmdzIHRvIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoaXMKIyBvbmUuCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1QRVA0NDBXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKCgojIGZyb20gamFyYWNvLmZ1bmN0b29scyAxLjMKZGVmIF9jYWxsX2FzaWRlKGYsICphcmdzLCAqKmt3YXJncyk6CiAgICBmKCphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBmCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZShnPWdsb2JhbHMoKSk6CiAgICAiU2V0IHVwIGdsb2JhbCByZXNvdXJjZSBtYW5hZ2VyIChkZWxpYmVyYXRlbHkgbm90IHN0YXRlLXNhdmVkKSIKICAgIG1hbmFnZXIgPSBSZXNvdXJjZU1hbmFnZXIoKQogICAgZ1snX21hbmFnZXInXSA9IG1hbmFnZXIKICAgIGZvciBuYW1lIGluIGRpcihtYW5hZ2VyKToKICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgIGdbbmFtZV0gPSBnZXRhdHRyKG1hbmFnZXIsIG5hbWUpCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZV9tYXN0ZXJfd29ya2luZ19zZXQoKToKICAgICIiIgogICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0IGFuZCBtYWtlIHRoZSBgYHJlcXVpcmUoKWBgCiAgICBBUEkgYXZhaWxhYmxlLgoKICAgIFRoaXMgZnVuY3Rpb24gaGFzIGV4cGxpY2l0IGVmZmVjdHMgb24gdGhlIGdsb2JhbCBzdGF0ZQogICAgb2YgcGtnX3Jlc291cmNlcy4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBvbmNlIGF0CiAgICB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBtb2R1bGUuCgogICAgSW52b2NhdGlvbiBieSBvdGhlciBwYWNrYWdlcyBpcyB1bnN1cHBvcnRlZCBhbmQgZG9uZQogICAgYXQgdGhlaXIgb3duIHJpc2suCiAgICAiIiIKICAgIHdvcmtpbmdfc2V0ID0gV29ya2luZ1NldC5fYnVpbGRfbWFzdGVyKCkKICAgIF9kZWNsYXJlX3N0YXRlKCdvYmplY3QnLCB3b3JraW5nX3NldD13b3JraW5nX3NldCkKCiAgICByZXF1aXJlID0gd29ya2luZ19zZXQucmVxdWlyZQogICAgaXRlcl9lbnRyeV9wb2ludHMgPSB3b3JraW5nX3NldC5pdGVyX2VudHJ5X3BvaW50cwogICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIgPSB3b3JraW5nX3NldC5zdWJzY3JpYmUKICAgIHJ1bl9zY3JpcHQgPSB3b3JraW5nX3NldC5ydW5fc2NyaXB0CiAgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgIHJ1bl9tYWluID0gcnVuX3NjcmlwdAogICAgIyBBY3RpdmF0ZSBhbGwgZGlzdHJpYnV0aW9ucyBhbHJlYWR5IG9uIHN5cy5wYXRoIHdpdGggcmVwbGFjZT1GYWxzZSBhbmQKICAgICMgZW5zdXJlIHRoYXQgYWxsIGRpc3RyaWJ1dGlvbnMgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGluIHRoZSBmdXR1cmUKICAgICMgKGUuZy4gYnkgY2FsbGluZyBgYHJlcXVpcmUoKWBgKSB3aWxsIGdldCBhY3RpdmF0ZWQgYXMgd2VsbCwKICAgICMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgKHJlcGxhY2U9VHJ1ZSkuCiAgICBkaXN0ID0gTm9uZSAgIyBlbnN1cmUgZGlzdCBpcyBkZWZpbmVkIGZvciBkZWwgZGlzdCBiZWxvdwogICAgZm9yIGRpc3QgaW4gd29ya2luZ19zZXQ6CiAgICAgICAgZGlzdC5hY3RpdmF0ZShyZXBsYWNlPUZhbHNlKQogICAgZGVsIGRpc3QKICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyKGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9VHJ1ZSksIGV4aXN0aW5nPUZhbHNlKQogICAgd29ya2luZ19zZXQuZW50cmllcyA9IFtdCiAgICAjIG1hdGNoIG9yZGVyCiAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGRfZW50cnksIHN5cy5wYXRoKSkKICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpClBLAwQUAAAAAAAAACEA+lpxjM8LAADPCwAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvX19pbml0X18ucHkjIENvcHlyaWdodCAoYykgMjAxMiBHaW9yZ29zIFZlcmlnYWtpcyA8dmVyaWdha0BnbWFpbC5jb20+CiMKIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIyBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwojIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgojIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgojIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQpmcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKZnJvbSBtYXRoIGltcG9ydCBjZWlsCmZyb20gc3lzIGltcG9ydCBzdGRlcnIKZnJvbSB0aW1lIGltcG9ydCB0aW1lCgoKX192ZXJzaW9uX18gPSAnMS4yJwoKCmNsYXNzIEluZmluaXRlKG9iamVjdCk6CiAgICBmaWxlID0gc3RkZXJyCiAgICBzbWFfd2luZG93ID0gMTAKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzZWxmLmluZGV4ID0gMAogICAgICAgIHNlbGYuc3RhcnRfdHMgPSB0aW1lKCkKICAgICAgICBzZWxmLl90cyA9IHNlbGYuc3RhcnRfdHMKICAgICAgICBzZWxmLl9kdCA9IGRlcXVlKG1heGxlbj1zZWxmLnNtYV93aW5kb3cpCiAgICAgICAgZm9yIGtleSwgdmFsIGluIGt3YXJncy5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleSwgdmFsKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIGlmIGtleS5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwga2V5LCBOb25lKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGF2ZyhzZWxmKToKICAgICAgICByZXR1cm4gc3VtKHNlbGYuX2R0KSAvIGxlbihzZWxmLl9kdCkgaWYgc2VsZi5fZHQgZWxzZSAwCgogICAgQHByb3BlcnR5CiAgICBkZWYgZWxhcHNlZChzZWxmKToKICAgICAgICByZXR1cm4gaW50KHRpbWUoKSAtIHNlbGYuc3RhcnRfdHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZWxhcHNlZF90ZChzZWxmKToKICAgICAgICByZXR1cm4gdGltZWRlbHRhKHNlY29uZHM9c2VsZi5lbGFwc2VkKQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBzdGFydChzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIG5leHQoc2VsZiwgbj0xKToKICAgICAgICBpZiBuID4gMDoKICAgICAgICAgICAgbm93ID0gdGltZSgpCiAgICAgICAgICAgIGR0ID0gKG5vdyAtIHNlbGYuX3RzKSAvIG4KICAgICAgICAgICAgc2VsZi5fZHQuYXBwZW5kKGR0KQogICAgICAgICAgICBzZWxmLl90cyA9IG5vdwoKICAgICAgICBzZWxmLmluZGV4ID0gc2VsZi5pbmRleCArIG4KICAgICAgICBzZWxmLnVwZGF0ZSgpCgogICAgZGVmIGl0ZXIoc2VsZiwgaXQpOgogICAgICAgIGZvciB4IGluIGl0OgogICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgICAgIHNlbGYubmV4dCgpCiAgICAgICAgc2VsZi5maW5pc2goKQoKCmNsYXNzIFByb2dyZXNzKEluZmluaXRlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFByb2dyZXNzLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5tYXggPSBrd2FyZ3MuZ2V0KCdtYXgnLCAxMDApCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXRhKHNlbGYpOgogICAgICAgIHJldHVybiBpbnQoY2VpbChzZWxmLmF2ZyAqIHNlbGYucmVtYWluaW5nKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBldGFfdGQoc2VsZik6CiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShzZWNvbmRzPXNlbGYuZXRhKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBlcmNlbnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucHJvZ3Jlc3MgKiAxMDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcm9ncmVzcyhzZWxmKToKICAgICAgICByZXR1cm4gbWluKDEsIHNlbGYuaW5kZXggLyBzZWxmLm1heCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZW1haW5pbmcoc2VsZik6CiAgICAgICAgcmV0dXJuIG1heChzZWxmLm1heCAtIHNlbGYuaW5kZXgsIDApCgogICAgZGVmIHN0YXJ0KHNlbGYpOgogICAgICAgIHNlbGYudXBkYXRlKCkKCiAgICBkZWYgZ290byhzZWxmLCBpbmRleCk6CiAgICAgICAgaW5jciA9IGluZGV4IC0gc2VsZi5pbmRleAogICAgICAgIHNlbGYubmV4dChpbmNyKQoKICAgIGRlZiBpdGVyKHNlbGYsIGl0KToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYubWF4ID0gbGVuKGl0KQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZm9yIHggaW4gaXQ6CiAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICAgICAgc2VsZi5uZXh0KCkKICAgICAgICBzZWxmLmZpbmlzaCgpClBLAwQUAAAAAAAAACEAD8NGA30KAAB9CgAAOAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvYmFyLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gLiBpbXBvcnQgUHJvZ3Jlc3MKZnJvbSAuaGVscGVycyBpbXBvcnQgV3JpdGVsbk1peGluCgoKY2xhc3MgQmFyKFdyaXRlbG5NaXhpbiwgUHJvZ3Jlc3MpOgogICAgd2lkdGggPSAzMgogICAgbWVzc2FnZSA9ICcnCiAgICBzdWZmaXggPSAnJShpbmRleClkLyUobWF4KWQnCiAgICBiYXJfcHJlZml4ID0gJyB8JwogICAgYmFyX3N1ZmZpeCA9ICd8ICcKICAgIGVtcHR5X2ZpbGwgPSAnICcKICAgIGZpbGwgPSAnIycKICAgIGhpZGVfY3Vyc29yID0gVHJ1ZQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgZmlsbGVkX2xlbmd0aCA9IGludChzZWxmLndpZHRoICogc2VsZi5wcm9ncmVzcykKICAgICAgICBlbXB0eV9sZW5ndGggPSBzZWxmLndpZHRoIC0gZmlsbGVkX2xlbmd0aAoKICAgICAgICBtZXNzYWdlID0gc2VsZi5tZXNzYWdlICUgc2VsZgogICAgICAgIGJhciA9IHNlbGYuZmlsbCAqIGZpbGxlZF9sZW5ndGgKICAgICAgICBlbXB0eSA9IHNlbGYuZW1wdHlfZmlsbCAqIGVtcHR5X2xlbmd0aAogICAgICAgIHN1ZmZpeCA9IHNlbGYuc3VmZml4ICUgc2VsZgogICAgICAgIGxpbmUgPSAnJy5qb2luKFttZXNzYWdlLCBzZWxmLmJhcl9wcmVmaXgsIGJhciwgZW1wdHksIHNlbGYuYmFyX3N1ZmZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4XSkKICAgICAgICBzZWxmLndyaXRlbG4obGluZSkKCgpjbGFzcyBDaGFyZ2luZ0JhcihCYXIpOgogICAgc3VmZml4ID0gJyUocGVyY2VudClkJSUnCiAgICBiYXJfcHJlZml4ID0gJyAnCiAgICBiYXJfc3VmZml4ID0gJyAnCiAgICBlbXB0eV9maWxsID0gdSfiiJknCiAgICBmaWxsID0gdSfilognCgoKY2xhc3MgRmlsbGluZ1NxdWFyZXNCYXIoQ2hhcmdpbmdCYXIpOgogICAgZW1wdHlfZmlsbCA9IHUn4paiJwogICAgZmlsbCA9IHUn4pajJwoKCmNsYXNzIEZpbGxpbmdDaXJjbGVzQmFyKENoYXJnaW5nQmFyKToKICAgIGVtcHR5X2ZpbGwgPSB1J+KXrycKICAgIGZpbGwgPSB1J+KXiScKCgpjbGFzcyBJbmNyZW1lbnRhbEJhcihCYXIpOgogICAgcGhhc2VzID0gKHUnICcsIHUn4paPJywgdSfilo4nLCB1J+KWjScsIHUn4paMJywgdSfilosnLCB1J+KWiicsIHUn4paJJywgdSfilognKQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgbnBoYXNlcyA9IGxlbihzZWxmLnBoYXNlcykKICAgICAgICBleHBhbmRlZF9sZW5ndGggPSBpbnQobnBoYXNlcyAqIHNlbGYud2lkdGggKiBzZWxmLnByb2dyZXNzKQogICAgICAgIGZpbGxlZF9sZW5ndGggPSBpbnQoc2VsZi53aWR0aCAqIHNlbGYucHJvZ3Jlc3MpCiAgICAgICAgZW1wdHlfbGVuZ3RoID0gc2VsZi53aWR0aCAtIGZpbGxlZF9sZW5ndGgKICAgICAgICBwaGFzZSA9IGV4cGFuZGVkX2xlbmd0aCAtIChmaWxsZWRfbGVuZ3RoICogbnBoYXNlcykKCiAgICAgICAgbWVzc2FnZSA9IHNlbGYubWVzc2FnZSAlIHNlbGYKICAgICAgICBiYXIgPSBzZWxmLnBoYXNlc1stMV0gKiBmaWxsZWRfbGVuZ3RoCiAgICAgICAgY3VycmVudCA9IHNlbGYucGhhc2VzW3BoYXNlXSBpZiBwaGFzZSA+IDAgZWxzZSAnJwogICAgICAgIGVtcHR5ID0gc2VsZi5lbXB0eV9maWxsICogbWF4KDAsIGVtcHR5X2xlbmd0aCAtIGxlbihjdXJyZW50KSkKICAgICAgICBzdWZmaXggPSBzZWxmLnN1ZmZpeCAlIHNlbGYKICAgICAgICBsaW5lID0gJycuam9pbihbbWVzc2FnZSwgc2VsZi5iYXJfcHJlZml4LCBiYXIsIGN1cnJlbnQsIGVtcHR5LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJhcl9zdWZmaXgsIHN1ZmZpeF0pCiAgICAgICAgc2VsZi53cml0ZWxuKGxpbmUpCgoKY2xhc3MgU2hhZHlCYXIoSW5jcmVtZW50YWxCYXIpOgogICAgcGhhc2VzID0gKHUnICcsIHUn4paRJywgdSfilpInLCB1J+KWkycsIHUn4paIJykKUEsDBBQAAAAAAAAAIQAqf/Ew3gUAAN4FAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9jb3VudGVyLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gLiBpbXBvcnQgSW5maW5pdGUsIFByb2dyZXNzCmZyb20gLmhlbHBlcnMgaW1wb3J0IFdyaXRlTWl4aW4KCgpjbGFzcyBDb3VudGVyKFdyaXRlTWl4aW4sIEluZmluaXRlKToKICAgIG1lc3NhZ2UgPSAnJwogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBzZWxmLndyaXRlKHN0cihzZWxmLmluZGV4KSkKCgpjbGFzcyBDb3VudGRvd24oV3JpdGVNaXhpbiwgUHJvZ3Jlc3MpOgogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBzZWxmLndyaXRlKHN0cihzZWxmLnJlbWFpbmluZykpCgoKY2xhc3MgU3RhY2soV3JpdGVNaXhpbiwgUHJvZ3Jlc3MpOgogICAgcGhhc2VzID0gKHUnICcsIHUn4paBJywgdSfiloInLCB1J+KWgycsIHUn4paEJywgdSfiloUnLCB1J+KWhicsIHUn4paHJywgdSfilognKQogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBucGhhc2VzID0gbGVuKHNlbGYucGhhc2VzKQogICAgICAgIGkgPSBtaW4obnBoYXNlcyAtIDEsIGludChzZWxmLnByb2dyZXNzICogbnBoYXNlcykpCiAgICAgICAgc2VsZi53cml0ZShzZWxmLnBoYXNlc1tpXSkKCgpjbGFzcyBQaWUoU3RhY2spOgogICAgcGhhc2VzID0gKHUn4peLJywgdSfil5QnLCB1J+KXkScsIHUn4peVJywgdSfil48nKQpQSwMEFAAAAAAAAAAhAM7sD04mCwAAJgsAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2hlbHBlcnMucHkjIENvcHlyaWdodCAoYykgMjAxMiBHaW9yZ29zIFZlcmlnYWtpcyA8dmVyaWdha0BnbWFpbC5jb20+CiMKIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIyBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwojIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgojIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgojIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCgoKSElERV9DVVJTT1IgPSAnXHgxYls/MjVsJwpTSE9XX0NVUlNPUiA9ICdceDFiWz8yNWgnCgoKY2xhc3MgV3JpdGVNaXhpbihvYmplY3QpOgogICAgaGlkZV9jdXJzb3IgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihXcml0ZU1peGluLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBzZWxmLl93aWR0aCA9IDAKICAgICAgICBpZiBtZXNzYWdlOgogICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKToKICAgICAgICAgICAgaWYgc2VsZi5oaWRlX2N1cnNvcjoKICAgICAgICAgICAgICAgIHByaW50KEhJREVfQ1VSU09SLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQogICAgICAgICAgICBwcmludChzZWxmLm1lc3NhZ2UsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCiAgICAgICAgICAgIHNlbGYuZmlsZS5mbHVzaCgpCgogICAgZGVmIHdyaXRlKHNlbGYsIHMpOgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKToKICAgICAgICAgICAgYiA9ICdcYicgKiBzZWxmLl93aWR0aAogICAgICAgICAgICBjID0gcy5sanVzdChzZWxmLl93aWR0aCkKICAgICAgICAgICAgcHJpbnQoYiArIGMsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCiAgICAgICAgICAgIHNlbGYuX3dpZHRoID0gbWF4KHNlbGYuX3dpZHRoLCBsZW4ocykpCiAgICAgICAgICAgIHNlbGYuZmlsZS5mbHVzaCgpCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCkgYW5kIHNlbGYuaGlkZV9jdXJzb3I6CiAgICAgICAgICAgIHByaW50KFNIT1dfQ1VSU09SLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQoKCmNsYXNzIFdyaXRlbG5NaXhpbihvYmplY3QpOgogICAgaGlkZV9jdXJzb3IgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihXcml0ZWxuTWl4aW4sIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIGlmIG1lc3NhZ2U6CiAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKCiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpIGFuZCBzZWxmLmhpZGVfY3Vyc29yOgogICAgICAgICAgICBwcmludChISURFX0NVUlNPUiwgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKCiAgICBkZWYgY2xlYXJsbihzZWxmKToKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCk6CiAgICAgICAgICAgIHByaW50KCdcclx4MWJbSycsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCgogICAgZGVmIHdyaXRlbG4oc2VsZiwgbGluZSk6CiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpOgogICAgICAgICAgICBzZWxmLmNsZWFybG4oKQogICAgICAgICAgICBwcmludChsaW5lLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQogICAgICAgICAgICBzZWxmLmZpbGUuZmx1c2goKQoKICAgIGRlZiBmaW5pc2goc2VsZik6CiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpOgogICAgICAgICAgICBwcmludChmaWxlPXNlbGYuZmlsZSkKICAgICAgICAgICAgaWYgc2VsZi5oaWRlX2N1cnNvcjoKICAgICAgICAgICAgICAgIHByaW50KFNIT1dfQ1VSU09SLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQoKCmZyb20gc2lnbmFsIGltcG9ydCBzaWduYWwsIFNJR0lOVApmcm9tIHN5cyBpbXBvcnQgZXhpdAoKCmNsYXNzIFNpZ0ludE1peGluKG9iamVjdCk6CiAgICAiIiJSZWdpc3RlcnMgYSBzaWduYWwgaGFuZGxlciB0aGF0IGNhbGxzIGZpbmlzaCBvbiBTSUdJTlQiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihTaWdJbnRNaXhpbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHNpZ25hbChTSUdJTlQsIHNlbGYuX3NpZ2ludF9oYW5kbGVyKQoKICAgIGRlZiBfc2lnaW50X2hhbmRsZXIoc2VsZiwgc2lnbnVtLCBmcmFtZSk6CiAgICAgICAgc2VsZi5maW5pc2goKQogICAgICAgIGV4aXQoMCkKUEsDBBQAAAAAAAAAIQB3CFJ7IgUAACIFAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9zcGlubmVyLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gLiBpbXBvcnQgSW5maW5pdGUKZnJvbSAuaGVscGVycyBpbXBvcnQgV3JpdGVNaXhpbgoKCmNsYXNzIFNwaW5uZXIoV3JpdGVNaXhpbiwgSW5maW5pdGUpOgogICAgbWVzc2FnZSA9ICcnCiAgICBwaGFzZXMgPSAoJy0nLCAnXFwnLCAnfCcsICcvJykKICAgIGhpZGVfY3Vyc29yID0gVHJ1ZQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgaSA9IHNlbGYuaW5kZXggJSBsZW4oc2VsZi5waGFzZXMpCiAgICAgICAgc2VsZi53cml0ZShzZWxmLnBoYXNlc1tpXSkKCgpjbGFzcyBQaWVTcGlubmVyKFNwaW5uZXIpOgogICAgcGhhc2VzID0gW3Un4pe3JywgdSfil7YnLCB1J+KXtScsIHUn4pe0J10KCgpjbGFzcyBNb29uU3Bpbm5lcihTcGlubmVyKToKICAgIHBoYXNlcyA9IFt1J+KXkScsIHUn4peSJywgdSfil5AnLCB1J+KXkyddCgoKY2xhc3MgTGluZVNwaW5uZXIoU3Bpbm5lcik6CiAgICBwaGFzZXMgPSBbdSfijronLCB1J+KOuycsIHUn4o68JywgdSfijr0nLCB1J+KOvCcsIHUn4o67J10KUEsDBBQAAAAAAAAAIQDBIHSOq2sDAKtrAwA1AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9weXBhcnNpbmcucHkjIG1vZHVsZSBweXBhcnNpbmcucHkKIwojIENvcHlyaWdodCAoYykgMjAwMy0yMDE2ICBQYXVsIFQuIE1jR3VpcmUKIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwojIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQojICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiMgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAojIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQojIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCiMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KIwoKX19kb2NfXyA9IFwKIiIiCnB5cGFyc2luZyBtb2R1bGUgLSBDbGFzc2VzIGFuZCBtZXRob2RzIHRvIGRlZmluZSBhbmQgZXhlY3V0ZSBwYXJzaW5nIGdyYW1tYXJzCgpUaGUgcHlwYXJzaW5nIG1vZHVsZSBpcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjcmVhdGluZyBhbmQgZXhlY3V0aW5nIHNpbXBsZSBncmFtbWFycywKdnMuIHRoZSB0cmFkaXRpb25hbCBsZXgveWFjYyBhcHByb2FjaCwgb3IgdGhlIHVzZSBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2l0aCBweXBhcnNpbmcsIHlvdQpkb24ndCBuZWVkIHRvIGxlYXJuIGEgbmV3IHN5bnRheCBmb3IgZGVmaW5pbmcgZ3JhbW1hcnMgb3IgbWF0Y2hpbmcgZXhwcmVzc2lvbnMgLSB0aGUgcGFyc2luZyBtb2R1bGUKcHJvdmlkZXMgYSBsaWJyYXJ5IG9mIGNsYXNzZXMgdGhhdCB5b3UgdXNlIHRvIGNvbnN0cnVjdCB0aGUgZ3JhbW1hciBkaXJlY3RseSBpbiBQeXRob24uCgpIZXJlIGlzIGEgcHJvZ3JhbSB0byBwYXJzZSAiSGVsbG8sIFdvcmxkISIgKG9yIGFueSBncmVldGluZyBvZiB0aGUgZm9ybSAKQ3siPHNhbHV0YXRpb24+LCA8YWRkcmVzc2VlPiEifSksIGJ1aWx0IHVwIHVzaW5nIEx7V29yZH0sIEx7TGl0ZXJhbH0sIGFuZCBMe0FuZH0gZWxlbWVudHMgCihMeycrJzxQYXJzZXJFbGVtZW50Ll9fYWRkX18+fSBvcGVyYXRvciBnaXZlcyBMe0FuZH0gZXhwcmVzc2lvbnMsIHN0cmluZ3MgYXJlIGF1dG8tY29udmVydGVkIHRvCkx7TGl0ZXJhbH0gZXhwcmVzc2lvbnMpOjoKCiAgICBmcm9tIHB5cGFyc2luZyBpbXBvcnQgV29yZCwgYWxwaGFzCgogICAgIyBkZWZpbmUgZ3JhbW1hciBvZiBhIGdyZWV0aW5nCiAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIgoKICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiCiAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkKClRoZSBwcm9ncmFtIG91dHB1dHMgdGhlIGZvbGxvd2luZzo6CgogICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddCgpUaGUgUHl0aG9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFtbWFyIGlzIHF1aXRlIHJlYWRhYmxlLCBvd2luZyB0byB0aGUgc2VsZi1leHBsYW5hdG9yeQpjbGFzcyBuYW1lcywgYW5kIHRoZSB1c2Ugb2YgJysnLCAnfCcgYW5kICdeJyBvcGVyYXRvcnMuCgpUaGUgTHtQYXJzZVJlc3VsdHN9IG9iamVjdCByZXR1cm5lZCBmcm9tIEx7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZzxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gY2FuIGJlIGFjY2Vzc2VkIGFzIGEgbmVzdGVkIGxpc3QsIGEgZGljdGlvbmFyeSwgb3IgYW4Kb2JqZWN0IHdpdGggbmFtZWQgYXR0cmlidXRlcy4KClRoZSBweXBhcnNpbmcgbW9kdWxlIGhhbmRsZXMgc29tZSBvZiB0aGUgcHJvYmxlbXMgdGhhdCBhcmUgdHlwaWNhbGx5IHZleGluZyB3aGVuIHdyaXRpbmcgdGV4dCBwYXJzZXJzOgogLSBleHRyYSBvciBtaXNzaW5nIHdoaXRlc3BhY2UgKHRoZSBhYm92ZSBwcm9ncmFtIHdpbGwgYWxzbyBoYW5kbGUgIkhlbGxvLFdvcmxkISIsICJIZWxsbyAgLCAgV29ybGQgICEiLCBldGMuKQogLSBxdW90ZWQgc3RyaW5ncwogLSBlbWJlZGRlZCBjb21tZW50cwoiIiIKCl9fdmVyc2lvbl9fID0gIjIuMS4xMCIKX192ZXJzaW9uVGltZV9fID0gIjA3IE9jdCAyMDE2IDAxOjMxIFVUQyIKX19hdXRob3JfXyA9ICJQYXVsIE1jR3VpcmUgPHB0bWNnQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iCgppbXBvcnQgc3RyaW5nCmZyb20gd2Vha3JlZiBpbXBvcnQgcmVmIGFzIHdrcmVmCmltcG9ydCBjb3B5CmltcG9ydCBzeXMKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCByZQppbXBvcnQgc3JlX2NvbnN0YW50cwppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IHBwcmludAppbXBvcnQgdHJhY2ViYWNrCmltcG9ydCB0eXBlcwpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQoKdHJ5OgogICAgZnJvbSBfdGhyZWFkIGltcG9ydCBSTG9jawpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgUkxvY2sKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB0cnk6CiAgICAgICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0CiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgX09yZGVyZWREaWN0ID0gTm9uZQoKI34gc3lzLnN0ZGVyci53cml0ZSggInRlc3RpbmcgcHlwYXJzaW5nIG1vZHVsZSwgdmVyc2lvbiAlcywgJXNcbiIgJSAoX192ZXJzaW9uX18sX192ZXJzaW9uVGltZV9fICkgKQoKX19hbGxfXyA9IFsKJ0FuZCcsICdDYXNlbGVzc0tleXdvcmQnLCAnQ2FzZWxlc3NMaXRlcmFsJywgJ0NoYXJzTm90SW4nLCAnQ29tYmluZScsICdEaWN0JywgJ0VhY2gnLCAnRW1wdHknLAonRm9sbG93ZWRCeScsICdGb3J3YXJkJywgJ0dvVG9Db2x1bW4nLCAnR3JvdXAnLCAnS2V5d29yZCcsICdMaW5lRW5kJywgJ0xpbmVTdGFydCcsICdMaXRlcmFsJywKJ01hdGNoRmlyc3QnLCAnTm9NYXRjaCcsICdOb3RBbnknLCAnT25lT3JNb3JlJywgJ09ubHlPbmNlJywgJ09wdGlvbmFsJywgJ09yJywKJ1BhcnNlQmFzZUV4Y2VwdGlvbicsICdQYXJzZUVsZW1lbnRFbmhhbmNlJywgJ1BhcnNlRXhjZXB0aW9uJywgJ1BhcnNlRXhwcmVzc2lvbicsICdQYXJzZUZhdGFsRXhjZXB0aW9uJywKJ1BhcnNlUmVzdWx0cycsICdQYXJzZVN5bnRheEV4Y2VwdGlvbicsICdQYXJzZXJFbGVtZW50JywgJ1F1b3RlZFN0cmluZycsICdSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uJywKJ1JlZ2V4JywgJ1NraXBUbycsICdTdHJpbmdFbmQnLCAnU3RyaW5nU3RhcnQnLCAnU3VwcHJlc3MnLCAnVG9rZW4nLCAnVG9rZW5Db252ZXJ0ZXInLCAKJ1doaXRlJywgJ1dvcmQnLCAnV29yZEVuZCcsICdXb3JkU3RhcnQnLCAnWmVyb09yTW9yZScsCidhbHBoYW51bXMnLCAnYWxwaGFzJywgJ2FscGhhczhiaXQnLCAnYW55Q2xvc2VUYWcnLCAnYW55T3BlblRhZycsICdjU3R5bGVDb21tZW50JywgJ2NvbCcsCidjb21tYVNlcGFyYXRlZExpc3QnLCAnY29tbW9uSFRNTEVudGl0eScsICdjb3VudGVkQXJyYXknLCAnY3BwU3R5bGVDb21tZW50JywgJ2RibFF1b3RlZFN0cmluZycsCidkYmxTbGFzaENvbW1lbnQnLCAnZGVsaW1pdGVkTGlzdCcsICdkaWN0T2YnLCAnZG93bmNhc2VUb2tlbnMnLCAnZW1wdHknLCAnaGV4bnVtcycsCidodG1sQ29tbWVudCcsICdqYXZhU3R5bGVDb21tZW50JywgJ2xpbmUnLCAnbGluZUVuZCcsICdsaW5lU3RhcnQnLCAnbGluZW5vJywKJ21ha2VIVE1MVGFncycsICdtYWtlWE1MVGFncycsICdtYXRjaE9ubHlBdENvbCcsICdtYXRjaFByZXZpb3VzRXhwcicsICdtYXRjaFByZXZpb3VzTGl0ZXJhbCcsCiduZXN0ZWRFeHByJywgJ251bGxEZWJ1Z0FjdGlvbicsICdudW1zJywgJ29uZU9mJywgJ29wQXNzb2MnLCAnb3BlcmF0b3JQcmVjZWRlbmNlJywgJ3ByaW50YWJsZXMnLAoncHVuYzhiaXQnLCAncHl0aG9uU3R5bGVDb21tZW50JywgJ3F1b3RlZFN0cmluZycsICdyZW1vdmVRdW90ZXMnLCAncmVwbGFjZUhUTUxFbnRpdHknLCAKJ3JlcGxhY2VXaXRoJywgJ3Jlc3RPZkxpbmUnLCAnc2dsUXVvdGVkU3RyaW5nJywgJ3NyYW5nZScsICdzdHJpbmdFbmQnLAonc3RyaW5nU3RhcnQnLCAndHJhY2VQYXJzZUFjdGlvbicsICd1bmljb2RlU3RyaW5nJywgJ3VwY2FzZVRva2VucycsICd3aXRoQXR0cmlidXRlJywKJ2luZGVudGVkQmxvY2snLCAnb3JpZ2luYWxUZXh0Rm9yJywgJ3VuZ3JvdXAnLCAnaW5maXhOb3RhdGlvbicsJ2xvY2F0ZWRFeHByJywgJ3dpdGhDbGFzcycsCidDbG9zZU1hdGNoJywgJ3Rva2VuTWFwJywgJ3B5cGFyc2luZ19jb21tb24nLApdCgpzeXN0ZW1fdmVyc2lvbiA9IHR1cGxlKHN5cy52ZXJzaW9uX2luZm8pWzozXQpQWV8zID0gc3lzdGVtX3ZlcnNpb25bMF0gPT0gMwppZiBQWV8zOgogICAgX01BWF9JTlQgPSBzeXMubWF4c2l6ZQogICAgYmFzZXN0cmluZyA9IHN0cgogICAgdW5pY2hyID0gY2hyCiAgICBfdXN0ciA9IHN0cgoKICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMKICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW3N1bSwgbGVuLCBzb3J0ZWQsIHJldmVyc2VkLCBsaXN0LCB0dXBsZSwgc2V0LCBhbnksIGFsbCwgbWluLCBtYXhdCgplbHNlOgogICAgX01BWF9JTlQgPSBzeXMubWF4aW50CiAgICByYW5nZSA9IHhyYW5nZQoKICAgIGRlZiBfdXN0cihvYmopOgogICAgICAgICIiIkRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHN0cihvYmopIHRoYXQgdHJpZXMgdG8gYmUgVW5pY29kZSBmcmllbmRseS4gSXQgZmlyc3QgdHJpZXMKICAgICAgICAgICBzdHIob2JqKS4gSWYgdGhhdCBmYWlscyB3aXRoIGEgVW5pY29kZUVuY29kZUVycm9yLCB0aGVuIGl0IHRyaWVzIHVuaWNvZGUob2JqKS4gSXQKICAgICAgICAgICB0aGVuIDwgcmV0dXJucyB0aGUgdW5pY29kZSBvYmplY3QgfCBlbmNvZGVzIGl0IHdpdGggdGhlIGRlZmF1bHQgZW5jb2RpbmcgfCAuLi4gPi4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG9iaix1bmljb2RlKToKICAgICAgICAgICAgcmV0dXJuIG9iagoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgSWYgdGhpcyB3b3JrcywgdGhlbiBfdXN0cihvYmopIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgc3RyKG9iaiksIHNvCiAgICAgICAgICAgICMgaXQgd29uJ3QgYnJlYWsgYW55IGV4aXN0aW5nIGNvZGUuCiAgICAgICAgICAgIHJldHVybiBzdHIob2JqKQoKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICAjIEVsc2UgZW5jb2RlIGl0CiAgICAgICAgICAgIHJldCA9IHVuaWNvZGUob2JqKS5lbmNvZGUoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCAneG1sY2hhcnJlZnJlcGxhY2UnKQogICAgICAgICAgICB4bWxjaGFycmVmID0gUmVnZXgoJyYjXGQrOycpCiAgICAgICAgICAgIHhtbGNoYXJyZWYuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6ICdcXHUnICsgaGV4KGludCh0WzBdWzI6LTFdKSlbMjpdKQogICAgICAgICAgICByZXR1cm4geG1sY2hhcnJlZi50cmFuc2Zvcm1TdHJpbmcocmV0KQoKICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0b2xlcmFudCBvZiBQeXRob24gdmVyc2lvbiwgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtdCiAgICBpbXBvcnQgX19idWlsdGluX18KICAgIGZvciBmbmFtZSBpbiAic3VtIGxlbiBzb3J0ZWQgcmV2ZXJzZWQgbGlzdCB0dXBsZSBzZXQgYW55IGFsbCBtaW4gbWF4Ii5zcGxpdCgpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2luZ2xlQXJnQnVpbHRpbnMuYXBwZW5kKGdldGF0dHIoX19idWlsdGluX18sZm5hbWUpKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgCl9nZW5lcmF0b3JUeXBlID0gdHlwZSgoeSBmb3IgeSBpbiByYW5nZSgxKSkpCiAKZGVmIF94bWxfZXNjYXBlKGRhdGEpOgogICAgIiIiRXNjYXBlICYsIDwsID4sICIsICcsIGV0Yy4gaW4gYSBzdHJpbmcgb2YgZGF0YS4iIiIKCiAgICAjIGFtcGVyc2FuZCBtdXN0IGJlIHJlcGxhY2VkIGZpcnN0CiAgICBmcm9tX3N5bWJvbHMgPSAnJj48IlwnJwogICAgdG9fc3ltYm9scyA9ICgnJicrcysnOycgZm9yIHMgaW4gImFtcCBndCBsdCBxdW90IGFwb3MiLnNwbGl0KCkpCiAgICBmb3IgZnJvbV8sdG9fIGluIHppcChmcm9tX3N5bWJvbHMsIHRvX3N5bWJvbHMpOgogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoZnJvbV8sIHRvXykKICAgIHJldHVybiBkYXRhCgpjbGFzcyBfQ29uc3RhbnRzKG9iamVjdCk6CiAgICBwYXNzCgphbHBoYXMgICAgID0gc3RyaW5nLmFzY2lpX3VwcGVyY2FzZSArIHN0cmluZy5hc2NpaV9sb3dlcmNhc2UKbnVtcyAgICAgICA9ICIwMTIzNDU2Nzg5IgpoZXhudW1zICAgID0gbnVtcyArICJBQkNERUZhYmNkZWYiCmFscGhhbnVtcyAgPSBhbHBoYXMgKyBudW1zCl9ic2xhc2ggICAgPSBjaHIoOTIpCnByaW50YWJsZXMgPSAiIi5qb2luKGMgZm9yIGMgaW4gc3RyaW5nLnByaW50YWJsZSBpZiBjIG5vdCBpbiBzdHJpbmcud2hpdGVzcGFjZSkKCmNsYXNzIFBhcnNlQmFzZUV4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgIiIiYmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIGFsbCBwYXJzaW5nIHJ1bnRpbWUgZXhjZXB0aW9ucyIiIgogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHdlIGNvbnN0cnVjdCBhICpsb3QqIG9mIHRoZXNlLCBzbyBrZWVwIHRoaXMKICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcHN0ciwgbG9jPTAsIG1zZz1Ob25lLCBlbGVtPU5vbmUgKToKICAgICAgICBzZWxmLmxvYyA9IGxvYwogICAgICAgIGlmIG1zZyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLm1zZyA9IHBzdHIKICAgICAgICAgICAgc2VsZi5wc3RyID0gIiIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1zZyA9IG1zZwogICAgICAgICAgICBzZWxmLnBzdHIgPSBwc3RyCiAgICAgICAgc2VsZi5wYXJzZXJFbGVtZW50ID0gZWxlbQogICAgICAgIHNlbGYuYXJncyA9IChwc3RyLCBsb2MsIG1zZykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZnJvbV9leGNlcHRpb24oY2xzLCBwZSk6CiAgICAgICAgIiIiCiAgICAgICAgaW50ZXJuYWwgZmFjdG9yeSBtZXRob2QgdG8gc2ltcGxpZnkgY3JlYXRpbmcgb25lIHR5cGUgb2YgUGFyc2VFeGNlcHRpb24gCiAgICAgICAgZnJvbSBhbm90aGVyIC0gYXZvaWRzIGhhdmluZyBfX2luaXRfXyBzaWduYXR1cmUgY29uZmxpY3RzIGFtb25nIHN1YmNsYXNzZXMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gY2xzKHBlLnBzdHIsIHBlLmxvYywgcGUubXNnLCBwZS5wYXJzZXJFbGVtZW50KQoKICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgYW5hbWUgKToKICAgICAgICAiIiJzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToKICAgICAgICAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAgICAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dAogICAgICAgICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgICAgIiIiCiAgICAgICAgaWYoIGFuYW1lID09ICJsaW5lbm8iICk6CiAgICAgICAgICAgIHJldHVybiBsaW5lbm8oIHNlbGYubG9jLCBzZWxmLnBzdHIgKQogICAgICAgIGVsaWYoIGFuYW1lIGluICgiY29sIiwgImNvbHVtbiIpICk6CiAgICAgICAgICAgIHJldHVybiBjb2woIHNlbGYubG9jLCBzZWxmLnBzdHIgKQogICAgICAgIGVsaWYoIGFuYW1lID09ICJsaW5lIiApOgogICAgICAgICAgICByZXR1cm4gbGluZSggc2VsZi5sb2MsIHNlbGYucHN0ciApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYW5hbWUpCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gIiVzIChhdCBjaGFyICVkKSwgKGxpbmU6JWQsIGNvbDolZCkiICUgXAogICAgICAgICAgICAgICAgKCBzZWxmLm1zZywgc2VsZi5sb2MsIHNlbGYubGluZW5vLCBzZWxmLmNvbHVtbiApCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikKICAgIGRlZiBtYXJrSW5wdXRsaW5lKCBzZWxmLCBtYXJrZXJTdHJpbmcgPSAiPiE8IiApOgogICAgICAgICIiIkV4dHJhY3RzIHRoZSBleGNlcHRpb24gbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGFuZCBtYXJrcwogICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHdpdGggYSBzcGVjaWFsIHN5bWJvbC4KICAgICAgICAiIiIKICAgICAgICBsaW5lX3N0ciA9IHNlbGYubGluZQogICAgICAgIGxpbmVfY29sdW1uID0gc2VsZi5jb2x1bW4gLSAxCiAgICAgICAgaWYgbWFya2VyU3RyaW5nOgogICAgICAgICAgICBsaW5lX3N0ciA9ICIiLmpvaW4oKGxpbmVfc3RyWzpsaW5lX2NvbHVtbl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyU3RyaW5nLCBsaW5lX3N0cltsaW5lX2NvbHVtbjpdKSkKICAgICAgICByZXR1cm4gbGluZV9zdHIuc3RyaXAoKQogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJsaW5lbm8gY29sIGxpbmUiLnNwbGl0KCkgKyBkaXIodHlwZShzZWxmKSkKCmNsYXNzIFBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6CiAgICAiIiIKICAgIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwYXJzZSBleHByZXNzaW9ucyBkb24ndCBtYXRjaCBjbGFzczsKICAgIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOgogICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dAogICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAgICAKICAgIEV4YW1wbGU6OgogICAgICAgIHRyeToKICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIHBlOgogICAgICAgICAgICBwcmludChwZSkKICAgICAgICAgICAgcHJpbnQoImNvbHVtbjoge30iLmZvcm1hdChwZS5jb2wpKQogICAgICAgICAgICAKICAgIHByaW50czo6CiAgICAgICBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkKICAgICAgICBjb2x1bW46IDEKICAgICIiIgogICAgcGFzcwoKY2xhc3MgUGFyc2VGYXRhbEV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOgogICAgIiIidXNlci10aHJvd2FibGUgZXhjZXB0aW9uIHRocm93biB3aGVuIGluY29uc2lzdGVudCBwYXJzZSBjb250ZW50CiAgICAgICBpcyBmb3VuZDsgc3RvcHMgYWxsIHBhcnNpbmcgaW1tZWRpYXRlbHkiIiIKICAgIHBhc3MKCmNsYXNzIFBhcnNlU3ludGF4RXhjZXB0aW9uKFBhcnNlRmF0YWxFeGNlcHRpb24pOgogICAgIiIianVzdCBsaWtlIEx7UGFyc2VGYXRhbEV4Y2VwdGlvbn0sIGJ1dCB0aHJvd24gaW50ZXJuYWxseSB3aGVuIGFuCiAgICAgICBMe0Vycm9yU3RvcDxBbmQuX0Vycm9yU3RvcD59ICgnLScgb3BlcmF0b3IpIGluZGljYXRlcyB0aGF0IHBhcnNpbmcgaXMgdG8gc3RvcCAKICAgICAgIGltbWVkaWF0ZWx5IGJlY2F1c2UgYW4gdW5iYWNrdHJhY2thYmxlIHN5bnRheCBlcnJvciBoYXMgYmVlbiBmb3VuZCIiIgogICAgcGFzcwoKI34gY2xhc3MgUmVwYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOgogICAgI34gIiIiRXhwZXJpbWVudGFsIGNsYXNzIC0gcGFyc2UgYWN0aW9ucyBjYW4gcmFpc2UgdGhpcyBleGNlcHRpb24gdG8gY2F1c2UKICAgICAgICN+IHB5cGFyc2luZyB0byByZXBhcnNlIHRoZSBpbnB1dCBzdHJpbmc6CiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgaW5wdXQgc3RyaW5nLCBhbmQvb3IKICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBzdGFydCBsb2NhdGlvbgogICAgICAgI34gU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIFJlcGFyc2VFeGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLCBhbmQgcmFpc2UgdGhlCiAgICAgICAjfiBleGNlcHRpb24gaW4gYSBwYXJzZSBhY3Rpb24gdG8gY2F1c2UgcHlwYXJzaW5nIHRvIHVzZSB0aGUgbmV3IHN0cmluZy9sb2NhdGlvbi4KICAgICAgICN+IFNldHRpbmcgdGhlIHZhbHVlcyBhcyBOb25lIGNhdXNlcyBubyBjaGFuZ2UgdG8gYmUgbWFkZS4KICAgICAgICN+ICIiIgogICAgI34gZGVmIF9faW5pdF8oIHNlbGYsIG5ld3N0cmluZywgcmVzdGFydExvYyApOgogICAgICAgICN+IHNlbGYubmV3UGFyc2VUZXh0ID0gbmV3c3RyaW5nCiAgICAgICAgI34gc2VsZi5yZXBhcnNlTG9jID0gcmVzdGFydExvYwoKY2xhc3MgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgIiIiZXhjZXB0aW9uIHRocm93biBieSBMe1BhcnNlckVsZW1lbnQudmFsaWRhdGV9IGlmIHRoZSBncmFtbWFyIGNvdWxkIGJlIGltcHJvcGVybHkgcmVjdXJzaXZlIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBzZWxmLnBhcnNlRWxlbWVudFRyYWNlID0gcGFyc2VFbGVtZW50TGlzdAoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICJSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uOiAlcyIgJSBzZWxmLnBhcnNlRWxlbWVudFRyYWNlCgpjbGFzcyBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYscDEscDIpOgogICAgICAgIHNlbGYudHVwID0gKHAxLHAyKQogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsaSk6CiAgICAgICAgcmV0dXJuIHNlbGYudHVwW2ldCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi50dXBbMF0pCiAgICBkZWYgc2V0T2Zmc2V0KHNlbGYsaSk6CiAgICAgICAgc2VsZi50dXAgPSAoc2VsZi50dXBbMF0saSkKCmNsYXNzIFBhcnNlUmVzdWx0cyhvYmplY3QpOgogICAgIiIiCiAgICBTdHJ1Y3R1cmVkIHBhcnNlIHJlc3VsdHMsIHRvIHByb3ZpZGUgbXVsdGlwbGUgbWVhbnMgb2YgYWNjZXNzIHRvIHRoZSBwYXJzZWQgZGF0YToKICAgICAgIC0gYXMgYSBsaXN0IChDe2xlbihyZXN1bHRzKX0pCiAgICAgICAtIGJ5IGxpc3QgaW5kZXggKEN7cmVzdWx0c1swXSwgcmVzdWx0c1sxXX0sIGV0Yy4pCiAgICAgICAtIGJ5IGF0dHJpYnV0ZSAoQ3tyZXN1bHRzLjxyZXN1bHRzTmFtZT59IC0gc2VlIEx7UGFyc2VyRWxlbWVudC5zZXRSZXN1bHRzTmFtZX0pCgogICAgRXhhbXBsZTo6CiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyAKICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkKICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToKICAgICAgICAjIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpCgogICAgICAgICMgcGFyc2VTdHJpbmcgcmV0dXJucyBhIFBhcnNlUmVzdWx0cyBvYmplY3QKICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpCgogICAgICAgIGRlZiB0ZXN0KHMsIGZuPXJlcHIpOgogICAgICAgICAgICBwcmludCgiJXMgLT4gJXMiICUgKHMsIGZuKGV2YWwocykpKSkKICAgICAgICB0ZXN0KCJsaXN0KHJlc3VsdCkiKQogICAgICAgIHRlc3QoInJlc3VsdFswXSIpCiAgICAgICAgdGVzdCgicmVzdWx0Wydtb250aCddIikKICAgICAgICB0ZXN0KCJyZXN1bHQuZGF5IikKICAgICAgICB0ZXN0KCInbW9udGgnIGluIHJlc3VsdCIpCiAgICAgICAgdGVzdCgiJ21pbnV0ZXMnIGluIHJlc3VsdCIpCiAgICAgICAgdGVzdCgicmVzdWx0LmR1bXAoKSIsIHN0cikKICAgIHByaW50czo6CiAgICAgICAgbGlzdChyZXN1bHQpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQogICAgICAgIHJlc3VsdFswXSAtPiAnMTk5OScKICAgICAgICByZXN1bHRbJ21vbnRoJ10gLT4gJzEyJwogICAgICAgIHJlc3VsdC5kYXkgLT4gJzMxJwogICAgICAgICdtb250aCcgaW4gcmVzdWx0IC0+IFRydWUKICAgICAgICAnbWludXRlcycgaW4gcmVzdWx0IC0+IEZhbHNlCiAgICAgICAgcmVzdWx0LmR1bXAoKSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10KICAgICAgICAtIGRheTogMzEKICAgICAgICAtIG1vbnRoOiAxMgogICAgICAgIC0geWVhcjogMTk5OQogICAgIiIiCiAgICBkZWYgX19uZXdfXyhjbHMsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSApOgogICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgY2xzKToKICAgICAgICAgICAgcmV0dXJuIHRva2xpc3QKICAgICAgICByZXRvYmogPSBvYmplY3QuX19uZXdfXyhjbHMpCiAgICAgICAgcmV0b2JqLl9fZG9pbml0ID0gVHJ1ZQogICAgICAgIHJldHVybiByZXRvYmoKCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcwogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOgogICAgICAgIGlmIHNlbGYuX19kb2luaXQ6CiAgICAgICAgICAgIHNlbGYuX19kb2luaXQgPSBGYWxzZQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQogICAgICAgICAgICBzZWxmLl9fYXNMaXN0ID0gYXNMaXN0CiAgICAgICAgICAgIHNlbGYuX19tb2RhbCA9IG1vZGFsCiAgICAgICAgICAgIGlmIHRva2xpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGxpc3QpOgogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSB0b2tsaXN0WzpdCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBfZ2VuZXJhdG9yVHlwZSk6CiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IGxpc3QodG9rbGlzdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gW3Rva2xpc3RdCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0ID0gZGljdCgpCgogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmUgYW5kIG5hbWU6CiAgICAgICAgICAgIGlmIG5vdCBtb2RhbDoKICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzW25hbWVdID0gMAogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsaW50KToKICAgICAgICAgICAgICAgIG5hbWUgPSBfdXN0cihuYW1lKSAjIHdpbGwgYWx3YXlzIHJldHVybiBhIHN0ciwgYnV0IHVzZSBfdXN0ciBmb3IgY29uc2lzdGVuY3kKICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lCiAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZSh0b2tsaXN0LCAodHlwZShOb25lKSwgYmFzZXN0cmluZywgbGlzdCkpIGFuZCB0b2tsaXN0IGluIChOb25lLCcnLFtdKSk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICAgICAgdG9rbGlzdCA9IFsgdG9rbGlzdCBdCiAgICAgICAgICAgICAgICBpZiBhc0xpc3Q6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tsaXN0LmNvcHkoKSwwKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChQYXJzZVJlc3VsdHModG9rbGlzdFswXSksMCkKICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdLl9fbmFtZSA9IG5hbWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdFswXQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsVHlwZUVycm9yLEluZGV4RXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdAoKICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIGksIChpbnQsc2xpY2UpICk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdFtpXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGkgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W2ldWy0xXVswXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbaV0gXSkKCiAgICBkZWYgX19zZXRpdGVtX18oIHNlbGYsIGssIHYsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOgogICAgICAgIGlmIGlzaW5zdGFuY2UodixfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCk6CiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFt2XQogICAgICAgICAgICBzdWIgPSB2WzBdCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGssKGludCxzbGljZSkpOgogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdFtrXSA9IHYKICAgICAgICAgICAgc3ViID0gdgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFtfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2LDApXQogICAgICAgICAgICBzdWIgPSB2CiAgICAgICAgaWYgaXNpbnN0YW5jZShzdWIsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgc3ViLl9fcGFyZW50ID0gd2tyZWYoc2VsZikKCiAgICBkZWYgX19kZWxpdGVtX18oIHNlbGYsIGkgKToKICAgICAgICBpZiBpc2luc3RhbmNlKGksKGludCxzbGljZSkpOgogICAgICAgICAgICBteWxlbiA9IGxlbiggc2VsZi5fX3Rva2xpc3QgKQogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbaV0KCiAgICAgICAgICAgICMgY29udmVydCBpbnQgdG8gc2xpY2UKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpLCBpbnQpOgogICAgICAgICAgICAgICAgaWYgaSA8IDA6CiAgICAgICAgICAgICAgICAgICAgaSArPSBteWxlbgogICAgICAgICAgICAgICAgaSA9IHNsaWNlKGksIGkrMSkKICAgICAgICAgICAgIyBnZXQgcmVtb3ZlZCBpbmRpY2VzCiAgICAgICAgICAgIHJlbW92ZWQgPSBsaXN0KHJhbmdlKCppLmluZGljZXMobXlsZW4pKSkKICAgICAgICAgICAgcmVtb3ZlZC5yZXZlcnNlKCkKICAgICAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkKICAgICAgICAgICAgZm9yIG5hbWUsb2NjdXJyZW5jZXMgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToKICAgICAgICAgICAgICAgIGZvciBqIGluIHJlbW92ZWQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uIC0gKHBvc2l0aW9uID4gaikpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGVsIHNlbGYuX190b2tkaWN0W2ldCgogICAgZGVmIF9fY29udGFpbnNfXyggc2VsZiwgayApOgogICAgICAgIHJldHVybiBrIGluIHNlbGYuX190b2tkaWN0CgogICAgZGVmIF9fbGVuX18oIHNlbGYgKTogcmV0dXJuIGxlbiggc2VsZi5fX3Rva2xpc3QgKQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOiByZXR1cm4gKCBub3Qgbm90IHNlbGYuX190b2tsaXN0ICkKICAgIF9fbm9uemVyb19fID0gX19ib29sX18KICAgIGRlZiBfX2l0ZXJfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3QgKQogICAgZGVmIF9fcmV2ZXJzZWRfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3RbOjotMV0gKQogICAgZGVmIF9pdGVya2V5cyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fX3Rva2RpY3QsICJpdGVya2V5cyIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3QuaXRlcmtleXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX190b2tkaWN0KQoKICAgIGRlZiBfaXRlcnZhbHVlcyggc2VsZiApOgogICAgICAgIHJldHVybiAoc2VsZltrXSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQogICAgICAgICAgICAKICAgIGRlZiBfaXRlcml0ZW1zKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICgoaywgc2VsZltrXSkgZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkKCiAgICBpZiBQWV8zOgogICAgICAgIGtleXMgPSBfaXRlcmtleXMgICAgICAgCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAzLnggb25seSkuIiIiCgogICAgICAgIHZhbHVlcyA9IF9pdGVydmFsdWVzCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiIKCiAgICAgICAgaXRlbXMgPSBfaXRlcml0ZW1zCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAzLnggb25seSkuIiIiCgogICAgZWxzZToKICAgICAgICBpdGVya2V5cyA9IF9pdGVya2V5cwogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMi54IG9ubHkpLiIiIgoKICAgICAgICBpdGVydmFsdWVzID0gX2l0ZXJ2YWx1ZXMKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMi54IG9ubHkpLiIiIgoKICAgICAgICBpdGVyaXRlbXMgPSBfaXRlcml0ZW1zCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAyLnggb25seSkuIiIiCgogICAgICAgIGRlZiBrZXlzKCBzZWxmICk6CiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmtleXMoKSkKCiAgICAgICAgZGVmIHZhbHVlcyggc2VsZiApOgogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQogICAgICAgICAgICAgICAgCiAgICAgICAgZGVmIGl0ZW1zKCBzZWxmICk6CiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWVzIChhcyBhIGxpc3Qgb2YgdHVwbGVzIGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIgogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQoKICAgIGRlZiBoYXNrZXlzKCBzZWxmICk6CiAgICAgICAgIiIiU2luY2Uga2V5cygpIHJldHVybnMgYW4gaXRlcmF0b3IsIHRoaXMgbWV0aG9kIGlzIGhlbHBmdWwgaW4gYnlwYXNzaW5nCiAgICAgICAgICAgY29kZSB0aGF0IGxvb2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFueSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuIiIiCiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3Rva2RpY3QpCiAgICAgICAgCiAgICBkZWYgcG9wKCBzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZXMgYW5kIHJldHVybnMgaXRlbSBhdCBzcGVjaWZpZWQgaW5kZXggKGRlZmF1bHQ9Q3tsYXN0fSkuCiAgICAgICAgU3VwcG9ydHMgYm90aCBDe2xpc3R9IGFuZCBDe2RpY3R9IHNlbWFudGljcyBmb3IgQ3twb3AoKX0uIElmIHBhc3NlZCBubwogICAgICAgIGFyZ3VtZW50IG9yIGFuIGludGVnZXIgYXJndW1lbnQsIGl0IHdpbGwgdXNlIEN7bGlzdH0gc2VtYW50aWNzCiAgICAgICAgYW5kIHBvcCB0b2tlbnMgZnJvbSB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLiBJZiBwYXNzZWQgYSAKICAgICAgICBub24taW50ZWdlciBhcmd1bWVudCAobW9zdCBsaWtlbHkgYSBzdHJpbmcpLCBpdCB3aWxsIHVzZSBDe2RpY3R9CiAgICAgICAgc2VtYW50aWNzIGFuZCBwb3AgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZnJvbSBhbnkgZGVmaW5lZCAKICAgICAgICByZXN1bHRzIG5hbWVzLiBBIHNlY29uZCBkZWZhdWx0IHJldHVybiB2YWx1ZSBhcmd1bWVudCBpcyAKICAgICAgICBzdXBwb3J0ZWQsIGp1c3QgYXMgaW4gQ3tkaWN0LnBvcCgpfS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGRlZiByZW1vdmVfZmlyc3QodG9rZW5zKToKICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoMCkKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihyZW1vdmVfZmlyc3QpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzEyMycsICczMjEnXQoKICAgICAgICAgICAgbGFiZWwgPSBXb3JkKGFscGhhcykKICAgICAgICAgICAgcGF0dCA9IGxhYmVsKCJMQUJFTCIpICsgT25lT3JNb3JlKFdvcmQobnVtcykpCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQoKICAgICAgICAgICAgIyBVc2UgcG9wKCkgaW4gYSBwYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIG5hbWVkIHJlc3VsdCAobm90ZSB0aGF0IGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgbm90CiAgICAgICAgICAgICMgcmVtb3ZlZCBmcm9tIGxpc3QgZm9ybSBvZiByZXN1bHRzKQogICAgICAgICAgICBkZWYgcmVtb3ZlX0xBQkVMKHRva2Vucyk6CiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCJMQUJFTCIpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zCiAgICAgICAgICAgIHBhdHQuYWRkUGFyc2VBY3Rpb24ocmVtb3ZlX0xBQkVMKQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10KICAgICAgICAgICAgLSBMQUJFTDogQUFCCgogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgYXJncyA9IFstMV0KICAgICAgICBmb3Igayx2IGluIGt3YXJncy5pdGVtcygpOgogICAgICAgICAgICBpZiBrID09ICdkZWZhdWx0JzoKICAgICAgICAgICAgICAgIGFyZ3MgPSAoYXJnc1swXSwgdikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigicG9wKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlIGspCiAgICAgICAgaWYgKGlzaW5zdGFuY2UoYXJnc1swXSwgaW50KSBvciAKICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFyZ3MpID09IDEgb3IgCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gaW4gc2VsZik6CiAgICAgICAgICAgIGluZGV4ID0gYXJnc1swXQogICAgICAgICAgICByZXQgPSBzZWxmW2luZGV4XQogICAgICAgICAgICBkZWwgc2VsZltpbmRleF0KICAgICAgICAgICAgcmV0dXJuIHJldAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRlZmF1bHR2YWx1ZSA9IGFyZ3NbMV0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHR2YWx1ZQoKICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0VmFsdWU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBuYW1lZCByZXN1bHQgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleSwgb3IgaWYgdGhlcmUgaXMgbm8KICAgICAgICBzdWNoIG5hbWUsIHRoZW4gcmV0dXJucyB0aGUgZ2l2ZW4gQ3tkZWZhdWx0VmFsdWV9IG9yIEN7Tm9uZX0gaWYgbm8KICAgICAgICBDe2RlZmF1bHRWYWx1ZX0gaXMgc3BlY2lmaWVkLgoKICAgICAgICBTaW1pbGFyIHRvIEN7ZGljdC5nZXQoKX0uCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICAKCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikKICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgieWVhciIpKSAjIC0+ICcxOTk5JwogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIiwgIm5vdCBzcGVjaWZpZWQiKSkgIyAtPiAnbm90IHNwZWNpZmllZCcKICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIpKSAjIC0+IE5vbmUKICAgICAgICAiIiIKICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUKCiAgICBkZWYgaW5zZXJ0KCBzZWxmLCBpbmRleCwgaW5zU3RyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW5zZXJ0cyBuZXcgZWxlbWVudCBhdCBsb2NhdGlvbiBpbmRleCBpbiB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLgogICAgICAgIAogICAgICAgIFNpbWlsYXIgdG8gQ3tsaXN0Lmluc2VydCgpfS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQoKICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gaW5zZXJ0IHRoZSBwYXJzZSBsb2NhdGlvbiBpbiB0aGUgZnJvbnQgb2YgdGhlIHBhcnNlZCByZXN1bHRzCiAgICAgICAgICAgIGRlZiBpbnNlcnRfbG9jbihsb2NuLCB0b2tlbnMpOgogICAgICAgICAgICAgICAgdG9rZW5zLmluc2VydCgwLCBsb2NuKQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oaW5zZXJ0X2xvY24pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbMCwgJzAnLCAnMTIzJywgJzMyMSddCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuaW5zZXJ0KGluZGV4LCBpbnNTdHIpCiAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkKICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOgogICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToKICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uICsgKHBvc2l0aW9uID4gaW5kZXgpKQoKICAgIGRlZiBhcHBlbmQoIHNlbGYsIGl0ZW0gKToKICAgICAgICAiIiIKICAgICAgICBBZGQgc2luZ2xlIGVsZW1lbnQgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddCiAgICAgICAgICAgIAogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBjb21wdXRlIHRoZSBzdW0gb2YgdGhlIHBhcnNlZCBpbnRlZ2VycywgYW5kIGFkZCBpdCB0byB0aGUgZW5kCiAgICAgICAgICAgIGRlZiBhcHBlbmRfc3VtKHRva2Vucyk6CiAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKHN1bShtYXAoaW50LCB0b2tlbnMpKSkKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGFwcGVuZF9zdW0pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMScsIDQ0NF0KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9fdG9rbGlzdC5hcHBlbmQoaXRlbSkKCiAgICBkZWYgZXh0ZW5kKCBzZWxmLCBpdGVtc2VxICk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIHNlcXVlbmNlIG9mIGVsZW1lbnRzIHRvIGVuZCBvZiBQYXJzZVJlc3VsdHMgbGlzdCBvZiBlbGVtZW50cy4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQogICAgICAgICAgICAKICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gYXBwZW5kIHRoZSByZXZlcnNlIG9mIHRoZSBtYXRjaGVkIHN0cmluZ3MsIHRvIG1ha2UgYSBwYWxpbmRyb21lCiAgICAgICAgICAgIGRlZiBtYWtlX3BhbGluZHJvbWUodG9rZW5zKToKICAgICAgICAgICAgICAgIHRva2Vucy5leHRlbmQocmV2ZXJzZWQoW3RbOjotMV0gZm9yIHQgaW4gdG9rZW5zXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gJycuam9pbih0b2tlbnMpCiAgICAgICAgICAgIHByaW50KHBhdHQuYWRkUGFyc2VBY3Rpb24obWFrZV9wYWxpbmRyb21lKS5wYXJzZVN0cmluZygibHNrZGogc2Rsa2pmIGxrc2QiKSkgIyAtPiAnbHNrZGpzZGxramZsa3NkZHNrbGZqa2xkc2pka3NsJwogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbXNlcSwgUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgc2VsZiArPSBpdGVtc2VxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QuZXh0ZW5kKGl0ZW1zZXEpCgogICAgZGVmIGNsZWFyKCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYXIgYWxsIGVsZW1lbnRzIGFuZCByZXN1bHRzIG5hbWVzLgogICAgICAgICIiIgogICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFs6XQogICAgICAgIHNlbGYuX190b2tkaWN0LmNsZWFyKCkKCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIG5hbWUgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmW25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9fdG9rZGljdDoKICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbbmFtZV1bLTFdWzBdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtuYW1lXSBdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiIgoKICAgIGRlZiBfX2FkZF9fKCBzZWxmLCBvdGhlciApOgogICAgICAgIHJldCA9IHNlbGYuY29weSgpCiAgICAgICAgcmV0ICs9IG90aGVyCiAgICAgICAgcmV0dXJuIHJldAoKICAgIGRlZiBfX2lhZGRfXyggc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBvdGhlci5fX3Rva2RpY3Q6CiAgICAgICAgICAgIG9mZnNldCA9IGxlbihzZWxmLl9fdG9rbGlzdCkKICAgICAgICAgICAgYWRkb2Zmc2V0ID0gbGFtYmRhIGE6IG9mZnNldCBpZiBhPDAgZWxzZSBhK29mZnNldAogICAgICAgICAgICBvdGhlcml0ZW1zID0gb3RoZXIuX190b2tkaWN0Lml0ZW1zKCkKICAgICAgICAgICAgb3RoZXJkaWN0aXRlbXMgPSBbKGssIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZbMF0sYWRkb2Zmc2V0KHZbMV0pKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrLHZsaXN0KSBpbiBvdGhlcml0ZW1zIGZvciB2IGluIHZsaXN0XQogICAgICAgICAgICBmb3Igayx2IGluIG90aGVyZGljdGl0ZW1zOgogICAgICAgICAgICAgICAgc2VsZltrXSA9IHYKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodlswXSxQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgICAgIHZbMF0uX19wYXJlbnQgPSB3a3JlZihzZWxmKQogICAgICAgICAgICAKICAgICAgICBzZWxmLl9fdG9rbGlzdCArPSBvdGhlci5fX3Rva2xpc3QKICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoIG90aGVyLl9fYWNjdW1OYW1lcyApCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KSBhbmQgb3RoZXIgPT0gMDoKICAgICAgICAgICAgIyB1c2VmdWwgZm9yIG1lcmdpbmcgbWFueSBQYXJzZVJlc3VsdHMgdXNpbmcgc3VtKCkgYnVpbHRpbgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHRoaXMgbWF5IHJhaXNlIGEgVHlwZUVycm9yIC0gc28gYmUgaXQKICAgICAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZgogICAgICAgIAogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICIoJXMsICVzKSIgJSAoIHJlcHIoIHNlbGYuX190b2tsaXN0ICksIHJlcHIoIHNlbGYuX190b2tkaWN0ICkgKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICdbJyArICcsICcuam9pbihfdXN0cihpKSBpZiBpc2luc3RhbmNlKGksIFBhcnNlUmVzdWx0cykgZWxzZSByZXByKGkpIGZvciBpIGluIHNlbGYuX190b2tsaXN0KSArICddJwoKICAgIGRlZiBfYXNTdHJpbmdMaXN0KCBzZWxmLCBzZXA9JycgKToKICAgICAgICBvdXQgPSBbXQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuX190b2tsaXN0OgogICAgICAgICAgICBpZiBvdXQgYW5kIHNlcDoKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoc2VwKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKCBpdGVtLCBQYXJzZVJlc3VsdHMgKToKICAgICAgICAgICAgICAgIG91dCArPSBpdGVtLl9hc1N0cmluZ0xpc3QoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggX3VzdHIoaXRlbSkgKQogICAgICAgIHJldHVybiBvdXQKCiAgICBkZWYgYXNMaXN0KCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBsaXN0IG9mIG1hdGNoaW5nIHRva2VucywgYWxsIGNvbnZlcnRlZCB0byBzdHJpbmdzLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpCiAgICAgICAgICAgIHJlc3VsdCA9IHBhdHQucGFyc2VTdHJpbmcoInNsZGtqIGxzZGtqIHNsZGtqIikKICAgICAgICAgICAgIyBldmVuIHRob3VnaCB0aGUgcmVzdWx0IHByaW50cyBpbiBzdHJpbmctbGlrZSBmb3JtLCBpdCBpcyBhY3R1YWxseSBhIHB5cGFyc2luZyBQYXJzZVJlc3VsdHMKICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXN1bHQpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddCiAgICAgICAgICAgIAogICAgICAgICAgICAjIFVzZSBhc0xpc3QoKSB0byBjcmVhdGUgYW4gYWN0dWFsIGxpc3QKICAgICAgICAgICAgcmVzdWx0X2xpc3QgPSByZXN1bHQuYXNMaXN0KCkKICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfbGlzdCksIHJlc3VsdF9saXN0KSAjIC0+IDxjbGFzcyAnbGlzdCc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQogICAgICAgICIiIgogICAgICAgIHJldHVybiBbcmVzLmFzTGlzdCgpIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cykgZWxzZSByZXMgZm9yIHJlcyBpbiBzZWxmLl9fdG9rbGlzdF0KCiAgICBkZWYgYXNEaWN0KCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgbmFtZWQgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBkaWN0aW9uYXJ5LgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikKICAgICAgICAgICAgCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykKICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXByKHJlc3VsdCkpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gKFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXSwgeydkYXknOiBbKCcxOTk5JywgNCldLCAneWVhcic6IFsoJzEyJywgMCldLCAnbW9udGgnOiBbKCczMScsIDIpXX0pCiAgICAgICAgICAgIAogICAgICAgICAgICByZXN1bHRfZGljdCA9IHJlc3VsdC5hc0RpY3QoKQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9kaWN0KSwgcmVwcihyZXN1bHRfZGljdCkpICMgLT4gPGNsYXNzICdkaWN0Jz4geydkYXknOiAnMTk5OScsICd5ZWFyJzogJzEyJywgJ21vbnRoJzogJzMxJ30KCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggYSBQYXJzZVJlc3VsdHMgc3VwcG9ydHMgZGljdC1saWtlIGFjY2Vzcywgc29tZXRpbWUgeW91IGp1c3QgbmVlZCB0byBoYXZlIGEgZGljdAogICAgICAgICAgICBpbXBvcnQganNvbgogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdCkpICMgLT4gRXhjZXB0aW9uOiBUeXBlRXJyb3I6IC4uLiBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUKICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQuYXNEaWN0KCkpKSAjIC0+IHsibW9udGgiOiAiMzEiLCAiZGF5IjogIjE5OTkiLCAieWVhciI6ICIxMiJ9CiAgICAgICAgIiIiCiAgICAgICAgaWYgUFlfMzoKICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlbXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVyaXRlbXMKICAgICAgICAgICAgCiAgICAgICAgZGVmIHRvSXRlbShvYmopOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgIGlmIG9iai5oYXNrZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5hc0RpY3QoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RvSXRlbSh2KSBmb3IgdiBpbiBvYmpdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqCiAgICAgICAgICAgICAgICAKICAgICAgICByZXR1cm4gZGljdCgoayx0b0l0ZW0odikpIGZvciBrLHYgaW4gaXRlbV9mbigpKQoKICAgIGRlZiBjb3B5KCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIG5ldyBjb3B5IG9mIGEgQ3tQYXJzZVJlc3VsdHN9IG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMoIHNlbGYuX190b2tsaXN0ICkKICAgICAgICByZXQuX190b2tkaWN0ID0gc2VsZi5fX3Rva2RpY3QuY29weSgpCiAgICAgICAgcmV0Ll9fcGFyZW50ID0gc2VsZi5fX3BhcmVudAogICAgICAgIHJldC5fX2FjY3VtTmFtZXMudXBkYXRlKCBzZWxmLl9fYWNjdW1OYW1lcyApCiAgICAgICAgcmV0Ll9fbmFtZSA9IHNlbGYuX19uYW1lCiAgICAgICAgcmV0dXJuIHJldAoKICAgIGRlZiBhc1hNTCggc2VsZiwgZG9jdGFnPU5vbmUsIG5hbWVkSXRlbXNPbmx5PUZhbHNlLCBpbmRlbnQ9IiIsIGZvcm1hdHRlZD1UcnVlICk6CiAgICAgICAgIiIiCiAgICAgICAgKERlcHJlY2F0ZWQpIFJldHVybnMgdGhlIHBhcnNlIHJlc3VsdHMgYXMgWE1MLiBUYWdzIGFyZSBjcmVhdGVkIGZvciB0b2tlbnMgYW5kIGxpc3RzIHRoYXQgaGF2ZSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuCiAgICAgICAgIiIiCiAgICAgICAgbmwgPSAiXG4iCiAgICAgICAgb3V0ID0gW10KICAgICAgICBuYW1lZEl0ZW1zID0gZGljdCgodlsxXSxrKSBmb3IgKGssdmxpc3QpIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHYgaW4gdmxpc3QpCiAgICAgICAgbmV4dExldmVsSW5kZW50ID0gaW5kZW50ICsgIiAgIgoKICAgICAgICAjIGNvbGxhcHNlIG91dCBpbmRlbnRzIGlmIGZvcm1hdHRpbmcgaXMgbm90IGRlc2lyZWQKICAgICAgICBpZiBub3QgZm9ybWF0dGVkOgogICAgICAgICAgICBpbmRlbnQgPSAiIgogICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSAiIgogICAgICAgICAgICBubCA9ICIiCgogICAgICAgIHNlbGZUYWcgPSBOb25lCiAgICAgICAgaWYgZG9jdGFnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmVGFnID0gZG9jdGFnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc2VsZi5fX25hbWU6CiAgICAgICAgICAgICAgICBzZWxmVGFnID0gc2VsZi5fX25hbWUKCiAgICAgICAgaWYgbm90IHNlbGZUYWc6CiAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5OgogICAgICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmVGFnID0gIklURU0iCgogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8Iiwgc2VsZlRhZywgIj4iIF0KCiAgICAgICAgZm9yIGkscmVzIGluIGVudW1lcmF0ZShzZWxmLl9fdG9rbGlzdCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6CiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKG5hbWVkSXRlbXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwoTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGluZGl2aWR1YWwgdG9rZW4sIHNlZSBpZiB0aGVyZSBpcyBhIG5hbWUgZm9yIGl0CiAgICAgICAgICAgICAgICByZXNUYWcgPSBOb25lCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6CiAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gbmFtZWRJdGVtc1tpXQogICAgICAgICAgICAgICAgaWYgbm90IHJlc1RhZzoKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSAiSVRFTSIKICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0ID0gX3htbF9lc2NhcGUoX3VzdHIocmVzKSkKICAgICAgICAgICAgICAgIG91dCArPSBbIG5sLCBuZXh0TGV2ZWxJbmRlbnQsICI8IiwgcmVzVGFnLCAiPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC8iLCByZXNUYWcsICI+IiBdCgogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8LyIsIHNlbGZUYWcsICI+IiBdCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQoKICAgIGRlZiBfX2xvb2t1cChzZWxmLHN1Yik6CiAgICAgICAgZm9yIGssdmxpc3QgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToKICAgICAgICAgICAgZm9yIHYsbG9jIGluIHZsaXN0OgogICAgICAgICAgICAgICAgaWYgc3ViIGlzIHY6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZXROYW1lKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIHJlc3VsdHMgbmFtZSBmb3IgdGhpcyB0b2tlbiBleHByZXNzaW9uLiBVc2VmdWwgd2hlbiBzZXZlcmFsIAogICAgICAgIGRpZmZlcmVudCBleHByZXNzaW9ucyBtaWdodCBtYXRjaCBhdCBhIHBhcnRpY3VsYXIgbG9jYXRpb24uCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgICAgICBzc25fZXhwciA9IFJlZ2V4KHIiXGRcZFxkLVxkXGQtXGRcZFxkXGQiKQogICAgICAgICAgICBob3VzZV9udW1iZXJfZXhwciA9IFN1cHByZXNzKCcjJykgKyBXb3JkKG51bXMsIGFscGhhbnVtcykKICAgICAgICAgICAgdXNlcl9kYXRhID0gKEdyb3VwKGhvdXNlX251bWJlcl9leHByKSgiaG91c2VfbnVtYmVyIikgCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoc3NuX2V4cHIpKCJzc24iKQogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKGludGVnZXIpKCJhZ2UiKSkKICAgICAgICAgICAgdXNlcl9pbmZvID0gT25lT3JNb3JlKHVzZXJfZGF0YSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHJlc3VsdCA9IHVzZXJfaW5mby5wYXJzZVN0cmluZygiMjIgMTExLTIyLTMzMzMgIzIyMUIiKQogICAgICAgICAgICBmb3IgaXRlbSBpbiByZXN1bHQ6CiAgICAgICAgICAgICAgICBwcmludChpdGVtLmdldE5hbWUoKSwgJzonLCBpdGVtWzBdKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIGFnZSA6IDIyCiAgICAgICAgICAgIHNzbiA6IDExMS0yMi0zMzMzCiAgICAgICAgICAgIGhvdXNlX251bWJlciA6IDIyMUIKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9fbmFtZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lCiAgICAgICAgZWxpZiBzZWxmLl9fcGFyZW50OgogICAgICAgICAgICBwYXIgPSBzZWxmLl9fcGFyZW50KCkKICAgICAgICAgICAgaWYgcGFyOgogICAgICAgICAgICAgICAgcmV0dXJuIHBhci5fX2xvb2t1cChzZWxmKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBlbGlmIChsZW4oc2VsZikgPT0gMSBhbmQKICAgICAgICAgICAgICAgbGVuKHNlbGYuX190b2tkaWN0KSA9PSAxIGFuZAogICAgICAgICAgICAgICBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3QudmFsdWVzKCkpKVswXVsxXSBpbiAoMCwtMSkpOgogICAgICAgICAgICByZXR1cm4gbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LmtleXMoKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZHVtcChzZWxmLCBpbmRlbnQ9JycsIGRlcHRoPTAsIGZ1bGw9VHJ1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGlhZ25vc3RpYyBtZXRob2QgZm9yIGxpc3Rpbmcgb3V0IHRoZSBjb250ZW50cyBvZiBhIEN7UGFyc2VSZXN1bHRzfS4KICAgICAgICBBY2NlcHRzIGFuIG9wdGlvbmFsIEN7aW5kZW50fSBhcmd1bWVudCBzbyB0aGF0IHRoaXMgc3RyaW5nIGNhbiBiZSBlbWJlZGRlZAogICAgICAgIGluIGEgbmVzdGVkIGRpc3BsYXkgb2Ygb3RoZXIgZGF0YS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpCiAgICAgICAgICAgIAogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddCiAgICAgICAgICAgIC0gZGF5OiAxOTk5CiAgICAgICAgICAgIC0gbW9udGg6IDMxCiAgICAgICAgICAgIC0geWVhcjogMTIKICAgICAgICAiIiIKICAgICAgICBvdXQgPSBbXQogICAgICAgIE5MID0gJ1xuJwogICAgICAgIG91dC5hcHBlbmQoIGluZGVudCtfdXN0cihzZWxmLmFzTGlzdCgpKSApCiAgICAgICAgaWYgZnVsbDoKICAgICAgICAgICAgaWYgc2VsZi5oYXNrZXlzKCk6CiAgICAgICAgICAgICAgICBpdGVtcyA9IHNvcnRlZCgoc3RyKGspLCB2KSBmb3Igayx2IGluIHNlbGYuaXRlbXMoKSkKICAgICAgICAgICAgICAgIGZvciBrLHYgaW4gaXRlbXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0OgogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKE5MKQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoICIlcyVzLSAlczogIiAlIChpbmRlbnQsKCcgICcqZGVwdGgpLCBrKSApCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCB2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoX3VzdHIodikpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXByKHYpKQogICAgICAgICAgICBlbGlmIGFueShpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cykgZm9yIHZ2IGluIHNlbGYpOgogICAgICAgICAgICAgICAgdiA9IHNlbGYKICAgICAgICAgICAgICAgIGZvciBpLHZ2IGluIGVudW1lcmF0ZSh2KToKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLHZ2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksX3VzdHIodnYpKSkKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQoKICAgIGRlZiBwcHJpbnQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBQcmV0dHktcHJpbnRlciBmb3IgcGFyc2VkIHJlc3VsdHMgYXMgYSBsaXN0LCB1c2luZyB0aGUgQ3twcHJpbnR9IG1vZHVsZS4KICAgICAgICBBY2NlcHRzIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZ3MgYXMgZGVmaW5lZCBmb3IgdGhlIAogICAgICAgIEN7cHByaW50LnBwcmludH0gbWV0aG9kLiAoVXtodHRwOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9wcHJpbnQuaHRtbCNwcHJpbnQucHByaW50fSkKCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykKICAgICAgICAgICAgbnVtID0gV29yZChudW1zKQogICAgICAgICAgICBmdW5jID0gRm9yd2FyZCgpCiAgICAgICAgICAgIHRlcm0gPSBpZGVudCB8IG51bSB8IEdyb3VwKCcoJyArIGZ1bmMgKyAnKScpCiAgICAgICAgICAgIGZ1bmMgPDw9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpCiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMucGFyc2VTdHJpbmcoImZuYSBhLGIsKGZuYiBjLGQsMjAwKSwxMDAiKQogICAgICAgICAgICByZXN1bHQucHByaW50KHdpZHRoPTQwKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFsnZm5hJywKICAgICAgICAgICAgIFsnYScsCiAgICAgICAgICAgICAgJ2InLAogICAgICAgICAgICAgIFsnKCcsICdmbmInLCBbJ2MnLCAnZCcsICcyMDAnXSwgJyknXSwKICAgICAgICAgICAgICAnMTAwJ11dCiAgICAgICAgIiIiCiAgICAgICAgcHByaW50LnBwcmludChzZWxmLmFzTGlzdCgpLCAqYXJncywgKiprd2FyZ3MpCgogICAgIyBhZGQgc3VwcG9ydCBmb3IgcGlja2xlIHByb3RvY29sCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgIHJldHVybiAoIHNlbGYuX190b2tsaXN0LAogICAgICAgICAgICAgICAgICggc2VsZi5fX3Rva2RpY3QuY29weSgpLAogICAgICAgICAgICAgICAgICAgc2VsZi5fX3BhcmVudCBpcyBub3QgTm9uZSBhbmQgc2VsZi5fX3BhcmVudCgpIG9yIE5vbmUsCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcywKICAgICAgICAgICAgICAgICAgIHNlbGYuX19uYW1lICkgKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZixzdGF0ZSk6CiAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBzdGF0ZVswXQogICAgICAgIChzZWxmLl9fdG9rZGljdCwKICAgICAgICAgcGFyLAogICAgICAgICBpbkFjY3VtTmFtZXMsCiAgICAgICAgIHNlbGYuX19uYW1lKSA9IHN0YXRlWzFdCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZShpbkFjY3VtTmFtZXMpCiAgICAgICAgaWYgcGFyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gd2tyZWYocGFyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lCgogICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdCwgc2VsZi5fX25hbWUsIHNlbGYuX19hc0xpc3QsIHNlbGYuX19tb2RhbAoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAoZGlyKHR5cGUoc2VsZikpICsgbGlzdChzZWxmLmtleXMoKSkpCgpjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZy5yZWdpc3RlcihQYXJzZVJlc3VsdHMpCgpkZWYgY29sIChsb2Msc3RyZyk6CiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgY29sdW1uIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLgogICBUaGUgZmlyc3QgY29sdW1uIGlzIG51bWJlciAxLgoKICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbgogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLgogICAiIiIKICAgIHMgPSBzdHJnCiAgICByZXR1cm4gMSBpZiAwPGxvYzxsZW4ocykgYW5kIHNbbG9jLTFdID09ICdcbicgZWxzZSBsb2MgLSBzLnJmaW5kKCJcbiIsIDAsIGxvYykKCmRlZiBsaW5lbm8obG9jLHN0cmcpOgogICAgIiIiUmV0dXJucyBjdXJyZW50IGxpbmUgbnVtYmVyIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLgogICBUaGUgZmlyc3QgbGluZSBpcyBudW1iZXIgMS4KCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZwogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGEKICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4KICAgIiIiCiAgICByZXR1cm4gc3RyZy5jb3VudCgiXG4iLDAsbG9jKSArIDEKCmRlZiBsaW5lKCBsb2MsIHN0cmcgKToKICAgICIiIlJldHVybnMgdGhlIGxpbmUgb2YgdGV4dCBjb250YWluaW5nIGxvYyB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4KICAgICAgICIiIgogICAgbGFzdENSID0gc3RyZy5yZmluZCgiXG4iLCAwLCBsb2MpCiAgICBuZXh0Q1IgPSBzdHJnLmZpbmQoIlxuIiwgbG9jKQogICAgaWYgbmV4dENSID49IDA6CiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6bmV4dENSXQogICAgZWxzZToKICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpdCgpkZWYgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByICk6CiAgICBwcmludCAoKCJNYXRjaCAiICsgX3VzdHIoZXhwcikgKyAiIGF0IGxvYyAiICsgX3VzdHIobG9jKSArICIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpKQoKZGVmIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uKCBpbnN0cmluZywgc3RhcnRsb2MsIGVuZGxvYywgZXhwciwgdG9rcyApOgogICAgcHJpbnQgKCJNYXRjaGVkICIgKyBfdXN0cihleHByKSArICIgLT4gIiArIHN0cih0b2tzLmFzTGlzdCgpKSkKCmRlZiBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByLCBleGMgKToKICAgIHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiICsgX3VzdHIoZXhjKSkKCmRlZiBudWxsRGVidWdBY3Rpb24oKmFyZ3MpOgogICAgIiIiJ0RvLW5vdGhpbmcnIGRlYnVnIGFjdGlvbiwgdG8gc3VwcHJlc3MgZGVidWdnaW5nIG91dHB1dCBkdXJpbmcgcGFyc2luZy4iIiIKICAgIHBhc3MKCiMgT25seSB3b3JrcyBvbiBQeXRob24gMy54IC0gbm9ubG9jYWwgaXMgdG94aWMgdG8gUHl0aG9uIDIgaW5zdGFsbHMKI34gJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0JwojfiBkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0zKToKICAgICN+IGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6CiAgICAgICAgI34gcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQogICAgI34gbGltaXQgPSAwCiAgICAjfiBmb3VuZEFyaXR5ID0gRmFsc2UKICAgICN+IGRlZiB3cmFwcGVyKCphcmdzKToKICAgICAgICAjfiBub25sb2NhbCBsaW1pdCxmb3VuZEFyaXR5CiAgICAgICAgI34gd2hpbGUgMToKICAgICAgICAgICAgI34gdHJ5OgogICAgICAgICAgICAgICAgI34gcmV0ID0gZnVuYygqYXJnc1tsaW1pdDpdKQogICAgICAgICAgICAgICAgI34gZm91bmRBcml0eSA9IFRydWUKICAgICAgICAgICAgICAgICN+IHJldHVybiByZXQKICAgICAgICAgICAgI34gZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICN+IGlmIGxpbWl0ID09IG1heGFyZ3Mgb3IgZm91bmRBcml0eToKICAgICAgICAgICAgICAgICAgICAjfiByYWlzZQogICAgICAgICAgICAgICAgI34gbGltaXQgKz0gMQogICAgICAgICAgICAgICAgI34gY29udGludWUKICAgICN+IHJldHVybiB3cmFwcGVyCgojIHRoaXMgdmVyc2lvbiBpcyBQeXRob24gMi54LTMueCBjcm9zcy1jb21wYXRpYmxlCidkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcKZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Mik6CiAgICBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOgogICAgICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkKICAgIGxpbWl0ID0gWzBdCiAgICBmb3VuZEFyaXR5ID0gW0ZhbHNlXQogICAgCiAgICAjIHRyYWNlYmFjayByZXR1cm4gZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlZCBpbiBQeTMuNSAtIG5vcm1hbGl6ZSBiYWNrIHRvIHBsYWluIHR1cGxlcwogICAgaWYgc3lzdGVtX3ZlcnNpb25bOjJdID49ICgzLDUpOgogICAgICAgIGRlZiBleHRyYWN0X3N0YWNrKGxpbWl0PTApOgogICAgICAgICAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFB5dGhvbiAzLjUuMCAtIGV4dHJhIGRlZXAgY2FsbCBzdGFjayBieSAxCiAgICAgICAgICAgIG9mZnNldCA9IC0zIGlmIHN5c3RlbV92ZXJzaW9uID09ICgzLDUsMCkgZWxzZSAtMgogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sobGltaXQ9LW9mZnNldCtsaW1pdC0xKVtvZmZzZXRdCiAgICAgICAgICAgIHJldHVybiBbKGZyYW1lX3N1bW1hcnkuZmlsZW5hbWUsIGZyYW1lX3N1bW1hcnkubGluZW5vKV0KICAgICAgICBkZWYgZXh0cmFjdF90Yih0YiwgbGltaXQ9MCk6CiAgICAgICAgICAgIGZyYW1lcyA9IHRyYWNlYmFjay5leHRyYWN0X3RiKHRiLCBsaW1pdD1saW1pdCkKICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IGZyYW1lc1stMV0KICAgICAgICAgICAgcmV0dXJuIFsoZnJhbWVfc3VtbWFyeS5maWxlbmFtZSwgZnJhbWVfc3VtbWFyeS5saW5lbm8pXQogICAgZWxzZToKICAgICAgICBleHRyYWN0X3N0YWNrID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sKICAgICAgICBleHRyYWN0X3RiID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIKICAgIAogICAgIyBzeW50aGVzaXplIHdoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sgYXQgdGhlIGNhbGwgdG8gCiAgICAjIHVzZXIncyBwYXJzZSBhY3Rpb24gJ2Z1bmMnLCBzbyB0aGF0IHdlIGRvbid0IGluY3VyIGNhbGwgcGVuYWx0eSBhdCBwYXJzZSB0aW1lCiAgICAKICAgIExJTkVfRElGRiA9IDYKICAgICMgSUYgQU5ZIENPREUgQ0hBTkdFUywgRVZFTiBKVVNUIENPTU1FTlRTIE9SIEJMQU5LIExJTkVTLCBCRVRXRUVOIFRIRSBORVhUIExJTkUgQU5EIAogICAgIyBUSEUgQ0FMTCBUTyBGVU5DIElOU0lERSBXUkFQUEVSLCBMSU5FX0RJRkYgTVVTVCBCRSBNT0RJRklFRCEhISEKICAgIHRoaXNfbGluZSA9IGV4dHJhY3Rfc3RhY2sobGltaXQ9MilbLTFdCiAgICBwYV9jYWxsX2xpbmVfc3ludGggPSAodGhpc19saW5lWzBdLCB0aGlzX2xpbmVbMV0rTElORV9ESUZGKQoKICAgIGRlZiB3cmFwcGVyKCphcmdzKToKICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXQgPSBmdW5jKCphcmdzW2xpbWl0WzBdOl0pCiAgICAgICAgICAgICAgICBmb3VuZEFyaXR5WzBdID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIHJldAogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgIyByZS1yYWlzZSBUeXBlRXJyb3JzIGlmIHRoZXkgZGlkIG5vdCBjb21lIGZyb20gb3VyIGFyaXR5IHRlc3RpbmcKICAgICAgICAgICAgICAgIGlmIGZvdW5kQXJpdHlbMF06CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWy0xXQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXh0cmFjdF90Yih0YiwgbGltaXQ9MilbLTFdWzoyXSA9PSBwYV9jYWxsX2xpbmVfc3ludGg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCB0YgoKICAgICAgICAgICAgICAgIGlmIGxpbWl0WzBdIDw9IG1heGFyZ3M6CiAgICAgICAgICAgICAgICAgICAgbGltaXRbMF0gKz0gMQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICMgY29weSBmdW5jIG5hbWUgdG8gd3JhcHBlciBmb3Igc2Vuc2libGUgZGVidWcgb3V0cHV0CiAgICBmdW5jX25hbWUgPSAiPHBhcnNlIGFjdGlvbj4iCiAgICB0cnk6CiAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAnX19uYW1lX18nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBmdW5jX25hbWUgPSBzdHIoZnVuYykKICAgIHdyYXBwZXIuX19uYW1lX18gPSBmdW5jX25hbWUKCiAgICByZXR1cm4gd3JhcHBlcgoKY2xhc3MgUGFyc2VyRWxlbWVudChvYmplY3QpOgogICAgIiIiQWJzdHJhY3QgYmFzZSBsZXZlbCBwYXJzZXIgZWxlbWVudCBjbGFzcy4iIiIKICAgIERFRkFVTFRfV0hJVEVfQ0hBUlMgPSAiIFxuXHRcciIKICAgIHZlcmJvc2Vfc3RhY2t0cmFjZSA9IEZhbHNlCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIGNoYXJzICk6CiAgICAgICAgciIiIgogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycyBhcmUgc3BhY2UsIDxUQUI+IGFuZCBuZXdsaW5lCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJywgJ2doaScsICdqa2wnXQogICAgICAgICAgICAKICAgICAgICAgICAgIyBjaGFuZ2UgdG8ganVzdCB0cmVhdCBuZXdsaW5lIGFzIHNpZ25pZmljYW50CiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycygiIFx0IikKICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnXQogICAgICAgICIiIgogICAgICAgIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyA9IGNoYXJzCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGlubGluZUxpdGVyYWxzVXNpbmcoY2xzKToKICAgICAgICAiIiIKICAgICAgICBTZXQgY2xhc3MgdG8gYmUgdXNlZCBmb3IgaW5jbHVzaW9uIG9mIHN0cmluZyBsaXRlcmFscyBpbnRvIGEgcGFyc2VyLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIGRlZmF1bHQgbGl0ZXJhbCBjbGFzcyB1c2VkIGlzIExpdGVyYWwKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIAoKICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10KCgogICAgICAgICAgICAjIGNoYW5nZSB0byBTdXBwcmVzcwogICAgICAgICAgICBQYXJzZXJFbGVtZW50LmlubGluZUxpdGVyYWxzVXNpbmcoU3VwcHJlc3MpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICAKCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJzEyJywgJzMxJ10KICAgICAgICAiIiIKICAgICAgICBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBjbHMKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHNhdmVsaXN0PUZhbHNlICk6CiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QoKQogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IE5vbmUKICAgICAgICAjfiBzZWxmLm5hbWUgPSAiPHVua25vd24+IiAgIyBkb24ndCBkZWZpbmUgc2VsZi5uYW1lLCBsZXQgc3ViY2xhc3NlcyB0cnkvZXhjZXB0IHVwY2FsbAogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICBzZWxmLnJlc3VsdHNOYW1lID0gTm9uZQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNhdmVsaXN0CiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUKICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMKICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IFRydWUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UgIyB1c2VkIHdoZW4gY2hlY2tpbmcgZm9yIGxlZnQtcmVjdXJzaW9uCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IEZhbHNlCiAgICAgICAgc2VsZi5pZ25vcmVFeHBycyA9IGxpc3QoKQogICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBGYWxzZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IFRydWUgIyB1c2VkIHRvIG9wdGltaXplIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3Igc3ViY2xhc3NlcyB0aGF0IGRvbid0IGFkdmFuY2UgcGFyc2UgaW5kZXgKICAgICAgICBzZWxmLmVycm1zZyA9ICIiCiAgICAgICAgc2VsZi5tb2RhbFJlc3VsdHMgPSBUcnVlICMgdXNlZCB0byBtYXJrIHJlc3VsdHMgbmFtZXMgYXMgbW9kYWwgKHJlcG9ydCBvbmx5IGxhc3QpIG9yIGN1bXVsYXRpdmUgKGxpc3QgYWxsKQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKCBOb25lLCBOb25lLCBOb25lICkgI2N1c3RvbSBkZWJ1ZyBhY3Rpb25zCiAgICAgICAgc2VsZi5yZSA9IE5vbmUKICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUgIyB1c2VkIHRvIGF2b2lkIHJlZHVuZGFudCBjYWxscyB0byBwcmVQYXJzZQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IEZhbHNlCgogICAgZGVmIGNvcHkoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBNYWtlIGEgY29weSBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH0uICBVc2VmdWwgZm9yIGRlZmluaW5nIGRpZmZlcmVudCBwYXJzZSBhY3Rpb25zCiAgICAgICAgZm9yIHRoZSBzYW1lIHBhcnNpbmcgcGF0dGVybiwgdXNpbmcgY29waWVzIG9mIHRoZSBvcmlnaW5hbCBwYXJzZSBlbGVtZW50LgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQogICAgICAgICAgICBpbnRlZ2VySyA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQpICsgU3VwcHJlc3MoIksiKQogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpCiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludChPbmVPck1vcmUoaW50ZWdlcksgfCBpbnRlZ2VyTSB8IGludGVnZXIpLnBhcnNlU3RyaW5nKCI1SyAxMDAgNjQwSyAyNTZNIikpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgWzUxMjAsIDEwMCwgNjU1MzYwLCAyNjg0MzU0NTZdCiAgICAgICAgRXF1aXZhbGVudCBmb3JtIG9mIEN7ZXhwci5jb3B5KCl9IGlzIGp1c3QgQ3tleHByKCl9OjoKICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyKCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikKICAgICAgICAiIiIKICAgICAgICBjcHkgPSBjb3B5LmNvcHkoIHNlbGYgKQogICAgICAgIGNweS5wYXJzZUFjdGlvbiA9IHNlbGYucGFyc2VBY3Rpb25bOl0KICAgICAgICBjcHkuaWdub3JlRXhwcnMgPSBzZWxmLmlnbm9yZUV4cHJzWzpdCiAgICAgICAgaWYgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnM6CiAgICAgICAgICAgIGNweS53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTCiAgICAgICAgcmV0dXJuIGNweQoKICAgIGRlZiBzZXROYW1lKCBzZWxmLCBuYW1lICk6CiAgICAgICAgIiIiCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHRoaXMgZXhwcmVzc2lvbiwgbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgY2xlYXJlci4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgV29yZChudW1zKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQogICAgICAgICIiIgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJleGNlcHRpb24iKToKICAgICAgICAgICAgc2VsZi5leGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgbmFtZSBmb3IgcmVmZXJlbmNpbmcgbWF0Y2hpbmcgdG9rZW5zIGFzIGEgbmVzdGVkIGF0dHJpYnV0ZQogICAgICAgIG9mIHRoZSByZXR1cm5lZCBwYXJzZSByZXN1bHRzLgogICAgICAgIE5PVEU6IHRoaXMgcmV0dXJucyBhICpjb3B5KiBvZiB0aGUgb3JpZ2luYWwgQ3tQYXJzZXJFbGVtZW50fSBvYmplY3Q7CiAgICAgICAgdGhpcyBpcyBzbyB0aGF0IHRoZSBjbGllbnQgY2FuIGRlZmluZSBhIGJhc2ljIGVsZW1lbnQsIHN1Y2ggYXMgYW4KICAgICAgICBpbnRlZ2VyLCBhbmQgcmVmZXJlbmNlIGl0IGluIG11bHRpcGxlIHBsYWNlcyB3aXRoIGRpZmZlcmVudCBuYW1lcy4KCiAgICAgICAgWW91IGNhbiBhbHNvIHNldCByZXN1bHRzIG5hbWVzIHVzaW5nIHRoZSBhYmJyZXZpYXRlZCBzeW50YXgsCiAgICAgICAgQ3tleHByKCJuYW1lIil9IGluIHBsYWNlIG9mIEN7ZXhwci5zZXRSZXN1bHRzTmFtZSgibmFtZSIpfSAtIAogICAgICAgIHNlZSBMe0l7X19jYWxsX199PF9fY2FsbF9fPn0uCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyAKICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkKCiAgICAgICAgICAgICMgZXF1aXZhbGVudCBmb3JtOgogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQogICAgICAgICIiIgogICAgICAgIG5ld3NlbGYgPSBzZWxmLmNvcHkoKQogICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIioiKToKICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi0xXQogICAgICAgICAgICBsaXN0QWxsTWF0Y2hlcz1UcnVlCiAgICAgICAgbmV3c2VsZi5yZXN1bHRzTmFtZSA9IG5hbWUKICAgICAgICBuZXdzZWxmLm1vZGFsUmVzdWx0cyA9IG5vdCBsaXN0QWxsTWF0Y2hlcwogICAgICAgIHJldHVybiBuZXdzZWxmCgogICAgZGVmIHNldEJyZWFrKHNlbGYsYnJlYWtGbGFnID0gVHJ1ZSk6CiAgICAgICAgIiIiTWV0aG9kIHRvIGludm9rZSB0aGUgUHl0aG9uIHBkYiBkZWJ1Z2dlciB3aGVuIHRoaXMgZWxlbWVudCBpcwogICAgICAgICAgIGFib3V0IHRvIGJlIHBhcnNlZC4gU2V0IEN7YnJlYWtGbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8KICAgICAgICAgICBkaXNhYmxlLgogICAgICAgICIiIgogICAgICAgIGlmIGJyZWFrRmxhZzoKICAgICAgICAgICAgX3BhcnNlTWV0aG9kID0gc2VsZi5fcGFyc2UKICAgICAgICAgICAgZGVmIGJyZWFrZXIoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlKToKICAgICAgICAgICAgICAgIGltcG9ydCBwZGIKICAgICAgICAgICAgICAgIHBkYi5zZXRfdHJhY2UoKQogICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJzZU1ldGhvZCggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2UgKQogICAgICAgICAgICBicmVha2VyLl9vcmlnaW5hbFBhcnNlTWV0aG9kID0gX3BhcnNlTWV0aG9kCiAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gYnJlYWtlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fcGFyc2UsIl9vcmlnaW5hbFBhcnNlTWV0aG9kIik6CiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZSA9IHNlbGYuX3BhcnNlLl9vcmlnaW5hbFBhcnNlTWV0aG9kCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0UGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6CiAgICAgICAgIiIiCiAgICAgICAgRGVmaW5lIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gc3VjY2Vzc2Z1bGx5IG1hdGNoaW5nIHBhcnNlIGVsZW1lbnQgZGVmaW5pdGlvbi4KICAgICAgICBQYXJzZSBhY3Rpb24gZm4gaXMgYSBjYWxsYWJsZSBtZXRob2Qgd2l0aCAwLTMgYXJndW1lbnRzLCBjYWxsZWQgYXMgQ3tmbihzLGxvYyx0b2tzKX0sCiAgICAgICAgQ3tmbihsb2MsdG9rcyl9LCBDe2ZuKHRva3MpfSwgb3IganVzdCBDe2ZuKCl9LCB3aGVyZToKICAgICAgICAgLSBzICAgPSB0aGUgb3JpZ2luYWwgc3RyaW5nIGJlaW5nIHBhcnNlZCAoc2VlIG5vdGUgYmVsb3cpCiAgICAgICAgIC0gbG9jID0gdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcKICAgICAgICAgLSB0b2tzID0gYSBsaXN0IG9mIHRoZSBtYXRjaGVkIHRva2VucywgcGFja2FnZWQgYXMgYSBDe0x7UGFyc2VSZXN1bHRzfX0gb2JqZWN0CiAgICAgICAgSWYgdGhlIGZ1bmN0aW9ucyBpbiBmbnMgbW9kaWZ5IHRoZSB0b2tlbnMsIHRoZXkgY2FuIHJldHVybiB0aGVtIGFzIHRoZSByZXR1cm4KICAgICAgICB2YWx1ZSBmcm9tIGZuLCBhbmQgdGhlIG1vZGlmaWVkIGxpc3Qgb2YgdG9rZW5zIHdpbGwgcmVwbGFjZSB0aGUgb3JpZ2luYWwuCiAgICAgICAgT3RoZXJ3aXNlLCBmbiBkb2VzIG5vdCBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUuCgogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOgogICAgICAgICAtIGNhbGxEdXJpbmdUcnkgPSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGUgaWYgcGFyc2UgYWN0aW9uIHNob3VsZCBiZSBydW4gZHVyaW5nIGxvb2thaGVhZHMgYW5kIGFsdGVybmF0ZSB0ZXN0aW5nCgogICAgICAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZwogICAgICAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICAgICAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGEKICAgICAgICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbgogICAgICAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyCgogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQoKICAgICAgICAgICAgIyB1c2UgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG8gaW50cyBhdCBwYXJzZSB0aW1lCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyCgogICAgICAgICAgICAjIG5vdGUgdGhhdCBpbnRlZ2VyIGZpZWxkcyBhcmUgbm93IGludHMsIG5vdCBzdHJpbmdzCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWzE5OTksICcvJywgMTIsICcvJywgMzFdCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBhZGRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToKICAgICAgICAiIiIKICAgICAgICBBZGQgcGFyc2UgYWN0aW9uIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSBMe0l7c2V0UGFyc2VBY3Rpb259PHNldFBhcnNlQWN0aW9uPn0uCiAgICAgICAgCiAgICAgICAgU2VlIGV4YW1wbGVzIGluIEx7SXtjb3B5fTxjb3B5Pn0uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiArPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkKICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGFkZENvbmRpdGlvbihzZWxmLCAqZm5zLCAqKmt3YXJncyk6CiAgICAgICAgIiIiQWRkIGEgYm9vbGVhbiBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIAogICAgICAgIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fSBmb3IgZnVuY3Rpb24gY2FsbCBzaWduYXR1cmVzLiBVbmxpa2UgQ3tzZXRQYXJzZUFjdGlvbn0sIAogICAgICAgIGZ1bmN0aW9ucyBwYXNzZWQgdG8gQ3thZGRDb25kaXRpb259IG5lZWQgdG8gcmV0dXJuIGJvb2xlYW4gc3VjY2Vzcy9mYWlsIG9mIHRoZSBjb25kaXRpb24uCgogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOgogICAgICAgICAtIG1lc3NhZ2UgPSBkZWZpbmUgYSBjdXN0b20gbWVzc2FnZSB0byBiZSB1c2VkIGluIHRoZSByYWlzZWQgZXhjZXB0aW9uCiAgICAgICAgIC0gZmF0YWwgICA9IGlmIFRydWUsIHdpbGwgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbiB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHk7IG90aGVyd2lzZSB3aWxsIHJhaXNlIFBhcnNlRXhjZXB0aW9uCiAgICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQogICAgICAgICAgICB5ZWFyX2ludCA9IGludGVnZXIuY29weSgpCiAgICAgICAgICAgIHllYXJfaW50LmFkZENvbmRpdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSA+PSAyMDAwLCBtZXNzYWdlPSJPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIiKQogICAgICAgICAgICBkYXRlX3N0ciA9IHllYXJfaW50ICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXIKCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gRXhjZXB0aW9uOiBPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQogICAgICAgICIiIgogICAgICAgIG1zZyA9IGt3YXJncy5nZXQoIm1lc3NhZ2UiLCAiZmFpbGVkIHVzZXItZGVmaW5lZCBjb25kaXRpb24iKQogICAgICAgIGV4Y190eXBlID0gUGFyc2VGYXRhbEV4Y2VwdGlvbiBpZiBrd2FyZ3MuZ2V0KCJmYXRhbCIsIEZhbHNlKSBlbHNlIFBhcnNlRXhjZXB0aW9uCiAgICAgICAgZm9yIGZuIGluIGZuczoKICAgICAgICAgICAgZGVmIHBhKHMsbCx0KToKICAgICAgICAgICAgICAgIGlmIG5vdCBib29sKF90cmltX2FyaXR5KGZuKShzLGwsdCkpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIGV4Y190eXBlKHMsbCxtc2cpCiAgICAgICAgICAgIHNlbGYucGFyc2VBY3Rpb24uYXBwZW5kKHBhKQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0RmFpbEFjdGlvbiggc2VsZiwgZm4gKToKICAgICAgICAiIiJEZWZpbmUgYWN0aW9uIHRvIHBlcmZvcm0gaWYgcGFyc2luZyBmYWlscyBhdCB0aGlzIGV4cHJlc3Npb24uCiAgICAgICAgICAgRmFpbCBhY3RvbiBmbiBpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGFyZ3VtZW50cwogICAgICAgICAgIEN7Zm4ocyxsb2MsZXhwcixlcnIpfSB3aGVyZToKICAgICAgICAgICAgLSBzID0gc3RyaW5nIGJlaW5nIHBhcnNlZAogICAgICAgICAgICAtIGxvYyA9IGxvY2F0aW9uIHdoZXJlIGV4cHJlc3Npb24gbWF0Y2ggd2FzIGF0dGVtcHRlZCBhbmQgZmFpbGVkCiAgICAgICAgICAgIC0gZXhwciA9IHRoZSBwYXJzZSBleHByZXNzaW9uIHRoYXQgZmFpbGVkCiAgICAgICAgICAgIC0gZXJyID0gdGhlIGV4Y2VwdGlvbiB0aHJvd24KICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBubyB2YWx1ZS4gIEl0IG1heSB0aHJvdyBDe0x7UGFyc2VGYXRhbEV4Y2VwdGlvbn19CiAgICAgICAgICAgaWYgaXQgaXMgZGVzaXJlZCB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHkuIiIiCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gZm4KICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfc2tpcElnbm9yYWJsZXMoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToKICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQogICAgICAgIHdoaWxlIGV4cHJzRm91bmQ6CiAgICAgICAgICAgIGV4cHJzRm91bmQgPSBGYWxzZQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyxkdW1teSA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgICAgICAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIGxvYwoKICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOgogICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkKCiAgICAgICAgaWYgc2VsZi5za2lwV2hpdGVzcGFjZToKICAgICAgICAgICAgd3QgPSBzZWxmLndoaXRlQ2hhcnMKICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIHd0OgogICAgICAgICAgICAgICAgbG9jICs9IDEKCiAgICAgICAgcmV0dXJuIGxvYwoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgcmV0dXJuIGxvYywgW10KCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICByZXR1cm4gdG9rZW5saXN0CgogICAgI34gQHByb2ZpbGUKICAgIGRlZiBfcGFyc2VOb0NhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToKICAgICAgICBkZWJ1Z2dpbmcgPSAoIHNlbGYuZGVidWcgKSAjYW5kIGRvQWN0aW9ucyApCgogICAgICAgIGlmIGRlYnVnZ2luZyBvciBzZWxmLmZhaWxBY3Rpb246CiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2giLHNlbGYsImF0IGxvYyIsbG9jLCIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1swXSApOgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMF0oIGluc3RyaW5nLCBsb2MsIHNlbGYgKQogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOgogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MKICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgICN+IHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiLCBlcnIpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnQWN0aW9uc1syXToKICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQogICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsQWN0aW9uOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbEFjdGlvbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOgogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MKICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MKICAgICAgICAgICAgaWYgc2VsZi5tYXlJbmRleEVycm9yIG9yIGxvYyA+PSBsZW4oaW5zdHJpbmcpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQoKICAgICAgICB0b2tlbnMgPSBzZWxmLnBvc3RQYXJzZSggaW5zdHJpbmcsIGxvYywgdG9rZW5zICkKCiAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsIHNlbGYucmVzdWx0c05hbWUsIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QsIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkKICAgICAgICBpZiBzZWxmLnBhcnNlQWN0aW9uIGFuZCAoZG9BY3Rpb25zIG9yIHNlbGYuY2FsbER1cmluZ1RyeSk6CiAgICAgICAgICAgIGlmIGRlYnVnZ2luZzoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QgYW5kIGlzaW5zdGFuY2UodG9rZW5zLChQYXJzZVJlc3VsdHMsbGlzdCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgICAgICAjfiBwcmludCAiRXhjZXB0aW9uIHJhaXNlZCBpbiB1c2VyIHBhcnNlIGFjdGlvbjoiLCBlcnIKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMl0gKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246CiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkKICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQoKICAgICAgICBpZiBkZWJ1Z2dpbmc6CiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2hlZCIsc2VsZiwiLT4iLHJldFRva2Vucy5hc0xpc3QoKSkKICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzFdICk6CiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1sxXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBsb2MsIHNlbGYsIHJldFRva2VucyApCgogICAgICAgIHJldHVybiBsb2MsIHJldFRva2VucwoKICAgIGRlZiB0cnlQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9RmFsc2UgKVswXQogICAgICAgIGV4Y2VwdCBQYXJzZUZhdGFsRXhjZXB0aW9uOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAKICAgIGRlZiBjYW5QYXJzZU5leHQoc2VsZiwgaW5zdHJpbmcsIGxvYyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnRyeVBhcnNlKGluc3RyaW5nLCBsb2MpCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgY2xhc3MgX1VuYm91bmRlZENhY2hlKG9iamVjdCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBjYWNoZSA9IHt9CiAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkKCiAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpCgogICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlCgogICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpCgogICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQogICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQogICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikKCiAgICBpZiBfT3JkZXJlZERpY3QgaXMgbm90IE5vbmU6CiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6CiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpCgogICAgICAgICAgICAgICAgY2FjaGUgPSBfT3JkZXJlZERpY3QoKQoKICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQoKICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNhY2hlKSA+IHNpemU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcGl0ZW0oRmFsc2UpCgogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkKCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQoKICAgIGVsc2U6CiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6CiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpCgogICAgICAgICAgICAgICAgY2FjaGUgPSB7fQogICAgICAgICAgICAgICAga2V5X2ZpZm8gPSBjb2xsZWN0aW9ucy5kZXF1ZShbXSwgc2l6ZSkKCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkKCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihjYWNoZSkgPiBzaXplOgogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3Aoa2V5X2ZpZm8ucG9wbGVmdCgpLCBOb25lKQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmFwcGVuZChrZXkpCgogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkKICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5jbGVhcigpCgogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikKCiAgICAjIGFyZ3VtZW50IGNhY2hlIGZvciBvcHRpbWl6aW5nIHJlcGVhdGVkIGNhbGxzIHdoZW4gYmFja3RyYWNraW5nIHRocm91Z2ggcmVjdXJzaXZlIGV4cHJlc3Npb25zCiAgICBwYWNrcmF0X2NhY2hlID0ge30gIyB0aGlzIGlzIHNldCBsYXRlciBieSBlbmFibGVkUGFja3JhdCgpOyB0aGlzIGlzIGhlcmUgc28gdGhhdCByZXNldENhY2hlKCkgZG9lc24ndCBmYWlsCiAgICBwYWNrcmF0X2NhY2hlX2xvY2sgPSBSTG9jaygpCiAgICBwYWNrcmF0X2NhY2hlX3N0YXRzID0gWzAsIDBdCgogICAgIyB0aGlzIG1ldGhvZCBnZXRzIHJlcGVhdGVkbHkgY2FsbGVkIGR1cmluZyBiYWNrdHJhY2tpbmcgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgLQogICAgIyB3ZSBjYW4gY2FjaGUgdGhlc2UgYXJndW1lbnRzIGFuZCBzYXZlIG91cnNlbHZlcyB0aGUgdHJvdWJsZSBvZiByZS1wYXJzaW5nIHRoZSBjb250YWluZWQgZXhwcmVzc2lvbgogICAgZGVmIF9wYXJzZUNhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToKICAgICAgICBISVQsIE1JU1MgPSAwLCAxCiAgICAgICAgbG9va3VwID0gKHNlbGYsIGluc3RyaW5nLCBsb2MsIGNhbGxQcmVQYXJzZSwgZG9BY3Rpb25zKQogICAgICAgIHdpdGggUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX2xvY2s6CiAgICAgICAgICAgIGNhY2hlID0gUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlCiAgICAgICAgICAgIHZhbHVlID0gY2FjaGUuZ2V0KGxvb2t1cCkKICAgICAgICAgICAgaWYgdmFsdWUgaXMgY2FjaGUubm90X2luX2NhY2hlOgogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW01JU1NdICs9IDEKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3BhcnNlTm9DYWNoZShpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6CiAgICAgICAgICAgICAgICAgICAgIyBjYWNoZSBhIGNvcHkgb2YgdGhlIGV4Y2VwdGlvbiwgd2l0aG91dCB0aGUgdHJhY2ViYWNrCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgcGUuX19jbGFzc19fKCpwZS5hcmdzKSkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbSElUXSArPSAxCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBFeGNlcHRpb24pOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIHZhbHVlCiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpCgogICAgX3BhcnNlID0gX3BhcnNlTm9DYWNoZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiByZXNldENhY2hlKCk6CiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlLmNsZWFyKCkKICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbOl0gPSBbMF0gKiBsZW4oUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzKQoKICAgIF9wYWNrcmF0RW5hYmxlZCA9IEZhbHNlCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZW5hYmxlUGFja3JhdChjYWNoZV9zaXplX2xpbWl0PTEyOCk6CiAgICAgICAgIiIiRW5hYmxlcyAicGFja3JhdCIgcGFyc2luZywgd2hpY2ggYWRkcyBtZW1vaXppbmcgdG8gdGhlIHBhcnNpbmcgbG9naWMuCiAgICAgICAgICAgUmVwZWF0ZWQgcGFyc2UgYXR0ZW1wdHMgYXQgdGhlIHNhbWUgc3RyaW5nIGxvY2F0aW9uICh3aGljaCBoYXBwZW5zCiAgICAgICAgICAgb2Z0ZW4gaW4gbWFueSBjb21wbGV4IGdyYW1tYXJzKSBjYW4gaW1tZWRpYXRlbHkgcmV0dXJuIGEgY2FjaGVkIHZhbHVlLAogICAgICAgICAgIGluc3RlYWQgb2YgcmUtZXhlY3V0aW5nIHBhcnNpbmcvdmFsaWRhdGluZyBjb2RlLiAgTWVtb2l6aW5nIGlzIGRvbmUgb2YKICAgICAgICAgICBib3RoIHZhbGlkIHJlc3VsdHMgYW5kIHBhcnNpbmcgZXhjZXB0aW9ucy4KICAgICAgICAgICAKICAgICAgICAgICBQYXJhbWV0ZXJzOgogICAgICAgICAgICAtIGNhY2hlX3NpemVfbGltaXQgLSAoZGVmYXVsdD1DezEyOH0pIC0gaWYgYW4gaW50ZWdlciB2YWx1ZSBpcyBwcm92aWRlZAogICAgICAgICAgICAgIHdpbGwgbGltaXQgdGhlIHNpemUgb2YgdGhlIHBhY2tyYXQgY2FjaGU7IGlmIE5vbmUgaXMgcGFzc2VkLCB0aGVuCiAgICAgICAgICAgICAgdGhlIGNhY2hlIHNpemUgd2lsbCBiZSB1bmJvdW5kZWQ7IGlmIDAgaXMgcGFzc2VkLCB0aGUgY2FjaGUgd2lsbAogICAgICAgICAgICAgIGJlIGVmZmVjdGl2ZWx5IGRpc2FibGVkLgogICAgICAgICAgICAKICAgICAgICAgICBUaGlzIHNwZWVkdXAgbWF5IGJyZWFrIGV4aXN0aW5nIHByb2dyYW1zIHRoYXQgdXNlIHBhcnNlIGFjdGlvbnMgdGhhdAogICAgICAgICAgIGhhdmUgc2lkZS1lZmZlY3RzLiAgRm9yIHRoaXMgcmVhc29uLCBwYWNrcmF0IHBhcnNpbmcgaXMgZGlzYWJsZWQgd2hlbgogICAgICAgICAgIHlvdSBmaXJzdCBpbXBvcnQgcHlwYXJzaW5nLiAgVG8gYWN0aXZhdGUgdGhlIHBhY2tyYXQgZmVhdHVyZSwgeW91cgogICAgICAgICAgIHByb2dyYW0gbXVzdCBjYWxsIHRoZSBjbGFzcyBtZXRob2QgQ3tQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKX0uICBJZgogICAgICAgICAgIHlvdXIgcHJvZ3JhbSB1c2VzIEN7cHN5Y299IHRvICJjb21waWxlIGFzIHlvdSBnbyIsIHlvdSBtdXN0IGNhbGwKICAgICAgICAgICBDe2VuYWJsZVBhY2tyYXR9IGJlZm9yZSBjYWxsaW5nIEN7cHN5Y28uZnVsbCgpfS4gIElmIHlvdSBkbyBub3QgZG8gdGhpcywKICAgICAgICAgICBQeXRob24gd2lsbCBjcmFzaC4gIEZvciBiZXN0IHJlc3VsdHMsIGNhbGwgQ3tlbmFibGVQYWNrcmF0KCl9IGltbWVkaWF0ZWx5CiAgICAgICAgICAgYWZ0ZXIgaW1wb3J0aW5nIHB5cGFyc2luZy4KICAgICAgICAgICAKICAgICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgICAgaW1wb3J0IHB5cGFyc2luZwogICAgICAgICAgICAgICBweXBhcnNpbmcuUGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0KCkKICAgICAgICAiIiIKICAgICAgICBpZiBub3QgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQ6CiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkID0gVHJ1ZQogICAgICAgICAgICBpZiBjYWNoZV9zaXplX2xpbWl0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9VbmJvdW5kZWRDYWNoZSgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9GaWZvQ2FjaGUoY2FjaGVfc2l6ZV9saW1pdCkKICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFyc2UgPSBQYXJzZXJFbGVtZW50Ll9wYXJzZUNhY2hlCgogICAgZGVmIHBhcnNlU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgcGFyc2VBbGw9RmFsc2UgKToKICAgICAgICAiIiIKICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHN0cmluZy4KICAgICAgICBUaGlzIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byB0aGUgY2xpZW50IGNvZGUsIG9uY2UgdGhlIGNvbXBsZXRlCiAgICAgICAgZXhwcmVzc2lvbiBoYXMgYmVlbiBidWlsdC4KCiAgICAgICAgSWYgeW91IHdhbnQgdGhlIGdyYW1tYXIgdG8gcmVxdWlyZSB0aGF0IHRoZSBlbnRpcmUgaW5wdXQgc3RyaW5nIGJlCiAgICAgICAgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgdGhlbiBzZXQgQ3twYXJzZUFsbH0gdG8gVHJ1ZSAoZXF1aXZhbGVudCB0byBlbmRpbmcKICAgICAgICB0aGUgZ3JhbW1hciB3aXRoIEN7THtTdHJpbmdFbmQoKX19KS4KCiAgICAgICAgTm90ZTogQ3twYXJzZVN0cmluZ30gaW1wbGljaXRseSBjYWxscyBDe2V4cGFuZHRhYnMoKX0gb24gdGhlIGlucHV0IHN0cmluZywKICAgICAgICBpbiBvcmRlciB0byByZXBvcnQgcHJvcGVyIGNvbHVtbiBudW1iZXJzIGluIHBhcnNlIGFjdGlvbnMuCiAgICAgICAgSWYgdGhlIGlucHV0IHN0cmluZyBjb250YWlucyB0YWJzIGFuZAogICAgICAgIHRoZSBncmFtbWFyIHVzZXMgcGFyc2UgYWN0aW9ucyB0aGF0IHVzZSB0aGUgQ3tsb2N9IGFyZ3VtZW50IHRvIGluZGV4IGludG8gdGhlCiAgICAgICAgc3RyaW5nIGJlaW5nIHBhcnNlZCwgeW91IGNhbiBlbnN1cmUgeW91IGhhdmUgYSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGlucHV0CiAgICAgICAgc3RyaW5nIGJ5OgogICAgICAgICAtIGNhbGxpbmcgQ3twYXJzZVdpdGhUYWJzfSBvbiB5b3VyIGdyYW1tYXIgYmVmb3JlIGNhbGxpbmcgQ3twYXJzZVN0cmluZ30KICAgICAgICAgICAoc2VlIEx7SXtwYXJzZVdpdGhUYWJzfTxwYXJzZVdpdGhUYWJzPn0pCiAgICAgICAgIC0gZGVmaW5lIHlvdXIgcGFyc2UgYWN0aW9uIHVzaW5nIHRoZSBmdWxsIEN7KHMsbG9jLHRva3MpfSBzaWduYXR1cmUsIGFuZAogICAgICAgICAgIHJlZmVyZW5jZSB0aGUgaW5wdXQgc3RyaW5nIHVzaW5nIHRoZSBwYXJzZSBhY3Rpb24ncyBDe3N9IGFyZ3VtZW50CiAgICAgICAgIC0gZXhwbGljdGx5IGV4cGFuZCB0aGUgdGFicyBpbiB5b3VyIGlucHV0IHN0cmluZyBiZWZvcmUgY2FsbGluZwogICAgICAgICAgIEN7cGFyc2VTdHJpbmd9CiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJykgICMgLT4gWydhYWFhYSddCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJywgcGFyc2VBbGw9VHJ1ZSkgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBlbmQgb2YgdGV4dAogICAgICAgICIiIgogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpCiAgICAgICAgICAgICN+IHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUKICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOgogICAgICAgICAgICBpbnN0cmluZyA9IGluc3RyaW5nLmV4cGFuZHRhYnMoKQogICAgICAgIHRyeToKICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIDAgKQogICAgICAgICAgICBpZiBwYXJzZUFsbDoKICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICAgICAgc2UgPSBFbXB0eSgpICsgU3RyaW5nRW5kKCkKICAgICAgICAgICAgICAgIHNlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlCiAgICAgICAgICAgICAgICByYWlzZSBleGMKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdG9rZW5zCgogICAgZGVmIHNjYW5TdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5ULCBvdmVybGFwPUZhbHNlICk6CiAgICAgICAgIiIiCiAgICAgICAgU2NhbiB0aGUgaW5wdXQgc3RyaW5nIGZvciBleHByZXNzaW9uIG1hdGNoZXMuICBFYWNoIG1hdGNoIHdpbGwgcmV0dXJuIHRoZQogICAgICAgIG1hdGNoaW5nIHRva2Vucywgc3RhcnQgbG9jYXRpb24sIGFuZCBlbmQgbG9jYXRpb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwKICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNjYW5uaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4gIElmCiAgICAgICAgQ3tvdmVybGFwfSBpcyBzcGVjaWZpZWQsIHRoZW4gb3ZlcmxhcHBpbmcgbWF0Y2hlcyB3aWxsIGJlIHJlcG9ydGVkLgoKICAgICAgICBOb3RlIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb25zIGFyZSByZXBvcnRlZCByZWxhdGl2ZSB0byB0aGUgc3RyaW5nCiAgICAgICAgYmVpbmcgcGFyc2VkLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXJzaW5nCiAgICAgICAgc3RyaW5ncyB3aXRoIGVtYmVkZGVkIHRhYnMuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBzb3VyY2UgPSAic2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3IgogICAgICAgICAgICBwcmludChzb3VyY2UpCiAgICAgICAgICAgIGZvciB0b2tlbnMsc3RhcnQsZW5kIGluIFdvcmQoYWxwaGFzKS5zY2FuU3RyaW5nKHNvdXJjZSk6CiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyAnXicqKGVuZC1zdGFydCkpCiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyB0b2tlbnNbMF0pCiAgICAgICAgCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAKICAgICAgICAgICAgc2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3CiAgICAgICAgICAgIF5eXl5eCiAgICAgICAgICAgIHNsZGpmCiAgICAgICAgICAgICAgICAgICAgXl5eXl5eXgogICAgICAgICAgICAgICAgICAgIGxzZGpqa2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZGtqZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGtqc2ZkCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkKCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6CiAgICAgICAgICAgIGluc3RyaW5nID0gX3VzdHIoaW5zdHJpbmcpLmV4cGFuZHRhYnMoKQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQogICAgICAgIGxvYyA9IDAKICAgICAgICBwcmVwYXJzZUZuID0gc2VsZi5wcmVQYXJzZQogICAgICAgIHBhcnNlRm4gPSBzZWxmLl9wYXJzZQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpCiAgICAgICAgbWF0Y2hlcyA9IDAKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIGxvYyA8PSBpbnN0cmxlbiBhbmQgbWF0Y2hlcyA8IG1heE1hdGNoZXM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgICAgICAgICAgbmV4dExvYyx0b2tlbnMgPSBwYXJzZUZuKCBpbnN0cmluZywgcHJlbG9jLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5leHRMb2MgPiBsb2M6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgKz0gMQogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbnMsIHByZWxvYywgbmV4dExvYwogICAgICAgICAgICAgICAgICAgICAgICBpZiBvdmVybGFwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV4dGxvYyA+IGxvYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzEKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwoKICAgIGRlZiB0cmFuc2Zvcm1TdHJpbmcoIHNlbGYsIGluc3RyaW5nICk6CiAgICAgICAgIiIiCiAgICAgICAgRXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHRvIG1vZGlmeSBtYXRjaGluZyB0ZXh0IHdpdGggbW9kaWZpZWQgdG9rZW5zIHRoYXQgbWF5CiAgICAgICAgYmUgcmV0dXJuZWQgZnJvbSBhIHBhcnNlIGFjdGlvbi4gIFRvIHVzZSBDe3RyYW5zZm9ybVN0cmluZ30sIGRlZmluZSBhIGdyYW1tYXIgYW5kCiAgICAgICAgYXR0YWNoIGEgcGFyc2UgYWN0aW9uIHRvIGl0IHRoYXQgbW9kaWZpZXMgdGhlIHJldHVybmVkIHRva2VuIGxpc3QuCiAgICAgICAgSW52b2tpbmcgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gb24gYSB0YXJnZXQgc3RyaW5nIHdpbGwgdGhlbiBzY2FuIGZvciBtYXRjaGVzLAogICAgICAgIGFuZCByZXBsYWNlIHRoZSBtYXRjaGVkIHRleHQgcGF0dGVybnMgYWNjb3JkaW5nIHRvIHRoZSBsb2dpYyBpbiB0aGUgcGFyc2UKICAgICAgICBhY3Rpb24uICBDe3RyYW5zZm9ybVN0cmluZygpfSByZXR1cm5zIHRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgc3RyaW5nLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQogICAgICAgICAgICB3ZC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXS50aXRsZSgpKQogICAgICAgICAgICAKICAgICAgICAgICAgcHJpbnQod2QudHJhbnNmb3JtU3RyaW5nKCJub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrLiIpKQogICAgICAgIFByaW50czo6CiAgICAgICAgICAgIE5vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsuCiAgICAgICAgIiIiCiAgICAgICAgb3V0ID0gW10KICAgICAgICBsYXN0RSA9IDAKICAgICAgICAjIGZvcmNlIHByZXNlcnZhdGlvbiBvZiA8VEFCPnMsIHRvIG1pbmltaXplIHVud2FudGVkIHRyYW5zZm9ybWF0aW9uIG9mIHN0cmluZywgYW5kIHRvCiAgICAgICAgIyBrZWVwIHN0cmluZyBsb2NzIHN0cmFpZ2h0IGJldHdlZW4gdHJhbnNmb3JtU3RyaW5nIGFuZCBzY2FuU3RyaW5nCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nICk6CiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBpbnN0cmluZ1tsYXN0RTpzXSApCiAgICAgICAgICAgICAgICBpZiB0OgogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodCxQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdC5hc0xpc3QoKQogICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0LGxpc3QpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdAogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQodCkKICAgICAgICAgICAgICAgIGxhc3RFID0gZQogICAgICAgICAgICBvdXQuYXBwZW5kKGluc3RyaW5nW2xhc3RFOl0pCiAgICAgICAgICAgIG91dCA9IFtvIGZvciBvIGluIG91dCBpZiBvXQogICAgICAgICAgICByZXR1cm4gIiIuam9pbihtYXAoX3VzdHIsX2ZsYXR0ZW4ob3V0KSkpCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlCiAgICAgICAgICAgICAgICByYWlzZSBleGMKCiAgICBkZWYgc2VhcmNoU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCApOgogICAgICAgICIiIgogICAgICAgIEFub3RoZXIgZXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHNpbXBsaWZ5aW5nIHRoZSBhY2Nlc3MgdG8gdGhlIHRva2VucyBmb3VuZAogICAgICAgIHRvIG1hdGNoIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzZWFyY2hpbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIGEgY2FwaXRhbGl6ZWQgd29yZCBzdGFydHMgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlIGxldHRlcnMKICAgICAgICAgICAgY2FwX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50KGNhcF93b3JkLnNlYXJjaFN0cmluZygiTW9yZSB0aGFuIElyb24sIG1vcmUgdGhhbiBMZWFkLCBtb3JlIHRoYW4gR29sZCBJIG5lZWQgRWxlY3RyaWNpdHkiKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbJ01vcmUnLCAnSXJvbicsICdMZWFkJywgJ0dvbGQnLCAnSSddCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdCBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKCBpbnN0cmluZywgbWF4TWF0Y2hlcyApIF0pCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlCiAgICAgICAgICAgICAgICByYWlzZSBleGMKCiAgICBkZWYgc3BsaXQoc2VsZiwgaW5zdHJpbmcsIG1heHNwbGl0PV9NQVhfSU5ULCBpbmNsdWRlU2VwYXJhdG9ycz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdG9yIG1ldGhvZCB0byBzcGxpdCBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhcyBhIHNlcGFyYXRvci4KICAgICAgICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwgQ3ttYXhzcGxpdH0gYXJndW1lbnQsIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygc3BsaXRzOwogICAgICAgIGFuZCB0aGUgb3B0aW9uYWwgQ3tpbmNsdWRlU2VwYXJhdG9yc30gYXJndW1lbnQgKGRlZmF1bHQ9Q3tGYWxzZX0pLCBpZiB0aGUgc2VwYXJhdGluZwogICAgICAgIG1hdGNoaW5nIHRleHQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzcGxpdCByZXN1bHRzLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OiAgICAgICAgCiAgICAgICAgICAgIHB1bmMgPSBvbmVPZihsaXN0KCIuLDs6Ly0hPyIpKQogICAgICAgICAgICBwcmludChsaXN0KHB1bmMuc3BsaXQoIlRoaXMsIHRoaXM/LCB0aGlzIHNlbnRlbmNlLCBpcyBiYWRseSBwdW5jdHVhdGVkISIpKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbJ1RoaXMnLCAnIHRoaXMnLCAnJywgJyB0aGlzIHNlbnRlbmNlJywgJyBpcyBiYWRseSBwdW5jdHVhdGVkJywgJyddCiAgICAgICAgIiIiCiAgICAgICAgc3BsaXRzID0gMAogICAgICAgIGxhc3QgPSAwCiAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyhpbnN0cmluZywgbWF4TWF0Y2hlcz1tYXhzcGxpdCk6CiAgICAgICAgICAgIHlpZWxkIGluc3RyaW5nW2xhc3Q6c10KICAgICAgICAgICAgaWYgaW5jbHVkZVNlcGFyYXRvcnM6CiAgICAgICAgICAgICAgICB5aWVsZCB0WzBdCiAgICAgICAgICAgIGxhc3QgPSBlCiAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpdCgogICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7QW5kfX0uIEFkZGluZyBzdHJpbmdzIHRvIGEgUGFyc2VyRWxlbWVudAogICAgICAgIGNvbnZlcnRzIHRoZW0gdG8gTHtMaXRlcmFsfXMgYnkgZGVmYXVsdC4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISIKICAgICAgICAgICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISIKICAgICAgICAgICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpCiAgICAgICAgUHJpbnRzOjoKICAgICAgICAgICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIEFuZCggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmCgogICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3IsIHJldHVybnMgQ3tMe0FuZH19IHdpdGggZXJyb3Igc3RvcAogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBBbmQoIFsgc2VsZiwgQW5kLl9FcnJvclN0b3AoKSwgb3RoZXIgXSApCgogICAgZGVmIF9fcnN1Yl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG90aGVyIC0gc2VsZgoKICAgIGRlZiBfX211bF9fKHNlbGYsb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICogb3BlcmF0b3IsIGFsbG93cyB1c2Ugb2YgQ3tleHByICogM30gaW4gcGxhY2Ugb2YKICAgICAgICBDe2V4cHIgKyBleHByICsgZXhwcn0uICBFeHByZXNzaW9ucyBtYXkgYWxzbyBtZSBtdWx0aXBsaWVkIGJ5IGEgMi1pbnRlZ2VyCiAgICAgICAgdHVwbGUsIHNpbWlsYXIgdG8gQ3t7bWluLG1heH19IG11bHRpcGxpZXJzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBUdXBsZXMKICAgICAgICBtYXkgYWxzbyBpbmNsdWRlIEN7Tm9uZX0gYXMgaW46CiAgICAgICAgIC0gQ3tleHByKihuLE5vbmUpfSBvciBDe2V4cHIqKG4sKX0gaXMgZXF1aXZhbGVudAogICAgICAgICAgICAgIHRvIEN7ZXhwcipuICsgTHtaZXJvT3JNb3JlfShleHByKX0KICAgICAgICAgICAgICAocmVhZCBhcyAiYXQgbGVhc3QgbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpCiAgICAgICAgIC0gQ3tleHByKihOb25lLG4pfSBpcyBlcXVpdmFsZW50IHRvIEN7ZXhwciooMCxuKX0KICAgICAgICAgICAgICAocmVhZCBhcyAiMCB0byBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikKICAgICAgICAgLSBDe2V4cHIqKE5vbmUsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe1plcm9Pck1vcmV9KGV4cHIpfQogICAgICAgICAtIEN7ZXhwciooMSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7T25lT3JNb3JlfShleHByKX0KCiAgICAgICAgTm90ZSB0aGF0IEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIGlmCiAgICAgICAgbW9yZSB0aGFuIG4gZXhwcnMgZXhpc3QgaW4gdGhlIGlucHV0IHN0cmVhbTsgdGhhdCBpcywKICAgICAgICBDe2V4cHIqKE5vbmUsbil9IGRvZXMgbm90IGVuZm9yY2UgYSBtYXhpbXVtIG51bWJlciBvZiBleHByCiAgICAgICAgb2NjdXJyZW5jZXMuICBJZiB0aGlzIGJlaGF2aW9yIGlzIGRlc2lyZWQsIHRoZW4gd3JpdGUKICAgICAgICBDe2V4cHIqKE5vbmUsbikgKyB+ZXhwcn0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCk6CiAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyLDAKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsdHVwbGUpOgogICAgICAgICAgICBvdGhlciA9IChvdGhlciArIChOb25lLCBOb25lKSlbOjJdCiAgICAgICAgICAgIGlmIG90aGVyWzBdIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvdGhlciA9ICgwLCBvdGhlclsxXSkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBvdGhlclsxXSBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmVyb09yTW9yZShzZWxmKQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT25lT3JNb3JlKHNlbGYpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmKm90aGVyWzBdICsgWmVyb09yTW9yZShzZWxmKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgaXNpbnN0YW5jZShvdGhlclsxXSxpbnQpOgogICAgICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXIKICAgICAgICAgICAgICAgIG9wdEVsZW1lbnRzIC09IG1pbkVsZW1lbnRzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICgnJXMnLCclcycpIG9iamVjdHMiLCB0eXBlKG90aGVyWzBdKSx0eXBlKG90aGVyWzFdKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICclcycgb2JqZWN0cyIsIHR5cGUob3RoZXIpKQoKICAgICAgICBpZiBtaW5FbGVtZW50cyA8IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IG5lZ2F0aXZlIHZhbHVlIikKICAgICAgICBpZiBvcHRFbGVtZW50cyA8IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlY29uZCB0dXBsZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gZmlyc3QgdHVwbGUgdmFsdWUiKQogICAgICAgIGlmIG1pbkVsZW1lbnRzID09IG9wdEVsZW1lbnRzID09IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IDAgb3IgKDAsMCkiKQoKICAgICAgICBpZiAob3B0RWxlbWVudHMpOgogICAgICAgICAgICBkZWYgbWFrZU9wdGlvbmFsTGlzdChuKToKICAgICAgICAgICAgICAgIGlmIG4+MToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZiArIG1ha2VPcHRpb25hbExpc3Qobi0xKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYpCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzOgogICAgICAgICAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gMToKICAgICAgICAgICAgICAgICAgICByZXQgPSBzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0ID0gbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOgogICAgICAgICAgICAgICAgcmV0ID0gc2VsZgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykKICAgICAgICByZXR1cm4gcmV0CgogICAgZGVmIF9fcm11bF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fX211bF9fKG90aGVyKQoKICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7TWF0Y2hGaXJzdH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIE1hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fcm9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgfCBzZWxmCgogICAgZGVmIF9feG9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7T3J9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBPciggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19yeG9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgXiBzZWxmCgogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7RWFjaH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIEVhY2goIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fcmFuZF9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG90aGVyICYgc2VsZgoKICAgIGRlZiBfX2ludmVydF9fKCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe05vdEFueX19CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIE5vdEFueSggc2VsZiApCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIG5hbWU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2hvcnRjdXQgZm9yIEN7THtzZXRSZXN1bHRzTmFtZX19LCB3aXRoIEN7bGlzdEFsbE1hdGNoZXM9RmFsc2V9LgogICAgICAgIAogICAgICAgIElmIEN7bmFtZX0gaXMgZ2l2ZW4gd2l0aCBhIHRyYWlsaW5nIEN7JyonfSBjaGFyYWN0ZXIsIHRoZW4gQ3tsaXN0QWxsTWF0Y2hlc30gd2lsbCBiZQogICAgICAgIHBhc3NlZCBhcyBDe1RydWV9LgogICAgICAgICAgIAogICAgICAgIElmIEN7bmFtZX0gaXMgb21pdHRlZCwgc2FtZSBhcyBjYWxsaW5nIEN7THtjb3B5fX0uCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIHRoZXNlIGFyZSBlcXVpdmFsZW50CiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpLnNldFJlc3VsdHNOYW1lKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKS5zZXRSZXN1bHRzTmFtZSgic29jc2Vjbm8iKQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKSgibmFtZSIpICsgV29yZChudW1zKyItIikoInNvY3NlY25vIikgICAgICAgICAgICAgCiAgICAgICAgIiIiCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0UmVzdWx0c05hbWUobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkKCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBTdXBwcmVzc2VzIHRoZSBvdXRwdXQgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9OyB1c2VmdWwgdG8ga2VlcCBwdW5jdHVhdGlvbiBmcm9tCiAgICAgICAgY2x1dHRlcmluZyB1cCByZXR1cm5lZCBvdXRwdXQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFN1cHByZXNzKCBzZWxmICkKCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgRGlzYWJsZXMgdGhlIHNraXBwaW5nIG9mIHdoaXRlc3BhY2UgYmVmb3JlIG1hdGNoaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQogICAgICAgIEN7UGFyc2VyRWxlbWVudH0ncyBkZWZpbmVkIHBhdHRlcm4uICBUaGlzIGlzIG5vcm1hbGx5IG9ubHkgdXNlZCBpbnRlcm5hbGx5IGJ5CiAgICAgICAgdGhlIHB5cGFyc2luZyBtb2R1bGUsIGJ1dCBtYXkgYmUgbmVlZGVkIGluIHNvbWUgd2hpdGVzcGFjZS1zZW5zaXRpdmUgZ3JhbW1hcnMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLCBjaGFycyApOgogICAgICAgICIiIgogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUKICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBjaGFycwogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBwYXJzZVdpdGhUYWJzKCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgT3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3IgdG8gZXhwYW5kIEN7PFRBQj59cyB0byBzcGFjZXMgYmVmb3JlIHBhcnNpbmcgdGhlIGlucHV0IHN0cmluZy4KICAgICAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgQ3twYXJzZVN0cmluZ30gd2hlbiB0aGUgaW5wdXQgZ3JhbW1hciBjb250YWlucyBlbGVtZW50cyB0aGF0CiAgICAgICAgbWF0Y2ggQ3s8VEFCPn0gY2hhcmFjdGVycy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgZXhwcmVzc2lvbiB0byBiZSBpZ25vcmVkIChlLmcuLCBjb21tZW50cykgd2hpbGUgZG9pbmcgcGF0dGVybgogICAgICAgIG1hdGNoaW5nOyBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHksIHRvIGRlZmluZSBtdWx0aXBsZSBjb21tZW50IG9yIG90aGVyCiAgICAgICAgaWdub3JhYmxlIHBhdHRlcm5zLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkKICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaiddCiAgICAgICAgICAgIAogICAgICAgICAgICBwYXR0Lmlnbm9yZShjU3R5bGVDb21tZW50KQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJywgJ2xza2pkJ10KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgb3RoZXIgPSBTdXBwcmVzcyhvdGhlcikKCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6CiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQob3RoZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQoIFN1cHByZXNzKCBvdGhlci5jb3B5KCkgKSApCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0RGVidWdBY3Rpb25zKCBzZWxmLCBzdGFydEFjdGlvbiwgc3VjY2Vzc0FjdGlvbiwgZXhjZXB0aW9uQWN0aW9uICk6CiAgICAgICAgIiIiCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoc3RhcnRBY3Rpb24gb3IgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NBY3Rpb24gb3IgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQWN0aW9uIG9yIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24pCiAgICAgICAgc2VsZi5kZWJ1ZyA9IFRydWUKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXREZWJ1Zyggc2VsZiwgZmxhZz1UcnVlICk6CiAgICAgICAgIiIiCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuCiAgICAgICAgU2V0IEN7ZmxhZ30gdG8gVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvIGRpc2FibGUuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKS5zZXROYW1lKCJhbHBoYXdvcmQiKQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJudW13b3JkIikKICAgICAgICAgICAgdGVybSA9IHdkIHwgaW50ZWdlcgogICAgICAgICAgICAKICAgICAgICAgICAgIyB0dXJuIG9uIGRlYnVnZ2luZyBmb3Igd2QKICAgICAgICAgICAgd2Quc2V0RGVidWcoKQoKICAgICAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCJhYmMgMTIzIHh5eiA4OTAiKQogICAgICAgIAogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMCgxLDEpCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsnYWJjJ10KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAzKDEsNCkKICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDcoMSw4KQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ3h5eiddCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTEoMSwxMikKICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTIpLCAobGluZToxLCBjb2w6MTMpCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTUoMSwxNikKICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTUpLCAobGluZToxLCBjb2w6MTYpCgogICAgICAgIFRoZSBvdXRwdXQgc2hvd24gaXMgdGhhdCBwcm9kdWNlZCBieSB0aGUgZGVmYXVsdCBkZWJ1ZyBhY3Rpb25zIC0gY3VzdG9tIGRlYnVnIGFjdGlvbnMgY2FuIGJlCiAgICAgICAgc3BlY2lmaWVkIHVzaW5nIEx7c2V0RGVidWdBY3Rpb25zfS4gUHJpb3IgdG8gYXR0ZW1wdGluZwogICAgICAgIHRvIG1hdGNoIHRoZSBDe3dkfSBleHByZXNzaW9uLCB0aGUgZGVidWdnaW5nIG1lc3NhZ2UgQ3siTWF0Y2ggPGV4cHJuYW1lPiBhdCBsb2MgPG4+KDxsaW5lPiw8Y29sPikifQogICAgICAgIGlzIHNob3duLiBUaGVuIGlmIHRoZSBwYXJzZSBzdWNjZWVkcywgYSBDeyJNYXRjaGVkIn0gbWVzc2FnZSBpcyBzaG93biwgb3IgYW4gQ3siRXhjZXB0aW9uIHJhaXNlZCJ9CiAgICAgICAgbWVzc2FnZSBpcyBzaG93bi4gQWxzbyBub3RlIHRoZSB1c2Ugb2YgTHtzZXROYW1lfSB0byBhc3NpZ24gYSBodW1hbi1yZWFkYWJsZSBuYW1lIHRvIHRoZSBleHByZXNzaW9uLAogICAgICAgIHdoaWNoIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGVhc2llciB0byB1bmRlcnN0YW5kIC0gZm9yIGluc3RhbmNlLCB0aGUgZGVmYXVsdAogICAgICAgIG5hbWUgY3JlYXRlZCBmb3IgdGhlIEN7V29yZH0gZXhwcmVzc2lvbiB3aXRob3V0IGNhbGxpbmcgQ3tzZXROYW1lfSBpcyBDeyJXOihBQkNELi4uKSJ9LgogICAgICAgICIiIgogICAgICAgIGlmIGZsYWc6CiAgICAgICAgICAgIHNlbGYuc2V0RGVidWdBY3Rpb25zKCBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uLCBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQoKICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6CiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUKICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBwYXNzCgogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgZGVmaW5lZCBleHByZXNzaW9ucyBmb3IgdmFsaWQgc3RydWN0dXJlLCBjaGVjayBmb3IgaW5maW5pdGUgcmVjdXJzaXZlIGRlZmluaXRpb25zLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkKCiAgICBkZWYgcGFyc2VGaWxlKCBzZWxmLCBmaWxlX29yX2ZpbGVuYW1lLCBwYXJzZUFsbD1GYWxzZSApOgogICAgICAgICIiIgogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gdGhlIGdpdmVuIGZpbGUgb3IgZmlsZW5hbWUuCiAgICAgICAgSWYgYSBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgKGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdCksCiAgICAgICAgdGhlIGVudGlyZSBmaWxlIGlzIG9wZW5lZCwgcmVhZCwgYW5kIGNsb3NlZCBiZWZvcmUgcGFyc2luZy4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmaWxlX29yX2ZpbGVuYW1lLnJlYWQoKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVfb3JfZmlsZW5hbWUsICJyIikgYXMgZjoKICAgICAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VTdHJpbmcoZmlsZV9jb250ZW50cywgcGFyc2VBbGwpCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlCiAgICAgICAgICAgICAgICByYWlzZSBleGMKCiAgICBkZWYgX19lcV9fKHNlbGYsb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFBhcnNlckVsZW1lbnQpOgogICAgICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlciBvciB2YXJzKHNlbGYpID09IHZhcnMob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hlcyhvdGhlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VyRWxlbWVudCxzZWxmKT09b3RoZXIKCiAgICBkZWYgX19uZV9fKHNlbGYsb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKGlkKHNlbGYpKQoKICAgIGRlZiBfX3JlcV9fKHNlbGYsb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmID09IG90aGVyCgogICAgZGVmIF9fcm5lX18oc2VsZixvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKCiAgICBkZWYgbWF0Y2hlcyhzZWxmLCB0ZXN0U3RyaW5nLCBwYXJzZUFsbD1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBNZXRob2QgZm9yIHF1aWNrIHRlc3Rpbmcgb2YgYSBwYXJzZXIgYWdhaW5zdCBhIHRlc3Qgc3RyaW5nLiBHb29kIGZvciBzaW1wbGUgCiAgICAgICAgaW5saW5lIG1pY3JvdGVzdHMgb2Ygc3ViIGV4cHJlc3Npb25zIHdoaWxlIGJ1aWxkaW5nIHVwIGxhcmdlciBwYXJzZXIuCiAgICAgICAgICAgCiAgICAgICAgUGFyYW1ldGVyczoKICAgICAgICAgLSB0ZXN0U3RyaW5nIC0gdG8gdGVzdCBhZ2FpbnN0IHRoaXMgZXhwcmVzc2lvbiBmb3IgYSBtYXRjaAogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzCiAgICAgICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBleHByID0gV29yZChudW1zKQogICAgICAgICAgICBhc3NlcnQgZXhwci5tYXRjaGVzKCIxMDAiKQogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5wYXJzZVN0cmluZyhfdXN0cih0ZXN0U3RyaW5nKSwgcGFyc2VBbGw9cGFyc2VBbGwpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICAKICAgIGRlZiBydW5UZXN0cyhzZWxmLCB0ZXN0cywgcGFyc2VBbGw9VHJ1ZSwgY29tbWVudD0nIycsIGZ1bGxEdW1wPVRydWUsIHByaW50UmVzdWx0cz1UcnVlLCBmYWlsdXJlVGVzdHM9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gYSBzZXJpZXMgb2YgdGVzdCBzdHJpbmdzLCBzaG93aW5nIGVhY2gKICAgICAgICB0ZXN0LCB0aGUgcGFyc2VkIHJlc3VsdHMgb3Igd2hlcmUgdGhlIHBhcnNlIGZhaWxlZC4gUXVpY2sgYW5kIGVhc3kgd2F5IHRvCiAgICAgICAgcnVuIGEgcGFyc2UgZXhwcmVzc2lvbiBhZ2FpbnN0IGEgbGlzdCBvZiBzYW1wbGUgc3RyaW5ncy4KICAgICAgICAgICAKICAgICAgICBQYXJhbWV0ZXJzOgogICAgICAgICAtIHRlc3RzIC0gYSBsaXN0IG9mIHNlcGFyYXRlIHRlc3Qgc3RyaW5ncywgb3IgYSBtdWx0aWxpbmUgc3RyaW5nIG9mIHRlc3Qgc3RyaW5ncwogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzICAgICAgICAgICAKICAgICAgICAgLSBjb21tZW50IC0gKGRlZmF1bHQ9Q3snIyd9KSAtIGV4cHJlc3Npb24gZm9yIGluZGljYXRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGhlIHRlc3QgCiAgICAgICAgICAgICAgc3RyaW5nOyBwYXNzIE5vbmUgdG8gZGlzYWJsZSBjb21tZW50IGZpbHRlcmluZwogICAgICAgICAtIGZ1bGxEdW1wIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBkdW1wIHJlc3VsdHMgYXMgbGlzdCBmb2xsb3dlZCBieSByZXN1bHRzIG5hbWVzIGluIG5lc3RlZCBvdXRsaW5lOwogICAgICAgICAgICAgIGlmIEZhbHNlLCBvbmx5IGR1bXAgbmVzdGVkIGxpc3QKICAgICAgICAgLSBwcmludFJlc3VsdHMgLSAoZGVmYXVsdD1De1RydWV9KSBwcmludHMgdGVzdCBvdXRwdXQgdG8gc3Rkb3V0CiAgICAgICAgIC0gZmFpbHVyZVRlc3RzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlcyBpZiB0aGVzZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gZmFpbCBwYXJzaW5nCgogICAgICAgIFJldHVybnM6IGEgKHN1Y2Nlc3MsIHJlc3VsdHMpIHR1cGxlLCB3aGVyZSBzdWNjZXNzIGluZGljYXRlcyB0aGF0IGFsbCB0ZXN0cyBzdWNjZWVkZWQKICAgICAgICAob3IgZmFpbGVkIGlmIEN7ZmFpbHVyZVRlc3RzfSBpcyBUcnVlKSwgYW5kIHRoZSByZXN1bHRzIGNvbnRhaW4gYSBsaXN0IG9mIGxpbmVzIG9mIGVhY2ggCiAgICAgICAgdGVzdCdzIG91dHB1dAogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBudW1iZXJfZXhwciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyLmNvcHkoKQoKICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXIKICAgICAgICAgICAgICAgIDEwMAogICAgICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyCiAgICAgICAgICAgICAgICAtMTAwCiAgICAgICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbgogICAgICAgICAgICAgICAgNi4wMmUyMwogICAgICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbgogICAgICAgICAgICAgICAgMWUtMTIKICAgICAgICAgICAgICAgICcnJykKICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikKCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgIDEwMFoKICAgICAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicKICAgICAgICAgICAgICAgIC0uMTAwCiAgICAgICAgICAgICAgICAjIHRvbyBtYW55ICcuJwogICAgICAgICAgICAgICAgMy4xNC4xNTkKICAgICAgICAgICAgICAgICcnJywgZmFpbHVyZVRlc3RzPVRydWUpCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyCiAgICAgICAgICAgIDEwMAogICAgICAgICAgICBbMTAwXQoKICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyCiAgICAgICAgICAgIC0xMDAKICAgICAgICAgICAgWy0xMDBdCgogICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbgogICAgICAgICAgICA2LjAyZTIzCiAgICAgICAgICAgIFs2LjAyZSsyM10KCiAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24KICAgICAgICAgICAgMWUtMTIKICAgICAgICAgICAgWzFlLTEyXQoKICAgICAgICAgICAgU3VjY2VzcwogICAgICAgICAgICAKICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXIKICAgICAgICAgICAgMTAwWgogICAgICAgICAgICAgICBeCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDMpLCAobGluZToxLCBjb2w6NCkKCiAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicKICAgICAgICAgICAgLS4xMDAKICAgICAgICAgICAgXgogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCB7cmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIHwgcmVhbCBudW1iZXIgfCBzaWduZWQgaW50ZWdlcn0gKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQoKICAgICAgICAgICAgIyB0b28gbWFueSAnLicKICAgICAgICAgICAgMy4xNC4xNTkKICAgICAgICAgICAgICAgIF4KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQoKICAgICAgICAgICAgU3VjY2VzcwoKICAgICAgICBFYWNoIHRlc3Qgc3RyaW5nIG11c3QgYmUgb24gYSBzaW5nbGUgbGluZS4gSWYgeW91IHdhbnQgdG8gdGVzdCBhIHN0cmluZyB0aGF0IHNwYW5zIG11bHRpcGxlCiAgICAgICAgbGluZXMsIGNyZWF0ZSBhIHRlc3QgbGlrZSB0aGlzOjoKCiAgICAgICAgICAgIGV4cHIucnVuVGVzdChyInRoaXMgaXMgYSB0ZXN0XFxuIG9mIHN0cmluZ3MgdGhhdCBzcGFucyBcXG4gMyBsaW5lcyIpCiAgICAgICAgCiAgICAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcmF3IHN0cmluZyBsaXRlcmFsLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSBsZWFkaW5nICdyJy4pCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0cywgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIHRlc3RzID0gbGlzdChtYXAoc3RyLnN0cmlwLCB0ZXN0cy5yc3RyaXAoKS5zcGxpdGxpbmVzKCkpKQogICAgICAgIGlmIGlzaW5zdGFuY2UoY29tbWVudCwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGNvbW1lbnQgPSBMaXRlcmFsKGNvbW1lbnQpCiAgICAgICAgYWxsUmVzdWx0cyA9IFtdCiAgICAgICAgY29tbWVudHMgPSBbXQogICAgICAgIHN1Y2Nlc3MgPSBUcnVlCiAgICAgICAgZm9yIHQgaW4gdGVzdHM6CiAgICAgICAgICAgIGlmIGNvbW1lbnQgaXMgbm90IE5vbmUgYW5kIGNvbW1lbnQubWF0Y2hlcyh0LCBGYWxzZSkgb3IgY29tbWVudHMgYW5kIG5vdCB0OgogICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKHQpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBub3QgdDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIG91dCA9IFsnXG4nLmpvaW4oY29tbWVudHMpLCB0XQogICAgICAgICAgICBjb21tZW50cyA9IFtdCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UocidcbicsJ1xuJykKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGFyc2VTdHJpbmcodCwgcGFyc2VBbGw9cGFyc2VBbGwpCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlc3VsdC5kdW1wKGZ1bGw9ZnVsbER1bXApKQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIG5vdCBmYWlsdXJlVGVzdHMKICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToKICAgICAgICAgICAgICAgIGZhdGFsID0gIihGQVRBTCkiIGlmIGlzaW5zdGFuY2UocGUsIFBhcnNlRmF0YWxFeGNlcHRpb24pIGVsc2UgIiIKICAgICAgICAgICAgICAgIGlmICdcbicgaW4gdDoKICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGxpbmUocGUubG9jLCB0KSkKICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJyooY29sKHBlLmxvYyx0KS0xKSArICdeJyArIGZhdGFsKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJypwZS5sb2MgKyAnXicgKyBmYXRhbCkKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUw6ICIgKyBzdHIocGUpKQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cwogICAgICAgICAgICAgICAgcmVzdWx0ID0gcGUKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMLUVYQ0VQVElPTjogIiArIHN0cihleGMpKQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cwogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXhjCgogICAgICAgICAgICBpZiBwcmludFJlc3VsdHM6CiAgICAgICAgICAgICAgICBpZiBmdWxsRHVtcDoKICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcnKQogICAgICAgICAgICAgICAgcHJpbnQoJ1xuJy5qb2luKG91dCkpCgogICAgICAgICAgICBhbGxSZXN1bHRzLmFwcGVuZCgodCwgcmVzdWx0KSkKICAgICAgICAKICAgICAgICByZXR1cm4gc3VjY2VzcywgYWxsUmVzdWx0cwoKICAgICAgICAKY2xhc3MgVG9rZW4oUGFyc2VyRWxlbWVudCk6CiAgICAiIiIKICAgIEFic3RyYWN0IEN7UGFyc2VyRWxlbWVudH0gc3ViY2xhc3MsIGZvciBkZWZpbmluZyBhdG9taWMgbWF0Y2hpbmcgcGF0dGVybnMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKFRva2VuLHNlbGYpLl9faW5pdF9fKCBzYXZlbGlzdD1GYWxzZSApCgoKY2xhc3MgRW1wdHkoVG9rZW4pOgogICAgIiIiCiAgICBBbiBlbXB0eSB0b2tlbiwgd2lsbCBhbHdheXMgbWF0Y2guCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKEVtcHR5LHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm5hbWUgPSAiRW1wdHkiCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQoKCmNsYXNzIE5vTWF0Y2goVG9rZW4pOgogICAgIiIiCiAgICBBIHRva2VuIHRoYXQgd2lsbCBuZXZlciBtYXRjaC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoTm9NYXRjaCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5uYW1lID0gIk5vTWF0Y2giCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYuZXJybXNnID0gIlVubWF0Y2hhYmxlIHRva2VuIgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgoKY2xhc3MgTGl0ZXJhbChUb2tlbik6CiAgICAiIiIKICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLgogICAgCiAgICBFeGFtcGxlOjoKICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaGZvb2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhJykgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAiYmxhaCIKICAgIAogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzTGl0ZXJhbH0uCiAgICAKICAgIEZvciBrZXl3b3JkIG1hdGNoaW5nIChmb3JjZSB3b3JkIGJyZWFrIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG1hdGNoZWQgc3RyaW5nKSwKICAgIHVzZSBMe0tleXdvcmR9IG9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOgogICAgICAgIHN1cGVyKExpdGVyYWwsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZwogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIExpdGVyYWw7IHVzZSBFbXB0eSgpIGluc3RlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IEVtcHR5CiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgX3VzdHIoc2VsZi5tYXRjaCkKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogdGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGEgKmxvdCoKICAgICMgaWYgdGhpcyBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2ggc3RyaW5nICBhbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBtYXRjaGVzLAogICAgIyBzaG9ydC1jaXJjdWl0IGFzIHF1aWNrbHkgYXMgcG9zc2libGUsIGFuZCBhdm9pZCBjYWxsaW5nIHN0YXJ0c3dpdGgKICAgICN+IEBwcm9maWxlCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kCiAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSApOgogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKX0wgPSBMaXRlcmFsClBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IExpdGVyYWwKCmNsYXNzIEtleXdvcmQoVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZyBhcyBhIGtleXdvcmQsIHRoYXQgaXMsIGl0IG11c3QgYmUKICAgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgbm9uLWtleXdvcmQgY2hhcmFjdGVyLiAgQ29tcGFyZSB3aXRoIEN7THtMaXRlcmFsfX06CiAgICAgLSBDe0xpdGVyYWwoImlmIil9IHdpbGwgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZkFuZE9ubHlJZid9LgogICAgIC0gQ3tLZXl3b3JkKCJpZiIpfSB3aWxsIG5vdDsgaXQgd2lsbCBvbmx5IG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWYgeD0xJ30sIG9yIEN7J2lmKHk9PTIpJ30KICAgIEFjY2VwdHMgdHdvIG9wdGlvbmFsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBpbiBhZGRpdGlvbiB0byB0aGUga2V5d29yZCBzdHJpbmc6CiAgICAgLSBDe2lkZW50Q2hhcnN9IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBiZSB2YWxpZCBpZGVudGlmaWVyIGNoYXJhY3RlcnMsCiAgICAgICAgICBkZWZhdWx0aW5nIHRvIGFsbCBhbHBoYW51bWVyaWNzICsgIl8iIGFuZCAiJCIKICAgICAtIEN7Y2FzZWxlc3N9IGFsbG93cyBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCBkZWZhdWx0IGlzIEN7RmFsc2V9LgogICAgICAgCiAgICBFeGFtcGxlOjoKICAgICAgICBLZXl3b3JkKCJzdGFydCIpLnBhcnNlU3RyaW5nKCJzdGFydCIpICAjIC0+IFsnc3RhcnQnXQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0aW5nIikgICMgLT4gRXhjZXB0aW9uCgogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzS2V5d29yZH0uCiAgICAiIiIKICAgIERFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGFscGhhbnVtcysiXyQiCgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lLCBjYXNlbGVzcz1GYWxzZSApOgogICAgICAgIHN1cGVyKEtleXdvcmQsc2VsZikuX19pbml0X18oKQogICAgICAgIGlmIGlkZW50Q2hhcnMgaXMgTm9uZToKICAgICAgICAgICAgaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gS2V5d29yZDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgc2VsZi5tYXRjaAogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYuY2FzZWxlc3MgPSBjYXNlbGVzcwogICAgICAgIGlmIGNhc2VsZXNzOgogICAgICAgICAgICBzZWxmLmNhc2VsZXNzbWF0Y2ggPSBtYXRjaFN0cmluZy51cHBlcigpCiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBpZGVudENoYXJzLnVwcGVyKCkKICAgICAgICBzZWxmLmlkZW50Q2hhcnMgPSBzZXQoaWRlbnRDaGFycykKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIHNlbGYuY2FzZWxlc3M6CiAgICAgICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kCiAgICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kCiAgICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZAogICAgICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpIGFuZAogICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZAogICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOgogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgYyA9IHN1cGVyKEtleXdvcmQsc2VsZikuY29weSgpCiAgICAgICAgYy5pZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMKICAgICAgICByZXR1cm4gYwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBzZXREZWZhdWx0S2V5d29yZENoYXJzKCBjaGFycyApOgogICAgICAgICIiIk92ZXJyaWRlcyB0aGUgZGVmYXVsdCBLZXl3b3JkIGNoYXJzCiAgICAgICAgIiIiCiAgICAgICAgS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBjaGFycwoKY2xhc3MgQ2FzZWxlc3NMaXRlcmFsKExpdGVyYWwpOgogICAgIiIiCiAgICBUb2tlbiB0byBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcsIGlnbm9yaW5nIGNhc2Ugb2YgbGV0dGVycy4KICAgIE5vdGU6IHRoZSBtYXRjaGVkIHJlc3VsdHMgd2lsbCBhbHdheXMgYmUgaW4gdGhlIGNhc2Ugb2YgdGhlIGdpdmVuCiAgICBtYXRjaCBzdHJpbmcsIE5PVCB0aGUgY2FzZSBvZiB0aGUgaW5wdXQgdGV4dC4KCiAgICBFeGFtcGxlOjoKICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NMaXRlcmFsKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCcsICdDTUQnXQogICAgICAgIAogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0tleXdvcmR9LikKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOgogICAgICAgIHN1cGVyKENhc2VsZXNzTGl0ZXJhbCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcudXBwZXIoKSApCiAgICAgICAgIyBQcmVzZXJ2ZSB0aGUgZGVmaW5pbmcgbGl0ZXJhbC4KICAgICAgICBzZWxmLnJldHVyblN0cmluZyA9IG1hdGNoU3RyaW5nCiAgICAgICAgc2VsZi5uYW1lID0gIiclcyciICUgc2VsZi5yZXR1cm5TdHJpbmcKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLm1hdGNoOgogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYucmV0dXJuU3RyaW5nCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgpjbGFzcyBDYXNlbGVzc0tleXdvcmQoS2V5d29yZCk6CiAgICAiIiIKICAgIENhc2VsZXNzIHZlcnNpb24gb2YgTHtLZXl3b3JkfS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NLZXl3b3JkKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCddCiAgICAgICAgCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzTGl0ZXJhbH0uKQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUgKToKICAgICAgICBzdXBlcihDYXNlbGVzc0tleXdvcmQsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzLCBjYXNlbGVzcz1UcnVlICkKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kCiAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOgogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCmNsYXNzIENsb3NlTWF0Y2goVG9rZW4pOgogICAgIiIiCiAgICBBIHZhcmlhdGlvbiBvbiBMe0xpdGVyYWx9IHdoaWNoIG1hdGNoZXMgImNsb3NlIiBtYXRjaGVzLCB0aGF0IGlzLCAKICAgIHN0cmluZ3Mgd2l0aCBhdCBtb3N0ICduJyBtaXNtYXRjaGluZyBjaGFyYWN0ZXJzLiBDe0Nsb3NlTWF0Y2h9IHRha2VzIHBhcmFtZXRlcnM6CiAgICAgLSBDe21hdGNoX3N0cmluZ30gLSBzdHJpbmcgdG8gYmUgbWF0Y2hlZAogICAgIC0gQ3ttYXhNaXNtYXRjaGVzfSAtIChDe2RlZmF1bHQ9MX0pIG1heGltdW0gbnVtYmVyIG9mIG1pc21hdGNoZXMgYWxsb3dlZCB0byBjb3VudCBhcyBhIG1hdGNoCiAgICAKICAgIFRoZSByZXN1bHRzIGZyb20gYSBzdWNjZXNzZnVsIHBhcnNlIHdpbGwgY29udGFpbiB0aGUgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIGZvbGxvd2luZyBuYW1lZCByZXN1bHRzOgogICAgIC0gQ3ttaXNtYXRjaGVzfSAtIGEgbGlzdCBvZiB0aGUgcG9zaXRpb25zIHdpdGhpbiB0aGUgbWF0Y2hfc3RyaW5nIHdoZXJlIG1pc21hdGNoZXMgd2VyZSBmb3VuZAogICAgIC0gQ3tvcmlnaW5hbH0gLSB0aGUgb3JpZ2luYWwgbWF0Y2hfc3RyaW5nIHVzZWQgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBpbnB1dCBzdHJpbmcKICAgIAogICAgSWYgQ3ttaXNtYXRjaGVzfSBpcyBhbiBlbXB0eSBsaXN0LCB0aGVuIHRoZSBtYXRjaCB3YXMgYW4gZXhhY3QgbWF0Y2guCiAgICAKICAgIEV4YW1wbGU6OgogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIikKICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFYR0dBIikgIyAtPiAoWydBVENBVENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAnQVRDQVRDR0FBVEdHQScgKHdpdGggdXAgdG8gMSBtaXNtYXRjaGVzKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCgogICAgICAgICMgZXhhY3QgbWF0Y2gKICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFUR0dBIikgIyAtPiAoWydBVENBVENHQUFUR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbXV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkKCiAgICAgICAgIyBjbG9zZSBtYXRjaCBhbGxvd2luZyB1cCB0byAyIG1pc21hdGNoZXMKICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIsIG1heE1pc21hdGNoZXM9MikKICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiAoWydBVENBWENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbNCwgOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXRjaF9zdHJpbmcsIG1heE1pc21hdGNoZXM9MSk6CiAgICAgICAgc3VwZXIoQ2xvc2VNYXRjaCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5uYW1lID0gbWF0Y2hfc3RyaW5nCiAgICAgICAgc2VsZi5tYXRjaF9zdHJpbmcgPSBtYXRjaF9zdHJpbmcKICAgICAgICBzZWxmLm1heE1pc21hdGNoZXMgPSBtYXhNaXNtYXRjaGVzCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgJXIgKHdpdGggdXAgdG8gJWQgbWlzbWF0Y2hlcykiICUgKHNlbGYubWF0Y2hfc3RyaW5nLCBzZWxmLm1heE1pc21hdGNoZXMpCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHN0YXJ0ID0gbG9jCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBsZW4oc2VsZi5tYXRjaF9zdHJpbmcpCgogICAgICAgIGlmIG1heGxvYyA8PSBpbnN0cmxlbjoKICAgICAgICAgICAgbWF0Y2hfc3RyaW5nID0gc2VsZi5tYXRjaF9zdHJpbmcKICAgICAgICAgICAgbWF0Y2hfc3RyaW5nbG9jID0gMAogICAgICAgICAgICBtaXNtYXRjaGVzID0gW10KICAgICAgICAgICAgbWF4TWlzbWF0Y2hlcyA9IHNlbGYubWF4TWlzbWF0Y2hlcwoKICAgICAgICAgICAgZm9yIG1hdGNoX3N0cmluZ2xvYyxzX20gaW4gZW51bWVyYXRlKHppcChpbnN0cmluZ1tsb2M6bWF4bG9jXSwgc2VsZi5tYXRjaF9zdHJpbmcpKToKICAgICAgICAgICAgICAgIHNyYyxtYXQgPSBzX20KICAgICAgICAgICAgICAgIGlmIHNyYyAhPSBtYXQ6CiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQobWF0Y2hfc3RyaW5nbG9jKQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihtaXNtYXRjaGVzKSA+IG1heE1pc21hdGNoZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2MgPSBtYXRjaF9zdHJpbmdsb2MgKyAxCiAgICAgICAgICAgICAgICByZXN1bHRzID0gUGFyc2VSZXN1bHRzKFtpbnN0cmluZ1tzdGFydDpsb2NdXSkKICAgICAgICAgICAgICAgIHJlc3VsdHNbJ29yaWdpbmFsJ10gPSBzZWxmLm1hdGNoX3N0cmluZwogICAgICAgICAgICAgICAgcmVzdWx0c1snbWlzbWF0Y2hlcyddID0gbWlzbWF0Y2hlcwogICAgICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0cwoKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCgpjbGFzcyBXb3JkKFRva2VuKToKICAgICIiIgogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGFsbG93ZWQgY2hhcmFjdGVyIHNldHMuCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGFsbG93ZWQgaW5pdGlhbCBjaGFyYWN0ZXJzLAogICAgYW4gb3B0aW9uYWwgc3RyaW5nIGNvbnRhaW5pbmcgYWxsb3dlZCBib2R5IGNoYXJhY3RlcnMgKGlmIG9taXR0ZWQsCiAgICBkZWZhdWx0cyB0byB0aGUgaW5pdGlhbCBjaGFyYWN0ZXIgc2V0KSwgYW5kIGFuIG9wdGlvbmFsIG1pbmltdW0sCiAgICBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLiBBbiBvcHRpb25hbAogICAgQ3tleGNsdWRlQ2hhcnN9IHBhcmFtZXRlciBjYW4gbGlzdCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgZm91bmQgaW4gCiAgICB0aGUgaW5wdXQgQ3tib2R5Q2hhcnN9IHN0cmluZzsgdXNlZnVsIHRvIGRlZmluZSBhIHdvcmQgb2YgYWxsIHByaW50YWJsZXMKICAgIGV4Y2VwdCBmb3Igb25lIG9yIHR3byBjaGFyYWN0ZXJzLCBmb3IgaW5zdGFuY2UuCiAgICAKICAgIEx7c3JhbmdlfSBpcyB1c2VmdWwgZm9yIGRlZmluaW5nIGN1c3RvbSBjaGFyYWN0ZXIgc2V0IHN0cmluZ3MgZm9yIGRlZmluaW5nIAogICAgQ3tXb3JkfSBleHByZXNzaW9ucywgdXNpbmcgcmFuZ2Ugbm90YXRpb24gZnJvbSByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyIHNldHMuCiAgICAKICAgIEEgY29tbW9uIG1pc3Rha2UgaXMgdG8gdXNlIEN7V29yZH0gdG8gbWF0Y2ggYSBzcGVjaWZpYyBsaXRlcmFsIHN0cmluZywgYXMgaW4gCiAgICBDe1dvcmQoIkFkZHJlc3MiKX0uIFJlbWVtYmVyIHRoYXQgQ3tXb3JkfSB1c2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgdG8gZGVmaW5lCiAgICBJe3NldHN9IG9mIG1hdGNoYWJsZSBjaGFyYWN0ZXJzLiBUaGlzIGV4cHJlc3Npb24gd291bGQgbWF0Y2ggIkFkZCIsICJBQUEiLAogICAgImRBcmVkIiwgb3IgYW55IG90aGVyIHdvcmQgbWFkZSB1cCBvZiB0aGUgY2hhcmFjdGVycyAnQScsICdkJywgJ3InLCAnZScsIGFuZCAncycuCiAgICBUbyBtYXRjaCBhbiBleGFjdCBsaXRlcmFsIHN0cmluZywgdXNlIEx7TGl0ZXJhbH0gb3IgTHtLZXl3b3JkfS4KCiAgICBweXBhcnNpbmcgaW5jbHVkZXMgaGVscGVyIHN0cmluZ3MgZm9yIGJ1aWxkaW5nIFdvcmRzOgogICAgIC0gTHthbHBoYXN9CiAgICAgLSBMe251bXN9CiAgICAgLSBMe2FscGhhbnVtc30KICAgICAtIEx7aGV4bnVtc30KICAgICAtIEx7YWxwaGFzOGJpdH0gKGFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gYWNjZW50ZWQsIHRpbGRlZCwgdW1sYXV0ZWQsIGV0Yy4pCiAgICAgLSBMe3B1bmM4Yml0fSAobm9uLWFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gY3VycmVuY3ksIHN5bWJvbHMsIHN1cGVyc2NyaXB0cywgZGlhY3JpdGljYWxzLCBldGMuKQogICAgIC0gTHtwcmludGFibGVzfSAoYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcikKCiAgICBFeGFtcGxlOjoKICAgICAgICAjIGEgd29yZCBjb21wb3NlZCBvZiBkaWdpdHMKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKSAjIGVxdWl2YWxlbnQgdG8gV29yZCgiMDEyMzQ1Njc4OSIpIG9yIFdvcmQoc3JhbmdlKCIwLTkiKSkKICAgICAgICAKICAgICAgICAjIGEgd29yZCB3aXRoIGEgbGVhZGluZyBjYXBpdGFsLCBhbmQgemVybyBvciBtb3JlIGxvd2VyY2FzZQogICAgICAgIGNhcGl0YWxfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQoKICAgICAgICAjIGhvc3RuYW1lcyBhcmUgYWxwaGFudW1lcmljLCB3aXRoIGxlYWRpbmcgYWxwaGEsIGFuZCAnLScKICAgICAgICBob3N0bmFtZSA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMrJy0nKQogICAgICAgIAogICAgICAgICMgcm9tYW4gbnVtZXJhbCAobm90IGEgc3RyaWN0IHBhcnNlciwgYWNjZXB0cyBpbnZhbGlkIG1peCBvZiBjaGFyYWN0ZXJzKQogICAgICAgIHJvbWFuID0gV29yZCgiSVZYTENETSIpCiAgICAgICAgCiAgICAgICAgIyBhbnkgc3RyaW5nIG9mIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIGV4Y2VwdCBmb3IgJywnCiAgICAgICAgY3N2X3ZhbHVlID0gV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9IiwiKQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGluaXRDaGFycywgYm9keUNoYXJzPU5vbmUsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCwgYXNLZXl3b3JkPUZhbHNlLCBleGNsdWRlQ2hhcnM9Tm9uZSApOgogICAgICAgIHN1cGVyKFdvcmQsc2VsZikuX19pbml0X18oKQogICAgICAgIGlmIGV4Y2x1ZGVDaGFyczoKICAgICAgICAgICAgaW5pdENoYXJzID0gJycuam9pbihjIGZvciBjIGluIGluaXRDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpCiAgICAgICAgICAgIGlmIGJvZHlDaGFyczoKICAgICAgICAgICAgICAgIGJvZHlDaGFycyA9ICcnLmpvaW4oYyBmb3IgYyBpbiBib2R5Q2hhcnMgaWYgYyBub3QgaW4gZXhjbHVkZUNoYXJzKQogICAgICAgIHNlbGYuaW5pdENoYXJzT3JpZyA9IGluaXRDaGFycwogICAgICAgIHNlbGYuaW5pdENoYXJzID0gc2V0KGluaXRDaGFycykKICAgICAgICBpZiBib2R5Q2hhcnMgOgogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBib2R5Q2hhcnMKICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoYm9keUNoYXJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGluaXRDaGFycwogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChpbml0Q2hhcnMpCgogICAgICAgIHNlbGYubWF4U3BlY2lmaWVkID0gbWF4ID4gMAoKICAgICAgICBpZiBtaW4gPCAxOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKFdvcmQoKSkgaWYgemVyby1sZW5ndGggd29yZCBpcyBwZXJtaXR0ZWQiKQoKICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbgoKICAgICAgICBpZiBtYXggPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQKCiAgICAgICAgaWYgZXhhY3QgPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0CiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QKCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLmFzS2V5d29yZCA9IGFzS2V5d29yZAoKICAgICAgICBpZiAnICcgbm90IGluIHNlbGYuaW5pdENoYXJzT3JpZytzZWxmLmJvZHlDaGFyc09yaWcgYW5kIChtaW49PTEgYW5kIG1heD09MCBhbmQgZXhhY3Q9PTApOgogICAgICAgICAgICBpZiBzZWxmLmJvZHlDaGFyc09yaWcgPT0gc2VsZi5pbml0Q2hhcnNPcmlnOgogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdKyIgJSBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZykKICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5pbml0Q2hhcnNPcmlnKSA9PSAxOgogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICIlc1slc10qIiAlIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmUuZXNjYXBlKHNlbGYuaW5pdENoYXJzT3JpZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXVslc10qIiAlIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpCiAgICAgICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOgogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHIiXGIiK3NlbGYucmVTdHJpbmcrciJcYiIKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoIHNlbGYucmVTdHJpbmcgKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgc2VsZi5yZSA9IE5vbmUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIHNlbGYucmU6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQogICAgICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkKICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0Lmdyb3VwKCkKCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLmluaXRDaGFycyk6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICBzdGFydCA9IGxvYwogICAgICAgIGxvYyArPSAxCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgYm9keWNoYXJzID0gc2VsZi5ib2R5Q2hhcnMKICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGluc3RybGVuICkKICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOgogICAgICAgICAgICBsb2MgKz0gMQoKICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IEZhbHNlCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoKICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlCiAgICAgICAgaWYgc2VsZi5tYXhTcGVjaWZpZWQgYW5kIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoKICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlCiAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6CiAgICAgICAgICAgIGlmIChzdGFydD4wIGFuZCBpbnN0cmluZ1tzdGFydC0xXSBpbiBib2R5Y2hhcnMpIG9yIChsb2M8aW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzKToKICAgICAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQoKICAgICAgICBpZiB0aHJvd0V4Y2VwdGlvbjoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10KCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFdvcmQsc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CgogICAgICAgICAgICBkZWYgY2hhcnNBc1N0cihzKToKICAgICAgICAgICAgICAgIGlmIGxlbihzKT40OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzWzo0XSsiLi4uIgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcwoKICAgICAgICAgICAgaWYgKCBzZWxmLmluaXRDaGFyc09yaWcgIT0gc2VsZi5ib2R5Q2hhcnNPcmlnICk6CiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMsJXMpIiAlICggY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpLCBjaGFyc0FzU3RyKHNlbGYuYm9keUNoYXJzT3JpZykgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlc6KCVzKSIgJSBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZykKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKCmNsYXNzIFJlZ2V4KFRva2VuKToKICAgICIiIgogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBtYXRjaCBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcmVndWxhciBleHByZXNzaW9uIGluIGEgZm9ybSByZWNvZ25pemVkIGJ5IHRoZSBpbmJ1aWx0IFB5dGhvbiByZSBtb2R1bGUuCiAgICBJZiB0aGUgZ2l2ZW4gcmVnZXggY29udGFpbnMgbmFtZWQgZ3JvdXBzIChkZWZpbmVkIHVzaW5nIEN7KD9QPG5hbWU+Li4uKX0pLCB0aGVzZSB3aWxsIGJlIHByZXNlcnZlZCBhcyAKICAgIG5hbWVkIHBhcnNlIHJlc3VsdHMuCgogICAgRXhhbXBsZTo6CiAgICAgICAgcmVhbG51bSA9IFJlZ2V4KHIiWystXT9cZCtcLlxkKiIpCiAgICAgICAgZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkPyktKD9QPGRheT5cZFxkPyknKQogICAgICAgICMgcmVmOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2NzM5OS9ob3ctZG8teW91LW1hdGNoLW9ubHktdmFsaWQtcm9tYW4tbnVtZXJhbHMtd2l0aC1hLXJlZ3VsYXItZXhwcmVzc2lvbgogICAgICAgIHJvbWFuID0gUmVnZXgociJNezAsNH0oQ018Q0R8RD9DezAsM30pKFhDfFhMfEw/WHswLDN9KShJWHxJVnxWP0l7MCwzfSkiKQogICAgIiIiCiAgICBjb21waWxlZFJFdHlwZSA9IHR5cGUocmUuY29tcGlsZSgiW0EtWl0iKSkKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGF0dGVybiwgZmxhZ3M9MCk6CiAgICAgICAgIiIiVGhlIHBhcmFtZXRlcnMgQ3twYXR0ZXJufSBhbmQgQ3tmbGFnc30gYXJlIHBhc3NlZCB0byB0aGUgQ3tyZS5jb21waWxlKCl9IGZ1bmN0aW9uIGFzLWlzLiBTZWUgdGhlIFB5dGhvbiBDe3JlfSBtb2R1bGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBhY2NlcHRhYmxlIHBhdHRlcm5zIGFuZCBmbGFncy4iIiIKICAgICAgICBzdXBlcihSZWdleCxzZWxmKS5fX2luaXRfXygpCgogICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGlmIG5vdCBwYXR0ZXJuOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIFJlZ2V4OyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQoKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gcGF0dGVybgogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykKICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4KICAgICAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBlbGlmIGlzaW5zdGFuY2UocGF0dGVybiwgUmVnZXguY29tcGlsZWRSRXR5cGUpOgogICAgICAgICAgICBzZWxmLnJlID0gcGF0dGVybgogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBcCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzdHIocGF0dGVybikKICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCiAgICAgICAgICAgIAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlJlZ2V4IG1heSBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBzdHJpbmcgb3IgYSBjb21waWxlZCBSRSBvYmplY3QiKQoKICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykKICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpCiAgICAgICAgZCA9IHJlc3VsdC5ncm91cGRpY3QoKQogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyhyZXN1bHQuZ3JvdXAoKSkKICAgICAgICBpZiBkOgogICAgICAgICAgICBmb3IgayBpbiBkOgogICAgICAgICAgICAgICAgcmV0W2tdID0gZFtrXQogICAgICAgIHJldHVybiBsb2MscmV0CgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihSZWdleCxzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiUmU6KCVzKSIgJSByZXByKHNlbGYucGF0dGVybikKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKCmNsYXNzIFF1b3RlZFN0cmluZyhUb2tlbik6CiAgICByIiIiCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IGFyZSBkZWxpbWl0ZWQgYnkgcXVvdGluZyBjaGFyYWN0ZXJzLgogICAgCiAgICBEZWZpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogICAgICAgIC0gcXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIHF1b3RlIGRlbGltaXRpbmcgc3RyaW5nCiAgICAgICAgLSBlc2NDaGFyIC0gY2hhcmFjdGVyIHRvIGVzY2FwZSBxdW90ZXMsIHR5cGljYWxseSBiYWNrc2xhc2ggKGRlZmF1bHQ9Q3tOb25lfSkKICAgICAgICAtIGVzY1F1b3RlIC0gc3BlY2lhbCBxdW90ZSBzZXF1ZW5jZSB0byBlc2NhcGUgYW4gZW1iZWRkZWQgcXVvdGUgc3RyaW5nIChzdWNoIGFzIFNRTCdzICIiIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCAiKSAoZGVmYXVsdD1De05vbmV9KQogICAgICAgIC0gbXVsdGlsaW5lIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcXVvdGVzIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzIChkZWZhdWx0PUN7RmFsc2V9KQogICAgICAgIC0gdW5xdW90ZVJlc3VsdHMgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWF0Y2hlZCB0ZXh0IHNob3VsZCBiZSB1bnF1b3RlZCAoZGVmYXVsdD1De1RydWV9KQogICAgICAgIC0gZW5kUXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIGVuZCBvZiB0aGUgcXVvdGUgZGVsaW1pdGVkIHN0cmluZyAoZGVmYXVsdD1De05vbmV9ID0+IHNhbWUgYXMgcXVvdGVDaGFyKQogICAgICAgIC0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzIC0gY29udmVydCBlc2NhcGVkIHdoaXRlc3BhY2UgKEN7J1x0J30sIEN7J1xuJ30sIGV0Yy4pIHRvIGFjdHVhbCB3aGl0ZXNwYWNlIChkZWZhdWx0PUN7VHJ1ZX0pCgogICAgRXhhbXBsZTo6CiAgICAgICAgcXMgPSBRdW90ZWRTdHJpbmcoJyInKQogICAgICAgIHByaW50KHFzLnNlYXJjaFN0cmluZygnbHNqZGYgIlRoaXMgaXMgdGhlIHF1b3RlIiBzbGRqZicpKQogICAgICAgIGNvbXBsZXhfcXMgPSBRdW90ZWRTdHJpbmcoJ3t7JywgZW5kUXVvdGVDaGFyPSd9fScpCiAgICAgICAgcHJpbnQoY29tcGxleF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmIHt7VGhpcyBpcyB0aGUgInF1b3RlIn19IHNsZGpmJykpCiAgICAgICAgc3FsX3FzID0gUXVvdGVkU3RyaW5nKCciJywgZXNjUXVvdGU9JyIiJykKICAgICAgICBwcmludChzcWxfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiImVtYmVkZGVkIiIgcXVvdGVzIiBzbGRqZicpKQogICAgcHJpbnRzOjoKICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSddXQogICAgICAgIFtbJ1RoaXMgaXMgdGhlICJxdW90ZSInXV0KICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICJlbWJlZGRlZCIgcXVvdGVzJ11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcXVvdGVDaGFyLCBlc2NDaGFyPU5vbmUsIGVzY1F1b3RlPU5vbmUsIG11bHRpbGluZT1GYWxzZSwgdW5xdW90ZVJlc3VsdHM9VHJ1ZSwgZW5kUXVvdGVDaGFyPU5vbmUsIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcz1UcnVlKToKICAgICAgICBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19pbml0X18oKQoKICAgICAgICAjIHJlbW92ZSB3aGl0ZSBzcGFjZSBmcm9tIHF1b3RlIGNoYXJzIC0gd29udCB3b3JrIGFueXdheQogICAgICAgIHF1b3RlQ2hhciA9IHF1b3RlQ2hhci5zdHJpcCgpCiAgICAgICAgaWYgbm90IHF1b3RlQ2hhcjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigicXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQoKICAgICAgICBpZiBlbmRRdW90ZUNoYXIgaXMgTm9uZToKICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gcXVvdGVDaGFyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IGVuZFF1b3RlQ2hhcjoKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImVuZFF1b3RlQ2hhciBjYW5ub3QgYmUgdGhlIGVtcHR5IHN0cmluZyIsU3ludGF4V2FybmluZyxzdGFja2xldmVsPTIpCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpCgogICAgICAgIHNlbGYucXVvdGVDaGFyID0gcXVvdGVDaGFyCiAgICAgICAgc2VsZi5xdW90ZUNoYXJMZW4gPSBsZW4ocXVvdGVDaGFyKQogICAgICAgIHNlbGYuZmlyc3RRdW90ZUNoYXIgPSBxdW90ZUNoYXJbMF0KICAgICAgICBzZWxmLmVuZFF1b3RlQ2hhciA9IGVuZFF1b3RlQ2hhcgogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyTGVuID0gbGVuKGVuZFF1b3RlQ2hhcikKICAgICAgICBzZWxmLmVzY0NoYXIgPSBlc2NDaGFyCiAgICAgICAgc2VsZi5lc2NRdW90ZSA9IGVzY1F1b3RlCiAgICAgICAgc2VsZi51bnF1b3RlUmVzdWx0cyA9IHVucXVvdGVSZXN1bHRzCiAgICAgICAgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgPSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMKCiAgICAgICAgaWYgbXVsdGlsaW5lOgogICAgICAgICAgICBzZWxmLmZsYWdzID0gcmUuTVVMVElMSU5FIHwgcmUuRE9UQUxMCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzJXNdJyAlIFwKICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwKICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5mbGFncyA9IDAKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXNcblxyJXNdJyAlIFwKICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwKICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApCiAgICAgICAgaWYgbGVuKHNlbGYuZW5kUXVvdGVDaGFyKSA+IDE6CiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAoCiAgICAgICAgICAgICAgICAnfCg/OicgKyAnKXwoPzonLmpvaW4oIiVzW14lc10iICUgKHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcls6aV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5lbmRRdW90ZUNoYXIpLTEsMCwtMSkpICsgJyknCiAgICAgICAgICAgICAgICApCiAgICAgICAgaWYgZXNjUXVvdGU6CiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMpJyAlIHJlLmVzY2FwZShlc2NRdW90ZSkpCiAgICAgICAgaWYgZXNjQ2hhcjoKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcy4pJyAlIHJlLmVzY2FwZShlc2NDaGFyKSkKICAgICAgICAgICAgc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4gPSByZS5lc2NhcGUoc2VsZi5lc2NDaGFyKSsiKC4pIgogICAgICAgIHNlbGYucGF0dGVybiArPSAocicpKiVzJyAlIHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcikpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuCiAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBzZWxmLnBhdHRlcm4sCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJhaXNlCgogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHJlc3VsdCA9IGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdFF1b3RlQ2hhciBhbmQgc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpIG9yIE5vbmUKICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpCiAgICAgICAgcmV0ID0gcmVzdWx0Lmdyb3VwKCkKCiAgICAgICAgaWYgc2VsZi51bnF1b3RlUmVzdWx0czoKCiAgICAgICAgICAgICMgc3RyaXAgb2ZmIHF1b3RlcwogICAgICAgICAgICByZXQgPSByZXRbc2VsZi5xdW90ZUNoYXJMZW46LXNlbGYuZW5kUXVvdGVDaGFyTGVuXQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXQsYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICBpZiAnXFwnIGluIHJldCBhbmQgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXM6CiAgICAgICAgICAgICAgICAgICAgd3NfbWFwID0gewogICAgICAgICAgICAgICAgICAgICAgICByJ1x0JyA6ICdcdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHInXG4nIDogJ1xuJywKICAgICAgICAgICAgICAgICAgICAgICAgcidcZicgOiAnXGYnLAogICAgICAgICAgICAgICAgICAgICAgICByJ1xyJyA6ICdccicsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciB3c2xpdCx3c2NoYXIgaW4gd3NfbWFwLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHdzbGl0LCB3c2NoYXIpCgogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NDaGFyOgogICAgICAgICAgICAgICAgICAgIHJldCA9IHJlLnN1YihzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiwiXGc8MT4iLHJldCkKCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBxdW90ZXMKICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjUXVvdGU6CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uoc2VsZi5lc2NRdW90ZSwgc2VsZi5lbmRRdW90ZUNoYXIpCgogICAgICAgIHJldHVybiBsb2MsIHJldAoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJxdW90ZWQgc3RyaW5nLCBzdGFydGluZyB3aXRoICVzIGVuZGluZyB3aXRoICVzIiAlIChzZWxmLnF1b3RlQ2hhciwgc2VsZi5lbmRRdW90ZUNoYXIpCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCgpjbGFzcyBDaGFyc05vdEluKFRva2VuKToKICAgICIiIgogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGNoYXJhY3RlcnMgSXtub3R9IGluIGEgZ2l2ZW4gc2V0ICh3aWxsCiAgICBpbmNsdWRlIHdoaXRlc3BhY2UgaW4gbWF0Y2hlZCBjaGFyYWN0ZXJzIGlmIG5vdCBsaXN0ZWQgaW4gdGhlIHByb3ZpZGVkIGV4Y2x1c2lvbiBzZXQgLSBzZWUgZXhhbXBsZSkuCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGRpc2FsbG93ZWQgY2hhcmFjdGVycywgYW5kIGFuIG9wdGlvbmFsCiAgICBtaW5pbXVtLCBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgZGVmaW5lIGEgY29tbWEtc2VwYXJhdGVkLXZhbHVlIGFzIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgJywnCiAgICAgICAgY3N2X3ZhbHVlID0gQ2hhcnNOb3RJbignLCcpCiAgICAgICAgcHJpbnQoZGVsaW1pdGVkTGlzdChjc3ZfdmFsdWUpLnBhcnNlU3RyaW5nKCJka2xzLGxzZGtqZixzMTIgMzQsQCEjLDIxMyIpKQogICAgcHJpbnRzOjoKICAgICAgICBbJ2RrbHMnLCAnbHNka2pmJywgJ3MxMiAzNCcsICdAISMnLCAnMjEzJ10KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBub3RDaGFycywgbWluPTEsIG1heD0wLCBleGFjdD0wICk6CiAgICAgICAgc3VwZXIoQ2hhcnNOb3RJbixzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlCiAgICAgICAgc2VsZi5ub3RDaGFycyA9IG5vdENoYXJzCgogICAgICAgIGlmIG1pbiA8IDE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoQ2hhcnNOb3RJbigpKSBpZiB6ZXJvLWxlbmd0aCBjaGFyIGdyb3VwIGlzIHBlcm1pdHRlZCIpCgogICAgICAgIHNlbGYubWluTGVuID0gbWluCgogICAgICAgIGlmIG1heCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVAoKICAgICAgICBpZiBleGFjdCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QKICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdAoKICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gKCBzZWxmLm1pbkxlbiA9PSAwICkKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm5vdENoYXJzOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgc3RhcnQgPSBsb2MKICAgICAgICBsb2MgKz0gMQogICAgICAgIG5vdGNoYXJzID0gc2VsZi5ub3RDaGFycwogICAgICAgIG1heGxlbiA9IG1pbiggc3RhcnQrc2VsZi5tYXhMZW4sIGxlbihpbnN0cmluZykgKQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxlbiBhbmQgXAogICAgICAgICAgICAgIChpbnN0cmluZ1tsb2NdIG5vdCBpbiBub3RjaGFycyk6CiAgICAgICAgICAgIGxvYyArPSAxCgogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihDaGFyc05vdEluLCBzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBpZiBsZW4oc2VsZi5ub3RDaGFycykgPiA0OgogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcy4uLikiICUgc2VsZi5ub3RDaGFyc1s6NF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIhVzooJXMpIiAlIHNlbGYubm90Q2hhcnMKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKY2xhc3MgV2hpdGUoVG9rZW4pOgogICAgIiIiCiAgICBTcGVjaWFsIG1hdGNoaW5nIGNsYXNzIGZvciBtYXRjaGluZyB3aGl0ZXNwYWNlLiAgTm9ybWFsbHksIHdoaXRlc3BhY2UgaXMgaWdub3JlZAogICAgYnkgcHlwYXJzaW5nIGdyYW1tYXJzLiAgVGhpcyBjbGFzcyBpcyBpbmNsdWRlZCB3aGVuIHNvbWUgd2hpdGVzcGFjZSBzdHJ1Y3R1cmVzCiAgICBhcmUgc2lnbmlmaWNhbnQuICBEZWZpbmUgd2l0aCBhIHN0cmluZyBjb250YWluaW5nIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gYmUKICAgIG1hdGNoZWQ7IGRlZmF1bHQgaXMgQ3siIFxcdFxcclxcbiJ9LiAgQWxzbyB0YWtlcyBvcHRpb25hbCBDe21pbn0sIEN7bWF4fSwgYW5kIEN7ZXhhY3R9IGFyZ3VtZW50cywKICAgIGFzIGRlZmluZWQgZm9yIHRoZSBDe0x7V29yZH19IGNsYXNzLgogICAgIiIiCiAgICB3aGl0ZVN0cnMgPSB7CiAgICAgICAgIiAiIDogIjxTUEM+IiwKICAgICAgICAiXHQiOiAiPFRBQj4iLAogICAgICAgICJcbiI6ICI8TEY+IiwKICAgICAgICAiXHIiOiAiPENSPiIsCiAgICAgICAgIlxmIjogIjxGRj4iLAogICAgICAgIH0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cz0iIFx0XHJcbiIsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCk6CiAgICAgICAgc3VwZXIoV2hpdGUsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYubWF0Y2hXaGl0ZSA9IHdzCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoICIiLmpvaW4oYyBmb3IgYyBpbiBzZWxmLndoaXRlQ2hhcnMgaWYgYyBub3QgaW4gc2VsZi5tYXRjaFdoaXRlKSApCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQogICAgICAgIHNlbGYubmFtZSA9ICgiIi5qb2luKFdoaXRlLndoaXRlU3Ryc1tjXSBmb3IgYyBpbiBzZWxmLm1hdGNoV2hpdGUpKQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQoKICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbgoKICAgICAgICBpZiBtYXggPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQKCiAgICAgICAgaWYgZXhhY3QgPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0CiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5tYXRjaFdoaXRlKToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgc3RhcnQgPSBsb2MKICAgICAgICBsb2MgKz0gMQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgbGVuKGluc3RyaW5nKSApCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIHNlbGYubWF0Y2hXaGl0ZToKICAgICAgICAgICAgbG9jICs9IDEKCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10KCgpjbGFzcyBfUG9zaXRpb25Ub2tlbihUb2tlbik6CiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihfUG9zaXRpb25Ub2tlbixzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5uYW1lPXNlbGYuX19jbGFzc19fLl9fbmFtZV9fCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQoKY2xhc3MgR29Ub0NvbHVtbihfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIFRva2VuIHRvIGFkdmFuY2UgdG8gYSBzcGVjaWZpYyBjb2x1bW4gb2YgaW5wdXQgdGV4dDsgdXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBjb2xubyApOgogICAgICAgIHN1cGVyKEdvVG9Db2x1bW4sc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29sID0gY29sbm8KCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToKICAgICAgICBpZiBjb2wobG9jLGluc3RyaW5nKSAhPSBzZWxmLmNvbDoKICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdLmlzc3BhY2UoKSBhbmQgY29sKCBsb2MsIGluc3RyaW5nICkgIT0gc2VsZi5jb2wgOgogICAgICAgICAgICAgICAgbG9jICs9IDEKICAgICAgICByZXR1cm4gbG9jCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICB0aGlzY29sID0gY29sKCBsb2MsIGluc3RyaW5nICkKICAgICAgICBpZiB0aGlzY29sID4gc2VsZi5jb2w6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCAiVGV4dCBub3QgaW4gZXhwZWN0ZWQgY29sdW1uIiwgc2VsZiApCiAgICAgICAgbmV3bG9jID0gbG9jICsgc2VsZi5jb2wgLSB0aGlzY29sCiAgICAgICAgcmV0ID0gaW5zdHJpbmdbIGxvYzogbmV3bG9jIF0KICAgICAgICByZXR1cm4gbmV3bG9jLCByZXQKCgpjbGFzcyBMaW5lU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcKICAgIAogICAgRXhhbXBsZTo6CiAgICAKICAgICAgICB0ZXN0ID0gJycnXAogICAgICAgIEFBQSB0aGlzIGxpbmUKICAgICAgICBBQUEgYW5kIHRoaXMgbGluZQogICAgICAgICAgQUFBIGJ1dCBub3QgdGhpcyBvbmUKICAgICAgICBCIEFBQSBhbmQgZGVmaW5pdGVseSBub3QgdGhpcyBvbmUKICAgICAgICAnJycKCiAgICAgICAgZm9yIHQgaW4gKExpbmVTdGFydCgpICsgJ0FBQScgKyByZXN0T2ZMaW5lKS5zZWFyY2hTdHJpbmcodGVzdCk6CiAgICAgICAgICAgIHByaW50KHQpCiAgICAKICAgIFByaW50czo6CiAgICAgICAgWydBQUEnLCAnIHRoaXMgbGluZSddCiAgICAgICAgWydBQUEnLCAnIGFuZCB0aGlzIGxpbmUnXSAgICAKCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKExpbmVTdGFydCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgbGluZSIKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGNvbChsb2MsIGluc3RyaW5nKSA9PSAxOgogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKY2xhc3MgTGluZUVuZChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZwogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihMaW5lRW5kLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLnJlcGxhY2UoIlxuIiwiIikgKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiBsaW5lIgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbG9jPGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgIGlmIGluc3RyaW5nW2xvY10gPT0gIlxuIjoKICAgICAgICAgICAgICAgIHJldHVybiBsb2MrMSwgIlxuIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKY2xhc3MgU3RyaW5nU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyc2Ugc3RyaW5nCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKFN0cmluZ1N0YXJ0LHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiB0ZXh0IgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbG9jICE9IDA6CiAgICAgICAgICAgICMgc2VlIGlmIGVudGlyZSBzdHJpbmcgdXAgdG8gaGVyZSBpcyBqdXN0IHdoaXRlc3BhY2UgYW5kIGlnbm9yZWFibGVzCiAgICAgICAgICAgIGlmIGxvYyAhPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgMCApOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgcmV0dXJuIGxvYywgW10KCmNsYXNzIFN0cmluZ0VuZChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzZSBzdHJpbmcKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoU3RyaW5nRW5kLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgdGV4dCIKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGxvYyA8IGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10KICAgICAgICBlbGlmIGxvYyA+IGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgpjbGFzcyBXb3JkU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBXb3JkLCBhbmQKICAgIGlzIG5vdCBwcmVjZWRlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCiAgICB1c2UgQ3tXb3JkU3RhcnQoYWxwaGFudW1zKX0uIEN7V29yZFN0YXJ0fSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGJlZ2lubmluZyBvZgogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6CiAgICAgICAgc3VwZXIoV29yZFN0YXJ0LHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBzdGFydCBvZiBhIHdvcmQiCgogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGxvYyAhPSAwOgogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jLTFdIGluIHNlbGYud29yZENoYXJzIG9yCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2NdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICByZXR1cm4gbG9jLCBbXQoKY2xhc3MgV29yZEVuZChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIFdvcmQsIGFuZAogICAgaXMgbm90IGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9CiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywKICAgIHVzZSBDe1dvcmRFbmQoYWxwaGFudW1zKX0uIEN7V29yZEVuZH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBlbmQgb2YKICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgZW5kIG9mIGEgbGluZS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOgogICAgICAgIHN1cGVyKFdvcmRFbmQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIGVuZCBvZiBhIHdvcmQiCgogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQogICAgICAgIGlmIGluc3RybGVuPjAgYW5kIGxvYzxpbnN0cmxlbjoKICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gaW4gc2VsZi53b3JkQ2hhcnMgb3IKICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgcmV0dXJuIGxvYywgW10KCgpjbGFzcyBQYXJzZUV4cHJlc3Npb24oUGFyc2VyRWxlbWVudCk6CiAgICAiIiIKICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIFBhcnNlckVsZW1lbnQsIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6CiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBfZ2VuZXJhdG9yVHlwZSApOgogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpCgogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggZXhwcnMgKSBdCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKCBleHBycywgY29sbGVjdGlvbnMuSXRlcmFibGUgKToKICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQogICAgICAgICAgICAjIGlmIHNlcXVlbmNlIG9mIHN0cmluZ3MgcHJvdmlkZWQsIHdyYXAgd2l0aCBMaXRlcmFsCiAgICAgICAgICAgIGlmIGFsbChpc2luc3RhbmNlKGV4cHIsIGJhc2VzdHJpbmcpIGZvciBleHByIGluIGV4cHJzKToKICAgICAgICAgICAgICAgIGV4cHJzID0gbWFwKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgZXhwcnMpCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KGV4cHJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KCBleHBycyApCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBleHBycyBdCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBGYWxzZQoKICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOgogICAgICAgIHJldHVybiBzZWxmLmV4cHJzW2ldCgogICAgZGVmIGFwcGVuZCggc2VsZiwgb3RoZXIgKToKICAgICAgICBzZWxmLmV4cHJzLmFwcGVuZCggb3RoZXIgKQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToKICAgICAgICAiIiJFeHRlbmRzIEN7bGVhdmVXaGl0ZXNwYWNlfSBkZWZpbmVkIGluIGJhc2UgY2xhc3MsIGFuZCBhbHNvIGludm9rZXMgQ3tsZWF2ZVdoaXRlc3BhY2V9IG9uCiAgICAgICAgICAgYWxsIGNvbnRhaW5lZCBleHByZXNzaW9ucy4iIiIKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICBzZWxmLmV4cHJzID0gWyBlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzIF0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLmxlYXZlV2hpdGVzcGFjZSgpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOgogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQogICAgICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcnMpICkKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToKICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc3RyZWFtbGluZSgpCgogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpCgogICAgICAgICMgY29sbGFwc2UgbmVzdGVkIEFuZCdzIG9mIHRoZSBmb3JtIEFuZCggQW5kKCBBbmQoIGEsYiksIGMpLCBkKSB0byBBbmQoIGEsYixjLGQgKQogICAgICAgICMgYnV0IG9ubHkgaWYgdGhlcmUgYXJlIG5vIHBhcnNlIGFjdGlvbnMgb3IgcmVzdWx0c05hbWVzIG9uIHRoZSBuZXN0ZWQgQW5kJ3MKICAgICAgICAjIChsaWtld2lzZSBmb3IgT3IncyBhbmQgTWF0Y2hGaXJzdCdzKQogICAgICAgIGlmICggbGVuKHNlbGYuZXhwcnMpID09IDIgKToKICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWzBdCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOgogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IG90aGVyLmV4cHJzWzpdICsgWyBzZWxmLmV4cHJzWzFdIF0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgfD0gb3RoZXIubWF5UmV0dXJuRW1wdHkKICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcgoKICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWy0xXQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZAogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZAogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZAogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToKICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBzZWxmLmV4cHJzWzotMV0gKyBvdGhlci5leHByc1s6XQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yCgogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBfdXN0cihzZWxmKQogICAgICAgIAogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOgogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zZXRSZXN1bHRzTmFtZShuYW1lLGxpc3RBbGxNYXRjaGVzKQogICAgICAgIHJldHVybiByZXQKCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToKICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUudmFsaWRhdGUodG1wKQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkKICAgICAgICAKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5jb3B5KCkKICAgICAgICByZXQuZXhwcnMgPSBbZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHByc10KICAgICAgICByZXR1cm4gcmV0CgpjbGFzcyBBbmQoUGFyc2VFeHByZXNzaW9uKToKICAgICIiIgogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQgaW4gdGhlIGdpdmVuIG9yZGVyLgogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycrJ30gb3BlcmF0b3IuCiAgICBNYXkgYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snLSd9IG9wZXJhdG9yLCB3aGljaCB3aWxsIHN1cHByZXNzIGJhY2t0cmFja2luZy4KCiAgICBFeGFtcGxlOjoKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgIG5hbWVfZXhwciA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpCgogICAgICAgIGV4cHIgPSBBbmQoW2ludGVnZXIoImlkIiksbmFtZV9leHByKCJuYW1lIiksaW50ZWdlcigiYWdlIildKQogICAgICAgICMgbW9yZSBlYXNpbHkgd3JpdHRlbiBhczoKICAgICAgICBleHByID0gaW50ZWdlcigiaWQiKSArIG5hbWVfZXhwcigibmFtZSIpICsgaW50ZWdlcigiYWdlIikKICAgICIiIgoKICAgIGNsYXNzIF9FcnJvclN0b3AoRW1wdHkpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBzdXBlcihBbmQuX0Vycm9yU3RvcCxzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIHNlbGYubmFtZSA9ICctJwogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpCgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6CiAgICAgICAgc3VwZXIoQW5kLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykKICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByc1swXS53aGl0ZUNoYXJzICkKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByc1swXS5za2lwV2hpdGVzcGFjZQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgIyBwYXNzIEZhbHNlIGFzIGxhc3QgYXJnIHRvIF9wYXJzZSBmb3IgZmlyc3QgZWxlbWVudCwgc2luY2Ugd2UgYWxyZWFkeQogICAgICAgICMgcHJlLXBhcnNlZCB0aGUgc3RyaW5nIGFzIHBhcnQgb2Ygb3VyIEFuZCBwcmUtcGFyc2luZwogICAgICAgIGxvYywgcmVzdWx0bGlzdCA9IHNlbGYuZXhwcnNbMF0uX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgZXJyb3JTdG9wID0gRmFsc2UKICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzWzE6XToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCBBbmQuX0Vycm9yU3RvcCk6CiAgICAgICAgICAgICAgICBlcnJvclN0b3AgPSBUcnVlCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBlcnJvclN0b3A6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VTeW50YXhFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6CiAgICAgICAgICAgICAgICAgICAgcGUuX190cmFjZWJhY2tfXyA9IE5vbmUKICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbi5fZnJvbV9leGNlcHRpb24ocGUpCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbihpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgaWYgZXhwcnRva2VucyBvciBleHBydG9rZW5zLmhhc2tleXMoKToKICAgICAgICAgICAgICAgIHJlc3VsdGxpc3QgKz0gZXhwcnRva2VucwogICAgICAgIHJldHVybiBsb2MsIHJlc3VsdGxpc3QKCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjQW5kKCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApCiAgICAgICAgICAgIGlmIG5vdCBlLm1heVJldHVybkVtcHR5OgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgoKY2xhc3MgT3IoUGFyc2VFeHByZXNzaW9uKToKICAgICIiIgogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLgogICAgSWYgdHdvIGV4cHJlc3Npb25zIG1hdGNoLCB0aGUgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgdGhlIGxvbmdlc3Qgc3RyaW5nIHdpbGwgYmUgdXNlZC4KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snXid9IG9wZXJhdG9yLgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgY29uc3RydWN0IE9yIHVzaW5nICdeJyBvcGVyYXRvcgogICAgICAgIAogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgXiBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpCiAgICBwcmludHM6OgogICAgICAgIFtbJzEyMyddLCBbJzMuMTQxNiddLCBbJzc4OSddXQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6CiAgICAgICAgc3VwZXIoT3Isc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQogICAgICAgIGlmIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBtYXhFeGNMb2MgPSAtMQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUKICAgICAgICBtYXRjaGVzID0gW10KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBsb2MyID0gZS50cnlQYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUKICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6CiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYwogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6CiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc2F2ZSBtYXRjaCBhbW9uZyBhbGwgbWF0Y2hlcywgdG8gcmV0cnkgbG9uZ2VzdCB0byBzaG9ydGVzdAogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoKGxvYzIsIGUpKQoKICAgICAgICBpZiBtYXRjaGVzOgogICAgICAgICAgICBtYXRjaGVzLnNvcnQoa2V5PWxhbWJkYSB4OiAteFswXSkKICAgICAgICAgICAgZm9yIF8sZSBpbiBtYXRjaGVzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lCiAgICAgICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoKICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyCiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MKCiAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cKICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikKCgogICAgZGVmIF9faXhvcl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI09yKCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgXiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApCgoKY2xhc3MgTWF0Y2hGaXJzdChQYXJzZUV4cHJlc3Npb24pOgogICAgIiIiCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBmaXJzdCBvbmUgbGlzdGVkIGlzIHRoZSBvbmUgdGhhdCB3aWxsIG1hdGNoLgogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyd8J30gb3BlcmF0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBjb25zdHJ1Y3QgTWF0Y2hGaXJzdCB1c2luZyAnfCcgb3BlcmF0b3IKICAgICAgICAKICAgICAgICAjIHdhdGNoIHRoZSBvcmRlciBvZiBleHByZXNzaW9ucyB0byBtYXRjaAogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgfCBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEZhaWwhIC0+IFtbJzEyMyddLCBbJzMnXSwgWycxNDE2J10sIFsnNzg5J11dCgogICAgICAgICMgcHV0IG1vcmUgc2VsZWN0aXZlIGV4cHJlc3Npb24gZmlyc3QKICAgICAgICBudW1iZXIgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKSB8IFdvcmQobnVtcykKICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBCZXR0ZXIgLT4gW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToKICAgICAgICBzdXBlcihNYXRjaEZpcnN0LHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkKICAgICAgICBpZiBzZWxmLmV4cHJzOgogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgbWF4RXhjTG9jID0gLTEKICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0CiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOgogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycgogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MKICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOgogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikKICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpCgogICAgICAgICMgb25seSBnb3QgaGVyZSBpZiBubyBleHByZXNzaW9uIG1hdGNoZWQsIHJhaXNlIGV4Y2VwdGlvbiBmb3IgbWF0Y2ggdGhhdCBtYWRlIGl0IHRoZSBmdXJ0aGVzdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZwogICAgICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQoKICAgIGRlZiBfX2lvcl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI01hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiB8ICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkKCgpjbGFzcyBFYWNoKFBhcnNlRXhwcmVzc2lvbik6CiAgICAiIiIKICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kLCBidXQgaW4gYW55IG9yZGVyLgogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycmJ30gb3BlcmF0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgY29sb3IgPSBvbmVPZigiUkVEIE9SQU5HRSBZRUxMT1cgR1JFRU4gQkxVRSBQVVJQTEUgQkxBQ0sgV0hJVEUgQlJPV04iKQogICAgICAgIHNoYXBlX3R5cGUgPSBvbmVPZigiU1FVQVJFIENJUkNMRSBUUklBTkdMRSBTVEFSIEhFWEFHT04gT0NUQUdPTiIpCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICBzaGFwZV9hdHRyID0gInNoYXBlOiIgKyBzaGFwZV90eXBlKCJzaGFwZSIpCiAgICAgICAgcG9zbl9hdHRyID0gInBvc246IiArIEdyb3VwKGludGVnZXIoIngiKSArICcsJyArIGludGVnZXIoInkiKSkoInBvc24iKQogICAgICAgIGNvbG9yX2F0dHIgPSAiY29sb3I6IiArIGNvbG9yKCJjb2xvciIpCiAgICAgICAgc2l6ZV9hdHRyID0gInNpemU6IiArIGludGVnZXIoInNpemUiKQoKICAgICAgICAjIHVzZSBFYWNoICh1c2luZyBvcGVyYXRvciAnJicpIHRvIGFjY2VwdCBhdHRyaWJ1dGVzIGluIGFueSBvcmRlciAKICAgICAgICAjIChzaGFwZSBhbmQgcG9zbiBhcmUgcmVxdWlyZWQsIGNvbG9yIGFuZCBzaXplIGFyZSBvcHRpb25hbCkKICAgICAgICBzaGFwZV9zcGVjID0gc2hhcGVfYXR0ciAmIHBvc25fYXR0ciAmIE9wdGlvbmFsKGNvbG9yX2F0dHIpICYgT3B0aW9uYWwoc2l6ZV9hdHRyKQoKICAgICAgICBzaGFwZV9zcGVjLnJ1blRlc3RzKCcnJwogICAgICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMAogICAgICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwCiAgICAgICAgICAgIGNvbG9yOkdSRUVOIHNpemU6MjAgc2hhcGU6VFJJQU5HTEUgcG9zbjoyMCw0MAogICAgICAgICAgICAnJycKICAgICAgICAgICAgKQogICAgcHJpbnRzOjoKICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMAogICAgICAgIFsnc2hhcGU6JywgJ1NRVUFSRScsICdjb2xvcjonLCAnQkxBQ0snLCAncG9zbjonLCBbJzEwMCcsICcsJywgJzEyMCddXQogICAgICAgIC0gY29sb3I6IEJMQUNLCiAgICAgICAgLSBwb3NuOiBbJzEwMCcsICcsJywgJzEyMCddCiAgICAgICAgICAtIHg6IDEwMAogICAgICAgICAgLSB5OiAxMjAKICAgICAgICAtIHNoYXBlOiBTUVVBUkUKCgogICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODAKICAgICAgICBbJ3NoYXBlOicsICdDSVJDTEUnLCAnc2l6ZTonLCAnNTAnLCAnY29sb3I6JywgJ0JMVUUnLCAncG9zbjonLCBbJzUwJywgJywnLCAnODAnXV0KICAgICAgICAtIGNvbG9yOiBCTFVFCiAgICAgICAgLSBwb3NuOiBbJzUwJywgJywnLCAnODAnXQogICAgICAgICAgLSB4OiA1MAogICAgICAgICAgLSB5OiA4MAogICAgICAgIC0gc2hhcGU6IENJUkNMRQogICAgICAgIC0gc2l6ZTogNTAKCgogICAgICAgIGNvbG9yOiBHUkVFTiBzaXplOiAyMCBzaGFwZTogVFJJQU5HTEUgcG9zbjogMjAsNDAKICAgICAgICBbJ2NvbG9yOicsICdHUkVFTicsICdzaXplOicsICcyMCcsICdzaGFwZTonLCAnVFJJQU5HTEUnLCAncG9zbjonLCBbJzIwJywgJywnLCAnNDAnXV0KICAgICAgICAtIGNvbG9yOiBHUkVFTgogICAgICAgIC0gcG9zbjogWycyMCcsICcsJywgJzQwJ10KICAgICAgICAgIC0geDogMjAKICAgICAgICAgIC0geTogNDAKICAgICAgICAtIHNoYXBlOiBUUklBTkdMRQogICAgICAgIC0gc2l6ZTogMjAKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6CiAgICAgICAgc3VwZXIoRWFjaCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUKICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5pbml0RXhwckdyb3VwczoKICAgICAgICAgICAgc2VsZi5vcHQxbWFwID0gZGljdCgoaWQoZS5leHByKSxlKSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkpCiAgICAgICAgICAgIG9wdDEgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgXQogICAgICAgICAgICBvcHQyID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgZS5tYXlSZXR1cm5FbXB0eSBhbmQgbm90IGlzaW5zdGFuY2UoZSxPcHRpb25hbCldCiAgICAgICAgICAgIHNlbGYub3B0aW9uYWxzID0gb3B0MSArIG9wdDIKICAgICAgICAgICAgc2VsZi5tdWx0aW9wdGlvbmFscyA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLFplcm9Pck1vcmUpIF0KICAgICAgICAgICAgc2VsZi5tdWx0aXJlcXVpcmVkID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT25lT3JNb3JlKSBdCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBub3QgaXNpbnN0YW5jZShlLChPcHRpb25hbCxaZXJvT3JNb3JlLE9uZU9yTW9yZSkpIF0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCArPSBzZWxmLm11bHRpcmVxdWlyZWQKICAgICAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IEZhbHNlCiAgICAgICAgdG1wTG9jID0gbG9jCiAgICAgICAgdG1wUmVxZCA9IHNlbGYucmVxdWlyZWRbOl0KICAgICAgICB0bXBPcHQgID0gc2VsZi5vcHRpb25hbHNbOl0KICAgICAgICBtYXRjaE9yZGVyID0gW10KCiAgICAgICAga2VlcE1hdGNoaW5nID0gVHJ1ZQogICAgICAgIHdoaWxlIGtlZXBNYXRjaGluZzoKICAgICAgICAgICAgdG1wRXhwcnMgPSB0bXBSZXFkICsgdG1wT3B0ICsgc2VsZi5tdWx0aW9wdGlvbmFscyArIHNlbGYubXVsdGlyZXF1aXJlZAogICAgICAgICAgICBmYWlsZWQgPSBbXQogICAgICAgICAgICBmb3IgZSBpbiB0bXBFeHByczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB0bXBMb2MgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgdG1wTG9jICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBmYWlsZWQuYXBwZW5kKGUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1hdGNoT3JkZXIuYXBwZW5kKHNlbGYub3B0MW1hcC5nZXQoaWQoZSksZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgZSBpbiB0bXBSZXFkOgogICAgICAgICAgICAgICAgICAgICAgICB0bXBSZXFkLnJlbW92ZShlKQogICAgICAgICAgICAgICAgICAgIGVsaWYgZSBpbiB0bXBPcHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRtcE9wdC5yZW1vdmUoZSkKICAgICAgICAgICAgaWYgbGVuKGZhaWxlZCkgPT0gbGVuKHRtcEV4cHJzKToKICAgICAgICAgICAgICAgIGtlZXBNYXRjaGluZyA9IEZhbHNlCgogICAgICAgIGlmIHRtcFJlcWQ6CiAgICAgICAgICAgIG1pc3NpbmcgPSAiLCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gdG1wUmVxZCkKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbG9jLCJNaXNzaW5nIG9uZSBvciBtb3JlIHJlcXVpcmVkIGVsZW1lbnRzICglcykiICUgbWlzc2luZyApCgogICAgICAgICMgYWRkIGFueSB1bm1hdGNoZWQgT3B0aW9uYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBkZWZhdWx0IHZhbHVlcyBkZWZpbmVkCiAgICAgICAgbWF0Y2hPcmRlciArPSBbZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgYW5kIGUuZXhwciBpbiB0bXBPcHRdCgogICAgICAgIHJlc3VsdGxpc3QgPSBbXQogICAgICAgIGZvciBlIGluIG1hdGNoT3JkZXI6CiAgICAgICAgICAgIGxvYyxyZXN1bHRzID0gZS5fcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucykKICAgICAgICAgICAgcmVzdWx0bGlzdC5hcHBlbmQocmVzdWx0cykKCiAgICAgICAgZmluYWxSZXN1bHRzID0gc3VtKHJlc3VsdGxpc3QsIFBhcnNlUmVzdWx0cyhbXSkpCiAgICAgICAgcmV0dXJuIGxvYywgZmluYWxSZXN1bHRzCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiAmICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkKCgpjbGFzcyBQYXJzZUVsZW1lbnRFbmhhbmNlKFBhcnNlckVsZW1lbnQpOgogICAgIiIiCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBDe1BhcnNlckVsZW1lbnR9LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOgogICAgICAgIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19pbml0X18oc2F2ZWxpc3QpCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBpZiBpc3N1YmNsYXNzKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgVG9rZW4pOgogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhleHByKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhMaXRlcmFsKGV4cHIpKQogICAgICAgIHNlbGYuZXhwciA9IGV4cHIKICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgaWYgZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gZXhwci5tYXlJbmRleEVycm9yCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBleHByLm1heVJldHVybkVtcHR5CiAgICAgICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBleHByLndoaXRlQ2hhcnMgKQogICAgICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gZXhwci5za2lwV2hpdGVzcGFjZQogICAgICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBleHByLnNhdmVBc0xpc3QKICAgICAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBleHByLmNhbGxQcmVwYXJzZQogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChleHByLmlnbm9yZUV4cHJzKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLGxvYyxzZWxmLmVycm1zZyxzZWxmKQoKICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICBzZWxmLmV4cHIgPSBzZWxmLmV4cHIuY29weSgpCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV4cHIubGVhdmVXaGl0ZXNwYWNlKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6CiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRWxlbWVudEVuaGFuY2UsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6CiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5zdHJlYW1saW5lKCkKICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIGlmIHNlbGYgaW4gcGFyc2VFbGVtZW50TGlzdDoKICAgICAgICAgICAgcmFpc2UgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbiggcGFyc2VFbGVtZW50TGlzdCtbc2VsZl0gKQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5leHByLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQoKICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOgogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZSBhbmQgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHIpICkKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgoKY2xhc3MgRm9sbG93ZWRCeShQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgTG9va2FoZWFkIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tGb2xsb3dlZEJ5fQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gbWF0Y2hlcyBhdCB0aGUgY3VycmVudAogICAgcG9zaXRpb24uICBDe0ZvbGxvd2VkQnl9IGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0LgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgdXNlIEZvbGxvd2VkQnkgdG8gbWF0Y2ggYSBsYWJlbCBvbmx5IGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgJzonCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykKICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKICAgICAgICAKICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZygic2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogdXBwZXIgbGVmdCIpLnBwcmludCgpCiAgICBwcmludHM6OgogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ2NvbG9yJywgJ0JMQUNLJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOgogICAgICAgIHN1cGVyKEZvbGxvd2VkQnksc2VsZikuX19pbml0X18oZXhwcikKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgc2VsZi5leHByLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICByZXR1cm4gbG9jLCBbXQoKCmNsYXNzIE5vdEFueShQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgTG9va2FoZWFkIHRvIGRpc2FsbG93IG1hdGNoaW5nIHdpdGggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe05vdEFueX0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkKICAgIHZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXJzZSBleHByZXNzaW9uIGRvZXMgSXtub3R9IG1hdGNoIGF0IHRoZSBjdXJyZW50CiAgICBwb3NpdGlvbi4gIEFsc28sIEN7Tm90QW55fSBkb2VzIEl7bm90fSBza2lwIG92ZXIgbGVhZGluZyB3aGl0ZXNwYWNlLiBDe05vdEFueX0KICAgIGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0LiAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSAnficgb3BlcmF0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOgogICAgICAgIHN1cGVyKE5vdEFueSxzZWxmKS5fX2luaXRfXyhleHByKQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UgICMgZG8gTk9UIHVzZSBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpLCBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB0byBleHBycwogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRm91bmQgdW53YW50ZWQgdG9rZW4sICIrX3VzdHIoc2VsZi5leHByKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5leHByLmNhblBhcnNlTmV4dChpbnN0cmluZywgbG9jKToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgcmV0dXJuIGxvYywgW10KCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAifnsiICsgX3VzdHIoc2VsZi5leHByKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgpjbGFzcyBfTXVsdGlwbGVNYXRjaChQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOgogICAgICAgIHN1cGVyKF9NdWx0aXBsZU1hdGNoLCBzZWxmKS5fX2luaXRfXyhleHByKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUKICAgICAgICBlbmRlciA9IHN0b3BPbgogICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kZXIsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICBlbmRlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhlbmRlcikKICAgICAgICBzZWxmLm5vdF9lbmRlciA9IH5lbmRlciBpZiBlbmRlciBpcyBub3QgTm9uZSBlbHNlIE5vbmUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHNlbGZfZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UKICAgICAgICBzZWxmX3NraXBfaWdub3JhYmxlcyA9IHNlbGYuX3NraXBJZ25vcmFibGVzCiAgICAgICAgY2hlY2tfZW5kZXIgPSBzZWxmLm5vdF9lbmRlciBpcyBub3QgTm9uZQogICAgICAgIGlmIGNoZWNrX2VuZGVyOgogICAgICAgICAgICB0cnlfbm90X2VuZGVyID0gc2VsZi5ub3RfZW5kZXIudHJ5UGFyc2UKICAgICAgICAKICAgICAgICAjIG11c3QgYmUgYXQgbGVhc3Qgb25lIChidXQgZmlyc3Qgc2VlIGlmIHdlIGFyZSB0aGUgc3RvcE9uIHNlbnRpbmVsOwogICAgICAgICMgaWYgc28sIGZhaWwpCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6CiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykKICAgICAgICBsb2MsIHRva2VucyA9IHNlbGZfZXhwcl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQogICAgICAgIHRyeToKICAgICAgICAgICAgaGFzSWdub3JlRXhwcnMgPSAobm90IG5vdCBzZWxmLmlnbm9yZUV4cHJzKQogICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgaWYgY2hlY2tfZW5kZXI6CiAgICAgICAgICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQogICAgICAgICAgICAgICAgaWYgaGFzSWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZl9za2lwX2lnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MKICAgICAgICAgICAgICAgIGxvYywgdG1wdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgaWYgdG1wdG9rZW5zIG9yIHRtcHRva2Vucy5oYXNrZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgdG9rZW5zICs9IHRtcHRva2VucwogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zCiAgICAgICAgCmNsYXNzIE9uZU9yTW9yZShfTXVsdGlwbGVNYXRjaCk6CiAgICAiIiIKICAgIFJlcGV0aXRpb24gb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uCiAgICAKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggb25lIG9yIG1vcmUgdGltZXMKICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbAogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICAKCiAgICBFeGFtcGxlOjoKICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykKICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IEJMQUNLIgogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICAjIEZhaWwhIHJlYWQgJ2NvbG9yJyBhcyBkYXRhIGluc3RlYWQgb2YgbmV4dCBsYWJlbCAtPiBbWydzaGFwZScsICdTUVVBUkUgY29sb3InXV0KCiAgICAgICAgIyB1c2Ugc3RvcE9uIGF0dHJpYnV0ZSBmb3IgT25lT3JNb3JlIHRvIGF2b2lkIHJlYWRpbmcgbGFiZWwgc3RyaW5nIGFzIHBhcnQgb2YgdGhlIGRhdGEKICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAjIEJldHRlciAtPiBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdCTEFDSyddXQogICAgICAgIAogICAgICAgICMgY291bGQgYWxzbyBiZSB3cml0dGVuIGFzCiAgICAgICAgKGF0dHJfZXhwciAqICgxLCkpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpCiAgICAiIiIKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0uLi4iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCmNsYXNzIFplcm9Pck1vcmUoX011bHRpcGxlTWF0Y2gpOgogICAgIiIiCiAgICBPcHRpb25hbCByZXBldGl0aW9uIG9mIHplcm8gb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KICAgIAogICAgUGFyYW1ldGVyczoKICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMKICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbAogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICAKCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7T25lT3JNb3JlfQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToKICAgICAgICBzdXBlcihaZXJvT3JNb3JlLHNlbGYpLl9faW5pdF9fKGV4cHIsIHN0b3BPbj1zdG9wT24pCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICAKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoWmVyb09yTW9yZSwgc2VsZikucGFyc2VJbXBsKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucykKICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOgogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXS4uLiIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKY2xhc3MgX051bGxUb2tlbihvYmplY3QpOgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXwogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIiCgpfb3B0aW9uYWxOb3RNYXRjaGVkID0gX051bGxUb2tlbigpCmNsYXNzIE9wdGlvbmFsKFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBPcHRpb25hbCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcwogICAgIC0gZGVmYXVsdCAob3B0aW9uYWwpIC0gdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIG9wdGlvbmFsIGV4cHJlc3Npb24gaXMgbm90IGZvdW5kLgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgVVMgcG9zdGFsIGNvZGUgY2FuIGJlIGEgNS1kaWdpdCB6aXAsIHBsdXMgb3B0aW9uYWwgNC1kaWdpdCBxdWFsaWZpZXIKICAgICAgICB6aXAgPSBDb21iaW5lKFdvcmQobnVtcywgZXhhY3Q9NSkgKyBPcHRpb25hbCgnLScgKyBXb3JkKG51bXMsIGV4YWN0PTQpKSkKICAgICAgICB6aXAucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUKICAgICAgICAgICAgMTIzNDUKICAgICAgICAgICAgCiAgICAgICAgICAgICMgWklQKzQgZm9ybQogICAgICAgICAgICAxMjEwMS0wMDAxCiAgICAgICAgICAgIAogICAgICAgICAgICAjIGludmFsaWQgWklQCiAgICAgICAgICAgIDk4NzY1LQogICAgICAgICAgICAnJycpCiAgICBwcmludHM6OgogICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUKICAgICAgICAxMjM0NQogICAgICAgIFsnMTIzNDUnXQoKICAgICAgICAjIFpJUCs0IGZvcm0KICAgICAgICAxMjEwMS0wMDAxCiAgICAgICAgWycxMjEwMS0wMDAxJ10KCiAgICAgICAgIyBpbnZhbGlkIFpJUAogICAgICAgIDk4NzY1LQogICAgICAgICAgICAgXgogICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDUpLCAobGluZToxLCBjb2w6NikKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBkZWZhdWx0PV9vcHRpb25hbE5vdE1hdGNoZWQgKToKICAgICAgICBzdXBlcihPcHRpb25hbCxzZWxmKS5fX2luaXRfXyggZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0CiAgICAgICAgc2VsZi5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0CiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHRyeToKICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToKICAgICAgICAgICAgaWYgc2VsZi5kZWZhdWx0VmFsdWUgaXMgbm90IF9vcHRpb25hbE5vdE1hdGNoZWQ6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIucmVzdWx0c05hbWU6CiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gUGFyc2VSZXN1bHRzKFsgc2VsZi5kZWZhdWx0VmFsdWUgXSkKICAgICAgICAgICAgICAgICAgICB0b2tlbnNbc2VsZi5leHByLnJlc3VsdHNOYW1lXSA9IHNlbGYuZGVmYXVsdFZhbHVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFsgc2VsZi5kZWZhdWx0VmFsdWUgXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdG9rZW5zID0gW10KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCmNsYXNzIFNraXBUbyhQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgVG9rZW4gZm9yIHNraXBwaW5nIG92ZXIgYWxsIHVuZGVmaW5lZCB0ZXh0IHVudGlsIHRoZSBtYXRjaGVkIGV4cHJlc3Npb24gaXMgZm91bmQuCgogICAgUGFyYW1ldGVyczoKICAgICAtIGV4cHIgLSB0YXJnZXQgZXhwcmVzc2lvbiBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGRhdGEgdG8gYmUgc2tpcHBlZAogICAgIC0gaW5jbHVkZSAtIChkZWZhdWx0PUN7RmFsc2V9KSBpZiBUcnVlLCB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgYWxzbyBwYXJzZWQgCiAgICAgICAgICAodGhlIHNraXBwZWQgdGV4dCBhbmQgdGFyZ2V0IGV4cHJlc3Npb24gYXJlIHJldHVybmVkIGFzIGEgMi1lbGVtZW50IGxpc3QpLgogICAgIC0gaWdub3JlIC0gKGRlZmF1bHQ9Q3tOb25lfSkgdXNlZCB0byBkZWZpbmUgZ3JhbW1hcnMgKHR5cGljYWxseSBxdW90ZWQgc3RyaW5ncyBhbmQgCiAgICAgICAgICBjb21tZW50cykgdGhhdCBtaWdodCBjb250YWluIGZhbHNlIG1hdGNoZXMgdG8gdGhlIHRhcmdldCBleHByZXNzaW9uCiAgICAgLSBmYWlsT24gLSAoZGVmYXVsdD1De05vbmV9KSBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgCiAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgc2tpcHBlZCB0ZXN0OyBpZiBmb3VuZCBiZWZvcmUgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGZvdW5kLCAKICAgICAgICAgIHRoZSBTa2lwVG8gaXMgbm90IGEgbWF0Y2gKCiAgICBFeGFtcGxlOjoKICAgICAgICByZXBvcnQgPSAnJycKICAgICAgICAgICAgT3V0c3RhbmRpbmcgSXNzdWVzIFJlcG9ydCAtIDEgSmFuIDIwMDAKCiAgICAgICAgICAgICAgICMgfCBTZXZlcml0eSB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIERheXMgT3BlbgogICAgICAgICAgICAtLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KICAgICAgICAgICAgIDEwMSB8IENyaXRpY2FsIHwgSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCAgICAgICAgICAgICAgICAgfCAgICAgICAgICA2CiAgICAgICAgICAgICAgOTQgfCBDb3NtZXRpYyB8IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSAgICAgICAgIHwgICAgICAgICAxNAogICAgICAgICAgICAgIDc5IHwgTWlub3IgICAgfCBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cyB8ICAgICAgICAgNDcKICAgICAgICAgICAgJycnCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICBTRVAgPSBTdXBwcmVzcygnfCcpCiAgICAgICAgIyB1c2UgU2tpcFRvIHRvIHNpbXBseSBtYXRjaCBldmVyeXRoaW5nIHVwIHVudGlsIHRoZSBuZXh0IFNFUAogICAgICAgICMgLSBpZ25vcmUgcXVvdGVkIHN0cmluZ3MsIHNvIHRoYXQgYSAnfCcgY2hhcmFjdGVyIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcgZG9lcyBub3QgbWF0Y2gKICAgICAgICAjIC0gcGFyc2UgYWN0aW9uIHdpbGwgY2FsbCB0b2tlbi5zdHJpcCgpIGZvciBlYWNoIG1hdGNoZWQgdG9rZW4sIGkuZS4sIHRoZSBkZXNjcmlwdGlvbiBib2R5CiAgICAgICAgc3RyaW5nX2RhdGEgPSBTa2lwVG8oU0VQLCBpZ25vcmU9cXVvdGVkU3RyaW5nKQogICAgICAgIHN0cmluZ19kYXRhLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci5zdHJpcCkpCiAgICAgICAgdGlja2V0X2V4cHIgPSAoaW50ZWdlcigiaXNzdWVfbnVtIikgKyBTRVAgCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJzZXYiKSArIFNFUCAKICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoImRlc2MiKSArIFNFUCAKICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlcigiZGF5c19vcGVuIikpCiAgICAgICAgCiAgICAgICAgZm9yIHRrdCBpbiB0aWNrZXRfZXhwci5zZWFyY2hTdHJpbmcocmVwb3J0KToKICAgICAgICAgICAgcHJpbnQgdGt0LmR1bXAoKQogICAgcHJpbnRzOjoKICAgICAgICBbJzEwMScsICdDcml0aWNhbCcsICdJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoJywgJzYnXQogICAgICAgIC0gZGF5c19vcGVuOiA2CiAgICAgICAgLSBkZXNjOiBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoCiAgICAgICAgLSBpc3N1ZV9udW06IDEwMQogICAgICAgIC0gc2V2OiBDcml0aWNhbAogICAgICAgIFsnOTQnLCAnQ29zbWV0aWMnLCAiU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpIiwgJzE0J10KICAgICAgICAtIGRheXNfb3BlbjogMTQKICAgICAgICAtIGRlc2M6IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKQogICAgICAgIC0gaXNzdWVfbnVtOiA5NAogICAgICAgIC0gc2V2OiBDb3NtZXRpYwogICAgICAgIFsnNzknLCAnTWlub3InLCAnU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMnLCAnNDcnXQogICAgICAgIC0gZGF5c19vcGVuOiA0NwogICAgICAgIC0gZGVzYzogU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMKICAgICAgICAtIGlzc3VlX251bTogNzkKICAgICAgICAtIHNldjogTWlub3IKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlciwgaW5jbHVkZT1GYWxzZSwgaWdub3JlPU5vbmUsIGZhaWxPbj1Ob25lICk6CiAgICAgICAgc3VwZXIoIFNraXBUbywgc2VsZiApLl9faW5pdF9fKCBvdGhlciApCiAgICAgICAgc2VsZi5pZ25vcmVFeHByID0gaWdub3JlCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYuaW5jbHVkZU1hdGNoID0gaW5jbHVkZQogICAgICAgIHNlbGYuYXNMaXN0ID0gRmFsc2UKICAgICAgICBpZiBpc2luc3RhbmNlKGZhaWxPbiwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGZhaWxPbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IGZhaWxPbgogICAgICAgIHNlbGYuZXJybXNnID0gIk5vIG1hdGNoIGZvdW5kIGZvciAiK191c3RyKHNlbGYuZXhwcikKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHN0YXJ0bG9jID0gbG9jCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgZXhwciA9IHNlbGYuZXhwcgogICAgICAgIGV4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlCiAgICAgICAgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0ID0gc2VsZi5mYWlsT24uY2FuUGFyc2VOZXh0IGlmIHNlbGYuZmFpbE9uIGlzIG5vdCBOb25lIGVsc2UgTm9uZQogICAgICAgIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSA9IHNlbGYuaWdub3JlRXhwci50cnlQYXJzZSBpZiBzZWxmLmlnbm9yZUV4cHIgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAgICAgICAgCiAgICAgICAgdG1wbG9jID0gbG9jCiAgICAgICAgd2hpbGUgdG1wbG9jIDw9IGluc3RybGVuOgogICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAjIGJyZWFrIGlmIGZhaWxPbiBleHByZXNzaW9uIG1hdGNoZXMKICAgICAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dChpbnN0cmluZywgdG1wbG9jKToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAjIGFkdmFuY2UgcGFzdCBpZ25vcmUgZXhwcmVzc2lvbnMKICAgICAgICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB0bXBsb2MgPSBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UoaW5zdHJpbmcsIHRtcGxvYykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZXhwcl9wYXJzZShpbnN0cmluZywgdG1wbG9jLCBkb0FjdGlvbnM9RmFsc2UsIGNhbGxQcmVQYXJzZT1GYWxzZSkKICAgICAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6CiAgICAgICAgICAgICAgICAjIG5vIG1hdGNoLCBhZHZhbmNlIGxvYyBpbiBzdHJpbmcKICAgICAgICAgICAgICAgIHRtcGxvYyArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIG1hdGNoZWQgc2tpcHRvIGV4cHIsIGRvbmUKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgcmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcgd2l0aG91dCBtYXRjaGluZyBza2lwdG8gZXhwciwgZmFpbAogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgIyBidWlsZCB1cCByZXR1cm4gdmFsdWVzCiAgICAgICAgbG9jID0gdG1wbG9jCiAgICAgICAgc2tpcHRleHQgPSBpbnN0cmluZ1tzdGFydGxvYzpsb2NdCiAgICAgICAgc2tpcHJlc3VsdCA9IFBhcnNlUmVzdWx0cyhza2lwdGV4dCkKICAgICAgICAKICAgICAgICBpZiBzZWxmLmluY2x1ZGVNYXRjaDoKICAgICAgICAgICAgbG9jLCBtYXQgPSBleHByX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMsY2FsbFByZVBhcnNlPUZhbHNlKQogICAgICAgICAgICBza2lwcmVzdWx0ICs9IG1hdAoKICAgICAgICByZXR1cm4gbG9jLCBza2lwcmVzdWx0CgpjbGFzcyBGb3J3YXJkKFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIGV4cHJlc3Npb24gdG8gYmUgZGVmaW5lZCBsYXRlciAtCiAgICB1c2VkIGZvciByZWN1cnNpdmUgZ3JhbW1hcnMsIHN1Y2ggYXMgYWxnZWJyYWljIGluZml4IG5vdGF0aW9uLgogICAgV2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBrbm93biwgaXQgaXMgYXNzaWduZWQgdG8gdGhlIEN7Rm9yd2FyZH0gdmFyaWFibGUgdXNpbmcgdGhlICc8PCcgb3BlcmF0b3IuCgogICAgTm90ZTogdGFrZSBjYXJlIHdoZW4gYXNzaWduaW5nIHRvIEN7Rm9yd2FyZH0gbm90IHRvIG92ZXJsb29rIHByZWNlZGVuY2Ugb2Ygb3BlcmF0b3JzLgogICAgU3BlY2lmaWNhbGx5LCAnfCcgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICc8PCcsIHNvIHRoYXQ6OgogICAgICAgIGZ3ZEV4cHIgPDwgYSB8IGIgfCBjCiAgICB3aWxsIGFjdHVhbGx5IGJlIGV2YWx1YXRlZCBhczo6CiAgICAgICAgKGZ3ZEV4cHIgPDwgYSkgfCBiIHwgYwogICAgdGhlcmVieSBsZWF2aW5nIGIgYW5kIGMgb3V0IGFzIHBhcnNlYWJsZSBhbHRlcm5hdGl2ZXMuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdQogICAgZXhwbGljaXRseSBncm91cCB0aGUgdmFsdWVzIGluc2VydGVkIGludG8gdGhlIEN7Rm9yd2FyZH06OgogICAgICAgIGZ3ZEV4cHIgPDwgKGEgfCBiIHwgYykKICAgIENvbnZlcnRpbmcgdG8gdXNlIHRoZSAnPDw9JyBvcGVyYXRvciBpbnN0ZWFkIHdpbGwgYXZvaWQgdGhpcyBwcm9ibGVtLgoKICAgIFNlZSBMe1BhcnNlUmVzdWx0cy5wcHJpbnR9IGZvciBhbiBleGFtcGxlIG9mIGEgcmVjdXJzaXZlIHBhcnNlciBjcmVhdGVkIHVzaW5nCiAgICBDe0ZvcndhcmR9LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyPU5vbmUgKToKICAgICAgICBzdXBlcihGb3J3YXJkLHNlbGYpLl9faW5pdF9fKCBvdGhlciwgc2F2ZWxpc3Q9RmFsc2UgKQoKICAgIGRlZiBfX2xzaGlmdF9fKCBzZWxmLCBvdGhlciApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKG90aGVyKQogICAgICAgIHNlbGYuZXhwciA9IG90aGVyCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IHNlbGYuZXhwci5tYXlJbmRleEVycm9yCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IHNlbGYuZXhwci5tYXlSZXR1cm5FbXB0eQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHIud2hpdGVDaGFycyApCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwci5za2lwV2hpdGVzcGFjZQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0CiAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoc2VsZi5leHByLmlnbm9yZUV4cHJzKQogICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgCiAgICBkZWYgX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmIDw8IG90aGVyCiAgICAKICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6CiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOgogICAgICAgIGlmIHNlbGYgbm90IGluIHZhbGlkYXRlVHJhY2U6CiAgICAgICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbihbXSkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogLi4uIgoKICAgICAgICAjIHN0dWJiZWQgb3V0IGZvciBub3cgLSBjcmVhdGVzIGF3ZnVsIG1lbW9yeSBhbmQgcGVyZiBpc3N1ZXMKICAgICAgICBzZWxmLl9yZXZlcnRDbGFzcyA9IHNlbGYuX19jbGFzc19fCiAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBfRm9yd2FyZE5vUmVjdXJzZQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gX3VzdHIoc2VsZi5leHByKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gIk5vbmUiCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBzZWxmLl9yZXZlcnRDbGFzcwogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6ICIgKyByZXRTdHJpbmcKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihGb3J3YXJkLHNlbGYpLmNvcHkoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldCA9IEZvcndhcmQoKQogICAgICAgICAgICByZXQgPDw9IHNlbGYKICAgICAgICAgICAgcmV0dXJuIHJldAoKY2xhc3MgX0ZvcndhcmROb1JlY3Vyc2UoRm9yd2FyZCk6CiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiAiLi4uIgoKY2xhc3MgVG9rZW5Db252ZXJ0ZXIoUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICAiIiIKICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VFeHByZXNzaW9ufSwgZm9yIGNvbnZlcnRpbmcgcGFyc2VkIHJlc3VsdHMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToKICAgICAgICBzdXBlcihUb2tlbkNvbnZlcnRlcixzZWxmKS5fX2luaXRfXyggZXhwciApIywgc2F2ZWxpc3QgKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IEZhbHNlCgpjbGFzcyBDb21iaW5lKFRva2VuQ29udmVydGVyKToKICAgICIiIgogICAgQ29udmVydGVyIHRvIGNvbmNhdGVuYXRlIGFsbCBtYXRjaGluZyB0b2tlbnMgdG8gYSBzaW5nbGUgc3RyaW5nLgogICAgQnkgZGVmYXVsdCwgdGhlIG1hdGNoaW5nIHBhdHRlcm5zIG11c3QgYWxzbyBiZSBjb250aWd1b3VzIGluIHRoZSBpbnB1dCBzdHJpbmc7CiAgICB0aGlzIGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIEN7J2FkamFjZW50PUZhbHNlJ30gaW4gdGhlIGNvbnN0cnVjdG9yLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHJlYWwgPSBXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQogICAgICAgICMgd2lsbCBhbHNvIGVycm9uZW91c2x5IG1hdGNoIHRoZSBmb2xsb3dpbmcKICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddCgogICAgICAgIHJlYWwgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMy4xNDE2J10KICAgICAgICAjIG5vIG1hdGNoIHdoZW4gdGhlcmUgYXJlIGludGVybmFsIHNwYWNlcwogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgam9pblN0cmluZz0iIiwgYWRqYWNlbnQ9VHJ1ZSApOgogICAgICAgIHN1cGVyKENvbWJpbmUsc2VsZikuX19pbml0X18oIGV4cHIgKQogICAgICAgICMgc3VwcHJlc3Mgd2hpdGVzcGFjZS1zdHJpcHBpbmcgaW4gY29udGFpbmVkIHBhcnNlIGV4cHJlc3Npb25zLCBidXQgcmUtZW5hYmxlIGl0IG9uIHRoZSBDb21iaW5lIGl0c2VsZgogICAgICAgIGlmIGFkamFjZW50OgogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpCiAgICAgICAgc2VsZi5hZGphY2VudCA9IGFkamFjZW50CiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUKICAgICAgICBzZWxmLmpvaW5TdHJpbmcgPSBqb2luU3RyaW5nCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlCgogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBzZWxmLmFkamFjZW50OgogICAgICAgICAgICBQYXJzZXJFbGVtZW50Lmlnbm9yZShzZWxmLCBvdGhlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdXBlciggQ29tYmluZSwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICByZXRUb2tzID0gdG9rZW5saXN0LmNvcHkoKQogICAgICAgIGRlbCByZXRUb2tzWzpdCiAgICAgICAgcmV0VG9rcyArPSBQYXJzZVJlc3VsdHMoWyAiIi5qb2luKHRva2VubGlzdC5fYXNTdHJpbmdMaXN0KHNlbGYuam9pblN0cmluZykpIF0sIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzKQoKICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lIGFuZCByZXRUb2tzLmhhc2tleXMoKToKICAgICAgICAgICAgcmV0dXJuIFsgcmV0VG9rcyBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHJldFRva3MKCmNsYXNzIEdyb3VwKFRva2VuQ29udmVydGVyKToKICAgICIiIgogICAgQ29udmVydGVyIHRvIHJldHVybiB0aGUgbWF0Y2hlZCB0b2tlbnMgYXMgYSBsaXN0IC0gdXNlZnVsIGZvciByZXR1cm5pbmcgdG9rZW5zIG9mIEN7THtaZXJvT3JNb3JlfX0gYW5kIEN7THtPbmVPck1vcmV9fSBleHByZXNzaW9ucy4KCiAgICBFeGFtcGxlOjoKICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKQogICAgICAgIG51bSA9IFdvcmQobnVtcykKICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0KICAgICAgICBmdW5jID0gaWRlbnQgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsICdhJywgJ2InLCAnMTAwJ10KCiAgICAgICAgZnVuYyA9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgWydhJywgJ2InLCAnMTAwJ11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOgogICAgICAgIHN1cGVyKEdyb3VwLHNlbGYpLl9faW5pdF9fKCBleHByICkKICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlCgogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6CiAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0KCmNsYXNzIERpY3QoVG9rZW5Db252ZXJ0ZXIpOgogICAgIiIiCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIGEgcmVwZXRpdGl2ZSBleHByZXNzaW9uIGFzIGEgbGlzdCwgYnV0IGFsc28gYXMgYSBkaWN0aW9uYXJ5LgogICAgRWFjaCBlbGVtZW50IGNhbiBhbHNvIGJlIHJlZmVyZW5jZWQgdXNpbmcgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBleHByZXNzaW9uIGFzIGl0cyBrZXkuCiAgICBVc2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nIHdoZW4gdGhlIGZpcnN0IGNvbHVtbiBjYW4gYmUgdXNlZCBhcyBhIGl0ZW0ga2V5LgoKICAgIEV4YW1wbGU6OgogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQoKICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiCiAgICAgICAgYXR0cl9leHByID0gKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQogICAgICAgIAogICAgICAgICMgcHJpbnQgYXR0cmlidXRlcyBhcyBwbGFpbiBncm91cHMKICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpCiAgICAgICAgCiAgICAgICAgIyBpbnN0ZWFkIG9mIE9uZU9yTW9yZShleHByKSwgcGFyc2UgdXNpbmcgRGljdChPbmVPck1vcmUoR3JvdXAoZXhwcikpKSAtIERpY3Qgd2lsbCBhdXRvLWFzc2lnbiBuYW1lcwogICAgICAgIHJlc3VsdCA9IERpY3QoT25lT3JNb3JlKEdyb3VwKGF0dHJfZXhwcikpKS5wYXJzZVN0cmluZyh0ZXh0KQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpCiAgICAgICAgCiAgICAgICAgIyBhY2Nlc3MgbmFtZWQgZmllbGRzIGFzIGRpY3QgZW50cmllcywgb3Igb3V0cHV0IGFzIGRpY3QKICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pICAgICAgICAKICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpCiAgICBwcmludHM6OgogICAgICAgIFsnc2hhcGUnLCAnU1FVQVJFJywgJ3Bvc24nLCAndXBwZXIgbGVmdCcsICdjb2xvcicsICdsaWdodCBibHVlJywgJ3RleHR1cmUnLCAnYnVybGFwJ10KCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdAogICAgICAgIC0gc2hhcGU6IFNRVUFSRQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwCiAgICAgICAgU1FVQVJFCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCcsICdzaGFwZSc6ICdTUVVBUkUnfQogICAgU2VlIG1vcmUgZXhhbXBsZXMgYXQgTHtQYXJzZVJlc3VsdHN9IG9mIGFjY2Vzc2luZyBmaWVsZHMgYnkgcmVzdWx0cyBuYW1lLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToKICAgICAgICBzdXBlcihEaWN0LHNlbGYpLl9faW5pdF9fKCBleHByICkKICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlCgogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6CiAgICAgICAgZm9yIGksdG9rIGluIGVudW1lcmF0ZSh0b2tlbmxpc3QpOgogICAgICAgICAgICBpZiBsZW4odG9rKSA9PSAwOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWtleSA9IHRva1swXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlrZXksaW50KToKICAgICAgICAgICAgICAgIGlrZXkgPSBfdXN0cih0b2tbMF0pLnN0cmlwKCkKICAgICAgICAgICAgaWYgbGVuKHRvayk9PTE6CiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCgiIixpKQogICAgICAgICAgICBlbGlmIGxlbih0b2spPT0yIGFuZCBub3QgaXNpbnN0YW5jZSh0b2tbMV0sUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva1sxXSxpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGljdHZhbHVlID0gdG9rLmNvcHkoKSAjUGFyc2VSZXN1bHRzKGkpCiAgICAgICAgICAgICAgICBkZWwgZGljdHZhbHVlWzBdCiAgICAgICAgICAgICAgICBpZiBsZW4oZGljdHZhbHVlKSE9IDEgb3IgKGlzaW5zdGFuY2UoZGljdHZhbHVlLFBhcnNlUmVzdWx0cykgYW5kIGRpY3R2YWx1ZS5oYXNrZXlzKCkpOgogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZSxpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChkaWN0dmFsdWVbMF0saSkKCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZToKICAgICAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdG9rZW5saXN0CgoKY2xhc3MgU3VwcHJlc3MoVG9rZW5Db252ZXJ0ZXIpOgogICAgIiIiCiAgICBDb252ZXJ0ZXIgZm9yIGlnbm9yaW5nIHRoZSByZXN1bHRzIG9mIGEgcGFyc2VkIGV4cHJlc3Npb24uCgogICAgRXhhbXBsZTo6CiAgICAgICAgc291cmNlID0gImEsIGIsIGMsZCIKICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQogICAgICAgIHdkX2xpc3QxID0gd2QgKyBaZXJvT3JNb3JlKCcsJyArIHdkKQogICAgICAgIHByaW50KHdkX2xpc3QxLnBhcnNlU3RyaW5nKHNvdXJjZSkpCgogICAgICAgICMgb2Z0ZW4sIGRlbGltaXRlcnMgdGhhdCBhcmUgdXNlZnVsIGR1cmluZyBwYXJzaW5nIGFyZSBqdXN0IGluIHRoZQogICAgICAgICMgd2F5IGFmdGVyd2FyZCAtIHVzZSBTdXBwcmVzcyB0byBrZWVwIHRoZW0gb3V0IG9mIHRoZSBwYXJzZWQgb3V0cHV0CiAgICAgICAgd2RfbGlzdDIgPSB3ZCArIFplcm9Pck1vcmUoU3VwcHJlc3MoJywnKSArIHdkKQogICAgICAgIHByaW50KHdkX2xpc3QyLnBhcnNlU3RyaW5nKHNvdXJjZSkpCiAgICBwcmludHM6OgogICAgICAgIFsnYScsICcsJywgJ2InLCAnLCcsICdjJywgJywnLCAnZCddCiAgICAgICAgWydhJywgJ2InLCAnYycsICdkJ10KICAgIChTZWUgYWxzbyBMe2RlbGltaXRlZExpc3R9LikKICAgICIiIgogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6CiAgICAgICAgcmV0dXJuIFtdCgogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIHNlbGYKCgpjbGFzcyBPbmx5T25jZShvYmplY3QpOgogICAgIiIiCiAgICBXcmFwcGVyIGZvciBwYXJzZSBhY3Rpb25zLCB0byBlbnN1cmUgdGhleSBhcmUgb25seSBjYWxsZWQgb25jZS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZENhbGwpOgogICAgICAgIHNlbGYuY2FsbGFibGUgPSBfdHJpbV9hcml0eShtZXRob2RDYWxsKQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKICAgIGRlZiBfX2NhbGxfXyhzZWxmLHMsbCx0KToKICAgICAgICBpZiBub3Qgc2VsZi5jYWxsZWQ6CiAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxmLmNhbGxhYmxlKHMsbCx0KQogICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIiIpCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQoKZGVmIHRyYWNlUGFyc2VBY3Rpb24oZik6CiAgICAiIiIKICAgIERlY29yYXRvciBmb3IgZGVidWdnaW5nIHBhcnNlIGFjdGlvbnMuIAogICAgCiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gaXMgY2FsbGVkLCB0aGlzIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ij4+IGVudGVyaW5nIEl7bWV0aG9kLW5hbWV9KGxpbmU6SXtjdXJyZW50X3NvdXJjZV9saW5lfSwgSXtwYXJzZV9sb2NhdGlvbn0sIEl7bWF0Y2hlZF90b2tlbnN9KSIufQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGNvbXBsZXRlcywgdGhlIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ijw8In0gZm9sbG93ZWQgYnkgdGhlIHJldHVybmVkIHZhbHVlLCBvciBhbnkgZXhjZXB0aW9uIHRoYXQgdGhlIHBhcnNlIGFjdGlvbiByYWlzZWQuCgogICAgRXhhbXBsZTo6CiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykKCiAgICAgICAgQHRyYWNlUGFyc2VBY3Rpb24KICAgICAgICBkZWYgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyh0b2tlbnMpOgogICAgICAgICAgICByZXR1cm4gJycuam9pbihzb3J0ZWQoc2V0KCcnLmpvaW4odG9rZW5zKSkpCgogICAgICAgIHdkcyA9IE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlX2R1cGxpY2F0ZV9jaGFycykKICAgICAgICBwcmludCh3ZHMucGFyc2VTdHJpbmcoInNsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmIikpCiAgICBwcmludHM6OgogICAgICAgID4+ZW50ZXJpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyhsaW5lOiAnc2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYnLCAwLCAoWydzbGtkanMnLCAnc2xkJywgJ3NsZGQnLCAnc2RsZicsICdzZGxqZiddLCB7fSkpCiAgICAgICAgPDxsZWF2aW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMgKHJldDogJ2RmamtscycpCiAgICAgICAgWydkZmprbHMnXQogICAgIiIiCiAgICBmID0gX3RyaW1fYXJpdHkoZikKICAgIGRlZiB6KCpwYUFyZ3MpOgogICAgICAgIHRoaXNGdW5jID0gZi5fX25hbWVfXwogICAgICAgIHMsbCx0ID0gcGFBcmdzWy0zOl0KICAgICAgICBpZiBsZW4ocGFBcmdzKT4zOgogICAgICAgICAgICB0aGlzRnVuYyA9IHBhQXJnc1swXS5fX2NsYXNzX18uX19uYW1lX18gKyAnLicgKyB0aGlzRnVuYwogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI+PmVudGVyaW5nICVzKGxpbmU6ICclcycsICVkLCAlcilcbiIgJSAodGhpc0Z1bmMsbGluZShsLHMpLGwsdCkgKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0ID0gZigqcGFBcmdzKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChleGNlcHRpb246ICVzKVxuIiAlICh0aGlzRnVuYyxleGMpICkKICAgICAgICAgICAgcmFpc2UKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChyZXQ6ICVyKVxuIiAlICh0aGlzRnVuYyxyZXQpICkKICAgICAgICByZXR1cm4gcmV0CiAgICB0cnk6CiAgICAgICAgei5fX25hbWVfXyA9IGYuX19uYW1lX18KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gegoKIwojIGdsb2JhbCBoZWxwZXJzCiMKZGVmIGRlbGltaXRlZExpc3QoIGV4cHIsIGRlbGltPSIsIiwgY29tYmluZT1GYWxzZSApOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgZGVsaW1pdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgLSB0aGUgZGVsaW1pdGVyIGRlZmF1bHRzIHRvICcsJy4KICAgIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGVsZW1lbnRzIGFuZCBkZWxpbWl0ZXJzIGNhbiBoYXZlIGludGVydmVuaW5nIHdoaXRlc3BhY2UsIGFuZAogICAgY29tbWVudHMsIGJ1dCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgQ3tjb21iaW5lPVRydWV9IGluIHRoZSBjb25zdHJ1Y3Rvci4KICAgIElmIEN7Y29tYmluZX0gaXMgc2V0IHRvIEN7VHJ1ZX0sIHRoZSBtYXRjaGluZyB0b2tlbnMgYXJlIHJldHVybmVkIGFzIGEgc2luZ2xlIHRva2VuCiAgICBzdHJpbmcsIHdpdGggdGhlIGRlbGltaXRlcnMgaW5jbHVkZWQ7IG90aGVyd2lzZSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQKICAgIGFzIGEgbGlzdCBvZiB0b2tlbnMsIHdpdGggdGhlIGRlbGltaXRlcnMgc3VwcHJlc3NlZC4KCiAgICBFeGFtcGxlOjoKICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFhLGJiLGNjIikgIyAtPiBbJ2FhJywgJ2JiJywgJ2NjJ10KICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoaGV4bnVtcyksIGRlbGltPSc6JywgY29tYmluZT1UcnVlKS5wYXJzZVN0cmluZygiQUE6QkI6Q0M6REQ6RUUiKSAjIC0+IFsnQUE6QkI6Q0M6REQ6RUUnXQogICAgIiIiCiAgICBkbE5hbWUgPSBfdXN0cihleHByKSsiIFsiK191c3RyKGRlbGltKSsiICIrX3VzdHIoZXhwcikrIl0uLi4iCiAgICBpZiBjb21iaW5lOgogICAgICAgIHJldHVybiBDb21iaW5lKCBleHByICsgWmVyb09yTW9yZSggZGVsaW0gKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICggZXhwciArIFplcm9Pck1vcmUoIFN1cHByZXNzKCBkZWxpbSApICsgZXhwciApICkuc2V0TmFtZShkbE5hbWUpCgpkZWYgY291bnRlZEFycmF5KCBleHByLCBpbnRFeHByPU5vbmUgKToKICAgICIiIgogICAgSGVscGVyIHRvIGRlZmluZSBhIGNvdW50ZWQgbGlzdCBvZiBleHByZXNzaW9ucy4KICAgIFRoaXMgaGVscGVyIGRlZmluZXMgYSBwYXR0ZXJuIG9mIHRoZSBmb3JtOjoKICAgICAgICBpbnRlZ2VyIGV4cHIgZXhwciBleHByLi4uCiAgICB3aGVyZSB0aGUgbGVhZGluZyBpbnRlZ2VyIHRlbGxzIGhvdyBtYW55IGV4cHIgZXhwcmVzc2lvbnMgZm9sbG93LgogICAgVGhlIG1hdGNoZWQgdG9rZW5zIHJldHVybnMgdGhlIGFycmF5IG9mIGV4cHIgdG9rZW5zIGFzIGEgbGlzdCAtIHRoZSBsZWFkaW5nIGNvdW50IHRva2VuIGlzIHN1cHByZXNzZWQuCiAgICAKICAgIElmIEN7aW50RXhwcn0gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbiB0aGF0IHByb2R1Y2VzIGFuIGludGVnZXIgdmFsdWUuCgogICAgRXhhbXBsZTo6CiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoJzIgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10KCiAgICAgICAgIyBpbiB0aGlzIHBhcnNlciwgdGhlIGxlYWRpbmcgaW50ZWdlciB2YWx1ZSBpcyBnaXZlbiBpbiBiaW5hcnksCiAgICAgICAgIyAnMTAnIGluZGljYXRpbmcgdGhhdCAyIHZhbHVlcyBhcmUgaW4gdGhlIGFycmF5CiAgICAgICAgYmluYXJ5Q29uc3RhbnQgPSBXb3JkKCcwMScpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiBpbnQodFswXSwgMikpCiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSwgaW50RXhwcj1iaW5hcnlDb25zdGFudCkucGFyc2VTdHJpbmcoJzEwIGFiIGNkIGVmJykgICMgLT4gWydhYicsICdjZCddCiAgICAiIiIKICAgIGFycmF5RXhwciA9IEZvcndhcmQoKQogICAgZGVmIGNvdW50RmllbGRQYXJzZUFjdGlvbihzLGwsdCk6CiAgICAgICAgbiA9IHRbMF0KICAgICAgICBhcnJheUV4cHIgPDwgKG4gYW5kIEdyb3VwKEFuZChbZXhwcl0qbikpIG9yIEdyb3VwKGVtcHR5KSkKICAgICAgICByZXR1cm4gW10KICAgIGlmIGludEV4cHIgaXMgTm9uZToKICAgICAgICBpbnRFeHByID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDppbnQodFswXSkpCiAgICBlbHNlOgogICAgICAgIGludEV4cHIgPSBpbnRFeHByLmNvcHkoKQogICAgaW50RXhwci5zZXROYW1lKCJhcnJheUxlbiIpCiAgICBpbnRFeHByLmFkZFBhcnNlQWN0aW9uKGNvdW50RmllbGRQYXJzZUFjdGlvbiwgY2FsbER1cmluZ1RyeT1UcnVlKQogICAgcmV0dXJuICggaW50RXhwciArIGFycmF5RXhwciApLnNldE5hbWUoJyhsZW4pICcgKyBfdXN0cihleHByKSArICcuLi4nKQoKZGVmIF9mbGF0dGVuKEwpOgogICAgcmV0ID0gW10KICAgIGZvciBpIGluIEw6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpLGxpc3QpOgogICAgICAgICAgICByZXQuZXh0ZW5kKF9mbGF0dGVuKGkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldC5hcHBlbmQoaSkKICAgIHJldHVybiByZXQKCmRlZiBtYXRjaFByZXZpb3VzTGl0ZXJhbChleHByKToKICAgICIiIgogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20KICAgIHRoZSB0b2tlbnMgbWF0Y2hlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24sIHRoYXQgaXMsIGl0IGxvb2tzCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6CiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpCiAgICAgICAgc2Vjb25kID0gbWF0Y2hQcmV2aW91c0xpdGVyYWwoZmlyc3QpCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQKICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBhCiAgICBwcmV2aW91cyBsaXRlcmFsLCB3aWxsIGFsc28gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9LgogICAgSWYgdGhpcyBpcyBub3QgZGVzaXJlZCwgdXNlIEN7bWF0Y2hQcmV2aW91c0V4cHJ9LgogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLgogICAgIiIiCiAgICByZXAgPSBGb3J3YXJkKCkKICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToKICAgICAgICBpZiB0OgogICAgICAgICAgICBpZiBsZW4odCkgPT0gMToKICAgICAgICAgICAgICAgIHJlcCA8PCB0WzBdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGZsYXR0ZW4gdCB0b2tlbnMKICAgICAgICAgICAgICAgIHRmbGF0ID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkKICAgICAgICAgICAgICAgIHJlcCA8PCBBbmQoTGl0ZXJhbCh0dCkgZm9yIHR0IGluIHRmbGF0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlcCA8PCBFbXB0eSgpCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkKICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQogICAgcmV0dXJuIHJlcAoKZGVmIG1hdGNoUHJldmlvdXNFeHByKGV4cHIpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MKICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoKICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykKICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzRXhwcihmaXJzdCkKICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZAogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGJ5CiAgICBleHByZXNzaW9ucywgd2lsbCBJe25vdH0gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9OwogICAgdGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVkLCBzbwogICAgQ3siMSJ9IGlzIGNvbXBhcmVkIHdpdGggQ3siMTAifS4KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4KICAgICIiIgogICAgcmVwID0gRm9yd2FyZCgpCiAgICBlMiA9IGV4cHIuY29weSgpCiAgICByZXAgPDw9IGUyCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6CiAgICAgICAgbWF0Y2hUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQogICAgICAgIGRlZiBtdXN0TWF0Y2hUaGVzZVRva2VucyhzLGwsdCk6CiAgICAgICAgICAgIHRoZXNlVG9rZW5zID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkKICAgICAgICAgICAgaWYgIHRoZXNlVG9rZW5zICE9IG1hdGNoVG9rZW5zOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsMCwiIikKICAgICAgICByZXAuc2V0UGFyc2VBY3Rpb24oIG11c3RNYXRjaFRoZXNlVG9rZW5zLCBjYWxsRHVyaW5nVHJ5PVRydWUgKQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkKICAgIHJldHVybiByZXAKCmRlZiBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHMpOgogICAgI34gIGVzY2FwZSB0aGVzZSBjaGFyczogXi1dCiAgICBmb3IgYyBpbiByIlxeLV0iOgogICAgICAgIHMgPSBzLnJlcGxhY2UoYyxfYnNsYXNoK2MpCiAgICBzID0gcy5yZXBsYWNlKCJcbiIsciJcbiIpCiAgICBzID0gcy5yZXBsYWNlKCJcdCIsciJcdCIpCiAgICByZXR1cm4gX3VzdHIocykKCmRlZiBvbmVPZiggc3RycywgY2FzZWxlc3M9RmFsc2UsIHVzZVJlZ2V4PVRydWUgKToKICAgICIiIgogICAgSGVscGVyIHRvIHF1aWNrbHkgZGVmaW5lIGEgc2V0IG9mIGFsdGVybmF0aXZlIExpdGVyYWxzLCBhbmQgbWFrZXMgc3VyZSB0byBkbwogICAgbG9uZ2VzdC1maXJzdCB0ZXN0aW5nIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCwgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgb3JkZXIsCiAgICBidXQgcmV0dXJucyBhIEN7THtNYXRjaEZpcnN0fX0gZm9yIGJlc3QgcGVyZm9ybWFuY2UuCgogICAgUGFyYW1ldGVyczoKICAgICAtIHN0cnMgLSBhIHN0cmluZyBvZiBzcGFjZS1kZWxpbWl0ZWQgbGl0ZXJhbHMsIG9yIGEgY29sbGVjdGlvbiBvZiBzdHJpbmcgbGl0ZXJhbHMKICAgICAtIGNhc2VsZXNzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIC0gdHJlYXQgYWxsIGxpdGVyYWxzIGFzIGNhc2VsZXNzCiAgICAgLSB1c2VSZWdleCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gYXMgYW4gb3B0aW1pemF0aW9uLCB3aWxsIGdlbmVyYXRlIGEgUmVnZXgKICAgICAgICAgIG9iamVjdDsgb3RoZXJ3aXNlLCB3aWxsIGdlbmVyYXRlIGEgQ3tNYXRjaEZpcnN0fSBvYmplY3QgKGlmIEN7Y2FzZWxlc3M9VHJ1ZX0sIG9yCiAgICAgICAgICBpZiBjcmVhdGluZyBhIEN7UmVnZXh9IHJhaXNlcyBhbiBleGNlcHRpb24pCgogICAgRXhhbXBsZTo6CiAgICAgICAgY29tcF9vcGVyID0gb25lT2YoIjwgPSA+IDw9ID49ICE9IikKICAgICAgICB2YXIgPSBXb3JkKGFscGhhcykKICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpCiAgICAgICAgdGVybSA9IHZhciB8IG51bWJlcgogICAgICAgIGNvbXBhcmlzb25fZXhwciA9IHRlcm0gKyBjb21wX29wZXIgKyB0ZXJtCiAgICAgICAgcHJpbnQoY29tcGFyaXNvbl9leHByLnNlYXJjaFN0cmluZygiQiA9IDEyICBBQT0yMyBCPD1BQSBBQT4xMiIpKQogICAgcHJpbnRzOjoKICAgICAgICBbWydCJywgJz0nLCAnMTInXSwgWydBQScsICc9JywgJzIzJ10sIFsnQicsICc8PScsICdBQSddLCBbJ0FBJywgJz4nLCAnMTInXV0KICAgICIiIgogICAgaWYgY2FzZWxlc3M6CiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYS51cHBlcigpID09IGIudXBwZXIoKSApCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIudXBwZXIoKS5zdGFydHN3aXRoKGEudXBwZXIoKSkgKQogICAgICAgIHBhcnNlRWxlbWVudENsYXNzID0gQ2FzZWxlc3NMaXRlcmFsCiAgICBlbHNlOgogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEgPT0gYiApCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIuc3RhcnRzd2l0aChhKSApCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBMaXRlcmFsCgogICAgc3ltYm9scyA9IFtdCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsYmFzZXN0cmluZyk6CiAgICAgICAgc3ltYm9scyA9IHN0cnMuc3BsaXQoKQogICAgZWxpZiBpc2luc3RhbmNlKHN0cnMsIGNvbGxlY3Rpb25zLkl0ZXJhYmxlKToKICAgICAgICBzeW1ib2xzID0gbGlzdChzdHJzKQogICAgZWxzZToKICAgICAgICB3YXJuaW5ncy53YXJuKCJJbnZhbGlkIGFyZ3VtZW50IHRvIG9uZU9mLCBleHBlY3RlZCBzdHJpbmcgb3IgaXRlcmFibGUiLAogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgaWYgbm90IHN5bWJvbHM6CiAgICAgICAgcmV0dXJuIE5vTWF0Y2goKQoKICAgIGkgPSAwCiAgICB3aGlsZSBpIDwgbGVuKHN5bWJvbHMpLTE6CiAgICAgICAgY3VyID0gc3ltYm9sc1tpXQogICAgICAgIGZvciBqLG90aGVyIGluIGVudW1lcmF0ZShzeW1ib2xzW2krMTpdKToKICAgICAgICAgICAgaWYgKCBpc2VxdWFsKG90aGVyLCBjdXIpICk6CiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgKCBtYXNrcyhjdXIsIG90aGVyKSApOgogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdCiAgICAgICAgICAgICAgICBzeW1ib2xzLmluc2VydChpLG90aGVyKQogICAgICAgICAgICAgICAgY3VyID0gb3RoZXIKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaSArPSAxCgogICAgaWYgbm90IGNhc2VsZXNzIGFuZCB1c2VSZWdleDoKICAgICAgICAjfiBwcmludCAoc3RycywiLT4iLCAifCIuam9pbiggWyBfZXNjYXBlUmVnZXhDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9sc10gKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGxlbihzeW1ib2xzKT09bGVuKCIiLmpvaW4oc3ltYm9scykpOgogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAiWyVzXSIgJSAiIi5qb2luKF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAifCIuam9pbihyZS5lc2NhcGUoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkV4Y2VwdGlvbiBjcmVhdGluZyBSZWdleCBmb3Igb25lT2YsIGJ1aWxkaW5nIE1hdGNoRmlyc3QiLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKCgogICAgIyBsYXN0IHJlc29ydCwganVzdCB1c2UgTWF0Y2hGaXJzdAogICAgcmV0dXJuIE1hdGNoRmlyc3QocGFyc2VFbGVtZW50Q2xhc3Moc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkKCmRlZiBkaWN0T2YoIGtleSwgdmFsdWUgKToKICAgICIiIgogICAgSGVscGVyIHRvIGVhc2lseSBhbmQgY2xlYXJseSBkZWZpbmUgYSBkaWN0aW9uYXJ5IGJ5IHNwZWNpZnlpbmcgdGhlIHJlc3BlY3RpdmUgcGF0dGVybnMKICAgIGZvciB0aGUga2V5IGFuZCB2YWx1ZS4gIFRha2VzIGNhcmUgb2YgZGVmaW5pbmcgdGhlIEN7THtEaWN0fX0sIEN7THtaZXJvT3JNb3JlfX0sIGFuZCBDe0x7R3JvdXB9fSB0b2tlbnMKICAgIGluIHRoZSBwcm9wZXIgb3JkZXIuICBUaGUga2V5IHBhdHRlcm4gY2FuIGluY2x1ZGUgZGVsaW1pdGluZyBtYXJrZXJzIG9yIHB1bmN0dWF0aW9uLAogICAgYXMgbG9uZyBhcyB0aGV5IGFyZSBzdXBwcmVzc2VkLCB0aGVyZWJ5IGxlYXZpbmcgdGhlIHNpZ25pZmljYW50IGtleSB0ZXh0LiAgVGhlIHZhbHVlCiAgICBwYXR0ZXJuIGNhbiBpbmNsdWRlIG5hbWVkIHJlc3VsdHMsIHNvIHRoYXQgdGhlIEN7RGljdH0gcmVzdWx0cyBjYW4gaW5jbHVkZSBuYW1lZCB0b2tlbgogICAgZmllbGRzLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCIKICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQogICAgICAgIAogICAgICAgIGF0dHJfbGFiZWwgPSBsYWJlbAogICAgICAgIGF0dHJfdmFsdWUgPSBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikKCiAgICAgICAgIyBzaW1pbGFyIHRvIERpY3QsIGJ1dCBzaW1wbGVyIGNhbGwgZm9ybWF0CiAgICAgICAgcmVzdWx0ID0gZGljdE9mKGF0dHJfbGFiZWwsIGF0dHJfdmFsdWUpLnBhcnNlU3RyaW5nKHRleHQpCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkKICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pCiAgICAgICAgcHJpbnQocmVzdWx0LnNoYXBlKSAgIyBvYmplY3QgYXR0cmlidXRlIGFjY2VzcyB3b3JrcyB0b28KICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpCiAgICBwcmludHM6OgogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQogICAgICAgIC0gY29sb3I6IGxpZ2h0IGJsdWUKICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQKICAgICAgICAtIHNoYXBlOiBTUVVBUkUKICAgICAgICAtIHRleHR1cmU6IGJ1cmxhcAogICAgICAgIFNRVUFSRQogICAgICAgIFNRVUFSRQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdzaGFwZSc6ICdTUVVBUkUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJ30KICAgICIiIgogICAgcmV0dXJuIERpY3QoIFplcm9Pck1vcmUoIEdyb3VwICgga2V5ICsgdmFsdWUgKSApICkKCmRlZiBvcmlnaW5hbFRleHRGb3IoZXhwciwgYXNTdHJpbmc9VHJ1ZSk6CiAgICAiIiIKICAgIEhlbHBlciB0byByZXR1cm4gdGhlIG9yaWdpbmFsLCB1bnRva2VuaXplZCB0ZXh0IGZvciBhIGdpdmVuIGV4cHJlc3Npb24uICBVc2VmdWwgdG8KICAgIHJlc3RvcmUgdGhlIHBhcnNlZCBmaWVsZHMgb2YgYW4gSFRNTCBzdGFydCB0YWcgaW50byB0aGUgcmF3IHRhZyB0ZXh0IGl0c2VsZiwgb3IgdG8KICAgIHJldmVydCBzZXBhcmF0ZSB0b2tlbnMgd2l0aCBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1hdGNoaW5nCiAgICBpbnB1dCB0ZXh0LiBCeSBkZWZhdWx0LCByZXR1cm5zIGFzdHJpbmcgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyc2VkIHRleHQuICAKICAgICAgIAogICAgSWYgdGhlIG9wdGlvbmFsIEN7YXNTdHJpbmd9IGFyZ3VtZW50IGlzIHBhc3NlZCBhcyBDe0ZhbHNlfSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgCiAgICBDe0x7UGFyc2VSZXN1bHRzfX0gY29udGFpbmluZyBhbnkgcmVzdWx0cyBuYW1lcyB0aGF0IHdlcmUgb3JpZ2luYWxseSBtYXRjaGVkLCBhbmQgYSAKICAgIHNpbmdsZSB0b2tlbiBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLiAgU28gaWYgCiAgICB0aGUgZXhwcmVzc2lvbiBwYXNzZWQgdG8gQ3tMe29yaWdpbmFsVGV4dEZvcn19IGNvbnRhaW5zIGV4cHJlc3Npb25zIHdpdGggZGVmaW5lZAogICAgcmVzdWx0cyBuYW1lcywgeW91IG11c3Qgc2V0IEN7YXNTdHJpbmd9IHRvIEN7RmFsc2V9IGlmIHlvdSB3YW50IHRvIHByZXNlcnZlIHRob3NlCiAgICByZXN1bHRzIG5hbWUgdmFsdWVzLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHNyYyA9ICJ0aGlzIGlzIHRlc3QgPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiBub3JtYWwgdGV4dCAiCiAgICAgICAgZm9yIHRhZyBpbiAoImIiLCJpIik6CiAgICAgICAgICAgIG9wZW5lcixjbG9zZXIgPSBtYWtlSFRNTFRhZ3ModGFnKQogICAgICAgICAgICBwYXR0ID0gb3JpZ2luYWxUZXh0Rm9yKG9wZW5lciArIFNraXBUbyhjbG9zZXIpICsgY2xvc2VyKQogICAgICAgICAgICBwcmludChwYXR0LnNlYXJjaFN0cmluZyhzcmMpWzBdKQogICAgcHJpbnRzOjoKICAgICAgICBbJzxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4nXQogICAgICAgIFsnPGk+dGV4dDwvaT4nXQogICAgIiIiCiAgICBsb2NNYXJrZXIgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGxvYyx0OiBsb2MpCiAgICBlbmRsb2NNYXJrZXIgPSBsb2NNYXJrZXIuY29weSgpCiAgICBlbmRsb2NNYXJrZXIuY2FsbFByZXBhcnNlID0gRmFsc2UKICAgIG1hdGNoRXhwciA9IGxvY01hcmtlcigiX29yaWdpbmFsX3N0YXJ0IikgKyBleHByICsgZW5kbG9jTWFya2VyKCJfb3JpZ2luYWxfZW5kIikKICAgIGlmIGFzU3RyaW5nOgogICAgICAgIGV4dHJhY3RUZXh0ID0gbGFtYmRhIHMsbCx0OiBzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0KICAgIGVsc2U6CiAgICAgICAgZGVmIGV4dHJhY3RUZXh0KHMsbCx0KToKICAgICAgICAgICAgdFs6XSA9IFtzW3QucG9wKCdfb3JpZ2luYWxfc3RhcnQnKTp0LnBvcCgnX29yaWdpbmFsX2VuZCcpXV0KICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbihleHRyYWN0VGV4dCkKICAgIG1hdGNoRXhwci5pZ25vcmVFeHBycyA9IGV4cHIuaWdub3JlRXhwcnMKICAgIHJldHVybiBtYXRjaEV4cHIKCmRlZiB1bmdyb3VwKGV4cHIpOiAKICAgICIiIgogICAgSGVscGVyIHRvIHVuZG8gcHlwYXJzaW5nJ3MgZGVmYXVsdCBncm91cGluZyBvZiBBbmQgZXhwcmVzc2lvbnMsIGV2ZW4KICAgIGlmIGFsbCBidXQgb25lIGFyZSBub24tZW1wdHkuCiAgICAiIiIKICAgIHJldHVybiBUb2tlbkNvbnZlcnRlcihleHByKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdKQoKZGVmIGxvY2F0ZWRFeHByKGV4cHIpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVjb3JhdGUgYSByZXR1cm5lZCB0b2tlbiB3aXRoIGl0cyBzdGFydGluZyBhbmQgZW5kaW5nIGxvY2F0aW9ucyBpbiB0aGUgaW5wdXQgc3RyaW5nLgogICAgVGhpcyBoZWxwZXIgYWRkcyB0aGUgZm9sbG93aW5nIHJlc3VsdHMgbmFtZXM6CiAgICAgLSBsb2NuX3N0YXJ0ID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGJlZ2lucwogICAgIC0gbG9jbl9lbmQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gZW5kcwogICAgIC0gdmFsdWUgPSB0aGUgYWN0dWFsIHBhcnNlZCByZXN1bHRzCgogICAgQmUgY2FyZWZ1bCBpZiB0aGUgaW5wdXQgdGV4dCBjb250YWlucyBDezxUQUI+fSBjaGFyYWN0ZXJzLCB5b3UgbWF5IHdhbnQgdG8gY2FsbAogICAgQ3tMe1BhcnNlckVsZW1lbnQucGFyc2VXaXRoVGFic319CgogICAgRXhhbXBsZTo6CiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykKICAgICAgICBmb3IgbWF0Y2ggaW4gbG9jYXRlZEV4cHIod2QpLnNlYXJjaFN0cmluZygibGpzZGYxMjNsa3NkampmMTIzbGtramoxMjIyIik6CiAgICAgICAgICAgIHByaW50KG1hdGNoKQogICAgcHJpbnRzOjoKICAgICAgICBbWzAsICdsanNkZicsIDVdXQogICAgICAgIFtbOCwgJ2xrc2RqamYnLCAxNV1dCiAgICAgICAgW1sxOCwgJ2xra2pqJywgMjNdXQogICAgIiIiCiAgICBsb2NhdG9yID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6IGwpCiAgICByZXR1cm4gR3JvdXAobG9jYXRvcigibG9jbl9zdGFydCIpICsgZXhwcigidmFsdWUiKSArIGxvY2F0b3IuY29weSgpLmxlYXZlV2hpdGVzcGFjZSgpKCJsb2NuX2VuZCIpKQoKCiMgY29udmVuaWVuY2UgY29uc3RhbnRzIGZvciBwb3NpdGlvbmFsIGV4cHJlc3Npb25zCmVtcHR5ICAgICAgID0gRW1wdHkoKS5zZXROYW1lKCJlbXB0eSIpCmxpbmVTdGFydCAgID0gTGluZVN0YXJ0KCkuc2V0TmFtZSgibGluZVN0YXJ0IikKbGluZUVuZCAgICAgPSBMaW5lRW5kKCkuc2V0TmFtZSgibGluZUVuZCIpCnN0cmluZ1N0YXJ0ID0gU3RyaW5nU3RhcnQoKS5zZXROYW1lKCJzdHJpbmdTdGFydCIpCnN0cmluZ0VuZCAgID0gU3RyaW5nRW5kKCkuc2V0TmFtZSgic3RyaW5nRW5kIikKCl9lc2NhcGVkUHVuYyA9IFdvcmQoIF9ic2xhc2gsIHIiXFtdLSouJCtePygpfiAiLCBleGFjdD0yICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF1bMV0pCl9lc2NhcGVkSGV4Q2hhciA9IFJlZ2V4KHIiXFwwP1t4WF1bMC05YS1mQS1GXSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdLmxzdHJpcChyJ1wweCcpLDE2KSkpCl9lc2NhcGVkT2N0Q2hhciA9IFJlZ2V4KHIiXFwwWzAtN10rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXVsxOl0sOCkpKQpfc2luZ2xlQ2hhciA9IF9lc2NhcGVkUHVuYyB8IF9lc2NhcGVkSGV4Q2hhciB8IF9lc2NhcGVkT2N0Q2hhciB8IFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPXInXF0nLCBleGFjdD0xKSB8IFJlZ2V4KHIiXHciLCByZS5VTklDT0RFKQpfY2hhclJhbmdlID0gR3JvdXAoX3NpbmdsZUNoYXIgKyBTdXBwcmVzcygiLSIpICsgX3NpbmdsZUNoYXIpCl9yZUJyYWNrZXRFeHByID0gTGl0ZXJhbCgiWyIpICsgT3B0aW9uYWwoIl4iKS5zZXRSZXN1bHRzTmFtZSgibmVnYXRlIikgKyBHcm91cCggT25lT3JNb3JlKCBfY2hhclJhbmdlIHwgX3NpbmdsZUNoYXIgKSApLnNldFJlc3VsdHNOYW1lKCJib2R5IikgKyAiXSIKCmRlZiBzcmFuZ2Uocyk6CiAgICByIiIiCiAgICBIZWxwZXIgdG8gZWFzaWx5IGRlZmluZSBzdHJpbmcgcmFuZ2VzIGZvciB1c2UgaW4gV29yZCBjb25zdHJ1Y3Rpb24uICBCb3Jyb3dzCiAgICBzeW50YXggZnJvbSByZWdleHAgJ1tdJyBzdHJpbmcgcmFuZ2UgZGVmaW5pdGlvbnM6OgogICAgICAgIHNyYW5nZSgiWzAtOV0iKSAgIC0+ICIwMTIzNDU2Nzg5IgogICAgICAgIHNyYW5nZSgiW2Etel0iKSAgIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKICAgICAgICBzcmFuZ2UoIlthLXokX10iKSAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXokXyIKICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBlbmNsb3NlZCBpbiBbXSdzLCBhbmQgdGhlIHJldHVybmVkIHN0cmluZyBpcyB0aGUgZXhwYW5kZWQKICAgIGNoYXJhY3RlciBzZXQgam9pbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nLgogICAgVGhlIHZhbHVlcyBlbmNsb3NlZCBpbiB0aGUgW10ncyBtYXkgYmU6CiAgICAgLSBhIHNpbmdsZSBjaGFyYWN0ZXIKICAgICAtIGFuIGVzY2FwZWQgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIGJhY2tzbGFzaCAoc3VjaCBhcyBDe1wtfSBvciBDe1xdfSkKICAgICAtIGFuIGVzY2FwZWQgaGV4IGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydceCd9IChDe1x4MjF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpIAogICAgICAgICAoQ3tcMHgjI30gaXMgYWxzbyBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSAKICAgICAtIGFuIGVzY2FwZWQgb2N0YWwgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1wwJ30gKEN7XDA0MX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikKICAgICAtIGEgcmFuZ2Ugb2YgYW55IG9mIHRoZSBhYm92ZSwgc2VwYXJhdGVkIGJ5IGEgZGFzaCAoQ3snYS16J30sIGV0Yy4pCiAgICAgLSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGFib3ZlIChDeydhZWlvdXknfSwgQ3snYS16QS1aMC05XyQnfSwgZXRjLikKICAgICIiIgogICAgX2V4cGFuZGVkID0gbGFtYmRhIHA6IHAgaWYgbm90IGlzaW5zdGFuY2UocCxQYXJzZVJlc3VsdHMpIGVsc2UgJycuam9pbih1bmljaHIoYykgZm9yIGMgaW4gcmFuZ2Uob3JkKHBbMF0pLG9yZChwWzFdKSsxKSkKICAgIHRyeToKICAgICAgICByZXR1cm4gIiIuam9pbihfZXhwYW5kZWQocGFydCkgZm9yIHBhcnQgaW4gX3JlQnJhY2tldEV4cHIucGFyc2VTdHJpbmcocykuYm9keSkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcmV0dXJuICIiCgpkZWYgbWF0Y2hPbmx5QXRDb2wobik6CiAgICAiIiIKICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHBhcnNlIGFjdGlvbnMgdGhhdCByZXF1aXJlIG1hdGNoaW5nIGF0IGEgc3BlY2lmaWMKICAgIGNvbHVtbiBpbiB0aGUgaW5wdXQgdGV4dC4KICAgICIiIgogICAgZGVmIHZlcmlmeUNvbChzdHJnLGxvY24sdG9rcyk6CiAgICAgICAgaWYgY29sKGxvY24sc3RyZykgIT0gbjoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oc3RyZyxsb2NuLCJtYXRjaGVkIHRva2VuIG5vdCBhdCBjb2x1bW4gJWQiICUgbikKICAgIHJldHVybiB2ZXJpZnlDb2wKCmRlZiByZXBsYWNlV2l0aChyZXBsU3RyKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgY29tbW9uIHBhcnNlIGFjdGlvbnMgdGhhdCBzaW1wbHkgcmV0dXJuIGEgbGl0ZXJhbCB2YWx1ZS4gIEVzcGVjaWFsbHkKICAgIHVzZWZ1bCB3aGVuIHVzZWQgd2l0aCBDe0x7dHJhbnNmb3JtU3RyaW5nPFBhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nPn0oKX0uCgogICAgRXhhbXBsZTo6CiAgICAgICAgbnVtID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQogICAgICAgIG5hID0gb25lT2YoIk4vQSBOQSIpLnNldFBhcnNlQWN0aW9uKHJlcGxhY2VXaXRoKG1hdGgubmFuKSkKICAgICAgICB0ZXJtID0gbmEgfCBudW0KICAgICAgICAKICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoIjMyNCAyMzQgTi9BIDIzNCIpICMgLT4gWzMyNCwgMjM0LCBuYW4sIDIzNF0KICAgICIiIgogICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogW3JlcGxTdHJdCgpkZWYgcmVtb3ZlUXVvdGVzKHMsbCx0KToKICAgICIiIgogICAgSGVscGVyIHBhcnNlIGFjdGlvbiBmb3IgcmVtb3ZpbmcgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHF1b3RlZCBzdHJpbmdzLgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgYnkgZGVmYXVsdCwgcXVvdGF0aW9uIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiBwYXJzZWQgcmVzdWx0cwogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIl0KCiAgICAgICAgIyB1c2UgcmVtb3ZlUXVvdGVzIHRvIHN0cmlwIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCByZXN1bHRzCiAgICAgICAgcXVvdGVkU3RyaW5nLnNldFBhcnNlQWN0aW9uKHJlbW92ZVF1b3RlcykKICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQiXQogICAgIiIiCiAgICByZXR1cm4gdFswXVsxOi0xXQoKZGVmIHRva2VuTWFwKGZ1bmMsICphcmdzKToKICAgICIiIgogICAgSGVscGVyIHRvIGRlZmluZSBhIHBhcnNlIGFjdGlvbiBieSBtYXBwaW5nIGEgZnVuY3Rpb24gdG8gYWxsIGVsZW1lbnRzIG9mIGEgUGFyc2VSZXN1bHRzIGxpc3QuSWYgYW55IGFkZGl0aW9uYWwgCiAgICBhcmdzIGFyZSBwYXNzZWQsIHRoZXkgYXJlIGZvcndhcmRlZCB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIKICAgIHRoZSB0b2tlbiwgYXMgaW4gQ3toZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpfSwgd2hpY2ggd2lsbCBjb252ZXJ0IHRoZQogICAgcGFyc2VkIGRhdGEgdG8gYW4gaW50ZWdlciB1c2luZyBiYXNlIDE2LgoKICAgIEV4YW1wbGUgKGNvbXBhcmUgdGhlIGxhc3QgdG8gZXhhbXBsZSBpbiBMe1BhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nfTo6CiAgICAgICAgaGV4X2ludHMgPSBPbmVPck1vcmUoV29yZChoZXhudW1zKSkuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpCiAgICAgICAgaGV4X2ludHMucnVuVGVzdHMoJycnCiAgICAgICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhCiAgICAgICAgICAgICcnJykKICAgICAgICAKICAgICAgICB1cHBlcndvcmQgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnVwcGVyKSkKICAgICAgICBPbmVPck1vcmUodXBwZXJ3b3JkKS5ydW5UZXN0cygnJycKICAgICAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQogICAgICAgICAgICAnJycpCgogICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci50aXRsZSkpCiAgICAgICAgT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikucnVuVGVzdHMoJycnCiAgICAgICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsKICAgICAgICAgICAgJycnKQogICAgcHJpbnRzOjoKICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQogICAgICAgIFswLCAxNywgMzQsIDE3MCwgMjU1LCAxMCwgMTMsIDI2XQoKICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlCiAgICAgICAgWydNWScsICdLSU5HRE9NJywgJ0ZPUicsICdBJywgJ0hPUlNFJ10KCiAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yawogICAgICAgIFsnTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yayddCiAgICAiIiIKICAgIGRlZiBwYShzLGwsdCk6CiAgICAgICAgcmV0dXJuIFtmdW5jKHRva24sICphcmdzKSBmb3IgdG9rbiBpbiB0XQoKICAgIHRyeToKICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQogICAgcGEuX19uYW1lX18gPSBmdW5jX25hbWUKCiAgICByZXR1cm4gcGEKCnVwY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi51cGNhc2VUb2tlbnN9IiIiCgpkb3duY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5kb3duY2FzZVRva2Vuc30iIiIKICAgIApkZWYgX21ha2VUYWdzKHRhZ1N0ciwgeG1sKToKICAgICIiIkludGVybmFsIGhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMsIGdpdmVuIGEgdGFnIG5hbWUiIiIKICAgIGlmIGlzaW5zdGFuY2UodGFnU3RyLGJhc2VzdHJpbmcpOgogICAgICAgIHJlc25hbWUgPSB0YWdTdHIKICAgICAgICB0YWdTdHIgPSBLZXl3b3JkKHRhZ1N0ciwgY2FzZWxlc3M9bm90IHhtbCkKICAgIGVsc2U6CiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0ci5uYW1lCgogICAgdGFnQXR0ck5hbWUgPSBXb3JkKGFscGhhcyxhbHBoYW51bXMrIl8tOiIpCiAgICBpZiAoeG1sKToKICAgICAgICB0YWdBdHRyVmFsdWUgPSBkYmxRdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwKICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUgKyBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkpKSArIFwKICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQogICAgZWxzZToKICAgICAgICBwcmludGFibGVzTGVzc1JBYnJhY2sgPSAiIi5qb2luKGMgZm9yIGMgaW4gcHJpbnRhYmxlcyBpZiBjIG5vdCBpbiAiPiIpCiAgICAgICAgdGFnQXR0clZhbHVlID0gcXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkgfCBXb3JkKHByaW50YWJsZXNMZXNzUkFicmFjaykKICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lLnNldFBhcnNlQWN0aW9uKGRvd25jYXNlVG9rZW5zKSArIFwKICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkgKSkpICsgXAogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpCiAgICBjbG9zZVRhZyA9IENvbWJpbmUoX0woIjwvIikgKyB0YWdTdHIgKyAiPiIpCgogICAgb3BlblRhZyA9IG9wZW5UYWcuc2V0UmVzdWx0c05hbWUoInN0YXJ0IisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8JXM+IiAlIHJlc25hbWUpCiAgICBjbG9zZVRhZyA9IGNsb3NlVGFnLnNldFJlc3VsdHNOYW1lKCJlbmQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwvJXM+IiAlIHJlc25hbWUpCiAgICBvcGVuVGFnLnRhZyA9IHJlc25hbWUKICAgIGNsb3NlVGFnLnRhZyA9IHJlc25hbWUKICAgIHJldHVybiBvcGVuVGFnLCBjbG9zZVRhZwoKZGVmIG1ha2VIVE1MVGFncyh0YWdTdHIpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBIVE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzCiAgICB0YWdzIGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLCBhdHRyaWJ1dGVzIHdpdGggbmFtZXNwYWNlcyBhbmQgd2l0aCBxdW90ZWQgb3IgdW5xdW90ZWQgdmFsdWVzLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicKICAgICAgICAjIG1ha2VIVE1MVGFncyByZXR1cm5zIHB5cGFyc2luZyBleHByZXNzaW9ucyBmb3IgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFncyBhcyBhIDItdHVwbGUKICAgICAgICBhLGFfZW5kID0gbWFrZUhUTUxUYWdzKCJBIikKICAgICAgICBsaW5rX2V4cHIgPSBhICsgU2tpcFRvKGFfZW5kKSgibGlua190ZXh0IikgKyBhX2VuZAogICAgICAgIAogICAgICAgIGZvciBsaW5rIGluIGxpbmtfZXhwci5zZWFyY2hTdHJpbmcodGV4dCk6CiAgICAgICAgICAgICMgYXR0cmlidXRlcyBpbiB0aGUgPEE+IHRhZyAobGlrZSAiaHJlZiIgc2hvd24gaGVyZSkgYXJlIGFsc28gYWNjZXNzaWJsZSBhcyBuYW1lZCByZXN1bHRzCiAgICAgICAgICAgIHByaW50KGxpbmsubGlua190ZXh0LCAnLT4nLCBsaW5rLmhyZWYpCiAgICBwcmludHM6OgogICAgICAgIHB5cGFyc2luZyAtPiBodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tCiAgICAiIiIKICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgRmFsc2UgKQoKZGVmIG1ha2VYTUxUYWdzKHRhZ1N0cik6CiAgICAiIiIKICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIFhNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcwogICAgdGFncyBvbmx5IGluIHRoZSBnaXZlbiB1cHBlci9sb3dlciBjYXNlLgoKICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHttYWtlSFRNTFRhZ3N9CiAgICAiIiIKICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgVHJ1ZSApCgpkZWYgd2l0aEF0dHJpYnV0ZSgqYXJncywqKmF0dHJEaWN0KToKICAgICIiIgogICAgSGVscGVyIHRvIGNyZWF0ZSBhIHZhbGlkYXRpbmcgcGFyc2UgYWN0aW9uIHRvIGJlIHVzZWQgd2l0aCBzdGFydCB0YWdzIGNyZWF0ZWQKICAgIHdpdGggQ3tMe21ha2VYTUxUYWdzfX0gb3IgQ3tMe21ha2VIVE1MVGFnc319LiBVc2UgQ3t3aXRoQXR0cmlidXRlfSB0byBxdWFsaWZ5IGEgc3RhcnRpbmcgdGFnCiAgICB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIHZhbHVlLCB0byBhdm9pZCBmYWxzZSBtYXRjaGVzIG9uIGNvbW1vbiB0YWdzIHN1Y2ggYXMKICAgIEN7PFREPn0gb3IgQ3s8RElWPn0uCgogICAgQ2FsbCBDe3dpdGhBdHRyaWJ1dGV9IHdpdGggYSBzZXJpZXMgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMuIFNwZWNpZnkgdGhlIGxpc3QKICAgIG9mIGZpbHRlciBhdHRyaWJ1dGVzIG5hbWVzIGFuZCB2YWx1ZXMgYXM6CiAgICAgLSBrZXl3b3JkIGFyZ3VtZW50cywgYXMgaW4gQ3soYWxpZ249InJpZ2h0Iil9LCBvcgogICAgIC0gYXMgYW4gZXhwbGljaXQgZGljdCB3aXRoIEN7Kip9IG9wZXJhdG9yLCB3aGVuIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFsc28gYSBQeXRob24KICAgICAgICAgIHJlc2VydmVkIHdvcmQsIGFzIGluIEN7Kip7ImNsYXNzIjoiQ3VzdG9tZXIiLCAiYWxpZ24iOiJyaWdodCJ9fQogICAgIC0gYSBsaXN0IG9mIG5hbWUtdmFsdWUgdHVwbGVzLCBhcyBpbiAoICgibnMxOmNsYXNzIiwgIkN1c3RvbWVyIiksICgibnMyOmFsaWduIiwicmlnaHQiKSApCiAgICBGb3IgYXR0cmlidXRlIG5hbWVzIHdpdGggYSBuYW1lc3BhY2UgcHJlZml4LCB5b3UgbXVzdCB1c2UgdGhlIHNlY29uZCBmb3JtLiAgQXR0cmlidXRlCiAgICBuYW1lcyBhcmUgbWF0Y2hlZCBpbnNlbnNpdGl2ZSB0byB1cHBlci9sb3dlciBjYXNlLgogICAgICAgCiAgICBJZiBqdXN0IHRlc3RpbmcgZm9yIEN7Y2xhc3N9ICh3aXRoIG9yIHdpdGhvdXQgYSBuYW1lc3BhY2UpLCB1c2UgQ3tMe3dpdGhDbGFzc319LgoKICAgIFRvIHZlcmlmeSB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzLCBidXQgd2l0aG91dCBzcGVjaWZ5aW5nIGEgdmFsdWUsIHBhc3MKICAgIEN7d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUV9IGFzIHRoZSB2YWx1ZS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBodG1sID0gJycnCiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIFNvbWUgdGV4dAogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyaWQiPjEgNCAwIDEgMDwvZGl2PgogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2PgogICAgICAgICAgICA8ZGl2PnRoaXMgaGFzIG5vIHR5cGU8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAKICAgICAgICAnJycKICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikKCiAgICAgICAgIyBvbmx5IG1hdGNoIGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAiZ3JpZCIKICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT0iZ3JpZCIpKQogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikKICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToKICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkKICAgICAgICAKICAgICAgICAjIGNvbnN0cnVjdCBhIG1hdGNoIHdpdGggYW55IGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPXdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkKICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOgogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpCiAgICBwcmludHM6OgogICAgICAgIDEgNCAwIDEgMAoKICAgICAgICAxIDQgMCAxIDAKICAgICAgICAxLDMgMiwzIDEsMQogICAgIiIiCiAgICBpZiBhcmdzOgogICAgICAgIGF0dHJzID0gYXJnc1s6XQogICAgZWxzZToKICAgICAgICBhdHRycyA9IGF0dHJEaWN0Lml0ZW1zKCkKICAgIGF0dHJzID0gWyhrLHYpIGZvciBrLHYgaW4gYXR0cnNdCiAgICBkZWYgcGEocyxsLHRva2Vucyk6CiAgICAgICAgZm9yIGF0dHJOYW1lLGF0dHJWYWx1ZSBpbiBhdHRyczoKICAgICAgICAgICAgaWYgYXR0ck5hbWUgbm90IGluIHRva2VuczoKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm8gbWF0Y2hpbmcgYXR0cmlidXRlICIgKyBhdHRyTmFtZSkKICAgICAgICAgICAgaWYgYXR0clZhbHVlICE9IHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFIGFuZCB0b2tlbnNbYXR0ck5hbWVdICE9IGF0dHJWYWx1ZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiYXR0cmlidXRlICclcycgaGFzIHZhbHVlICclcycsIG11c3QgYmUgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRyTmFtZSwgdG9rZW5zW2F0dHJOYW1lXSwgYXR0clZhbHVlKSkKICAgIHJldHVybiBwYQp3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSA9IG9iamVjdCgpCgpkZWYgd2l0aENsYXNzKGNsYXNzbmFtZSwgbmFtZXNwYWNlPScnKToKICAgICIiIgogICAgU2ltcGxpZmllZCB2ZXJzaW9uIG9mIEN7THt3aXRoQXR0cmlidXRlfX0gd2hlbiBtYXRjaGluZyBvbiBhIGRpdiBjbGFzcyAtIG1hZGUKICAgIGRpZmZpY3VsdCBiZWNhdXNlIEN7Y2xhc3N9IGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQeXRob24uCgogICAgRXhhbXBsZTo6CiAgICAgICAgaHRtbCA9ICcnJwogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICBTb21lIHRleHQKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2PgogICAgICAgICAgICA8ZGl2PnRoaXMgJmx0O2RpdiZndDsgaGFzIG5vIGNsYXNzPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgCiAgICAgICAgJycnCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpCiAgICAgICAgZGl2X2dyaWQgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3MoImdyaWQiKSkKICAgICAgICAKICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6CiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpCiAgICAgICAgCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkKICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOgogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpCiAgICBwcmludHM6OgogICAgICAgIDEgNCAwIDEgMAoKICAgICAgICAxIDQgMCAxIDAKICAgICAgICAxLDMgMiwzIDEsMQogICAgIiIiCiAgICBjbGFzc2F0dHIgPSAiJXM6Y2xhc3MiICUgbmFtZXNwYWNlIGlmIG5hbWVzcGFjZSBlbHNlICJjbGFzcyIKICAgIHJldHVybiB3aXRoQXR0cmlidXRlKCoqe2NsYXNzYXR0ciA6IGNsYXNzbmFtZX0pICAgICAgICAKCm9wQXNzb2MgPSBfQ29uc3RhbnRzKCkKb3BBc3NvYy5MRUZUID0gb2JqZWN0KCkKb3BBc3NvYy5SSUdIVCA9IG9iamVjdCgpCgpkZWYgaW5maXhOb3RhdGlvbiggYmFzZUV4cHIsIG9wTGlzdCwgbHBhcj1TdXBwcmVzcygnKCcpLCBycGFyPVN1cHByZXNzKCcpJykgKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGdyYW1tYXJzIG9mIGV4cHJlc3Npb25zIG1hZGUgdXAgb2YKICAgIG9wZXJhdG9ycyB3b3JraW5nIGluIGEgcHJlY2VkZW5jZSBoaWVyYXJjaHkuICBPcGVyYXRvcnMgbWF5IGJlIHVuYXJ5IG9yCiAgICBiaW5hcnksIGxlZnQtIG9yIHJpZ2h0LWFzc29jaWF0aXZlLiAgUGFyc2UgYWN0aW9ucyBjYW4gYWxzbyBiZSBhdHRhY2hlZAogICAgdG8gb3BlcmF0b3IgZXhwcmVzc2lvbnMuIFRoZSBnZW5lcmF0ZWQgcGFyc2VyIHdpbGwgYWxzbyByZWNvZ25pemUgdGhlIHVzZSAKICAgIG9mIHBhcmVudGhlc2VzIHRvIG92ZXJyaWRlIG9wZXJhdG9yIHByZWNlZGVuY2VzIChzZWUgZXhhbXBsZSBiZWxvdykuCiAgICAKICAgIE5vdGU6IGlmIHlvdSBkZWZpbmUgYSBkZWVwIG9wZXJhdG9yIGxpc3QsIHlvdSBtYXkgc2VlIHBlcmZvcm1hbmNlIGlzc3VlcwogICAgd2hlbiB1c2luZyBpbmZpeE5vdGF0aW9uLiBTZWUgTHtQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXR9IGZvciBhCiAgICBtZWNoYW5pc20gdG8gcG90ZW50aWFsbHkgaW1wcm92ZSB5b3VyIHBhcnNlciBwZXJmb3JtYW5jZS4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gYmFzZUV4cHIgLSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgbW9zdCBiYXNpYyBlbGVtZW50IGZvciB0aGUgbmVzdGVkCiAgICAgLSBvcExpc3QgLSBsaXN0IG9mIHR1cGxlcywgb25lIGZvciBlYWNoIG9wZXJhdG9yIHByZWNlZGVuY2UgbGV2ZWwgaW4gdGhlCiAgICAgIGV4cHJlc3Npb24gZ3JhbW1hcjsgZWFjaCB0dXBsZSBpcyBvZiB0aGUgZm9ybQogICAgICAob3BFeHByLCBudW1UZXJtcywgcmlnaHRMZWZ0QXNzb2MsIHBhcnNlQWN0aW9uKSwgd2hlcmU6CiAgICAgICAtIG9wRXhwciBpcyB0aGUgcHlwYXJzaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvcGVyYXRvcjsKICAgICAgICAgIG1heSBhbHNvIGJlIGEgc3RyaW5nLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIExpdGVyYWw7CiAgICAgICAgICBpZiBudW1UZXJtcyBpcyAzLCBvcEV4cHIgaXMgYSB0dXBsZSBvZiB0d28gZXhwcmVzc2lvbnMsIGZvciB0aGUKICAgICAgICAgIHR3byBvcGVyYXRvcnMgc2VwYXJhdGluZyB0aGUgMyB0ZXJtcwogICAgICAgLSBudW1UZXJtcyBpcyB0aGUgbnVtYmVyIG9mIHRlcm1zIGZvciB0aGlzIG9wZXJhdG9yIChtdXN0CiAgICAgICAgICBiZSAxLCAyLCBvciAzKQogICAgICAgLSByaWdodExlZnRBc3NvYyBpcyB0aGUgaW5kaWNhdG9yIHdoZXRoZXIgdGhlIG9wZXJhdG9yIGlzCiAgICAgICAgICByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZlLCB1c2luZyB0aGUgcHlwYXJzaW5nLWRlZmluZWQKICAgICAgICAgIGNvbnN0YW50cyBDe29wQXNzb2MuUklHSFR9IGFuZCBDe29wQXNzb2MuTEVGVH0uCiAgICAgICAtIHBhcnNlQWN0aW9uIGlzIHRoZSBwYXJzZSBhY3Rpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgICBleHByZXNzaW9ucyBtYXRjaGluZyB0aGlzIG9wZXJhdG9yIGV4cHJlc3Npb24gKHRoZQogICAgICAgICAgcGFyc2UgYWN0aW9uIHR1cGxlIG1lbWJlciBtYXkgYmUgb21pdHRlZCkKICAgICAtIGxwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyBsZWZ0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJygnKX0pCiAgICAgLSBycGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgcmlnaHQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKScpfSkKCiAgICBFeGFtcGxlOjoKICAgICAgICAjIHNpbXBsZSBleGFtcGxlIG9mIGZvdXItZnVuY3Rpb24gYXJpdGhtZXRpYyB3aXRoIGludHMgYW5kIHZhcmlhYmxlIG5hbWVzCiAgICAgICAgaW50ZWdlciA9IHB5cGFyc2luZ19jb21tb24uc2lnbmVkX2ludGVnZXIKICAgICAgICB2YXJuYW1lID0gcHlwYXJzaW5nX2NvbW1vbi5pZGVudGlmaWVyIAogICAgICAgIAogICAgICAgIGFyaXRoX2V4cHIgPSBpbmZpeE5vdGF0aW9uKGludGVnZXIgfCB2YXJuYW1lLAogICAgICAgICAgICBbCiAgICAgICAgICAgICgnLScsIDEsIG9wQXNzb2MuUklHSFQpLAogICAgICAgICAgICAob25lT2YoJyogLycpLCAyLCBvcEFzc29jLkxFRlQpLAogICAgICAgICAgICAob25lT2YoJysgLScpLCAyLCBvcEFzc29jLkxFRlQpLAogICAgICAgICAgICBdKQogICAgICAgIAogICAgICAgIGFyaXRoX2V4cHIucnVuVGVzdHMoJycnCiAgICAgICAgICAgIDUrMyo2CiAgICAgICAgICAgICg1KzMpKjYKICAgICAgICAgICAgLTItLTExCiAgICAgICAgICAgICcnJywgZnVsbER1bXA9RmFsc2UpCiAgICBwcmludHM6OgogICAgICAgIDUrMyo2CiAgICAgICAgW1s1LCAnKycsIFszLCAnKicsIDZdXV0KCiAgICAgICAgKDUrMykqNgogICAgICAgIFtbWzUsICcrJywgM10sICcqJywgNl1dCgogICAgICAgIC0yLS0xMQogICAgICAgIFtbWyctJywgMl0sICctJywgWyctJywgMTFdXV0KICAgICIiIgogICAgcmV0ID0gRm9yd2FyZCgpCiAgICBsYXN0RXhwciA9IGJhc2VFeHByIHwgKCBscGFyICsgcmV0ICsgcnBhciApCiAgICBmb3IgaSxvcGVyRGVmIGluIGVudW1lcmF0ZShvcExpc3QpOgogICAgICAgIG9wRXhwcixhcml0eSxyaWdodExlZnRBc3NvYyxwYSA9IChvcGVyRGVmICsgKE5vbmUsKSlbOjRdCiAgICAgICAgdGVybU5hbWUgPSAiJXMgdGVybSIgJSBvcEV4cHIgaWYgYXJpdHkgPCAzIGVsc2UgIiVzJXMgdGVybSIgJSBvcEV4cHIKICAgICAgICBpZiBhcml0eSA9PSAzOgogICAgICAgICAgICBpZiBvcEV4cHIgaXMgTm9uZSBvciBsZW4ob3BFeHByKSAhPSAyOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWYgbnVtdGVybXM9Mywgb3BFeHByIG11c3QgYmUgYSB0dXBsZSBvciBsaXN0IG9mIHR3byBleHByZXNzaW9ucyIpCiAgICAgICAgICAgIG9wRXhwcjEsIG9wRXhwcjIgPSBvcEV4cHIKICAgICAgICB0aGlzRXhwciA9IEZvcndhcmQoKS5zZXROYW1lKHRlcm1OYW1lKQogICAgICAgIGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuTEVGVDoKICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToKICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKSApCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoKICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyBsYXN0RXhwciApICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwcitsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUobGFzdEV4cHIpICkKICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOgogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwcikgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikKICAgICAgICBlbGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuUklHSFQ6CiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6CiAgICAgICAgICAgICAgICAjIHRyeSB0byBhdm9pZCBMUiB3aXRoIHRoaXMgZXh0cmEgdGVzdAogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3BFeHByLCBPcHRpb25hbCk6CiAgICAgICAgICAgICAgICAgICAgb3BFeHByID0gT3B0aW9uYWwob3BFeHByKQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShvcEV4cHIuZXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBvcEV4cHIgKyB0aGlzRXhwciApCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoKICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyB0aGlzRXhwciApICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggdGhpc0V4cHIgKSApCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoKICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIpICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBpbmRpY2F0ZSByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZpdHkiKQogICAgICAgIGlmIHBhOgogICAgICAgICAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oIHBhICkKICAgICAgICB0aGlzRXhwciA8PD0gKCBtYXRjaEV4cHIuc2V0TmFtZSh0ZXJtTmFtZSkgfCBsYXN0RXhwciApCiAgICAgICAgbGFzdEV4cHIgPSB0aGlzRXhwcgogICAgcmV0IDw8PSBsYXN0RXhwcgogICAgcmV0dXJuIHJldAoKb3BlcmF0b3JQcmVjZWRlbmNlID0gaW5maXhOb3RhdGlvbgoiIiIoRGVwcmVjYXRlZCkgRm9ybWVyIG5hbWUgb2YgQ3tMe2luZml4Tm90YXRpb259fSwgd2lsbCBiZSBkcm9wcGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIiIiCgpkYmxRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJykuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMiKQpzZ2xRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMiKQpxdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJ3wKICAgICAgICAgICAgICAgICAgICAgICBSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInF1b3RlZFN0cmluZyB1c2luZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyIpCnVuaWNvZGVTdHJpbmcgPSBDb21iaW5lKF9MKCd1JykgKyBxdW90ZWRTdHJpbmcuY29weSgpKS5zZXROYW1lKCJ1bmljb2RlIHN0cmluZyBsaXRlcmFsIikKCmRlZiBuZXN0ZWRFeHByKG9wZW5lcj0iKCIsIGNsb3Nlcj0iKSIsIGNvbnRlbnQ9Tm9uZSwgaWdub3JlRXhwcj1xdW90ZWRTdHJpbmcuY29weSgpKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgbmVzdGVkIGxpc3RzIGVuY2xvc2VkIGluIG9wZW5pbmcgYW5kIGNsb3NpbmcKICAgIGRlbGltaXRlcnMgKCIoIiBhbmQgIikiIGFyZSB0aGUgZGVmYXVsdCkuCgogICAgUGFyYW1ldGVyczoKICAgICAtIG9wZW5lciAtIG9wZW5pbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IigifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24KICAgICAtIGNsb3NlciAtIGNsb3NpbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IikifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24KICAgICAtIGNvbnRlbnQgLSBleHByZXNzaW9uIGZvciBpdGVtcyB3aXRoaW4gdGhlIG5lc3RlZCBsaXN0cyAoZGVmYXVsdD1De05vbmV9KQogICAgIC0gaWdub3JlRXhwciAtIGV4cHJlc3Npb24gZm9yIGlnbm9yaW5nIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyAoZGVmYXVsdD1De3F1b3RlZFN0cmluZ30pCgogICAgSWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgcHJvdmlkZWQgZm9yIHRoZSBjb250ZW50IGFyZ3VtZW50LCB0aGUgbmVzdGVkCiAgICBleHByZXNzaW9uIHdpbGwgY2FwdHVyZSBhbGwgd2hpdGVzcGFjZS1kZWxpbWl0ZWQgY29udGVudCBiZXR3ZWVuIGRlbGltaXRlcnMKICAgIGFzIGEgbGlzdCBvZiBzZXBhcmF0ZSB2YWx1ZXMuCgogICAgVXNlIHRoZSBDe2lnbm9yZUV4cHJ9IGFyZ3VtZW50IHRvIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IG1heSBjb250YWluCiAgICBvcGVuaW5nIG9yIGNsb3NpbmcgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBvcGVuaW5nCiAgICBvciBjbG9zaW5nIGNoYXJhY3RlcnMgZm9yIG5lc3RpbmcsIHN1Y2ggYXMgcXVvdGVkU3RyaW5nIG9yIGEgY29tbWVudAogICAgZXhwcmVzc2lvbi4gIFNwZWNpZnkgbXVsdGlwbGUgZXhwcmVzc2lvbnMgdXNpbmcgYW4gQ3tMe09yfX0gb3IgQ3tMe01hdGNoRmlyc3R9fS4KICAgIFRoZSBkZWZhdWx0IGlzIEx7cXVvdGVkU3RyaW5nfSwgYnV0IGlmIG5vIGV4cHJlc3Npb25zIGFyZSB0byBiZSBpZ25vcmVkLAogICAgdGhlbiBwYXNzIEN7Tm9uZX0gZm9yIHRoaXMgYXJndW1lbnQuCgogICAgRXhhbXBsZTo6CiAgICAgICAgZGF0YV90eXBlID0gb25lT2YoInZvaWQgaW50IHNob3J0IGxvbmcgY2hhciBmbG9hdCBkb3VibGUiKQogICAgICAgIGRlY2xfZGF0YV90eXBlID0gQ29tYmluZShkYXRhX3R5cGUgKyBPcHRpb25hbChXb3JkKCcqJykpKQogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKQogICAgICAgIG51bWJlciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyCiAgICAgICAgYXJnID0gR3JvdXAoZGVjbF9kYXRhX3R5cGUgKyBpZGVudCkKICAgICAgICBMUEFSLFJQQVIgPSBtYXAoU3VwcHJlc3MsICIoKSIpCgogICAgICAgIGNvZGVfYm9keSA9IG5lc3RlZEV4cHIoJ3snLCAnfScsIGlnbm9yZUV4cHI9KHF1b3RlZFN0cmluZyB8IGNTdHlsZUNvbW1lbnQpKQoKICAgICAgICBjX2Z1bmN0aW9uID0gKGRlY2xfZGF0YV90eXBlKCJ0eXBlIikgCiAgICAgICAgICAgICAgICAgICAgICArIGlkZW50KCJuYW1lIikKICAgICAgICAgICAgICAgICAgICAgICsgTFBBUiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QoYXJnKSwgW10pKCJhcmdzIikgKyBSUEFSIAogICAgICAgICAgICAgICAgICAgICAgKyBjb2RlX2JvZHkoImJvZHkiKSkKICAgICAgICBjX2Z1bmN0aW9uLmlnbm9yZShjU3R5bGVDb21tZW50KQogICAgICAgIAogICAgICAgIHNvdXJjZV9jb2RlID0gJycnCiAgICAgICAgICAgIGludCBpc19vZGQoaW50IHgpIHsgCiAgICAgICAgICAgICAgICByZXR1cm4gKHglMik7IAogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaW50IGRlY190b19oZXgoY2hhciBoY2hhcikgeyAKICAgICAgICAgICAgICAgIGlmIChoY2hhciA+PSAnMCcgJiYgaGNoYXIgPD0gJzknKSB7IAogICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkKGhjaGFyKS1vcmQoJzAnKSk7IAogICAgICAgICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgxMCtvcmQoaGNoYXIpLW9yZCgnQScpKTsKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgIH0KICAgICAgICAnJycKICAgICAgICBmb3IgZnVuYyBpbiBjX2Z1bmN0aW9uLnNlYXJjaFN0cmluZyhzb3VyY2VfY29kZSk6CiAgICAgICAgICAgIHByaW50KCIlKG5hbWUpcyAoJSh0eXBlKXMpIGFyZ3M6ICUoYXJncylzIiAlIGZ1bmMpCgogICAgcHJpbnRzOjoKICAgICAgICBpc19vZGQgKGludCkgYXJnczogW1snaW50JywgJ3gnXV0KICAgICAgICBkZWNfdG9faGV4IChpbnQpIGFyZ3M6IFtbJ2NoYXInLCAnaGNoYXInXV0KICAgICIiIgogICAgaWYgb3BlbmVyID09IGNsb3NlcjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MgY2Fubm90IGJlIHRoZSBzYW1lIikKICAgIGlmIGNvbnRlbnQgaXMgTm9uZToKICAgICAgICBpZiBpc2luc3RhbmNlKG9wZW5lcixiYXNlc3RyaW5nKSBhbmQgaXNpbnN0YW5jZShjbG9zZXIsYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGlmIGxlbihvcGVuZXIpID09IDEgYW5kIGxlbihjbG9zZXIpPT0xOgogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5pZ25vcmVFeHByICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoZW1wdHkuY29weSgpK0NoYXJzTm90SW4ob3BlbmVyK2Nsb3NlcitQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBhcmd1bWVudHMgbXVzdCBiZSBzdHJpbmdzIGlmIG5vIGNvbnRlbnQgZXhwcmVzc2lvbiBpcyBnaXZlbiIpCiAgICByZXQgPSBGb3J3YXJkKCkKICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIGlnbm9yZUV4cHIgfCByZXQgfCBjb250ZW50ICkgKyBTdXBwcmVzcyhjbG9zZXIpICkKICAgIGVsc2U6CiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIHJldCB8IGNvbnRlbnQgKSAgKyBTdXBwcmVzcyhjbG9zZXIpICkKICAgIHJldC5zZXROYW1lKCduZXN0ZWQgJXMlcyBleHByZXNzaW9uJyAlIChvcGVuZXIsY2xvc2VyKSkKICAgIHJldHVybiByZXQKCmRlZiBpbmRlbnRlZEJsb2NrKGJsb2NrU3RhdGVtZW50RXhwciwgaW5kZW50U3RhY2ssIGluZGVudD1UcnVlKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgc3BhY2UtZGVsaW1pdGVkIGluZGVudGF0aW9uIGJsb2Nrcywgc3VjaCBhcwogICAgdGhvc2UgdXNlZCB0byBkZWZpbmUgYmxvY2sgc3RhdGVtZW50cyBpbiBQeXRob24gc291cmNlIGNvZGUuCgogICAgUGFyYW1ldGVyczoKICAgICAtIGJsb2NrU3RhdGVtZW50RXhwciAtIGV4cHJlc3Npb24gZGVmaW5pbmcgc3ludGF4IG9mIHN0YXRlbWVudCB0aGF0CiAgICAgICAgICAgIGlzIHJlcGVhdGVkIHdpdGhpbiB0aGUgaW5kZW50ZWQgYmxvY2sKICAgICAtIGluZGVudFN0YWNrIC0gbGlzdCBjcmVhdGVkIGJ5IGNhbGxlciB0byBtYW5hZ2UgaW5kZW50YXRpb24gc3RhY2sKICAgICAgICAgICAgKG11bHRpcGxlIHN0YXRlbWVudFdpdGhJbmRlbnRlZEJsb2NrIGV4cHJlc3Npb25zIHdpdGhpbiBhIHNpbmdsZSBncmFtbWFyCiAgICAgICAgICAgIHNob3VsZCBzaGFyZSBhIGNvbW1vbiBpbmRlbnRTdGFjaykKICAgICAtIGluZGVudCAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQgYmV5b25kIHRoZQogICAgICAgICAgICB0aGUgY3VycmVudCBsZXZlbDsgc2V0IHRvIEZhbHNlIGZvciBibG9jayBvZiBsZWZ0LW1vc3Qgc3RhdGVtZW50cwogICAgICAgICAgICAoZGVmYXVsdD1De1RydWV9KQoKICAgIEEgdmFsaWQgYmxvY2sgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBDe2Jsb2NrU3RhdGVtZW50fS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBkYXRhID0gJycnCiAgICAgICAgZGVmIEEoeik6CiAgICAgICAgICBBMQogICAgICAgICAgQiA9IDEwMAogICAgICAgICAgRyA9IEEyCiAgICAgICAgICBBMgogICAgICAgICAgQTMKICAgICAgICBCCiAgICAgICAgZGVmIEJCKGEsYixjKToKICAgICAgICAgIEJCMQogICAgICAgICAgZGVmIEJCQSgpOgogICAgICAgICAgICBiYmExCiAgICAgICAgICAgIGJiYTIKICAgICAgICAgICAgYmJhMwogICAgICAgIEMKICAgICAgICBECiAgICAgICAgZGVmIHNwYW0oeCx5KToKICAgICAgICAgICAgIGRlZiBlZ2dzKHopOgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAnJycKCgogICAgICAgIGluZGVudFN0YWNrID0gWzFdCiAgICAgICAgc3RtdCA9IEZvcndhcmQoKQoKICAgICAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykKICAgICAgICBmdW5jRGVjbCA9ICgiZGVmIiArIGlkZW50aWZpZXIgKyBHcm91cCggIigiICsgT3B0aW9uYWwoIGRlbGltaXRlZExpc3QoaWRlbnRpZmllcikgKSArICIpIiApICsgIjoiKQogICAgICAgIGZ1bmNfYm9keSA9IGluZGVudGVkQmxvY2soc3RtdCwgaW5kZW50U3RhY2spCiAgICAgICAgZnVuY0RlZiA9IEdyb3VwKCBmdW5jRGVjbCArIGZ1bmNfYm9keSApCgogICAgICAgIHJ2YWx1ZSA9IEZvcndhcmQoKQogICAgICAgIGZ1bmNDYWxsID0gR3JvdXAoaWRlbnRpZmllciArICIoIiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QocnZhbHVlKSkgKyAiKSIpCiAgICAgICAgcnZhbHVlIDw8IChmdW5jQ2FsbCB8IGlkZW50aWZpZXIgfCBXb3JkKG51bXMpKQogICAgICAgIGFzc2lnbm1lbnQgPSBHcm91cChpZGVudGlmaWVyICsgIj0iICsgcnZhbHVlKQogICAgICAgIHN0bXQgPDwgKCBmdW5jRGVmIHwgYXNzaWdubWVudCB8IGlkZW50aWZpZXIgKQoKICAgICAgICBtb2R1bGVfYm9keSA9IE9uZU9yTW9yZShzdG10KQoKICAgICAgICBwYXJzZVRyZWUgPSBtb2R1bGVfYm9keS5wYXJzZVN0cmluZyhkYXRhKQogICAgICAgIHBhcnNlVHJlZS5wcHJpbnQoKQogICAgcHJpbnRzOjoKICAgICAgICBbWydkZWYnLAogICAgICAgICAgJ0EnLAogICAgICAgICAgWycoJywgJ3onLCAnKSddLAogICAgICAgICAgJzonLAogICAgICAgICAgW1snQTEnXSwgW1snQicsICc9JywgJzEwMCddXSwgW1snRycsICc9JywgJ0EyJ11dLCBbJ0EyJ10sIFsnQTMnXV1dLAogICAgICAgICAnQicsCiAgICAgICAgIFsnZGVmJywKICAgICAgICAgICdCQicsCiAgICAgICAgICBbJygnLCAnYScsICdiJywgJ2MnLCAnKSddLAogICAgICAgICAgJzonLAogICAgICAgICAgW1snQkIxJ10sIFtbJ2RlZicsICdCQkEnLCBbJygnLCAnKSddLCAnOicsIFtbJ2JiYTEnXSwgWydiYmEyJ10sIFsnYmJhMyddXV1dXV0sCiAgICAgICAgICdDJywKICAgICAgICAgJ0QnLAogICAgICAgICBbJ2RlZicsCiAgICAgICAgICAnc3BhbScsCiAgICAgICAgICBbJygnLCAneCcsICd5JywgJyknXSwKICAgICAgICAgICc6JywKICAgICAgICAgIFtbWydkZWYnLCAnZWdncycsIFsnKCcsICd6JywgJyknXSwgJzonLCBbWydwYXNzJ11dXV1dXV0gCiAgICAiIiIKICAgIGRlZiBjaGVja1BlZXJJbmRlbnQocyxsLHQpOgogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQogICAgICAgIGlmIGN1ckNvbCAhPSBpbmRlbnRTdGFja1stMV06CiAgICAgICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24ocyxsLCJpbGxlZ2FsIG5lc3RpbmciKQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHBlZXIgZW50cnkiKQoKICAgIGRlZiBjaGVja1N1YkluZGVudChzLGwsdCk6CiAgICAgICAgY3VyQ29sID0gY29sKGwscykKICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06CiAgICAgICAgICAgIGluZGVudFN0YWNrLmFwcGVuZCggY3VyQ29sICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHN1YmVudHJ5IikKCiAgICBkZWYgY2hlY2tVbmluZGVudChzLGwsdCk6CiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybgogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpCiAgICAgICAgaWYgbm90KGluZGVudFN0YWNrIGFuZCBjdXJDb2wgPCBpbmRlbnRTdGFja1stMV0gYW5kIGN1ckNvbCA8PSBpbmRlbnRTdGFja1stMl0pOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhbiB1bmluZGVudCIpCiAgICAgICAgaW5kZW50U3RhY2sucG9wKCkKCiAgICBOTCA9IE9uZU9yTW9yZShMaW5lRW5kKCkuc2V0V2hpdGVzcGFjZUNoYXJzKCJcdCAiKS5zdXBwcmVzcygpKQogICAgSU5ERU5UID0gKEVtcHR5KCkgKyBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrU3ViSW5kZW50KSkuc2V0TmFtZSgnSU5ERU5UJykKICAgIFBFRVIgICA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tQZWVySW5kZW50KS5zZXROYW1lKCcnKQogICAgVU5ERU5UID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1VuaW5kZW50KS5zZXROYW1lKCdVTklOREVOVCcpCiAgICBpZiBpbmRlbnQ6CiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArCiAgICAgICAgICAgICN+IEZvbGxvd2VkQnkoYmxvY2tTdGF0ZW1lbnRFeHByKSArCiAgICAgICAgICAgIElOREVOVCArIChPbmVPck1vcmUoIFBFRVIgKyBHcm91cChibG9ja1N0YXRlbWVudEV4cHIpICsgT3B0aW9uYWwoTkwpICkpICsgVU5ERU5UKQogICAgZWxzZToKICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsKICAgICAgICAgICAgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKQogICAgYmxvY2tTdGF0ZW1lbnRFeHByLmlnbm9yZShfYnNsYXNoICsgTGluZUVuZCgpKQogICAgcmV0dXJuIHNtRXhwci5zZXROYW1lKCdpbmRlbnRlZCBibG9jaycpCgphbHBoYXM4Yml0ID0gc3JhbmdlKHIiW1wweGMwLVwweGQ2XDB4ZDgtXDB4ZjZcMHhmOC1cMHhmZl0iKQpwdW5jOGJpdCA9IHNyYW5nZShyIltcMHhhMS1cMHhiZlwweGQ3XDB4ZjddIikKCmFueU9wZW5UYWcsYW55Q2xvc2VUYWcgPSBtYWtlSFRNTFRhZ3MoV29yZChhbHBoYXMsYWxwaGFudW1zKyJfOiIpLnNldE5hbWUoJ2FueSB0YWcnKSkKX2h0bWxFbnRpdHlNYXAgPSBkaWN0KHppcCgiZ3QgbHQgYW1wIG5ic3AgcXVvdCBhcG9zIi5zcGxpdCgpLCc+PCYgIlwnJykpCmNvbW1vbkhUTUxFbnRpdHkgPSBSZWdleCgnJig/UDxlbnRpdHk+JyArICd8Jy5qb2luKF9odG1sRW50aXR5TWFwLmtleXMoKSkgKyIpOyIpLnNldE5hbWUoImNvbW1vbiBIVE1MIGVudGl0eSIpCmRlZiByZXBsYWNlSFRNTEVudGl0eSh0KToKICAgICIiIkhlbHBlciBwYXJzZXIgYWN0aW9uIHRvIHJlcGxhY2UgY29tbW9uIEhUTUwgZW50aXRpZXMgd2l0aCB0aGVpciBzcGVjaWFsIGNoYXJhY3RlcnMiIiIKICAgIHJldHVybiBfaHRtbEVudGl0eU1hcC5nZXQodC5lbnRpdHkpCgojIGl0J3MgZWFzeSB0byBnZXQgdGhlc2UgY29tbWVudCBzdHJ1Y3R1cmVzIHdyb25nIC0gdGhleSdyZSB2ZXJ5IGNvbW1vbiwgc28gbWF5IGFzIHdlbGwgbWFrZSB0aGVtIGF2YWlsYWJsZQpjU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nKS5zZXROYW1lKCJDIHN0eWxlIGNvbW1lbnQiKQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8qIC4uLiAqL30iCgpodG1sQ29tbWVudCA9IFJlZ2V4KHIiPCEtLVtcc1xTXSo/LS0+Iikuc2V0TmFtZSgiSFRNTCBjb21tZW50IikKIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3s8IS0tIC4uLiAtLT59IgoKcmVzdE9mTGluZSA9IFJlZ2V4KHIiLioiKS5sZWF2ZVdoaXRlc3BhY2UoKS5zZXROYW1lKCJyZXN0IG9mIGxpbmUiKQpkYmxTbGFzaENvbW1lbnQgPSBSZWdleChyIi8vKD86XFxcbnxbXlxuXSkqIikuc2V0TmFtZSgiLy8gY29tbWVudCIpCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7Ly8gLi4uICh0byBlbmQgb2YgbGluZSl9IgoKY3BwU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nfCBkYmxTbGFzaENvbW1lbnQpLnNldE5hbWUoIkMrKyBzdHlsZSBjb21tZW50IikKIkNvbW1lbnQgb2YgZWl0aGVyIGZvcm0gQ3tMe2NTdHlsZUNvbW1lbnR9fSBvciBDe0x7ZGJsU2xhc2hDb21tZW50fX0iCgpqYXZhU3R5bGVDb21tZW50ID0gY3BwU3R5bGVDb21tZW50CiJTYW1lIGFzIEN7THtjcHBTdHlsZUNvbW1lbnR9fSIKCnB5dGhvblN0eWxlQ29tbWVudCA9IFJlZ2V4KHIiIy4qIikuc2V0TmFtZSgiUHl0aG9uIHN0eWxlIGNvbW1lbnQiKQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDeyMgLi4uICh0byBlbmQgb2YgbGluZSl9IgoKX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwoIFdvcmQoIiBcdCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikKY29tbWFTZXBhcmF0ZWRMaXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hU2VwYXJhdGVkTGlzdCIpCiIiIihEZXByZWNhdGVkKSBQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KICAgVGhpcyBleHByZXNzaW9uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmNvbW1hX3NlcGFyYXRlZF9saXN0fS4iIiIKCiMgc29tZSBvdGhlciB1c2VmdWwgZXhwcmVzc2lvbnMgLSB1c2luZyBsb3dlci1jYXNlIGNsYXNzIG5hbWUgc2luY2Ugd2UgYXJlIHJlYWxseSB1c2luZyB0aGlzIGFzIGEgbmFtZXNwYWNlCmNsYXNzIHB5cGFyc2luZ19jb21tb246CiAgICAiIiIKICAgIEhlcmUgYXJlIHNvbWUgY29tbW9uIGxvdy1sZXZlbCBleHByZXNzaW9ucyB0aGF0IG1heSBiZSB1c2VmdWwgaW4ganVtcC1zdGFydGluZyBwYXJzZXIgZGV2ZWxvcG1lbnQ6CiAgICAgLSBudW1lcmljIGZvcm1zIChMe2ludGVnZXJzPGludGVnZXI+fSwgTHtyZWFsczxyZWFsPn0sIEx7c2NpZW50aWZpYyBub3RhdGlvbjxzY2lfcmVhbD59KQogICAgIC0gY29tbW9uIEx7cHJvZ3JhbW1pbmcgaWRlbnRpZmllcnM8aWRlbnRpZmllcj59CiAgICAgLSBuZXR3b3JrIGFkZHJlc3NlcyAoTHtNQUM8bWFjX2FkZHJlc3M+fSwgTHtJUHY0PGlwdjRfYWRkcmVzcz59LCBMe0lQdjY8aXB2Nl9hZGRyZXNzPn0pCiAgICAgLSBJU084NjAxIEx7ZGF0ZXM8aXNvODYwMV9kYXRlPn0gYW5kIEx7ZGF0ZXRpbWU8aXNvODYwMV9kYXRldGltZT59CiAgICAgLSBMe1VVSUQ8dXVpZD59CiAgICAgLSBMe2NvbW1hLXNlcGFyYXRlZCBsaXN0PGNvbW1hX3NlcGFyYXRlZF9saXN0Pn0KICAgIFBhcnNlIGFjdGlvbnM6CiAgICAgLSBDe0x7Y29udmVydFRvSW50ZWdlcn19CiAgICAgLSBDe0x7Y29udmVydFRvRmxvYXR9fQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV9fQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV0aW1lfX0KICAgICAtIEN7THtzdHJpcEhUTUxUYWdzfX0KICAgICAtIEN7THt1cGNhc2VUb2tlbnN9fQogICAgIC0gQ3tMe2Rvd25jYXNlVG9rZW5zfX0KCiAgICBFeGFtcGxlOjoKICAgICAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQogICAgICAgICAgICAxMDAKICAgICAgICAgICAgLTEwMAogICAgICAgICAgICArMTAwCiAgICAgICAgICAgIDMuMTQxNTkKICAgICAgICAgICAgNi4wMmUyMwogICAgICAgICAgICAxZS0xMgogICAgICAgICAgICAnJycpCgogICAgICAgIHB5cGFyc2luZ19jb21tb24uZm51bWJlci5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdAogICAgICAgICAgICAxMDAKICAgICAgICAgICAgLTEwMAogICAgICAgICAgICArMTAwCiAgICAgICAgICAgIDMuMTQxNTkKICAgICAgICAgICAgNi4wMmUyMwogICAgICAgICAgICAxZS0xMgogICAgICAgICAgICAnJycpCgogICAgICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgaGV4IG51bWJlcnMKICAgICAgICAgICAgMTAwCiAgICAgICAgICAgIEZGCiAgICAgICAgICAgICcnJykKCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mcmFjdGlvbi5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBmcmFjdGlvbnMKICAgICAgICAgICAgMS8yCiAgICAgICAgICAgIC0zLzQKICAgICAgICAgICAgJycnKQoKICAgICAgICBweXBhcnNpbmdfY29tbW9uLm1peGVkX2ludGVnZXIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zCiAgICAgICAgICAgIDEKICAgICAgICAgICAgMS8yCiAgICAgICAgICAgIC0zLzQKICAgICAgICAgICAgMS0zLzQKICAgICAgICAgICAgJycnKQoKICAgICAgICBpbXBvcnQgdXVpZAogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyB1dWlkCiAgICAgICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OAogICAgICAgICAgICAnJycpCiAgICBwcmludHM6OgogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUKICAgICAgICAxMDAKICAgICAgICBbMTAwXQoKICAgICAgICAtMTAwCiAgICAgICAgWy0xMDBdCgogICAgICAgICsxMDAKICAgICAgICBbMTAwXQoKICAgICAgICAzLjE0MTU5CiAgICAgICAgWzMuMTQxNTldCgogICAgICAgIDYuMDJlMjMKICAgICAgICBbNi4wMmUrMjNdCgogICAgICAgIDFlLTEyCiAgICAgICAgWzFlLTEyXQoKICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0CiAgICAgICAgMTAwCiAgICAgICAgWzEwMC4wXQoKICAgICAgICAtMTAwCiAgICAgICAgWy0xMDAuMF0KCiAgICAgICAgKzEwMAogICAgICAgIFsxMDAuMF0KCiAgICAgICAgMy4xNDE1OQogICAgICAgIFszLjE0MTU5XQoKICAgICAgICA2LjAyZTIzCiAgICAgICAgWzYuMDJlKzIzXQoKICAgICAgICAxZS0xMgogICAgICAgIFsxZS0xMl0KCiAgICAgICAgIyBoZXggbnVtYmVycwogICAgICAgIDEwMAogICAgICAgIFsyNTZdCgogICAgICAgIEZGCiAgICAgICAgWzI1NV0KCiAgICAgICAgIyBmcmFjdGlvbnMKICAgICAgICAxLzIKICAgICAgICBbMC41XQoKICAgICAgICAtMy80CiAgICAgICAgWy0wLjc1XQoKICAgICAgICAjIG1peGVkIGZyYWN0aW9ucwogICAgICAgIDEKICAgICAgICBbMV0KCiAgICAgICAgMS8yCiAgICAgICAgWzAuNV0KCiAgICAgICAgLTMvNAogICAgICAgIFstMC43NV0KCiAgICAgICAgMS0zLzQKICAgICAgICBbMS43NV0KCiAgICAgICAgIyB1dWlkCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4CiAgICAgICAgW1VVSUQoJzEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpXQogICAgIiIiCgogICAgY29udmVydFRvSW50ZWdlciA9IHRva2VuTWFwKGludCkKICAgICIiIgogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBpbnRlZ2VycyB0byBQeXRob24gaW50CiAgICAiIiIKCiAgICBjb252ZXJ0VG9GbG9hdCA9IHRva2VuTWFwKGZsb2F0KQogICAgIiIiCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIG51bWJlcnMgdG8gUHl0aG9uIGZsb2F0CiAgICAiIiIKCiAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikKICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYW4gdW5zaWduZWQgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiIKCiAgICBoZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0TmFtZSgiaGV4IGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsMTYpKQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGhleGFkZWNpbWFsIGludGVnZXIsIHJldHVybnMgYW4gaW50IiIiCgogICAgc2lnbmVkX2ludGVnZXIgPSBSZWdleChyJ1srLV0/XGQrJykuc2V0TmFtZSgic2lnbmVkIGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiBpbnRlZ2VyIHdpdGggb3B0aW9uYWwgbGVhZGluZyBzaWduLCByZXR1cm5zIGFuIGludCIiIgoKICAgIGZyYWN0aW9uID0gKHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpICsgJy8nICsgc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkpLnNldE5hbWUoImZyYWN0aW9uIikKICAgICIiImZyYWN0aW9uYWwgZXhwcmVzc2lvbiBvZiBhbiBpbnRlZ2VyIGRpdmlkZWQgYnkgYW4gaW50ZWdlciwgcmV0dXJucyBhIGZsb2F0IiIiCiAgICBmcmFjdGlvbi5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdDogdFswXS90Wy0xXSkKCiAgICBtaXhlZF9pbnRlZ2VyID0gKGZyYWN0aW9uIHwgc2lnbmVkX2ludGVnZXIgKyBPcHRpb25hbChPcHRpb25hbCgnLScpLnN1cHByZXNzKCkgKyBmcmFjdGlvbikpLnNldE5hbWUoImZyYWN0aW9uIG9yIG1peGVkIGludGVnZXItZnJhY3Rpb24iKQogICAgIiIibWl4ZWQgaW50ZWdlciBvZiB0aGUgZm9ybSAnaW50ZWdlciAtIGZyYWN0aW9uJywgd2l0aCBvcHRpb25hbCBsZWFkaW5nIGludGVnZXIsIHJldHVybnMgZmxvYXQiIiIKICAgIG1peGVkX2ludGVnZXIuYWRkUGFyc2VBY3Rpb24oc3VtKQoKICAgIHJlYWwgPSBSZWdleChyJ1srLV0/XGQrXC5cZConKS5zZXROYW1lKCJyZWFsIG51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBhbmQgcmV0dXJucyBhIGZsb2F0IiIiCgogICAgc2NpX3JlYWwgPSBSZWdleChyJ1srLV0/XGQrKFtlRV1bKy1dP1xkK3xcLlxkKihbZUVdWystXT9cZCspPyknKS5zZXROYW1lKCJyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24iKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkKICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2l0aCBvcHRpb25hbCBzY2llbnRpZmljIG5vdGF0aW9uIGFuZCByZXR1cm5zIGEgZmxvYXQiIiIKCiAgICAjIHN0cmVhbWxpbmluZyB0aGlzIGV4cHJlc3Npb24gbWFrZXMgdGhlIGRvY3MgbmljZXItbG9va2luZwogICAgbnVtYmVyID0gKHNjaV9yZWFsIHwgcmVhbCB8IHNpZ25lZF9pbnRlZ2VyKS5zdHJlYW1saW5lKCkKICAgICIiImFueSBudW1lcmljIGV4cHJlc3Npb24sIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIHR5cGUiIiIKCiAgICBmbnVtYmVyID0gUmVnZXgocidbKy1dP1xkK1wuP1xkKihbZUVdWystXT9cZCspPycpLnNldE5hbWUoImZudW1iZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkKICAgICIiImFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0IiIiCiAgICAKICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpLnNldE5hbWUoImlkZW50aWZpZXIiKQogICAgIiIidHlwaWNhbCBjb2RlIGlkZW50aWZpZXIgKGxlYWRpbmcgYWxwaGEgb3IgJ18nLCBmb2xsb3dlZCBieSAwIG9yIG1vcmUgYWxwaGFzLCBudW1zLCBvciAnXycpIiIiCiAgICAKICAgIGlwdjRfYWRkcmVzcyA9IFJlZ2V4KHInKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KShcLigyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkpezN9Jykuc2V0TmFtZSgiSVB2NCBhZGRyZXNzIikKICAgICJJUHY0IGFkZHJlc3MgKEN7MC4wLjAuMCAtIDI1NS4yNTUuMjU1LjI1NX0pIgoKICAgIF9pcHY2X3BhcnQgPSBSZWdleChyJ1swLTlhLWZBLUZdezEsNH0nKS5zZXROYW1lKCJoZXhfaW50ZWdlciIpCiAgICBfZnVsbF9pcHY2X2FkZHJlc3MgPSAoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSo3KS5zZXROYW1lKCJmdWxsIElQdjYgYWRkcmVzcyIpCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzID0gKE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpICsgIjo6IiArIE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpKS5zZXROYW1lKCJzaG9ydCBJUHY2IGFkZHJlc3MiKQogICAgX3Nob3J0X2lwdjZfYWRkcmVzcy5hZGRDb25kaXRpb24obGFtYmRhIHQ6IHN1bSgxIGZvciB0dCBpbiB0IGlmIHB5cGFyc2luZ19jb21tb24uX2lwdjZfcGFydC5tYXRjaGVzKHR0KSkgPCA4KQogICAgX21peGVkX2lwdjZfYWRkcmVzcyA9ICgiOjpmZmZmOiIgKyBpcHY0X2FkZHJlc3MpLnNldE5hbWUoIm1peGVkIElQdjYgYWRkcmVzcyIpCiAgICBpcHY2X2FkZHJlc3MgPSBDb21iaW5lKChfZnVsbF9pcHY2X2FkZHJlc3MgfCBfbWl4ZWRfaXB2Nl9hZGRyZXNzIHwgX3Nob3J0X2lwdjZfYWRkcmVzcykuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpCiAgICAiSVB2NiBhZGRyZXNzIChsb25nLCBzaG9ydCwgb3IgbWl4ZWQgZm9ybSkiCiAgICAKICAgIG1hY19hZGRyZXNzID0gUmVnZXgocidbMC05YS1mQS1GXXsyfShbOi4tXSlbMC05YS1mQS1GXXsyfSg/OlwxWzAtOWEtZkEtRl17Mn0pezR9Jykuc2V0TmFtZSgiTUFDIGFkZHJlc3MiKQogICAgIk1BQyBhZGRyZXNzIHh4Onh4Onh4Onh4Onh4IChtYXkgYWxzbyBoYXZlICctJyBvciAnLicgZGVsaW1pdGVycykiCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGNvbnZlcnRUb0RhdGUoZm10PSIlWS0lbS0lZCIpOgogICAgICAgICIiIgogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRlCgogICAgICAgIFBhcmFtcyAtCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZCJ9KQoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZGF0ZV9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGUuY29weSgpCiAgICAgICAgICAgIGRhdGVfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGUoKSkKICAgICAgICAgICAgcHJpbnQoZGF0ZV9leHByLnBhcnNlU3RyaW5nKCIxOTk5LTEyLTMxIikpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGUoMTk5OSwgMTIsIDMxKV0KICAgICAgICAiIiIKICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkuZGF0ZSgpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocywgbCwgc3RyKHZlKSkKICAgICAgICByZXR1cm4gY3Z0X2ZuCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGNvbnZlcnRUb0RhdGV0aW1lKGZtdD0iJVktJW0tJWRUJUg6JU06JVMuJWYiKToKICAgICAgICAiIiIKICAgICAgICBIZWxwZXIgdG8gY3JlYXRlIGEgcGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBkYXRldGltZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGV0aW1lCgogICAgICAgIFBhcmFtcyAtCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZFQlSDolTTolUy4lZiJ9KQoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZHRfZXhwciA9IHB5cGFyc2luZ19jb21tb24uaXNvODYwMV9kYXRldGltZS5jb3B5KCkKICAgICAgICAgICAgZHRfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGV0aW1lKCkpCiAgICAgICAgICAgIHByaW50KGR0X2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzFUMjM6NTk6NTkuOTk5IikpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGV0aW1lKDE5OTksIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5MDAwKV0KICAgICAgICAiIiIKICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQogICAgICAgIHJldHVybiBjdnRfZm4KCiAgICBpc284NjAxX2RhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KSg/Oi0oP1A8bW9udGg+XGRcZCkoPzotKD9QPGRheT5cZFxkKSk/KT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGUiKQogICAgIklTTzg2MDEgZGF0ZSAoQ3t5eXl5LW1tLWRkfSkiCgogICAgaXNvODYwMV9kYXRldGltZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkKS0oP1A8ZGF5PlxkXGQpW1QgXSg/UDxob3VyPlxkXGQpOig/UDxtaW51dGU+XGRcZCkoOig/UDxzZWNvbmQ+XGRcZChcLlxkKik/KT8pPyg/UDx0ej5afFsrLV1cZFxkOj9cZFxkKT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGV0aW1lIikKICAgICJJU084NjAxIGRhdGV0aW1lIChDe3l5eXktbW0tZGRUaGg6bW06c3MucyhafCstMDA6MDApfSkgLSB0cmFpbGluZyBzZWNvbmRzLCBtaWxsaXNlY29uZHMsIGFuZCB0aW1lem9uZSBvcHRpb25hbDsgYWNjZXB0cyBzZXBhcmF0aW5nIEN7J1QnfSBvciBDeycgJ30iCgogICAgdXVpZCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17OH0oLVswLTlhLWZBLUZdezR9KXszfS1bMC05YS1mQS1GXXsxMn0nKS5zZXROYW1lKCJVVUlEIikKICAgICJVVUlEIChDe3h4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eH0pIgoKICAgIF9odG1sX3N0cmlwcGVyID0gYW55T3BlblRhZy5zdXBwcmVzcygpIHwgYW55Q2xvc2VUYWcuc3VwcHJlc3MoKQogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHN0cmlwSFRNTFRhZ3MocywgbCwgdG9rZW5zKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIEhUTUwgdGFncyBmcm9tIHdlYiBwYWdlIEhUTUwgc291cmNlCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIHN0cmlwIEhUTUwgbGlua3MgZnJvbSBub3JtYWwgdGV4dCAKICAgICAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+JwogICAgICAgICAgICB0ZCx0ZF9lbmQgPSBtYWtlSFRNTFRhZ3MoIlREIikKICAgICAgICAgICAgdGFibGVfdGV4dCA9IHRkICsgU2tpcFRvKHRkX2VuZCkuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5zdHJpcEhUTUxUYWdzKSgiYm9keSIpICsgdGRfZW5kCiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludCh0YWJsZV90ZXh0LnBhcnNlU3RyaW5nKHRleHQpLmJvZHkpICMgLT4gJ01vcmUgaW5mbyBhdCB0aGUgcHlwYXJzaW5nIHdpa2kgcGFnZScKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcHlwYXJzaW5nX2NvbW1vbi5faHRtbF9zdHJpcHBlci50cmFuc2Zvcm1TdHJpbmcodG9rZW5zWzBdKQoKICAgIF9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSArIFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE9wdGlvbmFsKCBXaGl0ZSgiIFx0IikgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpCiAgICBjb21tYV9zZXBhcmF0ZWRfbGlzdCA9IGRlbGltaXRlZExpc3QoIE9wdGlvbmFsKCBxdW90ZWRTdHJpbmcuY29weSgpIHwgX2NvbW1hc2VwaXRlbSwgZGVmYXVsdD0iIikgKS5zZXROYW1lKCJjb21tYSBzZXBhcmF0ZWQgbGlzdCIpCiAgICAiIiJQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iIiIKCiAgICB1cGNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpKQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIiIiCgogICAgZG93bmNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpKQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIiIiCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKCiAgICBzZWxlY3RUb2tlbiAgICA9IENhc2VsZXNzTGl0ZXJhbCgic2VsZWN0IikKICAgIGZyb21Ub2tlbiAgICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJmcm9tIikKCiAgICBpZGVudCAgICAgICAgICA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMgKyAiXyQiKQoKICAgIGNvbHVtbk5hbWUgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykKICAgIGNvbHVtbk5hbWVMaXN0ID0gR3JvdXAoZGVsaW1pdGVkTGlzdChjb2x1bW5OYW1lKSkuc2V0TmFtZSgiY29sdW1ucyIpCiAgICBjb2x1bW5TcGVjICAgICA9ICgnKicgfCBjb2x1bW5OYW1lTGlzdCkKCiAgICB0YWJsZU5hbWUgICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpCiAgICB0YWJsZU5hbWVMaXN0ICA9IEdyb3VwKGRlbGltaXRlZExpc3QodGFibGVOYW1lKSkuc2V0TmFtZSgidGFibGVzIikKICAgIAogICAgc2ltcGxlU1FMICAgICAgPSBzZWxlY3RUb2tlbigiY29tbWFuZCIpICsgY29sdW1uU3BlYygiY29sdW1ucyIpICsgZnJvbVRva2VuICsgdGFibGVOYW1lTGlzdCgidGFibGVzIikKCiAgICAjIGRlbW8gcnVuVGVzdHMgbWV0aG9kLCBpbmNsdWRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGVzdCBzdHJpbmcKICAgIHNpbXBsZVNRTC5ydW5UZXN0cygiIiIKICAgICAgICAjICcqJyBhcyBjb2x1bW4gbGlzdCBhbmQgZG90dGVkIHRhYmxlIG5hbWUKICAgICAgICBzZWxlY3QgKiBmcm9tIFNZUy5YWVpaWQoKICAgICAgICAjIGNhc2VsZXNzIG1hdGNoIG9uICJTRUxFQ1QiLCBhbmQgY2FzdHMgYmFjayB0byAic2VsZWN0IgogICAgICAgIFNFTEVDVCAqIGZyb20gWFlaWlksIEFCQwoKICAgICAgICAjIGxpc3Qgb2YgY29sdW1uIG5hbWVzLCBhbmQgbWl4ZWQgY2FzZSBTRUxFQ1Qga2V5d29yZAogICAgICAgIFNlbGVjdCBBQSxCQixDQyBmcm9tIFN5cy5kdWFsCgogICAgICAgICMgbXVsdGlwbGUgdGFibGVzCiAgICAgICAgU2VsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbCwgVGFibGUyCgogICAgICAgICMgaW52YWxpZCBTRUxFQ1Qga2V5d29yZCAtIHNob3VsZCBmYWlsCiAgICAgICAgWGVsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbAoKICAgICAgICAjIGluY29tcGxldGUgY29tbWFuZCAtIHNob3VsZCBmYWlsCiAgICAgICAgU2VsZWN0CgogICAgICAgICMgaW52YWxpZCBjb2x1bW4gbmFtZSAtIHNob3VsZCBmYWlsCiAgICAgICAgU2VsZWN0IF5eXiBmcm94IFN5cy5kdWFsCgogICAgICAgICIiIikKCiAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygiIiIKICAgICAgICAxMDAKICAgICAgICAtMTAwCiAgICAgICAgKzEwMAogICAgICAgIDMuMTQxNTkKICAgICAgICA2LjAyZTIzCiAgICAgICAgMWUtMTIKICAgICAgICAiIiIpCgogICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdAogICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCIiIgogICAgICAgIDEwMAogICAgICAgIC0xMDAKICAgICAgICArMTAwCiAgICAgICAgMy4xNDE1OQogICAgICAgIDYuMDJlMjMKICAgICAgICAxZS0xMgogICAgICAgICIiIikKCiAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCIiIgogICAgICAgIDEwMAogICAgICAgIEZGCiAgICAgICAgIiIiKQoKICAgIGltcG9ydCB1dWlkCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkKICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygiIiIKICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgKICAgICAgICAiIiIpClBLAwQUAAAAAAAAACEAYB4HjQUDAAAFAwAANQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmUtdmVuZG9yLnB5aW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHBpcAppbXBvcnQgZ2xvYgppbXBvcnQgc2h1dGlsCgpoZXJlID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCgpkZWYgdXNhZ2UoKToKICAgIHByaW50KCJVc2FnZTogcmUtdmVuZG9yLnB5IFtjbGVhbnx2ZW5kb3JdIikKICAgIHN5cy5leGl0KDEpCgpkZWYgY2xlYW4oKToKICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKGhlcmUpOgogICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4oaGVyZSwgZm4pCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkaXJuYW1lKQogICAgIyBzaXggaXMgYSBzaW5nbGUgZmlsZSwgbm90IGEgcGFja2FnZQogICAgb3MudW5saW5rKG9zLnBhdGguam9pbihoZXJlLCAnc2l4LnB5JykpCgpkZWYgdmVuZG9yKCk6CiAgICBwaXAubWFpbihbJ2luc3RhbGwnLCAnLXQnLCBoZXJlLCAnLXInLCAndmVuZG9yLnR4dCddKQogICAgZm9yIGRpcm5hbWUgaW4gZ2xvYi5nbG9iKCcqLmVnZy1pbmZvJyk6CiAgICAgICAgc2h1dGlsLnJtdHJlZShkaXJuYW1lKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIGlmIGxlbihzeXMuYXJndikgIT0gMjoKICAgICAgICB1c2FnZSgpCiAgICBpZiBzeXMuYXJndlsxXSA9PSAnY2xlYW4nOgogICAgICAgIGNsZWFuKCkKICAgIGVsaWYgc3lzLmFyZ3ZbMV0gPT0gJ3ZlbmRvcic6CiAgICAgICAgdmVuZG9yKCkKICAgIGVsc2U6CiAgICAgICAgdXNhZ2UoKQpQSwMEFAAAAAAAAAAhAB/G7jD3DQAA9w0AAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19faW5pdF9fLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgICBfXwojICAvX18pICBfICBfICAgICBfICAgXyBfLyAgIF8KIyAvICggICAoLSAoLyAoLyAoLSBfKSAgLyAgXykKIyAgICAgICAgICAvCgoiIiIKUmVxdWVzdHMgSFRUUCBMaWJyYXJ5Cn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKUmVxdWVzdHMgaXMgYW4gSFRUUCBsaWJyYXJ5LCB3cml0dGVuIGluIFB5dGhvbiwgZm9yIGh1bWFuIGJlaW5ncy4gQmFzaWMgR0VUCnVzYWdlOgoKICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICA+Pj4gciA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly93d3cucHl0aG9uLm9yZycpCiAgID4+PiByLnN0YXR1c19jb2RlCiAgIDIwMAogICA+Pj4gJ1B5dGhvbiBpcyBhIHByb2dyYW1taW5nIGxhbmd1YWdlJyBpbiByLmNvbnRlbnQKICAgVHJ1ZQoKLi4uIG9yIFBPU1Q6CgogICA+Pj4gcGF5bG9hZCA9IGRpY3Qoa2V5MT0ndmFsdWUxJywga2V5Mj0ndmFsdWUyJykKICAgPj4+IHIgPSByZXF1ZXN0cy5wb3N0KCdodHRwOi8vaHR0cGJpbi5vcmcvcG9zdCcsIGRhdGE9cGF5bG9hZCkKICAgPj4+IHByaW50KHIudGV4dCkKICAgewogICAgIC4uLgogICAgICJmb3JtIjogewogICAgICAgImtleTIiOiAidmFsdWUyIiwKICAgICAgICJrZXkxIjogInZhbHVlMSIKICAgICB9LAogICAgIC4uLgogICB9CgpUaGUgb3RoZXIgSFRUUCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQgLSBzZWUgYHJlcXVlc3RzLmFwaWAuIEZ1bGwgZG9jdW1lbnRhdGlvbgppcyBhdCA8aHR0cDovL3B5dGhvbi1yZXF1ZXN0cy5vcmc+LgoKOmNvcHlyaWdodDogKGMpIDIwMTcgYnkgS2VubmV0aCBSZWl0ei4KOmxpY2Vuc2U6IEFwYWNoZSAyLjAsIHNlZSBMSUNFTlNFIGZvciBtb3JlIGRldGFpbHMuCiIiIgoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgdXJsbGliMwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBjaGFyZGV0CmltcG9ydCB3YXJuaW5ncwpmcm9tIC5leGNlcHRpb25zIGltcG9ydCBSZXF1ZXN0c0RlcGVuZGVuY3lXYXJuaW5nCgoKZGVmIGNoZWNrX2NvbXBhdGliaWxpdHkodXJsbGliM192ZXJzaW9uLCBjaGFyZGV0X3ZlcnNpb24pOgogICAgdXJsbGliM192ZXJzaW9uID0gdXJsbGliM192ZXJzaW9uLnNwbGl0KCcuJykKICAgIGFzc2VydCB1cmxsaWIzX3ZlcnNpb24gIT0gWydkZXYnXSAgIyBWZXJpZnkgdXJsbGliMyBpc24ndCBpbnN0YWxsZWQgZnJvbSBnaXQuCgogICAgIyBTb21ldGltZXMsIHVybGxpYjMgb25seSByZXBvcnRzIGl0cyB2ZXJzaW9uIGFzIDE2LjEuCiAgICBpZiBsZW4odXJsbGliM192ZXJzaW9uKSA9PSAyOgogICAgICAgIHVybGxpYjNfdmVyc2lvbi5hcHBlbmQoJzAnKQoKICAgICMgQ2hlY2sgdXJsbGliMyBmb3IgY29tcGF0aWJpbGl0eS4KICAgIG1ham9yLCBtaW5vciwgcGF0Y2ggPSB1cmxsaWIzX3ZlcnNpb24gICMgbm9xYTogRjgxMQogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IGludChtYWpvciksIGludChtaW5vciksIGludChwYXRjaCkKICAgICMgdXJsbGliMyA+PSAxLjIxLjEsIDw9IDEuMjIKICAgIGFzc2VydCBtYWpvciA9PSAxCiAgICBhc3NlcnQgbWlub3IgPj0gMjEKICAgIGFzc2VydCBtaW5vciA8PSAyMgoKICAgICMgQ2hlY2sgY2hhcmRldCBmb3IgY29tcGF0aWJpbGl0eS4KICAgIG1ham9yLCBtaW5vciwgcGF0Y2ggPSBjaGFyZGV0X3ZlcnNpb24uc3BsaXQoJy4nKVs6M10KICAgIG1ham9yLCBtaW5vciwgcGF0Y2ggPSBpbnQobWFqb3IpLCBpbnQobWlub3IpLCBpbnQocGF0Y2gpCiAgICAjIGNoYXJkZXQgPj0gMy4wLjIsIDwgMy4xLjAKICAgIGFzc2VydCBtYWpvciA9PSAzCiAgICBhc3NlcnQgbWlub3IgPCAxCiAgICBhc3NlcnQgcGF0Y2ggPj0gMgoKCiMgQ2hlY2sgaW1wb3J0ZWQgZGVwZW5kZW5jaWVzIGZvciBjb21wYXRpYmlsaXR5Lgp0cnk6CiAgICBjaGVja19jb21wYXRpYmlsaXR5KHVybGxpYjMuX192ZXJzaW9uX18sIGNoYXJkZXQuX192ZXJzaW9uX18pCmV4Y2VwdCAoQXNzZXJ0aW9uRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgd2FybmluZ3Mud2FybigidXJsbGliMyAoezB9KSBvciBjaGFyZGV0ICh7MX0pIGRvZXNuJ3QgbWF0Y2ggYSBzdXBwb3J0ZWQgIgogICAgICAgICAgICAgICAgICAidmVyc2lvbiEiLmZvcm1hdCh1cmxsaWIzLl9fdmVyc2lvbl9fLCBjaGFyZGV0Ll9fdmVyc2lvbl9fKSwKICAgICAgICAgICAgICAgICAgUmVxdWVzdHNEZXBlbmRlbmN5V2FybmluZykKCiMgQXR0ZW1wdCB0byBlbmFibGUgdXJsbGliMydzIFNOSSBzdXBwb3J0LCBpZiBwb3NzaWJsZQojIHRyeToKIyAgICAgZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmNvbnRyaWIgaW1wb3J0IHB5b3BlbnNzbAojICAgICBweW9wZW5zc2wuaW5qZWN0X2ludG9fdXJsbGliMygpCiMgZXhjZXB0IEltcG9ydEVycm9yOgojICAgICBwYXNzCgojIHVybGxpYjMncyBEZXBlbmRlbmN5V2FybmluZ3Mgc2hvdWxkIGJlIHNpbGVuY2VkLgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgRGVwZW5kZW5jeVdhcm5pbmcKd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXBlbmRlbmN5V2FybmluZykKCmZyb20gLl9fdmVyc2lvbl9fIGltcG9ydCBfX3RpdGxlX18sIF9fZGVzY3JpcHRpb25fXywgX191cmxfXywgX192ZXJzaW9uX18KZnJvbSAuX192ZXJzaW9uX18gaW1wb3J0IF9fYnVpbGRfXywgX19hdXRob3JfXywgX19hdXRob3JfZW1haWxfXywgX19saWNlbnNlX18KZnJvbSAuX192ZXJzaW9uX18gaW1wb3J0IF9fY29weXJpZ2h0X18sIF9fY2FrZV9fCgpmcm9tIC4gaW1wb3J0IHV0aWxzCmZyb20gLiBpbXBvcnQgcGFja2FnZXMKZnJvbSAubW9kZWxzIGltcG9ydCBSZXF1ZXN0LCBSZXNwb25zZSwgUHJlcGFyZWRSZXF1ZXN0CmZyb20gLmFwaSBpbXBvcnQgcmVxdWVzdCwgZ2V0LCBoZWFkLCBwb3N0LCBwYXRjaCwgcHV0LCBkZWxldGUsIG9wdGlvbnMKZnJvbSAuc2Vzc2lvbnMgaW1wb3J0IHNlc3Npb24sIFNlc3Npb24KZnJvbSAuc3RhdHVzX2NvZGVzIGltcG9ydCBjb2Rlcwpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBSZXF1ZXN0RXhjZXB0aW9uLCBUaW1lb3V0LCBVUkxSZXF1aXJlZCwKICAgIFRvb01hbnlSZWRpcmVjdHMsIEhUVFBFcnJvciwgQ29ubmVjdGlvbkVycm9yLAogICAgRmlsZU1vZGVXYXJuaW5nLCBDb25uZWN0VGltZW91dCwgUmVhZFRpbWVvdXQKKQoKIyBTZXQgZGVmYXVsdCBsb2dnaW5nIGhhbmRsZXIgdG8gYXZvaWQgIk5vIGhhbmRsZXIgZm91bmQiIHdhcm5pbmdzLgppbXBvcnQgbG9nZ2luZwp0cnk6ICAjIFB5dGhvbiAyLjcrCiAgICBmcm9tIGxvZ2dpbmcgaW1wb3J0IE51bGxIYW5kbGVyCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGNsYXNzIE51bGxIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CiAgICAgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKICAgICAgICAgICAgcGFzcwoKbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pLmFkZEhhbmRsZXIoTnVsbEhhbmRsZXIoKSkKCiMgRmlsZU1vZGVXYXJuaW5ncyBnbyBvZmYgcGVyIHRoZSBkZWZhdWx0Lgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2RlZmF1bHQnLCBGaWxlTW9kZVdhcm5pbmcsIGFwcGVuZD1UcnVlKQpQSwMEFAAAAAAAAAAhAN98eSW0AQAAtAEAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19fdmVyc2lvbl9fLnB5IyAuLS4gLi0uIC4tLiAuIC4gLi0uIC4tLiAuLS4gLi0uCiMgfCggIHwtICB8LnwgfCB8IHwtICBgLS4gIHwgIGAtLgojICcgJyBgLScgYC1gLmAtJyBgLScgYC0nICAnICBgLScKCl9fdGl0bGVfXyA9ICdyZXF1ZXN0cycKX19kZXNjcmlwdGlvbl9fID0gJ1B5dGhvbiBIVFRQIGZvciBIdW1hbnMuJwpfX3VybF9fID0gJ2h0dHA6Ly9weXRob24tcmVxdWVzdHMub3JnJwpfX3ZlcnNpb25fXyA9ICcyLjE4LjQnCl9fYnVpbGRfXyA9IDB4MDIxODA0Cl9fYXV0aG9yX18gPSAnS2VubmV0aCBSZWl0eicKX19hdXRob3JfZW1haWxfXyA9ICdtZUBrZW5uZXRocmVpdHoub3JnJwpfX2xpY2Vuc2VfXyA9ICdBcGFjaGUgMi4wJwpfX2NvcHlyaWdodF9fID0gJ0NvcHlyaWdodCAyMDE3IEtlbm5ldGggUmVpdHonCl9fY2FrZV9fID0gdSdcdTI3MjggXFUwMDAxZjM3MCBcdTI3MjgnClBLAwQUAAAAAAAAACEAiKk5u0gEAABIBAAARAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX2ludGVybmFsX3V0aWxzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5faW50ZXJuYWxfdXRpbHMKfn5+fn5+fn5+fn5+fn4KClByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbnN1bWVkIGludGVybmFsbHkgYnkgUmVxdWVzdHMKd2hpY2ggZGVwZW5kIG9uIGV4dHJlbWVseSBmZXcgZXh0ZXJuYWwgaGVscGVycyAoc3VjaCBhcyBjb21wYXQpCiIiIgoKZnJvbSAuY29tcGF0IGltcG9ydCBpc19weTIsIGJ1aWx0aW5fc3RyLCBzdHIKCgpkZWYgdG9fbmF0aXZlX3N0cmluZyhzdHJpbmcsIGVuY29kaW5nPSdhc2NpaScpOgogICAgIiIiR2l2ZW4gYSBzdHJpbmcgb2JqZWN0LCByZWdhcmRsZXNzIG9mIHR5cGUsIHJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZgogICAgdGhhdCBzdHJpbmcgaW4gdGhlIG5hdGl2ZSBzdHJpbmcgdHlwZSwgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHdoZXJlCiAgICBuZWNlc3NhcnkuIFRoaXMgYXNzdW1lcyBBU0NJSSB1bmxlc3MgdG9sZCBvdGhlcndpc2UuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2Uoc3RyaW5nLCBidWlsdGluX3N0cik6CiAgICAgICAgb3V0ID0gc3RyaW5nCiAgICBlbHNlOgogICAgICAgIGlmIGlzX3B5MjoKICAgICAgICAgICAgb3V0ID0gc3RyaW5nLmVuY29kZShlbmNvZGluZykKICAgICAgICBlbHNlOgogICAgICAgICAgICBvdXQgPSBzdHJpbmcuZGVjb2RlKGVuY29kaW5nKQoKICAgIHJldHVybiBvdXQKCgpkZWYgdW5pY29kZV9pc19hc2NpaSh1X3N0cmluZyk6CiAgICAiIiJEZXRlcm1pbmUgaWYgdW5pY29kZSBzdHJpbmcgb25seSBjb250YWlucyBBU0NJSSBjaGFyYWN0ZXJzLgoKICAgIDpwYXJhbSBzdHIgdV9zdHJpbmc6IHVuaWNvZGUgc3RyaW5nIHRvIGNoZWNrLiBNdXN0IGJlIHVuaWNvZGUKICAgICAgICBhbmQgbm90IFB5dGhvbiAyIGBzdHJgLgogICAgOnJ0eXBlOiBib29sCiAgICAiIiIKICAgIGFzc2VydCBpc2luc3RhbmNlKHVfc3RyaW5nLCBzdHIpCiAgICB0cnk6CiAgICAgICAgdV9zdHJpbmcuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgcmV0dXJuIEZhbHNlClBLAwQUAAAAAAAAACEAI1DeUhhSAAAYUgAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYWRhcHRlcnMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmFkYXB0ZXJzCn5+fn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgdHJhbnNwb3J0IGFkYXB0ZXJzIHRoYXQgUmVxdWVzdHMgdXNlcyB0byBkZWZpbmUKYW5kIG1haW50YWluIGNvbm5lY3Rpb25zLgoiIiIKCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzb2NrZXQKCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5wb29sbWFuYWdlciBpbXBvcnQgUG9vbE1hbmFnZXIsIHByb3h5X2Zyb21fdXJsCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5yZXNwb25zZSBpbXBvcnQgSFRUUFJlc3BvbnNlCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy51dGlsIGltcG9ydCBUaW1lb3V0IGFzIFRpbWVvdXRTYXVjZQpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMudXRpbC5yZXRyeSBpbXBvcnQgUmV0cnkKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IENsb3NlZFBvb2xFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgQ29ubmVjdFRpbWVvdXRFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgSFRUUEVycm9yIGFzIF9IVFRQRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IE1heFJldHJ5RXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IE5ld0Nvbm5lY3Rpb25FcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgUHJveHlFcnJvciBhcyBfUHJveHlFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgUHJvdG9jb2xFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgUmVhZFRpbWVvdXRFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgU1NMRXJyb3IgYXMgX1NTTEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBSZXNwb25zZUVycm9yCgpmcm9tIC5tb2RlbHMgaW1wb3J0IFJlc3BvbnNlCmZyb20gLmNvbXBhdCBpbXBvcnQgdXJscGFyc2UsIGJhc2VzdHJpbmcKZnJvbSAudXRpbHMgaW1wb3J0IChERUZBVUxUX0NBX0JVTkRMRV9QQVRILCBnZXRfZW5jb2RpbmdfZnJvbV9oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIHByZXBlbmRfc2NoZW1lX2lmX25lZWRlZCwgZ2V0X2F1dGhfZnJvbV91cmwsIHVybGRlZnJhZ2F1dGgsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3Byb3h5KQpmcm9tIC5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0CmZyb20gLmNvb2tpZXMgaW1wb3J0IGV4dHJhY3RfY29va2llc190b19qYXIKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKENvbm5lY3Rpb25FcnJvciwgQ29ubmVjdFRpbWVvdXQsIFJlYWRUaW1lb3V0LCBTU0xFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5RXJyb3IsIFJldHJ5RXJyb3IsIEludmFsaWRTY2hlbWEpCmZyb20gLmF1dGggaW1wb3J0IF9iYXNpY19hdXRoX3N0cgoKdHJ5OgogICAgZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmNvbnRyaWIuc29ja3MgaW1wb3J0IFNPQ0tTUHJveHlNYW5hZ2VyCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGRlZiBTT0NLU1Byb3h5TWFuYWdlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHJhaXNlIEludmFsaWRTY2hlbWEoIk1pc3NpbmcgZGVwZW5kZW5jaWVzIGZvciBTT0NLUyBzdXBwb3J0LiIpCgpERUZBVUxUX1BPT0xCTE9DSyA9IEZhbHNlCkRFRkFVTFRfUE9PTFNJWkUgPSAxMApERUZBVUxUX1JFVFJJRVMgPSAwCkRFRkFVTFRfUE9PTF9USU1FT1VUID0gTm9uZQoKCmNsYXNzIEJhc2VBZGFwdGVyKG9iamVjdCk6CiAgICAiIiJUaGUgQmFzZSBUcmFuc3BvcnQgQWRhcHRlciIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihCYXNlQWRhcHRlciwgc2VsZikuX19pbml0X18oKQoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsIHN0cmVhbT1GYWxzZSwgdGltZW91dD1Ob25lLCB2ZXJpZnk9VHJ1ZSwKICAgICAgICAgICAgIGNlcnQ9Tm9uZSwgcHJveGllcz1Ob25lKToKICAgICAgICAiIiJTZW5kcyBQcmVwYXJlZFJlcXVlc3Qgb2JqZWN0LiBSZXR1cm5zIFJlc3BvbnNlIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHJlcXVlc3Q6IFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgYmVpbmcgc2VudC4KICAgICAgICA6cGFyYW0gc3RyZWFtOiAob3B0aW9uYWwpIFdoZXRoZXIgdG8gc3RyZWFtIHRoZSByZXF1ZXN0IGNvbnRlbnQuCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6IChvcHRpb25hbCkgSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBzZW5kCiAgICAgICAgICAgIGRhdGEgYmVmb3JlIGdpdmluZyB1cCwgYXMgYSBmbG9hdCwgb3IgYSA6cmVmOmAoY29ubmVjdCB0aW1lb3V0LAogICAgICAgICAgICByZWFkIHRpbWVvdXQpIDx0aW1lb3V0cz5gIHR1cGxlLgogICAgICAgIDp0eXBlIHRpbWVvdXQ6IGZsb2F0IG9yIHR1cGxlCiAgICAgICAgOnBhcmFtIHZlcmlmeTogKG9wdGlvbmFsKSBFaXRoZXIgYSBib29sZWFuLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRyb2xzIHdoZXRoZXIgd2UgdmVyaWZ5CiAgICAgICAgICAgIHRoZSBzZXJ2ZXIncyBUTFMgY2VydGlmaWNhdGUsIG9yIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgYSBwYXRoCiAgICAgICAgICAgIHRvIGEgQ0EgYnVuZGxlIHRvIHVzZQogICAgICAgIDpwYXJhbSBjZXJ0OiAob3B0aW9uYWwpIEFueSB1c2VyLXByb3ZpZGVkIFNTTCBjZXJ0aWZpY2F0ZSB0byBiZSB0cnVzdGVkLgogICAgICAgIDpwYXJhbSBwcm94aWVzOiAob3B0aW9uYWwpIFRoZSBwcm94aWVzIGRpY3Rpb25hcnkgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbGVhbnMgdXAgYWRhcHRlciBzcGVjaWZpYyBpdGVtcy4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgoKY2xhc3MgSFRUUEFkYXB0ZXIoQmFzZUFkYXB0ZXIpOgogICAgIiIiVGhlIGJ1aWx0LWluIEhUVFAgQWRhcHRlciBmb3IgdXJsbGliMy4KCiAgICBQcm92aWRlcyBhIGdlbmVyYWwtY2FzZSBpbnRlcmZhY2UgZm9yIFJlcXVlc3RzIHNlc3Npb25zIHRvIGNvbnRhY3QgSFRUUCBhbmQKICAgIEhUVFBTIHVybHMgYnkgaW1wbGVtZW50aW5nIHRoZSBUcmFuc3BvcnQgQWRhcHRlciBpbnRlcmZhY2UuIFRoaXMgY2xhc3Mgd2lsbAogICAgdXN1YWxseSBiZSBjcmVhdGVkIGJ5IHRoZSA6Y2xhc3M6YFNlc3Npb24gPFNlc3Npb24+YCBjbGFzcyB1bmRlciB0aGUKICAgIGNvdmVycy4KCiAgICA6cGFyYW0gcG9vbF9jb25uZWN0aW9uczogVGhlIG51bWJlciBvZiB1cmxsaWIzIGNvbm5lY3Rpb24gcG9vbHMgdG8gY2FjaGUuCiAgICA6cGFyYW0gcG9vbF9tYXhzaXplOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdG8gc2F2ZSBpbiB0aGUgcG9vbC4KICAgIDpwYXJhbSBtYXhfcmV0cmllczogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZWFjaCBjb25uZWN0aW9uCiAgICAgICAgc2hvdWxkIGF0dGVtcHQuIE5vdGUsIHRoaXMgYXBwbGllcyBvbmx5IHRvIGZhaWxlZCBETlMgbG9va3Vwcywgc29ja2V0CiAgICAgICAgY29ubmVjdGlvbnMgYW5kIGNvbm5lY3Rpb24gdGltZW91dHMsIG5ldmVyIHRvIHJlcXVlc3RzIHdoZXJlIGRhdGEgaGFzCiAgICAgICAgbWFkZSBpdCB0byB0aGUgc2VydmVyLiBCeSBkZWZhdWx0LCBSZXF1ZXN0cyBkb2VzIG5vdCByZXRyeSBmYWlsZWQKICAgICAgICBjb25uZWN0aW9ucy4gSWYgeW91IG5lZWQgZ3JhbnVsYXIgY29udHJvbCBvdmVyIHRoZSBjb25kaXRpb25zIHVuZGVyCiAgICAgICAgd2hpY2ggd2UgcmV0cnkgYSByZXF1ZXN0LCBpbXBvcnQgdXJsbGliMydzIGBgUmV0cnlgYCBjbGFzcyBhbmQgcGFzcwogICAgICAgIHRoYXQgaW5zdGVhZC4KICAgIDpwYXJhbSBwb29sX2Jsb2NrOiBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIHBvb2wgc2hvdWxkIGJsb2NrIGZvciBjb25uZWN0aW9ucy4KCiAgICBVc2FnZTo6CgogICAgICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgICAgID4+PiBzID0gcmVxdWVzdHMuU2Vzc2lvbigpCiAgICAgID4+PiBhID0gcmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXIobWF4X3JldHJpZXM9MykKICAgICAgPj4+IHMubW91bnQoJ2h0dHA6Ly8nLCBhKQogICAgIiIiCiAgICBfX2F0dHJzX18gPSBbJ21heF9yZXRyaWVzJywgJ2NvbmZpZycsICdfcG9vbF9jb25uZWN0aW9ucycsICdfcG9vbF9tYXhzaXplJywKICAgICAgICAgICAgICAgICAnX3Bvb2xfYmxvY2snXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb29sX2Nvbm5lY3Rpb25zPURFRkFVTFRfUE9PTFNJWkUsCiAgICAgICAgICAgICAgICAgcG9vbF9tYXhzaXplPURFRkFVTFRfUE9PTFNJWkUsIG1heF9yZXRyaWVzPURFRkFVTFRfUkVUUklFUywKICAgICAgICAgICAgICAgICBwb29sX2Jsb2NrPURFRkFVTFRfUE9PTEJMT0NLKToKICAgICAgICBpZiBtYXhfcmV0cmllcyA9PSBERUZBVUxUX1JFVFJJRVM6CiAgICAgICAgICAgIHNlbGYubWF4X3JldHJpZXMgPSBSZXRyeSgwLCByZWFkPUZhbHNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF4X3JldHJpZXMgPSBSZXRyeS5mcm9tX2ludChtYXhfcmV0cmllcykKICAgICAgICBzZWxmLmNvbmZpZyA9IHt9CiAgICAgICAgc2VsZi5wcm94eV9tYW5hZ2VyID0ge30KCiAgICAgICAgc3VwZXIoSFRUUEFkYXB0ZXIsIHNlbGYpLl9faW5pdF9fKCkKCiAgICAgICAgc2VsZi5fcG9vbF9jb25uZWN0aW9ucyA9IHBvb2xfY29ubmVjdGlvbnMKICAgICAgICBzZWxmLl9wb29sX21heHNpemUgPSBwb29sX21heHNpemUKICAgICAgICBzZWxmLl9wb29sX2Jsb2NrID0gcG9vbF9ibG9jawoKICAgICAgICBzZWxmLmluaXRfcG9vbG1hbmFnZXIocG9vbF9jb25uZWN0aW9ucywgcG9vbF9tYXhzaXplLCBibG9jaz1wb29sX2Jsb2NrKQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGRpY3QoKGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpIGZvciBhdHRyIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2F0dHJzX18pCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CiAgICAgICAgIyBDYW4ndCBoYW5kbGUgYnkgYWRkaW5nICdwcm94eV9tYW5hZ2VyJyB0byBzZWxmLl9fYXR0cnNfXyBiZWNhdXNlCiAgICAgICAgIyBzZWxmLnBvb2xtYW5hZ2VyIHVzZXMgYSBsYW1iZGEgZnVuY3Rpb24sIHdoaWNoIGlzbid0IHBpY2tsZWFibGUuCiAgICAgICAgc2VsZi5wcm94eV9tYW5hZ2VyID0ge30KICAgICAgICBzZWxmLmNvbmZpZyA9IHt9CgogICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQoKICAgICAgICBzZWxmLmluaXRfcG9vbG1hbmFnZXIoc2VsZi5fcG9vbF9jb25uZWN0aW9ucywgc2VsZi5fcG9vbF9tYXhzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaz1zZWxmLl9wb29sX2Jsb2NrKQoKICAgIGRlZiBpbml0X3Bvb2xtYW5hZ2VyKHNlbGYsIGNvbm5lY3Rpb25zLCBtYXhzaXplLCBibG9jaz1ERUZBVUxUX1BPT0xCTE9DSywgKipwb29sX2t3YXJncyk6CiAgICAgICAgIiIiSW5pdGlhbGl6ZXMgYSB1cmxsaWIzIFBvb2xNYW5hZ2VyLgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkKICAgICAgICBleHBvc2VkIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gY29ubmVjdGlvbnM6IFRoZSBudW1iZXIgb2YgdXJsbGliMyBjb25uZWN0aW9uIHBvb2xzIHRvIGNhY2hlLgogICAgICAgIDpwYXJhbSBtYXhzaXplOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdG8gc2F2ZSBpbiB0aGUgcG9vbC4KICAgICAgICA6cGFyYW0gYmxvY2s6IEJsb2NrIHdoZW4gbm8gZnJlZSBjb25uZWN0aW9ucyBhcmUgYXZhaWxhYmxlLgogICAgICAgIDpwYXJhbSBwb29sX2t3YXJnczogRXh0cmEga2V5d29yZCBhcmd1bWVudHMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBQb29sIE1hbmFnZXIuCiAgICAgICAgIiIiCiAgICAgICAgIyBzYXZlIHRoZXNlIHZhbHVlcyBmb3IgcGlja2xpbmcKICAgICAgICBzZWxmLl9wb29sX2Nvbm5lY3Rpb25zID0gY29ubmVjdGlvbnMKICAgICAgICBzZWxmLl9wb29sX21heHNpemUgPSBtYXhzaXplCiAgICAgICAgc2VsZi5fcG9vbF9ibG9jayA9IGJsb2NrCgogICAgICAgIHNlbGYucG9vbG1hbmFnZXIgPSBQb29sTWFuYWdlcihudW1fcG9vbHM9Y29ubmVjdGlvbnMsIG1heHNpemU9bWF4c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s9YmxvY2ssIHN0cmljdD1UcnVlLCAqKnBvb2xfa3dhcmdzKQoKICAgIGRlZiBwcm94eV9tYW5hZ2VyX2ZvcihzZWxmLCBwcm94eSwgKipwcm94eV9rd2FyZ3MpOgogICAgICAgICIiIlJldHVybiB1cmxsaWIzIFByb3h5TWFuYWdlciBmb3IgdGhlIGdpdmVuIHByb3h5LgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkKICAgICAgICBleHBvc2VkIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gcHJveHk6IFRoZSBwcm94eSB0byByZXR1cm4gYSB1cmxsaWIzIFByb3h5TWFuYWdlciBmb3IuCiAgICAgICAgOnBhcmFtIHByb3h5X2t3YXJnczogRXh0cmEga2V5d29yZCBhcmd1bWVudHMgdXNlZCB0byBjb25maWd1cmUgdGhlIFByb3h5IE1hbmFnZXIuCiAgICAgICAgOnJldHVybnM6IFByb3h5TWFuYWdlcgogICAgICAgIDpydHlwZTogdXJsbGliMy5Qcm94eU1hbmFnZXIKICAgICAgICAiIiIKICAgICAgICBpZiBwcm94eSBpbiBzZWxmLnByb3h5X21hbmFnZXI6CiAgICAgICAgICAgIG1hbmFnZXIgPSBzZWxmLnByb3h5X21hbmFnZXJbcHJveHldCiAgICAgICAgZWxpZiBwcm94eS5sb3dlcigpLnN0YXJ0c3dpdGgoJ3NvY2tzJyk6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IGdldF9hdXRoX2Zyb21fdXJsKHByb3h5KQogICAgICAgICAgICBtYW5hZ2VyID0gc2VsZi5wcm94eV9tYW5hZ2VyW3Byb3h5XSA9IFNPQ0tTUHJveHlNYW5hZ2VyKAogICAgICAgICAgICAgICAgcHJveHksCiAgICAgICAgICAgICAgICB1c2VybmFtZT11c2VybmFtZSwKICAgICAgICAgICAgICAgIHBhc3N3b3JkPXBhc3N3b3JkLAogICAgICAgICAgICAgICAgbnVtX3Bvb2xzPXNlbGYuX3Bvb2xfY29ubmVjdGlvbnMsCiAgICAgICAgICAgICAgICBtYXhzaXplPXNlbGYuX3Bvb2xfbWF4c2l6ZSwKICAgICAgICAgICAgICAgIGJsb2NrPXNlbGYuX3Bvb2xfYmxvY2ssCiAgICAgICAgICAgICAgICAqKnByb3h5X2t3YXJncwogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJveHlfaGVhZGVycyA9IHNlbGYucHJveHlfaGVhZGVycyhwcm94eSkKICAgICAgICAgICAgbWFuYWdlciA9IHNlbGYucHJveHlfbWFuYWdlcltwcm94eV0gPSBwcm94eV9mcm9tX3VybCgKICAgICAgICAgICAgICAgIHByb3h5LAogICAgICAgICAgICAgICAgcHJveHlfaGVhZGVycz1wcm94eV9oZWFkZXJzLAogICAgICAgICAgICAgICAgbnVtX3Bvb2xzPXNlbGYuX3Bvb2xfY29ubmVjdGlvbnMsCiAgICAgICAgICAgICAgICBtYXhzaXplPXNlbGYuX3Bvb2xfbWF4c2l6ZSwKICAgICAgICAgICAgICAgIGJsb2NrPXNlbGYuX3Bvb2xfYmxvY2ssCiAgICAgICAgICAgICAgICAqKnByb3h5X2t3YXJncykKCiAgICAgICAgcmV0dXJuIG1hbmFnZXIKCiAgICBkZWYgY2VydF92ZXJpZnkoc2VsZiwgY29ubiwgdXJsLCB2ZXJpZnksIGNlcnQpOgogICAgICAgICIiIlZlcmlmeSBhIFNTTCBjZXJ0aWZpY2F0ZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyCiAgICAgICAgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIGNvbm46IFRoZSB1cmxsaWIzIGNvbm5lY3Rpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2VydC4KICAgICAgICA6cGFyYW0gdXJsOiBUaGUgcmVxdWVzdGVkIFVSTC4KICAgICAgICA6cGFyYW0gdmVyaWZ5OiBFaXRoZXIgYSBib29sZWFuLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRyb2xzIHdoZXRoZXIgd2UgdmVyaWZ5CiAgICAgICAgICAgIHRoZSBzZXJ2ZXIncyBUTFMgY2VydGlmaWNhdGUsIG9yIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgYSBwYXRoCiAgICAgICAgICAgIHRvIGEgQ0EgYnVuZGxlIHRvIHVzZQogICAgICAgIDpwYXJhbSBjZXJ0OiBUaGUgU1NMIGNlcnRpZmljYXRlIHRvIHZlcmlmeS4KICAgICAgICAiIiIKICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKCdodHRwcycpIGFuZCB2ZXJpZnk6CgogICAgICAgICAgICBjZXJ0X2xvYyA9IE5vbmUKCiAgICAgICAgICAgICMgQWxsb3cgc2VsZi1zcGVjaWZpZWQgY2VydCBsb2NhdGlvbi4KICAgICAgICAgICAgaWYgdmVyaWZ5IGlzIG5vdCBUcnVlOgogICAgICAgICAgICAgICAgY2VydF9sb2MgPSB2ZXJpZnkKCiAgICAgICAgICAgIGlmIG5vdCBjZXJ0X2xvYzoKICAgICAgICAgICAgICAgIGNlcnRfbG9jID0gREVGQVVMVF9DQV9CVU5ETEVfUEFUSAoKICAgICAgICAgICAgaWYgbm90IGNlcnRfbG9jIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhjZXJ0X2xvYyk6CiAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJDb3VsZCBub3QgZmluZCBhIHN1aXRhYmxlIFRMUyBDQSBjZXJ0aWZpY2F0ZSBidW5kbGUsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGF0aDogezB9Ii5mb3JtYXQoY2VydF9sb2MpKQoKICAgICAgICAgICAgY29ubi5jZXJ0X3JlcXMgPSAnQ0VSVF9SRVFVSVJFRCcKCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGNlcnRfbG9jKToKICAgICAgICAgICAgICAgIGNvbm4uY2FfY2VydHMgPSBjZXJ0X2xvYwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29ubi5jYV9jZXJ0X2RpciA9IGNlcnRfbG9jCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29ubi5jZXJ0X3JlcXMgPSAnQ0VSVF9OT05FJwogICAgICAgICAgICBjb25uLmNhX2NlcnRzID0gTm9uZQogICAgICAgICAgICBjb25uLmNhX2NlcnRfZGlyID0gTm9uZQoKICAgICAgICBpZiBjZXJ0OgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjZXJ0LCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGNvbm4uY2VydF9maWxlID0gY2VydFswXQogICAgICAgICAgICAgICAgY29ubi5rZXlfZmlsZSA9IGNlcnRbMV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbm4uY2VydF9maWxlID0gY2VydAogICAgICAgICAgICAgICAgY29ubi5rZXlfZmlsZSA9IE5vbmUKICAgICAgICAgICAgaWYgY29ubi5jZXJ0X2ZpbGUgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhjb25uLmNlcnRfZmlsZSk6CiAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJDb3VsZCBub3QgZmluZCB0aGUgVExTIGNlcnRpZmljYXRlIGZpbGUsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGF0aDogezB9Ii5mb3JtYXQoY29ubi5jZXJ0X2ZpbGUpKQogICAgICAgICAgICBpZiBjb25uLmtleV9maWxlIGFuZCBub3Qgb3MucGF0aC5leGlzdHMoY29ubi5rZXlfZmlsZSk6CiAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJDb3VsZCBub3QgZmluZCB0aGUgVExTIGtleSBmaWxlLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHBhdGg6IHswfSIuZm9ybWF0KGNvbm4ua2V5X2ZpbGUpKQoKICAgIGRlZiBidWlsZF9yZXNwb25zZShzZWxmLCByZXEsIHJlc3ApOgogICAgICAgICIiIkJ1aWxkcyBhIDpjbGFzczpgUmVzcG9uc2UgPHJlcXVlc3RzLlJlc3BvbnNlPmAgb2JqZWN0IGZyb20gYSB1cmxsaWIzCiAgICAgICAgcmVzcG9uc2UuIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvZGUsIGFuZCBpcyBvbmx5IGV4cG9zZWQKICAgICAgICBmb3IgdXNlIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YAoKICAgICAgICA6cGFyYW0gcmVxOiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHJlc3BvbnNlLgogICAgICAgIDpwYXJhbSByZXNwOiBUaGUgdXJsbGliMyByZXNwb25zZSBvYmplY3QuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgogICAgICAgIHJlc3BvbnNlID0gUmVzcG9uc2UoKQoKICAgICAgICAjIEZhbGxiYWNrIHRvIE5vbmUgaWYgdGhlcmUncyBubyBzdGF0dXNfY29kZSwgZm9yIHdoYXRldmVyIHJlYXNvbi4KICAgICAgICByZXNwb25zZS5zdGF0dXNfY29kZSA9IGdldGF0dHIocmVzcCwgJ3N0YXR1cycsIE5vbmUpCgogICAgICAgICMgTWFrZSBoZWFkZXJzIGNhc2UtaW5zZW5zaXRpdmUuCiAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QoZ2V0YXR0cihyZXNwLCAnaGVhZGVycycsIHt9KSkKCiAgICAgICAgIyBTZXQgZW5jb2RpbmcuCiAgICAgICAgcmVzcG9uc2UuZW5jb2RpbmcgPSBnZXRfZW5jb2RpbmdfZnJvbV9oZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpCiAgICAgICAgcmVzcG9uc2UucmF3ID0gcmVzcAogICAgICAgIHJlc3BvbnNlLnJlYXNvbiA9IHJlc3BvbnNlLnJhdy5yZWFzb24KCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXEudXJsLCBieXRlcyk6CiAgICAgICAgICAgIHJlc3BvbnNlLnVybCA9IHJlcS51cmwuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzcG9uc2UudXJsID0gcmVxLnVybAoKICAgICAgICAjIEFkZCBuZXcgY29va2llcyBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihyZXNwb25zZS5jb29raWVzLCByZXEsIHJlc3ApCgogICAgICAgICMgR2l2ZSB0aGUgUmVzcG9uc2Ugc29tZSBjb250ZXh0LgogICAgICAgIHJlc3BvbnNlLnJlcXVlc3QgPSByZXEKICAgICAgICByZXNwb25zZS5jb25uZWN0aW9uID0gc2VsZgoKICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICBkZWYgZ2V0X2Nvbm5lY3Rpb24oc2VsZiwgdXJsLCBwcm94aWVzPU5vbmUpOgogICAgICAgICIiIlJldHVybnMgYSB1cmxsaWIzIGNvbm5lY3Rpb24gZm9yIHRoZSBnaXZlbiBVUkwuIFRoaXMgc2hvdWxkIG5vdCBiZQogICAgICAgIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIHVybDogVGhlIFVSTCB0byBjb25uZWN0IHRvLgogICAgICAgIDpwYXJhbSBwcm94aWVzOiAob3B0aW9uYWwpIEEgUmVxdWVzdHMtc3R5bGUgZGljdGlvbmFyeSBvZiBwcm94aWVzIHVzZWQgb24gdGhpcyByZXF1ZXN0LgogICAgICAgIDpydHlwZTogdXJsbGliMy5Db25uZWN0aW9uUG9vbAogICAgICAgICIiIgogICAgICAgIHByb3h5ID0gc2VsZWN0X3Byb3h5KHVybCwgcHJveGllcykKCiAgICAgICAgaWYgcHJveHk6CiAgICAgICAgICAgIHByb3h5ID0gcHJlcGVuZF9zY2hlbWVfaWZfbmVlZGVkKHByb3h5LCAnaHR0cCcpCiAgICAgICAgICAgIHByb3h5X21hbmFnZXIgPSBzZWxmLnByb3h5X21hbmFnZXJfZm9yKHByb3h5KQogICAgICAgICAgICBjb25uID0gcHJveHlfbWFuYWdlci5jb25uZWN0aW9uX2Zyb21fdXJsKHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE9ubHkgc2NoZW1lIHNob3VsZCBiZSBsb3dlciBjYXNlCiAgICAgICAgICAgIHBhcnNlZCA9IHVybHBhcnNlKHVybCkKICAgICAgICAgICAgdXJsID0gcGFyc2VkLmdldHVybCgpCiAgICAgICAgICAgIGNvbm4gPSBzZWxmLnBvb2xtYW5hZ2VyLmNvbm5lY3Rpb25fZnJvbV91cmwodXJsKQoKICAgICAgICByZXR1cm4gY29ubgoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJEaXNwb3NlcyBvZiBhbnkgaW50ZXJuYWwgc3RhdGUuCgogICAgICAgIEN1cnJlbnRseSwgdGhpcyBjbG9zZXMgdGhlIFBvb2xNYW5hZ2VyIGFuZCBhbnkgYWN0aXZlIFByb3h5TWFuYWdlciwKICAgICAgICB3aGljaCBjbG9zZXMgYW55IHBvb2xlZCBjb25uZWN0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnBvb2xtYW5hZ2VyLmNsZWFyKCkKICAgICAgICBmb3IgcHJveHkgaW4gc2VsZi5wcm94eV9tYW5hZ2VyLnZhbHVlcygpOgogICAgICAgICAgICBwcm94eS5jbGVhcigpCgogICAgZGVmIHJlcXVlc3RfdXJsKHNlbGYsIHJlcXVlc3QsIHByb3hpZXMpOgogICAgICAgICIiIk9idGFpbiB0aGUgdXJsIHRvIHVzZSB3aGVuIG1ha2luZyB0aGUgZmluYWwgcmVxdWVzdC4KCiAgICAgICAgSWYgdGhlIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0aHJvdWdoIGEgSFRUUCBwcm94eSwgdGhlIGZ1bGwgVVJMIGhhcyB0bwogICAgICAgIGJlIHVzZWQuIE90aGVyd2lzZSwgd2Ugc2hvdWxkIG9ubHkgdXNlIHRoZSBwYXRoIHBvcnRpb24gb2YgdGhlIFVSTC4KCiAgICAgICAgVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlCiAgICAgICAgd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBiZWluZyBzZW50LgogICAgICAgIDpwYXJhbSBwcm94aWVzOiBBIGRpY3Rpb25hcnkgb2Ygc2NoZW1lcyBvciBzY2hlbWVzIGFuZCBob3N0cyB0byBwcm94eSBVUkxzLgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgcHJveHkgPSBzZWxlY3RfcHJveHkocmVxdWVzdC51cmwsIHByb3hpZXMpCiAgICAgICAgc2NoZW1lID0gdXJscGFyc2UocmVxdWVzdC51cmwpLnNjaGVtZQoKICAgICAgICBpc19wcm94aWVkX2h0dHBfcmVxdWVzdCA9IChwcm94eSBhbmQgc2NoZW1lICE9ICdodHRwcycpCiAgICAgICAgdXNpbmdfc29ja3NfcHJveHkgPSBGYWxzZQogICAgICAgIGlmIHByb3h5OgogICAgICAgICAgICBwcm94eV9zY2hlbWUgPSB1cmxwYXJzZShwcm94eSkuc2NoZW1lLmxvd2VyKCkKICAgICAgICAgICAgdXNpbmdfc29ja3NfcHJveHkgPSBwcm94eV9zY2hlbWUuc3RhcnRzd2l0aCgnc29ja3MnKQoKICAgICAgICB1cmwgPSByZXF1ZXN0LnBhdGhfdXJsCiAgICAgICAgaWYgaXNfcHJveGllZF9odHRwX3JlcXVlc3QgYW5kIG5vdCB1c2luZ19zb2Nrc19wcm94eToKICAgICAgICAgICAgdXJsID0gdXJsZGVmcmFnYXV0aChyZXF1ZXN0LnVybCkKCiAgICAgICAgcmV0dXJuIHVybAoKICAgIGRlZiBhZGRfaGVhZGVycyhzZWxmLCByZXF1ZXN0LCAqKmt3YXJncyk6CiAgICAgICAgIiIiQWRkIGFueSBoZWFkZXJzIG5lZWRlZCBieSB0aGUgY29ubmVjdGlvbi4gQXMgb2YgdjIuMCB0aGlzIGRvZXMKICAgICAgICBub3RoaW5nIGJ5IGRlZmF1bHQsIGJ1dCBpcyBsZWZ0IGZvciBvdmVycmlkaW5nIGJ5IHVzZXJzIHRoYXQgc3ViY2xhc3MKICAgICAgICB0aGUgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlCiAgICAgICAgd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCB0byBhZGQgaGVhZGVycyB0by4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBUaGUga2V5d29yZCBhcmd1bWVudHMgZnJvbSB0aGUgY2FsbCB0byBzZW5kKCkuCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBwcm94eV9oZWFkZXJzKHNlbGYsIHByb3h5KToKICAgICAgICAiIiJSZXR1cm5zIGEgZGljdGlvbmFyeSBvZiB0aGUgaGVhZGVycyB0byBhZGQgdG8gYW55IHJlcXVlc3Qgc2VudAogICAgICAgIHRocm91Z2ggYSBwcm94eS4gVGhpcyB3b3JrcyB3aXRoIHVybGxpYjMgbWFnaWMgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUKICAgICAgICBjb3JyZWN0bHkgc2VudCB0byB0aGUgcHJveHksIHJhdGhlciB0aGFuIGluIGEgdHVubmVsbGVkIHJlcXVlc3QgaWYKICAgICAgICBDT05ORUNUIGlzIGJlaW5nIHVzZWQuCgogICAgICAgIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvZGUsIGFuZCBpcyBvbmx5IGV4cG9zZWQgZm9yIHVzZQogICAgICAgIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IFRoZSB1cmwgb2YgdGhlIHByb3h5IGJlaW5nIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC4KICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICBoZWFkZXJzID0ge30KICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBnZXRfYXV0aF9mcm9tX3VybChwcm94eSkKCiAgICAgICAgaWYgdXNlcm5hbWU6CiAgICAgICAgICAgIGhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSA9IF9iYXNpY19hdXRoX3N0cih1c2VybmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkKQoKICAgICAgICByZXR1cm4gaGVhZGVycwoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsIHN0cmVhbT1GYWxzZSwgdGltZW91dD1Ob25lLCB2ZXJpZnk9VHJ1ZSwgY2VydD1Ob25lLCBwcm94aWVzPU5vbmUpOgogICAgICAgICIiIlNlbmRzIFByZXBhcmVkUmVxdWVzdCBvYmplY3QuIFJldHVybnMgUmVzcG9uc2Ugb2JqZWN0LgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBiZWluZyBzZW50LgogICAgICAgIDpwYXJhbSBzdHJlYW06IChvcHRpb25hbCkgV2hldGhlciB0byBzdHJlYW0gdGhlIHJlcXVlc3QgY29udGVudC4KICAgICAgICA6cGFyYW0gdGltZW91dDogKG9wdGlvbmFsKSBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHNlbmQKICAgICAgICAgICAgZGF0YSBiZWZvcmUgZ2l2aW5nIHVwLCBhcyBhIGZsb2F0LCBvciBhIDpyZWY6YChjb25uZWN0IHRpbWVvdXQsCiAgICAgICAgICAgIHJlYWQgdGltZW91dCkgPHRpbWVvdXRzPmAgdHVwbGUuCiAgICAgICAgOnR5cGUgdGltZW91dDogZmxvYXQgb3IgdHVwbGUgb3IgdXJsbGliMyBUaW1lb3V0IG9iamVjdAogICAgICAgIDpwYXJhbSB2ZXJpZnk6IChvcHRpb25hbCkgRWl0aGVyIGEgYm9vbGVhbiwgaW4gd2hpY2ggY2FzZSBpdCBjb250cm9scyB3aGV0aGVyCiAgICAgICAgICAgIHdlIHZlcmlmeSB0aGUgc2VydmVyJ3MgVExTIGNlcnRpZmljYXRlLCBvciBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdAogICAgICAgICAgICBtdXN0IGJlIGEgcGF0aCB0byBhIENBIGJ1bmRsZSB0byB1c2UKICAgICAgICA6cGFyYW0gY2VydDogKG9wdGlvbmFsKSBBbnkgdXNlci1wcm92aWRlZCBTU0wgY2VydGlmaWNhdGUgdG8gYmUgdHJ1c3RlZC4KICAgICAgICA6cGFyYW0gcHJveGllczogKG9wdGlvbmFsKSBUaGUgcHJveGllcyBkaWN0aW9uYXJ5IHRvIGFwcGx5IHRvIHRoZSByZXF1ZXN0LgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgY29ubiA9IHNlbGYuZ2V0X2Nvbm5lY3Rpb24ocmVxdWVzdC51cmwsIHByb3hpZXMpCgogICAgICAgIHNlbGYuY2VydF92ZXJpZnkoY29ubiwgcmVxdWVzdC51cmwsIHZlcmlmeSwgY2VydCkKICAgICAgICB1cmwgPSBzZWxmLnJlcXVlc3RfdXJsKHJlcXVlc3QsIHByb3hpZXMpCiAgICAgICAgc2VsZi5hZGRfaGVhZGVycyhyZXF1ZXN0KQoKICAgICAgICBjaHVua2VkID0gbm90IChyZXF1ZXN0LmJvZHkgaXMgTm9uZSBvciAnQ29udGVudC1MZW5ndGgnIGluIHJlcXVlc3QuaGVhZGVycykKCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0aW1lb3V0LCB0dXBsZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvbm5lY3QsIHJlYWQgPSB0aW1lb3V0CiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gVGltZW91dFNhdWNlKGNvbm5lY3Q9Y29ubmVjdCwgcmVhZD1yZWFkKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIyB0aGlzIG1heSByYWlzZSBhIHN0cmluZyBmb3JtYXR0aW5nIGVycm9yLgogICAgICAgICAgICAgICAgZXJyID0gKCJJbnZhbGlkIHRpbWVvdXQgezB9LiBQYXNzIGEgKGNvbm5lY3QsIHJlYWQpICIKICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCB0dXBsZSwgb3IgYSBzaW5nbGUgZmxvYXQgdG8gc2V0ICIKICAgICAgICAgICAgICAgICAgICAgICAiYm90aCB0aW1lb3V0cyB0byB0aGUgc2FtZSB2YWx1ZSIuZm9ybWF0KHRpbWVvdXQpKQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRpbWVvdXQsIFRpbWVvdXRTYXVjZSk6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICB0aW1lb3V0ID0gVGltZW91dFNhdWNlKGNvbm5lY3Q9dGltZW91dCwgcmVhZD10aW1lb3V0KQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG5vdCBjaHVua2VkOgogICAgICAgICAgICAgICAgcmVzcCA9IGNvbm4udXJsb3BlbigKICAgICAgICAgICAgICAgICAgICBtZXRob2Q9cmVxdWVzdC5tZXRob2QsCiAgICAgICAgICAgICAgICAgICAgdXJsPXVybCwKICAgICAgICAgICAgICAgICAgICBib2R5PXJlcXVlc3QuYm9keSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXJlcXVlc3QuaGVhZGVycywKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBhc3NlcnRfc2FtZV9ob3N0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgIHByZWxvYWRfY29udGVudD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY29udGVudD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICByZXRyaWVzPXNlbGYubWF4X3JldHJpZXMsCiAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0CiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIFNlbmQgdGhlIHJlcXVlc3QuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGNvbm4sICdwcm94eV9wb29sJyk6CiAgICAgICAgICAgICAgICAgICAgY29ubiA9IGNvbm4ucHJveHlfcG9vbAoKICAgICAgICAgICAgICAgIGxvd19jb25uID0gY29ubi5fZ2V0X2Nvbm4odGltZW91dD1ERUZBVUxUX1BPT0xfVElNRU9VVCkKCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4ucHV0cmVxdWVzdChyZXF1ZXN0Lm1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfYWNjZXB0X2VuY29kaW5nPVRydWUpCgogICAgICAgICAgICAgICAgICAgIGZvciBoZWFkZXIsIHZhbHVlIGluIHJlcXVlc3QuaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5wdXRoZWFkZXIoaGVhZGVyLCB2YWx1ZSkKCiAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uZW5kaGVhZGVycygpCgogICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJlcXVlc3QuYm9keToKICAgICAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uc2VuZChoZXgobGVuKGkpKVsyOl0uZW5jb2RlKCd1dGYtOCcpKQogICAgICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5zZW5kKGInXHJcbicpCiAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnNlbmQoaSkKICAgICAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uc2VuZChiJ1xyXG4nKQogICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnNlbmQoYicwXHJcblxyXG4nKQoKICAgICAgICAgICAgICAgICAgICAjIFJlY2VpdmUgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3IgUHl0aG9uIDIuNysgdmVyc2lvbnMsIHVzZSBidWZmZXJpbmcgb2YgSFRUUAogICAgICAgICAgICAgICAgICAgICAgICAjIHJlc3BvbnNlcwogICAgICAgICAgICAgICAgICAgICAgICByID0gbG93X2Nvbm4uZ2V0cmVzcG9uc2UoYnVmZmVyaW5nPVRydWUpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjYgdmVyc2lvbnMgYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgciA9IGxvd19jb25uLmdldHJlc3BvbnNlKCkKCiAgICAgICAgICAgICAgICAgICAgcmVzcCA9IEhUVFBSZXNwb25zZS5mcm9tX2h0dHBsaWIoCiAgICAgICAgICAgICAgICAgICAgICAgIHIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvb2w9Y29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbj1sb3dfY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZF9jb250ZW50PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY29udGVudD1GYWxzZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICAgICAjIElmIHdlIGhpdCBhbnkgcHJvYmxlbXMgaGVyZSwgY2xlYW4gdXAgdGhlIGNvbm5lY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgIyBUaGVuLCByZXJhaXNlIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSB0aGUgYWN0dWFsIGV4Y2VwdGlvbi4KICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZXhjZXB0IChQcm90b2NvbEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGVycjoKICAgICAgICAgICAgcmFpc2UgQ29ubmVjdGlvbkVycm9yKGVyciwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICBleGNlcHQgTWF4UmV0cnlFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUucmVhc29uLCBDb25uZWN0VGltZW91dEVycm9yKToKICAgICAgICAgICAgICAgICMgVE9ETzogUmVtb3ZlIHRoaXMgaW4gMy4wLjA6IHNlZSAjMjgxMQogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZS5yZWFzb24sIE5ld0Nvbm5lY3Rpb25FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29ubmVjdFRpbWVvdXQoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLnJlYXNvbiwgUmVzcG9uc2VFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBSZXRyeUVycm9yKGUsIHJlcXVlc3Q9cmVxdWVzdCkKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZS5yZWFzb24sIF9Qcm94eUVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIFByb3h5RXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLnJlYXNvbiwgX1NTTEVycm9yKToKICAgICAgICAgICAgICAgICMgVGhpcyBicmFuY2ggaXMgZm9yIHVybGxpYjMgdjEuMjIgYW5kIGxhdGVyLgogICAgICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICAgICAgcmFpc2UgQ29ubmVjdGlvbkVycm9yKGUsIHJlcXVlc3Q9cmVxdWVzdCkKCiAgICAgICAgZXhjZXB0IENsb3NlZFBvb2xFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBDb25uZWN0aW9uRXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICBleGNlcHQgX1Byb3h5RXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgUHJveHlFcnJvcihlKQoKICAgICAgICBleGNlcHQgKF9TU0xFcnJvciwgX0hUVFBFcnJvcikgYXMgZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCBfU1NMRXJyb3IpOgogICAgICAgICAgICAgICAgIyBUaGlzIGJyYW5jaCBpcyBmb3IgdXJsbGliMyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gdjEuMjIKICAgICAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKGUsIHJlcXVlc3Q9cmVxdWVzdCkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIFJlYWRUaW1lb3V0RXJyb3IpOgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXQoZSwgcmVxdWVzdD1yZXF1ZXN0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgcmV0dXJuIHNlbGYuYnVpbGRfcmVzcG9uc2UocmVxdWVzdCwgcmVzcCkKUEsDBBQAAAAAAAAAIQCYY+gvXRgAAF0YAAA4AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hcGkucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmFwaQp+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFJlcXVlc3RzIEFQSS4KCjpjb3B5cmlnaHQ6IChjKSAyMDEyIGJ5IEtlbm5ldGggUmVpdHouCjpsaWNlbnNlOiBBcGFjaGUyLCBzZWUgTElDRU5TRSBmb3IgbW9yZSBkZXRhaWxzLgoiIiIKCmZyb20gLiBpbXBvcnQgc2Vzc2lvbnMKCgpkZWYgcmVxdWVzdChtZXRob2QsIHVybCwgKiprd2FyZ3MpOgogICAgIiIiQ29uc3RydWN0cyBhbmQgc2VuZHMgYSA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YC4KCiAgICA6cGFyYW0gbWV0aG9kOiBtZXRob2QgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gcGFyYW1zOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb3IgYnl0ZXMgdG8gYmUgc2VudCBpbiB0aGUgcXVlcnkgc3RyaW5nIGZvciB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb3IgbGlzdCBvZiB0dXBsZXMgYGBbKGtleSwgdmFsdWUpXWBgICh3aWxsIGJlIGZvcm0tZW5jb2RlZCksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIGRhdGEgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBoZWFkZXJzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb2YgSFRUUCBIZWFkZXJzIHRvIHNlbmQgd2l0aCB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBjb29raWVzOiAob3B0aW9uYWwpIERpY3Qgb3IgQ29va2llSmFyIG9iamVjdCB0byBzZW5kIHdpdGggdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gZmlsZXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvZiBgYCduYW1lJzogZmlsZS1saWtlLW9iamVjdHNgYCAob3IgYGB7J25hbWUnOiBmaWxlLXR1cGxlfWBgKSBmb3IgbXVsdGlwYXJ0IGVuY29kaW5nIHVwbG9hZC4KICAgICAgICBgYGZpbGUtdHVwbGVgYCBjYW4gYmUgYSAyLXR1cGxlIGBgKCdmaWxlbmFtZScsIGZpbGVvYmopYGAsIDMtdHVwbGUgYGAoJ2ZpbGVuYW1lJywgZmlsZW9iaiwgJ2NvbnRlbnRfdHlwZScpYGAKICAgICAgICBvciBhIDQtdHVwbGUgYGAoJ2ZpbGVuYW1lJywgZmlsZW9iaiwgJ2NvbnRlbnRfdHlwZScsIGN1c3RvbV9oZWFkZXJzKWBgLCB3aGVyZSBgYCdjb250ZW50LXR5cGUnYGAgaXMgYSBzdHJpbmcKICAgICAgICBkZWZpbmluZyB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBnaXZlbiBmaWxlIGFuZCBgYGN1c3RvbV9oZWFkZXJzYGAgYSBkaWN0LWxpa2Ugb2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBoZWFkZXJzCiAgICAgICAgdG8gYWRkIGZvciB0aGUgZmlsZS4KICAgIDpwYXJhbSBhdXRoOiAob3B0aW9uYWwpIEF1dGggdHVwbGUgdG8gZW5hYmxlIEJhc2ljL0RpZ2VzdC9DdXN0b20gSFRUUCBBdXRoLgogICAgOnBhcmFtIHRpbWVvdXQ6IChvcHRpb25hbCkgSG93IG1hbnkgc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHNlbmQgZGF0YQogICAgICAgIGJlZm9yZSBnaXZpbmcgdXAsIGFzIGEgZmxvYXQsIG9yIGEgOnJlZjpgKGNvbm5lY3QgdGltZW91dCwgcmVhZAogICAgICAgIHRpbWVvdXQpIDx0aW1lb3V0cz5gIHR1cGxlLgogICAgOnR5cGUgdGltZW91dDogZmxvYXQgb3IgdHVwbGUKICAgIDpwYXJhbSBhbGxvd19yZWRpcmVjdHM6IChvcHRpb25hbCkgQm9vbGVhbi4gRW5hYmxlL2Rpc2FibGUgR0VUL09QVElPTlMvUE9TVC9QVVQvUEFUQ0gvREVMRVRFL0hFQUQgcmVkaXJlY3Rpb24uIERlZmF1bHRzIHRvIGBgVHJ1ZWBgLgogICAgOnR5cGUgYWxsb3dfcmVkaXJlY3RzOiBib29sCiAgICA6cGFyYW0gcHJveGllczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG1hcHBpbmcgcHJvdG9jb2wgdG8gdGhlIFVSTCBvZiB0aGUgcHJveHkuCiAgICA6cGFyYW0gdmVyaWZ5OiAob3B0aW9uYWwpIEVpdGhlciBhIGJvb2xlYW4sIGluIHdoaWNoIGNhc2UgaXQgY29udHJvbHMgd2hldGhlciB3ZSB2ZXJpZnkKICAgICAgICAgICAgdGhlIHNlcnZlcidzIFRMUyBjZXJ0aWZpY2F0ZSwgb3IgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBhIHBhdGgKICAgICAgICAgICAgdG8gYSBDQSBidW5kbGUgdG8gdXNlLiBEZWZhdWx0cyB0byBgYFRydWVgYC4KICAgIDpwYXJhbSBzdHJlYW06IChvcHRpb25hbCkgaWYgYGBGYWxzZWBgLCB0aGUgcmVzcG9uc2UgY29udGVudCB3aWxsIGJlIGltbWVkaWF0ZWx5IGRvd25sb2FkZWQuCiAgICA6cGFyYW0gY2VydDogKG9wdGlvbmFsKSBpZiBTdHJpbmcsIHBhdGggdG8gc3NsIGNsaWVudCBjZXJ0IGZpbGUgKC5wZW0pLiBJZiBUdXBsZSwgKCdjZXJ0JywgJ2tleScpIHBhaXIuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQoKICAgIFVzYWdlOjoKCiAgICAgID4+PiBpbXBvcnQgcmVxdWVzdHMKICAgICAgPj4+IHJlcSA9IHJlcXVlc3RzLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vaHR0cGJpbi5vcmcvZ2V0JykKICAgICAgPFJlc3BvbnNlIFsyMDBdPgogICAgIiIiCgogICAgIyBCeSB1c2luZyB0aGUgJ3dpdGgnIHN0YXRlbWVudCB3ZSBhcmUgc3VyZSB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQsIHRodXMgd2UKICAgICMgYXZvaWQgbGVhdmluZyBzb2NrZXRzIG9wZW4gd2hpY2ggY2FuIHRyaWdnZXIgYSBSZXNvdXJjZVdhcm5pbmcgaW4gc29tZQogICAgIyBjYXNlcywgYW5kIGxvb2sgbGlrZSBhIG1lbW9yeSBsZWFrIGluIG90aGVycy4KICAgIHdpdGggc2Vzc2lvbnMuU2Vzc2lvbigpIGFzIHNlc3Npb246CiAgICAgICAgcmV0dXJuIHNlc3Npb24ucmVxdWVzdChtZXRob2Q9bWV0aG9kLCB1cmw9dXJsLCAqKmt3YXJncykKCgpkZWYgZ2V0KHVybCwgcGFyYW1zPU5vbmUsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIEdFVCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBwYXJhbXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvciBieXRlcyB0byBiZSBzZW50IGluIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIGt3YXJncy5zZXRkZWZhdWx0KCdhbGxvd19yZWRpcmVjdHMnLCBUcnVlKQogICAgcmV0dXJuIHJlcXVlc3QoJ2dldCcsIHVybCwgcGFyYW1zPXBhcmFtcywgKiprd2FyZ3MpCgoKZGVmIG9wdGlvbnModXJsLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYW4gT1BUSU9OUyByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgVHJ1ZSkKICAgIHJldHVybiByZXF1ZXN0KCdvcHRpb25zJywgdXJsLCAqKmt3YXJncykKCgpkZWYgaGVhZCh1cmwsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIEhFQUQgcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIEZhbHNlKQogICAgcmV0dXJuIHJlcXVlc3QoJ2hlYWQnLCB1cmwsICoqa3dhcmdzKQoKCmRlZiBwb3N0KHVybCwgZGF0YT1Ob25lLCBqc29uPU5vbmUsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIFBPU1QgcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5ICh3aWxsIGJlIGZvcm0tZW5jb2RlZCksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIGRhdGEgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICByZXR1cm4gcmVxdWVzdCgncG9zdCcsIHVybCwgZGF0YT1kYXRhLCBqc29uPWpzb24sICoqa3dhcmdzKQoKCmRlZiBwdXQodXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIFBVVCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgKHdpbGwgYmUgZm9ybS1lbmNvZGVkKSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gZGF0YSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIHJldHVybiByZXF1ZXN0KCdwdXQnLCB1cmwsIGRhdGE9ZGF0YSwgKiprd2FyZ3MpCgoKZGVmIHBhdGNoKHVybCwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYSBQQVRDSCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgKHdpbGwgYmUgZm9ybS1lbmNvZGVkKSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gZGF0YSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIHJldHVybiByZXF1ZXN0KCdwYXRjaCcsIHVybCwgZGF0YT1kYXRhLCAqKmt3YXJncykKCgpkZWYgZGVsZXRlKHVybCwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgREVMRVRFIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIHJldHVybiByZXF1ZXN0KCdkZWxldGUnLCB1cmwsICoqa3dhcmdzKQpQSwMEFAAAAAAAAAAhAAOt8pIAJgAAACYAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2F1dGgucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmF1dGgKfn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGF1dGhlbnRpY2F0aW9uIGhhbmRsZXJzIGZvciBSZXF1ZXN0cy4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB0aW1lCmltcG9ydCBoYXNobGliCmltcG9ydCB0aHJlYWRpbmcKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIGJhc2U2NCBpbXBvcnQgYjY0ZW5jb2RlCgpmcm9tIC5jb21wYXQgaW1wb3J0IHVybHBhcnNlLCBzdHIsIGJhc2VzdHJpbmcKZnJvbSAuY29va2llcyBpbXBvcnQgZXh0cmFjdF9jb29raWVzX3RvX2phcgpmcm9tIC5faW50ZXJuYWxfdXRpbHMgaW1wb3J0IHRvX25hdGl2ZV9zdHJpbmcKZnJvbSAudXRpbHMgaW1wb3J0IHBhcnNlX2RpY3RfaGVhZGVyCgpDT05URU5UX1RZUEVfRk9STV9VUkxFTkNPREVEID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKQ09OVEVOVF9UWVBFX01VTFRJX1BBUlQgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScKCgpkZWYgX2Jhc2ljX2F1dGhfc3RyKHVzZXJuYW1lLCBwYXNzd29yZCk6CiAgICAiIiJSZXR1cm5zIGEgQmFzaWMgQXV0aCBzdHJpbmcuIiIiCgogICAgIyAiSSB3YW50IHVzIHRvIHB1dCBhIGJpZy1vbCcgY29tbWVudCBvbiB0b3Agb2YgaXQgdGhhdAogICAgIyBzYXlzIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgZHVtYiBidXQgd2UgbmVlZCB0byBwcmVzZXJ2ZQogICAgIyBpdCBiZWNhdXNlIHBlb3BsZSBhcmUgcmVseWluZyBvbiBpdC4iCiAgICAjICAgIC0gTHVrYXNhCiAgICAjCiAgICAjIFRoZXNlIGFyZSBoZXJlIHNvbGVseSB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgIyBmb3IgdGhpbmdzIGxpa2UgaW50cy4gVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gMy4wLjAuCiAgICBpZiBub3QgaXNpbnN0YW5jZSh1c2VybmFtZSwgYmFzZXN0cmluZyk6CiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgIk5vbi1zdHJpbmcgdXNlcm5hbWVzIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBpbiBSZXF1ZXN0cyAiCiAgICAgICAgICAgICIzLjAuMC4gUGxlYXNlIGNvbnZlcnQgdGhlIG9iamVjdCB5b3UndmUgcGFzc2VkIGluICh7MCFyfSkgdG8gIgogICAgICAgICAgICAiYSBzdHJpbmcgb3IgYnl0ZXMgb2JqZWN0IGluIHRoZSBuZWFyIGZ1dHVyZSB0byBhdm9pZCAiCiAgICAgICAgICAgICJwcm9ibGVtcy4iLmZvcm1hdCh1c2VybmFtZSksCiAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywKICAgICAgICApCiAgICAgICAgdXNlcm5hbWUgPSBzdHIodXNlcm5hbWUpCgogICAgaWYgbm90IGlzaW5zdGFuY2UocGFzc3dvcmQsIGJhc2VzdHJpbmcpOgogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICJOb24tc3RyaW5nIHBhc3N3b3JkcyB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgaW4gUmVxdWVzdHMgIgogICAgICAgICAgICAiMy4wLjAuIFBsZWFzZSBjb252ZXJ0IHRoZSBvYmplY3QgeW91J3ZlIHBhc3NlZCBpbiAoezAhcn0pIHRvICIKICAgICAgICAgICAgImEgc3RyaW5nIG9yIGJ5dGVzIG9iamVjdCBpbiB0aGUgbmVhciBmdXR1cmUgdG8gYXZvaWQgIgogICAgICAgICAgICAicHJvYmxlbXMuIi5mb3JtYXQocGFzc3dvcmQpLAogICAgICAgICAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgKQogICAgICAgIHBhc3N3b3JkID0gc3RyKHBhc3N3b3JkKQogICAgIyAtLSBFbmQgUmVtb3ZhbCAtLQoKICAgIGlmIGlzaW5zdGFuY2UodXNlcm5hbWUsIHN0cik6CiAgICAgICAgdXNlcm5hbWUgPSB1c2VybmFtZS5lbmNvZGUoJ2xhdGluMScpCgogICAgaWYgaXNpbnN0YW5jZShwYXNzd29yZCwgc3RyKToKICAgICAgICBwYXNzd29yZCA9IHBhc3N3b3JkLmVuY29kZSgnbGF0aW4xJykKCiAgICBhdXRoc3RyID0gJ0Jhc2ljICcgKyB0b19uYXRpdmVfc3RyaW5nKAogICAgICAgIGI2NGVuY29kZShiJzonLmpvaW4oKHVzZXJuYW1lLCBwYXNzd29yZCkpKS5zdHJpcCgpCiAgICApCgogICAgcmV0dXJuIGF1dGhzdHIKCgpjbGFzcyBBdXRoQmFzZShvYmplY3QpOgogICAgIiIiQmFzZSBjbGFzcyB0aGF0IGFsbCBhdXRoIGltcGxlbWVudGF0aW9ucyBkZXJpdmUgZnJvbSIiIgoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdBdXRoIGhvb2tzIG11c3QgYmUgY2FsbGFibGUuJykKCgpjbGFzcyBIVFRQQmFzaWNBdXRoKEF1dGhCYXNlKToKICAgICIiIkF0dGFjaGVzIEhUVFAgQmFzaWMgQXV0aGVudGljYXRpb24gdG8gdGhlIGdpdmVuIFJlcXVlc3Qgb2JqZWN0LiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VybmFtZSwgcGFzc3dvcmQpOgogICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBhbGwoWwogICAgICAgICAgICBzZWxmLnVzZXJuYW1lID09IGdldGF0dHIob3RoZXIsICd1c2VybmFtZScsIE5vbmUpLAogICAgICAgICAgICBzZWxmLnBhc3N3b3JkID09IGdldGF0dHIob3RoZXIsICdwYXNzd29yZCcsIE5vbmUpCiAgICAgICAgXSkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICBkZWYgX19jYWxsX18oc2VsZiwgcik6CiAgICAgICAgci5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBfYmFzaWNfYXV0aF9zdHIoc2VsZi51c2VybmFtZSwgc2VsZi5wYXNzd29yZCkKICAgICAgICByZXR1cm4gcgoKCmNsYXNzIEhUVFBQcm94eUF1dGgoSFRUUEJhc2ljQXV0aCk6CiAgICAiIiJBdHRhY2hlcyBIVFRQIFByb3h5IEF1dGhlbnRpY2F0aW9uIHRvIGEgZ2l2ZW4gUmVxdWVzdCBvYmplY3QuIiIiCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIHIpOgogICAgICAgIHIuaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gX2Jhc2ljX2F1dGhfc3RyKHNlbGYudXNlcm5hbWUsIHNlbGYucGFzc3dvcmQpCiAgICAgICAgcmV0dXJuIHIKCgpjbGFzcyBIVFRQRGlnZXN0QXV0aChBdXRoQmFzZSk6CiAgICAiIiJBdHRhY2hlcyBIVFRQIERpZ2VzdCBBdXRoZW50aWNhdGlvbiB0byB0aGUgZ2l2ZW4gUmVxdWVzdCBvYmplY3QuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZXJuYW1lLCBwYXNzd29yZCk6CiAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCiAgICAgICAgc2VsZi5wYXNzd29yZCA9IHBhc3N3b3JkCiAgICAgICAgIyBLZWVwIHN0YXRlIGluIHBlci10aHJlYWQgbG9jYWwgc3RvcmFnZQogICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbCA9IHRocmVhZGluZy5sb2NhbCgpCgogICAgZGVmIGluaXRfcGVyX3RocmVhZF9zdGF0ZShzZWxmKToKICAgICAgICAjIEVuc3VyZSBzdGF0ZSBpcyBpbml0aWFsaXplZCBqdXN0IG9uY2UgcGVyLXRocmVhZAogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuX3RocmVhZF9sb2NhbCwgJ2luaXQnKToKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLmluaXQgPSBUcnVlCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5sYXN0X25vbmNlID0gJycKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm5vbmNlX2NvdW50ID0gMAogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbCA9IHt9CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5wb3MgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gTm9uZQoKICAgIGRlZiBidWlsZF9kaWdlc3RfaGVhZGVyKHNlbGYsIG1ldGhvZCwgdXJsKToKICAgICAgICAiIiIKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgoKICAgICAgICByZWFsbSA9IHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsWydyZWFsbSddCiAgICAgICAgbm9uY2UgPSBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbFsnbm9uY2UnXQogICAgICAgIHFvcCA9IHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsLmdldCgncW9wJykKICAgICAgICBhbGdvcml0aG0gPSBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbC5nZXQoJ2FsZ29yaXRobScpCiAgICAgICAgb3BhcXVlID0gc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWwuZ2V0KCdvcGFxdWUnKQogICAgICAgIGhhc2hfdXRmOCA9IE5vbmUKCiAgICAgICAgaWYgYWxnb3JpdGhtIGlzIE5vbmU6CiAgICAgICAgICAgIF9hbGdvcml0aG0gPSAnTUQ1JwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9hbGdvcml0aG0gPSBhbGdvcml0aG0udXBwZXIoKQogICAgICAgICMgbGFtYmRhcyBhc3N1bWUgZGlnZXN0IG1vZHVsZXMgYXJlIGltcG9ydGVkIGF0IHRoZSB0b3AgbGV2ZWwKICAgICAgICBpZiBfYWxnb3JpdGhtID09ICdNRDUnIG9yIF9hbGdvcml0aG0gPT0gJ01ENS1TRVNTJzoKICAgICAgICAgICAgZGVmIG1kNV91dGY4KHgpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBzdHIpOgogICAgICAgICAgICAgICAgICAgIHggPSB4LmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubWQ1KHgpLmhleGRpZ2VzdCgpCiAgICAgICAgICAgIGhhc2hfdXRmOCA9IG1kNV91dGY4CiAgICAgICAgZWxpZiBfYWxnb3JpdGhtID09ICdTSEEnOgogICAgICAgICAgICBkZWYgc2hhX3V0ZjgoeCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIHN0cik6CiAgICAgICAgICAgICAgICAgICAgeCA9IHguZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICByZXR1cm4gaGFzaGxpYi5zaGExKHgpLmhleGRpZ2VzdCgpCiAgICAgICAgICAgIGhhc2hfdXRmOCA9IHNoYV91dGY4CgogICAgICAgIEtEID0gbGFtYmRhIHMsIGQ6IGhhc2hfdXRmOCgiJXM6JXMiICUgKHMsIGQpKQoKICAgICAgICBpZiBoYXNoX3V0ZjggaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBYWFggbm90IGltcGxlbWVudGVkIHlldAogICAgICAgIGVudGRpZyA9IE5vbmUKICAgICAgICBwX3BhcnNlZCA9IHVybHBhcnNlKHVybCkKICAgICAgICAjOiBwYXRoIGlzIHJlcXVlc3QtdXJpIGRlZmluZWQgaW4gUkZDIDI2MTYgd2hpY2ggc2hvdWxkIG5vdCBiZSBlbXB0eQogICAgICAgIHBhdGggPSBwX3BhcnNlZC5wYXRoIG9yICIvIgogICAgICAgIGlmIHBfcGFyc2VkLnF1ZXJ5OgogICAgICAgICAgICBwYXRoICs9ICc/JyArIHBfcGFyc2VkLnF1ZXJ5CgogICAgICAgIEExID0gJyVzOiVzOiVzJyAlIChzZWxmLnVzZXJuYW1lLCByZWFsbSwgc2VsZi5wYXNzd29yZCkKICAgICAgICBBMiA9ICclczolcycgJSAobWV0aG9kLCBwYXRoKQoKICAgICAgICBIQTEgPSBoYXNoX3V0ZjgoQTEpCiAgICAgICAgSEEyID0gaGFzaF91dGY4KEEyKQoKICAgICAgICBpZiBub25jZSA9PSBzZWxmLl90aHJlYWRfbG9jYWwubGFzdF9ub25jZToKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm5vbmNlX2NvdW50ICs9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubm9uY2VfY291bnQgPSAxCiAgICAgICAgbmN2YWx1ZSA9ICclMDh4JyAlIHNlbGYuX3RocmVhZF9sb2NhbC5ub25jZV9jb3VudAogICAgICAgIHMgPSBzdHIoc2VsZi5fdGhyZWFkX2xvY2FsLm5vbmNlX2NvdW50KS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBzICs9IG5vbmNlLmVuY29kZSgndXRmLTgnKQogICAgICAgIHMgKz0gdGltZS5jdGltZSgpLmVuY29kZSgndXRmLTgnKQogICAgICAgIHMgKz0gb3MudXJhbmRvbSg4KQoKICAgICAgICBjbm9uY2UgPSAoaGFzaGxpYi5zaGExKHMpLmhleGRpZ2VzdCgpWzoxNl0pCiAgICAgICAgaWYgX2FsZ29yaXRobSA9PSAnTUQ1LVNFU1MnOgogICAgICAgICAgICBIQTEgPSBoYXNoX3V0ZjgoJyVzOiVzOiVzJyAlIChIQTEsIG5vbmNlLCBjbm9uY2UpKQoKICAgICAgICBpZiBub3QgcW9wOgogICAgICAgICAgICByZXNwZGlnID0gS0QoSEExLCAiJXM6JXMiICUgKG5vbmNlLCBIQTIpKQogICAgICAgIGVsaWYgcW9wID09ICdhdXRoJyBvciAnYXV0aCcgaW4gcW9wLnNwbGl0KCcsJyk6CiAgICAgICAgICAgIG5vbmNlYml0ID0gIiVzOiVzOiVzOiVzOiVzIiAlICgKICAgICAgICAgICAgICAgIG5vbmNlLCBuY3ZhbHVlLCBjbm9uY2UsICdhdXRoJywgSEEyCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzcGRpZyA9IEtEKEhBMSwgbm9uY2ViaXQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBYWFggaGFuZGxlIGF1dGgtaW50LgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubGFzdF9ub25jZSA9IG5vbmNlCgogICAgICAgICMgWFhYIHNob3VsZCB0aGUgcGFydGlhbCBkaWdlc3RzIGJlIGVuY29kZWQgdG9vPwogICAgICAgIGJhc2UgPSAndXNlcm5hbWU9IiVzIiwgcmVhbG09IiVzIiwgbm9uY2U9IiVzIiwgdXJpPSIlcyIsICcgXAogICAgICAgICAgICAgICAncmVzcG9uc2U9IiVzIicgJSAoc2VsZi51c2VybmFtZSwgcmVhbG0sIG5vbmNlLCBwYXRoLCByZXNwZGlnKQogICAgICAgIGlmIG9wYXF1ZToKICAgICAgICAgICAgYmFzZSArPSAnLCBvcGFxdWU9IiVzIicgJSBvcGFxdWUKICAgICAgICBpZiBhbGdvcml0aG06CiAgICAgICAgICAgIGJhc2UgKz0gJywgYWxnb3JpdGhtPSIlcyInICUgYWxnb3JpdGhtCiAgICAgICAgaWYgZW50ZGlnOgogICAgICAgICAgICBiYXNlICs9ICcsIGRpZ2VzdD0iJXMiJyAlIGVudGRpZwogICAgICAgIGlmIHFvcDoKICAgICAgICAgICAgYmFzZSArPSAnLCBxb3A9ImF1dGgiLCBuYz0lcywgY25vbmNlPSIlcyInICUgKG5jdmFsdWUsIGNub25jZSkKCiAgICAgICAgcmV0dXJuICdEaWdlc3QgJXMnICUgKGJhc2UpCgogICAgZGVmIGhhbmRsZV9yZWRpcmVjdChzZWxmLCByLCAqKmt3YXJncyk6CiAgICAgICAgIiIiUmVzZXQgbnVtXzQwMV9jYWxscyBjb3VudGVyIG9uIHJlZGlyZWN0cy4iIiIKICAgICAgICBpZiByLmlzX3JlZGlyZWN0OgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA9IDEKCiAgICBkZWYgaGFuZGxlXzQwMShzZWxmLCByLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZXMgdGhlIGdpdmVuIHJlc3BvbnNlIGFuZCB0cmllcyBkaWdlc3QtYXV0aCwgaWYgbmVlZGVkLgoKICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgICMgSWYgcmVzcG9uc2UgaXMgbm90IDR4eCwgZG8gbm90IGF1dGgKICAgICAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvaXNzdWVzLzM3NzIKICAgICAgICBpZiBub3QgNDAwIDw9IHIuc3RhdHVzX2NvZGUgPCA1MDA6CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gMQogICAgICAgICAgICByZXR1cm4gcgoKICAgICAgICBpZiBzZWxmLl90aHJlYWRfbG9jYWwucG9zIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIFJld2luZCB0aGUgZmlsZSBwb3NpdGlvbiBpbmRpY2F0b3Igb2YgdGhlIGJvZHkgdG8gd2hlcmUKICAgICAgICAgICAgIyBpdCB3YXMgdG8gcmVzZW5kIHRoZSByZXF1ZXN0LgogICAgICAgICAgICByLnJlcXVlc3QuYm9keS5zZWVrKHNlbGYuX3RocmVhZF9sb2NhbC5wb3MpCiAgICAgICAgc19hdXRoID0gci5oZWFkZXJzLmdldCgnd3d3LWF1dGhlbnRpY2F0ZScsICcnKQoKICAgICAgICBpZiAnZGlnZXN0JyBpbiBzX2F1dGgubG93ZXIoKSBhbmQgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgPCAyOgoKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgKz0gMQogICAgICAgICAgICBwYXQgPSByZS5jb21waWxlKHInZGlnZXN0ICcsIGZsYWdzPXJlLklHTk9SRUNBU0UpCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsID0gcGFyc2VfZGljdF9oZWFkZXIocGF0LnN1YignJywgc19hdXRoLCBjb3VudD0xKSkKCiAgICAgICAgICAgICMgQ29uc3VtZSBjb250ZW50IGFuZCByZWxlYXNlIHRoZSBvcmlnaW5hbCBjb25uZWN0aW9uCiAgICAgICAgICAgICMgdG8gYWxsb3cgb3VyIG5ldyByZXF1ZXN0IHRvIHJldXNlIHRoZSBzYW1lIG9uZS4KICAgICAgICAgICAgci5jb250ZW50CiAgICAgICAgICAgIHIuY2xvc2UoKQogICAgICAgICAgICBwcmVwID0gci5yZXF1ZXN0LmNvcHkoKQogICAgICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHByZXAuX2Nvb2tpZXMsIHIucmVxdWVzdCwgci5yYXcpCiAgICAgICAgICAgIHByZXAucHJlcGFyZV9jb29raWVzKHByZXAuX2Nvb2tpZXMpCgogICAgICAgICAgICBwcmVwLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IHNlbGYuYnVpbGRfZGlnZXN0X2hlYWRlcigKICAgICAgICAgICAgICAgIHByZXAubWV0aG9kLCBwcmVwLnVybCkKICAgICAgICAgICAgX3IgPSByLmNvbm5lY3Rpb24uc2VuZChwcmVwLCAqKmt3YXJncykKICAgICAgICAgICAgX3IuaGlzdG9yeS5hcHBlbmQocikKICAgICAgICAgICAgX3IucmVxdWVzdCA9IHByZXAKCiAgICAgICAgICAgIHJldHVybiBfcgoKICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA9IDEKICAgICAgICByZXR1cm4gcgoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByKToKICAgICAgICAjIEluaXRpYWxpemUgcGVyLXRocmVhZCBzdGF0ZSwgaWYgbmVlZGVkCiAgICAgICAgc2VsZi5pbml0X3Blcl90aHJlYWRfc3RhdGUoKQogICAgICAgICMgSWYgd2UgaGF2ZSBhIHNhdmVkIG5vbmNlLCBza2lwIHRoZSA0MDEKICAgICAgICBpZiBzZWxmLl90aHJlYWRfbG9jYWwubGFzdF9ub25jZToKICAgICAgICAgICAgci5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBzZWxmLmJ1aWxkX2RpZ2VzdF9oZWFkZXIoci5tZXRob2QsIHIudXJsKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLnBvcyA9IHIuYm9keS50ZWxsKCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgSFRUUERpZ2VzdEF1dGggYmVpbmcgcmV1c2VkIGFuZCB0aGUgYm9keSBvZgogICAgICAgICAgICAjIHRoZSBwcmV2aW91cyByZXF1ZXN0IHdhcyBhIGZpbGUtbGlrZSBvYmplY3QsIHBvcyBoYXMgdGhlCiAgICAgICAgICAgICMgZmlsZSBwb3NpdGlvbiBvZiB0aGUgcHJldmlvdXMgYm9keS4gRW5zdXJlIGl0J3Mgc2V0IHRvCiAgICAgICAgICAgICMgTm9uZS4KICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLnBvcyA9IE5vbmUKICAgICAgICByLnJlZ2lzdGVyX2hvb2soJ3Jlc3BvbnNlJywgc2VsZi5oYW5kbGVfNDAxKQogICAgICAgIHIucmVnaXN0ZXJfaG9vaygncmVzcG9uc2UnLCBzZWxmLmhhbmRsZV9yZWRpcmVjdCkKICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA9IDEKCiAgICAgICAgcmV0dXJuIHIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gYWxsKFsKICAgICAgICAgICAgc2VsZi51c2VybmFtZSA9PSBnZXRhdHRyKG90aGVyLCAndXNlcm5hbWUnLCBOb25lKSwKICAgICAgICAgICAgc2VsZi5wYXNzd29yZCA9PSBnZXRhdHRyKG90aGVyLCAncGFzc3dvcmQnLCBOb25lKQogICAgICAgIF0pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyClBLAwQUAAAAAAAAACEABaHa9fAiBADwIgQAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY2FjZXJ0LnBlbQojIElzc3VlcjogQ049R2xvYmFsU2lnbiBSb290IENBIE89R2xvYmFsU2lnbiBudi1zYSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBSb290IENBIE89R2xvYmFsU2lnbiBudi1zYSBPVT1Sb290IENBCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NzA3NjY5MDA1MjA0CiMgTUQ1IEZpbmdlcnByaW50OiAzZTo0NTo1MjoxNTowOTo1MTo5MjplMTpiNzo1ZDozNzo5ZjpiMTo4NzoyOTo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IGIxOmJjOjk2OjhiOmQ0OmY0OjlkOjYyOjJhOmE4OjlhOjgxOmYyOjE1OjAxOjUyOmE0OjFkOjgyOjljCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjpkNDoxMDo0MDplNDpiYjozZTpjNzo0MjpjOTplMzo4MTpkMzoxZTpmMjphNDoxYTo0ODpiNjo2ODo1Yzo5NjplNzpjZTpmMzpjMTpkZjo2YzpkNDozMzoxYzo5OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGRUQ0NBbDJnQXdJQkFnSUxCQUFBQUFBQkZVdGF3NVF3RFFZSktvWklodmNOQVFFRkJRQXdWekVMTUFrRwpBMVVFQmhNQ1FrVXhHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhFREFPQmdOVkJBc1RCMUp2CmIzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TURFeE1qQXcKTURCYUZ3MHlPREF4TWpneE1qQXdNREJhTUZjeEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQpZV3hUYVdkdUlHNTJMWE5oTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzd0dRWURWUVFERXhKSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEYUR1YVoKamM2ajQwK0tmdnZ4aTRNbGErcElIL0Vxc0xtVkVRUzk4R1BSNG1kbXp4emR6eHRJSys2TmlZNmFyeW1BWmF2cAp4eTBTeTZzY1RIQUhvVDBLTU0wVmpVLzQzZFNNVUJVYzcxRHV4QzczL09sUzhwRjk0RzNWTlRDT1hrTno4a0hwCjFXcmpzb2s2VmprNGJ3WThpR2xiS2szRnAxUzRiSW5NbS9rOHl1WDlpZlVTUEpKNGx0YmNkRzZUUkdIUmpjZEcKc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlBjMVNURTRVNkc3d2VOTFdMQll5NWQ0dXgyeDhna2FzSgpVMjZRem5zM2RMbHdSNUVpVVdNV2VhNnhya0VtQ01nWks5Rkdxa2pXWkNyWGd6VC9MQ3JCYkJsRFNnZUY1OU44CjlpRm83K3J5VXA5L2s1RFBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQjBHQTFVZERnUVdCQlJnZTJZYVJRMlh5b2xRTDMwRXpUU28vL3o5U3pBTkJna3Foa2lHOXcwQgpBUVVGQUFPQ0FRRUExblBuZkU5MjBJMi83THFpdmpURktESzFmUHhzbkN3cnZRbWVVNzlyWHFvUlNMYmxDS096CnlqMWhUZE5HQ2JNK3c2RGpZMVViOHJydnJUbmhRN2s0bytZdmlpWTc3NkJRVnZuR0N2MDR6Y1FMY0ZHVWw1Z0UKMzhOZmxOVVZ5UlJCbk1SZGRXUVZEZjlWTU95R2ovOE43eXk1WTBiMnF2emZ2R245TGhKSVpKcmdsZkNtN3ltUApBYkVWdFF3ZHBmNXBMR2trZUI2enB4eHhZdTdLeUplc0YxMkt3dmhIaG00cXhGWXhsZEJuaVlVcitXeW1YVWFkCkRLcUM1SmxSM1hDMzIxWTlZZVJxNFZ6Vzl2NDkza0hNQjY1alVyOVRVL1FyNmNmOXR2ZUNYNFhTUVJqYmdiTUUKSE1VZnBJQnZGU0RKM2d5SUNoM1dabFhpL0VqSktTWnA0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMgojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMiIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk2ODI4ODU2NTgxMjUKIyBNRDUgRmluZ2VycHJpbnQ6IDk0OjE0Ojc3OjdlOjNlOjVlOmZkOjhmOjMwOmJkOjQxOmIwOmNmOmU3OmQwOjMwCiMgU0hBMSBGaW5nZXJwcmludDogNzU6ZTA6YWI6YjY6MTM6ODU6MTI6Mjc6MWM6MDQ6Zjg6NWY6ZGQ6ZGU6Mzg6ZTQ6Yjc6MjQ6MmU6ZmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNhOjQyOmRkOjQxOjc0OjVmOmQwOmI4OjFlOmI5OjAyOjM2OjJjOmY5OmQ4OmJmOjcxOjlkOmExOmJkOjFiOjFlOmZjOjk0OjZmOjViOjRjOjk5OmY0OjJjOjFiOjllCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdWpDQ0FxS2dBd0lCQWdJTEJBQUFBQUFCRDRZbTVnMHdEUVlKS29aSWh2Y05BUUVGQlFBd1RERWdNQjRHCkExVUVDeE1YUjJ4dlltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqSXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnAKWjI0eEV6QVJCZ05WQkFNVENrZHNiMkpoYkZOcFoyNHdIaGNOTURZeE1qRTFNRGd3TURBd1doY05NakV4TWpFMQpNRGd3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEVnTFNCU01qRVRNQkVHCkExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbmJqQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLYlBKQTYrTG04b21VVkN4S3MrSVZTYkM5Ti9oSEQ2RXJQTAp2NGRmeG4rRzA3SXdYTmI5cmZGNzNPWDRZSllKa2hEMTBGUGUrM3QrYzRpc1VvaDdTcWJLU2FaZXFLZU1XaEc4CmVvTHJ2b3pwczZ5V0pRZVhTcGtxQnkrMEhuZS9pZysxQW53YmxyakZ1VG9zdk5ZU3VldFpmZUxRQm9aZlhrbHEKdFRsZWlEVHN2SGdNQ0ppRWJLak5TN1NnZlF4NVRmQzRMY3NoeXRWc1czM2hvQ21Fb2ZuVGxFbkxKR0tSSUx6ZApDOVhaelBucUp3b3JjNUhHblJ1c3lNdm80S0QwTDVDTFRmdXdOaHYyR1hxRjRHM3lZUk9JWEovZ2t3cFJsNHBhCnpxK3IxZmVxQ2FwZ3ZkelpYOTl5cVdBVFhnQUJ5VXI2UDZUcUJ3TWhBbzZDeWdQQ200OENBd0VBQWFPQm5EQ0IKbVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVbStJSApWMmNjSHNCcUJ0NVp0Sm90Mzl3WmhpNHdOZ1lEVlIwZkJDOHdMVEFyb0NtZ0o0WWxhSFIwY0RvdkwyTnliQzVuCmJHOWlZV3h6YVdkdUxtNWxkQzl5YjI5MExYSXlMbU55YkRBZkJnTlZIU01FR0RBV2dCU2I0Z2RYWnh3ZXdHb0cKM2xtMG1pM2YzQm1HTGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW1ZRlRoeHhvbDRhUjdPQkt1RVFMcTRHcwpKMC9Xd2JnY1EzaXpESnI4Nml3OGJtRWJUVXNwOVo4RkhTYkJ1T21EQUdKRnRxa0lrN21wTTBzWW1zTDRoNGhPCjI5MXhOQnJCVk5wR1ArRFRLcXR0VkNMMU9tTE5JRys2S1luWDNaSHUwMXlpUHFGYlFmWGY1V1JETGVuVk9hdlMKb3QrM2k5REFnQmtjUmNBdGpPajRMYVIwVmtuRkJiVlBGZDV1UkhnNWg2aCt1L041R0pHNzlHK2R3ZkNNTll4ZApBZnZEYmJudlJHMTVSakYrQ3Y2cGdzSC83NnR1SU1SUXlWK2RUWnNYakF6bEFjbWdRV3B6VS9xbFVMUnVKUS83ClRCajAvVkxaam1teDZCRVAzb2pZK3gxSjk2cmVsYzhnZU1KZ0V0c2xRSXhxL0g1Q09FQmtFdmVlZ2VHVExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaXNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIgojIFNlcmlhbDogMjA2Njg0Njk2Mjc5NDcyMzEwMjU0Mjc3ODcwMTgwOTY2NzIzNDE1CiMgTUQ1IEZpbmdlcnByaW50OiBjZDo2ODpiNjphNzpjNzpjNDpjZTo3NTplMDoxZDo0Zjo1Nzo0NDo2MTo5MjowOQojIFNIQTEgRmluZ2VycHJpbnQ6IDEzOjJkOjBkOjQ1OjUzOjRiOjY5Ojk3OmNkOmIyOmQ1OmMzOjM5OmUyOjU1Ojc2OjYwOjliOjVjOmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjowNDpjZjo1ZTpiMTpmMzo5YTpmYTo3NjoyZjoyYjpiMToyMDpmMjo5NjpjYjphNToyMDpjMTpiOTo3ZDpiMTo1ODo5NTo2NTpiODoxYzpiOTphMTo3Yjo3Mjo0NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUdqQ0NBd0lDRVFDYmZnWkpvejVpdWRYdWtFaHhLZTlYTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhLTVFzdwpDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsCmNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHUKTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVAphV2R1SUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCmRIa2dMU0JITXpBZUZ3MDVPVEV3TURFd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNSUhLTVFzd0NRWUQKVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVAphV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKCmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVGFXZHUKSUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZwpMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXU2bkZMOGVCOGFIbThiCk4zTzkrTWxybEJJd1QvQTJSL1hRa1FyMUY4aWxZY0VXUUUzN2ltR1E1WFlnd1JFR2Zhc3NicWIxRVVHTytpMnQKS21GWnBHY21UTkRvdkZKYmNDQUVXTkY2eWFScHZJTVhaSzBGaTd6UVdNNk5qUFhyOEVKSkM1MlhKMmN5YnVHdQpreFVjY0x3Z1RTOFkzcEtJNkd5RlZ4RWE2WDdqSmhGVW9rV1dWWVBLTUlubzNOaWo3U3FBUDM5NVpWYytGU0JtCkNDK1ZrNytxUnkrb1JwZndFdUwrd2dvclVlWjI1cmRHdCtJTnBzeW93MHhaVllubTZGTmNIT3FkOEdJV0M2ZkoKWHd6dzNzSjJ6cS8zYXZMNlFhYWlNeFRKNVhwajA1NWlOOVdGWlo0TzVsTWtkQnRlSFJKVFc4Y3M1NE5KT3hXdQppbWk1VjVjQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRVJTV3dhdVNDUGMvTDhteS91UmFuMlRlCjJ5RlBocGswZGpaWDNkQVZMOFd0ZnhVZk4ySnpQdFRuWDg0WEE5czEraXZicm1BSlh4NWZqMjY3Q3ozcVdoTWUKREdCdnRjQzFJeUl1Qnd2THFYVExSN3Nkd2RlbGE4d3Ywa0w5U2QybmljOVR1dG9BV2lpL2d0LzR1aE1kVUlhQwovWTR3anlsR3NCNDlOZG80WWhZWVNxM210bEZzM3E5aTZ3SFFIaVQrZW84U0doSm91UHRtbVJRVVJWeXU1NjVwCkY0RXJXamZKWGlyMHh1S2hYRlNicGxRQXovRHh3Y2VZTUJvN05oYmJvMjdxL2EyeXd0cnZBa2NUaXNEeHN6R3QKVHh6aFQ1eXZEd3lkOTNnTjJQUTFWb0RhdDIwWGo1MGVnV1RoL3NWRnVxMXJ1UXA2VGs5TGhPNUw4WDNkRVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpIE89RW50cnVzdC5uZXQgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKS8oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkCiMgU3ViamVjdDogQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpIE89RW50cnVzdC5uZXQgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKS8oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkCiMgTGFiZWw6ICJFbnRydXN0Lm5ldCBQcmVtaXVtIDIwNDggU2VjdXJlIFNlcnZlciBDQSIKIyBTZXJpYWw6IDk0NjA2OTI0MAojIE1ENSBGaW5nZXJwcmludDogZWU6Mjk6MzE6YmM6MzI6N2U6OWE6ZTY6ZTg6YjU6Zjc6NTE6YjQ6MzQ6NzE6OTAKIyBTSEExIEZpbmdlcnByaW50OiA1MDozMDowNjowOToxZDo5NzpkNDpmNTphZTozOTpmNzpjYjplNzo5Mjo3ZDo3ZDo2NToyZDozNDozMQojIFNIQTI1NiBGaW5nZXJwcmludDogNmQ6YzQ6NzE6NzI6ZTA6MWM6YmM6YjA6YmY6NjI6NTg6MGQ6ODk6NWY6ZTI6Yjg6YWM6OWE6ZDQ6Zjg6NzM6ODA6MWU6MGM6MTA6Yjk6Yzg6Mzc6ZDI6MWU6YjE6NzcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLakNDQXhLZ0F3SUJBZ0lFT0dQZStEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnRERVVNQklHQTFVRUNoTUwKUlc1MGNuVnpkQzV1WlhReFFEQStCZ05WQkFzVU4zZDNkeTVsYm5SeWRYTjBMbTVsZEM5RFVGTmZNakEwT0NCcApibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHBiV2wwY3lCc2FXRmlMaWt4SlRBakJnTlZCQXNUSENoaktTQXhPVGs1CklFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUXVibVYwSUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUNneU1EUTRLVEFlRncwNU9URXlNalF4TnpVd05URmFGdzB5T1RBMwpNalF4TkRFMU1USmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTNkM2QzCkxtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHAKWVdJdUtURWxNQ01HQTFVRUN4TWNLR01wSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFRwpBMVVFQXhNcVJXNTBjblZ6ZEM1dVpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXEKSzB2UnZ3dEtUWTd0Z0hhbFo3ZDRRTUJ6UXNob3dOdFRLOTFldUhhWU5aT0xHcDE4RXpvT0gxdTNIcy9sSkJRZQpzWUdwalgyNHpHdExBL0VDRE55cnBVQWtBSDkwbEtHZENDbXppQXYxaDNlZFZjM2t3MzdYYW1TcmhSU0dsVnVYCk1sQnZQY2k2Wmd6ai9MMjRTY0YyaVVrWi9jQ292WW1qWnkvR243eHhHV0M0TGVrc3laQjJabnVVNHE5NDFtVlQKWFR6V25MTFBLUVA1TDZSUXN0Ukl6Z1V5VllyOXNtUk1EdVNZQjNYYmY5KzVDRlZnaFRBcCtYdElwR21HNHpVLwpIb1pkZW5vVnZlOEFqaFVpVkJjQWtDYVR2QTVKYUpHLytFZlRuWlZDd1E1TjMyOG16OE1ZSVdKbVEzRFcxY0FICjRRSURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlYKSFE0RUZnUVVWZVNCMFJHQXZ0aUp1UWlqTWZtaEpBa1d1WEF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUR1YgpqMWFiTU9kVG1YeDZlYWRObDljWmxaRDdCaC9LTTN4R1k0K1daaVQ2UUJzaEo4cm1jblB5VC80eG1mM0lERXhvClU4YUFnaE9ZK3JhdDJsMDk4YzV1OWhVUmxJSU03aitWcnhHckQ5Y3YzaDhEajFjc0hzbTdtaHBFbGVzWVQ2WWYKelgxWEVDK2JCQWxhaExWdTJCMDY0ZGFlMFd4NVhua2NGTVhqMEV5VE8yVTg3ZDg5dnFibGxSckR0Um5EdlY1Ygp1LzhqNzJnWnl4S1RKMXdETFc4dzBCNjJHcXplV3ZmUnFxZ25wdjU1Z2NSNW1UTlh1aEt3cWVCQ2JKUEtWdDcrCmJZUUxDSXQramVyWG1DSEc4K2M4ZVM5ZW5ORk1GWTNoN0NJM3pKcERDNWZjZ0pDTnMyZWJiMGdJRlZiUHYvRXIKZkY2YWR1bFprTVY4Z3pVUlpWRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QgTz1CYWx0aW1vcmUgT1U9Q3liZXJUcnVzdAojIFN1YmplY3Q6IENOPUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QgTz1CYWx0aW1vcmUgT1U9Q3liZXJUcnVzdAojIExhYmVsOiAiQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCIKIyBTZXJpYWw6IDMzNTU0NjE3CiMgTUQ1IEZpbmdlcnByaW50OiBhYzpiNjo5NDphNTo5YzoxNzplMDpkNzo5MTo1Mjo5YjpiMTo5NzowNjphNjplNAojIFNIQTEgRmluZ2VycHJpbnQ6IGQ0OmRlOjIwOmQwOjVlOjY2OmZjOjUzOmZlOjFhOjUwOjg4OjJjOjc4OmRiOjI4OjUyOmNhOmU0Ojc0CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNjphZjo1NzphOTpmNjo3NjpiMDphYjoxMjo2MDo5NTphYTo1ZTpiYTpkZTpmMjoyYTpiMzoxMToxOTpkNjo0NDphYzo5NTpjZDo0Yjo5MzpkYjpmMzpmMjo2YTplYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUVBZ0FBdVRBTkJna3Foa2lHOXcwQkFRVUZBREJhTVFzd0NRWURWUVFHRXdKSgpSVEVTTUJBR0ExVUVDaE1KUW1Gc2RHbHRiM0psTVJNd0VRWURWUVFMRXdwRGVXSmxjbFJ5ZFhOME1TSXdJQVlEClZRUURFeGxDWVd4MGFXMXZjbVVnUTNsaVpYSlVjblZ6ZENCU2IyOTBNQjRYRFRBd01EVXhNakU0TkRZd01Gb1gKRFRJMU1EVXhNakl6TlRrd01Gb3dXakVMTUFrR0ExVUVCaE1DU1VVeEVqQVFCZ05WQkFvVENVSmhiSFJwYlc5eQpaVEVUTUJFR0ExVUVDeE1LUTNsaVpYSlVjblZ6ZERFaU1DQUdBMVVFQXhNWlFtRnNkR2x0YjNKbElFTjVZbVZ5ClZISjFjM1FnVW05dmREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtNRXV5S3IKbUQxWDZDWnltclY1MUNuaTRlaVZnTEd3NDF1T0t5bWFaTitoWGUyd0NRVnQyeWd1em1LaVl2NjBpTm9TNnpqcgpJWjNBUVNzQlVudUlkOU1jajhlNnVZaTFhZ25uYytnUlFLZlJ6TXBpalMzbGp3dW1VTktvVU1NbzZ2V3JKWWVLCm1wWWNxV2U0UHd6VjkvbFNFeS9DRzlWd2NQQ1B3QkxLQnN1YTRkbktNM3AzMXZqc3VmRm9SRUpJRTlMQXdxU3UKWG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDlYYklHZXZPRjZ1dlVBNjVlaEQ1Zi94WHRhYno1T1RaeQpkYzkzVWszenlaQXN1VDNseVNOVFB4OGttQ0ZjQjVrcHZjWTY3T2R1aGpwcmwzUmpNNzFvR0RId2VJMTJ2L3llCmpsMHFocWROa053bkdqa0NBd0VBQWFORk1FTXdIUVlEVlIwT0JCWUVGT1dkV1RDQ1Ixak1yUG9JVkRhR2V6cTEKQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liMwpEUUVCQlFVQUE0SUJBUUNGREYyTzVHOVJhRUlGb04yN1R5Y2xoQU85OTJUOUxkY3c0NlFRRit2YUtTbTJlVDkyCjloa1RJN2dRQ3ZsWXBOUmhjTDBFWVdvU2loZlZDcjNGdkRCODF1a01KWTJHUUUvc3pLTitPTVkzRVUvdDNXZ3gKamt6U3N3RjA3cjUxWGdkSUduOXcveFpjaE1CNWhiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMApFcG4zbzBXQzR6eGU5WjJldGNpZWZDN0lwSjVPQ0JSTGJmMXdiV3NhWTcxazVoKzN6dkR5bnk2N0c3ZnlVSWh6CmtzTGk0eGFObWpJQ3E0NFkzZWtRRWU1K05hdVFyejR3bEhyUU16Mm5aUS8xL0k2ZVlzOUhSQ3dCWGJzZHRUTFMKUjlJNEx0RCtnZHd5YWg2MTdqelYvT2VCSFJuREpFTHFZem1wCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290IE89QWRkVHJ1c3QgQUIgT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290IE89QWRkVHJ1c3QgQUIgT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsKIyBMYWJlbDogIkFkZFRydXN0IEV4dGVybmFsIFJvb3QiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAxZDozNTo1NDowNDo4NTo3ODpiMDozZjo0Mjo0Mjo0ZDpiZjoyMDo3MzowYTozZgojIFNIQTEgRmluZ2VycHJpbnQ6IDAyOmZhOmYzOmUyOjkxOjQzOjU0OjY4OjYwOjc4OjU3OjY5OjRkOmY1OmU0OjViOjY4Ojg1OjE4OjY4CiMgU0hBMjU2IEZpbmdlcnByaW50OiA2ODo3ZjphNDo1MTozODoyMjo3ODpmZjpmMDpjODpiMToxZjo4ZDo0MzpkNTo3Njo2NzoxYzo2ZTpiMjpiYzplYTpiNDoxMzpmYjo4MzpkOTo2NTpkMDo2ZDoyZjpmMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU5qQ0NBeDZnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQnZNUXN3Q1FZRFZRUUdFd0pUUlRFVQpNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SmpBa0JnTlZCQXNUSFVGa1pGUnlkWE4wSUVWNGRHVnlibUZzCklGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRFZRUURFeGxCWkdSVWNuVnpkQ0JGZUhSbGNtNWhiQ0JEUVNCU2IyOTAKTUI0WERUQXdNRFV6TURFd05EZ3pPRm9YRFRJd01EVXpNREV3TkRnek9Gb3diekVMTUFrR0ExVUVCaE1DVTBVeApGREFTQmdOVkJBb1RDMEZrWkZSeWRYTjBJRUZDTVNZd0pBWURWUVFMRXgxQlpHUlVjblZ6ZENCRmVIUmxjbTVoCmJDQlVWRkFnVG1WMGQyOXlhekVpTUNBR0ExVUVBeE1aUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnUTBFZ1VtOXYKZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGYzR2pQbThnQUVMVG5nVGx2dApIN3hzRDgyMStpTzJ6dDZiRVRPWHBDbE1mWk9mdlVxOGsrMERHdU9QeitWdFVGcldseW1VV29Dd1NYcmJMcFg5CnVNcS9Oemd0SGo2UlFhMXdWc2Z3VHovb01wNTB5c2lRVk9uR1h3OTRuWnBBUEE2c1lhcGVGSStlaDZGcVVOelgKbWs2dkJiT21jWlNjY2JOUVlBckhFNTA0QjRZQ3FPbW9hU1lZa0t0TXNFOGpxenBQaE5qZnpwL2hhVys3MTBMWAphMFRreDYzdWJVRmZjbHB4Q0RlemVXV2tXYUNVTi9jQUx3M0NrbkxhMERoeTJ4U29SY1JkS24yM3ROYkU3cXpOCkUwUzN5U3ZkUXdBbCttRzVhV3BZSXhHM3B6T1BWblZaOWMwcDEwYTNDaXRsdHROQ2J4V3l1SHY3NytsZFU5VTAKV2ljQ0F3RUFBYU9CM0RDQjJUQWRCZ05WSFE0RUZnUVVyYjJZZWpTMEp2ZjZ4Q1pVN3dPOTRDVExWQm93Q3dZRApWUjBQQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdnWmtHQTFVZEl3U0JrVENCam9BVXJiMlllalMwCkp2ZjZ4Q1pVN3dPOTRDVExWQnFoYzZSeE1HOHhDekFKQmdOVkJBWVRBbE5GTVJRd0VnWURWUVFLRXd0QlpHUlUKY25WemRDQkJRakVtTUNRR0ExVUVDeE1kUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnVkZSUUlFNWxkSGR2Y21zeApJakFnQmdOVkJBTVRHVUZrWkZSeWRYTjBJRVY0ZEdWeWJtRnNJRU5CSUZKdmIzU0NBUUV3RFFZSktvWklodmNOCkFRRUZCUUFEZ2dFQkFMQ2I0SVVsd3RZajRnK1dCcEtkUVppYzJZUjVnZGtlV3hRSEl6WmxqN0RZZDd1c1FXeEgKWUlOUnNQa3lQZWY4OWlZVHg0QVdwYjlhL0lmUGVIbUpJWnJpVEFjS2hqVzg4dDVSeE5LV3Q5eCtUdTV3L1J3NQo2d3dDVVJRdGpyMFc0TUhmUm5YbkpLM3M5RUswaFpOd0VHZTZuUVkxU2hqVEszck1VVUtoZW1QUjVydWh4U3ZDCk5yNFREZWE5WTM1NWU2Y0pEVUNyYXQyUGlzUDI5b3dhUWdWUjFFWDFuNmRpSVdnVklFTThtZWQ4dlNUWXFaRVgKYzRnL1Zoc3hPQmkwY1ErYXpjZ09ubzR1RytHTW1JUExIekh4UkV6R0JITkpkbUFQeC9pOUY0QnJMdW5NVEE1YQptbmtQSUFvdTFaNWpKaDVWa3BUWWdoZGFlOUM4eDQ5T2hnUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUVudHJ1c3QsIEluYy4gT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlLyhjKSAyMDA2IEVudHJ1c3QsIEluYy4KIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FbnRydXN0LCBJbmMuIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZS8oYykgMjAwNiBFbnRydXN0LCBJbmMuCiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMTY0NjYwODIwCiMgTUQ1IEZpbmdlcnByaW50OiBkNjphNTpjMzplZDo1ZDpkZDozZTowMDpjMTozZDo4Nzo5MjoxZjoxZDozZjplNAojIFNIQTEgRmluZ2VycHJpbnQ6IGIzOjFlOmIxOmI3OjQwOmUzOjZjOjg0OjAyOmRhOmRjOjM3OmQ0OjRkOmY1OmQ0OjY3OjQ5OjUyOmY5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3MzpjMTo3Njo0Mzo0ZjoxYjpjNjpkNTphZDpmNDo1YjowZTo3NjplNzoyNzoyODo3Yzo4ZDplNTo3NjoxNjpjMTplNjplNjoxNDoxYToyYjoyYzpiYzo3ZDo4ZTo0YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRWtUQ0NBM21nQXdJQkFnSUVSV3RRVkRBTkJna3Foa2lHOXcwQkFRVUZBRENCc0RFTE1Ba0dBMVVFQmhNQwpWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhPVEEzQmdOVkJBc1RNSGQzZHk1bGJuUnlkWE4wCkxtNWxkQzlEVUZNZ2FYTWdhVzVqYjNKd2IzSmhkR1ZrSUdKNUlISmxabVZ5Wlc1alpURWZNQjBHQTFVRUN4TVcKS0dNcElESXdNRFlnUlc1MGNuVnpkQ3dnU1c1akxqRXRNQ3NHQTFVRUF4TWtSVzUwY25WemRDQlNiMjkwSUVObApjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTJNVEV5TnpJd01qTTBNbG9YRFRJMk1URXlOekl3Ck5UTTBNbG93Z2JBeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1Ua3cKTndZRFZRUUxFekIzZDNjdVpXNTBjblZ6ZEM1dVpYUXZRMUJUSUdseklHbHVZMjl5Y0c5eVlYUmxaQ0JpZVNCeQpaV1psY21WdVkyVXhIekFkQmdOVkJBc1RGaWhqS1NBeU1EQTJJRVZ1ZEhKMWMzUXNJRWx1WXk0eExUQXJCZ05WCkJBTVRKRVZ1ZEhKMWMzUWdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNJd0RRWUoKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGFWdGtOQytzWnRLbTlJMzVSTU9WY0Y3c041RVVGbwpOdTNzL3BvQmo2RTRLUHozRUVabUxrMGVHckVhVHNiUndKV0lzTW4vTVlzekE5dTNnM3MrSUlSZTdiSldLS2Y0CjRMbEFjVGZGeTBjT2x5cG93Q0tWWWhYYlI5bjEwQ3YvZ2t2SnJUN2VUTnVRZ0ZBL0NZcUVBT3d3Q2owWXpmdjkKS2xtYUk1VVhMRVdlSDI1RGVXME1YSmorU0tmRkkwZGNYdjF1NXg2MDltaEYwWWFEVzZLS2piSGpLWUQrSlhHSQpyYjY4ajZ4U2xrdXFVWTNrRXpFWjZFNU5uOXVzczJyVnZEbFVjY3A2ZW4rUTNYMGRnTm1CdTFrbXdoSCs1cFBpCjk0RGtaZnMwTnc0cGdIQk5yemlHTHA1L1Y2K2VGNjdySE1zb0lWKzJITmpub2dRaStkUGEyTXNDQXdFQUFhT0IKc0RDQnJUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBckJnTlZIUkFFSkRBaQpnQTh5TURBMk1URXlOekl3TWpNME1scUJEekl3TWpZeE1USTNNakExTXpReVdqQWZCZ05WSFNNRUdEQVdnQlJvCmtPUm5wS1pUZ01lR1pxVHg5MHREKzRTOWJUQWRCZ05WSFE0RUZnUVVhSkRrWjZTbVU0REhobWFrOGZkTFEvdUUKdlcwd0hRWUpLb1pJaHZaOUIwRUFCQkF3RGhzSVZqY3VNVG8wTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFDVDFEQ3cxd01nS3RENVkraVJEQVVncVY4WnludHlUdFN4MjlDVysxUmFHU3dNQ1BleXZJV29uWDl0Ck8xS3pLdHZuMUlTTVkvWVB5eVlCa1ZCczlGOFU0cE4wd0JPZU1EcFE0N1JneFJ6d0lrU05jVWVzeUJySjZadWEKQUdBVC8zQitYeEZOU1J1ekZWSjd5VlRhdjUyVnIydWEySjdwOGVSRGplSVJSRHEvcjcyRFFuTlNpNnE3cHluUAo5V1FjQ2szUnZLcXNueXJRLzM5LzJuM3FzZTB3SmNHRTJqVFNXM2lEVnV5Y05zTW00aEgyWjBrZGtxdU0rK3YvCmV1NkZTcWRRZ1BDblhFcVVMbDhGbVR4U1FlRE50R1BQQVVPNm5JUGNqMkE3ODFxMHRIdXUyZ3VRT0hYdmdSMW0KMHZkWGNEYXp2L3dvcjNFbGhWc1QvaDUvV3JROAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgR2xvYmFsIENBIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IEdsb2JhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IEdsb2JhbCBDQSIKIyBTZXJpYWw6IDE0NDQ3MAojIE1ENSBGaW5nZXJwcmludDogZjc6NzU6YWI6Mjk6ZmI6NTE6NGU6Yjc6Nzc6NWU6ZmY6MDU6M2M6OTk6OGU6ZjUKIyBTSEExIEZpbmdlcnByaW50OiBkZToyODpmNDphNDpmZjplNTpiOToyZjphMzpjNTowMzpkMTphMzo0OTphNzpmOTo5NjoyYTo4MjoxMgojIFNIQTI1NiBGaW5nZXJwcmludDogZmY6ODU6NmE6MmQ6MjU6MWQ6Y2Q6ODg6ZDM6NjY6NTY6ZjQ6NTA6MTI6Njc6OTg6Y2Y6YWI6YWE6ZGU6NDA6Nzk6OWM6NzI6MmQ6ZTQ6ZDI6YjU6ZGI6MzY6YTc6M2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURWRENDQWp5Z0F3SUJBZ0lEQWpSV01BMEdDU3FHU0liM0RRRUJCUVVBTUVJeEN6QUpCZ05WQkFZVEFsVlQKTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNUnN3R1FZRFZRUURFeEpIWlc5VWNuVnpkQ0JIYkc5aQpZV3dnUTBFd0hoY05NREl3TlRJeE1EUXdNREF3V2hjTk1qSXdOVEl4TURRd01EQXdXakJDTVFzd0NRWURWUVFHCkV3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWJNQmtHQTFVRUF4TVNSMlZ2VkhKMWMzUWcKUjJ4dlltRnNJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyc3dZWXpEOQo5QmNqR2xaK1c5ODhiRGprY2JkNGtkUzhvZGhNK0toRHRnUHBUU0VIQ0lqYVdDOW1PU205QlhpTG5Uam9CYmRxCmZuR2s1c1JncHJEdmdPU0pLQStlSmRidGcvT3RwcEhIbU1sQ0dEVVVuYTJZUnBJdVQ4cnhoMFBCRnBWWExWRHYKaVMyQWVsZXQ4dTVmYTlJQWpia1UrQlFWTmRuQVJxTjdjc2lSdjhsVks4M1FsejZjSm1UTTM4NkRHWEhLVHViVQoxWHVwR2MxVjNzanMwbDQ0VStWY1Q0d3QvbEFqTnZ4bTVzdU9wRGtaQUxlVkFqbVJDdzcrT0M3UkhRV2E5azArCmJ3OEhIYThzSG85Z09lTDZObE1UT2RSZUppdmJQYWdVdlRMckdBTW9VZ1J4NWFzelBlRTR1d2MyaEdLY2Vlb1cKTVBSZndDdm9jV3ZrK1FJREFRQUJvMU13VVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUQQplcGhvalluN3F3VmtEQkY5cW4xbHVNck1UakFmQmdOVkhTTUVHREFXZ0JUQWVwaG9qWW43cXdWa0RCRjlxbjFsCnVNck1UakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBTmVNcGF1VXZYVlNPS1ZDVW41a2FGT1NQZUNwaWxLSW4KWjU3UXp4cGVSK25Cc3FUUDNVRWFCVTZiUys1S2IxVlNzeVNoTndyclpIWXFMaXp6L1R0MWtMLzZjZGpIUFRmUwp0UVdWWXJtbTNvazlObnM0ZDBpWHJLWWdqeTZteVF6Q3NwbEZBTWZPRVZFaUl1Q2w2cllWU0FsazZsNVBkUGNGClBzZUtVZ3piRmJTOWJadmx4ckZVYUtuamFaQzJtcVVQdUxrL0lIMnVTclc0bk9RZHRxdm1sS1hCeDRPdDIvVW4KaHc0RWJOWC8zYUJkN1lkU3R5c1ZBcTQ1cG1wMDZkckU1N3hOTkI2cFhFMHpYNUlKTDRobVhYZVh4eDEyRTZuVgo1ZkVXQ1JFMTFhemJKSEZ3TEpoV0M5a1h0TkhqVVN0ZWRlalYwTnhQTk8zQ0JXYUFvY3ZtTXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFVuaXZlcnNhbCBDQSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDkyOjY1OjU4OjhiOmEyOjFhOjMxOjcyOjczOjY4OjVjOmI0OmE1OjdhOjA3OjQ4CiMgU0hBMSBGaW5nZXJwcmludDogZTY6MjE6ZjM6MzU6NDM6Nzk6MDU6OWE6NGI6Njg6MzA6OWQ6OGE6MmY6NzQ6MjI6MTU6ODc6ZWM6NzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjQ1OjliOjlmOjYzOmIyOjI1OjU5OmY1OmZhOjVkOjRjOjZkOmIzOmY5OmY3OjJmOmYxOjkzOjQyOjAzOjM1Ojc4OmYwOjczOmJmOjFkOjFiOjQ2OmNiOmI5OjEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYURDQ0ExQ2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCRk1Rc3dDUVlEVlFRR0V3SlZVekVXCk1CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVlTUJ3R0ExVUVBeE1WUjJWdlZISjFjM1FnVlc1cGRtVnkKYzJGc0lFTkJNQjRYRFRBME1ETXdOREExTURBd01Gb1hEVEk1TURNd05EQTFNREF3TUZvd1JURUxNQWtHQTFVRQpCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4SGpBY0JnTlZCQU1URlVkbGIxUnlkWE4wCklGVnVhWFpsY25OaGJDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLWVYKVmFDanh1QWZqSjBoVU5mQnZpdGJ0YVNlb2RseVdMMEFHMHkvWWNrVUhVV0NxOFlkZ05ZOTZ4Q2NPcTl0SlBpOApjUUdlQnZWOFh4N0JEbFhLZzVwWk1LNFp5ekJJbGUwaU40MzBTcHB5Wmo2dGxjRGdGZ0RnRUI4ck1RN1hsRlRUClFqT2dOQjBlUlhiZFQ4b1lOK3lGRlhvWkNQelZ4NXp3OHFrdUVLbVM1ajFZUGFrV2FEd3ZkU0VZZnloM3BlRmgKRjdlbTZmZ2VtZHR6YnZRS29pRnM3dHFxaFpKbXIvWjZhNExhdWlJSU5RL1BRdkUxK21ydWZpc2x6RG9SNUcydgpjN0oySGEzUXNuaG5HcVE1SEZFTFoxYUQvVGhkRGM3ZDhMc3JsaC9lZXpKUy9SMjd0UWFoc2lGZXBkYVZhSC93Cm1aN2NSUWcrNTlJSkRUV1UzWUJPVTVmWHRRbEVJR1FXRndNQ1RGTU5hTjdWcW5KTmsyMkNEdHVjdmMrMDgxeGQKVkhwcENaYlcyeEhCalhXb3RNODV5TTQ4dkNSODVtTEs0YjE5cDcxWFpRdmsvaVh0dG1rUTNDZ2FScjBCSGRDWAp0ZUdZTzhBM1pOWTlsTzRMNGZVb3JndFd2M0dMSXlsQmpvYkZTMUo3MkhHckg0b1ZwanVEV3RkWUFWSEdURUhaCmY5aEJaM0tpS045Z2c2bWV5SHY4VTNOeVdmV1RlaGQyRHM3MzVWelpDMVUwb3FwYnRXcFU1eFBLVit5WGJmUmUKQmk5RmkxalVJeGFTNUJadUtHTlpNTjlRQVp4amlScWYyeGVVZ25BM3d5U2Vta2ZXV3NwT3FHbUpjaCtSYk50KwpuaHV0eHg5ejNTeFBHV1g5ZjVOQUVDN1M4TzA4bmk0b1Bta21NOFY3QWdNQkFBR2pZekJoTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQjhHQTFVZEl3UVkKTUJhQUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBZ0VBTVhqbXg3WGZ1SlJBeVhIRXFEWHNSaDNDaGZNb1dJYXdDL3lPc2ptUFJGV3JaSVJjCmFhblFtamc4K3VVZk5lVkU0NEI1bEdpa3U4U2ZQZUUwelRCR2kxUXJsYVh2OXorWmhQMDE1czh4eHR4cXY2ZlgKSXdqaG1GN0RXZ2gycWFhdmR5KzNZTDFFUm1ydmwvOXpsY0dPNkpQNy9URzM3RmNSRVVXYk1QRWFpRG5CVHp5bgpBTlhIL0t0dGdDSndwUXpnWFFRcEF2dkxvSkhSZk5iRGZsRFZuVmkrUVRqcnVYVThGZG1ieVVxRFdjRGFVLzB6CnV6WVltNFVQRmQzdUxheDJrN25aQVkxSUVLajc5VGlHOGRzS3hyMkVveU5CM3RaM2I0WFVoUnhRNEs1UmlycU4KUG5iaXVjb244bCtmNzI1WkRRYllLeGVrMG54cnUxOFVHa2lQR2t6bnMwY2Nqa3hGS3lEdVNOL24zUW1PR0tqYQpRSTJTSmhGVFlYTmQ2NzNueEUwcE4ySHJyRGt0Wnk0VzF2VUFnNFdoekg5MnhIM2t0MHRtN3dORllHbTJERktXCmtvUmVwcU8xcEQ0cjJjellHMGVxOGtUYVQva0Q2UEFVeXovemc5N1F3VlRqdCtnS04wMkxJRmtETUJtaExNaTkKRVIvZnJzbEt4Zk1uWm1hR3JHaVIvOW5tVXh3UGkxeHBaUW9teUI0MHcxMVJlOWVwbkFhaE50M1ZpWlM4MmVRdApERjRKYkFpWGZLTTlmSlAvUDZFVXA4KzFYZXZiMnh6RWR0K0l1YjFGQlpVYnJ2eEdha3l2U09QT3JnL1NmdXZtCmJKeFBnV3A2Wkt5N1B0WG55M1l1eGFkSXdWeVFEOHZJUC9ybU11R05HMitrNW83WStTbElpczV6L2l3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDM0OmZjOmI4OmQwOjM2OmRiOjllOjE0OmIzOmMyOmYyOmRiOjhmOmU0Ojk0OmM3CiMgU0hBMSBGaW5nZXJwcmludDogMzc6OWE6MTk6N2I6NDE6ODU6NDU6MzU6MGM6YTY6MDM6Njk6ZjM6M2M6MmU6YWY6NDc6NGY6MjA6NzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjIzOjRmOjNiOmM4OjUyOjdjOmE1OjYyOjhlOmVjOjgxOmFkOjVkOjY5Ojg5OjVkOmE1OjY4OjBkOmM5OjFkOjFjOmI4OjQ3OjdmOjMzOmY4Ojc4OmI5OjViOjBiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYkRDQ0ExU2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCSE1Rc3dDUVlEVlFRR0V3SlZVekVXCk1CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjFjM1FnVlc1cGRtVnkKYzJGc0lFTkJJREl3SGhjTk1EUXdNekEwTURVd01EQXdXaGNOTWprd016QTBNRFV3TURBd1dqQkhNUXN3Q1FZRApWUVFHRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxCmMzUWdWVzVwZG1WeWMyRnNJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUMKQVFDelZGTEJ5VDd5MmR5eFV4cFpLZWV4dzBVbzVkZlI3Y1hGUzZHcWRIdFhyMG9tL05qMVhxZHVHZHQwREU4MQpXeklMQWVQYjYzcDNOZXFxV3VEVzZLRlhsUENRbzNSV2xFUXdBeDVjVGl1RkpuU0NlZ3gyb0c5TnprRXRvQlVHCkZGKzNRczE3ajFoaE5Od3FDUGt1d3dHbUlrUWNUQWVDNWx2TzBFcDhCTk1aY3lmd3FwaC9McTlPNjRjZUpIZHEKWGJib1cwVzYzTU9oQlc5V2pvOFFKcVZKd3k3WFFZY2k0RStHeW1DMTZxRmp3QUdYRUhtOUFEd1NiU3NWc2F4TApzZTRZdVU2VzNOeDIvenUrejE4RHdQdzc2TDVHRy8vYVFNSlM5LzdqT3ZkcWR6WFEybzNyWGhocU1jY2V1andiCktOWnJWTWFxVzllaUxCc1p6S0lDOXB0WnZUZHJoclZ0Z3JyWTZzbFd2S2syV1AwK0dmUHREQ2Fwa3pqNFQ4RmQKSWdiUWwrcmhyY1pWNElFcktJTTYrdlI3SVZFQXZsSTR6czFtZWFqMGdWYmkwSU1KUjFGYlVHclAyMGdhWFQ3Mwp5L1psOTJ6eGxmZ0NPekpXZ2psNlc3MHZpUnUvb2JUby8zK05qTjhEOFdCT1dCRk02Nk0vRUN1RG1nRnoyWlJ0CmhBQW5acXp3Y0VBSlFwS3RUNU1OWVFsUkpOaVMxUXVVWWJLSHN1My9talgvaFZUSzdVUkRyQnM4Rm10SVNnb2MKUUlnZmtzSUxBQVgvOHNnQ1NxU3FxY3labHB3dldPQjk0YjY3Qjl4ZkJISmNNVFREN0Y4dDREMWtrQ0xtMGV5NApMdDFacnRtaE43OVVOZHh6TWsrTUJCNHpzc2xHOGRoY3lGVlF5V2k5cUxvMkNRSURBUUFCbzJNd1lUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBZkJnTlYKSFNNRUdEQVdnQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFHYkJ4aVB6MmVBdWJsL296NjZ3c0NWTksvZzdXSnRBSkRkYXk2c1dTZit6CmRYa3pvUzl0Y0JjMGtmNW5mby9zbStWZWdxbFZIeS9jMUZFSEV2NnNGajRzTmNaai9Od1E2dzJqcXRCOHpOSFEKTDFFdXhCUmEzdWdaNFQ3R3pLUXA1eTZFcWdZd2VIWlVjeWlZV1RqZ0FBMWkwMEo5SVordVBUcU0xZnAzRFJncgpGZzVmTnVIOEtyVXdKTS9nWXd4N1dCcittYnBDRXJHUjlIeG80c2pvcnl6cXlYNnV1eW85RFJYY05KVzJHSFNvCmFnL0h0UFFUeE9SYjdRclNwSmRNS3UwdmJCS0pQZkVuY0twcUExSWhuMENvWjFEeTgxb2YzOThqOXR4NFR1YVkKVDFVNlUrUHY4dlNmeDN6WVdLOHBJcGU0NEwyUkxyQjI3RmNSeis4cFJQUHBoWHBnWStSZE00a1gyVEdxMnRiegpHRFZ5ejRjckwyTWpoRjJFakQ5WG9JajhtWkVvSm1tWjFJK1hSTDZPMVVpeHBDZ3A4UlcwNGVXZTNmaVBwbThtCjF3azhPaHdSRHFac04vZXRSSWNzS01mWWRJS3owRzlLVjdzMUtTZWdpK2docDRka05sM00yQmFzeDdJblFKSlYKT0NpTlVXN2RGR2RUYkhGY0pvUk5kVnEyZm1CV3FVMnQrNXNlbC9NTjJkS1hWSGZhUFJLMzRCN3ZDQWFzK1lXSAo2YUxjcjM0WUVvUDlWaGRCTHRVcGduMlo5REgyY2FuUExBRW5wUVc1cXJKSVRpcnZuNU5TVVpVOFVuT09Wa3dYClFNQUpLT1NMYWtoVDIrek5WVlh4eHZqcG9peE1wdEVtWDM2dldremFINmJ5SEN4K3JnSVcwbGJRTDFkVFIraVMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZpc2EgZUNvbW1lcmNlIFJvb3QgTz1WSVNBIE9VPVZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uCiMgU3ViamVjdDogQ049VmlzYSBlQ29tbWVyY2UgUm9vdCBPPVZJU0EgT1U9VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24KIyBMYWJlbDogIlZpc2EgZUNvbW1lcmNlIFJvb3QiCiMgU2VyaWFsOiAyNTk1MjE4MDc3NjI4NTgzNjA0ODAyNDg5MDI0MTUwNTU2NTc5NAojIE1ENSBGaW5nZXJwcmludDogZmM6MTE6Yjg6ZDg6MDg6OTM6MzA6MDA6NmQ6MjM6Zjk6N2U6ZWI6NTI6MWU6MDIKIyBTSEExIEZpbmdlcnByaW50OiA3MDoxNzo5Yjo4Njo4YzowMDphNDpmYTo2MDo5MTo1MjoyMjozZjo5ZjozZTozMjpiZDplMDowNTo2MgojIFNIQTI1NiBGaW5nZXJwcmludDogNjk6ZmE6Yzk6YmQ6NTU6ZmI6MGE6Yzc6OGQ6NTM6YmI6ZWU6NWM6ZjE6ZDU6OTc6OTg6OWY6ZDA6YWE6YWI6MjA6YTI6NTE6NTE6YmQ6ZjE6NzM6M2U6ZTc6ZDE6MjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURvakNDQW9xZ0F3SUJBZ0lRRTRZMVRSMC9CdkxCK1dVRjFaQWNZakFOQmdrcWhraUc5dzBCQVFVRkFEQnIKTVFzd0NRWURWUVFHRXdKVlV6RU5NQXNHQTFVRUNoTUVWa2xUUVRFdk1DMEdBMVVFQ3hNbVZtbHpZU0JKYm5SbApjbTVoZEdsdmJtRnNJRk5sY25acFkyVWdRWE56YjJOcFlYUnBiMjR4SERBYUJnTlZCQU1URTFacGMyRWdaVU52CmJXMWxjbU5sSUZKdmIzUXdIaGNOTURJd05qSTJNREl4T0RNMldoY05Nakl3TmpJME1EQXhOakV5V2pCck1Rc3cKQ1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tVm1sellTQkpiblJsY201aApkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnZiVzFsCmNtTmxJRkp2YjNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2Vjk1V0htNmgKMm1DeGxDZkxGOXNIUDRDRlQ4aWN0dEQwYjAvUG1kamgyOEpJWERxc09UUEhIMnFMSmowck5mVklzWkhCQWs0RQpscEY3c0RQd3NSUk9FVysxUUs4YlJhVks3MzYyclBLZ0gxZy9Fa1pnUEkyaDRIM1BWejR6SHZ0SDhhb1Zsd2RWClpxVzFMUzdZZ0ZteXB3MjNSdXdoWS84MXE2VUN6eXIwVFA1NzlaUmRoRTJvOG1DUDJ3NGxQSjl6Y2MrVTMwcnEKMjk5eU9JenpscjN4Rjd6U3VqdEZXc2FuOXNZWGl3R2QvQm1vS29NV3VEcEkvazQrb0tzR0dlbFQ4NEFUQiswdAp2ejhLUEZVZ09Td3NBR2wwbFVxOElMS3BlZVVZaVpHbzNCeE43N3QrTnd0ZC9qbWxpRktNQUd6c0dIeEJ2ZmFMCmRYZTZZSjJFNS80dEFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUUQKQWdFR01CMEdBMVVkRGdRV0JCUVZPSU1QUHl3L2NETWV6VWIrQjR3ZzROZkR0ekFOQmdrcWhraUc5dzBCQVFVRgpBQU9DQVFFQVgvRkJmWHhjQ0xrcjROV1NSL3BuWEtVVHd3TWhteXRNaVViUFdVM0ovcVZBdG1QTjNYRW9sV2NSCnpDU3MwMFJzY2E0QklHc0RvbzhZdHlrNmZlVVdZRk40UE1DdkZZUDNqMUl6Skwxa2s1ZnVpL2ZiR0todGNiUDMKTEJmUWRDVnA5LzVyUEpTK1RVdEJqRTdpYzlEamtDSnpRODN6NytwenprV0tzS1pKLzB4OW5YR0l4SFlka0ZzZAo3djNNOSs3OVlLV3hlaFp4MFJiUWZCSThiR21YMjY1Zk9acHdMd1U4R1VZRW1TQTIwR0J1WVFhN0ZrS01jUGN3CisrRGJacU1BQWIzbUxOcVJYNkJHaTAxcW5EMDkzUVZHL25hL29Bbzg1QURtSjdmL2hDM2V1aUlubGhCeDZ5THQKMzk4em5NL2pyYTZPMUk3bVQxR3ZGcExnWFBZSER3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlcyBPPUNvbW9kbyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049QUFBIENlcnRpZmljYXRlIFNlcnZpY2VzIE89Q29tb2RvIENBIExpbWl0ZWQKIyBMYWJlbDogIkNvbW9kbyBBQUEgU2VydmljZXMgcm9vdCIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDQ5Ojc5OjA0OmIwOmViOjg3OjE5OmFjOjQ3OmIwOmJjOjExOjUxOjliOjc0OmQwCiMgU0hBMSBGaW5nZXJwcmludDogZDE6ZWI6MjM6YTQ6NmQ6MTc6ZDY6OGY6ZDk6MjU6NjQ6YzI6ZjE6ZjE6NjA6MTc6NjQ6ZDg6ZTM6NDkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGQ3OmE3OmEwOmZiOjVkOjdlOjI3OjMxOmQ3OjcxOmU5OjQ4OjRlOmJjOmRlOmY3OjFkOjVmOjBjOjNlOjBhOjI5OjQ4Ojc4OjJiOmM4OjNlOmUwOmVhOjY5OjllOmY0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTWpDQ0F4cWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCN01Rc3dDUVlEVlFRR0V3SkhRakViCk1Ca0dBMVVFQ0F3U1IzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3cKR0FZRFZRUUtEQkZEYjIxdlpHOGdRMEVnVEdsdGFYUmxaREVoTUI4R0ExVUVBd3dZUVVGQklFTmxjblJwWm1sagpZWFJsSUZObGNuWnBZMlZ6TUI0WERUQTBNREV3TVRBd01EQXdNRm9YRFRJNE1USXpNVEl6TlRrMU9Wb3dlekVMCk1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ01Fa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUUKQnd3SFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2d3UlEyOXRiMlJ2SUVOQklFeHBiV2wwWldReElUQWZCZ05WQkFNTQpHRUZCUVNCRFpYSjBhV1pwWTJGMFpTQlRaWEoyYVdObGN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCkFEQ0NBUW9DZ2dFQkFMNUFuZlJ1NGVwMmh4eE5SVVNPdmtiSWd3YWR3U3IrR0IrTzVBTDY4NnRkVUlvV01RdWEKQnRERmNDTE5TUzFVWTh5MmJtaEdDMVBxeTB3a3dMeHlUdXJ4RmE3MFZKb1NDc042c2pOZzR0cUpWZk1pV1BQZQozTS92ZzRhaWpKUlBuMmp5bUpCR2hDZkhkci9qekRVc2kxNEhaR1dDd0Vpd3FKSDVZWjkySUZDb2tjZG10ZXQ0CllnTlc4SW9hRStveG94NmdtZjA0OXZZbk1saHZCL1ZydVBzVUs2KzNxc3pXWTE5empOb0ZtYWc0cU1zWGVEWlIKck9tZTlIZzZqYzhQMlVMaW1BeXJMNThPQWQ3dm41bEo4UzNmckhSTkc1aTFSOFhsS2RINWtCakhZcHkrZzhjbQplejZLSmNmQTNaM21OV2dRSUoyUDJON1N3NFNjRFY3b0w4a0NBd0VBQWFPQndEQ0J2VEFkQmdOVkhRNEVGZ1FVCm9CRUtJejZXOFFmczRxOHA3NEtsZjlBd3BMUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdld1lEVlIwZkJIUXdjakE0b0RhZ05JWXlhSFIwY0RvdkwyTnliQzVqYjIxdlpHOWpZUzVqYjIwdgpRVUZCUTJWeWRHbG1hV05oZEdWVFpYSjJhV05sY3k1amNtd3dOcUEwb0RLR01HaDBkSEE2THk5amNtd3VZMjl0CmIyUnZMbTVsZEM5QlFVRkRaWEowYVdacFkyRjBaVk5sY25acFkyVnpMbU55YkRBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFDRmI4QXZDYjZQK2srdFo3eGtTQXprL0V4ZllBV015bXRyd1VTV2dFZHVqbTdsM3NBZzlnMW8xUQpHRThtVGdIajVyQ2w3cis4ZEZSQnYvMzhFcmpIVDFyMGlXQUZmMkMzQlVyejl2SEN2OFM1ZElhMkxYMXJ6Tkx6ClJ0MHZ4dUJxdzhNMEF5eDlsdDFhd2c2bkNwbkJCWXVyREMvelhEclBiRGRWQ1lmZVUwQnNXTy84dHF0bGJnVDIKRzl3ODRGb1Z4cDdaOFZsSU1DRmxBMnpzNlNGejdKc0RvZUEzcmFBVkdJLzZ1Z0xPcHl5cEVCTXMxT1VJSnFzaQpsMkQ0a0Y1MDFLS2FVNzN5cVdqZ29tN0MxMnl4b3crZXYrdG81MWJ5cnZMakt6ZzZDWUcxYTRYWHZpM3RQeHEzCnNtUGk5V0lzZ3RScUFFRlE4VG1EbjVYcE5wYVliZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89UXVvVmFkaXMgTGltaXRlZCBPVT1Sb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVF1b1ZhZGlzIExpbWl0ZWQgT1U9Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSIKIyBTZXJpYWw6IDk4NTAyNjY5OQojIE1ENSBGaW5nZXJwcmludDogMjc6ZGU6MzY6ZmU6NzI6Yjc6MDA6MDM6MDA6OWQ6ZjQ6ZjA6MWU6NmM6MDQ6MjQKIyBTSEExIEZpbmdlcnByaW50OiBkZTozZjo0MDpiZDo1MDo5MzpkMzo5Yjo2Yzo2MDpmNjpkYTpiYzowNzo2MjowMTowMDo4OTo3NjpjOQojIFNIQTI1NiBGaW5nZXJwcmludDogYTQ6NWU6ZGU6M2I6YmI6ZjA6OWM6OGE6ZTE6NWM6NzI6ZWY6YzA6NzI6Njg6ZDY6OTM6YTI6MWM6OTk6NmY6ZDU6MWU6Njc6Y2E6MDc6OTQ6NjA6ZmQ6NmQ6ODg6NzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYwRENDQkxpZ0F3SUJBZ0lFT3JaUWl6QU5CZ2txaGtpRzl3MEJBUVVGQURCL01Rc3dDUVlEVlFRR0V3SkMKVFRFWk1CY0dBMVVFQ2hNUVVYVnZWbUZrYVhNZ1RHbHRhWFJsWkRFbE1DTUdBMVVFQ3hNY1VtOXZkQ0JEWlhKMAphV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEV1TUN3R0ExVUVBeE1sVVhWdlZtRmthWE1nVW05dmRDQkRaWEowCmFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TVRBek1Ua3hPRE16TXpOYUZ3MHlNVEF6TVRjeE9ETXoKTXpOYU1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVNVdwpJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRFZRUURFeVZSCmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXYyRzFsVk82Vi96NjhtY0xPaHJmRVlCa2xiVFJ2TTE2ei9ZcApsaTRrVkVBa09QY2FoZHhZVE11a0owS1gwSitEaXNQa0JnTmJBS1ZSSG5BRWRPTEIxRHFyMTYwN0J4Z0ZqdjJECnJPcG0yUmdiYUlyMVZ4cVl1dlh0ZGoxODJkNlVhanRMRjhIVmo3MWxPRHFWMEQxVk5rN2ZlVmN4S2g3WVdXVkoKV0NDWWZxdGZmcC9wMWszc2czU3B4MnpZN2lsS2hTb0dGUGxVNXRQYVpRZUxZemNTMTlEc3czc2dRVVNqN2N1ZwpGK0Z4WmM0ZFpqSDNkZ0VaeUgwRFdMYVZTUjJtRWlib3hneDI0T05teStwZHBpYnU1Y3hmdldlbkFTY09vc3BVCnhiRjZsUjF4SGtvcGlnUGNha1hCcEJsZWJ6Yk53Nkt3dC81Y09PSlN2UGhFUSthUXV3SURBUUFCbzRJQ1VqQ0MKQWs0d1BRWUlLd1lCQlFVSEFRRUVNVEF2TUMwR0NDc0dBUVVGQnpBQmhpRm9kSFJ3Y3pvdkwyOWpjM0F1Y1hWdgpkbUZrYVhOdlptWnphRzl5WlM1amIyMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0NBUm9HQTFVZElBU0NBUkV3CmdnRU5NSUlCQ1FZSkt3WUJCQUcrV0FBQk1JSDdNSUhVQmdnckJnRUZCUWNDQWpDQnh4cUJ4RkpsYkdsaGJtTmwKSUc5dUlIUm9aU0JSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUmxJR0o1SUdGdWVTQndZWEowZVNCaApjM04xYldWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElIUm9aVzRnWVhCd2JHbGpZV0pzWlNCemRHRnVaR0Z5ClpDQjBaWEp0Y3lCaGJtUWdZMjl1WkdsMGFXOXVjeUJ2WmlCMWMyVXNJR05sY25ScFptbGpZWFJwYjI0Z2NISmgKWTNScFkyVnpMQ0JoYm1RZ2RHaGxJRkYxYjFaaFpHbHpJRU5sY25ScFptbGpZWFJsSUZCdmJHbGplUzR3SWdZSQpLd1lCQlFVSEFnRVdGbWgwZEhBNkx5OTNkM2N1Y1hWdmRtRmthWE11WW0wd0hRWURWUjBPQkJZRUZJdExiZTNUCktia0dHZXc1T2Fud2w0UnF5Ky9mTUlHdUJnTlZIU01FZ2FZd2dhT0FGSXRMYmUzVEtia0dHZXc1T2Fud2w0UnEKeSsvZm9ZR0VwSUdCTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcApkR1ZrTVNVd0l3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TNHdMQVlEClZRUURFeVZSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dRNnRsQ0wKTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBaXRRVXRmNzBtcEtuR2RTawpmbklZajlsb2ZGSWszV2R2T1hyRXFsNDk0bGl3VFhDWWhHSG9HK05wR0E3TyswZFFvRTcvOENRZnZiTE85U2Y4CjdDOVRxbk43QXoxMGJ1WVdudXVsTHNTL1ZpZFFLMks2dmtzY1BGVmNRUjBrdm9JZ1IxM1ZSSDU2Rm1qZmZVMVIKY0hoWEhUTWUvUUtabkF6TkNnVlB4N3VPcEhYNlNtMnhnSTRKVnJtY0dtRCtYY0hYZXR3UmVORFdYY0czMWEweQptUU02aXN4VUpUa3hnWHNUSWxHNlJteWh1NTc2Qkd4SkpuU1AwblByekRDaTV1cFpJb2Y0bC9VTy9lck1rcVFXCnhGSVk2aUhPc2ZIbWhJSGx1cW1HS1BKRFdsMFNuYXdlMmFqbENtcW5mNkNIS2MveWlVM1U3TVhpNW5yUU5pT0sKU25RMitRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDIgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDIiCiMgU2VyaWFsOiAxMjg5CiMgTUQ1IEZpbmdlcnByaW50OiA1ZTozOTo3YjpkZDpmODpiYTplYzo4MjplOTphYzo2MjpiYTowYzo1NDowMDoyYgojIFNIQTEgRmluZ2VycHJpbnQ6IGNhOjNhOmZiOmNmOjEyOjQwOjM2OjRiOjQ0OmIyOjE2OjIwOjg4OjgwOjQ4OjM5OjE5OjkzOjdjOmY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4NTphMDpkZDo3ZDpkNzoyMDphZDpiNzpmZjowNTpmODozZDo1NDoyYjoyMDo5ZDpjNzpmZjo0NToyODpmNzpkNjo3NzpiMTo4Mzo4OTpmZTphNTplNTpjNDo5ZTo4NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnR6Q0NBNStnQXdJQkFnSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQXdSVEVMTUFrR0ExVUVCaE1DUWsweApHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTWpBZUZ3MHdOakV4TWpReE9ESTNNREJhRncwek1URXhNalF4T0RJek16TmFNRVV4Q3pBSkJnTlYKQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUnN3R1FZRFZRUURFeEpSZFc5VwpZV1JwY3lCU2IyOTBJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNhCkdNcExsQTBBTGE4REtZcndENEhJcmt3WmhSMEluNnNwUklYekw0R3RNaDZRUnIramhpWWFIdjUrSEJnNlhKeGcKRnlvNmRJTXpNSDFoVkJITDdhdmc1dEtpZnZWcmJ4aTNDZ3N0L2VrKzd3ckdzeERwM01KR0YvaGQvYVRhLzU1SgpXcHptTStZa2x2Yy91bHNySEhvMXd0Wm4vcXRtVUl0dEtHQXI3OWRndzhlVHZJMDJrZk4vK05zUkU4U2NkM2JCCnJyY0Nhb0Y2cVVXRDRnWG11VmJCbERlUFNIRmpJdXdYWlFlVmlrdmZqOFphQ3VXdzQxOWVheEdyRFBtRjYwVHAKK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3lsWlV0UW9mWDFiT1FRN2RzRS9IZTNmYkUrSWsvMFhYMQprc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dDY2LzNGc3ZielNVcjVSLzdtcC9pClVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhud1E1aFlJaXoKUHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZwovek9oRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVICm95Y1I3aFlRZTd4RlNreXlCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUkKeVY3N3pHSGNpek4zMDBReU5RbGlCSklXRU5pZUowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3Q3dZRFZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyCkE4UVpSdEdVYXpCdUJnTlZIU01FWnpCbGdCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhNkZKcEVjd1JURUwKTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVApFbEYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNb0lDQlFrd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFENEtGazJmCkJsdW9ybkZkTHdVdlorWVRSWVBFTnZiendDWU1EYlZIWkYzNHRITEpScVVER0NkVmlYaDlkdXFXTklBWElOem4KZy9pTi9BZTQybDlOTG1leWhQM1pSUHgzVUlIbWZMVEpEUXR5VS9oMkJ3ZEJSNVlNKytDQ0pwTlZqUDRpSDJCbApmRi9uSnJQM01wQ1lVTlEzY1ZYMmtpRjQ5NVY1K3ZndEpvZG1WakIzcGpkNE0xSVFXSzQvWVk3eWFySHZHSDVLCldXUEtqYUpXMWFjdnZGWWZ6em5CNHZzS3FCVXNmVTE2WThac2wwUTgwbS9EU2hjSytKRFNWNklaVWFVdGwwSGEKQjArcFVOcVFqWlJHNFQ3d2xQMFFBRGoxTytoQTRiUnVWaG9nekc5WWplMHVSWS9XNlpNLzU3RXMzenJXSW96YwpoTHNpYjlENDVNWTU2UVNJUE1PNjYxVjZiWUNaSlBWc0FmdjRsN0NVVyt2OTBtL3hkMmdOTldRanJMaFZvUVBSClRVSVozUGgxV1ZhaithaEplZml2RHJrUm9IeTNhdTAwMExZbVlqZ2Fod3o0NlAwdTA1Qi9CNUVxSGRaK1hJV0QKbWJBNENEL3BYdmsxQitUSlltNVhmNmRRbGZlNnlKdm1qcUlCeGRabXYzbGg4endjNGJtQ1hGMmd3K25ZU0wwWgpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSTRwRVpYTkx4SWQyNkYwS0NsM0dCVXpHcG4vWjlZcjl5CjRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04VkNMQUFWQnBRNTcwc3U5dCtPemEKOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAzIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAzIgojIFNlcmlhbDogMTQ3OAojIE1ENSBGaW5nZXJwcmludDogMzE6ODU6M2M6NjI6OTQ6OTc6NjM6Yjk6YWE6ZmQ6ODk6NGU6YWY6NmY6ZTA6Y2YKIyBTSEExIEZpbmdlcnByaW50OiAxZjo0OToxNDpmNzpkODo3NDo5NToxZDpkZDphZTowMjpjMDpiZTpmZDozYToyZDo4Mjo3NTo1MTo4NQojIFNIQTI1NiBGaW5nZXJwcmludDogMTg6ZjE6ZmM6N2Y6MjA6NWQ6Zjg6YWQ6ZGQ6ZWI6N2Y6ZTA6MDc6ZGQ6NTc6ZTM6YWY6Mzc6NWE6OWM6NGQ6OGQ6NzM6NTQ6NmI6ZjQ6ZjE6ZmU6ZDE6ZTE6OGQ6MzUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHgKR1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ016QWVGdzB3TmpFeE1qUXhPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WCkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVcKWVdScGN5QlNiMjkwSUVOQklETXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFETQpWMElXVkp6bW1OUFRUZTcrN2NlZlF6bEtaYlBvRm9nMDJ3MVprWFRQa3JnRVFLMENTekdydkkyUmFOZ2dEaG9CCjRocDdUaGRkNG9xM1A1a2F6ZXRocThKbHBoKzN0NzIzai96OWNJOExvR2UrQWFKWnozSG1EeWwyLzdGV2VVVXIKSDU1NlZPaWpLVFZvcEFGUEQ2UXVOKzhiditPUEVLaHlxMWhYNTFTR3lNbnpXOW9zMmwyT2JqeWpQdHI3Z3VYZAo4bHl5QlROdmlqYk8wQk5PLzc5S0REUk1wc01odlZBRVZldXh1NTM3UlI1a0ZkNVZBWXdDZHJYTG9UOUNhYnd2CnZXaERGbGFKS2pkaGtmMm1yazdBeXhSbGxEZExrZ2J2Qk5ESW5JamJDM3VCcjdFOUtzUmxPbmkyN3R5QXNkTFQKbVp3NjdtdGFhN09OdDlYT25NSytwVXN2RnJHZWFEc0diNjU5bi9qZTdNd3BwNWlqSlVNdjcvRmZKdUdJVGZoZQpidGZaRkc0Wk0ybW5PNFNKazhSVFZST2hVWGhBK0xqSm91NTd1bEpDZzU0VTdRVlNXbGxXcDVmOG5UOEtLZGpjClQ1RU9FN3plbGFUZmk1bStySnN6aU8rMWdhOGJ4aUpUeVBiSDdwY1VzTVY4ZUZMSThNNXVkMkNFcHVrcWRpRHQKV0FFWE1KUHBHb3ZnYzJQWmFwS1VTVTYwclVxRnhLTWlNUHdKN1dnaWM2YUlERlVoV01YaE9wOHEzY3Joa09EWgpjNnRzZ0xqb0MyU1RvSnlNR2YrejBnenNrU2FIaXJPaTRYQ1BMQXJselcxb1VldmFQd1YvaXpMbUUxeHIvbDlBCjRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHp1RDg3blNWTDJ2OUE2d0lEQVFBQm80SUJsVENDQVpFd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVEJna3JCZ0VFQWI1WUFBTXdnY1V3Z1pNRwpDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqWVhSbElHTnZibk4wCmFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdQpkQzR3TFFZSUt3WUJCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53CmN6QUxCZ05WSFE4RUJBTUNBUVl3SFFZRFZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEcKQTFVZEl3Um5NR1dBRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQwpUVEVaTUJjR0ExVUVDaE1RVVhWdlZtRmthWE1nVEdsdGFYUmxaREViTUJrR0ExVUVBeE1TVVhWdlZtRmthWE1nClVtOXZkQ0JEUVNBemdnSUZ4akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBVDYyZ0xFejZ3UEp2OTJaVnF5TTAKN3VjcDJzTmJ0ckNEMmREUTRpSDc4MkNuTzExZ1V5ZWltL1lJSWlybnY2Qnk1WndrYWpHeGtIb24yNFFSaVNlbQpkMW80MTcrc2h2enVYWU84QnNiUmQyc1BiU1F2UzNwc3B3ZVd5dU9FbjYySWl4MnJGbzFiWmhmWkZ2U0xnTkxkCitMSjJ3L3c0RTZvTTNrSnBLMjd6UE91QUo5djFwa1FObjFwVldRdlZEVkpJeGE2ZjhpK0F4ZW95VURVU2x5N0IKNGYveEk0aFJPSi95WmxaMjV3OVJsNlZTREUxSlVaVTJQYitpU3d3UUhZYVpUS3J6Y2hHVDVPcjJtOXFvWGFkTgp0NTRDcm5NQXlOb2pBK2o1NmhsMFlnQ1V5eUlndnBTbldiV0NhcjZaZVhxcDhrb2tVdmQwL2JwTzVxZ2RBbTZ4CkRZQkV3YTdUSXpkZnU0VjhLNUl1Nkg2bGk5Mlo0YjhuYnkxZHFudUgvZ3JkUy95TzlTYmtibkJDYmpQc01aNTcKazhIa3lXa2FQY0JyVGlKdDdxdFlUY2JRUWNFcjZrOFNoMTdyUmRoczlaZ0MwNkRZVllvR21SbWlvSGZSTUo2cwp6SFh1Zy9Xd1lqblBiRmZpVE5LUkN3NTFLQnVhdi8wYVEvSEtkL3M3ajJHNGFTZ1dRZ1JlY0NvY0lkaVA0YjBqCld5MTBRSkxaWXhrTmM5MXB2R0pIdk9CMEs3THJmYjVCRzdYQVJzV2hJc3RmVHNFb2t0NFl1dFVxS0xzUml4ZVQKbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicnFaNWhIWTh5Mm80TTFuUStld2trMmdGM1I4UTd6VFNNbWZYSwo0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U0VDT00gVHJ1c3QubmV0IE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMQojIFN1YmplY3Q6IE89U0VDT00gVHJ1c3QubmV0IE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMQojIExhYmVsOiAiU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290IENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogZjE6YmM6NjM6NmE6NTQ6ZTA6YjU6Mjc6ZjU6Y2Q6ZTc6MWE6ZTM6NGQ6NmU6NGEKIyBTSEExIEZpbmdlcnByaW50OiAzNjpiMToyYjo0OTpmOTo4MTo5ZTpkNzo0Yzo5ZTpiYzozODowZjpjNjo1Njo4Zjo1ZDphYzpiMjpmNwojIFNIQTI1NiBGaW5nZXJwcmludDogZTc6NWU6NzI6ZWQ6OWY6NTY6MGU6ZWM6NmU6YjQ6ODA6MDA6NzM6YTQ6M2Y6YzM6YWQ6MTk6MTk6NWE6Mzk6MjI6ODI6MDE6Nzg6OTU6OTc6NGE6OTk6MDI6NmI6NmMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURXakNDQWtLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJRTVFzd0NRWURWUVFHRXdKS1VERVkKTUJZR0ExVUVDaE1QVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdApkVzVwWTJGMGFXOXVJRkp2YjNSRFFURXdIaGNOTURNd09UTXdNRFF5TURRNVdoY05Nak13T1RNd01EUXlNRFE1CldqQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUFUwVkRUMDBnVkhKMWMzUXVibVYwTVNjd0pRWUQKVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0ZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN6cy81LzAyMng3eFo4VjZVTWJYYUtMMHUvWlB0TTdvcnc4eWw4CjlmL3VLdURwNmJwYlpDS2FtbThzT2lacFVRV1pKdHpWSEdweHhwcDlIcDNkZkd6R2pHZG5Tajc0Y2JBWko2a0oKREthVnYwdU1EUHBWbUR2WTZDS2hTM0U0ZWF5WGttbXppWDdxSVdnR21CU1doOUpoTnJ4dEoxYWVWKzdBd0ZiOQpNcytrMlk3Q0k5ZU5xUFBZSmF5WDVIQTQ5TFk2dEowN2x5WkRvNkc4U1ZseVRDTXdod0ZZOWs2K0hHaFdacS9OClFWM0lzMDBxVlVhckg5b2U0a0E5MjgxOXVaS0FuRGZkREpaa25kd2k5MlNMMzJIZUZaUlNGYUI5VXNsTHFDSEoKeHJIdHk4T1ZZTkVQOEt0dytOL0xUWDdzMXZxcjJiMS9WUEtsNlhuNjJkWjJKQ2h6QWdNQkFBR2pQekE5TUIwRwpBMVVkRGdRV0JCU2djMG1aYU55RlcyWGpteWd2VjUrOU03d0hTREFMQmdOVkhROEVCQU1DQVFZd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFhRUNwcUx2a1QxMTVzd1cxRjdOZ0UrdkcKa2wzZzBkTnEvdnUrbTIyL3h3VnRXU0RFSFBDMzJvUllBbVA2U0JidlQ2VUw5MHFZOGorZUc2MUhhMlBPQ0VmcgpVajk0bks5TnJ2alZUOCthbUNvUVFUbFN4TjNabXc3dmt3R3VzaTdLYUVJa1FteXdzem8remVuYVNNUVZ5K241CkJ3K1NVRW1LM1RHWFg4bnBONm83V1dXWGxETEpzNTgrT21KWXhVbXRZZzV4cFRLcUw4YUpka05BRXhOblBhSlUKSlJETDhUcnkyZnJiU1ZhN3B2Nm5RVFhENEloaHlZakgzellRSXBoWjZyQksrMVlXYzI2c1RmY2lvVSt0SFhvdApSU2ZsTU1GZTh0b1R5eVZDVVpWSEE0eHNJY3gwUXUxVC96T0xqdzlYQVJZdno2YnV5WEFpRkwzOXZtd0xBdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Tb25lcmEgQ2xhc3MyIENBIE89U29uZXJhCiMgU3ViamVjdDogQ049U29uZXJhIENsYXNzMiBDQSBPPVNvbmVyYQojIExhYmVsOiAiU29uZXJhIENsYXNzIDIgUm9vdCBDQSIKIyBTZXJpYWw6IDI5CiMgTUQ1IEZpbmdlcnByaW50OiBhMzplYzo3NTowZjoyZTo4ODpkZjpmYTo0ODowMTo0ZTowYjo1Yzo0ODo2ZjpmYgojIFNIQTEgRmluZ2VycHJpbnQ6IDM3OmY3OjZkOmU2OjA3OjdjOjkwOmM1OmIxOjNlOjkzOjFhOmI3OjQxOjEwOmI0OmYyOmU0OjlhOjI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3OTowODpiNDowMzoxNDpjMTozODoxMDowYjo1MTo4ZDowNzozNTo4MDo3ZjpmYjpmYzpmODo1MTo4YTowMDo5NTozMzo3MTowNTpiYTozODo2YjoxNTozZDpkOToyNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRElEQ0NBZ2lnQXdJQkFnSUJIVEFOQmdrcWhraUc5dzBCQVFVRkFEQTVNUXN3Q1FZRFZRUUdFd0pHU1RFUApNQTBHQTFVRUNoTUdVMjl1WlhKaE1Sa3dGd1lEVlFRREV4QlRiMjVsY21FZ1EyeGhjM015SUVOQk1CNFhEVEF4Ck1EUXdOakEzTWprME1Gb1hEVEl4TURRd05qQTNNamswTUZvd09URUxNQWtHQTFVRUJoTUNSa2t4RHpBTkJnTlYKQkFvVEJsTnZibVZ5WVRFWk1CY0dBMVVFQXhNUVUyOXVaWEpoSUVOc1lYTnpNaUJEUVRDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpBWFNqV2R5dkFObHNkRStoWTMvRWk5dlgrQUxUVTc0VytvClo2bS9BeHhOakc4eVI5VkJhS1FUQk1FMURKcUVRL3hjSGYrSnMrZ1hHTTJSWC91SjQrcS9UbDE4R3liVGRYbnQKNW9UalYrV3RLY1QwT2lqbnBYdUVObW16L1Y1MnZhTXRtZE9RVGlNb2ZSaGo4VlE3SnAxMlc1ZENzdit1OEU3cwozVG1WVG9NR2YrZEpRTWpGQWJKVVdtWWRQZno1NlR3S25vRzRjUEFCaStRalZIeklydmlRSGdDV2N0UlV6MkVqCnZPcjduUUtWMGJhNWNUcHBDRDhQdE9GQ3g0ajFQNWlvcDdvYzRIRng3MWhYZ1ZCNlhHdDBSZzZEQTVqRGpxaHUKOG5ZeWJpZUR3blB6M0Jqb3RKUHFkVVJyQkdBZ2NWZUhuZk8rb0pBalBZb2s0ZG9oMjhNQ0F3RUFBYU16TURFdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QVJCZ05WSFE0RUNnUUlTcUNxV0lUVFhqd3dDd1lEVlIwUEJBUURBZ0VHCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmF6b2Y1Rm5JVlYwc2QyWnZub2lZdzdKTm4zOVl0MGpTdjl6aWwKenFzV3Vhc3ZmRFhMck5BUHRFd3IvSUR2YTR5Ulh6WjI5OXV6R3hucTlMSVIvV0Z4Ukw4b3N6b2R2N05ENkorLwozREVJY2JDZGpkWTBSektReG1Vazk2QktmQVJ6anpsdkY0eHl0YjFMeUhyNGU0UERLRTZjQ2VwblA3Sm5CQnZECkZOcjQ1MGtra2RBZGF2cGhPZTlyNXlGMUJnZllFclFoSUhCQ2NZSGFQSm8ydnFaYkRXcHNtaCtSZS9uNTcwSzYKVGs2ZXpBeU5sTnpaUlp4ZTdFSlFZNjcwWGNTeEV0ektPNmd1blJSYUJYVzM3TmRqNHJvMXRnUUlrZWphblp6MgpaclVZckFxbVZDWTBNOUlid2RSL0dqcU9DNm95YnR2OFR5V2YyVExIbGxwd3JOOU0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVhSYW1wIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVhSYW1wIFNlY3VyaXR5IFNlcnZpY2VzIEluYyBPVT13d3cueHJhbXBzZWN1cml0eS5jb20KIyBTdWJqZWN0OiBDTj1YUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1YUmFtcCBTZWN1cml0eSBTZXJ2aWNlcyBJbmMgT1U9d3d3LnhyYW1wc2VjdXJpdHkuY29tCiMgTGFiZWw6ICJYUmFtcCBHbG9iYWwgQ0EgUm9vdCIKIyBTZXJpYWw6IDEwNzEwODkwODgwMzY1MTUwOTY5Mjk4MDEyNDIzMzc0NTAxNDk1NwojIE1ENSBGaW5nZXJwcmludDogYTE6MGI6NDQ6YjM6Y2E6MTA6ZDg6MDA6NmU6OWQ6MGY6ZDg6MGY6OTI6MGE6ZDEKIyBTSEExIEZpbmdlcnByaW50OiBiODowMTo4NjpkMTplYjo5Yzo4NjphNTo0MTowNDpjZjozMDo1NDpmMzo0Yzo1MjpiNzplNTo1ODpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogY2U6Y2Q6ZGM6OTA6NTA6OTk6ZDg6ZGE6ZGY6YzU6YjE6ZDI6MDk6Yjc6Mzc6Y2I6ZTI6YzE6OGM6ZmI6MmM6MTA6YzA6ZmY6MGI6Y2Y6MGQ6MzI6ODY6ZmM6MWE6YTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lRVUpSczdCanExWnhOMVpmdmRZK2dyVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFawpNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZ1UyVnlkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZClVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFF4TVRBeE1UY3gKTkRBMFdoY05NelV3TVRBeE1EVXpOekU1V2pDQmdqRUxNQWtHQTFVRUJoTUNWVk14SGpBY0JnTlZCQXNURlhkMwpkeTU0Y21GdGNITmxZM1Z5YVhSNUxtTnZiVEVrTUNJR0ExVUVDaE1iV0ZKaGJYQWdVMlZqZFhKcGRIa2dVMlZ5CmRtbGpaWE1nU1c1ak1TMHdLd1lEVlFRREV5UllVbUZ0Y0NCSGJHOWlZV3dnUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1lKQjY5RmJTNgozOGVNcFNlMk9BdHA4N1pPcUN3dUlSMWNSTjhoWFg0amRQNWVmclJLdDZhdEg2N2dCaGJpbTF2WlozUnJYWUNQCktaMkdHOW1jRFpodGRoQW9XT1Jsc0g5S21IbWY0TU14Zm9BcnRZekFRRHNSaHRETG9vWTJZS1RWTUlKdDJXN1EKRHhJRU01ZGZUMkZhOE9UNWthdm5IVHU4Nk0vMGF5MDBmT0pJWVJ5TzgyRkV6RytnU3FtVXNFM2E1NmswZW5JNApxRUhNUEpRUmZldklwb3kzaHN2S016dlpQVGVMKzNvK2hpem5jOWNLVjZ4a214bnI5QThFQ0lxc0F4Y1paUFJhCkpTS05OQ3l5OW1nZEVtM1RpaDRVMnNTUHB1SWpoZFY2RGIxcTRPbnM3QmU3UWh0bnFpWHRSWU1oL01ISmZOVmkKUHZyeXhTM1QvZFJsQWdNQkFBR2pnWjh3Z1p3d0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUApCQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNWlBvajBHWTRRSm5NNWk1QVNzCmpWeTE2YlliTURZR0ExVWRId1F2TUMwd0s2QXBvQ2VHSldoMGRIQTZMeTlqY213dWVISmhiWEJ6WldOMWNtbDAKZVM1amIyMHZXRWREUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUpFVk9RTUJHMmY3U2h6NUNtQmJvZHBObDJMNUpGTW4xNEprVHBBdXcwa2JLNXJjL0toNFp6WHhIZkFSCnZiZEk0eEQyRGQ4LzBzbTJxbFdrU0xvQzI5NVpMaFZiTzUwV2ZVZlhOK3BmVFhZU05yc2YxNkdCQkVZZ295eHQKcVo0QmZqOHB6Z0NUMy8zSmtuT0ppV1NlNXl2a0hKRXMwcm5PZmM1dk1ablQ1cjdTSHBEd0NSUjVYQ09yVGRMYQpJUjlObVhtZDRjOG5ueENiSElnTnNJcGtRVEc0RG15UUpLU2JYSEdQdXJ0K0hCdmJhb0FQSWJ6cDI2YTNRUFN5Cmk2bXg1TythR3RBOWFabnVxQ2lqNFR5ejhMSVJuTTk4UU9iZDUwTjlvdGc2dGFtTjhqU1p4TlFRNFFiOUNZUVEKTys3RVRQVHNKM3hDd25SOGdvb0p5YlFESmJ3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1UaGUgR28gRGFkZHkgR3JvdXAsIEluYy4gT1U9R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuIE9VPUdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkdvIERhZGR5IENsYXNzIDIgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA5MTpkZTowNjoyNTphYjpkYTpmZDozMjoxNzowYzpiYjoyNToxNzoyYTo4NDo2NwojIFNIQTEgRmluZ2VycHJpbnQ6IDI3Ojk2OmJhOmU2OjNmOjE4OjAxOmUyOjc3OjI2OjFiOmEwOmQ3Ojc3OjcwOjAyOjhmOjIwOmVlOmU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMzo4NDo2YjpmMjo0Yjo5ZTo5MzpjYTo2NDoyNzo0YzowZTpjNjo3YzoxZTpjYzo1ZTowMjo0ZjpmYzphYzpkMjpkNzo0MDoxOTozNTowZTo4MTpmZTo1NDo2YTplNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFEQ0NBdWlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaApNQjhHQTFVRUNoTVlWR2hsSUVkdklFUmhaR1I1SUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFCllXUmtlU0JEYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEwTURZeU9URTMKTURZeU1Gb1hEVE0wTURZeU9URTNNRFl5TUZvd1l6RUxNQWtHQTFVRUJoTUNWVk14SVRBZkJnTlZCQW9UR0ZSbwpaU0JIYnlCRVlXUmtlU0JIY205MWNDd2dTVzVqTGpFeE1DOEdBMVVFQ3hNb1IyOGdSR0ZrWkhrZ1EyeGhjM01nCk1pQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FTQXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRU4KQURDQ0FRZ0NnZ0VCQU42ZDErcFhHRW1oVyt2WFgwaUc2cjdkLytUdlp4ejBaV2l6VjNHZ1huZTc3WnRKNlhDQQpQVllZWXdodjJ2TE0wRDkvQWxRaVZCRFlzb0hVd0hVOVMzL0hkOE0rZUtzYUE3VWdheTlxSzdIRmlIN0V1eDZ3CndkaEZKMitxTjFqM2h5YlgyQzMycVJlM0gzSTJUcVlYUDJXWWt0c3FibDJpL29qZ0M5NS81WTBWNGV2TE90WGkKRXFJVExkaU9yMThTUGFBSUJRaTJYS1ZsT0FSRm1SNmpZR0IweFVHbGNtSWJZc1VmYjE4YVFyNENVV1dvcmlNWQphdng0QTZsTmY0REQrcXRhL0tGQXBNb1pGdjZ5eU85ZWN3M3VkNzJhOW5tWXZMRUhaNklWRGQyZ1dNWkVld28rCllpaGZ1a0VIVTFqUEVYNDRkTVg0LzdWcGtJK0VkT3FYRzY4Q0FRT2pnY0F3Z2Iwd0hRWURWUjBPQkJZRUZOTEUKc05LUjFFd1JjYk5oeXoyaC90Mm9hdFRqTUlHTkJnTlZIU01FZ1lVd2dZS0FGTkxFc05LUjFFd1JjYk5oeXoyaAovdDJvYXRUam9XZWtaVEJqTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVlWR2hsSUVkdklFUmhaR1I1CklFZHliM1Z3TENCSmJtTXVNVEV3THdZRFZRUUxFeWhIYnlCRVlXUmtlU0JEYkdGemN5QXlJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQURKTDg3TEtQcEg4RXNhaEI0eU9kNkF6QmhSY2tCNFk5d2ltUFFvWitZZUFFVzVwNUpZWE1QODBrV055Ck9PN01IQUdqSFpRb3BESDJlc1JVMS9ibE1WZ0Rvc3pPWXR1VVJYTzF2MFhKSkxYVmdnS3RJM2xwamJpMlRjN1AKVE1vekkrZ2NpS3FkaTBGdUZza2c1WW1lelR2YWNQZCttU1lnRkZRbHEyNXpoZWFiSVowS2JJSU9xUGpDRFBvUQpIbXlXNzRjTnhBOWhpNjN1Z3l1VitJNlNoSEk1NnlEcWcrMkR6WmR1Q0x6clRpYTJjeXZrMC9aTS9pWng0bUVSCmRFci9WeHFIRDNWSUxzOVJhUmVnQWhKaGxkWFJRTElRVE83RXJCQkRwcVdlQ3RXVllwb056NGlDeFRJTTVDdWYKUmVZTm55aWNzYmtxV2xldE53K3ZIWC9idlo4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuIE9VPVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuIE9VPVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJTdGFyZmllbGQgQ2xhc3MgMiBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDMyOjRhOjRiOmJiOmM4OjYzOjY5OjliOmJlOjc0OjlhOmM2OmRkOjFkOjQ2OjI0CiMgU0hBMSBGaW5nZXJwcmludDogYWQ6N2U6MWM6Mjg6YjA6NjQ6ZWY6OGY6NjA6MDM6NDA6MjA6MTQ6YzM6ZDA6ZTM6Mzc6MGU6YjU6OGEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE0OjY1OmZhOjIwOjUzOjk3OmI4Ojc2OmZhOmE2OmYwOmE5Ojk1OjhlOjU1OjkwOmU0OjBmOmNjOjdmOmFhOjRmOmI3OmMyOmM4OjY3Ojc1OjIxOmZiOjVmOmI2OjU4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRHpDQ0F2ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCb01Rc3dDUVlEVlFRR0V3SlZVekVsCk1DTUdBMVVFQ2hNY1UzUmhjbVpwWld4a0lGUmxZMmh1YjJ4dloybGxjeXdnU1c1akxqRXlNREFHQTFVRUN4TXAKVTNSaGNtWnBaV3hrSUVOc1lYTnpJRElnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURRdwpOakk1TVRjek9URTJXaGNOTXpRd05qSTVNVGN6T1RFMldqQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbE1DTUdBMVVFCkNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wVTNSaGNtWnAKWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFZ01BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEUUF3Z2dFSUFvSUJBUUMzTXNqKzZYR21CSVd0REJGazM4NU43OGdER0ljL29hdjdQS2FmCjhNT2gydFRZYml0VGtQc2twRDZFOEo3b1gremxKMFQxS0tZL2U5N2dLdkRJcjFNdm5zb0ZBWk1lajJZY09hZE4KK2xxMmN3UWxadXQzZitkWnhrcVpKUlJVNnliSDgzOFoxVEJ3ajYrd1Jpci9yZXNwN2RlZnFnU0hvOVQ1aWFVMApYOXREa1lJMjJXWThzYmk1Z3YyY09qNFF5RHZ2Qm1WbWVwc1pHRDMvY1ZFOE1DNWZ2ajEzYzdKZEJtekRJMWFhCks0VW1raHluQXJQa1B3MnZDSG1DdURZOTZwelROYk84YWNyMXpKM28vV1NORjRBemJsNUtYWm5KSG9lMG5SckEKMVc0VE5TTmUzNXRmUGUvVzkzYkM2ajY3ZUEwY1FtZHJCTmo0MXRwdmkvSkVvQUdyQWdFRG80SEZNSUhDTUIwRwpBMVVkRGdRV0JCUy9YN2ZSenQwZmh2UmJWYXpjMXhEQ0RxbUk1ekNCa2dZRFZSMGpCSUdLTUlHSGdCUy9YN2ZSCnp0MGZodlJiVmF6YzF4RENEcW1JNTZGc3BHb3dhREVMTUFrR0ExVUVCaE1DVlZNeEpUQWpCZ05WQkFvVEhGTjAKWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQXNUS1ZOMFlYSm1hV1ZzWkNCRApiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dFQU1Bd0dBMVVkRXdRRk1BTUJBZjh3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFBV2RQNGlkMGNrYVZhR3NhZlB6V2RxYkFZY2FUMWVwb1hrSkt0djMKTDdJZXpNZGVhdGlEaDZHWDcwazFQbmNHUVZoaXY0NVl1QXBuUCt5ejNTRm1IOGxVK25MTVBVeEEySUd2ZDU2RAplcnVpeC9VMEY0N1pFVUQwL0N3cVRSVi9wMkpkTGlYVEFBc2dHaDFvK1JlNDlMMkw3U2haM1UwV2l4ZUR5TEpsCnh5MTZwYXE4VTRadDNWZWt5dmdnUVF0bzhQVDdkTDVXWFhwNTlma2RoZU10bGI3MWNaQkR6STBmbWdBS2h5bnAKVlNKWUFDUHE0eEpES1Z0SENOMk1RV3BsQnFqbElhcEJ0SlVobGJsOTBUU3JFOWF0dk56aVBUbk52VDUxY0tFWQpXUVBKSXJTUG5OVmVLdGVsdHRRS2JmaTNRQkZHbWg5NURtSy9ENWZzNEM4ZkY1UT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89R292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1Hb3Zlcm5tZW50IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlRhaXdhbiBHUkNBIgojIFNlcmlhbDogNDIwMjMwNzA4MDc3MDg3MjQxNTk5OTExNDA1NTY1MjcwNjY4NzAKIyBNRDUgRmluZ2VycHJpbnQ6IDM3Ojg1OjQ0OjUzOjMyOjQ1OjFmOjIwOmYwOmYzOjk1OmUxOjI1OmM0OjQzOjRlCiMgU0hBMSBGaW5nZXJwcmludDogZjQ6OGI6MTE6YmY6ZGU6YWI6YmU6OTQ6NTQ6MjA6NzE6ZTY6NDE6ZGU6NmI6YmU6ODg6MmI6NDA6YjkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc2OjAwOjI5OjVlOmVmOmU4OjViOjllOjFmOmQ2OjI0OmRiOjc2OjA2OjJhOmFhOmFlOjU5OjgxOjhhOjU0OmQyOjc3OjRjOmQ0OmMwOmIyOmMwOjExOjMxOmUxOmIzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY2pDQ0ExcWdBd0lCQWdJUUg1MVpXdGN2d2daRXBZQUlhZU5lOWpBTkJna3Foa2lHOXcwQkFRVUZBREEvCk1Rc3dDUVlEVlFRR0V3SlVWekV3TUM0R0ExVUVDZ3duUjI5MlpYSnViV1Z1ZENCU2IyOTBJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBeU1USXdOVEV6TWpNek0xb1hEVE15TVRJd05URXpNak16TTFvdwpQekVMTUFrR0ExVUVCaE1DVkZjeE1EQXVCZ05WQkFvTUowZHZkbVZ5Ym0xbGJuUWdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUIKQUpvbHVPek1vbldvZS9mT1cxbUt5ZEdHRWdoVTdKenk1MGIyaVBOODZhWGZURWMycEJzQkhIOGVWNHFOdzhYUgpJZVBhSkQ5SUsvdWZMcUdVNXl3Y2s5Ry9Hd0dIVTVuT3AvVUtJWFozLzZtM3huT1VUMGIzRUVrMytxaFpTVjFxCmdRZFc4b3I1QnREM2NDSk50TGRCdVRLNHNmQ3h3NXcvY1AxVDNZR3EyR040OXRoVGJxR3Nhb1FrY2xTR3h0S3kKeWh3T2VZSFd0WEJpQ0FFdVRrOE8xUkd2cWEvbG1yL2N6SWR0SnVUSlY2TDdsdm5NNFQ5VGpHeE1mcHRUQ0F0cwpGL3RueU1LdHNjMkF0SmZjZGdFV0ZlbHExNlRoZUVmT2h0WDdNZlA2TWI0MHFpajdjRXdkU2NldkxKMXRacWEyCmpXUit0U0JxblR1QnRvOUFBR2RMaVlhNHpHWCtGVlBwQk1IV1h4MUUxd292SjVwR2ZhRU5kYTFVaGhYY1NUdngKbHM0UG02RHNvM3BkdnRVcWRVTGxlOTZsdHFxdktLeXNrS3c0dDlWb05TWjYzUGM3OC8xRm05RzdRM2h1Yi9GQwpWR3FZOEEydGwrbFNYdW5WYW5MZWF2Y2JZQlQwcGVTMmNXZXFIK3JpVGNGQ1FQNW5SaGM0TDBjL2NaeXU1U0hLCllTMXRCNmlFZkMzdVVTWHhZNUNlL2VGWGlHdnZpaU50c2VhOVA2M1JQWllMaFkzTmF5ZTd0d1diN0x1UnFRb0gKRWdLWFRpQ1E4UDhOSHVKQk85TkFPdWVOWGRwbTVBS3dCMUtZWEE2T001ekNwcFg3VlJsdVRJNnVTdys5d1RoTgpYbytFSFdiTnhXQ1d0RkphQlltT2xYcVl3WkU4bFNPeUR2UjV0TWw4d1VvaEFnTUJBQUdqYWpCb01CMEdBMVVkCkRnUVdCQlRNek8vTUtXQ2tPN0dTdGp6Nk1tS1ByQ1VWT3pBTUJnTlZIUk1FQlRBREFRSC9NRGtHQkdjcUJ3QUUKTVRBdk1DMENBUUF3Q1FZRkt3NERBaG9GQURBSEJnVm5LZ01BQUFRVUE1dndJaFAvbFNnMjA5eWV3REw3TVRxSwpVV1V3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUVDQVN2b215YzVlTU4xUGhuUjJXUFd1czRNemVLUjZkQmNaClR1bFN0Ym5nQ25SaXFtaktlS0JNbW80c0l5N1ZhaElrdjlSbzA0clEySnlmdEI4TTNqaCtWemo4amVKUFhneWYKcXp2Uy8zV1h5NlRqWndqLzVjQVd0VWdCZmVuNUN2OGI1V3BwdjNnaHFNS25JNm1HcTNaVzZBNE05aFBkS21hSwpaRWs5R2hpSGtBU2ZRbEszVDh2K1IwRjJOZS8vQUhZMlJUS2J4a2FGWGVJa3NCN2pTSmFZVjBlVVZYb1BRYkZFCkpQUEIvaHBydjRqOXdhYmFrMkJlZ1VxWklKeElaaG0xQUhsVUQ3Z3NMMHU4cVYxYllIK01oNlhnVW1NcXZ0ZzcKaFVBVi9oNjJaVC9GUzlwK3RYbzFLYU11ZXBoZ0lxUDBmU2RPTGVxMGREenBENlF6RHhBUnZCTUIxdVVPMDcrMQpFcUxoUlNQQXpBaHVZYmVKcTRQakpCN21YUWZuSHlBK3oyZkk1Nnd3YlNkTGFHNUxLbHdDQ0RUYitIYmtaNk1tCm5EK2lNc0pLeFlFWU1SQldxb1R2TFFyL3VCOTMwcitsV0tCaTVOZExrWFdOaVlDWWZtM0xVMDVlci9heWw0V1gKdWRwVkJya2s3dGZHT0I1akd4STdsZUZZclBMZmhOVmZtUzhOVlZ2bU9Oc3VQM0xwU0lYTHV5a1RqeDQ0VmJuegpzc1F3bVNOT1hmSklvUklNM0JLUUNaQlVrUU04UitYVnlXWGd0MHQ5N0VmVHN3cytyWjdRZEFBTzY3MVJyY0RlCkxNRERhdjd2M0F1bitrYmZZTnVjcGxsUWRTTnBjNU95K2Z3QzAwZm1jYzRRQXU0bmpJVC9yRVVORTF5RE11QWwKcFlZc2ZQUVMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSIKIyBTZXJpYWw6IDE3MTU0NzE3OTM0MTIwNTg3ODYyMTY3Nzk0OTE0MDcxNDI1MDgxCiMgTUQ1IEZpbmdlcnByaW50OiA4NzpjZTowYjo3YjoyYTowZTo0OTowMDplMTo1ODo3MTo5YjozNzphODo5Mzo3MgojIFNIQTEgRmluZ2VycHJpbnQ6IDA1OjYzOmI4OjYzOjBkOjYyOmQ3OjVhOmJiOmM4OmFiOjFlOjRiOmRmOmI1OmE4Ojk5OmIyOjRkOjQzCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzZTo5MDo5OTpiNTowMTo1ZTo4Zjo0ODo2YzowMDpiYzplYTo5ZDoxMToxZTplNzoyMTpmYTpiYTozNTo1YTo4OTpiYzpmMTpkZjo2OTo1NjoxZTozZDpjNjozMjo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHR6Q0NBcCtnQXdJQkFnSVFET2ZnNVJmWVJ2NlA1V0Q4Ry9Bd09UQU5CZ2txaGtpRzl3MEJBUVVGQURCbApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnYKYjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4TVRFd01EQXdNREF3V2pCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sCmNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFd2dnRWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3YwpKcFNJcXZUTzlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQCm1ESTJkc3plM1R5b291OXEreUh5VW1IZm55RFhIK0t4MmY0WVpOSVNXMS81V0JnMXZFZk5vVGI1YTMvVXNEZysKd1J2RGpEUFoyQzhZL2lnUHM2ZUQxc051Uk1CaE5aWVcvbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNApWWWNnb2MvbGJRcklTWHd4bUROc0l1bUgwREphb3JvVGdoSHRPUmVkbVRweW9lYjZwTm5WRnpGMXJvVjlJcTQvCkFVYUc5aWg1eUxIYTVGY1h4SDRjRHJDMGtxWldzNzJ5bCsycXAvQzN4YWcvbFJiUS82R1c2d2hmR0hkUEFnTUIKQUFHall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQmhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRVwpCQlJGNjZLdjlKTExnakV0VVl1bnB5R2Q4MjNJRHpBZkJnTlZIU01FR0RBV2dCUkY2Nkt2OUpMTGdqRXRVWXVuCnB5R2Q4MjNJRHpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW9nNjgzK0x0OE9OeWMzcGtsTC8zY21iWU11UkMKZFdLdWgrdnkxZG5lVnJPZnpNNFVLTGtObDJCY0VreFk1Tk05ZzBsRldKYzFhUnFvUitwV3hubXJFdGhuZ1lUZgpmd2s4bE9hNEppd2d2VDJ6S0luM1gvOGk0cGVFSCtsbDc0ZmczOEZuU2JOZDY3SUpLdXNtN1hpK2ZUOHI4N2NtCk5XMWZpUUcyU1Z1ZkFRV2JxejBsd2N5MmY4THhiNGJHK21SbzY0RXRsT3RDdC9xTUh0MWk4YjVRWjdkc3ZmUHgKSDJzTU5nY1dmemQ4cVZ0dGV2RVNSbUNEMXljRXZrdk9sNzdEWnlwb0VkK0E1d3d6WnI4VERSUnU4MzhmWXhBZQorbzBiSlcxc2o2VzNZUUd4MHFNbW9SQnhuYTNpdy9uRG1WRzNLd2NJemk3bVVMS24rZ3BGTDZMdzhnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSIKIyBTZXJpYWw6IDEwOTQ0NzE5NTk4OTUyMDQwMzc0OTUxODMyOTYzNzk0NDU0MzQ2CiMgTUQ1IEZpbmdlcnByaW50OiA3OTplNDphOTo4NDowZDo3ZDozYTo5NjpkNzpjMDo0ZjplMjo0Mzo0Yzo4OToyZQojIFNIQTEgRmluZ2VycHJpbnQ6IGE4Ojk4OjVkOjNhOjY1OmU1OmU1OmM0OmIyOmQ3OmQ2OjZkOjQwOmM2OmRkOjJmOmIxOjljOjU0OjM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0Mzo0ODphMDplOTo0NDo0Yzo3ODpjYjoyNjo1ZTowNTo4ZDo1ZTo4OTo0NDpiNDpkODo0Zjo5Njo2MjpiZDoyNjpkYjoyNTo3Zjo4OTozNDphNDo0MzpjNzowMTo2MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHJ6Q0NBcGVnQXdJQkFnSVFDRHZnVnBCQ1JyR2hkV3JKV1pISFNqQU5CZ2txaGtpRzl3MEJBUVVGQURCaApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkQKUVRBZUZ3MHdOakV4TVRBd01EQXdNREJhRncwek1URXhNVEF3TURBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVApNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqCmIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVOQk1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTRqdmhFWExlcUtUVG8xZXFVS0tQQzNlUXlhS2w3aExPbGxzQgpDU0RNQVpPblRqQzNVL2REeEdrQVY1M2lqU0xkaHdaQUFJRUp6czRiZzcvZnpUdHhSdUxXWnNjRnMzWW5Gbzk3Cm5oNlZmZTYzU0tNSTJ0YXZlZ3c1Qm1WL1NsMGZ2QmY0cTc3dUtOZDBmM3A0bVZtRmFHNWNJekpMdjA3QTZGcHQKNDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUg0aWRxOUpveitFa0lZSXZVWDdRNmhMK2hxa3BNZlQ3UApUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveTd2clRDMExVcTdkQk10b00xTy80CmdkVzdqVmcvdFJ2b1NTaWljTm94Qk4zM3NoYnlUQXBPQjZqdFNqMWV0WCtqa01Pdkp3SURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUgpUTHRtOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFNdWNONnBJRXhJSyt0MUVuRTlTc1BUZnJnVDFlWGtJb3lRWS9Fc3IKaE1BdHVkWEgvdlRCSDFqTHVHMmNlblRubUNtckViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZwowNk8vblZzSjhkV080MVAwam1QNlA2ZmJ0R2JmWW1iVzBXNUJqZkl0dGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGClBubFVraWFZNElCSXFEZnY4Tlo1WUJiZXJPZ096VzZzUkJjNEwwbmE0VVUrS3JrMlU4ODZVQWIzTHVqRVYwbHMKWVNFWTFRU3RlRHdzT29CcnArdXZGUlRwMkluQnVUaHM0cEZzaXY5a3VYY2xWekRBR3lTajRkenAzMGQ4dGJRawpDQVV3N0MyOUM3OUZ2MUM1cWZQcm1BRVNyY2lJeHBnMFg0MEtQTWJwMVpXVmJkND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSIKIyBTZXJpYWw6IDM1NTM0MDAwNzY0MTA1NDc5MTk3MjQ3MzA3MzQzNzgxMDAwODcKIyBNRDUgRmluZ2VycHJpbnQ6IGQ0Ojc0OmRlOjU3OjVjOjM5OmIyOmQzOjljOjg1OjgzOmM1OmMwOjY1OjQ5OjhhCiMgU0hBMSBGaW5nZXJwcmludDogNWY6Yjc6ZWU6MDY6MzM6ZTI6NTk6ZGI6YWQ6MGM6NGM6OWE6ZTY6ZDM6OGY6MWE6NjE6Yzc6ZGM6MjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc0OjMxOmU1OmY0OmMzOmMxOmNlOjQ2OjkwOjc3OjRmOjBiOjYxOmUwOjU0OjQwOjg4OjNiOmE5OmEwOjFlOmQwOjBiOmE2OmFiOmQ3OjgwOjZlOmQzOmIxOjE4OmNmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJUUFxeGNKbW9MUUp1UEMzbnlya1lsZHpBTkJna3Foa2lHOXcwQkFRVUZBREJzCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU3N3S1FZRFZRUURFeUpFYVdkcFEyVnlkQ0JJYVdkb0lFRnpjM1Z5WVc1agpaU0JGVmlCU2IyOTBJRU5CTUI0WERUQTJNVEV4TURBd01EQXdNRm9YRFRNeE1URXhNREF3TURBd01Gb3diREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RERVJwWjJsRFpYSjBJRWx1WXpFWk1CY0dBMVVFQ3hNUWQzZDMKTG1ScFoybGpaWEowTG1OdmJURXJNQ2tHQTFVRUF4TWlSR2xuYVVObGNuUWdTR2xuYUNCQmMzTjFjbUZ1WTJVZwpSVllnVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNYk01WFBtCis5Uzc1UzB0TXFiZjVZRS95YzBsU2JaeEtzUFZsRFJub2dvY3NGOXBwa0N4eExleWo5Q1lwS2xCV1RyVDNKVFcKUE50ME9LUkt6RTBsZ3ZkS3BWTVNPTzd6U1cxeGtYNWp0cXVtWDhPa2hQaFBZbEcrK01YczJ6aVM0d2JsQ0pFTQp4Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0M01SdU5zOGNrUlpxbnJHMEFGRm9FdDdvVDYxRUttRUZCCklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRTkFRVFhLRngwMXA4VmR0ZVpPRTMKaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWVoMTBhVUFzZwpFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUEKRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lYwpuenlJWmdZSVZ5SGJJVWY0S21lcXZ4Z3lka0FRVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6CmVNN2I0MU41Y2RibElaUUIybFdIbWlSazlvcG16TjZjTjgyb05MRnBteVBJbm5naUszQkQ0MVZITVdFWjcxakYKaFM5T01QYWdNUllqeU9maVpSWXp5NzhhRzZBOStNcGVpekdMWUFpSkxRd0dYRkszeFBrS21ORVZYNThTdm53MgpZemk5UktSLzVDWXJDc1NYYVEzcGpPTEFFRmU0eUhZU2tWWHlTR25ZdkNvQ1d3OUUxQ0F4Mi9TNmNDWmRrR0NlCnZFc1hDUysweXg1RGFNa0hKOEhTWFBmcUlibG9FcHc4bkwrZS9JQmNtMlBON0VlcUpTZG5vRGZ6QUlKOVZOZXAKK09rdUU2TjM2QjlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DbGFzcyAyIFByaW1hcnkgQ0EgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNsYXNzIDIgUHJpbWFyeSBDQSBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBDbGFzcyAyIFByaW1hcnkgQ0EiCiMgU2VyaWFsOiAxNzc3NzAyMDgwNDU5MzQwNDAyNDE0Njg3NjA0ODgzMjc1OTUwNDMKIyBNRDUgRmluZ2VycHJpbnQ6IDg4OjJjOjhjOjUyOmI4OmEyOjNjOmYzOmY3OmJiOjAzOmVhOmFlOmFjOjQyOjBiCiMgU0hBMSBGaW5nZXJwcmludDogNzQ6MjA6NzQ6NDE6NzI6OWM6ZGQ6OTI6ZWM6Nzk6MzE6ZDg6MjM6MTA6OGQ6YzI6ODE6OTI6ZTI6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBmOjk5OjNjOjhhOmVmOjk3OmJhOmFmOjU2Ojg3OjE0OjBlOmQ1OjlhOmQxOjgyOjFiOmI0OmFmOmFjOmYwOmFhOjlhOjU4OmI1OmQ1OjdhOjMzOjhhOjNhOmZiOmNiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEa2pDQ0FucWdBd0lCQWdJUkFJVzlTL1BZMnVOcDlwVFhYOE9sUkNNd0RRWUpLb1pJaHZjTkFRRUZCUUF3ClBURUxNQWtHQTFVRUJoTUNSbEl4RVRBUEJnTlZCQW9UQ0VObGNuUndiSFZ6TVJzd0dRWURWUVFERXhKRGJHRnoKY3lBeUlGQnlhVzFoY25rZ1EwRXdIaGNOT1Rrd056QTNNVGN3TlRBd1doY05NVGt3TnpBMk1qTTFPVFU1V2pBOQpNUXN3Q1FZRFZRUUdFd0pHVWpFUk1BOEdBMVVFQ2hNSVEyVnlkSEJzZFhNeEd6QVpCZ05WQkFNVEVrTnNZWE56CklESWdVSEpwYldGeWVTQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOeFEKbHRBUytEWFNDSGg2dGxKdy9XL3V6N2tSeTExMzRlenBmZ1NOMXN4dmMwTlhZS3d6Q2tUc0ExOGNnQ1NSNWFpUgpWaEtDOStBcjlOdXVZUzZKRUkxcmJMcXpBcjNWTnNWSU55UGk4Rm8zVWpNWEV1TFJZRTIrTDBFUjQvWVhKUXlMCmtjQWJtWHVaVmcydjd0SzhSMWZqZVVsN05Ja25KSVRlc2V6cFdFNytUdDlhdmtHdHJBakZHQTd2MGxQdWJOQ2QKRWdFVGpkeUFZdmVWcVVTSVNuRk9ZRldlMnlNWmVWWUhERDlqQzF5dzRyNStGZnlVTTFoQk9IVEU0WStMM3lhcwpIN1dMTzdkRFdXdXdKS1p0a0l2RWN1cGRNNWkzeTk1ZWUrK1U4UnMreXNraHdjV1lBcXFpOWx0M20vVitsbFUwCkhHZHB3UEZDNDBlcy9DZ2NabFVDQXdFQUFhT0JqRENCaVRBUEJnTlZIUk1FQ0RBR0FRSC9BZ0VLTUFzR0ExVWQKRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVNDNNdDM4c09LQXplM2JPa3lubTRqcnZvTUlrd0VRWUpZSVpJQVliNApRZ0VCQkFRREFnRUdNRGNHQTFVZEh3UXdNQzR3TEtBcW9DaUdKbWgwZEhBNkx5OTNkM2N1WTJWeWRIQnNkWE11ClkyOXRMME5TVEM5amJHRnpjekl1WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ25WTStJUkJuTDM5Ui8KQU45V00ySzE5MUVCa092RFA5R0lST2trWGUvbkZMMGd0NW84QVA1dG45dVEzTmYwWXRhTGNGM241UVJJcVdoOAp5ZkZDODJ4L3hYcDhIVkdJdXRJS1BpZGQzaTFSVHRNVFpHbmtMdVBUNTVzSm1hYmdsWnZPR3RkL3Zqek9Vck1SCkZjRVBGODBEdTV3bEZicWlkb244QnZFWTBKTkxEbnlDdDZYMDlsLys3VUNtbllSME9ibmNIb1VXMmlrYmhpTUEKeWJ1SmZtNkFpQjR2RkxRREpLZ3lid09hUnl3d3ZsYkdwMElDY0J2cVFOaTZCUU53QjZTVy8vMUlNd3JoM0tXQgprSnROM1gzbjU3TE5YTWhxbGZpbDlvM0VYWGdJdm5zRzFrblBHVFpRSXk0STVwNEZUVWNZMVJicHNkYTJFTlc3Cmw3K2lqclJVCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EU1QgUm9vdCBDQSBYMyBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLgojIFN1YmplY3Q6IENOPURTVCBSb290IENBIFgzIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uCiMgTGFiZWw6ICJEU1QgUm9vdCBDQSBYMyIKIyBTZXJpYWw6IDkxMjk5NzM1NTc1MzM5OTUzMzM1OTE5MjY2OTY1ODAzNzc4MTU1CiMgTUQ1IEZpbmdlcnByaW50OiA0MTowMzo1MjpkYzowZjpmNzo1MDoxYjoxNjpmMDowMjo4ZTpiYTo2Zjo0NTpjNQojIFNIQTEgRmluZ2VycHJpbnQ6IGRhOmM5OjAyOjRmOjU0OmQ4OmY2OmRmOjk0OjkzOjVmOmIxOjczOjI2OjM4OmNhOjZhOmQ3OjdjOjEzCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNjo4NzoyNjowMzozMTphNzoyNDowMzpkOTowOTpmMTowNTplNjo5YjpjZjowZDozMjplMTpiZDoyNDo5MzpmZjpjNjpkOToyMDo2ZDoxMTpiYzpkNjo3NzowNzozOQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFNqQ0NBaktnQXdJQkFnSVFSSyt3Z05hako3cUpNRG1HTHZoQWF6QU5CZ2txaGtpRzl3MEJBUVVGQURBLwpNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRDQkRieTR4RnpBVkJnTlZCQU1UCkRrUlRWQ0JTYjI5MElFTkJJRmd6TUI0WERUQXdNRGt6TURJeE1USXhPVm9YRFRJeE1Ea3pNREUwTURFeE5Wb3cKUHpFa01DSUdBMVVFQ2hNYlJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1FnUTI4dU1SY3dGUVlEVlFRRApFdzVFVTFRZ1VtOXZkQ0JEUVNCWU16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFOK3Y2WmRRQ0lOWHRNeGlaZmFRZ3V6SDB5eHJNTXBiN05uRGZjZEF3UmdVaStEb00zWkpLdU0vSVVtVHJFNE8Kcno1SXkyWHUvTk1oRDJYU0t0a3lqNHpsOTNld0VudTFsY0NKbzZtNjdYTXVlZ3dHTW9PaWZvb1VNTTBSb09FcQpPTGw1Q2pIOVVMMkFaZCszVVdPRHlPS0lZZXBMWVlIc1VtdTVvdUpMR2lpZlNLT2VETm9Kamo0WExoN2RJTjliCnhpcUtxeTY5Y0szRkN4b2xrSFJ5eFh0cXF6VFdNSW4vNVdnVGUxUUx5TmF1N0ZxY2toNDlaTE9NeHQrL3lVRncKN0JaeTFTYnNPRlU1UTlEOC9SaGNRUEdYNjlXYW00MGR1dG9sdWNiWTM4RVZBanFyMm03eFBpNzFYQWljUE5hRAphZVFRbXhrcXRpbFg0K1U5bTUvd0FsMENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTVNuc2FSN0xISDYyK0ZMa0hYL3hCVmdoWWtRTUEwR0NTcUcKU0liM0RRRUJCUVVBQTRJQkFRQ2pHaXliRndCY3FSN3VLR1kzT3IrRHh6OUx3d21nbFNCZDQ5bFpSTkkrRFQ2OQppa3VnZEIvT0VJS2NkQm9kZnBnYTNjc1RTN01nUk9TUjZjejhmYVhiYXVYKzV2M2dUdDIzQURxMWNFbXY4dVhyCkF2SFJBb3NaeTVRNlhrakVHQjVZR1Y4ZUFscndEUEd4cmFuY1dZYUxidW1SOVliSytybG1NNnBaVzg3aXB4WnoKUjhzcnpKbXdOMGpQNDFaTDljOFBESEl5aDhid1JMdFRjbTFEOVNaSW1sSm50MWlyL21kMmNYamJEYUpXRkJNNQpKREdGb3FnQ1dqQkg0ZDFRQjd3Q0NaQUE2MlJqWUpzV3ZJakpFdWJTZlpHTCtUMHlqV1cwNlh5eFYzYnF4YllvCk9iOFZaUnpJOW5lV2FncU5kd3ZZa1FzRWpnZmJLYllLN3AyQ05UVVEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN3aXNzU2lnbiBHb2xkIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBTdWJqZWN0OiBDTj1Td2lzc1NpZ24gR29sZCBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgTGFiZWw6ICJTd2lzc1NpZ24gR29sZCBDQSAtIEcyIgojIFNlcmlhbDogMTM0OTI4MTU1NjE4MDY5OTEyODAKIyBNRDUgRmluZ2VycHJpbnQ6IDI0Ojc3OmQ5OmE4OjkxOmQxOjNiOmZhOjg4OjJkOmMyOmZmOmY4OmNkOjMzOjkzCiMgU0hBMSBGaW5nZXJwcmludDogZDg6YzU6Mzg6OGE6Yjc6MzA6MWI6MWI6NmU6ZDQ6N2E6ZTY6NDU6MjU6M2E6NmY6OWY6MWE6Mjc6NjEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDYyOmRkOjBiOmU5OmI5OmY1OjBhOjE2OjNlOmEwOmY4OmU3OjVjOjA1OjNiOjFlOmNhOjU3OmVhOjU1OmM4OjY4OjhmOjY0OjdjOjY4OjgxOmYyOmM4OjM1OjdiOjk1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdWpDQ0E2S2dBd0lCQWdJSkFMdEFIRVAxWGsrd01BMEdDU3FHU0liM0RRRUJCUVVBTUVVeEN6QUpCZ05WCkJBWVRBa05JTVJVd0V3WURWUVFLRXd4VGQybHpjMU5wWjI0Z1FVY3hIekFkQmdOVkJBTVRGbE4zYVhOelUybG4KYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOTURZeE1ESTFNRGd6TURNMVdoY05Nell4TURJMU1EZ3pNRE0xV2pCRgpNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHBjM05UYVdkdUlFRkhNUjh3SFFZRFZRUURFeFpUCmQybHpjMU5wWjI0Z1IyOXNaQ0JEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUMKQ2dLQ0FnRUFyK1R1Zm9za0RoSnVxVkF0RmtRN2twSmN5cmhkaEpKQ0V5cThaVmVDUUQ1WEpNMVFpeVVxdDIvOAo3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrCmJicUJISDVDakNBMTJVTk5oUHFFMjFJczh3NG5kd3RydnhFdmNuaWZMdGcrNWhnM1dpcHkrZHBpa0pLVnloK2MKNmJNOEs4dnpBUk8vV3MvQnRRcGd2ZDIxbVdSVHVLQ1dzMi9pSm5lUmpPQmlFQUtmTkErazFaSXpVZDYramJxRQplbUE4YXR1ZksremUzZ0UvYmszbFVJYkx0Sy90UkVERnlscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkCk1tcVhsMk1UMjhuYmVUWjdoVHBLeFZLSitTVG5uWGVwZ3Y5VkhLVnhhU3ZSQWlUeXN5YlVhOW9FVmVYQkNzZHQKTURlUUt1U2VGRE5lRmhkVnhWdTF5elNKa3ZHZEpvK2hCOVRHc25oUTJ3d01DM3dMakVIWHVlbmRqSWozbzAyeQpNc3pZRjlyTnQ4NW1uZFQ5WHYrOWx6NHBkZWQrcDJKWXJ5VTBwVUhIUGJ3TlVNb0RBdzhJV2grVmMzaGl2Njl5CkZHa09wZVVERG5pT0ppaEM4QWNMWWlBUVp6bEcrcWtEekFRNGVtYnZJSU8xakVwV2pwRUEvSTVjZ3Q2SW9NUGkKYUc1OWplODgzV1gwWGF4Ujd5U0FycXBXbDIvNXJYM2FZVCtZZHp5bGtiWWNqQ2JhWmFJSmJjSGlWT081eWt4TQpnSTkzZTJDYUh0KzI4a2dlRHJwT1ZHMlk0T0dpR3FKM1VNL0VZNUxzUnhtZDYrWnJ6c0VDQXdFQUFhT0JyRENCCnFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVd5VjcKbHFSbFVYNjRPZlBBZUdaZTZEcm44TzR3SHdZRFZSMGpCQmd3Rm9BVVd5VjdscVJsVVg2NE9mUEFlR1plNkRybgo4TzR3UmdZRFZSMGdCRDh3UFRBN0JnbGdoWFFCV1FFQ0FRRXdMakFzQmdnckJnRUZCUWNDQVJZZ2FIUjBjRG92CkwzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFDZTYKNDVSODhhN0EzaGZtNWRqVjlWU3dnL1M3elY0RmUwK2ZkV2F2UE9oV2Z2eHllRGdEMlN0aUd3QzUrT2xnemN6TwpVWXJIVURGdTRVcCtHQzlwV2JZOVpJRXI0NE9FNWlLSGpuM2c3Z0taWWJnZTlMZ3JpQklXaE1JeGt6aVdNYWE1Ck8xTS93eVNUVmx0cGt1ekZ3YnM0QU9Qc0Y2bTQzTWQ4QVlPZk1rZTZVaUkwSFRKNkNWYW5mQ1UycVQxTDJzQ0MKYndxN0VzaUhTeWNSK1I0dHg1TS9udHRmSm10UzJTNks4UlRHUkkwVnFiZS92ZDZtR3U2dUxmdElkeGYrdSt5dgpHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHBtby9hCjc3S3dQSitIYkJJclpYQVZVakVhSk05dk1TTlFINHhQanlQRGRFRmpIRldvRk4wKzRGRlF6L0ViTUZZT2tyQ0MKaGRpRHl5Smt2QzI0SmRWVW9yZ0c2cTJTcENTZ3dZYTFTaE5xUjg4dUMxYVZWTXZPbXR0cXRLYXkyMEVJaGlkMwo5MnFnUW13TE9NN1hkVkF5a3NMZkt6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwCkxkNmxlTmNHMm1xZVN6NTNPaUFUSWdIUXYyaWVZMkJyTlUwTGJicWhQY0NUNEg4anMxV3RjaVZPUnZuU0Z1K3cKWk1FQm51bktvR3FZRHMvWVlQSXZTYmprUXVFNE5SYjB5RzVQOTRGVzZMcWp2aU92cnYxdkErQUNPekIyK2h0dApRYzhCc2VtNHlXYjAyeWJ6T3FSMDhra2tXOG13MEZmQitqNTY0WmZKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Td2lzc1NpZ24gU2lsdmVyIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBTdWJqZWN0OiBDTj1Td2lzc1NpZ24gU2lsdmVyIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBMYWJlbDogIlN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiIKIyBTZXJpYWw6IDU3MDAzODMwNTMxMTc1OTk1NjMKIyBNRDUgRmluZ2VycHJpbnQ6IGUwOjA2OmExOmM5OjdkOmNmOmM5OmZjOjBkOmMwOjU2Ojc1Ojk2OmQ4OjYyOjEzCiMgU0hBMSBGaW5nZXJwcmludDogOWI6YWE6ZTU6OWY6NTY6ZWU6MjE6Y2I6NDM6NWE6YmU6MjU6OTM6ZGY6YTc6ZjA6NDA6ZDE6MWQ6Y2IKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJlOjZjOjRkOmEyOmJiOmI5OmJhOjU5OmI2OmYzOjkzOjk3OjY4OjM3OjQyOjQ2OmMzOmMwOjA1Ojk5OjNmOmE5OjhmOjAyOjBkOjFkOmVkOmJlOmQ0OjhhOjgxOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdlRDQ0E2V2dBd0lCQWdJSVR4dlVMMVM3TDBzd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFCkJoTUNRMGd4RlRBVEJnTlZCQW9UREZOM2FYTnpVMmxuYmlCQlJ6RWhNQjhHQTFVRUF4TVlVM2RwYzNOVGFXZHUKSUZOcGJIWmxjaUJEUVNBdElFY3lNQjRYRFRBMk1UQXlOVEE0TXpJME5sb1hEVE0yTVRBeU5UQTRNekkwTmxvdwpSekVMTUFrR0ExVUVCaE1DUTBneEZUQVRCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZClUzZHBjM05UYVdkdUlGTnBiSFpsY2lCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBeFBHSGY5TjRNZmM0eWZqRG1VTzh4L2U4TitkT2NicExqNlZ6SFZ4dW1LNERWNjQ0TjBNdgpGejBmeU01b0VNRjRyaGtES3hENkxIbUQ5dWk1YUxsVjhnUkVwem41L0FTTEh2R2lUU2Y1WVh1NnQrV2lFN2JyCllUN1FiTkhtKy9wZTdSMjBucUExVzZHU3kvQkprdjZGQ2dVKzV0a0w0ays3M0pVMy9KSHBNalVpMFI4NlRpZUYKbmJBVmxETGFZUTFIVFdCQ3JwSkg2SU5hVUZqcGlvdTVYYUhjM1psS0h6Wm51MGprZzdZMzYwZzZydzluanhjSAo2QVRLNzJveGg5VEF0dm1VY1h0blpMaTJrVXBDZTJVdU1Hb005WkR1bGVieXpZTHMyYUZLN1BheVMrVkZoZVp0CmVKTUVMcHlDYlRhcHhERmtINGFEQ3lyME5RcDR5VlhQUWJCSDZUQ2ZtYjVocUFhRXVTaDZYempaRzZrNHNJTi8KYzhIRE8wZ3FnZzhobTdqTXFEWERoQnVEc3o2K3BKVnBBVHFKQUhnRTJjbjBtUm1yVm41Ymk0WTVGWkdrRUN3SgpNb0JnczVQQUtyWVlDNTEralVueUVFcC8rZFZHTHhtU281bW5KcXk3akR6bURyeEhCOXh6VWZGd1pDOEkrYlJICkhUQnNST29wTjRXU2FHYThnemorZXprdTAxRHdIL3RlWUxhcHB2b25RZkdiR0hMeTlZUjBTc2xueEZTdVNHVGYKak5GdXNCM2hCNDhJSHBtY2NlbE0yS1gzUnhJZmRORlJub2J6d3FJalFBdHoyMHVtNTNNR2pNR2c2Y0ZackViNgo1aS80ejNHY1JtMjV4QldOT0hrRFJVanZ4RjNYQ082SE9TS0dzZzBQV0VQM2NhbElMdjNxMWg4Q0F3RUFBYU9CCnJEQ0JxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVUKRjZETndlUkJ0anBiTzh0Rm5iMGN3cGo2aGxnd0h3WURWUjBqQkJnd0ZvQVVGNkROd2VSQnRqcGJPOHRGbmIwYwp3cGo2aGxnd1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRURBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwCmNEb3ZMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUIKQUhQR2dlQW4waTBQNEpVdzRwcEJmMUFzWDE5aVlhbUdhbWtZREhSSjFsMkU2a0ZTR0c5WXJWQldJR3JHdlNocApXSkhja1JFMXFUb2R2QnFsWUo3WUgzOUZrV25aZnJ0NGNzRUdEeXJPajRWd1lheWd6UXU0T1NsV2hESk9ocnM5CnhDcloxeDl5N3Y1Um9TSkJzWEVDWXhxQ3NHS3JYbGNTSDkvTDNYV2d3RjE1a0l3YjRGRG0zakgrbUh0d1g2V1EKMkszNEFyWnYwMkRkUUVzaXhUMnRPbnFmR2hwSGtYa3p1b0xjTW1rRGxtNGZTL0J4L3VObmNxQ3h2MXlMNVBxWgpJc2VFdVJ1Tkk1Yy83U1hnejJXNzlXRUU3OTBlc2xwQklscWhuMTBzNkZ2SmJha01ESGlxWU1aV2p3RmFER2k4CmFSbDV4QjkrbHdXL3hla2tVVjdVMVV0VDdka2pXallEWmFQQkE2MUJNUE5HRzRXUXIyVzExYkhrRmx0NGRSMlgKZW0xWnFTcVBlOTdEaDRrUW1VbHplTWc5dlZFMWRDclY4WDVwR3lxN083MGx1SnBhUFhKaGtHYUg3Z3pXVGRRUgpkQXRxL2dzRC9LTlZWNG4rU3N1dVd4Y0Z5UEtOSXpGVE9OSXRhaitDdVkwSWF2ZGVRWFJ1d3hGK0I2d3BZSkUvCk9NcFhFQTI5TUMvSHBlWkJvTnF1QlllYW9LUmxiRXdKREltNnVOTzV3Sk9LTVBxTjVacHJGUUZPWjZyYVlsWSsKaEFobTBzUTJmYWMrRVB5STROU0E1UUM5cXZOT0JxTjZhdmxpY3VNSlQrdWJEZ0VqOForN2ZOemNiQkdYSmJMeQp0R01VMGdZcVo0eUQ5YzdxQjlpYWFoN3M1QXE3S2t6ckNXQTV6c3BpMkM1dQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDMyNzk4MjI2NTUxMjU2OTYzMzI0MzEzODA2NDM2OTgxOTgyMzY5CiMgTUQ1IEZpbmdlcnByaW50OiAwMjoyNjpjMzowMTo1ZTowODozMDozNzo0MzphOTpkMDo3ZDpjZjozNzplNjpiZgojIFNIQTEgRmluZ2VycHJpbnQ6IDMyOjNjOjExOjhlOjFiOmY3OmI4OmI2OjUyOjU0OmUyOmUyOjEwOjBkOmQ2OjAyOjkwOjM3OmYwOjk2CiMgU0hBMjU2IEZpbmdlcnByaW50OiAzNzpkNToxMDowNjpjNToxMjplYTphYjo2Mjo2NDoyMTpmMTplYzo4Yzo5MjowMTozZjpjNTpmODoyYTplOTo4ZTplNTozMzplYjo0NjoxOTpiODpkZTpiNDpkMDo2YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZEQ0NBbVNnQXdJQkFnSVFHS3kxYXYxcHRoVTZZMnl2MnZyRW9UQU5CZ2txaGtpRzl3MEJBUVVGQURCWQpNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakV4TUM4R0ExVUVBeE1vClIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXgKTWpjd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNRmd4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRSwpFdzFIWlc5VWNuVnpkQ0JKYm1NdU1URXdMd1lEVlFRREV5aEhaVzlVY25WemRDQlFjbWx0WVhKNUlFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXZyZ1ZlLy9VZkgxbnJZTmtlOGhDVXkzZjlvUUlJR0hXQVZscW5FUVJyKzkyL1pWK3ptRXd1M3FEWHdLOQpBV2JLN2hXTmI2RXduTDJoaFo2VU92TldpQUF4ejlqdWFwWUMyZTBEalB0MWJlZnF1RlVXQlJhYTlPQmVzWWpBClpJVmNGVTJJeDdlNjRIWHByUVU5bmNlSlNPQzdLTWdENFRDVFpGNVN3Rmx3SWpWWGlJcnhsUXFEMTd3eGN3RTAKN2U5R2NlQnJBcWcxY211WG0yYmd5eHg1WDlnYUJHZ2VSd0xtbldEaU5wY0IzODQxa3QrK1o4ZHRkMWs3ajUzVwprQldVdkVJMEVNRTUrYkVuUG43V2luWEZzcStXMDZMZW0rU1l2bjNoNllHdHRtLzgxdzdhNERTd0RScDM1K01JCm1POVkrcHlFdHphdnd0K3MwdlFRQm5CeE5RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEcKQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVMTlZRUVpjVmkvQ1BObUZiU3Z0cjJabkpNNUl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGcHdmeXpkdHpSUDlZWlJxU2ErUzdpcThYRU4zR0hIb09vMEhucDNEd1ExCjZDZVBiSkMva1JZa1JqNUtUczRyRnRVTFVoMzhIMmVpQWtVeFQ4N3orZ09uZVoxVGF0bmFZenI0Z05mVG1lR2wKNGI3VVZYR1lOVHEraytxdXJVS3lrRy9nL0NGTk5XTXppVW5XbTA3S3grZE9DUUQzMnNmdm1XS1pkN2FWSWw2SwpvS3YwdUhpWXlqZ1ptY2x5bm5qTlM2eXZHYUJ6RWkzOHdrRzZnWkhhRmxveHQvbTBjWUFTU0pseWMxcFpVOEZqClVqUHRwOG5TT1FKdyt1Q3hRbVlwcXB0UjdUQlVJaFJmMmFzZHdlU1U4UGoxSy9mcXluaEcxcmlSL2FZTkt4b1UKQVQ2QThFS2dsUWRlYmMzTVM2UkZqYXNTNkxQZVd1V2dmT2dQSWgxYTZWaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwNiB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwNiB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSIKIyBTZXJpYWw6IDY5NTI5MTgxOTkyMDM5MjAzNTY2Mjk4OTUzNzg3NzEyOTQwOTA5CiMgTUQ1IEZpbmdlcnByaW50OiA4YzpjYTpkYzowYjoyMjpjZTpmNTpiZTo3MjphYzo0MToxYToxMTphODpkODoxMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkxOmM2OmQ2OmVlOjNlOjhhOmM4OjYzOjg0OmU1OjQ4OmMyOjk5OjI5OjVjOjc1OjZjOjgxOjdiOjgxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZDo3MjoyZjo4MTphOTpjMToxMzpjMDo3OToxZDpmMTozNjphMjo5Njo2ZDpiMjo2Yzo5NTowYTo5NzoxZDpiNDo2Yjo0MTo5OTpmNDplYTo1NDpiNzo4YjpmYjo5ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUlEQ0NBd2lnQXdJQkFnSVFORTdWVnlEVjdleEo5Qy9PTjlzcmJUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpxVEVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mClEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXcKTURZZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hIekFkQmdOVgpCQU1URm5Sb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URTNNREF3TURBd1doY05Nell3Ck56RTJNak0xT1RVNVdqQ0JxVEVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWoKTGpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZRwpBMVVFQ3hNdktHTXBJREl3TURZZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4SHpBZEJnTlZCQU1URm5Sb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3NvUEQ3Z0ZuVW5NZWt6NTJoV1hNSkVFVU1EU3h1YVBGcwpXMGhvU1ZrMy9Bc3pHY0ozZjh3UUxaVTBIT2JyVFFtbkhOSzR5WmMyQXJlSjFDUmZCc0RNUkpTVWpRSmliK3RhCjNSR05LSnBjaEpBUWVnMjlkR1l2YWppZzR0VlVST3NkQjU4SHVtL3U2ZjFPQ3luMVBvU2dBZkdjcS9nY2ZvbWsKNktIWWNXVU5vMUY3N3J6U0ltQU51VnVkMzdyOFVWc0xyNWl5NlM3cEJPaGloOTRyeU5kT3dVeGtIdDNQaDFpNgpTay9LYUFjZEhKMUt4dFV2a2N4OGNYSWN4Y0JuNnpMOXlaSmNsTnFGd0p1L1UzMHJDZlNNblpFZmwycFN5OTRKCk5xUjMySHVIVUVUVlBtNHBhZnM1U1NZZUNhV0FlMEF0NitnbmhjbitZZjErNW55WEhkV2RBZ01CQUFHalFqQkEKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlI3VzBYUApyODdMZXYweGtocHF0dk5HNjFkSVVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFlUkhBUzdPUnR2enc2V2ZVCkRXNUZ2bFhvazlMT0F6L3QyaVd3SFZmTEhqcDJvRXpzVUhib1pISU1wS254dUl2VzFvZUV1ekxsUVJIQWQ5bXoKWUozckc5WFJia1JFcWFZQjdGVmlIWGU0WEk1SVNYeWNPMWNScksxek40NHZlRnlRYUVmWllHRG0vQWM5SWlBWAp4UGNXNmNUWWN2bkljM3pmRmk4VnFUNzlhaWUyb2V0YXVwZ2YxZU5OWkFxZEU4aGh1dlU1SEllNnVMMTdJbi8yCi9xeEFlZVdzRUc4OWp4dDVkb3ZFTjdNaEdJVGxOZ0RyWXlDWnVlbitNd1M3UWNqQkF2bEVZeUNlZ2M1QzA5WS8KTEhiVFk1eFozWSttNFE2Z0xrSDNMcFZIejd6OU0vUDJDMkYrZnBFcmdVZkNKekR1cHhCZE40OWNPU3ZrQlBCNwpqVmFNYUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUiCiMgU2VyaWFsOiAzMzAzNzY0NDE2NzU2ODA1ODk3MDE2NDcxOTQ3NTY3NjEwMTQ1MAojIE1ENSBGaW5nZXJwcmludDogY2I6MTc6ZTQ6MzE6Njc6M2U6ZTI6MDk6ZmU6NDU6NTc6OTM6ZjM6MGE6ZmE6MWMKIyBTSEExIEZpbmdlcnByaW50OiA0ZTpiNjpkNTo3ODo0OTo5YjoxYzpjZjo1Zjo1ODoxZTphZDo1NjpiZTozZDo5Yjo2Nzo0NDphNTplNQojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6Y2Y6YWI6N2U6NDM6Yzg6ZDg6ODA6ZDA6NmI6MjY6MmE6OTQ6ZGU6ZWU6ZTQ6YjQ6NjU6OTk6ODk6YzM6ZDA6Y2E6ZjE6OWI6YWY6NjQ6MDU6ZTQ6MWE6Yjc6ZGYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUUwekNDQTd1Z0F3SUJBZ0lRR05yUm5pWjk2THRLSVZqTnpHczdTakFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKeWpFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTApFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd05pQldaWEpwClUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFcKWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMAphRzl5YVhSNUlDMGdSelV3SGhjTk1EWXhNVEE0TURBd01EQXdXaGNOTXpZd056RTJNak0xT1RVNVdqQ0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WlcKWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd05pQldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwClUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNUlDMGdSelV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZKQWdJS1hvMQpubUFNcXVkTE8wN2NmTHc4UlJ5N0srRCtLUUw1VndpalpJVVZKL1h4cmNneGlWMGk2Q3FxcGtLemovaTVWYmV4CnQwdXovbzkrQjFmczcwUGJabUlWWWM5Z0RhVFkzdmpndzJJSVBWUVQ2MG5LV1ZTRkp1VXJqeHVmNi9XaGtjSXoKU2RoRFkycFNTOUtQNkhCUlRkR0phWHZIY1BhejNCSjAyM3RkUzFiVGxyOFZkNkd3OUtJbDhxOGNrbWNZNWZRRwpCTytRdWVRQTVOMDZ0Um4vQXJyMFBPN2dpK3MzaSt6MDE2enk5dkE5cjkxMWtUTVpIUnhBeTNRa0dTR1QyUlQrCnJDcFN4NC9WQkVua2pXTkhpRHhwZzh2K1I3MHJmay9GbGE0T25kVFJROEJuYytNVUNIN2xQNTl6dURNS3oxMC8KTkllV2l1NVQ2Q1VWQWdNQkFBR2pnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RQpCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSmFXMWhaMlV2WjJsbU1DRXdIekFICkJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqYUhSMGNEb3ZMMnh2WjI4dWRtVnkKYVhOcFoyNHVZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZIL1RaYWZDM2V5NzhEQUo4ME01K2dLdgpNekV6TUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDVEpFb3dYMkxQMkJxWUx6M3EzSmt0dlhmMnBYa2lPT3pFCnA2QjRFcTFpRGtWd1pNWG5sMll0bUFsK1g2L1d6Q2hsOGdHcUNCcEgzdm41ZkpKYUNHa2dEZGsrYlc0OERXN1kKNWdhUlFCaTUrTUh0Mzl0QnF1Q1dJTW5OWkJVNGdjbVU3cUtFS1FzVGI0N2JETjBsQXR1a2l4bEUwa0Y2QldsSwpXRTlneW42Q2Fnc0NxaVVYT2JYYmYrZUVaU3FWaXIyRzNsNkJGb010RU16ZS9haUNLbTBvSHcwTHhPWG5HaVlaCjRmUVJieEMxbGZ6blFnVXkyODZkVVY0b3RwNkYwMXZ2cFgxRlFIS090dzVyRGdiN016VkljYmlkSjR2RVpWOE4KaG5hY1JIcjJsVnoyWFRJSU02UlV0aGcvYUZ6eVFrcUZPRlNEWDlIb0xQS3NFZGFvN1dOcQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlVHJ1c3QgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNlY3VyZVRydXN0IENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNlY3VyZVRydXN0IENBIgojIFNlcmlhbDogMTcxOTk3NzQ1ODkxMjUyNzc3ODgzNjI3NTcwMTQyNjY4NjIwMzIKIyBNRDUgRmluZ2VycHJpbnQ6IGRjOjMyOmMzOmE3OjZkOjI1OjU3OmM3OjY4OjA5OjlkOmVhOjJkOmE5OmEyOmQxCiMgU0hBMSBGaW5nZXJwcmludDogODc6ODI6YzY6YzM6MDQ6MzU6M2I6Y2Y6ZDI6OTY6OTI6ZDI6NTk6M2U6N2Q6NDQ6ZDk6MzQ6ZmY6MTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGYxOmMxOmI1OjBhOmU1OmEyOjBkOmQ4OjAzOjBlOmM5OmY2OmJjOjI0OjgyOjNkOmQzOjY3OmI1OjI1OjU3OjU5OmI0OmU3OjFiOjYxOmZjOmU5OmY3OjM3OjVkOjczCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdURDQ0FxQ2dBd0lCQWdJUURQQ09YQWdXcGExQ2YvRHJKeGhaMERBTkJna3Foa2lHOXcwQkFRVUZBREJJCk1Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHgKRnpBVkJnTlZCQU1URGxObFkzVnlaVlJ5ZFhOMElFTkJNQjRYRFRBMk1URXdOekU1TXpFeE9Gb1hEVEk1TVRJegpNVEU1TkRBMU5Wb3dTREVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WQkFvVEYxTmxZM1Z5WlZSeWRYTjBJRU52CmNuQnZjbUYwYVc5dU1SY3dGUVlEVlFRREV3NVRaV04xY21WVWNuVnpkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUt1a2dlV1Z6ZlgyRkk3Q1Q4clU0bmlWV0p4QjRRMlpRQ1FYT1pFegpadW0rNFlPdllseUowZndrVzJHejRCRVJRUndkYnZDNHUvamVwNEc2cGtqR254Mjl2bzZwUVQ2NGxPMHBHdFNPCjBnTWRBKzl0RFdjY1Y5Y0dyY3JJOWY0T3IyWWxTQVNXQzEyanVoYkRDRS9SUnZnVVhQTElYZ0daYmYySXpJYW8Kd1c4eFFteFNQbWpMOHhrMDM3dUhHRmFBSnNUUTNNQnYzOTZnd3BFV29HUVJTMFM4SHZibittUGVacXgycEhHago3RGFVYUhwM3BMSG5EaStCZXVLMWNvYnZvbXVMOEEvYjAxay91bks4UkNTYzQzT3o5NjlYTDBJbW5hbDB1Z0JTCjhrdk5VM3hIQ3phRkRtYXBDSmNXTkZmQlp2ZUE0KzF3Vk1lVDRDNG9GVm1IdXJzQ0F3RUFBYU9CblRDQm1qQVQKQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVUWpLMkZ2b0UvZjVkUzNyRC9mZE1RQjFhUTY4d05BWURWUjBmQkMwd0t6QXBvQ2VnCkpZWWphSFIwY0RvdkwyTnliQzV6WldOMWNtVjBjblZ6ZEM1amIyMHZVMVJEUVM1amNtd3dFQVlKS3dZQkJBR0MKTnhVQkJBTUNBUUF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0Mwo2WjNxMDU5YzRFVmxldzNLVytKd1VMS1VCUlN1U2NlTlFRY1NjNVIrRENNaC9id1FmMkFRV25MMW1BNnM3TGwvCjNYcHZYZE1jOVArSUJXbENxUVZ4eUxlc0p1Z3V0SXhxLzNIY3VMSGZtYng4SVZRcjVGaWl1MWNwcnA2cG94a20KRDVrdUNMRHYvV25QbVJvSmplT25ueXZKTmpSN0pMTjRUSlVYcEFZbUhyWmtValpmWUdmWm5NVUZkQXZuWnlQUwpDUHlJNmE2TGYrRXc5RGQrL2NZeTJpMmVSREF3Yk80SDN0STAvTkwvUVBaTDlHWkdCbFNtOGpJS1l5WXdhNXZSCjNJdEh1dUc1MVdMUW9xRDBad1Y0S1dNYWJ3VFcrTVpNbzVxeE43U041U2hMSFo0c3dyaG92TzBDN2pFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlIEdsb2JhbCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U2VjdXJlIEdsb2JhbCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTZWN1cmUgR2xvYmFsIENBIgojIFNlcmlhbDogOTc1MTgzNjE2NzczMTA1MTU1NDIzMjExOTQ4MTQ1Njk3ODU5NwojIE1ENSBGaW5nZXJwcmludDogY2Y6ZjQ6Mjc6MGQ6ZDQ6ZWQ6ZGM6NjU6MTY6NDk6NmQ6M2Q6ZGE6YmY6NmU6ZGUKIyBTSEExIEZpbmdlcnByaW50OiAzYTo0NDo3Mzo1YTplNTo4MTo5MDoxZjoyNDo4Njo2MTo0NjoxZTozYjo5YzpjNDo1ZjpmNTozYToxYgojIFNIQTI1NiBGaW5nZXJwcmludDogNDI6MDA6ZjU6MDQ6M2E6Yzg6NTk6MGU6YmI6NTI6N2Q6MjA6OWU6ZDE6NTA6MzA6Mjk6ZmI6Y2I6ZDQ6MWM6YTE6YjU6MDY6ZWM6Mjc6ZjE6NWE6ZGU6N2Q6YWM6NjkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2RENDQXFTZ0F3SUJBZ0lRQjFZaXBPalVpb2xOOUJQSThQanFwVEFOQmdrcWhraUc5dzBCQVFVRkFEQksKTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eApHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3Z1EwRXdIaGNOTURZeE1UQTNNVGswTWpJNFdoY05Namt4Ck1qTXhNVGsxTWpBMldqQktNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWcKUTI5eWNHOXlZWFJwYjI0eEdUQVhCZ05WQkFNVEVGTmxZM1Z5WlNCSGJHOWlZV3dnUTBFd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdk5TN1lyR3hWYVFaeDVSTm9KTE5QMk13aFIvanhZRGlKCmlRUHB2ZXBlUmxNSjNGejFXdWozUlNvQzZ6RmgxeWt6VE03SGZBbzNmZys2TXBqaEhaZXZqOGZjeVRpVzg5c2EKL0ZIdGFNYlFicVI4Sk5HdVFzaVdVR011NFA1MS9waW5YMGt1bGVNNU0yU09IcVJma05KblBMTFova0c1VmFjSgpqbklGSG92ZFJJV0NRdEJKd0IxZzhORVhMSlhyOXFYQmtxUEZ3cWNJWUExZ0JCQ1dlWjRXTk9hcHR2b2xSVG5JCkhtWDVrL1dxOFZMY21aZzlwWVlhRERVeitrdWxCQVlWSERHQTc2b1lhOEo3MTlyTytUTWcxZlc5YWpNdGdRVDcKc0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkwWFBuajNwREFnTUJBQUdqZ1owdwpnWm93RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SFFZRFZSME9CQllFRks5RUJNSkJma2lEMjA0NUF1enNoSHJtenNta01EUUdBMVVkSHdRdE1Dc3cKS2FBbm9DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzRwpBUVFCZ2pjVkFRUURBZ0VBTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCakdnaEFmYVJlVXcxMzJIcXVIdzBMClVSWUQ3eGg4eU9PdmFsaVRGR0NSc29UY2lFNitPWW82OCthQ2lWMEJON09ySktRVkRwSTFXa3BFWGs1WCtuWE8KSDBqT1p2UThRQ2FTbUd3YjdpUkdEQmV6VXFYYnBaR1J6emZUYitjbkNEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbQpJNTBtRDFocC9FZCtzdENOaTVPL0tVOURhWFIyWjB2UEI0em1BdmUxNGJSRHRVc3RGSi81M0NZTnY2WkhkQWJZCmlORTZLVENFenRJNWdHSWJxTWRYU2J4cVZWRm5GVXErTlFmazFYV1lOM2t3Rk5zcG5XekZhY3hIVmFJdzk4eGMKZjhMRG1CeHJUaGFBNjNwNFpVV2lBQnF2REExVlpEUkl1Sks1OGJSUUtmSlBJeC9hYkt3ZlJPSGRJM2hSVzhjVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTA0MzUwNTEzNjQ4MjQ5MjMyOTQxOTk4NTA4OTg1ODM0NDY0NTczCiMgTUQ1IEZpbmdlcnByaW50OiA1Yzo0ODpkYzpmNzo0Mjo3MjplYzo1Njo5NDo2ZDoxYzpjYzo3MTozNTo4MDo3NQojIFNIQTEgRmluZ2VycHJpbnQ6IDY2OjMxOmJmOjllOmY3OjRmOjllOmI2OmM5OmQ1OmE2OjBjOmJhOjZhOmJlOmQxOmY3OmJkOmVmOjdiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwYzoyYzpkNjozZDpmNzo4MDo2ZjphMzo5OTplZDplODowOToxMTo2Yjo1Nzo1YjpmODo3OTo4OTpmMDo2NToxODpmOTo4MDo4Yzo4NjowNTowMzoxNzo4YjphZjo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUhUQ0NBd1dnQXdJQkFnSVFUb0V0aW9KbDRBc0M3ajQxQWtibFBUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpnVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHCkExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4SnpBbEJnTlYKQkFNVEhrTlBUVTlFVHlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXlNREV3TURBdwpNREJhRncweU9URXlNekV5TXpVNU5UbGFNSUdCTVFzd0NRWURWUVFHRXdKSFFqRWJNQmtHQTFVRUNCTVNSM0psCllYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRFQwMVAKUkU4Z1EwRWdUR2x0YVhSbFpERW5NQ1VHQTFVRUF4TWVRMDlOVDBSUElFTmxjblJwWm1sallYUnBiMjRnUVhWMAphRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMEVDTGkzTGprUnYzClVjRWJWQVNZMDZtL3dlYUtYVHVIKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkKMkdxR2QwUzdXV2FYVUY2MDFDeHdSTS9hTjVWQ2FUd3d4SEd6VXZBaFRhSFl1amw4SEo2akpKM3lneGFZcWhaOApRNXNWVzdldU5KSCsxR0ltR0VhYVArdkIrZkdRVit1c2VnMkwyM0l3YW1iVjRFYWpjTnhvMmY4RVNJbDMzclhwCisyZHRRZW04T2IweTJXSUM4YkdvUFc0M25PSXY0dE9pSm92R3VGVkRpT0VqUHFYU0pEbHFSNnNBMUtHenFTWCsKRFQrbkhiclRVY0VMcE5xc09POVZVQ1FGWlVhVE5FOHRqYTNHMUNFWjBvN0tCV0Z4QjNOSDVZb1pFcjBFVGM1TwpuS1ZJckxzbTl3SURBUUFCbzRHT01JR0xNQjBHQTFVZERnUVdCQlFMV09XTHhrd1ZONlJBcVRDcEliNUhObHBXCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCSkJnTlZIUjhFUWpCQU1ENmcKUEtBNmhqaG9kSFJ3T2k4dlkzSnNMbU52Ylc5a2IyTmhMbU52YlM5RFQwMVBSRTlEWlhKMGFXWnBZMkYwYVc5dQpRWFYwYUc5eWFYUjVMbU55YkRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQVBwaWVtL1liNmRjNXQzaXVIWElZClNkT0g1RU9DNnovSnF2V290ZTlWZkNGU1pmblZEZUZzOUQ2TWszT1JMZ0xFVGdkeGI4Q1BPR0VJcUI2QkNzQXYKSUM5Qmk1SGNTRVc4OGNiZXVuWnJNOGdBTFRGR1RPM25uYytJbFA4endGYm9KSVltdU5nNE9OOHFhOTBTek1jLwpSeGRNb3NJR2xnblcyLzQvUEVaQjMxamlWZzg4TzhFY2t6WFpPRktzN3Nqc0xqQk9sRFcwSkI5TGVHbmE4Z0k0CnpKVlNrL0J3SlZtY0lHZkU3dm1MVjJIMGtuWjlQNFNOVmJmbzVhelY4ZlVaVnFaYSs1QWNyNVByNVJ6VVo1ZGQKQkE2K0M0T21GNE81TUJLZ3hUTVZCYmtOKzhjRmR1UFlTbzM4TkJlanhpRW92akJGTVI3SGVMNVlZVGlzTytJQgpaUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1OZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgTz1OZXR3b3JrIFNvbHV0aW9ucyBMLkwuQy4KIyBTdWJqZWN0OiBDTj1OZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgTz1OZXR3b3JrIFNvbHV0aW9ucyBMLkwuQy4KIyBMYWJlbDogIk5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSIKIyBTZXJpYWw6IDExNjY5NzkxNTE1MjkzNzQ5NzQ5MDQzNzU1NjM4NjgxMjQ4NzkwNAojIE1ENSBGaW5nZXJwcmludDogZDM6ZjM6YTY6MTY6YzA6ZmE6NmI6MWQ6NTk6YjE6MmQ6OTY6NGQ6MGU6MTE6MmUKIyBTSEExIEZpbmdlcnByaW50OiA3NDpmODphMzpjMzplZjplNzpiMzo5MDowNjo0Yjo4Mzo5MDozYzoyMTo2NDo2MDoyMDplNTpkZjpjZQojIFNIQTI1NiBGaW5nZXJwcmludDogMTU6ZjA6YmE6MDA6YTM6YWM6N2E6ZjM6YWM6ODg6NGM6MDc6MmI6MTA6MTE6YTA6Nzc6YmQ6Nzc6YzA6OTc6ZjQ6MDE6NjQ6YjI6Zjg6NTk6OGE6YmQ6ODM6ODY6MGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1akNDQXM2Z0F3SUJBZ0lRVjhzemI4SmNGdVpIRmhmamtERm80REFOQmdrcWhraUc5dzBCQVFVRkFEQmkKTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdQpNVEF3TGdZRFZRUURFeWRPWlhSM2IzSnJJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwCmRIa3dIaGNOTURZeE1qQXhNREF3TURBd1doY05Namt4TWpNeE1qTTFPVFU1V2pCaU1Rc3dDUVlEVlFRR0V3SlYKVXpFaE1COEdBMVVFQ2hNWVRtVjBkMjl5YXlCVGIyeDFkR2x2Ym5NZ1RDNU1Ma011TVRBd0xnWURWUVFERXlkTwpaWFIzYjNKcklGTnZiSFYwYVc5dWN5QkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURrdkg2U01HM0cySTRyQzd4R3p1QW5sdDdlK2ZvUzB6d3oKYzdNRUw3eHhqT1dmdGlKZ1BsOWR6Z24vZ2d3Ym1sRlFHaWFKM2RWaFhSbmNFZzh0Q3FKRFhSZlFOSklnNm5QUApPQ3dHSmdsNmN2ZjZVREw0d3BQVGFhSWp6a0d4ek9UVkh6YlJpanI0akdQaUZGbHA3UTNUZjJ2b3VBUGxUMnJsCm1HTnBTQVcrTHY4enR1bVhXV240WnhtdWsyR1dSQlhUY3JBL3ZHcDk3RWgvamNPcnFuRXJVMmxCVXpTMXNMbkYKQmdyRXNFWDFRVjF1aVVWN1BUc21qSFRDNWRMUmZiSVIxUHRZTWlLYWdNbmMvUXpwZjE0RGw4NDdBQlNISjNBNApxWTV1c3lkMm1GSGdCZU1ocXhyVmhTSThLYldhRnNXQXFQUzdhekNQTDBZQ29yRU1JdURUQWdNQkFBR2pnWmN3CmdaUXdIUVlEVlIwT0JCWUVGQ0V3eWZzQTEwNlkyb2VxS3RDbkxyRkFNYWRNTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUZJR0ExVWRId1JMTUVrd1I2QkZvRU9HUVdoMGRIQTZMeTlqY213dQpibVYwYzI5c2MzTnNMbU52YlM5T1pYUjNiM0pyVTI5c2RYUnBiMjV6UTJWeWRHbG1hV05oZEdWQmRYUm9iM0pwCmRIa3VZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDN3Jrdm50MWZyZjZvdHQzTkhoV3JCNUtVZDVPYzgKNmZSWlpYZTFlbHRhalNVMjRIcVhMampBVjJDRG1BYURuN2wyZW01UTRMcUlMUHhGekJpd21aVlJEdXdkdUlqLwpoMUFjZ3NMajRES0F2NkFMUjhqRE1lK1paektBVHhjaGVReHBYTjVlTks0Q3RTYnFVTjkvR0dVc3lmSmo0YWtICi9ueHhIMnN6SkdvZUJmY0ZhTUJxRXNzdVhtSExyaWpUZnNLMFpwRW1Yend1SkYvTFdBL3JLT3l2RVpiejNIdHYKd0tlSThsTjNzMkJlcnE0bzJqVXNielJGMHliaDN1eGJUeWRyRm55OVJBUVlnck9KZVJjUWNUMTZvaFpPOVFITgpwR3hsYUtGSmRseER5ZGk4Tm1kc3BaUzExTXk1dldvMVZpSGUyTVByKzh1a1lFeXdWYUNnZTFleQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogNDE1NzgyODM4NjcwODY2OTI2MzgyNTY5MjE1ODk3MDc5MzgwOTAKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOjYyOmZmOjc0OjlkOjMxOjUzOjVlOjY4OjRhOmQ1Ojc4OmFhOjFlOmJmOjIzCiMgU0hBMSBGaW5nZXJwcmludDogOWY6NzQ6NGU6OWY6MmI6NGQ6YmE6ZWM6MGY6MzE6MmM6NTA6YjY6NTY6M2I6OGU6MmQ6OTM6YzM6MTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE3OjkzOjkyOjdhOjA2OjE0OjU0Ojk3Ojg5OmFkOmNlOjJmOjhmOjM0OmY3OmYwOmI2OjZkOjBmOjNhOmUzOmEzOmI4OjRkOjIxOmVjOjE1OmRiOmJhOjRmOmFkOmM3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDaVRDQ0FnK2dBd0lCQWdJUUgwZXZxbUlBY0ZCVVRBR2VtMk9aS2pBS0JnZ3Foa2pPUFFRREF6Q0JoVEVMCk1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUUKQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVApJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd016QTJNREF3Ck1EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHkKWldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TgpUMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRRFIzc3ZkY21DRllYN2RlU1IKRnRTcllwbjFQbElMQnM1QkFIK1g0UW9rUEIwQkJPNDkwbzBKbHd6Z2RlVDYrM2VLS3ZVRFlFczJpeFlqRnEwSgpjZlJLOUNoUXRQNklIRzQvYkM4dkNWbGJwVnNMTTVuaXd6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXCkJCUjFjYWNaU0JtOG5aM3FRVWZmbE1SSWQ1blRlVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakVBN3dOYmVxeTNlQXB5dDRqZi83VkdGQWtLK3FEbQpmUWpHR29lOUdLaHp2U2JLWUF5ZHpwbWZ6MXdQTU9HK0ZESHFBakFVOUpNOFNhY3plcEJHUjdOamZST2JUcmR2CkdEZUFVLzdkSU9BMW1qYlJ4d0c1NXR6ZDgvOGRMRG9XVjltU09kWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EgTz1XSVNlS2V5IE9VPUNvcHlyaWdodCAoYykgMjAwNS9PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgU3ViamVjdDogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSBPPVdJU2VLZXkgT1U9Q29weXJpZ2h0IChjKSAyMDA1L09JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBMYWJlbDogIk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EiCiMgU2VyaWFsOiA4NjcxODg3Nzg3MTEzMzE1OTA5MDA4MDU1NTkxMTgyMzU0ODMxNAojIE1ENSBGaW5nZXJwcmludDogYmM6NmM6NTE6MzM6YTc6ZTk6ZDM6NjY6NjM6NTQ6MTU6NzI6MWI6MjE6OTI6OTMKIyBTSEExIEZpbmdlcnByaW50OiA1OToyMjphMTplMTo1YTplYToxNjozNToyMTpmODo5ODozOTo2YTo0Njo0NjpiMDo0NDoxYjowZjphOQojIFNIQTI1NiBGaW5nZXJwcmludDogNDE6Yzk6MjM6ODY6NmE6YjQ6Y2E6ZDY6Yjc6YWQ6NTc6ODA6ODE6NTg6MmU6MDI6MDc6OTc6YTY6Y2I6ZGY6NGY6ZmY6Nzg6Y2U6ODM6OTY6YjM6ODk6Mzc6ZDc6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ4VENDQXRtZ0F3SUJBZ0lRUVQxeXgvUnJINEZEZmZIU0tGVGZtakFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKaWpFTE1Ba0dBMVVFQmhNQ1EwZ3hFREFPQmdOVkJBb1RCMWRKVTJWTFpYa3hHekFaQmdOVkJBc1RFa052Y0hseQphV2RvZENBb1l5a2dNakF3TlRFaU1DQUdBMVVFQ3hNWlQwbFRWRVVnUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sClpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSGJHOWlZV3dnVW05dmRDQkhRU0JEUVRBZUZ3MHcKTlRFeU1URXhOakF6TkRSYUZ3MHpOekV5TVRFeE5qQTVOVEZhTUlHS01Rc3dDUVlEVlFRR0V3SkRTREVRTUE0RwpBMVVFQ2hNSFYwbFRaVXRsZVRFYk1Ca0dBMVVFQ3hNU1EyOXdlWEpwWjJoMElDaGpLU0F5TURBMU1TSXdJQVlEClZRUUxFeGxQU1ZOVVJTQkdiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlgKU1ZObFMyVjVJRWRzYjJKaGJDQlNiMjkwSUVkQklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QQpNSUlCQ2dLQ0FRRUF5MCt6QUpzOU50MzUwVWxxYXhCSkgrellLN0xHK0RLQktVT1ZUSm9aSXlFVlJkN2p5QnhSClZWdXVrK2czL3l0cjZkVHF2aXJkcUZFcjEyYkRZVnhnQXNqMXpuSjdPN2p5VG1VSW1zMmthaG5CQWJ0enB0ZjIKdzkzTnZLU0x0WmxodUFHaW85Uk4xQVU5a2EzNHRBaHhaSzl3OFJ4cmZ2YkRkNTBrYzN2a0RJemgyVGJobVlzRgptUXZ0UlRFSnlzSUEyL2R5b0phcWxZZlFqc2UyWVhNTmRtYU0zQnUwWTZLZmY1TVRNUEdoSjl2Wi95eFZpSkdnCjRFOEhzQ2hXakJnYmwwU09pZDNnRjI3bkt1K1BPUW94aElMWVFCUkpMbnBCNUtmKzQyVE13Vmx4U3l3aHAxdDkKNEIzUkxvR2J3OWhvOTcyV0c2eHdzUllVQzl0Z3VTWUJCUUlEQVFBQm8xRXdUekFMQmdOVkhROEVCQU1DQVlZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVzd04rcmphOHNIblIzSlFtdGhHK0liSnBocFF3CkVBWUpLd1lCQkFHQ054VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFFdWgvd3VIYnJQNXdVT3gKU1BNb3dCMHV5UWxCK3BRQUhLU2txMGxQanowZTcwMXZ2YnlrOXZJbU1Na1F5aDJJKzNRWkg0VkZ2YkJzVWZrMgpmdHYxVERJNlFVOWJSOC9vQ3kyMnhCbWRkTVZIeGp0cUQ2d1UyenowYzV5cEJkOEEzSFI0K3ZnMVlGa0NFeGg4CnZQdE5zQ0J0UTd0Z01IcG5NMXpGbWRINExUbFNjL3VNcXBjbFhITFpDQjZyVGp6amdUR2ZBNmI3d1A0cGlGWGEKaE5WUUE3YmloS09tTnFvUk9nSGhHRXZXUkdpelBmbFRkSVN6UnBGR2xnQzNnQ3kyNGVNUTR0dWk1eWlQQVpaaQpGajRBNHh5bE5vRVlva3hTZHNBUm8yN21IYnJqV3I0MlU4VStkWStHYVNsWVU3V2N1MitmWE1VWTdOMHY0WmpKCi9MN2ZDZzA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0aWduYSBPPURoaW15b3RpcwojIFN1YmplY3Q6IENOPUNlcnRpZ25hIE89RGhpbXlvdGlzCiMgTGFiZWw6ICJDZXJ0aWduYSIKIyBTZXJpYWw6IDE4MzY0ODAyOTc0MjA5MzYyMTc1CiMgTUQ1IEZpbmdlcnByaW50OiBhYjo1NzphNjo1Yjo3ZDo0Mjo4MjoxOTpiNTpkODo1ODoyNjoyODo1ZTpmZDpmZgojIFNIQTEgRmluZ2VycHJpbnQ6IGIxOjJlOjEzOjYzOjQ1Ojg2OmE0OjZmOjFhOmIyOjYwOjY4OjM3OjU4OjJkOmM0OmFjOmZkOjk0Ojk3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMzpiNjphMjpkYjoyZTpkNzpjZTo0ODo4NDoyZjo3YTpjNTozMjo0MTpjNzpiNzoxZDo1NDoxNDo0YjpmYjo0MDpjMToxZjozZjoxZDowYjo0MjpmNTplZTphMToyZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHFEQ0NBcENnQXdJQkFnSUpBUDdjNHdFUHlVai9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1EUXhDekFKQmdOVgpCQVlUQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhNQjRYCkRUQTNNRFl5T1RFMU1UTXdOVm9YRFRJM01EWXlPVEUxTVRNd05Wb3dOREVMTUFrR0ExVUVCaE1DUmxJeEVqQVEKQmdOVkJBb01DVVJvYVcxNWIzUnBjekVSTUE4R0ExVUVBd3dJUTJWeWRHbG5ibUV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3FYT0VtN1JGSFllR2lmQlo0ClFDSGtZSjVheUdQaHhMR1drdjhZYldrajRTdGk5OTNpTmkrUkI3bEl6dzdzZWJZczV6UkxjQWdsb3p5SEd4bnkKZ1FjUE9KQVoweEgraHJUeTBWNGVIcGJOZ0d6T096R1R0dktnMEttVkVuMmxtc3hyeUlSV2lqT3A1eUlWVXhidwp6QmZzVjEvcG9ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRCjEzMHlHTE1MTEdxL2pqOFVFWWtnRG5jVXRUMlVDSWYzSlI3VnNtQUE3RzhxS0NWdUtqNFlZeGNsUHo1RUlCYjIKSnNnbHJnVkt0T2RqTFBPTUZsTitYUHNSR2dqQlJtS2ZJcmp4d28xcDNQbzZXQWJmQWdNQkFBR2pnYnd3Z2JrdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVHdTMrUVRtUXRDUlp2Z0h5VXRWRjlsbzUzQkV3ClpBWURWUjBqQkYwd1c0QVVHdTMrUVRtUXRDUlp2Z0h5VXRWRjlsbzUzQkdoT0tRMk1EUXhDekFKQmdOVkJBWVQKQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhnZ2tBL3R6agpBUS9KU1A4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FRRUFoUU1la25IMlFxL2hvMkdlNi9QQUQvS2wxTnFWNXRhK2FEWTlmbTRmVElydjBROGgKYlY2bFVtUE9Fdmp2S3RwdjZ6ZitFd0xIeXpzK0ltdmFZUzUvMUhJOTNURGhIa3hBR1l3UDE1elJnekI3bUZuYwpmY2E1RENsTW9UT2k2MmM2WllUVGx1THRka1Z3ajdVcjN2a2oxa2x1UEJTMXhwODFIbERRd1k5cWNFUUNZc3V1CkhXaEJwNnBYNkZPcUI5SUc5dFVVQmd1UkEzVXNiSEsxWVpXYURZdTVEZWYxMzFUTjN1YlkxZ2tJbDJQbHdTNncKdDBRbXdDYkFyMVV3bmp2Vk5pb1pCUFJjSHYvUExMZi8wUDJIUUJIVkVTTzdTTUFocWFRb0xmMFYrTEJPSy9RdwpXeUg4RVpFMHZrSHZlNTJYZGYrWGxjQ1dXQy9xdTBiWHUrVFpMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiBPPURldXRzY2hlIFRlbGVrb20gQUcgT1U9VC1UZWxlU2VjIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPURldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIE89RGV1dHNjaGUgVGVsZWtvbSBBRyBPVT1ULVRlbGVTZWMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDM4CiMgTUQ1IEZpbmdlcnByaW50OiA3NDowMTo0YTo5MTpiMTowODpjNDo1ODpjZTo0NzpjZDpmMDpkZDoxMTo1MzowOAojIFNIQTEgRmluZ2VycHJpbnQ6IDg1OmE0OjA4OmMwOjljOjE5OjNlOjVkOjUxOjU4OjdkOmNkOmQ2OjEzOjMwOmZkOjhjOmRlOjM3OmJmCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNjoxOToxYTo1MDpkMDpjMzo5Nzo3Zjo3ZDphOTo5YjpjZDphYTpjODo2YToyMjo3ZDphZTpiOTo2Nzo5ZTpjNzowYjphMzpiMDpjOTpkOToyMjo3MTpjMTo3MDpkMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG56Q0NBb2VnQXdJQkFnSUJKakFOQmdrcWhraUc5dzBCQVFVRkFEQnhNUXN3Q1FZRFZRUUdFd0pFUlRFYwpNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGxVMlZqCklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MElFTkIKSURJd0hoY05PVGt3TnpBNU1USXhNVEF3V2hjTk1Ua3dOekE1TWpNMU9UQXdXakJ4TVFzd0NRWURWUVFHRXdKRQpSVEVjTUJvR0ExVUVDaE1UUkdWMWRITmphR1VnVkdWc1pXdHZiU0JCUnpFZk1CMEdBMVVFQ3hNV1ZDMVVaV3hsClUyVmpJRlJ5ZFhOMElFTmxiblJsY2pFak1DRUdBMVVFQXhNYVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCU2IyOTAKSUVOQklESXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDckM2TTE0SXNwRkxFVQpoYTg4RU9RNWJ6VmRTcTdkNm1HTmxVbjBiMlNqR21CbXBLbEFJb1RaMUtYbGVKTU9hQUd0dVUxY09zN1R1S2hDClFOL1BvN3FDV1dxU0c2d2NtdG9JS3lVbitXa2pSL0hnNnl4Nm0vVVRBdEIrTkh6Q25qd0FXYXYxMmd6MU1qd3IKckZEYTFzUGVnNVRLcUF5Wk1nNElTRlpiYXZ2YTRWaFlBVWxmY2tFOEZRWUJqbDJ0cXJpVHRNMmU2NmZvYWkxUwpOTnM2NzF4MVVkcmI4ekg1N25HWU1zUlVGVVFNK1p0VjdhM2ZHQWlnbzRhS1NlNVRCWThaVE5YZVdIbWIwbW9jClFxdkYxYWZQYUErVzVPRmhtSFpoeUpGODFqNEE0cEZRaCtHZEN1YXRsOUlkeGpwOXk3emFBelRWamxzQjlXb0gKdHhhMmJrcC9BZ01CQUFHalFqQkFNQjBHQTFVZERnUVdCQlF4dzNrYnV2VlQxeGZnaVhvdEYyd0tzeXVkTXpBUApCZ05WSFJNRUNEQUdBUUgvQWdFRk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DCkFRRUFsR1JaclRsazV5bnJFLzVhdzRzVFY4Z0VKUEIwZDhCZzQyZjc2WW1tZzcrV2dueHUxTU05NzU2QWJyc3AKdEpoNnNUdFU2emtYUjM0YWpndjhIekZaTVFTeXpoZnpMTWRpTmxYaUl0aUpWYlNZU0twayt0WWNOdGhFZUZwYQpJenBYbC9WNk1FK3VuMnBNU3l1T29BUGpQdUNwMU5KNzByT280bkk4clo3L2dGbmttMFcwOWp1d3pUa1ptRExsCjZpRmhrT1F4SVk0MHNmY3ZOVXFGRU5ybmlqY2h2bGxqNFBLRmlERlQxRlFVaFhCNTlDNEdkeWQxTHgrNGl2bisKeGJyWU51U0Q3T2RsdDc5ald2TkdyNEdVTjlSQmpOWWoxaDdQOVdnYlJHT2lXcnFuTlZtaDVYQUZtdzRqVjVtVQpDbTI2T1dNb2hwTHpHSVRZKzlIUEJWWmtWdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DeWJlcnRydXN0IEdsb2JhbCBSb290IE89Q3liZXJ0cnVzdCwgSW5jCiMgU3ViamVjdDogQ049Q3liZXJ0cnVzdCBHbG9iYWwgUm9vdCBPPUN5YmVydHJ1c3QsIEluYwojIExhYmVsOiAiQ3liZXJ0cnVzdCBHbG9iYWwgUm9vdCIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk2ODI4Nzc0ODQzNjAKIyBNRDUgRmluZ2VycHJpbnQ6IDcyOmU0OjRhOjg3OmUzOjY5OjQwOjgwOjc3OmVhOmJjOmUzOmY0OmZmOmYwOmUxCiMgU0hBMSBGaW5nZXJwcmludDogNWY6NDM6ZTU6YjE6YmY6Zjg6Nzg6OGM6YWM6MWM6Yzc6Y2E6NGE6OWE6YzY6MjI6MmI6Y2M6MzQ6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDk2OjBhOmRmOjAwOjYzOmU5OjYzOjU2Ojc1OjBjOjI5OjY1OmRkOjBhOjA4OjY3OmRhOjBiOjljOmJkOjZlOjc3OjcxOjRhOmVhOmZiOjIzOjQ5OmFiOjM5OjNkOmEzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb1RDQ0FvbWdBd0lCQWdJTEJBQUFBQUFCRDRXcUxVZ3dEUVlKS29aSWh2Y05BUUVGQlFBd096RVlNQllHCkExVUVDaE1QUTNsaVpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmgKYkNCU2IyOTBNQjRYRFRBMk1USXhOVEE0TURBd01Gb1hEVEl4TVRJeE5UQTRNREF3TUZvd096RVlNQllHQTFVRQpDaE1QUTNsaVpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTCmIyOTBNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQStNaTh2UlJRWmhQLzhOTjUKN0NQeXR4ckhqb1h4RW5PbUdhb1EyNXlpWlhSYWR6NVJmVmIyM0NPMjFPMWZXTEUzVGRWSkRtNzFhb2ZXMG96UwpKOGJpL3phZm1HV2dFMDdHS21TYjFaQVN6eFFHOUR2ajFDaSs2QTc0cTA1SWxHMk9sVEVRWE8yaUxiM1ZPbTJ5CkhMdGd3RVpMQWZWSnJuNUdpdEIwamFFTUFzN3UvT2VQdUd0bTgzOUVBTDltSlJRcjNSQXdIUWVXUDAzMmE3aVAKdDNzTXBUanIza2ZiMVYwNS9JaW44OWNxZFBIb1dxSTduMUM2cG94Rk5jSlFaWlhjWTRMdjNiOTNUWnhpeVdOegpGdEFwRDBtcFNQQ3pxcmRzeGFjd09VQmRyc1RpWFNaVDhNNGNJd2hocUpRWnVnUmlRT3dmT0hCM0VnWnhwekFZClhTVW5wUUlEQVFBQm80R2xNSUdpTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUIwR0ExVWREZ1FXQkJTMkNIc05lc3lzSUV5R1ZqSmV6NnR1aFMxd1Z6QS9CZ05WSFI4RU9EQTJNRFNnTXFBdwpoaTVvZEhSd09pOHZkM2QzTWk1d2RXSnNhV010ZEhKMWMzUXVZMjl0TDJOeWJDOWpkQzlqZEhKdmIzUXVZM0pzCk1COEdBMVVkSXdRWU1CYUFGTFlJZXcxNnpLd2dUSVpXTWw3UHEyNkZMWEJYTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQlc3d29qb0ZST2xaZkorSW5hUmNIVW93QWw5QjhUcTdlamhWaHB3akN0MkJXS0xlUEp6WUZhK0hNagpXcWQ4QmZQOUlqc08wUWJFMnpaTWN3U081YkFpNU1YekxxWFpJK080VGtvZ3AyNENKSjhpWUdkN2l4MXlDY1V4ClhPbDVuNEJIUGEyaEN3Y1VQVWYvQTJrYURBdEU1Mk1scDMreXliaDJoTzBqOW4wSHEwViswOSt6dittS3RzMm8Kb21jclV0VzNaZkE1VEdPZ2tYbVRVZzlVM1lPN245R1BwMU56dzh2L01PeDhCTGpZUkIrVFgzRUpJcmR1UHVvYwpBMDZkR2lCaCs0RTM3Rjc4Q2tXcjErY1hWZENnNm1DYnB2YmpqRnNwd2daZ0ZKMHRsMHlwa3hXZFljUUJYMGpXCldMMVdNUkpPRWNnaDRMTVJrV1hidEthSU9NNVYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Q2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4gT1U9ZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1DaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLiBPVT1lUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogImVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDI4OTU2MDg4NjgyNzM1MTg5NjU1MDMwNTI5MDU3MzUyNzYwNDc3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjoyZTowMDpjYToyNjowNjo5MDozZDphZDpmZTo2ZjoxNTo2ODpkMzo2YjpiMwojIFNIQTEgRmluZ2VycHJpbnQ6IDY3OjY1OjBkOmYxOjdlOjhlOjdlOjViOjgyOjQwOmE0OmY0OjU2OjRiOmNmOmUyOjNkOjY5OmM2OmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMDphNjpmNDpkYzo2MzphMjo0YjpmZDpjZjo1NDplZjoyYTo2YTowODoyYTowYTo3MjpkZTozNTo4MDozZToyZjpmNTpmZjo1Mjo3YTplNTpkODo3MjowNjpkZjpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnNEQ0NBNWlnQXdJQkFnSVFGY2k5WlVkY3I3aVhBRjdrQnRLOG5UQU5CZ2txaGtpRzl3MEJBUVVGQURCZQpNUXN3Q1FZRFZRUUdFd0pVVnpFak1DRUdBMVVFQ2d3YVEyaDFibWRvZDJFZ1ZHVnNaV052YlNCRGJ5NHNJRXgwClpDNHhLakFvQmdOVkJBc01JV1ZRUzBrZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWUKRncwd05ERXlNakF3TWpNeE1qZGFGdzB6TkRFeU1qQXdNak14TWpkYU1GNHhDekFKQmdOVkJBWVRBbFJYTVNNdwpJUVlEVlFRS0RCcERhSFZ1WjJoM1lTQlVaV3hsWTI5dElFTnZMaXdnVEhSa0xqRXFNQ2dHQTFVRUN3d2haVkJMClNTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0U1VQN28zYmlETjFaODJ0SDMwNlRtMmQweThVODJOMHl3RWhhamZxaEZBSApTeVpiQ1VOc0laNXF5TlVEOVdCcGo4endJdVFmNS9kcUlqRzNMQlh5NFA0QWFrUC9oMlhHdFJyQnAweHRJbkFoCmlqSHlsM1NKQ1JJbUhKN0syUktpbFR6YTZXZS9DS0JrNDlaQ3QwWHZsL1QyOWRlMVNoVUNXSDJZV0V0Z3ZNM1gKRFpvVE0xUFJZZmw2MWRkNHM1b3o5d0NHemgxTmxEaXZxT3g0VVhDS1hCQ0RVU0gzRVQwMGhsN2xTTTJYZ1lJMQpUQm5zWmZacnhRV2g3a2NUMXJNaEo1UVFDdGtrTzdxK1JCTkdNRCtYUE5qWDEycnVPempqSzlTWERya2I1d2RKCmZ6Y3ErWGQ0ejFUdFcwYWRvNEFPa1VQQjFsdGZGTHFmcG8wa1IwQlp2M0k0c2pac04vK1owVjBPV1FxcmFmZkEKc2dSRmVsUUFycjVUOXJYbjRmZzhvekhTcWY0aFVtVEZwbWZ3ZFFjR2xCU0JWY1luNUFHUEY4RnFjZGUrUy91VQpXSDErRVRPeFF2ZGliQmpXendsb1BuOXM5aDZQWXEybFk5c0pweDhpUWtFZWI1bUtQdGY1UDBCNmViQ2xBWkxTCm5UMElGYVVRQVMyek1uYW9sUTJ6ZXByN0J4QjRFVy9oajhlNkR5VWFkQ3JsSEpoQm1kOGhoK2lWQm1vS3MycEgKZG1YMk9zK1BZaGNaZXdvb3pSclNneDRoeHl5L3Z2OWhhTGRuRzd0NFRZM09aK1hrd1k2M0kyYmluWkIxTkppcApOaXVLbXBTNW5lek1pckg0SllsY1dyWXZqQjl0ZVNTblVtakRoRFhpWm8xakRpVk4xUm15NW5rM3B5S2RWREVDCkF3RUFBYU5xTUdnd0hRWURWUjBPQkJZRUZCNE05N1puOHVHU0pnbEZ3RlU1TG5jL1FrcWlNQXdHQTFVZEV3UUYKTUFNQkFmOHdPUVlFWnlvSEFBUXhNQzh3TFFJQkFEQUpCZ1VyRGdNQ0dnVUFNQWNHQldjcUF3QUFCQlJGc01MSApDbFo4N2x0NERKWDVHRlBCcGh6WUVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFDYk9EVTFrQlBwVkp1ZkdCCnV2bDJJQ08xSjJCMDFHcVpORjVzQUZQWm4vS21zU1FIUkdvcXhxV09lQkxvUjlsWUd4TXFYbm1ibndvcVo2WWwKUHdacFZuUERpbVpJK3ltQlYzUUd5cHpxS09nNFp5WXI4ZFcxUDJXVCtEWmRqbzJOUUNDSEdlcnZKOEE5dERrUApKWHRvVUhSVm5BeFpmVm85UVpRbFVnamdSeXdWTVJuVnZ3ZFZ4cnNTdFpmMFg0T0Z1bkhCMld5QkVYWUtDckMvCmdwZjM2ajM2K3V3dHFTaVVPMWJkMGxFdXJzQzlDQldNZDFJMGx0YWJyTk1kam1FUE5YdWJyamxwQzJKZ1FDQTIKajYvN051NHRDRW9kdUwrYlhQanFwUnVnYzZiWStHN2dNd1JmYUtvbmgrM1p3WkNjN2IzamFqV3ZZOStyR05tNgo1dWxLNmxDS0QyR1RIdUl0R2VJd2xEV1NYUTYyQjY4WmdJOUhrRkZMTGszZGhlTFNDbElLRjVyOEdyQlFBdVVCCm8yTTNJVXhFeEp0Um1SRU9jNXdHajFRdXB5aGVSRG1IVmkwM3ZZVkVsT0VNU3l5Y3c1S0ZOR0hMRDdpYlNrTlMKL2pRNmZianBLZHgycWNndytCUnhnTVllTmtoMElrRmNoNExvR0hHTFFZbEU1MzVZVzZpNGpSUHBwMnpEUisyegpHcDFpcm8yQzZwU2UzVmtRdzYzZDRrM2pNZFhIN09qeXNQNlNIaFlLR3Z6WjgvZ250c20rSGJSc1pKQi85T1RFClc5YzNya0lPM2FRYWIzeUlWTVVXYnVGNmFDNzRPcjhOcER5Sk8zaW5UbU9EQkNFSVo0M3lna25RVy8yeHpRK0QKaE5RK0lJWDNTajByblAwcUNnbE42b0g0RVp3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1jZXJ0U0lHTiBPVT1jZXJ0U0lHTiBST09UIENBCiMgU3ViamVjdDogTz1jZXJ0U0lHTiBPVT1jZXJ0U0lHTiBST09UIENBCiMgTGFiZWw6ICJjZXJ0U0lHTiBST09UIENBIgojIFNlcmlhbDogMzUyMTAyMjcyNDkxNTQKIyBNRDUgRmluZ2VycHJpbnQ6IDE4Ojk4OmMwOmQ2OmU5OjNhOmZjOmY5OmIwOmY1OjBjOmY3OjRiOjAxOjQ0OjE3CiMgU0hBMSBGaW5nZXJwcmludDogZmE6Yjc6ZWU6MzY6OTc6MjY6NjI6ZmI6MmQ6YjA6MmE6ZjY6YmY6MDM6ZmQ6ZTg6N2M6NGI6MmY6OWIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVhOmE5OjYyOmM0OmZhOjRhOjZiOmFmOmViOmU0OjE1OjE5OjZkOjM1OjFjOmNkOjg4OjhkOjRmOjUzOmYzOmZhOjhhOmU2OmQ3OmM0OjY2OmE5OjRlOjYwOjQyOmJiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlET0RDQ0FpQ2dBd0lCQWdJR0lBWUZGbkFDTUEwR0NTcUdTSWIzRFFFQkJRVUFNRHN4Q3pBSkJnTlZCQVlUCkFsSlBNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUVDeE1RWTJWeWRGTkpSMDRnVWs5UFZDQkQKUVRBZUZ3MHdOakEzTURReE56SXdNRFJhRncwek1UQTNNRFF4TnpJd01EUmFNRHN4Q3pBSkJnTlZCQVlUQWxKUApNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUVDeE1RWTJWeWRGTkpSMDRnVWs5UFZDQkRRVENDCkFTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGN6dVg3SUpVcU90ZHUwS0J1cVY1RG8KMFNMVFpMclRrK2pVcklaaFFHcGdWMmhVaEUyOGFsUUNCZi9mbTVvcXJsMEhqMHJES0gvdit5djZlZkhIcmZBUQpVeVNRaTJiSnFJaXJyMXFqQU9tK3VrYnVXM043TEJlQ2dWNWlMS0VDWmJPOXhTc0Fmc1Q4QXpOWERlM2krczVkClJkWTR6VFcyc3NIUW5JRktxdVN5QVZ3ZGoxK1p4TEd0MjRnaDY1QUlnb0R6TUtORDVwQ0NybFVvU2UxYjE2a1EKT0E3K2oweGJtMGJxUWZXd0NIVEQwSWd6dG56WGROL2NoTkZERG5VNW9TVkFLT3A0eXc0c0xqbWRqSXR1Rmh3dgpKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0M0FBQWFXeWpqMHB4elBqS0htS0hKVVMvWDNxd3pzMDhDCkF3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBY1l3SFFZRFZSME8KQkJZRUZPQ01tOXNsU2JQeGZJYldza0tIQzlCcm9ObmtNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUErMGh5SgpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZCk1uUThTRzRQbjB2VTl4N1RrNFprVkpkamNsRFZWYy82SUpNQ29wdkRJNU5PRmxWMm9IQjViYzBoSDg4dkxid1oKNDRneCtGa2FnUW5JbDZaMHgyREVXOHhYanJKMS9Sc0NDZHRaYjNLVGFmY3hRZGFJT0wrSHNyMFdlZm1xNUw2SQpKZDFoSnlNY3RURUhCRGEwR3BDOW9IUnhVSWx0dkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053CmkvbkRoRHdUcW42U20xZFRrL3B3d3BFT01mbWJaMTNwbGpoZVg3TnpUb2dWWjk2ZWRoQmlJTDVWYVpWREFEbE4KOXU2d1drNUpSRlJZWDBLRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIgojIFNlcmlhbDogMjg4MDkxMDU3Njk5Mjg1NjQzMTM5ODQwODUyMDk5NzU4ODU1OTkKIyBNRDUgRmluZ2VycHJpbnQ6IGI1OmU4OjM0OjM2OmM5OjEwOjQ0OjU4OjQ4OjcwOjZkOjJlOjgzOmQ0OmI4OjA1CiMgU0hBMSBGaW5nZXJwcmludDogMDM6OWU6ZWQ6Yjg6MGI6ZTc6YTA6M2M6Njk6NTM6ODk6M2I6MjA6ZDI6ZDk6MzI6M2E6NGM6MmE6ZmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI0Ojc4OmI4OjEyOjI1OjBkOmY4Ojc4OjYzOjVjOjJhOmE3OmVjOjdkOjE1OjVlOmFhOjYyOjVlOmU4OjI5OjE2OmUyOmNkOjI5OjQzOjYxOjg4OjZjOmQxOmZiOmQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEL2pDQ0F1YWdBd0lCQWdJUUZheHVsQm15ZVV0QjlpZXB3eGdQSHpBTkJna3Foa2lHOXcwQkFRc0ZBRENCCm1ERUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhPVEEzQmdOVkJBc1QKTUNoaktTQXlNREE0SUVkbGIxUnlkWE4wSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1cwplVEUyTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlU0F0SUVjek1CNFhEVEE0TURRd01qQXdNREF3TUZvWERUTTNNVEl3TVRJek5UazFPVm93Z1pneEN6QUoKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZwpNakF3T0NCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwCkJnTlZCQU1UTFVkbGIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU56aVhtSllIVE5YT1RJegordXZMaDR5bjFFcmRCb2pxWkk0eG1LVTRrQjZZenk1aksvQkd2RVN5aWFIQUtBeEpjQ0dWbjJUQXBwTVNBbVVtCmhzYWxpZkQ2MTRTZ2NLOVBHcGMvQmtUVnlldHlFSDNrTVNqN0hHSG1LQWRFYzVJaWFhY0RpR3lkWThoUzJwZ24KNXdoTWNENjB5UkxCeFdlRFhUUHpBeEhzYXRCVDR0RzZObUNVZ0x0aFkyeGJGMzdmUUpRZXF3M0NJU2h3aVAvVwpKbXhzWUFRbFRsVitmZSsvbEVqZXR4M2RjSTBGWDRpbG0vTEM3dXJSUUVGdFlqZ2RWZ2JGQTBkUklCbjhleEFMCkRtS3VkbFcvWDNlK1Bra0JVejJZSlFOMkpGb2R0TnVKNm5ubHRyTTdQN3BNS0VGL0JxeHFqc0hROWdVZGZlWkMKaHVPbDFVY0NBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpIUVlEVlIwT0JCWUVGTVI1eW82aFRnTWRITnhyMnpGYmxENC9NSDh0TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCCkFRQXR4UlBQVm9CN2VuaTluNjRzbWVmdjJ0K1VYZ2xwcCtkdWFJeTljcjVIcVE2WEVyaEs4V1RUT2Q4bE5OVEIKelU2QjhBOEV4Q1N6TkpiR3Bxb3czMmhoYzlmNWpvV0o3dzVlbFNoS0tpZVBFSTR1ZkliRUFwN2FESGRsRGtRTgprdjM5c3hZMitoRU5IWXdPQjRscUtWYjNjdlRkRlp4M05XWlhxeE5UMkk3QlFNWFhFeFphY3NlM2FRSEVlckdECkFXaDlqVUdobEJqQkpWejg4UDZEQW9kOERRM1BMZ2hjU2tBTlB1eUJZZVlrMjhyZ0RpMEhzajVXM0kzMVFZVUgKU0pzTUM4dEpQMzNzdC8zTGpXZUpHcXZ0dXg2akFBZ0lGeXFDWERGZFJvb3RENGFiZE5sRis5UkFzWHFxYUMyRwpzcGtpNGNFcng1ejQ4MStvZ2hMckdSRXQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiBPPXRoYXd0ZSwgSW5jLiBPVT0oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiBPPXRoYXd0ZSwgSW5jLiBPVT0oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIgojIFNlcmlhbDogNzE3NTgzMjA2NzI4MjU0MTAwMjA2NjE2MjEwODUyNTY0NzI0MDYKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OjlkOmVhOjYwOjI0OmM0OmZkOjIyOjUzOjNlOmNjOjNhOjcyOmQ5OjI5OjRmCiMgU0hBMSBGaW5nZXJwcmludDogYWE6ZGI6YmM6MjI6MjM6OGY6YzQ6MDE6YTE6Mjc6YmI6Mzg6ZGQ6ZjQ6MWQ6ZGI6MDg6OWU6ZjA6MTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGE0OjMxOjBkOjUwOmFmOjE4OmE2OjQ0OjcxOjkwOjM3OjJhOjg2OmFmOmFmOjhiOjk1OjFmOmZiOjQzOjFkOjgzOjdmOjFlOjU2Ojg4OmI0OjU5OjcxOmVkOjE1OjU3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDaURDQ0FnMmdBd0lCQWdJUU5md21YTm1FVDhrOUpqMVhtNjdYVmpBS0JnZ3Foa2pPUFFRREF6Q0JoREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFNE1EWUdBMVVFQ3hNdktHTXAKSURJd01EY2dkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SkRBaQpCZ05WQkFNVEczUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEVnTFNCSE1qQWVGdzB3TnpFeE1EVXdNREF3Ck1EQmFGdzB6T0RBeE1UZ3lNelU1TlRsYU1JR0VNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTWRHaGgKZDNSbExDQkpibU11TVRnd05nWURWUVFMRXk4b1l5a2dNakF3TnlCMGFHRjNkR1VzSUVsdVl5NGdMU0JHYjNJZwpZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEVrTUNJR0ExVUVBeE1iZEdoaGQzUmxJRkJ5YVcxaGNua2dVbTl2CmRDQkRRU0F0SUVjeU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFb3RXY2dudVZuZkZTZUlmK2loYS8KQmViZm93SlBEUWZHQUZHNkRBSlNMU0trUWpuRS9vL3F5Y0crMUUzL24zcWU0ckY4bXEybmhnbHpoOUhubXVONgpwYXB1KzdxemNNQm5pS0kxMUtPYXNmMnR3dTh4K3FpNTgvc0l4cEhSK3ltVm8wSXdRREFQQmdOVkhSTUJBZjhFCkJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVbXRnQU1BRG5hMytGR082THRzNksKRFBnUjRic3dDZ1lJS29aSXpqMEVBd01EYVFBd1pnSXhBTjM0NEZkSFc2Zm1Dc085OVlDS2x6VU5HNGs4VklaMwpLTXFoOUhuZXRlWTRzUEJsY0l4L0FsVEN2Ly9Zb1Q3Wnp3SXhBTVNObFB6Y1U5TGNuWGdXSHhVekkxTlM0MW94ClhaM0tycjBUS1VRTkoxdW81MmljRXZkWVB5NXlBbGVqajZFVUxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA4IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyIKIyBTZXJpYWw6IDEyNzYxNDE1NzA1NjY4MTI5OTgwNTU1NjQ3NjI3NTk5NTQxNDc3OQojIE1ENSBGaW5nZXJwcmludDogZmI6MWI6NWQ6NDM6OGE6OTQ6Y2Q6NDQ6YzY6NzY6ZjI6NDM6NGI6NDc6ZTc6MzEKIyBTSEExIEZpbmdlcnByaW50OiBmMTo4Yjo1Mzo4ZDoxYjplOTowMzpiNjphNjpmMDo1Njo0Mzo1YjoxNzoxNTo4OTpjYTpmMzo2YjpmMgojIFNIQTI1NiBGaW5nZXJwcmludDogNGI6MDM6ZjQ6NTg6MDc6YWQ6NzA6ZjI6MWI6ZmM6MmM6YWU6NzE6Yzk6ZmQ6ZTQ6NjA6NGM6MDY6NGM6ZjU6ZmY6YjY6ODY6YmE6ZTU6ZGI6YWE6ZDc6ZmQ6ZDM6NGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLakNDQXhLZ0F3SUJBZ0lRWUFHWHQwYW42clMwbXRaTEwvZVErekFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKcmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFb01DWUdBMVVFQ3hNZgpRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdktHTXBJREl3Ck1EZ2dkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SkRBaUJnTlYKQkFNVEczUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEVnTFNCSE16QWVGdzB3T0RBME1ESXdNREF3TURCYQpGdzB6TnpFeU1ERXlNelU1TlRsYU1JR3VNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTWRHaGhkM1JsCkxDQkpibU11TVNnd0pnWURWUVFMRXg5RFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpJRVJwZG1semFXOXUKTVRnd05nWURWUVFMRXk4b1l5a2dNakF3T0NCMGFHRjNkR1VzSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbApaQ0IxYzJVZ2IyNXNlVEVrTUNJR0ExVUVBeE1iZEdoaGQzUmxJRkJ5YVcxaGNua2dVbTl2ZENCRFFTQXRJRWN6Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBc3I4bkxQdmIyRnZkZUhzYm5uZG0KZ2NzK3ZIeXU4NllubWpTamFERnhPRE5pNVBOeFpubXhxV1dqcFl2VmoyQXRQMExNcW1zeXdDUExMRUhkNU4vOApZWnppYzdJaWxSRkRHRi9FdGg5WGJBb0ZXQ0xJTmt3NmZLWFJ6NGF2aUtkRUFoTjBjWE1LUWxrQytCc1VhMExmCmIxKzZhNEtpblZ2blNyMGVBWExiUzNUb08zOS9mUjhFdENhYjRMUmFyRWM5VmJqWHNDWlNLQUV4UUdiWTJTUzkKOWlyWTdDRkpYSnYyZXVsL1ZUVitsbXVOazVNbnk1Szc2cXhBd0ovQytJRFBYZlJhM001MGhxWStiQXRUeXIyUwp6aGtHY3VZTVhEaHB4d1RXdkd6T1cvYjNhSnpjSlJWSWlLSHBxZmlZbk9EejFURW9ZUkZzWjVhTk9abkx3a1VrCk9RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlYKSFE0RUZnUVVyV3lxbEdDYzdlVC8rajRLZEN0akEvZTJXYjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUJwQQoySlZsckFtU2ljWTU5QkRscVE1bVUxMTQzdm9ra2J2blJGSGZ4aFkwQ3U5cVJGSHFLd2VLQTNyRDZ6OEtMRklXCm9DdER1U1dRUDNDcE15VnRSUm9vT3lmUHFzTXBRaHZmTzB6QU16UmJRWWkvYXl0bHJ5anZzdlhEcW1iT2UxYnUKdDhqTFo4SEpuQm9ZdU1URFNRUHhZQTVRelViRjgzZDU5N1lWNERqYnh5OG9vQXcvZHlaMDJTVVMyakhhR2g3YwpLVUdSSWp4cHA3c0M4clpjSndPSjlBYnFtK1J5Z3VPaENjSHBBQm5UUHRSd2E3cHhwcXBZcnZTNzZXeTI3NGZNCm03di9PZVpXWWRNS3A4UmNUR0I3QlhjbWVyL1lCMUlzWXZkd1k5azV2Rzhjd25uY2RpbXZ6c1VzWkFSZWlEWnUKTWRSQUdtSTBOajgxQWE2c1k2QT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDcgR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDgwNjgyODYzMjAzMzgxMDY1NzgyMTc3OTA4NzUxNzk0NjE5MjQzCiMgTUQ1IEZpbmdlcnByaW50OiAwMTo1ZTpkODo2YjpiZDo2ZjozZDo4ZTphMTozMTpmODoxMjplMDo5ODo3Mzo2YQojIFNIQTEgRmluZ2VycHJpbnQ6IDhkOjE3Ojg0OmQ1OjM3OmYzOjAzOjdkOmVjOjcwOmZlOjU3OjhiOjUxOjlhOjk5OmU2OjEwOmQ3OmIwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1ZTpkYjo3YTpjNDozYjo4MjphMDo2YTo4Nzo2MTplODpkNzpiZTo0OTo3OTplYjpmMjo2MToxZjo3ZDpkNzo5YjpmOToxYzoxYzo2Yjo1Njo2YToyMTo5ZTpkNzo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3JqQ0NBaldnQXdJQkFnSVFQTEwwU0FvQTR2N3JKRHRlWUQ3RGF6QUtCZ2dxaGtqT1BRUURBekNCbURFTApNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhPVEEzQmdOVkJBc1RNQ2hqCktTQXlNREEzSUVkbGIxUnlkWE4wSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURTIKTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMAplU0F0SUVjeU1CNFhEVEEzTVRFd05UQXdNREF3TUZvWERUTTRNREV4T0RJek5UazFPVm93Z1pneEN6QUpCZ05WCkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZ01qQXcKTnlCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwQmdOVgpCQU1UTFVkbGIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JICk1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkJXeDZQMERGVVBsck91SE54Rmk3OUtETmxKOVJWY0wKU28xN1ZEczZibDhWQXNCUXBzOGxMMzNLU0xqSFVHTWNLaUVJZkpvMjJBdiswU2JGV0RFd0tDWHpYVjJqdUxhbAp0Skx0YkN5ZjY5MURpYUk4UzBpUkhWRHNKdC9XWUM2OUlhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPCkJnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkJWZk5WZFJWZnNsc3EwRGFmd0JvL3ErRVZYVk1Bb0cKQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR1NXV2Fib0NkNkx1dnBhaUlqd0g1SFRScWp5U2t3Q1kvdHNYempiTGtHVApxUTdtbmR3eEhMS2dweGdjZWVISE5nSXdPbGF2bW5Sczl2dUQ0RFBUQ0YraG5NSmJuMGJXdHN1UkJtT2lCdWN6CnJENm9nUkxReTdyUWtndTJucGFxQkErSwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA4NTIwOTU3NDczNDA4NDU4MTkxNzc2Mzc1MjY0NDAzMTcyNjg3NwojIE1ENSBGaW5nZXJwcmludDogOGU6YWQ6YjU6MDE6YWE6NGQ6ODE6ZTQ6OGM6MWQ6ZDE6ZTE6MTQ6MDA6OTU6MTkKIyBTSEExIEZpbmdlcnByaW50OiAzNjo3OTpjYTozNTo2Njo4Nzo3MjozMDo0ZDozMDphNTpmYjo4NzozYjowZjphNzo3YjpiNzowZDo1NAojIFNIQTI1NiBGaW5nZXJwcmludDogMjM6OTk6NTY6MTE6Mjc6YTU6NzE6MjU6ZGU6OGM6ZWY6ZWE6NjE6MGQ6ZGY6MmY6YTA6Nzg6YjU6Yzg6MDY6N2Y6NGU6ODI6ODI6OTA6YmY6Yjg6NjA6ZTg6NGI6M2MKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV1VENDQTZHZ0F3SUJBZ0lRUUJyRVpDR3pFeUVERHJ2a0VockZIVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKdlRFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTApFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd09DQldaWEpwClUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1UZ3dOZ1lEVlFRREV5OVcKWlhKcFUybG5iaUJWYm1sMlpYSnpZV3dnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZQpGdzB3T0RBME1ESXdNREF3TURCYUZ3MHpOekV5TURFeU16VTVOVGxhTUlHOU1Rc3dDUVlEVlFRR0V3SlZVekVYCk1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjAKSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXlNREE0SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eQpJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4T0RBMkJnTlZCQU1UTDFabGNtbFRhV2R1SUZWdWFYWmxjbk5oCmJDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4MkUzWHJFQk5OdGkxeFdiLzFoYWpDTWoxbUNPa2RlUW1JTjY1bGdaT0l6Rgo5dVZraGJTaWNmdnR2Ym5helUwQXRNZ3RjNlhIYVhHVkh6azhza1FIbk9nTytrMUt4Q0hmS1dHUE1pSmhnc1dICkgyNk1mRjhXSUZGRTBYQlBWK3JqSE9QTWVlNVkyQTdDczBXVHdDem5taGNyZXdBM2VrRXplT0V6NHZNUUduK0gKTEw3MjlmZEM0dVcvaDJLSlh3QkwzOFhkNUhWRU1rRTZIbkZ1YWNzTGRVWUkwY3JTSzVYUXovdTVRR3RrakZkTgovQk1SZVlUdFhsVDJOSjhJQWZNUUpRWVhTdHJ4SFhwbWE1aGdacVRaNzlJdWd2SHc3d25xUk1rVmF1SURialBUCnJKOVZBTWYyQ0dxVXVWL2M0RFB4aEdENVd5Y1J0UHdXOHJ0V2FvQWxqUUlEQVFBQm80R3lNSUd2TUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUcwR0NDc0dBUVVGQndFTUJHRXdYNkZkb0ZzdwpXVEJYTUZVV0NXbHRZV2RsTDJkcFpqQWhNQjh3QndZRkt3NERBaG9FRkkvbDB4cUdySTJPYThQUGdHclVTQmdzCmV4a3VNQ1VXSTJoMGRIQTZMeTlzYjJkdkxuWmxjbWx6YVdkdUxtTnZiUzkyYzJ4dloyOHVaMmxtTUIwR0ExVWQKRGdRV0JCUzJkL3BwU0VlZlV4TFZ3dW9ITW5ZSDBaY0hHVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBU3ZqNApzQVBtTEdkNzVKUjNZOHh1VFBsOURnM2N5TGsxdVhCUFkvb2srbXlEakVlZE8yUHptdmwyTXBXUnNYZThySnErCnNlUXhJY2FCbFZaYURySEMxTEdtV2F6eFk4dTRUQjFaa0VydmtCWW9IMXF1RVB1QlVEZ01iTXp4UGNQMVkrT3oKNHlISkpEbnAvUlZtUnZRYkVkQk5jNk45UnZrOTdhaGZZdFR4UC9qZ2RGY3JHSjJCdE1RbzJwU1hwWERyckIyKwpCeEh3MWR2ZDVZencxVEt3ZytaWDRvKy92cUdxdnowZHRkUTQ2dGV3WERwUGFqK1B3R1pzWTZycDJhUVc5SUhSCmxSUU9mYzJWTk5uU2ozQnpnWHVjZnIyWVlkaEZoNWlReGV1R01NWTF2L0QvdzFXSWcwdnZCWklHY2ZLNG1KTzMKN00yQ1lmRTQ1aytYbUNwYWpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDcgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDcgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IgojIFNlcmlhbDogNjMxNDM0ODQzNDgxNTM1MDY2NjUzMTE5ODU1MDE0NTg2NDAwNTEKIyBNRDUgRmluZ2VycHJpbnQ6IDNhOjUyOmUxOmU3OmZkOjZmOjNhOmUzOjZmOmYzOjZmOjk5OjFiOmY5OjIyOjQxCiMgU0hBMSBGaW5nZXJwcmludDogMjI6ZDU6ZDg6ZGY6OGY6MDI6MzE6ZDE6OGQ6Zjc6OWQ6Yjc6Y2Y6OGE6MmQ6NjQ6Yzk6M2Y6NmM6M2EKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY5OmRkOmQ3OmVhOjkwOmJiOjU3OmM5OjNlOjEzOjVkOmM4OjVlOmE2OmZjOmQ1OjQ4OjBiOjYwOjMyOjM5OmJkOmM0OjU0OmZjOjc1OjhiOjJhOjI2OmNmOjdmOjc5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEaERDQ0F3cWdBd0lCQWdJUUw0RCtJNHdPSWc5SVp4SW9rWWVzc3pBS0JnZ3Foa2pPUFFRREF6Q0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WlcKWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwClUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNUlDMGdSelF3SGhjTk1EY3hNVEExTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0J5akVMTUFrRwpBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WldaWEpwClUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbmJpd2cKU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwVTJsbgpiaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1CklDMGdSelF3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBU25WbnA4VXRwa213NHRYTmhlckpJOS9nSG0KR1VvOUZBTkwrbUFuSU5tRGlXbjZWTWFhR0Y1VkttVGVCdmFOU2p1dEVEeGxQWkNJQkluZ01HR3pybDBCcDN2ZQpmTEsreW1WaEFJYXUybzk3MEltdFRSMVpta0d4dkVlQTNKNWl3L21qZ2JJd2dhOHdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdiUVlJS3dZQkJRVUhBUXdFWVRCZm9WMmdXekJaTUZjd1ZSWUoKYVcxaFoyVXZaMmxtTUNFd0h6QUhCZ1VyRGdNQ0dnUVVqK1hUR29hc2pZNXJ3OCtBYXRSSUdDeDdHUzR3SlJZagphSFIwY0RvdkwyeHZaMjh1ZG1WeWFYTnBaMjR1WTI5dEwzWnpiRzluYnk1bmFXWXdIUVlEVlIwT0JCWUVGTE1XCmtmM3VwbTdrdFM1Smo0ZDRnWURzNWJHMU1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01HWWhEQmdtWUZvNGUxWkMKNEtmOE5vUlJrU0FzZGsxRFBjUWRoQ1BRck5aOE5RYk96V205a0EzYmJFaENIUTZxUWdJeEFKdzlTRGtqT1ZnYQpGUkpaYXA3djFWbXlIVklzbVhITnh5bmZHeXBoZTNIUjN2UEE1UTA2U3FvdHA5aUdLdDB1RUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IE89TmV0TG9jayBLZnQuIE9VPVRhblx4ZmFzXHhlZHR2XHhlMW55a2lhZFx4ZjNrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKQojIFN1YmplY3Q6IENOPU5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSBPPU5ldExvY2sgS2Z0LiBPVT1UYW5ceGZhc1x4ZWR0dlx4ZTFueWtpYWRceGYzayAoQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcykKIyBMYWJlbDogIk5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSIKIyBTZXJpYWw6IDgwNTQ0Mjc0ODQxNjE2CiMgTUQ1IEZpbmdlcnByaW50OiBjNTphMTpiNzpmZjo3MzpkZDpkNjpkNzozNDozMjoxODpkZjpmYzozYzphZDo4OAojIFNIQTEgRmluZ2VycHJpbnQ6IDA2OjA4OjNmOjU5OjNmOjE1OmExOjA0OmEwOjY5OmE0OjZiOmE5OjAzOmQwOjA2OmI3Ojk3OjA5OjkxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Yzo2MTpkYTpjMzphMjpkZTpmMDozMTo1MDo2YjplMDozNjpkMjphNjpmZTo0MDoxOTo5NDpmYjpkMTozZDpmOTpjODpkNDo2Njo1OTo5Mjo3NDpjNDo0NjplYzo5OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUZUQ0NBdjJnQXdJQkFnSUdTVUVzNUFBUU1BMEdDU3FHU0liM0RRRUJDd1VBTUlHbk1Rc3dDUVlEVlFRRwpFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZUQVRCZ05WQkFvTURFNWxkRXh2WTJzZ1MyWjBMakUzCk1EVUdBMVVFQ3d3dVZHRnV3N3B6dzYxMGRzT2hibmxyYVdGa3c3TnJJQ2hEWlhKMGFXWnBZMkYwYVc5dUlGTmwKY25acFkyVnpLVEUxTURNR0ExVUVBd3dzVG1WMFRHOWpheUJCY21GdWVTQW9RMnhoYzNNZ1IyOXNaQ2tnUnNXUgpkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3hNakEyTVRVd09ESXhXakNCCnB6RUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJVd0V3WURWUVFLREF4T1pYUk0KYjJOcklFdG1kQzR4TnpBMUJnTlZCQXNNTGxSaGJzTzZjOE90ZEhiRG9XNTVhMmxoWk1PemF5QW9RMlZ5ZEdsbQphV05oZEdsdmJpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56CklFZHZiR1FwSUViRmtYUmhic082YzhPdGRIYkRvVzU1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeENSZWM3NUxiUlREb2ZUamw1QnUwakJGSGp6dVo5bGs0QnFLZjhvd3lvUGpJTUhqOURyVApsRjhhZkZ0dHZ6QlBoQ2Yybng5SnZNYVpDcER5RC9WL1E0UTNZMUdMZXFWdy9IcFl6WTZiN2NOR2JJUndYZHJ6CkFaQWovRTR3cVg3aEoyUG43V1E4b0xqSk0yUCtGcEQvc0xqOTE2akF3SlJEQzdiVldhYWVWdEFrSDNCNXI5czUKVkExbGRka1ZRWlFCcjE3czlvM3gvNjFrL2lDYTExenIvcVlmQ0dTamkzWlZyUjQ3S0dBdWh5WG9xcThmeG1SRwpJTGR3Znp6ZVNOdVdVN2M1ZCtRYTRzY1doSGFYV3krN0dSV0YrR21GOVptbnFmSTBwNm0ycGdQOGI0WTlWSHgyCkJKdHIrVUJkQURUSExwbDFuZVdJQTZwTitBUFNRbmJBR3dJREFLaUxvMFV3UXpBU0JnTlZIUk1CQWY4RUNEQUcKQVFIL0FnRUVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV6UHBuay9DMnVOQ2x3Qjd6VS8yTQpVOStEMTVZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLdC83aHdXcVp3OFVRQ2d3QkVJQmFlWjVtOEJpRlJoCmJ2RzVHSzFLcmY2QlFDT1VML3QxZkM4b1MySWtnWUlMOVdIeEhHNjRZVGpyZ2ZwaW9UdGFZdE9VWmNUaDVtMkMKK0M4bGNMSWhKc0Z5VVIrTUxNT0VrTU5hajdyUDlLZGxwZXVZMGZzRnNrWjFGU05xYjRWak1JRHcxWjRmS1J6QwpiTEJRV1YyUVd6dW9EVERQdjMxL3p2R2RnNzNKUm00Z3B2bGhVYm9oTDN1K3BSVmpvZFNWaC9HZXVmT0o4ejJGCnVMamJ2clc1S2ZuYU53VUFTWlFEaEVUbnYwTXh6M1dMSmRIMHBtVDFrdmFyQmVzOTZhVUxObUxhekFaZk5vdTIKWGpHNEt2dGU5bkhmUkNhZXhPWU5rYlF1ZFpXQVVXcExNS2F3WXFHVDhadll6c1JqZFQ5WlI3RT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIgojIFNlcmlhbDogMTAwMDAwMTIKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOmE1OjBmOmY4OjViOjlhOjdkOjZkOjMwOmFlOjU0OjVhOmUzOjQyOmEyOjhhCiMgU0hBMSBGaW5nZXJwcmludDogNTk6YWY6ODI6Nzk6OTE6ODY6Yzc6YjQ6NzU6MDc6Y2I6Y2Y6MDM6NTc6NDY6ZWI6MDQ6ZGQ6Yjc6MTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY2OjhjOjgzOjk0OjdkOmE2OjNiOjcyOjRiOmVjOmUxOjc0OjNjOjMxOmEwOmU2OmFlOmQwOmRiOjhlOmM1OmIzOjFiOmUzOjc3OmJiOjc4OjRmOjkxOmI2OjcxOjZmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGeWpDQ0E3S2dBd0lCQWdJRUFKaVdqREFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNzd0tRWURWUVFERENKVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnVW05dmRDQkRRU0F0SUVjeU1CNFhEVEE0TURNeU5qRXhNVGd4TjFvWApEVEl3TURNeU5URXhNRE14TUZvd1dqRUxNQWtHQTFVRUJoTUNUa3d4SGpBY0JnTlZCQW9NRlZOMFlXRjBJR1JsCmNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdUlGSnYKYjNRZ1EwRWdMU0JITWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTVZaNTI5MQpxajVMbkxXNHJKNEw1UG5aeXF0ZGo3VTVFSUxYcjFIZ08rRUFTR3JQMnVFR1F4R1pxaFFsRXEwaTZBQnRROFNwCnVPVWZpVXRudldGSTcvM1M0R0NJNWJrWVlDakRkeXV0c0RlcU45NWtXU3BHVitSTHVmZzNmTlUyNTREQnR2UFUKWjV1VzZNN1h4Z3BUMEd0Smx2T2pDd1YzU1BjbDVYQ3NNQlFnSmVOL2RWcmxTUGhPZXdNSEJQcUNZWWR1OER2RQpwTWZROVhRK3BWMGFDUEtiSmRMMnJBUW1QbFU2WWlpbGU3SXdyL2czd3RHNjFqajk5TzlKTURlWkppRkloUUdwCjVSYm4zSkJWM3cvb09NMlpOeUZQWGZVaWIyckZFaFpnRjFYeVpXYW1wekNST01FNEhZWUVoTG9hSlhoZW5hL00KVUdEV0U0ZFM3V01mYldWOXdoVVlkTXJoZm1RcGpITFlGaE45QzBsSzhTZ2JJSFJyeFQzZHNLcElDVDB1Z3BUTgpHbVhaSzRpYW1id1lmcC91ZldaOFByMlV1SUhPelpnd2VNRnZaOUMrWCtCbzdkN2lzY2tzV1hpU3F0OHJZR1B5CjVWNjU0OHI2ZjFDR1BxSTBHQXdKYUNnUkhPVGh1VncrUjdveVB4ak1XNFQxODJ0MHhISjA0ZU9Mb0VxOWpXWXYKNnEwMTJpRFRpSUpoOEJJaXRyelExYVRzcjFTSUpTUThwMjJ4Y2lrL1BsZW1mMVd2YmliRy91Zk1RRnhSUklFSwplTjVLemxXL0hkWFp0MWJ2OEhiL0MzbTFyNzM3cVdtUlJwZG9nQlEySGJOL3V5bVlOcVVnK29KZ1lqT2s3TmE2CkI2ZHV4YzhVcHVmV2tqVFlnZlg4SFYycVhCNzJvMDA3dVBjNUFnTUJBQUdqZ1pjd2daUXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekJTQmdOVkhTQUVTekJKTUVjR0JGVWRJQUF3UHpBOUJnZ3JCZ0VGQlFjQ0FSWXhhSFIwY0RvdgpMM2QzZHk1d2EybHZkbVZ5YUdWcFpDNXViQzl3YjJ4cFkybGxjeTl5YjI5MExYQnZiR2xqZVMxSE1qQU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSkZvTW9jVkhZbml0ZkdzTmlnMGpRdDhZb2pyTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQ0FRQ29RVXBuS3BLQmdsQnU0ZGZZc3prNzh3SVZDVkJSN3kyOUpIdUloanY1dEx5UwpDWmE1OXNDckkyQUdlWXdSVGxIU2VZQXorNTFJdnV4QlE0RWZma2RBSE9WNkNNcXFpM1d0Rk1UQzZHWThnZ2VuCjVpZUNXeGptRDI3WlVENktRaGdweHJSVy9GWVFvQVVYdlF3amYvU1Q3WndhVWI3ZFJVRy9rU1MwSDR6cFg4OTcKSVptZmxaODVPa1ljYlBuTmU1eVF6U2lweDZsVnU2eGlOR0kxRTBzVU9sV0R1WWFOa3FiRzlBY2xWTXdXVnhKSwpnbmpJRk5rWGdpWXRYU0FmZWE3KzFIQVdGcFdEMkRVNS8xSmRkUndXeFJOVnowZk1kV1ZTU3Q3d3NLZmtDcFlMCis2M0M0aVdFc3Qza3ZYNVpiSnZ3OE5qbnl2THBsemgraWI3TSt6a1hZVDl5MnpxUjJHVUJHUjJ0VUtSWENueEwKdkp4eGN5cEZVUm1Gekk3OVI2ZDBsUjJvMGE5T0Y3RnBKc0txZUZkYnhVMm41WjRGRjVUS3NsK2dTUmlOTk9rbQpiRWdlcW1pU0JlR0NjMXFiM0FkYkNHMTluZGVOSWRuOEZDQ3F3a1hmUCtjQXNsSGt3dmdGdVhrYWpEVHpubHZrCk4xdHJTdDhzVjRwQVdqYTYzWFZFQ0RkQ2NBeiszRjRob0tPS3dKQ2NhTnBRNWtVUVIzaTJUdEpseWNNMzMrRkMKWTdCWE4wVXRlNHFjdndYcVpWVXo5emtReFNncUlYb2Jpc1FrK1Q4VnlKb1ZJUFZWWXBidGJaTlF2T1NxZUszWgp5d3BsaDZabXdjU0JvM2M2V0I0TDdvT0xuUjdTVXFUTUhXK3dtRzJVTWJYNGNRcmN1Zng5TW1EbTY2K0tBUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Ib25na29uZyBQb3N0IFJvb3QgQ0EgMSBPPUhvbmdrb25nIFBvc3QKIyBTdWJqZWN0OiBDTj1Ib25na29uZyBQb3N0IFJvb3QgQ0EgMSBPPUhvbmdrb25nIFBvc3QKIyBMYWJlbDogIkhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIgojIFNlcmlhbDogMTAwMAojIE1ENSBGaW5nZXJwcmludDogYTg6MGQ6NmY6Mzk6Nzg6Yjk6NDM6NmQ6Nzc6NDI6NmQ6OTg6NWE6Y2M6MjM6Y2EKIyBTSEExIEZpbmdlcnByaW50OiBkNjpkYTphODoyMDo4ZDowOTpkMjoxNTo0ZDoyNDpiNToyZjpjYjozNDo2ZTpiMjo1ODpiMjo4YTo1OAojIFNIQTI1NiBGaW5nZXJwcmludDogZjk6ZTY6N2Q6MzM6NmM6NTE6MDA6MmE6YzA6NTQ6YzY6MzI6MDI6MmQ6NjY6ZGQ6YTI6ZTc6ZTM6ZmY6ZjE6MGE6ZDA6NjE6ZWQ6MzE6ZDg6YmI6YjQ6MTA6Y2Y6YjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNRENDQWhpZ0F3SUJBZ0lDQStnd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFQmhNQ1NFc3gKRmpBVUJnTlZCQW9URFVodmJtZHJiMjVuSUZCdmMzUXhJREFlQmdOVkJBTVRGMGh2Ym1kcmIyNW5JRkJ2YzNRZwpVbTl2ZENCRFFTQXhNQjRYRFRBek1EVXhOVEExTVRNeE5Gb1hEVEl6TURVeE5UQTBOVEl5T1Zvd1J6RUxNQWtHCkExVUVCaE1DU0VzeEZqQVVCZ05WQkFvVERVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHIKYjI1bklGQnZjM1FnVW05dmRDQkRRU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBclA4NHR1bG1Ba25qb3JUaGtQbEFqM241NHIxNS9nSzk3aVNTSFNMMjJvVnlhZjdYUHduVTNaRzFBcHpRCmpWcmhWY05RaHJrcEpzTGoyYUR4YVFNb0lJQkZJaTFXcHp0VWxWWWlXUjhvM3g4Z1BXMmlOcjRqb0xGdXRiRW4KUHpsVENlcXJhdWgwc3NKbFhJNi9mTU40aE0yZUZ2ejFMazhnS2dpZmQvUEZIc1NhVW1ZZVNGN2pFQWFQSXBqaApaWTRiWFNObU83aWxNbEhJaHFxaHFaNS9kcFRDcG15M1FmRFZ5QVk0NXRRTTR2TTdURzFRak1TREo4RVRoRms5Cm5uVjB0dGdDWGpxUWVzQkNObkxzYWszYzc4UUEzeE1ZVjE4bWVNaldDbmwzdi9ldnQzYTVwUXVFRjEwUTZtL2gKcTVVUlgyMDhvMXhOZzF2eXN4bUtnSXNMaHdJREFRQUJveVl3SkRBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFRApNQTRHQTFVZER3RUIvd1FFQXdJQnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFEa2JWUEs3aWg5bGVnWXNDCm1FRUlqRXk4MnR2dUp4dUM1MnBGN0JhTFQ0V2c4N0p3dlZxV3VzcHViZTVHaTI3bktpNldzeGt6NjdTZnFMSTMKN3Bpb2w3WXV0bWNuMUtaSi9SeVRaWGFlUWkvY0lteWFUL0phRlRteGNkY3JVZWh0SEpqQTJTcjBvWUo3MWNsQgpvaU1CZERoVml3KzVMbWVpSUFRMzJwd0wweGNoNEkrWGVUUnZoRWdDSURNYjVqUkVuNUZ3OUlCZWhFUENLZEpzCkVoVGtZWTJzRUpDZWhGQzc4Slp2UlorSzg4cHNUL29ST2hVVlJzUE5INE5iTFVFUzdWQm5RUk05SWF1VWlxcE8KZk1HeCs2Zld0U2N2bDZ0dTRCM2kwUndzSDBUaS9MNlJvWno3MWlsVGM0YWZVOWhERGwzV1k0SnhIWUIweXZiaQpBbXZaV2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlU2lnbiBSb290Q0ExMSBPPUphcGFuIENlcnRpZmljYXRpb24gU2VydmljZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TZWN1cmVTaWduIFJvb3RDQTExIE89SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLgojIExhYmVsOiAiU2VjdXJlU2lnbiBSb290Q0ExMSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGI3OjUyOjc0OmUyOjkyOmI0OjgwOjkzOmYyOjc1OmU0OmNjOmQ3OmYyOmVhOjI2CiMgU0hBMSBGaW5nZXJwcmludDogM2I6YzQ6OWY6NDg6Zjg6ZjM6NzM6YTA6OWM6MWU6YmQ6Zjg6NWI6YjE6YzM6NjU6Yzc6ZDg6MTE6YjMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOjBmOmVlOmZiOjllOjNhOjU4OjFhOmQ1OmY5OmU5OmRiOjc1Ojg5Ojk4OjU3OjQzOmQyOjYxOjA4OjVjOjRkOjMxOjRmOjZmOjVkOjcyOjU5OmFhOjQyOjE2OjEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEYlRDQ0FsV2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRR0V3SktVREVyCk1Da0dBMVVFQ2hNaVNtRndZVzRnUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5d2dTVzVqTGpFY01Cb0cKQTFVRUF4TVRVMlZqZFhKbFUybG5iaUJTYjI5MFEwRXhNVEFlRncwd09UQTBNRGd3TkRVMk5EZGFGdzB5T1RBMApNRGd3TkRVMk5EZGFNRmd4Q3pBSkJnTlZCQVlUQWtwUU1Tc3dLUVlEVlFRS0V5SktZWEJoYmlCRFpYSjBhV1pwClkyRjBhVzl1SUZObGNuWnBZMlZ6TENCSmJtTXVNUnd3R2dZRFZRUURFeE5UWldOMWNtVlRhV2R1SUZKdmIzUkQKUVRFeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBL1hlcXBSeVFCVHZMVEpzegppMW9VUmFUbmtCYlIzMWZTSVJDa0YvM2ZyTllmcCtUYmZQZnMzN2dEMnBSWS9WMXlmSXcvWHdGbmRCV1c0d0k4Cmg5dXV5d0dPd3ZObXhvVkY5QUxHT3JWaXNxLzZuTCtrNXRTQU1KanpEYmFUajZuVTJEYnlzUHlLeWl5aEZUT1YKTWRyQUcvTHVZcG1HWXorLzNaTXFnNmgydVJNZnQ4NU9Rb1dQSXVjdUd2S1ZDYklGdFVST2Q2RWd2YW55VGdwOQpVSzMxQlExRlQwWngvU2crVS9zRTJDM1haUjFLRy9yUE83QXhtalZ1eUlzRzB3Q1I4cFFJWlV5eE5BWUFlb25pCjhNY0RXYy9WMXVpbk1yUG1tRUNHeGMwbkVvdk1lODYzRVR4aVlBY2pQaXRBYnBTQUNXMjJzMjkzYnpVSVVQc0MKaDhVK2lRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVXL2hOVDdLbGh0UTYwdkZqbXFDK0NmWlh0OTR3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCCkFLQ2hPQlptTHFkV0h5R2NCdm9kN2JraXhUZ20yRTVQN0tOL2VkNUdJYUdIZDQ4SENKcXlwTVd2RHpLWUMzeG0KS2JhYmZTVlNTVU9yVEM0cmJucHdyeFlPNHdKcyswTG1HSjFGMkZYSTZEdmQ1K0gwTGdzY05GeHNXRXI3akloUQpYNVVjdisycklyVmxzNFc2bmcrNHJlVjZHNHBRT2gyOURieDdWRkFMdVVLdlZhQVlnYTFsbWUrKzVKeS94SVdyClFiSlViOXdsemUxNDRvNE1qUWxKM1dON1dtbVdBaUdvdlZKWjZYMDF5OGhTeW4rQi90bHIwL2NSN1NYZitPZjUKcFBweWw0UlREYVhRTWhoUmRsa1ViQS9yN0YrQWpIVkRnOE9GbVA5TW5pME41SGVEazA2MWxnZUxLQk9iakJtTgpRU2RKUU83ZTVpTkVPZHloSXRhNkEvST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSBPPU1pY3Jvc2VjIEx0ZC4KIyBTdWJqZWN0OiBDTj1NaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkgTz1NaWNyb3NlYyBMdGQuCiMgTGFiZWw6ICJNaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkiCiMgU2VyaWFsOiAxNDAxNDcxMjc3NjE5NTc4NDQ3MwojIE1ENSBGaW5nZXJwcmludDogZjg6NDk6ZjQ6MDM6YmM6NDQ6MmQ6ODM6YmU6NDg6Njk6N2Q6Mjk6NjQ6ZmM6YjEKIyBTSEExIEZpbmdlcnByaW50OiA4OTpkZjo3NDpmZTo1YzpmNDowZjo0YTo4MDpmOTplMzozNzo3ZDo1NDpkYTo5MTplMTowMTozMTo4ZQojIFNIQTI1NiBGaW5nZXJwcmludDogM2M6NWY6ODE6ZmU6YTU6ZmE6Yjg6MmM6NjQ6YmY6YTI6ZWE6ZWM6YWY6Y2Q6ZTg6ZTA6Nzc6ZmM6ODY6MjA6YTc6Y2E6ZTU6Mzc6MTY6M2Q6ZjM6NmU6ZGI6ZjM6NzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVDakNDQXZLZ0F3SUJBZ0lKQU1KK1F3Uk9SejhaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdDTVFzd0NRWUQKVlFRR0V3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MApaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnZjMlZqSUdVdFUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHCkNTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1b2RUQWVGdzB3T1RBMk1UWXhNVE13TVRoYUZ3MHkKT1RFeU16QXhNVE13TVRoYU1JR0NNUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReApGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXRVM3BwCloyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW8KZFRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT240ai9OanJkcUcyS2ZnUXZ2UAprZDZtSnZpWnBXTndyWnV1eWpOQWZXMldicUVPUk83aEU1MlVRbEthdlhXRmRDeW9EaDJUdGhpM2pDeW96L3RjCmNibmE3UDdvZm8va0x4MnlxSFdIMkxlaDVUdlBtVXBHMElNWmZjQ2hFaHlWYlVyMDJNZWxUVE11aFRsQWRYNFUKZklBU21GREhRV2U0b0lCaFZLWnNUaC9nblE0SDZjbTZNK2Yrd0ZVb0xBS0FweG4xbnR4VlV3T1hld2RJLzVuNwpONG9reEZuTVVCQmpqcXFwR3JDRUdvYjVYN3V4VUc2azBRck0xWEYrSDZjYmZQVlRiaUpmeXl2bTFIeGRydGJDCnhremxCUUhaN1ZmOHdTTjUvUHJJSklPVjg3VnFVUUhRZDlicEVxSDVHb1A3Z2h1NXNKZjBkZ1l6UTBtZy93dTEKK3JVQ0F3RUFBYU9CZ0RCK01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwRwpBMVVkRGdRV0JCVExEOGJmUWtQTVBjdTFTQ09oR25xbUtyczBhREFmQmdOVkhTTUVHREFXZ0JUTEQ4YmZRa1BNClBjdTFTQ09oR25xbUtyczBhREFiQmdOVkhSRUVGREFTZ1JCcGJtWnZRR1V0YzNwcFoyNXZMbWgxTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQkFRREowUTVlTHRYTXMzdyt5L3c5L3cwb2xaTUV5TC9helhtNFE1RHdwTDd2OHU4aAptTHpVMUYwRzl1NUM3REJzb0txcHl2R3Zpdm8vQzNOcVB1b3VRSDRmcmxSaGVlc3VDRGZYSS9PTW43NGRzZUdrCmRkdWc0bFFVc2JvY0thUVk5aEs2b2hRVTR6RTF5RUQvdCtBRmRsZkJIRm55K0wvazdTVmlYSVR3Zm40ZnM3NzUKdHlFUnpBTUJWbkNuRUpJZUd6U0JIcTJjR3NNRVBPMENZZFllQnZOZk9vZnlLL0ZGaCtVOXJOSEhWNFM5YTY3YwoyUG0yRzJKd0N6MDJ5VUx5TXRkNlllYlMyejNQeUtuSm05emJXRVRYYnppdmYzalRvNjBhZGJvY3dUWjhqeDV0CkhNTjFScTQxQmFiMlhEMGg3bGJ3eVlJaUxYcFVxM0REZlNKbGduQ1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjMKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTc1OTQyNjIwOTk1NAojIE1ENSBGaW5nZXJwcmludDogYzU6ZGY6Yjg6NDk6Y2E6MDU6MTM6NTU6ZWU6MmQ6YmE6MWE6YzM6M2U6YjA6MjgKIyBTSEExIEZpbmdlcnByaW50OiBkNjo5Yjo1NjoxMTo0ODpmMDoxYzo3NzpjNTo0NTo3ODpjMTowOToyNjpkZjo1Yjo4NTo2OTo3NjphZAojIFNIQTI1NiBGaW5nZXJwcmludDogY2I6YjU6MjI6ZDc6Yjc6ZjE6Mjc6YWQ6NmE6MDE6MTM6ODY6NWI6ZGY6MWM6ZDQ6MTA6MmU6N2Q6MDc6NTk6YWY6NjM6NWE6N2M6ZjQ6NzI6MGQ6Yzk6NjM6YzU6M2IKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEcKQTFVRUN4TVhSMnh2WW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpNeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcApaMjR4RXpBUkJnTlZCQU1UQ2tkc2IySmhiRk5wWjI0d0hoY05NRGt3TXpFNE1UQXdNREF3V2hjTk1qa3dNekU0Ck1UQXdNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpWVd4VGFXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUcKQTFVRUNoTUtSMnh2WW1Gc1UybG5iakVUTUJFR0ExVUVBeE1LUjJ4dlltRnNVMmxuYmpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU13bGRwQjVCbmdpRnZYQWc3YUV5aWllL1FWMkVjV3RpSEw4ClJnSkR4N0tLblFSZkpNc3VTK0ZnZ2tiaFVxc01nVWR3Yk4xazBldjFMS01QZ2owTUs2NlgxN1lVaGhCNXV6c1QKZ0hlTUNPRkowbXBpTHg5ZStwWm8zNGtubFRpZkJ0Yyt5Y3NtV1ExejNyREk2U1lPZ3hYRzcxdUwwZ1JneWttbQpLUFpwTy9iTHlDaVI1WjJLWVZjM3JIUVUzSFRnT3U1eUx5NmMrOUM3di9VOUFPRUdNK2lDSzY1VHBqb1djNHpkClFRNGdPc0MwcDZIcHNrK1FMakpnNlZmTHVRU1NhR2psT0NaZ2RiS2ZkLytSRk8rdUlFbjhyVUFWU05FQ01XRVoKWHJpWDc2MTN0MlNhZXI5ZndSUHZtMkw3RFd6Z1ZHa1dxUVBhYnVtRGszRjJ4bW1GZ2hjQ0F3RUFBYU5DTUVBdwpEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZJL3dTMytvCkxrVWtyazFRK21PYWk5N2kzUnU4TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCTFFOdkFVS3IreUF6djk1WlUKUlVtN2xnQUpRYXl6RTRhR0tBY3p5bXZtZExtNkFDMnVwQXJUOWZIeEQ0cS9jMmRLZzhkRWUzamdyMjVzYndNcApqak01UmNPTzVMbFhiS3I4RXBic1U4WXQ1Q1JzdVpSais5eFRhR2RXUG9PNHp6VWh3OGxvL3M3YXdsT3F6SkNLCjZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUViZGRUS0pkKzgyY0VIaFhYaXBhMDA5NU1KNlJNRzNOemR2UVgKbWNJZmVnN2pMUWl0Q2h3cy96eXJWUTRQa1g0MjY4TlhTYjdoTGkxOFlJdkRRVkVUSTUzTzl6SnJsQUdvbWVjcwpNeDg2T3lYU2hrRE9PeXlHZU1saEx4UzY3dHRWYjkrRTdnVUpUYjBvMkhMTzAySlFaUjdya3BlRE1kbXp0Y3BICldEOWYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAojIFN1YmplY3Q6IENOPUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAojIExhYmVsOiAiQXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4IgojIFNlcmlhbDogNjA0NzI3NDI5NzI2Mjc1Mzg4NwojIE1ENSBGaW5nZXJwcmludDogNzM6M2E6NzQ6N2E6ZWM6YmI6YTM6OTY6YTY6YzI6ZTQ6ZTI6Yzg6OWI6YzA6YzMKIyBTSEExIEZpbmdlcnByaW50OiBhZTpjNTpmYjozZjpjODplMTpiZjpjNDplNTo0ZjowMzowNzo1YTo5YTplODowMDpiNzpmNzpiNjpmYQojIFNIQTI1NiBGaW5nZXJwcmludDogMDQ6MDQ6ODA6Mjg6YmY6MWY6Mjg6NjQ6ZDQ6OGY6OWE6ZDQ6ZDg6MzI6OTQ6MzY6NmE6ODI6ODg6NTY6NTU6M2Y6M2I6MTQ6MzA6M2Y6OTA6MTQ6N2Y6NWQ6NDA6ZWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdGRENDQS95Z0F3SUJBZ0lJVSt3Nzd2dXlTRjh3RFFZSktvWklodmNOQVFFRkJRQXdVVEVMTUFrR0ExVUUKQmhNQ1JWTXhRakJBQmdOVkJBTU1PVUYxZEc5eWFXUmhaQ0JrWlNCRFpYSjBhV1pwWTJGamFXOXVJRVpwY20xaApjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTJNall6TkRBMk9EQWVGdzB3T1RBMU1qQXdPRE00TVRWYUZ3MHpNREV5Ck16RXdPRE00TVRWYU1GRXhDekFKQmdOVkJBWVRBa1ZUTVVJd1FBWURWUVFERERsQmRYUnZjbWxrWVdRZ1pHVWcKUTJWeWRHbG1hV05oWTJsdmJpQkdhWEp0WVhCeWIyWmxjMmx2Ym1Gc0lFTkpSaUJCTmpJMk16UXdOamd3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURLbG11TzZ2ajc4YUkxNEg5TTJ1RERVdGQ5CnRoRElBbDZ6UXlyRVQycXl5aHhkS0pwNEVScHBXVmV2dFNCQzVJc1A1dDlicGdPU0wvVVI1R0xYTW5FNDJRUU0KY2FzOVVYNFBCOTlqQlZ6cHY1UnZ3U21Dd0xUYVViREJQTHV0TjBwY3l2RkxOZzRrcTcvRGhIZjlxRkQwc2VmRwpMOUl0V1kxNkNrNldhVklDcWphWTdQejZGSU1NTngvSmtqZC8xNEV0NWNTNTRENDAvbWYwUG1iUjAvUkF6MTVpCk5BOXdCajRnR0ZyTzkzSWJKV3lUZEJTVG8zT3hEcXFIRUNOWlh5QUZHVWZ0YUk2U0VzcGQvTllyc3BJOElNL2gKWDY4Z3ZxQjJmM2JsN0JxR1lUTSs1M3UwUDZBUGpxSzVhbSs1aHladlFXeUlwbEQ5YW1NTDlaTVdHeG1Qc3UyYgptOG1ROVFFTTN4azlEejQ0SThrdmp3elJBdjRiVmRaTzBJMDhyMCtrOC82dkt0TUZuWGtJb2N0WE1iU2N5SkN5ClovUVlGcE02L0VmWTBYaVdNUis2S3d4ZlhabXRZNGxhSkNCMjJOLzlxMDZtSXFxZFh1WW5pbjFvS2FQbmlyamEKRWJzWExabWRFeVJHOThYaTJKK09mOGVQZEcxYXN1aHk5YXp1SkJDdEx4VGEveTJhUm5GSHZrTGZ1d0hiOUgvVApLSTh4V1Z2VHlRS210RkxLYnBmN1E4VUlKbStLOUx2OW55aXFEZFZGOHhNNkhkakFlSTlCWnp3ZWxHU3Vld3ZGCjZOa0JpRGthbDRaa1FkVTdod3h1K2cvR3ZVZ1V2emxOMUo1QnRvK1dIV09XazltVkJuZ3hhSjQzQmp1QWlVVmgKT1NQSEcwU2pGZVVjK0pJd3V3SURBUUFCbzRIdk1JSHNNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUV3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSbHpldXJOUjRBUG43VmRNQWN0SE5IRGhwa0x6Q0JwZ1lEClZSMGdCSUdlTUlHYk1JR1lCZ1JWSFNBQU1JR1BNQzhHQ0NzR0FRVUZCd0lCRmlOb2RIUndPaTh2ZDNkM0xtWnAKY20xaGNISnZabVZ6YVc5dVlXd3VZMjl0TDJOd2N6QmNCZ2dyQmdFRkJRY0NBakJRSGs0QVVBQmhBSE1BWlFCdgpBQ0FBWkFCbEFDQUFiQUJoQUNBQVFnQnZBRzRBWVFCdUFHOEFkZ0JoQUNBQU5BQTNBQ0FBUWdCaEFISUFZd0JsCkFHd0Fid0J1QUdFQUlBQXdBRGdBTUFBeEFEY3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQmQ5b1BtMDNjWEYKNjYxTEpMV2hBcXZkcFloS3NnOVZTeXRYakR2bE1kMyt4REx4NTF0a2xqWXlHT3lsTW5mWDQwUzJ3QkVxZ0xrOQphbTU4bTlPdC9NUFdvK1prS1h6UjRUZ2VnaXYvSjJXdit4WVZ4QzV4aE9XMS8vcWtSNzFrTXJ2MkpZU2lKMEwxCklMRENFeEFSelJBVnVrS1FLdEpFNFpZbTZ6RklFdjBxMnNrR3ozUWVxVXZWaHlqNWVUU1NQaTVFNlBhUFQ0ODEKUHlXek9keGpLcEJySUYvRVVoSk9seXdxckoyWDNranlvMmJid3RLRGxhWm1wNTRsRCtrTE01RmxDbHJEMlZRUwozYS9EVGc0ZkpsNE4zTE9ON05XQmNON1NUeVFGODJ4TzlVeEpabzNSLzlJTEpVRkkvbEdFeGtLdmdBVFAwSDVrClNlVHkzNkxzc1V6QUtoM250TEZsb3NTODhaajBxbkFIWTdTNDJqdE0ra0FpTUZzUnB2QUZEc1lDQTBpcmhwdUYKM2R2ZDZxSjJnSE45OVp3RXhFV041N2tjaTU3cTEzWFJjckhlZFVUblFuM2lWMnQ5M0ptOFBZTW82b0NUamNWTQpaY0Z3Z2JnNC9FTXhzdllETkVleXJQc2lCc3NlM1JkSEhGOW11ZE1hb3RvUnNhUzhJOG5rdm9mL3VaUzIrRjBnClN0UmY1NzFvZTJYeUZSN1NPcWt0NmRockpLeVhXRVJIclZrWThTRmxjTjdPTkdDb1FQSHpQS1RES0NPTS9pY3oKUTBDZ0Z6enI2anV3Y3FhanVVcExYaFpJOUxLOHlJeVN4WjJmckhJMnZEU0FOR3VwaTVMQXVCZnQ3SFpUOVNRQgpqTE1pNkV0OFZjYWQrcU1VdTJXRmJtNVBFbjRLUEoyVgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SXplbnBlLmNvbSBPPUlaRU5QRSBTLkEuCiMgU3ViamVjdDogQ049SXplbnBlLmNvbSBPPUlaRU5QRSBTLkEuCiMgTGFiZWw6ICJJemVucGUuY29tIgojIFNlcmlhbDogOTE3NTYzMDY1NDkwMzg5MjQxNTk1NTM2Njg2OTkxNDAyNjIxCiMgTUQ1IEZpbmdlcnByaW50OiBhNjpiMDpjZDo4NTo4MDpkYTo1Yzo1MDozNDphMzozOTo5MDoyZjo1NTo2Nzo3MwojIFNIQTEgRmluZ2VycHJpbnQ6IDJmOjc4OjNkOjI1OjUyOjE4OmE3OjRhOjY1OjM5OjcxOmI1OjJjOmEyOjljOjQ1OjE1OjZmOmU5OjE5CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyNTozMDpjYzo4ZTo5ODozMjoxNTowMjpiYTpkOTo2Zjo5YjoxZjpiYToxYjowOTo5ZToyZDoyOTo5ZTowZjo0NTo0ODpiYjo5MTo0ZjozNjozYjpjMDpkNDo1MzoxZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjhUQ0NBOW1nQXdJQkFnSVFBTEMzV2haSVg3L2h5L1dMMXhubWZUQU5CZ2txaGtpRzl3MEJBUXNGQURBNApNUXN3Q1FZRFZRUUdFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2ClpXNXdaUzVqYjIwd0hoY05NRGN4TWpFek1UTXdPREk0V2hjTk16Y3hNakV6TURneU56STFXakE0TVFzd0NRWUQKVlFRR0V3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1agpiMjB3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREowM3JLRHg2c3A0Ym9GbVZxCnNjSWJSVEp4bGRuK0VGdk1yK2VsZVFHUGljUEs4bFZ4OTNlK2Q1VHpjcVFzUk5pZWtwc1VPcUhuSkpBS0NsYU8KeGRnbWxPSFpTT0V0UHRvS2N0MmptUlhhZ2FLSDlIdHVKbmVKV0szVzZ3eXlRWHB6Ym0zYmVuaEI2UWlJRW42SApMbVlSWTJ4VSt6eWRjc0M4THYvQ3Q5ME5kdU02MS9lMGFMNmk5ZU9CYnNGR2IxMk40RTNHVkZXSkdqTXhDckZYCnVhT0ttTVBzT3pURmxVRnBmblhDUENERllicFJSNkFna0pPaGtFdnpUbnlGUlZTYTBRVW1RYkMxVFIwenZzUUQKeUNWOHdYRGJPL1FKTFZRblNLd3Y0Y1NzUHNqTGtreFRPVGNqN05NQitlQUpSRTFOWk1EaERWcUhJcnl0RzZQKwpKclVWODZmOGhCbnA3S0dJdEVScGhJUHppZEYwQnFuTUM5YkMzaWVGVUNiS0Y3akplb2RXTEJvQkhteStFNjBRCnJMVWs5VGlSb2RaTDJ2RzcwdDVIdGZHOGdmWlphODhaVSttTkZjdEt5Nmx2Uk9VYlFjL2hocWZLMEdxZnZFeU4KQmpOYW9vWGxrRFdnWWx3V1R2RGpvdm9ER3JRc2NiTllMTjU3QzlzYUQrdmVJUjhHZHdZRHNNbnZtZnpBdVU4TApoaWorMHJucTQ5cWx3MGRwRXVEYjhQWVppKzE3Y05jQzF1MkhHQ2dzQkNSTWQrUklpaHJHTzVyVUQ4cjZkZElCClFGcU5lYitMejB2UHFoYkJsZVN0VElvK0Y1SFVzV0xsZ3VXQUJLUURmbzIvMm4raUQ1ZFBETk1OKzlmUjVYSisKSE1oMy8xdWFEN2V1QlVibDhhZ1c3RWVrRndJREFRQUJvNEgyTUlIek1JR3dCZ05WSFJFRWdhZ3dnYVdCRDJsdQpabTlBYVhwbGJuQmxMbU52YmFTQmtUQ0JqakZITUVVR0ExVUVDZ3crU1ZwRlRsQkZJRk11UVM0Z0xTQkRTVVlnClFUQXhNek0zTWpZd0xWSk5aWEpqTGxacGRHOXlhV0V0UjJGemRHVnBlaUJVTVRBMU5TQkdOaklnVXpneFF6QkIKQmdOVkJBa01Pa0YyWkdFZ1pHVnNJRTFsWkdsMFpYSnlZVzVsYnlCRmRHOXlZbWxrWldFZ01UUWdMU0F3TVRBeApNQ0JXYVhSdmNtbGhMVWRoYzNSbGFYb3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdIUVlEVlIwT0JCWUVGQjBjWlE2bzhpVjd0SkhQNUxHeDVyMVZkR3dGTUEwR0NTcUdTSWIzRFFFQkN3VUEKQTRJQ0FRQjRwZ3dXU3A5TWlEckF5dzZsRm4yZnVVaGZHSThOWWpiMnpSbHJyS3ZWOXBGOXJuSHpQN01PZUlXYgpsYVFuSVVkQ1NueElPdlZGZkxNTWpsRjRySlVUM3NiOWZiZ2FrRXlya2dQSDdVSUJ6Zy9Zc2ZxaWt1RmdiYTU2CmF3bXF4aW51YUVsbk1JQWtlakVXT1Z0KzhSd3UzV3dKcmZJeHdZSk91YnY1dnI4cWhUL0FRS002V2Z4WlN6d28KSk51MEZYV3VEWWk2TG5QQXZWaUg1VUx5NjE3dUhqQWltY3MzMGNRaGJJSHN2bTBtNWh6a1FpQ2VSN0NzZzFsdwpMRFhXcnpZMHRNMDcrREtvNytONGlmdU5SU3phbkxoK1FCeGg1ejZpa2l4TDhzMzZtTFlwLy9QeWU2a2ZMcUNUClZ5dmVoUVA1YVRmTG5uaHFCYlRGTVhpSjdIcW5oZUc1ZXp6ZXZoNTVoTTZmY0E1WndqVXVrQ294MmVSRmVrR2sKTGhPYk5BNW1lMG1yWkpmUVJzTjVuWEpRWTZhWVd3YTlTRzNZT1lOdzZEWHdCZEdxdk9QYnlBTHFmUDJDMnNKYgpVald1bURxdHVqV1RJNmNmU04wMVJwaXlFR2prcFRIQ0NsZ3VHWUVReVZCMS9PcGFGczRSMSs3dlVJZ3RZZjgvClFuTUZsRVBWamp4T0FUb1pwUjlHVG5mUVhlV0JJaUdIL3BSOWhOaVRyZFpvUTBpeTIrdHpKT2VSZjFTa3RvQSsKbmFNOFRITENWOFNnMU13NEo4N1ZCcDZpU05ucG44NkNjRGFUbWp2ZmxpSGpXYmNNMnBFMzhQMVpXck9aeUdscwpReVlCTldOZ1ZZa0RPblhZdWtyWlZQL3Uzb0RZTGRFNDFWNHRDNWg5UG16Yi9DYUl4dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIFN1YmplY3Q6IENOPUNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgTGFiZWw6ICJDaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCIKIyBTZXJpYWw6IDExODA2ODIyNDg0ODAxNTk3MTQ2CiMgTUQ1IEZpbmdlcnByaW50OiA1ZTo4MDo5ZTo4NDo1YTowZTo2NTowYjoxNzowMjpmMzo1NToxODoyYTozZTpkNwojIFNIQTEgRmluZ2VycHJpbnQ6IDc4OjZhOjc0OmFjOjc2OmFiOjE0OjdmOjljOjZhOjMwOjUwOmJhOjllOmE4OjdlOmZlOjlhOmNlOjNjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNjozZTo0YTpmYTpjNDo5MTpkZjpkMzozMjpmMzowODo5Yjo4NTo0MjplOTo0NjoxNzpkODo5MzpkNzpmZTo5NDo0ZToxMDphNzo5Mzo3ZTplMjo5ZDo5Njo5MzpjMAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFR6Q0NCVGVnQXdJQkFnSUpBS1BhUW42a3NhN2FNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3VNUXN3Q1FZRApWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwCklIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzMKTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEtUQW5CZ05WQkFNVElFTm9ZVzFpWlhKegpJRzltSUVOdmJXMWxjbU5sSUZKdmIzUWdMU0F5TURBNE1CNFhEVEE0TURnd01URXlNamsxTUZvWERUTTRNRGN6Ck1URXlNamsxTUZvd2dhNHhDekFKQmdOVkJBWVRBa1ZWTVVNd1FRWURWUVFIRXpwTllXUnlhV1FnS0hObFpTQmoKZFhKeVpXNTBJR0ZrWkhKbGMzTWdZWFFnZDNkM0xtTmhiV1Z5Wm1seWJXRXVZMjl0TDJGa1pISmxjM01wTVJJdwpFQVlEVlFRRkV3bEJPREkzTkRNeU9EY3hHekFaQmdOVkJBb1RFa0ZESUVOaGJXVnlabWx5YldFZ1V5NUJMakVwCk1DY0dBMVVFQXhNZ1EyaGhiV0psY25NZ2IyWWdRMjl0YldWeVkyVWdVbTl2ZENBdElESXdNRGd3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN2QU10d055dUFXa282YkhpVWZhTi9HaC8yTmRXOQoyOHNOUkhJK0pyS1FVcnBqT3loWWI2V3piWlNtODkxa0RGWDI5dWZ5SWlLQVh1Rml4cllwNFlGczhyL2xmVEpxClZLQXlHVm4rSDR2WFBXQ0doU1J2NHhHemR6NGdsalVoYTdNSTJYQXVaUGVFa2xQV0RyQ1Fpb3JqaDQwRzA3MlEKRHVLWm9SdUdEdHFhQ3JzTFlWQUdVdkdlZjNic3l3L1FIZzNQbVRBOUhNUkZFRmlzMXRQbzErWHF4UUVIZDlaUgo1Z04vaWtpbFRXaDF1ZW04bms0WmNmVXlTNXh0WUJrTCs4eWRkZHkvSnMyUGszZzVlWE5lSlE3S1hPdDNFZ2ZMClpFRkhjcE9yVU1QckNYWmtOTkk1dDNZUkNRMTJSY1NwcmoxcXI3VjlaUytVV0JEc1hIeXZmdUsyR05uUW0wNWEKU2QrcFpndk1QTVo0ZktlY0hlUE9qbE8rQmQ1Z0QydmxHdHMvNCtFaHlTbkI4ZXNIbkZJYkFVUlJQSHNsMThUbApVbFJkSlFmS0ZpQzRyZVJCN25vSS9wbHZnNmFSQXJCc05sVnE1MzMxbHViS2dkYVg4WlNENmUyd3NXc1NhUjZzCisxMnB4WmpwdEZ0WWVyNDlva1E2WTFuVUN5WGVHMCs5NVFHZXpkSXAxWjhYR1FwdnZ3eVEwd2xmMmVPS05jeDUKV2swWk41SzN4TUd0ci9SNUpKcXlBUXV4cjF5Vzg0QXkrMXc5bVBHZ1AwcmV2cStVTHRsVm1oZHVZSjFqYkxoagp5YTZCWEJnMTRKQzd2anhQTnlLNWZ1dlBubmNocGowNGdmdEkyakU5SytPSjlkQzF2WDdnVU1RU2liTWptaEF4CmhkdXViKzg0TXhoMkVRSURBUUFCbzRJQmJEQ0NBV2d3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCRERBZEJnTlYKSFE0RUZnUVUrU1NzRDdLMStIbkErbUNJRzhUWlRRS2VGeGt3Z2VNR0ExVWRJd1NCMnpDQjJJQVUrU1NzRDdLMQorSG5BK21DSUc4VFpUUUtlRnhtaGdiU2tnYkV3Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOCllXUnlhV1FnS0hObFpTQmpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXQKTDJGa1pISmxjM01wTVJJd0VBWURWUVFGRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeQpabWx5YldFZ1V5NUJMakVwTUNjR0ExVUVBeE1nUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0CklESXdNRGlDQ1FDajJrSitwTEd1MmpBT0JnTlZIUThCQWY4RUJBTUNBUVl3UFFZRFZSMGdCRFl3TkRBeUJnUlYKSFNBQU1Db3dLQVlJS3dZQkJRVUhBZ0VXSEdoMGRIQTZMeTl3YjJ4cFkza3VZMkZ0WlhKbWFYSnRZUzVqYjIwdwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBSkFTcnlJMXdxTTU4QzdlNmJYcGVIeEl2ajk5UlpKZTZkcXhHZndXClBKKzBXMmFlYXVmRHVWMkk2QSt0enlNUDNpVTZYc3hQcGNHMUxhd2swbGdIM3FMUGFZUmdNK2dRRFJPcEk5Q0YKNVk1N3BwNDljaE55TS9XcWZjWmpId2owL2dGL0pNOHJMRlFKM3VJcmJaTEdPVThXNmp4K2VrYlVSV3BHcU90MQpnbGFucTZCOGFCTXo5cDB3OEc4bk9TUWpLcEQ5a0NrMThwUGZOS1hHOS9qdmpBOWlTbnl1MC9WVStJMjJtbGFICkZvSTZNNnRhSWdqM2dycnFMdUJIbXJTMVJhTUZPOW5jTGtWQU8rcmNmK2c3NjlIc0p0ZzFwRERGT3F4WG5yTjIKcFNCNytSNUtCV0lCcGloMVlKZVNEVzQrVFRkRERaSVZuQmdpelZHWm9Da2FQRitLTWpOYk1NZUpMMGVZRDZNRAp4dmJ4ck44eThObUJHdVNjdmZhQUZQRFJMTG1GOWRpanNjaWxJZVVjRTVmdURyM2ZLYW52TkZOYjArUnFFNFFHCnRqSUN4Rkt1SXRMY3NpRkNHdHBBOENuSjdBb01YT0xRdXN4STB6Y0t6QklLaW5td1BRTi9hVXYwTkNCOXN6VHEKamt0azlUNzlzeU5uRlEwRXVQQXR3UWxSUExKc0ZmQ2xJOWVEZE9UbExzbittQ2RDeHF2R25yRFFXemlsbTFEZQpmaGlZdFVVNzlubTA2UGNhZXdhRCs5Q0wycnZIdlJpckNHODhnR3RBUHhrWnVtV0s1cjdWWE5NMjErOUFVaVJnCk9HY0VNZXlQODRMRzNybFY4enN4a1ZyY3RRZ1ZyWFlsQ2cxN0xvZmlES1lHdkNZUWJUZWQ3TjE0akh5QXhmRFoKZDBqUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgU3ViamVjdDogQ049R2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgTGFiZWw6ICJHbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDgiCiMgU2VyaWFsOiAxNDU0MTUxMTc3MzExMTc4ODQ5NAojIE1ENSBGaW5nZXJwcmludDogOWU6ODA6ZmY6Nzg6MDE6MGM6MmU6YzE6MzY6YmQ6ZmU6OTY6OTA6NmU6MDg6ZjMKIyBTSEExIEZpbmdlcnByaW50OiA0YTpiZDplZTplYzo5NTowZDozNTo5Yzo4OTphZTpjNzo1MjphMToyYzo1YjoyOTpmNjpkNjphYTowYwojIFNIQTI1NiBGaW5nZXJwcmludDogMTM6NjM6MzU6NDM6OTM6MzQ6YTc6Njk6ODA6MTY6YTA6ZDM6MjQ6ZGU6NzI6Mjg6NGU6MDc6OWQ6N2I6NTI6MjA6YmI6OGY6YmQ6NzQ6Nzg6MTY6ZWU6YmU6YmE6Y2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhTVENDQlRHZ0F3SUJBZ0lKQU1uTjArblZmU1BPTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdzTVFzd0NRWUQKVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMApJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczCk1Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkQKYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQWVGdzB3T0RBNE1ERXhNak14TkRCYUZ3MHpPREEzTXpFeApNak14TkRCYU1JR3NNUXN3Q1FZRFZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5CmNtVnVkQ0JoWkdSeVpYTnpJR0YwSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUcKQTFVRUJSTUpRVGd5TnpRek1qZzNNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4SnpBbApCZ05WQkFNVEhrZHNiMkpoYkNCRGFHRnRZbVZ5YzJsbmJpQlNiMjkwSUMwZ01qQXdPRENDQWlJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTURmVnRQa09wdDJSYlFUMi8vQnRobUxOMEVZbFZKSDZ4ZWQKS1lpT05Xd0dNaTVIWXZOSkJMOTlSRGF4Y2N5OVdnbHoxZG1GUlArUlZ5WGZYamFPY05GY2NVTWQyZHJ2WE5MNwpHNzA2dGN1dG84eEVwdzJ1SVJVL3VYcGJrblhZcEJJNGlSbUt0NERTNGpKdlZweVIxb2dRQzdOMFpKSjBZUFAyCnp4aFBZTElqME1jN3ptRkxtWS9DRE5CQXNwamNEYWhPbzdrS3JtQ2dyVVZTWTdwbXZXamcrYjRhcUlHN0hrRjQKZGRQQi9nQlZzSWRVNkNlUU5SMU1NNjJYL0pjdW1JUy9MTW1qdjlHWUVSVHRZL2pLbUloWUY1bnRSUU9YZmp5RwpIb2lNdnZLUmhJOWxOTmdBVEgyM01SZGFLWG9LR0NRd296ZTFlcWtCZlNiVytRNk9XZkg5R3pPMUtUc1hPMEcyCklkM1V3RDJsbjU4ZlExREp1N3hzZXBlWTdzMk1IL3VjVWE2TGNMMG5uM0hBYTZ4OWtHYm8xMTA2RGJEVndvM1YKeUoyZHdXM1EwTDlSNU9QNHd6ZzJydGFuZGVhdmhFTmRrNUlNYWdmZU94MllJdGFzd1RYYm82QWwvM0sxZGgzZQpiZWtzWml4U2hOQkZrczRjNWVVekhkd0hVMVNqcW9JN21qY3YzTjJnWk9ubTNiMnUvR1NGSFR5bnlRYmVoUDlyCjZHc2FQTVdpczBMN2l3aytYd2hTeDJMRTFBVnh2OFJrNVBpaGcrZytFcHVvSHRRMlRTOXg5bzBvOW9PcEU5SmgKd1pHN1NNQTBqMEdNUzB6YmFSTC9VSlNjSUlOWmMrMThvZkx4L2QzM1NkTkRXS0JXWThvOVBlVTFWbG5wRHNvZwp6Q3RMa3lrUEFnTUJBQUdqZ2dGcU1JSUJaakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VNTUIwR0ExVWREZ1FXCkJCUzVDY3FjSHR2VGJEcHJydTFVOFZ1VEJqVXVYakNCNFFZRFZSMGpCSUhaTUlIV2dCUzVDY3FjSHR2VGJEcHIKcnUxVThWdVRCalV1WHFHQnNxU0JyekNCckRFTE1Ba0dBMVVFQmhNQ1JWVXhRekJCQmdOVkJBY1RPazFoWkhKcApaQ0FvYzJWbElHTjFjbkpsYm5RZ1lXUmtjbVZ6Y3lCaGRDQjNkM2N1WTJGdFpYSm1hWEp0WVM1amIyMHZZV1JrCmNtVnpjeWt4RWpBUUJnTlZCQVVUQ1VFNE1qYzBNekk0TnpFYk1Ca0dBMVVFQ2hNU1FVTWdRMkZ0WlhKbWFYSnQKWVNCVExrRXVNU2N3SlFZRFZRUURFeDVIYkc5aVlXd2dRMmhoYldKbGNuTnBaMjRnVW05dmRDQXRJREl3TURpQwpDUURKemRQcDFYMGp6akFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVkhTQUFNQ293CktBWUlLd1lCQlFVSEFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3RFFZSktvWkkKaHZjTkFRRUZCUUFEZ2dJQkFJQ0lmM0Rla2lqWkJaUkcvNUJYcWZFdjN4b05hL3A4RGh4SkpIa24yRWFxYnlsWgpVb2h3RXVyZFBmV2JVMVJ2NFdDaXFBbTU3T3RaZk1ZMThkd1k2ZkZuNWErNlJlQUozc3BFRDhJWERuZVJSWG96ClgxK1dMR2lMd1VlUG1Kczl3T3pMOWRXQ2tvUTEwYjQyT0ZaeU1WdEhMYW9YcEdOUjZ3b0JyWC9zZFo3TG9SL3gKZnhLeHVlUmtmMmZXSXlyMHVEbGRtT2docCtHOVBVSWFkSnB3cjJoc1VGMUp6Ly83RGwzbUxFZlhnVHBaQUxWegphMk1nOWpGRkNEa085SEIrUUhCYVA5QnJRcWwwUFNndkFtMTFjcFVKalVoanhzWWpWNUtUWGpYQmpma0s5eXlkClloejJyWHpkcGpFZXRySEhmb1VtK3FScXRkcGpNTkh2a3pleVppOTlCZmZudDB1WWxEWEEyVG9wd1oyeVVETWQKU3FsYXBza0Q3KzMwNTZodWlyUlhoT3VrUDlEdXFxcUhXMlBvaytKcnFOUzRjbmhyRyswNTVGM0xtNnFIMVU5TwpBUDdaYXA4OE1ROG9BZ0Y5bU9pbnNLSmtubm40U1BJVnFjem15RVRyUDNpWjhudHhQanp4bUtmRkdCSS81cnNvCk0wTHBSUXA4YmZLR2VTL0ZnaGw5Q1lsOHNsUjJpSzdld2ZQTTRXN2JNZGFUcnBtZzd5VnFjNWlKV3pvdUU0Z2UKdjhDU2xEUWI0eWUzaXg1dlF2L242VGViVUIwdG92a0M3c3RZV0RweHZHampxc0d2SENnZm90d2paVCtCNnE2WgowOWd3enhNTlR4WEpoTHluU0MzNE1DTjMyRVpMZVczMmpPMDZmMkFSZVBUcG02N1ZWTUIwZ05FTFFwL0IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1Hb0RhZGR5LmNvbSwgSW5jLgojIFN1YmplY3Q6IENOPUdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1Hb0RhZGR5LmNvbSwgSW5jLgojIExhYmVsOiAiR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDgwOjNhOmJjOjIyOmMxOmU2OmZiOjhkOjliOjNiOjI3OjRhOjMyOjFiOjlhOjAxCiMgU0hBMSBGaW5nZXJwcmludDogNDc6YmU6YWI6Yzk6MjI6ZWE6ZTg6MGU6Nzg6Nzg6MzQ6NjI6YTc6OWY6NDU6YzI6NTQ6ZmQ6ZTY6OGIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ1OjE0OjBiOjMyOjQ3OmViOjljOmM4OmM1OmI0OmYwOmQ3OmI1OjMwOjkxOmY3OjMyOjkyOjA4OjllOjZlOjVhOjYzOmUyOjc0OjlkOmQzOmFjOmE5OjE5OjhlOmRhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmd6RUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhHakFZQmdOVkJBb1QKRVVkdlJHRmtaSGt1WTI5dExDQkpibU11TVRFd0x3WURWUVFERXloSGJ5QkVZV1JrZVNCU2IyOTBJRU5sY25ScApabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6Ck5UazFPVm93Z1lNeEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUgKRXdwVFkyOTBkSE5rWVd4bE1Sb3dHQVlEVlFRS0V4RkhiMFJoWkdSNUxtTnZiU3dnU1c1akxqRXhNQzhHQTFVRQpBeE1vUjI4Z1JHRmtaSGtnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMOXhZZ2p4K2xrMDl4dkpHS1AzZ0VsWTZTS0QKRTZiRklFTUJPNFR4NW9WSm55ZnE5b1FiVHFDMDIzQ1l4eklCc1FVK0IwN3U5UHBQTDFrd0l1ZXJHVlpyNG9BSAovUE1XZFlBNVVYdmwrVFcyZEU2cGpZSVQ1TFkvcVFPRCtxSytpaFZxZjk0THc3WVpGQVhLNnNPb0JKUTdSbnd5CkRmTUFaaUxJaldsdE5vd1JHTGZUc2h4Z3REajZBb3pPMDkxR0I5NEtQdXRkZk1oOCs3QXJVNlNTWW1sUkpRVmgKR2tTQmpDeXBRNVlqMzZ3Nmdab09LY1VjcWVsZEhyYWVuakFLT2M3eGlJRDdTMTNNTXV5RllrTWxOQUpXSndHUgp0RHR3S2o5dXNlaWNpQUY5bjlUNTIxTnRZSjIvTE9kWXE3aGZSdnpPeEJzRFBBbnJTVEZjYVVhejRFY0NBd0VBCkFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUUKRkRxYWhRY1FaeWkyNy9hOUJVRnVJTUdVMmcvZU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ1oyMTE1MWZtWApXV2NEWWZGK093WXhkUzJoSUk1UFpZZTA5NmFjdk5qcEw5RGJXdTdQZEl4enREaEMyZ1Y3K0FKMXVQMmxzZGV1Cjl0ZmVFOHRURUg2S1J0R1grcmN1S3hHcmtMQW5nUG5vbjFycE41K3I1TjlzczRVWG5UM1pKRTk1a1RYV1h3VHIKZ0lPcm1nSXR0UkQwMkpESEJITkE3WElsb0ttZjdKNnJhQktaVjhhUEVqb0pwTDFFL1FZVk44R2I1REtqN1RqbwoyR1R6TEg0VS9BTHFuODMvQjJnWDJ5S1FPQzE2amRGVThXbmpYelBLZWoxN0N1UEtmMTg1NWVKMXVzVjJHRFBPCkxQQXZUSzMzc2VmT1Q2akVtMHBVQnNWL2ZkVUlEK0ljL240WHVLeGU5dFFXc2tNSkRFMzJwMnUwbVlSbHlucUkKNHVKRXZsejM2aHoxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBMYWJlbDogIlN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogZDY6Mzk6ODE6YzY6NTI6N2U6OTY6Njk6ZmM6ZmM6Y2E6NjY6ZWQ6MDU6ZjI6OTYKIyBTSEExIEZpbmdlcnByaW50OiBiNToxYzowNjo3YzplZToyYjowYzozZDpmODo1NTphYjoyZDo5MjpmNDpmZTozOTpkNDplNzowZjowZQojIFNIQTI1NiBGaW5nZXJwcmludDogMmM6ZTE6Y2I6MGI6Zjk6ZDI6Zjk6ZTE6MDI6OTk6M2Y6YmU6MjE6NTE6NTI6YzM6YjI6ZGQ6MGM6YWI6ZGU6MWM6Njg6ZTU6MzE6OWI6ODM6OTE6NTQ6ZGI6Yjc6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCanpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVApIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQU1US1ZOMFlYSm1hV1ZzClpDQlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXcKTUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNgpiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFRkR0Z5Wm1sbGJHUWdWR1ZqCmFHNXZiRzluYVdWekxDQkpibU11TVRJd01BWURWUVFERXlsVGRHRnlabWxsYkdRZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUwzdHdRUDg5by84QXJGdlc1OUkyWjE1NHFLM0EyRldHTU5IdHRmS1BUVXVpVVAzb1dtYjNvb2EvUk1nCm5MUkpkeklwVnYyNTdJemRJdnB5M0NkaGwrNzJXb1RzYmhtNWlTemNoRnZWZFB0clg4V0pwUkJTaVVaVjlMaDEKSE9aLzVGU3VTL2hWY2xjQ0dmZ1hjVm5ySGlnSGRNV2RTTDVzdFBTa3NQTmtOM21Td094R1huL2hiVk5NWXEvTgpId3RqdXpxZCsveDVBSmhoZE04bWdrQmo4N0p5YWhrTm1jclVEblhNTi91TGljRlo4V0ovWDdOZlpURDRwN2ROCmRsb2VkbDQwd09pV1ZwbUtzL0IvcE0yOTNESXhmSkhQNEY4UitHdXFTVnpSbVpUUm91TmpXd2wydFZaaTRVdDAKSFpiVUp0UUlCRm5RbUE0TzV0Nzh3K3dma1BFQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZId01NaCtuMlRCL3hIMW9vMktvb2M2ckIxc25NQTBHCkNTcUdTSWIzRFFFQkN3VUFBNElCQVFBUldmb2xUd052bEprN21oK0NoVG5VZGdXVVh1RW9rMjFpWFFuQ29LalUKc0hVNDhUUnFuZVNmaW9ZbVVlWXMwY1l0YnBVZ1NwSUI3TGlLWjNzeDRtY3VqSlVESmk1RG5Vb3g5ZzYxREx1Mwo0amQvSXJvQW93NTdVdnRydXp2RTAzbFJUczJROUdjSEdjZzhSbm9OQVgzRldPZHQ1b1V3RjVva3hCRGdCUGZnCjhuL1VxZ3IvUWgwMzdaVGxaRmtTSUhjNDB6SStPSUYxbG5QNmFJK3h5ODRmeGV6Nm5IN1Bmckh4QnkyMi9ML0sKcEwvUWx3Vkt2T29ZS0FLUXZWUjRDU0Z4MDlGOUhka1dzS2xoUGRBS0FDTDh4M3ZMQ1dSRkN6dEFnZmQ5ZkRMMQptTXBZam4wcTdwQlpjMlQ1Tm5SZUphSDFaZ1V1ZnprVnFTcjdVSXVPaFduMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgU3ViamVjdDogQ049U3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgTGFiZWw6ICJTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDE3OjM1Ojc0OmFmOjdiOjYxOjFjOmViOmY0OmY5OjNjOmUyOmVlOjQwOmY5OmEyCiMgU0hBMSBGaW5nZXJwcmludDogOTI6NWE6OGY6OGQ6MmM6NmQ6MDQ6ZTA6NjY6NWY6NTk6NmE6ZmY6MjI6ZDg6NjM6ZTg6MjU6NmY6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU2OjhkOjY5OjA1OmEyOmM4Ojg3OjA4OmE0OmIzOjAyOjUxOjkwOmVkOmNmOmVkOmIxOjk3OjRhOjYwOjZhOjEzOmM2OmU1OjI5OjBmOmNiOjJhOmU2OjNlOmRhOmI1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEN3pDQ0F0ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQm1ERUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1QKSEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE96QTVCZ05WQkFNVE1sTjBZWEptYVdWcwpaQ0JUWlhKMmFXTmxjeUJTYjI5MElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1Ck1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2daZ3hDekFKQmdOVkJBWVRBbFZUTVJBd0RnWUQKVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUZEdGeQpabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1Uc3dPUVlEVlFRREV6SlRkR0Z5Wm1sbGJHUWdVMlZ5CmRtbGpaWE1nVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOVU1Pc1FxK1U3aTliNFpsMStPaUZPeEh6L0x6NThnRTIwcApPc2dQZlR6M2EzWTRZOWsyWUtpYlhsd0FnTEl2V1gvMmgva2xRNGJuYVJ0U21wRGhjZVBZTFExT2IvYklTZG0yCjh4cFdyaXUyZEJUcnovc200eHE2SFpZdWFqdFlsSWxIVnY4bG9KTndVNFBhaEhRVXcyZWVCR2c2MzQ1QVdoMUsKVHM5RGtUdm5WdFlBY010UzdudDlyanJudkRINVJmYkNZTThUV1FJcmdNdzBSOSs1M3BCbGJRTFBMSkdtcHVmZQpoUmhKZkdaT296cHRxYlh1TkM2NkRRTzRNOTlINjdGcmpTWFptODZCMFVWR01wWndoOTRDRGtsRGhiWnNjN3RrCjZtRkJyTW5VVk4rSEw4Y2lzaWJNbjFsVWFKLzh2aW92eEZVY2RVQmdGNFVDVlRtTGZ3VUNBd0VBQWFOQ01FQXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSnhmQU4rcQpBZGN3S3ppSW9yaHRTcHp5RVpHRE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxOcWFFZDJuZE94bWZaeU1JCmJ3NWh5ZjJFM0YvWU5vSE4yQnRCTFo5ZzNjY2FhTm5SYm9iaGlDUFBFOTVEeitJMHN3U2RIeW5Wdi9oZXlOWEIKdmU2U2J6SjA4cEdDTDcyQ1FucXRLcmNnZlUyOGVsVVN3aFhxdmZkcWxTNXNkSi9QSExUeXhRR2poZEJ5UHExegpxd3ViZFF4dFJiZU9sS3lXTjdXZzBJOFZSdzdqNklQZGovM3ZRUUYzekNlcFlvVXo4amNJNzNIUGR3YmV5QmtkCmlFRFBmVVlkL3g3SDRjNy9JOXZHK28xVlRxa0M1MGNSUmo3MC9iMTdLU2E3cVdGaU55aTJMU3IyRUlaa3lYQ24KMHEyM0tYQjU2anphWXlXZi9XaTNNT3h3KzNXS3QyMWdaN0lleUxucDJLaHZBb3RuRFUwbVYzSGFJUHpCU2xDTgpzU2k2Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBDb21tZXJjaWFsIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBDb21tZXJjaWFsIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IENvbW1lcmNpYWwiCiMgU2VyaWFsOiA4NjA4MzU1OTc3OTY0MTM4ODc2CiMgTUQ1IEZpbmdlcnByaW50OiA4Mjo5MjpiYTo1YjplZjpjZDo4YTo2ZjphNjozZDo1NTpmOTo4NDpmNjpkNjpiNwojIFNIQTEgRmluZ2VycHJpbnQ6IGY5OmI1OmI2OjMyOjQ1OjVmOjljOmJlOmVjOjU3OjVmOjgwOmRjOmU5OjZlOjJjOmM3OmIyOjc4OmI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAwMzo3NjphYjoxZDo1NDpjNTpmOTo4MDozYzplNDpiMjplMjowMTphMDplZTo3ZTplZjo3Yjo1NzpiNjozNjplODphOTozYzo5Yjo4ZDo0ODo2MDpjOTo2Zjo1ZjphNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlkM2NHSnlhcHNYd3dEUVlKS29aSWh2Y05BUUVMQlFBd1JERUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6CmRDQkRiMjF0WlhKamFXRnNNQjRYRFRFd01ERXlPVEUwTURZd05sb1hEVE13TVRJek1URTBNRFl3Tmxvd1JERUwKTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acApjbTFVY25WemRDQkRiMjF0WlhKamFXRnNNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUE5aHRQWndjcm9SWDFCaUxMSHdHeTQzTkZCa1JKTEx0SkpSVFd6c08zcXl4UHhrRXlsRmY2RXFkYkR1S1AKSHg2R0dhZXF0UzI1WHcyS3dxK0ZOWGt5TGJzY1lqZnlzVnRLUGNyTmNWL3BRcjZVNk1qZStTSklaTWJscThZcgpiYTBGOFByVkM4K2E1ZkJRcElzN1I2VWpXM3A2K0RNL3VPK1psK01nd2RZb2ljK1UrN2xGN2VOQUZ4SFVkUEFMCk1lSXJKbXFiVEZldXJDQSt1a1Y2QmZPOW0ya1ZybjFPSUdQRU5YWTZCd0xKTi8zSFIrN284WFlkY3hYeWw2UzEKeUhwNTJVS3FLMzljL3M0bVQ2Tm1nVFd2UkxwVUhod3dNbVdkNWp5VFhsQk9ldU02MUc3TUd2djUwamV1SkNxcgpWd01pS0ExSmRYKzNLTnAxdjQ3ajNBNTVNUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVblpQR1U0dGV5cTgvCm54NFA1Wm1WdkNUMmxJOHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUoKS29aSWh2Y05BUUVMQlFBRGdnRUJBRmlzOUFRT3pjQU4vd3I5MUxvV1h5bTllMmlaV0VuU3RCMDNUWDhuZlVZRwpYVVBHaGk0K2M3SW1mVStUcWJiRUtwcXJJWmNVc2Q2TTA2dUpGZGhySk5UeEZxN1lwRnpVZjFHTzdSZ0JzWk5qCnZiejRZWUNhbnJIT1FuRGlxWDBHSlgwbm9mNXY3TE1lSk5yalMxVWFBRHMxdER2WjExMHcvWUVUaWZMQ0JpdnQKWjhTT3lVT3lYR3NWaVFLOFl2eE84clV6cXJKdjB3cWlVT1AyTytndVJNTGJaamlwTTFaSThXMGJNNDBOakQ5ZwpONTNUeW0xK05INE5uM0oyaXh1ZmN2MVNOVUZGQXBZdkhMS2FjMGtoc1VsSFJVZTA3Mm8wRWNsTm1zeFp0OVlDCm5scE9aYldVcmh2ZktiQVc4YjhBbmdjNkYyUzFCTFVqSVprS2xUdVhmTzg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBOZXR3b3JraW5nIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBOZXR3b3JraW5nIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IE5ldHdvcmtpbmciCiMgU2VyaWFsOiA4OTU3MzgyODI3MjA2NTQ3NzU3CiMgTUQ1IEZpbmdlcnByaW50OiA0Mjo2NTpjYTpiZTowMTo5YTo5YTo0YzphOTo4Yzo0MTo0OTpjZDpjMDpkNTo3ZgojIFNIQTEgRmluZ2VycHJpbnQ6IDI5OjM2OjIxOjAyOjhiOjIwOmVkOjAyOmY1OjY2OmM1OjMyOmQxOmQ2OmVkOjkwOjlmOjQ1OjAwOjJmCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwYTo4MTplYzo1YTo5Mjo5Nzo3NzpmMTo0NTo5MDo0YTpmMzo4ZDo1ZDo1MDo5Zjo2NjpiNTplMjpjNTo4ZjpjZDpiNTozMTowNTo4YjowZToxNzpmMzpmMDpiNDoxYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlmRThFT1J6VW1TMHdEUVlKS29aSWh2Y05BUUVGQlFBd1JERUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6CmRDQk9aWFIzYjNKcmFXNW5NQjRYRFRFd01ERXlPVEUwTURneU5Gb1hEVE13TVRJek1URTBNRGd5TkZvd1JERUwKTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acApjbTFVY25WemRDQk9aWFIzYjNKcmFXNW5NSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUF0SVRNTXhjdWE1UnNhMkZTb091anozbVVUT1dVZ0puTFZXUkVaWTluWk9JRzQxdzNTZll2bTRTRUhpM3kKWUowd1RzeUVoZUlzeng2ZS9qYXJNM2MxUk5nMWxobzlOdWg2RHRqVlI2RnFhWXZaL0xzNnJubGExZlRXY2J1YQprQ05ybXJlSWRJY01IbCs1bmkzNnExTXIzTHQyUHBOTUNBaU1IcUlqSE5ScXJTSzZtUUV1YldYTHZpUm1WU1JMClFFU3hHOWZod29YQTNoQS9QZTI0L1BIeEkxUGN2MldYYjluNVFIR05mYjJWMU02K29GNG5JOTc5cHRBbURnQXAKNnp4RzhEMWd2ejlRMHR3bVFWR2VGRGRDQktOd1Y2Z2JoKzB0K252dWpBcmpxV2FKR2N0QitkMUVObUhQNG5kRwp5SDMyOUpLQk52M2JOUEZ5ZnZNTUZyMjBGUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVQngvUzU1emF3bTZpClFMU3dlbEFRVUhURXlMMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBSWxYc2haNnFNTDkxdG1ibXpUQ25MUXlGRTJucE4vc3ZxZSsrRVBia1RmTwp0REl1VUZVYU5VNTJRM0VnNzVOM1RoVndMb2ZEd1IxdDNNdTFKOVFzVnRGU1V6cEUwblBJeEJzRlpWcGlrcHp1ClFZMHgyK2MwNmxraDFRRjYxMlM0WkRuTnllMnY3VXNEU0tlZ21RR0EzR1dqTnE1bFdVaFBna3ZJWmZGWEhlVloKTGdvL2JOalI5ZVVKdEd4VUFBcmdGVTJIZFcyM1dKWmEzVzNTQUtEMG0waSt3emVrdWpiZ2ZJZUZseG9Wb3Q0dQpvbHU5cnhqNWtGRE5jRm40SjJkSHk4ZWdCenA5MFN4ZGJCazZaclY5L1pGdmdyRytDSlBiRkVmeG9qZkhSWjQ4CngzZXZaS2lUMy9acGc0Smc4a2xDTk8xYUFGU0ZIQlkya2d4YytxYXR2OXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IFByZW1pdW0iCiMgU2VyaWFsOiA3ODkzNzA2NTQwNzM0MzUyMTEwCiMgTUQ1IEZpbmdlcnByaW50OiBjNDo1ZDowZTo0ODpiNjphYzoyODozMDo0ZTowYTpiYzpmOTozODoxNjo4Nzo1NwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmE2OjMzOjJjOmUwOjAzOjZmOmIxOjg1OmY2OjYzOjRmOjdkOjZhOjA2OjY1OjI2OjMyOjI4OjI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3MDphNzozZjo3ZjozNzo2Yjo2MDowNzo0Mjo0ODo5MDo0NTozNDpiMToxNDo4MjpkNTpiZjowZTo2OTo4ZTpjYzo0OTo4ZDpmNToyNTo3NzplYjpmMjplOTozYjo5YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJqQ0NBeTZnQXdJQkFnSUliWXdVUnJHbUN1NHdEUVlKS29aSWh2Y05BUUVNQlFBd1FURUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6CmRDQlFjbVZ0YVhWdE1CNFhEVEV3TURFeU9URTBNVEF6TmxvWERUUXdNVEl6TVRFME1UQXpObG93UVRFTE1Ba0cKQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVQpjblZ6ZENCUWNtVnRhWFZ0TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUF4QkxmCnFWLytRZDNkOVorSzQvYXM0VHg0bXJ6WThIOTZvRE1xM0kwZ1c2NHRiK2VUMlRad2FtalBqbEdqaFZ0bkJLQVEKSkc5ZEtJTEJsMWZZU0NrVHR1RytrVTNmaFF4VEdKb2VKS0pQai9DaWhRdkw5Q2wvMHFSWTdpWk55YXFvZTVyWgoramplUkZjVjVmaU15TmxJNGcwV0p4MGV5SU9GSmJlNnFsVkJ6QU1pU3kyUmpZdm1pYTlteCtuL0srazhyTnJTCnM4UGhhSnlKK0hvQVZ0NzBWWlZzKzdwazNXS0wzd3QzTXV0aXpDYWFtN3VxWW9OTXRBWjZNTWdwdiswR1RaZTUKSE1ReEs5VmZ2Rk1TRjV5WlZ5bG1kMkVoTVFjdUpVbWRHUEx1OHl0eGpMVzZPUWRKZC96dkxwS1FCWTB0TDNkNwo3ME8vTmJ1YTJQbHpweXp5MEZmdUtFNG1YNCtRYUFrdnVQamNCdWt1bWo1UnA5RWl4QXFuT0Voc3Mvbi9mYXVHClYrTzYxb1Y0ZDdwRDZraC85dGkrSTIwZXY5RTJiRmhjOGU2a0dWUWE5UVBTZHViaGpMMDhzOU5JUytMSStIK1MKcUhaR25FSmxQcVFld1FjRFdrWXR1SmZ6dDlXeVZTSHZ1dHhNQUpmN0ZKVW5NNy9vUTBkRzBnaVpGbUE3bW43Uwo1dTA0NnV3QkhqeElWa2tKeDB3M0FKNklEc0J6NFc5bTZYSkhNRDRRNVFzRHlacENBR3pGbEg1aHhJcmZmNElhCkMxbkVXVEozczd4Z2FWWTUvYlFHZXl6V1pEYlp2VWp0aEI5K3BTS1BLcmhDOUlLMzFGT1FlRTR0R3YyQmIwVFgKT3dGMGxrTGdBT0l1YStyRjduS3N1Ny8rNnFxbytOejJzbm1LdG1jQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRQpGSjNBWjZZTUl0a205VVdycG1WU0VTZllSYXhqTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkRBVUFBNElDQVFDelYwMFFZazQ2NUt6cXVCeXZNaVBJczBsYVVaeDIKS0kxNXFsZEdGOVgxVXZhM1JPZ0lSTDhZaE5JTGdNM0ZFdjBBVlFWaGgwSGN0U1NlUE1UWXlQdHduaTk0bG9NZwpOdDU4RDJrVGlLVjFOcGdJcHNiZnJNN2pXTmEzUHQ2NjgrczBRTmlpZ2ZWNFB5L1ZwZnpab3RSZUJBNFhyZjVCCjhPV3ljdnBFZ2pOQzZDMVk5MWFNWWorNlFyQ2NERngrTG1VbVhGTlBBTEo0ZnFFTm1TMk51QjJPb3NTdy9XRFEKTUtTT3lBUmlxY1R0TmQ1NmwrME9PRjZTTDVOd3BhbWNiNmQ5RXgxK3hnaElzVjVuNjFFSUplbm1KV3RTS1pHYwowamx6Q0ZmZW1RYTBXNTBRQnVIQ0FLaTRIRW9DQ2hUUXdVSEsrNHcxSVgyQ09QS3BWSkVaTlpPVWJXbzZ4YkxRCnU0bUdrK2lieVE4NnAzcTRvZkI0UnZyOE55L2xpb1R6My80RTJhRm9vQzhrNGdtVkJ0V1Z5dUVrbHV0ODlwTUYKdSsxejZTM1JkVG5YNXlUYjJFNWZRNCtlMEJRNXYxVndTSmxYTWJTYzdrcVlBNVl3SDJBRzdoc2ovb0ZnSXhwSApZb1dsekJrMGdHK3pyQnJqbi9CN1NLM1ZBZGxudHFseWsrb3Racld5dU9ROVBMTHZUSXpxNndlL3F6V2FWWWE4CkdLYTFxRjYwZzJ4cmFVRFRuOXp4dzJscnVlRnRDZlR4cWxCMkNucDllaGVoVlpaQ21URUozV0FSalFVd2Z1YU8KUnRHZEZOckhGK1FGbG96RUpMVWJ6eFFIc2tENG81NUJocndFMEd1V3lDcUFOUDIvN3dhajNWakZoVDArai82ZQpLZUMydUFsb0dSd1lRdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MiCiMgU2VyaWFsOiA4NDAxMjI0OTA3ODYxNDkwMjYwCiMgTUQ1IEZpbmdlcnByaW50OiA2NDpiMDowOTo1NTpjZjpiMTpkNTo5OTplMjpiZToxMzphYjphNjo1ZDplYTo0ZAojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OjIzOjZiOjAwOjJmOjFkOjE2Ojg2OjUzOjAxOjU1OjZjOjExOmE0OjM3OmNhOmViOmZmOmMzOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZDo3MTpmZDpmNjpkYTo5NzplNDpjZjo2MjpkMTo2NDo3YTpkZDoyNTo4MTpiMDo3ZDo3OTphZDpmODozOTo3ZTpiNDplYzpiYTo5Yzo1ZTo4NDo4ODo4MjoxNDoyMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQi9qQ0NBWVdnQXdJQkFnSUlkSmNsaXNjL2VsUXdDZ1lJS29aSXpqMEVBd013UlRFTE1Ba0dBMVVFQmhNQwpWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1TQXdIZ1lEVlFRRERCZEJabVpwY20xVWNuVnpkQ0JRCmNtVnRhWFZ0SUVWRFF6QWVGdzB4TURBeE1qa3hOREl3TWpSYUZ3MDBNREV5TXpFeE5ESXdNalJhTUVVeEN6QUoKQmdOVkJBWVRBbFZUTVJRd0VnWURWUVFLREF0QlptWnBjbTFVY25WemRERWdNQjRHQTFVRUF3d1hRV1ptYVhKdApWSEoxYzNRZ1VISmxiV2wxYlNCRlEwTXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRTk1GNGJGWjBECjBLRjVOYmM2UEpKNnloVWN6V0x6bkNaY0J6M2xWUHFqMXN3UzZ2UVVYK2lPR2Fzdkxram1yQmhEZUt6UU44TzkKc3MwczVrZmlHdVpqdUQwdUwzakVUOXYwRDZSb1RGVnlhNVVkVGhoQ2xYak1OenlSNHB0bEt5bWpRakJBTUIwRwpBMVVkRGdRV0JCU2FyeWw2d0JFMU5TWlJNQUREYXY1QTFhN1dQREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHCkExVWREd0VCL3dRRUF3SUJCakFLQmdncWhrak9QUVFEQXdObkFEQmtBakFYQ2ZPSGlGQmFyOGpBUXI5SFgvVnMKYW9iZ3hDZDA1RGhUMXdWL0d6VGp4aSt6eWdrOE41M1g1N2hHOGYyaDRuRUNNRUpaaDBQVVVkKzYwd2t5V3M2SQpmbGM5bkY5Q2EvVUhMYlh3Z3BQNVdXK3VaUHBZNVlzZTQyTyt0WUhOYndLTWVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSIKIyBTZXJpYWw6IDI3OTc0NAojIE1ENSBGaW5nZXJwcmludDogZDU6ZTk6ODE6NDA6YzU6MTg6Njk6ZmM6NDY6MmM6ODk6NzU6NjI6MGY6YWE6NzgKIyBTSEExIEZpbmdlcnByaW50OiAwNzplMDozMjplMDoyMDpiNzoyYzozZjoxOToyZjowNjoyODphMjo1OTozYToxOTphNzowZjowNjo5ZQojIFNIQTI1NiBGaW5nZXJwcmludDogNWM6NTg6NDY6OGQ6NTU6ZjU6OGU6NDk6N2U6NzQ6Mzk6ODI6ZDI6YjU6MDA6MTA6YjY6ZDE6NjU6Mzc6NGE6Y2Y6ODM6YTc6ZDQ6YTM6MmQ6Yjc6Njg6YzQ6NDA6OGUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1ekNDQXFPZ0F3SUJBZ0lEQkVUQU1BMEdDU3FHU0liM0RRRUJCUVVBTUg0eEN6QUpCZ05WQkFZVEFsQk0KTVNJd0lBWURWUVFLRXhsVmJtbDZaWFJ2SUZSbFkyaHViMnh2WjJsbGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RApaWEowZFcwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt4SWpBZ0JnTlZCQU1UR1VObGNuUjFiU0JVCmNuVnpkR1ZrSUU1bGRIZHZjbXNnUTBFd0hoY05NRGd4TURJeU1USXdOek0zV2hjTk1qa3hNak14TVRJd056TTMKV2pCK01Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aVlc1cGVtVjBieUJVWldOb2JtOXNiMmRwWlhNZwpVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNU0l3CklBWURWUVFERXhsRFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSM2IzSnJJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNC90OW8zSzZ3dkRKRklmMWF3Rk80VzVBQjdwdEoxMS85MXN0czFySApVVitycERLbVlZZTJiZytHMGpBQ2wvalhhVmVoR0RsZGFtUjV4Z0ZackR3eFNqaDgwZ1RTU3lqb0lGODdCNkxNClRYUGI4NjVQeDFiVldxZVdpZnJ6cTJqVUk0WlpKODhKSjd5c2JuS0RIREJ5MytDaTZkTGhkSFVadlNxZWV4VlUKQkJ2WFF6bXRWU2pGNGhxNzlNRGtyamhKTTh4MmhaODVSZEtrbnZJU2pGSDRmT1F0Zi9Xc1grc1duN0V0MGJyTQprVUozVENYSmtEaHYyL0RNKzQ0ZWwxaysxV0JPNWdVbzdVbDVFMHU2U05zditYTFRPY3IrSDlnMGN2VzBRTTh4CkFjUHMzaEV0RjEwZnVGRFJYaG1uYWQ0SE15aktVSlg1cDFUTFZJWlFSYW41U1FJREFRQUJvMEl3UURBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUUlkczNMQi84azlzWE43YnVRdk9LRU4wWjE5ekFPQmdOVgpIUThCQWY4RUJBTUNBUVl3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUthb3JTTE9BVDJtby85aTBFaWRpMTV5CnNIaEU0OXdjcnduOUkwajZ2U3JFdVZVRXRSQ2pqU2ZlQzRKajBPN2VERGQ1UVZzaXNyQ2FRVnltY09EVTBIZkwKSTlNQTRHeFdMK0ZwRFEzWnFyOGhnVkRaQnFXby81VTMwS3IrNHJQMW1TMUZoSXJsUWduWGRBSXY5NG5ZbWVtOApKOVJIamJvTlJoeDN6eFNrSExta01jU2NLSFFETlA4ekdTYWw2UTEwdHo2WHhuYm9KNWFqWnQzaHJ2SkJXOHFZClZvTnpjT1NHR3RJeFFib3Z2aTBUV25adlR1aE9nUTQvV3dNaW9CSytabGdSU3NzRHhMUXFLaTJXRitBNVZMeEkKMDNZbm5ab3RCcWJKN0RuU3E5dWZtZ3NuQWpVcHNVQ1Y1L25vbkZXSUdVYld0elQxZnM0NW10azQ4VkgzVHl3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1UV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIExhYmVsOiAiVFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogYWE6MDg6OGY6ZjY6Zjk6N2I6Yjc6ZjI6YjE6YTc6MWU6OWI6ZWE6ZWE6YmQ6NzkKIyBTSEExIEZpbmdlcnByaW50OiBjZjo5ZTo4Nzo2ZDpkMzplYjpmYzo0MjoyNjo5NzphMzpiNTphMzo3YTphMDo3NjphOTowNjoyMzo0OAojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6ZDg6OGY6ZTE6MTA6MWM6NDE6YWU6M2U6ODA6MWI6Zjg6YmU6NTY6MzU6MGU6ZTk6YmE6ZDE6YTY6Yjk6YmQ6NTE6NWU6ZGM6NWM6NmQ6NWI6ODc6MTE6YWM6NDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURlekNDQW1PZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJmTVFzd0NRWURWUVFHRXdKVVZ6RVMKTUJBR0ExVUVDZ3dKVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVQpWME5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRGd3T0RJNE1EY3lORE16CldoY05NekF4TWpNeE1UVTFPVFU1V2pCZk1Rc3dDUVlEVlFRR0V3SlVWekVTTUJBR0ExVUVDZ3dKVkVGSlYwRk8KTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CSUZKdmIzUWdRMlZ5ZEdsbQphV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCCkFRQ3dmbks0cEFPVTVxZmVDVGlSU2hGQWg2ZDhXV1FVZTdVUkVOMyt2OVhBdTFiaWhTWDBOWElQK0ZQUVFlRkUKQWNLMEhNTXhRaFpIaFRNaWRySUtidy9sSlZCUGhZYSt2NWd1RUdjZXZoRUZoZ1dReEZuUWZIZ1FzSUJjdCtISApLM1hMZkordXRkR2RJemRqcDl4Q29pMlNCQnRRd1h1NFBodkpWZ1NMTDFLYnJhbFc2Y0gvcmFsWWh6QzJnZmVYClJmd1pWenNyYitSSDlKbEYvaDN4K0plamlCMDNIRnlQNEhZbG1sRDRvRlQvUkpCMkk5SXl4c09yQnIvOCs3L3oKclgyU1lnSmJLZE0xbzVPYVEyUmdYYkw2TXY4N0JLOU5RR3I1eCtQdkkvMXJ5K1VQaXpnTjdncjgvZytZbnpBeAozV3hTWmZtTGdiNGk0UnhZQTdxUkc0a0hBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxT0ZzbWpkNkxXdkpQZWxTREdSampDRFdtdWpBTkJna3EKaGtpRzl3MEJBUVVGQUFPQ0FRRUFQTlYzUGRyZmlicUhEQWhVYWlCUWtyNndRVDI1Sm1TRENpL29RTUNYS0NlQwpNRXJKay85cTU2WUFmNGxDbXRZUjVWUE9MOHp5MmdYRS91SlF4RHFHZmN6YWZoQUpPNUkxS2xPeS91c3JCZGxzClhlYlE3OU5xWnA0VktJVjY2SUlBckI2bkNXbFdRdE5vVVJpK1ZKcS9SRUc2U2I0Z3VtbGM3cmgzemM1c0g2MkQKbGhoOURyVVVPWVR4S09rdG81NTdIbnB5V29PemVXL3Z0UHpRQ3FWWVQwYmYrMjE1V2ZLRUlsS3VEOHo3ZkR2bgphc3BIWWNONitOT1NCQis0SUlUaE5sUVd4MERlTzRwejNOL0dDVXpmN05yLzFGTkNvY255WWgwaWd6eVh4ZmtaCllpZXNaU0xYMHp6RzVZNnlVOHhKenJ3dy9uc09NNUQ3N2RJVWtSOEhydz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4gT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCiMgU3ViamVjdDogTz1TRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuIE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMgojIExhYmVsOiAiU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogNmM6Mzk6N2Q6YTQ6MGU6NTU6NTk6YjI6M2Y6ZDY6NDE6YjE6MTI6NTA6ZGU6NDMKIyBTSEExIEZpbmdlcnByaW50OiA1ZjozYjo4YzpmMjpmODoxMDpiMzo3ZDo3ODpiNDpjZTplYzoxOToxOTpjMzo3MzozNDpiOTpjNzo3NAojIFNIQTI1NiBGaW5nZXJwcmludDogNTE6M2I6MmM6ZWM6Yjg6MTA6ZDQ6Y2Q6ZTU6ZGQ6ODU6Mzk6MWE6ZGY6YzY6YzI6ZGQ6NjA6ZDg6N2I6Yjc6MzY6ZDI6YjU6MjE6NDg6NGE6YTQ6N2E6MGU6YmU6ZjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREJkTVFzd0NRWURWUVFHRXdKS1VERWwKTUNNR0ExVUVDaE1jVTBWRFQwMGdWSEoxYzNRZ1UzbHpkR1Z0Y3lCRFR5NHNURlJFTGpFbk1DVUdBMVVFQ3hNZQpVMlZqZFhKcGRIa2dRMjl0YlhWdWFXTmhkR2x2YmlCU2IyOTBRMEV5TUI0WERUQTVNRFV5T1RBMU1EQXpPVm9YCkRUSTVNRFV5T1RBMU1EQXpPVm93WFRFTE1Ba0dBMVVFQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnkKZFhOMElGTjVjM1JsYlhNZ1EwOHVMRXhVUkM0eEp6QWxCZ05WQkFzVEhsTmxZM1Z5YVhSNUlFTnZiVzExYm1sagpZWFJwYjI0Z1VtOXZkRU5CTWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTkFWCk9WS3hVck82eFZtQ3hGMVNyanBEWllCTHgvS1d2TnMybDlhbVpJeW9YdkRqQ2h6MzM1YzlTNjcyWGV3aHRVR3IKemJsK2RwKysrVDQyTktBN3dmWXhFVVYwa3oxWGdNWDVpWm5LNWF0cTFMWGFRWkFRd2RiV1FvbkN2L1E0RXBWTQpWQVgzTnVSRmczc1VaZGJjREUzUjNuNE1xenZFRmI0NlZxWmFiM1pwVXFsNnVjanJhcHBkVXRBdENtczFGZ2tRCmhOQnF5am9HQURkSDVINVhUeitMNjJlNGlLckZ2bE5Wc3BIRWZibXdoUmtHZUM3YllScjZoZlZLa2FIbkZ0V08Kb2puZmxMaHdIeWcvaS94QVhtT0RQSU1xR3Bscno5NVphanY4YnhiWEgvMUtFT3RPZ2hZNnJDY01VL0d0MVNTdwphd05Rd1MwOEZ0MUVOQ2NhZGZzQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZBcUZxWGRsQlpoOFFJSDRENWNzCk9QRUs3RHpQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCTU9xTkVyTGxGc2NlVGZzZ0xDa0xmWk9vYzdsbHNDTHFKWDJyS1NwV2VlbzhIeGRwRgpjb0p4RGpyU3pHK250S0VqdS9Za244c1gvb3ltenNMUzI4eU4vSEg4QXluQmJGMHpYMlMyWlR1SmJ4aDJlUFhjCm9rZ2ZHVCtPayt2eCtoZnV6VTdqQkJKVjF1WGszZnMrQlh6aUhWN0dwN3lYVDJnNjlla3VDa08ycjFkY1ltaDgKdC8yamlvU2dyR0srS3dtSE5QQnFBYnViS1ZZOC9nQTN6eU5zOFU2cXRuUkdFbXlSN2pUVjdKcVI1MFMra0RGeQoxVWtDOWdMbDlCL3JmTm1XVmFuLzdJcjVtVWYvTlZvQ3FnVExpbHVIY1NtUnZhUzBlZzI5bXZWWEl3QUhJUmMvClNqblJCVWtMcDdZM2dhVmRqS296WG9Fb2ZLZDlKK3NBcm8wMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogNzM6OWY6NGM6NGI6NzM6NWI6Nzk6ZTk6ZmE6YmE6MWM6ZWY6NmU6Y2I6ZDU6YzkKIyBTSEExIEZpbmdlcnByaW50OiBmZTo0NTo2NTo5Yjo3OTowMzo1Yjo5ODphMTo2MTpiNTo1MToyZTphYzpkYTo1ODowOTo0ODoyMjo0ZAojIFNIQTI1NiBGaW5nZXJwcmludDogYmM6MTA6NGY6MTU6YTQ6OGI6ZTc6MDk6ZGM6YTU6NDI6YTc6ZTE6ZDQ6Yjk6ZGY6NmY6MDU6NDU6Mjc6ZTg6MDI6ZWE6YTk6MmQ6NTk6NTQ6NDQ6MjU6OGE6ZmU6NzEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNVENDQXhtZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCbFRFTE1Ba0dBMVVFQmhNQ1IxSXgKUkRCQ0JnTlZCQW9UTzBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMQpkR2x2Ym5NZ1EyVnlkQzRnUVhWMGFHOXlhWFI1TVVBd1BnWURWUVFERXpkSVpXeHNaVzVwWXlCQlkyRmtaVzFwCll5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1eklGSnZiM1JEUVNBeU1ERXhNQjRYRFRFeE1USXcKTmpFek5EazFNbG9YRFRNeE1USXdNVEV6TkRrMU1sb3dnWlV4Q3pBSkJnTlZCQVlUQWtkU01VUXdRZ1lEVlFRSwpFenRJWld4c1pXNXBZeUJCWTJGa1pXMXBZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwZFhScGIyNXpJRU5sCmNuUXVJRUYxZEdodmNtbDBlVEZBTUQ0R0ExVUVBeE0zU0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmwKYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCU2IyOTBRMEVnTWpBeE1UQ0NBU0l3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLbFRBT011cHZhTyttRFlMWlUrK0N3cVZFN051WVJobEZoUGp6Mkw1RVB6CmRZbU5VZVRETjlLS2lFMTVIcmNTM1VONFNvcVM1dGRJMVEra09pbEVOYmdIOW1nZFZjMDRVZkNNSkRHRnI0UEoKZmVsM3IrMGFlNTBYK2JPZE9GQVBwbHA1a1lDdk42Nm0wekg3dFNZSm5UeGE3MUhGSzkrV1hlc3lIZ0xhY0VucwpiZ3pJbWplTjkvRTJZRXNtTElLZTBIanpEUTlqcEZFdzRma3JKeElIMk9xOUdHS1lzRmszZmI3dTh5QlJRbHFECjc1TzZhUlh4WXAyZm1UbUNvYmQwTG92VXhRdDdML0RJQ3RvOWVRcWFreHlsS0hKemtVT2FwOUZOaFlTNXFYU1AKRkVESDNONnNRV1JzdEJtYkFtTnRKR1NQUkxJbDZzNWRkQXhqTWx5TmgrVUNBd0VBQWFPQmlUQ0JoakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUFzR0ExVWREd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVwcEZDL1JOaFNpT2VDS1FwCjVkZ1RCQ1B1UVNVd1J3WURWUjBlQkVBd1BxQThNQVdDQXk1bmNqQUZnZ011WlhVd0JvSUVMbVZrZFRBR2dnUXUKYjNKbk1BV0JBeTVuY2pBRmdRTXVaWFV3Qm9FRUxtVmtkVEFHZ1FRdWIzSm5NQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFBZjczbEI0WHR1UDdLTWhqZENTazRjTng2Tlpyb2tnY2xQRWc4aHdBT1hoaVZ0WGRNaUthaHNvZzJwCjZ6MEdXNWs2eDh6RG1qUi9xdzdJVGh6aCt1VGN6UTIrdnlUK2JPZHJ3ZzNJQnA1T2pXRW9wbXI5NWZaaTZoZzgKVHFCVG5iSTZuT3VsbkpFV3RrMkM0QXdGU0tsczljejR5NTFKdFBBQ3BmMXdBKzJLSWFXdUU0Wkp3ek56dm9jNwpkSXNYUlNaTUZwR0QvbWQ5elUxalovcnpBeEtXZUFhTnNXZnRqaisrbjA4QzliTUpML05NaDk4cXk1VjhBY3lzCk5ucS9vbk42OTQvQnRacWhGTEtQTTU4Tjd5TGNabnVFdlVVWEJqMDh5cmwzTkkvSzZzOC9NVDdqaU9PQVNTWEkKbDdXZG1wbE5zRHo0U2dDYlpOMmZPVXZSSjllNAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIE89QWN0YWxpcyBTLnAuQS4vMDMzNTg1MjA5NjcKIyBTdWJqZWN0OiBDTj1BY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EgTz1BY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NwojIExhYmVsOiAiQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIgojIFNlcmlhbDogNjI3MTg0NDc3MjQyNDc3MDUwOAojIE1ENSBGaW5nZXJwcmludDogNjk6YzE6MGQ6NGY6MDc6YTM6MWI6YzM6ZmU6NTY6M2Q6MDQ6YmM6MTE6ZjY6YTYKIyBTSEExIEZpbmdlcnByaW50OiBmMzo3MzpiMzo4NzowNjo1YToyODo4NDo4YTpmMjpmMzo0YTpjZToxOToyYjpkZDpjNzo4ZTo5YzphYwojIFNIQTI1NiBGaW5nZXJwcmludDogNTU6OTI6NjA6ODQ6ZWM6OTY6M2E6NjQ6Yjk6NmU6MmE6YmU6MDE6Y2U6MGI6YTg6NmE6NjQ6ZmI6ZmU6YmM6Yzc6YWE6YjU6YWY6YzE6NTU6YjM6N2Y6ZDc6NjA6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1ekNDQTZPZ0F3SUJBZ0lJVndvUmwwTEU0OHd3RFFZSktvWklodmNOQVFFTEJRQXdhekVMTUFrR0ExVUUKQmhNQ1NWUXhEakFNQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdseklGTXVjQzVCTGk4dwpNek0xT0RVeU1EazJOekVuTUNVR0ExVUVBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwCklFTkJNQjRYRFRFeE1Ea3lNakV4TWpJd01sb1hEVE13TURreU1qRXhNakl3TWxvd2F6RUxNQWtHQTFVRUJoTUMKU1ZReERqQU1CZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6SUZNdWNDNUJMaTh3TXpNMQpPRFV5TURrMk56RW5NQ1VHQTFVRUF3d2VRV04wWVd4cGN5QkJkWFJvWlc1MGFXTmhkR2x2YmlCU2IyOTBJRU5CCk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcDhiRXBTbWtMTy9sR01Xd1VLTnYKVVR1ZkNsckp3a2c0Q3NJY29CaC9rYldIdVVBLzNSMW9Id2lEMVMwZWlLRDRqMWFQYlprQ2twQVcxVjhJYkluWAo0YXk4SU1LeDRJTlJpbWxOQUpaYWJ5L0FSSDZqRHVTUnpWanUzUHZISGtWSDNTZTVDQUdmcGlFZDlVRXRMMHo5CktLM2dpcTBpdEZabGpvWlVqNU5ES2Q0NVJuaWpNQ082emZCOUUxZkFYZEtEYTBoTXhLdWZnRnBiT3IzSnB5SS8KZ0Njeld3NjNpZ3hkQnpjSXkyelNla2NpUkRYRnpNd3VqdDBxN2JkOVpnMWZZVkVpVlJ2alJ1UGpQZEExWXByYgpyeFRJVzZITWlSdmhNQ2I4b0pzZmdhZEhId1Ryb3ptU0JwK1owNy9UNms5UW5Cbitsb2NlUEdYMm94Z2tnNFlRCjUxUStxRHAySkUrQkljWGpEd0w0azVSSElMdisxQTdUYUxuZHhIcUVndU5UVkhuZDI1elM4Z2ViTHJhOFB1MkYKYmU4bEVmS1hHa0poOTBxWDZJdXhFQWY2WllHeW9qblA5enovR1B2RzhWcUxXZUlDckh1UzBFNFVUMWxGOWd4ZQpLRit3NkQ5Rno4K3ZtMi83aE5OM1dwVnZySlNFbnU2OHdFcVBTcFA0UkNIaU1VVmhVRTRRMk9NMWZFd1p0TjRGCnY2TUduOGkxemVRZjF4Y0dEWHFWZEZVTmFCcjhFQnRpWkoxdDRKV2d3NVFIVncwVTVyMEYrN2lmNXQrTDRzYm4KZnBiMlU4V0FORkFvV1BBU1VIRVhNTHJtZUdPODlMS3RteXV5L3VFNWpGNjZDeUNVM251RHVQL2pWbzIzRWVrNwpqUEt4d1YyZHBBdE1LOW15R1BXMW4wc0NBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGRkxZaURySW4zaG03WW56CmV6aHdsTWtDQWpiUU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVVdGlJT3NpZmVHYnQKaWZON09IQ1V5UUlDTnRBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBTAplM0tId0dDbVNVeUlXT1lkaVBjVVpFaW0yRmdLRGs4VE5kODFIZFR0QmpISWdUNXExZDA3R2pMdWtEMFIwaTcwCmpzTmpMaU5tc0dlK2I3YkFFemxncXFJMEpaTjFVdDZubmEwT2g0bFNjV29XUEJrZGcvaWFLV1crOUQrYTJmRHoKV29jaGNZQk55K0E0bXorNyt1QXdUYytHMDJVUUdSalJsd0t4SzNKQ2FLeWd2VTVhMmhpL2E1aUIwUDJhdmw0VgpTTTBSRmJuQUtWeTA2SWozUGphdXQyTDlIbUxlY0hnUUhFaGIycnlrT0xwbjdWVStYbGZmMUFOQVRJR2swazlqCnB3bENDUlQ4QUtuQ2dITlBMc0JBMlJGN1NPcDZBc0RUNnlnQkpsaDB3Y0J6SW0yVGxmMDVmYnNxNC9hQzR5eVgKWDA0ZmtaVDYvaXlqMkhZYXVFMnlPRStiK2gxSVlIa200dlA5cWRDYTZIQ1BTWHJXNWIwS0R0c3Q4NDIvNitPawpmY3ZIbFhIbzJxTjh4Y0w0ZEpJRUc0YXNwQ0pUUUxhcy9reDJ6L3VVTXNBMW4zWS9idVdRYnFDbUpxSzRMTDdSCks0WDlwMmpJdWdFcnNXeDBIYmh6bGVmdXQ4Y2w4QUJNQUxKK3RndUxIUFBBVUo0bHVlQUkzalptL3plbDBidFUKWkN6Sko3VkxrbjVsLzlNdDRibE92SCtrUVNHUVFYZW1PUi9xbnVPZjBHWnZCZXlxZG42L2F4YWc2N1hIL0pKVQpMeXNSSnlVM2VFeFJhckR6ekZoZEZQRnFTQlgvd2dlMnNZMFBqbHhRUnJNOXZ3R1lUN0paVkVjK05IdDRiVmFUCkxuUHFaaWg0elIwVXY2Q1BMeTY0TG83eUZJck02YlY4KzJ5ZERLWGhsZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVRydXN0aXMgTGltaXRlZCBPVT1UcnVzdGlzIEZQUyBSb290IENBCiMgU3ViamVjdDogTz1UcnVzdGlzIExpbWl0ZWQgT1U9VHJ1c3RpcyBGUFMgUm9vdCBDQQojIExhYmVsOiAiVHJ1c3RpcyBGUFMgUm9vdCBDQSIKIyBTZXJpYWw6IDM2MDUzNjQwMzc1Mzk5MDM0MzA0NzI0OTg4OTc1NTYzNzEwNTUzCiMgTUQ1IEZpbmdlcnByaW50OiAzMDpjOTplNzoxZTo2YjplNjoxNDplYjo2NTpiMjoxNjo2OToyMDozMTo2Nzo0ZAojIFNIQTEgRmluZ2VycHJpbnQ6IDNiOmMwOjM4OjBiOjMzOmMzOmY2OmE2OjBjOjg2OjE1OjIyOjkzOmQ5OmRmOmY1OjRiOjgxOmMwOjA0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMTpiNDo4Mjo5OTphYjphNToyMDo4ZjplOTo2MzowYTpjZTo1NTpjYTo2ODphMDozZTpkYTo1YTo1MTo5Yzo4ODowMjphMDpkMzphNjo3MzpiZTo4Zjo4ZTo1NTo3ZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFp6Q0NBaytnQXdJQkFnSVFHeCt0dGlENUpOTTJhL2ZIOFl5Z1dUQU5CZ2txaGtpRzl3MEJBUVVGQURCRgpNUXN3Q1FZRFZRUUdFd0pIUWpFWU1CWUdBMVVFQ2hNUFZISjFjM1JwY3lCTWFXMXBkR1ZrTVJ3d0dnWURWUVFMCkV4TlVjblZ6ZEdseklFWlFVeUJTYjI5MElFTkJNQjRYRFRBek1USXlNekV5TVRRd05sb1hEVEkwTURFeU1URXgKTXpZMU5Gb3dSVEVMTUFrR0ExVUVCaE1DUjBJeEdEQVdCZ05WQkFvVEQxUnlkWE4wYVhNZ1RHbHRhWFJsWkRFYwpNQm9HQTFVRUN4TVRWSEoxYzNScGN5QkdVRk1nVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVZRZTU0N05kRGZ4SXpOanB2dG84QTJtZlJDNnFjK2dJTVBwcWRaaDhtUVJVTisKQU9xR2VTb0R2VDAzbVlsbXQrV0tWb2FUbkdoTGFBU01rNU1DUGpEU056b2lZWWtjaFU1OWo5V3ZlelgyZmloSAppVEhjRG5sa0g1blNXN3IrZjJDL3Jldm5QRGdwYWkvbGtRdFYvK3h2V05VdHlkNU1abkdQRE5jRTJnZm1IaGpqCnZTa0NxUG9jNFZ1NWc2aEJTTHdhY1kzbll1VXRzdXZmZk0vYnExcktNZkZNSXZNRkUvZUMrWE41REw3WFN4ekEKMFJVOGswRmswZWErSXhjaUFJbGVIMnVsckc2blM0enRvM0xtcjJOTkw0WFNGRFdhTGs2TTZqS1lLSWFoa1FsQgpPclRoNC9MNjhNa0tva0hkcWVNRHg0Z1ZPeHpVR3BUWG4yUlpFbTBDQXdFQUFhTlRNRkV3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZkJnTlZIU01FR0RBV2dCUzYrbkVsZVl0WFFTVWhoZ3R4NjdKa0Rvc2haekFkQmdOVkhRNEUKRmdRVXV2cHhKWG1MVjBFbElZWUxjZXV5WkE2TElXY3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSDVZLy8wMQpHWDJjR0UrZXNDdThqb3dVL3l5ZzJrZGJ3KytCTGE4RjZuUklXL00rVGdmSGJjV3prODhpTlZ5MlAzVW5Yd21XCnphRCt2a0FNWEJKVitKT0N5aW5wWGo5V1Y0czROdmRGR2t3b3paNUJ1TzFXVElTa1FNaTRzS1VyYVhBRWFzUDQKMUJJeStRN0RzZHd5aEVRc2I4dEdEK3BtUVE5UDhWaWxwZzBORDJIZXBaNWRmV1doUEJmbnFGVk83NkRIN2NaRQpmMVQxbytDUDhIeFZJbzhwdG9HajRXMU9MQnVBWit5dElKOE1ZbUhWbC85RDdTM0IybDBwS29VL3JHWHVoZzhGCmpaQmYzKzZmOUwvdUhmdVk1SCtRSzRSNEVBNXNTVlB2RlZ0bFJrcGRyN3I3T25JZHpmWWxpQjZYekNHY0tRRU4KWmV0WDJmTlhscnRJellFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIFN1YmplY3Q6IENOPUJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBMYWJlbDogIkJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIgojIFNlcmlhbDogMgojIE1ENSBGaW5nZXJwcmludDogNDY6YTc6ZDI6ZmU6NDU6ZmI6NjQ6NWE6YTg6NTk6OTA6OWI6Nzg6NDQ6OWI6MjkKIyBTSEExIEZpbmdlcnByaW50OiA0OTowYTo3NTo3NDpkZTo4NzowYTo0NzpmZTo1ODplZTpmNjpjNzo2YjplYjpjNjowYjoxMjo0MDo5OQojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6MTE6NDA6MjU6MTk6N2M6NWI6Yjk6NWQ6OTQ6ZTY6M2Q6NTU6Y2Q6NDM6Nzk6MDg6NDc6YjY6NDY6YjI6M2M6ZGY6MTE6YWQ6YTQ6YTA6MGU6ZmY6MTU6ZmI6NDgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWQKTUJzR0ExVUVDZ3dVUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZwpRMnhoYzNNZ01pQlNiMjkwSUVOQk1CNFhEVEV3TVRBeU5qQTRNemd3TTFvWERUUXdNVEF5TmpBNE16Z3dNMW93ClRqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXcKSGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklESWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOZkhYdmZCQjlSMyswTWg5UFQxYWVUdU1nSGJvNFlmNUZrTnV1ZDFnMUxyCjZoeGhGVWk3SFFmS2pLNnczSmFkNnNOZ2tvYUNLSE9jVmdiL1MyVHdEQ28zU2JYbHp3eDg3dkZLdTNNd1pmUFYKTDRPMmZ1UG45WjZyWVBuVDhaMlNkSXJrSEphc1c0RHB0ZlF4aDZOUi9NZCtvVytPVTNmVWw4RlZNNUkrR0M5MQoxSzJHU2N1VnIxUUdiTmdHRTQxYi8rRW1HVm5BSkxxQmNYbVFSRkJvSkpSZnVMTVI4U2xCWWFOQnl5TTIxY0h4Ck1sQVFUbi8waHBQc2hOT092RXUvWEFGT0J6M2NGSXFVQ3FUcWMvc0xVZWdUQnhqNkR2RXIwVlFWZlR6aDk3UVoKUW1kaVhuZmdvbFhzdHRscEY5VTZyMFR0U3NXZTVIb25mT1YxMTZyTEplZmZhd3JiRDAyVFRxaWd6WHN1OGxrQgphcmNOdUFlQmZvczRHemptQ2xlWlBlNGg2S1AxREJiZGkrdzBqcHdxSEFBVkY0MW9nOUp3bnhnSXpSRm8xY2xyClVzM0VSby9jdGZQWVYzTWU2WlE1QkwvVDNqamV0RlBzYVJ5aWZzU1A1QnR3cmZLaStmdjNGbVJtYVo5SlVhTGkKRlJobkJrcC8xV3kxVGJNejRHSHJYYjdwbUE4eTF4MUxQQzVhQVZLUkNmTGY2bzNZQmtCanFoSGsvc00zbmhSUwpQL1RpelBKaGs5SDlaMnZYVXE2L2FLdEFRNkJYTlZONDhGUDRZVUlIWk1iWGI1dE1PQTFqckdLdk5vdWljd29OCjlTRzlkS3BONm5JRFNkdkhYeDFpWThmOTNaSHNNKzcxYmJSdU1HamV5Tlltc0hWZWU3UUhJSmloZGpLNFRXeFAKQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk1tQWQrQmlrb0wxUnB6egp1dmRNdzk2NG82MDVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFVMThoCjlicXdPbEk1TEpLd2JBREo3ODRnN3dieWxwN3BwSFIvZWhiOHQvVzIreFViUDZ1bXdISmRFTEZ4N3J4UDQ2MnMKQTIwdWNTNnZ4T090bzcwTUVhZTAvMHF5ZXhBUUg2ZFhRYkxBcnZRc1dkWkhFSWp6SVZFcE1NcGdocTlHcXgzdApPbHV3bE41RTQwRUlvc0hzSGRiOVQ3YldSOUFVQzhybXlyVjdkMzVCSDE2RHg3YU1PWmF3UDVhQlFXOWdrT0xvCitmc2ljZGw5c3oxR3Y3U0VyNUFjRDQ4U2FxL3Y3aDU2cmdKS2loY3JkdjZzVklra0xFOC90cktuVG95b2taZjcKS2NaN1hDMjV5MmEydDZoYkVsR0Z0UWwrWW5ody9xbHFZTFlkRG5rTS9jcnFKSUJ5dzVjLzhuZXJReUlLeCt1MgpESVNDTElCclFZb0l3T3VsYTkrWkVzdUsxVjZBREpIZ0pnZzJTTVg2T0JFMS95V0RMZko2djlyOWp2Nmx5MFVzCkg4U0lVNjUzRHRtYWRzV09MQjJqdXRYc01xN0FxcXozMFhwTjY5UUg0a2ozSW82d3BKOXF6bzZ5c21EMG95TFEKSSt1VVducHAzUSsvUUZlc2ExbFEyYU9aNFc3K2pRRjVKeU1WM3BLZGV3bE5XdWRMU0RCYUdPWUtiZWFQNE5LNwo1dDk4YmlHQ3dXZzVUYlNZV0daaXpFcVFYc1A2SndTeGVSVjBtY3krclNEZUptQWM2MVpScHFQcTVLTS9wLzloCjNQRmFUV3d5STBQdXJLanU3a29TQ1R4ZGNjSytlZnJDaDJnZEMvMWNhY3dHMEpwOVZKa3F5VGthR2E5TEtrUHoKWTExYVdPSXY0eDNrcWRiUUN0Q2V2OWVCQ2ZISnh5WU5ySmdXVnFBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIFN1YmplY3Q6IENOPUJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBMYWJlbDogIkJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIgojIFNlcmlhbDogMgojIE1ENSBGaW5nZXJwcmludDogM2Q6M2I6MTg6OWU6MmM6NjQ6NWE6ZTg6ZDU6ODg6Y2U6MGU6Zjk6Mzc6YzI6ZWMKIyBTSEExIEZpbmdlcnByaW50OiBkYTpmYTpmNzpmYTo2Njo4NDplYzowNjo4ZjoxNDo1MDpiZDpjNzpjMjo4MTphNTpiYzphOTo2NDo1NwojIFNIQTI1NiBGaW5nZXJwcmludDogZWQ6Zjc6ZWI6YmM6YTI6N2E6MmE6Mzg6NGQ6Mzg6N2I6N2Q6NDA6MTA6YzY6NjY6ZTI6ZWQ6YjQ6ODQ6M2U6NGM6Mjk6YjQ6YWU6MWQ6NWI6OTM6MzI6ZTY6YjI6NGQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWQKTUJzR0ExVUVDZ3dVUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZwpRMnhoYzNNZ015QlNiMjkwSUVOQk1CNFhEVEV3TVRBeU5qQTRNamcxT0ZvWERUUXdNVEF5TmpBNE1qZzFPRm93ClRqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXcKSGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklETWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLWGFDcFVXVU9PVjhsNmRkakVHTW5xYjhSQjJ1QUNhdFZJMnpTUkhzSjhZClpMeWE5dnJWZWRpUVlrd2lMOTQ0UGRiZ3FPa2NMTnQ0RWVtT2FGRVZjc2Z6TTRma29GMExYT0JYQnlvdzljM0UKTjNjb1RSaVI1ci9WVXYxeExYQSs1OGJFaXVQd0tBdjBkcGloaTRkVnNqb1QvTGMrSnplT0l1T29UeXJ2WUxzOQp0em5ERGdGSG1WMFNUOXREK2xlaDdmbWR2aEZISmxzVG1LdGRGb3F3Tnh4WG5VWC9pSlkydjd2S0IzdHZoMlBYCjBESnExbDFzRFBHemJqbmlhekV1T1FBbkZONDR3T3daWm9ZUzZKMXlGaE5rVXNlcE54ejlnakR0aEJnZDlLNWMKLzNBVEFPdXg5VE42UzlaVitBV05TMm13OWJNb05sd1V4RkZ6VFdzTDhUUUgyeGM1MTl3b2UydjFuL011d1U4WApLaER6ek1ybzYvMXJxeTZhbnkyQ2JnVFVVZ0dUTFQyRy9INzgzKzlDSGFacjc3a2d4dmU5b0tlVi9hZm1pU1RZCnpJdzBiT0lqTDlrU0dpRzVWWkZ2QzVGNUdReXRRSWdMY09KNjBnN1lhRWk3Z2hNNUVGanAyQ29IeGhMYldOdlMKTzFVUVJ3VVZaMkorR0dPbVJqOEpEbFF5WHI4Tllub243NERvMjlsTEJsbzNXaVhRQ0JKMzFHOEpVSmM5eUIzRAozNHhGTUZiRzAyU3JadlBBWHBhY3c4VHZ3M3hyaXpwNWY3Tkp6ejNpaVorZ01FdUZ1WnlVSkhtUGZXdXBSV2dQCks5RHgyaHpMYWJqS1NXSnR5TkJqWXQxZ0QxaXFqNkc4QmFWbW9zOGJkcktFWkxGTU9WTEFNTHJ3akVzQ3NMYTMKQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkVlNHpmL2xiKzc0c3V3dgpUZzc1SmJDT1BHdkRNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFBQ0FqClFUVUVrTUpBWW1EdjRqVk0xeitzNGpTUXVLRnZkdm9XRnFSSU55enBrTUx5UFBnS245aUI1YnRiMmlVc3BLZFYKY1NReTlzZ0w4cnhxK0pPc3NnZkNYNS9iek1pS3FyNXFiK0ZKRU13eDE0Qzd1OGpZb2c1a1YrcWk5Y0twTVJYUwpJR3JzL0NJQktNK0d1SUFlcWN3UnBUenlGck5IbmZ6U2dDSEV5OUJIY0VHaHlvTVpDQ3h0OGwxM25Jb1VFOVEyCkhKTHc1UVkzM0tibWtKczRqMXhyRzBhR1EwSmZQZ0VIVTFSZFpYMzNpbk9obWxSYUh5bERGQ2ZDaFErMWlIc2EKTzVTM0hXQ250WnpuS1dsWFdwdVRla013R3dQWFlzaEFwcXI4Wk9SSzE1RlRBYWdnaUc2Y1gwUzV5MkNCTk94dgowMzNhU0YvcnRKQzhMYWtjQzZ3YzFhSm9JSUFFMXZ5eGp5KzdTakVOU29ZYzYrSTJLU2IxMnRqRThuVmh6MzZ1CmRtTktla0JsazRmNEhvQ01odVdHMW84Ty9GTXNZT2dXWVJxaVBrTjd6VGxnVkdyMThva21BV2lEU0tJejZNa0UKa2JJUk5CRSs2dEJER1I4RGs1QU0vMUU5Vi9SQmJ1SExvTDdyeVdQTmJjemsrRGFxYUozdHZWMlhjRVFOdGc0MQozT0VNWGJ1Z1VaVExmaGJyRVMramtrWElUSEhadk1tWlVsZEdMMURQdlRWcDlEMFZ6Z2FsTEE4KzlvRzZsTHZECnU3OWxlTktHZWY5Sk94cUREUERlZU96SThrMU1HdDZDS2ZqQld0cnQ3dVluWHVoRjBKMGNVYWhvcTBUajBJdHEKNC9nN3U5eE4xMlR5VWI3bXFxdGE2VEh1QnJ4enZ4TmlDcC9IdVpjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIlQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBjYTpmYjo0MDphODo0ZTozOTo5Mjo4YToxZDpmZTo4ZToyZjpjNDoyNzplYTplZgojIFNIQTEgRmluZ2VycHJpbnQ6IDU1OmE2OjcyOjNlOmNiOmYyOmVjOmNkOmMzOjIzOjc0OjcwOjE5OjlkOjJhOmJlOjExOmUzOjgxOmQxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmZDo3MzpkYTpkMzoxYzo2NDo0ZjpmMTpiNDozYjplZjowYzpjZDpkYTo5Njo3MTowYjo5YzpkOTo4Nzo1ZTpjYTo3ZTozMTo3MDo3YTpmMzplOTo2ZDo1MjoyYjpiZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeApLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkCkJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmwKWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd0hoY05NRGd4TURBeE1UQXlPVFUyV2hjTk16TXhNREF4TWpNMQpPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5CmFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTAKWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzlkWlB3WWlKdkpLN2dlbmFzZmIzWkpOVzR0L3pOCjhFTGc2M2lJVmw2Ym1sUWRUUXlLOXRQUGNQUlN0ZGlUQk9OR2huRkJTaXZ3S2l4VkE5Wkl3K0E1T08zeVhEdy8KUkx5VFBXR3JUczBOdnZBZ0oxZ09SSDhFR29lbDE1WVVOcERRU1h1aGRmc2FhM094K002cENTenlVOVhERkVTNApocVgyaXlzNTJxTXpWTm42Y2hyM0loVWNpSkZyZjJibHcycUFzQ1R6MzRaRmlQMFpmM1dISHgreEd3cHpKRnU1ClplQXNWTWhnMDJZWFArSE1WRE56a1FJNnBuOTdkam1pSDVhMk9LNjF5Sk4wSFo2NXRPVmduUzlXMGVEclhsdE0KRW5BTWJFUWdxeEhZOUJuMjBweFNOK2Y2dHNJeE8wclVGSm10eHhyMVhWLzZCN2g4RFIvV2d4NnpBZ01CQUFHagpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlMxCkEvZDJPMkdDYWhLcUdGUHJBeUdVdi83T3lqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFWajN2bE5XOTJuT3kKV0w2dWtLMllKNWYrQWJHd1VnQzRUZVFiSVhRYmZzRHVYbWtxSmE5YzFoM2Ewbm5KODVjcDRJYUgzZ1JaRC9GWgoxR1NGUzVtdkpRUWV5VWFwbDk2Q3NodHduNXoycjNFeDNYc0ZwU3pUdWNwSDlzcnk5dWV0dVVnL3ZCYTN3VzMwCjZnbXY3UE8xNXdXZXBoNktVMUhXazRITWRKUDJ1ZHFtSlFWMGVWcCtRRDZDU3lZUk1HN2hQMEhIUndBMTFmWFQKOTFRK2dUM2FTV3Fhcys4UVBlYnJiOUhJSWtmTHpNOEJNWkxaR09NaXZna2VHajVhc3VSckRGUjZmVU5PdUltbAplOWVpUFphR3pQSW1OQzFxa3AyYUd0QXc0bDFPQkxCZml5QitkOEU5bFlMUlJwbzdQSGk0YjZIUURXU2llQjRwClRwUERwRlFVV3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSBPPUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMKIyBTdWJqZWN0OiBDTj1FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIE89QVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1cwojIExhYmVsOiAiRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSIKIyBTZXJpYWw6IDExMjMyNDgyODY3NjIwMDI5MTg3MTkyNjQzMTg4ODQ5NDk0NTg2NgojIE1ENSBGaW5nZXJwcmludDogNDM6NWU6ODg6ZDQ6N2Q6MWE6NGE6N2U6ZmQ6ODQ6MmU6NTI6ZWI6MDE6ZDQ6NmYKIyBTSEExIEZpbmdlcnByaW50OiBjOTphODpiOTplNzo1NTo4MDo1ZTo1ODplMzo1Mzo3NzphNzoyNTplYjphZjpjMzo3YjoyNzpjYzpkNwojIFNIQTI1NiBGaW5nZXJwcmludDogM2U6ODQ6YmE6NDM6NDI6OTA6ODU6MTY6ZTc6NzU6NzM6YzA6OTk6MmY6MDk6Nzk6Y2E6MDg6NGU6NDY6ODU6Njg6MWY6ZjE6OTU6Y2M6YmE6OGE6MjI6OWI6OGE6NzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVBekNDQXV1Z0F3SUJBZ0lRVklENW9IUHRQd0JNeW9uWTQzSG1TakFOQmdrcWhraUc5dzBCQVFVRkFEQjEKTVFzd0NRWURWUVFHRXdKRlJURWlNQ0FHQTFVRUNnd1pRVk1nVTJWeWRHbG1hWFJ6WldWeWFXMXBjMnRsYzJ0MQpjekVvTUNZR0ExVUVBd3dmUlVVZ1EyVnlkR2xtYVdOaGRHbHZiaUJEWlc1MGNtVWdVbTl2ZENCRFFURVlNQllHCkNTcUdTSWIzRFFFSkFSWUpjR3RwUUhOckxtVmxNQ0lZRHpJd01UQXhNRE13TVRBeE1ETXdXaGdQTWpBek1ERXkKTVRjeU16VTVOVGxhTUhVeEN6QUpCZ05WQkFZVEFrVkZNU0l3SUFZRFZRUUtEQmxCVXlCVFpYSjBhV1pwZEhObApaWEpwYldsemEyVnphM1Z6TVNnd0pnWURWUVFEREI5RlJTQkRaWEowYVdacFkyRjBhVzl1SUVObGJuUnlaU0JTCmIyOTBJRU5CTVJnd0ZnWUpLb1pJaHZjTkFRa0JGZ2x3YTJsQWMyc3VaV1V3Z2dFaU1BMEdDU3FHU0liM0RRRUIKQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJSU1EczRNVkxxd2Q0bGZORTd2c0xEUDkwam1HN3NXTHFJOWlyb1dVeQpldXVPRjArVzJBcDdrYUpqYk1lTVRDNTV2NmtGL0dsY2xZMWkrYmx3N2NOUmZkQ1Q1bXpyTUV2aHZIMi9VcHZPCmJudGw4aml4d0tJeTcyS3lhT0JoVThFMmxmL3NsTG8ycnB3Y3B6SVA1WHkweG05MC9Yc1k2S3hYN1FZZ1N6SXcKV0Z2OXpham1vZnh3dkk2U2M5dVhwM3docmozQjlVaUhiQ2U5bnlWMGdWV3c5M1gyUGFSa2E5WlA1ODVBclEvZApNdE84aWhKVG1NbUoreEFkVFg3TmZoOVdEU0Z3aGZZZ2d4LzJ1aDhFaitwM2lEWEUvK3BPb1l0TlAyTWJSTU5FCjFDVjJ5cmVOMXg1S1ptVE5YTVdjZytIQ0NJaWE3RTZqOFQ0Y0xObHNIYUZMQWdNQkFBR2pnWW93Z1ljd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZCTHlXajdxVmh5Lwp6UWFzOGZFbHlhbEwxQlNaTUVVR0ExVWRKUVErTUR3R0NDc0dBUVVGQndNQ0JnZ3JCZ0VGQlFjREFRWUlLd1lCCkJRVUhBd01HQ0NzR0FRVUZCd01FQmdnckJnRUZCUWNEQ0FZSUt3WUJCUVVIQXdrd0RRWUpLb1pJaHZjTkFRRUYKQlFBRGdnRUJBSHYyNU1BTnFobEh0MDFYby82dHU3RnExUStlMitSanhZNmhVRmFUbHJnNHdDUWlacnhURkdHVgp2OURIS3BZNVAzMG9zeEJBSVdyRXI3QlNkeGpobHRoV1hlUGRObDRkcDFCVW9NVXE1S3FNbElwUG5UWC9kcVFHCkU1R2lvbjBBUkQ5VjA0SThHdFZidkZaTUlpNUdRNG9rUUMzekVyZzdjQnFrbHJrYXI0ZEJHbW9ZRFFaUHh6NXUKdVNsTkRVbUpFWWN5VytaTEJNamtYT1owYzVSZEZwZ1RsZjc3MjdGRTVUcHdyRGRyNXJNemNpakpzMWVnOWdJVwppQVlMdHFaTElDalUzajJMclRjRlUzVCtic3k4UXhkeFh2bkZ6QnFwWWU3M2RnenpjdlJ5cmM5eUFqWUhSOC92CkdWQ0pZTXpwSkpVUHdzc2Q4bTkya01mTWRjR1d4WjA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBTdWJqZWN0OiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBMYWJlbDogIkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSIKIyBTZXJpYWw6IDYyMzYwMwojIE1ENSBGaW5nZXJwcmludDogY2Q6ZTA6MjU6Njk6OGQ6NDc6YWM6OWM6ODk6MzU6OTA6Zjc6ZmQ6NTE6M2Q6MmYKIyBTSEExIEZpbmdlcnByaW50OiA1ODplODphYjpiMDozNjoxNTozMzpmYjo4MDpmNzo5YjoxYjo2ZDoyOTpkMzpmZjo4ZDo1ZjowMDpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogNDk6ZTc6YTQ6NDI6YWM6ZjA6ZWE6NjI6ODc6MDU6MDA6NTQ6YjU6MjU6NjQ6YjY6NTA6ZTQ6ZjQ6OWU6NDI6ZTM6NDg6ZDY6YWE6Mzg6ZTA6Mzk6ZTk6NTc6YjE6YzEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNekNDQXh1Z0F3SUJBZ0lEQ1lQek1BMEdDU3FHU0liM0RRRUJDd1VBTUUweEN6QUpCZ05WQkFZVEFrUkYKTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU1Ia1F0VkZKVlUxUWdVbTl2ZENCRApiR0Z6Y3lBeklFTkJJRElnTWpBd09UQWVGdzB3T1RFeE1EVXdPRE0xTlRoYUZ3MHlPVEV4TURVd09ETTFOVGhhCk1FMHhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU0KSGtRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnTWpBd09UQ0NBU0l3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOT3lTczk2Uis5MW15UDZPaS9XVUVXSk5UckdhOXYrMndCb3FPQURFUjAzClVBaWZUVXBvbERXelU5R1VZNmNnVnEvZVVYanNLajN6U0VoUVBncmZSbFdMSjIzREVFME5rVkpEMklmZ1hVNDIKdFNIS1h6bEFCRjliZnN5anhpdXBRQjdaTm9UV1NQT1NIalJHSUNUQnBGR09TaHJ2VUQ5cFhSbC9SY1BIQVk5Ugp5U1BvY3E2MHZGWUpmeExMSExHdktaQUt5VlhNRDlPMEd1MUhOVnBLN1p4ekJDSFFxcjBNRTdVQXlpWnN4R3NNCmxGcVZsTnBRbXZIL3BTdG1NYVRKT0tEZkhSKzRDUzd6cCtoblVxdVZIK0JHUHRpa3c4cGF4VEdBNkVpYW41UnAKL2huZDJITjhnY3FXM283dHN6SUZaWVEwNXViOVZ4QzFYM2EvTDdBUURjVUNBd0VBQWFPQ0FSb3dnZ0VXTUE4RwpBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQM2FGTVNmTU40aHZSNUNPZnlyWXlOSjRQR0VNQTRHCkExVWREd0VCL3dRRUF3SUJCakNCMHdZRFZSMGZCSUhMTUlISU1JR0FvSDZnZklaNmJHUmhjRG92TDJScGNtVmoKZEc5eWVTNWtMWFJ5ZFhOMExtNWxkQzlEVGoxRUxWUlNWVk5VSlRJd1VtOXZkQ1V5TUVOc1lYTnpKVEl3TXlVeQpNRU5CSlRJd01pVXlNREl3TURrc1R6MUVMVlJ5ZFhOMEpUSXdSMjFpU0N4RFBVUkZQMk5sY25ScFptbGpZWFJsCmNtVjJiMk5oZEdsdmJteHBjM1F3UTZCQm9EK0dQV2gwZEhBNkx5OTNkM2N1WkMxMGNuVnpkQzV1WlhRdlkzSnMKTDJRdGRISjFjM1JmY205dmRGOWpiR0Z6YzE4elgyTmhYekpmTWpBd09TNWpjbXd3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFIK1gyekRJMzZTY2ZTRjZnSERPRkJKcGlCU1ZZRVFCckxMcE1FK2JVTUptMkg2Tk1MVndNZW5pCmFjZnpjTnNnRlliUURmQytyQUYxaE01K24wMi90MkE3blBQS0hlSmVhTmlqblpmbFFHRFNOaUgrMExTNEY5cDAKbzMvVTM3Q1lBcXh2YTJzc0pTUnlvV1h1SlZybDVqTG44dCtyU2ZyemtHa2oyd1RaNTF4WS9HWFVsNzdNL0M0Swp6Q1VxTlFUNFlKRVZkVDFCL3lNZkdjaHM2NEpUQktia1RDSk5qWXk2emx0ejdHUlVVRzNSbkZYN2FjTTJ3NHk4ClBJV21hd29tRGVDVG1HQ3Vmc1lrbDRwaFg1R09acElKaHpiTmk1c3RQdlpSMUZEVVdTaTlnL0xNS0h0VGhtM1kKSm9odzErcVJ6VDY1eXNDUWJsckdYblJsMTF6K28rST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSBPPUQtVHJ1c3QgR21iSAojIFN1YmplY3Q6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSBPPUQtVHJ1c3QgR21iSAojIExhYmVsOiAiRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IgojIFNlcmlhbDogNjIzNjA0CiMgTUQ1IEZpbmdlcnByaW50OiBhYTpjNjo0MzoyYzo1ZToyZDpjZDpjNDozNDpjMDo1MDo0ZjoxMTowMjo0ZjpiNgojIFNIQTEgRmluZ2VycHJpbnQ6IDk2OmM5OjFiOjBiOjk1OmI0OjEwOjk4OjQyOmZhOmQwOmQ4OjIyOjc5OmZlOjYwOmZhOmI5OjE2OjgzCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlZTpjNTo0OTo2Yjo5ODo4YzplOTo4NjoyNTpiOTozNDowOToyZTplYzoyOTowODpiZTpkMDpiMDpmMzoxNjpjMjpkNDo3MzowYzo4NDplYTpmMTpmMzpkMzo0ODo4MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVF6Q0NBeXVnQXdJQkFnSURDWVAwTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkF4Q3pBSkJnTlZCQVlUQWtSRgpNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JECmJHRnpjeUF6SUVOQklESWdSVllnTWpBd09UQWVGdzB3T1RFeE1EVXdPRFV3TkRaYUZ3MHlPVEV4TURVd09EVXcKTkRaYU1GQXhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVgpCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXdPVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSm54aERSd3VpKzNNS0NPdlh3RXo3NWl2Sm45Z3BmU2VncG4KbGpnSjloQk9sU0p6bVkzYUZTM25CZndaY3lLM2pwZ0F2RHc5cktGcys5WjVKVXV0OE14azJvZytLYmdQQ2RNMAozVFAxWXRIaHpSbnA3aGhQVEZpdTRoN1dERnNWV3RnNnVNUVlaQjdqTTdLMWlYZE9ETC9abEdzVGwyOFNvLzZaCnFRVE1GZXhnYURidENIdTM5YitUN1dZeGc0ekdjVFNIVGhmcXI0dVJqUnhXUWE0aU4xNDM4aDNaMFMwTkwybFIKcDc1bXBvbzZLcjNIR3JIaEZQQytPaDI1ejF1eGF2NjBzVVlnb3ZzZU8zRHZrNWg5akhPVzhzWHZoWEN0S1NiOApIZ1ErSEtEWUQ4dFNnMko4N290VGxaQ3BWNkxxWVFYWStVM0VKL3B1cmUzNTExSDNhNlVDQXdFQUFhT0NBU1F3CmdnRWdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTk9VaWt4aUV5b1pMc3l2Y29wOU50ZWEKSE54bk1BNEdBMVVkRHdFQi93UUVBd0lCQmpDQjNRWURWUjBmQklIVk1JSFNNSUdIb0lHRW9JR0JobjlzWkdGdwpPaTh2WkdseVpXTjBiM0o1TG1RdGRISjFjM1F1Ym1WMEwwTk9QVVF0VkZKVlUxUWxNakJTYjI5MEpUSXdRMnhoCmMzTWxNakF6SlRJd1EwRWxNakF5SlRJd1JWWWxNakF5TURBNUxFODlSQzFVY25WemRDVXlNRWR0WWtnc1F6MUUKUlQ5alpYSjBhV1pwWTJGMFpYSmxkbTlqWVhScGIyNXNhWE4wTUVhZ1JLQkNoa0JvZEhSd09pOHZkM2QzTG1RdApkSEoxYzNRdWJtVjBMMk55YkM5a0xYUnlkWE4wWDNKdmIzUmZZMnhoYzNOZk0xOWpZVjh5WDJWMlh6SXdNRGt1ClkzSnNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUEwN1h0YVBLU1VpTzhhRVhVSEw3UCtQUG9lVVNicmgvWXAKM3VEeDFNWWtDZW5CejFVYnRERFp6aHIrQmxHbUZhUXQ3N0pMdnlBb0pVblJwalozTk9oazMxS3hFY2R6ZXMwNQpuc0t0akhFaDhscHJyOTg4VGxXdnNvUmxGSW01ZDhzcU1iN1BvMjNQYjBpVU1rWnY1M0dNb0thRUdUY0g4Z05GCkNTdUdkWHpmWDJsWEFOdHUyS1p5SWt0UTFIV1lWdCszR1A5RFExQ3Vla1I3OEhsUjEwTTlwOU9CMC9ESlQ3bmEKeHBlRzBJTEQ1RUp0L3JEaVpFNE9KdWRBTkNhMUNJblhDR05qT0NkMUhqUHFicWpkbjVsUGRFMkJpWUJMM1pxWApLVnd2dm9GQnVZei82bjFnQnA3TjF6M1RMcU1WdktqbUp1VnZ3OXk0QXlIcW54YnhMRlMxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DQSBEaXNpZyBSb290IFIyIE89RGlzaWcgYS5zLgojIFN1YmplY3Q6IENOPUNBIERpc2lnIFJvb3QgUjIgTz1EaXNpZyBhLnMuCiMgTGFiZWw6ICJDQSBEaXNpZyBSb290IFIyIgojIFNlcmlhbDogMTA1NzIzNTA2MDIzOTMzMzgyMTEKIyBNRDUgRmluZ2VycHJpbnQ6IDI2OjAxOmZiOmQ4OjI3OmE3OjE3OjlhOjQ1OjU0OjM4OjFhOjQzOjAxOjNiOjAzCiMgU0hBMSBGaW5nZXJwcmludDogYjU6NjE6ZWI6ZWE6YTQ6ZGU6ZTQ6MjU6NGI6Njk6MWE6OTg6YTU6NTc6NDc6YzI6MzQ6Yzc6ZDk6NzEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUyOjNkOjRhOjAzOjZkOjdiOjcwOmU5OmY1Ojk1OmIxOjQyOjIwOjc5OmQyOmI5OjFlOmRmOmJiOjFmOmI2OjUxOmEwOjYzOjNlOmFhOjhhOjlkOmM1OmY4OjA3OjAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYVRDQ0ExR2dBd0lCQWdJSkFKSzRpTnV3aXNGak1BMEdDU3FHU0liM0RRRUJDd1VBTUZJeEN6QUpCZ05WCkJBWVRBbE5MTVJNd0VRWURWUVFIRXdwQ2NtRjBhWE5zWVhaaE1STXdFUVlEVlFRS0V3cEVhWE5wWnlCaExuTXUKTVJrd0Z3WURWUVFERXhCRFFTQkVhWE5wWnlCU2IyOTBJRkl5TUI0WERURXlNRGN4T1RBNU1UVXpNRm9YRFRReQpNRGN4T1RBNU1UVXpNRm93VWpFTE1Ba0dBMVVFQmhNQ1Uwc3hFekFSQmdOVkJBY1RDa0p5WVhScGMyeGhkbUV4CkV6QVJCZ05WQkFvVENrUnBjMmxuSUdFdWN5NHhHVEFYQmdOVkJBTVRFRU5CSUVScGMybG5JRkp2YjNRZ1VqSXcKZ2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2lvOFFBQ2RhRlhTMXRGUGJDdzNPZQpOY0p4Vlg2Qis2dEdVT0RCZkVsNDVxdDVXRHphLzN3Y245aVhBbmcrYTBFRTZVRzl2Z01zUmZZdlpOU3JYYU5IClBXU2I2V2lheHN3YlA3cStzb3MwQWk2WVZSbjhqRytxWDlwTXprMERJYVBZMGpTVFZwYkxUQXdBRmp4ZkdzM0kKeDJ5bXJkTXhwN3pvNWVGbTF0TDdBN1JCWmNrUXJnNEZZOGFBYW1rdy9kTHVrTzhOSjkrZmxYUDA0U1hhYkJiZQpRVGcwNm92ODBlZ0VGR0V0UVg2c3gzZE95MUZVKzE2U0dCc0VXbWpHeWNUNnR4T2dtTGNSSzdmV1Y4eDhuaGZSCnl5WCtoazRrTGxZTWVFMmVBUkttSzZjQlpXNThZaDJFaE4vcXdHdTFwU3FWZzhOVEVReHpIUXV5UnBEUlFqck8KUUc2VnJmL0dsSzF1bDRTT2ZXK2Vpb0FOU1cxejRudVNIc1B6d2ZQckxnVnYyUnZQTjNZRXlMUmE1QmVueTkxMgpIOUFaZHVnc0JiUFduRFRZbHR4aGg1RUY1RVFJTThIYXVRaGwxSzZ5TmczcnVqaTZET1dibnV1Tlp0Mlp6OWFKClFmWUVrb29wS1cxck9oem5kWDBDY1E3endPZTl5eG5kbldDeXdtWmd0ckVFN3NubWhybWFaa0NvNXhIdGdVVUQKaS9abldlakJCaEc5M2MrQUFrOWxRSGhjUjFESW0rWWZnWHZrUktoYmhacmkzbHJWeC9rNlJHWkw1REpVZk9ScwpuTE1PUFJlaXNqUVMxbjZ5cUVtNzBYb29RTDZpRmgvZjVEY2ZFWFA3a0FwbFE2SU5mUGdHQVZVemZiQU51UFQxCnJxVkNWM3cyRVl4N1hzUURuWXg1blFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXRabjRyN0NVOWVNZzFncXR6azVXcEM1dVF1MHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUNZR1huRG5aVFBJZ203Wm5CYzZHM3Btc2dIMmVEdHBYaS9xLzA3NUtNT1lLbUZNCnRDUVNpbjF0RVJUM25MWEs1cnllSjQ1TUdjaXB2WHJBMXpZT2JZVnlicWpHb20zMituTmpmN3h1ZVFnY25ZcWYKR29wVHB0aTcyVFZWc1JIRnFRT3pWanU1aEpNaVhuN0I5aEpTaStvc1o3eitOa3oxdU0vUnMwbVNPOU1wRHBrYgpsdmRodUR2RUs3WjRiTFFqYi9EOTA3SmVkUitabGFpczl0cmh4VEY3KzlGR3M5SzhaN1JpVkxvSjkyT3drNkthCitlbFNMb3RnRXF2ODlXQlc3eEJjaThRYVF0eURXMlFPeTdXODFrL0JmRHh1alJOdCszdnJNTkRjVGEvRjFiYWwKVEZ0eHllZ3h2dWc0QmtpaEd1THEwdDRTT1ZnYS80QU9nblhtdDhrSGJBN3Yvemp4bUhIRXQzOE9GZEFsYWIwaQpuU3Z0QmZaR1I2enR3UERVTytMczdwWmJrQk5PSGxZNjY3RHZscnVXSXhHNjhrT0dkR1NWeUNoMTN4MDF1dEkzCmd6aFRPRFk3ejJ6cCtXc08wUHNFNkU5MzEyVUJlSVlNZWo0aFl2Ri9ZM0VNeVo5RTI2Z25vblcrYm9FKzE4RHIKRzVnUGNGdzBzb3JNd0lVWTYyNTZzL2Rhb1FlL3FVS1M4MkFpbCtRVW9RZWJUbmJBam4zOXBDWEhSKzMvSDNPcwp6TU9sNlc4S2pwdGx3bENGdGFPZ1V4TE1WWWRoODRHdUVFWmh2VVFodU1JOWRNOStKRFg2SEFjT216MGl5dTh4Ckw0eXNFcjN2UUNqOEtXZWZzaE5QWmlURVV4bnBIaWtWNytadHNIOHRaLzN6YkJ0MVJxUGxTaGZwcE5jTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QUNDVlJBSVoxIE89QUNDViBPVT1QS0lBQ0NWCiMgU3ViamVjdDogQ049QUNDVlJBSVoxIE89QUNDViBPVT1QS0lBQ0NWCiMgTGFiZWw6ICJBQ0NWUkFJWjEiCiMgU2VyaWFsOiA2ODI4NTAzMzg0NzQ4Njk2ODAwCiMgTUQ1IEZpbmdlcnByaW50OiBkMDphMDo1YTplZTowNTpiNjowOTo5NDoyMTphMTo3ZDpmMTpiMjoyOTo4MjowMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkzOjA1OjdhOjg4OjE1OmM2OjRmOmNlOjg4OjJmOmZhOjkxOjE2OjUyOjI4Ojc4OmJjOjUzOjY0OjE3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YTo2ZTpjMDoxMjplMTphNzpkYTo5ZDpiZTozNDoxOTo0ZDo0Nzo4YTpkNzpjMDpkYjoxODoyMjpmYjowNzoxZDpmMToyOTo4MTo0OTo2ZTpkMTowNDozODo0MToxMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSDB6Q0NCYnVnQXdJQkFnSUlYc08zcGtOL3BPQXdEUVlKS29aSWh2Y05BUUVGQlFBd1FqRVNNQkFHQTFVRQpBd3dKUVVORFZsSkJTVm94TVJBd0RnWURWUVFMREFkUVMwbEJRME5XTVEwd0N3WURWUVFLREFSQlEwTldNUXN3CkNRWURWUVFHRXdKRlV6QWVGdzB4TVRBMU1EVXdPVE0zTXpkYUZ3MHpNREV5TXpFd09UTTNNemRhTUVJeEVqQVEKQmdOVkJBTU1DVUZEUTFaU1FVbGFNVEVRTUE0R0ExVUVDd3dIVUV0SlFVTkRWakVOTUFzR0ExVUVDZ3dFUVVORApWakVMTUFrR0ExVUVCaE1DUlZNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNiCnFhdS9ZVXFYcnkrWFpwcDBYOURabHYzUDR1Um03eDhmUnpQQ1JLUGZtdDRmdFZUZEZYeHBOUkZ2dThnTWptb1kKSHRpUDJSYThFRWcyWFBCanM1QmFYQ1EzMTZQV3l3bHh1ZkVCY29Td2ZkdE5nTTM4MDIvSitOcTJEb0xTUllXbwpHMmlvUGVqMFJHeTlvY0xMQTc2TVBoTUFoTjlLU01Eaklncm82VGVuR0V5eENRMGpWbjhFVGRrWGhCaWx5TnBBCmxIUHJ6ZzVYUEFPQk9wMEtvVmREYWF4WGJYbVFlT1cxdER2WXZFeU5LS0dubzZlNkFrNGwwU3F1N2E0RElyaHIKSUE4d0tGU1ZmK0R1emdwbW5kRkFMVzRpcjUwYXdRVVowbS9BOHAvNGU3TUNRdnRRcVIwdGt3OGpxOGJCRDVMLwowS0lWOVZNSmNSei9SUk9FNWlaZStPQ0lIQXI4RnJhb2N3YTQ4R09FQXFER1d1em5kTjl3cnFPREplcld4NWVICms2Zkdpb296bDJBM0VENlhQbTRwRmRhaEQ5R0lMQktmYjZxa3hrTHJRYUxqbFVQVEFZVnRqcnM3OHlNMngvNDcKNEtFbEIwaXJ5WWwwL3dpUGdML0FsbVh6N3V4TGFMMmRpTU14czBEeDZNLzJPTHVjNU5GLzFPVlltM3o2MVBNTwptM1dSNUxwU0xobCswZlhOV2huOHVnYjIrMUtvUzVrRTNmajV0SXRRbzA1aWlmQ0hKUHFEUXNHSCt0VXRLU3BhCmNYcGthdGNuWUdNTjI4NUo5WTBma0lreUYvaHpRN2pTV3BPR1lkYmhkUXJxZVdaMmlFOXg2d1FsMWdwYWVwUGwKdVVzWFFBK3h0cm4xM2svYzRMT3NPeEZ3WUlSS1EyNlpJTUFwY1FyQVpRSURBUUFCbzRJQ3l6Q0NBc2N3ZlFZSQpLd1lCQlFVSEFRRUVjVEJ2TUV3R0NDc0dBUVVGQnpBQ2hrQm9kSFJ3T2k4dmQzZDNMbUZqWTNZdVpYTXZabWxzClpXRmtiV2x1TDBGeVkyaHBkbTl6TDJObGNuUnBabWxqWVdSdmN5OXlZV2w2WVdOamRqRXVZM0owTUI4R0NDc0cKQVFVRkJ6QUJoaE5vZEhSd09pOHZiMk56Y0M1aFkyTjJMbVZ6TUIwR0ExVWREZ1FXQkJUU2g3VGozemNuazFYMgpWdXFCNVRiTWpCNC92VEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk5LSHRPUGZOeWVUClZmWlc2b0hsTnN5TUhqKzlNSUlCY3dZRFZSMGdCSUlCYWpDQ0FXWXdnZ0ZpQmdSVkhTQUFNSUlCV0RDQ0FTSUcKQ0NzR0FRVUZCd0lDTUlJQkZCNkNBUkFBUVFCMUFIUUFid0J5QUdrQVpBQmhBR1FBSUFCa0FHVUFJQUJEQUdVQQpjZ0IwQUdrQVpnQnBBR01BWVFCakFHa0E4d0J1QUNBQVVnQmhBTzBBZWdBZ0FHUUFaUUFnQUd3QVlRQWdBRUVBClF3QkRBRllBSUFBb0FFRUFad0JsQUc0QVl3QnBBR0VBSUFCa0FHVUFJQUJVQUdVQVl3QnVBRzhBYkFCdkFHY0EKN1FCaEFDQUFlUUFnQUVNQVpRQnlBSFFBYVFCbUFHa0FZd0JoQUdNQWFRRHpBRzRBSUFCRkFHd0FaUUJqQUhRQQpjZ0R6QUc0QWFRQmpBR0VBTEFBZ0FFTUFTUUJHQUNBQVVRQTBBRFlBTUFBeEFERUFOUUEyQUVVQUtRQXVBQ0FBClF3QlFBRk1BSUFCbEFHNEFJQUJvQUhRQWRBQndBRG9BTHdBdkFIY0Fkd0IzQUM0QVlRQmpBR01BZGdBdUFHVUEKY3pBd0JnZ3JCZ0VGQlFjQ0FSWWthSFIwY0RvdkwzZDNkeTVoWTJOMkxtVnpMMnhsWjJsemJHRmphVzl1WDJNdQphSFJ0TUZVR0ExVWRId1JPTUV3d1NxQklvRWFHUkdoMGRIQTZMeTkzZDNjdVlXTmpkaTVsY3k5bWFXeGxZV1J0CmFXNHZRWEpqYUdsMmIzTXZZMlZ5ZEdsbWFXTmhaRzl6TDNKaGFYcGhZMk4yTVY5a1pYSXVZM0pzTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBWEJnTlZIUkVFRURBT2dReGhZMk4yUUdGalkzWXVaWE13RFFZSktvWklodmNOQVFFRgpCUUFEZ2dJQkFKY3hBcC9uL1VOblNFUVU1Q21IN1V3b1p0Q1BOZHBOWWJkS2wwMjEyNURnQlM0T3hublE4cGRwCkQ3MEVSOW0rMjdVcDJwdlpycW1aMWRNOE1KUDFqYUdvL0FhTlJQVEtGcFY4TTl4aWk2ZzMrQ2ZZQ1MwYjc4Z1UKSnlDcFpFVC9MdFoxcW14TllFQVpTVU5VWTlyaXpMcG01VTlFZWx2WmFvRXJRTlYvK1FFbldDekk3VWlSZkQrbQpBTS9FS1hNUk50NkdHVDZkN2htS0c5V3c3WTQ5bkNyQURkZzladU04RGIzVmxGemk0cWMxR3dRQTlqOWFqZXBECnZWK0pIYW5Cc015WjRrMEFDdHJKSjF2bkU1QmM1UFV6b2xWdDNPQUpUUyt4SmxzbmRRQUp4R0ozS1FoZm5sbXMKdG42dG4xUXdJZ1BCSG5Gay92azRDcFlZM1FJVXJDUExCaHdlcEgyTkRkNG5RZWl0MmhXM3NDUGRLNmpUMmlXSAo3ZWhWUkUySTlEWitoSnA0clBjT1Zra08xak1sMW9SUVFtd2dFaDBxMWI2ODhuQ0JwSEJndmdXMW01NEVSTDVoCkk2enBwU1NNRVlDVVdxS2l1VW5Td2R6UnArMHhFU3llR2FidTRWWGh3T3JQRFlUa0Y3ZWlmS1hlVlNVRzdzekEKaDF4QTJzeVZQMVhnTmNlNGhMNjBYYzE2Z3dGeTdvZm1YeDJ1dFlYR0p0L213WnJwSGdKSG55cW9iYWxieit4RgpkMytZSjVveVhTcmpoTzdGbUdZdmxpQWQzZGpESjlldytmN1pmYzNRbjQ4TEZGaFJueStMd3pndDN1aVAxbzJICnBQVldReGFaTFBTa1ZyUTB1R0UzeWNKWWdCdWdsNkg4V1kzcEVmYlJEMHRWTkVZcWk0WTcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRXQ0EgR2xvYmFsIFJvb3QgQ0EgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPVRXQ0EgR2xvYmFsIFJvb3QgQ0EgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIExhYmVsOiAiVFdDQSBHbG9iYWwgUm9vdCBDQSIKIyBTZXJpYWw6IDMyNjIKIyBNRDUgRmluZ2VycHJpbnQ6IGY5OjAzOjdlOmNmOmU2OjllOjNjOjczOjdhOjJhOjkwOjA3OjY5OmZmOjJiOjk2CiMgU0hBMSBGaW5nZXJwcmludDogOWM6YmI6NDg6NTM6ZjY6YTQ6ZjY6ZDM6NTI6YTQ6ZTg6MzI6NTI6NTU6NjA6MTM6ZjU6YWQ6YWY6NjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU5Ojc2OjkwOjA3OmY3OjY4OjVkOjBmOmNkOjUwOjg3OjJmOjlmOjk1OmQ1Ojc1OjVhOjViOjJiOjQ1OjdkOjgxOmYzOjY5OjJiOjYxOjBhOjk4OjY3OjJmOjBlOjFiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJQ0RMNHdEUVlKS29aSWh2Y05BUUVMQlFBd1VURUxNQWtHQTFVRUJoTUNWRmN4CkVqQVFCZ05WQkFvVENWUkJTVmRCVGkxRFFURVFNQTRHQTFVRUN4TUhVbTl2ZENCRFFURWNNQm9HQTFVRUF4TVQKVkZkRFFTQkhiRzlpWVd3Z1VtOXZkQ0JEUVRBZUZ3MHhNakEyTWpjd05qSTRNek5hRncwek1ERXlNekV4TlRVNQpOVGxhTUZFeEN6QUpCZ05WQkFZVEFsUlhNUkl3RUFZRFZRUUtFd2xVUVVsWFFVNHRRMEV4RURBT0JnTlZCQXNUCkIxSnZiM1FnUTBFeEhEQWFCZ05WQkFNVEUxUlhRMEVnUjJ4dlltRnNJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3dCZHZJNjR6RWJvb2g3NDVObkhFS0gxSnc3VzJDbkpmRgoxMHhPUlVuTFFFSzFFalJzR2NKMHBERmZoUUtYN0VNekNsUFNuSXlPdDdoNTJ5dlZhdktPWnNUdUt3RUhrdFN6CjBBTGZVUFpWcjJZT3krQkhZQzhyTWprMVVqb29nL2g3RnNZWXVHTFdSeVdSenZBWkVrMnRZL1hUUDNWZktmQ2gKTUJ3cW9KaW1GYjN1L1JrMjhPS1JRNC82eXRZUUowbE03OTNCOFlWd204cnFxRnBEL0cyR2IzUHBOMFdwOERiSAp6SWgxSHJ0c0J2K2JhejRYN0dHcWNYekdIYUwzU2VrVnRUeldvV0gxRWZjRmJ4MzlFYjdRTUFmQ0tiQUpUaWJjCjQ2S29rV29md3BGRmlGemxtTGh4cFJVWnlYeDFFY3h3ZEU4dG14MlJSUDFXS0tEK3U0WnF5UHBjQzFqY3hrdDIKeUtzaTJYTVBwZlJhQW9rL1Q1NGlndTZpZEZNcVBWTW5hUjFzampJc1pBQW1ZMkUyVHFOR3R6OTlzeTJzYlpDaQpsYUxPejlxQzV3YzBHWmJwdUNHcUtYNm1PTDZPS1VvaFpua2ZzOE8xQ1dmZTF0UUhSdk1xMnVZaU4yRExnYllQCm9BL3B5SlYvdjFXUkJYclBQUlhBYjk0SmxBR0QxelFiekVDbDhMaWJaOVdZa1R1bmhIaVZKcVJhQ1BncmRMUUEKQkR6ZnVCU082Titwald4bmtqTWR3TGZTN0pMSXZnbS9MQ2tGYndKcm51Kzh2eXE4VzhCUWowRndjWWV5VGJjRQpxWVNqTXErdTdtc1hpN0t4L216aGtJeUlxSmRJenNoTnkvTUd6MTlxQ2tLeEhoNTNMNDZnNXBJT0J2d0ZJdEltCjRURlJmVExjRHdJREFRQUJveU13SVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVh6U0JkdStXSGRYbHRka0NZNFFXd2E2Z2NGR245MHhITmNnTAoxeWc5aVhIWnFqTkI2aFFiYkNFQXdHeENHWDZmYVZzZ1F0K2kwdHJFZkpkTGpiRG9yTWp1cFdrRW1RcVNwcXNuCkxocE5nYitFMUhBZXJVZisvVXFkTStEeXVjUkZDQ0VLMm1scGMzSU52alQrbEl1dHd4NDExNktENytVNHg2V0YKSDZ2UE5Pdy9LUDRNOFZlR1RzbFY5eHpVMktWOUJucHYxZDhRMzRGT0lXV3h0dUVYZVpWRkJzNWZ6TnhHaVdObwpSSTJUOUdSd29EMmRLQVhET1hDNFluc2cvZVRiNlFpaHVKNDlDY2RQK3l6NGszWkIzbExnNFZmU25RTzhkNTcrCm5pbGU5OEZSWUIvZTJndXlMWFczUTBpVDUvWjV4b1JkZ0ZsZ2xQeDRtSTg4azFIdFFKQUgzMlJqSk10T2NRV2gKMTVRYWlETHhJblFpcnFXbTJCSnBUR0NqQXU0cjdOUmprZ3Rldmk5MmE2TzJKcnlQQTlnSzhreGtScjA1WXVXVwo2elJqRVNqTWxmR3Q3Ky9jZ0ZoSTZVdTQ2bVdzNmZ5QXRiWElSZm1zd1ovWnVlcGlpSTdFOFV1REVxM21pNFRXCm5zTHJneGlmYXJzYkpHQXpjTXpzOXpMelhObDVmZStlcFA3Skk4TWs3aFdTc1QyUlR5YUd2V1p6SkJQcXBLNWoKd2ExOWhBTThFSGlHRzNuanhQUHlCSlVncmlPQ3hMTTZBR0svNWpZazRWZTZ4eDZRZGRWZlA1VmhLOEU3emVXegphR0hRUmlhcElWSnBMZXN1eCt0M3pxWTZ0UU16VDNiUjUxeFVBVjNMZVBUSkRML1BFbzRYTFNOb2xPZXIvcW15Ckt3YlFCTTA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UZWxpYVNvbmVyYSBSb290IENBIHYxIE89VGVsaWFTb25lcmEKIyBTdWJqZWN0OiBDTj1UZWxpYVNvbmVyYSBSb290IENBIHYxIE89VGVsaWFTb25lcmEKIyBMYWJlbDogIlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEiCiMgU2VyaWFsOiAxOTkwNDE5NjY3NDEwOTAxMDc5NjQ5MDQyODcyMTc3ODY4MDE1NTgKIyBNRDUgRmluZ2VycHJpbnQ6IDM3OjQxOjQ5OjFiOjE4OjU2OjlhOjI2OmY1OmFkOmMyOjY2OmZiOjQwOmE1OjRjCiMgU0hBMSBGaW5nZXJwcmludDogNDM6MTM6YmI6OTY6ZjE6ZDU6ODY6OWI6YzE6NGU6NmE6OTI6ZjY6Y2Y6ZjY6MzQ6Njk6ODc6ODI6MzcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGRkOjY5OjM2OmZlOjIxOmY4OmYwOjc3OmMxOjIzOmExOmE1OjIxOmMxOjIyOjI0OmY3OjIyOjU1OmI3OjNlOjAzOmE3OjI2OjA2OjkzOmU4OmEyOjRiOjBmOmEzOjg5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGT0RDQ0F5Q2dBd0lCQWdJUkFKVytGcUQzTGtieGV6bUNjdnFMelpZd0RRWUpLb1pJaHZjTkFRRUZCUUF3Ck56RVVNQklHQTFVRUNnd0xWR1ZzYVdGVGIyNWxjbUV4SHpBZEJnTlZCQU1NRmxSbGJHbGhVMjl1WlhKaElGSnYKYjNRZ1EwRWdkakV3SGhjTk1EY3hNREU0TVRJd01EVXdXaGNOTXpJeE1ERTRNVEl3TURVd1dqQTNNUlF3RWdZRApWUVFLREF0VVpXeHBZVk52Ym1WeVlURWZNQjBHQTFVRUF3d1dWR1ZzYVdGVGIyNWxjbUVnVW05dmRDQkRRU0IyCk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1LKzZ5ZndJYVB6YVNaVmZwM0YKVlJhUlhQM3ZJYjlUZ0hvdDBwR01Zekh3N0NUd3c2WFNjbndRYmZRM3QrWG1mSG5xakxXQ2k2NUl0cXdBM0dWMQo3Q3BOWDhHSDlTQmxLNEdvUno2Skk1VXdGcEIvNkZjSFNPY1pycjlGWjdFM0d3WXEvdDc1ckgyRCsxNjY1SStYClo3NUxqbzFrQjFjNFZXazBOajBUU085UDR0Tm1IcVRQR3JkZU5qUFV0QWE5R0FIOWQ0UlFBRVgxakYzb0k3eCsKL2pYaDdWQjdxVENOR2RNSmptaG5YYjg4bHhoVHV5bGl4Y3BlY3NISGx0VGJMYUMwSDJrRDdPcmlVUEVNUFBDcwo4MU10OEJ6MTdXdzVPWE9BRnNoU3NDUE40RDdjM1R4SG9MczFpdUtZYUl1KzViOXk3dEw2cGUwUzdmeVlHS2ttCmR0d29TeEFnSE5OL0ZuY3Q3VytBOTBtN1V3VzdYV2pIMU1oMUZqK0pXb3YzRjBmVVRQSFNpWGsrVFQyWXFHSGUKT2g3UytGNEQ0TUhKSEl6VGpVM1RsVGF6TjE5alk1c3pGUEF0Sm10VGZJbU1Nc0p1N0QwaEFEbkpvV2ppVUlNdQpzRG9yOHphZ3JDL2tiMkhDVVFrNVBvdFR1YnRuMnR4VHVYWlpOcDFENVNEZ1BUSmdoU0pSdDhjenU5MFZMNlI0CnBnZDdnVVkyQkliZGVUWEhsU3c3c0tNWE5lVnpIN1JjV2UvYTZoQmxlM3JRZjUrenRDbzNPM0NMbTF1NUs3ZnMKc2xFU2wxTXBXdFR3RWhEY1R3SzdFcEl2WXRRL2FVTjhEZGI4V0hVQmlKMVlGa3ZldXBEL1J3R0pCbXIyWDdLUQphck1DcGdLSXY3TkhmaXJaMWZwb2VEVk5BZ01CQUFHalB6QTlNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEClZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCVHdqMWs0QUxQMWo1cVdETlhyK251cUYrZ1RFakFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQWdFQXZ1UmNZazRrOUF3SS8vRFRER2prazBraVAwUW5iN3R0M29ObXpxak1EZnoxbWdibApkeFNSNjUxQmU1a3FoT1gvL0NIQlhmRGtIMWUzZGFtaFh3SW0vOWZIOTA3ZVQvajNIRWJBZWs5QUxDSTE4Qm14CjBHdG5MTENvNE1CQU56WDJoRnhjNDY5Q2VQNm55UTFRNmcyRWR2WlI3NE5UeG5yL0RsWkpMbzk2MWd6bUoxVGoKVFFwZ2NtTE5rUWZXcGIvSW1XdnR4Qm5tcTB3Uk9NVnZNZUp1U2NnL2RvQW1BeVlwNERiMjlpQlQ0eGR3TkJlZApZMmdlYSt6RFRZYTRFekF2WFVZTlIwUFZHNnBaRHJsY2pRWklyWFNIWDhmOE1WUkJFK0xISVE2ZTRCNE40Y0I3ClE0V1F4WXBZeG1VS2VGZnl4aU1QQWRrZ1M5NFArNUtGZFNwY2M0MXRleVdSeXU1RnJnWkxBTXpUc1ZsUTJqcUkKT3lsRFJsNlhLMVRPVTIrTlN1ZVcrcjl4RGtLTGZQMG9vTkJJeXRyRWdVeTdvbk9USnNqckROWW1pTGJBSk0rNwp2VnZyZFgzcENJNkdNeXg1ZHdscHBZbjhzM0NRaDNhUDB5SzdRczY5Y3dzZ0ppclFtejF3SGlSc3pZZDJxUmVXCnQ4OE5rdnVPR0ttWVNkR2UvbUJFY2lHNUdlM0M5VEh4T1VpSWtDUjFWQmF0enZUNGFSUmtPZnVqdUxwd1FNY24KSEwvRVZsUDZZMlhROHh3T0Z2VnJobGhOR05Ua0RZNmxuVnVSM0hZa1VEL0dLdnZadDV5MTF1YlEyZWdaaXhWeApTSzIzNnRoWmlOU1F2eGF6MmVtc1dXRlV5Qnk2eXNISzRia2dUSTg2azRtbG9NeS8wL1oxcEhXV2JWWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FLVR1XHUwMTFmcmEgRUJHIEJpbGlcdTAxNWZpbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS5cdTAxNWUuIE9VPUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppCiMgU3ViamVjdDogQ049RS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUUtVHVcdTAxMWZyYSBFQkcgQmlsaVx1MDE1ZmltIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLlx1MDE1ZS4gT1U9RS1UdWdyYSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkKIyBMYWJlbDogIkUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA3NjY3NDQ3MjA2NzAzMjU0MzU1CiMgTUQ1IEZpbmdlcnByaW50OiBiODphMTowMzo2MzpiMDpiZDoyMTo3MTo3MDo4YTo2ZjoxMzozYTpiYjo3OTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IDUxOmM2OmU3OjA4OjQ5OjA2OjZlOmYzOjkyOmQ0OjVjOmEwOjBkOjZkOmEzOjYyOjhmOmMzOjUyOjM5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiMDpiZjpkNToyYjpiMDpkNzpkOTpiZDo5MjpiZjo1ZDo0ZDpjMTozZDphMjo1NTpjMDoyYzo1NDoyZjozNzo4Mzo2NTplYTo4OTozOToxMTpmNTo1ZTo1NTpmMjozYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR1N6Q0NCRE9nQXdJQkFnSUlhbWcrbkZHYnkxTXdEUVlKS29aSWh2Y05BUUVMQlFBd2diSXhDekFKQmdOVgpCQVlUQWxSU01ROHdEUVlEVlFRSERBWkJibXRoY21FeFFEQStCZ05WQkFvTU4wVXRWSFhFbjNKaElFVkNSeUJDCmFXeHB4WjlwYlNCVVpXdHViMnh2YW1sc1pYSnBJSFpsSUVocGVtMWxkR3hsY21rZ1FTN0ZuaTR4SmpBa0JnTlYKQkFzTUhVVXRWSFZuY21FZ1UyVnlkR2xtYVd0aGMzbHZiaUJOWlhKclpYcHBNU2d3SmdZRFZRUUREQjlGTFZSMQpaM0poSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRFek1ETXdOVEV5TURrME9Gb1hEVEl6Ck1ETXdNekV5TURrME9Gb3dnYkl4Q3pBSkJnTlZCQVlUQWxSU01ROHdEUVlEVlFRSERBWkJibXRoY21FeFFEQSsKQmdOVkJBb01OMFV0VkhYRW4zSmhJRVZDUnlCQ2FXeHB4WjlwYlNCVVpXdHViMnh2YW1sc1pYSnBJSFpsSUVocAplbTFsZEd4bGNta2dRUzdGbmk0eEpqQWtCZ05WQkFzTUhVVXRWSFZuY21FZ1UyVnlkR2xtYVd0aGMzbHZiaUJOClpYSnJaWHBwTVNnd0pnWURWUVFEREI5RkxWUjFaM0poSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0dlUva3dWUkhvVmlWRjU2Qy9VWQpCNE91ZnE5ODk5U0thNlZqUXptNVMvZkR4bVNKUFpRdVZJQlNPVGtIUzB2ZGhRZDJoOHkvTDVWTXpIMm5QYnhICkQ1aHcrSXlGSG5TT2ttMGJRTkdaRGJ0MWJzaXBhNXJBaERHdnlrUEw2eXMwNkkrWGF3R2IxUTVLQ0twYmtuU0YKUTlPQXJxR0lXNjZ6Nmw3TEZwcDNSTWloOWxSb3p0NlBseXU2VzBBQ0RHUVh3TFdUemVIeEUyYk9ESG52MFpFbwpxMStnRWxJd2N4bU9qK0dNQjZMRHUwcnc2aDhWcU80bHpLUkcrQnNpNzdNT1E3b3NKTGpGTEZ6VUhQaGRaTDNECmsxNG9wejhuOFk0ZTB5cFFCYU5WMmN2bk9WUEFtSjZNVkdLTEpyRDNmWTE4NU1hZVprSlZna2Zuc2xpTlp2Y0gKZkM0MjVsQWNQOXRESk1XL2hrZDVzM2tjOTFyMEUreHMrRC9pV1IrVjdrSSt1YTJvTW9WSmwwYitTekdQV3N1dApkRWNmNlpHMzN5Z0VJcURVRDEzaWVVL3FiSVdHdmFpbXp1VDZ3K0d6cnQ0OFVlN0xFM3dCZjRRT1hWR1VuaE1NCnRpNmxUUGs1Y0Radmxzb3VERVJWeGNyNlhRS2ozOVprakZxekFRcXB0UXBIRi8vdmtVQXFqcUZHT2pHWTVSSDgKekx0SlZvcjh1ZEJobW05bGJPYkR5ejUxU2Y2UHArS0p4V2ZYblVZVFRqRjJPeVN6bmhGbGhxdC83eDNVK0x6bgpyRnBjdDFwSFhGWE9WYlFpY1Z0YkMvRFAzS0JoWk9xcDEyZ0tZNmZnRFQrZ3I5T3Ewbjd2VWFEbVVTdFZraFVYClU4dTNaZzVtVFBqNWRVeVE1eEp3eDBVQ0F3RUFBYU5qTUdFd0hRWURWUjBPQkJZRUZDN2oyN0pKMEp4VWVWejYKSnlyK3pFN1M2RTVVTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVUx1UGJza25RbkZSNQpYUG9uS3Y3TVR0TG9UbFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFGCk56cjBUYmRGNGtWMUpJKzJkMUxvSE5nUWsyWHo4bGtHcEQ0ZUtleGQwZENyZk9BS2tFaDQ3VTZZQTVuK0tHQ1IKSFRBZHVHTjhxT1kxdGZyVFlYYm0xZ2RMeW1tYXNvUjZkNU5GRnhXZkpOQ1lFeEwvdTZBdS9VNU1oL2pPWEtxWQpHd1hnQUVaS2dvQ2xNNHNvM08wNDA5L2xQdW4rKzFuZFlZUlAwbFNXRTJFVFBvK0FhYjZUUjdVMVE5SmF1ejFjCjc3TkNSODA3VlJNR3NBbmIvV1AyT29nS21XOSs0YzRiVTJwRVppTlJDSHU4VzFLaS9RWTNPRUJoajBxV3VKQTMKK0diSGVKQUFGUzZMclZFMVV3ZW9hMml1K1U0OEJ5Yk5DQVZ3ekRrL2RyMmwwMmNtQVlhbVU5SmdPM3hEZjFXSwp2SlVhd1NnNVRCOUQwcEgwY2xtS3VWYjhQN1NkMm5DY2RscU1RMUR1ampCeVRkLy9TZmZHcVdmWmJhd0NFZUk2CkZpV25XQWpMYjFOQm5FZzRSMmd6MGRmSGo5UjBJZFREQlpCNi84NldpTEVWS1YwanE5QmdvUkpQM3ZRWHpUTGwKeWIvSVE2MzlMbzd4citMMG1Qb1NIeURZd0tjTWhjV1E5RHN0bGlheExMNU1xK3V4MG9ySjIzZ1REeDRKblcyUApBSjhDMnNINkgzcDZDY1JLNW9ncWw1K0ppLzAzWDE4NnpqaFpoa3V2Y1F1MDJQSndUNTh5RStPd3AxZmwydHBECnk0UTA4aWpFNm0zMEt1L0JhM2JhKzM2N2hUelNVOEpOdm5IaFJkSDlJMmNORTNYN3oyVm5JcDJ1c0FuUkNmOGQKTkwvK0k1YzMwam42UFEwR0M3VGJPNk9yYjF3ZHRuN29zNEkwN1FaY0pBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMmI6OWI6OWU6ZTQ6N2I6NmM6MWY6MDA6NzI6MWE6Y2M6YzE6Nzc6Nzk6ZGY6NmEKIyBTSEExIEZpbmdlcnByaW50OiA1OTowZDoyZDo3ZDo4ODo0Zjo0MDoyZTo2MTo3ZTphNTo2MjozMjoxNzo2NTpjZjoxNzpkODo5NDplOQojIFNIQTI1NiBGaW5nZXJwcmludDogOTE6ZTI6ZjU6Nzg6OGQ6NTg6MTA6ZWI6YTc6YmE6NTg6NzM6N2Q6ZTE6NTQ6OGE6OGU6Y2E6Y2Q6MDE6NDU6OTg6YmM6MGI6MTQ6M2U6MDQ6MWI6MTc6MDU6MjU6NTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXgKS3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZApCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sCll5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdIaGNOTURneE1EQXhNVEEwTURFMFdoY05Nek14TURBeE1qTTEKT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeQphWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwClpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxWDlvYlgraHprZVhhWFBTaTVrZmw4MmhWWUFVZApBcVN6bTFuekhvcXZOSzM4RGNMWlNCbnVhWS9KSVB3aHFnY1o3YkJjckdYSFgrMENmSHQ4TFJ2V3VybUF3aGlDCkZvVDZackFJeGxRamdlVE51VWsvOWs5dU4wZ29PQS9GdnVkb2NQMDVsMDNTeDVpUlVLckVSTE1qZlRsSDZWSmkKMWhLVFhyY3hsa0lGKzNhbkhxUDF3dnpwZXNWc3FYRlA2c3Q0dkdDdng5NzAyY3UrZmpPbGJwU0Q4RFQ2SWF2cQpqbktnUDZUZU1GdnZoazFxbFZ0RFJLZ1FGUnpsQVZmRm1QSG1CaWlScWlERnQxTW1VVU95Q3hHVldPSEFEM2JaCndJMThnZk55Y0o1di9ocU8yVjgxeHJKdk5IeStTRS9pV2puWDJKMTRucCtHUGdOZUdZdEVvdFhIQWdNQkFBR2oKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTLwpXU0EyQUhtZ29DSnJqTlh5WWRLNExNdUNTakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBTVFPaVlRc2ZkT2h5Ck5zWnQrVTJlK2lLbzRZRld6ODI3bitxcmtSazRyNnA4RlUzenRxT05wZlNPOWtTcHArZ2hsYTArQUdJV2lQQUMKdXZ4aEkrWXptekI2YXpaaWU2MEVJNFJZWmVMYks0cm5KVk0zWWxOZnZOb0JZaW1pcGlkeDVqb2lmc0Z2SFpWdwpJRW9ITk4vcS94V0E1YnJYZXRoYmRYd0ZlaWxIZmtDb01STjN6VUE3dEZGSGVpNFI0MGNSM3AxbTBJdlZWR2I2CmcxWHFmTUlwaVJ2cGI3UE80Z1dFeVM4K2VJVmlic2xmd1hoamRGakFTQmdNbVRucnBNd2F0WGxhalJXYzJCUU4KOW5vSFY4Y2lnd1V0UEpzbEpqMFlzNmxEZk1qSXEyU1BEcU8vbkJ1ZE1OdmEwQmt1cWp6eCt6T0FkdVROclJsUApCU2VPRTZGdXdnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUF0b3MgVHJ1c3RlZFJvb3QgMjAxMSBPPUF0b3MKIyBTdWJqZWN0OiBDTj1BdG9zIFRydXN0ZWRSb290IDIwMTEgTz1BdG9zCiMgTGFiZWw6ICJBdG9zIFRydXN0ZWRSb290IDIwMTEiCiMgU2VyaWFsOiA2NjQzODc3NDk3ODEzMzE2NDAyCiMgTUQ1IEZpbmdlcnByaW50OiBhZTpiOTpjNDozMjo0YjphYzo3Zjo1ZDo2NjpjYzo3Nzo5NDpiYjoyYTo3Nzo1NgojIFNIQTEgRmluZ2VycHJpbnQ6IDJiOmIxOmY1OjNlOjU1OjBjOjFkOmM1OmYxOmQ0OmU2OmI3OjZhOjQ2OjRiOjU1OjA2OjAyOmFjOjIxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmMzo1NjpiZTphMjo0NDpiNzphOToxZTpiMzo1ZDo1MzpjYTo5YTpkNzo4Njo0YTpjZTowMTo4ZToyZDozNTpkNTpmODpmOTo2ZDpkZjo2ODphNjpmNDoxYTphNDo3NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUlYRFBMWWl4ZnN6SXdEUVlKS29aSWh2Y05BUUVMQlFBd1BERWVNQndHQTFVRQpBd3dWUVhSdmN5QlVjblZ6ZEdWa1VtOXZkQ0F5TURFeE1RMHdDd1lEVlFRS0RBUkJkRzl6TVFzd0NRWURWUVFHCkV3SkVSVEFlRncweE1UQTNNRGN4TkRVNE16QmFGdzB6TURFeU16RXlNelU1TlRsYU1Ed3hIakFjQmdOVkJBTU0KRlVGMGIzTWdWSEoxYzNSbFpGSnZiM1FnTWpBeE1URU5NQXNHQTFVRUNnd0VRWFJ2Y3pFTE1Ba0dBMVVFQmhNQwpSRVV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1ZoVHVYYnlvN0xqdlBwdk1wCk5iN1BHS3crcXRuNFRhQStHa2U1dkpyZjh2N01Qa2ZvZXBiQ0pJNDE5S2tNL0lMOWJjRnlZaWU5Nm12cjU0ck0KVkQ2UVVNK0ExSlg3NkxXQzFCVEZ0cWxWSlZmYnNWRDJzR0JrV1hwcHp3TzNidzIreWo1dmRITHFxakFxYzJLKwpTWkZoeUJIK0RnTXE5Mm9nM0FJVkRWNFZhdnpqZ3NHMXhaMWtDV3lqV1pnSEo4Y2JsaXRoZEhGc1EvSDNOWWtRCjRKN3NWYUUzSXFLSEJBVXNSMzIwSExsaUtXWW95cmZoay9Xa2xBT1p1WENGdGVaSTZvMVEvTm5lekc4SER0MEwKY3AyQU1CWUhsVDhvRHYzRmRVOVQxblNhdENRdWpnS1J6M2JGbXg1VmRKeDRJYkh3TGZFTG44TFZsaGdmOEZRaQplb3dIQWdNQkFBR2pmVEI3TUIwR0ExVWREZ1FXQkJTbnBRYXhMS1lKWU83UmwrbHdycnc3R1d6YklUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRktlbEJyRXNwZ2xnN3RHWDZYQ3V2RHNaYk5zaE1CZ0cKQTFVZElBUVJNQTh3RFFZTEt3WUJCQUd3TFFNRUFRRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUJBUUFtZHpUYmxFaUdLa0dkTEQ0R2tHREVqS3dMVkxnZnVYdlRCem5rK2o1N3NqMU83WjhqCnZaZnphMXp2N3YxQXB0K2hrNkVLaHF6dklOQjVBYjE0OXhuWUpERTBCQUdtdWhXYXd5ZmMyRThQekJoai81a1AKRHBGcmRSYmhJZnpZSnNkSHQ2YlBXSEp4ZnJyaFRaVkhPOG12YmFHMHdleUo5clFQT0xYaVpOd2x6NmJiNjVwYwptYUhGQ043OTV0clYxbHBGRE1TM3dyVVU3N1FSL3c0VnRmWDEyOGE5NjFxbjhGWWlxVHhsVk1ZVnFMMkduczJECmxtaDZjWUdKNFF2aDZoRWJhQWpNYVo3c25rR2VSREltZXVLSENuRTk2K1JhcE5MYnhjM0czbUIvdWZOUFJKTHYKS3JjWVBxY1oyUXQ5c1RkQlFyQzZZQjN5L2drUnNQQ0hlNmVkCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDEgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAxIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAxIEczIgojIFNlcmlhbDogNjg3MDQ5NjQ5NjI2NjY5MjUwNzM2MjcxMDM3NjA2NTU0NjI0MDc4NzIwMDM0MTk1CiMgTUQ1IEZpbmdlcnByaW50OiBhNDpiYzo1YjozZjpmZTozNzo5YTpmYTo2NDpmMDplMjpmYTowNTozZDowYjphYgojIFNIQTEgRmluZ2VycHJpbnQ6IDFiOjhlOmVhOjU3Ojk2OjI5OjFhOmM5OjM5OmVhOmI4OjBhOjgxOjFhOjczOjczOmMwOjkzOjc5OjY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4YTo4Njo2ZjpkMTpiMjo3NjpiNTo3ZTo1Nzo4ZTo5MjoxYzo2NTo4Mjo4YToyYjplZDo1ODplOTpmMjpmMjo4ODowNTo0MTozNDpiNzpmMTpmNDpiZjpjOTpjYzo3NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVlRmhmTHEwc0dVdmpOd2MxTkJNb3RaYlVaWk13RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTVNCSE16QWVGdzB4TWpBeE1USXhOekkzTkRSYUZ3MDAKTWpBeE1USXhOekkzTkRSYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklERWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNndmxBUWp1bnliRUMwQkp5RnVUSEszQzNrRWFrRVBCdFYKd2VkWU1CMGt0TVB2aGQ2TUxPSEJQZCtDNWsrdFI0ZHM3RnRKd1VyVnU0L3NoNngvZ3BxRzdEMERtVklCMGpXZQpyTnJ3VThsbVBOU3NBZ0hhSk5NN3FBSkdyNlFjNC9oeldIYTM5ZzZRRGJYd3o4ejYrY1pNNWNPR01BcU5GMzQxCjY4WGZ1dzZjd0kySDQ0ZzRoV2Y2UHNlcjRCT2NCUmlZejVQMXNaSzAvQ1BUejlYRUowbmduanliQ0tPTFhTb2gKNFB3NXFsUGFmWDdQR2dsVHZGMEZCTStoU28rTGRvSU5vZmpTeHhSM1c1QTJCNEdiUGdiNlVsNWp4YVlBL3FYcApVaHRTdFpJNWNnTUpZcjJ3WUJadXB0MGx3Z05tM2ZNRTBVRGlUb3VHOUcvbGc2QW5oRjRFd2ZXUXZUQTl4TytvCmFidzRtNlNrbHRGaTJtbkFBWmF1eThSUk5Pb01xdjhoamxtUFNsemtZWnFuMHVrcWVJMVJQVG9WN3FKWmpxbGMKM3NYNWtDTGxpRVZ4M1pHWmJIcWZQVDJZZkY3MnZoWm9vRjZ1Q3lQOFdnK3FJbll0eWFFUUhlVFRSQ09RaUovRwpLdWJYOVpxeldCNHZNSWtJRzFTaXRaZ2o3QWgzSEpWZFlkSExpWnhmb2txUm11OGhxa2tXQ0tpOVlTZ3h5WFN0CmhmYlp4YkdMMGVVUU1rMWZpeUE2UEVrZk00VlpEZHZMQ1hWRGFYUDdhM0Y5OE4vRVRIM0dveTdJbFhuTGM2S08KVGswaysxN2tCTDV5RzZZbkxVbGFtWHJYWEFrZ3QzK1V1VS94RFJ4ZWlFSWJFYmZua2R1ZWJQUnEzNHdHbUFPdAp6Q2p2cFVmelV3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVVvNWZXODE2aUVPR3JSWjg4RjJRODdnRnduTXd3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFCajZXM1g4UG5ySFgzZkh5dC9QWDhNU3hFQmQxREtxdUdyWDFSVVZScGdqcGVhUVd4aVpUT090UXFPQwpNVGFJemVuN3hBU1dTSXNCeDQwQnoxc3pCcFpHWm5RZFQrM0J0cm0wRFdITVkzN1hMbmVNbGh3cUkyaHJoVmQyCmNETVQvdUZQcGlOM0dQb2FqT2k5WmNuUFAvVEpGOXpyeDd6QUJDNHRSaTlwWnNNYmovN3NQdFBLbEw5MkNpVU4KcVhzQ0hLblFPMThMd0lFNlBXVGh2NmN0VHIxTnhOZ3B4aUlZME1Xc2NnS0NQNm82b2pvaWx6SGRDR1BEZFJTNQpZQ2d0VzJqZ0ZxbG1naU5SOWV0VDJER2JlK20zblV2cmlCYlArVjA0aWtrd2orM3g2eG4wZHhveEdFMW5WR3d2CmIyWDUyejNzSWV4ZTlQU0x5bUJsVk5GeFpQVDVwcU9CTXpZemNmQ2tlRjlPcllNaDNqUkpqZWhackozeWRsbzIKOGhQMHIrQUp4MkVxYlBmZ25hNjdoa29vYnk3dXRIbk5rRFBEczNiNjlmQnNuUUdRK3A2UTlweHl6MGZhd3gvawpOU0JUOGxUUjMyR0RwZ0xpSlRqZWhUSXRYbk9RVWwxQ3hNNDlTK0g1R1lRZDFhSlF6RUg3UVJURHZkYkpXcU5qClpnS0F2UVU2TzBlYzdBQW1UUFdJVWIrb0kzOFlCN0FMN1lzbW9XVFRZVXJyWEovZXM2OW5BN01mM1cxZGFXaHAKcTE0NjdIeHB2TWM3aFU2ZUZibTBGVS9EbFhwWTE4bHM2V3k1OHlsalhyUXM4QzA5N1ZwbDRLbGJRTUpJbVlGdApuaDhHS2p3U3RJc1BtNklrOEthTjFucmdTN1prbG1PVmhNSkt6Und1SkljellPWEQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDIgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDIgRzMiCiMgU2VyaWFsOiAzOTAxNTYwNzk0NTg5NTkyNTc0NDYxMzMxNjkyNjYwNzk5NjIwMjY4MjQ3MjU4MDAKIyBNRDUgRmluZ2VycHJpbnQ6IGFmOjBjOjg2OjZlOmJmOjQwOjJkOjdmOjBiOjNlOjEyOjUwOmJhOjEyOjNkOjA2CiMgU0hBMSBGaW5nZXJwcmludDogMDk6M2M6NjE6ZjM6OGI6OGI6ZGM6N2Q6NTU6ZGY6NzU6Mzg6MDI6MDU6MDA6ZTE6MjU6ZjU6Yzg6MzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhmOmU0OmZiOjBhOmY5OjNhOjRkOjBkOjY3OmRiOjBiOmViOmIyOjNlOjM3OmM3OjFiOmYzOjI1OmRjOmJjOmRkOjI0OjBlOmEwOjRkOmFmOjU4OmI0OjdlOjE4OjQwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVVJGYzBKRnVCaVpzMThzNjRLenRicHlid2RTZ3dEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNaUJITXpBZUZ3MHhNakF4TVRJeE9EVTVNekphRncwMApNakF4TVRJeE9EVTVNekphTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURJZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2hyaVd5QVJqY1Y0Zy9SdXY1citMckkzSGltdEZoWmlGZgpxcThuVWVWdUd4YlVMWDFRc0ZOM3ZYZzZZT0prQXB0OGhwdldHbzZ0L3g4VmY5V1ZIaExMNWhTRUJNSGZOck1XCm40cmp5ZHVZTk03WU14Y29SdnlueWZEU3ROVk5DWEpKK2ZLSDQ2bmFmYUY5YTdJNkphbHRVa1NzK0w1dSs5eW0KYzVHUVlhWURGQ0R5NTRlamlLMnRvSXovcGdzbFVpWG5GZ0hWeTdnMWdReWpPL0RoNGZ4YVhjNkFjVzM0U2FzKwpPN3E0MTRBQis2WHJXN1BGWG1BcU1hQ3ZOK2dnT3Arb01pd016QWtkMDU2T1hieE1tTzdGR21oNzdGT202UlExCm85L05nSjhNU1BzYzlQRy9Tcmo2MVl4eFNzY2ZyZjVCbXJPRFhmS0VWdStsVjBQT0thMk1xMVcveFB0YkFkMGoKSWFGWUFJN0QwR29UN1JQakVpdUEzR2ZtbGJMTkhpSnVLdmhCMVBMS0ZBZU5pbFVTeG1uMXVJWm9MMU5lc05LcQpJY0dZNWpEaloxWEhtMjZzR2FoVnBrVUcwQ002Mit0bFhTb1JFZkE3VDhwdDlEVEVjZVQvQUZyMlhLNGpZSVZ6CjhlUVFzU1d1MVpLN0U4RU00RG5hdERsWHRhczFxbkloTzRNMTV6SGZlaUZ1dURJSWZSMHlrUlZLWW5MUDQzZWgKdk5VUkczWUJad2pnUVF2RDZ4VnUrS1FaMmFLcnIrSW5VbFlyQW9vc0ZDVDV2MElDdnliSXhvL2diamg5VXkzbAo3Wml6bFdOb2YvazE5TitJeFdBMWtzQjhhUnhobFJiUTY5NExyejRFRUVWbFdGQTRyMGp5V2JZVzhqd05rQUxHCmNDNEJyVHdWMXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVTdlZHZkbHEvWU94Slc4YWxkN3R5Rm5HYnhEMHdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUpIZmdEOURDWDV4d3ZmcnM0aVA0Vkd5dkQxMStTaGR5THlabTN0ZHF1WEs0UXIzNkxMVG45MW5NWDY2CkFhckhha0U3a05RSVhMSmdhcER3eU00RFl2bUw3ZnR1S3R3R1RUd3BENGtXaWxoTVNBL29oR0hxUEhLbWQrUkMKcm9palExaDVmcTdLcFZNTnFUMXd2U0FaWWFSc09QeERNdUhCUi8vNDdQRVJJaktXbk1MMlcybVdleUFNUTBHYQpXL1paR1lqZVZZZzNVUXQ0WEFvZW8wTDl4NTJJRDhEeWVBSWtWSk92aVllSXlVcUFIZXJRYmo1aExqYTdOUTRuCmx2MW1ORHRoY25QeEZseEhCbFJKQUhwWUVyQUs3NFg5c2JnemRXcVRIQkxtWUY1dkhYL0pIeVBMaEdHZkhvSkUKK1YrdFlsVWttbEtZN1ZIbm9YNlhPdVl2SHhIYVU0QXNoWjZyTlJEYklsOXF4VjZYVS9JeUFna3dvMWp3RFFIVgpjc2F4ZkdsN3cvVTJSY3hoYmw1TWxNVmVydWdPWG91Lzk4M2c3YUVPR3pQdVZCaitENzd2Zm9SclErTndtTnRkCmRiSU5XUWVGRlNNNTF2SGZxU1lQMWtqSHM2WWk5VE0zV3BWSG4zdTZHQlZ2LzlZVVpJTkowZ3BuSWRzUE5XTmcKS0NManNaV0R6WVdtM1M4UDUyZFNicnN2aFh6MVNuUG54VDdBdlNFU0JULzh0d05KQWx2SUplYmlWRGoxZVllTQpIVk95VG9WN0JqakhMUGo0c0hLTkplVjNVdlFESEVpbVVGK0lJREJ1OG9KRHF6MlhoT2RUK3lIQlR3OGltb2E0CldTcjJSejBaaUMzb2hlR2U3SVVJYXJGc05Na2Q3RWdyTzNqdFpzU09lV21EM24rTQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAzIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyIKIyBTZXJpYWw6IDI2ODA5MDc2MTE3MDQ2MTQ2MjQ2Mzk5NTk1MjE1NzMyNzI0MjEzNzA4OTIzOTU4MQojIE1ENSBGaW5nZXJwcmludDogZGY6N2Q6Yjk6YWQ6NTQ6NmY6Njg6YTE6ZGY6ODk6NTc6MDM6OTc6NDM6YjA6ZDcKIyBTSEExIEZpbmdlcnByaW50OiA0ODoxMjpiZDo5MjozYzphODpjNDozOTowNjplNzozMDo2ZDoyNzo5NjplNjphNDpjZjoyMjoyZTo3ZAojIFNIQTI1NiBGaW5nZXJwcmludDogODg6ZWY6ODE6ZGU6MjA6MmU6YjA6MTg6NDU6MmU6NDM6Zjg6NjQ6NzI6NWM6ZWE6NWY6YmQ6MWY6YzI6ZDk6ZDI6MDU6NzM6MDc6MDk6YzU6ZDg6Yjg6Njk6MGY6NDYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVTHZXYkFpaW4yM3IvMWFPcDdyMERvTThTYWgwd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ015QkhNekFlRncweE1qQXhNVEl5TURJMk16SmFGdzAwCk1qQXhNVEl5TURJMk16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRE1nUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDenl3NFFaNDdxRkplbk1pb0tWalovYUV6SHMyODZJeFNSCi94bC9wY3FzN3JOMm5YcnBpeHVyYXpIYitndFRUSy9GcFJwNVBJcE0vNnpmSmQ1TzJZSXlDMFRleXR1TXJLTnUKRm9NN3BtUkxNb243RmhZNGZ1dEQ0dE4wU3NKaUNuTUszVW16VjlLd0NvV2RjVHplbzh2QU12TUJPU0JER3pYUgpVN094N3NXVGFZSStGclVvUnFIZTZva0o3VU80QlVhS2h2VlpSNzRiYndFaEVMbjlxZElveWhBNUNjb1ROcytjCnJhMUFkSGtyQWo4MC8vb2dhWDNUN21IMXVyUG5NTkEzSTRaeVlVVXBTRmxvYjNlbUxvRytCMDF2cjg3RVJST1IKRkhBR2p4K2YrSWRwc1E3dnc0a1o2K29jWWZ4NmJJcmMxZ01MbmlhNkV0M1VWRG1ySnFNejZuV0IyaTNORDAvawpBOUh2RlpjYmE1REZBcENUWmdJaHNVZmVpNXBLZ0xsVmo3V2lMOERXTTJmYWZzU250QVJFNjBmNzVsaTU5d3p3CmV5dXh3SEFwdzBCaUxUdElhZHdqUEVqcmV3bDVxVzNhcURDWXo0QnlBNGltVzBhdWNubDhDQU1oWmE2MzRSeWwKc1NxaU1kNW1CUGZBZE9oeDN2ODlXY3lXSmhLTGhaVlhHcXRyZFF0RVBSRW9QSHRodCtLUFowL2w3RHhNWUlCcApWemdlQVZ1TlZlakgzOERNZHlNMFNYVjg5cGdSNnkzZTdVRXVGQVVDZitEK0lPczE1eEdzSXM1WFBkN0pNRzBRCkE0WE44ZitNRnJYQnNqNkliR0Iva0UrVjkvWXRyUUU1QndUNmRZQjl2MGxRN2UvSnhId2M2NEIrMjdiUTNSUCsKeWRPYzE3S1hxUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVeGhmUXZLanFBa1B5R3dhWlhTdVFJTG5Ybk9Rd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBRFJoMlZhMUVvZFZUZDJqTlRGR3U2UUhjcnhmWVdMb3Bmc0xON0U4dHJQNktaMS9BdldreWFpVHQzcHgKS0dtUGMrRlNrTnJWdmpybHQzWnFWb0FoMzEzbTZUcWU1VDcyb21uSEtncXdHRWZjSUhCOVVxTStXWHpCdXNuSQpGVUJoeW5MV2NLelN0L0FjNUlZcDhNN3ZhR1BRdFNDS0ZXR2Fmb2FZdE1uQ2R2dk11akFXektOaHhuUVQ1V3Z2Cm94WHFBLzRUaTJUazA4SFM2SVQ3U2RFUVRYbG02NnI5OUkweEhuQVVyZHplWnhOTWdSVmh2TGZaa1hkeEdZRmcKdS9CWXBiV2NDL2VQSWxVbndFc0JiVHVaRGRRZG0yTm5MOUR1RGNwbXZKUlBwcTN0L081anJGYy9aU1hQc29hUAowQWovdUhZVWJ0N2xKK3lyZUxWVHViWS82Q0Q1MHFpK1lVYktoNHlFOC9ueG9HaWJJaDZCSnBzUUJKRnh3QVlmCjNLRFR1VmFuNDVndGY0T2QzNHdybkRLT01wVHdBVHdpS3A5RHdpN0RtRGtIT0h2OFhnQkNIL015Sm5tRGhQYmwKOE1GUkVzQUxIZ1FqREZTbFRDOUp4VXJSdG01Z0RXdjhhNHVGSkdTM2lRNnJKVWRiUE05K1NiM0g2UXJHMnZkKwpEaGNJMDBpWDBIR1M4QTg1UGpScUhIM1k4aUt1dTJuME03U21TRlhSRHc0bTZPeTJDeTJuaFRYTi9WbkluOUhOClBsb3BOTGs5aE02eFpkUlprWkZXZFNIQmQ1NzVldUZnbmRPdEJCajBmT3RlazQ5VFNpSXArRWdyUGsyR3JGdC8KeXdhWldXRFlXR1dWalVUUjkzOStKMzk5cm9EMUIweTJQcHh4VkprRVMvMVkrWmowCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIiCiMgU2VyaWFsOiAxNTM4NTM0ODE2MDg0MDIxMzkzODY0MzAzMzYyMDg5NDkwNTQxOQojIE1ENSBGaW5nZXJwcmludDogOTI6Mzg6Yjk6Zjg6NjM6MjQ6ODI6NjU6MmM6NTc6MzM6ZTY6ZmU6ODE6OGY6OWQKIyBTSEExIEZpbmdlcnByaW50OiBhMTo0Yjo0ODpkOTo0MzplZTowYTowZTo0MDo5MDo0ZjozYzplMDphNDpjMDo5MTo5Mzo1MTo1ZDozZgojIFNIQTI1NiBGaW5nZXJwcmludDogN2Q6MDU6ZWI6YjY6ODI6MzM6OWY6OGM6OTQ6NTE6ZWU6MDk6NGU6ZWI6ZmU6ZmE6Nzk6NTM6YTE6MTQ6ZWQ6YjI6ZjQ6NDk6NDk6NDU6MmY6YWI6N2Q6MmY6YzE6ODUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURsakNDQW42Z0F3SUJBZ0lRQzVNY090WTVaK3BuSTcvRHI1cjBTekFOQmdrcWhraUc5dzBCQVFzRkFEQmwKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2CmIzUWdSekl3SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObApjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6SXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFo1eWd2VWo4MmNrbUlrelR6K0dvZU1WU0EKbjYxVVFiVkgzNWFvMUsrQUxia0t6M1g5aWFWOUpQcmpJZ3dydkpVWEN6Ty9HVTFCQnBBQXZReE5FUDRIdGVjYwpiaUpWTVdXWHZkTVgwaDVpODl2cWJGQ01QNFFNbHMrM3l3UGd5bTJoRkV3YmlkM3RBTEJTZksrUmJMRTRFOUhwCkVnakFBTEFjS3hIYWQzQTJtNjdPZVlmY2duRG1DWFJ3Vldtdm8yaWZ2OTIyZWJQeW5YQXBWZlNyLzVWaDg4bEEKYngzUnZwTzcwNGdxdTUyL2NscFdjVHMvMVBQUkN2NG83NlB1MlptdkE5T1BZTGZ5a3FHeHZZbUpIekROdzZZdQpZak91RmdKM1JGcm5nUW84cDBRdWViZy9CTHhjb0lmaEc2OVJqczNzTFByNC9tM3dPbnlxaStSbmxUR05BZ01CCkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVcKQkJUT3cwcTVtVlh5dU50Z3Y2bCt2VmExbHphbjFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF5cVZWak9QSQpRVzVwSjZkMUVlODhoalp2MHAzR2VEZ2RhWmFpa21rdU9HeWJmUVRVaWFXeE1UZUt5U0hNcTJ6Tml4eWExcjlJCjBqSm13WXJBOHk4Njc4RGoxSkdHMFZEakE5dHpkMjlLT1ZQdDNpYkh0WDJ2SzBMUmRXTGpTaXNDeDFCTDRHbmkKbG13T1JHWVFSSSt0QmV2NGVheW1HK2czTkoxVHlXR3FvbEt2U25BV2hzSTZ5TEVUY0RiWXorNzBDalRWVzB6OQpCNXlpdXRrQmNsenpUY0hkRHJFY0RjUmp2cTMwRlB1SjdLSkJEa3pNeUZkQTBHNERxczBNam9tWm1XendQREN2Ck9OOXZ2S08rS1NBbnEzVC9FeUo0M3BkU1ZSNkR0VlFnQSs2dXdFOVczamZNdzMrcUJDZTcwM2U0WXRzWGZKd28KSWhOemJNOG05WW9wNXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIgojIFNlcmlhbDogMTU0NTkzMTI5ODEwMDg1NTM3MzE5MjgzODQ5NTMxMzU0MjY3OTYKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOjdmOjY1OjMxOjBjOjgxOmRmOjhkOmJhOjNlOjk5OmUyOjVjOmFkOjZlOmZiCiMgU0hBMSBGaW5nZXJwcmludDogZjU6MTc6YTI6NGY6OWE6NDg6YzY6Yzk6Zjg6YTI6MDA6MjY6OWY6ZGM6MGY6NDg6MmM6YWI6MzA6ODkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDdlOjM3OmNiOjhiOjRjOjQ3OjA5OjBjOmFiOjM2OjU1OjFiOmE2OmY0OjVkOmI4OjQwOjY4OjBmOmJhOjE2OjZhOjk1OjJkOmIxOjAwOjcxOjdmOjQzOjA1OjNmOmMyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUmpDQ0FjMmdBd0lCQWdJUUM2RmEraDNmb0xWSlJLL05KS0JzN0RBS0JnZ3Foa2pPUFFRREF6QmxNUXN3CkNRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3UKWkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZwpSek13SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWClV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXUKWTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6TXdkakFRQmdjcQpoa2pPUFFJQkJnVXJnUVFBSWdOaUFBUVo1N3lzUkdYdHpiZy9XUHVOc1ZlcFJDMEZGZkx2Qy84UWRKKzFZbEpmClpuNGY1ZHdiUlhrTHpNWlRDcDJOWFFMWnFWbmVBbHIybFNvT2pUaEtpa25Hdk1ZRE9BZGZWZHArQ1c3aWYxN1EKUlNBUFdYWVExcUFrOEMzZU52SnNLVG1qUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdHR01CMEdBMVVkRGdRV0JCVEwwTDJwNFpnRlVhRk5ONktEZWM2TkhTcmtoREFLQmdncWhrak9QUVFECkF3Tm5BREJrQWpBbHBJRkZBbXNTUzNWMFQ4Z2o0M0R5ZFhMZWZJbnd6NUZ5WVo1ZUVKSlpWcm1EeHhEbk9PbFkKSmpaOTFlUTBoamtDTUh3MlUvQXc1V0pqT3BuaXRxTTdtelQ2SHRvUWtuRmVrUk9uM2FSdWtzd3kxdlVoWnNjdgo2cFpqYW1WRmtwVUJ0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIiCiMgU2VyaWFsOiA0MjkzNzQzNTQwMDQ2OTc1Mzc4NTM0ODc5NTAzMjAyMjUzNTQxCiMgTUQ1IEZpbmdlcnByaW50OiBlNDphNjo4YTpjODo1NDphYzo1Mjo0Mjo0NjowYTpmZDo3Mjo0ODoxYjoyYTo0NAojIFNIQTEgRmluZ2VycHJpbnQ6IGRmOjNjOjI0OmY5OmJmOmQ2OjY2Ojc2OjFiOjI2OjgwOjczOmZlOjA2OmQxOmNjOjhkOjRmOjgyOmE0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYjozYzpjYjpiNzo2MDozMTplNTplMDoxMzo4Zjo4ZDpkMzo5YToyMzpmOTpkZTo0NzpmZjpjMzo1ZTo0MzpjMToxNDo0YzplYToyNzpkNDo2YTo1YTpiMTpjYjo1ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGpqQ0NBbmFnQXdJQkFnSVFBenJ4NXFjUnFhQzdLR1N4SFFuNjVUQU5CZ2txaGtpRzl3MEJBUXNGQURCaApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkgKTWpBZUZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4TWpBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVApNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqCmIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVjeU1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6Zk5OTng3YThteWFKQ3RTblgvUnJvaENnaU45UmxVeWZ1SQoyL091OGpxSmtUeDY1cXNHR212UHJDM29YZ2trUkxwaW1uN1dvNmgrNEZSMUlBV3NVTGVjWXhwc01OemFIeG14CjF4N2UvZGZneTVTRE42N3NIME5PM1hzczByMHVwUy9rcWJpdE90U1pwTFlsNlp0ckFHQ1NZUDlQSVVrWTkyZVEKcTJFR25JL3l1dW0wNlpJeWE3WHpWK2hkRzgyTUhhdVZCSlZKOHpVdGx1TkpiZDEzNC90SlM3U3NWUWVwajVXegp0Q083VEcxRjhQYXBzcFV3dFAxTVZZd25TbGNVZklLZHpYT1MweFpLQmd5TVVOR1BIZ20rRjZIbUljcjlnK1VRCnZJT2xDc1JuS1BaekZCUTlSbmJEaHhTSklUUk5ydzlGREtaSm9icTduTVd4TTRNcGhRSURBUUFCbzBJd1FEQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVVUaUpVSUJpVgo1dU51NWcvNitya1M3UVlYanprd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFHQm5LSlJ2RGtoajZ6SGQ2bWNZCjFZbDlQTVdMU24vcHZ0c3JGOSt3WDNOM0tqSVRPWUZuUW9RajhrVm5OZXlJdi9pUHNHRU1OS1N1SUV5RXh0djQKTmVGMjJkK21RcnZIUkFpR2Z6WjBKRnJhYkEwVVdUVzk4a25kdGgvSnN3MUhLajJaTDd0Y3U3WFVJT0daWDFORwpGZHRvbS9Eek1OVStNZUtOaEo3aml0cmFsajQxRTZWZjhQbHdVSEJIUVJGWEdVN0FqNjRHeEpVVEZ5OGJKWjkxCjhyR09tYUZ2RTdGQmNmNklLc2hQRUNCVjEvTVVSZVhnUlBUcWg1VXlrdzcrVTBiNkxKMy9peUs1UzlrSlJhVGUKcExpYVdOMGJmVktmamxsRGlJR2tuaWJWYjYzZERjWTNmZTBEa2h2bGQxOTI3anlOeEYxV1c2TFpabTZ6TlRmbApNclk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMiCiMgU2VyaWFsOiA3MDg5MjQ0NDY5MDMwMjkzMjkxNzYwMDgzMzMzODg0MzY0MTQ2CiMgTUQ1IEZpbmdlcnByaW50OiBmNTo1ZDphNDo1MDphNTpmYjoyODo3ZToxZTowZjowZDpjYzo5Njo1Nzo1NjpjYQojIFNIQTEgRmluZ2VycHJpbnQ6IDdlOjA0OmRlOjg5OjZhOjNlOjY2OjZkOjAwOmU2Ojg3OmQzOjNmOmZhOmQ5OjNiOmU4OjNkOjM0OjllCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzMTphZDo2Njo0ODpmODoxMDo0MTozODpjNzozODpmMzo5ZTphNDozMjowMTozMzozOTozZTozYToxODpjYzowMjoyOTo2ZTpmOTo3YzoyYTpjOTplZjo2NzozMTpkMAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1B6Q0NBY1dnQXdJQkFnSVFCVlZXdlBKZXBEVTF3NlFQMWF0RmNqQUtCZ2dxaGtqT1BRUURBekJoTVFzdwpDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1ClpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSE16QWUKRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVdwpFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWpiMjB4CklEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN6TUhZd0VBWUhLb1pJemowQ0FRWUYKSzRFRUFDSURZZ0FFM2FmWnU0cTRDL3NMZnlIUzhMNitjL016WFJxOE5PcmV4cHU4MEpYMjhNelFDN3BoVzFGRwpmcDR0bis2T1l3d1g3QWR3OWMrRUxrQ0RuT2cvUVcwN3JkT2tGRmsyZUowRFErNFFFMnh5M3E2SXA2RnJ0VVBPClo5d2ovd01jbytJK28wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWQKQmdOVkhRNEVGZ1FVczl0SXBQbWh4ZGl1TmtITUVXTnBZaW04UzhZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJeApBSzI4OG13L0VrclJMVG5EQ2dtWGMvU0lOb3lJSjd2bWlJMVFoYWRqK1o0eTNtYVREL0hNc1FtUDNXeXIrbXQvCm9BSXdPV1pid21TTnVKNVEzS2pWU2FMdHg5elJTWDhYQWJqSWhvOU9qSWdycUpxcGlzWFJBTDM0Vk9LYTVWdDgKc3ljWAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IgojIFNlcmlhbDogNzQ1MTUwMDU1ODk3NzM3MDc3NzkzMDA4NDg2OTAxNjYxNDIzNgojIE1ENSBGaW5nZXJwcmludDogNzg6ZjI6ZmM6YWE6NjA6MWY6MmY6YjQ6ZWI6Yzk6Mzc6YmE6NTM6MmU6NzU6NDkKIyBTSEExIEZpbmdlcnByaW50OiBkZDpmYjoxNjpjZDo0OTozMTpjOTo3MzphMjowMzo3ZDozZjpjODozYTo0ZDo3ZDo3Nzo1ZDowNTplNAojIFNIQTI1NiBGaW5nZXJwcmludDogNTU6MmY6N2I6ZGM6ZjE6YTc6YWY6OWU6NmM6ZTY6NzI6MDE6N2Y6NGY6MTI6YWI6Zjc6NzI6NDA6Yzc6OGU6NzY6MWE6YzI6MDM6ZDE6ZDk6ZDI6MGE6Yzg6OTk6ODgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrRENDQTNpZ0F3SUJBZ0lRQlpzYlY1Nk9JVExpT1FlOXAzZDFYREFOQmdrcWhraUc5dzBCQVF3RkFEQmkKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TRXdId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnClJ6UXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCaU1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdQpZMjl0TVNFd0h3WURWUVFERXhoRWFXZHBRMlZ5ZENCVWNuVnpkR1ZrSUZKdmIzUWdSelF3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMvNXBCemFONjc1RjFLUERBaU1Ha3o3TUtuSlM3SklUM3kKaXRoWnd1RXBwejFZcTNhYXphNTdHNFFOeERBZjh4dWtPQmJyVnNhWGJSMnJzbm55eWhIUzVGL1dCVHhTRDFJZgp4cDRWcFg2K242bFhGbGxWY3E5b2szRENzcnAxbVdwek1wVFJFRVFRTHQrQzh3ZUU1blE3YlhIaUxRd2I3aURWCnlTQWRZeWt0enV4ZVRzaVQrQ0ZobXpUckJjWmU3RnNhdk92Sno4MnNORUJmc1hwbTduZklTS2htVjFlZlZGaU8KREN1M1Q2Y3cyVmJ1eW50ZDQ2M0pUMTdsTmVjeHk5cVRYdHlPajREYXRwR1lRSkI1dzNqSHRySEV0V29ZT0FNUQpqZGpVTjZRdUJYMkk5WUkrRUpGd3ExV0NRVExYMndSekttNlJBWHdoVE5TOHJoc0RkVjE0WnRrNk1VU2FNMEMvCkNOZGFTYVRDNXFtZ1o5MmtKN3loVHptMUVWZ1g5eVJjUm85azk4RnBpSGFZZGoxWlhVSjJoNG1YYVhwSThPQ2kKRWh0bW1uVEsza3NlNXc1anJ1YlU3NUtTT3A0OTNBRGtSU1dKdHBwRUdTdCt3SlMwMG1GdDZ6UFp4ZDlMQkFETQpmUnlWdzQvM0liS3lFYmU3Zi9MVmpIQXNRV0Nxc1dNWVJKVWFkbUorOW9DdysraGtwalBSaVFmaHZiZm1RNlFZCnVLWjNBZUVQbEF3aEhiSlVLU1dKYk9VT1VsRkhkTDRtckxaQmRkNTZyRitOUDhtODAwRVJFbHZsRUZEck1jWEsKY2hZaUNkOThUSFUvWSt3aFg4UWdVV3R2c2F1R2kwL0Mxa1ZmblNEOG9SN0Z3SStpc1g0S0pwbjE1R2t2bUIwdAo5ZG1wc2gzbEd3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCmhqQWRCZ05WSFE0RUZnUVU3TmZqZ3RKeFhXUk0zeTVuUCtlNm1LNGNEMDh3RFFZSktvWklodmNOQVFFTUJRQUQKZ2dJQkFMdGgyWDJwYkw0WHhKRWJ3NkdpQUkzalpHZ1BWczkzcm5ENS9acEttYm5KZUZ3TURGL2s1aFFwVmdzMgpTVjFFWStDdG5KWVlaaHNqRFQxNTZXMXIxbFQ0MGp6QlEwQ3VIVkQxVXZ5UU83dVltV2xyeDhHbnFHaWtKOXlkCitTZXVNSVc1OW1kTk9qNlBXVGtpVTBUcnlGMER5dTFRZW4xaUlRcUF5SE5tMGFBRllGL29wYlNucjZqM2JUV2MKZkZxSzFxSTRtZk40aS9STjBpQUwzZ1R1akp0SGdYSU53QlF5N3pCWkxxN2djZkpXNUdxWGI1SlFiWmFOYUhxYQpzallVZWdieUpMa0pFVkRYQ0xHNGlYcUVJMkZDS2VXanphSWdRZGZSbkdUWjZpYWhpeFRYVEJteVVFRnhQVDlOCmNDT0dERXJjZ2RMTU1wU0VEUWdKbHh4UHdPNXJJSFF3MHVBNU5CQ0ZJUlVCQ09oVk10NXhTZGtvRjFCTjVyNU4KMFhXczBNcjdRYmhEcGFyVHd3VkVUeXcybStMNjRrVzRJMU5zQm05blZYOUd0VXcvYmloYWVTYlNwS2hpbDlJZQo0dTFLaTd3Yi9VZEtEZDluWm42eVcwSFFPK1QwTy9RRVkrbnZ3bFFBVWFDS0tzbk9lTXpWNm9jRUdMUE9yMG1JCnIvT1NtYmF6NW1FUDBvVUE1MUFhNUJ1Vm5SbWh1Wnl4bTdFQUh1L1FEMDlDYk1rS3ZPNUQranB4cGNoTkpxVTEKL1lsZHZJVmlIVExTb0N0VTdacFh3ZHY2RU04WnQ0dEtHNDhCdGllVlUraTJpVzFidkdqVUkraUxVYUpXK2ZDbQpnS0RXSHJPOER3OVRkU21xNmhOMzVONk1nU0d0QnhCSEVhMkhQUWZSZGJ6UDgyWisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEwMTkwOTA4NDUzNzU4MjA5MzMwODk0MTM2MzUyNDg3MzE5MzExNwojIE1ENSBGaW5nZXJwcmludDogMWI6MzE6YjA6NzE6NDA6MzY6Y2M6MTQ6MzY6OTE6YWQ6YzQ6M2U6ZmQ6ZWM6MTgKIyBTSEExIEZpbmdlcnByaW50OiBhZjplNTpkMjo0NDphODpkMToxOTo0MjozMDpmZjo0Nzo5ZjplMjpmODo5NzpiYjpjZDo3YTo4YzpiNAojIFNIQTI1NiBGaW5nZXJwcmludDogNTI6ZjA6ZTE6YzQ6ZTU6OGU6YzY6Mjk6Mjk6MWI6NjA6MzE6N2Y6MDc6NDY6NzE6Yjg6NWQ6N2U6YTg6MGQ6NWI6MDc6Mjc6MzQ6NjM6NTM6NGI6MzI6YjQ6MDI6MzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYyRENDQThDZ0F3SUJBZ0lRVEtyNXl0dGpiK0FmOTA3WVd3T0duVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0IKaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0RwpBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WCkJBTVRJa05QVFU5RVR5QlNVMEVnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01URTUKTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVApFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SClEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDUgo2RlNTMGdwV3Nhd05KTjNGejBSbmRKa3JONk45STNBQWNieFQzOFQ2S2hLUFMzOFFWcjJmY0hLM1lYL0pTdzhYCnB6M2pzQVJoN3Y4Umw4ZjBoajRLK2o1YytaUG1OSHJaRkd2bm5MT0ZvSUo2ZHE5eGtOZnMvUTM2bkd6NjM3Q0MKOUJSKytiN0VwaTlQZjVsL3RmeG5RM0s5REFEV2lldHJMTlB0ajVnY0ZLdCs1ZU51L05pbzVKSWsya05yWXJoVgovZXJCdkd5MmkvTU9qWnJrbTJ4cG1maDRTREJGMWEzaERUeEZZUHd5bGxFbnZHZkR5aTYyYStwR3g4Y2dvTEVmClpkNUlDTHFrVHFueWcwWTNoT3ZveklGSVEyZE9jaXFiWEwxTUd5aUtYQ0o3dEt1WTJlN2dVWVBEQ1VaT2JUNloKK3BVWDJud3pWMEU4alZIdEM3WmNyeXhqR3Q5WHlEKzg2VjNFbTY5Rm1lS2pXaVMwdXFsV1BjOXZxdjlKV0w3dwpxUC8wdUszcE4vdTZ1UFFMT3Zub1EwSWVpZGlFeXhQeDJidmhpV0M0akNoV3JCUWRuQXJuY2V2UER0MDlxWmFoClNMMDg5NisxRFNKTXdCR0I3Rlk3OXRPaTRsdTNzZ1FpVXBXQWsybm9qa3hsOFpFRExYQjBBdXFMWnhVcGFWSUMKdTlmZlVHcFZScitnb3loaGYzRFF3NktxTENHcVI4NG9uQVpGZHIrQ0dDZTAxYTYweTFEbWEvUk1obkV3NmFiZgpGb2JnMlA5QTNmdlFRb2gvb3pNNkxsd2VRUkdCWTg0WWNXc3I3S2FLdHpGY09tcEg0TU41V2RZZ0dxL3lhcGlxCmNyeFhTdEpMbmJzUS9MQk1RZVh0SFQxZUtKMmN6TCt6VWRxblIrV0VVd0lEQVFBQm8wSXdRREFkQmdOVkhRNEUKRmdRVXU2OStBajM2cHZFOGhJNnQ3amlZN05reU10UXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQXJ4MVVhRXQ2NVJ1Mnl5VFVFVUFKTk1uTXZsCndGVFBvQ1dPQXZuOXNLSU45U0NZUEJNdHJGYWlzTlorRVpMcExycWVMcHB5c2IwWlJHeGhOYUthdEJZU2FWcU0KNGRjK3BCcm9Md1Awcm1FZEVCc3FwSXQ2eGY0RnB1SEExc2orbnE2UEs3bzltZmpZY3dsWVJtNm1uUFRYSjlPVgoyamVEY2h6VGMrQ2lSNWtET0YzVlNYa0FLUnpIN0pzZ0hBY2thVmQ0c2puOE9vU2d0Wng4amI4dWsySW50em5hCkZ4aXV2VHdKYVArRW16elYxZ3NENDFlZUZQZlI2MC9JdlljanQ3WkpRM21GWExycmtndWh4dWhvcUV3V3NScVoKQ3VoVExKSzdvUWtZZFF4bHFIdkxJN2Nhd2lpRnd4di8wQ3RpNzZSN0NaR1laNHdVQWMxb0JtcGpJWFVEZ0lpSwpib0hHaGZLcHBDM245S1VrRUVlRHlzMzBqWGxZc1FhYjV4b3EyWjBCMTVSOTdRTkt5dkRiNktrQlB2VldtY2tlCmprazl1K1VKdWVCUFNaSTlGb0pBek14Wnh1WTY3Ukl1YVR4c2xiSDlxaDE3ZjRhK0hnNHlSdnY3RTQ5MWYweUwKUzBaai9nQTBRSERCdzdtaDNhWnc0Z1N6UWJ6cGdKSHFaSng2NFNJRHFaeHVidzVsVDJ5SGgxN3picUQ1ZGFXYgpRT2hUc2llZFNybkFkeUdOLzRmeTNyeU03eGZmdDBrTDBmSnVNQXNhRGs1MjdSSDg5ZWxXc24yL3gyMEtrNHlsCjBNQzJIYjQ2VHBTaTEyNXNDOEtLZlBvZzg4VGs1YzBOcU11UmtyRjhoZXkxRkdsbURvTG56YzdJTGFaUmZ5SEIKTlZPRkJrcGRuNjI3RzE5MAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIFN1YmplY3Q6IENOPVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBMYWJlbDogIlVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAyNjQ1MDkzNzY0NzgxMDU4Nzg3NTkxODcxNjQ1NjY1Nzg4NzE3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjpmZTo2OTpkMTo5MTpiNzoxOTozMzphMzo3MjphODowZjplMTo1NTplNTpiNQojIFNIQTEgRmluZ2VycHJpbnQ6IDJiOjhmOjFiOjU3OjMzOjBkOmJiOmEyOmQwOjdhOjZjOjUxOmY3OjBlOmU5OjBkOmRhOmI5OmFkOjhlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlNzo5MzpjOTpiMDoyZjpkODphYToxMzplMjoxYzozMToyMjo4YTpjYzpiMDo4MToxOTo2NDozYjo3NDo5Yzo4OTo4OTo2NDpiMTo3NDo2ZDo0NjpjMzpkNDpjYjpkMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjNqQ0NBOGFnQXdJQkFnSVFBZjF0TVB5anlsR29HN3hrRGpVRExUQU5CZ2txaGtpRzl3MEJBUXdGQURDQgppREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsCmNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlYKQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBdwpNakF4TURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WCkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeQpkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUNBRW1VWE5nN0Qyd2l6MEt4WERYYnR6U2ZUVEsxUWcySGlxaUJOQ1Mxa0Nkek9pWi9NUGFuczlzL0IKM1BIVHNkWjdOeWdSSzBmYU9jYThPaG0wWDZhOWZaMmpZMEsyZHZLcE95dVIrT0p2ME93V0lKQUpQdUxvZE1rWQp0SkhVWW1UYmY2TUc4WWdZYXBBaVBMeitFL0NIRkh2MjVCK08xT1JSeGhGblJnaFJ5NFlVVkQrOE0vNStiSnovCkZwMFl2VkdPTmFhblpzaHlaOXNoWnJIVW0zZ0R3RkE2Nk16dzNMeWVUUDZ2QlpZMUgxZGF0Ly9PK1QyM0xMYjIKVk4zSTV4STZUYTVNaXJkY21yUzNJRDNLZnlJMHJuNDdhR1lCUk9jQlRrWlRtek5nOTVTK1V6ZVFjMFB6TXNOVAo3OXVxL25ST2FjZHJqR0NUM3NUSEROL2hNcTdNa3p0UmVKVm5pKzQ5VnY0TTBHa1BHdy96SlNack0yMzNia2Y2CmMwUGxmZzZsWnJFcGZES0VZMVdKeEEzQmsxUXdHUk9zMDMwM3ArdGRPbXcxWE50QjF4TGFxVWtMMzlpQWlnbVQKWW82MVpzOGxpTTJFdUxFL3BEa1AyUUtlNnhKTWxYenphd1dwWGhhRHpMaG40dWdUbmN4Ymd0Tk1zKzFiLzk3bApjNndqT3kwQXZ6VlZkQWxKMkVsWUduK1NOdVpSa2c3ekpuMGNUUmU4eWV4REp0Qy9RVjlBcVVSRTlKbm5WNGVlClVCOVhWS2crL1hSakw3RlFaUW5tV0VJdVF4cE10UEFsUjFuNkJCNlQxQ1pHU2xDQnN0NitlTGY4WnhYaHlWZUUKSGc5ajF1bGl1dFpmVlM3cVhNWW9DQVFsT2JnT0s2bnlUSmNjQno4TlV2WHQ3eStDRHdJREFRQUJvMEl3UURBZApCZ05WSFE0RUZnUVVVM20vV3FvclNzOVVnT0hZbThDZDhySURac3N3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUZ6VWZBM1A5d0Y5UVpsbERIUEYKVXAvTCtNK1pCbjhiMmtNVm41NENWVmVXRlBGU1BDZUhsQ2p0SHpvQk42SjIvRk5Rd0lTYnhtdE91b3doVDZLTwpWV0tSODJrVjJMeUk0OFNxQy8zdnFPbExWU29HSUcxVmVDa1o3bDh3WEVza0VWWC9KSnB1WGlvcjdndE5uMy8zCkFUaVVGSlZEQnduN1lLbnVIS3NTaktDYVhxZVlhbGx0aXo4SSs4alJSYThZRldTUUVnOXpLQzdGNGlSTy9GanMKOFBSRi9pS3o2eStPMHRsRllRWEJsMitvZG5LUGk0dzJyNzhOQmM1eGplYW1ieDlzcG5GaXhkalFnM0lNOFdjUgppUXljRTB4eU5OKzgxWEhmcW5IZDRibHNqRHdTWFdYYXZWY1N0a05yLytYZVRXWVJVYytacnV3WHR1aHhrWXplClNmN2ROWEdpRlNlVUhNOWg0eWE3YjZObkpTRmQ1dDBkQ3k1b0d6dUNyK3lEWjRYVW1GRjBzYm1aZ0luL2YzZ1oKWEhsS1lDNlNRSzVNTnlvc3ljZGl5QTVkOXpaYnl1QWxKUUcwM1JvSG5IY0FQOURjMWV3OTFQcTdQOHlGMW05LwpxUzNmdVFMMzlaZWF0VFhhdzJld2gwcXBLSjRqanY5Y0oydmhzRS96Qis0QUx0UlpoOHRTUVpYcTlFZlg3bVJCClZYeU5XUUtWM1dLZHdybnVXaWgwaEtXYnQ1REhEQWZmOVlrMmRETFdLTUd3c0F2Z25FekRITmI4NDJtMVIwYUIKTDZLQ3E5TmpSSERFamY4dE03cXRqM3UxY0lpdVBoblBRQ2pZL01pUXUxMlpJdlZTNWxqRkg0Z3hRKzZJSGRmRwpqanhEYWgybkdONTlQUmJ4WXZuS2tLajkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1VU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgTGFiZWw6ICJVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTIzMDEzODIzNzIwMTk5NDgxNDU2NTY5NzIwNDQzOTk3NTcyMTM0CiMgTUQ1IEZpbmdlcnByaW50OiBmYTo2ODpiYzpkOTpiNTo3ZjphZDpmZDpjOToxZDowNjo4MzoyODpjYzoyNDpjMQojIFNIQTEgRmluZ2VycHJpbnQ6IGQxOmNiOmNhOjVkOmIyOmQ1OjJhOjdmOjY5OjNiOjY3OjRkOmU1OmYwOjVhOjFkOjBjOjk1OjdkOmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0ZjpmNDo2MDpkNTo0Yjo5Yzo4NjpkYTpiZjpiYzpmYzo1NzoxMjplMDo0MDowZDoyYjplZDozZjpiYzo0ZDo0ZjpiZDphYTo4NjplMDo2YTpkYzpkMjphOTphZDo3YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2p6Q0NBaFdnQXdJQkFnSVFYSXVaeFZxVXhkSnhWdDdOaVlETUpqQUtCZ2dxaGtqT1BRUURBekNCaURFTApNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sCmVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVQKSlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TWpBeApNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUCkNrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWcKVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbQphV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRYXJGUmFxZmxvCkkrZDYxU1J2VThaYTJFdXJ4dFcyMGVaemNhN2RuTllNWWYzYm9Ja0R1QVVVN0ZmTzdsMC80aUd6enZmVWlubmcKbzROK0xaZlFZY1R4bWR3bGtXT3JmekNqdEhEaXg2RXpuUE8vTGx4VHNWK3pmVEovaWpUamVYbWpRakJBTUIwRwpBMVVkRGdRV0JCUTY0UW1HMU04WndwWjJkRWwyM09BMXhtTmptakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakEyWjZFV0NOemtsd0JCSFU2KzRXTUIKenp1cVFoRmtvSjJVT1FJUmVWeDdIZnBrdWU0V1FyTy9pc0lKeE96a3NVMENNUURwS21GSGpGSktTMDRZY1BiVwpSTlp1OVlPNmJWaTlKTmxXU09ydnhLSkdnWWhxT2tiUnFadE55V0hhMFYxWGFoZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAojIExhYmVsOiAiR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0IgojIFNlcmlhbDogMTQzNjcxNDgyOTQ5MjI5NjQ0ODA4NTkwMjIxMjU4MDA5Nzc4OTc0NzQKIyBNRDUgRmluZ2VycHJpbnQ6IDIwOmYwOjI3OjY4OmQxOjdlOmEwOjlkOjBlOmU2OjJhOmNhOmRmOjVjOjg5OjhlCiMgU0hBMSBGaW5nZXJwcmludDogNjk6Njk6NTY6MmU6NDA6ODA6ZjQ6MjQ6YTE6ZTc6MTk6OWY6MTQ6YmE6ZjM6ZWU6NTg6YWI6NmE6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJlOmM5OjQ5OjExOmMyOjk1OjU2Ojc2OmRiOjZjOjBhOjU1OjA5Ojg2OmQ3OjZlOjNiOmEwOjA1OjY2OjdjOjQ0OjJjOjk3OjYyOmI0OmZiOmI3OjczOmRlOjIyOjhjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCNFRDQ0FZZWdBd0lCQWdJUktqaWtISllLQk41Q3NpaWxDK2cwbUFJd0NnWUlLb1pJemowRUF3SXdVREVrCk1DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJME1STXdFUVlEVlFRS0V3cEgKYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdU1CNFhEVEV5TVRFeE16QXdNREF3TUZvWApEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEClFTQXRJRkkwTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHUKTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdU1aNTA0OXNKUTZmTGprWkhBT2tycHJsT1FjSgpGc3Bqc2JtRytJcFh3VmZPUXZwem9mZGxRdjhld1FDeWJuTU8vOGNoNVJpa3F0bHhQNmpVdWM2TUhhTkNNRUF3CkRnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkZTd2U2MUYKdU9KQWYvc0tidnUrTThrOG80VFZNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURja3FHZ0U2YlBBN0RteENHWAprUG9VVnkwRDdPNDgwMjdLcUd4MnZLTGV1d0lnSjZpRkp6V2JWc2FqOGtmU3QyNGJBZ0FYcW1lbUZaSGUrcFRzCmV3djRuNFE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUKIyBMYWJlbDogIkdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNSIKIyBTZXJpYWw6IDMyNzg1NzkyMDk5OTkwNTA3MjI2NjgwNjk4MDExNTYwOTQ3OTMxMjQ0CiMgTUQ1IEZpbmdlcnByaW50OiA5ZjphZDozYjoxYzowMjoxZTo4YTpiYToxNzo3NDozODo4MTowYzphMjpiYzowOAojIFNIQTEgRmluZ2VycHJpbnQ6IDFmOjI0OmM2OjMwOmNkOmE0OjE4OmVmOjIwOjY5OmZmOmFkOjRmOmRkOjVmOjQ2OjNhOjFiOjY5OmFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNzo5ZjpiYzoxNDo4YTozZDpkMDowZjpkMjo0ZTphMTozNDo1ODpjYzo0MzpiZjphNzpmNTo5Yzo4MTo4MjpkNzo4MzphNToxMzpmNjplYjplYzoxMDowYzo4OToyNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hqQ0NBYVNnQXdJQkFnSVJZRmxKNENZdXUxWDVDbmVLY2ZsSzJHd3dDZ1lJS29aSXpqMEVBd013VURFawpNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTFNUk13RVFZRFZRUUtFd3BICmJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1gKRFRNNE1ERXhPVEF6TVRRd04xb3dVREVrTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRApRU0F0SUZJMU1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1Ck1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFUjBVT2x2dDlYYi9wT2RFaCtKOEx0dFY3SHBJNlNGa2MKOEdJeExjQjZLUDRhcDF5enRzeVg1MFhVV1ByUmQyMURvc0NIWlRRS0gzcmQ2end6b2NXZFRhUnZRWlU0ZjhrZQpoT3ZSbmttU2g1U0hERHFGU21hZm5WbVRUWmRoQm9aS28wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUGVZcFNKdnFCOG9oUkVvbTNtN2Uwb1BRbjFrd0NnWUkKS29aSXpqMEVBd01EYUFBd1pRSXhBT1ZwRXNsdTI4WXh1Z2xCNFpmNCsvMmE0bjBTeWUxOFpOUExCU1dMVnRtZwo1MTVkVGd1RG5GdDJLYUFKSmlGcVlnSXdjZEsxajF6cU8rRjRDWVdvZFpJN3lGejlTTzhOZENLb0NPSnV4VW5PCnh3eThwMkZwOGZjNzRTckwrU3Z6WnBBMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMiCiMgU2VyaWFsOiAxMDAwMzAwMQojIE1ENSBGaW5nZXJwcmludDogMGI6NDY6Njc6MDc6ZGI6MTA6MmY6MTk6OGM6MzU6NTA6NjA6ZDE6MGI6ZjQ6MzcKIyBTSEExIEZpbmdlcnByaW50OiBkODplYjo2Yjo0MTo1MTo5Mjo1OTplMDpmMzplNzo4NTowMDpjMDozZDpiNjo4ODo5NzpjOTplZTpmYwojIFNIQTI1NiBGaW5nZXJwcmludDogM2M6NGY6YjA6Yjk6NWE6Yjg6YjM6MDA6MzI6ZjQ6MzI6Yjg6NmY6NTM6NWY6ZTE6NzI6YzE6ODU6ZDA6ZmQ6Mzk6ODY6NTg6Mzc6Y2Y6MzY6MTg6N2Y6YTY6ZjQ6MjgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZkRENDQTF5Z0F3SUJBZ0lFQUppaU9UQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU3N3S1FZRFZRUUREQ0pUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdVbTl2ZENCRFFTQXRJRWN6TUI0WERURXpNVEV4TkRFeE1qZzBNbG9YCkRUSTRNVEV4TXpJek1EQXdNRm93V2pFTE1Ba0dBMVVFQmhNQ1Rrd3hIakFjQmdOVkJBb01GVk4wWVdGMElHUmwKY2lCT1pXUmxjbXhoYm1SbGJqRXJNQ2tHQTFVRUF3d2lVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1SUZKdgpiM1FnUTBFZ0xTQkhNekNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMNHlvbFFQCmNQc3NYRm5yYk1Ta1VlaUZLclBNU2pUeXNGL3pEc2NjUFZNZWlBaG8yRzg5cmNLZXpJSm5CeWVIYUhFNm4zV1cKSWtZRnNPMnR4MXVlS3Q2Yy9EckdsYWYxRjJjWTV5OUpDQXhjeitiTU5PMTQrMUN4M0dzeThLTCt0anprN0ZxWAp4ejhlY0Fnd29OekZzMjF2MElKeUVhdlNnV2haZ2hlM2VKSmcrc3plUDRUcmpUZ3prQXB5SS9vMXpDWnhNZEZ5CktKTFpXeU50WnJWdEIwTHJwalBPa3R2QTlteGplTTNLVGoyMTVWS2I4YjQ3NWxSZ3NHWWVDYXNIL2xTSkVVTFIKOXlTNllIZ2FtUGZKRWYwV3dUVWFWSFh2UTlQbHJrN081M3ZEeGs1aFVVdXJta1ZMb1I5QnZVaFRGWEZrQzRhego1UzYrenFRYndTbUVvclhMQ0NOMlF5SWtIeGNFMUc2Y3h2eC9LMllhN0lybDFzOU45V01KdHhVNTFudXM2K044CjZVNzhkVUxJN1ZpVkRBWkNvcHozNUhDejMzSnZXamRBaWRpRnBOZnhDOTVER2RSS1dDeU1pam1ldjRTSDhSWTcKTmd6cDA3VEtiQmxCVWdtaEhiQnF2NEx2Y0ZFaE10d0Zkb3pMOTJUa0ExQ3ZqSkZucThYeTdsalkzcjczNXpIUApiTWs3Y2NIVmlMVmx2TURvRnhjSEVyVmMwcXNnazdUbWdvTndOc1hObzQydGkreWp3VU9INWtQaU5MNlZpelh0CkJ6bmFxQjE2bnphZUVyQU1aUktRRldEWkprQkU0MVpncFJEVWFqejlRZHdPV2tlMjc1ZGhkVS9aL3NleUhkVHQKWFVtenFXckxab1FUMVZ5ZzNOOXVkd2JSY1hYSVYyK3ZEM2RiQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSVXJmckhrbGV1eWpXY0xoTDc1THBkCklOeVVWekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBTUptZEJUTElYZzQ3bUFFNmlxVG5CL2Q2K09lYTMxQkQKVTVjcVBjbzhSNWd1NFJWNzhaTHpZZHFRSlJabHdKOVVYUTRETzF0M0FweUV0ZzJZWHpUZE8yUEN3eWlCd3B3cApMaW5peU1NQjhqUHFLcXJNQ1FqM1pXZkd6ZC9UdGl1bnZjelJEbkJmdUNQUnk1Rk9DdlRJZXVYWll6YkIxTi84CklwZjNZRjNxS1M5WXNyMVl2WTJXVHhCMXYwaDdQVkdIb1R4MElzTDhCMytBM01Tcy9tckJjREN3Nlk1cDRpeHAKZ1pRSnV0MytUY0NEakpSWXdFWWdyNXdmQXZnMVZVa3ZSdFRBOEtDV0FnOHp4WEh6bmlOOWxMZjlPdE1KZ3dZaAovV0E5cmpMQTB1Nk5wdkRudElKOENzeHd5WG1BK1A1TTl6V0VHWW94K3dyWjEzK2I4S0thYThNRlN1MUJZQlF3CjBhb1JRbTdUSXdJRUM4WmwzZDFTZDlxQmE3S28rZ0U0dVpicUtteG5sNG1VbnJ6aFZOWGthbmp2U3Iwcm1qMUEKZnNiQWRkSnUrMmd3N095TG5mbEpOWm9hTE5temxUblZIcEwzcHJsbEwrVTliVHBJVEFqYzVDZ1NLTDU5TlZ6cQo0QlorRXh0cTF6N1hudnd0ZGJMQkZOVWpBOXRiYndzK2VDOE4zak9ORnJkSTU0T2FnUTk3d1VOTlZRUVhPRXBSCjFWbWlpWFRUbjc0ZVM5ZkdiYmVJSkc5Z2thU0NoVnRXUWJ6UVJLdHFFNzdSTEZpM0VqTllzamRqM0JQMWxCMC8KUUZIMVQvVTY3Y2pGNjhJZUhSYVZlc2QrUW5HVGJrc1Z0ekRmcXUxWGhVaXNIV3JkT1duazRYbDR2czRGdjZFTQo5NEI3SVdjbk1Gaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIgojIFNlcmlhbDogMTAwMDAwMTMKIyBNRDUgRmluZ2VycHJpbnQ6IGZjOjA2OmFmOjdiOmU4OjFhOmYxOjlhOmI0OmU4OmQyOjcwOjFmOmMwOmY1OmJhCiMgU0hBMSBGaW5nZXJwcmludDogNzY6ZTI6N2U6YzE6NGY6ZGI6ODI6YzE6YzA6YTY6NzU6YjU6MDU6YmU6M2Q6Mjk6YjQ6ZWQ6ZGI6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRkOjI0OjkxOjQxOjRjOmZlOjk1OjY3OjQ2OmVjOjRjOmVmOmE2OmNmOjZmOjcyOmUyOjhhOjEzOjI5OjQzOjJmOjlkOjhhOjkwOjdhOmM0OmNiOjVkOmFkOmMxOjVhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY0RDQ0ExaWdBd0lCQWdJRUFKaVdqVEFOQmdrcWhraUc5dzBCQVFzRkFEQllNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNrd0p3WURWUVFERENCVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnUlZZZ1VtOXZkQ0JEUVRBZUZ3MHhNREV5TURneE1URTVNamxhRncweQpNakV5TURneE1URXdNamhhTUZneEN6QUpCZ05WQkFZVEFrNU1NUjR3SEFZRFZRUUtEQlZUZEdGaGRDQmtaWElnClRtVmtaWEpzWVc1a1pXNHhLVEFuQmdOVkJBTU1JRk4wWVdGMElHUmxjaUJPWldSbGNteGhibVJsYmlCRlZpQlMKYjI5MElFTkJNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTQ4ZCtpZmtrU3pyUwpNNE0xTEduczNBbWs0MUdvSlN0NXVBZzk0Skc2aElYR2hhVEs1c2t1VTZUSkpCNzlWV1p4WFN6RllHZ0V0OW5DClVpWTRpS1RXTzBDbXdzMC96WmlUczFRVVdKWlYxVkQraHEya1kzOWNoL2FPNWllU1p4ZVNBZ01zM05abWRPM2QKWi8vQllZMWpUdytiYlJjd0p1K3IwaDhRb1BuRmZ4WnBnUU5IN1I1b2pYS2hUYklteHJwc1gyM1dyOUd4RTQ2cApyZk5lYVhVbUdENUJLeUYvN290ZEJ3YWRROFFwQ2l2OEtqNkd5enlET3ZuSkRkckZtZUs4ZUVFemR1Ry9MMTNsCnBKaFFEQlhkNFBxY2Z6aG8wTEttZXFmUk1iMStpbGduUTdPNk01SFRwNWdWWEpybTB3OTEyZnhCbUpjK3FpWGIKajVJdXNIc01YL0ZqcVRmNW0zVnBUQ2dtSmRyVjhoSndSVlhqMzNOZU4vVWhiSkNPTlZySjB5UHIwOEMrZUt4QwpLRmhtcFVadGNBTFhFUGxMVlB4ZGhrcUh6My9LUmF3UldyVWdVWTB2aUVlWE9jRFB1c0JDQVVDWlNDRUxhNmZTCi9aYlYwYjVHblVuZ0M2YWdJazQ0ME1FOE1MeHdqeXgxek5ERmpGRTdQWlFJWkNaaGZibkRaWThVbkNIUXF2MFgKY2dPUHZadU01bDVUbnJtZDc0Szc0YnppY2tGYklaVFRSVGVVMGQ4Sk9WM25JNnFhSGNwdHFBcUdoWXFDdmtJSAoxdkk0Z25QYWgxdmxQTk9lUHFjN252UURzL254ZlJOMEF2KzdvZVg2QUhrY3BtWkJpRnhnVjZZdUNjUzYvWnJQCnB4OUF3N3ZNV2dwVlN6czRkbEc0WTR1RWxCYm1Wdk1DQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRlA2ckFKQ1luaVQ4cWN3YWl2c251TDh3YnFnNwpNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUURQZHl4dVZyNU9zN2FFQUpTclI4a04wbmJIaHA4ZEI5TzJ0THNJCmVLOXAwZ3RKM2pQRnJLM0NpQUo5QnJjMUFzRmd5Yi9FNkpUZTFOT3BFeVZhL202aXJuMEYzSDN6YlBCK3BvM3UKMmRmT1dCZm9xU211YzBpSDU1dktiaW1oWkY4WkUvZXVCaEQvVWNhYlRWVWxUNU9aRUFGVGRmRVR6c2VtUVVIUwp2NGlsZjBYOHJMaWx0VE1NZ3NUN0IvWnE1U1dFWHdiS3dZWTVFZHRZelhjN0xNSk1EMTZhNC9DclBtRWJVQ1RDCndQVHhHZkFSS2JhbEdBS2IxMk5NY0l4SG93TkRYTGxkUnFBTmIvOVpqcjdkbjNMRFd5dmZqRnZPNVF4R2JKS3kKQ3FOTVZFSVlGUklZdmRyOHVuUnUvOEcyb0dUWXFWOVZycDljYW5hVzJITm5oL3ROZjF6dWFjcHpFUHVLcWYyZQp2VFk0U1VtSDlBNFU4T21IdUQrblQzcGFqbm5VaytTN2FGS0VyR3pwODVod1ZYSXkrVFNySzBtMXpTQmk1RHA2CloyT3JsdHh0cnBmcy9KOTJWb2d1WnM5YnRzbWtzTmNGdXVFbkw1TzdKaXFpazdBYjg0NitIVUNqdVRhUFBvSWEKR2w2STZsRDRXZUtEUmlrTDQwUmM0WlcyYVpDYUZHK1hyb0hQYU8rWm1yNjE1K0YvK1BvVFJ4Wk16RzBJUU9lTAplRzlRZ2tSUVAyWUdpcXREaEZaS0R5QXRoZzcxMHR2U2VvcEx6YVhvVHZGZUppVUJXU09nZnRMMmZpRlgxeWU4CkZWZE1wRWJCNElNZURFeE5IMDhHR2VMNXFQUTZncUd5ZVVONTFxMXZlaWVRQTZUcUpJYy8yYjNaNmZKZlVFa2MKN3V6WExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIFN1YmplY3Q6IENOPUlkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIExhYmVsOiAiSWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIgojIFNlcmlhbDogMTMyOTg4MjEwMzQ5NDYzNDIzOTA1MjAwMDM4Nzc3OTY4Mzk0MjYKIyBNRDUgRmluZ2VycHJpbnQ6IGIzOjNlOjc3OjczOjc1OmVlOmEwOmQzOmUzOjdlOjQ5OjYzOjQ5OjU5OmJiOmM3CiMgU0hBMSBGaW5nZXJwcmludDogZGY6NzE6N2U6YWE6NGE6ZDk6NGU6Yzk6NTU6ODQ6OTk6NjA6MmQ6NDg6ZGU6NWY6YmM6ZjA6M2E6MjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVkOjU2OjQ5OjliOmU0OmQyOmUwOjhiOmNmOmNhOmQwOjhhOjNlOjM4OjcyOjNkOjUwOjUwOjNiOmRlOjcwOjY5OjQ4OmU0OjJmOjU1OjYwOjMwOjE5OmU1OjI4OmFlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJUUNnRkNnQUFBQVVVanlFUzFBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJLCk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjd0pRWURWUVFERXg1SlpHVnUKVkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRneE1qSXpXaGNOTXpRdwpNVEUyTVRneE1qSXpXakJLTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3CkpRWURWUVFERXg1SlpHVnVWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlNiMjkwSUVOQklERXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ25VQm5lUDVrOTFETkc4VzlSWVlLeXFVK1BaNGxkaE5sVAozUXdvMmRmdy82NlZRM0taK2JWZGZJckJRdUV4VUhUUmdRMTh6WnNocTBQaXJLMWVobTd6Q1lvZldqSzlvdXVVCitlaGNDdXovbU5LdmNiTzBVNTlPaCsrU3ZMM3NUekl3aUVzWFhsZkVVOEwyQXBlTjJXSXJ2eVFmWW8zZnc3Z3AKUzBsNFBKTmdpQ0w4bWRvMnlNS2kxQ3hVQUdjMWJuTy9BbGp3cE4zbHNLSW1lc3JnTnFVWkZ2WDl0Kyt1UDBEMQpiVm9FL2M0MHlpVGNkQ01iWFRNVEVsM0VBU1gyTU4wQ1haL2cxVWU5dE9zYm9idEpTZGlmV3dMeml1UWtrT1JpClQwL0JyNHNPZEJlbzBYS0lhbm9CU2N5MFJubkdGN0hhbUI0SFdmcDFJWVZsM1pCV3p2dXJwV0NkeEozNVVyQ0wKdllmNWp5c2pDaU4yTy9jejRja0E4Mm41UzZMZ1RyeCtrem1FQi9kRWNINytCMXJsc2F6UkdNenlOZVZKU1FqSwpWc2s5K3c4WWZZczd3UlBDVFkvSlR3NDM2UitoRG1yZllpN0xOUVpSZVN6SUpUajAra3VuaVZ5YzB1TU5PWVpLCmRIelZXWWZDUDA0TVhGTDBQZmRTZ3ZIcW82ejlTVFFhS1BOQmlEb1Q3dWplLzVrZFg3ckw2Qjd5dVZCZ3dESFQKYytYdnZxRHRNd3QwdmlBZ3hHZHM4QWdEZWxXQWYwWk9scWYwSGo3aDl0Z0o0VE5rSzJQWE1sNmYrY0I3RDNodgpsN3lUbXZtY0VwQjRlb0NIRmRkeWRKeFZkSGl4dXVGdWNBUzZUNkM2YU1ONy96SHdjejA5bENxeEMwRU9vUDVOCmlHVnJlVE8wMXdJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVTdVUVp3TlB3Qm92dXBIdStRdWNtVk1pT05uWXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUEydWtETDJwa3Q4UkhZWllSNG5LTTFlVk84bHZPTUlrUGtwMTY1b0NPR1VBRmp2TGk1K1UxS010bHdICjZvaTZtWXRRbE5lQ2dOOWhDUUNUclEwVTVzN0I4amVVZUxCZm5MT2ljN2lQQlpNNHpZMCtzTGo3d00reDh1d3QKTFJ2TTdLcWFzNnBnZ2hzdE84T0VQVmVLbGg2Y2RialRNTTFnQ0lPUTA0NVU4VTFtd0YxMEEwQ2o3b1Yrd2g5MwpuQWJvd2FjWVhWS1Y3Y25kSlo1dCtxbnRvem8wMEZsNzJ1MVE4elcvN2VzVVRUSEhZUFRhOFllYzRraml4c1UzCit3WVErblZaWmpGSEtkcDJtaHpwZ3E3dm1ybFI5NGdqbW1tVllqemxWWUEyMTFRQy8vRzVYYzdVSTIvWVJZUksKVzJYdmlRemRGS2NneXhpbEpiUU4rUUh3b3RMMEFNaDBqcUVxU0k1bDJ4UEU0aVVYZmV1K2gxc1hJRlJSazBwVApBd3ZzWGNvejdXTDlSY2N2Vzl4WW9JQTU1dnJYL2hNVXB1MDlsRXBDZE5URGQxbHp6WTlHdmxVNDcvcm9rVExxCmwxZ0VJdDQ0dzh5OGJja3pPbW9LYVQrZ3lPcHlqNHhqaGlPOWJUeVducFhnU1V5cW9ya3FHNXcyZ1hqdHcraEcKNGlaWlJIVWUyWFdKVWMwUWhKMWhZTXRkK1pjaVRZNlk1dU4vOWx1N3JzM0tTb0ZyWGd2elVlRjBLK2wrSjZmWgptVWxPK0tXQTJ5VVBIR05paXNreloyczhFSVBHcmQ2b3pSYU9qZkFITjNHZjhxdjhRZlhCaSt3QU4xMEo1VTZBCjcvcXhYRGdHcFJ0SzRkdzRMVHpjcXgrUUd0VktuTzdSY0d6TTd2UlgrQmk2aEc2SAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgU3ViamVjdDogQ049SWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgTGFiZWw6ICJJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEiCiMgU2VyaWFsOiAxMzI5ODgyMTAzNDk0NjM0MjM5MDUyMTk3NjE1Njg0MzkzMzY5OAojIE1ENSBGaW5nZXJwcmludDogMzc6MDY6YTU6YjA6ZmM6ODk6OWQ6YmE6ZjQ6NmI6OGM6MWE6NjQ6Y2Q6ZDU6YmEKIyBTSEExIEZpbmdlcnByaW50OiBiYToyOTo0MTo2MDo3Nzo5ODozZjpmNDpmMzplZjpmMjozMTowNTozYjoyZTplYTo2ZDo0ZDo0NTpmZAojIFNIQTI1NiBGaW5nZXJwcmludDogMzA6ZDA6ODk6NWE6OWE6NDQ6OGE6MjY6MjA6OTE6NjM6NTU6MjI6ZDE6ZjU6MjA6MTA6YjU6ODY6N2E6Y2E6ZTE6MmM6Nzg6ZWY6OTU6OGY6ZDQ6ZjQ6Mzg6OWY6MmYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZaakNDQTA2Z0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqejBaOEFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQk4KTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU293S0FZRFZRUURFeUZKWkdWdQpWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRjMU16TXlXaGNOCk16UXdNVEUyTVRjMU16TXlXakJOTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjAKTVNvd0tBWURWUVFERXlGSlpHVnVWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTYjI5MElFTkJJREV3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMySXBUOHBFaXY2RWRyQ3ZzbmR1VHlQNG83CmVrb3NNU3FNamJDcHd6RnJxSGQyaENhMnJJRkNEUWpyVlZpN2V2aThaWDN5b0cyTHFFZnBZblllRWU0SUZOR3kKUkJiMDZ0RDZIaTllMjh0elFhNjhBTEJLSzBDeXJPRTdTOEl0bmVTaG0rd2FPaDd3Q0xQUTVDUTFCNStjdE1sUwpiZHNIeW8rMVcvQ0Q4MC9ITGFYSXJjdVZJS1F4S0ZkWVd1U05HNXFybmcwTThnb3pPU0k1Q3BjdTgxTjN1VVJGCi9ZVExOaUNCV1MyYWIyMUlTR0hLVE45VDBhOVN2RVNmcXk5cmczTHZkWURhQmpNYlhjamFZOFpOemF4bU1jM1IKM2o2SEVEYmh1YVI2NzJCUXNzdktwbGJnTjYrck5CTTVKZWc1WnVTWWVxb1NtSnhaWm9ZK3JmR3d5ajRHRDN2dwpFVXMzb0VSdGU4dW9qSEgwMWJXUk5zendGY1lyM2xFWHNaZE1VRDJ4bFZsOEJYMHRJZFVBdndGbm9sNTdwbHp5Cjl5THhrQTJUMjZwRVVXYk1mWFlENjJxb0tqZ1psM1lOYTRwaCtiejI3bmI5Y0N2ZEtUejRDaDViUWh5TFZpOVYKR3h5aExyWEhGdWI0cWp5U2ptbTJBY0cxaHAySkR3czRsRlRvNnR5ZVBTVzhVeWJ0MWFzNXFzVkFURlNyc3JUWgoyZmpYY3RzY3ZHMjlaVi92aURVcVppL3U5ck5sOERPTmZKaEJhVVlQUXh4cCtwdTEwR0ZxemNwTDJVeVFScXNWCldhRkhWQ2t1Z3loZkhNS2lxM0lYQUFhT1JleUw0ak05ZjlvWlJPUmljc1BmSXNieVZ0VGRYNVZ5N1cxZjkwZ0QKVy8zRktxRDJjeU9FRUJzQjV3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU0M0hnbnRpblF0bmJjWkZybEpQcnc2UFJGS013RFFZSktvWklodmNOCkFRRUxCUUFEZ2dJQkFFZjYzUXF3RVpFNHJVMWQ5K1VPbDFRWmdraUhWSXlxWkpuWVd2NklBY1ZZcFpteEkxUWoKdDJvZElGZmxBV0pCRjlNSjIzWExibFNRZGY0YW40RUt3dDNYOXduUVczSVY1QjRKYWowejh5R2E1aFYrclZIVgpEUkR0ZlVMQWorN0FtZ2pWUWRaY0RpRnBib0JoRGhYQXVNL0ZTUkpTekw0NnpOUXVPQVhlTmYwZmI3aUFhSmc5ClRhREtRR1hTYzN6MWk5a0tsVC9ZUHlOdEd0RXFKQm5aaGJNWDczaHVxVmpSSTlQSEUrMXlKWDlkc1hOdzBIOEcKbHdtRUtZQmhIZnBlLzNPc29PT0p1Qnh4RmNiZU1YOFMzT0Z0bTYvbjZKOTFlRXlyUmp1YXpyOEZHRjFORlR3VwptaGxRQkpxeW1tOWxpMUpmUEZnRUtDWEFabUV4ZnJuZ2Ria2FxSUhXY2hlenhRTXhOUkY0ZUtMZzZUQ01mNERmCldOODh1aWVXNG9BMGJlT1kwMlFuckVoK0tIZGN4aVZoSmZpRkRHWDZ4REl2cFpnRjVQZ0xaeFlXeG9LNE1objUKK2JsNTNCL042NityRHQwYjIwWGtldWNDNHBWZC9HbndVMmxobFhWNUMxNVY1amdjbEtsWk01N0ljWFI1ZjFHSgp0c2hxdURESWFqakRicDdoTnhicUJXSk1XeEpIN2FlMHMxaFd4MG56ZnhKb0NURng4RzM0VGtmNzFvWHV4VmhBCkdhUWRwL2xMUXpmY2FGcFB6K3ZDWkhUZXRCWFo5RlJVR2k4YzE1ZHhWSkNPMlNDZFV5dC9xNC9pNmpDOFVEZnYKOFVlMWZYd3NCT3hvbmJSSlJCRDBja3NjWk9mODVtdVEzV2w5YWYwQVZxVzNyTGF0dDhvK0FlK2MKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAxMjQ2OTg5MzUyCiMgTUQ1IEZpbmdlcnByaW50OiA0YjplMjpjOTo5MTo5Njo2NTowYzpmNDowZTo1YTo5Mzo5MjphMDowYTpmZTpiMgojIFNIQTEgRmluZ2VycHJpbnQ6IDhjOmY0OjI3OmZkOjc5OjBjOjNhOmQxOjY2OjA2OjhkOmU4OjFlOjU3OmVmOmJiOjkzOjIyOjcyOmQ0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MzpkZjo1Nzo3NDpiMDozZTo3ZjplZjo1ZjplNDowZDo5MzoxYTo3YjplZDpmMTpiYjoyZTo2Yjo0Mjo3Mzo4Yzo0ZTo2ZDozODo0MToxMDozZDozYTphNzpmMzozOQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVBqQ0NBeWFnQXdJQkFnSUVTbE9NS0RBTkJna3Foa2lHOXcwQkFRc0ZBRENCdmpFTE1Ba0dBMVVFQmhNQwpWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwCmNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1EQTVJRVZ1ZEhKMWMzUXMKSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURXlNREFHQTFVRUF4TXBSVzUwY25WegpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXdIaGNOTURrd056QTNNVGN5Ck5UVTBXaGNOTXpBeE1qQTNNVGMxTlRVMFdqQ0J2akVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVVnUKZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dApkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwCmFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFSwpBb0lCQVFDNmhMWnkyNTRNYStLWjZUQUJwM2JxTXJpVlFSckoybUZPV0hMUC92YUNlYjl6WVFZS3BTZllzMS9UClJVNGNjdFpPTXZKeWlnLzNneG5RYW9DQUFFVWVzTWZubXI4U1Z5Y2NvMmd2Q29lOWFtc09YbVh6SEhmVjFJV04KY0NHMHN6TG5pNkxWaGprQ3NialNSODdreVVuRU82ZmUrMVI5Vjc3dzZHN0NlYkk2QzFYaVVKZ1dNaE5jTDNoVwp3Y0tVcy9KYTVDZWFueVRYeHV6UW15V0M0OHpDeEVYRmpKZDZCbXNxRVorcENtNUlPMi9iMUJFWlF2ZVBCNy8xClUxK2NQdlFYTE9acHJFNHlUR0ozNnJmbzViczB2Qm1McnB4UjU3ZCt0Vk94TXlMbGJjOXdQQnI2NHB0bnRvUDAKamFXdllreE40RmlzWkRRU0EvaTJqWlJqSktSeEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFjaVo2MEI3dmZlYzdhVkhVYkkyZmtCSm1xekFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWVaOGRsc2EyZVQ4aWpZZlRod01FWUdwcm1pNVppWE1SckVQUjlSUC8KalRrcndQSzlUM0NNcVMvcUY4UUxWSjdVRzVhWU16eW9yV0tpQUhhcldXbHVCaDEreExsRWpaaXZFdFJoMndvWgpSa2Z6Ni9kandVQUZRS1hTdC9TMW1qYS9xWWgyaUFSVkJDdWNoMzhhTnp4K0xhVWEyTlNKWHNxOXJEMXMyRzJ2CjFmTjJEODA3aURnaW5XeVRtc1E5djRJYlpUK21EMTJxL09XeUZjcTFyY2E4UGRDRTZPb0djckJOT1RKNHZ6NFIKbkF1a25ab2g4L0NiQ3pCNDI4SGNoMFArdkdPYXlzWENITW5IamY4N0VsZ0k1clk5N0hvc1R2dURsczRNUEdtSApWSE9rYzhLVC8xRVFyQlZVQWRqOEJiR0pvWDkwZzVwSjE5eE9lNHBJYjR0RjlnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMTIgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEiCiMgU2VyaWFsOiA1MTU0MzEyNDQ4MTkzMDY0OTExNDExNjEzMzM2OQojIE1ENSBGaW5nZXJwcmludDogYjY6N2U6MWQ6ZjA6NTg6YzU6NDk6NmM6MjQ6M2I6M2Q6ZWQ6OTg6MTg6ZWQ6YmMKIyBTSEExIEZpbmdlcnByaW50OiAyMDpkODowNjo0MDpkZjo5YjoyNTpmNToxMjoyNTozYToxMTplYTpmNzo1OTo4YTplYjoxNDpiNTo0NwojIFNIQTI1NiBGaW5nZXJwcmludDogMDI6ZWQ6MGU6YjI6OGM6MTQ6ZGE6NDU6MTY6NWM6NTY6Njc6OTE6NzA6MGQ6NjQ6NTE6ZDc6ZmI6NTY6ZjA6YjI6YWI6MWQ6M2I6OGU6YjA6NzA6ZTU6NmU6ZGY6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrVENDQW9DZ0F3SUJBZ0lOQUthTGVTa0FBQUFBVU5DUitUQUtCZ2dxaGtqT1BRUURBekNCdnpFTE1Ba0cKQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCMwpkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1ERXlJRVZ1CmRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURXpNREVHQTFVRUF4TXEKUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1JVTXhNQjRYRFRFeQpNVEl4T0RFMU1qVXpObG9YRFRNM01USXhPREUxTlRVek5sb3dnYjh4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEClZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OVRaV1VnZDNkM0xtVnVkSEoxYzNRdWJtVjAKTDJ4bFoyRnNMWFJsY20xek1Ua3dOd1lEVlFRTEV6QW9ZeWtnTWpBeE1pQkZiblJ5ZFhOMExDQkpibU11SUMwZwpabTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE16QXhCZ05WQkFNVEtrVnVkSEoxYzNRZ1VtOXZkQ0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVWRE1UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWkKQTJJQUJJUVR5ZEM2YlVGNzRtelE2MVZmWmdJYUpQUmJpV2xINDdqQ2ZmSHlBc1dmb1BaYjFZc0dHWVpQVXhCdApCeVFub2FENDFVY1pZVXg5eXBNbjZuUU03MitXQ2Y1ajdIQmROcTFuZDY3Sm5YeFZSRHFpWTFFZjllTmkxS2xICkJ6N01JS05DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME8KQkJZRUZMZGo1eHJkamVrSXBsV0RwT0JxVUVGbEVVSkpNQW9HQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR0Y1Mk9WQwpSOThjcmxPWkY3WnZISDNodnhHVTBRT0lkZVNOaWFTS2QwYmViV0h2QXZYN3RkL00vazcvL3FubXB3SXdXNW5YCmhUY0d0WHNJL2VzbmkwcVUrZUg2cDQ0bUNPaDhrbWh0Yzlodkpxd2hBcmladHlaQld5VmdydEJJR3U0RwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q0ZDQSBFViBST09UIE89Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q0ZDQSBFViBST09UIE89Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDRkNBIEVWIFJPT1QiCiMgU2VyaWFsOiA0MDc1NTUyODYKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OmUxOmI2OmVkOjI2OjdhOjdhOjQ0OjMwOjMzOjk0OmFiOjdiOjI3OjgxOjMwCiMgU0hBMSBGaW5nZXJwcmludDogZTI6Yjg6Mjk6NGI6NTU6ODQ6YWI6NmI6NTg6YzI6OTA6NDY6NmM6YWM6M2Y6Yjg6Mzk6OGY6ODQ6ODMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVjOmMzOmQ3OjhlOjRlOjFkOjVlOjQ1OjU0OjdhOjA0OmU2Ojg3OjNlOjY0OmY5OjBjOmY5OjUzOjZkOjFjOmNjOjJlOmY4OjAwOmYzOjU1OmM0OmM1OmZkOjcwOmZkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGalRDQ0EzV2dBd0lCQWdJRUdFck0xakFOQmdrcWhraUc5dzBCQVFzRkFEQldNUXN3Q1FZRFZRUUdFd0pEClRqRXdNQzRHQTFVRUNnd25RMmhwYm1FZ1JtbHVZVzVqYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNU1SVXdFd1lEVlFRRERBeERSa05CSUVWV0lGSlBUMVF3SGhjTk1USXdPREE0TURNd056QXhXaGNOTWpreApNak14TURNd056QXhXakJXTVFzd0NRWURWUVFHRXdKRFRqRXdNQzRHQTFVRUNnd25RMmhwYm1FZ1JtbHVZVzVqCmFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1SVXdFd1lEVlFRRERBeERSa05CSUVWV0lGSlAKVDFRd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURYWFd2TkVEOGZCVm5WQlUwMwpzUTdzbUN1T0ZSMzZrMHNYZ2lGeEVGTFhVV1J3RnNKVmFVMk9GVzJmdnd3Ynd1Q2paOVlNck04aXJxOTNWQ3BMClRJcFRVbnJEN2k3ZXMzRWx3ZWxkUGU2aEw2UDNLanpKSXgxcXF4MmhwL0h6N0tEVlJNOFZ6M0l2SFdPWDZKbjUKL1pPa1ZJQk1VdFJTcXk1SjM1RE51RisrUDk2aHlrMGcxQ1hvaENsVHQ3R0lILy82MnBDZkNxa3RRVCt4OFJncAo3aFpaTERSSkdxZ0cxNmlJMGdOeWVqTGk2bWhOYml5V1pYdktXZnJ5NHQzdU1Dejd6RWFzeEdQcmIzODJLelJ6CkVwUi8zOHdtbnZGeVhWQmxXWTlwczRkZU1tL0RHSXExbFkrd2VqZmVXa1U3eHpiaDcyZlJPZE9YVzNOaUdVZ3QKaHh3RyszU1lJRWx6OEFYU0c3R2dvN2NiY05PSWFibGExamowWXR3bGkzaS8rT2grdUZ6SmxVOWZweTI1SUd2UAphOTMxRGZTQ3QvU3laaTRRS1BhWFdudVdGbzhCR1Mxc2JuODVXQVprZ3dHRGc4Tk5rdDB5eG9la04ra1d6cW90CmFLOEtnV1U2Y01HYnJVMXRWTW9xTFV1Rkc3T0E1bkJGRFd0ZU5mQi9PN2ljNUFSd2lSSWxrOW9LbVNKZ2FtTmcKVG5ZR21FNjlnNjBkV0lvbGhkTEhaUjR0anNiZnRzYmhmNG9FSVJVcGRQQStuSkNkREM3eGlqNWFxZ3dKSHNmVgpQS1B0bDhNZU5QbzQrUWdPNDhCZEs0UFJWbXJKdHFoVVV5NTRNbWM5Z245MDBQdmh0Z1ZndVhEYmpndjVFMWh2CmNXQVFVaEM1d1VFSjczSWZaekY0LzVZRmpRSURBUUFCbzJNd1lUQWZCZ05WSFNNRUdEQVdnQlRqL2kzOUtOQUwKdGJxMm9zUy9CcW9GakpQN0x6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZApCZ05WSFE0RUZnUVU0LzR0L1NqUUM3VzZ0cUxFdndhcUJZeVQreTh3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCCkFDWEd1bXZyaDh2ZWdqbVdQZkJFcDJ1RWN3UGVuU3RQdWlCL3ZIaXl6NWV3RzV6ejEza3U5VWkyMHZzWGlPYlQKZWovdFV4UFE0aTlxZWNzQUl5am1IamRYTlltRXduWlBORGF0WjhQT1FRYUl4ZmZ1MkJxNDFndC9VUCtUcWhkTApqT3p0VW1DeXBBYnFUdXYwYXhuOTYvVWE0Q1VxbXR6SFFUYjN5SFFGaERtVk9kWUxPNlFuK2dqWVhCNzRCR0JTCkVTZ29BLy92VTJZQXBVbzBGbVo4L1Fta3JwNW5HbTlCQzJzR0U1dVBobkVGdEMrTmlXWXpLWFpVbWhINEovcXkKUDVIZ3pnMGI4ekFhcmI4aVhSdlR2eVVGVGVHU0duK1puenhFazhyVVFFbHNnSWZYQkRyRE1sSTFEbGI0cGQxOQp4SXNORVI5VHl4NnlGN1pvZDFyZzFNdklCNjcxT2k2T043ZlFBVXRES1hlTU9aZVBnbHI0VWVXSm9Cam5hSDlkCkNpNzdvMGNPUGFZamVzWUJ4NC9JWHI5dGdGYStpaVM2TStxZjRUSVJudkhTVDREMkcwQ3ZPSjRSVUhsekVoTE4KNW15ZExJaHlQRENCQnBFaTZsbXQyaGt1SXNLTnVZeUg0R2E4Y3lOZklXUmpnRWoxb0R3WVBaVElTRUVkUUxwZQovdjVXT2FISXoxNmVHV1JHRU5vWGtiY0ZnS3lMbVpKOTU2TFlCd3MySitkSWVXQ0t3OWNUWFBoeVFOOUt5OCtaCkFBb0FDeEdWMmxaRkE0Z0tuMmZRMVhteHFJMUFiUTNDZWtENjgxOWtSNUxMVTdtN1djNVAvZEFWVXdIWTMrdloKNW5idjBDTzdPNmw1czlVQ0tjMkpvNVlQU2pYblRrTEFkYzBIeitZczYzc3UKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSBPPVRceGRjUktUUlVTVCBCaWxnaSBcdTAxMzBsZXRpXHUwMTVmaW0gdmUgQmlsaVx1MDE1ZmltIEdceGZjdmVubGlcdTAxMWZpIEhpem1ldGxlcmkgQS5cdTAxNWUuCiMgU3ViamVjdDogQ049VFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IE89VFx4ZGNSS1RSVVNUIEJpbGdpIFx1MDEzMGxldGlcdTAxNWZpbSB2ZSBCaWxpXHUwMTVmaW0gR1x4ZmN2ZW5saVx1MDExZmkgSGl6bWV0bGVyaSBBLlx1MDE1ZS4KIyBMYWJlbDogIlRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSIKIyBTZXJpYWw6IDE1NjIzMzY5OTE3MjQ4MQojIE1ENSBGaW5nZXJwcmludDogZGE6NzA6OGU6ZjA6MjI6ZGY6OTM6MjY6ZjY6NWY6OWY6ZDM6MTU6MDY6NTI6NGUKIyBTSEExIEZpbmdlcnByaW50OiBjNDoxODpmNjo0ZDo0NjpkMTpkZjowMDozZDoyNzozMDoxMzo3Mjo0MzphOToxMjoxMTpjNjo3NTpmYgojIFNIQTI1NiBGaW5nZXJwcmludDogNDk6MzU6MWI6OTA6MzQ6NDQ6YzE6ODU6Y2M6ZGM6NWM6Njk6M2Q6MjQ6ZDg6NTU6NWM6YjI6MDg6ZDY6YTg6MTQ6MTM6MDc6Njk6OWY6NGE6ZjA6NjM6MTk6OWQ6NzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVKekNDQXcrZ0F3SUJBZ0lIQUk0WC9pUWdnVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JzVEVMTUFrR0ExVUUKQmhNQ1ZGSXhEekFOQmdOVkJBY01Ca0Z1YTJGeVlURk5NRXNHQTFVRUNneEVWTU9jVWt0VVVsVlRWQ0JDYVd4bgphU0RFc0d4bGRHbkZuMmx0SUhabElFSnBiR25GbjJsdElFZkR2SFpsYm14cHhKOXBJRWhwZW0xbGRHeGxjbWtnClFTN0ZuaTR4UWpCQUJnTlZCQU1NT1ZURG5GSkxWRkpWVTFRZ1JXeGxhM1J5YjI1cGF5QlRaWEowYVdacGEyRWcKU0dsNmJXVjBJRk5oeEo5c1lYbkVzV1BFc1hQRXNTQklOVEFlRncweE16QTBNekF3T0RBM01ERmFGdzB5TXpBMApNamd3T0RBM01ERmFNSUd4TVFzd0NRWURWUVFHRXdKVVVqRVBNQTBHQTFVRUJ3d0dRVzVyWVhKaE1VMHdTd1lEClZRUUtERVJVdzV4U1MxUlNWVk5VSUVKcGJHZHBJTVN3YkdWMGFjV2ZhVzBnZG1VZ1FtbHNhY1dmYVcwZ1I4TzgKZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMakZDTUVBR0ExVUVBd3c1Vk1PY1VrdFVVbFZUVkNCRgpiR1ZyZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeElFZzFNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFwQ1VaNFdXZTYwZ2hVRW9JNVJId1dyb20KLzROWnprUXFMLzdoem1BRC9JMERwZTMvYTZpNnpEUUduMWsxOXV3c3U1MzdqVkpwNDV3bkVGUHpwQUxGcC9rUgpHbWwxYnNNZGk5R1lqWk9IcDNHWERTSEhtZmxTMHl4alhWVzg2QjhCU0xsZy9rSks5c2lBcnMxbWVwNUZpbWgzCjRraG9uNkxhOGVIQkVKL3JQQ21CcCtFeUNOU2dCYkdNKzQyV0FBNCtKZDlUaGlJNy9QUzk4d2wrZCt5RzZ3OHoKNVVOUDlGUjFiU21aTG1aYVE5L0xYTXJJNVRqeGZqczFuUS8weFZxaHpQTWdnQ1RUVit3VnVuVWxtK2hrUzdNMApoTzhFdVBiSmJLb0NQclpWNGpJM1gveG1sMS9OMXA3SElMOU54cXcvZFY4YzdUS2NmR2tBYVpIakl4aFQ2UUlECkFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVZwa0hIdE9zREdsa3RBeFFSOTVETEw0Z3dQc3dEZ1lEVlIwUEFRSC8KQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSjVGZG5zWApTREx5T0lzcHZlNldTazZCR0xGUlJ5RE4wR1N4RHNuWkFka0p6c2laM0dnbEU5UmM4cVBvQlA1eUNjY0xxaDBsClZYNldtbGUzdXNVUmVobm1wMzQ5aFE3MStTNHBMK2Y1YkZnV1YxQWw5ajR1UHFydGQzR3FxcG1XUmdxdWp1d3EKVVJhd1hzM3Fad1FjV0REMVlJcTlwcjFONVphMC9FS0pBV3YyY01oUU9Rd3QxV2JaeU5Lek1yY2JHVzNMTS9uZgpwZVlWaERmd3d2SmxscEtRZC9DdDlKRHBFWGpYazRuQVBRdTZLZlRvbVoxeWp1MmRMKzZTZmFIeC8xMjZNMkNGCll2NEhBcUdFVmthK2xncWFFOWNoVExkOEI1OU9UaitSZFBzbm5SSE0zZWF4eW5GTkV4YzVKc1VwSVN1VEtXcVcKK3F0QjRVdTJOUXZBbXhVPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydGlub21pcyAtIFJvb3QgQ0EgTz1DZXJ0aW5vbWlzIE9VPTAwMDIgNDMzOTk4OTAzCiMgU3ViamVjdDogQ049Q2VydGlub21pcyAtIFJvb3QgQ0EgTz1DZXJ0aW5vbWlzIE9VPTAwMDIgNDMzOTk4OTAzCiMgTGFiZWw6ICJDZXJ0aW5vbWlzIC0gUm9vdCBDQSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDE0OjBhOmZkOjhkOmE4OjI4OmI1OjM4OjY5OmRiOjU2OjdlOjYxOjIyOjAzOjNmCiMgU0hBMSBGaW5nZXJwcmludDogOWQ6NzA6YmI6MDE6YTU6YTQ6YTA6MTg6MTE6MmU6Zjc6MWM6MDE6Yjk6MzI6YzU6MzQ6ZTc6ODg6YTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJhOjk5OmY1OmJjOjExOjc0OmI3OjNjOmJiOjFkOjYyOjA4Ojg0OmUwOjFjOjM0OmU1OjFjOmNiOjM5Ojc4OmRhOjEyOjVmOjBlOjMzOjI2Ojg4OjgzOmJmOjQxOjU4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGa2pDQ0EzcWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3SkdVakVUCk1CRUdBMVVFQ2hNS1EyVnlkR2x1YjIxcGN6RVhNQlVHQTFVRUN4TU9NREF3TWlBME16TTVPVGc1TURNeEhUQWIKQmdOVkJBTVRGRU5sY25ScGJtOXRhWE1nTFNCU2IyOTBJRU5CTUI0WERURXpNVEF5TVRBNU1UY3hPRm9YRFRNegpNVEF5TVRBNU1UY3hPRm93V2pFTE1Ba0dBMVVFQmhNQ1JsSXhFekFSQmdOVkJBb1RDa05sY25ScGJtOXRhWE14CkZ6QVZCZ05WQkFzVERqQXdNRElnTkRNek9UazRPVEF6TVIwd0d3WURWUVFERXhSRFpYSjBhVzV2YldseklDMGcKVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOVE1DUW9zUDVMMgpmeFNlQzV5YWFoMUFNR1Q5cXQ4T0hnWmJuMUNGNnMyTnEwTm4zckQ2Zm9DV25vUjRra2pXNHpudXp1UlpXSmZsCkxpZVk2cE9vZDV0SzhPOTBnQzNyTUIrMTJjZUFuR0lua1lqd1NvbmQzSWptRlBuVkF5Ly9sZHU5bit3cytoUVYKV1pVS3hrZDhhUmk1cHdQNXluYXB6OGR2dEY0Ri91N0JVckoxTW9mczdTbG1PL05LRm9MMjFwcmJjcGpwM3ZERgpUS1dydGVvQjRvd3VaSDlrYi8yakpaT0x5S0lPU1kwMDhCL3NXRVV1TktxRVVMM25za29UdUxBUHJqaGRzS2tiCjVuUEpXcUhaWmtDcXFVMm1OQUt0aEg2eUk4SDdLc1puOURTMnNKVnFNMDl4UkxXdHdIa3ppT0MvN2FPZ0ZMU2MKQ2JBSzQyQysrUGhtaU0xYjhYY0Y0TFZ6YnNGOVJpNk9TeWVtelRVSy9lVk5mYW9xb3luSFdtZ0U2T1hXazZSaQp3c1htOUUvRytaOGFqWUpKR1lyS1dVTTY2QTB5d2ZSTUV3TnZicVkva1hQTHluTnZFaUNMN3NDQ2VONUxMc0pKCnd4M3RGdllrOUNjYlhGY3gzRlh1cUI1dmJLemlSY3hYVjRwMVZ4bmd0VmlaU1RZeFBETUJiUlpLemJncWc0U0cKbS9sZzBoOXRrUVBUWUtiVlBacmRkNUE5TmFTZkQxNzFVa1JwdWNDNjNNOTkzM3paeEt5R0lqSzhlMnVSNzNyNApGMml3NGxOVllDMnZQc0tEMk5rSksvREFaTnVIaTVITWtlc0UvWGEwbFpybUZBWWIxVFFkdnRqL2RCeFRoWm5nCldWSktZZTJJbm10SmlVWitJRnJaNTBybGF1N1NaUkZEQWdNQkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUdmtVejFwY013NkM4STZ0TnhJcVNTYUhoMAoyVEFmQmdOVkhTTUVHREFXZ0JUdmtVejFwY013NkM4STZ0TnhJcVNTYUhoMDJUQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBZ0VBZmoxVTJpSmRHbGcrTzFRbnVyck15T01hYXVvKytSTHJWbDg5VU03ZzZrZ21Kczk1Vm42UkhKay8KMEtHUkhDd1BUNWlWV1ZPOTBDTFlpRjJjTi96N1pNRjRqSXVhWUFucTFmb2hYOUIwWmVkUXhiOHV1UXNMcmJXdwpGNllTak5SaWVPcFdhdXdLMGtERFBBVXdQazJVdDU5S0E5TjlKMHUyL2tUTytoa3pHbTJrUXRIZHpNakkxeFpTCmcwODFsTE1TVlgzbDRrTHI1SnlUQ2NCTVd3ZXJ4MjBSb0ZBWGxDT290UXFTRDdKNndXQXNPTXdhcGx2LzhnemoKcWg4YzNMaWdreWZlWStOL0laODY1Wjc2NEJOcWRldVdYR0tSbEk1blU3YUorQklKeTI5U1d3TnlobENWQ05TTgpoNFlWSDVVazJLUnZtczZrblp0dDBySjJCb2JHVmdqRjZ3bmFOc0liVzBHK1lTcmpjT2E0cHZpMldzUzlJZmYvCnFsK2hiSFk1WnRicVRGWGhBRE9iRTVoanlXL1FBU0FKTjFMbkRFOCt6YnoxWDVZbnB5QUNsZUF1NkFkQkJSOFYKYnRhdzVCbmdEd0tUQUNkeXhZdlJWQjlkU3NOQWwzNVZwbnpCTXdRVUFSMUpJR2tMR1pPZGJsZ2k5MEFNUmd3agpZL001MG45MlVhZjB5S0h4REhZaUkwWlNLUzNpbzBFSFZtbVkwZ1VKdkduSFdtSE5qNEZnRlUyQTNaRGlmY1JRCjhvdzdia3JIeHVhQUt6eUJ2QkdBRmhBbjEvRE5QM25NY3lyRGZsT1IxbTc0OWZQSDBGRk5qa3VsVytZWkZ6dlcKZ1FuY0l0enVqcm5FajFQaFo3c3p1SWdWUnMvdGFUWC9kUTFHODg1eDRjVnJoa0lHdVVFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSBPPVdJU2VLZXkgT1U9T0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIFN1YmplY3Q6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EgTz1XSVNlS2V5IE9VPU9JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBMYWJlbDogIk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EiCiMgU2VyaWFsOiAxNTc3Njg1OTU2MTY1ODg0MTQ0MjIxNTkyNzg5NjY3NTA3NTc1NjgKIyBNRDUgRmluZ2VycHJpbnQ6IGE0OmViOmI5OjYxOjI4OjJlOmI3OjJmOjk4OmIwOjM1OjI2OjkwOjk5OjUxOjFkCiMgU0hBMSBGaW5nZXJwcmludDogMGY6Zjk6NDA6NzY6MTg6ZDM6ZDc6NmE6NGI6OTg6ZjA6YTg6MzU6OWU6MGM6ZmQ6Mjc6YWM6Y2M6ZWQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZiOjljOjA4OmU4OjZlOmIwOmY3OjY3OmNmOmFkOjY1OmNkOjk4OmI2OjIxOjQ5OmU1OjQ5OjRhOjY3OmY1Ojg0OjVlOjdiOmQxOmVkOjAxOjlmOjI3OmI4OjZiOmQ2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdFRDQ0FwMmdBd0lCQWdJUWRyRWdVblR3aFlkR3MvZ2pHdmJDd0RBTkJna3Foa2lHOXcwQkFRc0ZBREJ0Ck1Rc3dDUVlEVlFRR0V3SkRTREVRTUE0R0ExVUVDaE1IVjBsVFpVdGxlVEVpTUNBR0ExVUVDeE1aVDBsVFZFVWcKUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sWkRFb01DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JIYkc5aQpZV3dnVW05dmRDQkhRaUJEUVRBZUZ3MHhOREV5TURFeE5UQXdNekphRncwek9URXlNREV4TlRFd016RmFNRzB4CkN6QUpCZ05WQkFZVEFrTklNUkF3RGdZRFZRUUtFd2RYU1ZObFMyVjVNU0l3SUFZRFZRUUxFeGxQU1ZOVVJTQkcKYjNWdVpHRjBhVzl1SUVWdVpHOXljMlZrTVNnd0pnWURWUVFERXg5UFNWTlVSU0JYU1ZObFMyVjVJRWRzYjJKaApiQ0JTYjI5MElFZENJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyQmUzCkhFb2tLdGFYc2NyaUh2dDlPTytZOWJJNW1FNG51QkZkZTlJbGxJaUNGU1pxR3pHN3FGc2hJU3ZZRDA2Zld2R3gKV3VSNTFqSWpLK0ZUekpsRlhIdFByYnkvaDBvTFM1ZGFxUFpJN0gxN0RjMGhCdCtlRmYxQmlraTNJUFNoZWh0WAoxRjFRLzdwbjJDT1pIOGcvNDk3L2IxdDNzV3R1dU1sazkrSEtRVVlPS1hIUXVTUDh5WUZmVHZkdjM3K0VyWE5rCnU3ZENqbW4yMUhZZGZwMm51RmVLVVdkeTE5U291SlZVUUhNRDl1cjA2LzRvUW5jL25TTWJzclk5Z0JRSFRDNVAKOTlVS0ZnMjlaa00zZmlORGVjTkFodlZNS2RxT21xME5wUVNIaUI2RjQrbFQxWnZJaXdOamVPdmdHVXB1dXk5cgpNMlJZazYxcHY0OGI3NEpJeHdJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFkQmdOVkhRNEVGZ1FVTlEvSU5tTmU0cVBzK1R0bUZjNVJVdU9SbWowd0VBWUpLd1lCQkFHQ054VUIKQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRUJNKzRleW1ZR1FmcDNGc0xBbXpZaDdLektOYnJnaApjVmlYZmE0M0ZLOCs1L2VhNG4zMmNaaVpCS3BEZEhpajQwbGhQbk9NVFpUZytYSEV0aFlPVTNnZjFxS0hMd0k1CmdTazhyeFdZSVREK0tKQUFqTkhoeS9wZXlQMzRFRVk3b25oQ2tSZDBWUXJlVUdkTlp0R24vLzNad0xXb280ck8KWnZVUFE4Mm5LMWQ3WTBacXFpNVMyUFR0NFcydEtaQjRTTHJoSTZxamlleTFxNWJBdEV1aUhaZWVldkp1UUhIZgphUEZsVGM1OEJkOVRaYW1sOExHWEJIQVZSZ09ZMU5LL1ZMU2dXSDFTYjlwV0ptTFUyTnVKTVc4YzhDTEMwMkljCk5jMU1hUlZVR3BDWTN1c2VYOHAzeDh1T1BVTnBuSnBZMENRNzN4dEFsbjQxcllISFRuRzZpQk09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TWkFGSVIgUk9PVCBDQTIgTz1LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuCiMgU3ViamVjdDogQ049U1pBRklSIFJPT1QgQ0EyIE89S3Jham93YSBJemJhIFJvemxpY3plbmlvd2EgUy5BLgojIExhYmVsOiAiU1pBRklSIFJPT1QgQ0EyIgojIFNlcmlhbDogMzU3MDQzMDM0NzY3MTg2OTE0MjE3Mjc3MzQ0NTg3Mzg2NzQzMzc3NTU4Mjk2MjkyCiMgTUQ1IEZpbmdlcnByaW50OiAxMTo2NDpjMTo4OTpiMDoyNDpiMTo4YzpiMTowNzo3ZTo4OTo5ZTo1MTo5ZTo5OQojIFNIQTEgRmluZ2VycHJpbnQ6IGUyOjUyOmZhOjk1OjNmOmVkOmRiOjI0OjYwOmJkOjZlOjI4OmYzOjljOmNjOmNmOjVlOmIzOjNmOmRlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMTozMzo5ZDozMzoyODoxYTowYjo1NjplNTo1NzpkMzpkMzoyYjoxYzplNzpmOTozNjo3ZTpiMDo5NDpiZDo1ZjphNzoyYTo3ZTo1MDowNDpjODpkZTpkNzpjYTpmZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGNqQ0NBbHFnQXdJQkFnSVVQb3BkQit4VjBqTFZ0K08yWHdIckxkemsxdVF3RFFZSktvWklodmNOQVFFTApCUUF3VVRFTE1Ba0dBMVVFQmhNQ1VFd3hLREFtQmdOVkJBb01IMHR5WVdwdmQyRWdTWHBpWVNCU2IzcHNhV042ClpXNXBiM2RoSUZNdVFTNHhHREFXQmdOVkJBTU1EMU5hUVVaSlVpQlNUMDlVSUVOQk1qQWVGdzB4TlRFd01Ua3cKTnpRek16QmFGdzB6TlRFd01Ua3dOelF6TXpCYU1GRXhDekFKQmdOVkJBWVRBbEJNTVNnd0pnWURWUVFLREI5TApjbUZxYjNkaElFbDZZbUVnVW05NmJHbGplbVZ1YVc5M1lTQlRMa0V1TVJnd0ZnWURWUVFEREE5VFdrRkdTVklnClVrOVBWQ0JEUVRJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUMzdkQ1UXFFdk4KUUxYT1llZVd5clNoMmd3aXNQcTFlM1lBZDR3THozMm9oc3dtVWVRZ1BZVU0xbGpqNS9RcUdKM2EwYTRtN3V0VAozUFNRMWhOS0RKQTh3L1RhMG80TmtqcmNzYkgvT043RHVpMWZnTGtDdlVxZEd3KzB3OExCWndQZDNCdWNQYk93CjNnQWVxRFJIdTVyci9nc1V2VGFFMmcwZ3YvcGJ5NmtXSUswNVlPNHZkYmJubDV6NVB2MStUVzlOTCsrSURXcjYKM2ZFOWJpQ2xvQkswVFhDNXp0ZHlPNG1UcDRDRUhDZEpja20xL3p1Vm5zSE15QUhzNkE2S0NwYm5zNmFINWRiNQpCU3NObDBCd1BMcXNkVnFjMVUyZEFnclNTNXRtUzBZSEYyV3RuMnlJQU53aWllRGhaTlJudkRGNVlUeTd5a0hOClhHb0F5RHc0amxpdkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUUQKQWdFR01CMEdBMVVkRGdRV0JCUXVGcWxLR0xYTHpQVnZVUE1qWC9oZDU2end5REFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQVFFQXRYUDRBOXhaV3gxMjZhTXFlNUFvc2szQU0wK3FtckhVdU9Rbi82bVdtYzVHNEcxOFRLSTRwQVp3CjhQUkJFZXcvUjQwL2NvZjVPLzJrYnl0VEFPRC9PYmxxQnc3ckhSejJvbktReTRJOUVZS0wwcnVmS3E4aDVtT0cKblhrWjcvZTdERFdRdzRydFR3LzF6QkxacEQ2N29Qd2dsVjlQSmk4Ukk0Tk9kUWNQdjV2UnRCM3BFQVQreW1DUApva3k0cmMvaGtBL05yZ3JIWFh1M1VOTFVZZnJWRmR2WG40ZFJWT3VsNCt2SmhhQWxJRGY3anM0TU5JVGhQSUd5CmQwNURwWWhmaG1laFBlYTBYR0cyUHR2K3R5akZvZ2V1dGNyS2pTb1M3NWZ0d2pDa3lTcDYrL05OSXh1Wk16U2cKTHZXcEN6L1VYZUhQaEovaUdjSmZpdFlnSHVOenR3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiIKIyBTZXJpYWw6IDQ0OTc5OTAwMDE3MjA0MzgzMDk5NDYzNzY0MzU3NTEyNTk2OTY5CiMgTUQ1IEZpbmdlcnByaW50OiA2ZDo0Njo5ZTpkOToyNTo2ZDowODoyMzo1Yjo1ZTo3NDo3ZDoxZToyNzpkYjpmMgojIFNIQTEgRmluZ2VycHJpbnQ6IGQzOmRkOjQ4OjNlOjJiOmJmOjRjOjA1OmU4OmFmOjEwOmY1OmZhOjc2OjI2OmNmOmQzOmRjOjMwOjkyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNjo3NjpmMjplZDpkYTplODo3Nzo1YzpkMzo2YzpiMDpmNjozYzpkMTpkNDo2MDozOTo2MTpmNDo5ZTo2Mjo2NTpiYTowMTozYToyZjowMzowNzpiNjpkMDpiODowNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjBqQ0NBN3FnQXdJQkFnSVFJZGJRU2s4bEQ4a3lOL3lxWGhLTjZUQU5CZ2txaGtpRzl3MEJBUTBGQURDQgpnREVMTUFrR0ExVUVCaE1DVUV3eElqQWdCZ05WQkFvVEdWVnVhWHBsZEc4Z1ZHVmphRzV2Ykc5bmFXVnpJRk11ClFTNHhKekFsQmdOVkJBc1RIa05sY25SMWJTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFa01DSUcKQTFVRUF4TWJRMlZ5ZEhWdElGUnlkWE4wWldRZ1RtVjBkMjl5YXlCRFFTQXlNQ0lZRHpJd01URXhNREEyTURnegpPVFUyV2hnUE1qQTBOakV3TURZd09ETTVOVFphTUlHQU1Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aClZXNXBlbVYwYnlCVVpXTm9ibTlzYjJkcFpYTWdVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVNRd0lnWURWUVFERXh0RFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSMwpiM0pySUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDOStYajQ1dFdBCkRHU2RoaHVXWkdjL0lqb2VkUUY5Ny90Y1o0ekp6RnhycVpIbXVVTGxJRXViMnB0N3VabGQyWnVBUzllRVFDc24KMCtpNk1McytDUnFuU1pYdkswQWt3cGZIcCs2YkplK29DZ0NYaFZxcW5kd3B5ZUkxQit0d1RVcld3Yk5XdUtGQgpPSnZSK3pGL2orQmY0YkUvRDQ0V1NXRFhCbzBZK2FvbUVLc3EwOURSWjQwYlJyNUhNTlV1Y3RIRlk5cm5ZM2xFCmZrdGpKSW1HTGpRL0tVeFNpeXFud09LUktJbTV3RnY1SGRubko2My9tZ0tYd2NaUWtwc0NMTDJwdVRSWkNyK0UKU3YvZi9yT2Y2OW1lNEpnajdLWnJkeFlxMjh5dE94eWtoOXhHYzE0WlltaEZWK1NRZ2tLN1F0YndZZURCb3oxbQpvMTMwR082SXlZMFhSU21aTW5VQ01lNHBKc2hyQXVhMVlrVi9OeFZhSTJpSjFEN2VUaWV3OEVBTXZFMFh5MDJpCnN4N1FCbHJkOXBQUFYzV1o5ZnFHR21kNHM3K1cvalRjdmVkU1Z1V3o1WFY3MTBHUkJkeGRhZU9WRFVPNS9JT1cKT1pWN2JJQmFUeE55eHRkOUtYcEV1bEtrS3RWQlJna2cvaUtndGxzd2pieUpETlhYY1BpSFV2M2E3NnhSTGdlegpUdjdRQ2Rwdzc1ajZWdVp0MjdWWFM5emxMQ1VWeUo0dWVFNzQycHllaGl6S1YvTWE1Y2lTaXhxQ2xuckR2RkFTCmFkZ09Xa2FMT3VzbStpUEp0ckNCdmtJQXBQalcvakF1eDlKRzl1V09kZjN5ekxuUWgxdk1CaEJndTRNMXQxNW4KM2tmc21VanhwS0VWL3EyTVlvNDVWVTg1RnJteFk1My90d0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUIwR0ExVWREZ1FXQkJTMm9WUTVBc09nUDQ2S3ZQclUrQnltMFRvTy9UQU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEUVlKS29aSWh2Y05BUUVOQlFBRGdnSUJBSEdsRHM3azZiOC9PTldKV3NRQ1lmdE14UlFYTFl0UFUyc1EKRi94bGhNY1FTWkRlMjhjbWs0Z21iM0RXQWw0NW9QZVBxNWExcFJOY2dSUnREb0dDRVJ1S1RzWlBwZDFpSGtUZgpDVm4wVzNjTE4rbUxJTWI0Q2s0dVdCenJNOURQaG1ESjJ2dUFMNTVNWUlSNFBTRmsxdnRCSHhnUDU4bDFjYjI5ClhONDBoejVCc0E3MnVkWS9DUk9XRkMvZW1oMWF1VmJPTlRxd1gzQk5YdU1wOFNNb2NsbTJxOEtNWmlZY2R5d20KZGpXTEtLZHBvUGs3OVNQZGhSQjB5WkFEVnBIbnI3cEgxQktYRVNMam9rbVViT2UzbEV1NkxhVGFNNHRNcGtULwpXanpHSFdUWXRUSGtwang2cUZjTDIrMWhHc3Z4em5OM1k2U0hiMHhST05ia1g4ZWZ0b0VxNUlWSWVWaGVPL2piCkFvSm53VG5idzNSTFBUWWUrU21UaUdoYnFFUVpJZkNuNklFTkxPaVROclEzc3Nxd0d5WjZtaVVmbXBxQW5rc3EKUC91am12NXpNbkhDbnNaeTRZcG9KL0hrRDdURVRLVmhrL2lYRUFjcU1DV3B1Y2h4dU85b3pDMSs5ZUIrRDRLbwpiN2E2YklORGQ4MktraGVobmx0NEZqMUY0ak55M2VGbXlwblR5Y1VtL1Exb0JFYXV0dG1iakw0WnZySEc4aG5qClhBTEtMTmh2U2dmWnlUWGFRSFh5eEtjWmI1NUNFSmgxNXBXTFlMenR4UkxYaXM3Vm1GeFdsZ1BGN25jR05mL1AKNU80L0UySHUyOW90aGZETnJwMnlHQWxGdzVLaGNoZjhSN2FnQ3l6eHhONURhQWhxWHp2d2RtUDd6QVlzcHNiaQpEclc1dmlTUAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogY2E6ZmY6ZTI6ZGI6MDM6ZDk6Y2I6NGI6ZTk6MGY6YWQ6ODQ6ZmQ6N2I6MTg6Y2UKIyBTSEExIEZpbmdlcnByaW50OiAwMTowYzowNjo5NTphNjo5ODoxOToxNDpmZjpiZjo1ZjpjNjpiMDpiNjo5NTplYToyOTplOToxMjphNgojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6NDA6OTI6OWE6MDI6Y2U6NTM6YjQ6YWM6ZjQ6ZjI6ZmY6YzY6OTg6MWM6ZTQ6NDk6NmY6NzU6NWU6NmQ6NDU6ZmU6MGI6MmE6Njk6MmI6Y2Q6NTI6NTI6M2Y6MzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdDekNDQS9PZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCcGpFTE1Ba0dBMVVFQmhNQ1IxSXgKRHpBTkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1awpJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UURBK0JnTlZCQU1UCk4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1VtOXYKZEVOQklESXdNVFV3SGhjTk1UVXdOekEzTVRBeE1USXhXaGNOTkRBd05qTXdNVEF4TVRJeFdqQ0JwakVMTUFrRwpBMVVFQmhNQ1IxSXhEekFOQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oClpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3gKUURBK0JnTlZCQU1UTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMQpkR2x2Ym5NZ1VtOXZkRU5CSURJd01UVXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRREMrS2svRzRuOFBEd0VYVDJRTnJDUk9uazhabHJ2YlRrQlNScTB0ODkvVFNOVHQ1QUE0eE1xS0tZeDhaRUEKNHlqc3JpRkJ6aC9hL1gwU1d3R0REN213WDVuaDhoS0RnRTBHUHQrc3IrZWhpR3N4ci9DTDBCZ3p1TnRGYWpUMApBb0FrS0FvQ0ZaVmVkaW9ObVRvVVcvYkx5MU84RTAwQmlEZVVKUnRDdkNMWWpxT1dYanJaTXRzKzZQQVFaZTEwCjRTK25mSzhuTkxzcGZadTJ6d25JNWRNSy9JaGxaWFFLM0hNY1hNMUFzUnpVdG9TTVRGRFBhSTZvV2E3Q0owNkMKb2pYZEZQUWYvN0ozMVljdnFtNTlKQ2ZueHNzbTV1WCtad2RqMkVVTjNUcFpaVGxZZXBLWmNqMmNoRjZJSWJqVgo5Q3o4MlhCU1QzaTR2VHdyaTVXWTliUFJhTThnRkg1TVhGL25pK1gxTllFWk45Y1JDTGRtdnROS3pvTlhBRHJECmdmZ1h5NUkyWGRHajJIVWI0WXNuNm5wSVFmMUZHUWF0SjVsT3dYQkgzYldmZ1ZNUzViR01TRjB4UXhmampNWjYKWTVaTEtUQk9oRTVpR1Y0OHpwZVFwWDhCNjUzZytJdUozU1dZUFpLMmZ1L1o4VkZSZlMwbXlHbFpZZUNzYXJncQpOaEVFZWxDOU1vUytMOXh5MWRjZEZrZmtSMllnUC9TV3hhK09BWHFsRDNwazlRMFloOW11aU5YNmhNRTZ3R2tvCkxmSU5hRkdxNDZWM3hxU1FEcUUzaXpFalI4RUpDT3R1OTNpYjE0TDhoQ0NaU1JtMkVrYXgrMFZWRnFtalpheWMKQncvcWE5d2ZMZ1p5N0lhSUV1UXQyMThGTCtUd0E5TW1NK2VBd3MxQ29SYzBDd0lEQVFBQm8wSXdRREFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVY1JWbnlNakp2WFZkCmN0QTRHR3FkODNFa1ZBc3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSFc3YlZSTHFoQllSalR5WXRjV05sMEkKWHRWc3lJZTl0QzVHOGpINGZPcEN0Wk1XVmR5aERCS2cybUYrRDFoWWMyUnl4K2hGanR5cDhpWS94bm1Nc1ZNSQpNNEd3VmhPKzVsRmMySnNLVDB1Y1ZsTUM2VS8yRFdEcVRVSlY2SHdiSVNIVEd6ck1kL0s0a1BGb3gvbGEvdm90CjlML0o5VVViempnUUtqZUtlYU8wNHdsc2hZYVQvNG1XSjNpQmoyZmpSblJVanRrTmFlSks5RTEwQS8reWQrMlYKWjVma3NjV3J2Mm9qNk5TVTRrUW9Zc1JMNHZEWTRpbHJHbkIrSkdHVGUwOERNaVVOUlNRcmxyUkdhcjlLQy9lYQpqOEdzR3NWbjgyODAwdnB6WTR6dkZyQ29wRVlxK09zUzdISzA3L2dyZm94U3dJdUVWUGt2UHVOVnFOeG1zZG5oClg5aXpqRmswV2FTclQyeTdIeGpiZGF2WXk1TE5sRGhoRGdjR0gwdEdFUEVWdm8yRlhEdEtLNEY1RDdScG4wbFEKbDAzM0RsWmR3SlZxd2piREcyako5U3JjUjVxK3NzN0ZKZWo2QTduYStSWnVrWVQxSENqSS9DYk0xeHlRVnFkZgpiem9Fdk0xNGlRdU9EeStqcWsraUd4STlGZ2hBRC9GR1ROZXFld2pCQ3ZWdEo5NENqOHJEdFN2SzZldklJVk00CnBjdzcySGMzTUtKUDJXL1I4a0N0UVhvWHhkWktOWW0zUWRWOGhuOVZUWU5LcFhNZ3dEcXZrUEdhSkk3WmpuSEsKZTdpRzJyS1BtVDRkRXcwU0VlN1VxL0RwRlhZQzVPRGZxaUFlVzJHRlpFQ3BrSmNOclZQU1doMkhhZ0NYWldLMAp2bTlxcC9Vc1F1MHlyYllobnI2OAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogODE6ZTU6YjQ6MTc6ZWI6YzI6ZjU6ZTE6NGI6MGQ6NDE6N2I6NDk6OTI6ZmU6ZWYKIyBTSEExIEZpbmdlcnByaW50OiA5ZjpmMTo3MTo4ZDo5MjpkNTo5YTpmMzo3ZDo3NDo5NzpiNDpiYzo2Zjo4NDo2ODowYjpiYTpiNjo2NgojIFNIQTI1NiBGaW5nZXJwcmludDogNDQ6YjU6NDU6YWE6OGE6MjU6ZTY6NWE6NzM6Y2E6MTU6ZGM6Mjc6ZmM6MzY6ZDI6NGM6MWM6Yjk6OTU6M2E6MDY6NjU6Mzk6YjE6MTU6ODI6ZGM6NDg6N2I6NDg6MzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN3ekNDQWtxZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQ0JxakVMTUFrR0ExVUVCaE1DUjFJeER6QU4KQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbApjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hSREJDQmdOVkJBTVRPMGhsCmJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUlVORElGSnYKYjNSRFFTQXlNREUxTUI0WERURTFNRGN3TnpFd016Y3hNbG9YRFRRd01EWXpNREV3TXpjeE1sb3dnYW94Q3pBSgpCZ05WQkFZVEFrZFNNUTh3RFFZRFZRUUhFd1pCZEdobGJuTXhSREJDQmdOVkJBb1RPMGhsYkd4bGJtbGpJRUZqCllXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eWFYUjUKTVVRd1FnWURWUVFERXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMApkWFJwYjI1eklFVkRReUJTYjI5MFEwRWdNakF4TlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSktnClFlaExnb1JjNHZneEVabUdaRTRKSlMrZFFTOEtyalZQZEpXeVVXUnJqV3ZtUDNDVjhBVkVSNlp5T0ZCMmxRSmEKanE0b252a3RUcG52TEVodlRDVXA2TkZ4Vzk4ZHdYVTN0TmY2ZTNwQ25Hb0tWbHA4YVF1cWdBa2tiSDdCUnFOQwpNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTFFpCkM0S1pKQUVPbkx2a0R2Mi8rNWNnazVrcU1Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HZk9GbUk0b3F4aVJhZXAKbFNUQUdpZWNNanZBd05XNnFlZjRCRU5UaGU1U0lkNmQ5U1dEUHA1WVN5L1haeE1PSVFJd0JlRjFBZDVvN1NvZgpUVXdKQ0Ezc1M2MWtGeWpuZGM1RlpYSWhGOHNpUVE2TUU1ZzRtbFJ0bThyaWZPb0NXQ0tSCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0cGx1cyBSb290IENBIEcxIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DZXJ0cGx1cyBSb290IENBIEcxIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIFJvb3QgQ0EgRzEiCiMgU2VyaWFsOiAxNDkxOTExNTY1Nzc5ODk4MzU2NzA5NzMxMTc2OTY1NjE1NTY0NjM3NzEzCiMgTUQ1IEZpbmdlcnByaW50OiA3ZjowOTo5YzpmNzpkOTpiOTo1Yzo2OTo2OTo1NjpkNTozNzozZToxNDowZDo0MgojIFNIQTEgRmluZ2VycHJpbnQ6IDIyOmZkOmQwOmI3OmZkOmEyOjRlOjBkOmFjOjQ5OjJjOmEwOmFjOmE2OjdiOjZhOjFmOmUzOmY3OjY2CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNToyYTo0MDoyYjpmYzpkZjoyYzpkNTo0ODowNTo0ZDoyMjo3NTpiMzo5Yzo3ZjpjYTozZTpjMDo5Nzo4MDo3ODpiMDpmMDplYTo3NjplNTo2MTphNjpjNzo0MzozZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVNFU0JWZytRdFBsUldoUzJETjdjczNFWVJNQTBHQ1NxR1NJYjNEUUVCRFFVQQpNRDR4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5CmRIQnNkWE1nVW05dmRDQkRRU0JITVRBZUZ3MHhOREExTWpZd01EQXdNREJhRncwek9EQXhNVFV3TURBd01EQmEKTUQ0eEN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeQpkSEJzZFhNZ1VtOXZkQ0JEUVNCSE1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCCkFOcFFoN2JhdUtrK25XVDZWak9hVmowVzVRT1ZzalFjbW0xaUJkVFlqK2VKWkorNjIyU0xaT1o1S21ITnI0OWEKaVpGbHVWajh0QU5ma1Q4dEVCWGdmcys4L0g5RFo2aXRYallqMkppelRmTkRuamw4S3Z6c2lOV0k3bkM5aFJZdAo2a3VKUEtOeFF2NGMvZE1jTFJDNGhsVHFRN2pieG9mYXFLNkFKYzk2SmgycWtiQkliNjYxM3A3WTEvb0EvY2FQCjBGRzdZbjJrc1l5eS95QVJ1alZqQllaSFlFTXprUFpIb2dOUGxrMmRUOEhxNnB5aS9qUXUzcmZLRzNha3Q2MmYKNmFqVWVEOTQvdkk0Q1RZZDBoWUN5T3dxYUsvMWpwVHZMUk42SGtKS0hSVXhyZ3dFVi94aGMvTXhWb1l4Z0tERQpFVzR3ZHVPVThGOEV4S3lIY29tWXhaM01Wd2lhOUF6OGZYb0ZPdnBIZ0RtMno0UVRkMjhuNnYrV1p4Y0liZWtOCjFpTlFNTEFWZEJNKzVTLy9EczNFQzBwZDhOZ0FNMGxtNjZFWWZGa3VQU2k1WVhITHRhVzZ1T3JjNG5CdkNHcmMKaDJjMDc5OHdjdDN6eVQ4ai96WGh2aUVwSURDQjVCbWxJT2tseW5NeGRDbSs0a0xWODdJbVpzZG8vUm16NXlDVAptZWhkNEY2SDUwYm9KWndLS1NUVXpWaUdVa0Frc25zUG1CSWdKUGFRYkVmSURic1lJQzdaL2Z5TDhpbnFoM1NWCjRFSlFlSVFFUVdHdzlDRWpqeTNMS0NIeWFtejBHcWJGRkxRM1pVK1YvWURJK0hMbEpXdkVZTEY3Ylk1S2luUE8KV2Z0d2VuTUdFOW5UZERja1FRb1JiNWZjNStSK29iMFY4cnFIRHoxb2loWUhBZ01CQUFHall6QmhNQTRHQTFVZApEd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlNvd2NDYmthaERGWHhkCkJpZTBLbEhZbHd1QnNUQWZCZ05WSFNNRUdEQVdnQlNvd2NDYmthaERGWHhkQmllMEtsSFlsd3VCc1RBTkJna3EKaGtpRzl3MEJBUTBGQUFPQ0FnRUFuRlp2QVg3UnZVejFpc2J3SmgvazREZ1l6RExES1R1ZFFTazBZY2JYOEFDaAo2NlJ5ajVRWHZCTXNkYlJYN2dwOENYcmMxY3FoMERRVCtIZXJuK1grMkI1MGlvVUhqMy9NZVhyS2xzM04vVS83Ci9TTU5rUFgwWHRQR1lYMmVFZUFDN2drRTJRZmRwb3EzRElNa3U0TlFrdjVnZFJFKzJKMndpbnExNEoyYnk1QlMKUzdDVEt0UStGalBsbnNabEZUNWtPd1EvMnd5UFgxd2RhUit2OCtraGpQUHZsL2FhdHhtMmhIU2NvMVMxY0U1agoyRmRkVXlHYlFKSkQrdFozVlROUFpOWDcwQ3hxam0wbHB1K0Y2QUxFVXo2NW5vZTh6RFVhM3FIcGltT0haUjRSCkt0dGpkNWNVdnBvVW1SR3l3TzZ3VC9nVUlUSkRUNStyb3N1b0Q2bzdCbFhHRWlsWENOUTMxNGNuclVsWnA1R3IKUkhwZWpYRGJsODVJVUxGemsvYndnMkQ1emZIaE1mMWJmSEVoWXhRVXFxL0YzcE4rYUxIc0lxS3FrSFdldFVOeQo2bVNqaEV2OURLZ21hM0dYN2xaalp1aENWUG5ISGQvUWoxdmZ5REJ2aVA0TnhETWNVNmlqL1VnUTh1UUtUdUVWClYveHVaRERDVlJIYzZxbk5TbFNzS1dORXowcEFvTlpvV1JzeitlODZpOXNna3R4Q2hMOEJxNGZBMVNDQzI4YTUKZzRWQ1hBOURPMnBKTmRXWTlCVy8rbUdCREFrZ0dOTFFGd3pMU0FCUTZYYUNqR1RYT3FBSFZjd2VNY0R2T3JSbAorK08vUW11ZUQ2aTlhNWpjMk52TGk2VGQxMW4wYnQzK3FzT1IwQzVDQjhBTVRWUE5KTEZNV3g1UjlOL3Brdm89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0cGx1cyBSb290IENBIEcyIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DZXJ0cGx1cyBSb290IENBIEcyIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIFJvb3QgQ0EgRzIiCiMgU2VyaWFsOiAxNDkyMDg3MDk2MTMxNTM2ODQ0MjA5NTYzNTA5MjI4OTUxODc1ODYxNTg5CiMgTUQ1IEZpbmdlcnByaW50OiBhNzplZTpjNDo3ODoyZDoxYjplZToyZDpiOToyOTpjZTpkNjphNzo5NjozMjozMQojIFNIQTEgRmluZ2VycHJpbnQ6IDRmOjY1OjhlOjFmOmU5OjA2OmQ4OjI4OjAyOmU5OjU0OjQ3OjQxOmM5OjU0OjI1OjVkOjY5OmNjOjFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2YzpjMDo1MDo0MTplNjo0NDo1ZTo3NDo2OTo2Yzo0YzpmYjpjOTpmODowZjo1NDozYjo3ZTphYjpiYjo0NDpiNDpjZTo2Zjo3ODo3Yzo2YTo5OTo3MTpjNDoyZjoxNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hEQ0NBYUtnQXdJQkFnSVNFU0Raa2M2dW8rakY1Ly9wQXEvUGM3eFZNQW9HQ0NxR1NNNDlCQU1ETUQ0eApDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnlkSEJzCmRYTWdVbTl2ZENCRFFTQkhNakFlRncweE5EQTFNall3TURBd01EQmFGdzB6T0RBeE1UVXdNREF3TURCYU1ENHgKQ3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5ZEhCcwpkWE1nVW05dmRDQkRRU0JITWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTTBQVzFhQzMvQkZHdGF0CjkzbndIY21zbHRhZVRwd2Z0RUlSeW9hL2JmdUZvOFhsR1Z6WDdxWS9hV2ZZZU9LbXljVGJMWGt1NTR1TkFtOHgKSWswRzQyQnlSWjBPUW5lZXpzL2xmNFdiR09UOHpDNXkweGFUVHNxWlkxeWhCU3BzQnFOak1HRXdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTnFEWXdKNWp0cE14andqCkZOaVB3eUNyS0dCWk1COEdBMVVkSXdRWU1CYUFGTnFEWXdKNWp0cE14andqRk5pUHd5Q3JLR0JaTUFvR0NDcUcKU000OUJBTURBMmdBTUdVQ01IRCtzQXZaOTRPWDdQTlZIZFRjc3dZTy9qT1luWXM1a0d1VUllMjIxMTNXVE5jaApwK2UvSVE4cnpmY3EzSVVIblFJeEFJWVVGdVhjc0dYQ3dJNFVuNzhrRm1qbHZQbDVhZHl0UlN2M3RqRnp6QWFsClU1T1JHcE91Y0dwbnV0ZWU1V0VhWHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzEgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMSBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzEiCiMgU2VyaWFsOiAxNDkyMDM2NTc3ODExOTQ3MDEzNzcwNDAwMTI3MDM0ODI1MTc4ODQ0Nzc1CiMgTUQ1IEZpbmdlcnByaW50OiA3NjowMDpjYzo4MToyOTpjZDo1NTo1ZTo4ODo2YTo3YToyZTpmNzo0ZDozOTpkYQojIFNIQTEgRmluZ2VycHJpbnQ6IDc5OjkxOmU4OjM0OmY3OmUyOmVlOmRkOjA4Ojk1OjAxOjUyOmU5OjU1OjJkOjE0OmU5OjU4OmQ1OjdlCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NjpjNzo3MToyODpkOTo4YzoxODpkOToxYjo0YzpmZDpmZjpiYzoyNTplZTo5MTowMzpkNDo3NTo4ZTphMjphYjphZDo4Mjo2YTo5MDpmMzo0NTo3ZDo0NjowZTpiNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJ6Q0NBMWVnQXdJQkFnSVNFU0N6a0ZVNWZYODJiV1RDcDU5clk0NW5NQTBHQ1NxR1NJYjNEUUVCQ3dVQQpNRUF4Q3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3ClpXNVVjblZ6ZENCU2IyOTBJRU5CSUVjeE1CNFhEVEUwTURVeU5qQTRORFUxTUZvWERUTTRNREV4TlRBd01EQXcKTUZvd1FERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VQpUM0JsYmxSeWRYTjBJRkp2YjNRZ1EwRWdSekV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUQ0ZVViYWxzVXdYb3B4QXkxd3BMdXd4UWpjemVZMXdJQ2tFUzNkNW9ldVhUMlIwb2RzTjdmYVlwNmIKd2lUWGovSGJwcWJmUm05UnBuSExQaHN4WjJMM0VWczBKOVY1VG95YldMMGlFQTFjSnd6ZE1PV28wMTBoT0hRWAovdU1mdGs4N2F5M2JmV0FmakgxTUJjTHJBUllWbUJTTzBaQjNJai9zd2ptNGVUcndTU1RpbFpIY1lUU1NqRlIwCjc3RjlqQUhpT0gzQlgycGZKTEtPWWhldGVTQ3RxeDIzNExTV1NFOW1ReEFHRmlRRDRlQ2Nqc1pHVDQ0YW1lR1AKdVk0emJHbmVXSzJnRHFka1ZCRnBSR1pQVEJLbmppeDl4TlJieFFBME1NSFptZjR5emdlRXRFN05DdjgyVFdMeApwMk5YNU50cXA2Ni9LN25KNXJJbmllVittaHhOYU1iQkdONHpLMUZHU3h5Tzl6ME0rWW8wRk1UN016VWo4Y3p4CktzZWx1N0NpenY1VGEwMUJHMllvc3BiNnA2NEtUcms1TTBTY2RNR1RIUGpnbmlRbFEvR2JJNEtxM3l3Z3NOdzIKVGdPemZBTFU1bnNhcW9jVHZ6NmhkTHViRHVIQWs1L1hwR2JLdXhzNzR6RDBNMW1LQjNJRFZlZHphZ014Ym0rVwpHK09pbjYrU3grMzFRcmNsVERzVEJNOGNscThjSXFQUXF3V3lUQklqVXR6OUdWc25uQjQ3ZXYxQ0k5c2pnQlB3CnZGRVZWSlNtZHo3UWRGRzlVUlFJT1RmTEh6U3BNSjFTaEM1VmtMRzYzMVVBQzloV0xiRkpTWEtBcVdMWHdQWVkKRVFSVnpYUjd6MkZ3ZWZSN0xGeGNrdnpsdUZxclRKT1ZvU2Z1cGI3UGNTTkN1cHQyTFFJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWwwWWhWeUUxCjJqWlZ4L1B4TjNEbENQYVRLYll3SHdZRFZSMGpCQmd3Rm9BVWwwWWhWeUUxMmpaVngvUHhOM0RsQ1BhVEtiWXcKRFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUIzZEFtQjg0RFduNXBoNzZrVE9aMEJQOHBOdVp0UTVpU2FzMDAwRQpQTHVISVQ4MzlIRWwya3U2cTVhQ2daRzI3ZG14cEdXWDRtOWtXYVNXN21ES0h5UDdSYnIvanlUd3lxa3hmM2tmCmdMTXRNcnBrWjJDdnVWbk4zNXBKMDZpQ3NmbVlsSXJNNEx2Z0JCdVpZTEZHWmR3SW9ySkdua1NJNnBOK1Z4YlMKRlhKZkxrdXIxSjFqdU9OSTVmNkVMbGdLbjBNZC9yY1lrb1pEU3c2Y01vWXNZUFhwU09xVjdYQXA4ZFV2L1RXMApWOC9iaFVpWnVjSnZiSS9OZUpXc1pDajlWckREYjhPK1dWTGhYNFNQZ1BMMERUYXRkck9qdGVGa2RqcFkzSDFQClhsWnM1VlZaVjZYZjhZcG1NSXpVVW1JNGQ3UytLTmZLTnNTYkJmRDRGZHZiOGU4MG5SMTRTb2hXWjI1Zy80L0kKaStHT3ZVS3BNd3BaUWhJU0t2cXhuVU9PQlp1WjJtS3RWemF6SGJZTmVTMld1T3Z5REVzTXBaVEdNS2NtR1MzdApUQVpRTVBIOVdEMjVTeGRmR2JScWhGUzBPRTg1b2cyV2FNTW9sUDN0TFI5S2EwT1dMcEFCRVBzNHBvRUwwTDkxCjA5UzV6dkUvYnc0Y0hqZHg1UmlIZFJrL1VMbGVwRVUwcmJESzV1VVRkZzh4RkttT0xaVFcxWVZOY3hWUFMvS3kKUHUxc3ZmME9uV1p6c0QyMDk3K280QkdreEs1MUNVcGpBRWdncHNhZEN3bUt0T0Rtemo3SFBpWTQ2U3ZlcGdoSgpBd1NRaXVtUHYraTJ0Q3FqSTQwY0hMSTVrcWlQQWx4QU9YWFVjMEVDZDk3TjRFT0gxdVM2U3NOc0VuLytLdVlqCjFveHgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEcyIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzIgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEcyIgojIFNlcmlhbDogMTQ5MjAxMjQ0ODA0MjcwMjA5Njk4Njg3NTk4NzY3NjkzNTU3MzQxNTQ0MQojIE1ENSBGaW5nZXJwcmludDogNTc6MjQ6YjY6NTk6MjQ6NmI6YWU6Yzg6ZmU6MWM6MGM6MjA6ZjI6YzA6NGU6ZWIKIyBTSEExIEZpbmdlcnByaW50OiA3OTo1Zjo4ODo2MDpjNTphYjo3YzozZDo5MjplNjpjYjpmNDo4ZDplMTo0NTpjZDoxMTplZjo2MDowYgojIFNIQTI1NiBGaW5nZXJwcmludDogMjc6OTk6NTg6Mjk6ZmU6NmE6NzU6MTU6YzE6YmY6ZTg6NDg6Zjk6YzQ6NzY6MWQ6YjE6NmM6MjI6NTk6Mjk6MjU6N2I6ZjQ6MGQ6MDg6OTQ6ZjI6OWU6YTg6YmE6ZjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiekNDQTFlZ0F3SUJBZ0lTRVNDaGFSdS92Ym05VXBhUEkraEl2eVlSTUEwR0NTcUdTSWIzRFFFQkRRVUEKTUVBeEN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5dwpaVzVVY25WemRDQlNiMjkwSUVOQklFY3lNQjRYRFRFME1EVXlOakF3TURBd01Gb1hEVE00TURFeE5UQXdNREF3Ck1Gb3dRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1UKVDNCbGJsUnlkWE4wSUZKdmIzUWdRMEVnUnpJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFETXRsZWxNNVFRZ1RKVDMyRitEM1k1ejF6Q1UzVWRTWHFXT04yaWMycnhiOTVlb2xxNWNTRytOdG1oCi9MenViS2g4TkJweEd1Z2EyRjhPUkFidHArRHowbUVMNERLaWx0RTQ4TUxhQVJmODVLeFA2TzZKSG5TclQ3OGUKQ2JZMmFsYno0ZTZXaVdZa0J1VE5RanBLM2VDYXNNU0NSYlAreWF0Y2ZEN0o2eGN2REgxdXJxV1B5S3dsQ20vNgoxVVdZMGpVSjlnTkRsUDdadnlDVmVZQ1lpdG1KTmJ0Ukc2UTNmZnlaTzZ2L3Y2d05qME94bVhzV0VINGRiMGZFCkZZOEVsZ2dHUWdUNGhOWWR2SkdtUXI1SjFXcUlQN3d0VWRHZWplQlN6RmZkTlRWWTI3U1BKSWpraTkvY2ExVFMKZ1N1eXpwSkxIQjlHK2gzWWtzdDJaN1VKbVFubHJCY1VWWERHUEtCV0NnT3ozR0laMzhpMU1ILzFQQ1oxRWIzWApHN09IbmdldlpYSGxvTThhcHdrUUhaT0pabHZvUEdJeXRiVTZidW1GQVl1ZVE0eG5jeWhaVyt2ajNDek1wU1p5ClloSzA1cHlEUlBaUnBPTEFlaVJYeWc2bFB6cTFPNHZsZHU1dzVwTGVGbHdvVzVjWko1TCtlcEpVenBNNUNoYUgKdkdPejliR1RYT0J1dDlEcStXSXlpRVQ3dnljb3RqQ1ZYUklvdVpXK2oxTVk1YUlZRnVKV3BMSXNFUFVkTjZiNAp0L2JRV1Z5Sjk4TFZ0WlIwMGRYK0c3Ync1dFllZTlJOHk2amo5Ump6SVI5dTcwMW9CbnN0WFc1RGlhYkErYUMvCmdoN1BVMyswNnl6YlhmWnFmVUFrQlhLSk9BR1R5M0hDT1YwR0VmWnZlUGczRFRtRUp3SURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVham42UWlMMwo1b2tBVFY1OU00UEx1RzUzaHE4d0h3WURWUjBqQkJnd0ZvQVVham42UWlMMzVva0FUVjU5TTRQTHVHNTNocTh3CkRRWUpLb1pJaHZjTkFRRU5CUUFEZ2dJQkFKakxxMEE4NVRNQ2wzOHRoNmFQMUY1S3I3Z2U1N3R4KzRCa0phbXoKR2o1b1hTY21wN29xNGZCWGd3cGtUeDRpZEJ2cGtGL3dyTS8vVDJoNk9LUVFiQTJ4eDZSM2dCaTJvaWhFZHFjMApuWEdFTDhwWjBrZUltVUVpeVRDWVlXNDlxS2dGYmRFZndGRkVWbjhuTlFMZFhwZ0tRdXN3djQyaG0xR3FPK3FUClJtVEZBSG5lSVd2MlY2Q0cxd1p5N0hCR1M0dHozYUFoZFQ3Y0hjQ1AwMDl6SElYWi9uOWl5SlZ2dHRON2pMcFQKd20rYlJFeDUwQjF3czllZkF2U3lCN0RINWZpdEl3Nm1Wc2twRW5kSTJTOUcvVHZ3L0hSd2txV09PQWdmWkRDMgp0MHY3TnF3UWpxQlNNMk9kQXpWV3hXbTl4aU5hSjVUMnBCTDRMVE04b1ZhbFg5WVo2ZTE4Q0wxM3pTZGt6SlRhClRrWlFoK0Q1d1ZPQUhydXQrMGRTaXh2OW92bmVEaUszUFROWmJOVGU5WlVHTWcxUkdVRmNQazhHOTdrcmdDZjIKbzZwNmZBYmhROE1UT1dJYU5yM2dLQzZVQXVRcExtQlZya0E5c0hTU1h2QWdaSlkvWDBWZGlMV0syZ0tnVzBWVQozamc5Q2NDb1NtVkdGdnlxdjFST1RWdStPRU8zS01xTE02b2FKYm9sWENrdlcwcHVqT290bkNyMkJYYmdkNWVBCmlOMW5FMjhkYUNTTFQ3ZDBnZVgwWUo5NlZkYytOOW9XYXo1M3JLNFljSlVJZVNrRGl2N0JPN00vR2cra08xNGYKV0tHVnlhc3ZjMHJRTFc2YVdROVZHSGd0UEZHbWw0dm11N0p3cWt3UjN2OThLemZVZXRGM05JL24rVUwzUElFTQpTMUlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMyBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEczIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMyIKIyBTZXJpYWw6IDE0OTIxMDQ5MDgyNzE0ODU2NTMwNzEyMTk5NDE4NjQxNzExNzA0NTU2MTUKIyBNRDUgRmluZ2VycHJpbnQ6IDIxOjM3OmI0OjE3OjE2OjkyOjdiOjY3OjQ2OjcwOmE5Ojk2OmQ3OmE4OjEzOjI0CiMgU0hBMSBGaW5nZXJwcmludDogNmU6MjY6NjQ6ZjM6NTY6YmY6MzQ6NTU6YmY6ZDE6OTM6M2Y6N2M6MDE6ZGU6ZDg6MTM6ZGE6OGE6YTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI3OmMzOjYyOjMxOjcwOjZlOjgxOjA3OjhjOjM2OjdjOmI4Ojk2OjE5OjhmOjFlOjMyOjA4OmRkOjkyOjY5OjQ5OmRkOjhmOjU3OjA5OmE0OjEwOmY3OjViOjYyOjkyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSVRDQ0FhYWdBd0lCQWdJU0VTRG0rRXo4SkxDK0JVQ3Myb01iTkdBL01Bb0dDQ3FHU000OUJBTURNRUF4CkN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5d1pXNVUKY25WemRDQlNiMjkwSUVOQklFY3pNQjRYRFRFME1EVXlOakF3TURBd01Gb1hEVE00TURFeE5UQXdNREF3TUZvdwpRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1VUM0JsCmJsUnlkWE4wSUZKdmIzUWdRMEVnUnpNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVJLN2xpdVRjcG0KM2dZNm94SDg0Qmp3Ymh5NkxUQU1pZG5XN3B0emc2a2pGWXd2V1lwYTNSVHFuVmtyUTdjRzdESzJ1dTVCdGExZApvWVhNNmgwVVpxTm5ma2JpbFBQbnRsYWhGVm1oVHplWHVTSWV2UkhyOUxJZlhzTVVtdVhabDVtall6QmhNQTRHCkExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJIZDhNVWkySTUKRE1sdjRWQk4wQkJZM0pXSWJUQWZCZ05WSFNNRUdEQVdnQlJIZDhNVWkySTVETWx2NFZCTjBCQlkzSldJYlRBSwpCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqNmpjbmJvTUJCZjZGZWs5THlrQmw3K0JGak5BazJ6OCtlMkFjRytxCmo5dUV3b3YxTmNvRzNHUnZhQmJoajVHNUFqRUEyRXVseThMUUNHenBHUHRhM1UxZkpBdXdBQ0VsNzQrbkJDWngKNG54cDVWMmErRUVmT3ptVGs1MVY2czJOOGZ2QgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SVNSRyBSb290IFgxIE89SW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAKIyBTdWJqZWN0OiBDTj1JU1JHIFJvb3QgWDEgTz1JbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cAojIExhYmVsOiAiSVNSRyBSb290IFgxIgojIFNlcmlhbDogMTcyODg2OTI4NjY5NzkwNDc2MDY0NjcwMjQzNTA0MTY5MDYxMTIwCiMgTUQ1IEZpbmdlcnByaW50OiAwYzpkMjpmOTplMDpkYToxNzo3MzplOTplZDo4Njo0ZDphNTplMzo3MDplNzo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGNhOmJkOjJhOjc5OmExOjA3OjZhOjMxOmYyOjFkOjI1OjM2OjM1OmNiOjAzOjlkOjQzOjI5OmE1OmU4CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5NjpiYzplYzowNjoyNjo0OTo3NjpmMzo3NDo2MDo3Nzo5YTpjZjoyODpjNTphNzpjZjplODphMzpjMDphYTplMToxYTo4ZjpmYzplZTowNTpjMDpiZDpkZjowODpjNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVJBSUlRejdEU1FPTlpSR1BndTJPQ2l3QXdEUVlKS29aSWh2Y05BUUVMQlFBdwpUekVMTUFrR0ExVUVCaE1DVlZNeEtUQW5CZ05WQkFvVElFbHVkR1Z5Ym1WMElGTmxZM1Z5YVhSNUlGSmxjMlZoCmNtTm9JRWR5YjNWd01SVXdFd1lEVlFRREV3eEpVMUpISUZKdmIzUWdXREV3SGhjTk1UVXdOakEwTVRFd05ETTQKV2hjTk16VXdOakEwTVRFd05ETTRXakJQTVFzd0NRWURWUVFHRXdKVlV6RXBNQ2NHQTFVRUNoTWdTVzUwWlhKdQpaWFFnVTJWamRYSnBkSGtnVW1WelpXRnlZMmdnUjNKdmRYQXhGVEFUQmdOVkJBTVRERWxUVWtjZ1VtOXZkQ0JZCk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUszb0pIUDBGRGZ6bTU0clZ5Z2MKaDc3Y3Q5ODRrSXh1UE9aWG9IajNkY0tpL3ZWcWJ2WUFUeWpiM21pR2JFU1R0ckZqL1JRU2E3OGYwdW94bXlGKwowVE04dWtqMTNYbmZzN2ovRXZFaG1rdkJpb1p4YVVwbVpteVBmanh3djYwcElnYno1TURtZ0s3aVM0KzNtWDZVCkE1L1RSNWQ4bVVnalUrZzRyazhLYjRNdTBVbFhqSUIwdHRvdjBEaU5ld053SVJ0MThqQTgrbyt1M2RwanErc1cKVDhLT0VVdCt6d3ZvLzdWM0x2U3llMHJnVEJJbERIQ05BeW1nNFZNazdCUFo3aG0vRUxOS2pEK0pvMkZSM3F5SApCNVQwWTNIc0x1SnZXNWlCNFlsY05IbHNkdTg3a0dKNTV0dWttaThteGRBUTRRN2UyUkNPRnZ1Mzk2ajN4K1VDCkI1aVBOZ2lWNStJM2xnMDJkWjc3RG5LeEhadThBL2xKQmRpQjNRVzBLdFpCNmF3QmRwVUtEOWpmMWIwU0h6VXYKS0JkczBwakJxQWxrZDI1SE43ck9yRmxlYUoxL2N0YUp4UVpCS1Q1WlB0MG05U1RKRWFkYW8weEFIMGFobWJXbgpPbEZ1aGp1ZWZYS25FZ1Y0V2UwK1VYZ1ZDd09QamRBdkJiSStlMG9jUzNNRkV2ekc2dUJRRTN4RGszU3p5blRuCmpoOEJDTkF3MUZ0eE5yUUh1c0V3TUZ4SXQ0STdtS1o5WUlxaW95bUN6THE5Z3dRYm9vTURRYUhXQmZFYndyYncKcUh5R08wYW9TQ3FJM0hhYWRyOGZhcVU5R1kvck9QTmszc2dyRFFvby8vZmI0aFZDMUNMUUoxM2hlZjRZNTNDSQpyVTdtMllzNnh0MG5VVzcvdkdUMU0wTlBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlI1dEZubWU3Ymw1QUZ6Z0FpSXlCcFk5dW1iYmpBTkJna3EKaGtpRzl3MEJBUXNGQUFPQ0FnRUFWUjlZcWJ5eXFGRFFETEhZR21rZ0p5a0lyR0YxWElwdStJTGxhUy9WOWxaTAp1Ymh6RUZuVElaZCs1MHh4KzdMU1lLMDVxQXZxRnlGV2hmRlFEbG5yenVCWjZickpGZStHblkrRWdQYms2WkdRCjNCZWJZaHRGOEdhVjBueHZ3dW83N3gvUHk5YXVKL0dwc01pdS9YMSttdm9pQk92LzJYL3FrU3Npc1JjT2ovS0sKTkZ0WTJQd0J5VlM1dUNiTWlvZ3ppVXd0aER5QzMrNldWd1c2TEx2M3hMZkhUanVDdmpISUluTnprdEhDZ0tRNQpPUkF6STRKTVBKK0dzbFdZSGI0cGhvd2ltNTdpYXp0WE9vSndUZHdKeDRuTENnZE5iT2hkanNudnpxdkh1N1VyClRrWFdTdEFtek9WeXlnaHFwWlhqRmFIM3BPM0pMRitsKy8rc0tBSXV2dGQ3dStOeGU1QVcwd2RlUmxOOE53ZEMKak5QRWxwelZtYlVxNEpVYWdFaXVURGtIenN4SHBGS1ZLN3E0KzYzU00xTjk1UjFOYmRXaHNjZENiK1pBSnpWYwpveWkzQjQzbmpUT1E1eU9mKzFDY2VXeEcxYlFWczVadWZwc01sanE0VWkwLzFsdmgrd2pDaFA0a3FLT0oycXhxCjRSZ3FzYWhEWVZ2VEg5dzdqWGJ5TGVpTmRkOFhNMnc5VS90N3kwRmYvOXlpMEdFNDRaYTRyRjJMTjlkMTFUUEEKbVJHdW5VSEJjbldFdmdKQlFsOW5KRWlVMFpzbnZnYy91YmhQZ1hSUjRYcTM3WjBqNHI3ZzFTZ0VFend4QTU3ZAplbXlQeGdjWXhuL2VSNDQvS0o0RUJzK2xWRFIzdmV5Sm0ra1hROTliMjEvK2poNVhvczFBblg1aUl0cmVHQ2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUZOTVQtUkNNIE9VPUFDIFJBSVogRk5NVC1SQ00KIyBTdWJqZWN0OiBPPUZOTVQtUkNNIE9VPUFDIFJBSVogRk5NVC1SQ00KIyBMYWJlbDogIkFDIFJBSVogRk5NVC1SQ00iCiMgU2VyaWFsOiA0ODU4NzYzMDgyMDY0NDg4MDQ3MDE1NTQ2ODI3NjA1NTQ3NTkKIyBNRDUgRmluZ2VycHJpbnQ6IGUyOjA5OjA0OmI0OmQzOmJkOmQxOmEwOjE0OmZkOjFhOmQyOjQ3OmM0OjU3OjFkCiMgU0hBMSBGaW5nZXJwcmludDogZWM6NTA6MzU6MDc6YjI6MTU6YzQ6OTU6NjI6MTk6ZTI6YTg6OWE6NWI6NDI6OTk6MmM6NGM6MmM6MjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOmM1OjU3OjBjOjI5OjAxOjhjOjRkOjY3OmIxOmFhOjEyOjdiOmFmOjEyOmY3OjAzOmI0OjYxOjFlOmJjOjE3OmI3OmRhOmI1OjU3OjM4Ojk0OjE3OjliOjkzOmZhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZ3pDQ0EydWdBd0lCQWdJUFhaT05NR2MyeUFZZEdzZFVoR2tITUEwR0NTcUdTSWIzRFFFQkN3VUFNRHN4CkN6QUpCZ05WQkFZVEFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkoKV2lCR1RrMVVMVkpEVFRBZUZ3MHdPREV3TWpreE5UVTVOVFphRncwek1EQXhNREV3TURBd01EQmFNRHN4Q3pBSgpCZ05WQkFZVEFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkpXaUJHClRrMVVMVkpEVFRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTHB4Z0hwTWhtNS8KeUJOdHdNWjlIQUNYanl3TUk3c1Fta0NwR3JlSGlQaWJWbXI3NW51T2k1S09weVZkV1JIYk5pNjNVUmNmcVFnZgpCQmNrV0tvM1NoamY1VG5VVi8zWHdTeVJBWkhpSXRRRHdGajhkMGZzano1MFE3cXNOSTFOT0habmpyREliekF6CldIRmN0UFZyYnRRQlVMZ1RmbXhLbzBuUklCbnV2TUFwR0dXbjN2N3YzUXFRSWVjYVo1SkNFSmhmVHpDOFBoeEYKdEJEWGFFQVV3RUQ2NTNjWGV1WUxqMlZiUE5tYVV0dTF2WjVHenozcmtRVUN3SmF5ZGt4TkVKWTdrdnFjZncrWgozNzRqTlVVZUFseit0YWlibVNYYVh2TWl3em4xNUNvdTA4WWZ4R3lxeFJ4cUFRVktMOUxGd2FnMEpsMW1wZElDCklma1l0d2IxVHBsdnFLdE1VZWpQVUJqRmQ4ZzVDU3hKa2pLWnFMc1hGM213V3NYbW84UlpaVWMxZzE2cDZEVUwKbWJ2a3pTREdtMG9HT2JWby9DSzY3bFdNSzA3cTg3SGovTGFabXRWQytuRk5DTStISG1weGZmblR0T21sY1lGNwp3azVIbHFYMmRvV2pLSS9wZ0c2QlU2VnRYN2hJK2NMNU5xWXVTZis0bHNLTUI3T2JpRmo4NnhzYzNpMXc0cGVTCk1LR0o0N3hWcUNmV1MrMlFyWXY2WXlWWkxhZzEzY3FYTTd6bHpjZWQwZXp2WGc1S2tBWW1ZNjI1MlRVdEI3cDIKWlN5c1Y0OTk5QWVVMTRFQ2xsMmpCMG5WZXRCWCtSdm5VMFoxcXJCNVFzdG9jUWpwWUwwNWFjNzByOE5XUU1ldApVcUlKNUcrR1I0b2Y2eWduWFlNZ3J3VEpiRmFhaTBiMUFnTUJBQUdqZ1lNd2dZQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUGQ5eGYzRTZKb2JkMlNuOVIyZ3pMK0gKWUpwdE1ENEdBMVVkSUFRM01EVXdNd1lFVlIwZ0FEQXJNQ2tHQ0NzR0FRVUZCd0lCRmgxb2RIUndPaTh2ZDNkMwpMbU5sY25RdVptNXRkQzVsY3k5a2NHTnpMekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBQjVCSzMvTWpUdkRECm5GRmxtNXdpb29vTWhmTnpLV3ROL2dIaXFReGpBYjhFWjZXZG1GLzlBUlA2N0pwaTZZYit0bUxTYmt5VSs4QjEKUlh4bERQaXlOOCtzRDgrTmIva1o5NC9zSHZKd252REt1TyszLzNZM2RsdjJib2p6cjJJeUlwTU5PbXFPRkdZTQpMVk4wVjJVZTFiTGRJNEU3cFdZakoyY0pqK0YzcWtQTlpWRUk3VkZZL3VZNStjdEhoS1FWOFhhN3BPNmtPOFJmCjc3SXpsaEVZdDhsbHZoamhvNlRjK2hqNTA3d1Rtemw2TkxyVFFmdjZNb29xdHl1R0MybURPTDdOaWk0TGNLMk4KSnBMdUh2VUJLd3JaMXBlYmJ1Q29HUnc2SVlzTUhrQ3RBK2ZkWm43MXVTQU5BK2lXK1lKRjFEbmdvQUJkMTVqbQpmWjVuYzhPYUt2ZXJpNkU2Rk84MHZGSU9pWmlhQkVDRUhYNUZhWk5YenV2TytGQjhUeHh1QkVPYitkWTdJeGpwCjZvN1JUVWFOOFR2a2FzcTYreU8zbS9xWkFTbGFXRm90NC9uVWJRNG1yY0Z1Tkx3eStBd0YrbVdqMnpzM2d5THAKMXR4eU0vMWQ4aUM5ZGp3ajJpajMrUnZyV1dUVjNGOXlmaUQ4elltMWtHZE5Zbm8vVHEwZHd6bitldlFvRnQ5Qgo5a2lBQmRjUFVYbXNFS3ZVN0FObTVtcXd1akdTUWtCcXZqclRjdUZxTjFXOHJCMlZ0MmxoOGtPUmRPYWcwd29rClJxRUlyOWJhUlJtVzFGTWRXNFI1OE1EM1IrK0xqOFVHcnAxTVlwMy9SZ1Q0MDhtMkVDVkFkZjRXcXNsS1lJWXYKdXU4d2QrUlU0cmlFbVZpQXFoT0xVVHBQU1BhTHRyTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDEgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAxIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAxIgojIFNlcmlhbDogMTQzMjY2OTc4OTE2NjU1ODU2ODc4MDM0NzEyMzE3MjMwMDU0NTM4MzY5OTk0CiMgTUQ1IEZpbmdlcnByaW50OiA0MzpjNjpiZjphZTplYzpmZTphZDoyZjoxODpjNjo4ODo2ODozMDpmYzpjODplNgojIFNIQTEgRmluZ2VycHJpbnQ6IDhkOmE3OmY5OjY1OmVjOjVlOmZjOjM3OjkxOjBmOjFjOjZlOjU5OmZkOmMxOmNjOjZhOjZlOmRlOjE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZTpjZDplNjo4ODo0ZjozZDo4NzpiMToxMjo1YjphMzoxYTpjMzpmYzpiMTozZDo3MDoxNjpkZTo3Zjo1NzpjYzo5MDo0ZjplMTpjYjo5NzpjNjphZTo5ODoxOTo2ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFFUQ0NBaW1nQXdJQkFnSVRCbXlmejVtL2pBbzU0dkI0aWtQbWxqWmJ5akFOQmdrcWhraUc5dzBCQVFzRgpBREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2CmIyNGdVbTl2ZENCRFFTQXhNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVE00TURFeE56QXdNREF3TUZvd09URUwKTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdgpiM1FnUTBFZ01UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxKNGdISEtlTlhqCmNhOUhnRkIwZlc3WTE0aDI5SmxvOTFnaFlQbDBoQUV2ckFJdGh0T2dRM3BPc3FUUU5yb0J2bzNiU01nSEZ6Wk0KOU82SUk4Yys2emYxdFJuNFNXaXczdGU1ZGpnZFlaNmsvb0kycGVWS1Z1UkY0Zm45dEJiNmROcWNtelU1TC9xdwpJRkFHYkhyUWdMS20rYS9zUnhtUFVEZ0gzS0tIT1ZqNHV0V3ArVWhuTUpidWxIaGViNG1qVWNBd2htYWhSV2E2ClZPdWp3NUg1U056LzBlZ3dMWDB0ZEhBMTE0Z2s5NTdFV1c2N2M0Y1g4akpHS0xoRCtyY2Rxc3EwOHA4a0RpMUwKOTNGY1htbi82cFVDeXppS3JsQTRiOXY3TFdJYnhjY2VWT0YzNEdmSUQ1eUhJOVkvUUNCL0lJREVnRXcrT3lRbQpqZ1N1YkpySXFnMENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFZWXdIUVlEVlIwT0JCWUVGSVFZeklVMDdMd01sSlF1Q0ZtY3g3SVFUZ29JTUEwR0NTcUdTSWIzRFFFQkN3VUEKQTRJQkFRQ1k4amRhUVpDaEdzVjJVU2dnTmlNT3J1WW91NnI0bEs1SXBEQi9HL3dralV1MHlLR1g5cmJ4ZW5ESQpVNVBNQ0Nqam1DWFBJNlQ1M2lIVGZJVUpyVTZhZFRyQ0MycUplSFpFUnhobGJJMUJqanQvbXN2MHRhZFExd1VzCk4rZ0RTNjNwWWFBQ2J2WHk4TVd5N1Z1MzNQcVVYSGVlRTZWL1VxMlY4dmlUTzk2TFhGdktXbEpiWUs4VTkwdnYKby91ZlFKVnRNVlQ4UXRQSFJoOGpyZGtQU0hDYTJYVjRjZEZ5UXpSMWJsZFp3Z0pjSm1BcHp5TVpGbzZJUTZYVQo1TXNJK3lNUlEraERLWEppb2FsZFhnalVrSzY0Mk00VXd0QlY4b2IyeEpORGQyWmh3TG5vUWRlWGVHQURia3B5CnJxWFJmYm9Rbm9ac0c0cTVXVFA0NjhTUXZ2RzUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDIgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAyIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAyIgojIFNlcmlhbDogMTQzMjY2OTgyODg1OTYzNTUxODE4MzQ5MTYwNjU4OTI1MDA2OTcwNjUzMjM5CiMgTUQ1IEZpbmdlcnByaW50OiBjODplNTo4ZDpjZTphODo0MjplMjo3YTpjMDoyYTo1Yzo3Yzo5ZToyNjpiZjo2NgojIFNIQTEgRmluZ2VycHJpbnQ6IDVhOjhjOmVmOjQ1OmQ3OmE2Ojk4OjU5Ojc2OjdhOjhjOjhiOjQ0Ojk2OmI1Ojc4OmNmOjQ3OjRiOjFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxYjphNTpiMjphYTo4Yzo2NTo0MDoxYTo4Mjo5NjowMToxODpmODowYjplYzo0Zjo2MjozMDo0ZDo4MzpjZTpjNDo3MTozYToxOTpjMzo5YzowMToxZTphNDo2ZDpiNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSVRCbXlmMHBZMWhwOEtEK1dHZVBoYkpydUtOekFOQmdrcWhraUc5dzBCQVF3RgpBREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2CmIyNGdVbTl2ZENCRFFTQXlNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUwKTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdgpiM1FnUTBFZ01qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUsyV255MmNTa3hLCmdYbFJtZXlLeTJ0Z1VSTzhUVzBHL0xBSWpkMFpFR3JISmd3MTJNQnZJSVRwbExHYmhRUERXOXRLNk1qNGtIYloKVzAvalRPZ0dOazNNbXF3OURKQXJrdFFHR1dDc04wUjVoWUdDclZvMzRBM01uYVpNVW5icVE1MjNCTkZROWxYZwoxZEttU1lYcE4rbktmcTVjbFUxSW1qK3VJRnB0aUpYWk5MaFNHa09Rc0w5c0JibTJlTGZxME9RNlBCSlRZdjlLCjhudStOUVdwRWpUajgyUjBZaXc5QUVsYUtQNHlSTHVIM1dVbkFuRTcya3IzSDlyTjl5RlZrRThQN0s2QzRaOXIKMlVYVHUvQmZoKzA4TERtRzJqL2U3SEpWNjNtanJkdmRmTEM2SE03ODNrODFkczhQK0hnZmFqWlJSaWRoVyttZQp6L0NpVlgxOEpZcHZMN1RGejRRdUsvME5VUkJzKzE4YnZCdCt4YTQ3bUFFeGt2OExWL1Nhc3JsWDZhdnZEWGJSCjhPNzB6b2FuNEc3cHRHbWgzMm4yTThacExwY1RucVdIc0ZjUWdUZkpVN083Zi9hUzBaelFHUFNTYnRxRFQ2WmoKbVV5bCsxN3ZJV1I2SUY5c1pJVVZ5emZwWWd3TEtoYmNBUzR5Mmo1TDlaNDY5aGRBbE8rZWtRaUcrcjVqcUZvego3TXQwUTVYNWJHbFNOc2NwYi94VkExd2YrNSs5Uit2blNVZVZDMDZKSWdsSjRQVmhIdkcvTG9weWJvQlovMWM2CitYVXlvMDVmN08wb1l0bE5jL0xNZ1JkZzdjM3IzTnVueXNWK0FyM3lWQWhVL2JRdENTd1hWRXFZMFZUaFVXY0kKMHUxdWZtOC8waTJCV1NsbXk1QTVsUkVlZENmKzNldXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlN3RFBCTU1QUUZXQUpJL1RQbFVxOUxoT05tClVqQU5CZ2txaGtpRzl3MEJBUXdGQUFPQ0FnRUFxcWlBanc1NG8rQ2kxTTNtOVpoNk8rb0FBN0NYRHBPOFdxajIKTEl4eWg2bXgvSDl6L1dOeGVLV0hXYzh3NFEwUXNoTmFiWUwxYXVhQW42QUZDMmprUjJ2SGF0KzIvWGN5Y3VVWQorZ24wb0pNc1hkS01kWVYyWlpBTUEzbTNNU05qclhpRENZWm9oTXIvK2M4bW1wSjU1ODFMeGVkaHB4Zkw4NmtTCms1TnJwK2d2VTVMRVlGaXd6QUpSR0Z1RmpXSlpZN2F0dE42YSt5YjNBQ2ZBWFZVM2RKbkpVSC9qV1M1RTR5d2wKN3V4TU1uZTBueHJwUzEwZ3hkcjlISWNXeGtQbzFMc21ta1Z3WHFrTE4xUGlSbnNuL2VCRzhvbTN6RUsyeXlnbQpidG1seVRySVFSTmc5MUNNRmE2eWJSb1ZHbGQ0NXBJcTJXV1FnajlzQXErdUVqb25sallFMXgyaWdHT3BtL0hsCnVyUjhGTEJPeWJFZmRGODQ5bEhxbS9vc29oSFVxUzBuR2tXeHI3Sk9jUTNBV0ViV2FRYkxVOHV6L210QnpVRisKZlV3UGZISjVlbG5OWGtvT3JKdXBtSE41ZkxUMHpMbTRCd3l5ZEZ5NHgyK0lvWkNuOUtyNXYyYzY5Qm9WWWg2MwpuNzQ5c1Ntdlo2RVM4bGdRR1ZNRE1CdTRHb24ybkwyWEE0NmpDZk1kaXlIeHROL2tITkdmWlFJRzZseldFN09FCjc2S2xYSXgzS2Fkb3dHdXVRTktvdE9yTjhJMUxPSndabWhzb1ZMaUprTy9LZFlFK0h2SmtKTWNZcjA3L1I1NEgKOWpWbHBOTUtWdi8xRjJSczc2Z2lKVW1UdHQ4QUY5cFlmbDN1eFJ1dzBkRmZJUkRIK2ZPNkFnb25COFh4MXNmVAo0UHNKWUd3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMyBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDMgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDMiCiMgU2VyaWFsOiAxNDMyNjY5ODY2OTkwOTA3NjYyOTQ3MDA2MzUzODEyMzA5MzQ3ODg2NjU5MzAKIyBNRDUgRmluZ2VycHJpbnQ6IGEwOmQ0OmVmOjBiOmY3OmI1OmQ4OjQ5Ojk1OjJhOmVjOmY1OmM0OmZjOjgxOjg3CiMgU0hBMSBGaW5nZXJwcmludDogMGQ6NDQ6ZGQ6OGM6M2M6OGM6MWE6MWE6NTg6NzU6NjQ6ODE6ZTk6MGY6MmU6MmE6ZmY6YjM6ZDI6NmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE4OmNlOjZjOmZlOjdiOmYxOjRlOjYwOmIyOmUzOjQ3OmI4OmRmOmU4OjY4OmNiOjMxOmQwOjJlOmJiOjNhOmRhOjI3OjE1OjY5OmY1OjAzOjQzOmI0OjZkOmIzOmE0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCdGpDQ0FWdWdBd0lCQWdJVEJteWYxWFNYTm1ZL093dWEyZWllZGdQeVNqQUtCZ2dxaGtqT1BRUURBakE1Ck1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGcKVW05dmRDQkRRU0F6TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrRwpBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnClEwRWdNekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCQ21YcDhaQmY4QU5tK2dCRzFiRzhsS2wKdWkyeUV1alNMdGY2eWNYWXFtMGZjNEU3TzVock9Yd3pwY1ZPaG82QUYyaGlSVmQ5UkZnZHN6Zmxad2pyWnQ2agpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlNyCnR0dlhCcDQzckRDR0I1Rnd4NXpFR2JGNHdEQUtCZ2dxaGtqT1BRUURBZ05KQURCR0FpRUE0SVdTb3hlM2pma3IKQnFXVHJCcVlhR0Z5K3VHaDBQc2NlR0NtUTVuRnVNUUNJUUNjQXUveGxKeXpsdm5yeGlyNHRpeitPcEFVRnRlTQpZeVJJSE44d2ZkVm9Pdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSA0IE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgNCBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgNCIKIyBTZXJpYWw6IDE0MzI2Njk4OTc1ODA4MDc2Mzk3NDEwNTIwMDYzMDc2Mzg3Nzg0OTI4NDg3OAojIE1ENSBGaW5nZXJwcmludDogODk6YmM6Mjc6ZDU6ZWI6MTc6OGQ6MDY6NmE6Njk6ZDU6ZmQ6ODk6NDc6YjQ6Y2QKIyBTSEExIEZpbmdlcnByaW50OiBmNjoxMDo4NDowNzpkNjpmODpiYjo2Nzo5ODowYzpjMjplMjo0NDpjMjplYjphZToxYzplZjo2MzpiZQojIFNIQTI1NiBGaW5nZXJwcmludDogZTM6NWQ6Mjg6NDE6OWU6ZDA6MjA6MjU6Y2Y6YTY6OTA6Mzg6Y2Q6NjI6Mzk6NjI6NDU6OGQ6YTU6YzY6OTU6ZmI6ZGU6YTM6YzI6MmI6MGI6ZmI6MjU6ODk6NzA6OTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI4akNDQVhpZ0F3SUJBZ0lUQm15ZjE4RzdFRXdwUStWeGUzc3N5QnJCRGpBS0JnZ3Foa2pPUFFRREF6QTUKTVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0ZwpVbTl2ZENCRFFTQTBNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHCkExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWcKUTBFZ05EQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk5LcmlqZFBvMU1OL3NHS2UwdW9lMFpMWTdCaQo5aTBiMndoeElkSUE2R085bWlmNzhEbHVYZW85cGNtQnFxTmJJSmhGWFJiYi9lZ1FiZU9jNE9POVg0Umk4M0JrCk02RExKQzl3dW9paEtxQjErSUd1WWdiRWdkczViaW13SHZvdVhLTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9CQllFRk5Qc3h6cGxic3poMm5hYVZ2dWM4NFp0VitXQgpNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNRHFMSWZHOWZoR3QwTzlZbGkvVzY1MStrSTByejJaVnd5empLS2x3CkNrY084RGRaRXY4dG1aUW9UaXBQTlUweldnSXhBT3AxQUU0N3hEcVVFcEhKV0VhZElSTnlwNGljaXVSTVN0dVcKMUt5TGEydEpFbE16cmRma3ZpVDh0UXAyMUtXOEVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUx1eFRydXN0IEdsb2JhbCBSb290IDIgTz1MdXhUcnVzdCBTLkEuCiMgU3ViamVjdDogQ049THV4VHJ1c3QgR2xvYmFsIFJvb3QgMiBPPUx1eFRydXN0IFMuQS4KIyBMYWJlbDogIkx1eFRydXN0IEdsb2JhbCBSb290IDIiCiMgU2VyaWFsOiA1OTkxNDMzODIyNTczNDE0NzEyMzk0MTA1ODM3Njc4ODExMDMwNTgyMjQ4OTUyMQojIE1ENSBGaW5nZXJwcmludDogYjI6ZTE6MDk6MDA6NjE6YWY6Zjc6ZjE6OTE6NmY6YzQ6YWQ6OGQ6NWU6M2I6N2MKIyBTSEExIEZpbmdlcnByaW50OiAxZTowZTo1NjoxOTowYTpkMTo4YjoyNTo5ODpiMjowNDo0NDpmZjo2Njo4YTowNDoxNzo5OTo1ZjozZgojIFNIQTI1NiBGaW5nZXJwcmludDogNTQ6NDU6NWY6NzE6Mjk6YzI6MGI6MTQ6NDc6YzQ6MTg6Zjk6OTc6MTY6OGY6MjQ6YzU6OGY6YzU6MDI6M2I6ZjU6ZGE6NWI6ZTI6ZWI6NmU6MWQ6ZDg6OTA6MmU6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ3ekNDQTZ1Z0F3SUJBZ0lVQ242bTMwdEVudHBxSklXZTVyZ1YweFovdTdFd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1JqRUxNQWtHQTFVRUJoTUNURlV4RmpBVUJnTlZCQW9NRFV4MWVGUnlkWE4wSUZNdVFTNHhIekFkQmdOVgpCQU1NRmt4MWVGUnlkWE4wSUVkc2IySmhiQ0JTYjI5MElESXdIaGNOTVRVd016QTFNVE15TVRVM1doY05NelV3Ck16QTFNVE15TVRVM1dqQkdNUXN3Q1FZRFZRUUdFd0pNVlRFV01CUUdBMVVFQ2d3TlRIVjRWSEoxYzNRZ1V5NUIKTGpFZk1CMEdBMVVFQXd3V1RIVjRWSEoxYzNRZ1IyeHZZbUZzSUZKdmIzUWdNakNDQWlJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmVGbDc4Um1PbndZb05NUElmNVUybzNDL0lQUElmT2I5d21LYjNGCmlickpnejMzN3NwYnhtMUpjN1RKUnFNYk5CTS93WWxGVi9UWnNmczJaVXY3Q09KSWNSSElianVlbmQrSlpUZW0KaGZZN1JCaTJ4amN3WWtTU2wybDlRakFrNUEwTWlXdGozc1hoMzA2cEZHeFQ0R0hPOWhjdkhUeTk1aUpNSFpQMQpFTVNoZHV4cTNzVnMzNWEwVmtCQ3dHS1NNS0V0RlpTZzBpQUdDVzVxYmVYcnQ3N1U4UEVWZkl2bVRyb1R6RXNuClhwazhGMTJQZ1g4elBVL1RQeHZzWEQvd1BFeDFidkttMVozYUxRZGpBc1p5NlpTOFRFbVZUNGhTeU52b2FZTDQKekRSYkl2Q0dwNG05U0FwdFpvRnR5TWhrK3dIaDlPSGUyWjdkMjF2VUtwa21GUnNlVEpJcGdwN1Zrb0dTUVhBWgo5NlRsazB1OGQyY3gzUno5TVhBTkY1a00rUXc1R1NvWHRUQnhWZFVQcmxqaFBTODBtOCtmOW5pRndwTjZjajVtCmo1d1dFV0NQbm9sdlo3N2dSMW83REpwbmk4OUd4cTQ0by9LbnZPYldoV3N6SkhBaVM4c0ltN3ZJK0FJcEhiNGcKREVhL2E0ZWJzeXBtUWpWR2JLcTZyZm1ZZStsUVZSUXh2N0hhTGUyQXJXZ2srMm1yMkhFVE1PWm5zNGRBL1lsKwo4a1BSRWQ4dlpTOWt6bDhVdWJHL01iMkhlRnBaWllpcS9Ga3lTSWJXVExrcFM1WFRkdk4zSlcxQ0hEaURUZjJqClg1dC9MYXg1R3c1Q01aZGpwUHVLYWRVaURUU1FNQzZvdE9CdHRwU3N2SXRPMTNEOHhUaU9aQ1hoVFRtUXpzbUgKaEZoeEFnTUJBQUdqZ2Fnd2dhVXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QkNCZ05WSFNBRU96QTVNRGNHQnl1QgpLd0VCQVFvd0xEQXFCZ2dyQmdFRkJRY0NBUlllYUhSMGNITTZMeTl5WlhCdmMybDBiM0o1TG14MWVIUnlkWE4wCkxteDFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQWZCZ05WSFNNRUdEQVdnQlQvR0NoMitVZ0ZMS0d1OFNzYks3SlQKK0V0OHN6QWRCZ05WSFE0RUZnUVUveGdvZHZsSUJTeWhydkVyR3l1eVUvaExmTE13RFFZSktvWklodmNOQVFFTApCUUFEZ2dJQkFHb1pGTzF1ZWNFc2g5UU5jSDdYOW5qSkN3Uk94TEhPazNEK3NGVEFNczJaTUdRWHZ3L2w0alA5CkJ6WkFjZzRhdG1wWjFnRGxhQ0RkTG5JTkgycGtNU0NFZlVtbVdqZnJSY21GOWRUSEY1a0g1cHRWNUF6b3FiVE8KakZ1MUVWelBpZzROMXF4M2dmNHluQ1NlY3M1VTg5QnZvbGJXN01NM0xHVll2bGNBR3ZJMSt1dDdNVjNDd1JJOQpsb0dJbG9uQldWeDY1bjl3Tk9lRDRySGg0YmhZNzlTVjVHQ2M4SmFYY296cmhBSXVaWStrdDlKL1o5M0kwNTVjCnFxbWtvQ1VVQnB2c1QzNHRDMzhkZGZFejJPM091SFZ0UGx1NW1CMHhEVmJZUXc4d2tiSUVhOTFXdnBXQVZXZSsKMk0yRDJSanVMZytHTFpLZWNCUHMzbEhKUTNnQ3BVM0krVi9Fa1ZoR0ZuZGFkS3BBdkFlZk1MbXg5eElYM2VQLwpKRUFkZW1yUlR4Z0txcEFkNjBBZTM2RWVSSklRbXZLTjRkRkxScDdvUlVLWDZrV1o4K3htMVFMNjhxWktKS3JlCnpybksrVCtUYi9tanV1cWxQcG10L2Y5N21mVmw3dkJaS0dmWGtKV2tFNFNwaE1Ib3pzNTFrMk1hdkR6cTFXUWYKTFNvU09jYkRXakx0UjVFV0RydzR3VkRlajhvcWtEUWM3a0dVbkY0Wkx2aEZTWmwwa2JBRWIrTUVXckdyS3F2Kwp4OUNXdHRyaFNtUUdibUJOdlVKTy8zamFKTW9idE5lV09XeXU4UTZxcDMxSWl5Qk16MlRXdUpkR3NFN1JLbFk2Cm9KTzlyNEFrNEFwKzU4clZ5dWlGVmR3Mkt1R1VhSlBIWm5KRUQ0QWhNbXdseHlPQWd3cnIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSBPPVR1cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmFzdGlybWEgS3VydW11IC0gVFVCSVRBSyBPVT1LYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00KIyBTdWJqZWN0OiBDTj1UVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEgTz1UdXJraXllIEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsgT1U9S2FtdSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkgLSBLYW11IFNNCiMgTGFiZWw6ICJUVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBkYzowMDo4MTpkYzo2OToyZjozZToyZjpiMDozYjpmNjozZDo1YTo5MTo4ZTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IDMxOjQzOjY0OjliOmVjOmNlOjI3OmVjOmVkOjNhOjNmOjBiOjhmOjBkOmU0OmU4OjkxOmRkOmVlOmNhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NjplZDpjMzo2ODo5MDo0NjpkNTozYTo0NTozZjpiMzoxMDo0YTpiODowZDpjYTplYzo2NTo4YjoyNjo2MDplYToxNjoyOTpkZDo3ZTo4Njo3OTo5MDo2NDo4NzoxNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVl6Q0NBMHVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IwakVMTUFrR0ExVUVCaE1DVkZJeApHREFXQmdOVkJBY1REMGRsWW5wbElDMGdTMjlqWVdWc2FURkNNRUFHQTFVRUNoTTVWSFZ5YTJsNVpTQkNhV3hwCmJYTmxiQ0IyWlNCVVpXdHViMnh2YW1scklFRnlZWE4wYVhKdFlTQkxkWEoxYlhVZ0xTQlVWVUpKVkVGTE1TMHcKS3dZRFZRUUxFeVJMWVcxMUlGTmxjblJwWm1scllYTjViMjRnVFdWeWEyVjZhU0F0SUV0aGJYVWdVMDB4TmpBMApCZ05WQkFNVExWUlZRa2xVUVVzZ1MyRnRkU0JUVFNCVFUwd2dTMjlySUZObGNuUnBabWxyWVhOcElDMGdVM1Z5CmRXMGdNVEFlRncweE16RXhNalV3T0RJMU5UVmFGdzAwTXpFd01qVXdPREkxTlRWYU1JSFNNUXN3Q1FZRFZRUUcKRXdKVVVqRVlNQllHQTFVRUJ4TVBSMlZpZW1VZ0xTQkxiMk5oWld4cE1VSXdRQVlEVlFRS0V6bFVkWEpyYVhsbApJRUpwYkdsdGMyVnNJSFpsSUZSbGEyNXZiRzlxYVdzZ1FYSmhjM1JwY20xaElFdDFjblZ0ZFNBdElGUlZRa2xVClFVc3hMVEFyQmdOVkJBc1RKRXRoYlhVZ1UyVnlkR2xtYVd0aGMzbHZiaUJOWlhKclpYcHBJQzBnUzJGdGRTQlQKVFRFMk1EUUdBMVVFQXhNdFZGVkNTVlJCU3lCTFlXMTFJRk5OSUZOVFRDQkxiMnNnVTJWeWRHbG1hV3RoYzJrZwpMU0JUZFhKMWJTQXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXIzVXdNNnE3CmE5T1pMQkkzaE5tTmU1ZUEwMjduLzV0UWxUNlFsVlpDMXhsOEpvU05rdm9CSFRvUDRtUTR0NHk4NklqNWl5U3IKTHFQMU4rUkFqaGdsZVlOMUh6di9iS2pGeGxiNHRPMktSS09yYkV6OEhkRGM3Mmk5eitTcXp2QlY5NkkwMUlOcgpOM3djd3Y2MUEreFh6cnkwdGNYdEFBOVROeXBOOUU4TWcvdUd6OHYrakU2OWgvbW5peUZYbkhyZkEyZUpMSjJYCllhY1F1RldRZnc0dEp6aDAzK2Y5Mms0UzQwMFZJZ0xJNE9EOEQ2MksxOGxVVU13N0Q4b1dnSVRRVVZiRGpsWi8KaVNJekwrYUZDcjJscUJzMjN0UGNMRzA3eHhPOVdTTXM1dVdrOTlnTDdlcVFRRVNvbGJ1VDFkQ0FOTFpHZUE0ZgpBSk5HNGU3cCtleFBGd0lEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVWlQvSGlvYkdQTjA4VkZ3MStEcnRVZ3hIClY4Z3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnRUJBQ28vNGZFeWpxN2htRnhMWHM5ckhtb0owaUtwRXNkZVYzMXpWbVNBaEhxVDVBbTVFTTJmS2lmaApBSGUrU01nMXFJR2Y1TGdzeVg4T3NOSkxOMTNxdWRVTFhqUzk5SE1wdyswbUZaeCtDRk9LV0kzUVN5amZ3YlBmCklQUDU0K002Mzh5Y2xOaE9UOE5yRjdmM2N1aXRaak8xSlZPcjRQaE1xWjM5OGcyNnJyblpxc1pyK1pPN3JxdTQKbHp3REdycER4cGE1UlhJNHM2ZWhsajJSZTM3QUlWTk1oKzN5QzFTVlVaUFZJcVVOaXZHVERqNVVEckRZeVU3Ywo4akV5VnVwaytlcTFuUlptUW5MemY5T3hNVVA4cEk0WDhXMGpxNVJtK0szN0R3aHVKaTEvRndjSnNvejdVTUNmCmxvM1B0djBBblZvVW1yOENSUFhCd3A4aVhxSVBvZU09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HRENBIFRydXN0QVVUSCBSNSBST09UIE89R1VBTkcgRE9ORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkgQ08uLExURC4KIyBTdWJqZWN0OiBDTj1HRENBIFRydXN0QVVUSCBSNSBST09UIE89R1VBTkcgRE9ORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkgQ08uLExURC4KIyBMYWJlbDogIkdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QiCiMgU2VyaWFsOiA5MDA5ODk5NjUwNzQwMTIwMTg2CiMgTUQ1IEZpbmdlcnByaW50OiA2MzpjYzpkOTozZDozNDozNTo1Yzo2Zjo1MzphMzplMjowODo3MDo0ODoxZjpiNAojIFNIQTEgRmluZ2VycHJpbnQ6IDBmOjM2OjM4OjViOjgxOjFhOjI1OmMzOjliOjMxOjRlOjgzOmNhOmU5OjM0OjY2OjcwOmNjOjc0OmI0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjpmZjo4ZjpkMDo0NDozMzo0ODo3ZDo2YTo4YTphNjowYzoxYToyOTo3Njo3YTo5ZjpjMjpiYjpiMDo1ZTo0MjowZjo3MTozYToxMzpiOTo5Mjo4OToxZDozODo5MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmlEQ0NBM0NnQXdJQkFnSUlmUW1YL3ZCSDZub3dEUVlKS29aSWh2Y05BUUVMQlFBd1lqRUxNQWtHQTFVRQpCaE1DUTA0eE1qQXdCZ05WQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaCklFTlBMaXhNVkVRdU1SOHdIUVlEVlFRRERCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUI0WERURTAKTVRFeU5qQTFNVE14TlZvWERUUXdNVEl6TVRFMU5UazFPVm93WWpFTE1Ba0dBMVVFQmhNQ1EwNHhNakF3QmdOVgpCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUlpJRU5QTGl4TVZFUXVNUjh3CkhRWURWUVFEREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEyYU1XOE1oMGRIZWI3ek1OT3daK1ZmeTFZSTkyaGhKQ2ZWWm1Qb2lDN1hKagpEcDZMM1RRc0FsRlJ3eG45V1ZTRXlmRnJzMHl3NmVoR1hUakdvcWN1RVZlNmdoV2luSTl0c0psS0N2THJpWEJqClRubkV0MXU5b2wyeDhrRUNLNjJwT3FQc2VRcnNYenJqL2UrQVBLMDBteHFyaUNaN1ZxS0NoaC9yTlltRGYxK3UKS1U0OXRtN3Nyc0h3SjV1dTQvVHM3NjUvOTRZOWNucnJwZnRaVHFmcmxZd2lPWG5oTFFpUHpMeVJ1RUgzRk1FagpxY090bWtWRXM3TFhMTTNHS2VKUUVLNWN5NEtPRnhnMmZaZm1pSnF3VFRRSjlDeTVXbVlxc0JlYm5oNTJuVXBtCk1VSGZQL3ZGQnU4YnRuNGFSamIzWkdNNzR6a1lJK2RuZFJUVmRWZVNONzIrYWhzbVVQSTJKZ2FReFhBQlpHMTIKWnVHUjIyNEh3R0dBTHJJdUw0eHdwOUU3UExPUjVHNjJ4RHR3OG15U2x3bk5SMzBZd1BPN25nL1dpNjRIdGxvUAp6Z3NNUjZmbFByaTlmY2ViTmFCaGx6cEJkUmZNSzVaM0twSWhIdG1WZGlCbmFNOE52ZC9XSHdscW11TE1jM0drCkwzMFNnTGRUTUVaZVMxU1pEMmZKcGNqeUlNR0M3SjBSMzhJQyt4bzcwZTBnbXU5bFpKSVFEU3JpM25EeEdHZUMKakdIZXVMelJMNXo3RDlBcjdSdDJ1ZVE1VmZqNG9SMjRxb0FBVElMbnNuOEp1THd3b0M4TjlWS2VqdmVTc3dvQQpIUUJVbHdiZ3NRZlp4dzljWlgwOGJWbFg1TzJsamVsQVU1OFZTNkJ4OWhvaDQ5cHdCaUZZRkllRmQzbXFnbmtDCkF3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZPTEpRSjlOenVpYW9YelBEajlseFNtSWFobFJNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUURSU1ZmZwpwOHhvV0xvQkR5c1p6WTJ3WVVXc0VlMWpVR240SDMrK0ZvLzluZXNMcWpKSGR0Sm5KTzI5ZkRNeWx5ckhCWVptCkRSZDlGQlViMU92OUg1cjJYcGRwdHhvbHBBcXprVDlmTnF5TDdGZW9QdWVCaWhoWE9ZVjBHa0xINlZzVFg0LzUKQ09tU2RJMzFSOUtyTzliN2VHWk9ObjM1NlpMcEJONzlTV1A4YmZzVWNaTm5MMGRLdDduL0hpcHpjRVl3djFyeQpMM21sNFkwTTJmbXlZemVNTjJXRmNHcGNXd2x5dWExalBMSGQrUHd5dnplRzVMdU9tQ2QrdWg4VzRYQVI4Z1BmCkpXSXlKeVlZTW9TZi93QTZFN3FhVGZSUHVCUndJckhLSzVET0tjRnc5QytkZi9LUUh0WmEzN2RHL09hRytzdmcKSUhaNnVxYkw5WHplWXFXeGkrN2VnbWFLVGpvd0h6K0F5NjBudWd4ZTE5Q3hWc3AzY2JLMWRhRlFxVUJERjhJbwoyYzlTaTF2SVk5UkNQcUF6ZWtZdTl3b2dSbFIrYWs4eDhZRitRblE0WlhNbjdzWjh1STdYcFRyWG1LR2NqQkJWCjA5dEw3RUNROHMxdVY5SmlEbnhYazdHbmJjMmRnN3NxNStXMk8zRllyZjNSUmJ4YWtlNVRGVy9UUlFsMWJycVEKWFI0RXp6ZmZIcWhtc1l6bUlHcnYvRWhPZEpoQ3J5bHZMbXJIKzMzUlpqRWl6SVlBZm1hRERFTDB2VFNTd3hycQpUOHArY2swTGNJeW1TTHVtb1JUMisxaEVtUlN1cWd1VGFhQXBKVXFseXl2ZGltWUhGbmdWVjNFYjdQVkhoUE9lCk1UZDYxWDhrcmVTOC9mM01ib1BvREtpM1FXd0gzYjA4aHBjdjBnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIFJvb3RDZXJ0IENBLTEiCiMgU2VyaWFsOiAxNTc1MjQ0NDA5NTgxMTAwNjQ4OQojIE1ENSBGaW5nZXJwcmludDogNmU6ODU6ZjE6ZGM6MWE6MDA6ZDM6MjI6ZDU6YjI6YjI6YWM6NmI6Mzc6MDU6NDUKIyBTSEExIEZpbmdlcnByaW50OiBmZjpiZDpjZDplNzo4MjpjODo0Mzo1ZTozYzo2ZjoyNjo4Njo1YzpjYTphODozYTo0NTo1YjpjMzowYQojIFNIQTI1NiBGaW5nZXJwcmludDogZDQ6MGU6OWM6ODY6Y2Q6OGY6ZTQ6Njg6YzE6Nzc6Njk6NTk6ZjQ6OWU6YTc6NzQ6ZmE6NTQ6ODY6ODQ6YjY6YzQ6MDY6ZjM6OTA6OTI6NjE6ZjQ6ZGM6ZTI6NTc6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lKQU5xYjdISHpBN0FaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdrTVFzd0NRWUQKVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWdRMmwwZVRFawpNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRFZRUUxEQjVVCmNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTU1GbFJ5ZFhOMFEyOXkKSUZKdmIzUkRaWEowSUVOQkxURXdIaGNOTVRZd01qQTBNVEl6TWpFMldoY05Namt4TWpNeE1UY3lNekUyV2pDQgpwREVMTUFrR0ExVUVCaE1DVUVFeER6QU5CZ05WQkFnTUJsQmhibUZ0WVRFVU1CSUdBMVVFQnd3TFVHRnVZVzFoCklFTnBkSGt4SkRBaUJnTlZCQW9NRzFSeWRYTjBRMjl5SUZONWMzUmxiWE1nVXk0Z1pHVWdVaTVNTGpFbk1DVUcKQTFVRUN3d2VWSEoxYzNSRGIzSWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TVI4d0hRWURWUVFEREJaVQpjblZ6ZEVOdmNpQlNiMjkwUTJWeWRDQkRRUzB4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCCkNnS0NBUUVBdjQ2M2xlTENKaEpyTXhuSFFGZ0txMW1xalFDai9JREhVSHVPMUNBbXVqSVMyQ05VU1NVUUlwaWQKUnRMQnlaNU9HeTRzRGpqekdpVm9IS1phQmVZZWkwaS9tSlowUG1uSzZiVjRwUWE4MVFCZUNRcnlKM3BTL0MzVgpzZXEwaVdFazh4b1QyNm5QVXUwTUpMcTVudXgrQUhUNms2MXNLWkt1VWJTNzAxZS9zL09valp6MEpFc3ExcG1lCjlKNyt3SDVDT3VjTGxWUGF0MmdPa0V6N2NEK1BTaXlVOHliZFkybXBsTmdRVHNWSENKQ1pHeGROdVd4dTcyQ1YKRVk0aGdMVzlvSFBZMExKM3hFWHFXaWI3Wm5aMitBWWZZVzBQVmNXRHR4QldjZ1lIcGZPeEdnTUZaQTZkV29yVwpobkFiSk43K0tJb3IwR3F3L0hxaTNMSjVEb3RsRHdJREFRQUJvMk13WVRBZEJnTlZIUTRFRmdRVTdtdEpQSG8vCkRlT3hDYmVLeUtzWm4zTXpVT2N3SHdZRFZSMGpCQmd3Rm9BVTdtdEpQSG8vRGVPeENiZUt5S3NabjNNelVPY3cKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQUNVWTFKR1BFKzZQSGgwUlU5b3RSQ2tab0I1ck1aNU5EcDZ0UFZ4QmI1VXJKS0Y1bURvNE52dTdacDVJCi81Q1E3ejNVdUp1MGgzVS9JSnZPY3MraFZjRk5aS0laQnFFSE13d0xLZVh4NnF1ajdMVUtkSkRIZlhMeTExeWYKa2UrUmk3ZmM3V2FpejQ1bU83eWZPZ0xnSjkwV21NQ1YxQXFrNUlHYWRaUTFuSkJmaURjR3JWbVZDckRSWjlNWgp5b25uTWxvMkhENkNxRnFUdnNiUVpKRzJ6OW0yR00vYmZ0SmxvNmJFamhjeHdmdCtkdHZUaGVOWXNuZDZkanRzCkwxQWM1OXYyWjNrZjlZS1ZtZ2VuRksrUDNDZ2had25TMWsxYUhCa2NqbmRjdzVRa1BUSnJTMzdVZUpTRHZqZE4KemwvSEhrNDg0SWt6bFFzUHBUTFdQRnA1TEJrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0yIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiIKIyBTZXJpYWw6IDI3MTE2OTQ1MTAxOTkxMDE2OTgKIyBNRDUgRmluZ2VycHJpbnQ6IGEyOmUxOmY4OjE4OjBiOmJhOjQ1OmQ1OmM3OjQxOjJhOmJiOjM3OjUyOjQ1OjY0CiMgU0hBMSBGaW5nZXJwcmludDogYjg6YmU6NmQ6Y2I6NTY6ZjE6NTU6Yjk6NjM6ZDQ6MTI6Y2E6NGU6MDY6MzQ6Yzc6OTQ6YjI6MWM6YzAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA3OjUzOmU5OjQwOjM3OjhjOjFiOmQ1OmUzOjgzOjZlOjM5OjVkOmFlOmE1OmNiOjgzOjllOjUwOjQ2OmYxOmJkOjBlOmFlOjE5OjUxOmNmOjEwOmZlOmM3OmM5OjY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHTHpDQ0JCZWdBd0lCQWdJSUphSGZ5alBMV1FJd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2FReEN6QUpCZ05WCkJBWVRBbEJCTVE4d0RRWURWUVFJREFaUVlXNWhiV0V4RkRBU0JnTlZCQWNNQzFCaGJtRnRZU0JEYVhSNU1TUXcKSWdZRFZRUUtEQnRVY25WemRFTnZjaUJUZVhOMFpXMXpJRk11SUdSbElGSXVUQzR4SnpBbEJnTlZCQXNNSGxSeQpkWE4wUTI5eUlFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVmTUIwR0ExVUVBd3dXVkhKMWMzUkRiM0lnClVtOXZkRU5sY25RZ1EwRXRNakFlRncweE5qQXlNRFF4TWpNeU1qTmFGdzB6TkRFeU16RXhOekkyTXpsYU1JR2sKTVFzd0NRWURWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZwpRMmwwZVRFa01DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEClZRUUxEQjVVY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEh6QWRCZ05WQkFNTUZsUnkKZFhOMFEyOXlJRkp2YjNSRFpYSjBJRU5CTFRJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFDbklHN0NLcUppSkpXUWRzZzRmb0RTcThHYlpRV1U5TUVLRU5VQ3JPMmZrOGVIeUxBbkswSU1QUW8rClFWcWVkZDJOeXVDYjdHZ3lwR21TYUl3TGdRNVdvRDRhM1N3bEZJSXZsOU5rUnZSVXFkdzZWQzB4SzVtQzh0a3EKMSs5eEFMZ3hwTDU2SkFmRFFpRHlpdFNTQkJ0bFZreHMxUHUyWVZwSEk3VFlhYlMzT3RCMFBBeDFvWXhPZHFIcAoyeXFsTy9yT3NQOSthaWo5Snh6SXNla3A4VmR1WkxUUXdSVnREcjR1RGtiSVh2UlIvdThPWXpvN2NiclBiMW5LCkRPT2JYVW00VE9KWHNaaUtRbGVjZHUvdnZkRm9xTkwwQ2J0M05iNGxnZ2pFRml4RUlGYXBSQkYzNzEyMEhhcGUKYXo2TE12WUhMMWNFa3NyMS9wM0M2ZWl6amt4TEFqSFo1RHhJZ2lmM0dJSjJTRHB4c1JPaE9kVXV4VFRDSFdLRgozd1ArVGZTdlBkOWNXNDM2Y09HbGZpZkhoaTVxanhMR2hGNURVVkNjR1p0NDV2ejI3VWQrZXoxbTd4TVRpRjg4Cm9XUDcrYXlITlovemdwNmtQd3FjTVdtTG1hU0lTbzV1WmszdkZzUVBlU2doWUEyRkZuM1hWRGp4a2xiOXRUTk0KZzl6WEVKOUwvY2I0UXIyNmZITUM0UDk5elZ2aDFLeGhlMWZWU250YjFJVllKMTIvK0N0Z3JLQW1yaFFoSjhaMwptak9BUEY1R1AvZkRzYU9HTThib1hnMjVOU3lxUnNHRkFuV0FvT3NrK3hXcTVHZC9ibmMvOUFTS0wzeDc0eGRoCjhOMEpxU0RJdmdtazBINUV3N0l3U2ppcXFld1ltZ2VDSzl1NG5CaXQydUJHRjZ6UFhRSURBUUFCbzJNd1lUQWQKQmdOVkhRNEVGZ1FVMmY0aFFHNlVucnliUFp4OW1DQVo1WXd3WXJJd0h3WURWUjBqQkJnd0ZvQVUyZjRoUUc2VQpucnliUFp4OW1DQVo1WXd3WXJJd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3CkRRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFKNUZuZ3c3dHUvaE9zaDgwUUE5eitMcUJyV3lPcnNHUzJoNjBDT1gKZEtjczhBalllVnJYV29TSzJCS2FHOWw5WEUxd3hhWDVxK1dqaVluZEFmcnMzZm5wa3BmYnNFWkM4OU5pcXBYKwpNV2NVYVZpUUNxb0w3amNqeDFCUnRQVitudU43OStUTVFqSXRTUXpMLzBrTW14NDAvVzV1bG9wNUE3WnYyd25MCi9WOWxGRGZoT1BYellSWlk1TFZ0RFFzRUd6OVFMWCt6eDNvYUZvQmcrSW9mNlJzcXh2bTZBUnBwdjlKWXgxUlgKQ0kvaE9XQjNTNnhaaEJxSThkM0xUM2pYNStFekxmenVRZm9nc0w3TDl6aVV3T0hRaFErNzdTeHpxKzMra25ZYQpaSDliRFRNSkJ6TjdCajhScEZ4d1BJWEF6K09RcUlOMyt0dm14WXhvWnhCbnBWSXQ4TVNaajMrLzBXdml0VWZXCjJkQ0ZtVTJVbXc5TGplNEFXa2NkRVFPc1FSaXZoN2R2RERxUHlzL2NBOEdpQ2NqbC9ZQmV5R0JDQVJzYVUxcTcKTjZhM3ZMcUU2UjVzR3RSazJ0UkQvcE9MUy9Jc2VSWVExSk1MaUkraDJJWVVScEZIbXlnazcxZFNUbHhDbktyMwpTZXduNkVBZXM2YUpJbktjOVEwenRGaWpNRHZkMUdwVWs3NGFUZk9UbFBmOGhBcy9oQ0JjTkFORXhkcXR2QXJCCkFzOGU1WlRaODQ1YjJFenduZXhoRjdzVU1sUU1BaW1USHBLRzluL3Y1NUlGRGxuZG1RZ3VMdnFjQUZMVHhXWXAKNUtlWFJLUU9LSUVUTmNYMmIyVG1RY1RWTDh3MFJTWFBRUUNXUFVvdXdwYVlUMDVLbkplMzJ4K1NNc2ovRDFGdQoxdXdKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBFQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBFQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIEVDQS0xIgojIFNlcmlhbDogOTU0ODI0Mjk0Njk4ODYyNTk4NAojIE1ENSBGaW5nZXJwcmludDogMjc6OTI6MjM6MWQ6MGE6ZjU6NDA6N2M6ZTk6ZTY6NmI6OWQ6ZDg6ZjU6ZTc6NmMKIyBTSEExIEZpbmdlcnByaW50OiA1ODpkMTpkZjo5NTo5NTo2Nzo2Yjo2MzpjMDpmMDo1YjoxYzoxNzo0ZDo4Yjo4NDowYjpjODo3ODpiZAojIFNIQTI1NiBGaW5nZXJwcmludDogNWE6ODg6NWQ6YjE6OWM6MDE6ZDk6MTI6YzU6NzU6OTM6ODg6OTM6OGM6YWY6YmI6ZGY6MDM6MWE6YjI6ZDQ6OGU6OTE6ZWU6MTU6NTg6OWI6NDI6OTc6MWQ6MDM6OWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVJRENDQXdpZ0F3SUJBZ0lKQUlTQ0xGOGNZdEJBTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdjTVFzd0NRWUQKVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWdRMmwwZVRFawpNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRFZRUUxEQjVVCmNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hGekFWQmdOVkJBTU1EbFJ5ZFhOMFEyOXkKSUVWRFFTMHhNQjRYRFRFMk1ESXdOREV5TXpJek0xb1hEVEk1TVRJek1URTNNamd3TjFvd2dad3hDekFKQmdOVgpCQVlUQWxCQk1ROHdEUVlEVlFRSURBWlFZVzVoYldFeEZEQVNCZ05WQkFjTUMxQmhibUZ0WVNCRGFYUjVNU1F3CklnWURWUVFLREJ0VWNuVnpkRU52Y2lCVGVYTjBaVzF6SUZNdUlHUmxJRkl1VEM0eEp6QWxCZ05WQkFzTUhsUnkKZFhOMFEyOXlJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRFWE1CVUdBMVVFQXd3T1ZISjFjM1JEYjNJZwpSVU5CTFRFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURQaitBUnRaK29kbmJiCjN3OVU3M05qS1lLdFI4YWphKzMrWHpQNFExSHBHak9STVJlZ2RNVFVwd0htc3BJK2FwM3REdmwwbUVEVFB3T0EKQm9KQTZMSGlwMUduSFlNbWE2dmUraGVSSzlqR3JCNnhuaGtCMVplbTZnMjN4RlVmSjN6U0NOVjJIeWtWaDBBNQozVGhGRVhYUW1xYzA0TC9OeUZJZHVVZCtEYmk3eGd6MmMxY1dXbjVEa1I5Vk9zWnRSQVNxbkttY3AweUpGNE91Cm93UmVVb0NMSGhJbEVSblhESDE5TVVSQjZ0dXZzQnp2Z2RBc3hab2htejN0UWp0UUp2THN6bkZoQm1JaFZFNS8Kd1owK2Z5Q01nTXNxMkpkaXlJTXprWDJ3b2xvUFYrZzd6UElsc3RSOEwreE54cUU2RlhybnRsMDE5ZlpJU2paRgpadFM2bUZqQkFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCUkVua2oxekcxSTFLQkxmLzVaSkMrRGw1bWFoakFmCkJnTlZIU01FR0RBV2dCUkVua2oxekcxSTFLQkxmLzVaSkMrRGw1bWFoakFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQlQ0MVhCVndtOG5IYzJGdgpjaXZVd28veVExMEN6c1NVdVpRUmcyZGQ0bWRzZFhhL3V3eXFOc2F0UjVOajNCNSsxdDR1L3VrWk1qZ0RmeFQyCkFITXNXYkVoQnVIN3JCaVZES1AvbVpiM0t5ZWIxU1RNSGQzQk91Q1lSTERFNUQ1M3NYT3BaQ3oySEFGOFAxMUYKaGNDRjV5V1BsZHdYOHp5ZkdtNnd5dU1kS3VsTVkvb2tZV0xXMm42MkhHejFBaDNVS3QxVmtPc3FFVWM4TGw1MApzb0lpcFgxVEgwWHNKNUY5NXlJVzZNQm9OdGpHOFUrQVJETDU0ZEhSSGFyZXFLdWNCSyt0SUE1a21FMmxhOEJJCldKWnBUZHdIakZHVG90K2ZEejJMWUxTQ2phb0lUbUpGNFBrTDB1RGdQRnZlWEhFbkpjTG1BNEdMRUZQangxV2kKdEovWDVnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIgojIFNlcmlhbDogODg3NTY0MDI5NjU1ODMxMDA0MQojIE1ENSBGaW5nZXJwcmludDogODY6Njk6MTI6YzA6NzA6ZjE6ZWM6YWM6YWM6YzI6ZDU6YmM6YTU6NWI6YTE6MjkKIyBTSEExIEZpbmdlcnByaW50OiBiNzphYjozMzowODpkMTplYTo0NDo3NzpiYToxNDo4MDoxMjo1YTo2ZjpiZDphOTozNjo0OTowYzpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogODU6NjY6NmE6NTY6MmU6ZTA6YmU6NWM6ZTk6MjU6YzE6ZDg6ODk6MGE6NmY6NzY6YTg6N2U6YzE6NmQ6NGQ6N2Q6NWY6Mjk6ZWE6NzQ6MTk6Y2Y6MjA6MTI6M2I6NjkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYzVENDQThXZ0F3SUJBZ0lJZXl5YjB4YUFNcGt3RFFZSktvWklodmNOQVFFTEJRQXdmREVMTUFrR0ExVUUKQmhNQ1ZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRSwpEQTlUVTB3Z1EyOXljRzl5WVhScGIyNHhNVEF2QmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCU1UwRXdIaGNOTVRZd01qRXlNVGN6T1RNNVdoY05OREV3TWpFeU1UY3oKT1RNNVdqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodgpkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk1MbU52CmJTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRkpUUVRDQ0FpSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQVBrUDNhTXJmY3ZRS3Y3c1o0V201eTRidW5maDQvV3ZwT3o2U2wyUgp4RmRIYXhoM2EzYnkvWlBrUFEvQ0ZwNExac05XbEo0WGc0WE9WdS95RnYwQVl2VWlDVlRvWlJkT1FibmdUMGFYCnFodkl1RzVpWG1teFg5c3FBbjc4Yk1yelFkanQwT2o4UDJGSTdiQURGQjBRRGtzWjRMdE83SVpsL3pielhtY0MKQzUyR1ZXSDllamp0L3VJWkFMZHZvVkJpZFhROG9QcklKWkswYm5vaXgvZ2VvZU95M1pFeHF5c2RCUCtsU2dRMwo2WVdrTXl2OTR0WlZOSHdacEVwb3g3S28wN2ZLb1pPSTY4R1h2SXo1SGRraWhDUjB4d1E5YXFrcGs4enJ1RnZoCi9sOGxxalJZeU1FalZKMGJtQkhET0p4K1BZWnNwUTlBaG53QzlGd0NUeWpMcm5HZkR6cklNLzRSSlRYcS9MckYKWUQzWmZCalZzcW5UZFhnRGNpTEtPc01mN3l6bExxbjZuaXkyVVViOXJ3UFc2bUJvNm9VV05tdUY2UjdBczkzRQpKTnlBS29GQmJaUSt5T0RKZ1VFQW5sNi9mOFVJbUtJWUxFSkFzL2x2T0NkTFRvRDBQWUZINEloODZoek90WFZjClVTNGNLMzhhY2lqbkFMWFJkTWJYNUordEI1TzJVelUxL0Rma3cvWmRGcjRoYzk2U0N2aWdZMnE4bHBKcVB2aTgKWlZXYjN2VU5pU1lFL0NVYXBpVnB5OEp0eW56aVdWK1hyT3Z2THNpODF4dFpQQ3ZNOGhuSWsyc25ZeG5QL09rbQorTXB4bTMrVC9qUm5oRTZaNi95emVBa3pjTHBtcG5idEczUHJHcVVOeENJVElKUldDazRzYkU2eC9jK2NDYnFpCk0rMkhBZ01CQUFHall6QmhNQjBHQTFVZERnUVdCQlRkQkFrSG92VjZmVkpURXBLVjdqaUFKUTJtV1RBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGTjBFQ1FlaTlYcDlVbE1Ta3BYdU9JQWxEYVpaTUE0RwpBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUlCZ1JsQ243SnAwY0hoNXdZZkdWCmNwTnhKSzFvazFpT01xOGJzM0FEL0NVcmRJV1FQWGhxOUxtTHBaYzd0UmlSdXg2bitVQmJrZmxWbWE4ZUVkQmMKSGFkbTQ3R1VCd3d5T2FicUc3QjUyQjJjY0VUaml0M0UrWlVmaWpoRFB3R0ZwVWVuUFVheXZPVWlhUGQ3bk5ncwpQZ29oeUMwenJML0ZnWmt4ZE1GMWNjVytzZkFqUmZTZGEvd1pZNTJqdkFUR0dBc2x1MU9KRDdPQVVONUY3a1IvCnE1UjRaSmpUOWlqZGg5aHdaWFQ3RHJrVDY2Y1BZYWt5bHN6ZXUrMWpUQmk3cVVEM29GUnVJSWh4ZFJqcWVyUTAKY3VBakozZGN0cERxaGlWQXErOHpEOHVmZ3I2aUlQdjJ0UzBhNXNLRnNYUVArOGhsQXFSU0FVZmRTU0xCdjlqcgphNngrM3V4ak14VzNJd2lQeGcrTlFWcmRqc1c1aitWRlAzamJ1dEliUUxIK2NVMC80SUdpdWw2MDdCWGdrOTBJCkgzN2hWWmtMSWQ2VG5ncjc1cU5KdlRZdy91ZDNzcUIxbDdVdGdZZ1haU0QzMnBBQW44bFN6RExLTlh6MVBRL1kKSzlmMUptekpCalNXRnVwd1dSb3llWGtMdG9oL0QxSklQYjlzMktKRUx0Rk90M0pZMDRrVGxmNUVxL2pYaXh0dQpuTHdzb0Z2VmFnQ3ZYemZoMWZvUUM1aWNodWNtajg3dzdHNktWd3VBNDA2eXdLQmpZWkM2VldnM2RHcTJrdHVmCm9ZWWl0bVVuRHV5Mm4wSmc1R2ZDdGRwQkM4VFRpMkVidlBvZmtTdlhSQWRldWltczJjWHA3MU5JV3V1QThTaFkKSWMyd0JsWDdKejlUa0hDcEJCNVhKN2s9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyIKIyBTZXJpYWw6IDg0OTU3MjM4MTMyOTcyMTY0MjQKIyBNRDUgRmluZ2VycHJpbnQ6IDJlOmRhOmU0OjM5OjdmOjljOjhmOjM3OmQxOjcwOjlmOjI2OjE3OjUxOjNhOjhlCiMgU0hBMSBGaW5nZXJwcmludDogYzM6MTk6N2M6Mzk6MjQ6ZTY6NTQ6YWY6MWI6YzQ6YWI6MjA6OTU6N2E6ZTI6YzM6MGU6MTM6MDI6NmEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDM0OjE3OmJiOjA2OmNjOjYwOjA3OmRhOjFiOjk2OjFjOjkyOjBiOjhhOmI0OmNlOjNmOmFkOjgyOjBlOjRhOmEzOjBiOjlhOmNiOmM0OmE3OjRlOmJkOmNlOmJjOjY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDalRDQ0FoU2dBd0lCQWdJSWRlYmZ5OEZvVzZnd0NnWUlLb1pJemowRUF3SXdmREVMTUFrR0ExVUVCaE1DClZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVQKVTB3Z1EyOXljRzl5WVhScGIyNHhNVEF2QmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwWTJGMAphVzl1SUVGMWRHaHZjbWwwZVNCRlEwTXdIaGNOTVRZd01qRXlNVGd4TkRBeldoY05OREV3TWpFeU1UZ3hOREF6CldqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodmRYTjAKYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk1MbU52YlNCUwpiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRVZEUXpCMk1CQUdCeXFHU000OUFnRUdCU3VCCkJBQWlBMklBQkVWdXFWREVwaU0ybmw4b2pSZkxsaUprUDl4NmpoM01DTE9pY1NTNmprbTVCQnRIbGxpckxaWEkKN1o0SU5jZ242NG1NVTFqcllvcis4RnNQYXpGU1kwRTdpYzNzN0xhTkdkTTBCOXk3eGdaL3drV1Y3TXQvcUNQZwpDZW1CK3ZOSDA2TmpNR0V3SFFZRFZSME9CQllFRklMUmhYTXc1elVFMDQ0Q2t2dmxwTkhFSWVqTk1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVZ3RHRmN6RG5OUVRUamdLUysrV2swY1FoNk0wd0RnWUQKVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HL242MWtScEdEUFliQ1dlKzBGK1M4VAprZHp0NWZ4UWF4RkdSck1jSVFCaXU3N0Q1K2pOQjVuNURRdGRjajdFcWdJd0g3eTZDK0l3SlB0OGJZQlZDcGsrCmdBMHo1V2FqczZPN3BkV0xqd2tzcGwxKzR2QUhDR2h0MG54cGJsL2Y1V3BsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiIKIyBTZXJpYWw6IDYyNDgyMjc0OTQzNTI5NDMzNTAKIyBNRDUgRmluZ2VycHJpbnQ6IGUxOjFlOjMxOjU4OjFhOmFlOjU0OjUzOjAyOmY2OjE3OjZhOjExOjdiOjRkOjk1CiMgU0hBMSBGaW5nZXJwcmludDogNzQ6M2E6ZjA6NTI6OWI6ZDA6MzI6YTA6ZjQ6NGE6ODM6Y2Q6ZDQ6YmE6YTk6N2I6N2M6MmU6YzQ6OWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJlOjdiOmYxOjZjOmMyOjI0Ojg1OmE3OmJiOmUyOmFhOjg2Ojk2Ojc1OjA3OjYxOmIwOmFlOjM5OmJlOjNiOjJmOmU5OmQwOmNjOjZkOjRlOmY3OjM0OjkxOjQyOjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGNnpDQ0E5T2dBd0lCQWdJSVZyWXB6VFM4ZVBZd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z1lJeEN6QUpCZ05WCkJBWVRBbFZUTVE0d0RBWURWUVFJREFWVVpYaGhjekVRTUE0R0ExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUUKQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVRjd05RWURWUVFEREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeQpkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnVWxOQklGSXlNQjRYRFRFM01EVXpNVEU0TVRRek4xb1hEVFF5Ck1EVXpNREU0TVRRek4xb3dnWUl4Q3pBSkJnTlZCQVlUQWxWVE1RNHdEQVlEVlFRSURBVlVaWGhoY3pFUU1BNEcKQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRUNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1UY3dOUVlEVlFRRApEQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5Ck1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBanpabFFPSFdUY0RYdE9sRzJtdnEKTTBmTlRQbDlmYjY5TFQzdzIzamhocVhadWdsWGFPMVhQcURRQ0VHRDV5aEJKQi9qY2hYUUFScjdYbkFqc3N1ZgpPZVBQeFU3R2ttMG14bnU3czlvbm5RcUc2WUUzQmY3d2NYSHN3eHpwWTZJWEZKM3ZHMmZUaFZVQ0F0Wkp5Y3hhCjRiSDNiektmeWRRN2lFR29uTDNMcTl0dGV3a2Zva3h5a05vckNQelBQRlRPWncrb3oxMldHUXZFNDNMcnJkRjkKSFNmdmt1c1F2MXZyTzYvUGdOM0IwcFlFVzNwK3BLazhPSGFrWW82Z09WN3FkODlkQUZtUFppdytCNktqQlNZUgphWmZxaGJjUGxndEx5RURoVUxvdWlzdjNENW9pNTMrYU54UE44azBUYXlIUndNd2k4cUZHOWtScG5NcGhOUWNBCmI5WmhDQkhxdXJqMjZiTmc1VTI1N0o4VVpzbFhXTnZOaDJuNGlvWVNBMGUvWmhOMnJIZDlOQ1NGZzgzWHFweVEKR3A4aExIOTR0MlM0Mk9pbTlIaXpWY3VFMGpMRWVLNmpqMkhkemdoVHJleUkvQlhrbWczbW54cDN6a3lQdUJRVgpQV0tjaGpnR0FHWVM1RmwyV2xQQUFwaWlFQ3RvUkh1T2VjNHpTbmFxVzRFV0c3V0syTkFBZTE1aXRBbldobU1PCnBnV1ZTYm9vaTRpVHNqUWMyS1JWYnJjYzBONlpWVHNqOUNMZytTbG1KdXdnVUhmYlNndVB2dVVDWUhCQlh0U3UKVURraUZDYkxzanR6ZEZWSEIzbUJPYWd3RTBUbEJJcXVsaE1sUWcrNVU4U2IvTTNrSE40OCtxdldCa29mWjZhWQpNQnpkTE52Y0dKVlhac2IvWEl0VzlYY0NBd0VBQWFOak1HRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWZCZ05WCkhTTUVHREFXZ0JUNVlMdlU0OVUwOXJqMUJvQWxwM1BiUm1tb25qQWRCZ05WSFE0RUZnUVUrV0M3MU9QVk5QYTQKOVFhQUphZHoyMFpwcUo0d0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCVwpzNDdMQ3AxSmpyK2t4Skc3WmhjRlVaaDErK1ZRTEhxZThSVDZxOU9LUHYrUktZOWppOWkwcVZRQkRiNlRoaS81ClNtM0hYdlZYK2NwVkhCSytSdzgyeGQ5cXQ5dDF3a2NsZjdueFkvaG9MVlVFMGZLTnNLVFB2RHhlSDNqbnBhQWcKY0xBRXhiZjNjcWZlSWcyOU15VkdqR1NTSnVNK0xtT1cycHVNUGZnWUNkY0R6SDJHZ3VES0JBZFJVTmYva3RVTQo3OXFHbjVuWDY3ZXZhT0k1SnBTNmFMZS9nOVBxZW1jOVltZXVKZVZ5Nk9MazdLNFM5a3NyUEovcHNFRHpPRlN6Ci9iZG95TnJHajFFOHN2dVIzQnpubTUzaHR3MXlqK0treEtsNCtlc1VyTVpEQmNKbE9TZ1lBc09Dc3AwRnZtWHQKbGw5bGREejdDVFV1ZTV3VC9Sc1BYY2R0Z1RwV0Q4dzc0YThDTHlLc1JzcEdQS0FjVE5aRXRGNHVYQlZtQ2VFbQpLZjdHVW1HNnNYUC93d3ljNVd4cWxEOFV5a0FXbFlUeldhbXNYMHhoazIzUk84eWlsUXdpcG1kblJDNjUyZEtLClFiTm1DMXI3ZlNPbDhocXcvOTZiZzVRdTBUL2ZrcmVScndVN1pjZWdiTEhOWWhMRGtCdmpKYzQwdkc5M2RyRVEKdy9jRkdzRFdyM1JpU0JkM2ttbVFZUnplbFlCMFZJOFlITVB6QTlDL3BFTjFobE1ZZWdvdUNSdzJuNUg5Z29vaQpTOUVPVUNYZHl3TU1GOG1EQUFoT05VMktpKzN3QXBSbUxFUi95NVVubGhldENUQ3N0bkVYYm9zWDlod0oxQzA3Cm1LVngwMVFUMldEejlVdG1UL3J4N2lBU2piU3NWN0ZGWTZHc2RxbkMrdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyIKIyBTZXJpYWw6IDMxODIyNDY1MjY3NTQ1NTUyODUKIyBNRDUgRmluZ2VycHJpbnQ6IDU5OjUzOjIyOjY1OjgzOjQyOjAxOjU0OmMwOmNlOjQyOmI5OjVhOjdjOmYyOjkwCiMgU0hBMSBGaW5nZXJwcmludDogNGM6ZGQ6NTE6YTM6ZDE6ZjU6MjA6MzI6MTQ6YjA6YzY6YzU6MzI6MjM6MDM6OTE6Yzc6NDY6NDI6NmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDIyOmEyOmMxOmY3OmJkOmVkOjcwOjRjOmMxOmU3OjAxOmI1OmY0OjA4OmMzOjEwOjg4OjBmOmU5OjU2OmI1OmRlOjJhOjRhOjQ0OmY5OjljOjg3OjNhOjI1OmE3OmM4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDbERDQ0FocWdBd0lCQWdJSUxDbWNXeGJ0QlpVd0NnWUlLb1pJemowRUF3SXdmekVMTUFrR0ExVUVCaE1DClZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVQKVTB3Z1EyOXljRzl5WVhScGIyNHhOREF5QmdOVkJBTU1LMU5UVEM1amIyMGdSVllnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXdNakV5TVRneE5USXpXaGNOTkRFd01qRXlNVGd4Ck5USXpXakIvTVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHYKZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRTBNRElHQTFVRUF3d3JVMU5NTG1OdgpiU0JGVmlCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5CkFnRUdCU3VCQkFBaUEySUFCS29TUjVDWUcvdnZ3MEFIZ3lCTzhUQ0NvZ2JSOHBLR1lmTDJJV2pLQU1USDZrTUEKVkliYy9SL2ZBTGhCWWx6Y2NCWXkzaCtaMU16RkI4Z0lIMkVXQjFFOWZWd0hVK00xT0l6ZnpaL1pMZzFLdGhrdQpXbkJhQnUyKzhLR3d5dEFKS2FOak1HRXdIUVlEVlIwT0JCWUVGRnZLWHVYZTBvR3F6YWd0WkZHMjJYS2JsK1pQCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVXOHBlNWQ3U2dhck5xQzFrVWJiWmNwdVgKNWs4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNQ0EyZ0FNR1VDTVFDSzVrQ0pOK3ZwMVJQWgp5dFJySlBPd1BZZEdXQnJzc2Q5disxYTZjR3ZIT016b3NZeFBEL2Z4WjNZT2c5QWVVWThDTUQzMkl5Z21UTVpnCmg1TW1tN0kxSHJyVzl6elJITTc2SlR5bUdvRVZXL01TRDJ6dVpZckpoNmo1QitCaW1veGNTZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KUEsDBBQAAAAAAAAAIQCCsqLP0QEAANEBAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jZXJ0cy5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmNlcnRzCn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSByZXR1cm5zIHRoZSBwcmVmZXJyZWQgZGVmYXVsdCBDQSBjZXJ0aWZpY2F0ZSBidW5kbGUuIFRoZXJlIGlzCm9ubHkgb25lIOKAlCB0aGUgb25lIGZyb20gdGhlIGNlcnRpZmkgcGFja2FnZS4KCklmIHlvdSBhcmUgcGFja2FnaW5nIFJlcXVlc3RzLCBlLmcuLCBmb3IgYSBMaW51eCBkaXN0cmlidXRpb24gb3IgYSBtYW5hZ2VkCmVudmlyb25tZW50LCB5b3UgY2FuIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiB3aGVyZSgpIHRvIHJldHVybiBhIHNlcGFyYXRlbHkKcGFja2FnZWQgQ0EgYnVuZGxlLgoiIiIKZnJvbSBwaXAuX3ZlbmRvci5jZXJ0aWZpIGltcG9ydCB3aGVyZQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHByaW50KHdoZXJlKCkpClBLAwQUAAAAAAAAACEAd8lhTVoGAABaBgAAOwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29tcGF0LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5jb21wYXQKfn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBoYW5kbGVzIGltcG9ydCBjb21wYXRpYmlsaXR5IGlzc3VlcyBiZXR3ZWVuIFB5dGhvbiAyIGFuZApQeXRob24gMy4KIiIiCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBjaGFyZGV0CgppbXBvcnQgc3lzCgojIC0tLS0tLS0KIyBQeXRob25zCiMgLS0tLS0tLQoKIyBTeW50YXggc3VnYXIuCl92ZXIgPSBzeXMudmVyc2lvbl9pbmZvCgojOiBQeXRob24gMi54Pwppc19weTIgPSAoX3ZlclswXSA9PSAyKQoKIzogUHl0aG9uIDMueD8KaXNfcHkzID0gKF92ZXJbMF0gPT0gMykKCiMgdHJ5OgojICAgICBpbXBvcnQgc2ltcGxlanNvbiBhcyBqc29uCiMgZXhjZXB0IEltcG9ydEVycm9yOgppbXBvcnQganNvbgoKIyAtLS0tLS0tLS0KIyBTcGVjaWZpY3MKIyAtLS0tLS0tLS0KCmlmIGlzX3B5MjoKICAgIGZyb20gdXJsbGliIGltcG9ydCAoCiAgICAgICAgcXVvdGUsIHVucXVvdGUsIHF1b3RlX3BsdXMsIHVucXVvdGVfcGx1cywgdXJsZW5jb2RlLCBnZXRwcm94aWVzLAogICAgICAgIHByb3h5X2J5cGFzcywgcHJveHlfYnlwYXNzX2Vudmlyb25tZW50LCBnZXRwcm94aWVzX2Vudmlyb25tZW50KQogICAgZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJscGFyc2UsIHVybHVucGFyc2UsIHVybGpvaW4sIHVybHNwbGl0LCB1cmxkZWZyYWcKICAgIGZyb20gdXJsbGliMiBpbXBvcnQgcGFyc2VfaHR0cF9saXN0CiAgICBpbXBvcnQgY29va2llbGliCiAgICBmcm9tIENvb2tpZSBpbXBvcnQgTW9yc2VsCiAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwoKICAgIGZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5wYWNrYWdlcy5vcmRlcmVkX2RpY3QgaW1wb3J0IE9yZGVyZWREaWN0CgogICAgYnVpbHRpbl9zdHIgPSBzdHIKICAgIGJ5dGVzID0gc3RyCiAgICBzdHIgPSB1bmljb2RlCiAgICBiYXNlc3RyaW5nID0gYmFzZXN0cmluZwogICAgbnVtZXJpY190eXBlcyA9IChpbnQsIGxvbmcsIGZsb2F0KQogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCgplbGlmIGlzX3B5MzoKICAgIGZyb20gdXJsbGliLnBhcnNlIGltcG9ydCB1cmxwYXJzZSwgdXJsdW5wYXJzZSwgdXJsam9pbiwgdXJsc3BsaXQsIHVybGVuY29kZSwgcXVvdGUsIHVucXVvdGUsIHF1b3RlX3BsdXMsIHVucXVvdGVfcGx1cywgdXJsZGVmcmFnCiAgICBmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCBwYXJzZV9odHRwX2xpc3QsIGdldHByb3hpZXMsIHByb3h5X2J5cGFzcywgcHJveHlfYnlwYXNzX2Vudmlyb25tZW50LCBnZXRwcm94aWVzX2Vudmlyb25tZW50CiAgICBmcm9tIGh0dHAgaW1wb3J0IGNvb2tpZWphciBhcyBjb29raWVsaWIKICAgIGZyb20gaHR0cC5jb29raWVzIGltcG9ydCBNb3JzZWwKICAgIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAoKICAgIGJ1aWx0aW5fc3RyID0gc3RyCiAgICBzdHIgPSBzdHIKICAgIGJ5dGVzID0gYnl0ZXMKICAgIGJhc2VzdHJpbmcgPSAoc3RyLCBieXRlcykKICAgIG51bWVyaWNfdHlwZXMgPSAoaW50LCBmbG9hdCkKICAgIGludGVnZXJfdHlwZXMgPSAoaW50LCkKUEsDBBQAAAAAAAAAIQATQ8kzIEcAACBHAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jb29raWVzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5jb29raWVzCn5+fn5+fn5+fn5+fn5+fn4KCkNvbXBhdGliaWxpdHkgY29kZSB0byBiZSBhYmxlIHRvIHVzZSBgY29va2llbGliLkNvb2tpZUphcmAgd2l0aCByZXF1ZXN0cy4KCnJlcXVlc3RzLnV0aWxzIGltcG9ydHMgZnJvbSBoZXJlLCBzbyBiZSBjYXJlZnVsIHdpdGggaW1wb3J0cy4KIiIiCgppbXBvcnQgY29weQppbXBvcnQgdGltZQppbXBvcnQgY2FsZW5kYXIKaW1wb3J0IGNvbGxlY3Rpb25zCgpmcm9tIC5faW50ZXJuYWxfdXRpbHMgaW1wb3J0IHRvX25hdGl2ZV9zdHJpbmcKZnJvbSAuY29tcGF0IGltcG9ydCBjb29raWVsaWIsIHVybHBhcnNlLCB1cmx1bnBhcnNlLCBNb3JzZWwKCnRyeToKICAgIGltcG9ydCB0aHJlYWRpbmcKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyB0aHJlYWRpbmcKCgpjbGFzcyBNb2NrUmVxdWVzdChvYmplY3QpOgogICAgIiIiV3JhcHMgYSBgcmVxdWVzdHMuUmVxdWVzdGAgdG8gbWltaWMgYSBgdXJsbGliMi5SZXF1ZXN0YC4KCiAgICBUaGUgY29kZSBpbiBgY29va2llbGliLkNvb2tpZUphcmAgZXhwZWN0cyB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBjb3JyZWN0bHkKICAgIG1hbmFnZSBjb29raWUgcG9saWNpZXMsIGkuZS4sIGRldGVybWluZSB3aGV0aGVyIGEgY29va2llIGNhbiBiZSBzZXQsIGdpdmVuIHRoZQogICAgZG9tYWlucyBvZiB0aGUgcmVxdWVzdCBhbmQgdGhlIGNvb2tpZS4KCiAgICBUaGUgb3JpZ2luYWwgcmVxdWVzdCBvYmplY3QgaXMgcmVhZC1vbmx5LiBUaGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBjb2xsZWN0aW5nCiAgICB0aGUgbmV3IGhlYWRlcnMgdmlhIGBnZXRfbmV3X2hlYWRlcnMoKWAgYW5kIGludGVycHJldGluZyB0aGVtIGFwcHJvcHJpYXRlbHkuIFlvdQogICAgcHJvYmFibHkgd2FudCBgZ2V0X2Nvb2tpZV9oZWFkZXJgLCBkZWZpbmVkIGJlbG93LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVlc3QpOgogICAgICAgIHNlbGYuX3IgPSByZXF1ZXN0CiAgICAgICAgc2VsZi5fbmV3X2hlYWRlcnMgPSB7fQogICAgICAgIHNlbGYudHlwZSA9IHVybHBhcnNlKHNlbGYuX3IudXJsKS5zY2hlbWUKCiAgICBkZWYgZ2V0X3R5cGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZQoKICAgIGRlZiBnZXRfaG9zdChzZWxmKToKICAgICAgICByZXR1cm4gdXJscGFyc2Uoc2VsZi5fci51cmwpLm5ldGxvYwoKICAgIGRlZiBnZXRfb3JpZ2luX3JlcV9ob3N0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmdldF9ob3N0KCkKCiAgICBkZWYgZ2V0X2Z1bGxfdXJsKHNlbGYpOgogICAgICAgICMgT25seSByZXR1cm4gdGhlIHJlc3BvbnNlJ3MgVVJMIGlmIHRoZSB1c2VyIGhhZG4ndCBzZXQgdGhlIEhvc3QKICAgICAgICAjIGhlYWRlcgogICAgICAgIGlmIG5vdCBzZWxmLl9yLmhlYWRlcnMuZ2V0KCdIb3N0Jyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yLnVybAogICAgICAgICMgSWYgdGhleSBkaWQgc2V0IGl0LCByZXRyaWV2ZSBpdCBhbmQgcmVjb25zdHJ1Y3QgdGhlIGV4cGVjdGVkIGRvbWFpbgogICAgICAgIGhvc3QgPSB0b19uYXRpdmVfc3RyaW5nKHNlbGYuX3IuaGVhZGVyc1snSG9zdCddLCBlbmNvZGluZz0ndXRmLTgnKQogICAgICAgIHBhcnNlZCA9IHVybHBhcnNlKHNlbGYuX3IudXJsKQogICAgICAgICMgUmVjb25zdHJ1Y3QgdGhlIFVSTCBhcyB3ZSBleHBlY3QgaXQKICAgICAgICByZXR1cm4gdXJsdW5wYXJzZShbCiAgICAgICAgICAgIHBhcnNlZC5zY2hlbWUsIGhvc3QsIHBhcnNlZC5wYXRoLCBwYXJzZWQucGFyYW1zLCBwYXJzZWQucXVlcnksCiAgICAgICAgICAgIHBhcnNlZC5mcmFnbWVudAogICAgICAgIF0pCgogICAgZGVmIGlzX3VudmVyaWZpYWJsZShzZWxmKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBoYXNfaGVhZGVyKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBuYW1lIGluIHNlbGYuX3IuaGVhZGVycyBvciBuYW1lIGluIHNlbGYuX25ld19oZWFkZXJzCgogICAgZGVmIGdldF9oZWFkZXIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKICAgICAgICByZXR1cm4gc2VsZi5fci5oZWFkZXJzLmdldChuYW1lLCBzZWxmLl9uZXdfaGVhZGVycy5nZXQobmFtZSwgZGVmYXVsdCkpCgogICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwga2V5LCB2YWwpOgogICAgICAgICIiImNvb2tpZWxpYiBoYXMgbm8gbGVnaXRpbWF0ZSB1c2UgZm9yIHRoaXMgbWV0aG9kOyBhZGQgaXQgYmFjayBpZiB5b3UgZmluZCBvbmUuIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiQ29va2llIGhlYWRlcnMgc2hvdWxkIGJlIGFkZGVkIHdpdGggYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoKSIpCgogICAgZGVmIGFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICBzZWxmLl9uZXdfaGVhZGVyc1tuYW1lXSA9IHZhbHVlCgogICAgZGVmIGdldF9uZXdfaGVhZGVycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fbmV3X2hlYWRlcnMKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1bnZlcmlmaWFibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaXNfdW52ZXJpZmlhYmxlKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcmlnaW5fcmVxX2hvc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X29yaWdpbl9yZXFfaG9zdCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaG9zdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5nZXRfaG9zdCgpCgoKY2xhc3MgTW9ja1Jlc3BvbnNlKG9iamVjdCk6CiAgICAiIiJXcmFwcyBhIGBodHRwbGliLkhUVFBNZXNzYWdlYCB0byBtaW1pYyBhIGB1cmxsaWIuYWRkaW5mb3VybGAuCgogICAgLi4ud2hhdD8gQmFzaWNhbGx5LCBleHBvc2UgdGhlIHBhcnNlZCBIVFRQIGhlYWRlcnMgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlCiAgICB0aGUgd2F5IGBjb29raWVsaWJgIGV4cGVjdHMgdG8gc2VlIHRoZW0uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGVhZGVycyk6CiAgICAgICAgIiIiTWFrZSBhIE1vY2tSZXNwb25zZSBmb3IgYGNvb2tpZWxpYmAgdG8gcmVhZC4KCiAgICAgICAgOnBhcmFtIGhlYWRlcnM6IGEgaHR0cGxpYi5IVFRQTWVzc2FnZSBvciBhbmFsb2dvdXMgY2FycnlpbmcgdGhlIGhlYWRlcnMKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9oZWFkZXJzID0gaGVhZGVycwoKICAgIGRlZiBpbmZvKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9oZWFkZXJzCgogICAgZGVmIGdldGhlYWRlcnMoc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5faGVhZGVycy5nZXRoZWFkZXJzKG5hbWUpCgoKZGVmIGV4dHJhY3RfY29va2llc190b19qYXIoamFyLCByZXF1ZXN0LCByZXNwb25zZSk6CiAgICAiIiJFeHRyYWN0IHRoZSBjb29raWVzIGZyb20gdGhlIHJlc3BvbnNlIGludG8gYSBDb29raWVKYXIuCgogICAgOnBhcmFtIGphcjogY29va2llbGliLkNvb2tpZUphciAobm90IG5lY2Vzc2FyaWx5IGEgUmVxdWVzdHNDb29raWVKYXIpCiAgICA6cGFyYW0gcmVxdWVzdDogb3VyIG93biByZXF1ZXN0cy5SZXF1ZXN0IG9iamVjdAogICAgOnBhcmFtIHJlc3BvbnNlOiB1cmxsaWIzLkhUVFBSZXNwb25zZSBvYmplY3QKICAgICIiIgogICAgaWYgbm90IChoYXNhdHRyKHJlc3BvbnNlLCAnX29yaWdpbmFsX3Jlc3BvbnNlJykgYW5kCiAgICAgICAgICAgIHJlc3BvbnNlLl9vcmlnaW5hbF9yZXNwb25zZSk6CiAgICAgICAgcmV0dXJuCiAgICAjIHRoZSBfb3JpZ2luYWxfcmVzcG9uc2UgZmllbGQgaXMgdGhlIHdyYXBwZWQgaHR0cGxpYi5IVFRQUmVzcG9uc2Ugb2JqZWN0LAogICAgcmVxID0gTW9ja1JlcXVlc3QocmVxdWVzdCkKICAgICMgcHVsbCBvdXQgdGhlIEhUVFBNZXNzYWdlIHdpdGggdGhlIGhlYWRlcnMgYW5kIHB1dCBpdCBpbiB0aGUgbW9jazoKICAgIHJlcyA9IE1vY2tSZXNwb25zZShyZXNwb25zZS5fb3JpZ2luYWxfcmVzcG9uc2UubXNnKQogICAgamFyLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKCgpkZWYgZ2V0X2Nvb2tpZV9oZWFkZXIoamFyLCByZXF1ZXN0KToKICAgICIiIgogICAgUHJvZHVjZSBhbiBhcHByb3ByaWF0ZSBDb29raWUgaGVhZGVyIHN0cmluZyB0byBiZSBzZW50IHdpdGggYHJlcXVlc3RgLCBvciBOb25lLgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHIgPSBNb2NrUmVxdWVzdChyZXF1ZXN0KQogICAgamFyLmFkZF9jb29raWVfaGVhZGVyKHIpCiAgICByZXR1cm4gci5nZXRfbmV3X2hlYWRlcnMoKS5nZXQoJ0Nvb2tpZScpCgoKZGVmIHJlbW92ZV9jb29raWVfYnlfbmFtZShjb29raWVqYXIsIG5hbWUsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUpOgogICAgIiIiVW5zZXRzIGEgY29va2llIGJ5IG5hbWUsIGJ5IGRlZmF1bHQgb3ZlciBhbGwgZG9tYWlucyBhbmQgcGF0aHMuCgogICAgV3JhcHMgQ29va2llSmFyLmNsZWFyKCksIGlzIE8obikuCiAgICAiIiIKICAgIGNsZWFyYWJsZXMgPSBbXQogICAgZm9yIGNvb2tpZSBpbiBjb29raWVqYXI6CiAgICAgICAgaWYgY29va2llLm5hbWUgIT0gbmFtZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBkb21haW4gaXMgbm90IE5vbmUgYW5kIGRvbWFpbiAhPSBjb29raWUuZG9tYWluOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmUgYW5kIHBhdGggIT0gY29va2llLnBhdGg6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgY2xlYXJhYmxlcy5hcHBlbmQoKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUubmFtZSkpCgogICAgZm9yIGRvbWFpbiwgcGF0aCwgbmFtZSBpbiBjbGVhcmFibGVzOgogICAgICAgIGNvb2tpZWphci5jbGVhcihkb21haW4sIHBhdGgsIG5hbWUpCgoKY2xhc3MgQ29va2llQ29uZmxpY3RFcnJvcihSdW50aW1lRXJyb3IpOgogICAgIiIiVGhlcmUgYXJlIHR3byBjb29raWVzIHRoYXQgbWVldCB0aGUgY3JpdGVyaWEgc3BlY2lmaWVkIGluIHRoZSBjb29raWUgamFyLgogICAgVXNlIC5nZXQgYW5kIC5zZXQgYW5kIGluY2x1ZGUgZG9tYWluIGFuZCBwYXRoIGFyZ3MgaW4gb3JkZXIgdG8gYmUgbW9yZSBzcGVjaWZpYy4KICAgICIiIgoKCmNsYXNzIFJlcXVlc3RzQ29va2llSmFyKGNvb2tpZWxpYi5Db29raWVKYXIsIGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nKToKICAgICIiIkNvbXBhdGliaWxpdHkgY2xhc3M7IGlzIGEgY29va2llbGliLkNvb2tpZUphciwgYnV0IGV4cG9zZXMgYSBkaWN0CiAgICBpbnRlcmZhY2UuCgogICAgVGhpcyBpcyB0aGUgQ29va2llSmFyIHdlIGNyZWF0ZSBieSBkZWZhdWx0IGZvciByZXF1ZXN0cyBhbmQgc2Vzc2lvbnMgdGhhdAogICAgZG9uJ3Qgc3BlY2lmeSBvbmUsIHNpbmNlIHNvbWUgY2xpZW50cyBtYXkgZXhwZWN0IHJlc3BvbnNlLmNvb2tpZXMgYW5kCiAgICBzZXNzaW9uLmNvb2tpZXMgdG8gc3VwcG9ydCBkaWN0IG9wZXJhdGlvbnMuCgogICAgUmVxdWVzdHMgZG9lcyBub3QgdXNlIHRoZSBkaWN0IGludGVyZmFjZSBpbnRlcm5hbGx5OyBpdCdzIGp1c3QgZm9yCiAgICBjb21wYXRpYmlsaXR5IHdpdGggZXh0ZXJuYWwgY2xpZW50IGNvZGUuIEFsbCByZXF1ZXN0cyBjb2RlIHNob3VsZCB3b3JrCiAgICBvdXQgb2YgdGhlIGJveCB3aXRoIGV4dGVybmFsbHkgcHJvdmlkZWQgaW5zdGFuY2VzIG9mIGBgQ29va2llSmFyYGAsIGUuZy4KICAgIGBgTFdQQ29va2llSmFyYGAgYW5kIGBgRmlsZUNvb2tpZUphcmBgLgoKICAgIFVubGlrZSBhIHJlZ3VsYXIgQ29va2llSmFyLCB0aGlzIGNsYXNzIGlzIHBpY2tsZWFibGUuCgogICAgLi4gd2FybmluZzo6IGRpY3Rpb25hcnkgb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSBPKDEpIG1heSBiZSBPKG4pLgogICAgIiIiCgogICAgZGVmIGdldChzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIkRpY3QtbGlrZSBnZXQoKSB0aGF0IGFsc28gc3VwcG9ydHMgb3B0aW9uYWwgZG9tYWluIGFuZCBwYXRoIGFyZ3MgaW4KICAgICAgICBvcmRlciB0byByZXNvbHZlIG5hbWluZyBjb2xsaXNpb25zIGZyb20gdXNpbmcgb25lIGNvb2tpZSBqYXIgb3ZlcgogICAgICAgIG11bHRpcGxlIGRvbWFpbnMuCgogICAgICAgIC4uIHdhcm5pbmc6OiBvcGVyYXRpb24gaXMgTyhuKSwgbm90IE8oMSkuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9ub19kdXBsaWNhdGVzKG5hbWUsIGRvbWFpbiwgcGF0aCkKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CgogICAgZGVmIHNldChzZWxmLCBuYW1lLCB2YWx1ZSwgKiprd2FyZ3MpOgogICAgICAgICIiIkRpY3QtbGlrZSBzZXQoKSB0aGF0IGFsc28gc3VwcG9ydHMgb3B0aW9uYWwgZG9tYWluIGFuZCBwYXRoIGFyZ3MgaW4KICAgICAgICBvcmRlciB0byByZXNvbHZlIG5hbWluZyBjb2xsaXNpb25zIGZyb20gdXNpbmcgb25lIGNvb2tpZSBqYXIgb3ZlcgogICAgICAgIG11bHRpcGxlIGRvbWFpbnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBzdXBwb3J0IGNsaWVudCBjb2RlIHRoYXQgdW5zZXRzIGNvb2tpZXMgYnkgYXNzaWdubWVudCBvZiBhIE5vbmUgdmFsdWU6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgcmVtb3ZlX2Nvb2tpZV9ieV9uYW1lKHNlbGYsIG5hbWUsIGRvbWFpbj1rd2FyZ3MuZ2V0KCdkb21haW4nKSwgcGF0aD1rd2FyZ3MuZ2V0KCdwYXRoJykpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBNb3JzZWwpOgogICAgICAgICAgICBjID0gbW9yc2VsX3RvX2Nvb2tpZSh2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjID0gY3JlYXRlX2Nvb2tpZShuYW1lLCB2YWx1ZSwgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5zZXRfY29va2llKGMpCiAgICAgICAgcmV0dXJuIGMKCiAgICBkZWYgaXRlcmtleXMoc2VsZik6CiAgICAgICAgIiIiRGljdC1saWtlIGl0ZXJrZXlzKCkgdGhhdCByZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIG5hbWVzIG9mIGNvb2tpZXMKICAgICAgICBmcm9tIHRoZSBqYXIuCgogICAgICAgIC4uIHNlZWFsc286OiBpdGVydmFsdWVzKCkgYW5kIGl0ZXJpdGVtcygpLgogICAgICAgICIiIgogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgeWllbGQgY29va2llLm5hbWUKCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2Uga2V5cygpIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgbmFtZXMgb2YgY29va2llcyBmcm9tIHRoZQogICAgICAgIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IHZhbHVlcygpIGFuZCBpdGVtcygpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmtleXMoKSkKCiAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2UgaXRlcnZhbHVlcygpIHRoYXQgcmV0dXJucyBhbiBpdGVyYXRvciBvZiB2YWx1ZXMgb2YgY29va2llcwogICAgICAgIGZyb20gdGhlIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGl0ZXJrZXlzKCkgYW5kIGl0ZXJpdGVtcygpLgogICAgICAgICIiIgogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgeWllbGQgY29va2llLnZhbHVlCgogICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2UgdmFsdWVzKCkgdGhhdCByZXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgb2YgY29va2llcyBmcm9tIHRoZQogICAgICAgIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGtleXMoKSBhbmQgaXRlbXMoKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJ2YWx1ZXMoKSkKCiAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSBpdGVyaXRlbXMoKSB0aGF0IHJldHVybnMgYW4gaXRlcmF0b3Igb2YgbmFtZS12YWx1ZSB0dXBsZXMKICAgICAgICBmcm9tIHRoZSBqYXIuCgogICAgICAgIC4uIHNlZWFsc286OiBpdGVya2V5cygpIGFuZCBpdGVydmFsdWVzKCkuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICB5aWVsZCBjb29raWUubmFtZSwgY29va2llLnZhbHVlCgogICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSBpdGVtcygpIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgbmFtZS12YWx1ZSB0dXBsZXMgZnJvbSB0aGUKICAgICAgICBqYXIuIEFsbG93cyBjbGllbnQtY29kZSB0byBjYWxsIGBgZGljdChSZXF1ZXN0c0Nvb2tpZUphcilgYCBhbmQgZ2V0IGEKICAgICAgICB2YW5pbGxhIHB5dGhvbiBkaWN0IG9mIGtleSB2YWx1ZSBwYWlycy4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGtleXMoKSBhbmQgdmFsdWVzKCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkKCiAgICBkZWYgbGlzdF9kb21haW5zKHNlbGYpOgogICAgICAgICIiIlV0aWxpdHkgbWV0aG9kIHRvIGxpc3QgYWxsIHRoZSBkb21haW5zIGluIHRoZSBqYXIuIiIiCiAgICAgICAgZG9tYWlucyA9IFtdCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiBjb29raWUuZG9tYWluIG5vdCBpbiBkb21haW5zOgogICAgICAgICAgICAgICAgZG9tYWlucy5hcHBlbmQoY29va2llLmRvbWFpbikKICAgICAgICByZXR1cm4gZG9tYWlucwoKICAgIGRlZiBsaXN0X3BhdGhzKHNlbGYpOgogICAgICAgICIiIlV0aWxpdHkgbWV0aG9kIHRvIGxpc3QgYWxsIHRoZSBwYXRocyBpbiB0aGUgamFyLiIiIgogICAgICAgIHBhdGhzID0gW10KICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmIGNvb2tpZS5wYXRoIG5vdCBpbiBwYXRoczoKICAgICAgICAgICAgICAgIHBhdGhzLmFwcGVuZChjb29raWUucGF0aCkKICAgICAgICByZXR1cm4gcGF0aHMKCiAgICBkZWYgbXVsdGlwbGVfZG9tYWlucyhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGRvbWFpbnMgaW4gdGhlIGphci4KICAgICAgICBSZXR1cm5zIEZhbHNlIG90aGVyd2lzZS4KCiAgICAgICAgOnJ0eXBlOiBib29sCiAgICAgICAgIiIiCiAgICAgICAgZG9tYWlucyA9IFtdCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiBjb29raWUuZG9tYWluIGlzIG5vdCBOb25lIGFuZCBjb29raWUuZG9tYWluIGluIGRvbWFpbnM6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBkb21haW5zLmFwcGVuZChjb29raWUuZG9tYWluKQogICAgICAgIHJldHVybiBGYWxzZSAgIyB0aGVyZSBpcyBvbmx5IG9uZSBkb21haW4gaW4gamFyCgogICAgZGVmIGdldF9kaWN0KHNlbGYsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIlRha2VzIGFzIGFuIGFyZ3VtZW50IGFuIG9wdGlvbmFsIGRvbWFpbiBhbmQgcGF0aCBhbmQgcmV0dXJucyBhIHBsYWluCiAgICAgICAgb2xkIFB5dGhvbiBkaWN0IG9mIG5hbWUtdmFsdWUgcGFpcnMgb2YgY29va2llcyB0aGF0IG1lZXQgdGhlCiAgICAgICAgcmVxdWlyZW1lbnRzLgoKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICBkaWN0aW9uYXJ5ID0ge30KICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIChkb21haW4gaXMgTm9uZSBvciBjb29raWUuZG9tYWluID09IGRvbWFpbikgYW5kCiAgICAgICAgICAgICAgICAocGF0aCBpcyBOb25lIG9yIGNvb2tpZS5wYXRoID09IHBhdGgpCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2Nvb2tpZS5uYW1lXSA9IGNvb2tpZS52YWx1ZQogICAgICAgIHJldHVybiBkaWN0aW9uYXJ5CgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihSZXF1ZXN0c0Nvb2tpZUphciwgc2VsZikuX19jb250YWluc19fKG5hbWUpCiAgICAgICAgZXhjZXB0IENvb2tpZUNvbmZsaWN0RXJyb3I6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkRpY3QtbGlrZSBfX2dldGl0ZW1fXygpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY2xpZW50IGNvZGUuIFRocm93cwogICAgICAgIGV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBjb29raWUgd2l0aCBuYW1lLiBJbiB0aGF0IGNhc2UsCiAgICAgICAgdXNlIHRoZSBtb3JlIGV4cGxpY2l0IGdldCgpIG1ldGhvZCBpbnN0ZWFkLgoKICAgICAgICAuLiB3YXJuaW5nOjogb3BlcmF0aW9uIGlzIE8obiksIG5vdCBPKDEpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9maW5kX25vX2R1cGxpY2F0ZXMobmFtZSkKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkRpY3QtbGlrZSBfX3NldGl0ZW1fXyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNsaWVudCBjb2RlLiBUaHJvd3MKICAgICAgICBleGNlcHRpb24gaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGNvb2tpZSBvZiB0aGF0IG5hbWUgaW4gdGhlIGphci4gSW4gdGhhdAogICAgICAgIGNhc2UsIHVzZSB0aGUgbW9yZSBleHBsaWNpdCBzZXQoKSBtZXRob2QgaW5zdGVhZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnNldChuYW1lLCB2YWx1ZSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiRGVsZXRlcyBhIGNvb2tpZSBnaXZlbiBhIG5hbWUuIFdyYXBzIGBgY29va2llbGliLkNvb2tpZUphcmBgJ3MKICAgICAgICBgYHJlbW92ZV9jb29raWVfYnlfbmFtZSgpYGAuCiAgICAgICAgIiIiCiAgICAgICAgcmVtb3ZlX2Nvb2tpZV9ieV9uYW1lKHNlbGYsIG5hbWUpCgogICAgZGVmIHNldF9jb29raWUoc2VsZiwgY29va2llLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIGhhc2F0dHIoY29va2llLnZhbHVlLCAnc3RhcnRzd2l0aCcpIGFuZCBjb29raWUudmFsdWUuc3RhcnRzd2l0aCgnIicpIGFuZCBjb29raWUudmFsdWUuZW5kc3dpdGgoJyInKToKICAgICAgICAgICAgY29va2llLnZhbHVlID0gY29va2llLnZhbHVlLnJlcGxhY2UoJ1xcIicsICcnKQogICAgICAgIHJldHVybiBzdXBlcihSZXF1ZXN0c0Nvb2tpZUphciwgc2VsZikuc2V0X2Nvb2tpZShjb29raWUsICphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgdXBkYXRlKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJVcGRhdGVzIHRoaXMgamFyIHdpdGggY29va2llcyBmcm9tIGFub3RoZXIgQ29va2llSmFyIG9yIGRpY3QtbGlrZSIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGNvb2tpZWxpYi5Db29raWVKYXIpOgogICAgICAgICAgICBmb3IgY29va2llIGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZi5zZXRfY29va2llKGNvcHkuY29weShjb29raWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1cGVyKFJlcXVlc3RzQ29va2llSmFyLCBzZWxmKS51cGRhdGUob3RoZXIpCgogICAgZGVmIF9maW5kKHNlbGYsIG5hbWUsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIlJlcXVlc3RzIHVzZXMgdGhpcyBtZXRob2QgaW50ZXJuYWxseSB0byBnZXQgY29va2llIHZhbHVlcy4KCiAgICAgICAgSWYgdGhlcmUgYXJlIGNvbmZsaWN0aW5nIGNvb2tpZXMsIF9maW5kIGFyYml0cmFyaWx5IGNob29zZXMgb25lLgogICAgICAgIFNlZSBfZmluZF9ub19kdXBsaWNhdGVzIGlmIHlvdSB3YW50IGFuIGV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgYXJlCiAgICAgICAgY29uZmxpY3RpbmcgY29va2llcy4KCiAgICAgICAgOnBhcmFtIG5hbWU6IGEgc3RyaW5nIGNvbnRhaW5pbmcgbmFtZSBvZiBjb29raWUKICAgICAgICA6cGFyYW0gZG9tYWluOiAob3B0aW9uYWwpIHN0cmluZyBjb250YWluaW5nIGRvbWFpbiBvZiBjb29raWUKICAgICAgICA6cGFyYW0gcGF0aDogKG9wdGlvbmFsKSBzdHJpbmcgY29udGFpbmluZyBwYXRoIG9mIGNvb2tpZQogICAgICAgIDpyZXR1cm46IGNvb2tpZS52YWx1ZQogICAgICAgICIiIgogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgY29va2llLm5hbWUgPT0gbmFtZToKICAgICAgICAgICAgICAgIGlmIGRvbWFpbiBpcyBOb25lIG9yIGNvb2tpZS5kb21haW4gPT0gZG9tYWluOgogICAgICAgICAgICAgICAgICAgIGlmIHBhdGggaXMgTm9uZSBvciBjb29raWUucGF0aCA9PSBwYXRoOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29va2llLnZhbHVlCgogICAgICAgIHJhaXNlIEtleUVycm9yKCduYW1lPSVyLCBkb21haW49JXIsIHBhdGg9JXInICUgKG5hbWUsIGRvbWFpbiwgcGF0aCkpCgogICAgZGVmIF9maW5kX25vX2R1cGxpY2F0ZXMoc2VsZiwgbmFtZSwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiQm90aCBgYF9fZ2V0X2l0ZW1fX2BgIGFuZCBgYGdldGBgIGNhbGwgdGhpcyBmdW5jdGlvbjogaXQncyBuZXZlcgogICAgICAgIHVzZWQgZWxzZXdoZXJlIGluIFJlcXVlc3RzLgoKICAgICAgICA6cGFyYW0gbmFtZTogYSBzdHJpbmcgY29udGFpbmluZyBuYW1lIG9mIGNvb2tpZQogICAgICAgIDpwYXJhbSBkb21haW46IChvcHRpb25hbCkgc3RyaW5nIGNvbnRhaW5pbmcgZG9tYWluIG9mIGNvb2tpZQogICAgICAgIDpwYXJhbSBwYXRoOiAob3B0aW9uYWwpIHN0cmluZyBjb250YWluaW5nIHBhdGggb2YgY29va2llCiAgICAgICAgOnJhaXNlcyBLZXlFcnJvcjogaWYgY29va2llIGlzIG5vdCBmb3VuZAogICAgICAgIDpyYWlzZXMgQ29va2llQ29uZmxpY3RFcnJvcjogaWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvb2tpZXMKICAgICAgICAgICAgdGhhdCBtYXRjaCBuYW1lIGFuZCBvcHRpb25hbGx5IGRvbWFpbiBhbmQgcGF0aAogICAgICAgIDpyZXR1cm46IGNvb2tpZS52YWx1ZQogICAgICAgICIiIgogICAgICAgIHRvUmV0dXJuID0gTm9uZQogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgY29va2llLm5hbWUgPT0gbmFtZToKICAgICAgICAgICAgICAgIGlmIGRvbWFpbiBpcyBOb25lIG9yIGNvb2tpZS5kb21haW4gPT0gZG9tYWluOgogICAgICAgICAgICAgICAgICAgIGlmIHBhdGggaXMgTm9uZSBvciBjb29raWUucGF0aCA9PSBwYXRoOgogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b1JldHVybiBpcyBub3QgTm9uZTogICMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvb2tpZXMgdGhhdCBtZWV0IHBhc3NlZCBpbiBjcml0ZXJpYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29va2llQ29uZmxpY3RFcnJvcignVGhlcmUgYXJlIG11bHRpcGxlIGNvb2tpZXMgd2l0aCBuYW1lLCAlcicgJSAobmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0dXJuID0gY29va2llLnZhbHVlICAjIHdlIHdpbGwgZXZlbnR1YWxseSByZXR1cm4gdGhpcyBhcyBsb25nIGFzIG5vIGNvb2tpZSBjb25mbGljdAoKICAgICAgICBpZiB0b1JldHVybjoKICAgICAgICAgICAgcmV0dXJuIHRvUmV0dXJuCiAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ25hbWU9JXIsIGRvbWFpbj0lciwgcGF0aD0lcicgJSAobmFtZSwgZG9tYWluLCBwYXRoKSkKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgICIiIlVubGlrZSBhIG5vcm1hbCBDb29raWVKYXIsIHRoaXMgY2xhc3MgaXMgcGlja2xlYWJsZS4iIiIKICAgICAgICBzdGF0ZSA9IHNlbGYuX19kaWN0X18uY29weSgpCiAgICAgICAgIyByZW1vdmUgdGhlIHVucGlja2xlYWJsZSBSTG9jayBvYmplY3QKICAgICAgICBzdGF0ZS5wb3AoJ19jb29raWVzX2xvY2snKQogICAgICAgIHJldHVybiBzdGF0ZQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgogICAgICAgICIiIlVubGlrZSBhIG5vcm1hbCBDb29raWVKYXIsIHRoaXMgY2xhc3MgaXMgcGlja2xlYWJsZS4iIiIKICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShzdGF0ZSkKICAgICAgICBpZiAnX2Nvb2tpZXNfbG9jaycgbm90IGluIHNlbGYuX19kaWN0X186CiAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jayA9IHRocmVhZGluZy5STG9jaygpCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgY29weSBvZiB0aGlzIFJlcXVlc3RzQ29va2llSmFyLiIiIgogICAgICAgIG5ld19jaiA9IFJlcXVlc3RzQ29va2llSmFyKCkKICAgICAgICBuZXdfY2oudXBkYXRlKHNlbGYpCiAgICAgICAgcmV0dXJuIG5ld19jagoKCmRlZiBfY29weV9jb29raWVfamFyKGphcik6CiAgICBpZiBqYXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGlmIGhhc2F0dHIoamFyLCAnY29weScpOgogICAgICAgICMgV2UncmUgZGVhbGluZyB3aXRoIGFuIGluc3RhbmNlIG9mIFJlcXVlc3RzQ29va2llSmFyCiAgICAgICAgcmV0dXJuIGphci5jb3B5KCkKICAgICMgV2UncmUgZGVhbGluZyB3aXRoIGEgZ2VuZXJpYyBDb29raWVKYXIgaW5zdGFuY2UKICAgIG5ld19qYXIgPSBjb3B5LmNvcHkoamFyKQogICAgbmV3X2phci5jbGVhcigpCiAgICBmb3IgY29va2llIGluIGphcjoKICAgICAgICBuZXdfamFyLnNldF9jb29raWUoY29weS5jb3B5KGNvb2tpZSkpCiAgICByZXR1cm4gbmV3X2phcgoKCmRlZiBjcmVhdGVfY29va2llKG5hbWUsIHZhbHVlLCAqKmt3YXJncyk6CiAgICAiIiJNYWtlIGEgY29va2llIGZyb20gdW5kZXJzcGVjaWZpZWQgcGFyYW1ldGVycy4KCiAgICBCeSBkZWZhdWx0LCB0aGUgcGFpciBvZiBgbmFtZWAgYW5kIGB2YWx1ZWAgd2lsbCBiZSBzZXQgZm9yIHRoZSBkb21haW4gJycKICAgIGFuZCBzZW50IG9uIGV2ZXJ5IHJlcXVlc3QgKHRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCBhICJzdXBlcmNvb2tpZSIpLgogICAgIiIiCiAgICByZXN1bHQgPSBkaWN0KAogICAgICAgIHZlcnNpb249MCwKICAgICAgICBuYW1lPW5hbWUsCiAgICAgICAgdmFsdWU9dmFsdWUsCiAgICAgICAgcG9ydD1Ob25lLAogICAgICAgIGRvbWFpbj0nJywKICAgICAgICBwYXRoPScvJywKICAgICAgICBzZWN1cmU9RmFsc2UsCiAgICAgICAgZXhwaXJlcz1Ob25lLAogICAgICAgIGRpc2NhcmQ9VHJ1ZSwKICAgICAgICBjb21tZW50PU5vbmUsCiAgICAgICAgY29tbWVudF91cmw9Tm9uZSwKICAgICAgICByZXN0PXsnSHR0cE9ubHknOiBOb25lfSwKICAgICAgICByZmMyMTA5PUZhbHNlLCkKCiAgICBiYWRhcmdzID0gc2V0KGt3YXJncykgLSBzZXQocmVzdWx0KQogICAgaWYgYmFkYXJnczoKICAgICAgICBlcnIgPSAnY3JlYXRlX2Nvb2tpZSgpIGdvdCB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnRzOiAlcycKICAgICAgICByYWlzZSBUeXBlRXJyb3IoZXJyICUgbGlzdChiYWRhcmdzKSkKCiAgICByZXN1bHQudXBkYXRlKGt3YXJncykKICAgIHJlc3VsdFsncG9ydF9zcGVjaWZpZWQnXSA9IGJvb2wocmVzdWx0Wydwb3J0J10pCiAgICByZXN1bHRbJ2RvbWFpbl9zcGVjaWZpZWQnXSA9IGJvb2wocmVzdWx0Wydkb21haW4nXSkKICAgIHJlc3VsdFsnZG9tYWluX2luaXRpYWxfZG90J10gPSByZXN1bHRbJ2RvbWFpbiddLnN0YXJ0c3dpdGgoJy4nKQogICAgcmVzdWx0WydwYXRoX3NwZWNpZmllZCddID0gYm9vbChyZXN1bHRbJ3BhdGgnXSkKCiAgICByZXR1cm4gY29va2llbGliLkNvb2tpZSgqKnJlc3VsdCkKCgpkZWYgbW9yc2VsX3RvX2Nvb2tpZShtb3JzZWwpOgogICAgIiIiQ29udmVydCBhIE1vcnNlbCBvYmplY3QgaW50byBhIENvb2tpZSBjb250YWluaW5nIHRoZSBvbmUgay92IHBhaXIuIiIiCgogICAgZXhwaXJlcyA9IE5vbmUKICAgIGlmIG1vcnNlbFsnbWF4LWFnZSddOgogICAgICAgIHRyeToKICAgICAgICAgICAgZXhwaXJlcyA9IGludCh0aW1lLnRpbWUoKSArIGludChtb3JzZWxbJ21heC1hZ2UnXSkpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbWF4LWFnZTogJXMgbXVzdCBiZSBpbnRlZ2VyJyAlIG1vcnNlbFsnbWF4LWFnZSddKQogICAgZWxpZiBtb3JzZWxbJ2V4cGlyZXMnXToKICAgICAgICB0aW1lX3RlbXBsYXRlID0gJyVhLCAlZC0lYi0lWSAlSDolTTolUyBHTVQnCiAgICAgICAgZXhwaXJlcyA9IGNhbGVuZGFyLnRpbWVnbSgKICAgICAgICAgICAgdGltZS5zdHJwdGltZShtb3JzZWxbJ2V4cGlyZXMnXSwgdGltZV90ZW1wbGF0ZSkKICAgICAgICApCiAgICByZXR1cm4gY3JlYXRlX2Nvb2tpZSgKICAgICAgICBjb21tZW50PW1vcnNlbFsnY29tbWVudCddLAogICAgICAgIGNvbW1lbnRfdXJsPWJvb2wobW9yc2VsWydjb21tZW50J10pLAogICAgICAgIGRpc2NhcmQ9RmFsc2UsCiAgICAgICAgZG9tYWluPW1vcnNlbFsnZG9tYWluJ10sCiAgICAgICAgZXhwaXJlcz1leHBpcmVzLAogICAgICAgIG5hbWU9bW9yc2VsLmtleSwKICAgICAgICBwYXRoPW1vcnNlbFsncGF0aCddLAogICAgICAgIHBvcnQ9Tm9uZSwKICAgICAgICByZXN0PXsnSHR0cE9ubHknOiBtb3JzZWxbJ2h0dHBvbmx5J119LAogICAgICAgIHJmYzIxMDk9RmFsc2UsCiAgICAgICAgc2VjdXJlPWJvb2wobW9yc2VsWydzZWN1cmUnXSksCiAgICAgICAgdmFsdWU9bW9yc2VsLnZhbHVlLAogICAgICAgIHZlcnNpb249bW9yc2VsWyd2ZXJzaW9uJ10gb3IgMCwKICAgICkKCgpkZWYgY29va2llamFyX2Zyb21fZGljdChjb29raWVfZGljdCwgY29va2llamFyPU5vbmUsIG92ZXJ3cml0ZT1UcnVlKToKICAgICIiIlJldHVybnMgYSBDb29raWVKYXIgZnJvbSBhIGtleS92YWx1ZSBkaWN0aW9uYXJ5LgoKICAgIDpwYXJhbSBjb29raWVfZGljdDogRGljdCBvZiBrZXkvdmFsdWVzIHRvIGluc2VydCBpbnRvIENvb2tpZUphci4KICAgIDpwYXJhbSBjb29raWVqYXI6IChvcHRpb25hbCkgQSBjb29raWVqYXIgdG8gYWRkIHRoZSBjb29raWVzIHRvLgogICAgOnBhcmFtIG92ZXJ3cml0ZTogKG9wdGlvbmFsKSBJZiBGYWxzZSwgd2lsbCBub3QgcmVwbGFjZSBjb29raWVzCiAgICAgICAgYWxyZWFkeSBpbiB0aGUgamFyIHdpdGggbmV3IG9uZXMuCiAgICAiIiIKICAgIGlmIGNvb2tpZWphciBpcyBOb25lOgogICAgICAgIGNvb2tpZWphciA9IFJlcXVlc3RzQ29va2llSmFyKCkKCiAgICBpZiBjb29raWVfZGljdCBpcyBub3QgTm9uZToKICAgICAgICBuYW1lc19mcm9tX2phciA9IFtjb29raWUubmFtZSBmb3IgY29va2llIGluIGNvb2tpZWphcl0KICAgICAgICBmb3IgbmFtZSBpbiBjb29raWVfZGljdDoKICAgICAgICAgICAgaWYgb3ZlcndyaXRlIG9yIChuYW1lIG5vdCBpbiBuYW1lc19mcm9tX2phcik6CiAgICAgICAgICAgICAgICBjb29raWVqYXIuc2V0X2Nvb2tpZShjcmVhdGVfY29va2llKG5hbWUsIGNvb2tpZV9kaWN0W25hbWVdKSkKCiAgICByZXR1cm4gY29va2llamFyCgoKZGVmIG1lcmdlX2Nvb2tpZXMoY29va2llamFyLCBjb29raWVzKToKICAgICIiIkFkZCBjb29raWVzIHRvIGNvb2tpZWphciBhbmQgcmV0dXJucyBhIG1lcmdlZCBDb29raWVKYXIuCgogICAgOnBhcmFtIGNvb2tpZWphcjogQ29va2llSmFyIG9iamVjdCB0byBhZGQgdGhlIGNvb2tpZXMgdG8uCiAgICA6cGFyYW0gY29va2llczogRGljdGlvbmFyeSBvciBDb29raWVKYXIgb2JqZWN0IHRvIGJlIGFkZGVkLgogICAgIiIiCiAgICBpZiBub3QgaXNpbnN0YW5jZShjb29raWVqYXIsIGNvb2tpZWxpYi5Db29raWVKYXIpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1lvdSBjYW4gb25seSBtZXJnZSBpbnRvIENvb2tpZUphcicpCgogICAgaWYgaXNpbnN0YW5jZShjb29raWVzLCBkaWN0KToKICAgICAgICBjb29raWVqYXIgPSBjb29raWVqYXJfZnJvbV9kaWN0KAogICAgICAgICAgICBjb29raWVzLCBjb29raWVqYXI9Y29va2llamFyLCBvdmVyd3JpdGU9RmFsc2UpCiAgICBlbGlmIGlzaW5zdGFuY2UoY29va2llcywgY29va2llbGliLkNvb2tpZUphcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb29raWVqYXIudXBkYXRlKGNvb2tpZXMpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBmb3IgY29va2llX2luX2phciBpbiBjb29raWVzOgogICAgICAgICAgICAgICAgY29va2llamFyLnNldF9jb29raWUoY29va2llX2luX2phcikKCiAgICByZXR1cm4gY29va2llamFyClBLAwQUAAAAAAAAACEA+c7p0CsMAAArDAAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvZXhjZXB0aW9ucy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuZXhjZXB0aW9ucwp+fn5+fn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgc2V0IG9mIFJlcXVlc3RzJyBleGNlcHRpb25zLgoiIiIKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IEhUVFBFcnJvciBhcyBCYXNlSFRUUEVycm9yCgoKY2xhc3MgUmVxdWVzdEV4Y2VwdGlvbihJT0Vycm9yKToKICAgICIiIlRoZXJlIHdhcyBhbiBhbWJpZ3VvdXMgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgeW91cgogICAgcmVxdWVzdC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIkluaXRpYWxpemUgUmVxdWVzdEV4Y2VwdGlvbiB3aXRoIGByZXF1ZXN0YCBhbmQgYHJlc3BvbnNlYCBvYmplY3RzLiIiIgogICAgICAgIHJlc3BvbnNlID0ga3dhcmdzLnBvcCgncmVzcG9uc2UnLCBOb25lKQogICAgICAgIHNlbGYucmVzcG9uc2UgPSByZXNwb25zZQogICAgICAgIHNlbGYucmVxdWVzdCA9IGt3YXJncy5wb3AoJ3JlcXVlc3QnLCBOb25lKQogICAgICAgIGlmIChyZXNwb25zZSBpcyBub3QgTm9uZSBhbmQgbm90IHNlbGYucmVxdWVzdCBhbmQKICAgICAgICAgICAgICAgIGhhc2F0dHIocmVzcG9uc2UsICdyZXF1ZXN0JykpOgogICAgICAgICAgICBzZWxmLnJlcXVlc3QgPSBzZWxmLnJlc3BvbnNlLnJlcXVlc3QKICAgICAgICBzdXBlcihSZXF1ZXN0RXhjZXB0aW9uLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgoKY2xhc3MgSFRUUEVycm9yKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiQW4gSFRUUCBlcnJvciBvY2N1cnJlZC4iIiIKCgpjbGFzcyBDb25uZWN0aW9uRXJyb3IoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJBIENvbm5lY3Rpb24gZXJyb3Igb2NjdXJyZWQuIiIiCgoKY2xhc3MgUHJveHlFcnJvcihDb25uZWN0aW9uRXJyb3IpOgogICAgIiIiQSBwcm94eSBlcnJvciBvY2N1cnJlZC4iIiIKCgpjbGFzcyBTU0xFcnJvcihDb25uZWN0aW9uRXJyb3IpOgogICAgIiIiQW4gU1NMIGVycm9yIG9jY3VycmVkLiIiIgoKCmNsYXNzIFRpbWVvdXQoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJUaGUgcmVxdWVzdCB0aW1lZCBvdXQuCgogICAgQ2F0Y2hpbmcgdGhpcyBlcnJvciB3aWxsIGNhdGNoIGJvdGgKICAgIDpleGM6YH5yZXF1ZXN0cy5leGNlcHRpb25zLkNvbm5lY3RUaW1lb3V0YCBhbmQKICAgIDpleGM6YH5yZXF1ZXN0cy5leGNlcHRpb25zLlJlYWRUaW1lb3V0YCBlcnJvcnMuCiAgICAiIiIKCgpjbGFzcyBDb25uZWN0VGltZW91dChDb25uZWN0aW9uRXJyb3IsIFRpbWVvdXQpOgogICAgIiIiVGhlIHJlcXVlc3QgdGltZWQgb3V0IHdoaWxlIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSByZW1vdGUgc2VydmVyLgoKICAgIFJlcXVlc3RzIHRoYXQgcHJvZHVjZWQgdGhpcyBlcnJvciBhcmUgc2FmZSB0byByZXRyeS4KICAgICIiIgoKCmNsYXNzIFJlYWRUaW1lb3V0KFRpbWVvdXQpOgogICAgIiIiVGhlIHNlcnZlciBkaWQgbm90IHNlbmQgYW55IGRhdGEgaW4gdGhlIGFsbG90dGVkIGFtb3VudCBvZiB0aW1lLiIiIgoKCmNsYXNzIFVSTFJlcXVpcmVkKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiQSB2YWxpZCBVUkwgaXMgcmVxdWlyZWQgdG8gbWFrZSBhIHJlcXVlc3QuIiIiCgoKY2xhc3MgVG9vTWFueVJlZGlyZWN0cyhSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIlRvbyBtYW55IHJlZGlyZWN0cy4iIiIKCgpjbGFzcyBNaXNzaW5nU2NoZW1hKFJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpOgogICAgIiIiVGhlIFVSTCBzY2hlbWEgKGUuZy4gaHR0cCBvciBodHRwcykgaXMgbWlzc2luZy4iIiIKCgpjbGFzcyBJbnZhbGlkU2NoZW1hKFJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpOgogICAgIiIiU2VlIGRlZmF1bHRzLnB5IGZvciB2YWxpZCBzY2hlbWFzLiIiIgoKCmNsYXNzIEludmFsaWRVUkwoUmVxdWVzdEV4Y2VwdGlvbiwgVmFsdWVFcnJvcik6CiAgICAiIiJUaGUgVVJMIHByb3ZpZGVkIHdhcyBzb21laG93IGludmFsaWQuIiIiCgoKY2xhc3MgSW52YWxpZEhlYWRlcihSZXF1ZXN0RXhjZXB0aW9uLCBWYWx1ZUVycm9yKToKICAgICIiIlRoZSBoZWFkZXIgdmFsdWUgcHJvdmlkZWQgd2FzIHNvbWVob3cgaW52YWxpZC4iIiIKCgpjbGFzcyBDaHVua2VkRW5jb2RpbmdFcnJvcihSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIlRoZSBzZXJ2ZXIgZGVjbGFyZWQgY2h1bmtlZCBlbmNvZGluZyBidXQgc2VudCBhbiBpbnZhbGlkIGNodW5rLiIiIgoKCmNsYXNzIENvbnRlbnREZWNvZGluZ0Vycm9yKFJlcXVlc3RFeGNlcHRpb24sIEJhc2VIVFRQRXJyb3IpOgogICAgIiIiRmFpbGVkIHRvIGRlY29kZSByZXNwb25zZSBjb250ZW50IiIiCgoKY2xhc3MgU3RyZWFtQ29uc3VtZWRFcnJvcihSZXF1ZXN0RXhjZXB0aW9uLCBUeXBlRXJyb3IpOgogICAgIiIiVGhlIGNvbnRlbnQgZm9yIHRoaXMgcmVzcG9uc2Ugd2FzIGFscmVhZHkgY29uc3VtZWQiIiIKCgpjbGFzcyBSZXRyeUVycm9yKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiQ3VzdG9tIHJldHJpZXMgbG9naWMgZmFpbGVkIiIiCgoKY2xhc3MgVW5yZXdpbmRhYmxlQm9keUVycm9yKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiUmVxdWVzdHMgZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gcmV3aW5kIGEgYm9keSIiIgoKIyBXYXJuaW5ncwoKCmNsYXNzIFJlcXVlc3RzV2FybmluZyhXYXJuaW5nKToKICAgICIiIkJhc2Ugd2FybmluZyBmb3IgUmVxdWVzdHMuIiIiCiAgICBwYXNzCgoKY2xhc3MgRmlsZU1vZGVXYXJuaW5nKFJlcXVlc3RzV2FybmluZywgRGVwcmVjYXRpb25XYXJuaW5nKToKICAgICIiIkEgZmlsZSB3YXMgb3BlbmVkIGluIHRleHQgbW9kZSwgYnV0IFJlcXVlc3RzIGRldGVybWluZWQgaXRzIGJpbmFyeSBsZW5ndGguIiIiCiAgICBwYXNzCgoKY2xhc3MgUmVxdWVzdHNEZXBlbmRlbmN5V2FybmluZyhSZXF1ZXN0c1dhcm5pbmcpOgogICAgIiIiQW4gaW1wb3J0ZWQgZGVwZW5kZW5jeSBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCB2ZXJzaW9uIHJhbmdlLiIiIgogICAgcGFzcwpQSwMEFAAAAAAAAAAhAIQdYOJTDgAAUw4AADkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2hlbHAucHkiIiJNb2R1bGUgY29udGFpbmluZyBidWcgcmVwb3J0IGhlbHBlcihzKS4iIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGpzb24KaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBzeXMKaW1wb3J0IHNzbAoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgaWRuYQpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCB1cmxsaWIzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNoYXJkZXQKCmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18gYXMgcmVxdWVzdHNfdmVyc2lvbgoKdHJ5OgogICAgZnJvbSAucGFja2FnZXMudXJsbGliMy5jb250cmliIGltcG9ydCBweW9wZW5zc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcHlvcGVuc3NsID0gTm9uZQogICAgT3BlblNTTCA9IE5vbmUKICAgIGNyeXB0b2dyYXBoeSA9IE5vbmUKZWxzZToKICAgIGltcG9ydCBPcGVuU1NMCiAgICBpbXBvcnQgY3J5cHRvZ3JhcGh5CgoKZGVmIF9pbXBsZW1lbnRhdGlvbigpOgogICAgIiIiUmV0dXJuIGEgZGljdCB3aXRoIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gYW5kIHZlcnNpb24uCgogICAgUHJvdmlkZSBib3RoIHRoZSBuYW1lIGFuZCB0aGUgdmVyc2lvbiBvZiB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uCiAgICBjdXJyZW50bHkgcnVubmluZy4gRm9yIGV4YW1wbGUsIG9uIENQeXRob24gMi43LjUgaXQgd2lsbCByZXR1cm4KICAgIHsnbmFtZSc6ICdDUHl0aG9uJywgJ3ZlcnNpb24nOiAnMi43LjUnfS4KCiAgICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGJlc3Qgb24gQ1B5dGhvbiBhbmQgUHlQeTogaW4gcGFydGljdWxhciwgaXQgcHJvYmFibHkKICAgIGRvZXNuJ3Qgd29yayBmb3IgSnl0aG9uIG9yIElyb25QeXRob24uIEZ1dHVyZSBpbnZlc3RpZ2F0aW9uIHNob3VsZCBiZSBkb25lCiAgICB0byB3b3JrIG91dCB0aGUgY29ycmVjdCBzaGFwZSBvZiB0aGUgY29kZSBmb3IgdGhvc2UgcGxhdGZvcm1zLgogICAgIiIiCiAgICBpbXBsZW1lbnRhdGlvbiA9IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpCgogICAgaWYgaW1wbGVtZW50YXRpb24gPT0gJ0NQeXRob24nOgogICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCiAgICBlbGlmIGltcGxlbWVudGF0aW9uID09ICdQeVB5JzoKICAgICAgICBpbXBsZW1lbnRhdGlvbl92ZXJzaW9uID0gJyVzLiVzLiVzJyAlIChzeXMucHlweV92ZXJzaW9uX2luZm8ubWFqb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pbm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5weXB5X3ZlcnNpb25faW5mby5taWNybykKICAgICAgICBpZiBzeXMucHlweV92ZXJzaW9uX2luZm8ucmVsZWFzZWxldmVsICE9ICdmaW5hbCc6CiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSAnJy5qb2luKFsKICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24sIHN5cy5weXB5X3ZlcnNpb25faW5mby5yZWxlYXNlbGV2ZWwKICAgICAgICAgICAgXSkKICAgIGVsaWYgaW1wbGVtZW50YXRpb24gPT0gJ0p5dGhvbic6CiAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkgICMgQ29tcGxldGUgR3Vlc3MKICAgIGVsaWYgaW1wbGVtZW50YXRpb24gPT0gJ0lyb25QeXRob24nOgogICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpICAjIENvbXBsZXRlIEd1ZXNzCiAgICBlbHNlOgogICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSAnVW5rbm93bicKCiAgICByZXR1cm4geyduYW1lJzogaW1wbGVtZW50YXRpb24sICd2ZXJzaW9uJzogaW1wbGVtZW50YXRpb25fdmVyc2lvbn0KCgpkZWYgaW5mbygpOgogICAgIiIiR2VuZXJhdGUgaW5mb3JtYXRpb24gZm9yIGEgYnVnIHJlcG9ydC4iIiIKICAgIHRyeToKICAgICAgICBwbGF0Zm9ybV9pbmZvID0gewogICAgICAgICAgICAnc3lzdGVtJzogcGxhdGZvcm0uc3lzdGVtKCksCiAgICAgICAgICAgICdyZWxlYXNlJzogcGxhdGZvcm0ucmVsZWFzZSgpLAogICAgICAgIH0KICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgIHBsYXRmb3JtX2luZm8gPSB7CiAgICAgICAgICAgICdzeXN0ZW0nOiAnVW5rbm93bicsCiAgICAgICAgICAgICdyZWxlYXNlJzogJ1Vua25vd24nLAogICAgICAgIH0KCiAgICBpbXBsZW1lbnRhdGlvbl9pbmZvID0gX2ltcGxlbWVudGF0aW9uKCkKICAgIHVybGxpYjNfaW5mbyA9IHsndmVyc2lvbic6IHVybGxpYjMuX192ZXJzaW9uX199CiAgICBjaGFyZGV0X2luZm8gPSB7J3ZlcnNpb24nOiBjaGFyZGV0Ll9fdmVyc2lvbl9ffQoKICAgIHB5b3BlbnNzbF9pbmZvID0gewogICAgICAgICd2ZXJzaW9uJzogTm9uZSwKICAgICAgICAnb3BlbnNzbF92ZXJzaW9uJzogJycsCiAgICB9CiAgICBpZiBPcGVuU1NMOgogICAgICAgIHB5b3BlbnNzbF9pbmZvID0gewogICAgICAgICAgICAndmVyc2lvbic6IE9wZW5TU0wuX192ZXJzaW9uX18sCiAgICAgICAgICAgICdvcGVuc3NsX3ZlcnNpb24nOiAnJXgnICUgT3BlblNTTC5TU0wuT1BFTlNTTF9WRVJTSU9OX05VTUJFUiwKICAgICAgICB9CiAgICBjcnlwdG9ncmFwaHlfaW5mbyA9IHsKICAgICAgICAndmVyc2lvbic6IGdldGF0dHIoY3J5cHRvZ3JhcGh5LCAnX192ZXJzaW9uX18nLCAnJyksCiAgICB9CiAgICBpZG5hX2luZm8gPSB7CiAgICAgICAgJ3ZlcnNpb24nOiBnZXRhdHRyKGlkbmEsICdfX3ZlcnNpb25fXycsICcnKSwKICAgIH0KCiAgICAjIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgZG9lc24ndCBleGlzdCBpbiB0aGUgUHl0aG9uIDIuNiBzc2wgbW9kdWxlLgogICAgc3lzdGVtX3NzbCA9IGdldGF0dHIoc3NsLCAnT1BFTlNTTF9WRVJTSU9OX05VTUJFUicsIE5vbmUpCiAgICBzeXN0ZW1fc3NsX2luZm8gPSB7CiAgICAgICAgJ3ZlcnNpb24nOiAnJXgnICUgc3lzdGVtX3NzbCBpZiBzeXN0ZW1fc3NsIGlzIG5vdCBOb25lIGVsc2UgJycKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgICdwbGF0Zm9ybSc6IHBsYXRmb3JtX2luZm8sCiAgICAgICAgJ2ltcGxlbWVudGF0aW9uJzogaW1wbGVtZW50YXRpb25faW5mbywKICAgICAgICAnc3lzdGVtX3NzbCc6IHN5c3RlbV9zc2xfaW5mbywKICAgICAgICAndXNpbmdfcHlvcGVuc3NsJzogcHlvcGVuc3NsIGlzIG5vdCBOb25lLAogICAgICAgICdweU9wZW5TU0wnOiBweW9wZW5zc2xfaW5mbywKICAgICAgICAndXJsbGliMyc6IHVybGxpYjNfaW5mbywKICAgICAgICAnY2hhcmRldCc6IGNoYXJkZXRfaW5mbywKICAgICAgICAnY3J5cHRvZ3JhcGh5JzogY3J5cHRvZ3JhcGh5X2luZm8sCiAgICAgICAgJ2lkbmEnOiBpZG5hX2luZm8sCiAgICAgICAgJ3JlcXVlc3RzJzogewogICAgICAgICAgICAndmVyc2lvbic6IHJlcXVlc3RzX3ZlcnNpb24sCiAgICAgICAgfSwKICAgIH0KCgpkZWYgbWFpbigpOgogICAgIiIiUHJldHR5LXByaW50IHRoZSBidWcgaW5mb3JtYXRpb24gYXMgSlNPTi4iIiIKICAgIHByaW50KGpzb24uZHVtcHMoaW5mbygpLCBzb3J0X2tleXM9VHJ1ZSwgaW5kZW50PTIpKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQB52qPK/wIAAP8CAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9ob29rcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuaG9va3MKfn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBjYXBhYmlsaXRpZXMgZm9yIHRoZSBSZXF1ZXN0cyBob29rcyBzeXN0ZW0uCgpBdmFpbGFibGUgaG9va3M6CgpgYHJlc3BvbnNlYGA6CiAgICBUaGUgcmVzcG9uc2UgZ2VuZXJhdGVkIGZyb20gYSBSZXF1ZXN0LgoiIiIKSE9PS1MgPSBbJ3Jlc3BvbnNlJ10KCgpkZWYgZGVmYXVsdF9ob29rcygpOgogICAgcmV0dXJuIGRpY3QoKGV2ZW50LCBbXSkgZm9yIGV2ZW50IGluIEhPT0tTKQoKIyBUT0RPOiByZXNwb25zZSBpcyB0aGUgb25seSBvbmUKCgpkZWYgZGlzcGF0Y2hfaG9vayhrZXksIGhvb2tzLCBob29rX2RhdGEsICoqa3dhcmdzKToKICAgICIiIkRpc3BhdGNoZXMgYSBob29rIGRpY3Rpb25hcnkgb24gYSBnaXZlbiBwaWVjZSBvZiBkYXRhLiIiIgogICAgaG9va3MgPSBob29rcyBvciBkaWN0KCkKICAgIGhvb2tzID0gaG9va3MuZ2V0KGtleSkKICAgIGlmIGhvb2tzOgogICAgICAgIGlmIGhhc2F0dHIoaG9va3MsICdfX2NhbGxfXycpOgogICAgICAgICAgICBob29rcyA9IFtob29rc10KICAgICAgICBmb3IgaG9vayBpbiBob29rczoKICAgICAgICAgICAgX2hvb2tfZGF0YSA9IGhvb2soaG9va19kYXRhLCAqKmt3YXJncykKICAgICAgICAgICAgaWYgX2hvb2tfZGF0YSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGhvb2tfZGF0YSA9IF9ob29rX2RhdGEKICAgIHJldHVybiBob29rX2RhdGEKUEsDBBQAAAAAAAAAIQBlfUd0A4UAAAOFAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9tb2RlbHMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLm1vZGVscwp+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBwcmltYXJ5IG9iamVjdHMgdGhhdCBwb3dlciBSZXF1ZXN0cy4KIiIiCgppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGRhdGV0aW1lCmltcG9ydCBzeXMKCiMgSW1wb3J0IGVuY29kaW5nIG5vdywgdG8gYXZvaWQgaW1wbGljaXQgaW1wb3J0IGxhdGVyLgojIEltcGxpY2l0IGltcG9ydCB3aXRoaW4gdGhyZWFkcyBtYXkgY2F1c2UgTG9va3VwRXJyb3Igd2hlbiBzdGFuZGFyZCBsaWJyYXJ5IGlzIGluIGEgWklQLAojIHN1Y2ggYXMgaW4gRW1iZWRkZWQgUHl0aG9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3RzL3JlcXVlc3RzL2lzc3Vlcy8zNTc4LgppbXBvcnQgZW5jb2RpbmdzLmlkbmEKCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5maWVsZHMgaW1wb3J0IFJlcXVlc3RGaWVsZApmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZmlsZXBvc3QgaW1wb3J0IGVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnV0aWwgaW1wb3J0IHBhcnNlX3VybApmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgRGVjb2RlRXJyb3IsIFJlYWRUaW1lb3V0RXJyb3IsIFByb3RvY29sRXJyb3IsIExvY2F0aW9uUGFyc2VFcnJvcikKCmZyb20gaW8gaW1wb3J0IFVuc3VwcG9ydGVkT3BlcmF0aW9uCmZyb20gLmhvb2tzIGltcG9ydCBkZWZhdWx0X2hvb2tzCmZyb20gLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKCmZyb20gLmF1dGggaW1wb3J0IEhUVFBCYXNpY0F1dGgKZnJvbSAuY29va2llcyBpbXBvcnQgY29va2llamFyX2Zyb21fZGljdCwgZ2V0X2Nvb2tpZV9oZWFkZXIsIF9jb3B5X2Nvb2tpZV9qYXIKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSFRUUEVycm9yLCBNaXNzaW5nU2NoZW1hLCBJbnZhbGlkVVJMLCBDaHVua2VkRW5jb2RpbmdFcnJvciwKICAgIENvbnRlbnREZWNvZGluZ0Vycm9yLCBDb25uZWN0aW9uRXJyb3IsIFN0cmVhbUNvbnN1bWVkRXJyb3IpCmZyb20gLl9pbnRlcm5hbF91dGlscyBpbXBvcnQgdG9fbmF0aXZlX3N0cmluZywgdW5pY29kZV9pc19hc2NpaQpmcm9tIC51dGlscyBpbXBvcnQgKAogICAgZ3Vlc3NfZmlsZW5hbWUsIGdldF9hdXRoX2Zyb21fdXJsLCByZXF1b3RlX3VyaSwKICAgIHN0cmVhbV9kZWNvZGVfcmVzcG9uc2VfdW5pY29kZSwgdG9fa2V5X3ZhbF9saXN0LCBwYXJzZV9oZWFkZXJfbGlua3MsCiAgICBpdGVyX3NsaWNlcywgZ3Vlc3NfanNvbl91dGYsIHN1cGVyX2xlbiwgY2hlY2tfaGVhZGVyX3ZhbGlkaXR5KQpmcm9tIC5jb21wYXQgaW1wb3J0ICgKICAgIGNvb2tpZWxpYiwgdXJsdW5wYXJzZSwgdXJsc3BsaXQsIHVybGVuY29kZSwgc3RyLCBieXRlcywKICAgIGlzX3B5MiwgY2hhcmRldCwgYnVpbHRpbl9zdHIsIGJhc2VzdHJpbmcpCmZyb20gLmNvbXBhdCBpbXBvcnQganNvbiBhcyBjb21wbGV4anNvbgpmcm9tIC5zdGF0dXNfY29kZXMgaW1wb3J0IGNvZGVzCgojOiBUaGUgc2V0IG9mIEhUVFAgc3RhdHVzIGNvZGVzIHRoYXQgaW5kaWNhdGUgYW4gYXV0b21hdGljYWxseQojOiBwcm9jZXNzYWJsZSByZWRpcmVjdC4KUkVESVJFQ1RfU1RBVEkgPSAoCiAgICBjb2Rlcy5tb3ZlZCwgICAgICAgICAgICAgICAjIDMwMQogICAgY29kZXMuZm91bmQsICAgICAgICAgICAgICAgIyAzMDIKICAgIGNvZGVzLm90aGVyLCAgICAgICAgICAgICAgICMgMzAzCiAgICBjb2Rlcy50ZW1wb3JhcnlfcmVkaXJlY3QsICAjIDMwNwogICAgY29kZXMucGVybWFuZW50X3JlZGlyZWN0LCAgIyAzMDgKKQoKREVGQVVMVF9SRURJUkVDVF9MSU1JVCA9IDMwCkNPTlRFTlRfQ0hVTktfU0laRSA9IDEwICogMTAyNApJVEVSX0NIVU5LX1NJWkUgPSA1MTIKCgpjbGFzcyBSZXF1ZXN0RW5jb2RpbmdNaXhpbihvYmplY3QpOgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aF91cmwoc2VsZik6CiAgICAgICAgIiIiQnVpbGQgdGhlIHBhdGggVVJMIHRvIHVzZS4iIiIKCiAgICAgICAgdXJsID0gW10KCiAgICAgICAgcCA9IHVybHNwbGl0KHNlbGYudXJsKQoKICAgICAgICBwYXRoID0gcC5wYXRoCiAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgIHBhdGggPSAnLycKCiAgICAgICAgdXJsLmFwcGVuZChwYXRoKQoKICAgICAgICBxdWVyeSA9IHAucXVlcnkKICAgICAgICBpZiBxdWVyeToKICAgICAgICAgICAgdXJsLmFwcGVuZCgnPycpCiAgICAgICAgICAgIHVybC5hcHBlbmQocXVlcnkpCgogICAgICAgIHJldHVybiAnJy5qb2luKHVybCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2VuY29kZV9wYXJhbXMoZGF0YSk6CiAgICAgICAgIiIiRW5jb2RlIHBhcmFtZXRlcnMgaW4gYSBwaWVjZSBvZiBkYXRhLgoKICAgICAgICBXaWxsIHN1Y2Nlc3NmdWxseSBlbmNvZGUgcGFyYW1ldGVycyB3aGVuIHBhc3NlZCBhcyBhIGRpY3Qgb3IgYSBsaXN0IG9mCiAgICAgICAgMi10dXBsZXMuIE9yZGVyIGlzIHJldGFpbmVkIGlmIGRhdGEgaXMgYSBsaXN0IG9mIDItdHVwbGVzIGJ1dCBhcmJpdHJhcnkKICAgICAgICBpZiBwYXJhbWV0ZXJzIGFyZSBzdXBwbGllZCBhcyBhIGRpY3QuCiAgICAgICAgIiIiCgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgKHN0ciwgYnl0ZXMpKToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKICAgICAgICBlbGlmIGhhc2F0dHIoZGF0YSwgJ3JlYWQnKToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKICAgICAgICBlbGlmIGhhc2F0dHIoZGF0YSwgJ19faXRlcl9fJyk6CiAgICAgICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgICAgIGZvciBrLCB2cyBpbiB0b19rZXlfdmFsX2xpc3QoZGF0YSk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZzLCBiYXNlc3RyaW5nKSBvciBub3QgaGFzYXR0cih2cywgJ19faXRlcl9fJyk6CiAgICAgICAgICAgICAgICAgICAgdnMgPSBbdnNdCiAgICAgICAgICAgICAgICBmb3IgdiBpbiB2czoKICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGsuZW5jb2RlKCd1dGYtOCcpIGlmIGlzaW5zdGFuY2Uoaywgc3RyKSBlbHNlIGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5lbmNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZSh2LCBzdHIpIGVsc2UgdikpCiAgICAgICAgICAgIHJldHVybiB1cmxlbmNvZGUocmVzdWx0LCBkb3NlcT1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBkYXRhCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9lbmNvZGVfZmlsZXMoZmlsZXMsIGRhdGEpOgogICAgICAgICIiIkJ1aWxkIHRoZSBib2R5IGZvciBhIG11bHRpcGFydC9mb3JtLWRhdGEgcmVxdWVzdC4KCiAgICAgICAgV2lsbCBzdWNjZXNzZnVsbHkgZW5jb2RlIGZpbGVzIHdoZW4gcGFzc2VkIGFzIGEgZGljdCBvciBhIGxpc3Qgb2YKICAgICAgICB0dXBsZXMuIE9yZGVyIGlzIHJldGFpbmVkIGlmIGRhdGEgaXMgYSBsaXN0IG9mIHR1cGxlcyBidXQgYXJiaXRyYXJ5CiAgICAgICAgaWYgcGFyYW1ldGVycyBhcmUgc3VwcGxpZWQgYXMgYSBkaWN0LgogICAgICAgIFRoZSB0dXBsZXMgbWF5IGJlIDItdHVwbGVzIChmaWxlbmFtZSwgZmlsZW9iaiksIDMtdHVwbGVzIChmaWxlbmFtZSwgZmlsZW9iaiwgY29udGVudHlwZSkKICAgICAgICBvciA0LXR1cGxlcyAoZmlsZW5hbWUsIGZpbGVvYmosIGNvbnRlbnR5cGUsIGN1c3RvbV9oZWFkZXJzKS4KICAgICAgICAiIiIKICAgICAgICBpZiAobm90IGZpbGVzKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRmlsZXMgbXVzdCBiZSBwcm92aWRlZC4iKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRGF0YSBtdXN0IG5vdCBiZSBhIHN0cmluZy4iKQoKICAgICAgICBuZXdfZmllbGRzID0gW10KICAgICAgICBmaWVsZHMgPSB0b19rZXlfdmFsX2xpc3QoZGF0YSBvciB7fSkKICAgICAgICBmaWxlcyA9IHRvX2tleV92YWxfbGlzdChmaWxlcyBvciB7fSkKCiAgICAgICAgZm9yIGZpZWxkLCB2YWwgaW4gZmllbGRzOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbCwgYmFzZXN0cmluZykgb3Igbm90IGhhc2F0dHIodmFsLCAnX19pdGVyX18nKToKICAgICAgICAgICAgICAgIHZhbCA9IFt2YWxdCiAgICAgICAgICAgIGZvciB2IGluIHZhbDoKICAgICAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBjYWxsIHN0cigpIG9uIGJ5dGVzdHJpbmdzOiBpbiBQeTMgaXQgYWxsIGdvZXMgd3JvbmcuCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodiwgYnl0ZXMpOgogICAgICAgICAgICAgICAgICAgICAgICB2ID0gc3RyKHYpCgogICAgICAgICAgICAgICAgICAgIG5ld19maWVsZHMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAoZmllbGQuZGVjb2RlKCd1dGYtOCcpIGlmIGlzaW5zdGFuY2UoZmllbGQsIGJ5dGVzKSBlbHNlIGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgdi5lbmNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZSh2LCBzdHIpIGVsc2UgdikpCgogICAgICAgIGZvciAoaywgdikgaW4gZmlsZXM6CiAgICAgICAgICAgICMgc3VwcG9ydCBmb3IgZXhwbGljaXQgZmlsZW5hbWUKICAgICAgICAgICAgZnQgPSBOb25lCiAgICAgICAgICAgIGZoID0gTm9uZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsICh0dXBsZSwgbGlzdCkpOgogICAgICAgICAgICAgICAgaWYgbGVuKHYpID09IDI6CiAgICAgICAgICAgICAgICAgICAgZm4sIGZwID0gdgogICAgICAgICAgICAgICAgZWxpZiBsZW4odikgPT0gMzoKICAgICAgICAgICAgICAgICAgICBmbiwgZnAsIGZ0ID0gdgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmbiwgZnAsIGZ0LCBmaCA9IHYKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZuID0gZ3Vlc3NfZmlsZW5hbWUodikgb3IgawogICAgICAgICAgICAgICAgZnAgPSB2CgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZwLCAoc3RyLCBieXRlcywgYnl0ZWFycmF5KSk6CiAgICAgICAgICAgICAgICBmZGF0YSA9IGZwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmZGF0YSA9IGZwLnJlYWQoKQoKICAgICAgICAgICAgcmYgPSBSZXF1ZXN0RmllbGQobmFtZT1rLCBkYXRhPWZkYXRhLCBmaWxlbmFtZT1mbiwgaGVhZGVycz1maCkKICAgICAgICAgICAgcmYubWFrZV9tdWx0aXBhcnQoY29udGVudF90eXBlPWZ0KQogICAgICAgICAgICBuZXdfZmllbGRzLmFwcGVuZChyZikKCiAgICAgICAgYm9keSwgY29udGVudF90eXBlID0gZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YShuZXdfZmllbGRzKQoKICAgICAgICByZXR1cm4gYm9keSwgY29udGVudF90eXBlCgoKY2xhc3MgUmVxdWVzdEhvb2tzTWl4aW4ob2JqZWN0KToKICAgIGRlZiByZWdpc3Rlcl9ob29rKHNlbGYsIGV2ZW50LCBob29rKToKICAgICAgICAiIiJQcm9wZXJseSByZWdpc3RlciBhIGhvb2suIiIiCgogICAgICAgIGlmIGV2ZW50IG5vdCBpbiBzZWxmLmhvb2tzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbnN1cHBvcnRlZCBldmVudCBzcGVjaWZpZWQsIHdpdGggZXZlbnQgbmFtZSAiJXMiJyAlIChldmVudCkpCgogICAgICAgIGlmIGlzaW5zdGFuY2UoaG9vaywgY29sbGVjdGlvbnMuQ2FsbGFibGUpOgogICAgICAgICAgICBzZWxmLmhvb2tzW2V2ZW50XS5hcHBlbmQoaG9vaykKICAgICAgICBlbGlmIGhhc2F0dHIoaG9vaywgJ19faXRlcl9fJyk6CiAgICAgICAgICAgIHNlbGYuaG9va3NbZXZlbnRdLmV4dGVuZChoIGZvciBoIGluIGhvb2sgaWYgaXNpbnN0YW5jZShoLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkpCgogICAgZGVmIGRlcmVnaXN0ZXJfaG9vayhzZWxmLCBldmVudCwgaG9vayk6CiAgICAgICAgIiIiRGVyZWdpc3RlciBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBob29rLgogICAgICAgIFJldHVybnMgVHJ1ZSBpZiB0aGUgaG9vayBleGlzdGVkLCBGYWxzZSBpZiBub3QuCiAgICAgICAgIiIiCgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5ob29rc1tldmVudF0ucmVtb3ZlKGhvb2spCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKCmNsYXNzIFJlcXVlc3QoUmVxdWVzdEhvb2tzTWl4aW4pOgogICAgIiIiQSB1c2VyLWNyZWF0ZWQgOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAgb2JqZWN0LgoKICAgIFVzZWQgdG8gcHJlcGFyZSBhIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCwgd2hpY2ggaXMgc2VudCB0byB0aGUgc2VydmVyLgoKICAgIDpwYXJhbSBtZXRob2Q6IEhUVFAgbWV0aG9kIHRvIHVzZS4KICAgIDpwYXJhbSB1cmw6IFVSTCB0byBzZW5kLgogICAgOnBhcmFtIGhlYWRlcnM6IGRpY3Rpb25hcnkgb2YgaGVhZGVycyB0byBzZW5kLgogICAgOnBhcmFtIGZpbGVzOiBkaWN0aW9uYXJ5IG9mIHtmaWxlbmFtZTogZmlsZW9iamVjdH0gZmlsZXMgdG8gbXVsdGlwYXJ0IHVwbG9hZC4KICAgIDpwYXJhbSBkYXRhOiB0aGUgYm9keSB0byBhdHRhY2ggdG8gdGhlIHJlcXVlc3QuIElmIGEgZGljdGlvbmFyeSBpcyBwcm92aWRlZCwgZm9ybS1lbmNvZGluZyB3aWxsIHRha2UgcGxhY2UuCiAgICA6cGFyYW0ganNvbjoganNvbiBmb3IgdGhlIGJvZHkgdG8gYXR0YWNoIHRvIHRoZSByZXF1ZXN0IChpZiBmaWxlcyBvciBkYXRhIGlzIG5vdCBzcGVjaWZpZWQpLgogICAgOnBhcmFtIHBhcmFtczogZGljdGlvbmFyeSBvZiBVUkwgcGFyYW1ldGVycyB0byBhcHBlbmQgdG8gdGhlIFVSTC4KICAgIDpwYXJhbSBhdXRoOiBBdXRoIGhhbmRsZXIgb3IgKHVzZXIsIHBhc3MpIHR1cGxlLgogICAgOnBhcmFtIGNvb2tpZXM6IGRpY3Rpb25hcnkgb3IgQ29va2llSmFyIG9mIGNvb2tpZXMgdG8gYXR0YWNoIHRvIHRoaXMgcmVxdWVzdC4KICAgIDpwYXJhbSBob29rczogZGljdGlvbmFyeSBvZiBjYWxsYmFjayBob29rcywgZm9yIGludGVybmFsIHVzYWdlLgoKICAgIFVzYWdlOjoKCiAgICAgID4+PiBpbXBvcnQgcmVxdWVzdHMKICAgICAgPj4+IHJlcSA9IHJlcXVlc3RzLlJlcXVlc3QoJ0dFVCcsICdodHRwOi8vaHR0cGJpbi5vcmcvZ2V0JykKICAgICAgPj4+IHJlcS5wcmVwYXJlKCkKICAgICAgPFByZXBhcmVkUmVxdWVzdCBbR0VUXT4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICBtZXRob2Q9Tm9uZSwgdXJsPU5vbmUsIGhlYWRlcnM9Tm9uZSwgZmlsZXM9Tm9uZSwgZGF0YT1Ob25lLAogICAgICAgICAgICBwYXJhbXM9Tm9uZSwgYXV0aD1Ob25lLCBjb29raWVzPU5vbmUsIGhvb2tzPU5vbmUsIGpzb249Tm9uZSk6CgogICAgICAgICMgRGVmYXVsdCBlbXB0eSBkaWN0cyBmb3IgZGljdCBwYXJhbXMuCiAgICAgICAgZGF0YSA9IFtdIGlmIGRhdGEgaXMgTm9uZSBlbHNlIGRhdGEKICAgICAgICBmaWxlcyA9IFtdIGlmIGZpbGVzIGlzIE5vbmUgZWxzZSBmaWxlcwogICAgICAgIGhlYWRlcnMgPSB7fSBpZiBoZWFkZXJzIGlzIE5vbmUgZWxzZSBoZWFkZXJzCiAgICAgICAgcGFyYW1zID0ge30gaWYgcGFyYW1zIGlzIE5vbmUgZWxzZSBwYXJhbXMKICAgICAgICBob29rcyA9IHt9IGlmIGhvb2tzIGlzIE5vbmUgZWxzZSBob29rcwoKICAgICAgICBzZWxmLmhvb2tzID0gZGVmYXVsdF9ob29rcygpCiAgICAgICAgZm9yIChrLCB2KSBpbiBsaXN0KGhvb2tzLml0ZW1zKCkpOgogICAgICAgICAgICBzZWxmLnJlZ2lzdGVyX2hvb2soZXZlbnQ9aywgaG9vaz12KQoKICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycwogICAgICAgIHNlbGYuZmlsZXMgPSBmaWxlcwogICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKICAgICAgICBzZWxmLmpzb24gPSBqc29uCiAgICAgICAgc2VsZi5wYXJhbXMgPSBwYXJhbXMKICAgICAgICBzZWxmLmF1dGggPSBhdXRoCiAgICAgICAgc2VsZi5jb29raWVzID0gY29va2llcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxSZXF1ZXN0IFslc10+JyAlIChzZWxmLm1ldGhvZCkKCiAgICBkZWYgcHJlcGFyZShzZWxmKToKICAgICAgICAiIiJDb25zdHJ1Y3RzIGEgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIGZvciB0cmFuc21pc3Npb24gYW5kIHJldHVybnMgaXQuIiIiCiAgICAgICAgcCA9IFByZXBhcmVkUmVxdWVzdCgpCiAgICAgICAgcC5wcmVwYXJlKAogICAgICAgICAgICBtZXRob2Q9c2VsZi5tZXRob2QsCiAgICAgICAgICAgIHVybD1zZWxmLnVybCwKICAgICAgICAgICAgaGVhZGVycz1zZWxmLmhlYWRlcnMsCiAgICAgICAgICAgIGZpbGVzPXNlbGYuZmlsZXMsCiAgICAgICAgICAgIGRhdGE9c2VsZi5kYXRhLAogICAgICAgICAgICBqc29uPXNlbGYuanNvbiwKICAgICAgICAgICAgcGFyYW1zPXNlbGYucGFyYW1zLAogICAgICAgICAgICBhdXRoPXNlbGYuYXV0aCwKICAgICAgICAgICAgY29va2llcz1zZWxmLmNvb2tpZXMsCiAgICAgICAgICAgIGhvb2tzPXNlbGYuaG9va3MsCiAgICAgICAgKQogICAgICAgIHJldHVybiBwCgoKY2xhc3MgUHJlcGFyZWRSZXF1ZXN0KFJlcXVlc3RFbmNvZGluZ01peGluLCBSZXF1ZXN0SG9va3NNaXhpbik6CiAgICAiIiJUaGUgZnVsbHkgbXV0YWJsZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgb2JqZWN0LAogICAgY29udGFpbmluZyB0aGUgZXhhY3QgYnl0ZXMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4KCiAgICBHZW5lcmF0ZWQgZnJvbSBlaXRoZXIgYSA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YCBvYmplY3Qgb3IgbWFudWFsbHkuCgogICAgVXNhZ2U6OgoKICAgICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICAgICA+Pj4gcmVxID0gcmVxdWVzdHMuUmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA+Pj4gciA9IHJlcS5wcmVwYXJlKCkKICAgICAgPFByZXBhcmVkUmVxdWVzdCBbR0VUXT4KCiAgICAgID4+PiBzID0gcmVxdWVzdHMuU2Vzc2lvbigpCiAgICAgID4+PiBzLnNlbmQocikKICAgICAgPFJlc3BvbnNlIFsyMDBdPgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICM6IEhUVFAgdmVyYiB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCiAgICAgICAgc2VsZi5tZXRob2QgPSBOb25lCiAgICAgICAgIzogSFRUUCBVUkwgdG8gc2VuZCB0aGUgcmVxdWVzdCB0by4KICAgICAgICBzZWxmLnVybCA9IE5vbmUKICAgICAgICAjOiBkaWN0aW9uYXJ5IG9mIEhUVFAgaGVhZGVycy4KICAgICAgICBzZWxmLmhlYWRlcnMgPSBOb25lCiAgICAgICAgIyBUaGUgYENvb2tpZUphcmAgdXNlZCB0byBjcmVhdGUgdGhlIENvb2tpZSBoZWFkZXIgd2lsbCBiZSBzdG9yZWQgaGVyZQogICAgICAgICMgYWZ0ZXIgcHJlcGFyZV9jb29raWVzIGlzIGNhbGxlZAogICAgICAgIHNlbGYuX2Nvb2tpZXMgPSBOb25lCiAgICAgICAgIzogcmVxdWVzdCBib2R5IHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KICAgICAgICBzZWxmLmJvZHkgPSBOb25lCiAgICAgICAgIzogZGljdGlvbmFyeSBvZiBjYWxsYmFjayBob29rcywgZm9yIGludGVybmFsIHVzYWdlLgogICAgICAgIHNlbGYuaG9va3MgPSBkZWZhdWx0X2hvb2tzKCkKICAgICAgICAjOiBpbnRlZ2VyIGRlbm90aW5nIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGEgcmVhZGFibGUgZmlsZS1saWtlIGJvZHkuCiAgICAgICAgc2VsZi5fYm9keV9wb3NpdGlvbiA9IE5vbmUKCiAgICBkZWYgcHJlcGFyZShzZWxmLAogICAgICAgICAgICBtZXRob2Q9Tm9uZSwgdXJsPU5vbmUsIGhlYWRlcnM9Tm9uZSwgZmlsZXM9Tm9uZSwgZGF0YT1Ob25lLAogICAgICAgICAgICBwYXJhbXM9Tm9uZSwgYXV0aD1Ob25lLCBjb29raWVzPU5vbmUsIGhvb2tzPU5vbmUsIGpzb249Tm9uZSk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGVudGlyZSByZXF1ZXN0IHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuIiIiCgogICAgICAgIHNlbGYucHJlcGFyZV9tZXRob2QobWV0aG9kKQogICAgICAgIHNlbGYucHJlcGFyZV91cmwodXJsLCBwYXJhbXMpCiAgICAgICAgc2VsZi5wcmVwYXJlX2hlYWRlcnMoaGVhZGVycykKICAgICAgICBzZWxmLnByZXBhcmVfY29va2llcyhjb29raWVzKQogICAgICAgIHNlbGYucHJlcGFyZV9ib2R5KGRhdGEsIGZpbGVzLCBqc29uKQogICAgICAgIHNlbGYucHJlcGFyZV9hdXRoKGF1dGgsIHVybCkKCiAgICAgICAgIyBOb3RlIHRoYXQgcHJlcGFyZV9hdXRoIG11c3QgYmUgbGFzdCB0byBlbmFibGUgYXV0aGVudGljYXRpb24gc2NoZW1lcwogICAgICAgICMgc3VjaCBhcyBPQXV0aCB0byB3b3JrIG9uIGEgZnVsbHkgcHJlcGFyZWQgcmVxdWVzdC4KCiAgICAgICAgIyBUaGlzIE1VU1QgZ28gYWZ0ZXIgcHJlcGFyZV9hdXRoLiBBdXRoZW50aWNhdG9ycyBjb3VsZCBhZGQgYSBob29rCiAgICAgICAgc2VsZi5wcmVwYXJlX2hvb2tzKGhvb2tzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxQcmVwYXJlZFJlcXVlc3QgWyVzXT4nICUgKHNlbGYubWV0aG9kKQoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIHAgPSBQcmVwYXJlZFJlcXVlc3QoKQogICAgICAgIHAubWV0aG9kID0gc2VsZi5tZXRob2QKICAgICAgICBwLnVybCA9IHNlbGYudXJsCiAgICAgICAgcC5oZWFkZXJzID0gc2VsZi5oZWFkZXJzLmNvcHkoKSBpZiBzZWxmLmhlYWRlcnMgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAgICAgICAgcC5fY29va2llcyA9IF9jb3B5X2Nvb2tpZV9qYXIoc2VsZi5fY29va2llcykKICAgICAgICBwLmJvZHkgPSBzZWxmLmJvZHkKICAgICAgICBwLmhvb2tzID0gc2VsZi5ob29rcwogICAgICAgIHAuX2JvZHlfcG9zaXRpb24gPSBzZWxmLl9ib2R5X3Bvc2l0aW9uCiAgICAgICAgcmV0dXJuIHAKCiAgICBkZWYgcHJlcGFyZV9tZXRob2Qoc2VsZiwgbWV0aG9kKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBtZXRob2QuIiIiCiAgICAgICAgc2VsZi5tZXRob2QgPSBtZXRob2QKICAgICAgICBpZiBzZWxmLm1ldGhvZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5tZXRob2QgPSB0b19uYXRpdmVfc3RyaW5nKHNlbGYubWV0aG9kLnVwcGVyKCkpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfaWRuYV9lbmNvZGVkX2hvc3QoaG9zdCk6CiAgICAgICAgaW1wb3J0IGlkbmEKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBob3N0ID0gaWRuYS5lbmNvZGUoaG9zdCwgdXRzNDY9VHJ1ZSkuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgZXhjZXB0IGlkbmEuSUROQUVycm9yOgogICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IKICAgICAgICByZXR1cm4gaG9zdAoKICAgIGRlZiBwcmVwYXJlX3VybChzZWxmLCB1cmwsIHBhcmFtcyk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIEhUVFAgVVJMLiIiIgogICAgICAgICM6IEFjY2VwdCBvYmplY3RzIHRoYXQgaGF2ZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zLgogICAgICAgICM6IFdlJ3JlIHVuYWJsZSB0byBibGluZGx5IGNhbGwgdW5pY29kZS9zdHIgZnVuY3Rpb25zCiAgICAgICAgIzogYXMgdGhpcyB3aWxsIGluY2x1ZGUgdGhlIGJ5dGVzdHJpbmcgaW5kaWNhdG9yIChiJycpCiAgICAgICAgIzogb24gcHl0aG9uIDMueC4KICAgICAgICAjOiBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvcHVsbC8yMjM4CiAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmwsIGJ5dGVzKToKICAgICAgICAgICAgdXJsID0gdXJsLmRlY29kZSgndXRmOCcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdXJsID0gdW5pY29kZSh1cmwpIGlmIGlzX3B5MiBlbHNlIHN0cih1cmwpCgogICAgICAgICMgUmVtb3ZlIGxlYWRpbmcgd2hpdGVzcGFjZXMgZnJvbSB1cmwKICAgICAgICB1cmwgPSB1cmwubHN0cmlwKCkKCiAgICAgICAgIyBEb24ndCBkbyBhbnkgVVJMIHByZXBhcmF0aW9uIGZvciBub24tSFRUUCBzY2hlbWVzIGxpa2UgYG1haWx0b2AsCiAgICAgICAgIyBgZGF0YWAgZXRjIHRvIHdvcmsgYXJvdW5kIGV4Y2VwdGlvbnMgZnJvbSBgdXJsX3BhcnNlYCwgd2hpY2gKICAgICAgICAjIGhhbmRsZXMgUkZDIDM5ODYgb25seS4KICAgICAgICBpZiAnOicgaW4gdXJsIGFuZCBub3QgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnaHR0cCcpOgogICAgICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBTdXBwb3J0IGZvciB1bmljb2RlIGRvbWFpbiBuYW1lcyBhbmQgcGF0aHMuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzY2hlbWUsIGF1dGgsIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCA9IHBhcnNlX3VybCh1cmwpCiAgICAgICAgZXhjZXB0IExvY2F0aW9uUGFyc2VFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVVJMKCplLmFyZ3MpCgogICAgICAgIGlmIG5vdCBzY2hlbWU6CiAgICAgICAgICAgIGVycm9yID0gKCJJbnZhbGlkIFVSTCB7MCFyfTogTm8gc2NoZW1hIHN1cHBsaWVkLiBQZXJoYXBzIHlvdSBtZWFudCBodHRwOi8vezB9PyIpCiAgICAgICAgICAgIGVycm9yID0gZXJyb3IuZm9ybWF0KHRvX25hdGl2ZV9zdHJpbmcodXJsLCAndXRmOCcpKQoKICAgICAgICAgICAgcmFpc2UgTWlzc2luZ1NjaGVtYShlcnJvcikKCiAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRVUkwoIkludmFsaWQgVVJMICVyOiBObyBob3N0IHN1cHBsaWVkIiAlIHVybCkKCiAgICAgICAgIyBJbiBnZW5lcmFsLCB3ZSB3YW50IHRvIHRyeSBJRE5BIGVuY29kaW5nIHRoZSBob3N0bmFtZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zCiAgICAgICAgIyBub24tQVNDSUkgY2hhcmFjdGVycy4gVGhpcyBhbGxvd3MgdXNlcnMgdG8gYXV0b21hdGljYWxseSBnZXQgdGhlIGNvcnJlY3QgSUROQQogICAgICAgICMgYmVoYXZpb3VyLiBGb3Igc3RyaW5ncyBjb250YWluaW5nIG9ubHkgQVNDSUkgY2hhcmFjdGVycywgd2UgbmVlZCB0byBhbHNvIHZlcmlmeQogICAgICAgICMgaXQgZG9lc24ndCBzdGFydCB3aXRoIGEgd2lsZGNhcmQgKCopLCBiZWZvcmUgYWxsb3dpbmcgdGhlIHVuZW5jb2RlZCBob3N0bmFtZS4KICAgICAgICBpZiBub3QgdW5pY29kZV9pc19hc2NpaShob3N0KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaG9zdCA9IHNlbGYuX2dldF9pZG5hX2VuY29kZWRfaG9zdChob3N0KQogICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgnVVJMIGhhcyBhbiBpbnZhbGlkIGxhYmVsLicpCiAgICAgICAgZWxpZiBob3N0LnN0YXJ0c3dpdGgodScqJyk6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRVUkwoJ1VSTCBoYXMgYW4gaW52YWxpZCBsYWJlbC4nKQoKICAgICAgICAjIENhcmVmdWxseSByZWNvbnN0cnVjdCB0aGUgbmV0d29yayBsb2NhdGlvbgogICAgICAgIG5ldGxvYyA9IGF1dGggb3IgJycKICAgICAgICBpZiBuZXRsb2M6CiAgICAgICAgICAgIG5ldGxvYyArPSAnQCcKICAgICAgICBuZXRsb2MgKz0gaG9zdAogICAgICAgIGlmIHBvcnQ6CiAgICAgICAgICAgIG5ldGxvYyArPSAnOicgKyBzdHIocG9ydCkKCiAgICAgICAgIyBCYXJlIGRvbWFpbnMgYXJlbid0IHZhbGlkIFVSTHMuCiAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgIHBhdGggPSAnLycKCiAgICAgICAgaWYgaXNfcHkyOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNjaGVtZSwgc3RyKToKICAgICAgICAgICAgICAgIHNjaGVtZSA9IHNjaGVtZS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuZXRsb2MsIHN0cik6CiAgICAgICAgICAgICAgICBuZXRsb2MgPSBuZXRsb2MuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgc3RyKToKICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHF1ZXJ5LCBzdHIpOgogICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmcmFnbWVudCwgc3RyKToKICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQuZW5jb2RlKCd1dGYtOCcpCgogICAgICAgIGlmIGlzaW5zdGFuY2UocGFyYW1zLCAoc3RyLCBieXRlcykpOgogICAgICAgICAgICBwYXJhbXMgPSB0b19uYXRpdmVfc3RyaW5nKHBhcmFtcykKCiAgICAgICAgZW5jX3BhcmFtcyA9IHNlbGYuX2VuY29kZV9wYXJhbXMocGFyYW1zKQogICAgICAgIGlmIGVuY19wYXJhbXM6CiAgICAgICAgICAgIGlmIHF1ZXJ5OgogICAgICAgICAgICAgICAgcXVlcnkgPSAnJXMmJXMnICUgKHF1ZXJ5LCBlbmNfcGFyYW1zKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcXVlcnkgPSBlbmNfcGFyYW1zCgogICAgICAgIHVybCA9IHJlcXVvdGVfdXJpKHVybHVucGFyc2UoW3NjaGVtZSwgbmV0bG9jLCBwYXRoLCBOb25lLCBxdWVyeSwgZnJhZ21lbnRdKSkKICAgICAgICBzZWxmLnVybCA9IHVybAoKICAgIGRlZiBwcmVwYXJlX2hlYWRlcnMoc2VsZiwgaGVhZGVycyk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIEhUVFAgaGVhZGVycy4iIiIKCiAgICAgICAgc2VsZi5oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdCgpCiAgICAgICAgaWYgaGVhZGVyczoKICAgICAgICAgICAgZm9yIGhlYWRlciBpbiBoZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAjIFJhaXNlIGV4Y2VwdGlvbiBvbiBpbnZhbGlkIGhlYWRlciB2YWx1ZS4KICAgICAgICAgICAgICAgIGNoZWNrX2hlYWRlcl92YWxpZGl0eShoZWFkZXIpCiAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSA9IGhlYWRlcgogICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzW3RvX25hdGl2ZV9zdHJpbmcobmFtZSldID0gdmFsdWUKCiAgICBkZWYgcHJlcGFyZV9ib2R5KHNlbGYsIGRhdGEsIGZpbGVzLCBqc29uPU5vbmUpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIGJvZHkgZGF0YS4iIiIKCiAgICAgICAgIyBDaGVjayBpZiBmaWxlLCBmbywgZ2VuZXJhdG9yLCBpdGVyYXRvci4KICAgICAgICAjIElmIG5vdCwgcnVuIHRocm91Z2ggbm9ybWFsIHByb2Nlc3MuCgogICAgICAgICMgTm90dGluJyBvbiB5b3UuCiAgICAgICAgYm9keSA9IE5vbmUKICAgICAgICBjb250ZW50X3R5cGUgPSBOb25lCgogICAgICAgIGlmIG5vdCBkYXRhIGFuZCBqc29uIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIHVybGxpYjMgcmVxdWlyZXMgYSBieXRlcy1saWtlIGJvZHkuIFB5dGhvbiAyJ3MganNvbi5kdW1wcwogICAgICAgICAgICAjIHByb3ZpZGVzIHRoaXMgbmF0aXZlbHksIGJ1dCBQeXRob24gMyBnaXZlcyBhIFVuaWNvZGUgc3RyaW5nLgogICAgICAgICAgICBjb250ZW50X3R5cGUgPSAnYXBwbGljYXRpb24vanNvbicKICAgICAgICAgICAgYm9keSA9IGNvbXBsZXhqc29uLmR1bXBzKGpzb24pCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJvZHksIGJ5dGVzKToKICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LmVuY29kZSgndXRmLTgnKQoKICAgICAgICBpc19zdHJlYW0gPSBhbGwoWwogICAgICAgICAgICBoYXNhdHRyKGRhdGEsICdfX2l0ZXJfXycpLAogICAgICAgICAgICBub3QgaXNpbnN0YW5jZShkYXRhLCAoYmFzZXN0cmluZywgbGlzdCwgdHVwbGUsIGNvbGxlY3Rpb25zLk1hcHBpbmcpKQogICAgICAgIF0pCgogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuZ3RoID0gc3VwZXJfbGVuKGRhdGEpCiAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBVbnN1cHBvcnRlZE9wZXJhdGlvbik6CiAgICAgICAgICAgIGxlbmd0aCA9IE5vbmUKCiAgICAgICAgaWYgaXNfc3RyZWFtOgogICAgICAgICAgICBib2R5ID0gZGF0YQoKICAgICAgICAgICAgaWYgZ2V0YXR0cihib2R5LCAndGVsbCcsIE5vbmUpIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIyBSZWNvcmQgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBiZWZvcmUgcmVhZGluZy4KICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIGFsbG93IHVzIHRvIHJld2luZCBhIGZpbGUgaW4gdGhlIGV2ZW50CiAgICAgICAgICAgICAgICAjIG9mIGEgcmVkaXJlY3QuCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fYm9keV9wb3NpdGlvbiA9IGJvZHkudGVsbCgpCiAgICAgICAgICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICMgVGhpcyBkaWZmZXJlbnRpYXRlcyBmcm9tIE5vbmUsIGFsbG93aW5nIHVzIHRvIGNhdGNoCiAgICAgICAgICAgICAgICAgICAgIyBhIGZhaWxlZCBgdGVsbCgpYCBsYXRlciB3aGVuIHRyeWluZyB0byByZXdpbmQgdGhlIGJvZHkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9ib2R5X3Bvc2l0aW9uID0gb2JqZWN0KCkKCiAgICAgICAgICAgIGlmIGZpbGVzOgogICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignU3RyZWFtZWQgYm9kaWVzIGFuZCBmaWxlcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLicpCgogICAgICAgICAgICBpZiBsZW5ndGg6CiAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBidWlsdGluX3N0cihsZW5ndGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ1RyYW5zZmVyLUVuY29kaW5nJ10gPSAnY2h1bmtlZCcKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE11bHRpLXBhcnQgZmlsZSB1cGxvYWRzLgogICAgICAgICAgICBpZiBmaWxlczoKICAgICAgICAgICAgICAgIChib2R5LCBjb250ZW50X3R5cGUpID0gc2VsZi5fZW5jb2RlX2ZpbGVzKGZpbGVzLCBkYXRhKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgICAgICAgICBib2R5ID0gc2VsZi5fZW5jb2RlX3BhcmFtcyhkYXRhKQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgYmFzZXN0cmluZykgb3IgaGFzYXR0cihkYXRhLCAncmVhZCcpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKCiAgICAgICAgICAgIHNlbGYucHJlcGFyZV9jb250ZW50X2xlbmd0aChib2R5KQoKICAgICAgICAgICAgIyBBZGQgY29udGVudC10eXBlIGlmIGl0IHdhc24ndCBleHBsaWNpdGx5IHByb3ZpZGVkLgogICAgICAgICAgICBpZiBjb250ZW50X3R5cGUgYW5kICgnY29udGVudC10eXBlJyBub3QgaW4gc2VsZi5oZWFkZXJzKToKICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb250ZW50X3R5cGUKCiAgICAgICAgc2VsZi5ib2R5ID0gYm9keQoKICAgIGRlZiBwcmVwYXJlX2NvbnRlbnRfbGVuZ3RoKHNlbGYsIGJvZHkpOgogICAgICAgICIiIlByZXBhcmUgQ29udGVudC1MZW5ndGggaGVhZGVyIGJhc2VkIG9uIHJlcXVlc3QgbWV0aG9kIGFuZCBib2R5IiIiCiAgICAgICAgaWYgYm9keSBpcyBub3QgTm9uZToKICAgICAgICAgICAgbGVuZ3RoID0gc3VwZXJfbGVuKGJvZHkpCiAgICAgICAgICAgIGlmIGxlbmd0aDoKICAgICAgICAgICAgICAgICMgSWYgbGVuZ3RoIGV4aXN0cywgc2V0IGl0LiBPdGhlcndpc2UsIHdlIGZhbGxiYWNrCiAgICAgICAgICAgICAgICAjIHRvIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkLgogICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gYnVpbHRpbl9zdHIobGVuZ3RoKQogICAgICAgIGVsaWYgc2VsZi5tZXRob2Qgbm90IGluICgnR0VUJywgJ0hFQUQnKSBhbmQgc2VsZi5oZWFkZXJzLmdldCgnQ29udGVudC1MZW5ndGgnKSBpcyBOb25lOgogICAgICAgICAgICAjIFNldCBDb250ZW50LUxlbmd0aCB0byAwIGZvciBtZXRob2RzIHRoYXQgY2FuIGhhdmUgYSBib2R5CiAgICAgICAgICAgICMgYnV0IGRvbid0IHByb3ZpZGUgb25lLiAoaS5lLiBub3QgR0VUIG9yIEhFQUQpCiAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9ICcwJwoKICAgIGRlZiBwcmVwYXJlX2F1dGgoc2VsZiwgYXV0aCwgdXJsPScnKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBhdXRoIGRhdGEuIiIiCgogICAgICAgICMgSWYgbm8gQXV0aCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkLCBleHRyYWN0IGl0IGZyb20gdGhlIFVSTCBmaXJzdC4KICAgICAgICBpZiBhdXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHVybF9hdXRoID0gZ2V0X2F1dGhfZnJvbV91cmwoc2VsZi51cmwpCiAgICAgICAgICAgIGF1dGggPSB1cmxfYXV0aCBpZiBhbnkodXJsX2F1dGgpIGVsc2UgTm9uZQoKICAgICAgICBpZiBhdXRoOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGF1dGgsIHR1cGxlKSBhbmQgbGVuKGF1dGgpID09IDI6CiAgICAgICAgICAgICAgICAjIHNwZWNpYWwtY2FzZSBiYXNpYyBIVFRQIGF1dGgKICAgICAgICAgICAgICAgIGF1dGggPSBIVFRQQmFzaWNBdXRoKCphdXRoKQoKICAgICAgICAgICAgIyBBbGxvdyBhdXRoIHRvIG1ha2UgaXRzIGNoYW5nZXMuCiAgICAgICAgICAgIHIgPSBhdXRoKHNlbGYpCgogICAgICAgICAgICAjIFVwZGF0ZSBzZWxmIHRvIHJlZmxlY3QgdGhlIGF1dGggY2hhbmdlcy4KICAgICAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoci5fX2RpY3RfXykKCiAgICAgICAgICAgICMgUmVjb21wdXRlIENvbnRlbnQtTGVuZ3RoCiAgICAgICAgICAgIHNlbGYucHJlcGFyZV9jb250ZW50X2xlbmd0aChzZWxmLmJvZHkpCgogICAgZGVmIHByZXBhcmVfY29va2llcyhzZWxmLCBjb29raWVzKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBjb29raWUgZGF0YS4KCiAgICAgICAgVGhpcyBmdW5jdGlvbiBldmVudHVhbGx5IGdlbmVyYXRlcyBhIGBgQ29va2llYGAgaGVhZGVyIGZyb20gdGhlCiAgICAgICAgZ2l2ZW4gY29va2llcyB1c2luZyBjb29raWVsaWIuIER1ZSB0byBjb29raWVsaWIncyBkZXNpZ24sIHRoZSBoZWFkZXIKICAgICAgICB3aWxsIG5vdCBiZSByZWdlbmVyYXRlZCBpZiBpdCBhbHJlYWR5IGV4aXN0cywgbWVhbmluZyB0aGlzIGZ1bmN0aW9uCiAgICAgICAgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgZm9yIHRoZSBsaWZlIG9mIHRoZQogICAgICAgIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBvYmplY3QuIEFueSBzdWJzZXF1ZW50IGNhbGxzCiAgICAgICAgdG8gYGBwcmVwYXJlX2Nvb2tpZXNgYCB3aWxsIGhhdmUgbm8gYWN0dWFsIGVmZmVjdCwgdW5sZXNzIHRoZSAiQ29va2llIgogICAgICAgIGhlYWRlciBpcyByZW1vdmVkIGJlZm9yZWhhbmQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb29raWVzLCBjb29raWVsaWIuQ29va2llSmFyKToKICAgICAgICAgICAgc2VsZi5fY29va2llcyA9IGNvb2tpZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9jb29raWVzID0gY29va2llamFyX2Zyb21fZGljdChjb29raWVzKQoKICAgICAgICBjb29raWVfaGVhZGVyID0gZ2V0X2Nvb2tpZV9oZWFkZXIoc2VsZi5fY29va2llcywgc2VsZikKICAgICAgICBpZiBjb29raWVfaGVhZGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0Nvb2tpZSddID0gY29va2llX2hlYWRlcgoKICAgIGRlZiBwcmVwYXJlX2hvb2tzKHNlbGYsIGhvb2tzKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gaG9va3MuIiIiCiAgICAgICAgIyBob29rcyBjYW4gYmUgcGFzc2VkIGFzIE5vbmUgdG8gdGhlIHByZXBhcmUgbWV0aG9kIGFuZCB0byB0aGlzCiAgICAgICAgIyBtZXRob2QuIFRvIHByZXZlbnQgaXRlcmF0aW5nIG92ZXIgTm9uZSwgc2ltcGx5IHVzZSBhbiBlbXB0eSBsaXN0CiAgICAgICAgIyBpZiBob29rcyBpcyBGYWxzZS15CiAgICAgICAgaG9va3MgPSBob29rcyBvciBbXQogICAgICAgIGZvciBldmVudCBpbiBob29rczoKICAgICAgICAgICAgc2VsZi5yZWdpc3Rlcl9ob29rKGV2ZW50LCBob29rc1tldmVudF0pCgoKY2xhc3MgUmVzcG9uc2Uob2JqZWN0KToKICAgICIiIlRoZSA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdCwgd2hpY2ggY29udGFpbnMgYQogICAgc2VydmVyJ3MgcmVzcG9uc2UgdG8gYW4gSFRUUCByZXF1ZXN0LgogICAgIiIiCgogICAgX19hdHRyc19fID0gWwogICAgICAgICdfY29udGVudCcsICdzdGF0dXNfY29kZScsICdoZWFkZXJzJywgJ3VybCcsICdoaXN0b3J5JywKICAgICAgICAnZW5jb2RpbmcnLCAncmVhc29uJywgJ2Nvb2tpZXMnLCAnZWxhcHNlZCcsICdyZXF1ZXN0JwogICAgXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9jb250ZW50ID0gRmFsc2UKICAgICAgICBzZWxmLl9jb250ZW50X2NvbnN1bWVkID0gRmFsc2UKICAgICAgICBzZWxmLl9uZXh0ID0gTm9uZQoKICAgICAgICAjOiBJbnRlZ2VyIENvZGUgb2YgcmVzcG9uZGVkIEhUVFAgU3RhdHVzLCBlLmcuIDQwNCBvciAyMDAuCiAgICAgICAgc2VsZi5zdGF0dXNfY29kZSA9IE5vbmUKCiAgICAgICAgIzogQ2FzZS1pbnNlbnNpdGl2ZSBEaWN0aW9uYXJ5IG9mIFJlc3BvbnNlIEhlYWRlcnMuCiAgICAgICAgIzogRm9yIGV4YW1wbGUsIGBgaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddYGAgd2lsbCByZXR1cm4gdGhlCiAgICAgICAgIzogdmFsdWUgb2YgYSBgYCdDb250ZW50LUVuY29kaW5nJ2BgIHJlc3BvbnNlIGhlYWRlci4KICAgICAgICBzZWxmLmhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KCkKCiAgICAgICAgIzogRmlsZS1saWtlIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiByZXNwb25zZSAoZm9yIGFkdmFuY2VkIHVzYWdlKS4KICAgICAgICAjOiBVc2Ugb2YgYGByYXdgYCByZXF1aXJlcyB0aGF0IGBgc3RyZWFtPVRydWVgYCBiZSBzZXQgb24gdGhlIHJlcXVlc3QuCiAgICAgICAgIyBUaGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5IGZvciB1c2UgaW50ZXJuYWxseSB0byBSZXF1ZXN0cy4KICAgICAgICBzZWxmLnJhdyA9IE5vbmUKCiAgICAgICAgIzogRmluYWwgVVJMIGxvY2F0aW9uIG9mIFJlc3BvbnNlLgogICAgICAgIHNlbGYudXJsID0gTm9uZQoKICAgICAgICAjOiBFbmNvZGluZyB0byBkZWNvZGUgd2l0aCB3aGVuIGFjY2Vzc2luZyByLnRleHQuCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUKCiAgICAgICAgIzogQSBsaXN0IG9mIDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0cyBmcm9tCiAgICAgICAgIzogdGhlIGhpc3Rvcnkgb2YgdGhlIFJlcXVlc3QuIEFueSByZWRpcmVjdCByZXNwb25zZXMgd2lsbCBlbmQKICAgICAgICAjOiB1cCBoZXJlLiBUaGUgbGlzdCBpcyBzb3J0ZWQgZnJvbSB0aGUgb2xkZXN0IHRvIHRoZSBtb3N0IHJlY2VudCByZXF1ZXN0LgogICAgICAgIHNlbGYuaGlzdG9yeSA9IFtdCgogICAgICAgICM6IFRleHR1YWwgcmVhc29uIG9mIHJlc3BvbmRlZCBIVFRQIFN0YXR1cywgZS5nLiAiTm90IEZvdW5kIiBvciAiT0siLgogICAgICAgIHNlbGYucmVhc29uID0gTm9uZQoKICAgICAgICAjOiBBIENvb2tpZUphciBvZiBDb29raWVzIHRoZSBzZXJ2ZXIgc2VudCBiYWNrLgogICAgICAgIHNlbGYuY29va2llcyA9IGNvb2tpZWphcl9mcm9tX2RpY3Qoe30pCgogICAgICAgICM6IFRoZSBhbW91bnQgb2YgdGltZSBlbGFwc2VkIGJldHdlZW4gc2VuZGluZyB0aGUgcmVxdWVzdAogICAgICAgICM6IGFuZCB0aGUgYXJyaXZhbCBvZiB0aGUgcmVzcG9uc2UgKGFzIGEgdGltZWRlbHRhKS4KICAgICAgICAjOiBUaGlzIHByb3BlcnR5IHNwZWNpZmljYWxseSBtZWFzdXJlcyB0aGUgdGltZSB0YWtlbiBiZXR3ZWVuIHNlbmRpbmcKICAgICAgICAjOiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVxdWVzdCBhbmQgZmluaXNoaW5nIHBhcnNpbmcgdGhlIGhlYWRlcnMuIEl0CiAgICAgICAgIzogaXMgdGhlcmVmb3JlIHVuYWZmZWN0ZWQgYnkgY29uc3VtaW5nIHRoZSByZXNwb25zZSBjb250ZW50IG9yIHRoZQogICAgICAgICM6IHZhbHVlIG9mIHRoZSBgYHN0cmVhbWBgIGtleXdvcmQgYXJndW1lbnQuCiAgICAgICAgc2VsZi5lbGFwc2VkID0gZGF0ZXRpbWUudGltZWRlbHRhKDApCgogICAgICAgICM6IFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgb2JqZWN0IHRvIHdoaWNoIHRoaXMKICAgICAgICAjOiBpcyBhIHJlc3BvbnNlLgogICAgICAgIHNlbGYucmVxdWVzdCA9IE5vbmUKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgICMgQ29uc3VtZSBldmVyeXRoaW5nOyBhY2Nlc3NpbmcgdGhlIGNvbnRlbnQgYXR0cmlidXRlIG1ha2VzCiAgICAgICAgIyBzdXJlIHRoZSBjb250ZW50IGhhcyBiZWVuIGZ1bGx5IHJlYWQuCiAgICAgICAgaWYgbm90IHNlbGYuX2NvbnRlbnRfY29uc3VtZWQ6CiAgICAgICAgICAgIHNlbGYuY29udGVudAoKICAgICAgICByZXR1cm4gZGljdCgKICAgICAgICAgICAgKGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpCiAgICAgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX19hdHRyc19fCiAgICAgICAgKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgogICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIHZhbHVlKQoKICAgICAgICAjIHBpY2tsZWQgb2JqZWN0cyBkbyBub3QgaGF2ZSAucmF3CiAgICAgICAgc2V0YXR0cihzZWxmLCAnX2NvbnRlbnRfY29uc3VtZWQnLCBUcnVlKQogICAgICAgIHNldGF0dHIoc2VsZiwgJ3JhdycsIE5vbmUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPFJlc3BvbnNlIFslc10+JyAlIChzZWxmLnN0YXR1c19jb2RlKQoKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgOmF0dHI6YHN0YXR1c19jb2RlYCBpcyBsZXNzIHRoYW4gNDAwLgoKICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjaGVja3MgaWYgdGhlIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZSBpcyBiZXR3ZWVuCiAgICAgICAgNDAwIGFuZCA2MDAgdG8gc2VlIGlmIHRoZXJlIHdhcyBhIGNsaWVudCBlcnJvciBvciBhIHNlcnZlciBlcnJvci4gSWYKICAgICAgICB0aGUgc3RhdHVzIGNvZGUsIGlzIGJldHdlZW4gMjAwIGFuZCA0MDAsIHRoaXMgd2lsbCByZXR1cm4gVHJ1ZS4gVGhpcwogICAgICAgIGlzICoqbm90KiogYSBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3BvbnNlIGNvZGUgaXMgYGAyMDAgT0tgYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5vawoKICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgOmF0dHI6YHN0YXR1c19jb2RlYCBpcyBsZXNzIHRoYW4gNDAwLgoKICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjaGVja3MgaWYgdGhlIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZSBpcyBiZXR3ZWVuCiAgICAgICAgNDAwIGFuZCA2MDAgdG8gc2VlIGlmIHRoZXJlIHdhcyBhIGNsaWVudCBlcnJvciBvciBhIHNlcnZlciBlcnJvci4gSWYKICAgICAgICB0aGUgc3RhdHVzIGNvZGUsIGlzIGJldHdlZW4gMjAwIGFuZCA0MDAsIHRoaXMgd2lsbCByZXR1cm4gVHJ1ZS4gVGhpcwogICAgICAgIGlzICoqbm90KiogYSBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3BvbnNlIGNvZGUgaXMgYGAyMDAgT0tgYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5vawoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJBbGxvd3MgeW91IHRvIHVzZSBhIHJlc3BvbnNlIGFzIGFuIGl0ZXJhdG9yLiIiIgogICAgICAgIHJldHVybiBzZWxmLml0ZXJfY29udGVudCgxMjgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgb2soc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyBUcnVlIGlmIDphdHRyOmBzdGF0dXNfY29kZWAgaXMgbGVzcyB0aGFuIDQwMC4KCiAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY2hlY2tzIGlmIHRoZSBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UgaXMgYmV0d2VlbgogICAgICAgIDQwMCBhbmQgNjAwIHRvIHNlZSBpZiB0aGVyZSB3YXMgYSBjbGllbnQgZXJyb3Igb3IgYSBzZXJ2ZXIgZXJyb3IuIElmCiAgICAgICAgdGhlIHN0YXR1cyBjb2RlLCBpcyBiZXR3ZWVuIDIwMCBhbmQgNDAwLCB0aGlzIHdpbGwgcmV0dXJuIFRydWUuIFRoaXMKICAgICAgICBpcyAqKm5vdCoqIGEgY2hlY2sgdG8gc2VlIGlmIHRoZSByZXNwb25zZSBjb2RlIGlzIGBgMjAwIE9LYGAuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgICAgIGV4Y2VwdCBIVFRQRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcmVkaXJlY3Qoc2VsZik6CiAgICAgICAgIiIiVHJ1ZSBpZiB0aGlzIFJlc3BvbnNlIGlzIGEgd2VsbC1mb3JtZWQgSFRUUCByZWRpcmVjdCB0aGF0IGNvdWxkIGhhdmUKICAgICAgICBiZWVuIHByb2Nlc3NlZCBhdXRvbWF0aWNhbGx5IChieSA6bWV0aDpgU2Vzc2lvbi5yZXNvbHZlX3JlZGlyZWN0c2ApLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoJ2xvY2F0aW9uJyBpbiBzZWxmLmhlYWRlcnMgYW5kIHNlbGYuc3RhdHVzX2NvZGUgaW4gUkVESVJFQ1RfU1RBVEkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcGVybWFuZW50X3JlZGlyZWN0KHNlbGYpOgogICAgICAgICIiIlRydWUgaWYgdGhpcyBSZXNwb25zZSBvbmUgb2YgdGhlIHBlcm1hbmVudCB2ZXJzaW9ucyBvZiByZWRpcmVjdC4iIiIKICAgICAgICByZXR1cm4gKCdsb2NhdGlvbicgaW4gc2VsZi5oZWFkZXJzIGFuZCBzZWxmLnN0YXR1c19jb2RlIGluIChjb2Rlcy5tb3ZlZF9wZXJtYW5lbnRseSwgY29kZXMucGVybWFuZW50X3JlZGlyZWN0KSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICIiIlJldHVybnMgYSBQcmVwYXJlZFJlcXVlc3QgZm9yIHRoZSBuZXh0IHJlcXVlc3QgaW4gYSByZWRpcmVjdCBjaGFpbiwgaWYgdGhlcmUgaXMgb25lLiIiIgogICAgICAgIHJldHVybiBzZWxmLl9uZXh0CgogICAgQHByb3BlcnR5CiAgICBkZWYgYXBwYXJlbnRfZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgIiIiVGhlIGFwcGFyZW50IGVuY29kaW5nLCBwcm92aWRlZCBieSB0aGUgY2hhcmRldCBsaWJyYXJ5LiIiIgogICAgICAgIHJldHVybiBjaGFyZGV0LmRldGVjdChzZWxmLmNvbnRlbnQpWydlbmNvZGluZyddCgogICAgZGVmIGl0ZXJfY29udGVudChzZWxmLCBjaHVua19zaXplPTEsIGRlY29kZV91bmljb2RlPUZhbHNlKToKICAgICAgICAiIiJJdGVyYXRlcyBvdmVyIHRoZSByZXNwb25zZSBkYXRhLiAgV2hlbiBzdHJlYW09VHJ1ZSBpcyBzZXQgb24gdGhlCiAgICAgICAgcmVxdWVzdCwgdGhpcyBhdm9pZHMgcmVhZGluZyB0aGUgY29udGVudCBhdCBvbmNlIGludG8gbWVtb3J5IGZvcgogICAgICAgIGxhcmdlIHJlc3BvbnNlcy4gIFRoZSBjaHVuayBzaXplIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXQgc2hvdWxkCiAgICAgICAgcmVhZCBpbnRvIG1lbW9yeS4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBsZW5ndGggb2YgZWFjaCBpdGVtCiAgICAgICAgcmV0dXJuZWQgYXMgZGVjb2RpbmcgY2FuIHRha2UgcGxhY2UuCgogICAgICAgIGNodW5rX3NpemUgbXVzdCBiZSBvZiB0eXBlIGludCBvciBOb25lLiBBIHZhbHVlIG9mIE5vbmUgd2lsbAogICAgICAgIGZ1bmN0aW9uIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYHN0cmVhbWAuCiAgICAgICAgc3RyZWFtPVRydWUgd2lsbCByZWFkIGRhdGEgYXMgaXQgYXJyaXZlcyBpbiB3aGF0ZXZlciBzaXplIHRoZQogICAgICAgIGNodW5rcyBhcmUgcmVjZWl2ZWQuIElmIHN0cmVhbT1GYWxzZSwgZGF0YSBpcyByZXR1cm5lZCBhcwogICAgICAgIGEgc2luZ2xlIGNodW5rLgoKICAgICAgICBJZiBkZWNvZGVfdW5pY29kZSBpcyBUcnVlLCBjb250ZW50IHdpbGwgYmUgZGVjb2RlZCB1c2luZyB0aGUgYmVzdAogICAgICAgIGF2YWlsYWJsZSBlbmNvZGluZyBiYXNlZCBvbiB0aGUgcmVzcG9uc2UuCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBnZW5lcmF0ZSgpOgogICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgdXJsbGliMy4KICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLnJhdywgJ3N0cmVhbScpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZvciBjaHVuayBpbiBzZWxmLnJhdy5zdHJlYW0oY2h1bmtfc2l6ZSwgZGVjb2RlX2NvbnRlbnQ9VHJ1ZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCiAgICAgICAgICAgICAgICBleGNlcHQgUHJvdG9jb2xFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENodW5rZWRFbmNvZGluZ0Vycm9yKGUpCiAgICAgICAgICAgICAgICBleGNlcHQgRGVjb2RlRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb250ZW50RGVjb2RpbmdFcnJvcihlKQogICAgICAgICAgICAgICAgZXhjZXB0IFJlYWRUaW1lb3V0RXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb25uZWN0aW9uRXJyb3IoZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgU3RhbmRhcmQgZmlsZS1saWtlIG9iamVjdC4KICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJhdy5yZWFkKGNodW5rX3NpemUpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNodW5rOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCgogICAgICAgICAgICBzZWxmLl9jb250ZW50X2NvbnN1bWVkID0gVHJ1ZQoKICAgICAgICBpZiBzZWxmLl9jb250ZW50X2NvbnN1bWVkIGFuZCBpc2luc3RhbmNlKHNlbGYuX2NvbnRlbnQsIGJvb2wpOgogICAgICAgICAgICByYWlzZSBTdHJlYW1Db25zdW1lZEVycm9yKCkKICAgICAgICBlbGlmIGNodW5rX3NpemUgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKGNodW5rX3NpemUsIGludCk6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2h1bmtfc2l6ZSBtdXN0IGJlIGFuIGludCwgaXQgaXMgaW5zdGVhZCBhICVzLiIgJSB0eXBlKGNodW5rX3NpemUpKQogICAgICAgICMgc2ltdWxhdGUgcmVhZGluZyBzbWFsbCBjaHVua3Mgb2YgdGhlIGNvbnRlbnQKICAgICAgICByZXVzZWRfY2h1bmtzID0gaXRlcl9zbGljZXMoc2VsZi5fY29udGVudCwgY2h1bmtfc2l6ZSkKCiAgICAgICAgc3RyZWFtX2NodW5rcyA9IGdlbmVyYXRlKCkKCiAgICAgICAgY2h1bmtzID0gcmV1c2VkX2NodW5rcyBpZiBzZWxmLl9jb250ZW50X2NvbnN1bWVkIGVsc2Ugc3RyZWFtX2NodW5rcwoKICAgICAgICBpZiBkZWNvZGVfdW5pY29kZToKICAgICAgICAgICAgY2h1bmtzID0gc3RyZWFtX2RlY29kZV9yZXNwb25zZV91bmljb2RlKGNodW5rcywgc2VsZikKCiAgICAgICAgcmV0dXJuIGNodW5rcwoKICAgIGRlZiBpdGVyX2xpbmVzKHNlbGYsIGNodW5rX3NpemU9SVRFUl9DSFVOS19TSVpFLCBkZWNvZGVfdW5pY29kZT1Ob25lLCBkZWxpbWl0ZXI9Tm9uZSk6CiAgICAgICAgIiIiSXRlcmF0ZXMgb3ZlciB0aGUgcmVzcG9uc2UgZGF0YSwgb25lIGxpbmUgYXQgYSB0aW1lLiAgV2hlbgogICAgICAgIHN0cmVhbT1UcnVlIGlzIHNldCBvbiB0aGUgcmVxdWVzdCwgdGhpcyBhdm9pZHMgcmVhZGluZyB0aGUKICAgICAgICBjb250ZW50IGF0IG9uY2UgaW50byBtZW1vcnkgZm9yIGxhcmdlIHJlc3BvbnNlcy4KCiAgICAgICAgLi4gbm90ZTo6IFRoaXMgbWV0aG9kIGlzIG5vdCByZWVudHJhbnQgc2FmZS4KICAgICAgICAiIiIKCiAgICAgICAgcGVuZGluZyA9IE5vbmUKCiAgICAgICAgZm9yIGNodW5rIGluIHNlbGYuaXRlcl9jb250ZW50KGNodW5rX3NpemU9Y2h1bmtfc2l6ZSwgZGVjb2RlX3VuaWNvZGU9ZGVjb2RlX3VuaWNvZGUpOgoKICAgICAgICAgICAgaWYgcGVuZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGNodW5rID0gcGVuZGluZyArIGNodW5rCgogICAgICAgICAgICBpZiBkZWxpbWl0ZXI6CiAgICAgICAgICAgICAgICBsaW5lcyA9IGNodW5rLnNwbGl0KGRlbGltaXRlcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxpbmVzID0gY2h1bmsuc3BsaXRsaW5lcygpCgogICAgICAgICAgICBpZiBsaW5lcyBhbmQgbGluZXNbLTFdIGFuZCBjaHVuayBhbmQgbGluZXNbLTFdWy0xXSA9PSBjaHVua1stMV06CiAgICAgICAgICAgICAgICBwZW5kaW5nID0gbGluZXMucG9wKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBOb25lCgogICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCiAgICAgICAgaWYgcGVuZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgeWllbGQgcGVuZGluZwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbnRlbnQoc2VsZik6CiAgICAgICAgIiIiQ29udGVudCBvZiB0aGUgcmVzcG9uc2UsIGluIGJ5dGVzLiIiIgoKICAgICAgICBpZiBzZWxmLl9jb250ZW50IGlzIEZhbHNlOgogICAgICAgICAgICAjIFJlYWQgdGhlIGNvbnRlbnRzLgogICAgICAgICAgICBpZiBzZWxmLl9jb250ZW50X2NvbnN1bWVkOgogICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAgICAgICdUaGUgY29udGVudCBmb3IgdGhpcyByZXNwb25zZSB3YXMgYWxyZWFkeSBjb25zdW1lZCcpCgogICAgICAgICAgICBpZiBzZWxmLnN0YXR1c19jb2RlID09IDAgb3Igc2VsZi5yYXcgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRlbnQgPSBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb250ZW50ID0gYnl0ZXMoKS5qb2luKHNlbGYuaXRlcl9jb250ZW50KENPTlRFTlRfQ0hVTktfU0laRSkpIG9yIGJ5dGVzKCkKCiAgICAgICAgc2VsZi5fY29udGVudF9jb25zdW1lZCA9IFRydWUKICAgICAgICAjIGRvbid0IG5lZWQgdG8gcmVsZWFzZSB0aGUgY29ubmVjdGlvbjsgdGhhdCdzIGJlZW4gaGFuZGxlZCBieSB1cmxsaWIzCiAgICAgICAgIyBzaW5jZSB3ZSBleGhhdXN0ZWQgdGhlIGRhdGEuCiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRlbnQKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0ZXh0KHNlbGYpOgogICAgICAgICIiIkNvbnRlbnQgb2YgdGhlIHJlc3BvbnNlLCBpbiB1bmljb2RlLgoKICAgICAgICBJZiBSZXNwb25zZS5lbmNvZGluZyBpcyBOb25lLCBlbmNvZGluZyB3aWxsIGJlIGd1ZXNzZWQgdXNpbmcKICAgICAgICBgYGNoYXJkZXRgYC4KCiAgICAgICAgVGhlIGVuY29kaW5nIG9mIHRoZSByZXNwb25zZSBjb250ZW50IGlzIGRldGVybWluZWQgYmFzZWQgc29sZWx5IG9uIEhUVFAKICAgICAgICBoZWFkZXJzLCBmb2xsb3dpbmcgUkZDIDI2MTYgdG8gdGhlIGxldHRlci4gSWYgeW91IGNhbiB0YWtlIGFkdmFudGFnZSBvZgogICAgICAgIG5vbi1IVFRQIGtub3dsZWRnZSB0byBtYWtlIGEgYmV0dGVyIGd1ZXNzIGF0IHRoZSBlbmNvZGluZywgeW91IHNob3VsZAogICAgICAgIHNldCBgYHIuZW5jb2RpbmdgYCBhcHByb3ByaWF0ZWx5IGJlZm9yZSBhY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eS4KICAgICAgICAiIiIKCiAgICAgICAgIyBUcnkgY2hhcnNldCBmcm9tIGNvbnRlbnQtdHlwZQogICAgICAgIGNvbnRlbnQgPSBOb25lCiAgICAgICAgZW5jb2RpbmcgPSBzZWxmLmVuY29kaW5nCgogICAgICAgIGlmIG5vdCBzZWxmLmNvbnRlbnQ6CiAgICAgICAgICAgIHJldHVybiBzdHIoJycpCgogICAgICAgICMgRmFsbGJhY2sgdG8gYXV0by1kZXRlY3RlZCBlbmNvZGluZy4KICAgICAgICBpZiBzZWxmLmVuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgICAgIGVuY29kaW5nID0gc2VsZi5hcHBhcmVudF9lbmNvZGluZwoKICAgICAgICAjIERlY29kZSB1bmljb2RlIGZyb20gZ2l2ZW4gZW5jb2RpbmcuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb250ZW50ID0gc3RyKHNlbGYuY29udGVudCwgZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpCiAgICAgICAgZXhjZXB0IChMb29rdXBFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgIyBBIExvb2t1cEVycm9yIGlzIHJhaXNlZCBpZiB0aGUgZW5jb2Rpbmcgd2FzIG5vdCBmb3VuZCB3aGljaCBjb3VsZAogICAgICAgICAgICAjIGluZGljYXRlIGEgbWlzc3BlbGxpbmcgb3Igc2ltaWxhciBtaXN0YWtlLgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgQSBUeXBlRXJyb3IgY2FuIGJlIHJhaXNlZCBpZiBlbmNvZGluZyBpcyBOb25lCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBTbyB3ZSB0cnkgYmxpbmRseSBlbmNvZGluZy4KICAgICAgICAgICAgY29udGVudCA9IHN0cihzZWxmLmNvbnRlbnQsIGVycm9ycz0ncmVwbGFjZScpCgogICAgICAgIHJldHVybiBjb250ZW50CgogICAgZGVmIGpzb24oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJSZXR1cm5zIHRoZSBqc29uLWVuY29kZWQgY29udGVudCBvZiBhIHJlc3BvbnNlLCBpZiBhbnkuCgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYGpzb24ubG9hZHNgYCB0YWtlcy4KICAgICAgICA6cmFpc2VzIFZhbHVlRXJyb3I6IElmIHRoZSByZXNwb25zZSBib2R5IGRvZXMgbm90IGNvbnRhaW4gdmFsaWQganNvbi4KICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IHNlbGYuZW5jb2RpbmcgYW5kIHNlbGYuY29udGVudCBhbmQgbGVuKHNlbGYuY29udGVudCkgPiAzOgogICAgICAgICAgICAjIE5vIGVuY29kaW5nIHNldC4gSlNPTiBSRkMgNDYyNyBzZWN0aW9uIDMgc3RhdGVzIHdlIHNob3VsZCBleHBlY3QKICAgICAgICAgICAgIyBVVEYtOCwgLTE2IG9yIC0zMi4gRGV0ZWN0IHdoaWNoIG9uZSB0byB1c2U7IElmIHRoZSBkZXRlY3Rpb24gb3IKICAgICAgICAgICAgIyBkZWNvZGluZyBmYWlscywgZmFsbCBiYWNrIHRvIGBzZWxmLnRleHRgICh1c2luZyBjaGFyZGV0IHRvIG1ha2UKICAgICAgICAgICAgIyBhIGJlc3QgZ3Vlc3MpLgogICAgICAgICAgICBlbmNvZGluZyA9IGd1ZXNzX2pzb25fdXRmKHNlbGYuY29udGVudCkKICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXhqc29uLmxvYWRzKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRlbnQuZGVjb2RlKGVuY29kaW5nKSwgKiprd2FyZ3MKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgICMgV3JvbmcgVVRGIGNvZGVjIGRldGVjdGVkOyB1c3VhbGx5IGJlY2F1c2UgaXQncyBub3QgVVRGLTgKICAgICAgICAgICAgICAgICAgICAjIGJ1dCBzb21lIG90aGVyIDgtYml0IGNvZGVjLiAgVGhpcyBpcyBhbiBSRkMgdmlvbGF0aW9uLAogICAgICAgICAgICAgICAgICAgICMgYW5kIHRoZSBzZXJ2ZXIgZGlkbid0IGJvdGhlciB0byB0ZWxsIHVzIHdoYXQgY29kZWMgKndhcyoKICAgICAgICAgICAgICAgICAgICAjIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBjb21wbGV4anNvbi5sb2FkcyhzZWxmLnRleHQsICoqa3dhcmdzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxpbmtzKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgdGhlIHBhcnNlZCBoZWFkZXIgbGlua3Mgb2YgdGhlIHJlc3BvbnNlLCBpZiBhbnkuIiIiCgogICAgICAgIGhlYWRlciA9IHNlbGYuaGVhZGVycy5nZXQoJ2xpbmsnKQoKICAgICAgICAjIGwgPSBNdWx0aURpY3QoKQogICAgICAgIGwgPSB7fQoKICAgICAgICBpZiBoZWFkZXI6CiAgICAgICAgICAgIGxpbmtzID0gcGFyc2VfaGVhZGVyX2xpbmtzKGhlYWRlcikKCiAgICAgICAgICAgIGZvciBsaW5rIGluIGxpbmtzOgogICAgICAgICAgICAgICAga2V5ID0gbGluay5nZXQoJ3JlbCcpIG9yIGxpbmsuZ2V0KCd1cmwnKQogICAgICAgICAgICAgICAgbFtrZXldID0gbGluawoKICAgICAgICByZXR1cm4gbAoKICAgIGRlZiByYWlzZV9mb3Jfc3RhdHVzKHNlbGYpOgogICAgICAgICIiIlJhaXNlcyBzdG9yZWQgOmNsYXNzOmBIVFRQRXJyb3JgLCBpZiBvbmUgb2NjdXJyZWQuIiIiCgogICAgICAgIGh0dHBfZXJyb3JfbXNnID0gJycKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucmVhc29uLCBieXRlcyk6CiAgICAgICAgICAgICMgV2UgYXR0ZW1wdCB0byBkZWNvZGUgdXRmLTggZmlyc3QgYmVjYXVzZSBzb21lIHNlcnZlcnMKICAgICAgICAgICAgIyBjaG9vc2UgdG8gbG9jYWxpemUgdGhlaXIgcmVhc29uIHN0cmluZ3MuIElmIHRoZSBzdHJpbmcKICAgICAgICAgICAgIyBpc24ndCB1dGYtOCwgd2UgZmFsbCBiYWNrIHRvIGlzby04ODU5LTEgZm9yIGFsbCBvdGhlcgogICAgICAgICAgICAjIGVuY29kaW5ncy4gKFNlZSBQUiAjMzUzOCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVhc29uID0gc2VsZi5yZWFzb24uZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICByZWFzb24gPSBzZWxmLnJlYXNvbi5kZWNvZGUoJ2lzby04ODU5LTEnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlYXNvbiA9IHNlbGYucmVhc29uCgogICAgICAgIGlmIDQwMCA8PSBzZWxmLnN0YXR1c19jb2RlIDwgNTAwOgogICAgICAgICAgICBodHRwX2Vycm9yX21zZyA9IHUnJXMgQ2xpZW50IEVycm9yOiAlcyBmb3IgdXJsOiAlcycgJSAoc2VsZi5zdGF0dXNfY29kZSwgcmVhc29uLCBzZWxmLnVybCkKCiAgICAgICAgZWxpZiA1MDAgPD0gc2VsZi5zdGF0dXNfY29kZSA8IDYwMDoKICAgICAgICAgICAgaHR0cF9lcnJvcl9tc2cgPSB1JyVzIFNlcnZlciBFcnJvcjogJXMgZm9yIHVybDogJXMnICUgKHNlbGYuc3RhdHVzX2NvZGUsIHJlYXNvbiwgc2VsZi51cmwpCgogICAgICAgIGlmIGh0dHBfZXJyb3JfbXNnOgogICAgICAgICAgICByYWlzZSBIVFRQRXJyb3IoaHR0cF9lcnJvcl9tc2csIHJlc3BvbnNlPXNlbGYpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIlJlbGVhc2VzIHRoZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuIE9uY2UgdGhpcyBtZXRob2QgaGFzIGJlZW4KICAgICAgICBjYWxsZWQgdGhlIHVuZGVybHlpbmcgYGByYXdgYCBvYmplY3QgbXVzdCBub3QgYmUgYWNjZXNzZWQgYWdhaW4uCgogICAgICAgICpOb3RlOiBTaG91bGQgbm90IG5vcm1hbGx5IG5lZWQgdG8gYmUgY2FsbGVkIGV4cGxpY2l0bHkuKgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9jb250ZW50X2NvbnN1bWVkOgogICAgICAgICAgICBzZWxmLnJhdy5jbG9zZSgpCgogICAgICAgIHJlbGVhc2VfY29ubiA9IGdldGF0dHIoc2VsZi5yYXcsICdyZWxlYXNlX2Nvbm4nLCBOb25lKQogICAgICAgIGlmIHJlbGVhc2VfY29ubiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVsZWFzZV9jb25uKCkKUEsDBBQAAAAAAAAAIQASPN6BtwIAALcCAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9wYWNrYWdlcy5weWltcG9ydCBzeXMKCiMgVGhpcyBjb2RlIGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KIyBJIGRvbid0IGxpa2UgaXQgZWl0aGVyLiBKdXN0IGxvb2sgdGhlIG90aGVyIHdheS4gOikKCmZvciBwYWNrYWdlIGluICgndXJsbGliMycsICdpZG5hJywgJ2NoYXJkZXQnKToKICAgIHZlbmRvcmVkX3BhY2thZ2UgPSAicGlwLl92ZW5kb3IuIiArIHBhY2thZ2UKICAgIGxvY2FscygpW3BhY2thZ2VdID0gX19pbXBvcnRfXyh2ZW5kb3JlZF9wYWNrYWdlKQogICAgIyBUaGlzIHRyYXZlcnNhbCBpcyBhcHBhcmVudGx5IG5lY2Vzc2FyeSBzdWNoIHRoYXQgdGhlIGlkZW50aXRpZXMgYXJlCiAgICAjIHByZXNlcnZlZCAocmVxdWVzdHMucGFja2FnZXMudXJsbGliMy4qIGlzIHVybGxpYjMuKikKICAgIGZvciBtb2QgaW4gbGlzdChzeXMubW9kdWxlcyk6CiAgICAgICAgaWYgbW9kID09IHZlbmRvcmVkX3BhY2thZ2Ugb3IgbW9kLnN0YXJ0c3dpdGgodmVuZG9yZWRfcGFja2FnZSArICcuJyk6CiAgICAgICAgICAgIHVucHJlZml4ZWRfbW9kID0gbW9kW2xlbigicGlwLl92ZW5kb3IuIik6XQogICAgICAgICAgICBzeXMubW9kdWxlc1sncGlwLl92ZW5kb3IucmVxdWVzdHMucGFja2FnZXMuJyArIHVucHJlZml4ZWRfbW9kXSA9IHN5cy5tb2R1bGVzW21vZF0KCiMgS2luZGEgY29vbCwgdGhvdWdoLCByaWdodD8KUEsDBBQAAAAAAAAAIQBfn2aZmmsAAJprAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9zZXNzaW9ucy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuc2Vzc2lvbgp+fn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBwcm92aWRlcyBhIFNlc3Npb24gb2JqZWN0IHRvIG1hbmFnZSBhbmQgcGVyc2lzdCBzZXR0aW5ncyBhY3Jvc3MKcmVxdWVzdHMgKGNvb2tpZXMsIGF1dGgsIHByb3hpZXMpLgoiIiIKaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgdGltZQpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNYXBwaW5nCmZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQoKZnJvbSAuYXV0aCBpbXBvcnQgX2Jhc2ljX2F1dGhfc3RyCmZyb20gLmNvbXBhdCBpbXBvcnQgY29va2llbGliLCBpc19weTMsIE9yZGVyZWREaWN0LCB1cmxqb2luLCB1cmxwYXJzZQpmcm9tIC5jb29raWVzIGltcG9ydCAoCiAgICBjb29raWVqYXJfZnJvbV9kaWN0LCBleHRyYWN0X2Nvb2tpZXNfdG9famFyLCBSZXF1ZXN0c0Nvb2tpZUphciwgbWVyZ2VfY29va2llcykKZnJvbSAubW9kZWxzIGltcG9ydCBSZXF1ZXN0LCBQcmVwYXJlZFJlcXVlc3QsIERFRkFVTFRfUkVESVJFQ1RfTElNSVQKZnJvbSAuaG9va3MgaW1wb3J0IGRlZmF1bHRfaG9va3MsIGRpc3BhdGNoX2hvb2sKZnJvbSAuX2ludGVybmFsX3V0aWxzIGltcG9ydCB0b19uYXRpdmVfc3RyaW5nCmZyb20gLnV0aWxzIGltcG9ydCB0b19rZXlfdmFsX2xpc3QsIGRlZmF1bHRfaGVhZGVycwpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBUb29NYW55UmVkaXJlY3RzLCBJbnZhbGlkU2NoZW1hLCBDaHVua2VkRW5jb2RpbmdFcnJvciwgQ29udGVudERlY29kaW5nRXJyb3IpCgpmcm9tIC5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0CmZyb20gLmFkYXB0ZXJzIGltcG9ydCBIVFRQQWRhcHRlcgoKZnJvbSAudXRpbHMgaW1wb3J0ICgKICAgIHJlcXVvdGVfdXJpLCBnZXRfZW52aXJvbl9wcm94aWVzLCBnZXRfbmV0cmNfYXV0aCwgc2hvdWxkX2J5cGFzc19wcm94aWVzLAogICAgZ2V0X2F1dGhfZnJvbV91cmwsIHJld2luZF9ib2R5CikKCmZyb20gLnN0YXR1c19jb2RlcyBpbXBvcnQgY29kZXMKCiMgZm9ybWVybHkgZGVmaW5lZCBoZXJlLCByZWV4cG9zZWQgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQpmcm9tIC5tb2RlbHMgaW1wb3J0IFJFRElSRUNUX1NUQVRJCgojIFByZWZlcnJlZCBjbG9jaywgYmFzZWQgb24gd2hpY2ggb25lIGlzIG1vcmUgYWNjdXJhdGUgb24gYSBnaXZlbiBzeXN0ZW0uCmlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKICAgIHRyeTogICMgUHl0aG9uIDMuMysKICAgICAgICBwcmVmZXJyZWRfY2xvY2sgPSB0aW1lLnBlcmZfY291bnRlcgogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBFYXJsaWVyIHRoYW4gUHl0aG9uIDMuCiAgICAgICAgcHJlZmVycmVkX2Nsb2NrID0gdGltZS5jbG9jawplbHNlOgogICAgcHJlZmVycmVkX2Nsb2NrID0gdGltZS50aW1lCgoKZGVmIG1lcmdlX3NldHRpbmcocmVxdWVzdF9zZXR0aW5nLCBzZXNzaW9uX3NldHRpbmcsIGRpY3RfY2xhc3M9T3JkZXJlZERpY3QpOgogICAgIiIiRGV0ZXJtaW5lcyBhcHByb3ByaWF0ZSBzZXR0aW5nIGZvciBhIGdpdmVuIHJlcXVlc3QsIHRha2luZyBpbnRvIGFjY291bnQKICAgIHRoZSBleHBsaWNpdCBzZXR0aW5nIG9uIHRoYXQgcmVxdWVzdCwgYW5kIHRoZSBzZXR0aW5nIGluIHRoZSBzZXNzaW9uLiBJZiBhCiAgICBzZXR0aW5nIGlzIGEgZGljdGlvbmFyeSwgdGhleSB3aWxsIGJlIG1lcmdlZCB0b2dldGhlciB1c2luZyBgZGljdF9jbGFzc2AKICAgICIiIgoKICAgIGlmIHNlc3Npb25fc2V0dGluZyBpcyBOb25lOgogICAgICAgIHJldHVybiByZXF1ZXN0X3NldHRpbmcKCiAgICBpZiByZXF1ZXN0X3NldHRpbmcgaXMgTm9uZToKICAgICAgICByZXR1cm4gc2Vzc2lvbl9zZXR0aW5nCgogICAgIyBCeXBhc3MgaWYgbm90IGEgZGljdGlvbmFyeSAoZS5nLiB2ZXJpZnkpCiAgICBpZiBub3QgKAogICAgICAgICAgICBpc2luc3RhbmNlKHNlc3Npb25fc2V0dGluZywgTWFwcGluZykgYW5kCiAgICAgICAgICAgIGlzaW5zdGFuY2UocmVxdWVzdF9zZXR0aW5nLCBNYXBwaW5nKQogICAgKToKICAgICAgICByZXR1cm4gcmVxdWVzdF9zZXR0aW5nCgogICAgbWVyZ2VkX3NldHRpbmcgPSBkaWN0X2NsYXNzKHRvX2tleV92YWxfbGlzdChzZXNzaW9uX3NldHRpbmcpKQogICAgbWVyZ2VkX3NldHRpbmcudXBkYXRlKHRvX2tleV92YWxfbGlzdChyZXF1ZXN0X3NldHRpbmcpKQoKICAgICMgUmVtb3ZlIGtleXMgdGhhdCBhcmUgc2V0IHRvIE5vbmUuIEV4dHJhY3Qga2V5cyBmaXJzdCB0byBhdm9pZCBhbHRlcmluZwogICAgIyB0aGUgZGljdGlvbmFyeSBkdXJpbmcgaXRlcmF0aW9uLgogICAgbm9uZV9rZXlzID0gW2sgZm9yIChrLCB2KSBpbiBtZXJnZWRfc2V0dGluZy5pdGVtcygpIGlmIHYgaXMgTm9uZV0KICAgIGZvciBrZXkgaW4gbm9uZV9rZXlzOgogICAgICAgIGRlbCBtZXJnZWRfc2V0dGluZ1trZXldCgogICAgcmV0dXJuIG1lcmdlZF9zZXR0aW5nCgoKZGVmIG1lcmdlX2hvb2tzKHJlcXVlc3RfaG9va3MsIHNlc3Npb25faG9va3MsIGRpY3RfY2xhc3M9T3JkZXJlZERpY3QpOgogICAgIiIiUHJvcGVybHkgbWVyZ2VzIGJvdGggcmVxdWVzdHMgYW5kIHNlc3Npb24gaG9va3MuCgogICAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIHJlcXVlc3RfaG9va3MgPT0geydyZXNwb25zZSc6IFtdfSwgdGhlCiAgICBtZXJnZSBicmVha3MgU2Vzc2lvbiBob29rcyBlbnRpcmVseS4KICAgICIiIgogICAgaWYgc2Vzc2lvbl9ob29rcyBpcyBOb25lIG9yIHNlc3Npb25faG9va3MuZ2V0KCdyZXNwb25zZScpID09IFtdOgogICAgICAgIHJldHVybiByZXF1ZXN0X2hvb2tzCgogICAgaWYgcmVxdWVzdF9ob29rcyBpcyBOb25lIG9yIHJlcXVlc3RfaG9va3MuZ2V0KCdyZXNwb25zZScpID09IFtdOgogICAgICAgIHJldHVybiBzZXNzaW9uX2hvb2tzCgogICAgcmV0dXJuIG1lcmdlX3NldHRpbmcocmVxdWVzdF9ob29rcywgc2Vzc2lvbl9ob29rcywgZGljdF9jbGFzcykKCgpjbGFzcyBTZXNzaW9uUmVkaXJlY3RNaXhpbihvYmplY3QpOgoKICAgIGRlZiBnZXRfcmVkaXJlY3RfdGFyZ2V0KHNlbGYsIHJlc3ApOgogICAgICAgICIiIlJlY2VpdmVzIGEgUmVzcG9uc2UuIFJldHVybnMgYSByZWRpcmVjdCBVUkkgb3IgYGBOb25lYGAiIiIKICAgICAgICAjIER1ZSB0byB0aGUgbmF0dXJlIG9mIGhvdyByZXF1ZXN0cyBwcm9jZXNzZXMgcmVkaXJlY3RzIHRoaXMgbWV0aG9kIHdpbGwKICAgICAgICAjIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHVwb24gdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGFuZCBhdCBsZWFzdCB0d2ljZQogICAgICAgICMgb24gZWFjaCBzdWJzZXF1ZW50IHJlZGlyZWN0IHJlc3BvbnNlIChpZiBhbnkpLgogICAgICAgICMgSWYgYSBjdXN0b20gbWl4aW4gaXMgdXNlZCB0byBoYW5kbGUgdGhpcyBsb2dpYywgaXQgbWF5IGJlIGFkdmFudGFnZW91cwogICAgICAgICMgdG8gY2FjaGUgdGhlIHJlZGlyZWN0IGxvY2F0aW9uIG9udG8gdGhlIHJlc3BvbnNlIG9iamVjdCBhcyBhIHByaXZhdGUKICAgICAgICAjIGF0dHJpYnV0ZS4KICAgICAgICBpZiByZXNwLmlzX3JlZGlyZWN0OgogICAgICAgICAgICBsb2NhdGlvbiA9IHJlc3AuaGVhZGVyc1snbG9jYXRpb24nXQogICAgICAgICAgICAjIEN1cnJlbnRseSB0aGUgdW5kZXJseWluZyBodHRwIG1vZHVsZSBvbiBweTMgZGVjb2RlIGhlYWRlcnMKICAgICAgICAgICAgIyBpbiBsYXRpbjEsIGJ1dCBlbXBpcmljYWwgZXZpZGVuY2Ugc3VnZ2VzdHMgdGhhdCBsYXRpbjEgaXMgdmVyeQogICAgICAgICAgICAjIHJhcmVseSB1c2VkIHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gSFRUUCBoZWFkZXJzLgogICAgICAgICAgICAjIEl0IGlzIG1vcmUgbGlrZWx5IHRvIGdldCBVVEY4IGhlYWRlciByYXRoZXIgdGhhbiBsYXRpbjEuCiAgICAgICAgICAgICMgVGhpcyBjYXVzZXMgaW5jb3JyZWN0IGhhbmRsaW5nIG9mIFVURjggZW5jb2RlZCBsb2NhdGlvbiBoZWFkZXJzLgogICAgICAgICAgICAjIFRvIHNvbHZlIHRoaXMsIHdlIHJlLWVuY29kZSB0aGUgbG9jYXRpb24gaW4gbGF0aW4xLgogICAgICAgICAgICBpZiBpc19weTM6CiAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGxvY2F0aW9uLmVuY29kZSgnbGF0aW4xJykKICAgICAgICAgICAgcmV0dXJuIHRvX25hdGl2ZV9zdHJpbmcobG9jYXRpb24sICd1dGY4JykKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiByZXNvbHZlX3JlZGlyZWN0cyhzZWxmLCByZXNwLCByZXEsIHN0cmVhbT1GYWxzZSwgdGltZW91dD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeT1UcnVlLCBjZXJ0PU5vbmUsIHByb3hpZXM9Tm9uZSwgeWllbGRfcmVxdWVzdHM9RmFsc2UsICoqYWRhcHRlcl9rd2FyZ3MpOgogICAgICAgICIiIlJlY2VpdmVzIGEgUmVzcG9uc2UuIFJldHVybnMgYSBnZW5lcmF0b3Igb2YgUmVzcG9uc2VzIG9yIFJlcXVlc3RzLiIiIgoKICAgICAgICBoaXN0ID0gW10gICMga2VlcCB0cmFjayBvZiBoaXN0b3J5CgogICAgICAgIHVybCA9IHNlbGYuZ2V0X3JlZGlyZWN0X3RhcmdldChyZXNwKQogICAgICAgIHdoaWxlIHVybDoKICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdCA9IHJlcS5jb3B5KCkKCiAgICAgICAgICAgICMgVXBkYXRlIGhpc3RvcnkgYW5kIGtlZXAgdHJhY2sgb2YgcmVkaXJlY3RzLgogICAgICAgICAgICAjIHJlc3AuaGlzdG9yeSBtdXN0IGlnbm9yZSB0aGUgb3JpZ2luYWwgcmVxdWVzdCBpbiB0aGlzIGxvb3AKICAgICAgICAgICAgaGlzdC5hcHBlbmQocmVzcCkKICAgICAgICAgICAgcmVzcC5oaXN0b3J5ID0gaGlzdFsxOl0KCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3AuY29udGVudCAgIyBDb25zdW1lIHNvY2tldCBzbyBpdCBjYW4gYmUgcmVsZWFzZWQKICAgICAgICAgICAgZXhjZXB0IChDaHVua2VkRW5jb2RpbmdFcnJvciwgQ29udGVudERlY29kaW5nRXJyb3IsIFJ1bnRpbWVFcnJvcik6CiAgICAgICAgICAgICAgICByZXNwLnJhdy5yZWFkKGRlY29kZV9jb250ZW50PUZhbHNlKQoKICAgICAgICAgICAgaWYgbGVuKHJlc3AuaGlzdG9yeSkgPj0gc2VsZi5tYXhfcmVkaXJlY3RzOgogICAgICAgICAgICAgICAgcmFpc2UgVG9vTWFueVJlZGlyZWN0cygnRXhjZWVkZWQgJXMgcmVkaXJlY3RzLicgJSBzZWxmLm1heF9yZWRpcmVjdHMsIHJlc3BvbnNlPXJlc3ApCgogICAgICAgICAgICAjIFJlbGVhc2UgdGhlIGNvbm5lY3Rpb24gYmFjayBpbnRvIHRoZSBwb29sLgogICAgICAgICAgICByZXNwLmNsb3NlKCkKCiAgICAgICAgICAgICMgSGFuZGxlIHJlZGlyZWN0aW9uIHdpdGhvdXQgc2NoZW1lIChzZWU6IFJGQyAxODA4IFNlY3Rpb24gNCkKICAgICAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJy8vJyk6CiAgICAgICAgICAgICAgICBwYXJzZWRfcnVybCA9IHVybHBhcnNlKHJlc3AudXJsKQogICAgICAgICAgICAgICAgdXJsID0gJyVzOiVzJyAlICh0b19uYXRpdmVfc3RyaW5nKHBhcnNlZF9ydXJsLnNjaGVtZSksIHVybCkKCiAgICAgICAgICAgICMgVGhlIHNjaGVtZSBzaG91bGQgYmUgbG93ZXIgY2FzZS4uLgogICAgICAgICAgICBwYXJzZWQgPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIHVybCA9IHBhcnNlZC5nZXR1cmwoKQoKICAgICAgICAgICAgIyBGYWNpbGl0YXRlIHJlbGF0aXZlICdsb2NhdGlvbicgaGVhZGVycywgYXMgYWxsb3dlZCBieSBSRkMgNzIzMS4KICAgICAgICAgICAgIyAoZS5nLiAnL3BhdGgvdG8vcmVzb3VyY2UnIGluc3RlYWQgb2YgJ2h0dHA6Ly9kb21haW4udGxkL3BhdGgvdG8vcmVzb3VyY2UnKQogICAgICAgICAgICAjIENvbXBsaWFudCB3aXRoIFJGQzM5ODYsIHdlIHBlcmNlbnQgZW5jb2RlIHRoZSB1cmwuCiAgICAgICAgICAgIGlmIG5vdCBwYXJzZWQubmV0bG9jOgogICAgICAgICAgICAgICAgdXJsID0gdXJsam9pbihyZXNwLnVybCwgcmVxdW90ZV91cmkodXJsKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHVybCA9IHJlcXVvdGVfdXJpKHVybCkKCiAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QudXJsID0gdG9fbmF0aXZlX3N0cmluZyh1cmwpCgogICAgICAgICAgICBzZWxmLnJlYnVpbGRfbWV0aG9kKHByZXBhcmVkX3JlcXVlc3QsIHJlc3ApCgogICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9pc3N1ZXMvMTA4NAogICAgICAgICAgICBpZiByZXNwLnN0YXR1c19jb2RlIG5vdCBpbiAoY29kZXMudGVtcG9yYXJ5X3JlZGlyZWN0LCBjb2Rlcy5wZXJtYW5lbnRfcmVkaXJlY3QpOgogICAgICAgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvaXNzdWVzLzM0OTAKICAgICAgICAgICAgICAgIHB1cmdlZF9oZWFkZXJzID0gKCdDb250ZW50LUxlbmd0aCcsICdDb250ZW50LVR5cGUnLCAnVHJhbnNmZXItRW5jb2RpbmcnKQogICAgICAgICAgICAgICAgZm9yIGhlYWRlciBpbiBwdXJnZWRfaGVhZGVyczoKICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0LmhlYWRlcnMucG9wKGhlYWRlciwgTm9uZSkKICAgICAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QuYm9keSA9IE5vbmUKCiAgICAgICAgICAgIGhlYWRlcnMgPSBwcmVwYXJlZF9yZXF1ZXN0LmhlYWRlcnMKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGVsIGhlYWRlcnNbJ0Nvb2tpZSddCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgICAgICMgRXh0cmFjdCBhbnkgY29va2llcyBzZW50IG9uIHRoZSByZXNwb25zZSB0byB0aGUgY29va2llamFyCiAgICAgICAgICAgICMgaW4gdGhlIG5ldyByZXF1ZXN0LiBCZWNhdXNlIHdlJ3ZlIG11dGF0ZWQgb3VyIGNvcGllZCBwcmVwYXJlZAogICAgICAgICAgICAjIHJlcXVlc3QsIHVzZSB0aGUgb2xkIG9uZSB0aGF0IHdlIGhhdmVuJ3QgeWV0IHRvdWNoZWQuCiAgICAgICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIocHJlcGFyZWRfcmVxdWVzdC5fY29va2llcywgcmVxLCByZXNwLnJhdykKICAgICAgICAgICAgbWVyZ2VfY29va2llcyhwcmVwYXJlZF9yZXF1ZXN0Ll9jb29raWVzLCBzZWxmLmNvb2tpZXMpCiAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QucHJlcGFyZV9jb29raWVzKHByZXBhcmVkX3JlcXVlc3QuX2Nvb2tpZXMpCgogICAgICAgICAgICAjIFJlYnVpbGQgYXV0aCBhbmQgcHJveHkgaW5mb3JtYXRpb24uCiAgICAgICAgICAgIHByb3hpZXMgPSBzZWxmLnJlYnVpbGRfcHJveGllcyhwcmVwYXJlZF9yZXF1ZXN0LCBwcm94aWVzKQogICAgICAgICAgICBzZWxmLnJlYnVpbGRfYXV0aChwcmVwYXJlZF9yZXF1ZXN0LCByZXNwKQoKICAgICAgICAgICAgIyBBIGZhaWxlZCB0ZWxsKCkgc2V0cyBgX2JvZHlfcG9zaXRpb25gIHRvIGBvYmplY3QoKWAuIFRoaXMgbm9uLU5vbmUKICAgICAgICAgICAgIyB2YWx1ZSBlbnN1cmVzIGByZXdpbmRhYmxlYCB3aWxsIGJlIFRydWUsIGFsbG93aW5nIHVzIHRvIHJhaXNlIGFuCiAgICAgICAgICAgICMgVW5yZXdpbmRhYmxlQm9keUVycm9yLCBpbnN0ZWFkIG9mIGhhbmdpbmcgdGhlIGNvbm5lY3Rpb24uCiAgICAgICAgICAgIHJld2luZGFibGUgPSAoCiAgICAgICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0Ll9ib2R5X3Bvc2l0aW9uIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgICAgKCdDb250ZW50LUxlbmd0aCcgaW4gaGVhZGVycyBvciAnVHJhbnNmZXItRW5jb2RpbmcnIGluIGhlYWRlcnMpCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgQXR0ZW1wdCB0byByZXdpbmQgY29uc3VtZWQgZmlsZS1saWtlIG9iamVjdC4KICAgICAgICAgICAgaWYgcmV3aW5kYWJsZToKICAgICAgICAgICAgICAgIHJld2luZF9ib2R5KHByZXBhcmVkX3JlcXVlc3QpCgogICAgICAgICAgICAjIE92ZXJyaWRlIHRoZSBvcmlnaW5hbCByZXF1ZXN0LgogICAgICAgICAgICByZXEgPSBwcmVwYXJlZF9yZXF1ZXN0CgogICAgICAgICAgICBpZiB5aWVsZF9yZXF1ZXN0czoKICAgICAgICAgICAgICAgIHlpZWxkIHJlcQogICAgICAgICAgICBlbHNlOgoKICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLnNlbmQoCiAgICAgICAgICAgICAgICAgICAgcmVxLAogICAgICAgICAgICAgICAgICAgIHN0cmVhbT1zdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LAogICAgICAgICAgICAgICAgICAgIHZlcmlmeT12ZXJpZnksCiAgICAgICAgICAgICAgICAgICAgY2VydD1jZXJ0LAogICAgICAgICAgICAgICAgICAgIHByb3hpZXM9cHJveGllcywKICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWRpcmVjdHM9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgKiphZGFwdGVyX2t3YXJncwogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIoc2VsZi5jb29raWVzLCBwcmVwYXJlZF9yZXF1ZXN0LCByZXNwLnJhdykKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgcmVkaXJlY3QgdXJsLCBpZiBhbnksIGZvciB0aGUgbmV4dCBsb29wCiAgICAgICAgICAgICAgICB1cmwgPSBzZWxmLmdldF9yZWRpcmVjdF90YXJnZXQocmVzcCkKICAgICAgICAgICAgICAgIHlpZWxkIHJlc3AKCiAgICBkZWYgcmVidWlsZF9hdXRoKHNlbGYsIHByZXBhcmVkX3JlcXVlc3QsIHJlc3BvbnNlKToKICAgICAgICAiIiJXaGVuIGJlaW5nIHJlZGlyZWN0ZWQgd2UgbWF5IHdhbnQgdG8gc3RyaXAgYXV0aGVudGljYXRpb24gZnJvbSB0aGUKICAgICAgICByZXF1ZXN0IHRvIGF2b2lkIGxlYWtpbmcgY3JlZGVudGlhbHMuIFRoaXMgbWV0aG9kIGludGVsbGlnZW50bHkgcmVtb3ZlcwogICAgICAgIGFuZCByZWFwcGxpZXMgYXV0aGVudGljYXRpb24gd2hlcmUgcG9zc2libGUgdG8gYXZvaWQgY3JlZGVudGlhbCBsb3NzLgogICAgICAgICIiIgogICAgICAgIGhlYWRlcnMgPSBwcmVwYXJlZF9yZXF1ZXN0LmhlYWRlcnMKICAgICAgICB1cmwgPSBwcmVwYXJlZF9yZXF1ZXN0LnVybAoKICAgICAgICBpZiAnQXV0aG9yaXphdGlvbicgaW4gaGVhZGVyczoKICAgICAgICAgICAgIyBJZiB3ZSBnZXQgcmVkaXJlY3RlZCB0byBhIG5ldyBob3N0LCB3ZSBzaG91bGQgc3RyaXAgb3V0IGFueQogICAgICAgICAgICAjIGF1dGhlbnRpY2F0aW9uIGhlYWRlcnMuCiAgICAgICAgICAgIG9yaWdpbmFsX3BhcnNlZCA9IHVybHBhcnNlKHJlc3BvbnNlLnJlcXVlc3QudXJsKQogICAgICAgICAgICByZWRpcmVjdF9wYXJzZWQgPSB1cmxwYXJzZSh1cmwpCgogICAgICAgICAgICBpZiAob3JpZ2luYWxfcGFyc2VkLmhvc3RuYW1lICE9IHJlZGlyZWN0X3BhcnNlZC5ob3N0bmFtZSk6CiAgICAgICAgICAgICAgICBkZWwgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddCgogICAgICAgICMgLm5ldHJjIG1pZ2h0IGhhdmUgbW9yZSBhdXRoIGZvciB1cyBvbiBvdXIgbmV3IGhvc3QuCiAgICAgICAgbmV3X2F1dGggPSBnZXRfbmV0cmNfYXV0aCh1cmwpIGlmIHNlbGYudHJ1c3RfZW52IGVsc2UgTm9uZQogICAgICAgIGlmIG5ld19hdXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0LnByZXBhcmVfYXV0aChuZXdfYXV0aCkKCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHJlYnVpbGRfcHJveGllcyhzZWxmLCBwcmVwYXJlZF9yZXF1ZXN0LCBwcm94aWVzKToKICAgICAgICAiIiJUaGlzIG1ldGhvZCByZS1ldmFsdWF0ZXMgdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24gYnkgY29uc2lkZXJpbmcgdGhlCiAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBJZiB3ZSBhcmUgcmVkaXJlY3RlZCB0byBhIFVSTCBjb3ZlcmVkIGJ5CiAgICAgICAgTk9fUFJPWFksIHdlIHN0cmlwIHRoZSBwcm94eSBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIHdlIHNldCBtaXNzaW5nCiAgICAgICAgcHJveHkga2V5cyBmb3IgdGhpcyBVUkwgKGluIGNhc2UgdGhleSB3ZXJlIHN0cmlwcGVkIGJ5IGEgcHJldmlvdXMKICAgICAgICByZWRpcmVjdCkuCgogICAgICAgIFRoaXMgbWV0aG9kIGFsc28gcmVwbGFjZXMgdGhlIFByb3h5LUF1dGhvcml6YXRpb24gaGVhZGVyIHdoZXJlCiAgICAgICAgbmVjZXNzYXJ5LgoKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICBwcm94aWVzID0gcHJveGllcyBpZiBwcm94aWVzIGlzIG5vdCBOb25lIGVsc2Uge30KICAgICAgICBoZWFkZXJzID0gcHJlcGFyZWRfcmVxdWVzdC5oZWFkZXJzCiAgICAgICAgdXJsID0gcHJlcGFyZWRfcmVxdWVzdC51cmwKICAgICAgICBzY2hlbWUgPSB1cmxwYXJzZSh1cmwpLnNjaGVtZQogICAgICAgIG5ld19wcm94aWVzID0gcHJveGllcy5jb3B5KCkKICAgICAgICBub19wcm94eSA9IHByb3hpZXMuZ2V0KCdub19wcm94eScpCgogICAgICAgIGJ5cGFzc19wcm94eSA9IHNob3VsZF9ieXBhc3NfcHJveGllcyh1cmwsIG5vX3Byb3h5PW5vX3Byb3h5KQogICAgICAgIGlmIHNlbGYudHJ1c3RfZW52IGFuZCBub3QgYnlwYXNzX3Byb3h5OgogICAgICAgICAgICBlbnZpcm9uX3Byb3hpZXMgPSBnZXRfZW52aXJvbl9wcm94aWVzKHVybCwgbm9fcHJveHk9bm9fcHJveHkpCgogICAgICAgICAgICBwcm94eSA9IGVudmlyb25fcHJveGllcy5nZXQoc2NoZW1lLCBlbnZpcm9uX3Byb3hpZXMuZ2V0KCdhbGwnKSkKCiAgICAgICAgICAgIGlmIHByb3h5OgogICAgICAgICAgICAgICAgbmV3X3Byb3hpZXMuc2V0ZGVmYXVsdChzY2hlbWUsIHByb3h5KQoKICAgICAgICBpZiAnUHJveHktQXV0aG9yaXphdGlvbicgaW4gaGVhZGVyczoKICAgICAgICAgICAgZGVsIGhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IGdldF9hdXRoX2Zyb21fdXJsKG5ld19wcm94aWVzW3NjaGVtZV0pCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBOb25lLCBOb25lCgogICAgICAgIGlmIHVzZXJuYW1lIGFuZCBwYXNzd29yZDoKICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gX2Jhc2ljX2F1dGhfc3RyKHVzZXJuYW1lLCBwYXNzd29yZCkKCiAgICAgICAgcmV0dXJuIG5ld19wcm94aWVzCgogICAgZGVmIHJlYnVpbGRfbWV0aG9kKHNlbGYsIHByZXBhcmVkX3JlcXVlc3QsIHJlc3BvbnNlKToKICAgICAgICAiIiJXaGVuIGJlaW5nIHJlZGlyZWN0ZWQgd2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoZSBtZXRob2Qgb2YgdGhlIHJlcXVlc3QKICAgICAgICBiYXNlZCBvbiBjZXJ0YWluIHNwZWNzIG9yIGJyb3dzZXIgYmVoYXZpb3IuCiAgICAgICAgIiIiCiAgICAgICAgbWV0aG9kID0gcHJlcGFyZWRfcmVxdWVzdC5tZXRob2QKCiAgICAgICAgIyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjQKICAgICAgICBpZiByZXNwb25zZS5zdGF0dXNfY29kZSA9PSBjb2Rlcy5zZWVfb3RoZXIgYW5kIG1ldGhvZCAhPSAnSEVBRCc6CiAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgICMgRG8gd2hhdCB0aGUgYnJvd3NlcnMgZG8sIGRlc3BpdGUgc3RhbmRhcmRzLi4uCiAgICAgICAgIyBGaXJzdCwgdHVybiAzMDJzIGludG8gR0VUcy4KICAgICAgICBpZiByZXNwb25zZS5zdGF0dXNfY29kZSA9PSBjb2Rlcy5mb3VuZCBhbmQgbWV0aG9kICE9ICdIRUFEJzoKICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgIyBTZWNvbmQsIGlmIGEgUE9TVCBpcyByZXNwb25kZWQgdG8gd2l0aCBhIDMwMSwgdHVybiBpdCBpbnRvIGEgR0VULgogICAgICAgICMgVGhpcyBiaXphcnJlIGJlaGF2aW91ciBpcyBleHBsYWluZWQgaW4gSXNzdWUgMTcwNC4KICAgICAgICBpZiByZXNwb25zZS5zdGF0dXNfY29kZSA9PSBjb2Rlcy5tb3ZlZCBhbmQgbWV0aG9kID09ICdQT1NUJzoKICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC5tZXRob2QgPSBtZXRob2QKCgpjbGFzcyBTZXNzaW9uKFNlc3Npb25SZWRpcmVjdE1peGluKToKICAgICIiIkEgUmVxdWVzdHMgc2Vzc2lvbi4KCiAgICBQcm92aWRlcyBjb29raWUgcGVyc2lzdGVuY2UsIGNvbm5lY3Rpb24tcG9vbGluZywgYW5kIGNvbmZpZ3VyYXRpb24uCgogICAgQmFzaWMgVXNhZ2U6OgoKICAgICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICAgICA+Pj4gcyA9IHJlcXVlc3RzLlNlc3Npb24oKQogICAgICA+Pj4gcy5nZXQoJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA8UmVzcG9uc2UgWzIwMF0+CgogICAgT3IgYXMgYSBjb250ZXh0IG1hbmFnZXI6OgoKICAgICAgPj4+IHdpdGggcmVxdWVzdHMuU2Vzc2lvbigpIGFzIHM6CiAgICAgID4+PiAgICAgcy5nZXQoJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA8UmVzcG9uc2UgWzIwMF0+CiAgICAiIiIKCiAgICBfX2F0dHJzX18gPSBbCiAgICAgICAgJ2hlYWRlcnMnLCAnY29va2llcycsICdhdXRoJywgJ3Byb3hpZXMnLCAnaG9va3MnLCAncGFyYW1zJywgJ3ZlcmlmeScsCiAgICAgICAgJ2NlcnQnLCAncHJlZmV0Y2gnLCAnYWRhcHRlcnMnLCAnc3RyZWFtJywgJ3RydXN0X2VudicsCiAgICAgICAgJ21heF9yZWRpcmVjdHMnLAogICAgXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKCiAgICAgICAgIzogQSBjYXNlLWluc2Vuc2l0aXZlIGRpY3Rpb25hcnkgb2YgaGVhZGVycyB0byBiZSBzZW50IG9uIGVhY2gKICAgICAgICAjOiA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YCBzZW50IGZyb20gdGhpcwogICAgICAgICM6IDpjbGFzczpgU2Vzc2lvbiA8U2Vzc2lvbj5gLgogICAgICAgIHNlbGYuaGVhZGVycyA9IGRlZmF1bHRfaGVhZGVycygpCgogICAgICAgICM6IERlZmF1bHQgQXV0aGVudGljYXRpb24gdHVwbGUgb3Igb2JqZWN0IHRvIGF0dGFjaCB0bwogICAgICAgICM6IDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gLgogICAgICAgIHNlbGYuYXV0aCA9IE5vbmUKCiAgICAgICAgIzogRGljdGlvbmFyeSBtYXBwaW5nIHByb3RvY29sIG9yIHByb3RvY29sIGFuZCBob3N0IHRvIHRoZSBVUkwgb2YgdGhlIHByb3h5CiAgICAgICAgIzogKGUuZy4geydodHRwJzogJ2Zvby5iYXI6MzEyOCcsICdodHRwOi8vaG9zdC5uYW1lJzogJ2Zvby5iYXI6NDAxMid9KSB0bwogICAgICAgICM6IGJlIHVzZWQgb24gZWFjaCA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YC4KICAgICAgICBzZWxmLnByb3hpZXMgPSB7fQoKICAgICAgICAjOiBFdmVudC1oYW5kbGluZyBob29rcy4KICAgICAgICBzZWxmLmhvb2tzID0gZGVmYXVsdF9ob29rcygpCgogICAgICAgICM6IERpY3Rpb25hcnkgb2YgcXVlcnlzdHJpbmcgZGF0YSB0byBhdHRhY2ggdG8gZWFjaAogICAgICAgICM6IDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gLiBUaGUgZGljdGlvbmFyeSB2YWx1ZXMgbWF5IGJlIGxpc3RzIGZvcgogICAgICAgICM6IHJlcHJlc2VudGluZyBtdWx0aXZhbHVlZCBxdWVyeSBwYXJhbWV0ZXJzLgogICAgICAgIHNlbGYucGFyYW1zID0ge30KCiAgICAgICAgIzogU3RyZWFtIHJlc3BvbnNlIGNvbnRlbnQgZGVmYXVsdC4KICAgICAgICBzZWxmLnN0cmVhbSA9IEZhbHNlCgogICAgICAgICM6IFNTTCBWZXJpZmljYXRpb24gZGVmYXVsdC4KICAgICAgICBzZWxmLnZlcmlmeSA9IFRydWUKCiAgICAgICAgIzogU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZSBkZWZhdWx0LCBpZiBTdHJpbmcsIHBhdGggdG8gc3NsIGNsaWVudAogICAgICAgICM6IGNlcnQgZmlsZSAoLnBlbSkuIElmIFR1cGxlLCAoJ2NlcnQnLCAna2V5JykgcGFpci4KICAgICAgICBzZWxmLmNlcnQgPSBOb25lCgogICAgICAgICM6IE1heGltdW0gbnVtYmVyIG9mIHJlZGlyZWN0cyBhbGxvd2VkLiBJZiB0aGUgcmVxdWVzdCBleGNlZWRzIHRoaXMKICAgICAgICAjOiBsaW1pdCwgYSA6Y2xhc3M6YFRvb01hbnlSZWRpcmVjdHNgIGV4Y2VwdGlvbiBpcyByYWlzZWQuCiAgICAgICAgIzogVGhpcyBkZWZhdWx0cyB0byByZXF1ZXN0cy5tb2RlbHMuREVGQVVMVF9SRURJUkVDVF9MSU1JVCwgd2hpY2ggaXMKICAgICAgICAjOiAzMC4KICAgICAgICBzZWxmLm1heF9yZWRpcmVjdHMgPSBERUZBVUxUX1JFRElSRUNUX0xJTUlUCgogICAgICAgICM6IFRydXN0IGVudmlyb25tZW50IHNldHRpbmdzIGZvciBwcm94eSBjb25maWd1cmF0aW9uLCBkZWZhdWx0CiAgICAgICAgIzogYXV0aGVudGljYXRpb24gYW5kIHNpbWlsYXIuCiAgICAgICAgc2VsZi50cnVzdF9lbnYgPSBUcnVlCgogICAgICAgICM6IEEgQ29va2llSmFyIGNvbnRhaW5pbmcgYWxsIGN1cnJlbnRseSBvdXRzdGFuZGluZyBjb29raWVzIHNldCBvbiB0aGlzCiAgICAgICAgIzogc2Vzc2lvbi4gQnkgZGVmYXVsdCBpdCBpcyBhCiAgICAgICAgIzogOmNsYXNzOmBSZXF1ZXN0c0Nvb2tpZUphciA8cmVxdWVzdHMuY29va2llcy5SZXF1ZXN0c0Nvb2tpZUphcj5gLCBidXQKICAgICAgICAjOiBtYXkgYmUgYW55IG90aGVyIGBgY29va2llbGliLkNvb2tpZUphcmBgIGNvbXBhdGlibGUgb2JqZWN0LgogICAgICAgIHNlbGYuY29va2llcyA9IGNvb2tpZWphcl9mcm9tX2RpY3Qoe30pCgogICAgICAgICMgRGVmYXVsdCBjb25uZWN0aW9uIGFkYXB0ZXJzLgogICAgICAgIHNlbGYuYWRhcHRlcnMgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgc2VsZi5tb3VudCgnaHR0cHM6Ly8nLCBIVFRQQWRhcHRlcigpKQogICAgICAgIHNlbGYubW91bnQoJ2h0dHA6Ly8nLCBIVFRQQWRhcHRlcigpKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiBwcmVwYXJlX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CiAgICAgICAgIiIiQ29uc3RydWN0cyBhIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBmb3IKICAgICAgICB0cmFuc21pc3Npb24gYW5kIHJldHVybnMgaXQuIFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdGAgaGFzIHNldHRpbmdzCiAgICAgICAgbWVyZ2VkIGZyb20gdGhlIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gIGluc3RhbmNlIGFuZCB0aG9zZSBvZiB0aGUKICAgICAgICA6Y2xhc3M6YFNlc3Npb25gLgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogOmNsYXNzOmBSZXF1ZXN0YCBpbnN0YW5jZSB0byBwcmVwYXJlIHdpdGggdGhpcwogICAgICAgICAgICBzZXNzaW9uJ3Mgc2V0dGluZ3MuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5QcmVwYXJlZFJlcXVlc3QKICAgICAgICAiIiIKICAgICAgICBjb29raWVzID0gcmVxdWVzdC5jb29raWVzIG9yIHt9CgogICAgICAgICMgQm9vdHN0cmFwIENvb2tpZUphci4KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb29raWVzLCBjb29raWVsaWIuQ29va2llSmFyKToKICAgICAgICAgICAgY29va2llcyA9IGNvb2tpZWphcl9mcm9tX2RpY3QoY29va2llcykKCiAgICAgICAgIyBNZXJnZSB3aXRoIHNlc3Npb24gY29va2llcwogICAgICAgIG1lcmdlZF9jb29raWVzID0gbWVyZ2VfY29va2llcygKICAgICAgICAgICAgbWVyZ2VfY29va2llcyhSZXF1ZXN0c0Nvb2tpZUphcigpLCBzZWxmLmNvb2tpZXMpLCBjb29raWVzKQoKICAgICAgICAjIFNldCBlbnZpcm9ubWVudCdzIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGlmIG5vdCBleHBsaWNpdGx5IHNldC4KICAgICAgICBhdXRoID0gcmVxdWVzdC5hdXRoCiAgICAgICAgaWYgc2VsZi50cnVzdF9lbnYgYW5kIG5vdCBhdXRoIGFuZCBub3Qgc2VsZi5hdXRoOgogICAgICAgICAgICBhdXRoID0gZ2V0X25ldHJjX2F1dGgocmVxdWVzdC51cmwpCgogICAgICAgIHAgPSBQcmVwYXJlZFJlcXVlc3QoKQogICAgICAgIHAucHJlcGFyZSgKICAgICAgICAgICAgbWV0aG9kPXJlcXVlc3QubWV0aG9kLnVwcGVyKCksCiAgICAgICAgICAgIHVybD1yZXF1ZXN0LnVybCwKICAgICAgICAgICAgZmlsZXM9cmVxdWVzdC5maWxlcywKICAgICAgICAgICAgZGF0YT1yZXF1ZXN0LmRhdGEsCiAgICAgICAgICAgIGpzb249cmVxdWVzdC5qc29uLAogICAgICAgICAgICBoZWFkZXJzPW1lcmdlX3NldHRpbmcocmVxdWVzdC5oZWFkZXJzLCBzZWxmLmhlYWRlcnMsIGRpY3RfY2xhc3M9Q2FzZUluc2Vuc2l0aXZlRGljdCksCiAgICAgICAgICAgIHBhcmFtcz1tZXJnZV9zZXR0aW5nKHJlcXVlc3QucGFyYW1zLCBzZWxmLnBhcmFtcyksCiAgICAgICAgICAgIGF1dGg9bWVyZ2Vfc2V0dGluZyhhdXRoLCBzZWxmLmF1dGgpLAogICAgICAgICAgICBjb29raWVzPW1lcmdlZF9jb29raWVzLAogICAgICAgICAgICBob29rcz1tZXJnZV9ob29rcyhyZXF1ZXN0Lmhvb2tzLCBzZWxmLmhvb2tzKSwKICAgICAgICApCiAgICAgICAgcmV0dXJuIHAKCiAgICBkZWYgcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwKICAgICAgICAgICAgcGFyYW1zPU5vbmUsIGRhdGE9Tm9uZSwgaGVhZGVycz1Ob25lLCBjb29raWVzPU5vbmUsIGZpbGVzPU5vbmUsCiAgICAgICAgICAgIGF1dGg9Tm9uZSwgdGltZW91dD1Ob25lLCBhbGxvd19yZWRpcmVjdHM9VHJ1ZSwgcHJveGllcz1Ob25lLAogICAgICAgICAgICBob29rcz1Ob25lLCBzdHJlYW09Tm9uZSwgdmVyaWZ5PU5vbmUsIGNlcnQ9Tm9uZSwganNvbj1Ob25lKToKICAgICAgICAiIiJDb25zdHJ1Y3RzIGEgOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAsIHByZXBhcmVzIGl0IGFuZCBzZW5kcyBpdC4KICAgICAgICBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gbWV0aG9kOiBtZXRob2QgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBwYXJhbXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvciBieXRlcyB0byBiZSBzZW50IGluIHRoZSBxdWVyeQogICAgICAgICAgICBzdHJpbmcgZm9yIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQKICAgICAgICAgICAgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZQogICAgICAgICAgICA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBoZWFkZXJzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb2YgSFRUUCBIZWFkZXJzIHRvIHNlbmQgd2l0aCB0aGUKICAgICAgICAgICAgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0gY29va2llczogKG9wdGlvbmFsKSBEaWN0IG9yIENvb2tpZUphciBvYmplY3QgdG8gc2VuZCB3aXRoIHRoZQogICAgICAgICAgICA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBmaWxlczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9mIGBgJ2ZpbGVuYW1lJzogZmlsZS1saWtlLW9iamVjdHNgYAogICAgICAgICAgICBmb3IgbXVsdGlwYXJ0IGVuY29kaW5nIHVwbG9hZC4KICAgICAgICA6cGFyYW0gYXV0aDogKG9wdGlvbmFsKSBBdXRoIHR1cGxlIG9yIGNhbGxhYmxlIHRvIGVuYWJsZQogICAgICAgICAgICBCYXNpYy9EaWdlc3QvQ3VzdG9tIEhUVFAgQXV0aC4KICAgICAgICA6cGFyYW0gdGltZW91dDogKG9wdGlvbmFsKSBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHNlbmQKICAgICAgICAgICAgZGF0YSBiZWZvcmUgZ2l2aW5nIHVwLCBhcyBhIGZsb2F0LCBvciBhIDpyZWY6YChjb25uZWN0IHRpbWVvdXQsCiAgICAgICAgICAgIHJlYWQgdGltZW91dCkgPHRpbWVvdXRzPmAgdHVwbGUuCiAgICAgICAgOnR5cGUgdGltZW91dDogZmxvYXQgb3IgdHVwbGUKICAgICAgICA6cGFyYW0gYWxsb3dfcmVkaXJlY3RzOiAob3B0aW9uYWwpIFNldCB0byBUcnVlIGJ5IGRlZmF1bHQuCiAgICAgICAgOnR5cGUgYWxsb3dfcmVkaXJlY3RzOiBib29sCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBtYXBwaW5nIHByb3RvY29sIG9yIHByb3RvY29sIGFuZAogICAgICAgICAgICBob3N0bmFtZSB0byB0aGUgVVJMIG9mIHRoZSBwcm94eS4KICAgICAgICA6cGFyYW0gc3RyZWFtOiAob3B0aW9uYWwpIHdoZXRoZXIgdG8gaW1tZWRpYXRlbHkgZG93bmxvYWQgdGhlIHJlc3BvbnNlCiAgICAgICAgICAgIGNvbnRlbnQuIERlZmF1bHRzIHRvIGBgRmFsc2VgYC4KICAgICAgICA6cGFyYW0gdmVyaWZ5OiAob3B0aW9uYWwpIEVpdGhlciBhIGJvb2xlYW4sIGluIHdoaWNoIGNhc2UgaXQgY29udHJvbHMgd2hldGhlciB3ZSB2ZXJpZnkKICAgICAgICAgICAgdGhlIHNlcnZlcidzIFRMUyBjZXJ0aWZpY2F0ZSwgb3IgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBhIHBhdGgKICAgICAgICAgICAgdG8gYSBDQSBidW5kbGUgdG8gdXNlLiBEZWZhdWx0cyB0byBgYFRydWVgYC4KICAgICAgICA6cGFyYW0gY2VydDogKG9wdGlvbmFsKSBpZiBTdHJpbmcsIHBhdGggdG8gc3NsIGNsaWVudCBjZXJ0IGZpbGUgKC5wZW0pLgogICAgICAgICAgICBJZiBUdXBsZSwgKCdjZXJ0JywgJ2tleScpIHBhaXIuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHRoZSBSZXF1ZXN0LgogICAgICAgIHJlcSA9IFJlcXVlc3QoCiAgICAgICAgICAgIG1ldGhvZD1tZXRob2QudXBwZXIoKSwKICAgICAgICAgICAgdXJsPXVybCwKICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICBmaWxlcz1maWxlcywKICAgICAgICAgICAgZGF0YT1kYXRhIG9yIHt9LAogICAgICAgICAgICBqc29uPWpzb24sCiAgICAgICAgICAgIHBhcmFtcz1wYXJhbXMgb3Ige30sCiAgICAgICAgICAgIGF1dGg9YXV0aCwKICAgICAgICAgICAgY29va2llcz1jb29raWVzLAogICAgICAgICAgICBob29rcz1ob29rcywKICAgICAgICApCiAgICAgICAgcHJlcCA9IHNlbGYucHJlcGFyZV9yZXF1ZXN0KHJlcSkKCiAgICAgICAgcHJveGllcyA9IHByb3hpZXMgb3Ige30KCiAgICAgICAgc2V0dGluZ3MgPSBzZWxmLm1lcmdlX2Vudmlyb25tZW50X3NldHRpbmdzKAogICAgICAgICAgICBwcmVwLnVybCwgcHJveGllcywgc3RyZWFtLCB2ZXJpZnksIGNlcnQKICAgICAgICApCgogICAgICAgICMgU2VuZCB0aGUgcmVxdWVzdC4KICAgICAgICBzZW5kX2t3YXJncyA9IHsKICAgICAgICAgICAgJ3RpbWVvdXQnOiB0aW1lb3V0LAogICAgICAgICAgICAnYWxsb3dfcmVkaXJlY3RzJzogYWxsb3dfcmVkaXJlY3RzLAogICAgICAgIH0KICAgICAgICBzZW5kX2t3YXJncy51cGRhdGUoc2V0dGluZ3MpCiAgICAgICAgcmVzcCA9IHNlbGYuc2VuZChwcmVwLCAqKnNlbmRfa3dhcmdzKQoKICAgICAgICByZXR1cm4gcmVzcAoKICAgIGRlZiBnZXQoc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgR0VUIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIFRydWUpCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnR0VUJywgdXJsLCAqKmt3YXJncykKCiAgICBkZWYgb3B0aW9ucyhzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBPUFRJT05TIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIFRydWUpCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnT1BUSU9OUycsIHVybCwgKiprd2FyZ3MpCgogICAgZGVmIGhlYWQoc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgSEVBRCByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdhbGxvd19yZWRpcmVjdHMnLCBGYWxzZSkKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdIRUFEJywgdXJsLCAqKmt3YXJncykKCiAgICBkZWYgcG9zdChzZWxmLCB1cmwsIGRhdGE9Tm9uZSwganNvbj1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgUE9TVCByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ1BPU1QnLCB1cmwsIGRhdGE9ZGF0YSwganNvbj1qc29uLCAqKmt3YXJncykKCiAgICBkZWYgcHV0KHNlbGYsIHVybCwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgUFVUIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdQVVQnLCB1cmwsIGRhdGE9ZGF0YSwgKiprd2FyZ3MpCgogICAgZGVmIHBhdGNoKHNlbGYsIHVybCwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgUEFUQ0ggcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5LCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ1BBVENIJywgdXJsLCBkYXRhPWRhdGEsICoqa3dhcmdzKQoKICAgIGRlZiBkZWxldGUoc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgREVMRVRFIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnREVMRVRFJywgdXJsLCAqKmt3YXJncykKCiAgICBkZWYgc2VuZChzZWxmLCByZXF1ZXN0LCAqKmt3YXJncyk6CiAgICAgICAgIiIiU2VuZCBhIGdpdmVuIFByZXBhcmVkUmVxdWVzdC4KCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgogICAgICAgICMgU2V0IGRlZmF1bHRzIHRoYXQgdGhlIGhvb2tzIGNhbiB1dGlsaXplIHRvIGVuc3VyZSB0aGV5IGFsd2F5cyBoYXZlCiAgICAgICAgIyB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzIHRvIHJlcHJvZHVjZSB0aGUgcHJldmlvdXMgcmVxdWVzdC4KICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnc3RyZWFtJywgc2VsZi5zdHJlYW0pCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ3ZlcmlmeScsIHNlbGYudmVyaWZ5KQogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdjZXJ0Jywgc2VsZi5jZXJ0KQogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdwcm94aWVzJywgc2VsZi5wcm94aWVzKQoKICAgICAgICAjIEl0J3MgcG9zc2libGUgdGhhdCB1c2VycyBtaWdodCBhY2NpZGVudGFsbHkgc2VuZCBhIFJlcXVlc3Qgb2JqZWN0LgogICAgICAgICMgR3VhcmQgYWdhaW5zdCB0aGF0IHNwZWNpZmljIGZhaWx1cmUgY2FzZS4KICAgICAgICBpZiBpc2luc3RhbmNlKHJlcXVlc3QsIFJlcXVlc3QpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdZb3UgY2FuIG9ubHkgc2VuZCBQcmVwYXJlZFJlcXVlc3RzLicpCgogICAgICAgICMgU2V0IHVwIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHJlc29sdmVfcmVkaXJlY3RzIGFuZCBkaXNwYXRjaGluZyBvZiBob29rcwogICAgICAgIGFsbG93X3JlZGlyZWN0cyA9IGt3YXJncy5wb3AoJ2FsbG93X3JlZGlyZWN0cycsIFRydWUpCiAgICAgICAgc3RyZWFtID0ga3dhcmdzLmdldCgnc3RyZWFtJykKICAgICAgICBob29rcyA9IHJlcXVlc3QuaG9va3MKCiAgICAgICAgIyBHZXQgdGhlIGFwcHJvcHJpYXRlIGFkYXB0ZXIgdG8gdXNlCiAgICAgICAgYWRhcHRlciA9IHNlbGYuZ2V0X2FkYXB0ZXIodXJsPXJlcXVlc3QudXJsKQoKICAgICAgICAjIFN0YXJ0IHRpbWUgKGFwcHJveGltYXRlbHkpIG9mIHRoZSByZXF1ZXN0CiAgICAgICAgc3RhcnQgPSBwcmVmZXJyZWRfY2xvY2soKQoKICAgICAgICAjIFNlbmQgdGhlIHJlcXVlc3QKICAgICAgICByID0gYWRhcHRlci5zZW5kKHJlcXVlc3QsICoqa3dhcmdzKQoKICAgICAgICAjIFRvdGFsIGVsYXBzZWQgdGltZSBvZiB0aGUgcmVxdWVzdCAoYXBwcm94aW1hdGVseSkKICAgICAgICBlbGFwc2VkID0gcHJlZmVycmVkX2Nsb2NrKCkgLSBzdGFydAogICAgICAgIHIuZWxhcHNlZCA9IHRpbWVkZWx0YShzZWNvbmRzPWVsYXBzZWQpCgogICAgICAgICMgUmVzcG9uc2UgbWFuaXB1bGF0aW9uIGhvb2tzCiAgICAgICAgciA9IGRpc3BhdGNoX2hvb2soJ3Jlc3BvbnNlJywgaG9va3MsIHIsICoqa3dhcmdzKQoKICAgICAgICAjIFBlcnNpc3QgY29va2llcwogICAgICAgIGlmIHIuaGlzdG9yeToKCiAgICAgICAgICAgICMgSWYgdGhlIGhvb2tzIGNyZWF0ZSBoaXN0b3J5IHRoZW4gd2Ugd2FudCB0aG9zZSBjb29raWVzIHRvbwogICAgICAgICAgICBmb3IgcmVzcCBpbiByLmhpc3Rvcnk6CiAgICAgICAgICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHNlbGYuY29va2llcywgcmVzcC5yZXF1ZXN0LCByZXNwLnJhdykKCiAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihzZWxmLmNvb2tpZXMsIHJlcXVlc3QsIHIucmF3KQoKICAgICAgICAjIFJlZGlyZWN0IHJlc29sdmluZyBnZW5lcmF0b3IuCiAgICAgICAgZ2VuID0gc2VsZi5yZXNvbHZlX3JlZGlyZWN0cyhyLCByZXF1ZXN0LCAqKmt3YXJncykKCiAgICAgICAgIyBSZXNvbHZlIHJlZGlyZWN0cyBpZiBhbGxvd2VkLgogICAgICAgIGhpc3RvcnkgPSBbcmVzcCBmb3IgcmVzcCBpbiBnZW5dIGlmIGFsbG93X3JlZGlyZWN0cyBlbHNlIFtdCgogICAgICAgICMgU2h1ZmZsZSB0aGluZ3MgYXJvdW5kIGlmIHRoZXJlJ3MgaGlzdG9yeS4KICAgICAgICBpZiBoaXN0b3J5OgogICAgICAgICAgICAjIEluc2VydCB0aGUgZmlyc3QgKG9yaWdpbmFsKSByZXF1ZXN0IGF0IHRoZSBzdGFydAogICAgICAgICAgICBoaXN0b3J5Lmluc2VydCgwLCByKQogICAgICAgICAgICAjIEdldCB0aGUgbGFzdCByZXF1ZXN0IG1hZGUKICAgICAgICAgICAgciA9IGhpc3RvcnkucG9wKCkKICAgICAgICAgICAgci5oaXN0b3J5ID0gaGlzdG9yeQoKICAgICAgICAjIElmIHJlZGlyZWN0cyBhcmVuJ3QgYmVpbmcgZm9sbG93ZWQsIHN0b3JlIHRoZSByZXNwb25zZSBvbiB0aGUgUmVxdWVzdCBmb3IgUmVzcG9uc2UubmV4dCgpLgogICAgICAgIGlmIG5vdCBhbGxvd19yZWRpcmVjdHM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHIuX25leHQgPSBuZXh0KHNlbGYucmVzb2x2ZV9yZWRpcmVjdHMociwgcmVxdWVzdCwgeWllbGRfcmVxdWVzdHM9VHJ1ZSwgKiprd2FyZ3MpKQogICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgbm90IHN0cmVhbToKICAgICAgICAgICAgci5jb250ZW50CgogICAgICAgIHJldHVybiByCgogICAgZGVmIG1lcmdlX2Vudmlyb25tZW50X3NldHRpbmdzKHNlbGYsIHVybCwgcHJveGllcywgc3RyZWFtLCB2ZXJpZnksIGNlcnQpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIHRoZSBlbnZpcm9ubWVudCBhbmQgbWVyZ2UgaXQgd2l0aCBzb21lIHNldHRpbmdzLgoKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICAjIEdhdGhlciBjbHVlcyBmcm9tIHRoZSBzdXJyb3VuZGluZyBlbnZpcm9ubWVudC4KICAgICAgICBpZiBzZWxmLnRydXN0X2VudjoKICAgICAgICAgICAgIyBTZXQgZW52aXJvbm1lbnQncyBwcm94aWVzLgogICAgICAgICAgICBub19wcm94eSA9IHByb3hpZXMuZ2V0KCdub19wcm94eScpIGlmIHByb3hpZXMgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAgICAgICAgICAgIGVudl9wcm94aWVzID0gZ2V0X2Vudmlyb25fcHJveGllcyh1cmwsIG5vX3Byb3h5PW5vX3Byb3h5KQogICAgICAgICAgICBmb3IgKGssIHYpIGluIGVudl9wcm94aWVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBwcm94aWVzLnNldGRlZmF1bHQoaywgdikKCiAgICAgICAgICAgICMgTG9vayBmb3IgcmVxdWVzdHMgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBhbmQgYmUgY29tcGF0aWJsZQogICAgICAgICAgICAjIHdpdGggY1VSTC4KICAgICAgICAgICAgaWYgdmVyaWZ5IGlzIFRydWUgb3IgdmVyaWZ5IGlzIE5vbmU6CiAgICAgICAgICAgICAgICB2ZXJpZnkgPSAob3MuZW52aXJvbi5nZXQoJ1JFUVVFU1RTX0NBX0JVTkRMRScpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZW52aXJvbi5nZXQoJ0NVUkxfQ0FfQlVORExFJykpCgogICAgICAgICMgTWVyZ2UgYWxsIHRoZSBrd2FyZ3MuCiAgICAgICAgcHJveGllcyA9IG1lcmdlX3NldHRpbmcocHJveGllcywgc2VsZi5wcm94aWVzKQogICAgICAgIHN0cmVhbSA9IG1lcmdlX3NldHRpbmcoc3RyZWFtLCBzZWxmLnN0cmVhbSkKICAgICAgICB2ZXJpZnkgPSBtZXJnZV9zZXR0aW5nKHZlcmlmeSwgc2VsZi52ZXJpZnkpCiAgICAgICAgY2VydCA9IG1lcmdlX3NldHRpbmcoY2VydCwgc2VsZi5jZXJ0KQoKICAgICAgICByZXR1cm4geyd2ZXJpZnknOiB2ZXJpZnksICdwcm94aWVzJzogcHJveGllcywgJ3N0cmVhbSc6IHN0cmVhbSwKICAgICAgICAgICAgICAgICdjZXJ0JzogY2VydH0KCiAgICBkZWYgZ2V0X2FkYXB0ZXIoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBjb25uZWN0aW9uIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBVUkwuCgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuYWRhcHRlcnMuQmFzZUFkYXB0ZXIKICAgICAgICAiIiIKICAgICAgICBmb3IgKHByZWZpeCwgYWRhcHRlcikgaW4gc2VsZi5hZGFwdGVycy5pdGVtcygpOgoKICAgICAgICAgICAgaWYgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXIKCiAgICAgICAgIyBOb3RoaW5nIG1hdGNoZXMgOi0vCiAgICAgICAgcmFpc2UgSW52YWxpZFNjaGVtYSgiTm8gY29ubmVjdGlvbiBhZGFwdGVycyB3ZXJlIGZvdW5kIGZvciAnJXMnIiAlIHVybCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiQ2xvc2VzIGFsbCBhZGFwdGVycyBhbmQgYXMgc3VjaCB0aGUgc2Vzc2lvbiIiIgogICAgICAgIGZvciB2IGluIHNlbGYuYWRhcHRlcnMudmFsdWVzKCk6CiAgICAgICAgICAgIHYuY2xvc2UoKQoKICAgIGRlZiBtb3VudChzZWxmLCBwcmVmaXgsIGFkYXB0ZXIpOgogICAgICAgICIiIlJlZ2lzdGVycyBhIGNvbm5lY3Rpb24gYWRhcHRlciB0byBhIHByZWZpeC4KCiAgICAgICAgQWRhcHRlcnMgYXJlIHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHByZWZpeCBsZW5ndGguCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hZGFwdGVyc1twcmVmaXhdID0gYWRhcHRlcgogICAgICAgIGtleXNfdG9fbW92ZSA9IFtrIGZvciBrIGluIHNlbGYuYWRhcHRlcnMgaWYgbGVuKGspIDwgbGVuKHByZWZpeCldCgogICAgICAgIGZvciBrZXkgaW4ga2V5c190b19tb3ZlOgogICAgICAgICAgICBzZWxmLmFkYXB0ZXJzW2tleV0gPSBzZWxmLmFkYXB0ZXJzLnBvcChrZXkpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICBzdGF0ZSA9IGRpY3QoKGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpIGZvciBhdHRyIGluIHNlbGYuX19hdHRyc19fKQogICAgICAgIHJldHVybiBzdGF0ZQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgogICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQoKCmRlZiBzZXNzaW9uKCk6CiAgICAiIiIKICAgIFJldHVybnMgYSA6Y2xhc3M6YFNlc3Npb25gIGZvciBjb250ZXh0LW1hbmFnZW1lbnQuCgogICAgOnJ0eXBlOiBTZXNzaW9uCiAgICAiIiIKCiAgICByZXR1cm4gU2Vzc2lvbigpClBLAwQUAAAAAAAAACEAQTjX4vsMAAD7DAAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RhdHVzX2NvZGVzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCmZyb20gLnN0cnVjdHVyZXMgaW1wb3J0IExvb2t1cERpY3QKCl9jb2RlcyA9IHsKCiAgICAjIEluZm9ybWF0aW9uYWwuCiAgICAxMDA6ICgnY29udGludWUnLCksCiAgICAxMDE6ICgnc3dpdGNoaW5nX3Byb3RvY29scycsKSwKICAgIDEwMjogKCdwcm9jZXNzaW5nJywpLAogICAgMTAzOiAoJ2NoZWNrcG9pbnQnLCksCiAgICAxMjI6ICgndXJpX3Rvb19sb25nJywgJ3JlcXVlc3RfdXJpX3Rvb19sb25nJyksCiAgICAyMDA6ICgnb2snLCAnb2theScsICdhbGxfb2snLCAnYWxsX29rYXknLCAnYWxsX2dvb2QnLCAnXFxvLycsICfinJMnKSwKICAgIDIwMTogKCdjcmVhdGVkJywpLAogICAgMjAyOiAoJ2FjY2VwdGVkJywpLAogICAgMjAzOiAoJ25vbl9hdXRob3JpdGF0aXZlX2luZm8nLCAnbm9uX2F1dGhvcml0YXRpdmVfaW5mb3JtYXRpb24nKSwKICAgIDIwNDogKCdub19jb250ZW50JywpLAogICAgMjA1OiAoJ3Jlc2V0X2NvbnRlbnQnLCAncmVzZXQnKSwKICAgIDIwNjogKCdwYXJ0aWFsX2NvbnRlbnQnLCAncGFydGlhbCcpLAogICAgMjA3OiAoJ211bHRpX3N0YXR1cycsICdtdWx0aXBsZV9zdGF0dXMnLCAnbXVsdGlfc3RhdGknLCAnbXVsdGlwbGVfc3RhdGknKSwKICAgIDIwODogKCdhbHJlYWR5X3JlcG9ydGVkJywpLAogICAgMjI2OiAoJ2ltX3VzZWQnLCksCgogICAgIyBSZWRpcmVjdGlvbi4KICAgIDMwMDogKCdtdWx0aXBsZV9jaG9pY2VzJywpLAogICAgMzAxOiAoJ21vdmVkX3Blcm1hbmVudGx5JywgJ21vdmVkJywgJ1xcby0nKSwKICAgIDMwMjogKCdmb3VuZCcsKSwKICAgIDMwMzogKCdzZWVfb3RoZXInLCAnb3RoZXInKSwKICAgIDMwNDogKCdub3RfbW9kaWZpZWQnLCksCiAgICAzMDU6ICgndXNlX3Byb3h5JywpLAogICAgMzA2OiAoJ3N3aXRjaF9wcm94eScsKSwKICAgIDMwNzogKCd0ZW1wb3JhcnlfcmVkaXJlY3QnLCAndGVtcG9yYXJ5X21vdmVkJywgJ3RlbXBvcmFyeScpLAogICAgMzA4OiAoJ3Blcm1hbmVudF9yZWRpcmVjdCcsCiAgICAgICAgICAncmVzdW1lX2luY29tcGxldGUnLCAncmVzdW1lJywpLCAgIyBUaGVzZSAyIHRvIGJlIHJlbW92ZWQgaW4gMy4wCgogICAgIyBDbGllbnQgRXJyb3IuCiAgICA0MDA6ICgnYmFkX3JlcXVlc3QnLCAnYmFkJyksCiAgICA0MDE6ICgndW5hdXRob3JpemVkJywpLAogICAgNDAyOiAoJ3BheW1lbnRfcmVxdWlyZWQnLCAncGF5bWVudCcpLAogICAgNDAzOiAoJ2ZvcmJpZGRlbicsKSwKICAgIDQwNDogKCdub3RfZm91bmQnLCAnLW8tJyksCiAgICA0MDU6ICgnbWV0aG9kX25vdF9hbGxvd2VkJywgJ25vdF9hbGxvd2VkJyksCiAgICA0MDY6ICgnbm90X2FjY2VwdGFibGUnLCksCiAgICA0MDc6ICgncHJveHlfYXV0aGVudGljYXRpb25fcmVxdWlyZWQnLCAncHJveHlfYXV0aCcsICdwcm94eV9hdXRoZW50aWNhdGlvbicpLAogICAgNDA4OiAoJ3JlcXVlc3RfdGltZW91dCcsICd0aW1lb3V0JyksCiAgICA0MDk6ICgnY29uZmxpY3QnLCksCiAgICA0MTA6ICgnZ29uZScsKSwKICAgIDQxMTogKCdsZW5ndGhfcmVxdWlyZWQnLCksCiAgICA0MTI6ICgncHJlY29uZGl0aW9uX2ZhaWxlZCcsICdwcmVjb25kaXRpb24nKSwKICAgIDQxMzogKCdyZXF1ZXN0X2VudGl0eV90b29fbGFyZ2UnLCksCiAgICA0MTQ6ICgncmVxdWVzdF91cmlfdG9vX2xhcmdlJywpLAogICAgNDE1OiAoJ3Vuc3VwcG9ydGVkX21lZGlhX3R5cGUnLCAndW5zdXBwb3J0ZWRfbWVkaWEnLCAnbWVkaWFfdHlwZScpLAogICAgNDE2OiAoJ3JlcXVlc3RlZF9yYW5nZV9ub3Rfc2F0aXNmaWFibGUnLCAncmVxdWVzdGVkX3JhbmdlJywgJ3JhbmdlX25vdF9zYXRpc2ZpYWJsZScpLAogICAgNDE3OiAoJ2V4cGVjdGF0aW9uX2ZhaWxlZCcsKSwKICAgIDQxODogKCdpbV9hX3RlYXBvdCcsICd0ZWFwb3QnLCAnaV9hbV9hX3RlYXBvdCcpLAogICAgNDIxOiAoJ21pc2RpcmVjdGVkX3JlcXVlc3QnLCksCiAgICA0MjI6ICgndW5wcm9jZXNzYWJsZV9lbnRpdHknLCAndW5wcm9jZXNzYWJsZScpLAogICAgNDIzOiAoJ2xvY2tlZCcsKSwKICAgIDQyNDogKCdmYWlsZWRfZGVwZW5kZW5jeScsICdkZXBlbmRlbmN5JyksCiAgICA0MjU6ICgndW5vcmRlcmVkX2NvbGxlY3Rpb24nLCAndW5vcmRlcmVkJyksCiAgICA0MjY6ICgndXBncmFkZV9yZXF1aXJlZCcsICd1cGdyYWRlJyksCiAgICA0Mjg6ICgncHJlY29uZGl0aW9uX3JlcXVpcmVkJywgJ3ByZWNvbmRpdGlvbicpLAogICAgNDI5OiAoJ3Rvb19tYW55X3JlcXVlc3RzJywgJ3Rvb19tYW55JyksCiAgICA0MzE6ICgnaGVhZGVyX2ZpZWxkc190b29fbGFyZ2UnLCAnZmllbGRzX3Rvb19sYXJnZScpLAogICAgNDQ0OiAoJ25vX3Jlc3BvbnNlJywgJ25vbmUnKSwKICAgIDQ0OTogKCdyZXRyeV93aXRoJywgJ3JldHJ5JyksCiAgICA0NTA6ICgnYmxvY2tlZF9ieV93aW5kb3dzX3BhcmVudGFsX2NvbnRyb2xzJywgJ3BhcmVudGFsX2NvbnRyb2xzJyksCiAgICA0NTE6ICgndW5hdmFpbGFibGVfZm9yX2xlZ2FsX3JlYXNvbnMnLCAnbGVnYWxfcmVhc29ucycpLAogICAgNDk5OiAoJ2NsaWVudF9jbG9zZWRfcmVxdWVzdCcsKSwKCiAgICAjIFNlcnZlciBFcnJvci4KICAgIDUwMDogKCdpbnRlcm5hbF9zZXJ2ZXJfZXJyb3InLCAnc2VydmVyX2Vycm9yJywgJy9vXFwnLCAn4pyXJyksCiAgICA1MDE6ICgnbm90X2ltcGxlbWVudGVkJywpLAogICAgNTAyOiAoJ2JhZF9nYXRld2F5JywpLAogICAgNTAzOiAoJ3NlcnZpY2VfdW5hdmFpbGFibGUnLCAndW5hdmFpbGFibGUnKSwKICAgIDUwNDogKCdnYXRld2F5X3RpbWVvdXQnLCksCiAgICA1MDU6ICgnaHR0cF92ZXJzaW9uX25vdF9zdXBwb3J0ZWQnLCAnaHR0cF92ZXJzaW9uJyksCiAgICA1MDY6ICgndmFyaWFudF9hbHNvX25lZ290aWF0ZXMnLCksCiAgICA1MDc6ICgnaW5zdWZmaWNpZW50X3N0b3JhZ2UnLCksCiAgICA1MDk6ICgnYmFuZHdpZHRoX2xpbWl0X2V4Y2VlZGVkJywgJ2JhbmR3aWR0aCcpLAogICAgNTEwOiAoJ25vdF9leHRlbmRlZCcsKSwKICAgIDUxMTogKCduZXR3b3JrX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVkJywgJ25ldHdvcmtfYXV0aCcsICduZXR3b3JrX2F1dGhlbnRpY2F0aW9uJyksCn0KCmNvZGVzID0gTG9va3VwRGljdChuYW1lPSdzdGF0dXNfY29kZXMnKQoKZm9yIGNvZGUsIHRpdGxlcyBpbiBfY29kZXMuaXRlbXMoKToKICAgIGZvciB0aXRsZSBpbiB0aXRsZXM6CiAgICAgICAgc2V0YXR0cihjb2RlcywgdGl0bGUsIGNvZGUpCiAgICAgICAgaWYgbm90IHRpdGxlLnN0YXJ0c3dpdGgoKCdcXCcsICcvJykpOgogICAgICAgICAgICBzZXRhdHRyKGNvZGVzLCB0aXRsZS51cHBlcigpLCBjb2RlKQpQSwMEFAAAAAAAAAAhAOYgyg/ECwAAxAsAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3N0cnVjdHVyZXMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLnN0cnVjdHVyZXMKfn5+fn5+fn5+fn5+fn5+fn5+fgoKRGF0YSBzdHJ1Y3R1cmVzIHRoYXQgcG93ZXIgUmVxdWVzdHMuCiIiIgoKaW1wb3J0IGNvbGxlY3Rpb25zCgpmcm9tIC5jb21wYXQgaW1wb3J0IE9yZGVyZWREaWN0CgoKY2xhc3MgQ2FzZUluc2Vuc2l0aXZlRGljdChjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZyk6CiAgICAiIiJBIGNhc2UtaW5zZW5zaXRpdmUgYGBkaWN0YGAtbGlrZSBvYmplY3QuCgogICAgSW1wbGVtZW50cyBhbGwgbWV0aG9kcyBhbmQgb3BlcmF0aW9ucyBvZgogICAgYGBjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZ2BgIGFzIHdlbGwgYXMgZGljdCdzIGBgY29weWBgLiBBbHNvCiAgICBwcm92aWRlcyBgYGxvd2VyX2l0ZW1zYGAuCgogICAgQWxsIGtleXMgYXJlIGV4cGVjdGVkIHRvIGJlIHN0cmluZ3MuIFRoZSBzdHJ1Y3R1cmUgcmVtZW1iZXJzIHRoZQogICAgY2FzZSBvZiB0aGUgbGFzdCBrZXkgdG8gYmUgc2V0LCBhbmQgYGBpdGVyKGluc3RhbmNlKWBgLAogICAgYGBrZXlzKClgYCwgYGBpdGVtcygpYGAsIGBgaXRlcmtleXMoKWBgLCBhbmQgYGBpdGVyaXRlbXMoKWBgCiAgICB3aWxsIGNvbnRhaW4gY2FzZS1zZW5zaXRpdmUga2V5cy4gSG93ZXZlciwgcXVlcnlpbmcgYW5kIGNvbnRhaW5zCiAgICB0ZXN0aW5nIGlzIGNhc2UgaW5zZW5zaXRpdmU6OgoKICAgICAgICBjaWQgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KCkKICAgICAgICBjaWRbJ0FjY2VwdCddID0gJ2FwcGxpY2F0aW9uL2pzb24nCiAgICAgICAgY2lkWydhQ0NFUFQnXSA9PSAnYXBwbGljYXRpb24vanNvbicgICMgVHJ1ZQogICAgICAgIGxpc3QoY2lkKSA9PSBbJ0FjY2VwdCddICAjIFRydWUKCiAgICBGb3IgZXhhbXBsZSwgYGBoZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ11gYCB3aWxsIHJldHVybiB0aGUKICAgIHZhbHVlIG9mIGEgYGAnQ29udGVudC1FbmNvZGluZydgYCByZXNwb25zZSBoZWFkZXIsIHJlZ2FyZGxlc3MKICAgIG9mIGhvdyB0aGUgaGVhZGVyIG5hbWUgd2FzIG9yaWdpbmFsbHkgc3RvcmVkLgoKICAgIElmIHRoZSBjb25zdHJ1Y3RvciwgYGAudXBkYXRlYGAsIG9yIGVxdWFsaXR5IGNvbXBhcmlzb24KICAgIG9wZXJhdGlvbnMgYXJlIGdpdmVuIGtleXMgdGhhdCBoYXZlIGVxdWFsIGBgLmxvd2VyKClgYHMsIHRoZQogICAgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGE9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuX3N0b3JlID0gT3JkZXJlZERpY3QoKQogICAgICAgIGlmIGRhdGEgaXMgTm9uZToKICAgICAgICAgICAgZGF0YSA9IHt9CiAgICAgICAgc2VsZi51cGRhdGUoZGF0YSwgKiprd2FyZ3MpCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICMgVXNlIHRoZSBsb3dlcmNhc2VkIGtleSBmb3IgbG9va3VwcywgYnV0IHN0b3JlIHRoZSBhY3R1YWwKICAgICAgICAjIGtleSBhbG9uZ3NpZGUgdGhlIHZhbHVlLgogICAgICAgIHNlbGYuX3N0b3JlW2tleS5sb3dlcigpXSA9IChrZXksIHZhbHVlKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLl9zdG9yZVtrZXkubG93ZXIoKV1bMV0KCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICBkZWwgc2VsZi5fc3RvcmVba2V5Lmxvd2VyKCldCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAoY2FzZWRrZXkgZm9yIGNhc2Vka2V5LCBtYXBwZWR2YWx1ZSBpbiBzZWxmLl9zdG9yZS52YWx1ZXMoKSkKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3N0b3JlKQoKICAgIGRlZiBsb3dlcl9pdGVtcyhzZWxmKToKICAgICAgICAiIiJMaWtlIGl0ZXJpdGVtcygpLCBidXQgd2l0aCBhbGwgbG93ZXJjYXNlIGtleXMuIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgKGxvd2Vya2V5LCBrZXl2YWxbMV0pCiAgICAgICAgICAgIGZvciAobG93ZXJrZXksIGtleXZhbCkKICAgICAgICAgICAgaW4gc2VsZi5fc3RvcmUuaXRlbXMoKQogICAgICAgICkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBjb2xsZWN0aW9ucy5NYXBwaW5nKToKICAgICAgICAgICAgb3RoZXIgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KG90aGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgICMgQ29tcGFyZSBpbnNlbnNpdGl2ZWx5CiAgICAgICAgcmV0dXJuIGRpY3Qoc2VsZi5sb3dlcl9pdGVtcygpKSA9PSBkaWN0KG90aGVyLmxvd2VyX2l0ZW1zKCkpCgogICAgIyBDb3B5IGlzIHJlcXVpcmVkCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICByZXR1cm4gQ2FzZUluc2Vuc2l0aXZlRGljdChzZWxmLl9zdG9yZS52YWx1ZXMoKSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihkaWN0KHNlbGYuaXRlbXMoKSkpCgoKY2xhc3MgTG9va3VwRGljdChkaWN0KToKICAgICIiIkRpY3Rpb25hcnkgbG9va3VwIG9iamVjdC4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc3VwZXIoTG9va3VwRGljdCwgc2VsZikuX19pbml0X18oKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxsb29rdXAgXCclc1wnPicgJSAoc2VsZi5uYW1lKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICMgV2UgYWxsb3cgZmFsbC10aHJvdWdoIGhlcmUsIHNvIHZhbHVlcyBkZWZhdWx0IHRvIE5vbmUKCiAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X18uZ2V0KGtleSwgTm9uZSkKCiAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICByZXR1cm4gc2VsZi5fX2RpY3RfXy5nZXQoa2V5LCBkZWZhdWx0KQpQSwMEFAAAAAAAAAAhAEfB2VcEbAAABGwAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3V0aWxzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy51dGlscwp+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCB3aXRoaW4gUmVxdWVzdHMKdGhhdCBhcmUgYWxzbyB1c2VmdWwgZm9yIGV4dGVybmFsIGNvbnN1bXB0aW9uLgoiIiIKCmltcG9ydCBjZ2kKaW1wb3J0IGNvZGVjcwppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGlvCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHJlCmltcG9ydCBzb2NrZXQKaW1wb3J0IHN0cnVjdAppbXBvcnQgd2FybmluZ3MKCmZyb20gLl9fdmVyc2lvbl9fIGltcG9ydCBfX3ZlcnNpb25fXwpmcm9tIC4gaW1wb3J0IGNlcnRzCiMgdG9fbmF0aXZlX3N0cmluZyBpcyB1bnVzZWQgaGVyZSwgYnV0IGltcG9ydGVkIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CmZyb20gLl9pbnRlcm5hbF91dGlscyBpbXBvcnQgdG9fbmF0aXZlX3N0cmluZwpmcm9tIC5jb21wYXQgaW1wb3J0IHBhcnNlX2h0dHBfbGlzdCBhcyBfcGFyc2VfbGlzdF9oZWFkZXIKZnJvbSAuY29tcGF0IGltcG9ydCAoCiAgICBxdW90ZSwgdXJscGFyc2UsIGJ5dGVzLCBzdHIsIE9yZGVyZWREaWN0LCB1bnF1b3RlLCBnZXRwcm94aWVzLAogICAgcHJveHlfYnlwYXNzLCB1cmx1bnBhcnNlLCBiYXNlc3RyaW5nLCBpbnRlZ2VyX3R5cGVzLCBpc19weTMsCiAgICBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQsIGdldHByb3hpZXNfZW52aXJvbm1lbnQpCmZyb20gLmNvb2tpZXMgaW1wb3J0IGNvb2tpZWphcl9mcm9tX2RpY3QKZnJvbSAuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdApmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBJbnZhbGlkVVJMLCBJbnZhbGlkSGVhZGVyLCBGaWxlTW9kZVdhcm5pbmcsIFVucmV3aW5kYWJsZUJvZHlFcnJvcikKCk5FVFJDX0ZJTEVTID0gKCcubmV0cmMnLCAnX25ldHJjJykKCkRFRkFVTFRfQ0FfQlVORExFX1BBVEggPSBjZXJ0cy53aGVyZSgpCgoKaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgIyBwcm92aWRlIGEgcHJveHlfYnlwYXNzIHZlcnNpb24gb24gV2luZG93cyB3aXRob3V0IEROUyBsb29rdXBzCgogICAgZGVmIHByb3h5X2J5cGFzc19yZWdpc3RyeShob3N0KToKICAgICAgICBpZiBpc19weTM6CiAgICAgICAgICAgIGltcG9ydCB3aW5yZWcKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbXBvcnQgX3dpbnJlZyBhcyB3aW5yZWcKICAgICAgICB0cnk6CiAgICAgICAgICAgIGludGVybmV0U2V0dGluZ3MgPSB3aW5yZWcuT3BlbktleSh3aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCiAgICAgICAgICAgICAgICByJ1NvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEludGVybmV0IFNldHRpbmdzJykKICAgICAgICAgICAgcHJveHlFbmFibGUgPSB3aW5yZWcuUXVlcnlWYWx1ZUV4KGludGVybmV0U2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHJveHlFbmFibGUnKVswXQogICAgICAgICAgICBwcm94eU92ZXJyaWRlID0gd2lucmVnLlF1ZXJ5VmFsdWVFeChpbnRlcm5ldFNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHJveHlPdmVycmlkZScpWzBdCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGlmIG5vdCBwcm94eUVuYWJsZSBvciBub3QgcHJveHlPdmVycmlkZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgbWFrZSBhIGNoZWNrIHZhbHVlIGxpc3QgZnJvbSB0aGUgcmVnaXN0cnkgZW50cnk6IHJlcGxhY2UgdGhlCiAgICAgICAgIyAnPGxvY2FsPicgc3RyaW5nIGJ5IHRoZSBsb2NhbGhvc3QgZW50cnkgYW5kIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgIyBjYW5vbmljYWwgZW50cnkuCiAgICAgICAgcHJveHlPdmVycmlkZSA9IHByb3h5T3ZlcnJpZGUuc3BsaXQoJzsnKQogICAgICAgICMgbm93IGNoZWNrIGlmIHdlIG1hdGNoIG9uZSBvZiB0aGUgcmVnaXN0cnkgdmFsdWVzLgogICAgICAgIGZvciB0ZXN0IGluIHByb3h5T3ZlcnJpZGU6CiAgICAgICAgICAgIGlmIHRlc3QgPT0gJzxsb2NhbD4nOgogICAgICAgICAgICAgICAgaWYgJy4nIG5vdCBpbiBob3N0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIHRlc3QgPSB0ZXN0LnJlcGxhY2UoIi4iLCByIlwuIikgICAgICMgbWFzayBkb3RzCiAgICAgICAgICAgIHRlc3QgPSB0ZXN0LnJlcGxhY2UoIioiLCByIi4qIikgICAgICMgY2hhbmdlIGdsb2Igc2VxdWVuY2UKICAgICAgICAgICAgdGVzdCA9IHRlc3QucmVwbGFjZSgiPyIsIHIiLiIpICAgICAgIyBjaGFuZ2UgZ2xvYiBjaGFyCiAgICAgICAgICAgIGlmIHJlLm1hdGNoKHRlc3QsIGhvc3QsIHJlLkkpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgcHJveHlfYnlwYXNzKGhvc3QpOiAgIyBub3FhCiAgICAgICAgIiIiUmV0dXJuIFRydWUsIGlmIHRoZSBob3N0IHNob3VsZCBiZSBieXBhc3NlZC4KCiAgICAgICAgQ2hlY2tzIHByb3h5IHNldHRpbmdzIGdhdGhlcmVkIGZyb20gdGhlIGVudmlyb25tZW50LCBpZiBzcGVjaWZpZWQsCiAgICAgICAgb3IgdGhlIHJlZ2lzdHJ5LgogICAgICAgICIiIgogICAgICAgIGlmIGdldHByb3hpZXNfZW52aXJvbm1lbnQoKToKICAgICAgICAgICAgcmV0dXJuIHByb3h5X2J5cGFzc19lbnZpcm9ubWVudChob3N0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBwcm94eV9ieXBhc3NfcmVnaXN0cnkoaG9zdCkKCgpkZWYgZGljdF90b19zZXF1ZW5jZShkKToKICAgICIiIlJldHVybnMgYW4gaW50ZXJuYWwgc2VxdWVuY2UgZGljdGlvbmFyeSB1cGRhdGUuIiIiCgogICAgaWYgaGFzYXR0cihkLCAnaXRlbXMnKToKICAgICAgICBkID0gZC5pdGVtcygpCgogICAgcmV0dXJuIGQKCgpkZWYgc3VwZXJfbGVuKG8pOgogICAgdG90YWxfbGVuZ3RoID0gTm9uZQogICAgY3VycmVudF9wb3NpdGlvbiA9IDAKCiAgICBpZiBoYXNhdHRyKG8sICdfX2xlbl9fJyk6CiAgICAgICAgdG90YWxfbGVuZ3RoID0gbGVuKG8pCgogICAgZWxpZiBoYXNhdHRyKG8sICdsZW4nKToKICAgICAgICB0b3RhbF9sZW5ndGggPSBvLmxlbgoKICAgIGVsaWYgaGFzYXR0cihvLCAnZmlsZW5vJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlbm8gPSBvLmZpbGVubygpCiAgICAgICAgZXhjZXB0IGlvLlVuc3VwcG9ydGVkT3BlcmF0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdG90YWxfbGVuZ3RoID0gb3MuZnN0YXQoZmlsZW5vKS5zdF9zaXplCgogICAgICAgICAgICAjIEhhdmluZyB1c2VkIGZzdGF0IHRvIGRldGVybWluZSB0aGUgZmlsZSBsZW5ndGgsIHdlIG5lZWQgdG8KICAgICAgICAgICAgIyBjb25maXJtIHRoYXQgdGhpcyBmaWxlIHdhcyBvcGVuZWQgdXAgaW4gYmluYXJ5IG1vZGUuCiAgICAgICAgICAgIGlmICdiJyBub3QgaW4gby5tb2RlOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3RzIGhhcyBkZXRlcm1pbmVkIHRoZSBjb250ZW50LWxlbmd0aCBmb3IgdGhpcyAiCiAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgdXNpbmcgdGhlIGJpbmFyeSBzaXplIG9mIHRoZSBmaWxlOiBob3dldmVyLCB0aGUgIgogICAgICAgICAgICAgICAgICAgICJmaWxlIGhhcyBiZWVuIG9wZW5lZCBpbiB0ZXh0IG1vZGUgKGkuZS4gd2l0aG91dCB0aGUgJ2InICIKICAgICAgICAgICAgICAgICAgICAiZmxhZyBpbiB0aGUgbW9kZSkuIFRoaXMgbWF5IGxlYWQgdG8gYW4gaW5jb3JyZWN0ICIKICAgICAgICAgICAgICAgICAgICAiY29udGVudC1sZW5ndGguIEluIFJlcXVlc3RzIDMuMCwgc3VwcG9ydCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgICAgICJmb3IgZmlsZXMgaW4gdGV4dCBtb2RlLiIpLAogICAgICAgICAgICAgICAgICAgIEZpbGVNb2RlV2FybmluZwogICAgICAgICAgICAgICAgKQoKICAgIGlmIGhhc2F0dHIobywgJ3RlbGwnKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1cnJlbnRfcG9zaXRpb24gPSBvLnRlbGwoKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIGluIHNvbWUgd2VpcmQgc2l0dWF0aW9ucywgc3VjaCBhcyB3aGVuIHRoZSBmaWxlCiAgICAgICAgICAgICMgaXMgYWN0dWFsbHkgYSBzcGVjaWFsIGZpbGUgZGVzY3JpcHRvciBsaWtlIHN0ZGluLiBJbiB0aGlzCiAgICAgICAgICAgICMgaW5zdGFuY2UsIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgbGVuZ3RoIGlzLCBzbyBzZXQgaXQgdG8gemVybyBhbmQKICAgICAgICAgICAgIyBsZXQgcmVxdWVzdHMgY2h1bmsgaXQgaW5zdGVhZC4KICAgICAgICAgICAgaWYgdG90YWxfbGVuZ3RoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY3VycmVudF9wb3NpdGlvbiA9IHRvdGFsX2xlbmd0aAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGhhc2F0dHIobywgJ3NlZWsnKSBhbmQgdG90YWxfbGVuZ3RoIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIFN0cmluZ0lPIGFuZCBCeXRlc0lPIGhhdmUgc2VlayBidXQgbm8gdXNlYWJsZSBmaWxlbm8KICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAjIHNlZWsgdG8gZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICBvLnNlZWsoMCwgMikKICAgICAgICAgICAgICAgICAgICB0b3RhbF9sZW5ndGggPSBvLnRlbGwoKQoKICAgICAgICAgICAgICAgICAgICAjIHNlZWsgYmFjayB0byBjdXJyZW50IHBvc2l0aW9uIHRvIHN1cHBvcnQKICAgICAgICAgICAgICAgICAgICAjIHBhcnRpYWxseSByZWFkIGZpbGUtbGlrZSBvYmplY3RzCiAgICAgICAgICAgICAgICAgICAgby5zZWVrKGN1cnJlbnRfcG9zaXRpb24gb3IgMCkKICAgICAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgdG90YWxfbGVuZ3RoID0gMAoKICAgIGlmIHRvdGFsX2xlbmd0aCBpcyBOb25lOgogICAgICAgIHRvdGFsX2xlbmd0aCA9IDAKCiAgICByZXR1cm4gbWF4KDAsIHRvdGFsX2xlbmd0aCAtIGN1cnJlbnRfcG9zaXRpb24pCgoKZGVmIGdldF9uZXRyY19hdXRoKHVybCwgcmFpc2VfZXJyb3JzPUZhbHNlKToKICAgICIiIlJldHVybnMgdGhlIFJlcXVlc3RzIHR1cGxlIGF1dGggZm9yIGEgZ2l2ZW4gdXJsIGZyb20gbmV0cmMuIiIiCgogICAgdHJ5OgogICAgICAgIGZyb20gbmV0cmMgaW1wb3J0IG5ldHJjLCBOZXRyY1BhcnNlRXJyb3IKCiAgICAgICAgbmV0cmNfcGF0aCA9IE5vbmUKCiAgICAgICAgZm9yIGYgaW4gTkVUUkNfRklMRVM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvYyA9IG9zLnBhdGguZXhwYW5kdXNlcignfi97MH0nLmZvcm1hdChmKSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgIyBvcy5wYXRoLmV4cGFuZHVzZXIgY2FuIGZhaWwgd2hlbiAkSE9NRSBpcyB1bmRlZmluZWQgYW5kCiAgICAgICAgICAgICAgICAjIGdldHB3dWlkIGZhaWxzLiBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIwMTY0ICYKICAgICAgICAgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3RzL3JlcXVlc3RzL2lzc3Vlcy8xODQ2CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvYyk6CiAgICAgICAgICAgICAgICBuZXRyY19wYXRoID0gbG9jCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAjIEFib3J0IGVhcmx5IGlmIHRoZXJlIGlzbid0IG9uZS4KICAgICAgICBpZiBuZXRyY19wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByaSA9IHVybHBhcnNlKHVybCkKCiAgICAgICAgIyBTdHJpcCBwb3J0IG51bWJlcnMgZnJvbSBuZXRsb2MuIFRoaXMgd2VpcmQgYGlmLi4uZW5jb2RlYGAgZGFuY2UgaXMKICAgICAgICAjIHVzZWQgZm9yIFB5dGhvbiAzLjIsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCB1bmljb2RlIGxpdGVyYWxzLgogICAgICAgIHNwbGl0c3RyID0gYic6JwogICAgICAgIGlmIGlzaW5zdGFuY2UodXJsLCBzdHIpOgogICAgICAgICAgICBzcGxpdHN0ciA9IHNwbGl0c3RyLmRlY29kZSgnYXNjaWknKQogICAgICAgIGhvc3QgPSByaS5uZXRsb2Muc3BsaXQoc3BsaXRzdHIpWzBdCgogICAgICAgIHRyeToKICAgICAgICAgICAgX25ldHJjID0gbmV0cmMobmV0cmNfcGF0aCkuYXV0aGVudGljYXRvcnMoaG9zdCkKICAgICAgICAgICAgaWYgX25ldHJjOgogICAgICAgICAgICAgICAgIyBSZXR1cm4gd2l0aCBsb2dpbiAvIHBhc3N3b3JkCiAgICAgICAgICAgICAgICBsb2dpbl9pID0gKDAgaWYgX25ldHJjWzBdIGVsc2UgMSkKICAgICAgICAgICAgICAgIHJldHVybiAoX25ldHJjW2xvZ2luX2ldLCBfbmV0cmNbMl0pCiAgICAgICAgZXhjZXB0IChOZXRyY1BhcnNlRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAjIElmIHRoZXJlIHdhcyBhIHBhcnNpbmcgZXJyb3Igb3IgYSBwZXJtaXNzaW9ucyBpc3N1ZSByZWFkaW5nIHRoZSBmaWxlLAogICAgICAgICAgICAjIHdlJ2xsIGp1c3Qgc2tpcCBuZXRyYyBhdXRoIHVubGVzcyBleHBsaWNpdGx5IGFza2VkIHRvIHJhaXNlIGVycm9ycy4KICAgICAgICAgICAgaWYgcmFpc2VfZXJyb3JzOgogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAjIEFwcEVuZ2luZSBoYWNraW5lc3MuCiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgcGFzcwoKCmRlZiBndWVzc19maWxlbmFtZShvYmopOgogICAgIiIiVHJpZXMgdG8gZ3Vlc3MgdGhlIGZpbGVuYW1lIG9mIHRoZSBnaXZlbiBvYmplY3QuIiIiCiAgICBuYW1lID0gZ2V0YXR0cihvYmosICduYW1lJywgTm9uZSkKICAgIGlmIChuYW1lIGFuZCBpc2luc3RhbmNlKG5hbWUsIGJhc2VzdHJpbmcpIGFuZCBuYW1lWzBdICE9ICc8JyBhbmQKICAgICAgICAgICAgbmFtZVstMV0gIT0gJz4nKToKICAgICAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShuYW1lKQoKCmRlZiBmcm9tX2tleV92YWxfbGlzdCh2YWx1ZSk6CiAgICAiIiJUYWtlIGFuIG9iamVjdCBhbmQgdGVzdCB0byBzZWUgaWYgaXQgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEKICAgIGRpY3Rpb25hcnkuIFVubGVzcyBpdCBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGFzIHN1Y2gsIHJldHVybiBhbgogICAgT3JkZXJlZERpY3QsIGUuZy4sCgogICAgOjoKCiAgICAgICAgPj4+IGZyb21fa2V5X3ZhbF9saXN0KFsoJ2tleScsICd2YWwnKV0pCiAgICAgICAgT3JkZXJlZERpY3QoWygna2V5JywgJ3ZhbCcpXSkKICAgICAgICA+Pj4gZnJvbV9rZXlfdmFsX2xpc3QoJ3N0cmluZycpCiAgICAgICAgVmFsdWVFcnJvcjogbmVlZCBtb3JlIHRoYW4gMSB2YWx1ZSB0byB1bnBhY2sKICAgICAgICA+Pj4gZnJvbV9rZXlfdmFsX2xpc3QoeydrZXknOiAndmFsJ30pCiAgICAgICAgT3JkZXJlZERpY3QoWygna2V5JywgJ3ZhbCcpXSkKCiAgICA6cnR5cGU6IE9yZGVyZWREaWN0CiAgICAiIiIKICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoc3RyLCBieXRlcywgYm9vbCwgaW50KSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY2Fubm90IGVuY29kZSBvYmplY3RzIHRoYXQgYXJlIG5vdCAyLXR1cGxlcycpCgogICAgcmV0dXJuIE9yZGVyZWREaWN0KHZhbHVlKQoKCmRlZiB0b19rZXlfdmFsX2xpc3QodmFsdWUpOgogICAgIiIiVGFrZSBhbiBvYmplY3QgYW5kIHRlc3QgdG8gc2VlIGlmIGl0IGNhbiBiZSByZXByZXNlbnRlZCBhcyBhCiAgICBkaWN0aW9uYXJ5LiBJZiBpdCBjYW4gYmUsIHJldHVybiBhIGxpc3Qgb2YgdHVwbGVzLCBlLmcuLAoKICAgIDo6CgogICAgICAgID4+PiB0b19rZXlfdmFsX2xpc3QoWygna2V5JywgJ3ZhbCcpXSkKICAgICAgICBbKCdrZXknLCAndmFsJyldCiAgICAgICAgPj4+IHRvX2tleV92YWxfbGlzdCh7J2tleSc6ICd2YWwnfSkKICAgICAgICBbKCdrZXknLCAndmFsJyldCiAgICAgICAgPj4+IHRvX2tleV92YWxfbGlzdCgnc3RyaW5nJykKICAgICAgICBWYWx1ZUVycm9yOiBjYW5ub3QgZW5jb2RlIG9iamVjdHMgdGhhdCBhcmUgbm90IDItdHVwbGVzLgoKICAgIDpydHlwZTogbGlzdAogICAgIiIiCiAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCgogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKHN0ciwgYnl0ZXMsIGJvb2wsIGludCkpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Nhbm5vdCBlbmNvZGUgb2JqZWN0cyB0aGF0IGFyZSBub3QgMi10dXBsZXMnKQoKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGNvbGxlY3Rpb25zLk1hcHBpbmcpOgogICAgICAgIHZhbHVlID0gdmFsdWUuaXRlbXMoKQoKICAgIHJldHVybiBsaXN0KHZhbHVlKQoKCiMgRnJvbSBtaXRzdWhpa28vd2Vya3pldWcgKHVzZWQgd2l0aCBwZXJtaXNzaW9uKS4KZGVmIHBhcnNlX2xpc3RfaGVhZGVyKHZhbHVlKToKICAgICIiIlBhcnNlIGxpc3RzIGFzIGRlc2NyaWJlZCBieSBSRkMgMjA2OCBTZWN0aW9uIDIuCgogICAgSW4gcGFydGljdWxhciwgcGFyc2UgY29tbWEtc2VwYXJhdGVkIGxpc3RzIHdoZXJlIHRoZSBlbGVtZW50cyBvZgogICAgdGhlIGxpc3QgbWF5IGluY2x1ZGUgcXVvdGVkLXN0cmluZ3MuICBBIHF1b3RlZC1zdHJpbmcgY291bGQKICAgIGNvbnRhaW4gYSBjb21tYS4gIEEgbm9uLXF1b3RlZCBzdHJpbmcgY291bGQgaGF2ZSBxdW90ZXMgaW4gdGhlCiAgICBtaWRkbGUuICBRdW90ZXMgYXJlIHJlbW92ZWQgYXV0b21hdGljYWxseSBhZnRlciBwYXJzaW5nLgoKICAgIEl0IGJhc2ljYWxseSB3b3JrcyBsaWtlIDpmdW5jOmBwYXJzZV9zZXRfaGVhZGVyYCBqdXN0IHRoYXQgaXRlbXMKICAgIG1heSBhcHBlYXIgbXVsdGlwbGUgdGltZXMgYW5kIGNhc2Ugc2Vuc2l0aXZpdHkgaXMgcHJlc2VydmVkLgoKICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdGFuZGFyZCA6Y2xhc3M6YGxpc3RgOgoKICAgID4+PiBwYXJzZV9saXN0X2hlYWRlcigndG9rZW4sICJxdW90ZWQgdmFsdWUiJykKICAgIFsndG9rZW4nLCAncXVvdGVkIHZhbHVlJ10KCiAgICBUbyBjcmVhdGUgYSBoZWFkZXIgZnJvbSB0aGUgOmNsYXNzOmBsaXN0YCBhZ2FpbiwgdXNlIHRoZQogICAgOmZ1bmM6YGR1bXBfaGVhZGVyYCBmdW5jdGlvbi4KCiAgICA6cGFyYW0gdmFsdWU6IGEgc3RyaW5nIHdpdGggYSBsaXN0IGhlYWRlci4KICAgIDpyZXR1cm46IDpjbGFzczpgbGlzdGAKICAgIDpydHlwZTogbGlzdAogICAgIiIiCiAgICByZXN1bHQgPSBbXQogICAgZm9yIGl0ZW0gaW4gX3BhcnNlX2xpc3RfaGVhZGVyKHZhbHVlKToKICAgICAgICBpZiBpdGVtWzoxXSA9PSBpdGVtWy0xOl0gPT0gJyInOgogICAgICAgICAgICBpdGVtID0gdW5xdW90ZV9oZWFkZXJfdmFsdWUoaXRlbVsxOi0xXSkKICAgICAgICByZXN1bHQuYXBwZW5kKGl0ZW0pCiAgICByZXR1cm4gcmVzdWx0CgoKIyBGcm9tIG1pdHN1aGlrby93ZXJremV1ZyAodXNlZCB3aXRoIHBlcm1pc3Npb24pLgpkZWYgcGFyc2VfZGljdF9oZWFkZXIodmFsdWUpOgogICAgIiIiUGFyc2UgbGlzdHMgb2Yga2V5LCB2YWx1ZSBwYWlycyBhcyBkZXNjcmliZWQgYnkgUkZDIDIwNjggU2VjdGlvbiAyIGFuZAogICAgY29udmVydCB0aGVtIGludG8gYSBweXRob24gZGljdDoKCiAgICA+Pj4gZCA9IHBhcnNlX2RpY3RfaGVhZGVyKCdmb289ImlzIGEgZmlzaCIsIGJhcj0iYXMgd2VsbCInKQogICAgPj4+IHR5cGUoZCkgaXMgZGljdAogICAgVHJ1ZQogICAgPj4+IHNvcnRlZChkLml0ZW1zKCkpCiAgICBbKCdiYXInLCAnYXMgd2VsbCcpLCAoJ2ZvbycsICdpcyBhIGZpc2gnKV0KCiAgICBJZiB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgYSBrZXkgaXQgd2lsbCBiZSBgTm9uZWA6CgogICAgPj4+IHBhcnNlX2RpY3RfaGVhZGVyKCdrZXlfd2l0aG91dF92YWx1ZScpCiAgICB7J2tleV93aXRob3V0X3ZhbHVlJzogTm9uZX0KCiAgICBUbyBjcmVhdGUgYSBoZWFkZXIgZnJvbSB0aGUgOmNsYXNzOmBkaWN0YCBhZ2FpbiwgdXNlIHRoZQogICAgOmZ1bmM6YGR1bXBfaGVhZGVyYCBmdW5jdGlvbi4KCiAgICA6cGFyYW0gdmFsdWU6IGEgc3RyaW5nIHdpdGggYSBkaWN0IGhlYWRlci4KICAgIDpyZXR1cm46IDpjbGFzczpgZGljdGAKICAgIDpydHlwZTogZGljdAogICAgIiIiCiAgICByZXN1bHQgPSB7fQogICAgZm9yIGl0ZW0gaW4gX3BhcnNlX2xpc3RfaGVhZGVyKHZhbHVlKToKICAgICAgICBpZiAnPScgbm90IGluIGl0ZW06CiAgICAgICAgICAgIHJlc3VsdFtpdGVtXSA9IE5vbmUKICAgICAgICAgICAgY29udGludWUKICAgICAgICBuYW1lLCB2YWx1ZSA9IGl0ZW0uc3BsaXQoJz0nLCAxKQogICAgICAgIGlmIHZhbHVlWzoxXSA9PSB2YWx1ZVstMTpdID09ICciJzoKICAgICAgICAgICAgdmFsdWUgPSB1bnF1b3RlX2hlYWRlcl92YWx1ZSh2YWx1ZVsxOi0xXSkKICAgICAgICByZXN1bHRbbmFtZV0gPSB2YWx1ZQogICAgcmV0dXJuIHJlc3VsdAoKCiMgRnJvbSBtaXRzdWhpa28vd2Vya3pldWcgKHVzZWQgd2l0aCBwZXJtaXNzaW9uKS4KZGVmIHVucXVvdGVfaGVhZGVyX3ZhbHVlKHZhbHVlLCBpc19maWxlbmFtZT1GYWxzZSk6CiAgICByIiIiVW5xdW90ZXMgYSBoZWFkZXIgdmFsdWUuICAoUmV2ZXJzYWwgb2YgOmZ1bmM6YHF1b3RlX2hlYWRlcl92YWx1ZWApLgogICAgVGhpcyBkb2VzIG5vdCB1c2UgdGhlIHJlYWwgdW5xdW90aW5nIGJ1dCB3aGF0IGJyb3dzZXJzIGFyZSBhY3R1YWxseQogICAgdXNpbmcgZm9yIHF1b3RpbmcuCgogICAgOnBhcmFtIHZhbHVlOiB0aGUgaGVhZGVyIHZhbHVlIHRvIHVucXVvdGUuCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICBpZiB2YWx1ZSBhbmQgdmFsdWVbMF0gPT0gdmFsdWVbLTFdID09ICciJzoKICAgICAgICAjIHRoaXMgaXMgbm90IHRoZSByZWFsIHVucXVvdGluZywgYnV0IGZpeGluZyB0aGlzIHNvIHRoYXQgdGhlCiAgICAgICAgIyBSRkMgaXMgbWV0IHdpbGwgcmVzdWx0IGluIGJ1Z3Mgd2l0aCBpbnRlcm5ldCBleHBsb3JlciBhbmQKICAgICAgICAjIHByb2JhYmx5IHNvbWUgb3RoZXIgYnJvd3NlcnMgYXMgd2VsbC4gIElFIGZvciBleGFtcGxlIGlzCiAgICAgICAgIyB1cGxvYWRpbmcgZmlsZXMgd2l0aCAiQzpcZm9vXGJhci50eHQiIGFzIGZpbGVuYW1lCiAgICAgICAgdmFsdWUgPSB2YWx1ZVsxOi0xXQoKICAgICAgICAjIGlmIHRoaXMgaXMgYSBmaWxlbmFtZSBhbmQgdGhlIHN0YXJ0aW5nIGNoYXJhY3RlcnMgbG9vayBsaWtlCiAgICAgICAgIyBhIFVOQyBwYXRoLCB0aGVuIGp1c3QgcmV0dXJuIHRoZSB2YWx1ZSB3aXRob3V0IHF1b3Rlcy4gIFVzaW5nIHRoZQogICAgICAgICMgcmVwbGFjZSBzZXF1ZW5jZSBiZWxvdyBvbiBhIFVOQyBwYXRoIGhhcyB0aGUgZWZmZWN0IG9mIHR1cm5pbmcKICAgICAgICAjIHRoZSBsZWFkaW5nIGRvdWJsZSBzbGFzaCBpbnRvIGEgc2luZ2xlIHNsYXNoIGFuZCB0aGVuCiAgICAgICAgIyBfZml4X2llX2ZpbGVuYW1lKCkgZG9lc24ndCB3b3JrIGNvcnJlY3RseS4gIFNlZSAjNDU4LgogICAgICAgIGlmIG5vdCBpc19maWxlbmFtZSBvciB2YWx1ZVs6Ml0gIT0gJ1xcXFwnOgogICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnXFxcXCcsICdcXCcpLnJlcGxhY2UoJ1xcIicsICciJykKICAgIHJldHVybiB2YWx1ZQoKCmRlZiBkaWN0X2Zyb21fY29va2llamFyKGNqKToKICAgICIiIlJldHVybnMgYSBrZXkvdmFsdWUgZGljdGlvbmFyeSBmcm9tIGEgQ29va2llSmFyLgoKICAgIDpwYXJhbSBjajogQ29va2llSmFyIG9iamVjdCB0byBleHRyYWN0IGNvb2tpZXMgZnJvbS4KICAgIDpydHlwZTogZGljdAogICAgIiIiCgogICAgY29va2llX2RpY3QgPSB7fQoKICAgIGZvciBjb29raWUgaW4gY2o6CiAgICAgICAgY29va2llX2RpY3RbY29va2llLm5hbWVdID0gY29va2llLnZhbHVlCgogICAgcmV0dXJuIGNvb2tpZV9kaWN0CgoKZGVmIGFkZF9kaWN0X3RvX2Nvb2tpZWphcihjaiwgY29va2llX2RpY3QpOgogICAgIiIiUmV0dXJucyBhIENvb2tpZUphciBmcm9tIGEga2V5L3ZhbHVlIGRpY3Rpb25hcnkuCgogICAgOnBhcmFtIGNqOiBDb29raWVKYXIgdG8gaW5zZXJ0IGNvb2tpZXMgaW50by4KICAgIDpwYXJhbSBjb29raWVfZGljdDogRGljdCBvZiBrZXkvdmFsdWVzIHRvIGluc2VydCBpbnRvIENvb2tpZUphci4KICAgIDpydHlwZTogQ29va2llSmFyCiAgICAiIiIKCiAgICByZXR1cm4gY29va2llamFyX2Zyb21fZGljdChjb29raWVfZGljdCwgY2opCgoKZGVmIGdldF9lbmNvZGluZ3NfZnJvbV9jb250ZW50KGNvbnRlbnQpOgogICAgIiIiUmV0dXJucyBlbmNvZGluZ3MgZnJvbSBnaXZlbiBjb250ZW50IHN0cmluZy4KCiAgICA6cGFyYW0gY29udGVudDogYnl0ZXN0cmluZyB0byBleHRyYWN0IGVuY29kaW5ncyBmcm9tLgogICAgIiIiCiAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAnSW4gcmVxdWVzdHMgMy4wLCBnZXRfZW5jb2RpbmdzX2Zyb21fY29udGVudCB3aWxsIGJlIHJlbW92ZWQuIEZvciAnCiAgICAgICAgJ21vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIGRpc2N1c3Npb24gb24gaXNzdWUgIzIyNjYuIChUaGlzJwogICAgICAgICcgd2FybmluZyBzaG91bGQgb25seSBhcHBlYXIgb25jZS4pJyksCiAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQoKICAgIGNoYXJzZXRfcmUgPSByZS5jb21waWxlKHInPG1ldGEuKj9jaGFyc2V0PVsiXCddKiguKz8pWyJcJz5dJywgZmxhZ3M9cmUuSSkKICAgIHByYWdtYV9yZSA9IHJlLmNvbXBpbGUocic8bWV0YS4qP2NvbnRlbnQ9WyJcJ10qOz9jaGFyc2V0PSguKz8pWyJcJz5dJywgZmxhZ3M9cmUuSSkKICAgIHhtbF9yZSA9IHJlLmNvbXBpbGUocidePFw/eG1sLio/ZW5jb2Rpbmc9WyJcJ10qKC4rPylbIlwnPl0nKQoKICAgIHJldHVybiAoY2hhcnNldF9yZS5maW5kYWxsKGNvbnRlbnQpICsKICAgICAgICAgICAgcHJhZ21hX3JlLmZpbmRhbGwoY29udGVudCkgKwogICAgICAgICAgICB4bWxfcmUuZmluZGFsbChjb250ZW50KSkKCgpkZWYgZ2V0X2VuY29kaW5nX2Zyb21faGVhZGVycyhoZWFkZXJzKToKICAgICIiIlJldHVybnMgZW5jb2RpbmdzIGZyb20gZ2l2ZW4gSFRUUCBIZWFkZXIgRGljdC4KCiAgICA6cGFyYW0gaGVhZGVyczogZGljdGlvbmFyeSB0byBleHRyYWN0IGVuY29kaW5nIGZyb20uCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCgogICAgY29udGVudF90eXBlID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpCgogICAgaWYgbm90IGNvbnRlbnRfdHlwZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGNvbnRlbnRfdHlwZSwgcGFyYW1zID0gY2dpLnBhcnNlX2hlYWRlcihjb250ZW50X3R5cGUpCgogICAgaWYgJ2NoYXJzZXQnIGluIHBhcmFtczoKICAgICAgICByZXR1cm4gcGFyYW1zWydjaGFyc2V0J10uc3RyaXAoIidcIiIpCgogICAgaWYgJ3RleHQnIGluIGNvbnRlbnRfdHlwZToKICAgICAgICByZXR1cm4gJ0lTTy04ODU5LTEnCgoKZGVmIHN0cmVhbV9kZWNvZGVfcmVzcG9uc2VfdW5pY29kZShpdGVyYXRvciwgcik6CiAgICAiIiJTdHJlYW0gZGVjb2RlcyBhIGl0ZXJhdG9yLiIiIgoKICAgIGlmIHIuZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICBmb3IgaXRlbSBpbiBpdGVyYXRvcjoKICAgICAgICAgICAgeWllbGQgaXRlbQogICAgICAgIHJldHVybgoKICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKHIuZW5jb2RpbmcpKGVycm9ycz0ncmVwbGFjZScpCiAgICBmb3IgY2h1bmsgaW4gaXRlcmF0b3I6CiAgICAgICAgcnYgPSBkZWNvZGVyLmRlY29kZShjaHVuaykKICAgICAgICBpZiBydjoKICAgICAgICAgICAgeWllbGQgcnYKICAgIHJ2ID0gZGVjb2Rlci5kZWNvZGUoYicnLCBmaW5hbD1UcnVlKQogICAgaWYgcnY6CiAgICAgICAgeWllbGQgcnYKCgpkZWYgaXRlcl9zbGljZXMoc3RyaW5nLCBzbGljZV9sZW5ndGgpOgogICAgIiIiSXRlcmF0ZSBvdmVyIHNsaWNlcyBvZiBhIHN0cmluZy4iIiIKICAgIHBvcyA9IDAKICAgIGlmIHNsaWNlX2xlbmd0aCBpcyBOb25lIG9yIHNsaWNlX2xlbmd0aCA8PSAwOgogICAgICAgIHNsaWNlX2xlbmd0aCA9IGxlbihzdHJpbmcpCiAgICB3aGlsZSBwb3MgPCBsZW4oc3RyaW5nKToKICAgICAgICB5aWVsZCBzdHJpbmdbcG9zOnBvcyArIHNsaWNlX2xlbmd0aF0KICAgICAgICBwb3MgKz0gc2xpY2VfbGVuZ3RoCgoKZGVmIGdldF91bmljb2RlX2Zyb21fcmVzcG9uc2Uocik6CiAgICAiIiJSZXR1cm5zIHRoZSByZXF1ZXN0ZWQgY29udGVudCBiYWNrIGluIHVuaWNvZGUuCgogICAgOnBhcmFtIHI6IFJlc3BvbnNlIG9iamVjdCB0byBnZXQgdW5pY29kZSBjb250ZW50IGZyb20uCgogICAgVHJpZWQ6CgogICAgMS4gY2hhcnNldCBmcm9tIGNvbnRlbnQtdHlwZQogICAgMi4gZmFsbCBiYWNrIGFuZCByZXBsYWNlIGFsbCB1bmljb2RlIGNoYXJhY3RlcnMKCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAnSW4gcmVxdWVzdHMgMy4wLCBnZXRfdW5pY29kZV9mcm9tX3Jlc3BvbnNlIHdpbGwgYmUgcmVtb3ZlZC4gRm9yICcKICAgICAgICAnbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgZGlzY3Vzc2lvbiBvbiBpc3N1ZSAjMjI2Ni4gKFRoaXMnCiAgICAgICAgJyB3YXJuaW5nIHNob3VsZCBvbmx5IGFwcGVhciBvbmNlLiknKSwKICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCgogICAgdHJpZWRfZW5jb2RpbmdzID0gW10KCiAgICAjIFRyeSBjaGFyc2V0IGZyb20gY29udGVudC10eXBlCiAgICBlbmNvZGluZyA9IGdldF9lbmNvZGluZ19mcm9tX2hlYWRlcnMoci5oZWFkZXJzKQoKICAgIGlmIGVuY29kaW5nOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN0cihyLmNvbnRlbnQsIGVuY29kaW5nKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgIHRyaWVkX2VuY29kaW5ncy5hcHBlbmQoZW5jb2RpbmcpCgogICAgIyBGYWxsIGJhY2s6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN0cihyLmNvbnRlbnQsIGVuY29kaW5nLCBlcnJvcnM9J3JlcGxhY2UnKQogICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICByZXR1cm4gci5jb250ZW50CgoKIyBUaGUgdW5yZXNlcnZlZCBVUkkgY2hhcmFjdGVycyAoUkZDIDM5ODYpClVOUkVTRVJWRURfU0VUID0gZnJvemVuc2V0KAogICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiICsgIjAxMjM0NTY3ODktLl9+IikKCgpkZWYgdW5xdW90ZV91bnJlc2VydmVkKHVyaSk6CiAgICAiIiJVbi1lc2NhcGUgYW55IHBlcmNlbnQtZXNjYXBlIHNlcXVlbmNlcyBpbiBhIFVSSSB0aGF0IGFyZSB1bnJlc2VydmVkCiAgICBjaGFyYWN0ZXJzLiBUaGlzIGxlYXZlcyBhbGwgcmVzZXJ2ZWQsIGlsbGVnYWwgYW5kIG5vbi1BU0NJSSBieXRlcyBlbmNvZGVkLgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHBhcnRzID0gdXJpLnNwbGl0KCclJykKICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihwYXJ0cykpOgogICAgICAgIGggPSBwYXJ0c1tpXVswOjJdCiAgICAgICAgaWYgbGVuKGgpID09IDIgYW5kIGguaXNhbG51bSgpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjID0gY2hyKGludChoLCAxNikpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgiSW52YWxpZCBwZXJjZW50LWVzY2FwZSBzZXF1ZW5jZTogJyVzJyIgJSBoKQoKICAgICAgICAgICAgaWYgYyBpbiBVTlJFU0VSVkVEX1NFVDoKICAgICAgICAgICAgICAgIHBhcnRzW2ldID0gYyArIHBhcnRzW2ldWzI6XQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFydHNbaV0gPSAnJScgKyBwYXJ0c1tpXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhcnRzW2ldID0gJyUnICsgcGFydHNbaV0KICAgIHJldHVybiAnJy5qb2luKHBhcnRzKQoKCmRlZiByZXF1b3RlX3VyaSh1cmkpOgogICAgIiIiUmUtcXVvdGUgdGhlIGdpdmVuIFVSSS4KCiAgICBUaGlzIGZ1bmN0aW9uIHBhc3NlcyB0aGUgZ2l2ZW4gVVJJIHRocm91Z2ggYW4gdW5xdW90ZS9xdW90ZSBjeWNsZSB0bwogICAgZW5zdXJlIHRoYXQgaXQgaXMgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBxdW90ZWQuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgc2FmZV93aXRoX3BlcmNlbnQgPSAiISMkJSYnKCkqKywvOjs9P0BbXX4iCiAgICBzYWZlX3dpdGhvdXRfcGVyY2VudCA9ICIhIyQmJygpKissLzo7PT9AW11+IgogICAgdHJ5OgogICAgICAgICMgVW5xdW90ZSBvbmx5IHRoZSB1bnJlc2VydmVkIGNoYXJhY3RlcnMKICAgICAgICAjIFRoZW4gcXVvdGUgb25seSBpbGxlZ2FsIGNoYXJhY3RlcnMgKGRvIG5vdCBxdW90ZSByZXNlcnZlZCwKICAgICAgICAjIHVucmVzZXJ2ZWQsIG9yICclJykKICAgICAgICByZXR1cm4gcXVvdGUodW5xdW90ZV91bnJlc2VydmVkKHVyaSksIHNhZmU9c2FmZV93aXRoX3BlcmNlbnQpCiAgICBleGNlcHQgSW52YWxpZFVSTDoKICAgICAgICAjIFdlIGNvdWxkbid0IHVucXVvdGUgdGhlIGdpdmVuIFVSSSwgc28gbGV0J3MgdHJ5IHF1b3RpbmcgaXQsIGJ1dAogICAgICAgICMgdGhlcmUgbWF5IGJlIHVucXVvdGVkICclJ3MgaW4gdGhlIFVSSS4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhleSdyZQogICAgICAgICMgcHJvcGVybHkgcXVvdGVkIHNvIHRoZXkgZG8gbm90IGNhdXNlIGlzc3VlcyBlbHNld2hlcmUuCiAgICAgICAgcmV0dXJuIHF1b3RlKHVyaSwgc2FmZT1zYWZlX3dpdGhvdXRfcGVyY2VudCkKCgpkZWYgYWRkcmVzc19pbl9uZXR3b3JrKGlwLCBuZXQpOgogICAgIiIiVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIGNoZWNrIGlmIGFuIElQIGJlbG9uZ3MgdG8gYSBuZXR3b3JrIHN1Ym5ldAoKICAgIEV4YW1wbGU6IHJldHVybnMgVHJ1ZSBpZiBpcCA9IDE5Mi4xNjguMS4xIGFuZCBuZXQgPSAxOTIuMTY4LjEuMC8yNAogICAgICAgICAgICAgcmV0dXJucyBGYWxzZSBpZiBpcCA9IDE5Mi4xNjguMS4xIGFuZCBuZXQgPSAxOTIuMTY4LjEwMC4wLzI0CgogICAgOnJ0eXBlOiBib29sCiAgICAiIiIKICAgIGlwYWRkciA9IHN0cnVjdC51bnBhY2soJz1MJywgc29ja2V0LmluZXRfYXRvbihpcCkpWzBdCiAgICBuZXRhZGRyLCBiaXRzID0gbmV0LnNwbGl0KCcvJykKICAgIG5ldG1hc2sgPSBzdHJ1Y3QudW5wYWNrKCc9TCcsIHNvY2tldC5pbmV0X2F0b24oZG90dGVkX25ldG1hc2soaW50KGJpdHMpKSkpWzBdCiAgICBuZXR3b3JrID0gc3RydWN0LnVucGFjaygnPUwnLCBzb2NrZXQuaW5ldF9hdG9uKG5ldGFkZHIpKVswXSAmIG5ldG1hc2sKICAgIHJldHVybiAoaXBhZGRyICYgbmV0bWFzaykgPT0gKG5ldHdvcmsgJiBuZXRtYXNrKQoKCmRlZiBkb3R0ZWRfbmV0bWFzayhtYXNrKToKICAgICIiIkNvbnZlcnRzIG1hc2sgZnJvbSAveHggZm9ybWF0IHRvIHh4eC54eHgueHh4Lnh4eAoKICAgIEV4YW1wbGU6IGlmIG1hc2sgaXMgMjQgZnVuY3Rpb24gcmV0dXJucyAyNTUuMjU1LjI1NS4wCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgYml0cyA9IDB4ZmZmZmZmZmYgXiAoMSA8PCAzMiAtIG1hc2spIC0gMQogICAgcmV0dXJuIHNvY2tldC5pbmV0X250b2Eoc3RydWN0LnBhY2soJz5JJywgYml0cykpCgoKZGVmIGlzX2lwdjRfYWRkcmVzcyhzdHJpbmdfaXApOgogICAgIiIiCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgdHJ5OgogICAgICAgIHNvY2tldC5pbmV0X2F0b24oc3RyaW5nX2lwKQogICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKZGVmIGlzX3ZhbGlkX2NpZHIoc3RyaW5nX25ldHdvcmspOgogICAgIiIiCiAgICBWZXJ5IHNpbXBsZSBjaGVjayBvZiB0aGUgY2lkciBmb3JtYXQgaW4gbm9fcHJveHkgdmFyaWFibGUuCgogICAgOnJ0eXBlOiBib29sCiAgICAiIiIKICAgIGlmIHN0cmluZ19uZXR3b3JrLmNvdW50KCcvJykgPT0gMToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1hc2sgPSBpbnQoc3RyaW5nX25ldHdvcmsuc3BsaXQoJy8nKVsxXSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmIG1hc2sgPCAxIG9yIG1hc2sgPiAzMjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgc29ja2V0LmluZXRfYXRvbihzdHJpbmdfbmV0d29yay5zcGxpdCgnLycpWzBdKQogICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgZWxzZToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNldF9lbnZpcm9uKGVudl9uYW1lLCB2YWx1ZSk6CiAgICAiIiJTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdlbnZfbmFtZScgdG8gJ3ZhbHVlJwoKICAgIFNhdmUgcHJldmlvdXMgdmFsdWUsIHlpZWxkLCBhbmQgdGhlbiByZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZSBzdG9yZWQgaW4KICAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnZW52X25hbWUnLgoKICAgIElmICd2YWx1ZScgaXMgTm9uZSwgZG8gbm90aGluZyIiIgogICAgdmFsdWVfY2hhbmdlZCA9IHZhbHVlIGlzIG5vdCBOb25lCiAgICBpZiB2YWx1ZV9jaGFuZ2VkOgogICAgICAgIG9sZF92YWx1ZSA9IG9zLmVudmlyb24uZ2V0KGVudl9uYW1lKQogICAgICAgIG9zLmVudmlyb25bZW52X25hbWVdID0gdmFsdWUKICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBpZiB2YWx1ZV9jaGFuZ2VkOgogICAgICAgICAgICBpZiBvbGRfdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uW2Vudl9uYW1lXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3MuZW52aXJvbltlbnZfbmFtZV0gPSBvbGRfdmFsdWUKCgpkZWYgc2hvdWxkX2J5cGFzc19wcm94aWVzKHVybCwgbm9fcHJveHkpOgogICAgIiIiCiAgICBSZXR1cm5zIHdoZXRoZXIgd2Ugc2hvdWxkIGJ5cGFzcyBwcm94aWVzIG9yIG5vdC4KCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgZ2V0X3Byb3h5ID0gbGFtYmRhIGs6IG9zLmVudmlyb24uZ2V0KGspIG9yIG9zLmVudmlyb24uZ2V0KGsudXBwZXIoKSkKCiAgICAjIEZpcnN0IGNoZWNrIHdoZXRoZXIgbm9fcHJveHkgaXMgZGVmaW5lZC4gSWYgaXQgaXMsIGNoZWNrIHRoYXQgdGhlIFVSTAogICAgIyB3ZSdyZSBnZXR0aW5nIGlzbid0IGluIHRoZSBub19wcm94eSBsaXN0LgogICAgbm9fcHJveHlfYXJnID0gbm9fcHJveHkKICAgIGlmIG5vX3Byb3h5IGlzIE5vbmU6CiAgICAgICAgbm9fcHJveHkgPSBnZXRfcHJveHkoJ25vX3Byb3h5JykKICAgIG5ldGxvYyA9IHVybHBhcnNlKHVybCkubmV0bG9jCgogICAgaWYgbm9fcHJveHk6CiAgICAgICAgIyBXZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgd2UgbWF0Y2ggaGVyZS4gV2UgbmVlZCB0byBzZWUgaWYgd2UgbWF0Y2gKICAgICAgICAjIHRoZSBlbmQgb2YgdGhlIG5ldGxvYywgYm90aCB3aXRoIGFuZCB3aXRob3V0IHRoZSBwb3J0LgogICAgICAgIG5vX3Byb3h5ID0gKAogICAgICAgICAgICBob3N0IGZvciBob3N0IGluIG5vX3Byb3h5LnJlcGxhY2UoJyAnLCAnJykuc3BsaXQoJywnKSBpZiBob3N0CiAgICAgICAgKQoKICAgICAgICBpcCA9IG5ldGxvYy5zcGxpdCgnOicpWzBdCiAgICAgICAgaWYgaXNfaXB2NF9hZGRyZXNzKGlwKToKICAgICAgICAgICAgZm9yIHByb3h5X2lwIGluIG5vX3Byb3h5OgogICAgICAgICAgICAgICAgaWYgaXNfdmFsaWRfY2lkcihwcm94eV9pcCk6CiAgICAgICAgICAgICAgICAgICAgaWYgYWRkcmVzc19pbl9uZXR3b3JrKGlwLCBwcm94eV9pcCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgICAgICBlbGlmIGlwID09IHByb3h5X2lwOgogICAgICAgICAgICAgICAgICAgICMgSWYgbm9fcHJveHkgaXAgd2FzIGRlZmluZWQgaW4gcGxhaW4gSVAgbm90YXRpb24gaW5zdGVhZCBvZiBjaWRyIG5vdGF0aW9uICYKICAgICAgICAgICAgICAgICAgICAjIG1hdGNoZXMgdGhlIElQIG9mIHRoZSBpbmRleAogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGhvc3QgaW4gbm9fcHJveHk6CiAgICAgICAgICAgICAgICBpZiBuZXRsb2MuZW5kc3dpdGgoaG9zdCkgb3IgbmV0bG9jLnNwbGl0KCc6JylbMF0uZW5kc3dpdGgoaG9zdCk6CiAgICAgICAgICAgICAgICAgICAgIyBUaGUgVVJMIGRvZXMgbWF0Y2ggc29tZXRoaW5nIGluIG5vX3Byb3h5LCBzbyB3ZSBkb24ndCB3YW50CiAgICAgICAgICAgICAgICAgICAgIyB0byBhcHBseSB0aGUgcHJveGllcyBvbiB0aGlzIFVSTC4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgSWYgdGhlIHN5c3RlbSBwcm94eSBzZXR0aW5ncyBpbmRpY2F0ZSB0aGF0IHRoaXMgVVJMIHNob3VsZCBiZSBieXBhc3NlZCwKICAgICMgZG9uJ3QgcHJveHkuCiAgICAjIFRoZSBwcm94eV9ieXBhc3MgZnVuY3Rpb24gaXMgaW5jcmVkaWJseSBidWdneSBvbiBPUyBYIGluIGVhcmx5IHZlcnNpb25zCiAgICAjIG9mIFB5dGhvbiAyLjYsIHNvIGFsbG93IHRoaXMgY2FsbCB0byBmYWlsLiBPbmx5IGNhdGNoIHRoZSBzcGVjaWZpYwogICAgIyBleGNlcHRpb25zIHdlJ3ZlIHNlZW4sIHRob3VnaDogdGhpcyBjYWxsIGZhaWxpbmcgaW4gb3RoZXIgd2F5cyBjYW4gcmV2ZWFsCiAgICAjIGxlZ2l0aW1hdGUgcHJvYmxlbXMuCiAgICB3aXRoIHNldF9lbnZpcm9uKCdub19wcm94eScsIG5vX3Byb3h5X2FyZyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBieXBhc3MgPSBwcm94eV9ieXBhc3MobmV0bG9jKQogICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBzb2NrZXQuZ2FpZXJyb3IpOgogICAgICAgICAgICBieXBhc3MgPSBGYWxzZQoKICAgIGlmIGJ5cGFzczoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHJldHVybiBGYWxzZQoKCmRlZiBnZXRfZW52aXJvbl9wcm94aWVzKHVybCwgbm9fcHJveHk9Tm9uZSk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpY3Qgb2YgZW52aXJvbm1lbnQgcHJveGllcy4KCiAgICA6cnR5cGU6IGRpY3QKICAgICIiIgogICAgaWYgc2hvdWxkX2J5cGFzc19wcm94aWVzKHVybCwgbm9fcHJveHk9bm9fcHJveHkpOgogICAgICAgIHJldHVybiB7fQogICAgZWxzZToKICAgICAgICByZXR1cm4gZ2V0cHJveGllcygpCgoKZGVmIHNlbGVjdF9wcm94eSh1cmwsIHByb3hpZXMpOgogICAgIiIiU2VsZWN0IGEgcHJveHkgZm9yIHRoZSB1cmwsIGlmIGFwcGxpY2FibGUuCgogICAgOnBhcmFtIHVybDogVGhlIHVybCBiZWluZyBmb3IgdGhlIHJlcXVlc3QKICAgIDpwYXJhbSBwcm94aWVzOiBBIGRpY3Rpb25hcnkgb2Ygc2NoZW1lcyBvciBzY2hlbWVzIGFuZCBob3N0cyB0byBwcm94eSBVUkxzCiAgICAiIiIKICAgIHByb3hpZXMgPSBwcm94aWVzIG9yIHt9CiAgICB1cmxwYXJ0cyA9IHVybHBhcnNlKHVybCkKICAgIGlmIHVybHBhcnRzLmhvc3RuYW1lIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHByb3hpZXMuZ2V0KHVybHBhcnRzLnNjaGVtZSwgcHJveGllcy5nZXQoJ2FsbCcpKQoKICAgIHByb3h5X2tleXMgPSBbCiAgICAgICAgdXJscGFydHMuc2NoZW1lICsgJzovLycgKyB1cmxwYXJ0cy5ob3N0bmFtZSwKICAgICAgICB1cmxwYXJ0cy5zY2hlbWUsCiAgICAgICAgJ2FsbDovLycgKyB1cmxwYXJ0cy5ob3N0bmFtZSwKICAgICAgICAnYWxsJywKICAgIF0KICAgIHByb3h5ID0gTm9uZQogICAgZm9yIHByb3h5X2tleSBpbiBwcm94eV9rZXlzOgogICAgICAgIGlmIHByb3h5X2tleSBpbiBwcm94aWVzOgogICAgICAgICAgICBwcm94eSA9IHByb3hpZXNbcHJveHlfa2V5XQogICAgICAgICAgICBicmVhawoKICAgIHJldHVybiBwcm94eQoKCmRlZiBkZWZhdWx0X3VzZXJfYWdlbnQobmFtZT0icHl0aG9uLXJlcXVlc3RzIik6CiAgICAiIiIKICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdXNlciBhZ2VudC4KCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICByZXR1cm4gJyVzLyVzJyAlIChuYW1lLCBfX3ZlcnNpb25fXykKCgpkZWYgZGVmYXVsdF9oZWFkZXJzKCk6CiAgICAiIiIKICAgIDpydHlwZTogcmVxdWVzdHMuc3RydWN0dXJlcy5DYXNlSW5zZW5zaXRpdmVEaWN0CiAgICAiIiIKICAgIHJldHVybiBDYXNlSW5zZW5zaXRpdmVEaWN0KHsKICAgICAgICAnVXNlci1BZ2VudCc6IGRlZmF1bHRfdXNlcl9hZ2VudCgpLAogICAgICAgICdBY2NlcHQtRW5jb2RpbmcnOiAnLCAnLmpvaW4oKCdnemlwJywgJ2RlZmxhdGUnKSksCiAgICAgICAgJ0FjY2VwdCc6ICcqLyonLAogICAgICAgICdDb25uZWN0aW9uJzogJ2tlZXAtYWxpdmUnLAogICAgfSkKCgpkZWYgcGFyc2VfaGVhZGVyX2xpbmtzKHZhbHVlKToKICAgICIiIlJldHVybiBhIGRpY3Qgb2YgcGFyc2VkIGxpbmsgaGVhZGVycyBwcm94aWVzLgoKICAgIGkuZS4gTGluazogPGh0dHA6Ly4uLi9mcm9udC5qcGVnPjsgcmVsPWZyb250OyB0eXBlPSJpbWFnZS9qcGVnIiw8aHR0cDovLy4uLi9iYWNrLmpwZWc+OyByZWw9YmFjazt0eXBlPSJpbWFnZS9qcGVnIgoKICAgIDpydHlwZTogbGlzdAogICAgIiIiCgogICAgbGlua3MgPSBbXQoKICAgIHJlcGxhY2VfY2hhcnMgPSAnIFwnIicKCiAgICBmb3IgdmFsIGluIHJlLnNwbGl0KCcsICo8JywgdmFsdWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdXJsLCBwYXJhbXMgPSB2YWwuc3BsaXQoJzsnLCAxKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICB1cmwsIHBhcmFtcyA9IHZhbCwgJycKCiAgICAgICAgbGluayA9IHsndXJsJzogdXJsLnN0cmlwKCc8PiBcJyInKX0KCiAgICAgICAgZm9yIHBhcmFtIGluIHBhcmFtcy5zcGxpdCgnOycpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBrZXksIHZhbHVlID0gcGFyYW0uc3BsaXQoJz0nKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICBsaW5rW2tleS5zdHJpcChyZXBsYWNlX2NoYXJzKV0gPSB2YWx1ZS5zdHJpcChyZXBsYWNlX2NoYXJzKQoKICAgICAgICBsaW5rcy5hcHBlbmQobGluaykKCiAgICByZXR1cm4gbGlua3MKCgojIE51bGwgYnl0ZXM7IG5vIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2Ugb24gZWFjaCBjYWxsIHRvIGd1ZXNzX2pzb25fdXRmCl9udWxsID0gJ1x4MDAnLmVuY29kZSgnYXNjaWknKSAgIyBlbmNvZGluZyB0byBBU0NJSSBmb3IgUHl0aG9uIDMKX251bGwyID0gX251bGwgKiAyCl9udWxsMyA9IF9udWxsICogMwoKCmRlZiBndWVzc19qc29uX3V0ZihkYXRhKToKICAgICIiIgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgIyBKU09OIGFsd2F5cyBzdGFydHMgd2l0aCB0d28gQVNDSUkgY2hhcmFjdGVycywgc28gZGV0ZWN0aW9uIGlzIGFzCiAgICAjIGVhc3kgYXMgY291bnRpbmcgdGhlIG51bGxzIGFuZCBmcm9tIHRoZWlyIGxvY2F0aW9uIGFuZCBjb3VudAogICAgIyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nLiBBbHNvIGRldGVjdCBhIEJPTSwgaWYgcHJlc2VudC4KICAgIHNhbXBsZSA9IGRhdGFbOjRdCiAgICBpZiBzYW1wbGUgaW4gKGNvZGVjcy5CT01fVVRGMzJfTEUsIGNvZGVjcy5CT01fVVRGMzJfQkUpOgogICAgICAgIHJldHVybiAndXRmLTMyJyAgICAgIyBCT00gaW5jbHVkZWQKICAgIGlmIHNhbXBsZVs6M10gPT0gY29kZWNzLkJPTV9VVEY4OgogICAgICAgIHJldHVybiAndXRmLTgtc2lnJyAgIyBCT00gaW5jbHVkZWQsIE1TIHN0eWxlIChkaXNjb3VyYWdlZCkKICAgIGlmIHNhbXBsZVs6Ml0gaW4gKGNvZGVjcy5CT01fVVRGMTZfTEUsIGNvZGVjcy5CT01fVVRGMTZfQkUpOgogICAgICAgIHJldHVybiAndXRmLTE2JyAgICAgIyBCT00gaW5jbHVkZWQKICAgIG51bGxjb3VudCA9IHNhbXBsZS5jb3VudChfbnVsbCkKICAgIGlmIG51bGxjb3VudCA9PSAwOgogICAgICAgIHJldHVybiAndXRmLTgnCiAgICBpZiBudWxsY291bnQgPT0gMjoKICAgICAgICBpZiBzYW1wbGVbOjoyXSA9PSBfbnVsbDI6ICAgIyAxc3QgYW5kIDNyZCBhcmUgbnVsbAogICAgICAgICAgICByZXR1cm4gJ3V0Zi0xNi1iZScKICAgICAgICBpZiBzYW1wbGVbMTo6Ml0gPT0gX251bGwyOiAgIyAybmQgYW5kIDR0aCBhcmUgbnVsbAogICAgICAgICAgICByZXR1cm4gJ3V0Zi0xNi1sZScKICAgICAgICAjIERpZCBub3QgZGV0ZWN0IDIgdmFsaWQgVVRGLTE2IGFzY2lpLXJhbmdlIGNoYXJhY3RlcnMKICAgIGlmIG51bGxjb3VudCA9PSAzOgogICAgICAgIGlmIHNhbXBsZVs6M10gPT0gX251bGwzOgogICAgICAgICAgICByZXR1cm4gJ3V0Zi0zMi1iZScKICAgICAgICBpZiBzYW1wbGVbMTpdID09IF9udWxsMzoKICAgICAgICAgICAgcmV0dXJuICd1dGYtMzItbGUnCiAgICAgICAgIyBEaWQgbm90IGRldGVjdCBhIHZhbGlkIFVURi0zMiBhc2NpaS1yYW5nZSBjaGFyYWN0ZXIKICAgIHJldHVybiBOb25lCgoKZGVmIHByZXBlbmRfc2NoZW1lX2lmX25lZWRlZCh1cmwsIG5ld19zY2hlbWUpOgogICAgIiIiR2l2ZW4gYSBVUkwgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgc2NoZW1lLCBwcmVwZW5kIHRoZSBnaXZlbiBzY2hlbWUuCiAgICBEb2VzIG5vdCByZXBsYWNlIGEgcHJlc2VudCBzY2hlbWUgd2l0aCB0aGUgb25lIHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50LgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybHBhcnNlKHVybCwgbmV3X3NjaGVtZSkKCiAgICAjIHVybHBhcnNlIGlzIGEgZmluaWNreSBiZWFzdCwgYW5kIHNvbWV0aW1lcyBkZWNpZGVzIHRoYXQgdGhlcmUgaXNuJ3QgYQogICAgIyBuZXRsb2MgcHJlc2VudC4gQXNzdW1lIHRoYXQgaXQncyBiZWluZyBvdmVyLWNhdXRpb3VzLCBhbmQgc3dpdGNoIG5ldGxvYwogICAgIyBhbmQgcGF0aCBpZiB1cmxwYXJzZSBkZWNpZGVkIHRoZXJlIHdhcyBubyBuZXRsb2MuCiAgICBpZiBub3QgbmV0bG9jOgogICAgICAgIG5ldGxvYywgcGF0aCA9IHBhdGgsIG5ldGxvYwoKICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpKQoKCmRlZiBnZXRfYXV0aF9mcm9tX3VybCh1cmwpOgogICAgIiIiR2l2ZW4gYSB1cmwgd2l0aCBhdXRoZW50aWNhdGlvbiBjb21wb25lbnRzLCBleHRyYWN0IHRoZW0gaW50byBhIHR1cGxlIG9mCiAgICB1c2VybmFtZSxwYXNzd29yZC4KCiAgICA6cnR5cGU6IChzdHIsc3RyKQogICAgIiIiCiAgICBwYXJzZWQgPSB1cmxwYXJzZSh1cmwpCgogICAgdHJ5OgogICAgICAgIGF1dGggPSAodW5xdW90ZShwYXJzZWQudXNlcm5hbWUpLCB1bnF1b3RlKHBhcnNlZC5wYXNzd29yZCkpCiAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgIGF1dGggPSAoJycsICcnKQoKICAgIHJldHVybiBhdXRoCgoKIyBNb3ZlZCBvdXRzaWRlIG9mIGZ1bmN0aW9uIHRvIGF2b2lkIHJlY29tcGlsZSBldmVyeSBjYWxsCl9DTEVBTl9IRUFERVJfUkVHRVhfQllURSA9IHJlLmNvbXBpbGUoYideXFxTW15cXHJcXG5dKiR8XiQnKQpfQ0xFQU5fSEVBREVSX1JFR0VYX1NUUiA9IHJlLmNvbXBpbGUocideXFNbXlxyXG5dKiR8XiQnKQoKCmRlZiBjaGVja19oZWFkZXJfdmFsaWRpdHkoaGVhZGVyKToKICAgICIiIlZlcmlmaWVzIHRoYXQgaGVhZGVyIHZhbHVlIGlzIGEgc3RyaW5nIHdoaWNoIGRvZXNuJ3QgY29udGFpbgogICAgbGVhZGluZyB3aGl0ZXNwYWNlIG9yIHJldHVybiBjaGFyYWN0ZXJzLiBUaGlzIHByZXZlbnRzIHVuaW50ZW5kZWQKICAgIGhlYWRlciBpbmplY3Rpb24uCgogICAgOnBhcmFtIGhlYWRlcjogdHVwbGUsIGluIHRoZSBmb3JtYXQgKG5hbWUsIHZhbHVlKS4KICAgICIiIgogICAgbmFtZSwgdmFsdWUgPSBoZWFkZXIKCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBieXRlcyk6CiAgICAgICAgcGF0ID0gX0NMRUFOX0hFQURFUl9SRUdFWF9CWVRFCiAgICBlbHNlOgogICAgICAgIHBhdCA9IF9DTEVBTl9IRUFERVJfUkVHRVhfU1RSCiAgICB0cnk6CiAgICAgICAgaWYgbm90IHBhdC5tYXRjaCh2YWx1ZSk6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXIoIkludmFsaWQgcmV0dXJuIGNoYXJhY3RlciBvciBsZWFkaW5nIHNwYWNlIGluIGhlYWRlcjogJXMiICUgbmFtZSkKICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlcigiVmFsdWUgZm9yIGhlYWRlciB7JXM6ICVzfSBtdXN0IGJlIG9mIHR5cGUgc3RyIG9yICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcywgbm90ICVzIiAlIChuYW1lLCB2YWx1ZSwgdHlwZSh2YWx1ZSkpKQoKCmRlZiB1cmxkZWZyYWdhdXRoKHVybCk6CiAgICAiIiIKICAgIEdpdmVuIGEgdXJsIHJlbW92ZSB0aGUgZnJhZ21lbnQgYW5kIHRoZSBhdXRoZW50aWNhdGlvbiBwYXJ0LgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybHBhcnNlKHVybCkKCiAgICAjIHNlZSBmdW5jOmBwcmVwZW5kX3NjaGVtZV9pZl9uZWVkZWRgCiAgICBpZiBub3QgbmV0bG9jOgogICAgICAgIG5ldGxvYywgcGF0aCA9IHBhdGgsIG5ldGxvYwoKICAgIG5ldGxvYyA9IG5ldGxvYy5yc3BsaXQoJ0AnLCAxKVstMV0KCiAgICByZXR1cm4gdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksICcnKSkKCgpkZWYgcmV3aW5kX2JvZHkocHJlcGFyZWRfcmVxdWVzdCk6CiAgICAiIiJNb3ZlIGZpbGUgcG9pbnRlciBiYWNrIHRvIGl0cyByZWNvcmRlZCBzdGFydGluZyBwb3NpdGlvbgogICAgc28gaXQgY2FuIGJlIHJlYWQgYWdhaW4gb24gcmVkaXJlY3QuCiAgICAiIiIKICAgIGJvZHlfc2VlayA9IGdldGF0dHIocHJlcGFyZWRfcmVxdWVzdC5ib2R5LCAnc2VlaycsIE5vbmUpCiAgICBpZiBib2R5X3NlZWsgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2UocHJlcGFyZWRfcmVxdWVzdC5fYm9keV9wb3NpdGlvbiwgaW50ZWdlcl90eXBlcyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBib2R5X3NlZWsocHJlcGFyZWRfcmVxdWVzdC5fYm9keV9wb3NpdGlvbikKICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICByYWlzZSBVbnJld2luZGFibGVCb2R5RXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmV3aW5kaW5nIHJlcXVlc3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvZHkgZm9yIHJlZGlyZWN0LiIpCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFVucmV3aW5kYWJsZUJvZHlFcnJvcigiVW5hYmxlIHRvIHJld2luZCByZXF1ZXN0IGJvZHkgZm9yIHJlZGlyZWN0LiIpClBLAwQUAAAAAAAAACEAIXu8CvQmAAD0JgAANAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmV0cnlpbmcucHkjIyBDb3B5cmlnaHQgMjAxMy0yMDE0IFJheSBIb2xkZXIKIyMKIyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMjCiMjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojIwojIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKaW1wb3J0IHJhbmRvbQpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBzaXgKaW1wb3J0IHN5cwppbXBvcnQgdGltZQppbXBvcnQgdHJhY2ViYWNrCgoKIyBzeXMubWF4aW50IC8gMiwgc2luY2UgUHl0aG9uIDMuMiBkb2Vzbid0IGhhdmUgYSBzeXMubWF4aW50Li4uCk1BWF9XQUlUID0gMTA3Mzc0MTgyMwoKCmRlZiByZXRyeSgqZGFyZ3MsICoqZGt3KToKICAgICIiIgogICAgRGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgaW5zdGFudGlhdGVzIHRoZSBSZXRyeWluZyBvYmplY3QKICAgIEBwYXJhbSAqZGFyZ3M6IHBvc2l0aW9uYWwgYXJndW1lbnRzIHBhc3NlZCB0byBSZXRyeWluZyBvYmplY3QKICAgIEBwYXJhbSAqKmRrdzoga2V5d29yZCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBSZXRyeWluZyBvYmplY3QKICAgICIiIgogICAgIyBzdXBwb3J0IGJvdGggQHJldHJ5IGFuZCBAcmV0cnkoKSBhcyB2YWxpZCBzeW50YXgKICAgIGlmIGxlbihkYXJncykgPT0gMSBhbmQgY2FsbGFibGUoZGFyZ3NbMF0pOgogICAgICAgIGRlZiB3cmFwX3NpbXBsZShmKToKCiAgICAgICAgICAgIEBzaXgud3JhcHMoZikKICAgICAgICAgICAgZGVmIHdyYXBwZWRfZigqYXJncywgKiprdyk6CiAgICAgICAgICAgICAgICByZXR1cm4gUmV0cnlpbmcoKS5jYWxsKGYsICphcmdzLCAqKmt3KQoKICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRfZgoKICAgICAgICByZXR1cm4gd3JhcF9zaW1wbGUoZGFyZ3NbMF0pCgogICAgZWxzZToKICAgICAgICBkZWYgd3JhcChmKToKCiAgICAgICAgICAgIEBzaXgud3JhcHMoZikKICAgICAgICAgICAgZGVmIHdyYXBwZWRfZigqYXJncywgKiprdyk6CiAgICAgICAgICAgICAgICByZXR1cm4gUmV0cnlpbmcoKmRhcmdzLCAqKmRrdykuY2FsbChmLCAqYXJncywgKiprdykKCiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkX2YKCiAgICAgICAgcmV0dXJuIHdyYXAKCgpjbGFzcyBSZXRyeWluZyhvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIHN0b3A9Tm9uZSwgd2FpdD1Ob25lLAogICAgICAgICAgICAgICAgIHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyPU5vbmUsCiAgICAgICAgICAgICAgICAgc3RvcF9tYXhfZGVsYXk9Tm9uZSwKICAgICAgICAgICAgICAgICB3YWl0X2ZpeGVkPU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9yYW5kb21fbWluPU5vbmUsIHdhaXRfcmFuZG9tX21heD1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfaW5jcmVtZW50aW5nX3N0YXJ0PU5vbmUsIHdhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudD1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllcj1Ob25lLCB3YWl0X2V4cG9uZW50aWFsX21heD1Ob25lLAogICAgICAgICAgICAgICAgIHJldHJ5X29uX2V4Y2VwdGlvbj1Ob25lLAogICAgICAgICAgICAgICAgIHJldHJ5X29uX3Jlc3VsdD1Ob25lLAogICAgICAgICAgICAgICAgIHdyYXBfZXhjZXB0aW9uPUZhbHNlLAogICAgICAgICAgICAgICAgIHN0b3BfZnVuYz1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfZnVuYz1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfaml0dGVyX21heD1Ob25lKToKCiAgICAgICAgc2VsZi5fc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXIgPSA1IGlmIHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyIGlzIE5vbmUgZWxzZSBzdG9wX21heF9hdHRlbXB0X251bWJlcgogICAgICAgIHNlbGYuX3N0b3BfbWF4X2RlbGF5ID0gMTAwIGlmIHN0b3BfbWF4X2RlbGF5IGlzIE5vbmUgZWxzZSBzdG9wX21heF9kZWxheQogICAgICAgIHNlbGYuX3dhaXRfZml4ZWQgPSAxMDAwIGlmIHdhaXRfZml4ZWQgaXMgTm9uZSBlbHNlIHdhaXRfZml4ZWQKICAgICAgICBzZWxmLl93YWl0X3JhbmRvbV9taW4gPSAwIGlmIHdhaXRfcmFuZG9tX21pbiBpcyBOb25lIGVsc2Ugd2FpdF9yYW5kb21fbWluCiAgICAgICAgc2VsZi5fd2FpdF9yYW5kb21fbWF4ID0gMTAwMCBpZiB3YWl0X3JhbmRvbV9tYXggaXMgTm9uZSBlbHNlIHdhaXRfcmFuZG9tX21heAogICAgICAgIHNlbGYuX3dhaXRfaW5jcmVtZW50aW5nX3N0YXJ0ID0gMCBpZiB3YWl0X2luY3JlbWVudGluZ19zdGFydCBpcyBOb25lIGVsc2Ugd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQKICAgICAgICBzZWxmLl93YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQgPSAxMDAgaWYgd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50IGlzIE5vbmUgZWxzZSB3YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQKICAgICAgICBzZWxmLl93YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXIgPSAxIGlmIHdhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllciBpcyBOb25lIGVsc2Ugd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyCiAgICAgICAgc2VsZi5fd2FpdF9leHBvbmVudGlhbF9tYXggPSBNQVhfV0FJVCBpZiB3YWl0X2V4cG9uZW50aWFsX21heCBpcyBOb25lIGVsc2Ugd2FpdF9leHBvbmVudGlhbF9tYXgKICAgICAgICBzZWxmLl93YWl0X2ppdHRlcl9tYXggPSAwIGlmIHdhaXRfaml0dGVyX21heCBpcyBOb25lIGVsc2Ugd2FpdF9qaXR0ZXJfbWF4CgogICAgICAgICMgVE9ETyBhZGQgY2hhaW5pbmcgb2Ygc3RvcCBiZWhhdmlvcnMKICAgICAgICAjIHN0b3AgYmVoYXZpb3IKICAgICAgICBzdG9wX2Z1bmNzID0gW10KICAgICAgICBpZiBzdG9wX21heF9hdHRlbXB0X251bWJlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc3RvcF9mdW5jcy5hcHBlbmQoc2VsZi5zdG9wX2FmdGVyX2F0dGVtcHQpCgogICAgICAgIGlmIHN0b3BfbWF4X2RlbGF5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzdG9wX2Z1bmNzLmFwcGVuZChzZWxmLnN0b3BfYWZ0ZXJfZGVsYXkpCgogICAgICAgIGlmIHN0b3BfZnVuYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5zdG9wID0gc3RvcF9mdW5jCgogICAgICAgIGVsaWYgc3RvcCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0b3AgPSBsYW1iZGEgYXR0ZW1wdHMsIGRlbGF5OiBhbnkoZihhdHRlbXB0cywgZGVsYXkpIGZvciBmIGluIHN0b3BfZnVuY3MpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RvcCA9IGdldGF0dHIoc2VsZiwgc3RvcCkKCiAgICAgICAgIyBUT0RPIGFkZCBjaGFpbmluZyBvZiB3YWl0IGJlaGF2aW9ycwogICAgICAgICMgd2FpdCBiZWhhdmlvcgogICAgICAgIHdhaXRfZnVuY3MgPSBbbGFtYmRhICphcmdzLCAqKmt3YXJnczogMF0KICAgICAgICBpZiB3YWl0X2ZpeGVkIGlzIG5vdCBOb25lOgogICAgICAgICAgICB3YWl0X2Z1bmNzLmFwcGVuZChzZWxmLmZpeGVkX3NsZWVwKQoKICAgICAgICBpZiB3YWl0X3JhbmRvbV9taW4gaXMgbm90IE5vbmUgb3Igd2FpdF9yYW5kb21fbWF4IGlzIG5vdCBOb25lOgogICAgICAgICAgICB3YWl0X2Z1bmNzLmFwcGVuZChzZWxmLnJhbmRvbV9zbGVlcCkKCiAgICAgICAgaWYgd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQgaXMgbm90IE5vbmUgb3Igd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB3YWl0X2Z1bmNzLmFwcGVuZChzZWxmLmluY3JlbWVudGluZ19zbGVlcCkKCiAgICAgICAgaWYgd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyIGlzIG5vdCBOb25lIG9yIHdhaXRfZXhwb25lbnRpYWxfbWF4IGlzIG5vdCBOb25lOgogICAgICAgICAgICB3YWl0X2Z1bmNzLmFwcGVuZChzZWxmLmV4cG9uZW50aWFsX3NsZWVwKQoKICAgICAgICBpZiB3YWl0X2Z1bmMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYud2FpdCA9IHdhaXRfZnVuYwoKICAgICAgICBlbGlmIHdhaXQgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi53YWl0ID0gbGFtYmRhIGF0dGVtcHRzLCBkZWxheTogbWF4KGYoYXR0ZW1wdHMsIGRlbGF5KSBmb3IgZiBpbiB3YWl0X2Z1bmNzKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndhaXQgPSBnZXRhdHRyKHNlbGYsIHdhaXQpCgogICAgICAgICMgcmV0cnkgb24gZXhjZXB0aW9uIGZpbHRlcgogICAgICAgIGlmIHJldHJ5X29uX2V4Y2VwdGlvbiBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9yZXRyeV9vbl9leGNlcHRpb24gPSBzZWxmLmFsd2F5c19yZWplY3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9yZXRyeV9vbl9leGNlcHRpb24gPSByZXRyeV9vbl9leGNlcHRpb24KCiAgICAgICAgIyBUT0RPIHNpbXBsaWZ5IHJldHJ5aW5nIGJ5IEV4Y2VwdGlvbiB0eXBlcwogICAgICAgICMgcmV0cnkgb24gcmVzdWx0IGZpbHRlcgogICAgICAgIGlmIHJldHJ5X29uX3Jlc3VsdCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9yZXRyeV9vbl9yZXN1bHQgPSBzZWxmLm5ldmVyX3JlamVjdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3JldHJ5X29uX3Jlc3VsdCA9IHJldHJ5X29uX3Jlc3VsdAoKICAgICAgICBzZWxmLl93cmFwX2V4Y2VwdGlvbiA9IHdyYXBfZXhjZXB0aW9uCgogICAgZGVmIHN0b3BfYWZ0ZXJfYXR0ZW1wdChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiU3RvcCBhZnRlciB0aGUgcHJldmlvdXMgYXR0ZW1wdCA+PSBzdG9wX21heF9hdHRlbXB0X251bWJlci4iIiIKICAgICAgICByZXR1cm4gcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIgPj0gc2VsZi5fc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXIKCiAgICBkZWYgc3RvcF9hZnRlcl9kZWxheShzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiU3RvcCBhZnRlciB0aGUgdGltZSBmcm9tIHRoZSBmaXJzdCBhdHRlbXB0ID49IHN0b3BfbWF4X2RlbGF5LiIiIgogICAgICAgIHJldHVybiBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zID49IHNlbGYuX3N0b3BfbWF4X2RlbGF5CgogICAgZGVmIG5vX3NsZWVwKHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiJEb24ndCBzbGVlcCBhdCBhbGwgYmVmb3JlIHJldHJ5aW5nLiIiIgogICAgICAgIHJldHVybiAwCgogICAgZGVmIGZpeGVkX3NsZWVwKHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiJTbGVlcCBhIGZpeGVkIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gZWFjaCByZXRyeS4iIiIKICAgICAgICByZXR1cm4gc2VsZi5fd2FpdF9maXhlZAoKICAgIGRlZiByYW5kb21fc2xlZXAoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICIiIlNsZWVwIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gd2FpdF9yYW5kb21fbWluIGFuZCB3YWl0X3JhbmRvbV9tYXgiIiIKICAgICAgICByZXR1cm4gcmFuZG9tLnJhbmRpbnQoc2VsZi5fd2FpdF9yYW5kb21fbWluLCBzZWxmLl93YWl0X3JhbmRvbV9tYXgpCgogICAgZGVmIGluY3JlbWVudGluZ19zbGVlcChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiCiAgICAgICAgU2xlZXAgYW4gaW5jcmVtZW50YWwgYW1vdW50IG9mIHRpbWUgYWZ0ZXIgZWFjaCBhdHRlbXB0LCBzdGFydGluZyBhdAogICAgICAgIHdhaXRfaW5jcmVtZW50aW5nX3N0YXJ0IGFuZCBpbmNyZW1lbnRpbmcgYnkgd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50CiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gc2VsZi5fd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQgKyAoc2VsZi5fd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50ICogKHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyIC0gMSkpCiAgICAgICAgaWYgcmVzdWx0IDwgMDoKICAgICAgICAgICAgcmVzdWx0ID0gMAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZXhwb25lbnRpYWxfc2xlZXAoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgIGV4cCA9IDIgKiogcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIKICAgICAgICByZXN1bHQgPSBzZWxmLl93YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXIgKiBleHAKICAgICAgICBpZiByZXN1bHQgPiBzZWxmLl93YWl0X2V4cG9uZW50aWFsX21heDoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fd2FpdF9leHBvbmVudGlhbF9tYXgKICAgICAgICBpZiByZXN1bHQgPCAwOgogICAgICAgICAgICByZXN1bHQgPSAwCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBuZXZlcl9yZWplY3Qoc2VsZiwgcmVzdWx0KToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgYWx3YXlzX3JlamVjdChzZWxmLCByZXN1bHQpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNob3VsZF9yZWplY3Qoc2VsZiwgYXR0ZW1wdCk6CiAgICAgICAgcmVqZWN0ID0gRmFsc2UKICAgICAgICBpZiBhdHRlbXB0Lmhhc19leGNlcHRpb246CiAgICAgICAgICAgIHJlamVjdCB8PSBzZWxmLl9yZXRyeV9vbl9leGNlcHRpb24oYXR0ZW1wdC52YWx1ZVsxXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZWplY3QgfD0gc2VsZi5fcmV0cnlfb25fcmVzdWx0KGF0dGVtcHQudmFsdWUpCgogICAgICAgIHJldHVybiByZWplY3QKCiAgICBkZWYgY2FsbChzZWxmLCBmbiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdGFydF90aW1lID0gaW50KHJvdW5kKHRpbWUudGltZSgpICogMTAwMCkpCiAgICAgICAgYXR0ZW1wdF9udW1iZXIgPSAxCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYXR0ZW1wdCA9IEF0dGVtcHQoZm4oKmFyZ3MsICoqa3dhcmdzKSwgYXR0ZW1wdF9udW1iZXIsIEZhbHNlKQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgICAgICAgICBhdHRlbXB0ID0gQXR0ZW1wdCh0YiwgYXR0ZW1wdF9udW1iZXIsIFRydWUpCgogICAgICAgICAgICBpZiBub3Qgc2VsZi5zaG91bGRfcmVqZWN0KGF0dGVtcHQpOgogICAgICAgICAgICAgICAgcmV0dXJuIGF0dGVtcHQuZ2V0KHNlbGYuX3dyYXBfZXhjZXB0aW9uKQoKICAgICAgICAgICAgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyA9IGludChyb3VuZCh0aW1lLnRpbWUoKSAqIDEwMDApKSAtIHN0YXJ0X3RpbWUKICAgICAgICAgICAgaWYgc2VsZi5zdG9wKGF0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl93cmFwX2V4Y2VwdGlvbiBhbmQgYXR0ZW1wdC5oYXNfZXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICMgZ2V0KCkgb24gYW4gYXR0ZW1wdCB3aXRoIGFuIGV4Y2VwdGlvbiBzaG91bGQgY2F1c2UgaXQgdG8gYmUgcmFpc2VkLCBidXQgcmFpc2UganVzdCBpbiBjYXNlCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgYXR0ZW1wdC5nZXQoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZXRyeUVycm9yKGF0dGVtcHQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzbGVlcCA9IHNlbGYud2FpdChhdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcykKICAgICAgICAgICAgICAgIGlmIHNlbGYuX3dhaXRfaml0dGVyX21heDoKICAgICAgICAgICAgICAgICAgICBqaXR0ZXIgPSByYW5kb20ucmFuZG9tKCkgKiBzZWxmLl93YWl0X2ppdHRlcl9tYXgKICAgICAgICAgICAgICAgICAgICBzbGVlcCA9IHNsZWVwICsgbWF4KDAsIGppdHRlcikKICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXAgLyAxMDAwLjApCgogICAgICAgICAgICBhdHRlbXB0X251bWJlciArPSAxCgoKY2xhc3MgQXR0ZW1wdChvYmplY3QpOgogICAgIiIiCiAgICBBbiBBdHRlbXB0IGVuY2Fwc3VsYXRlcyBhIGNhbGwgdG8gYSB0YXJnZXQgZnVuY3Rpb24gdGhhdCBtYXkgZW5kIGFzIGEKICAgIG5vcm1hbCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gb3IgYW4gRXhjZXB0aW9uIGRlcGVuZGluZyBvbiB3aGF0CiAgICBvY2N1cnJlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbi4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgYXR0ZW1wdF9udW1iZXIsIGhhc19leGNlcHRpb24pOgogICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQogICAgICAgIHNlbGYuYXR0ZW1wdF9udW1iZXIgPSBhdHRlbXB0X251bWJlcgogICAgICAgIHNlbGYuaGFzX2V4Y2VwdGlvbiA9IGhhc19leGNlcHRpb24KCiAgICBkZWYgZ2V0KHNlbGYsIHdyYXBfZXhjZXB0aW9uPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIEF0dGVtcHQgaW5zdGFuY2Ugb3IgcmFpc2UgYW4gRXhjZXB0aW9uLgogICAgICAgIElmIHdyYXBfZXhjZXB0aW9uIGlzIHRydWUsIHRoaXMgQXR0ZW1wdCBpcyB3cmFwcGVkIGluc2lkZSBvZiBhCiAgICAgICAgUmV0cnlFcnJvciBiZWZvcmUgYmVpbmcgcmFpc2VkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuaGFzX2V4Y2VwdGlvbjoKICAgICAgICAgICAgaWYgd3JhcF9leGNlcHRpb246CiAgICAgICAgICAgICAgICByYWlzZSBSZXRyeUVycm9yKHNlbGYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaXgucmVyYWlzZShzZWxmLnZhbHVlWzBdLCBzZWxmLnZhbHVlWzFdLCBzZWxmLnZhbHVlWzJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYuaGFzX2V4Y2VwdGlvbjoKICAgICAgICAgICAgcmV0dXJuICJBdHRlbXB0czogezB9LCBFcnJvcjpcbnsxfSIuZm9ybWF0KHNlbGYuYXR0ZW1wdF9udW1iZXIsICIiLmpvaW4odHJhY2ViYWNrLmZvcm1hdF90YihzZWxmLnZhbHVlWzJdKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICJBdHRlbXB0czogezB9LCBWYWx1ZTogezF9Ii5mb3JtYXQoc2VsZi5hdHRlbXB0X251bWJlciwgc2VsZi52YWx1ZSkKCgpjbGFzcyBSZXRyeUVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiIKICAgIEEgUmV0cnlFcnJvciBlbmNhcHN1bGF0ZXMgdGhlIGxhc3QgQXR0ZW1wdCBpbnN0YW5jZSByaWdodCBiZWZvcmUgZ2l2aW5nIHVwLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhc3RfYXR0ZW1wdCk6CiAgICAgICAgc2VsZi5sYXN0X2F0dGVtcHQgPSBsYXN0X2F0dGVtcHQKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIlJldHJ5RXJyb3JbezB9XSIuZm9ybWF0KHNlbGYubGFzdF9hdHRlbXB0KQpQSwMEFAAAAAAAAAAhAJlYTVqSdQAAknUAAC8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3NpeC5weSIiIlV0aWxpdGllcyBmb3Igd3JpdGluZyBjb2RlIHRoYXQgcnVucyBvbiBQeXRob24gMiBhbmQgMyIiIgoKIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBCZW5qYW1pbiBQZXRlcnNvbgojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQojIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiMgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwojIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKIyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCiMgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiMgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgojIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKIyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCgpfX2F1dGhvcl9fID0gIkJlbmphbWluIFBldGVyc29uIDxiZW5qYW1pbkBweXRob24ub3JnPiIKX192ZXJzaW9uX18gPSAiMS4xMC4wIgoKCiMgVXNlZnVsIGZvciB2ZXJ5IGNvYXJzZSB2ZXJzaW9uIGRpZmZlcmVudGlhdGlvbi4KUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwpQWTM0ID0gc3lzLnZlcnNpb25faW5mb1swOjJdID49ICgzLCA0KQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAogICAgaW50ZWdlcl90eXBlcyA9IGludCwKICAgIGNsYXNzX3R5cGVzID0gdHlwZSwKICAgIHRleHRfdHlwZSA9IHN0cgogICAgYmluYXJ5X3R5cGUgPSBieXRlcwoKICAgIE1BWFNJWkUgPSBzeXMubWF4c2l6ZQplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKICAgIGludGVnZXJfdHlwZXMgPSAoaW50LCBsb25nKQogICAgY2xhc3NfdHlwZXMgPSAodHlwZSwgdHlwZXMuQ2xhc3NUeXBlKQogICAgdGV4dF90eXBlID0gdW5pY29kZQogICAgYmluYXJ5X3R5cGUgPSBzdHIKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiamF2YSIpOgogICAgICAgICMgSnl0aG9uIGFsd2F5cyB1c2VzIDMyIGJpdHMuCiAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgZWxzZToKICAgICAgICAjIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBzaXplb2YobG9uZykgIT0gc2l6ZW9mKFB5X3NzaXplX3QpLgogICAgICAgIGNsYXNzIFgob2JqZWN0KToKCiAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEgPDwgMzEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxlbihYKCkpCiAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICMgMzItYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIDY0LWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDYzKSAtIDEpCiAgICAgICAgZGVsIFgKCgpkZWYgX2FkZF9kb2MoZnVuYywgZG9jKToKICAgICIiIkFkZCBkb2N1bWVudGF0aW9uIHRvIGEgZnVuY3Rpb24uIiIiCiAgICBmdW5jLl9fZG9jX18gPSBkb2MKCgpkZWYgX2ltcG9ydF9tb2R1bGUobmFtZSk6CiAgICAiIiJJbXBvcnQgbW9kdWxlLCByZXR1cm5pbmcgdGhlIG1vZHVsZSBhZnRlciB0aGUgbGFzdCBkb3QuIiIiCiAgICBfX2ltcG9ydF9fKG5hbWUpCiAgICByZXR1cm4gc3lzLm1vZHVsZXNbbmFtZV0KCgpjbGFzcyBfTGF6eURlc2NyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIHRwKToKICAgICAgICByZXN1bHQgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICBzZXRhdHRyKG9iaiwgc2VsZi5uYW1lLCByZXN1bHQpICAjIEludm9rZXMgX19zZXRfXy4KICAgICAgICB0cnk6CiAgICAgICAgICAgICMgVGhpcyBpcyBhIGJpdCB1Z2x5LCBidXQgaXQgYXZvaWRzIHJ1bm5pbmcgdGhpcyBhZ2FpbiBieQogICAgICAgICAgICAjIHJlbW92aW5nIHRoaXMgZGVzY3JpcHRvci4KICAgICAgICAgICAgZGVsYXR0cihvYmouX19jbGFzc19fLCBzZWxmLm5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIE1vdmVkTW9kdWxlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGQsIG5ldz1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZE1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ldyBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3ID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ldwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIHJldHVybiBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgX21vZHVsZSA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHZhbHVlID0gZ2V0YXR0cihfbW9kdWxlLCBhdHRyKQogICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCiAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgX0xhenlNb2R1bGUodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHN1cGVyKF9MYXp5TW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIHNlbGYuX19kb2NfXyA9IHNlbGYuX19jbGFzc19fLl9fZG9jX18KCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICBhdHRycyA9IFsiX19kb2NfXyIsICJfX25hbWVfXyJdCiAgICAgICAgYXR0cnMgKz0gW2F0dHIubmFtZSBmb3IgYXR0ciBpbiBzZWxmLl9tb3ZlZF9hdHRyaWJ1dGVzXQogICAgICAgIHJldHVybiBhdHRycwoKICAgICMgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcwogICAgX21vdmVkX2F0dHJpYnV0ZXMgPSBbXQoKCmNsYXNzIE1vdmVkQXR0cmlidXRlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGRfbW9kLCBuZXdfbW9kLCBvbGRfYXR0cj1Ob25lLCBuZXdfYXR0cj1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZEF0dHJpYnV0ZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ld19tb2QgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ld19tb2QgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3X21vZAogICAgICAgICAgICBpZiBuZXdfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG5hbWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBvbGRfYXR0cgogICAgICAgICAgICBzZWxmLmF0dHIgPSBuZXdfYXR0cgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkX21vZAogICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgb2xkX2F0dHIgPSBuYW1lCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG9sZF9hdHRyCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIG1vZHVsZSA9IF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQogICAgICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgc2VsZi5hdHRyKQoKCmNsYXNzIF9TaXhNZXRhUGF0aEltcG9ydGVyKG9iamVjdCk6CgogICAgIiIiCiAgICBBIG1ldGEgcGF0aCBpbXBvcnRlciB0byBpbXBvcnQgc2l4Lm1vdmVzIGFuZCBpdHMgc3VibW9kdWxlcy4KCiAgICBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBQRVAzMDIgZmluZGVyIGFuZCBsb2FkZXIuIEl0IHNob3VsZCBiZSBjb21wYXRpYmxlCiAgICB3aXRoIFB5dGhvbiAyLjUgYW5kIGFsbCBleGlzdGluZyB2ZXJzaW9ucyBvZiBQeXRob24zCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2l4X21vZHVsZV9uYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBzaXhfbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmtub3duX21vZHVsZXMgPSB7fQoKICAgIGRlZiBfYWRkX21vZHVsZShzZWxmLCBtb2QsICpmdWxsbmFtZXMpOgogICAgICAgIGZvciBmdWxsbmFtZSBpbiBmdWxsbmFtZXM6CiAgICAgICAgICAgIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0gPSBtb2QKCiAgICBkZWYgX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYua25vd25fbW9kdWxlczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJUaGlzIGxvYWRlciBkb2VzIG5vdCBrbm93IG1vZHVsZSAiICsgZnVsbG5hbWUpCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBhIHJlbG9hZAogICAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgbW9kID0gc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpCiAgICAgICAgaWYgaXNpbnN0YW5jZShtb2QsIE1vdmVkTW9kdWxlKToKICAgICAgICAgICAgbW9kID0gbW9kLl9yZXNvbHZlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYKICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBtb2QKICAgICAgICByZXR1cm4gbW9kCgogICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0cnVlLCBpZiB0aGUgbmFtZWQgbW9kdWxlIGlzIGEgcGFja2FnZS4KCiAgICAgICAgV2UgbmVlZCB0aGlzIG1ldGhvZCB0byBnZXQgY29ycmVjdCBzcGVjIG9iamVjdHMgd2l0aAogICAgICAgIFB5dGhvbiAzLjQgKHNlZSBQRVA0NTEpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpLCAiX19wYXRoX18iKQoKICAgIGRlZiBnZXRfY29kZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIE5vbmUKCiAgICAgICAgUmVxdWlyZWQsIGlmIGlzX3BhY2thZ2UgaXMgaW1wbGVtZW50ZWQiIiIKICAgICAgICBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkgICMgZXZlbnR1YWxseSByYWlzZXMgSW1wb3J0RXJyb3IKICAgICAgICByZXR1cm4gTm9uZQogICAgZ2V0X3NvdXJjZSA9IGdldF9jb2RlICAjIHNhbWUgYXMgZ2V0X2NvZGUKCl9pbXBvcnRlciA9IF9TaXhNZXRhUGF0aEltcG9ydGVyKF9fbmFtZV9fKQoKCmNsYXNzIF9Nb3ZlZEl0ZW1zKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKCgpfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJjU3RyaW5nSU8iLCAiY1N0cmluZ0lPIiwgImlvIiwgIlN0cmluZ0lPIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpZmlsdGVyIiwgImZpbHRlciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlcmZhbHNlIiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaWZpbHRlcmZhbHNlIiwgImZpbHRlcmZhbHNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5wdXQiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAicmF3X2lucHV0IiwgImlucHV0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW50ZXJuIiwgIl9fYnVpbHRpbl9fIiwgInN5cyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIm1hcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaW1hcCIsICJtYXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2QiLCAib3MiLCAib3MiLCAiZ2V0Y3dkdSIsICJnZXRjd2QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2RiIiwgIm9zIiwgIm9zIiwgImdldGN3ZCIsICJnZXRjd2RiIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVsb2FkX21vZHVsZSIsICJfX2J1aWx0aW5fXyIsICJpbXBvcnRsaWIiIGlmIFBZMzQgZWxzZSAiaW1wIiwgInJlbG9hZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlZHVjZSIsICJfX2J1aWx0aW5fXyIsICJmdW5jdG9vbHMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzaGxleF9xdW90ZSIsICJwaXBlcyIsICJzaGxleCIsICJxdW90ZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlN0cmluZ0lPIiwgIlN0cmluZ0lPIiwgImlvIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckRpY3QiLCAiVXNlckRpY3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyTGlzdCIsICJVc2VyTGlzdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJTdHJpbmciLCAiVXNlclN0cmluZyIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInhyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgIml6aXAiLCAiemlwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwX2xvbmdlc3QiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpemlwX2xvbmdlc3QiLCAiemlwX2xvbmdlc3QiKSwKICAgIE1vdmVkTW9kdWxlKCJidWlsdGlucyIsICJfX2J1aWx0aW5fXyIpLAogICAgTW92ZWRNb2R1bGUoImNvbmZpZ3BhcnNlciIsICJDb25maWdQYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjb3B5cmVnIiwgImNvcHlfcmVnIiksCiAgICBNb3ZlZE1vZHVsZSgiZGJtX2dudSIsICJnZGJtIiwgImRibS5nbnUiKSwKICAgIE1vdmVkTW9kdWxlKCJfZHVtbXlfdGhyZWFkIiwgImR1bW15X3RocmVhZCIsICJfZHVtbXlfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVqYXIiLCAiY29va2llbGliIiwgImh0dHAuY29va2llamFyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVzIiwgIkNvb2tpZSIsICJodHRwLmNvb2tpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX2VudGl0aWVzIiwgImh0bWxlbnRpdHlkZWZzIiwgImh0bWwuZW50aXRpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX3BhcnNlciIsICJIVE1MUGFyc2VyIiwgImh0bWwucGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jbGllbnQiLCAiaHR0cGxpYiIsICJodHRwLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVNdWx0aXBhcnQiLCAiZW1haWwubWltZS5tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX25vbm11bHRpcGFydCIsICJlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV90ZXh0IiwgImVtYWlsLk1JTUVUZXh0IiwgImVtYWlsLm1pbWUudGV4dCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfYmFzZSIsICJlbWFpbC5NSU1FQmFzZSIsICJlbWFpbC5taW1lLmJhc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJCYXNlSFRUUFNlcnZlciIsICJCYXNlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIkNHSUhUVFBTZXJ2ZXIiLCAiQ0dJSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiU2ltcGxlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoImNQaWNrbGUiLCAiY1BpY2tsZSIsICJwaWNrbGUiKSwKICAgIE1vdmVkTW9kdWxlKCJxdWV1ZSIsICJRdWV1ZSIpLAogICAgTW92ZWRNb2R1bGUoInJlcHJsaWIiLCAicmVwciIpLAogICAgTW92ZWRNb2R1bGUoInNvY2tldHNlcnZlciIsICJTb2NrZXRTZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJfdGhyZWFkIiwgInRocmVhZCIsICJfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlciIsICJUa2ludGVyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kaWFsb2ciLCAiRGlhbG9nIiwgInRraW50ZXIuZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9maWxlZGlhbG9nIiwgIkZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zY3JvbGxlZHRleHQiLCAiU2Nyb2xsZWRUZXh0IiwgInRraW50ZXIuc2Nyb2xsZWR0ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zaW1wbGVkaWFsb2ciLCAiU2ltcGxlRGlhbG9nIiwgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90aXgiLCAiVGl4IiwgInRraW50ZXIudGl4IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90dGsiLCAidHRrIiwgInRraW50ZXIudHRrIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb25zdGFudHMiLCAiVGtjb25zdGFudHMiLCAidGtpbnRlci5jb25zdGFudHMiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RuZCIsICJUa2RuZCIsICJ0a2ludGVyLmRuZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29sb3JjaG9vc2VyIiwgInRrQ29sb3JDaG9vc2VyIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbG9yY2hvb3NlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29tbW9uZGlhbG9nIiwgInRrQ29tbW9uRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbW1vbmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtmaWxlZGlhbG9nIiwgInRrRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZvbnQiLCAidGtGb250IiwgInRraW50ZXIuZm9udCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfbWVzc2FnZWJveCIsICJ0a01lc3NhZ2VCb3giLCAidGtpbnRlci5tZXNzYWdlYm94IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a3NpbXBsZWRpYWxvZyIsICJ0a1NpbXBsZURpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcGFyc2UiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9lcnJvciIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfZXJyb3IiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcm9ib3RwYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX2NsaWVudCIsICJ4bWxycGNsaWIiLCAieG1scnBjLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19zZXJ2ZXIiLCAiU2ltcGxlWE1MUlBDU2VydmVyIiwgInhtbHJwYy5zZXJ2ZXIiKSwKXQojIEFkZCB3aW5kb3dzIHNwZWNpZmljIG1vZHVsZXMuCmlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgX21vdmVkX2F0dHJpYnV0ZXMgKz0gWwogICAgICAgIE1vdmVkTW9kdWxlKCJ3aW5yZWciLCAiX3dpbnJlZyIpLAogICAgXQoKZm9yIGF0dHIgaW4gX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBhdHRyLm5hbWUsIGF0dHIpCiAgICBpZiBpc2luc3RhbmNlKGF0dHIsIE1vdmVkTW9kdWxlKToKICAgICAgICBfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoYXR0ciwgIm1vdmVzLiIgKyBhdHRyLm5hbWUpCmRlbCBhdHRyCgpfTW92ZWRJdGVtcy5fbW92ZWRfYXR0cmlidXRlcyA9IF9tb3ZlZF9hdHRyaWJ1dGVzCgptb3ZlcyA9IF9Nb3ZlZEl0ZW1zKF9fbmFtZV9fICsgIi5tb3ZlcyIpCl9pbXBvcnRlci5fYWRkX21vZHVsZShtb3ZlcywgIm1vdmVzIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9wYXJzZSIiIgoKCl91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJQYXJzZVJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTcGxpdFJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xc2wiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZGVmcmFnIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGpvaW4iLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5wYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGVuY29kZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXRxdWVyeSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR0YWciLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dXNlciIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19mcmFnbWVudCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX25ldGxvYyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3BhcmFtcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3F1ZXJ5IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcmVsYXRpdmUiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3BhcnNlIiwgIm1vdmVzLnVybGxpYi5wYXJzZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfZXJyb3IiIiIKCgpfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDb250ZW50VG9vU2hvcnRFcnJvciIsICJ1cmxsaWIiLCAidXJsbGliLmVycm9yIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLmVycm9yIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX2Vycm9yIiwgIm1vdmVzLnVybGxpYi5lcnJvciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXF1ZXN0IiIiCgoKX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsb3BlbiIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5zdGFsbF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImJ1aWxkX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGF0aG5hbWUydXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybDJwYXRobmFtZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRwcm94aWVzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlJlcXVlc3QiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIk9wZW5lckRpcmVjdG9yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGVmYXVsdEVycm9ySGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFJlZGlyZWN0SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUENvb2tpZVByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJCYXNlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBTSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmlsZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNhY2hlRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVW5rbm93bkhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvclByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscmV0cmlldmUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsY2xlYW51cCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmFuY3lVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicHJveHlfYnlwYXNzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0LCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0Ll9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVxdWVzdCIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXF1ZXN0IiwgIm1vdmVzLnVybGxpYi5yZXF1ZXN0IikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXNwb25zZSIiIgoKCl91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRiYXNlIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRjbG9zZWhvb2siLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm8iLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm91cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXNwb25zZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXNwb25zZSIsICJtb3Zlcy51cmxsaWIucmVzcG9uc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiIiCgoKX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlJvYm90RmlsZVBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiLCAibW92ZXMudXJsbGliLnJvYm90cGFyc2VyIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYih0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICAiIiJDcmVhdGUgYSBzaXgubW92ZXMudXJsbGliIG5hbWVzcGFjZSB0aGF0IHJlc2VtYmxlcyB0aGUgUHl0aG9uIDMgbmFtZXNwYWNlIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQogICAgcGFyc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9wYXJzZSIpCiAgICBlcnJvciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX2Vycm9yIikKICAgIHJlcXVlc3QgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXF1ZXN0IikKICAgIHJlc3BvbnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiKQogICAgcm9ib3RwYXJzZXIgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIpCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIFsncGFyc2UnLCAnZXJyb3InLCAncmVxdWVzdCcsICdyZXNwb25zZScsICdyb2JvdHBhcnNlciddCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYiIpCgoKZGVmIGFkZF9tb3ZlKG1vdmUpOgogICAgIiIiQWRkIGFuIGl0ZW0gdG8gc2l4Lm1vdmVzLiIiIgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgbW92ZS5uYW1lLCBtb3ZlKQoKCmRlZiByZW1vdmVfbW92ZShuYW1lKToKICAgICIiIlJlbW92ZSBpdGVtIGZyb20gc2l4Lm1vdmVzLiIiIgogICAgdHJ5OgogICAgICAgIGRlbGF0dHIoX01vdmVkSXRlbXMsIG5hbWUpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgbW92ZXMuX19kaWN0X19bbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJubyBzdWNoIG1vdmUsICVyIiAlIChuYW1lLCkpCgoKaWYgUFkzOgogICAgX21ldGhfZnVuYyA9ICJfX2Z1bmNfXyIKICAgIF9tZXRoX3NlbGYgPSAiX19zZWxmX18iCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJfX2Nsb3N1cmVfXyIKICAgIF9mdW5jX2NvZGUgPSAiX19jb2RlX18iCiAgICBfZnVuY19kZWZhdWx0cyA9ICJfX2RlZmF1bHRzX18iCiAgICBfZnVuY19nbG9iYWxzID0gIl9fZ2xvYmFsc19fIgplbHNlOgogICAgX21ldGhfZnVuYyA9ICJpbV9mdW5jIgogICAgX21ldGhfc2VsZiA9ICJpbV9zZWxmIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiZnVuY19jbG9zdXJlIgogICAgX2Z1bmNfY29kZSA9ICJmdW5jX2NvZGUiCiAgICBfZnVuY19kZWZhdWx0cyA9ICJmdW5jX2RlZmF1bHRzIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJmdW5jX2dsb2JhbHMiCgoKdHJ5OgogICAgYWR2YW5jZV9pdGVyYXRvciA9IG5leHQKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBhZHZhbmNlX2l0ZXJhdG9yKGl0KToKICAgICAgICByZXR1cm4gaXQubmV4dCgpCm5leHQgPSBhZHZhbmNlX2l0ZXJhdG9yCgoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGNhbGxhYmxlKG9iaik6CiAgICAgICAgcmV0dXJuIGFueSgiX19jYWxsX18iIGluIGtsYXNzLl9fZGljdF9fIGZvciBrbGFzcyBpbiB0eXBlKG9iaikuX19tcm9fXykKCgppZiBQWTM6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQKCiAgICBjcmVhdGVfYm91bmRfbWV0aG9kID0gdHlwZXMuTWV0aG9kVHlwZQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gZnVuYwoKICAgIEl0ZXJhdG9yID0gb2JqZWN0CmVsc2U6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQuaW1fZnVuYwoKICAgIGRlZiBjcmVhdGVfYm91bmRfbWV0aG9kKGZ1bmMsIG9iaik6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgb2JqLCBvYmouX19jbGFzc19fKQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBOb25lLCBjbHMpCgogICAgY2xhc3MgSXRlcmF0b3Iob2JqZWN0KToKCiAgICAgICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiB0eXBlKHNlbGYpLl9fbmV4dF9fKHNlbGYpCgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpfYWRkX2RvYyhnZXRfdW5ib3VuZF9mdW5jdGlvbiwKICAgICAgICAgIiIiR2V0IHRoZSBmdW5jdGlvbiBvdXQgb2YgYSBwb3NzaWJseSB1bmJvdW5kIGZ1bmN0aW9uIiIiKQoKCmdldF9tZXRob2RfZnVuY3Rpb24gPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX2Z1bmMpCmdldF9tZXRob2Rfc2VsZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfc2VsZikKZ2V0X2Z1bmN0aW9uX2Nsb3N1cmUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2Nsb3N1cmUpCmdldF9mdW5jdGlvbl9jb2RlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jb2RlKQpnZXRfZnVuY3Rpb25fZGVmYXVsdHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2RlZmF1bHRzKQpnZXRfZnVuY3Rpb25fZ2xvYmFscyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZ2xvYmFscykKCgppZiBQWTM6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5rZXlzKCoqa3cpKQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQudmFsdWVzKCoqa3cpKQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5pdGVtcygqKmt3KSkKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQubGlzdHMoKiprdykpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoImtleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJpdGVtcyIpCmVsc2U6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmtleXMoKiprdykKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVydmFsdWVzKCoqa3cpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVyaXRlbXMoKiprdykKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJsaXN0cygqKmt3KQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3a2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld3ZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3aXRlbXMiKQoKX2FkZF9kb2MoaXRlcmtleXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcnZhbHVlcywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJpdGVtcywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJsaXN0cywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCBbdmFsdWVzXSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCgoKaWYgUFkzOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCJsYXRpbi0xIikKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gcwogICAgdW5pY2hyID0gY2hyCiAgICBpbXBvcnQgc3RydWN0CiAgICBpbnQyYnl0ZSA9IHN0cnVjdC5TdHJ1Y3QoIj5CIikucGFjawogICAgZGVsIHN0cnVjdAogICAgYnl0ZTJpbnQgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKDApCiAgICBpbmRleGJ5dGVzID0gb3BlcmF0b3IuZ2V0aXRlbQogICAgaXRlcmJ5dGVzID0gaXRlcgogICAgaW1wb3J0IGlvCiAgICBTdHJpbmdJTyA9IGlvLlN0cmluZ0lPCiAgICBCeXRlc0lPID0gaW8uQnl0ZXNJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0Q291bnRFcXVhbCIKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMV0gPD0gMToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgogICAgZWxzZToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXgiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4IgplbHNlOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMKICAgICMgV29ya2Fyb3VuZCBmb3Igc3RhbmRhbG9uZSBiYWNrc2xhc2gKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gdW5pY29kZShzLnJlcGxhY2UocidcXCcsIHInXFxcXCcpLCAidW5pY29kZV9lc2NhcGUiKQogICAgdW5pY2hyID0gdW5pY2hyCiAgICBpbnQyYnl0ZSA9IGNocgoKICAgIGRlZiBieXRlMmludChicyk6CiAgICAgICAgcmV0dXJuIG9yZChic1swXSkKCiAgICBkZWYgaW5kZXhieXRlcyhidWYsIGkpOgogICAgICAgIHJldHVybiBvcmQoYnVmW2ldKQogICAgaXRlcmJ5dGVzID0gZnVuY3Rvb2xzLnBhcnRpYWwoaXRlcnRvb2xzLmltYXAsIG9yZCkKICAgIGltcG9ydCBTdHJpbmdJTwogICAgU3RyaW5nSU8gPSBCeXRlc0lPID0gU3RyaW5nSU8uU3RyaW5nSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydEl0ZW1zRXF1YWwiCiAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCl9hZGRfZG9jKGIsICIiIkJ5dGUgbGl0ZXJhbCIiIikKX2FkZF9kb2ModSwgIiIiVGV4dCBsaXRlcmFsIiIiKQoKCmRlZiBhc3NlcnRDb3VudEVxdWFsKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0Q291bnRFcXVhbCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSYWlzZXNSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJhaXNlc1JlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgppZiBQWTM6CiAgICBleGVjXyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJleGVjIikKCiAgICBkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHZhbHVlID0gdHAoKQogICAgICAgIGlmIHZhbHVlLl9fdHJhY2ViYWNrX18gaXMgbm90IHRiOgogICAgICAgICAgICByYWlzZSB2YWx1ZS53aXRoX3RyYWNlYmFjayh0YikKICAgICAgICByYWlzZSB2YWx1ZQoKZWxzZToKICAgIGRlZiBleGVjXyhfY29kZV8sIF9nbG9ic189Tm9uZSwgX2xvY3NfPU5vbmUpOgogICAgICAgICIiIkV4ZWN1dGUgY29kZSBpbiBhIG5hbWVzcGFjZS4iIiIKICAgICAgICBpZiBfZ2xvYnNfIGlzIE5vbmU6CiAgICAgICAgICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgxKQogICAgICAgICAgICBfZ2xvYnNfID0gZnJhbWUuZl9nbG9iYWxzCiAgICAgICAgICAgIGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICAgICAgX2xvY3NfID0gZnJhbWUuZl9sb2NhbHMKICAgICAgICAgICAgZGVsIGZyYW1lCiAgICAgICAgZWxpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgX2xvY3NfID0gX2dsb2JzXwogICAgICAgIGV4ZWMoIiIiZXhlYyBfY29kZV8gaW4gX2dsb2JzXywgX2xvY3NfIiIiKQoKICAgIGV4ZWNfKCIiImRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICByYWlzZSB0cCwgdmFsdWUsIHRiCiIiIikKCgppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICBpZiBmcm9tX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgdmFsdWUKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPiAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbHNlOgogICAgZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgICAgIHJhaXNlIHZhbHVlCgoKcHJpbnRfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgInByaW50IiwgTm9uZSkKaWYgcHJpbnRfIGlzIE5vbmU6CiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiVGhlIG5ldy1zdHlsZSBwcmludCBmdW5jdGlvbiBmb3IgUHl0aG9uIDIuNCBhbmQgMi41LiIiIgogICAgICAgIGZwID0ga3dhcmdzLnBvcCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgaWYgZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGRlZiB3cml0ZShkYXRhKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpCiAgICAgICAgICAgICMgSWYgdGhlIGZpbGUgaGFzIGFuIGVuY29kaW5nLCBlbmNvZGUgdW5pY29kZSB3aXRoIGl0LgogICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShmcCwgZmlsZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKSBhbmQKICAgICAgICAgICAgICAgICAgICBmcC5lbmNvZGluZyBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBlcnJvcnMgPSBnZXRhdHRyKGZwLCAiZXJyb3JzIiwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIGVycm9ycyBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGVycm9ycyA9ICJzdHJpY3QiCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoZnAuZW5jb2RpbmcsIGVycm9ycykKICAgICAgICAgICAgZnAud3JpdGUoZGF0YSkKICAgICAgICB3YW50X3VuaWNvZGUgPSBGYWxzZQogICAgICAgIHNlcCA9IGt3YXJncy5wb3AoInNlcCIsIE5vbmUpCiAgICAgICAgaWYgc2VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlcCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2VwLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJzZXAgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBlbmQgPSBrd2FyZ3MucG9wKCJlbmQiLCBOb25lKQogICAgICAgIGlmIGVuZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbmQsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGVuZCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZW5kIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgaWYga3dhcmdzOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQga2V5d29yZCBhcmd1bWVudHMgdG8gcHJpbnQoKSIpCiAgICAgICAgaWYgbm90IHdhbnRfdW5pY29kZToKICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHdhbnRfdW5pY29kZToKICAgICAgICAgICAgbmV3bGluZSA9IHVuaWNvZGUoIlxuIikKICAgICAgICAgICAgc3BhY2UgPSB1bmljb2RlKCIgIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXdsaW5lID0gIlxuIgogICAgICAgICAgICBzcGFjZSA9ICIgIgogICAgICAgIGlmIHNlcCBpcyBOb25lOgogICAgICAgICAgICBzZXAgPSBzcGFjZQogICAgICAgIGlmIGVuZCBpcyBOb25lOgogICAgICAgICAgICBlbmQgPSBuZXdsaW5lCiAgICAgICAgZm9yIGksIGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CiAgICAgICAgICAgIGlmIGk6CiAgICAgICAgICAgICAgICB3cml0ZShzZXApCiAgICAgICAgICAgIHdyaXRlKGFyZykKICAgICAgICB3cml0ZShlbmQpCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdIDwgKDMsIDMpOgogICAgX3ByaW50ID0gcHJpbnRfCgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGZwID0ga3dhcmdzLmdldCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgZmx1c2ggPSBrd2FyZ3MucG9wKCJmbHVzaCIsIEZhbHNlKQogICAgICAgIF9wcmludCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgaWYgZmx1c2ggYW5kIGZwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmcC5mbHVzaCgpCgpfYWRkX2RvYyhyZXJhaXNlLCAiIiJSZXJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIpCgppZiBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPCAoMywgNCk6CiAgICBkZWYgd3JhcHMod3JhcHBlZCwgYXNzaWduZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfQVNTSUdOTUVOVFMsCiAgICAgICAgICAgICAgdXBkYXRlZD1mdW5jdG9vbHMuV1JBUFBFUl9VUERBVEVTKToKICAgICAgICBkZWYgd3JhcHBlcihmKToKICAgICAgICAgICAgZiA9IGZ1bmN0b29scy53cmFwcyh3cmFwcGVkLCBhc3NpZ25lZCwgdXBkYXRlZCkoZikKICAgICAgICAgICAgZi5fX3dyYXBwZWRfXyA9IHdyYXBwZWQKICAgICAgICAgICAgcmV0dXJuIGYKICAgICAgICByZXR1cm4gd3JhcHBlcgplbHNlOgogICAgd3JhcHMgPSBmdW5jdG9vbHMud3JhcHMKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIkNyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKCiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKCgpkZWYgYWRkX21ldGFjbGFzcyhtZXRhY2xhc3MpOgogICAgIiIiQ2xhc3MgZGVjb3JhdG9yIGZvciBjcmVhdGluZyBhIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICBkZWYgd3JhcHBlcihjbHMpOgogICAgICAgIG9yaWdfdmFycyA9IGNscy5fX2RpY3RfXy5jb3B5KCkKICAgICAgICBzbG90cyA9IG9yaWdfdmFycy5nZXQoJ19fc2xvdHNfXycpCiAgICAgICAgaWYgc2xvdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2xvdHMsIHN0cik6CiAgICAgICAgICAgICAgICBzbG90cyA9IFtzbG90c10KICAgICAgICAgICAgZm9yIHNsb3RzX3ZhciBpbiBzbG90czoKICAgICAgICAgICAgICAgIG9yaWdfdmFycy5wb3Aoc2xvdHNfdmFyKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fZGljdF9fJywgTm9uZSkKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX3dlYWtyZWZfXycsIE5vbmUpCiAgICAgICAgcmV0dXJuIG1ldGFjbGFzcyhjbHMuX19uYW1lX18sIGNscy5fX2Jhc2VzX18sIG9yaWdfdmFycykKICAgIHJldHVybiB3cmFwcGVyCgoKZGVmIHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZShrbGFzcyk6CiAgICAiIiIKICAgIEEgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBfX3VuaWNvZGVfXyBhbmQgX19zdHJfXyBtZXRob2RzIHVuZGVyIFB5dGhvbiAyLgogICAgVW5kZXIgUHl0aG9uIDMgaXQgZG9lcyBub3RoaW5nLgoKICAgIFRvIHN1cHBvcnQgUHl0aG9uIDIgYW5kIDMgd2l0aCBhIHNpbmdsZSBjb2RlIGJhc2UsIGRlZmluZSBhIF9fc3RyX18gbWV0aG9kCiAgICByZXR1cm5pbmcgdGV4dCBhbmQgYXBwbHkgdGhpcyBkZWNvcmF0b3IgdG8gdGhlIGNsYXNzLgogICAgIiIiCiAgICBpZiBQWTI6CiAgICAgICAgaWYgJ19fc3RyX18nIG5vdCBpbiBrbGFzcy5fX2RpY3RfXzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZSBjYW5ub3QgYmUgYXBwbGllZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVzIGJlY2F1c2UgaXQgZG9lc24ndCBkZWZpbmUgX19zdHJfXygpLiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtsYXNzLl9fbmFtZV9fKQogICAgICAgIGtsYXNzLl9fdW5pY29kZV9fID0ga2xhc3MuX19zdHJfXwogICAgICAgIGtsYXNzLl9fc3RyX18gPSBsYW1iZGEgc2VsZjogc2VsZi5fX3VuaWNvZGVfXygpLmVuY29kZSgndXRmLTgnKQogICAgcmV0dXJuIGtsYXNzCgoKIyBDb21wbGV0ZSB0aGUgbW92ZXMgaW1wbGVtZW50YXRpb24uCiMgVGhpcyBjb2RlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2R1bGUgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRpbmcuCiMgVHVybiB0aGlzIG1vZHVsZSBpbnRvIGEgcGFja2FnZS4KX19wYXRoX18gPSBbXSAgIyByZXF1aXJlZCBmb3IgUEVQIDMwMiBhbmQgUEVQIDQ1MQpfX3BhY2thZ2VfXyA9IF9fbmFtZV9fICAjIHNlZSBQRVAgMzY2IEBSZXNlcnZlZEFzc2lnbm1lbnQKaWYgZ2xvYmFscygpLmdldCgiX19zcGVjX18iKSBpcyBub3QgTm9uZToKICAgIF9fc3BlY19fLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zID0gW10gICMgUEVQIDQ1MSBAVW5kZWZpbmVkVmFyaWFibGUKIyBSZW1vdmUgb3RoZXIgc2l4IG1ldGEgcGF0aCBpbXBvcnRlcnMsIHNpbmNlIHRoZXkgY2F1c2UgcHJvYmxlbXMuIFRoaXMgY2FuCiMgaGFwcGVuIGlmIHNpeCBpcyByZW1vdmVkIGZyb20gc3lzLm1vZHVsZXMgYW5kIHRoZW4gcmVsb2FkZWQuIChTZXR1cHRvb2xzIGRvZXMKIyB0aGlzIGZvciBzb21lIHJlYXNvbi4pCmlmIHN5cy5tZXRhX3BhdGg6CiAgICBmb3IgaSwgaW1wb3J0ZXIgaW4gZW51bWVyYXRlKHN5cy5tZXRhX3BhdGgpOgogICAgICAgICMgSGVyZSdzIHNvbWUgcmVhbCBuYXN0aW5lc3M6IEFub3RoZXIgImluc3RhbmNlIiBvZiB0aGUgc2l4IG1vZHVsZSBtaWdodAogICAgICAgICMgYmUgZmxvYXRpbmcgYXJvdW5kLiBUaGVyZWZvcmUsIHdlIGNhbid0IHVzZSBpc2luc3RhbmNlKCkgdG8gY2hlY2sgZm9yCiAgICAgICAgIyB0aGUgc2l4IG1ldGEgcGF0aCBpbXBvcnRlciwgc2luY2UgdGhlIG90aGVyIHNpeCBpbnN0YW5jZSB3aWxsIGhhdmUKICAgICAgICAjIGluc2VydGVkIGFuIGltcG9ydGVyIHdpdGggZGlmZmVyZW50IGNsYXNzLgogICAgICAgIGlmICh0eXBlKGltcG9ydGVyKS5fX25hbWVfXyA9PSAiX1NpeE1ldGFQYXRoSW1wb3J0ZXIiIGFuZAogICAgICAgICAgICAgICAgaW1wb3J0ZXIubmFtZSA9PSBfX25hbWVfXyk6CiAgICAgICAgICAgIGRlbCBzeXMubWV0YV9wYXRoW2ldCiAgICAgICAgICAgIGJyZWFrCiAgICBkZWwgaSwgaW1wb3J0ZXIKIyBGaW5hbGx5LCBhZGQgdGhlIGltcG9ydGVyIHRvIHRoZSBtZXRhIHBhdGggaW1wb3J0IGhvb2suCnN5cy5tZXRhX3BhdGguYXBwZW5kKF9pbXBvcnRlcikKUEsDBBQAAAAAAAAAIQCSPvWHJQsAACULAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19faW5pdF9fLnB5IiIiCnVybGxpYjMgLSBUaHJlYWQtc2FmZSBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIHJlLXVzaW5nLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCB3YXJuaW5ncwoKZnJvbSAuY29ubmVjdGlvbnBvb2wgaW1wb3J0ICgKICAgIEhUVFBDb25uZWN0aW9uUG9vbCwKICAgIEhUVFBTQ29ubmVjdGlvblBvb2wsCiAgICBjb25uZWN0aW9uX2Zyb21fdXJsCikKCmZyb20gLiBpbXBvcnQgZXhjZXB0aW9ucwpmcm9tIC5maWxlcG9zdCBpbXBvcnQgZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YQpmcm9tIC5wb29sbWFuYWdlciBpbXBvcnQgUG9vbE1hbmFnZXIsIFByb3h5TWFuYWdlciwgcHJveHlfZnJvbV91cmwKZnJvbSAucmVzcG9uc2UgaW1wb3J0IEhUVFBSZXNwb25zZQpmcm9tIC51dGlsLnJlcXVlc3QgaW1wb3J0IG1ha2VfaGVhZGVycwpmcm9tIC51dGlsLnVybCBpbXBvcnQgZ2V0X2hvc3QKZnJvbSAudXRpbC50aW1lb3V0IGltcG9ydCBUaW1lb3V0CmZyb20gLnV0aWwucmV0cnkgaW1wb3J0IFJldHJ5CgoKIyBTZXQgZGVmYXVsdCBsb2dnaW5nIGhhbmRsZXIgdG8gYXZvaWQgIk5vIGhhbmRsZXIgZm91bmQiIHdhcm5pbmdzLgppbXBvcnQgbG9nZ2luZwp0cnk6ICAjIFB5dGhvbiAyLjcrCiAgICBmcm9tIGxvZ2dpbmcgaW1wb3J0IE51bGxIYW5kbGVyCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGNsYXNzIE51bGxIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CiAgICAgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKICAgICAgICAgICAgcGFzcwoKX19hdXRob3JfXyA9ICdBbmRyZXkgUGV0cm92IChhbmRyZXkucGV0cm92QHNoYXpvdy5uZXQpJwpfX2xpY2Vuc2VfXyA9ICdNSVQnCl9fdmVyc2lvbl9fID0gJzEuMjInCgpfX2FsbF9fID0gKAogICAgJ0hUVFBDb25uZWN0aW9uUG9vbCcsCiAgICAnSFRUUFNDb25uZWN0aW9uUG9vbCcsCiAgICAnUG9vbE1hbmFnZXInLAogICAgJ1Byb3h5TWFuYWdlcicsCiAgICAnSFRUUFJlc3BvbnNlJywKICAgICdSZXRyeScsCiAgICAnVGltZW91dCcsCiAgICAnYWRkX3N0ZGVycl9sb2dnZXInLAogICAgJ2Nvbm5lY3Rpb25fZnJvbV91cmwnLAogICAgJ2Rpc2FibGVfd2FybmluZ3MnLAogICAgJ2VuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEnLAogICAgJ2dldF9ob3N0JywKICAgICdtYWtlX2hlYWRlcnMnLAogICAgJ3Byb3h5X2Zyb21fdXJsJywKKQoKbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pLmFkZEhhbmRsZXIoTnVsbEhhbmRsZXIoKSkKCgpkZWYgYWRkX3N0ZGVycl9sb2dnZXIobGV2ZWw9bG9nZ2luZy5ERUJVRyk6CiAgICAiIiIKICAgIEhlbHBlciBmb3IgcXVpY2tseSBhZGRpbmcgYSBTdHJlYW1IYW5kbGVyIHRvIHRoZSBsb2dnZXIuIFVzZWZ1bCBmb3IKICAgIGRlYnVnZ2luZy4KCiAgICBSZXR1cm5zIHRoZSBoYW5kbGVyIGFmdGVyIGFkZGluZyBpdC4KICAgICIiIgogICAgIyBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBpbiB0aGlzIF9faW5pdF9fLnB5IHRvIGdldCB0aGUgX19uYW1lX18gY29ycmVjdAogICAgIyBldmVuIGlmIHVybGxpYjMgaXMgdmVuZG9yZWQgd2l0aGluIGFub3RoZXIgcGFja2FnZS4KICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCiAgICBoYW5kbGVyLnNldEZvcm1hdHRlcihsb2dnaW5nLkZvcm1hdHRlcignJShhc2N0aW1lKXMgJShsZXZlbG5hbWUpcyAlKG1lc3NhZ2UpcycpKQogICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKICAgIGxvZ2dlci5zZXRMZXZlbChsZXZlbCkKICAgIGxvZ2dlci5kZWJ1ZygnQWRkZWQgYSBzdGRlcnIgbG9nZ2luZyBoYW5kbGVyIHRvIGxvZ2dlcjogJXMnLCBfX25hbWVfXykKICAgIHJldHVybiBoYW5kbGVyCgoKIyAuLi4gQ2xlYW4gdXAuCmRlbCBOdWxsSGFuZGxlcgoKCiMgQWxsIHdhcm5pbmcgZmlsdGVycyAqbXVzdCogYmUgYXBwZW5kZWQgdW5sZXNzIHlvdSdyZSByZWFsbHkgY2VydGFpbiB0aGF0IHRoZXkKIyBzaG91bGRuJ3QgYmU6IG90aGVyd2lzZSwgaXQncyB2ZXJ5IGhhcmQgZm9yIHVzZXJzIHRvIHVzZSBtb3N0IFB5dGhvbgojIG1lY2hhbmlzbXMgdG8gc2lsZW5jZSB0aGVtLgojIFNlY3VyaXR5V2FybmluZydzIGFsd2F5cyBnbyBvZmYgYnkgZGVmYXVsdC4Kd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdhbHdheXMnLCBleGNlcHRpb25zLlNlY3VyaXR5V2FybmluZywgYXBwZW5kPVRydWUpCiMgU3ViamVjdEFsdE5hbWVXYXJuaW5nJ3Mgc2hvdWxkIGdvIG9mZiBvbmNlIHBlciBob3N0Cndhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcsIGV4Y2VwdGlvbnMuU3ViamVjdEFsdE5hbWVXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKIyBJbnNlY3VyZVBsYXRmb3JtV2FybmluZydzIGRvbid0IHZhcnkgYmV0d2VlbiByZXF1ZXN0cywgc28gd2Uga2VlcCBpdCBkZWZhdWx0Lgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2RlZmF1bHQnLCBleGNlcHRpb25zLkluc2VjdXJlUGxhdGZvcm1XYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICAgYXBwZW5kPVRydWUpCiMgU05JTWlzc2luZ1dhcm5pbmdzIHNob3VsZCBnbyBvZmYgb25seSBvbmNlLgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2RlZmF1bHQnLCBleGNlcHRpb25zLlNOSU1pc3NpbmdXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKCgpkZWYgZGlzYWJsZV93YXJuaW5ncyhjYXRlZ29yeT1leGNlcHRpb25zLkhUVFBXYXJuaW5nKToKICAgICIiIgogICAgSGVscGVyIGZvciBxdWlja2x5IGRpc2FibGluZyBhbGwgdXJsbGliMyB3YXJuaW5ncy4KICAgICIiIgogICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBjYXRlZ29yeSkKUEsDBBQAAAAAAAAAIQAAGdOU3CcAANwnAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19jb2xsZWN0aW9ucy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE1hcHBpbmcsIE11dGFibGVNYXBwaW5nCnRyeToKICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBSTG9jawpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBObyB0aHJlYWRzIGF2YWlsYWJsZQogICAgY2xhc3MgUkxvY2s6CiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICAgICAgcGFzcwoKCnRyeTogICMgUHl0aG9uIDIuNysKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gLnBhY2thZ2VzLm9yZGVyZWRfZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKZnJvbSAucGFja2FnZXMuc2l4IGltcG9ydCBpdGVya2V5cywgaXRlcnZhbHVlcywgUFkzCgoKX19hbGxfXyA9IFsnUmVjZW50bHlVc2VkQ29udGFpbmVyJywgJ0hUVFBIZWFkZXJEaWN0J10KCgpfTnVsbCA9IG9iamVjdCgpCgoKY2xhc3MgUmVjZW50bHlVc2VkQ29udGFpbmVyKE11dGFibGVNYXBwaW5nKToKICAgICIiIgogICAgUHJvdmlkZXMgYSB0aHJlYWQtc2FmZSBkaWN0LWxpa2UgY29udGFpbmVyIHdoaWNoIG1haW50YWlucyB1cCB0bwogICAgYGBtYXhzaXplYGAga2V5cyB3aGlsZSB0aHJvd2luZyBhd2F5IHRoZSBsZWFzdC1yZWNlbnRseS11c2VkIGtleXMgYmV5b25kCiAgICBgYG1heHNpemVgYC4KCiAgICA6cGFyYW0gbWF4c2l6ZToKICAgICAgICBNYXhpbXVtIG51bWJlciBvZiByZWNlbnQgZWxlbWVudHMgdG8gcmV0YWluLgoKICAgIDpwYXJhbSBkaXNwb3NlX2Z1bmM6CiAgICAgICAgRXZlcnkgdGltZSBhbiBpdGVtIGlzIGV2aWN0ZWQgZnJvbSB0aGUgY29udGFpbmVyLAogICAgICAgIGBgZGlzcG9zZV9mdW5jKHZhbHVlKWBgIGlzIGNhbGxlZC4gIENhbGxiYWNrIHdoaWNoIHdpbGwgZ2V0IGNhbGxlZAogICAgIiIiCgogICAgQ29udGFpbmVyQ2xzID0gT3JkZXJlZERpY3QKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4c2l6ZT0xMCwgZGlzcG9zZV9mdW5jPU5vbmUpOgogICAgICAgIHNlbGYuX21heHNpemUgPSBtYXhzaXplCiAgICAgICAgc2VsZi5kaXNwb3NlX2Z1bmMgPSBkaXNwb3NlX2Z1bmMKCiAgICAgICAgc2VsZi5fY29udGFpbmVyID0gc2VsZi5Db250YWluZXJDbHMoKQogICAgICAgIHNlbGYubG9jayA9IFJMb2NrKCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAjIFJlLWluc2VydCB0aGUgaXRlbSwgbW92aW5nIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGV2aWN0aW9uIGxpbmUuCiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIGl0ZW0gPSBzZWxmLl9jb250YWluZXIucG9wKGtleSkKICAgICAgICAgICAgc2VsZi5fY29udGFpbmVyW2tleV0gPSBpdGVtCiAgICAgICAgICAgIHJldHVybiBpdGVtCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIGV2aWN0ZWRfdmFsdWUgPSBfTnVsbAogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICAjIFBvc3NpYmx5IGV2aWN0IHRoZSBleGlzdGluZyB2YWx1ZSBvZiAna2V5JwogICAgICAgICAgICBldmljdGVkX3ZhbHVlID0gc2VsZi5fY29udGFpbmVyLmdldChrZXksIF9OdWxsKQogICAgICAgICAgICBzZWxmLl9jb250YWluZXJba2V5XSA9IHZhbHVlCgogICAgICAgICAgICAjIElmIHdlIGRpZG4ndCBldmljdCBhbiBleGlzdGluZyB2YWx1ZSwgd2UgbWlnaHQgaGF2ZSB0byBldmljdCB0aGUKICAgICAgICAgICAgIyBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW0gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250YWluZXIuCiAgICAgICAgICAgIGlmIGxlbihzZWxmLl9jb250YWluZXIpID4gc2VsZi5fbWF4c2l6ZToKICAgICAgICAgICAgICAgIF9rZXksIGV2aWN0ZWRfdmFsdWUgPSBzZWxmLl9jb250YWluZXIucG9waXRlbShsYXN0PUZhbHNlKQoKICAgICAgICBpZiBzZWxmLmRpc3Bvc2VfZnVuYyBhbmQgZXZpY3RlZF92YWx1ZSBpcyBub3QgX051bGw6CiAgICAgICAgICAgIHNlbGYuZGlzcG9zZV9mdW5jKGV2aWN0ZWRfdmFsdWUpCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fY29udGFpbmVyLnBvcChrZXkpCgogICAgICAgIGlmIHNlbGYuZGlzcG9zZV9mdW5jOgogICAgICAgICAgICBzZWxmLmRpc3Bvc2VfZnVuYyh2YWx1ZSkKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9jb250YWluZXIpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ0l0ZXJhdGlvbiBvdmVyIHRoaXMgY2xhc3MgaXMgdW5saWtlbHkgdG8gYmUgdGhyZWFkc2FmZS4nKQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgIyBDb3B5IHBvaW50ZXJzIHRvIGFsbCB2YWx1ZXMsIHRoZW4gd2lwZSB0aGUgbWFwcGluZwogICAgICAgICAgICB2YWx1ZXMgPSBsaXN0KGl0ZXJ2YWx1ZXMoc2VsZi5fY29udGFpbmVyKSkKICAgICAgICAgICAgc2VsZi5fY29udGFpbmVyLmNsZWFyKCkKCiAgICAgICAgaWYgc2VsZi5kaXNwb3NlX2Z1bmM6CiAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CiAgICAgICAgICAgICAgICBzZWxmLmRpc3Bvc2VfZnVuYyh2YWx1ZSkKCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgcmV0dXJuIGxpc3QoaXRlcmtleXMoc2VsZi5fY29udGFpbmVyKSkKCgpjbGFzcyBIVFRQSGVhZGVyRGljdChNdXRhYmxlTWFwcGluZyk6CiAgICAiIiIKICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEFuIGl0ZXJhYmxlIG9mIGZpZWxkLXZhbHVlIHBhaXJzLiBNdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGZpZWxkIG5hbWVzCiAgICAgICAgd2hlbiBjb21wYXJlZCBjYXNlLWluc2Vuc2l0aXZlbHkuCgogICAgOnBhcmFtIGt3YXJnczoKICAgICAgICBBZGRpdGlvbmFsIGZpZWxkLXZhbHVlIHBhaXJzIHRvIHBhc3MgaW4gdG8gYGBkaWN0LnVwZGF0ZWBgLgoKICAgIEEgYGBkaWN0YGAgbGlrZSBjb250YWluZXIgZm9yIHN0b3JpbmcgSFRUUCBIZWFkZXJzLgoKICAgIEZpZWxkIG5hbWVzIGFyZSBzdG9yZWQgYW5kIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmVseSBpbiBjb21wbGlhbmNlIHdpdGgKICAgIFJGQyA3MjMwLiBJdGVyYXRpb24gcHJvdmlkZXMgdGhlIGZpcnN0IGNhc2Utc2Vuc2l0aXZlIGtleSBzZWVuIGZvciBlYWNoCiAgICBjYXNlLWluc2Vuc2l0aXZlIHBhaXIuCgogICAgVXNpbmcgYGBfX3NldGl0ZW1fX2BgIHN5bnRheCBvdmVyd3JpdGVzIGZpZWxkcyB0aGF0IGNvbXBhcmUgZXF1YWwKICAgIGNhc2UtaW5zZW5zaXRpdmVseSBpbiBvcmRlciB0byBtYWludGFpbiBgYGRpY3RgYCdzIGFwaS4gRm9yIGZpZWxkcyB0aGF0CiAgICBjb21wYXJlIGVxdWFsLCBpbnN0ZWFkIGNyZWF0ZSBhIG5ldyBgYEhUVFBIZWFkZXJEaWN0YGAgYW5kIHVzZSBgYC5hZGRgYAogICAgaW4gYSBsb29wLgoKICAgIElmIG11bHRpcGxlIGZpZWxkcyB0aGF0IGFyZSBlcXVhbCBjYXNlLWluc2Vuc2l0aXZlbHkgYXJlIHBhc3NlZCB0byB0aGUKICAgIGNvbnN0cnVjdG9yIG9yIGBgLnVwZGF0ZWBgLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGFuZCBzb21lIHdpbGwgYmUKICAgIGxvc3QuCgogICAgPj4+IGhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdCgpCiAgICA+Pj4gaGVhZGVycy5hZGQoJ1NldC1Db29raWUnLCAnZm9vPWJhcicpCiAgICA+Pj4gaGVhZGVycy5hZGQoJ3NldC1jb29raWUnLCAnYmF6PXF1eHgnKQogICAgPj4+IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPSAnNycKICAgID4+PiBoZWFkZXJzWydTRVQtY29va2llJ10KICAgICdmb289YmFyLCBiYXo9cXV4eCcKICAgID4+PiBoZWFkZXJzWydDb250ZW50LUxlbmd0aCddCiAgICAnNycKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzPU5vbmUsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihIVFRQSGVhZGVyRGljdCwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NvbnRhaW5lciA9IE9yZGVyZWREaWN0KCkKICAgICAgICBpZiBoZWFkZXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGhlYWRlcnMsIEhUVFBIZWFkZXJEaWN0KToKICAgICAgICAgICAgICAgIHNlbGYuX2NvcHlfZnJvbShoZWFkZXJzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5leHRlbmQoaGVhZGVycykKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHNlbGYuZXh0ZW5kKGt3YXJncykKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWwpOgogICAgICAgIHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0gPSBba2V5LCB2YWxdCiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICB2YWwgPSBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCiAgICAgICAgcmV0dXJuICcsICcuam9pbih2YWxbMTpdKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIGRlbCBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBrZXkubG93ZXIoKSBpbiBzZWxmLl9jb250YWluZXIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTWFwcGluZykgYW5kIG5vdCBoYXNhdHRyKG90aGVyLCAna2V5cycpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgdHlwZShzZWxmKSk6CiAgICAgICAgICAgIG90aGVyID0gdHlwZShzZWxmKShvdGhlcikKICAgICAgICByZXR1cm4gKGRpY3QoKGsubG93ZXIoKSwgdikgZm9yIGssIHYgaW4gc2VsZi5pdGVybWVyZ2VkKCkpID09CiAgICAgICAgICAgICAgICBkaWN0KChrLmxvd2VyKCksIHYpIGZvciBrLCB2IGluIG90aGVyLml0ZXJtZXJnZWQoKSkpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKCiAgICBpZiBub3QgUFkzOiAgIyBQeXRob24gMgogICAgICAgIGl0ZXJrZXlzID0gTXV0YWJsZU1hcHBpbmcuaXRlcmtleXMKICAgICAgICBpdGVydmFsdWVzID0gTXV0YWJsZU1hcHBpbmcuaXRlcnZhbHVlcwoKICAgIF9fbWFya2VyID0gb2JqZWN0KCkKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2NvbnRhaW5lcikKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIyBPbmx5IHByb3ZpZGUgdGhlIG9yaWdpbmFsbHkgY2FzZWQgbmFtZXMKICAgICAgICBmb3IgdmFscyBpbiBzZWxmLl9jb250YWluZXIudmFsdWVzKCk6CiAgICAgICAgICAgIHlpZWxkIHZhbHNbMF0KCiAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6CiAgICAgICAgJycnRC5wb3Aoa1ssZF0pIC0+IHYsIHJlbW92ZSBzcGVjaWZpZWQga2V5IGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuCiAgICAgICAgICBJZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkLgogICAgICAgICcnJwogICAgICAgICMgVXNpbmcgdGhlIE11dGFibGVNYXBwaW5nIGZ1bmN0aW9uIGRpcmVjdGx5IGZhaWxzIGR1ZSB0byB0aGUgcHJpdmF0ZSBtYXJrZXIuCiAgICAgICAgIyBVc2luZyBvcmRpbmFyeSBkaWN0LnBvcCB3b3VsZCBleHBvc2UgdGhlIGludGVybmFsIHN0cnVjdHVyZXMuCiAgICAgICAgIyBTbyBsZXQncyByZWludmVudCB0aGUgd2hlZWwuCiAgICAgICAgdHJ5OgogICAgICAgICAgICB2YWx1ZSA9IHNlbGZba2V5XQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWwgc2VsZltrZXldCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgIGRlZiBkaXNjYXJkKHNlbGYsIGtleSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgc2VsZltrZXldCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIGFkZChzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgIiIiQWRkcyBhIChuYW1lLCB2YWx1ZSkgcGFpciwgZG9lc24ndCBvdmVyd3JpdGUgdGhlIHZhbHVlIGlmIGl0IGFscmVhZHkKICAgICAgICBleGlzdHMuCgogICAgICAgID4+PiBoZWFkZXJzID0gSFRUUEhlYWRlckRpY3QoZm9vPSdiYXInKQogICAgICAgID4+PiBoZWFkZXJzLmFkZCgnRm9vJywgJ2JheicpCiAgICAgICAgPj4+IGhlYWRlcnNbJ2ZvbyddCiAgICAgICAgJ2JhciwgYmF6JwogICAgICAgICIiIgogICAgICAgIGtleV9sb3dlciA9IGtleS5sb3dlcigpCiAgICAgICAgbmV3X3ZhbHMgPSBba2V5LCB2YWxdCiAgICAgICAgIyBLZWVwIHRoZSBjb21tb24gY2FzZSBha2Egbm8gaXRlbSBwcmVzZW50IGFzIGZhc3QgYXMgcG9zc2libGUKICAgICAgICB2YWxzID0gc2VsZi5fY29udGFpbmVyLnNldGRlZmF1bHQoa2V5X2xvd2VyLCBuZXdfdmFscykKICAgICAgICBpZiBuZXdfdmFscyBpcyBub3QgdmFsczoKICAgICAgICAgICAgdmFscy5hcHBlbmQodmFsKQoKICAgIGRlZiBleHRlbmQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJHZW5lcmljIGltcG9ydCBmdW5jdGlvbiBmb3IgYW55IHR5cGUgb2YgaGVhZGVyLWxpa2Ugb2JqZWN0LgogICAgICAgIEFkYXB0ZWQgdmVyc2lvbiBvZiBNdXRhYmxlTWFwcGluZy51cGRhdGUgaW4gb3JkZXIgdG8gaW5zZXJ0IGl0ZW1zCiAgICAgICAgd2l0aCBzZWxmLmFkZCBpbnN0ZWFkIG9mIHNlbGYuX19zZXRpdGVtX18KICAgICAgICAiIiIKICAgICAgICBpZiBsZW4oYXJncykgPiAxOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4dGVuZCgpIHRha2VzIGF0IG1vc3QgMSBwb3NpdGlvbmFsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudHMgKHswfSBnaXZlbikiLmZvcm1hdChsZW4oYXJncykpKQogICAgICAgIG90aGVyID0gYXJnc1swXSBpZiBsZW4oYXJncykgPj0gMSBlbHNlICgpCgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEhUVFBIZWFkZXJEaWN0KToKICAgICAgICAgICAgZm9yIGtleSwgdmFsIGluIG90aGVyLml0ZXJpdGVtcygpOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCB2YWwpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBNYXBwaW5nKToKICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIHNlbGYuYWRkKGtleSwgb3RoZXJba2V5XSkKICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICJrZXlzIik6CiAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXIua2V5cygpOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCBvdGhlcltrZXldKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCB2YWx1ZSkKCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4ga3dhcmdzLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYuYWRkKGtleSwgdmFsdWUpCgogICAgZGVmIGdldGxpc3Qoc2VsZiwga2V5LCBkZWZhdWx0PV9fbWFya2VyKToKICAgICAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHZhbHVlcyBmb3IgdGhlIG5hbWVkIGZpZWxkLiBSZXR1cm5zIGFuCiAgICAgICAgZW1wdHkgbGlzdCBpZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QuIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICB2YWxzID0gc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHZhbHNbMTpdCgogICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgaHR0cGxpYgogICAgZ2V0aGVhZGVycyA9IGdldGxpc3QKICAgIGdldGFsbG1hdGNoaW5naGVhZGVycyA9IGdldGxpc3QKICAgIGlnZXQgPSBnZXRsaXN0CgogICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgaHR0cC5jb29raWVqYXIKICAgIGdldF9hbGwgPSBnZXRsaXN0CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMoJXMpIiAlICh0eXBlKHNlbGYpLl9fbmFtZV9fLCBkaWN0KHNlbGYuaXRlcm1lcmdlZCgpKSkKCiAgICBkZWYgX2NvcHlfZnJvbShzZWxmLCBvdGhlcik6CiAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKICAgICAgICAgICAgdmFsID0gb3RoZXIuZ2V0bGlzdChrZXkpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBsaXN0KToKICAgICAgICAgICAgICAgICMgRG9uJ3QgbmVlZCB0byBjb252ZXJ0IHR1cGxlcwogICAgICAgICAgICAgICAgdmFsID0gbGlzdCh2YWwpCiAgICAgICAgICAgIHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0gPSBba2V5XSArIHZhbAoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIGNsb25lID0gdHlwZShzZWxmKSgpCiAgICAgICAgY2xvbmUuX2NvcHlfZnJvbShzZWxmKQogICAgICAgIHJldHVybiBjbG9uZQoKICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CiAgICAgICAgIiIiSXRlcmF0ZSBvdmVyIGFsbCBoZWFkZXIgbGluZXMsIGluY2x1ZGluZyBkdXBsaWNhdGUgb25lcy4iIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGY6CiAgICAgICAgICAgIHZhbHMgPSBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCiAgICAgICAgICAgIGZvciB2YWwgaW4gdmFsc1sxOl06CiAgICAgICAgICAgICAgICB5aWVsZCB2YWxzWzBdLCB2YWwKCiAgICBkZWYgaXRlcm1lcmdlZChzZWxmKToKICAgICAgICAiIiJJdGVyYXRlIG92ZXIgYWxsIGhlYWRlcnMsIG1lcmdpbmcgZHVwbGljYXRlIG9uZXMgdG9nZXRoZXIuIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmOgogICAgICAgICAgICB2YWwgPSBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCiAgICAgICAgICAgIHlpZWxkIHZhbFswXSwgJywgJy5qb2luKHZhbFsxOl0pCgogICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9odHRwbGliKGNscywgbWVzc2FnZSk6ICAjIFB5dGhvbiAyCiAgICAgICAgIiIiUmVhZCBoZWFkZXJzIGZyb20gYSBQeXRob24gMiBodHRwbGliIG1lc3NhZ2Ugb2JqZWN0LiIiIgogICAgICAgICMgcHl0aG9uMi43IGRvZXMgbm90IGV4cG9zZSBhIHByb3BlciBBUEkgZm9yIGV4cG9ydGluZyBtdWx0aWhlYWRlcnMKICAgICAgICAjIGVmZmljaWVudGx5LiBUaGlzIGZ1bmN0aW9uIHJlLXJlYWRzIHJhdyBsaW5lcyBmcm9tIHRoZSBtZXNzYWdlCiAgICAgICAgIyBvYmplY3QgYW5kIGV4dHJhY3RzIHRoZSBtdWx0aWhlYWRlcnMgcHJvcGVybHkuCiAgICAgICAgaGVhZGVycyA9IFtdCgogICAgICAgIGZvciBsaW5lIGluIG1lc3NhZ2UuaGVhZGVyczoKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCgnICcsICdcdCcpKToKICAgICAgICAgICAgICAgIGtleSwgdmFsdWUgPSBoZWFkZXJzWy0xXQogICAgICAgICAgICAgICAgaGVhZGVyc1stMV0gPSAoa2V5LCB2YWx1ZSArICdcclxuJyArIGxpbmUucnN0cmlwKCkpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3BsaXQoJzonLCAxKQogICAgICAgICAgICBoZWFkZXJzLmFwcGVuZCgoa2V5LCB2YWx1ZS5zdHJpcCgpKSkKCiAgICAgICAgcmV0dXJuIGNscyhoZWFkZXJzKQpQSwMEFAAAAAAAAAAhAGCErqfLMgAAyzIAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29ubmVjdGlvbi5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBkYXRldGltZQppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgc29ja2V0CmZyb20gc29ja2V0IGltcG9ydCBlcnJvciBhcyBTb2NrZXRFcnJvciwgdGltZW91dCBhcyBTb2NrZXRUaW1lb3V0CmltcG9ydCB3YXJuaW5ncwpmcm9tIC5wYWNrYWdlcyBpbXBvcnQgc2l4CmZyb20gLnBhY2thZ2VzLnNpeC5tb3Zlcy5odHRwX2NsaWVudCBpbXBvcnQgSFRUUENvbm5lY3Rpb24gYXMgX0hUVFBDb25uZWN0aW9uCmZyb20gLnBhY2thZ2VzLnNpeC5tb3Zlcy5odHRwX2NsaWVudCBpbXBvcnQgSFRUUEV4Y2VwdGlvbiAgIyBub3FhOiBGNDAxCgp0cnk6ICAjIENvbXBpbGVkIHdpdGggU1NMPwogICAgaW1wb3J0IHNzbAogICAgQmFzZVNTTEVycm9yID0gc3NsLlNTTEVycm9yCmV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IE5vIFNTTC4KICAgIHNzbCA9IE5vbmUKCiAgICBjbGFzcyBCYXNlU1NMRXJyb3IoQmFzZUV4Y2VwdGlvbik6CiAgICAgICAgcGFzcwoKCnRyeTogICMgUHl0aG9uIDM6CiAgICAjIE5vdCBhIG5vLW9wLCB3ZSdyZSBhZGRpbmcgdGhpcyB0byB0aGUgbmFtZXNwYWNlIHNvIGl0IGNhbiBiZSBpbXBvcnRlZC4KICAgIENvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcgpleGNlcHQgTmFtZUVycm9yOiAgIyBQeXRob24gMjoKICAgIGNsYXNzIENvbm5lY3Rpb25FcnJvcihFeGNlcHRpb24pOgogICAgICAgIHBhc3MKCgpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBOZXdDb25uZWN0aW9uRXJyb3IsCiAgICBDb25uZWN0VGltZW91dEVycm9yLAogICAgU3ViamVjdEFsdE5hbWVXYXJuaW5nLAogICAgU3lzdGVtVGltZVdhcm5pbmcsCikKZnJvbSAucGFja2FnZXMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBtYXRjaF9ob3N0bmFtZSwgQ2VydGlmaWNhdGVFcnJvcgoKZnJvbSAudXRpbC5zc2xfIGltcG9ydCAoCiAgICByZXNvbHZlX2NlcnRfcmVxcywKICAgIHJlc29sdmVfc3NsX3ZlcnNpb24sCiAgICBhc3NlcnRfZmluZ2VycHJpbnQsCiAgICBjcmVhdGVfdXJsbGliM19jb250ZXh0LAogICAgc3NsX3dyYXBfc29ja2V0CikKCgpmcm9tIC51dGlsIGltcG9ydCBjb25uZWN0aW9uCgpmcm9tIC5fY29sbGVjdGlvbnMgaW1wb3J0IEhUVFBIZWFkZXJEaWN0Cgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCnBvcnRfYnlfc2NoZW1lID0gewogICAgJ2h0dHAnOiA4MCwKICAgICdodHRwcyc6IDQ0MywKfQoKIyBXaGVuIHVwZGF0aW5nIFJFQ0VOVF9EQVRFLCBtb3ZlIGl0IHRvCiMgd2l0aGluIHR3byB5ZWFycyBvZiB0aGUgY3VycmVudCBkYXRlLCBhbmQgbm8KIyBlYXJsaWVyIHRoYW4gNiBtb250aHMgYWdvLgpSRUNFTlRfREFURSA9IGRhdGV0aW1lLmRhdGUoMjAxNiwgMSwgMSkKCgpjbGFzcyBEdW1teUNvbm5lY3Rpb24ob2JqZWN0KToKICAgICIiIlVzZWQgdG8gZGV0ZWN0IGEgZmFpbGVkIENvbm5lY3Rpb25DbHMgaW1wb3J0LiIiIgogICAgcGFzcwoKCmNsYXNzIEhUVFBDb25uZWN0aW9uKF9IVFRQQ29ubmVjdGlvbiwgb2JqZWN0KToKICAgICIiIgogICAgQmFzZWQgb24gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbiBidXQgcHJvdmlkZXMgYW4gZXh0cmEgY29uc3RydWN0b3IKICAgIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGxheWVyIGJldHdlZW4gb2xkZXIgYW5kIG5ld2VyIFB5dGhvbnMuCgogICAgQWRkaXRpb25hbCBrZXl3b3JkIHBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gY29uZmlndXJlIGF0dHJpYnV0ZXMgb2YgdGhlIGNvbm5lY3Rpb24uCiAgICBBY2NlcHRlZCBwYXJhbWV0ZXJzIGluY2x1ZGU6CgogICAgICAtIGBgc3RyaWN0YGA6IFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuSFRUUENvbm5lY3Rpb25Qb29sYAogICAgICAtIGBgc291cmNlX2FkZHJlc3NgYDogU2V0IHRoZSBzb3VyY2UgYWRkcmVzcyBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGlvbi4KCiAgICAgICAgLi4gbm90ZTo6IFRoaXMgaXMgaWdub3JlZCBmb3IgUHl0aG9uIDIuNi4gSXQgaXMgb25seSBhcHBsaWVkIGZvciAyLjcgYW5kIDMueAoKICAgICAgLSBgYHNvY2tldF9vcHRpb25zYGA6IFNldCBzcGVjaWZpYyBvcHRpb25zIG9uIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gSWYgbm90IHNwZWNpZmllZCwgdGhlbgogICAgICAgIGRlZmF1bHRzIGFyZSBsb2FkZWQgZnJvbSBgYEhUVFBDb25uZWN0aW9uLmRlZmF1bHRfc29ja2V0X29wdGlvbnNgYCB3aGljaCBpbmNsdWRlcyBkaXNhYmxpbmcKICAgICAgICBOYWdsZSdzIGFsZ29yaXRobSAoc2V0cyBUQ1BfTk9ERUxBWSB0byAxKSB1bmxlc3MgdGhlIGNvbm5lY3Rpb24gaXMgYmVoaW5kIGEgcHJveHkuCgogICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2lzaCB0byBlbmFibGUgVENQIEtlZXAgQWxpdmUgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHRzLAogICAgICAgIHlvdSBtaWdodCBwYXNzOjoKCiAgICAgICAgICAgIEhUVFBDb25uZWN0aW9uLmRlZmF1bHRfc29ja2V0X29wdGlvbnMgKyBbCiAgICAgICAgICAgICAgICAoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19LRUVQQUxJVkUsIDEpLAogICAgICAgICAgICBdCgogICAgICAgIE9yIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoZSBkZWZhdWx0cyBieSBwYXNzaW5nIGFuIGVtcHR5IGxpc3QgKGUuZy4sIGBgW11gYCkuCiAgICAiIiIKCiAgICBkZWZhdWx0X3BvcnQgPSBwb3J0X2J5X3NjaGVtZVsnaHR0cCddCgogICAgIzogRGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobSBieSBkZWZhdWx0LgogICAgIzogYGBbKHNvY2tldC5JUFBST1RPX1RDUCwgc29ja2V0LlRDUF9OT0RFTEFZLCAxKV1gYAogICAgZGVmYXVsdF9zb2NrZXRfb3B0aW9ucyA9IFsoc29ja2V0LklQUFJPVE9fVENQLCBzb2NrZXQuVENQX05PREVMQVksIDEpXQoKICAgICM6IFdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIHZlcmlmaWVzIHRoZSBob3N0J3MgY2VydGlmaWNhdGUuCiAgICBpc192ZXJpZmllZCA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBpZiBzaXguUFkzOiAgIyBQeXRob24gMwogICAgICAgICAgICBrdy5wb3AoJ3N0cmljdCcsIE5vbmUpCgogICAgICAgICMgUHJlLXNldCBzb3VyY2VfYWRkcmVzcyBpbiBjYXNlIHdlIGhhdmUgYW4gb2xkZXIgUHl0aG9uIGxpa2UgMi42LgogICAgICAgIHNlbGYuc291cmNlX2FkZHJlc3MgPSBrdy5nZXQoJ3NvdXJjZV9hZGRyZXNzJykKCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3KTogICMgUHl0aG9uIDIuNgogICAgICAgICAgICAjIF9IVFRQQ29ubmVjdGlvbiBvbiBQeXRob24gMi42IHdpbGwgYmFsayBhdCB0aGlzIGtleXdvcmQgYXJnLCBidXQKICAgICAgICAgICAgIyBub3QgbmV3ZXIgdmVyc2lvbnMuIFdlIGNhbiBzdGlsbCB1c2UgaXQgd2hlbiBjcmVhdGluZyBhCiAgICAgICAgICAgICMgY29ubmVjdGlvbiB0aG91Z2gsIHNvIHdlIHBvcCBpdCAqYWZ0ZXIqIHdlIGhhdmUgc2F2ZWQgaXQgYXMKICAgICAgICAgICAgIyBzZWxmLnNvdXJjZV9hZGRyZXNzLgogICAgICAgICAgICBrdy5wb3AoJ3NvdXJjZV9hZGRyZXNzJywgTm9uZSkKCiAgICAgICAgIzogVGhlIHNvY2tldCBvcHRpb25zIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBJZiBubyBvcHRpb25zIGFyZQogICAgICAgICM6IHByb3ZpZGVkLCB3ZSB1c2UgdGhlIGRlZmF1bHQgb3B0aW9ucy4KICAgICAgICBzZWxmLnNvY2tldF9vcHRpb25zID0ga3cucG9wKCdzb2NrZXRfb3B0aW9ucycsIHNlbGYuZGVmYXVsdF9zb2NrZXRfb3B0aW9ucykKCiAgICAgICAgIyBTdXBlcmNsYXNzIGFsc28gc2V0cyBzZWxmLnNvdXJjZV9hZGRyZXNzIGluIFB5dGhvbiAyLjcrLgogICAgICAgIF9IVFRQQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKCiAgICBkZWYgX25ld19jb25uKHNlbGYpOgogICAgICAgICIiIiBFc3RhYmxpc2ggYSBzb2NrZXQgY29ubmVjdGlvbiBhbmQgc2V0IG5vZGVsYXkgc2V0dGluZ3Mgb24gaXQuCgogICAgICAgIDpyZXR1cm46IE5ldyBzb2NrZXQgY29ubmVjdGlvbi4KICAgICAgICAiIiIKICAgICAgICBleHRyYV9rdyA9IHt9CiAgICAgICAgaWYgc2VsZi5zb3VyY2VfYWRkcmVzczoKICAgICAgICAgICAgZXh0cmFfa3dbJ3NvdXJjZV9hZGRyZXNzJ10gPSBzZWxmLnNvdXJjZV9hZGRyZXNzCgogICAgICAgIGlmIHNlbGYuc29ja2V0X29wdGlvbnM6CiAgICAgICAgICAgIGV4dHJhX2t3Wydzb2NrZXRfb3B0aW9ucyddID0gc2VsZi5zb2NrZXRfb3B0aW9ucwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4gPSBjb25uZWN0aW9uLmNyZWF0ZV9jb25uZWN0aW9uKAogICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwgc2VsZi50aW1lb3V0LCAqKmV4dHJhX2t3KQoKICAgICAgICBleGNlcHQgU29ja2V0VGltZW91dCBhcyBlOgogICAgICAgICAgICByYWlzZSBDb25uZWN0VGltZW91dEVycm9yKAogICAgICAgICAgICAgICAgc2VsZiwgIkNvbm5lY3Rpb24gdG8gJXMgdGltZWQgb3V0LiAoY29ubmVjdCB0aW1lb3V0PSVzKSIgJQogICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi50aW1lb3V0KSkKCiAgICAgICAgZXhjZXB0IFNvY2tldEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIE5ld0Nvbm5lY3Rpb25FcnJvcigKICAgICAgICAgICAgICAgIHNlbGYsICJGYWlsZWQgdG8gZXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb246ICVzIiAlIGUpCgogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIF9wcmVwYXJlX2Nvbm4oc2VsZiwgY29ubik6CiAgICAgICAgc2VsZi5zb2NrID0gY29ubgogICAgICAgICMgdGhlIF90dW5uZWxfaG9zdCBhdHRyaWJ1dGUgd2FzIGFkZGVkIGluIHB5dGhvbiAyLjYuMyAodmlhCiAgICAgICAgIyBodHRwOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL3Jldi8wZjU3YjMwYTE1MmYpIHNvIHB5dGhvbnMgMi42KDAtMikgZG8KICAgICAgICAjIG5vdCBoYXZlIHRoZW0uCiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnX3R1bm5lbF9ob3N0JywgTm9uZSk6CiAgICAgICAgICAgICMgVE9ETzogRml4IHR1bm5lbCBzbyBpdCBkb2Vzbid0IGRlcGVuZCBvbiBzZWxmLnNvY2sgc3RhdGUuCiAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCiAgICAgICAgICAgICMgTWFyayB0aGlzIGNvbm5lY3Rpb24gYXMgbm90IHJldXNhYmxlCiAgICAgICAgICAgIHNlbGYuYXV0b19vcGVuID0gMAoKICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgIGNvbm4gPSBzZWxmLl9uZXdfY29ubigpCiAgICAgICAgc2VsZi5fcHJlcGFyZV9jb25uKGNvbm4pCgogICAgZGVmIHJlcXVlc3RfY2h1bmtlZChzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEFsdGVybmF0aXZlIHRvIHRoZSBjb21tb24gcmVxdWVzdCBtZXRob2QsIHdoaWNoIHNlbmRzIHRoZQogICAgICAgIGJvZHkgd2l0aCBjaHVua2VkIGVuY29kaW5nIGFuZCBub3QgYXMgb25lIGJsb2NrCiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0KGhlYWRlcnMgaWYgaGVhZGVycyBpcyBub3QgTm9uZSBlbHNlIHt9KQogICAgICAgIHNraXBfYWNjZXB0X2VuY29kaW5nID0gJ2FjY2VwdC1lbmNvZGluZycgaW4gaGVhZGVycwogICAgICAgIHNraXBfaG9zdCA9ICdob3N0JyBpbiBoZWFkZXJzCiAgICAgICAgc2VsZi5wdXRyZXF1ZXN0KAogICAgICAgICAgICBtZXRob2QsCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgc2tpcF9hY2NlcHRfZW5jb2Rpbmc9c2tpcF9hY2NlcHRfZW5jb2RpbmcsCiAgICAgICAgICAgIHNraXBfaG9zdD1za2lwX2hvc3QKICAgICAgICApCiAgICAgICAgZm9yIGhlYWRlciwgdmFsdWUgaW4gaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICBzZWxmLnB1dGhlYWRlcihoZWFkZXIsIHZhbHVlKQogICAgICAgIGlmICd0cmFuc2Zlci1lbmNvZGluZycgbm90IGluIGhlYWRlcnM6CiAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdUcmFuc2Zlci1FbmNvZGluZycsICdjaHVua2VkJykKICAgICAgICBzZWxmLmVuZGhlYWRlcnMoKQoKICAgICAgICBpZiBib2R5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzdHJpbmdpc2hfdHlwZXMgPSBzaXguc3RyaW5nX3R5cGVzICsgKHNpeC5iaW5hcnlfdHlwZSwpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYm9keSwgc3RyaW5naXNoX3R5cGVzKToKICAgICAgICAgICAgICAgIGJvZHkgPSAoYm9keSwpCiAgICAgICAgICAgIGZvciBjaHVuayBpbiBib2R5OgogICAgICAgICAgICAgICAgaWYgbm90IGNodW5rOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjaHVuaywgc2l4LmJpbmFyeV90eXBlKToKICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rLmVuY29kZSgndXRmOCcpCiAgICAgICAgICAgICAgICBsZW5fc3RyID0gaGV4KGxlbihjaHVuaykpWzI6XQogICAgICAgICAgICAgICAgc2VsZi5zZW5kKGxlbl9zdHIuZW5jb2RlKCd1dGYtOCcpKQogICAgICAgICAgICAgICAgc2VsZi5zZW5kKGInXHJcbicpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmQoY2h1bmspCiAgICAgICAgICAgICAgICBzZWxmLnNlbmQoYidcclxuJykKCiAgICAgICAgIyBBZnRlciB0aGUgaWYgY2xhdXNlLCB0byBhbHdheXMgaGF2ZSBhIGNsb3NlZCBib2R5CiAgICAgICAgc2VsZi5zZW5kKGInMFxyXG5cclxuJykKCgpjbGFzcyBIVFRQU0Nvbm5lY3Rpb24oSFRUUENvbm5lY3Rpb24pOgogICAgZGVmYXVsdF9wb3J0ID0gcG9ydF9ieV9zY2hlbWVbJ2h0dHBzJ10KCiAgICBzc2xfdmVyc2lvbiA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBrZXlfZmlsZT1Ob25lLCBjZXJ0X2ZpbGU9Tm9uZSwKICAgICAgICAgICAgICAgICBzdHJpY3Q9Tm9uZSwgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsCiAgICAgICAgICAgICAgICAgc3NsX2NvbnRleHQ9Tm9uZSwgKiprdyk6CgogICAgICAgIEhUVFBDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHN0cmljdD1zdHJpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LCAqKmt3KQoKICAgICAgICBzZWxmLmtleV9maWxlID0ga2V5X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IGNlcnRfZmlsZQogICAgICAgIHNlbGYuc3NsX2NvbnRleHQgPSBzc2xfY29udGV4dAoKICAgICAgICAjIFJlcXVpcmVkIHByb3BlcnR5IGZvciBHb29nbGUgQXBwRW5naW5lIDEuOS4wIHdoaWNoIG90aGVyd2lzZSBjYXVzZXMKICAgICAgICAjIEhUVFBTIHJlcXVlc3RzIHRvIGdvIG91dCBhcyBIVFRQLiAoU2VlIElzc3VlICMzNTYpCiAgICAgICAgc2VsZi5fcHJvdG9jb2wgPSAnaHR0cHMnCgogICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgY29ubiA9IHNlbGYuX25ld19jb25uKCkKICAgICAgICBzZWxmLl9wcmVwYXJlX2Nvbm4oY29ubikKCiAgICAgICAgaWYgc2VsZi5zc2xfY29udGV4dCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0ID0gY3JlYXRlX3VybGxpYjNfY29udGV4dCgKICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXJlc29sdmVfc3NsX3ZlcnNpb24oTm9uZSksCiAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9cmVzb2x2ZV9jZXJ0X3JlcXMoTm9uZSksCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5zb2NrID0gc3NsX3dyYXBfc29ja2V0KAogICAgICAgICAgICBzb2NrPWNvbm4sCiAgICAgICAgICAgIGtleWZpbGU9c2VsZi5rZXlfZmlsZSwKICAgICAgICAgICAgY2VydGZpbGU9c2VsZi5jZXJ0X2ZpbGUsCiAgICAgICAgICAgIHNzbF9jb250ZXh0PXNlbGYuc3NsX2NvbnRleHQsCiAgICAgICAgKQoKCmNsYXNzIFZlcmlmaWVkSFRUUFNDb25uZWN0aW9uKEhUVFBTQ29ubmVjdGlvbik6CiAgICAiIiIKICAgIEJhc2VkIG9uIGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uIGJ1dCB3cmFwcyB0aGUgc29ja2V0IHdpdGgKICAgIFNTTCBjZXJ0aWZpY2F0aW9uLgogICAgIiIiCiAgICBjZXJ0X3JlcXMgPSBOb25lCiAgICBjYV9jZXJ0cyA9IE5vbmUKICAgIGNhX2NlcnRfZGlyID0gTm9uZQogICAgc3NsX3ZlcnNpb24gPSBOb25lCiAgICBhc3NlcnRfZmluZ2VycHJpbnQgPSBOb25lCgogICAgZGVmIHNldF9jZXJ0KHNlbGYsIGtleV9maWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLAogICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1Ob25lLCBjYV9jZXJ0cz1Ob25lLAogICAgICAgICAgICAgICAgIGFzc2VydF9ob3N0bmFtZT1Ob25lLCBhc3NlcnRfZmluZ2VycHJpbnQ9Tm9uZSwKICAgICAgICAgICAgICAgICBjYV9jZXJ0X2Rpcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSwgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBJZiBjZXJ0X3JlcXMgaXMgbm90IHByb3ZpZGVkLCB3ZSBjYW4gdHJ5IHRvIGd1ZXNzLiBJZiB0aGUgdXNlciBnYXZlCiAgICAgICAgIyB1cyBhIGNlcnQgZGF0YWJhc2UsIHdlIGFzc3VtZSB0aGV5IHdhbnQgdG8gdXNlIGl0OiBvdGhlcndpc2UsIGlmCiAgICAgICAgIyB0aGV5IGdhdmUgdXMgYW4gU1NMIENvbnRleHQgb2JqZWN0IHdlIHNob3VsZCB1c2Ugd2hhdGV2ZXIgaXMgc2V0IGZvcgogICAgICAgICMgaXQuCiAgICAgICAgaWYgY2VydF9yZXFzIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIGNhX2NlcnRzIG9yIGNhX2NlcnRfZGlyOgogICAgICAgICAgICAgICAgY2VydF9yZXFzID0gJ0NFUlRfUkVRVUlSRUQnCiAgICAgICAgICAgIGVsaWYgc2VsZi5zc2xfY29udGV4dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGNlcnRfcmVxcyA9IHNlbGYuc3NsX2NvbnRleHQudmVyaWZ5X21vZGUKCiAgICAgICAgc2VsZi5rZXlfZmlsZSA9IGtleV9maWxlCiAgICAgICAgc2VsZi5jZXJ0X2ZpbGUgPSBjZXJ0X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IGNlcnRfcmVxcwogICAgICAgIHNlbGYuYXNzZXJ0X2hvc3RuYW1lID0gYXNzZXJ0X2hvc3RuYW1lCiAgICAgICAgc2VsZi5hc3NlcnRfZmluZ2VycHJpbnQgPSBhc3NlcnRfZmluZ2VycHJpbnQKICAgICAgICBzZWxmLmNhX2NlcnRzID0gY2FfY2VydHMgYW5kIG9zLnBhdGguZXhwYW5kdXNlcihjYV9jZXJ0cykKICAgICAgICBzZWxmLmNhX2NlcnRfZGlyID0gY2FfY2VydF9kaXIgYW5kIG9zLnBhdGguZXhwYW5kdXNlcihjYV9jZXJ0X2RpcikKCiAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICAjIEFkZCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24KICAgICAgICBjb25uID0gc2VsZi5fbmV3X2Nvbm4oKQoKICAgICAgICBob3N0bmFtZSA9IHNlbGYuaG9zdAogICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ190dW5uZWxfaG9zdCcsIE5vbmUpOgogICAgICAgICAgICAjIF90dW5uZWxfaG9zdCB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNi4zCiAgICAgICAgICAgICMgKFNlZTogaHR0cDovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9yZXYvMGY1N2IzMGExNTJmKQoKICAgICAgICAgICAgc2VsZi5zb2NrID0gY29ubgogICAgICAgICAgICAjIENhbGxzIHNlbGYuX3NldF9ob3N0cG9ydCgpLCBzbyBzZWxmLmhvc3QgaXMKICAgICAgICAgICAgIyBzZWxmLl90dW5uZWxfaG9zdCBiZWxvdy4KICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKICAgICAgICAgICAgIyBNYXJrIHRoaXMgY29ubmVjdGlvbiBhcyBub3QgcmV1c2FibGUKICAgICAgICAgICAgc2VsZi5hdXRvX29wZW4gPSAwCgogICAgICAgICAgICAjIE92ZXJyaWRlIHRoZSBob3N0IHdpdGggdGhlIG9uZSB3ZSdyZSByZXF1ZXN0aW5nIGRhdGEgZnJvbS4KICAgICAgICAgICAgaG9zdG5hbWUgPSBzZWxmLl90dW5uZWxfaG9zdAoKICAgICAgICBpc190aW1lX29mZiA9IGRhdGV0aW1lLmRhdGUudG9kYXkoKSA8IFJFQ0VOVF9EQVRFCiAgICAgICAgaWYgaXNfdGltZV9vZmY6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICAgICAgICAgJ1N5c3RlbSB0aW1lIGlzIHdheSBvZmYgKGJlZm9yZSB7MH0pLiBUaGlzIHdpbGwgcHJvYmFibHkgJwogICAgICAgICAgICAgICAgJ2xlYWQgdG8gU1NMIHZlcmlmaWNhdGlvbiBlcnJvcnMnKS5mb3JtYXQoUkVDRU5UX0RBVEUpLAogICAgICAgICAgICAgICAgU3lzdGVtVGltZVdhcm5pbmcKICAgICAgICAgICAgKQoKICAgICAgICAjIFdyYXAgc29ja2V0IHVzaW5nIHZlcmlmaWNhdGlvbiB3aXRoIHRoZSByb290IGNlcnRzIGluCiAgICAgICAgIyB0cnVzdGVkX3Jvb3RfY2VydHMKICAgICAgICBpZiBzZWxmLnNzbF9jb250ZXh0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQgPSBjcmVhdGVfdXJsbGliM19jb250ZXh0KAogICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249cmVzb2x2ZV9zc2xfdmVyc2lvbihzZWxmLnNzbF92ZXJzaW9uKSwKICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1yZXNvbHZlX2NlcnRfcmVxcyhzZWxmLmNlcnRfcmVxcyksCiAgICAgICAgICAgICkKCiAgICAgICAgY29udGV4dCA9IHNlbGYuc3NsX2NvbnRleHQKICAgICAgICBjb250ZXh0LnZlcmlmeV9tb2RlID0gcmVzb2x2ZV9jZXJ0X3JlcXMoc2VsZi5jZXJ0X3JlcXMpCiAgICAgICAgc2VsZi5zb2NrID0gc3NsX3dyYXBfc29ja2V0KAogICAgICAgICAgICBzb2NrPWNvbm4sCiAgICAgICAgICAgIGtleWZpbGU9c2VsZi5rZXlfZmlsZSwKICAgICAgICAgICAgY2VydGZpbGU9c2VsZi5jZXJ0X2ZpbGUsCiAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMsCiAgICAgICAgICAgIGNhX2NlcnRfZGlyPXNlbGYuY2FfY2VydF9kaXIsCiAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT1ob3N0bmFtZSwKICAgICAgICAgICAgc3NsX2NvbnRleHQ9Y29udGV4dCkKCiAgICAgICAgaWYgc2VsZi5hc3NlcnRfZmluZ2VycHJpbnQ6CiAgICAgICAgICAgIGFzc2VydF9maW5nZXJwcmludChzZWxmLnNvY2suZ2V0cGVlcmNlcnQoYmluYXJ5X2Zvcm09VHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF9maW5nZXJwcmludCkKICAgICAgICBlbGlmIGNvbnRleHQudmVyaWZ5X21vZGUgIT0gc3NsLkNFUlRfTk9ORSBcCiAgICAgICAgICAgICAgICBhbmQgbm90IGdldGF0dHIoY29udGV4dCwgJ2NoZWNrX2hvc3RuYW1lJywgRmFsc2UpIFwKICAgICAgICAgICAgICAgIGFuZCBzZWxmLmFzc2VydF9ob3N0bmFtZSBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICMgV2hpbGUgdXJsbGliMyBhdHRlbXB0cyB0byBhbHdheXMgdHVybiBvZmYgaG9zdG5hbWUgbWF0Y2hpbmcgZnJvbQogICAgICAgICAgICAjIHRoZSBUTFMgbGlicmFyeSwgdGhpcyBjYW5ub3QgYWx3YXlzIGJlIGRvbmUuIFNvIHdlIGNoZWNrIHdoZXRoZXIKICAgICAgICAgICAgIyB0aGUgVExTIExpYnJhcnkgc3RpbGwgdGhpbmtzIGl0J3MgbWF0Y2hpbmcgaG9zdG5hbWVzLgogICAgICAgICAgICBjZXJ0ID0gc2VsZi5zb2NrLmdldHBlZXJjZXJ0KCkKICAgICAgICAgICAgaWYgbm90IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICAgICAgICAgICAgICdDZXJ0aWZpY2F0ZSBmb3IgezB9IGhhcyBubyBgc3ViamVjdEFsdE5hbWVgLCBmYWxsaW5nIGJhY2sgdG8gY2hlY2sgZm9yIGEgJwogICAgICAgICAgICAgICAgICAgICdgY29tbW9uTmFtZWAgZm9yIG5vdy4gVGhpcyBmZWF0dXJlIGlzIGJlaW5nIHJlbW92ZWQgYnkgbWFqb3IgYnJvd3NlcnMgYW5kICcKICAgICAgICAgICAgICAgICAgICAnZGVwcmVjYXRlZCBieSBSRkMgMjgxOC4gKFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2hhem93L3VybGxpYjMvaXNzdWVzLzQ5NyAnCiAgICAgICAgICAgICAgICAgICAgJ2ZvciBkZXRhaWxzLiknLmZvcm1hdChob3N0bmFtZSkpLAogICAgICAgICAgICAgICAgICAgIFN1YmplY3RBbHROYW1lV2FybmluZwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBfbWF0Y2hfaG9zdG5hbWUoY2VydCwgc2VsZi5hc3NlcnRfaG9zdG5hbWUgb3IgaG9zdG5hbWUpCgogICAgICAgIHNlbGYuaXNfdmVyaWZpZWQgPSAoCiAgICAgICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPT0gc3NsLkNFUlRfUkVRVUlSRUQgb3IKICAgICAgICAgICAgc2VsZi5hc3NlcnRfZmluZ2VycHJpbnQgaXMgbm90IE5vbmUKICAgICAgICApCgoKZGVmIF9tYXRjaF9ob3N0bmFtZShjZXJ0LCBhc3NlcnRlZF9ob3N0bmFtZSk6CiAgICB0cnk6CiAgICAgICAgbWF0Y2hfaG9zdG5hbWUoY2VydCwgYXNzZXJ0ZWRfaG9zdG5hbWUpCiAgICBleGNlcHQgQ2VydGlmaWNhdGVFcnJvciBhcyBlOgogICAgICAgIGxvZy5lcnJvcigKICAgICAgICAgICAgJ0NlcnRpZmljYXRlIGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgaG9zdG5hbWU6ICVzLiAnCiAgICAgICAgICAgICdDZXJ0aWZpY2F0ZTogJXMnLCBhc3NlcnRlZF9ob3N0bmFtZSwgY2VydAogICAgICAgICkKICAgICAgICAjIEFkZCBjZXJ0IHRvIGV4Y2VwdGlvbiBhbmQgcmVyYWlzZSBzbyBjbGllbnQgY29kZSBjYW4gaW5zcGVjdAogICAgICAgICMgdGhlIGNlcnQgd2hlbiBjYXRjaGluZyB0aGUgZXhjZXB0aW9uLCBpZiB0aGV5IHdhbnQgdG8KICAgICAgICBlLl9wZWVyX2NlcnQgPSBjZXJ0CiAgICAgICAgcmFpc2UKCgppZiBzc2w6CiAgICAjIE1ha2UgYSBjb3B5IGZvciB0ZXN0aW5nLgogICAgVW52ZXJpZmllZEhUVFBTQ29ubmVjdGlvbiA9IEhUVFBTQ29ubmVjdGlvbgogICAgSFRUUFNDb25uZWN0aW9uID0gVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb24KZWxzZToKICAgIEhUVFBTQ29ubmVjdGlvbiA9IER1bW15Q29ubmVjdGlvbgpQSwMEFAAAAAAAAAAhABcaHG8eigAAHooAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29ubmVjdGlvbnBvb2wucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgZXJybm8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwppbXBvcnQgd2FybmluZ3MKCmZyb20gc29ja2V0IGltcG9ydCBlcnJvciBhcyBTb2NrZXRFcnJvciwgdGltZW91dCBhcyBTb2NrZXRUaW1lb3V0CmltcG9ydCBzb2NrZXQKCgpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBDbG9zZWRQb29sRXJyb3IsCiAgICBQcm90b2NvbEVycm9yLAogICAgRW1wdHlQb29sRXJyb3IsCiAgICBIZWFkZXJQYXJzaW5nRXJyb3IsCiAgICBIb3N0Q2hhbmdlZEVycm9yLAogICAgTG9jYXRpb25WYWx1ZUVycm9yLAogICAgTWF4UmV0cnlFcnJvciwKICAgIFByb3h5RXJyb3IsCiAgICBSZWFkVGltZW91dEVycm9yLAogICAgU1NMRXJyb3IsCiAgICBUaW1lb3V0RXJyb3IsCiAgICBJbnNlY3VyZVJlcXVlc3RXYXJuaW5nLAogICAgTmV3Q29ubmVjdGlvbkVycm9yLAopCmZyb20gLnBhY2thZ2VzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvcgpmcm9tIC5wYWNrYWdlcyBpbXBvcnQgc2l4CmZyb20gLnBhY2thZ2VzLnNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKZnJvbSAuY29ubmVjdGlvbiBpbXBvcnQgKAogICAgcG9ydF9ieV9zY2hlbWUsCiAgICBEdW1teUNvbm5lY3Rpb24sCiAgICBIVFRQQ29ubmVjdGlvbiwgSFRUUFNDb25uZWN0aW9uLCBWZXJpZmllZEhUVFBTQ29ubmVjdGlvbiwKICAgIEhUVFBFeGNlcHRpb24sIEJhc2VTU0xFcnJvciwKKQpmcm9tIC5yZXF1ZXN0IGltcG9ydCBSZXF1ZXN0TWV0aG9kcwpmcm9tIC5yZXNwb25zZSBpbXBvcnQgSFRUUFJlc3BvbnNlCgpmcm9tIC51dGlsLmNvbm5lY3Rpb24gaW1wb3J0IGlzX2Nvbm5lY3Rpb25fZHJvcHBlZApmcm9tIC51dGlsLnJlcXVlc3QgaW1wb3J0IHNldF9maWxlX3Bvc2l0aW9uCmZyb20gLnV0aWwucmVzcG9uc2UgaW1wb3J0IGFzc2VydF9oZWFkZXJfcGFyc2luZwpmcm9tIC51dGlsLnJldHJ5IGltcG9ydCBSZXRyeQpmcm9tIC51dGlsLnRpbWVvdXQgaW1wb3J0IFRpbWVvdXQKZnJvbSAudXRpbC51cmwgaW1wb3J0IGdldF9ob3N0LCBVcmwKCgppZiBzaXguUFkyOgogICAgIyBRdWV1ZSBpcyBpbXBvcnRlZCBmb3Igc2lkZSBlZmZlY3RzIG9uIE1TIFdpbmRvd3MKICAgIGltcG9ydCBRdWV1ZSBhcyBfdW51c2VkX21vZHVsZV9RdWV1ZSAgIyBub3FhOiBGNDAxCgp4cmFuZ2UgPSBzaXgubW92ZXMueHJhbmdlCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCl9EZWZhdWx0ID0gb2JqZWN0KCkKCgojIFBvb2wgb2JqZWN0cwpjbGFzcyBDb25uZWN0aW9uUG9vbChvYmplY3QpOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciBhbGwgY29ubmVjdGlvbiBwb29scywgc3VjaCBhcwogICAgOmNsYXNzOmAuSFRUUENvbm5lY3Rpb25Qb29sYCBhbmQgOmNsYXNzOmAuSFRUUFNDb25uZWN0aW9uUG9vbGAuCiAgICAiIiIKCiAgICBzY2hlbWUgPSBOb25lCiAgICBRdWV1ZUNscyA9IHF1ZXVlLkxpZm9RdWV1ZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUpOgogICAgICAgIGlmIG5vdCBob3N0OgogICAgICAgICAgICByYWlzZSBMb2NhdGlvblZhbHVlRXJyb3IoIk5vIGhvc3Qgc3BlY2lmaWVkLiIpCgogICAgICAgIHNlbGYuaG9zdCA9IF9pcHY2X2hvc3QoaG9zdCkubG93ZXIoKQogICAgICAgIHNlbGYuX3Byb3h5X2hvc3QgPSBob3N0Lmxvd2VyKCkKICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclcyhob3N0PSVyLCBwb3J0PSVyKScgJSAodHlwZShzZWxmKS5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3QsIHNlbGYucG9ydCkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgogICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICMgUmV0dXJuIEZhbHNlIHRvIHJlLXJhaXNlIGFueSBwb3RlbnRpYWwgZXhjZXB0aW9ucwogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbG9zZSBhbGwgcG9vbGVkIGNvbm5lY3Rpb25zIGFuZCBkaXNhYmxlIHRoZSBwb29sLgogICAgICAgICIiIgogICAgICAgIHBhc3MKCgojIFRoaXMgaXMgdGFrZW4gZnJvbSBodHRwOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL2ZpbGUvN2FhYmE3MjFlYmMwL0xpYi9zb2NrZXQucHkjbDI1MgpfYmxvY2tpbmdfZXJybm9zID0gc2V0KFtlcnJuby5FQUdBSU4sIGVycm5vLkVXT1VMREJMT0NLXSkKCgpjbGFzcyBIVFRQQ29ubmVjdGlvblBvb2woQ29ubmVjdGlvblBvb2wsIFJlcXVlc3RNZXRob2RzKToKICAgICIiIgogICAgVGhyZWFkLXNhZmUgY29ubmVjdGlvbiBwb29sIGZvciBvbmUgaG9zdC4KCiAgICA6cGFyYW0gaG9zdDoKICAgICAgICBIb3N0IHVzZWQgZm9yIHRoaXMgSFRUUCBDb25uZWN0aW9uIChlLmcuICJsb2NhbGhvc3QiKSwgcGFzc2VkIGludG8KICAgICAgICA6Y2xhc3M6YGh0dHBsaWIuSFRUUENvbm5lY3Rpb25gLgoKICAgIDpwYXJhbSBwb3J0OgogICAgICAgIFBvcnQgdXNlZCBmb3IgdGhpcyBIVFRQIENvbm5lY3Rpb24gKE5vbmUgaXMgZXF1aXZhbGVudCB0byA4MCksIHBhc3NlZAogICAgICAgIGludG8gOmNsYXNzOmBodHRwbGliLkhUVFBDb25uZWN0aW9uYC4KCiAgICA6cGFyYW0gc3RyaWN0OgogICAgICAgIENhdXNlcyBCYWRTdGF0dXNMaW5lIHRvIGJlIHJhaXNlZCBpZiB0aGUgc3RhdHVzIGxpbmUgY2FuJ3QgYmUgcGFyc2VkCiAgICAgICAgYXMgYSB2YWxpZCBIVFRQLzEuMCBvciAxLjEgc3RhdHVzIGxpbmUsIHBhc3NlZCBpbnRvCiAgICAgICAgOmNsYXNzOmBodHRwbGliLkhUVFBDb25uZWN0aW9uYC4KCiAgICAgICAgLi4gbm90ZTo6CiAgICAgICAgICAgT25seSB3b3JrcyBpbiBQeXRob24gMi4gVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpbiBQeXRob24gMy4KCiAgICA6cGFyYW0gdGltZW91dDoKICAgICAgICBTb2NrZXQgdGltZW91dCBpbiBzZWNvbmRzIGZvciBlYWNoIGluZGl2aWR1YWwgY29ubmVjdGlvbi4gVGhpcyBjYW4KICAgICAgICBiZSBhIGZsb2F0IG9yIGludGVnZXIsIHdoaWNoIHNldHMgdGhlIHRpbWVvdXQgZm9yIHRoZSBIVFRQIHJlcXVlc3QsCiAgICAgICAgb3IgYW4gaW5zdGFuY2Ugb2YgOmNsYXNzOmB1cmxsaWIzLnV0aWwuVGltZW91dGAgd2hpY2ggZ2l2ZXMgeW91IG1vcmUKICAgICAgICBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHJlcXVlc3QgdGltZW91dHMuIEFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMKICAgICAgICBiZWVuIHBhcnNlZCwgdGhpcyBpcyBhbHdheXMgYSBgdXJsbGliMy51dGlsLlRpbWVvdXRgIG9iamVjdC4KCiAgICA6cGFyYW0gbWF4c2l6ZToKICAgICAgICBOdW1iZXIgb2YgY29ubmVjdGlvbnMgdG8gc2F2ZSB0aGF0IGNhbiBiZSByZXVzZWQuIE1vcmUgdGhhbiAxIGlzIHVzZWZ1bAogICAgICAgIGluIG11bHRpdGhyZWFkZWQgc2l0dWF0aW9ucy4gSWYgYGBibG9ja2BgIGlzIHNldCB0byBGYWxzZSwgbW9yZQogICAgICAgIGNvbm5lY3Rpb25zIHdpbGwgYmUgY3JlYXRlZCBidXQgdGhleSB3aWxsIG5vdCBiZSBzYXZlZCBvbmNlIHRoZXkndmUKICAgICAgICBiZWVuIHVzZWQuCgogICAgOnBhcmFtIGJsb2NrOgogICAgICAgIElmIHNldCB0byBUcnVlLCBubyBtb3JlIHRoYW4gYGBtYXhzaXplYGAgY29ubmVjdGlvbnMgd2lsbCBiZSB1c2VkIGF0CiAgICAgICAgYSB0aW1lLiBXaGVuIG5vIGZyZWUgY29ubmVjdGlvbnMgYXJlIGF2YWlsYWJsZSwgdGhlIGNhbGwgd2lsbCBibG9jawogICAgICAgIHVudGlsIGEgY29ubmVjdGlvbiBoYXMgYmVlbiByZWxlYXNlZC4gVGhpcyBpcyBhIHVzZWZ1bCBzaWRlIGVmZmVjdCBmb3IKICAgICAgICBwYXJ0aWN1bGFyIG11bHRpdGhyZWFkZWQgc2l0dWF0aW9ucyB3aGVyZSBvbmUgZG9lcyBub3Qgd2FudCB0byB1c2UgbW9yZQogICAgICAgIHRoYW4gbWF4c2l6ZSBjb25uZWN0aW9ucyBwZXIgaG9zdCB0byBwcmV2ZW50IGZsb29kaW5nLgoKICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGFsbCByZXF1ZXN0cywgdW5sZXNzIG90aGVyIGhlYWRlcnMgYXJlIGdpdmVuCiAgICAgICAgZXhwbGljaXRseS4KCiAgICA6cGFyYW0gcmV0cmllczoKICAgICAgICBSZXRyeSBjb25maWd1cmF0aW9uIHRvIHVzZSBieSBkZWZhdWx0IHdpdGggcmVxdWVzdHMgaW4gdGhpcyBwb29sLgoKICAgIDpwYXJhbSBfcHJveHk6CiAgICAgICAgUGFyc2VkIHByb3h5IFVSTCwgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBpbnN0ZWFkLCBzZWUKICAgICAgICA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuUHJveHlNYW5hZ2VyYCIKCiAgICA6cGFyYW0gX3Byb3h5X2hlYWRlcnM6CiAgICAgICAgQSBkaWN0aW9uYXJ5IHdpdGggcHJveHkgaGVhZGVycywgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LAogICAgICAgIGluc3RlYWQsIHNlZSA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuUHJveHlNYW5hZ2VyYCIKCiAgICA6cGFyYW0gXFwqKmNvbm5fa3c6CiAgICAgICAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNyZWF0ZSBmcmVzaCA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbi5IVFRQQ29ubmVjdGlvbmAsCiAgICAgICAgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb24uSFRUUFNDb25uZWN0aW9uYCBpbnN0YW5jZXMuCiAgICAiIiIKCiAgICBzY2hlbWUgPSAnaHR0cCcKICAgIENvbm5lY3Rpb25DbHMgPSBIVFRQQ29ubmVjdGlvbgogICAgUmVzcG9uc2VDbHMgPSBIVFRQUmVzcG9uc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBzdHJpY3Q9RmFsc2UsCiAgICAgICAgICAgICAgICAgdGltZW91dD1UaW1lb3V0LkRFRkFVTFRfVElNRU9VVCwgbWF4c2l6ZT0xLCBibG9jaz1GYWxzZSwKICAgICAgICAgICAgICAgICBoZWFkZXJzPU5vbmUsIHJldHJpZXM9Tm9uZSwKICAgICAgICAgICAgICAgICBfcHJveHk9Tm9uZSwgX3Byb3h5X2hlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgICAqKmNvbm5fa3cpOgogICAgICAgIENvbm5lY3Rpb25Qb29sLl9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQpCiAgICAgICAgUmVxdWVzdE1ldGhvZHMuX19pbml0X18oc2VsZiwgaGVhZGVycykKCiAgICAgICAgc2VsZi5zdHJpY3QgPSBzdHJpY3QKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGltZW91dCwgVGltZW91dCk6CiAgICAgICAgICAgIHRpbWVvdXQgPSBUaW1lb3V0LmZyb21fZmxvYXQodGltZW91dCkKCiAgICAgICAgaWYgcmV0cmllcyBpcyBOb25lOgogICAgICAgICAgICByZXRyaWVzID0gUmV0cnkuREVGQVVMVAoKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CiAgICAgICAgc2VsZi5yZXRyaWVzID0gcmV0cmllcwoKICAgICAgICBzZWxmLnBvb2wgPSBzZWxmLlF1ZXVlQ2xzKG1heHNpemUpCiAgICAgICAgc2VsZi5ibG9jayA9IGJsb2NrCgogICAgICAgIHNlbGYucHJveHkgPSBfcHJveHkKICAgICAgICBzZWxmLnByb3h5X2hlYWRlcnMgPSBfcHJveHlfaGVhZGVycyBvciB7fQoKICAgICAgICAjIEZpbGwgdGhlIHF1ZXVlIHVwIHNvIHRoYXQgZG9pbmcgZ2V0KCkgb24gaXQgd2lsbCBibG9jayBwcm9wZXJseQogICAgICAgIGZvciBfIGluIHhyYW5nZShtYXhzaXplKToKICAgICAgICAgICAgc2VsZi5wb29sLnB1dChOb25lKQoKICAgICAgICAjIFRoZXNlIGFyZSBtb3N0bHkgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyBwdXJwb3Nlcy4KICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucyA9IDAKICAgICAgICBzZWxmLm51bV9yZXF1ZXN0cyA9IDAKICAgICAgICBzZWxmLmNvbm5fa3cgPSBjb25uX2t3CgogICAgICAgIGlmIHNlbGYucHJveHk6CiAgICAgICAgICAgICMgRW5hYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtIGZvciBwcm94aWVzLCB0byBhdm9pZCBwYWNrZXQgZnJhZ21lbnRhdGlvbi4KICAgICAgICAgICAgIyBXZSBjYW5ub3Qga25vdyBpZiB0aGUgdXNlciBoYXMgYWRkZWQgZGVmYXVsdCBzb2NrZXQgb3B0aW9ucywgc28gd2UgY2Fubm90IHJlcGxhY2UgdGhlCiAgICAgICAgICAgICMgbGlzdC4KICAgICAgICAgICAgc2VsZi5jb25uX2t3LnNldGRlZmF1bHQoJ3NvY2tldF9vcHRpb25zJywgW10pCgogICAgZGVmIF9uZXdfY29ubihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBmcmVzaCA6Y2xhc3M6YEhUVFBDb25uZWN0aW9uYC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucyArPSAxCiAgICAgICAgbG9nLmRlYnVnKCJTdGFydGluZyBuZXcgSFRUUCBjb25uZWN0aW9uICglZCk6ICVzIiwKICAgICAgICAgICAgICAgICAgc2VsZi5udW1fY29ubmVjdGlvbnMsIHNlbGYuaG9zdCkKCiAgICAgICAgY29ubiA9IHNlbGYuQ29ubmVjdGlvbkNscyhob3N0PXNlbGYuaG9zdCwgcG9ydD1zZWxmLnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYudGltZW91dC5jb25uZWN0X3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q9c2VsZi5zdHJpY3QsICoqc2VsZi5jb25uX2t3KQogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIF9nZXRfY29ubihzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIGNvbm5lY3Rpb24uIFdpbGwgcmV0dXJuIGEgcG9vbGVkIGNvbm5lY3Rpb24gaWYgb25lIGlzIGF2YWlsYWJsZS4KCiAgICAgICAgSWYgbm8gY29ubmVjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgOnByb3A6YC5ibG9ja2AgaXMgYGBGYWxzZWBgLCB0aGVuIGEKICAgICAgICBmcmVzaCBjb25uZWN0aW9uIGlzIHJldHVybmVkLgoKICAgICAgICA6cGFyYW0gdGltZW91dDoKICAgICAgICAgICAgU2Vjb25kcyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgYW5kIHJhaXNpbmcKICAgICAgICAgICAgOmNsYXNzOmB1cmxsaWIzLmV4Y2VwdGlvbnMuRW1wdHlQb29sRXJyb3JgIGlmIHRoZSBwb29sIGlzIGVtcHR5IGFuZAogICAgICAgICAgICA6cHJvcDpgLmJsb2NrYCBpcyBgYFRydWVgYC4KICAgICAgICAiIiIKICAgICAgICBjb25uID0gTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubiA9IHNlbGYucG9vbC5nZXQoYmxvY2s9c2VsZi5ibG9jaywgdGltZW91dD10aW1lb3V0KQoKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIHNlbGYucG9vbCBpcyBOb25lCiAgICAgICAgICAgIHJhaXNlIENsb3NlZFBvb2xFcnJvcihzZWxmLCAiUG9vbCBpcyBjbG9zZWQuIikKCiAgICAgICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgogICAgICAgICAgICBpZiBzZWxmLmJsb2NrOgogICAgICAgICAgICAgICAgcmFpc2UgRW1wdHlQb29sRXJyb3Ioc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb29sIHJlYWNoZWQgbWF4aW11bSBzaXplIGFuZCBubyBtb3JlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25uZWN0aW9ucyBhcmUgYWxsb3dlZC4iKQogICAgICAgICAgICBwYXNzICAjIE9oIHdlbGwsIHdlJ2xsIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHRoZW4KCiAgICAgICAgIyBJZiB0aGlzIGlzIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLCBjaGVjayBpZiBpdCBnb3QgZGlzY29ubmVjdGVkCiAgICAgICAgaWYgY29ubiBhbmQgaXNfY29ubmVjdGlvbl9kcm9wcGVkKGNvbm4pOgogICAgICAgICAgICBsb2cuZGVidWcoIlJlc2V0dGluZyBkcm9wcGVkIGNvbm5lY3Rpb246ICVzIiwgc2VsZi5ob3N0KQogICAgICAgICAgICBjb25uLmNsb3NlKCkKICAgICAgICAgICAgaWYgZ2V0YXR0cihjb25uLCAnYXV0b19vcGVuJywgMSkgPT0gMDoKICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhIHByb3hpZWQgY29ubmVjdGlvbiB0aGF0IGhhcyBiZWVuIG11dGF0ZWQgYnkKICAgICAgICAgICAgICAgICMgaHR0cGxpYi5fdHVubmVsKCkgYW5kIGNhbm5vdCBiZSByZXVzZWQgKHNpbmNlIGl0IHdvdWxkCiAgICAgICAgICAgICAgICAjIGF0dGVtcHQgdG8gYnlwYXNzIHRoZSBwcm94eSkKICAgICAgICAgICAgICAgIGNvbm4gPSBOb25lCgogICAgICAgIHJldHVybiBjb25uIG9yIHNlbGYuX25ld19jb25uKCkKCiAgICBkZWYgX3B1dF9jb25uKHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIFB1dCBhIGNvbm5lY3Rpb24gYmFjayBpbnRvIHRoZSBwb29sLgoKICAgICAgICA6cGFyYW0gY29ubjoKICAgICAgICAgICAgQ29ubmVjdGlvbiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGhvc3QgYW5kIHBvcnQgYXMgcmV0dXJuZWQgYnkKICAgICAgICAgICAgOm1ldGg6YC5fbmV3X2Nvbm5gIG9yIDptZXRoOmAuX2dldF9jb25uYC4KCiAgICAgICAgSWYgdGhlIHBvb2wgaXMgYWxyZWFkeSBmdWxsLCB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgYW5kIGRpc2NhcmRlZAogICAgICAgIGJlY2F1c2Ugd2UgZXhjZWVkZWQgbWF4c2l6ZS4gSWYgY29ubmVjdGlvbnMgYXJlIGRpc2NhcmRlZCBmcmVxdWVudGx5LAogICAgICAgIHRoZW4gbWF4c2l6ZSBzaG91bGQgYmUgaW5jcmVhc2VkLgoKICAgICAgICBJZiB0aGUgcG9vbCBpcyBjbG9zZWQsIHRoZW4gdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYW5kIGRpc2NhcmRlZC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucG9vbC5wdXQoY29ubiwgYmxvY2s9RmFsc2UpCiAgICAgICAgICAgIHJldHVybiAgIyBFdmVyeXRoaW5nIGlzIGRhbmR5LCBkb25lLgogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBzZWxmLnBvb2wgaXMgTm9uZS4KICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdCBxdWV1ZS5GdWxsOgogICAgICAgICAgICAjIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBpZiBzZWxmLmJsb2NrID09IFRydWUKICAgICAgICAgICAgbG9nLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBwb29sIGlzIGZ1bGwsIGRpc2NhcmRpbmcgY29ubmVjdGlvbjogJXMiLAogICAgICAgICAgICAgICAgc2VsZi5ob3N0KQoKICAgICAgICAjIENvbm5lY3Rpb24gbmV2ZXIgZ290IHB1dCBiYWNrIGludG8gdGhlIHBvb2wsIGNsb3NlIGl0LgogICAgICAgIGlmIGNvbm46CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGRlZiBfdmFsaWRhdGVfY29ubihzZWxmLCBjb25uKToKICAgICAgICAiIiIKICAgICAgICBDYWxsZWQgcmlnaHQgYmVmb3JlIGEgcmVxdWVzdCBpcyBtYWRlLCBhZnRlciB0aGUgc29ja2V0IGlzIGNyZWF0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfcHJlcGFyZV9wcm94eShzZWxmLCBjb25uKToKICAgICAgICAjIE5vdGhpbmcgdG8gZG8gZm9yIEhUVFAgY29ubmVjdGlvbnMuCiAgICAgICAgcGFzcwoKICAgIGRlZiBfZ2V0X3RpbWVvdXQoc2VsZiwgdGltZW91dCk6CiAgICAgICAgIiIiIEhlbHBlciB0aGF0IGFsd2F5cyByZXR1cm5zIGEgOmNsYXNzOmB1cmxsaWIzLnV0aWwuVGltZW91dGAgIiIiCiAgICAgICAgaWYgdGltZW91dCBpcyBfRGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYudGltZW91dC5jbG9uZSgpCgogICAgICAgIGlmIGlzaW5zdGFuY2UodGltZW91dCwgVGltZW91dCk6CiAgICAgICAgICAgIHJldHVybiB0aW1lb3V0LmNsb25lKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFVzZXIgcGFzc2VkIHVzIGFuIGludC9mbG9hdC4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksCiAgICAgICAgICAgICMgY2FuIGJlIHJlbW92ZWQgbGF0ZXIKICAgICAgICAgICAgcmV0dXJuIFRpbWVvdXQuZnJvbV9mbG9hdCh0aW1lb3V0KQoKICAgIGRlZiBfcmFpc2VfdGltZW91dChzZWxmLCBlcnIsIHVybCwgdGltZW91dF92YWx1ZSk6CiAgICAgICAgIiIiSXMgdGhlIGVycm9yIGFjdHVhbGx5IGEgdGltZW91dD8gV2lsbCByYWlzZSBhIFJlYWRUaW1lb3V0IG9yIHBhc3MiIiIKCiAgICAgICAgaWYgaXNpbnN0YW5jZShlcnIsIFNvY2tldFRpbWVvdXQpOgogICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKHNlbGYsIHVybCwgIlJlYWQgdGltZWQgb3V0LiAocmVhZCB0aW1lb3V0PSVzKSIgJSB0aW1lb3V0X3ZhbHVlKQoKICAgICAgICAjIFNlZSB0aGUgYWJvdmUgY29tbWVudCBhYm91dCBFQUdBSU4gaW4gUHl0aG9uIDMuIEluIFB5dGhvbiAyIHdlIGhhdmUKICAgICAgICAjIHRvIHNwZWNpZmljYWxseSBjYXRjaCBpdCBhbmQgdGhyb3cgdGhlIHRpbWVvdXQgZXJyb3IKICAgICAgICBpZiBoYXNhdHRyKGVyciwgJ2Vycm5vJykgYW5kIGVyci5lcnJubyBpbiBfYmxvY2tpbmdfZXJybm9zOgogICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKHNlbGYsIHVybCwgIlJlYWQgdGltZWQgb3V0LiAocmVhZCB0aW1lb3V0PSVzKSIgJSB0aW1lb3V0X3ZhbHVlKQoKICAgICAgICAjIENhdGNoIHBvc3NpYmxlIHJlYWQgdGltZW91dHMgdGhyb3duIGFzIFNTTCBlcnJvcnMuIElmIG5vdCB0aGUKICAgICAgICAjIGNhc2UsIHJldGhyb3cgdGhlIG9yaWdpbmFsLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvZjoKICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDI3MgogICAgICAgIGlmICd0aW1lZCBvdXQnIGluIHN0cihlcnIpIG9yICdkaWQgbm90IGNvbXBsZXRlIChyZWFkKScgaW4gc3RyKGVycik6ICAjIFB5dGhvbiAyLjYKICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXRFcnJvcihzZWxmLCB1cmwsICJSZWFkIHRpbWVkIG91dC4gKHJlYWQgdGltZW91dD0lcykiICUgdGltZW91dF92YWx1ZSkKCiAgICBkZWYgX21ha2VfcmVxdWVzdChzZWxmLCBjb25uLCBtZXRob2QsIHVybCwgdGltZW91dD1fRGVmYXVsdCwgY2h1bmtlZD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICoqaHR0cGxpYl9yZXF1ZXN0X2t3KToKICAgICAgICAiIiIKICAgICAgICBQZXJmb3JtIGEgcmVxdWVzdCBvbiBhIGdpdmVuIHVybGxpYiBjb25uZWN0aW9uIG9iamVjdCB0YWtlbiBmcm9tIG91cgogICAgICAgIHBvb2wuCgogICAgICAgIDpwYXJhbSBjb25uOgogICAgICAgICAgICBhIGNvbm5lY3Rpb24gZnJvbSBvbmUgb2Ygb3VyIGNvbm5lY3Rpb24gcG9vbHMKCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6CiAgICAgICAgICAgIFNvY2tldCB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHRoZSByZXF1ZXN0LiBUaGlzIGNhbiBiZSBhCiAgICAgICAgICAgIGZsb2F0IG9yIGludGVnZXIsIHdoaWNoIHdpbGwgc2V0IHRoZSBzYW1lIHRpbWVvdXQgdmFsdWUgZm9yCiAgICAgICAgICAgIHRoZSBzb2NrZXQgY29ubmVjdCBhbmQgdGhlIHNvY2tldCByZWFkLCBvciBhbiBpbnN0YW5jZSBvZgogICAgICAgICAgICA6Y2xhc3M6YHVybGxpYjMudXRpbC5UaW1lb3V0YCwgd2hpY2ggZ2l2ZXMgeW91IG1vcmUgZmluZS1ncmFpbmVkCiAgICAgICAgICAgIGNvbnRyb2wgb3ZlciB5b3VyIHRpbWVvdXRzLgogICAgICAgICIiIgogICAgICAgIHNlbGYubnVtX3JlcXVlc3RzICs9IDEKCiAgICAgICAgdGltZW91dF9vYmogPSBzZWxmLl9nZXRfdGltZW91dCh0aW1lb3V0KQogICAgICAgIHRpbWVvdXRfb2JqLnN0YXJ0X2Nvbm5lY3QoKQogICAgICAgIGNvbm4udGltZW91dCA9IHRpbWVvdXRfb2JqLmNvbm5lY3RfdGltZW91dAoKICAgICAgICAjIFRyaWdnZXIgYW55IGV4dHJhIHZhbGlkYXRpb24gd2UgbmVlZCB0byBkby4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2Nvbm4oY29ubikKICAgICAgICBleGNlcHQgKFNvY2tldFRpbWVvdXQsIEJhc2VTU0xFcnJvcikgYXMgZToKICAgICAgICAgICAgIyBQeTIgcmFpc2VzIHRoaXMgYXMgYSBCYXNlU1NMRXJyb3IsIFB5MyByYWlzZXMgaXQgYXMgc29ja2V0IHRpbWVvdXQuCiAgICAgICAgICAgIHNlbGYuX3JhaXNlX3RpbWVvdXQoZXJyPWUsIHVybD11cmwsIHRpbWVvdXRfdmFsdWU9Y29ubi50aW1lb3V0KQogICAgICAgICAgICByYWlzZQoKICAgICAgICAjIGNvbm4ucmVxdWVzdCgpIGNhbGxzIGh0dHBsaWIuKi5yZXF1ZXN0LCBub3QgdGhlIG1ldGhvZCBpbgogICAgICAgICMgdXJsbGliMy5yZXF1ZXN0LiBJdCBhbHNvIGNhbGxzIG1ha2VmaWxlIChyZWN2KSBvbiB0aGUgc29ja2V0LgogICAgICAgIGlmIGNodW5rZWQ6CiAgICAgICAgICAgIGNvbm4ucmVxdWVzdF9jaHVua2VkKG1ldGhvZCwgdXJsLCAqKmh0dHBsaWJfcmVxdWVzdF9rdykKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLnJlcXVlc3QobWV0aG9kLCB1cmwsICoqaHR0cGxpYl9yZXF1ZXN0X2t3KQoKICAgICAgICAjIFJlc2V0IHRoZSB0aW1lb3V0IGZvciB0aGUgcmVjdigpIG9uIHRoZSBzb2NrZXQKICAgICAgICByZWFkX3RpbWVvdXQgPSB0aW1lb3V0X29iai5yZWFkX3RpbWVvdXQKCiAgICAgICAgIyBBcHAgRW5naW5lIGRvZXNuJ3QgaGF2ZSBhIHNvY2sgYXR0cgogICAgICAgIGlmIGdldGF0dHIoY29ubiwgJ3NvY2snLCBOb25lKToKICAgICAgICAgICAgIyBJbiBQeXRob24gMyBzb2NrZXQucHkgd2lsbCBjYXRjaCBFQUdBSU4gYW5kIHJldHVybiBOb25lIHdoZW4geW91CiAgICAgICAgICAgICMgdHJ5IGFuZCByZWFkIGludG8gdGhlIGZpbGUgcG9pbnRlciBjcmVhdGVkIGJ5IGh0dHAuY2xpZW50LCB3aGljaAogICAgICAgICAgICAjIGluc3RlYWQgcmFpc2VzIGEgQmFkU3RhdHVzTGluZSBleGNlcHRpb24uIEluc3RlYWQgb2YgY2F0Y2hpbmcKICAgICAgICAgICAgIyB0aGUgZXhjZXB0aW9uIGFuZCBhc3N1bWluZyBhbGwgQmFkU3RhdHVzTGluZSBleGNlcHRpb25zIGFyZSByZWFkCiAgICAgICAgICAgICMgdGltZW91dHMsIGNoZWNrIGZvciBhIHplcm8gdGltZW91dCBiZWZvcmUgbWFraW5nIHRoZSByZXF1ZXN0LgogICAgICAgICAgICBpZiByZWFkX3RpbWVvdXQgPT0gMDoKICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgc2VsZiwgdXJsLCAiUmVhZCB0aW1lZCBvdXQuIChyZWFkIHRpbWVvdXQ9JXMpIiAlIHJlYWRfdGltZW91dCkKICAgICAgICAgICAgaWYgcmVhZF90aW1lb3V0IGlzIFRpbWVvdXQuREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICAgICAgY29ubi5zb2NrLnNldHRpbWVvdXQoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkpCiAgICAgICAgICAgIGVsc2U6ICAjIE5vbmUgb3IgYSB2YWx1ZQogICAgICAgICAgICAgICAgY29ubi5zb2NrLnNldHRpbWVvdXQocmVhZF90aW1lb3V0KQoKICAgICAgICAjIFJlY2VpdmUgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcgogICAgICAgIHRyeToKICAgICAgICAgICAgdHJ5OiAgIyBQeXRob24gMi43LCB1c2UgYnVmZmVyaW5nIG9mIEhUVFAgcmVzcG9uc2VzCiAgICAgICAgICAgICAgICBodHRwbGliX3Jlc3BvbnNlID0gY29ubi5nZXRyZXNwb25zZShidWZmZXJpbmc9VHJ1ZSkKICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogICMgUHl0aG9uIDIuNiBhbmQgb2xkZXIsIFB5dGhvbiAzCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaHR0cGxpYl9yZXNwb25zZSA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBUeXBlRXJyb3IgZnJvbSB0aGUgZXhjZXB0aW9uIGNoYWluIGluIFB5dGhvbiAzOwogICAgICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIGl0IGxvb2tzIGxpa2UgYSBwcm9ncmFtbWluZyBlcnJvciB3YXMgdGhlIGNhdXNlLgogICAgICAgICAgICAgICAgICAgIHNpeC5yYWlzZV9mcm9tKGUsIE5vbmUpCiAgICAgICAgZXhjZXB0IChTb2NrZXRUaW1lb3V0LCBCYXNlU1NMRXJyb3IsIFNvY2tldEVycm9yKSBhcyBlOgogICAgICAgICAgICBzZWxmLl9yYWlzZV90aW1lb3V0KGVycj1lLCB1cmw9dXJsLCB0aW1lb3V0X3ZhbHVlPXJlYWRfdGltZW91dCkKICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgIyBBcHBFbmdpbmUgZG9lc24ndCBoYXZlIGEgdmVyc2lvbiBhdHRyLgogICAgICAgIGh0dHBfdmVyc2lvbiA9IGdldGF0dHIoY29ubiwgJ19odHRwX3Zzbl9zdHInLCAnSFRUUC8/JykKICAgICAgICBsb2cuZGVidWcoIiVzOi8vJXM6JXMgXCIlcyAlcyAlc1wiICVzICVzIiwgc2VsZi5zY2hlbWUsIHNlbGYuaG9zdCwgc2VsZi5wb3J0LAogICAgICAgICAgICAgICAgICBtZXRob2QsIHVybCwgaHR0cF92ZXJzaW9uLCBodHRwbGliX3Jlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgaHR0cGxpYl9yZXNwb25zZS5sZW5ndGgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgYXNzZXJ0X2hlYWRlcl9wYXJzaW5nKGh0dHBsaWJfcmVzcG9uc2UubXNnKQogICAgICAgIGV4Y2VwdCAoSGVhZGVyUGFyc2luZ0Vycm9yLCBUeXBlRXJyb3IpIGFzIGhwZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICAgICAgICAgIGxvZy53YXJuaW5nKAogICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBoZWFkZXJzICh1cmw9JXMpOiAlcycsCiAgICAgICAgICAgICAgICBzZWxmLl9hYnNvbHV0ZV91cmwodXJsKSwgaHBlLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICByZXR1cm4gaHR0cGxpYl9yZXNwb25zZQoKICAgIGRlZiBfYWJzb2x1dGVfdXJsKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBVcmwoc2NoZW1lPXNlbGYuc2NoZW1lLCBob3N0PXNlbGYuaG9zdCwgcG9ydD1zZWxmLnBvcnQsIHBhdGg9cGF0aCkudXJsCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsb3NlIGFsbCBwb29sZWQgY29ubmVjdGlvbnMgYW5kIGRpc2FibGUgdGhlIHBvb2wuCiAgICAgICAgIiIiCiAgICAgICAgIyBEaXNhYmxlIGFjY2VzcyB0byB0aGUgcG9vbAogICAgICAgIG9sZF9wb29sLCBzZWxmLnBvb2wgPSBzZWxmLnBvb2wsIE5vbmUKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgY29ubiA9IG9sZF9wb29sLmdldChibG9jaz1GYWxzZSkKICAgICAgICAgICAgICAgIGlmIGNvbm46CiAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgICAgIGV4Y2VwdCBxdWV1ZS5FbXB0eToKICAgICAgICAgICAgcGFzcyAgIyBEb25lLgoKICAgIGRlZiBpc19zYW1lX2hvc3Qoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBpZiB0aGUgZ2l2ZW4gYGB1cmxgYCBpcyBhIG1lbWJlciBvZiB0aGUgc2FtZSBob3N0IGFzIHRoaXMKICAgICAgICBjb25uZWN0aW9uIHBvb2wuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJy8nKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBUT0RPOiBBZGQgb3B0aW9uYWwgc3VwcG9ydCBmb3Igc29ja2V0LmdldGhvc3RieW5hbWUgY2hlY2tpbmcuCiAgICAgICAgc2NoZW1lLCBob3N0LCBwb3J0ID0gZ2V0X2hvc3QodXJsKQoKICAgICAgICBob3N0ID0gX2lwdjZfaG9zdChob3N0KS5sb3dlcigpCgogICAgICAgICMgVXNlIGV4cGxpY2l0IGRlZmF1bHQgcG9ydCBmb3IgY29tcGFyaXNvbiB3aGVuIG5vbmUgaXMgZ2l2ZW4KICAgICAgICBpZiBzZWxmLnBvcnQgYW5kIG5vdCBwb3J0OgogICAgICAgICAgICBwb3J0ID0gcG9ydF9ieV9zY2hlbWUuZ2V0KHNjaGVtZSkKICAgICAgICBlbGlmIG5vdCBzZWxmLnBvcnQgYW5kIHBvcnQgPT0gcG9ydF9ieV9zY2hlbWUuZ2V0KHNjaGVtZSk6CiAgICAgICAgICAgIHBvcnQgPSBOb25lCgogICAgICAgIHJldHVybiAoc2NoZW1lLCBob3N0LCBwb3J0KSA9PSAoc2VsZi5zY2hlbWUsIHNlbGYuaG9zdCwgc2VsZi5wb3J0KQoKICAgIGRlZiB1cmxvcGVuKHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz1Ob25lLAogICAgICAgICAgICAgICAgcmVkaXJlY3Q9VHJ1ZSwgYXNzZXJ0X3NhbWVfaG9zdD1UcnVlLCB0aW1lb3V0PV9EZWZhdWx0LAogICAgICAgICAgICAgICAgcG9vbF90aW1lb3V0PU5vbmUsIHJlbGVhc2VfY29ubj1Ob25lLCBjaHVua2VkPUZhbHNlLAogICAgICAgICAgICAgICAgYm9keV9wb3M9Tm9uZSwgKipyZXNwb25zZV9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgY29ubmVjdGlvbiBmcm9tIHRoZSBwb29sIGFuZCBwZXJmb3JtIGFuIEhUVFAgcmVxdWVzdC4gVGhpcyBpcyB0aGUKICAgICAgICBsb3dlc3QgbGV2ZWwgY2FsbCBmb3IgbWFraW5nIGEgcmVxdWVzdCwgc28geW91J2xsIG5lZWQgdG8gc3BlY2lmeSBhbGwKICAgICAgICB0aGUgcmF3IGRldGFpbHMuCgogICAgICAgIC4uIG5vdGU6OgoKICAgICAgICAgICBNb3JlIGNvbW1vbmx5LCBpdCdzIGFwcHJvcHJpYXRlIHRvIHVzZSBhIGNvbnZlbmllbmNlIG1ldGhvZCBwcm92aWRlZAogICAgICAgICAgIGJ5IDpjbGFzczpgLlJlcXVlc3RNZXRob2RzYCwgc3VjaCBhcyA6bWV0aDpgcmVxdWVzdGAuCgogICAgICAgIC4uIG5vdGU6OgoKICAgICAgICAgICBgcmVsZWFzZV9jb25uYCB3aWxsIG9ubHkgYmVoYXZlIGFzIGV4cGVjdGVkIGlmCiAgICAgICAgICAgYHByZWxvYWRfY29udGVudD1GYWxzZWAgYmVjYXVzZSB3ZSB3YW50IHRvIG1ha2UKICAgICAgICAgICBgcHJlbG9hZF9jb250ZW50PUZhbHNlYCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgc29tZWRheSBzb29uIHdpdGhvdXQKICAgICAgICAgICBicmVha2luZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgOnBhcmFtIG1ldGhvZDoKICAgICAgICAgICAgSFRUUCByZXF1ZXN0IG1ldGhvZCAoc3VjaCBhcyBHRVQsIFBPU1QsIFBVVCwgZXRjLikKCiAgICAgICAgOnBhcmFtIGJvZHk6CiAgICAgICAgICAgIERhdGEgdG8gc2VuZCBpbiB0aGUgcmVxdWVzdCBib2R5ICh1c2VmdWwgZm9yIGNyZWF0aW5nCiAgICAgICAgICAgIFBPU1QgcmVxdWVzdHMsIHNlZSBIVFRQQ29ubmVjdGlvblBvb2wucG9zdF91cmwgZm9yCiAgICAgICAgICAgIG1vcmUgY29udmVuaWVuY2UpLgoKICAgICAgICA6cGFyYW0gaGVhZGVyczoKICAgICAgICAgICAgRGljdGlvbmFyeSBvZiBjdXN0b20gaGVhZGVycyB0byBzZW5kLCBzdWNoIGFzIFVzZXItQWdlbnQsCiAgICAgICAgICAgIElmLU5vbmUtTWF0Y2gsIGV0Yy4gSWYgTm9uZSwgcG9vbCBoZWFkZXJzIGFyZSB1c2VkLiBJZiBwcm92aWRlZCwKICAgICAgICAgICAgdGhlc2UgaGVhZGVycyBjb21wbGV0ZWx5IHJlcGxhY2UgYW55IHBvb2wtc3BlY2lmaWMgaGVhZGVycy4KCiAgICAgICAgOnBhcmFtIHJldHJpZXM6CiAgICAgICAgICAgIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIHJldHJpZXMgdG8gYWxsb3cgYmVmb3JlIHJhaXNpbmcgYQogICAgICAgICAgICA6Y2xhc3M6YH51cmxsaWIzLmV4Y2VwdGlvbnMuTWF4UmV0cnlFcnJvcmAgZXhjZXB0aW9uLgoKICAgICAgICAgICAgUGFzcyBgYE5vbmVgYCB0byByZXRyeSB1bnRpbCB5b3UgcmVjZWl2ZSBhIHJlc3BvbnNlLiBQYXNzIGEKICAgICAgICAgICAgOmNsYXNzOmB+dXJsbGliMy51dGlsLnJldHJ5LlJldHJ5YCBvYmplY3QgZm9yIGZpbmUtZ3JhaW5lZCBjb250cm9sCiAgICAgICAgICAgIG92ZXIgZGlmZmVyZW50IHR5cGVzIG9mIHJldHJpZXMuCiAgICAgICAgICAgIFBhc3MgYW4gaW50ZWdlciBudW1iZXIgdG8gcmV0cnkgY29ubmVjdGlvbiBlcnJvcnMgdGhhdCBtYW55IHRpbWVzLAogICAgICAgICAgICBidXQgbm8gb3RoZXIgdHlwZXMgb2YgZXJyb3JzLiBQYXNzIHplcm8gdG8gbmV2ZXIgcmV0cnkuCgogICAgICAgICAgICBJZiBgYEZhbHNlYGAsIHRoZW4gcmV0cmllcyBhcmUgZGlzYWJsZWQgYW5kIGFueSBleGNlcHRpb24gaXMgcmFpc2VkCiAgICAgICAgICAgIGltbWVkaWF0ZWx5LiBBbHNvLCBpbnN0ZWFkIG9mIHJhaXNpbmcgYSBNYXhSZXRyeUVycm9yIG9uIHJlZGlyZWN0cywKICAgICAgICAgICAgdGhlIHJlZGlyZWN0IHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQuCgogICAgICAgIDp0eXBlIHJldHJpZXM6IDpjbGFzczpgfnVybGxpYjMudXRpbC5yZXRyeS5SZXRyeWAsIEZhbHNlLCBvciBhbiBpbnQuCgogICAgICAgIDpwYXJhbSByZWRpcmVjdDoKICAgICAgICAgICAgSWYgVHJ1ZSwgYXV0b21hdGljYWxseSBoYW5kbGUgcmVkaXJlY3RzIChzdGF0dXMgY29kZXMgMzAxLCAzMDIsCiAgICAgICAgICAgIDMwMywgMzA3LCAzMDgpLiBFYWNoIHJlZGlyZWN0IGNvdW50cyBhcyBhIHJldHJ5LiBEaXNhYmxpbmcgcmV0cmllcwogICAgICAgICAgICB3aWxsIGRpc2FibGUgcmVkaXJlY3QsIHRvby4KCiAgICAgICAgOnBhcmFtIGFzc2VydF9zYW1lX2hvc3Q6CiAgICAgICAgICAgIElmIGBgVHJ1ZWBgLCB3aWxsIG1ha2Ugc3VyZSB0aGF0IHRoZSBob3N0IG9mIHRoZSBwb29sIHJlcXVlc3RzIGlzCiAgICAgICAgICAgIGNvbnNpc3RlbnQgZWxzZSB3aWxsIHJhaXNlIEhvc3RDaGFuZ2VkRXJyb3IuIFdoZW4gRmFsc2UsIHlvdSBjYW4KICAgICAgICAgICAgdXNlIHRoZSBwb29sIG9uIGFuIEhUVFAgcHJveHkgYW5kIHJlcXVlc3QgZm9yZWlnbiBob3N0cy4KCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6CiAgICAgICAgICAgIElmIHNwZWNpZmllZCwgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIHRoaXMgb25lCiAgICAgICAgICAgIHJlcXVlc3QuIEl0IG1heSBiZSBhIGZsb2F0IChpbiBzZWNvbmRzKSBvciBhbiBpbnN0YW5jZSBvZgogICAgICAgICAgICA6Y2xhc3M6YHVybGxpYjMudXRpbC5UaW1lb3V0YC4KCiAgICAgICAgOnBhcmFtIHBvb2xfdGltZW91dDoKICAgICAgICAgICAgSWYgc2V0IGFuZCB0aGUgcG9vbCBpcyBzZXQgdG8gYmxvY2s9VHJ1ZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsCiAgICAgICAgICAgIGJsb2NrIGZvciBgYHBvb2xfdGltZW91dGBgIHNlY29uZHMgYW5kIHJhaXNlIEVtcHR5UG9vbEVycm9yIGlmIG5vCiAgICAgICAgICAgIGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgdGltZSBwZXJpb2QuCgogICAgICAgIDpwYXJhbSByZWxlYXNlX2Nvbm46CiAgICAgICAgICAgIElmIEZhbHNlLCB0aGVuIHRoZSB1cmxvcGVuIGNhbGwgd2lsbCBub3QgcmVsZWFzZSB0aGUgY29ubmVjdGlvbgogICAgICAgICAgICBiYWNrIGludG8gdGhlIHBvb2wgb25jZSBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkIChidXQgd2lsbCByZWxlYXNlIGlmCiAgICAgICAgICAgIHlvdSByZWFkIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHJlc3BvbnNlIHN1Y2ggYXMgd2hlbgogICAgICAgICAgICBgcHJlbG9hZF9jb250ZW50PVRydWVgKS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91J3JlIG5vdCBwcmVsb2FkaW5nCiAgICAgICAgICAgIHRoZSByZXNwb25zZSdzIGNvbnRlbnQgaW1tZWRpYXRlbHkuIFlvdSB3aWxsIG5lZWQgdG8gY2FsbAogICAgICAgICAgICBgYHIucmVsZWFzZV9jb25uKClgYCBvbiB0aGUgcmVzcG9uc2UgYGByYGAgdG8gcmV0dXJuIHRoZSBjb25uZWN0aW9uCiAgICAgICAgICAgIGJhY2sgaW50byB0aGUgcG9vbC4gSWYgTm9uZSwgaXQgdGFrZXMgdGhlIHZhbHVlIG9mCiAgICAgICAgICAgIGBgcmVzcG9uc2Vfa3cuZ2V0KCdwcmVsb2FkX2NvbnRlbnQnLCBUcnVlKWBgLgoKICAgICAgICA6cGFyYW0gY2h1bmtlZDoKICAgICAgICAgICAgSWYgVHJ1ZSwgdXJsbGliMyB3aWxsIHNlbmQgdGhlIGJvZHkgdXNpbmcgY2h1bmtlZCB0cmFuc2ZlcgogICAgICAgICAgICBlbmNvZGluZy4gT3RoZXJ3aXNlLCB1cmxsaWIzIHdpbGwgc2VuZCB0aGUgYm9keSB1c2luZyB0aGUgc3RhbmRhcmQKICAgICAgICAgICAgY29udGVudC1sZW5ndGggZm9ybS4gRGVmYXVsdHMgdG8gRmFsc2UuCgogICAgICAgIDpwYXJhbSBpbnQgYm9keV9wb3M6CiAgICAgICAgICAgIFBvc2l0aW9uIHRvIHNlZWsgdG8gaW4gZmlsZS1saWtlIGJvZHkgaW4gdGhlIGV2ZW50IG9mIGEgcmV0cnkgb3IKICAgICAgICAgICAgcmVkaXJlY3QuIFR5cGljYWxseSB0aGlzIHdvbid0IG5lZWQgdG8gYmUgc2V0IGJlY2F1c2UgdXJsbGliMyB3aWxsCiAgICAgICAgICAgIGF1dG8tcG9wdWxhdGUgdGhlIHZhbHVlIHdoZW4gbmVlZGVkLgoKICAgICAgICA6cGFyYW0gXFwqKnJlc3BvbnNlX2t3OgogICAgICAgICAgICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0bwogICAgICAgICAgICA6bWV0aDpgdXJsbGliMy5yZXNwb25zZS5IVFRQUmVzcG9uc2UuZnJvbV9odHRwbGliYAogICAgICAgICIiIgogICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycwoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyZXRyaWVzLCBSZXRyeSk6CiAgICAgICAgICAgIHJldHJpZXMgPSBSZXRyeS5mcm9tX2ludChyZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwgZGVmYXVsdD1zZWxmLnJldHJpZXMpCgogICAgICAgIGlmIHJlbGVhc2VfY29ubiBpcyBOb25lOgogICAgICAgICAgICByZWxlYXNlX2Nvbm4gPSByZXNwb25zZV9rdy5nZXQoJ3ByZWxvYWRfY29udGVudCcsIFRydWUpCgogICAgICAgICMgQ2hlY2sgaG9zdAogICAgICAgIGlmIGFzc2VydF9zYW1lX2hvc3QgYW5kIG5vdCBzZWxmLmlzX3NhbWVfaG9zdCh1cmwpOgogICAgICAgICAgICByYWlzZSBIb3N0Q2hhbmdlZEVycm9yKHNlbGYsIHVybCwgcmV0cmllcykKCiAgICAgICAgY29ubiA9IE5vbmUKCiAgICAgICAgIyBUcmFjayB3aGV0aGVyIGBjb25uYCBuZWVkcyB0byBiZSByZWxlYXNlZCBiZWZvcmUKICAgICAgICAjIHJldHVybmluZy9yYWlzaW5nL3JlY3Vyc2luZy4gVXBkYXRlIHRoaXMgdmFyaWFibGUgaWYgbmVjZXNzYXJ5LCBhbmQKICAgICAgICAjIGxlYXZlIGByZWxlYXNlX2Nvbm5gIGNvbnN0YW50IHRocm91Z2hvdXQgdGhlIGZ1bmN0aW9uLiBUaGF0IHdheSwgaWYKICAgICAgICAjIHRoZSBmdW5jdGlvbiByZWN1cnNlcywgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIGByZWxlYXNlX2Nvbm5gIHdpbGwgYmUKICAgICAgICAjIHBhc3NlZCBkb3duIGludG8gdGhlIHJlY3Vyc2l2ZSBjYWxsLCBhbmQgaXRzIHZhbHVlIHdpbGwgYmUgcmVzcGVjdGVkLgogICAgICAgICMKICAgICAgICAjIFNlZSBpc3N1ZSAjNjUxIFsxXSBmb3IgZGV0YWlscy4KICAgICAgICAjCiAgICAgICAgIyBbMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zaGF6b3cvdXJsbGliMy9pc3N1ZXMvNjUxPgogICAgICAgIHJlbGVhc2VfdGhpc19jb25uID0gcmVsZWFzZV9jb25uCgogICAgICAgICMgTWVyZ2UgdGhlIHByb3h5IGhlYWRlcnMuIE9ubHkgZG8gdGhpcyBpbiBIVFRQLiBXZSBoYXZlIHRvIGNvcHkgdGhlCiAgICAgICAgIyBoZWFkZXJzIGRpY3Qgc28gd2UgY2FuIHNhZmVseSBjaGFuZ2UgaXQgd2l0aG91dCB0aG9zZSBjaGFuZ2VzIGJlaW5nCiAgICAgICAgIyByZWZsZWN0ZWQgaW4gYW55b25lIGVsc2UncyBjb3B5LgogICAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuY29weSgpCiAgICAgICAgICAgIGhlYWRlcnMudXBkYXRlKHNlbGYucHJveHlfaGVhZGVycykKCiAgICAgICAgIyBNdXN0IGtlZXAgdGhlIGV4Y2VwdGlvbiBib3VuZCB0byBhIHNlcGFyYXRlIHZhcmlhYmxlIG9yIGVsc2UgUHl0aG9uIDMKICAgICAgICAjIGNvbXBsYWlucyBhYm91dCBVbmJvdW5kTG9jYWxFcnJvci4KICAgICAgICBlcnIgPSBOb25lCgogICAgICAgICMgS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIGNsZWFubHkgZXhpdGVkIHRoZSBleGNlcHQgYmxvY2suIFRoaXMKICAgICAgICAjIGVuc3VyZXMgd2UgZG8gcHJvcGVyIGNsZWFudXAgaW4gZmluYWxseS4KICAgICAgICBjbGVhbl9leGl0ID0gRmFsc2UKCiAgICAgICAgIyBSZXdpbmQgYm9keSBwb3NpdGlvbiwgaWYgbmVlZGVkLiBSZWNvcmQgY3VycmVudCBwb3NpdGlvbgogICAgICAgICMgZm9yIGZ1dHVyZSByZXdpbmRzIGluIHRoZSBldmVudCBvZiBhIHJlZGlyZWN0L3JldHJ5LgogICAgICAgIGJvZHlfcG9zID0gc2V0X2ZpbGVfcG9zaXRpb24oYm9keSwgYm9keV9wb3MpCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBSZXF1ZXN0IGEgY29ubmVjdGlvbiBmcm9tIHRoZSBxdWV1ZS4KICAgICAgICAgICAgdGltZW91dF9vYmogPSBzZWxmLl9nZXRfdGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICBjb25uID0gc2VsZi5fZ2V0X2Nvbm4odGltZW91dD1wb29sX3RpbWVvdXQpCgogICAgICAgICAgICBjb25uLnRpbWVvdXQgPSB0aW1lb3V0X29iai5jb25uZWN0X3RpbWVvdXQKCiAgICAgICAgICAgIGlzX25ld19wcm94eV9jb25uID0gc2VsZi5wcm94eSBpcyBub3QgTm9uZSBhbmQgbm90IGdldGF0dHIoY29ubiwgJ3NvY2snLCBOb25lKQogICAgICAgICAgICBpZiBpc19uZXdfcHJveHlfY29ubjoKICAgICAgICAgICAgICAgIHNlbGYuX3ByZXBhcmVfcHJveHkoY29ubikKCiAgICAgICAgICAgICMgTWFrZSB0aGUgcmVxdWVzdCBvbiB0aGUgaHR0cGxpYiBjb25uZWN0aW9uIG9iamVjdC4KICAgICAgICAgICAgaHR0cGxpYl9yZXNwb25zZSA9IHNlbGYuX21ha2VfcmVxdWVzdChjb25uLCBtZXRob2QsIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXRfb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk9Ym9keSwgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rZWQ9Y2h1bmtlZCkKCiAgICAgICAgICAgICMgSWYgd2UncmUgZ29pbmcgdG8gcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBpbiBgYGZpbmFsbHk6YGAsIHRoZW4KICAgICAgICAgICAgIyB0aGUgcmVzcG9uc2UgZG9lc24ndCBuZWVkIHRvIGtub3cgYWJvdXQgdGhlIGNvbm5lY3Rpb24uIE90aGVyd2lzZQogICAgICAgICAgICAjIGl0IHdpbGwgYWxzbyB0cnkgdG8gcmVsZWFzZSBpdCBhbmQgd2UnbGwgaGF2ZSBhIGRvdWJsZS1yZWxlYXNlCiAgICAgICAgICAgICMgbWVzcy4KICAgICAgICAgICAgcmVzcG9uc2VfY29ubiA9IGNvbm4gaWYgbm90IHJlbGVhc2VfY29ubiBlbHNlIE5vbmUKCiAgICAgICAgICAgICMgUGFzcyBtZXRob2QgdG8gUmVzcG9uc2UgZm9yIGxlbmd0aCBjaGVja2luZwogICAgICAgICAgICByZXNwb25zZV9rd1sncmVxdWVzdF9tZXRob2QnXSA9IG1ldGhvZAoKICAgICAgICAgICAgIyBJbXBvcnQgaHR0cGxpYidzIHJlc3BvbnNlIGludG8gb3VyIG93biB3cmFwcGVyIG9iamVjdAogICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuUmVzcG9uc2VDbHMuZnJvbV9odHRwbGliKGh0dHBsaWJfcmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbD1zZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb249cmVzcG9uc2VfY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzPXJldHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdykKCiAgICAgICAgICAgICMgRXZlcnl0aGluZyB3ZW50IGdyZWF0IQogICAgICAgICAgICBjbGVhbl9leGl0ID0gVHJ1ZQoKICAgICAgICBleGNlcHQgcXVldWUuRW1wdHk6CiAgICAgICAgICAgICMgVGltZWQgb3V0IGJ5IHF1ZXVlLgogICAgICAgICAgICByYWlzZSBFbXB0eVBvb2xFcnJvcihzZWxmLCAiTm8gcG9vbCBjb25uZWN0aW9ucyBhcmUgYXZhaWxhYmxlLiIpCgogICAgICAgIGV4Y2VwdCAoVGltZW91dEVycm9yLCBIVFRQRXhjZXB0aW9uLCBTb2NrZXRFcnJvciwgUHJvdG9jb2xFcnJvciwKICAgICAgICAgICAgICAgIEJhc2VTU0xFcnJvciwgU1NMRXJyb3IsIENlcnRpZmljYXRlRXJyb3IpIGFzIGU6CiAgICAgICAgICAgICMgRGlzY2FyZCB0aGUgY29ubmVjdGlvbiBmb3IgdGhlc2UgZXhjZXB0aW9ucy4gSXQgd2lsbCBiZQogICAgICAgICAgICAjIHJlcGxhY2VkIGR1cmluZyB0aGUgbmV4dCBfZ2V0X2Nvbm4oKSBjYWxsLgogICAgICAgICAgICBjbGVhbl9leGl0ID0gRmFsc2UKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCAoQmFzZVNTTEVycm9yLCBDZXJ0aWZpY2F0ZUVycm9yKSk6CiAgICAgICAgICAgICAgICBlID0gU1NMRXJyb3IoZSkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIChTb2NrZXRFcnJvciwgTmV3Q29ubmVjdGlvbkVycm9yKSkgYW5kIHNlbGYucHJveHk6CiAgICAgICAgICAgICAgICBlID0gUHJveHlFcnJvcignQ2Fubm90IGNvbm5lY3QgdG8gcHJveHkuJywgZSkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIChTb2NrZXRFcnJvciwgSFRUUEV4Y2VwdGlvbikpOgogICAgICAgICAgICAgICAgZSA9IFByb3RvY29sRXJyb3IoJ0Nvbm5lY3Rpb24gYWJvcnRlZC4nLCBlKQoKICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KG1ldGhvZCwgdXJsLCBlcnJvcj1lLCBfcG9vbD1zZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YWNrdHJhY2U9c3lzLmV4Y19pbmZvKClbMl0pCiAgICAgICAgICAgIHJldHJpZXMuc2xlZXAoKQoKICAgICAgICAgICAgIyBLZWVwIHRyYWNrIG9mIHRoZSBlcnJvciBmb3IgdGhlIHJldHJ5IHdhcm5pbmcuCiAgICAgICAgICAgIGVyciA9IGUKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgbm90IGNsZWFuX2V4aXQ6CiAgICAgICAgICAgICAgICAjIFdlIGhpdCBzb21lIGtpbmQgb2YgZXhjZXB0aW9uLCBoYW5kbGVkIG9yIG90aGVyd2lzZS4gV2UgbmVlZAogICAgICAgICAgICAgICAgIyB0byB0aHJvdyB0aGUgY29ubmVjdGlvbiBhd2F5IHVubGVzcyBleHBsaWNpdGx5IHRvbGQgbm90IHRvLgogICAgICAgICAgICAgICAgIyBDbG9zZSB0aGUgY29ubmVjdGlvbiwgc2V0IHRoZSB2YXJpYWJsZSB0byBOb25lLCBhbmQgbWFrZSBzdXJlCiAgICAgICAgICAgICAgICAjIHdlIHB1dCB0aGUgTm9uZSBiYWNrIGluIHRoZSBwb29sIHRvIGF2b2lkIGxlYWtpbmcgaXQuCiAgICAgICAgICAgICAgICBjb25uID0gY29ubiBhbmQgY29ubi5jbG9zZSgpCiAgICAgICAgICAgICAgICByZWxlYXNlX3RoaXNfY29ubiA9IFRydWUKCiAgICAgICAgICAgIGlmIHJlbGVhc2VfdGhpc19jb25uOgogICAgICAgICAgICAgICAgIyBQdXQgdGhlIGNvbm5lY3Rpb24gYmFjayB0byBiZSByZXVzZWQuIElmIHRoZSBjb25uZWN0aW9uIGlzCiAgICAgICAgICAgICAgICAjIGV4cGlyZWQgdGhlbiBpdCB3aWxsIGJlIE5vbmUsIHdoaWNoIHdpbGwgZ2V0IHJlcGxhY2VkIHdpdGggYQogICAgICAgICAgICAgICAgIyBmcmVzaCBjb25uZWN0aW9uIGR1cmluZyBfZ2V0X2Nvbm4uCiAgICAgICAgICAgICAgICBzZWxmLl9wdXRfY29ubihjb25uKQoKICAgICAgICBpZiBub3QgY29ubjoKICAgICAgICAgICAgIyBUcnkgYWdhaW4KICAgICAgICAgICAgbG9nLndhcm5pbmcoIlJldHJ5aW5nICglcikgYWZ0ZXIgY29ubmVjdGlvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJicm9rZW4gYnkgJyVyJzogJXMiLCByZXRyaWVzLCBlcnIsIHVybCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbihtZXRob2QsIHVybCwgYm9keSwgaGVhZGVycywgcmV0cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCwgYXNzZXJ0X3NhbWVfaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsIHBvb2xfdGltZW91dD1wb29sX3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb25uPXJlbGVhc2VfY29ubiwgYm9keV9wb3M9Ym9keV9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdykKCiAgICAgICAgZGVmIGRyYWluX2FuZF9yZWxlYXNlX2Nvbm4ocmVzcG9uc2UpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIGRpc2NhcmQgYW55IHJlbWFpbmluZyByZXNwb25zZSBib2R5LCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlCiAgICAgICAgICAgICAgICAjIHJlbGVhc2VkIGJhY2sgdG8gdGhlIHBvb2wgb25jZSB0aGUgZW50aXJlIHJlc3BvbnNlIGlzIHJlYWQKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWQoKQogICAgICAgICAgICBleGNlcHQgKFRpbWVvdXRFcnJvciwgSFRUUEV4Y2VwdGlvbiwgU29ja2V0RXJyb3IsIFByb3RvY29sRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgQmFzZVNTTEVycm9yLCBTU0xFcnJvcikgYXMgZToKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgIyBIYW5kbGUgcmVkaXJlY3Q/CiAgICAgICAgcmVkaXJlY3RfbG9jYXRpb24gPSByZWRpcmVjdCBhbmQgcmVzcG9uc2UuZ2V0X3JlZGlyZWN0X2xvY2F0aW9uKCkKICAgICAgICBpZiByZWRpcmVjdF9sb2NhdGlvbjoKICAgICAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwMzoKICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXRyaWVzID0gcmV0cmllcy5pbmNyZW1lbnQobWV0aG9kLCB1cmwsIHJlc3BvbnNlPXJlc3BvbnNlLCBfcG9vbD1zZWxmKQogICAgICAgICAgICBleGNlcHQgTWF4UmV0cnlFcnJvcjoKICAgICAgICAgICAgICAgIGlmIHJldHJpZXMucmFpc2Vfb25fcmVkaXJlY3Q6CiAgICAgICAgICAgICAgICAgICAgIyBEcmFpbiBhbmQgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBmb3IgdGhpcyByZXNwb25zZSwgc2luY2UKICAgICAgICAgICAgICAgICAgICAjIHdlJ3JlIG5vdCByZXR1cm5pbmcgaXQgdG8gYmUgcmVsZWFzZWQgbWFudWFsbHkuCiAgICAgICAgICAgICAgICAgICAgZHJhaW5fYW5kX3JlbGVhc2VfY29ubihyZXNwb25zZSkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgICAgICAgICAjIGRyYWluIGFuZCByZXR1cm4gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHBvb2wgYmVmb3JlIHJlY3Vyc2luZwogICAgICAgICAgICBkcmFpbl9hbmRfcmVsZWFzZV9jb25uKHJlc3BvbnNlKQoKICAgICAgICAgICAgcmV0cmllcy5zbGVlcF9mb3JfcmV0cnkocmVzcG9uc2UpCiAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVkaXJlY3RpbmcgJXMgLT4gJXMiLCB1cmwsIHJlZGlyZWN0X2xvY2F0aW9uKQogICAgICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKAogICAgICAgICAgICAgICAgbWV0aG9kLCByZWRpcmVjdF9sb2NhdGlvbiwgYm9keSwgaGVhZGVycywKICAgICAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsCiAgICAgICAgICAgICAgICBhc3NlcnRfc2FtZV9ob3N0PWFzc2VydF9zYW1lX2hvc3QsCiAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsIHBvb2xfdGltZW91dD1wb29sX3RpbWVvdXQsCiAgICAgICAgICAgICAgICByZWxlYXNlX2Nvbm49cmVsZWFzZV9jb25uLCBib2R5X3Bvcz1ib2R5X3BvcywKICAgICAgICAgICAgICAgICoqcmVzcG9uc2Vfa3cpCgogICAgICAgICMgQ2hlY2sgaWYgd2Ugc2hvdWxkIHJldHJ5IHRoZSBIVFRQIHJlc3BvbnNlLgogICAgICAgIGhhc19yZXRyeV9hZnRlciA9IGJvb2wocmVzcG9uc2UuZ2V0aGVhZGVyKCdSZXRyeS1BZnRlcicpKQogICAgICAgIGlmIHJldHJpZXMuaXNfcmV0cnkobWV0aG9kLCByZXNwb25zZS5zdGF0dXMsIGhhc19yZXRyeV9hZnRlcik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudChtZXRob2QsIHVybCwgcmVzcG9uc2U9cmVzcG9uc2UsIF9wb29sPXNlbGYpCiAgICAgICAgICAgIGV4Y2VwdCBNYXhSZXRyeUVycm9yOgogICAgICAgICAgICAgICAgaWYgcmV0cmllcy5yYWlzZV9vbl9zdGF0dXM6CiAgICAgICAgICAgICAgICAgICAgIyBEcmFpbiBhbmQgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBmb3IgdGhpcyByZXNwb25zZSwgc2luY2UKICAgICAgICAgICAgICAgICAgICAjIHdlJ3JlIG5vdCByZXR1cm5pbmcgaXQgdG8gYmUgcmVsZWFzZWQgbWFudWFsbHkuCiAgICAgICAgICAgICAgICAgICAgZHJhaW5fYW5kX3JlbGVhc2VfY29ubihyZXNwb25zZSkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgICAgICAgICAjIGRyYWluIGFuZCByZXR1cm4gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHBvb2wgYmVmb3JlIHJlY3Vyc2luZwogICAgICAgICAgICBkcmFpbl9hbmRfcmVsZWFzZV9jb25uKHJlc3BvbnNlKQoKICAgICAgICAgICAgcmV0cmllcy5zbGVlcChyZXNwb25zZSkKICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXRyeTogJXMiLCB1cmwpCiAgICAgICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4oCiAgICAgICAgICAgICAgICBtZXRob2QsIHVybCwgYm9keSwgaGVhZGVycywKICAgICAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsCiAgICAgICAgICAgICAgICBhc3NlcnRfc2FtZV9ob3N0PWFzc2VydF9zYW1lX2hvc3QsCiAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsIHBvb2xfdGltZW91dD1wb29sX3RpbWVvdXQsCiAgICAgICAgICAgICAgICByZWxlYXNlX2Nvbm49cmVsZWFzZV9jb25uLAogICAgICAgICAgICAgICAgYm9keV9wb3M9Ym9keV9wb3MsICoqcmVzcG9uc2Vfa3cpCgogICAgICAgIHJldHVybiByZXNwb25zZQoKCmNsYXNzIEhUVFBTQ29ubmVjdGlvblBvb2woSFRUUENvbm5lY3Rpb25Qb29sKToKICAgICIiIgogICAgU2FtZSBhcyA6Y2xhc3M6YC5IVFRQQ29ubmVjdGlvblBvb2xgLCBidXQgSFRUUFMuCgogICAgV2hlbiBQeXRob24gaXMgY29tcGlsZWQgd2l0aCB0aGUgOm1vZDpgc3NsYCBtb2R1bGUsIHRoZW4KICAgIDpjbGFzczpgLlZlcmlmaWVkSFRUUFNDb25uZWN0aW9uYCBpcyB1c2VkLCB3aGljaCAqY2FuKiB2ZXJpZnkgY2VydGlmaWNhdGVzLAogICAgaW5zdGVhZCBvZiA6Y2xhc3M6YC5IVFRQU0Nvbm5lY3Rpb25gLgoKICAgIDpjbGFzczpgLlZlcmlmaWVkSFRUUFNDb25uZWN0aW9uYCB1c2VzIG9uZSBvZiBgYGFzc2VydF9maW5nZXJwcmludGBgLAogICAgYGBhc3NlcnRfaG9zdG5hbWVgYCBhbmQgYGBob3N0YGAgaW4gdGhpcyBvcmRlciB0byB2ZXJpZnkgY29ubmVjdGlvbnMuCiAgICBJZiBgYGFzc2VydF9ob3N0bmFtZWBgIGlzIEZhbHNlLCBubyB2ZXJpZmljYXRpb24gaXMgZG9uZS4KCiAgICBUaGUgYGBrZXlfZmlsZWBgLCBgYGNlcnRfZmlsZWBgLCBgYGNlcnRfcmVxc2BgLCBgYGNhX2NlcnRzYGAsCiAgICBgYGNhX2NlcnRfZGlyYGAsIGFuZCBgYHNzbF92ZXJzaW9uYGAgYXJlIG9ubHkgdXNlZCBpZiA6bW9kOmBzc2xgIGlzCiAgICBhdmFpbGFibGUgYW5kIGFyZSBmZWQgaW50byA6bWV0aDpgdXJsbGliMy51dGlsLnNzbF93cmFwX3NvY2tldGAgdG8gdXBncmFkZQogICAgdGhlIGNvbm5lY3Rpb24gc29ja2V0IGludG8gYW4gU1NMIHNvY2tldC4KICAgICIiIgoKICAgIHNjaGVtZSA9ICdodHRwcycKICAgIENvbm5lY3Rpb25DbHMgPSBIVFRQU0Nvbm5lY3Rpb24KCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1Ob25lLAogICAgICAgICAgICAgICAgIHN0cmljdD1GYWxzZSwgdGltZW91dD1UaW1lb3V0LkRFRkFVTFRfVElNRU9VVCwgbWF4c2l6ZT0xLAogICAgICAgICAgICAgICAgIGJsb2NrPUZhbHNlLCBoZWFkZXJzPU5vbmUsIHJldHJpZXM9Tm9uZSwKICAgICAgICAgICAgICAgICBfcHJveHk9Tm9uZSwgX3Byb3h5X2hlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgICBrZXlfZmlsZT1Ob25lLCBjZXJ0X2ZpbGU9Tm9uZSwgY2VydF9yZXFzPU5vbmUsCiAgICAgICAgICAgICAgICAgY2FfY2VydHM9Tm9uZSwgc3NsX3ZlcnNpb249Tm9uZSwKICAgICAgICAgICAgICAgICBhc3NlcnRfaG9zdG5hbWU9Tm9uZSwgYXNzZXJ0X2ZpbmdlcnByaW50PU5vbmUsCiAgICAgICAgICAgICAgICAgY2FfY2VydF9kaXI9Tm9uZSwgKipjb25uX2t3KToKCiAgICAgICAgSFRUUENvbm5lY3Rpb25Qb29sLl9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHN0cmljdCwgdGltZW91dCwgbWF4c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssIGhlYWRlcnMsIHJldHJpZXMsIF9wcm94eSwgX3Byb3h5X2hlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqY29ubl9rdykKCiAgICAgICAgaWYgY2FfY2VydHMgYW5kIGNlcnRfcmVxcyBpcyBOb25lOgogICAgICAgICAgICBjZXJ0X3JlcXMgPSAnQ0VSVF9SRVFVSVJFRCcKCiAgICAgICAgc2VsZi5rZXlfZmlsZSA9IGtleV9maWxlCiAgICAgICAgc2VsZi5jZXJ0X2ZpbGUgPSBjZXJ0X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IGNlcnRfcmVxcwogICAgICAgIHNlbGYuY2FfY2VydHMgPSBjYV9jZXJ0cwogICAgICAgIHNlbGYuY2FfY2VydF9kaXIgPSBjYV9jZXJ0X2RpcgogICAgICAgIHNlbGYuc3NsX3ZlcnNpb24gPSBzc2xfdmVyc2lvbgogICAgICAgIHNlbGYuYXNzZXJ0X2hvc3RuYW1lID0gYXNzZXJ0X2hvc3RuYW1lCiAgICAgICAgc2VsZi5hc3NlcnRfZmluZ2VycHJpbnQgPSBhc3NlcnRfZmluZ2VycHJpbnQKCiAgICBkZWYgX3ByZXBhcmVfY29ubihzZWxmLCBjb25uKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHRoZSBgYGNvbm5lY3Rpb25gYCBmb3IgOm1ldGg6YHVybGxpYjMudXRpbC5zc2xfd3JhcF9zb2NrZXRgCiAgICAgICAgYW5kIGVzdGFibGlzaCB0aGUgdHVubmVsIGlmIHByb3h5IGlzIHVzZWQuCiAgICAgICAgIiIiCgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29ubiwgVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb24pOgogICAgICAgICAgICBjb25uLnNldF9jZXJ0KGtleV9maWxlPXNlbGYua2V5X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9maWxlPXNlbGYuY2VydF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zZWxmLmNlcnRfcmVxcywKICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1zZWxmLmNhX2NlcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRfZGlyPXNlbGYuY2FfY2VydF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0X2hvc3RuYW1lPXNlbGYuYXNzZXJ0X2hvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydF9maW5nZXJwcmludD1zZWxmLmFzc2VydF9maW5nZXJwcmludCkKICAgICAgICAgICAgY29ubi5zc2xfdmVyc2lvbiA9IHNlbGYuc3NsX3ZlcnNpb24KICAgICAgICByZXR1cm4gY29ubgoKICAgIGRlZiBfcHJlcGFyZV9wcm94eShzZWxmLCBjb25uKToKICAgICAgICAiIiIKICAgICAgICBFc3RhYmxpc2ggdHVubmVsIGNvbm5lY3Rpb24gZWFybHksIGJlY2F1c2Ugb3RoZXJ3aXNlIGh0dHBsaWIKICAgICAgICB3b3VsZCBpbXByb3Blcmx5IHNldCBIb3N0OiBoZWFkZXIgdG8gcHJveHkncyBJUDpwb3J0LgogICAgICAgICIiIgogICAgICAgICMgUHl0aG9uIDIuNysKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNldF90dW5uZWwgPSBjb25uLnNldF90dW5uZWwKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMi42CiAgICAgICAgICAgIHNldF90dW5uZWwgPSBjb25uLl9zZXRfdHVubmVsCgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPD0gKDIsIDYsIDQpIGFuZCBub3Qgc2VsZi5wcm94eV9oZWFkZXJzOiAgIyBQeXRob24gMi42LjQgYW5kIG9sZGVyCiAgICAgICAgICAgIHNldF90dW5uZWwoc2VsZi5fcHJveHlfaG9zdCwgc2VsZi5wb3J0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNldF90dW5uZWwoc2VsZi5fcHJveHlfaG9zdCwgc2VsZi5wb3J0LCBzZWxmLnByb3h5X2hlYWRlcnMpCgogICAgICAgIGNvbm4uY29ubmVjdCgpCgogICAgZGVmIF9uZXdfY29ubihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBmcmVzaCA6Y2xhc3M6YGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uYC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucyArPSAxCiAgICAgICAgbG9nLmRlYnVnKCJTdGFydGluZyBuZXcgSFRUUFMgY29ubmVjdGlvbiAoJWQpOiAlcyIsCiAgICAgICAgICAgICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zLCBzZWxmLmhvc3QpCgogICAgICAgIGlmIG5vdCBzZWxmLkNvbm5lY3Rpb25DbHMgb3Igc2VsZi5Db25uZWN0aW9uQ2xzIGlzIER1bW15Q29ubmVjdGlvbjoKICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoIkNhbid0IGNvbm5lY3QgdG8gSFRUUFMgVVJMIGJlY2F1c2UgdGhlIFNTTCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgaXMgbm90IGF2YWlsYWJsZS4iKQoKICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYuaG9zdAogICAgICAgIGFjdHVhbF9wb3J0ID0gc2VsZi5wb3J0CiAgICAgICAgaWYgc2VsZi5wcm94eSBpcyBub3QgTm9uZToKICAgICAgICAgICAgYWN0dWFsX2hvc3QgPSBzZWxmLnByb3h5Lmhvc3QKICAgICAgICAgICAgYWN0dWFsX3BvcnQgPSBzZWxmLnByb3h5LnBvcnQKCiAgICAgICAgY29ubiA9IHNlbGYuQ29ubmVjdGlvbkNscyhob3N0PWFjdHVhbF9ob3N0LCBwb3J0PWFjdHVhbF9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLnRpbWVvdXQuY29ubmVjdF90aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0PXNlbGYuc3RyaWN0LCAqKnNlbGYuY29ubl9rdykKCiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXBhcmVfY29ubihjb25uKQoKICAgIGRlZiBfdmFsaWRhdGVfY29ubihzZWxmLCBjb25uKToKICAgICAgICAiIiIKICAgICAgICBDYWxsZWQgcmlnaHQgYmVmb3JlIGEgcmVxdWVzdCBpcyBtYWRlLCBhZnRlciB0aGUgc29ja2V0IGlzIGNyZWF0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoSFRUUFNDb25uZWN0aW9uUG9vbCwgc2VsZikuX3ZhbGlkYXRlX2Nvbm4oY29ubikKCiAgICAgICAgIyBGb3JjZSBjb25uZWN0IGVhcmx5IHRvIGFsbG93IHVzIHRvIHZhbGlkYXRlIHRoZSBjb25uZWN0aW9uLgogICAgICAgIGlmIG5vdCBnZXRhdHRyKGNvbm4sICdzb2NrJywgTm9uZSk6ICAjIEFwcEVuZ2luZSBtaWdodCBub3QgaGF2ZSAgYC5zb2NrYAogICAgICAgICAgICBjb25uLmNvbm5lY3QoKQoKICAgICAgICBpZiBub3QgY29ubi5pc192ZXJpZmllZDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgICAgICAgICAnVW52ZXJpZmllZCBIVFRQUyByZXF1ZXN0IGlzIGJlaW5nIG1hZGUuICcKICAgICAgICAgICAgICAgICdBZGRpbmcgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGlzIHN0cm9uZ2x5IGFkdmlzZWQuIFNlZTogJwogICAgICAgICAgICAgICAgJ2h0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvYWR2YW5jZWQtdXNhZ2UuaHRtbCcKICAgICAgICAgICAgICAgICcjc3NsLXdhcm5pbmdzJyksCiAgICAgICAgICAgICAgICBJbnNlY3VyZVJlcXVlc3RXYXJuaW5nKQoKCmRlZiBjb25uZWN0aW9uX2Zyb21fdXJsKHVybCwgKiprdyk6CiAgICAiIiIKICAgIEdpdmVuIGEgdXJsLCByZXR1cm4gYW4gOmNsYXNzOmAuQ29ubmVjdGlvblBvb2xgIGluc3RhbmNlIG9mIGl0cyBob3N0LgoKICAgIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3Igbm90IGhhdmluZyB0byBwYXJzZSBvdXQgdGhlIHNjaGVtZSwgaG9zdCwgYW5kIHBvcnQKICAgIG9mIHRoZSB1cmwgYmVmb3JlIGNyZWF0aW5nIGFuIDpjbGFzczpgLkNvbm5lY3Rpb25Qb29sYCBpbnN0YW5jZS4KCiAgICA6cGFyYW0gdXJsOgogICAgICAgIEFic29sdXRlIFVSTCBzdHJpbmcgdGhhdCBtdXN0IGluY2x1ZGUgdGhlIHNjaGVtZS4gUG9ydCBpcyBvcHRpb25hbC4KCiAgICA6cGFyYW0gXFwqKmt3OgogICAgICAgIFBhc3NlcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBhcHByb3ByaWF0ZQogICAgICAgIDpjbGFzczpgLkNvbm5lY3Rpb25Qb29sYC4gVXNlZnVsIGZvciBzcGVjaWZ5aW5nIHRoaW5ncyBsaWtlCiAgICAgICAgdGltZW91dCwgbWF4c2l6ZSwgaGVhZGVycywgZXRjLgoKICAgIEV4YW1wbGU6OgoKICAgICAgICA+Pj4gY29ubiA9IGNvbm5lY3Rpb25fZnJvbV91cmwoJ2h0dHA6Ly9nb29nbGUuY29tLycpCiAgICAgICAgPj4+IHIgPSBjb25uLnJlcXVlc3QoJ0dFVCcsICcvJykKICAgICIiIgogICAgc2NoZW1lLCBob3N0LCBwb3J0ID0gZ2V0X2hvc3QodXJsKQogICAgcG9ydCA9IHBvcnQgb3IgcG9ydF9ieV9zY2hlbWUuZ2V0KHNjaGVtZSwgODApCiAgICBpZiBzY2hlbWUgPT0gJ2h0dHBzJzoKICAgICAgICByZXR1cm4gSFRUUFNDb25uZWN0aW9uUG9vbChob3N0LCBwb3J0PXBvcnQsICoqa3cpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBIVFRQQ29ubmVjdGlvblBvb2woaG9zdCwgcG9ydD1wb3J0LCAqKmt3KQoKCmRlZiBfaXB2Nl9ob3N0KGhvc3QpOgogICAgIiIiCiAgICBQcm9jZXNzIElQdjYgYWRkcmVzcyBsaXRlcmFscwogICAgIiIiCgogICAgIyBodHRwbGliIGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHdlIGluY2x1ZGUgYnJhY2tldHMgaW4gSVB2NiBhZGRyZXNzZXMKICAgICMgU3BlY2lmaWNhbGx5LCBpZiB3ZSBpbmNsdWRlIGJyYWNrZXRzIGJ1dCBhbHNvIHBhc3MgdGhlIHBvcnQgdGhlbgogICAgIyBodHRwbGliIGNyYXppbHkgZG91YmxlcyB1cCB0aGUgc3F1YXJlIGJyYWNrZXRzIG9uIHRoZSBIb3N0IGhlYWRlci4KICAgICMgSW5zdGVhZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgbmV2ZXIgcGFzcyBgYE5vbmVgYCBhcyB0aGUgcG9ydC4KICAgICMgSG93ZXZlciwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBjYW4ndCBhY3R1YWxseQogICAgIyAqYXNzZXJ0KiB0aGF0LiAgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyODUzOQogICAgIwogICAgIyBBbHNvIGlmIGFuIElQdjYgYWRkcmVzcyBsaXRlcmFsIGhhcyBhIHpvbmUgaWRlbnRpZmllciwgdGhlCiAgICAjIHBlcmNlbnQgc2lnbiBtaWdodCBiZSBVUkllbmNvZGVkLCBjb252ZXJ0IGl0IGJhY2sgaW50byBBU0NJSQogICAgaWYgaG9zdC5zdGFydHN3aXRoKCdbJykgYW5kIGhvc3QuZW5kc3dpdGgoJ10nKToKICAgICAgICBob3N0ID0gaG9zdC5yZXBsYWNlKCclMjUnLCAnJScpLnN0cmlwKCdbXScpCiAgICByZXR1cm4gaG9zdApQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAVQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhALdZi32YRAAAmEQAAFUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2JpbmRpbmdzLnB5IiIiClRoaXMgbW9kdWxlIHVzZXMgY3R5cGVzIHRvIGJpbmQgYSB3aG9sZSBidW5jaCBvZiBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cyBmcm9tClNlY3VyZVRyYW5zcG9ydC4gVGhlIGdvYWwgaGVyZSBpcyB0byBwcm92aWRlIHRoZSBsb3ctbGV2ZWwgQVBJIHRvClNlY3VyZVRyYW5zcG9ydC4gVGhlc2UgYXJlIGVzc2VudGlhbGx5IHRoZSBDLWxldmVsIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzLCBhbmQKdGhleSdyZSBwcmV0dHkgZ3Jvc3MgdG8gd29yayB3aXRoLgoKVGhpcyBjb2RlIGlzIGEgYmFzdGFyZGlzZWQgdmVyc2lvbiBvZiB0aGUgY29kZSBmb3VuZCBpbiBXaWxsIEJvbmQncyBvc2NyeXB0bwpsaWJyYXJ5LiBBbiBlbm9ybW91cyBkZWJ0IGlzIG93ZWQgdG8gaGltIGZvciBibGF6aW5nIHRoaXMgdHJhaWwgZm9yIHVzLiBGb3IKdGhhdCByZWFzb24sIHRoaXMgY29kZSBzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBjb3ZlcmVkIGJvdGggYnkgdXJsbGliMydzCmxpY2Vuc2UgYW5kIGJ5IG9zY3J5cHRvJ3M6CgogICAgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgV2lsbCBCb25kIDx3aWxsQHdib25kLm5ldD4KCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICAgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKICAgIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogICAgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCiAgICBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCiAgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHBsYXRmb3JtCmZyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQpmcm9tIGN0eXBlcyBpbXBvcnQgKAogICAgY192b2lkX3AsIGNfaW50MzIsIGNfY2hhcl9wLCBjX3NpemVfdCwgY19ieXRlLCBjX3VpbnQzMiwgY191bG9uZywgY19sb25nLAogICAgY19ib29sCikKZnJvbSBjdHlwZXMgaW1wb3J0IENETEwsIFBPSU5URVIsIENGVU5DVFlQRQoKCnNlY3VyaXR5X3BhdGggPSBmaW5kX2xpYnJhcnkoJ1NlY3VyaXR5JykKaWYgbm90IHNlY3VyaXR5X3BhdGg6CiAgICByYWlzZSBJbXBvcnRFcnJvcignVGhlIGxpYnJhcnkgU2VjdXJpdHkgY291bGQgbm90IGJlIGZvdW5kJykKCgpjb3JlX2ZvdW5kYXRpb25fcGF0aCA9IGZpbmRfbGlicmFyeSgnQ29yZUZvdW5kYXRpb24nKQppZiBub3QgY29yZV9mb3VuZGF0aW9uX3BhdGg6CiAgICByYWlzZSBJbXBvcnRFcnJvcignVGhlIGxpYnJhcnkgQ29yZUZvdW5kYXRpb24gY291bGQgbm90IGJlIGZvdW5kJykKCgp2ZXJzaW9uID0gcGxhdGZvcm0ubWFjX3ZlcigpWzBdCnZlcnNpb25faW5mbyA9IHR1cGxlKG1hcChpbnQsIHZlcnNpb24uc3BsaXQoJy4nKSkpCmlmIHZlcnNpb25faW5mbyA8ICgxMCwgOCk6CiAgICByYWlzZSBPU0Vycm9yKAogICAgICAgICdPbmx5IE9TIFggMTAuOCBhbmQgbmV3ZXIgYXJlIHN1cHBvcnRlZCwgbm90ICVzLiVzJyAlICgKICAgICAgICAgICAgdmVyc2lvbl9pbmZvWzBdLCB2ZXJzaW9uX2luZm9bMV0KICAgICAgICApCiAgICApCgpTZWN1cml0eSA9IENETEwoc2VjdXJpdHlfcGF0aCwgdXNlX2Vycm5vPVRydWUpCkNvcmVGb3VuZGF0aW9uID0gQ0RMTChjb3JlX2ZvdW5kYXRpb25fcGF0aCwgdXNlX2Vycm5vPVRydWUpCgpCb29sZWFuID0gY19ib29sCkNGSW5kZXggPSBjX2xvbmcKQ0ZTdHJpbmdFbmNvZGluZyA9IGNfdWludDMyCkNGRGF0YSA9IGNfdm9pZF9wCkNGU3RyaW5nID0gY192b2lkX3AKQ0ZBcnJheSA9IGNfdm9pZF9wCkNGTXV0YWJsZUFycmF5ID0gY192b2lkX3AKQ0ZEaWN0aW9uYXJ5ID0gY192b2lkX3AKQ0ZFcnJvciA9IGNfdm9pZF9wCkNGVHlwZSA9IGNfdm9pZF9wCkNGVHlwZUlEID0gY191bG9uZwoKQ0ZUeXBlUmVmID0gUE9JTlRFUihDRlR5cGUpCkNGQWxsb2NhdG9yUmVmID0gY192b2lkX3AKCk9TU3RhdHVzID0gY19pbnQzMgoKQ0ZEYXRhUmVmID0gUE9JTlRFUihDRkRhdGEpCkNGU3RyaW5nUmVmID0gUE9JTlRFUihDRlN0cmluZykKQ0ZBcnJheVJlZiA9IFBPSU5URVIoQ0ZBcnJheSkKQ0ZNdXRhYmxlQXJyYXlSZWYgPSBQT0lOVEVSKENGTXV0YWJsZUFycmF5KQpDRkRpY3Rpb25hcnlSZWYgPSBQT0lOVEVSKENGRGljdGlvbmFyeSkKQ0ZBcnJheUNhbGxCYWNrcyA9IGNfdm9pZF9wCkNGRGljdGlvbmFyeUtleUNhbGxCYWNrcyA9IGNfdm9pZF9wCkNGRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzID0gY192b2lkX3AKClNlY0NlcnRpZmljYXRlUmVmID0gUE9JTlRFUihjX3ZvaWRfcCkKU2VjRXh0ZXJuYWxGb3JtYXQgPSBjX3VpbnQzMgpTZWNFeHRlcm5hbEl0ZW1UeXBlID0gY191aW50MzIKU2VjSWRlbnRpdHlSZWYgPSBQT0lOVEVSKGNfdm9pZF9wKQpTZWNJdGVtSW1wb3J0RXhwb3J0RmxhZ3MgPSBjX3VpbnQzMgpTZWNJdGVtSW1wb3J0RXhwb3J0S2V5UGFyYW1ldGVycyA9IGNfdm9pZF9wClNlY0tleWNoYWluUmVmID0gUE9JTlRFUihjX3ZvaWRfcCkKU1NMUHJvdG9jb2wgPSBjX3VpbnQzMgpTU0xDaXBoZXJTdWl0ZSA9IGNfdWludDMyClNTTENvbnRleHRSZWYgPSBQT0lOVEVSKGNfdm9pZF9wKQpTZWNUcnVzdFJlZiA9IFBPSU5URVIoY192b2lkX3ApClNTTENvbm5lY3Rpb25SZWYgPSBjX3VpbnQzMgpTZWNUcnVzdFJlc3VsdFR5cGUgPSBjX3VpbnQzMgpTZWNUcnVzdE9wdGlvbkZsYWdzID0gY191aW50MzIKU1NMUHJvdG9jb2xTaWRlID0gY191aW50MzIKU1NMQ29ubmVjdGlvblR5cGUgPSBjX3VpbnQzMgpTU0xTZXNzaW9uT3B0aW9uID0gY191aW50MzIKCgp0cnk6CiAgICBTZWN1cml0eS5TZWNJdGVtSW1wb3J0LmFyZ3R5cGVzID0gWwogICAgICAgIENGRGF0YVJlZiwKICAgICAgICBDRlN0cmluZ1JlZiwKICAgICAgICBQT0lOVEVSKFNlY0V4dGVybmFsRm9ybWF0KSwKICAgICAgICBQT0lOVEVSKFNlY0V4dGVybmFsSXRlbVR5cGUpLAogICAgICAgIFNlY0l0ZW1JbXBvcnRFeHBvcnRGbGFncywKICAgICAgICBQT0lOVEVSKFNlY0l0ZW1JbXBvcnRFeHBvcnRLZXlQYXJhbWV0ZXJzKSwKICAgICAgICBTZWNLZXljaGFpblJlZiwKICAgICAgICBQT0lOVEVSKENGQXJyYXlSZWYpLAogICAgXQogICAgU2VjdXJpdHkuU2VjSXRlbUltcG9ydC5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUdldFR5cGVJRC5hcmd0eXBlcyA9IFtdCiAgICBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUdldFR5cGVJRC5yZXN0eXBlID0gQ0ZUeXBlSUQKCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eUdldFR5cGVJRC5hcmd0eXBlcyA9IFtdCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eUdldFR5cGVJRC5yZXN0eXBlID0gQ0ZUeXBlSUQKCiAgICBTZWN1cml0eS5TZWNLZXlHZXRUeXBlSUQuYXJndHlwZXMgPSBbXQogICAgU2VjdXJpdHkuU2VjS2V5R2V0VHlwZUlELnJlc3R5cGUgPSBDRlR5cGVJRAoKICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ3JlYXRlV2l0aERhdGEuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgQ0ZEYXRhUmVmCiAgICBdCiAgICBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUNyZWF0ZVdpdGhEYXRhLnJlc3R5cGUgPSBTZWNDZXJ0aWZpY2F0ZVJlZgoKICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ29weURhdGEuYXJndHlwZXMgPSBbCiAgICAgICAgU2VjQ2VydGlmaWNhdGVSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ29weURhdGEucmVzdHlwZSA9IENGRGF0YVJlZgoKICAgIFNlY3VyaXR5LlNlY0NvcHlFcnJvck1lc3NhZ2VTdHJpbmcuYXJndHlwZXMgPSBbCiAgICAgICAgT1NTdGF0dXMsCiAgICAgICAgY192b2lkX3AKICAgIF0KICAgIFNlY3VyaXR5LlNlY0NvcHlFcnJvck1lc3NhZ2VTdHJpbmcucmVzdHlwZSA9IENGU3RyaW5nUmVmCgogICAgU2VjdXJpdHkuU2VjSWRlbnRpdHlDcmVhdGVXaXRoQ2VydGlmaWNhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZUeXBlUmVmLAogICAgICAgIFNlY0NlcnRpZmljYXRlUmVmLAogICAgICAgIFBPSU5URVIoU2VjSWRlbnRpdHlSZWYpCiAgICBdCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eUNyZWF0ZVdpdGhDZXJ0aWZpY2F0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNLZXljaGFpbkNyZWF0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBjX3VpbnQzMiwKICAgICAgICBjX3ZvaWRfcCwKICAgICAgICBCb29sZWFuLAogICAgICAgIGNfdm9pZF9wLAogICAgICAgIFBPSU5URVIoU2VjS2V5Y2hhaW5SZWYpCiAgICBdCiAgICBTZWN1cml0eS5TZWNLZXljaGFpbkNyZWF0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNLZXljaGFpbkRlbGV0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNLZXljaGFpblJlZgogICAgXQogICAgU2VjdXJpdHkuU2VjS2V5Y2hhaW5EZWxldGUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjUEtDUzEySW1wb3J0LmFyZ3R5cGVzID0gWwogICAgICAgIENGRGF0YVJlZiwKICAgICAgICBDRkRpY3Rpb25hcnlSZWYsCiAgICAgICAgUE9JTlRFUihDRkFycmF5UmVmKQogICAgXQogICAgU2VjdXJpdHkuU2VjUEtDUzEySW1wb3J0LnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNTTFJlYWRGdW5jID0gQ0ZVTkNUWVBFKE9TU3RhdHVzLCBTU0xDb25uZWN0aW9uUmVmLCBjX3ZvaWRfcCwgUE9JTlRFUihjX3NpemVfdCkpCiAgICBTU0xXcml0ZUZ1bmMgPSBDRlVOQ1RZUEUoT1NTdGF0dXMsIFNTTENvbm5lY3Rpb25SZWYsIFBPSU5URVIoY19ieXRlKSwgUE9JTlRFUihjX3NpemVfdCkpCgogICAgU2VjdXJpdHkuU1NMU2V0SU9GdW5jcy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTFJlYWRGdW5jLAogICAgICAgIFNTTFdyaXRlRnVuYwogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0SU9GdW5jcy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRQZWVySUQuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBjX3NpemVfdAogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0UGVlcklELnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldENlcnRpZmljYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgQ0ZBcnJheVJlZgogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0Q2VydGlmaWNhdGUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0Q2VydGlmaWNhdGVBdXRob3JpdGllcy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIENGVHlwZVJlZiwKICAgICAgICBCb29sZWFuCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRDZXJ0aWZpY2F0ZUF1dGhvcml0aWVzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldENvbm5lY3Rpb24uYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBTU0xDb25uZWN0aW9uUmVmCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRDb25uZWN0aW9uLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldFBlZXJEb21haW5OYW1lLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgY19zaXplX3QKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldFBlZXJEb21haW5OYW1lLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEhhbmRzaGFrZS5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmCiAgICBdCiAgICBTZWN1cml0eS5TU0xIYW5kc2hha2UucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMUmVhZC5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIGNfc2l6ZV90LAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xSZWFkLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFdyaXRlLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgY19zaXplX3QsCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTFdyaXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTENsb3NlLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNTTENsb3NlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldE51bWJlclN1cHBvcnRlZENpcGhlcnMuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKGNfc2l6ZV90KQogICAgXQogICAgU2VjdXJpdHkuU1NMR2V0TnVtYmVyU3VwcG9ydGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXRTdXBwb3J0ZWRDaXBoZXJzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTU0xDaXBoZXJTdWl0ZSksCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldFN1cHBvcnRlZENpcGhlcnMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0RW5hYmxlZENpcGhlcnMuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNTTENpcGhlclN1aXRlKSwKICAgICAgICBjX3NpemVfdAogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0RW5hYmxlZENpcGhlcnMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMR2V0TnVtYmVyRW5hYmxlZENpcGhlcnMuYXJndHlwZSA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXROdW1iZXJFbmFibGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXRFbmFibGVkQ2lwaGVycy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU1NMQ2lwaGVyU3VpdGUpLAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXRFbmFibGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXROZWdvdGlhdGVkQ2lwaGVyLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTU0xDaXBoZXJTdWl0ZSkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldE5lZ290aWF0ZWRDaXBoZXIucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMR2V0TmVnb3RpYXRlZFByb3RvY29sVmVyc2lvbi5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU1NMUHJvdG9jb2wpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXROZWdvdGlhdGVkUHJvdG9jb2xWZXJzaW9uLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTENvcHlQZWVyVHJ1c3QuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNlY1RydXN0UmVmKQogICAgXQogICAgU2VjdXJpdHkuU1NMQ29weVBlZXJUcnVzdC5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlcy5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNUcnVzdFJlZiwKICAgICAgICBDRkFycmF5UmVmCiAgICBdCiAgICBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlcy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlc09ubHkuYXJnc3R5cGVzID0gWwogICAgICAgIFNlY1RydXN0UmVmLAogICAgICAgIEJvb2xlYW4KICAgIF0KICAgIFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzT25seS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNUcnVzdEV2YWx1YXRlLmFyZ3R5cGVzID0gWwogICAgICAgIFNlY1RydXN0UmVmLAogICAgICAgIFBPSU5URVIoU2VjVHJ1c3RSZXN1bHRUeXBlKQogICAgXQogICAgU2VjdXJpdHkuU2VjVHJ1c3RFdmFsdWF0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNUcnVzdEdldENlcnRpZmljYXRlQ291bnQuYXJndHlwZXMgPSBbCiAgICAgICAgU2VjVHJ1c3RSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVDb3VudC5yZXN0eXBlID0gQ0ZJbmRleAoKICAgIFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4LmFyZ3R5cGVzID0gWwogICAgICAgIFNlY1RydXN0UmVmLAogICAgICAgIENGSW5kZXgKICAgIF0KICAgIFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4LnJlc3R5cGUgPSBTZWNDZXJ0aWZpY2F0ZVJlZgoKICAgIFNlY3VyaXR5LlNTTENyZWF0ZUNvbnRleHQuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgU1NMUHJvdG9jb2xTaWRlLAogICAgICAgIFNTTENvbm5lY3Rpb25UeXBlCiAgICBdCiAgICBTZWN1cml0eS5TU0xDcmVhdGVDb250ZXh0LnJlc3R5cGUgPSBTU0xDb250ZXh0UmVmCgogICAgU2VjdXJpdHkuU1NMU2V0U2Vzc2lvbk9wdGlvbi5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTFNlc3Npb25PcHRpb24sCiAgICAgICAgQm9vbGVhbgogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0U2Vzc2lvbk9wdGlvbi5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NaW4uYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBTU0xQcm90b2NvbAogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWluLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1heC5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTFByb3RvY29sCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NYXgucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjQ29weUVycm9yTWVzc2FnZVN0cmluZy5hcmd0eXBlcyA9IFsKICAgICAgICBPU1N0YXR1cywKICAgICAgICBjX3ZvaWRfcAogICAgXQogICAgU2VjdXJpdHkuU2VjQ29weUVycm9yTWVzc2FnZVN0cmluZy5yZXN0eXBlID0gQ0ZTdHJpbmdSZWYKCiAgICBTZWN1cml0eS5TU0xSZWFkRnVuYyA9IFNTTFJlYWRGdW5jCiAgICBTZWN1cml0eS5TU0xXcml0ZUZ1bmMgPSBTU0xXcml0ZUZ1bmMKICAgIFNlY3VyaXR5LlNTTENvbnRleHRSZWYgPSBTU0xDb250ZXh0UmVmCiAgICBTZWN1cml0eS5TU0xQcm90b2NvbCA9IFNTTFByb3RvY29sCiAgICBTZWN1cml0eS5TU0xDaXBoZXJTdWl0ZSA9IFNTTENpcGhlclN1aXRlCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eVJlZiA9IFNlY0lkZW50aXR5UmVmCiAgICBTZWN1cml0eS5TZWNLZXljaGFpblJlZiA9IFNlY0tleWNoYWluUmVmCiAgICBTZWN1cml0eS5TZWNUcnVzdFJlZiA9IFNlY1RydXN0UmVmCiAgICBTZWN1cml0eS5TZWNUcnVzdFJlc3VsdFR5cGUgPSBTZWNUcnVzdFJlc3VsdFR5cGUKICAgIFNlY3VyaXR5LlNlY0V4dGVybmFsRm9ybWF0ID0gU2VjRXh0ZXJuYWxGb3JtYXQKICAgIFNlY3VyaXR5Lk9TU3RhdHVzID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5rU2VjSW1wb3J0RXhwb3J0UGFzc3BocmFzZSA9IENGU3RyaW5nUmVmLmluX2RsbCgKICAgICAgICBTZWN1cml0eSwgJ2tTZWNJbXBvcnRFeHBvcnRQYXNzcGhyYXNlJwogICAgKQogICAgU2VjdXJpdHkua1NlY0ltcG9ydEl0ZW1JZGVudGl0eSA9IENGU3RyaW5nUmVmLmluX2RsbCgKICAgICAgICBTZWN1cml0eSwgJ2tTZWNJbXBvcnRJdGVtSWRlbnRpdHknCiAgICApCgogICAgIyBDb3JlRm91bmRhdGlvbiB0aW1lIQogICAgQ29yZUZvdW5kYXRpb24uQ0ZSZXRhaW4uYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZUeXBlUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRlJldGFpbi5yZXN0eXBlID0gQ0ZUeXBlUmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlLmFyZ3R5cGVzID0gWwogICAgICAgIENGVHlwZVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlLnJlc3R5cGUgPSBOb25lCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZHZXRUeXBlSUQuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZUeXBlUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkdldFR5cGVJRC5yZXN0eXBlID0gQ0ZUeXBlSUQKCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIENGU3RyaW5nRW5jb2RpbmcKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcucmVzdHlwZSA9IENGU3RyaW5nUmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyLmFyZ3R5cGVzID0gWwogICAgICAgIENGU3RyaW5nUmVmLAogICAgICAgIENGU3RyaW5nRW5jb2RpbmcKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZ1B0ci5yZXN0eXBlID0gY19jaGFyX3AKCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmcuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZTdHJpbmdSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgQ0ZJbmRleCwKICAgICAgICBDRlN0cmluZ0VuY29kaW5nCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmcucmVzdHlwZSA9IGNfYm9vbAoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUNyZWF0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBDRkluZGV4CiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkRhdGFDcmVhdGUucmVzdHlwZSA9IENGRGF0YVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldExlbmd0aC5hcmd0eXBlcyA9IFsKICAgICAgICBDRkRhdGFSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldExlbmd0aC5yZXN0eXBlID0gQ0ZJbmRleAoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldEJ5dGVQdHIuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZEYXRhUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkRhdGFHZXRCeXRlUHRyLnJlc3R5cGUgPSBjX3ZvaWRfcAoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUNyZWF0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBQT0lOVEVSKENGVHlwZVJlZiksCiAgICAgICAgUE9JTlRFUihDRlR5cGVSZWYpLAogICAgICAgIENGSW5kZXgsCiAgICAgICAgQ0ZEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAogICAgICAgIENGRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkRpY3Rpb25hcnlDcmVhdGUucmVzdHlwZSA9IENGRGljdGlvbmFyeVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUdldFZhbHVlLmFyZ3R5cGVzID0gWwogICAgICAgIENGRGljdGlvbmFyeVJlZiwKICAgICAgICBDRlR5cGVSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUdldFZhbHVlLnJlc3R5cGUgPSBDRlR5cGVSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIFBPSU5URVIoQ0ZUeXBlUmVmKSwKICAgICAgICBDRkluZGV4LAogICAgICAgIENGQXJyYXlDYWxsQmFja3MsCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlLnJlc3R5cGUgPSBDRkFycmF5UmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUNyZWF0ZU11dGFibGUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgQ0ZJbmRleCwKICAgICAgICBDRkFycmF5Q2FsbEJhY2tzCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlTXV0YWJsZS5yZXN0eXBlID0gQ0ZNdXRhYmxlQXJyYXlSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5QXBwZW5kVmFsdWUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWYsCiAgICAgICAgY192b2lkX3AKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlBcHBlbmRWYWx1ZS5yZXN0eXBlID0gTm9uZQoKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRDb3VudC5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFycmF5UmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0Q291bnQucmVzdHlwZSA9IENGSW5kZXgKCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0VmFsdWVBdEluZGV4LmFyZ3R5cGVzID0gWwogICAgICAgIENGQXJyYXlSZWYsCiAgICAgICAgQ0ZJbmRleAogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUdldFZhbHVlQXRJbmRleC5yZXN0eXBlID0gY192b2lkX3AKCiAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0ID0gQ0ZBbGxvY2F0b3JSZWYuaW5fZGxsKAogICAgICAgIENvcmVGb3VuZGF0aW9uLCAna0NGQWxsb2NhdG9yRGVmYXVsdCcKICAgICkKICAgIENvcmVGb3VuZGF0aW9uLmtDRlR5cGVBcnJheUNhbGxCYWNrcyA9IGNfdm9pZF9wLmluX2RsbChDb3JlRm91bmRhdGlvbiwgJ2tDRlR5cGVBcnJheUNhbGxCYWNrcycpCiAgICBDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcyA9IGNfdm9pZF9wLmluX2RsbCgKICAgICAgICBDb3JlRm91bmRhdGlvbiwgJ2tDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzJwogICAgKQogICAgQ29yZUZvdW5kYXRpb24ua0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyA9IGNfdm9pZF9wLmluX2RsbCgKICAgICAgICBDb3JlRm91bmRhdGlvbiwgJ2tDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MnCiAgICApCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZUeXBlUmVmID0gQ0ZUeXBlUmVmCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5UmVmID0gQ0ZBcnJheVJlZgogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdSZWYgPSBDRlN0cmluZ1JlZgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5UmVmID0gQ0ZEaWN0aW9uYXJ5UmVmCgpleGNlcHQgKEF0dHJpYnV0ZUVycm9yKToKICAgIHJhaXNlIEltcG9ydEVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgY3R5cGVzJykKCgpjbGFzcyBDRkNvbnN0KG9iamVjdCk6CiAgICAiIiIKICAgIEEgY2xhc3Mgb2JqZWN0IHRoYXQgYWN0cyBhcyBlc3NlbnRpYWxseSBhIG5hbWVzcGFjZSBmb3IgQ29yZUZvdW5kYXRpb24KICAgIGNvbnN0YW50cy4KICAgICIiIgogICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4ID0gQ0ZTdHJpbmdFbmNvZGluZygweDA4MDAwMTAwKQoKCmNsYXNzIFNlY3VyaXR5Q29uc3Qob2JqZWN0KToKICAgICIiIgogICAgQSBjbGFzcyBvYmplY3QgdGhhdCBhY3RzIGFzIGVzc2VudGlhbGx5IGEgbmFtZXNwYWNlIGZvciBTZWN1cml0eSBjb25zdGFudHMuCiAgICAiIiIKICAgIGtTU0xTZXNzaW9uT3B0aW9uQnJlYWtPblNlcnZlckF1dGggPSAwCgogICAga1NTTFByb3RvY29sMiA9IDEKICAgIGtTU0xQcm90b2NvbDMgPSAyCiAgICBrVExTUHJvdG9jb2wxID0gNAogICAga1RMU1Byb3RvY29sMTEgPSA3CiAgICBrVExTUHJvdG9jb2wxMiA9IDgKCiAgICBrU1NMQ2xpZW50U2lkZSA9IDEKICAgIGtTU0xTdHJlYW1UeXBlID0gMAoKICAgIGtTZWNGb3JtYXRQRU1TZXF1ZW5jZSA9IDEwCgogICAga1NlY1RydXN0UmVzdWx0SW52YWxpZCA9IDAKICAgIGtTZWNUcnVzdFJlc3VsdFByb2NlZWQgPSAxCiAgICAjIFRoaXMgZ2FwIGlzIHByZXNlbnQgb24gcHVycG9zZTogdGhpcyB3YXMga1NlY1RydXN0UmVzdWx0Q29uZmlybSwgd2hpY2gKICAgICMgaXMgZGVwcmVjYXRlZC4KICAgIGtTZWNUcnVzdFJlc3VsdERlbnkgPSAzCiAgICBrU2VjVHJ1c3RSZXN1bHRVbnNwZWNpZmllZCA9IDQKICAgIGtTZWNUcnVzdFJlc3VsdFJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlID0gNQogICAga1NlY1RydXN0UmVzdWx0RmF0YWxUcnVzdEZhaWx1cmUgPSA2CiAgICBrU2VjVHJ1c3RSZXN1bHRPdGhlckVycm9yID0gNwoKICAgIGVyclNTTFByb3RvY29sID0gLTk4MDAKICAgIGVyclNTTFdvdWxkQmxvY2sgPSAtOTgwMwogICAgZXJyU1NMQ2xvc2VkR3JhY2VmdWwgPSAtOTgwNQogICAgZXJyU1NMQ2xvc2VkTm9Ob3RpZnkgPSAtOTgxNgogICAgZXJyU1NMQ2xvc2VkQWJvcnQgPSAtOTgwNgoKICAgIGVyclNTTFhDZXJ0Q2hhaW5JbnZhbGlkID0gLTk4MDcKICAgIGVyclNTTENyeXB0byA9IC05ODA5CiAgICBlcnJTU0xJbnRlcm5hbCA9IC05ODEwCiAgICBlcnJTU0xDZXJ0RXhwaXJlZCA9IC05ODE0CiAgICBlcnJTU0xDZXJ0Tm90WWV0VmFsaWQgPSAtOTgxNQogICAgZXJyU1NMVW5rbm93blJvb3RDZXJ0ID0gLTk4MTIKICAgIGVyclNTTE5vUm9vdENlcnQgPSAtOTgxMwogICAgZXJyU1NMSG9zdE5hbWVNaXNtYXRjaCA9IC05ODQzCiAgICBlcnJTU0xQZWVySGFuZHNoYWtlRmFpbCA9IC05ODI0CiAgICBlcnJTU0xQZWVyVXNlckNhbmNlbGxlZCA9IC05ODM5CiAgICBlcnJTU0xXZWFrUGVlckVwaGVtZXJhbERIS2V5ID0gLTk4NTAKICAgIGVyclNTTFNlcnZlckF1dGhDb21wbGV0ZWQgPSAtOTg0MQogICAgZXJyU1NMUmVjb3JkT3ZlcmZsb3cgPSAtOTg0NwoKICAgIGVyclNlY1ZlcmlmeUZhaWxlZCA9IC02NzgwOAogICAgZXJyU2VjTm9UcnVzdFNldHRpbmdzID0gLTI1MjYzCiAgICBlcnJTZWNJdGVtTm90Rm91bmQgPSAtMjUzMDAKICAgIGVyclNlY0ludmFsaWRUcnVzdFNldHRpbmdzID0gLTI1MjYyCgogICAgIyBDaXBoZXIgc3VpdGVzLiBXZSBvbmx5IHBpY2sgdGhlIG9uZXMgb3VyIGRlZmF1bHQgY2lwaGVyIHN0cmluZyBhbGxvd3MuCiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweEMwMkMKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweEMwMzAKICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4QzAyQgogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4QzAyRgogICAgVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweDAwQTMKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ID0gMHgwMDlGCiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4MDBBMgogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgPSAweDAwOUUKICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTM4NCA9IDB4QzAyNAogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTM4NCA9IDB4QzAyOAogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHhDMDBBCiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHhDMDE0CiAgICBUTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiA9IDB4MDA2QgogICAgVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYgPSAweDAwNkEKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHgwMDM5CiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQSA9IDB4MDAzOAogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHhDMDIzCiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHhDMDI3CiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweEMwMDkKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweEMwMTMKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHgwMDY3CiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4MDA0MAogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweDAwMzMKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBID0gMHgwMDMyCiAgICBUTFNfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ID0gMHgwMDlECiAgICBUTFNfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHgwMDlDCiAgICBUTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2ID0gMHgwMDNECiAgICBUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHgwMDNDCiAgICBUTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHgwMDM1CiAgICBUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBID0gMHgwMDJGCiAgICBUTFNfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHgxMzAxCiAgICBUTFNfQUVTXzI1Nl9HQ01fU0hBMzg0ID0gMHgxMzAyCiAgICBUTFNfQ0hBQ0hBMjBfUE9MWTEzMDVfU0hBMjU2ID0gMHgxMzAzClBLAwQUAAAAAAAAACEABK/ckB4vAAAeLwAAVgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvbG93X2xldmVsLnB5IiIiCkxvdy1sZXZlbCBoZWxwZXJzIGZvciB0aGUgU2VjdXJlVHJhbnNwb3J0IGJpbmRpbmdzLgoKVGhlc2UgYXJlIFB5dGhvbiBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGhpZ2gtbGV2ZWwgQVBJcwpidXQgYXJlIG5lY2Vzc2FyeSB0byBnZXQgdGhlbSB0byB3b3JrLiBUaGV5IGluY2x1ZGUgYSB3aG9sZSBidW5jaCBvZiBsb3ctbGV2ZWwKQ29yZUZvdW5kYXRpb24gbWVzc2luZyBhYm91dCBhbmQgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb25jZXJucyBpbiB0aGlzIG1vZHVsZQphcmUgYWxtb3N0IGVudGlyZWx5IGFib3V0IHRyeWluZyB0byBhdm9pZCBtZW1vcnkgbGVha3MgYW5kIHByb3ZpZGluZwphcHByb3ByaWF0ZSBhbmQgdXNlZnVsIGFzc2lzdGFuY2UgdG8gdGhlIGhpZ2hlci1sZXZlbCBjb2RlLgoiIiIKaW1wb3J0IGJhc2U2NAppbXBvcnQgY3R5cGVzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCmltcG9ydCBvcwppbXBvcnQgc3NsCmltcG9ydCB0ZW1wZmlsZQoKZnJvbSAuYmluZGluZ3MgaW1wb3J0IFNlY3VyaXR5LCBDb3JlRm91bmRhdGlvbiwgQ0ZDb25zdAoKCiMgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMgdXNlZCB0byBncmFiIFBFTSBkYXRhIG91dCBvZiBhIFBFTSBidW5kbGUuCl9QRU1fQ0VSVFNfUkUgPSByZS5jb21waWxlKAogICAgYiItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiguKj8pXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIiwgcmUuRE9UQUxMCikKCgpkZWYgX2NmX2RhdGFfZnJvbV9ieXRlcyhieXRlc3RyaW5nKToKICAgICIiIgogICAgR2l2ZW4gYSBieXRlc3RyaW5nLCBjcmVhdGUgYSBDRkRhdGEgb2JqZWN0IGZyb20gaXQuIFRoaXMgQ0ZEYXRhIG9iamVjdCBtdXN0CiAgICBiZSBDRlJlbGVhc2VkIGJ5IHRoZSBjYWxsZXIuCiAgICAiIiIKICAgIHJldHVybiBDb3JlRm91bmRhdGlvbi5DRkRhdGFDcmVhdGUoCiAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwgYnl0ZXN0cmluZywgbGVuKGJ5dGVzdHJpbmcpCiAgICApCgoKZGVmIF9jZl9kaWN0aW9uYXJ5X2Zyb21fdHVwbGVzKHR1cGxlcyk6CiAgICAiIiIKICAgIEdpdmVuIGEgbGlzdCBvZiBQeXRob24gdHVwbGVzLCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBDRkRpY3Rpb25hcnkuCiAgICAiIiIKICAgIGRpY3Rpb25hcnlfc2l6ZSA9IGxlbih0dXBsZXMpCgogICAgIyBXZSBuZWVkIHRvIGdldCB0aGUgZGljdGlvbmFyeSBrZXlzIGFuZCB2YWx1ZXMgb3V0IGluIHRoZSBzYW1lIG9yZGVyLgogICAga2V5cyA9ICh0WzBdIGZvciB0IGluIHR1cGxlcykKICAgIHZhbHVlcyA9ICh0WzFdIGZvciB0IGluIHR1cGxlcykKICAgIGNmX2tleXMgPSAoQ29yZUZvdW5kYXRpb24uQ0ZUeXBlUmVmICogZGljdGlvbmFyeV9zaXplKSgqa2V5cykKICAgIGNmX3ZhbHVlcyA9IChDb3JlRm91bmRhdGlvbi5DRlR5cGVSZWYgKiBkaWN0aW9uYXJ5X3NpemUpKCp2YWx1ZXMpCgogICAgcmV0dXJuIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUNyZWF0ZSgKICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAogICAgICAgIGNmX2tleXMsCiAgICAgICAgY2ZfdmFsdWVzLAogICAgICAgIGRpY3Rpb25hcnlfc2l6ZSwKICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzLAogICAgKQoKCmRlZiBfY2Zfc3RyaW5nX3RvX3VuaWNvZGUodmFsdWUpOgogICAgIiIiCiAgICBDcmVhdGVzIGEgVW5pY29kZSBzdHJpbmcgZnJvbSBhIENGU3RyaW5nIG9iamVjdC4gVXNlZCBlbnRpcmVseSBmb3IgZXJyb3IKICAgIHJlcG9ydGluZy4KCiAgICBZZXMsIGl0IGFubm95cyBtZSBxdWl0ZSBhIGxvdCB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdGhpcyBjb21wbGV4LgogICAgIiIiCiAgICB2YWx1ZV9hc192b2lkX3AgPSBjdHlwZXMuY2FzdCh2YWx1ZSwgY3R5cGVzLlBPSU5URVIoY3R5cGVzLmNfdm9pZF9wKSkKCiAgICBzdHJpbmcgPSBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmdQdHIoCiAgICAgICAgdmFsdWVfYXNfdm9pZF9wLAogICAgICAgIENGQ29uc3Qua0NGU3RyaW5nRW5jb2RpbmdVVEY4CiAgICApCiAgICBpZiBzdHJpbmcgaXMgTm9uZToKICAgICAgICBidWZmZXIgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIoMTAyNCkKICAgICAgICByZXN1bHQgPSBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmcoCiAgICAgICAgICAgIHZhbHVlX2FzX3ZvaWRfcCwKICAgICAgICAgICAgYnVmZmVyLAogICAgICAgICAgICAxMDI0LAogICAgICAgICAgICBDRkNvbnN0LmtDRlN0cmluZ0VuY29kaW5nVVRGOAogICAgICAgICkKICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICByYWlzZSBPU0Vycm9yKCdFcnJvciBjb3B5aW5nIEMgc3RyaW5nIGZyb20gQ0ZTdHJpbmdSZWYnKQogICAgICAgIHN0cmluZyA9IGJ1ZmZlci52YWx1ZQogICAgaWYgc3RyaW5nIGlzIG5vdCBOb25lOgogICAgICAgIHN0cmluZyA9IHN0cmluZy5kZWNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBzdHJpbmcKCgpkZWYgX2Fzc2VydF9ub19lcnJvcihlcnJvciwgZXhjZXB0aW9uX2NsYXNzPU5vbmUpOgogICAgIiIiCiAgICBDaGVja3MgdGhlIHJldHVybiBjb2RlIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHRvCiAgICByZXBvcnQKICAgICIiIgogICAgaWYgZXJyb3IgPT0gMDoKICAgICAgICByZXR1cm4KCiAgICBjZl9lcnJvcl9zdHJpbmcgPSBTZWN1cml0eS5TZWNDb3B5RXJyb3JNZXNzYWdlU3RyaW5nKGVycm9yLCBOb25lKQogICAgb3V0cHV0ID0gX2NmX3N0cmluZ190b191bmljb2RlKGNmX2Vycm9yX3N0cmluZykKICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZl9lcnJvcl9zdHJpbmcpCgogICAgaWYgb3V0cHV0IGlzIE5vbmUgb3Igb3V0cHV0ID09IHUnJzoKICAgICAgICBvdXRwdXQgPSB1J09TU3RhdHVzICVzJyAlIGVycm9yCgogICAgaWYgZXhjZXB0aW9uX2NsYXNzIGlzIE5vbmU6CiAgICAgICAgZXhjZXB0aW9uX2NsYXNzID0gc3NsLlNTTEVycm9yCgogICAgcmFpc2UgZXhjZXB0aW9uX2NsYXNzKG91dHB1dCkKCgpkZWYgX2NlcnRfYXJyYXlfZnJvbV9wZW0ocGVtX2J1bmRsZSk6CiAgICAiIiIKICAgIEdpdmVuIGEgYnVuZGxlIG9mIGNlcnRzIGluIFBFTSBmb3JtYXQsIHR1cm5zIHRoZW0gaW50byBhIENGQXJyYXkgb2YgY2VydHMKICAgIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBjZXJ0IGNoYWluLgogICAgIiIiCiAgICBkZXJfY2VydHMgPSBbCiAgICAgICAgYmFzZTY0LmI2NGRlY29kZShtYXRjaC5ncm91cCgxKSkKICAgICAgICBmb3IgbWF0Y2ggaW4gX1BFTV9DRVJUU19SRS5maW5kaXRlcihwZW1fYnVuZGxlKQogICAgXQogICAgaWYgbm90IGRlcl9jZXJ0czoKICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIk5vIHJvb3QgY2VydGlmaWNhdGVzIHNwZWNpZmllZCIpCgogICAgY2VydF9hcnJheSA9IENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGVNdXRhYmxlKAogICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQsCiAgICAgICAgMCwKICAgICAgICBjdHlwZXMuYnlyZWYoQ29yZUZvdW5kYXRpb24ua0NGVHlwZUFycmF5Q2FsbEJhY2tzKQogICAgKQogICAgaWYgbm90IGNlcnRfYXJyYXk6CiAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ISIpCgogICAgdHJ5OgogICAgICAgIGZvciBkZXJfYnl0ZXMgaW4gZGVyX2NlcnRzOgogICAgICAgICAgICBjZXJ0ZGF0YSA9IF9jZl9kYXRhX2Zyb21fYnl0ZXMoZGVyX2J5dGVzKQogICAgICAgICAgICBpZiBub3QgY2VydGRhdGE6CiAgICAgICAgICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkhIikKICAgICAgICAgICAgY2VydCA9IFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ3JlYXRlV2l0aERhdGEoCiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LCBjZXJ0ZGF0YQogICAgICAgICAgICApCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0ZGF0YSkKICAgICAgICAgICAgaWYgbm90IGNlcnQ6CiAgICAgICAgICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIlVuYWJsZSB0byBidWlsZCBjZXJ0IG9iamVjdCEiKQoKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUFwcGVuZFZhbHVlKGNlcnRfYXJyYXksIGNlcnQpCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0KQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAjIFdlIG5lZWQgdG8gZnJlZSB0aGUgYXJyYXkgYmVmb3JlIHRoZSBleGNlcHRpb24gYnViYmxlcyBmdXJ0aGVyLgogICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoYXQgaWYgYW4gZXJyb3Igb2NjdXJzOiBvdGhlcndpc2UsIHRoZSBjYWxsZXIKICAgICAgICAjIHNob3VsZCBmcmVlLgogICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0X2FycmF5KQoKICAgIHJldHVybiBjZXJ0X2FycmF5CgoKZGVmIF9pc19jZXJ0KGl0ZW0pOgogICAgIiIiCiAgICBSZXR1cm5zIFRydWUgaWYgYSBnaXZlbiBDRlR5cGVSZWYgaXMgYSBjZXJ0aWZpY2F0ZS4KICAgICIiIgogICAgZXhwZWN0ZWQgPSBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUdldFR5cGVJRCgpCiAgICByZXR1cm4gQ29yZUZvdW5kYXRpb24uQ0ZHZXRUeXBlSUQoaXRlbSkgPT0gZXhwZWN0ZWQKCgpkZWYgX2lzX2lkZW50aXR5KGl0ZW0pOgogICAgIiIiCiAgICBSZXR1cm5zIFRydWUgaWYgYSBnaXZlbiBDRlR5cGVSZWYgaXMgYW4gaWRlbnRpdHkuCiAgICAiIiIKICAgIGV4cGVjdGVkID0gU2VjdXJpdHkuU2VjSWRlbnRpdHlHZXRUeXBlSUQoKQogICAgcmV0dXJuIENvcmVGb3VuZGF0aW9uLkNGR2V0VHlwZUlEKGl0ZW0pID09IGV4cGVjdGVkCgoKZGVmIF90ZW1wb3Jhcnlfa2V5Y2hhaW4oKToKICAgICIiIgogICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgdGVtcG9yYXJ5IE1hYyBrZXljaGFpbiB0aGF0IHdlIGNhbiB1c2UgdG8gd29yayB3aXRoCiAgICBjcmVkZW50aWFscy4gVGhpcyBrZXljaGFpbiB1c2VzIGEgb25lLXRpbWUgcGFzc3dvcmQgYW5kIGEgdGVtcG9yYXJ5IGZpbGUgdG8KICAgIHN0b3JlIHRoZSBkYXRhLiBXZSBleHBlY3QgdG8gaGF2ZSBvbmUga2V5Y2hhaW4gcGVyIHNvY2tldC4gVGhlIHJldHVybmVkCiAgICBTZWNLZXljaGFpblJlZiBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIGluY2x1ZGluZyBjYWxsaW5nCiAgICBTZWNLZXljaGFpbkRlbGV0ZS4KCiAgICBSZXR1cm5zIGEgdHVwbGUgb2YgdGhlIFNlY0tleWNoYWluUmVmIGFuZCB0aGUgcGF0aCB0byB0aGUgdGVtcG9yYXJ5CiAgICBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBpdC4KICAgICIiIgogICAgIyBVbmZvcnR1bmF0ZWx5LCBTZWNLZXljaGFpbkNyZWF0ZSByZXF1aXJlcyBhIHBhdGggdG8gYSBrZXljaGFpbi4gVGhpcwogICAgIyBtZWFucyB3ZSBjYW5ub3QgdXNlIG1rc3RlbXAgdG8gdXNlIGEgZ2VuZXJpYyB0ZW1wb3JhcnkgZmlsZS4gSW5zdGVhZCwKICAgICMgd2UncmUgZ29pbmcgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBhbmQgYSBmaWxlbmFtZSB0byB1c2UgdGhlcmUuCiAgICAjIFRoaXMgZmlsZW5hbWUgd2lsbCBiZSA4IHJhbmRvbSBieXRlcyBleHBhbmRlZCBpbnRvIGJhc2U2NC4gV2UgYWxzbyBuZWVkCiAgICAjIHNvbWUgcmFuZG9tIGJ5dGVzIHRvIHBhc3N3b3JkLXByb3RlY3QgdGhlIGtleWNoYWluIHdlJ3JlIGNyZWF0aW5nLCBzbyB3ZQogICAgIyBhc2sgZm9yIDQwIHJhbmRvbSBieXRlcy4KICAgIHJhbmRvbV9ieXRlcyA9IG9zLnVyYW5kb20oNDApCiAgICBmaWxlbmFtZSA9IGJhc2U2NC5iNjRlbmNvZGUocmFuZG9tX2J5dGVzWzo4XSkuZGVjb2RlKCd1dGYtOCcpCiAgICBwYXNzd29yZCA9IGJhc2U2NC5iNjRlbmNvZGUocmFuZG9tX2J5dGVzWzg6XSkgICMgTXVzdCBiZSB2YWxpZCBVVEYtOAogICAgdGVtcGRpcmVjdG9yeSA9IHRlbXBmaWxlLm1rZHRlbXAoKQoKICAgIGtleWNoYWluX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcGRpcmVjdG9yeSwgZmlsZW5hbWUpLmVuY29kZSgndXRmLTgnKQoKICAgICMgV2Ugbm93IHdhbnQgdG8gY3JlYXRlIHRoZSBrZXljaGFpbiBpdHNlbGYuCiAgICBrZXljaGFpbiA9IFNlY3VyaXR5LlNlY0tleWNoYWluUmVmKCkKICAgIHN0YXR1cyA9IFNlY3VyaXR5LlNlY0tleWNoYWluQ3JlYXRlKAogICAgICAgIGtleWNoYWluX3BhdGgsCiAgICAgICAgbGVuKHBhc3N3b3JkKSwKICAgICAgICBwYXNzd29yZCwKICAgICAgICBGYWxzZSwKICAgICAgICBOb25lLAogICAgICAgIGN0eXBlcy5ieXJlZihrZXljaGFpbikKICAgICkKICAgIF9hc3NlcnRfbm9fZXJyb3Ioc3RhdHVzKQoKICAgICMgSGF2aW5nIGNyZWF0ZWQgdGhlIGtleWNoYWluLCB3ZSB3YW50IHRvIHBhc3MgaXQgb2ZmIHRvIHRoZSBjYWxsZXIuCiAgICByZXR1cm4ga2V5Y2hhaW4sIHRlbXBkaXJlY3RvcnkKCgpkZWYgX2xvYWRfaXRlbXNfZnJvbV9maWxlKGtleWNoYWluLCBwYXRoKToKICAgICIiIgogICAgR2l2ZW4gYSBzaW5nbGUgZmlsZSwgbG9hZHMgYWxsIHRoZSB0cnVzdCBvYmplY3RzIGZyb20gaXQgaW50byBhcnJheXMgYW5kCiAgICB0aGUga2V5Y2hhaW4uCiAgICBSZXR1cm5zIGEgdHVwbGUgb2YgbGlzdHM6IHRoZSBmaXJzdCBsaXN0IGlzIGEgbGlzdCBvZiBpZGVudGl0aWVzLCB0aGUKICAgIHNlY29uZCBhIGxpc3Qgb2YgY2VydHMuCiAgICAiIiIKICAgIGNlcnRpZmljYXRlcyA9IFtdCiAgICBpZGVudGl0aWVzID0gW10KICAgIHJlc3VsdF9hcnJheSA9IE5vbmUKCiAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICByYXdfZmlsZWRhdGEgPSBmLnJlYWQoKQoKICAgIHRyeToKICAgICAgICBmaWxlZGF0YSA9IENvcmVGb3VuZGF0aW9uLkNGRGF0YUNyZWF0ZSgKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwKICAgICAgICAgICAgcmF3X2ZpbGVkYXRhLAogICAgICAgICAgICBsZW4ocmF3X2ZpbGVkYXRhKQogICAgICAgICkKICAgICAgICByZXN1bHRfYXJyYXkgPSBDb3JlRm91bmRhdGlvbi5DRkFycmF5UmVmKCkKICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TZWNJdGVtSW1wb3J0KAogICAgICAgICAgICBmaWxlZGF0YSwgICMgY2VydCBkYXRhCiAgICAgICAgICAgIE5vbmUsICAjIEZpbGVuYW1lLCBsZWF2aW5nIGl0IG91dCBmb3Igbm93CiAgICAgICAgICAgIE5vbmUsICAjIFdoYXQgdGhlIHR5cGUgb2YgdGhlIGZpbGUgaXMsIHdlIGRvbid0IGNhcmUKICAgICAgICAgICAgTm9uZSwgICMgd2hhdCdzIGluIHRoZSBmaWxlLCB3ZSBkb24ndCBjYXJlCiAgICAgICAgICAgIDAsICAjIGltcG9ydCBmbGFncwogICAgICAgICAgICBOb25lLCAgIyBrZXkgcGFyYW1zLCBjYW4gaW5jbHVkZSBwYXNzcGhyYXNlIGluIHRoZSBmdXR1cmUKICAgICAgICAgICAga2V5Y2hhaW4sICAjIFRoZSBrZXljaGFpbiB0byBpbnNlcnQgaW50bwogICAgICAgICAgICBjdHlwZXMuYnlyZWYocmVzdWx0X2FycmF5KSAgIyBSZXN1bHRzCiAgICAgICAgKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIEEgQ0ZBcnJheSBpcyBub3QgdmVyeSB1c2VmdWwgdG8gdXMgYXMgYW4gaW50ZXJtZWRpYXJ5CiAgICAgICAgIyByZXByZXNlbnRhdGlvbiwgc28gd2UgYXJlIGdvaW5nIHRvIGV4dHJhY3QgdGhlIG9iamVjdHMgd2Ugd2FudAogICAgICAgICMgYW5kIHRoZW4gZnJlZSB0aGUgYXJyYXkuIFdlIGRvbid0IG5lZWQgdG8ga2VlcCBob2xkIG9mIGtleXM6IHRoZQogICAgICAgICMga2V5Y2hhaW4gYWxyZWFkeSBoYXMgdGhlbSEKICAgICAgICByZXN1bHRfY291bnQgPSBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0Q291bnQocmVzdWx0X2FycmF5KQogICAgICAgIGZvciBpbmRleCBpbiByYW5nZShyZXN1bHRfY291bnQpOgogICAgICAgICAgICBpdGVtID0gQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUdldFZhbHVlQXRJbmRleCgKICAgICAgICAgICAgICAgIHJlc3VsdF9hcnJheSwgaW5kZXgKICAgICAgICAgICAgKQogICAgICAgICAgICBpdGVtID0gY3R5cGVzLmNhc3QoaXRlbSwgQ29yZUZvdW5kYXRpb24uQ0ZUeXBlUmVmKQoKICAgICAgICAgICAgaWYgX2lzX2NlcnQoaXRlbSk6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJldGFpbihpdGVtKQogICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzLmFwcGVuZChpdGVtKQogICAgICAgICAgICBlbGlmIF9pc19pZGVudGl0eShpdGVtKToKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmV0YWluKGl0ZW0pCiAgICAgICAgICAgICAgICBpZGVudGl0aWVzLmFwcGVuZChpdGVtKQogICAgZmluYWxseToKICAgICAgICBpZiByZXN1bHRfYXJyYXk6CiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShyZXN1bHRfYXJyYXkpCgogICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShmaWxlZGF0YSkKCiAgICByZXR1cm4gKGlkZW50aXRpZXMsIGNlcnRpZmljYXRlcykKCgpkZWYgX2xvYWRfY2xpZW50X2NlcnRfY2hhaW4oa2V5Y2hhaW4sICpwYXRocyk6CiAgICAiIiIKICAgIExvYWQgY2VydGlmaWNhdGVzIGFuZCBtYXliZSBrZXlzIGZyb20gYSBudW1iZXIgb2YgZmlsZXMuIEhhcyB0aGUgZW5kIGdvYWwKICAgIG9mIHJldHVybmluZyBhIENGQXJyYXkgY29udGFpbmluZyBvbmUgU2VjSWRlbnRpdHlSZWYsIGFuZCB0aGVuIHplcm8gb3IgbW9yZQogICAgU2VjQ2VydGlmaWNhdGVSZWYgb2JqZWN0cywgc3VpdGFibGUgZm9yIHVzZSBhcyBhIGNsaWVudCBjZXJ0aWZpY2F0ZSB0cnVzdAogICAgY2hhaW4uCiAgICAiIiIKICAgICMgT2ssIHRoZSBzdHJhdGVneS4KICAgICMKICAgICMgVGhpcyByZWxpZXMgb24ga25vd2luZyB0aGF0IG1hY09TIHdpbGwgbm90IGdpdmUgeW91IGEgU2VjSWRlbnRpdHlSZWYKICAgICMgdW5sZXNzIHlvdSBoYXZlIGltcG9ydGVkIGEga2V5IGludG8gYSBrZXljaGFpbi4gVGhpcyBpcyBhIHNvbWV3aGF0CiAgICAjIGFydGlmaWNpYWwgbGltaXRhdGlvbiBvZiBtYWNPUyAoZm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgbmVjZXNzYXJpbHkKICAgICMgYWZmZWN0IGlPUyksIGJ1dCB0aGVyZSBpcyBub3RoaW5nIGluc2lkZSBTZWN1cml0eS5mcmFtZXdvcmsgdGhhdCBsZXRzIHlvdQogICAgIyBnZXQgYSBTZWNJZGVudGl0eVJlZiB3aXRob3V0IGhhdmluZyBhIGtleSBpbiBhIGtleWNoYWluLgogICAgIwogICAgIyBTbyB0aGUgcG9saWN5IGhlcmUgaXMgd2UgdGFrZSBhbGwgdGhlIGZpbGVzIGFuZCBpdGVyYXRlIHRoZW0gaW4gb3JkZXIuCiAgICAjIEVhY2ggb25lIHdpbGwgdXNlIFNlY0l0ZW1JbXBvcnQgdG8gaGF2ZSBvbmUgb3IgbW9yZSBvYmplY3RzIGxvYWRlZCBmcm9tCiAgICAjIGl0LiBXZSB3aWxsIGFsc28gcG9pbnQgYXQgYSBrZXljaGFpbiB0aGF0IG1hY09TIGNhbiB1c2UgdG8gd29yayB3aXRoIHRoZQogICAgIyBwcml2YXRlIGtleS4KICAgICMKICAgICMgT25jZSB3ZSBoYXZlIGFsbCB0aGUgb2JqZWN0cywgd2UnbGwgY2hlY2sgd2hhdCB3ZSBhY3R1YWxseSBoYXZlLiBJZiB3ZQogICAgIyBhbHJlYWR5IGhhdmUgYSBTZWNJZGVudGl0eVJlZiBpbiBoYW5kLCBmYWI6IHdlJ2xsIHVzZSB0aGF0LiBPdGhlcndpc2UsCiAgICAjIHdlJ2xsIHRha2UgdGhlIGZpcnN0IGNlcnRpZmljYXRlICh3aGljaCB3ZSBhc3N1bWUgdG8gYmUgb3VyIGxlYWYpIGFuZAogICAgIyBhc2sgdGhlIGtleWNoYWluIHRvIGdpdmUgdXMgYSBTZWNJZGVudGl0eVJlZiB3aXRoIHRoYXQgY2VydCdzIGFzc29jaWF0ZWQKICAgICMga2V5LgogICAgIwogICAgIyBXZSdsbCB0aGVuIHJldHVybiBhIENGQXJyYXkgY29udGFpbmluZyB0aGUgdHJ1c3QgY2hhaW46IG9uZQogICAgIyBTZWNJZGVudGl0eVJlZiBhbmQgdGhlbiB6ZXJvLW9yLW1vcmUgU2VjQ2VydGlmaWNhdGVSZWYgb2JqZWN0cy4gVGhlCiAgICAjIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRoaXMgQ0ZBcnJheSB3aWxsIGJlIHdpdGggdGhlIGNhbGxlci4gVGhpcwogICAgIyBDRkFycmF5IG11c3QgcmVtYWluIGFsaXZlIGZvciB0aGUgZW50aXJlIGNvbm5lY3Rpb24sIHNvIGluIHByYWN0aWNlIGl0CiAgICAjIHdpbGwgYmUgc3RvcmVkIHdpdGggYSBzaW5nbGUgU1NMU29ja2V0LCBhbG9uZyB3aXRoIHRoZSByZWZlcmVuY2UgdG8gdGhlCiAgICAjIGtleWNoYWluLgogICAgY2VydGlmaWNhdGVzID0gW10KICAgIGlkZW50aXRpZXMgPSBbXQoKICAgICMgRmlsdGVyIG91dCBiYWQgcGF0aHMuCiAgICBwYXRocyA9IChwYXRoIGZvciBwYXRoIGluIHBhdGhzIGlmIHBhdGgpCgogICAgdHJ5OgogICAgICAgIGZvciBmaWxlX3BhdGggaW4gcGF0aHM6CiAgICAgICAgICAgIG5ld19pZGVudGl0aWVzLCBuZXdfY2VydHMgPSBfbG9hZF9pdGVtc19mcm9tX2ZpbGUoCiAgICAgICAgICAgICAgICBrZXljaGFpbiwgZmlsZV9wYXRoCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWRlbnRpdGllcy5leHRlbmQobmV3X2lkZW50aXRpZXMpCiAgICAgICAgICAgIGNlcnRpZmljYXRlcy5leHRlbmQobmV3X2NlcnRzKQoKICAgICAgICAjIE9rLCB3ZSBoYXZlIGV2ZXJ5dGhpbmcuIFRoZSBxdWVzdGlvbiBpczogZG8gd2UgaGF2ZSBhbiBpZGVudGl0eT8gSWYKICAgICAgICAjIG5vdCwgd2Ugd2FudCB0byBncmFiIG9uZSBmcm9tIHRoZSBmaXJzdCBjZXJ0IHdlIGhhdmUuCiAgICAgICAgaWYgbm90IGlkZW50aXRpZXM6CiAgICAgICAgICAgIG5ld19pZGVudGl0eSA9IFNlY3VyaXR5LlNlY0lkZW50aXR5UmVmKCkKICAgICAgICAgICAgc3RhdHVzID0gU2VjdXJpdHkuU2VjSWRlbnRpdHlDcmVhdGVXaXRoQ2VydGlmaWNhdGUoCiAgICAgICAgICAgICAgICBrZXljaGFpbiwKICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlc1swXSwKICAgICAgICAgICAgICAgIGN0eXBlcy5ieXJlZihuZXdfaWRlbnRpdHkpCiAgICAgICAgICAgICkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihzdGF0dXMpCiAgICAgICAgICAgIGlkZW50aXRpZXMuYXBwZW5kKG5ld19pZGVudGl0eSkKCiAgICAgICAgICAgICMgV2Ugbm93IHdhbnQgdG8gcmVsZWFzZSB0aGUgb3JpZ2luYWwgY2VydGlmaWNhdGUsIGFzIHdlIG5vIGxvbmdlcgogICAgICAgICAgICAjIG5lZWQgaXQuCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0aWZpY2F0ZXMucG9wKDApKQoKICAgICAgICAjIFdlIG5vdyBuZWVkIHRvIGJ1aWxkIGEgbmV3IENGQXJyYXkgdGhhdCBob2xkcyB0aGUgdHJ1c3QgY2hhaW4uCiAgICAgICAgdHJ1c3RfY2hhaW4gPSBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlTXV0YWJsZSgKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgY3R5cGVzLmJ5cmVmKENvcmVGb3VuZGF0aW9uLmtDRlR5cGVBcnJheUNhbGxCYWNrcyksCiAgICAgICAgKQogICAgICAgIGZvciBpdGVtIGluIGl0ZXJ0b29scy5jaGFpbihpZGVudGl0aWVzLCBjZXJ0aWZpY2F0ZXMpOgogICAgICAgICAgICAjIEFycmF5QXBwZW5kVmFsdWUgZG9lcyBhIENGUmV0YWluIG9uIHRoZSBpdGVtLiBUaGF0J3MgZmluZSwKICAgICAgICAgICAgIyBiZWNhdXNlIHRoZSBmaW5hbGx5IGJsb2NrIHdpbGwgcmVsZWFzZSBvdXIgb3RoZXIgcmVmcyB0byB0aGVtLgogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5QXBwZW5kVmFsdWUodHJ1c3RfY2hhaW4sIGl0ZW0pCgogICAgICAgIHJldHVybiB0cnVzdF9jaGFpbgogICAgZmluYWxseToKICAgICAgICBmb3Igb2JqIGluIGl0ZXJ0b29scy5jaGFpbihpZGVudGl0aWVzLCBjZXJ0aWZpY2F0ZXMpOgogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2Uob2JqKQpQSwMEFAAAAAAAAAAhABjDrZNxKgAAcSoAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9hcHBlbmdpbmUucHkiIiIKVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBwb29sIG1hbmFnZXIgdGhhdCB1c2VzIEdvb2dsZSBBcHAgRW5naW5lJ3MKYFVSTEZldGNoIFNlcnZpY2UgPGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvZG9jcy9weXRob24vdXJsZmV0Y2g+YF8uCgpFeGFtcGxlIHVzYWdlOjoKCiAgICBmcm9tIHVybGxpYjMgaW1wb3J0IFBvb2xNYW5hZ2VyCiAgICBmcm9tIHVybGxpYjMuY29udHJpYi5hcHBlbmdpbmUgaW1wb3J0IEFwcEVuZ2luZU1hbmFnZXIsIGlzX2FwcGVuZ2luZV9zYW5kYm94CgogICAgaWYgaXNfYXBwZW5naW5lX3NhbmRib3goKToKICAgICAgICAjIEFwcEVuZ2luZU1hbmFnZXIgdXNlcyBBcHBFbmdpbmUncyBVUkxGZXRjaCBBUEkgYmVoaW5kIHRoZSBzY2VuZXMKICAgICAgICBodHRwID0gQXBwRW5naW5lTWFuYWdlcigpCiAgICBlbHNlOgogICAgICAgICMgUG9vbE1hbmFnZXIgdXNlcyBhIHNvY2tldC1sZXZlbCBBUEkgYmVoaW5kIHRoZSBzY2VuZXMKICAgICAgICBodHRwID0gUG9vbE1hbmFnZXIoKQoKICAgIHIgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwczovL2dvb2dsZS5jb20vJykKClRoZXJlIGFyZSBgbGltaXRhdGlvbnMgPGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvZG9jcy9weXRob24vXAp1cmxmZXRjaC8jUHl0aG9uX1F1b3Rhc19hbmRfbGltaXRzPmBfIHRvIHRoZSBVUkxGZXRjaCBzZXJ2aWNlIGFuZCBpdCBtYXkgbm90IGJlCnRoZSBiZXN0IGNob2ljZSBmb3IgeW91ciBhcHBsaWNhdGlvbi4gVGhlcmUgYXJlIHRocmVlIG9wdGlvbnMgZm9yIHVzaW5nCnVybGxpYjMgb24gR29vZ2xlIEFwcCBFbmdpbmU6CgoxLiBZb3UgY2FuIHVzZSA6Y2xhc3M6YEFwcEVuZ2luZU1hbmFnZXJgIHdpdGggVVJMRmV0Y2guIFVSTEZldGNoIGlzCiAgIGNvc3QtZWZmZWN0aXZlIGluIG1hbnkgY2lyY3Vtc3RhbmNlcyBhcyBsb25nIGFzIHlvdXIgdXNhZ2UgaXMgd2l0aGluIHRoZQogICBsaW1pdGF0aW9ucy4KMi4gWW91IGNhbiB1c2UgYSBub3JtYWwgOmNsYXNzOmB+dXJsbGliMy5Qb29sTWFuYWdlcmAgYnkgZW5hYmxpbmcgc29ja2V0cy4KICAgU29ja2V0cyBhbHNvIGhhdmUgYGxpbWl0YXRpb25zIGFuZCByZXN0cmljdGlvbnMKICAgPGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvZG9jcy9weXRob24vc29ja2V0cy9cCiAgICNsaW1pdGF0aW9ucy1hbmQtcmVzdHJpY3Rpb25zPmBfIGFuZCBoYXZlIGEgbG93ZXIgZnJlZSBxdW90YSB0aGFuIFVSTEZldGNoLgogICBUbyB1c2Ugc29ja2V0cywgYmUgc3VyZSB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgaW4geW91ciBgYGFwcC55YW1sYGA6OgoKICAgICAgICBlbnZfdmFyaWFibGVzOgogICAgICAgICAgICBHQUVfVVNFX1NPQ0tFVFNfSFRUUExJQiA6ICd0cnVlJwoKMy4gSWYgeW91IGFyZSB1c2luZyBgQXBwIEVuZ2luZSBGbGV4aWJsZQo8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL2ZsZXhpYmxlLz5gXywgeW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkCjpjbGFzczpgUG9vbE1hbmFnZXJgIHdpdGhvdXQgYW55IGNvbmZpZ3VyYXRpb24gb3Igc3BlY2lhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCB3YXJuaW5ncwpmcm9tIC4ucGFja2FnZXMuc2l4Lm1vdmVzLnVybGxpYi5wYXJzZSBpbXBvcnQgdXJsam9pbgoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEhUVFBFcnJvciwKICAgIEhUVFBXYXJuaW5nLAogICAgTWF4UmV0cnlFcnJvciwKICAgIFByb3RvY29sRXJyb3IsCiAgICBUaW1lb3V0RXJyb3IsCiAgICBTU0xFcnJvcgopCgpmcm9tIC4ucGFja2FnZXMuc2l4IGltcG9ydCBCeXRlc0lPCmZyb20gLi5yZXF1ZXN0IGltcG9ydCBSZXF1ZXN0TWV0aG9kcwpmcm9tIC4ucmVzcG9uc2UgaW1wb3J0IEhUVFBSZXNwb25zZQpmcm9tIC4udXRpbC50aW1lb3V0IGltcG9ydCBUaW1lb3V0CmZyb20gLi51dGlsLnJldHJ5IGltcG9ydCBSZXRyeQoKdHJ5OgogICAgZnJvbSBnb29nbGUuYXBwZW5naW5lLmFwaSBpbXBvcnQgdXJsZmV0Y2gKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdXJsZmV0Y2ggPSBOb25lCgoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgQXBwRW5naW5lUGxhdGZvcm1XYXJuaW5nKEhUVFBXYXJuaW5nKToKICAgIHBhc3MKCgpjbGFzcyBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKEhUVFBFcnJvcik6CiAgICBwYXNzCgoKY2xhc3MgQXBwRW5naW5lTWFuYWdlcihSZXF1ZXN0TWV0aG9kcyk6CiAgICAiIiIKICAgIENvbm5lY3Rpb24gbWFuYWdlciBmb3IgR29vZ2xlIEFwcCBFbmdpbmUgc2FuZGJveCBhcHBsaWNhdGlvbnMuCgogICAgVGhpcyBtYW5hZ2VyIHVzZXMgdGhlIFVSTEZldGNoIHNlcnZpY2UgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyB0aGUKICAgIGVtdWxhdGVkIGh0dHBsaWIsIGFuZCBpcyBzdWJqZWN0IHRvIFVSTEZldGNoIGxpbWl0YXRpb25zIGFzIGRlc2NyaWJlZCBpbgogICAgdGhlIEFwcCBFbmdpbmUgZG9jdW1lbnRhdGlvbiBgaGVyZQogICAgPGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvZG9jcy9weXRob24vdXJsZmV0Y2g+YF8uCgogICAgTm90YWJseSBpdCB3aWxsIHJhaXNlIGFuIDpjbGFzczpgQXBwRW5naW5lUGxhdGZvcm1FcnJvcmAgaWY6CiAgICAgICAgKiBVUkxGZXRjaCBpcyBub3QgYXZhaWxhYmxlLgogICAgICAgICogSWYgeW91IGF0dGVtcHQgdG8gdXNlIHRoaXMgb24gQXBwIEVuZ2luZSBGbGV4aWJsZSwgYXMgZnVsbCBzb2NrZXQKICAgICAgICAgIHN1cHBvcnQgaXMgYXZhaWxhYmxlLgogICAgICAgICogSWYgYSByZXF1ZXN0IHNpemUgaXMgbW9yZSB0aGFuIDEwIG1lZ2FieXRlcy4KICAgICAgICAqIElmIGEgcmVzcG9uc2Ugc2l6ZSBpcyBtb3JlIHRoYW4gMzIgbWVnYWJ0eWVzLgogICAgICAgICogSWYgeW91IHVzZSBhbiB1bnN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZCBzdWNoIGFzIE9QVElPTlMuCgogICAgQmV5b25kIHRob3NlIGNhc2VzLCBpdCB3aWxsIHJhaXNlIG5vcm1hbCB1cmxsaWIzIGVycm9ycy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzPU5vbmUsIHJldHJpZXM9Tm9uZSwgdmFsaWRhdGVfY2VydGlmaWNhdGU9VHJ1ZSwKICAgICAgICAgICAgICAgICB1cmxmZXRjaF9yZXRyaWVzPVRydWUpOgogICAgICAgIGlmIG5vdCB1cmxmZXRjaDoKICAgICAgICAgICAgcmFpc2UgQXBwRW5naW5lUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgICJVUkxGZXRjaCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQuIikKCiAgICAgICAgaWYgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpOgogICAgICAgICAgICByYWlzZSBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgIlVzZSBub3JtYWwgdXJsbGliMy5Qb29sTWFuYWdlciBpbnN0ZWFkIG9mIEFwcEVuZ2luZU1hbmFnZXIiCiAgICAgICAgICAgICAgICAib24gTWFuYWdlZCBWTXMsIGFzIHVzaW5nIFVSTEZldGNoIGlzIG5vdCBuZWNlc3NhcnkgaW4gIgogICAgICAgICAgICAgICAgInRoaXMgZW52aXJvbm1lbnQuIikKCiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgInVybGxpYjMgaXMgdXNpbmcgVVJMRmV0Y2ggb24gR29vZ2xlIEFwcCBFbmdpbmUgc2FuZGJveCBpbnN0ZWFkICIKICAgICAgICAgICAgIm9mIHNvY2tldHMuIFRvIHVzZSBzb2NrZXRzIGRpcmVjdGx5IGluc3RlYWQgb2YgVVJMRmV0Y2ggc2VlICIKICAgICAgICAgICAgImh0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvcmVmZXJlbmNlL3VybGxpYjMuY29udHJpYi5odG1sLiIsCiAgICAgICAgICAgIEFwcEVuZ2luZVBsYXRmb3JtV2FybmluZykKCiAgICAgICAgUmVxdWVzdE1ldGhvZHMuX19pbml0X18oc2VsZiwgaGVhZGVycykKICAgICAgICBzZWxmLnZhbGlkYXRlX2NlcnRpZmljYXRlID0gdmFsaWRhdGVfY2VydGlmaWNhdGUKICAgICAgICBzZWxmLnVybGZldGNoX3JldHJpZXMgPSB1cmxmZXRjaF9yZXRyaWVzCgogICAgICAgIHNlbGYucmV0cmllcyA9IHJldHJpZXMgb3IgUmV0cnkuREVGQVVMVAoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CiAgICAgICAgIyBSZXR1cm4gRmFsc2UgdG8gcmUtcmFpc2UgYW55IHBvdGVudGlhbCBleGNlcHRpb25zCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgcmV0cmllcz1Ob25lLCByZWRpcmVjdD1UcnVlLCB0aW1lb3V0PVRpbWVvdXQuREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdyk6CgogICAgICAgIHJldHJpZXMgPSBzZWxmLl9nZXRfcmV0cmllcyhyZXRyaWVzLCByZWRpcmVjdCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb2xsb3dfcmVkaXJlY3RzID0gKAogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0IGFuZAogICAgICAgICAgICAgICAgICAgIHJldHJpZXMucmVkaXJlY3QgIT0gMCBhbmQKICAgICAgICAgICAgICAgICAgICByZXRyaWVzLnRvdGFsKQogICAgICAgICAgICByZXNwb25zZSA9IHVybGZldGNoLmZldGNoKAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgcGF5bG9hZD1ib2R5LAogICAgICAgICAgICAgICAgbWV0aG9kPW1ldGhvZCwKICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycyBvciB7fSwKICAgICAgICAgICAgICAgIGFsbG93X3RydW5jYXRlZD1GYWxzZSwKICAgICAgICAgICAgICAgIGZvbGxvd19yZWRpcmVjdHM9c2VsZi51cmxmZXRjaF9yZXRyaWVzIGFuZCBmb2xsb3dfcmVkaXJlY3RzLAogICAgICAgICAgICAgICAgZGVhZGxpbmU9c2VsZi5fZ2V0X2Fic29sdXRlX3RpbWVvdXQodGltZW91dCksCiAgICAgICAgICAgICAgICB2YWxpZGF0ZV9jZXJ0aWZpY2F0ZT1zZWxmLnZhbGlkYXRlX2NlcnRpZmljYXRlLAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IHVybGZldGNoLkRlYWRsaW5lRXhjZWVkZWRFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBUaW1lb3V0RXJyb3Ioc2VsZiwgZSkKCiAgICAgICAgZXhjZXB0IHVybGZldGNoLkludmFsaWRVUkxFcnJvciBhcyBlOgogICAgICAgICAgICBpZiAndG9vIGxhcmdlJyBpbiBzdHIoZSk6CiAgICAgICAgICAgICAgICByYWlzZSBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgICAgICJVUkxGZXRjaCByZXF1ZXN0IHRvbyBsYXJnZSwgVVJMRmV0Y2ggb25seSAiCiAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRzIHJlcXVlc3RzIHVwIHRvIDEwbWIgaW4gc2l6ZS4iLCBlKQogICAgICAgICAgICByYWlzZSBQcm90b2NvbEVycm9yKGUpCgogICAgICAgIGV4Y2VwdCB1cmxmZXRjaC5Eb3dubG9hZEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmICdUb28gbWFueSByZWRpcmVjdHMnIGluIHN0cihlKToKICAgICAgICAgICAgICAgIHJhaXNlIE1heFJldHJ5RXJyb3Ioc2VsZiwgdXJsLCByZWFzb249ZSkKICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFcnJvcihlKQoKICAgICAgICBleGNlcHQgdXJsZmV0Y2guUmVzcG9uc2VUb29MYXJnZUVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggcmVzcG9uc2UgdG9vIGxhcmdlLCBVUkxGZXRjaCBvbmx5IHN1cHBvcnRzIgogICAgICAgICAgICAgICAgInJlc3BvbnNlcyB1cCB0byAzMm1iIGluIHNpemUuIiwgZSkKCiAgICAgICAgZXhjZXB0IHVybGZldGNoLlNTTENlcnRpZmljYXRlRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoZSkKCiAgICAgICAgZXhjZXB0IHVybGZldGNoLkludmFsaWRNZXRob2RFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgIlVSTEZldGNoIGRvZXMgbm90IHN1cHBvcnQgbWV0aG9kOiAlcyIgJSBtZXRob2QsIGUpCgogICAgICAgIGh0dHBfcmVzcG9uc2UgPSBzZWxmLl91cmxmZXRjaF9yZXNwb25zZV90b19odHRwX3Jlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgcmV0cmllcz1yZXRyaWVzLCAqKnJlc3BvbnNlX2t3KQoKICAgICAgICAjIEhhbmRsZSByZWRpcmVjdD8KICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHJlZGlyZWN0IGFuZCBodHRwX3Jlc3BvbnNlLmdldF9yZWRpcmVjdF9sb2NhdGlvbigpCiAgICAgICAgaWYgcmVkaXJlY3RfbG9jYXRpb246CiAgICAgICAgICAgICMgQ2hlY2sgZm9yIHJlZGlyZWN0IHJlc3BvbnNlCiAgICAgICAgICAgIGlmIChzZWxmLnVybGZldGNoX3JldHJpZXMgYW5kIHJldHJpZXMucmFpc2Vfb25fcmVkaXJlY3QpOgogICAgICAgICAgICAgICAgcmFpc2UgTWF4UmV0cnlFcnJvcihzZWxmLCB1cmwsICJ0b28gbWFueSByZWRpcmVjdHMiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgaHR0cF9yZXNwb25zZS5zdGF0dXMgPT0gMzAzOgogICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudChtZXRob2QsIHVybCwgcmVzcG9uc2U9aHR0cF9yZXNwb25zZSwgX3Bvb2w9c2VsZikKICAgICAgICAgICAgICAgIGV4Y2VwdCBNYXhSZXRyeUVycm9yOgogICAgICAgICAgICAgICAgICAgIGlmIHJldHJpZXMucmFpc2Vfb25fcmVkaXJlY3Q6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE1heFJldHJ5RXJyb3Ioc2VsZiwgdXJsLCAidG9vIG1hbnkgcmVkaXJlY3RzIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHR0cF9yZXNwb25zZQoKICAgICAgICAgICAgICAgIHJldHJpZXMuc2xlZXBfZm9yX3JldHJ5KGh0dHBfcmVzcG9uc2UpCiAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlZGlyZWN0aW5nICVzIC0+ICVzIiwgdXJsLCByZWRpcmVjdF9sb2NhdGlvbikKICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VybCA9IHVybGpvaW4odXJsLCByZWRpcmVjdF9sb2NhdGlvbikKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4oCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCByZWRpcmVjdF91cmwsIGJvZHksIGhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwKICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsICoqcmVzcG9uc2Vfa3cpCgogICAgICAgICMgQ2hlY2sgaWYgd2Ugc2hvdWxkIHJldHJ5IHRoZSBIVFRQIHJlc3BvbnNlLgogICAgICAgIGhhc19yZXRyeV9hZnRlciA9IGJvb2woaHR0cF9yZXNwb25zZS5nZXRoZWFkZXIoJ1JldHJ5LUFmdGVyJykpCiAgICAgICAgaWYgcmV0cmllcy5pc19yZXRyeShtZXRob2QsIGh0dHBfcmVzcG9uc2Uuc3RhdHVzLCBoYXNfcmV0cnlfYWZ0ZXIpOgogICAgICAgICAgICByZXRyaWVzID0gcmV0cmllcy5pbmNyZW1lbnQoCiAgICAgICAgICAgICAgICBtZXRob2QsIHVybCwgcmVzcG9uc2U9aHR0cF9yZXNwb25zZSwgX3Bvb2w9c2VsZikKICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXRyeTogJXMiLCB1cmwpCiAgICAgICAgICAgIHJldHJpZXMuc2xlZXAoaHR0cF9yZXNwb25zZSkKICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbigKICAgICAgICAgICAgICAgIG1ldGhvZCwgdXJsLAogICAgICAgICAgICAgICAgYm9keT1ib2R5LCBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICByZXRyaWVzPXJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LAogICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LCAqKnJlc3BvbnNlX2t3KQoKICAgICAgICByZXR1cm4gaHR0cF9yZXNwb25zZQoKICAgIGRlZiBfdXJsZmV0Y2hfcmVzcG9uc2VfdG9faHR0cF9yZXNwb25zZShzZWxmLCB1cmxmZXRjaF9yZXNwLCAqKnJlc3BvbnNlX2t3KToKCiAgICAgICAgaWYgaXNfcHJvZF9hcHBlbmdpbmUoKToKICAgICAgICAgICAgIyBQcm9kdWN0aW9uIEdBRSBoYW5kbGVzIGRlZmxhdGUgZW5jb2RpbmcgYXV0b21hdGljYWxseSwgYnV0IGRvZXMKICAgICAgICAgICAgIyBub3QgcmVtb3ZlIHRoZSBlbmNvZGluZyBoZWFkZXIuCiAgICAgICAgICAgIGNvbnRlbnRfZW5jb2RpbmcgPSB1cmxmZXRjaF9yZXNwLmhlYWRlcnMuZ2V0KCdjb250ZW50LWVuY29kaW5nJykKCiAgICAgICAgICAgIGlmIGNvbnRlbnRfZW5jb2RpbmcgPT0gJ2RlZmxhdGUnOgogICAgICAgICAgICAgICAgZGVsIHVybGZldGNoX3Jlc3AuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddCgogICAgICAgIHRyYW5zZmVyX2VuY29kaW5nID0gdXJsZmV0Y2hfcmVzcC5oZWFkZXJzLmdldCgndHJhbnNmZXItZW5jb2RpbmcnKQogICAgICAgICMgV2UgaGF2ZSBhIGZ1bGwgcmVzcG9uc2UncyBjb250ZW50LAogICAgICAgICMgc28gbGV0J3MgbWFrZSBzdXJlIHdlIGRvbid0IHJlcG9ydCBvdXJzZWx2ZXMgYXMgY2h1bmtlZCBkYXRhLgogICAgICAgIGlmIHRyYW5zZmVyX2VuY29kaW5nID09ICdjaHVua2VkJzoKICAgICAgICAgICAgZW5jb2RpbmdzID0gdHJhbnNmZXJfZW5jb2Rpbmcuc3BsaXQoIiwiKQogICAgICAgICAgICBlbmNvZGluZ3MucmVtb3ZlKCdjaHVua2VkJykKICAgICAgICAgICAgdXJsZmV0Y2hfcmVzcC5oZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddID0gJywnLmpvaW4oZW5jb2RpbmdzKQoKICAgICAgICByZXR1cm4gSFRUUFJlc3BvbnNlKAogICAgICAgICAgICAjIEluIG9yZGVyIGZvciBkZWNvZGluZyB0byB3b3JrLCB3ZSBtdXN0IHByZXNlbnQgdGhlIGNvbnRlbnQgYXMKICAgICAgICAgICAgIyBhIGZpbGUtbGlrZSBvYmplY3QuCiAgICAgICAgICAgIGJvZHk9Qnl0ZXNJTyh1cmxmZXRjaF9yZXNwLmNvbnRlbnQpLAogICAgICAgICAgICBoZWFkZXJzPXVybGZldGNoX3Jlc3AuaGVhZGVycywKICAgICAgICAgICAgc3RhdHVzPXVybGZldGNoX3Jlc3Auc3RhdHVzX2NvZGUsCiAgICAgICAgICAgICoqcmVzcG9uc2Vfa3cKICAgICAgICApCgogICAgZGVmIF9nZXRfYWJzb2x1dGVfdGltZW91dChzZWxmLCB0aW1lb3V0KToKICAgICAgICBpZiB0aW1lb3V0IGlzIFRpbWVvdXQuREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICByZXR1cm4gTm9uZSAgIyBEZWZlciB0byBVUkxGZXRjaCdzIGRlZmF1bHQuCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0aW1lb3V0LCBUaW1lb3V0KToKICAgICAgICAgICAgaWYgdGltZW91dC5fcmVhZCBpcyBub3QgTm9uZSBvciB0aW1lb3V0Ll9jb25uZWN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggZG9lcyBub3Qgc3VwcG9ydCBncmFudWxhciB0aW1lb3V0IHNldHRpbmdzLCAiCiAgICAgICAgICAgICAgICAgICAgInJldmVydGluZyB0byB0b3RhbCBvciBkZWZhdWx0IFVSTEZldGNoIHRpbWVvdXQuIiwKICAgICAgICAgICAgICAgICAgICBBcHBFbmdpbmVQbGF0Zm9ybVdhcm5pbmcpCiAgICAgICAgICAgIHJldHVybiB0aW1lb3V0LnRvdGFsCiAgICAgICAgcmV0dXJuIHRpbWVvdXQKCiAgICBkZWYgX2dldF9yZXRyaWVzKHNlbGYsIHJldHJpZXMsIHJlZGlyZWN0KToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyZXRyaWVzLCBSZXRyeSk6CiAgICAgICAgICAgIHJldHJpZXMgPSBSZXRyeS5mcm9tX2ludCgKICAgICAgICAgICAgICAgIHJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LCBkZWZhdWx0PXNlbGYucmV0cmllcykKCiAgICAgICAgaWYgcmV0cmllcy5jb25uZWN0IG9yIHJldHJpZXMucmVhZCBvciByZXRyaWVzLnJlZGlyZWN0OgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlVSTEZldGNoIG9ubHkgc3VwcG9ydHMgdG90YWwgcmV0cmllcyBhbmQgZG9lcyBub3QgIgogICAgICAgICAgICAgICAgInJlY29nbml6ZSBjb25uZWN0LCByZWFkLCBvciByZWRpcmVjdCByZXRyeSBwYXJhbWV0ZXJzLiIsCiAgICAgICAgICAgICAgICBBcHBFbmdpbmVQbGF0Zm9ybVdhcm5pbmcpCgogICAgICAgIHJldHVybiByZXRyaWVzCgoKZGVmIGlzX2FwcGVuZ2luZSgpOgogICAgcmV0dXJuIChpc19sb2NhbF9hcHBlbmdpbmUoKSBvcgogICAgICAgICAgICBpc19wcm9kX2FwcGVuZ2luZSgpIG9yCiAgICAgICAgICAgIGlzX3Byb2RfYXBwZW5naW5lX212bXMoKSkKCgpkZWYgaXNfYXBwZW5naW5lX3NhbmRib3goKToKICAgIHJldHVybiBpc19hcHBlbmdpbmUoKSBhbmQgbm90IGlzX3Byb2RfYXBwZW5naW5lX212bXMoKQoKCmRlZiBpc19sb2NhbF9hcHBlbmdpbmUoKToKICAgIHJldHVybiAoJ0FQUEVOR0lORV9SVU5USU1FJyBpbiBvcy5lbnZpcm9uIGFuZAogICAgICAgICAgICAnRGV2ZWxvcG1lbnQvJyBpbiBvcy5lbnZpcm9uWydTRVJWRVJfU09GVFdBUkUnXSkKCgpkZWYgaXNfcHJvZF9hcHBlbmdpbmUoKToKICAgIHJldHVybiAoJ0FQUEVOR0lORV9SVU5USU1FJyBpbiBvcy5lbnZpcm9uIGFuZAogICAgICAgICAgICAnR29vZ2xlIEFwcCBFbmdpbmUvJyBpbiBvcy5lbnZpcm9uWydTRVJWRVJfU09GVFdBUkUnXSBhbmQKICAgICAgICAgICAgbm90IGlzX3Byb2RfYXBwZW5naW5lX212bXMoKSkKCgpkZWYgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpOgogICAgcmV0dXJuIG9zLmVudmlyb24uZ2V0KCdHQUVfVk0nLCBGYWxzZSkgPT0gJ3RydWUnClBLAwQUAAAAAAAAACEALqVxjX4RAAB+EQAARAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL250bG1wb29sLnB5IiIiCk5UTE0gYXV0aGVudGljYXRpbmcgcG9vbCwgY29udHJpYnV0ZWQgYnkgZXJpa2NlZGVyc3RyYW4KCklzc3VlICMxMCwgc2VlOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdXJsbGliMy9pc3N1ZXMvZGV0YWlsP2lkPTEwCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBsb2dnaW5nIGltcG9ydCBnZXRMb2dnZXIKZnJvbSBudGxtIGltcG9ydCBudGxtCgpmcm9tIC4uIGltcG9ydCBIVFRQU0Nvbm5lY3Rpb25Qb29sCmZyb20gLi5wYWNrYWdlcy5zaXgubW92ZXMuaHR0cF9jbGllbnQgaW1wb3J0IEhUVFBTQ29ubmVjdGlvbgoKCmxvZyA9IGdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBOVExNQ29ubmVjdGlvblBvb2woSFRUUFNDb25uZWN0aW9uUG9vbCk6CiAgICAiIiIKICAgIEltcGxlbWVudHMgYW4gTlRMTSBhdXRoZW50aWNhdGlvbiB2ZXJzaW9uIG9mIGFuIHVybGxpYjMgY29ubmVjdGlvbiBwb29sCiAgICAiIiIKCiAgICBzY2hlbWUgPSAnaHR0cHMnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZXIsIHB3LCBhdXRodXJsLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIGF1dGh1cmwgaXMgYSByYW5kb20gVVJMIG9uIHRoZSBzZXJ2ZXIgdGhhdCBpcyBwcm90ZWN0ZWQgYnkgTlRMTS4KICAgICAgICB1c2VyIGlzIHRoZSBXaW5kb3dzIHVzZXIsIHByb2JhYmx5IGluIHRoZSBET01BSU5cXHVzZXJuYW1lIGZvcm1hdC4KICAgICAgICBwdyBpcyB0aGUgcGFzc3dvcmQgZm9yIHRoZSB1c2VyLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKE5UTE1Db25uZWN0aW9uUG9vbCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHNlbGYuYXV0aHVybCA9IGF1dGh1cmwKICAgICAgICBzZWxmLnJhd3VzZXIgPSB1c2VyCiAgICAgICAgdXNlcl9wYXJ0cyA9IHVzZXIuc3BsaXQoJ1xcJywgMSkKICAgICAgICBzZWxmLmRvbWFpbiA9IHVzZXJfcGFydHNbMF0udXBwZXIoKQogICAgICAgIHNlbGYudXNlciA9IHVzZXJfcGFydHNbMV0KICAgICAgICBzZWxmLnB3ID0gcHcKCiAgICBkZWYgX25ld19jb25uKHNlbGYpOgogICAgICAgICMgUGVyZm9ybXMgdGhlIE5UTE0gaGFuZHNoYWtlIHRoYXQgc2VjdXJlcyB0aGUgY29ubmVjdGlvbi4gVGhlIHNvY2tldAogICAgICAgICMgbXVzdCBiZSBrZXB0IG9wZW4gd2hpbGUgcmVxdWVzdHMgYXJlIHBlcmZvcm1lZC4KICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucyArPSAxCiAgICAgICAgbG9nLmRlYnVnKCdTdGFydGluZyBOVExNIEhUVFBTIGNvbm5lY3Rpb24gbm8uICVkOiBodHRwczovLyVzJXMnLAogICAgICAgICAgICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucywgc2VsZi5ob3N0LCBzZWxmLmF1dGh1cmwpCgogICAgICAgIGhlYWRlcnMgPSB7fQogICAgICAgIGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdLZWVwLUFsaXZlJwogICAgICAgIHJlcV9oZWFkZXIgPSAnQXV0aG9yaXphdGlvbicKICAgICAgICByZXNwX2hlYWRlciA9ICd3d3ctYXV0aGVudGljYXRlJwoKICAgICAgICBjb25uID0gSFRUUFNDb25uZWN0aW9uKGhvc3Q9c2VsZi5ob3N0LCBwb3J0PXNlbGYucG9ydCkKCiAgICAgICAgIyBTZW5kIG5lZ290aWF0aW9uIG1lc3NhZ2UKICAgICAgICBoZWFkZXJzW3JlcV9oZWFkZXJdID0gKAogICAgICAgICAgICAnTlRMTSAlcycgJSBudGxtLmNyZWF0ZV9OVExNX05FR09USUFURV9NRVNTQUdFKHNlbGYucmF3dXNlcikpCiAgICAgICAgbG9nLmRlYnVnKCdSZXF1ZXN0IGhlYWRlcnM6ICVzJywgaGVhZGVycykKICAgICAgICBjb25uLnJlcXVlc3QoJ0dFVCcsIHNlbGYuYXV0aHVybCwgTm9uZSwgaGVhZGVycykKICAgICAgICByZXMgPSBjb25uLmdldHJlc3BvbnNlKCkKICAgICAgICByZXNoZHIgPSBkaWN0KHJlcy5nZXRoZWFkZXJzKCkpCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBzdGF0dXM6ICVzICVzJywgcmVzLnN0YXR1cywgcmVzLnJlYXNvbikKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIGhlYWRlcnM6ICVzJywgcmVzaGRyKQogICAgICAgIGxvZy5kZWJ1ZygnUmVzcG9uc2UgZGF0YTogJXMgWy4uLl0nLCByZXMucmVhZCgxMDApKQoKICAgICAgICAjIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzb2NrZXQsIHNvIHRoYXQgaXQgY2FuIG5vdCBiZSBjbG9zZWQgYnkKICAgICAgICAjIHRoZSByZXNwb25zZSBvYmplY3QgKHdlIHdhbnQgdG8ga2VlcCB0aGUgc29ja2V0IG9wZW4pCiAgICAgICAgcmVzLmZwID0gTm9uZQoKICAgICAgICAjIFNlcnZlciBzaG91bGQgcmVzcG9uZCB3aXRoIGEgY2hhbGxlbmdlIG1lc3NhZ2UKICAgICAgICBhdXRoX2hlYWRlcl92YWx1ZXMgPSByZXNoZHJbcmVzcF9oZWFkZXJdLnNwbGl0KCcsICcpCiAgICAgICAgYXV0aF9oZWFkZXJfdmFsdWUgPSBOb25lCiAgICAgICAgZm9yIHMgaW4gYXV0aF9oZWFkZXJfdmFsdWVzOgogICAgICAgICAgICBpZiBzWzo1XSA9PSAnTlRMTSAnOgogICAgICAgICAgICAgICAgYXV0aF9oZWFkZXJfdmFsdWUgPSBzWzU6XQogICAgICAgIGlmIGF1dGhfaGVhZGVyX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignVW5leHBlY3RlZCAlcyByZXNwb25zZSBoZWFkZXI6ICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcF9oZWFkZXIsIHJlc2hkcltyZXNwX2hlYWRlcl0pKQoKICAgICAgICAjIFNlbmQgYXV0aGVudGljYXRpb24gbWVzc2FnZQogICAgICAgIFNlcnZlckNoYWxsZW5nZSwgTmVnb3RpYXRlRmxhZ3MgPSBcCiAgICAgICAgICAgIG50bG0ucGFyc2VfTlRMTV9DSEFMTEVOR0VfTUVTU0FHRShhdXRoX2hlYWRlcl92YWx1ZSkKICAgICAgICBhdXRoX21zZyA9IG50bG0uY3JlYXRlX05UTE1fQVVUSEVOVElDQVRFX01FU1NBR0UoU2VydmVyQ2hhbGxlbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9tYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZWdvdGlhdGVGbGFncykKICAgICAgICBoZWFkZXJzW3JlcV9oZWFkZXJdID0gJ05UTE0gJXMnICUgYXV0aF9tc2cKICAgICAgICBsb2cuZGVidWcoJ1JlcXVlc3QgaGVhZGVyczogJXMnLCBoZWFkZXJzKQogICAgICAgIGNvbm4ucmVxdWVzdCgnR0VUJywgc2VsZi5hdXRodXJsLCBOb25lLCBoZWFkZXJzKQogICAgICAgIHJlcyA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgIGxvZy5kZWJ1ZygnUmVzcG9uc2Ugc3RhdHVzOiAlcyAlcycsIHJlcy5zdGF0dXMsIHJlcy5yZWFzb24pCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBoZWFkZXJzOiAlcycsIGRpY3QocmVzLmdldGhlYWRlcnMoKSkpCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBkYXRhOiAlcyBbLi4uXScsIHJlcy5yZWFkKClbOjEwMF0pCiAgICAgICAgaWYgcmVzLnN0YXR1cyAhPSAyMDA6CiAgICAgICAgICAgIGlmIHJlcy5zdGF0dXMgPT0gNDAxOgogICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdTZXJ2ZXIgcmVqZWN0ZWQgcmVxdWVzdDogd3JvbmcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VybmFtZSBvciBwYXNzd29yZCcpCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignV3Jvbmcgc2VydmVyIHJlc3BvbnNlOiAlcyAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcy5zdGF0dXMsIHJlcy5yZWFzb24pKQoKICAgICAgICByZXMuZnAgPSBOb25lCiAgICAgICAgbG9nLmRlYnVnKCdDb25uZWN0aW9uIGVzdGFibGlzaGVkJykKICAgICAgICByZXR1cm4gY29ubgoKICAgIGRlZiB1cmxvcGVuKHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz0zLAogICAgICAgICAgICAgICAgcmVkaXJlY3Q9VHJ1ZSwgYXNzZXJ0X3NhbWVfaG9zdD1UcnVlKToKICAgICAgICBpZiBoZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGhlYWRlcnMgPSB7fQogICAgICAgIGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdLZWVwLUFsaXZlJwogICAgICAgIHJldHVybiBzdXBlcihOVExNQ29ubmVjdGlvblBvb2wsIHNlbGYpLnVybG9wZW4obWV0aG9kLCB1cmwsIGJvZHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLCByZXRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfc2FtZV9ob3N0KQpQSwMEFAAAAAAAAAAhAPMqtnH6OwAA+jsAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9weW9wZW5zc2wucHkiIiIKU1NMIHdpdGggU05JXy1zdXBwb3J0IGZvciBQeXRob24gMi4gRm9sbG93IHRoZXNlIGluc3RydWN0aW9ucyBpZiB5b3Ugd291bGQKbGlrZSB0byB2ZXJpZnkgU1NMIGNlcnRpZmljYXRlcyBpbiBQeXRob24gMi4gTm90ZSwgdGhlIGRlZmF1bHQgbGlicmFyaWVzIGRvCipub3QqIGRvIGNlcnRpZmljYXRlIGNoZWNraW5nOyB5b3UgbmVlZCB0byBkbyBhZGRpdGlvbmFsIHdvcmsgdG8gdmFsaWRhdGUKY2VydGlmaWNhdGVzIHlvdXJzZWxmLgoKVGhpcyBuZWVkcyB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIGluc3RhbGxlZDoKCiogcHlPcGVuU1NMICh0ZXN0ZWQgd2l0aCAxNi4wLjApCiogY3J5cHRvZ3JhcGh5IChtaW5pbXVtIDEuMy40LCBmcm9tIHB5b3BlbnNzbCkKKiBpZG5hIChtaW5pbXVtIDIuMCwgZnJvbSBjcnlwdG9ncmFwaHkpCgpIb3dldmVyLCBweW9wZW5zc2wgZGVwZW5kcyBvbiBjcnlwdG9ncmFwaHksIHdoaWNoIGRlcGVuZHMgb24gaWRuYSwgc28gd2hpbGUgd2UKdXNlIGFsbCB0aHJlZSBkaXJlY3RseSBoZXJlIHdlIGVuZCB1cCBoYXZpbmcgcmVsYXRpdmVseSBmZXcgcGFja2FnZXMgcmVxdWlyZWQuCgpZb3UgY2FuIGluc3RhbGwgdGhlbSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKCiAgICBwaXAgaW5zdGFsbCBweW9wZW5zc2wgY3J5cHRvZ3JhcGh5IGlkbmEKClRvIGFjdGl2YXRlIGNlcnRpZmljYXRlIGNoZWNraW5nLCBjYWxsCjpmdW5jOmB+dXJsbGliMy5jb250cmliLnB5b3BlbnNzbC5pbmplY3RfaW50b191cmxsaWIzYCBmcm9tIHlvdXIgUHl0aG9uIGNvZGUKYmVmb3JlIHlvdSBiZWdpbiBtYWtpbmcgSFRUUCByZXF1ZXN0cy4gVGhpcyBjYW4gYmUgZG9uZSBpbiBhIGBgc2l0ZWN1c3RvbWl6ZWBgCm1vZHVsZSwgb3IgYXQgYW55IG90aGVyIHRpbWUgYmVmb3JlIHlvdXIgYXBwbGljYXRpb24gYmVnaW5zIHVzaW5nIGBgdXJsbGliM2BgLApsaWtlIHRoaXM6OgoKICAgIHRyeToKICAgICAgICBpbXBvcnQgdXJsbGliMy5jb250cmliLnB5b3BlbnNzbAogICAgICAgIHVybGxpYjMuY29udHJpYi5weW9wZW5zc2wuaW5qZWN0X2ludG9fdXJsbGliMygpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKTm93IHlvdSBjYW4gdXNlIDptb2Q6YHVybGxpYjNgIGFzIHlvdSBub3JtYWxseSB3b3VsZCwgYW5kIGl0IHdpbGwgc3VwcG9ydCBTTkkKd2hlbiB0aGUgcmVxdWlyZWQgbW9kdWxlcyBhcmUgaW5zdGFsbGVkLgoKQWN0aXZhdGluZyB0aGlzIG1vZHVsZSBhbHNvIGhhcyB0aGUgcG9zaXRpdmUgc2lkZSBlZmZlY3Qgb2YgZGlzYWJsaW5nIFNTTC9UTFMKY29tcHJlc3Npb24gaW4gUHl0aG9uIDIgKHNlZSBgQ1JJTUUgYXR0YWNrYF8pLgoKSWYgeW91IHdhbnQgdG8gY29uZmlndXJlIHRoZSBkZWZhdWx0IGxpc3Qgb2Ygc3VwcG9ydGVkIGNpcGhlciBzdWl0ZXMsIHlvdSBjYW4Kc2V0IHRoZSBgYHVybGxpYjMuY29udHJpYi5weW9wZW5zc2wuREVGQVVMVF9TU0xfQ0lQSEVSX0xJU1RgYCB2YXJpYWJsZS4KCi4uIF9zbmk6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NlcnZlcl9OYW1lX0luZGljYXRpb24KLi4gX2NyaW1lIGF0dGFjazogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ1JJTUVfKHNlY3VyaXR5X2V4cGxvaXQpCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IE9wZW5TU0wuU1NMCmZyb20gY3J5cHRvZ3JhcGh5IGltcG9ydCB4NTA5CmZyb20gY3J5cHRvZ3JhcGh5Lmhhem1hdC5iYWNrZW5kcy5vcGVuc3NsIGltcG9ydCBiYWNrZW5kIGFzIG9wZW5zc2xfYmFja2VuZApmcm9tIGNyeXB0b2dyYXBoeS5oYXptYXQuYmFja2VuZHMub3BlbnNzbC54NTA5IGltcG9ydCBfQ2VydGlmaWNhdGUKCmZyb20gc29ja2V0IGltcG9ydCB0aW1lb3V0LCBlcnJvciBhcyBTb2NrZXRFcnJvcgpmcm9tIGlvIGltcG9ydCBCeXRlc0lPCgp0cnk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMgogICAgZnJvbSBzb2NrZXQgaW1wb3J0IF9maWxlb2JqZWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICBfZmlsZW9iamVjdCA9IE5vbmUKICAgIGZyb20gLi5wYWNrYWdlcy5iYWNrcG9ydHMubWFrZWZpbGUgaW1wb3J0IGJhY2twb3J0X21ha2VmaWxlCgppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3NsCmZyb20gLi5wYWNrYWdlcyBpbXBvcnQgc2l4CmltcG9ydCBzeXMKCmZyb20gLi4gaW1wb3J0IHV0aWwKCl9fYWxsX18gPSBbJ2luamVjdF9pbnRvX3VybGxpYjMnLCAnZXh0cmFjdF9mcm9tX3VybGxpYjMnXQoKIyBTTkkgYWx3YXlzIHdvcmtzLgpIQVNfU05JID0gVHJ1ZQoKIyBNYXAgZnJvbSB1cmxsaWIzIHRvIFB5T3BlblNTTCBjb21wYXRpYmxlIHBhcmFtZXRlci12YWx1ZXMuCl9vcGVuc3NsX3ZlcnNpb25zID0gewogICAgc3NsLlBST1RPQ09MX1NTTHYyMzogT3BlblNTTC5TU0wuU1NMdjIzX01FVEhPRCwKICAgIHNzbC5QUk9UT0NPTF9UTFN2MTogT3BlblNTTC5TU0wuVExTdjFfTUVUSE9ELAp9CgppZiBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzEnKSBhbmQgaGFzYXR0cihPcGVuU1NMLlNTTCwgJ1RMU3YxXzFfTUVUSE9EJyk6CiAgICBfb3BlbnNzbF92ZXJzaW9uc1tzc2wuUFJPVE9DT0xfVExTdjFfMV0gPSBPcGVuU1NMLlNTTC5UTFN2MV8xX01FVEhPRAoKaWYgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8yJykgYW5kIGhhc2F0dHIoT3BlblNTTC5TU0wsICdUTFN2MV8yX01FVEhPRCcpOgogICAgX29wZW5zc2xfdmVyc2lvbnNbc3NsLlBST1RPQ09MX1RMU3YxXzJdID0gT3BlblNTTC5TU0wuVExTdjFfMl9NRVRIT0QKCnRyeToKICAgIF9vcGVuc3NsX3ZlcnNpb25zLnVwZGF0ZSh7c3NsLlBST1RPQ09MX1NTTHYzOiBPcGVuU1NMLlNTTC5TU0x2M19NRVRIT0R9KQpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBwYXNzCgpfc3RkbGliX3RvX29wZW5zc2xfdmVyaWZ5ID0gewogICAgc3NsLkNFUlRfTk9ORTogT3BlblNTTC5TU0wuVkVSSUZZX05PTkUsCiAgICBzc2wuQ0VSVF9PUFRJT05BTDogT3BlblNTTC5TU0wuVkVSSUZZX1BFRVIsCiAgICBzc2wuQ0VSVF9SRVFVSVJFRDoKICAgICAgICBPcGVuU1NMLlNTTC5WRVJJRllfUEVFUiArIE9wZW5TU0wuU1NMLlZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCwKfQpfb3BlbnNzbF90b19zdGRsaWJfdmVyaWZ5ID0gZGljdCgKICAgICh2LCBrKSBmb3IgaywgdiBpbiBfc3RkbGliX3RvX29wZW5zc2xfdmVyaWZ5Lml0ZW1zKCkKKQoKIyBPcGVuU1NMIHdpbGwgb25seSB3cml0ZSAxNksgYXQgYSB0aW1lClNTTF9XUklURV9CTE9DS1NJWkUgPSAxNjM4NAoKb3JpZ191dGlsX0hBU19TTkkgPSB1dGlsLkhBU19TTkkKb3JpZ191dGlsX1NTTENvbnRleHQgPSB1dGlsLnNzbF8uU1NMQ29udGV4dAoKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiBpbmplY3RfaW50b191cmxsaWIzKCk6CiAgICAnTW9ua2V5LXBhdGNoIHVybGxpYjMgd2l0aCBQeU9wZW5TU0wtYmFja2VkIFNTTC1zdXBwb3J0LicKCiAgICBfdmFsaWRhdGVfZGVwZW5kZW5jaWVzX21ldCgpCgogICAgdXRpbC5zc2xfLlNTTENvbnRleHQgPSBQeU9wZW5TU0xDb250ZXh0CiAgICB1dGlsLkhBU19TTkkgPSBIQVNfU05JCiAgICB1dGlsLnNzbF8uSEFTX1NOSSA9IEhBU19TTkkKICAgIHV0aWwuSVNfUFlPUEVOU1NMID0gVHJ1ZQogICAgdXRpbC5zc2xfLklTX1BZT1BFTlNTTCA9IFRydWUKCgpkZWYgZXh0cmFjdF9mcm9tX3VybGxpYjMoKToKICAgICdVbmRvIG1vbmtleS1wYXRjaGluZyBieSA6ZnVuYzpgaW5qZWN0X2ludG9fdXJsbGliM2AuJwoKICAgIHV0aWwuc3NsXy5TU0xDb250ZXh0ID0gb3JpZ191dGlsX1NTTENvbnRleHQKICAgIHV0aWwuSEFTX1NOSSA9IG9yaWdfdXRpbF9IQVNfU05JCiAgICB1dGlsLnNzbF8uSEFTX1NOSSA9IG9yaWdfdXRpbF9IQVNfU05JCiAgICB1dGlsLklTX1BZT1BFTlNTTCA9IEZhbHNlCiAgICB1dGlsLnNzbF8uSVNfUFlPUEVOU1NMID0gRmFsc2UKCgpkZWYgX3ZhbGlkYXRlX2RlcGVuZGVuY2llc19tZXQoKToKICAgICIiIgogICAgVmVyaWZpZXMgdGhhdCBQeU9wZW5TU0wncyBwYWNrYWdlLWxldmVsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gbWV0LgogICAgVGhyb3dzIGBJbXBvcnRFcnJvcmAgaWYgdGhleSBhcmUgbm90IG1ldC4KICAgICIiIgogICAgIyBNZXRob2QgYWRkZWQgaW4gYGNyeXB0b2dyYXBoeT09MS4xYDsgbm90IGF2YWlsYWJsZSBpbiBvbGRlciB2ZXJzaW9ucwogICAgZnJvbSBjcnlwdG9ncmFwaHkueDUwOS5leHRlbnNpb25zIGltcG9ydCBFeHRlbnNpb25zCiAgICBpZiBnZXRhdHRyKEV4dGVuc2lvbnMsICJnZXRfZXh0ZW5zaW9uX2Zvcl9jbGFzcyIsIE5vbmUpIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIidjcnlwdG9ncmFwaHknIG1vZHVsZSBtaXNzaW5nIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkuICAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyeSB1cGdyYWRpbmcgdG8gdjEuMy40IG9yIG5ld2VyLiIpCgogICAgIyBweU9wZW5TU0wgMC4xNCBhbmQgYWJvdmUgdXNlIGNyeXB0b2dyYXBoeSBmb3IgT3BlblNTTCBiaW5kaW5ncy4gVGhlIF94NTA5CiAgICAjIGF0dHJpYnV0ZSBpcyBvbmx5IHByZXNlbnQgb24gdGhvc2UgdmVyc2lvbnMuCiAgICBmcm9tIE9wZW5TU0wuY3J5cHRvIGltcG9ydCBYNTA5CiAgICB4NTA5ID0gWDUwOSgpCiAgICBpZiBnZXRhdHRyKHg1MDksICJfeDUwOSIsIE5vbmUpIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIidweU9wZW5TU0wnIG1vZHVsZSBtaXNzaW5nIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ5IHVwZ3JhZGluZyB0byB2MC4xNCBvciBuZXdlci4iKQoKCmRlZiBfZG5zbmFtZV90b19zdGRsaWIobmFtZSk6CiAgICAiIiIKICAgIENvbnZlcnRzIGEgZE5TTmFtZSBTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lIGZpZWxkIHRvIHRoZSBmb3JtIHVzZWQgYnkgdGhlCiAgICBzdGFuZGFyZCBsaWJyYXJ5IG9uIHRoZSBnaXZlbiBQeXRob24gdmVyc2lvbi4KCiAgICBDcnlwdG9ncmFwaHkgcHJvZHVjZXMgYSBkTlNOYW1lIGFzIGEgdW5pY29kZSBzdHJpbmcgdGhhdCB3YXMgaWRuYS1kZWNvZGVkCiAgICBmcm9tIEFTQ0lJIGJ5dGVzLiBXZSBuZWVkIHRvIGlkbmEtZW5jb2RlIHRoYXQgc3RyaW5nIHRvIGdldCBpdCBiYWNrLCBhbmQKICAgIHRoZW4gb24gUHl0aG9uIDMgd2UgYWxzbyBuZWVkIHRvIGNvbnZlcnQgdG8gdW5pY29kZSB2aWEgVVRGLTggKHRoZSBzdGRsaWIKICAgIHVzZXMgUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplIG9uIGl0LCB3aGljaCBkZWNvZGVzIHZpYSBVVEYtOCkuCiAgICAiIiIKICAgIGRlZiBpZG5hX2VuY29kZShuYW1lKToKICAgICAgICAiIiIKICAgICAgICBCb3Jyb3dlZCB3aG9sZXNhbGUgZnJvbSB0aGUgUHl0aG9uIENyeXB0b2dyYXBoeSBQcm9qZWN0LiBJdCB0dXJucyBvdXQKICAgICAgICB0aGF0IHdlIGNhbid0IGp1c3Qgc2FmZWx5IGNhbGwgYGlkbmEuZW5jb2RlYDogaXQgY2FuIGV4cGxvZGUgZm9yCiAgICAgICAgd2lsZGNhcmQgbmFtZXMuIFRoaXMgYXZvaWRzIHRoYXQgcHJvYmxlbS4KICAgICAgICAiIiIKICAgICAgICBpbXBvcnQgaWRuYQoKICAgICAgICBmb3IgcHJlZml4IGluIFt1JyouJywgdScuJ106CiAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbbGVuKHByZWZpeCk6XQogICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoJ2FzY2lpJykgKyBpZG5hLmVuY29kZShuYW1lKQogICAgICAgIHJldHVybiBpZG5hLmVuY29kZShuYW1lKQoKICAgIG5hbWUgPSBpZG5hX2VuY29kZShuYW1lKQogICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgMCk6CiAgICAgICAgbmFtZSA9IG5hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICByZXR1cm4gbmFtZQoKCmRlZiBnZXRfc3Vial9hbHRfbmFtZShwZWVyX2NlcnQpOgogICAgIiIiCiAgICBHaXZlbiBhbiBQeU9wZW5TU0wgY2VydGlmaWNhdGUsIHByb3ZpZGVzIGFsbCB0aGUgc3ViamVjdCBhbHRlcm5hdGl2ZSBuYW1lcy4KICAgICIiIgogICAgIyBQYXNzIHRoZSBjZXJ0IHRvIGNyeXB0b2dyYXBoeSwgd2hpY2ggaGFzIG11Y2ggYmV0dGVyIEFQSXMgZm9yIHRoaXMuCiAgICBpZiBoYXNhdHRyKHBlZXJfY2VydCwgInRvX2NyeXB0b2dyYXBoeSIpOgogICAgICAgIGNlcnQgPSBwZWVyX2NlcnQudG9fY3J5cHRvZ3JhcGh5KCkKICAgIGVsc2U6CiAgICAgICAgIyBUaGlzIGlzIHRlY2huaWNhbGx5IHVzaW5nIHByaXZhdGUgQVBJcywgYnV0IHNob3VsZCB3b3JrIGFjcm9zcyBhbGwKICAgICAgICAjIHJlbGV2YW50IHZlcnNpb25zIGJlZm9yZSBQeU9wZW5TU0wgZ290IGEgcHJvcGVyIEFQSSBmb3IgdGhpcy4KICAgICAgICBjZXJ0ID0gX0NlcnRpZmljYXRlKG9wZW5zc2xfYmFja2VuZCwgcGVlcl9jZXJ0Ll94NTA5KQoKICAgICMgV2Ugd2FudCB0byBmaW5kIHRoZSBTQU4gZXh0ZW5zaW9uLiBBc2sgQ3J5cHRvZ3JhcGh5IHRvIGxvY2F0ZSBpdCAoaXQncwogICAgIyBmYXN0ZXIgdGhhbiBsb29waW5nIGluIFB5dGhvbikKICAgIHRyeToKICAgICAgICBleHQgPSBjZXJ0LmV4dGVuc2lvbnMuZ2V0X2V4dGVuc2lvbl9mb3JfY2xhc3MoCiAgICAgICAgICAgIHg1MDkuU3ViamVjdEFsdGVybmF0aXZlTmFtZQogICAgICAgICkudmFsdWUKICAgIGV4Y2VwdCB4NTA5LkV4dGVuc2lvbk5vdEZvdW5kOgogICAgICAgICMgTm8gc3VjaCBleHRlbnNpb24sIHJldHVybiB0aGUgZW1wdHkgbGlzdC4KICAgICAgICByZXR1cm4gW10KICAgIGV4Y2VwdCAoeDUwOS5EdXBsaWNhdGVFeHRlbnNpb24sIHg1MDkuVW5zdXBwb3J0ZWRFeHRlbnNpb24sCiAgICAgICAgICAgIHg1MDkuVW5zdXBwb3J0ZWRHZW5lcmFsTmFtZVR5cGUsIFVuaWNvZGVFcnJvcikgYXMgZToKICAgICAgICAjIEEgcHJvYmxlbSBoYXMgYmVlbiBmb3VuZCB3aXRoIHRoZSBxdWFsaXR5IG9mIHRoZSBjZXJ0aWZpY2F0ZS4gQXNzdW1lCiAgICAgICAgIyBubyBTQU4gZmllbGQgaXMgcHJlc2VudC4KICAgICAgICBsb2cud2FybmluZygKICAgICAgICAgICAgIkEgcHJvYmxlbSB3YXMgZW5jb3VudGVyZWQgd2l0aCB0aGUgY2VydGlmaWNhdGUgdGhhdCBwcmV2ZW50ZWQgIgogICAgICAgICAgICAidXJsbGliMyBmcm9tIGZpbmRpbmcgdGhlIFN1YmplY3RBbHRlcm5hdGl2ZU5hbWUgZmllbGQuIFRoaXMgY2FuICIKICAgICAgICAgICAgImFmZmVjdCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uLiBUaGUgZXJyb3Igd2FzICVzIiwKICAgICAgICAgICAgZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuIFtdCgogICAgIyBXZSB3YW50IHRvIHJldHVybiBkTlNOYW1lIGFuZCBpUEFkZHJlc3MgZmllbGRzLiBXZSBuZWVkIHRvIGNhc3QgdGhlIElQcwogICAgIyBiYWNrIHRvIHN0cmluZ3MgYmVjYXVzZSB0aGUgbWF0Y2hfaG9zdG5hbWUgZnVuY3Rpb24gd2FudHMgdGhlbSBhcwogICAgIyBzdHJpbmdzLgogICAgIyBTYWRseSB0aGUgRE5TIG5hbWVzIG5lZWQgdG8gYmUgaWRuYSBlbmNvZGVkIGFuZCB0aGVuLCBvbiBQeXRob24gMywgVVRGLTgKICAgICMgZGVjb2RlZC4gVGhpcyBpcyBwcmV0dHkgZnJ1c3RyYXRpbmcsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgc3RhbmRhcmQgbGlicmFyeQogICAgIyBkb2VzIHdpdGggY2VydGlmaWNhdGVzLCBhbmQgc28gd2UgbmVlZCB0byBhdHRlbXB0IHRvIGRvIHRoZSBzYW1lLgogICAgbmFtZXMgPSBbCiAgICAgICAgKCdETlMnLCBfZG5zbmFtZV90b19zdGRsaWIobmFtZSkpCiAgICAgICAgZm9yIG5hbWUgaW4gZXh0LmdldF92YWx1ZXNfZm9yX3R5cGUoeDUwOS5ETlNOYW1lKQogICAgXQogICAgbmFtZXMuZXh0ZW5kKAogICAgICAgICgnSVAgQWRkcmVzcycsIHN0cihuYW1lKSkKICAgICAgICBmb3IgbmFtZSBpbiBleHQuZ2V0X3ZhbHVlc19mb3JfdHlwZSh4NTA5LklQQWRkcmVzcykKICAgICkKCiAgICByZXR1cm4gbmFtZXMKCgpjbGFzcyBXcmFwcGVkU29ja2V0KG9iamVjdCk6CiAgICAnJydBUEktY29tcGF0aWJpbGl0eSB3cmFwcGVyIGZvciBQeXRob24gT3BlblNTTCdzIENvbm5lY3Rpb24tY2xhc3MuCgogICAgTm90ZTogX21ha2VmaWxlX3JlZnMsIF9kcm9wKCkgYW5kIF9yZXVzZSgpIGFyZSBuZWVkZWQgZm9yIHRoZSBnYXJiYWdlCiAgICBjb2xsZWN0b3Igb2YgcHlweS4KICAgICcnJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uZWN0aW9uLCBzb2NrZXQsIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPVRydWUpOgogICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24KICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldAogICAgICAgIHNlbGYuc3VwcHJlc3NfcmFnZ2VkX2VvZnMgPSBzdXBwcmVzc19yYWdnZWRfZW9mcwogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgPSAwCiAgICAgICAgc2VsZi5fY2xvc2VkID0gRmFsc2UKCiAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5maWxlbm8oKQoKICAgICMgQ29weS1wYXN0ZWQgZnJvbSBQeXRob24gMy41IHNvdXJjZSBjb2RlCiAgICBkZWYgX2RlY3JlZl9zb2NrZXRpb3Moc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA+IDA6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQogICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIHJlY3Yoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRhdGEgPSBzZWxmLmNvbm5lY3Rpb24ucmVjdigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLlN5c0NhbGxFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLnN1cHByZXNzX3JhZ2dlZF9lb2ZzIGFuZCBlLmFyZ3MgPT0gKC0xLCAnVW5leHBlY3RlZCBFT0YnKToKICAgICAgICAgICAgICAgIHJldHVybiBiJycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFNvY2tldEVycm9yKHN0cihlKSkKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuWmVyb1JldHVybkVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuY29ubmVjdGlvbi5nZXRfc2h1dGRvd24oKSA9PSBPcGVuU1NMLlNTTC5SRUNFSVZFRF9TSFVURE9XTjoKICAgICAgICAgICAgICAgIHJldHVybiBiJycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLldhbnRSZWFkRXJyb3I6CiAgICAgICAgICAgIHJkID0gdXRpbC53YWl0X2Zvcl9yZWFkKHNlbGYuc29ja2V0LCBzZWxmLnNvY2tldC5nZXR0aW1lb3V0KCkpCiAgICAgICAgICAgIGlmIG5vdCByZDoKICAgICAgICAgICAgICAgIHJhaXNlIHRpbWVvdXQoJ1RoZSByZWFkIG9wZXJhdGlvbiB0aW1lZCBvdXQnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVjdigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgcmVjdl9pbnRvKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLnJlY3ZfaW50bygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLlN5c0NhbGxFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLnN1cHByZXNzX3JhZ2dlZF9lb2ZzIGFuZCBlLmFyZ3MgPT0gKC0xLCAnVW5leHBlY3RlZCBFT0YnKToKICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBTb2NrZXRFcnJvcihzdHIoZSkpCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLlplcm9SZXR1cm5FcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLmNvbm5lY3Rpb24uZ2V0X3NodXRkb3duKCkgPT0gT3BlblNTTC5TU0wuUkVDRUlWRURfU0hVVERPV046CiAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuV2FudFJlYWRFcnJvcjoKICAgICAgICAgICAgcmQgPSB1dGlsLndhaXRfZm9yX3JlYWQoc2VsZi5zb2NrZXQsIHNlbGYuc29ja2V0LmdldHRpbWVvdXQoKSkKICAgICAgICAgICAgaWYgbm90IHJkOgogICAgICAgICAgICAgICAgcmFpc2UgdGltZW91dCgnVGhlIHJlYWQgb3BlcmF0aW9uIHRpbWVkIG91dCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZWN2X2ludG8oKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBzZXR0aW1lb3V0KHNlbGYsIHRpbWVvdXQpOgogICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5zZXR0aW1lb3V0KHRpbWVvdXQpCgogICAgZGVmIF9zZW5kX3VudGlsX2RvbmUoc2VsZiwgZGF0YSk6CiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5zZW5kKGRhdGEpCiAgICAgICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5XYW50V3JpdGVFcnJvcjoKICAgICAgICAgICAgICAgIHdyID0gdXRpbC53YWl0X2Zvcl93cml0ZShzZWxmLnNvY2tldCwgc2VsZi5zb2NrZXQuZ2V0dGltZW91dCgpKQogICAgICAgICAgICAgICAgaWYgbm90IHdyOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIHRpbWVvdXQoKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLlN5c0NhbGxFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgU29ja2V0RXJyb3Ioc3RyKGUpKQoKICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEpOgogICAgICAgIHRvdGFsX3NlbnQgPSAwCiAgICAgICAgd2hpbGUgdG90YWxfc2VudCA8IGxlbihkYXRhKToKICAgICAgICAgICAgc2VudCA9IHNlbGYuX3NlbmRfdW50aWxfZG9uZShkYXRhW3RvdGFsX3NlbnQ6dG90YWxfc2VudCArIFNTTF9XUklURV9CTE9DS1NJWkVdKQogICAgICAgICAgICB0b3RhbF9zZW50ICs9IHNlbnQKCiAgICBkZWYgc2h1dGRvd24oc2VsZik6CiAgICAgICAgIyBGSVhNRSByZXRocm93IGNvbXBhdGlibGUgZXhjZXB0aW9ucyBzaG91bGQgd2UgZXZlciB1c2UgdGhpcwogICAgICAgIHNlbGYuY29ubmVjdGlvbi5zaHV0ZG93bigpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX21ha2VmaWxlX3JlZnMgPCAxOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLl9jbG9zZWQgPSBUcnVlCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLmNsb3NlKCkKICAgICAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLkVycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCgogICAgZGVmIGdldHBlZXJjZXJ0KHNlbGYsIGJpbmFyeV9mb3JtPUZhbHNlKToKICAgICAgICB4NTA5ID0gc2VsZi5jb25uZWN0aW9uLmdldF9wZWVyX2NlcnRpZmljYXRlKCkKCiAgICAgICAgaWYgbm90IHg1MDk6CiAgICAgICAgICAgIHJldHVybiB4NTA5CgogICAgICAgIGlmIGJpbmFyeV9mb3JtOgogICAgICAgICAgICByZXR1cm4gT3BlblNTTC5jcnlwdG8uZHVtcF9jZXJ0aWZpY2F0ZSgKICAgICAgICAgICAgICAgIE9wZW5TU0wuY3J5cHRvLkZJTEVUWVBFX0FTTjEsCiAgICAgICAgICAgICAgICB4NTA5KQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnc3ViamVjdCc6ICgKICAgICAgICAgICAgICAgICgoJ2NvbW1vbk5hbWUnLCB4NTA5LmdldF9zdWJqZWN0KCkuQ04pLCksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdzdWJqZWN0QWx0TmFtZSc6IGdldF9zdWJqX2FsdF9uYW1lKHg1MDkpCiAgICAgICAgfQoKICAgIGRlZiBfcmV1c2Uoc2VsZik6CiAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyArPSAxCgogICAgZGVmIF9kcm9wKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX21ha2VmaWxlX3JlZnMgPCAxOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzIC09IDEKCgppZiBfZmlsZW9iamVjdDogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyCiAgICBkZWYgbWFrZWZpbGUoc2VsZiwgbW9kZSwgYnVmc2l6ZT0tMSk6CiAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyArPSAxCiAgICAgICAgcmV0dXJuIF9maWxlb2JqZWN0KHNlbGYsIG1vZGUsIGJ1ZnNpemUsIGNsb3NlPVRydWUpCmVsc2U6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMwogICAgbWFrZWZpbGUgPSBiYWNrcG9ydF9tYWtlZmlsZQoKV3JhcHBlZFNvY2tldC5tYWtlZmlsZSA9IG1ha2VmaWxlCgoKY2xhc3MgUHlPcGVuU1NMQ29udGV4dChvYmplY3QpOgogICAgIiIiCiAgICBJIGFtIGEgd3JhcHBlciBjbGFzcyBmb3IgdGhlIFB5T3BlblNTTCBgYENvbnRleHRgYCBvYmplY3QuIEkgYW0gcmVzcG9uc2libGUKICAgIGZvciB0cmFuc2xhdGluZyB0aGUgaW50ZXJmYWNlIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGBgU1NMQ29udGV4dGBgIG9iamVjdAogICAgdG8gY2FsbHMgaW50byBQeU9wZW5TU0wuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CiAgICAgICAgc2VsZi5wcm90b2NvbCA9IF9vcGVuc3NsX3ZlcnNpb25zW3Byb3RvY29sXQogICAgICAgIHNlbGYuX2N0eCA9IE9wZW5TU0wuU1NMLkNvbnRleHQoc2VsZi5wcm90b2NvbCkKICAgICAgICBzZWxmLl9vcHRpb25zID0gMAogICAgICAgIHNlbGYuY2hlY2tfaG9zdG5hbWUgPSBGYWxzZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wdGlvbnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMKCiAgICBAb3B0aW9ucy5zZXR0ZXIKICAgIGRlZiBvcHRpb25zKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9vcHRpb25zID0gdmFsdWUKICAgICAgICBzZWxmLl9jdHguc2V0X29wdGlvbnModmFsdWUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyaWZ5X21vZGUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9vcGVuc3NsX3RvX3N0ZGxpYl92ZXJpZnlbc2VsZi5fY3R4LmdldF92ZXJpZnlfbW9kZSgpXQoKICAgIEB2ZXJpZnlfbW9kZS5zZXR0ZXIKICAgIGRlZiB2ZXJpZnlfbW9kZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fY3R4LnNldF92ZXJpZnkoCiAgICAgICAgICAgIF9zdGRsaWJfdG9fb3BlbnNzbF92ZXJpZnlbdmFsdWVdLAogICAgICAgICAgICBfdmVyaWZ5X2NhbGxiYWNrCiAgICAgICAgKQoKICAgIGRlZiBzZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoc2VsZik6CiAgICAgICAgc2VsZi5fY3R4LnNldF9kZWZhdWx0X3ZlcmlmeV9wYXRocygpCgogICAgZGVmIHNldF9jaXBoZXJzKHNlbGYsIGNpcGhlcnMpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY2lwaGVycywgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgICAgIGNpcGhlcnMgPSBjaXBoZXJzLmVuY29kZSgndXRmLTgnKQogICAgICAgIHNlbGYuX2N0eC5zZXRfY2lwaGVyX2xpc3QoY2lwaGVycykKCiAgICBkZWYgbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNlbGYsIGNhZmlsZT1Ob25lLCBjYXBhdGg9Tm9uZSwgY2FkYXRhPU5vbmUpOgogICAgICAgIGlmIGNhZmlsZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgY2FmaWxlID0gY2FmaWxlLmVuY29kZSgndXRmLTgnKQogICAgICAgIGlmIGNhcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY2FwYXRoID0gY2FwYXRoLmVuY29kZSgndXRmLTgnKQogICAgICAgIHNlbGYuX2N0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FmaWxlLCBjYXBhdGgpCiAgICAgICAgaWYgY2FkYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl9jdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKEJ5dGVzSU8oY2FkYXRhKSkKCiAgICBkZWYgbG9hZF9jZXJ0X2NoYWluKHNlbGYsIGNlcnRmaWxlLCBrZXlmaWxlPU5vbmUsIHBhc3N3b3JkPU5vbmUpOgogICAgICAgIHNlbGYuX2N0eC51c2VfY2VydGlmaWNhdGVfZmlsZShjZXJ0ZmlsZSkKICAgICAgICBpZiBwYXNzd29yZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5fY3R4LnNldF9wYXNzd2RfY2IobGFtYmRhIG1heF9sZW5ndGgsIHByb21wdF90d2ljZSwgdXNlcmRhdGE6IHBhc3N3b3JkKQogICAgICAgIHNlbGYuX2N0eC51c2VfcHJpdmF0ZWtleV9maWxlKGtleWZpbGUgb3IgY2VydGZpbGUpCgogICAgZGVmIHdyYXBfc29ja2V0KHNlbGYsIHNvY2ssIHNlcnZlcl9zaWRlPUZhbHNlLAogICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPVRydWUsCiAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPU5vbmUpOgogICAgICAgIGNueCA9IE9wZW5TU0wuU1NMLkNvbm5lY3Rpb24oc2VsZi5fY3R4LCBzb2NrKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHNlcnZlcl9ob3N0bmFtZSwgc2l4LnRleHRfdHlwZSk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMwogICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWUgPSBzZXJ2ZXJfaG9zdG5hbWUuZW5jb2RlKCd1dGYtOCcpCgogICAgICAgIGlmIHNlcnZlcl9ob3N0bmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgY254LnNldF90bHNleHRfaG9zdF9uYW1lKHNlcnZlcl9ob3N0bmFtZSkKCiAgICAgICAgY254LnNldF9jb25uZWN0X3N0YXRlKCkKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY254LmRvX2hhbmRzaGFrZSgpCiAgICAgICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5XYW50UmVhZEVycm9yOgogICAgICAgICAgICAgICAgcmQgPSB1dGlsLndhaXRfZm9yX3JlYWQoc29jaywgc29jay5nZXR0aW1lb3V0KCkpCiAgICAgICAgICAgICAgICBpZiBub3QgcmQ6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdGltZW91dCgnc2VsZWN0IHRpbWVkIG91dCcpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcignYmFkIGhhbmRzaGFrZTogJXInICUgZSkKICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgcmV0dXJuIFdyYXBwZWRTb2NrZXQoY254LCBzb2NrKQoKCmRlZiBfdmVyaWZ5X2NhbGxiYWNrKGNueCwgeDUwOSwgZXJyX25vLCBlcnJfZGVwdGgsIHJldHVybl9jb2RlKToKICAgIHJldHVybiBlcnJfbm8gPT0gMApQSwMEFAAAAAAAAAAhAOdTwPMldwAAJXcAAEsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zZWN1cmV0cmFuc3BvcnQucHkiIiIKU2VjdXJlVHJhbnBvcnQgc3VwcG9ydCBmb3IgdXJsbGliMyB2aWEgY3R5cGVzLgoKVGhpcyBtYWtlcyBwbGF0Zm9ybS1uYXRpdmUgVExTIGF2YWlsYWJsZSB0byB1cmxsaWIzIHVzZXJzIG9uIG1hY09TIHdpdGhvdXQgdGhlCnVzZSBvZiBhIGNvbXBpbGVyLiBUaGlzIGlzIGFuIGltcG9ydGFudCBmZWF0dXJlIGJlY2F1c2UgdGhlIFB5dGhvbiBQYWNrYWdlCkluZGV4IGlzIG1vdmluZyB0byBiZWNvbWUgYSBUTFN2MS4yLW9yLWhpZ2hlciBzZXJ2ZXIsIGFuZCB0aGUgZGVmYXVsdCBPcGVuU1NMCnRoYXQgc2hpcHMgd2l0aCBtYWNPUyBpcyBub3QgY2FwYWJsZSBvZiBkb2luZyBUTFN2MS4yLiBUaGUgb25seSB3YXkgdG8gcmVzb2x2ZQp0aGlzIGlzIHRvIGdpdmUgbWFjT1MgdXNlcnMgYW4gYWx0ZXJuYXRpdmUgc29sdXRpb24gdG8gdGhlIHByb2JsZW0sIGFuZCB0aGF0CnNvbHV0aW9uIGlzIHRvIHVzZSBTZWN1cmVUcmFuc3BvcnQuCgpXZSB1c2UgY3R5cGVzIGhlcmUgYmVjYXVzZSB0aGlzIHNvbHV0aW9uIG11c3Qgbm90IHJlcXVpcmUgYSBjb21waWxlci4gVGhhdCdzCmJlY2F1c2UgcGlwIGlzIG5vdCBhbGxvd2VkIHRvIHJlcXVpcmUgYSBjb21waWxlciBlaXRoZXIuCgpUaGlzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIHNlcmlvdXNseSBsb25nLXRlcm0gc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtLgpUaGUgaG9wZSBpcyB0aGF0IFBFUCA1NDMgd2lsbCBldmVudHVhbGx5IHNvbHZlIHRoaXMgaXNzdWUgZm9yIHVzLCBhdCB3aGljaApwb2ludCB3ZSBjYW4gcmV0aXJlIHRoaXMgY29udHJpYiBtb2R1bGUuIEJ1dCBpbiB0aGUgc2hvcnQgdGVybSwgd2UgbmVlZCB0bwpzb2x2ZSB0aGUgaW1wZW5kaW5nIHRpcmUgZmlyZSB0aGF0IGlzIFB5dGhvbiBvbiBNYWMgd2l0aG91dCB0aGlzIGtpbmQgb2YKY29udHJpYiBtb2R1bGUuIFNvLi4uaGVyZSB3ZSBhcmUuCgpUbyB1c2UgdGhpcyBtb2R1bGUsIHNpbXBseSBpbXBvcnQgYW5kIGluamVjdCBpdDo6CgogICAgaW1wb3J0IHVybGxpYjMuY29udHJpYi5zZWN1cmV0cmFuc3BvcnQKICAgIHVybGxpYjMuY29udHJpYi5zZWN1cmV0cmFuc3BvcnQuaW5qZWN0X2ludG9fdXJsbGliMygpCgpIYXBweSBUTFNpbmchCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGN0eXBlcwppbXBvcnQgZXJybm8KaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHNodXRpbAppbXBvcnQgc29ja2V0CmltcG9ydCBzc2wKaW1wb3J0IHRocmVhZGluZwppbXBvcnQgd2Vha3JlZgoKZnJvbSAuLiBpbXBvcnQgdXRpbApmcm9tIC5fc2VjdXJldHJhbnNwb3J0LmJpbmRpbmdzIGltcG9ydCAoCiAgICBTZWN1cml0eSwgU2VjdXJpdHlDb25zdCwgQ29yZUZvdW5kYXRpb24KKQpmcm9tIC5fc2VjdXJldHJhbnNwb3J0Lmxvd19sZXZlbCBpbXBvcnQgKAogICAgX2Fzc2VydF9ub19lcnJvciwgX2NlcnRfYXJyYXlfZnJvbV9wZW0sIF90ZW1wb3Jhcnlfa2V5Y2hhaW4sCiAgICBfbG9hZF9jbGllbnRfY2VydF9jaGFpbgopCgp0cnk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMgogICAgZnJvbSBzb2NrZXQgaW1wb3J0IF9maWxlb2JqZWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICBfZmlsZW9iamVjdCA9IE5vbmUKICAgIGZyb20gLi5wYWNrYWdlcy5iYWNrcG9ydHMubWFrZWZpbGUgaW1wb3J0IGJhY2twb3J0X21ha2VmaWxlCgp0cnk6CiAgICBtZW1vcnl2aWV3KGInJykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIHJhaXNlIEltcG9ydEVycm9yKCJTZWN1cmVUcmFuc3BvcnQgb25seSB3b3JrcyBvbiBQeXRob25zIHdpdGggbWVtb3J5dmlldyIpCgpfX2FsbF9fID0gWydpbmplY3RfaW50b191cmxsaWIzJywgJ2V4dHJhY3RfZnJvbV91cmxsaWIzJ10KCiMgU05JIGFsd2F5cyB3b3JrcwpIQVNfU05JID0gVHJ1ZQoKb3JpZ191dGlsX0hBU19TTkkgPSB1dGlsLkhBU19TTkkKb3JpZ191dGlsX1NTTENvbnRleHQgPSB1dGlsLnNzbF8uU1NMQ29udGV4dAoKIyBUaGlzIGRpY3Rpb25hcnkgaXMgdXNlZCBieSB0aGUgcmVhZCBjYWxsYmFjayB0byBvYnRhaW4gYSBoYW5kbGUgdG8gdGhlCiMgY2FsbGluZyB3cmFwcGVkIHNvY2tldC4gVGhpcyBpcyBhIHByZXR0eSBzaWxseSBhcHByb2FjaCwgYnV0IGZvciBub3cgaXQnbGwKIyBkby4gSSBmZWVsIGxpa2UgSSBzaG91bGQgYmUgYWJsZSB0byBzbXVnZ2xlIGEgaGFuZGxlIHRvIHRoZSB3cmFwcGVkIHNvY2tldAojIGRpcmVjdGx5IGluIHRoZSBTU0xDb25uZWN0aW9uUmVmLCBidXQgZm9yIG5vdyB0aGlzIGFwcHJvYWNoIHdpbGwgd29yayBJCiMgZ3Vlc3MuCiMKIyBXZSBuZWVkIHRvIGxvY2sgYXJvdW5kIHRoaXMgc3RydWN0dXJlIGZvciBpbnNlcnRzLCBidXQgd2UgZG9uJ3QgZG8gaXQgZm9yCiMgcmVhZHMvd3JpdGVzIGluIHRoZSBjYWxsYmFja3MuIFRoZSByZWFzb25pbmcgaGVyZSBnb2VzIGFzIGZvbGxvd3M6CiMKIyAgICAxLiBJdCBpcyBub3QgcG9zc2libGUgdG8gY2FsbCBpbnRvIHRoZSBjYWxsYmFja3MgYmVmb3JlIHRoZSBkaWN0aW9uYXJ5IGlzCiMgICAgICAgcG9wdWxhdGVkLCBzbyBvbmNlIGluIHRoZSBjYWxsYmFjayB0aGUgaWQgbXVzdCBiZSBpbiB0aGUgZGljdGlvbmFyeS4KIyAgICAyLiBUaGUgY2FsbGJhY2tzIGRvbid0IG11dGF0ZSB0aGUgZGljdGlvbmFyeSwgdGhleSBvbmx5IHJlYWQgZnJvbSBpdCwgYW5kCiMgICAgICAgc28gY2Fubm90IGNvbmZsaWN0IHdpdGggYW55IG9mIHRoZSBpbnNlcnRpb25zLgojCiMgVGhpcyBpcyBnb29kOiBpZiB3ZSBoYWQgdG8gbG9jayBpbiB0aGUgY2FsbGJhY2tzIHdlJ2QgZHJhc3RpY2FsbHkgc2xvdyBkb3duCiMgdGhlIHBlcmZvcm1hbmNlIG9mIHRoaXMgY29kZS4KX2Nvbm5lY3Rpb25fcmVmcyA9IHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSgpCl9jb25uZWN0aW9uX3JlZl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQoKIyBMaW1pdCB3cml0ZXMgdG8gMTZrQi4gVGhpcyBpcyBPcGVuU1NMJ3MgbGltaXQsIGJ1dCB3ZSdsbCBjYXJnby1jdWx0IGl0IG92ZXIKIyBmb3Igbm8gYmV0dGVyIHJlYXNvbiB0aGFuIHdlIG5lZWQgKmEqIGxpbWl0LCBhbmQgdGhpcyBvbmUgaXMgcmlnaHQgdGhlcmUuClNTTF9XUklURV9CTE9DS1NJWkUgPSAxNjM4NAoKIyBUaGlzIGlzIG91ciBlcXVpdmFsZW50IG9mIHV0aWwuc3NsXy5ERUZBVUxUX0NJUEhFUlMsIGJ1dCBleHBhbmRlZCBvdXQgdG8KIyBpbmRpdmlkdWFsIGNpcGhlciBzdWl0ZXMuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWN1YXNlIHRoaXMgaXMgaG93CiMgU2VjdXJlVHJhbnNwb3J0IHdhbnRzIHRoZW0uCkNJUEhFUl9TVUlURVMgPSBbCiAgICBTZWN1cml0eUNvbnN0LlRMU19BRVNfMjU2X0dDTV9TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX0RTU19XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCl0KCiMgQmFzaWNhbGx5IHRoaXMgaXMgc2ltcGxlOiBmb3IgUFJPVE9DT0xfU1NMdjIzIHdlIHR1cm4gaXQgaW50byBhIGxvdyBvZgojIFRMU3YxIGFuZCBhIGhpZ2ggb2YgVExTdjEuMi4gRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgd2UgcGluIHRvIHRoYXQgdmVyc2lvbi4KX3Byb3RvY29sX3RvX21pbl9tYXggPSB7CiAgICBzc2wuUFJPVE9DT0xfU1NMdjIzOiAoU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxLCBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEyKSwKfQoKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9TU0x2MiIpOgogICAgX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1NTTHYyXSA9ICgKICAgICAgICBTZWN1cml0eUNvbnN0LmtTU0xQcm90b2NvbDIsIFNlY3VyaXR5Q29uc3Qua1NTTFByb3RvY29sMgogICAgKQppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1NTTHYzIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfU1NMdjNdID0gKAogICAgICAgIFNlY3VyaXR5Q29uc3Qua1NTTFByb3RvY29sMywgU2VjdXJpdHlDb25zdC5rU1NMUHJvdG9jb2wzCiAgICApCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfVExTdjEiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9UTFN2MV0gPSAoCiAgICAgICAgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxLCBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEKICAgICkKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9UTFN2MV8xIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfVExTdjFfMV0gPSAoCiAgICAgICAgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxMSwgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxMQogICAgKQppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1RMU3YxXzIiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9UTFN2MV8yXSA9ICgKICAgICAgICBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEyLCBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEyCiAgICApCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfVExTIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfVExTXSA9IF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9TU0x2MjNdCgoKZGVmIGluamVjdF9pbnRvX3VybGxpYjMoKToKICAgICIiIgogICAgTW9ua2V5LXBhdGNoIHVybGxpYjMgd2l0aCBTZWN1cmVUcmFuc3BvcnQtYmFja2VkIFNTTC1zdXBwb3J0LgogICAgIiIiCiAgICB1dGlsLnNzbF8uU1NMQ29udGV4dCA9IFNlY3VyZVRyYW5zcG9ydENvbnRleHQKICAgIHV0aWwuSEFTX1NOSSA9IEhBU19TTkkKICAgIHV0aWwuc3NsXy5IQVNfU05JID0gSEFTX1NOSQogICAgdXRpbC5JU19TRUNVUkVUUkFOU1BPUlQgPSBUcnVlCiAgICB1dGlsLnNzbF8uSVNfU0VDVVJFVFJBTlNQT1JUID0gVHJ1ZQoKCmRlZiBleHRyYWN0X2Zyb21fdXJsbGliMygpOgogICAgIiIiCiAgICBVbmRvIG1vbmtleS1wYXRjaGluZyBieSA6ZnVuYzpgaW5qZWN0X2ludG9fdXJsbGliM2AuCiAgICAiIiIKICAgIHV0aWwuc3NsXy5TU0xDb250ZXh0ID0gb3JpZ191dGlsX1NTTENvbnRleHQKICAgIHV0aWwuSEFTX1NOSSA9IG9yaWdfdXRpbF9IQVNfU05JCiAgICB1dGlsLnNzbF8uSEFTX1NOSSA9IG9yaWdfdXRpbF9IQVNfU05JCiAgICB1dGlsLklTX1NFQ1VSRVRSQU5TUE9SVCA9IEZhbHNlCiAgICB1dGlsLnNzbF8uSVNfU0VDVVJFVFJBTlNQT1JUID0gRmFsc2UKCgpkZWYgX3JlYWRfY2FsbGJhY2soY29ubmVjdGlvbl9pZCwgZGF0YV9idWZmZXIsIGRhdGFfbGVuZ3RoX3BvaW50ZXIpOgogICAgIiIiCiAgICBTZWN1cmVUcmFuc3BvcnQgcmVhZCBjYWxsYmFjay4gVGhpcyBpcyBjYWxsZWQgYnkgU1QgdG8gcmVxdWVzdCB0aGF0IGRhdGEKICAgIGJlIHJldHVybmVkIGZyb20gdGhlIHNvY2tldC4KICAgICIiIgogICAgd3JhcHBlZF9zb2NrZXQgPSBOb25lCiAgICB0cnk6CiAgICAgICAgd3JhcHBlZF9zb2NrZXQgPSBfY29ubmVjdGlvbl9yZWZzLmdldChjb25uZWN0aW9uX2lkKQogICAgICAgIGlmIHdyYXBwZWRfc29ja2V0IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTEludGVybmFsCiAgICAgICAgYmFzZV9zb2NrZXQgPSB3cmFwcGVkX3NvY2tldC5zb2NrZXQKCiAgICAgICAgcmVxdWVzdGVkX2xlbmd0aCA9IGRhdGFfbGVuZ3RoX3BvaW50ZXJbMF0KCiAgICAgICAgdGltZW91dCA9IHdyYXBwZWRfc29ja2V0LmdldHRpbWVvdXQoKQogICAgICAgIGVycm9yID0gTm9uZQogICAgICAgIHJlYWRfY291bnQgPSAwCiAgICAgICAgYnVmZmVyID0gKGN0eXBlcy5jX2NoYXIgKiByZXF1ZXN0ZWRfbGVuZ3RoKS5mcm9tX2FkZHJlc3MoZGF0YV9idWZmZXIpCiAgICAgICAgYnVmZmVyX3ZpZXcgPSBtZW1vcnl2aWV3KGJ1ZmZlcikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSByZWFkX2NvdW50IDwgcmVxdWVzdGVkX2xlbmd0aDoKICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZSBvciB0aW1lb3V0ID49IDA6CiAgICAgICAgICAgICAgICAgICAgcmVhZGFibGVzID0gdXRpbC53YWl0X2Zvcl9yZWFkKFtiYXNlX3NvY2tldF0sIHRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWRhYmxlczoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yKGVycm5vLkVBR0FJTiwgJ3RpbWVkIG91dCcpCgogICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHRlbGwgY3R5cGVzIHRoYXQgd2UgaGF2ZSBhIGJ1ZmZlciB0aGF0IGNhbiBiZQogICAgICAgICAgICAgICAgIyB3cml0dGVuIHRvLiBVcHNldHRpbmdseSwgd2UgZG8gdGhhdCBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgICBjaHVua19zaXplID0gYmFzZV9zb2NrZXQucmVjdl9pbnRvKAogICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl92aWV3W3JlYWRfY291bnQ6cmVxdWVzdGVkX2xlbmd0aF0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJlYWRfY291bnQgKz0gY2h1bmtfc2l6ZQogICAgICAgICAgICAgICAgaWYgbm90IGNodW5rX3NpemU6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWRfY291bnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTENsb3NlZEdyYWNlZnVsCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvcikgYXMgZToKICAgICAgICAgICAgZXJyb3IgPSBlLmVycm5vCgogICAgICAgICAgICBpZiBlcnJvciBpcyBub3QgTm9uZSBhbmQgZXJyb3IgIT0gZXJybm8uRUFHQUlOOgogICAgICAgICAgICAgICAgaWYgZXJyb3IgPT0gZXJybm8uRUNPTk5SRVNFVDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xDbG9zZWRBYm9ydAogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZGF0YV9sZW5ndGhfcG9pbnRlclswXSA9IHJlYWRfY291bnQKCiAgICAgICAgaWYgcmVhZF9jb3VudCAhPSByZXF1ZXN0ZWRfbGVuZ3RoOgogICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrCgogICAgICAgIHJldHVybiAwCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaWYgd3JhcHBlZF9zb2NrZXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdyYXBwZWRfc29ja2V0Ll9leGNlcHRpb24gPSBlCiAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMSW50ZXJuYWwKCgpkZWYgX3dyaXRlX2NhbGxiYWNrKGNvbm5lY3Rpb25faWQsIGRhdGFfYnVmZmVyLCBkYXRhX2xlbmd0aF9wb2ludGVyKToKICAgICIiIgogICAgU2VjdXJlVHJhbnNwb3J0IHdyaXRlIGNhbGxiYWNrLiBUaGlzIGlzIGNhbGxlZCBieSBTVCB0byByZXF1ZXN0IHRoYXQgZGF0YQogICAgYWN0dWFsbHkgYmUgc2VudCBvbiB0aGUgbmV0d29yay4KICAgICIiIgogICAgd3JhcHBlZF9zb2NrZXQgPSBOb25lCiAgICB0cnk6CiAgICAgICAgd3JhcHBlZF9zb2NrZXQgPSBfY29ubmVjdGlvbl9yZWZzLmdldChjb25uZWN0aW9uX2lkKQogICAgICAgIGlmIHdyYXBwZWRfc29ja2V0IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTEludGVybmFsCiAgICAgICAgYmFzZV9zb2NrZXQgPSB3cmFwcGVkX3NvY2tldC5zb2NrZXQKCiAgICAgICAgYnl0ZXNfdG9fd3JpdGUgPSBkYXRhX2xlbmd0aF9wb2ludGVyWzBdCiAgICAgICAgZGF0YSA9IGN0eXBlcy5zdHJpbmdfYXQoZGF0YV9idWZmZXIsIGJ5dGVzX3RvX3dyaXRlKQoKICAgICAgICB0aW1lb3V0ID0gd3JhcHBlZF9zb2NrZXQuZ2V0dGltZW91dCgpCiAgICAgICAgZXJyb3IgPSBOb25lCiAgICAgICAgc2VudCA9IDAKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSBzZW50IDwgYnl0ZXNfdG9fd3JpdGU6CiAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmUgb3IgdGltZW91dCA+PSAwOgogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlcyA9IHV0aWwud2FpdF9mb3Jfd3JpdGUoW2Jhc2Vfc29ja2V0XSwgdGltZW91dCkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgd3JpdGFibGVzOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoZXJybm8uRUFHQUlOLCAndGltZWQgb3V0JykKICAgICAgICAgICAgICAgIGNodW5rX3NlbnQgPSBiYXNlX3NvY2tldC5zZW5kKGRhdGEpCiAgICAgICAgICAgICAgICBzZW50ICs9IGNodW5rX3NlbnQKCiAgICAgICAgICAgICAgICAjIFRoaXMgaGFzIHNvbWUgbmVlZGxlc3MgY29weWluZyBoZXJlLCBidXQgSSdtIG5vdCBzdXJlIHRoZXJlJ3MKICAgICAgICAgICAgICAgICMgbXVjaCB2YWx1ZSBpbiBvcHRpbWlzaW5nIHRoaXMgZGF0YSBwYXRoLgogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbY2h1bmtfc2VudDpdCiAgICAgICAgZXhjZXB0IChzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgIGVycm9yID0gZS5lcnJubwoKICAgICAgICAgICAgaWYgZXJyb3IgaXMgbm90IE5vbmUgYW5kIGVycm9yICE9IGVycm5vLkVBR0FJTjoKICAgICAgICAgICAgICAgIGlmIGVycm9yID09IGVycm5vLkVDT05OUkVTRVQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMQ2xvc2VkQWJvcnQKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGRhdGFfbGVuZ3RoX3BvaW50ZXJbMF0gPSBzZW50CiAgICAgICAgaWYgc2VudCAhPSBieXRlc190b193cml0ZToKICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMV291bGRCbG9jawoKICAgICAgICByZXR1cm4gMAogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGlmIHdyYXBwZWRfc29ja2V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICB3cmFwcGVkX3NvY2tldC5fZXhjZXB0aW9uID0gZQogICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTEludGVybmFsCgoKIyBXZSBuZWVkIHRvIGtlZXAgdGhlc2UgdHdvIG9iamVjdHMgcmVmZXJlbmNlcyBhbGl2ZTogaWYgdGhleSBnZXQgR0MnZCB3aGlsZQojIGluIHVzZSB0aGVuIFNlY3VyZVRyYW5zcG9ydCBjb3VsZCBhdHRlbXB0IHRvIGNhbGwgYSBmdW5jdGlvbiB0aGF0IGlzIGluIGZyZWVkCiMgbWVtb3J5LiBUaGF0IHdvdWxkIGJlLi4udWguLi5iYWQuIFllYWgsIHRoYXQncyB0aGUgd29yZC4gQmFkLgpfcmVhZF9jYWxsYmFja19wb2ludGVyID0gU2VjdXJpdHkuU1NMUmVhZEZ1bmMoX3JlYWRfY2FsbGJhY2spCl93cml0ZV9jYWxsYmFja19wb2ludGVyID0gU2VjdXJpdHkuU1NMV3JpdGVGdW5jKF93cml0ZV9jYWxsYmFjaykKCgpjbGFzcyBXcmFwcGVkU29ja2V0KG9iamVjdCk6CiAgICAiIiIKICAgIEFQSS1jb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIFB5dGhvbidzIE9wZW5TU0wgd3JhcHBlZCBzb2NrZXQgb2JqZWN0LgoKICAgIE5vdGU6IF9tYWtlZmlsZV9yZWZzLCBfZHJvcCgpLCBhbmQgX3JldXNlKCkgYXJlIG5lZWRlZCBmb3IgdGhlIGdhcmJhZ2UKICAgIGNvbGxlY3RvciBvZiBQeVB5LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgc29ja2V0KToKICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldAogICAgICAgIHNlbGYuY29udGV4dCA9IE5vbmUKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzID0gMAogICAgICAgIHNlbGYuX2Nsb3NlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0gTm9uZQogICAgICAgIHNlbGYuX2tleWNoYWluID0gTm9uZQogICAgICAgIHNlbGYuX2tleWNoYWluX2RpciA9IE5vbmUKICAgICAgICBzZWxmLl9jbGllbnRfY2VydF9jaGFpbiA9IE5vbmUKCiAgICAgICAgIyBXZSBzYXZlIG9mZiB0aGUgcHJldmlvdXNseS1jb25maWd1cmVkIHRpbWVvdXQgYW5kIHRoZW4gc2V0IGl0IHRvCiAgICAgICAgIyB6ZXJvLiBUaGlzIGlzIGRvbmUgYmVjYXVzZSB3ZSB1c2Ugc2VsZWN0IGFuZCBmcmllbmRzIHRvIGhhbmRsZSB0aGUKICAgICAgICAjIHRpbWVvdXRzLCBidXQgaWYgd2UgbGVhdmUgdGhlIHRpbWVvdXQgc2V0IG9uIHRoZSBsb3dlciBzb2NrZXQgdGhlbgogICAgICAgICMgUHl0aG9uIHdpbGwgImtpbmRseSIgY2FsbCBzZWxlY3Qgb24gdGhhdCBzb2NrZXQgYWdhaW4gZm9yIHVzLiBBdm9pZAogICAgICAgICMgdGhhdCBieSBmb3JjaW5nIHRoZSB0aW1lb3V0IHRvIHplcm8uCiAgICAgICAgc2VsZi5fdGltZW91dCA9IHNlbGYuc29ja2V0LmdldHRpbWVvdXQoKQogICAgICAgIHNlbGYuc29ja2V0LnNldHRpbWVvdXQoMCkKCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIF9yYWlzZV9vbl9lcnJvcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBIGNvbnRleHQgbWFuYWdlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyYXAgY2FsbHMgdGhhdCBkbyBJL08gZnJvbQogICAgICAgIFNlY3VyZVRyYW5zcG9ydC4gSWYgYW55IG9mIHRoZSBJL08gY2FsbGJhY2tzIGhpdCBhbiBleGNlcHRpb24sIHRoaXMKICAgICAgICBjb250ZXh0IG1hbmFnZXIgd2lsbCBjb3JyZWN0bHkgcHJvcGFnYXRlIHRoZSBleGNlcHRpb24gYWZ0ZXIgdGhlIGZhY3QuCiAgICAgICAgVGhpcyBhdm9pZHMgc2lsZW50bHkgc3dhbGxvd2luZyB0aG9zZSBleGNlcHRpb25zLgoKICAgICAgICBJdCBhbHNvIGNvcnJlY3RseSBmb3JjZXMgdGhlIHNvY2tldCBjbG9zZWQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0gTm9uZQoKICAgICAgICAjIFdlIGV4cGxpY2l0bHkgZG9uJ3QgY2F0Y2ggYXJvdW5kIHRoaXMgeWllbGQgYmVjYXVzZSBpbiB0aGUgdW5saWtlbHkKICAgICAgICAjIGV2ZW50IHRoYXQgYW4gZXhjZXB0aW9uIHdhcyBoaXQgaW4gdGhlIGJsb2NrIHdlIGRvbid0IHdhbnQgdG8gc3dhbGxvdwogICAgICAgICMgaXQuCiAgICAgICAgeWllbGQKICAgICAgICBpZiBzZWxmLl9leGNlcHRpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGV4Y2VwdGlvbiwgc2VsZi5fZXhjZXB0aW9uID0gc2VsZi5fZXhjZXB0aW9uLCBOb25lCiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICByYWlzZSBleGNlcHRpb24KCiAgICBkZWYgX3NldF9jaXBoZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNldHMgdXAgdGhlIGFsbG93ZWQgY2lwaGVycy4gQnkgZGVmYXVsdCB0aGlzIG1hdGNoZXMgdGhlIHNldCBpbgogICAgICAgIHV0aWwuc3NsXy5ERUZBVUxUX0NJUEhFUlMsIGF0IGxlYXN0IGFzIHN1cHBvcnRlZCBieSBtYWNPUy4gVGhpcyBpcyBkb25lCiAgICAgICAgY3VzdG9tIGFuZCBkb2Vzbid0IGFsbG93IGNoYW5naW5nIGF0IHRoaXMgdGltZSwgbW9zdGx5IGJlY2F1c2UgcGFyc2luZwogICAgICAgIE9wZW5TU0wgY2lwaGVyIHN0cmluZ3MgaXMgZ29pbmcgdG8gYmUgYSBmcmVha2luZyBuaWdodG1hcmUuCiAgICAgICAgIiIiCiAgICAgICAgY2lwaGVycyA9IChTZWN1cml0eS5TU0xDaXBoZXJTdWl0ZSAqIGxlbihDSVBIRVJfU1VJVEVTKSkoKkNJUEhFUl9TVUlURVMpCiAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0RW5hYmxlZENpcGhlcnMoCiAgICAgICAgICAgIHNlbGYuY29udGV4dCwgY2lwaGVycywgbGVuKENJUEhFUl9TVUlURVMpCiAgICAgICAgKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgIGRlZiBfY3VzdG9tX3ZhbGlkYXRlKHNlbGYsIHZlcmlmeSwgdHJ1c3RfYnVuZGxlKToKICAgICAgICAiIiIKICAgICAgICBDYWxsZWQgd2hlbiB3ZSBoYXZlIHNldCBjdXN0b20gdmFsaWRhdGlvbi4gV2UgZG8gdGhpcyBpbiB0d28gY2FzZXM6CiAgICAgICAgZmlyc3QsIHdoZW4gY2VydCB2YWxpZGF0aW9uIGlzIGVudGlyZWx5IGRpc2FibGVkOyBhbmQgc2Vjb25kLCB3aGVuCiAgICAgICAgdXNpbmcgYSBjdXN0b20gdHJ1c3QgREIuCiAgICAgICAgIiIiCiAgICAgICAgIyBJZiB3ZSBkaXNhYmxlZCBjZXJ0IHZhbGlkYXRpb24sIGp1c3Qgc2F5OiBjb29sLgogICAgICAgIGlmIG5vdCB2ZXJpZnk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFdlIHdhbnQgZGF0YSBpbiBtZW1vcnksIHNvIGxvYWQgaXQgdXAuCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUodHJ1c3RfYnVuZGxlKToKICAgICAgICAgICAgd2l0aCBvcGVuKHRydXN0X2J1bmRsZSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgIHRydXN0X2J1bmRsZSA9IGYucmVhZCgpCgogICAgICAgIGNlcnRfYXJyYXkgPSBOb25lCiAgICAgICAgdHJ1c3QgPSBTZWN1cml0eS5TZWNUcnVzdFJlZigpCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBHZXQgYSBDRkFycmF5IHRoYXQgY29udGFpbnMgdGhlIGNlcnRzIHdlIHdhbnQuCiAgICAgICAgICAgIGNlcnRfYXJyYXkgPSBfY2VydF9hcnJheV9mcm9tX3BlbSh0cnVzdF9idW5kbGUpCgogICAgICAgICAgICAjIE9rLCBub3cgdGhlIGhhcmQgcGFydC4gV2Ugd2FudCB0byBnZXQgdGhlIFNlY1RydXN0UmVmIHRoYXQgU1QgaGFzCiAgICAgICAgICAgICMgY3JlYXRlZCBmb3IgdGhpcyBjb25uZWN0aW9uLCBzaG92ZSBvdXIgQ0FzIGludG8gaXQsIHRlbGwgU1QgdG8KICAgICAgICAgICAgIyBpZ25vcmUgZXZlcnl0aGluZyBlbHNlIGl0IGtub3dzLCBhbmQgdGhlbiBhc2sgaWYgaXQgY2FuIGJ1aWxkIGEKICAgICAgICAgICAgIyBjaGFpbi4gVGhpcyBpcyBhIGJ1dXV1bmNoIG9mIGNvZGUuCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTENvcHlQZWVyVHJ1c3QoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIGN0eXBlcy5ieXJlZih0cnVzdCkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICAgICAgaWYgbm90IHRydXN0OgogICAgICAgICAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKCJGYWlsZWQgdG8gY29weSB0cnVzdCByZWZlcmVuY2UiKQoKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU2VjVHJ1c3RTZXRBbmNob3JDZXJ0aWZpY2F0ZXModHJ1c3QsIGNlcnRfYXJyYXkpCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU2VjVHJ1c3RTZXRBbmNob3JDZXJ0aWZpY2F0ZXNPbmx5KHRydXN0LCBUcnVlKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgICAgIHRydXN0X3Jlc3VsdCA9IFNlY3VyaXR5LlNlY1RydXN0UmVzdWx0VHlwZSgpCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNlY1RydXN0RXZhbHVhdGUoCiAgICAgICAgICAgICAgICB0cnVzdCwgY3R5cGVzLmJ5cmVmKHRydXN0X3Jlc3VsdCkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiB0cnVzdDoKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZSh0cnVzdCkKCiAgICAgICAgICAgIGlmIGNlcnRfYXJyYXkgaXMgTm9uZToKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0X2FycmF5KQoKICAgICAgICAjIE9rLCBub3cgd2UgY2FuIGxvb2sgYXQgd2hhdCB0aGUgcmVzdWx0IHdhcy4KICAgICAgICBzdWNjZXNzZXMgPSAoCiAgICAgICAgICAgIFNlY3VyaXR5Q29uc3Qua1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQsCiAgICAgICAgICAgIFNlY3VyaXR5Q29uc3Qua1NlY1RydXN0UmVzdWx0UHJvY2VlZAogICAgICAgICkKICAgICAgICBpZiB0cnVzdF9yZXN1bHQudmFsdWUgbm90IGluIHN1Y2Nlc3NlczoKICAgICAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKAogICAgICAgICAgICAgICAgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQsIGVycm9yIGNvZGU6ICVkIiAlCiAgICAgICAgICAgICAgICB0cnVzdF9yZXN1bHQudmFsdWUKICAgICAgICAgICAgKQoKICAgIGRlZiBoYW5kc2hha2Uoc2VsZiwKICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lLAogICAgICAgICAgICAgICAgICB2ZXJpZnksCiAgICAgICAgICAgICAgICAgIHRydXN0X2J1bmRsZSwKICAgICAgICAgICAgICAgICAgbWluX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgIG1heF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICBjbGllbnRfY2VydCwKICAgICAgICAgICAgICAgICAgY2xpZW50X2tleSwKICAgICAgICAgICAgICAgICAgY2xpZW50X2tleV9wYXNzcGhyYXNlKToKICAgICAgICAiIiIKICAgICAgICBBY3R1YWxseSBwZXJmb3JtcyB0aGUgVExTIGhhbmRzaGFrZS4gVGhpcyBpcyBydW4gYXV0b21hdGljYWxseSBieQogICAgICAgIHdyYXBwZWQgc29ja2V0LCBhbmQgc2hvdWxkbid0IGJlIG5lZWRlZCBpbiB1c2VyIGNvZGUuCiAgICAgICAgIiIiCiAgICAgICAgIyBGaXJzdCwgd2UgZG8gdGhlIGluaXRpYWwgYml0cyBvZiBjb25uZWN0aW9uIHNldHVwLiBXZSBuZWVkIHRvIGNyZWF0ZQogICAgICAgICMgYSBjb250ZXh0LCBzZXQgaXRzIEkvTyBmdW5jcywgYW5kIHNldCB0aGUgY29ubmVjdGlvbiByZWZlcmVuY2UuCiAgICAgICAgc2VsZi5jb250ZXh0ID0gU2VjdXJpdHkuU1NMQ3JlYXRlQ29udGV4dCgKICAgICAgICAgICAgTm9uZSwgU2VjdXJpdHlDb25zdC5rU1NMQ2xpZW50U2lkZSwgU2VjdXJpdHlDb25zdC5rU1NMU3RyZWFtVHlwZQogICAgICAgICkKICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRJT0Z1bmNzKAogICAgICAgICAgICBzZWxmLmNvbnRleHQsIF9yZWFkX2NhbGxiYWNrX3BvaW50ZXIsIF93cml0ZV9jYWxsYmFja19wb2ludGVyCiAgICAgICAgKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIEhlcmUgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBoYW5kbGUgdG8gdXNlLiBXZSBkbyB0aGlzIGJ5IHRha2luZyB0aGUKICAgICAgICAjIGlkIG9mIHNlbGYgbW9kdWxvIDIqKjMxIC0gMS4gSWYgdGhpcyBpcyBhbHJlYWR5IGluIHRoZSBkaWN0aW9uYXJ5LCB3ZQogICAgICAgICMganVzdCBrZWVwIGluY3JlbWVudGluZyBieSBvbmUgdW50aWwgd2UgZmluZCBhIGZyZWUgc3BhY2UuCiAgICAgICAgd2l0aCBfY29ubmVjdGlvbl9yZWZfbG9jazoKICAgICAgICAgICAgaGFuZGxlID0gaWQoc2VsZikgJSAyMTQ3NDgzNjQ3CiAgICAgICAgICAgIHdoaWxlIGhhbmRsZSBpbiBfY29ubmVjdGlvbl9yZWZzOgogICAgICAgICAgICAgICAgaGFuZGxlID0gKGhhbmRsZSArIDEpICUgMjE0NzQ4MzY0NwogICAgICAgICAgICBfY29ubmVjdGlvbl9yZWZzW2hhbmRsZV0gPSBzZWxmCgogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldENvbm5lY3Rpb24oc2VsZi5jb250ZXh0LCBoYW5kbGUpCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgSWYgd2UgaGF2ZSBhIHNlcnZlciBob3N0bmFtZSwgd2Ugc2hvdWxkIHNldCB0aGF0IHRvby4KICAgICAgICBpZiBzZXJ2ZXJfaG9zdG5hbWU6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlcnZlcl9ob3N0bmFtZSwgYnl0ZXMpOgogICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lID0gc2VydmVyX2hvc3RuYW1lLmVuY29kZSgndXRmLTgnKQoKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0UGVlckRvbWFpbk5hbWUoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIHNlcnZlcl9ob3N0bmFtZSwgbGVuKHNlcnZlcl9ob3N0bmFtZSkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBTZXR1cCB0aGUgY2lwaGVycy4KICAgICAgICBzZWxmLl9zZXRfY2lwaGVycygpCgogICAgICAgICMgU2V0IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIFRMUyB2ZXJzaW9ucy4KICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NaW4oc2VsZi5jb250ZXh0LCBtaW5fdmVyc2lvbikKICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NYXgoc2VsZi5jb250ZXh0LCBtYXhfdmVyc2lvbikKICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBJZiB0aGVyZSdzIGEgdHJ1c3QgREIsIHdlIG5lZWQgdG8gdXNlIGl0LiBXZSBkbyB0aGF0IGJ5IHRlbGxpbmcKICAgICAgICAjIFNlY3VyZVRyYW5zcG9ydCB0byBicmVhayBvbiBzZXJ2ZXIgYXV0aC4gV2UgYWxzbyBkbyB0aGF0IGlmIHdlIGRvbid0CiAgICAgICAgIyB3YW50IHRvIHZhbGlkYXRlIHRoZSBjZXJ0cyBhdCBhbGw6IHdlIGp1c3Qgd29uJ3QgYWN0dWFsbHkgZG8gYW55CiAgICAgICAgIyBhdXRoaW5nIGluIHRoYXQgY2FzZS4KICAgICAgICBpZiBub3QgdmVyaWZ5IG9yIHRydXN0X2J1bmRsZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0U2Vzc2lvbk9wdGlvbigKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwKICAgICAgICAgICAgICAgIFNlY3VyaXR5Q29uc3Qua1NTTFNlc3Npb25PcHRpb25CcmVha09uU2VydmVyQXV0aCwKICAgICAgICAgICAgICAgIFRydWUKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBJZiB0aGVyZSdzIGEgY2xpZW50IGNlcnQsIHdlIG5lZWQgdG8gdXNlIGl0LgogICAgICAgIGlmIGNsaWVudF9jZXJ0OgogICAgICAgICAgICBzZWxmLl9rZXljaGFpbiwgc2VsZi5fa2V5Y2hhaW5fZGlyID0gX3RlbXBvcmFyeV9rZXljaGFpbigpCiAgICAgICAgICAgIHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluID0gX2xvYWRfY2xpZW50X2NlcnRfY2hhaW4oCiAgICAgICAgICAgICAgICBzZWxmLl9rZXljaGFpbiwgY2xpZW50X2NlcnQsIGNsaWVudF9rZXkKICAgICAgICAgICAgKQogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRDZXJ0aWZpY2F0ZSgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgc2VsZi5fY2xpZW50X2NlcnRfY2hhaW4KICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgd2l0aCBzZWxmLl9yYWlzZV9vbl9lcnJvcigpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMSGFuZHNoYWtlKHNlbGYuY29udGV4dCkKCiAgICAgICAgICAgICAgICBpZiByZXN1bHQgPT0gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC50aW1lb3V0KCJoYW5kc2hha2UgdGltZWQgb3V0IikKICAgICAgICAgICAgICAgIGVsaWYgcmVzdWx0ID09IFNlY3VyaXR5Q29uc3QuZXJyU1NMU2VydmVyQXV0aENvbXBsZXRlZDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXN0b21fdmFsaWRhdGUodmVyaWZ5LCB0cnVzdF9idW5kbGUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5maWxlbm8oKQoKICAgICMgQ29weS1wYXN0ZWQgZnJvbSBQeXRob24gMy41IHNvdXJjZSBjb2RlCiAgICBkZWYgX2RlY3JlZl9zb2NrZXRpb3Moc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA+IDA6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQogICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIHJlY3Yoc2VsZiwgYnVmc2l6KToKICAgICAgICBidWZmZXIgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIoYnVmc2l6KQogICAgICAgIGJ5dGVzX3JlYWQgPSBzZWxmLnJlY3ZfaW50byhidWZmZXIsIGJ1ZnNpeikKICAgICAgICBkYXRhID0gYnVmZmVyWzpieXRlc19yZWFkXQogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIHJlY3ZfaW50byhzZWxmLCBidWZmZXIsIG5ieXRlcz1Ob25lKToKICAgICAgICAjIFJlYWQgc2hvcnQgb24gRU9GLgogICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKICAgICAgICAgICAgcmV0dXJuIDAKCiAgICAgICAgaWYgbmJ5dGVzIGlzIE5vbmU6CiAgICAgICAgICAgIG5ieXRlcyA9IGxlbihidWZmZXIpCgogICAgICAgIGJ1ZmZlciA9IChjdHlwZXMuY19jaGFyICogbmJ5dGVzKS5mcm9tX2J1ZmZlcihidWZmZXIpCiAgICAgICAgcHJvY2Vzc2VkX2J5dGVzID0gY3R5cGVzLmNfc2l6ZV90KDApCgogICAgICAgIHdpdGggc2VsZi5fcmFpc2Vfb25fZXJyb3IoKToKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMUmVhZCgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgYnVmZmVyLCBuYnl0ZXMsIGN0eXBlcy5ieXJlZihwcm9jZXNzZWRfYnl0ZXMpCiAgICAgICAgICAgICkKCiAgICAgICAgIyBUaGVyZSBhcmUgc29tZSByZXN1bHQgY29kZXMgdGhhdCB3ZSB3YW50IHRvIHRyZWF0IGFzICJub3QgYWx3YXlzCiAgICAgICAgIyBlcnJvcnMiLiBTcGVjaWZpY2FsbHksIHRob3NlIGFyZSBlcnJTU0xXb3VsZEJsb2NrLAogICAgICAgICMgZXJyU1NMQ2xvc2VkR3JhY2VmdWwsIGFuZCBlcnJTU0xDbG9zZWROb05vdGlmeS4KICAgICAgICBpZiAocmVzdWx0ID09IFNlY3VyaXR5Q29uc3QuZXJyU1NMV291bGRCbG9jayk6CiAgICAgICAgICAgICMgSWYgd2UgZGlkbid0IHByb2Nlc3MgYW55IGJ5dGVzLCB0aGVuIHRoaXMgd2FzIGp1c3QgYSB0aW1lIG91dC4KICAgICAgICAgICAgIyBIb3dldmVyLCB3ZSBjYW4gZ2V0IGVyclNTTFdvdWxkQmxvY2sgaW4gc2l0dWF0aW9ucyB3aGVuIHdlICpkaWQqCiAgICAgICAgICAgICMgcmVhZCBzb21lIGRhdGEsIGFuZCBpbiB0aG9zZSBjYXNlcyB3ZSBzaG91bGQganVzdCByZWFkICJzaG9ydCIKICAgICAgICAgICAgIyBhbmQgcmV0dXJuLgogICAgICAgICAgICBpZiBwcm9jZXNzZWRfYnl0ZXMudmFsdWUgPT0gMDoKICAgICAgICAgICAgICAgICMgVGltZWQgb3V0LCBubyBkYXRhIHJlYWQuCiAgICAgICAgICAgICAgICByYWlzZSBzb2NrZXQudGltZW91dCgicmVjdiB0aW1lZCBvdXQiKQogICAgICAgIGVsaWYgcmVzdWx0IGluIChTZWN1cml0eUNvbnN0LmVyclNTTENsb3NlZEdyYWNlZnVsLCBTZWN1cml0eUNvbnN0LmVyclNTTENsb3NlZE5vTm90aWZ5KToKICAgICAgICAgICAgIyBUaGUgcmVtb3RlIHBlZXIgaGFzIGNsb3NlZCB0aGlzIGNvbm5lY3Rpb24uIFdlIHNob3VsZCBkbyBzbyBhcwogICAgICAgICAgICAjIHdlbGwuIE5vdGUgdGhhdCB3ZSBkb24ndCBhY3R1YWxseSByZXR1cm4gaGVyZSBiZWNhdXNlIGluCiAgICAgICAgICAgICMgcHJpbmNpcGxlIHRoaXMgY291bGQgYWN0dWFsbHkgYmUgZmlyZWQgYWxvbmcgd2l0aCByZXR1cm4gZGF0YS4KICAgICAgICAgICAgIyBJdCdzIHVubGlrZWx5IHRob3VnaC4KICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgT2ssIHdlIHJlYWQgYW5kIHByb2JhYmx5IHN1Y2NlZWRlZC4gV2Ugc2hvdWxkIHJldHVybiB3aGF0ZXZlciBkYXRhCiAgICAgICAgIyB3YXMgYWN0dWFsbHkgcmVhZC4KICAgICAgICByZXR1cm4gcHJvY2Vzc2VkX2J5dGVzLnZhbHVlCgogICAgZGVmIHNldHRpbWVvdXQoc2VsZiwgdGltZW91dCk6CiAgICAgICAgc2VsZi5fdGltZW91dCA9IHRpbWVvdXQKCiAgICBkZWYgZ2V0dGltZW91dChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGltZW91dAoKICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgogICAgICAgIHByb2Nlc3NlZF9ieXRlcyA9IGN0eXBlcy5jX3NpemVfdCgwKQoKICAgICAgICB3aXRoIHNlbGYuX3JhaXNlX29uX2Vycm9yKCk6CiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFdyaXRlKAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBkYXRhLCBsZW4oZGF0YSksIGN0eXBlcy5ieXJlZihwcm9jZXNzZWRfYnl0ZXMpCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgcmVzdWx0ID09IFNlY3VyaXR5Q29uc3QuZXJyU1NMV291bGRCbG9jayBhbmQgcHJvY2Vzc2VkX2J5dGVzLnZhbHVlID09IDA6CiAgICAgICAgICAgICMgVGltZWQgb3V0CiAgICAgICAgICAgIHJhaXNlIHNvY2tldC50aW1lb3V0KCJzZW5kIHRpbWVkIG91dCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgV2Ugc2VudCwgYW5kIHByb2JhYmx5IHN1Y2NlZWRlZC4gVGVsbCB0aGVtIGhvdyBtdWNoIHdlIHNlbnQuCiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZF9ieXRlcy52YWx1ZQoKICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEpOgogICAgICAgIHRvdGFsX3NlbnQgPSAwCiAgICAgICAgd2hpbGUgdG90YWxfc2VudCA8IGxlbihkYXRhKToKICAgICAgICAgICAgc2VudCA9IHNlbGYuc2VuZChkYXRhW3RvdGFsX3NlbnQ6dG90YWxfc2VudCArIFNTTF9XUklURV9CTE9DS1NJWkVdKQogICAgICAgICAgICB0b3RhbF9zZW50ICs9IHNlbnQKCiAgICBkZWYgc2h1dGRvd24oc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLl9yYWlzZV9vbl9lcnJvcigpOgogICAgICAgICAgICBTZWN1cml0eS5TU0xDbG9zZShzZWxmLmNvbnRleHQpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICMgVE9ETzogc2hvdWxkIEkgZG8gY2xlYW4gc2h1dGRvd24gaGVyZT8gRG8gSSBoYXZlIHRvPwogICAgICAgIGlmIHNlbGYuX21ha2VmaWxlX3JlZnMgPCAxOgogICAgICAgICAgICBzZWxmLl9jbG9zZWQgPSBUcnVlCiAgICAgICAgICAgIGlmIHNlbGYuY29udGV4dDoKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShzZWxmLmNvbnRleHQpCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBOb25lCiAgICAgICAgICAgIGlmIHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluOgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluKQogICAgICAgICAgICAgICAgc2VsZi5fY2xpZW50X2NlcnRfY2hhaW4gPSBOb25lCiAgICAgICAgICAgIGlmIHNlbGYuX2tleWNoYWluOgogICAgICAgICAgICAgICAgU2VjdXJpdHkuU2VjS2V5Y2hhaW5EZWxldGUoc2VsZi5fa2V5Y2hhaW4pCiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2Uoc2VsZi5fa2V5Y2hhaW4pCiAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuX2tleWNoYWluX2RpcikKICAgICAgICAgICAgICAgIHNlbGYuX2tleWNoYWluID0gc2VsZi5fa2V5Y2hhaW5fZGlyID0gTm9uZQogICAgICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQoKICAgIGRlZiBnZXRwZWVyY2VydChzZWxmLCBiaW5hcnlfZm9ybT1GYWxzZSk6CiAgICAgICAgIyBVcmdoLCBhbm5veWluZy4KICAgICAgICAjCiAgICAgICAgIyBIZXJlJ3MgaG93IHdlIGRvIHRoaXM6CiAgICAgICAgIwogICAgICAgICMgMS4gQ2FsbCBTU0xDb3B5UGVlclRydXN0IHRvIGdldCBob2xkIG9mIHRoZSB0cnVzdCBvYmplY3QgZm9yIHRoaXMKICAgICAgICAjICAgIGNvbm5lY3Rpb24uCiAgICAgICAgIyAyLiBDYWxsIFNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4IGZvciBpbmRleCAwIHRvIGdldCB0aGUgbGVhZi4KICAgICAgICAjIDMuIFRvIGdldCB0aGUgQ04sIGNhbGwgU2VjQ2VydGlmaWNhdGVDb3B5Q29tbW9uTmFtZSBhbmQgcHJvY2VzcyB0aGF0CiAgICAgICAgIyAgICBzdHJpbmcgc28gdGhhdCBpdCdzIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgogICAgICAgICMgNC4gVG8gZ2V0IHRoZSBTQU4sIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGEgYml0IG1vcmUgY29tcGxleDoKICAgICAgICAjICAgIGEuIENhbGwgU2VjQ2VydGlmaWNhdGVDb3B5VmFsdWVzIHRvIGdldCB0aGUgZGF0YSwgcmVxdWVzdGluZwogICAgICAgICMgICAgICAga1NlY09JRFN1YmplY3RBbHROYW1lLgogICAgICAgICMgICAgYi4gTWVzcyBhYm91dCB3aXRoIHRoaXMgZGljdGlvbmFyeSB0byB0cnkgdG8gZ2V0IHRoZSBTQU5zIG91dC4KICAgICAgICAjCiAgICAgICAgIyBUaGlzIGlzIGdyb3NzLiBSZWFsbHkgZ3Jvc3MuIEl0J3MgZ29pbmcgdG8gYmUgYSBmZXcgaHVuZHJlZCBMb0MgZXh0cmEKICAgICAgICAjIGp1c3QgdG8gcmVwZWF0IHNvbWV0aGluZyB0aGF0IFNlY3VyZVRyYW5zcG9ydCBjYW4gKmFscmVhZHkgZG8qLiBTbyBteQogICAgICAgICMgb3BlcmF0aW5nIGFzc3VtcHRpb24gYXQgdGhpcyB0aW1lIGlzIHRoYXQgd2hhdCB3ZSB3YW50IHRvIGRvIGlzCiAgICAgICAgIyBpbnN0ZWFkIHRvIGp1c3QgZmxhZyB0byB1cmxsaWIzIHRoYXQgaXQgc2hvdWxkbid0IGRvIGl0cyBvd24gaG9zdG5hbWUKICAgICAgICAjIHZhbGlkYXRpb24gd2hlbiB1c2luZyBTZWN1cmVUcmFuc3BvcnQuCiAgICAgICAgaWYgbm90IGJpbmFyeV9mb3JtOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIlNlY3VyZVRyYW5zcG9ydCBvbmx5IHN1cHBvcnRzIGR1bXBpbmcgYmluYXJ5IGNlcnRzIgogICAgICAgICAgICApCiAgICAgICAgdHJ1c3QgPSBTZWN1cml0eS5TZWNUcnVzdFJlZigpCiAgICAgICAgY2VydGRhdGEgPSBOb25lCiAgICAgICAgZGVyX2J5dGVzID0gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgR3JhYiB0aGUgdHJ1c3Qgc3RvcmUuCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTENvcHlQZWVyVHJ1c3QoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIGN0eXBlcy5ieXJlZih0cnVzdCkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICAgICAgaWYgbm90IHRydXN0OgogICAgICAgICAgICAgICAgIyBQcm9iYWJseSB3ZSBoYXZlbid0IGRvbmUgdGhlIGhhbmRzaGFrZSB5ZXQuIE5vIGJpZ2dpZS4KICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICBjZXJ0X2NvdW50ID0gU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUNvdW50KHRydXN0KQogICAgICAgICAgICBpZiBub3QgY2VydF9jb3VudDoKICAgICAgICAgICAgICAgICMgQWxzbyBhIGNhc2UgdGhhdCBtaWdodCBoYXBwZW4gaWYgd2UgaGF2ZW4ndCBoYW5kc2hha2VkLgogICAgICAgICAgICAgICAgIyBIYW5kc2hvb2s/IEhhbmRzaGFrZW4/CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgbGVhZiA9IFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4KHRydXN0LCAwKQogICAgICAgICAgICBhc3NlcnQgbGVhZgoKICAgICAgICAgICAgIyBPaywgbm93IHdlIHdhbnQgdGhlIERFUiBieXRlcy4KICAgICAgICAgICAgY2VydGRhdGEgPSBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUNvcHlEYXRhKGxlYWYpCiAgICAgICAgICAgIGFzc2VydCBjZXJ0ZGF0YQoKICAgICAgICAgICAgZGF0YV9sZW5ndGggPSBDb3JlRm91bmRhdGlvbi5DRkRhdGFHZXRMZW5ndGgoY2VydGRhdGEpCiAgICAgICAgICAgIGRhdGFfYnVmZmVyID0gQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0Qnl0ZVB0cihjZXJ0ZGF0YSkKICAgICAgICAgICAgZGVyX2J5dGVzID0gY3R5cGVzLnN0cmluZ19hdChkYXRhX2J1ZmZlciwgZGF0YV9sZW5ndGgpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgY2VydGRhdGE6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UoY2VydGRhdGEpCiAgICAgICAgICAgIGlmIHRydXN0OgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHRydXN0KQoKICAgICAgICByZXR1cm4gZGVyX2J5dGVzCgogICAgZGVmIF9yZXVzZShzZWxmKToKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzICs9IDEKCiAgICBkZWYgX2Ryb3Aoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA8IDE6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQoKCmlmIF9maWxlb2JqZWN0OiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIKICAgIGRlZiBtYWtlZmlsZShzZWxmLCBtb2RlLCBidWZzaXplPS0xKToKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzICs9IDEKICAgICAgICByZXR1cm4gX2ZpbGVvYmplY3Qoc2VsZiwgbW9kZSwgYnVmc2l6ZSwgY2xvc2U9VHJ1ZSkKZWxzZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICBkZWYgbWFrZWZpbGUoc2VsZiwgbW9kZT0iciIsIGJ1ZmZlcmluZz1Ob25lLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICMgV2UgZGlzYWJsZSBidWZmZXJpbmcgd2l0aCBTZWN1cmVUcmFuc3BvcnQgYmVjYXVzZSBpdCBjb25mbGljdHMgd2l0aAogICAgICAgICMgdGhlIGJ1ZmZlcmluZyB0aGF0IFNUIGRvZXMgaW50ZXJuYWxseSAoc2VlIGlzc3VlICMxMTUzIGZvciBtb3JlKS4KICAgICAgICBidWZmZXJpbmcgPSAwCiAgICAgICAgcmV0dXJuIGJhY2twb3J0X21ha2VmaWxlKHNlbGYsIG1vZGUsIGJ1ZmZlcmluZywgKmFyZ3MsICoqa3dhcmdzKQoKV3JhcHBlZFNvY2tldC5tYWtlZmlsZSA9IG1ha2VmaWxlCgoKY2xhc3MgU2VjdXJlVHJhbnNwb3J0Q29udGV4dChvYmplY3QpOgogICAgIiIiCiAgICBJIGFtIGEgd3JhcHBlciBjbGFzcyBmb3IgdGhlIFNlY3VyZVRyYW5zcG9ydCBsaWJyYXJ5LCB0byB0cmFuc2xhdGUgdGhlCiAgICBpbnRlcmZhY2Ugb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgYGBTU0xDb250ZXh0YGAgb2JqZWN0IHRvIGNhbGxzIGludG8KICAgIFNlY3VyZVRyYW5zcG9ydC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKICAgICAgICBzZWxmLl9taW5fdmVyc2lvbiwgc2VsZi5fbWF4X3ZlcnNpb24gPSBfcHJvdG9jb2xfdG9fbWluX21heFtwcm90b2NvbF0KICAgICAgICBzZWxmLl9vcHRpb25zID0gMAogICAgICAgIHNlbGYuX3ZlcmlmeSA9IEZhbHNlCiAgICAgICAgc2VsZi5fdHJ1c3RfYnVuZGxlID0gTm9uZQogICAgICAgIHNlbGYuX2NsaWVudF9jZXJ0ID0gTm9uZQogICAgICAgIHNlbGYuX2NsaWVudF9rZXkgPSBOb25lCiAgICAgICAgc2VsZi5fY2xpZW50X2tleV9wYXNzcGhyYXNlID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoZWNrX2hvc3RuYW1lKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNlY3VyZVRyYW5zcG9ydCBjYW5ub3QgaGF2ZSBpdHMgaG9zdG5hbWUgY2hlY2tpbmcgZGlzYWJsZWQuIEZvciBtb3JlLAogICAgICAgIHNlZSB0aGUgY29tbWVudCBvbiBnZXRwZWVyY2VydCgpIGluIHRoaXMgZmlsZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBjaGVja19ob3N0bmFtZS5zZXR0ZXIKICAgIGRlZiBjaGVja19ob3N0bmFtZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2VjdXJlVHJhbnNwb3J0IGNhbm5vdCBoYXZlIGl0cyBob3N0bmFtZSBjaGVja2luZyBkaXNhYmxlZC4gRm9yIG1vcmUsCiAgICAgICAgc2VlIHRoZSBjb21tZW50IG9uIGdldHBlZXJjZXJ0KCkgaW4gdGhpcyBmaWxlLgogICAgICAgICIiIgogICAgICAgIHBhc3MKCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcHRpb25zKHNlbGYpOgogICAgICAgICMgVE9ETzogV2VsbCwgY3JhcC4KICAgICAgICAjCiAgICAgICAgIyBTbyB0aGlzIGlzIHRoZSBiaXQgb2YgdGhlIGNvZGUgdGhhdCBpcyB0aGUgbW9zdCBsaWtlbHkgdG8gY2F1c2UgdXMKICAgICAgICAjIHRyb3VibGUuIEVzc2VudGlhbGx5IHdlIG5lZWQgdG8gZW51bWVyYXRlIGFsbCBvZiB0aGUgU1NMIG9wdGlvbnMgdGhhdAogICAgICAgICMgdXNlcnMgbWlnaHQgd2FudCB0byB1c2UgYW5kIHRyeSB0byBzZWUgaWYgd2UgY2FuIHNlbnNpYmx5IHRyYW5zbGF0ZQogICAgICAgICMgdGhlbSwgb3Igd2hldGhlciB3ZSBzaG91bGQganVzdCBpZ25vcmUgdGhlbS4KICAgICAgICByZXR1cm4gc2VsZi5fb3B0aW9ucwoKICAgIEBvcHRpb25zLnNldHRlcgogICAgZGVmIG9wdGlvbnMoc2VsZiwgdmFsdWUpOgogICAgICAgICMgVE9ETzogVXBkYXRlIGluIGxpbmUgd2l0aCBhYm92ZS4KICAgICAgICBzZWxmLl9vcHRpb25zID0gdmFsdWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJpZnlfbW9kZShzZWxmKToKICAgICAgICByZXR1cm4gc3NsLkNFUlRfUkVRVUlSRUQgaWYgc2VsZi5fdmVyaWZ5IGVsc2Ugc3NsLkNFUlRfTk9ORQoKICAgIEB2ZXJpZnlfbW9kZS5zZXR0ZXIKICAgIGRlZiB2ZXJpZnlfbW9kZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fdmVyaWZ5ID0gVHJ1ZSBpZiB2YWx1ZSA9PSBzc2wuQ0VSVF9SRVFVSVJFRCBlbHNlIEZhbHNlCgogICAgZGVmIHNldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhzZWxmKToKICAgICAgICAjIFNvLCB0aGlzIGhhcyB0byBkbyBzb21ldGhpbmcgYSBiaXQgd2VpcmQuIFNwZWNpZmljYWxseSwgd2hhdCBpdCBkb2VzCiAgICAgICAgIyBpcyBub3RoaW5nLgogICAgICAgICMKICAgICAgICAjIFRoaXMgbWVhbnMgdGhhdCwgaWYgd2UgaGFkIHByZXZpb3VzbHkgaGFkIGxvYWRfdmVyaWZ5X2xvY2F0aW9ucwogICAgICAgICMgY2FsbGVkLCB0aGlzIGRvZXMgbm90IHVuZG8gdGhhdC4gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2UgaXQgdHVybnMKICAgICAgICAjIG91dCB0aGF0IHRoZSByZXN0IG9mIHRoZSB1cmxsaWIzIGNvZGUgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlCiAgICAgICAgIyBkZWZhdWx0IHZlcmlmeSBwYXRocyBpZiBpdCBoYXNuJ3QgYmVlbiB0b2xkIGFib3V0IGFueSBwYXRocywgZXZlbiBpZgogICAgICAgICMgdGhlIGNvbnRleHQgaXRzZWxmIHdhcyBzb21ldGltZSBlYXJsaWVyLiBXZSByZXNvbHZlIHRoYXQgYnkganVzdAogICAgICAgICMgaWdub3JpbmcgaXQuCiAgICAgICAgcGFzcwoKICAgIGRlZiBsb2FkX2RlZmF1bHRfY2VydHMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKCkKCiAgICBkZWYgc2V0X2NpcGhlcnMoc2VsZiwgY2lwaGVycyk6CiAgICAgICAgIyBGb3Igbm93LCB3ZSBqdXN0IHJlcXVpcmUgdGhlIGRlZmF1bHQgY2lwaGVyIHN0cmluZy4KICAgICAgICBpZiBjaXBoZXJzICE9IHV0aWwuc3NsXy5ERUZBVUxUX0NJUEhFUlM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiU2VjdXJlVHJhbnNwb3J0IGRvZXNuJ3Qgc3VwcG9ydCBjdXN0b20gY2lwaGVyIHN0cmluZ3MiCiAgICAgICAgICAgICkKCiAgICBkZWYgbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNlbGYsIGNhZmlsZT1Ob25lLCBjYXBhdGg9Tm9uZSwgY2FkYXRhPU5vbmUpOgogICAgICAgICMgT0ssIHdlIG9ubHkgcmVhbGx5IHN1cHBvcnQgY2FkYXRhIGFuZCBjYWZpbGUuCiAgICAgICAgaWYgY2FwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIlNlY3VyZVRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IGNlcnQgZGlyZWN0b3JpZXMiCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5fdHJ1c3RfYnVuZGxlID0gY2FmaWxlIG9yIGNhZGF0YQoKICAgIGRlZiBsb2FkX2NlcnRfY2hhaW4oc2VsZiwgY2VydGZpbGUsIGtleWZpbGU9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSk6CiAgICAgICAgc2VsZi5fY2xpZW50X2NlcnQgPSBjZXJ0ZmlsZQogICAgICAgIHNlbGYuX2NsaWVudF9rZXkgPSBrZXlmaWxlCiAgICAgICAgc2VsZi5fY2xpZW50X2NlcnRfcGFzc3BocmFzZSA9IHBhc3N3b3JkCgogICAgZGVmIHdyYXBfc29ja2V0KHNlbGYsIHNvY2ssIHNlcnZlcl9zaWRlPUZhbHNlLAogICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPVRydWUsCiAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPU5vbmUpOgogICAgICAgICMgU28sIHdoYXQgZG8gd2UgZG8gaGVyZT8gRmlyc3RseSwgd2UgYXNzZXJ0IHNvbWUgcHJvcGVydGllcy4gVGhpcyBpcyBhCiAgICAgICAgIyBzdHJpcHBlZCBkb3duIHNoaW0sIHNvIHRoZXJlIGlzIHNvbWUgZnVuY3Rpb25hbGl0eSB3ZSBkb24ndCBzdXBwb3J0LgogICAgICAgICMgU2VlIFBFUCA1NDMgZm9yIHRoZSByZWFsIGRlYWwuCiAgICAgICAgYXNzZXJ0IG5vdCBzZXJ2ZXJfc2lkZQogICAgICAgIGFzc2VydCBkb19oYW5kc2hha2Vfb25fY29ubmVjdAogICAgICAgIGFzc2VydCBzdXBwcmVzc19yYWdnZWRfZW9mcwoKICAgICAgICAjIE9rLCB3ZSdyZSBnb29kIHRvIGdvLiBOb3cgd2Ugd2FudCB0byBjcmVhdGUgdGhlIHdyYXBwZWQgc29ja2V0IG9iamVjdAogICAgICAgICMgYW5kIHN0b3JlIGl0IGluIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4KICAgICAgICB3cmFwcGVkX3NvY2tldCA9IFdyYXBwZWRTb2NrZXQoc29jaykKCiAgICAgICAgIyBOb3cgd2UgY2FuIGhhbmRzaGFrZQogICAgICAgIHdyYXBwZWRfc29ja2V0LmhhbmRzaGFrZSgKICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lLCBzZWxmLl92ZXJpZnksIHNlbGYuX3RydXN0X2J1bmRsZSwKICAgICAgICAgICAgc2VsZi5fbWluX3ZlcnNpb24sIHNlbGYuX21heF92ZXJzaW9uLCBzZWxmLl9jbGllbnRfY2VydCwKICAgICAgICAgICAgc2VsZi5fY2xpZW50X2tleSwgc2VsZi5fY2xpZW50X2tleV9wYXNzcGhyYXNlCiAgICAgICAgKQogICAgICAgIHJldHVybiB3cmFwcGVkX3NvY2tldApQSwMEFAAAAAAAAAAhANBTKZkzGAAAMxgAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zb2Nrcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiIiIgpUaGlzIG1vZHVsZSBjb250YWlucyBwcm92aXNpb25hbCBzdXBwb3J0IGZvciBTT0NLUyBwcm94aWVzIGZyb20gd2l0aGluCnVybGxpYjMuIFRoaXMgbW9kdWxlIHN1cHBvcnRzIFNPQ0tTNCAoc3BlY2lmaWNhbGx5IHRoZSBTT0NLUzRBIHZhcmlhbnQpIGFuZApTT0NLUzUuIFRvIGVuYWJsZSBpdHMgZnVuY3Rpb25hbGl0eSwgZWl0aGVyIGluc3RhbGwgUHlTb2NrcyBvciBpbnN0YWxsIHRoaXMKbW9kdWxlIHdpdGggdGhlIGBgc29ja3NgYCBleHRyYS4KClRoZSBTT0NLUyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZnVsbCByYW5nZSBvZiB1cmxsaWIzIGZlYXR1cmVzLiBJdCBhbHNvCnN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgU09DS1MgZmVhdHVyZXM6CgotIFNPQ0tTNAotIFNPQ0tTNGEKLSBTT0NLUzUKLSBVc2VybmFtZXMgYW5kIHBhc3N3b3JkcyBmb3IgdGhlIFNPQ0tTIHByb3h5CgpLbm93biBMaW1pdGF0aW9uczoKCi0gQ3VycmVudGx5IFB5U29ja3MgZG9lcyBub3Qgc3VwcG9ydCBjb250YWN0aW5nIHJlbW90ZSB3ZWJzaXRlcyB2aWEgbGl0ZXJhbAogIElQdjYgYWRkcmVzc2VzLiBBbnkgc3VjaCBjb25uZWN0aW9uIGF0dGVtcHQgd2lsbCBmYWlsLiBZb3UgbXVzdCB1c2UgYSBkb21haW4KICBuYW1lLgotIEN1cnJlbnRseSBQeVNvY2tzIGRvZXMgbm90IHN1cHBvcnQgSVB2NiBjb25uZWN0aW9ucyB0byB0aGUgU09DS1MgcHJveHkuIEFueQogIHN1Y2ggY29ubmVjdGlvbiBhdHRlbXB0IHdpbGwgZmFpbC4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgp0cnk6CiAgICBpbXBvcnQgc29ja3MKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHdhcm5pbmdzCiAgICBmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgRGVwZW5kZW5jeVdhcm5pbmcKCiAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAnU09DS1Mgc3VwcG9ydCBpbiB1cmxsaWIzIHJlcXVpcmVzIHRoZSBpbnN0YWxsYXRpb24gb2Ygb3B0aW9uYWwgJwogICAgICAgICdkZXBlbmRlbmNpZXM6IHNwZWNpZmljYWxseSwgUHlTb2Nrcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJwogICAgICAgICdodHRwczovL3VybGxpYjMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2NvbnRyaWIuaHRtbCNzb2Nrcy1wcm94aWVzJwogICAgICAgICksCiAgICAgICAgRGVwZW5kZW5jeVdhcm5pbmcKICAgICkKICAgIHJhaXNlCgpmcm9tIHNvY2tldCBpbXBvcnQgZXJyb3IgYXMgU29ja2V0RXJyb3IsIHRpbWVvdXQgYXMgU29ja2V0VGltZW91dAoKZnJvbSAuLmNvbm5lY3Rpb24gaW1wb3J0ICgKICAgIEhUVFBDb25uZWN0aW9uLCBIVFRQU0Nvbm5lY3Rpb24KKQpmcm9tIC4uY29ubmVjdGlvbnBvb2wgaW1wb3J0ICgKICAgIEhUVFBDb25uZWN0aW9uUG9vbCwgSFRUUFNDb25uZWN0aW9uUG9vbAopCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBDb25uZWN0VGltZW91dEVycm9yLCBOZXdDb25uZWN0aW9uRXJyb3IKZnJvbSAuLnBvb2xtYW5hZ2VyIGltcG9ydCBQb29sTWFuYWdlcgpmcm9tIC4udXRpbC51cmwgaW1wb3J0IHBhcnNlX3VybAoKdHJ5OgogICAgaW1wb3J0IHNzbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBzc2wgPSBOb25lCgoKY2xhc3MgU09DS1NDb25uZWN0aW9uKEhUVFBDb25uZWN0aW9uKToKICAgICIiIgogICAgQSBwbGFpbi10ZXh0IEhUVFAgY29ubmVjdGlvbiB0aGF0IGNvbm5lY3RzIHZpYSBhIFNPQ0tTIHByb3h5LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzZWxmLl9zb2Nrc19vcHRpb25zID0ga3dhcmdzLnBvcCgnX3NvY2tzX29wdGlvbnMnKQogICAgICAgIHN1cGVyKFNPQ0tTQ29ubmVjdGlvbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBfbmV3X2Nvbm4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb24gdmlhIHRoZSBTT0NLUyBwcm94eS4KICAgICAgICAiIiIKICAgICAgICBleHRyYV9rdyA9IHt9CiAgICAgICAgaWYgc2VsZi5zb3VyY2VfYWRkcmVzczoKICAgICAgICAgICAgZXh0cmFfa3dbJ3NvdXJjZV9hZGRyZXNzJ10gPSBzZWxmLnNvdXJjZV9hZGRyZXNzCgogICAgICAgIGlmIHNlbGYuc29ja2V0X29wdGlvbnM6CiAgICAgICAgICAgIGV4dHJhX2t3Wydzb2NrZXRfb3B0aW9ucyddID0gc2VsZi5zb2NrZXRfb3B0aW9ucwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4gPSBzb2Nrcy5jcmVhdGVfY29ubmVjdGlvbigKICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYucG9ydCksCiAgICAgICAgICAgICAgICBwcm94eV90eXBlPXNlbGYuX3NvY2tzX29wdGlvbnNbJ3NvY2tzX3ZlcnNpb24nXSwKICAgICAgICAgICAgICAgIHByb3h5X2FkZHI9c2VsZi5fc29ja3Nfb3B0aW9uc1sncHJveHlfaG9zdCddLAogICAgICAgICAgICAgICAgcHJveHlfcG9ydD1zZWxmLl9zb2Nrc19vcHRpb25zWydwcm94eV9wb3J0J10sCiAgICAgICAgICAgICAgICBwcm94eV91c2VybmFtZT1zZWxmLl9zb2Nrc19vcHRpb25zWyd1c2VybmFtZSddLAogICAgICAgICAgICAgICAgcHJveHlfcGFzc3dvcmQ9c2VsZi5fc29ja3Nfb3B0aW9uc1sncGFzc3dvcmQnXSwKICAgICAgICAgICAgICAgIHByb3h5X3JkbnM9c2VsZi5fc29ja3Nfb3B0aW9uc1sncmRucyddLAogICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLnRpbWVvdXQsCiAgICAgICAgICAgICAgICAqKmV4dHJhX2t3CiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IFNvY2tldFRpbWVvdXQgYXMgZToKICAgICAgICAgICAgcmFpc2UgQ29ubmVjdFRpbWVvdXRFcnJvcigKICAgICAgICAgICAgICAgIHNlbGYsICJDb25uZWN0aW9uIHRvICVzIHRpbWVkIG91dC4gKGNvbm5lY3QgdGltZW91dD0lcykiICUKICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYudGltZW91dCkpCgogICAgICAgIGV4Y2VwdCBzb2Nrcy5Qcm94eUVycm9yIGFzIGU6CiAgICAgICAgICAgICMgVGhpcyBpcyBmcmFnaWxlIGFzIGhlbGwsIGJ1dCBpdCBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gcmFpc2UKICAgICAgICAgICAgIyB1c2VmdWwgZXJyb3JzIGhlcmUuCiAgICAgICAgICAgIGlmIGUuc29ja2V0X2VycjoKICAgICAgICAgICAgICAgIGVycm9yID0gZS5zb2NrZXRfZXJyCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVycm9yLCBTb2NrZXRUaW1lb3V0KToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb25uZWN0VGltZW91dEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiB0byAlcyB0aW1lZCBvdXQuIChjb25uZWN0IHRpbWVvdXQ9JXMpIiAlCiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYudGltZW91dCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIE5ld0Nvbm5lY3Rpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbjogJXMiICUgZXJyb3IKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBOZXdDb25uZWN0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uOiAlcyIgJSBlCiAgICAgICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBTb2NrZXRFcnJvciBhcyBlOiAgIyBEZWZlbnNpdmU6IFB5U29ja3Mgc2hvdWxkIGNhdGNoIGFsbCB0aGVzZS4KICAgICAgICAgICAgcmFpc2UgTmV3Q29ubmVjdGlvbkVycm9yKAogICAgICAgICAgICAgICAgc2VsZiwgIkZhaWxlZCB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbjogJXMiICUgZSkKCiAgICAgICAgcmV0dXJuIGNvbm4KCgojIFdlIGRvbid0IG5lZWQgdG8gZHVwbGljYXRlIHRoZSBWZXJpZmllZC9VbnZlcmlmaWVkIGRpc3RpbmN0aW9uIGZyb20KIyB1cmxsaWIzL2Nvbm5lY3Rpb24ucHkgaGVyZSBiZWNhdXNlIHRoZSBIVFRQU0Nvbm5lY3Rpb24gd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgojIGNvcnJlY3RseSBzZXQgdG8gZWl0aGVyIHRoZSBWZXJpZmllZCBvciBVbnZlcmlmaWVkIGZvcm0gYnkgdGhhdCBtb2R1bGUuIFRoaXMKIyBtZWFucyB0aGUgU09DS1NIVFRQU0Nvbm5lY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHRoZSBjb3JyZWN0IHR5cGUuCmNsYXNzIFNPQ0tTSFRUUFNDb25uZWN0aW9uKFNPQ0tTQ29ubmVjdGlvbiwgSFRUUFNDb25uZWN0aW9uKToKICAgIHBhc3MKCgpjbGFzcyBTT0NLU0hUVFBDb25uZWN0aW9uUG9vbChIVFRQQ29ubmVjdGlvblBvb2wpOgogICAgQ29ubmVjdGlvbkNscyA9IFNPQ0tTQ29ubmVjdGlvbgoKCmNsYXNzIFNPQ0tTSFRUUFNDb25uZWN0aW9uUG9vbChIVFRQU0Nvbm5lY3Rpb25Qb29sKToKICAgIENvbm5lY3Rpb25DbHMgPSBTT0NLU0hUVFBTQ29ubmVjdGlvbgoKCmNsYXNzIFNPQ0tTUHJveHlNYW5hZ2VyKFBvb2xNYW5hZ2VyKToKICAgICIiIgogICAgQSB2ZXJzaW9uIG9mIHRoZSB1cmxsaWIzIFByb3h5TWFuYWdlciB0aGF0IHJvdXRlcyBjb25uZWN0aW9ucyB2aWEgdGhlCiAgICBkZWZpbmVkIFNPQ0tTIHByb3h5LgogICAgIiIiCiAgICBwb29sX2NsYXNzZXNfYnlfc2NoZW1lID0gewogICAgICAgICdodHRwJzogU09DS1NIVFRQQ29ubmVjdGlvblBvb2wsCiAgICAgICAgJ2h0dHBzJzogU09DS1NIVFRQU0Nvbm5lY3Rpb25Qb29sLAogICAgfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm94eV91cmwsIHVzZXJuYW1lPU5vbmUsIHBhc3N3b3JkPU5vbmUsCiAgICAgICAgICAgICAgICAgbnVtX3Bvb2xzPTEwLCBoZWFkZXJzPU5vbmUsICoqY29ubmVjdGlvbl9wb29sX2t3KToKICAgICAgICBwYXJzZWQgPSBwYXJzZV91cmwocHJveHlfdXJsKQoKICAgICAgICBpZiBwYXJzZWQuc2NoZW1lID09ICdzb2NrczUnOgogICAgICAgICAgICBzb2Nrc192ZXJzaW9uID0gc29ja3MuUFJPWFlfVFlQRV9TT0NLUzUKICAgICAgICAgICAgcmRucyA9IEZhbHNlCiAgICAgICAgZWxpZiBwYXJzZWQuc2NoZW1lID09ICdzb2NrczVoJzoKICAgICAgICAgICAgc29ja3NfdmVyc2lvbiA9IHNvY2tzLlBST1hZX1RZUEVfU09DS1M1CiAgICAgICAgICAgIHJkbnMgPSBUcnVlCiAgICAgICAgZWxpZiBwYXJzZWQuc2NoZW1lID09ICdzb2NrczQnOgogICAgICAgICAgICBzb2Nrc192ZXJzaW9uID0gc29ja3MuUFJPWFlfVFlQRV9TT0NLUzQKICAgICAgICAgICAgcmRucyA9IEZhbHNlCiAgICAgICAgZWxpZiBwYXJzZWQuc2NoZW1lID09ICdzb2NrczRhJzoKICAgICAgICAgICAgc29ja3NfdmVyc2lvbiA9IHNvY2tzLlBST1hZX1RZUEVfU09DS1M0CiAgICAgICAgICAgIHJkbnMgPSBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZGV0ZXJtaW5lIFNPQ0tTIHZlcnNpb24gZnJvbSAlcyIgJSBwcm94eV91cmwKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLnByb3h5X3VybCA9IHByb3h5X3VybAoKICAgICAgICBzb2Nrc19vcHRpb25zID0gewogICAgICAgICAgICAnc29ja3NfdmVyc2lvbic6IHNvY2tzX3ZlcnNpb24sCiAgICAgICAgICAgICdwcm94eV9ob3N0JzogcGFyc2VkLmhvc3QsCiAgICAgICAgICAgICdwcm94eV9wb3J0JzogcGFyc2VkLnBvcnQsCiAgICAgICAgICAgICd1c2VybmFtZSc6IHVzZXJuYW1lLAogICAgICAgICAgICAncGFzc3dvcmQnOiBwYXNzd29yZCwKICAgICAgICAgICAgJ3JkbnMnOiByZG5zCiAgICAgICAgfQogICAgICAgIGNvbm5lY3Rpb25fcG9vbF9rd1snX3NvY2tzX29wdGlvbnMnXSA9IHNvY2tzX29wdGlvbnMKCiAgICAgICAgc3VwZXIoU09DS1NQcm94eU1hbmFnZXIsIHNlbGYpLl9faW5pdF9fKAogICAgICAgICAgICBudW1fcG9vbHMsIGhlYWRlcnMsICoqY29ubmVjdGlvbl9wb29sX2t3CiAgICAgICAgKQoKICAgICAgICBzZWxmLnBvb2xfY2xhc3Nlc19ieV9zY2hlbWUgPSBTT0NLU1Byb3h5TWFuYWdlci5wb29sX2NsYXNzZXNfYnlfc2NoZW1lClBLAwQUAAAAAAAAACEA8prJA8sZAADLGQAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9leGNlcHRpb25zLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLmh0dHBfY2xpZW50IGltcG9ydCAoCiAgICBJbmNvbXBsZXRlUmVhZCBhcyBodHRwbGliX0luY29tcGxldGVSZWFkCikKIyBCYXNlIEV4Y2VwdGlvbnMKCgpjbGFzcyBIVFRQRXJyb3IoRXhjZXB0aW9uKToKICAgICJCYXNlIGV4Y2VwdGlvbiB1c2VkIGJ5IHRoaXMgbW9kdWxlLiIKICAgIHBhc3MKCgpjbGFzcyBIVFRQV2FybmluZyhXYXJuaW5nKToKICAgICJCYXNlIHdhcm5pbmcgdXNlZCBieSB0aGlzIG1vZHVsZS4iCiAgICBwYXNzCgoKY2xhc3MgUG9vbEVycm9yKEhUVFBFcnJvcik6CiAgICAiQmFzZSBleGNlcHRpb24gZm9yIGVycm9ycyBjYXVzZWQgd2l0aGluIGEgcG9vbC4iCiAgICBkZWYgX19pbml0X18oc2VsZiwgcG9vbCwgbWVzc2FnZSk6CiAgICAgICAgc2VsZi5wb29sID0gcG9vbAogICAgICAgIEhUVFBFcnJvci5fX2luaXRfXyhzZWxmLCAiJXM6ICVzIiAlIChwb29sLCBtZXNzYWdlKSkKCiAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICAjIEZvciBwaWNrbGluZyBwdXJwb3Nlcy4KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChOb25lLCBOb25lKQoKCmNsYXNzIFJlcXVlc3RFcnJvcihQb29sRXJyb3IpOgogICAgIkJhc2UgZXhjZXB0aW9uIGZvciBQb29sRXJyb3JzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIFVSTHMuIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2wsIHVybCwgbWVzc2FnZSk6CiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBQb29sRXJyb3IuX19pbml0X18oc2VsZiwgcG9vbCwgbWVzc2FnZSkKCiAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICAjIEZvciBwaWNrbGluZyBwdXJwb3Nlcy4KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChOb25lLCBzZWxmLnVybCwgTm9uZSkKCgpjbGFzcyBTU0xFcnJvcihIVFRQRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIFNTTCBjZXJ0aWZpY2F0ZSBmYWlscyBpbiBhbiBIVFRQUyBjb25uZWN0aW9uLiIKICAgIHBhc3MKCgpjbGFzcyBQcm94eUVycm9yKEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gdG8gYSBwcm94eSBmYWlscy4iCiAgICBwYXNzCgoKY2xhc3MgRGVjb2RlRXJyb3IoSFRUUEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhdXRvbWF0aWMgZGVjb2RpbmcgYmFzZWQgb24gQ29udGVudC1UeXBlIGZhaWxzLiIKICAgIHBhc3MKCgpjbGFzcyBQcm90b2NvbEVycm9yKEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVucyBtaWQtcmVxdWVzdC9yZXNwb25zZS4iCiAgICBwYXNzCgoKIzogUmVuYW1lZCB0byBQcm90b2NvbEVycm9yIGJ1dCBhbGlhc2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KQ29ubmVjdGlvbkVycm9yID0gUHJvdG9jb2xFcnJvcgoKCiMgTGVhZiBFeGNlcHRpb25zCgpjbGFzcyBNYXhSZXRyeUVycm9yKFJlcXVlc3RFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBpcyBleGNlZWRlZC4KCiAgICA6cGFyYW0gcG9vbDogVGhlIGNvbm5lY3Rpb24gcG9vbAogICAgOnR5cGUgcG9vbDogOmNsYXNzOmB+dXJsbGliMy5jb25uZWN0aW9ucG9vbC5IVFRQQ29ubmVjdGlvblBvb2xgCiAgICA6cGFyYW0gc3RyaW5nIHVybDogVGhlIHJlcXVlc3RlZCBVcmwKICAgIDpwYXJhbSBleGNlcHRpb25zLkV4Y2VwdGlvbiByZWFzb246IFRoZSB1bmRlcmx5aW5nIGVycm9yCgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2wsIHVybCwgcmVhc29uPU5vbmUpOgogICAgICAgIHNlbGYucmVhc29uID0gcmVhc29uCgogICAgICAgIG1lc3NhZ2UgPSAiTWF4IHJldHJpZXMgZXhjZWVkZWQgd2l0aCB1cmw6ICVzIChDYXVzZWQgYnkgJXIpIiAlICgKICAgICAgICAgICAgdXJsLCByZWFzb24pCgogICAgICAgIFJlcXVlc3RFcnJvci5fX2luaXRfXyhzZWxmLCBwb29sLCB1cmwsIG1lc3NhZ2UpCgoKY2xhc3MgSG9zdENoYW5nZWRFcnJvcihSZXF1ZXN0RXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGFuIGV4aXN0aW5nIHBvb2wgZ2V0cyBhIHJlcXVlc3QgZm9yIGEgZm9yZWlnbiBob3N0LiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcG9vbCwgdXJsLCByZXRyaWVzPTMpOgogICAgICAgIG1lc3NhZ2UgPSAiVHJpZWQgdG8gb3BlbiBhIGZvcmVpZ24gaG9zdCB3aXRoIHVybDogJXMiICUgdXJsCiAgICAgICAgUmVxdWVzdEVycm9yLl9faW5pdF9fKHNlbGYsIHBvb2wsIHVybCwgbWVzc2FnZSkKICAgICAgICBzZWxmLnJldHJpZXMgPSByZXRyaWVzCgoKY2xhc3MgVGltZW91dFN0YXRlRXJyb3IoSFRUUEVycm9yKToKICAgICIiIiBSYWlzZWQgd2hlbiBwYXNzaW5nIGFuIGludmFsaWQgc3RhdGUgdG8gYSB0aW1lb3V0ICIiIgogICAgcGFzcwoKCmNsYXNzIFRpbWVvdXRFcnJvcihIVFRQRXJyb3IpOgogICAgIiIiIFJhaXNlZCB3aGVuIGEgc29ja2V0IHRpbWVvdXQgZXJyb3Igb2NjdXJzLgoKICAgIENhdGNoaW5nIHRoaXMgZXJyb3Igd2lsbCBjYXRjaCBib3RoIDpleGM6YFJlYWRUaW1lb3V0RXJyb3JzCiAgICA8UmVhZFRpbWVvdXRFcnJvcj5gIGFuZCA6ZXhjOmBDb25uZWN0VGltZW91dEVycm9ycyA8Q29ubmVjdFRpbWVvdXRFcnJvcj5gLgogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgUmVhZFRpbWVvdXRFcnJvcihUaW1lb3V0RXJyb3IsIFJlcXVlc3RFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYSBzb2NrZXQgdGltZW91dCBvY2N1cnMgd2hpbGUgcmVjZWl2aW5nIGRhdGEgZnJvbSBhIHNlcnZlciIKICAgIHBhc3MKCgojIFRoaXMgdGltZW91dCBlcnJvciBkb2VzIG5vdCBoYXZlIGEgVVJMIGF0dGFjaGVkIGFuZCBuZWVkcyB0byBpbmhlcml0IGZyb20gdGhlCiMgYmFzZSBIVFRQRXJyb3IKY2xhc3MgQ29ubmVjdFRpbWVvdXRFcnJvcihUaW1lb3V0RXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGEgc29ja2V0IHRpbWVvdXQgb2NjdXJzIHdoaWxlIGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIiCiAgICBwYXNzCgoKY2xhc3MgTmV3Q29ubmVjdGlvbkVycm9yKENvbm5lY3RUaW1lb3V0RXJyb3IsIFBvb2xFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gd2UgZmFpbCB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbi4gVXN1YWxseSBFQ09OTlJFRlVTRUQuIgogICAgcGFzcwoKCmNsYXNzIEVtcHR5UG9vbEVycm9yKFBvb2xFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYSBwb29sIHJ1bnMgb3V0IG9mIGNvbm5lY3Rpb25zIGFuZCBubyBtb3JlIGFyZSBhbGxvd2VkLiIKICAgIHBhc3MKCgpjbGFzcyBDbG9zZWRQb29sRXJyb3IoUG9vbEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhIHJlcXVlc3QgZW50ZXJzIGEgcG9vbCBhZnRlciB0aGUgcG9vbCBoYXMgYmVlbiBjbG9zZWQuIgogICAgcGFzcwoKCmNsYXNzIExvY2F0aW9uVmFsdWVFcnJvcihWYWx1ZUVycm9yLCBIVFRQRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZyB3aXRoIGEgZ2l2ZW4gVVJMIGlucHV0LiIKICAgIHBhc3MKCgpjbGFzcyBMb2NhdGlvblBhcnNlRXJyb3IoTG9jYXRpb25WYWx1ZUVycm9yKToKICAgICJSYWlzZWQgd2hlbiBnZXRfaG9zdCBvciBzaW1pbGFyIGZhaWxzIHRvIHBhcnNlIHRoZSBVUkwgaW5wdXQuIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgbWVzc2FnZSA9ICJGYWlsZWQgdG8gcGFyc2U6ICVzIiAlIGxvY2F0aW9uCiAgICAgICAgSFRUUEVycm9yLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCgogICAgICAgIHNlbGYubG9jYXRpb24gPSBsb2NhdGlvbgoKCmNsYXNzIFJlc3BvbnNlRXJyb3IoSFRUUEVycm9yKToKICAgICJVc2VkIGFzIGEgY29udGFpbmVyIGZvciBhbiBlcnJvciByZWFzb24gc3VwcGxpZWQgaW4gYSBNYXhSZXRyeUVycm9yLiIKICAgIEdFTkVSSUNfRVJST1IgPSAndG9vIG1hbnkgZXJyb3IgcmVzcG9uc2VzJwogICAgU1BFQ0lGSUNfRVJST1IgPSAndG9vIG1hbnkge3N0YXR1c19jb2RlfSBlcnJvciByZXNwb25zZXMnCgoKY2xhc3MgU2VjdXJpdHlXYXJuaW5nKEhUVFBXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBwZXJmb21pbmcgc2VjdXJpdHkgcmVkdWNpbmcgYWN0aW9ucyIKICAgIHBhc3MKCgpjbGFzcyBTdWJqZWN0QWx0TmFtZVdhcm5pbmcoU2VjdXJpdHlXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBjb25uZWN0aW5nIHRvIGEgaG9zdCB3aXRoIGEgY2VydGlmaWNhdGUgbWlzc2luZyBhIFNBTi4iCiAgICBwYXNzCgoKY2xhc3MgSW5zZWN1cmVSZXF1ZXN0V2FybmluZyhTZWN1cml0eVdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIG1ha2luZyBhbiB1bnZlcmlmaWVkIEhUVFBTIHJlcXVlc3QuIgogICAgcGFzcwoKCmNsYXNzIFN5c3RlbVRpbWVXYXJuaW5nKFNlY3VyaXR5V2FybmluZyk6CiAgICAiV2FybmVkIHdoZW4gc3lzdGVtIHRpbWUgaXMgc3VzcGVjdGVkIHRvIGJlIHdyb25nIgogICAgcGFzcwoKCmNsYXNzIEluc2VjdXJlUGxhdGZvcm1XYXJuaW5nKFNlY3VyaXR5V2FybmluZyk6CiAgICAiV2FybmVkIHdoZW4gY2VydGFpbiBTU0wgY29uZmlndXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlIG9uIGEgcGxhdGZvcm0uIgogICAgcGFzcwoKCmNsYXNzIFNOSU1pc3NpbmdXYXJuaW5nKEhUVFBXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBtYWtpbmcgYSBIVFRQUyByZXF1ZXN0IHdpdGhvdXQgU05JIGF2YWlsYWJsZS4iCiAgICBwYXNzCgoKY2xhc3MgRGVwZW5kZW5jeVdhcm5pbmcoSFRUUFdhcm5pbmcpOgogICAgIiIiCiAgICBXYXJuZWQgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gaW1wb3J0IGEgbW9kdWxlIHdpdGggbWlzc2luZyBvcHRpb25hbAogICAgZGVwZW5kZW5jaWVzLgogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgUmVzcG9uc2VOb3RDaHVua2VkKFByb3RvY29sRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgIlJlc3BvbnNlIG5lZWRzIHRvIGJlIGNodW5rZWQgaW4gb3JkZXIgdG8gcmVhZCBpdCBhcyBjaHVua3MuIgogICAgcGFzcwoKCmNsYXNzIEJvZHlOb3RIdHRwbGliQ29tcGF0aWJsZShIVFRQRXJyb3IpOgogICAgIiIiCiAgICBCb2R5IHNob3VsZCBiZSBodHRwbGliLkhUVFBSZXNwb25zZSBsaWtlIChoYXZlIGFuIGZwIGF0dHJpYnV0ZSB3aGljaAogICAgcmV0dXJucyByYXcgY2h1bmtzKSBmb3IgcmVhZF9jaHVua2VkKCkuCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBJbmNvbXBsZXRlUmVhZChIVFRQRXJyb3IsIGh0dHBsaWJfSW5jb21wbGV0ZVJlYWQpOgogICAgIiIiCiAgICBSZXNwb25zZSBsZW5ndGggZG9lc24ndCBtYXRjaCBleHBlY3RlZCBDb250ZW50LUxlbmd0aAoKICAgIFN1YmNsYXNzIG9mIGh0dHBfY2xpZW50LkluY29tcGxldGVSZWFkIHRvIGFsbG93IGludCB2YWx1ZQogICAgZm9yIGBwYXJ0aWFsYCB0byBhdm9pZCBjcmVhdGluZyBsYXJnZSBvYmplY3RzIG9uIHN0cmVhbWVkCiAgICByZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnRpYWwsIGV4cGVjdGVkKToKICAgICAgICBzdXBlcihJbmNvbXBsZXRlUmVhZCwgc2VsZikuX19pbml0X18ocGFydGlhbCwgZXhwZWN0ZWQpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAoJ0luY29tcGxldGVSZWFkKCVpIGJ5dGVzIHJlYWQsICcKICAgICAgICAgICAgICAgICclaSBtb3JlIGV4cGVjdGVkKScgJSAoc2VsZi5wYXJ0aWFsLCBzZWxmLmV4cGVjdGVkKSkKCgpjbGFzcyBJbnZhbGlkSGVhZGVyKEhUVFBFcnJvcik6CiAgICAiVGhlIGhlYWRlciBwcm92aWRlZCB3YXMgc29tZWhvdyBpbnZhbGlkLiIKICAgIHBhc3MKCgpjbGFzcyBQcm94eVNjaGVtZVVua25vd24oQXNzZXJ0aW9uRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgIlByb3h5TWFuYWdlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzdXBwbGllZCBzY2hlbWUiCiAgICAjIFRPRE8odC04Y2gpOiBTdG9wIGluaGVyaXRpbmcgZnJvbSBBc3NlcnRpb25FcnJvciBpbiB2Mi4wLgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzY2hlbWUpOgogICAgICAgIG1lc3NhZ2UgPSAiTm90IHN1cHBvcnRlZCBwcm94eSBzY2hlbWUgJXMiICUgc2NoZW1lCiAgICAgICAgc3VwZXIoUHJveHlTY2hlbWVVbmtub3duLCBzZWxmKS5fX2luaXRfXyhtZXNzYWdlKQoKCmNsYXNzIEhlYWRlclBhcnNpbmdFcnJvcihIVFRQRXJyb3IpOgogICAgIlJhaXNlZCBieSBhc3NlcnRfaGVhZGVyX3BhcnNpbmcsIGJ1dCB3ZSBjb252ZXJ0IGl0IHRvIGEgbG9nLndhcm5pbmcgc3RhdGVtZW50LiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWZlY3RzLCB1bnBhcnNlZF9kYXRhKToKICAgICAgICBtZXNzYWdlID0gJyVzLCB1bnBhcnNlZCBkYXRhOiAlcicgJSAoZGVmZWN0cyBvciAnVW5rbm93bicsIHVucGFyc2VkX2RhdGEpCiAgICAgICAgc3VwZXIoSGVhZGVyUGFyc2luZ0Vycm9yLCBzZWxmKS5fX2luaXRfXyhtZXNzYWdlKQoKCmNsYXNzIFVucmV3aW5kYWJsZUJvZHlFcnJvcihIVFRQRXJyb3IpOgogICAgInVybGxpYjMgZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gcmV3aW5kIGEgYm9keSIKICAgIHBhc3MKUEsDBBQAAAAAAAAAIQABOYyyNxcAADcXAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2ZpZWxkcy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBlbWFpbC51dGlscwppbXBvcnQgbWltZXR5cGVzCgpmcm9tIC5wYWNrYWdlcyBpbXBvcnQgc2l4CgoKZGVmIGd1ZXNzX2NvbnRlbnRfdHlwZShmaWxlbmFtZSwgZGVmYXVsdD0nYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk6CiAgICAiIiIKICAgIEd1ZXNzIHRoZSAiQ29udGVudC1UeXBlIiBvZiBhIGZpbGUuCgogICAgOnBhcmFtIGZpbGVuYW1lOgogICAgICAgIFRoZSBmaWxlbmFtZSB0byBndWVzcyB0aGUgIkNvbnRlbnQtVHlwZSIgb2YgdXNpbmcgOm1vZDpgbWltZXR5cGVzYC4KICAgIDpwYXJhbSBkZWZhdWx0OgogICAgICAgIElmIG5vICJDb250ZW50LVR5cGUiIGNhbiBiZSBndWVzc2VkLCBkZWZhdWx0IHRvIGBkZWZhdWx0YC4KICAgICIiIgogICAgaWYgZmlsZW5hbWU6CiAgICAgICAgcmV0dXJuIG1pbWV0eXBlcy5ndWVzc190eXBlKGZpbGVuYW1lKVswXSBvciBkZWZhdWx0CiAgICByZXR1cm4gZGVmYXVsdAoKCmRlZiBmb3JtYXRfaGVhZGVyX3BhcmFtKG5hbWUsIHZhbHVlKToKICAgICIiIgogICAgSGVscGVyIGZ1bmN0aW9uIHRvIGZvcm1hdCBhbmQgcXVvdGUgYSBzaW5nbGUgaGVhZGVyIHBhcmFtZXRlci4KCiAgICBQYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBoZWFkZXIgcGFyYW1ldGVycyB3aGljaCBtaWdodCBjb250YWluCiAgICBub24tQVNDSUkgdmFsdWVzLCBsaWtlIGZpbGUgbmFtZXMuIFRoaXMgZm9sbG93cyBSRkMgMjIzMSwgYXMKICAgIHN1Z2dlc3RlZCBieSBSRkMgMjM4OCBTZWN0aW9uIDQuNC4KCiAgICA6cGFyYW0gbmFtZToKICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLCBhIHN0cmluZyBleHBlY3RlZCB0byBiZSBBU0NJSSBvbmx5LgogICAgOnBhcmFtIHZhbHVlOgogICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLCBwcm92aWRlZCBhcyBhIHVuaWNvZGUgc3RyaW5nLgogICAgIiIiCiAgICBpZiBub3QgYW55KGNoIGluIHZhbHVlIGZvciBjaCBpbiAnIlxcXHJcbicpOgogICAgICAgIHJlc3VsdCA9ICclcz0iJXMiJyAlIChuYW1lLCB2YWx1ZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3VsdC5lbmNvZGUoJ2FzY2lpJykKICAgICAgICBleGNlcHQgKFVuaWNvZGVFbmNvZGVFcnJvciwgVW5pY29kZURlY29kZUVycm9yKToKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgIGlmIG5vdCBzaXguUFkzIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBzaXgudGV4dF90eXBlKTogICMgUHl0aG9uIDI6CiAgICAgICAgdmFsdWUgPSB2YWx1ZS5lbmNvZGUoJ3V0Zi04JykKICAgIHZhbHVlID0gZW1haWwudXRpbHMuZW5jb2RlX3JmYzIyMzEodmFsdWUsICd1dGYtOCcpCiAgICB2YWx1ZSA9ICclcyo9JXMnICUgKG5hbWUsIHZhbHVlKQogICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgUmVxdWVzdEZpZWxkKG9iamVjdCk6CiAgICAiIiIKICAgIEEgZGF0YSBjb250YWluZXIgZm9yIHJlcXVlc3QgYm9keSBwYXJhbWV0ZXJzLgoKICAgIDpwYXJhbSBuYW1lOgogICAgICAgIFRoZSBuYW1lIG9mIHRoaXMgcmVxdWVzdCBmaWVsZC4KICAgIDpwYXJhbSBkYXRhOgogICAgICAgIFRoZSBkYXRhL3ZhbHVlIGJvZHkuCiAgICA6cGFyYW0gZmlsZW5hbWU6CiAgICAgICAgQW4gb3B0aW9uYWwgZmlsZW5hbWUgb2YgdGhlIHJlcXVlc3QgZmllbGQuCiAgICA6cGFyYW0gaGVhZGVyczoKICAgICAgICBBbiBvcHRpb25hbCBkaWN0LWxpa2Ugb2JqZWN0IG9mIGhlYWRlcnMgdG8gaW5pdGlhbGx5IHVzZSBmb3IgdGhlIGZpZWxkLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZGF0YSwgZmlsZW5hbWU9Tm9uZSwgaGVhZGVycz1Ob25lKToKICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQogICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCiAgICAgICAgc2VsZi5oZWFkZXJzID0ge30KICAgICAgICBpZiBoZWFkZXJzOgogICAgICAgICAgICBzZWxmLmhlYWRlcnMgPSBkaWN0KGhlYWRlcnMpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV90dXBsZXMoY2xzLCBmaWVsZG5hbWUsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBBIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGAgZmFjdG9yeSBmcm9tIG9sZC1zdHlsZSB0dXBsZSBwYXJhbWV0ZXJzLgoKICAgICAgICBTdXBwb3J0cyBjb25zdHJ1Y3RpbmcgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYCBmcm9tCiAgICAgICAgcGFyYW1ldGVyIG9mIGtleS92YWx1ZSBzdHJpbmdzIEFORCBrZXkvZmlsZXR1cGxlLiBBIGZpbGV0dXBsZSBpcyBhCiAgICAgICAgKGZpbGVuYW1lLCBkYXRhLCBNSU1FIHR5cGUpIHR1cGxlIHdoZXJlIHRoZSBNSU1FIHR5cGUgaXMgb3B0aW9uYWwuCiAgICAgICAgRm9yIGV4YW1wbGU6OgoKICAgICAgICAgICAgJ2Zvbyc6ICdiYXInLAogICAgICAgICAgICAnZmFrZWZpbGUnOiAoJ2Zvb2ZpbGUudHh0JywgJ2NvbnRlbnRzIG9mIGZvb2ZpbGUnKSwKICAgICAgICAgICAgJ3JlYWxmaWxlJzogKCdiYXJmaWxlLnR4dCcsIG9wZW4oJ3JlYWxmaWxlJykucmVhZCgpKSwKICAgICAgICAgICAgJ3R5cGVkZmlsZSc6ICgnYmF6ZmlsZS5iaW4nLCBvcGVuKCdiYXpmaWxlJykucmVhZCgpLCAnaW1hZ2UvanBlZycpLAogICAgICAgICAgICAnbm9uYW1lZmlsZSc6ICdjb250ZW50cyBvZiBub25hbWVmaWxlIGZpZWxkJywKCiAgICAgICAgRmllbGQgbmFtZXMgYW5kIGZpbGVuYW1lcyBtdXN0IGJlIHVuaWNvZGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgogICAgICAgICAgICBpZiBsZW4odmFsdWUpID09IDM6CiAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZGF0YSwgY29udGVudF90eXBlID0gdmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBkYXRhID0gdmFsdWUKICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IGd1ZXNzX2NvbnRlbnRfdHlwZShmaWxlbmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxlbmFtZSA9IE5vbmUKICAgICAgICAgICAgY29udGVudF90eXBlID0gTm9uZQogICAgICAgICAgICBkYXRhID0gdmFsdWUKCiAgICAgICAgcmVxdWVzdF9wYXJhbSA9IGNscyhmaWVsZG5hbWUsIGRhdGEsIGZpbGVuYW1lPWZpbGVuYW1lKQogICAgICAgIHJlcXVlc3RfcGFyYW0ubWFrZV9tdWx0aXBhcnQoY29udGVudF90eXBlPWNvbnRlbnRfdHlwZSkKCiAgICAgICAgcmV0dXJuIHJlcXVlc3RfcGFyYW0KCiAgICBkZWYgX3JlbmRlcl9wYXJ0KHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBPdmVycmlkYWJsZSBoZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IGEgc2luZ2xlIGhlYWRlciBwYXJhbWV0ZXIuCgogICAgICAgIDpwYXJhbSBuYW1lOgogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLCBhIHN0cmluZyBleHBlY3RlZCB0byBiZSBBU0NJSSBvbmx5LgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIsIHByb3ZpZGVkIGFzIGEgdW5pY29kZSBzdHJpbmcuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGZvcm1hdF9oZWFkZXJfcGFyYW0obmFtZSwgdmFsdWUpCgogICAgZGVmIF9yZW5kZXJfcGFydHMoc2VsZiwgaGVhZGVyX3BhcnRzKToKICAgICAgICAiIiIKICAgICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IGFuZCBxdW90ZSBhIHNpbmdsZSBoZWFkZXIuCgogICAgICAgIFVzZWZ1bCBmb3Igc2luZ2xlIGhlYWRlcnMgdGhhdCBhcmUgY29tcG9zZWQgb2YgbXVsdGlwbGUgaXRlbXMuIEUuZy4sCiAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb24nIGZpZWxkcy4KCiAgICAgICAgOnBhcmFtIGhlYWRlcl9wYXJ0czoKICAgICAgICAgICAgQSBzZXF1ZW5jZSBvZiAoaywgdikgdHlwbGVzIG9yIGEgOmNsYXNzOmBkaWN0YCBvZiAoaywgdikgdG8gZm9ybWF0CiAgICAgICAgICAgIGFzIGBrMT0idjEiOyBrMj0idjIiOyAuLi5gLgogICAgICAgICIiIgogICAgICAgIHBhcnRzID0gW10KICAgICAgICBpdGVyYWJsZSA9IGhlYWRlcl9wYXJ0cwogICAgICAgIGlmIGlzaW5zdGFuY2UoaGVhZGVyX3BhcnRzLCBkaWN0KToKICAgICAgICAgICAgaXRlcmFibGUgPSBoZWFkZXJfcGFydHMuaXRlbXMoKQoKICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gaXRlcmFibGU6CiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHNlbGYuX3JlbmRlcl9wYXJ0KG5hbWUsIHZhbHVlKSkKCiAgICAgICAgcmV0dXJuICc7ICcuam9pbihwYXJ0cykKCiAgICBkZWYgcmVuZGVyX2hlYWRlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVuZGVycyB0aGUgaGVhZGVycyBmb3IgdGhpcyByZXF1ZXN0IGZpZWxkLgogICAgICAgICIiIgogICAgICAgIGxpbmVzID0gW10KCiAgICAgICAgc29ydF9rZXlzID0gWydDb250ZW50LURpc3Bvc2l0aW9uJywgJ0NvbnRlbnQtVHlwZScsICdDb250ZW50LUxvY2F0aW9uJ10KICAgICAgICBmb3Igc29ydF9rZXkgaW4gc29ydF9rZXlzOgogICAgICAgICAgICBpZiBzZWxmLmhlYWRlcnMuZ2V0KHNvcnRfa2V5LCBGYWxzZSk6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyVzOiAlcycgJSAoc29ydF9rZXksIHNlbGYuaGVhZGVyc1tzb3J0X2tleV0pKQoKICAgICAgICBmb3IgaGVhZGVyX25hbWUsIGhlYWRlcl92YWx1ZSBpbiBzZWxmLmhlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgaWYgaGVhZGVyX25hbWUgbm90IGluIHNvcnRfa2V5czoKICAgICAgICAgICAgICAgIGlmIGhlYWRlcl92YWx1ZToKICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyVzOiAlcycgJSAoaGVhZGVyX25hbWUsIGhlYWRlcl92YWx1ZSkpCgogICAgICAgIGxpbmVzLmFwcGVuZCgnXHJcbicpCiAgICAgICAgcmV0dXJuICdcclxuJy5qb2luKGxpbmVzKQoKICAgIGRlZiBtYWtlX211bHRpcGFydChzZWxmLCBjb250ZW50X2Rpc3Bvc2l0aW9uPU5vbmUsIGNvbnRlbnRfdHlwZT1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbG9jYXRpb249Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZXMgdGhpcyByZXF1ZXN0IGZpZWxkIGludG8gYSBtdWx0aXBhcnQgcmVxdWVzdCBmaWVsZC4KCiAgICAgICAgVGhpcyBtZXRob2Qgb3ZlcnJpZGVzICJDb250ZW50LURpc3Bvc2l0aW9uIiwgIkNvbnRlbnQtVHlwZSIgYW5kCiAgICAgICAgIkNvbnRlbnQtTG9jYXRpb24iIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3QgcGFyYW1ldGVyLgoKICAgICAgICA6cGFyYW0gY29udGVudF90eXBlOgogICAgICAgICAgICBUaGUgJ0NvbnRlbnQtVHlwZScgb2YgdGhlIHJlcXVlc3QgYm9keS4KICAgICAgICA6cGFyYW0gY29udGVudF9sb2NhdGlvbjoKICAgICAgICAgICAgVGhlICdDb250ZW50LUxvY2F0aW9uJyBvZiB0aGUgcmVxdWVzdCBib2R5LgoKICAgICAgICAiIiIKICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9IGNvbnRlbnRfZGlzcG9zaXRpb24gb3IgJ2Zvcm0tZGF0YScKICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSArPSAnOyAnLmpvaW4oWwogICAgICAgICAgICAnJywgc2VsZi5fcmVuZGVyX3BhcnRzKAogICAgICAgICAgICAgICAgKCgnbmFtZScsIHNlbGYuX25hbWUpLCAoJ2ZpbGVuYW1lJywgc2VsZi5fZmlsZW5hbWUpKQogICAgICAgICAgICApCiAgICAgICAgXSkKICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gY29udGVudF90eXBlCiAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxvY2F0aW9uJ10gPSBjb250ZW50X2xvY2F0aW9uClBLAwQUAAAAAAAAACEA113QFxEJAAARCQAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9maWxlcG9zdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBjb2RlY3MKCmZyb20gdXVpZCBpbXBvcnQgdXVpZDQKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwoKZnJvbSAucGFja2FnZXMgaW1wb3J0IHNpeApmcm9tIC5wYWNrYWdlcy5zaXggaW1wb3J0IGIKZnJvbSAuZmllbGRzIGltcG9ydCBSZXF1ZXN0RmllbGQKCndyaXRlciA9IGNvZGVjcy5sb29rdXAoJ3V0Zi04JylbM10KCgpkZWYgY2hvb3NlX2JvdW5kYXJ5KCk6CiAgICAiIiIKICAgIE91ciBlbWJhcnJhc3NpbmdseS1zaW1wbGUgcmVwbGFjZW1lbnQgZm9yIG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnkuCiAgICAiIiIKICAgIHJldHVybiB1dWlkNCgpLmhleAoKCmRlZiBpdGVyX2ZpZWxkX29iamVjdHMoZmllbGRzKToKICAgICIiIgogICAgSXRlcmF0ZSBvdmVyIGZpZWxkcy4KCiAgICBTdXBwb3J0cyBsaXN0IG9mIChrLCB2KSB0dXBsZXMgYW5kIGRpY3RzLCBhbmQgbGlzdHMgb2YKICAgIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGAuCgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKGZpZWxkcywgZGljdCk6CiAgICAgICAgaSA9IHNpeC5pdGVyaXRlbXMoZmllbGRzKQogICAgZWxzZToKICAgICAgICBpID0gaXRlcihmaWVsZHMpCgogICAgZm9yIGZpZWxkIGluIGk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShmaWVsZCwgUmVxdWVzdEZpZWxkKToKICAgICAgICAgICAgeWllbGQgZmllbGQKICAgICAgICBlbHNlOgogICAgICAgICAgICB5aWVsZCBSZXF1ZXN0RmllbGQuZnJvbV90dXBsZXMoKmZpZWxkKQoKCmRlZiBpdGVyX2ZpZWxkcyhmaWVsZHMpOgogICAgIiIiCiAgICAuLiBkZXByZWNhdGVkOjogMS42CgogICAgSXRlcmF0ZSBvdmVyIGZpZWxkcy4KCiAgICBUaGUgYWRkaXRpb24gb2YgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYCBtYWtlcyB0aGlzIGZ1bmN0aW9uCiAgICBvYnNvbGV0ZS4gSW5zdGVhZCwgdXNlIDpmdW5jOmBpdGVyX2ZpZWxkX29iamVjdHNgLCB3aGljaCByZXR1cm5zCiAgICA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgIG9iamVjdHMuCgogICAgU3VwcG9ydHMgbGlzdCBvZiAoaywgdikgdHVwbGVzIGFuZCBkaWN0cy4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShmaWVsZHMsIGRpY3QpOgogICAgICAgIHJldHVybiAoKGssIHYpIGZvciBrLCB2IGluIHNpeC5pdGVyaXRlbXMoZmllbGRzKSkKCiAgICByZXR1cm4gKChrLCB2KSBmb3IgaywgdiBpbiBmaWVsZHMpCgoKZGVmIGVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEoZmllbGRzLCBib3VuZGFyeT1Ob25lKToKICAgICIiIgogICAgRW5jb2RlIGEgZGljdGlvbmFyeSBvZiBgYGZpZWxkc2BgIHVzaW5nIHRoZSBtdWx0aXBhcnQvZm9ybS1kYXRhIE1JTUUgZm9ybWF0LgoKICAgIDpwYXJhbSBmaWVsZHM6CiAgICAgICAgRGljdGlvbmFyeSBvZiBmaWVsZHMgb3IgbGlzdCBvZiAoa2V5LCA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgKS4KCiAgICA6cGFyYW0gYm91bmRhcnk6CiAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlbiBhIHJhbmRvbSBib3VuZGFyeSB3aWxsIGJlIGdlbmVyYXRlZCB1c2luZwogICAgICAgIDpmdW5jOmBtaW1ldG9vbHMuY2hvb3NlX2JvdW5kYXJ5YC4KICAgICIiIgogICAgYm9keSA9IEJ5dGVzSU8oKQogICAgaWYgYm91bmRhcnkgaXMgTm9uZToKICAgICAgICBib3VuZGFyeSA9IGNob29zZV9ib3VuZGFyeSgpCgogICAgZm9yIGZpZWxkIGluIGl0ZXJfZmllbGRfb2JqZWN0cyhmaWVsZHMpOgogICAgICAgIGJvZHkud3JpdGUoYignLS0lc1xyXG4nICUgKGJvdW5kYXJ5KSkpCgogICAgICAgIHdyaXRlcihib2R5KS53cml0ZShmaWVsZC5yZW5kZXJfaGVhZGVycygpKQogICAgICAgIGRhdGEgPSBmaWVsZC5kYXRhCgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgaW50KToKICAgICAgICAgICAgZGF0YSA9IHN0cihkYXRhKSAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHNpeC50ZXh0X3R5cGUpOgogICAgICAgICAgICB3cml0ZXIoYm9keSkud3JpdGUoZGF0YSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBib2R5LndyaXRlKGRhdGEpCgogICAgICAgIGJvZHkud3JpdGUoYidcclxuJykKCiAgICBib2R5LndyaXRlKGIoJy0tJXMtLVxyXG4nICUgKGJvdW5kYXJ5KSkpCgogICAgY29udGVudF90eXBlID0gc3RyKCdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lcycgJSBib3VuZGFyeSkKCiAgICByZXR1cm4gYm9keS5nZXR2YWx1ZSgpLCBjb250ZW50X3R5cGUKUEsDBBQAAAAAAAAAIQCPXaB8bQAAAG0AAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gLiBpbXBvcnQgc3NsX21hdGNoX2hvc3RuYW1lCgpfX2FsbF9fID0gKCdzc2xfbWF0Y2hfaG9zdG5hbWUnLCApClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAATwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAFJXHLm1BQAAtQUAAE8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvYmFja3BvcnRzL21ha2VmaWxlLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIiIiCmJhY2twb3J0cy5tYWtlZmlsZQp+fn5+fn5+fn5+fn5+fn5+fn4KCkJhY2twb3J0cyB0aGUgUHl0aG9uIDMgYGBzb2NrZXQubWFrZWZpbGVgYCBtZXRob2QgZm9yIHVzZSB3aXRoIGFueXRoaW5nIHRoYXQKd2FudHMgdG8gY3JlYXRlIGEgImZha2UiIHNvY2tldCBvYmplY3QuCiIiIgppbXBvcnQgaW8KCmZyb20gc29ja2V0IGltcG9ydCBTb2NrZXRJTwoKCmRlZiBiYWNrcG9ydF9tYWtlZmlsZShzZWxmLCBtb2RlPSJyIiwgYnVmZmVyaW5nPU5vbmUsIGVuY29kaW5nPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM9Tm9uZSwgbmV3bGluZT1Ob25lKToKICAgICIiIgogICAgQmFja3BvcnQgb2YgYGBzb2NrZXQubWFrZWZpbGVgYCBmcm9tIFB5dGhvbiAzLjUuCiAgICAiIiIKICAgIGlmIG5vdCBzZXQobW9kZSkgPD0gc2V0KFsiciIsICJ3IiwgImIiXSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgImludmFsaWQgbW9kZSAlciAob25seSByLCB3LCBiIGFsbG93ZWQpIiAlIChtb2RlLCkKICAgICAgICApCiAgICB3cml0aW5nID0gInciIGluIG1vZGUKICAgIHJlYWRpbmcgPSAiciIgaW4gbW9kZSBvciBub3Qgd3JpdGluZwogICAgYXNzZXJ0IHJlYWRpbmcgb3Igd3JpdGluZwogICAgYmluYXJ5ID0gImIiIGluIG1vZGUKICAgIHJhd21vZGUgPSAiIgogICAgaWYgcmVhZGluZzoKICAgICAgICByYXdtb2RlICs9ICJyIgogICAgaWYgd3JpdGluZzoKICAgICAgICByYXdtb2RlICs9ICJ3IgogICAgcmF3ID0gU29ja2V0SU8oc2VsZiwgcmF3bW9kZSkKICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgKz0gMQogICAgaWYgYnVmZmVyaW5nIGlzIE5vbmU6CiAgICAgICAgYnVmZmVyaW5nID0gLTEKICAgIGlmIGJ1ZmZlcmluZyA8IDA6CiAgICAgICAgYnVmZmVyaW5nID0gaW8uREVGQVVMVF9CVUZGRVJfU0laRQogICAgaWYgYnVmZmVyaW5nID09IDA6CiAgICAgICAgaWYgbm90IGJpbmFyeToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5idWZmZXJlZCBzdHJlYW1zIG11c3QgYmUgYmluYXJ5IikKICAgICAgICByZXR1cm4gcmF3CiAgICBpZiByZWFkaW5nIGFuZCB3cml0aW5nOgogICAgICAgIGJ1ZmZlciA9IGlvLkJ1ZmZlcmVkUldQYWlyKHJhdywgcmF3LCBidWZmZXJpbmcpCiAgICBlbGlmIHJlYWRpbmc6CiAgICAgICAgYnVmZmVyID0gaW8uQnVmZmVyZWRSZWFkZXIocmF3LCBidWZmZXJpbmcpCiAgICBlbHNlOgogICAgICAgIGFzc2VydCB3cml0aW5nCiAgICAgICAgYnVmZmVyID0gaW8uQnVmZmVyZWRXcml0ZXIocmF3LCBidWZmZXJpbmcpCiAgICBpZiBiaW5hcnk6CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgdGV4dCA9IGlvLlRleHRJT1dyYXBwZXIoYnVmZmVyLCBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lKQogICAgdGV4dC5tb2RlID0gbW9kZQogICAgcmV0dXJuIHRleHQKUEsDBBQAAAAAAAAAIQBGwaZn5yIAAOciAABJAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL29yZGVyZWRfZGljdC5weSMgQmFja3BvcnQgb2YgT3JkZXJlZERpY3QoKSBjbGFzcyB0aGF0IHJ1bnMgb24gUHl0aG9uIDIuNCwgMi41LCAyLjYsIDIuNyBhbmQgcHlweS4KIyBQYXNzZXMgUHl0aG9uMi43J3MgdGVzdCBzdWl0ZSBhbmQgaW5jb3Jwb3JhdGVzIGFsbCB0aGUgbGF0ZXN0IHVwZGF0ZXMuCiMgQ29weXJpZ2h0IDIwMDkgUmF5bW9uZCBIZXR0aW5nZXIsIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KIyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81NzY2OTMvCnRyeToKICAgIGZyb20gdGhyZWFkIGltcG9ydCBnZXRfaWRlbnQgYXMgX2dldF9pZGVudApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGR1bW15X3RocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKCnRyeToKICAgIGZyb20gX2FiY29sbCBpbXBvcnQgS2V5c1ZpZXcsIFZhbHVlc1ZpZXcsIEl0ZW1zVmlldwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCgoKY2xhc3MgT3JkZXJlZERpY3QoZGljdCk6CiAgICAnRGljdGlvbmFyeSB0aGF0IHJlbWVtYmVycyBpbnNlcnRpb24gb3JkZXInCiAgICAjIEFuIGluaGVyaXRlZCBkaWN0IG1hcHMga2V5cyB0byB2YWx1ZXMuCiAgICAjIFRoZSBpbmhlcml0ZWQgZGljdCBwcm92aWRlcyBfX2dldGl0ZW1fXywgX19sZW5fXywgX19jb250YWluc19fLCBhbmQgZ2V0LgogICAgIyBUaGUgcmVtYWluaW5nIG1ldGhvZHMgYXJlIG9yZGVyLWF3YXJlLgogICAgIyBCaWctTyBydW5uaW5nIHRpbWVzIGZvciBhbGwgbWV0aG9kcyBhcmUgdGhlIHNhbWUgYXMgZm9yIHJlZ3VsYXIgZGljdGlvbmFyaWVzLgoKICAgICMgVGhlIGludGVybmFsIHNlbGYuX19tYXAgZGljdGlvbmFyeSBtYXBzIGtleXMgdG8gbGlua3MgaW4gYSBkb3VibHkgbGlua2VkIGxpc3QuCiAgICAjIFRoZSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3Qgc3RhcnRzIGFuZCBlbmRzIHdpdGggYSBzZW50aW5lbCBlbGVtZW50LgogICAgIyBUaGUgc2VudGluZWwgZWxlbWVudCBuZXZlciBnZXRzIGRlbGV0ZWQgKHRoaXMgc2ltcGxpZmllcyB0aGUgYWxnb3JpdGhtKS4KICAgICMgRWFjaCBsaW5rIGlzIHN0b3JlZCBhcyBhIGxpc3Qgb2YgbGVuZ3RoIHRocmVlOiAgW1BSRVYsIE5FWFQsIEtFWV0uCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgogICAgICAgICcnJ0luaXRpYWxpemUgYW4gb3JkZXJlZCBkaWN0aW9uYXJ5LiAgU2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvcgogICAgICAgIHJlZ3VsYXIgZGljdGlvbmFyaWVzLCBidXQga2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdCByZWNvbW1lbmRlZAogICAgICAgIGJlY2F1c2UgdGhlaXIgaW5zZXJ0aW9uIG9yZGVyIGlzIGFyYml0cmFyeS4KCiAgICAgICAgJycnCiAgICAgICAgaWYgbGVuKGFyZ3MpID4gMToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgJWQnICUgbGVuKGFyZ3MpKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fX3Jvb3QKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX19yb290ID0gcm9vdCA9IFtdICAgICAgICAgICAgICAgICAgICAgIyBzZW50aW5lbCBub2RlCiAgICAgICAgICAgIHJvb3RbOl0gPSBbcm9vdCwgcm9vdCwgTm9uZV0KICAgICAgICAgICAgc2VsZi5fX21hcCA9IHt9CiAgICAgICAgc2VsZi5fX3VwZGF0ZSgqYXJncywgKiprd2RzKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlLCBkaWN0X3NldGl0ZW09ZGljdC5fX3NldGl0ZW1fXyk6CiAgICAgICAgJ29kLl9fc2V0aXRlbV9fKGksIHkpIDw9PT4gb2RbaV09eScKICAgICAgICAjIFNldHRpbmcgYSBuZXcgaXRlbSBjcmVhdGVzIGEgbmV3IGxpbmsgd2hpY2ggZ29lcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rZWQKICAgICAgICAjIGxpc3QsIGFuZCB0aGUgaW5oZXJpdGVkIGRpY3Rpb25hcnkgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcga2V5L3ZhbHVlIHBhaXIuCiAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgogICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgbGFzdCA9IHJvb3RbMF0KICAgICAgICAgICAgbGFzdFsxXSA9IHJvb3RbMF0gPSBzZWxmLl9fbWFwW2tleV0gPSBbbGFzdCwgcm9vdCwga2V5XQogICAgICAgIGRpY3Rfc2V0aXRlbShzZWxmLCBrZXksIHZhbHVlKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXksIGRpY3RfZGVsaXRlbT1kaWN0Ll9fZGVsaXRlbV9fKToKICAgICAgICAnb2QuX19kZWxpdGVtX18oeSkgPD09PiBkZWwgb2RbeV0nCiAgICAgICAgIyBEZWxldGluZyBhbiBleGlzdGluZyBpdGVtIHVzZXMgc2VsZi5fX21hcCB0byBmaW5kIHRoZSBsaW5rIHdoaWNoIGlzCiAgICAgICAgIyB0aGVuIHJlbW92ZWQgYnkgdXBkYXRpbmcgdGhlIGxpbmtzIGluIHRoZSBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIG5vZGVzLgogICAgICAgIGRpY3RfZGVsaXRlbShzZWxmLCBrZXkpCiAgICAgICAgbGlua19wcmV2LCBsaW5rX25leHQsIGtleSA9IHNlbGYuX19tYXAucG9wKGtleSkKICAgICAgICBsaW5rX3ByZXZbMV0gPSBsaW5rX25leHQKICAgICAgICBsaW5rX25leHRbMF0gPSBsaW5rX3ByZXYKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgJ29kLl9faXRlcl9fKCkgPD09PiBpdGVyKG9kKScKICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICBjdXJyID0gcm9vdFsxXQogICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IHJvb3Q6CiAgICAgICAgICAgIHlpZWxkIGN1cnJbMl0KICAgICAgICAgICAgY3VyciA9IGN1cnJbMV0KCiAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgogICAgICAgICdvZC5fX3JldmVyc2VkX18oKSA8PT0+IHJldmVyc2VkKG9kKScKICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICBjdXJyID0gcm9vdFswXQogICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IHJvb3Q6CiAgICAgICAgICAgIHlpZWxkIGN1cnJbMl0KICAgICAgICAgICAgY3VyciA9IGN1cnJbMF0KCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgJ29kLmNsZWFyKCkgLT4gTm9uZS4gIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSBvZC4nCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLl9fbWFwLml0ZXJ2YWx1ZXMoKToKICAgICAgICAgICAgICAgIGRlbCBub2RlWzpdCiAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICByb290WzpdID0gW3Jvb3QsIHJvb3QsIE5vbmVdCiAgICAgICAgICAgIHNlbGYuX19tYXAuY2xlYXIoKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGRpY3QuY2xlYXIoc2VsZikKCiAgICBkZWYgcG9waXRlbShzZWxmLCBsYXN0PVRydWUpOgogICAgICAgICcnJ29kLnBvcGl0ZW0oKSAtPiAoaywgdiksIHJldHVybiBhbmQgcmVtb3ZlIGEgKGtleSwgdmFsdWUpIHBhaXIuCiAgICAgICAgUGFpcnMgYXJlIHJldHVybmVkIGluIExJRk8gb3JkZXIgaWYgbGFzdCBpcyB0cnVlIG9yIEZJRk8gb3JkZXIgaWYgZmFsc2UuCgogICAgICAgICcnJwogICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcignZGljdGlvbmFyeSBpcyBlbXB0eScpCiAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgaWYgbGFzdDoKICAgICAgICAgICAgbGluayA9IHJvb3RbMF0KICAgICAgICAgICAgbGlua19wcmV2ID0gbGlua1swXQogICAgICAgICAgICBsaW5rX3ByZXZbMV0gPSByb290CiAgICAgICAgICAgIHJvb3RbMF0gPSBsaW5rX3ByZXYKICAgICAgICBlbHNlOgogICAgICAgICAgICBsaW5rID0gcm9vdFsxXQogICAgICAgICAgICBsaW5rX25leHQgPSBsaW5rWzFdCiAgICAgICAgICAgIHJvb3RbMV0gPSBsaW5rX25leHQKICAgICAgICAgICAgbGlua19uZXh0WzBdID0gcm9vdAogICAgICAgIGtleSA9IGxpbmtbMl0KICAgICAgICBkZWwgc2VsZi5fX21hcFtrZXldCiAgICAgICAgdmFsdWUgPSBkaWN0LnBvcChzZWxmLCBrZXkpCiAgICAgICAgcmV0dXJuIGtleSwgdmFsdWUKCiAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgLS0KCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAnb2Qua2V5cygpIC0+IGxpc3Qgb2Yga2V5cyBpbiBvZCcKICAgICAgICByZXR1cm4gbGlzdChzZWxmKQoKICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgJ29kLnZhbHVlcygpIC0+IGxpc3Qgb2YgdmFsdWVzIGluIG9kJwogICAgICAgIHJldHVybiBbc2VsZltrZXldIGZvciBrZXkgaW4gc2VsZl0KCiAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgJ29kLml0ZW1zKCkgLT4gbGlzdCBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgaW4gb2QnCiAgICAgICAgcmV0dXJuIFsoa2V5LCBzZWxmW2tleV0pIGZvciBrZXkgaW4gc2VsZl0KCiAgICBkZWYgaXRlcmtleXMoc2VsZik6CiAgICAgICAgJ29kLml0ZXJrZXlzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBpbiBvZCcKICAgICAgICByZXR1cm4gaXRlcihzZWxmKQoKICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgogICAgICAgICdvZC5pdGVydmFsdWVzIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBpbiBvZCcKICAgICAgICBmb3IgayBpbiBzZWxmOgogICAgICAgICAgICB5aWVsZCBzZWxmW2tdCgogICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKICAgICAgICAnb2QuaXRlcml0ZW1zIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBpdGVtcyBpbiBvZCcKICAgICAgICBmb3IgayBpbiBzZWxmOgogICAgICAgICAgICB5aWVsZCAoaywgc2VsZltrXSkKCiAgICBkZWYgdXBkYXRlKCphcmdzLCAqKmt3ZHMpOgogICAgICAgICcnJ29kLnVwZGF0ZShFLCAqKkYpIC0+IE5vbmUuICBVcGRhdGUgb2QgZnJvbSBkaWN0L2l0ZXJhYmxlIEUgYW5kIEYuCgogICAgICAgIElmIEUgaXMgYSBkaWN0IGluc3RhbmNlLCBkb2VzOiAgICAgICAgICAgZm9yIGsgaW4gRTogb2Rba10gPSBFW2tdCiAgICAgICAgSWYgRSBoYXMgYSAua2V5cygpIG1ldGhvZCwgZG9lczogICAgICAgICBmb3IgayBpbiBFLmtleXMoKTogb2Rba10gPSBFW2tdCiAgICAgICAgT3IgaWYgRSBpcyBhbiBpdGVyYWJsZSBvZiBpdGVtcywgZG9lczogICBmb3IgaywgdiBpbiBFOiBvZFtrXSA9IHYKICAgICAgICBJbiBlaXRoZXIgY2FzZSwgdGhpcyBpcyBmb2xsb3dlZCBieTogICAgIGZvciBrLCB2IGluIEYuaXRlbXMoKTogb2Rba10gPSB2CgogICAgICAgICcnJwogICAgICAgIGlmIGxlbihhcmdzKSA+IDI6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndXBkYXRlKCkgdGFrZXMgYXQgbW9zdCAyIHBvc2l0aW9uYWwgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50cyAoJWQgZ2l2ZW4pJyAlIChsZW4oYXJncyksKSkKICAgICAgICBlbGlmIG5vdCBhcmdzOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3VwZGF0ZSgpIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnQgKDAgZ2l2ZW4pJykKICAgICAgICBzZWxmID0gYXJnc1swXQogICAgICAgICMgTWFrZSBwcm9ncmVzc2l2ZWx5IHdlYWtlciBhc3N1bXB0aW9ucyBhYm91dCAib3RoZXIiCiAgICAgICAgb3RoZXIgPSAoKQogICAgICAgIGlmIGxlbihhcmdzKSA9PSAyOgogICAgICAgICAgICBvdGhlciA9IGFyZ3NbMV0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkaWN0KToKICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICdrZXlzJyk6CiAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXIua2V5cygpOgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBrd2RzLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCgogICAgX191cGRhdGUgPSB1cGRhdGUgICMgbGV0IHN1YmNsYXNzZXMgb3ZlcnJpZGUgdXBkYXRlIHdpdGhvdXQgYnJlYWtpbmcgX19pbml0X18KCiAgICBfX21hcmtlciA9IG9iamVjdCgpCgogICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9X19tYXJrZXIpOgogICAgICAgICcnJ29kLnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4KICAgICAgICBJZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkLgoKICAgICAgICAnJycKICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltrZXldCiAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgIGlmIGRlZmF1bHQgaXMgc2VsZi5fX21hcmtlcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQogICAgICAgIHJldHVybiBkZWZhdWx0CgogICAgZGVmIHNldGRlZmF1bHQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgICdvZC5zZXRkZWZhdWx0KGtbLGRdKSAtPiBvZC5nZXQoayxkKSwgYWxzbyBzZXQgb2Rba109ZCBpZiBrIG5vdCBpbiBvZCcKICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQogICAgICAgIHNlbGZba2V5XSA9IGRlZmF1bHQKICAgICAgICByZXR1cm4gZGVmYXVsdAoKICAgIGRlZiBfX3JlcHJfXyhzZWxmLCBfcmVwcl9ydW5uaW5nPXt9KToKICAgICAgICAnb2QuX19yZXByX18oKSA8PT0+IHJlcHIob2QpJwogICAgICAgIGNhbGxfa2V5ID0gaWQoc2VsZiksIF9nZXRfaWRlbnQoKQogICAgICAgIGlmIGNhbGxfa2V5IGluIF9yZXByX3J1bm5pbmc6CiAgICAgICAgICAgIHJldHVybiAnLi4uJwogICAgICAgIF9yZXByX3J1bm5pbmdbY2FsbF9rZXldID0gMQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgICAgICByZXR1cm4gJyVzKCknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCkKICAgICAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLml0ZW1zKCkpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZGVsIF9yZXByX3J1bm5pbmdbY2FsbF9rZXldCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgJ1JldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcnCiAgICAgICAgaXRlbXMgPSBbW2ssIHNlbGZba11dIGZvciBrIGluIHNlbGZdCiAgICAgICAgaW5zdF9kaWN0ID0gdmFycyhzZWxmKS5jb3B5KCkKICAgICAgICBmb3IgayBpbiB2YXJzKE9yZGVyZWREaWN0KCkpOgogICAgICAgICAgICBpbnN0X2RpY3QucG9wKGssIE5vbmUpCiAgICAgICAgaWYgaW5zdF9kaWN0OgogICAgICAgICAgICByZXR1cm4gKHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKSwgaW5zdF9kaWN0KQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCkKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICAnb2QuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIG9kJwogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21rZXlzKGNscywgaXRlcmFibGUsIHZhbHVlPU5vbmUpOgogICAgICAgICcnJ09ELmZyb21rZXlzKFNbLCB2XSkgLT4gTmV3IG9yZGVyZWQgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSBTCiAgICAgICAgYW5kIHZhbHVlcyBlcXVhbCB0byB2ICh3aGljaCBkZWZhdWx0cyB0byBOb25lKS4KCiAgICAgICAgJycnCiAgICAgICAgZCA9IGNscygpCiAgICAgICAgZm9yIGtleSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKICAgICAgICByZXR1cm4gZAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICcnJ29kLl9fZXFfXyh5KSA8PT0+IG9kPT15LiAgQ29tcGFyaXNvbiB0byBhbm90aGVyIE9EIGlzIG9yZGVyLXNlbnNpdGl2ZQogICAgICAgIHdoaWxlIGNvbXBhcmlzb24gdG8gYSByZWd1bGFyIG1hcHBpbmcgaXMgb3JkZXItaW5zZW5zaXRpdmUuCgogICAgICAgICcnJwogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9yZGVyZWREaWN0KToKICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmKT09bGVuKG90aGVyKSBhbmQgc2VsZi5pdGVtcygpID09IG90aGVyLml0ZW1zKCkKICAgICAgICByZXR1cm4gZGljdC5fX2VxX18oc2VsZiwgb3RoZXIpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgIyAtLSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIG9ubHkgdXNlZCBpbiBQeXRob24gMi43IC0tCgogICAgZGVmIHZpZXdrZXlzKHNlbGYpOgogICAgICAgICJvZC52aWV3a2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyBrZXlzIgogICAgICAgIHJldHVybiBLZXlzVmlldyhzZWxmKQoKICAgIGRlZiB2aWV3dmFsdWVzKHNlbGYpOgogICAgICAgICJvZC52aWV3dmFsdWVzKCkgLT4gYW4gb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyB2YWx1ZXMiCiAgICAgICAgcmV0dXJuIFZhbHVlc1ZpZXcoc2VsZikKCiAgICBkZWYgdmlld2l0ZW1zKHNlbGYpOgogICAgICAgICJvZC52aWV3aXRlbXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3MgaXRlbXMiCiAgICAgICAgcmV0dXJuIEl0ZW1zVmlldyhzZWxmKQpQSwMEFAAAAAAAAAAhAJlYTVqSdQAAknUAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc2l4LnB5IiIiVXRpbGl0aWVzIGZvciB3cml0aW5nIGNvZGUgdGhhdCBydW5zIG9uIFB5dGhvbiAyIGFuZCAzIiIiCgojIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEJlbmphbWluIFBldGVyc29uCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKIyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQojIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCl9fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24gPGJlbmphbWluQHB5dGhvbi5vcmc+IgpfX3ZlcnNpb25fXyA9ICIxLjEwLjAiCgoKIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzClBZMzQgPSBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPj0gKDMsIDQpCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICBpbnRlZ2VyX3R5cGVzID0gaW50LAogICAgY2xhc3NfdHlwZXMgPSB0eXBlLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBiaW5hcnlfdHlwZSA9IGJ5dGVzCgogICAgTUFYU0laRSA9IHN5cy5tYXhzaXplCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCiAgICBjbGFzc190eXBlcyA9ICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBiaW5hcnlfdHlwZSA9IHN0cgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJqYXZhIik6CiAgICAgICAgIyBKeXRob24gYWx3YXlzIHVzZXMgMzIgYml0cy4KICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICBlbHNlOgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0byBoYXZlIHNpemVvZihsb25nKSAhPSBzaXplb2YoUHlfc3NpemVfdCkuCiAgICAgICAgY2xhc3MgWChvYmplY3QpOgoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMSA8PCAzMQogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuKFgoKSkKICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIyAzMi1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgNjQtYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgNjMpIC0gMSkKICAgICAgICBkZWwgWAoKCmRlZiBfYWRkX2RvYyhmdW5jLCBkb2MpOgogICAgIiIiQWRkIGRvY3VtZW50YXRpb24gdG8gYSBmdW5jdGlvbi4iIiIKICAgIGZ1bmMuX19kb2NfXyA9IGRvYwoKCmRlZiBfaW1wb3J0X21vZHVsZShuYW1lKToKICAgICIiIkltcG9ydCBtb2R1bGUsIHJldHVybmluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBsYXN0IGRvdC4iIiIKICAgIF9faW1wb3J0X18obmFtZSkKICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQoKCmNsYXNzIF9MYXp5RGVzY3Iob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgdHApOgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHNldGF0dHIob2JqLCBzZWxmLm5hbWUsIHJlc3VsdCkgICMgSW52b2tlcyBfX3NldF9fLgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBUaGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBhdm9pZHMgcnVubmluZyB0aGlzIGFnYWluIGJ5CiAgICAgICAgICAgICMgcmVtb3ZpbmcgdGhpcyBkZXNjcmlwdG9yLgogICAgICAgICAgICBkZWxhdHRyKG9iai5fX2NsYXNzX18sIHNlbGYubmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTW92ZWRNb2R1bGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZCwgbmV3PU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkTW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXcgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGQKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICBfbW9kdWxlID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9tb2R1bGUsIGF0dHIpCiAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3VwZXIoX0xhenlNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5fX2RvY19fID0gc2VsZi5fX2NsYXNzX18uX19kb2NfXwoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIGF0dHJzID0gWyJfX2RvY19fIiwgIl9fbmFtZV9fIl0KICAgICAgICBhdHRycyArPSBbYXR0ci5uYW1lIGZvciBhdHRyIGluIHNlbGYuX21vdmVkX2F0dHJpYnV0ZXNdCiAgICAgICAgcmV0dXJuIGF0dHJzCgogICAgIyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICBfbW92ZWRfYXR0cmlidXRlcyA9IFtdCgoKY2xhc3MgTW92ZWRBdHRyaWJ1dGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZF9tb2QsIG5ld19tb2QsIG9sZF9hdHRyPU5vbmUsIG5ld19hdHRyPU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkQXR0cmlidXRlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3X21vZCBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3X21vZCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXdfbW9kCiAgICAgICAgICAgIGlmIG5ld19hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG9sZF9hdHRyCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG5ld19hdHRyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGRfbW9kCiAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvbGRfYXR0ciA9IG5hbWUKICAgICAgICAgICAgc2VsZi5hdHRyID0gb2xkX2F0dHIKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgbW9kdWxlID0gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCiAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBzZWxmLmF0dHIpCgoKY2xhc3MgX1NpeE1ldGFQYXRoSW1wb3J0ZXIob2JqZWN0KToKCiAgICAiIiIKICAgIEEgbWV0YSBwYXRoIGltcG9ydGVyIHRvIGltcG9ydCBzaXgubW92ZXMgYW5kIGl0cyBzdWJtb2R1bGVzLgoKICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFBFUDMwMiBmaW5kZXIgYW5kIGxvYWRlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAgIHdpdGggUHl0aG9uIDIuNSBhbmQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG9mIFB5dGhvbjMKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXhfbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IHNpeF9tb2R1bGVfbmFtZQogICAgICAgIHNlbGYua25vd25fbW9kdWxlcyA9IHt9CgogICAgZGVmIF9hZGRfbW9kdWxlKHNlbGYsIG1vZCwgKmZ1bGxuYW1lcyk6CiAgICAgICAgZm9yIGZ1bGxuYW1lIGluIGZ1bGxuYW1lczoKICAgICAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXSA9IG1vZAoKICAgIGRlZiBfZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5rbm93bl9tb2R1bGVzOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgbG9hZGVyIGRvZXMgbm90IGtub3cgbW9kdWxlICIgKyBmdWxsbmFtZSkKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgcmVsb2FkCiAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBtb2QgPSBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkKICAgICAgICBpZiBpc2luc3RhbmNlKG1vZCwgTW92ZWRNb2R1bGUpOgogICAgICAgICAgICBtb2QgPSBtb2QuX3Jlc29sdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRydWUsIGlmIHRoZSBuYW1lZCBtb2R1bGUgaXMgYSBwYWNrYWdlLgoKICAgICAgICBXZSBuZWVkIHRoaXMgbWV0aG9kIHRvIGdldCBjb3JyZWN0IHNwZWMgb2JqZWN0cyB3aXRoCiAgICAgICAgUHl0aG9uIDMuNCAoc2VlIFBFUDQ1MSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSksICJfX3BhdGhfXyIpCgogICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiJSZXR1cm4gTm9uZQoKICAgICAgICBSZXF1aXJlZCwgaWYgaXNfcGFja2FnZSBpcyBpbXBsZW1lbnRlZCIiIgogICAgICAgIHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSAgIyBldmVudHVhbGx5IHJhaXNlcyBJbXBvcnRFcnJvcgogICAgICAgIHJldHVybiBOb25lCiAgICBnZXRfc291cmNlID0gZ2V0X2NvZGUgICMgc2FtZSBhcyBnZXRfY29kZQoKX2ltcG9ydGVyID0gX1NpeE1ldGFQYXRoSW1wb3J0ZXIoX19uYW1lX18pCgoKY2xhc3MgX01vdmVkSXRlbXMoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQoKCl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImNTdHJpbmdJTyIsICJjU3RyaW5nSU8iLCAiaW8iLCAiU3RyaW5nSU8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXIiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImlmaWx0ZXIiLCAiZmlsdGVyIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyZmFsc2UiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpZmlsdGVyZmFsc2UiLCAiZmlsdGVyZmFsc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnB1dCIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJyYXdfaW5wdXQiLCAiaW5wdXQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnRlcm4iLCAiX19idWlsdGluX18iLCAic3lzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgibWFwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpbWFwIiwgIm1hcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZCIsICJvcyIsICJvcyIsICJnZXRjd2R1IiwgImdldGN3ZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZGIiLCAib3MiLCAib3MiLCAiZ2V0Y3dkIiwgImdldGN3ZGIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWxvYWRfbW9kdWxlIiwgIl9fYnVpbHRpbl9fIiwgImltcG9ydGxpYiIgaWYgUFkzNCBlbHNlICJpbXAiLCAicmVsb2FkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVkdWNlIiwgIl9fYnVpbHRpbl9fIiwgImZ1bmN0b29scyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNobGV4X3F1b3RlIiwgInBpcGVzIiwgInNobGV4IiwgInF1b3RlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3RyaW5nSU8iLCAiU3RyaW5nSU8iLCAiaW8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyRGljdCIsICJVc2VyRGljdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJMaXN0IiwgIlVzZXJMaXN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlclN0cmluZyIsICJVc2VyU3RyaW5nIiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgieHJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaXppcCIsICJ6aXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXBfbG9uZ2VzdCIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgIml6aXBfbG9uZ2VzdCIsICJ6aXBfbG9uZ2VzdCIpLAogICAgTW92ZWRNb2R1bGUoImJ1aWx0aW5zIiwgIl9fYnVpbHRpbl9fIiksCiAgICBNb3ZlZE1vZHVsZSgiY29uZmlncGFyc2VyIiwgIkNvbmZpZ1BhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImNvcHlyZWciLCAiY29weV9yZWciKSwKICAgIE1vdmVkTW9kdWxlKCJkYm1fZ251IiwgImdkYm0iLCAiZGJtLmdudSIpLAogICAgTW92ZWRNb2R1bGUoIl9kdW1teV90aHJlYWQiLCAiZHVtbXlfdGhyZWFkIiwgIl9kdW1teV90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZWphciIsICJjb29raWVsaWIiLCAiaHR0cC5jb29raWVqYXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZXMiLCAiQ29va2llIiwgImh0dHAuY29va2llcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfZW50aXRpZXMiLCAiaHRtbGVudGl0eWRlZnMiLCAiaHRtbC5lbnRpdGllcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfcGFyc2VyIiwgIkhUTUxQYXJzZXIiLCAiaHRtbC5wYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2NsaWVudCIsICJodHRwbGliIiwgImh0dHAuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU11bHRpcGFydCIsICJlbWFpbC5taW1lLm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbm9ubXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVOb25NdWx0aXBhcnQiLCAiZW1haWwubWltZS5ub25tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX3RleHQiLCAiZW1haWwuTUlNRVRleHQiLCAiZW1haWwubWltZS50ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9iYXNlIiwgImVtYWlsLk1JTUVCYXNlIiwgImVtYWlsLm1pbWUuYmFzZSIpLAogICAgTW92ZWRNb2R1bGUoIkJhc2VIVFRQU2VydmVyIiwgIkJhc2VIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiQ0dJSFRUUFNlcnZlciIsICJDR0lIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiU2ltcGxlSFRUUFNlcnZlciIsICJTaW1wbGVIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiY1BpY2tsZSIsICJjUGlja2xlIiwgInBpY2tsZSIpLAogICAgTW92ZWRNb2R1bGUoInF1ZXVlIiwgIlF1ZXVlIiksCiAgICBNb3ZlZE1vZHVsZSgicmVwcmxpYiIsICJyZXByIiksCiAgICBNb3ZlZE1vZHVsZSgic29ja2V0c2VydmVyIiwgIlNvY2tldFNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIl90aHJlYWQiLCAidGhyZWFkIiwgIl90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyIiwgIlRraW50ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RpYWxvZyIsICJEaWFsb2ciLCAidGtpbnRlci5kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZpbGVkaWFsb2ciLCAiRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Njcm9sbGVkdGV4dCIsICJTY3JvbGxlZFRleHQiLCAidGtpbnRlci5zY3JvbGxlZHRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3NpbXBsZWRpYWxvZyIsICJTaW1wbGVEaWFsb2ciLCAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RpeCIsICJUaXgiLCAidGtpbnRlci50aXgiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3R0ayIsICJ0dGsiLCAidGtpbnRlci50dGsiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbnN0YW50cyIsICJUa2NvbnN0YW50cyIsICJ0a2ludGVyLmNvbnN0YW50cyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZG5kIiwgIlRrZG5kIiwgInRraW50ZXIuZG5kIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb2xvcmNob29zZXIiLCAidGtDb2xvckNob29zZXIiLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29sb3JjaG9vc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb21tb25kaWFsb2ciLCAidGtDb21tb25EaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29tbW9uZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a2ZpbGVkaWFsb2ciLCAidGtGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZm9udCIsICJ0a0ZvbnQiLCAidGtpbnRlci5mb250IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9tZXNzYWdlYm94IiwgInRrTWVzc2FnZUJveCIsICJ0a2ludGVyLm1lc3NhZ2Vib3giKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Rrc2ltcGxlZGlhbG9nIiwgInRrU2ltcGxlRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9wYXJzZSIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX2Vycm9yIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9lcnJvciIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9yb2JvdHBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfY2xpZW50IiwgInhtbHJwY2xpYiIsICJ4bWxycGMuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX3NlcnZlciIsICJTaW1wbGVYTUxSUENTZXJ2ZXIiLCAieG1scnBjLnNlcnZlciIpLApdCiMgQWRkIHdpbmRvd3Mgc3BlY2lmaWMgbW9kdWxlcy4KaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICBfbW92ZWRfYXR0cmlidXRlcyArPSBbCiAgICAgICAgTW92ZWRNb2R1bGUoIndpbnJlZyIsICJfd2lucmVnIiksCiAgICBdCgpmb3IgYXR0ciBpbiBfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIGF0dHIubmFtZSwgYXR0cikKICAgIGlmIGlzaW5zdGFuY2UoYXR0ciwgTW92ZWRNb2R1bGUpOgogICAgICAgIF9pbXBvcnRlci5fYWRkX21vZHVsZShhdHRyLCAibW92ZXMuIiArIGF0dHIubmFtZSkKZGVsIGF0dHIKCl9Nb3ZlZEl0ZW1zLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX21vdmVkX2F0dHJpYnV0ZXMKCm1vdmVzID0gX01vdmVkSXRlbXMoX19uYW1lX18gKyAiLm1vdmVzIikKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKG1vdmVzLCAibW92ZXMiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3BhcnNlIiIiCgoKX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlBhcnNlUmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlNwbGl0UmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzbCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxkZWZyYWciLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsam9pbiIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxwYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxzcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVuc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZW5jb2RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHF1ZXJ5IiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHRhZyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR1c2VyIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX2ZyYWdtZW50IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfbmV0bG9jIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcGFyYW1zIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcXVlcnkiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19yZWxhdGl2ZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcGFyc2UiLCAibW92ZXMudXJsbGliLnBhcnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9lcnJvciIiIgoKCl91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNvbnRlbnRUb29TaG9ydEVycm9yIiwgInVybGxpYiIsICJ1cmxsaWIuZXJyb3IiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIuZXJyb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfZXJyb3IiLCAibW92ZXMudXJsbGliLmVycm9yIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JlcXVlc3QiIiIKCgpfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxvcGVuIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnN0YWxsX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYnVpbGRfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXRobmFtZTJ1cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsMnBhdGhuYW1lIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldHByb3hpZXMiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUmVxdWVzdCIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiT3BlbmVyRGlyZWN0b3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUmVkaXJlY3RIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQ29va2llUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkJhc2VIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eURpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFNIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGaWxlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ2FjaGVGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVbmtub3duSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxyZXRyaWV2ZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxjbGVhbnVwIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGYW5jeVVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwcm94eV9ieXBhc3MiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXF1ZXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JlcXVlc3QiLCAibW92ZXMudXJsbGliLnJlcXVlc3QiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3Jlc3BvbnNlIiIiCgoKX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGJhc2UiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGNsb3NlaG9vayIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mbyIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mb3VybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlc3BvbnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3Jlc3BvbnNlIiwgIm1vdmVzLnVybGxpYi5yZXNwb25zZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiIiIKCgpfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUm9ib3RGaWxlUGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIsICJtb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgICIiIkNyZWF0ZSBhIHNpeC5tb3Zlcy51cmxsaWIgbmFtZXNwYWNlIHRoYXQgcmVzZW1ibGVzIHRoZSBQeXRob24gMyBuYW1lc3BhY2UiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCiAgICBwYXJzZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3BhcnNlIikKICAgIGVycm9yID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfZXJyb3IiKQogICAgcmVxdWVzdCA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JlcXVlc3QiKQogICAgcmVzcG9uc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXNwb25zZSIpCiAgICByb2JvdHBhcnNlciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gWydwYXJzZScsICdlcnJvcicsICdyZXF1ZXN0JywgJ3Jlc3BvbnNlJywgJ3JvYm90cGFyc2VyJ10KCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYihfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliIikKCgpkZWYgYWRkX21vdmUobW92ZSk6CiAgICAiIiJBZGQgYW4gaXRlbSB0byBzaXgubW92ZXMuIiIiCiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBtb3ZlLm5hbWUsIG1vdmUpCgoKZGVmIHJlbW92ZV9tb3ZlKG5hbWUpOgogICAgIiIiUmVtb3ZlIGl0ZW0gZnJvbSBzaXgubW92ZXMuIiIiCiAgICB0cnk6CiAgICAgICAgZGVsYXR0cihfTW92ZWRJdGVtcywgbmFtZSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBtb3Zlcy5fX2RpY3RfX1tuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIm5vIHN1Y2ggbW92ZSwgJXIiICUgKG5hbWUsKSkKCgppZiBQWTM6CiAgICBfbWV0aF9mdW5jID0gIl9fZnVuY19fIgogICAgX21ldGhfc2VsZiA9ICJfX3NlbGZfXyIKCiAgICBfZnVuY19jbG9zdXJlID0gIl9fY2xvc3VyZV9fIgogICAgX2Z1bmNfY29kZSA9ICJfX2NvZGVfXyIKICAgIF9mdW5jX2RlZmF1bHRzID0gIl9fZGVmYXVsdHNfXyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiX19nbG9iYWxzX18iCmVsc2U6CiAgICBfbWV0aF9mdW5jID0gImltX2Z1bmMiCiAgICBfbWV0aF9zZWxmID0gImltX3NlbGYiCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJmdW5jX2Nsb3N1cmUiCiAgICBfZnVuY19jb2RlID0gImZ1bmNfY29kZSIKICAgIF9mdW5jX2RlZmF1bHRzID0gImZ1bmNfZGVmYXVsdHMiCiAgICBfZnVuY19nbG9iYWxzID0gImZ1bmNfZ2xvYmFscyIKCgp0cnk6CiAgICBhZHZhbmNlX2l0ZXJhdG9yID0gbmV4dApleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGFkdmFuY2VfaXRlcmF0b3IoaXQpOgogICAgICAgIHJldHVybiBpdC5uZXh0KCkKbmV4dCA9IGFkdmFuY2VfaXRlcmF0b3IKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gYW55KCJfX2NhbGxfXyIgaW4ga2xhc3MuX19kaWN0X18gZm9yIGtsYXNzIGluIHR5cGUob2JqKS5fX21yb19fKQoKCmlmIFBZMzoKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZAoKICAgIGNyZWF0ZV9ib3VuZF9tZXRob2QgPSB0eXBlcy5NZXRob2RUeXBlCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiBmdW5jCgogICAgSXRlcmF0b3IgPSBvYmplY3QKZWxzZToKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZC5pbV9mdW5jCgogICAgZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoZnVuYywgb2JqKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBvYmosIG9iai5fX2NsYXNzX18pCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIE5vbmUsIGNscykKCiAgICBjbGFzcyBJdGVyYXRvcihvYmplY3QpOgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX19uZXh0X18oc2VsZikKCiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCl9hZGRfZG9jKGdldF91bmJvdW5kX2Z1bmN0aW9uLAogICAgICAgICAiIiJHZXQgdGhlIGZ1bmN0aW9uIG91dCBvZiBhIHBvc3NpYmx5IHVuYm91bmQgZnVuY3Rpb24iIiIpCgoKZ2V0X21ldGhvZF9mdW5jdGlvbiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfZnVuYykKZ2V0X21ldGhvZF9zZWxmID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9zZWxmKQpnZXRfZnVuY3Rpb25fY2xvc3VyZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY2xvc3VyZSkKZ2V0X2Z1bmN0aW9uX2NvZGUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2NvZGUpCmdldF9mdW5jdGlvbl9kZWZhdWx0cyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZGVmYXVsdHMpCmdldF9mdW5jdGlvbl9nbG9iYWxzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19nbG9iYWxzKQoKCmlmIFBZMzoKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmtleXMoKiprdykpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC52YWx1ZXMoKiprdykpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLml0ZW1zKCoqa3cpKQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5saXN0cygqKmt3KSkKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigia2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoIml0ZW1zIikKZWxzZToKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVya2V5cygqKmt3KQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJ2YWx1ZXMoKiprdykKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJpdGVtcygqKmt3KQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmxpc3RzKCoqa3cpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3dmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdpdGVtcyIpCgpfYWRkX2RvYyhpdGVya2V5cywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVydmFsdWVzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcml0ZW1zLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcmxpc3RzLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIFt2YWx1ZXNdKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKCgppZiBQWTM6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoImxhdGluLTEiKQoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiBzCiAgICB1bmljaHIgPSBjaHIKICAgIGltcG9ydCBzdHJ1Y3QKICAgIGludDJieXRlID0gc3RydWN0LlN0cnVjdCgiPkIiKS5wYWNrCiAgICBkZWwgc3RydWN0CiAgICBieXRlMmludCA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCkKICAgIGluZGV4Ynl0ZXMgPSBvcGVyYXRvci5nZXRpdGVtCiAgICBpdGVyYnl0ZXMgPSBpdGVyCiAgICBpbXBvcnQgaW8KICAgIFN0cmluZ0lPID0gaW8uU3RyaW5nSU8KICAgIEJ5dGVzSU8gPSBpby5CeXRlc0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRDb3VudEVxdWFsIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8PSAxOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCiAgICBlbHNlOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXgiCmVsc2U6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcwogICAgIyBXb3JrYXJvdW5kIGZvciBzdGFuZGFsb25lIGJhY2tzbGFzaAoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiB1bmljb2RlKHMucmVwbGFjZShyJ1xcJywgcidcXFxcJyksICJ1bmljb2RlX2VzY2FwZSIpCiAgICB1bmljaHIgPSB1bmljaHIKICAgIGludDJieXRlID0gY2hyCgogICAgZGVmIGJ5dGUyaW50KGJzKToKICAgICAgICByZXR1cm4gb3JkKGJzWzBdKQoKICAgIGRlZiBpbmRleGJ5dGVzKGJ1ZiwgaSk6CiAgICAgICAgcmV0dXJuIG9yZChidWZbaV0pCiAgICBpdGVyYnl0ZXMgPSBmdW5jdG9vbHMucGFydGlhbChpdGVydG9vbHMuaW1hcCwgb3JkKQogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBTdHJpbmdJTyA9IEJ5dGVzSU8gPSBTdHJpbmdJTy5TdHJpbmdJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0SXRlbXNFcXVhbCIKICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKX2FkZF9kb2MoYiwgIiIiQnl0ZSBsaXRlcmFsIiIiKQpfYWRkX2RvYyh1LCAiIiJUZXh0IGxpdGVyYWwiIiIpCgoKZGVmIGFzc2VydENvdW50RXF1YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRDb3VudEVxdWFsKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmFpc2VzUmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmlmIFBZMzoKICAgIGV4ZWNfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgImV4ZWMiKQoKICAgIGRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgdmFsdWUgPSB0cCgpCiAgICAgICAgaWYgdmFsdWUuX190cmFjZWJhY2tfXyBpcyBub3QgdGI6CiAgICAgICAgICAgIHJhaXNlIHZhbHVlLndpdGhfdHJhY2ViYWNrKHRiKQogICAgICAgIHJhaXNlIHZhbHVlCgplbHNlOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oIiIiZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGIKIiIiKQoKCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIGlmIGZyb21fdmFsdWUgaXMgTm9uZToKICAgICAgICByYWlzZSB2YWx1ZQogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsc2U6CiAgICBkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICAgICAgcmFpc2UgdmFsdWUKCgpwcmludF8gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAicHJpbnQiLCBOb25lKQppZiBwcmludF8gaXMgTm9uZToKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJUaGUgbmV3LXN0eWxlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMi40IGFuZCAyLjUuIiIiCiAgICAgICAgZnAgPSBrd2FyZ3MucG9wKCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBpZiBmcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmIHdyaXRlKGRhdGEpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgIyBJZiB0aGUgZmlsZSBoYXMgYW4gZW5jb2RpbmcsIGVuY29kZSB1bmljb2RlIHdpdGggaXQuCiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKGZwLCBmaWxlKSBhbmQKICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGZwLmVuY29kaW5nIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGVycm9ycyA9IGdldGF0dHIoZnAsICJlcnJvcnMiLCBOb25lKQogICAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gInN0cmljdCIKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShmcC5lbmNvZGluZywgZXJyb3JzKQogICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgIHdhbnRfdW5pY29kZSA9IEZhbHNlCiAgICAgICAgc2VwID0ga3dhcmdzLnBvcCgic2VwIiwgTm9uZSkKICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VwLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXAsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGVuZCA9IGt3YXJncy5wb3AoImVuZCIsIE5vbmUpCiAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVuZCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZW5kLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJlbmQgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcmludCgpIikKICAgICAgICBpZiBub3Qgd2FudF91bmljb2RlOgogICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgd2FudF91bmljb2RlOgogICAgICAgICAgICBuZXdsaW5lID0gdW5pY29kZSgiXG4iKQogICAgICAgICAgICBzcGFjZSA9IHVuaWNvZGUoIiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ld2xpbmUgPSAiXG4iCiAgICAgICAgICAgIHNwYWNlID0gIiAiCiAgICAgICAgaWYgc2VwIGlzIE5vbmU6CiAgICAgICAgICAgIHNlcCA9IHNwYWNlCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZCA9IG5ld2xpbmUKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgaToKICAgICAgICAgICAgICAgIHdyaXRlKHNlcCkKICAgICAgICAgICAgd3JpdGUoYXJnKQogICAgICAgIHdyaXRlKGVuZCkKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgMyk6CiAgICBfcHJpbnQgPSBwcmludF8KCiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZnAgPSBrd2FyZ3MuZ2V0KCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBmbHVzaCA9IGt3YXJncy5wb3AoImZsdXNoIiwgRmFsc2UpCiAgICAgICAgX3ByaW50KCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBmbHVzaCBhbmQgZnAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZwLmZsdXNoKCkKCl9hZGRfZG9jKHJlcmFpc2UsICIiIlJlcmFpc2UgYW4gZXhjZXB0aW9uLiIiIikKCmlmIHN5cy52ZXJzaW9uX2luZm9bMDoyXSA8ICgzLCA0KToKICAgIGRlZiB3cmFwcyh3cmFwcGVkLCBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgIGRlZiB3cmFwcGVyKGYpOgogICAgICAgICAgICBmID0gZnVuY3Rvb2xzLndyYXBzKHdyYXBwZWQsIGFzc2lnbmVkLCB1cGRhdGVkKShmKQogICAgICAgICAgICBmLl9fd3JhcHBlZF9fID0gd3JhcHBlZAogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIHJldHVybiB3cmFwcGVyCmVsc2U6CiAgICB3cmFwcyA9IGZ1bmN0b29scy53cmFwcwoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgoKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQoKCmRlZiBhZGRfbWV0YWNsYXNzKG1ldGFjbGFzcyk6CiAgICAiIiJDbGFzcyBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgIGRlZiB3cmFwcGVyKGNscyk6CiAgICAgICAgb3JpZ192YXJzID0gY2xzLl9fZGljdF9fLmNvcHkoKQogICAgICAgIHNsb3RzID0gb3JpZ192YXJzLmdldCgnX19zbG90c19fJykKICAgICAgICBpZiBzbG90cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgc3RyKToKICAgICAgICAgICAgICAgIHNsb3RzID0gW3Nsb3RzXQogICAgICAgICAgICBmb3Igc2xvdHNfdmFyIGluIHNsb3RzOgogICAgICAgICAgICAgICAgb3JpZ192YXJzLnBvcChzbG90c192YXIpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX19kaWN0X18nLCBOb25lKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fd2Vha3JlZl9fJywgTm9uZSkKICAgICAgICByZXR1cm4gbWV0YWNsYXNzKGNscy5fX25hbWVfXywgY2xzLl9fYmFzZXNfXywgb3JpZ192YXJzKQogICAgcmV0dXJuIHdyYXBwZXIKCgpkZWYgcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlKGtsYXNzKToKICAgICIiIgogICAgQSBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIF9fdW5pY29kZV9fIGFuZCBfX3N0cl9fIG1ldGhvZHMgdW5kZXIgUHl0aG9uIDIuCiAgICBVbmRlciBQeXRob24gMyBpdCBkb2VzIG5vdGhpbmcuCgogICAgVG8gc3VwcG9ydCBQeXRob24gMiBhbmQgMyB3aXRoIGEgc2luZ2xlIGNvZGUgYmFzZSwgZGVmaW5lIGEgX19zdHJfXyBtZXRob2QKICAgIHJldHVybmluZyB0ZXh0IGFuZCBhcHBseSB0aGlzIGRlY29yYXRvciB0byB0aGUgY2xhc3MuCiAgICAiIiIKICAgIGlmIFBZMjoKICAgICAgICBpZiAnX19zdHJfXycgbm90IGluIGtsYXNzLl9fZGljdF9fOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJAcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlIGNhbm5vdCBiZSBhcHBsaWVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYmVjYXVzZSBpdCBkb2Vzbid0IGRlZmluZSBfX3N0cl9fKCkuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18pCiAgICAgICAga2xhc3MuX191bmljb2RlX18gPSBrbGFzcy5fX3N0cl9fCiAgICAgICAga2xhc3MuX19zdHJfXyA9IGxhbWJkYSBzZWxmOiBzZWxmLl9fdW5pY29kZV9fKCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXR1cm4ga2xhc3MKCgojIENvbXBsZXRlIHRoZSBtb3ZlcyBpbXBsZW1lbnRhdGlvbi4KIyBUaGlzIGNvZGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZHVsZSB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZGluZy4KIyBUdXJuIHRoaXMgbW9kdWxlIGludG8gYSBwYWNrYWdlLgpfX3BhdGhfXyA9IFtdICAjIHJlcXVpcmVkIGZvciBQRVAgMzAyIGFuZCBQRVAgNDUxCl9fcGFja2FnZV9fID0gX19uYW1lX18gICMgc2VlIFBFUCAzNjYgQFJlc2VydmVkQXNzaWdubWVudAppZiBnbG9iYWxzKCkuZ2V0KCJfX3NwZWNfXyIpIGlzIG5vdCBOb25lOgogICAgX19zcGVjX18uc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbXSAgIyBQRVAgNDUxIEBVbmRlZmluZWRWYXJpYWJsZQojIFJlbW92ZSBvdGhlciBzaXggbWV0YSBwYXRoIGltcG9ydGVycywgc2luY2UgdGhleSBjYXVzZSBwcm9ibGVtcy4gVGhpcyBjYW4KIyBoYXBwZW4gaWYgc2l4IGlzIHJlbW92ZWQgZnJvbSBzeXMubW9kdWxlcyBhbmQgdGhlbiByZWxvYWRlZC4gKFNldHVwdG9vbHMgZG9lcwojIHRoaXMgZm9yIHNvbWUgcmVhc29uLikKaWYgc3lzLm1ldGFfcGF0aDoKICAgIGZvciBpLCBpbXBvcnRlciBpbiBlbnVtZXJhdGUoc3lzLm1ldGFfcGF0aCk6CiAgICAgICAgIyBIZXJlJ3Mgc29tZSByZWFsIG5hc3RpbmVzczogQW5vdGhlciAiaW5zdGFuY2UiIG9mIHRoZSBzaXggbW9kdWxlIG1pZ2h0CiAgICAgICAgIyBiZSBmbG9hdGluZyBhcm91bmQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QgdXNlIGlzaW5zdGFuY2UoKSB0byBjaGVjayBmb3IKICAgICAgICAjIHRoZSBzaXggbWV0YSBwYXRoIGltcG9ydGVyLCBzaW5jZSB0aGUgb3RoZXIgc2l4IGluc3RhbmNlIHdpbGwgaGF2ZQogICAgICAgICMgaW5zZXJ0ZWQgYW4gaW1wb3J0ZXIgd2l0aCBkaWZmZXJlbnQgY2xhc3MuCiAgICAgICAgaWYgKHR5cGUoaW1wb3J0ZXIpLl9fbmFtZV9fID09ICJfU2l4TWV0YVBhdGhJbXBvcnRlciIgYW5kCiAgICAgICAgICAgICAgICBpbXBvcnRlci5uYW1lID09IF9fbmFtZV9fKToKICAgICAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbaV0KICAgICAgICAgICAgYnJlYWsKICAgIGRlbCBpLCBpbXBvcnRlcgojIEZpbmFsbHksIGFkZCB0aGUgaW1wb3J0ZXIgdG8gdGhlIG1ldGEgcGF0aCBpbXBvcnQgaG9vay4Kc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2ltcG9ydGVyKQpQSwMEFAAAAAAAAAAhAPttyuWwAgAAsAIAAFgAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19faW5pdF9fLnB5aW1wb3J0IHN5cwoKdHJ5OgogICAgIyBPdXIgbWF0Y2hfaG9zdG5hbWUgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgMy41J3MsIHNvIHdlIG9ubHkgd2FudCB0bwogICAgIyBpbXBvcnQgdGhlIG1hdGNoX2hvc3RuYW1lIGZ1bmN0aW9uIGlmIGl0J3MgYXQgbGVhc3QgdGhhdCBnb29kLgogICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCA1KToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiRmFsbGJhY2sgdG8gdmVuZG9yZWQgY29kZSIpCgogICAgZnJvbSBzc2wgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IsIG1hdGNoX2hvc3RuYW1lCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICAjIEJhY2twb3J0IG9mIHRoZSBmdW5jdGlvbiBmcm9tIGEgcHlwaSBtb2R1bGUKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IsIG1hdGNoX2hvc3RuYW1lCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgIyBPdXIgdmVuZG9yZWQgY29weQogICAgICAgIGZyb20gLl9pbXBsZW1lbnRhdGlvbiBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvciwgbWF0Y2hfaG9zdG5hbWUKCiMgTm90IG5lZWRlZCwgYnV0IGRvY3VtZW50aW5nIHdoYXQgd2UgcHJvdmlkZS4KX19hbGxfXyA9ICgnQ2VydGlmaWNhdGVFcnJvcicsICdtYXRjaF9ob3N0bmFtZScpClBLAwQUAAAAAAAAACEAtTqPK0YWAABGFgAAXwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX2ltcGxlbWVudGF0aW9uLnB5IiIiVGhlIG1hdGNoX2hvc3RuYW1lKCkgZnVuY3Rpb24gZnJvbSBQeXRob24gMy4zLjMsIGVzc2VudGlhbCB3aGVuIHVzaW5nIFNTTC4iIiIKCiMgTm90ZTogVGhpcyBmaWxlIGlzIHVuZGVyIHRoZSBQU0YgbGljZW5zZSBhcyB0aGUgY29kZSBjb21lcyBmcm9tIHRoZSBweXRob24KIyBzdGRsaWIuICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zL2xpY2Vuc2UuaHRtbAoKaW1wb3J0IHJlCmltcG9ydCBzeXMKCiMgaXBhZGRyZXNzIGhhcyBiZWVuIGJhY2twb3J0ZWQgdG8gMi42KyBpbiBweXBpLiAgSWYgaXQgaXMgaW5zdGFsbGVkIG9uIHRoZQojIHN5c3RlbSwgdXNlIGl0IHRvIGhhbmRsZSBJUEFkZHJlc3MgU2VydmVyQWx0bmFtZXMgKHRoaXMgd2FzIGFkZGVkIGluCiMgcHl0aG9uLTMuNSkgb3RoZXJ3aXNlIG9ubHkgZG8gRE5TIG1hdGNoaW5nLiAgVGhpcyBhbGxvd3MKIyBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvIGNvbnRpbnVlIHRvIGJlIHVzZWQgYWxsIHRoZSB3YXkgYmFjayB0bwojIHB5dGhvbi0yLjQuCnRyeToKICAgIGltcG9ydCBpcGFkZHJlc3MKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaXBhZGRyZXNzID0gTm9uZQoKX192ZXJzaW9uX18gPSAnMy41LjAuMScKCgpjbGFzcyBDZXJ0aWZpY2F0ZUVycm9yKFZhbHVlRXJyb3IpOgogICAgcGFzcwoKCmRlZiBfZG5zbmFtZV9tYXRjaChkbiwgaG9zdG5hbWUsIG1heF93aWxkY2FyZHM9MSk6CiAgICAiIiJNYXRjaGluZyBhY2NvcmRpbmcgdG8gUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMKCiAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MTI1I3NlY3Rpb24tNi40LjMKICAgICIiIgogICAgcGF0cyA9IFtdCiAgICBpZiBub3QgZG46CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBQb3J0ZWQgZnJvbSBweXRob24zLXN5bnRheDoKICAgICMgbGVmdG1vc3QsICpyZW1haW5kZXIgPSBkbi5zcGxpdChyJy4nKQogICAgcGFydHMgPSBkbi5zcGxpdChyJy4nKQogICAgbGVmdG1vc3QgPSBwYXJ0c1swXQogICAgcmVtYWluZGVyID0gcGFydHNbMTpdCgogICAgd2lsZGNhcmRzID0gbGVmdG1vc3QuY291bnQoJyonKQogICAgaWYgd2lsZGNhcmRzID4gbWF4X3dpbGRjYXJkczoKICAgICAgICAjIElzc3VlICMxNzk4MDogYXZvaWQgZGVuaWFscyBvZiBzZXJ2aWNlIGJ5IHJlZnVzaW5nIG1vcmUKICAgICAgICAjIHRoYW4gb25lIHdpbGRjYXJkIHBlciBmcmFnbWVudC4gIEEgc3VydmV5IG9mIGVzdGFibGlzaGVkCiAgICAgICAgIyBwb2xpY3kgYW1vbmcgU1NMIGltcGxlbWVudGF0aW9ucyBzaG93ZWQgaXQgdG8gYmUgYQogICAgICAgICMgcmVhc29uYWJsZSBjaG9pY2UuCiAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigKICAgICAgICAgICAgInRvbyBtYW55IHdpbGRjYXJkcyBpbiBjZXJ0aWZpY2F0ZSBETlMgbmFtZTogIiArIHJlcHIoZG4pKQoKICAgICMgc3BlZWQgdXAgY29tbW9uIGNhc2Ugdy9vIHdpbGRjYXJkcwogICAgaWYgbm90IHdpbGRjYXJkczoKICAgICAgICByZXR1cm4gZG4ubG93ZXIoKSA9PSBob3N0bmFtZS5sb3dlcigpCgogICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAxLgogICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyIGluIHdoaWNoCiAgICAjIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgY29tcHJpc2VzIGEgbGFiZWwgb3RoZXIgdGhhbiB0aGUgbGVmdC1tb3N0IGxhYmVsLgogICAgaWYgbGVmdG1vc3QgPT0gJyonOgogICAgICAgICMgV2hlbiAnKicgaXMgYSBmcmFnbWVudCBieSBpdHNlbGYsIGl0IG1hdGNoZXMgYSBub24tZW1wdHkgZG90bGVzcwogICAgICAgICMgZnJhZ21lbnQuCiAgICAgICAgcGF0cy5hcHBlbmQoJ1teLl0rJykKICAgIGVsaWYgbGVmdG1vc3Quc3RhcnRzd2l0aCgneG4tLScpIG9yIGhvc3RuYW1lLnN0YXJ0c3dpdGgoJ3huLS0nKToKICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDMuCiAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyCiAgICAgICAgIyB3aGVyZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGlzIGVtYmVkZGVkIHdpdGhpbiBhbiBBLWxhYmVsIG9yCiAgICAgICAgIyBVLWxhYmVsIG9mIGFuIGludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lLgogICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkpCiAgICBlbHNlOgogICAgICAgICMgT3RoZXJ3aXNlLCAnKicgbWF0Y2hlcyBhbnkgZG90bGVzcyBzdHJpbmcsIGUuZy4gd3d3KgogICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkucmVwbGFjZShyJ1wqJywgJ1teLl0qJykpCgogICAgIyBhZGQgdGhlIHJlbWFpbmluZyBmcmFnbWVudHMsIGlnbm9yZSBhbnkgd2lsZGNhcmRzCiAgICBmb3IgZnJhZyBpbiByZW1haW5kZXI6CiAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGZyYWcpKQoKICAgIHBhdCA9IHJlLmNvbXBpbGUocidcQScgKyByJ1wuJy5qb2luKHBhdHMpICsgcidcWicsIHJlLklHTk9SRUNBU0UpCiAgICByZXR1cm4gcGF0Lm1hdGNoKGhvc3RuYW1lKQoKCmRlZiBfdG9fdW5pY29kZShvYmopOgogICAgaWYgaXNpbnN0YW5jZShvYmosIHN0cikgYW5kIHN5cy52ZXJzaW9uX2luZm8gPCAoMywpOgogICAgICAgIG9iaiA9IHVuaWNvZGUob2JqLCBlbmNvZGluZz0nYXNjaWknLCBlcnJvcnM9J3N0cmljdCcpCiAgICByZXR1cm4gb2JqCgpkZWYgX2lwYWRkcmVzc19tYXRjaChpcG5hbWUsIGhvc3RfaXApOgogICAgIiIiRXhhY3QgbWF0Y2hpbmcgb2YgSVAgYWRkcmVzc2VzLgoKICAgIFJGQyA2MTI1IGV4cGxpY2l0bHkgZG9lc24ndCBkZWZpbmUgYW4gYWxnb3JpdGhtIGZvciB0aGlzCiAgICAoc2VjdGlvbiAxLjcuMiAtICJPdXQgb2YgU2NvcGUiKS4KICAgICIiIgogICAgIyBPcGVuU1NMIG1heSBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIHRvIGEgc3ViamVjdEFsdE5hbWUncyBJUCBhZGRyZXNzCiAgICAjIERpdmVyZ2VuY2UgZnJvbSB1cHN0cmVhbTogaXBhZGRyZXNzIGNhbid0IGhhbmRsZSBieXRlIHN0cgogICAgaXAgPSBpcGFkZHJlc3MuaXBfYWRkcmVzcyhfdG9fdW5pY29kZShpcG5hbWUpLnJzdHJpcCgpKQogICAgcmV0dXJuIGlwID09IGhvc3RfaXAKCgpkZWYgbWF0Y2hfaG9zdG5hbWUoY2VydCwgaG9zdG5hbWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgKmNlcnQqIChpbiBkZWNvZGVkIGZvcm1hdCBhcyByZXR1cm5lZCBieQogICAgU1NMU29ja2V0LmdldHBlZXJjZXJ0KCkpIG1hdGNoZXMgdGhlICpob3N0bmFtZSouICBSRkMgMjgxOCBhbmQgUkZDIDYxMjUKICAgIHJ1bGVzIGFyZSBmb2xsb3dlZCwgYnV0IElQIGFkZHJlc3NlcyBhcmUgbm90IGFjY2VwdGVkIGZvciAqaG9zdG5hbWUqLgoKICAgIENlcnRpZmljYXRlRXJyb3IgaXMgcmFpc2VkIG9uIGZhaWx1cmUuIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbgogICAgcmV0dXJucyBub3RoaW5nLgogICAgIiIiCiAgICBpZiBub3QgY2VydDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBvciBubyBjZXJ0aWZpY2F0ZSwgbWF0Y2hfaG9zdG5hbWUgbmVlZHMgYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMIHNvY2tldCBvciBTU0wgY29udGV4dCB3aXRoIGVpdGhlciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ0VSVF9PUFRJT05BTCBvciBDRVJUX1JFUVVJUkVEIikKICAgIHRyeToKICAgICAgICAjIERpdmVyZ2VuY2UgZnJvbSB1cHN0cmVhbTogaXBhZGRyZXNzIGNhbid0IGhhbmRsZSBieXRlIHN0cgogICAgICAgIGhvc3RfaXAgPSBpcGFkZHJlc3MuaXBfYWRkcmVzcyhfdG9fdW5pY29kZShob3N0bmFtZSkpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAjIE5vdCBhbiBJUCBhZGRyZXNzIChjb21tb24gY2FzZSkKICAgICAgICBob3N0X2lwID0gTm9uZQogICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICAjIERpdmVyZ2VuY2UgZnJvbSB1cHN0cmVhbTogSGF2ZSB0byBkZWFsIHdpdGggaXBhZGRyZXNzIG5vdCB0YWtpbmcKICAgICAgICAjIGJ5dGUgc3RyaW5ncy4gIGFkZHJlc3NlcyBzaG91bGQgYmUgYWxsIGFzY2lpLCBzbyB3ZSBjb25zaWRlciBpdCBub3QKICAgICAgICAjIGFuIGlwYWRkcmVzcyBpbiB0aGlzIGNhc2UKICAgICAgICBob3N0X2lwID0gTm9uZQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICMgRGl2ZXJnZW5jZSBmcm9tIHVwc3RyZWFtOiBNYWtlIGlwYWRkcmVzcyBsaWJyYXJ5IG9wdGlvbmFsCiAgICAgICAgaWYgaXBhZGRyZXNzIGlzIE5vbmU6CiAgICAgICAgICAgIGhvc3RfaXAgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UKICAgIGRuc25hbWVzID0gW10KICAgIHNhbiA9IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKQogICAgZm9yIGtleSwgdmFsdWUgaW4gc2FuOgogICAgICAgIGlmIGtleSA9PSAnRE5TJzoKICAgICAgICAgICAgaWYgaG9zdF9pcCBpcyBOb25lIGFuZCBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBlbGlmIGtleSA9PSAnSVAgQWRkcmVzcyc6CiAgICAgICAgICAgIGlmIGhvc3RfaXAgaXMgbm90IE5vbmUgYW5kIF9pcGFkZHJlc3NfbWF0Y2godmFsdWUsIGhvc3RfaXApOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgIGlmIG5vdCBkbnNuYW1lczoKICAgICAgICAjIFRoZSBzdWJqZWN0IGlzIG9ubHkgY2hlY2tlZCB3aGVuIHRoZXJlIGlzIG5vIGROU05hbWUgZW50cnkKICAgICAgICAjIGluIHN1YmplY3RBbHROYW1lCiAgICAgICAgZm9yIHN1YiBpbiBjZXJ0LmdldCgnc3ViamVjdCcsICgpKToKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc3ViOgogICAgICAgICAgICAgICAgIyBYWFggYWNjb3JkaW5nIHRvIFJGQyAyODE4LCB0aGUgbW9zdCBzcGVjaWZpYyBDb21tb24gTmFtZQogICAgICAgICAgICAgICAgIyBtdXN0IGJlIHVzZWQuCiAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1vbk5hbWUnOgogICAgICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgIGlmIGxlbihkbnNuYW1lcykgPiAxOgogICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggZWl0aGVyIG9mICVzIgogICAgICAgICAgICAlIChob3N0bmFtZSwgJywgJy5qb2luKG1hcChyZXByLCBkbnNuYW1lcykpKSkKICAgIGVsaWYgbGVuKGRuc25hbWVzKSA9PSAxOgogICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggJXIiCiAgICAgICAgICAgICUgKGhvc3RuYW1lLCBkbnNuYW1lc1swXSkpCiAgICBlbHNlOgogICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoIm5vIGFwcHJvcHJpYXRlIGNvbW1vbk5hbWUgb3IgIgogICAgICAgICAgICAic3ViamVjdEFsdE5hbWUgZmllbGRzIHdlcmUgZm91bmQiKQpQSwMEFAAAAAAAAAAhAPCuGJLZPwAA2T8AAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcG9vbG1hbmFnZXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgbG9nZ2luZwoKZnJvbSAuX2NvbGxlY3Rpb25zIGltcG9ydCBSZWNlbnRseVVzZWRDb250YWluZXIKZnJvbSAuY29ubmVjdGlvbnBvb2wgaW1wb3J0IEhUVFBDb25uZWN0aW9uUG9vbCwgSFRUUFNDb25uZWN0aW9uUG9vbApmcm9tIC5jb25uZWN0aW9ucG9vbCBpbXBvcnQgcG9ydF9ieV9zY2hlbWUKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgTG9jYXRpb25WYWx1ZUVycm9yLCBNYXhSZXRyeUVycm9yLCBQcm94eVNjaGVtZVVua25vd24KZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLnVybGxpYi5wYXJzZSBpbXBvcnQgdXJsam9pbgpmcm9tIC5yZXF1ZXN0IGltcG9ydCBSZXF1ZXN0TWV0aG9kcwpmcm9tIC51dGlsLnVybCBpbXBvcnQgcGFyc2VfdXJsCmZyb20gLnV0aWwucmV0cnkgaW1wb3J0IFJldHJ5CgoKX19hbGxfXyA9IFsnUG9vbE1hbmFnZXInLCAnUHJveHlNYW5hZ2VyJywgJ3Byb3h5X2Zyb21fdXJsJ10KCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKClNTTF9LRVlXT1JEUyA9ICgna2V5X2ZpbGUnLCAnY2VydF9maWxlJywgJ2NlcnRfcmVxcycsICdjYV9jZXJ0cycsCiAgICAgICAgICAgICAgICAnc3NsX3ZlcnNpb24nLCAnY2FfY2VydF9kaXInLCAnc3NsX2NvbnRleHQnKQoKIyBBbGwga25vd24ga2V5d29yZCBhcmd1bWVudHMgdGhhdCBjb3VsZCBiZSBwcm92aWRlZCB0byB0aGUgcG9vbCBtYW5hZ2VyLCBpdHMKIyBwb29scywgb3IgdGhlIHVuZGVybHlpbmcgY29ubmVjdGlvbnMuIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYSBwb29sIGtleS4KX2tleV9maWVsZHMgPSAoCiAgICAna2V5X3NjaGVtZScsICAjIHN0cgogICAgJ2tleV9ob3N0JywgICMgc3RyCiAgICAna2V5X3BvcnQnLCAgIyBpbnQKICAgICdrZXlfdGltZW91dCcsICAjIGludCBvciBmbG9hdCBvciBUaW1lb3V0CiAgICAna2V5X3JldHJpZXMnLCAgIyBpbnQgb3IgUmV0cnkKICAgICdrZXlfc3RyaWN0JywgICMgYm9vbAogICAgJ2tleV9ibG9jaycsICAjIGJvb2wKICAgICdrZXlfc291cmNlX2FkZHJlc3MnLCAgIyBzdHIKICAgICdrZXlfa2V5X2ZpbGUnLCAgIyBzdHIKICAgICdrZXlfY2VydF9maWxlJywgICMgc3RyCiAgICAna2V5X2NlcnRfcmVxcycsICAjIHN0cgogICAgJ2tleV9jYV9jZXJ0cycsICAjIHN0cgogICAgJ2tleV9zc2xfdmVyc2lvbicsICAjIHN0cgogICAgJ2tleV9jYV9jZXJ0X2RpcicsICAjIHN0cgogICAgJ2tleV9zc2xfY29udGV4dCcsICAjIGluc3RhbmNlIG9mIHNzbC5TU0xDb250ZXh0IG9yIHVybGxpYjMudXRpbC5zc2xfLlNTTENvbnRleHQKICAgICdrZXlfbWF4c2l6ZScsICAjIGludAogICAgJ2tleV9oZWFkZXJzJywgICMgZGljdAogICAgJ2tleV9fcHJveHknLCAgIyBwYXJzZWQgcHJveHkgdXJsCiAgICAna2V5X19wcm94eV9oZWFkZXJzJywgICMgZGljdAogICAgJ2tleV9zb2NrZXRfb3B0aW9ucycsICAjIGxpc3Qgb2YgKGxldmVsIChpbnQpLCBvcHRuYW1lIChpbnQpLCB2YWx1ZSAoaW50IG9yIHN0cikpIHR1cGxlcwogICAgJ2tleV9fc29ja3Nfb3B0aW9ucycsICAjIGRpY3QKICAgICdrZXlfYXNzZXJ0X2hvc3RuYW1lJywgICMgYm9vbCBvciBzdHJpbmcKICAgICdrZXlfYXNzZXJ0X2ZpbmdlcnByaW50JywgICMgc3RyCikKCiM6IFRoZSBuYW1lZHR1cGxlIGNsYXNzIHVzZWQgdG8gY29uc3RydWN0IGtleXMgZm9yIHRoZSBjb25uZWN0aW9uIHBvb2wuCiM6IEFsbCBjdXN0b20ga2V5IHNjaGVtZXMgc2hvdWxkIGluY2x1ZGUgdGhlIGZpZWxkcyBpbiB0aGlzIGtleSBhdCBhIG1pbmltdW0uClBvb2xLZXkgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdQb29sS2V5JywgX2tleV9maWVsZHMpCgoKZGVmIF9kZWZhdWx0X2tleV9ub3JtYWxpemVyKGtleV9jbGFzcywgcmVxdWVzdF9jb250ZXh0KToKICAgICIiIgogICAgQ3JlYXRlIGEgcG9vbCBrZXkgb3V0IG9mIGEgcmVxdWVzdCBjb250ZXh0IGRpY3Rpb25hcnkuCgogICAgQWNjb3JkaW5nIHRvIFJGQyAzOTg2LCBib3RoIHRoZSBzY2hlbWUgYW5kIGhvc3QgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCiAgICBUaGVyZWZvcmUsIHRoaXMgZnVuY3Rpb24gbm9ybWFsaXplcyBib3RoIGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlIHBvb2wKICAgIGtleSBmb3IgYW4gSFRUUFMgcmVxdWVzdC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3VyLCBwcm92aWRlCiAgICBhbHRlcm5hdGUgY2FsbGFibGVzIHRvIGBga2V5X2ZuX2J5X3NjaGVtZWBgLgoKICAgIDpwYXJhbSBrZXlfY2xhc3M6CiAgICAgICAgVGhlIGNsYXNzIHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUga2V5LiBUaGlzIHNob3VsZCBiZSBhIG5hbWVkdHVwbGUKICAgICAgICB3aXRoIHRoZSBgYHNjaGVtZWBgIGFuZCBgYGhvc3RgYCBrZXlzIGF0IGEgbWluaW11bS4KICAgIDp0eXBlICBrZXlfY2xhc3M6IG5hbWVkdHVwbGUKICAgIDpwYXJhbSByZXF1ZXN0X2NvbnRleHQ6CiAgICAgICAgQSBkaWN0aW9uYXJ5LWxpa2Ugb2JqZWN0IHRoYXQgY29udGFpbiB0aGUgY29udGV4dCBmb3IgYSByZXF1ZXN0LgogICAgOnR5cGUgIHJlcXVlc3RfY29udGV4dDogZGljdAoKICAgIDpyZXR1cm46IEEgbmFtZWR0dXBsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgY29ubmVjdGlvbiBwb29sIGtleS4KICAgIDpydHlwZTogIFBvb2xLZXkKICAgICIiIgogICAgIyBTaW5jZSB3ZSBtdXRhdGUgdGhlIGRpY3Rpb25hcnksIG1ha2UgYSBjb3B5IGZpcnN0CiAgICBjb250ZXh0ID0gcmVxdWVzdF9jb250ZXh0LmNvcHkoKQogICAgY29udGV4dFsnc2NoZW1lJ10gPSBjb250ZXh0WydzY2hlbWUnXS5sb3dlcigpCiAgICBjb250ZXh0Wydob3N0J10gPSBjb250ZXh0Wydob3N0J10ubG93ZXIoKQoKICAgICMgVGhlc2UgYXJlIGJvdGggZGljdGlvbmFyaWVzIGFuZCBuZWVkIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gZnJvemVuc2V0cwogICAgZm9yIGtleSBpbiAoJ2hlYWRlcnMnLCAnX3Byb3h5X2hlYWRlcnMnLCAnX3NvY2tzX29wdGlvbnMnKToKICAgICAgICBpZiBrZXkgaW4gY29udGV4dCBhbmQgY29udGV4dFtrZXldIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb250ZXh0W2tleV0gPSBmcm96ZW5zZXQoY29udGV4dFtrZXldLml0ZW1zKCkpCgogICAgIyBUaGUgc29ja2V0X29wdGlvbnMga2V5IG1heSBiZSBhIGxpc3QgYW5kIG5lZWRzIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYQogICAgIyB0dXBsZS4KICAgIHNvY2tldF9vcHRzID0gY29udGV4dC5nZXQoJ3NvY2tldF9vcHRpb25zJykKICAgIGlmIHNvY2tldF9vcHRzIGlzIG5vdCBOb25lOgogICAgICAgIGNvbnRleHRbJ3NvY2tldF9vcHRpb25zJ10gPSB0dXBsZShzb2NrZXRfb3B0cykKCiAgICAjIE1hcCB0aGUga3dhcmdzIHRvIHRoZSBuYW1lcyBpbiB0aGUgbmFtZWR0dXBsZSAtIHRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlCiAgICAjIG5hbWVkdHVwbGVzIGNhbid0IGhhdmUgZmllbGRzIHN0YXJ0aW5nIHdpdGggJ18nLgogICAgZm9yIGtleSBpbiBsaXN0KGNvbnRleHQua2V5cygpKToKICAgICAgICBjb250ZXh0WydrZXlfJyArIGtleV0gPSBjb250ZXh0LnBvcChrZXkpCgogICAgIyBEZWZhdWx0IHRvIGBgTm9uZWBgIGZvciBrZXlzIG1pc3NpbmcgZnJvbSB0aGUgY29udGV4dAogICAgZm9yIGZpZWxkIGluIGtleV9jbGFzcy5fZmllbGRzOgogICAgICAgIGlmIGZpZWxkIG5vdCBpbiBjb250ZXh0OgogICAgICAgICAgICBjb250ZXh0W2ZpZWxkXSA9IE5vbmUKCiAgICByZXR1cm4ga2V5X2NsYXNzKCoqY29udGV4dCkKCgojOiBBIGRpY3Rpb25hcnkgdGhhdCBtYXBzIGEgc2NoZW1lIHRvIGEgY2FsbGFibGUgdGhhdCBjcmVhdGVzIGEgcG9vbCBrZXkuCiM6IFRoaXMgY2FuIGJlIHVzZWQgdG8gYWx0ZXIgdGhlIHdheSBwb29sIGtleXMgYXJlIGNvbnN0cnVjdGVkLCBpZiBkZXNpcmVkLgojOiBFYWNoIFBvb2xNYW5hZ2VyIG1ha2VzIGEgY29weSBvZiB0aGlzIGRpY3Rpb25hcnkgc28gdGhleSBjYW4gYmUgY29uZmlndXJlZAojOiBnbG9iYWxseSBoZXJlLCBvciBpbmRpdmlkdWFsbHkgb24gdGhlIGluc3RhbmNlLgprZXlfZm5fYnlfc2NoZW1lID0gewogICAgJ2h0dHAnOiBmdW5jdG9vbHMucGFydGlhbChfZGVmYXVsdF9rZXlfbm9ybWFsaXplciwgUG9vbEtleSksCiAgICAnaHR0cHMnOiBmdW5jdG9vbHMucGFydGlhbChfZGVmYXVsdF9rZXlfbm9ybWFsaXplciwgUG9vbEtleSksCn0KCnBvb2xfY2xhc3Nlc19ieV9zY2hlbWUgPSB7CiAgICAnaHR0cCc6IEhUVFBDb25uZWN0aW9uUG9vbCwKICAgICdodHRwcyc6IEhUVFBTQ29ubmVjdGlvblBvb2wsCn0KCgpjbGFzcyBQb29sTWFuYWdlcihSZXF1ZXN0TWV0aG9kcyk6CiAgICAiIiIKICAgIEFsbG93cyBmb3IgYXJiaXRyYXJ5IHJlcXVlc3RzIHdoaWxlIHRyYW5zcGFyZW50bHkga2VlcGluZyB0cmFjayBvZgogICAgbmVjZXNzYXJ5IGNvbm5lY3Rpb24gcG9vbHMgZm9yIHlvdS4KCiAgICA6cGFyYW0gbnVtX3Bvb2xzOgogICAgICAgIE51bWJlciBvZiBjb25uZWN0aW9uIHBvb2xzIHRvIGNhY2hlIGJlZm9yZSBkaXNjYXJkaW5nIHRoZSBsZWFzdAogICAgICAgIHJlY2VudGx5IHVzZWQgcG9vbC4KCiAgICA6cGFyYW0gaGVhZGVyczoKICAgICAgICBIZWFkZXJzIHRvIGluY2x1ZGUgd2l0aCBhbGwgcmVxdWVzdHMsIHVubGVzcyBvdGhlciBoZWFkZXJzIGFyZSBnaXZlbgogICAgICAgIGV4cGxpY2l0bHkuCgogICAgOnBhcmFtIFxcKipjb25uZWN0aW9uX3Bvb2xfa3c6CiAgICAgICAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNyZWF0ZSBmcmVzaAogICAgICAgIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5Db25uZWN0aW9uUG9vbGAgaW5zdGFuY2VzLgoKICAgIEV4YW1wbGU6OgoKICAgICAgICA+Pj4gbWFuYWdlciA9IFBvb2xNYW5hZ2VyKG51bV9wb29scz0yKQogICAgICAgID4+PiByID0gbWFuYWdlci5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2dvb2dsZS5jb20vJykKICAgICAgICA+Pj4gciA9IG1hbmFnZXIucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9nb29nbGUuY29tL21haWwnKQogICAgICAgID4+PiByID0gbWFuYWdlci5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL3lhaG9vLmNvbS8nKQogICAgICAgID4+PiBsZW4obWFuYWdlci5wb29scykKICAgICAgICAyCgogICAgIiIiCgogICAgcHJveHkgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bV9wb29scz0xMCwgaGVhZGVycz1Ob25lLCAqKmNvbm5lY3Rpb25fcG9vbF9rdyk6CiAgICAgICAgUmVxdWVzdE1ldGhvZHMuX19pbml0X18oc2VsZiwgaGVhZGVycykKICAgICAgICBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdyA9IGNvbm5lY3Rpb25fcG9vbF9rdwogICAgICAgIHNlbGYucG9vbHMgPSBSZWNlbnRseVVzZWRDb250YWluZXIobnVtX3Bvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZV9mdW5jPWxhbWJkYSBwOiBwLmNsb3NlKCkpCgogICAgICAgICMgTG9jYWxseSBzZXQgdGhlIHBvb2wgY2xhc3NlcyBhbmQga2V5cyBzbyBvdGhlciBQb29sTWFuYWdlcnMgY2FuCiAgICAgICAgIyBvdmVycmlkZSB0aGVtLgogICAgICAgIHNlbGYucG9vbF9jbGFzc2VzX2J5X3NjaGVtZSA9IHBvb2xfY2xhc3Nlc19ieV9zY2hlbWUKICAgICAgICBzZWxmLmtleV9mbl9ieV9zY2hlbWUgPSBrZXlfZm5fYnlfc2NoZW1lLmNvcHkoKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CiAgICAgICAgc2VsZi5jbGVhcigpCiAgICAgICAgIyBSZXR1cm4gRmFsc2UgdG8gcmUtcmFpc2UgYW55IHBvdGVudGlhbCBleGNlcHRpb25zCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9uZXdfcG9vbChzZWxmLCBzY2hlbWUsIGhvc3QsIHBvcnQsIHJlcXVlc3RfY29udGV4dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBDcmVhdGUgYSBuZXcgOmNsYXNzOmBDb25uZWN0aW9uUG9vbGAgYmFzZWQgb24gaG9zdCwgcG9ydCwgc2NoZW1lLCBhbmQKICAgICAgICBhbnkgYWRkaXRpb25hbCBwb29sIGtleXdvcmQgYXJndW1lbnRzLgoKICAgICAgICBJZiBgYHJlcXVlc3RfY29udGV4dGBgIGlzIHByb3ZpZGVkLCBpdCBpcyBwcm92aWRlZCBhcyBrZXl3b3JkIGFyZ3VtZW50cwogICAgICAgIHRvIHRoZSBwb29sIGNsYXNzIHVzZWQuIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gYWN0dWFsbHkgY3JlYXRlIHRoZQogICAgICAgIGNvbm5lY3Rpb24gcG9vbHMgaGFuZGVkIG91dCBieSA6bWV0aDpgY29ubmVjdGlvbl9mcm9tX3VybGAgYW5kCiAgICAgICAgY29tcGFuaW9uIG1ldGhvZHMuIEl0IGlzIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gZm9yIGN1c3RvbWl6YXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcG9vbF9jbHMgPSBzZWxmLnBvb2xfY2xhc3Nlc19ieV9zY2hlbWVbc2NoZW1lXQogICAgICAgIGlmIHJlcXVlc3RfY29udGV4dCBpcyBOb25lOgogICAgICAgICAgICByZXF1ZXN0X2NvbnRleHQgPSBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdy5jb3B5KCkKCiAgICAgICAgIyBBbHRob3VnaCB0aGUgY29udGV4dCBoYXMgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gY3JlYXRlIHRoZSBwb29sLAogICAgICAgICMgdGhpcyBmdW5jdGlvbiBoYXMgaGlzdG9yaWNhbGx5IG9ubHkgdXNlZCB0aGUgc2NoZW1lLCBob3N0LCBhbmQgcG9ydAogICAgICAgICMgaW4gdGhlIHBvc2l0aW9uYWwgYXJncy4gV2hlbiBhbiBBUEkgY2hhbmdlIGlzIGFjY2VwdGFibGUgdGhlc2UgY2FuCiAgICAgICAgIyBiZSByZW1vdmVkLgogICAgICAgIGZvciBrZXkgaW4gKCdzY2hlbWUnLCAnaG9zdCcsICdwb3J0Jyk6CiAgICAgICAgICAgIHJlcXVlc3RfY29udGV4dC5wb3Aoa2V5LCBOb25lKQoKICAgICAgICBpZiBzY2hlbWUgPT0gJ2h0dHAnOgogICAgICAgICAgICBmb3Iga3cgaW4gU1NMX0tFWVdPUkRTOgogICAgICAgICAgICAgICAgcmVxdWVzdF9jb250ZXh0LnBvcChrdywgTm9uZSkKCiAgICAgICAgcmV0dXJuIHBvb2xfY2xzKGhvc3QsIHBvcnQsICoqcmVxdWVzdF9jb250ZXh0KQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBFbXB0eSBvdXIgc3RvcmUgb2YgcG9vbHMgYW5kIGRpcmVjdCB0aGVtIGFsbCB0byBjbG9zZS4KCiAgICAgICAgVGhpcyB3aWxsIG5vdCBhZmZlY3QgaW4tZmxpZ2h0IGNvbm5lY3Rpb25zLCBidXQgdGhleSB3aWxsIG5vdCBiZQogICAgICAgIHJlLXVzZWQgYWZ0ZXIgY29tcGxldGlvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnBvb2xzLmNsZWFyKCkKCiAgICBkZWYgY29ubmVjdGlvbl9mcm9tX2hvc3Qoc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBzY2hlbWU9J2h0dHAnLCBwb29sX2t3YXJncz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSA6Y2xhc3M6YENvbm5lY3Rpb25Qb29sYCBiYXNlZCBvbiB0aGUgaG9zdCwgcG9ydCwgYW5kIHNjaGVtZS4KCiAgICAgICAgSWYgYGBwb3J0YGAgaXNuJ3QgZ2l2ZW4sIGl0IHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBgYHNjaGVtZWBgIHVzaW5nCiAgICAgICAgYGB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLnBvcnRfYnlfc2NoZW1lYGAuIElmIGBgcG9vbF9rd2FyZ3NgYCBpcwogICAgICAgIHByb3ZpZGVkLCBpdCBpcyBtZXJnZWQgd2l0aCB0aGUgaW5zdGFuY2UncyBgYGNvbm5lY3Rpb25fcG9vbF9rd2BgCiAgICAgICAgdmFyaWFibGUgYW5kIHVzZWQgdG8gY3JlYXRlIHRoZSBuZXcgY29ubmVjdGlvbiBwb29sLCBpZiBvbmUgaXMKICAgICAgICBuZWVkZWQuCiAgICAgICAgIiIiCgogICAgICAgIGlmIG5vdCBob3N0OgogICAgICAgICAgICByYWlzZSBMb2NhdGlvblZhbHVlRXJyb3IoIk5vIGhvc3Qgc3BlY2lmaWVkLiIpCgogICAgICAgIHJlcXVlc3RfY29udGV4dCA9IHNlbGYuX21lcmdlX3Bvb2xfa3dhcmdzKHBvb2xfa3dhcmdzKQogICAgICAgIHJlcXVlc3RfY29udGV4dFsnc2NoZW1lJ10gPSBzY2hlbWUgb3IgJ2h0dHAnCiAgICAgICAgaWYgbm90IHBvcnQ6CiAgICAgICAgICAgIHBvcnQgPSBwb3J0X2J5X3NjaGVtZS5nZXQocmVxdWVzdF9jb250ZXh0WydzY2hlbWUnXS5sb3dlcigpLCA4MCkKICAgICAgICByZXF1ZXN0X2NvbnRleHRbJ3BvcnQnXSA9IHBvcnQKICAgICAgICByZXF1ZXN0X2NvbnRleHRbJ2hvc3QnXSA9IGhvc3QKCiAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbl9mcm9tX2NvbnRleHQocmVxdWVzdF9jb250ZXh0KQoKICAgIGRlZiBjb25uZWN0aW9uX2Zyb21fY29udGV4dChzZWxmLCByZXF1ZXN0X2NvbnRleHQpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIDpjbGFzczpgQ29ubmVjdGlvblBvb2xgIGJhc2VkIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQuCgogICAgICAgIGBgcmVxdWVzdF9jb250ZXh0YGAgbXVzdCBhdCBsZWFzdCBjb250YWluIHRoZSBgYHNjaGVtZWBgIGtleSBhbmQgaXRzCiAgICAgICAgdmFsdWUgbXVzdCBiZSBhIGtleSBpbiBgYGtleV9mbl9ieV9zY2hlbWVgYCBpbnN0YW5jZSB2YXJpYWJsZS4KICAgICAgICAiIiIKICAgICAgICBzY2hlbWUgPSByZXF1ZXN0X2NvbnRleHRbJ3NjaGVtZSddLmxvd2VyKCkKICAgICAgICBwb29sX2tleV9jb25zdHJ1Y3RvciA9IHNlbGYua2V5X2ZuX2J5X3NjaGVtZVtzY2hlbWVdCiAgICAgICAgcG9vbF9rZXkgPSBwb29sX2tleV9jb25zdHJ1Y3RvcihyZXF1ZXN0X2NvbnRleHQpCgogICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb25fZnJvbV9wb29sX2tleShwb29sX2tleSwgcmVxdWVzdF9jb250ZXh0PXJlcXVlc3RfY29udGV4dCkKCiAgICBkZWYgY29ubmVjdGlvbl9mcm9tX3Bvb2xfa2V5KHNlbGYsIHBvb2xfa2V5LCByZXF1ZXN0X2NvbnRleHQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgOmNsYXNzOmBDb25uZWN0aW9uUG9vbGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBvb2wga2V5LgoKICAgICAgICBgYHBvb2xfa2V5YGAgc2hvdWxkIGJlIGEgbmFtZWR0dXBsZSB0aGF0IG9ubHkgY29udGFpbnMgaW1tdXRhYmxlCiAgICAgICAgb2JqZWN0cy4gQXQgYSBtaW5pbXVtIGl0IG11c3QgaGF2ZSB0aGUgYGBzY2hlbWVgYCwgYGBob3N0YGAsIGFuZAogICAgICAgIGBgcG9ydGBgIGZpZWxkcy4KICAgICAgICAiIiIKICAgICAgICB3aXRoIHNlbGYucG9vbHMubG9jazoKICAgICAgICAgICAgIyBJZiB0aGUgc2NoZW1lLCBob3N0LCBvciBwb3J0IGRvZXNuJ3QgbWF0Y2ggZXhpc3Rpbmcgb3BlbgogICAgICAgICAgICAjIGNvbm5lY3Rpb25zLCBvcGVuIGEgbmV3IENvbm5lY3Rpb25Qb29sLgogICAgICAgICAgICBwb29sID0gc2VsZi5wb29scy5nZXQocG9vbF9rZXkpCiAgICAgICAgICAgIGlmIHBvb2w6CiAgICAgICAgICAgICAgICByZXR1cm4gcG9vbAoKICAgICAgICAgICAgIyBNYWtlIGEgZnJlc2ggQ29ubmVjdGlvblBvb2wgb2YgdGhlIGRlc2lyZWQgdHlwZQogICAgICAgICAgICBzY2hlbWUgPSByZXF1ZXN0X2NvbnRleHRbJ3NjaGVtZSddCiAgICAgICAgICAgIGhvc3QgPSByZXF1ZXN0X2NvbnRleHRbJ2hvc3QnXQogICAgICAgICAgICBwb3J0ID0gcmVxdWVzdF9jb250ZXh0Wydwb3J0J10KICAgICAgICAgICAgcG9vbCA9IHNlbGYuX25ld19wb29sKHNjaGVtZSwgaG9zdCwgcG9ydCwgcmVxdWVzdF9jb250ZXh0PXJlcXVlc3RfY29udGV4dCkKICAgICAgICAgICAgc2VsZi5wb29sc1twb29sX2tleV0gPSBwb29sCgogICAgICAgIHJldHVybiBwb29sCgogICAgZGVmIGNvbm5lY3Rpb25fZnJvbV91cmwoc2VsZiwgdXJsLCBwb29sX2t3YXJncz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTaW1pbGFyIHRvIDpmdW5jOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLmNvbm5lY3Rpb25fZnJvbV91cmxgLgoKICAgICAgICBJZiBgYHBvb2xfa3dhcmdzYGAgaXMgbm90IHByb3ZpZGVkIGFuZCBhIG5ldyBwb29sIG5lZWRzIHRvIGJlCiAgICAgICAgY29uc3RydWN0ZWQsIGBgc2VsZi5jb25uZWN0aW9uX3Bvb2xfa3dgYCBpcyB1c2VkIHRvIGluaXRpYWxpemUKICAgICAgICB0aGUgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLkNvbm5lY3Rpb25Qb29sYC4gSWYgYGBwb29sX2t3YXJnc2BgCiAgICAgICAgaXMgcHJvdmlkZWQsIGl0IGlzIHVzZWQgaW5zdGVhZC4gTm90ZSB0aGF0IGlmIGEgbmV3IHBvb2wgZG9lcyBub3QKICAgICAgICBuZWVkIHRvIGJlIGNyZWF0ZWQgZm9yIHRoZSByZXF1ZXN0LCB0aGUgcHJvdmlkZWQgYGBwb29sX2t3YXJnc2BgIGFyZQogICAgICAgIG5vdCB1c2VkLgogICAgICAgICIiIgogICAgICAgIHUgPSBwYXJzZV91cmwodXJsKQogICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb25fZnJvbV9ob3N0KHUuaG9zdCwgcG9ydD11LnBvcnQsIHNjaGVtZT11LnNjaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sX2t3YXJncz1wb29sX2t3YXJncykKCiAgICBkZWYgX21lcmdlX3Bvb2xfa3dhcmdzKHNlbGYsIG92ZXJyaWRlKToKICAgICAgICAiIiIKICAgICAgICBNZXJnZSBhIGRpY3Rpb25hcnkgb2Ygb3ZlcnJpZGUgdmFsdWVzIGZvciBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdy4KCiAgICAgICAgVGhpcyBkb2VzIG5vdCBtb2RpZnkgc2VsZi5jb25uZWN0aW9uX3Bvb2xfa3cgYW5kIHJldHVybnMgYSBuZXcgZGljdC4KICAgICAgICBBbnkga2V5cyBpbiB0aGUgb3ZlcnJpZGUgZGljdGlvbmFyeSB3aXRoIGEgdmFsdWUgb2YgYGBOb25lYGAgYXJlCiAgICAgICAgcmVtb3ZlZCBmcm9tIHRoZSBtZXJnZWQgZGljdGlvbmFyeS4KICAgICAgICAiIiIKICAgICAgICBiYXNlX3Bvb2xfa3dhcmdzID0gc2VsZi5jb25uZWN0aW9uX3Bvb2xfa3cuY29weSgpCiAgICAgICAgaWYgb3ZlcnJpZGU6CiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG92ZXJyaWRlLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGJhc2VfcG9vbF9rd2FyZ3Nba2V5XQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBiYXNlX3Bvb2xfa3dhcmdzW2tleV0gPSB2YWx1ZQogICAgICAgIHJldHVybiBiYXNlX3Bvb2xfa3dhcmdzCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIHJlZGlyZWN0PVRydWUsICoqa3cpOgogICAgICAgICIiIgogICAgICAgIFNhbWUgYXMgOm1ldGg6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuSFRUUENvbm5lY3Rpb25Qb29sLnVybG9wZW5gCiAgICAgICAgd2l0aCBjdXN0b20gY3Jvc3MtaG9zdCByZWRpcmVjdCBsb2dpYyBhbmQgb25seSBzZW5kcyB0aGUgcmVxdWVzdC11cmkKICAgICAgICBwb3J0aW9uIG9mIHRoZSBgYHVybGBgLgoKICAgICAgICBUaGUgZ2l2ZW4gYGB1cmxgYCBwYXJhbWV0ZXIgbXVzdCBiZSBhYnNvbHV0ZSwgc3VjaCB0aGF0IGFuIGFwcHJvcHJpYXRlCiAgICAgICAgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLkNvbm5lY3Rpb25Qb29sYCBjYW4gYmUgY2hvc2VuIGZvciBpdC4KICAgICAgICAiIiIKICAgICAgICB1ID0gcGFyc2VfdXJsKHVybCkKICAgICAgICBjb25uID0gc2VsZi5jb25uZWN0aW9uX2Zyb21faG9zdCh1Lmhvc3QsIHBvcnQ9dS5wb3J0LCBzY2hlbWU9dS5zY2hlbWUpCgogICAgICAgIGt3Wydhc3NlcnRfc2FtZV9ob3N0J10gPSBGYWxzZQogICAgICAgIGt3WydyZWRpcmVjdCddID0gRmFsc2UKICAgICAgICBpZiAnaGVhZGVycycgbm90IGluIGt3OgogICAgICAgICAgICBrd1snaGVhZGVycyddID0gc2VsZi5oZWFkZXJzCgogICAgICAgIGlmIHNlbGYucHJveHkgaXMgbm90IE5vbmUgYW5kIHUuc2NoZW1lID09ICJodHRwIjoKICAgICAgICAgICAgcmVzcG9uc2UgPSBjb25uLnVybG9wZW4obWV0aG9kLCB1cmwsICoqa3cpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzcG9uc2UgPSBjb25uLnVybG9wZW4obWV0aG9kLCB1LnJlcXVlc3RfdXJpLCAqKmt3KQoKICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHJlZGlyZWN0IGFuZCByZXNwb25zZS5nZXRfcmVkaXJlY3RfbG9jYXRpb24oKQogICAgICAgIGlmIG5vdCByZWRpcmVjdF9sb2NhdGlvbjoKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgICAgICMgU3VwcG9ydCByZWxhdGl2ZSBVUkxzIGZvciByZWRpcmVjdGluZy4KICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHVybGpvaW4odXJsLCByZWRpcmVjdF9sb2NhdGlvbikKCiAgICAgICAgIyBSRkMgNzIzMSwgU2VjdGlvbiA2LjQuNAogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAzMDM6CiAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgIHJldHJpZXMgPSBrdy5nZXQoJ3JldHJpZXMnKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHJldHJpZXMsIFJldHJ5KToKICAgICAgICAgICAgcmV0cmllcyA9IFJldHJ5LmZyb21faW50KHJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0KQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudChtZXRob2QsIHVybCwgcmVzcG9uc2U9cmVzcG9uc2UsIF9wb29sPWNvbm4pCiAgICAgICAgZXhjZXB0IE1heFJldHJ5RXJyb3I6CiAgICAgICAgICAgIGlmIHJldHJpZXMucmFpc2Vfb25fcmVkaXJlY3Q6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICAgICAga3dbJ3JldHJpZXMnXSA9IHJldHJpZXMKICAgICAgICBrd1sncmVkaXJlY3QnXSA9IHJlZGlyZWN0CgogICAgICAgIGxvZy5pbmZvKCJSZWRpcmVjdGluZyAlcyAtPiAlcyIsIHVybCwgcmVkaXJlY3RfbG9jYXRpb24pCiAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbihtZXRob2QsIHJlZGlyZWN0X2xvY2F0aW9uLCAqKmt3KQoKCmNsYXNzIFByb3h5TWFuYWdlcihQb29sTWFuYWdlcik6CiAgICAiIiIKICAgIEJlaGF2ZXMganVzdCBsaWtlIDpjbGFzczpgUG9vbE1hbmFnZXJgLCBidXQgc2VuZHMgYWxsIHJlcXVlc3RzIHRocm91Z2gKICAgIHRoZSBkZWZpbmVkIHByb3h5LCB1c2luZyB0aGUgQ09OTkVDVCBtZXRob2QgZm9yIEhUVFBTIFVSTHMuCgogICAgOnBhcmFtIHByb3h5X3VybDoKICAgICAgICBUaGUgVVJMIG9mIHRoZSBwcm94eSB0byBiZSB1c2VkLgoKICAgIDpwYXJhbSBwcm94eV9oZWFkZXJzOgogICAgICAgIEEgZGljdGlvbmFyeSBjb250YW5pbmcgaGVhZGVycyB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgcHJveHkuIEluIGNhc2UKICAgICAgICBvZiBIVFRQIHRoZXkgYXJlIGJlaW5nIHNlbnQgd2l0aCBlYWNoIHJlcXVlc3QsIHdoaWxlIGluIHRoZQogICAgICAgIEhUVFBTL0NPTk5FQ1QgY2FzZSB0aGV5IGFyZSBzZW50IG9ubHkgb25jZS4gQ291bGQgYmUgdXNlZCBmb3IgcHJveHkKICAgICAgICBhdXRoZW50aWNhdGlvbi4KCiAgICBFeGFtcGxlOgogICAgICAgID4+PiBwcm94eSA9IHVybGxpYjMuUHJveHlNYW5hZ2VyKCdodHRwOi8vbG9jYWxob3N0OjMxMjgvJykKICAgICAgICA+Pj4gcjEgPSBwcm94eS5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2dvb2dsZS5jb20vJykKICAgICAgICA+Pj4gcjIgPSBwcm94eS5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2h0dHBiaW4ub3JnLycpCiAgICAgICAgPj4+IGxlbihwcm94eS5wb29scykKICAgICAgICAxCiAgICAgICAgPj4+IHIzID0gcHJveHkucmVxdWVzdCgnR0VUJywgJ2h0dHBzOi8vaHR0cGJpbi5vcmcvJykKICAgICAgICA+Pj4gcjQgPSBwcm94eS5yZXF1ZXN0KCdHRVQnLCAnaHR0cHM6Ly90d2l0dGVyLmNvbS8nKQogICAgICAgID4+PiBsZW4ocHJveHkucG9vbHMpCiAgICAgICAgMwoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm94eV91cmwsIG51bV9wb29scz0xMCwgaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgIHByb3h5X2hlYWRlcnM9Tm9uZSwgKipjb25uZWN0aW9uX3Bvb2xfa3cpOgoKICAgICAgICBpZiBpc2luc3RhbmNlKHByb3h5X3VybCwgSFRUUENvbm5lY3Rpb25Qb29sKToKICAgICAgICAgICAgcHJveHlfdXJsID0gJyVzOi8vJXM6JWknICUgKHByb3h5X3VybC5zY2hlbWUsIHByb3h5X3VybC5ob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfdXJsLnBvcnQpCiAgICAgICAgcHJveHkgPSBwYXJzZV91cmwocHJveHlfdXJsKQogICAgICAgIGlmIG5vdCBwcm94eS5wb3J0OgogICAgICAgICAgICBwb3J0ID0gcG9ydF9ieV9zY2hlbWUuZ2V0KHByb3h5LnNjaGVtZSwgODApCiAgICAgICAgICAgIHByb3h5ID0gcHJveHkuX3JlcGxhY2UocG9ydD1wb3J0KQoKICAgICAgICBpZiBwcm94eS5zY2hlbWUgbm90IGluICgiaHR0cCIsICJodHRwcyIpOgogICAgICAgICAgICByYWlzZSBQcm94eVNjaGVtZVVua25vd24ocHJveHkuc2NoZW1lKQoKICAgICAgICBzZWxmLnByb3h5ID0gcHJveHkKICAgICAgICBzZWxmLnByb3h5X2hlYWRlcnMgPSBwcm94eV9oZWFkZXJzIG9yIHt9CgogICAgICAgIGNvbm5lY3Rpb25fcG9vbF9rd1snX3Byb3h5J10gPSBzZWxmLnByb3h5CiAgICAgICAgY29ubmVjdGlvbl9wb29sX2t3WydfcHJveHlfaGVhZGVycyddID0gc2VsZi5wcm94eV9oZWFkZXJzCgogICAgICAgIHN1cGVyKFByb3h5TWFuYWdlciwgc2VsZikuX19pbml0X18oCiAgICAgICAgICAgIG51bV9wb29scywgaGVhZGVycywgKipjb25uZWN0aW9uX3Bvb2xfa3cpCgogICAgZGVmIGNvbm5lY3Rpb25fZnJvbV9ob3N0KHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSwgc2NoZW1lPSdodHRwJywgcG9vbF9rd2FyZ3M9Tm9uZSk6CiAgICAgICAgaWYgc2NoZW1lID09ICJodHRwcyI6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihQcm94eU1hbmFnZXIsIHNlbGYpLmNvbm5lY3Rpb25fZnJvbV9ob3N0KAogICAgICAgICAgICAgICAgaG9zdCwgcG9ydCwgc2NoZW1lLCBwb29sX2t3YXJncz1wb29sX2t3YXJncykKCiAgICAgICAgcmV0dXJuIHN1cGVyKFByb3h5TWFuYWdlciwgc2VsZikuY29ubmVjdGlvbl9mcm9tX2hvc3QoCiAgICAgICAgICAgIHNlbGYucHJveHkuaG9zdCwgc2VsZi5wcm94eS5wb3J0LCBzZWxmLnByb3h5LnNjaGVtZSwgcG9vbF9rd2FyZ3M9cG9vbF9rd2FyZ3MpCgogICAgZGVmIF9zZXRfcHJveHlfaGVhZGVycyhzZWxmLCB1cmwsIGhlYWRlcnM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0cyBoZWFkZXJzIG5lZWRlZCBieSBwcm94aWVzOiBzcGVjaWZpY2FsbHksIHRoZSBBY2NlcHQgYW5kIEhvc3QKICAgICAgICBoZWFkZXJzLiBPbmx5IHNldHMgaGVhZGVycyBub3QgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVyc18gPSB7J0FjY2VwdCc6ICcqLyonfQoKICAgICAgICBuZXRsb2MgPSBwYXJzZV91cmwodXJsKS5uZXRsb2MKICAgICAgICBpZiBuZXRsb2M6CiAgICAgICAgICAgIGhlYWRlcnNfWydIb3N0J10gPSBuZXRsb2MKCiAgICAgICAgaWYgaGVhZGVyczoKICAgICAgICAgICAgaGVhZGVyc18udXBkYXRlKGhlYWRlcnMpCiAgICAgICAgcmV0dXJuIGhlYWRlcnNfCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIHJlZGlyZWN0PVRydWUsICoqa3cpOgogICAgICAgICJTYW1lIGFzIEhUVFAoUylDb25uZWN0aW9uUG9vbC51cmxvcGVuLCBgYHVybGBgIG11c3QgYmUgYWJzb2x1dGUuIgogICAgICAgIHUgPSBwYXJzZV91cmwodXJsKQoKICAgICAgICBpZiB1LnNjaGVtZSA9PSAiaHR0cCI6CiAgICAgICAgICAgICMgRm9yIHByb3hpZWQgSFRUUFMgcmVxdWVzdHMsIGh0dHBsaWIgc2V0cyB0aGUgbmVjZXNzYXJ5IGhlYWRlcnMKICAgICAgICAgICAgIyBvbiB0aGUgQ09OTkVDVCB0byB0aGUgcHJveHkuIEZvciBIVFRQLCB3ZSdsbCBkZWZpbml0ZWx5CiAgICAgICAgICAgICMgbmVlZCB0byBzZXQgJ0hvc3QnIGF0IHRoZSB2ZXJ5IGxlYXN0LgogICAgICAgICAgICBoZWFkZXJzID0ga3cuZ2V0KCdoZWFkZXJzJywgc2VsZi5oZWFkZXJzKQogICAgICAgICAgICBrd1snaGVhZGVycyddID0gc2VsZi5fc2V0X3Byb3h5X2hlYWRlcnModXJsLCBoZWFkZXJzKQoKICAgICAgICByZXR1cm4gc3VwZXIoUHJveHlNYW5hZ2VyLCBzZWxmKS51cmxvcGVuKG1ldGhvZCwgdXJsLCByZWRpcmVjdD1yZWRpcmVjdCwgKiprdykKCgpkZWYgcHJveHlfZnJvbV91cmwodXJsLCAqKmt3KToKICAgIHJldHVybiBQcm94eU1hbmFnZXIocHJveHlfdXJsPXVybCwgKiprdykKUEsDBBQAAAAAAAAAIQDKMeTEOhcAADoXAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3JlcXVlc3QucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSAuZmlsZXBvc3QgaW1wb3J0IGVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLnVybGxpYi5wYXJzZSBpbXBvcnQgdXJsZW5jb2RlCgoKX19hbGxfXyA9IFsnUmVxdWVzdE1ldGhvZHMnXQoKCmNsYXNzIFJlcXVlc3RNZXRob2RzKG9iamVjdCk6CiAgICAiIiIKICAgIENvbnZlbmllbmNlIG1peGluIGZvciBjbGFzc2VzIHdobyBpbXBsZW1lbnQgYSA6bWV0aDpgdXJsb3BlbmAgbWV0aG9kLCBzdWNoCiAgICBhcyA6Y2xhc3M6YH51cmxsaWIzLmNvbm5lY3Rpb25wb29sLkhUVFBDb25uZWN0aW9uUG9vbGAgYW5kCiAgICA6Y2xhc3M6YH51cmxsaWIzLnBvb2xtYW5hZ2VyLlBvb2xNYW5hZ2VyYC4KCiAgICBQcm92aWRlcyBiZWhhdmlvciBmb3IgbWFraW5nIGNvbW1vbiB0eXBlcyBvZiBIVFRQIHJlcXVlc3QgbWV0aG9kcyBhbmQKICAgIGRlY2lkZXMgd2hpY2ggdHlwZSBvZiByZXF1ZXN0IGZpZWxkIGVuY29kaW5nIHRvIHVzZS4KCiAgICBTcGVjaWZpY2FsbHksCgogICAgOm1ldGg6YC5yZXF1ZXN0X2VuY29kZV91cmxgIGlzIGZvciBzZW5kaW5nIHJlcXVlc3RzIHdob3NlIGZpZWxkcyBhcmUKICAgIGVuY29kZWQgaW4gdGhlIFVSTCAoc3VjaCBhcyBHRVQsIEhFQUQsIERFTEVURSkuCgogICAgOm1ldGg6YC5yZXF1ZXN0X2VuY29kZV9ib2R5YCBpcyBmb3Igc2VuZGluZyByZXF1ZXN0cyB3aG9zZSBmaWVsZHMgYXJlCiAgICBlbmNvZGVkIGluIHRoZSAqYm9keSogb2YgdGhlIHJlcXVlc3QgdXNpbmcgbXVsdGlwYXJ0IG9yIHd3dy1mb3JtLXVybGVuY29kZWQKICAgIChzdWNoIGFzIGZvciBQT1NULCBQVVQsIFBBVENIKS4KCiAgICA6bWV0aDpgLnJlcXVlc3RgIGlzIGZvciBtYWtpbmcgYW55IGtpbmQgb2YgcmVxdWVzdCwgaXQgd2lsbCBsb29rIHVwIHRoZQogICAgYXBwcm9wcmlhdGUgZW5jb2RpbmcgZm9ybWF0IGFuZCB1c2Ugb25lIG9mIHRoZSBhYm92ZSB0d28gbWV0aG9kcyB0byBtYWtlCiAgICB0aGUgcmVxdWVzdC4KCiAgICBJbml0aWFsaXplciBwYXJhbWV0ZXJzOgoKICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGFsbCByZXF1ZXN0cywgdW5sZXNzIG90aGVyIGhlYWRlcnMgYXJlIGdpdmVuCiAgICAgICAgZXhwbGljaXRseS4KICAgICIiIgoKICAgIF9lbmNvZGVfdXJsX21ldGhvZHMgPSBzZXQoWydERUxFVEUnLCAnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUyddKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzPU5vbmUpOgogICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMgb3Ige30KCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICBlbmNvZGVfbXVsdGlwYXJ0PVRydWUsIG11bHRpcGFydF9ib3VuZGFyeT1Ob25lLAogICAgICAgICAgICAgICAgKiprdyk6ICAjIEFic3RyYWN0CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoIkNsYXNzZXMgZXh0ZW5kaW5nIFJlcXVlc3RNZXRob2RzIG11c3QgaW1wbGVtZW50ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlaXIgb3duIGBgdXJsb3BlbmBgIG1ldGhvZC4iKQoKICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBmaWVsZHM9Tm9uZSwgaGVhZGVycz1Ob25lLCAqKnVybG9wZW5fa3cpOgogICAgICAgICIiIgogICAgICAgIE1ha2UgYSByZXF1ZXN0IHVzaW5nIDptZXRoOmB1cmxvcGVuYCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBlbmNvZGluZyBvZgogICAgICAgIGBgZmllbGRzYGAgYmFzZWQgb24gdGhlIGBgbWV0aG9kYGAgdXNlZC4KCiAgICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHJlcXVpcmVzIHRoZSBsZWFzdCBhbW91bnQgb2YgbWFudWFsCiAgICAgICAgZWZmb3J0LiBJdCBjYW4gYmUgdXNlZCBpbiBtb3N0IHNpdHVhdGlvbnMsIHdoaWxlIHN0aWxsIGhhdmluZyB0aGUKICAgICAgICBvcHRpb24gdG8gZHJvcCBkb3duIHRvIG1vcmUgc3BlY2lmaWMgbWV0aG9kcyB3aGVuIG5lY2Vzc2FyeSwgc3VjaCBhcwogICAgICAgIDptZXRoOmByZXF1ZXN0X2VuY29kZV91cmxgLCA6bWV0aDpgcmVxdWVzdF9lbmNvZGVfYm9keWAsCiAgICAgICAgb3IgZXZlbiB0aGUgbG93ZXN0IGxldmVsIDptZXRoOmB1cmxvcGVuYC4KICAgICAgICAiIiIKICAgICAgICBtZXRob2QgPSBtZXRob2QudXBwZXIoKQoKICAgICAgICBpZiBtZXRob2QgaW4gc2VsZi5fZW5jb2RlX3VybF9tZXRob2RzOgogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0X2VuY29kZV91cmwobWV0aG9kLCB1cmwsIGZpZWxkcz1maWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnVybG9wZW5fa3cpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdF9lbmNvZGVfYm9keShtZXRob2QsIHVybCwgZmllbGRzPWZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKip1cmxvcGVuX2t3KQoKICAgIGRlZiByZXF1ZXN0X2VuY29kZV91cmwoc2VsZiwgbWV0aG9kLCB1cmwsIGZpZWxkcz1Ob25lLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICoqdXJsb3Blbl9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBhIHJlcXVlc3QgdXNpbmcgOm1ldGg6YHVybG9wZW5gIHdpdGggdGhlIGBgZmllbGRzYGAgZW5jb2RlZCBpbgogICAgICAgIHRoZSB1cmwuIFRoaXMgaXMgdXNlZnVsIGZvciByZXF1ZXN0IG1ldGhvZHMgbGlrZSBHRVQsIEhFQUQsIERFTEVURSwgZXRjLgogICAgICAgICIiIgogICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycwoKICAgICAgICBleHRyYV9rdyA9IHsnaGVhZGVycyc6IGhlYWRlcnN9CiAgICAgICAgZXh0cmFfa3cudXBkYXRlKHVybG9wZW5fa3cpCgogICAgICAgIGlmIGZpZWxkczoKICAgICAgICAgICAgdXJsICs9ICc/JyArIHVybGVuY29kZShmaWVsZHMpCgogICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4obWV0aG9kLCB1cmwsICoqZXh0cmFfa3cpCgogICAgZGVmIHJlcXVlc3RfZW5jb2RlX2JvZHkoc2VsZiwgbWV0aG9kLCB1cmwsIGZpZWxkcz1Ob25lLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfbXVsdGlwYXJ0PVRydWUsIG11bHRpcGFydF9ib3VuZGFyeT1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKip1cmxvcGVuX2t3KToKICAgICAgICAiIiIKICAgICAgICBNYWtlIGEgcmVxdWVzdCB1c2luZyA6bWV0aDpgdXJsb3BlbmAgd2l0aCB0aGUgYGBmaWVsZHNgYCBlbmNvZGVkIGluCiAgICAgICAgdGhlIGJvZHkuIFRoaXMgaXMgdXNlZnVsIGZvciByZXF1ZXN0IG1ldGhvZHMgbGlrZSBQT1NULCBQVVQsIFBBVENILCBldGMuCgogICAgICAgIFdoZW4gYGBlbmNvZGVfbXVsdGlwYXJ0PVRydWVgYCAoZGVmYXVsdCksIHRoZW4KICAgICAgICA6bWV0aDpgdXJsbGliMy5maWxlcG9zdC5lbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhYCBpcyB1c2VkIHRvIGVuY29kZQogICAgICAgIHRoZSBwYXlsb2FkIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbnRlbnQgdHlwZS4gT3RoZXJ3aXNlCiAgICAgICAgOm1ldGg6YHVybGxpYi51cmxlbmNvZGVgIGlzIHVzZWQgd2l0aCB0aGUKICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyBjb250ZW50IHR5cGUuCgogICAgICAgIE11bHRpcGFydCBlbmNvZGluZyBtdXN0IGJlIHVzZWQgd2hlbiBwb3N0aW5nIGZpbGVzLCBhbmQgaXQncyByZWFzb25hYmx5CiAgICAgICAgc2FmZSB0byB1c2UgaXQgaW4gb3RoZXIgdGltZXMgdG9vLiBIb3dldmVyLCBpdCBtYXkgYnJlYWsgcmVxdWVzdAogICAgICAgIHNpZ25pbmcsIHN1Y2ggYXMgd2l0aCBPQXV0aC4KCiAgICAgICAgU3VwcG9ydHMgYW4gb3B0aW9uYWwgYGBmaWVsZHNgYCBwYXJhbWV0ZXIgb2Yga2V5L3ZhbHVlIHN0cmluZ3MgQU5ECiAgICAgICAga2V5L2ZpbGV0dXBsZS4gQSBmaWxldHVwbGUgaXMgYSAoZmlsZW5hbWUsIGRhdGEsIE1JTUUgdHlwZSkgdHVwbGUgd2hlcmUKICAgICAgICB0aGUgTUlNRSB0eXBlIGlzIG9wdGlvbmFsLiBGb3IgZXhhbXBsZTo6CgogICAgICAgICAgICBmaWVsZHMgPSB7CiAgICAgICAgICAgICAgICAnZm9vJzogJ2JhcicsCiAgICAgICAgICAgICAgICAnZmFrZWZpbGUnOiAoJ2Zvb2ZpbGUudHh0JywgJ2NvbnRlbnRzIG9mIGZvb2ZpbGUnKSwKICAgICAgICAgICAgICAgICdyZWFsZmlsZSc6ICgnYmFyZmlsZS50eHQnLCBvcGVuKCdyZWFsZmlsZScpLnJlYWQoKSksCiAgICAgICAgICAgICAgICAndHlwZWRmaWxlJzogKCdiYXpmaWxlLmJpbicsIG9wZW4oJ2JhemZpbGUnKS5yZWFkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbWFnZS9qcGVnJyksCiAgICAgICAgICAgICAgICAnbm9uYW1lZmlsZSc6ICdjb250ZW50cyBvZiBub25hbWVmaWxlIGZpZWxkJywKICAgICAgICAgICAgfQoKICAgICAgICBXaGVuIHVwbG9hZGluZyBhIGZpbGUsIHByb3ZpZGluZyBhIGZpbGVuYW1lICh0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoZQogICAgICAgIHR1cGxlKSBpcyBvcHRpb25hbCBidXQgcmVjb21tZW5kZWQgdG8gYmVzdCBtaW1pY2sgYmVoYXZpb3Igb2YgYnJvd3NlcnMuCgogICAgICAgIE5vdGUgdGhhdCBpZiBgYGhlYWRlcnNgYCBhcmUgc3VwcGxpZWQsIHRoZSAnQ29udGVudC1UeXBlJyBoZWFkZXIgd2lsbAogICAgICAgIGJlIG92ZXJ3cml0dGVuIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgZHluYW1pYyByYW5kb20gYm91bmRhcnkgc3RyaW5nCiAgICAgICAgd2hpY2ggaXMgdXNlZCB0byBjb21wb3NlIHRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LiBUaGUgcmFuZG9tIGJvdW5kYXJ5CiAgICAgICAgc3RyaW5nIGNhbiBiZSBleHBsaWNpdGx5IHNldCB3aXRoIHRoZSBgYG11bHRpcGFydF9ib3VuZGFyeWBgIHBhcmFtZXRlci4KICAgICAgICAiIiIKICAgICAgICBpZiBoZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGhlYWRlcnMgPSBzZWxmLmhlYWRlcnMKCiAgICAgICAgZXh0cmFfa3cgPSB7J2hlYWRlcnMnOiB7fX0KCiAgICAgICAgaWYgZmllbGRzOgogICAgICAgICAgICBpZiAnYm9keScgaW4gdXJsb3Blbl9rdzoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBnb3QgdmFsdWVzIGZvciBib3RoICdmaWVsZHMnIGFuZCAnYm9keScsIGNhbiBvbmx5IHNwZWNpZnkgb25lLiIpCgogICAgICAgICAgICBpZiBlbmNvZGVfbXVsdGlwYXJ0OgogICAgICAgICAgICAgICAgYm9keSwgY29udGVudF90eXBlID0gZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YShmaWVsZHMsIGJvdW5kYXJ5PW11bHRpcGFydF9ib3VuZGFyeSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJvZHksIGNvbnRlbnRfdHlwZSA9IHVybGVuY29kZShmaWVsZHMpLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwoKICAgICAgICAgICAgZXh0cmFfa3dbJ2JvZHknXSA9IGJvZHkKICAgICAgICAgICAgZXh0cmFfa3dbJ2hlYWRlcnMnXSA9IHsnQ29udGVudC1UeXBlJzogY29udGVudF90eXBlfQoKICAgICAgICBleHRyYV9rd1snaGVhZGVycyddLnVwZGF0ZShoZWFkZXJzKQogICAgICAgIGV4dHJhX2t3LnVwZGF0ZSh1cmxvcGVuX2t3KQoKICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKG1ldGhvZCwgdXJsLCAqKmV4dHJhX2t3KQpQSwMEFAAAAAAAAAAhAD9KgmF3WQAAd1kAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVzcG9uc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCmltcG9ydCB6bGliCmltcG9ydCBpbwppbXBvcnQgbG9nZ2luZwpmcm9tIHNvY2tldCBpbXBvcnQgdGltZW91dCBhcyBTb2NrZXRUaW1lb3V0CmZyb20gc29ja2V0IGltcG9ydCBlcnJvciBhcyBTb2NrZXRFcnJvcgoKZnJvbSAuX2NvbGxlY3Rpb25zIGltcG9ydCBIVFRQSGVhZGVyRGljdApmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBCb2R5Tm90SHR0cGxpYkNvbXBhdGlibGUsIFByb3RvY29sRXJyb3IsIERlY29kZUVycm9yLCBSZWFkVGltZW91dEVycm9yLAogICAgUmVzcG9uc2VOb3RDaHVua2VkLCBJbmNvbXBsZXRlUmVhZCwgSW52YWxpZEhlYWRlcgopCmZyb20gLnBhY2thZ2VzLnNpeCBpbXBvcnQgc3RyaW5nX3R5cGVzIGFzIGJhc2VzdHJpbmcsIGJpbmFyeV90eXBlLCBQWTMKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudCBhcyBodHRwbGliCmZyb20gLmNvbm5lY3Rpb24gaW1wb3J0IEhUVFBFeGNlcHRpb24sIEJhc2VTU0xFcnJvcgpmcm9tIC51dGlsLnJlc3BvbnNlIGltcG9ydCBpc19mcF9jbG9zZWQsIGlzX3Jlc3BvbnNlX3RvX2hlYWQKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIERlZmxhdGVEZWNvZGVyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2ZpcnN0X3RyeSA9IFRydWUKICAgICAgICBzZWxmLl9kYXRhID0gYmluYXJ5X3R5cGUoKQogICAgICAgIHNlbGYuX29iaiA9IHpsaWIuZGVjb21wcmVzc29iaigpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX29iaiwgbmFtZSkKCiAgICBkZWYgZGVjb21wcmVzcyhzZWxmLCBkYXRhKToKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKCiAgICAgICAgaWYgbm90IHNlbGYuX2ZpcnN0X3RyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29iai5kZWNvbXByZXNzKGRhdGEpCgogICAgICAgIHNlbGYuX2RhdGEgKz0gZGF0YQogICAgICAgIHRyeToKICAgICAgICAgICAgZGVjb21wcmVzc2VkID0gc2VsZi5fb2JqLmRlY29tcHJlc3MoZGF0YSkKICAgICAgICAgICAgaWYgZGVjb21wcmVzc2VkOgogICAgICAgICAgICAgICAgc2VsZi5fZmlyc3RfdHJ5ID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGEgPSBOb25lCiAgICAgICAgICAgIHJldHVybiBkZWNvbXByZXNzZWQKICAgICAgICBleGNlcHQgemxpYi5lcnJvcjoKICAgICAgICAgICAgc2VsZi5fZmlyc3RfdHJ5ID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5fb2JqID0gemxpYi5kZWNvbXByZXNzb2JqKC16bGliLk1BWF9XQklUUykKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjb21wcmVzcyhzZWxmLl9kYXRhKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc2VsZi5fZGF0YSA9IE5vbmUKCgpjbGFzcyBHemlwRGVjb2RlcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9vYmogPSB6bGliLmRlY29tcHJlc3NvYmooMTYgKyB6bGliLk1BWF9XQklUUykKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fb2JqLCBuYW1lKQoKICAgIGRlZiBkZWNvbXByZXNzKHNlbGYsIGRhdGEpOgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gZGF0YQogICAgICAgIHJldHVybiBzZWxmLl9vYmouZGVjb21wcmVzcyhkYXRhKQoKCmRlZiBfZ2V0X2RlY29kZXIobW9kZSk6CiAgICBpZiBtb2RlID09ICdnemlwJzoKICAgICAgICByZXR1cm4gR3ppcERlY29kZXIoKQoKICAgIHJldHVybiBEZWZsYXRlRGVjb2RlcigpCgoKY2xhc3MgSFRUUFJlc3BvbnNlKGlvLklPQmFzZSk6CiAgICAiIiIKICAgIEhUVFAgUmVzcG9uc2UgY29udGFpbmVyLgoKICAgIEJhY2t3YXJkcy1jb21wYXRpYmxlIHRvIGh0dHBsaWIncyBIVFRQUmVzcG9uc2UgYnV0IHRoZSByZXNwb25zZSBgYGJvZHlgYCBpcwogICAgbG9hZGVkIGFuZCBkZWNvZGVkIG9uLWRlbWFuZCB3aGVuIHRoZSBgYGRhdGFgYCBwcm9wZXJ0eSBpcyBhY2Nlc3NlZC4gIFRoaXMKICAgIGNsYXNzIGlzIGFsc28gY29tcGF0aWJsZSB3aXRoIHRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSdzIDptb2Q6YGlvYAogICAgbW9kdWxlLCBhbmQgY2FuIGhlbmNlIGJlIHRyZWF0ZWQgYXMgYSByZWFkYWJsZSBvYmplY3QgaW4gdGhlIGNvbnRleHQgb2YgdGhhdAogICAgZnJhbWV3b3JrLgoKICAgIEV4dHJhIHBhcmFtZXRlcnMgZm9yIGJlaGF2aW91ciBub3QgcHJlc2VudCBpbiBodHRwbGliLkhUVFBSZXNwb25zZToKCiAgICA6cGFyYW0gcHJlbG9hZF9jb250ZW50OgogICAgICAgIElmIFRydWUsIHRoZSByZXNwb25zZSdzIGJvZHkgd2lsbCBiZSBwcmVsb2FkZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi4KCiAgICA6cGFyYW0gZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgSWYgVHJ1ZSwgYXR0ZW1wdHMgdG8gZGVjb2RlIHNwZWNpZmljIGNvbnRlbnQtZW5jb2RpbmcncyBiYXNlZCBvbiBoZWFkZXJzCiAgICAgICAgKGxpa2UgJ2d6aXAnIGFuZCAnZGVmbGF0ZScpIHdpbGwgYmUgc2tpcHBlZCBhbmQgcmF3IGRhdGEgd2lsbCBiZSB1c2VkCiAgICAgICAgaW5zdGVhZC4KCiAgICA6cGFyYW0gb3JpZ2luYWxfcmVzcG9uc2U6CiAgICAgICAgV2hlbiB0aGlzIEhUVFBSZXNwb25zZSB3cmFwcGVyIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGh0dHBsaWIuSFRUUFJlc3BvbnNlCiAgICAgICAgb2JqZWN0LCBpdCdzIGNvbnZlbmllbnQgdG8gaW5jbHVkZSB0aGUgb3JpZ2luYWwgZm9yIGRlYnVnIHB1cnBvc2VzLiBJdCdzCiAgICAgICAgb3RoZXJ3aXNlIHVudXNlZC4KCiAgICA6cGFyYW0gcmV0cmllczoKICAgICAgICBUaGUgcmV0cmllcyBjb250YWlucyB0aGUgbGFzdCA6Y2xhc3M6YH51cmxsaWIzLnV0aWwucmV0cnkuUmV0cnlgIHRoYXQKICAgICAgICB3YXMgdXNlZCBkdXJpbmcgdGhlIHJlcXVlc3QuCgogICAgOnBhcmFtIGVuZm9yY2VfY29udGVudF9sZW5ndGg6CiAgICAgICAgRW5mb3JjZSBjb250ZW50IGxlbmd0aCBjaGVja2luZy4gQm9keSByZXR1cm5lZCBieSBzZXJ2ZXIgbXVzdCBtYXRjaAogICAgICAgIHZhbHVlIG9mIENvbnRlbnQtTGVuZ3RoIGhlYWRlciwgaWYgcHJlc2VudC4gT3RoZXJ3aXNlLCByYWlzZSBlcnJvci4KICAgICIiIgoKICAgIENPTlRFTlRfREVDT0RFUlMgPSBbJ2d6aXAnLCAnZGVmbGF0ZSddCiAgICBSRURJUkVDVF9TVEFUVVNFUyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0KCiAgICBkZWYgX19pbml0X18oc2VsZiwgYm9keT0nJywgaGVhZGVycz1Ob25lLCBzdGF0dXM9MCwgdmVyc2lvbj0wLCByZWFzb249Tm9uZSwKICAgICAgICAgICAgICAgICBzdHJpY3Q9MCwgcHJlbG9hZF9jb250ZW50PVRydWUsIGRlY29kZV9jb250ZW50PVRydWUsCiAgICAgICAgICAgICAgICAgb3JpZ2luYWxfcmVzcG9uc2U9Tm9uZSwgcG9vbD1Ob25lLCBjb25uZWN0aW9uPU5vbmUsCiAgICAgICAgICAgICAgICAgcmV0cmllcz1Ob25lLCBlbmZvcmNlX2NvbnRlbnRfbGVuZ3RoPUZhbHNlLCByZXF1ZXN0X21ldGhvZD1Ob25lKToKCiAgICAgICAgaWYgaXNpbnN0YW5jZShoZWFkZXJzLCBIVFRQSGVhZGVyRGljdCk6CiAgICAgICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdChoZWFkZXJzKQogICAgICAgIHNlbGYuc3RhdHVzID0gc3RhdHVzCiAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgogICAgICAgIHNlbGYucmVhc29uID0gcmVhc29uCiAgICAgICAgc2VsZi5zdHJpY3QgPSBzdHJpY3QKICAgICAgICBzZWxmLmRlY29kZV9jb250ZW50ID0gZGVjb2RlX2NvbnRlbnQKICAgICAgICBzZWxmLnJldHJpZXMgPSByZXRyaWVzCiAgICAgICAgc2VsZi5lbmZvcmNlX2NvbnRlbnRfbGVuZ3RoID0gZW5mb3JjZV9jb250ZW50X2xlbmd0aAoKICAgICAgICBzZWxmLl9kZWNvZGVyID0gTm9uZQogICAgICAgIHNlbGYuX2JvZHkgPSBOb25lCiAgICAgICAgc2VsZi5fZnAgPSBOb25lCiAgICAgICAgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UgPSBvcmlnaW5hbF9yZXNwb25zZQogICAgICAgIHNlbGYuX2ZwX2J5dGVzX3JlYWQgPSAwCgogICAgICAgIGlmIGJvZHkgYW5kIGlzaW5zdGFuY2UoYm9keSwgKGJhc2VzdHJpbmcsIGJpbmFyeV90eXBlKSk6CiAgICAgICAgICAgIHNlbGYuX2JvZHkgPSBib2R5CgogICAgICAgIHNlbGYuX3Bvb2wgPSBwb29sCiAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24KCiAgICAgICAgaWYgaGFzYXR0cihib2R5LCAncmVhZCcpOgogICAgICAgICAgICBzZWxmLl9mcCA9IGJvZHkKCiAgICAgICAgIyBBcmUgd2UgdXNpbmcgdGhlIGNodW5rZWQtc3R5bGUgb2YgdHJhbnNmZXIgZW5jb2Rpbmc/CiAgICAgICAgc2VsZi5jaHVua2VkID0gRmFsc2UKICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBOb25lCiAgICAgICAgdHJfZW5jID0gc2VsZi5oZWFkZXJzLmdldCgndHJhbnNmZXItZW5jb2RpbmcnLCAnJykubG93ZXIoKQogICAgICAgICMgRG9uJ3QgaW5jdXIgdGhlIHBlbmFsdHkgb2YgY3JlYXRpbmcgYSBsaXN0IGFuZCB0aGVuIGRpc2NhcmRpbmcgaXQKICAgICAgICBlbmNvZGluZ3MgPSAoZW5jLnN0cmlwKCkgZm9yIGVuYyBpbiB0cl9lbmMuc3BsaXQoIiwiKSkKICAgICAgICBpZiAiY2h1bmtlZCIgaW4gZW5jb2RpbmdzOgogICAgICAgICAgICBzZWxmLmNodW5rZWQgPSBUcnVlCgogICAgICAgICMgRGV0ZXJtaW5lIGxlbmd0aCBvZiByZXNwb25zZQogICAgICAgIHNlbGYubGVuZ3RoX3JlbWFpbmluZyA9IHNlbGYuX2luaXRfbGVuZ3RoKHJlcXVlc3RfbWV0aG9kKQoKICAgICAgICAjIElmIHJlcXVlc3RlZCwgcHJlbG9hZCB0aGUgYm9keS4KICAgICAgICBpZiBwcmVsb2FkX2NvbnRlbnQgYW5kIG5vdCBzZWxmLl9ib2R5OgogICAgICAgICAgICBzZWxmLl9ib2R5ID0gc2VsZi5yZWFkKGRlY29kZV9jb250ZW50PWRlY29kZV9jb250ZW50KQoKICAgIGRlZiBnZXRfcmVkaXJlY3RfbG9jYXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2hvdWxkIHdlIHJlZGlyZWN0IGFuZCB3aGVyZSB0bz8KCiAgICAgICAgOnJldHVybnM6IFRydXRoeSByZWRpcmVjdCBsb2NhdGlvbiBzdHJpbmcgaWYgd2UgZ290IGEgcmVkaXJlY3Qgc3RhdHVzCiAgICAgICAgICAgIGNvZGUgYW5kIHZhbGlkIGxvY2F0aW9uLiBgYE5vbmVgYCBpZiByZWRpcmVjdCBzdGF0dXMgYW5kIG5vCiAgICAgICAgICAgIGxvY2F0aW9uLiBgYEZhbHNlYGAgaWYgbm90IGEgcmVkaXJlY3Qgc3RhdHVzIGNvZGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5zdGF0dXMgaW4gc2VsZi5SRURJUkVDVF9TVEFUVVNFUzoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycy5nZXQoJ2xvY2F0aW9uJykKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIHJlbGVhc2VfY29ubihzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5fcG9vbCBvciBub3Qgc2VsZi5fY29ubmVjdGlvbjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuX3Bvb2wuX3B1dF9jb25uKHNlbGYuX2Nvbm5lY3Rpb24pCiAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkYXRhKHNlbGYpOgogICAgICAgICMgRm9yIGJhY2t3b3Jkcy1jb21wYXQgd2l0aCBlYXJsaWVyIHVybGxpYjMgMC40IGFuZCBlYXJsaWVyLgogICAgICAgIGlmIHNlbGYuX2JvZHk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9ib2R5CgogICAgICAgIGlmIHNlbGYuX2ZwOgogICAgICAgICAgICByZXR1cm4gc2VsZi5yZWFkKGNhY2hlX2NvbnRlbnQ9VHJ1ZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb25uZWN0aW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0aW9uCgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgT2J0YWluIHRoZSBudW1iZXIgb2YgYnl0ZXMgcHVsbGVkIG92ZXIgdGhlIHdpcmUgc28gZmFyLiBNYXkgZGlmZmVyIGZyb20KICAgICAgICB0aGUgYW1vdW50IG9mIGNvbnRlbnQgcmV0dXJuZWQgYnkgOm1ldGg6YGBIVFRQUmVzcG9uc2UucmVhZGBgIGlmIGJ5dGVzCiAgICAgICAgYXJlIGVuY29kZWQgb24gdGhlIHdpcmUgKGUuZywgY29tcHJlc3NlZCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZwX2J5dGVzX3JlYWQKCiAgICBkZWYgX2luaXRfbGVuZ3RoKHNlbGYsIHJlcXVlc3RfbWV0aG9kKToKICAgICAgICAiIiIKICAgICAgICBTZXQgaW5pdGlhbCBsZW5ndGggdmFsdWUgZm9yIFJlc3BvbnNlIGNvbnRlbnQgaWYgYXZhaWxhYmxlLgogICAgICAgICIiIgogICAgICAgIGxlbmd0aCA9IHNlbGYuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykKCiAgICAgICAgaWYgbGVuZ3RoIGlzIG5vdCBOb25lIGFuZCBzZWxmLmNodW5rZWQ6CiAgICAgICAgICAgICMgVGhpcyBSZXNwb25zZSB3aWxsIGZhaWwgd2l0aCBhbiBJbmNvbXBsZXRlUmVhZCBpZiBpdCBjYW4ndCBiZQogICAgICAgICAgICAjIHJlY2VpdmVkIGFzIGNodW5rZWQuIFRoaXMgbWV0aG9kIGZhbGxzIGJhY2sgdG8gYXR0ZW1wdCByZWFkaW5nCiAgICAgICAgICAgICMgdGhlIHJlc3BvbnNlIGJlZm9yZSByYWlzaW5nIGFuIGV4Y2VwdGlvbi4KICAgICAgICAgICAgbG9nLndhcm5pbmcoIlJlY2VpdmVkIHJlc3BvbnNlIHdpdGggYm90aCBDb250ZW50LUxlbmd0aCBhbmQgIgogICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNmZXItRW5jb2Rpbmcgc2V0LiBUaGlzIGlzIGV4cHJlc3NseSBmb3JiaWRkZW4gIgogICAgICAgICAgICAgICAgICAgICAgICAiYnkgUkZDIDcyMzAgc2VjIDMuMy4yLiBJZ25vcmluZyBDb250ZW50LUxlbmd0aCBhbmQgIgogICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGluZyB0byBwcm9jZXNzIHJlc3BvbnNlIGFzIFRyYW5zZmVyLUVuY29kaW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJjaHVua2VkLiIpCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGVsaWYgbGVuZ3RoIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIFJGQyA3MjMwIHNlY3Rpb24gMy4zLjIgc3BlY2lmaWVzIG11bHRpcGxlIGNvbnRlbnQgbGVuZ3RocyBjYW4KICAgICAgICAgICAgICAgICMgYmUgc2VudCBpbiBhIHNpbmdsZSBDb250ZW50LUxlbmd0aCBoZWFkZXIKICAgICAgICAgICAgICAgICMgKGUuZy4gQ29udGVudC1MZW5ndGg6IDQyLCA0MikuIFRoaXMgbGluZSBlbnN1cmVzIHRoZSB2YWx1ZXMKICAgICAgICAgICAgICAgICMgYXJlIGFsbCB2YWxpZCBpbnRzIGFuZCB0aGF0IGFzIGxvbmcgYXMgdGhlIGBzZXRgIGxlbmd0aCBpcyAxLAogICAgICAgICAgICAgICAgIyBhbGwgdmFsdWVzIGFyZSB0aGUgc2FtZS4gT3RoZXJ3aXNlLCB0aGUgaGVhZGVyIGlzIGludmFsaWQuCiAgICAgICAgICAgICAgICBsZW5ndGhzID0gc2V0KFtpbnQodmFsKSBmb3IgdmFsIGluIGxlbmd0aC5zcGxpdCgnLCcpXSkKICAgICAgICAgICAgICAgIGlmIGxlbihsZW5ndGhzKSA+IDE6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlcigiQ29udGVudC1MZW5ndGggY29udGFpbmVkIG11bHRpcGxlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bm1hdGNoaW5nIHZhbHVlcyAoJXMpIiAlIGxlbmd0aCkKICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aHMucG9wKCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBsZW5ndGggPSBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBsZW5ndGggPCAwOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IE5vbmUKCiAgICAgICAgIyBDb252ZXJ0IHN0YXR1cyB0byBpbnQgZm9yIGNvbXBhcmlzb24KICAgICAgICAjIEluIHNvbWUgY2FzZXMsIGh0dHBsaWIgcmV0dXJucyBhIHN0YXR1cyBvZiAiX1VOS05PV04iCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdGF0dXMgPSBpbnQoc2VsZi5zdGF0dXMpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHN0YXR1cyA9IDAKCiAgICAgICAgIyBDaGVjayBmb3IgcmVzcG9uc2VzIHRoYXQgc2hvdWxkbid0IGluY2x1ZGUgYSBib2R5CiAgICAgICAgaWYgc3RhdHVzIGluICgyMDQsIDMwNCkgb3IgMTAwIDw9IHN0YXR1cyA8IDIwMCBvciByZXF1ZXN0X21ldGhvZCA9PSAnSEVBRCc6CiAgICAgICAgICAgIGxlbmd0aCA9IDAKCiAgICAgICAgcmV0dXJuIGxlbmd0aAoKICAgIGRlZiBfaW5pdF9kZWNvZGVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNldC11cCB0aGUgX2RlY29kZXIgYXR0cmlidXRlIGlmIG5lY2Vzc2FyeS4KICAgICAgICAiIiIKICAgICAgICAjIE5vdGU6IGNvbnRlbnQtZW5jb2RpbmcgdmFsdWUgc2hvdWxkIGJlIGNhc2UtaW5zZW5zaXRpdmUsIHBlciBSRkMgNzIzMAogICAgICAgICMgU2VjdGlvbiAzLjIKICAgICAgICBjb250ZW50X2VuY29kaW5nID0gc2VsZi5oZWFkZXJzLmdldCgnY29udGVudC1lbmNvZGluZycsICcnKS5sb3dlcigpCiAgICAgICAgaWYgc2VsZi5fZGVjb2RlciBpcyBOb25lIGFuZCBjb250ZW50X2VuY29kaW5nIGluIHNlbGYuQ09OVEVOVF9ERUNPREVSUzoKICAgICAgICAgICAgc2VsZi5fZGVjb2RlciA9IF9nZXRfZGVjb2Rlcihjb250ZW50X2VuY29kaW5nKQoKICAgIGRlZiBfZGVjb2RlKHNlbGYsIGRhdGEsIGRlY29kZV9jb250ZW50LCBmbHVzaF9kZWNvZGVyKToKICAgICAgICAiIiIKICAgICAgICBEZWNvZGUgdGhlIGRhdGEgcGFzc2VkIGluIGFuZCBwb3RlbnRpYWxseSBmbHVzaCB0aGUgZGVjb2Rlci4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGRlY29kZV9jb250ZW50IGFuZCBzZWxmLl9kZWNvZGVyOgogICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2RlY29kZXIuZGVjb21wcmVzcyhkYXRhKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgemxpYi5lcnJvcikgYXMgZToKICAgICAgICAgICAgY29udGVudF9lbmNvZGluZyA9IHNlbGYuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZW5jb2RpbmcnLCAnJykubG93ZXIoKQogICAgICAgICAgICByYWlzZSBEZWNvZGVFcnJvcigKICAgICAgICAgICAgICAgICJSZWNlaXZlZCByZXNwb25zZSB3aXRoIGNvbnRlbnQtZW5jb2Rpbmc6ICVzLCBidXQgIgogICAgICAgICAgICAgICAgImZhaWxlZCB0byBkZWNvZGUgaXQuIiAlIGNvbnRlbnRfZW5jb2RpbmcsIGUpCgogICAgICAgIGlmIGZsdXNoX2RlY29kZXIgYW5kIGRlY29kZV9jb250ZW50OgogICAgICAgICAgICBkYXRhICs9IHNlbGYuX2ZsdXNoX2RlY29kZXIoKQoKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBfZmx1c2hfZGVjb2RlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGbHVzaGVzIHRoZSBkZWNvZGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIGRlY29kZXIgaXMgYWN0dWFsbHkKICAgICAgICBiZWluZyB1c2VkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX2RlY29kZXI6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX2RlY29kZXIuZGVjb21wcmVzcyhiJycpCiAgICAgICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9kZWNvZGVyLmZsdXNoKCkKCiAgICAgICAgcmV0dXJuIGInJwoKICAgIEBjb250ZXh0bWFuYWdlcgogICAgZGVmIF9lcnJvcl9jYXRjaGVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENhdGNoIGxvdy1sZXZlbCBweXRob24gZXhjZXB0aW9ucywgaW5zdGVhZCByZS1yYWlzaW5nIHVybGxpYjMKICAgICAgICB2YXJpYW50cywgc28gdGhhdCBsb3ctbGV2ZWwgZXhjZXB0aW9ucyBhcmUgbm90IGxlYWtlZCBpbiB0aGUKICAgICAgICBoaWdoLWxldmVsIGFwaS4KCiAgICAgICAgT24gZXhpdCwgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgogICAgICAgICIiIgogICAgICAgIGNsZWFuX2V4aXQgPSBGYWxzZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHlpZWxkCgogICAgICAgICAgICBleGNlcHQgU29ja2V0VGltZW91dDoKICAgICAgICAgICAgICAgICMgRklYTUU6IElkZWFsbHkgd2UnZCBsaWtlIHRvIGluY2x1ZGUgdGhlIHVybCBpbiB0aGUgUmVhZFRpbWVvdXRFcnJvciBidXQKICAgICAgICAgICAgICAgICMgdGhlcmUgaXMgeWV0IG5vIGNsZWFuIHdheSB0byBnZXQgYXQgaXQgZnJvbSB0aGlzIGNvbnRleHQuCiAgICAgICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKHNlbGYuX3Bvb2wsIE5vbmUsICdSZWFkIHRpbWVkIG91dC4nKQoKICAgICAgICAgICAgZXhjZXB0IEJhc2VTU0xFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIyBGSVhNRTogSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBTU0xFcnJvcnM/CiAgICAgICAgICAgICAgICBpZiAncmVhZCBvcGVyYXRpb24gdGltZWQgb3V0JyBub3QgaW4gc3RyKGUpOiAgIyBEZWZlbnNpdmU6CiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYnV0IGp1c3QgaW4gY2FzZSB3ZSdyZSBtaXNzaW5nIGFuIGVkZ2UKICAgICAgICAgICAgICAgICAgICAjIGNhc2UsIGxldCdzIGF2b2lkIHN3YWxsb3dpbmcgU1NMIGVycm9ycy4KICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3Ioc2VsZi5fcG9vbCwgTm9uZSwgJ1JlYWQgdGltZWQgb3V0LicpCgogICAgICAgICAgICBleGNlcHQgKEhUVFBFeGNlcHRpb24sIFNvY2tldEVycm9yKSBhcyBlOgogICAgICAgICAgICAgICAgIyBUaGlzIGluY2x1ZGVzIEluY29tcGxldGVSZWFkLgogICAgICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFcnJvcignQ29ubmVjdGlvbiBicm9rZW46ICVyJyAlIGUsIGUpCgogICAgICAgICAgICAjIElmIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHdlIHNob3VsZCBhdm9pZCBjbGVhbmluZyB1cAogICAgICAgICAgICAjIHVubmVjZXNzYXJpbHkuCiAgICAgICAgICAgIGNsZWFuX2V4aXQgPSBUcnVlCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgdGVybWluYXRlIGNsZWFubHksIHdlIG5lZWQgdG8gdGhyb3cgYXdheSBvdXIKICAgICAgICAgICAgIyBjb25uZWN0aW9uLgogICAgICAgICAgICBpZiBub3QgY2xlYW5fZXhpdDoKICAgICAgICAgICAgICAgICMgVGhlIHJlc3BvbnNlIG1heSBub3QgYmUgY2xvc2VkIGJ1dCB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0CiAgICAgICAgICAgICAgICAjIGFueW1vcmUgc28gY2xvc2UgaXQgbm93IHRvIGVuc3VyZSB0aGF0IHRoZSBjb25uZWN0aW9uIGlzCiAgICAgICAgICAgICAgICAjIHJlbGVhc2VkIGJhY2sgdG8gdGhlIHBvb2wuCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZS5jbG9zZSgpCgogICAgICAgICAgICAgICAgIyBDbG9zaW5nIHRoZSByZXNwb25zZSBtYXkgbm90IGFjdHVhbGx5IGJlIHN1ZmZpY2llbnQgdG8gY2xvc2UKICAgICAgICAgICAgICAgICMgZXZlcnl0aGluZywgc28gaWYgd2UgaGF2ZSBhIGhvbGQgb2YgdGhlIGNvbm5lY3Rpb24gY2xvc2UgdGhhdAogICAgICAgICAgICAgICAgIyB0b28uCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9jb25uZWN0aW9uOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uY2xvc2UoKQoKICAgICAgICAgICAgIyBJZiB3ZSBob2xkIHRoZSBvcmlnaW5hbCByZXNwb25zZSBidXQgaXQncyBjbG9zZWQgbm93LCB3ZSBzaG91bGQKICAgICAgICAgICAgIyByZXR1cm4gdGhlIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbC4KICAgICAgICAgICAgaWYgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UgYW5kIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlLmlzY2xvc2VkKCk6CiAgICAgICAgICAgICAgICBzZWxmLnJlbGVhc2VfY29ubigpCgogICAgZGVmIHJlYWQoc2VsZiwgYW10PU5vbmUsIGRlY29kZV9jb250ZW50PU5vbmUsIGNhY2hlX2NvbnRlbnQ9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFNpbWlsYXIgdG8gOm1ldGg6YGh0dHBsaWIuSFRUUFJlc3BvbnNlLnJlYWRgLCBidXQgd2l0aCB0d28gYWRkaXRpb25hbAogICAgICAgIHBhcmFtZXRlcnM6IGBgZGVjb2RlX2NvbnRlbnRgYCBhbmQgYGBjYWNoZV9jb250ZW50YGAuCgogICAgICAgIDpwYXJhbSBhbXQ6CiAgICAgICAgICAgIEhvdyBtdWNoIG9mIHRoZSBjb250ZW50IHRvIHJlYWQuIElmIHNwZWNpZmllZCwgY2FjaGluZyBpcyBza2lwcGVkCiAgICAgICAgICAgIGJlY2F1c2UgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGNhY2hlIHBhcnRpYWwgY29udGVudCBhcyB0aGUgZnVsbAogICAgICAgICAgICByZXNwb25zZS4KCiAgICAgICAgOnBhcmFtIGRlY29kZV9jb250ZW50OgogICAgICAgICAgICBJZiBUcnVlLCB3aWxsIGF0dGVtcHQgdG8gZGVjb2RlIHRoZSBib2R5IGJhc2VkIG9uIHRoZQogICAgICAgICAgICAnY29udGVudC1lbmNvZGluZycgaGVhZGVyLgoKICAgICAgICA6cGFyYW0gY2FjaGVfY29udGVudDoKICAgICAgICAgICAgSWYgVHJ1ZSwgd2lsbCBzYXZlIHRoZSByZXR1cm5lZCBkYXRhIHN1Y2ggdGhhdCB0aGUgc2FtZSByZXN1bHQgaXMKICAgICAgICAgICAgcmV0dXJuZWQgZGVzcGl0ZSBvZiB0aGUgc3RhdGUgb2YgdGhlIHVuZGVybHlpbmcgZmlsZSBvYmplY3QuIFRoaXMKICAgICAgICAgICAgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBgYC5kYXRhYGAgcHJvcGVydHkgdG8gY29udGludWUgd29ya2luZwogICAgICAgICAgICBhZnRlciBoYXZpbmcgYGAucmVhZCgpYGAgdGhlIGZpbGUgb2JqZWN0LiAoT3ZlcnJpZGRlbiBpZiBgYGFtdGBgIGlzCiAgICAgICAgICAgIHNldC4pCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5faW5pdF9kZWNvZGVyKCkKICAgICAgICBpZiBkZWNvZGVfY29udGVudCBpcyBOb25lOgogICAgICAgICAgICBkZWNvZGVfY29udGVudCA9IHNlbGYuZGVjb2RlX2NvbnRlbnQKCiAgICAgICAgaWYgc2VsZi5fZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGZsdXNoX2RlY29kZXIgPSBGYWxzZQogICAgICAgIGRhdGEgPSBOb25lCgogICAgICAgIHdpdGggc2VsZi5fZXJyb3JfY2F0Y2hlcigpOgogICAgICAgICAgICBpZiBhbXQgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgY1N0cmluZ0lPIGRvZXNuJ3QgbGlrZSBhbXQ9Tm9uZQogICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZwLnJlYWQoKQogICAgICAgICAgICAgICAgZmx1c2hfZGVjb2RlciA9IFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNhY2hlX2NvbnRlbnQgPSBGYWxzZQogICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZwLnJlYWQoYW10KQogICAgICAgICAgICAgICAgaWYgYW10ICE9IDAgYW5kIG5vdCBkYXRhOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQnVnZ3kgdmVyc2lvbnMgb2YgUHl0aG9uLgogICAgICAgICAgICAgICAgICAgICMgQ2xvc2UgdGhlIGNvbm5lY3Rpb24gd2hlbiBubyBkYXRhIGlzIHJldHVybmVkCiAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyByZWR1bmRhbnQgdG8gd2hhdCBodHRwbGliL2h0dHAuY2xpZW50IF9zaG91bGRfCiAgICAgICAgICAgICAgICAgICAgIyBhbHJlYWR5IGRvLiAgSG93ZXZlciwgdmVyc2lvbnMgb2YgcHl0aG9uIHJlbGVhc2VkIGJlZm9yZQogICAgICAgICAgICAgICAgICAgICMgRGVjZW1iZXIgMTUsIDIwMTIgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNjI5OCkgZG8KICAgICAgICAgICAgICAgICAgICAjIG5vdCBwcm9wZXJseSBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbiBhbGwgY2FzZXMuIFRoZXJlIGlzCiAgICAgICAgICAgICAgICAgICAgIyBubyBoYXJtIGluIHJlZHVuZGFudGx5IGNhbGxpbmcgY2xvc2UuCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnAuY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIGZsdXNoX2RlY29kZXIgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lbmZvcmNlX2NvbnRlbnRfbGVuZ3RoIGFuZCBzZWxmLmxlbmd0aF9yZW1haW5pbmcgbm90IGluICgwLCBOb25lKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIGVkZ2UgY2FzZSB0aGF0IGh0dHBsaWIgZmFpbGVkIHRvIGNvdmVyIGR1ZQogICAgICAgICAgICAgICAgICAgICAgICAjIHRvIGNvbmNlcm5zIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFdlJ3JlCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkcmVzc2luZyBpdCBoZXJlIHRvIG1ha2Ugc3VyZSBJbmNvbXBsZXRlUmVhZCBpcwogICAgICAgICAgICAgICAgICAgICAgICAjIHJhaXNlZCBkdXJpbmcgc3RyZWFtaW5nLCBzbyBhbGwgY2FsbHMgd2l0aCBpbmNvcnJlY3QKICAgICAgICAgICAgICAgICAgICAgICAgIyBDb250ZW50LUxlbmd0aCBhcmUgY2F1Z2h0LgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbmNvbXBsZXRlUmVhZChzZWxmLl9mcF9ieXRlc19yZWFkLCBzZWxmLmxlbmd0aF9yZW1haW5pbmcpCgogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYuX2ZwX2J5dGVzX3JlYWQgKz0gbGVuKGRhdGEpCiAgICAgICAgICAgIGlmIHNlbGYubGVuZ3RoX3JlbWFpbmluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoX3JlbWFpbmluZyAtPSBsZW4oZGF0YSkKCiAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9kZWNvZGUoZGF0YSwgZGVjb2RlX2NvbnRlbnQsIGZsdXNoX2RlY29kZXIpCgogICAgICAgICAgICBpZiBjYWNoZV9jb250ZW50OgogICAgICAgICAgICAgICAgc2VsZi5fYm9keSA9IGRhdGEKCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgc3RyZWFtKHNlbGYsIGFtdD0yKioxNiwgZGVjb2RlX2NvbnRlbnQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQSBnZW5lcmF0b3Igd3JhcHBlciBmb3IgdGhlIHJlYWQoKSBtZXRob2QuIEEgY2FsbCB3aWxsIGJsb2NrIHVudGlsCiAgICAgICAgYGBhbXRgYCBieXRlcyBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoZSBjb25uZWN0aW9uIG9yIHVudGlsIHRoZQogICAgICAgIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgoKICAgICAgICA6cGFyYW0gYW10OgogICAgICAgICAgICBIb3cgbXVjaCBvZiB0aGUgY29udGVudCB0byByZWFkLiBUaGUgZ2VuZXJhdG9yIHdpbGwgcmV0dXJuIHVwIHRvCiAgICAgICAgICAgIG11Y2ggZGF0YSBwZXIgaXRlcmF0aW9uLCBidXQgbWF5IHJldHVybiBsZXNzLiBUaGlzIGlzIHBhcnRpY3VsYXJseQogICAgICAgICAgICBsaWtlbHkgd2hlbiB1c2luZyBjb21wcmVzc2VkIGRhdGEuIEhvd2V2ZXIsIHRoZSBlbXB0eSBzdHJpbmcgd2lsbAogICAgICAgICAgICBuZXZlciBiZSByZXR1cm5lZC4KCiAgICAgICAgOnBhcmFtIGRlY29kZV9jb250ZW50OgogICAgICAgICAgICBJZiBUcnVlLCB3aWxsIGF0dGVtcHQgdG8gZGVjb2RlIHRoZSBib2R5IGJhc2VkIG9uIHRoZQogICAgICAgICAgICAnY29udGVudC1lbmNvZGluZycgaGVhZGVyLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2h1bmtlZCBhbmQgc2VsZi5zdXBwb3J0c19jaHVua2VkX3JlYWRzKCk6CiAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYucmVhZF9jaHVua2VkKGFtdCwgZGVjb2RlX2NvbnRlbnQ9ZGVjb2RlX2NvbnRlbnQpOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdoaWxlIG5vdCBpc19mcF9jbG9zZWQoc2VsZi5fZnApOgogICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYucmVhZChhbXQ9YW10LCBkZWNvZGVfY29udGVudD1kZWNvZGVfY29udGVudCkKCiAgICAgICAgICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGRhdGEKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2h0dHBsaWIoUmVzcG9uc2VDbHMsIHIsICoqcmVzcG9uc2Vfa3cpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGFuIDpjbGFzczpgaHR0cGxpYi5IVFRQUmVzcG9uc2VgIGluc3RhbmNlIGBgcmBgLCByZXR1cm4gYQogICAgICAgIGNvcnJlc3BvbmRpbmcgOmNsYXNzOmB1cmxsaWIzLnJlc3BvbnNlLkhUVFBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICBSZW1haW5pbmcgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSBIVFRQUmVzcG9uc2UgY29uc3RydWN0b3IsIGFsb25nCiAgICAgICAgd2l0aCBgYG9yaWdpbmFsX3Jlc3BvbnNlPXJgYC4KICAgICAgICAiIiIKICAgICAgICBoZWFkZXJzID0gci5tc2cKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaGVhZGVycywgSFRUUEhlYWRlckRpY3QpOgogICAgICAgICAgICBpZiBQWTM6ICAjIFB5dGhvbiAzCiAgICAgICAgICAgICAgICBoZWFkZXJzID0gSFRUUEhlYWRlckRpY3QoaGVhZGVycy5pdGVtcygpKQogICAgICAgICAgICBlbHNlOiAgIyBQeXRob24gMgogICAgICAgICAgICAgICAgaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0LmZyb21faHR0cGxpYihoZWFkZXJzKQoKICAgICAgICAjIEhUVFBSZXNwb25zZSBvYmplY3RzIGluIFB5dGhvbiAzIGRvbid0IGhhdmUgYSAuc3RyaWN0IGF0dHJpYnV0ZQogICAgICAgIHN0cmljdCA9IGdldGF0dHIociwgJ3N0cmljdCcsIDApCiAgICAgICAgcmVzcCA9IFJlc3BvbnNlQ2xzKGJvZHk9ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM9ci5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249ci52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb249ci5yZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1zdHJpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX3Jlc3BvbnNlPXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVzcG9uc2Vfa3cpCiAgICAgICAgcmV0dXJuIHJlc3AKCiAgICAjIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IG1ldGhvZHMgZm9yIGh0dHBsaWIuSFRUUFJlc3BvbnNlCiAgICBkZWYgZ2V0aGVhZGVycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzCgogICAgZGVmIGdldGhlYWRlcihzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMuZ2V0KG5hbWUsIGRlZmF1bHQpCgogICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgaHR0cC5jb29raWVqYXIKICAgIGRlZiBpbmZvKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMKCiAgICAjIE92ZXJyaWRlcyBmcm9tIGlvLklPQmFzZQogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgc2VsZi5fZnAuY2xvc2UoKQoKICAgICAgICBpZiBzZWxmLl9jb25uZWN0aW9uOgogICAgICAgICAgICBzZWxmLl9jb25uZWN0aW9uLmNsb3NlKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjbG9zZWQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZi5fZnAsICdpc2Nsb3NlZCcpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZnAuaXNjbG9zZWQoKQogICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLl9mcCwgJ2Nsb3NlZCcpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZnAuY2xvc2VkCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2ZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkhUVFBSZXNwb25zZSBoYXMgbm8gZmlsZSB0byBnZXQgYSBmaWxlbm8gZnJvbSIpCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGYuX2ZwLCAiZmlsZW5vIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mcC5maWxlbm8oKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIlRoZSBmaWxlLWxpa2Ugb2JqZWN0IHRoaXMgSFRUUFJlc3BvbnNlIGlzIHdyYXBwZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJhcm91bmQgaGFzIG5vIGZpbGUgZGVzY3JpcHRvciIpCgogICAgZGVmIGZsdXNoKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2ZwIGlzIG5vdCBOb25lIGFuZCBoYXNhdHRyKHNlbGYuX2ZwLCAnZmx1c2gnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZwLmZsdXNoKCkKCiAgICBkZWYgcmVhZGFibGUoc2VsZik6CiAgICAgICAgIyBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgYGlvYCBtb2R1bGUgY29tcGF0aWJpbGl0eS4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByZWFkaW50byhzZWxmLCBiKToKICAgICAgICAjIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBgaW9gIG1vZHVsZSBjb21wYXRpYmlsaXR5LgogICAgICAgIHRlbXAgPSBzZWxmLnJlYWQobGVuKGIpKQogICAgICAgIGlmIGxlbih0ZW1wKSA9PSAwOgogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJbOmxlbih0ZW1wKV0gPSB0ZW1wCiAgICAgICAgICAgIHJldHVybiBsZW4odGVtcCkKCiAgICBkZWYgc3VwcG9ydHNfY2h1bmtlZF9yZWFkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVja3MgaWYgdGhlIHVuZGVybHlpbmcgZmlsZS1saWtlIG9iamVjdCBsb29rcyBsaWtlIGEKICAgICAgICBodHRwbGliLkhUVFBSZXNwb25zZSBvYmplY3QuIFdlIGRvIHRoaXMgYnkgdGVzdGluZyBmb3IgdGhlIGZwCiAgICAgICAgYXR0cmlidXRlLiBJZiBpdCBpcyBwcmVzZW50IHdlIGFzc3VtZSBpdCByZXR1cm5zIHJhdyBjaHVua3MgYXMKICAgICAgICBwcm9jZXNzZWQgYnkgcmVhZF9jaHVua2VkKCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fZnAsICdmcCcpCgogICAgZGVmIF91cGRhdGVfY2h1bmtfbGVuZ3RoKHNlbGYpOgogICAgICAgICMgRmlyc3QsIHdlJ2xsIGZpZ3VyZSBvdXQgbGVuZ3RoIG9mIGEgY2h1bmsgYW5kIHRoZW4KICAgICAgICAjIHdlJ2xsIHRyeSB0byByZWFkIGl0IGZyb20gc29ja2V0LgogICAgICAgIGlmIHNlbGYuY2h1bmtfbGVmdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbGluZSA9IHNlbGYuX2ZwLmZwLnJlYWRsaW5lKCkKICAgICAgICBsaW5lID0gbGluZS5zcGxpdChiJzsnLCAxKVswXQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gaW50KGxpbmUsIDE2KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIEludmFsaWQgY2h1bmtlZCBwcm90b2NvbCByZXNwb25zZSwgYWJvcnQuCiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICByYWlzZSBodHRwbGliLkluY29tcGxldGVSZWFkKGxpbmUpCgogICAgZGVmIF9oYW5kbGVfY2h1bmsoc2VsZiwgYW10KToKICAgICAgICByZXR1cm5lZF9jaHVuayA9IE5vbmUKICAgICAgICBpZiBhbXQgaXMgTm9uZToKICAgICAgICAgICAgY2h1bmsgPSBzZWxmLl9mcC5fc2FmZV9yZWFkKHNlbGYuY2h1bmtfbGVmdCkKICAgICAgICAgICAgcmV0dXJuZWRfY2h1bmsgPSBjaHVuawogICAgICAgICAgICBzZWxmLl9mcC5fc2FmZV9yZWFkKDIpICAjIFRvc3MgdGhlIENSTEYgYXQgdGhlIGVuZCBvZiB0aGUgY2h1bmsuCiAgICAgICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IE5vbmUKICAgICAgICBlbGlmIGFtdCA8IHNlbGYuY2h1bmtfbGVmdDoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9mcC5fc2FmZV9yZWFkKGFtdCkKICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gc2VsZi5jaHVua19sZWZ0IC0gYW10CiAgICAgICAgICAgIHJldHVybmVkX2NodW5rID0gdmFsdWUKICAgICAgICBlbGlmIGFtdCA9PSBzZWxmLmNodW5rX2xlZnQ6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZnAuX3NhZmVfcmVhZChhbXQpCiAgICAgICAgICAgIHNlbGYuX2ZwLl9zYWZlX3JlYWQoMikgICMgVG9zcyB0aGUgQ1JMRiBhdCB0aGUgZW5kIG9mIHRoZSBjaHVuay4KICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gTm9uZQogICAgICAgICAgICByZXR1cm5lZF9jaHVuayA9IHZhbHVlCiAgICAgICAgZWxzZTogICMgYW10ID4gc2VsZi5jaHVua19sZWZ0CiAgICAgICAgICAgIHJldHVybmVkX2NodW5rID0gc2VsZi5fZnAuX3NhZmVfcmVhZChzZWxmLmNodW5rX2xlZnQpCiAgICAgICAgICAgIHNlbGYuX2ZwLl9zYWZlX3JlYWQoMikgICMgVG9zcyB0aGUgQ1JMRiBhdCB0aGUgZW5kIG9mIHRoZSBjaHVuay4KICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gTm9uZQogICAgICAgIHJldHVybiByZXR1cm5lZF9jaHVuawoKICAgIGRlZiByZWFkX2NodW5rZWQoc2VsZiwgYW10PU5vbmUsIGRlY29kZV9jb250ZW50PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFNpbWlsYXIgdG8gOm1ldGg6YEhUVFBSZXNwb25zZS5yZWFkYCwgYnV0IHdpdGggYW4gYWRkaXRpb25hbAogICAgICAgIHBhcmFtZXRlcjogYGBkZWNvZGVfY29udGVudGBgLgoKICAgICAgICA6cGFyYW0gZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgICAgIElmIFRydWUsIHdpbGwgYXR0ZW1wdCB0byBkZWNvZGUgdGhlIGJvZHkgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICdjb250ZW50LWVuY29kaW5nJyBoZWFkZXIuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5faW5pdF9kZWNvZGVyKCkKICAgICAgICAjIEZJWE1FOiBSZXdyaXRlIHRoaXMgbWV0aG9kIGFuZCBtYWtlIGl0IGEgY2xhc3Mgd2l0aCBhIGJldHRlciBzdHJ1Y3R1cmVkIGxvZ2ljLgogICAgICAgIGlmIG5vdCBzZWxmLmNodW5rZWQ6CiAgICAgICAgICAgIHJhaXNlIFJlc3BvbnNlTm90Q2h1bmtlZCgKICAgICAgICAgICAgICAgICJSZXNwb25zZSBpcyBub3QgY2h1bmtlZC4gIgogICAgICAgICAgICAgICAgIkhlYWRlciAndHJhbnNmZXItZW5jb2Rpbmc6IGNodW5rZWQnIGlzIG1pc3NpbmcuIikKICAgICAgICBpZiBub3Qgc2VsZi5zdXBwb3J0c19jaHVua2VkX3JlYWRzKCk6CiAgICAgICAgICAgIHJhaXNlIEJvZHlOb3RIdHRwbGliQ29tcGF0aWJsZSgKICAgICAgICAgICAgICAgICJCb2R5IHNob3VsZCBiZSBodHRwbGliLkhUVFBSZXNwb25zZSBsaWtlLiAiCiAgICAgICAgICAgICAgICAiSXQgc2hvdWxkIGhhdmUgaGF2ZSBhbiBmcCBhdHRyaWJ1dGUgd2hpY2ggcmV0dXJucyByYXcgY2h1bmtzLiIpCgogICAgICAgICMgRG9uJ3QgYm90aGVyIHJlYWRpbmcgdGhlIGJvZHkgb2YgYSBIRUFEIHJlcXVlc3QuCiAgICAgICAgaWYgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UgYW5kIGlzX3Jlc3BvbnNlX3RvX2hlYWQoc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UpOgogICAgICAgICAgICBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZS5jbG9zZSgpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB3aXRoIHNlbGYuX2Vycm9yX2NhdGNoZXIoKToKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV9jaHVua19sZW5ndGgoKQogICAgICAgICAgICAgICAgaWYgc2VsZi5jaHVua19sZWZ0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGNodW5rID0gc2VsZi5faGFuZGxlX2NodW5rKGFtdCkKICAgICAgICAgICAgICAgIGRlY29kZWQgPSBzZWxmLl9kZWNvZGUoY2h1bmssIGRlY29kZV9jb250ZW50PWRlY29kZV9jb250ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaF9kZWNvZGVyPUZhbHNlKQogICAgICAgICAgICAgICAgaWYgZGVjb2RlZDoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBkZWNvZGVkCgogICAgICAgICAgICBpZiBkZWNvZGVfY29udGVudDoKICAgICAgICAgICAgICAgICMgT24gQ1B5dGhvbiBhbmQgUHlQeSwgd2Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gZmx1c2ggdGhlCiAgICAgICAgICAgICAgICAjIGRlY29kZXIuIEhvd2V2ZXIsIG9uIEp5dGhvbiB3ZSAqbWlnaHQqIG5lZWQgdG8sIHNvCiAgICAgICAgICAgICAgICAjIGxldHMgZGVmZW5zaXZlbHkgZG8gaXQgYW55d2F5LgogICAgICAgICAgICAgICAgZGVjb2RlZCA9IHNlbGYuX2ZsdXNoX2RlY29kZXIoKQogICAgICAgICAgICAgICAgaWYgZGVjb2RlZDogICMgUGxhdGZvcm0tc3BlY2lmaWM6IEp5dGhvbi4KICAgICAgICAgICAgICAgICAgICB5aWVsZCBkZWNvZGVkCgogICAgICAgICAgICAjIENodW5rIGNvbnRlbnQgZW5kcyB3aXRoIFxyXG46IGRpc2NhcmQgaXQuCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5fZnAuZnAucmVhZGxpbmUoKQogICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICAgICAgIyBTb21lIHNpdGVzIG1heSBub3QgZW5kIHdpdGggJ1xyXG4nLgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiBsaW5lID09IGInXHJcbic6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICMgV2UgcmVhZCBldmVyeXRoaW5nOyBjbG9zZSB0aGUgImZpbGUiLgogICAgICAgICAgICBpZiBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZToKICAgICAgICAgICAgICAgIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlLmNsb3NlKCkKUEsDBBQAAAAAAAAAIQBSdeG/FAQAABQEAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAojIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgcHJvdmlkZSBpbXBvcnRzIHRoYXQgdXNlZCB0byBiZSBoZXJlLgpmcm9tIC5jb25uZWN0aW9uIGltcG9ydCBpc19jb25uZWN0aW9uX2Ryb3BwZWQKZnJvbSAucmVxdWVzdCBpbXBvcnQgbWFrZV9oZWFkZXJzCmZyb20gLnJlc3BvbnNlIGltcG9ydCBpc19mcF9jbG9zZWQKZnJvbSAuc3NsXyBpbXBvcnQgKAogICAgU1NMQ29udGV4dCwKICAgIEhBU19TTkksCiAgICBJU19QWU9QRU5TU0wsCiAgICBJU19TRUNVUkVUUkFOU1BPUlQsCiAgICBhc3NlcnRfZmluZ2VycHJpbnQsCiAgICByZXNvbHZlX2NlcnRfcmVxcywKICAgIHJlc29sdmVfc3NsX3ZlcnNpb24sCiAgICBzc2xfd3JhcF9zb2NrZXQsCikKZnJvbSAudGltZW91dCBpbXBvcnQgKAogICAgY3VycmVudF90aW1lLAogICAgVGltZW91dCwKKQoKZnJvbSAucmV0cnkgaW1wb3J0IFJldHJ5CmZyb20gLnVybCBpbXBvcnQgKAogICAgZ2V0X2hvc3QsCiAgICBwYXJzZV91cmwsCiAgICBzcGxpdF9maXJzdCwKICAgIFVybCwKKQpmcm9tIC53YWl0IGltcG9ydCAoCiAgICB3YWl0X2Zvcl9yZWFkLAogICAgd2FpdF9mb3Jfd3JpdGUKKQoKX19hbGxfXyA9ICgKICAgICdIQVNfU05JJywKICAgICdJU19QWU9QRU5TU0wnLAogICAgJ0lTX1NFQ1VSRVRSQU5TUE9SVCcsCiAgICAnU1NMQ29udGV4dCcsCiAgICAnUmV0cnknLAogICAgJ1RpbWVvdXQnLAogICAgJ1VybCcsCiAgICAnYXNzZXJ0X2ZpbmdlcnByaW50JywKICAgICdjdXJyZW50X3RpbWUnLAogICAgJ2lzX2Nvbm5lY3Rpb25fZHJvcHBlZCcsCiAgICAnaXNfZnBfY2xvc2VkJywKICAgICdnZXRfaG9zdCcsCiAgICAncGFyc2VfdXJsJywKICAgICdtYWtlX2hlYWRlcnMnLAogICAgJ3Jlc29sdmVfY2VydF9yZXFzJywKICAgICdyZXNvbHZlX3NzbF92ZXJzaW9uJywKICAgICdzcGxpdF9maXJzdCcsCiAgICAnc3NsX3dyYXBfc29ja2V0JywKICAgICd3YWl0X2Zvcl9yZWFkJywKICAgICd3YWl0X2Zvcl93cml0ZScKKQpQSwMEFAAAAAAAAAAhAKufXz2NEAAAjRAAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9jb25uZWN0aW9uLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IHNvY2tldApmcm9tIC53YWl0IGltcG9ydCB3YWl0X2Zvcl9yZWFkCmZyb20gLnNlbGVjdG9ycyBpbXBvcnQgSEFTX1NFTEVDVCwgU2VsZWN0b3JFcnJvcgoKCmRlZiBpc19jb25uZWN0aW9uX2Ryb3BwZWQoY29ubik6ICAjIFBsYXRmb3JtLXNwZWNpZmljCiAgICAiIiIKICAgIFJldHVybnMgVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBkcm9wcGVkIGFuZCBzaG91bGQgYmUgY2xvc2VkLgoKICAgIDpwYXJhbSBjb25uOgogICAgICAgIDpjbGFzczpgaHR0cGxpYi5IVFRQQ29ubmVjdGlvbmAgb2JqZWN0LgoKICAgIE5vdGU6IEZvciBwbGF0Zm9ybXMgbGlrZSBBcHBFbmdpbmUsIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIGBgRmFsc2VgYCB0bwogICAgbGV0IHRoZSBwbGF0Zm9ybSBoYW5kbGUgY29ubmVjdGlvbiByZWN5Y2xpbmcgdHJhbnNwYXJlbnRseSBmb3IgdXMuCiAgICAiIiIKICAgIHNvY2sgPSBnZXRhdHRyKGNvbm4sICdzb2NrJywgRmFsc2UpCiAgICBpZiBzb2NrIGlzIEZhbHNlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQXBwRW5naW5lCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBzb2NrIGlzIE5vbmU6ICAjIENvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQgKHN1Y2ggYXMgYnkgaHR0cGxpYikuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBpZiBub3QgSEFTX1NFTEVDVDoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGJvb2wod2FpdF9mb3JfcmVhZChzb2NrLCB0aW1lb3V0PTAuMCkpCiAgICBleGNlcHQgU2VsZWN0b3JFcnJvcjoKICAgICAgICByZXR1cm4gVHJ1ZQoKCiMgVGhpcyBmdW5jdGlvbiBpcyBjb3BpZWQgZnJvbSBzb2NrZXQucHkgaW4gdGhlIFB5dGhvbiAyLjcgc3RhbmRhcmQKIyBsaWJyYXJ5IHRlc3Qgc3VpdGUuIEFkZGVkIHRvIGl0cyBzaWduYXR1cmUgaXMgb25seSBgc29ja2V0X29wdGlvbnNgLgojIE9uZSBhZGRpdGlvbmFsIG1vZGlmaWNhdGlvbiBpcyB0aGF0IHdlIGF2b2lkIGJpbmRpbmcgdG8gSVB2NiBzZXJ2ZXJzCiMgZGlzY292ZXJlZCBpbiBETlMgaWYgdGhlIHN5c3RlbSBkb2Vzbid0IGhhdmUgSVB2NiBmdW5jdGlvbmFsaXR5LgpkZWYgY3JlYXRlX2Nvbm5lY3Rpb24oYWRkcmVzcywgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsCiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz1Ob25lLCBzb2NrZXRfb3B0aW9ucz1Ob25lKToKICAgICIiIkNvbm5lY3QgdG8gKmFkZHJlc3MqIGFuZCByZXR1cm4gdGhlIHNvY2tldCBvYmplY3QuCgogICAgQ29udmVuaWVuY2UgZnVuY3Rpb24uICBDb25uZWN0IHRvICphZGRyZXNzKiAoYSAyLXR1cGxlIGBgKGhvc3QsCiAgICBwb3J0KWBgKSBhbmQgcmV0dXJuIHRoZSBzb2NrZXQgb2JqZWN0LiAgUGFzc2luZyB0aGUgb3B0aW9uYWwKICAgICp0aW1lb3V0KiBwYXJhbWV0ZXIgd2lsbCBzZXQgdGhlIHRpbWVvdXQgb24gdGhlIHNvY2tldCBpbnN0YW5jZQogICAgYmVmb3JlIGF0dGVtcHRpbmcgdG8gY29ubmVjdC4gIElmIG5vICp0aW1lb3V0KiBpcyBzdXBwbGllZCwgdGhlCiAgICBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IHNldHRpbmcgcmV0dXJuZWQgYnkgOmZ1bmM6YGdldGRlZmF1bHR0aW1lb3V0YAogICAgaXMgdXNlZC4gIElmICpzb3VyY2VfYWRkcmVzcyogaXMgc2V0IGl0IG11c3QgYmUgYSB0dXBsZSBvZiAoaG9zdCwgcG9ydCkKICAgIGZvciB0aGUgc29ja2V0IHRvIGJpbmQgYXMgYSBzb3VyY2UgYWRkcmVzcyBiZWZvcmUgbWFraW5nIHRoZSBjb25uZWN0aW9uLgogICAgQW4gaG9zdCBvZiAnJyBvciBwb3J0IDAgdGVsbHMgdGhlIE9TIHRvIHVzZSB0aGUgZGVmYXVsdC4KICAgICIiIgoKICAgIGhvc3QsIHBvcnQgPSBhZGRyZXNzCiAgICBpZiBob3N0LnN0YXJ0c3dpdGgoJ1snKToKICAgICAgICBob3N0ID0gaG9zdC5zdHJpcCgnW10nKQogICAgZXJyID0gTm9uZQoKICAgICMgVXNpbmcgdGhlIHZhbHVlIGZyb20gYWxsb3dlZF9nYWlfZmFtaWx5KCkgaW4gdGhlIGNvbnRleHQgb2YgZ2V0YWRkcmluZm8gbGV0cwogICAgIyB1cyBzZWxlY3Qgd2hldGhlciB0byB3b3JrIHdpdGggSVB2NCBETlMgcmVjb3JkcywgSVB2NiByZWNvcmRzLCBvciBib3RoLgogICAgIyBUaGUgb3JpZ2luYWwgY3JlYXRlX2Nvbm5lY3Rpb24gZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYWxsIHJlY29yZHMuCiAgICBmYW1pbHkgPSBhbGxvd2VkX2dhaV9mYW1pbHkoKQoKICAgIGZvciByZXMgaW4gc29ja2V0LmdldGFkZHJpbmZvKGhvc3QsIHBvcnQsIGZhbWlseSwgc29ja2V0LlNPQ0tfU1RSRUFNKToKICAgICAgICBhZiwgc29ja3R5cGUsIHByb3RvLCBjYW5vbm5hbWUsIHNhID0gcmVzCiAgICAgICAgc29jayA9IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KGFmLCBzb2NrdHlwZSwgcHJvdG8pCgogICAgICAgICAgICAjIElmIHByb3ZpZGVkLCBzZXQgc29ja2V0IGxldmVsIG9wdGlvbnMgYmVmb3JlIGNvbm5lY3RpbmcuCiAgICAgICAgICAgIF9zZXRfc29ja2V0X29wdGlvbnMoc29jaywgc29ja2V0X29wdGlvbnMpCgogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBzb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgICAgICBzb2NrLnNldHRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgaWYgc291cmNlX2FkZHJlc3M6CiAgICAgICAgICAgICAgICBzb2NrLmJpbmQoc291cmNlX2FkZHJlc3MpCiAgICAgICAgICAgIHNvY2suY29ubmVjdChzYSkKICAgICAgICAgICAgcmV0dXJuIHNvY2sKCiAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgogICAgICAgICAgICBlcnIgPSBlCiAgICAgICAgICAgIGlmIHNvY2sgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzb2NrLmNsb3NlKCkKICAgICAgICAgICAgICAgIHNvY2sgPSBOb25lCgogICAgaWYgZXJyIGlzIG5vdCBOb25lOgogICAgICAgIHJhaXNlIGVycgoKICAgIHJhaXNlIHNvY2tldC5lcnJvcigiZ2V0YWRkcmluZm8gcmV0dXJucyBhbiBlbXB0eSBsaXN0IikKCgpkZWYgX3NldF9zb2NrZXRfb3B0aW9ucyhzb2NrLCBvcHRpb25zKToKICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKICAgICAgICByZXR1cm4KCiAgICBmb3Igb3B0IGluIG9wdGlvbnM6CiAgICAgICAgc29jay5zZXRzb2Nrb3B0KCpvcHQpCgoKZGVmIGFsbG93ZWRfZ2FpX2ZhbWlseSgpOgogICAgIiIiVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byB3b3JrIGluIHRoZSBjb250ZXh0IG9mCiAgICBnZXRhZGRyaW5mbywgd2hlcmUgZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMgaXMgdGhlIGRlZmF1bHQgYW5kCiAgICB3aWxsIHBlcmZvcm0gYSBETlMgc2VhcmNoIGZvciBib3RoIElQdjYgYW5kIElQdjQgcmVjb3Jkcy4iIiIKCiAgICBmYW1pbHkgPSBzb2NrZXQuQUZfSU5FVAogICAgaWYgSEFTX0lQVjY6CiAgICAgICAgZmFtaWx5ID0gc29ja2V0LkFGX1VOU1BFQwogICAgcmV0dXJuIGZhbWlseQoKCmRlZiBfaGFzX2lwdjYoaG9zdCk6CiAgICAiIiIgUmV0dXJucyBUcnVlIGlmIHRoZSBzeXN0ZW0gY2FuIGJpbmQgYW4gSVB2NiBhZGRyZXNzLiAiIiIKICAgIHNvY2sgPSBOb25lCiAgICBoYXNfaXB2NiA9IEZhbHNlCgogICAgaWYgc29ja2V0Lmhhc19pcHY2OgogICAgICAgICMgaGFzX2lwdjYgcmV0dXJucyB0cnVlIGlmIGNQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggSVB2NiBzdXBwb3J0LgogICAgICAgICMgSXQgZG9lcyBub3QgdGVsbCB1cyBpZiB0aGUgc3lzdGVtIGhhcyBJUHY2IHN1cHBvcnQgZW5hYmxlZC4gVG8KICAgICAgICAjIGRldGVybWluZSB0aGF0IHdlIG11c3QgYmluZCB0byBhbiBJUHY2IGFkZHJlc3MuCiAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vc2hhem93L3VybGxpYjMvcHVsbC82MTEKICAgICAgICAjIGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlNjU4MzI3CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVDYpCiAgICAgICAgICAgIHNvY2suYmluZCgoaG9zdCwgMCkpCiAgICAgICAgICAgIGhhc19pcHY2ID0gVHJ1ZQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICBpZiBzb2NrOgogICAgICAgIHNvY2suY2xvc2UoKQogICAgcmV0dXJuIGhhc19pcHY2CgoKSEFTX0lQVjYgPSBfaGFzX2lwdjYoJzo6MScpClBLAwQUAAAAAAAAACEAQWGQ13kOAAB5DgAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JlcXVlc3QucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIGJhc2U2NCBpbXBvcnQgYjY0ZW5jb2RlCgpmcm9tIC4ucGFja2FnZXMuc2l4IGltcG9ydCBiLCBpbnRlZ2VyX3R5cGVzCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBVbnJld2luZGFibGVCb2R5RXJyb3IKCkFDQ0VQVF9FTkNPRElORyA9ICdnemlwLGRlZmxhdGUnCl9GQUlMRURURUxMID0gb2JqZWN0KCkKCgpkZWYgbWFrZV9oZWFkZXJzKGtlZXBfYWxpdmU9Tm9uZSwgYWNjZXB0X2VuY29kaW5nPU5vbmUsIHVzZXJfYWdlbnQ9Tm9uZSwKICAgICAgICAgICAgICAgICBiYXNpY19hdXRoPU5vbmUsIHByb3h5X2Jhc2ljX2F1dGg9Tm9uZSwgZGlzYWJsZV9jYWNoZT1Ob25lKToKICAgICIiIgogICAgU2hvcnRjdXRzIGZvciBnZW5lcmF0aW5nIHJlcXVlc3QgaGVhZGVycy4KCiAgICA6cGFyYW0ga2VlcF9hbGl2ZToKICAgICAgICBJZiBgYFRydWVgYCwgYWRkcyAnY29ubmVjdGlvbjoga2VlcC1hbGl2ZScgaGVhZGVyLgoKICAgIDpwYXJhbSBhY2NlcHRfZW5jb2Rpbmc6CiAgICAgICAgQ2FuIGJlIGEgYm9vbGVhbiwgbGlzdCwgb3Igc3RyaW5nLgogICAgICAgIGBgVHJ1ZWBgIHRyYW5zbGF0ZXMgdG8gJ2d6aXAsZGVmbGF0ZScuCiAgICAgICAgTGlzdCB3aWxsIGdldCBqb2luZWQgYnkgY29tbWEuCiAgICAgICAgU3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBwcm92aWRlZC4KCiAgICA6cGFyYW0gdXNlcl9hZ2VudDoKICAgICAgICBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB1c2VyLWFnZW50IHlvdSB3YW50LCBzdWNoIGFzCiAgICAgICAgInB5dGhvbi11cmxsaWIzLzAuNiIKCiAgICA6cGFyYW0gYmFzaWNfYXV0aDoKICAgICAgICBDb2xvbi1zZXBhcmF0ZWQgdXNlcm5hbWU6cGFzc3dvcmQgc3RyaW5nIGZvciAnYXV0aG9yaXphdGlvbjogYmFzaWMgLi4uJwogICAgICAgIGF1dGggaGVhZGVyLgoKICAgIDpwYXJhbSBwcm94eV9iYXNpY19hdXRoOgogICAgICAgIENvbG9uLXNlcGFyYXRlZCB1c2VybmFtZTpwYXNzd29yZCBzdHJpbmcgZm9yICdwcm94eS1hdXRob3JpemF0aW9uOiBiYXNpYyAuLi4nCiAgICAgICAgYXV0aCBoZWFkZXIuCgogICAgOnBhcmFtIGRpc2FibGVfY2FjaGU6CiAgICAgICAgSWYgYGBUcnVlYGAsIGFkZHMgJ2NhY2hlLWNvbnRyb2w6IG5vLWNhY2hlJyBoZWFkZXIuCgogICAgRXhhbXBsZTo6CgogICAgICAgID4+PiBtYWtlX2hlYWRlcnMoa2VlcF9hbGl2ZT1UcnVlLCB1c2VyX2FnZW50PSJCYXRtYW4vMS4wIikKICAgICAgICB7J2Nvbm5lY3Rpb24nOiAna2VlcC1hbGl2ZScsICd1c2VyLWFnZW50JzogJ0JhdG1hbi8xLjAnfQogICAgICAgID4+PiBtYWtlX2hlYWRlcnMoYWNjZXB0X2VuY29kaW5nPVRydWUpCiAgICAgICAgeydhY2NlcHQtZW5jb2RpbmcnOiAnZ3ppcCxkZWZsYXRlJ30KICAgICIiIgogICAgaGVhZGVycyA9IHt9CiAgICBpZiBhY2NlcHRfZW5jb2Rpbmc6CiAgICAgICAgaWYgaXNpbnN0YW5jZShhY2NlcHRfZW5jb2RpbmcsIHN0cik6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYWNjZXB0X2VuY29kaW5nLCBsaXN0KToKICAgICAgICAgICAgYWNjZXB0X2VuY29kaW5nID0gJywnLmpvaW4oYWNjZXB0X2VuY29kaW5nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFjY2VwdF9lbmNvZGluZyA9IEFDQ0VQVF9FTkNPRElORwogICAgICAgIGhlYWRlcnNbJ2FjY2VwdC1lbmNvZGluZyddID0gYWNjZXB0X2VuY29kaW5nCgogICAgaWYgdXNlcl9hZ2VudDoKICAgICAgICBoZWFkZXJzWyd1c2VyLWFnZW50J10gPSB1c2VyX2FnZW50CgogICAgaWYga2VlcF9hbGl2ZToKICAgICAgICBoZWFkZXJzWydjb25uZWN0aW9uJ10gPSAna2VlcC1hbGl2ZScKCiAgICBpZiBiYXNpY19hdXRoOgogICAgICAgIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9ICdCYXNpYyAnICsgXAogICAgICAgICAgICBiNjRlbmNvZGUoYihiYXNpY19hdXRoKSkuZGVjb2RlKCd1dGYtOCcpCgogICAgaWYgcHJveHlfYmFzaWNfYXV0aDoKICAgICAgICBoZWFkZXJzWydwcm94eS1hdXRob3JpemF0aW9uJ10gPSAnQmFzaWMgJyArIFwKICAgICAgICAgICAgYjY0ZW5jb2RlKGIocHJveHlfYmFzaWNfYXV0aCkpLmRlY29kZSgndXRmLTgnKQoKICAgIGlmIGRpc2FibGVfY2FjaGU6CiAgICAgICAgaGVhZGVyc1snY2FjaGUtY29udHJvbCddID0gJ25vLWNhY2hlJwoKICAgIHJldHVybiBoZWFkZXJzCgoKZGVmIHNldF9maWxlX3Bvc2l0aW9uKGJvZHksIHBvcyk6CiAgICAiIiIKICAgIElmIGEgcG9zaXRpb24gaXMgcHJvdmlkZWQsIG1vdmUgZmlsZSB0byB0aGF0IHBvaW50LgogICAgT3RoZXJ3aXNlLCB3ZSdsbCBhdHRlbXB0IHRvIHJlY29yZCBhIHBvc2l0aW9uIGZvciBmdXR1cmUgdXNlLgogICAgIiIiCiAgICBpZiBwb3MgaXMgbm90IE5vbmU6CiAgICAgICAgcmV3aW5kX2JvZHkoYm9keSwgcG9zKQogICAgZWxpZiBnZXRhdHRyKGJvZHksICd0ZWxsJywgTm9uZSkgaXMgbm90IE5vbmU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwb3MgPSBib2R5LnRlbGwoKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgICMgVGhpcyBkaWZmZXJlbnRpYXRlcyBmcm9tIE5vbmUsIGFsbG93aW5nIHVzIHRvIGNhdGNoCiAgICAgICAgICAgICMgYSBmYWlsZWQgYHRlbGwoKWAgbGF0ZXIgd2hlbiB0cnlpbmcgdG8gcmV3aW5kIHRoZSBib2R5LgogICAgICAgICAgICBwb3MgPSBfRkFJTEVEVEVMTAoKICAgIHJldHVybiBwb3MKCgpkZWYgcmV3aW5kX2JvZHkoYm9keSwgYm9keV9wb3MpOgogICAgIiIiCiAgICBBdHRlbXB0IHRvIHJld2luZCBib2R5IHRvIGEgY2VydGFpbiBwb3NpdGlvbi4KICAgIFByaW1hcmlseSB1c2VkIGZvciByZXF1ZXN0IHJlZGlyZWN0cyBhbmQgcmV0cmllcy4KCiAgICA6cGFyYW0gYm9keToKICAgICAgICBGaWxlLWxpa2Ugb2JqZWN0IHRoYXQgc3VwcG9ydHMgc2Vlay4KCiAgICA6cGFyYW0gaW50IHBvczoKICAgICAgICBQb3NpdGlvbiB0byBzZWVrIHRvIGluIGZpbGUuCiAgICAiIiIKICAgIGJvZHlfc2VlayA9IGdldGF0dHIoYm9keSwgJ3NlZWsnLCBOb25lKQogICAgaWYgYm9keV9zZWVrIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKGJvZHlfcG9zLCBpbnRlZ2VyX3R5cGVzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGJvZHlfc2Vlayhib2R5X3BvcykKICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICByYWlzZSBVbnJld2luZGFibGVCb2R5RXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmV3aW5kaW5nIHJlcXVlc3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvZHkgZm9yIHJlZGlyZWN0L3JldHJ5LiIpCiAgICBlbGlmIGJvZHlfcG9zIGlzIF9GQUlMRURURUxMOgogICAgICAgIHJhaXNlIFVucmV3aW5kYWJsZUJvZHlFcnJvcigiVW5hYmxlIHRvIHJlY29yZCBmaWxlIHBvc2l0aW9uIGZvciByZXdpbmRpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBib2R5IGR1cmluZyBhIHJlZGlyZWN0L3JldHJ5LiIpCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImJvZHlfcG9zIG11c3QgYmUgb2YgdHlwZSBpbnRlZ2VyLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGVhZCBpdCB3YXMgJXMuIiAlIHR5cGUoYm9keV9wb3MpKQpQSwMEFAAAAAAAAAAhAPQ5HJ8nCQAAJwkAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXNwb25zZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gLi5wYWNrYWdlcy5zaXgubW92ZXMgaW1wb3J0IGh0dHBfY2xpZW50IGFzIGh0dHBsaWIKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBIZWFkZXJQYXJzaW5nRXJyb3IKCgpkZWYgaXNfZnBfY2xvc2VkKG9iaik6CiAgICAiIiIKICAgIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gZmlsZS1saWtlIG9iamVjdCBpcyBjbG9zZWQuCgogICAgOnBhcmFtIG9iajoKICAgICAgICBUaGUgZmlsZS1saWtlIG9iamVjdCB0byBjaGVjay4KICAgICIiIgoKICAgIHRyeToKICAgICAgICAjIENoZWNrIGBpc2Nsb3NlZCgpYCBmaXJzdCwgaW4gY2FzZSBQeXRob24zIGRvZXNuJ3Qgc2V0IGBjbG9zZWRgLgogICAgICAgICMgR0ggSXNzdWUgIzkyOAogICAgICAgIHJldHVybiBvYmouaXNjbG9zZWQoKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgIyBDaGVjayB2aWEgdGhlIG9mZmljaWFsIGZpbGUtbGlrZS1vYmplY3Qgd2F5LgogICAgICAgIHJldHVybiBvYmouY2xvc2VkCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIENoZWNrIGlmIHRoZSBvYmplY3QgaXMgYSBjb250YWluZXIgZm9yIGFub3RoZXIgZmlsZS1saWtlIG9iamVjdCB0aGF0CiAgICAgICAgIyBnZXRzIHJlbGVhc2VkIG9uIGV4aGF1c3Rpb24gKGUuZy4gSFRUUFJlc3BvbnNlKS4KICAgICAgICByZXR1cm4gb2JqLmZwIGlzIE5vbmUKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgcmFpc2UgVmFsdWVFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIGZwIGlzIGNsb3NlZC4iKQoKCmRlZiBhc3NlcnRfaGVhZGVyX3BhcnNpbmcoaGVhZGVycyk6CiAgICAiIiIKICAgIEFzc2VydHMgd2hldGhlciBhbGwgaGVhZGVycyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHBhcnNlZC4KICAgIEV4dHJhY3RzIGVuY291bnRlcmVkIGVycm9ycyBmcm9tIHRoZSByZXN1bHQgb2YgcGFyc2luZyBoZWFkZXJzLgoKICAgIE9ubHkgd29ya3Mgb24gUHl0aG9uIDMuCgogICAgOnBhcmFtIGhlYWRlcnM6IEhlYWRlcnMgdG8gdmVyaWZ5LgogICAgOnR5cGUgaGVhZGVyczogYGh0dHBsaWIuSFRUUE1lc3NhZ2VgLgoKICAgIDpyYWlzZXMgdXJsbGliMy5leGNlcHRpb25zLkhlYWRlclBhcnNpbmdFcnJvcjoKICAgICAgICBJZiBwYXJzaW5nIGVycm9ycyBhcmUgZm91bmQuCiAgICAiIiIKCiAgICAjIFRoaXMgd2lsbCBmYWlsIHNpbGVudGx5IGlmIHdlIHBhc3MgaW4gdGhlIHdyb25nIGtpbmQgb2YgcGFyYW1ldGVyLgogICAgIyBUbyBtYWtlIGRlYnVnZ2luZyBlYXNpZXIgYWRkIGFuIGV4cGxpY2l0IGNoZWNrLgogICAgaWYgbm90IGlzaW5zdGFuY2UoaGVhZGVycywgaHR0cGxpYi5IVFRQTWVzc2FnZSk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBodHRwbGliLk1lc3NhZ2UsIGdvdCB7MH0uJy5mb3JtYXQoCiAgICAgICAgICAgIHR5cGUoaGVhZGVycykpKQoKICAgIGRlZmVjdHMgPSBnZXRhdHRyKGhlYWRlcnMsICdkZWZlY3RzJywgTm9uZSkKICAgIGdldF9wYXlsb2FkID0gZ2V0YXR0cihoZWFkZXJzLCAnZ2V0X3BheWxvYWQnLCBOb25lKQoKICAgIHVucGFyc2VkX2RhdGEgPSBOb25lCiAgICBpZiBnZXRfcGF5bG9hZDogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzLgogICAgICAgIHVucGFyc2VkX2RhdGEgPSBnZXRfcGF5bG9hZCgpCgogICAgaWYgZGVmZWN0cyBvciB1bnBhcnNlZF9kYXRhOgogICAgICAgIHJhaXNlIEhlYWRlclBhcnNpbmdFcnJvcihkZWZlY3RzPWRlZmVjdHMsIHVucGFyc2VkX2RhdGE9dW5wYXJzZWRfZGF0YSkKCgpkZWYgaXNfcmVzcG9uc2VfdG9faGVhZChyZXNwb25zZSk6CiAgICAiIiIKICAgIENoZWNrcyB3aGV0aGVyIHRoZSByZXF1ZXN0IG9mIGEgcmVzcG9uc2UgaGFzIGJlZW4gYSBIRUFELXJlcXVlc3QuCiAgICBIYW5kbGVzIHRoZSBxdWlya3Mgb2YgQXBwRW5naW5lLgoKICAgIDpwYXJhbSBjb25uOgogICAgOnR5cGUgY29ubjogOmNsYXNzOmBodHRwbGliLkhUVFBSZXNwb25zZWAKICAgICIiIgogICAgIyBGSVhNRTogQ2FuIHdlIGRvIHRoaXMgc29tZWhvdyB3aXRob3V0IGFjY2Vzc2luZyBwcml2YXRlIGh0dHBsaWIgX21ldGhvZD8KICAgIG1ldGhvZCA9IHJlc3BvbnNlLl9tZXRob2QKICAgIGlmIGlzaW5zdGFuY2UobWV0aG9kLCBpbnQpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQXBwZW5naW5lCiAgICAgICAgcmV0dXJuIG1ldGhvZCA9PSAzCiAgICByZXR1cm4gbWV0aG9kLnVwcGVyKCkgPT0gJ0hFQUQnClBLAwQUAAAAAAAAACEAPWHv2wk5AAAJOQAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JldHJ5LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IHRpbWUKaW1wb3J0IGxvZ2dpbmcKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQpmcm9tIGl0ZXJ0b29scyBpbXBvcnQgdGFrZXdoaWxlCmltcG9ydCBlbWFpbAppbXBvcnQgcmUKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCAoCiAgICBDb25uZWN0VGltZW91dEVycm9yLAogICAgTWF4UmV0cnlFcnJvciwKICAgIFByb3RvY29sRXJyb3IsCiAgICBSZWFkVGltZW91dEVycm9yLAogICAgUmVzcG9uc2VFcnJvciwKICAgIEludmFsaWRIZWFkZXIsCikKZnJvbSAuLnBhY2thZ2VzIGltcG9ydCBzaXgKCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCiMgRGF0YSBzdHJ1Y3R1cmUgZm9yIHJlcHJlc2VudGluZyB0aGUgbWV0YWRhdGEgb2YgcmVxdWVzdHMgdGhhdCByZXN1bHQgaW4gYSByZXRyeS4KUmVxdWVzdEhpc3RvcnkgPSBuYW1lZHR1cGxlKCdSZXF1ZXN0SGlzdG9yeScsIFsibWV0aG9kIiwgInVybCIsICJlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1cyIsICJyZWRpcmVjdF9sb2NhdGlvbiJdKQoKCmNsYXNzIFJldHJ5KG9iamVjdCk6CiAgICAiIiIgUmV0cnkgY29uZmlndXJhdGlvbi4KCiAgICBFYWNoIHJldHJ5IGF0dGVtcHQgd2lsbCBjcmVhdGUgYSBuZXcgUmV0cnkgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMsIHNvCiAgICB0aGV5IGNhbiBiZSBzYWZlbHkgcmV1c2VkLgoKICAgIFJldHJpZXMgY2FuIGJlIGRlZmluZWQgYXMgYSBkZWZhdWx0IGZvciBhIHBvb2w6OgoKICAgICAgICByZXRyaWVzID0gUmV0cnkoY29ubmVjdD01LCByZWFkPTIsIHJlZGlyZWN0PTUpCiAgICAgICAgaHR0cCA9IFBvb2xNYW5hZ2VyKHJldHJpZXM9cmV0cmllcykKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nKQoKICAgIE9yIHBlci1yZXF1ZXN0ICh3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBwb29sKTo6CgogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLycsIHJldHJpZXM9UmV0cnkoMTApKQoKICAgIFJldHJpZXMgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgYGBGYWxzZWBgOjoKCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vJywgcmV0cmllcz1GYWxzZSkKCiAgICBFcnJvcnMgd2lsbCBiZSB3cmFwcGVkIGluIDpjbGFzczpgfnVybGxpYjMuZXhjZXB0aW9ucy5NYXhSZXRyeUVycm9yYCB1bmxlc3MKICAgIHJldHJpZXMgYXJlIGRpc2FibGVkLCBpbiB3aGljaCBjYXNlIHRoZSBjYXVzaW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC4KCiAgICA6cGFyYW0gaW50IHRvdGFsOgogICAgICAgIFRvdGFsIG51bWJlciBvZiByZXRyaWVzIHRvIGFsbG93LiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgb3RoZXIgY291bnRzLgoKICAgICAgICBTZXQgdG8gYGBOb25lYGAgdG8gcmVtb3ZlIHRoaXMgY29uc3RyYWludCBhbmQgZmFsbCBiYWNrIG9uIG90aGVyCiAgICAgICAgY291bnRzLiBJdCdzIGEgZ29vZCBpZGVhIHRvIHNldCB0aGlzIHRvIHNvbWUgc2Vuc2libHktaGlnaCB2YWx1ZSB0bwogICAgICAgIGFjY291bnQgZm9yIHVuZXhwZWN0ZWQgZWRnZSBjYXNlcyBhbmQgYXZvaWQgaW5maW5pdGUgcmV0cnkgbG9vcHMuCgogICAgICAgIFNldCB0byBgYDBgYCB0byBmYWlsIG9uIHRoZSBmaXJzdCByZXRyeS4KCiAgICAgICAgU2V0IHRvIGBgRmFsc2VgYCB0byBkaXNhYmxlIGFuZCBpbXBseSBgYHJhaXNlX29uX3JlZGlyZWN0PUZhbHNlYGAuCgogICAgOnBhcmFtIGludCBjb25uZWN0OgogICAgICAgIEhvdyBtYW55IGNvbm5lY3Rpb24tcmVsYXRlZCBlcnJvcnMgdG8gcmV0cnkgb24uCgogICAgICAgIFRoZXNlIGFyZSBlcnJvcnMgcmFpc2VkIGJlZm9yZSB0aGUgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSByZW1vdGUgc2VydmVyLAogICAgICAgIHdoaWNoIHdlIGFzc3VtZSBoYXMgbm90IHRyaWdnZXJlZCB0aGUgc2VydmVyIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuCgogICAgICAgIFNldCB0byBgYDBgYCB0byBmYWlsIG9uIHRoZSBmaXJzdCByZXRyeSBvZiB0aGlzIHR5cGUuCgogICAgOnBhcmFtIGludCByZWFkOgogICAgICAgIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IG9uIHJlYWQgZXJyb3JzLgoKICAgICAgICBUaGVzZSBlcnJvcnMgYXJlIHJhaXNlZCBhZnRlciB0aGUgcmVxdWVzdCB3YXMgc2VudCB0byB0aGUgc2VydmVyLCBzbyB0aGUKICAgICAgICByZXF1ZXN0IG1heSBoYXZlIHNpZGUtZWZmZWN0cy4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5IG9mIHRoaXMgdHlwZS4KCiAgICA6cGFyYW0gaW50IHJlZGlyZWN0OgogICAgICAgIEhvdyBtYW55IHJlZGlyZWN0cyB0byBwZXJmb3JtLiBMaW1pdCB0aGlzIHRvIGF2b2lkIGluZmluaXRlIHJlZGlyZWN0CiAgICAgICAgbG9vcHMuCgogICAgICAgIEEgcmVkaXJlY3QgaXMgYSBIVFRQIHJlc3BvbnNlIHdpdGggYSBzdGF0dXMgY29kZSAzMDEsIDMwMiwgMzAzLCAzMDcgb3IKICAgICAgICAzMDguCgogICAgICAgIFNldCB0byBgYDBgYCB0byBmYWlsIG9uIHRoZSBmaXJzdCByZXRyeSBvZiB0aGlzIHR5cGUuCgogICAgICAgIFNldCB0byBgYEZhbHNlYGAgdG8gZGlzYWJsZSBhbmQgaW1wbHkgYGByYWlzZV9vbl9yZWRpcmVjdD1GYWxzZWBgLgoKICAgIDpwYXJhbSBpbnQgc3RhdHVzOgogICAgICAgIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IG9uIGJhZCBzdGF0dXMgY29kZXMuCgogICAgICAgIFRoZXNlIGFyZSByZXRyaWVzIG1hZGUgb24gcmVzcG9uc2VzLCB3aGVyZSBzdGF0dXMgY29kZSBtYXRjaGVzCiAgICAgICAgYGBzdGF0dXNfZm9yY2VsaXN0YGAuCgogICAgICAgIFNldCB0byBgYDBgYCB0byBmYWlsIG9uIHRoZSBmaXJzdCByZXRyeSBvZiB0aGlzIHR5cGUuCgogICAgOnBhcmFtIGl0ZXJhYmxlIG1ldGhvZF93aGl0ZWxpc3Q6CiAgICAgICAgU2V0IG9mIHVwcGVyY2FzZWQgSFRUUCBtZXRob2QgdmVyYnMgdGhhdCB3ZSBzaG91bGQgcmV0cnkgb24uCgogICAgICAgIEJ5IGRlZmF1bHQsIHdlIG9ubHkgcmV0cnkgb24gbWV0aG9kcyB3aGljaCBhcmUgY29uc2lkZXJlZCB0byBiZQogICAgICAgIGlkZW1wb3RlbnQgKG11bHRpcGxlIHJlcXVlc3RzIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBlbmQgd2l0aCB0aGUKICAgICAgICBzYW1lIHN0YXRlKS4gU2VlIDphdHRyOmBSZXRyeS5ERUZBVUxUX01FVEhPRF9XSElURUxJU1RgLgoKICAgICAgICBTZXQgdG8gYSBgYEZhbHNlYGAgdmFsdWUgdG8gcmV0cnkgb24gYW55IHZlcmIuCgogICAgOnBhcmFtIGl0ZXJhYmxlIHN0YXR1c19mb3JjZWxpc3Q6CiAgICAgICAgQSBzZXQgb2YgaW50ZWdlciBIVFRQIHN0YXR1cyBjb2RlcyB0aGF0IHdlIHNob3VsZCBmb3JjZSBhIHJldHJ5IG9uLgogICAgICAgIEEgcmV0cnkgaXMgaW5pdGlhdGVkIGlmIHRoZSByZXF1ZXN0IG1ldGhvZCBpcyBpbiBgYG1ldGhvZF93aGl0ZWxpc3RgYAogICAgICAgIGFuZCB0aGUgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgaXMgaW4gYGBzdGF0dXNfZm9yY2VsaXN0YGAuCgogICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgaXMgZGlzYWJsZWQgd2l0aCBgYE5vbmVgYC4KCiAgICA6cGFyYW0gZmxvYXQgYmFja29mZl9mYWN0b3I6CiAgICAgICAgQSBiYWNrb2ZmIGZhY3RvciB0byBhcHBseSBiZXR3ZWVuIGF0dGVtcHRzIGFmdGVyIHRoZSBzZWNvbmQgdHJ5CiAgICAgICAgKG1vc3QgZXJyb3JzIGFyZSByZXNvbHZlZCBpbW1lZGlhdGVseSBieSBhIHNlY29uZCB0cnkgd2l0aG91dCBhCiAgICAgICAgZGVsYXkpLiB1cmxsaWIzIHdpbGwgc2xlZXAgZm9yOjoKCiAgICAgICAgICAgIHtiYWNrb2ZmIGZhY3Rvcn0gKiAoMiBeICh7bnVtYmVyIG9mIHRvdGFsIHJldHJpZXN9IC0gMSkpCgogICAgICAgIHNlY29uZHMuIElmIHRoZSBiYWNrb2ZmX2ZhY3RvciBpcyAwLjEsIHRoZW4gOmZ1bmM6YC5zbGVlcGAgd2lsbCBzbGVlcAogICAgICAgIGZvciBbMC4wcywgMC4ycywgMC40cywgLi4uXSBiZXR3ZWVuIHJldHJpZXMuIEl0IHdpbGwgbmV2ZXIgYmUgbG9uZ2VyCiAgICAgICAgdGhhbiA6YXR0cjpgUmV0cnkuQkFDS09GRl9NQVhgLgoKICAgICAgICBCeSBkZWZhdWx0LCBiYWNrb2ZmIGlzIGRpc2FibGVkIChzZXQgdG8gMCkuCgogICAgOnBhcmFtIGJvb2wgcmFpc2Vfb25fcmVkaXJlY3Q6IFdoZXRoZXIsIGlmIHRoZSBudW1iZXIgb2YgcmVkaXJlY3RzIGlzCiAgICAgICAgZXhoYXVzdGVkLCB0byByYWlzZSBhIE1heFJldHJ5RXJyb3IsIG9yIHRvIHJldHVybiBhIHJlc3BvbnNlIHdpdGggYQogICAgICAgIHJlc3BvbnNlIGNvZGUgaW4gdGhlIDN4eCByYW5nZS4KCiAgICA6cGFyYW0gYm9vbCByYWlzZV9vbl9zdGF0dXM6IFNpbWlsYXIgbWVhbmluZyB0byBgYHJhaXNlX29uX3JlZGlyZWN0YGA6CiAgICAgICAgd2hldGhlciB3ZSBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uLCBvciByZXR1cm4gYSByZXNwb25zZSwKICAgICAgICBpZiBzdGF0dXMgZmFsbHMgaW4gYGBzdGF0dXNfZm9yY2VsaXN0YGAgcmFuZ2UgYW5kIHJldHJpZXMgaGF2ZQogICAgICAgIGJlZW4gZXhoYXVzdGVkLgoKICAgIDpwYXJhbSB0dXBsZSBoaXN0b3J5OiBUaGUgaGlzdG9yeSBvZiB0aGUgcmVxdWVzdCBlbmNvdW50ZXJlZCBkdXJpbmcKICAgICAgICBlYWNoIGNhbGwgdG8gOm1ldGg6YH5SZXRyeS5pbmNyZW1lbnRgLiBUaGUgbGlzdCBpcyBpbiB0aGUgb3JkZXIKICAgICAgICB0aGUgcmVxdWVzdHMgb2NjdXJyZWQuIEVhY2ggbGlzdCBpdGVtIGlzIG9mIGNsYXNzIDpjbGFzczpgUmVxdWVzdEhpc3RvcnlgLgoKICAgIDpwYXJhbSBib29sIHJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyOgogICAgICAgIFdoZXRoZXIgdG8gcmVzcGVjdCBSZXRyeS1BZnRlciBoZWFkZXIgb24gc3RhdHVzIGNvZGVzIGRlZmluZWQgYXMKICAgICAgICA6YXR0cjpgUmV0cnkuUkVUUllfQUZURVJfU1RBVFVTX0NPREVTYCBvciBub3QuCgogICAgIiIiCgogICAgREVGQVVMVF9NRVRIT0RfV0hJVEVMSVNUID0gZnJvemVuc2V0KFsKICAgICAgICAnSEVBRCcsICdHRVQnLCAnUFVUJywgJ0RFTEVURScsICdPUFRJT05TJywgJ1RSQUNFJ10pCgogICAgUkVUUllfQUZURVJfU1RBVFVTX0NPREVTID0gZnJvemVuc2V0KFs0MTMsIDQyOSwgNTAzXSkKCiAgICAjOiBNYXhpbXVtIGJhY2tvZmYgdGltZS4KICAgIEJBQ0tPRkZfTUFYID0gMTIwCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdGFsPTEwLCBjb25uZWN0PU5vbmUsIHJlYWQ9Tm9uZSwgcmVkaXJlY3Q9Tm9uZSwgc3RhdHVzPU5vbmUsCiAgICAgICAgICAgICAgICAgbWV0aG9kX3doaXRlbGlzdD1ERUZBVUxUX01FVEhPRF9XSElURUxJU1QsIHN0YXR1c19mb3JjZWxpc3Q9Tm9uZSwKICAgICAgICAgICAgICAgICBiYWNrb2ZmX2ZhY3Rvcj0wLCByYWlzZV9vbl9yZWRpcmVjdD1UcnVlLCByYWlzZV9vbl9zdGF0dXM9VHJ1ZSwKICAgICAgICAgICAgICAgICBoaXN0b3J5PU5vbmUsIHJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyPVRydWUpOgoKICAgICAgICBzZWxmLnRvdGFsID0gdG90YWwKICAgICAgICBzZWxmLmNvbm5lY3QgPSBjb25uZWN0CiAgICAgICAgc2VsZi5yZWFkID0gcmVhZAogICAgICAgIHNlbGYuc3RhdHVzID0gc3RhdHVzCgogICAgICAgIGlmIHJlZGlyZWN0IGlzIEZhbHNlIG9yIHRvdGFsIGlzIEZhbHNlOgogICAgICAgICAgICByZWRpcmVjdCA9IDAKICAgICAgICAgICAgcmFpc2Vfb25fcmVkaXJlY3QgPSBGYWxzZQoKICAgICAgICBzZWxmLnJlZGlyZWN0ID0gcmVkaXJlY3QKICAgICAgICBzZWxmLnN0YXR1c19mb3JjZWxpc3QgPSBzdGF0dXNfZm9yY2VsaXN0IG9yIHNldCgpCiAgICAgICAgc2VsZi5tZXRob2Rfd2hpdGVsaXN0ID0gbWV0aG9kX3doaXRlbGlzdAogICAgICAgIHNlbGYuYmFja29mZl9mYWN0b3IgPSBiYWNrb2ZmX2ZhY3RvcgogICAgICAgIHNlbGYucmFpc2Vfb25fcmVkaXJlY3QgPSByYWlzZV9vbl9yZWRpcmVjdAogICAgICAgIHNlbGYucmFpc2Vfb25fc3RhdHVzID0gcmFpc2Vfb25fc3RhdHVzCiAgICAgICAgc2VsZi5oaXN0b3J5ID0gaGlzdG9yeSBvciB0dXBsZSgpCiAgICAgICAgc2VsZi5yZXNwZWN0X3JldHJ5X2FmdGVyX2hlYWRlciA9IHJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyCgogICAgZGVmIG5ldyhzZWxmLCAqKmt3KToKICAgICAgICBwYXJhbXMgPSBkaWN0KAogICAgICAgICAgICB0b3RhbD1zZWxmLnRvdGFsLAogICAgICAgICAgICBjb25uZWN0PXNlbGYuY29ubmVjdCwgcmVhZD1zZWxmLnJlYWQsIHJlZGlyZWN0PXNlbGYucmVkaXJlY3QsIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgICAgICAgICAgbWV0aG9kX3doaXRlbGlzdD1zZWxmLm1ldGhvZF93aGl0ZWxpc3QsCiAgICAgICAgICAgIHN0YXR1c19mb3JjZWxpc3Q9c2VsZi5zdGF0dXNfZm9yY2VsaXN0LAogICAgICAgICAgICBiYWNrb2ZmX2ZhY3Rvcj1zZWxmLmJhY2tvZmZfZmFjdG9yLAogICAgICAgICAgICByYWlzZV9vbl9yZWRpcmVjdD1zZWxmLnJhaXNlX29uX3JlZGlyZWN0LAogICAgICAgICAgICByYWlzZV9vbl9zdGF0dXM9c2VsZi5yYWlzZV9vbl9zdGF0dXMsCiAgICAgICAgICAgIGhpc3Rvcnk9c2VsZi5oaXN0b3J5LAogICAgICAgICkKICAgICAgICBwYXJhbXMudXBkYXRlKGt3KQogICAgICAgIHJldHVybiB0eXBlKHNlbGYpKCoqcGFyYW1zKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21faW50KGNscywgcmV0cmllcywgcmVkaXJlY3Q9VHJ1ZSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAiIiIgQmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZm9yIHRoZSBvbGQgcmV0cmllcyBmb3JtYXQuIiIiCiAgICAgICAgaWYgcmV0cmllcyBpcyBOb25lOgogICAgICAgICAgICByZXRyaWVzID0gZGVmYXVsdCBpZiBkZWZhdWx0IGlzIG5vdCBOb25lIGVsc2UgY2xzLkRFRkFVTFQKCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXRyaWVzLCBSZXRyeSk6CiAgICAgICAgICAgIHJldHVybiByZXRyaWVzCgogICAgICAgIHJlZGlyZWN0ID0gYm9vbChyZWRpcmVjdCkgYW5kIE5vbmUKICAgICAgICBuZXdfcmV0cmllcyA9IGNscyhyZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCkKICAgICAgICBsb2cuZGVidWcoIkNvbnZlcnRlZCByZXRyaWVzIHZhbHVlOiAlciAtPiAlciIsIHJldHJpZXMsIG5ld19yZXRyaWVzKQogICAgICAgIHJldHVybiBuZXdfcmV0cmllcwoKICAgIGRlZiBnZXRfYmFja29mZl90aW1lKHNlbGYpOgogICAgICAgICIiIiBGb3JtdWxhIGZvciBjb21wdXRpbmcgdGhlIGN1cnJlbnQgYmFja29mZgoKICAgICAgICA6cnR5cGU6IGZsb2F0CiAgICAgICAgIiIiCiAgICAgICAgIyBXZSB3YW50IHRvIGNvbnNpZGVyIG9ubHkgdGhlIGxhc3QgY29uc2VjdXRpdmUgZXJyb3JzIHNlcXVlbmNlIChJZ25vcmUgcmVkaXJlY3RzKS4KICAgICAgICBjb25zZWN1dGl2ZV9lcnJvcnNfbGVuID0gbGVuKGxpc3QodGFrZXdoaWxlKGxhbWJkYSB4OiB4LnJlZGlyZWN0X2xvY2F0aW9uIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlZChzZWxmLmhpc3RvcnkpKSkpCiAgICAgICAgaWYgY29uc2VjdXRpdmVfZXJyb3JzX2xlbiA8PSAxOgogICAgICAgICAgICByZXR1cm4gMAoKICAgICAgICBiYWNrb2ZmX3ZhbHVlID0gc2VsZi5iYWNrb2ZmX2ZhY3RvciAqICgyICoqIChjb25zZWN1dGl2ZV9lcnJvcnNfbGVuIC0gMSkpCiAgICAgICAgcmV0dXJuIG1pbihzZWxmLkJBQ0tPRkZfTUFYLCBiYWNrb2ZmX3ZhbHVlKQoKICAgIGRlZiBwYXJzZV9yZXRyeV9hZnRlcihzZWxmLCByZXRyeV9hZnRlcik6CiAgICAgICAgIyBXaGl0ZXNwYWNlOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi40CiAgICAgICAgaWYgcmUubWF0Y2gociJeXHMqWzAtOV0rXHMqJCIsIHJldHJ5X2FmdGVyKToKICAgICAgICAgICAgc2Vjb25kcyA9IGludChyZXRyeV9hZnRlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXRyeV9kYXRlX3R1cGxlID0gZW1haWwudXRpbHMucGFyc2VkYXRlKHJldHJ5X2FmdGVyKQogICAgICAgICAgICBpZiByZXRyeV9kYXRlX3R1cGxlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyKCJJbnZhbGlkIFJldHJ5LUFmdGVyIGhlYWRlcjogJXMiICUgcmV0cnlfYWZ0ZXIpCiAgICAgICAgICAgIHJldHJ5X2RhdGUgPSB0aW1lLm1rdGltZShyZXRyeV9kYXRlX3R1cGxlKQogICAgICAgICAgICBzZWNvbmRzID0gcmV0cnlfZGF0ZSAtIHRpbWUudGltZSgpCgogICAgICAgIGlmIHNlY29uZHMgPCAwOgogICAgICAgICAgICBzZWNvbmRzID0gMAoKICAgICAgICByZXR1cm4gc2Vjb25kcwoKICAgIGRlZiBnZXRfcmV0cnlfYWZ0ZXIoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgICIiIiBHZXQgdGhlIHZhbHVlIG9mIFJldHJ5LUFmdGVyIGluIHNlY29uZHMuICIiIgoKICAgICAgICByZXRyeV9hZnRlciA9IHJlc3BvbnNlLmdldGhlYWRlcigiUmV0cnktQWZ0ZXIiKQoKICAgICAgICBpZiByZXRyeV9hZnRlciBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9yZXRyeV9hZnRlcihyZXRyeV9hZnRlcikKCiAgICBkZWYgc2xlZXBfZm9yX3JldHJ5KHNlbGYsIHJlc3BvbnNlPU5vbmUpOgogICAgICAgIHJldHJ5X2FmdGVyID0gc2VsZi5nZXRfcmV0cnlfYWZ0ZXIocmVzcG9uc2UpCiAgICAgICAgaWYgcmV0cnlfYWZ0ZXI6CiAgICAgICAgICAgIHRpbWUuc2xlZXAocmV0cnlfYWZ0ZXIpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfc2xlZXBfYmFja29mZihzZWxmKToKICAgICAgICBiYWNrb2ZmID0gc2VsZi5nZXRfYmFja29mZl90aW1lKCkKICAgICAgICBpZiBiYWNrb2ZmIDw9IDA6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRpbWUuc2xlZXAoYmFja29mZikKCiAgICBkZWYgc2xlZXAoc2VsZiwgcmVzcG9uc2U9Tm9uZSk6CiAgICAgICAgIiIiIFNsZWVwIGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMuCgogICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgcmVzcGVjdCBhIHNlcnZlcidzIGBgUmV0cnktQWZ0ZXJgYCByZXNwb25zZSBoZWFkZXIKICAgICAgICBhbmQgc2xlZXAgdGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1lIHJlcXVlc3RlZC4gSWYgdGhhdCBpcyBub3QgcHJlc2VudCwgaXQKICAgICAgICB3aWxsIHVzZSBhbiBleHBvbmVudGlhbCBiYWNrb2ZmLiBCeSBkZWZhdWx0LCB0aGUgYmFja29mZiBmYWN0b3IgaXMgMCBhbmQKICAgICAgICB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4KICAgICAgICAiIiIKCiAgICAgICAgaWYgcmVzcG9uc2U6CiAgICAgICAgICAgIHNsZXB0ID0gc2VsZi5zbGVlcF9mb3JfcmV0cnkocmVzcG9uc2UpCiAgICAgICAgICAgIGlmIHNsZXB0OgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuX3NsZWVwX2JhY2tvZmYoKQoKICAgIGRlZiBfaXNfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlcnIpOgogICAgICAgICIiIiBFcnJvcnMgd2hlbiB3ZSdyZSBmYWlybHkgc3VyZSB0aGF0IHRoZSBzZXJ2ZXIgZGlkIG5vdCByZWNlaXZlIHRoZQogICAgICAgIHJlcXVlc3QsIHNvIGl0IHNob3VsZCBiZSBzYWZlIHRvIHJldHJ5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKGVyciwgQ29ubmVjdFRpbWVvdXRFcnJvcikKCiAgICBkZWYgX2lzX3JlYWRfZXJyb3Ioc2VsZiwgZXJyKToKICAgICAgICAiIiIgRXJyb3JzIHRoYXQgb2NjdXIgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc3RhcnRlZCwgc28gd2Ugc2hvdWxkCiAgICAgICAgYXNzdW1lIHRoYXQgdGhlIHNlcnZlciBiZWdhbiBwcm9jZXNzaW5nIGl0LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKGVyciwgKFJlYWRUaW1lb3V0RXJyb3IsIFByb3RvY29sRXJyb3IpKQoKICAgIGRlZiBfaXNfbWV0aG9kX3JldHJ5YWJsZShzZWxmLCBtZXRob2QpOgogICAgICAgICIiIiBDaGVja3MgaWYgYSBnaXZlbiBIVFRQIG1ldGhvZCBzaG91bGQgYmUgcmV0cmllZCB1cG9uLCBkZXBlbmRpbmcgaWYKICAgICAgICBpdCBpcyBpbmNsdWRlZCBvbiB0aGUgbWV0aG9kIHdoaXRlbGlzdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLm1ldGhvZF93aGl0ZWxpc3QgYW5kIG1ldGhvZC51cHBlcigpIG5vdCBpbiBzZWxmLm1ldGhvZF93aGl0ZWxpc3Q6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBpc19yZXRyeShzZWxmLCBtZXRob2QsIHN0YXR1c19jb2RlLCBoYXNfcmV0cnlfYWZ0ZXI9RmFsc2UpOgogICAgICAgICIiIiBJcyB0aGlzIG1ldGhvZC9zdGF0dXMgY29kZSByZXRyeWFibGU/IChCYXNlZCBvbiB3aGl0ZWxpc3RzIGFuZCBjb250cm9sCiAgICAgICAgdmFyaWFibGVzIHN1Y2ggYXMgdGhlIG51bWJlciBvZiB0b3RhbCByZXRyaWVzIHRvIGFsbG93LCB3aGV0aGVyIHRvCiAgICAgICAgcmVzcGVjdCB0aGUgUmV0cnktQWZ0ZXIgaGVhZGVyLCB3aGV0aGVyIHRoaXMgaGVhZGVyIGlzIHByZXNlbnQsIGFuZAogICAgICAgIHdoZXRoZXIgdGhlIHJldHVybmVkIHN0YXR1cyBjb2RlIGlzIG9uIHRoZSBsaXN0IG9mIHN0YXR1cyBjb2RlcyB0bwogICAgICAgIGJlIHJldHJpZWQgdXBvbiBvbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIGFmb3JlbWVudGlvbmVkIGhlYWRlcikKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5faXNfbWV0aG9kX3JldHJ5YWJsZShtZXRob2QpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgaWYgc2VsZi5zdGF0dXNfZm9yY2VsaXN0IGFuZCBzdGF0dXNfY29kZSBpbiBzZWxmLnN0YXR1c19mb3JjZWxpc3Q6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiAoc2VsZi50b3RhbCBhbmQgc2VsZi5yZXNwZWN0X3JldHJ5X2FmdGVyX2hlYWRlciBhbmQKICAgICAgICAgICAgICAgIGhhc19yZXRyeV9hZnRlciBhbmQgKHN0YXR1c19jb2RlIGluIHNlbGYuUkVUUllfQUZURVJfU1RBVFVTX0NPREVTKSkKCiAgICBkZWYgaXNfZXhoYXVzdGVkKHNlbGYpOgogICAgICAgICIiIiBBcmUgd2Ugb3V0IG9mIHJldHJpZXM/ICIiIgogICAgICAgIHJldHJ5X2NvdW50cyA9IChzZWxmLnRvdGFsLCBzZWxmLmNvbm5lY3QsIHNlbGYucmVhZCwgc2VsZi5yZWRpcmVjdCwgc2VsZi5zdGF0dXMpCiAgICAgICAgcmV0cnlfY291bnRzID0gbGlzdChmaWx0ZXIoTm9uZSwgcmV0cnlfY291bnRzKSkKICAgICAgICBpZiBub3QgcmV0cnlfY291bnRzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIG1pbihyZXRyeV9jb3VudHMpIDwgMAoKICAgIGRlZiBpbmNyZW1lbnQoc2VsZiwgbWV0aG9kPU5vbmUsIHVybD1Ob25lLCByZXNwb25zZT1Ob25lLCBlcnJvcj1Ob25lLAogICAgICAgICAgICAgICAgICBfcG9vbD1Ob25lLCBfc3RhY2t0cmFjZT1Ob25lKToKICAgICAgICAiIiIgUmV0dXJuIGEgbmV3IFJldHJ5IG9iamVjdCB3aXRoIGluY3JlbWVudGVkIHJldHJ5IGNvdW50ZXJzLgoKICAgICAgICA6cGFyYW0gcmVzcG9uc2U6IEEgcmVzcG9uc2Ugb2JqZWN0LCBvciBOb25lLCBpZiB0aGUgc2VydmVyIGRpZCBub3QKICAgICAgICAgICAgcmV0dXJuIGEgcmVzcG9uc2UuCiAgICAgICAgOnR5cGUgcmVzcG9uc2U6IDpjbGFzczpgfnVybGxpYjMucmVzcG9uc2UuSFRUUFJlc3BvbnNlYAogICAgICAgIDpwYXJhbSBFeGNlcHRpb24gZXJyb3I6IEFuIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyB0aGUgcmVxdWVzdCwgb3IKICAgICAgICAgICAgTm9uZSBpZiB0aGUgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KCiAgICAgICAgOnJldHVybjogQSBuZXcgYGBSZXRyeWBgIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnRvdGFsIGlzIEZhbHNlIGFuZCBlcnJvcjoKICAgICAgICAgICAgIyBEaXNhYmxlZCwgaW5kaWNhdGUgdG8gcmUtcmFpc2UgdGhlIGVycm9yLgogICAgICAgICAgICByYWlzZSBzaXgucmVyYWlzZSh0eXBlKGVycm9yKSwgZXJyb3IsIF9zdGFja3RyYWNlKQoKICAgICAgICB0b3RhbCA9IHNlbGYudG90YWwKICAgICAgICBpZiB0b3RhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdG90YWwgLT0gMQoKICAgICAgICBjb25uZWN0ID0gc2VsZi5jb25uZWN0CiAgICAgICAgcmVhZCA9IHNlbGYucmVhZAogICAgICAgIHJlZGlyZWN0ID0gc2VsZi5yZWRpcmVjdAogICAgICAgIHN0YXR1c19jb3VudCA9IHNlbGYuc3RhdHVzCiAgICAgICAgY2F1c2UgPSAndW5rbm93bicKICAgICAgICBzdGF0dXMgPSBOb25lCiAgICAgICAgcmVkaXJlY3RfbG9jYXRpb24gPSBOb25lCgogICAgICAgIGlmIGVycm9yIGFuZCBzZWxmLl9pc19jb25uZWN0aW9uX2Vycm9yKGVycm9yKToKICAgICAgICAgICAgIyBDb25uZWN0IHJldHJ5PwogICAgICAgICAgICBpZiBjb25uZWN0IGlzIEZhbHNlOgogICAgICAgICAgICAgICAgcmFpc2Ugc2l4LnJlcmFpc2UodHlwZShlcnJvciksIGVycm9yLCBfc3RhY2t0cmFjZSkKICAgICAgICAgICAgZWxpZiBjb25uZWN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY29ubmVjdCAtPSAxCgogICAgICAgIGVsaWYgZXJyb3IgYW5kIHNlbGYuX2lzX3JlYWRfZXJyb3IoZXJyb3IpOgogICAgICAgICAgICAjIFJlYWQgcmV0cnk/CiAgICAgICAgICAgIGlmIHJlYWQgaXMgRmFsc2Ugb3Igbm90IHNlbGYuX2lzX21ldGhvZF9yZXRyeWFibGUobWV0aG9kKToKICAgICAgICAgICAgICAgIHJhaXNlIHNpeC5yZXJhaXNlKHR5cGUoZXJyb3IpLCBlcnJvciwgX3N0YWNrdHJhY2UpCiAgICAgICAgICAgIGVsaWYgcmVhZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJlYWQgLT0gMQoKICAgICAgICBlbGlmIHJlc3BvbnNlIGFuZCByZXNwb25zZS5nZXRfcmVkaXJlY3RfbG9jYXRpb24oKToKICAgICAgICAgICAgIyBSZWRpcmVjdCByZXRyeT8KICAgICAgICAgICAgaWYgcmVkaXJlY3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZWRpcmVjdCAtPSAxCiAgICAgICAgICAgIGNhdXNlID0gJ3RvbyBtYW55IHJlZGlyZWN0cycKICAgICAgICAgICAgcmVkaXJlY3RfbG9jYXRpb24gPSByZXNwb25zZS5nZXRfcmVkaXJlY3RfbG9jYXRpb24oKQogICAgICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXMKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBJbmNyZW1lbnRpbmcgYmVjYXVzZSBvZiBhIHNlcnZlciBlcnJvciBsaWtlIGEgNTAwIGluCiAgICAgICAgICAgICMgc3RhdHVzX2ZvcmNlbGlzdCBhbmQgYSB0aGUgZ2l2ZW4gbWV0aG9kIGlzIGluIHRoZSB3aGl0ZWxpc3QKICAgICAgICAgICAgY2F1c2UgPSBSZXNwb25zZUVycm9yLkdFTkVSSUNfRVJST1IKICAgICAgICAgICAgaWYgcmVzcG9uc2UgYW5kIHJlc3BvbnNlLnN0YXR1czoKICAgICAgICAgICAgICAgIGlmIHN0YXR1c19jb3VudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY291bnQgLT0gMQogICAgICAgICAgICAgICAgY2F1c2UgPSBSZXNwb25zZUVycm9yLlNQRUNJRklDX0VSUk9SLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY29kZT1yZXNwb25zZS5zdGF0dXMpCiAgICAgICAgICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXMKCiAgICAgICAgaGlzdG9yeSA9IHNlbGYuaGlzdG9yeSArIChSZXF1ZXN0SGlzdG9yeShtZXRob2QsIHVybCwgZXJyb3IsIHN0YXR1cywgcmVkaXJlY3RfbG9jYXRpb24pLCkKCiAgICAgICAgbmV3X3JldHJ5ID0gc2VsZi5uZXcoCiAgICAgICAgICAgIHRvdGFsPXRvdGFsLAogICAgICAgICAgICBjb25uZWN0PWNvbm5lY3QsIHJlYWQ9cmVhZCwgcmVkaXJlY3Q9cmVkaXJlY3QsIHN0YXR1cz1zdGF0dXNfY291bnQsCiAgICAgICAgICAgIGhpc3Rvcnk9aGlzdG9yeSkKCiAgICAgICAgaWYgbmV3X3JldHJ5LmlzX2V4aGF1c3RlZCgpOgogICAgICAgICAgICByYWlzZSBNYXhSZXRyeUVycm9yKF9wb29sLCB1cmwsIGVycm9yIG9yIFJlc3BvbnNlRXJyb3IoY2F1c2UpKQoKICAgICAgICBsb2cuZGVidWcoIkluY3JlbWVudGVkIFJldHJ5IGZvciAodXJsPSclcycpOiAlciIsIHVybCwgbmV3X3JldHJ5KQoKICAgICAgICByZXR1cm4gbmV3X3JldHJ5CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAoJ3tjbHMuX19uYW1lX199KHRvdGFsPXtzZWxmLnRvdGFsfSwgY29ubmVjdD17c2VsZi5jb25uZWN0fSwgJwogICAgICAgICAgICAgICAgJ3JlYWQ9e3NlbGYucmVhZH0sIHJlZGlyZWN0PXtzZWxmLnJlZGlyZWN0fSwgc3RhdHVzPXtzZWxmLnN0YXR1c30pJykuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIGNscz10eXBlKHNlbGYpLCBzZWxmPXNlbGYpCgoKIyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGVxdWl2YWxlbnQgdG8gcHJlLXYxLjkpOgpSZXRyeS5ERUZBVUxUID0gUmV0cnkoMykKUEsDBBQAAAAAAAAAIQB9zzs9m1IAAJtSAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc2VsZWN0b3JzLnB5IyBCYWNrcG9ydCBvZiBzZWxlY3RvcnMucHkgZnJvbSBQeXRob24gMy41KyB0byBzdXBwb3J0IFB5dGhvbiA8IDMuNAojIEFsc28gaGFzIHRoZSBiZWhhdmlvciBzcGVjaWZpZWQgaW4gUEVQIDQ3NSB3aGljaCBpcyB0byByZXRyeSBzeXNjYWxscwojIGluIHRoZSBjYXNlIG9mIGFuIEVJTlRSIGVycm9yLiBUaGlzIG1vZHVsZSBpcyByZXF1aXJlZCBiZWNhdXNlIHNlbGVjdG9yczM0CiMgZG9lcyBub3QgZm9sbG93IHRoaXMgYmVoYXZpb3IgYW5kIGluc3RlYWQgcmV0dXJucyB0aGF0IG5vIGRpbGUgZGVzY3JpcHRvcgojIGV2ZW50cyBoYXZlIG9jY3VycmVkIHJhdGhlciB0aGFuIHJldHJ5IHRoZSBzeXNjYWxsLiBUaGUgZGVjaXNpb24gdG8gZHJvcAojIHN1cHBvcnQgZm9yIHNlbGVjdC5kZXZwb2xsIGlzIG1hZGUgdG8gbWFpbnRhaW4gMTAwJSB0ZXN0IGNvdmVyYWdlLgoKaW1wb3J0IGVycm5vCmltcG9ydCBtYXRoCmltcG9ydCBzZWxlY3QKaW1wb3J0IHNvY2tldAppbXBvcnQgc3lzCmltcG9ydCB0aW1lCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUsIE1hcHBpbmcKCnRyeToKICAgIG1vbm90b25pYyA9IHRpbWUubW9ub3RvbmljCmV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIEltcG9ydEVycm9yKTogICMgUHl0aG9uIDMuMzwKICAgIG1vbm90b25pYyA9IHRpbWUudGltZQoKRVZFTlRfUkVBRCA9ICgxIDw8IDApCkVWRU5UX1dSSVRFID0gKDEgPDwgMSkKCkhBU19TRUxFQ1QgPSBUcnVlICAjIFZhcmlhYmxlIHRoYXQgc2hvd3Mgd2hldGhlciB0aGUgcGxhdGZvcm0gaGFzIGEgc2VsZWN0b3IuCl9TWVNDQUxMX1NFTlRJTkVMID0gb2JqZWN0KCkgICMgU2VudGluZWwgaW4gY2FzZSBhIHN5c3RlbSBjYWxsIHJldHVybnMgTm9uZS4KX0RFRkFVTFRfU0VMRUNUT1IgPSBOb25lCgoKY2xhc3MgU2VsZWN0b3JFcnJvcihFeGNlcHRpb24pOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycmNvZGUpOgogICAgICAgIHN1cGVyKFNlbGVjdG9yRXJyb3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmVycm5vID0gZXJyY29kZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxTZWxlY3RvckVycm9yIGVycm5vPXswfT4iLmZvcm1hdChzZWxmLmVycm5vKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fcmVwcl9fKCkKCgpkZWYgX2ZpbGVvYmpfdG9fZmQoZmlsZW9iaik6CiAgICAiIiIgUmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIGZyb20gYSBmaWxlIG9iamVjdC4gSWYKICAgIGdpdmVuIGFuIGludGVnZXIgd2lsbCBzaW1wbHkgcmV0dXJuIHRoYXQgaW50ZWdlciBiYWNrLiAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZmlsZW9iaiwgaW50KToKICAgICAgICBmZCA9IGZpbGVvYmoKICAgIGVsc2U6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZCA9IGludChmaWxlb2JqLmZpbGVubygpKQogICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZmlsZSBvYmplY3Q6IHswIXJ9Ii5mb3JtYXQoZmlsZW9iaikpCiAgICBpZiBmZCA8IDA6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBmaWxlIGRlc2NyaXB0b3I6IHswfSIuZm9ybWF0KGZkKSkKICAgIHJldHVybiBmZAoKCiMgRGV0ZXJtaW5lIHdoaWNoIGZ1bmN0aW9uIHRvIHVzZSB0byB3cmFwIHN5c3RlbSBjYWxscyBiZWNhdXNlIFB5dGhvbiAzLjUrCiMgYWxyZWFkeSBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gc3lzdGVtIGNhbGxzIGFyZSBpbnRlcnJ1cHRlZC4KaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgNSk6CiAgICBkZWYgX3N5c2NhbGxfd3JhcHBlcihmdW5jLCBfLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIiBUaGlzIGlzIHRoZSBzaG9ydC1jaXJjdWl0IHZlcnNpb24gb2YgdGhlIGJlbG93IGxvZ2ljCiAgICAgICAgYmVjYXVzZSBpbiBQeXRob24gMy41KyBhbGwgc3lzdGVtIGNhbGxzIGF1dG9tYXRpY2FsbHkgcmVzdGFydAogICAgICAgIGFuZCByZWNhbGN1bGF0ZSB0aGVpciB0aW1lb3V0cy4gIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yLCBzZWxlY3QuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgIGVycmNvZGUgPSBOb25lCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZSwgImVycm5vIik6CiAgICAgICAgICAgICAgICBlcnJjb2RlID0gZS5lcnJubwogICAgICAgICAgICByYWlzZSBTZWxlY3RvckVycm9yKGVycmNvZGUpCmVsc2U6CiAgICBkZWYgX3N5c2NhbGxfd3JhcHBlcihmdW5jLCByZWNhbGNfdGltZW91dCwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIgV3JhcHBlciBmdW5jdGlvbiBmb3Igc3lzY2FsbHMgdGhhdCBjb3VsZCBmYWlsIGR1ZSB0byBFSU5UUi4KICAgICAgICBBbGwgZnVuY3Rpb25zIHNob3VsZCBiZSByZXRyaWVkIGlmIHRoZXJlIGlzIHRpbWUgbGVmdCBpbiB0aGUgdGltZW91dAogICAgICAgIGluIGFjY29yZGFuY2Ugd2l0aCBQRVAgNDc1LiAiIiIKICAgICAgICB0aW1lb3V0ID0ga3dhcmdzLmdldCgidGltZW91dCIsIE5vbmUpCiAgICAgICAgaWYgdGltZW91dCBpcyBOb25lOgogICAgICAgICAgICBleHBpcmVzID0gTm9uZQogICAgICAgICAgICByZWNhbGNfdGltZW91dCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGltZW91dCA9IGZsb2F0KHRpbWVvdXQpCiAgICAgICAgICAgIGlmIHRpbWVvdXQgPCAwLjA6ICAjIFRpbWVvdXQgbGVzcyB0aGFuIDAgdHJlYXRlZCBhcyBubyB0aW1lb3V0LgogICAgICAgICAgICAgICAgZXhwaXJlcyA9IE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBtb25vdG9uaWMoKSArIHRpbWVvdXQKCiAgICAgICAgYXJncyA9IGxpc3QoYXJncykKICAgICAgICBpZiByZWNhbGNfdGltZW91dCBhbmQgInRpbWVvdXQiIG5vdCBpbiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiVGltZW91dCBtdXN0IGJlIGluIGFyZ3Mgb3Iga3dhcmdzIHRvIGJlIHJlY2FsY3VsYXRlZCIpCgogICAgICAgIHJlc3VsdCA9IF9TWVNDQUxMX1NFTlRJTkVMCiAgICAgICAgd2hpbGUgcmVzdWx0IGlzIF9TWVNDQUxMX1NFTlRJTkVMOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgIyBPU0Vycm9yIGlzIHRocm93biBieSBzZWxlY3Quc2VsZWN0CiAgICAgICAgICAgICMgSU9FcnJvciBpcyB0aHJvd24gYnkgc2VsZWN0LmVwb2xsLnBvbGwKICAgICAgICAgICAgIyBzZWxlY3QuZXJyb3IgaXMgdGhyb3duIGJ5IHNlbGVjdC5wb2xsLnBvbGwKICAgICAgICAgICAgIyBBcmVuJ3Qgd2UgdGhhbmtmdWwgZm9yIFB5dGhvbiAzLnggcmV3b3JrIGZvciBleGNlcHRpb25zPwogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IsIHNlbGVjdC5lcnJvcikgYXMgZToKICAgICAgICAgICAgICAgICMgc2VsZWN0LmVycm9yIHdhc24ndCBhIHN1YmNsYXNzIG9mIE9TRXJyb3IgaW4gdGhlIHBhc3QuCiAgICAgICAgICAgICAgICBlcnJjb2RlID0gTm9uZQogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlLCAiZXJybm8iKToKICAgICAgICAgICAgICAgICAgICBlcnJjb2RlID0gZS5lcnJubwogICAgICAgICAgICAgICAgZWxpZiBoYXNhdHRyKGUsICJhcmdzIik6CiAgICAgICAgICAgICAgICAgICAgZXJyY29kZSA9IGUuYXJnc1swXQoKICAgICAgICAgICAgICAgICMgQWxzbyB0ZXN0IGZvciB0aGUgV2luZG93cyBlcXVpdmFsZW50IG9mIEVJTlRSLgogICAgICAgICAgICAgICAgaXNfaW50ZXJydXB0ID0gKGVycmNvZGUgPT0gZXJybm8uRUlOVFIgb3IgKGhhc2F0dHIoZXJybm8sICJXU0FFSU5UUiIpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGUgPT0gZXJybm8uV1NBRUlOVFIpKQoKICAgICAgICAgICAgICAgIGlmIGlzX2ludGVycnVwdDoKICAgICAgICAgICAgICAgICAgICBpZiBleHBpcmVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RpbWUgPSBtb25vdG9uaWMoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBjdXJyZW50X3RpbWUgPiBleHBpcmVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgT1NFcnJvcihlcnJubz1lcnJuby5FVElNRURPVVQpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlY2FsY190aW1lb3V0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgInRpbWVvdXQiIGluIGt3YXJnczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2FyZ3NbInRpbWVvdXQiXSA9IGV4cGlyZXMgLSBjdXJyZW50X3RpbWUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgZXJyY29kZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBTZWxlY3RvckVycm9yKGVycmNvZGUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKClNlbGVjdG9yS2V5ID0gbmFtZWR0dXBsZSgnU2VsZWN0b3JLZXknLCBbJ2ZpbGVvYmonLCAnZmQnLCAnZXZlbnRzJywgJ2RhdGEnXSkKCgpjbGFzcyBfU2VsZWN0b3JNYXBwaW5nKE1hcHBpbmcpOgogICAgIiIiIE1hcHBpbmcgb2YgZmlsZSBvYmplY3RzIHRvIHNlbGVjdG9yIGtleXMgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlbGVjdG9yKToKICAgICAgICBzZWxmLl9zZWxlY3RvciA9IHNlbGVjdG9yCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zZWxlY3Rvci5fZmRfdG9fa2V5KQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBmaWxlb2JqKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZkID0gc2VsZi5fc2VsZWN0b3IuX2ZpbGVvYmpfbG9va3VwKGZpbGVvYmopCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9zZWxlY3Rvci5fZmRfdG9fa2V5W2ZkXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IGlzIG5vdCByZWdpc3RlcmVkLiIuZm9ybWF0KGZpbGVvYmopKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9zZWxlY3Rvci5fZmRfdG9fa2V5KQoKCmNsYXNzIEJhc2VTZWxlY3RvcihvYmplY3QpOgogICAgIiIiIEFic3RyYWN0IFNlbGVjdG9yIGNsYXNzCgogICAgQSBzZWxlY3RvciBzdXBwb3J0cyByZWdpc3RlcmluZyBmaWxlIG9iamVjdHMgdG8gYmUgbW9uaXRvcmVkCiAgICBmb3Igc3BlY2lmaWMgSS9PIGV2ZW50cy4KCiAgICBBIGZpbGUgb2JqZWN0IGlzIGEgZmlsZSBkZXNjcmlwdG9yIG9yIGFueSBvYmplY3Qgd2l0aCBhCiAgICBgZmlsZW5vKClgIG1ldGhvZC4gQW4gYXJiaXRyYXJ5IG9iamVjdCBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlCiAgICBmaWxlIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSB0byBzdG9yZSBjb250ZXh0IGluZm8sCiAgICBhIGNhbGxiYWNrLCBldGMuCgogICAgQSBzZWxlY3RvciBjYW4gdXNlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zIChzZWxlY3QoKSwgcG9sbCgpLCBlcG9sbCgpLAogICAgYW5kIGtxdWV1ZSgpKSBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLiBUaGUgJ0RlZmF1bHRTZWxlY3RvcicgY2xhc3MgdXNlcwogICAgdGhlIG1vc3QgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICMgTWFwcyBmaWxlIGRlc2NyaXB0b3JzIHRvIGtleXMuCiAgICAgICAgc2VsZi5fZmRfdG9fa2V5ID0ge30KCiAgICAgICAgIyBSZWFkLW9ubHkgbWFwcGluZyByZXR1cm5lZCBieSBnZXRfbWFwKCkKICAgICAgICBzZWxmLl9tYXAgPSBfU2VsZWN0b3JNYXBwaW5nKHNlbGYpCgogICAgZGVmIF9maWxlb2JqX2xvb2t1cChzZWxmLCBmaWxlb2JqKToKICAgICAgICAiIiIgUmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIGZyb20gYSBmaWxlIG9iamVjdC4KICAgICAgICBUaGlzIHdyYXBzIF9maWxlb2JqX3RvX2ZkKCkgdG8gZG8gYW4gZXhoYXVzdGl2ZQogICAgICAgIHNlYXJjaCBpbiBjYXNlIHRoZSBvYmplY3QgaXMgaW52YWxpZCBidXQgd2Ugc3RpbGwKICAgICAgICBoYXZlIGl0IGluIG91ciBtYXAuIFVzZWQgYnkgdW5yZWdpc3RlcigpIHNvIHdlIGNhbgogICAgICAgIHVucmVnaXN0ZXIgYW4gb2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAogICAgICAgIGV2ZW4gaWYgaXQgaXMgY2xvc2VkLiBJdCBpcyBhbHNvIHVzZWQgYnkgX1NlbGVjdG9yTWFwcGluZwogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIF9maWxlb2JqX3RvX2ZkKGZpbGVvYmopCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CgogICAgICAgICAgICAjIFNlYXJjaCB0aHJvdWdoIGFsbCBvdXIgbWFwcGVkIGtleXMuCiAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fZmRfdG9fa2V5LnZhbHVlcygpOgogICAgICAgICAgICAgICAgaWYga2V5LmZpbGVvYmogaXMgZmlsZW9iajoKICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmZkCgogICAgICAgICAgICAjIFJhaXNlIFZhbHVlRXJyb3IgYWZ0ZXIgYWxsLgogICAgICAgICAgICByYWlzZQoKICAgIGRlZiByZWdpc3RlcihzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgIiIiIFJlZ2lzdGVyIGEgZmlsZSBvYmplY3QgZm9yIGEgc2V0IG9mIGV2ZW50cyB0byBtb25pdG9yLiAiIiIKICAgICAgICBpZiAobm90IGV2ZW50cykgb3IgKGV2ZW50cyAmIH4oRVZFTlRfUkVBRCB8IEVWRU5UX1dSSVRFKSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZXZlbnRzOiB7MCFyfSIuZm9ybWF0KGV2ZW50cykpCgogICAgICAgIGtleSA9IFNlbGVjdG9yS2V5KGZpbGVvYmosIHNlbGYuX2ZpbGVvYmpfbG9va3VwKGZpbGVvYmopLCBldmVudHMsIGRhdGEpCgogICAgICAgIGlmIGtleS5mZCBpbiBzZWxmLl9mZF90b19rZXk6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJ7MCFyfSAoRkQgezF9KSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoZmlsZW9iaiwga2V5LmZkKSkKCiAgICAgICAgc2VsZi5fZmRfdG9fa2V5W2tleS5mZF0gPSBrZXkKICAgICAgICByZXR1cm4ga2V5CgogICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgZmlsZW9iaik6CiAgICAgICAgIiIiIFVucmVnaXN0ZXIgYSBmaWxlIG9iamVjdCBmcm9tIGJlaW5nIG1vbml0b3JlZC4gIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBrZXkgPSBzZWxmLl9mZF90b19rZXkucG9wKHNlbGYuX2ZpbGVvYmpfbG9va3VwKGZpbGVvYmopKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IGlzIG5vdCByZWdpc3RlcmVkIi5mb3JtYXQoZmlsZW9iaikpCgogICAgICAgICMgR2V0dGluZyB0aGUgZmlsZW5vIG9mIGEgY2xvc2VkIHNvY2tldCBvbiBXaW5kb3dzIGVycm9ycyB3aXRoIEVCQURGLgogICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFdpbmRvd3MuCiAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUJBREY6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9mZF90b19rZXkudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgaWYga2V5LmZpbGVvYmogaXMgZmlsZW9iajoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmRfdG9fa2V5LnBvcChrZXkuZmQpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJ7MCFyfSBpcyBub3QgcmVnaXN0ZXJlZCIuZm9ybWF0KGZpbGVvYmopKQogICAgICAgIHJldHVybiBrZXkKCiAgICBkZWYgbW9kaWZ5KHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAiIiIgQ2hhbmdlIGEgcmVnaXN0ZXJlZCBmaWxlIG9iamVjdCBtb25pdG9yZWQgZXZlbnRzIGFuZCBkYXRhLiAiIiIKICAgICAgICAjIE5PVEU6IFNvbWUgc3ViY2xhc3NlcyBvcHRpbWl6ZSB0aGlzIG9wZXJhdGlvbiBldmVuIGZ1cnRoZXIuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBrZXkgPSBzZWxmLl9mZF90b19rZXlbc2VsZi5fZmlsZW9ial9sb29rdXAoZmlsZW9iaildCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gaXMgbm90IHJlZ2lzdGVyZWQiLmZvcm1hdChmaWxlb2JqKSkKCiAgICAgICAgaWYgZXZlbnRzICE9IGtleS5ldmVudHM6CiAgICAgICAgICAgIHNlbGYudW5yZWdpc3RlcihmaWxlb2JqKQogICAgICAgICAgICBrZXkgPSBzZWxmLnJlZ2lzdGVyKGZpbGVvYmosIGV2ZW50cywgZGF0YSkKCiAgICAgICAgZWxpZiBkYXRhICE9IGtleS5kYXRhOgogICAgICAgICAgICAjIFVzZSBhIHNob3J0Y3V0IHRvIHVwZGF0ZSB0aGUgZGF0YS4KICAgICAgICAgICAga2V5ID0ga2V5Ll9yZXBsYWNlKGRhdGE9ZGF0YSkKICAgICAgICAgICAgc2VsZi5fZmRfdG9fa2V5W2tleS5mZF0gPSBrZXkKCiAgICAgICAgcmV0dXJuIGtleQoKICAgIGRlZiBzZWxlY3Qoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIgUGVyZm9ybSB0aGUgYWN0dWFsIHNlbGVjdGlvbiB1bnRpbCBzb21lIG1vbml0b3JlZCBmaWxlIG9iamVjdHMKICAgICAgICBhcmUgcmVhZHkgb3IgdGhlIHRpbWVvdXQgZXhwaXJlcy4gIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIiBDbG9zZSB0aGUgc2VsZWN0b3IuIFRoaXMgbXVzdCBiZSBjYWxsZWQgdG8gZW5zdXJlIHRoYXQgYWxsCiAgICAgICAgdW5kZXJseWluZyByZXNvdXJjZXMgYXJlIGZyZWVkLiAiIiIKICAgICAgICBzZWxmLl9mZF90b19rZXkuY2xlYXIoKQogICAgICAgIHNlbGYuX21hcCA9IE5vbmUKCiAgICBkZWYgZ2V0X2tleShzZWxmLCBmaWxlb2JqKToKICAgICAgICAiIiIgUmV0dXJuIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIGEgcmVnaXN0ZXJlZCBmaWxlIG9iamVjdC4gIiIiCiAgICAgICAgbWFwcGluZyA9IHNlbGYuZ2V0X21hcCgpCiAgICAgICAgaWYgbWFwcGluZyBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNlbGVjdG9yIGlzIGNsb3NlZCIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gbWFwcGluZ1tmaWxlb2JqXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IGlzIG5vdCByZWdpc3RlcmVkIi5mb3JtYXQoZmlsZW9iaikpCgogICAgZGVmIGdldF9tYXAoc2VsZik6CiAgICAgICAgIiIiIFJldHVybiBhIG1hcHBpbmcgb2YgZmlsZSBvYmplY3RzIHRvIHNlbGVjdG9yIGtleXMgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX21hcAoKICAgIGRlZiBfa2V5X2Zyb21fZmQoc2VsZiwgZmQpOgogICAgICAgICIiIiBSZXR1cm4gdGhlIGtleSBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCiAgICAgICAgIFJldHVybiBOb25lIGlmIGl0IGlzIG5vdCBmb3VuZC4gIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZmRfdG9fa2V5W2ZkXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICBzZWxmLmNsb3NlKCkKCgojIEFsbW9zdCBhbGwgcGxhdGZvcm1zIGhhdmUgc2VsZWN0LnNlbGVjdCgpCmlmIGhhc2F0dHIoc2VsZWN0LCAic2VsZWN0Iik6CiAgICBjbGFzcyBTZWxlY3RTZWxlY3RvcihCYXNlU2VsZWN0b3IpOgogICAgICAgICIiIiBTZWxlY3QtYmFzZWQgc2VsZWN0b3IuICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoU2VsZWN0U2VsZWN0b3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgc2VsZi5fcmVhZGVycyA9IHNldCgpCiAgICAgICAgICAgIHNlbGYuX3dyaXRlcnMgPSBzZXQoKQoKICAgICAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgZmlsZW9iaiwgZXZlbnRzLCBkYXRhPU5vbmUpOgogICAgICAgICAgICBrZXkgPSBzdXBlcihTZWxlY3RTZWxlY3Rvciwgc2VsZikucmVnaXN0ZXIoZmlsZW9iaiwgZXZlbnRzLCBkYXRhKQogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9SRUFEOgogICAgICAgICAgICAgICAgc2VsZi5fcmVhZGVycy5hZGQoa2V5LmZkKQogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9XUklURToKICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlcnMuYWRkKGtleS5mZCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBmaWxlb2JqKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoU2VsZWN0U2VsZWN0b3IsIHNlbGYpLnVucmVnaXN0ZXIoZmlsZW9iaikKICAgICAgICAgICAgc2VsZi5fcmVhZGVycy5kaXNjYXJkKGtleS5mZCkKICAgICAgICAgICAgc2VsZi5fd3JpdGVycy5kaXNjYXJkKGtleS5mZCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgX3NlbGVjdChzZWxmLCByLCB3LCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICAiIiIgV3JhcHBlciBmb3Igc2VsZWN0LnNlbGVjdCBiZWNhdXNlIHRpbWVvdXQgaXMgYSBwb3NpdGlvbmFsIGFyZyAiIiIKICAgICAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QociwgdywgW10sIHRpbWVvdXQpCgogICAgICAgIGRlZiBzZWxlY3Qoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgIyBTZWxlY3Rpbmcgb24gZW1wdHkgbGlzdHMgb24gV2luZG93cyBlcnJvcnMgb3V0LgogICAgICAgICAgICBpZiBub3QgbGVuKHNlbGYuX3JlYWRlcnMpIGFuZCBub3QgbGVuKHNlbGYuX3dyaXRlcnMpOgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgICAgICB0aW1lb3V0ID0gTm9uZSBpZiB0aW1lb3V0IGlzIE5vbmUgZWxzZSBtYXgodGltZW91dCwgMC4wKQogICAgICAgICAgICByZWFkeSA9IFtdCiAgICAgICAgICAgIHIsIHcsIF8gPSBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX3NlbGVjdCwgVHJ1ZSwgc2VsZi5fcmVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVycywgdGltZW91dCkKICAgICAgICAgICAgciA9IHNldChyKQogICAgICAgICAgICB3ID0gc2V0KHcpCiAgICAgICAgICAgIGZvciBmZCBpbiByIHwgdzoKICAgICAgICAgICAgICAgIGV2ZW50cyA9IDAKICAgICAgICAgICAgICAgIGlmIGZkIGluIHI6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1JFQUQKICAgICAgICAgICAgICAgIGlmIGZkIGluIHc6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1dSSVRFCgogICAgICAgICAgICAgICAga2V5ID0gc2VsZi5fa2V5X2Zyb21fZmQoZmQpCiAgICAgICAgICAgICAgICBpZiBrZXk6CiAgICAgICAgICAgICAgICAgICAgcmVhZHkuYXBwZW5kKChrZXksIGV2ZW50cyAmIGtleS5ldmVudHMpKQogICAgICAgICAgICByZXR1cm4gcmVhZHkKCgppZiBoYXNhdHRyKHNlbGVjdCwgInBvbGwiKToKICAgIGNsYXNzIFBvbGxTZWxlY3RvcihCYXNlU2VsZWN0b3IpOgogICAgICAgICIiIiBQb2xsLWJhc2VkIHNlbGVjdG9yICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoUG9sbFNlbGVjdG9yLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgICAgIHNlbGYuX3BvbGwgPSBzZWxlY3QucG9sbCgpCgogICAgICAgIGRlZiByZWdpc3RlcihzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKFBvbGxTZWxlY3Rvciwgc2VsZikucmVnaXN0ZXIoZmlsZW9iaiwgZXZlbnRzLCBkYXRhKQogICAgICAgICAgICBldmVudF9tYXNrID0gMAogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9SRUFEOgogICAgICAgICAgICAgICAgZXZlbnRfbWFzayB8PSBzZWxlY3QuUE9MTElOCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAgZXZlbnRfbWFzayB8PSBzZWxlY3QuUE9MTE9VVAogICAgICAgICAgICBzZWxmLl9wb2xsLnJlZ2lzdGVyKGtleS5mZCwgZXZlbnRfbWFzaykKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBmaWxlb2JqKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoUG9sbFNlbGVjdG9yLCBzZWxmKS51bnJlZ2lzdGVyKGZpbGVvYmopCiAgICAgICAgICAgIHNlbGYuX3BvbGwudW5yZWdpc3RlcihrZXkuZmQpCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIF93cmFwX3BvbGwoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgIiIiIFdyYXBwZXIgZnVuY3Rpb24gZm9yIHNlbGVjdC5wb2xsLnBvbGwoKSBzbyB0aGF0CiAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIgY2FuIHdvcmsgd2l0aCBvbmx5IHNlY29uZHMuICIiIgogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgdGltZW91dCA8PSAwOgogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAwCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgc2VsZWN0LnBvbGwucG9sbCgpIGhhcyBhIHJlc29sdXRpb24gb2YgMSBtaWxsaXNlY29uZCwKICAgICAgICAgICAgICAgICAgICAjIHJvdW5kIGF3YXkgZnJvbSB6ZXJvIHRvIHdhaXQgKmF0IGxlYXN0KiB0aW1lb3V0IHNlY29uZHMuCiAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IG1hdGguY2VpbCh0aW1lb3V0ICogMWUzKQoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fcG9sbC5wb2xsKHRpbWVvdXQpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgZGVmIHNlbGVjdChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICByZWFkeSA9IFtdCiAgICAgICAgICAgIGZkX2V2ZW50cyA9IF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fd3JhcF9wb2xsLCBUcnVlLCB0aW1lb3V0PXRpbWVvdXQpCiAgICAgICAgICAgIGZvciBmZCwgZXZlbnRfbWFzayBpbiBmZF9ldmVudHM6CiAgICAgICAgICAgICAgICBldmVudHMgPSAwCiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrICYgfnNlbGVjdC5QT0xMSU46CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1dSSVRFCiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrICYgfnNlbGVjdC5QT0xMT1VUOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9SRUFECgogICAgICAgICAgICAgICAga2V5ID0gc2VsZi5fa2V5X2Zyb21fZmQoZmQpCiAgICAgICAgICAgICAgICBpZiBrZXk6CiAgICAgICAgICAgICAgICAgICAgcmVhZHkuYXBwZW5kKChrZXksIGV2ZW50cyAmIGtleS5ldmVudHMpKQoKICAgICAgICAgICAgcmV0dXJuIHJlYWR5CgoKaWYgaGFzYXR0cihzZWxlY3QsICJlcG9sbCIpOgogICAgY2xhc3MgRXBvbGxTZWxlY3RvcihCYXNlU2VsZWN0b3IpOgogICAgICAgICIiIiBFcG9sbC1iYXNlZCBzZWxlY3RvciAiIiIKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIHN1cGVyKEVwb2xsU2VsZWN0b3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgc2VsZi5fZXBvbGwgPSBzZWxlY3QuZXBvbGwoKQoKICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZXBvbGwuZmlsZW5vKCkKCiAgICAgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoRXBvbGxTZWxlY3Rvciwgc2VsZikucmVnaXN0ZXIoZmlsZW9iaiwgZXZlbnRzLCBkYXRhKQogICAgICAgICAgICBldmVudHNfbWFzayA9IDAKICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfUkVBRDoKICAgICAgICAgICAgICAgIGV2ZW50c19tYXNrIHw9IHNlbGVjdC5FUE9MTElOCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAgZXZlbnRzX21hc2sgfD0gc2VsZWN0LkVQT0xMT1VUCiAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fZXBvbGwucmVnaXN0ZXIsIEZhbHNlLCBrZXkuZmQsIGV2ZW50c19tYXNrKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGZpbGVvYmopOgogICAgICAgICAgICBrZXkgPSBzdXBlcihFcG9sbFNlbGVjdG9yLCBzZWxmKS51bnJlZ2lzdGVyKGZpbGVvYmopCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fZXBvbGwudW5yZWdpc3RlciwgRmFsc2UsIGtleS5mZCkKICAgICAgICAgICAgZXhjZXB0IFNlbGVjdG9yRXJyb3I6CiAgICAgICAgICAgICAgICAjIFRoaXMgY2FuIG9jY3VyIHdoZW4gdGhlIGZkIHdhcyBjbG9zZWQgc2luY2UgcmVnaXN0cnkuCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIHNlbGVjdChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgdGltZW91dCA8PSAwOgogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAwLjAKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBzZWxlY3QuZXBvbGwucG9sbCgpIGhhcyBhIHJlc29sdXRpb24gb2YgMSBtaWxsaXNlY29uZAogICAgICAgICAgICAgICAgICAgICMgYnV0IGx1Y2tpbHkgdGFrZXMgc2Vjb25kcyBzbyB3ZSBkb24ndCBuZWVkIGEgd3JhcHBlcgogICAgICAgICAgICAgICAgICAgICMgbGlrZSBQb2xsU2VsZWN0b3IuIEp1c3QgZm9yIGJldHRlciByb3VuZGluZy4KICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbWF0aC5jZWlsKHRpbWVvdXQgKiAxZTMpICogMWUtMwogICAgICAgICAgICAgICAgdGltZW91dCA9IGZsb2F0KHRpbWVvdXQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gLTEuMCAgIyBlcG9sbC5wb2xsKCkgbXVzdCBoYXZlIGEgZmxvYXQuCgogICAgICAgICAgICAjIFdlIGFsd2F5cyB3YW50IGF0IGxlYXN0IDEgdG8gZW5zdXJlIHRoYXQgc2VsZWN0IGNhbiBiZSBjYWxsZWQKICAgICAgICAgICAgIyB3aXRoIG5vIGZpbGUgZGVzY3JpcHRvcnMgcmVnaXN0ZXJlZC4gT3RoZXJ3aXNlIHdpbGwgZmFpbC4KICAgICAgICAgICAgbWF4X2V2ZW50cyA9IG1heChsZW4oc2VsZi5fZmRfdG9fa2V5KSwgMSkKCiAgICAgICAgICAgIHJlYWR5ID0gW10KICAgICAgICAgICAgZmRfZXZlbnRzID0gX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9lcG9sbC5wb2xsLCBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhldmVudHM9bWF4X2V2ZW50cykKICAgICAgICAgICAgZm9yIGZkLCBldmVudF9tYXNrIGluIGZkX2V2ZW50czoKICAgICAgICAgICAgICAgIGV2ZW50cyA9IDAKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgJiB+c2VsZWN0LkVQT0xMSU46CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1dSSVRFCiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrICYgfnNlbGVjdC5FUE9MTE9VVDoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfUkVBRAoKICAgICAgICAgICAgICAgIGtleSA9IHNlbGYuX2tleV9mcm9tX2ZkKGZkKQogICAgICAgICAgICAgICAgaWYga2V5OgogICAgICAgICAgICAgICAgICAgIHJlYWR5LmFwcGVuZCgoa2V5LCBldmVudHMgJiBrZXkuZXZlbnRzKSkKICAgICAgICAgICAgcmV0dXJuIHJlYWR5CgogICAgICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgICAgc2VsZi5fZXBvbGwuY2xvc2UoKQogICAgICAgICAgICBzdXBlcihFcG9sbFNlbGVjdG9yLCBzZWxmKS5jbG9zZSgpCgoKaWYgaGFzYXR0cihzZWxlY3QsICJrcXVldWUiKToKICAgIGNsYXNzIEtxdWV1ZVNlbGVjdG9yKEJhc2VTZWxlY3Rvcik6CiAgICAgICAgIiIiIEtxdWV1ZSAvIEtldmVudC1iYXNlZCBzZWxlY3RvciAiIiIKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIHN1cGVyKEtxdWV1ZVNlbGVjdG9yLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgICAgIHNlbGYuX2txdWV1ZSA9IHNlbGVjdC5rcXVldWUoKQoKICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fa3F1ZXVlLmZpbGVubygpCgogICAgICAgIGRlZiByZWdpc3RlcihzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKEtxdWV1ZVNlbGVjdG9yLCBzZWxmKS5yZWdpc3RlcihmaWxlb2JqLCBldmVudHMsIGRhdGEpCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1JFQUQ6CiAgICAgICAgICAgICAgICBrZXZlbnQgPSBzZWxlY3Qua2V2ZW50KGtleS5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9SRUFELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRVZfQUREKQoKICAgICAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fa3F1ZXVlLmNvbnRyb2wsIEZhbHNlLCBba2V2ZW50XSwgMCwgMCkKCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAga2V2ZW50ID0gc2VsZWN0LmtldmVudChrZXkuZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9BREQpCgogICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgRmFsc2UsIFtrZXZlbnRdLCAwLCAwKQoKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBmaWxlb2JqKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoS3F1ZXVlU2VsZWN0b3IsIHNlbGYpLnVucmVnaXN0ZXIoZmlsZW9iaikKICAgICAgICAgICAgaWYga2V5LmV2ZW50cyAmIEVWRU5UX1JFQUQ6CiAgICAgICAgICAgICAgICBrZXZlbnQgPSBzZWxlY3Qua2V2ZW50KGtleS5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9SRUFELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRVZfREVMRVRFKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fa3F1ZXVlLmNvbnRyb2wsIEZhbHNlLCBba2V2ZW50XSwgMCwgMCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBTZWxlY3RvckVycm9yOgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgaWYga2V5LmV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAga2V2ZW50ID0gc2VsZWN0LmtldmVudChrZXkuZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9ERUxFVEUpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgRmFsc2UsIFtrZXZlbnRdLCAwLCAwKQogICAgICAgICAgICAgICAgZXhjZXB0IFNlbGVjdG9yRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgc2VsZWN0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbWF4KHRpbWVvdXQsIDApCgogICAgICAgICAgICBtYXhfZXZlbnRzID0gbGVuKHNlbGYuX2ZkX3RvX2tleSkgKiAyCiAgICAgICAgICAgIHJlYWR5X2ZkcyA9IHt9CgogICAgICAgICAgICBrZXZlbnRfbGlzdCA9IF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fa3F1ZXVlLmNvbnRyb2wsIFRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBtYXhfZXZlbnRzLCB0aW1lb3V0KQoKICAgICAgICAgICAgZm9yIGtldmVudCBpbiBrZXZlbnRfbGlzdDoKICAgICAgICAgICAgICAgIGZkID0ga2V2ZW50LmlkZW50CiAgICAgICAgICAgICAgICBldmVudF9tYXNrID0ga2V2ZW50LmZpbHRlcgogICAgICAgICAgICAgICAgZXZlbnRzID0gMAogICAgICAgICAgICAgICAgaWYgZXZlbnRfbWFzayA9PSBzZWxlY3QuS1FfRklMVEVSX1JFQUQ6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1JFQUQKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgPT0gc2VsZWN0LktRX0ZJTFRFUl9XUklURToKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfV1JJVEUKCiAgICAgICAgICAgICAgICBrZXkgPSBzZWxmLl9rZXlfZnJvbV9mZChmZCkKICAgICAgICAgICAgICAgIGlmIGtleToKICAgICAgICAgICAgICAgICAgICBpZiBrZXkuZmQgbm90IGluIHJlYWR5X2ZkczoKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlfZmRzW2tleS5mZF0gPSAoa2V5LCBldmVudHMgJiBrZXkuZXZlbnRzKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9ldmVudHMgPSByZWFkeV9mZHNba2V5LmZkXVsxXQogICAgICAgICAgICAgICAgICAgICAgICByZWFkeV9mZHNba2V5LmZkXSA9IChrZXksIChldmVudHMgfCBvbGRfZXZlbnRzKSAmIGtleS5ldmVudHMpCgogICAgICAgICAgICByZXR1cm4gbGlzdChyZWFkeV9mZHMudmFsdWVzKCkpCgogICAgICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgICAgc2VsZi5fa3F1ZXVlLmNsb3NlKCkKICAgICAgICAgICAgc3VwZXIoS3F1ZXVlU2VsZWN0b3IsIHNlbGYpLmNsb3NlKCkKCgppZiBub3QgaGFzYXR0cihzZWxlY3QsICdzZWxlY3QnKTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IEFwcEVuZ2luZQogICAgSEFTX1NFTEVDVCA9IEZhbHNlCgoKZGVmIF9jYW5fYWxsb2NhdGUoc3RydWN0KToKICAgICIiIiBDaGVja3MgdGhhdCBzZWxlY3Qgc3RydWN0cyBjYW4gYmUgYWxsb2NhdGVkIGJ5IHRoZSB1bmRlcmx5aW5nCiAgICBvcGVyYXRpbmcgc3lzdGVtLCBub3QganVzdCBhZHZlcnRpc2VkIGJ5IHRoZSBzZWxlY3QgbW9kdWxlLiBXZSBkb24ndAogICAgY2hlY2sgc2VsZWN0KCkgYmVjYXVzZSB3ZSdsbCBiZSBob3BlZnVsIHRoYXQgbW9zdCBwbGF0Zm9ybXMgdGhhdAogICAgZG9uJ3QgaGF2ZSBpdCBhdmFpbGFibGUgd2lsbCBub3QgYWR2ZXJ0aXNlIGl0LiAoaWU6IEdBRSkgIiIiCiAgICB0cnk6CiAgICAgICAgIyBzZWxlY3QucG9sbCgpIG9iamVjdHMgd29uJ3QgZmFpbCB1bnRpbCB1c2VkLgogICAgICAgIGlmIHN0cnVjdCA9PSAncG9sbCc6CiAgICAgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCiAgICAgICAgICAgIHAucG9sbCgwKQoKICAgICAgICAjIEFsbCBvdGhlcnMgd2lsbCBmYWlsIG9uIGFsbG9jYXRpb24uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZ2V0YXR0cihzZWxlY3QsIHN0cnVjdCkoKS5jbG9zZSgpCiAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdCAoT1NFcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKIyBDaG9vc2UgdGhlIGJlc3QgaW1wbGVtZW50YXRpb24sIHJvdWdobHk6CiMga3F1ZXVlID09IGVwb2xsID4gcG9sbCA+IHNlbGVjdC4gRGV2cG9sbCBub3Qgc3VwcG9ydGVkLiAoU2VlIGFib3ZlKQojIHNlbGVjdCgpIGFsc28gY2FuJ3QgYWNjZXB0IGEgRkQgPiBGRF9TRVRTSVpFICh1c3VhbGx5IGFyb3VuZCAxMDI0KQpkZWYgRGVmYXVsdFNlbGVjdG9yKCk6CiAgICAiIiIgVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgYSBmaXJzdCBjYWxsIGZvciBEZWZhdWx0U2VsZWN0b3IgdG8KICAgIGRldGVjdCBpZiB0aGUgc2VsZWN0IG1vZHVsZSBpcyBiZWluZyBtb25rZXktcGF0Y2hlZCBpbmNvcnJlY3RseQogICAgYnkgZXZlbnRsZXQsIGdyZWVubGV0LCBhbmQgcHJlc2VydmUgcHJvcGVyIGJlaGF2aW9yLiAiIiIKICAgIGdsb2JhbCBfREVGQVVMVF9TRUxFQ1RPUgogICAgaWYgX0RFRkFVTFRfU0VMRUNUT1IgaXMgTm9uZToKICAgICAgICBpZiBfY2FuX2FsbG9jYXRlKCdrcXVldWUnKToKICAgICAgICAgICAgX0RFRkFVTFRfU0VMRUNUT1IgPSBLcXVldWVTZWxlY3RvcgogICAgICAgIGVsaWYgX2Nhbl9hbGxvY2F0ZSgnZXBvbGwnKToKICAgICAgICAgICAgX0RFRkFVTFRfU0VMRUNUT1IgPSBFcG9sbFNlbGVjdG9yCiAgICAgICAgZWxpZiBfY2FuX2FsbG9jYXRlKCdwb2xsJyk6CiAgICAgICAgICAgIF9ERUZBVUxUX1NFTEVDVE9SID0gUG9sbFNlbGVjdG9yCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGVjdCwgJ3NlbGVjdCcpOgogICAgICAgICAgICBfREVGQVVMVF9TRUxFQ1RPUiA9IFNlbGVjdFNlbGVjdG9yCiAgICAgICAgZWxzZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IEFwcEVuZ2luZQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdQbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIGEgc2VsZWN0b3InKQogICAgcmV0dXJuIF9ERUZBVUxUX1NFTEVDVE9SKCkKUEsDBBQAAAAAAAAAIQDV78iisC8AALAvAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc3NsXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBlcnJubwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IGhtYWMKCmZyb20gYmluYXNjaWkgaW1wb3J0IGhleGxpZnksIHVuaGV4bGlmeQpmcm9tIGhhc2hsaWIgaW1wb3J0IG1kNSwgc2hhMSwgc2hhMjU2Cgpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgU1NMRXJyb3IsIEluc2VjdXJlUGxhdGZvcm1XYXJuaW5nLCBTTklNaXNzaW5nV2FybmluZwoKClNTTENvbnRleHQgPSBOb25lCkhBU19TTkkgPSBGYWxzZQpJU19QWU9QRU5TU0wgPSBGYWxzZQpJU19TRUNVUkVUUkFOU1BPUlQgPSBGYWxzZQoKIyBNYXBzIHRoZSBsZW5ndGggb2YgYSBkaWdlc3QgdG8gYSBwb3NzaWJsZSBoYXNoIGZ1bmN0aW9uIHByb2R1Y2luZyB0aGlzIGRpZ2VzdApIQVNIRlVOQ19NQVAgPSB7CiAgICAzMjogbWQ1LAogICAgNDA6IHNoYTEsCiAgICA2NDogc2hhMjU2LAp9CgoKZGVmIF9jb25zdF9jb21wYXJlX2RpZ2VzdF9iYWNrcG9ydChhLCBiKToKICAgICIiIgogICAgQ29tcGFyZSB0d28gZGlnZXN0cyBvZiBlcXVhbCBsZW5ndGggaW4gY29uc3RhbnQgdGltZS4KCiAgICBUaGUgZGlnZXN0cyBtdXN0IGJlIG9mIHR5cGUgc3RyL2J5dGVzLgogICAgUmV0dXJucyBUcnVlIGlmIHRoZSBkaWdlc3RzIG1hdGNoLCBhbmQgRmFsc2Ugb3RoZXJ3aXNlLgogICAgIiIiCiAgICByZXN1bHQgPSBhYnMobGVuKGEpIC0gbGVuKGIpKQogICAgZm9yIGwsIHIgaW4gemlwKGJ5dGVhcnJheShhKSwgYnl0ZWFycmF5KGIpKToKICAgICAgICByZXN1bHQgfD0gbCBeIHIKICAgIHJldHVybiByZXN1bHQgPT0gMAoKCl9jb25zdF9jb21wYXJlX2RpZ2VzdCA9IGdldGF0dHIoaG1hYywgJ2NvbXBhcmVfZGlnZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29uc3RfY29tcGFyZV9kaWdlc3RfYmFja3BvcnQpCgoKdHJ5OiAgIyBUZXN0IGZvciBTU0wgZmVhdHVyZXMKICAgIGltcG9ydCBzc2wKICAgIGZyb20gc3NsIGltcG9ydCB3cmFwX3NvY2tldCwgQ0VSVF9OT05FLCBQUk9UT0NPTF9TU0x2MjMKICAgIGZyb20gc3NsIGltcG9ydCBIQVNfU05JICAjIEhhcyBTTkk/CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKCgp0cnk6CiAgICBmcm9tIHNzbCBpbXBvcnQgT1BfTk9fU1NMdjIsIE9QX05PX1NTTHYzLCBPUF9OT19DT01QUkVTU0lPTgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBPUF9OT19TU0x2MiwgT1BfTk9fU1NMdjMgPSAweDEwMDAwMDAsIDB4MjAwMDAwMAogICAgT1BfTk9fQ09NUFJFU1NJT04gPSAweDIwMDAwCgojIEEgc2VjdXJlIGRlZmF1bHQuCiMgU291cmNlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUTFMgY2lwaGVyczoKIwojIC0gaHR0cHM6Ly93aWtpLm1vemlsbGEub3JnL1NlY3VyaXR5L1NlcnZlcl9TaWRlX1RMUwojIC0gaHR0cHM6Ly93d3cuc3NsbGFicy5jb20vcHJvamVjdHMvYmVzdC1wcmFjdGljZXMvaW5kZXguaHRtbAojIC0gaHR0cHM6Ly9oeW5lay5tZS9hcnRpY2xlcy9oYXJkZW5pbmcteW91ci13ZWItc2VydmVycy1zc2wtY2lwaGVycy8KIwojIFRoZSBnZW5lcmFsIGludGVudCBpczoKIyAtIFByZWZlciBUTFMgMS4zIGNpcGhlciBzdWl0ZXMKIyAtIHByZWZlciBjaXBoZXIgc3VpdGVzIHRoYXQgb2ZmZXIgcGVyZmVjdCBmb3J3YXJkIHNlY3JlY3kgKERIRS9FQ0RIRSksCiMgLSBwcmVmZXIgRUNESEUgb3ZlciBESEUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSwKIyAtIHByZWZlciBhbnkgQUVTLUdDTSBhbmQgQ2hhQ2hhMjAgb3ZlciBhbnkgQUVTLUNCQyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZAojICAgc2VjdXJpdHksCiMgLSBwcmVmZXIgQUVTLUdDTSBvdmVyIENoYUNoYTIwIGJlY2F1c2UgaGFyZHdhcmUtYWNjZWxlcmF0ZWQgQUVTIGlzIGNvbW1vbiwKIyAtIGRpc2FibGUgTlVMTCBhdXRoZW50aWNhdGlvbiwgTUQ1IE1BQ3MgYW5kIERTUyBmb3Igc2VjdXJpdHkgcmVhc29ucy4KREVGQVVMVF9DSVBIRVJTID0gJzonLmpvaW4oWwogICAgJ1RMUzEzLUFFUy0yNTYtR0NNLVNIQTM4NCcsCiAgICAnVExTMTMtQ0hBQ0hBMjAtUE9MWTEzMDUtU0hBMjU2JywKICAgICdUTFMxMy1BRVMtMTI4LUdDTS1TSEEyNTYnLAogICAgJ0VDREgrQUVTR0NNJywKICAgICdFQ0RIK0NIQUNIQTIwJywKICAgICdESCtBRVNHQ00nLAogICAgJ0RIK0NIQUNIQTIwJywKICAgICdFQ0RIK0FFUzI1NicsCiAgICAnREgrQUVTMjU2JywKICAgICdFQ0RIK0FFUzEyOCcsCiAgICAnREgrQUVTJywKICAgICdSU0ErQUVTR0NNJywKICAgICdSU0ErQUVTJywKICAgICchYU5VTEwnLAogICAgJyFlTlVMTCcsCiAgICAnIU1ENScsCl0pCgp0cnk6CiAgICBmcm9tIHNzbCBpbXBvcnQgU1NMQ29udGV4dCAgIyBNb2Rlcm4gU1NMPwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgc3lzCgogICAgY2xhc3MgU1NMQ29udGV4dChvYmplY3QpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIgJiAzLjEKICAgICAgICBzdXBwb3J0c19zZXRfY2lwaGVycyA9ICgoMiwgNykgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgMikgPD0gc3lzLnZlcnNpb25faW5mbykKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sX3ZlcnNpb24pOgogICAgICAgICAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2xfdmVyc2lvbgogICAgICAgICAgICAjIFVzZSBkZWZhdWx0IHZhbHVlcyBmcm9tIGEgcmVhbCBTU0xDb250ZXh0CiAgICAgICAgICAgIHNlbGYuY2hlY2tfaG9zdG5hbWUgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfTk9ORQogICAgICAgICAgICBzZWxmLmNhX2NlcnRzID0gTm9uZQogICAgICAgICAgICBzZWxmLm9wdGlvbnMgPSAwCiAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBOb25lCiAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5jaXBoZXJzID0gTm9uZQoKICAgICAgICBkZWYgbG9hZF9jZXJ0X2NoYWluKHNlbGYsIGNlcnRmaWxlLCBrZXlmaWxlKToKICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCiAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IGtleWZpbGUKCiAgICAgICAgZGVmIGxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzZWxmLCBjYWZpbGU9Tm9uZSwgY2FwYXRoPU5vbmUpOgogICAgICAgICAgICBzZWxmLmNhX2NlcnRzID0gY2FmaWxlCgogICAgICAgICAgICBpZiBjYXBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBTU0xFcnJvcigiQ0EgZGlyZWN0b3JpZXMgbm90IHN1cHBvcnRlZCBpbiBvbGRlciBQeXRob25zIikKCiAgICAgICAgZGVmIHNldF9jaXBoZXJzKHNlbGYsIGNpcGhlcl9zdWl0ZSk6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN1cHBvcnRzX3NldF9jaXBoZXJzOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgICAgICdZb3VyIHZlcnNpb24gb2YgUHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyAnCiAgICAgICAgICAgICAgICAgICAgJ2EgY3VzdG9tIGNpcGhlciBzdWl0ZS4gUGxlYXNlIHVwZ3JhZGUgdG8gUHl0aG9uICcKICAgICAgICAgICAgICAgICAgICAnMi43LCAzLjIsIG9yIGxhdGVyIGlmIHlvdSBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuY2lwaGVycyA9IGNpcGhlcl9zdWl0ZQoKICAgICAgICBkZWYgd3JhcF9zb2NrZXQoc2VsZiwgc29ja2V0LCBzZXJ2ZXJfaG9zdG5hbWU9Tm9uZSwgc2VydmVyX3NpZGU9RmFsc2UpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgJ0EgdHJ1ZSBTU0xDb250ZXh0IG9iamVjdCBpcyBub3QgYXZhaWxhYmxlLiBUaGlzIHByZXZlbnRzICcKICAgICAgICAgICAgICAgICd1cmxsaWIzIGZyb20gY29uZmlndXJpbmcgU1NMIGFwcHJvcHJpYXRlbHkgYW5kIG1heSBjYXVzZSAnCiAgICAgICAgICAgICAgICAnY2VydGFpbiBTU0wgY29ubmVjdGlvbnMgdG8gZmFpbC4gWW91IGNhbiB1cGdyYWRlIHRvIGEgbmV3ZXIgJwogICAgICAgICAgICAgICAgJ3ZlcnNpb24gb2YgUHl0aG9uIHRvIHNvbHZlIHRoaXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJwogICAgICAgICAgICAgICAgJ2h0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvYWR2YW5jZWQtdXNhZ2UuaHRtbCcKICAgICAgICAgICAgICAgICcjc3NsLXdhcm5pbmdzJywKICAgICAgICAgICAgICAgIEluc2VjdXJlUGxhdGZvcm1XYXJuaW5nCiAgICAgICAgICAgICkKICAgICAgICAgICAga3dhcmdzID0gewogICAgICAgICAgICAgICAgJ2tleWZpbGUnOiBzZWxmLmtleWZpbGUsCiAgICAgICAgICAgICAgICAnY2VydGZpbGUnOiBzZWxmLmNlcnRmaWxlLAogICAgICAgICAgICAgICAgJ2NhX2NlcnRzJzogc2VsZi5jYV9jZXJ0cywKICAgICAgICAgICAgICAgICdjZXJ0X3JlcXMnOiBzZWxmLnZlcmlmeV9tb2RlLAogICAgICAgICAgICAgICAgJ3NzbF92ZXJzaW9uJzogc2VsZi5wcm90b2NvbCwKICAgICAgICAgICAgICAgICdzZXJ2ZXJfc2lkZSc6IHNlcnZlcl9zaWRlLAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHNlbGYuc3VwcG9ydHNfc2V0X2NpcGhlcnM6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMi43KwogICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBfc29ja2V0KHNvY2tldCwgY2lwaGVycz1zZWxmLmNpcGhlcnMsICoqa3dhcmdzKQogICAgICAgICAgICBlbHNlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIuNgogICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBfc29ja2V0KHNvY2tldCwgKiprd2FyZ3MpCgoKZGVmIGFzc2VydF9maW5nZXJwcmludChjZXJ0LCBmaW5nZXJwcmludCk6CiAgICAiIiIKICAgIENoZWNrcyBpZiBnaXZlbiBmaW5nZXJwcmludCBtYXRjaGVzIHRoZSBzdXBwbGllZCBjZXJ0aWZpY2F0ZS4KCiAgICA6cGFyYW0gY2VydDoKICAgICAgICBDZXJ0aWZpY2F0ZSBhcyBieXRlcyBvYmplY3QuCiAgICA6cGFyYW0gZmluZ2VycHJpbnQ6CiAgICAgICAgRmluZ2VycHJpbnQgYXMgc3RyaW5nIG9mIGhleGRpZ2l0cywgY2FuIGJlIGludGVyc3BlcnNlZCBieSBjb2xvbnMuCiAgICAiIiIKCiAgICBmaW5nZXJwcmludCA9IGZpbmdlcnByaW50LnJlcGxhY2UoJzonLCAnJykubG93ZXIoKQogICAgZGlnZXN0X2xlbmd0aCA9IGxlbihmaW5nZXJwcmludCkKICAgIGhhc2hmdW5jID0gSEFTSEZVTkNfTUFQLmdldChkaWdlc3RfbGVuZ3RoKQogICAgaWYgbm90IGhhc2hmdW5jOgogICAgICAgIHJhaXNlIFNTTEVycm9yKAogICAgICAgICAgICAnRmluZ2VycHJpbnQgb2YgaW52YWxpZCBsZW5ndGg6IHswfScuZm9ybWF0KGZpbmdlcnByaW50KSkKCiAgICAjIFdlIG5lZWQgZW5jb2RlKCkgaGVyZSBmb3IgcHkzMjsgd29ya3Mgb24gcHkyIGFuZCBwMzMuCiAgICBmaW5nZXJwcmludF9ieXRlcyA9IHVuaGV4bGlmeShmaW5nZXJwcmludC5lbmNvZGUoKSkKCiAgICBjZXJ0X2RpZ2VzdCA9IGhhc2hmdW5jKGNlcnQpLmRpZ2VzdCgpCgogICAgaWYgbm90IF9jb25zdF9jb21wYXJlX2RpZ2VzdChjZXJ0X2RpZ2VzdCwgZmluZ2VycHJpbnRfYnl0ZXMpOgogICAgICAgIHJhaXNlIFNTTEVycm9yKCdGaW5nZXJwcmludHMgZGlkIG5vdCBtYXRjaC4gRXhwZWN0ZWQgInswfSIsIGdvdCAiezF9Ii4nCiAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChmaW5nZXJwcmludCwgaGV4bGlmeShjZXJ0X2RpZ2VzdCkpKQoKCmRlZiByZXNvbHZlX2NlcnRfcmVxcyhjYW5kaWRhdGUpOgogICAgIiIiCiAgICBSZXNvbHZlcyB0aGUgYXJndW1lbnQgdG8gYSBudW1lcmljIGNvbnN0YW50LCB3aGljaCBjYW4gYmUgcGFzc2VkIHRvCiAgICB0aGUgd3JhcF9zb2NrZXQgZnVuY3Rpb24vbWV0aG9kIGZyb20gdGhlIHNzbCBtb2R1bGUuCiAgICBEZWZhdWx0cyB0byA6ZGF0YTpgc3NsLkNFUlRfTk9ORWAuCiAgICBJZiBnaXZlbiBhIHN0cmluZyBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCBpbiB0aGUKICAgIDptb2Q6YHNzbGAgbW9kdWxlIG9yIGl0cyBhYmJyZXZhdGlvbi4KICAgIChTbyB5b3UgY2FuIHNwZWNpZnkgYFJFUVVJUkVEYCBpbnN0ZWFkIG9mIGBDRVJUX1JFUVVJUkVEYC4KICAgIElmIGl0J3MgbmVpdGhlciBgTm9uZWAgbm9yIGEgc3RyaW5nIHdlIGFzc3VtZSBpdCBpcyBhbHJlYWR5IHRoZSBudW1lcmljCiAgICBjb25zdGFudCB3aGljaCBjYW4gZGlyZWN0bHkgYmUgcGFzc2VkIHRvIHdyYXBfc29ja2V0LgogICAgIiIiCiAgICBpZiBjYW5kaWRhdGUgaXMgTm9uZToKICAgICAgICByZXR1cm4gQ0VSVF9OT05FCgogICAgaWYgaXNpbnN0YW5jZShjYW5kaWRhdGUsIHN0cik6CiAgICAgICAgcmVzID0gZ2V0YXR0cihzc2wsIGNhbmRpZGF0ZSwgTm9uZSkKICAgICAgICBpZiByZXMgaXMgTm9uZToKICAgICAgICAgICAgcmVzID0gZ2V0YXR0cihzc2wsICdDRVJUXycgKyBjYW5kaWRhdGUpCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIHJldHVybiBjYW5kaWRhdGUKCgpkZWYgcmVzb2x2ZV9zc2xfdmVyc2lvbihjYW5kaWRhdGUpOgogICAgIiIiCiAgICBsaWtlIHJlc29sdmVfY2VydF9yZXFzCiAgICAiIiIKICAgIGlmIGNhbmRpZGF0ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBQUk9UT0NPTF9TU0x2MjMKCiAgICBpZiBpc2luc3RhbmNlKGNhbmRpZGF0ZSwgc3RyKToKICAgICAgICByZXMgPSBnZXRhdHRyKHNzbCwgY2FuZGlkYXRlLCBOb25lKQogICAgICAgIGlmIHJlcyBpcyBOb25lOgogICAgICAgICAgICByZXMgPSBnZXRhdHRyKHNzbCwgJ1BST1RPQ09MXycgKyBjYW5kaWRhdGUpCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIHJldHVybiBjYW5kaWRhdGUKCgpkZWYgY3JlYXRlX3VybGxpYjNfY29udGV4dChzc2xfdmVyc2lvbj1Ob25lLCBjZXJ0X3JlcXM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz1Ob25lLCBjaXBoZXJzPU5vbmUpOgogICAgIiIiQWxsIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgYGBzc2xfd3JhcF9zb2NrZXRgYC4KCiAgICBCeSBkZWZhdWx0LCB0aGlzIGZ1bmN0aW9uIGRvZXMgYSBsb3Qgb2YgdGhlIHNhbWUgd29yayB0aGF0CiAgICBgYHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0YGAgZG9lcyBvbiBQeXRob24gMy40Ky4gSXQ6CgogICAgLSBEaXNhYmxlcyBTU0x2MiwgU1NMdjMsIGFuZCBjb21wcmVzc2lvbgogICAgLSBTZXRzIGEgcmVzdHJpY3RlZCBzZXQgb2Ygc2VydmVyIGNpcGhlcnMKCiAgICBJZiB5b3Ugd2lzaCB0byBlbmFibGUgU1NMdjMsIHlvdSBjYW4gZG86OgoKICAgICAgICBmcm9tIHVybGxpYjMudXRpbCBpbXBvcnQgc3NsXwogICAgICAgIGNvbnRleHQgPSBzc2xfLmNyZWF0ZV91cmxsaWIzX2NvbnRleHQoKQogICAgICAgIGNvbnRleHQub3B0aW9ucyAmPSB+c3NsXy5PUF9OT19TU0x2MwoKICAgIFlvdSBjYW4gZG8gdGhlIHNhbWUgdG8gZW5hYmxlIGNvbXByZXNzaW9uIChzdWJzdGl0dXRpbmcgYGBDT01QUkVTU0lPTmBgCiAgICBmb3IgYGBTU0x2M2BgIGluIHRoZSBsYXN0IGxpbmUgYWJvdmUpLgoKICAgIDpwYXJhbSBzc2xfdmVyc2lvbjoKICAgICAgICBUaGUgZGVzaXJlZCBwcm90b2NvbCB2ZXJzaW9uIHRvIHVzZS4gVGhpcyB3aWxsIGRlZmF1bHQgdG8KICAgICAgICBQUk9UT0NPTF9TU0x2MjMgd2hpY2ggd2lsbCBuZWdvdGlhdGUgdGhlIGhpZ2hlc3QgcHJvdG9jb2wgdGhhdCBib3RoCiAgICAgICAgdGhlIHNlcnZlciBhbmQgeW91ciBpbnN0YWxsYXRpb24gb2YgT3BlblNTTCBzdXBwb3J0LgogICAgOnBhcmFtIGNlcnRfcmVxczoKICAgICAgICBXaGV0aGVyIHRvIHJlcXVpcmUgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4gVGhpcyBkZWZhdWx0cyB0bwogICAgICAgIGBgc3NsLkNFUlRfUkVRVUlSRURgYC4KICAgIDpwYXJhbSBvcHRpb25zOgogICAgICAgIFNwZWNpZmljIE9wZW5TU0wgb3B0aW9ucy4gVGhlc2UgZGVmYXVsdCB0byBgYHNzbC5PUF9OT19TU0x2MmBgLAogICAgICAgIGBgc3NsLk9QX05PX1NTTHYzYGAsIGBgc3NsLk9QX05PX0NPTVBSRVNTSU9OYGAuCiAgICA6cGFyYW0gY2lwaGVyczoKICAgICAgICBXaGljaCBjaXBoZXIgc3VpdGVzIHRvIGFsbG93IHRoZSBzZXJ2ZXIgdG8gc2VsZWN0LgogICAgOnJldHVybnM6CiAgICAgICAgQ29uc3RydWN0ZWQgU1NMQ29udGV4dCBvYmplY3Qgd2l0aCBzcGVjaWZpZWQgb3B0aW9ucwogICAgOnJ0eXBlOiBTU0xDb250ZXh0CiAgICAiIiIKICAgIGNvbnRleHQgPSBTU0xDb250ZXh0KHNzbF92ZXJzaW9uIG9yIHNzbC5QUk9UT0NPTF9TU0x2MjMpCgogICAgIyBTZXR0aW5nIHRoZSBkZWZhdWx0IGhlcmUsIGFzIHdlIG1heSBoYXZlIG5vIHNzbCBtb2R1bGUgb24gaW1wb3J0CiAgICBjZXJ0X3JlcXMgPSBzc2wuQ0VSVF9SRVFVSVJFRCBpZiBjZXJ0X3JlcXMgaXMgTm9uZSBlbHNlIGNlcnRfcmVxcwoKICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKICAgICAgICBvcHRpb25zID0gMAogICAgICAgICMgU1NMdjIgaXMgZWFzaWx5IGJyb2tlbiBhbmQgaXMgY29uc2lkZXJlZCBoYXJtZnVsIGFuZCBkYW5nZXJvdXMKICAgICAgICBvcHRpb25zIHw9IE9QX05PX1NTTHYyCiAgICAgICAgIyBTU0x2MyBoYXMgc2V2ZXJhbCBwcm9ibGVtcyBhbmQgaXMgbm93IGRhbmdlcm91cwogICAgICAgIG9wdGlvbnMgfD0gT1BfTk9fU1NMdjMKICAgICAgICAjIERpc2FibGUgY29tcHJlc3Npb24gdG8gcHJldmVudCBDUklNRSBhdHRhY2tzIGZvciBPcGVuU1NMIDEuMCsKICAgICAgICAjIChpc3N1ZSAjMzA5KQogICAgICAgIG9wdGlvbnMgfD0gT1BfTk9fQ09NUFJFU1NJT04KCiAgICBjb250ZXh0Lm9wdGlvbnMgfD0gb3B0aW9ucwoKICAgIGlmIGdldGF0dHIoY29udGV4dCwgJ3N1cHBvcnRzX3NldF9jaXBoZXJzJywgVHJ1ZSk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMi42CiAgICAgICAgY29udGV4dC5zZXRfY2lwaGVycyhjaXBoZXJzIG9yIERFRkFVTFRfQ0lQSEVSUykKCiAgICBjb250ZXh0LnZlcmlmeV9tb2RlID0gY2VydF9yZXFzCiAgICBpZiBnZXRhdHRyKGNvbnRleHQsICdjaGVja19ob3N0bmFtZScsIE5vbmUpIGlzIG5vdCBOb25lOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMuMgogICAgICAgICMgV2UgZG8gb3VyIG93biB2ZXJpZmljYXRpb24sIGluY2x1ZGluZyBmaW5nZXJwcmludHMgYW5kIGFsdGVybmF0aXZlCiAgICAgICAgIyBob3N0bmFtZXMuIFNvIGRpc2FibGUgaXQgaGVyZQogICAgICAgIGNvbnRleHQuY2hlY2tfaG9zdG5hbWUgPSBGYWxzZQogICAgcmV0dXJuIGNvbnRleHQKCgpkZWYgc3NsX3dyYXBfc29ja2V0KHNvY2ssIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSwgY2VydF9yZXFzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9Tm9uZSwgc2VydmVyX2hvc3RuYW1lPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249Tm9uZSwgY2lwaGVycz1Ob25lLCBzc2xfY29udGV4dD1Ob25lLAogICAgICAgICAgICAgICAgICAgIGNhX2NlcnRfZGlyPU5vbmUpOgogICAgIiIiCiAgICBBbGwgYXJndW1lbnRzIGV4Y2VwdCBmb3Igc2VydmVyX2hvc3RuYW1lLCBzc2xfY29udGV4dCwgYW5kIGNhX2NlcnRfZGlyIGhhdmUKICAgIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhleSBkbyB3aGVuIHVzaW5nIDpmdW5jOmBzc2wud3JhcF9zb2NrZXRgLgoKICAgIDpwYXJhbSBzZXJ2ZXJfaG9zdG5hbWU6CiAgICAgICAgV2hlbiBTTkkgaXMgc3VwcG9ydGVkLCB0aGUgZXhwZWN0ZWQgaG9zdG5hbWUgb2YgdGhlIGNlcnRpZmljYXRlCiAgICA6cGFyYW0gc3NsX2NvbnRleHQ6CiAgICAgICAgQSBwcmUtbWFkZSA6Y2xhc3M6YFNTTENvbnRleHRgIG9iamVjdC4gSWYgbm9uZSBpcyBwcm92aWRlZCwgb25lIHdpbGwKICAgICAgICBiZSBjcmVhdGVkIHVzaW5nIDpmdW5jOmBjcmVhdGVfdXJsbGliM19jb250ZXh0YC4KICAgIDpwYXJhbSBjaXBoZXJzOgogICAgICAgIEEgc3RyaW5nIG9mIGNpcGhlcnMgd2Ugd2lzaCB0aGUgY2xpZW50IHRvIHN1cHBvcnQuIFRoaXMgaXMgbm90CiAgICAgICAgc3VwcG9ydGVkIG9uIFB5dGhvbiAyLjYgYXMgdGhlIHNzbCBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBpdC4KICAgIDpwYXJhbSBjYV9jZXJ0X2RpcjoKICAgICAgICBBIGRpcmVjdG9yeSBjb250YWluaW5nIENBIGNlcnRpZmljYXRlcyBpbiBtdWx0aXBsZSBzZXBhcmF0ZSBmaWxlcywgYXMKICAgICAgICBzdXBwb3J0ZWQgYnkgT3BlblNTTCdzIC1DQXBhdGggZmxhZyBvciB0aGUgY2FwYXRoIGFyZ3VtZW50IHRvCiAgICAgICAgU1NMQ29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoKS4KICAgICIiIgogICAgY29udGV4dCA9IHNzbF9jb250ZXh0CiAgICBpZiBjb250ZXh0IGlzIE5vbmU6CiAgICAgICAgIyBOb3RlOiBUaGlzIGJyYW5jaCBvZiBjb2RlIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyBpbiBpdCBhcmUgbm8gbG9uZ2VyCiAgICAgICAgIyB1c2VkIGJ5IHVybGxpYjMgaXRzZWxmLiBXZSBzaG91bGQgY29uc2lkZXIgZGVwcmVjYXRpbmcgYW5kIHJlbW92aW5nCiAgICAgICAgIyB0aGlzIGNvZGUuCiAgICAgICAgY29udGV4dCA9IGNyZWF0ZV91cmxsaWIzX2NvbnRleHQoc3NsX3ZlcnNpb24sIGNlcnRfcmVxcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzPWNpcGhlcnMpCgogICAgaWYgY2FfY2VydHMgb3IgY2FfY2VydF9kaXI6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYV9jZXJ0cywgY2FfY2VydF9kaXIpCiAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyLjYsIDIuNywgMy4yCiAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKGUpCiAgICAgICAgIyBQeTMzIHJhaXNlcyBGaWxlTm90Rm91bmRFcnJvciB3aGljaCBzdWJjbGFzc2VzIE9TRXJyb3IKICAgICAgICAjIFRoZXNlIGFyZSBub3QgZXF1aXZhbGVudCB1bmxlc3Mgd2UgY2hlY2sgdGhlIGVycm5vIGF0dHJpYnV0ZQogICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMy4zIGFuZCBiZXlvbmQKICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CiAgICAgICAgICAgICAgICByYWlzZSBTU0xFcnJvcihlKQogICAgICAgICAgICByYWlzZQogICAgZWxpZiBnZXRhdHRyKGNvbnRleHQsICdsb2FkX2RlZmF1bHRfY2VydHMnLCBOb25lKSBpcyBub3QgTm9uZToKICAgICAgICAjIHRyeSB0byBsb2FkIE9TIGRlZmF1bHQgY2VydHM7IHdvcmtzIHdlbGwgb24gV2luZG93cyAocmVxdWlyZSBQeXRob24zLjQrKQogICAgICAgIGNvbnRleHQubG9hZF9kZWZhdWx0X2NlcnRzKCkKCiAgICBpZiBjZXJ0ZmlsZToKICAgICAgICBjb250ZXh0LmxvYWRfY2VydF9jaGFpbihjZXJ0ZmlsZSwga2V5ZmlsZSkKICAgIGlmIEhBU19TTkk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBPcGVuU1NMIHdpdGggZW5hYmxlZCBTTkkKICAgICAgICByZXR1cm4gY29udGV4dC53cmFwX3NvY2tldChzb2NrLCBzZXJ2ZXJfaG9zdG5hbWU9c2VydmVyX2hvc3RuYW1lKQoKICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgJ0FuIEhUVFBTIHJlcXVlc3QgaGFzIGJlZW4gbWFkZSwgYnV0IHRoZSBTTkkgKFN1YmplY3QgTmFtZSAnCiAgICAgICAgJ0luZGljYXRpb24pIGV4dGVuc2lvbiB0byBUTFMgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLiAnCiAgICAgICAgJ1RoaXMgbWF5IGNhdXNlIHRoZSBzZXJ2ZXIgdG8gcHJlc2VudCBhbiBpbmNvcnJlY3QgVExTICcKICAgICAgICAnY2VydGlmaWNhdGUsIHdoaWNoIGNhbiBjYXVzZSB2YWxpZGF0aW9uIGZhaWx1cmVzLiBZb3UgY2FuIHVwZ3JhZGUgdG8gJwogICAgICAgICdhIG5ld2VyIHZlcnNpb24gb2YgUHl0aG9uIHRvIHNvbHZlIHRoaXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJwogICAgICAgICdodHRwczovL3VybGxpYjMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2FkdmFuY2VkLXVzYWdlLmh0bWwnCiAgICAgICAgJyNzc2wtd2FybmluZ3MnLAogICAgICAgIFNOSU1pc3NpbmdXYXJuaW5nCiAgICApCiAgICByZXR1cm4gY29udGV4dC53cmFwX3NvY2tldChzb2NrKQpQSwMEFAAAAAAAAAAhAFVSziAdJgAAHSYAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC90aW1lb3V0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKIyBUaGUgZGVmYXVsdCBzb2NrZXQgdGltZW91dCwgdXNlZCBieSBodHRwbGliIHRvIGluZGljYXRlIHRoYXQgbm8gdGltZW91dCB3YXMKIyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKZnJvbSBzb2NrZXQgaW1wb3J0IF9HTE9CQUxfREVGQVVMVF9USU1FT1VUCmltcG9ydCB0aW1lCgpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgVGltZW91dFN0YXRlRXJyb3IKCiMgQSBzZW50aW5lbCB2YWx1ZSB0byBpbmRpY2F0ZSB0aGF0IG5vIHRpbWVvdXQgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciBpbgojIHVybGxpYjMKX0RlZmF1bHQgPSBvYmplY3QoKQoKCiMgVXNlIHRpbWUubW9ub3RvbmljIGlmIGF2YWlsYWJsZS4KY3VycmVudF90aW1lID0gZ2V0YXR0cih0aW1lLCAibW9ub3RvbmljIiwgdGltZS50aW1lKQoKCmNsYXNzIFRpbWVvdXQob2JqZWN0KToKICAgICIiIiBUaW1lb3V0IGNvbmZpZ3VyYXRpb24uCgogICAgVGltZW91dHMgY2FuIGJlIGRlZmluZWQgYXMgYSBkZWZhdWx0IGZvciBhIHBvb2w6OgoKICAgICAgICB0aW1lb3V0ID0gVGltZW91dChjb25uZWN0PTIuMCwgcmVhZD03LjApCiAgICAgICAgaHR0cCA9IFBvb2xNYW5hZ2VyKHRpbWVvdXQ9dGltZW91dCkKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nKQoKICAgIE9yIHBlci1yZXF1ZXN0ICh3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBwb29sKTo6CgogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLycsIHRpbWVvdXQ9VGltZW91dCgxMCkpCgogICAgVGltZW91dHMgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgYWxsIHRoZSBwYXJhbWV0ZXJzIHRvIGBgTm9uZWBgOjoKCiAgICAgICAgbm9fdGltZW91dCA9IFRpbWVvdXQoY29ubmVjdD1Ob25lLCByZWFkPU5vbmUpCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vLCB0aW1lb3V0PW5vX3RpbWVvdXQpCgoKICAgIDpwYXJhbSB0b3RhbDoKICAgICAgICBUaGlzIGNvbWJpbmVzIHRoZSBjb25uZWN0IGFuZCByZWFkIHRpbWVvdXRzIGludG8gb25lOyB0aGUgcmVhZCB0aW1lb3V0CiAgICAgICAgd2lsbCBiZSBzZXQgdG8gdGhlIHRpbWUgbGVmdG92ZXIgZnJvbSB0aGUgY29ubmVjdCBhdHRlbXB0LiBJbiB0aGUKICAgICAgICBldmVudCB0aGF0IGJvdGggYSBjb25uZWN0IHRpbWVvdXQgYW5kIGEgdG90YWwgYXJlIHNwZWNpZmllZCwgb3IgYSByZWFkCiAgICAgICAgdGltZW91dCBhbmQgYSB0b3RhbCBhcmUgc3BlY2lmaWVkLCB0aGUgc2hvcnRlciB0aW1lb3V0IHdpbGwgYmUgYXBwbGllZC4KCiAgICAgICAgRGVmYXVsdHMgdG8gTm9uZS4KCiAgICA6dHlwZSB0b3RhbDogaW50ZWdlciwgZmxvYXQsIG9yIE5vbmUKCiAgICA6cGFyYW0gY29ubmVjdDoKICAgICAgICBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24gYXR0ZW1wdCB0byBhIHNlcnZlcgogICAgICAgIHRvIHN1Y2NlZWQuIE9taXR0aW5nIHRoZSBwYXJhbWV0ZXIgd2lsbCBkZWZhdWx0IHRoZSBjb25uZWN0IHRpbWVvdXQgdG8KICAgICAgICB0aGUgc3lzdGVtIGRlZmF1bHQsIHByb2JhYmx5IGB0aGUgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBpbiBzb2NrZXQucHkKICAgICAgICA8aHR0cDovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9maWxlLzYwM2I0ZDU5Mzc1OC9MaWIvc29ja2V0LnB5I2w1MzU+YF8uCiAgICAgICAgTm9uZSB3aWxsIHNldCBhbiBpbmZpbml0ZSB0aW1lb3V0IGZvciBjb25uZWN0aW9uIGF0dGVtcHRzLgoKICAgIDp0eXBlIGNvbm5lY3Q6IGludGVnZXIsIGZsb2F0LCBvciBOb25lCgogICAgOnBhcmFtIHJlYWQ6CiAgICAgICAgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGNvbnNlY3V0aXZlCiAgICAgICAgcmVhZCBvcGVyYXRpb25zIGZvciBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4gT21pdHRpbmcKICAgICAgICB0aGUgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdCB0aGUgcmVhZCB0aW1lb3V0IHRvIHRoZSBzeXN0ZW0KICAgICAgICBkZWZhdWx0LCBwcm9iYWJseSBgdGhlIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgaW4gc29ja2V0LnB5CiAgICAgICAgPGh0dHA6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS82MDNiNGQ1OTM3NTgvTGliL3NvY2tldC5weSNsNTM1PmBfLgogICAgICAgIE5vbmUgd2lsbCBzZXQgYW4gaW5maW5pdGUgdGltZW91dC4KCiAgICA6dHlwZSByZWFkOiBpbnRlZ2VyLCBmbG9hdCwgb3IgTm9uZQoKICAgIC4uIG5vdGU6OgoKICAgICAgICBNYW55IGZhY3RvcnMgY2FuIGFmZmVjdCB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgZm9yIHVybGxpYjMgdG8gcmV0dXJuCiAgICAgICAgYW4gSFRUUCByZXNwb25zZS4KCiAgICAgICAgRm9yIGV4YW1wbGUsIFB5dGhvbidzIEROUyByZXNvbHZlciBkb2VzIG5vdCBvYmV5IHRoZSB0aW1lb3V0IHNwZWNpZmllZAogICAgICAgIG9uIHRoZSBzb2NrZXQuIE90aGVyIGZhY3RvcnMgdGhhdCBjYW4gYWZmZWN0IHRvdGFsIHJlcXVlc3QgdGltZSBpbmNsdWRlCiAgICAgICAgaGlnaCBDUFUgbG9hZCwgaGlnaCBzd2FwLCB0aGUgcHJvZ3JhbSBydW5uaW5nIGF0IGEgbG93IHByaW9yaXR5IGxldmVsLAogICAgICAgIG9yIG90aGVyIGJlaGF2aW9ycy4KCiAgICAgICAgSW4gYWRkaXRpb24sIHRoZSByZWFkIGFuZCB0b3RhbCB0aW1lb3V0cyBvbmx5IG1lYXN1cmUgdGhlIHRpbWUgYmV0d2VlbgogICAgICAgIHJlYWQgb3BlcmF0aW9ucyBvbiB0aGUgc29ja2V0IGNvbm5lY3RpbmcgdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciwKICAgICAgICBub3QgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIGZvciB0aGUgcmVxdWVzdCB0byByZXR1cm4gYSBjb21wbGV0ZQogICAgICAgIHJlc3BvbnNlLiBGb3IgbW9zdCByZXF1ZXN0cywgdGhlIHRpbWVvdXQgaXMgcmFpc2VkIGJlY2F1c2UgdGhlIHNlcnZlcgogICAgICAgIGhhcyBub3Qgc2VudCB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgc3BlY2lmaWVkIHRpbWUuIFRoaXMgaXMgbm90IGFsd2F5cwogICAgICAgIHRoZSBjYXNlOyBpZiBhIHNlcnZlciBzdHJlYW1zIG9uZSBieXRlIGV2ZXJ5IGZpZnRlZW4gc2Vjb25kcywgYSB0aW1lb3V0CiAgICAgICAgb2YgMjAgc2Vjb25kcyB3aWxsIG5vdCB0cmlnZ2VyLCBldmVuIHRob3VnaCB0aGUgcmVxdWVzdCB3aWxsIHRha2UKICAgICAgICBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUuCgogICAgICAgIElmIHlvdXIgZ29hbCBpcyB0byBjdXQgb2ZmIGFueSByZXF1ZXN0IGFmdGVyIGEgc2V0IGFtb3VudCBvZiB3YWxsIGNsb2NrCiAgICAgICAgdGltZSwgY29uc2lkZXIgaGF2aW5nIGEgc2Vjb25kICJ3YXRjaGVyIiB0aHJlYWQgdG8gY3V0IG9mZiBhIHNsb3cKICAgICAgICByZXF1ZXN0LgogICAgIiIiCgogICAgIzogQSBzZW50aW5lbCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUKICAgIERFRkFVTFRfVElNRU9VVCA9IF9HTE9CQUxfREVGQVVMVF9USU1FT1VUCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdGFsPU5vbmUsIGNvbm5lY3Q9X0RlZmF1bHQsIHJlYWQ9X0RlZmF1bHQpOgogICAgICAgIHNlbGYuX2Nvbm5lY3QgPSBzZWxmLl92YWxpZGF0ZV90aW1lb3V0KGNvbm5lY3QsICdjb25uZWN0JykKICAgICAgICBzZWxmLl9yZWFkID0gc2VsZi5fdmFsaWRhdGVfdGltZW91dChyZWFkLCAncmVhZCcpCiAgICAgICAgc2VsZi50b3RhbCA9IHNlbGYuX3ZhbGlkYXRlX3RpbWVvdXQodG90YWwsICd0b3RhbCcpCiAgICAgICAgc2VsZi5fc3RhcnRfY29ubmVjdCA9IE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzKGNvbm5lY3Q9JXIsIHJlYWQ9JXIsIHRvdGFsPSVyKScgJSAoCiAgICAgICAgICAgIHR5cGUoc2VsZikuX19uYW1lX18sIHNlbGYuX2Nvbm5lY3QsIHNlbGYuX3JlYWQsIHNlbGYudG90YWwpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3ZhbGlkYXRlX3RpbWVvdXQoY2xzLCB2YWx1ZSwgbmFtZSk6CiAgICAgICAgIiIiIENoZWNrIHRoYXQgYSB0aW1lb3V0IGF0dHJpYnV0ZSBpcyB2YWxpZC4KCiAgICAgICAgOnBhcmFtIHZhbHVlOiBUaGUgdGltZW91dCB2YWx1ZSB0byB2YWxpZGF0ZQogICAgICAgIDpwYXJhbSBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgdGltZW91dCBhdHRyaWJ1dGUgdG8gdmFsaWRhdGUuIFRoaXMgaXMKICAgICAgICAgICAgdXNlZCB0byBzcGVjaWZ5IGluIGVycm9yIG1lc3NhZ2VzLgogICAgICAgIDpyZXR1cm46IFRoZSB2YWxpZGF0ZWQgYW5kIGNhc3RlZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiB2YWx1ZS4KICAgICAgICA6cmFpc2VzIFZhbHVlRXJyb3I6IElmIGl0IGlzIGEgbnVtZXJpYyB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KICAgICAgICAgICAgemVybywgb3IgdGhlIHR5cGUgaXMgbm90IGFuIGludGVnZXIsIGZsb2F0LCBvciBOb25lLgogICAgICAgICIiIgogICAgICAgIGlmIHZhbHVlIGlzIF9EZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gY2xzLkRFRkFVTFRfVElNRU9VVAoKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lIG9yIHZhbHVlIGlzIGNscy5ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBib29sKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGltZW91dCBjYW5ub3QgYmUgYSBib29sZWFuIHZhbHVlLiBJdCBtdXN0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgYW4gaW50LCBmbG9hdCBvciBOb25lLiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmbG9hdCh2YWx1ZSkKICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRpbWVvdXQgdmFsdWUgJXMgd2FzICVzLCBidXQgaXQgbXVzdCBiZSBhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCwgZmxvYXQgb3IgTm9uZS4iICUgKG5hbWUsIHZhbHVlKSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiB2YWx1ZSA8PSAwOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQXR0ZW1wdGVkIHRvIHNldCAlcyB0aW1lb3V0IHRvICVzLCBidXQgdGhlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgY2Fubm90IGJlIHNldCB0byBhIHZhbHVlIGxlc3MgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhbiBvciBlcXVhbCB0byAwLiIgJSAobmFtZSwgdmFsdWUpKQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6ICAjIFB5dGhvbiAzCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRpbWVvdXQgdmFsdWUgJXMgd2FzICVzLCBidXQgaXQgbXVzdCBiZSBhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCwgZmxvYXQgb3IgTm9uZS4iICUgKG5hbWUsIHZhbHVlKSkKCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9mbG9hdChjbHMsIHRpbWVvdXQpOgogICAgICAgICIiIiBDcmVhdGUgYSBuZXcgVGltZW91dCBmcm9tIGEgbGVnYWN5IHRpbWVvdXQgdmFsdWUuCgogICAgICAgIFRoZSB0aW1lb3V0IHZhbHVlIHVzZWQgYnkgaHR0cGxpYi5weSBzZXRzIHRoZSBzYW1lIHRpbWVvdXQgb24gdGhlCiAgICAgICAgY29ubmVjdCgpLCBhbmQgcmVjdigpIHNvY2tldCByZXF1ZXN0cy4gVGhpcyBjcmVhdGVzIGEgOmNsYXNzOmBUaW1lb3V0YAogICAgICAgIG9iamVjdCB0aGF0IHNldHMgdGhlIGluZGl2aWR1YWwgdGltZW91dHMgdG8gdGhlIGBgdGltZW91dGBgIHZhbHVlCiAgICAgICAgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCgogICAgICAgIDpwYXJhbSB0aW1lb3V0OiBUaGUgbGVnYWN5IHRpbWVvdXQgdmFsdWUuCiAgICAgICAgOnR5cGUgdGltZW91dDogaW50ZWdlciwgZmxvYXQsIHNlbnRpbmVsIGRlZmF1bHQgb2JqZWN0LCBvciBOb25lCiAgICAgICAgOnJldHVybjogVGltZW91dCBvYmplY3QKICAgICAgICA6cnR5cGU6IDpjbGFzczpgVGltZW91dGAKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gVGltZW91dChyZWFkPXRpbWVvdXQsIGNvbm5lY3Q9dGltZW91dCkKCiAgICBkZWYgY2xvbmUoc2VsZik6CiAgICAgICAgIiIiIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHRpbWVvdXQgb2JqZWN0CgogICAgICAgIFRpbWVvdXQgcHJvcGVydGllcyBhcmUgc3RvcmVkIHBlci1wb29sIGJ1dCBlYWNoIHJlcXVlc3QgbmVlZHMgYSBmcmVzaAogICAgICAgIFRpbWVvdXQgb2JqZWN0IHRvIGVuc3VyZSBlYWNoIG9uZSBoYXMgaXRzIG93biBzdGFydC9zdG9wIGNvbmZpZ3VyZWQuCgogICAgICAgIDpyZXR1cm46IGEgY29weSBvZiB0aGUgdGltZW91dCBvYmplY3QKICAgICAgICA6cnR5cGU6IDpjbGFzczpgVGltZW91dGAKICAgICAgICAiIiIKICAgICAgICAjIFdlIGNhbid0IHVzZSBjb3B5LmRlZXBjb3B5IGJlY2F1c2UgdGhhdCB3aWxsIGFsc28gY3JlYXRlIGEgbmV3IG9iamVjdAogICAgICAgICMgZm9yIF9HTE9CQUxfREVGQVVMVF9USU1FT1VULCB3aGljaCBzb2NrZXQucHkgdXNlcyBhcyBhIHNlbnRpbmVsIHRvCiAgICAgICAgIyBkZXRlY3QgdGhlIHVzZXIgZGVmYXVsdC4KICAgICAgICByZXR1cm4gVGltZW91dChjb25uZWN0PXNlbGYuX2Nvbm5lY3QsIHJlYWQ9c2VsZi5fcmVhZCwKICAgICAgICAgICAgICAgICAgICAgICB0b3RhbD1zZWxmLnRvdGFsKQoKICAgIGRlZiBzdGFydF9jb25uZWN0KHNlbGYpOgogICAgICAgICIiIiBTdGFydCB0aGUgdGltZW91dCBjbG9jaywgdXNlZCBkdXJpbmcgYSBjb25uZWN0KCkgYXR0ZW1wdAoKICAgICAgICA6cmFpc2VzIHVybGxpYjMuZXhjZXB0aW9ucy5UaW1lb3V0U3RhdGVFcnJvcjogaWYgeW91IGF0dGVtcHQKICAgICAgICAgICAgdG8gc3RhcnQgYSB0aW1lciB0aGF0IGhhcyBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9zdGFydF9jb25uZWN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByYWlzZSBUaW1lb3V0U3RhdGVFcnJvcigiVGltZW91dCB0aW1lciBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuIikKICAgICAgICBzZWxmLl9zdGFydF9jb25uZWN0ID0gY3VycmVudF90aW1lKCkKICAgICAgICByZXR1cm4gc2VsZi5fc3RhcnRfY29ubmVjdAoKICAgIGRlZiBnZXRfY29ubmVjdF9kdXJhdGlvbihzZWxmKToKICAgICAgICAiIiIgR2V0cyB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBjYWxsIHRvIDptZXRoOmBzdGFydF9jb25uZWN0YC4KCiAgICAgICAgOnJldHVybjogRWxhcHNlZCB0aW1lLgogICAgICAgIDpydHlwZTogZmxvYXQKICAgICAgICA6cmFpc2VzIHVybGxpYjMuZXhjZXB0aW9ucy5UaW1lb3V0U3RhdGVFcnJvcjogaWYgeW91IGF0dGVtcHQKICAgICAgICAgICAgdG8gZ2V0IGR1cmF0aW9uIGZvciBhIHRpbWVyIHRoYXQgaGFzbid0IGJlZW4gc3RhcnRlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9zdGFydF9jb25uZWN0IGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFRpbWVvdXRTdGF0ZUVycm9yKCJDYW4ndCBnZXQgY29ubmVjdCBkdXJhdGlvbiBmb3IgdGltZXIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhdCBoYXMgbm90IHN0YXJ0ZWQuIikKICAgICAgICByZXR1cm4gY3VycmVudF90aW1lKCkgLSBzZWxmLl9zdGFydF9jb25uZWN0CgogICAgQHByb3BlcnR5CiAgICBkZWYgY29ubmVjdF90aW1lb3V0KHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIHZhbHVlIHRvIHVzZSB3aGVuIHNldHRpbmcgYSBjb25uZWN0aW9uIHRpbWVvdXQuCgogICAgICAgIFRoaXMgd2lsbCBiZSBhIHBvc2l0aXZlIGZsb2F0IG9yIGludGVnZXIsIHRoZSB2YWx1ZSBOb25lCiAgICAgICAgKG5ldmVyIHRpbWVvdXQpLCBvciB0aGUgZGVmYXVsdCBzeXN0ZW0gdGltZW91dC4KCiAgICAgICAgOnJldHVybjogQ29ubmVjdCB0aW1lb3V0LgogICAgICAgIDpydHlwZTogaW50LCBmbG9hdCwgOmF0dHI6YFRpbWVvdXQuREVGQVVMVF9USU1FT1VUYCBvciBOb25lCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi50b3RhbCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fY29ubmVjdAoKICAgICAgICBpZiBzZWxmLl9jb25uZWN0IGlzIE5vbmUgb3Igc2VsZi5fY29ubmVjdCBpcyBzZWxmLkRFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYudG90YWwKCiAgICAgICAgcmV0dXJuIG1pbihzZWxmLl9jb25uZWN0LCBzZWxmLnRvdGFsKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlYWRfdGltZW91dChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIHJlYWQgdGltZW91dC4KCiAgICAgICAgVGhpcyBhc3N1bWVzIHNvbWUgdGltZSBoYXMgZWxhcHNlZCBpbiB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IGFuZAogICAgICAgIGNvbXB1dGVzIHRoZSByZWFkIHRpbWVvdXQgYXBwcm9wcmlhdGVseS4KCiAgICAgICAgSWYgc2VsZi50b3RhbCBpcyBzZXQsIHRoZSByZWFkIHRpbWVvdXQgaXMgZGVwZW5kZW50IG9uIHRoZSBhbW91bnQgb2YKICAgICAgICB0aW1lIHRha2VuIGJ5IHRoZSBjb25uZWN0IHRpbWVvdXQuIElmIHRoZSBjb25uZWN0aW9uIHRpbWUgaGFzIG5vdCBiZWVuCiAgICAgICAgZXN0YWJsaXNoZWQsIGEgOmV4YzpgfnVybGxpYjMuZXhjZXB0aW9ucy5UaW1lb3V0U3RhdGVFcnJvcmAgd2lsbCBiZQogICAgICAgIHJhaXNlZC4KCiAgICAgICAgOnJldHVybjogVmFsdWUgdG8gdXNlIGZvciB0aGUgcmVhZCB0aW1lb3V0LgogICAgICAgIDpydHlwZTogaW50LCBmbG9hdCwgOmF0dHI6YFRpbWVvdXQuREVGQVVMVF9USU1FT1VUYCBvciBOb25lCiAgICAgICAgOnJhaXNlcyB1cmxsaWIzLmV4Y2VwdGlvbnMuVGltZW91dFN0YXRlRXJyb3I6IElmIDptZXRoOmBzdGFydF9jb25uZWN0YAogICAgICAgICAgICBoYXMgbm90IHlldCBiZWVuIGNhbGxlZCBvbiB0aGlzIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBpZiAoc2VsZi50b3RhbCBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgIHNlbGYudG90YWwgaXMgbm90IHNlbGYuREVGQVVMVF9USU1FT1VUIGFuZAogICAgICAgICAgICAgICAgc2VsZi5fcmVhZCBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgIHNlbGYuX3JlYWQgaXMgbm90IHNlbGYuREVGQVVMVF9USU1FT1VUKToKICAgICAgICAgICAgIyBJbiBjYXNlIHRoZSBjb25uZWN0IHRpbWVvdXQgaGFzIG5vdCB5ZXQgYmVlbiBlc3RhYmxpc2hlZC4KICAgICAgICAgICAgaWYgc2VsZi5fc3RhcnRfY29ubmVjdCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWQKICAgICAgICAgICAgcmV0dXJuIG1heCgwLCBtaW4oc2VsZi50b3RhbCAtIHNlbGYuZ2V0X2Nvbm5lY3RfZHVyYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZCkpCiAgICAgICAgZWxpZiBzZWxmLnRvdGFsIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRvdGFsIGlzIG5vdCBzZWxmLkRFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgcmV0dXJuIG1heCgwLCBzZWxmLnRvdGFsIC0gc2VsZi5nZXRfY29ubmVjdF9kdXJhdGlvbigpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkClBLAwQUAAAAAAAAACEAwx5tEVcZAABXGQAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3VybC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBMb2NhdGlvblBhcnNlRXJyb3IKCgp1cmxfYXR0cnMgPSBbJ3NjaGVtZScsICdhdXRoJywgJ2hvc3QnLCAncG9ydCcsICdwYXRoJywgJ3F1ZXJ5JywgJ2ZyYWdtZW50J10KCiMgV2Ugb25seSB3YW50IHRvIG5vcm1hbGl6ZSB1cmxzIHdpdGggYW4gSFRUUChTKSBzY2hlbWUuCiMgdXJsbGliMyBpbmZlcnMgVVJMcyB3aXRob3V0IGEgc2NoZW1lIChOb25lKSB0byBiZSBodHRwLgpOT1JNQUxJWkFCTEVfU0NIRU1FUyA9ICgnaHR0cCcsICdodHRwcycsIE5vbmUpCgoKY2xhc3MgVXJsKG5hbWVkdHVwbGUoJ1VybCcsIHVybF9hdHRycykpOgogICAgIiIiCiAgICBEYXRhc3RydWN0dXJlIGZvciByZXByZXNlbnRpbmcgYW4gSFRUUCBVUkwuIFVzZWQgYXMgYSByZXR1cm4gdmFsdWUgZm9yCiAgICA6ZnVuYzpgcGFyc2VfdXJsYC4gQm90aCB0aGUgc2NoZW1lIGFuZCBob3N0IGFyZSBub3JtYWxpemVkIGFzIHRoZXkgYXJlCiAgICBib3RoIGNhc2UtaW5zZW5zaXRpdmUgYWNjb3JkaW5nIHRvIFJGQyAzOTg2LgogICAgIiIiCiAgICBfX3Nsb3RzX18gPSAoKQoKICAgIGRlZiBfX25ld19fKGNscywgc2NoZW1lPU5vbmUsIGF1dGg9Tm9uZSwgaG9zdD1Ob25lLCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSwKICAgICAgICAgICAgICAgIHF1ZXJ5PU5vbmUsIGZyYWdtZW50PU5vbmUpOgogICAgICAgIGlmIHBhdGggYW5kIG5vdCBwYXRoLnN0YXJ0c3dpdGgoJy8nKToKICAgICAgICAgICAgcGF0aCA9ICcvJyArIHBhdGgKICAgICAgICBpZiBzY2hlbWU6CiAgICAgICAgICAgIHNjaGVtZSA9IHNjaGVtZS5sb3dlcigpCiAgICAgICAgaWYgaG9zdCBhbmQgc2NoZW1lIGluIE5PUk1BTElaQUJMRV9TQ0hFTUVTOgogICAgICAgICAgICBob3N0ID0gaG9zdC5sb3dlcigpCiAgICAgICAgcmV0dXJuIHN1cGVyKFVybCwgY2xzKS5fX25ld19fKGNscywgc2NoZW1lLCBhdXRoLCBob3N0LCBwb3J0LCBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwgZnJhZ21lbnQpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaG9zdG5hbWUoc2VsZik6CiAgICAgICAgIiIiRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggdXJscGFyc2UuIFdlJ3JlIG5pY2UgbGlrZSB0aGF0LiIiIgogICAgICAgIHJldHVybiBzZWxmLmhvc3QKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1ZXN0X3VyaShzZWxmKToKICAgICAgICAiIiJBYnNvbHV0ZSBwYXRoIGluY2x1ZGluZyB0aGUgcXVlcnkgc3RyaW5nLiIiIgogICAgICAgIHVyaSA9IHNlbGYucGF0aCBvciAnLycKCiAgICAgICAgaWYgc2VsZi5xdWVyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJpICs9ICc/JyArIHNlbGYucXVlcnkKCiAgICAgICAgcmV0dXJuIHVyaQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5ldGxvYyhzZWxmKToKICAgICAgICAiIiJOZXR3b3JrIGxvY2F0aW9uIGluY2x1ZGluZyBob3N0IGFuZCBwb3J0IiIiCiAgICAgICAgaWYgc2VsZi5wb3J0OgogICAgICAgICAgICByZXR1cm4gJyVzOiVkJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKICAgICAgICByZXR1cm4gc2VsZi5ob3N0CgogICAgQHByb3BlcnR5CiAgICBkZWYgdXJsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbnZlcnQgc2VsZiBpbnRvIGEgdXJsCgogICAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1vcmUgb3IgbGVzcyByb3VuZC10cmlwIHdpdGggOmZ1bmM6YC5wYXJzZV91cmxgLiBUaGUKICAgICAgICByZXR1cm5lZCB1cmwgbWF5IG5vdCBiZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSB1cmwgaW5wdXR0ZWQgdG8KICAgICAgICA6ZnVuYzpgLnBhcnNlX3VybGAsIGJ1dCBpdCBzaG91bGQgYmUgZXF1aXZhbGVudCBieSB0aGUgUkZDIChlLmcuLCB1cmxzCiAgICAgICAgd2l0aCBhIGJsYW5rIHBvcnQgd2lsbCBoYXZlIDogcmVtb3ZlZCkuCgogICAgICAgIEV4YW1wbGU6IDo6CgogICAgICAgICAgICA+Pj4gVSA9IHBhcnNlX3VybCgnaHR0cDovL2dvb2dsZS5jb20vbWFpbC8nKQogICAgICAgICAgICA+Pj4gVS51cmwKICAgICAgICAgICAgJ2h0dHA6Ly9nb29nbGUuY29tL21haWwvJwogICAgICAgICAgICA+Pj4gVXJsKCdodHRwJywgJ3VzZXJuYW1lOnBhc3N3b3JkJywgJ2hvc3QuY29tJywgODAsCiAgICAgICAgICAgIC4uLiAnL3BhdGgnLCAncXVlcnknLCAnZnJhZ21lbnQnKS51cmwKICAgICAgICAgICAgJ2h0dHA6Ly91c2VybmFtZTpwYXNzd29yZEBob3N0LmNvbTo4MC9wYXRoP3F1ZXJ5I2ZyYWdtZW50JwogICAgICAgICIiIgogICAgICAgIHNjaGVtZSwgYXV0aCwgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gc2VsZgogICAgICAgIHVybCA9ICcnCgogICAgICAgICMgV2UgdXNlICJpcyBub3QgTm9uZSIgd2Ugd2FudCB0aGluZ3MgdG8gaGFwcGVuIHdpdGggZW1wdHkgc3RyaW5ncyAob3IgMCBwb3J0KQogICAgICAgIGlmIHNjaGVtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IHNjaGVtZSArICc6Ly8nCiAgICAgICAgaWYgYXV0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGF1dGggKyAnQCcKICAgICAgICBpZiBob3N0IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gaG9zdAogICAgICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSAnOicgKyBzdHIocG9ydCkKICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gcGF0aAogICAgICAgIGlmIHF1ZXJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gJz8nICsgcXVlcnkKICAgICAgICBpZiBmcmFnbWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9ICcjJyArIGZyYWdtZW50CgogICAgICAgIHJldHVybiB1cmwKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi51cmwKCgpkZWYgc3BsaXRfZmlyc3QocywgZGVsaW1zKToKICAgICIiIgogICAgR2l2ZW4gYSBzdHJpbmcgYW5kIGFuIGl0ZXJhYmxlIG9mIGRlbGltaXRlcnMsIHNwbGl0IG9uIHRoZSBmaXJzdCBmb3VuZAogICAgZGVsaW1pdGVyLiBSZXR1cm4gdHdvIHNwbGl0IHBhcnRzIGFuZCB0aGUgbWF0Y2hlZCBkZWxpbWl0ZXIuCgogICAgSWYgbm90IGZvdW5kLCB0aGVuIHRoZSBmaXJzdCBwYXJ0IGlzIHRoZSBmdWxsIGlucHV0IHN0cmluZy4KCiAgICBFeGFtcGxlOjoKCiAgICAgICAgPj4+IHNwbGl0X2ZpcnN0KCdmb28vYmFyP2JheicsICc/Lz0nKQogICAgICAgICgnZm9vJywgJ2Jhcj9iYXonLCAnLycpCiAgICAgICAgPj4+IHNwbGl0X2ZpcnN0KCdmb28vYmFyP2JheicsICcxMjMnKQogICAgICAgICgnZm9vL2Jhcj9iYXonLCAnJywgTm9uZSkKCiAgICBTY2FsZXMgbGluZWFybHkgd2l0aCBudW1iZXIgb2YgZGVsaW1zLiBOb3QgaWRlYWwgZm9yIGxhcmdlIG51bWJlciBvZiBkZWxpbXMuCiAgICAiIiIKICAgIG1pbl9pZHggPSBOb25lCiAgICBtaW5fZGVsaW0gPSBOb25lCiAgICBmb3IgZCBpbiBkZWxpbXM6CiAgICAgICAgaWR4ID0gcy5maW5kKGQpCiAgICAgICAgaWYgaWR4IDwgMDoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbWluX2lkeCBpcyBOb25lIG9yIGlkeCA8IG1pbl9pZHg6CiAgICAgICAgICAgIG1pbl9pZHggPSBpZHgKICAgICAgICAgICAgbWluX2RlbGltID0gZAoKICAgIGlmIG1pbl9pZHggaXMgTm9uZSBvciBtaW5faWR4IDwgMDoKICAgICAgICByZXR1cm4gcywgJycsIE5vbmUKCiAgICByZXR1cm4gc1s6bWluX2lkeF0sIHNbbWluX2lkeCArIDE6XSwgbWluX2RlbGltCgoKZGVmIHBhcnNlX3VybCh1cmwpOgogICAgIiIiCiAgICBHaXZlbiBhIHVybCwgcmV0dXJuIGEgcGFyc2VkIDpjbGFzczpgLlVybGAgbmFtZWR0dXBsZS4gQmVzdC1lZmZvcnQgaXMKICAgIHBlcmZvcm1lZCB0byBwYXJzZSBpbmNvbXBsZXRlIHVybHMuIEZpZWxkcyBub3QgcHJvdmlkZWQgd2lsbCBiZSBOb25lLgoKICAgIFBhcnRseSBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIDptb2Q6YHVybHBhcnNlYC4KCiAgICBFeGFtcGxlOjoKCiAgICAgICAgPj4+IHBhcnNlX3VybCgnaHR0cDovL2dvb2dsZS5jb20vbWFpbC8nKQogICAgICAgIFVybChzY2hlbWU9J2h0dHAnLCBob3N0PSdnb29nbGUuY29tJywgcG9ydD1Ob25lLCBwYXRoPScvbWFpbC8nLCAuLi4pCiAgICAgICAgPj4+IHBhcnNlX3VybCgnZ29vZ2xlLmNvbTo4MCcpCiAgICAgICAgVXJsKHNjaGVtZT1Ob25lLCBob3N0PSdnb29nbGUuY29tJywgcG9ydD04MCwgcGF0aD1Ob25lLCAuLi4pCiAgICAgICAgPj4+IHBhcnNlX3VybCgnL2Zvbz9iYXInKQogICAgICAgIFVybChzY2hlbWU9Tm9uZSwgaG9zdD1Ob25lLCBwb3J0PU5vbmUsIHBhdGg9Jy9mb28nLCBxdWVyeT0nYmFyJywgLi4uKQogICAgIiIiCgogICAgIyBXaGlsZSB0aGlzIGNvZGUgaGFzIG92ZXJsYXAgd2l0aCBzdGRsaWIncyB1cmxwYXJzZSwgaXQgaXMgbXVjaAogICAgIyBzaW1wbGlmaWVkIGZvciBvdXIgbmVlZHMgYW5kIGxlc3MgYW5ub3lpbmcuCiAgICAjIEFkZGl0aW9uYWxseSwgdGhpcyBpbXBsZW1lbnRhdGlvbnMgZG9lcyBzaWxseSB0aGluZ3MgdG8gYmUgb3B0aW1hbAogICAgIyBvbiBDUHl0aG9uLgoKICAgIGlmIG5vdCB1cmw6CiAgICAgICAgIyBFbXB0eQogICAgICAgIHJldHVybiBVcmwoKQoKICAgIHNjaGVtZSA9IE5vbmUKICAgIGF1dGggPSBOb25lCiAgICBob3N0ID0gTm9uZQogICAgcG9ydCA9IE5vbmUKICAgIHBhdGggPSBOb25lCiAgICBmcmFnbWVudCA9IE5vbmUKICAgIHF1ZXJ5ID0gTm9uZQoKICAgICMgU2NoZW1lCiAgICBpZiAnOi8vJyBpbiB1cmw6CiAgICAgICAgc2NoZW1lLCB1cmwgPSB1cmwuc3BsaXQoJzovLycsIDEpCgogICAgIyBGaW5kIHRoZSBlYXJsaWVzdCBBdXRob3JpdHkgVGVybWluYXRvcgogICAgIyAoaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMikKICAgIHVybCwgcGF0aF8sIGRlbGltID0gc3BsaXRfZmlyc3QodXJsLCBbJy8nLCAnPycsICcjJ10pCgogICAgaWYgZGVsaW06CiAgICAgICAgIyBSZWFzc2VtYmxlIHRoZSBwYXRoCiAgICAgICAgcGF0aCA9IGRlbGltICsgcGF0aF8KCiAgICAjIEF1dGgKICAgIGlmICdAJyBpbiB1cmw6CiAgICAgICAgIyBMYXN0ICdAJyBkZW5vdGVzIGVuZCBvZiBhdXRoIHBhcnQKICAgICAgICBhdXRoLCB1cmwgPSB1cmwucnNwbGl0KCdAJywgMSkKCiAgICAjIElQdjYKICAgIGlmIHVybCBhbmQgdXJsWzBdID09ICdbJzoKICAgICAgICBob3N0LCB1cmwgPSB1cmwuc3BsaXQoJ10nLCAxKQogICAgICAgIGhvc3QgKz0gJ10nCgogICAgIyBQb3J0CiAgICBpZiAnOicgaW4gdXJsOgogICAgICAgIF9ob3N0LCBwb3J0ID0gdXJsLnNwbGl0KCc6JywgMSkKCiAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgIGhvc3QgPSBfaG9zdAoKICAgICAgICBpZiBwb3J0OgogICAgICAgICAgICAjIElmIGdpdmVuLCBwb3J0cyBtdXN0IGJlIGludGVnZXJzLiBObyB3aGl0ZXNwYWNlLCBubyBwbHVzIG9yCiAgICAgICAgICAgICMgbWludXMgcHJlZml4ZXMsIG5vIG5vbi1pbnRlZ2VyIGRpZ2l0cyBzdWNoIGFzIF4yIChzdXBlcnNjcmlwdCkuCiAgICAgICAgICAgIGlmIG5vdCBwb3J0LmlzZGlnaXQoKToKICAgICAgICAgICAgICAgIHJhaXNlIExvY2F0aW9uUGFyc2VFcnJvcih1cmwpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBMb2NhdGlvblBhcnNlRXJyb3IodXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQmxhbmsgcG9ydHMgYXJlIGNvb2wsIHRvby4gKHJmYzM5ODYjc2VjdGlvbi0zLjIuMykKICAgICAgICAgICAgcG9ydCA9IE5vbmUKCiAgICBlbGlmIG5vdCBob3N0IGFuZCB1cmw6CiAgICAgICAgaG9zdCA9IHVybAoKICAgIGlmIG5vdCBwYXRoOgogICAgICAgIHJldHVybiBVcmwoc2NoZW1lLCBhdXRoLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpCgogICAgIyBGcmFnbWVudAogICAgaWYgJyMnIGluIHBhdGg6CiAgICAgICAgcGF0aCwgZnJhZ21lbnQgPSBwYXRoLnNwbGl0KCcjJywgMSkKCiAgICAjIFF1ZXJ5CiAgICBpZiAnPycgaW4gcGF0aDoKICAgICAgICBwYXRoLCBxdWVyeSA9IHBhdGguc3BsaXQoJz8nLCAxKQoKICAgIHJldHVybiBVcmwoc2NoZW1lLCBhdXRoLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpCgoKZGVmIGdldF9ob3N0KHVybCk6CiAgICAiIiIKICAgIERlcHJlY2F0ZWQuIFVzZSA6ZnVuYzpgcGFyc2VfdXJsYCBpbnN0ZWFkLgogICAgIiIiCiAgICBwID0gcGFyc2VfdXJsKHVybCkKICAgIHJldHVybiBwLnNjaGVtZSBvciAnaHR0cCcsIHAuaG9zdG5hbWUsIHAucG9ydApQSwMEFAAAAAAAAAAhALY8I/yrBQAAqwUAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC93YWl0LnB5ZnJvbSAuc2VsZWN0b3JzIGltcG9ydCAoCiAgICBIQVNfU0VMRUNULAogICAgRGVmYXVsdFNlbGVjdG9yLAogICAgRVZFTlRfUkVBRCwKICAgIEVWRU5UX1dSSVRFCikKCgpkZWYgX3dhaXRfZm9yX2lvX2V2ZW50cyhzb2NrcywgZXZlbnRzLCB0aW1lb3V0PU5vbmUpOgogICAgIiIiIFdhaXRzIGZvciBJTyBldmVudHMgdG8gYmUgYXZhaWxhYmxlIGZyb20gYSBsaXN0IG9mIHNvY2tldHMKICAgIG9yIG9wdGlvbmFsbHkgYSBzaW5nbGUgc29ja2V0IGlmIHBhc3NlZCBpbi4gUmV0dXJucyBhIGxpc3Qgb2YKICAgIHNvY2tldHMgdGhhdCBjYW4gYmUgaW50ZXJhY3RlZCB3aXRoIGltbWVkaWF0ZWx5LiAiIiIKICAgIGlmIG5vdCBIQVNfU0VMRUNUOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1BsYXRmb3JtIGRvZXMgbm90IGhhdmUgYSBzZWxlY3RvcicpCiAgICBpZiBub3QgaXNpbnN0YW5jZShzb2NrcywgbGlzdCk6CiAgICAgICAgIyBQcm9iYWJseSBqdXN0IGEgc2luZ2xlIHNvY2tldC4KICAgICAgICBpZiBoYXNhdHRyKHNvY2tzLCAiZmlsZW5vIik6CiAgICAgICAgICAgIHNvY2tzID0gW3NvY2tzXQogICAgICAgICMgT3RoZXJ3aXNlIGl0IG1pZ2h0IGJlIGEgbm9uLWxpc3QgaXRlcmFibGUuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc29ja3MgPSBsaXN0KHNvY2tzKQogICAgd2l0aCBEZWZhdWx0U2VsZWN0b3IoKSBhcyBzZWxlY3RvcjoKICAgICAgICBmb3Igc29jayBpbiBzb2NrczoKICAgICAgICAgICAgc2VsZWN0b3IucmVnaXN0ZXIoc29jaywgZXZlbnRzKQogICAgICAgIHJldHVybiBba2V5WzBdLmZpbGVvYmogZm9yIGtleSBpbgogICAgICAgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KHRpbWVvdXQpIGlmIGtleVsxXSAmIGV2ZW50c10KCgpkZWYgd2FpdF9mb3JfcmVhZChzb2NrcywgdGltZW91dD1Ob25lKToKICAgICIiIiBXYWl0cyBmb3IgcmVhZGluZyB0byBiZSBhdmFpbGFibGUgZnJvbSBhIGxpc3Qgb2Ygc29ja2V0cwogICAgb3Igb3B0aW9uYWxseSBhIHNpbmdsZSBzb2NrZXQgaWYgcGFzc2VkIGluLiBSZXR1cm5zIGEgbGlzdCBvZgogICAgc29ja2V0cyB0aGF0IGNhbiBiZSByZWFkIGZyb20gaW1tZWRpYXRlbHkuICIiIgogICAgcmV0dXJuIF93YWl0X2Zvcl9pb19ldmVudHMoc29ja3MsIEVWRU5UX1JFQUQsIHRpbWVvdXQpCgoKZGVmIHdhaXRfZm9yX3dyaXRlKHNvY2tzLCB0aW1lb3V0PU5vbmUpOgogICAgIiIiIFdhaXRzIGZvciB3cml0aW5nIHRvIGJlIGF2YWlsYWJsZSBmcm9tIGEgbGlzdCBvZiBzb2NrZXRzCiAgICBvciBvcHRpb25hbGx5IGEgc2luZ2xlIHNvY2tldCBpZiBwYXNzZWQgaW4uIFJldHVybnMgYSBsaXN0IG9mCiAgICBzb2NrZXRzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gaW1tZWRpYXRlbHkuICIiIgogICAgcmV0dXJuIF93YWl0X2Zvcl9pb19ldmVudHMoc29ja3MsIEVWRU5UX1dSSVRFLCB0aW1lb3V0KQpQSwMEFAAAAAAAAAAhAG/BoThQKQAAUCkAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9fX2luaXRfXy5weSMgY29kaW5nOiB1dGY4CiIiIgoKICAgIHdlYmVuY29kaW5ncwogICAgfn5+fn5+fn5+fn5+CgogICAgVGhpcyBpcyBhIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYFdIQVRXRyBFbmNvZGluZyBzdGFuZGFyZAogICAgPGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvPmAuIFNlZSBSRUFETUUgZm9yIGRldGFpbHMuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBjb2RlY3MKCmZyb20gLmxhYmVscyBpbXBvcnQgTEFCRUxTCgoKVkVSU0lPTiA9ICcwLjUnCgoKIyBTb21lIG5hbWVzIGluIEVuY29kaW5nIGFyZSBub3QgdmFsaWQgUHl0aG9uIGFsaWFzZXMuIFJlbWFwIHRoZXNlLgpQWVRIT05fTkFNRVMgPSB7CiAgICAnaXNvLTg4NTktOC1pJzogJ2lzby04ODU5LTgnLAogICAgJ3gtbWFjLWN5cmlsbGljJzogJ21hYy1jeXJpbGxpYycsCiAgICAnbWFjaW50b3NoJzogJ21hYy1yb21hbicsCiAgICAnd2luZG93cy04NzQnOiAnY3A4NzQnfQoKQ0FDSEUgPSB7fQoKCmRlZiBhc2NpaV9sb3dlcihzdHJpbmcpOgogICAgciIiIlRyYW5zZm9ybSAob25seSkgQVNDSUkgbGV0dGVycyB0byBsb3dlciBjYXNlOiBBLVogaXMgbWFwcGVkIHRvIGEtei4KCiAgICA6cGFyYW0gc3RyaW5nOiBBbiBVbmljb2RlIHN0cmluZy4KICAgIDpyZXR1cm5zOiBBIG5ldyBVbmljb2RlIHN0cmluZy4KCiAgICBUaGlzIGlzIHVzZWQgZm9yIGBBU0NJSSBjYXNlLWluc2Vuc2l0aXZlCiAgICA8aHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktY2FzZS1pbnNlbnNpdGl2ZT5gXwogICAgbWF0Y2hpbmcgb2YgZW5jb2RpbmcgbGFiZWxzLgogICAgVGhlIHNhbWUgbWF0Y2hpbmcgaXMgYWxzbyB1c2VkLCBhbW9uZyBvdGhlciB0aGluZ3MsCiAgICBmb3IgYENTUyBrZXl3b3JkcyA8aHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLXZhbHVlcy8ja2V5d29yZHM+YF8uCgogICAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgOm1ldGg6YH5weTpzdHIubG93ZXJgIG1ldGhvZCBvZiBVbmljb2RlIHN0cmluZ3MKICAgIHdoaWNoIGFsc28gYWZmZWN0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzLAogICAgc29tZXRpbWVzIG1hcHBpbmcgdGhlbSBpbnRvIHRoZSBBU0NJSSByYW5nZToKCiAgICAgICAgPj4+IGtleXdvcmQgPSB1J0JhY1xOe0tFTFZJTiBTSUdOfWdyb3VuZCcKICAgICAgICA+Pj4gYXNzZXJ0IGtleXdvcmQubG93ZXIoKSA9PSB1J2JhY2tncm91bmQnCiAgICAgICAgPj4+IGFzc2VydCBhc2NpaV9sb3dlcihrZXl3b3JkKSAhPSBrZXl3b3JkLmxvd2VyKCkKICAgICAgICA+Pj4gYXNzZXJ0IGFzY2lpX2xvd2VyKGtleXdvcmQpID09IHUnYmFjXE57S0VMVklOIFNJR059Z3JvdW5kJwoKICAgICIiIgogICAgIyBUaGlzIHR1cm5zIG91dCB0byBiZSBmYXN0ZXIgdGhhbiB1bmljb2RlLnRyYW5zbGF0ZSgpCiAgICByZXR1cm4gc3RyaW5nLmVuY29kZSgndXRmOCcpLmxvd2VyKCkuZGVjb2RlKCd1dGY4JykKCgpkZWYgbG9va3VwKGxhYmVsKToKICAgICIiIgogICAgTG9vayBmb3IgYW4gZW5jb2RpbmcgYnkgaXRzIGxhYmVsLgogICAgVGhpcyBpcyB0aGUgc3BlY+KAmXMgYGdldCBhbiBlbmNvZGluZwogICAgPGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZW5jb2RpbmctZ2V0PmBfIGFsZ29yaXRobS4KICAgIFN1cHBvcnRlZCBsYWJlbHMgYXJlIGxpc3RlZCB0aGVyZS4KCiAgICA6cGFyYW0gbGFiZWw6IEEgc3RyaW5nLgogICAgOnJldHVybnM6CiAgICAgICAgQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0LCBvciA6b2JqOmBOb25lYCBmb3IgYW4gdW5rbm93biBsYWJlbC4KCiAgICAiIiIKICAgICMgT25seSBzdHJpcCBBU0NJSSB3aGl0ZXNwYWNlOiBVKzAwMDksIFUrMDAwQSwgVSswMDBDLCBVKzAwMEQsIGFuZCBVKzAwMjAuCiAgICBsYWJlbCA9IGFzY2lpX2xvd2VyKGxhYmVsLnN0cmlwKCdcdFxuXGZcciAnKSkKICAgIG5hbWUgPSBMQUJFTFMuZ2V0KGxhYmVsKQogICAgaWYgbmFtZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBlbmNvZGluZyA9IENBQ0hFLmdldChuYW1lKQogICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICBpZiBuYW1lID09ICd4LXVzZXItZGVmaW5lZCc6CiAgICAgICAgICAgIGZyb20gLnhfdXNlcl9kZWZpbmVkIGltcG9ydCBjb2RlY19pbmZvCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHl0aG9uX25hbWUgPSBQWVRIT05fTkFNRVMuZ2V0KG5hbWUsIG5hbWUpCiAgICAgICAgICAgICMgQW55IHB5dGhvbl9uYW1lIHZhbHVlIHRoYXQgZ2V0cyB0byBoZXJlIHNob3VsZCBiZSB2YWxpZC4KICAgICAgICAgICAgY29kZWNfaW5mbyA9IGNvZGVjcy5sb29rdXAocHl0aG9uX25hbWUpCiAgICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZyhuYW1lLCBjb2RlY19pbmZvKQogICAgICAgIENBQ0hFW25hbWVdID0gZW5jb2RpbmcKICAgIHJldHVybiBlbmNvZGluZwoKCmRlZiBfZ2V0X2VuY29kaW5nKGVuY29kaW5nX29yX2xhYmVsKToKICAgICIiIgogICAgQWNjZXB0IGVpdGhlciBhbiBlbmNvZGluZyBvYmplY3Qgb3IgbGFiZWwuCgogICAgOnBhcmFtIGVuY29kaW5nOiBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICA6cmV0dXJuczogQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0LgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGxhYmVsLgoKICAgICIiIgogICAgaWYgaGFzYXR0cihlbmNvZGluZ19vcl9sYWJlbCwgJ2NvZGVjX2luZm8nKToKICAgICAgICByZXR1cm4gZW5jb2Rpbmdfb3JfbGFiZWwKCiAgICBlbmNvZGluZyA9IGxvb2t1cChlbmNvZGluZ19vcl9sYWJlbCkKICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgTG9va3VwRXJyb3IoJ1Vua25vd24gZW5jb2RpbmcgbGFiZWw6ICVyJyAlIGVuY29kaW5nX29yX2xhYmVsKQogICAgcmV0dXJuIGVuY29kaW5nCgoKY2xhc3MgRW5jb2Rpbmcob2JqZWN0KToKICAgICIiIlJlcmVzZW50cyBhIGNoYXJhY3RlciBlbmNvZGluZyBzdWNoIGFzIFVURi04LAogICAgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGVjb2Rpbmcgb3IgZW5jb2RpbmcuCgogICAgLi4gYXR0cmlidXRlOjogbmFtZQoKICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiB0aGUgZW5jb2RpbmcKCiAgICAuLiBhdHRyaWJ1dGU6OiBjb2RlY19pbmZvCgogICAgICAgIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVuY29kaW5nLAogICAgICAgIGEgc3RkbGliIDpjbGFzczpgfmNvZGVjcy5Db2RlY0luZm9gIG9iamVjdC4KICAgICAgICBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgY29kZWNfaW5mbyk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYuY29kZWNfaW5mbyA9IGNvZGVjX2luZm8KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8RW5jb2RpbmcgJXM+JyAlIHNlbGYubmFtZQoKCiM6IFRoZSBVVEYtOCBlbmNvZGluZy4gU2hvdWxkIGJlIHVzZWQgZm9yIG5ldyBjb250ZW50IGFuZCBmb3JtYXRzLgpVVEY4ID0gbG9va3VwKCd1dGYtOCcpCgpfVVRGMTZMRSA9IGxvb2t1cCgndXRmLTE2bGUnKQpfVVRGMTZCRSA9IGxvb2t1cCgndXRmLTE2YmUnKQoKCmRlZiBkZWNvZGUoaW5wdXQsIGZhbGxiYWNrX2VuY29kaW5nLCBlcnJvcnM9J3JlcGxhY2UnKToKICAgICIiIgogICAgRGVjb2RlIGEgc2luZ2xlIHN0cmluZy4KCiAgICA6cGFyYW0gaW5wdXQ6IEEgYnl0ZSBzdHJpbmcKICAgIDpwYXJhbSBmYWxsYmFja19lbmNvZGluZzoKICAgICAgICBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICAgICAgVGhlIGVuY29kaW5nIHRvIHVzZSBpZiA6b2JqOmBpbnB1dGAgZG9lcyBub3RlIGhhdmUgYSBCT00uCiAgICA6cGFyYW0gZXJyb3JzOiBUeXBlIG9mIGVycm9yIGhhbmRsaW5nLiBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gZW5jb2RpbmcgbGFiZWwuCiAgICA6cmV0dXJuOgogICAgICAgIEEgYGAob3V0cHV0LCBlbmNvZGluZylgYCB0dXBsZSBvZiBhbiBVbmljb2RlIHN0cmluZwogICAgICAgIGFuZCBhbiA6b2JqOmBFbmNvZGluZ2AuCgogICAgIiIiCiAgICAjIEZhaWwgZWFybHkgaWYgYGVuY29kaW5nYCBpcyBhbiBpbnZhbGlkIGxhYmVsLgogICAgZmFsbGJhY2tfZW5jb2RpbmcgPSBfZ2V0X2VuY29kaW5nKGZhbGxiYWNrX2VuY29kaW5nKQogICAgYm9tX2VuY29kaW5nLCBpbnB1dCA9IF9kZXRlY3RfYm9tKGlucHV0KQogICAgZW5jb2RpbmcgPSBib21fZW5jb2Rpbmcgb3IgZmFsbGJhY2tfZW5jb2RpbmcKICAgIHJldHVybiBlbmNvZGluZy5jb2RlY19pbmZvLmRlY29kZShpbnB1dCwgZXJyb3JzKVswXSwgZW5jb2RpbmcKCgpkZWYgX2RldGVjdF9ib20oaW5wdXQpOgogICAgIiIiUmV0dXJuIChib21fZW5jb2RpbmcsIGlucHV0KSwgd2l0aCBhbnkgQk9NIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQuIiIiCiAgICBpZiBpbnB1dC5zdGFydHN3aXRoKGInXHhGRlx4RkUnKToKICAgICAgICByZXR1cm4gX1VURjE2TEUsIGlucHV0WzI6XQogICAgaWYgaW5wdXQuc3RhcnRzd2l0aChiJ1x4RkVceEZGJyk6CiAgICAgICAgcmV0dXJuIF9VVEYxNkJFLCBpbnB1dFsyOl0KICAgIGlmIGlucHV0LnN0YXJ0c3dpdGgoYidceEVGXHhCQlx4QkYnKToKICAgICAgICByZXR1cm4gVVRGOCwgaW5wdXRbMzpdCiAgICByZXR1cm4gTm9uZSwgaW5wdXQKCgpkZWYgZW5jb2RlKGlucHV0LCBlbmNvZGluZz1VVEY4LCBlcnJvcnM9J3N0cmljdCcpOgogICAgIiIiCiAgICBFbmNvZGUgYSBzaW5nbGUgc3RyaW5nLgoKICAgIDpwYXJhbSBpbnB1dDogQW4gVW5pY29kZSBzdHJpbmcuCiAgICA6cGFyYW0gZW5jb2Rpbmc6IEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KICAgIDpyZXR1cm46IEEgYnl0ZSBzdHJpbmcuCgogICAgIiIiCiAgICByZXR1cm4gX2dldF9lbmNvZGluZyhlbmNvZGluZykuY29kZWNfaW5mby5lbmNvZGUoaW5wdXQsIGVycm9ycylbMF0KCgpkZWYgaXRlcl9kZWNvZGUoaW5wdXQsIGZhbGxiYWNrX2VuY29kaW5nLCBlcnJvcnM9J3JlcGxhY2UnKToKICAgICIiIgogICAgIlB1bGwiLWJhc2VkIGRlY29kZXIuCgogICAgOnBhcmFtIGlucHV0OgogICAgICAgIEFuIGl0ZXJhYmxlIG9mIGJ5dGUgc3RyaW5ncy4KCiAgICAgICAgVGhlIGlucHV0IGlzIGZpcnN0IGNvbnN1bWVkIGp1c3QgZW5vdWdoIHRvIGRldGVybWluZSB0aGUgZW5jb2RpbmcKICAgICAgICBiYXNlZCBvbiB0aGUgcHJlY2Vuc2Ugb2YgYSBCT00sCiAgICAgICAgdGhlbiBjb25zdW1lZCBvbiBkZW1hbmQgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIGlzLgogICAgOnBhcmFtIGZhbGxiYWNrX2VuY29kaW5nOgogICAgICAgIEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgICAgICBUaGUgZW5jb2RpbmcgdG8gdXNlIGlmIDpvYmo6YGlucHV0YCBkb2VzIG5vdGUgaGF2ZSBhIEJPTS4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KICAgIDpyZXR1cm5zOgogICAgICAgIEFuIGBgKG91dHB1dCwgZW5jb2RpbmcpYGAgdHVwbGUuCiAgICAgICAgOm9iajpgb3V0cHV0YCBpcyBhbiBpdGVyYWJsZSBvZiBVbmljb2RlIHN0cmluZ3MsCiAgICAgICAgOm9iajpgZW5jb2RpbmdgIGlzIHRoZSA6b2JqOmBFbmNvZGluZ2AgdGhhdCBpcyBiZWluZyB1c2VkLgoKICAgICIiIgoKICAgIGRlY29kZXIgPSBJbmNyZW1lbnRhbERlY29kZXIoZmFsbGJhY2tfZW5jb2RpbmcsIGVycm9ycykKICAgIGdlbmVyYXRvciA9IF9pdGVyX2RlY29kZV9nZW5lcmF0b3IoaW5wdXQsIGRlY29kZXIpCiAgICBlbmNvZGluZyA9IG5leHQoZ2VuZXJhdG9yKQogICAgcmV0dXJuIGdlbmVyYXRvciwgZW5jb2RpbmcKCgpkZWYgX2l0ZXJfZGVjb2RlX2dlbmVyYXRvcihpbnB1dCwgZGVjb2Rlcik6CiAgICAiIiJSZXR1cm4gYSBnZW5lcmF0b3IgdGhhdCBmaXJzdCB5aWVsZHMgdGhlIDpvYmo6YEVuY29kaW5nYCwKICAgIHRoZW4geWllbGRzIG91dHB1dCBjaHVrbnMgYXMgVW5pY29kZSBzdHJpbmdzLgoKICAgICIiIgogICAgZGVjb2RlID0gZGVjb2Rlci5kZWNvZGUKICAgIGlucHV0ID0gaXRlcihpbnB1dCkKICAgIGZvciBjaHVuY2sgaW4gaW5wdXQ6CiAgICAgICAgb3V0cHV0ID0gZGVjb2RlKGNodW5jaykKICAgICAgICBpZiBvdXRwdXQ6CiAgICAgICAgICAgIGFzc2VydCBkZWNvZGVyLmVuY29kaW5nIGlzIG5vdCBOb25lCiAgICAgICAgICAgIHlpZWxkIGRlY29kZXIuZW5jb2RpbmcKICAgICAgICAgICAgeWllbGQgb3V0cHV0CiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgICMgSW5wdXQgZXhoYXVzdGVkIHdpdGhvdXQgZGV0ZXJtaW5pbmcgdGhlIGVuY29kaW5nCiAgICAgICAgb3V0cHV0ID0gZGVjb2RlKGInJywgZmluYWw9VHJ1ZSkKICAgICAgICBhc3NlcnQgZGVjb2Rlci5lbmNvZGluZyBpcyBub3QgTm9uZQogICAgICAgIHlpZWxkIGRlY29kZXIuZW5jb2RpbmcKICAgICAgICBpZiBvdXRwdXQ6CiAgICAgICAgICAgIHlpZWxkIG91dHB1dAogICAgICAgIHJldHVybgoKICAgIGZvciBjaHVuY2sgaW4gaW5wdXQ6CiAgICAgICAgb3V0cHV0ID0gZGVjb2RlKGNodW5jaykKICAgICAgICBpZiBvdXRwdXQ6CiAgICAgICAgICAgIHlpZWxkIG91dHB1dAogICAgb3V0cHV0ID0gZGVjb2RlKGInJywgZmluYWw9VHJ1ZSkKICAgIGlmIG91dHB1dDoKICAgICAgICB5aWVsZCBvdXRwdXQKCgpkZWYgaXRlcl9lbmNvZGUoaW5wdXQsIGVuY29kaW5nPVVURjgsIGVycm9ycz0nc3RyaWN0Jyk6CiAgICAiIiIKICAgIOKAnFB1bGzigJ0tYmFzZWQgZW5jb2Rlci4KCiAgICA6cGFyYW0gaW5wdXQ6IEFuIGl0ZXJhYmxlIG9mIFVuaWNvZGUgc3RyaW5ncy4KICAgIDpwYXJhbSBlbmNvZGluZzogQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgogICAgOnJldHVybnM6IEFuIGl0ZXJhYmxlIG9mIGJ5dGUgc3RyaW5ncy4KCiAgICAiIiIKICAgICMgRmFpbCBlYXJseSBpZiBgZW5jb2RpbmdgIGlzIGFuIGludmFsaWQgbGFiZWwuCiAgICBlbmNvZGUgPSBJbmNyZW1lbnRhbEVuY29kZXIoZW5jb2RpbmcsIGVycm9ycykuZW5jb2RlCiAgICByZXR1cm4gX2l0ZXJfZW5jb2RlX2dlbmVyYXRvcihpbnB1dCwgZW5jb2RlKQoKCmRlZiBfaXRlcl9lbmNvZGVfZ2VuZXJhdG9yKGlucHV0LCBlbmNvZGUpOgogICAgZm9yIGNodW5jayBpbiBpbnB1dDoKICAgICAgICBvdXRwdXQgPSBlbmNvZGUoY2h1bmNrKQogICAgICAgIGlmIG91dHB1dDoKICAgICAgICAgICAgeWllbGQgb3V0cHV0CiAgICBvdXRwdXQgPSBlbmNvZGUoJycsIGZpbmFsPVRydWUpCiAgICBpZiBvdXRwdXQ6CiAgICAgICAgeWllbGQgb3V0cHV0CgoKY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIOKAnFB1c2jigJ0tYmFzZWQgZGVjb2Rlci4KCiAgICA6cGFyYW0gZmFsbGJhY2tfZW5jb2Rpbmc6CiAgICAgICAgQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgICAgIFRoZSBlbmNvZGluZyB0byB1c2UgaWYgOm9iajpgaW5wdXRgIGRvZXMgbm90ZSBoYXZlIGEgQk9NLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhbGxiYWNrX2VuY29kaW5nLCBlcnJvcnM9J3JlcGxhY2UnKToKICAgICAgICAjIEZhaWwgZWFybHkgaWYgYGVuY29kaW5nYCBpcyBhbiBpbnZhbGlkIGxhYmVsLgogICAgICAgIHNlbGYuX2ZhbGxiYWNrX2VuY29kaW5nID0gX2dldF9lbmNvZGluZyhmYWxsYmFja19lbmNvZGluZykKICAgICAgICBzZWxmLl9lcnJvcnMgPSBlcnJvcnMKICAgICAgICBzZWxmLl9idWZmZXIgPSBiJycKICAgICAgICBzZWxmLl9kZWNvZGVyID0gTm9uZQogICAgICAgICM6IFRoZSBhY3R1YWwgOmNsYXNzOmBFbmNvZGluZ2AgdGhhdCBpcyBiZWluZyB1c2VkLAogICAgICAgICM6IG9yIDpvYmo6YE5vbmVgIGlmIHRoYXQgaXMgbm90IGRldGVybWluZWQgeWV0LgogICAgICAgICM6IChJZS4gaWYgdGhlcmUgaXMgbm90IGVub3VnaCBpbnB1dCB5ZXQgdG8gZGV0ZXJtaW5lCiAgICAgICAgIzogaWYgdGhlcmUgaXMgYSBCT00uKQogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBOb25lICAjIE5vdCBrbm93biB5ZXQuCgogICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgogICAgICAgICIiIkRlY29kZSBvbmUgY2h1bmsgb2YgdGhlIGlucHV0LgoKICAgICAgICA6cGFyYW0gaW5wdXQ6IEEgYnl0ZSBzdHJpbmcuCiAgICAgICAgOnBhcmFtIGZpbmFsOgogICAgICAgICAgICBJbmRpY2F0ZSB0aGF0IG5vIG1vcmUgaW5wdXQgaXMgYXZhaWxhYmxlLgogICAgICAgICAgICBNdXN0IGJlIDpvYmo6YFRydWVgIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbC4KICAgICAgICA6cmV0dXJuczogQW4gVW5pY29kZSBzdHJpbmcuCgogICAgICAgICIiIgogICAgICAgIGRlY29kZXIgPSBzZWxmLl9kZWNvZGVyCiAgICAgICAgaWYgZGVjb2RlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGRlY29kZXIoaW5wdXQsIGZpbmFsKQoKICAgICAgICBpbnB1dCA9IHNlbGYuX2J1ZmZlciArIGlucHV0CiAgICAgICAgZW5jb2RpbmcsIGlucHV0ID0gX2RldGVjdF9ib20oaW5wdXQpCiAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICAgICAgaWYgbGVuKGlucHV0KSA8IDMgYW5kIG5vdCBmaW5hbDogICMgTm90IGVub3VnaCBkYXRhIHlldC4KICAgICAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IGlucHV0CiAgICAgICAgICAgICAgICByZXR1cm4gJycKICAgICAgICAgICAgZWxzZTogICMgTm8gQk9NCiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHNlbGYuX2ZhbGxiYWNrX2VuY29kaW5nCiAgICAgICAgZGVjb2RlciA9IGVuY29kaW5nLmNvZGVjX2luZm8uaW5jcmVtZW50YWxkZWNvZGVyKHNlbGYuX2Vycm9ycykuZGVjb2RlCiAgICAgICAgc2VsZi5fZGVjb2RlciA9IGRlY29kZXIKICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKICAgICAgICByZXR1cm4gZGVjb2RlcihpbnB1dCwgZmluYWwpCgoKY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIOKAnFB1c2jigJ0tYmFzZWQgZW5jb2Rlci4KCiAgICA6cGFyYW0gZW5jb2Rpbmc6IEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KCiAgICAuLiBtZXRob2Q6OiBlbmNvZGUoaW5wdXQsIGZpbmFsPUZhbHNlKQoKICAgICAgICA6cGFyYW0gaW5wdXQ6IEFuIFVuaWNvZGUgc3RyaW5nLgogICAgICAgIDpwYXJhbSBmaW5hbDoKICAgICAgICAgICAgSW5kaWNhdGUgdGhhdCBubyBtb3JlIGlucHV0IGlzIGF2YWlsYWJsZS4KICAgICAgICAgICAgTXVzdCBiZSA6b2JqOmBUcnVlYCBpZiB0aGlzIGlzIHRoZSBsYXN0IGNhbGwuCiAgICAgICAgOnJldHVybnM6IEEgYnl0ZSBzdHJpbmcuCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZW5jb2Rpbmc9VVRGOCwgZXJyb3JzPSdzdHJpY3QnKToKICAgICAgICBlbmNvZGluZyA9IF9nZXRfZW5jb2RpbmcoZW5jb2RpbmcpCiAgICAgICAgc2VsZi5lbmNvZGUgPSBlbmNvZGluZy5jb2RlY19pbmZvLmluY3JlbWVudGFsZW5jb2RlcihlcnJvcnMpLmVuY29kZQpQSwMEFAAAAAAAAAAhAMetCIsTIwAAEyMAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9sYWJlbHMucHkiIiIKCiAgICB3ZWJlbmNvZGluZ3MubGFiZWxzCiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+CgogICAgTWFwIGVuY29kaW5nIGxhYmVscyB0byB0aGVpciBuYW1lLgoKICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDEyIGJ5IFNpbW9uIFNhcGluCiAgICA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KCiIiIgoKIyBYWFggRG8gbm90IGVkaXQhCiMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1rbGFiZWxzLnB5CgpMQUJFTFMgPSB7CiAgICAndW5pY29kZS0xLTEtdXRmLTgnOiAgICd1dGYtOCcsCiAgICAndXRmLTgnOiAgICAgICAgICAgICAgICd1dGYtOCcsCiAgICAndXRmOCc6ICAgICAgICAgICAgICAgICd1dGYtOCcsCiAgICAnODY2JzogICAgICAgICAgICAgICAgICdpYm04NjYnLAogICAgJ2NwODY2JzogICAgICAgICAgICAgICAnaWJtODY2JywKICAgICdjc2libTg2Nic6ICAgICAgICAgICAgJ2libTg2NicsCiAgICAnaWJtODY2JzogICAgICAgICAgICAgICdpYm04NjYnLAogICAgJ2NzaXNvbGF0aW4yJzogICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvLTg4NTktMic6ICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc28taXItMTAxJzogICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzbzg4NTktMic6ICAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvODg1OTInOiAgICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc29fODg1OS0yJzogICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzb184ODU5LTI6MTk4Nyc6ICAgICAnaXNvLTg4NTktMicsCiAgICAnbDInOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdsYXRpbjInOiAgICAgICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2NzaXNvbGF0aW4zJzogICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvLTg4NTktMyc6ICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc28taXItMTA5JzogICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzbzg4NTktMyc6ICAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvODg1OTMnOiAgICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc29fODg1OS0zJzogICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzb184ODU5LTM6MTk4OCc6ICAgICAnaXNvLTg4NTktMycsCiAgICAnbDMnOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdsYXRpbjMnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2NzaXNvbGF0aW40JzogICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvLTg4NTktNCc6ICAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc28taXItMTEwJzogICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzbzg4NTktNCc6ICAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvODg1OTQnOiAgICAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc29fODg1OS00JzogICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzb184ODU5LTQ6MTk4OCc6ICAgICAnaXNvLTg4NTktNCcsCiAgICAnbDQnOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS00JywKICAgICdsYXRpbjQnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2NzaXNvbGF0aW5jeXJpbGxpYyc6ICAnaXNvLTg4NTktNScsCiAgICAnY3lyaWxsaWMnOiAgICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc28tODg1OS01JzogICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzby1pci0xNDQnOiAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvODg1OS01JzogICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc284ODU5NSc6ICAgICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzb184ODU5LTUnOiAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvXzg4NTktNToxOTg4JzogICAgICdpc28tODg1OS01JywKICAgICdhcmFiaWMnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2FzbW8tNzA4JzogICAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnY3Npc284ODU5NmUnOiAgICAgICAgICdpc28tODg1OS02JywKICAgICdjc2lzbzg4NTk2aSc6ICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2NzaXNvbGF0aW5hcmFiaWMnOiAgICAnaXNvLTg4NTktNicsCiAgICAnZWNtYS0xMTQnOiAgICAgICAgICAgICdpc28tODg1OS02JywKICAgICdpc28tODg1OS02JzogICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzby04ODU5LTYtZSc6ICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvLTg4NTktNi1pJzogICAgICAgICdpc28tODg1OS02JywKICAgICdpc28taXItMTI3JzogICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzbzg4NTktNic6ICAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvODg1OTYnOiAgICAgICAgICAgICdpc28tODg1OS02JywKICAgICdpc29fODg1OS02JzogICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzb184ODU5LTY6MTk4Nyc6ICAgICAnaXNvLTg4NTktNicsCiAgICAnY3Npc29sYXRpbmdyZWVrJzogICAgICdpc28tODg1OS03JywKICAgICdlY21hLTExOCc6ICAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2Vsb3RfOTI4JzogICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnZ3JlZWsnOiAgICAgICAgICAgICAgICdpc28tODg1OS03JywKICAgICdncmVlazgnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzby04ODU5LTcnOiAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvLWlyLTEyNic6ICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc284ODU5LTcnOiAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzbzg4NTk3JzogICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvXzg4NTktNyc6ICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc29fODg1OS03OjE5ODcnOiAgICAgJ2lzby04ODU5LTcnLAogICAgJ3N1bl9ldV9ncmVlayc6ICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnY3Npc284ODU5OGUnOiAgICAgICAgICdpc28tODg1OS04JywKICAgICdjc2lzb2xhdGluaGVicmV3JzogICAgJ2lzby04ODU5LTgnLAogICAgJ2hlYnJldyc6ICAgICAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvLTg4NTktOCc6ICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc28tODg1OS04LWUnOiAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzby1pci0xMzgnOiAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvODg1OS04JzogICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc284ODU5OCc6ICAgICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzb184ODU5LTgnOiAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvXzg4NTktODoxOTg4JzogICAgICdpc28tODg1OS04JywKICAgICd2aXN1YWwnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2NzaXNvODg1OThpJzogICAgICAgICAnaXNvLTg4NTktOC1pJywKICAgICdpc28tODg1OS04LWknOiAgICAgICAgJ2lzby04ODU5LTgtaScsCiAgICAnbG9naWNhbCc6ICAgICAgICAgICAgICdpc28tODg1OS04LWknLAogICAgJ2NzaXNvbGF0aW42JzogICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzby04ODU5LTEwJzogICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzby1pci0xNTcnOiAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzbzg4NTktMTAnOiAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzbzg4NTkxMCc6ICAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2w2JzogICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2xhdGluNic6ICAgICAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzby04ODU5LTEzJzogICAgICAgICAnaXNvLTg4NTktMTMnLAogICAgJ2lzbzg4NTktMTMnOiAgICAgICAgICAnaXNvLTg4NTktMTMnLAogICAgJ2lzbzg4NTkxMyc6ICAgICAgICAgICAnaXNvLTg4NTktMTMnLAogICAgJ2lzby04ODU5LTE0JzogICAgICAgICAnaXNvLTg4NTktMTQnLAogICAgJ2lzbzg4NTktMTQnOiAgICAgICAgICAnaXNvLTg4NTktMTQnLAogICAgJ2lzbzg4NTkxNCc6ICAgICAgICAgICAnaXNvLTg4NTktMTQnLAogICAgJ2NzaXNvbGF0aW45JzogICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzby04ODU5LTE1JzogICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzbzg4NTktMTUnOiAgICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzbzg4NTkxNSc6ICAgICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzb184ODU5LTE1JzogICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2w5JzogICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzby04ODU5LTE2JzogICAgICAgICAnaXNvLTg4NTktMTYnLAogICAgJ2Nza29pOHInOiAgICAgICAgICAgICAna29pOC1yJywKICAgICdrb2knOiAgICAgICAgICAgICAgICAgJ2tvaTgtcicsCiAgICAna29pOCc6ICAgICAgICAgICAgICAgICdrb2k4LXInLAogICAgJ2tvaTgtcic6ICAgICAgICAgICAgICAna29pOC1yJywKICAgICdrb2k4X3InOiAgICAgICAgICAgICAgJ2tvaTgtcicsCiAgICAna29pOC11JzogICAgICAgICAgICAgICdrb2k4LXUnLAogICAgJ2NzbWFjaW50b3NoJzogICAgICAgICAnbWFjaW50b3NoJywKICAgICdtYWMnOiAgICAgICAgICAgICAgICAgJ21hY2ludG9zaCcsCiAgICAnbWFjaW50b3NoJzogICAgICAgICAgICdtYWNpbnRvc2gnLAogICAgJ3gtbWFjLXJvbWFuJzogICAgICAgICAnbWFjaW50b3NoJywKICAgICdkb3MtODc0JzogICAgICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICdpc28tODg1OS0xMSc6ICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICdpc284ODU5LTExJzogICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICdpc284ODU5MTEnOiAgICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICd0aXMtNjIwJzogICAgICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICd3aW5kb3dzLTg3NCc6ICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICdjcDEyNTAnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MCcsCiAgICAnd2luZG93cy0xMjUwJzogICAgICAgICd3aW5kb3dzLTEyNTAnLAogICAgJ3gtY3AxMjUwJzogICAgICAgICAgICAnd2luZG93cy0xMjUwJywKICAgICdjcDEyNTEnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MScsCiAgICAnd2luZG93cy0xMjUxJzogICAgICAgICd3aW5kb3dzLTEyNTEnLAogICAgJ3gtY3AxMjUxJzogICAgICAgICAgICAnd2luZG93cy0xMjUxJywKICAgICdhbnNpX3gzLjQtMTk2OCc6ICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnYXNjaWknOiAgICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2NwMTI1Mic6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdjcDgxOSc6ICAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnY3Npc29sYXRpbjEnOiAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2libTgxOSc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc28tODg1OS0xJzogICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvLWlyLTEwMCc6ICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzbzg4NTktMSc6ICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc284ODU5MSc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvXzg4NTktMSc6ICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzb184ODU5LTE6MTk4Nyc6ICAgICAnd2luZG93cy0xMjUyJywKICAgICdsMSc6ICAgICAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnbGF0aW4xJzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ3VzLWFzY2lpJzogICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICd3aW5kb3dzLTEyNTInOiAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAneC1jcDEyNTInOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2NwMTI1Myc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUzJywKICAgICd3aW5kb3dzLTEyNTMnOiAgICAgICAgJ3dpbmRvd3MtMTI1MycsCiAgICAneC1jcDEyNTMnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTMnLAogICAgJ2NwMTI1NCc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdjc2lzb2xhdGluNSc6ICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvLTg4NTktOSc6ICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzby1pci0xNDgnOiAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc284ODU5LTknOiAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvODg1OTknOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzb184ODU5LTknOiAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc29fODg1OS05OjE5ODknOiAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnbDUnOiAgICAgICAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2xhdGluNSc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICd3aW5kb3dzLTEyNTQnOiAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAneC1jcDEyNTQnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2NwMTI1NSc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU1JywKICAgICd3aW5kb3dzLTEyNTUnOiAgICAgICAgJ3dpbmRvd3MtMTI1NScsCiAgICAneC1jcDEyNTUnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTUnLAogICAgJ2NwMTI1Nic6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU2JywKICAgICd3aW5kb3dzLTEyNTYnOiAgICAgICAgJ3dpbmRvd3MtMTI1NicsCiAgICAneC1jcDEyNTYnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTYnLAogICAgJ2NwMTI1Nyc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU3JywKICAgICd3aW5kb3dzLTEyNTcnOiAgICAgICAgJ3dpbmRvd3MtMTI1NycsCiAgICAneC1jcDEyNTcnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTcnLAogICAgJ2NwMTI1OCc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU4JywKICAgICd3aW5kb3dzLTEyNTgnOiAgICAgICAgJ3dpbmRvd3MtMTI1OCcsCiAgICAneC1jcDEyNTgnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTgnLAogICAgJ3gtbWFjLWN5cmlsbGljJzogICAgICAneC1tYWMtY3lyaWxsaWMnLAogICAgJ3gtbWFjLXVrcmFpbmlhbic6ICAgICAneC1tYWMtY3lyaWxsaWMnLAogICAgJ2NoaW5lc2UnOiAgICAgICAgICAgICAnZ2JrJywKICAgICdjc2diMjMxMic6ICAgICAgICAgICAgJ2diaycsCiAgICAnY3Npc281OGdiMjMxMjgwJzogICAgICdnYmsnLAogICAgJ2diMjMxMic6ICAgICAgICAgICAgICAnZ2JrJywKICAgICdnYl8yMzEyJzogICAgICAgICAgICAgJ2diaycsCiAgICAnZ2JfMjMxMi04MCc6ICAgICAgICAgICdnYmsnLAogICAgJ2diayc6ICAgICAgICAgICAgICAgICAnZ2JrJywKICAgICdpc28taXItNTgnOiAgICAgICAgICAgJ2diaycsCiAgICAneC1nYmsnOiAgICAgICAgICAgICAgICdnYmsnLAogICAgJ2diMTgwMzAnOiAgICAgICAgICAgICAnZ2IxODAzMCcsCiAgICAnaHotZ2ItMjMxMic6ICAgICAgICAgICdoei1nYi0yMzEyJywKICAgICdiaWc1JzogICAgICAgICAgICAgICAgJ2JpZzUnLAogICAgJ2JpZzUtaGtzY3MnOiAgICAgICAgICAnYmlnNScsCiAgICAnY24tYmlnNSc6ICAgICAgICAgICAgICdiaWc1JywKICAgICdjc2JpZzUnOiAgICAgICAgICAgICAgJ2JpZzUnLAogICAgJ3gteC1iaWc1JzogICAgICAgICAgICAnYmlnNScsCiAgICAnY3NldWNwa2RmbXRqYXBhbmVzZSc6ICdldWMtanAnLAogICAgJ2V1Yy1qcCc6ICAgICAgICAgICAgICAnZXVjLWpwJywKICAgICd4LWV1Yy1qcCc6ICAgICAgICAgICAgJ2V1Yy1qcCcsCiAgICAnY3Npc28yMDIyanAnOiAgICAgICAgICdpc28tMjAyMi1qcCcsCiAgICAnaXNvLTIwMjItanAnOiAgICAgICAgICdpc28tMjAyMi1qcCcsCiAgICAnY3NzaGlmdGppcyc6ICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ21zX2thbmppJzogICAgICAgICAgICAnc2hpZnRfamlzJywKICAgICdzaGlmdC1qaXMnOiAgICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnc2hpZnRfamlzJzogICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ3NqaXMnOiAgICAgICAgICAgICAgICAnc2hpZnRfamlzJywKICAgICd3aW5kb3dzLTMxaic6ICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAneC1zamlzJzogICAgICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ2NzZXVja3InOiAgICAgICAgICAgICAnZXVjLWtyJywKICAgICdjc2tzYzU2MDExOTg3JzogICAgICAgJ2V1Yy1rcicsCiAgICAnZXVjLWtyJzogICAgICAgICAgICAgICdldWMta3InLAogICAgJ2lzby1pci0xNDknOiAgICAgICAgICAnZXVjLWtyJywKICAgICdrb3JlYW4nOiAgICAgICAgICAgICAgJ2V1Yy1rcicsCiAgICAna3NfY181NjAxLTE5ODcnOiAgICAgICdldWMta3InLAogICAgJ2tzX2NfNTYwMS0xOTg5JzogICAgICAnZXVjLWtyJywKICAgICdrc2M1NjAxJzogICAgICAgICAgICAgJ2V1Yy1rcicsCiAgICAna3NjXzU2MDEnOiAgICAgICAgICAgICdldWMta3InLAogICAgJ3dpbmRvd3MtOTQ5JzogICAgICAgICAnZXVjLWtyJywKICAgICdjc2lzbzIwMjJrcic6ICAgICAgICAgJ2lzby0yMDIyLWtyJywKICAgICdpc28tMjAyMi1rcic6ICAgICAgICAgJ2lzby0yMDIyLWtyJywKICAgICd1dGYtMTZiZSc6ICAgICAgICAgICAgJ3V0Zi0xNmJlJywKICAgICd1dGYtMTYnOiAgICAgICAgICAgICAgJ3V0Zi0xNmxlJywKICAgICd1dGYtMTZsZSc6ICAgICAgICAgICAgJ3V0Zi0xNmxlJywKICAgICd4LXVzZXItZGVmaW5lZCc6ICAgICAgJ3gtdXNlci1kZWZpbmVkJywKfQpQSwMEFAAAAAAAAAAhAFB/MR8ZBQAAGQUAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9ta2xhYmVscy5weSIiIgoKICAgIHdlYmVuY29kaW5ncy5ta2xhYmVscwogICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+CgogICAgUmVnZW5hcmF0ZSB0aGUgd2ViZW5jb2RpbmdzLmxhYmVscyBtb2R1bGUuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgppbXBvcnQganNvbgp0cnk6CiAgICBmcm9tIHVybGxpYiBpbXBvcnQgdXJsb3BlbgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuCgoKZGVmIGFzc2VydF9sb3dlcihzdHJpbmcpOgogICAgYXNzZXJ0IHN0cmluZyA9PSBzdHJpbmcubG93ZXIoKQogICAgcmV0dXJuIHN0cmluZwoKCmRlZiBnZW5lcmF0ZSh1cmwpOgogICAgcGFydHMgPSBbJycnXAoiIiIKCiAgICB3ZWJlbmNvZGluZ3MubGFiZWxzCiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+CgogICAgTWFwIGVuY29kaW5nIGxhYmVscyB0byB0aGVpciBuYW1lLgoKICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDEyIGJ5IFNpbW9uIFNhcGluCiAgICA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KCiIiIgoKIyBYWFggRG8gbm90IGVkaXQhCiMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1rbGFiZWxzLnB5CgpMQUJFTFMgPSB7CicnJ10KICAgIGxhYmVscyA9IFsKICAgICAgICAocmVwcihhc3NlcnRfbG93ZXIobGFiZWwpKS5sc3RyaXAoJ3UnKSwKICAgICAgICAgcmVwcihlbmNvZGluZ1snbmFtZSddKS5sc3RyaXAoJ3UnKSkKICAgICAgICBmb3IgY2F0ZWdvcnkgaW4ganNvbi5sb2Fkcyh1cmxvcGVuKHVybCkucmVhZCgpLmRlY29kZSgnYXNjaWknKSkKICAgICAgICBmb3IgZW5jb2RpbmcgaW4gY2F0ZWdvcnlbJ2VuY29kaW5ncyddCiAgICAgICAgZm9yIGxhYmVsIGluIGVuY29kaW5nWydsYWJlbHMnXV0KICAgIG1heF9sZW4gPSBtYXgobGVuKGxhYmVsKSBmb3IgbGFiZWwsIG5hbWUgaW4gbGFiZWxzKQogICAgcGFydHMuZXh0ZW5kKAogICAgICAgICcgICAgJXM6JXMgJXMsXG4nICUgKGxhYmVsLCAnICcgKiAobWF4X2xlbiAtIGxlbihsYWJlbCkpLCBuYW1lKQogICAgICAgIGZvciBsYWJlbCwgbmFtZSBpbiBsYWJlbHMpCiAgICBwYXJ0cy5hcHBlbmQoJ30nKQogICAgcmV0dXJuICcnLmpvaW4ocGFydHMpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHByaW50KGdlbmVyYXRlKCdodHRwOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnL2VuY29kaW5ncy5qc29uJykpClBLAwQUAAAAAAAAACEAFps+HaIZAACiGQAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3Rlc3RzLnB5IyBjb2Rpbmc6IHV0ZjgKIiIiCgogICAgd2ViZW5jb2RpbmdzLnRlc3RzCiAgICB+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBBIGJhc2ljIHRlc3Qgc3VpdGUgZm9yIEVuY29kaW5nLgoKICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDEyIGJ5IFNpbW9uIFNhcGluCiAgICA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4gaW1wb3J0IChsb29rdXAsIExBQkVMUywgZGVjb2RlLCBlbmNvZGUsIGl0ZXJfZGVjb2RlLCBpdGVyX2VuY29kZSwKICAgICAgICAgICAgICAgSW5jcmVtZW50YWxEZWNvZGVyLCBJbmNyZW1lbnRhbEVuY29kZXIsIFVURjgpCgoKZGVmIGFzc2VydF9yYWlzZXMoZXhjZXB0aW9uLCBmdW5jdGlvbiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHRyeToKICAgICAgICBmdW5jdGlvbigqYXJncywgKiprd2FyZ3MpCiAgICBleGNlcHQgZXhjZXB0aW9uOgogICAgICAgIHJldHVybgogICAgZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdEaWQgbm90IHJhaXNlICVzLicgJSBleGNlcHRpb24pCgoKZGVmIHRlc3RfbGFiZWxzKCk6CiAgICBhc3NlcnQgbG9va3VwKCd1dGYtOCcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgnVXRmLTgnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ1VURi04JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCd1dGY4JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCd1dGY4JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCd1dGY4ICcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgnIFxyXG51dGY4XHQnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ3U4JykgaXMgTm9uZSAgIyBQeXRob24gbGFiZWwuCiAgICBhc3NlcnQgbG9va3VwKCd1dGYtOMKgJykgaXMgTm9uZSAgIyBOb24tQVNDSUkgd2hpdGUgc3BhY2UuCgogICAgYXNzZXJ0IGxvb2t1cCgnVVMtQVNDSUknKS5uYW1lID09ICd3aW5kb3dzLTEyNTInCiAgICBhc3NlcnQgbG9va3VwKCdpc28tODg1OS0xJykubmFtZSA9PSAnd2luZG93cy0xMjUyJwogICAgYXNzZXJ0IGxvb2t1cCgnbGF0aW4xJykubmFtZSA9PSAnd2luZG93cy0xMjUyJwogICAgYXNzZXJ0IGxvb2t1cCgnTEFUSU4xJykubmFtZSA9PSAnd2luZG93cy0xMjUyJwogICAgYXNzZXJ0IGxvb2t1cCgnbGF0aW4tMScpIGlzIE5vbmUKICAgIGFzc2VydCBsb29rdXAoJ0xBVMSwTjEnKSBpcyBOb25lICAjIEFTQ0lJLW9ubHkgY2FzZSBpbnNlbnNpdGl2aXR5LgoKCmRlZiB0ZXN0X2FsbF9sYWJlbHMoKToKICAgIGZvciBsYWJlbCBpbiBMQUJFTFM6CiAgICAgICAgYXNzZXJ0IGRlY29kZShiJycsIGxhYmVsKSA9PSAoJycsIGxvb2t1cChsYWJlbCkpCiAgICAgICAgYXNzZXJ0IGVuY29kZSgnJywgbGFiZWwpID09IGInJwogICAgICAgIGZvciByZXBlYXQgaW4gWzAsIDEsIDEyXToKICAgICAgICAgICAgb3V0cHV0LCBfID0gaXRlcl9kZWNvZGUoW2InJ10gKiByZXBlYXQsIGxhYmVsKQogICAgICAgICAgICBhc3NlcnQgbGlzdChvdXRwdXQpID09IFtdCiAgICAgICAgICAgIGFzc2VydCBsaXN0KGl0ZXJfZW5jb2RlKFsnJ10gKiByZXBlYXQsIGxhYmVsKSkgPT0gW10KICAgICAgICBkZWNvZGVyID0gSW5jcmVtZW50YWxEZWNvZGVyKGxhYmVsKQogICAgICAgIGFzc2VydCBkZWNvZGVyLmRlY29kZShiJycpID09ICcnCiAgICAgICAgYXNzZXJ0IGRlY29kZXIuZGVjb2RlKGInJywgZmluYWw9VHJ1ZSkgPT0gJycKICAgICAgICBlbmNvZGVyID0gSW5jcmVtZW50YWxFbmNvZGVyKGxhYmVsKQogICAgICAgIGFzc2VydCBlbmNvZGVyLmVuY29kZSgnJykgPT0gYicnCiAgICAgICAgYXNzZXJ0IGVuY29kZXIuZW5jb2RlKCcnLCBmaW5hbD1UcnVlKSA9PSBiJycKICAgICMgQWxsIGVuY29kaW5nIG5hbWVzIGFyZSB2YWxpZCBsYWJlbHMgdG9vOgogICAgZm9yIG5hbWUgaW4gc2V0KExBQkVMUy52YWx1ZXMoKSk6CiAgICAgICAgYXNzZXJ0IGxvb2t1cChuYW1lKS5uYW1lID09IG5hbWUKCgpkZWYgdGVzdF9pbnZhbGlkX2xhYmVsKCk6CiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBkZWNvZGUsIGInXHhFRlx4QkJceEJGXHhjM1x4YTknLCAnaW52YWxpZCcpCiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBlbmNvZGUsICfDqScsICdpbnZhbGlkJykKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIGl0ZXJfZGVjb2RlLCBbXSwgJ2ludmFsaWQnKQogICAgYXNzZXJ0X3JhaXNlcyhMb29rdXBFcnJvciwgaXRlcl9lbmNvZGUsIFtdLCAnaW52YWxpZCcpCiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBJbmNyZW1lbnRhbERlY29kZXIsICdpbnZhbGlkJykKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIEluY3JlbWVudGFsRW5jb2RlciwgJ2ludmFsaWQnKQoKCmRlZiB0ZXN0X2RlY29kZSgpOgogICAgYXNzZXJ0IGRlY29kZShiJ1x4ODAnLCAnbGF0aW4xJykgPT0gKCfigqwnLCBsb29rdXAoJ2xhdGluMScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4ODAnLCBsb29rdXAoJ2xhdGluMScpKSA9PSAoJ+KCrCcsIGxvb2t1cCgnbGF0aW4xJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhjM1x4YTknLCAndXRmOCcpID09ICgnw6knLCBsb29rdXAoJ3V0ZjgnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceGMzXHhhOScsIFVURjgpID09ICgnw6knLCBsb29rdXAoJ3V0ZjgnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceGMzXHhhOScsICdhc2NpaScpID09ICgnw4PCqScsIGxvb2t1cCgnYXNjaWknKSkKICAgIGFzc2VydCBkZWNvZGUoYidceEVGXHhCQlx4QkZceGMzXHhhOScsICdhc2NpaScpID09ICgnw6knLCBsb29rdXAoJ3V0ZjgnKSkgICMgVVRGLTggd2l0aCBCT00KCiAgICBhc3NlcnQgZGVjb2RlKGInXHhGRVx4RkZceDAwXHhlOScsICdhc2NpaScpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmJlJykpICAjIFVURi0xNi1CRSB3aXRoIEJPTQogICAgYXNzZXJ0IGRlY29kZShiJ1x4RkZceEZFXHhlOVx4MDAnLCAnYXNjaWknKSA9PSAoJ8OpJywgbG9va3VwKCd1dGYtMTZsZScpKSAgIyBVVEYtMTYtTEUgd2l0aCBCT00KICAgIGFzc2VydCBkZWNvZGUoYidceEZFXHhGRlx4ZTlceDAwJywgJ2FzY2lpJykgPT0gKCdcdWU5MDAnLCBsb29rdXAoJ3V0Zi0xNmJlJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhGRlx4RkVceDAwXHhlOScsICdhc2NpaScpID09ICgnXHVlOTAwJywgbG9va3VwKCd1dGYtMTZsZScpKQoKICAgIGFzc2VydCBkZWNvZGUoYidceDAwXHhlOScsICdVVEYtMTZCRScpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmJlJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhlOVx4MDAnLCAnVVRGLTE2TEUnKSA9PSAoJ8OpJywgbG9va3VwKCd1dGYtMTZsZScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4ZTlceDAwJywgJ1VURi0xNicpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmxlJykpCgogICAgYXNzZXJ0IGRlY29kZShiJ1x4ZTlceDAwJywgJ1VURi0xNkJFJykgPT0gKCdcdWU5MDAnLCBsb29rdXAoJ3V0Zi0xNmJlJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHgwMFx4ZTknLCAnVVRGLTE2TEUnKSA9PSAoJ1x1ZTkwMCcsIGxvb2t1cCgndXRmLTE2bGUnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceDAwXHhlOScsICdVVEYtMTYnKSA9PSAoJ1x1ZTkwMCcsIGxvb2t1cCgndXRmLTE2bGUnKSkKCgpkZWYgdGVzdF9lbmNvZGUoKToKICAgIGFzc2VydCBlbmNvZGUoJ8OpJywgJ2xhdGluMScpID09IGInXHhlOScKICAgIGFzc2VydCBlbmNvZGUoJ8OpJywgJ3V0ZjgnKSA9PSBiJ1x4YzNceGE5JwogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAndXRmOCcpID09IGInXHhjM1x4YTknCiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICd1dGYtMTYnKSA9PSBiJ1x4ZTlceDAwJwogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAndXRmLTE2bGUnKSA9PSBiJ1x4ZTlceDAwJwogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAndXRmLTE2YmUnKSA9PSBiJ1x4MDBceGU5JwoKCmRlZiB0ZXN0X2l0ZXJfZGVjb2RlKCk6CiAgICBkZWYgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKGlucHV0LCBmYWxsYmFja19lbmNvZGluZyk6CiAgICAgICAgb3V0cHV0LCBfZW5jb2RpbmcgPSBpdGVyX2RlY29kZShpbnB1dCwgZmFsbGJhY2tfZW5jb2RpbmcpCiAgICAgICAgcmV0dXJuICcnLmpvaW4ob3V0cHV0KQogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbXSwgJ2xhdGluMScpID09ICcnCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJyddLCAnbGF0aW4xJykgPT0gJycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhlOSddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidoZWxsbyddLCAnbGF0aW4xJykgPT0gJ2hlbGxvJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidoZScsIGInbGxvJ10sICdsYXRpbjEnKSA9PSAnaGVsbG8nCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ2hlbGwnLCBiJ28nXSwgJ2xhdGluMScpID09ICdoZWxsbycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhjM1x4YTknXSwgJ2xhdGluMScpID09ICfDg8KpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceEVGXHhCQlx4QkZceGMzXHhhOSddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYidceEVGXHhCQlx4QkYnLCBiJ1x4YzMnLCBiJ1x4YTknXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoWwogICAgICAgIGInXHhFRlx4QkJceEJGJywgYidhJywgYidceGMzJ10sICdsYXRpbjEnKSA9PSAnYVx1RkZGRCcKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoWwogICAgICAgIGInJywgYidceEVGJywgYicnLCBiJycsIGInXHhCQlx4QkZceGMzJywgYidceGE5J10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4RUZceEJCXHhCRiddLCAnbGF0aW4xJykgPT0gJycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhFRlx4QkInXSwgJ2xhdGluMScpID09ICfDr8K7JwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceEZFXHhGRlx4MDBceGU5J10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4RkZceEZFXHhlOVx4MDAnXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoWwogICAgICAgIGInJywgYidceEZGJywgYicnLCBiJycsIGInXHhGRVx4ZTknLCBiJ1x4MDAnXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoWwogICAgICAgIGInJywgYidoXHhlOScsIGInbGxvJ10sICd4LXVzZXItZGVmaW5lZCcpID09ICdoXHVGN0U5bGxvJwoKCmRlZiB0ZXN0X2l0ZXJfZW5jb2RlKCk6CiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoW10sICdsYXRpbjEnKSkgPT0gYicnCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWycnXSwgJ2xhdGluMScpKSA9PSBiJycKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJ8OpJ10sICdsYXRpbjEnKSkgPT0gYidceGU5JwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsnJywgJ8OpJywgJycsICcnXSwgJ2xhdGluMScpKSA9PSBiJ1x4ZTknCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWycnLCAnw6knLCAnJywgJyddLCAndXRmLTE2JykpID09IGInXHhlOVx4MDAnCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWycnLCAnw6knLCAnJywgJyddLCAndXRmLTE2bGUnKSkgPT0gYidceGU5XHgwMCcKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJycsICfDqScsICcnLCAnJ10sICd1dGYtMTZiZScpKSA9PSBiJ1x4MDBceGU5JwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsKICAgICAgICAnJywgJ2hcdUY3RTknLCAnJywgJ2xsbyddLCAneC11c2VyLWRlZmluZWQnKSkgPT0gYidoXHhlOWxsbycKCgpkZWYgdGVzdF94X3VzZXJfZGVmaW5lZCgpOgogICAgZW5jb2RlZCA9IGInMixceDBjXHgwYlx4MWFPXHhkOSNceGNiXHgwZlx4YzlceGJidFx4Y2ZceGE4XHhjYScKICAgIGRlY29kZWQgPSAnMixceDBjXHgwYlx4MWFPXHVmN2Q5I1x1ZjdjYlx4MGZcdWY3YzlcdWY3YmJ0XHVmN2NmXHVmN2E4XHVmN2NhJwogICAgZW5jb2RlZCA9IGInYWEnCiAgICBkZWNvZGVkID0gJ2FhJwogICAgYXNzZXJ0IGRlY29kZShlbmNvZGVkLCAneC11c2VyLWRlZmluZWQnKSA9PSAoZGVjb2RlZCwgbG9va3VwKCd4LXVzZXItZGVmaW5lZCcpKQogICAgYXNzZXJ0IGVuY29kZShkZWNvZGVkLCAneC11c2VyLWRlZmluZWQnKSA9PSBlbmNvZGVkClBLAwQUAAAAAAAAACEASG9FvtIQAADSEAAARwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3hfdXNlcl9kZWZpbmVkLnB5IyBjb2Rpbmc6IHV0ZjgKIiIiCgogICAgd2ViZW5jb2RpbmdzLnhfdXNlcl9kZWZpbmVkCiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgeC11c2VyLWRlZmluZWQgZW5jb2RpbmcuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBjb2RlY3MKCgojIyMgQ29kZWMgQVBJcwoKY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKCiAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgogICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsIGVycm9ycywgZW5jb2RpbmdfdGFibGUpCgogICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LCBlcnJvcnMsIGRlY29kaW5nX3RhYmxlKQoKCmNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycywgZW5jb2RpbmdfdGFibGUpWzBdCgoKY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgogICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgogICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzLCBkZWNvZGluZ190YWJsZSlbMF0KCgpjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgogICAgcGFzcwoKCmNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6CiAgICBwYXNzCgoKIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCgpjb2RlY19pbmZvID0gY29kZWNzLkNvZGVjSW5mbygKICAgIG5hbWU9J3gtdXNlci1kZWZpbmVkJywKICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCiAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAogICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCikKCgojIyMgRGVjb2RpbmcgVGFibGUKCiMgUHl0aG9uIDM6CiMgZm9yIGMgaW4gcmFuZ2UoMjU2KTogcHJpbnQoJyAgICAlcicgJSBjaHIoYyBpZiBjIDwgMTI4IGVsc2UgYyArIDB4RjcwMCkpCmRlY29kaW5nX3RhYmxlID0gKAogICAgJ1x4MDAnCiAgICAnXHgwMScKICAgICdceDAyJwogICAgJ1x4MDMnCiAgICAnXHgwNCcKICAgICdceDA1JwogICAgJ1x4MDYnCiAgICAnXHgwNycKICAgICdceDA4JwogICAgJ1x0JwogICAgJ1xuJwogICAgJ1x4MGInCiAgICAnXHgwYycKICAgICdccicKICAgICdceDBlJwogICAgJ1x4MGYnCiAgICAnXHgxMCcKICAgICdceDExJwogICAgJ1x4MTInCiAgICAnXHgxMycKICAgICdceDE0JwogICAgJ1x4MTUnCiAgICAnXHgxNicKICAgICdceDE3JwogICAgJ1x4MTgnCiAgICAnXHgxOScKICAgICdceDFhJwogICAgJ1x4MWInCiAgICAnXHgxYycKICAgICdceDFkJwogICAgJ1x4MWUnCiAgICAnXHgxZicKICAgICcgJwogICAgJyEnCiAgICAnIicKICAgICcjJwogICAgJyQnCiAgICAnJScKICAgICcmJwogICAgIiciCiAgICAnKCcKICAgICcpJwogICAgJyonCiAgICAnKycKICAgICcsJwogICAgJy0nCiAgICAnLicKICAgICcvJwogICAgJzAnCiAgICAnMScKICAgICcyJwogICAgJzMnCiAgICAnNCcKICAgICc1JwogICAgJzYnCiAgICAnNycKICAgICc4JwogICAgJzknCiAgICAnOicKICAgICc7JwogICAgJzwnCiAgICAnPScKICAgICc+JwogICAgJz8nCiAgICAnQCcKICAgICdBJwogICAgJ0InCiAgICAnQycKICAgICdEJwogICAgJ0UnCiAgICAnRicKICAgICdHJwogICAgJ0gnCiAgICAnSScKICAgICdKJwogICAgJ0snCiAgICAnTCcKICAgICdNJwogICAgJ04nCiAgICAnTycKICAgICdQJwogICAgJ1EnCiAgICAnUicKICAgICdTJwogICAgJ1QnCiAgICAnVScKICAgICdWJwogICAgJ1cnCiAgICAnWCcKICAgICdZJwogICAgJ1onCiAgICAnWycKICAgICdcXCcKICAgICddJwogICAgJ14nCiAgICAnXycKICAgICdgJwogICAgJ2EnCiAgICAnYicKICAgICdjJwogICAgJ2QnCiAgICAnZScKICAgICdmJwogICAgJ2cnCiAgICAnaCcKICAgICdpJwogICAgJ2onCiAgICAnaycKICAgICdsJwogICAgJ20nCiAgICAnbicKICAgICdvJwogICAgJ3AnCiAgICAncScKICAgICdyJwogICAgJ3MnCiAgICAndCcKICAgICd1JwogICAgJ3YnCiAgICAndycKICAgICd4JwogICAgJ3knCiAgICAneicKICAgICd7JwogICAgJ3wnCiAgICAnfScKICAgICd+JwogICAgJ1x4N2YnCiAgICAnXHVmNzgwJwogICAgJ1x1Zjc4MScKICAgICdcdWY3ODInCiAgICAnXHVmNzgzJwogICAgJ1x1Zjc4NCcKICAgICdcdWY3ODUnCiAgICAnXHVmNzg2JwogICAgJ1x1Zjc4NycKICAgICdcdWY3ODgnCiAgICAnXHVmNzg5JwogICAgJ1x1Zjc4YScKICAgICdcdWY3OGInCiAgICAnXHVmNzhjJwogICAgJ1x1Zjc4ZCcKICAgICdcdWY3OGUnCiAgICAnXHVmNzhmJwogICAgJ1x1Zjc5MCcKICAgICdcdWY3OTEnCiAgICAnXHVmNzkyJwogICAgJ1x1Zjc5MycKICAgICdcdWY3OTQnCiAgICAnXHVmNzk1JwogICAgJ1x1Zjc5NicKICAgICdcdWY3OTcnCiAgICAnXHVmNzk4JwogICAgJ1x1Zjc5OScKICAgICdcdWY3OWEnCiAgICAnXHVmNzliJwogICAgJ1x1Zjc5YycKICAgICdcdWY3OWQnCiAgICAnXHVmNzllJwogICAgJ1x1Zjc5ZicKICAgICdcdWY3YTAnCiAgICAnXHVmN2ExJwogICAgJ1x1ZjdhMicKICAgICdcdWY3YTMnCiAgICAnXHVmN2E0JwogICAgJ1x1ZjdhNScKICAgICdcdWY3YTYnCiAgICAnXHVmN2E3JwogICAgJ1x1ZjdhOCcKICAgICdcdWY3YTknCiAgICAnXHVmN2FhJwogICAgJ1x1ZjdhYicKICAgICdcdWY3YWMnCiAgICAnXHVmN2FkJwogICAgJ1x1ZjdhZScKICAgICdcdWY3YWYnCiAgICAnXHVmN2IwJwogICAgJ1x1ZjdiMScKICAgICdcdWY3YjInCiAgICAnXHVmN2IzJwogICAgJ1x1ZjdiNCcKICAgICdcdWY3YjUnCiAgICAnXHVmN2I2JwogICAgJ1x1ZjdiNycKICAgICdcdWY3YjgnCiAgICAnXHVmN2I5JwogICAgJ1x1ZjdiYScKICAgICdcdWY3YmInCiAgICAnXHVmN2JjJwogICAgJ1x1ZjdiZCcKICAgICdcdWY3YmUnCiAgICAnXHVmN2JmJwogICAgJ1x1ZjdjMCcKICAgICdcdWY3YzEnCiAgICAnXHVmN2MyJwogICAgJ1x1ZjdjMycKICAgICdcdWY3YzQnCiAgICAnXHVmN2M1JwogICAgJ1x1ZjdjNicKICAgICdcdWY3YzcnCiAgICAnXHVmN2M4JwogICAgJ1x1ZjdjOScKICAgICdcdWY3Y2EnCiAgICAnXHVmN2NiJwogICAgJ1x1ZjdjYycKICAgICdcdWY3Y2QnCiAgICAnXHVmN2NlJwogICAgJ1x1ZjdjZicKICAgICdcdWY3ZDAnCiAgICAnXHVmN2QxJwogICAgJ1x1ZjdkMicKICAgICdcdWY3ZDMnCiAgICAnXHVmN2Q0JwogICAgJ1x1ZjdkNScKICAgICdcdWY3ZDYnCiAgICAnXHVmN2Q3JwogICAgJ1x1ZjdkOCcKICAgICdcdWY3ZDknCiAgICAnXHVmN2RhJwogICAgJ1x1ZjdkYicKICAgICdcdWY3ZGMnCiAgICAnXHVmN2RkJwogICAgJ1x1ZjdkZScKICAgICdcdWY3ZGYnCiAgICAnXHVmN2UwJwogICAgJ1x1ZjdlMScKICAgICdcdWY3ZTInCiAgICAnXHVmN2UzJwogICAgJ1x1ZjdlNCcKICAgICdcdWY3ZTUnCiAgICAnXHVmN2U2JwogICAgJ1x1ZjdlNycKICAgICdcdWY3ZTgnCiAgICAnXHVmN2U5JwogICAgJ1x1ZjdlYScKICAgICdcdWY3ZWInCiAgICAnXHVmN2VjJwogICAgJ1x1ZjdlZCcKICAgICdcdWY3ZWUnCiAgICAnXHVmN2VmJwogICAgJ1x1ZjdmMCcKICAgICdcdWY3ZjEnCiAgICAnXHVmN2YyJwogICAgJ1x1ZjdmMycKICAgICdcdWY3ZjQnCiAgICAnXHVmN2Y1JwogICAgJ1x1ZjdmNicKICAgICdcdWY3ZjcnCiAgICAnXHVmN2Y4JwogICAgJ1x1ZjdmOScKICAgICdcdWY3ZmEnCiAgICAnXHVmN2ZiJwogICAgJ1x1ZjdmYycKICAgICdcdWY3ZmQnCiAgICAnXHVmN2ZlJwogICAgJ1x1ZjdmZicKKQoKIyMjIEVuY29kaW5nIHRhYmxlCmVuY29kaW5nX3RhYmxlID0gY29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpClBLAwQUAAAAAAAAACEAghiL9YYuAACGLgAALwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2Jhc2Vjb21tYW5kLnB5IiIiQmFzZSBDb21tYW5kIGNsYXNzLCBhbmQgcmVsYXRlZCByb3V0aW5lcyIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IG9wdHBhcnNlCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBwaXAgaW1wb3J0IGNtZG9wdGlvbnMKZnJvbSBwaXAuaW5kZXggaW1wb3J0IFBhY2thZ2VGaW5kZXIKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IFBpcFNlc3Npb24KZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKEJhZENvbW1hbmQsIEluc3RhbGxhdGlvbkVycm9yLCBVbmluc3RhbGxhdGlvbkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEVycm9yLCBQcmV2aW91c0J1aWxkRGlyRXJyb3IpCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGxvZ2dpbmdfZGljdENvbmZpZwpmcm9tIHBpcC5iYXNlcGFyc2VyIGltcG9ydCBDb25maWdPcHRpb25QYXJzZXIsIFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyCmZyb20gcGlwLnJlcSBpbXBvcnQgSW5zdGFsbFJlcXVpcmVtZW50LCBwYXJzZV9yZXF1aXJlbWVudHMKZnJvbSBwaXAuc3RhdHVzX2NvZGVzIGltcG9ydCAoCiAgICBTVUNDRVNTLCBFUlJPUiwgVU5LTk9XTl9FUlJPUiwgVklSVFVBTEVOVl9OT1RfRk9VTkQsCiAgICBQUkVWSU9VU19CVUlMRF9ESVJfRVJST1IsCikKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGRlcHJlY2F0aW9uLCBnZXRfcHJvZywgbm9ybWFsaXplX3BhdGgKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgSW5kZW50aW5nRm9ybWF0dGVyCmZyb20gcGlwLnV0aWxzLm91dGRhdGVkIGltcG9ydCBwaXBfdmVyc2lvbl9jaGVjawoKCl9fYWxsX18gPSBbJ0NvbW1hbmQnXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIENvbW1hbmQob2JqZWN0KToKICAgIG5hbWUgPSBOb25lCiAgICB1c2FnZSA9IE5vbmUKICAgIGhpZGRlbiA9IEZhbHNlCiAgICBsb2dfc3RyZWFtcyA9ICgiZXh0Oi8vc3lzLnN0ZG91dCIsICJleHQ6Ly9zeXMuc3RkZXJyIikKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaXNvbGF0ZWQ9RmFsc2UpOgogICAgICAgIHBhcnNlcl9rdyA9IHsKICAgICAgICAgICAgJ3VzYWdlJzogc2VsZi51c2FnZSwKICAgICAgICAgICAgJ3Byb2cnOiAnJXMgJXMnICUgKGdldF9wcm9nKCksIHNlbGYubmFtZSksCiAgICAgICAgICAgICdmb3JtYXR0ZXInOiBVcGRhdGluZ0RlZmF1bHRzSGVscEZvcm1hdHRlcigpLAogICAgICAgICAgICAnYWRkX2hlbHBfb3B0aW9uJzogRmFsc2UsCiAgICAgICAgICAgICduYW1lJzogc2VsZi5uYW1lLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nOiBzZWxmLl9fZG9jX18sCiAgICAgICAgICAgICdpc29sYXRlZCc6IGlzb2xhdGVkLAogICAgICAgIH0KCiAgICAgICAgc2VsZi5wYXJzZXIgPSBDb25maWdPcHRpb25QYXJzZXIoKipwYXJzZXJfa3cpCgogICAgICAgICMgQ29tbWFuZHMgc2hvdWxkIGFkZCBvcHRpb25zIHRvIHRoaXMgb3B0aW9uIGdyb3VwCiAgICAgICAgb3B0Z3JvdXBfbmFtZSA9ICclcyBPcHRpb25zJyAlIHNlbGYubmFtZS5jYXBpdGFsaXplKCkKICAgICAgICBzZWxmLmNtZF9vcHRzID0gb3B0cGFyc2UuT3B0aW9uR3JvdXAoc2VsZi5wYXJzZXIsIG9wdGdyb3VwX25hbWUpCgogICAgICAgICMgQWRkIHRoZSBnZW5lcmFsIG9wdGlvbnMKICAgICAgICBnZW5fb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoCiAgICAgICAgICAgIGNtZG9wdGlvbnMuZ2VuZXJhbF9ncm91cCwKICAgICAgICAgICAgc2VsZi5wYXJzZXIsCiAgICAgICAgKQogICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoZ2VuX29wdHMpCgogICAgZGVmIF9idWlsZF9zZXNzaW9uKHNlbGYsIG9wdGlvbnMsIHJldHJpZXM9Tm9uZSwgdGltZW91dD1Ob25lKToKICAgICAgICBzZXNzaW9uID0gUGlwU2Vzc2lvbigKICAgICAgICAgICAgY2FjaGU9KAogICAgICAgICAgICAgICAgbm9ybWFsaXplX3BhdGgob3MucGF0aC5qb2luKG9wdGlvbnMuY2FjaGVfZGlyLCAiaHR0cCIpKQogICAgICAgICAgICAgICAgaWYgb3B0aW9ucy5jYWNoZV9kaXIgZWxzZSBOb25lCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcyBpZiByZXRyaWVzIGlzIG5vdCBOb25lIGVsc2Ugb3B0aW9ucy5yZXRyaWVzLAogICAgICAgICAgICBpbnNlY3VyZV9ob3N0cz1vcHRpb25zLnRydXN0ZWRfaG9zdHMsCiAgICAgICAgKQoKICAgICAgICAjIEhhbmRsZSBjdXN0b20gY2EtYnVuZGxlcyBmcm9tIHRoZSB1c2VyCiAgICAgICAgaWYgb3B0aW9ucy5jZXJ0OgogICAgICAgICAgICBzZXNzaW9uLnZlcmlmeSA9IG9wdGlvbnMuY2VydAoKICAgICAgICAjIEhhbmRsZSBTU0wgY2xpZW50IGNlcnRpZmljYXRlCiAgICAgICAgaWYgb3B0aW9ucy5jbGllbnRfY2VydDoKICAgICAgICAgICAgc2Vzc2lvbi5jZXJ0ID0gb3B0aW9ucy5jbGllbnRfY2VydAoKICAgICAgICAjIEhhbmRsZSB0aW1lb3V0cwogICAgICAgIGlmIG9wdGlvbnMudGltZW91dCBvciB0aW1lb3V0OgogICAgICAgICAgICBzZXNzaW9uLnRpbWVvdXQgPSAoCiAgICAgICAgICAgICAgICB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBvcHRpb25zLnRpbWVvdXQKICAgICAgICAgICAgKQoKICAgICAgICAjIEhhbmRsZSBjb25maWd1cmVkIHByb3hpZXMKICAgICAgICBpZiBvcHRpb25zLnByb3h5OgogICAgICAgICAgICBzZXNzaW9uLnByb3hpZXMgPSB7CiAgICAgICAgICAgICAgICAiaHR0cCI6IG9wdGlvbnMucHJveHksCiAgICAgICAgICAgICAgICAiaHR0cHMiOiBvcHRpb25zLnByb3h5LAogICAgICAgICAgICB9CgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIGNhbiBwcm9tcHQgdGhlIHVzZXIgZm9yIGF1dGhlbnRpY2F0aW9uIG9yIG5vdAogICAgICAgIHNlc3Npb24uYXV0aC5wcm9tcHRpbmcgPSBub3Qgb3B0aW9ucy5ub19pbnB1dAoKICAgICAgICByZXR1cm4gc2Vzc2lvbgoKICAgIGRlZiBwYXJzZV9hcmdzKHNlbGYsIGFyZ3MpOgogICAgICAgICMgZmFjdG9yZWQgb3V0IGZvciB0ZXN0YWJpbGl0eQogICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCgogICAgZGVmIG1haW4oc2VsZiwgYXJncyk6CiAgICAgICAgb3B0aW9ucywgYXJncyA9IHNlbGYucGFyc2VfYXJncyhhcmdzKQoKICAgICAgICBpZiBvcHRpb25zLnF1aWV0OgogICAgICAgICAgICBpZiBvcHRpb25zLnF1aWV0ID09IDE6CiAgICAgICAgICAgICAgICBsZXZlbCA9ICJXQVJOSU5HIgogICAgICAgICAgICBpZiBvcHRpb25zLnF1aWV0ID09IDI6CiAgICAgICAgICAgICAgICBsZXZlbCA9ICJFUlJPUiIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxldmVsID0gIkNSSVRJQ0FMIgogICAgICAgIGVsaWYgb3B0aW9ucy52ZXJib3NlOgogICAgICAgICAgICBsZXZlbCA9ICJERUJVRyIKICAgICAgICBlbHNlOgogICAgICAgICAgICBsZXZlbCA9ICJJTkZPIgoKICAgICAgICAjIFRoZSByb290IGxvZ2dlciBzaG91bGQgbWF0Y2ggdGhlICJjb25zb2xlIiBsZXZlbCAqdW5sZXNzKiB3ZQogICAgICAgICMgc3BlY2lmaWVkICItLWxvZyIgdG8gc2VuZCBkZWJ1ZyBsb2dzIHRvIGEgZmlsZS4KICAgICAgICByb290X2xldmVsID0gbGV2ZWwKICAgICAgICBpZiBvcHRpb25zLmxvZzoKICAgICAgICAgICAgcm9vdF9sZXZlbCA9ICJERUJVRyIKCiAgICAgICAgbG9nZ2luZ19kaWN0Q29uZmlnKHsKICAgICAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICAgICAiZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzIjogRmFsc2UsCiAgICAgICAgICAgICJmaWx0ZXJzIjogewogICAgICAgICAgICAgICAgImV4Y2x1ZGVfd2FybmluZ3MiOiB7CiAgICAgICAgICAgICAgICAgICAgIigpIjogInBpcC51dGlscy5sb2dnaW5nLk1heExldmVsRmlsdGVyIiwKICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiBsb2dnaW5nLldBUk5JTkcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAiZm9ybWF0dGVycyI6IHsKICAgICAgICAgICAgICAgICJpbmRlbnQiOiB7CiAgICAgICAgICAgICAgICAgICAgIigpIjogSW5kZW50aW5nRm9ybWF0dGVyLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAiJShtZXNzYWdlKXMiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImhhbmRsZXJzIjogewogICAgICAgICAgICAgICAgImNvbnNvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImxldmVsIjogbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgImNsYXNzIjogInBpcC51dGlscy5sb2dnaW5nLkNvbG9yaXplZFN0cmVhbUhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICJzdHJlYW0iOiBzZWxmLmxvZ19zdHJlYW1zWzBdLAogICAgICAgICAgICAgICAgICAgICJmaWx0ZXJzIjogWyJleGNsdWRlX3dhcm5pbmdzIl0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdHRlciI6ICJpbmRlbnQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjb25zb2xlX2Vycm9ycyI6IHsKICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiAiV0FSTklORyIsCiAgICAgICAgICAgICAgICAgICAgImNsYXNzIjogInBpcC51dGlscy5sb2dnaW5nLkNvbG9yaXplZFN0cmVhbUhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICJzdHJlYW0iOiBzZWxmLmxvZ19zdHJlYW1zWzFdLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXR0ZXIiOiAiaW5kZW50IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXNlcl9sb2ciOiB7CiAgICAgICAgICAgICAgICAgICAgImxldmVsIjogIkRFQlVHIiwKICAgICAgICAgICAgICAgICAgICAiY2xhc3MiOiAicGlwLnV0aWxzLmxvZ2dpbmcuQmV0dGVyUm90YXRpbmdGaWxlSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgImZpbGVuYW1lIjogb3B0aW9ucy5sb2cgb3IgIi9kZXYvbnVsbCIsCiAgICAgICAgICAgICAgICAgICAgImRlbGF5IjogVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0dGVyIjogImluZGVudCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAicm9vdCI6IHsKICAgICAgICAgICAgICAgICJsZXZlbCI6IHJvb3RfbGV2ZWwsCiAgICAgICAgICAgICAgICAiaGFuZGxlcnMiOiBsaXN0KGZpbHRlcihOb25lLCBbCiAgICAgICAgICAgICAgICAgICAgImNvbnNvbGUiLAogICAgICAgICAgICAgICAgICAgICJjb25zb2xlX2Vycm9ycyIsCiAgICAgICAgICAgICAgICAgICAgInVzZXJfbG9nIiBpZiBvcHRpb25zLmxvZyBlbHNlIE5vbmUsCiAgICAgICAgICAgICAgICBdKSksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICMgRGlzYWJsZSBhbnkgbG9nZ2luZyBiZXNpZGVzIFdBUk5JTkcgdW5sZXNzIHdlIGhhdmUgREVCVUcgbGV2ZWwKICAgICAgICAgICAgIyBsb2dnaW5nIGVuYWJsZWQuIFRoZXNlIHVzZSBib3RoIHBpcC5fdmVuZG9yIGFuZCB0aGUgYmFyZSBuYW1lcwogICAgICAgICAgICAjIGZvciB0aGUgY2FzZSB3aGVyZSBzb21lb25lIHVuYnVuZGxlcyBvdXIgbGlicmFyaWVzLgogICAgICAgICAgICAibG9nZ2VycyI6IGRpY3QoCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsZXZlbCI6ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV2ZWwgaW4gWyJJTkZPIiwgIkVSUk9SIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIkRFQlVHIgogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBbInBpcC5fdmVuZG9yIiwgImRpc3RsaWIiLCAicmVxdWVzdHMiLCAidXJsbGliMyJdCiAgICAgICAgICAgICksCiAgICAgICAgfSkKCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDIsIDYpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlB5dGhvbiAyLjYgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSB0aGUgUHl0aG9uIGNvcmUgdGVhbSwgIgogICAgICAgICAgICAgICAgInBsZWFzZSB1cGdyYWRlIHlvdXIgUHl0aG9uLiBBIGZ1dHVyZSB2ZXJzaW9uIG9mIHBpcCB3aWxsICIKICAgICAgICAgICAgICAgICJkcm9wIHN1cHBvcnQgZm9yIFB5dGhvbiAyLjYiLAogICAgICAgICAgICAgICAgZGVwcmVjYXRpb24uUHl0aG9uMjZEZXByZWNhdGlvbldhcm5pbmcKICAgICAgICAgICAgKQoKICAgICAgICAjIFRPRE86IHRyeSB0byBnZXQgdGhlc2UgcGFzc2luZyBkb3duIGZyb20gdGhlIGNvbW1hbmQ/CiAgICAgICAgIyAgICAgIHdpdGhvdXQgcmVzb3J0aW5nIHRvIG9zLmVudmlyb24gdG8gaG9sZCB0aGVzZS4KCiAgICAgICAgaWYgb3B0aW9ucy5ub19pbnB1dDoKICAgICAgICAgICAgb3MuZW52aXJvblsnUElQX05PX0lOUFVUJ10gPSAnMScKCiAgICAgICAgaWYgb3B0aW9ucy5leGlzdHNfYWN0aW9uOgogICAgICAgICAgICBvcy5lbnZpcm9uWydQSVBfRVhJU1RTX0FDVElPTiddID0gJyAnLmpvaW4ob3B0aW9ucy5leGlzdHNfYWN0aW9uKQoKICAgICAgICBpZiBvcHRpb25zLnJlcXVpcmVfdmVudjoKICAgICAgICAgICAgIyBJZiBhIHZlbnYgaXMgcmVxdWlyZWQgY2hlY2sgaWYgaXQgY2FuIHJlYWxseSBiZSBmb3VuZAogICAgICAgICAgICBpZiBub3QgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIGFuIGFjdGl2YXRlZCB2aXJ0dWFsZW52IChyZXF1aXJlZCkuJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc3lzLmV4aXQoVklSVFVBTEVOVl9OT1RfRk9VTkQpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5ydW4ob3B0aW9ucywgYXJncykKICAgICAgICAgICAgIyBGSVhNRTogYWxsIGNvbW1hbmRzIHNob3VsZCByZXR1cm4gYW4gZXhpdCBzdGF0dXMKICAgICAgICAgICAgIyBhbmQgd2hlbiBpdCBpcyBkb25lLCBpc2luc3RhbmNlIGlzIG5vdCBuZWVkZWQgYW55bW9yZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0YXR1cywgaW50KToKICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMKICAgICAgICBleGNlcHQgUHJldmlvdXNCdWlsZERpckVycm9yIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKHN0cihleGMpKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbmZvcm1hdGlvbjonLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICAgICAgcmV0dXJuIFBSRVZJT1VTX0JVSUxEX0RJUl9FUlJPUgogICAgICAgIGV4Y2VwdCAoSW5zdGFsbGF0aW9uRXJyb3IsIFVuaW5zdGFsbGF0aW9uRXJyb3IsIEJhZENvbW1hbmQpIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKHN0cihleGMpKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbmZvcm1hdGlvbjonLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCiAgICAgICAgZXhjZXB0IENvbW1hbmRFcnJvciBhcyBleGM6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgnRVJST1I6ICVzJywgZXhjKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbmZvcm1hdGlvbjonLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCiAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoJ09wZXJhdGlvbiBjYW5jZWxsZWQgYnkgdXNlcicpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluZm9ybWF0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gRVJST1IKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgnRXhjZXB0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UncmUgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHBpcCBhdmFpbGFibGUKICAgICAgICAgICAgaWYgKG5vdCBvcHRpb25zLmRpc2FibGVfcGlwX3ZlcnNpb25fY2hlY2sgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgIGdldGF0dHIob3B0aW9ucywgIm5vX2luZGV4IiwgRmFsc2UpKToKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllcz0wLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PW1pbig1LCBvcHRpb25zLnRpbWVvdXQpKSBhcyBzZXNzaW9uOgogICAgICAgICAgICAgICAgICAgIHBpcF92ZXJzaW9uX2NoZWNrKHNlc3Npb24pCgogICAgICAgIHJldHVybiBTVUNDRVNTCgoKY2xhc3MgUmVxdWlyZW1lbnRDb21tYW5kKENvbW1hbmQpOgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBwb3B1bGF0ZV9yZXF1aXJlbWVudF9zZXQocmVxdWlyZW1lbnRfc2V0LCBhcmdzLCBvcHRpb25zLCBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sIG5hbWUsIHdoZWVsX2NhY2hlKToKICAgICAgICAiIiIKICAgICAgICBNYXJzaGFsIGNtZCBsaW5lIGFyZ3MgaW50byBhIHJlcXVpcmVtZW50IHNldC4KICAgICAgICAiIiIKICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3B0aW9ucy5jb25zdHJhaW50czoKICAgICAgICAgICAgZm9yIHJlcSBpbiBwYXJzZV9yZXF1aXJlbWVudHMoCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludD1UcnVlLCBmaW5kZXI9ZmluZGVyLCBvcHRpb25zPW9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLCB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSk6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KHJlcSkKCiAgICAgICAgZm9yIHJlcSBpbiBhcmdzOgogICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fbGluZSgKICAgICAgICAgICAgICAgICAgICByZXEsIE5vbmUsIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgIGZvciByZXEgaW4gb3B0aW9ucy5lZGl0YWJsZXM6CiAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9lZGl0YWJsZSgKICAgICAgICAgICAgICAgICAgICByZXEsCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF92Y3M9b3B0aW9ucy5kZWZhdWx0X3ZjcywKICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICBmb3VuZF9yZXFfaW5fZmlsZSA9IEZhbHNlCiAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9wdGlvbnMucmVxdWlyZW1lbnRzOgogICAgICAgICAgICBmb3IgcmVxIGluIHBhcnNlX3JlcXVpcmVtZW50cygKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBmaW5kZXI9ZmluZGVyLCBvcHRpb25zPW9wdGlvbnMsIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSk6CiAgICAgICAgICAgICAgICBmb3VuZF9yZXFfaW5fZmlsZSA9IFRydWUKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQocmVxKQogICAgICAgICMgSWYgLS1yZXF1aXJlLWhhc2hlcyB3YXMgYSBsaW5lIGluIGEgcmVxdWlyZW1lbnRzIGZpbGUsIHRlbGwKICAgICAgICAjIFJlcXVpcmVtZW50U2V0IGFib3V0IGl0OgogICAgICAgIHJlcXVpcmVtZW50X3NldC5yZXF1aXJlX2hhc2hlcyA9IG9wdGlvbnMucmVxdWlyZV9oYXNoZXMKCiAgICAgICAgaWYgbm90IChhcmdzIG9yIG9wdGlvbnMuZWRpdGFibGVzIG9yIGZvdW5kX3JlcV9pbl9maWxlKToKICAgICAgICAgICAgb3B0cyA9IHsnbmFtZSc6IG5hbWV9CiAgICAgICAgICAgIGlmIG9wdGlvbnMuZmluZF9saW5rczoKICAgICAgICAgICAgICAgIG1zZyA9ICgnWW91IG11c3QgZ2l2ZSBhdCBsZWFzdCBvbmUgcmVxdWlyZW1lbnQgdG8gJwogICAgICAgICAgICAgICAgICAgICAgICclKG5hbWUpcyAobWF5YmUgeW91IG1lYW50ICJwaXAgJShuYW1lKXMgJwogICAgICAgICAgICAgICAgICAgICAgICclKGxpbmtzKXMiPyknICUKICAgICAgICAgICAgICAgICAgICAgICBkaWN0KG9wdHMsIGxpbmtzPScgJy5qb2luKG9wdGlvbnMuZmluZF9saW5rcykpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbXNnID0gKCdZb3UgbXVzdCBnaXZlIGF0IGxlYXN0IG9uZSByZXF1aXJlbWVudCAnCiAgICAgICAgICAgICAgICAgICAgICAgJ3RvICUobmFtZSlzIChzZWUgInBpcCBoZWxwICUobmFtZSlzIiknICUgb3B0cykKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobXNnKQoKICAgIGRlZiBfYnVpbGRfcGFja2FnZV9maW5kZXIoc2VsZiwgb3B0aW9ucywgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm09Tm9uZSwgcHl0aG9uX3ZlcnNpb25zPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiaT1Ob25lLCBpbXBsZW1lbnRhdGlvbj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBDcmVhdGUgYSBwYWNrYWdlIGZpbmRlciBhcHByb3ByaWF0ZSB0byB0aGlzIHJlcXVpcmVtZW50IGNvbW1hbmQuCiAgICAgICAgIiIiCiAgICAgICAgaW5kZXhfdXJscyA9IFtvcHRpb25zLmluZGV4X3VybF0gKyBvcHRpb25zLmV4dHJhX2luZGV4X3VybHMKICAgICAgICBpZiBvcHRpb25zLm5vX2luZGV4OgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0lnbm9yaW5nIGluZGV4ZXM6ICVzJywgJywnLmpvaW4oaW5kZXhfdXJscykpCiAgICAgICAgICAgIGluZGV4X3VybHMgPSBbXQoKICAgICAgICByZXR1cm4gUGFja2FnZUZpbmRlcigKICAgICAgICAgICAgZmluZF9saW5rcz1vcHRpb25zLmZpbmRfbGlua3MsCiAgICAgICAgICAgIGZvcm1hdF9jb250cm9sPW9wdGlvbnMuZm9ybWF0X2NvbnRyb2wsCiAgICAgICAgICAgIGluZGV4X3VybHM9aW5kZXhfdXJscywKICAgICAgICAgICAgdHJ1c3RlZF9ob3N0cz1vcHRpb25zLnRydXN0ZWRfaG9zdHMsCiAgICAgICAgICAgIGFsbG93X2FsbF9wcmVyZWxlYXNlcz1vcHRpb25zLnByZSwKICAgICAgICAgICAgcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzPW9wdGlvbnMucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzLAogICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgIHBsYXRmb3JtPXBsYXRmb3JtLAogICAgICAgICAgICB2ZXJzaW9ucz1weXRob25fdmVyc2lvbnMsCiAgICAgICAgICAgIGFiaT1hYmksCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uPWltcGxlbWVudGF0aW9uLAogICAgICAgICkKUEsDBBQAAAAAAAAAIQCrq/474SgAAOEoAAAuAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvYmFzZXBhcnNlci5weSIiIkJhc2Ugb3B0aW9uIHBhcnNlciBzZXR1cCIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwppbXBvcnQgb3B0cGFyc2UKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgdGV4dHdyYXAKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3RydG9ib29sCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgc3RyaW5nX3R5cGVzCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCAoCiAgICBsZWdhY3lfY29uZmlnX2ZpbGUsIGNvbmZpZ19iYXNlbmFtZSwgcnVubmluZ191bmRlcl92aXJ0dWFsZW52LAogICAgc2l0ZV9jb25maWdfZmlsZXMKKQpmcm9tIHBpcC51dGlscyBpbXBvcnQgYXBwZGlycywgZ2V0X3Rlcm1pbmFsX3NpemUKCgpfZW52aXJvbl9wcmVmaXhfcmUgPSByZS5jb21waWxlKHIiXlBJUF8iLCByZS5JKQoKCmNsYXNzIFByZXR0eUhlbHBGb3JtYXR0ZXIob3B0cGFyc2UuSW5kZW50ZWRIZWxwRm9ybWF0dGVyKToKICAgICIiIkEgcHJldHRpZXIvbGVzcyB2ZXJib3NlIGhlbHAgZm9ybWF0dGVyIGZvciBvcHRwYXJzZS4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIGhlbHAgcG9zaXRpb24gbXVzdCBiZSBhbGlnbmVkIHdpdGggX19pbml0X18ucGFyc2VvcHRzLmRlc2NyaXB0aW9uCiAgICAgICAga3dhcmdzWydtYXhfaGVscF9wb3NpdGlvbiddID0gMzAKICAgICAgICBrd2FyZ3NbJ2luZGVudF9pbmNyZW1lbnQnXSA9IDEKICAgICAgICBrd2FyZ3NbJ3dpZHRoJ10gPSBnZXRfdGVybWluYWxfc2l6ZSgpWzBdIC0gMgogICAgICAgIG9wdHBhcnNlLkluZGVudGVkSGVscEZvcm1hdHRlci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIGZvcm1hdF9vcHRpb25fc3RyaW5ncyhzZWxmLCBvcHRpb24pOgogICAgICAgIHJldHVybiBzZWxmLl9mb3JtYXRfb3B0aW9uX3N0cmluZ3Mob3B0aW9uLCAnIDwlcz4nLCAnLCAnKQoKICAgIGRlZiBfZm9ybWF0X29wdGlvbl9zdHJpbmdzKHNlbGYsIG9wdGlvbiwgbXZhcmZtdD0nIDwlcz4nLCBvcHRzZXA9JywgJyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygb3B0aW9uIHN0cmluZ3MgYW5kIG1ldGF2YXJzLgoKICAgICAgICA6cGFyYW0gb3B0aW9uOiAgdHVwbGUgb2YgKHNob3J0IG9wdCwgbG9uZyBvcHQpLCBlLmc6ICgnLWYnLCAnLS1mb3JtYXQnKQogICAgICAgIDpwYXJhbSBtdmFyZm10OiBtZXRhdmFyIGZvcm1hdCBzdHJpbmcgLSBldmFsdWF0ZWQgYXMgbXZhcmZtdCAlIG1ldGF2YXIKICAgICAgICA6cGFyYW0gb3B0c2VwOiAgc2VwYXJhdG9yCiAgICAgICAgIiIiCiAgICAgICAgb3B0cyA9IFtdCgogICAgICAgIGlmIG9wdGlvbi5fc2hvcnRfb3B0czoKICAgICAgICAgICAgb3B0cy5hcHBlbmQob3B0aW9uLl9zaG9ydF9vcHRzWzBdKQogICAgICAgIGlmIG9wdGlvbi5fbG9uZ19vcHRzOgogICAgICAgICAgICBvcHRzLmFwcGVuZChvcHRpb24uX2xvbmdfb3B0c1swXSkKICAgICAgICBpZiBsZW4ob3B0cykgPiAxOgogICAgICAgICAgICBvcHRzLmluc2VydCgxLCBvcHRzZXApCgogICAgICAgIGlmIG9wdGlvbi50YWtlc192YWx1ZSgpOgogICAgICAgICAgICBtZXRhdmFyID0gb3B0aW9uLm1ldGF2YXIgb3Igb3B0aW9uLmRlc3QubG93ZXIoKQogICAgICAgICAgICBvcHRzLmFwcGVuZChtdmFyZm10ICUgbWV0YXZhci5sb3dlcigpKQoKICAgICAgICByZXR1cm4gJycuam9pbihvcHRzKQoKICAgIGRlZiBmb3JtYXRfaGVhZGluZyhzZWxmLCBoZWFkaW5nKToKICAgICAgICBpZiBoZWFkaW5nID09ICdPcHRpb25zJzoKICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgcmV0dXJuIGhlYWRpbmcgKyAnOlxuJwoKICAgIGRlZiBmb3JtYXRfdXNhZ2Uoc2VsZiwgdXNhZ2UpOgogICAgICAgICIiIgogICAgICAgIEVuc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSBuZXdsaW5lIGJldHdlZW4gdXNhZ2UgYW5kIHRoZSBmaXJzdCBoZWFkaW5nCiAgICAgICAgaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRpb24uCiAgICAgICAgIiIiCiAgICAgICAgbXNnID0gJ1xuVXNhZ2U6ICVzXG4nICUgc2VsZi5pbmRlbnRfbGluZXModGV4dHdyYXAuZGVkZW50KHVzYWdlKSwgIiAgIikKICAgICAgICByZXR1cm4gbXNnCgogICAgZGVmIGZvcm1hdF9kZXNjcmlwdGlvbihzZWxmLCBkZXNjcmlwdGlvbik6CiAgICAgICAgIyBsZWF2ZSBmdWxsIGNvbnRyb2wgb3ZlciBkZXNjcmlwdGlvbiB0byB1cwogICAgICAgIGlmIGRlc2NyaXB0aW9uOgogICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYucGFyc2VyLCAnbWFpbicpOgogICAgICAgICAgICAgICAgbGFiZWwgPSAnQ29tbWFuZHMnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsYWJlbCA9ICdEZXNjcmlwdGlvbicKICAgICAgICAgICAgIyBzb21lIGRvYyBzdHJpbmdzIGhhdmUgaW5pdGlhbCBuZXdsaW5lcywgc29tZSBkb24ndAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLmxzdHJpcCgnXG4nKQogICAgICAgICAgICAjIHNvbWUgZG9jIHN0cmluZ3MgaGF2ZSBmaW5hbCBuZXdsaW5lcyBhbmQgc3BhY2VzLCBzb21lIGRvbid0CiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucnN0cmlwKCkKICAgICAgICAgICAgIyBkZWRlbnQsIHRoZW4gcmVpbmRlbnQKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBzZWxmLmluZGVudF9saW5lcyh0ZXh0d3JhcC5kZWRlbnQoZGVzY3JpcHRpb24pLCAiICAiKQogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICclczpcbiVzXG4nICUgKGxhYmVsLCBkZXNjcmlwdGlvbikKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIGZvcm1hdF9lcGlsb2coc2VsZiwgZXBpbG9nKToKICAgICAgICAjIGxlYXZlIGZ1bGwgY29udHJvbCBvdmVyIGVwaWxvZyB0byB1cwogICAgICAgIGlmIGVwaWxvZzoKICAgICAgICAgICAgcmV0dXJuIGVwaWxvZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgIGRlZiBpbmRlbnRfbGluZXMoc2VsZiwgdGV4dCwgaW5kZW50KToKICAgICAgICBuZXdfbGluZXMgPSBbaW5kZW50ICsgbGluZSBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KCdcbicpXQogICAgICAgIHJldHVybiAiXG4iLmpvaW4obmV3X2xpbmVzKQoKCmNsYXNzIFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyKFByZXR0eUhlbHBGb3JtYXR0ZXIpOgogICAgIiIiQ3VzdG9tIGhlbHAgZm9ybWF0dGVyIGZvciB1c2UgaW4gQ29uZmlnT3B0aW9uUGFyc2VyLgoKICAgIFRoaXMgaXMgdXBkYXRlcyB0aGUgZGVmYXVsdHMgYmVmb3JlIGV4cGFuZGluZyB0aGVtLCBhbGxvd2luZwogICAgdGhlbSB0byBzaG93IHVwIGNvcnJlY3RseSBpbiB0aGUgaGVscCBsaXN0aW5nLgogICAgIiIiCgogICAgZGVmIGV4cGFuZF9kZWZhdWx0KHNlbGYsIG9wdGlvbik6CiAgICAgICAgaWYgc2VsZi5wYXJzZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLl91cGRhdGVfZGVmYXVsdHMoc2VsZi5wYXJzZXIuZGVmYXVsdHMpCiAgICAgICAgcmV0dXJuIG9wdHBhcnNlLkluZGVudGVkSGVscEZvcm1hdHRlci5leHBhbmRfZGVmYXVsdChzZWxmLCBvcHRpb24pCgoKY2xhc3MgQ3VzdG9tT3B0aW9uUGFyc2VyKG9wdHBhcnNlLk9wdGlvblBhcnNlcik6CgogICAgZGVmIGluc2VydF9vcHRpb25fZ3JvdXAoc2VsZiwgaWR4LCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIkluc2VydCBhbiBPcHRpb25Hcm91cCBhdCBhIGdpdmVuIHBvc2l0aW9uLiIiIgogICAgICAgIGdyb3VwID0gc2VsZi5hZGRfb3B0aW9uX2dyb3VwKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgc2VsZi5vcHRpb25fZ3JvdXBzLnBvcCgpCiAgICAgICAgc2VsZi5vcHRpb25fZ3JvdXBzLmluc2VydChpZHgsIGdyb3VwKQoKICAgICAgICByZXR1cm4gZ3JvdXAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcHRpb25fbGlzdF9hbGwoc2VsZik6CiAgICAgICAgIiIiR2V0IGEgbGlzdCBvZiBhbGwgb3B0aW9ucywgaW5jbHVkaW5nIHRob3NlIGluIG9wdGlvbiBncm91cHMuIiIiCiAgICAgICAgcmVzID0gc2VsZi5vcHRpb25fbGlzdFs6XQogICAgICAgIGZvciBpIGluIHNlbGYub3B0aW9uX2dyb3VwczoKICAgICAgICAgICAgcmVzLmV4dGVuZChpLm9wdGlvbl9saXN0KQoKICAgICAgICByZXR1cm4gcmVzCgoKY2xhc3MgQ29uZmlnT3B0aW9uUGFyc2VyKEN1c3RvbU9wdGlvblBhcnNlcik6CiAgICAiIiJDdXN0b20gb3B0aW9uIHBhcnNlciB3aGljaCB1cGRhdGVzIGl0cyBkZWZhdWx0cyBieSBjaGVja2luZyB0aGUKICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIGVudmlyb25tZW50YWwgdmFyaWFibGVzIiIiCgogICAgaXNvbGF0ZWQgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCiAgICAgICAgc2VsZi5uYW1lID0ga3dhcmdzLnBvcCgnbmFtZScpCiAgICAgICAgc2VsZi5pc29sYXRlZCA9IGt3YXJncy5wb3AoImlzb2xhdGVkIiwgRmFsc2UpCiAgICAgICAgc2VsZi5maWxlcyA9IHNlbGYuZ2V0X2NvbmZpZ19maWxlcygpCiAgICAgICAgaWYgc2VsZi5maWxlczoKICAgICAgICAgICAgc2VsZi5jb25maWcucmVhZChzZWxmLmZpbGVzKQogICAgICAgIGFzc2VydCBzZWxmLm5hbWUKICAgICAgICBvcHRwYXJzZS5PcHRpb25QYXJzZXIuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBnZXRfY29uZmlnX2ZpbGVzKHNlbGYpOgogICAgICAgICMgdGhlIGZpbGVzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIHdpbGwgYmUgcGFyc2VkIGluIG9yZGVyIHdpdGggdGhlCiAgICAgICAgIyBmaXJzdCBmaWxlcyBsaXN0ZWQgYmVpbmcgb3ZlcnJpZGRlbiBieSBsYXRlciBmaWxlcyBpbiBzdGFuZGFyZAogICAgICAgICMgQ29uZmlnUGFyc2VyIGZhc2hpb24KICAgICAgICBjb25maWdfZmlsZSA9IG9zLmVudmlyb24uZ2V0KCdQSVBfQ09ORklHX0ZJTEUnLCBGYWxzZSkKICAgICAgICBpZiBjb25maWdfZmlsZSA9PSBvcy5kZXZudWxsOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgIyBhdCB0aGUgYmFzZSB3ZSBoYXZlIGFueSBzaXRlLXdpZGUgY29uZmlndXJhdGlvbgogICAgICAgIGZpbGVzID0gbGlzdChzaXRlX2NvbmZpZ19maWxlcykKCiAgICAgICAgIyBwZXItdXNlciBjb25maWd1cmF0aW9uIG5leHQKICAgICAgICBpZiBub3Qgc2VsZi5pc29sYXRlZDoKICAgICAgICAgICAgaWYgY29uZmlnX2ZpbGUgYW5kIG9zLnBhdGguZXhpc3RzKGNvbmZpZ19maWxlKToKICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZChjb25maWdfZmlsZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgbGVnYWN5IGNvbmZpZyBmaWxlLCB3ZSBjb25zaWRlciBpdCB0byBiZSBhIGxvd2VyCiAgICAgICAgICAgICAgICAjIHByaW9yaXR5IHRoYW4gdGhlIG5ldyBmaWxlIGxvY2F0aW9uLgogICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKGxlZ2FjeV9jb25maWdfZmlsZSkKCiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIG5ldyBjb25maWcgZmlsZSwgd2UgY29uc2lkZXIgaXQgdG8gYmUgYSBoaWdoZXIKICAgICAgICAgICAgICAgICMgcHJpb3JpdHkgdGhhbiB0aGUgbGVnYWN5IGZpbGUuCiAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICBhcHBkaXJzLnVzZXJfY29uZmlnX2RpcigicGlwIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19iYXNlbmFtZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgICAgICMgZmluYWxseSB2aXJ0dWFsZW52IGNvbmZpZ3VyYXRpb24gZmlyc3QgdHJ1bXBpbmcgb3RoZXJzCiAgICAgICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgICAgIHZlbnZfY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBzeXMucHJlZml4LAogICAgICAgICAgICAgICAgY29uZmlnX2Jhc2VuYW1lLAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHZlbnZfY29uZmlnX2ZpbGUpOgogICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKHZlbnZfY29uZmlnX2ZpbGUpCgogICAgICAgIHJldHVybiBmaWxlcwoKICAgIGRlZiBjaGVja19kZWZhdWx0KHNlbGYsIG9wdGlvbiwga2V5LCB2YWwpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5jaGVja192YWx1ZShrZXksIHZhbCkKICAgICAgICBleGNlcHQgb3B0cGFyc2UuT3B0aW9uVmFsdWVFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHByaW50KCJBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgY29uZmlndXJhdGlvbjogJXMiICUgZXhjKQogICAgICAgICAgICBzeXMuZXhpdCgzKQoKICAgIGRlZiBfdXBkYXRlX2RlZmF1bHRzKHNlbGYsIGRlZmF1bHRzKToKICAgICAgICAiIiJVcGRhdGVzIHRoZSBnaXZlbiBkZWZhdWx0cyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBjb25maWcgZmlsZXMgYW5kCiAgICAgICAgdGhlIGVudmlyb24uIERvZXMgYSBsaXR0bGUgc3BlY2lhbCBoYW5kbGluZyBmb3IgY2VydGFpbiB0eXBlcyBvZgogICAgICAgIG9wdGlvbnMgKGxpc3RzKS4iIiIKICAgICAgICAjIFRoZW4gZ28gYW5kIGxvb2sgZm9yIHRoZSBvdGhlciBzb3VyY2VzIG9mIGNvbmZpZ3VyYXRpb246CiAgICAgICAgY29uZmlnID0ge30KICAgICAgICAjIDEuIGNvbmZpZyBmaWxlcwogICAgICAgIGZvciBzZWN0aW9uIGluICgnZ2xvYmFsJywgc2VsZi5uYW1lKToKICAgICAgICAgICAgY29uZmlnLnVwZGF0ZSgKICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplX2tleXMoc2VsZi5nZXRfY29uZmlnX3NlY3Rpb24oc2VjdGlvbikpCiAgICAgICAgICAgICkKICAgICAgICAjIDIuIGVudmlyb25tZW50YWwgdmFyaWFibGVzCiAgICAgICAgaWYgbm90IHNlbGYuaXNvbGF0ZWQ6CiAgICAgICAgICAgIGNvbmZpZy51cGRhdGUoc2VsZi5ub3JtYWxpemVfa2V5cyhzZWxmLmdldF9lbnZpcm9uX3ZhcnMoKSkpCiAgICAgICAgIyBBY2N1bXVsYXRlIGNvbXBsZXggZGVmYXVsdCBzdGF0ZS4KICAgICAgICBzZWxmLnZhbHVlcyA9IG9wdHBhcnNlLlZhbHVlcyhzZWxmLmRlZmF1bHRzKQogICAgICAgIGxhdGVfZXZhbCA9IHNldCgpCiAgICAgICAgIyBUaGVuIHNldCB0aGUgb3B0aW9ucyB3aXRoIHRob3NlIHZhbHVlcwogICAgICAgIGZvciBrZXksIHZhbCBpbiBjb25maWcuaXRlbXMoKToKICAgICAgICAgICAgIyBpZ25vcmUgZW1wdHkgdmFsdWVzCiAgICAgICAgICAgIGlmIG5vdCB2YWw6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgb3B0aW9uID0gc2VsZi5nZXRfb3B0aW9uKGtleSkKICAgICAgICAgICAgIyBJZ25vcmUgb3B0aW9ucyBub3QgcHJlc2VudCBpbiB0aGlzIHBhcnNlci4gRS5nLiBub24tZ2xvYmFscyBwdXQKICAgICAgICAgICAgIyBpbiBbZ2xvYmFsXSBieSB1c2VycyB0aGF0IHdhbnQgdGhlbSB0byBhcHBseSB0byBhbGwgYXBwbGljYWJsZQogICAgICAgICAgICAjIGNvbW1hbmRzLgogICAgICAgICAgICBpZiBvcHRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBvcHRpb24uYWN0aW9uIGluICgnc3RvcmVfdHJ1ZScsICdzdG9yZV9mYWxzZScsICdjb3VudCcpOgogICAgICAgICAgICAgICAgdmFsID0gc3RydG9ib29sKHZhbCkKICAgICAgICAgICAgZWxpZiBvcHRpb24uYWN0aW9uID09ICdhcHBlbmQnOgogICAgICAgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KCkKICAgICAgICAgICAgICAgIHZhbCA9IFtzZWxmLmNoZWNrX2RlZmF1bHQob3B0aW9uLCBrZXksIHYpIGZvciB2IGluIHZhbF0KICAgICAgICAgICAgZWxpZiBvcHRpb24uYWN0aW9uID09ICdjYWxsYmFjayc6CiAgICAgICAgICAgICAgICBsYXRlX2V2YWwuYWRkKG9wdGlvbi5kZXN0KQogICAgICAgICAgICAgICAgb3B0X3N0ciA9IG9wdGlvbi5nZXRfb3B0X3N0cmluZygpCiAgICAgICAgICAgICAgICB2YWwgPSBvcHRpb24uY29udmVydF92YWx1ZShvcHRfc3RyLCB2YWwpCiAgICAgICAgICAgICAgICAjIEZyb20gdGFrZV9hY3Rpb24KICAgICAgICAgICAgICAgIGFyZ3MgPSBvcHRpb24uY2FsbGJhY2tfYXJncyBvciAoKQogICAgICAgICAgICAgICAga3dhcmdzID0gb3B0aW9uLmNhbGxiYWNrX2t3YXJncyBvciB7fQogICAgICAgICAgICAgICAgb3B0aW9uLmNhbGxiYWNrKG9wdGlvbiwgb3B0X3N0ciwgdmFsLCBzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmNoZWNrX2RlZmF1bHQob3B0aW9uLCBrZXksIHZhbCkKCiAgICAgICAgICAgIGRlZmF1bHRzW29wdGlvbi5kZXN0XSA9IHZhbAoKICAgICAgICBmb3Iga2V5IGluIGxhdGVfZXZhbDoKICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IGdldGF0dHIoc2VsZi52YWx1ZXMsIGtleSkKICAgICAgICBzZWxmLnZhbHVlcyA9IE5vbmUKICAgICAgICByZXR1cm4gZGVmYXVsdHMKCiAgICBkZWYgbm9ybWFsaXplX2tleXMoc2VsZiwgaXRlbXMpOgogICAgICAgICIiIlJldHVybiBhIGNvbmZpZyBkaWN0aW9uYXJ5IHdpdGggbm9ybWFsaXplZCBrZXlzIHJlZ2FyZGxlc3Mgb2YKICAgICAgICB3aGV0aGVyIHRoZSBrZXlzIHdlcmUgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBpbiBjb25maWcKICAgICAgICBmaWxlcyIiIgogICAgICAgIG5vcm1hbGl6ZWQgPSB7fQogICAgICAgIGZvciBrZXksIHZhbCBpbiBpdGVtczoKICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoJ18nLCAnLScpCiAgICAgICAgICAgIGlmIG5vdCBrZXkuc3RhcnRzd2l0aCgnLS0nKToKICAgICAgICAgICAgICAgIGtleSA9ICctLSVzJyAlIGtleSAgIyBvbmx5IHByZWZlciBsb25nIG9wdHMKICAgICAgICAgICAgbm9ybWFsaXplZFtrZXldID0gdmFsCiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQKCiAgICBkZWYgZ2V0X2NvbmZpZ19zZWN0aW9uKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkdldCBhIHNlY3Rpb24gb2YgYSBjb25maWd1cmF0aW9uIiIiCiAgICAgICAgaWYgc2VsZi5jb25maWcuaGFzX3NlY3Rpb24obmFtZSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbmZpZy5pdGVtcyhuYW1lKQogICAgICAgIHJldHVybiBbXQoKICAgIGRlZiBnZXRfZW52aXJvbl92YXJzKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgYSBnZW5lcmF0b3Igd2l0aCBhbGwgZW52aXJvbm1lbnRhbCB2YXJzIHdpdGggcHJlZml4IFBJUF8iIiIKICAgICAgICBmb3Iga2V5LCB2YWwgaW4gb3MuZW52aXJvbi5pdGVtcygpOgogICAgICAgICAgICBpZiBfZW52aXJvbl9wcmVmaXhfcmUuc2VhcmNoKGtleSk6CiAgICAgICAgICAgICAgICB5aWVsZCAoX2Vudmlyb25fcHJlZml4X3JlLnN1YigiIiwga2V5KS5sb3dlcigpLCB2YWwpCgogICAgZGVmIGdldF9kZWZhdWx0X3ZhbHVlcyhzZWxmKToKICAgICAgICAiIiJPdmVycmlkaW5nIHRvIG1ha2UgdXBkYXRpbmcgdGhlIGRlZmF1bHRzIGFmdGVyIGluc3RhbnRpYXRpb24gb2YKICAgICAgICB0aGUgb3B0aW9uIHBhcnNlciBwb3NzaWJsZSwgX3VwZGF0ZV9kZWZhdWx0cygpIGRvZXMgdGhlIGRpcnR5IHdvcmsuIiIiCiAgICAgICAgaWYgbm90IHNlbGYucHJvY2Vzc19kZWZhdWx0X3ZhbHVlczoKICAgICAgICAgICAgIyBPbGQsIHByZS1PcHRpayAxLjUgYmVoYXZpb3VyLgogICAgICAgICAgICByZXR1cm4gb3B0cGFyc2UuVmFsdWVzKHNlbGYuZGVmYXVsdHMpCgogICAgICAgIGRlZmF1bHRzID0gc2VsZi5fdXBkYXRlX2RlZmF1bHRzKHNlbGYuZGVmYXVsdHMuY29weSgpKSAgIyBvdXJzCiAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLl9nZXRfYWxsX29wdGlvbnMoKToKICAgICAgICAgICAgZGVmYXVsdCA9IGRlZmF1bHRzLmdldChvcHRpb24uZGVzdCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkZWZhdWx0LCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgb3B0X3N0ciA9IG9wdGlvbi5nZXRfb3B0X3N0cmluZygpCiAgICAgICAgICAgICAgICBkZWZhdWx0c1tvcHRpb24uZGVzdF0gPSBvcHRpb24uY2hlY2tfdmFsdWUob3B0X3N0ciwgZGVmYXVsdCkKICAgICAgICByZXR1cm4gb3B0cGFyc2UuVmFsdWVzKGRlZmF1bHRzKQoKICAgIGRlZiBlcnJvcihzZWxmLCBtc2cpOgogICAgICAgIHNlbGYucHJpbnRfdXNhZ2Uoc3lzLnN0ZGVycikKICAgICAgICBzZWxmLmV4aXQoMiwgIiVzXG4iICUgbXNnKQpQSwMEFAAAAAAAAAAhAEuZMiFaQAAAWkAAAC4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jbWRvcHRpb25zLnB5IiIiCnNoYXJlZCBvcHRpb25zIGFuZCBncm91cHMKClRoZSBwcmluY2lwbGUgaGVyZSBpcyB0byBkZWZpbmUgb3B0aW9ucyBvbmNlLCBidXQgKm5vdCogaW5zdGFudGlhdGUgdGhlbQpnbG9iYWxseS4gT25lIHJlYXNvbiBiZWluZyB0aGF0IG9wdGlvbnMgd2l0aCBhY3Rpb249J2FwcGVuZCcgY2FuIGNhcnJ5IHN0YXRlCmJldHdlZW4gcGFyc2VzLiBwaXAgcGFyc2VzIGdlbmVyYWwgb3B0aW9ucyB0d2ljZSBpbnRlcm5hbGx5LCBhbmQgc2hvdWxkbid0CnBhc3Mgb24gc3RhdGUuIFRvIGJlIGNvbnNpc3RlbnQsIGFsbCBvcHRpb25zIHdpbGwgZm9sbG93IHRoaXMgZGVzaWduLgoKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGZ1bmN0b29scyBpbXBvcnQgcGFydGlhbApmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25Hcm91cCwgU1VQUFJFU1NfSEVMUCwgT3B0aW9uCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBwaXAuaW5kZXggaW1wb3J0ICgKICAgIEZvcm1hdENvbnRyb2wsIGZtdF9jdGxfaGFuZGxlX211dHVhbF9leGNsdWRlLCBmbXRfY3RsX25vX2JpbmFyeSwKICAgIGZtdF9jdGxfbm9fdXNlX3doZWVsKQpmcm9tIHBpcC5tb2RlbHMgaW1wb3J0IFB5UEkKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCBVU0VSX0NBQ0hFX0RJUiwgc3JjX3ByZWZpeApmcm9tIHBpcC51dGlscy5oYXNoZXMgaW1wb3J0IFNUUk9OR19IQVNIRVMKCgpkZWYgbWFrZV9vcHRpb25fZ3JvdXAoZ3JvdXAsIHBhcnNlcik6CiAgICAiIiIKICAgIFJldHVybiBhbiBPcHRpb25Hcm91cCBvYmplY3QKICAgIGdyb3VwICAtLSBhc3N1bWVkIHRvIGJlIGRpY3Qgd2l0aCAnbmFtZScgYW5kICdvcHRpb25zJyBrZXlzCiAgICBwYXJzZXIgLS0gYW4gb3B0cGFyc2UgUGFyc2VyCiAgICAiIiIKICAgIG9wdGlvbl9ncm91cCA9IE9wdGlvbkdyb3VwKHBhcnNlciwgZ3JvdXBbJ25hbWUnXSkKICAgIGZvciBvcHRpb24gaW4gZ3JvdXBbJ29wdGlvbnMnXToKICAgICAgICBvcHRpb25fZ3JvdXAuYWRkX29wdGlvbihvcHRpb24oKSkKICAgIHJldHVybiBvcHRpb25fZ3JvdXAKCgpkZWYgcmVzb2x2ZV93aGVlbF9ub191c2VfYmluYXJ5KG9wdGlvbnMpOgogICAgaWYgbm90IG9wdGlvbnMudXNlX3doZWVsOgogICAgICAgIGNvbnRyb2wgPSBvcHRpb25zLmZvcm1hdF9jb250cm9sCiAgICAgICAgZm10X2N0bF9ub191c2Vfd2hlZWwoY29udHJvbCkKCgpkZWYgY2hlY2tfaW5zdGFsbF9idWlsZF9nbG9iYWwob3B0aW9ucywgY2hlY2tfb3B0aW9ucz1Ob25lKToKICAgICIiIkRpc2FibGUgd2hlZWxzIGlmIHBlci1zZXR1cC5weSBjYWxsIG9wdGlvbnMgYXJlIHNldC4KCiAgICA6cGFyYW0gb3B0aW9uczogVGhlIE9wdGlvblBhcnNlciBvcHRpb25zIHRvIHVwZGF0ZS4KICAgIDpwYXJhbSBjaGVja19vcHRpb25zOiBUaGUgb3B0aW9ucyB0byBjaGVjaywgaWYgbm90IHN1cHBsaWVkIGRlZmF1bHRzIHRvCiAgICAgICAgb3B0aW9ucy4KICAgICIiIgogICAgaWYgY2hlY2tfb3B0aW9ucyBpcyBOb25lOgogICAgICAgIGNoZWNrX29wdGlvbnMgPSBvcHRpb25zCgogICAgZGVmIGdldG5hbWUobik6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoY2hlY2tfb3B0aW9ucywgbiwgTm9uZSkKICAgIG5hbWVzID0gWyJidWlsZF9vcHRpb25zIiwgImdsb2JhbF9vcHRpb25zIiwgImluc3RhbGxfb3B0aW9ucyJdCiAgICBpZiBhbnkobWFwKGdldG5hbWUsIG5hbWVzKSk6CiAgICAgICAgY29udHJvbCA9IG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wKICAgICAgICBmbXRfY3RsX25vX2JpbmFyeShjb250cm9sKQogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICdEaXNhYmxpbmcgYWxsIHVzZSBvZiB3aGVlbHMgZHVlIHRvIHRoZSB1c2Ugb2YgLS1idWlsZC1vcHRpb25zICcKICAgICAgICAgICAgJy8gLS1nbG9iYWwtb3B0aW9ucyAvIC0taW5zdGFsbC1vcHRpb25zLicsIHN0YWNrbGV2ZWw9MikKCgojIyMjIyMjIyMjIwojIG9wdGlvbnMgIwojIyMjIyMjIyMjIwoKaGVscF8gPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy1oJywgJy0taGVscCcsCiAgICBkZXN0PSdoZWxwJywKICAgIGFjdGlvbj0naGVscCcsCiAgICBoZWxwPSdTaG93IGhlbHAuJykKCmlzb2xhdGVkX21vZGUgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0taXNvbGF0ZWQiLAogICAgZGVzdD0iaXNvbGF0ZWRfbW9kZSIsCiAgICBhY3Rpb249InN0b3JlX3RydWUiLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9KAogICAgICAgICJSdW4gcGlwIGluIGFuIGlzb2xhdGVkIG1vZGUsIGlnbm9yaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgdXNlciAiCiAgICAgICAgImNvbmZpZ3VyYXRpb24uIgogICAgKSwKKQoKcmVxdWlyZV92aXJ0dWFsZW52ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICMgUnVuIG9ubHkgaWYgaW5zaWRlIGEgdmlydHVhbGVudiwgYmFpbCBpZiBub3QuCiAgICAnLS1yZXF1aXJlLXZpcnR1YWxlbnYnLCAnLS1yZXF1aXJlLXZlbnYnLAogICAgZGVzdD0ncmVxdWlyZV92ZW52JywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD1TVVBQUkVTU19IRUxQKQoKdmVyYm9zZSA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLXYnLCAnLS12ZXJib3NlJywKICAgIGRlc3Q9J3ZlcmJvc2UnLAogICAgYWN0aW9uPSdjb3VudCcsCiAgICBkZWZhdWx0PTAsCiAgICBoZWxwPSdHaXZlIG1vcmUgb3V0cHV0LiBPcHRpb24gaXMgYWRkaXRpdmUsIGFuZCBjYW4gYmUgdXNlZCB1cCB0byAzIHRpbWVzLicKKQoKdmVyc2lvbiA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLVYnLCAnLS12ZXJzaW9uJywKICAgIGRlc3Q9J3ZlcnNpb24nLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGhlbHA9J1Nob3cgdmVyc2lvbiBhbmQgZXhpdC4nKQoKcXVpZXQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy1xJywgJy0tcXVpZXQnLAogICAgZGVzdD0ncXVpZXQnLAogICAgYWN0aW9uPSdjb3VudCcsCiAgICBkZWZhdWx0PTAsCiAgICBoZWxwPSgnR2l2ZSBsZXNzIG91dHB1dC4gT3B0aW9uIGlzIGFkZGl0aXZlLCBhbmQgY2FuIGJlIHVzZWQgdXAgdG8gMycKICAgICAgICAgICcgdGltZXMgKGNvcnJlc3BvbmRpbmcgdG8gV0FSTklORywgRVJST1IsIGFuZCBDUklUSUNBTCBsb2dnaW5nJwogICAgICAgICAgJyBsZXZlbHMpLicpCikKCmxvZyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1sb2ciLCAiLS1sb2ctZmlsZSIsICItLWxvY2FsLWxvZyIsCiAgICBkZXN0PSJsb2ciLAogICAgbWV0YXZhcj0icGF0aCIsCiAgICBoZWxwPSJQYXRoIHRvIGEgdmVyYm9zZSBhcHBlbmRpbmcgbG9nLiIKKQoKbm9faW5wdXQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIyBEb24ndCBhc2sgZm9yIGlucHV0CiAgICAnLS1uby1pbnB1dCcsCiAgICBkZXN0PSdub19pbnB1dCcsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCkKCnByb3h5ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXByb3h5JywKICAgIGRlc3Q9J3Byb3h5JywKICAgIHR5cGU9J3N0cicsCiAgICBkZWZhdWx0PScnLAogICAgaGVscD0iU3BlY2lmeSBhIHByb3h5IGluIHRoZSBmb3JtIFt1c2VyOnBhc3N3ZEBdcHJveHkuc2VydmVyOnBvcnQuIikKCnJldHJpZXMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tcmV0cmllcycsCiAgICBkZXN0PSdyZXRyaWVzJywKICAgIHR5cGU9J2ludCcsCiAgICBkZWZhdWx0PTUsCiAgICBoZWxwPSJNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGVhY2ggY29ubmVjdGlvbiBzaG91bGQgYXR0ZW1wdCAiCiAgICAgICAgICIoZGVmYXVsdCAlZGVmYXVsdCB0aW1lcykuIikKCnRpbWVvdXQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tdGltZW91dCcsICctLWRlZmF1bHQtdGltZW91dCcsCiAgICBtZXRhdmFyPSdzZWMnLAogICAgZGVzdD0ndGltZW91dCcsCiAgICB0eXBlPSdmbG9hdCcsCiAgICBkZWZhdWx0PTE1LAogICAgaGVscD0nU2V0IHRoZSBzb2NrZXQgdGltZW91dCAoZGVmYXVsdCAlZGVmYXVsdCBzZWNvbmRzKS4nKQoKZGVmYXVsdF92Y3MgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIyBUaGUgZGVmYXVsdCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIGZvciBlZGl0YWJsZXMsIGUuZy4gJ3N2bicKICAgICctLWRlZmF1bHQtdmNzJywKICAgIGRlc3Q9J2RlZmF1bHRfdmNzJywKICAgIHR5cGU9J3N0cicsCiAgICBkZWZhdWx0PScnLAogICAgaGVscD1TVVBQUkVTU19IRUxQKQoKc2tpcF9yZXF1aXJlbWVudHNfcmVnZXggPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIyBBIHJlZ2V4IHRvIGJlIHVzZWQgdG8gc2tpcCByZXF1aXJlbWVudHMKICAgICctLXNraXAtcmVxdWlyZW1lbnRzLXJlZ2V4JywKICAgIGRlc3Q9J3NraXBfcmVxdWlyZW1lbnRzX3JlZ2V4JywKICAgIHR5cGU9J3N0cicsCiAgICBkZWZhdWx0PScnLAogICAgaGVscD1TVVBQUkVTU19IRUxQKQoKCmRlZiBleGlzdHNfYWN0aW9uKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICMgT3B0aW9uIHdoZW4gcGF0aCBhbHJlYWR5IGV4aXN0CiAgICAgICAgJy0tZXhpc3RzLWFjdGlvbicsCiAgICAgICAgZGVzdD0nZXhpc3RzX2FjdGlvbicsCiAgICAgICAgdHlwZT0nY2hvaWNlJywKICAgICAgICBjaG9pY2VzPVsncycsICdpJywgJ3cnLCAnYicsICdhJ10sCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgbWV0YXZhcj0nYWN0aW9uJywKICAgICAgICBoZWxwPSJEZWZhdWx0IGFjdGlvbiB3aGVuIGEgcGF0aCBhbHJlYWR5IGV4aXN0czogIgogICAgICAgICIocyl3aXRjaCwgKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAsIChhKWJvcnQuIikKCgpjZXJ0ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWNlcnQnLAogICAgZGVzdD0nY2VydCcsCiAgICB0eXBlPSdzdHInLAogICAgbWV0YXZhcj0ncGF0aCcsCiAgICBoZWxwPSJQYXRoIHRvIGFsdGVybmF0ZSBDQSBidW5kbGUuIikKCmNsaWVudF9jZXJ0ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWNsaWVudC1jZXJ0JywKICAgIGRlc3Q9J2NsaWVudF9jZXJ0JywKICAgIHR5cGU9J3N0cicsCiAgICBkZWZhdWx0PU5vbmUsCiAgICBtZXRhdmFyPSdwYXRoJywKICAgIGhlbHA9IlBhdGggdG8gU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZSwgYSBzaW5nbGUgZmlsZSBjb250YWluaW5nIHRoZSAiCiAgICAgICAgICJwcml2YXRlIGtleSBhbmQgdGhlIGNlcnRpZmljYXRlIGluIFBFTSBmb3JtYXQuIikKCmluZGV4X3VybCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLWknLCAnLS1pbmRleC11cmwnLCAnLS1weXBpLXVybCcsCiAgICBkZXN0PSdpbmRleF91cmwnLAogICAgbWV0YXZhcj0nVVJMJywKICAgIGRlZmF1bHQ9UHlQSS5zaW1wbGVfdXJsLAogICAgaGVscD0iQmFzZSBVUkwgb2YgUHl0aG9uIFBhY2thZ2UgSW5kZXggKGRlZmF1bHQgJWRlZmF1bHQpLiAiCiAgICAgICAgICJUaGlzIHNob3VsZCBwb2ludCB0byBhIHJlcG9zaXRvcnkgY29tcGxpYW50IHdpdGggUEVQIDUwMyAiCiAgICAgICAgICIodGhlIHNpbXBsZSByZXBvc2l0b3J5IEFQSSkgb3IgYSBsb2NhbCBkaXJlY3RvcnkgbGFpZCBvdXQgIgogICAgICAgICAiaW4gdGhlIHNhbWUgZm9ybWF0LiIpCgoKZGVmIGV4dHJhX2luZGV4X3VybCgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAnLS1leHRyYS1pbmRleC11cmwnLAogICAgICAgIGRlc3Q9J2V4dHJhX2luZGV4X3VybHMnLAogICAgICAgIG1ldGF2YXI9J1VSTCcsCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgaGVscD0iRXh0cmEgVVJMcyBvZiBwYWNrYWdlIGluZGV4ZXMgdG8gdXNlIGluIGFkZGl0aW9uIHRvICIKICAgICAgICAgICAgICItLWluZGV4LXVybC4gU2hvdWxkIGZvbGxvdyB0aGUgc2FtZSBydWxlcyBhcyAiCiAgICAgICAgICAgICAiLS1pbmRleC11cmwuIgogICAgKQoKCm5vX2luZGV4ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLW5vLWluZGV4JywKICAgIGRlc3Q9J25vX2luZGV4JywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0nSWdub3JlIHBhY2thZ2UgaW5kZXggKG9ubHkgbG9va2luZyBhdCAtLWZpbmQtbGlua3MgVVJMcyBpbnN0ZWFkKS4nKQoKCmRlZiBmaW5kX2xpbmtzKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctZicsICctLWZpbmQtbGlua3MnLAogICAgICAgIGRlc3Q9J2ZpbmRfbGlua3MnLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9J3VybCcsCiAgICAgICAgaGVscD0iSWYgYSB1cmwgb3IgcGF0aCB0byBhbiBodG1sIGZpbGUsIHRoZW4gcGFyc2UgZm9yIGxpbmtzIHRvICIKICAgICAgICAgICAgICJhcmNoaXZlcy4gSWYgYSBsb2NhbCBwYXRoIG9yIGZpbGU6Ly8gdXJsIHRoYXQncyBhIGRpcmVjdG9yeSwgIgogICAgICAgICAgICAgInRoZW4gbG9vayBmb3IgYXJjaGl2ZXMgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nLiIpCgoKZGVmIGFsbG93X2V4dGVybmFsKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICItLWFsbG93LWV4dGVybmFsIiwKICAgICAgICBkZXN0PSJhbGxvd19leHRlcm5hbCIsCiAgICAgICAgYWN0aW9uPSJhcHBlbmQiLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0iUEFDS0FHRSIsCiAgICAgICAgaGVscD1TVVBQUkVTU19IRUxQLAogICAgKQoKCmFsbG93X2FsbF9leHRlcm5hbCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1hbGxvdy1hbGwtZXh0ZXJuYWwiLAogICAgZGVzdD0iYWxsb3dfYWxsX2V4dGVybmFsIiwKICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD1TVVBQUkVTU19IRUxQLAopCgoKZGVmIHRydXN0ZWRfaG9zdCgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAiLS10cnVzdGVkLWhvc3QiLAogICAgICAgIGRlc3Q9InRydXN0ZWRfaG9zdHMiLAogICAgICAgIGFjdGlvbj0iYXBwZW5kIiwKICAgICAgICBtZXRhdmFyPSJIT1NUTkFNRSIsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBoZWxwPSJNYXJrIHRoaXMgaG9zdCBhcyB0cnVzdGVkLCBldmVuIHRob3VnaCBpdCBkb2VzIG5vdCBoYXZlIHZhbGlkICIKICAgICAgICAgICAgICJvciBhbnkgSFRUUFMuIiwKICAgICkKCgojIFJlbW92ZSBhZnRlciA3LjAKbm9fYWxsb3dfZXh0ZXJuYWwgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tbm8tYWxsb3ctZXh0ZXJuYWwiLAogICAgZGVzdD0iYWxsb3dfYWxsX2V4dGVybmFsIiwKICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKKQoKCiMgUmVtb3ZlIC0tYWxsb3ctaW5zZWN1cmUgYWZ0ZXIgNy4wCmRlZiBhbGxvd191bnNhZmUoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgIi0tYWxsb3ctdW52ZXJpZmllZCIsICItLWFsbG93LWluc2VjdXJlIiwKICAgICAgICBkZXN0PSJhbGxvd191bnZlcmlmaWVkIiwKICAgICAgICBhY3Rpb249ImFwcGVuZCIsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSJQQUNLQUdFIiwKICAgICAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCiAgICApCgojIFJlbW92ZSBhZnRlciA3LjAKbm9fYWxsb3dfdW5zYWZlID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLW5vLWFsbG93LWluc2VjdXJlIiwKICAgIGRlc3Q9ImFsbG93X2FsbF9pbnNlY3VyZSIsCiAgICBhY3Rpb249InN0b3JlX2ZhbHNlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFAKKQoKIyBSZW1vdmUgYWZ0ZXIgMS41CnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1wcm9jZXNzLWRlcGVuZGVuY3ktbGlua3MiLAogICAgZGVzdD0icHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzIiwKICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0iRW5hYmxlIHRoZSBwcm9jZXNzaW5nIG9mIGRlcGVuZGVuY3kgbGlua3MuIiwKKQoKCmRlZiBjb25zdHJhaW50cygpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAnLWMnLCAnLS1jb25zdHJhaW50JywKICAgICAgICBkZXN0PSdjb25zdHJhaW50cycsCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0nZmlsZScsCiAgICAgICAgaGVscD0nQ29uc3RyYWluIHZlcnNpb25zIHVzaW5nIHRoZSBnaXZlbiBjb25zdHJhaW50cyBmaWxlLiAnCiAgICAgICAgJ1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzLicpCgoKZGVmIHJlcXVpcmVtZW50cygpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAnLXInLCAnLS1yZXF1aXJlbWVudCcsCiAgICAgICAgZGVzdD0ncmVxdWlyZW1lbnRzJywKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSdmaWxlJywKICAgICAgICBoZWxwPSdJbnN0YWxsIGZyb20gdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBmaWxlLiAnCiAgICAgICAgJ1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzLicpCgoKZGVmIGVkaXRhYmxlKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctZScsICctLWVkaXRhYmxlJywKICAgICAgICBkZXN0PSdlZGl0YWJsZXMnLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9J3BhdGgvdXJsJywKICAgICAgICBoZWxwPSgnSW5zdGFsbCBhIHByb2plY3QgaW4gZWRpdGFibGUgbW9kZSAoaS5lLiBzZXR1cHRvb2xzICcKICAgICAgICAgICAgICAnImRldmVsb3AgbW9kZSIpIGZyb20gYSBsb2NhbCBwcm9qZWN0IHBhdGggb3IgYSBWQ1MgdXJsLicpLAogICAgKQoKc3JjID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXNyYycsICctLXNvdXJjZScsICctLXNvdXJjZS1kaXInLCAnLS1zb3VyY2UtZGlyZWN0b3J5JywKICAgIGRlc3Q9J3NyY19kaXInLAogICAgbWV0YXZhcj0nZGlyJywKICAgIGRlZmF1bHQ9c3JjX3ByZWZpeCwKICAgIGhlbHA9J0RpcmVjdG9yeSB0byBjaGVjayBvdXQgZWRpdGFibGUgcHJvamVjdHMgaW50by4gJwogICAgJ1RoZSBkZWZhdWx0IGluIGEgdmlydHVhbGVudiBpcyAiPHZlbnYgcGF0aD4vc3JjIi4gJwogICAgJ1RoZSBkZWZhdWx0IGZvciBnbG9iYWwgaW5zdGFsbHMgaXMgIjxjdXJyZW50IGRpcj4vc3JjIi4nCikKCiMgWFhYOiBkZXByZWNhdGVkLCByZW1vdmUgaW4gOS4wCnVzZV93aGVlbCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS11c2Utd2hlZWwnLAogICAgZGVzdD0ndXNlX3doZWVsJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PVRydWUsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCikKCiMgWFhYOiBkZXByZWNhdGVkLCByZW1vdmUgaW4gOS4wCm5vX3VzZV93aGVlbCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1uby11c2Utd2hlZWwnLAogICAgZGVzdD0ndXNlX3doZWVsJywKICAgIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAogICAgZGVmYXVsdD1UcnVlLAogICAgaGVscD0oJ0RvIG5vdCBGaW5kIGFuZCBwcmVmZXIgd2hlZWwgYXJjaGl2ZXMgd2hlbiBzZWFyY2hpbmcgaW5kZXhlcyBhbmQgJwogICAgICAgICAgJ2ZpbmQtbGlua3MgbG9jYXRpb25zLiBERVBSRUNBVEVEIGluIGZhdm91ciBvZiAtLW5vLWJpbmFyeS4nKSwKKQoKCmRlZiBfZ2V0X2Zvcm1hdF9jb250cm9sKHZhbHVlcywgb3B0aW9uKToKICAgICIiIkdldCBhIGZvcm1hdF9jb250cm9sIG9iamVjdC4iIiIKICAgIHJldHVybiBnZXRhdHRyKHZhbHVlcywgb3B0aW9uLmRlc3QpCgoKZGVmIF9oYW5kbGVfbm9fYmluYXJ5KG9wdGlvbiwgb3B0X3N0ciwgdmFsdWUsIHBhcnNlcik6CiAgICBleGlzdGluZyA9IGdldGF0dHIocGFyc2VyLnZhbHVlcywgb3B0aW9uLmRlc3QpCiAgICBmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZSgKICAgICAgICB2YWx1ZSwgZXhpc3Rpbmcubm9fYmluYXJ5LCBleGlzdGluZy5vbmx5X2JpbmFyeSkKCgpkZWYgX2hhbmRsZV9vbmx5X2JpbmFyeShvcHRpb24sIG9wdF9zdHIsIHZhbHVlLCBwYXJzZXIpOgogICAgZXhpc3RpbmcgPSBnZXRhdHRyKHBhcnNlci52YWx1ZXMsIG9wdGlvbi5kZXN0KQogICAgZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUoCiAgICAgICAgdmFsdWUsIGV4aXN0aW5nLm9ubHlfYmluYXJ5LCBleGlzdGluZy5ub19iaW5hcnkpCgoKZGVmIG5vX2JpbmFyeSgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAiLS1uby1iaW5hcnkiLCBkZXN0PSJmb3JtYXRfY29udHJvbCIsIGFjdGlvbj0iY2FsbGJhY2siLAogICAgICAgIGNhbGxiYWNrPV9oYW5kbGVfbm9fYmluYXJ5LCB0eXBlPSJzdHIiLAogICAgICAgIGRlZmF1bHQ9Rm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpLAogICAgICAgIGhlbHA9IkRvIG5vdCB1c2UgYmluYXJ5IHBhY2thZ2VzLiBDYW4gYmUgc3VwcGxpZWQgbXVsdGlwbGUgdGltZXMsIGFuZCAiCiAgICAgICAgICAgICAiZWFjaCB0aW1lIGFkZHMgdG8gdGhlIGV4aXN0aW5nIHZhbHVlLiBBY2NlcHRzIGVpdGhlciA6YWxsOiB0byAiCiAgICAgICAgICAgICAiZGlzYWJsZSBhbGwgYmluYXJ5IHBhY2thZ2VzLCA6bm9uZTogdG8gZW1wdHkgdGhlIHNldCwgb3Igb25lIG9yICIKICAgICAgICAgICAgICJtb3JlIHBhY2thZ2UgbmFtZXMgd2l0aCBjb21tYXMgYmV0d2VlbiB0aGVtLiBOb3RlIHRoYXQgc29tZSAiCiAgICAgICAgICAgICAicGFja2FnZXMgYXJlIHRyaWNreSB0byBjb21waWxlIGFuZCBtYXkgZmFpbCB0byBpbnN0YWxsIHdoZW4gIgogICAgICAgICAgICAgInRoaXMgb3B0aW9uIGlzIHVzZWQgb24gdGhlbS4iKQoKCmRlZiBvbmx5X2JpbmFyeSgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAiLS1vbmx5LWJpbmFyeSIsIGRlc3Q9ImZvcm1hdF9jb250cm9sIiwgYWN0aW9uPSJjYWxsYmFjayIsCiAgICAgICAgY2FsbGJhY2s9X2hhbmRsZV9vbmx5X2JpbmFyeSwgdHlwZT0ic3RyIiwKICAgICAgICBkZWZhdWx0PUZvcm1hdENvbnRyb2woc2V0KCksIHNldCgpKSwKICAgICAgICBoZWxwPSJEbyBub3QgdXNlIHNvdXJjZSBwYWNrYWdlcy4gQ2FuIGJlIHN1cHBsaWVkIG11bHRpcGxlIHRpbWVzLCBhbmQgIgogICAgICAgICAgICAgImVhY2ggdGltZSBhZGRzIHRvIHRoZSBleGlzdGluZyB2YWx1ZS4gQWNjZXB0cyBlaXRoZXIgOmFsbDogdG8gIgogICAgICAgICAgICAgImRpc2FibGUgYWxsIHNvdXJjZSBwYWNrYWdlcywgOm5vbmU6IHRvIGVtcHR5IHRoZSBzZXQsIG9yIG9uZSBvciAiCiAgICAgICAgICAgICAibW9yZSBwYWNrYWdlIG5hbWVzIHdpdGggY29tbWFzIGJldHdlZW4gdGhlbS4gUGFja2FnZXMgd2l0aG91dCAiCiAgICAgICAgICAgICAiYmluYXJ5IGRpc3RyaWJ1dGlvbnMgd2lsbCBmYWlsIHRvIGluc3RhbGwgd2hlbiB0aGlzIG9wdGlvbiBpcyAiCiAgICAgICAgICAgICAidXNlZCBvbiB0aGVtLiIpCgoKY2FjaGVfZGlyID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLWNhY2hlLWRpciIsCiAgICBkZXN0PSJjYWNoZV9kaXIiLAogICAgZGVmYXVsdD1VU0VSX0NBQ0hFX0RJUiwKICAgIG1ldGF2YXI9ImRpciIsCiAgICBoZWxwPSJTdG9yZSB0aGUgY2FjaGUgZGF0YSBpbiA8ZGlyPi4iCikKCm5vX2NhY2hlID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLW5vLWNhY2hlLWRpciIsCiAgICBkZXN0PSJjYWNoZV9kaXIiLAogICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCiAgICBoZWxwPSJEaXNhYmxlIHRoZSBjYWNoZS4iLAopCgpub19kZXBzID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLW5vLWRlcHMnLCAnLS1uby1kZXBlbmRlbmNpZXMnLAogICAgZGVzdD0naWdub3JlX2RlcGVuZGVuY2llcycsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9IkRvbid0IGluc3RhbGwgcGFja2FnZSBkZXBlbmRlbmNpZXMuIikKCmJ1aWxkX2RpciA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLWInLCAnLS1idWlsZCcsICctLWJ1aWxkLWRpcicsICctLWJ1aWxkLWRpcmVjdG9yeScsCiAgICBkZXN0PSdidWlsZF9kaXInLAogICAgbWV0YXZhcj0nZGlyJywKICAgIGhlbHA9J0RpcmVjdG9yeSB0byB1bnBhY2sgcGFja2FnZXMgaW50byBhbmQgYnVpbGQgaW4uJwopCgppZ25vcmVfcmVxdWlyZXNfcHl0aG9uID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWlnbm9yZS1yZXF1aXJlcy1weXRob24nLAogICAgZGVzdD0naWdub3JlX3JlcXVpcmVzX3B5dGhvbicsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgaGVscD0nSWdub3JlIHRoZSBSZXF1aXJlcy1QeXRob24gaW5mb3JtYXRpb24uJykKCmluc3RhbGxfb3B0aW9ucyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1pbnN0YWxsLW9wdGlvbicsCiAgICBkZXN0PSdpbnN0YWxsX29wdGlvbnMnLAogICAgYWN0aW9uPSdhcHBlbmQnLAogICAgbWV0YXZhcj0nb3B0aW9ucycsCiAgICBoZWxwPSJFeHRyYSBhcmd1bWVudHMgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIHNldHVwLnB5IGluc3RhbGwgIgogICAgICAgICAiY29tbWFuZCAodXNlIGxpa2UgLS1pbnN0YWxsLW9wdGlvbj1cIi0taW5zdGFsbC1zY3JpcHRzPS91c3IvbG9jYWwvIgogICAgICAgICAiYmluXCIpLiBVc2UgbXVsdGlwbGUgLS1pbnN0YWxsLW9wdGlvbiBvcHRpb25zIHRvIHBhc3MgbXVsdGlwbGUgIgogICAgICAgICAib3B0aW9ucyB0byBzZXR1cC5weSBpbnN0YWxsLiBJZiB5b3UgYXJlIHVzaW5nIGFuIG9wdGlvbiB3aXRoIGEgIgogICAgICAgICAiZGlyZWN0b3J5IHBhdGgsIGJlIHN1cmUgdG8gdXNlIGFic29sdXRlIHBhdGguIikKCmdsb2JhbF9vcHRpb25zID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWdsb2JhbC1vcHRpb24nLAogICAgZGVzdD0nZ2xvYmFsX29wdGlvbnMnLAogICAgYWN0aW9uPSdhcHBlbmQnLAogICAgbWV0YXZhcj0nb3B0aW9ucycsCiAgICBoZWxwPSJFeHRyYSBnbG9iYWwgb3B0aW9ucyB0byBiZSBzdXBwbGllZCB0byB0aGUgc2V0dXAucHkgIgogICAgICAgICAiY2FsbCBiZWZvcmUgdGhlIGluc3RhbGwgY29tbWFuZC4iKQoKbm9fY2xlYW4gPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tbm8tY2xlYW4nLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSJEb24ndCBjbGVhbiB1cCBidWlsZCBkaXJlY3Rvcmllcy4iKQoKcHJlID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXByZScsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9IkluY2x1ZGUgcHJlLXJlbGVhc2UgYW5kIGRldmVsb3BtZW50IHZlcnNpb25zLiBCeSBkZWZhdWx0LCAiCiAgICAgICAgICJwaXAgb25seSBmaW5kcyBzdGFibGUgdmVyc2lvbnMuIikKCmRpc2FibGVfcGlwX3ZlcnNpb25fY2hlY2sgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tZGlzYWJsZS1waXAtdmVyc2lvbi1jaGVjayIsCiAgICBkZXN0PSJkaXNhYmxlX3BpcF92ZXJzaW9uX2NoZWNrIiwKICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0iRG9uJ3QgcGVyaW9kaWNhbGx5IGNoZWNrIFB5UEkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBuZXcgdmVyc2lvbiAiCiAgICAgICAgICJvZiBwaXAgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZC4gSW1wbGllZCB3aXRoIC0tbm8taW5kZXguIikKCiMgRGVwcmVjYXRlZCwgUmVtb3ZlIGxhdGVyCmFsd2F5c191bnppcCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLVonLCAnLS1hbHdheXMtdW56aXAnLAogICAgZGVzdD0nYWx3YXlzX3VuemlwJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCikKCgpkZWYgX21lcmdlX2hhc2gob3B0aW9uLCBvcHRfc3RyLCB2YWx1ZSwgcGFyc2VyKToKICAgICIiIkdpdmVuIGEgdmFsdWUgc3BlbGxlZCAiYWxnbzpkaWdlc3QiLCBhcHBlbmQgdGhlIGRpZ2VzdCB0byBhIGxpc3QKICAgIHBvaW50ZWQgdG8gaW4gYSBkaWN0IGJ5IHRoZSBhbGdvIG5hbWUuIiIiCiAgICBpZiBub3QgcGFyc2VyLnZhbHVlcy5oYXNoZXM6CiAgICAgICAgcGFyc2VyLnZhbHVlcy5oYXNoZXMgPSB7fQogICAgdHJ5OgogICAgICAgIGFsZ28sIGRpZ2VzdCA9IHZhbHVlLnNwbGl0KCc6JywgMSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhcnNlci5lcnJvcignQXJndW1lbnRzIHRvICVzIG11c3QgYmUgYSBoYXNoIG5hbWUgJwogICAgICAgICAgICAgICAgICAgICAnZm9sbG93ZWQgYnkgYSB2YWx1ZSwgbGlrZSAtLWhhc2g9c2hhMjU2OmFiY2RlLi4uJyAlCiAgICAgICAgICAgICAgICAgICAgIG9wdF9zdHIpCiAgICBpZiBhbGdvIG5vdCBpbiBTVFJPTkdfSEFTSEVTOgogICAgICAgIHBhcnNlci5lcnJvcignQWxsb3dlZCBoYXNoIGFsZ29yaXRobXMgZm9yICVzIGFyZSAlcy4nICUKICAgICAgICAgICAgICAgICAgICAgKG9wdF9zdHIsICcsICcuam9pbihTVFJPTkdfSEFTSEVTKSkpCiAgICBwYXJzZXIudmFsdWVzLmhhc2hlcy5zZXRkZWZhdWx0KGFsZ28sIFtdKS5hcHBlbmQoZGlnZXN0KQoKCmhhc2ggPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0taGFzaCcsCiAgICAjIEhhc2ggdmFsdWVzIGV2ZW50dWFsbHkgZW5kIHVwIGluIEluc3RhbGxSZXF1aXJlbWVudC5oYXNoZXMgZHVlIHRvCiAgICAjIF9fZGljdF9fIGNvcHlpbmcgaW4gcHJvY2Vzc19saW5lKCkuCiAgICBkZXN0PSdoYXNoZXMnLAogICAgYWN0aW9uPSdjYWxsYmFjaycsCiAgICBjYWxsYmFjaz1fbWVyZ2VfaGFzaCwKICAgIHR5cGU9J3N0cmluZycsCiAgICBoZWxwPSJWZXJpZnkgdGhhdCB0aGUgcGFja2FnZSdzIGFyY2hpdmUgbWF0Y2hlcyB0aGlzICIKICAgICAgICAgJ2hhc2ggYmVmb3JlIGluc3RhbGxpbmcuIEV4YW1wbGU6IC0taGFzaD1zaGEyNTY6YWJjZGVmLi4uJykKCgpyZXF1aXJlX2hhc2hlcyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1yZXF1aXJlLWhhc2hlcycsCiAgICBkZXN0PSdyZXF1aXJlX2hhc2hlcycsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9J1JlcXVpcmUgYSBoYXNoIHRvIGNoZWNrIGVhY2ggcmVxdWlyZW1lbnQgYWdhaW5zdCwgZm9yICcKICAgICAgICAgJ3JlcGVhdGFibGUgaW5zdGFsbHMuIFRoaXMgb3B0aW9uIGlzIGltcGxpZWQgd2hlbiBhbnkgcGFja2FnZSBpbiBhICcKICAgICAgICAgJ3JlcXVpcmVtZW50cyBmaWxlIGhhcyBhIC0taGFzaCBvcHRpb24uJykKCgojIyMjIyMjIyMjCiMgZ3JvdXBzICMKIyMjIyMjIyMjIwoKZ2VuZXJhbF9ncm91cCA9IHsKICAgICduYW1lJzogJ0dlbmVyYWwgT3B0aW9ucycsCiAgICAnb3B0aW9ucyc6IFsKICAgICAgICBoZWxwXywKICAgICAgICBpc29sYXRlZF9tb2RlLAogICAgICAgIHJlcXVpcmVfdmlydHVhbGVudiwKICAgICAgICB2ZXJib3NlLAogICAgICAgIHZlcnNpb24sCiAgICAgICAgcXVpZXQsCiAgICAgICAgbG9nLAogICAgICAgIG5vX2lucHV0LAogICAgICAgIHByb3h5LAogICAgICAgIHJldHJpZXMsCiAgICAgICAgdGltZW91dCwKICAgICAgICBkZWZhdWx0X3ZjcywKICAgICAgICBza2lwX3JlcXVpcmVtZW50c19yZWdleCwKICAgICAgICBleGlzdHNfYWN0aW9uLAogICAgICAgIHRydXN0ZWRfaG9zdCwKICAgICAgICBjZXJ0LAogICAgICAgIGNsaWVudF9jZXJ0LAogICAgICAgIGNhY2hlX2RpciwKICAgICAgICBub19jYWNoZSwKICAgICAgICBkaXNhYmxlX3BpcF92ZXJzaW9uX2NoZWNrLAogICAgXQp9Cgpub25fZGVwcmVjYXRlZF9pbmRleF9ncm91cCA9IHsKICAgICduYW1lJzogJ1BhY2thZ2UgSW5kZXggT3B0aW9ucycsCiAgICAnb3B0aW9ucyc6IFsKICAgICAgICBpbmRleF91cmwsCiAgICAgICAgZXh0cmFfaW5kZXhfdXJsLAogICAgICAgIG5vX2luZGV4LAogICAgICAgIGZpbmRfbGlua3MsCiAgICAgICAgcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzLAogICAgXQp9CgppbmRleF9ncm91cCA9IHsKICAgICduYW1lJzogJ1BhY2thZ2UgSW5kZXggT3B0aW9ucyAoaW5jbHVkaW5nIGRlcHJlY2F0ZWQgb3B0aW9ucyknLAogICAgJ29wdGlvbnMnOiBub25fZGVwcmVjYXRlZF9pbmRleF9ncm91cFsnb3B0aW9ucyddICsgWwogICAgICAgIGFsbG93X2V4dGVybmFsLAogICAgICAgIGFsbG93X2FsbF9leHRlcm5hbCwKICAgICAgICBub19hbGxvd19leHRlcm5hbCwKICAgICAgICBhbGxvd191bnNhZmUsCiAgICAgICAgbm9fYWxsb3dfdW5zYWZlLAogICAgXQp9ClBLAwQUAAAAAAAAACEAkA2HQ8QIAADECAAANQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL19faW5pdF9fLnB5IiIiClBhY2thZ2UgY29udGFpbmluZyBhbGwgcGlwIGNvbW1hbmRzCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBwaXAuY29tbWFuZHMuY29tcGxldGlvbiBpbXBvcnQgQ29tcGxldGlvbkNvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuZG93bmxvYWQgaW1wb3J0IERvd25sb2FkQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5mcmVlemUgaW1wb3J0IEZyZWV6ZUNvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuaGFzaCBpbXBvcnQgSGFzaENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuaGVscCBpbXBvcnQgSGVscENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMubGlzdCBpbXBvcnQgTGlzdENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuY2hlY2sgaW1wb3J0IENoZWNrQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5zZWFyY2ggaW1wb3J0IFNlYXJjaENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuc2hvdyBpbXBvcnQgU2hvd0NvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuaW5zdGFsbCBpbXBvcnQgSW5zdGFsbENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMudW5pbnN0YWxsIGltcG9ydCBVbmluc3RhbGxDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLndoZWVsIGltcG9ydCBXaGVlbENvbW1hbmQKCgpjb21tYW5kc19kaWN0ID0gewogICAgQ29tcGxldGlvbkNvbW1hbmQubmFtZTogQ29tcGxldGlvbkNvbW1hbmQsCiAgICBGcmVlemVDb21tYW5kLm5hbWU6IEZyZWV6ZUNvbW1hbmQsCiAgICBIYXNoQ29tbWFuZC5uYW1lOiBIYXNoQ29tbWFuZCwKICAgIEhlbHBDb21tYW5kLm5hbWU6IEhlbHBDb21tYW5kLAogICAgU2VhcmNoQ29tbWFuZC5uYW1lOiBTZWFyY2hDb21tYW5kLAogICAgU2hvd0NvbW1hbmQubmFtZTogU2hvd0NvbW1hbmQsCiAgICBJbnN0YWxsQ29tbWFuZC5uYW1lOiBJbnN0YWxsQ29tbWFuZCwKICAgIFVuaW5zdGFsbENvbW1hbmQubmFtZTogVW5pbnN0YWxsQ29tbWFuZCwKICAgIERvd25sb2FkQ29tbWFuZC5uYW1lOiBEb3dubG9hZENvbW1hbmQsCiAgICBMaXN0Q29tbWFuZC5uYW1lOiBMaXN0Q29tbWFuZCwKICAgIENoZWNrQ29tbWFuZC5uYW1lOiBDaGVja0NvbW1hbmQsCiAgICBXaGVlbENvbW1hbmQubmFtZTogV2hlZWxDb21tYW5kLAp9CgoKY29tbWFuZHNfb3JkZXIgPSBbCiAgICBJbnN0YWxsQ29tbWFuZCwKICAgIERvd25sb2FkQ29tbWFuZCwKICAgIFVuaW5zdGFsbENvbW1hbmQsCiAgICBGcmVlemVDb21tYW5kLAogICAgTGlzdENvbW1hbmQsCiAgICBTaG93Q29tbWFuZCwKICAgIENoZWNrQ29tbWFuZCwKICAgIFNlYXJjaENvbW1hbmQsCiAgICBXaGVlbENvbW1hbmQsCiAgICBIYXNoQ29tbWFuZCwKICAgIENvbXBsZXRpb25Db21tYW5kLAogICAgSGVscENvbW1hbmQsCl0KCgpkZWYgZ2V0X3N1bW1hcmllcyhvcmRlcmVkPVRydWUpOgogICAgIiIiWWllbGRzIHNvcnRlZCAoY29tbWFuZCBuYW1lLCBjb21tYW5kIHN1bW1hcnkpIHR1cGxlcy4iIiIKCiAgICBpZiBvcmRlcmVkOgogICAgICAgIGNtZGl0ZW1zID0gX3NvcnRfY29tbWFuZHMoY29tbWFuZHNfZGljdCwgY29tbWFuZHNfb3JkZXIpCiAgICBlbHNlOgogICAgICAgIGNtZGl0ZW1zID0gY29tbWFuZHNfZGljdC5pdGVtcygpCgogICAgZm9yIG5hbWUsIGNvbW1hbmRfY2xhc3MgaW4gY21kaXRlbXM6CiAgICAgICAgeWllbGQgKG5hbWUsIGNvbW1hbmRfY2xhc3Muc3VtbWFyeSkKCgpkZWYgZ2V0X3NpbWlsYXJfY29tbWFuZHMobmFtZSk6CiAgICAiIiJDb21tYW5kIG5hbWUgYXV0by1jb3JyZWN0LiIiIgogICAgZnJvbSBkaWZmbGliIGltcG9ydCBnZXRfY2xvc2VfbWF0Y2hlcwoKICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKCiAgICBjbG9zZV9jb21tYW5kcyA9IGdldF9jbG9zZV9tYXRjaGVzKG5hbWUsIGNvbW1hbmRzX2RpY3Qua2V5cygpKQoKICAgIGlmIGNsb3NlX2NvbW1hbmRzOgogICAgICAgIHJldHVybiBjbG9zZV9jb21tYW5kc1swXQogICAgZWxzZToKICAgICAgICByZXR1cm4gRmFsc2UKCgpkZWYgX3NvcnRfY29tbWFuZHMoY21kZGljdCwgb3JkZXIpOgogICAgZGVmIGtleWZuKGtleSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3JkZXIuaW5kZXgoa2V5WzFdKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIHVub3JkZXJlZCBpdGVtcyBzaG91bGQgY29tZSBsYXN0CiAgICAgICAgICAgIHJldHVybiAweGZmCgogICAgcmV0dXJuIHNvcnRlZChjbWRkaWN0Lml0ZW1zKCksIGtleT1rZXlmbikKUEsDBBQAAAAAAAAAIQAdYTtfZgUAAGYFAAAyAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvY2hlY2sucHlpbXBvcnQgbG9nZ2luZwoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAub3BlcmF0aW9ucy5jaGVjayBpbXBvcnQgY2hlY2tfcmVxdWlyZW1lbnRzCmZyb20gcGlwLnV0aWxzIGltcG9ydCBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBDaGVja0NvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiJWZXJpZnkgaW5zdGFsbGVkIHBhY2thZ2VzIGhhdmUgY29tcGF0aWJsZSBkZXBlbmRlbmNpZXMuIiIiCiAgICBuYW1lID0gJ2NoZWNrJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIiIiCiAgICBzdW1tYXJ5ID0gJ1ZlcmlmeSBpbnN0YWxsZWQgcGFja2FnZXMgaGF2ZSBjb21wYXRpYmxlIGRlcGVuZGVuY2llcy4nCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBkaXN0cyA9IGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucyhsb2NhbF9vbmx5PUZhbHNlLCBza2lwPSgpKQogICAgICAgIG1pc3NpbmdfcmVxc19kaWN0LCBpbmNvbXBhdGlibGVfcmVxc19kaWN0ID0gY2hlY2tfcmVxdWlyZW1lbnRzKGRpc3RzKQoKICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAga2V5ID0gJyVzPT0lcycgJSAoZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbikKCiAgICAgICAgICAgIGZvciByZXF1aXJlbWVudCBpbiBtaXNzaW5nX3JlcXNfZGljdC5nZXQoa2V5LCBbXSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAiJXMgJXMgcmVxdWlyZXMgJXMsIHdoaWNoIGlzIG5vdCBpbnN0YWxsZWQuIiwKICAgICAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uLCByZXF1aXJlbWVudC5wcm9qZWN0X25hbWUpCgogICAgICAgICAgICBmb3IgcmVxdWlyZW1lbnQsIGFjdHVhbCBpbiBpbmNvbXBhdGlibGVfcmVxc19kaWN0LmdldChrZXksIFtdKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICIlcyAlcyBoYXMgcmVxdWlyZW1lbnQgJXMsIGJ1dCB5b3UgaGF2ZSAlcyAlcy4iLAogICAgICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24sIHJlcXVpcmVtZW50LAogICAgICAgICAgICAgICAgICAgIGFjdHVhbC5wcm9qZWN0X25hbWUsIGFjdHVhbC52ZXJzaW9uKQoKICAgICAgICBpZiBtaXNzaW5nX3JlcXNfZGljdCBvciBpbmNvbXBhdGlibGVfcmVxc19kaWN0OgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJObyBicm9rZW4gcmVxdWlyZW1lbnRzIGZvdW5kLiIpClBLAwQUAAAAAAAAACEAMMHMs5UJAACVCQAANwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2NvbXBsZXRpb24ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZAoKQkFTRV9DT01QTEVUSU9OID0gIiIiCiMgcGlwICUoc2hlbGwpcyBjb21wbGV0aW9uIHN0YXJ0JShzY3JpcHQpcyMgcGlwICUoc2hlbGwpcyBjb21wbGV0aW9uIGVuZAoiIiIKCkNPTVBMRVRJT05fU0NSSVBUUyA9IHsKICAgICdiYXNoJzogIiIiCl9waXBfY29tcGxldGlvbigpCnsKICAgIENPTVBSRVBMWT0oICQoIENPTVBfV09SRFM9IiR7Q09NUF9XT1JEU1sqXX0iIFxcCiAgICAgICAgICAgICAgICAgICBDT01QX0NXT1JEPSRDT01QX0NXT1JEIFxcCiAgICAgICAgICAgICAgICAgICBQSVBfQVVUT19DT01QTEVURT0xICQxICkgKQp9CmNvbXBsZXRlIC1vIGRlZmF1bHQgLUYgX3BpcF9jb21wbGV0aW9uIHBpcAoiIiIsICd6c2gnOiAiIiIKZnVuY3Rpb24gX3BpcF9jb21wbGV0aW9uIHsKICBsb2NhbCB3b3JkcyBjd29yZAogIHJlYWQgLUFjIHdvcmRzCiAgcmVhZCAtY24gY3dvcmQKICByZXBseT0oICQoIENPTVBfV09SRFM9IiR3b3Jkc1sqXSIgXFwKICAgICAgICAgICAgIENPTVBfQ1dPUkQ9JCgoIGN3b3JkLTEgKSkgXFwKICAgICAgICAgICAgIFBJUF9BVVRPX0NPTVBMRVRFPTEgJHdvcmRzWzFdICkgKQp9CmNvbXBjdGwgLUsgX3BpcF9jb21wbGV0aW9uIHBpcAoiIiIsICdmaXNoJzogIiIiCmZ1bmN0aW9uIF9fZmlzaF9jb21wbGV0ZV9waXAKICAgIHNldCAtbHggQ09NUF9XT1JEUyAoY29tbWFuZGxpbmUgLW8pICIiCiAgICBzZXQgLWx4IENPTVBfQ1dPUkQgKG1hdGggKGNvbnRhaW5zIC1pIC0tIChjb21tYW5kbGluZSAtdCkgJENPTVBfV09SRFMpLTEpCiAgICBzZXQgLWx4IFBJUF9BVVRPX0NPTVBMRVRFIDEKICAgIHN0cmluZyBzcGxpdCBcICAtLSAoZXZhbCAkQ09NUF9XT1JEU1sxXSkKZW5kCmNvbXBsZXRlIC1mYSAiKF9fZmlzaF9jb21wbGV0ZV9waXApIiAtYyBwaXAKIiIifQoKCmNsYXNzIENvbXBsZXRpb25Db21tYW5kKENvbW1hbmQpOgogICAgIiIiQSBoZWxwZXIgY29tbWFuZCB0byBiZSB1c2VkIGZvciBjb21tYW5kIGNvbXBsZXRpb24uIiIiCiAgICBuYW1lID0gJ2NvbXBsZXRpb24nCiAgICBzdW1tYXJ5ID0gJ0EgaGVscGVyIGNvbW1hbmQgdXNlZCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKENvbXBsZXRpb25Db21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKCiAgICAgICAgY21kX29wdHMgPSBzZWxmLmNtZF9vcHRzCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWJhc2gnLCAnLWInLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX2NvbnN0JywKICAgICAgICAgICAgY29uc3Q9J2Jhc2gnLAogICAgICAgICAgICBkZXN0PSdzaGVsbCcsCiAgICAgICAgICAgIGhlbHA9J0VtaXQgY29tcGxldGlvbiBjb2RlIGZvciBiYXNoJykKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS16c2gnLCAnLXonLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX2NvbnN0JywKICAgICAgICAgICAgY29uc3Q9J3pzaCcsCiAgICAgICAgICAgIGRlc3Q9J3NoZWxsJywKICAgICAgICAgICAgaGVscD0nRW1pdCBjb21wbGV0aW9uIGNvZGUgZm9yIHpzaCcpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tZmlzaCcsICctZicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfY29uc3QnLAogICAgICAgICAgICBjb25zdD0nZmlzaCcsCiAgICAgICAgICAgIGRlc3Q9J3NoZWxsJywKICAgICAgICAgICAgaGVscD0nRW1pdCBjb21wbGV0aW9uIGNvZGUgZm9yIGZpc2gnKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgIiIiUHJpbnRzIHRoZSBjb21wbGV0aW9uIGNvZGUgb2YgdGhlIGdpdmVuIHNoZWxsIiIiCiAgICAgICAgc2hlbGxzID0gQ09NUExFVElPTl9TQ1JJUFRTLmtleXMoKQogICAgICAgIHNoZWxsX29wdGlvbnMgPSBbJy0tJyArIHNoZWxsIGZvciBzaGVsbCBpbiBzb3J0ZWQoc2hlbGxzKV0KICAgICAgICBpZiBvcHRpb25zLnNoZWxsIGluIHNoZWxsczoKICAgICAgICAgICAgc2NyaXB0ID0gQ09NUExFVElPTl9TQ1JJUFRTLmdldChvcHRpb25zLnNoZWxsLCAnJykKICAgICAgICAgICAgcHJpbnQoQkFTRV9DT01QTEVUSU9OICUgeydzY3JpcHQnOiBzY3JpcHQsICdzaGVsbCc6IG9wdGlvbnMuc2hlbGx9KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoCiAgICAgICAgICAgICAgICAnRVJST1I6IFlvdSBtdXN0IHBhc3MgJXNcbicgJSAnIG9yICcuam9pbihzaGVsbF9vcHRpb25zKQogICAgICAgICAgICApClBLAwQUAAAAAAAAACEA2R6ZpoIeAACCHgAANQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2Rvd25sb2FkLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQ29tbWFuZEVycm9yCmZyb20gcGlwLmluZGV4IGltcG9ydCBGb3JtYXRDb250cm9sCmZyb20gcGlwLnJlcSBpbXBvcnQgUmVxdWlyZW1lbnRTZXQKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IFJlcXVpcmVtZW50Q29tbWFuZApmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucwpmcm9tIHBpcC51dGlscyBpbXBvcnQgZW5zdXJlX2Rpciwgbm9ybWFsaXplX3BhdGgKZnJvbSBwaXAudXRpbHMuYnVpbGQgaW1wb3J0IEJ1aWxkRGlyZWN0b3J5CmZyb20gcGlwLnV0aWxzLmZpbGVzeXN0ZW0gaW1wb3J0IGNoZWNrX3BhdGhfb3duZXIKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBEb3dubG9hZENvbW1hbmQoUmVxdWlyZW1lbnRDb21tYW5kKToKICAgICIiIgogICAgRG93bmxvYWQgcGFja2FnZXMgZnJvbToKCiAgICAtIFB5UEkgKGFuZCBvdGhlciBpbmRleGVzKSB1c2luZyByZXF1aXJlbWVudCBzcGVjaWZpZXJzLgogICAgLSBWQ1MgcHJvamVjdCB1cmxzLgogICAgLSBMb2NhbCBwcm9qZWN0IGRpcmVjdG9yaWVzLgogICAgLSBMb2NhbCBvciByZW1vdGUgc291cmNlIGFyY2hpdmVzLgoKICAgIHBpcCBhbHNvIHN1cHBvcnRzIGRvd25sb2FkaW5nIGZyb20gInJlcXVpcmVtZW50cyBmaWxlcyIsIHdoaWNoIHByb3ZpZGUKICAgIGFuIGVhc3kgd2F5IHRvIHNwZWNpZnkgYSB3aG9sZSBlbnZpcm9ubWVudCB0byBiZSBkb3dubG9hZGVkLgogICAgIiIiCiAgICBuYW1lID0gJ2Rvd25sb2FkJwoKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cmVxdWlyZW1lbnQgc3BlY2lmaWVyPiBbcGFja2FnZS1pbmRleC1vcHRpb25zXSAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIC1yIDxyZXF1aXJlbWVudHMgZmlsZT4gW3BhY2thZ2UtaW5kZXgtb3B0aW9uc10gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDx2Y3MgcHJvamVjdCB1cmw+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8bG9jYWwgcHJvamVjdCBwYXRoPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIDxhcmNoaXZlIHVybC9wYXRoPiAuLi4iIiIKCiAgICBzdW1tYXJ5ID0gJ0Rvd25sb2FkIHBhY2thZ2VzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKERvd25sb2FkQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIGNtZF9vcHRzID0gc2VsZi5jbWRfb3B0cwoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuY29uc3RyYWludHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuZWRpdGFibGUoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZW1lbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmJ1aWxkX2RpcigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19kZXBzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmdsb2JhbF9vcHRpb25zKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5vbmx5X2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5zcmMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucHJlKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2NsZWFuKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnJlcXVpcmVfaGFzaGVzKCkpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctZCcsICctLWRlc3QnLCAnLS1kZXN0aW5hdGlvbi1kaXInLCAnLS1kZXN0aW5hdGlvbi1kaXJlY3RvcnknLAogICAgICAgICAgICBkZXN0PSdkb3dubG9hZF9kaXInLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PW9zLmN1cmRpciwKICAgICAgICAgICAgaGVscD0oIkRvd25sb2FkIHBhY2thZ2VzIGludG8gPGRpcj4uIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1wbGF0Zm9ybScsCiAgICAgICAgICAgIGRlc3Q9J3BsYXRmb3JtJywKICAgICAgICAgICAgbWV0YXZhcj0ncGxhdGZvcm0nLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9KCJPbmx5IGRvd25sb2FkIHdoZWVscyBjb21wYXRpYmxlIHdpdGggPHBsYXRmb3JtPi4gIgogICAgICAgICAgICAgICAgICAiRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtIG9mIHRoZSBydW5uaW5nIHN5c3RlbS4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXB5dGhvbi12ZXJzaW9uJywKICAgICAgICAgICAgZGVzdD0ncHl0aG9uX3ZlcnNpb24nLAogICAgICAgICAgICBtZXRhdmFyPSdweXRob25fdmVyc2lvbicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0oIk9ubHkgZG93bmxvYWQgd2hlZWxzIGNvbXBhdGlibGUgd2l0aCBQeXRob24gIgogICAgICAgICAgICAgICAgICAiaW50ZXJwcmV0ZXIgdmVyc2lvbiA8dmVyc2lvbj4uIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlICIKICAgICAgICAgICAgICAgICAgImN1cnJlbnQgc3lzdGVtIGludGVycHJldGVyIG1pbm9yIHZlcnNpb24gaXMgdXNlZC4gQSBtYWpvciAiCiAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIChlLmcuICcyJykgY2FuIGJlIHNwZWNpZmllZCB0byBtYXRjaCBhbGwgIgogICAgICAgICAgICAgICAgICAibWlub3IgcmV2cyBvZiB0aGF0IG1ham9yIHZlcnNpb24uICBBIG1pbm9yIHZlcnNpb24gIgogICAgICAgICAgICAgICAgICAiKGUuZy4gJzM0JykgY2FuIGFsc28gYmUgc3BlY2lmaWVkLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0taW1wbGVtZW50YXRpb24nLAogICAgICAgICAgICBkZXN0PSdpbXBsZW1lbnRhdGlvbicsCiAgICAgICAgICAgIG1ldGF2YXI9J2ltcGxlbWVudGF0aW9uJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSgiT25seSBkb3dubG9hZCB3aGVlbHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAiCiAgICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvbiA8aW1wbGVtZW50YXRpb24+LCBlLmcuICdwcCcsICdqeScsICdjcCcsICIKICAgICAgICAgICAgICAgICAgIiBvciAnaXAnLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSBjdXJyZW50ICIKICAgICAgICAgICAgICAgICAgImludGVycHJldGVyIGltcGxlbWVudGF0aW9uIGlzIHVzZWQuICBVc2UgJ3B5JyB0byBmb3JjZSAiCiAgICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvbi1hZ25vc3RpYyB3aGVlbHMuIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1hYmknLAogICAgICAgICAgICBkZXN0PSdhYmknLAogICAgICAgICAgICBtZXRhdmFyPSdhYmknLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9KCJPbmx5IGRvd25sb2FkIHdoZWVscyBjb21wYXRpYmxlIHdpdGggUHl0aG9uICIKICAgICAgICAgICAgICAgICAgImFiaSA8YWJpPiwgZS5nLiAncHlweV80MScuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSAiCiAgICAgICAgICAgICAgICAgICJjdXJyZW50IGludGVycHJldGVyIGFiaSB0YWcgaXMgdXNlZC4gIEdlbmVyYWxseSAiCiAgICAgICAgICAgICAgICAgICJ5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgLS1pbXBsZW1lbnRhdGlvbiwgIgogICAgICAgICAgICAgICAgICAiLS1wbGF0Zm9ybSwgYW5kIC0tcHl0aG9uLXZlcnNpb24gd2hlbiB1c2luZyAiCiAgICAgICAgICAgICAgICAgICJ0aGlzIG9wdGlvbi4iKSwKICAgICAgICApCgogICAgICAgIGluZGV4X29wdHMgPSBjbWRvcHRpb25zLm1ha2Vfb3B0aW9uX2dyb3VwKAogICAgICAgICAgICBjbWRvcHRpb25zLm5vbl9kZXByZWNhdGVkX2luZGV4X2dyb3VwLAogICAgICAgICAgICBzZWxmLnBhcnNlciwKICAgICAgICApCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgaW5kZXhfb3B0cykKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgb3B0aW9ucy5pZ25vcmVfaW5zdGFsbGVkID0gVHJ1ZQoKICAgICAgICBpZiBvcHRpb25zLnB5dGhvbl92ZXJzaW9uOgogICAgICAgICAgICBweXRob25fdmVyc2lvbnMgPSBbb3B0aW9ucy5weXRob25fdmVyc2lvbl0KICAgICAgICBlbHNlOgogICAgICAgICAgICBweXRob25fdmVyc2lvbnMgPSBOb25lCgogICAgICAgIGRpc3RfcmVzdHJpY3Rpb25fc2V0ID0gYW55KFsKICAgICAgICAgICAgb3B0aW9ucy5weXRob25fdmVyc2lvbiwKICAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSwKICAgICAgICAgICAgb3B0aW9ucy5hYmksCiAgICAgICAgICAgIG9wdGlvbnMuaW1wbGVtZW50YXRpb24sCiAgICAgICAgXSkKICAgICAgICBiaW5hcnlfb25seSA9IEZvcm1hdENvbnRyb2woc2V0KCksIHNldChbJzphbGw6J10pKQogICAgICAgIGlmIGRpc3RfcmVzdHJpY3Rpb25fc2V0IGFuZCBvcHRpb25zLmZvcm1hdF9jb250cm9sICE9IGJpbmFyeV9vbmx5OgogICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoCiAgICAgICAgICAgICAgICAiLS1vbmx5LWJpbmFyeT06YWxsOiBtdXN0IGJlIHNldCBhbmQgLS1uby1iaW5hcnkgbXVzdCBub3QgIgogICAgICAgICAgICAgICAgImJlIHNldCAob3IgbXVzdCBiZSBzZXQgdG8gOm5vbmU6KSB3aGVuIHJlc3RyaWN0aW5nIHBsYXRmb3JtICIKICAgICAgICAgICAgICAgICJhbmQgaW50ZXJwcmV0ZXIgY29uc3RyYWludHMgdXNpbmcgLS1weXRob24tdmVyc2lvbiwgIgogICAgICAgICAgICAgICAgIi0tcGxhdGZvcm0sIC0tYWJpLCBvciAtLWltcGxlbWVudGF0aW9uLiIKICAgICAgICAgICAgKQoKICAgICAgICBvcHRpb25zLnNyY19kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5zcmNfZGlyKQogICAgICAgIG9wdGlvbnMuZG93bmxvYWRfZGlyID0gbm9ybWFsaXplX3BhdGgob3B0aW9ucy5kb3dubG9hZF9kaXIpCgogICAgICAgIGVuc3VyZV9kaXIob3B0aW9ucy5kb3dubG9hZF9kaXIpCgogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgogICAgICAgICAgICBmaW5kZXIgPSBzZWxmLl9idWlsZF9wYWNrYWdlX2ZpbmRlcigKICAgICAgICAgICAgICAgIG9wdGlvbnM9b3B0aW9ucywKICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgIHBsYXRmb3JtPW9wdGlvbnMucGxhdGZvcm0sCiAgICAgICAgICAgICAgICBweXRob25fdmVyc2lvbnM9cHl0aG9uX3ZlcnNpb25zLAogICAgICAgICAgICAgICAgYWJpPW9wdGlvbnMuYWJpLAogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb249b3B0aW9ucy5pbXBsZW1lbnRhdGlvbiwKICAgICAgICAgICAgKQogICAgICAgICAgICBidWlsZF9kZWxldGUgPSAobm90IChvcHRpb25zLm5vX2NsZWFuIG9yIG9wdGlvbnMuYnVpbGRfZGlyKSkKICAgICAgICAgICAgaWYgb3B0aW9ucy5jYWNoZV9kaXIgYW5kIG5vdCBjaGVja19wYXRoX293bmVyKG9wdGlvbnMuY2FjaGVfZGlyKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJUaGUgZGlyZWN0b3J5ICclcycgb3IgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgbm90IG93bmVkICIKICAgICAgICAgICAgICAgICAgICAiYnkgdGhlIGN1cnJlbnQgdXNlciBhbmQgY2FjaGluZyB3aGVlbHMgaGFzIGJlZW4gIgogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZC4gY2hlY2sgdGhlIHBlcm1pc3Npb25zIGFuZCBvd25lciBvZiB0aGF0ICIKICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5LiBJZiBleGVjdXRpbmcgcGlwIHdpdGggc3VkbywgeW91IG1heSB3YW50ICIKICAgICAgICAgICAgICAgICAgICAic3VkbydzIC1IIGZsYWcuIiwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlX2RpciwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVfZGlyID0gTm9uZQoKICAgICAgICAgICAgd2l0aCBCdWlsZERpcmVjdG9yeShvcHRpb25zLmJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU9YnVpbGRfZGVsZXRlKSBhcyBidWlsZF9kaXI6CgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0ID0gUmVxdWlyZW1lbnRTZXQoCiAgICAgICAgICAgICAgICAgICAgYnVpbGRfZGlyPWJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICBzcmNfZGlyPW9wdGlvbnMuc3JjX2RpciwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXI9b3B0aW9ucy5kb3dubG9hZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2luc3RhbGxlZD1UcnVlLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9b3B0aW9ucy5pZ25vcmVfZGVwZW5kZW5jaWVzLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXM9b3B0aW9ucy5yZXF1aXJlX2hhc2hlcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2VsZi5wb3B1bGF0ZV9yZXF1aXJlbWVudF9zZXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LAogICAgICAgICAgICAgICAgICAgIGFyZ3MsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgTm9uZQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIG5vdCByZXF1aXJlbWVudF9zZXQuaGFzX3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQucHJlcGFyZV9maWxlcyhmaW5kZXIpCgogICAgICAgICAgICAgICAgZG93bmxvYWRlZCA9ICcgJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICByZXEubmFtZSBmb3IgcmVxIGluIHJlcXVpcmVtZW50X3NldC5zdWNjZXNzZnVsbHlfZG93bmxvYWRlZAogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgIGlmIGRvd25sb2FkZWQ6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICdTdWNjZXNzZnVsbHkgZG93bmxvYWRlZCAlcycsIGRvd25sb2FkZWQKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgIyBDbGVhbiB1cAogICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMubm9fY2xlYW46CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmNsZWFudXBfZmlsZXMoKQoKICAgICAgICByZXR1cm4gcmVxdWlyZW1lbnRfc2V0ClBLAwQUAAAAAAAAACEAw/bzYBMLAAATCwAAMwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2ZyZWV6ZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCgppbXBvcnQgcGlwCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgc3RkbGliX3BrZ3MKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAub3BlcmF0aW9ucy5mcmVlemUgaW1wb3J0IGZyZWV6ZQpmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWxDYWNoZQoKCkRFVl9QS0dTID0gKCdwaXAnLCAnc2V0dXB0b29scycsICdkaXN0cmlidXRlJywgJ3doZWVsJykKCgpjbGFzcyBGcmVlemVDb21tYW5kKENvbW1hbmQpOgogICAgIiIiCiAgICBPdXRwdXQgaW5zdGFsbGVkIHBhY2thZ2VzIGluIHJlcXVpcmVtZW50cyBmb3JtYXQuCgogICAgcGFja2FnZXMgYXJlIGxpc3RlZCBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgc29ydGVkIG9yZGVyLgogICAgIiIiCiAgICBuYW1lID0gJ2ZyZWV6ZScKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSIiIgogICAgc3VtbWFyeSA9ICdPdXRwdXQgaW5zdGFsbGVkIHBhY2thZ2VzIGluIHJlcXVpcmVtZW50cyBmb3JtYXQuJwogICAgbG9nX3N0cmVhbXMgPSAoImV4dDovL3N5cy5zdGRlcnIiLCAiZXh0Oi8vc3lzLnN0ZGVyciIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihGcmVlemVDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXInLCAnLS1yZXF1aXJlbWVudCcsCiAgICAgICAgICAgIGRlc3Q9J3JlcXVpcmVtZW50cycsCiAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICAgICAgbWV0YXZhcj0nZmlsZScsCiAgICAgICAgICAgIGhlbHA9IlVzZSB0aGUgb3JkZXIgaW4gdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBmaWxlIGFuZCBpdHMgIgogICAgICAgICAgICAgICAgICJjb21tZW50cyB3aGVuIGdlbmVyYXRpbmcgb3V0cHV0LiBUaGlzIG9wdGlvbiBjYW4gYmUgIgogICAgICAgICAgICAgICAgICJ1c2VkIG11bHRpcGxlIHRpbWVzLiIpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWYnLCAnLS1maW5kLWxpbmtzJywKICAgICAgICAgICAgZGVzdD0nZmluZF9saW5rcycsCiAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICAgICAgbWV0YXZhcj0nVVJMJywKICAgICAgICAgICAgaGVscD0nVVJMIGZvciBmaW5kaW5nIHBhY2thZ2VzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSAnCiAgICAgICAgICAgICAgICAgJ291dHB1dC4nKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1sJywgJy0tbG9jYWwnLAogICAgICAgICAgICBkZXN0PSdsb2NhbCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J0lmIGluIGEgdmlydHVhbGVudiB0aGF0IGhhcyBnbG9iYWwgYWNjZXNzLCBkbyBub3Qgb3V0cHV0ICcKICAgICAgICAgICAgICAgICAnZ2xvYmFsbHktaW5zdGFsbGVkIHBhY2thZ2VzLicpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS11c2VyJywKICAgICAgICAgICAgZGVzdD0ndXNlcicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J09ubHkgb3V0cHV0IHBhY2thZ2VzIGluc3RhbGxlZCBpbiB1c2VyLXNpdGUuJykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWFsbCcsCiAgICAgICAgICAgIGRlc3Q9J2ZyZWV6ZV9hbGwnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSdEbyBub3Qgc2tpcCB0aGVzZSBwYWNrYWdlcyBpbiB0aGUgb3V0cHV0OicKICAgICAgICAgICAgICAgICAnICVzJyAlICcsICcuam9pbihERVZfUEtHUykpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgc2VsZi5jbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGZvcm1hdF9jb250cm9sID0gcGlwLmluZGV4LkZvcm1hdENvbnRyb2woc2V0KCksIHNldCgpKQogICAgICAgIHdoZWVsX2NhY2hlID0gV2hlZWxDYWNoZShvcHRpb25zLmNhY2hlX2RpciwgZm9ybWF0X2NvbnRyb2wpCiAgICAgICAgc2tpcCA9IHNldChzdGRsaWJfcGtncykKICAgICAgICBpZiBub3Qgb3B0aW9ucy5mcmVlemVfYWxsOgogICAgICAgICAgICBza2lwLnVwZGF0ZShERVZfUEtHUykKCiAgICAgICAgZnJlZXplX2t3YXJncyA9IGRpY3QoCiAgICAgICAgICAgIHJlcXVpcmVtZW50PW9wdGlvbnMucmVxdWlyZW1lbnRzLAogICAgICAgICAgICBmaW5kX2xpbmtzPW9wdGlvbnMuZmluZF9saW5rcywKICAgICAgICAgICAgbG9jYWxfb25seT1vcHRpb25zLmxvY2FsLAogICAgICAgICAgICB1c2VyX29ubHk9b3B0aW9ucy51c2VyLAogICAgICAgICAgICBza2lwX3JlZ2V4PW9wdGlvbnMuc2tpcF9yZXF1aXJlbWVudHNfcmVnZXgsCiAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsCiAgICAgICAgICAgIHNraXA9c2tpcCkKCiAgICAgICAgZm9yIGxpbmUgaW4gZnJlZXplKCoqZnJlZXplX2t3YXJncyk6CiAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUobGluZSArICdcbicpClBLAwQUAAAAAAAAACEA+InspD0GAAA9BgAAMQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2hhc2gucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAuc3RhdHVzX2NvZGVzIGltcG9ydCBFUlJPUgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcmVhZF9jaHVua3MKZnJvbSBwaXAudXRpbHMuaGFzaGVzIGltcG9ydCBGQVZPUklURV9IQVNILCBTVFJPTkdfSEFTSEVTCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgSGFzaENvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiIKICAgIENvbXB1dGUgYSBoYXNoIG9mIGEgbG9jYWwgcGFja2FnZSBhcmNoaXZlLgoKICAgIFRoZXNlIGNhbiBiZSB1c2VkIHdpdGggLS1oYXNoIGluIGEgcmVxdWlyZW1lbnRzIGZpbGUgdG8gZG8gcmVwZWF0YWJsZQogICAgaW5zdGFsbHMuCgogICAgIiIiCiAgICBuYW1lID0gJ2hhc2gnCiAgICB1c2FnZSA9ICclcHJvZyBbb3B0aW9uc10gPGZpbGU+IC4uLicKICAgIHN1bW1hcnkgPSAnQ29tcHV0ZSBoYXNoZXMgb2YgcGFja2FnZSBhcmNoaXZlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihIYXNoQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWEnLCAnLS1hbGdvcml0aG0nLAogICAgICAgICAgICBkZXN0PSdhbGdvcml0aG0nLAogICAgICAgICAgICBjaG9pY2VzPVNUUk9OR19IQVNIRVMsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICBkZWZhdWx0PUZBVk9SSVRFX0hBU0gsCiAgICAgICAgICAgIGhlbHA9J1RoZSBoYXNoIGFsZ29yaXRobSB0byB1c2U6IG9uZSBvZiAlcycgJQogICAgICAgICAgICAgICAgICcsICcuam9pbihTVFJPTkdfSEFTSEVTKSkKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIHNlbGYuY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgc2VsZi5wYXJzZXIucHJpbnRfdXNhZ2Uoc3lzLnN0ZGVycikKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCgogICAgICAgIGFsZ29yaXRobSA9IG9wdGlvbnMuYWxnb3JpdGhtCiAgICAgICAgZm9yIHBhdGggaW4gYXJnczoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJyVzOlxuLS1oYXNoPSVzOiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgYWxnb3JpdGhtLCBfaGFzaF9vZl9maWxlKHBhdGgsIGFsZ29yaXRobSkpCgoKZGVmIF9oYXNoX29mX2ZpbGUocGF0aCwgYWxnb3JpdGhtKToKICAgICIiIlJldHVybiB0aGUgaGFzaCBkaWdlc3Qgb2YgYSBmaWxlLiIiIgogICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGFyY2hpdmU6CiAgICAgICAgaGFzaCA9IGhhc2hsaWIubmV3KGFsZ29yaXRobSkKICAgICAgICBmb3IgY2h1bmsgaW4gcmVhZF9jaHVua3MoYXJjaGl2ZSk6CiAgICAgICAgICAgIGhhc2gudXBkYXRlKGNodW5rKQogICAgcmV0dXJuIGhhc2guaGV4ZGlnZXN0KCkKUEsDBBQAAAAAAAAAIQAeFtCd1gMAANYDAAAxAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvaGVscC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZCwgU1VDQ0VTUwpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBDb21tYW5kRXJyb3IKCgpjbGFzcyBIZWxwQ29tbWFuZChDb21tYW5kKToKICAgICIiIlNob3cgaGVscCBmb3IgY29tbWFuZHMiIiIKICAgIG5hbWUgPSAnaGVscCcKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIDxjb21tYW5kPiIiIgogICAgc3VtbWFyeSA9ICdTaG93IGhlbHAgZm9yIGNvbW1hbmRzLicKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGZyb20gcGlwLmNvbW1hbmRzIGltcG9ydCBjb21tYW5kc19kaWN0LCBnZXRfc2ltaWxhcl9jb21tYW5kcwoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgJ3BpcCBoZWxwJyB3aXRoIG5vIGFyZ3MgaXMgaGFuZGxlZCBieSBwaXAuX19pbml0X18ucGFyc2VvcHQoKQogICAgICAgICAgICBjbWRfbmFtZSA9IGFyZ3NbMF0gICMgdGhlIGNvbW1hbmQgd2UgbmVlZCBoZWxwIGZvcgogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICByZXR1cm4gU1VDQ0VTUwoKICAgICAgICBpZiBjbWRfbmFtZSBub3QgaW4gY29tbWFuZHNfZGljdDoKICAgICAgICAgICAgZ3Vlc3MgPSBnZXRfc2ltaWxhcl9jb21tYW5kcyhjbWRfbmFtZSkKCiAgICAgICAgICAgIG1zZyA9IFsndW5rbm93biBjb21tYW5kICIlcyInICUgY21kX25hbWVdCiAgICAgICAgICAgIGlmIGd1ZXNzOgogICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgnbWF5YmUgeW91IG1lYW50ICIlcyInICUgZ3Vlc3MpCgogICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoJyAtICcuam9pbihtc2cpKQoKICAgICAgICBjb21tYW5kID0gY29tbWFuZHNfZGljdFtjbWRfbmFtZV0oKQogICAgICAgIGNvbW1hbmQucGFyc2VyLnByaW50X2hlbHAoKQoKICAgICAgICByZXR1cm4gU1VDQ0VTUwpQSwMEFAAAAAAAAAAhAEslhhYERAAABEQAADQAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9pbnN0YWxsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgb3MKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHdhcm5pbmdzCnRyeToKICAgIGltcG9ydCB3aGVlbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB3aGVlbCA9IE5vbmUKCmZyb20gcGlwLnJlcSBpbXBvcnQgUmVxdWlyZW1lbnRTZXQKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IFJlcXVpcmVtZW50Q29tbWFuZApmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IHZpcnR1YWxlbnZfbm9fZ2xvYmFsLCBkaXN0dXRpbHNfc2NoZW1lCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEluc3RhbGxhdGlvbkVycm9yLCBDb21tYW5kRXJyb3IsIFByZXZpb3VzQnVpbGREaXJFcnJvciwKKQpmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucwpmcm9tIHBpcC51dGlscyBpbXBvcnQgZW5zdXJlX2RpciwgZ2V0X2luc3RhbGxlZF92ZXJzaW9uCmZyb20gcGlwLnV0aWxzLmJ1aWxkIGltcG9ydCBCdWlsZERpcmVjdG9yeQpmcm9tIHBpcC51dGlscy5kZXByZWNhdGlvbiBpbXBvcnQgUmVtb3ZlZEluUGlwMTBXYXJuaW5nCmZyb20gcGlwLnV0aWxzLmZpbGVzeXN0ZW0gaW1wb3J0IGNoZWNrX3BhdGhfb3duZXIKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsQ2FjaGUsIFdoZWVsQnVpbGRlcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEluc3RhbGxDb21tYW5kKFJlcXVpcmVtZW50Q29tbWFuZCk6CiAgICAiIiIKICAgIEluc3RhbGwgcGFja2FnZXMgZnJvbToKCiAgICAtIFB5UEkgKGFuZCBvdGhlciBpbmRleGVzKSB1c2luZyByZXF1aXJlbWVudCBzcGVjaWZpZXJzLgogICAgLSBWQ1MgcHJvamVjdCB1cmxzLgogICAgLSBMb2NhbCBwcm9qZWN0IGRpcmVjdG9yaWVzLgogICAgLSBMb2NhbCBvciByZW1vdGUgc291cmNlIGFyY2hpdmVzLgoKICAgIHBpcCBhbHNvIHN1cHBvcnRzIGluc3RhbGxpbmcgZnJvbSAicmVxdWlyZW1lbnRzIGZpbGVzIiwgd2hpY2ggcHJvdmlkZQogICAgYW4gZWFzeSB3YXkgdG8gc3BlY2lmeSBhIHdob2xlIGVudmlyb25tZW50IHRvIGJlIGluc3RhbGxlZC4KICAgICIiIgogICAgbmFtZSA9ICdpbnN0YWxsJwoKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cmVxdWlyZW1lbnQgc3BlY2lmaWVyPiBbcGFja2FnZS1pbmRleC1vcHRpb25zXSAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIC1yIDxyZXF1aXJlbWVudHMgZmlsZT4gW3BhY2thZ2UtaW5kZXgtb3B0aW9uc10gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDx2Y3MgcHJvamVjdCB1cmw+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8bG9jYWwgcHJvamVjdCBwYXRoPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIDxhcmNoaXZlIHVybC9wYXRoPiAuLi4iIiIKCiAgICBzdW1tYXJ5ID0gJ0luc3RhbGwgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoSW5zdGFsbENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBjbWRfb3B0cyA9IHNlbGYuY21kX29wdHMKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmNvbnN0cmFpbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmVkaXRhYmxlKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnJlcXVpcmVtZW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5idWlsZF9kaXIoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy10JywgJy0tdGFyZ2V0JywKICAgICAgICAgICAgZGVzdD0ndGFyZ2V0X2RpcicsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0nSW5zdGFsbCBwYWNrYWdlcyBpbnRvIDxkaXI+LiAnCiAgICAgICAgICAgICAgICAgJ0J5IGRlZmF1bHQgdGhpcyB3aWxsIG5vdCByZXBsYWNlIGV4aXN0aW5nIGZpbGVzL2ZvbGRlcnMgaW4gJwogICAgICAgICAgICAgICAgICc8ZGlyPi4gVXNlIC0tdXBncmFkZSB0byByZXBsYWNlIGV4aXN0aW5nIHBhY2thZ2VzIGluIDxkaXI+ICcKICAgICAgICAgICAgICAgICAnd2l0aCBuZXcgdmVyc2lvbnMuJwogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1kJywgJy0tZG93bmxvYWQnLCAnLS1kb3dubG9hZC1kaXInLCAnLS1kb3dubG9hZC1kaXJlY3RvcnknLAogICAgICAgICAgICBkZXN0PSdkb3dubG9hZF9kaXInLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9KCJEb3dubG9hZCBwYWNrYWdlcyBpbnRvIDxkaXI+IGluc3RlYWQgb2YgaW5zdGFsbGluZyB0aGVtLCAiCiAgICAgICAgICAgICAgICAgICJyZWdhcmRsZXNzIG9mIHdoYXQncyBhbHJlYWR5IGluc3RhbGxlZC4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5zcmMoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1VJywgJy0tdXBncmFkZScsCiAgICAgICAgICAgIGRlc3Q9J3VwZ3JhZGUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSdVcGdyYWRlIGFsbCBzcGVjaWZpZWQgcGFja2FnZXMgdG8gdGhlIG5ld2VzdCBhdmFpbGFibGUgJwogICAgICAgICAgICAgICAgICd2ZXJzaW9uLiBUaGUgaGFuZGxpbmcgb2YgZGVwZW5kZW5jaWVzIGRlcGVuZHMgb24gdGhlICcKICAgICAgICAgICAgICAgICAndXBncmFkZS1zdHJhdGVneSB1c2VkLicKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXVwZ3JhZGUtc3RyYXRlZ3knLAogICAgICAgICAgICBkZXN0PSd1cGdyYWRlX3N0cmF0ZWd5JywKICAgICAgICAgICAgZGVmYXVsdD0nZWFnZXInLAogICAgICAgICAgICBjaG9pY2VzPVsnb25seS1pZi1uZWVkZWQnLCAnZWFnZXInXSwKICAgICAgICAgICAgaGVscD0nRGV0ZXJtaW5lcyBob3cgZGVwZW5kZW5jeSB1cGdyYWRpbmcgc2hvdWxkIGJlIGhhbmRsZWQuICcKICAgICAgICAgICAgICAgICAnImVhZ2VyIiAtIGRlcGVuZGVuY2llcyBhcmUgdXBncmFkZWQgcmVnYXJkbGVzcyBvZiAnCiAgICAgICAgICAgICAgICAgJ3doZXRoZXIgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgdmVyc2lvbiBzYXRpc2ZpZXMgdGhlICcKICAgICAgICAgICAgICAgICAncmVxdWlyZW1lbnRzIG9mIHRoZSB1cGdyYWRlZCBwYWNrYWdlKHMpLiAnCiAgICAgICAgICAgICAgICAgJyJvbmx5LWlmLW5lZWRlZCIgLSAgYXJlIHVwZ3JhZGVkIG9ubHkgd2hlbiB0aGV5IGRvIG5vdCAnCiAgICAgICAgICAgICAgICAgJ3NhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgdXBncmFkZWQgcGFja2FnZShzKS4nCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1mb3JjZS1yZWluc3RhbGwnLAogICAgICAgICAgICBkZXN0PSdmb3JjZV9yZWluc3RhbGwnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSdXaGVuIHVwZ3JhZGluZywgcmVpbnN0YWxsIGFsbCBwYWNrYWdlcyBldmVuIGlmIHRoZXkgYXJlICcKICAgICAgICAgICAgICAgICAnYWxyZWFkeSB1cC10by1kYXRlLicpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctSScsICctLWlnbm9yZS1pbnN0YWxsZWQnLAogICAgICAgICAgICBkZXN0PSdpZ25vcmVfaW5zdGFsbGVkJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0nSWdub3JlIHRoZSBpbnN0YWxsZWQgcGFja2FnZXMgKHJlaW5zdGFsbGluZyBpbnN0ZWFkKS4nKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuaWdub3JlX3JlcXVpcmVzX3B5dGhvbigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19kZXBzKCkpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5pbnN0YWxsX29wdGlvbnMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuZ2xvYmFsX29wdGlvbnMoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tdXNlcicsCiAgICAgICAgICAgIGRlc3Q9J3VzZV91c2VyX3NpdGUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSJJbnN0YWxsIHRvIHRoZSBQeXRob24gdXNlciBpbnN0YWxsIGRpcmVjdG9yeSBmb3IgeW91ciAiCiAgICAgICAgICAgICAgICAgInBsYXRmb3JtLiBUeXBpY2FsbHkgfi8ubG9jYWwvLCBvciAlQVBQREFUQSVcUHl0aG9uIG9uICIKICAgICAgICAgICAgICAgICAiV2luZG93cy4gKFNlZSB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gZm9yIHNpdGUuVVNFUl9CQVNFICIKICAgICAgICAgICAgICAgICAiZm9yIGZ1bGwgZGV0YWlscy4pIikKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tZWdnJywKICAgICAgICAgICAgZGVzdD0nYXNfZWdnJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0iSW5zdGFsbCBwYWNrYWdlcyBhcyBlZ2dzLCBub3QgJ2ZsYXQnLCBsaWtlIHBpcCBub3JtYWxseSAiCiAgICAgICAgICAgICAgICAgImRvZXMuIFRoaXMgb3B0aW9uIGlzIG5vdCBhYm91dCBpbnN0YWxsaW5nICpmcm9tKiBlZ2dzLiAiCiAgICAgICAgICAgICAgICAgIihXQVJOSU5HOiBCZWNhdXNlIHRoaXMgb3B0aW9uIG92ZXJyaWRlcyBwaXAncyBub3JtYWwgaW5zdGFsbCIKICAgICAgICAgICAgICAgICAiIGxvZ2ljLCByZXF1aXJlbWVudHMgZmlsZXMgbWF5IG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQuKSIpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXJvb3QnLAogICAgICAgICAgICBkZXN0PSdyb290X3BhdGgnLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9Ikluc3RhbGwgZXZlcnl0aGluZyByZWxhdGl2ZSB0byB0aGlzIGFsdGVybmF0ZSByb290ICIKICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5LiIpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXByZWZpeCcsCiAgICAgICAgICAgIGRlc3Q9J3ByZWZpeF9wYXRoJywKICAgICAgICAgICAgbWV0YXZhcj0nZGlyJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSJJbnN0YWxsYXRpb24gcHJlZml4IHdoZXJlIGxpYiwgYmluIGFuZCBvdGhlciB0b3AtbGV2ZWwgIgogICAgICAgICAgICAgICAgICJmb2xkZXJzIGFyZSBwbGFjZWQiKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAiLS1jb21waWxlIiwKICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICAgICAgZGVzdD0iY29tcGlsZSIsCiAgICAgICAgICAgIGRlZmF1bHQ9VHJ1ZSwKICAgICAgICAgICAgaGVscD0iQ29tcGlsZSBweSBmaWxlcyB0byBweWMiLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgIi0tbm8tY29tcGlsZSIsCiAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAogICAgICAgICAgICBkZXN0PSJjb21waWxlIiwKICAgICAgICAgICAgaGVscD0iRG8gbm90IGNvbXBpbGUgcHkgZmlsZXMgdG8gcHljIiwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy51c2Vfd2hlZWwoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fdXNlX3doZWVsKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5vbmx5X2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5wcmUoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fY2xlYW4oKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZV9oYXNoZXMoKSkKCiAgICAgICAgaW5kZXhfb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoCiAgICAgICAgICAgIGNtZG9wdGlvbnMuaW5kZXhfZ3JvdXAsCiAgICAgICAgICAgIHNlbGYucGFyc2VyLAogICAgICAgICkKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBpbmRleF9vcHRzKQogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBjbWRvcHRpb25zLnJlc29sdmVfd2hlZWxfbm9fdXNlX2JpbmFyeShvcHRpb25zKQogICAgICAgIGNtZG9wdGlvbnMuY2hlY2tfaW5zdGFsbF9idWlsZF9nbG9iYWwob3B0aW9ucykKCiAgICAgICAgaWYgb3B0aW9ucy5hc19lZ2c6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1lZ2cgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICIKICAgICAgICAgICAgICAgICJUaGlzIGZsYWcgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggbGFyZ2UgcGFydHMgb2YgcGlwLCBhbmQgIgogICAgICAgICAgICAgICAgImFjdHVhbGx5IHVzaW5nIGl0IGludmFsaWRhdGVzIHBpcCdzIGFiaWxpdHkgdG8gbWFuYWdlIHRoZSAiCiAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uIHByb2Nlc3MuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgbm8gIgogICAgICAgICAgICAgICAgImxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfYWxsX2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctYWxsLWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X3VudmVyaWZpZWQ6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmRvd25sb2FkX2RpcjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJwaXAgaW5zdGFsbCAtLWRvd25sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgIgogICAgICAgICAgICAgICAgInJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gUGlwIG5vdyBoYXMgYSBkb3dubG9hZCBjb21tYW5kIHRoYXQgIgogICAgICAgICAgICAgICAgInNob3VsZCBiZSB1c2VkIGluc3RlYWQuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQogICAgICAgICAgICBvcHRpb25zLmlnbm9yZV9pbnN0YWxsZWQgPSBUcnVlCgogICAgICAgIGlmIG9wdGlvbnMuYnVpbGRfZGlyOgogICAgICAgICAgICBvcHRpb25zLmJ1aWxkX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLmJ1aWxkX2RpcikKCiAgICAgICAgb3B0aW9ucy5zcmNfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMuc3JjX2RpcikKICAgICAgICBpbnN0YWxsX29wdGlvbnMgPSBvcHRpb25zLmluc3RhbGxfb3B0aW9ucyBvciBbXQogICAgICAgIGlmIG9wdGlvbnMudXNlX3VzZXJfc2l0ZToKICAgICAgICAgICAgaWYgb3B0aW9ucy5wcmVmaXhfcGF0aDoKICAgICAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCBjb21iaW5lICctLXVzZXInIGFuZCAnLS1wcmVmaXgnIGFzIHRoZXkgaW1wbHkgIgogICAgICAgICAgICAgICAgICAgICJkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGxvY2F0aW9ucyIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgdmlydHVhbGVudl9ub19nbG9iYWwoKToKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICJDYW4gbm90IHBlcmZvcm0gYSAnLS11c2VyJyBpbnN0YWxsLiBVc2VyIHNpdGUtcGFja2FnZXMgIgogICAgICAgICAgICAgICAgICAgICJhcmUgbm90IHZpc2libGUgaW4gdGhpcyB2aXJ0dWFsZW52LiIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLmFwcGVuZCgnLS11c2VyJykKICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLmFwcGVuZCgnLS1wcmVmaXg9JykKCiAgICAgICAgdGVtcF90YXJnZXRfZGlyID0gTm9uZQogICAgICAgIGlmIG9wdGlvbnMudGFyZ2V0X2RpcjoKICAgICAgICAgICAgb3B0aW9ucy5pZ25vcmVfaW5zdGFsbGVkID0gVHJ1ZQogICAgICAgICAgICB0ZW1wX3RhcmdldF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgICAgICAgICAgb3B0aW9ucy50YXJnZXRfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMudGFyZ2V0X2RpcikKICAgICAgICAgICAgaWYgKG9zLnBhdGguZXhpc3RzKG9wdGlvbnMudGFyZ2V0X2RpcikgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguaXNkaXIob3B0aW9ucy50YXJnZXRfZGlyKSk6CiAgICAgICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIlRhcmdldCBwYXRoIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5LCB3aWxsIG5vdCAiCiAgICAgICAgICAgICAgICAgICAgImNvbnRpbnVlLiIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLmFwcGVuZCgnLS1ob21lPScgKyB0ZW1wX3RhcmdldF9kaXIpCgogICAgICAgIGdsb2JhbF9vcHRpb25zID0gb3B0aW9ucy5nbG9iYWxfb3B0aW9ucyBvciBbXQoKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKCiAgICAgICAgICAgIGZpbmRlciA9IHNlbGYuX2J1aWxkX3BhY2thZ2VfZmluZGVyKG9wdGlvbnMsIHNlc3Npb24pCiAgICAgICAgICAgIGJ1aWxkX2RlbGV0ZSA9IChub3QgKG9wdGlvbnMubm9fY2xlYW4gb3Igb3B0aW9ucy5idWlsZF9kaXIpKQogICAgICAgICAgICB3aGVlbF9jYWNoZSA9IFdoZWVsQ2FjaGUob3B0aW9ucy5jYWNoZV9kaXIsIG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wpCiAgICAgICAgICAgIGlmIG9wdGlvbnMuY2FjaGVfZGlyIGFuZCBub3QgY2hlY2tfcGF0aF9vd25lcihvcHRpb25zLmNhY2hlX2Rpcik6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiVGhlIGRpcmVjdG9yeSAnJXMnIG9yIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG5vdCBvd25lZCAiCiAgICAgICAgICAgICAgICAgICAgImJ5IHRoZSBjdXJyZW50IHVzZXIgYW5kIGNhY2hpbmcgd2hlZWxzIGhhcyBiZWVuICIKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQuIGNoZWNrIHRoZSBwZXJtaXNzaW9ucyBhbmQgb3duZXIgb2YgdGhhdCAiCiAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeS4gSWYgZXhlY3V0aW5nIHBpcCB3aXRoIHN1ZG8sIHlvdSBtYXkgd2FudCAiCiAgICAgICAgICAgICAgICAgICAgInN1ZG8ncyAtSCBmbGFnLiIsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZV9kaXIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlX2RpciA9IE5vbmUKCiAgICAgICAgICAgIHdpdGggQnVpbGREaXJlY3Rvcnkob3B0aW9ucy5idWlsZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlPWJ1aWxkX2RlbGV0ZSkgYXMgYnVpbGRfZGlyOgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0ID0gUmVxdWlyZW1lbnRTZXQoCiAgICAgICAgICAgICAgICAgICAgYnVpbGRfZGlyPWJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICBzcmNfZGlyPW9wdGlvbnMuc3JjX2RpciwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXI9b3B0aW9ucy5kb3dubG9hZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgdXBncmFkZT1vcHRpb25zLnVwZ3JhZGUsCiAgICAgICAgICAgICAgICAgICAgdXBncmFkZV9zdHJhdGVneT1vcHRpb25zLnVwZ3JhZGVfc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgYXNfZWdnPW9wdGlvbnMuYXNfZWdnLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9pbnN0YWxsZWQ9b3B0aW9ucy5pZ25vcmVfaW5zdGFsbGVkLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9b3B0aW9ucy5pZ25vcmVfZGVwZW5kZW5jaWVzLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9yZXF1aXJlc19weXRob249b3B0aW9ucy5pZ25vcmVfcmVxdWlyZXNfcHl0aG9uLAogICAgICAgICAgICAgICAgICAgIGZvcmNlX3JlaW5zdGFsbD1vcHRpb25zLmZvcmNlX3JlaW5zdGFsbCwKICAgICAgICAgICAgICAgICAgICB1c2VfdXNlcl9zaXRlPW9wdGlvbnMudXNlX3VzZXJfc2l0ZSwKICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZGlyPXRlbXBfdGFyZ2V0X2RpciwKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgcHljb21waWxlPW9wdGlvbnMuY29tcGlsZSwKICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXM9b3B0aW9ucy5yZXF1aXJlX2hhc2hlcywKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBzZWxmLnBvcHVsYXRlX3JlcXVpcmVtZW50X3NldCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQsIGFyZ3MsIG9wdGlvbnMsIGZpbmRlciwgc2Vzc2lvbiwgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgbm90IHJlcXVpcmVtZW50X3NldC5oYXNfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kb3dubG9hZF9kaXIgb3Igbm90IHdoZWVsIG9yIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZV9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAjIG9uIC1kIGRvbid0IGRvIGNvbXBsZXggdGhpbmdzIGxpa2UgYnVpbGRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVlbHMsIGFuZCBkb24ndCB0cnkgdG8gYnVpbGQgd2hlZWxzIHdoZW4gd2hlZWwgaXMKICAgICAgICAgICAgICAgICAgICAgICAgIyBub3QgaW5zdGFsbGVkLgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQucHJlcGFyZV9maWxlcyhmaW5kZXIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBidWlsZCB3aGVlbHMgYmVmb3JlIGluc3RhbGwuCiAgICAgICAgICAgICAgICAgICAgICAgIHdiID0gV2hlZWxCdWlsZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfb3B0aW9ucz1bXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zPVtdLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICMgSWdub3JlIHRoZSByZXN1bHQ6IGEgZmFpbGVkIHdoZWVsIHdpbGwgYmUKICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnN0YWxsZWQgZnJvbSB0aGUgc2Rpc3QvdmNzIHdoYXRldmVyLgogICAgICAgICAgICAgICAgICAgICAgICB3Yi5idWlsZChhdXRvYnVpbGRpbmc9VHJ1ZSkKCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfZGlyOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuaW5zdGFsbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdD1vcHRpb25zLnJvb3RfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1vcHRpb25zLnByZWZpeF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZV9saWJfbG9jYXRpb25zID0gZ2V0X2xpYl9sb2NhdGlvbl9ndWVzc2VzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcj1vcHRpb25zLnVzZV91c2VyX3NpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21lPXRlbXBfdGFyZ2V0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q9b3B0aW9ucy5yb290X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9b3B0aW9ucy5wcmVmaXhfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICByZXFzID0gc29ydGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LnN1Y2Nlc3NmdWxseV9pbnN0YWxsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9b3BlcmF0b3IuYXR0cmdldHRlcignbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciByZXEgaW4gcmVxczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSByZXEubmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uID0gZ2V0X2luc3RhbGxlZF92ZXJzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEubmFtZSwgcG9zc2libGVfbGliX2xvY2F0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnN0YWxsZWRfdmVyc2lvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSArPSAnLScgKyBpbnN0YWxsZWRfdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkID0gJyAnLmpvaW4oaXRlbXMpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdTdWNjZXNzZnVsbHkgaW5zdGFsbGVkICVzJywgaW5zdGFsbGVkKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWQgPSAnICcuam9pbihbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEubmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHJlcSBpbiByZXF1aXJlbWVudF9zZXQuc3VjY2Vzc2Z1bGx5X2Rvd25sb2FkZWQKICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZG93bmxvYWRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTdWNjZXNzZnVsbHkgZG93bmxvYWRlZCAlcycsIGRvd25sb2FkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQcmV2aW91c0J1aWxkRGlyRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ub19jbGVhbiA9IFRydWUKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICAjIENsZWFuIHVwCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMubm9fY2xlYW46CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5jbGVhbnVwX2ZpbGVzKCkKCiAgICAgICAgaWYgb3B0aW9ucy50YXJnZXRfZGlyOgogICAgICAgICAgICBlbnN1cmVfZGlyKG9wdGlvbnMudGFyZ2V0X2RpcikKCiAgICAgICAgICAgICMgQ2hlY2tpbmcgYm90aCBwdXJlbGliIGFuZCBwbGF0bGliIGRpcmVjdG9yaWVzIGZvciBpbnN0YWxsZWQKICAgICAgICAgICAgIyBwYWNrYWdlcyB0byBiZSBtb3ZlZCB0byB0YXJnZXQgZGlyZWN0b3J5CiAgICAgICAgICAgIGxpYl9kaXJfbGlzdCA9IFtdCgogICAgICAgICAgICBwdXJlbGliX2RpciA9IGRpc3R1dGlsc19zY2hlbWUoJycsIGhvbWU9dGVtcF90YXJnZXRfZGlyKVsncHVyZWxpYiddCiAgICAgICAgICAgIHBsYXRsaWJfZGlyID0gZGlzdHV0aWxzX3NjaGVtZSgnJywgaG9tZT10ZW1wX3RhcmdldF9kaXIpWydwbGF0bGliJ10KCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHB1cmVsaWJfZGlyKToKICAgICAgICAgICAgICAgIGxpYl9kaXJfbGlzdC5hcHBlbmQocHVyZWxpYl9kaXIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsYXRsaWJfZGlyKSBhbmQgcGxhdGxpYl9kaXIgIT0gcHVyZWxpYl9kaXI6CiAgICAgICAgICAgICAgICBsaWJfZGlyX2xpc3QuYXBwZW5kKHBsYXRsaWJfZGlyKQoKICAgICAgICAgICAgZm9yIGxpYl9kaXIgaW4gbGliX2Rpcl9saXN0OgogICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gb3MubGlzdGRpcihsaWJfZGlyKToKICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaXRlbV9kaXIgPSBvcy5wYXRoLmpvaW4ob3B0aW9ucy50YXJnZXRfZGlyLCBpdGVtKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldF9pdGVtX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRpb25zLnVwZ3JhZGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFyZ2V0IGRpcmVjdG9yeSAlcyBhbHJlYWR5IGV4aXN0cy4gU3BlY2lmeSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdXBncmFkZSB0byBmb3JjZSByZXBsYWNlbWVudC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pdGVtX2RpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsodGFyZ2V0X2l0ZW1fZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUYXJnZXQgZGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzIGFuZCBpcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EgbGluay4gUGlwIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgcmVwbGFjZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtzLCBwbGVhc2UgcmVtb3ZlIGlmIHJlcGxhY2VtZW50IGlzICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzaXJlZC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pdGVtX2RpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0YXJnZXRfaXRlbV9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0YXJnZXRfaXRlbV9kaXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGFyZ2V0X2l0ZW1fZGlyKQoKICAgICAgICAgICAgICAgICAgICBzaHV0aWwubW92ZSgKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGxpYl9kaXIsIGl0ZW0pLAogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaXRlbV9kaXIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF90YXJnZXRfZGlyKQogICAgICAgIHJldHVybiByZXF1aXJlbWVudF9zZXQKCgpkZWYgZ2V0X2xpYl9sb2NhdGlvbl9ndWVzc2VzKCphcmdzLCAqKmt3YXJncyk6CiAgICBzY2hlbWUgPSBkaXN0dXRpbHNfc2NoZW1lKCcnLCAqYXJncywgKiprd2FyZ3MpCiAgICByZXR1cm4gW3NjaGVtZVsncHVyZWxpYiddLCBzY2hlbWVbJ3BsYXRsaWInXV0KUEsDBBQAAAAAAAAAIQAPS8c4aSwAAGksAAAxAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvbGlzdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgd2FybmluZ3MKdHJ5OgogICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IHppcF9sb25nZXN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBpemlwX2xvbmdlc3QgYXMgemlwX2xvbmdlc3QKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHNpeAoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQ29tbWFuZEVycm9yCmZyb20gcGlwLmluZGV4IGltcG9ydCBQYWNrYWdlRmluZGVyCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoCiAgICBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMsIGRpc3RfaXNfZWRpdGFibGUpCmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAuY21kb3B0aW9ucyBpbXBvcnQgbWFrZV9vcHRpb25fZ3JvdXAsIGluZGV4X2dyb3VwCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBMaXN0Q29tbWFuZChDb21tYW5kKToKICAgICIiIgogICAgTGlzdCBpbnN0YWxsZWQgcGFja2FnZXMsIGluY2x1ZGluZyBlZGl0YWJsZXMuCgogICAgUGFja2FnZXMgYXJlIGxpc3RlZCBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgc29ydGVkIG9yZGVyLgogICAgIiIiCiAgICBuYW1lID0gJ2xpc3QnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10iIiIKICAgIHN1bW1hcnkgPSAnTGlzdCBpbnN0YWxsZWQgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoTGlzdENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBjbWRfb3B0cyA9IHNlbGYuY21kX29wdHMKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1vJywgJy0tb3V0ZGF0ZWQnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdMaXN0IG91dGRhdGVkIHBhY2thZ2VzJykKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXUnLCAnLS11cHRvZGF0ZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J0xpc3QgdXB0b2RhdGUgcGFja2FnZXMnKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctZScsICctLWVkaXRhYmxlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nTGlzdCBlZGl0YWJsZSBwcm9qZWN0cy4nKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctbCcsICctLWxvY2FsJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0oJ0lmIGluIGEgdmlydHVhbGVudiB0aGF0IGhhcyBnbG9iYWwgYWNjZXNzLCBkbyBub3QgbGlzdCAnCiAgICAgICAgICAgICAgICAgICdnbG9iYWxseS1pbnN0YWxsZWQgcGFja2FnZXMuJyksCiAgICAgICAgKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tdXNlcicsCiAgICAgICAgICAgIGRlc3Q9J3VzZXInLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdPbmx5IG91dHB1dCBwYWNrYWdlcyBpbnN0YWxsZWQgaW4gdXNlci1zaXRlLicpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXByZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9KCJJbmNsdWRlIHByZS1yZWxlYXNlIGFuZCBkZXZlbG9wbWVudCB2ZXJzaW9ucy4gQnkgZGVmYXVsdCwgIgogICAgICAgICAgICAgICAgICAicGlwIG9ubHkgZmluZHMgc3RhYmxlIHZlcnNpb25zLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tZm9ybWF0JywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgIGRlc3Q9J2xpc3RfZm9ybWF0JywKICAgICAgICAgICAgY2hvaWNlcz0oJ2xlZ2FjeScsICdjb2x1bW5zJywgJ2ZyZWV6ZScsICdqc29uJyksCiAgICAgICAgICAgIGhlbHA9IlNlbGVjdCB0aGUgb3V0cHV0IGZvcm1hdCBhbW9uZzogbGVnYWN5IChkZWZhdWx0KSwgY29sdW1ucywgIgogICAgICAgICAgICAgICAgICJmcmVlemUgb3IganNvbi4iLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tbm90LXJlcXVpcmVkJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVzdD0nbm90X3JlcXVpcmVkJywKICAgICAgICAgICAgaGVscD0iTGlzdCBwYWNrYWdlcyB0aGF0IGFyZSBub3QgZGVwZW5kZW5jaWVzIG9mICIKICAgICAgICAgICAgICAgICAiaW5zdGFsbGVkIHBhY2thZ2VzLiIsCiAgICAgICAgKQoKICAgICAgICBpbmRleF9vcHRzID0gbWFrZV9vcHRpb25fZ3JvdXAoaW5kZXhfZ3JvdXAsIHNlbGYucGFyc2VyKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGluZGV4X29wdHMpCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBjbWRfb3B0cykKCiAgICBkZWYgX2J1aWxkX3BhY2thZ2VfZmluZGVyKHNlbGYsIG9wdGlvbnMsIGluZGV4X3VybHMsIHNlc3Npb24pOgogICAgICAgICIiIgogICAgICAgIENyZWF0ZSBhIHBhY2thZ2UgZmluZGVyIGFwcHJvcHJpYXRlIHRvIHRoaXMgbGlzdCBjb21tYW5kLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBQYWNrYWdlRmluZGVyKAogICAgICAgICAgICBmaW5kX2xpbmtzPW9wdGlvbnMuZmluZF9saW5rcywKICAgICAgICAgICAgaW5kZXhfdXJscz1pbmRleF91cmxzLAogICAgICAgICAgICBhbGxvd19hbGxfcHJlcmVsZWFzZXM9b3B0aW9ucy5wcmUsCiAgICAgICAgICAgIHRydXN0ZWRfaG9zdHM9b3B0aW9ucy50cnVzdGVkX2hvc3RzLAogICAgICAgICAgICBwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3M9b3B0aW9ucy5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MsCiAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICApCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBpZiBvcHRpb25zLmFsbG93X2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgbm8gIgogICAgICAgICAgICAgICAgImxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfYWxsX2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctYWxsLWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X3VudmVyaWZpZWQ6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmxpc3RfZm9ybWF0IGlzIE5vbmU6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiVGhlIGRlZmF1bHQgZm9ybWF0IHdpbGwgc3dpdGNoIHRvIGNvbHVtbnMgaW4gdGhlIGZ1dHVyZS4gIgogICAgICAgICAgICAgICAgIllvdSBjYW4gdXNlIC0tZm9ybWF0PShsZWdhY3l8Y29sdW1ucykgKG9yIGRlZmluZSBhICIKICAgICAgICAgICAgICAgICJmb3JtYXQ9KGxlZ2FjeXxjb2x1bW5zKSBpbiB5b3VyIHBpcC5jb25mIHVuZGVyIHRoZSBbbGlzdF0gIgogICAgICAgICAgICAgICAgInNlY3Rpb24pIHRvIGRpc2FibGUgdGhpcyB3YXJuaW5nLiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5vdXRkYXRlZCBhbmQgb3B0aW9ucy51cHRvZGF0ZToKICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgIk9wdGlvbnMgLS1vdXRkYXRlZCBhbmQgLS11cHRvZGF0ZSBjYW5ub3QgYmUgY29tYmluZWQuIikKCiAgICAgICAgcGFja2FnZXMgPSBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMoCiAgICAgICAgICAgIGxvY2FsX29ubHk9b3B0aW9ucy5sb2NhbCwKICAgICAgICAgICAgdXNlcl9vbmx5PW9wdGlvbnMudXNlciwKICAgICAgICAgICAgZWRpdGFibGVzX29ubHk9b3B0aW9ucy5lZGl0YWJsZSwKICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMub3V0ZGF0ZWQ6CiAgICAgICAgICAgIHBhY2thZ2VzID0gc2VsZi5nZXRfb3V0ZGF0ZWQocGFja2FnZXMsIG9wdGlvbnMpCiAgICAgICAgZWxpZiBvcHRpb25zLnVwdG9kYXRlOgogICAgICAgICAgICBwYWNrYWdlcyA9IHNlbGYuZ2V0X3VwdG9kYXRlKHBhY2thZ2VzLCBvcHRpb25zKQoKICAgICAgICBpZiBvcHRpb25zLm5vdF9yZXF1aXJlZDoKICAgICAgICAgICAgcGFja2FnZXMgPSBzZWxmLmdldF9ub3RfcmVxdWlyZWQocGFja2FnZXMsIG9wdGlvbnMpCgogICAgICAgIHNlbGYub3V0cHV0X3BhY2thZ2VfbGlzdGluZyhwYWNrYWdlcywgb3B0aW9ucykKCiAgICBkZWYgZ2V0X291dGRhdGVkKHNlbGYsIHBhY2thZ2VzLCBvcHRpb25zKToKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBkaXN0IGZvciBkaXN0IGluIHNlbGYuaXRlcl9wYWNrYWdlc19sYXRlc3RfaW5mb3MocGFja2FnZXMsIG9wdGlvbnMpCiAgICAgICAgICAgIGlmIGRpc3QubGF0ZXN0X3ZlcnNpb24gPiBkaXN0LnBhcnNlZF92ZXJzaW9uCiAgICAgICAgXQoKICAgIGRlZiBnZXRfdXB0b2RhdGUoc2VsZiwgcGFja2FnZXMsIG9wdGlvbnMpOgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIGRpc3QgZm9yIGRpc3QgaW4gc2VsZi5pdGVyX3BhY2thZ2VzX2xhdGVzdF9pbmZvcyhwYWNrYWdlcywgb3B0aW9ucykKICAgICAgICAgICAgaWYgZGlzdC5sYXRlc3RfdmVyc2lvbiA9PSBkaXN0LnBhcnNlZF92ZXJzaW9uCiAgICAgICAgXQoKICAgIGRlZiBnZXRfbm90X3JlcXVpcmVkKHNlbGYsIHBhY2thZ2VzLCBvcHRpb25zKToKICAgICAgICBkZXBfa2V5cyA9IHNldCgpCiAgICAgICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgICAgIGRlcF9rZXlzLnVwZGF0ZShyZXF1aXJlbWVudC5rZXkgZm9yIHJlcXVpcmVtZW50IGluIGRpc3QucmVxdWlyZXMoKSkKICAgICAgICByZXR1cm4gc2V0KHBrZyBmb3IgcGtnIGluIHBhY2thZ2VzIGlmIHBrZy5rZXkgbm90IGluIGRlcF9rZXlzKQoKICAgIGRlZiBpdGVyX3BhY2thZ2VzX2xhdGVzdF9pbmZvcyhzZWxmLCBwYWNrYWdlcywgb3B0aW9ucyk6CiAgICAgICAgaW5kZXhfdXJscyA9IFtvcHRpb25zLmluZGV4X3VybF0gKyBvcHRpb25zLmV4dHJhX2luZGV4X3VybHMKICAgICAgICBpZiBvcHRpb25zLm5vX2luZGV4OgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0lnbm9yaW5nIGluZGV4ZXM6ICVzJywgJywnLmpvaW4oaW5kZXhfdXJscykpCiAgICAgICAgICAgIGluZGV4X3VybHMgPSBbXQoKICAgICAgICBkZXBlbmRlbmN5X2xpbmtzID0gW10KICAgICAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0Jyk6CiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzLmV4dGVuZCgKICAgICAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZGVwZW5kZW5jeV9saW5rcy50eHQnKSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKG9wdGlvbnMpIGFzIHNlc3Npb246CiAgICAgICAgICAgIGZpbmRlciA9IHNlbGYuX2J1aWxkX3BhY2thZ2VfZmluZGVyKG9wdGlvbnMsIGluZGV4X3VybHMsIHNlc3Npb24pCiAgICAgICAgICAgIGZpbmRlci5hZGRfZGVwZW5kZW5jeV9saW5rcyhkZXBlbmRlbmN5X2xpbmtzKQoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgICAgICAgICB0eXAgPSAndW5rbm93bicKICAgICAgICAgICAgICAgIGFsbF9jYW5kaWRhdGVzID0gZmluZGVyLmZpbmRfYWxsX2NhbmRpZGF0ZXMoZGlzdC5rZXkpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5wcmU6CiAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgICAgICBhbGxfY2FuZGlkYXRlcyA9IFtjYW5kaWRhdGUgZm9yIGNhbmRpZGF0ZSBpbiBhbGxfY2FuZGlkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjYW5kaWRhdGUudmVyc2lvbi5pc19wcmVyZWxlYXNlXQoKICAgICAgICAgICAgICAgIGlmIG5vdCBhbGxfY2FuZGlkYXRlczoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUgPSBtYXgoYWxsX2NhbmRpZGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9ZmluZGVyLl9jYW5kaWRhdGVfc29ydF9rZXkpCiAgICAgICAgICAgICAgICByZW1vdGVfdmVyc2lvbiA9IGJlc3RfY2FuZGlkYXRlLnZlcnNpb24KICAgICAgICAgICAgICAgIGlmIGJlc3RfY2FuZGlkYXRlLmxvY2F0aW9uLmlzX3doZWVsOgogICAgICAgICAgICAgICAgICAgIHR5cCA9ICd3aGVlbCcKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdHlwID0gJ3NkaXN0JwogICAgICAgICAgICAgICAgIyBUaGlzIGlzIGRpcnR5IGJ1dCBtYWtlcyB0aGUgcmVzdCBvZiB0aGUgY29kZSBtdWNoIGNsZWFuZXIKICAgICAgICAgICAgICAgIGRpc3QubGF0ZXN0X3ZlcnNpb24gPSByZW1vdGVfdmVyc2lvbgogICAgICAgICAgICAgICAgZGlzdC5sYXRlc3RfZmlsZXR5cGUgPSB0eXAKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCiAgICBkZWYgb3V0cHV0X2xlZ2FjeShzZWxmLCBkaXN0KToKICAgICAgICBpZiBkaXN0X2lzX2VkaXRhYmxlKGRpc3QpOgogICAgICAgICAgICByZXR1cm4gJyVzICglcywgJXMpJyAlICgKICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICAgICAgZGlzdC52ZXJzaW9uLAogICAgICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAnJXMgKCVzKScgJSAoZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbikKCiAgICBkZWYgb3V0cHV0X2xlZ2FjeV9sYXRlc3Qoc2VsZiwgZGlzdCk6CiAgICAgICAgcmV0dXJuICclcyAtIExhdGVzdDogJXMgWyVzXScgJSAoCiAgICAgICAgICAgIHNlbGYub3V0cHV0X2xlZ2FjeShkaXN0KSwKICAgICAgICAgICAgZGlzdC5sYXRlc3RfdmVyc2lvbiwKICAgICAgICAgICAgZGlzdC5sYXRlc3RfZmlsZXR5cGUsCiAgICAgICAgKQoKICAgIGRlZiBvdXRwdXRfcGFja2FnZV9saXN0aW5nKHNlbGYsIHBhY2thZ2VzLCBvcHRpb25zKToKICAgICAgICBwYWNrYWdlcyA9IHNvcnRlZCgKICAgICAgICAgICAgcGFja2FnZXMsCiAgICAgICAgICAgIGtleT1sYW1iZGEgZGlzdDogZGlzdC5wcm9qZWN0X25hbWUubG93ZXIoKSwKICAgICAgICApCiAgICAgICAgaWYgb3B0aW9ucy5saXN0X2Zvcm1hdCA9PSAnY29sdW1ucycgYW5kIHBhY2thZ2VzOgogICAgICAgICAgICBkYXRhLCBoZWFkZXIgPSBmb3JtYXRfZm9yX2NvbHVtbnMocGFja2FnZXMsIG9wdGlvbnMpCiAgICAgICAgICAgIHNlbGYub3V0cHV0X3BhY2thZ2VfbGlzdGluZ19jb2x1bW5zKGRhdGEsIGhlYWRlcikKICAgICAgICBlbGlmIG9wdGlvbnMubGlzdF9mb3JtYXQgPT0gJ2ZyZWV6ZSc6CiAgICAgICAgICAgIGZvciBkaXN0IGluIHBhY2thZ2VzOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIiVzPT0lcyIsIGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24pCiAgICAgICAgZWxpZiBvcHRpb25zLmxpc3RfZm9ybWF0ID09ICdqc29uJzoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oZm9ybWF0X2Zvcl9qc29uKHBhY2thZ2VzLCBvcHRpb25zKSkKICAgICAgICBlbHNlOiAgIyBsZWdhY3kKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgICAgICAgICBpZiBvcHRpb25zLm91dGRhdGVkOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYub3V0cHV0X2xlZ2FjeV9sYXRlc3QoZGlzdCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYub3V0cHV0X2xlZ2FjeShkaXN0KSkKCiAgICBkZWYgb3V0cHV0X3BhY2thZ2VfbGlzdGluZ19jb2x1bW5zKHNlbGYsIGRhdGEsIGhlYWRlcik6CiAgICAgICAgIyBpbnNlcnQgdGhlIGhlYWRlciBmaXJzdDogd2UgbmVlZCB0byBrbm93IHRoZSBzaXplIG9mIGNvbHVtbiBuYW1lcwogICAgICAgIGlmIGxlbihkYXRhKSA+IDA6CiAgICAgICAgICAgIGRhdGEuaW5zZXJ0KDAsIGhlYWRlcikKCiAgICAgICAgcGtnX3N0cmluZ3MsIHNpemVzID0gdGFidWxhdGUoZGF0YSkKCiAgICAgICAgIyBDcmVhdGUgYW5kIGFkZCBhIHNlcGFyYXRvci4KICAgICAgICBpZiBsZW4oZGF0YSkgPiAwOgogICAgICAgICAgICBwa2dfc3RyaW5ncy5pbnNlcnQoMSwgIiAiLmpvaW4obWFwKGxhbWJkYSB4OiAnLScgKiB4LCBzaXplcykpKQoKICAgICAgICBmb3IgdmFsIGluIHBrZ19zdHJpbmdzOgogICAgICAgICAgICBsb2dnZXIuaW5mbyh2YWwpCgoKZGVmIHRhYnVsYXRlKHZhbHMpOgogICAgIyBGcm9tIHBmbW9vcmUgb24gR2l0SHViOgogICAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzM2NTEjaXNzdWVjb21tZW50LTIxNjkzMjU2NAogICAgYXNzZXJ0IGxlbih2YWxzKSA+IDAKCiAgICBzaXplcyA9IFswXSAqIG1heChsZW4oeCkgZm9yIHggaW4gdmFscykKICAgIGZvciByb3cgaW4gdmFsczoKICAgICAgICBzaXplcyA9IFttYXgocywgbGVuKHN0cihjKSkpIGZvciBzLCBjIGluIHppcF9sb25nZXN0KHNpemVzLCByb3cpXQoKICAgIHJlc3VsdCA9IFtdCiAgICBmb3Igcm93IGluIHZhbHM6CiAgICAgICAgZGlzcGxheSA9ICIgIi5qb2luKFtzdHIoYykubGp1c3QocykgaWYgYyBpcyBub3QgTm9uZSBlbHNlICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcywgYyBpbiB6aXBfbG9uZ2VzdChzaXplcywgcm93KV0pCiAgICAgICAgcmVzdWx0LmFwcGVuZChkaXNwbGF5KQoKICAgIHJldHVybiByZXN1bHQsIHNpemVzCgoKZGVmIGZvcm1hdF9mb3JfY29sdW1ucyhwa2dzLCBvcHRpb25zKToKICAgICIiIgogICAgQ29udmVydCB0aGUgcGFja2FnZSBkYXRhIGludG8gc29tZXRoaW5nIHVzYWJsZQogICAgYnkgb3V0cHV0X3BhY2thZ2VfbGlzdGluZ19jb2x1bW5zLgogICAgIiIiCiAgICBydW5uaW5nX291dGRhdGVkID0gb3B0aW9ucy5vdXRkYXRlZAogICAgIyBBZGp1c3QgdGhlIGhlYWRlciBmb3IgdGhlIGBwaXAgbGlzdCAtLW91dGRhdGVkYCBjYXNlLgogICAgaWYgcnVubmluZ19vdXRkYXRlZDoKICAgICAgICBoZWFkZXIgPSBbIlBhY2thZ2UiLCAiVmVyc2lvbiIsICJMYXRlc3QiLCAiVHlwZSJdCiAgICBlbHNlOgogICAgICAgIGhlYWRlciA9IFsiUGFja2FnZSIsICJWZXJzaW9uIl0KCiAgICBkYXRhID0gW10KICAgIGlmIGFueShkaXN0X2lzX2VkaXRhYmxlKHgpIGZvciB4IGluIHBrZ3MpOgogICAgICAgIGhlYWRlci5hcHBlbmQoIkxvY2F0aW9uIikKCiAgICBmb3IgcHJvaiBpbiBwa2dzOgogICAgICAgICMgaWYgd2UncmUgd29ya2luZyBvbiB0aGUgJ291dGRhdGVkJyBsaXN0LCBzZXBhcmF0ZSBvdXQgdGhlCiAgICAgICAgIyBsYXRlc3RfdmVyc2lvbiBhbmQgdHlwZQogICAgICAgIHJvdyA9IFtwcm9qLnByb2plY3RfbmFtZSwgcHJvai52ZXJzaW9uXQoKICAgICAgICBpZiBydW5uaW5nX291dGRhdGVkOgogICAgICAgICAgICByb3cuYXBwZW5kKHByb2oubGF0ZXN0X3ZlcnNpb24pCiAgICAgICAgICAgIHJvdy5hcHBlbmQocHJvai5sYXRlc3RfZmlsZXR5cGUpCgogICAgICAgIGlmIGRpc3RfaXNfZWRpdGFibGUocHJvaik6CiAgICAgICAgICAgIHJvdy5hcHBlbmQocHJvai5sb2NhdGlvbikKCiAgICAgICAgZGF0YS5hcHBlbmQocm93KQoKICAgIHJldHVybiBkYXRhLCBoZWFkZXIKCgpkZWYgZm9ybWF0X2Zvcl9qc29uKHBhY2thZ2VzLCBvcHRpb25zKToKICAgIGRhdGEgPSBbXQogICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgaW5mbyA9IHsKICAgICAgICAgICAgJ25hbWUnOiBkaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgJ3ZlcnNpb24nOiBzaXgudGV4dF90eXBlKGRpc3QudmVyc2lvbiksCiAgICAgICAgfQogICAgICAgIGlmIG9wdGlvbnMub3V0ZGF0ZWQ6CiAgICAgICAgICAgIGluZm9bJ2xhdGVzdF92ZXJzaW9uJ10gPSBzaXgudGV4dF90eXBlKGRpc3QubGF0ZXN0X3ZlcnNpb24pCiAgICAgICAgICAgIGluZm9bJ2xhdGVzdF9maWxldHlwZSddID0gZGlzdC5sYXRlc3RfZmlsZXR5cGUKICAgICAgICBkYXRhLmFwcGVuZChpbmZvKQogICAgcmV0dXJuIGpzb24uZHVtcHMoZGF0YSkKUEsDBBQAAAAAAAAAIQCuQoTclhEAAJYRAAAzAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvc2VhcmNoLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBzeXMKaW1wb3J0IHRleHR3cmFwCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZCwgU1VDQ0VTUwpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IE9yZGVyZWREaWN0CmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBQaXBYbWxycGNUcmFuc3BvcnQKZnJvbSBwaXAubW9kZWxzIGltcG9ydCBQeVBJCmZyb20gcGlwLnV0aWxzIGltcG9ydCBnZXRfdGVybWluYWxfc2l6ZQpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IENvbW1hbmRFcnJvcgpmcm9tIHBpcC5zdGF0dXNfY29kZXMgaW1wb3J0IE5PX01BVENIRVNfRk9VTkQKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgcGFyc2UgYXMgcGFyc2VfdmVyc2lvbgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCB4bWxycGNfY2xpZW50CgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgU2VhcmNoQ29tbWFuZChDb21tYW5kKToKICAgICIiIlNlYXJjaCBmb3IgUHlQSSBwYWNrYWdlcyB3aG9zZSBuYW1lIG9yIHN1bW1hcnkgY29udGFpbnMgPHF1ZXJ5Pi4iIiIKICAgIG5hbWUgPSAnc2VhcmNoJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxxdWVyeT4iIiIKICAgIHN1bW1hcnkgPSAnU2VhcmNoIFB5UEkgZm9yIHBhY2thZ2VzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKFNlYXJjaENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1pJywgJy0taW5kZXgnLAogICAgICAgICAgICBkZXN0PSdpbmRleCcsCiAgICAgICAgICAgIG1ldGF2YXI9J1VSTCcsCiAgICAgICAgICAgIGRlZmF1bHQ9UHlQSS5weXBpX3VybCwKICAgICAgICAgICAgaGVscD0nQmFzZSBVUkwgb2YgUHl0aG9uIFBhY2thZ2UgSW5kZXggKGRlZmF1bHQgJWRlZmF1bHQpJykKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBzZWxmLmNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcignTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCAoc2VhcmNoIHF1ZXJ5KS4nKQogICAgICAgIHF1ZXJ5ID0gYXJncwogICAgICAgIHB5cGlfaGl0cyA9IHNlbGYuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKQogICAgICAgIGhpdHMgPSB0cmFuc2Zvcm1faGl0cyhweXBpX2hpdHMpCgogICAgICAgIHRlcm1pbmFsX3dpZHRoID0gTm9uZQogICAgICAgIGlmIHN5cy5zdGRvdXQuaXNhdHR5KCk6CiAgICAgICAgICAgIHRlcm1pbmFsX3dpZHRoID0gZ2V0X3Rlcm1pbmFsX3NpemUoKVswXQoKICAgICAgICBwcmludF9yZXN1bHRzKGhpdHMsIHRlcm1pbmFsX3dpZHRoPXRlcm1pbmFsX3dpZHRoKQogICAgICAgIGlmIHB5cGlfaGl0czoKICAgICAgICAgICAgcmV0dXJuIFNVQ0NFU1MKICAgICAgICByZXR1cm4gTk9fTUFUQ0hFU19GT1VORAoKICAgIGRlZiBzZWFyY2goc2VsZiwgcXVlcnksIG9wdGlvbnMpOgogICAgICAgIGluZGV4X3VybCA9IG9wdGlvbnMuaW5kZXgKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgdHJhbnNwb3J0ID0gUGlwWG1scnBjVHJhbnNwb3J0KGluZGV4X3VybCwgc2Vzc2lvbikKICAgICAgICAgICAgcHlwaSA9IHhtbHJwY19jbGllbnQuU2VydmVyUHJveHkoaW5kZXhfdXJsLCB0cmFuc3BvcnQpCiAgICAgICAgICAgIGhpdHMgPSBweXBpLnNlYXJjaCh7J25hbWUnOiBxdWVyeSwgJ3N1bW1hcnknOiBxdWVyeX0sICdvcicpCiAgICAgICAgICAgIHJldHVybiBoaXRzCgoKZGVmIHRyYW5zZm9ybV9oaXRzKGhpdHMpOgogICAgIiIiCiAgICBUaGUgbGlzdCBmcm9tIHB5cGkgaXMgcmVhbGx5IGEgbGlzdCBvZiB2ZXJzaW9ucy4gV2Ugd2FudCBhIGxpc3Qgb2YKICAgIHBhY2thZ2VzIHdpdGggdGhlIGxpc3Qgb2YgdmVyc2lvbnMgc3RvcmVkIGlubGluZS4gVGhpcyBjb252ZXJ0cyB0aGUKICAgIGxpc3QgZnJvbSBweXBpIGludG8gb25lIHdlIGNhbiB1c2UuCiAgICAiIiIKICAgIHBhY2thZ2VzID0gT3JkZXJlZERpY3QoKQogICAgZm9yIGhpdCBpbiBoaXRzOgogICAgICAgIG5hbWUgPSBoaXRbJ25hbWUnXQogICAgICAgIHN1bW1hcnkgPSBoaXRbJ3N1bW1hcnknXQogICAgICAgIHZlcnNpb24gPSBoaXRbJ3ZlcnNpb24nXQoKICAgICAgICBpZiBuYW1lIG5vdCBpbiBwYWNrYWdlcy5rZXlzKCk6CiAgICAgICAgICAgIHBhY2thZ2VzW25hbWVdID0gewogICAgICAgICAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICAgICAgICAgJ3N1bW1hcnknOiBzdW1tYXJ5LAogICAgICAgICAgICAgICAgJ3ZlcnNpb25zJzogW3ZlcnNpb25dLAogICAgICAgICAgICB9CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFja2FnZXNbbmFtZV1bJ3ZlcnNpb25zJ10uYXBwZW5kKHZlcnNpb24pCgogICAgICAgICAgICAjIGlmIHRoaXMgaXMgdGhlIGhpZ2hlc3QgdmVyc2lvbiwgcmVwbGFjZSBzdW1tYXJ5IGFuZCBzY29yZQogICAgICAgICAgICBpZiB2ZXJzaW9uID09IGhpZ2hlc3RfdmVyc2lvbihwYWNrYWdlc1tuYW1lXVsndmVyc2lvbnMnXSk6CiAgICAgICAgICAgICAgICBwYWNrYWdlc1tuYW1lXVsnc3VtbWFyeSddID0gc3VtbWFyeQoKICAgIHJldHVybiBsaXN0KHBhY2thZ2VzLnZhbHVlcygpKQoKCmRlZiBwcmludF9yZXN1bHRzKGhpdHMsIG5hbWVfY29sdW1uX3dpZHRoPU5vbmUsIHRlcm1pbmFsX3dpZHRoPU5vbmUpOgogICAgaWYgbm90IGhpdHM6CiAgICAgICAgcmV0dXJuCiAgICBpZiBuYW1lX2NvbHVtbl93aWR0aCBpcyBOb25lOgogICAgICAgIG5hbWVfY29sdW1uX3dpZHRoID0gbWF4KFsKICAgICAgICAgICAgbGVuKGhpdFsnbmFtZSddKSArIGxlbihoaXQuZ2V0KCd2ZXJzaW9ucycsIFsnLSddKVstMV0pCiAgICAgICAgICAgIGZvciBoaXQgaW4gaGl0cwogICAgICAgIF0pICsgNAoKICAgIGluc3RhbGxlZF9wYWNrYWdlcyA9IFtwLnByb2plY3RfbmFtZSBmb3IgcCBpbiBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0XQogICAgZm9yIGhpdCBpbiBoaXRzOgogICAgICAgIG5hbWUgPSBoaXRbJ25hbWUnXQogICAgICAgIHN1bW1hcnkgPSBoaXRbJ3N1bW1hcnknXSBvciAnJwogICAgICAgIHZlcnNpb24gPSBoaXQuZ2V0KCd2ZXJzaW9ucycsIFsnLSddKVstMV0KICAgICAgICBpZiB0ZXJtaW5hbF93aWR0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGFyZ2V0X3dpZHRoID0gdGVybWluYWxfd2lkdGggLSBuYW1lX2NvbHVtbl93aWR0aCAtIDUKICAgICAgICAgICAgaWYgdGFyZ2V0X3dpZHRoID4gMTA6CiAgICAgICAgICAgICAgICAjIHdyYXAgYW5kIGluZGVudCBzdW1tYXJ5IHRvIGZpdCB0ZXJtaW5hbAogICAgICAgICAgICAgICAgc3VtbWFyeSA9IHRleHR3cmFwLndyYXAoc3VtbWFyeSwgdGFyZ2V0X3dpZHRoKQogICAgICAgICAgICAgICAgc3VtbWFyeSA9ICgnXG4nICsgJyAnICogKG5hbWVfY29sdW1uX3dpZHRoICsgMykpLmpvaW4oc3VtbWFyeSkKCiAgICAgICAgbGluZSA9ICclLSpzIC0gJXMnICUgKG5hbWVfY29sdW1uX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMgKCVzKScgJSAobmFtZSwgdmVyc2lvbiksIHN1bW1hcnkpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2dnZXIuaW5mbyhsaW5lKQogICAgICAgICAgICBpZiBuYW1lIGluIGluc3RhbGxlZF9wYWNrYWdlczoKICAgICAgICAgICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24obmFtZSkKICAgICAgICAgICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICAgICAgICAgIGxhdGVzdCA9IGhpZ2hlc3RfdmVyc2lvbihoaXRbJ3ZlcnNpb25zJ10pCiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdC52ZXJzaW9uID09IGxhdGVzdDoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0lOU1RBTExFRDogJXMgKGxhdGVzdCknLCBkaXN0LnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0lOU1RBTExFRDogJXMnLCBkaXN0LnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdMQVRFU1Q6ICAgICVzJywgbGF0ZXN0KQogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCgpkZWYgaGlnaGVzdF92ZXJzaW9uKHZlcnNpb25zKToKICAgIHJldHVybiBtYXgodmVyc2lvbnMsIGtleT1wYXJzZV92ZXJzaW9uKQpQSwMEFAAAAAAAAAAhAAxTHyQDFwAAAxcAADEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9zaG93LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gZW1haWwucGFyc2VyIGltcG9ydCBGZWVkUGFyc2VyCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAuc3RhdHVzX2NvZGVzIGltcG9ydCBTVUNDRVNTLCBFUlJPUgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFNob3dDb21tYW5kKENvbW1hbmQpOgogICAgIiIiU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBpbnN0YWxsZWQgcGFja2FnZXMuIiIiCiAgICBuYW1lID0gJ3Nob3cnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10gPHBhY2thZ2U+IC4uLiIiIgogICAgc3VtbWFyeSA9ICdTaG93IGluZm9ybWF0aW9uIGFib3V0IGluc3RhbGxlZCBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihTaG93Q29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWYnLCAnLS1maWxlcycsCiAgICAgICAgICAgIGRlc3Q9J2ZpbGVzJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nU2hvdyB0aGUgZnVsbCBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyBmb3IgZWFjaCBwYWNrYWdlLicpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgc2VsZi5jbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnRVJST1I6IFBsZWFzZSBwcm92aWRlIGEgcGFja2FnZSBuYW1lIG9yIG5hbWVzLicpCiAgICAgICAgICAgIHJldHVybiBFUlJPUgogICAgICAgIHF1ZXJ5ID0gYXJncwoKICAgICAgICByZXN1bHRzID0gc2VhcmNoX3BhY2thZ2VzX2luZm8ocXVlcnkpCiAgICAgICAgaWYgbm90IHByaW50X3Jlc3VsdHMoCiAgICAgICAgICAgICAgICByZXN1bHRzLCBsaXN0X2ZpbGVzPW9wdGlvbnMuZmlsZXMsIHZlcmJvc2U9b3B0aW9ucy52ZXJib3NlKToKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCiAgICAgICAgcmV0dXJuIFNVQ0NFU1MKCgpkZWYgc2VhcmNoX3BhY2thZ2VzX2luZm8ocXVlcnkpOgogICAgIiIiCiAgICBHYXRoZXIgZGV0YWlscyBmcm9tIGluc3RhbGxlZCBkaXN0cmlidXRpb25zLiBQcmludCBkaXN0cmlidXRpb24gbmFtZSwKICAgIHZlcnNpb24sIGxvY2F0aW9uLCBhbmQgaW5zdGFsbGVkIGZpbGVzLiBJbnN0YWxsZWQgZmlsZXMgcmVxdWlyZXMgYQogICAgcGlwIGdlbmVyYXRlZCAnaW5zdGFsbGVkLWZpbGVzLnR4dCcgaW4gdGhlIGRpc3RyaWJ1dGlvbnMgJy5lZ2ctaW5mbycKICAgIGRpcmVjdG9yeS4KICAgICIiIgogICAgaW5zdGFsbGVkID0ge30KICAgIGZvciBwIGluIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQ6CiAgICAgICAgaW5zdGFsbGVkW2Nhbm9uaWNhbGl6ZV9uYW1lKHAucHJvamVjdF9uYW1lKV0gPSBwCgogICAgcXVlcnlfbmFtZXMgPSBbY2Fub25pY2FsaXplX25hbWUobmFtZSkgZm9yIG5hbWUgaW4gcXVlcnldCgogICAgZm9yIGRpc3QgaW4gW2luc3RhbGxlZFtwa2ddIGZvciBwa2cgaW4gcXVlcnlfbmFtZXMgaWYgcGtnIGluIGluc3RhbGxlZF06CiAgICAgICAgcGFja2FnZSA9IHsKICAgICAgICAgICAgJ25hbWUnOiBkaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgJ3ZlcnNpb24nOiBkaXN0LnZlcnNpb24sCiAgICAgICAgICAgICdsb2NhdGlvbic6IGRpc3QubG9jYXRpb24sCiAgICAgICAgICAgICdyZXF1aXJlcyc6IFtkZXAucHJvamVjdF9uYW1lIGZvciBkZXAgaW4gZGlzdC5yZXF1aXJlcygpXSwKICAgICAgICB9CiAgICAgICAgZmlsZV9saXN0ID0gTm9uZQogICAgICAgIG1ldGFkYXRhID0gTm9uZQogICAgICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgcGtnX3Jlc291cmNlcy5EaXN0SW5mb0Rpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgICMgUkVDT1JEcyBzaG91bGQgYmUgcGFydCBvZiAuZGlzdC1pbmZvIG1ldGFkYXRhcwogICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnUkVDT1JEJyk6CiAgICAgICAgICAgICAgICBsaW5lcyA9IGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdSRUNPUkQnKQogICAgICAgICAgICAgICAgcGF0aHMgPSBbbC5zcGxpdCgnLCcpWzBdIGZvciBsIGluIGxpbmVzXQogICAgICAgICAgICAgICAgcGF0aHMgPSBbb3MucGF0aC5qb2luKGRpc3QubG9jYXRpb24sIHApIGZvciBwIGluIHBhdGhzXQogICAgICAgICAgICAgICAgZmlsZV9saXN0ID0gW29zLnBhdGgucmVscGF0aChwLCBkaXN0LmxvY2F0aW9uKSBmb3IgcCBpbiBwYXRoc10KCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdNRVRBREFUQScpOgogICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBkaXN0LmdldF9tZXRhZGF0YSgnTUVUQURBVEEnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT3RoZXJ3aXNlIHVzZSBwaXAncyBsb2cgZm9yIC5lZ2ctaW5mbydzCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdpbnN0YWxsZWQtZmlsZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBwYXRocyA9IGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICAgICAgICAgIHBhdGhzID0gW29zLnBhdGguam9pbihkaXN0LmVnZ19pbmZvLCBwKSBmb3IgcCBpbiBwYXRoc10KICAgICAgICAgICAgICAgIGZpbGVfbGlzdCA9IFtvcy5wYXRoLnJlbHBhdGgocCwgZGlzdC5sb2NhdGlvbikgZm9yIHAgaW4gcGF0aHNdCgogICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gZGlzdC5nZXRfbWV0YWRhdGEoJ1BLRy1JTkZPJykKCiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2VudHJ5X3BvaW50cy50eHQnKToKICAgICAgICAgICAgZW50cnlfcG9pbnRzID0gZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2VudHJ5X3BvaW50cy50eHQnKQogICAgICAgICAgICBwYWNrYWdlWydlbnRyeV9wb2ludHMnXSA9IGVudHJ5X3BvaW50cwoKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnSU5TVEFMTEVSJyk6CiAgICAgICAgICAgIGZvciBsaW5lIGluIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdJTlNUQUxMRVInKToKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKToKICAgICAgICAgICAgICAgICAgICBwYWNrYWdlWydpbnN0YWxsZXInXSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICMgQHRvZG86IFNob3VsZCBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiBoYXZlIGEKICAgICAgICAjIGBnZXRfcGtnX2luZm9gIG1ldGhvZD8KICAgICAgICBmZWVkX3BhcnNlciA9IEZlZWRQYXJzZXIoKQogICAgICAgIGZlZWRfcGFyc2VyLmZlZWQobWV0YWRhdGEpCiAgICAgICAgcGtnX2luZm9fZGljdCA9IGZlZWRfcGFyc2VyLmNsb3NlKCkKICAgICAgICBmb3Iga2V5IGluICgnbWV0YWRhdGEtdmVyc2lvbicsICdzdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICAnaG9tZS1wYWdlJywgJ2F1dGhvcicsICdhdXRob3ItZW1haWwnLCAnbGljZW5zZScpOgogICAgICAgICAgICBwYWNrYWdlW2tleV0gPSBwa2dfaW5mb19kaWN0LmdldChrZXkpCgogICAgICAgICMgSXQgbG9va3MgbGlrZSBGZWVkUGFyc2VyIGNhbm5vdCBkZWFsIHdpdGggcmVwZWF0ZWQgaGVhZGVycwogICAgICAgIGNsYXNzaWZpZXJzID0gW10KICAgICAgICBmb3IgbGluZSBpbiBtZXRhZGF0YS5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnQ2xhc3NpZmllcjogJyk6CiAgICAgICAgICAgICAgICBjbGFzc2lmaWVycy5hcHBlbmQobGluZVtsZW4oJ0NsYXNzaWZpZXI6ICcpOl0pCiAgICAgICAgcGFja2FnZVsnY2xhc3NpZmllcnMnXSA9IGNsYXNzaWZpZXJzCgogICAgICAgIGlmIGZpbGVfbGlzdDoKICAgICAgICAgICAgcGFja2FnZVsnZmlsZXMnXSA9IHNvcnRlZChmaWxlX2xpc3QpCiAgICAgICAgeWllbGQgcGFja2FnZQoKCmRlZiBwcmludF9yZXN1bHRzKGRpc3RyaWJ1dGlvbnMsIGxpc3RfZmlsZXM9RmFsc2UsIHZlcmJvc2U9RmFsc2UpOgogICAgIiIiCiAgICBQcmludCB0aGUgaW5mb3JtYXRpb25zIGZyb20gaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbnMgZm91bmQuCiAgICAiIiIKICAgIHJlc3VsdHNfcHJpbnRlZCA9IEZhbHNlCiAgICBmb3IgaSwgZGlzdCBpbiBlbnVtZXJhdGUoZGlzdHJpYnV0aW9ucyk6CiAgICAgICAgcmVzdWx0c19wcmludGVkID0gVHJ1ZQogICAgICAgIGlmIGkgPiAwOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiLS0tIikKICAgICAgICBsb2dnZXIuaW5mbygiTmFtZTogJXMiLCBkaXN0LmdldCgnbmFtZScsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiVmVyc2lvbjogJXMiLCBkaXN0LmdldCgndmVyc2lvbicsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiU3VtbWFyeTogJXMiLCBkaXN0LmdldCgnc3VtbWFyeScsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiSG9tZS1wYWdlOiAlcyIsIGRpc3QuZ2V0KCdob21lLXBhZ2UnLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIkF1dGhvcjogJXMiLCBkaXN0LmdldCgnYXV0aG9yJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJBdXRob3ItZW1haWw6ICVzIiwgZGlzdC5nZXQoJ2F1dGhvci1lbWFpbCcsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiTGljZW5zZTogJXMiLCBkaXN0LmdldCgnbGljZW5zZScsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiTG9jYXRpb246ICVzIiwgZGlzdC5nZXQoJ2xvY2F0aW9uJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJSZXF1aXJlczogJXMiLCAnLCAnLmpvaW4oZGlzdC5nZXQoJ3JlcXVpcmVzJywgW10pKSkKICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiTWV0YWRhdGEtVmVyc2lvbjogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0LmdldCgnbWV0YWRhdGEtdmVyc2lvbicsICcnKSkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkluc3RhbGxlcjogJXMiLCBkaXN0LmdldCgnaW5zdGFsbGVyJywgJycpKQogICAgICAgICAgICBsb2dnZXIuaW5mbygiQ2xhc3NpZmllcnM6IikKICAgICAgICAgICAgZm9yIGNsYXNzaWZpZXIgaW4gZGlzdC5nZXQoJ2NsYXNzaWZpZXJzJywgW10pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIiAgJXMiLCBjbGFzc2lmaWVyKQogICAgICAgICAgICBsb2dnZXIuaW5mbygiRW50cnktcG9pbnRzOiIpCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBkaXN0LmdldCgnZW50cnlfcG9pbnRzJywgW10pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIiAgJXMiLCBlbnRyeS5zdHJpcCgpKQogICAgICAgIGlmIGxpc3RfZmlsZXM6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJGaWxlczoiKQogICAgICAgICAgICBmb3IgbGluZSBpbiBkaXN0LmdldCgnZmlsZXMnLCBbXSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiICAlcyIsIGxpbmUuc3RyaXAoKSkKICAgICAgICAgICAgaWYgImZpbGVzIiBub3QgaW4gZGlzdDoKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDYW5ub3QgbG9jYXRlIGluc3RhbGxlZC1maWxlcy50eHQiKQogICAgcmV0dXJuIHJlc3VsdHNfcHJpbnRlZApQSwMEFAAAAAAAAAAhAKuJGT9ECwAARAsAADYAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy91bmluc3RhbGwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHBpcApmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWxDYWNoZQpmcm9tIHBpcC5yZXEgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudCwgUmVxdWlyZW1lbnRTZXQsIHBhcnNlX3JlcXVpcmVtZW50cwpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBJbnN0YWxsYXRpb25FcnJvcgoKCmNsYXNzIFVuaW5zdGFsbENvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiIKICAgIFVuaW5zdGFsbCBwYWNrYWdlcy4KCiAgICBwaXAgaXMgYWJsZSB0byB1bmluc3RhbGwgbW9zdCBpbnN0YWxsZWQgcGFja2FnZXMuIEtub3duIGV4Y2VwdGlvbnMgYXJlOgoKICAgIC0gUHVyZSBkaXN0dXRpbHMgcGFja2FnZXMgaW5zdGFsbGVkIHdpdGggYGBweXRob24gc2V0dXAucHkgaW5zdGFsbGBgLCB3aGljaAogICAgICBsZWF2ZSBiZWhpbmQgbm8gbWV0YWRhdGEgdG8gZGV0ZXJtaW5lIHdoYXQgZmlsZXMgd2VyZSBpbnN0YWxsZWQuCiAgICAtIFNjcmlwdCB3cmFwcGVycyBpbnN0YWxsZWQgYnkgYGBweXRob24gc2V0dXAucHkgZGV2ZWxvcGBgLgogICAgIiIiCiAgICBuYW1lID0gJ3VuaW5zdGFsbCcKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cGFja2FnZT4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSAtciA8cmVxdWlyZW1lbnRzIGZpbGU+IC4uLiIiIgogICAgc3VtbWFyeSA9ICdVbmluc3RhbGwgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoVW5pbnN0YWxsQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXInLCAnLS1yZXF1aXJlbWVudCcsCiAgICAgICAgICAgIGRlc3Q9J3JlcXVpcmVtZW50cycsCiAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICAgICAgbWV0YXZhcj0nZmlsZScsCiAgICAgICAgICAgIGhlbHA9J1VuaW5zdGFsbCBhbGwgdGhlIHBhY2thZ2VzIGxpc3RlZCBpbiB0aGUgZ2l2ZW4gcmVxdWlyZW1lbnRzICcKICAgICAgICAgICAgICAgICAnZmlsZS4gIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzLicsCiAgICAgICAgKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy15JywgJy0teWVzJywKICAgICAgICAgICAgZGVzdD0neWVzJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0iRG9uJ3QgYXNrIGZvciBjb25maXJtYXRpb24gb2YgdW5pbnN0YWxsIGRlbGV0aW9ucy4iKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIHNlbGYuY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgZm9ybWF0X2NvbnRyb2wgPSBwaXAuaW5kZXguRm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpCiAgICAgICAgICAgIHdoZWVsX2NhY2hlID0gV2hlZWxDYWNoZShvcHRpb25zLmNhY2hlX2RpciwgZm9ybWF0X2NvbnRyb2wpCiAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCA9IFJlcXVpcmVtZW50U2V0KAogICAgICAgICAgICAgICAgYnVpbGRfZGlyPU5vbmUsCiAgICAgICAgICAgICAgICBzcmNfZGlyPU5vbmUsCiAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBuYW1lIGluIGFyZ3M6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgICAgIEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2xpbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcHRpb25zLnJlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgIGZvciByZXEgaW4gcGFyc2VfcmVxdWlyZW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz1vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlKToKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KHJlcSkKICAgICAgICAgICAgaWYgbm90IHJlcXVpcmVtZW50X3NldC5oYXNfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1lvdSBtdXN0IGdpdmUgYXQgbGVhc3Qgb25lIHJlcXVpcmVtZW50IHRvICUobmFtZSlzIChzZWUgJwogICAgICAgICAgICAgICAgICAgICcicGlwIGhlbHAgJShuYW1lKXMiKScgJSBkaWN0KG5hbWU9c2VsZi5uYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByZXF1aXJlbWVudF9zZXQudW5pbnN0YWxsKGF1dG9fY29uZmlybT1vcHRpb25zLnllcykKUEsDBBQAAAAAAAAAIQCXN3PmMR4AADEeAAAyAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvd2hlZWwucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IFJlcXVpcmVtZW50Q29tbWFuZApmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBDb21tYW5kRXJyb3IsIFByZXZpb3VzQnVpbGREaXJFcnJvcgpmcm9tIHBpcC5yZXEgaW1wb3J0IFJlcXVpcmVtZW50U2V0CmZyb20gcGlwLnV0aWxzIGltcG9ydCBpbXBvcnRfb3JfcmFpc2UKZnJvbSBwaXAudXRpbHMuYnVpbGQgaW1wb3J0IEJ1aWxkRGlyZWN0b3J5CmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsQ2FjaGUsIFdoZWVsQnVpbGRlcgpmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucwoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFdoZWVsQ29tbWFuZChSZXF1aXJlbWVudENvbW1hbmQpOgogICAgIiIiCiAgICBCdWlsZCBXaGVlbCBhcmNoaXZlcyBmb3IgeW91ciByZXF1aXJlbWVudHMgYW5kIGRlcGVuZGVuY2llcy4KCiAgICBXaGVlbCBpcyBhIGJ1aWx0LXBhY2thZ2UgZm9ybWF0LCBhbmQgb2ZmZXJzIHRoZSBhZHZhbnRhZ2Ugb2Ygbm90CiAgICByZWNvbXBpbGluZyB5b3VyIHNvZnR3YXJlIGR1cmluZyBldmVyeSBpbnN0YWxsLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlCiAgICB3aGVlbCBkb2NzOiBodHRwczovL3doZWVsLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC8KCiAgICBSZXF1aXJlbWVudHM6IHNldHVwdG9vbHM+PTAuOCwgYW5kIHdoZWVsLgoKICAgICdwaXAgd2hlZWwnIHVzZXMgdGhlIGJkaXN0X3doZWVsIHNldHVwdG9vbHMgZXh0ZW5zaW9uIGZyb20gdGhlIHdoZWVsCiAgICBwYWNrYWdlIHRvIGJ1aWxkIGluZGl2aWR1YWwgd2hlZWxzLgoKICAgICIiIgoKICAgIG5hbWUgPSAnd2hlZWwnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10gPHJlcXVpcmVtZW50IHNwZWNpZmllcj4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSAtciA8cmVxdWlyZW1lbnRzIGZpbGU+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8dmNzIHByb2plY3QgdXJsPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIFstZV0gPGxvY2FsIHByb2plY3QgcGF0aD4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSA8YXJjaGl2ZSB1cmwvcGF0aD4gLi4uIiIiCgogICAgc3VtbWFyeSA9ICdCdWlsZCB3aGVlbHMgZnJvbSB5b3VyIHJlcXVpcmVtZW50cy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihXaGVlbENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBjbWRfb3B0cyA9IHNlbGYuY21kX29wdHMKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy13JywgJy0td2hlZWwtZGlyJywKICAgICAgICAgICAgZGVzdD0nd2hlZWxfZGlyJywKICAgICAgICAgICAgbWV0YXZhcj0nZGlyJywKICAgICAgICAgICAgZGVmYXVsdD1vcy5jdXJkaXIsCiAgICAgICAgICAgIGhlbHA9KCJCdWlsZCB3aGVlbHMgaW50byA8ZGlyPiwgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlICIKICAgICAgICAgICAgICAgICAgImN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIiksCiAgICAgICAgKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy51c2Vfd2hlZWwoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fdXNlX3doZWVsKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5vbmx5X2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWJ1aWxkLW9wdGlvbicsCiAgICAgICAgICAgIGRlc3Q9J2J1aWxkX29wdGlvbnMnLAogICAgICAgICAgICBtZXRhdmFyPSdvcHRpb25zJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBoZWxwPSJFeHRyYSBhcmd1bWVudHMgdG8gYmUgc3VwcGxpZWQgdG8gJ3NldHVwLnB5IGJkaXN0X3doZWVsJy4iKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5jb25zdHJhaW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5lZGl0YWJsZSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlbWVudHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuc3JjKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmlnbm9yZV9yZXF1aXJlc19weXRob24oKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fZGVwcygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5idWlsZF9kaXIoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tZ2xvYmFsLW9wdGlvbicsCiAgICAgICAgICAgIGRlc3Q9J2dsb2JhbF9vcHRpb25zJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBtZXRhdmFyPSdvcHRpb25zJywKICAgICAgICAgICAgaGVscD0iRXh0cmEgZ2xvYmFsIG9wdGlvbnMgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIHNldHVwLnB5ICIKICAgICAgICAgICAgImNhbGwgYmVmb3JlIHRoZSAnYmRpc3Rfd2hlZWwnIGNvbW1hbmQuIikKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcHJlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0oIkluY2x1ZGUgcHJlLXJlbGVhc2UgYW5kIGRldmVsb3BtZW50IHZlcnNpb25zLiBCeSBkZWZhdWx0LCAiCiAgICAgICAgICAgICAgICAgICJwaXAgb25seSBmaW5kcyBzdGFibGUgdmVyc2lvbnMuIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fY2xlYW4oKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZV9oYXNoZXMoKSkKCiAgICAgICAgaW5kZXhfb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoCiAgICAgICAgICAgIGNtZG9wdGlvbnMuaW5kZXhfZ3JvdXAsCiAgICAgICAgICAgIHNlbGYucGFyc2VyLAogICAgICAgICkKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBpbmRleF9vcHRzKQogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgY21kX29wdHMpCgogICAgZGVmIGNoZWNrX3JlcXVpcmVkX3BhY2thZ2VzKHNlbGYpOgogICAgICAgIGltcG9ydF9vcl9yYWlzZSgKICAgICAgICAgICAgJ3doZWVsLmJkaXN0X3doZWVsJywKICAgICAgICAgICAgQ29tbWFuZEVycm9yLAogICAgICAgICAgICAiJ3BpcCB3aGVlbCcgcmVxdWlyZXMgdGhlICd3aGVlbCcgcGFja2FnZS4gVG8gZml4IHRoaXMsIHJ1bjogIgogICAgICAgICAgICAicGlwIGluc3RhbGwgd2hlZWwiCiAgICAgICAgKQogICAgICAgIHBrZ19yZXNvdXJjZXMgPSBpbXBvcnRfb3JfcmFpc2UoCiAgICAgICAgICAgICdwa2dfcmVzb3VyY2VzJywKICAgICAgICAgICAgQ29tbWFuZEVycm9yLAogICAgICAgICAgICAiJ3BpcCB3aGVlbCcgcmVxdWlyZXMgc2V0dXB0b29scyA+PSAwLjggZm9yIGRpc3QtaW5mbyBzdXBwb3J0LiIKICAgICAgICAgICAgIiBUbyBmaXggdGhpcywgcnVuOiBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgc2V0dXB0b29scyIKICAgICAgICApCiAgICAgICAgaWYgbm90IGhhc2F0dHIocGtnX3Jlc291cmNlcywgJ0Rpc3RJbmZvRGlzdHJpYnV0aW9uJyk6CiAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICIncGlwIHdoZWVsJyByZXF1aXJlcyBzZXR1cHRvb2xzID49IDAuOCBmb3IgZGlzdC1pbmZvICIKICAgICAgICAgICAgICAgICJzdXBwb3J0LiBUbyBmaXggdGhpcywgcnVuOiBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgIgogICAgICAgICAgICAgICAgInNldHVwdG9vbHMiCiAgICAgICAgICAgICkKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIHNlbGYuY2hlY2tfcmVxdWlyZWRfcGFja2FnZXMoKQogICAgICAgIGNtZG9wdGlvbnMucmVzb2x2ZV93aGVlbF9ub191c2VfYmluYXJ5KG9wdGlvbnMpCiAgICAgICAgY21kb3B0aW9ucy5jaGVja19pbnN0YWxsX2J1aWxkX2dsb2JhbChvcHRpb25zKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgbm8gIgogICAgICAgICAgICAgICAgImxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfYWxsX2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctYWxsLWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X3VudmVyaWZpZWQ6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpbmRleF91cmxzID0gW29wdGlvbnMuaW5kZXhfdXJsXSArIG9wdGlvbnMuZXh0cmFfaW5kZXhfdXJscwogICAgICAgIGlmIG9wdGlvbnMubm9faW5kZXg6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnSWdub3JpbmcgaW5kZXhlczogJXMnLCAnLCcuam9pbihpbmRleF91cmxzKSkKICAgICAgICAgICAgaW5kZXhfdXJscyA9IFtdCgogICAgICAgIGlmIG9wdGlvbnMuYnVpbGRfZGlyOgogICAgICAgICAgICBvcHRpb25zLmJ1aWxkX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLmJ1aWxkX2RpcikKCiAgICAgICAgb3B0aW9ucy5zcmNfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMuc3JjX2RpcikKCiAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKG9wdGlvbnMpIGFzIHNlc3Npb246CiAgICAgICAgICAgIGZpbmRlciA9IHNlbGYuX2J1aWxkX3BhY2thZ2VfZmluZGVyKG9wdGlvbnMsIHNlc3Npb24pCiAgICAgICAgICAgIGJ1aWxkX2RlbGV0ZSA9IChub3QgKG9wdGlvbnMubm9fY2xlYW4gb3Igb3B0aW9ucy5idWlsZF9kaXIpKQogICAgICAgICAgICB3aGVlbF9jYWNoZSA9IFdoZWVsQ2FjaGUob3B0aW9ucy5jYWNoZV9kaXIsIG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wpCiAgICAgICAgICAgIHdpdGggQnVpbGREaXJlY3Rvcnkob3B0aW9ucy5idWlsZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlPWJ1aWxkX2RlbGV0ZSkgYXMgYnVpbGRfZGlyOgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0ID0gUmVxdWlyZW1lbnRTZXQoCiAgICAgICAgICAgICAgICAgICAgYnVpbGRfZGlyPWJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICBzcmNfZGlyPW9wdGlvbnMuc3JjX2RpciwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZGVwZW5kZW5jaWVzPW9wdGlvbnMuaWdub3JlX2RlcGVuZGVuY2llcywKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfaW5zdGFsbGVkPVRydWUsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX3JlcXVpcmVzX3B5dGhvbj1vcHRpb25zLmlnbm9yZV9yZXF1aXJlc19weXRob24sCiAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9kb3dubG9hZF9kaXI9b3B0aW9ucy53aGVlbF9kaXIsCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXM9b3B0aW9ucy5yZXF1aXJlX2hhc2hlcwogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHNlbGYucG9wdWxhdGVfcmVxdWlyZW1lbnRfc2V0KAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCwgYXJncywgb3B0aW9ucywgZmluZGVyLCBzZXNzaW9uLCBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGUKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBpZiBub3QgcmVxdWlyZW1lbnRfc2V0Lmhhc19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICMgYnVpbGQgd2hlZWxzCiAgICAgICAgICAgICAgICAgICAgd2IgPSBXaGVlbEJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCwKICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9vcHRpb25zPW9wdGlvbnMuYnVpbGRfb3B0aW9ucyBvciBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnM9b3B0aW9ucy5nbG9iYWxfb3B0aW9ucyBvciBbXSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHdiLmJ1aWxkKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYnVpbGQgb25lIG9yIG1vcmUgd2hlZWxzIgogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBleGNlcHQgUHJldmlvdXNCdWlsZERpckVycm9yOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubm9fY2xlYW4gPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMubm9fY2xlYW46CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5jbGVhbnVwX2ZpbGVzKCkKUEsDBBQAAAAAAAAAIQCZJ6lxQBIAAEASAAAzAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tcGF0L19faW5pdF9fLnB5IiIiU3R1ZmYgdGhhdCBkaWZmZXJzIGluIGRpZmZlcmVudCBQeXRob24gdmVyc2lvbnMgYW5kIHBsYXRmb3JtCmRpc3RyaWJ1dGlvbnMuIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCnRyeToKICAgIGZyb20gbG9nZ2luZy5jb25maWcgaW1wb3J0IGRpY3RDb25maWcgYXMgbG9nZ2luZ19kaWN0Q29uZmlnCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gcGlwLmNvbXBhdC5kaWN0Y29uZmlnIGltcG9ydCBkaWN0Q29uZmlnIGFzIGxvZ2dpbmdfZGljdENvbmZpZwoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBwaXAuX3ZlbmRvci5vcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKCnRyeToKICAgIGltcG9ydCBpcGFkZHJlc3MKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdHJ5OgogICAgICAgIGZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGlwYWRkcmVzcwogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGltcG9ydCBpcGFkZHIgYXMgaXBhZGRyZXNzCiAgICAgICAgaXBhZGRyZXNzLmlwX2FkZHJlc3MgPSBpcGFkZHJlc3MuSVBBZGRyZXNzCiAgICAgICAgaXBhZGRyZXNzLmlwX25ldHdvcmsgPSBpcGFkZHJlc3MuSVBOZXR3b3JrCgoKdHJ5OgogICAgaW1wb3J0IHN5c2NvbmZpZwoKICAgIGRlZiBnZXRfc3RkbGliKCk6CiAgICAgICAgcGF0aHMgPSBbCiAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfcGF0aCgic3RkbGliIiksCiAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfcGF0aCgicGxhdHN0ZGxpYiIpLAogICAgICAgIF0KICAgICAgICByZXR1cm4gc2V0KGZpbHRlcihib29sLCBwYXRocykpCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKCiAgICBkZWYgZ2V0X3N0ZGxpYigpOgogICAgICAgIHBhdGhzID0gWwogICAgICAgICAgICBzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoc3RhbmRhcmRfbGliPVRydWUpLAogICAgICAgICAgICBzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoc3RhbmRhcmRfbGliPVRydWUsIHBsYXRfc3BlY2lmaWM9VHJ1ZSksCiAgICAgICAgXQogICAgICAgIHJldHVybiBzZXQoZmlsdGVyKGJvb2wsIHBhdGhzKSkKCgpfX2FsbF9fID0gWwogICAgImxvZ2dpbmdfZGljdENvbmZpZyIsICJpcGFkZHJlc3MiLCAidXNlc19weWNhY2hlIiwgImNvbnNvbGVfdG9fc3RyIiwKICAgICJuYXRpdmVfc3RyIiwgImdldF9wYXRoX3VpZCIsICJzdGRsaWJfcGtncyIsICJXSU5ET1dTIiwgInNhbWVmaWxlIiwKICAgICJPcmRlcmVkRGljdCIsCl0KCgppZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCA0KToKICAgIHVzZXNfcHljYWNoZSA9IFRydWUKICAgIGZyb20gaW1wb3J0bGliLnV0aWwgaW1wb3J0IGNhY2hlX2Zyb21fc291cmNlCmVsc2U6CiAgICBpbXBvcnQgaW1wCiAgICB1c2VzX3B5Y2FjaGUgPSBoYXNhdHRyKGltcCwgJ2NhY2hlX2Zyb21fc291cmNlJykKICAgIGlmIHVzZXNfcHljYWNoZToKICAgICAgICBjYWNoZV9mcm9tX3NvdXJjZSA9IGltcC5jYWNoZV9mcm9tX3NvdXJjZQogICAgZWxzZToKICAgICAgICBjYWNoZV9mcm9tX3NvdXJjZSA9IE5vbmUKCgppZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCk6CiAgICBkZWYgY29uc29sZV90b19zdHIocyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gcy5kZWNvZGUoc3lzLl9fc3Rkb3V0X18uZW5jb2RpbmcpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCd1dGZfOCcpCgogICAgZGVmIG5hdGl2ZV9zdHIocywgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgndXRmLTgnLCAncmVwbGFjZScgaWYgcmVwbGFjZSBlbHNlICdzdHJpY3QnKQogICAgICAgIHJldHVybiBzCgplbHNlOgogICAgZGVmIGNvbnNvbGVfdG9fc3RyKHMpOgogICAgICAgIHJldHVybiBzCgogICAgZGVmIG5hdGl2ZV9zdHIocywgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIyBSZXBsYWNlIGlzIGlnbm9yZWQgLS0gdW5pY29kZSB0byBVVEYtOCBjYW4ndCBmYWlsCiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gcwoKCmRlZiB0b3RhbF9zZWNvbmRzKHRkKToKICAgIGlmIGhhc2F0dHIodGQsICJ0b3RhbF9zZWNvbmRzIik6CiAgICAgICAgcmV0dXJuIHRkLnRvdGFsX3NlY29uZHMoKQogICAgZWxzZToKICAgICAgICB2YWwgPSB0ZC5taWNyb3NlY29uZHMgKyAodGQuc2Vjb25kcyArIHRkLmRheXMgKiAyNCAqIDM2MDApICogMTAgKiogNgogICAgICAgIHJldHVybiB2YWwgLyAxMCAqKiA2CgoKZGVmIGdldF9wYXRoX3VpZChwYXRoKToKICAgICIiIgogICAgUmV0dXJuIHBhdGgncyB1aWQuCgogICAgRG9lcyBub3QgZm9sbG93IHN5bWxpbmtzOgogICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9wdWxsLzkzNSNkaXNjdXNzaW9uX3I1MzA3MDAzCgogICAgUGxhY2VkIHRoaXMgZnVuY3Rpb24gaW4gY29tcGF0IGR1ZSB0byBkaWZmZXJlbmNlcyBvbiBBSVggYW5kCiAgICBKeXRob24sIHRoYXQgc2hvdWxkIGV2ZW50dWFsbHkgZ28gYXdheS4KCiAgICA6cmFpc2VzIE9TRXJyb3I6IFdoZW4gcGF0aCBpcyBhIHN5bWxpbmsgb3IgY2FuJ3QgYmUgcmVhZC4KICAgICIiIgogICAgaWYgaGFzYXR0cihvcywgJ09fTk9GT0xMT1cnKToKICAgICAgICBmZCA9IG9zLm9wZW4ocGF0aCwgb3MuT19SRE9OTFkgfCBvcy5PX05PRk9MTE9XKQogICAgICAgIGZpbGVfdWlkID0gb3MuZnN0YXQoZmQpLnN0X3VpZAogICAgICAgIG9zLmNsb3NlKGZkKQogICAgZWxzZTogICMgQUlYIGFuZCBKeXRob24KICAgICAgICAjIFdBUk5JTkc6IHRpbWUgb2YgY2hlY2sgdnVsbmVyYWJpbGl0eSwgYnV0IGJlc3Qgd2UgY2FuIGRvIHcvbyBOT0ZPTExPVwogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzbGluayhwYXRoKToKICAgICAgICAgICAgIyBvbGRlciB2ZXJzaW9ucyBvZiBKeXRob24gZG9uJ3QgaGF2ZSBgb3MuZnN0YXRgCiAgICAgICAgICAgIGZpbGVfdWlkID0gb3Muc3RhdChwYXRoKS5zdF91aWQKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHJhaXNlIE9TRXJyb3IgZm9yIHBhcml0eSB3aXRoIG9zLk9fTk9GT0xMT1cgYWJvdmUKICAgICAgICAgICAgcmFpc2UgT1NFcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBhIHN5bWxpbms7IFdpbGwgbm90IHJldHVybiB1aWQgZm9yIHN5bWxpbmtzIiAlIHBhdGgKICAgICAgICAgICAgKQogICAgcmV0dXJuIGZpbGVfdWlkCgoKZGVmIGV4cGFuZHVzZXIocGF0aCk6CiAgICAiIiIKICAgIEV4cGFuZCB+IGFuZCB+dXNlciBjb25zdHJ1Y3Rpb25zLgoKICAgIEluY2x1ZGVzIGEgd29ya2Fyb3VuZCBmb3IgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE0NzY4CiAgICAiIiIKICAgIGV4cGFuZGVkID0gb3MucGF0aC5leHBhbmR1c2VyKHBhdGgpCiAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoJ34vJykgYW5kIGV4cGFuZGVkLnN0YXJ0c3dpdGgoJy8vJyk6CiAgICAgICAgZXhwYW5kZWQgPSBleHBhbmRlZFsxOl0KICAgIHJldHVybiBleHBhbmRlZAoKCiMgcGFja2FnZXMgaW4gdGhlIHN0ZGxpYiB0aGF0IG1heSBoYXZlIGluc3RhbGxhdGlvbiBtZXRhZGF0YSwgYnV0IHNob3VsZCBub3QgYmUKIyBjb25zaWRlcmVkICdpbnN0YWxsZWQnLiAgdGhpcyB0aGVvcmV0aWNhbGx5IGNvdWxkIGJlIGRldGVybWluZWQgYmFzZWQgb24KIyBkaXN0LmxvY2F0aW9uIChweTI3OmBzeXNjb25maWcuZ2V0X3BhdGhzKClbJ3N0ZGxpYiddYCwKIyBweTI2OnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoJ0xJQkRFU1QnKSksIGJ1dCBmZWFyIHBsYXRmb3JtIHZhcmlhdGlvbiBtYXkKIyBtYWtlIHRoaXMgaW5lZmZlY3RpdmUsIHNvIGhhcmQtY29kaW5nCnN0ZGxpYl9wa2dzID0gKCdweXRob24nLCAnd3NnaXJlZicpCmlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDIsIDcpOgogICAgc3RkbGliX3BrZ3MgKz0gKCdhcmdwYXJzZScsKQoKCiMgd2luZG93cyBkZXRlY3Rpb24sIGNvdmVycyBjcHl0aG9uIGFuZCBpcm9ucHl0aG9uCldJTkRPV1MgPSAoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpIG9yCiAgICAgICAgICAgKHN5cy5wbGF0Zm9ybSA9PSAnY2xpJyBhbmQgb3MubmFtZSA9PSAnbnQnKSkKCgpkZWYgc2FtZWZpbGUoZmlsZTEsIGZpbGUyKToKICAgICIiIlByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUgZm9yIG9zLnBhdGguc2FtZWZpbGUgb24gV2luZG93cy9QeXRob24yIiIiCiAgICBpZiBoYXNhdHRyKG9zLnBhdGgsICdzYW1lZmlsZScpOgogICAgICAgIHJldHVybiBvcy5wYXRoLnNhbWVmaWxlKGZpbGUxLCBmaWxlMikKICAgIGVsc2U6CiAgICAgICAgcGF0aDEgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChmaWxlMSkpCiAgICAgICAgcGF0aDIgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChmaWxlMikpCiAgICAgICAgcmV0dXJuIHBhdGgxID09IHBhdGgyClBLAwQUAAAAAAAAACEAgqKllzhaAAA4WgAANQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbXBhdC9kaWN0Y29uZmlnLnB5IyBUaGlzIGlzIGEgY29weSBvZiB0aGUgUHl0aG9uIGxvZ2dpbmcuY29uZmlnLmRpY3Rjb25maWcgbW9kdWxlLAojIHJlcHJvZHVjZWQgd2l0aCBwZXJtaXNzaW9uLiBJdCBpcyBwcm92aWRlZCBoZXJlIGZvciBiYWNrd2FyZHMKIyBjb21wYXRpYmlsaXR5IGZvciBQeXRob24gdmVyc2lvbnMgcHJpb3IgdG8gMi43LgojCiMgQ29weXJpZ2h0IDIwMDktMjAxMCBieSBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwojIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKIyBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CiMgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCiMgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBWaW5heSBTYWppcAojIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgojIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCiMgVklOQVkgU0FKSVAgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwojIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTAojIFZJTkFZIFNBSklQIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgojIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgojIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCiMgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nLmhhbmRsZXJzCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgc2l4CgojIGZsYWtlODogbm9xYQoKSURFTlRJRklFUiA9IHJlLmNvbXBpbGUoJ15bYS16X11bYS16MC05X10qJCcsIHJlLkkpCgoKZGVmIHZhbGlkX2lkZW50KHMpOgogICAgbSA9IElERU5USUZJRVIubWF0Y2gocykKICAgIGlmIG5vdCBtOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05vdCBhIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVyOiAlcicgJSBzKQogICAgcmV0dXJuIFRydWUKCiMKIyBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gbG9nZ2luZyBvbmx5IGluIHJlY2VudCB2ZXJzaW9ucyBvZiBQeXRob24KIwp0cnk6CiAgICBmcm9tIGxvZ2dpbmcgaW1wb3J0IF9jaGVja0xldmVsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGRlZiBfY2hlY2tMZXZlbChsZXZlbCk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShsZXZlbCwgaW50KToKICAgICAgICAgICAgcnYgPSBsZXZlbAogICAgICAgIGVsaWYgc3RyKGxldmVsKSA9PSBsZXZlbDoKICAgICAgICAgICAgaWYgbGV2ZWwgbm90IGluIGxvZ2dpbmcuX2xldmVsTmFtZXM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duIGxldmVsOiAlcicgJSBsZXZlbCkKICAgICAgICAgICAgcnYgPSBsb2dnaW5nLl9sZXZlbE5hbWVzW2xldmVsXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignTGV2ZWwgbm90IGFuIGludGVnZXIgb3IgYSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsaWQgc3RyaW5nOiAlcicgJSBsZXZlbCkKICAgICAgICByZXR1cm4gcnYKCiMgVGhlIENvbnZlcnRpbmdYWFggY2xhc3NlcyBhcmUgd3JhcHBlcnMgYXJvdW5kIHN0YW5kYXJkIFB5dGhvbiBjb250YWluZXJzLAojIGFuZCB0aGV5IHNlcnZlIHRvIGNvbnZlcnQgYW55IHN1aXRhYmxlIHZhbHVlcyBpbiB0aGUgY29udGFpbmVyLiBUaGUKIyBjb252ZXJzaW9uIGNvbnZlcnRzIGJhc2UgZGljdHMsIGxpc3RzIGFuZCB0dXBsZXMgdG8gdGhlaXIgd3JhcHBlZAojIGVxdWl2YWxlbnRzLCB3aGVyZWFzIHN0cmluZ3Mgd2hpY2ggbWF0Y2ggYSBjb252ZXJzaW9uIGZvcm1hdCBhcmUgY29udmVydGVkCiMgYXBwcm9wcmlhdGVseS4KIwojIEVhY2ggd3JhcHBlciBzaG91bGQgaGF2ZSBhIGNvbmZpZ3VyYXRvciBhdHRyaWJ1dGUgaG9sZGluZyB0aGUgYWN0dWFsCiMgY29uZmlndXJhdG9yIHRvIHVzZSBmb3IgY29udmVyc2lvbi4KCgpjbGFzcyBDb252ZXJ0aW5nRGljdChkaWN0KToKICAgICIiIkEgY29udmVydGluZyBkaWN0aW9uYXJ5IHdyYXBwZXIuIiIiCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgdmFsdWUgPSBkaWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICMgSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgdmFsdWUgPSBkaWN0LmdldChzZWxmLCBrZXksIGRlZmF1bHQpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAjIElmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHZhbHVlID0gZGljdC5wb3Aoc2VsZiwga2V5LCBkZWZhdWx0KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIENvbnZlcnRpbmdMaXN0KGxpc3QpOgogICAgIiIiQSBjb252ZXJ0aW5nIGxpc3Qgd3JhcHBlci4iIiIKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHZhbHVlID0gbGlzdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAjIElmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwb3Aoc2VsZiwgaWR4PS0xKToKICAgICAgICB2YWx1ZSA9IGxpc3QucG9wKHNlbGYsIGlkeCkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBDb252ZXJ0aW5nVHVwbGUodHVwbGUpOgogICAgIiIiQSBjb252ZXJ0aW5nIHR1cGxlIHdyYXBwZXIuIiIiCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICB2YWx1ZSA9IHR1cGxlLl9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBCYXNlQ29uZmlndXJhdG9yKG9iamVjdCk6CiAgICAiIiIKICAgIFRoZSBjb25maWd1cmF0b3IgYmFzZSBjbGFzcyB3aGljaCBkZWZpbmVzIHNvbWUgdXNlZnVsIGRlZmF1bHRzLgogICAgIiIiCgogICAgQ09OVkVSVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ14oP1A8cHJlZml4PlthLXpdKyk6Ly8oP1A8c3VmZml4Pi4qKSQnKQoKICAgIFdPUkRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXHMqKFx3KylccyonKQogICAgRE9UX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlwuXHMqKFx3KylccyonKQogICAgSU5ERVhfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXFtccyooXHcrKVxzKlxdXHMqJykKICAgIERJR0lUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxkKyQnKQoKICAgIHZhbHVlX2NvbnZlcnRlcnMgPSB7CiAgICAgICAgJ2V4dCcgOiAnZXh0X2NvbnZlcnQnLAogICAgICAgICdjZmcnIDogJ2NmZ19jb252ZXJ0JywKICAgIH0KCiAgICAjIFdlIG1pZ2h0IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG9uZSwgZS5nLiBpbXBvcnRsaWIKICAgIGltcG9ydGVyID0gX19pbXBvcnRfXwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcpOgogICAgICAgIHNlbGYuY29uZmlnID0gQ29udmVydGluZ0RpY3QoY29uZmlnKQogICAgICAgIHNlbGYuY29uZmlnLmNvbmZpZ3VyYXRvciA9IHNlbGYKCiAgICBkZWYgcmVzb2x2ZShzZWxmLCBzKToKICAgICAgICAiIiIKICAgICAgICBSZXNvbHZlIHN0cmluZ3MgdG8gb2JqZWN0cyB1c2luZyBzdGFuZGFyZCBpbXBvcnQgYW5kIGF0dHJpYnV0ZQogICAgICAgIHN5bnRheC4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gcy5zcGxpdCgnLicpCiAgICAgICAgdXNlZCA9IG5hbWUucG9wKDApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3VuZCA9IHNlbGYuaW1wb3J0ZXIodXNlZCkKICAgICAgICAgICAgZm9yIGZyYWcgaW4gbmFtZToKICAgICAgICAgICAgICAgIHVzZWQgKz0gJy4nICsgZnJhZwogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZ2V0YXR0cihmb3VuZCwgZnJhZykKICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmltcG9ydGVyKHVzZWQpCiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBmcmFnKQogICAgICAgICAgICByZXR1cm4gZm91bmQKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIGUsIHRiID0gc3lzLmV4Y19pbmZvKClbMTpdCiAgICAgICAgICAgIHYgPSBWYWx1ZUVycm9yKCdDYW5ub3QgcmVzb2x2ZSAlcjogJXMnICUgKHMsIGUpKQogICAgICAgICAgICB2Ll9fY2F1c2VfXywgdi5fX3RyYWNlYmFja19fID0gZSwgdGIKICAgICAgICAgICAgcmFpc2UgdgoKICAgIGRlZiBleHRfY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBleHQ6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSh2YWx1ZSkKCiAgICBkZWYgY2ZnX2NvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgY2ZnOi8vIHByb3RvY29sLiIiIgogICAgICAgIHJlc3QgPSB2YWx1ZQogICAgICAgIG0gPSBzZWxmLldPUkRfUEFUVEVSTi5tYXRjaChyZXN0KQogICAgICAgIGlmIG0gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXIiICUgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdCA9IHJlc3RbbS5lbmQoKTpdCiAgICAgICAgICAgIGQgPSBzZWxmLmNvbmZpZ1ttLmdyb3VwcygpWzBdXQogICAgICAgICAgICAjIHByaW50IGQsIHJlc3QKICAgICAgICAgICAgd2hpbGUgcmVzdDoKICAgICAgICAgICAgICAgIG0gPSBzZWxmLkRPVF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgIGQgPSBkW20uZ3JvdXBzKClbMF1dCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG0gPSBzZWxmLklOREVYX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBtLmdyb3VwcygpWzBdCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLkRJR0lUX1BBVFRFUk4ubWF0Y2goaWR4KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW2lkeF0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gaW50KGlkeCkgICMgdHJ5IGFzIG51bWJlciBmaXJzdCAobW9zdCBsaWtlbHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbbl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQogICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbnZlcnQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGF0ICVyJyAlICh2YWx1ZSwgcmVzdCkpCiAgICAgICAgIyByZXN0IHNob3VsZCBiZSBlbXB0eQogICAgICAgIHJldHVybiBkCgogICAgZGVmIGNvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIENvbnZlcnQgdmFsdWVzIHRvIGFuIGFwcHJvcHJpYXRlIHR5cGUuIGRpY3RzLCBsaXN0cyBhbmQgdHVwbGVzIGFyZQogICAgICAgIHJlcGxhY2VkIGJ5IHRoZWlyIGNvbnZlcnRpbmcgYWx0ZXJuYXRpdmVzLiBTdHJpbmdzIGFyZSBjaGVja2VkIHRvCiAgICAgICAgc2VlIGlmIHRoZXkgaGF2ZSBhIGNvbnZlcnNpb24gZm9ybWF0IGFuZCBhcmUgY29udmVydGVkIGlmIHRoZXkgZG8uCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdEaWN0KSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ0RpY3QodmFsdWUpCiAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nTGlzdCkgYW5kIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgogICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdMaXN0KHZhbHVlKQogICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ1R1cGxlKSBhbmRcCiAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgogICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdUdXBsZSh2YWx1ZSkKICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgogICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc2l4LnN0cmluZ190eXBlcyk6ICAjIHN0ciBmb3IgcHkzawogICAgICAgICAgICBtID0gc2VsZi5DT05WRVJUX1BBVFRFUk4ubWF0Y2godmFsdWUpCiAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICBkID0gbS5ncm91cGRpY3QoKQogICAgICAgICAgICAgICAgcHJlZml4ID0gZFsncHJlZml4J10KICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IHNlbGYudmFsdWVfY29udmVydGVycy5nZXQocHJlZml4LCBOb25lKQogICAgICAgICAgICAgICAgaWYgY29udmVydGVyOgogICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGRbJ3N1ZmZpeCddCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyID0gZ2V0YXR0cihzZWxmLCBjb252ZXJ0ZXIpCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0ZXIoc3VmZml4KQogICAgICAgIHJldHVybiB2YWx1ZQoKICAgIGRlZiBjb25maWd1cmVfY3VzdG9tKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgIiIiQ29uZmlndXJlIGFuIG9iamVjdCB3aXRoIGEgdXNlci1zdXBwbGllZCBmYWN0b3J5LiIiIgogICAgICAgIGMgPSBjb25maWcucG9wKCcoKScpCiAgICAgICAgaWYgbm90IGhhc2F0dHIoYywgJ19fY2FsbF9fJykgYW5kIGhhc2F0dHIodHlwZXMsICdDbGFzc1R5cGUnKSBhbmQgdHlwZShjKSAhPSB0eXBlcy5DbGFzc1R5cGU6CiAgICAgICAgICAgIGMgPSBzZWxmLnJlc29sdmUoYykKICAgICAgICBwcm9wcyA9IGNvbmZpZy5wb3AoJy4nLCBOb25lKQogICAgICAgICMgQ2hlY2sgZm9yIHZhbGlkIGlkZW50aWZpZXJzCiAgICAgICAga3dhcmdzID0gZGljdCgoaywgY29uZmlnW2tdKSBmb3IgayBpbiBjb25maWcgaWYgdmFsaWRfaWRlbnQoaykpCiAgICAgICAgcmVzdWx0ID0gYygqKmt3YXJncykKICAgICAgICBpZiBwcm9wczoKICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHByb3BzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHJlc3VsdCwgbmFtZSwgdmFsdWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBhc190dXBsZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiVXRpbGl0eSBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBsaXN0cyB0byB0dXBsZXMuIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CiAgICAgICAgICAgIHZhbHVlID0gdHVwbGUodmFsdWUpCiAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgRGljdENvbmZpZ3VyYXRvcihCYXNlQ29uZmlndXJhdG9yKToKICAgICIiIgogICAgQ29uZmlndXJlIGxvZ2dpbmcgdXNpbmcgYSBkaWN0aW9uYXJ5LWxpa2Ugb2JqZWN0IHRvIGRlc2NyaWJlIHRoZQogICAgY29uZmlndXJhdGlvbi4KICAgICIiIgoKICAgIGRlZiBjb25maWd1cmUoc2VsZik6CiAgICAgICAgIiIiRG8gdGhlIGNvbmZpZ3VyYXRpb24uIiIiCgogICAgICAgIGNvbmZpZyA9IHNlbGYuY29uZmlnCiAgICAgICAgaWYgJ3ZlcnNpb24nIG5vdCBpbiBjb25maWc6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRpY3Rpb25hcnkgZG9lc24ndCBzcGVjaWZ5IGEgdmVyc2lvbiIpCiAgICAgICAgaWYgY29uZmlnWyd2ZXJzaW9uJ10gIT0gMToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5zdXBwb3J0ZWQgdmVyc2lvbjogJXMiICUgY29uZmlnWyd2ZXJzaW9uJ10pCiAgICAgICAgaW5jcmVtZW50YWwgPSBjb25maWcucG9wKCdpbmNyZW1lbnRhbCcsIEZhbHNlKQogICAgICAgIEVNUFRZX0RJQ1QgPSB7fQogICAgICAgIGxvZ2dpbmcuX2FjcXVpcmVMb2NrKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGluY3JlbWVudGFsOgogICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBjb25maWcuZ2V0KCdoYW5kbGVycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICAjIGluY3JlbWVudGFsIGhhbmRsZXIgY29uZmlnIG9ubHkgaWYgaGFuZGxlciBuYW1lCiAgICAgICAgICAgICAgICAjIHRpZXMgaW4gdG8gbG9nZ2luZy5faGFuZGxlcnMgKFB5dGhvbiAyLjcpCiAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMiwgNyk6CiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gaGFuZGxlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIGxvZ2dpbmcuX2hhbmRsZXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm8gaGFuZGxlciBmb3VuZCB3aXRoICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUgJXInICAlIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IGxvZ2dpbmcuX2hhbmRsZXJzW25hbWVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl9jb25maWcgPSBoYW5kbGVyc1tuYW1lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gaGFuZGxlcl9jb25maWcuZ2V0KCdsZXZlbCcsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV2ZWw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuc2V0TGV2ZWwoX2NoZWNrTGV2ZWwobGV2ZWwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGhhbmRsZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCiAgICAgICAgICAgICAgICBsb2dnZXJzID0gY29uZmlnLmdldCgnbG9nZ2VycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBsb2dnZXJzOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfbG9nZ2VyKG5hbWUsIGxvZ2dlcnNbbmFtZV0sIFRydWUpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBsb2dnZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQogICAgICAgICAgICAgICAgcm9vdCA9IGNvbmZpZy5nZXQoJ3Jvb3QnLCBOb25lKQogICAgICAgICAgICAgICAgaWYgcm9vdDoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX3Jvb3Qocm9vdCwgVHJ1ZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIHJvb3QgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2dnZXI6ICVzJyAlIGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkaXNhYmxlX2V4aXN0aW5nID0gY29uZmlnLnBvcCgnZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzJywgVHJ1ZSkKCiAgICAgICAgICAgICAgICBsb2dnaW5nLl9oYW5kbGVycy5jbGVhcigpCiAgICAgICAgICAgICAgICBkZWwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KCiAgICAgICAgICAgICAgICAjIERvIGZvcm1hdHRlcnMgZmlyc3QgLSB0aGV5IGRvbid0IHJlZmVyIHRvIGFueXRoaW5nIGVsc2UKICAgICAgICAgICAgICAgIGZvcm1hdHRlcnMgPSBjb25maWcuZ2V0KCdmb3JtYXR0ZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZvcm1hdHRlcnM6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJzW25hbWVdID0gc2VsZi5jb25maWd1cmVfZm9ybWF0dGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJzW25hbWVdKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtYXR0ZXIgJXI6ICVzJyAlIChuYW1lLCBlKSkKICAgICAgICAgICAgICAgICMgTmV4dCwgZG8gZmlsdGVycyAtIHRoZXkgZG9uJ3QgcmVmZXIgdG8gYW55dGhpbmcgZWxzZSwgZWl0aGVyCiAgICAgICAgICAgICAgICBmaWx0ZXJzID0gY29uZmlnLmdldCgnZmlsdGVycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWx0ZXJzOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tuYW1lXSA9IHNlbGYuY29uZmlndXJlX2ZpbHRlcihmaWx0ZXJzW25hbWVdKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWx0ZXIgJXI6ICVzJyAlIChuYW1lLCBlKSkKCiAgICAgICAgICAgICAgICAjIE5leHQsIGRvIGhhbmRsZXJzIC0gdGhleSByZWZlciB0byBmb3JtYXR0ZXJzIGFuZCBmaWx0ZXJzCiAgICAgICAgICAgICAgICAjIEFzIGhhbmRsZXJzIGNhbiByZWZlciB0byBvdGhlciBoYW5kbGVycywgc29ydCB0aGUga2V5cwogICAgICAgICAgICAgICAgIyB0byBhbGxvdyBhIGRldGVybWluaXN0aWMgb3JkZXIgb2YgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBjb25maWcuZ2V0KCdoYW5kbGVycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBzb3J0ZWQoaGFuZGxlcnMpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuY29uZmlndXJlX2hhbmRsZXIoaGFuZGxlcnNbbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIubmFtZSA9IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnNbbmFtZV0gPSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBoYW5kbGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKICAgICAgICAgICAgICAgICMgTmV4dCwgZG8gbG9nZ2VycyAtIHRoZXkgcmVmZXIgdG8gaGFuZGxlcnMgYW5kIGZpbHRlcnMKCiAgICAgICAgICAgICAgICAjIHdlIGRvbid0IHdhbnQgdG8gbG9zZSB0aGUgZXhpc3RpbmcgbG9nZ2VycywKICAgICAgICAgICAgICAgICMgc2luY2Ugb3RoZXIgdGhyZWFkcyBtYXkgaGF2ZSBwb2ludGVycyB0byB0aGVtLgogICAgICAgICAgICAgICAgIyBleGlzdGluZyBpcyBzZXQgdG8gY29udGFpbiBhbGwgZXhpc3RpbmcgbG9nZ2VycywKICAgICAgICAgICAgICAgICMgYW5kIGFzIHdlIGdvIHRocm91Z2ggdGhlIG5ldyBjb25maWd1cmF0aW9uIHdlCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBhbnkgd2hpY2ggYXJlIGNvbmZpZ3VyZWQuIEF0IHRoZSBlbmQsCiAgICAgICAgICAgICAgICAjIHdoYXQncyBsZWZ0IGluIGV4aXN0aW5nIGlzIHRoZSBzZXQgb2YgbG9nZ2VycwogICAgICAgICAgICAgICAgIyB3aGljaCB3ZXJlIGluIHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9uIGJ1dAogICAgICAgICAgICAgICAgIyB3aGljaCBhcmUgbm90IGluIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KICAgICAgICAgICAgICAgIHJvb3QgPSBsb2dnaW5nLnJvb3QKICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gbGlzdChyb290Lm1hbmFnZXIubG9nZ2VyRGljdCkKICAgICAgICAgICAgICAgICMgVGhlIGxpc3QgbmVlZHMgdG8gYmUgc29ydGVkIHNvIHRoYXQgd2UgY2FuCiAgICAgICAgICAgICAgICAjIGF2b2lkIGRpc2FibGluZyBjaGlsZCBsb2dnZXJzIG9mIGV4cGxpY2l0bHkKICAgICAgICAgICAgICAgICMgbmFtZWQgbG9nZ2Vycy4gV2l0aCBhIHNvcnRlZCBsaXN0IGl0IGlzIGVhc2llcgogICAgICAgICAgICAgICAgIyB0byBmaW5kIHRoZSBjaGlsZCBsb2dnZXJzLgogICAgICAgICAgICAgICAgZXhpc3Rpbmcuc29ydCgpCiAgICAgICAgICAgICAgICAjIFdlJ2xsIGtlZXAgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgbG9nZ2VycwogICAgICAgICAgICAgICAgIyB3aGljaCBhcmUgY2hpbGRyZW4gb2YgbmFtZWQgbG9nZ2VycyBoZXJlLi4uCiAgICAgICAgICAgICAgICBjaGlsZF9sb2dnZXJzID0gW10KICAgICAgICAgICAgICAgICMgbm93IHNldCB1cCB0aGUgbmV3IG9uZXMuLi4KICAgICAgICAgICAgICAgIGxvZ2dlcnMgPSBjb25maWcuZ2V0KCdsb2dnZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGxvZ2dlcnM6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBleGlzdGluZzoKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGV4aXN0aW5nLmluZGV4KG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeGVkID0gbmFtZSArICIuIgogICAgICAgICAgICAgICAgICAgICAgICBwZmxlbiA9IGxlbihwcmVmaXhlZCkKICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2V4aXN0aW5nID0gbGVuKGV4aXN0aW5nKQogICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEgICMgbG9vayBhdCB0aGUgZW50cnkgYWZ0ZXIgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IG51bV9leGlzdGluZykgYW5kXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhpc3RpbmdbaV1bOnBmbGVuXSA9PSBwcmVmaXhlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9sb2dnZXJzLmFwcGVuZChleGlzdGluZ1tpXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yZW1vdmUobmFtZSkKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX2xvZ2dlcihuYW1lLCBsb2dnZXJzW25hbWVdKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgbG9nZ2VyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKCiAgICAgICAgICAgICAgICAjIERpc2FibGUgYW55IG9sZCBsb2dnZXJzLiBUaGVyZSdzIG5vIHBvaW50IGRlbGV0aW5nCiAgICAgICAgICAgICAgICAjIHRoZW0gYXMgb3RoZXIgdGhyZWFkcyBtYXkgY29udGludWUgdG8gaG9sZCByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAjIGFuZCBieSBkaXNhYmxpbmcgdGhlbSwgeW91IHN0b3AgdGhlbSBkb2luZyBhbnkgbG9nZ2luZy4KICAgICAgICAgICAgICAgICMgSG93ZXZlciwgZG9uJ3QgZGlzYWJsZSBjaGlsZHJlbiBvZiBuYW1lZCBsb2dnZXJzLCBhcyB0aGF0J3MKICAgICAgICAgICAgICAgICMgcHJvYmFibHkgbm90IHdoYXQgd2FzIGludGVuZGVkIGJ5IHRoZSB1c2VyLgogICAgICAgICAgICAgICAgZm9yIGxvZyBpbiBleGlzdGluZzoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIgPSByb290Lm1hbmFnZXIubG9nZ2VyRGljdFtsb2ddCiAgICAgICAgICAgICAgICAgICAgaWYgbG9nIGluIGNoaWxkX2xvZ2dlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sZXZlbCA9IGxvZ2dpbmcuTk9UU0VUCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5oYW5kbGVycyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wcm9wYWdhdGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxpZiBkaXNhYmxlX2V4aXN0aW5nOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGlzYWJsZWQgPSBUcnVlCgogICAgICAgICAgICAgICAgIyBBbmQgZmluYWxseSwgZG8gdGhlIHJvb3QgbG9nZ2VyCiAgICAgICAgICAgICAgICByb290ID0gY29uZmlnLmdldCgncm9vdCcsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiByb290OgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfcm9vdChyb290KQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgcm9vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ2dlcjogJXMnICUgZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBsb2dnaW5nLl9yZWxlYXNlTG9jaygpCgogICAgZGVmIGNvbmZpZ3VyZV9mb3JtYXR0ZXIoc2VsZiwgY29uZmlnKToKICAgICAgICAiIiJDb25maWd1cmUgYSBmb3JtYXR0ZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCiAgICAgICAgaWYgJygpJyBpbiBjb25maWc6CiAgICAgICAgICAgIGZhY3RvcnkgPSBjb25maWdbJygpJ10gICMgZm9yIHVzZSBpbiBleGNlcHRpb24gaGFuZGxlcgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20oY29uZmlnKQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIHRlOgogICAgICAgICAgICAgICAgaWYgIidmb3JtYXQnIiBub3QgaW4gc3RyKHRlKToKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgIyBOYW1lIG9mIHBhcmFtZXRlciBjaGFuZ2VkIGZyb20gZm10IHRvIGZvcm1hdC4KICAgICAgICAgICAgICAgICMgUmV0cnkgd2l0aCBvbGQgbmFtZS4KICAgICAgICAgICAgICAgICMgVGhpcyBpcyBzbyB0aGF0IGNvZGUgY2FuIGJlIHVzZWQgd2l0aCBvbGRlciBQeXRob24gdmVyc2lvbnMKICAgICAgICAgICAgICAgICMoZS5nLiBieSBEamFuZ28pCiAgICAgICAgICAgICAgICBjb25maWdbJ2ZtdCddID0gY29uZmlnLnBvcCgnZm9ybWF0JykKICAgICAgICAgICAgICAgIGNvbmZpZ1snKCknXSA9IGZhY3RvcnkKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShjb25maWcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm10ID0gY29uZmlnLmdldCgnZm9ybWF0JywgTm9uZSkKICAgICAgICAgICAgZGZtdCA9IGNvbmZpZy5nZXQoJ2RhdGVmbXQnLCBOb25lKQogICAgICAgICAgICByZXN1bHQgPSBsb2dnaW5nLkZvcm1hdHRlcihmbXQsIGRmbXQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBjb25maWd1cmVfZmlsdGVyKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgIiIiQ29uZmlndXJlIGEgZmlsdGVyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgogICAgICAgIGlmICcoKScgaW4gY29uZmlnOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20oY29uZmlnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSBjb25maWcuZ2V0KCduYW1lJywgJycpCiAgICAgICAgICAgIHJlc3VsdCA9IGxvZ2dpbmcuRmlsdGVyKG5hbWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBhZGRfZmlsdGVycyhzZWxmLCBmaWx0ZXJlciwgZmlsdGVycyk6CiAgICAgICAgIiIiQWRkIGZpbHRlcnMgdG8gYSBmaWx0ZXJlciBmcm9tIGEgbGlzdCBvZiBuYW1lcy4iIiIKICAgICAgICBmb3IgZiBpbiBmaWx0ZXJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmaWx0ZXJlci5hZGRGaWx0ZXIoc2VsZi5jb25maWdbJ2ZpbHRlcnMnXVtmXSkKICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBhZGQgZmlsdGVyICVyOiAlcycgJSAoZiwgZSkpCgogICAgZGVmIGNvbmZpZ3VyZV9oYW5kbGVyKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgIiIiQ29uZmlndXJlIGEgaGFuZGxlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKICAgICAgICBmb3JtYXR0ZXIgPSBjb25maWcucG9wKCdmb3JtYXR0ZXInLCBOb25lKQogICAgICAgIGlmIGZvcm1hdHRlcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5jb25maWdbJ2Zvcm1hdHRlcnMnXVtmb3JtYXR0ZXJdCiAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gc2V0IGZvcm1hdHRlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKGZvcm1hdHRlciwgZSkpCiAgICAgICAgbGV2ZWwgPSBjb25maWcucG9wKCdsZXZlbCcsIE5vbmUpCiAgICAgICAgZmlsdGVycyA9IGNvbmZpZy5wb3AoJ2ZpbHRlcnMnLCBOb25lKQogICAgICAgIGlmICcoKScgaW4gY29uZmlnOgogICAgICAgICAgICBjID0gY29uZmlnLnBvcCgnKCknKQogICAgICAgICAgICBpZiBub3QgaGFzYXR0cihjLCAnX19jYWxsX18nKSBhbmQgaGFzYXR0cih0eXBlcywgJ0NsYXNzVHlwZScpIGFuZCB0eXBlKGMpICE9IHR5cGVzLkNsYXNzVHlwZToKICAgICAgICAgICAgICAgIGMgPSBzZWxmLnJlc29sdmUoYykKICAgICAgICAgICAgZmFjdG9yeSA9IGMKICAgICAgICBlbHNlOgogICAgICAgICAgICBrbGFzcyA9IHNlbGYucmVzb2x2ZShjb25maWcucG9wKCdjbGFzcycpKQogICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgaGFuZGxlciB3aGljaCByZWZlcnMgdG8gYW5vdGhlciBoYW5kbGVyCiAgICAgICAgICAgIGlmIGlzc3ViY2xhc3Moa2xhc3MsIGxvZ2dpbmcuaGFuZGxlcnMuTWVtb3J5SGFuZGxlcikgYW5kXAogICAgICAgICAgICAgICAgJ3RhcmdldCcgaW4gY29uZmlnOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1sndGFyZ2V0J10gPSBzZWxmLmNvbmZpZ1snaGFuZGxlcnMnXVtjb25maWdbJ3RhcmdldCddXQogICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gc2V0IHRhcmdldCBoYW5kbGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKGNvbmZpZ1sndGFyZ2V0J10sIGUpKQogICAgICAgICAgICBlbGlmIGlzc3ViY2xhc3Moa2xhc3MsIGxvZ2dpbmcuaGFuZGxlcnMuU01UUEhhbmRsZXIpIGFuZFwKICAgICAgICAgICAgICAgICdtYWlsaG9zdCcgaW4gY29uZmlnOgogICAgICAgICAgICAgICAgY29uZmlnWydtYWlsaG9zdCddID0gc2VsZi5hc190dXBsZShjb25maWdbJ21haWxob3N0J10pCiAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5TeXNMb2dIYW5kbGVyKSBhbmRcCiAgICAgICAgICAgICAgICAnYWRkcmVzcycgaW4gY29uZmlnOgogICAgICAgICAgICAgICAgY29uZmlnWydhZGRyZXNzJ10gPSBzZWxmLmFzX3R1cGxlKGNvbmZpZ1snYWRkcmVzcyddKQogICAgICAgICAgICBmYWN0b3J5ID0ga2xhc3MKICAgICAgICBrd2FyZ3MgPSBkaWN0KChrLCBjb25maWdba10pIGZvciBrIGluIGNvbmZpZyBpZiB2YWxpZF9pZGVudChrKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3VsdCA9IGZhY3RvcnkoKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyB0ZToKICAgICAgICAgICAgaWYgIidzdHJlYW0nIiBub3QgaW4gc3RyKHRlKToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICMgVGhlIGFyZ3VtZW50IG5hbWUgY2hhbmdlZCBmcm9tIHN0cm0gdG8gc3RyZWFtCiAgICAgICAgICAgICMgUmV0cnkgd2l0aCBvbGQgbmFtZS4KICAgICAgICAgICAgIyBUaGlzIGlzIHNvIHRoYXQgY29kZSBjYW4gYmUgdXNlZCB3aXRoIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucwogICAgICAgICAgICAjKGUuZy4gYnkgRGphbmdvKQogICAgICAgICAgICBrd2FyZ3NbJ3N0cm0nXSA9IGt3YXJncy5wb3AoJ3N0cmVhbScpCiAgICAgICAgICAgIHJlc3VsdCA9IGZhY3RvcnkoKiprd2FyZ3MpCiAgICAgICAgaWYgZm9ybWF0dGVyOgogICAgICAgICAgICByZXN1bHQuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcikKICAgICAgICBpZiBsZXZlbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVzdWx0LnNldExldmVsKF9jaGVja0xldmVsKGxldmVsKSkKICAgICAgICBpZiBmaWx0ZXJzOgogICAgICAgICAgICBzZWxmLmFkZF9maWx0ZXJzKHJlc3VsdCwgZmlsdGVycykKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGFkZF9oYW5kbGVycyhzZWxmLCBsb2dnZXIsIGhhbmRsZXJzKToKICAgICAgICAiIiJBZGQgaGFuZGxlcnMgdG8gYSBsb2dnZXIgZnJvbSBhIGxpc3Qgb2YgbmFtZXMuIiIiCiAgICAgICAgZm9yIGggaW4gaGFuZGxlcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKHNlbGYuY29uZmlnWydoYW5kbGVycyddW2hdKQogICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGFkZCBoYW5kbGVyICVyOiAlcycgJSAoaCwgZSkpCgogICAgZGVmIGNvbW1vbl9sb2dnZXJfY29uZmlnKHNlbGYsIGxvZ2dlciwgY29uZmlnLCBpbmNyZW1lbnRhbD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGVyZm9ybSBjb25maWd1cmF0aW9uIHdoaWNoIGlzIGNvbW1vbiB0byByb290IGFuZCBub24tcm9vdCBsb2dnZXJzLgogICAgICAgICIiIgogICAgICAgIGxldmVsID0gY29uZmlnLmdldCgnbGV2ZWwnLCBOb25lKQogICAgICAgIGlmIGxldmVsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIuc2V0TGV2ZWwoX2NoZWNrTGV2ZWwobGV2ZWwpKQogICAgICAgIGlmIG5vdCBpbmNyZW1lbnRhbDoKICAgICAgICAgICAgIyBSZW1vdmUgYW55IGV4aXN0aW5nIGhhbmRsZXJzCiAgICAgICAgICAgIGZvciBoIGluIGxvZ2dlci5oYW5kbGVyc1s6XToKICAgICAgICAgICAgICAgIGxvZ2dlci5yZW1vdmVIYW5kbGVyKGgpCiAgICAgICAgICAgIGhhbmRsZXJzID0gY29uZmlnLmdldCgnaGFuZGxlcnMnLCBOb25lKQogICAgICAgICAgICBpZiBoYW5kbGVyczoKICAgICAgICAgICAgICAgIHNlbGYuYWRkX2hhbmRsZXJzKGxvZ2dlciwgaGFuZGxlcnMpCiAgICAgICAgICAgIGZpbHRlcnMgPSBjb25maWcuZ2V0KCdmaWx0ZXJzJywgTm9uZSkKICAgICAgICAgICAgaWYgZmlsdGVyczoKICAgICAgICAgICAgICAgIHNlbGYuYWRkX2ZpbHRlcnMobG9nZ2VyLCBmaWx0ZXJzKQoKICAgIGRlZiBjb25maWd1cmVfbG9nZ2VyKHNlbGYsIG5hbWUsIGNvbmZpZywgaW5jcmVtZW50YWw9RmFsc2UpOgogICAgICAgICIiIkNvbmZpZ3VyZSBhIG5vbi1yb290IGxvZ2dlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihuYW1lKQogICAgICAgIHNlbGYuY29tbW9uX2xvZ2dlcl9jb25maWcobG9nZ2VyLCBjb25maWcsIGluY3JlbWVudGFsKQogICAgICAgIHByb3BhZ2F0ZSA9IGNvbmZpZy5nZXQoJ3Byb3BhZ2F0ZScsIE5vbmUpCiAgICAgICAgaWYgcHJvcGFnYXRlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIucHJvcGFnYXRlID0gcHJvcGFnYXRlCgogICAgZGVmIGNvbmZpZ3VyZV9yb290KHNlbGYsIGNvbmZpZywgaW5jcmVtZW50YWw9RmFsc2UpOgogICAgICAgICIiIkNvbmZpZ3VyZSBhIHJvb3QgbG9nZ2VyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgogICAgICAgIHJvb3QgPSBsb2dnaW5nLmdldExvZ2dlcigpCiAgICAgICAgc2VsZi5jb21tb25fbG9nZ2VyX2NvbmZpZyhyb290LCBjb25maWcsIGluY3JlbWVudGFsKQoKZGljdENvbmZpZ0NsYXNzID0gRGljdENvbmZpZ3VyYXRvcgoKCmRlZiBkaWN0Q29uZmlnKGNvbmZpZyk6CiAgICAiIiJDb25maWd1cmUgbG9nZ2luZyB1c2luZyBhIGRpY3Rpb25hcnkuIiIiCiAgICBkaWN0Q29uZmlnQ2xhc3MoY29uZmlnKS5jb25maWd1cmUoKQpQSwMEFAAAAAAAAAAhAP0/KVGZfQAAmX0AACwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9kb3dubG9hZC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgY2dpCmltcG9ydCBlbWFpbC51dGlscwppbXBvcnQgZ2V0cGFzcwppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgbWltZXR5cGVzCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKCnRyeToKICAgIGltcG9ydCBzc2wgICMgbm9xYQogICAgSEFTX1RMUyA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgSEFTX1RMUyA9IEZhbHNlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHJlcXVlc3QgYXMgdXJsbGliX3JlcXVlc3QKCmltcG9ydCBwaXAKCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEluc3RhbGxhdGlvbkVycm9yLCBIYXNoTWlzbWF0Y2gKZnJvbSBwaXAubW9kZWxzIGltcG9ydCBQeVBJCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoc3BsaXRleHQsIHJtdHJlZSwgZm9ybWF0X3NpemUsIGRpc3BsYXlfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBfZGlyLCBhc2tfcGF0aF9leGlzdHMsIHVucGFja19maWxlLAogICAgICAgICAgICAgICAgICAgICAgIEFSQ0hJVkVfRVhURU5TSU9OUywgY29uc3VtZSwgY2FsbF9zdWJwcm9jZXNzKQpmcm9tIHBpcC51dGlscy5lbmNvZGluZyBpbXBvcnQgYXV0b19kZWNvZGUKZnJvbSBwaXAudXRpbHMuZmlsZXN5c3RlbSBpbXBvcnQgY2hlY2tfcGF0aF9vd25lcgpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnV0aWxzLnNldHVwdG9vbHNfYnVpbGQgaW1wb3J0IFNFVFVQVE9PTFNfU0hJTQpmcm9tIHBpcC51dGlscy5nbGliYyBpbXBvcnQgbGliY192ZXIKZnJvbSBwaXAudXRpbHMudWkgaW1wb3J0IERvd25sb2FkUHJvZ3Jlc3NCYXIsIERvd25sb2FkUHJvZ3Jlc3NTcGlubmVyCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgd3JpdGVfZGVsZXRlX21hcmtlcl9maWxlCmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHJlcXVlc3RzLCBzaXgKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5hZGFwdGVycyBpbXBvcnQgQmFzZUFkYXB0ZXIsIEhUVFBBZGFwdGVyCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMuYXV0aCBpbXBvcnQgQXV0aEJhc2UsIEhUVFBCYXNpY0F1dGgKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5tb2RlbHMgaW1wb3J0IENPTlRFTlRfQ0hVTktfU0laRSwgUmVzcG9uc2UKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy51dGlscyBpbXBvcnQgZ2V0X25ldHJjX2F1dGgKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0CmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHVybGxpYjMKZnJvbSBwaXAuX3ZlbmRvci5jYWNoZWNvbnRyb2wgaW1wb3J0IENhY2hlQ29udHJvbEFkYXB0ZXIKZnJvbSBwaXAuX3ZlbmRvci5jYWNoZWNvbnRyb2wuY2FjaGVzIGltcG9ydCBGaWxlQ2FjaGUKZnJvbSBwaXAuX3ZlbmRvci5sb2NrZmlsZSBpbXBvcnQgTG9ja0Vycm9yCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCB4bWxycGNfY2xpZW50CgoKX19hbGxfXyA9IFsnZ2V0X2ZpbGVfY29udGVudCcsCiAgICAgICAgICAgJ2lzX3VybCcsICd1cmxfdG9fcGF0aCcsICdwYXRoX3RvX3VybCcsCiAgICAgICAgICAgJ2lzX2FyY2hpdmVfZmlsZScsICd1bnBhY2tfdmNzX2xpbmsnLAogICAgICAgICAgICd1bnBhY2tfZmlsZV91cmwnLCAnaXNfdmNzX3VybCcsICdpc19maWxlX3VybCcsCiAgICAgICAgICAgJ3VucGFja19odHRwX3VybCcsICd1bnBhY2tfdXJsJ10KCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpkZWYgdXNlcl9hZ2VudCgpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB1c2VyIGFnZW50LgogICAgIiIiCiAgICBkYXRhID0gewogICAgICAgICJpbnN0YWxsZXIiOiB7Im5hbWUiOiAicGlwIiwgInZlcnNpb24iOiBwaXAuX192ZXJzaW9uX199LAogICAgICAgICJweXRob24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLAogICAgICAgICJpbXBsZW1lbnRhdGlvbiI6IHsKICAgICAgICAgICAgIm5hbWUiOiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwKICAgICAgICB9LAogICAgfQoKICAgIGlmIGRhdGFbImltcGxlbWVudGF0aW9uIl1bIm5hbWUiXSA9PSAnQ1B5dGhvbic6CiAgICAgICAgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsidmVyc2lvbiJdID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQogICAgZWxpZiBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJuYW1lIl0gPT0gJ1B5UHknOgogICAgICAgIGlmIHN5cy5weXB5X3ZlcnNpb25faW5mby5yZWxlYXNlbGV2ZWwgPT0gJ2ZpbmFsJzoKICAgICAgICAgICAgcHlweV92ZXJzaW9uX2luZm8gPSBzeXMucHlweV92ZXJzaW9uX2luZm9bOjNdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHlweV92ZXJzaW9uX2luZm8gPSBzeXMucHlweV92ZXJzaW9uX2luZm8KICAgICAgICBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJ2ZXJzaW9uIl0gPSAiLiIuam9pbigKICAgICAgICAgICAgW3N0cih4KSBmb3IgeCBpbiBweXB5X3ZlcnNpb25faW5mb10KICAgICAgICApCiAgICBlbGlmIGRhdGFbImltcGxlbWVudGF0aW9uIl1bIm5hbWUiXSA9PSAnSnl0aG9uJzoKICAgICAgICAjIENvbXBsZXRlIEd1ZXNzCiAgICAgICAgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsidmVyc2lvbiJdID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQogICAgZWxpZiBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJuYW1lIl0gPT0gJ0lyb25QeXRob24nOgogICAgICAgICMgQ29tcGxldGUgR3Vlc3MKICAgICAgICBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJ2ZXJzaW9uIl0gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImxpbnV4Iik6CiAgICAgICAgZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgZGlzdHJvCiAgICAgICAgZGlzdHJvX2luZm9zID0gZGljdChmaWx0ZXIoCiAgICAgICAgICAgIGxhbWJkYSB4OiB4WzFdLAogICAgICAgICAgICB6aXAoWyJuYW1lIiwgInZlcnNpb24iLCAiaWQiXSwgZGlzdHJvLmxpbnV4X2Rpc3RyaWJ1dGlvbigpKSwKICAgICAgICApKQogICAgICAgIGxpYmMgPSBkaWN0KGZpbHRlcigKICAgICAgICAgICAgbGFtYmRhIHg6IHhbMV0sCiAgICAgICAgICAgIHppcChbImxpYiIsICJ2ZXJzaW9uIl0sIGxpYmNfdmVyKCkpLAogICAgICAgICkpCiAgICAgICAgaWYgbGliYzoKICAgICAgICAgICAgZGlzdHJvX2luZm9zWyJsaWJjIl0gPSBsaWJjCiAgICAgICAgaWYgZGlzdHJvX2luZm9zOgogICAgICAgICAgICBkYXRhWyJkaXN0cm8iXSA9IGRpc3Ryb19pbmZvcwoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJkYXJ3aW4iKSBhbmQgcGxhdGZvcm0ubWFjX3ZlcigpWzBdOgogICAgICAgIGRhdGFbImRpc3RybyJdID0geyJuYW1lIjogIm1hY09TIiwgInZlcnNpb24iOiBwbGF0Zm9ybS5tYWNfdmVyKClbMF19CgogICAgaWYgcGxhdGZvcm0uc3lzdGVtKCk6CiAgICAgICAgZGF0YS5zZXRkZWZhdWx0KCJzeXN0ZW0iLCB7fSlbIm5hbWUiXSA9IHBsYXRmb3JtLnN5c3RlbSgpCgogICAgaWYgcGxhdGZvcm0ucmVsZWFzZSgpOgogICAgICAgIGRhdGEuc2V0ZGVmYXVsdCgic3lzdGVtIiwge30pWyJyZWxlYXNlIl0gPSBwbGF0Zm9ybS5yZWxlYXNlKCkKCiAgICBpZiBwbGF0Zm9ybS5tYWNoaW5lKCk6CiAgICAgICAgZGF0YVsiY3B1Il0gPSBwbGF0Zm9ybS5tYWNoaW5lKCkKCiAgICAjIFB5dGhvbiAyLjYgZG9lc24ndCBoYXZlIHNzbC5PUEVOU1NMX1ZFUlNJT04uCiAgICBpZiBIQVNfVExTIGFuZCBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgyLCA2KToKICAgICAgICBkYXRhWyJvcGVuc3NsX3ZlcnNpb24iXSA9IHNzbC5PUEVOU1NMX1ZFUlNJT04KCiAgICByZXR1cm4gIntkYXRhW2luc3RhbGxlcl1bbmFtZV19L3tkYXRhW2luc3RhbGxlcl1bdmVyc2lvbl19IHtqc29ufSIuZm9ybWF0KAogICAgICAgIGRhdGE9ZGF0YSwKICAgICAgICBqc29uPWpzb24uZHVtcHMoZGF0YSwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpLCBzb3J0X2tleXM9VHJ1ZSksCiAgICApCgoKY2xhc3MgTXVsdGlEb21haW5CYXNpY0F1dGgoQXV0aEJhc2UpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9tcHRpbmc9VHJ1ZSk6CiAgICAgICAgc2VsZi5wcm9tcHRpbmcgPSBwcm9tcHRpbmcKICAgICAgICBzZWxmLnBhc3N3b3JkcyA9IHt9CgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIHJlcSk6CiAgICAgICAgcGFyc2VkID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKHJlcS51cmwpCgogICAgICAgICMgR2V0IHRoZSBuZXRsb2Mgd2l0aG91dCBhbnkgZW1iZWRkZWQgY3JlZGVudGlhbHMKICAgICAgICBuZXRsb2MgPSBwYXJzZWQubmV0bG9jLnJzcGxpdCgiQCIsIDEpWy0xXQoKICAgICAgICAjIFNldCB0aGUgdXJsIG9mIHRoZSByZXF1ZXN0IHRvIHRoZSB1cmwgd2l0aG91dCBhbnkgY3JlZGVudGlhbHMKICAgICAgICByZXEudXJsID0gdXJsbGliX3BhcnNlLnVybHVucGFyc2UocGFyc2VkWzoxXSArIChuZXRsb2MsKSArIHBhcnNlZFsyOl0pCgogICAgICAgICMgVXNlIGFueSBzdG9yZWQgY3JlZGVudGlhbHMgdGhhdCB3ZSBoYXZlIGZvciB0aGlzIG5ldGxvYwogICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IHNlbGYucGFzc3dvcmRzLmdldChuZXRsb2MsIChOb25lLCBOb25lKSkKCiAgICAgICAgIyBFeHRyYWN0IGNyZWRlbnRpYWxzIGVtYmVkZGVkIGluIHRoZSB1cmwgaWYgd2UgaGF2ZSBub25lIHN0b3JlZAogICAgICAgIGlmIHVzZXJuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IHNlbGYucGFyc2VfY3JlZGVudGlhbHMocGFyc2VkLm5ldGxvYykKCiAgICAgICAgIyBHZXQgY3JlZHMgZnJvbSBuZXRyYyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIHRoZW0KICAgICAgICBpZiB1c2VybmFtZSBpcyBOb25lIGFuZCBwYXNzd29yZCBpcyBOb25lOgogICAgICAgICAgICBuZXRyY19hdXRoID0gZ2V0X25ldHJjX2F1dGgocmVxLnVybCkKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gbmV0cmNfYXV0aCBpZiBuZXRyY19hdXRoIGVsc2UgKE5vbmUsIE5vbmUpCgogICAgICAgIGlmIHVzZXJuYW1lIG9yIHBhc3N3b3JkOgogICAgICAgICAgICAjIFN0b3JlIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQKICAgICAgICAgICAgc2VsZi5wYXNzd29yZHNbbmV0bG9jXSA9ICh1c2VybmFtZSwgcGFzc3dvcmQpCgogICAgICAgICAgICAjIFNlbmQgdGhlIGJhc2ljIGF1dGggd2l0aCB0aGlzIHJlcXVlc3QKICAgICAgICAgICAgcmVxID0gSFRUUEJhc2ljQXV0aCh1c2VybmFtZSBvciAiIiwgcGFzc3dvcmQgb3IgIiIpKHJlcSkKCiAgICAgICAgIyBBdHRhY2ggYSBob29rIHRvIGhhbmRsZSA0MDEgcmVzcG9uc2VzCiAgICAgICAgcmVxLnJlZ2lzdGVyX2hvb2soInJlc3BvbnNlIiwgc2VsZi5oYW5kbGVfNDAxKQoKICAgICAgICByZXR1cm4gcmVxCgogICAgZGVmIGhhbmRsZV80MDEoc2VsZiwgcmVzcCwgKiprd2FyZ3MpOgogICAgICAgICMgV2Ugb25seSBjYXJlIGFib3V0IDQwMSByZXNwb25zZXMsIGFueXRoaW5nIGVsc2Ugd2Ugd2FudCB0byBqdXN0CiAgICAgICAgIyAgIHBhc3MgdGhyb3VnaCB0aGUgYWN0dWFsIHJlc3BvbnNlCiAgICAgICAgaWYgcmVzcC5zdGF0dXNfY29kZSAhPSA0MDE6CiAgICAgICAgICAgIHJldHVybiByZXNwCgogICAgICAgICMgV2UgYXJlIG5vdCBhYmxlIHRvIHByb21wdCB0aGUgdXNlciBzbyBzaW1wbHkgcmV0dXJuIHRoZSByZXNwb25zZQogICAgICAgIGlmIG5vdCBzZWxmLnByb21wdGluZzoKICAgICAgICAgICAgcmV0dXJuIHJlc3AKCiAgICAgICAgcGFyc2VkID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKHJlc3AudXJsKQoKICAgICAgICAjIFByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiAgICAgICAgdXNlcm5hbWUgPSBzaXgubW92ZXMuaW5wdXQoIlVzZXIgZm9yICVzOiAiICUgcGFyc2VkLm5ldGxvYykKICAgICAgICBwYXNzd29yZCA9IGdldHBhc3MuZ2V0cGFzcygiUGFzc3dvcmQ6ICIpCgogICAgICAgICMgU3RvcmUgdGhlIG5ldyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gdXNlIGZvciBmdXR1cmUgcmVxdWVzdHMKICAgICAgICBpZiB1c2VybmFtZSBvciBwYXNzd29yZDoKICAgICAgICAgICAgc2VsZi5wYXNzd29yZHNbcGFyc2VkLm5ldGxvY10gPSAodXNlcm5hbWUsIHBhc3N3b3JkKQoKICAgICAgICAjIENvbnN1bWUgY29udGVudCBhbmQgcmVsZWFzZSB0aGUgb3JpZ2luYWwgY29ubmVjdGlvbiB0byBhbGxvdyBvdXIgbmV3CiAgICAgICAgIyAgIHJlcXVlc3QgdG8gcmV1c2UgdGhlIHNhbWUgb25lLgogICAgICAgIHJlc3AuY29udGVudAogICAgICAgIHJlc3AucmF3LnJlbGVhc2VfY29ubigpCgogICAgICAgICMgQWRkIG91ciBuZXcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSByZXF1ZXN0CiAgICAgICAgcmVxID0gSFRUUEJhc2ljQXV0aCh1c2VybmFtZSBvciAiIiwgcGFzc3dvcmQgb3IgIiIpKHJlc3AucmVxdWVzdCkKCiAgICAgICAgIyBTZW5kIG91ciBuZXcgcmVxdWVzdAogICAgICAgIG5ld19yZXNwID0gcmVzcC5jb25uZWN0aW9uLnNlbmQocmVxLCAqKmt3YXJncykKICAgICAgICBuZXdfcmVzcC5oaXN0b3J5LmFwcGVuZChyZXNwKQoKICAgICAgICByZXR1cm4gbmV3X3Jlc3AKCiAgICBkZWYgcGFyc2VfY3JlZGVudGlhbHMoc2VsZiwgbmV0bG9jKToKICAgICAgICBpZiAiQCIgaW4gbmV0bG9jOgogICAgICAgICAgICB1c2VyaW5mbyA9IG5ldGxvYy5yc3BsaXQoIkAiLCAxKVswXQogICAgICAgICAgICBpZiAiOiIgaW4gdXNlcmluZm86CiAgICAgICAgICAgICAgICByZXR1cm4gdXNlcmluZm8uc3BsaXQoIjoiLCAxKQogICAgICAgICAgICByZXR1cm4gdXNlcmluZm8sIE5vbmUKICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQoKCmNsYXNzIExvY2FsRlNBZGFwdGVyKEJhc2VBZGFwdGVyKToKCiAgICBkZWYgc2VuZChzZWxmLCByZXF1ZXN0LCBzdHJlYW09Tm9uZSwgdGltZW91dD1Ob25lLCB2ZXJpZnk9Tm9uZSwgY2VydD1Ob25lLAogICAgICAgICAgICAgcHJveGllcz1Ob25lKToKICAgICAgICBwYXRobmFtZSA9IHVybF90b19wYXRoKHJlcXVlc3QudXJsKQoKICAgICAgICByZXNwID0gUmVzcG9uc2UoKQogICAgICAgIHJlc3Auc3RhdHVzX2NvZGUgPSAyMDAKICAgICAgICByZXNwLnVybCA9IHJlcXVlc3QudXJsCgogICAgICAgIHRyeToKICAgICAgICAgICAgc3RhdHMgPSBvcy5zdGF0KHBhdGhuYW1lKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmVzcC5zdGF0dXNfY29kZSA9IDQwNAogICAgICAgICAgICByZXNwLnJhdyA9IGV4YwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZGlmaWVkID0gZW1haWwudXRpbHMuZm9ybWF0ZGF0ZShzdGF0cy5zdF9tdGltZSwgdXNlZ210PVRydWUpCiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IG1pbWV0eXBlcy5ndWVzc190eXBlKHBhdGhuYW1lKVswXSBvciAidGV4dC9wbGFpbiIKICAgICAgICAgICAgcmVzcC5oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdCh7CiAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIjogY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoIjogc3RhdHMuc3Rfc2l6ZSwKICAgICAgICAgICAgICAgICJMYXN0LU1vZGlmaWVkIjogbW9kaWZpZWQsCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICByZXNwLnJhdyA9IG9wZW4ocGF0aG5hbWUsICJyYiIpCiAgICAgICAgICAgIHJlc3AuY2xvc2UgPSByZXNwLnJhdy5jbG9zZQoKICAgICAgICByZXR1cm4gcmVzcAoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBwYXNzCgoKY2xhc3MgU2FmZUZpbGVDYWNoZShGaWxlQ2FjaGUpOgogICAgIiIiCiAgICBBIGZpbGUgYmFzZWQgY2FjaGUgd2hpY2ggaXMgc2FmZSB0byB1c2UgZXZlbiB3aGVuIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG1heQogICAgbm90IGJlIGFjY2Vzc2libGUgb3Igd3JpdGFibGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihTYWZlRmlsZUNhY2hlLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgICAgICMgQ2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIG91ciBjYWNoZSBkaXJlY3RvcnkKICAgICAgICAjIGlzIG93bmVkIGJ5IHRoZSB1c2VyIGN1cnJlbnQgZXhlY3V0aW5nIHBpcC4gSWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAgICAjIHdlIHdpbGwgY2hlY2sgdGhlIHBhcmVudCBkaXJlY3RvcnkgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBkb2VzIGV4aXN0LgogICAgICAgICMgSWYgaXQgaXMgbm90IG93bmVkIGJ5IHRoZSB1c2VyIGV4ZWN1dGluZyBwaXAgdGhlbiB3ZSB3aWxsIGRpc2FibGUKICAgICAgICAjIHRoZSBjYWNoZSBhbmQgbG9nIGEgd2FybmluZy4KICAgICAgICBpZiBub3QgY2hlY2tfcGF0aF9vd25lcihzZWxmLmRpcmVjdG9yeSk6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgIlRoZSBkaXJlY3RvcnkgJyVzJyBvciBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBub3Qgb3duZWQgYnkgIgogICAgICAgICAgICAgICAgInRoZSBjdXJyZW50IHVzZXIgYW5kIHRoZSBjYWNoZSBoYXMgYmVlbiBkaXNhYmxlZC4gUGxlYXNlICIKICAgICAgICAgICAgICAgICJjaGVjayB0aGUgcGVybWlzc2lvbnMgYW5kIG93bmVyIG9mIHRoYXQgZGlyZWN0b3J5LiBJZiAiCiAgICAgICAgICAgICAgICAiZXhlY3V0aW5nIHBpcCB3aXRoIHN1ZG8sIHlvdSBtYXkgd2FudCBzdWRvJ3MgLUggZmxhZy4iLAogICAgICAgICAgICAgICAgc2VsZi5kaXJlY3RvcnksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgU2V0IG91ciBkaXJlY3RvcnkgdG8gTm9uZSB0byBkaXNhYmxlIHRoZSBDYWNoZQogICAgICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IE5vbmUKCiAgICBkZWYgZ2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBjYWNoZSBzaG91bGQgYmUgYSBuby1vcC4KICAgICAgICBpZiBzZWxmLmRpcmVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoU2FmZUZpbGVDYWNoZSwgc2VsZikuZ2V0KCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKExvY2tFcnJvciwgT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgV2UgaW50ZW50aW9uYWxseSBzaWxlbmNlIHRoaXMgZXJyb3IsIGlmIHdlIGNhbid0IGFjY2VzcyB0aGUgY2FjaGUKICAgICAgICAgICAgIyB0aGVuIHdlIGNhbiBqdXN0IHNraXAgY2FjaGluZyBhbmQgcHJvY2VzcyB0aGUgcmVxdWVzdCBhcyBpZgogICAgICAgICAgICAjIGNhY2hpbmcgd2Fzbid0IGVuYWJsZWQuCiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgc2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBjYWNoZSBzaG91bGQgYmUgYSBuby1vcC4KICAgICAgICBpZiBzZWxmLmRpcmVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoU2FmZUZpbGVDYWNoZSwgc2VsZikuc2V0KCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKExvY2tFcnJvciwgT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgV2UgaW50ZW50aW9uYWxseSBzaWxlbmNlIHRoaXMgZXJyb3IsIGlmIHdlIGNhbid0IGFjY2VzcyB0aGUgY2FjaGUKICAgICAgICAgICAgIyB0aGVuIHdlIGNhbiBqdXN0IHNraXAgY2FjaGluZyBhbmQgcHJvY2VzcyB0aGUgcmVxdWVzdCBhcyBpZgogICAgICAgICAgICAjIGNhY2hpbmcgd2Fzbid0IGVuYWJsZWQuCiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgZGVsZXRlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBjYWNoZSBzaG91bGQgYmUgYSBuby1vcC4KICAgICAgICBpZiBzZWxmLmRpcmVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoU2FmZUZpbGVDYWNoZSwgc2VsZikuZGVsZXRlKCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKExvY2tFcnJvciwgT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgV2UgaW50ZW50aW9uYWxseSBzaWxlbmNlIHRoaXMgZXJyb3IsIGlmIHdlIGNhbid0IGFjY2VzcyB0aGUgY2FjaGUKICAgICAgICAgICAgIyB0aGVuIHdlIGNhbiBqdXN0IHNraXAgY2FjaGluZyBhbmQgcHJvY2VzcyB0aGUgcmVxdWVzdCBhcyBpZgogICAgICAgICAgICAjIGNhY2hpbmcgd2Fzbid0IGVuYWJsZWQuCiAgICAgICAgICAgIHBhc3MKCgpjbGFzcyBJbnNlY3VyZUhUVFBBZGFwdGVyKEhUVFBBZGFwdGVyKToKCiAgICBkZWYgY2VydF92ZXJpZnkoc2VsZiwgY29ubiwgdXJsLCB2ZXJpZnksIGNlcnQpOgogICAgICAgIGNvbm4uY2VydF9yZXFzID0gJ0NFUlRfTk9ORScKICAgICAgICBjb25uLmNhX2NlcnRzID0gTm9uZQoKCmNsYXNzIFBpcFNlc3Npb24ocmVxdWVzdHMuU2Vzc2lvbik6CgogICAgdGltZW91dCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICByZXRyaWVzID0ga3dhcmdzLnBvcCgicmV0cmllcyIsIDApCiAgICAgICAgY2FjaGUgPSBrd2FyZ3MucG9wKCJjYWNoZSIsIE5vbmUpCiAgICAgICAgaW5zZWN1cmVfaG9zdHMgPSBrd2FyZ3MucG9wKCJpbnNlY3VyZV9ob3N0cyIsIFtdKQoKICAgICAgICBzdXBlcihQaXBTZXNzaW9uLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgICAgICMgQXR0YWNoIG91ciBVc2VyIEFnZW50IHRvIHRoZSByZXF1ZXN0CiAgICAgICAgc2VsZi5oZWFkZXJzWyJVc2VyLUFnZW50Il0gPSB1c2VyX2FnZW50KCkKCiAgICAgICAgIyBBdHRhY2ggb3VyIEF1dGhlbnRpY2F0aW9uIGhhbmRsZXIgdG8gdGhlIHNlc3Npb24KICAgICAgICBzZWxmLmF1dGggPSBNdWx0aURvbWFpbkJhc2ljQXV0aCgpCgogICAgICAgICMgQ3JlYXRlIG91ciB1cmxsaWIzLlJldHJ5IGluc3RhbmNlIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gY3VzdG9taXplCiAgICAgICAgIyBob3cgd2UgaGFuZGxlIHJldHJpZXMuCiAgICAgICAgcmV0cmllcyA9IHVybGxpYjMuUmV0cnkoCiAgICAgICAgICAgICMgU2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgcmV0cmllcyB0aGF0IGEgcGFydGljdWxhciByZXF1ZXN0IGNhbgogICAgICAgICAgICAjIGhhdmUuCiAgICAgICAgICAgIHRvdGFsPXJldHJpZXMsCgogICAgICAgICAgICAjIEEgNTAzIGVycm9yIGZyb20gUHlQSSB0eXBpY2FsbHkgbWVhbnMgdGhhdCB0aGUgRmFzdGx5IC0+IE9yaWdpbgogICAgICAgICAgICAjIGNvbm5lY3Rpb24gZ290IGludGVycnVwdGVkIGluIHNvbWUgd2F5LiBBIDUwMyBlcnJvciBpbiBnZW5lcmFsCiAgICAgICAgICAgICMgaXMgdHlwaWNhbGx5IGNvbnNpZGVyZWQgYSB0cmFuc2llbnQgZXJyb3Igc28gd2UnbGwgZ28gYWhlYWQgYW5kCiAgICAgICAgICAgICMgcmV0cnkgaXQuCiAgICAgICAgICAgIHN0YXR1c19mb3JjZWxpc3Q9WzUwM10sCgogICAgICAgICAgICAjIEFkZCBhIHNtYWxsIGFtb3VudCBvZiBiYWNrIG9mZiBiZXR3ZWVuIGZhaWxlZCByZXF1ZXN0cyBpbgogICAgICAgICAgICAjIG9yZGVyIHRvIHByZXZlbnQgaGFtbWVyaW5nIHRoZSBzZXJ2aWNlLgogICAgICAgICAgICBiYWNrb2ZmX2ZhY3Rvcj0wLjI1LAogICAgICAgICkKCiAgICAgICAgIyBXZSB3YW50IHRvIF9vbmx5XyBjYWNoZSByZXNwb25zZXMgb24gc2VjdXJlbHkgZmV0Y2hlZCBvcmlnaW5zLiBXZSBkbwogICAgICAgICMgdGhpcyBiZWNhdXNlIHdlIGNhbid0IHZhbGlkYXRlIHRoZSByZXNwb25zZSBvZiBhbiBpbnNlY3VyZWx5IGZldGNoZWQKICAgICAgICAjIG9yaWdpbiwgYW5kIHdlIGRvbid0IHdhbnQgc29tZW9uZSB0byBiZSBhYmxlIHRvIHBvaXNvbiB0aGUgY2FjaGUgYW5kCiAgICAgICAgIyByZXF1aXJlIG1hbnVhbCBldmljdGlvbiBmcm9tIHRoZSBjYWNoZSB0byBmaXggaXQuCiAgICAgICAgaWYgY2FjaGU6CiAgICAgICAgICAgIHNlY3VyZV9hZGFwdGVyID0gQ2FjaGVDb250cm9sQWRhcHRlcigKICAgICAgICAgICAgICAgIGNhY2hlPVNhZmVGaWxlQ2FjaGUoY2FjaGUsIHVzZV9kaXJfbG9jaz1UcnVlKSwKICAgICAgICAgICAgICAgIG1heF9yZXRyaWVzPXJldHJpZXMsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWN1cmVfYWRhcHRlciA9IEhUVFBBZGFwdGVyKG1heF9yZXRyaWVzPXJldHJpZXMpCgogICAgICAgICMgT3VyIEluc2VjdXJlIEhUVFBBZGFwdGVyIGRpc2FibGVzIEhUVFBTIHZhbGlkYXRpb24uIEl0IGRvZXMgbm90CiAgICAgICAgIyBzdXBwb3J0IGNhY2hpbmcgKHNlZSBhYm92ZSkgc28gd2UnbGwgdXNlIGl0IGZvciBhbGwgaHR0cDovLyBVUkxzIGFzCiAgICAgICAgIyB3ZWxsIGFzIGFueSBodHRwczovLyBob3N0IHRoYXQgd2UndmUgbWFya2VkIGFzIGlnbm9yaW5nIFRMUyBlcnJvcnMKICAgICAgICAjIGZvci4KICAgICAgICBpbnNlY3VyZV9hZGFwdGVyID0gSW5zZWN1cmVIVFRQQWRhcHRlcihtYXhfcmV0cmllcz1yZXRyaWVzKQoKICAgICAgICBzZWxmLm1vdW50KCJodHRwczovLyIsIHNlY3VyZV9hZGFwdGVyKQogICAgICAgIHNlbGYubW91bnQoImh0dHA6Ly8iLCBpbnNlY3VyZV9hZGFwdGVyKQoKICAgICAgICAjIEVuYWJsZSBmaWxlOi8vIHVybHMKICAgICAgICBzZWxmLm1vdW50KCJmaWxlOi8vIiwgTG9jYWxGU0FkYXB0ZXIoKSkKCiAgICAgICAgIyBXZSB3YW50IHRvIHVzZSBhIG5vbi12YWxpZGF0aW5nIGFkYXB0ZXIgZm9yIGFueSByZXF1ZXN0cyB3aGljaCBhcmUKICAgICAgICAjIGRlZW1lZCBpbnNlY3VyZS4KICAgICAgICBmb3IgaG9zdCBpbiBpbnNlY3VyZV9ob3N0czoKICAgICAgICAgICAgc2VsZi5tb3VudCgiaHR0cHM6Ly97MH0vIi5mb3JtYXQoaG9zdCksIGluc2VjdXJlX2FkYXB0ZXIpCgogICAgZGVmIHJlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBBbGxvdyBzZXR0aW5nIGEgZGVmYXVsdCB0aW1lb3V0IG9uIGEgc2Vzc2lvbgogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCJ0aW1lb3V0Iiwgc2VsZi50aW1lb3V0KQoKICAgICAgICAjIERpc3BhdGNoIHRoZSBhY3R1YWwgcmVxdWVzdAogICAgICAgIHJldHVybiBzdXBlcihQaXBTZXNzaW9uLCBzZWxmKS5yZXF1ZXN0KG1ldGhvZCwgdXJsLCAqYXJncywgKiprd2FyZ3MpCgoKZGVmIGdldF9maWxlX2NvbnRlbnQodXJsLCBjb21lc19mcm9tPU5vbmUsIHNlc3Npb249Tm9uZSk6CiAgICAiIiJHZXRzIHRoZSBjb250ZW50IG9mIGEgZmlsZTsgaXQgbWF5IGJlIGEgZmlsZW5hbWUsIGZpbGU6IFVSTCwgb3IKICAgIGh0dHA6IFVSTC4gIFJldHVybnMgKGxvY2F0aW9uLCBjb250ZW50KS4gIENvbnRlbnQgaXMgdW5pY29kZS4iIiIKICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICJnZXRfZmlsZV9jb250ZW50KCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICdzZXNzaW9uJyIKICAgICAgICApCgogICAgbWF0Y2ggPSBfc2NoZW1lX3JlLnNlYXJjaCh1cmwpCiAgICBpZiBtYXRjaDoKICAgICAgICBzY2hlbWUgPSBtYXRjaC5ncm91cCgxKS5sb3dlcigpCiAgICAgICAgaWYgKHNjaGVtZSA9PSAnZmlsZScgYW5kIGNvbWVzX2Zyb20gYW5kCiAgICAgICAgICAgICAgICBjb21lc19mcm9tLnN0YXJ0c3dpdGgoJ2h0dHAnKSk6CiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJ1JlcXVpcmVtZW50cyBmaWxlICVzIHJlZmVyZW5jZXMgVVJMICVzLCB3aGljaCBpcyBsb2NhbCcKICAgICAgICAgICAgICAgICUgKGNvbWVzX2Zyb20sIHVybCkpCiAgICAgICAgaWYgc2NoZW1lID09ICdmaWxlJzoKICAgICAgICAgICAgcGF0aCA9IHVybC5zcGxpdCgnOicsIDEpWzFdCiAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKQogICAgICAgICAgICBtYXRjaCA9IF91cmxfc2xhc2hfZHJpdmVfcmUubWF0Y2gocGF0aCkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBwYXRoID0gbWF0Y2guZ3JvdXAoMSkgKyAnOicgKyBwYXRoLnNwbGl0KCd8JywgMSlbMV0KICAgICAgICAgICAgcGF0aCA9IHVybGxpYl9wYXJzZS51bnF1b3RlKHBhdGgpCiAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgcGF0aCA9ICcvJyArIHBhdGgubHN0cmlwKCcvJykKICAgICAgICAgICAgdXJsID0gcGF0aAogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgRklYTUU6IGNhdGNoIHNvbWUgZXJyb3JzCiAgICAgICAgICAgIHJlc3AgPSBzZXNzaW9uLmdldCh1cmwpCiAgICAgICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCiAgICAgICAgICAgIHJldHVybiByZXNwLnVybCwgcmVzcC50ZXh0CiAgICB0cnk6CiAgICAgICAgd2l0aCBvcGVuKHVybCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGF1dG9fZGVjb2RlKGYucmVhZCgpKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZXhjOgogICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAnQ291bGQgbm90IG9wZW4gcmVxdWlyZW1lbnRzIGZpbGU6ICVzJyAlIHN0cihleGMpCiAgICAgICAgKQogICAgcmV0dXJuIHVybCwgY29udGVudAoKCl9zY2hlbWVfcmUgPSByZS5jb21waWxlKHInXihodHRwfGh0dHBzfGZpbGUpOicsIHJlLkkpCl91cmxfc2xhc2hfZHJpdmVfcmUgPSByZS5jb21waWxlKHInLyooW2Etel0pXHwnLCByZS5JKQoKCmRlZiBpc191cmwobmFtZSk6CiAgICAiIiJSZXR1cm5zIHRydWUgaWYgdGhlIG5hbWUgbG9va3MgbGlrZSBhIFVSTCIiIgogICAgaWYgJzonIG5vdCBpbiBuYW1lOgogICAgICAgIHJldHVybiBGYWxzZQogICAgc2NoZW1lID0gbmFtZS5zcGxpdCgnOicsIDEpWzBdLmxvd2VyKCkKICAgIHJldHVybiBzY2hlbWUgaW4gWydodHRwJywgJ2h0dHBzJywgJ2ZpbGUnLCAnZnRwJ10gKyB2Y3MuYWxsX3NjaGVtZXMKCgpkZWYgdXJsX3RvX3BhdGgodXJsKToKICAgICIiIgogICAgQ29udmVydCBhIGZpbGU6IFVSTCB0byBhIHBhdGguCiAgICAiIiIKICAgIGFzc2VydCB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKSwgKAogICAgICAgICJZb3UgY2FuIG9ubHkgdHVybiBmaWxlOiB1cmxzIGludG8gZmlsZW5hbWVzIChub3QgJXIpIiAlIHVybCkKCiAgICBfLCBuZXRsb2MsIHBhdGgsIF8sIF8gPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQoKICAgICMgaWYgd2UgaGF2ZSBhIFVOQyBwYXRoLCBwcmVwZW5kIFVOQyBzaGFyZSBub3RhdGlvbgogICAgaWYgbmV0bG9jOgogICAgICAgIG5ldGxvYyA9ICdcXFxcJyArIG5ldGxvYwoKICAgIHBhdGggPSB1cmxsaWJfcmVxdWVzdC51cmwycGF0aG5hbWUobmV0bG9jICsgcGF0aCkKICAgIHJldHVybiBwYXRoCgoKZGVmIHBhdGhfdG9fdXJsKHBhdGgpOgogICAgIiIiCiAgICBDb252ZXJ0IGEgcGF0aCB0byBhIGZpbGU6IFVSTC4gIFRoZSBwYXRoIHdpbGwgYmUgbWFkZSBhYnNvbHV0ZSBhbmQgaGF2ZQogICAgcXVvdGVkIHBhdGggcGFydHMuCiAgICAiIiIKICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguYWJzcGF0aChwYXRoKSkKICAgIHVybCA9IHVybGxpYl9wYXJzZS51cmxqb2luKCdmaWxlOicsIHVybGxpYl9yZXF1ZXN0LnBhdGhuYW1lMnVybChwYXRoKSkKICAgIHJldHVybiB1cmwKCgpkZWYgaXNfYXJjaGl2ZV9maWxlKG5hbWUpOgogICAgIiIiUmV0dXJuIFRydWUgaWYgYG5hbWVgIGlzIGEgY29uc2lkZXJlZCBhcyBhbiBhcmNoaXZlIGZpbGUuIiIiCiAgICBleHQgPSBzcGxpdGV4dChuYW1lKVsxXS5sb3dlcigpCiAgICBpZiBleHQgaW4gQVJDSElWRV9FWFRFTlNJT05TOgogICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgdW5wYWNrX3Zjc19saW5rKGxpbmssIGxvY2F0aW9uKToKICAgIHZjc19iYWNrZW5kID0gX2dldF91c2VkX3Zjc19iYWNrZW5kKGxpbmspCiAgICB2Y3NfYmFja2VuZC51bnBhY2sobG9jYXRpb24pCgoKZGVmIF9nZXRfdXNlZF92Y3NfYmFja2VuZChsaW5rKToKICAgIGZvciBiYWNrZW5kIGluIHZjcy5iYWNrZW5kczoKICAgICAgICBpZiBsaW5rLnNjaGVtZSBpbiBiYWNrZW5kLnNjaGVtZXM6CiAgICAgICAgICAgIHZjc19iYWNrZW5kID0gYmFja2VuZChsaW5rLnVybCkKICAgICAgICAgICAgcmV0dXJuIHZjc19iYWNrZW5kCgoKZGVmIGlzX3Zjc191cmwobGluayk6CiAgICByZXR1cm4gYm9vbChfZ2V0X3VzZWRfdmNzX2JhY2tlbmQobGluaykpCgoKZGVmIGlzX2ZpbGVfdXJsKGxpbmspOgogICAgcmV0dXJuIGxpbmsudXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnZmlsZTonKQoKCmRlZiBpc19kaXJfdXJsKGxpbmspOgogICAgIiIiUmV0dXJuIHdoZXRoZXIgYSBmaWxlOi8vIExpbmsgcG9pbnRzIHRvIGEgZGlyZWN0b3J5LgoKICAgIGBgbGlua2BgIG11c3Qgbm90IGhhdmUgYW55IG90aGVyIHNjaGVtZSBidXQgZmlsZTovLy4gQ2FsbCBpc19maWxlX3VybCgpCiAgICBmaXJzdC4KCiAgICAiIiIKICAgIGxpbmtfcGF0aCA9IHVybF90b19wYXRoKGxpbmsudXJsX3dpdGhvdXRfZnJhZ21lbnQpCiAgICByZXR1cm4gb3MucGF0aC5pc2RpcihsaW5rX3BhdGgpCgoKZGVmIF9wcm9ncmVzc19pbmRpY2F0b3IoaXRlcmFibGUsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gaXRlcmFibGUKCgpkZWYgX2Rvd25sb2FkX3VybChyZXNwLCBsaW5rLCBjb250ZW50X2ZpbGUsIGhhc2hlcyk6CiAgICB0cnk6CiAgICAgICAgdG90YWxfbGVuZ3RoID0gaW50KHJlc3AuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSkKICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgS2V5RXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgdG90YWxfbGVuZ3RoID0gMAoKICAgIGNhY2hlZF9yZXNwID0gZ2V0YXR0cihyZXNwLCAiZnJvbV9jYWNoZSIsIEZhbHNlKQoKICAgIGlmIGxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpID4gbG9nZ2luZy5JTkZPOgogICAgICAgIHNob3dfcHJvZ3Jlc3MgPSBGYWxzZQogICAgZWxpZiBjYWNoZWRfcmVzcDoKICAgICAgICBzaG93X3Byb2dyZXNzID0gRmFsc2UKICAgIGVsaWYgdG90YWxfbGVuZ3RoID4gKDQwICogMTAwMCk6CiAgICAgICAgc2hvd19wcm9ncmVzcyA9IFRydWUKICAgIGVsaWYgbm90IHRvdGFsX2xlbmd0aDoKICAgICAgICBzaG93X3Byb2dyZXNzID0gVHJ1ZQogICAgZWxzZToKICAgICAgICBzaG93X3Byb2dyZXNzID0gRmFsc2UKCiAgICBzaG93X3VybCA9IGxpbmsuc2hvd191cmwKCiAgICBkZWYgcmVzcF9yZWFkKGNodW5rX3NpemUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIHVybGxpYjMuCiAgICAgICAgICAgIGZvciBjaHVuayBpbiByZXNwLnJhdy5zdHJlYW0oCiAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAjIFdlIHVzZSBkZWNvZGVfY29udGVudD1GYWxzZSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QKICAgICAgICAgICAgICAgICAgICAjIHdhbnQgdXJsbGliMyB0byBtZXNzIHdpdGggdGhlIHJhdyBieXRlcyB3ZSBnZXQKICAgICAgICAgICAgICAgICAgICAjIGZyb20gdGhlIHNlcnZlci4gSWYgd2UgZGVjb21wcmVzcyBpbnNpZGUgb2YKICAgICAgICAgICAgICAgICAgICAjIHVybGxpYjMgdGhlbiB3ZSBjYW5ub3QgdmVyaWZ5IHRoZSBjaGVja3N1bQogICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSB0aGUgY2hlY2tzdW0gd2lsbCBiZSBvZiB0aGUgY29tcHJlc3NlZAogICAgICAgICAgICAgICAgICAgICMgZmlsZS4gVGhpcyBicmVha2FnZSB3aWxsIG9ubHkgb2NjdXIgaWYgdGhlCiAgICAgICAgICAgICAgICAgICAgIyBzZXJ2ZXIgYWRkcyBhIENvbnRlbnQtRW5jb2RpbmcgaGVhZGVyLCB3aGljaAogICAgICAgICAgICAgICAgICAgICMgZGVwZW5kcyBvbiBob3cgdGhlIHNlcnZlciB3YXMgY29uZmlndXJlZDoKICAgICAgICAgICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdpbGwgbm90aWNlIHRoYXQgdGhlIGZpbGUgaXNuJ3QgYQogICAgICAgICAgICAgICAgICAgICMgICBjb21wcmVzc2libGUgZmlsZSBhbmQgd2lsbCBsZWF2ZSB0aGUgZmlsZSBhbG9uZQogICAgICAgICAgICAgICAgICAgICMgICBhbmQgd2l0aCBhbiBlbXB0eSBDb250ZW50LUVuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3aWxsIG5vdGljZSB0aGF0IHRoZSBmaWxlIGlzCiAgICAgICAgICAgICAgICAgICAgIyAgIGFscmVhZHkgY29tcHJlc3NlZCBhbmQgd2lsbCBsZWF2ZSB0aGUgZmlsZQogICAgICAgICAgICAgICAgICAgICMgICBhbG9uZSBhbmQgd2lsbCBhZGQgYSBDb250ZW50LUVuY29kaW5nOiBnemlwCiAgICAgICAgICAgICAgICAgICAgIyAgIGhlYWRlcgogICAgICAgICAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd29uJ3Qgbm90aWNlIGFueXRoaW5nIGF0IGFsbCBhbmQKICAgICAgICAgICAgICAgICAgICAjICAgd2lsbCB0YWtlIGEgZmlsZSB0aGF0J3MgYWxyZWFkeSBiZWVuIGNvbXByZXNzZWQKICAgICAgICAgICAgICAgICAgICAjICAgYW5kIGNvbXByZXNzIGl0IGFnYWluIGFuZCBzZXQgdGhlCiAgICAgICAgICAgICAgICAgICAgIyAgIENvbnRlbnQtRW5jb2Rpbmc6IGd6aXAgaGVhZGVyCiAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgICMgQnkgc2V0dGluZyB0aGlzIG5vdCB0byBkZWNvZGUgYXV0b21hdGljYWxseSB3ZQogICAgICAgICAgICAgICAgICAgICMgaG9wZSB0byBlbGltaW5hdGUgcHJvYmxlbXMgd2l0aCB0aGUgc2Vjb25kIGNhc2UuCiAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2NvbnRlbnQ9RmFsc2UpOgogICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgU3RhbmRhcmQgZmlsZS1saWtlIG9iamVjdC4KICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGNodW5rID0gcmVzcC5yYXcucmVhZChjaHVua19zaXplKQogICAgICAgICAgICAgICAgaWYgbm90IGNodW5rOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICB5aWVsZCBjaHVuawoKICAgIGRlZiB3cml0dGVuX2NodW5rcyhjaHVua3MpOgogICAgICAgIGZvciBjaHVuayBpbiBjaHVua3M6CiAgICAgICAgICAgIGNvbnRlbnRfZmlsZS53cml0ZShjaHVuaykKICAgICAgICAgICAgeWllbGQgY2h1bmsKCiAgICBwcm9ncmVzc19pbmRpY2F0b3IgPSBfcHJvZ3Jlc3NfaW5kaWNhdG9yCgogICAgaWYgbGluay5uZXRsb2MgPT0gUHlQSS5uZXRsb2M6CiAgICAgICAgdXJsID0gc2hvd191cmwKICAgIGVsc2U6CiAgICAgICAgdXJsID0gbGluay51cmxfd2l0aG91dF9mcmFnbWVudAoKICAgIGlmIHNob3dfcHJvZ3Jlc3M6ICAjIFdlIGRvbid0IHNob3cgcHJvZ3Jlc3Mgb24gY2FjaGVkIHJlc3BvbnNlcwogICAgICAgIGlmIHRvdGFsX2xlbmd0aDoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkRvd25sb2FkaW5nICVzICglcykiLCB1cmwsIGZvcm1hdF9zaXplKHRvdGFsX2xlbmd0aCkpCiAgICAgICAgICAgIHByb2dyZXNzX2luZGljYXRvciA9IERvd25sb2FkUHJvZ3Jlc3NCYXIobWF4PXRvdGFsX2xlbmd0aCkuaXRlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEb3dubG9hZGluZyAlcyIsIHVybCkKICAgICAgICAgICAgcHJvZ3Jlc3NfaW5kaWNhdG9yID0gRG93bmxvYWRQcm9ncmVzc1NwaW5uZXIoKS5pdGVyCiAgICBlbGlmIGNhY2hlZF9yZXNwOgogICAgICAgIGxvZ2dlci5pbmZvKCJVc2luZyBjYWNoZWQgJXMiLCB1cmwpCiAgICBlbHNlOgogICAgICAgIGxvZ2dlci5pbmZvKCJEb3dubG9hZGluZyAlcyIsIHVybCkKCiAgICBsb2dnZXIuZGVidWcoJ0Rvd25sb2FkaW5nIGZyb20gVVJMICVzJywgbGluaykKCiAgICBkb3dubG9hZGVkX2NodW5rcyA9IHdyaXR0ZW5fY2h1bmtzKAogICAgICAgIHByb2dyZXNzX2luZGljYXRvcigKICAgICAgICAgICAgcmVzcF9yZWFkKENPTlRFTlRfQ0hVTktfU0laRSksCiAgICAgICAgICAgIENPTlRFTlRfQ0hVTktfU0laRQogICAgICAgICkKICAgICkKICAgIGlmIGhhc2hlczoKICAgICAgICBoYXNoZXMuY2hlY2tfYWdhaW5zdF9jaHVua3MoZG93bmxvYWRlZF9jaHVua3MpCiAgICBlbHNlOgogICAgICAgIGNvbnN1bWUoZG93bmxvYWRlZF9jaHVua3MpCgoKZGVmIF9jb3B5X2ZpbGUoZmlsZW5hbWUsIGxvY2F0aW9uLCBsaW5rKToKICAgIGNvcHkgPSBUcnVlCiAgICBkb3dubG9hZF9sb2NhdGlvbiA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgbGluay5maWxlbmFtZSkKICAgIGlmIG9zLnBhdGguZXhpc3RzKGRvd25sb2FkX2xvY2F0aW9uKToKICAgICAgICByZXNwb25zZSA9IGFza19wYXRoX2V4aXN0cygKICAgICAgICAgICAgJ1RoZSBmaWxlICVzIGV4aXN0cy4gKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAsIChhKWFib3J0JyAlCiAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkb3dubG9hZF9sb2NhdGlvbiksICgnaScsICd3JywgJ2InLCAnYScpKQogICAgICAgIGlmIHJlc3BvbnNlID09ICdpJzoKICAgICAgICAgICAgY29weSA9IEZhbHNlCiAgICAgICAgZWxpZiByZXNwb25zZSA9PSAndyc6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdEZWxldGluZyAlcycsIGRpc3BsYXlfcGF0aChkb3dubG9hZF9sb2NhdGlvbikpCiAgICAgICAgICAgIG9zLnJlbW92ZShkb3dubG9hZF9sb2NhdGlvbikKICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdiJzoKICAgICAgICAgICAgZGVzdF9maWxlID0gYmFja3VwX2Rpcihkb3dubG9hZF9sb2NhdGlvbikKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQmFja2luZyB1cCAlcyB0byAlcycsCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZG93bmxvYWRfbG9jYXRpb24pLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3RfZmlsZSksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2h1dGlsLm1vdmUoZG93bmxvYWRfbG9jYXRpb24sIGRlc3RfZmlsZSkKICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdhJzoKICAgICAgICAgICAgc3lzLmV4aXQoLTEpCiAgICBpZiBjb3B5OgogICAgICAgIHNodXRpbC5jb3B5KGZpbGVuYW1lLCBkb3dubG9hZF9sb2NhdGlvbikKICAgICAgICBsb2dnZXIuaW5mbygnU2F2ZWQgJXMnLCBkaXNwbGF5X3BhdGgoZG93bmxvYWRfbG9jYXRpb24pKQoKCmRlZiB1bnBhY2tfaHR0cF91cmwobGluaywgbG9jYXRpb24sIGRvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb249Tm9uZSwgaGFzaGVzPU5vbmUpOgogICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgInVucGFja19odHRwX3VybCgpIG1pc3NpbmcgMSByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50OiAnc2Vzc2lvbiciCiAgICAgICAgKQoKICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgnLXVucGFjaycsICdwaXAtJykKCiAgICAjIElmIGEgZG93bmxvYWQgZGlyIGlzIHNwZWNpZmllZCwgaXMgdGhlIGZpbGUgYWxyZWFkeSBkb3dubG9hZGVkIHRoZXJlPwogICAgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGggPSBOb25lCiAgICBpZiBkb3dubG9hZF9kaXI6CiAgICAgICAgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGggPSBfY2hlY2tfZG93bmxvYWRfZGlyKGxpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVzKQoKICAgIGlmIGFscmVhZHlfZG93bmxvYWRlZF9wYXRoOgogICAgICAgIGZyb21fcGF0aCA9IGFscmVhZHlfZG93bmxvYWRlZF9wYXRoCiAgICAgICAgY29udGVudF90eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZnJvbV9wYXRoKVswXQogICAgZWxzZToKICAgICAgICAjIGxldCdzIGRvd25sb2FkIHRvIGEgdG1wIGRpcgogICAgICAgIGZyb21fcGF0aCwgY29udGVudF90eXBlID0gX2Rvd25sb2FkX2h0dHBfdXJsKGxpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXMpCgogICAgIyB1bnBhY2sgdGhlIGFyY2hpdmUgdG8gdGhlIGJ1aWxkIGRpciBsb2NhdGlvbi4gZXZlbiB3aGVuIG9ubHkgZG93bmxvYWRpbmcKICAgICMgYXJjaGl2ZXMsIHRoZXkgaGF2ZSB0byBiZSB1bnBhY2tlZCB0byBwYXJzZSBkZXBlbmRlbmNpZXMKICAgIHVucGFja19maWxlKGZyb21fcGF0aCwgbG9jYXRpb24sIGNvbnRlbnRfdHlwZSwgbGluaykKCiAgICAjIGEgZG93bmxvYWQgZGlyIGlzIHNwZWNpZmllZDsgbGV0J3MgY29weSB0aGUgYXJjaGl2ZSB0aGVyZQogICAgaWYgZG93bmxvYWRfZGlyIGFuZCBub3QgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGg6CiAgICAgICAgX2NvcHlfZmlsZShmcm9tX3BhdGgsIGRvd25sb2FkX2RpciwgbGluaykKCiAgICBpZiBub3QgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGg6CiAgICAgICAgb3MudW5saW5rKGZyb21fcGF0aCkKICAgIHJtdHJlZSh0ZW1wX2RpcikKCgpkZWYgdW5wYWNrX2ZpbGVfdXJsKGxpbmssIGxvY2F0aW9uLCBkb3dubG9hZF9kaXI9Tm9uZSwgaGFzaGVzPU5vbmUpOgogICAgIiIiVW5wYWNrIGxpbmsgaW50byBsb2NhdGlvbi4KCiAgICBJZiBkb3dubG9hZF9kaXIgaXMgcHJvdmlkZWQgYW5kIGxpbmsgcG9pbnRzIHRvIGEgZmlsZSwgbWFrZSBhIGNvcHkKICAgIG9mIHRoZSBsaW5rIGZpbGUgaW5zaWRlIGRvd25sb2FkX2Rpci4KICAgICIiIgogICAgbGlua19wYXRoID0gdXJsX3RvX3BhdGgobGluay51cmxfd2l0aG91dF9mcmFnbWVudCkKCiAgICAjIElmIGl0J3MgYSB1cmwgdG8gYSBsb2NhbCBkaXJlY3RvcnkKICAgIGlmIGlzX2Rpcl91cmwobGluayk6CiAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihsb2NhdGlvbik6CiAgICAgICAgICAgIHJtdHJlZShsb2NhdGlvbikKICAgICAgICBzaHV0aWwuY29weXRyZWUobGlua19wYXRoLCBsb2NhdGlvbiwgc3ltbGlua3M9VHJ1ZSkKICAgICAgICBpZiBkb3dubG9hZF9kaXI6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdMaW5rIGlzIGEgZGlyZWN0b3J5LCBpZ25vcmluZyBkb3dubG9hZF9kaXInKQogICAgICAgIHJldHVybgoKICAgICMgSWYgLS1yZXF1aXJlLWhhc2hlcyBpcyBvZmYsIGBoYXNoZXNgIGlzIGVpdGhlciBlbXB0eSwgdGhlCiAgICAjIGxpbmsncyBlbWJlZGRlZCBoYXNoLCBvciBNaXNzaW5nSGFzaGVzOyBpdCBpcyByZXF1aXJlZCB0bwogICAgIyBtYXRjaC4gSWYgLS1yZXF1aXJlLWhhc2hlcyBpcyBvbiwgd2UgYXJlIHNhdGlzZmllZCBieSBhbnkKICAgICMgaGFzaCBpbiBgaGFzaGVzYCBtYXRjaGluZzogYSBVUkwtYmFzZWQgb3IgYW4gb3B0aW9uLWJhc2VkCiAgICAjIG9uZTsgbm8gaW50ZXJuZXQtc291cmNlZCBoYXNoIHdpbGwgYmUgaW4gYGhhc2hlc2AuCiAgICBpZiBoYXNoZXM6CiAgICAgICAgaGFzaGVzLmNoZWNrX2FnYWluc3RfcGF0aChsaW5rX3BhdGgpCgogICAgIyBJZiBhIGRvd25sb2FkIGRpciBpcyBzcGVjaWZpZWQsIGlzIHRoZSBmaWxlIGFscmVhZHkgdGhlcmUgYW5kIHZhbGlkPwogICAgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGggPSBOb25lCiAgICBpZiBkb3dubG9hZF9kaXI6CiAgICAgICAgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGggPSBfY2hlY2tfZG93bmxvYWRfZGlyKGxpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVzKQoKICAgIGlmIGFscmVhZHlfZG93bmxvYWRlZF9wYXRoOgogICAgICAgIGZyb21fcGF0aCA9IGFscmVhZHlfZG93bmxvYWRlZF9wYXRoCiAgICBlbHNlOgogICAgICAgIGZyb21fcGF0aCA9IGxpbmtfcGF0aAoKICAgIGNvbnRlbnRfdHlwZSA9IG1pbWV0eXBlcy5ndWVzc190eXBlKGZyb21fcGF0aClbMF0KCiAgICAjIHVucGFjayB0aGUgYXJjaGl2ZSB0byB0aGUgYnVpbGQgZGlyIGxvY2F0aW9uLiBldmVuIHdoZW4gb25seSBkb3dubG9hZGluZwogICAgIyBhcmNoaXZlcywgdGhleSBoYXZlIHRvIGJlIHVucGFja2VkIHRvIHBhcnNlIGRlcGVuZGVuY2llcwogICAgdW5wYWNrX2ZpbGUoZnJvbV9wYXRoLCBsb2NhdGlvbiwgY29udGVudF90eXBlLCBsaW5rKQoKICAgICMgYSBkb3dubG9hZCBkaXIgaXMgc3BlY2lmaWVkIGFuZCBub3QgYWxyZWFkeSBkb3dubG9hZGVkCiAgICBpZiBkb3dubG9hZF9kaXIgYW5kIG5vdCBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aDoKICAgICAgICBfY29weV9maWxlKGZyb21fcGF0aCwgZG93bmxvYWRfZGlyLCBsaW5rKQoKCmRlZiBfY29weV9kaXN0X2Zyb21fZGlyKGxpbmtfcGF0aCwgbG9jYXRpb24pOgogICAgIiIiQ29weSBkaXN0cmlidXRpb24gZmlsZXMgaW4gYGxpbmtfcGF0aGAgdG8gYGxvY2F0aW9uYC4KCiAgICBJbnZva2VkIHdoZW4gdXNlciByZXF1ZXN0cyB0byBpbnN0YWxsIGEgbG9jYWwgZGlyZWN0b3J5LiBFLmcuOgoKICAgICAgICBwaXAgaW5zdGFsbCAuCiAgICAgICAgcGlwIGluc3RhbGwgfi9kZXYvZ2l0LXJlcG9zL3B5dGhvbi1wcm9tcHQtdG9vbGtpdAoKICAgICIiIgoKICAgICMgTm90ZTogVGhpcyBpcyBjdXJyZW50bHkgVkVSWSBTTE9XIGlmIHlvdSBoYXZlIGEgbG90IG9mIGRhdGEgaW4gdGhlCiAgICAjIGRpcmVjdG9yeSwgYmVjYXVzZSBpdCBjb3BpZXMgZXZlcnl0aGluZyB3aXRoIGBzaHV0aWwuY29weXRyZWVgLgogICAgIyBXaGF0IGl0IHNob3VsZCByZWFsbHkgZG8gaXMgYnVpbGQgYW4gc2Rpc3QgYW5kIGluc3RhbGwgdGhhdC4KICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMjE5NQoKICAgIGlmIG9zLnBhdGguaXNkaXIobG9jYXRpb24pOgogICAgICAgIHJtdHJlZShsb2NhdGlvbikKCiAgICAjIGJ1aWxkIGFuIHNkaXN0CiAgICBzZXR1cF9weSA9ICdzZXR1cC5weScKICAgIHNkaXN0X2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGVdCiAgICBzZGlzdF9hcmdzLmFwcGVuZCgnLWMnKQogICAgc2Rpc3RfYXJncy5hcHBlbmQoU0VUVVBUT09MU19TSElNICUgc2V0dXBfcHkpCiAgICBzZGlzdF9hcmdzLmFwcGVuZCgnc2Rpc3QnKQogICAgc2Rpc3RfYXJncyArPSBbJy0tZGlzdC1kaXInLCBsb2NhdGlvbl0KICAgIGxvZ2dlci5pbmZvKCdSdW5uaW5nIHNldHVwLnB5IHNkaXN0IGZvciAlcycsIGxpbmtfcGF0aCkKCiAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICBjYWxsX3N1YnByb2Nlc3Moc2Rpc3RfYXJncywgY3dkPWxpbmtfcGF0aCwgc2hvd19zdGRvdXQ9RmFsc2UpCgogICAgIyB1bnBhY2sgc2Rpc3QgaW50byBgbG9jYXRpb25gCiAgICBzZGlzdCA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgb3MubGlzdGRpcihsb2NhdGlvbilbMF0pCiAgICBsb2dnZXIuaW5mbygnVW5wYWNraW5nIHNkaXN0ICVzIGludG8gJXMnLCBzZGlzdCwgbG9jYXRpb24pCiAgICB1bnBhY2tfZmlsZShzZGlzdCwgbG9jYXRpb24sIGNvbnRlbnRfdHlwZT1Ob25lLCBsaW5rPU5vbmUpCgoKY2xhc3MgUGlwWG1scnBjVHJhbnNwb3J0KHhtbHJwY19jbGllbnQuVHJhbnNwb3J0KToKICAgICIiIlByb3ZpZGUgYSBgeG1scnBjbGliLlRyYW5zcG9ydGAgaW1wbGVtZW50YXRpb24gdmlhIGEgYFBpcFNlc3Npb25gCiAgICBvYmplY3QuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXhfdXJsLCBzZXNzaW9uLCB1c2VfZGF0ZXRpbWU9RmFsc2UpOgogICAgICAgIHhtbHJwY19jbGllbnQuVHJhbnNwb3J0Ll9faW5pdF9fKHNlbGYsIHVzZV9kYXRldGltZSkKICAgICAgICBpbmRleF9wYXJ0cyA9IHVybGxpYl9wYXJzZS51cmxwYXJzZShpbmRleF91cmwpCiAgICAgICAgc2VsZi5fc2NoZW1lID0gaW5kZXhfcGFydHMuc2NoZW1lCiAgICAgICAgc2VsZi5fc2Vzc2lvbiA9IHNlc3Npb24KCiAgICBkZWYgcmVxdWVzdChzZWxmLCBob3N0LCBoYW5kbGVyLCByZXF1ZXN0X2JvZHksIHZlcmJvc2U9RmFsc2UpOgogICAgICAgIHBhcnRzID0gKHNlbGYuX3NjaGVtZSwgaG9zdCwgaGFuZGxlciwgTm9uZSwgTm9uZSwgTm9uZSkKICAgICAgICB1cmwgPSB1cmxsaWJfcGFyc2UudXJsdW5wYXJzZShwYXJ0cykKICAgICAgICB0cnk6CiAgICAgICAgICAgIGhlYWRlcnMgPSB7J0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3htbCd9CiAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5fc2Vzc2lvbi5wb3N0KHVybCwgZGF0YT1yZXF1ZXN0X2JvZHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycywgc3RyZWFtPVRydWUpCiAgICAgICAgICAgIHJlc3BvbnNlLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX3Jlc3BvbnNlKHJlc3BvbnNlLnJhdykKICAgICAgICBleGNlcHQgcmVxdWVzdHMuSFRUUEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAgICAgIkhUVFAgZXJyb3IgJXMgd2hpbGUgZ2V0dGluZyAlcyIsCiAgICAgICAgICAgICAgICBleGMucmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHVybCwKICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZQoKCmRlZiB1bnBhY2tfdXJsKGxpbmssIGxvY2F0aW9uLCBkb3dubG9hZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgb25seV9kb3dubG9hZD1GYWxzZSwgc2Vzc2lvbj1Ob25lLCBoYXNoZXM9Tm9uZSk6CiAgICAiIiJVbnBhY2sgbGluay4KICAgICAgIElmIGxpbmsgaXMgYSBWQ1MgbGluazoKICAgICAgICAgaWYgb25seV9kb3dubG9hZCwgZXhwb3J0IGludG8gZG93bmxvYWRfZGlyIGFuZCBpZ25vcmUgbG9jYXRpb24KICAgICAgICAgIGVsc2UgdW5wYWNrIGludG8gbG9jYXRpb24KICAgICAgIGZvciBvdGhlciB0eXBlcyBvZiBsaW5rOgogICAgICAgICAtIHVucGFjayBpbnRvIGxvY2F0aW9uCiAgICAgICAgIC0gaWYgZG93bmxvYWRfZGlyLCBjb3B5IHRoZSBmaWxlIGludG8gZG93bmxvYWRfZGlyCiAgICAgICAgIC0gaWYgb25seV9kb3dubG9hZCwgbWFyayBsb2NhdGlvbiBmb3IgZGVsZXRpb24KCiAgICA6cGFyYW0gaGFzaGVzOiBBIEhhc2hlcyBvYmplY3QsIG9uZSBvZiB3aG9zZSBlbWJlZGRlZCBoYXNoZXMgbXVzdCBtYXRjaCwKICAgICAgICBvciBIYXNoTWlzbWF0Y2ggd2lsbCBiZSByYWlzZWQuIElmIHRoZSBIYXNoZXMgaXMgZW1wdHksIG5vIG1hdGNoZXMgYXJlCiAgICAgICAgcmVxdWlyZWQsIGFuZCB1bmhhc2hhYmxlIHR5cGVzIG9mIHJlcXVpcmVtZW50cyAobGlrZSBWQ1Mgb25lcywgd2hpY2gKICAgICAgICB3b3VsZCBvcmRpbmFyaWx5IHJhaXNlIEhhc2hVbnN1cHBvcnRlZCkgYXJlIGFsbG93ZWQuCiAgICAiIiIKICAgICMgbm9uLWVkaXRhYmxlIHZjcyB1cmxzCiAgICBpZiBpc192Y3NfdXJsKGxpbmspOgogICAgICAgIHVucGFja192Y3NfbGluayhsaW5rLCBsb2NhdGlvbikKCiAgICAjIGZpbGUgdXJscwogICAgZWxpZiBpc19maWxlX3VybChsaW5rKToKICAgICAgICB1bnBhY2tfZmlsZV91cmwobGluaywgbG9jYXRpb24sIGRvd25sb2FkX2RpciwgaGFzaGVzPWhhc2hlcykKCiAgICAjIGh0dHAgdXJscwogICAgZWxzZToKICAgICAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHNlc3Npb24gPSBQaXBTZXNzaW9uKCkKCiAgICAgICAgdW5wYWNrX2h0dHBfdXJsKAogICAgICAgICAgICBsaW5rLAogICAgICAgICAgICBsb2NhdGlvbiwKICAgICAgICAgICAgZG93bmxvYWRfZGlyLAogICAgICAgICAgICBzZXNzaW9uLAogICAgICAgICAgICBoYXNoZXM9aGFzaGVzCiAgICAgICAgKQogICAgaWYgb25seV9kb3dubG9hZDoKICAgICAgICB3cml0ZV9kZWxldGVfbWFya2VyX2ZpbGUobG9jYXRpb24pCgoKZGVmIF9kb3dubG9hZF9odHRwX3VybChsaW5rLCBzZXNzaW9uLCB0ZW1wX2RpciwgaGFzaGVzKToKICAgICIiIkRvd25sb2FkIGxpbmsgdXJsIGludG8gdGVtcF9kaXIgdXNpbmcgcHJvdmlkZWQgc2Vzc2lvbiIiIgogICAgdGFyZ2V0X3VybCA9IGxpbmsudXJsLnNwbGl0KCcjJywgMSlbMF0KICAgIHRyeToKICAgICAgICByZXNwID0gc2Vzc2lvbi5nZXQoCiAgICAgICAgICAgIHRhcmdldF91cmwsCiAgICAgICAgICAgICMgV2UgdXNlIEFjY2VwdC1FbmNvZGluZzogaWRlbnRpdHkgaGVyZSBiZWNhdXNlIHJlcXVlc3RzCiAgICAgICAgICAgICMgZGVmYXVsdHMgdG8gYWNjZXB0aW5nIGNvbXByZXNzZWQgcmVzcG9uc2VzLiBUaGlzIGJyZWFrcyBpbgogICAgICAgICAgICAjIGEgdmFyaWV0eSBvZiB3YXlzIGRlcGVuZGluZyBvbiBob3cgdGhlIHNlcnZlciBpcyBjb25maWd1cmVkLgogICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdpbGwgbm90aWNlIHRoYXQgdGhlIGZpbGUgaXNuJ3QgYSBjb21wcmVzc2libGUKICAgICAgICAgICAgIyAgIGZpbGUgYW5kIHdpbGwgbGVhdmUgdGhlIGZpbGUgYWxvbmUgYW5kIHdpdGggYW4gZW1wdHkKICAgICAgICAgICAgIyAgIENvbnRlbnQtRW5jb2RpbmcKICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3aWxsIG5vdGljZSB0aGF0IHRoZSBmaWxlIGlzIGFscmVhZHkKICAgICAgICAgICAgIyAgIGNvbXByZXNzZWQgYW5kIHdpbGwgbGVhdmUgdGhlIGZpbGUgYWxvbmUgYW5kIHdpbGwgYWRkIGEKICAgICAgICAgICAgIyAgIENvbnRlbnQtRW5jb2Rpbmc6IGd6aXAgaGVhZGVyCiAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd29uJ3Qgbm90aWNlIGFueXRoaW5nIGF0IGFsbCBhbmQgd2lsbCB0YWtlCiAgICAgICAgICAgICMgICBhIGZpbGUgdGhhdCdzIGFscmVhZHkgYmVlbiBjb21wcmVzc2VkIGFuZCBjb21wcmVzcyBpdCBhZ2FpbgogICAgICAgICAgICAjICAgYW5kIHNldCB0aGUgQ29udGVudC1FbmNvZGluZzogZ3ppcCBoZWFkZXIKICAgICAgICAgICAgIyBCeSBzZXR0aW5nIHRoaXMgdG8gcmVxdWVzdCBvbmx5IHRoZSBpZGVudGl0eSBlbmNvZGluZyBXZSdyZQogICAgICAgICAgICAjIGhvcGluZyB0byBlbGltaW5hdGUgdGhlIHRoaXJkIGNhc2UuIEhvcGVmdWxseSB0aGVyZSBkb2VzIG5vdAogICAgICAgICAgICAjIGV4aXN0IGEgc2VydmVyIHdoaWNoIHdoZW4gZ2l2ZW4gYSBmaWxlIHdpbGwgbm90aWNlIGl0IGlzCiAgICAgICAgICAgICMgYWxyZWFkeSBjb21wcmVzc2VkIGFuZCB0aGF0IHlvdSdyZSBub3QgYXNraW5nIGZvciBhCiAgICAgICAgICAgICMgY29tcHJlc3NlZCBmaWxlIGFuZCB3aWxsIHRoZW4gZGVjb21wcmVzcyBpdCBiZWZvcmUgc2VuZGluZwogICAgICAgICAgICAjIGJlY2F1c2UgaWYgdGhhdCdzIHRoZSBjYXNlIEkgZG9uJ3QgdGhpbmsgaXQnbGwgZXZlciBiZQogICAgICAgICAgICAjIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyB3b3JrLgogICAgICAgICAgICBoZWFkZXJzPXsiQWNjZXB0LUVuY29kaW5nIjogImlkZW50aXR5In0sCiAgICAgICAgICAgIHN0cmVhbT1UcnVlLAogICAgICAgICkKICAgICAgICByZXNwLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgZXhjZXB0IHJlcXVlc3RzLkhUVFBFcnJvciBhcyBleGM6CiAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAiSFRUUCBlcnJvciAlcyB3aGlsZSBnZXR0aW5nICVzIiwgZXhjLnJlc3BvbnNlLnN0YXR1c19jb2RlLCBsaW5rLAogICAgICAgICkKICAgICAgICByYWlzZQoKICAgIGNvbnRlbnRfdHlwZSA9IHJlc3AuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScsICcnKQogICAgZmlsZW5hbWUgPSBsaW5rLmZpbGVuYW1lICAjIGZhbGxiYWNrCiAgICAjIEhhdmUgYSBsb29rIGF0IHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciBmb3IgYSBiZXR0ZXIgZ3Vlc3MKICAgIGNvbnRlbnRfZGlzcG9zaXRpb24gPSByZXNwLmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJykKICAgIGlmIGNvbnRlbnRfZGlzcG9zaXRpb246CiAgICAgICAgdHlwZSwgcGFyYW1zID0gY2dpLnBhcnNlX2hlYWRlcihjb250ZW50X2Rpc3Bvc2l0aW9uKQogICAgICAgICMgV2UgdXNlIGBgb3JgYCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB1c2UgYW4gImVtcHR5IiB2YWx1ZQogICAgICAgICMgZnJvbSB0aGUgZmlsZW5hbWUgcGFyYW0uCiAgICAgICAgZmlsZW5hbWUgPSBwYXJhbXMuZ2V0KCdmaWxlbmFtZScpIG9yIGZpbGVuYW1lCiAgICBleHQgPSBzcGxpdGV4dChmaWxlbmFtZSlbMV0KICAgIGlmIG5vdCBleHQ6CiAgICAgICAgZXh0ID0gbWltZXR5cGVzLmd1ZXNzX2V4dGVuc2lvbihjb250ZW50X3R5cGUpCiAgICAgICAgaWYgZXh0OgogICAgICAgICAgICBmaWxlbmFtZSArPSBleHQKICAgIGlmIG5vdCBleHQgYW5kIGxpbmsudXJsICE9IHJlc3AudXJsOgogICAgICAgIGV4dCA9IG9zLnBhdGguc3BsaXRleHQocmVzcC51cmwpWzFdCiAgICAgICAgaWYgZXh0OgogICAgICAgICAgICBmaWxlbmFtZSArPSBleHQKICAgIGZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgZmlsZW5hbWUpCiAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAnd2InKSBhcyBjb250ZW50X2ZpbGU6CiAgICAgICAgX2Rvd25sb2FkX3VybChyZXNwLCBsaW5rLCBjb250ZW50X2ZpbGUsIGhhc2hlcykKICAgIHJldHVybiBmaWxlX3BhdGgsIGNvbnRlbnRfdHlwZQoKCmRlZiBfY2hlY2tfZG93bmxvYWRfZGlyKGxpbmssIGRvd25sb2FkX2RpciwgaGFzaGVzKToKICAgICIiIiBDaGVjayBkb3dubG9hZF9kaXIgZm9yIHByZXZpb3VzbHkgZG93bmxvYWRlZCBmaWxlIHdpdGggY29ycmVjdCBoYXNoCiAgICAgICAgSWYgYSBjb3JyZWN0IGZpbGUgaXMgZm91bmQgcmV0dXJuIGl0cyBwYXRoIGVsc2UgTm9uZQogICAgIiIiCiAgICBkb3dubG9hZF9wYXRoID0gb3MucGF0aC5qb2luKGRvd25sb2FkX2RpciwgbGluay5maWxlbmFtZSkKICAgIGlmIG9zLnBhdGguZXhpc3RzKGRvd25sb2FkX3BhdGgpOgogICAgICAgICMgSWYgYWxyZWFkeSBkb3dubG9hZGVkLCBkb2VzIGl0cyBoYXNoIG1hdGNoPwogICAgICAgIGxvZ2dlci5pbmZvKCdGaWxlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQgJXMnLCBkb3dubG9hZF9wYXRoKQogICAgICAgIGlmIGhhc2hlczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaGFzaGVzLmNoZWNrX2FnYWluc3RfcGF0aChkb3dubG9hZF9wYXRoKQogICAgICAgICAgICBleGNlcHQgSGFzaE1pc21hdGNoOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ1ByZXZpb3VzbHktZG93bmxvYWRlZCBmaWxlICVzIGhhcyBiYWQgaGFzaC4gJwogICAgICAgICAgICAgICAgICAgICdSZS1kb3dubG9hZGluZy4nLAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX3BhdGgKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG9zLnVubGluayhkb3dubG9hZF9wYXRoKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gZG93bmxvYWRfcGF0aAogICAgcmV0dXJuIE5vbmUKUEsDBBQAAAAAAAAAIQC+epaYuR8AALkfAAAuAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvZXhjZXB0aW9ucy5weSIiIkV4Y2VwdGlvbnMgdXNlZCB0aHJvdWdob3V0IHBhY2thZ2UiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiwgZ3JvdXBieSwgcmVwZWF0Cgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgaXRlcml0ZW1zCgoKY2xhc3MgUGlwRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkJhc2UgcGlwIGV4Y2VwdGlvbiIiIgoKCmNsYXNzIEluc3RhbGxhdGlvbkVycm9yKFBpcEVycm9yKToKICAgICIiIkdlbmVyYWwgZXhjZXB0aW9uIGR1cmluZyBpbnN0YWxsYXRpb24iIiIKCgpjbGFzcyBVbmluc3RhbGxhdGlvbkVycm9yKFBpcEVycm9yKToKICAgICIiIkdlbmVyYWwgZXhjZXB0aW9uIGR1cmluZyB1bmluc3RhbGxhdGlvbiIiIgoKCmNsYXNzIERpc3RyaWJ1dGlvbk5vdEZvdW5kKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGEgZGlzdHJpYnV0aW9uIGNhbm5vdCBiZSBmb3VuZCB0byBzYXRpc2Z5IGEgcmVxdWlyZW1lbnQiIiIKCgpjbGFzcyBSZXF1aXJlbWVudHNGaWxlUGFyc2VFcnJvcihJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhIGdlbmVyYWwgZXJyb3Igb2NjdXJzIHBhcnNpbmcgYSByZXF1aXJlbWVudHMgZmlsZSBsaW5lLiIiIgoKCmNsYXNzIEJlc3RWZXJzaW9uQWxyZWFkeUluc3RhbGxlZChQaXBFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB0aGUgbW9zdCB1cC10by1kYXRlIHZlcnNpb24gb2YgYSBwYWNrYWdlIGlzIGFscmVhZHkKICAgIGluc3RhbGxlZC4iIiIKCgpjbGFzcyBCYWRDb21tYW5kKFBpcEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHZpcnR1YWxlbnYgb3IgYSBjb21tYW5kIGlzIG5vdCBmb3VuZCIiIgoKCmNsYXNzIENvbW1hbmRFcnJvcihQaXBFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIiIiCgoKY2xhc3MgUHJldmlvdXNCdWlsZERpckVycm9yKFBpcEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHRoZXJlJ3MgYSBwcmV2aW91cyBjb25mbGljdGluZyBidWlsZCBkaXJlY3RvcnkiIiIKCgpjbGFzcyBJbnZhbGlkV2hlZWxGaWxlbmFtZShJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJJbnZhbGlkIHdoZWVsIGZpbGVuYW1lLiIiIgoKCmNsYXNzIFVuc3VwcG9ydGVkV2hlZWwoSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiVW5zdXBwb3J0ZWQgd2hlZWwuIiIiCgoKY2xhc3MgSGFzaEVycm9ycyhJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJNdWx0aXBsZSBIYXNoRXJyb3IgaW5zdGFuY2VzIHJvbGxlZCBpbnRvIG9uZSBmb3IgcmVwb3J0aW5nIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuZXJyb3JzID0gW10KCiAgICBkZWYgYXBwZW5kKHNlbGYsIGVycm9yKToKICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoZXJyb3IpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgbGluZXMgPSBbXQogICAgICAgIHNlbGYuZXJyb3JzLnNvcnQoa2V5PWxhbWJkYSBlOiBlLm9yZGVyKQogICAgICAgIGZvciBjbHMsIGVycm9yc19vZl9jbHMgaW4gZ3JvdXBieShzZWxmLmVycm9ycywgbGFtYmRhIGU6IGUuX19jbGFzc19fKToKICAgICAgICAgICAgbGluZXMuYXBwZW5kKGNscy5oZWFkKQogICAgICAgICAgICBsaW5lcy5leHRlbmQoZS5ib2R5KCkgZm9yIGUgaW4gZXJyb3JzX29mX2NscykKICAgICAgICBpZiBsaW5lczoKICAgICAgICAgICAgcmV0dXJuICdcbicuam9pbihsaW5lcykKCiAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5lcnJvcnMpCgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fbm9uemVyb19fKCkKCgpjbGFzcyBIYXNoRXJyb3IoSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiCiAgICBBIGZhaWx1cmUgdG8gdmVyaWZ5IGEgcGFja2FnZSBhZ2FpbnN0IGtub3duLWdvb2QgaGFzaGVzCgogICAgOmN2YXIgb3JkZXI6IEFuIGludCBzb3J0aW5nIGhhc2ggZXhjZXB0aW9uIGNsYXNzZXMgYnkgZGlmZmljdWx0eSBvZgogICAgICAgIHJlY292ZXJ5IChsb3dlciBiZWluZyBoYXJkZXIpLCBzbyB0aGUgdXNlciBkb2Vzbid0IGJvdGhlciBmcmV0dGluZwogICAgICAgIGFib3V0IHVucGlubmVkIHBhY2thZ2VzIHdoZW4gaGUgaGFzIGRlZXBlciBpc3N1ZXMsIGxpa2UgVkNTCiAgICAgICAgZGVwZW5kZW5jaWVzLCB0byBkZWFsIHdpdGguIEFsc28ga2VlcHMgZXJyb3IgcmVwb3J0cyBpbiBhCiAgICAgICAgZGV0ZXJtaW5pc3RpYyBvcmRlci4KICAgIDpjdmFyIGhlYWQ6IEEgc2VjdGlvbiBoZWFkaW5nIGZvciBkaXNwbGF5IGFib3ZlIHBvdGVudGlhbGx5IG1hbnkKICAgICAgICBleGNlcHRpb25zIG9mIHRoaXMga2luZAogICAgOml2YXIgcmVxOiBUaGUgSW5zdGFsbFJlcXVpcmVtZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZXJyb3IuIFRoaXMgaXMKICAgICAgICBwYXN0ZWQgb24gYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyBpbnN0YW50aWF0ZWQsIGJlY2F1c2UgaXQncyBub3QKICAgICAgICB0eXBpY2FsbHkgYXZhaWxhYmxlIGVhcmxpZXIuCgogICAgIiIiCiAgICByZXEgPSBOb25lCiAgICBoZWFkID0gJycKCiAgICBkZWYgYm9keShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBzdW1tYXJ5IG9mIG1lIGZvciBkaXNwbGF5IHVuZGVyIHRoZSBoZWFkaW5nLgoKICAgICAgICBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHByaW50cyBhIGRlc2NyaXB0aW9uIG9mIHRoZQogICAgICAgIHRyaWdnZXJpbmcgcmVxdWlyZW1lbnQuCgogICAgICAgIDpwYXJhbSByZXE6IFRoZSBJbnN0YWxsUmVxdWlyZW1lbnQgdGhhdCBwcm92b2tlZCB0aGlzIGVycm9yLCB3aXRoCiAgICAgICAgICAgIHBvcHVsYXRlX2xpbmsoKSBoYXZpbmcgYWxyZWFkeSBiZWVuIGNhbGxlZAoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJyAgICAlcycgJSBzZWxmLl9yZXF1aXJlbWVudF9uYW1lKCkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzXG4lcycgJSAoc2VsZi5oZWFkLCBzZWxmLmJvZHkoKSkKCiAgICBkZWYgX3JlcXVpcmVtZW50X25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIHJlcXVpcmVtZW50IHRoYXQgdHJpZ2dlcmVkIG1lLgoKICAgICAgICBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBsb25nIGRlc2NyaXB0aW9uIG9mIHRoZSByZXEsIHdpdGgKICAgICAgICBsaW5lIG51bWJlcnMKCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHN0cihzZWxmLnJlcSkgaWYgc2VsZi5yZXEgZWxzZSAndW5rbm93biBwYWNrYWdlJwoKCmNsYXNzIFZjc0hhc2hVbnN1cHBvcnRlZChIYXNoRXJyb3IpOgogICAgIiIiQSBoYXNoIHdhcyBwcm92aWRlZCBmb3IgYSB2ZXJzaW9uLWNvbnRyb2wtc3lzdGVtLWJhc2VkIHJlcXVpcmVtZW50LCBidXQKICAgIHdlIGRvbid0IGhhdmUgYSBtZXRob2QgZm9yIGhhc2hpbmcgdGhvc2UuIiIiCgogICAgb3JkZXIgPSAwCiAgICBoZWFkID0gKCJDYW4ndCB2ZXJpZnkgaGFzaGVzIGZvciB0aGVzZSByZXF1aXJlbWVudHMgYmVjYXVzZSB3ZSBkb24ndCAiCiAgICAgICAgICAgICJoYXZlIGEgd2F5IHRvIGhhc2ggdmVyc2lvbiBjb250cm9sIHJlcG9zaXRvcmllczoiKQoKCmNsYXNzIERpcmVjdG9yeVVybEhhc2hVbnN1cHBvcnRlZChIYXNoRXJyb3IpOgogICAgIiIiQSBoYXNoIHdhcyBwcm92aWRlZCBmb3IgYSB2ZXJzaW9uLWNvbnRyb2wtc3lzdGVtLWJhc2VkIHJlcXVpcmVtZW50LCBidXQKICAgIHdlIGRvbid0IGhhdmUgYSBtZXRob2QgZm9yIGhhc2hpbmcgdGhvc2UuIiIiCgogICAgb3JkZXIgPSAxCiAgICBoZWFkID0gKCJDYW4ndCB2ZXJpZnkgaGFzaGVzIGZvciB0aGVzZSBmaWxlOi8vIHJlcXVpcmVtZW50cyBiZWNhdXNlIHRoZXkgIgogICAgICAgICAgICAicG9pbnQgdG8gZGlyZWN0b3JpZXM6IikKCgpjbGFzcyBIYXNoTWlzc2luZyhIYXNoRXJyb3IpOgogICAgIiIiQSBoYXNoIHdhcyBuZWVkZWQgZm9yIGEgcmVxdWlyZW1lbnQgYnV0IGlzIGFic2VudC4iIiIKCiAgICBvcmRlciA9IDIKICAgIGhlYWQgPSAoJ0hhc2hlcyBhcmUgcmVxdWlyZWQgaW4gLS1yZXF1aXJlLWhhc2hlcyBtb2RlLCBidXQgdGhleSBhcmUgJwogICAgICAgICAgICAnbWlzc2luZyBmcm9tIHNvbWUgcmVxdWlyZW1lbnRzLiBIZXJlIGlzIGEgbGlzdCBvZiB0aG9zZSAnCiAgICAgICAgICAgICdyZXF1aXJlbWVudHMgYWxvbmcgd2l0aCB0aGUgaGFzaGVzIHRoZWlyIGRvd25sb2FkZWQgYXJjaGl2ZXMgJwogICAgICAgICAgICAnYWN0dWFsbHkgaGFkLiBBZGQgbGluZXMgbGlrZSB0aGVzZSB0byB5b3VyIHJlcXVpcmVtZW50cyBmaWxlcyB0byAnCiAgICAgICAgICAgICdwcmV2ZW50IHRhbXBlcmluZy4gKElmIHlvdSBkaWQgbm90IGVuYWJsZSAtLXJlcXVpcmUtaGFzaGVzICcKICAgICAgICAgICAgJ21hbnVhbGx5LCBub3RlIHRoYXQgaXQgdHVybnMgb24gYXV0b21hdGljYWxseSB3aGVuIGFueSBwYWNrYWdlICcKICAgICAgICAgICAgJ2hhcyBhIGhhc2guKScpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGdvdHRlbl9oYXNoKToKICAgICAgICAiIiIKICAgICAgICA6cGFyYW0gZ290dGVuX2hhc2g6IFRoZSBoYXNoIG9mIHRoZSAocG9zc2libHkgbWFsaWNpb3VzKSBhcmNoaXZlIHdlCiAgICAgICAgICAgIGp1c3QgZG93bmxvYWRlZAogICAgICAgICIiIgogICAgICAgIHNlbGYuZ290dGVuX2hhc2ggPSBnb3R0ZW5faGFzaAoKICAgIGRlZiBib2R5KHNlbGYpOgogICAgICAgIGZyb20gcGlwLnV0aWxzLmhhc2hlcyBpbXBvcnQgRkFWT1JJVEVfSEFTSCAgIyBEb2RnZSBjaXJjdWxhciBpbXBvcnQuCgogICAgICAgIHBhY2thZ2UgPSBOb25lCiAgICAgICAgaWYgc2VsZi5yZXE6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgVVJMLWJhc2VkIHJlcXVpcmVtZW50cywgZGlzcGxheSB0aGUgb3JpZ2luYWwgVVJMCiAgICAgICAgICAgICMgc2VlbiBpbiB0aGUgcmVxdWlyZW1lbnRzIGZpbGUgcmF0aGVyIHRoYW4gdGhlIHBhY2thZ2UgbmFtZSwKICAgICAgICAgICAgIyBzbyB0aGUgb3V0cHV0IGNhbiBiZSBkaXJlY3RseSBjb3BpZWQgaW50byB0aGUgcmVxdWlyZW1lbnRzIGZpbGUuCiAgICAgICAgICAgIHBhY2thZ2UgPSAoc2VsZi5yZXEub3JpZ2luYWxfbGluayBpZiBzZWxmLnJlcS5vcmlnaW5hbF9saW5rCiAgICAgICAgICAgICAgICAgICAgICAgIyBJbiBjYXNlIHNvbWVvbmUgZmVlZHMgc29tZXRoaW5nIGRvd25yaWdodCBzdHVwaWQKICAgICAgICAgICAgICAgICAgICAgICAjIHRvIEluc3RhbGxSZXF1aXJlbWVudCdzIGNvbnN0cnVjdG9yLgogICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZ2V0YXR0cihzZWxmLnJlcSwgJ3JlcScsIE5vbmUpKQogICAgICAgIHJldHVybiAnICAgICVzIC0taGFzaD0lczolcycgJSAocGFja2FnZSBvciAndW5rbm93biBwYWNrYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVk9SSVRFX0hBU0gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdvdHRlbl9oYXNoKQoKCmNsYXNzIEhhc2hVbnBpbm5lZChIYXNoRXJyb3IpOgogICAgIiIiQSByZXF1aXJlbWVudCBoYWQgYSBoYXNoIHNwZWNpZmllZCBidXQgd2FzIG5vdCBwaW5uZWQgdG8gYSBzcGVjaWZpYwogICAgdmVyc2lvbi4iIiIKCiAgICBvcmRlciA9IDMKICAgIGhlYWQgPSAoJ0luIC0tcmVxdWlyZS1oYXNoZXMgbW9kZSwgYWxsIHJlcXVpcmVtZW50cyBtdXN0IGhhdmUgdGhlaXIgJwogICAgICAgICAgICAndmVyc2lvbnMgcGlubmVkIHdpdGggPT0uIFRoZXNlIGRvIG5vdDonKQoKCmNsYXNzIEhhc2hNaXNtYXRjaChIYXNoRXJyb3IpOgogICAgIiIiCiAgICBEaXN0cmlidXRpb24gZmlsZSBoYXNoIHZhbHVlcyBkb24ndCBtYXRjaC4KCiAgICA6aXZhciBwYWNrYWdlX25hbWU6IFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYXNoCiAgICAgICAgbWlzbWF0Y2guIEZlZWwgZnJlZSB0byB3cml0ZSB0byB0aGlzIGFmdGVyIHRoZSBleGNlcHRpb24gaXMgcmFpc2UgdG8KICAgICAgICBpbXByb3ZlIGl0cyBlcnJvciBtZXNzYWdlLgoKICAgICIiIgogICAgb3JkZXIgPSA0CiAgICBoZWFkID0gKCdUSEVTRSBQQUNLQUdFUyBETyBOT1QgTUFUQ0ggVEhFIEhBU0hFUyBGUk9NIFRIRSBSRVFVSVJFTUVOVFMgJwogICAgICAgICAgICAnRklMRS4gSWYgeW91IGhhdmUgdXBkYXRlZCB0aGUgcGFja2FnZSB2ZXJzaW9ucywgcGxlYXNlIHVwZGF0ZSAnCiAgICAgICAgICAgICd0aGUgaGFzaGVzLiBPdGhlcndpc2UsIGV4YW1pbmUgdGhlIHBhY2thZ2UgY29udGVudHMgY2FyZWZ1bGx5OyAnCiAgICAgICAgICAgICdzb21lb25lIG1heSBoYXZlIHRhbXBlcmVkIHdpdGggdGhlbS4nKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhbGxvd2VkLCBnb3RzKToKICAgICAgICAiIiIKICAgICAgICA6cGFyYW0gYWxsb3dlZDogQSBkaWN0IG9mIGFsZ29yaXRobSBuYW1lcyBwb2ludGluZyB0byBsaXN0cyBvZiBhbGxvd2VkCiAgICAgICAgICAgIGhleCBkaWdlc3RzCiAgICAgICAgOnBhcmFtIGdvdHM6IEEgZGljdCBvZiBhbGdvcml0aG0gbmFtZXMgcG9pbnRpbmcgdG8gaGFzaGVzIHdlCiAgICAgICAgICAgIGFjdHVhbGx5IGdvdCBmcm9tIHRoZSBmaWxlcyB1bmRlciBzdXNwaWNpb24KICAgICAgICAiIiIKICAgICAgICBzZWxmLmFsbG93ZWQgPSBhbGxvd2VkCiAgICAgICAgc2VsZi5nb3RzID0gZ290cwoKICAgIGRlZiBib2R5KHNlbGYpOgogICAgICAgIHJldHVybiAnICAgICVzOlxuJXMnICUgKHNlbGYuX3JlcXVpcmVtZW50X25hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoX2NvbXBhcmlzb24oKSkKCiAgICBkZWYgX2hhc2hfY29tcGFyaXNvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBjb21wYXJpc29uIG9mIGFjdHVhbCBhbmQgZXhwZWN0ZWQgaGFzaCB2YWx1ZXMuCgogICAgICAgIEV4YW1wbGU6OgoKICAgICAgICAgICAgICAgRXhwZWN0ZWQgc2hhMjU2IGFiY2RlYWJjZGVhYmNkZWFiY2RlYWJjZGVhYmNkZWFiY2RlYWJjZGVhYmNkZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgMTIzNDUxMjM0NTEyMzQ1MTIzNDUxMjM0NTEyMzQ1MTIzNDUxMjM0NTEyMzQ1CiAgICAgICAgICAgICAgICAgICAgR290ICAgICAgICBiY2RlZmJjZGVmYmNkZWZiY2RlZmJjZGVmYmNkZWZiY2RlZmJjZGVmYmNkZWYKCiAgICAgICAgIiIiCiAgICAgICAgZGVmIGhhc2hfdGhlbl9vcihoYXNoX25hbWUpOgogICAgICAgICAgICAjIEZvciBub3csIGFsbCB0aGUgZGVjZW50IGhhc2hlcyBoYXZlIDYtY2hhciBuYW1lcywgc28gd2UgY2FuIGdldAogICAgICAgICAgICAjIGF3YXkgd2l0aCBoYXJkLWNvZGluZyBzcGFjZSBsaXRlcmFscy4KICAgICAgICAgICAgcmV0dXJuIGNoYWluKFtoYXNoX25hbWVdLCByZXBlYXQoJyAgICBvcicpKQoKICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgZm9yIGhhc2hfbmFtZSwgZXhwZWN0ZWRzIGluIGl0ZXJpdGVtcyhzZWxmLmFsbG93ZWQpOgogICAgICAgICAgICBwcmVmaXggPSBoYXNoX3RoZW5fb3IoaGFzaF9uYW1lKQogICAgICAgICAgICBsaW5lcy5leHRlbmQoKCcgICAgICAgIEV4cGVjdGVkICVzICVzJyAlIChuZXh0KHByZWZpeCksIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGUgaW4gZXhwZWN0ZWRzKQogICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyAgICAgICAgICAgICBHb3QgICAgICAgICVzXG4nICUKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ290c1toYXNoX25hbWVdLmhleGRpZ2VzdCgpKQogICAgICAgICAgICBwcmVmaXggPSAnICAgIG9yJwogICAgICAgIHJldHVybiAnXG4nLmpvaW4obGluZXMpCgoKY2xhc3MgVW5zdXBwb3J0ZWRQeXRob25WZXJzaW9uKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIlVuc3VwcG9ydGVkIHB5dGhvbiB2ZXJzaW9uIGFjY29yZGluZyB0byBSZXF1aXJlcy1QeXRob24gcGFja2FnZQogICAgbWV0YWRhdGEuIiIiClBLAwQUAAAAAAAAACEANvgl/w6cAAAOnAAAKQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2luZGV4LnB5IiIiUm91dGluZXMgcmVsYXRlZCB0byBQeVBJLCBpbmRleGVzIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgY2dpCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IG1pbWV0eXBlcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCByZXF1ZXN0IGFzIHVybGxpYl9yZXF1ZXN0Cgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGlwYWRkcmVzcwpmcm9tIHBpcC51dGlscyBpbXBvcnQgKAogICAgY2FjaGVkX3Byb3BlcnR5LCBzcGxpdGV4dCwgbm9ybWFsaXplX3BhdGgsCiAgICBBUkNISVZFX0VYVEVOU0lPTlMsIFNVUFBPUlRFRF9FWFRFTlNJT05TLAopCmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC51dGlscy5wYWNrYWdpbmcgaW1wb3J0IGNoZWNrX3JlcXVpcmVzX3B5dGhvbgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBEaXN0cmlidXRpb25Ob3RGb3VuZCwgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkLCBJbnZhbGlkV2hlZWxGaWxlbmFtZSwKICAgIFVuc3VwcG9ydGVkV2hlZWwsCikKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IEhBU19UTFMsIGlzX3VybCwgcGF0aF90b191cmwsIHVybF90b19wYXRoCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbCwgd2hlZWxfZXh0CmZyb20gcGlwLnBlcDQyNXRhZ3MgaW1wb3J0IGdldF9zdXBwb3J0ZWQKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgaHRtbDVsaWIsIHJlcXVlc3RzLCBzaXgKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgcGFyc2UgYXMgcGFyc2VfdmVyc2lvbgpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy51dGlscyBpbXBvcnQgY2Fub25pY2FsaXplX25hbWUKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcgaW1wb3J0IHNwZWNpZmllcnMKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5leGNlcHRpb25zIGltcG9ydCBTU0xFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLmRpc3RsaWIuY29tcGF0IGltcG9ydCB1bmVzY2FwZQoKCl9fYWxsX18gPSBbJ0Zvcm1hdENvbnRyb2wnLCAnZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUnLCAnUGFja2FnZUZpbmRlciddCgoKU0VDVVJFX09SSUdJTlMgPSBbCiAgICAjIHByb3RvY29sLCBob3N0bmFtZSwgcG9ydAogICAgIyBUYWtlbiBmcm9tIENocm9tZSdzIGxpc3Qgb2Ygc2VjdXJlIG9yaWdpbnMgKFNlZTogaHR0cDovL2JpdC5seS8xcXJ5U0tDKQogICAgKCJodHRwcyIsICIqIiwgIioiKSwKICAgICgiKiIsICJsb2NhbGhvc3QiLCAiKiIpLAogICAgKCIqIiwgIjEyNy4wLjAuMC84IiwgIioiKSwKICAgICgiKiIsICI6OjEvMTI4IiwgIioiKSwKICAgICgiZmlsZSIsICIqIiwgTm9uZSksCiAgICAjIHNzaCBpcyBhbHdheXMgc2VjdXJlLgogICAgKCJzc2giLCAiKiIsICIqIiksCl0KCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBJbnN0YWxsYXRpb25DYW5kaWRhdGUob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvamVjdCwgdmVyc2lvbiwgbG9jYXRpb24pOgogICAgICAgIHNlbGYucHJvamVjdCA9IHByb2plY3QKICAgICAgICBzZWxmLnZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHZlcnNpb24pCiAgICAgICAgc2VsZi5sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgc2VsZi5fa2V5ID0gKHNlbGYucHJvamVjdCwgc2VsZi52ZXJzaW9uLCBzZWxmLmxvY2F0aW9uKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxJbnN0YWxsYXRpb25DYW5kaWRhdGUoezAhcn0sIHsxIXJ9LCB7MiFyfSk+Ii5mb3JtYXQoCiAgICAgICAgICAgIHNlbGYucHJvamVjdCwgc2VsZi52ZXJzaW9uLCBzZWxmLmxvY2F0aW9uLAogICAgICAgICkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fa2V5KQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8IG8pCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDw9IG8pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID09IG8pCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID49IG8pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID4gbykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgIT0gbykKCiAgICBkZWYgX2NvbXBhcmUoc2VsZiwgb3RoZXIsIG1ldGhvZCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEluc3RhbGxhdGlvbkNhbmRpZGF0ZSk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gbWV0aG9kKHNlbGYuX2tleSwgb3RoZXIuX2tleSkKCgpjbGFzcyBQYWNrYWdlRmluZGVyKG9iamVjdCk6CiAgICAiIiJUaGlzIGZpbmRzIHBhY2thZ2VzLgoKICAgIFRoaXMgaXMgbWVhbnQgdG8gbWF0Y2ggZWFzeV9pbnN0YWxsJ3MgdGVjaG5pcXVlIGZvciBsb29raW5nIGZvcgogICAgcGFja2FnZXMsIGJ5IHJlYWRpbmcgcGFnZXMgYW5kIGxvb2tpbmcgZm9yIGFwcHJvcHJpYXRlIGxpbmtzLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbmRfbGlua3MsIGluZGV4X3VybHMsIGFsbG93X2FsbF9wcmVyZWxlYXNlcz1GYWxzZSwKICAgICAgICAgICAgICAgICB0cnVzdGVkX2hvc3RzPU5vbmUsIHByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcz1GYWxzZSwKICAgICAgICAgICAgICAgICBzZXNzaW9uPU5vbmUsIGZvcm1hdF9jb250cm9sPU5vbmUsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgICAgICAgdmVyc2lvbnM9Tm9uZSwgYWJpPU5vbmUsIGltcGxlbWVudGF0aW9uPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSBhIFBhY2thZ2VGaW5kZXIuCgogICAgICAgIDpwYXJhbSBmb3JtYXRfY29udHJvbDogQSBGb3JtYXRDb250cm9sIG9iamVjdCBvciBOb25lLiBVc2VkIHRvIGNvbnRyb2wKICAgICAgICAgICAgdGhlIHNlbGVjdGlvbiBvZiBzb3VyY2UgcGFja2FnZXMgLyBiaW5hcnkgcGFja2FnZXMgd2hlbiBjb25zdWx0aW5nCiAgICAgICAgICAgIHRoZSBpbmRleCBhbmQgbGlua3MuCiAgICAgICAgOnBhcmFtIHBsYXRmb3JtOiBBIHN0cmluZyBvciBOb25lLiBJZiBOb25lLCBzZWFyY2hlcyBmb3IgcGFja2FnZXMKICAgICAgICAgICAgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHN5c3RlbS4gT3RoZXJ3aXNlLCB3aWxsIGZpbmQKICAgICAgICAgICAgcGFja2FnZXMgdGhhdCBjYW4gYmUgYnVpbHQgb24gdGhlIHBsYXRmb3JtIHBhc3NlZCBpbi4gVGhlc2UKICAgICAgICAgICAgcGFja2FnZXMgd2lsbCBvbmx5IGJlIGRvd25sb2FkZWQgZm9yIGRpc3RyaWJ1dGlvbjogdGhleSB3aWxsCiAgICAgICAgICAgIG5vdCBiZSBidWlsdCBsb2NhbGx5LgogICAgICAgIDpwYXJhbSB2ZXJzaW9uczogQSBsaXN0IG9mIHN0cmluZ3Mgb3IgTm9uZS4gVGhpcyBpcyBwYXNzZWQgZGlyZWN0bHkKICAgICAgICAgICAgdG8gcGVwNDI1dGFncy5weSBpbiB0aGUgZ2V0X3N1cHBvcnRlZCgpIG1ldGhvZC4KICAgICAgICA6cGFyYW0gYWJpOiBBIHN0cmluZyBvciBOb25lLiBUaGlzIGlzIHBhc3NlZCBkaXJlY3RseQogICAgICAgICAgICB0byBwZXA0MjV0YWdzLnB5IGluIHRoZSBnZXRfc3VwcG9ydGVkKCkgbWV0aG9kLgogICAgICAgIDpwYXJhbSBpbXBsZW1lbnRhdGlvbjogQSBzdHJpbmcgb3IgTm9uZS4gVGhpcyBpcyBwYXNzZWQgZGlyZWN0bHkKICAgICAgICAgICAgdG8gcGVwNDI1dGFncy5weSBpbiB0aGUgZ2V0X3N1cHBvcnRlZCgpIG1ldGhvZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICJQYWNrYWdlRmluZGVyKCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICIKICAgICAgICAgICAgICAgICInc2Vzc2lvbiciCiAgICAgICAgICAgICkKCiAgICAgICAgIyBCdWlsZCBmaW5kX2xpbmtzLiBJZiBhbiBhcmd1bWVudCBzdGFydHMgd2l0aCB+LCBpdCBtYXkgYmUKICAgICAgICAjIGEgbG9jYWwgZmlsZSByZWxhdGl2ZSB0byBhIGhvbWUgZGlyZWN0b3J5LiBTbyB0cnkgbm9ybWFsaXppbmcKICAgICAgICAjIGl0IGFuZCBpZiBpdCBleGlzdHMsIHVzZSB0aGUgbm9ybWFsaXplZCB2ZXJzaW9uLgogICAgICAgICMgVGhpcyBpcyBkZWxpYmVyYXRlbHkgY29uc2VydmF0aXZlIC0gaXQgbWlnaHQgYmUgZmluZSBqdXN0IHRvCiAgICAgICAgIyBibGluZGx5IG5vcm1hbGl6ZSBhbnl0aGluZyBzdGFydGluZyB3aXRoIGEgfi4uLgogICAgICAgIHNlbGYuZmluZF9saW5rcyA9IFtdCiAgICAgICAgZm9yIGxpbmsgaW4gZmluZF9saW5rczoKICAgICAgICAgICAgaWYgbGluay5zdGFydHN3aXRoKCd+Jyk6CiAgICAgICAgICAgICAgICBuZXdfbGluayA9IG5vcm1hbGl6ZV9wYXRoKGxpbmspCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuZXdfbGluayk6CiAgICAgICAgICAgICAgICAgICAgbGluayA9IG5ld19saW5rCiAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcy5hcHBlbmQobGluaykKCiAgICAgICAgc2VsZi5pbmRleF91cmxzID0gaW5kZXhfdXJscwogICAgICAgIHNlbGYuZGVwZW5kZW5jeV9saW5rcyA9IFtdCgogICAgICAgICMgVGhlc2UgYXJlIGJvcmluZyBsaW5rcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGxvZ2dlZCBzb21laG93OgogICAgICAgIHNlbGYubG9nZ2VkX2xpbmtzID0gc2V0KCkKCiAgICAgICAgc2VsZi5mb3JtYXRfY29udHJvbCA9IGZvcm1hdF9jb250cm9sIG9yIEZvcm1hdENvbnRyb2woc2V0KCksIHNldCgpKQoKICAgICAgICAjIERvbWFpbnMgdGhhdCB3ZSB3b24ndCBlbWl0IHdhcm5pbmdzIGZvciB3aGVuIG5vdCB1c2luZyBIVFRQUwogICAgICAgIHNlbGYuc2VjdXJlX29yaWdpbnMgPSBbCiAgICAgICAgICAgICgiKiIsIGhvc3QsICIqIikKICAgICAgICAgICAgZm9yIGhvc3QgaW4gKHRydXN0ZWRfaG9zdHMgaWYgdHJ1c3RlZF9ob3N0cyBlbHNlIFtdKQogICAgICAgIF0KCiAgICAgICAgIyBEbyB3ZSB3YW50IHRvIGFsbG93IF9hbGxfIHByZS1yZWxlYXNlcz8KICAgICAgICBzZWxmLmFsbG93X2FsbF9wcmVyZWxlYXNlcyA9IGFsbG93X2FsbF9wcmVyZWxlYXNlcwoKICAgICAgICAjIERvIHdlIHByb2Nlc3MgZGVwZW5kZW5jeSBsaW5rcz8KICAgICAgICBzZWxmLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcyA9IHByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcwoKICAgICAgICAjIFRoZSBTZXNzaW9uIHdlJ2xsIHVzZSB0byBtYWtlIHJlcXVlc3RzCiAgICAgICAgc2VsZi5zZXNzaW9uID0gc2Vzc2lvbgoKICAgICAgICAjIFRoZSB2YWxpZCB0YWdzIHRvIGNoZWNrIHBvdGVudGlhbCBmb3VuZCB3aGVlbCBjYW5kaWRhdGVzIGFnYWluc3QKICAgICAgICBzZWxmLnZhbGlkX3RhZ3MgPSBnZXRfc3VwcG9ydGVkKAogICAgICAgICAgICB2ZXJzaW9ucz12ZXJzaW9ucywKICAgICAgICAgICAgcGxhdGZvcm09cGxhdGZvcm0sCiAgICAgICAgICAgIGFiaT1hYmksCiAgICAgICAgICAgIGltcGw9aW1wbGVtZW50YXRpb24sCiAgICAgICAgKQoKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgVExTIGVuYWJsZWQsIHRoZW4gV0FSTiBpZiBhbnlwbGFjZSB3ZSdyZSBsb29raW5nCiAgICAgICAgIyByZWxpZXMgb24gVExTLgogICAgICAgIGlmIG5vdCBIQVNfVExTOgogICAgICAgICAgICBmb3IgbGluayBpbiBpdGVydG9vbHMuY2hhaW4oc2VsZi5pbmRleF91cmxzLCBzZWxmLmZpbmRfbGlua3MpOgogICAgICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKGxpbmspCiAgICAgICAgICAgICAgICBpZiBwYXJzZWQuc2NoZW1lID09ICJodHRwcyI6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICJwaXAgaXMgY29uZmlndXJlZCB3aXRoIGxvY2F0aW9ucyB0aGF0IHJlcXVpcmUgIgogICAgICAgICAgICAgICAgICAgICAgICAiVExTL1NTTCwgaG93ZXZlciB0aGUgc3NsIG1vZHVsZSBpbiBQeXRob24gaXMgbm90ICIKICAgICAgICAgICAgICAgICAgICAgICAgImF2YWlsYWJsZS4iCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgZGVmIGFkZF9kZXBlbmRlbmN5X2xpbmtzKHNlbGYsIGxpbmtzKToKICAgICAgICAjICMgRklYTUU6IHRoaXMgc2hvdWxkbid0IGJlIGdsb2JhbCBsaXN0IHRoaXMsIGl0IHNob3VsZCBvbmx5CiAgICAgICAgIyAjIGFwcGx5IHRvIHJlcXVpcmVtZW50cyBvZiB0aGUgcGFja2FnZSB0aGF0IHNwZWNpZmllcyB0aGUKICAgICAgICAjICMgZGVwZW5kZW5jeV9saW5rcyB2YWx1ZQogICAgICAgICMgIyBGSVhNRTogYWxzbywgd2Ugc2hvdWxkIHRyYWNrIGNvbWVzX2Zyb20gKGkuZS4sIHVzZSBMaW5rKQogICAgICAgIGlmIHNlbGYucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIkRlcGVuZGVuY3kgTGlua3MgcHJvY2Vzc2luZyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlICIKICAgICAgICAgICAgICAgICJyZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmRlcGVuZGVuY3lfbGlua3MuZXh0ZW5kKGxpbmtzKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc29ydF9sb2NhdGlvbnMobG9jYXRpb25zLCBleHBhbmRfZGlyPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBTb3J0IGxvY2F0aW9ucyBpbnRvICJmaWxlcyIgKGFyY2hpdmVzKSBhbmQgInVybHMiLCBhbmQgcmV0dXJuCiAgICAgICAgYSBwYWlyIG9mIGxpc3RzIChmaWxlcyx1cmxzKQogICAgICAgICIiIgogICAgICAgIGZpbGVzID0gW10KICAgICAgICB1cmxzID0gW10KCiAgICAgICAgIyBwdXRzIHRoZSB1cmwgZm9yIHRoZSBnaXZlbiBmaWxlIHBhdGggaW50byB0aGUgYXBwcm9wcmlhdGUgbGlzdAogICAgICAgIGRlZiBzb3J0X3BhdGgocGF0aCk6CiAgICAgICAgICAgIHVybCA9IHBhdGhfdG9fdXJsKHBhdGgpCiAgICAgICAgICAgIGlmIG1pbWV0eXBlcy5ndWVzc190eXBlKHVybCwgc3RyaWN0PUZhbHNlKVswXSA9PSAndGV4dC9odG1sJzoKICAgICAgICAgICAgICAgIHVybHMuYXBwZW5kKHVybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZCh1cmwpCgogICAgICAgIGZvciB1cmwgaW4gbG9jYXRpb25zOgoKICAgICAgICAgICAgaXNfbG9jYWxfcGF0aCA9IG9zLnBhdGguZXhpc3RzKHVybCkKICAgICAgICAgICAgaXNfZmlsZV91cmwgPSB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKQoKICAgICAgICAgICAgaWYgaXNfbG9jYWxfcGF0aCBvciBpc19maWxlX3VybDoKICAgICAgICAgICAgICAgIGlmIGlzX2xvY2FsX3BhdGg6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHVybAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gdXJsX3RvX3BhdGgodXJsKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBleHBhbmRfZGlyOgogICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydF9wYXRoKG9zLnBhdGguam9pbihwYXRoLCBpdGVtKSkKICAgICAgICAgICAgICAgICAgICBlbGlmIGlzX2ZpbGVfdXJsOgogICAgICAgICAgICAgICAgICAgICAgICB1cmxzLmFwcGVuZCh1cmwpCiAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIHNvcnRfcGF0aChwYXRoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIlVybCAnJXMnIGlzIGlnbm9yZWQ6IGl0IGlzIG5laXRoZXIgYSBmaWxlICIKICAgICAgICAgICAgICAgICAgICAgICAgIm5vciBhIGRpcmVjdG9yeS4iLCB1cmwpCiAgICAgICAgICAgIGVsaWYgaXNfdXJsKHVybCk6CiAgICAgICAgICAgICAgICAjIE9ubHkgYWRkIHVybCB3aXRoIGNsZWFyIHNjaGVtZQogICAgICAgICAgICAgICAgdXJscy5hcHBlbmQodXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIlVybCAnJXMnIGlzIGlnbm9yZWQuIEl0IGlzIGVpdGhlciBhIG5vbi1leGlzdGluZyAiCiAgICAgICAgICAgICAgICAgICAgInBhdGggb3IgbGFja3MgYSBzcGVjaWZpYyBzY2hlbWUuIiwgdXJsKQoKICAgICAgICByZXR1cm4gZmlsZXMsIHVybHMKCiAgICBkZWYgX2NhbmRpZGF0ZV9zb3J0X2tleShzZWxmLCBjYW5kaWRhdGUpOgogICAgICAgICIiIgogICAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgbGluayBzb3J0IGtleSBmb3IgbGluayB0dXBsZXMuCiAgICAgICAgVGhlIGdyZWF0ZXIgdGhlIHJldHVybiB2YWx1ZSwgdGhlIG1vcmUgcHJlZmVycmVkIGl0IGlzLgogICAgICAgIElmIG5vdCBmaW5kaW5nIHdoZWVscywgdGhlbiBzb3J0ZWQgYnkgdmVyc2lvbiBvbmx5LgogICAgICAgIElmIGZpbmRpbmcgd2hlZWxzLCB0aGVuIHRoZSBzb3J0IG9yZGVyIGlzIGJ5IHZlcnNpb24sIHRoZW46CiAgICAgICAgICAxLiBleGlzdGluZyBpbnN0YWxscwogICAgICAgICAgMi4gd2hlZWxzIG9yZGVyZWQgdmlhIFdoZWVsLnN1cHBvcnRfaW5kZXhfbWluKHNlbGYudmFsaWRfdGFncykKICAgICAgICAgIDMuIHNvdXJjZSBhcmNoaXZlcwogICAgICAgIE5vdGU6IGl0IHdhcyBjb25zaWRlcmVkIHRvIGVtYmVkIHRoaXMgbG9naWMgaW50byB0aGUgTGluawogICAgICAgICAgICAgIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBidXQgdGhlbiBkaWZmZXJlbnQgc2Rpc3QgbGlua3MKICAgICAgICAgICAgICB3aXRoIHRoZSBzYW1lIHZlcnNpb24sIHdvdWxkIGhhdmUgdG8gYmUgY29uc2lkZXJlZCBlcXVhbAogICAgICAgICIiIgogICAgICAgIHN1cHBvcnRfbnVtID0gbGVuKHNlbGYudmFsaWRfdGFncykKICAgICAgICBpZiBjYW5kaWRhdGUubG9jYXRpb24uaXNfd2hlZWw6CiAgICAgICAgICAgICMgY2FuIHJhaXNlIEludmFsaWRXaGVlbEZpbGVuYW1lCiAgICAgICAgICAgIHdoZWVsID0gV2hlZWwoY2FuZGlkYXRlLmxvY2F0aW9uLmZpbGVuYW1lKQogICAgICAgICAgICBpZiBub3Qgd2hlZWwuc3VwcG9ydGVkKHNlbGYudmFsaWRfdGFncyk6CiAgICAgICAgICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFdoZWVsKAogICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdXBwb3J0ZWQgd2hlZWwgZm9yIHRoaXMgcGxhdGZvcm0uIEl0ICIKICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgYmUgc29ydGVkLiIgJSB3aGVlbC5maWxlbmFtZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBwcmkgPSAtKHdoZWVsLnN1cHBvcnRfaW5kZXhfbWluKHNlbGYudmFsaWRfdGFncykpCiAgICAgICAgZWxzZTogICMgc2Rpc3QKICAgICAgICAgICAgcHJpID0gLShzdXBwb3J0X251bSkKICAgICAgICByZXR1cm4gKGNhbmRpZGF0ZS52ZXJzaW9uLCBwcmkpCgogICAgZGVmIF92YWxpZGF0ZV9zZWN1cmVfb3JpZ2luKHNlbGYsIGxvZ2dlciwgbG9jYXRpb24pOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHRoaXMgdXJsIHVzZWQgYSBzZWN1cmUgdHJhbnNwb3J0IG1lY2hhbmlzbQogICAgICAgIHBhcnNlZCA9IHVybGxpYl9wYXJzZS51cmxwYXJzZShzdHIobG9jYXRpb24pKQogICAgICAgIG9yaWdpbiA9IChwYXJzZWQuc2NoZW1lLCBwYXJzZWQuaG9zdG5hbWUsIHBhcnNlZC5wb3J0KQoKICAgICAgICAjIFRoZSBwcm90b2NvbCB0byB1c2UgdG8gc2VlIGlmIHRoZSBwcm90b2NvbCBtYXRjaGVzLgogICAgICAgICMgRG9uJ3QgY291bnQgdGhlIHJlcG9zaXRvcnkgdHlwZSBhcyBwYXJ0IG9mIHRoZSBwcm90b2NvbDogaW4KICAgICAgICAjIGNhc2VzIHN1Y2ggYXMgImdpdCtzc2giLCBvbmx5IHVzZSAic3NoIi4gKEkuZS4sIE9ubHkgdmVyaWZ5IGFnYWluc3QKICAgICAgICAjIHRoZSBsYXN0IHNjaGVtZS4pCiAgICAgICAgcHJvdG9jb2wgPSBvcmlnaW5bMF0ucnNwbGl0KCcrJywgMSlbLTFdCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIG91ciBvcmlnaW4gaXMgYSBzZWN1cmUgb3JpZ2luIGJ5IGxvb2tpbmcgdGhyb3VnaCBvdXIKICAgICAgICAjIGhhcmRjb2RlZCBsaXN0IG9mIHNlY3VyZSBvcmlnaW5zLCBhcyB3ZWxsIGFzIGFueSBhZGRpdGlvbmFsIG9uZXMKICAgICAgICAjIGNvbmZpZ3VyZWQgb24gdGhpcyBQYWNrYWdlRmluZGVyIGluc3RhbmNlLgogICAgICAgIGZvciBzZWN1cmVfb3JpZ2luIGluIChTRUNVUkVfT1JJR0lOUyArIHNlbGYuc2VjdXJlX29yaWdpbnMpOgogICAgICAgICAgICBpZiBwcm90b2NvbCAhPSBzZWN1cmVfb3JpZ2luWzBdIGFuZCBzZWN1cmVfb3JpZ2luWzBdICE9ICIqIjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gZG8gdGhpcyBkZWNvZGUgZGFuY2UgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSBhCiAgICAgICAgICAgICAgICAjIHVuaWNvZGUgb2JqZWN0LCBldmVuIG9uIFB5dGhvbiAyLnguCiAgICAgICAgICAgICAgICBhZGRyID0gaXBhZGRyZXNzLmlwX2FkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWzFdCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG9yaWdpblsxXSwgc2l4LnRleHRfdHlwZSkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luWzFdIGlzIE5vbmUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZWxzZSBvcmlnaW5bMV0uZGVjb2RlKCJ1dGY4IikKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG5ldHdvcmsgPSBpcGFkZHJlc3MuaXBfbmV0d29yaygKICAgICAgICAgICAgICAgICAgICBzZWN1cmVfb3JpZ2luWzFdCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWN1cmVfb3JpZ2luWzFdLCBzaXgudGV4dF90eXBlKQogICAgICAgICAgICAgICAgICAgIGVsc2Ugc2VjdXJlX29yaWdpblsxXS5kZWNvZGUoInV0ZjgiKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICMgV2UgZG9uJ3QgaGF2ZSBib3RoIGEgdmFsaWQgYWRkcmVzcyBvciBhIHZhbGlkIG5ldHdvcmssIHNvCiAgICAgICAgICAgICAgICAjIHdlJ2xsIGNoZWNrIHRoaXMgb3JpZ2luIGFnYWluc3QgaG9zdG5hbWVzLgogICAgICAgICAgICAgICAgaWYgKG9yaWdpblsxXSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luWzFdLmxvd2VyKCkgIT0gc2VjdXJlX29yaWdpblsxXS5sb3dlcigpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmVfb3JpZ2luWzFdICE9ICIqIik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgV2UgaGF2ZSBhIHZhbGlkIGFkZHJlc3MgYW5kIG5ldHdvcmssIHNvIHNlZSBpZiB0aGUgYWRkcmVzcwogICAgICAgICAgICAgICAgIyBpcyBjb250YWluZWQgd2l0aGluIHRoZSBuZXR3b3JrLgogICAgICAgICAgICAgICAgaWYgYWRkciBub3QgaW4gbmV0d29yazoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHBvcnQgcGF0Y2hlcwogICAgICAgICAgICBpZiAob3JpZ2luWzJdICE9IHNlY3VyZV9vcmlnaW5bMl0gYW5kCiAgICAgICAgICAgICAgICAgICAgc2VjdXJlX29yaWdpblsyXSAhPSAiKiIgYW5kCiAgICAgICAgICAgICAgICAgICAgc2VjdXJlX29yaWdpblsyXSBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gaGVyZSwgdGhlbiB0aGlzIG9yaWdpbiBtYXRjaGVzIHRoZSBjdXJyZW50CiAgICAgICAgICAgICMgc2VjdXJlIG9yaWdpbiBhbmQgd2Ugc2hvdWxkIHJldHVybiBUcnVlCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIHRoaXMgcG9pbnQsIHRoZW4gdGhlIG9yaWdpbiBpc24ndCBzZWN1cmUgYW5kIHdlCiAgICAgICAgIyB3aWxsIG5vdCBhY2NlcHQgaXQgYXMgYSB2YWxpZCBsb2NhdGlvbiB0byBzZWFyY2guIFdlIHdpbGwgaG93ZXZlcgogICAgICAgICMgbG9nIGEgd2FybmluZyB0aGF0IHdlIGFyZSBpZ25vcmluZyBpdC4KICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgIlRoZSByZXBvc2l0b3J5IGxvY2F0ZWQgYXQgJXMgaXMgbm90IGEgdHJ1c3RlZCBvciBzZWN1cmUgaG9zdCBhbmQgIgogICAgICAgICAgICAiaXMgYmVpbmcgaWdub3JlZC4gSWYgdGhpcyByZXBvc2l0b3J5IGlzIGF2YWlsYWJsZSB2aWEgSFRUUFMgaXQgIgogICAgICAgICAgICAiaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUVFBTIGluc3RlYWQsIG90aGVyd2lzZSB5b3UgbWF5IHNpbGVuY2UgIgogICAgICAgICAgICAidGhpcyB3YXJuaW5nIGFuZCBhbGxvdyBpdCBhbnl3YXlzIHdpdGggJy0tdHJ1c3RlZC1ob3N0ICVzJy4iLAogICAgICAgICAgICBwYXJzZWQuaG9zdG5hbWUsCiAgICAgICAgICAgIHBhcnNlZC5ob3N0bmFtZSwKICAgICAgICApCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfZ2V0X2luZGV4X3VybHNfbG9jYXRpb25zKHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJucyB0aGUgbG9jYXRpb25zIGZvdW5kIHZpYSBzZWxmLmluZGV4X3VybHMKCiAgICAgICAgQ2hlY2tzIHRoZSB1cmxfbmFtZSBvbiB0aGUgbWFpbiAoZmlyc3QgaW4gdGhlIGxpc3QpIGluZGV4IGFuZAogICAgICAgIHVzZSB0aGlzIHVybF9uYW1lIHRvIHByb2R1Y2UgYWxsIGxvY2F0aW9ucwogICAgICAgICIiIgoKICAgICAgICBkZWYgbWt1cmxfcHlwaV91cmwodXJsKToKICAgICAgICAgICAgbG9jID0gcG9zaXhwYXRoLmpvaW4oCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICB1cmxsaWJfcGFyc2UucXVvdGUoY2Fub25pY2FsaXplX25hbWUocHJvamVjdF9uYW1lKSkpCiAgICAgICAgICAgICMgRm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIGVhc3lfaW5zdGFsbCwgZW5zdXJlIHRoZSBwYXRoCiAgICAgICAgICAgICMgZW5kcyBpbiBhIHRyYWlsaW5nIHNsYXNoLiAgQWx0aG91Z2ggdGhpcyBpc24ndCBpbiB0aGUgc3BlYwogICAgICAgICAgICAjIChhbmQgUHlQSSBjYW4gaGFuZGxlIGl0IHdpdGhvdXQgdGhlIHNsYXNoKSBzb21lIG90aGVyIGluZGV4CiAgICAgICAgICAgICMgaW1wbGVtZW50YXRpb25zIG1pZ2h0IGJyZWFrIGlmIHRoZXkgcmVsaWVkIG9uIGVhc3lfaW5zdGFsbCdzCiAgICAgICAgICAgICMgYmVoYXZpb3IuCiAgICAgICAgICAgIGlmIG5vdCBsb2MuZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgIGxvYyA9IGxvYyArICcvJwogICAgICAgICAgICByZXR1cm4gbG9jCgogICAgICAgIHJldHVybiBbbWt1cmxfcHlwaV91cmwodXJsKSBmb3IgdXJsIGluIHNlbGYuaW5kZXhfdXJsc10KCiAgICBkZWYgZmluZF9hbGxfY2FuZGlkYXRlcyhzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIkZpbmQgYWxsIGF2YWlsYWJsZSBJbnN0YWxsYXRpb25DYW5kaWRhdGUgZm9yIHByb2plY3RfbmFtZQoKICAgICAgICBUaGlzIGNoZWNrcyBpbmRleF91cmxzLCBmaW5kX2xpbmtzIGFuZCBkZXBlbmRlbmN5X2xpbmtzLgogICAgICAgIEFsbCB2ZXJzaW9ucyBmb3VuZCBhcmUgcmV0dXJuZWQgYXMgYW4gSW5zdGFsbGF0aW9uQ2FuZGlkYXRlIGxpc3QuCgogICAgICAgIFNlZSBfbGlua19wYWNrYWdlX3ZlcnNpb25zIGZvciBkZXRhaWxzIG9uIHdoaWNoIGZpbGVzIGFyZSBhY2NlcHRlZAogICAgICAgICIiIgogICAgICAgIGluZGV4X2xvY2F0aW9ucyA9IHNlbGYuX2dldF9pbmRleF91cmxzX2xvY2F0aW9ucyhwcm9qZWN0X25hbWUpCiAgICAgICAgaW5kZXhfZmlsZV9sb2MsIGluZGV4X3VybF9sb2MgPSBzZWxmLl9zb3J0X2xvY2F0aW9ucyhpbmRleF9sb2NhdGlvbnMpCiAgICAgICAgZmxfZmlsZV9sb2MsIGZsX3VybF9sb2MgPSBzZWxmLl9zb3J0X2xvY2F0aW9ucygKICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzLCBleHBhbmRfZGlyPVRydWUpCiAgICAgICAgZGVwX2ZpbGVfbG9jLCBkZXBfdXJsX2xvYyA9IHNlbGYuX3NvcnRfbG9jYXRpb25zKHNlbGYuZGVwZW5kZW5jeV9saW5rcykKCiAgICAgICAgZmlsZV9sb2NhdGlvbnMgPSAoCiAgICAgICAgICAgIExpbmsodXJsKSBmb3IgdXJsIGluIGl0ZXJ0b29scy5jaGFpbigKICAgICAgICAgICAgICAgIGluZGV4X2ZpbGVfbG9jLCBmbF9maWxlX2xvYywgZGVwX2ZpbGVfbG9jKQogICAgICAgICkKCiAgICAgICAgIyBXZSB0cnVzdCBldmVyeSB1cmwgdGhhdCB0aGUgdXNlciBoYXMgZ2l2ZW4gdXMgd2hldGhlciBpdCB3YXMgZ2l2ZW4KICAgICAgICAjICAgdmlhIC0taW5kZXgtdXJsIG9yIC0tZmluZC1saW5rcwogICAgICAgICMgV2UgZXhwbGljaXRseSBkbyBub3QgdHJ1c3QgbGlua3MgdGhhdCBjYW1lIGZyb20gZGVwZW5kZW5jeV9saW5rcwogICAgICAgICMgV2Ugd2FudCB0byBmaWx0ZXIgb3V0IGFueSB0aGluZyB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2VjdXJlIG9yaWdpbi4KICAgICAgICB1cmxfbG9jYXRpb25zID0gWwogICAgICAgICAgICBsaW5rIGZvciBsaW5rIGluIGl0ZXJ0b29scy5jaGFpbigKICAgICAgICAgICAgICAgIChMaW5rKHVybCkgZm9yIHVybCBpbiBpbmRleF91cmxfbG9jKSwKICAgICAgICAgICAgICAgIChMaW5rKHVybCkgZm9yIHVybCBpbiBmbF91cmxfbG9jKSwKICAgICAgICAgICAgICAgIChMaW5rKHVybCkgZm9yIHVybCBpbiBkZXBfdXJsX2xvYyksCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgc2VsZi5fdmFsaWRhdGVfc2VjdXJlX29yaWdpbihsb2dnZXIsIGxpbmspCiAgICAgICAgXQoKICAgICAgICBsb2dnZXIuZGVidWcoJyVkIGxvY2F0aW9uKHMpIHRvIHNlYXJjaCBmb3IgdmVyc2lvbnMgb2YgJXM6JywKICAgICAgICAgICAgICAgICAgICAgbGVuKHVybF9sb2NhdGlvbnMpLCBwcm9qZWN0X25hbWUpCgogICAgICAgIGZvciBsb2NhdGlvbiBpbiB1cmxfbG9jYXRpb25zOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyogJXMnLCBsb2NhdGlvbikKCiAgICAgICAgY2Fub25pY2FsX25hbWUgPSBjYW5vbmljYWxpemVfbmFtZShwcm9qZWN0X25hbWUpCiAgICAgICAgZm9ybWF0cyA9IGZtdF9jdGxfZm9ybWF0cyhzZWxmLmZvcm1hdF9jb250cm9sLCBjYW5vbmljYWxfbmFtZSkKICAgICAgICBzZWFyY2ggPSBTZWFyY2gocHJvamVjdF9uYW1lLCBjYW5vbmljYWxfbmFtZSwgZm9ybWF0cykKICAgICAgICBmaW5kX2xpbmtzX3ZlcnNpb25zID0gc2VsZi5fcGFja2FnZV92ZXJzaW9ucygKICAgICAgICAgICAgIyBXZSB0cnVzdCBldmVyeSBkaXJlY3RseSBsaW5rZWQgYXJjaGl2ZSBpbiBmaW5kX2xpbmtzCiAgICAgICAgICAgIChMaW5rKHVybCwgJy1mJykgZm9yIHVybCBpbiBzZWxmLmZpbmRfbGlua3MpLAogICAgICAgICAgICBzZWFyY2gKICAgICAgICApCgogICAgICAgIHBhZ2VfdmVyc2lvbnMgPSBbXQogICAgICAgIGZvciBwYWdlIGluIHNlbGYuX2dldF9wYWdlcyh1cmxfbG9jYXRpb25zLCBwcm9qZWN0X25hbWUpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0FuYWx5emluZyBsaW5rcyBmcm9tIHBhZ2UgJXMnLCBwYWdlLnVybCkKICAgICAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICAgICBwYWdlX3ZlcnNpb25zLmV4dGVuZCgKICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYWNrYWdlX3ZlcnNpb25zKHBhZ2UubGlua3MsIHNlYXJjaCkKICAgICAgICAgICAgICAgICkKCiAgICAgICAgZGVwZW5kZW5jeV92ZXJzaW9ucyA9IHNlbGYuX3BhY2thZ2VfdmVyc2lvbnMoCiAgICAgICAgICAgIChMaW5rKHVybCkgZm9yIHVybCBpbiBzZWxmLmRlcGVuZGVuY3lfbGlua3MpLCBzZWFyY2gKICAgICAgICApCiAgICAgICAgaWYgZGVwZW5kZW5jeV92ZXJzaW9uczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ2RlcGVuZGVuY3lfbGlua3MgZm91bmQ6ICVzJywKICAgICAgICAgICAgICAgICcsICcuam9pbihbCiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5sb2NhdGlvbi51cmwgZm9yIHZlcnNpb24gaW4gZGVwZW5kZW5jeV92ZXJzaW9ucwogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKQoKICAgICAgICBmaWxlX3ZlcnNpb25zID0gc2VsZi5fcGFja2FnZV92ZXJzaW9ucyhmaWxlX2xvY2F0aW9ucywgc2VhcmNoKQogICAgICAgIGlmIGZpbGVfdmVyc2lvbnM6CiAgICAgICAgICAgIGZpbGVfdmVyc2lvbnMuc29ydChyZXZlcnNlPVRydWUpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdMb2NhbCBmaWxlcyBmb3VuZDogJXMnLAogICAgICAgICAgICAgICAgJywgJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICB1cmxfdG9fcGF0aChjYW5kaWRhdGUubG9jYXRpb24udXJsKQogICAgICAgICAgICAgICAgICAgIGZvciBjYW5kaWRhdGUgaW4gZmlsZV92ZXJzaW9ucwogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKQoKICAgICAgICAjIFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgcHJpb3JpdHkgb3JkZXJpbmcKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBmaWxlX3ZlcnNpb25zICsgZmluZF9saW5rc192ZXJzaW9ucyArIHBhZ2VfdmVyc2lvbnMgKwogICAgICAgICAgICBkZXBlbmRlbmN5X3ZlcnNpb25zCiAgICAgICAgKQoKICAgIGRlZiBmaW5kX3JlcXVpcmVtZW50KHNlbGYsIHJlcSwgdXBncmFkZSk6CiAgICAgICAgIiIiVHJ5IHRvIGZpbmQgYSBMaW5rIG1hdGNoaW5nIHJlcQoKICAgICAgICBFeHBlY3RzIHJlcSwgYW4gSW5zdGFsbFJlcXVpcmVtZW50IGFuZCB1cGdyYWRlLCBhIGJvb2xlYW4KICAgICAgICBSZXR1cm5zIGEgTGluayBpZiBmb3VuZCwKICAgICAgICBSYWlzZXMgRGlzdHJpYnV0aW9uTm90Rm91bmQgb3IgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkIG90aGVyd2lzZQogICAgICAgICIiIgogICAgICAgIGFsbF9jYW5kaWRhdGVzID0gc2VsZi5maW5kX2FsbF9jYW5kaWRhdGVzKHJlcS5uYW1lKQoKICAgICAgICAjIEZpbHRlciBvdXQgYW55dGhpbmcgd2hpY2ggZG9lc24ndCBtYXRjaCBvdXIgc3BlY2lmaWVyCiAgICAgICAgY29tcGF0aWJsZV92ZXJzaW9ucyA9IHNldCgKICAgICAgICAgICAgcmVxLnNwZWNpZmllci5maWx0ZXIoCiAgICAgICAgICAgICAgICAjIFdlIHR1cm4gdGhlIHZlcnNpb24gb2JqZWN0IGludG8gYSBzdHIgaGVyZSBiZWNhdXNlIG90aGVyd2lzZQogICAgICAgICAgICAgICAgIyB3aGVuIHdlJ3JlIGRlYnVuZGxlZCBidXQgc2V0dXB0b29scyBpc24ndCwgUHl0aG9uIHdpbGwgc2VlCiAgICAgICAgICAgICAgICAjIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24gYW5kCiAgICAgICAgICAgICAgICAjIHBrZ19yZXNvdXJjZXMuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uIGFzIGRpZmZlcmVudAogICAgICAgICAgICAgICAgIyB0eXBlcy4gVGhpcyB3YXkgd2UnbGwgdXNlIGEgc3RyIGFzIGEgY29tbW9uIGRhdGEgaW50ZXJjaGFuZ2UKICAgICAgICAgICAgICAgICMgZm9ybWF0LiBJZiB3ZSBzdG9wIHVzaW5nIHRoZSBwa2dfcmVzb3VyY2VzIHByb3ZpZGVkIHNwZWNpZmllcgogICAgICAgICAgICAgICAgIyBhbmQgc3RhcnQgdXNpbmcgb3VyIG93biwgd2UgY2FuIGRyb3AgdGhlIGNhc3QgdG8gc3RyKCkuCiAgICAgICAgICAgICAgICBbc3RyKGMudmVyc2lvbikgZm9yIGMgaW4gYWxsX2NhbmRpZGF0ZXNdLAogICAgICAgICAgICAgICAgcHJlcmVsZWFzZXM9KAogICAgICAgICAgICAgICAgICAgIHNlbGYuYWxsb3dfYWxsX3ByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5hbGxvd19hbGxfcHJlcmVsZWFzZXMgZWxzZSBOb25lCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFwcGxpY2FibGVfY2FuZGlkYXRlcyA9IFsKICAgICAgICAgICAgIyBBZ2FpbiwgY29udmVydGluZyB0byBzdHIgdG8gZGVhbCB3aXRoIGRlYnVuZGxpbmcuCiAgICAgICAgICAgIGMgZm9yIGMgaW4gYWxsX2NhbmRpZGF0ZXMgaWYgc3RyKGMudmVyc2lvbikgaW4gY29tcGF0aWJsZV92ZXJzaW9ucwogICAgICAgIF0KCiAgICAgICAgaWYgYXBwbGljYWJsZV9jYW5kaWRhdGVzOgogICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZSA9IG1heChhcHBsaWNhYmxlX2NhbmRpZGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1zZWxmLl9jYW5kaWRhdGVfc29ydF9rZXkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUgPSBOb25lCgogICAgICAgIGlmIHJlcS5zYXRpc2ZpZWRfYnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihyZXEuc2F0aXNmaWVkX2J5LnZlcnNpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24gPSBOb25lCgogICAgICAgIGlmIGluc3RhbGxlZF92ZXJzaW9uIGlzIE5vbmUgYW5kIGJlc3RfY2FuZGlkYXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgICAgICdDb3VsZCBub3QgZmluZCBhIHZlcnNpb24gdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50ICVzICcKICAgICAgICAgICAgICAgICcoZnJvbSB2ZXJzaW9uczogJXMpJywKICAgICAgICAgICAgICAgIHJlcSwKICAgICAgICAgICAgICAgICcsICcuam9pbigKICAgICAgICAgICAgICAgICAgICBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgIHNldChzdHIoYy52ZXJzaW9uKSBmb3IgYyBpbiBhbGxfY2FuZGlkYXRlcyksCiAgICAgICAgICAgICAgICAgICAgICAgIGtleT1wYXJzZV92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmFpc2UgRGlzdHJpYnV0aW9uTm90Rm91bmQoCiAgICAgICAgICAgICAgICAnTm8gbWF0Y2hpbmcgZGlzdHJpYnV0aW9uIGZvdW5kIGZvciAlcycgJSByZXEKICAgICAgICAgICAgKQoKICAgICAgICBiZXN0X2luc3RhbGxlZCA9IEZhbHNlCiAgICAgICAgaWYgaW5zdGFsbGVkX3ZlcnNpb24gYW5kICgKICAgICAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlIGlzIE5vbmUgb3IKICAgICAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlLnZlcnNpb24gPD0gaW5zdGFsbGVkX3ZlcnNpb24pOgogICAgICAgICAgICBiZXN0X2luc3RhbGxlZCA9IFRydWUKCiAgICAgICAgaWYgbm90IHVwZ3JhZGUgYW5kIGluc3RhbGxlZF92ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBiZXN0X2luc3RhbGxlZDoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAnRXhpc3RpbmcgaW5zdGFsbGVkIHZlcnNpb24gKCVzKSBpcyBtb3N0IHVwLXRvLWRhdGUgYW5kICcKICAgICAgICAgICAgICAgICAgICAnc2F0aXNmaWVzIHJlcXVpcmVtZW50JywKICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAnRXhpc3RpbmcgaW5zdGFsbGVkIHZlcnNpb24gKCVzKSBzYXRpc2ZpZXMgcmVxdWlyZW1lbnQgJwogICAgICAgICAgICAgICAgICAgICcobW9zdCB1cC10by1kYXRlIHZlcnNpb24gaXMgJXMpJywKICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZS52ZXJzaW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBpZiBiZXN0X2luc3RhbGxlZDoKICAgICAgICAgICAgIyBXZSBoYXZlIGFuIGV4aXN0aW5nIHZlcnNpb24sIGFuZCBpdHMgdGhlIGJlc3QgdmVyc2lvbgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnSW5zdGFsbGVkIHZlcnNpb24gKCVzKSBpcyBtb3N0IHVwLXRvLWRhdGUgKHBhc3QgdmVyc2lvbnM6ICcKICAgICAgICAgICAgICAgICclcyknLAogICAgICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oc29ydGVkKGNvbXBhdGlibGVfdmVyc2lvbnMsIGtleT1wYXJzZV92ZXJzaW9uKSkgb3IKICAgICAgICAgICAgICAgICJub25lIiwKICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZSBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQKCiAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAnVXNpbmcgdmVyc2lvbiAlcyAobmV3ZXN0IG9mIHZlcnNpb25zOiAlcyknLAogICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZS52ZXJzaW9uLAogICAgICAgICAgICAnLCAnLmpvaW4oc29ydGVkKGNvbXBhdGlibGVfdmVyc2lvbnMsIGtleT1wYXJzZV92ZXJzaW9uKSkKICAgICAgICApCiAgICAgICAgcmV0dXJuIGJlc3RfY2FuZGlkYXRlLmxvY2F0aW9uCgogICAgZGVmIF9nZXRfcGFnZXMoc2VsZiwgbG9jYXRpb25zLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIgogICAgICAgIFlpZWxkcyAocGFnZSwgcGFnZV91cmwpIGZyb20gdGhlIGdpdmVuIGxvY2F0aW9ucywgc2tpcHBpbmcKICAgICAgICBsb2NhdGlvbnMgdGhhdCBoYXZlIGVycm9ycy4KICAgICAgICAiIiIKICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBmb3IgbG9jYXRpb24gaW4gbG9jYXRpb25zOgogICAgICAgICAgICBpZiBsb2NhdGlvbiBpbiBzZWVuOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc2Vlbi5hZGQobG9jYXRpb24pCgogICAgICAgICAgICBwYWdlID0gc2VsZi5fZ2V0X3BhZ2UobG9jYXRpb24pCiAgICAgICAgICAgIGlmIHBhZ2UgaXMgTm9uZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB5aWVsZCBwYWdlCgogICAgX3B5X3ZlcnNpb25fcmUgPSByZS5jb21waWxlKHInLXB5KFsxMjNdXC4/WzAtOV0/KSQnKQoKICAgIGRlZiBfc29ydF9saW5rcyhzZWxmLCBsaW5rcyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBlbGVtZW50cyBvZiBsaW5rcyBpbiBvcmRlciwgbm9uLWVnZyBsaW5rcyBmaXJzdCwgZWdnIGxpbmtzCiAgICAgICAgc2Vjb25kLCB3aGlsZSBlbGltaW5hdGluZyBkdXBsaWNhdGVzCiAgICAgICAgIiIiCiAgICAgICAgZWdncywgbm9fZWdncyA9IFtdLCBbXQogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBsaW5rIGluIGxpbmtzOgogICAgICAgICAgICBpZiBsaW5rIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbi5hZGQobGluaykKICAgICAgICAgICAgICAgIGlmIGxpbmsuZWdnX2ZyYWdtZW50OgogICAgICAgICAgICAgICAgICAgIGVnZ3MuYXBwZW5kKGxpbmspCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5vX2VnZ3MuYXBwZW5kKGxpbmspCiAgICAgICAgcmV0dXJuIG5vX2VnZ3MgKyBlZ2dzCgogICAgZGVmIF9wYWNrYWdlX3ZlcnNpb25zKHNlbGYsIGxpbmtzLCBzZWFyY2gpOgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgZm9yIGxpbmsgaW4gc2VsZi5fc29ydF9saW5rcyhsaW5rcyk6CiAgICAgICAgICAgIHYgPSBzZWxmLl9saW5rX3BhY2thZ2VfdmVyc2lvbnMobGluaywgc2VhcmNoKQogICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh2KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2xvZ19za2lwcGVkX2xpbmsoc2VsZiwgbGluaywgcmVhc29uKToKICAgICAgICBpZiBsaW5rIG5vdCBpbiBzZWxmLmxvZ2dlZF9saW5rczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBsaW5rICVzOyAlcycsIGxpbmssIHJlYXNvbikKICAgICAgICAgICAgc2VsZi5sb2dnZWRfbGlua3MuYWRkKGxpbmspCgogICAgZGVmIF9saW5rX3BhY2thZ2VfdmVyc2lvbnMoc2VsZiwgbGluaywgc2VhcmNoKToKICAgICAgICAiIiJSZXR1cm4gYW4gSW5zdGFsbGF0aW9uQ2FuZGlkYXRlIG9yIE5vbmUiIiIKICAgICAgICB2ZXJzaW9uID0gTm9uZQogICAgICAgIGlmIGxpbmsuZWdnX2ZyYWdtZW50OgogICAgICAgICAgICBlZ2dfaW5mbyA9IGxpbmsuZWdnX2ZyYWdtZW50CiAgICAgICAgICAgIGV4dCA9IGxpbmsuZXh0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZWdnX2luZm8sIGV4dCA9IGxpbmsuc3BsaXRleHQoKQogICAgICAgICAgICBpZiBub3QgZXh0OgogICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluayhsaW5rLCAnbm90IGEgZmlsZScpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgZXh0IG5vdCBpbiBTVVBQT1JURURfRVhURU5TSU9OUzoKICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgbGluaywgJ3Vuc3VwcG9ydGVkIGFyY2hpdmUgZm9ybWF0OiAlcycgJSBleHQpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgImJpbmFyeSIgbm90IGluIHNlYXJjaC5mb3JtYXRzIGFuZCBleHQgPT0gd2hlZWxfZXh0OgogICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgICAgICBsaW5rLCAnTm8gYmluYXJpZXMgcGVybWl0dGVkIGZvciAlcycgJSBzZWFyY2guc3VwcGxpZWQpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgIm1hY29zeDEwIiBpbiBsaW5rLnBhdGggYW5kIGV4dCA9PSAnLnppcCc6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKGxpbmssICdtYWNvc3gxMCBvbmUnKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmIGV4dCA9PSB3aGVlbF9leHQ6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgd2hlZWwgPSBXaGVlbChsaW5rLmZpbGVuYW1lKQogICAgICAgICAgICAgICAgZXhjZXB0IEludmFsaWRXaGVlbEZpbGVuYW1lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsobGluaywgJ2ludmFsaWQgd2hlZWwgZmlsZW5hbWUnKQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgaWYgY2Fub25pY2FsaXplX25hbWUod2hlZWwubmFtZSkgIT0gc2VhcmNoLmNhbm9uaWNhbDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgICAgICAgICBsaW5rLCAnd3JvbmcgcHJvamVjdCBuYW1lIChub3QgJXMpJyAlIHNlYXJjaC5zdXBwbGllZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICBpZiBub3Qgd2hlZWwuc3VwcG9ydGVkKHNlbGYudmFsaWRfdGFncyk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgICAgICAgICAgbGluaywgJ2l0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBQeXRob24nKQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgIHZlcnNpb24gPSB3aGVlbC52ZXJzaW9uCgogICAgICAgICMgVGhpcyBzaG91bGQgYmUgdXAgYnkgdGhlIHNlYXJjaC5va19iaW5hcnkgY2hlY2ssIGJ1dCBzZWUgaXNzdWUgMjcwMC4KICAgICAgICBpZiAic291cmNlIiBub3QgaW4gc2VhcmNoLmZvcm1hdHMgYW5kIGV4dCAhPSB3aGVlbF9leHQ6CiAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICBsaW5rLCAnTm8gc291cmNlcyBwZXJtaXR0ZWQgZm9yICVzJyAlIHNlYXJjaC5zdXBwbGllZCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG5vdCB2ZXJzaW9uOgogICAgICAgICAgICB2ZXJzaW9uID0gZWdnX2luZm9fbWF0Y2hlcyhlZ2dfaW5mbywgc2VhcmNoLnN1cHBsaWVkLCBsaW5rKQogICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgIGxpbmssICd3cm9uZyBwcm9qZWN0IG5hbWUgKG5vdCAlcyknICUgc2VhcmNoLnN1cHBsaWVkKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbWF0Y2ggPSBzZWxmLl9weV92ZXJzaW9uX3JlLnNlYXJjaCh2ZXJzaW9uKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbls6bWF0Y2guc3RhcnQoKV0KICAgICAgICAgICAgcHlfdmVyc2lvbiA9IG1hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgIGlmIHB5X3ZlcnNpb24gIT0gc3lzLnZlcnNpb25bOjNdOgogICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgICAgICBsaW5rLCAnUHl0aG9uIHZlcnNpb24gaXMgaW5jb3JyZWN0JykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIHRyeToKICAgICAgICAgICAgc3VwcG9ydF90aGlzX3B5dGhvbiA9IGNoZWNrX3JlcXVpcmVzX3B5dGhvbihsaW5rLnJlcXVpcmVzX3B5dGhvbikKICAgICAgICBleGNlcHQgc3BlY2lmaWVycy5JbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoIlBhY2thZ2UgJXMgaGFzIGFuIGludmFsaWQgUmVxdWlyZXMtUHl0aG9uIGVudHJ5OiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmZpbGVuYW1lLCBsaW5rLnJlcXVpcmVzX3B5dGhvbikKICAgICAgICAgICAgc3VwcG9ydF90aGlzX3B5dGhvbiA9IFRydWUKCiAgICAgICAgaWYgbm90IHN1cHBvcnRfdGhpc19weXRob246CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiVGhlIHBhY2thZ2UgJXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHB5dGhvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIGluIHVzZS4gQWNjZXB0YWJsZSBweXRob24gdmVyc2lvbnMgYXJlOiVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmssIGxpbmsucmVxdWlyZXNfcHl0aG9uKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGxpbmsgJXMsIHZlcnNpb246ICVzJywgbGluaywgdmVyc2lvbikKCiAgICAgICAgcmV0dXJuIEluc3RhbGxhdGlvbkNhbmRpZGF0ZShzZWFyY2guc3VwcGxpZWQsIHZlcnNpb24sIGxpbmspCgogICAgZGVmIF9nZXRfcGFnZShzZWxmLCBsaW5rKToKICAgICAgICByZXR1cm4gSFRNTFBhZ2UuZ2V0X3BhZ2UobGluaywgc2Vzc2lvbj1zZWxmLnNlc3Npb24pCgoKZGVmIGVnZ19pbmZvX21hdGNoZXMoCiAgICAgICAgZWdnX2luZm8sIHNlYXJjaF9uYW1lLCBsaW5rLAogICAgICAgIF9lZ2dfaW5mb19yZT1yZS5jb21waWxlKHInKFthLXowLTlfLl0rKS0oW2EtejAtOV8uISstXSspJywgcmUuSSkpOgogICAgIiIiUHVsbCB0aGUgdmVyc2lvbiBwYXJ0IG91dCBvZiBhIHN0cmluZy4KCiAgICA6cGFyYW0gZWdnX2luZm86IFRoZSBzdHJpbmcgdG8gcGFyc2UuIEUuZy4gZm9vLTIuMQogICAgOnBhcmFtIHNlYXJjaF9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGlzIGJlbG9uZ3MgdG8uIE5vbmUgdG8KICAgICAgICBpbmZlciB0aGUgbmFtZS4gTm90ZSB0aGF0IHRoaXMgY2Fubm90IHVuYW1iaWd1b3VzbHkgcGFyc2Ugc3RyaW5ncwogICAgICAgIGxpa2UgZm9vLTItMiB3aGljaCBtaWdodCBiZSBmb28sIDItMiBvciBmb28tMiwgMi4KICAgIDpwYXJhbSBsaW5rOiBUaGUgbGluayB0aGUgc3RyaW5nIGNhbWUgZnJvbSwgZm9yIGxvZ2dpbmcgb24gZmFpbHVyZS4KICAgICIiIgogICAgbWF0Y2ggPSBfZWdnX2luZm9fcmUuc2VhcmNoKGVnZ19pbmZvKQogICAgaWYgbm90IG1hdGNoOgogICAgICAgIGxvZ2dlci5kZWJ1ZygnQ291bGQgbm90IHBhcnNlIHZlcnNpb24gZnJvbSBsaW5rOiAlcycsIGxpbmspCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGlmIHNlYXJjaF9uYW1lIGlzIE5vbmU6CiAgICAgICAgZnVsbF9tYXRjaCA9IG1hdGNoLmdyb3VwKDApCiAgICAgICAgcmV0dXJuIGZ1bGxfbWF0Y2hbZnVsbF9tYXRjaC5pbmRleCgnLScpOl0KICAgIG5hbWUgPSBtYXRjaC5ncm91cCgwKS5sb3dlcigpCiAgICAjIFRvIG1hdGNoIHRoZSAic2FmZSIgbmFtZSB0aGF0IHBrZ19yZXNvdXJjZXMgY3JlYXRlczoKICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJ18nLCAnLScpCiAgICAjIHByb2plY3QgbmFtZSBhbmQgdmVyc2lvbiBtdXN0IGJlIHNlcGFyYXRlZCBieSBhIGRhc2gKICAgIGxvb2tfZm9yID0gc2VhcmNoX25hbWUubG93ZXIoKSArICItIgogICAgaWYgbmFtZS5zdGFydHN3aXRoKGxvb2tfZm9yKToKICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMClbbGVuKGxvb2tfZm9yKTpdCiAgICBlbHNlOgogICAgICAgIHJldHVybiBOb25lCgoKY2xhc3MgSFRNTFBhZ2Uob2JqZWN0KToKICAgICIiIlJlcHJlc2VudHMgb25lIHBhZ2UsIGFsb25nIHdpdGggaXRzIFVSTCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZW50LCB1cmwsIGhlYWRlcnM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgaGF2ZSBhbnkgZW5jb2RpbmcgaW5mb3JtYXRpb24gaW4gb3VyIGhlYWRlcnMKICAgICAgICBlbmNvZGluZyA9IE5vbmUKICAgICAgICBpZiBoZWFkZXJzIGFuZCAiQ29udGVudC1UeXBlIiBpbiBoZWFkZXJzOgogICAgICAgICAgICBjb250ZW50X3R5cGUsIHBhcmFtcyA9IGNnaS5wYXJzZV9oZWFkZXIoaGVhZGVyc1siQ29udGVudC1UeXBlIl0pCgogICAgICAgICAgICBpZiAiY2hhcnNldCIgaW4gcGFyYW1zOgogICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBwYXJhbXNbJ2NoYXJzZXQnXQoKICAgICAgICBzZWxmLmNvbnRlbnQgPSBjb250ZW50CiAgICAgICAgc2VsZi5wYXJzZWQgPSBodG1sNWxpYi5wYXJzZSgKICAgICAgICAgICAgc2VsZi5jb250ZW50LAogICAgICAgICAgICB0cmFuc3BvcnRfZW5jb2Rpbmc9ZW5jb2RpbmcsCiAgICAgICAgICAgIG5hbWVzcGFjZUhUTUxFbGVtZW50cz1GYWxzZSwKICAgICAgICApCiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudXJsCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3BhZ2UoY2xzLCBsaW5rLCBza2lwX2FyY2hpdmVzPVRydWUsIHNlc3Npb249Tm9uZSk6CiAgICAgICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAiZ2V0X3BhZ2UoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogJ3Nlc3Npb24nIgogICAgICAgICAgICApCgogICAgICAgIHVybCA9IGxpbmsudXJsCiAgICAgICAgdXJsID0gdXJsLnNwbGl0KCcjJywgMSlbMF0KCiAgICAgICAgIyBDaGVjayBmb3IgVkNTIHNjaGVtZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBsb29rdXAgYXMgd2ViIHBhZ2VzLgogICAgICAgIGZyb20gcGlwLnZjcyBpbXBvcnQgVmNzU3VwcG9ydAogICAgICAgIGZvciBzY2hlbWUgaW4gVmNzU3VwcG9ydC5zY2hlbWVzOgogICAgICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKHNjaGVtZSkgYW5kIHVybFtsZW4oc2NoZW1lKV0gaW4gJys6JzoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2Fubm90IGxvb2sgYXQgJXMgVVJMICVzJywgc2NoZW1lLCBsaW5rKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBza2lwX2FyY2hpdmVzOgogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBsaW5rLmZpbGVuYW1lCiAgICAgICAgICAgICAgICBmb3IgYmFkX2V4dCBpbiBBUkNISVZFX0VYVEVOU0lPTlM6CiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoYmFkX2V4dCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IGNscy5fZ2V0X2NvbnRlbnRfdHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCwgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRfdHlwZS5sb3dlcigpLnN0YXJ0c3dpdGgoJ3RleHQvaHRtbCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2tpcHBpbmcgcGFnZSAlcyBiZWNhdXNlIG9mIENvbnRlbnQtVHlwZTogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgcGFnZSAlcycsIHVybCkKCiAgICAgICAgICAgICMgVGFjayBpbmRleC5odG1sIG9udG8gZmlsZTovLyBVUkxzIHRoYXQgcG9pbnQgdG8gZGlyZWN0b3JpZXMKICAgICAgICAgICAgKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkgPSBcCiAgICAgICAgICAgICAgICB1cmxsaWJfcGFyc2UudXJscGFyc2UodXJsKQogICAgICAgICAgICBpZiAoc2NoZW1lID09ICdmaWxlJyBhbmQKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmlzZGlyKHVybGxpYl9yZXF1ZXN0LnVybDJwYXRobmFtZShwYXRoKSkpOgogICAgICAgICAgICAgICAgIyBhZGQgdHJhaWxpbmcgc2xhc2ggaWYgbm90IHByZXNlbnQgc28gdXJsam9pbiBkb2Vzbid0IHRyaW0KICAgICAgICAgICAgICAgICMgZmluYWwgc2VnbWVudAogICAgICAgICAgICAgICAgaWYgbm90IHVybC5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgICAgIHVybCArPSAnLycKICAgICAgICAgICAgICAgIHVybCA9IHVybGxpYl9wYXJzZS51cmxqb2luKHVybCwgJ2luZGV4Lmh0bWwnKQogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCcgZmlsZTogVVJMIGlzIGRpcmVjdG9yeSwgZ2V0dGluZyAlcycsIHVybCkKCiAgICAgICAgICAgIHJlc3AgPSBzZXNzaW9uLmdldCgKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM9ewogICAgICAgICAgICAgICAgICAgICJBY2NlcHQiOiAidGV4dC9odG1sIiwKICAgICAgICAgICAgICAgICAgICAiQ2FjaGUtQ29udHJvbCI6ICJtYXgtYWdlPTYwMCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCgogICAgICAgICAgICAjIFRoZSBjaGVjayBmb3IgYXJjaGl2ZXMgYWJvdmUgb25seSB3b3JrcyBpZiB0aGUgdXJsIGVuZHMgd2l0aAogICAgICAgICAgICAjIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgYW4gYXJjaGl2ZS4gSG93ZXZlciB0aGF0IGlzIG5vdCBhCiAgICAgICAgICAgICMgcmVxdWlyZW1lbnQgb2YgYW4gdXJsLiBVbmxlc3Mgd2UgaXNzdWUgYSBIRUFEIHJlcXVlc3Qgb24gZXZlcnkKICAgICAgICAgICAgIyB1cmwgd2UgY2Fubm90IGtub3cgYWhlYWQgb2YgdGltZSBmb3Igc3VyZSBpZiBzb21ldGhpbmcgaXMgSFRNTAogICAgICAgICAgICAjIG9yIG5vdC4gSG93ZXZlciB3ZSBjYW4gY2hlY2sgYWZ0ZXIgd2UndmUgZG93bmxvYWRlZCBpdC4KICAgICAgICAgICAgY29udGVudF90eXBlID0gcmVzcC5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJywgJ3Vua25vd24nKQogICAgICAgICAgICBpZiBub3QgY29udGVudF90eXBlLmxvd2VyKCkuc3RhcnRzd2l0aCgidGV4dC9odG1sIik6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgJ1NraXBwaW5nIHBhZ2UgJXMgYmVjYXVzZSBvZiBDb250ZW50LVR5cGU6ICVzJywKICAgICAgICAgICAgICAgICAgICBsaW5rLAogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgaW5zdCA9IGNscyhyZXNwLmNvbnRlbnQsIHJlc3AudXJsLCByZXNwLmhlYWRlcnMpCiAgICAgICAgZXhjZXB0IHJlcXVlc3RzLkhUVFBFcnJvciBhcyBleGM6CiAgICAgICAgICAgIGNscy5faGFuZGxlX2ZhaWwobGluaywgZXhjLCB1cmwpCiAgICAgICAgZXhjZXB0IFNTTEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmVhc29uID0gKCJUaGVyZSB3YXMgYSBwcm9ibGVtIGNvbmZpcm1pbmcgdGhlIHNzbCBjZXJ0aWZpY2F0ZTogIgogICAgICAgICAgICAgICAgICAgICAgIiVzIiAlIGV4YykKICAgICAgICAgICAgY2xzLl9oYW5kbGVfZmFpbChsaW5rLCByZWFzb24sIHVybCwgbWV0aD1sb2dnZXIuaW5mbykKICAgICAgICBleGNlcHQgcmVxdWVzdHMuQ29ubmVjdGlvbkVycm9yIGFzIGV4YzoKICAgICAgICAgICAgY2xzLl9oYW5kbGVfZmFpbChsaW5rLCAiY29ubmVjdGlvbiBlcnJvcjogJXMiICUgZXhjLCB1cmwpCiAgICAgICAgZXhjZXB0IHJlcXVlc3RzLlRpbWVvdXQ6CiAgICAgICAgICAgIGNscy5faGFuZGxlX2ZhaWwobGluaywgInRpbWVkIG91dCIsIHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gaW5zdAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfaGFuZGxlX2ZhaWwobGluaywgcmVhc29uLCB1cmwsIG1ldGg9Tm9uZSk6CiAgICAgICAgaWYgbWV0aCBpcyBOb25lOgogICAgICAgICAgICBtZXRoID0gbG9nZ2VyLmRlYnVnCgogICAgICAgIG1ldGgoIkNvdWxkIG5vdCBmZXRjaCBVUkwgJXM6ICVzIC0gc2tpcHBpbmciLCBsaW5rLCByZWFzb24pCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfY29udGVudF90eXBlKHVybCwgc2Vzc2lvbik6CiAgICAgICAgIiIiR2V0IHRoZSBDb250ZW50LVR5cGUgb2YgdGhlIGdpdmVuIHVybCwgdXNpbmcgYSBIRUFEIHJlcXVlc3QiIiIKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHVybCkKICAgICAgICBpZiBzY2hlbWUgbm90IGluICgnaHR0cCcsICdodHRwcycpOgogICAgICAgICAgICAjIEZJWE1FOiBzb21lIHdhcm5pbmcgb3Igc29tZXRoaW5nPwogICAgICAgICAgICAjIGFzc2VydGlvbiBlcnJvcj8KICAgICAgICAgICAgcmV0dXJuICcnCgogICAgICAgIHJlc3AgPSBzZXNzaW9uLmhlYWQodXJsLCBhbGxvd19yZWRpcmVjdHM9VHJ1ZSkKICAgICAgICByZXNwLnJhaXNlX2Zvcl9zdGF0dXMoKQoKICAgICAgICByZXR1cm4gcmVzcC5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIiwgIiIpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGJhc2VfdXJsKHNlbGYpOgogICAgICAgIGJhc2VzID0gWwogICAgICAgICAgICB4IGZvciB4IGluIHNlbGYucGFyc2VkLmZpbmRhbGwoIi4vL2Jhc2UiKQogICAgICAgICAgICBpZiB4LmdldCgiaHJlZiIpIGlzIG5vdCBOb25lCiAgICAgICAgXQogICAgICAgIGlmIGJhc2VzIGFuZCBiYXNlc1swXS5nZXQoImhyZWYiKToKICAgICAgICAgICAgcmV0dXJuIGJhc2VzWzBdLmdldCgiaHJlZiIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGlua3Moc2VsZik6CiAgICAgICAgIiIiWWllbGRzIGFsbCBsaW5rcyBpbiB0aGUgcGFnZSIiIgogICAgICAgIGZvciBhbmNob3IgaW4gc2VsZi5wYXJzZWQuZmluZGFsbCgiLi8vYSIpOgogICAgICAgICAgICBpZiBhbmNob3IuZ2V0KCJocmVmIik6CiAgICAgICAgICAgICAgICBocmVmID0gYW5jaG9yLmdldCgiaHJlZiIpCiAgICAgICAgICAgICAgICB1cmwgPSBzZWxmLmNsZWFuX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgdXJsbGliX3BhcnNlLnVybGpvaW4oc2VsZi5iYXNlX3VybCwgaHJlZikKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHB5cmVxdWlyZSA9IGFuY2hvci5nZXQoJ2RhdGEtcmVxdWlyZXMtcHl0aG9uJykKICAgICAgICAgICAgICAgIHB5cmVxdWlyZSA9IHVuZXNjYXBlKHB5cmVxdWlyZSkgaWYgcHlyZXF1aXJlIGVsc2UgTm9uZQogICAgICAgICAgICAgICAgeWllbGQgTGluayh1cmwsIHNlbGYsIHJlcXVpcmVzX3B5dGhvbj1weXJlcXVpcmUpCgogICAgX2NsZWFuX3JlID0gcmUuY29tcGlsZShyJ1teYS16MC05JCYrLC86Oz0/QC4jJV9cXHwtXScsIHJlLkkpCgogICAgZGVmIGNsZWFuX2xpbmsoc2VsZiwgdXJsKToKICAgICAgICAiIiJNYWtlcyBzdXJlIGEgbGluayBpcyBmdWxseSBlbmNvZGVkLiAgVGhhdCBpcywgaWYgYSAnICcgc2hvd3MgdXAgaW4KICAgICAgICB0aGUgbGluaywgaXQgd2lsbCBiZSByZXdyaXR0ZW4gdG8gJTIwICh3aGlsZSBub3Qgb3Zlci1xdW90aW5nCiAgICAgICAgJSBvciBvdGhlciBjaGFyYWN0ZXJzKS4iIiIKICAgICAgICByZXR1cm4gc2VsZi5fY2xlYW5fcmUuc3ViKAogICAgICAgICAgICBsYW1iZGEgbWF0Y2g6ICclJSUyeCcgJSBvcmQobWF0Y2guZ3JvdXAoMCkpLCB1cmwpCgoKY2xhc3MgTGluayhvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIGNvbWVzX2Zyb209Tm9uZSwgcmVxdWlyZXNfcHl0aG9uPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIE9iamVjdCByZXByZXNlbnRpbmcgYSBwYXJzZWQgbGluayBmcm9tIGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3NpbXBsZS8qCgogICAgICAgIHVybDoKICAgICAgICAgICAgdXJsIG9mIHRoZSByZXNvdXJjZSBwb2ludGVkIHRvIChocmVmIG9mIHRoZSBsaW5rKQogICAgICAgIGNvbWVzX2Zyb206CiAgICAgICAgICAgIGluc3RhbmNlIG9mIEhUTUxQYWdlIHdoZXJlIHRoZSBsaW5rIHdhcyBmb3VuZCwgb3Igc3RyaW5nLgogICAgICAgIHJlcXVpcmVzX3B5dGhvbjoKICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGBSZXF1aXJlcy1QeXRob25gIG1ldGFkYXRhIGZpZWxkLCBzcGVjaWZpZWQKICAgICAgICAgICAgaW4gUEVQIDM0NS4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkIGJ5IGEgZGF0YS1yZXF1aXJlcy1weXRob24KICAgICAgICAgICAgYXR0cmlidXRlIGluIHRoZSBIVE1MIGxpbmsgdGFnLCBhcyBkZXNjcmliZWQgaW4gUEVQIDUwMy4KICAgICAgICAiIiIKCiAgICAgICAgIyB1cmwgY2FuIGJlIGEgVU5DIHdpbmRvd3Mgc2hhcmUKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnXFxcXCcpOgogICAgICAgICAgICB1cmwgPSBwYXRoX3RvX3VybCh1cmwpCgogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgc2VsZi5jb21lc19mcm9tID0gY29tZXNfZnJvbQogICAgICAgIHNlbGYucmVxdWlyZXNfcHl0aG9uID0gcmVxdWlyZXNfcHl0aG9uIGlmIHJlcXVpcmVzX3B5dGhvbiBlbHNlIE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBpZiBzZWxmLnJlcXVpcmVzX3B5dGhvbjoKICAgICAgICAgICAgcnAgPSAnIChyZXF1aXJlcy1weXRob246JXMpJyAlIHNlbGYucmVxdWlyZXNfcHl0aG9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcnAgPSAnJwogICAgICAgIGlmIHNlbGYuY29tZXNfZnJvbToKICAgICAgICAgICAgcmV0dXJuICclcyAoZnJvbSAlcyklcycgJSAoc2VsZi51cmwsIHNlbGYuY29tZXNfZnJvbSwgcnApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLnVybCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8TGluayAlcz4nICUgc2VsZgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsID09IG90aGVyLnVybAoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsICE9IG90aGVyLnVybAoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsIDwgb3RoZXIudXJsCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgPD0gb3RoZXIudXJsCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgPiBvdGhlci51cmwKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTGluayk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLnVybCA+PSBvdGhlci51cmwKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi51cmwpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZmlsZW5hbWUoc2VsZik6CiAgICAgICAgXywgbmV0bG9jLCBwYXRoLCBfLCBfID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHNlbGYudXJsKQogICAgICAgIG5hbWUgPSBwb3NpeHBhdGguYmFzZW5hbWUocGF0aC5yc3RyaXAoJy8nKSkgb3IgbmV0bG9jCiAgICAgICAgbmFtZSA9IHVybGxpYl9wYXJzZS51bnF1b3RlKG5hbWUpCiAgICAgICAgYXNzZXJ0IG5hbWUsICgnVVJMICVyIHByb2R1Y2VkIG5vIGZpbGVuYW1lJyAlIHNlbGYudXJsKQogICAgICAgIHJldHVybiBuYW1lCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2NoZW1lKHNlbGYpOgogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudXJsc3BsaXQoc2VsZi51cmwpWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmV0bG9jKHNlbGYpOgogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudXJsc3BsaXQoc2VsZi51cmwpWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICByZXR1cm4gdXJsbGliX3BhcnNlLnVucXVvdGUodXJsbGliX3BhcnNlLnVybHNwbGl0KHNlbGYudXJsKVsyXSkKCiAgICBkZWYgc3BsaXRleHQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNwbGl0ZXh0KHBvc2l4cGF0aC5iYXNlbmFtZShzZWxmLnBhdGgucnN0cmlwKCcvJykpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4dChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5zcGxpdGV4dCgpWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXJsX3dpdGhvdXRfZnJhZ21lbnQoc2VsZik6CiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybGxpYl9wYXJzZS51cmxzcGxpdChzZWxmLnVybCkKICAgICAgICByZXR1cm4gdXJsbGliX3BhcnNlLnVybHVuc3BsaXQoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgTm9uZSkpCgogICAgX2VnZ19mcmFnbWVudF9yZSA9IHJlLmNvbXBpbGUocidbIyZdZWdnPShbXiZdKiknKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGVnZ19mcmFnbWVudChzZWxmKToKICAgICAgICBtYXRjaCA9IHNlbGYuX2VnZ19mcmFnbWVudF9yZS5zZWFyY2goc2VsZi51cmwpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgxKQoKICAgIF9zdWJkaXJlY3RvcnlfZnJhZ21lbnRfcmUgPSByZS5jb21waWxlKHInWyMmXXN1YmRpcmVjdG9yeT0oW14mXSopJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzdWJkaXJlY3RvcnlfZnJhZ21lbnQoc2VsZik6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9zdWJkaXJlY3RvcnlfZnJhZ21lbnRfcmUuc2VhcmNoKHNlbGYudXJsKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMSkKCiAgICBfaGFzaF9yZSA9IHJlLmNvbXBpbGUoCiAgICAgICAgcicoc2hhMXxzaGEyMjR8c2hhMzg0fHNoYTI1NnxzaGE1MTJ8bWQ1KT0oW2EtZjAtOV0rKScKICAgICkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNoKHNlbGYpOgogICAgICAgIG1hdGNoID0gc2VsZi5faGFzaF9yZS5zZWFyY2goc2VsZi51cmwpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgyKQogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzaF9uYW1lKHNlbGYpOgogICAgICAgIG1hdGNoID0gc2VsZi5faGFzaF9yZS5zZWFyY2goc2VsZi51cmwpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgxKQogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2hvd191cmwoc2VsZik6CiAgICAgICAgcmV0dXJuIHBvc2l4cGF0aC5iYXNlbmFtZShzZWxmLnVybC5zcGxpdCgnIycsIDEpWzBdLnNwbGl0KCc/JywgMSlbMF0pCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfd2hlZWwoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZXh0ID09IHdoZWVsX2V4dAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2FydGlmYWN0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZXMgaWYgdGhpcyBwb2ludHMgdG8gYW4gYWN0dWFsIGFydGlmYWN0IChlLmcuIGEgdGFyYmFsbCkgb3IgaWYKICAgICAgICBpdCBwb2ludHMgdG8gYW4gImFic3RyYWN0IiB0aGluZyBsaWtlIGEgcGF0aCBvciBhIFZDUyBsb2NhdGlvbi4KICAgICAgICAiIiIKICAgICAgICBmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcwoKICAgICAgICBpZiBzZWxmLnNjaGVtZSBpbiB2Y3MuYWxsX3NjaGVtZXM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKCkZvcm1hdENvbnRyb2wgPSBuYW1lZHR1cGxlKCdGb3JtYXRDb250cm9sJywgJ25vX2JpbmFyeSBvbmx5X2JpbmFyeScpCiIiIlRoaXMgb2JqZWN0IGhhcyB0d28gZmllbGRzLCBub19iaW5hcnkgYW5kIG9ubHlfYmluYXJ5LgoKSWYgYSBmaWVsZCBpcyBmYWxzeSwgaXQgaXNuJ3Qgc2V0LiBJZiBpdCBpcyB7JzphbGw6J30sIGl0IHNob3VsZCBtYXRjaCBhbGwKcGFja2FnZXMgZXhjZXB0IHRob3NlIGxpc3RlZCBpbiB0aGUgb3RoZXIgZmllbGQuIE9ubHkgb25lIGZpZWxkIGNhbiBiZSBzZXQKdG8geyc6YWxsOid9IGF0IGEgdGltZS4gVGhlIHJlc3Qgb2YgdGhlIHRpbWUgZXhhY3QgcGFja2FnZSBuYW1lIG1hdGNoZXMKYXJlIGxpc3RlZCwgd2l0aCBhbnkgZ2l2ZW4gcGFja2FnZSBvbmx5IHNob3dpbmcgdXAgaW4gb25lIGZpZWxkIGF0IGEgdGltZS4KIiIiCgoKZGVmIGZtdF9jdGxfaGFuZGxlX211dHVhbF9leGNsdWRlKHZhbHVlLCB0YXJnZXQsIG90aGVyKToKICAgIG5ldyA9IHZhbHVlLnNwbGl0KCcsJykKICAgIHdoaWxlICc6YWxsOicgaW4gbmV3OgogICAgICAgIG90aGVyLmNsZWFyKCkKICAgICAgICB0YXJnZXQuY2xlYXIoKQogICAgICAgIHRhcmdldC5hZGQoJzphbGw6JykKICAgICAgICBkZWwgbmV3WzpuZXcuaW5kZXgoJzphbGw6JykgKyAxXQogICAgICAgIGlmICc6bm9uZTonIG5vdCBpbiBuZXc6CiAgICAgICAgICAgICMgV2l0aG91dCBhIG5vbmUsIHdlIHdhbnQgdG8gZGlzY2FyZCBldmVyeXRoaW5nIGFzIDphbGw6IGNvdmVycyBpdAogICAgICAgICAgICByZXR1cm4KICAgIGZvciBuYW1lIGluIG5ldzoKICAgICAgICBpZiBuYW1lID09ICc6bm9uZTonOgogICAgICAgICAgICB0YXJnZXQuY2xlYXIoKQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIG5hbWUgPSBjYW5vbmljYWxpemVfbmFtZShuYW1lKQogICAgICAgIG90aGVyLmRpc2NhcmQobmFtZSkKICAgICAgICB0YXJnZXQuYWRkKG5hbWUpCgoKZGVmIGZtdF9jdGxfZm9ybWF0cyhmbXRfY3RsLCBjYW5vbmljYWxfbmFtZSk6CiAgICByZXN1bHQgPSBzZXQoWyJiaW5hcnkiLCAic291cmNlIl0pCiAgICBpZiBjYW5vbmljYWxfbmFtZSBpbiBmbXRfY3RsLm9ubHlfYmluYXJ5OgogICAgICAgIHJlc3VsdC5kaXNjYXJkKCdzb3VyY2UnKQogICAgZWxpZiBjYW5vbmljYWxfbmFtZSBpbiBmbXRfY3RsLm5vX2JpbmFyeToKICAgICAgICByZXN1bHQuZGlzY2FyZCgnYmluYXJ5JykKICAgIGVsaWYgJzphbGw6JyBpbiBmbXRfY3RsLm9ubHlfYmluYXJ5OgogICAgICAgIHJlc3VsdC5kaXNjYXJkKCdzb3VyY2UnKQogICAgZWxpZiAnOmFsbDonIGluIGZtdF9jdGwubm9fYmluYXJ5OgogICAgICAgIHJlc3VsdC5kaXNjYXJkKCdiaW5hcnknKQogICAgcmV0dXJuIGZyb3plbnNldChyZXN1bHQpCgoKZGVmIGZtdF9jdGxfbm9fYmluYXJ5KGZtdF9jdGwpOgogICAgZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUoCiAgICAgICAgJzphbGw6JywgZm10X2N0bC5ub19iaW5hcnksIGZtdF9jdGwub25seV9iaW5hcnkpCgoKZGVmIGZtdF9jdGxfbm9fdXNlX3doZWVsKGZtdF9jdGwpOgogICAgZm10X2N0bF9ub19iaW5hcnkoZm10X2N0bCkKICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgJy0tbm8tdXNlLXdoZWVsIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAnCiAgICAgICAgJyBQbGVhc2UgdXNlIC0tbm8tYmluYXJ5IDphbGw6IGluc3RlYWQuJywgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgIHN0YWNrbGV2ZWw9MikKCgpTZWFyY2ggPSBuYW1lZHR1cGxlKCdTZWFyY2gnLCAnc3VwcGxpZWQgY2Fub25pY2FsIGZvcm1hdHMnKQoiIiJDYXB0dXJlIGtleSBhc3BlY3RzIG9mIGEgc2VhcmNoLgoKOmF0dHJpYnV0ZSBzdXBwbGllZDogVGhlIHVzZXIgc3VwcGxpZWQgcGFja2FnZS4KOmF0dHJpYnV0ZSBjYW5vbmljYWw6IFRoZSBjYW5vbmljYWwgcGFja2FnZSBuYW1lLgo6YXR0cmlidXRlIGZvcm1hdHM6IFRoZSBmb3JtYXRzIGFsbG93ZWQgZm9yIHRoaXMgcGFja2FnZS4gU2hvdWxkIGJlIGEgc2V0CiAgICB3aXRoICdiaW5hcnknIG9yICdzb3VyY2UnIG9yIGJvdGggaW4gaXQuCiIiIgpQSwMEFAAAAAAAAAAhALcPd5n6FQAA+hUAAC0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9sb2NhdGlvbnMucHkiIiJMb2NhdGlvbnMgd2hlcmUgd2UgbG9vayBmb3IgY29uZmlncywgaW5zdGFsbCBzdHVmZiwgZXRjIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHNpdGUKaW1wb3J0IHN5cwoKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwpmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwsIFNDSEVNRV9LRVlTICAjIG5vcWEKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgV0lORE9XUywgZXhwYW5kdXNlcgpmcm9tIHBpcC51dGlscyBpbXBvcnQgYXBwZGlycwoKCiMgQXBwbGljYXRpb24gRGlyZWN0b3JpZXMKVVNFUl9DQUNIRV9ESVIgPSBhcHBkaXJzLnVzZXJfY2FjaGVfZGlyKCJwaXAiKQoKCkRFTEVURV9NQVJLRVJfTUVTU0FHRSA9ICcnJ1wKVGhpcyBmaWxlIGlzIHBsYWNlZCBoZXJlIGJ5IHBpcCB0byBpbmRpY2F0ZSB0aGUgc291cmNlIHdhcyBwdXQKaGVyZSBieSBwaXAuCgpPbmNlIHRoaXMgcGFja2FnZSBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIHRoaXMgc291cmNlIGNvZGUgd2lsbCBiZQpkZWxldGVkICh1bmxlc3MgeW91IHJlbW92ZSB0aGlzIGZpbGUpLgonJycKUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUUgPSAncGlwLWRlbGV0ZS10aGlzLWRpcmVjdG9yeS50eHQnCgoKZGVmIHdyaXRlX2RlbGV0ZV9tYXJrZXJfZmlsZShkaXJlY3RvcnkpOgogICAgIiIiCiAgICBXcml0ZSB0aGUgcGlwIGRlbGV0ZSBtYXJrZXIgZmlsZSBpbnRvIHRoaXMgZGlyZWN0b3J5LgogICAgIiIiCiAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FKQogICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAndycpIGFzIG1hcmtlcl9mcDoKICAgICAgICBtYXJrZXJfZnAud3JpdGUoREVMRVRFX01BUktFUl9NRVNTQUdFKQoKCmRlZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgd2UncmUgcnVubmluZyBpbnNpZGUgYSB2aXJ0dWFsZW52LCBGYWxzZSBvdGhlcndpc2UuCgogICAgIiIiCiAgICBpZiBoYXNhdHRyKHN5cywgJ3JlYWxfcHJlZml4Jyk6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIGVsaWYgc3lzLnByZWZpeCAhPSBnZXRhdHRyKHN5cywgImJhc2VfcHJlZml4Iiwgc3lzLnByZWZpeCk6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgdmlydHVhbGVudl9ub19nbG9iYWwoKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgaW4gYSB2ZW52IGFuZCBubyBzeXN0ZW0gc2l0ZSBwYWNrYWdlcy4KICAgICIiIgogICAgIyB0aGlzIG1pcnJvcnMgdGhlIGxvZ2ljIGluIHZpcnR1YWxlbnYucHkgZm9yIGxvY2F0aW5nIHRoZQogICAgIyBuby1nbG9iYWwtc2l0ZS1wYWNrYWdlcy50eHQgZmlsZQogICAgc2l0ZV9tb2RfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChzaXRlLl9fZmlsZV9fKSkKICAgIG5vX2dsb2JhbF9maWxlID0gb3MucGF0aC5qb2luKHNpdGVfbW9kX2RpciwgJ25vLWdsb2JhbC1zaXRlLXBhY2thZ2VzLnR4dCcpCiAgICBpZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKSBhbmQgb3MucGF0aC5pc2ZpbGUobm9fZ2xvYmFsX2ZpbGUpOgogICAgICAgIHJldHVybiBUcnVlCgoKaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICBzcmNfcHJlZml4ID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdzcmMnKQplbHNlOgogICAgIyBGSVhNRToga2VlcCBzcmMgaW4gY3dkIGZvciBub3cgKGl0IGlzIG5vdCBhIHRlbXBvcmFyeSBmb2xkZXIpCiAgICB0cnk6CiAgICAgICAgc3JjX3ByZWZpeCA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgJ3NyYycpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAjIEluIGNhc2UgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaGFzIGJlZW4gcmVuYW1lZCBvciBkZWxldGVkCiAgICAgICAgc3lzLmV4aXQoCiAgICAgICAgICAgICJUaGUgZm9sZGVyIHlvdSBhcmUgZXhlY3V0aW5nIHBpcCBmcm9tIGNhbiBubyBsb25nZXIgYmUgZm91bmQuIgogICAgICAgICkKCiMgdW5kZXIgbWFjT1MgKyB2aXJ0dWFsZW52IHN5cy5wcmVmaXggaXMgbm90IHByb3Blcmx5IHJlc29sdmVkCiMgaXQgaXMgc29tZXRoaW5nIGxpa2UgL3BhdGgvdG8vcHl0aG9uL2Jpbi8uLgojIE5vdGU6IHVzaW5nIHJlYWxwYXRoIGR1ZSB0byB0bXAgZGlycyBvbiBPU1ggYmVpbmcgc3ltbGlua3MKc3JjX3ByZWZpeCA9IG9zLnBhdGguYWJzcGF0aChzcmNfcHJlZml4KQoKIyBGSVhNRSBkb2Vzbid0IGFjY291bnQgZm9yIHZlbnYgbGlua2VkIHRvIGdsb2JhbCBzaXRlLXBhY2thZ2VzCgpzaXRlX3BhY2thZ2VzID0gc3lzY29uZmlnLmdldF9weXRob25fbGliKCkKdXNlcl9zaXRlID0gc2l0ZS5VU0VSX1NJVEUKdXNlcl9kaXIgPSBleHBhbmR1c2VyKCd+JykKaWYgV0lORE9XUzoKICAgIGJpbl9weSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnU2NyaXB0cycpCiAgICBiaW5fdXNlciA9IG9zLnBhdGguam9pbih1c2VyX3NpdGUsICdTY3JpcHRzJykKICAgICMgYnVpbGRvdXQgdXNlcyAnYmluJyBvbiBXaW5kb3dzIHRvbz8KICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhiaW5fcHkpOgogICAgICAgIGJpbl9weSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnYmluJykKICAgICAgICBiaW5fdXNlciA9IG9zLnBhdGguam9pbih1c2VyX3NpdGUsICdiaW4nKQoKICAgIGNvbmZpZ19iYXNlbmFtZSA9ICdwaXAuaW5pJwoKICAgIGxlZ2FjeV9zdG9yYWdlX2RpciA9IG9zLnBhdGguam9pbih1c2VyX2RpciwgJ3BpcCcpCiAgICBsZWdhY3lfY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgbGVnYWN5X3N0b3JhZ2VfZGlyLAogICAgICAgIGNvbmZpZ19iYXNlbmFtZSwKICAgICkKZWxzZToKICAgIGJpbl9weSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnYmluJykKICAgIGJpbl91c2VyID0gb3MucGF0aC5qb2luKHVzZXJfc2l0ZSwgJ2JpbicpCgogICAgY29uZmlnX2Jhc2VuYW1lID0gJ3BpcC5jb25mJwoKICAgIGxlZ2FjeV9zdG9yYWdlX2RpciA9IG9zLnBhdGguam9pbih1c2VyX2RpciwgJy5waXAnKQogICAgbGVnYWN5X2NvbmZpZ19maWxlID0gb3MucGF0aC5qb2luKAogICAgICAgIGxlZ2FjeV9zdG9yYWdlX2RpciwKICAgICAgICBjb25maWdfYmFzZW5hbWUsCiAgICApCgogICAgIyBGb3JjaW5nIHRvIHVzZSAvdXNyL2xvY2FsL2JpbiBmb3Igc3RhbmRhcmQgbWFjT1MgZnJhbWV3b3JrIGluc3RhbGxzCiAgICAjIEFsc28gbG9nIHRvIH4vTGlicmFyeS9Mb2dzLyBmb3IgdXNlIHdpdGggdGhlIENvbnNvbGUuYXBwIGxvZyB2aWV3ZXIKICAgIGlmIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2RhcndpbicgYW5kIHN5cy5wcmVmaXhbOjE2XSA9PSAnL1N5c3RlbS9MaWJyYXJ5Lyc6CiAgICAgICAgYmluX3B5ID0gJy91c3IvbG9jYWwvYmluJwoKc2l0ZV9jb25maWdfZmlsZXMgPSBbCiAgICBvcy5wYXRoLmpvaW4ocGF0aCwgY29uZmlnX2Jhc2VuYW1lKQogICAgZm9yIHBhdGggaW4gYXBwZGlycy5zaXRlX2NvbmZpZ19kaXJzKCdwaXAnKQpdCgoKZGVmIGRpc3R1dGlsc19zY2hlbWUoZGlzdF9uYW1lLCB1c2VyPUZhbHNlLCBob21lPU5vbmUsIHJvb3Q9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9RmFsc2UsIHByZWZpeD1Ob25lKToKICAgICIiIgogICAgUmV0dXJuIGEgZGlzdHV0aWxzIGluc3RhbGwgc2NoZW1lCiAgICAiIiIKICAgIGZyb20gZGlzdHV0aWxzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbgoKICAgIHNjaGVtZSA9IHt9CgogICAgaWYgaXNvbGF0ZWQ6CiAgICAgICAgZXh0cmFfZGlzdF9hcmdzID0geyJzY3JpcHRfYXJncyI6IFsiLS1uby11c2VyLWNmZyJdfQogICAgZWxzZToKICAgICAgICBleHRyYV9kaXN0X2FyZ3MgPSB7fQogICAgZGlzdF9hcmdzID0geyduYW1lJzogZGlzdF9uYW1lfQogICAgZGlzdF9hcmdzLnVwZGF0ZShleHRyYV9kaXN0X2FyZ3MpCgogICAgZCA9IERpc3RyaWJ1dGlvbihkaXN0X2FyZ3MpCiAgICBkLnBhcnNlX2NvbmZpZ19maWxlcygpCiAgICBpID0gZC5nZXRfY29tbWFuZF9vYmooJ2luc3RhbGwnLCBjcmVhdGU9VHJ1ZSkKICAgICMgTk9URTogc2V0dGluZyB1c2VyIG9yIGhvbWUgaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiBjcmVhdGluZyB0aGUgaG9tZSBkaXIKICAgICMgb3IgdXNlciBiYXNlIGZvciBpbnN0YWxsYXRpb25zIGR1cmluZyBmaW5hbGl6ZV9vcHRpb25zKCkKICAgICMgaWRlYWxseSwgd2UnZCBwcmVmZXIgYSBzY2hlbWUgY2xhc3MgdGhhdCBoYXMgbm8gc2lkZS1lZmZlY3RzLgogICAgYXNzZXJ0IG5vdCAodXNlciBhbmQgcHJlZml4KSwgInVzZXI9ezB9IHByZWZpeD17MX0iLmZvcm1hdCh1c2VyLCBwcmVmaXgpCiAgICBpLnVzZXIgPSB1c2VyIG9yIGkudXNlcgogICAgaWYgdXNlcjoKICAgICAgICBpLnByZWZpeCA9ICIiCiAgICBpLnByZWZpeCA9IHByZWZpeCBvciBpLnByZWZpeAogICAgaS5ob21lID0gaG9tZSBvciBpLmhvbWUKICAgIGkucm9vdCA9IHJvb3Qgb3IgaS5yb290CiAgICBpLmZpbmFsaXplX29wdGlvbnMoKQogICAgZm9yIGtleSBpbiBTQ0hFTUVfS0VZUzoKICAgICAgICBzY2hlbWVba2V5XSA9IGdldGF0dHIoaSwgJ2luc3RhbGxfJyArIGtleSkKCiAgICAjIGluc3RhbGxfbGliIHNwZWNpZmllZCBpbiBzZXR1cC5jZmcgc2hvdWxkIGluc3RhbGwgKmV2ZXJ5dGhpbmcqCiAgICAjIGludG8gdGhlcmUgKGkuZS4gaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGJvdGggcHVyZWxpYiBhbmQKICAgICMgcGxhdGxpYikuICBOb3RlLCBpLmluc3RhbGxfbGliIGlzICphbHdheXMqIHNldCBhZnRlcgogICAgIyBmaW5hbGl6ZV9vcHRpb25zKCk7IHdlIG9ubHkgd2FudCB0byBvdmVycmlkZSBoZXJlIGlmIHRoZSB1c2VyCiAgICAjIGhhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCBpdCBoZW5jZSBnb2luZyBiYWNrIHRvIHRoZSBjb25maWcKICAgIGlmICdpbnN0YWxsX2xpYicgaW4gZC5nZXRfb3B0aW9uX2RpY3QoJ2luc3RhbGwnKToKICAgICAgICBzY2hlbWUudXBkYXRlKGRpY3QocHVyZWxpYj1pLmluc3RhbGxfbGliLCBwbGF0bGliPWkuaW5zdGFsbF9saWIpKQoKICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgIHNjaGVtZVsnaGVhZGVycyddID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBzeXMucHJlZml4LAogICAgICAgICAgICAnaW5jbHVkZScsCiAgICAgICAgICAgICdzaXRlJywKICAgICAgICAgICAgJ3B5dGhvbicgKyBzeXMudmVyc2lvbls6M10sCiAgICAgICAgICAgIGRpc3RfbmFtZSwKICAgICAgICApCgogICAgICAgIGlmIHJvb3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhdGhfbm9fZHJpdmUgPSBvcy5wYXRoLnNwbGl0ZHJpdmUoCiAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoc2NoZW1lWyJoZWFkZXJzIl0pKVsxXQogICAgICAgICAgICBzY2hlbWVbImhlYWRlcnMiXSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHJvb3QsCiAgICAgICAgICAgICAgICBwYXRoX25vX2RyaXZlWzE6XSwKICAgICAgICAgICAgKQoKICAgIHJldHVybiBzY2hlbWUKUEsDBBQAAAAAAAAAIQCqGme8RwAAAEcAAAAzAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvbW9kZWxzL19faW5pdF9fLnB5ZnJvbSBwaXAubW9kZWxzLmluZGV4IGltcG9ydCBJbmRleCwgUHlQSQoKCl9fYWxsX18gPSBbIkluZGV4IiwgIlB5UEkiXQpQSwMEFAAAAAAAAAAhAGhOMm3nAQAA5wEAADAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9tb2RlbHMvaW5kZXgucHlmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQoKCmNsYXNzIEluZGV4KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsKToKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIHNlbGYubmV0bG9jID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHVybCkubmV0bG9jCiAgICAgICAgc2VsZi5zaW1wbGVfdXJsID0gc2VsZi51cmxfdG9fcGF0aCgnc2ltcGxlJykKICAgICAgICBzZWxmLnB5cGlfdXJsID0gc2VsZi51cmxfdG9fcGF0aCgncHlwaScpCiAgICAgICAgc2VsZi5waXBfanNvbl91cmwgPSBzZWxmLnVybF90b19wYXRoKCdweXBpL3BpcC9qc29uJykKCiAgICBkZWYgdXJsX3RvX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51cmxqb2luKHNlbGYudXJsLCBwYXRoKQoKClB5UEkgPSBJbmRleCgnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvJykKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvb3BlcmF0aW9ucy9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAz2ViqDYGAAA2BgAANAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL29wZXJhdGlvbnMvY2hlY2sucHkKCmRlZiBjaGVja19yZXF1aXJlbWVudHMoaW5zdGFsbGVkX2Rpc3RzKToKICAgIG1pc3NpbmdfcmVxc19kaWN0ID0ge30KICAgIGluY29tcGF0aWJsZV9yZXFzX2RpY3QgPSB7fQoKICAgIGZvciBkaXN0IGluIGluc3RhbGxlZF9kaXN0czoKICAgICAgICBrZXkgPSAnJXM9PSVzJyAlIChkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uKQoKICAgICAgICBtaXNzaW5nX3JlcXMgPSBsaXN0KGdldF9taXNzaW5nX3JlcXMoZGlzdCwgaW5zdGFsbGVkX2Rpc3RzKSkKICAgICAgICBpZiBtaXNzaW5nX3JlcXM6CiAgICAgICAgICAgIG1pc3NpbmdfcmVxc19kaWN0W2tleV0gPSBtaXNzaW5nX3JlcXMKCiAgICAgICAgaW5jb21wYXRpYmxlX3JlcXMgPSBsaXN0KGdldF9pbmNvbXBhdGlibGVfcmVxcygKICAgICAgICAgICAgZGlzdCwgaW5zdGFsbGVkX2Rpc3RzKSkKICAgICAgICBpZiBpbmNvbXBhdGlibGVfcmVxczoKICAgICAgICAgICAgaW5jb21wYXRpYmxlX3JlcXNfZGljdFtrZXldID0gaW5jb21wYXRpYmxlX3JlcXMKCiAgICByZXR1cm4gKG1pc3NpbmdfcmVxc19kaWN0LCBpbmNvbXBhdGlibGVfcmVxc19kaWN0KQoKCmRlZiBnZXRfbWlzc2luZ19yZXFzKGRpc3QsIGluc3RhbGxlZF9kaXN0cyk6CiAgICAiIiJSZXR1cm4gYWxsIG9mIHRoZSByZXF1aXJlbWVudHMgb2YgYGRpc3RgIHRoYXQgYXJlbid0IHByZXNlbnQgaW4KICAgIGBpbnN0YWxsZWRfZGlzdHNgLgoKICAgICIiIgogICAgaW5zdGFsbGVkX25hbWVzID0gc2V0KGQucHJvamVjdF9uYW1lLmxvd2VyKCkgZm9yIGQgaW4gaW5zdGFsbGVkX2Rpc3RzKQogICAgbWlzc2luZ19yZXF1aXJlbWVudHMgPSBzZXQoKQoKICAgIGZvciByZXF1aXJlbWVudCBpbiBkaXN0LnJlcXVpcmVzKCk6CiAgICAgICAgaWYgcmVxdWlyZW1lbnQucHJvamVjdF9uYW1lLmxvd2VyKCkgbm90IGluIGluc3RhbGxlZF9uYW1lczoKICAgICAgICAgICAgbWlzc2luZ19yZXF1aXJlbWVudHMuYWRkKHJlcXVpcmVtZW50KQogICAgICAgICAgICB5aWVsZCByZXF1aXJlbWVudAoKCmRlZiBnZXRfaW5jb21wYXRpYmxlX3JlcXMoZGlzdCwgaW5zdGFsbGVkX2Rpc3RzKToKICAgICIiIlJldHVybiBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cyBvZiBgZGlzdGAgdGhhdCBhcmUgcHJlc2VudCBpbgogICAgYGluc3RhbGxlZF9kaXN0c2AsIGJ1dCBoYXZlIGluY29tcGF0aWJsZSB2ZXJzaW9ucy4KCiAgICAiIiIKICAgIGluc3RhbGxlZF9kaXN0c19ieV9uYW1lID0ge30KICAgIGZvciBpbnN0YWxsZWRfZGlzdCBpbiBpbnN0YWxsZWRfZGlzdHM6CiAgICAgICAgaW5zdGFsbGVkX2Rpc3RzX2J5X25hbWVbaW5zdGFsbGVkX2Rpc3QucHJvamVjdF9uYW1lXSA9IGluc3RhbGxlZF9kaXN0CgogICAgZm9yIHJlcXVpcmVtZW50IGluIGRpc3QucmVxdWlyZXMoKToKICAgICAgICBwcmVzZW50X2Rpc3QgPSBpbnN0YWxsZWRfZGlzdHNfYnlfbmFtZS5nZXQocmVxdWlyZW1lbnQucHJvamVjdF9uYW1lKQoKICAgICAgICBpZiBwcmVzZW50X2Rpc3QgYW5kIHByZXNlbnRfZGlzdCBub3QgaW4gcmVxdWlyZW1lbnQ6CiAgICAgICAgICAgIHlpZWxkIChyZXF1aXJlbWVudCwgcHJlc2VudF9kaXN0KQpQSwMEFAAAAAAAAAAhAPkiMzNKFAAAShQAADUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9vcGVyYXRpb25zL2ZyZWV6ZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKCmltcG9ydCBwaXAKZnJvbSBwaXAucmVxIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQKZnJvbSBwaXAucmVxLnJlcV9maWxlIGltcG9ydCBDT01NRU5UX1JFCmZyb20gcGlwLnV0aWxzIGltcG9ydCBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy51dGlscyBpbXBvcnQgY2Fub25pY2FsaXplX25hbWUKZnJvbSBwaXAuX3ZlbmRvci5wa2dfcmVzb3VyY2VzIGltcG9ydCBSZXF1aXJlbWVudFBhcnNlRXJyb3IKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpkZWYgZnJlZXplKAogICAgICAgIHJlcXVpcmVtZW50PU5vbmUsCiAgICAgICAgZmluZF9saW5rcz1Ob25lLCBsb2NhbF9vbmx5PU5vbmUsIHVzZXJfb25seT1Ob25lLCBza2lwX3JlZ2V4PU5vbmUsCiAgICAgICAgZGVmYXVsdF92Y3M9Tm9uZSwKICAgICAgICBpc29sYXRlZD1GYWxzZSwKICAgICAgICB3aGVlbF9jYWNoZT1Ob25lLAogICAgICAgIHNraXA9KCkpOgogICAgZmluZF9saW5rcyA9IGZpbmRfbGlua3Mgb3IgW10KICAgIHNraXBfbWF0Y2ggPSBOb25lCgogICAgaWYgc2tpcF9yZWdleDoKICAgICAgICBza2lwX21hdGNoID0gcmUuY29tcGlsZShza2lwX3JlZ2V4KS5zZWFyY2gKCiAgICBkZXBlbmRlbmN5X2xpbmtzID0gW10KCiAgICBmb3IgZGlzdCBpbiBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0OgogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpOgogICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzLmV4dGVuZCgKICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpCiAgICAgICAgICAgICkKICAgIGZvciBsaW5rIGluIGZpbmRfbGlua3M6CiAgICAgICAgaWYgJyNlZ2c9JyBpbiBsaW5rOgogICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzLmFwcGVuZChsaW5rKQogICAgZm9yIGxpbmsgaW4gZmluZF9saW5rczoKICAgICAgICB5aWVsZCAnLWYgJXMnICUgbGluawogICAgaW5zdGFsbGF0aW9ucyA9IHt9CiAgICBmb3IgZGlzdCBpbiBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMobG9jYWxfb25seT1sb2NhbF9vbmx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9vbmx5PXVzZXJfb25seSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXEgPSBwaXAuRnJvemVuUmVxdWlyZW1lbnQuZnJvbV9kaXN0KAogICAgICAgICAgICAgICAgZGlzdCwKICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBSZXF1aXJlbWVudFBhcnNlRXJyb3I6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSByZXF1aXJlbWVudDogJXMiLAogICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUKICAgICAgICAgICAgKQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGluc3RhbGxhdGlvbnNbcmVxLm5hbWVdID0gcmVxCgogICAgaWYgcmVxdWlyZW1lbnQ6CiAgICAgICAgIyB0aGUgb3B0aW9ucyB0aGF0IGRvbid0IGdldCB0dXJuZWQgaW50byBhbiBJbnN0YWxsUmVxdWlyZW1lbnQKICAgICAgICAjIHNob3VsZCBvbmx5IGJlIGVtaXR0ZWQgb25jZSwgZXZlbiBpZiB0aGUgc2FtZSBvcHRpb24gaXMgaW4gbXVsdGlwbGUKICAgICAgICAjIHJlcXVpcmVtZW50cyBmaWxlcywgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQgaGFzIGJlZW4gZW1pdHRlZAogICAgICAgICMgc28gdGhhdCB3ZSBkb24ndCBlbWl0IGl0IGFnYWluIGlmIGl0J3Mgc2VlbiBhZ2FpbgogICAgICAgIGVtaXR0ZWRfb3B0aW9ucyA9IHNldCgpCiAgICAgICAgZm9yIHJlcV9maWxlX3BhdGggaW4gcmVxdWlyZW1lbnQ6CiAgICAgICAgICAgIHdpdGggb3BlbihyZXFfZmlsZV9wYXRoKSBhcyByZXFfZmlsZToKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHJlcV9maWxlOgogICAgICAgICAgICAgICAgICAgIGlmIChub3QgbGluZS5zdHJpcCgpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnN0cmlwKCkuc3RhcnRzd2l0aCgnIycpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2tpcF9tYXRjaCBhbmQgc2tpcF9tYXRjaChsaW5lKSkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3RhcnRzd2l0aCgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1yJywgJy0tcmVxdWlyZW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctWicsICctLWFsd2F5cy11bnppcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1mJywgJy0tZmluZC1saW5rcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1pJywgJy0taW5kZXgtdXJsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1wcmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXRydXN0ZWQtaG9zdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tcHJvY2Vzcy1kZXBlbmRlbmN5LWxpbmtzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1leHRyYS1pbmRleC11cmwnKSkpOgogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIG5vdCBpbiBlbWl0dGVkX29wdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVkX29wdGlvbnMuYWRkKGxpbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnLWUnKSBvciBsaW5lLnN0YXJ0c3dpdGgoJy0tZWRpdGFibGUnKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCctZScpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMjpdLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW2xlbignLS1lZGl0YWJsZScpOl0uc3RyaXAoKS5sc3RyaXAoJz0nKQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3JlcSA9IEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2VkaXRhYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfdmNzPWRlZmF1bHRfdmNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9aXNvbGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfcmVxID0gSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fbGluZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1FTlRfUkUuc3ViKCcnLCBsaW5lKS5zdHJpcCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9aXNvbGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZV9yZXEubmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgbGluZSBpbiByZXF1aXJlbWVudCBmaWxlIFslc10gYmVjYXVzZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXQncyBub3QgY2xlYXIgd2hhdCBpdCB3b3VsZCBpbnN0YWxsOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlsZV9wYXRoLCBsaW5lLnN0cmlwKCksCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAoYWRkICNlZ2c9UGFja2FnZU5hbWUgdG8gdGhlIFVSTCB0byBhdm9pZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhpcyB3YXJuaW5nKSIKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGVsaWYgbGluZV9yZXEubmFtZSBub3QgaW4gaW5zdGFsbGF0aW9uczoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWlyZW1lbnQgZmlsZSBbJXNdIGNvbnRhaW5zICVzLCBidXQgdGhhdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBpcyBub3QgaW5zdGFsbGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9maWxlX3BhdGgsIENPTU1FTlRfUkUuc3ViKCcnLCBsaW5lKS5zdHJpcCgpLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc3RyKGluc3RhbGxhdGlvbnNbbGluZV9yZXEubmFtZV0pLnJzdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBpbnN0YWxsYXRpb25zW2xpbmVfcmVxLm5hbWVdCgogICAgICAgIHlpZWxkKAogICAgICAgICAgICAnIyMgVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgd2VyZSBhZGRlZCBieSAnCiAgICAgICAgICAgICdwaXAgZnJlZXplOicKICAgICAgICApCiAgICBmb3IgaW5zdGFsbGF0aW9uIGluIHNvcnRlZCgKICAgICAgICAgICAgaW5zdGFsbGF0aW9ucy52YWx1ZXMoKSwga2V5PWxhbWJkYSB4OiB4Lm5hbWUubG93ZXIoKSk6CiAgICAgICAgaWYgY2Fub25pY2FsaXplX25hbWUoaW5zdGFsbGF0aW9uLm5hbWUpIG5vdCBpbiBza2lwOgogICAgICAgICAgICB5aWVsZCBzdHIoaW5zdGFsbGF0aW9uKS5yc3RyaXAoKQpQSwMEFAAAAAAAAAAhAPoohLXkKgAA5CoAAC4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9wZXA0MjV0YWdzLnB5IiIiR2VuZXJhdGUgYW5kIHdvcmsgd2l0aCBQRVAgNDI1IENvbXBhdGliaWxpdHkgVGFncy4iIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGxvZ2dpbmcKCnRyeToKICAgIGltcG9ydCBzeXNjb25maWcKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWEgbm9jb3ZlcgogICAgIyBQeXRob24gPCAyLjcKICAgIGltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnIGFzIHN5c2NvbmZpZwppbXBvcnQgZGlzdHV0aWxzLnV0aWwKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgT3JkZXJlZERpY3QKaW1wb3J0IHBpcC51dGlscy5nbGliYwoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpfb3N4X2FyY2hfcGF0ID0gcmUuY29tcGlsZShyJyguKylfKFxkKylfKFxkKylfKC4rKScpCgoKZGVmIGdldF9jb25maWdfdmFyKHZhcik6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcih2YXIpCiAgICBleGNlcHQgSU9FcnJvciBhcyBlOiAgIyBJc3N1ZSAjMTA3NAogICAgICAgIHdhcm5pbmdzLndhcm4oInswfSIuZm9ybWF0KGUpLCBSdW50aW1lV2FybmluZykKICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBnZXRfYWJicl9pbXBsKCk6CiAgICAiIiJSZXR1cm4gYWJicmV2aWF0ZWQgaW1wbGVtZW50YXRpb24gbmFtZS4iIiIKICAgIGlmIGhhc2F0dHIoc3lzLCAncHlweV92ZXJzaW9uX2luZm8nKToKICAgICAgICBweWltcGwgPSAncHAnCiAgICBlbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICAgICAgcHlpbXBsID0gJ2p5JwogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2NsaSc6CiAgICAgICAgcHlpbXBsID0gJ2lwJwogICAgZWxzZToKICAgICAgICBweWltcGwgPSAnY3AnCiAgICByZXR1cm4gcHlpbXBsCgoKZGVmIGdldF9pbXBsX3ZlcigpOgogICAgIiIiUmV0dXJuIGltcGxlbWVudGF0aW9uIHZlcnNpb24uIiIiCiAgICBpbXBsX3ZlciA9IGdldF9jb25maWdfdmFyKCJweV92ZXJzaW9uX25vZG90IikKICAgIGlmIG5vdCBpbXBsX3ZlciBvciBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICBpbXBsX3ZlciA9ICcnLmpvaW4obWFwKHN0ciwgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkpKQogICAgcmV0dXJuIGltcGxfdmVyCgoKZGVmIGdldF9pbXBsX3ZlcnNpb25faW5mbygpOgogICAgIiIiUmV0dXJuIHN5cy52ZXJzaW9uX2luZm8tbGlrZSB0dXBsZSBmb3IgdXNlIGluIGRlY3JlbWVudGluZyB0aGUgbWlub3IKICAgIHZlcnNpb24uIiIiCiAgICBpZiBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICAjIGFzIHBlciBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzI4ODIKICAgICAgICByZXR1cm4gKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy5weXB5X3ZlcnNpb25faW5mby5tYWpvciwKICAgICAgICAgICAgICAgIHN5cy5weXB5X3ZlcnNpb25faW5mby5taW5vcikKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0KCgpkZWYgZ2V0X2ltcGxfdGFnKCk6CiAgICAiIiIKICAgIFJldHVybnMgdGhlIFRhZyBmb3IgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KICAgICIiIgogICAgcmV0dXJuICJ7MH17MX0iLmZvcm1hdChnZXRfYWJicl9pbXBsKCksIGdldF9pbXBsX3ZlcigpKQoKCmRlZiBnZXRfZmxhZyh2YXIsIGZhbGxiYWNrLCBleHBlY3RlZD1UcnVlLCB3YXJuPVRydWUpOgogICAgIiIiVXNlIGEgZmFsbGJhY2sgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBTT0FCSSBmbGFncyBpZiB0aGUgbmVlZGVkIGNvbmZpZwogICAgdmFyIGlzIHVuc2V0IG9yIHVuYXZhaWxhYmxlLiIiIgogICAgdmFsID0gZ2V0X2NvbmZpZ192YXIodmFyKQogICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgaWYgd2FybjoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJDb25maWcgdmFyaWFibGUgJyVzJyBpcyB1bnNldCwgUHl0aG9uIEFCSSB0YWcgbWF5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBpbmNvcnJlY3QiLCB2YXIpCiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkKICAgIHJldHVybiB2YWwgPT0gZXhwZWN0ZWQKCgpkZWYgZ2V0X2FiaV90YWcoKToKICAgICIiIlJldHVybiB0aGUgQUJJIHRhZyBiYXNlZCBvbiBTT0FCSSAoaWYgYXZhaWxhYmxlKSBvciBlbXVsYXRlIFNPQUJJCiAgICAoQ1B5dGhvbiAyLCBQeVB5KS4iIiIKICAgIHNvYWJpID0gZ2V0X2NvbmZpZ192YXIoJ1NPQUJJJykKICAgIGltcGwgPSBnZXRfYWJicl9pbXBsKCkKICAgIGlmIG5vdCBzb2FiaSBhbmQgaW1wbCBpbiAoJ2NwJywgJ3BwJykgYW5kIGhhc2F0dHIoc3lzLCAnbWF4dW5pY29kZScpOgogICAgICAgIGQgPSAnJwogICAgICAgIG0gPSAnJwogICAgICAgIHUgPSAnJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9ERUJVRycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKSwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgZCA9ICdkJwogICAgICAgIGlmIGdldF9mbGFnKCdXSVRIX1BZTUFMTE9DJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGltcGwgPT0gJ2NwJywKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgbSA9ICdtJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9VTklDT0RFX1NJWkUnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc3lzLm1heHVuaWNvZGUgPT0gMHgxMGZmZmYsCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9NCwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKSkpIFwKICAgICAgICAgICAgICAgIGFuZCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpOgogICAgICAgICAgICB1ID0gJ3UnCiAgICAgICAgYWJpID0gJyVzJXMlcyVzJXMnICUgKGltcGwsIGdldF9pbXBsX3ZlcigpLCBkLCBtLCB1KQogICAgZWxpZiBzb2FiaSBhbmQgc29hYmkuc3RhcnRzd2l0aCgnY3B5dGhvbi0nKToKICAgICAgICBhYmkgPSAnY3AnICsgc29hYmkuc3BsaXQoJy0nKVsxXQogICAgZWxpZiBzb2FiaToKICAgICAgICBhYmkgPSBzb2FiaS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgZWxzZToKICAgICAgICBhYmkgPSBOb25lCiAgICByZXR1cm4gYWJpCgoKZGVmIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICByZXR1cm4gc3lzLm1heHNpemUgPT0gMjE0NzQ4MzY0NwoKCmRlZiBnZXRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiBvdXIgcGxhdGZvcm0gbmFtZSAnd2luMzInLCAnbGludXhfeDg2XzY0JyIiIgogICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICMgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgcmV0dXJucyB0aGUgcmVsZWFzZSBiYXNlZCBvbiB0aGUgdmFsdWUKICAgICAgICAjIG9mIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBvbiB3aGljaCBQeXRob24gd2FzIGJ1aWx0LCB3aGljaCBtYXkKICAgICAgICAjIGJlIHNpZ25pZmljYW50bHkgb2xkZXIgdGhhbiB0aGUgdXNlcidzIGN1cnJlbnQgbWFjaGluZS4KICAgICAgICByZWxlYXNlLCBfLCBtYWNoaW5lID0gcGxhdGZvcm0ubWFjX3ZlcigpCiAgICAgICAgc3BsaXRfdmVyID0gcmVsZWFzZS5zcGxpdCgnLicpCgogICAgICAgIGlmIG1hY2hpbmUgPT0gIng4Nl82NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgICAgIG1hY2hpbmUgPSAiaTM4NiIKICAgICAgICBlbGlmIG1hY2hpbmUgPT0gInBwYzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAgICAgbWFjaGluZSA9ICJwcGMiCgogICAgICAgIHJldHVybiAnbWFjb3N4X3swfV97MX1fezJ9Jy5mb3JtYXQoc3BsaXRfdmVyWzBdLCBzcGxpdF92ZXJbMV0sIG1hY2hpbmUpCgogICAgIyBYWFggcmVtb3ZlIGRpc3R1dGlscyBkZXBlbmRlbmN5CiAgICByZXN1bHQgPSBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgaWYgcmVzdWx0ID09ICJsaW51eF94ODZfNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICMgMzIgYml0IFB5dGhvbiBwcm9ncmFtIChydW5uaW5nIG9uIGEgNjQgYml0IExpbnV4KTogcGlwIHNob3VsZCBvbmx5CiAgICAgICAgIyBpbnN0YWxsIGFuZCBydW4gMzIgYml0IGNvbXBpbGVkIGV4dGVuc2lvbnMgaW4gdGhhdCBjYXNlLgogICAgICAgIHJlc3VsdCA9ICJsaW51eF9pNjg2IgoKICAgIHJldHVybiByZXN1bHQKCgpkZWYgaXNfbWFueWxpbnV4MV9jb21wYXRpYmxlKCk6CiAgICAjIE9ubHkgTGludXgsIGFuZCBvbmx5IHg4Ni02NCAvIGk2ODYKICAgIGlmIGdldF9wbGF0Zm9ybSgpIG5vdCBpbiAoImxpbnV4X3g4Nl82NCIsICJsaW51eF9pNjg2Iik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgX21hbnlsaW51eCBtb2R1bGUKICAgIHRyeToKICAgICAgICBpbXBvcnQgX21hbnlsaW51eAogICAgICAgIHJldHVybiBib29sKF9tYW55bGludXgubWFueWxpbnV4MV9jb21wYXRpYmxlKQogICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgICMgRmFsbCB0aHJvdWdoIHRvIGhldXJpc3RpYyBjaGVjayBiZWxvdwogICAgICAgIHBhc3MKCiAgICAjIENoZWNrIGdsaWJjIHZlcnNpb24uIENlbnRPUyA1IHVzZXMgZ2xpYmMgMi41LgogICAgcmV0dXJuIHBpcC51dGlscy5nbGliYy5oYXZlX2NvbXBhdGlibGVfZ2xpYmMoMiwgNSkKCgpkZWYgZ2V0X2Rhcndpbl9hcmNoZXMobWFqb3IsIG1pbm9yLCBtYWNoaW5lKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGFyY2hlcyAoaW5jbHVkaW5nIGdyb3VwIGFyY2hlcykgZm9yCiAgICB0aGUgZ2l2ZW4gbWFqb3IsIG1pbm9yIGFuZCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBvZiBhbiBtYWNPUyBtYWNoaW5lLgogICAgIiIiCiAgICBhcmNoZXMgPSBbXQoKICAgIGRlZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGFyY2gpOgogICAgICAgICMgTG9va2luZyBhdCB0aGUgYXBwbGljYXRpb24gc3VwcG9ydCBmb3IgbWFjT1MgdmVyc2lvbnMgaW4gdGhlIGNoYXJ0CiAgICAgICAgIyBwcm92aWRlZCBieSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PU19YI1ZlcnNpb25zIGl0IGFwcGVhcnMKICAgICAgICAjIG91ciB0aW1lbGluZSBsb29rcyByb3VnaGx5IGxpa2U6CiAgICAgICAgIwogICAgICAgICMgMTAuMCAtIEludHJvZHVjZXMgcHBjIHN1cHBvcnQuCiAgICAgICAgIyAxMC40IC0gSW50cm9kdWNlcyBwcGM2NCwgaTM4NiwgYW5kIHg4Nl82NCBzdXBwb3J0LCBob3dldmVyIHRoZSBwcGM2NAogICAgICAgICMgICAgICAgIGFuZCB4ODZfNjQgc3VwcG9ydCBpcyBDTEkgb25seSwgYW5kIGNhbm5vdCBiZSB1c2VkIGZvciBHVUkKICAgICAgICAjICAgICAgICBhcHBsaWNhdGlvbnMuCiAgICAgICAgIyAxMC41IC0gRXh0ZW5kcyBwcGM2NCBhbmQgeDg2XzY0IHN1cHBvcnQgdG8gY292ZXIgR1VJIGFwcGxpY2F0aW9ucy4KICAgICAgICAjIDEwLjYgLSBEcm9wcyBzdXBwb3J0IGZvciBwcGM2NAogICAgICAgICMgMTAuNyAtIERyb3BzIHN1cHBvcnQgZm9yIHBwYwogICAgICAgICMKICAgICAgICAjIEdpdmVuIHRoYXQgd2UgZG8gbm90IGtub3cgaWYgd2UncmUgaW5zdGFsbGluZyBhIENMSSBvciBhIEdVSQogICAgICAgICMgYXBwbGljYXRpb24sIHdlIG11c3QgYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgaXQgbWlnaHQgYmUgYSBHVUkKICAgICAgICAjIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgcHBjNjQgYW5kIHg4Nl82NCBzdXBwb3J0IGRpZCBub3Qgb2NjdXIKICAgICAgICAjIHVudGlsIDEwLjUuCiAgICAgICAgIwogICAgICAgICMgTm90ZTogVGhlIGFib3ZlIGluZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlICJBcHBsaWNhdGlvbiBzdXBwb3J0IgogICAgICAgICMgICAgICAgY29sdW1uIGluIHRoZSBjaGFydCBub3QgdGhlICJQcm9jZXNzb3Igc3VwcG9ydCIgc2luY2UgSSBiZWxpZXZlCiAgICAgICAgIyAgICAgICB0aGF0IHdlIGNhcmUgYWJvdXQgd2hhdCBpbnN0cnVjdGlvbiBzZXRzIGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UKICAgICAgICAjICAgICAgIG5vdCB3aGljaCBwcm9jZXNzb3JzIHRoZSBPUyBzdXBwb3J0cy4KICAgICAgICBpZiBhcmNoID09ICdwcGMnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPD0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggPT0gJ3BwYzY0JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID09ICgxMCwgNSkKICAgICAgICBpZiBhcmNoID09ICdpMzg2JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgxMCwgNCkKICAgICAgICBpZiBhcmNoID09ICd4ODZfNjQnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPj0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggaW4gZ3JvdXBzOgogICAgICAgICAgICBmb3IgZ2FyY2ggaW4gZ3JvdXBzW2FyY2hdOgogICAgICAgICAgICAgICAgaWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBnYXJjaCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBncm91cHMgPSBPcmRlcmVkRGljdChbCiAgICAgICAgKCJmYXQiLCAoImkzODYiLCAicHBjIikpLAogICAgICAgICgiaW50ZWwiLCAoIng4Nl82NCIsICJpMzg2IikpLAogICAgICAgICgiZmF0NjQiLCAoIng4Nl82NCIsICJwcGM2NCIpKSwKICAgICAgICAoImZhdDMyIiwgKCJ4ODZfNjQiLCAiaTM4NiIsICJwcGMiKSksCiAgICBdKQoKICAgIGlmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgbWFjaGluZSk6CiAgICAgICAgYXJjaGVzLmFwcGVuZChtYWNoaW5lKQoKICAgIGZvciBnYXJjaCBpbiBncm91cHM6CiAgICAgICAgaWYgbWFjaGluZSBpbiBncm91cHNbZ2FyY2hdIGFuZCBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGdhcmNoKToKICAgICAgICAgICAgYXJjaGVzLmFwcGVuZChnYXJjaCkKCiAgICBhcmNoZXMuYXBwZW5kKCd1bml2ZXJzYWwnKQoKICAgIHJldHVybiBhcmNoZXMKCgpkZWYgZ2V0X3N1cHBvcnRlZCh2ZXJzaW9ucz1Ob25lLCBub2FyY2g9RmFsc2UsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgICAgICAgIGltcGw9Tm9uZSwgYWJpPU5vbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdGFncyBmb3IgZWFjaCB2ZXJzaW9uIHNwZWNpZmllZCBpbgogICAgYHZlcnNpb25zYC4KCiAgICA6cGFyYW0gdmVyc2lvbnM6IGEgbGlzdCBvZiBzdHJpbmcgdmVyc2lvbnMsIG9mIHRoZSBmb3JtIFsiMzMiLCAiMzIiXSwKICAgICAgICBvciBOb25lLiBUaGUgZmlyc3QgdmVyc2lvbiB3aWxsIGJlIGFzc3VtZWQgdG8gc3VwcG9ydCBvdXIgQUJJLgogICAgOnBhcmFtIHBsYXRmb3JtOiBzcGVjaWZ5IHRoZSBleGFjdCBwbGF0Zm9ybSB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIHN5c3RlbSBwbGF0Zm9ybS4KICAgIDpwYXJhbSBpbXBsOiBzcGVjaWZ5IHRoZSBleGFjdCBpbXBsZW1lbnRhdGlvbiB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIGludGVycHJldGVyIGltcGwuCiAgICA6cGFyYW0gYWJpOiBzcGVjaWZ5IHRoZSBleGFjdCBhYmkgeW91IHdhbnQgdmFsaWQKICAgICAgICB0YWdzIGZvciwgb3IgTm9uZS4gSWYgTm9uZSwgdXNlIHRoZSBsb2NhbCBpbnRlcnByZXRlciBhYmkuCiAgICAiIiIKICAgIHN1cHBvcnRlZCA9IFtdCgogICAgIyBWZXJzaW9ucyBtdXN0IGJlIGdpdmVuIHdpdGggcmVzcGVjdCB0byB0aGUgcHJlZmVyZW5jZQogICAgaWYgdmVyc2lvbnMgaXMgTm9uZToKICAgICAgICB2ZXJzaW9ucyA9IFtdCiAgICAgICAgdmVyc2lvbl9pbmZvID0gZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkKICAgICAgICBtYWpvciA9IHZlcnNpb25faW5mb1s6LTFdCiAgICAgICAgIyBTdXBwb3J0IGFsbCBwcmV2aW91cyBtaW5vciBQeXRob24gdmVyc2lvbnMuCiAgICAgICAgZm9yIG1pbm9yIGluIHJhbmdlKHZlcnNpb25faW5mb1stMV0sIC0xLCAtMSk6CiAgICAgICAgICAgIHZlcnNpb25zLmFwcGVuZCgnJy5qb2luKG1hcChzdHIsIG1ham9yICsgKG1pbm9yLCkpKSkKCiAgICBpbXBsID0gaW1wbCBvciBnZXRfYWJicl9pbXBsKCkKCiAgICBhYmlzID0gW10KCiAgICBhYmkgPSBhYmkgb3IgZ2V0X2FiaV90YWcoKQogICAgaWYgYWJpOgogICAgICAgIGFiaXNbMDowXSA9IFthYmldCgogICAgYWJpM3MgPSBzZXQoKQogICAgaW1wb3J0IGltcAogICAgZm9yIHN1ZmZpeCBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCk6CiAgICAgICAgaWYgc3VmZml4WzBdLnN0YXJ0c3dpdGgoJy5hYmknKToKICAgICAgICAgICAgYWJpM3MuYWRkKHN1ZmZpeFswXS5zcGxpdCgnLicsIDIpWzFdKQoKICAgIGFiaXMuZXh0ZW5kKHNvcnRlZChsaXN0KGFiaTNzKSkpCgogICAgYWJpcy5hcHBlbmQoJ25vbmUnKQoKICAgIGlmIG5vdCBub2FyY2g6CiAgICAgICAgYXJjaCA9IHBsYXRmb3JtIG9yIGdldF9wbGF0Zm9ybSgpCiAgICAgICAgaWYgYXJjaC5zdGFydHN3aXRoKCdtYWNvc3gnKToKICAgICAgICAgICAgIyBzdXBwb3J0IG1hY29zeC0xMC42LWludGVsIG9uIG1hY29zeC0xMC45LXg4Nl82NAogICAgICAgICAgICBtYXRjaCA9IF9vc3hfYXJjaF9wYXQubWF0Y2goYXJjaCkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBuYW1lLCBtYWpvciwgbWlub3IsIGFjdHVhbF9hcmNoID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgICAgIHRwbCA9ICd7MH1fezF9XyVpXyVzJy5mb3JtYXQobmFtZSwgbWFqb3IpCiAgICAgICAgICAgICAgICBhcmNoZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIG0gaW4gcmV2ZXJzZWQocmFuZ2UoaW50KG1pbm9yKSArIDEpKToKICAgICAgICAgICAgICAgICAgICBmb3IgYSBpbiBnZXRfZGFyd2luX2FyY2hlcyhpbnQobWFqb3IpLCBtLCBhY3R1YWxfYXJjaCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hlcy5hcHBlbmQodHBsICUgKG0sIGEpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBhcmNoIHBhdHRlcm4gZGlkbid0IG1hdGNoICg/ISkKICAgICAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoXQogICAgICAgIGVsaWYgcGxhdGZvcm0gaXMgTm9uZSBhbmQgaXNfbWFueWxpbnV4MV9jb21wYXRpYmxlKCk6CiAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoLnJlcGxhY2UoJ2xpbnV4JywgJ21hbnlsaW51eDEnKSwgYXJjaF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoZXMgPSBbYXJjaF0KCiAgICAgICAgIyBDdXJyZW50IHZlcnNpb24sIGN1cnJlbnQgQVBJIChidWlsdCBzcGVjaWZpY2FsbHkgZm9yIG91ciBQeXRob24pOgogICAgICAgIGZvciBhYmkgaW4gYWJpczoKICAgICAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdKSwgYWJpLCBhcmNoKSkKCiAgICAgICAgIyBhYmkzIG1vZHVsZXMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgUHl0aG9uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gdmVyc2lvbnNbMTpdOgogICAgICAgICAgICAjIGFiaTMgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuMgogICAgICAgICAgICBpZiB2ZXJzaW9uIGluICgnMzEnLCAnMzAnKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGZvciBhYmkgaW4gYWJpM3M6ICAgIyBlbXB0eSBzZXQgaWYgbm90IFB5dGhvbiAzCiAgICAgICAgICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoIiVzJXMiICUgKGltcGwsIHZlcnNpb24pLCBhYmksIGFyY2gpKQoKICAgICAgICAjIEhhcyBiaW5hcmllcywgZG9lcyBub3QgdXNlIHRoZSBQeXRob24gQVBJOgogICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCBhcmNoKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGJ1dCByZXF1aXJlcyBvdXIgaW1wbGVtZW50YXRpb246CiAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF0pLCAnbm9uZScsICdhbnknKSkKICAgICMgVGFnZ2VkIHNwZWNpZmljYWxseSBhcyBiZWluZyBjcm9zcy12ZXJzaW9uIGNvbXBhdGlibGUKICAgICMgKHdpdGgganVzdCB0aGUgbWFqb3IgdmVyc2lvbiBzcGVjaWZpZWQpCiAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsICdhbnknKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGdlbmVyaWMgUHl0aG9uCiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uLCksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25bMF0pLCAnbm9uZScsICdhbnknKSkKCiAgICByZXR1cm4gc3VwcG9ydGVkCgpzdXBwb3J0ZWRfdGFncyA9IGdldF9zdXBwb3J0ZWQoKQpzdXBwb3J0ZWRfdGFnc19ub2FyY2ggPSBnZXRfc3VwcG9ydGVkKG5vYXJjaD1UcnVlKQoKaW1wbGVtZW50YXRpb25fdGFnID0gZ2V0X2ltcGxfdGFnKCkKUEsDBBQAAAAAAAAAIQBcadIZFAEAABQBAAAwAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvcmVxL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gLnJlcV9pbnN0YWxsIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQKZnJvbSAucmVxX3NldCBpbXBvcnQgUmVxdWlyZW1lbnRTZXQsIFJlcXVpcmVtZW50cwpmcm9tIC5yZXFfZmlsZSBpbXBvcnQgcGFyc2VfcmVxdWlyZW1lbnRzCgpfX2FsbF9fID0gWwogICAgIlJlcXVpcmVtZW50U2V0IiwgIlJlcXVpcmVtZW50cyIsICJJbnN0YWxsUmVxdWlyZW1lbnQiLAogICAgInBhcnNlX3JlcXVpcmVtZW50cyIsCl0KUEsDBBQAAAAAAAAAIQAc4IwKli4AAJYuAAAwAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV9maWxlLnB5IiIiClJlcXVpcmVtZW50cyBmaWxlIHBhcnNpbmcKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc2hsZXgKaW1wb3J0IHN5cwppbXBvcnQgb3B0cGFyc2UKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgZmlsdGVyZmFsc2UKCmltcG9ydCBwaXAKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IGdldF9maWxlX2NvbnRlbnQKZnJvbSBwaXAucmVxLnJlcV9pbnN0YWxsIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKFJlcXVpcmVtZW50c0ZpbGVQYXJzZUVycm9yKQpmcm9tIHBpcC51dGlscy5kZXByZWNhdGlvbiBpbXBvcnQgUmVtb3ZlZEluUGlwMTBXYXJuaW5nCmZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zCgpfX2FsbF9fID0gWydwYXJzZV9yZXF1aXJlbWVudHMnXQoKU0NIRU1FX1JFID0gcmUuY29tcGlsZShyJ14oaHR0cHxodHRwc3xmaWxlKTonLCByZS5JKQpDT01NRU5UX1JFID0gcmUuY29tcGlsZShyJyhefFxzKSsjLiokJykKClNVUFBPUlRFRF9PUFRJT05TID0gWwogICAgY21kb3B0aW9ucy5jb25zdHJhaW50cywKICAgIGNtZG9wdGlvbnMuZWRpdGFibGUsCiAgICBjbWRvcHRpb25zLnJlcXVpcmVtZW50cywKICAgIGNtZG9wdGlvbnMubm9faW5kZXgsCiAgICBjbWRvcHRpb25zLmluZGV4X3VybCwKICAgIGNtZG9wdGlvbnMuZmluZF9saW5rcywKICAgIGNtZG9wdGlvbnMuZXh0cmFfaW5kZXhfdXJsLAogICAgY21kb3B0aW9ucy5hbGxvd19leHRlcm5hbCwKICAgIGNtZG9wdGlvbnMuYWxsb3dfYWxsX2V4dGVybmFsLAogICAgY21kb3B0aW9ucy5ub19hbGxvd19leHRlcm5hbCwKICAgIGNtZG9wdGlvbnMuYWxsb3dfdW5zYWZlLAogICAgY21kb3B0aW9ucy5ub19hbGxvd191bnNhZmUsCiAgICBjbWRvcHRpb25zLnVzZV93aGVlbCwKICAgIGNtZG9wdGlvbnMubm9fdXNlX3doZWVsLAogICAgY21kb3B0aW9ucy5hbHdheXNfdW56aXAsCiAgICBjbWRvcHRpb25zLm5vX2JpbmFyeSwKICAgIGNtZG9wdGlvbnMub25seV9iaW5hcnksCiAgICBjbWRvcHRpb25zLnByZSwKICAgIGNtZG9wdGlvbnMucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzLAogICAgY21kb3B0aW9ucy50cnVzdGVkX2hvc3QsCiAgICBjbWRvcHRpb25zLnJlcXVpcmVfaGFzaGVzLApdCgojIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHJlcXVpcmVtZW50cwpTVVBQT1JURURfT1BUSU9OU19SRVEgPSBbCiAgICBjbWRvcHRpb25zLmluc3RhbGxfb3B0aW9ucywKICAgIGNtZG9wdGlvbnMuZ2xvYmFsX29wdGlvbnMsCiAgICBjbWRvcHRpb25zLmhhc2gsCl0KCiMgdGhlICdkZXN0JyBzdHJpbmcgdmFsdWVzClNVUFBPUlRFRF9PUFRJT05TX1JFUV9ERVNUID0gW28oKS5kZXN0IGZvciBvIGluIFNVUFBPUlRFRF9PUFRJT05TX1JFUV0KCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnRzKGZpbGVuYW1lLCBmaW5kZXI9Tm9uZSwgY29tZXNfZnJvbT1Ob25lLCBvcHRpb25zPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1Ob25lLCBjb25zdHJhaW50PUZhbHNlLCB3aGVlbF9jYWNoZT1Ob25lKToKICAgICIiIlBhcnNlIGEgcmVxdWlyZW1lbnRzIGZpbGUgYW5kIHlpZWxkIEluc3RhbGxSZXF1aXJlbWVudCBpbnN0YW5jZXMuCgogICAgOnBhcmFtIGZpbGVuYW1lOiAgICBQYXRoIG9yIHVybCBvZiByZXF1aXJlbWVudHMgZmlsZS4KICAgIDpwYXJhbSBmaW5kZXI6ICAgICAgSW5zdGFuY2Ugb2YgcGlwLmluZGV4LlBhY2thZ2VGaW5kZXIuCiAgICA6cGFyYW0gY29tZXNfZnJvbTogIE9yaWdpbiBkZXNjcmlwdGlvbiBvZiByZXF1aXJlbWVudHMuCiAgICA6cGFyYW0gb3B0aW9uczogICAgIGNsaSBvcHRpb25zLgogICAgOnBhcmFtIHNlc3Npb246ICAgICBJbnN0YW5jZSBvZiBwaXAuZG93bmxvYWQuUGlwU2Vzc2lvbi4KICAgIDpwYXJhbSBjb25zdHJhaW50OiAgSWYgdHJ1ZSwgcGFyc2luZyBhIGNvbnN0cmFpbnQgZmlsZSByYXRoZXIgdGhhbgogICAgICAgIHJlcXVpcmVtZW50cyBmaWxlLgogICAgOnBhcmFtIHdoZWVsX2NhY2hlOiBJbnN0YW5jZSBvZiBwaXAud2hlZWwuV2hlZWxDYWNoZQogICAgIiIiCiAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAicGFyc2VfcmVxdWlyZW1lbnRzKCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICIKICAgICAgICAgICAgIidzZXNzaW9uJyIKICAgICAgICApCgogICAgXywgY29udGVudCA9IGdldF9maWxlX2NvbnRlbnQoCiAgICAgICAgZmlsZW5hbWUsIGNvbWVzX2Zyb209Y29tZXNfZnJvbSwgc2Vzc2lvbj1zZXNzaW9uCiAgICApCgogICAgbGluZXNfZW51bSA9IHByZXByb2Nlc3MoY29udGVudCwgb3B0aW9ucykKCiAgICBmb3IgbGluZV9udW1iZXIsIGxpbmUgaW4gbGluZXNfZW51bToKICAgICAgICByZXFfaXRlciA9IHByb2Nlc3NfbGluZShsaW5lLCBmaWxlbmFtZSwgbGluZV9udW1iZXIsIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21lc19mcm9tLCBvcHRpb25zLCBzZXNzaW9uLCB3aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50PWNvbnN0cmFpbnQpCiAgICAgICAgZm9yIHJlcSBpbiByZXFfaXRlcjoKICAgICAgICAgICAgeWllbGQgcmVxCgoKZGVmIHByZXByb2Nlc3MoY29udGVudCwgb3B0aW9ucyk6CiAgICAiIiJTcGxpdCwgZmlsdGVyLCBhbmQgam9pbiBsaW5lcywgYW5kIHJldHVybiBhIGxpbmUgaXRlcmF0b3IKCiAgICA6cGFyYW0gY29udGVudDogdGhlIGNvbnRlbnQgb2YgdGhlIHJlcXVpcmVtZW50cyBmaWxlCiAgICA6cGFyYW0gb3B0aW9uczogY2xpIG9wdGlvbnMKICAgICIiIgogICAgbGluZXNfZW51bSA9IGVudW1lcmF0ZShjb250ZW50LnNwbGl0bGluZXMoKSwgc3RhcnQ9MSkKICAgIGxpbmVzX2VudW0gPSBqb2luX2xpbmVzKGxpbmVzX2VudW0pCiAgICBsaW5lc19lbnVtID0gaWdub3JlX2NvbW1lbnRzKGxpbmVzX2VudW0pCiAgICBsaW5lc19lbnVtID0gc2tpcF9yZWdleChsaW5lc19lbnVtLCBvcHRpb25zKQogICAgcmV0dXJuIGxpbmVzX2VudW0KCgpkZWYgcHJvY2Vzc19saW5lKGxpbmUsIGZpbGVuYW1lLCBsaW5lX251bWJlciwgZmluZGVyPU5vbmUsIGNvbWVzX2Zyb209Tm9uZSwKICAgICAgICAgICAgICAgICBvcHRpb25zPU5vbmUsIHNlc3Npb249Tm9uZSwgd2hlZWxfY2FjaGU9Tm9uZSwKICAgICAgICAgICAgICAgICBjb25zdHJhaW50PUZhbHNlKToKICAgICIiIlByb2Nlc3MgYSBzaW5nbGUgcmVxdWlyZW1lbnRzIGxpbmU7IFRoaXMgY2FuIHJlc3VsdCBpbiBjcmVhdGluZy95aWVsZGluZwogICAgcmVxdWlyZW1lbnRzLCBvciB1cGRhdGluZyB0aGUgZmluZGVyLgoKICAgIEZvciBsaW5lcyB0aGF0IGNvbnRhaW4gcmVxdWlyZW1lbnRzLCB0aGUgb25seSBvcHRpb25zIHRoYXQgaGF2ZSBhbiBlZmZlY3QKICAgIGFyZSBmcm9tIFNVUFBPUlRFRF9PUFRJT05TX1JFUSwgYW5kIHRoZXkgYXJlIHNjb3BlZCB0byB0aGUKICAgIHJlcXVpcmVtZW50LiBPdGhlciBvcHRpb25zIGZyb20gU1VQUE9SVEVEX09QVElPTlMgbWF5IGJlIHByZXNlbnQsIGJ1dCBhcmUKICAgIGlnbm9yZWQuCgogICAgRm9yIGxpbmVzIHRoYXQgZG8gbm90IGNvbnRhaW4gcmVxdWlyZW1lbnRzLCB0aGUgb25seSBvcHRpb25zIHRoYXQgaGF2ZSBhbgogICAgZWZmZWN0IGFyZSBmcm9tIFNVUFBPUlRFRF9PUFRJT05TLiBPcHRpb25zIGZyb20gU1VQUE9SVEVEX09QVElPTlNfUkVRIG1heQogICAgYmUgcHJlc2VudCwgYnV0IGFyZSBpZ25vcmVkLiBUaGVzZSBsaW5lcyBtYXkgY29udGFpbiBtdWx0aXBsZSBvcHRpb25zCiAgICAoYWx0aG91Z2ggb3VyIGRvY3MgaW1wbHkgb25seSBvbmUgaXMgc3VwcG9ydGVkKSwgYW5kIGFsbCBvdXIgcGFyc2VkIGFuZAogICAgYWZmZWN0IHRoZSBmaW5kZXIuCgogICAgOnBhcmFtIGNvbnN0cmFpbnQ6IElmIFRydWUsIHBhcnNpbmcgYSBjb25zdHJhaW50cyBmaWxlLgogICAgOnBhcmFtIG9wdGlvbnM6IE9wdGlvblBhcnNlciBvcHRpb25zIHRoYXQgd2UgbWF5IHVwZGF0ZQogICAgIiIiCiAgICBwYXJzZXIgPSBidWlsZF9wYXJzZXIoKQogICAgZGVmYXVsdHMgPSBwYXJzZXIuZ2V0X2RlZmF1bHRfdmFsdWVzKCkKICAgIGRlZmF1bHRzLmluZGV4X3VybCA9IE5vbmUKICAgIGlmIGZpbmRlcjoKICAgICAgICAjIGBmaW5kZXIuZm9ybWF0X2NvbnRyb2xgIHdpbGwgYmUgdXBkYXRlZCBkdXJpbmcgcGFyc2luZwogICAgICAgIGRlZmF1bHRzLmZvcm1hdF9jb250cm9sID0gZmluZGVyLmZvcm1hdF9jb250cm9sCiAgICBhcmdzX3N0ciwgb3B0aW9uc19zdHIgPSBicmVha19hcmdzX29wdGlvbnMobGluZSkKICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNywgMyk6CiAgICAgICAgIyBQcmlvciB0byAyLjcuMywgc2hsZXggY2Fubm90IGRlYWwgd2l0aCB1bmljb2RlIGVudHJpZXMKICAgICAgICBvcHRpb25zX3N0ciA9IG9wdGlvbnNfc3RyLmVuY29kZSgndXRmOCcpCiAgICBvcHRzLCBfID0gcGFyc2VyLnBhcnNlX2FyZ3Moc2hsZXguc3BsaXQob3B0aW9uc19zdHIpLCBkZWZhdWx0cykKCiAgICAjIHByZXNlcnZlIGZvciB0aGUgbmVzdGVkIGNvZGUgcGF0aAogICAgbGluZV9jb21lc19mcm9tID0gJyVzICVzIChsaW5lICVzKScgJSAoCiAgICAgICAgJy1jJyBpZiBjb25zdHJhaW50IGVsc2UgJy1yJywgZmlsZW5hbWUsIGxpbmVfbnVtYmVyKQoKICAgICMgeWllbGQgYSBsaW5lIHJlcXVpcmVtZW50CiAgICBpZiBhcmdzX3N0cjoKICAgICAgICBpc29sYXRlZCA9IG9wdGlvbnMuaXNvbGF0ZWRfbW9kZSBpZiBvcHRpb25zIGVsc2UgRmFsc2UKICAgICAgICBpZiBvcHRpb25zOgogICAgICAgICAgICBjbWRvcHRpb25zLmNoZWNrX2luc3RhbGxfYnVpbGRfZ2xvYmFsKG9wdGlvbnMsIG9wdHMpCiAgICAgICAgIyBnZXQgdGhlIG9wdGlvbnMgdGhhdCBhcHBseSB0byByZXF1aXJlbWVudHMKICAgICAgICByZXFfb3B0aW9ucyA9IHt9CiAgICAgICAgZm9yIGRlc3QgaW4gU1VQUE9SVEVEX09QVElPTlNfUkVRX0RFU1Q6CiAgICAgICAgICAgIGlmIGRlc3QgaW4gb3B0cy5fX2RpY3RfXyBhbmQgb3B0cy5fX2RpY3RfX1tkZXN0XToKICAgICAgICAgICAgICAgIHJlcV9vcHRpb25zW2Rlc3RdID0gb3B0cy5fX2RpY3RfX1tkZXN0XQogICAgICAgIHlpZWxkIEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2xpbmUoCiAgICAgICAgICAgIGFyZ3Nfc3RyLCBsaW5lX2NvbWVzX2Zyb20sIGNvbnN0cmFpbnQ9Y29uc3RyYWludCwKICAgICAgICAgICAgaXNvbGF0ZWQ9aXNvbGF0ZWQsIG9wdGlvbnM9cmVxX29wdGlvbnMsIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgKQoKICAgICMgeWllbGQgYW4gZWRpdGFibGUgcmVxdWlyZW1lbnQKICAgIGVsaWYgb3B0cy5lZGl0YWJsZXM6CiAgICAgICAgaXNvbGF0ZWQgPSBvcHRpb25zLmlzb2xhdGVkX21vZGUgaWYgb3B0aW9ucyBlbHNlIEZhbHNlCiAgICAgICAgZGVmYXVsdF92Y3MgPSBvcHRpb25zLmRlZmF1bHRfdmNzIGlmIG9wdGlvbnMgZWxzZSBOb25lCiAgICAgICAgeWllbGQgSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fZWRpdGFibGUoCiAgICAgICAgICAgIG9wdHMuZWRpdGFibGVzWzBdLCBjb21lc19mcm9tPWxpbmVfY29tZXNfZnJvbSwKICAgICAgICAgICAgY29uc3RyYWludD1jb25zdHJhaW50LCBkZWZhdWx0X3Zjcz1kZWZhdWx0X3ZjcywgaXNvbGF0ZWQ9aXNvbGF0ZWQsCiAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgKQoKICAgICMgcGFyc2UgYSBuZXN0ZWQgcmVxdWlyZW1lbnRzIGZpbGUKICAgIGVsaWYgb3B0cy5yZXF1aXJlbWVudHMgb3Igb3B0cy5jb25zdHJhaW50czoKICAgICAgICBpZiBvcHRzLnJlcXVpcmVtZW50czoKICAgICAgICAgICAgcmVxX3BhdGggPSBvcHRzLnJlcXVpcmVtZW50c1swXQogICAgICAgICAgICBuZXN0ZWRfY29uc3RyYWludCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVxX3BhdGggPSBvcHRzLmNvbnN0cmFpbnRzWzBdCiAgICAgICAgICAgIG5lc3RlZF9jb25zdHJhaW50ID0gVHJ1ZQogICAgICAgICMgb3JpZ2luYWwgZmlsZSBpcyBvdmVyIGh0dHAKICAgICAgICBpZiBTQ0hFTUVfUkUuc2VhcmNoKGZpbGVuYW1lKToKICAgICAgICAgICAgIyBkbyBhIHVybCBqb2luIHNvIHJlbGF0aXZlIHBhdGhzIHdvcmsKICAgICAgICAgICAgcmVxX3BhdGggPSB1cmxsaWJfcGFyc2UudXJsam9pbihmaWxlbmFtZSwgcmVxX3BhdGgpCiAgICAgICAgIyBvcmlnaW5hbCBmaWxlIGFuZCBuZXN0ZWQgZmlsZSBhcmUgcGF0aHMKICAgICAgICBlbGlmIG5vdCBTQ0hFTUVfUkUuc2VhcmNoKHJlcV9wYXRoKToKICAgICAgICAgICAgIyBkbyBhIGpvaW4gc28gcmVsYXRpdmUgcGF0aHMgd29yawogICAgICAgICAgICByZXFfcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpLCByZXFfcGF0aCkKICAgICAgICAjIFRPRE86IFdoeSBub3QgdXNlIGBjb21lc19mcm9tPSctciB7fSAobGluZSB7fSknYCBoZXJlIGFzIHdlbGw/CiAgICAgICAgcGFyc2VyID0gcGFyc2VfcmVxdWlyZW1lbnRzKAogICAgICAgICAgICByZXFfcGF0aCwgZmluZGVyLCBjb21lc19mcm9tLCBvcHRpb25zLCBzZXNzaW9uLAogICAgICAgICAgICBjb25zdHJhaW50PW5lc3RlZF9jb25zdHJhaW50LCB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICkKICAgICAgICBmb3IgcmVxIGluIHBhcnNlcjoKICAgICAgICAgICAgeWllbGQgcmVxCgogICAgIyBwZXJjb2xhdGUgaGFzaC1jaGVja2luZyBvcHRpb24gdXB3YXJkCiAgICBlbGlmIG9wdHMucmVxdWlyZV9oYXNoZXM6CiAgICAgICAgb3B0aW9ucy5yZXF1aXJlX2hhc2hlcyA9IG9wdHMucmVxdWlyZV9oYXNoZXMKCiAgICAjIHNldCBmaW5kZXIgb3B0aW9ucwogICAgZWxpZiBmaW5kZXI6CiAgICAgICAgaWYgb3B0cy5hbGxvd19leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAidGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0IG5vICIKICAgICAgICAgICAgICAgICJsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRzLmFsbG93X2FsbF9leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWFsbC1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0cy5hbGxvd191bnZlcmlmaWVkOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctdW52ZXJpZmllZCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0cy5pbmRleF91cmw6CiAgICAgICAgICAgIGZpbmRlci5pbmRleF91cmxzID0gW29wdHMuaW5kZXhfdXJsXQogICAgICAgIGlmIG9wdHMudXNlX3doZWVsIGlzIEZhbHNlOgogICAgICAgICAgICBmaW5kZXIudXNlX3doZWVsID0gRmFsc2UKICAgICAgICAgICAgcGlwLmluZGV4LmZtdF9jdGxfbm9fdXNlX3doZWVsKGZpbmRlci5mb3JtYXRfY29udHJvbCkKICAgICAgICBpZiBvcHRzLm5vX2luZGV4IGlzIFRydWU6CiAgICAgICAgICAgIGZpbmRlci5pbmRleF91cmxzID0gW10KICAgICAgICBpZiBvcHRzLmV4dHJhX2luZGV4X3VybHM6CiAgICAgICAgICAgIGZpbmRlci5pbmRleF91cmxzLmV4dGVuZChvcHRzLmV4dHJhX2luZGV4X3VybHMpCiAgICAgICAgaWYgb3B0cy5maW5kX2xpbmtzOgogICAgICAgICAgICAjIEZJWE1FOiBpdCB3b3VsZCBiZSBuaWNlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHNvdXJjZQogICAgICAgICAgICAjIG9mIHRoZSBmaW5kX2xpbmtzOiBzdXBwb3J0IGEgZmluZC1saW5rcyBsb2NhbCBwYXRoCiAgICAgICAgICAgICMgcmVsYXRpdmUgdG8gYSByZXF1aXJlbWVudHMgZmlsZS4KICAgICAgICAgICAgdmFsdWUgPSBvcHRzLmZpbmRfbGlua3NbMF0KICAgICAgICAgICAgcmVxX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpKQogICAgICAgICAgICByZWxhdGl2ZV90b19yZXFzX2ZpbGUgPSBvcy5wYXRoLmpvaW4ocmVxX2RpciwgdmFsdWUpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlbGF0aXZlX3RvX3JlcXNfZmlsZSk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlbGF0aXZlX3RvX3JlcXNfZmlsZQogICAgICAgICAgICBmaW5kZXIuZmluZF9saW5rcy5hcHBlbmQodmFsdWUpCiAgICAgICAgaWYgb3B0cy5wcmU6CiAgICAgICAgICAgIGZpbmRlci5hbGxvd19hbGxfcHJlcmVsZWFzZXMgPSBUcnVlCiAgICAgICAgaWYgb3B0cy5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgIGZpbmRlci5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MgPSBUcnVlCiAgICAgICAgaWYgb3B0cy50cnVzdGVkX2hvc3RzOgogICAgICAgICAgICBmaW5kZXIuc2VjdXJlX29yaWdpbnMuZXh0ZW5kKAogICAgICAgICAgICAgICAgKCIqIiwgaG9zdCwgIioiKSBmb3IgaG9zdCBpbiBvcHRzLnRydXN0ZWRfaG9zdHMpCgoKZGVmIGJyZWFrX2FyZ3Nfb3B0aW9ucyhsaW5lKToKICAgICIiIkJyZWFrIHVwIHRoZSBsaW5lIGludG8gYW4gYXJncyBhbmQgb3B0aW9ucyBzdHJpbmcuICBXZSBvbmx5IHdhbnQgdG8gc2hsZXgKICAgIChhbmQgdGhlbiBvcHRwYXJzZSkgdGhlIG9wdGlvbnMsIG5vdCB0aGUgYXJncy4gIGFyZ3MgY2FuIGNvbnRhaW4gbWFya2VycwogICAgd2hpY2ggYXJlIGNvcnJ1cHRlZCBieSBzaGxleC4KICAgICIiIgogICAgdG9rZW5zID0gbGluZS5zcGxpdCgnICcpCiAgICBhcmdzID0gW10KICAgIG9wdGlvbnMgPSB0b2tlbnNbOl0KICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6CiAgICAgICAgaWYgdG9rZW4uc3RhcnRzd2l0aCgnLScpIG9yIHRva2VuLnN0YXJ0c3dpdGgoJy0tJyk6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJncy5hcHBlbmQodG9rZW4pCiAgICAgICAgICAgIG9wdGlvbnMucG9wKDApCiAgICByZXR1cm4gJyAnLmpvaW4oYXJncyksICcgJy5qb2luKG9wdGlvbnMpCgoKZGVmIGJ1aWxkX3BhcnNlcigpOgogICAgIiIiCiAgICBSZXR1cm4gYSBwYXJzZXIgZm9yIHBhcnNpbmcgcmVxdWlyZW1lbnQgbGluZXMKICAgICIiIgogICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKGFkZF9oZWxwX29wdGlvbj1GYWxzZSkKCiAgICBvcHRpb25fZmFjdG9yaWVzID0gU1VQUE9SVEVEX09QVElPTlMgKyBTVVBQT1JURURfT1BUSU9OU19SRVEKICAgIGZvciBvcHRpb25fZmFjdG9yeSBpbiBvcHRpb25fZmFjdG9yaWVzOgogICAgICAgIG9wdGlvbiA9IG9wdGlvbl9mYWN0b3J5KCkKICAgICAgICBwYXJzZXIuYWRkX29wdGlvbihvcHRpb24pCgogICAgIyBCeSBkZWZhdWx0IG9wdHBhcnNlIHN5cy5leGl0cyBvbiBwYXJzaW5nIGVycm9ycy4gV2Ugd2FudCB0byB3cmFwCiAgICAjIHRoYXQgaW4gb3VyIG93biBleGNlcHRpb24uCiAgICBkZWYgcGFyc2VyX2V4aXQoc2VsZiwgbXNnKToKICAgICAgICByYWlzZSBSZXF1aXJlbWVudHNGaWxlUGFyc2VFcnJvcihtc2cpCiAgICBwYXJzZXIuZXhpdCA9IHBhcnNlcl9leGl0CgogICAgcmV0dXJuIHBhcnNlcgoKCmRlZiBqb2luX2xpbmVzKGxpbmVzX2VudW0pOgogICAgIiIiSm9pbnMgYSBsaW5lIGVuZGluZyBpbiAnXCcgd2l0aCB0aGUgcHJldmlvdXMgbGluZSAoZXhjZXB0IHdoZW4gZm9sbG93aW5nCiAgICBjb21tZW50cykuICBUaGUgam9pbmVkIGxpbmUgdGFrZXMgb24gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBsaW5lLgogICAgIiIiCiAgICBwcmltYXJ5X2xpbmVfbnVtYmVyID0gTm9uZQogICAgbmV3X2xpbmUgPSBbXQogICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGxpbmVzX2VudW06CiAgICAgICAgaWYgbm90IGxpbmUuZW5kc3dpdGgoJ1xcJykgb3IgQ09NTUVOVF9SRS5tYXRjaChsaW5lKToKICAgICAgICAgICAgaWYgQ09NTUVOVF9SRS5tYXRjaChsaW5lKToKICAgICAgICAgICAgICAgICMgdGhpcyBlbnN1cmVzIGNvbW1lbnRzIGFyZSBhbHdheXMgbWF0Y2hlZCBsYXRlcgogICAgICAgICAgICAgICAgbGluZSA9ICcgJyArIGxpbmUKICAgICAgICAgICAgaWYgbmV3X2xpbmU6CiAgICAgICAgICAgICAgICBuZXdfbGluZS5hcHBlbmQobGluZSkKICAgICAgICAgICAgICAgIHlpZWxkIHByaW1hcnlfbGluZV9udW1iZXIsICcnLmpvaW4obmV3X2xpbmUpCiAgICAgICAgICAgICAgICBuZXdfbGluZSA9IFtdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lX251bWJlciwgbGluZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCBuZXdfbGluZToKICAgICAgICAgICAgICAgIHByaW1hcnlfbGluZV9udW1iZXIgPSBsaW5lX251bWJlcgogICAgICAgICAgICBuZXdfbGluZS5hcHBlbmQobGluZS5zdHJpcCgnXFwnKSkKCiAgICAjIGxhc3QgbGluZSBjb250YWlucyBcCiAgICBpZiBuZXdfbGluZToKICAgICAgICB5aWVsZCBwcmltYXJ5X2xpbmVfbnVtYmVyLCAnJy5qb2luKG5ld19saW5lKQoKICAgICMgVE9ETzogaGFuZGxlIHNwYWNlIGFmdGVyICdcJy4KCgpkZWYgaWdub3JlX2NvbW1lbnRzKGxpbmVzX2VudW0pOgogICAgIiIiCiAgICBTdHJpcHMgY29tbWVudHMgYW5kIGZpbHRlciBlbXB0eSBsaW5lcy4KICAgICIiIgogICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGxpbmVzX2VudW06CiAgICAgICAgbGluZSA9IENPTU1FTlRfUkUuc3ViKCcnLCBsaW5lKQogICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICBpZiBsaW5lOgogICAgICAgICAgICB5aWVsZCBsaW5lX251bWJlciwgbGluZQoKCmRlZiBza2lwX3JlZ2V4KGxpbmVzX2VudW0sIG9wdGlvbnMpOgogICAgIiIiCiAgICBTa2lwIGxpbmVzIHRoYXQgbWF0Y2ggJy0tc2tpcC1yZXF1aXJlbWVudHMtcmVnZXgnIHBhdHRlcm4KCiAgICBOb3RlOiB0aGUgcmVnZXggcGF0dGVybiBpcyBvbmx5IGJ1aWx0IG9uY2UKICAgICIiIgogICAgc2tpcF9yZWdleCA9IG9wdGlvbnMuc2tpcF9yZXF1aXJlbWVudHNfcmVnZXggaWYgb3B0aW9ucyBlbHNlIE5vbmUKICAgIGlmIHNraXBfcmVnZXg6CiAgICAgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoc2tpcF9yZWdleCkKICAgICAgICBsaW5lc19lbnVtID0gZmlsdGVyZmFsc2UoCiAgICAgICAgICAgIGxhbWJkYSBlOiBwYXR0ZXJuLnNlYXJjaChlWzFdKSwKICAgICAgICAgICAgbGluZXNfZW51bSkKICAgIHJldHVybiBsaW5lc19lbnVtClBLAwQUAAAAAAAAACEAgW1Vw5e1AACXtQAAMwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3JlcS9yZXFfaW5zdGFsbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHRyYWNlYmFjawppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHppcGZpbGUKCmZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY2hhbmdlX3Jvb3QKZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMsIHNpeApmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZyBpbXBvcnQgc3BlY2lmaWVycwpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy5tYXJrZXJzIGltcG9ydCBNYXJrZXIKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcucmVxdWlyZW1lbnRzIGltcG9ydCBJbnZhbGlkUmVxdWlyZW1lbnQsIFJlcXVpcmVtZW50CmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBWZXJzaW9uLCBwYXJzZSBhcyBwYXJzZV92ZXJzaW9uCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKCmltcG9ydCBwaXAud2hlZWwKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgbmF0aXZlX3N0ciwgZ2V0X3N0ZGxpYiwgV0lORE9XUwpmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgaXNfdXJsLCB1cmxfdG9fcGF0aCwgcGF0aF90b191cmwsIGlzX2FyY2hpdmVfZmlsZQpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBJbnN0YWxsYXRpb25FcnJvciwgVW5pbnN0YWxsYXRpb25FcnJvciwKKQpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0ICgKICAgIGJpbl9weSwgcnVubmluZ191bmRlcl92aXJ0dWFsZW52LCBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRSwgYmluX3VzZXIsCikKZnJvbSBwaXAudXRpbHMgaW1wb3J0ICgKICAgIGRpc3BsYXlfcGF0aCwgcm10cmVlLCBhc2tfcGF0aF9leGlzdHMsIGJhY2t1cF9kaXIsIGlzX2luc3RhbGxhYmxlX2RpciwKICAgIGRpc3RfaW5fdXNlcnNpdGUsIGRpc3RfaW5fc2l0ZV9wYWNrYWdlcywgZWdnX2xpbmtfcGF0aCwKICAgIGNhbGxfc3VicHJvY2VzcywgcmVhZF90ZXh0X2ZpbGUsIEZha2VGaWxlLCBfbWFrZV9idWlsZF9kaXIsIGVuc3VyZV9kaXIsCiAgICBnZXRfaW5zdGFsbGVkX3ZlcnNpb24sIG5vcm1hbGl6ZV9wYXRoLCBkaXN0X2lzX2xvY2FsLAopCgpmcm9tIHBpcC51dGlscy5oYXNoZXMgaW1wb3J0IEhhc2hlcwpmcm9tIHBpcC51dGlscy5kZXByZWNhdGlvbiBpbXBvcnQgUmVtb3ZlZEluUGlwMTBXYXJuaW5nCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudXRpbHMuc2V0dXB0b29sc19idWlsZCBpbXBvcnQgU0VUVVBUT09MU19TSElNCmZyb20gcGlwLnV0aWxzLnVpIGltcG9ydCBvcGVuX3NwaW5uZXIKZnJvbSBwaXAucmVxLnJlcV91bmluc3RhbGwgaW1wb3J0IFVuaW5zdGFsbFBhdGhTZXQKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MKZnJvbSBwaXAud2hlZWwgaW1wb3J0IG1vdmVfd2hlZWxfZmlsZXMsIFdoZWVsCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpvcGVyYXRvcnMgPSBzcGVjaWZpZXJzLlNwZWNpZmllci5fb3BlcmF0b3JzLmtleXMoKQoKCmRlZiBfc3RyaXBfZXh0cmFzKHBhdGgpOgogICAgbSA9IHJlLm1hdGNoKHInXiguKykoXFtbXlxdXStcXSkkJywgcGF0aCkKICAgIGV4dHJhcyA9IE5vbmUKICAgIGlmIG06CiAgICAgICAgcGF0aF9ub19leHRyYXMgPSBtLmdyb3VwKDEpCiAgICAgICAgZXh0cmFzID0gbS5ncm91cCgyKQogICAgZWxzZToKICAgICAgICBwYXRoX25vX2V4dHJhcyA9IHBhdGgKCiAgICByZXR1cm4gcGF0aF9ub19leHRyYXMsIGV4dHJhcwoKCmRlZiBfc2FmZV9leHRyYXMoZXh0cmFzKToKICAgIHJldHVybiBzZXQocGtnX3Jlc291cmNlcy5zYWZlX2V4dHJhKGV4dHJhKSBmb3IgZXh0cmEgaW4gZXh0cmFzKQoKCmNsYXNzIEluc3RhbGxSZXF1aXJlbWVudChvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXEsIGNvbWVzX2Zyb20sIHNvdXJjZV9kaXI9Tm9uZSwgZWRpdGFibGU9RmFsc2UsCiAgICAgICAgICAgICAgICAgbGluaz1Ob25lLCBhc19lZ2c9RmFsc2UsIHVwZGF0ZT1UcnVlLAogICAgICAgICAgICAgICAgIHB5Y29tcGlsZT1UcnVlLCBtYXJrZXJzPU5vbmUsIGlzb2xhdGVkPUZhbHNlLCBvcHRpb25zPU5vbmUsCiAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9Tm9uZSwgY29uc3RyYWludD1GYWxzZSk6CiAgICAgICAgc2VsZi5leHRyYXMgPSAoKQogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVxID0gUmVxdWlyZW1lbnQocmVxKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFJlcXVpcmVtZW50OgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zZXAgaW4gcmVxOgogICAgICAgICAgICAgICAgICAgIGFkZF9tc2cgPSAiSXQgbG9va3MgbGlrZSBhIHBhdGguIERvZXMgaXQgZXhpc3QgPyIKICAgICAgICAgICAgICAgIGVsaWYgJz0nIGluIHJlcSBhbmQgbm90IGFueShvcCBpbiByZXEgZm9yIG9wIGluIG9wZXJhdG9ycyk6CiAgICAgICAgICAgICAgICAgICAgYWRkX21zZyA9ICI9IGlzIG5vdCBhIHZhbGlkIG9wZXJhdG9yLiBEaWQgeW91IG1lYW4gPT0gPyIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYWRkX21zZyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVpcmVtZW50OiAnJXMnXG4lcyIgJSAocmVxLCBhZGRfbXNnKSkKICAgICAgICAgICAgc2VsZi5leHRyYXMgPSBfc2FmZV9leHRyYXMocmVxLmV4dHJhcykKCiAgICAgICAgc2VsZi5yZXEgPSByZXEKICAgICAgICBzZWxmLmNvbWVzX2Zyb20gPSBjb21lc19mcm9tCiAgICAgICAgc2VsZi5jb25zdHJhaW50ID0gY29uc3RyYWludAogICAgICAgIHNlbGYuc291cmNlX2RpciA9IHNvdXJjZV9kaXIKICAgICAgICBzZWxmLmVkaXRhYmxlID0gZWRpdGFibGUKCiAgICAgICAgc2VsZi5fd2hlZWxfY2FjaGUgPSB3aGVlbF9jYWNoZQogICAgICAgIHNlbGYubGluayA9IHNlbGYub3JpZ2luYWxfbGluayA9IGxpbmsKICAgICAgICBzZWxmLmFzX2VnZyA9IGFzX2VnZwogICAgICAgIGlmIG1hcmtlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYubWFya2VycyA9IG1hcmtlcnMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1hcmtlcnMgPSByZXEgYW5kIHJlcS5tYXJrZXIKICAgICAgICBzZWxmLl9lZ2dfaW5mb19wYXRoID0gTm9uZQogICAgICAgICMgVGhpcyBob2xkcyB0aGUgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24gb2JqZWN0IGlmIHRoaXMgcmVxdWlyZW1lbnQKICAgICAgICAjIGlzIGFscmVhZHkgYXZhaWxhYmxlOgogICAgICAgIHNlbGYuc2F0aXNmaWVkX2J5ID0gTm9uZQogICAgICAgICMgVGhpcyBob2xkIHRoZSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiBvYmplY3QgaWYgdGhpcyByZXF1aXJlbWVudAogICAgICAgICMgY29uZmxpY3RzIHdpdGggYW5vdGhlciBpbnN0YWxsZWQgZGlzdHJpYnV0aW9uOgogICAgICAgIHNlbGYuY29uZmxpY3RzX3dpdGggPSBOb25lCiAgICAgICAgIyBUZW1wb3JhcnkgYnVpbGQgbG9jYXRpb24KICAgICAgICBzZWxmLl90ZW1wX2J1aWxkX2RpciA9IE5vbmUKICAgICAgICAjIFVzZWQgdG8gc3RvcmUgdGhlIGdsb2JhbCBkaXJlY3Rvcnkgd2hlcmUgdGhlIF90ZW1wX2J1aWxkX2RpciBzaG91bGQKICAgICAgICAjIGhhdmUgYmVlbiBjcmVhdGVkLiBDZiBfY29ycmVjdF9idWlsZF9sb2NhdGlvbiBtZXRob2QuCiAgICAgICAgc2VsZi5faWRlYWxfYnVpbGRfZGlyID0gTm9uZQogICAgICAgICMgVHJ1ZSBpZiB0aGUgZWRpdGFibGUgc2hvdWxkIGJlIHVwZGF0ZWQ6CiAgICAgICAgc2VsZi51cGRhdGUgPSB1cGRhdGUKICAgICAgICAjIFNldCB0byBUcnVlIGFmdGVyIHN1Y2Nlc3NmdWwgaW5zdGFsbGF0aW9uCiAgICAgICAgc2VsZi5pbnN0YWxsX3N1Y2NlZWRlZCA9IE5vbmUKICAgICAgICAjIFVuaW5zdGFsbFBhdGhTZXQgb2YgdW5pbnN0YWxsZWQgZGlzdHJpYnV0aW9uIChmb3IgcG9zc2libGUgcm9sbGJhY2spCiAgICAgICAgc2VsZi51bmluc3RhbGxlZCA9IE5vbmUKICAgICAgICAjIFNldCBUcnVlIGlmIGEgbGVnaXRpbWF0ZSBkby1ub3RoaW5nLW9uLXVuaW5zdGFsbCBoYXMgaGFwcGVuZWQgLSBlLmcuCiAgICAgICAgIyBzeXN0ZW0gc2l0ZSBwYWNrYWdlcywgc3RkbGliIHBhY2thZ2VzLgogICAgICAgIHNlbGYubm90aGluZ190b191bmluc3RhbGwgPSBGYWxzZQogICAgICAgIHNlbGYudXNlX3VzZXJfc2l0ZSA9IEZhbHNlCiAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gTm9uZQogICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMgaWYgb3B0aW9ucyBlbHNlIHt9CiAgICAgICAgc2VsZi5weWNvbXBpbGUgPSBweWNvbXBpbGUKICAgICAgICAjIFNldCB0byBUcnVlIGFmdGVyIHN1Y2Nlc3NmdWwgcHJlcGFyYXRpb24gb2YgdGhpcyByZXF1aXJlbWVudAogICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQoKICAgICAgICBzZWxmLmlzb2xhdGVkID0gaXNvbGF0ZWQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2VkaXRhYmxlKGNscywgZWRpdGFibGVfcmVxLCBjb21lc19mcm9tPU5vbmUsIGRlZmF1bHRfdmNzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1GYWxzZSwgb3B0aW9ucz1Ob25lLCB3aGVlbF9jYWNoZT1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludD1GYWxzZSk6CiAgICAgICAgZnJvbSBwaXAuaW5kZXggaW1wb3J0IExpbmsKCiAgICAgICAgbmFtZSwgdXJsLCBleHRyYXNfb3ZlcnJpZGUgPSBwYXJzZV9lZGl0YWJsZSgKICAgICAgICAgICAgZWRpdGFibGVfcmVxLCBkZWZhdWx0X3ZjcykKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKToKICAgICAgICAgICAgc291cmNlX2RpciA9IHVybF90b19wYXRoKHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzb3VyY2VfZGlyID0gTm9uZQoKICAgICAgICByZXMgPSBjbHMobmFtZSwgY29tZXNfZnJvbSwgc291cmNlX2Rpcj1zb3VyY2VfZGlyLAogICAgICAgICAgICAgICAgICBlZGl0YWJsZT1UcnVlLAogICAgICAgICAgICAgICAgICBsaW5rPUxpbmsodXJsKSwKICAgICAgICAgICAgICAgICAgY29uc3RyYWludD1jb25zdHJhaW50LAogICAgICAgICAgICAgICAgICBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgICAgICAgb3B0aW9ucz1vcHRpb25zIGlmIG9wdGlvbnMgZWxzZSB7fSwKICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUpCgogICAgICAgIGlmIGV4dHJhc19vdmVycmlkZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVzLmV4dHJhcyA9IF9zYWZlX2V4dHJhcyhleHRyYXNfb3ZlcnJpZGUpCgogICAgICAgIHJldHVybiByZXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2xpbmUoCiAgICAgICAgICAgIGNscywgbmFtZSwgY29tZXNfZnJvbT1Ob25lLCBpc29sYXRlZD1GYWxzZSwgb3B0aW9ucz1Ob25lLAogICAgICAgICAgICB3aGVlbF9jYWNoZT1Ob25lLCBjb25zdHJhaW50PUZhbHNlKToKICAgICAgICAiIiJDcmVhdGVzIGFuIEluc3RhbGxSZXF1aXJlbWVudCBmcm9tIGEgbmFtZSwgd2hpY2ggbWlnaHQgYmUgYQogICAgICAgIHJlcXVpcmVtZW50LCBkaXJlY3RvcnkgY29udGFpbmluZyAnc2V0dXAucHknLCBmaWxlbmFtZSwgb3IgVVJMLgogICAgICAgICIiIgogICAgICAgIGZyb20gcGlwLmluZGV4IGltcG9ydCBMaW5rCgogICAgICAgIGlmIGlzX3VybChuYW1lKToKICAgICAgICAgICAgbWFya2VyX3NlcCA9ICc7ICcKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXJrZXJfc2VwID0gJzsnCiAgICAgICAgaWYgbWFya2VyX3NlcCBpbiBuYW1lOgogICAgICAgICAgICBuYW1lLCBtYXJrZXJzID0gbmFtZS5zcGxpdChtYXJrZXJfc2VwLCAxKQogICAgICAgICAgICBtYXJrZXJzID0gbWFya2Vycy5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBtYXJrZXJzOgogICAgICAgICAgICAgICAgbWFya2VycyA9IE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG1hcmtlcnMgPSBNYXJrZXIobWFya2VycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXJrZXJzID0gTm9uZQogICAgICAgIG5hbWUgPSBuYW1lLnN0cmlwKCkKICAgICAgICByZXEgPSBOb25lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5hYnNwYXRoKG5hbWUpKQogICAgICAgIGxpbmsgPSBOb25lCiAgICAgICAgZXh0cmFzID0gTm9uZQoKICAgICAgICBpZiBpc191cmwobmFtZSk6CiAgICAgICAgICAgIGxpbmsgPSBMaW5rKG5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcCwgZXh0cmFzID0gX3N0cmlwX2V4dHJhcyhwYXRoKQogICAgICAgICAgICBpZiAob3MucGF0aC5pc2RpcihwKSBhbmQKICAgICAgICAgICAgICAgICAgICAob3MucGF0aC5zZXAgaW4gbmFtZSBvciBuYW1lLnN0YXJ0c3dpdGgoJy4nKSkpOgoKICAgICAgICAgICAgICAgIGlmIG5vdCBpc19pbnN0YWxsYWJsZV9kaXIocCk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJEaXJlY3RvcnkgJXIgaXMgbm90IGluc3RhbGxhYmxlLiBGaWxlICdzZXR1cC5weScgIgogICAgICAgICAgICAgICAgICAgICAgICAibm90IGZvdW5kLiIgJSBuYW1lCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbGluayA9IExpbmsocGF0aF90b191cmwocCkpCiAgICAgICAgICAgIGVsaWYgaXNfYXJjaGl2ZV9maWxlKHApOgogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHApOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnUmVxdWlyZW1lbnQgJXIgbG9va3MgbGlrZSBhIGZpbGVuYW1lLCBidXQgdGhlICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGUgZG9lcyBub3QgZXhpc3QnLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbGluayA9IExpbmsocGF0aF90b191cmwocCkpCgogICAgICAgICMgaXQncyBhIGxvY2FsIGZpbGUsIGRpciwgb3IgdXJsCiAgICAgICAgaWYgbGluazoKICAgICAgICAgICAgIyBIYW5kbGUgcmVsYXRpdmUgZmlsZSBVUkxzCiAgICAgICAgICAgIGlmIGxpbmsuc2NoZW1lID09ICdmaWxlJyBhbmQgcmUuc2VhcmNoKHInXC5cLi8nLCBsaW5rLnVybCk6CiAgICAgICAgICAgICAgICBsaW5rID0gTGluaygKICAgICAgICAgICAgICAgICAgICBwYXRoX3RvX3VybChvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguYWJzcGF0aChsaW5rLnBhdGgpKSkpCiAgICAgICAgICAgICMgd2hlZWwgZmlsZQogICAgICAgICAgICBpZiBsaW5rLmlzX3doZWVsOgogICAgICAgICAgICAgICAgd2hlZWwgPSBXaGVlbChsaW5rLmZpbGVuYW1lKSAgIyBjYW4gcmFpc2UgSW52YWxpZFdoZWVsRmlsZW5hbWUKICAgICAgICAgICAgICAgIHJlcSA9ICIlcz09JXMiICUgKHdoZWVsLm5hbWUsIHdoZWVsLnZlcnNpb24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHNldCB0aGUgcmVxIHRvIHRoZSBlZ2cgZnJhZ21lbnQuICB3aGVuIGl0J3Mgbm90IHRoZXJlLCB0aGlzCiAgICAgICAgICAgICAgICAjIHdpbGwgYmVjb21lIGFuICd1bm5hbWVkJyByZXF1aXJlbWVudAogICAgICAgICAgICAgICAgcmVxID0gbGluay5lZ2dfZnJhZ21lbnQKCiAgICAgICAgIyBhIHJlcXVpcmVtZW50IHNwZWNpZmllcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlcSA9IG5hbWUKCiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgaWYgb3B0aW9ucyBlbHNlIHt9CiAgICAgICAgcmVzID0gY2xzKHJlcSwgY29tZXNfZnJvbSwgbGluaz1saW5rLCBtYXJrZXJzPW1hcmtlcnMsCiAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPWlzb2xhdGVkLCBvcHRpb25zPW9wdGlvbnMsCiAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLCBjb25zdHJhaW50PWNvbnN0cmFpbnQpCgogICAgICAgIGlmIGV4dHJhczoKICAgICAgICAgICAgcmVzLmV4dHJhcyA9IF9zYWZlX2V4dHJhcygKICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50KCdwbGFjZWhvbGRlcicgKyBleHRyYXMpLmV4dHJhcykKCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYucmVxOgogICAgICAgICAgICBzID0gc3RyKHNlbGYucmVxKQogICAgICAgICAgICBpZiBzZWxmLmxpbms6CiAgICAgICAgICAgICAgICBzICs9ICcgZnJvbSAlcycgJSBzZWxmLmxpbmsudXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcyA9IHNlbGYubGluay51cmwgaWYgc2VsZi5saW5rIGVsc2UgTm9uZQogICAgICAgIGlmIHNlbGYuc2F0aXNmaWVkX2J5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzICs9ICcgaW4gJXMnICUgZGlzcGxheV9wYXRoKHNlbGYuc2F0aXNmaWVkX2J5LmxvY2F0aW9uKQogICAgICAgIGlmIHNlbGYuY29tZXNfZnJvbToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmNvbWVzX2Zyb20sIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgY29tZXNfZnJvbSA9IHNlbGYuY29tZXNfZnJvbQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29tZXNfZnJvbSA9IHNlbGYuY29tZXNfZnJvbS5mcm9tX3BhdGgoKQogICAgICAgICAgICBpZiBjb21lc19mcm9tOgogICAgICAgICAgICAgICAgcyArPSAnIChmcm9tICVzKScgJSBjb21lc19mcm9tCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8JXMgb2JqZWN0OiAlcyBlZGl0YWJsZT0lcj4nICUgKAogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKHNlbGYpLCBzZWxmLmVkaXRhYmxlKQoKICAgIGRlZiBwb3B1bGF0ZV9saW5rKHNlbGYsIGZpbmRlciwgdXBncmFkZSwgcmVxdWlyZV9oYXNoZXMpOgogICAgICAgICIiIkVuc3VyZSB0aGF0IGlmIGEgbGluayBjYW4gYmUgZm91bmQgZm9yIHRoaXMsIHRoYXQgaXQgaXMgZm91bmQuCgogICAgICAgIE5vdGUgdGhhdCBzZWxmLmxpbmsgbWF5IHN0aWxsIGJlIE5vbmUgLSBpZiBVcGdyYWRlIGlzIEZhbHNlIGFuZCB0aGUKICAgICAgICByZXF1aXJlbWVudCBpcyBhbHJlYWR5IGluc3RhbGxlZC4KCiAgICAgICAgSWYgcmVxdWlyZV9oYXNoZXMgaXMgVHJ1ZSwgZG9uJ3QgdXNlIHRoZSB3aGVlbCBjYWNoZSwgYmVjYXVzZSBjYWNoZWQKICAgICAgICB3aGVlbHMsIGFsd2F5cyBidWlsdCBsb2NhbGx5LCBoYXZlIGRpZmZlcmVudCBoYXNoZXMgdGhhbiB0aGUgZmlsZXMKICAgICAgICBkb3dubG9hZGVkIGZyb20gdGhlIGluZGV4IHNlcnZlciBhbmQgdGh1cyB0aHJvdyBmYWxzZSBoYXNoIG1pc21hdGNoZXMuCiAgICAgICAgRnVydGhlcm1vcmUsIGNhY2hlZCB3aGVlbHMgYXQgcHJlc2VudCBoYXZlIHVuZGV0ZXJtaW5pc3RpYyBjb250ZW50cyBkdWUKICAgICAgICB0byBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcy4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmxpbmsgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5saW5rID0gZmluZGVyLmZpbmRfcmVxdWlyZW1lbnQoc2VsZiwgdXBncmFkZSkKICAgICAgICBpZiBzZWxmLl93aGVlbF9jYWNoZSBpcyBub3QgTm9uZSBhbmQgbm90IHJlcXVpcmVfaGFzaGVzOgogICAgICAgICAgICBvbGRfbGluayA9IHNlbGYubGluawogICAgICAgICAgICBzZWxmLmxpbmsgPSBzZWxmLl93aGVlbF9jYWNoZS5jYWNoZWRfd2hlZWwoc2VsZi5saW5rLCBzZWxmLm5hbWUpCiAgICAgICAgICAgIGlmIG9sZF9saW5rICE9IHNlbGYubGluazoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVXNpbmcgY2FjaGVkIHdoZWVsIGxpbms6ICVzJywgc2VsZi5saW5rKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNwZWNpZmllcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5yZXEuc3BlY2lmaWVyCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcGlubmVkKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGV0aGVyIEkgYW0gcGlubmVkIHRvIGFuIGV4YWN0IHZlcnNpb24uCgogICAgICAgIEZvciBleGFtcGxlLCBzb21lLXBhY2thZ2U9PTEuMiBpcyBwaW5uZWQ7IHNvbWUtcGFja2FnZT4xLjIgaXMgbm90LgogICAgICAgICIiIgogICAgICAgIHNwZWNpZmllcnMgPSBzZWxmLnNwZWNpZmllcgogICAgICAgIHJldHVybiAobGVuKHNwZWNpZmllcnMpID09IDEgYW5kCiAgICAgICAgICAgICAgICBuZXh0KGl0ZXIoc3BlY2lmaWVycykpLm9wZXJhdG9yIGluICgnPT0nLCAnPT09JykpCgogICAgZGVmIGZyb21fcGF0aChzZWxmKToKICAgICAgICBpZiBzZWxmLnJlcSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHMgPSBzdHIoc2VsZi5yZXEpCiAgICAgICAgaWYgc2VsZi5jb21lc19mcm9tOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuY29tZXNfZnJvbSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBjb21lc19mcm9tID0gc2VsZi5jb21lc19mcm9tCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb21lc19mcm9tID0gc2VsZi5jb21lc19mcm9tLmZyb21fcGF0aCgpCiAgICAgICAgICAgIGlmIGNvbWVzX2Zyb206CiAgICAgICAgICAgICAgICBzICs9ICctPicgKyBjb21lc19mcm9tCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgYnVpbGRfbG9jYXRpb24oc2VsZiwgYnVpbGRfZGlyKToKICAgICAgICBpZiBzZWxmLl90ZW1wX2J1aWxkX2RpciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBfYnVpbGRfZGlyCiAgICAgICAgaWYgc2VsZi5yZXEgaXMgTm9uZToKICAgICAgICAgICAgIyBmb3IgcmVxdWlyZW1lbnQgdmlhIGEgcGF0aCB0byBhIGRpcmVjdG9yeTogdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgICMgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIHlldCBzbyB3ZSBjcmVhdGUgYSB0ZW1wIGRpcmVjdG9yeQogICAgICAgICAgICAjIE9uY2UgcnVuX2VnZ19pbmZvIHdpbGwgaGF2ZSBydW4sIHdlJ2xsIGJlIGFibGUKICAgICAgICAgICAgIyB0byBmaXggaXQgdmlhIF9jb3JyZWN0X2J1aWxkX2xvY2F0aW9uCiAgICAgICAgICAgICMgU29tZSBzeXN0ZW1zIGhhdmUgL3RtcCBhcyBhIHN5bWxpbmsgd2hpY2ggY29uZnVzZXMgY3VzdG9tCiAgICAgICAgICAgICMgYnVpbGRzIChzdWNoIGFzIG51bXB5KS4gVGh1cywgd2UgZW5zdXJlIHRoYXQgdGhlIHJlYWwgcGF0aAogICAgICAgICAgICAjIGlzIHJldHVybmVkLgogICAgICAgICAgICBzZWxmLl90ZW1wX2J1aWxkX2RpciA9IG9zLnBhdGgucmVhbHBhdGgoCiAgICAgICAgICAgICAgICB0ZW1wZmlsZS5ta2R0ZW1wKCctYnVpbGQnLCAncGlwLScpCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5faWRlYWxfYnVpbGRfZGlyID0gYnVpbGRfZGlyCiAgICAgICAgICAgIHJldHVybiBzZWxmLl90ZW1wX2J1aWxkX2RpcgogICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIG5hbWUgPSBzZWxmLm5hbWUubG93ZXIoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSBzZWxmLm5hbWUKICAgICAgICAjIEZJWE1FOiBJcyB0aGVyZSBhIGJldHRlciBwbGFjZSB0byBjcmVhdGUgdGhlIGJ1aWxkX2Rpcj8gKGhnIGFuZCBienIKICAgICAgICAjIG5lZWQgdGhpcykKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYnVpbGRfZGlyKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBkaXJlY3RvcnkgJXMnLCBidWlsZF9kaXIpCiAgICAgICAgICAgIF9tYWtlX2J1aWxkX2RpcihidWlsZF9kaXIpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihidWlsZF9kaXIsIG5hbWUpCgogICAgZGVmIF9jb3JyZWN0X2J1aWxkX2xvY2F0aW9uKHNlbGYpOgogICAgICAgICIiIk1vdmUgc2VsZi5fdGVtcF9idWlsZF9kaXIgdG8gc2VsZi5faWRlYWxfYnVpbGRfZGlyL3NlbGYucmVxLm5hbWUKCiAgICAgICAgRm9yIHNvbWUgcmVxdWlyZW1lbnRzIChlLmcuIGEgcGF0aCB0byBhIGRpcmVjdG9yeSksIHRoZSBuYW1lIG9mIHRoZQogICAgICAgIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSB1bnRpbCB3ZSBydW4gZWdnX2luZm8sIHNvIHRoZSBidWlsZF9sb2NhdGlvbgogICAgICAgIHdpbGwgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBhbmQgc3RvcmUgdGhlIF9pZGVhbF9idWlsZF9kaXIuCgogICAgICAgIFRoaXMgaXMgb25seSBjYWxsZWQgYnkgc2VsZi5lZ2dfaW5mb19wYXRoIHRvIGZpeCB0aGUgdGVtcG9yYXJ5IGJ1aWxkCiAgICAgICAgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuc291cmNlX2RpciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgYXNzZXJ0IHNlbGYucmVxIGlzIG5vdCBOb25lCiAgICAgICAgYXNzZXJ0IHNlbGYuX3RlbXBfYnVpbGRfZGlyCiAgICAgICAgYXNzZXJ0IHNlbGYuX2lkZWFsX2J1aWxkX2RpcgogICAgICAgIG9sZF9sb2NhdGlvbiA9IHNlbGYuX3RlbXBfYnVpbGRfZGlyCiAgICAgICAgc2VsZi5fdGVtcF9idWlsZF9kaXIgPSBOb25lCiAgICAgICAgbmV3X2xvY2F0aW9uID0gc2VsZi5idWlsZF9sb2NhdGlvbihzZWxmLl9pZGVhbF9idWlsZF9kaXIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmV3X2xvY2F0aW9uKToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnQSBwYWNrYWdlIGFscmVhZHkgZXhpc3RzIGluICVzOyBwbGVhc2UgcmVtb3ZlIGl0IHRvIGNvbnRpbnVlJwogICAgICAgICAgICAgICAgJSBkaXNwbGF5X3BhdGgobmV3X2xvY2F0aW9uKSkKICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICdNb3ZpbmcgcGFja2FnZSAlcyBmcm9tICVzIHRvIG5ldyBsb2NhdGlvbiAlcycsCiAgICAgICAgICAgIHNlbGYsIGRpc3BsYXlfcGF0aChvbGRfbG9jYXRpb24pLCBkaXNwbGF5X3BhdGgobmV3X2xvY2F0aW9uKSwKICAgICAgICApCiAgICAgICAgc2h1dGlsLm1vdmUob2xkX2xvY2F0aW9uLCBuZXdfbG9jYXRpb24pCiAgICAgICAgc2VsZi5fdGVtcF9idWlsZF9kaXIgPSBuZXdfbG9jYXRpb24KICAgICAgICBzZWxmLl9pZGVhbF9idWlsZF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5zb3VyY2VfZGlyID0gbmV3X2xvY2F0aW9uCiAgICAgICAgc2VsZi5fZWdnX2luZm9fcGF0aCA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuYW1lKHNlbGYpOgogICAgICAgIGlmIHNlbGYucmVxIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG5hdGl2ZV9zdHIocGtnX3Jlc291cmNlcy5zYWZlX25hbWUoc2VsZi5yZXEubmFtZSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2V0dXBfcHlfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuc291cmNlX2RpciwKICAgICAgICAgICAgc2VsZi5saW5rIGFuZCBzZWxmLmxpbmsuc3ViZGlyZWN0b3J5X2ZyYWdtZW50IG9yICcnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNldHVwX3B5KHNlbGYpOgogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIsICJObyBzb3VyY2UgZGlyIGZvciAlcyIgJSBzZWxmCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgc2V0dXB0b29scyAgIyBub3FhCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICBpZiBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oJ3NldHVwdG9vbHMnKSBpcyBOb25lOgogICAgICAgICAgICAgICAgYWRkX21zZyA9ICJQbGVhc2UgaW5zdGFsbCBzZXR1cHRvb2xzLiIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFkZF9tc2cgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCiAgICAgICAgICAgICMgU2V0dXB0b29scyBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBpbXBvcnQgc2V0dXB0b29scyB3aGljaCBpcyByZXF1aXJlZCB0byAiCiAgICAgICAgICAgICAgICAiaW5zdGFsbCBmcm9tIGEgc291cmNlIGRpc3RyaWJ1dGlvbi5cbiVzIiAlIGFkZF9tc2cKICAgICAgICAgICAgKQoKICAgICAgICBzZXR1cF9weSA9IG9zLnBhdGguam9pbihzZWxmLnNldHVwX3B5X2RpciwgJ3NldHVwLnB5JykKCiAgICAgICAgIyBQeXRob24yIF9fZmlsZV9fIHNob3VsZCBub3QgYmUgdW5pY29kZQogICAgICAgIGlmIHNpeC5QWTIgYW5kIGlzaW5zdGFuY2Uoc2V0dXBfcHksIHNpeC50ZXh0X3R5cGUpOgogICAgICAgICAgICBzZXR1cF9weSA9IHNldHVwX3B5LmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCgogICAgICAgIHJldHVybiBzZXR1cF9weQoKICAgIGRlZiBydW5fZWdnX2luZm8oc2VsZik6CiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpcgogICAgICAgIGlmIHNlbGYubmFtZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1J1bm5pbmcgc2V0dXAucHkgKHBhdGg6JXMpIGVnZ19pbmZvIGZvciBwYWNrYWdlICVzJywKICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBfcHksIHNlbGYubmFtZSwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdSdW5uaW5nIHNldHVwLnB5IChwYXRoOiVzKSBlZ2dfaW5mbyBmb3IgcGFja2FnZSBmcm9tICVzJywKICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBfcHksIHNlbGYubGluaywKICAgICAgICAgICAgKQoKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgc2NyaXB0ID0gU0VUVVBUT09MU19TSElNICUgc2VsZi5zZXR1cF9weQogICAgICAgICAgICBiYXNlX2NtZCA9IFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgc2NyaXB0XQogICAgICAgICAgICBpZiBzZWxmLmlzb2xhdGVkOgogICAgICAgICAgICAgICAgYmFzZV9jbWQgKz0gWyItLW5vLXVzZXItY2ZnIl0KICAgICAgICAgICAgZWdnX2luZm9fY21kID0gYmFzZV9jbWQgKyBbJ2VnZ19pbmZvJ10KICAgICAgICAgICAgIyBXZSBjYW4ndCBwdXQgdGhlIC5lZ2ctaW5mbyBmaWxlcyBhdCB0aGUgcm9vdCwgYmVjYXVzZSB0aGVuIHRoZQogICAgICAgICAgICAjIHNvdXJjZSBjb2RlIHdpbGwgYmUgbWlzdGFrZW4gZm9yIGFuIGluc3RhbGxlZCBlZ2csIGNhdXNpbmcKICAgICAgICAgICAgIyBwcm9ibGVtcwogICAgICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICAgICAgZWdnX2Jhc2Vfb3B0aW9uID0gW10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVnZ19pbmZvX2RpciA9IG9zLnBhdGguam9pbihzZWxmLnNldHVwX3B5X2RpciwgJ3BpcC1lZ2ctaW5mbycpCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKGVnZ19pbmZvX2RpcikKICAgICAgICAgICAgICAgIGVnZ19iYXNlX29wdGlvbiA9IFsnLS1lZ2ctYmFzZScsICdwaXAtZWdnLWluZm8nXQogICAgICAgICAgICBjYWxsX3N1YnByb2Nlc3MoCiAgICAgICAgICAgICAgICBlZ2dfaW5mb19jbWQgKyBlZ2dfYmFzZV9vcHRpb24sCiAgICAgICAgICAgICAgICBjd2Q9c2VsZi5zZXR1cF9weV9kaXIsCiAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgICAgIGNvbW1hbmRfZGVzYz0ncHl0aG9uIHNldHVwLnB5IGVnZ19pbmZvJykKCiAgICAgICAgaWYgbm90IHNlbGYucmVxOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlX3ZlcnNpb24oc2VsZi5wa2dfaW5mbygpWyJWZXJzaW9uIl0pLCBWZXJzaW9uKToKICAgICAgICAgICAgICAgIG9wID0gIj09IgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3AgPSAiPT09IgogICAgICAgICAgICBzZWxmLnJlcSA9IFJlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgIiIuam9pbihbCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wa2dfaW5mbygpWyJOYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgb3AsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wa2dfaW5mbygpWyJWZXJzaW9uIl0sCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuX2NvcnJlY3RfYnVpbGRfbG9jYXRpb24oKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1ldGFkYXRhX25hbWUgPSBjYW5vbmljYWxpemVfbmFtZShzZWxmLnBrZ19pbmZvKClbIk5hbWUiXSkKICAgICAgICAgICAgaWYgY2Fub25pY2FsaXplX25hbWUoc2VsZi5yZXEubmFtZSkgIT0gbWV0YWRhdGFfbmFtZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdSdW5uaW5nIHNldHVwLnB5IChwYXRoOiVzKSBlZ2dfaW5mbyBmb3IgcGFja2FnZSAlcyAnCiAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y2VkIG1ldGFkYXRhIGZvciBwcm9qZWN0IG5hbWUgJXMuIEZpeCB5b3VyICcKICAgICAgICAgICAgICAgICAgICAnI2VnZz0lcyBmcmFnbWVudHMuJywKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldHVwX3B5LCBzZWxmLm5hbWUsIG1ldGFkYXRhX25hbWUsIHNlbGYubmFtZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2VsZi5yZXEgPSBSZXF1aXJlbWVudChtZXRhZGF0YV9uYW1lKQoKICAgIGRlZiBlZ2dfaW5mb19kYXRhKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICBpZiBzZWxmLnNhdGlzZmllZF9ieSBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgbm90IHNlbGYuc2F0aXNmaWVkX2J5Lmhhc19tZXRhZGF0YShmaWxlbmFtZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICByZXR1cm4gc2VsZi5zYXRpc2ZpZWRfYnkuZ2V0X21ldGFkYXRhKGZpbGVuYW1lKQogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIKICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZWdnX2luZm9fcGF0aChmaWxlbmFtZSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGRhdGEgPSByZWFkX3RleHRfZmlsZShmaWxlbmFtZSkKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBlZ2dfaW5mb19wYXRoKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICBpZiBzZWxmLl9lZ2dfaW5mb19wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgICAgICBiYXNlID0gc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKHNlbGYuc2V0dXBfcHlfZGlyLCAncGlwLWVnZy1pbmZvJykKICAgICAgICAgICAgZmlsZW5hbWVzID0gb3MubGlzdGRpcihiYXNlKQogICAgICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICAgICAgZmlsZW5hbWVzID0gW10KICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGJhc2UpOgogICAgICAgICAgICAgICAgICAgIGZvciBkaXIgaW4gdmNzLmRpcm5hbWVzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBkaXIgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMucmVtb3ZlKGRpcikKICAgICAgICAgICAgICAgICAgICAjIEl0ZXJhdGUgb3ZlciBhIGNvcHkgb2YgYGBkaXJzYGAsIHNpbmNlIG11dGF0aW5nCiAgICAgICAgICAgICAgICAgICAgIyBhIGxpc3Qgd2hpbGUgaXRlcmF0aW5nIG92ZXIgaXQgY2FuIGNhdXNlIHRyb3VibGUuCiAgICAgICAgICAgICAgICAgICAgIyAoU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9wdWxsLzQ2Mi4pCiAgICAgICAgICAgICAgICAgICAgZm9yIGRpciBpbiBsaXN0KGRpcnMpOgogICAgICAgICAgICAgICAgICAgICAgICAjIERvbid0IHNlYXJjaCBpbiBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSB2aXJ0dWFsZW52CiAgICAgICAgICAgICAgICAgICAgICAgICMgZW52aXJvbm1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgubGV4aXN0cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHJvb3QsIGRpciwgJ2JpbicsICdweXRob24nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCwgZGlyLCAnU2NyaXB0cycsICdQeXRob24uZXhlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzLnJlbW92ZShkaXIpCiAgICAgICAgICAgICAgICAgICAgICAgICMgQWxzbyBkb24ndCBzZWFyY2ggdGhyb3VnaCB0ZXN0cwogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGRpciA9PSAndGVzdCcgb3IgZGlyID09ICd0ZXN0cyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzLnJlbW92ZShkaXIpCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVzLmV4dGVuZChbb3MucGF0aC5qb2luKHJvb3QsIGRpcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkaXIgaW4gZGlyc10pCiAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBbZiBmb3IgZiBpbiBmaWxlbmFtZXMgaWYgZi5lbmRzd2l0aCgnLmVnZy1pbmZvJyldCgogICAgICAgICAgICBpZiBub3QgZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ05vIGZpbGVzL2RpcmVjdG9yaWVzIGluICVzIChmcm9tICVzKScgJSAoYmFzZSwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGFzc2VydCBmaWxlbmFtZXMsIFwKICAgICAgICAgICAgICAgICJObyBmaWxlcy9kaXJlY3RvcmllcyBpbiAlcyAoZnJvbSAlcykiICUgKGJhc2UsIGZpbGVuYW1lKQoKICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgbWF0Y2gsIHdlIHBpY2sgdGhlIHRvcGxldmVsIG9uZS4gIFRoaXMKICAgICAgICAgICAgIyBjYW4gZWFzaWx5IGJlIHRoZSBjYXNlIGlmIHRoZXJlIGlzIGEgZGlzdCBmb2xkZXIgd2hpY2ggY29udGFpbnMKICAgICAgICAgICAgIyBhbiBleHRyYWN0ZWQgdGFyYmFsbCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KICAgICAgICAgICAgaWYgbGVuKGZpbGVuYW1lcykgPiAxOgogICAgICAgICAgICAgICAgZmlsZW5hbWVzLnNvcnQoCiAgICAgICAgICAgICAgICAgICAga2V5PWxhbWJkYSB4OiB4LmNvdW50KG9zLnBhdGguc2VwKSArCiAgICAgICAgICAgICAgICAgICAgKG9zLnBhdGguYWx0c2VwIGFuZCB4LmNvdW50KG9zLnBhdGguYWx0c2VwKSBvciAwKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLl9lZ2dfaW5mb19wYXRoID0gb3MucGF0aC5qb2luKGJhc2UsIGZpbGVuYW1lc1swXSkKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuX2VnZ19pbmZvX3BhdGgsIGZpbGVuYW1lKQoKICAgIGRlZiBwa2dfaW5mbyhzZWxmKToKICAgICAgICBwID0gRmVlZFBhcnNlcigpCiAgICAgICAgZGF0YSA9IHNlbGYuZWdnX2luZm9fZGF0YSgnUEtHLUlORk8nKQogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdObyBQS0ctSU5GTyBmaWxlIGZvdW5kIGluICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChzZWxmLmVnZ19pbmZvX3BhdGgoJ1BLRy1JTkZPJykpLAogICAgICAgICAgICApCiAgICAgICAgcC5mZWVkKGRhdGEgb3IgJycpCiAgICAgICAgcmV0dXJuIHAuY2xvc2UoKQoKICAgIF9yZXF1aXJlbWVudHNfc2VjdGlvbl9yZSA9IHJlLmNvbXBpbGUocidcWyguKj8pXF0nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGluc3RhbGxlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oc2VsZi5uYW1lKQoKICAgIGRlZiBhc3NlcnRfc291cmNlX21hdGNoZXNfdmVyc2lvbihzZWxmKToKICAgICAgICBhc3NlcnQgc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgdmVyc2lvbiA9IHNlbGYucGtnX2luZm8oKVsndmVyc2lvbiddCiAgICAgICAgaWYgc2VsZi5yZXEuc3BlY2lmaWVyIGFuZCB2ZXJzaW9uIG5vdCBpbiBzZWxmLnJlcS5zcGVjaWZpZXI6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ1JlcXVlc3RlZCAlcywgYnV0IGluc3RhbGxpbmcgdmVyc2lvbiAlcycsCiAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsZWRfdmVyc2lvbiwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdTb3VyY2UgaW4gJXMgaGFzIHZlcnNpb24gJXMsIHdoaWNoIHNhdGlzZmllcyByZXF1aXJlbWVudCAlcycsCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoc2VsZi5zb3VyY2VfZGlyKSwKICAgICAgICAgICAgICAgIHZlcnNpb24sCiAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICApCgogICAgZGVmIHVwZGF0ZV9lZGl0YWJsZShzZWxmLCBvYnRhaW49VHJ1ZSk6CiAgICAgICAgaWYgbm90IHNlbGYubGluazoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgIkNhbm5vdCB1cGRhdGUgcmVwb3NpdG9yeSBhdCAlczsgcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyAiCiAgICAgICAgICAgICAgICAidW5rbm93biIsCiAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZV9kaXIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgYXNzZXJ0IHNlbGYuZWRpdGFibGUKICAgICAgICBhc3NlcnQgc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgaWYgc2VsZi5saW5rLnNjaGVtZSA9PSAnZmlsZSc6CiAgICAgICAgICAgICMgU3RhdGljIHBhdGhzIGRvbid0IGdldCB1cGRhdGVkCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGFzc2VydCAnKycgaW4gc2VsZi5saW5rLnVybCwgImJhZCB1cmw6ICVyIiAlIHNlbGYubGluay51cmwKICAgICAgICBpZiBub3Qgc2VsZi51cGRhdGU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHZjX3R5cGUsIHVybCA9IHNlbGYubGluay51cmwuc3BsaXQoJysnLCAxKQogICAgICAgIGJhY2tlbmQgPSB2Y3MuZ2V0X2JhY2tlbmQodmNfdHlwZSkKICAgICAgICBpZiBiYWNrZW5kOgogICAgICAgICAgICB2Y3NfYmFja2VuZCA9IGJhY2tlbmQoc2VsZi5saW5rLnVybCkKICAgICAgICAgICAgaWYgb2J0YWluOgogICAgICAgICAgICAgICAgdmNzX2JhY2tlbmQub2J0YWluKHNlbGYuc291cmNlX2RpcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZjc19iYWNrZW5kLmV4cG9ydChzZWxmLnNvdXJjZV9kaXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IDAsICgKICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIHZlcnNpb24gY29udHJvbCB0eXBlIChpbiAlcyk6ICVzJwogICAgICAgICAgICAgICAgJSAoc2VsZi5saW5rLCB2Y190eXBlKSkKCiAgICBkZWYgdW5pbnN0YWxsKHNlbGYsIGF1dG9fY29uZmlybT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgVW5pbnN0YWxsIHRoZSBkaXN0cmlidXRpb24gY3VycmVudGx5IHNhdGlzZnlpbmcgdGhpcyByZXF1aXJlbWVudC4KCiAgICAgICAgUHJvbXB0cyBiZWZvcmUgcmVtb3Zpbmcgb3IgbW9kaWZ5aW5nIGZpbGVzIHVubGVzcwogICAgICAgIGBgYXV0b19jb25maXJtYGAgaXMgVHJ1ZS4KCiAgICAgICAgUmVmdXNlcyB0byBkZWxldGUgb3IgbW9kaWZ5IGZpbGVzIG91dHNpZGUgb2YgYGBzeXMucHJlZml4YGAgLQogICAgICAgIHRodXMgdW5pbnN0YWxsYXRpb24gd2l0aGluIGEgdmlydHVhbCBlbnZpcm9ubWVudCBjYW4gb25seQogICAgICAgIG1vZGlmeSB0aGF0IHZpcnR1YWwgZW52aXJvbm1lbnQsIGV2ZW4gaWYgdGhlIHZpcnR1YWxlbnYgaXMKICAgICAgICBsaW5rZWQgdG8gZ2xvYmFsIHNpdGUtcGFja2FnZXMuCgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX2lmX2V4aXN0cygpOgogICAgICAgICAgICByYWlzZSBVbmluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCB1bmluc3RhbGwgcmVxdWlyZW1lbnQgJXMsIG5vdCBpbnN0YWxsZWQiICUgKHNlbGYubmFtZSwpCiAgICAgICAgICAgICkKICAgICAgICBkaXN0ID0gc2VsZi5zYXRpc2ZpZWRfYnkgb3Igc2VsZi5jb25mbGljdHNfd2l0aAoKICAgICAgICBkaXN0X3BhdGggPSBub3JtYWxpemVfcGF0aChkaXN0LmxvY2F0aW9uKQogICAgICAgIGlmIG5vdCBkaXN0X2lzX2xvY2FsKGRpc3QpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJOb3QgdW5pbnN0YWxsaW5nICVzIGF0ICVzLCBvdXRzaWRlIGVudmlyb25tZW50ICVzIiwKICAgICAgICAgICAgICAgIGRpc3Qua2V5LAogICAgICAgICAgICAgICAgZGlzdF9wYXRoLAogICAgICAgICAgICAgICAgc3lzLnByZWZpeCwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLm5vdGhpbmdfdG9fdW5pbnN0YWxsID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgZGlzdF9wYXRoIGluIGdldF9zdGRsaWIoKToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAiTm90IHVuaW5zdGFsbGluZyAlcyBhdCAlcywgYXMgaXQgaXMgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkuIiwKICAgICAgICAgICAgICAgIGRpc3Qua2V5LAogICAgICAgICAgICAgICAgZGlzdF9wYXRoLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubm90aGluZ190b191bmluc3RhbGwgPSBUcnVlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBwYXRoc190b19yZW1vdmUgPSBVbmluc3RhbGxQYXRoU2V0KGRpc3QpCiAgICAgICAgZGV2ZWxvcF9lZ2dfbGluayA9IGVnZ19saW5rX3BhdGgoZGlzdCkKICAgICAgICBkZXZlbG9wX2VnZ19saW5rX2VnZ19pbmZvID0gJ3swfS5lZ2ctaW5mbycuZm9ybWF0KAogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnRvX2ZpbGVuYW1lKGRpc3QucHJvamVjdF9uYW1lKSkKICAgICAgICBlZ2dfaW5mb19leGlzdHMgPSBkaXN0LmVnZ19pbmZvIGFuZCBvcy5wYXRoLmV4aXN0cyhkaXN0LmVnZ19pbmZvKQogICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciBkaXN0dXRpbHMgaW5zdGFsbGVkIHBhY2thZ2UKICAgICAgICBkaXN0dXRpbHNfZWdnX2luZm8gPSBnZXRhdHRyKGRpc3QuX3Byb3ZpZGVyLCAncGF0aCcsIE5vbmUpCgogICAgICAgICMgVW5pbnN0YWxsIGNhc2VzIG9yZGVyIGRvIG1hdHRlciBhcyBpbiB0aGUgY2FzZSBvZiAyIGluc3RhbGxzIG9mIHRoZQogICAgICAgICMgc2FtZSBwYWNrYWdlLCBwaXAgbmVlZHMgdG8gdW5pbnN0YWxsIHRoZSBjdXJyZW50bHkgZGV0ZWN0ZWQgdmVyc2lvbgogICAgICAgIGlmIChlZ2dfaW5mb19leGlzdHMgYW5kIGRpc3QuZWdnX2luZm8uZW5kc3dpdGgoJy5lZ2ctaW5mbycpIGFuZAogICAgICAgICAgICAgICAgbm90IGRpc3QuZWdnX2luZm8uZW5kc3dpdGgoZGV2ZWxvcF9lZ2dfbGlua19lZ2dfaW5mbykpOgogICAgICAgICAgICAjIGlmIGRpc3QuZWdnX2luZm8uZW5kc3dpdGgoZGV2ZWxvcF9lZ2dfbGlua19lZ2dfaW5mbyksIHdlCiAgICAgICAgICAgICMgYXJlIGluIGZhY3QgaW4gdGhlIGRldmVsb3BfZWdnX2xpbmsgY2FzZQogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKGRpc3QuZWdnX2luZm8pCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdpbnN0YWxsZWQtZmlsZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBmb3IgaW5zdGFsbGVkX2ZpbGUgaW4gZGlzdC5nZXRfbWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsZWQtZmlsZXMudHh0Jykuc3BsaXRsaW5lcygpOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdC5lZ2dfaW5mbywgaW5zdGFsbGVkX2ZpbGUpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCkKICAgICAgICAgICAgIyBGSVhNRTogbmVlZCBhIHRlc3QgZm9yIHRoaXMgZWxpZiBibG9jawogICAgICAgICAgICAjIG9jY3VycyB3aXRoIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkLy0tcmVjb3JkIG91dHNpZGUKICAgICAgICAgICAgIyBvZiBwaXAKICAgICAgICAgICAgZWxpZiBkaXN0Lmhhc19tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKToKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzID0gZGlzdC5nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzID0gW10KICAgICAgICAgICAgICAgIGZvciB0b3BfbGV2ZWxfcGtnIGluIFsKICAgICAgICAgICAgICAgICAgICAgICAgcCBmb3IgcAogICAgICAgICAgICAgICAgICAgICAgICBpbiBkaXN0LmdldF9tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpLnNwbGl0bGluZXMoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBwIGFuZCBwIG5vdCBpbiBuYW1lc3BhY2VzXToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpc3QubG9jYXRpb24sIHRvcF9sZXZlbF9wa2cpCiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoKQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCArICcucHknKQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCArICcucHljJykKICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKHBhdGggKyAnLnB5bycpCgogICAgICAgIGVsaWYgZGlzdHV0aWxzX2VnZ19pbmZvOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlVuaW5zdGFsbGluZyBhIGRpc3R1dGlscyBpbnN0YWxsZWQgcHJvamVjdCAoezB9KSBoYXMgYmVlbiAiCiAgICAgICAgICAgICAgICAiZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFRoaXMgaXMgIgogICAgICAgICAgICAgICAgImR1ZSB0byB0aGUgZmFjdCB0aGF0IHVuaW5zdGFsbGluZyBhIGRpc3R1dGlscyBwcm9qZWN0IHdpbGwgIgogICAgICAgICAgICAgICAgIm9ubHkgcGFydGlhbGx5IHVuaW5zdGFsbCB0aGUgcHJvamVjdC4iLmZvcm1hdChzZWxmLm5hbWUpLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoZGlzdHV0aWxzX2VnZ19pbmZvKQoKICAgICAgICBlbGlmIGRpc3QubG9jYXRpb24uZW5kc3dpdGgoJy5lZ2cnKToKICAgICAgICAgICAgIyBwYWNrYWdlIGluc3RhbGxlZCBieSBlYXN5X2luc3RhbGwKICAgICAgICAgICAgIyBXZSBjYW5ub3QgbWF0Y2ggb24gZGlzdC5lZ2dfbmFtZSBiZWNhdXNlIGl0IGNhbiBzbGlnaHRseSB2YXJ5CiAgICAgICAgICAgICMgaS5lLiBzZXR1cHRvb2xzLTAuNmMxMS1weTIuNi5lZ2cgdnMgc2V0dXB0b29scy0wLjZyYzExLXB5Mi42LmVnZwogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKGRpc3QubG9jYXRpb24pCiAgICAgICAgICAgIGVhc3lfaW5zdGFsbF9lZ2cgPSBvcy5wYXRoLnNwbGl0KGRpc3QubG9jYXRpb24pWzFdCiAgICAgICAgICAgIGVhc3lfaW5zdGFsbF9wdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGRpc3QubG9jYXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlYXN5LWluc3RhbGwucHRoJykKICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZF9wdGgoZWFzeV9pbnN0YWxsX3B0aCwgJy4vJyArIGVhc3lfaW5zdGFsbF9lZ2cpCgogICAgICAgIGVsaWYgZWdnX2luZm9fZXhpc3RzIGFuZCBkaXN0LmVnZ19pbmZvLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgIGZvciBwYXRoIGluIHBpcC53aGVlbC51bmluc3RhbGxhdGlvbl9wYXRocyhkaXN0KToKICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCkKCiAgICAgICAgZWxpZiBkZXZlbG9wX2VnZ19saW5rOgogICAgICAgICAgICAjIGRldmVsb3AgZWdnCiAgICAgICAgICAgIHdpdGggb3BlbihkZXZlbG9wX2VnZ19saW5rLCAncicpIGFzIGZoOgogICAgICAgICAgICAgICAgbGlua19wb2ludGVyID0gb3MucGF0aC5ub3JtY2FzZShmaC5yZWFkbGluZSgpLnN0cmlwKCkpCiAgICAgICAgICAgIGFzc2VydCAobGlua19wb2ludGVyID09IGRpc3QubG9jYXRpb24pLCAoCiAgICAgICAgICAgICAgICAnRWdnLWxpbmsgJXMgZG9lcyBub3QgbWF0Y2ggaW5zdGFsbGVkIGxvY2F0aW9uIG9mICVzICcKICAgICAgICAgICAgICAgICcoYXQgJXMpJyAlIChsaW5rX3BvaW50ZXIsIHNlbGYubmFtZSwgZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgKQogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKGRldmVsb3BfZWdnX2xpbmspCiAgICAgICAgICAgIGVhc3lfaW5zdGFsbF9wdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGRldmVsb3BfZWdnX2xpbmspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlYXN5LWluc3RhbGwucHRoJykKICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZF9wdGgoZWFzeV9pbnN0YWxsX3B0aCwgZGlzdC5sb2NhdGlvbikKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ05vdCBzdXJlIGhvdyB0byB1bmluc3RhbGw6ICVzIC0gQ2hlY2s6ICVzJywKICAgICAgICAgICAgICAgIGRpc3QsIGRpc3QubG9jYXRpb24pCgogICAgICAgICMgZmluZCBkaXN0dXRpbHMgc2NyaXB0cz0gc2NyaXB0cwogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdzY3JpcHRzJykgYW5kIGRpc3QubWV0YWRhdGFfaXNkaXIoJ3NjcmlwdHMnKToKICAgICAgICAgICAgZm9yIHNjcmlwdCBpbiBkaXN0Lm1ldGFkYXRhX2xpc3RkaXIoJ3NjcmlwdHMnKToKICAgICAgICAgICAgICAgIGlmIGRpc3RfaW5fdXNlcnNpdGUoZGlzdCk6CiAgICAgICAgICAgICAgICAgICAgYmluX2RpciA9IGJpbl91c2VyCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGJpbl9kaXIgPSBiaW5fcHkKICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQob3MucGF0aC5qb2luKGJpbl9kaXIsIHNjcmlwdCkpCiAgICAgICAgICAgICAgICBpZiBXSU5ET1dTOgogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQob3MucGF0aC5qb2luKGJpbl9kaXIsIHNjcmlwdCkgKyAnLmJhdCcpCgogICAgICAgICMgZmluZCBjb25zb2xlX3NjcmlwdHMKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZW50cnlfcG9pbnRzLnR4dCcpOgogICAgICAgICAgICBpZiBzaXguUFkyOgogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcHRpb25zID0geyJkZWxpbWl0ZXJzIjogKCc9JywgKX0KICAgICAgICAgICAgY29uZmlnID0gY29uZmlncGFyc2VyLlNhZmVDb25maWdQYXJzZXIoKipvcHRpb25zKQogICAgICAgICAgICBjb25maWcucmVhZGZwKAogICAgICAgICAgICAgICAgRmFrZUZpbGUoZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2VudHJ5X3BvaW50cy50eHQnKSkKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBjb25maWcuaGFzX3NlY3Rpb24oJ2NvbnNvbGVfc2NyaXB0cycpOgogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGNvbmZpZy5pdGVtcygnY29uc29sZV9zY3JpcHRzJyk6CiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdF9pbl91c2Vyc2l0ZShkaXN0KToKICAgICAgICAgICAgICAgICAgICAgICAgYmluX2RpciA9IGJpbl91c2VyCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYmluX2RpciA9IGJpbl9weQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQob3MucGF0aC5qb2luKGJpbl9kaXIsIG5hbWUpKQogICAgICAgICAgICAgICAgICAgIGlmIFdJTkRPV1M6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYmluX2RpciwgbmFtZSkgKyAnLmV4ZScKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGJpbl9kaXIsIG5hbWUpICsgJy5leGUubWFuaWZlc3QnCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihiaW5fZGlyLCBuYW1lKSArICctc2NyaXB0LnB5JwogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgIHBhdGhzX3RvX3JlbW92ZS5yZW1vdmUoYXV0b19jb25maXJtKQogICAgICAgIHNlbGYudW5pbnN0YWxsZWQgPSBwYXRoc190b19yZW1vdmUKCiAgICBkZWYgcm9sbGJhY2tfdW5pbnN0YWxsKHNlbGYpOgogICAgICAgIGlmIHNlbGYudW5pbnN0YWxsZWQ6CiAgICAgICAgICAgIHNlbGYudW5pbnN0YWxsZWQucm9sbGJhY2soKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCByb2xsYmFjayAlcywgbm90aGluZyB1bmluc3RhbGxlZC4iLCBzZWxmLm5hbWUsCiAgICAgICAgICAgICkKCiAgICBkZWYgY29tbWl0X3VuaW5zdGFsbChzZWxmKToKICAgICAgICBpZiBzZWxmLnVuaW5zdGFsbGVkOgogICAgICAgICAgICBzZWxmLnVuaW5zdGFsbGVkLmNvbW1pdCgpCiAgICAgICAgZWxpZiBub3Qgc2VsZi5ub3RoaW5nX3RvX3VuaW5zdGFsbDoKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IGNvbW1pdCAlcywgbm90aGluZyB1bmluc3RhbGxlZC4iLCBzZWxmLm5hbWUsCiAgICAgICAgICAgICkKCiAgICBkZWYgYXJjaGl2ZShzZWxmLCBidWlsZF9kaXIpOgogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIKICAgICAgICBjcmVhdGVfYXJjaGl2ZSA9IFRydWUKICAgICAgICBhcmNoaXZlX25hbWUgPSAnJXMtJXMuemlwJyAlIChzZWxmLm5hbWUsIHNlbGYucGtnX2luZm8oKVsidmVyc2lvbiJdKQogICAgICAgIGFyY2hpdmVfcGF0aCA9IG9zLnBhdGguam9pbihidWlsZF9kaXIsIGFyY2hpdmVfbmFtZSkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhhcmNoaXZlX3BhdGgpOgogICAgICAgICAgICByZXNwb25zZSA9IGFza19wYXRoX2V4aXN0cygKICAgICAgICAgICAgICAgICdUaGUgZmlsZSAlcyBleGlzdHMuIChpKWdub3JlLCAodylpcGUsIChiKWFja3VwLCAoYSlib3J0ICcgJQogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGFyY2hpdmVfcGF0aCksICgnaScsICd3JywgJ2InLCAnYScpKQogICAgICAgICAgICBpZiByZXNwb25zZSA9PSAnaSc6CiAgICAgICAgICAgICAgICBjcmVhdGVfYXJjaGl2ZSA9IEZhbHNlCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ3cnOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RlbGV0aW5nICVzJywgZGlzcGxheV9wYXRoKGFyY2hpdmVfcGF0aCkpCiAgICAgICAgICAgICAgICBvcy5yZW1vdmUoYXJjaGl2ZV9wYXRoKQogICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdiJzoKICAgICAgICAgICAgICAgIGRlc3RfZmlsZSA9IGJhY2t1cF9kaXIoYXJjaGl2ZV9wYXRoKQogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ0JhY2tpbmcgdXAgJXMgdG8gJXMnLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChhcmNoaXZlX3BhdGgpLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0X2ZpbGUpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2h1dGlsLm1vdmUoYXJjaGl2ZV9wYXRoLCBkZXN0X2ZpbGUpCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2EnOgogICAgICAgICAgICAgICAgc3lzLmV4aXQoLTEpCiAgICAgICAgaWYgY3JlYXRlX2FyY2hpdmU6CiAgICAgICAgICAgIHppcCA9IHppcGZpbGUuWmlwRmlsZSgKICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aCwgJ3cnLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCwKICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZQogICAgICAgICAgICApCiAgICAgICAgICAgIGRpciA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKHNlbGYuc2V0dXBfcHlfZGlyKSkKICAgICAgICAgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhkaXIpOgogICAgICAgICAgICAgICAgaWYgJ3BpcC1lZ2ctaW5mbycgaW4gZGlybmFtZXM6CiAgICAgICAgICAgICAgICAgICAgZGlybmFtZXMucmVtb3ZlKCdwaXAtZWdnLWluZm8nKQogICAgICAgICAgICAgICAgZm9yIGRpcm5hbWUgaW4gZGlybmFtZXM6CiAgICAgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBkaXJuYW1lKQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLl9jbGVhbl96aXBfbmFtZShkaXJuYW1lLCBkaXIpCiAgICAgICAgICAgICAgICAgICAgemlwZGlyID0gemlwZmlsZS5aaXBJbmZvKHNlbGYubmFtZSArICcvJyArIG5hbWUgKyAnLycpCiAgICAgICAgICAgICAgICAgICAgemlwZGlyLmV4dGVybmFsX2F0dHIgPSAweDFFRCA8PCAxNiAgIyAwbzc1NQogICAgICAgICAgICAgICAgICAgIHppcC53cml0ZXN0cih6aXBkaXIsICcnKQogICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5fY2xlYW5femlwX25hbWUoZmlsZW5hbWUsIGRpcikKICAgICAgICAgICAgICAgICAgICB6aXAud3JpdGUoZmlsZW5hbWUsIHNlbGYubmFtZSArICcvJyArIG5hbWUpCiAgICAgICAgICAgIHppcC5jbG9zZSgpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdTYXZlZCAlcycsIGRpc3BsYXlfcGF0aChhcmNoaXZlX3BhdGgpKQoKICAgIGRlZiBfY2xlYW5femlwX25hbWUoc2VsZiwgbmFtZSwgcHJlZml4KToKICAgICAgICBhc3NlcnQgbmFtZS5zdGFydHN3aXRoKHByZWZpeCArIG9zLnBhdGguc2VwKSwgKAogICAgICAgICAgICAibmFtZSAlciBkb2Vzbid0IHN0YXJ0IHdpdGggcHJlZml4ICVyIiAlIChuYW1lLCBwcmVmaXgpCiAgICAgICAgKQogICAgICAgIG5hbWUgPSBuYW1lW2xlbihwcmVmaXgpICsgMTpdCiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKQogICAgICAgIHJldHVybiBuYW1lCgogICAgZGVmIG1hdGNoX21hcmtlcnMoc2VsZiwgZXh0cmFzX3JlcXVlc3RlZD1Ob25lKToKICAgICAgICBpZiBub3QgZXh0cmFzX3JlcXVlc3RlZDoKICAgICAgICAgICAgIyBQcm92aWRlIGFuIGV4dHJhIHRvIHNhZmVseSBldmFsdWF0ZSB0aGUgbWFya2VycwogICAgICAgICAgICAjIHdpdGhvdXQgbWF0Y2hpbmcgYW55IGV4dHJhCiAgICAgICAgICAgIGV4dHJhc19yZXF1ZXN0ZWQgPSAoJycsKQogICAgICAgIGlmIHNlbGYubWFya2VycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGFueSgKICAgICAgICAgICAgICAgIHNlbGYubWFya2Vycy5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KQogICAgICAgICAgICAgICAgZm9yIGV4dHJhIGluIGV4dHJhc19yZXF1ZXN0ZWQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBpbnN0YWxsX29wdGlvbnMsIGdsb2JhbF9vcHRpb25zPVtdLCByb290PU5vbmUsCiAgICAgICAgICAgICAgICBwcmVmaXg9Tm9uZSk6CiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2VkaXRhYmxlKAogICAgICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLCBnbG9iYWxfb3B0aW9ucywgcHJlZml4PXByZWZpeCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgc2VsZi5pc193aGVlbDoKICAgICAgICAgICAgdmVyc2lvbiA9IHBpcC53aGVlbC53aGVlbF92ZXJzaW9uKHNlbGYuc291cmNlX2RpcikKICAgICAgICAgICAgcGlwLndoZWVsLmNoZWNrX2NvbXBhdGliaWxpdHkodmVyc2lvbiwgc2VsZi5uYW1lKQoKICAgICAgICAgICAgc2VsZi5tb3ZlX3doZWVsX2ZpbGVzKHNlbGYuc291cmNlX2Rpciwgcm9vdD1yb290LCBwcmVmaXg9cHJlZml4KQogICAgICAgICAgICBzZWxmLmluc3RhbGxfc3VjY2VlZGVkID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBFeHRlbmQgdGhlIGxpc3Qgb2YgZ2xvYmFsIGFuZCBpbnN0YWxsIG9wdGlvbnMgcGFzc2VkIG9uIHRvCiAgICAgICAgIyB0aGUgc2V0dXAucHkgY2FsbCB3aXRoIHRoZSBvbmVzIGZyb20gdGhlIHJlcXVpcmVtZW50cyBmaWxlLgogICAgICAgICMgT3B0aW9ucyBzcGVjaWZpZWQgaW4gcmVxdWlyZW1lbnRzIGZpbGUgb3ZlcnJpZGUgdGhvc2UKICAgICAgICAjIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBzaW5jZSB0aGUgbGFzdCBvcHRpb24gZ2l2ZW4KICAgICAgICAjIHRvIHNldHVwLnB5IGlzIHRoZSBvbmUgdGhhdCBpcyB1c2VkLgogICAgICAgIGdsb2JhbF9vcHRpb25zICs9IHNlbGYub3B0aW9ucy5nZXQoJ2dsb2JhbF9vcHRpb25zJywgW10pCiAgICAgICAgaW5zdGFsbF9vcHRpb25zICs9IHNlbGYub3B0aW9ucy5nZXQoJ2luc3RhbGxfb3B0aW9ucycsIFtdKQoKICAgICAgICBpZiBzZWxmLmlzb2xhdGVkOgogICAgICAgICAgICBnbG9iYWxfb3B0aW9ucyA9IGxpc3QoZ2xvYmFsX29wdGlvbnMpICsgWyItLW5vLXVzZXItY2ZnIl0KCiAgICAgICAgdGVtcF9sb2NhdGlvbiA9IHRlbXBmaWxlLm1rZHRlbXAoJy1yZWNvcmQnLCAncGlwLScpCiAgICAgICAgcmVjb3JkX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRlbXBfbG9jYXRpb24sICdpbnN0YWxsLXJlY29yZC50eHQnKQogICAgICAgIHRyeToKICAgICAgICAgICAgaW5zdGFsbF9hcmdzID0gc2VsZi5nZXRfaW5zdGFsbF9hcmdzKAogICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMsIHJlY29yZF9maWxlbmFtZSwgcm9vdCwgcHJlZml4KQogICAgICAgICAgICBtc2cgPSAnUnVubmluZyBzZXR1cC5weSBpbnN0YWxsIGZvciAlcycgJSAoc2VsZi5uYW1lLCkKICAgICAgICAgICAgd2l0aCBvcGVuX3NwaW5uZXIobXNnKSBhcyBzcGlubmVyOgogICAgICAgICAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICAgICAgICAgY2FsbF9zdWJwcm9jZXNzKAogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKyBpbnN0YWxsX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnNldHVwX3B5X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5uZXI9c3Bpbm5lciwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVjb3JkX2ZpbGVuYW1lKToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVjb3JkIGZpbGUgJXMgbm90IGZvdW5kJywgcmVjb3JkX2ZpbGVuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zdWNjZWVkZWQgPSBUcnVlCiAgICAgICAgICAgIGlmIHNlbGYuYXNfZWdnOgogICAgICAgICAgICAgICAgIyB0aGVyZSdzIG5vIC0tYWx3YXlzLXVuemlwIG9wdGlvbiB3ZSBjYW4gcGFzcyB0byBpbnN0YWxsCiAgICAgICAgICAgICAgICAjIGNvbW1hbmQgc28gd2UgdW5hYmxlIHRvIHNhdmUgdGhlIGluc3RhbGxlZC1maWxlcy50eHQKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgZGVmIHByZXBlbmRfcm9vdChwYXRoKToKICAgICAgICAgICAgICAgIGlmIHJvb3QgaXMgTm9uZSBvciBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlX3Jvb3Qocm9vdCwgcGF0aCkKCiAgICAgICAgICAgIHdpdGggb3BlbihyZWNvcmRfZmlsZW5hbWUpIGFzIGY6CiAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZShsaW5lKQogICAgICAgICAgICAgICAgICAgIGlmIGRpcmVjdG9yeS5lbmRzd2l0aCgnLmVnZy1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGVnZ19pbmZvX2RpciA9IHByZXBlbmRfcm9vdChkaXJlY3RvcnkpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGZpbmQgLmVnZy1pbmZvIGRpcmVjdG9yeSBpbiBpbnN0YWxsIHJlY29yZCcKICAgICAgICAgICAgICAgICAgICAgICAgJyBmb3IgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiBwdXQgdGhlIHJlY29yZCBzb21ld2hlcmUKICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBhbiBlcnJvcj8KICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgbmV3X2xpbmVzID0gW10KICAgICAgICAgICAgd2l0aCBvcGVuKHJlY29yZF9maWxlbmFtZSkgYXMgZjoKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgKz0gb3MucGF0aC5zZXAKICAgICAgICAgICAgICAgICAgICBuZXdfbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnJlbHBhdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kX3Jvb3QoZmlsZW5hbWUpLCBlZ2dfaW5mb19kaXIpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpbnN0X2ZpbGVzX3BhdGggPSBvcy5wYXRoLmpvaW4oZWdnX2luZm9fZGlyLCAnaW5zdGFsbGVkLWZpbGVzLnR4dCcpCiAgICAgICAgICAgIHdpdGggb3BlbihpbnN0X2ZpbGVzX3BhdGgsICd3JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKG5ld19saW5lcykgKyAnXG4nKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlY29yZF9maWxlbmFtZSk6CiAgICAgICAgICAgICAgICBvcy5yZW1vdmUocmVjb3JkX2ZpbGVuYW1lKQogICAgICAgICAgICBybXRyZWUodGVtcF9sb2NhdGlvbikKCiAgICBkZWYgZW5zdXJlX2hhc19zb3VyY2VfZGlyKHNlbGYsIHBhcmVudF9kaXIpOgogICAgICAgICIiIkVuc3VyZSB0aGF0IGEgc291cmNlX2RpciBpcyBzZXQuCgogICAgICAgIFRoaXMgd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgYnVpbGQgZGlyIGlmIHRoZSBuYW1lIG9mIHRoZSByZXF1aXJlbWVudAogICAgICAgIGlzbid0IGtub3duIHlldC4KCiAgICAgICAgOnBhcmFtIHBhcmVudF9kaXI6IFRoZSBpZGVhbCBwaXAgcGFyZW50X2RpciBmb3IgdGhlIHNvdXJjZV9kaXIuCiAgICAgICAgICAgIEdlbmVyYWxseSBzcmNfZGlyIGZvciBlZGl0YWJsZXMgYW5kIGJ1aWxkX2RpciBmb3Igc2Rpc3RzLgogICAgICAgIDpyZXR1cm46IHNlbGYuc291cmNlX2RpcgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuc291cmNlX2RpciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnNvdXJjZV9kaXIgPSBzZWxmLmJ1aWxkX2xvY2F0aW9uKHBhcmVudF9kaXIpCiAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlX2RpcgoKICAgIGRlZiBnZXRfaW5zdGFsbF9hcmdzKHNlbGYsIGdsb2JhbF9vcHRpb25zLCByZWNvcmRfZmlsZW5hbWUsIHJvb3QsIHByZWZpeCk6CiAgICAgICAgaW5zdGFsbF9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCAiLXUiXQogICAgICAgIGluc3RhbGxfYXJncy5hcHBlbmQoJy1jJykKICAgICAgICBpbnN0YWxsX2FyZ3MuYXBwZW5kKFNFVFVQVE9PTFNfU0hJTSAlIHNlbGYuc2V0dXBfcHkpCiAgICAgICAgaW5zdGFsbF9hcmdzICs9IGxpc3QoZ2xvYmFsX29wdGlvbnMpICsgXAogICAgICAgICAgICBbJ2luc3RhbGwnLCAnLS1yZWNvcmQnLCByZWNvcmRfZmlsZW5hbWVdCgogICAgICAgIGlmIG5vdCBzZWxmLmFzX2VnZzoKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsnLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQnXQoKICAgICAgICBpZiByb290IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyctLXJvb3QnLCByb290XQogICAgICAgIGlmIHByZWZpeCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsnLS1wcmVmaXgnLCBwcmVmaXhdCgogICAgICAgIGlmIHNlbGYucHljb21waWxlOgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyItLWNvbXBpbGUiXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGluc3RhbGxfYXJncyArPSBbIi0tbm8tY29tcGlsZSJdCgogICAgICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgICAgICBweV92ZXJfc3RyID0gJ3B5dGhvbicgKyBzeXNjb25maWcuZ2V0X3B5dGhvbl92ZXJzaW9uKCkKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsnLS1pbnN0YWxsLWhlYWRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnaW5jbHVkZScsICdzaXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfdmVyX3N0ciwgc2VsZi5uYW1lKV0KCiAgICAgICAgcmV0dXJuIGluc3RhbGxfYXJncwoKICAgIGRlZiByZW1vdmVfdGVtcG9yYXJ5X3NvdXJjZShzZWxmKToKICAgICAgICAiIiJSZW1vdmUgdGhlIHNvdXJjZSBmaWxlcyBmcm9tIHRoaXMgcmVxdWlyZW1lbnQsIGlmIHRoZXkgYXJlIG1hcmtlZAogICAgICAgIGZvciBkZWxldGlvbiIiIgogICAgICAgIGlmIHNlbGYuc291cmNlX2RpciBhbmQgb3MucGF0aC5leGlzdHMoCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5zb3VyY2VfZGlyLCBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRSkpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92aW5nIHNvdXJjZSBpbiAlcycsIHNlbGYuc291cmNlX2RpcikKICAgICAgICAgICAgcm10cmVlKHNlbGYuc291cmNlX2RpcikKICAgICAgICBzZWxmLnNvdXJjZV9kaXIgPSBOb25lCiAgICAgICAgaWYgc2VsZi5fdGVtcF9idWlsZF9kaXIgYW5kIG9zLnBhdGguZXhpc3RzKHNlbGYuX3RlbXBfYnVpbGRfZGlyKToKICAgICAgICAgICAgcm10cmVlKHNlbGYuX3RlbXBfYnVpbGRfZGlyKQogICAgICAgIHNlbGYuX3RlbXBfYnVpbGRfZGlyID0gTm9uZQoKICAgIGRlZiBpbnN0YWxsX2VkaXRhYmxlKHNlbGYsIGluc3RhbGxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zPSgpLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgbG9nZ2VyLmluZm8oJ1J1bm5pbmcgc2V0dXAucHkgZGV2ZWxvcCBmb3IgJXMnLCBzZWxmLm5hbWUpCgogICAgICAgIGlmIHNlbGYuaXNvbGF0ZWQ6CiAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zID0gbGlzdChnbG9iYWxfb3B0aW9ucykgKyBbIi0tbm8tdXNlci1jZmciXQoKICAgICAgICBpZiBwcmVmaXg6CiAgICAgICAgICAgIHByZWZpeF9wYXJhbSA9IFsnLS1wcmVmaXg9ezB9Jy5mb3JtYXQocHJlZml4KV0KICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zID0gbGlzdChpbnN0YWxsX29wdGlvbnMpICsgcHJlZml4X3BhcmFtCgogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICAjIEZJWE1FOiBzaG91bGQgd2UgZG8gLS1pbnN0YWxsLWhlYWRlcnMgaGVyZSB0b28/CiAgICAgICAgICAgIGNhbGxfc3VicHJvY2VzcygKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwKICAgICAgICAgICAgICAgICAgICAnLWMnLAogICAgICAgICAgICAgICAgICAgIFNFVFVQVE9PTFNfU0hJTSAlIHNlbGYuc2V0dXBfcHkKICAgICAgICAgICAgICAgIF0gKwogICAgICAgICAgICAgICAgbGlzdChnbG9iYWxfb3B0aW9ucykgKwogICAgICAgICAgICAgICAgWydkZXZlbG9wJywgJy0tbm8tZGVwcyddICsKICAgICAgICAgICAgICAgIGxpc3QoaW5zdGFsbF9vcHRpb25zKSwKCiAgICAgICAgICAgICAgICBjd2Q9c2VsZi5zZXR1cF9weV9kaXIsCiAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSkKCiAgICAgICAgc2VsZi5pbnN0YWxsX3N1Y2NlZWRlZCA9IFRydWUKCiAgICBkZWYgY2hlY2tfaWZfZXhpc3RzKHNlbGYpOgogICAgICAgICIiIkZpbmQgYW4gaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbiB0aGF0IHNhdGlzZmllcyBvciBjb25mbGljdHMKICAgICAgICB3aXRoIHRoaXMgcmVxdWlyZW1lbnQsIGFuZCBzZXQgc2VsZi5zYXRpc2ZpZWRfYnkgb3IKICAgICAgICBzZWxmLmNvbmZsaWN0c193aXRoIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5yZXEgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGdldF9kaXN0cmlidXRpb24oKSB3aWxsIHJlc29sdmUgdGhlIGVudGlyZSBsaXN0IG9mIHJlcXVpcmVtZW50cwogICAgICAgICAgICAjIGFueXdheSwgYW5kIHdlJ3ZlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0IHdlIG5lZWQgdGhlIHJlcXVpcmVtZW50CiAgICAgICAgICAgICMgaW4gcXVlc3Rpb24sIHNvIHN0cmlwIHRoZSBtYXJrZXIgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8KICAgICAgICAgICAgIyBldmFsdWF0ZSBpdC4KICAgICAgICAgICAgbm9fbWFya2VyID0gUmVxdWlyZW1lbnQoc3RyKHNlbGYucmVxKSkKICAgICAgICAgICAgbm9fbWFya2VyLm1hcmtlciA9IE5vbmUKICAgICAgICAgICAgc2VsZi5zYXRpc2ZpZWRfYnkgPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oc3RyKG5vX21hcmtlcikpCiAgICAgICAgICAgIGlmIHNlbGYuZWRpdGFibGUgYW5kIHNlbGYuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICAgICAgc2VsZi5jb25mbGljdHNfd2l0aCA9IHNlbGYuc2F0aXNmaWVkX2J5CiAgICAgICAgICAgICAgICAjIHdoZW4gaW5zdGFsbGluZyBlZGl0YWJsZXMsIG5vdGhpbmcgcHJlLWV4aXN0aW5nIHNob3VsZCBldmVyCiAgICAgICAgICAgICAgICAjIHNhdGlzZnkKICAgICAgICAgICAgICAgIHNlbGYuc2F0aXNmaWVkX2J5ID0gTm9uZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb25Ob3RGb3VuZDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuVmVyc2lvbkNvbmZsaWN0OgogICAgICAgICAgICBleGlzdGluZ19kaXN0ID0gcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKAogICAgICAgICAgICAgICAgc2VsZi5yZXEubmFtZQogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHNlbGYudXNlX3VzZXJfc2l0ZToKICAgICAgICAgICAgICAgIGlmIGRpc3RfaW5fdXNlcnNpdGUoZXhpc3RpbmdfZGlzdCk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25mbGljdHNfd2l0aCA9IGV4aXN0aW5nX2Rpc3QKICAgICAgICAgICAgICAgIGVsaWYgKHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2luX3NpdGVfcGFja2FnZXMoZXhpc3RpbmdfZGlzdCkpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAiV2lsbCBub3QgaW5zdGFsbCB0byB0aGUgdXNlciBzaXRlIGJlY2F1c2UgaXQgd2lsbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJsYWNrIHN5cy5wYXRoIHByZWNlZGVuY2UgdG8gJXMgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgKGV4aXN0aW5nX2Rpc3QucHJvamVjdF9uYW1lLCBleGlzdGluZ19kaXN0LmxvY2F0aW9uKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuY29uZmxpY3RzX3dpdGggPSBleGlzdGluZ19kaXN0CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc193aGVlbChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5saW5rIGFuZCBzZWxmLmxpbmsuaXNfd2hlZWwKCiAgICBkZWYgbW92ZV93aGVlbF9maWxlcyhzZWxmLCB3aGVlbGRpciwgcm9vdD1Ob25lLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgbW92ZV93aGVlbF9maWxlcygKICAgICAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnJlcSwgd2hlZWxkaXIsCiAgICAgICAgICAgIHVzZXI9c2VsZi51c2VfdXNlcl9zaXRlLAogICAgICAgICAgICBob21lPXNlbGYudGFyZ2V0X2RpciwKICAgICAgICAgICAgcm9vdD1yb290LAogICAgICAgICAgICBwcmVmaXg9cHJlZml4LAogICAgICAgICAgICBweWNvbXBpbGU9c2VsZi5weWNvbXBpbGUsCiAgICAgICAgICAgIGlzb2xhdGVkPXNlbGYuaXNvbGF0ZWQsCiAgICAgICAgKQoKICAgIGRlZiBnZXRfZGlzdChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiBidWlsdCBmcm9tIHNlbGYuZWdnX2luZm9fcGF0aCIiIgogICAgICAgIGVnZ19pbmZvID0gc2VsZi5lZ2dfaW5mb19wYXRoKCcnKS5yc3RyaXAoJy8nKQogICAgICAgIGJhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKQogICAgICAgIG1ldGFkYXRhID0gcGtnX3Jlc291cmNlcy5QYXRoTWV0YWRhdGEoYmFzZV9kaXIsIGVnZ19pbmZvKQogICAgICAgIGRpc3RfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShlZ2dfaW5mbykpWzBdCiAgICAgICAgcmV0dXJuIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZWdnX2luZm8pLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9ZGlzdF9uYW1lLAogICAgICAgICAgICBtZXRhZGF0YT1tZXRhZGF0YSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNfaGFzaF9vcHRpb25zKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGV0aGVyIGFueSBrbm93bi1nb29kIGhhc2hlcyBhcmUgc3BlY2lmaWVkIGFzIG9wdGlvbnMuCgogICAgICAgIFRoZXNlIGFjdGl2YXRlIC0tcmVxdWlyZS1oYXNoZXMgbW9kZTsgaGFzaGVzIHNwZWNpZmllZCBhcyBwYXJ0IG9mIGEKICAgICAgICBVUkwgZG8gbm90LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gYm9vbChzZWxmLm9wdGlvbnMuZ2V0KCdoYXNoZXMnLCB7fSkpCgogICAgZGVmIGhhc2hlcyhzZWxmLCB0cnVzdF9pbnRlcm5ldD1UcnVlKToKICAgICAgICAiIiJSZXR1cm4gYSBoYXNoLWNvbXBhcmVyIHRoYXQgY29uc2lkZXJzIG15IG9wdGlvbi0gYW5kIFVSTC1iYXNlZAogICAgICAgIGhhc2hlcyB0byBiZSBrbm93bi1nb29kLgoKICAgICAgICBIYXNoZXMgaW4gVVJMcy0tb25lcyBlbWJlZGRlZCBpbiB0aGUgcmVxdWlyZW1lbnRzIGZpbGUsIG5vdCBvbmVzCiAgICAgICAgZG93bmxvYWRlZCBmcm9tIGFuIGluZGV4IHNlcnZlci0tYXJlIGFsbW9zdCBwZWVycyB3aXRoIG9uZXMgZnJvbQogICAgICAgIGZsYWdzLiBUaGV5IHNhdGlzZnkgLS1yZXF1aXJlLWhhc2hlcyAod2hldGhlciBpdCB3YXMgaW1wbGljaXRseSBvcgogICAgICAgIGV4cGxpY2l0bHkgYWN0aXZhdGVkKSBidXQgZG8gbm90IGFjdGl2YXRlIGl0LiBtZDUgYW5kIHNoYTIyNCBhcmUgbm90CiAgICAgICAgYWxsb3dlZCBpbiBmbGFncywgd2hpY2ggc2hvdWxkIG51ZGdlIHBlb3BsZSB0b3dhcmQgZ29vZCBhbGdvcy4gV2UKICAgICAgICBhbHdheXMgT1IgYWxsIGhhc2hlcyB0b2dldGhlciwgZXZlbiBvbmVzIGZyb20gVVJMcy4KCiAgICAgICAgOnBhcmFtIHRydXN0X2ludGVybmV0OiBXaGV0aGVyIHRvIHRydXN0IFVSTC1iYXNlZCAoI21kNT0uLi4pIGhhc2hlcwogICAgICAgICAgICBkb3dubG9hZGVkIGZyb20gdGhlIGludGVybmV0LCBhcyBieSBwb3B1bGF0ZV9saW5rKCkKCiAgICAgICAgIiIiCiAgICAgICAgZ29vZF9oYXNoZXMgPSBzZWxmLm9wdGlvbnMuZ2V0KCdoYXNoZXMnLCB7fSkuY29weSgpCiAgICAgICAgbGluayA9IHNlbGYubGluayBpZiB0cnVzdF9pbnRlcm5ldCBlbHNlIHNlbGYub3JpZ2luYWxfbGluawogICAgICAgIGlmIGxpbmsgYW5kIGxpbmsuaGFzaDoKICAgICAgICAgICAgZ29vZF9oYXNoZXMuc2V0ZGVmYXVsdChsaW5rLmhhc2hfbmFtZSwgW10pLmFwcGVuZChsaW5rLmhhc2gpCiAgICAgICAgcmV0dXJuIEhhc2hlcyhnb29kX2hhc2hlcykKCgpkZWYgX3N0cmlwX3Bvc3RmaXgocmVxKToKICAgICIiIgogICAgICAgIFN0cmlwIHJlcSBwb3N0Zml4ICggLWRldiwgMC4yLCBldGMgKQogICAgIiIiCiAgICAjIEZJWE1FOiB1c2UgcGFja2FnZV90b19yZXF1aXJlbWVudD8KICAgIG1hdGNoID0gcmUuc2VhcmNoKHInXiguKj8pKD86LWRldnwtXGQuKikkJywgcmVxKQogICAgaWYgbWF0Y2g6CiAgICAgICAgIyBTdHJpcCBvZmYgLWRldiwgLTAuMiwgZXRjLgogICAgICAgIHJlcSA9IG1hdGNoLmdyb3VwKDEpCiAgICByZXR1cm4gcmVxCgoKZGVmIHBhcnNlX2VkaXRhYmxlKGVkaXRhYmxlX3JlcSwgZGVmYXVsdF92Y3M9Tm9uZSk6CiAgICAiIiJQYXJzZXMgYW4gZWRpdGFibGUgcmVxdWlyZW1lbnQgaW50bzoKICAgICAgICAtIGEgcmVxdWlyZW1lbnQgbmFtZQogICAgICAgIC0gYW4gVVJMCiAgICAgICAgLSBleHRyYXMKICAgICAgICAtIGVkaXRhYmxlIG9wdGlvbnMKICAgIEFjY2VwdGVkIHJlcXVpcmVtZW50czoKICAgICAgICBzdm4raHR0cDovL2JsYWhibGFoQHJldiNlZ2c9Rm9vYmFyW2Jhel0mc3ViZGlyZWN0b3J5PXZlcnNpb25fc3ViZGlyCiAgICAgICAgLltzb21lX2V4dHJhXQogICAgIiIiCgogICAgZnJvbSBwaXAuaW5kZXggaW1wb3J0IExpbmsKCiAgICB1cmwgPSBlZGl0YWJsZV9yZXEKICAgIGV4dHJhcyA9IE5vbmUKCiAgICAjIElmIGEgZmlsZSBwYXRoIGlzIHNwZWNpZmllZCB3aXRoIGV4dHJhcywgc3RyaXAgb2ZmIHRoZSBleHRyYXMuCiAgICBtID0gcmUubWF0Y2gocideKC4rKShcW1teXF1dK1xdKSQnLCB1cmwpCiAgICBpZiBtOgogICAgICAgIHVybF9ub19leHRyYXMgPSBtLmdyb3VwKDEpCiAgICAgICAgZXh0cmFzID0gbS5ncm91cCgyKQogICAgZWxzZToKICAgICAgICB1cmxfbm9fZXh0cmFzID0gdXJsCgogICAgaWYgb3MucGF0aC5pc2Rpcih1cmxfbm9fZXh0cmFzKToKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHVybF9ub19leHRyYXMsICdzZXR1cC5weScpKToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiRGlyZWN0b3J5ICVyIGlzIG5vdCBpbnN0YWxsYWJsZS4gRmlsZSAnc2V0dXAucHknIG5vdCBmb3VuZC4iICUKICAgICAgICAgICAgICAgIHVybF9ub19leHRyYXMKICAgICAgICAgICAgKQogICAgICAgICMgVHJlYXRpbmcgaXQgYXMgY29kZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBvdXQKICAgICAgICB1cmxfbm9fZXh0cmFzID0gcGF0aF90b191cmwodXJsX25vX2V4dHJhcykKCiAgICBpZiB1cmxfbm9fZXh0cmFzLmxvd2VyKCkuc3RhcnRzd2l0aCgnZmlsZTonKToKICAgICAgICBwYWNrYWdlX25hbWUgPSBMaW5rKHVybF9ub19leHRyYXMpLmVnZ19mcmFnbWVudAogICAgICAgIGlmIGV4dHJhczoKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZSwKICAgICAgICAgICAgICAgIHVybF9ub19leHRyYXMsCiAgICAgICAgICAgICAgICBSZXF1aXJlbWVudCgicGxhY2Vob2xkZXIiICsgZXh0cmFzLmxvd2VyKCkpLmV4dHJhcywKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBwYWNrYWdlX25hbWUsIHVybF9ub19leHRyYXMsIE5vbmUKCiAgICBmb3IgdmVyc2lvbl9jb250cm9sIGluIHZjczoKICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKCclczonICUgdmVyc2lvbl9jb250cm9sKToKICAgICAgICAgICAgdXJsID0gJyVzKyVzJyAlICh2ZXJzaW9uX2NvbnRyb2wsIHVybCkKICAgICAgICAgICAgYnJlYWsKCiAgICBpZiAnKycgbm90IGluIHVybDoKICAgICAgICBpZiBkZWZhdWx0X3ZjczoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWRlZmF1bHQtdmNzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAidGhlIGZ1dHVyZS4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCiAgICAgICAgICAgIHVybCA9IGRlZmF1bHRfdmNzICsgJysnICsgdXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnJXMgc2hvdWxkIGVpdGhlciBiZSBhIHBhdGggdG8gYSBsb2NhbCBwcm9qZWN0IG9yIGEgVkNTIHVybCAnCiAgICAgICAgICAgICAgICAnYmVnaW5uaW5nIHdpdGggc3ZuKywgZ2l0KywgaGcrLCBvciBienIrJyAlCiAgICAgICAgICAgICAgICBlZGl0YWJsZV9yZXEKICAgICAgICAgICAgKQoKICAgIHZjX3R5cGUgPSB1cmwuc3BsaXQoJysnLCAxKVswXS5sb3dlcigpCgogICAgaWYgbm90IHZjcy5nZXRfYmFja2VuZCh2Y190eXBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlID0gJ0ZvciAtLWVkaXRhYmxlPSVzIG9ubHkgJyAlIGVkaXRhYmxlX3JlcSArIFwKICAgICAgICAgICAgJywgJy5qb2luKFtiYWNrZW5kLm5hbWUgKyAnK1VSTCcgZm9yIGJhY2tlbmQgaW4gdmNzLmJhY2tlbmRzXSkgKyBcCiAgICAgICAgICAgICcgaXMgY3VycmVudGx5IHN1cHBvcnRlZCcKICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcihlcnJvcl9tZXNzYWdlKQoKICAgIHBhY2thZ2VfbmFtZSA9IExpbmsodXJsKS5lZ2dfZnJhZ21lbnQKICAgIGlmIG5vdCBwYWNrYWdlX25hbWU6CiAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZWN0IHJlcXVpcmVtZW50IG5hbWUsIHBsZWFzZSBzcGVjaWZ5IG9uZSB3aXRoICNlZ2c9IgogICAgICAgICkKICAgIGlmIG5vdCBwYWNrYWdlX25hbWU6CiAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICctLWVkaXRhYmxlPSVzIGlzIG5vdCB0aGUgcmlnaHQgZm9ybWF0OyBpdCBtdXN0IGhhdmUgJwogICAgICAgICAgICAnI2VnZz1QYWNrYWdlJyAlIGVkaXRhYmxlX3JlcQogICAgICAgICkKICAgIHJldHVybiBfc3RyaXBfcG9zdGZpeChwYWNrYWdlX25hbWUpLCB1cmwsIE5vbmUKUEsDBBQAAAAAAAAAIQAS3ZJ2noYAAJ6GAAAvAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV9zZXQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCByZXF1ZXN0cwoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBleHBhbmR1c2VyCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCAoaXNfZmlsZV91cmwsIGlzX2Rpcl91cmwsIGlzX3Zjc191cmwsIHVybF90b19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja191cmwpCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IChJbnN0YWxsYXRpb25FcnJvciwgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uTm90Rm91bmQsIFByZXZpb3VzQnVpbGREaXJFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hFcnJvciwgSGFzaEVycm9ycywgSGFzaFVucGlubmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5VXJsSGFzaFVuc3VwcG9ydGVkLCBWY3NIYXNoVW5zdXBwb3J0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnN1cHBvcnRlZFB5dGhvblZlcnNpb24pCmZyb20gcGlwLnJlcS5yZXFfaW5zdGFsbCBpbXBvcnQgSW5zdGFsbFJlcXVpcmVtZW50CmZyb20gcGlwLnV0aWxzIGltcG9ydCAoCiAgICBkaXNwbGF5X3BhdGgsIGRpc3RfaW5fdXNlcnNpdGUsIGVuc3VyZV9kaXIsIG5vcm1hbGl6ZV9wYXRoKQpmcm9tIHBpcC51dGlscy5oYXNoZXMgaW1wb3J0IE1pc3NpbmdIYXNoZXMKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC51dGlscy5wYWNrYWdpbmcgaW1wb3J0IGNoZWNrX2Rpc3RfcmVxdWlyZXNfcHl0aG9uCmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbAoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgUmVxdWlyZW1lbnRzKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2tleXMgPSBbXQogICAgICAgIHNlbGYuX2RpY3QgPSB7fQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9rZXlzCgogICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICByZXR1cm4gW3NlbGYuX2RpY3Rba2V5XSBmb3Iga2V5IGluIHNlbGYuX2tleXNdCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl9rZXlzCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi5fa2V5czoKICAgICAgICAgICAgc2VsZi5fa2V5cy5hcHBlbmQoa2V5KQogICAgICAgIHNlbGYuX2RpY3Rba2V5XSA9IHZhbHVlCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RpY3Rba2V5XQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICB2YWx1ZXMgPSBbJyVzOiAlcycgJSAocmVwcihrKSwgcmVwcihzZWxmW2tdKSkgZm9yIGsgaW4gc2VsZi5rZXlzKCldCiAgICAgICAgcmV0dXJuICdSZXF1aXJlbWVudHMoeyVzfSknICUgJywgJy5qb2luKHZhbHVlcykKCgpjbGFzcyBEaXN0QWJzdHJhY3Rpb24ob2JqZWN0KToKICAgICIiIkFic3RyYWN0cyBvdXQgdGhlIHdoZWVsIHZzIG5vbi13aGVlbCBwcmVwYXJlX2ZpbGVzIGxvZ2ljLgoKICAgIFRoZSByZXF1aXJlbWVudHMgZm9yIGFueXRoaW5nIGluc3RhbGxhYmxlIGFyZSBhcyBmb2xsb3dzOgogICAgIC0gd2UgbXVzdCBiZSBhYmxlIHRvIGRldGVybWluZSB0aGUgcmVxdWlyZW1lbnQgbmFtZQogICAgICAgKG9yIHdlIGNhbid0IGNvcnJlY3RseSBoYW5kbGUgdGhlIG5vbi11cGdyYWRlIGNhc2UpLgogICAgIC0gd2UgbXVzdCBiZSBhYmxlIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBydW4tdGltZSBkZXBlbmRlbmNpZXMKICAgICAgIHdpdGhvdXQgaW5zdGFsbGluZyBhbnkgYWRkaXRpb25hbCBwYWNrYWdlcyAob3Igd2Ugd291bGQKICAgICAgIGhhdmUgdG8gZWl0aGVyIGJ1cm4gdGltZSBieSBkb2luZyB0ZW1wb3JhcnkgaXNvbGF0ZWQgaW5zdGFsbHMKICAgICAgIG9yIGFsdGVybmF0aXZlbHkgdmlvbGF0ZSBwaXBzICdkb24ndCBzdGFydCBpbnN0YWxsaW5nIHVubGVzcwogICAgICAgYWxsIHJlcXVpcmVtZW50cyBhcmUgYXZhaWxhYmxlJyBydWxlIC0gbmVpdGhlciBvZiB3aGljaCBhcmUKICAgICAgIGRlc2lyYWJsZSkuCiAgICAgLSBmb3IgcGFja2FnZXMgd2l0aCBzZXR1cCByZXF1aXJlbWVudHMsIHdlIG11c3QgYWxzbyBiZSBhYmxlCiAgICAgICB0byBkZXRlcm1pbmUgdGhlaXIgcmVxdWlyZW1lbnRzIHdpdGhvdXQgaW5zdGFsbGluZyBhZGRpdGlvbmFsCiAgICAgICBwYWNrYWdlcyAoZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBydW4tdGltZSBkZXBlbmRlbmNpZXMpCiAgICAgLSB3ZSBtdXN0IGJlIGFibGUgdG8gY3JlYXRlIGEgRGlzdHJpYnV0aW9uIG9iamVjdCBleHBvc2luZyB0aGUKICAgICAgIGFib3ZlIG1ldGFkYXRhLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcV90b19pbnN0YWxsKToKICAgICAgICBzZWxmLnJlcV90b19pbnN0YWxsID0gcmVxX3RvX2luc3RhbGwKCiAgICBkZWYgZGlzdChzZWxmLCBmaW5kZXIpOgogICAgICAgICIiIlJldHVybiBhIHNldHVwdG9vbHMgRGlzdCBvYmplY3QuIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihzZWxmLmRpc3QpCgogICAgZGVmIHByZXBfZm9yX2Rpc3Qoc2VsZik6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgd2UgY2FuIGdldCBhIERpc3QgZm9yIHRoaXMgcmVxdWlyZW1lbnQuIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihzZWxmLmRpc3QpCgoKZGVmIG1ha2VfYWJzdHJhY3RfZGlzdChyZXFfdG9faW5zdGFsbCk6CiAgICAiIiJGYWN0b3J5IHRvIG1ha2UgYW4gYWJzdHJhY3QgZGlzdCBvYmplY3QuCgogICAgUHJlY29uZGl0aW9uczogRWl0aGVyIGFuIGVkaXRhYmxlIHJlcSB3aXRoIGEgc291cmNlX2Rpciwgb3Igc2F0aXNmaWVkX2J5IG9yCiAgICBhIHdoZWVsIGxpbmssIG9yIGEgbm9uLWVkaXRhYmxlIHJlcSB3aXRoIGEgc291cmNlX2Rpci4KCiAgICA6cmV0dXJuOiBBIGNvbmNyZXRlIERpc3RBYnN0cmFjdGlvbi4KICAgICIiIgogICAgaWYgcmVxX3RvX2luc3RhbGwuZWRpdGFibGU6CiAgICAgICAgcmV0dXJuIElzU0Rpc3QocmVxX3RvX2luc3RhbGwpCiAgICBlbGlmIHJlcV90b19pbnN0YWxsLmxpbmsgYW5kIHJlcV90b19pbnN0YWxsLmxpbmsuaXNfd2hlZWw6CiAgICAgICAgcmV0dXJuIElzV2hlZWwocmVxX3RvX2luc3RhbGwpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBJc1NEaXN0KHJlcV90b19pbnN0YWxsKQoKCmNsYXNzIElzV2hlZWwoRGlzdEFic3RyYWN0aW9uKToKCiAgICBkZWYgZGlzdChzZWxmLCBmaW5kZXIpOgogICAgICAgIHJldHVybiBsaXN0KHBrZ19yZXNvdXJjZXMuZmluZF9kaXN0cmlidXRpb25zKAogICAgICAgICAgICBzZWxmLnJlcV90b19pbnN0YWxsLnNvdXJjZV9kaXIpKVswXQoKICAgIGRlZiBwcmVwX2Zvcl9kaXN0KHNlbGYpOgogICAgICAgICMgRklYTUU6aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8xMTEyCiAgICAgICAgcGFzcwoKCmNsYXNzIElzU0Rpc3QoRGlzdEFic3RyYWN0aW9uKToKCiAgICBkZWYgZGlzdChzZWxmLCBmaW5kZXIpOgogICAgICAgIGRpc3QgPSBzZWxmLnJlcV90b19pbnN0YWxsLmdldF9kaXN0KCkKICAgICAgICAjIEZJWE1FOiBzaG91bGRuJ3QgYmUgZ2xvYmFsbHkgYWRkZWQ6CiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0Jyk6CiAgICAgICAgICAgIGZpbmRlci5hZGRfZGVwZW5kZW5jeV9saW5rcygKICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpCiAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gZGlzdAoKICAgIGRlZiBwcmVwX2Zvcl9kaXN0KHNlbGYpOgogICAgICAgIHNlbGYucmVxX3RvX2luc3RhbGwucnVuX2VnZ19pbmZvKCkKICAgICAgICBzZWxmLnJlcV90b19pbnN0YWxsLmFzc2VydF9zb3VyY2VfbWF0Y2hlc192ZXJzaW9uKCkKCgpjbGFzcyBJbnN0YWxsZWQoRGlzdEFic3RyYWN0aW9uKToKCiAgICBkZWYgZGlzdChzZWxmLCBmaW5kZXIpOgogICAgICAgIHJldHVybiBzZWxmLnJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieQoKICAgIGRlZiBwcmVwX2Zvcl9kaXN0KHNlbGYpOgogICAgICAgIHBhc3MKCgpjbGFzcyBSZXF1aXJlbWVudFNldChvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZF9kaXIsIHNyY19kaXIsIGRvd25sb2FkX2RpciwgdXBncmFkZT1GYWxzZSwKICAgICAgICAgICAgICAgICB1cGdyYWRlX3N0cmF0ZWd5PU5vbmUsIGlnbm9yZV9pbnN0YWxsZWQ9RmFsc2UsIGFzX2VnZz1GYWxzZSwKICAgICAgICAgICAgICAgICB0YXJnZXRfZGlyPU5vbmUsIGlnbm9yZV9kZXBlbmRlbmNpZXM9RmFsc2UsCiAgICAgICAgICAgICAgICAgZm9yY2VfcmVpbnN0YWxsPUZhbHNlLCB1c2VfdXNlcl9zaXRlPUZhbHNlLCBzZXNzaW9uPU5vbmUsCiAgICAgICAgICAgICAgICAgcHljb21waWxlPVRydWUsIGlzb2xhdGVkPUZhbHNlLCB3aGVlbF9kb3dubG9hZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT1Ob25lLCByZXF1aXJlX2hhc2hlcz1GYWxzZSwKICAgICAgICAgICAgICAgICBpZ25vcmVfcmVxdWlyZXNfcHl0aG9uPUZhbHNlKToKICAgICAgICAiIiJDcmVhdGUgYSBSZXF1aXJlbWVudFNldC4KCiAgICAgICAgOnBhcmFtIHdoZWVsX2Rvd25sb2FkX2RpcjogV2hlcmUgc3RpbGwtcGFja2VkIC53aGwgZmlsZXMgc2hvdWxkIGJlCiAgICAgICAgICAgIHdyaXR0ZW4gdG8uIElmIE5vbmUgdGhleSBhcmUgd3JpdHRlbiB0byB0aGUgZG93bmxvYWRfZGlyIHBhcmFtZXRlci4KICAgICAgICAgICAgU2VwYXJhdGUgdG8gZG93bmxvYWRfZGlyIHRvIHBlcm1pdCBvbmx5IGtlZXBpbmcgd2hlZWwgYXJjaGl2ZXMgZm9yCiAgICAgICAgICAgIHBpcCB3aGVlbC4KICAgICAgICA6cGFyYW0gZG93bmxvYWRfZGlyOiBXaGVyZSBzdGlsbCBwYWNrZWQgYXJjaGl2ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCiAgICAgICAgICAgIElmIE5vbmUgdGhleSBhcmUgbm90IHNhdmVkLCBhbmQgYXJlIGRlbGV0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKICAgICAgICAgICAgdW5wYWNraW5nLgogICAgICAgIDpwYXJhbSB3aGVlbF9jYWNoZTogVGhlIHBpcCB3aGVlbCBjYWNoZSwgZm9yIHBhc3NpbmcgdG8KICAgICAgICAgICAgSW5zdGFsbFJlcXVpcmVtZW50LgogICAgICAgICIiIgogICAgICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgIlJlcXVpcmVtZW50U2V0KCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICIKICAgICAgICAgICAgICAgICInc2Vzc2lvbiciCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5idWlsZF9kaXIgPSBidWlsZF9kaXIKICAgICAgICBzZWxmLnNyY19kaXIgPSBzcmNfZGlyCiAgICAgICAgIyBYWFg6IGRvd25sb2FkX2RpciBhbmQgd2hlZWxfZG93bmxvYWRfZGlyIG92ZXJsYXAgc2VtYW50aWNhbGx5IGFuZCBtYXkKICAgICAgICAjIGJlIGNvbWJpbmVkIGlmIHdlJ3JlIHdpbGxpbmcgdG8gaGF2ZSBub24td2hlZWwgYXJjaGl2ZXMgcHJlc2VudCBpbgogICAgICAgICMgdGhlIHdoZWVsaG91c2Ugb3V0cHV0IGJ5ICdwaXAgd2hlZWwnLgogICAgICAgIHNlbGYuZG93bmxvYWRfZGlyID0gZG93bmxvYWRfZGlyCiAgICAgICAgc2VsZi51cGdyYWRlID0gdXBncmFkZQogICAgICAgIHNlbGYudXBncmFkZV9zdHJhdGVneSA9IHVwZ3JhZGVfc3RyYXRlZ3kKICAgICAgICBzZWxmLmlnbm9yZV9pbnN0YWxsZWQgPSBpZ25vcmVfaW5zdGFsbGVkCiAgICAgICAgc2VsZi5mb3JjZV9yZWluc3RhbGwgPSBmb3JjZV9yZWluc3RhbGwKICAgICAgICBzZWxmLnJlcXVpcmVtZW50cyA9IFJlcXVpcmVtZW50cygpCiAgICAgICAgIyBNYXBwaW5nIG9mIGFsaWFzOiByZWFsX25hbWUKICAgICAgICBzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXMgPSB7fQogICAgICAgIHNlbGYudW5uYW1lZF9yZXF1aXJlbWVudHMgPSBbXQogICAgICAgIHNlbGYuaWdub3JlX2RlcGVuZGVuY2llcyA9IGlnbm9yZV9kZXBlbmRlbmNpZXMKICAgICAgICBzZWxmLmlnbm9yZV9yZXF1aXJlc19weXRob24gPSBpZ25vcmVfcmVxdWlyZXNfcHl0aG9uCiAgICAgICAgc2VsZi5zdWNjZXNzZnVsbHlfZG93bmxvYWRlZCA9IFtdCiAgICAgICAgc2VsZi5zdWNjZXNzZnVsbHlfaW5zdGFsbGVkID0gW10KICAgICAgICBzZWxmLnJlcXNfdG9fY2xlYW51cCA9IFtdCiAgICAgICAgc2VsZi5hc19lZ2cgPSBhc19lZ2cKICAgICAgICBzZWxmLnVzZV91c2VyX3NpdGUgPSB1c2VfdXNlcl9zaXRlCiAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gdGFyZ2V0X2RpciAgIyBzZXQgZnJvbSAtLXRhcmdldCBvcHRpb24KICAgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCiAgICAgICAgc2VsZi5weWNvbXBpbGUgPSBweWNvbXBpbGUKICAgICAgICBzZWxmLmlzb2xhdGVkID0gaXNvbGF0ZWQKICAgICAgICBpZiB3aGVlbF9kb3dubG9hZF9kaXI6CiAgICAgICAgICAgIHdoZWVsX2Rvd25sb2FkX2RpciA9IG5vcm1hbGl6ZV9wYXRoKHdoZWVsX2Rvd25sb2FkX2RpcikKICAgICAgICBzZWxmLndoZWVsX2Rvd25sb2FkX2RpciA9IHdoZWVsX2Rvd25sb2FkX2RpcgogICAgICAgIHNlbGYuX3doZWVsX2NhY2hlID0gd2hlZWxfY2FjaGUKICAgICAgICBzZWxmLnJlcXVpcmVfaGFzaGVzID0gcmVxdWlyZV9oYXNoZXMKICAgICAgICAjIE1hcHMgZnJvbSBpbnN0YWxsX3JlcSAtPiBkZXBlbmRlbmNpZXNfb2ZfaW5zdGFsbF9yZXEKICAgICAgICBzZWxmLl9kZXBlbmRlbmNpZXMgPSBkZWZhdWx0ZGljdChsaXN0KQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJlcXMgPSBbcmVxIGZvciByZXEgaW4gc2VsZi5yZXF1aXJlbWVudHMudmFsdWVzKCkKICAgICAgICAgICAgICAgIGlmIG5vdCByZXEuY29tZXNfZnJvbV0KICAgICAgICByZXFzLnNvcnQoa2V5PWxhbWJkYSByZXE6IHJlcS5uYW1lLmxvd2VyKCkpCiAgICAgICAgcmV0dXJuICcgJy5qb2luKFtzdHIocmVxLnJlcSkgZm9yIHJlcSBpbiByZXFzXSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmVxcyA9IFtyZXEgZm9yIHJlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKV0KICAgICAgICByZXFzLnNvcnQoa2V5PWxhbWJkYSByZXE6IHJlcS5uYW1lLmxvd2VyKCkpCiAgICAgICAgcmVxc19zdHIgPSAnLCAnLmpvaW4oW3N0cihyZXEucmVxKSBmb3IgcmVxIGluIHJlcXNdKQogICAgICAgIHJldHVybiAoJzwlcyBvYmplY3Q7ICVkIHJlcXVpcmVtZW50KHMpOiAlcz4nCiAgICAgICAgICAgICAgICAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgbGVuKHJlcXMpLCByZXFzX3N0cikpCgogICAgZGVmIGFkZF9yZXF1aXJlbWVudChzZWxmLCBpbnN0YWxsX3JlcSwgcGFyZW50X3JlcV9uYW1lPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhc19yZXF1ZXN0ZWQ9Tm9uZSk6CiAgICAgICAgIiIiQWRkIGluc3RhbGxfcmVxIGFzIGEgcmVxdWlyZW1lbnQgdG8gaW5zdGFsbC4KCiAgICAgICAgOnBhcmFtIHBhcmVudF9yZXFfbmFtZTogVGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVtZW50IHRoYXQgbmVlZGVkIHRoaXMKICAgICAgICAgICAgYWRkZWQuIFRoZSBuYW1lIGlzIHVzZWQgYmVjYXVzZSB3aGVuIG11bHRpcGxlIHVubmFtZWQgcmVxdWlyZW1lbnRzCiAgICAgICAgICAgIHJlc29sdmUgdG8gdGhlIHNhbWUgbmFtZSwgd2UgY291bGQgb3RoZXJ3aXNlIGVuZCB1cCB3aXRoIGRlcGVuZGVuY3kKICAgICAgICAgICAgbGlua3MgdGhhdCBwb2ludCBvdXRzaWRlIHRoZSBSZXF1aXJlbWVudHMgc2V0LiBwYXJlbnRfcmVxIG11c3QKICAgICAgICAgICAgYWxyZWFkeSBiZSBhZGRlZC4gTm90ZSB0aGF0IE5vbmUgaW1wbGllcyB0aGF0IHRoaXMgaXMgYSB1c2VyCiAgICAgICAgICAgIHN1cHBsaWVkIHJlcXVpcmVtZW50LCB2cyBhbiBpbmZlcnJlZCBvbmUuCiAgICAgICAgOnBhcmFtIGV4dHJhc19yZXF1ZXN0ZWQ6IGFuIGl0ZXJhYmxlIG9mIGV4dHJhcyB1c2VkIHRvIGV2YWx1YXRlIHRoZQogICAgICAgICAgICBlbnZpcm9uZW1lbnQgbWFya2Vycy4KICAgICAgICA6cmV0dXJuOiBBZGRpdGlvbmFsIHJlcXVpcmVtZW50cyB0byBzY2FuLiBUaGF0IGlzIGVpdGhlciBbXSBpZgogICAgICAgICAgICB0aGUgcmVxdWlyZW1lbnQgaXMgbm90IGFwcGxpY2FibGUsIG9yIFtpbnN0YWxsX3JlcV0gaWYgdGhlCiAgICAgICAgICAgIHJlcXVpcmVtZW50IGlzIGFwcGxpY2FibGUgYW5kIGhhcyBqdXN0IGJlZW4gYWRkZWQuCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSA9IGluc3RhbGxfcmVxLm5hbWUKICAgICAgICBpZiBub3QgaW5zdGFsbF9yZXEubWF0Y2hfbWFya2VycyhleHRyYXNfcmVxdWVzdGVkKToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIklnbm9yaW5nICVzOiBtYXJrZXJzICclcycgZG9uJ3QgbWF0Y2ggeW91ciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnZpcm9ubWVudCIsIGluc3RhbGxfcmVxLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfcmVxLm1hcmtlcnMpCiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICAjIFRoaXMgY2hlY2sgaGFzIHRvIGNvbWUgYWZ0ZXIgd2UgZmlsdGVyIHJlcXVpcmVtZW50cyB3aXRoIHRoZQogICAgICAgICMgZW52aXJvbm1lbnQgbWFya2Vycy4KICAgICAgICBpZiBpbnN0YWxsX3JlcS5saW5rIGFuZCBpbnN0YWxsX3JlcS5saW5rLmlzX3doZWVsOgogICAgICAgICAgICB3aGVlbCA9IFdoZWVsKGluc3RhbGxfcmVxLmxpbmsuZmlsZW5hbWUpCiAgICAgICAgICAgIGlmIG5vdCB3aGVlbC5zdXBwb3J0ZWQoKToKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdXBwb3J0ZWQgd2hlZWwgb24gdGhpcyBwbGF0Zm9ybS4iICUKICAgICAgICAgICAgICAgICAgICB3aGVlbC5maWxlbmFtZQogICAgICAgICAgICAgICAgKQoKICAgICAgICBpbnN0YWxsX3JlcS5hc19lZ2cgPSBzZWxmLmFzX2VnZwogICAgICAgIGluc3RhbGxfcmVxLnVzZV91c2VyX3NpdGUgPSBzZWxmLnVzZV91c2VyX3NpdGUKICAgICAgICBpbnN0YWxsX3JlcS50YXJnZXRfZGlyID0gc2VsZi50YXJnZXRfZGlyCiAgICAgICAgaW5zdGFsbF9yZXEucHljb21waWxlID0gc2VsZi5weWNvbXBpbGUKICAgICAgICBpbnN0YWxsX3JlcS5pc19kaXJlY3QgPSAocGFyZW50X3JlcV9uYW1lIGlzIE5vbmUpCgogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICAjIHVybCBvciBwYXRoIHJlcXVpcmVtZW50IHcvbyBhbiBlZ2cgZnJhZ21lbnQKICAgICAgICAgICAgc2VsZi51bm5hbWVkX3JlcXVpcmVtZW50cy5hcHBlbmQoaW5zdGFsbF9yZXEpCiAgICAgICAgICAgIHJldHVybiBbaW5zdGFsbF9yZXFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxID0gc2VsZi5nZXRfcmVxdWlyZW1lbnQobmFtZSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxID0gTm9uZQogICAgICAgICAgICBpZiAocGFyZW50X3JlcV9uYW1lIGlzIE5vbmUgYW5kIGV4aXN0aW5nX3JlcSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLmNvbnN0cmFpbnQgYW5kCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLmV4dHJhcyA9PSBpbnN0YWxsX3JlcS5leHRyYXMgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcS5yZXEuc3BlY2lmaWVyID09IGluc3RhbGxfcmVxLnJlcS5zcGVjaWZpZXIpOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ0RvdWJsZSByZXF1aXJlbWVudCBnaXZlbjogJXMgKGFscmVhZHkgaW4gJXMsIG5hbWU9JXIpJwogICAgICAgICAgICAgICAgICAgICUgKGluc3RhbGxfcmVxLCBleGlzdGluZ19yZXEsIG5hbWUpKQogICAgICAgICAgICBpZiBub3QgZXhpc3RpbmdfcmVxOgogICAgICAgICAgICAgICAgIyBBZGQgcmVxdWlyZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYucmVxdWlyZW1lbnRzW25hbWVdID0gaW5zdGFsbF9yZXEKICAgICAgICAgICAgICAgICMgRklYTUU6IHdoYXQgYWJvdXQgb3RoZXIgbm9ybWFsaXphdGlvbnM/ICBFLmcuLCBfIHZzLiAtPwogICAgICAgICAgICAgICAgaWYgbmFtZS5sb3dlcigpICE9IG5hbWU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1aXJlbWVudF9hbGlhc2VzW25hbWUubG93ZXIoKV0gPSBuYW1lCiAgICAgICAgICAgICAgICByZXN1bHQgPSBbaW5zdGFsbF9yZXFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEFzc3VtZSB0aGVyZSdzIG5vIG5lZWQgdG8gc2NhbiwgYW5kIHRoYXQgd2UndmUgYWxyZWFkeQogICAgICAgICAgICAgICAgIyBlbmNvdW50ZXJlZCB0aGlzIGZvciBzY2FubmluZy4KICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgICAgICAgICBpZiBub3QgaW5zdGFsbF9yZXEuY29uc3RyYWludCBhbmQgZXhpc3RpbmdfcmVxLmNvbnN0cmFpbnQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbGxfcmVxLmxpbmsgYW5kIG5vdCAoZXhpc3RpbmdfcmVxLmxpbmsgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9yZXEubGluay5wYXRoID09IGV4aXN0aW5nX3JlcS5saW5rLnBhdGgpKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXFzX3RvX2NsZWFudXAuYXBwZW5kKGluc3RhbGxfcmVxKQogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2F0aXNmeSBjb25zdHJhaW50cyBmb3IgJyVzJzogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGxhdGlvbiBmcm9tIHBhdGggb3IgdXJsIGNhbm5vdCBiZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3RyYWluZWQgdG8gYSB2ZXJzaW9uIiAlIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBub3cgaW5zdGFsbGluZyBhIGNvbnN0cmFpbnQsIG1hcmsgdGhlIGV4aXN0aW5nCiAgICAgICAgICAgICAgICAgICAgIyBvYmplY3QgZm9yIHJlYWwgaW5zdGFsbGF0aW9uLgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcS5jb25zdHJhaW50ID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEuZXh0cmFzID0gdHVwbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZChzZXQoZXhpc3RpbmdfcmVxLmV4dHJhcykudW5pb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoaW5zdGFsbF9yZXEuZXh0cmFzKSkpKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiU2V0dGluZyAlcyBleHRyYXMgdG86ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLCBleGlzdGluZ19yZXEuZXh0cmFzKQogICAgICAgICAgICAgICAgICAgICMgQW5kIG5vdyB3ZSBuZWVkIHRvIHNjYW4gdGhpcy4KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbZXhpc3RpbmdfcmVxXQogICAgICAgICAgICAgICAgIyBDYW5vbmljYWxpc2UgdG8gdGhlIGFscmVhZHktYWRkZWQgb2JqZWN0IGZvciB0aGUgYmFja3JlZgogICAgICAgICAgICAgICAgIyBjaGVjayBiZWxvdy4KICAgICAgICAgICAgICAgIGluc3RhbGxfcmVxID0gZXhpc3RpbmdfcmVxCiAgICAgICAgICAgIGlmIHBhcmVudF9yZXFfbmFtZToKICAgICAgICAgICAgICAgIHBhcmVudF9yZXEgPSBzZWxmLmdldF9yZXF1aXJlbWVudChwYXJlbnRfcmVxX25hbWUpCiAgICAgICAgICAgICAgICBzZWxmLl9kZXBlbmRlbmNpZXNbcGFyZW50X3JlcV0uYXBwZW5kKGluc3RhbGxfcmVxKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGhhc19yZXF1aXJlbWVudChzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgIG5hbWUgPSBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIGlmIChuYW1lIGluIHNlbGYucmVxdWlyZW1lbnRzIGFuZAogICAgICAgICAgIG5vdCBzZWxmLnJlcXVpcmVtZW50c1tuYW1lXS5jb25zdHJhaW50IG9yCiAgICAgICAgICAgbmFtZSBpbiBzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXMgYW5kCiAgICAgICAgICAgbm90IHNlbGYucmVxdWlyZW1lbnRzW3NlbGYucmVxdWlyZW1lbnRfYWxpYXNlc1tuYW1lXV0uY29uc3RyYWludCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzX3JlcXVpcmVtZW50cyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChyZXEgZm9yIHJlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKSBpZiBub3QKICAgICAgICAgICAgICAgICAgICByZXEuY29uc3RyYWludCkgb3Igc2VsZi51bm5hbWVkX3JlcXVpcmVtZW50cwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2Rvd25sb2FkKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZG93bmxvYWRfZGlyOgogICAgICAgICAgICBzZWxmLmRvd25sb2FkX2RpciA9IGV4cGFuZHVzZXIoc2VsZi5kb3dubG9hZF9kaXIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZG93bmxvYWRfZGlyKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoJ0NvdWxkIG5vdCBmaW5kIGRvd25sb2FkIGRpcmVjdG9yeScpCiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgb3IgYWNjZXNzIGRvd25sb2FkIGRpcmVjdG9yeSAnJXMnIgogICAgICAgICAgICAgICAgICAgICUgZGlzcGxheV9wYXRoKHNlbGYuZG93bmxvYWRfZGlyKSkKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgZ2V0X3JlcXVpcmVtZW50KHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgZm9yIG5hbWUgaW4gcHJvamVjdF9uYW1lLCBwcm9qZWN0X25hbWUubG93ZXIoKToKICAgICAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnJlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVpcmVtZW50c1tuYW1lXQogICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYucmVxdWlyZW1lbnRfYWxpYXNlczoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVpcmVtZW50c1tzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXNbbmFtZV1dCiAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIHByb2plY3Qgd2l0aCB0aGUgbmFtZSAlciIgJSBwcm9qZWN0X25hbWUpCgogICAgZGVmIHVuaW5zdGFsbChzZWxmLCBhdXRvX2NvbmZpcm09RmFsc2UpOgogICAgICAgIGZvciByZXEgaW4gc2VsZi5yZXF1aXJlbWVudHMudmFsdWVzKCk6CiAgICAgICAgICAgIGlmIHJlcS5jb25zdHJhaW50OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmVxLnVuaW5zdGFsbChhdXRvX2NvbmZpcm09YXV0b19jb25maXJtKQogICAgICAgICAgICByZXEuY29tbWl0X3VuaW5zdGFsbCgpCgogICAgZGVmIHByZXBhcmVfZmlsZXMoc2VsZiwgZmluZGVyKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHByb2Nlc3MuIENyZWF0ZSB0ZW1wIGRpcmVjdG9yaWVzLCBkb3dubG9hZCBhbmQvb3IgdW5wYWNrIGZpbGVzLgogICAgICAgICIiIgogICAgICAgICMgbWFrZSB0aGUgd2hlZWxob3VzZQogICAgICAgIGlmIHNlbGYud2hlZWxfZG93bmxvYWRfZGlyOgogICAgICAgICAgICBlbnN1cmVfZGlyKHNlbGYud2hlZWxfZG93bmxvYWRfZGlyKQoKICAgICAgICAjIElmIGFueSB0b3AtbGV2ZWwgcmVxdWlyZW1lbnQgaGFzIGEgaGFzaCBzcGVjaWZpZWQsIGVudGVyCiAgICAgICAgIyBoYXNoLWNoZWNraW5nIG1vZGUsIHdoaWNoIHJlcXVpcmVzIGhhc2hlcyBmcm9tIGFsbC4KICAgICAgICByb290X3JlcXMgPSBzZWxmLnVubmFtZWRfcmVxdWlyZW1lbnRzICsgc2VsZi5yZXF1aXJlbWVudHMudmFsdWVzKCkKICAgICAgICByZXF1aXJlX2hhc2hlcyA9IChzZWxmLnJlcXVpcmVfaGFzaGVzIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KHJlcS5oYXNfaGFzaF9vcHRpb25zIGZvciByZXEgaW4gcm9vdF9yZXFzKSkKICAgICAgICBpZiByZXF1aXJlX2hhc2hlcyBhbmQgc2VsZi5hc19lZ2c6CiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJy0tZWdnIGlzIG5vdCBhbGxvd2VkIHdpdGggLS1yZXF1aXJlLWhhc2hlcyBtb2RlLCBzaW5jZSBpdCAnCiAgICAgICAgICAgICAgICAnZGVsZWdhdGVzIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiB0byBzZXR1cHRvb2xzIGFuZCBjb3VsZCB0aHVzICcKICAgICAgICAgICAgICAgICdyZXN1bHQgaW4gaW5zdGFsbGF0aW9uIG9mIHVuaGFzaGVkIHBhY2thZ2VzLicpCgogICAgICAgICMgQWN0dWFsbHkgcHJlcGFyZSB0aGUgZmlsZXMsIGFuZCBjb2xsZWN0IGFueSBleGNlcHRpb25zLiBNb3N0IGhhc2gKICAgICAgICAjIGV4Y2VwdGlvbnMgY2Fubm90IGJlIGNoZWNrZWQgYWhlYWQgb2YgdGltZSwgYmVjYXVzZQogICAgICAgICMgcmVxLnBvcHVsYXRlX2xpbmsoKSBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHdlIGNhbiBtYWtlIGRlY2lzaW9ucwogICAgICAgICMgYmFzZWQgb24gbGluayB0eXBlLgogICAgICAgIGRpc2NvdmVyZWRfcmVxcyA9IFtdCiAgICAgICAgaGFzaF9lcnJvcnMgPSBIYXNoRXJyb3JzKCkKICAgICAgICBmb3IgcmVxIGluIGNoYWluKHJvb3RfcmVxcywgZGlzY292ZXJlZF9yZXFzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGlzY292ZXJlZF9yZXFzLmV4dGVuZChzZWxmLl9wcmVwYXJlX2ZpbGUoCiAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgIHJlcSwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1yZXF1aXJlX2hhc2hlcywKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZGVwZW5kZW5jaWVzPXNlbGYuaWdub3JlX2RlcGVuZGVuY2llcykpCiAgICAgICAgICAgIGV4Y2VwdCBIYXNoRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgZXhjLnJlcSA9IHJlcQogICAgICAgICAgICAgICAgaGFzaF9lcnJvcnMuYXBwZW5kKGV4YykKCiAgICAgICAgaWYgaGFzaF9lcnJvcnM6CiAgICAgICAgICAgIHJhaXNlIGhhc2hfZXJyb3JzCgogICAgZGVmIF9pc191cGdyYWRlX2FsbG93ZWQoc2VsZiwgcmVxKToKICAgICAgICByZXR1cm4gc2VsZi51cGdyYWRlIGFuZCAoCiAgICAgICAgICAgIHNlbGYudXBncmFkZV9zdHJhdGVneSA9PSAiZWFnZXIiIG9yICgKICAgICAgICAgICAgICAgIHNlbGYudXBncmFkZV9zdHJhdGVneSA9PSAib25seS1pZi1uZWVkZWQiIGFuZCByZXEuaXNfZGlyZWN0CiAgICAgICAgICAgICkKICAgICAgICApCgogICAgZGVmIF9jaGVja19za2lwX2luc3RhbGxlZChzZWxmLCByZXFfdG9faW5zdGFsbCwgZmluZGVyKToKICAgICAgICAiIiJDaGVjayBpZiByZXFfdG9faW5zdGFsbCBzaG91bGQgYmUgc2tpcHBlZC4KCiAgICAgICAgVGhpcyB3aWxsIGNoZWNrIGlmIHRoZSByZXEgaXMgaW5zdGFsbGVkLCBhbmQgd2hldGhlciB3ZSBzaG91bGQgdXBncmFkZQogICAgICAgIG9yIHJlaW5zdGFsbCBpdCwgdGFraW5nIGludG8gYWNjb3VudCBhbGwgdGhlIHJlbGV2YW50IHVzZXIgb3B0aW9ucy4KCiAgICAgICAgQWZ0ZXIgY2FsbGluZyB0aGlzIHJlcV90b19pbnN0YWxsIHdpbGwgb25seSBoYXZlIHNhdGlzZmllZF9ieSBzZXQgdG8KICAgICAgICBOb25lIGlmIHRoZSByZXFfdG9faW5zdGFsbCBpcyB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZCBldGMuIEFueQogICAgICAgIG90aGVyIHZhbHVlIHdpbGwgYmUgYSBkaXN0IHJlY29yZGluZyB0aGUgY3VycmVudCB0aGluZyBpbnN0YWxsZWQgdGhhdAogICAgICAgIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQuCgogICAgICAgIE5vdGUgdGhhdCBmb3IgdmNzIHVybHMgYW5kIHRoZSBsaWtlIHdlIGNhbid0IGFzc2VzcyBza2lwcGluZyBpbiB0aGlzCiAgICAgICAgcm91dGluZSAtIHdlIHNpbXBseSBpZGVudGlmeSB0aGF0IHdlIG5lZWQgdG8gcHVsbCB0aGUgdGhpbmcgZG93biwKICAgICAgICB0aGVuIGxhdGVyIG9uIGl0IGlzIHB1bGxlZCBkb3duIGFuZCBpbnRyb3NwZWN0ZWQgdG8gYXNzZXNzIHVwZ3JhZGUvCiAgICAgICAgcmVpbnN0YWxscyBldGMuCgogICAgICAgIDpyZXR1cm46IEEgdGV4dCByZWFzb24gZm9yIHdoeSBpdCB3YXMgc2tpcHBlZCwgb3IgTm9uZS4KICAgICAgICAiIiIKICAgICAgICAjIENoZWNrIHdoZXRoZXIgdG8gdXBncmFkZS9yZWluc3RhbGwgdGhpcyByZXEgb3Igbm90LgogICAgICAgIHJlcV90b19pbnN0YWxsLmNoZWNrX2lmX2V4aXN0cygpCiAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICB1cGdyYWRlX2FsbG93ZWQgPSBzZWxmLl9pc191cGdyYWRlX2FsbG93ZWQocmVxX3RvX2luc3RhbGwpCgogICAgICAgICAgICAjIElzIHRoZSBiZXN0IHZlcnNpb24gaXMgaW5zdGFsbGVkLgogICAgICAgICAgICBiZXN0X2luc3RhbGxlZCA9IEZhbHNlCgogICAgICAgICAgICBpZiB1cGdyYWRlX2FsbG93ZWQ6CiAgICAgICAgICAgICAgICAjIEZvciBsaW5rIGJhc2VkIHJlcXVpcmVtZW50cyB3ZSBoYXZlIHRvIHB1bGwgdGhlCiAgICAgICAgICAgICAgICAjIHRyZWUgZG93biBhbmQgaW5zcGVjdCB0byBhc3Nlc3MgdGhlIHZlcnNpb24gIywgc28KICAgICAgICAgICAgICAgICMgaXRzIGhhbmRsZWQgd2F5IGRvd24uCiAgICAgICAgICAgICAgICBpZiBub3QgKHNlbGYuZm9yY2VfcmVpbnN0YWxsIG9yIHJlcV90b19pbnN0YWxsLmxpbmspOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLmZpbmRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbCwgdXBncmFkZV9hbGxvd2VkKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfaW5zdGFsbGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBEaXN0cmlidXRpb25Ob3RGb3VuZDoKICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBkaXN0cmlidXRpb24gZm91bmQsIHNvIHdlIHNxdWFzaCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIyBlcnJvciAtIGl0IHdpbGwgYmUgcmFpc2VkIGxhdGVyIHdoZW4gd2UKICAgICAgICAgICAgICAgICAgICAgICAgIyByZS10cnkgbGF0ZXIgdG8gZG8gdGhlIGluc3RhbGwuCiAgICAgICAgICAgICAgICAgICAgICAgICMgV2h5IGRvbid0IHdlIGp1c3QgcmFpc2UgaGVyZT8KICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAgICAgICAgIGlmIG5vdCBiZXN0X2luc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICAjIGRvbid0IHVuaW5zdGFsbCBjb25mbGljdCBpZiB1c2VyIGluc3RhbGwgYW5kCiAgICAgICAgICAgICAgICAgICAgIyBjb25mbGljdCBpcyBub3QgdXNlciBpbnN0YWxsCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IChzZWxmLnVzZV91c2VyX3NpdGUgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9pbl91c2Vyc2l0ZShyZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkpKToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuY29uZmxpY3RzX3dpdGggPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkgPSBOb25lCgogICAgICAgICAgICAjIEZpZ3VyZSBvdXQgYSBuaWNlIG1lc3NhZ2UgdG8gc2F5IHdoeSB3ZSdyZSBza2lwcGluZyB0aGlzLgogICAgICAgICAgICBpZiBiZXN0X2luc3RhbGxlZDoKICAgICAgICAgICAgICAgIHNraXBfcmVhc29uID0gJ2FscmVhZHkgdXAtdG8tZGF0ZScKICAgICAgICAgICAgZWxpZiBzZWxmLnVwZ3JhZGVfc3RyYXRlZ3kgPT0gIm9ubHktaWYtbmVlZGVkIjoKICAgICAgICAgICAgICAgIHNraXBfcmVhc29uID0gJ25vdCB1cGdyYWRlZCBhcyBub3QgZGlyZWN0bHkgcmVxdWlyZWQnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBza2lwX3JlYXNvbiA9ICdhbHJlYWR5IHNhdGlzZmllZCcKCiAgICAgICAgICAgIHJldHVybiBza2lwX3JlYXNvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9wcmVwYXJlX2ZpbGUoc2VsZiwKICAgICAgICAgICAgICAgICAgICAgIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLAogICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXM9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZGVwZW5kZW5jaWVzPUZhbHNlKToKICAgICAgICAiIiJQcmVwYXJlIGEgc2luZ2xlIHJlcXVpcmVtZW50cyBmaWxlLgoKICAgICAgICA6cmV0dXJuOiBBIGxpc3Qgb2YgYWRkaXRpb25hbCBJbnN0YWxsUmVxdWlyZW1lbnRzIHRvIGFsc28gaW5zdGFsbC4KICAgICAgICAiIiIKICAgICAgICAjIFRlbGwgdXNlciB3aGF0IHdlIGFyZSBkb2luZyBmb3IgdGhpcyByZXF1aXJlbWVudDoKICAgICAgICAjIG9idGFpbiAoZWRpdGFibGUpLCBza2lwcGluZywgcHJvY2Vzc2luZyAobG9jYWwgdXJsKSwgY29sbGVjdGluZwogICAgICAgICMgKHJlbW90ZSB1cmwgb3IgcGFja2FnZSBuYW1lKQogICAgICAgIGlmIHJlcV90b19pbnN0YWxsLmNvbnN0cmFpbnQgb3IgcmVxX3RvX2luc3RhbGwucHJlcGFyZWQ6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXFfdG9faW5zdGFsbC5wcmVwYXJlZCA9IFRydWUKCiAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMKICAgICAgICAjICMgcHJpbnQgbG9nIG1lc3NhZ2VzICMgIwogICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuZWRpdGFibGU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdPYnRhaW5pbmcgJXMnLCByZXFfdG9faW5zdGFsbCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHNhdGlzZmllZF9ieSBpcyBvbmx5IGV2YWx1YXRlZCBieSBjYWxsaW5nIF9jaGVja19za2lwX2luc3RhbGxlZCwKICAgICAgICAgICAgIyBzbyBpdCBtdXN0IGJlIE5vbmUgaGVyZS4KICAgICAgICAgICAgYXNzZXJ0IHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSBpcyBOb25lCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlnbm9yZV9pbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICBza2lwX3JlYXNvbiA9IHNlbGYuX2NoZWNrX3NraXBfaW5zdGFsbGVkKAogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLCBmaW5kZXIpCgogICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2tpcF9yZWFzb24gaXMgbm90IE5vbmUsICgKICAgICAgICAgICAgICAgICAgICAnX2NoZWNrX3NraXBfaW5zdGFsbGVkIHJldHVybmVkIE5vbmUgYnV0ICcKICAgICAgICAgICAgICAgICAgICAncmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5IGlzIHNldCB0byAlcicKICAgICAgICAgICAgICAgICAgICAlIChyZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnksKSkKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICdSZXF1aXJlbWVudCAlczogJXMnLCBza2lwX3JlYXNvbiwKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIChyZXFfdG9faW5zdGFsbC5saW5rIGFuZAogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5saW5rLnNjaGVtZSA9PSAnZmlsZScpOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSB1cmxfdG9fcGF0aChyZXFfdG9faW5zdGFsbC5saW5rLnVybCkKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyAlcycsIGRpc3BsYXlfcGF0aChwYXRoKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3RpbmcgJXMnLCByZXFfdG9faW5zdGFsbCkKCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgICAgICAjICMgdmNzIHVwZGF0ZSBvciB1bnBhY2sgYXJjaGl2ZSAjICMKICAgICAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLmVkaXRhYmxlOgogICAgICAgICAgICAgICAgaWYgcmVxdWlyZV9oYXNoZXM6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgZWRpdGFibGUgcmVxdWlyZW1lbnQgJXMgY2Fubm90IGJlIGluc3RhbGxlZCB3aGVuICcKICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVpcmluZyBoYXNoZXMsIGJlY2F1c2UgdGhlcmUgaXMgbm8gc2luZ2xlIGZpbGUgdG8gJwogICAgICAgICAgICAgICAgICAgICAgICAnaGFzaC4nICUgcmVxX3RvX2luc3RhbGwpCiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5lbnN1cmVfaGFzX3NvdXJjZV9kaXIoc2VsZi5zcmNfZGlyKQogICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwudXBkYXRlX2VkaXRhYmxlKG5vdCBzZWxmLmlzX2Rvd25sb2FkKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdCA9IG1ha2VfYWJzdHJhY3RfZGlzdChyZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgICAgIGFic3RyYWN0X2Rpc3QucHJlcF9mb3JfZGlzdCgpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2Rvd25sb2FkOgogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmFyY2hpdmUoc2VsZi5kb3dubG9hZF9kaXIpCiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5jaGVja19pZl9leGlzdHMoKQogICAgICAgICAgICBlbGlmIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieToKICAgICAgICAgICAgICAgIGlmIHJlcXVpcmVfaGFzaGVzOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgJ1NpbmNlIGl0IGlzIGFscmVhZHkgaW5zdGFsbGVkLCB3ZSBhcmUgdHJ1c3RpbmcgdGhpcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlIHdpdGhvdXQgY2hlY2tpbmcgaXRzIGhhc2guIFRvIGVuc3VyZSBhICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXRlbHkgcmVwZWF0YWJsZSBlbnZpcm9ubWVudCwgaW5zdGFsbCBpbnRvIGFuICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2VtcHR5IHZpcnR1YWxlbnYuJykKICAgICAgICAgICAgICAgIGFic3RyYWN0X2Rpc3QgPSBJbnN0YWxsZWQocmVxX3RvX2luc3RhbGwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEBAIGlmIGZpbGVzeXN0ZW0gcGFja2FnZXMgYXJlIG5vdCBtYXJrZWQKICAgICAgICAgICAgICAgICMgZWRpdGFibGUgaW4gYSByZXEsIGEgbm9uIGRldGVybWluaXN0aWMgZXJyb3IKICAgICAgICAgICAgICAgICMgb2NjdXJzIHdoZW4gdGhlIHNjcmlwdCBhdHRlbXB0cyB0byB1bnBhY2sgdGhlCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuZW5zdXJlX2hhc19zb3VyY2VfZGlyKHNlbGYuYnVpbGRfZGlyKQogICAgICAgICAgICAgICAgIyBJZiBhIGNoZWNrb3V0IGV4aXN0cywgaXQncyB1bndpc2UgdG8ga2VlcCBnb2luZy4gIHZlcnNpb24KICAgICAgICAgICAgICAgICMgaW5jb25zaXN0ZW5jaWVzIGFyZSBsb2dnZWQgbGF0ZXIsIGJ1dCBkbyBub3QgZmFpbCB0aGUKICAgICAgICAgICAgICAgICMgaW5zdGFsbGF0aW9uLgogICAgICAgICAgICAgICAgIyBGSVhNRTogdGhpcyB3b24ndCB1cGdyYWRlIHdoZW4gdGhlcmUncyBhbiBleGlzdGluZwogICAgICAgICAgICAgICAgIyBwYWNrYWdlIHVucGFja2VkIGluIGByZXFfdG9faW5zdGFsbC5zb3VyY2VfZGlyYAogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihyZXFfdG9faW5zdGFsbC5zb3VyY2VfZGlyLCAnc2V0dXAucHknKSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUHJldmlvdXNCdWlsZERpckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAicGlwIGNhbid0IHByb2NlZWQgd2l0aCByZXF1aXJlbWVudHMgJyVzJyBkdWUgdG8gYSIKICAgICAgICAgICAgICAgICAgICAgICAgIiBwcmUtZXhpc3RpbmcgYnVpbGQgZGlyZWN0b3J5ICglcykuIFRoaXMgaXMgIgogICAgICAgICAgICAgICAgICAgICAgICAibGlrZWx5IGR1ZSB0byBhIHByZXZpb3VzIGluc3RhbGxhdGlvbiB0aGF0IGZhaWxlZCIKICAgICAgICAgICAgICAgICAgICAgICAgIi4gcGlwIGlzIGJlaW5nIHJlc3BvbnNpYmxlIGFuZCBub3QgYXNzdW1pbmcgaXQgIgogICAgICAgICAgICAgICAgICAgICAgICAiY2FuIGRlbGV0ZSB0aGlzLiBQbGVhc2UgZGVsZXRlIGl0IGFuZCB0cnkgYWdhaW4uIgogICAgICAgICAgICAgICAgICAgICAgICAlIChyZXFfdG9faW5zdGFsbCwgcmVxX3RvX2luc3RhbGwuc291cmNlX2RpcikKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5wb3B1bGF0ZV9saW5rKAogICAgICAgICAgICAgICAgICAgIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICBzZWxmLl9pc191cGdyYWRlX2FsbG93ZWQocmVxX3RvX2luc3RhbGwpLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfaGFzaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAjIFdlIGNhbid0IGhpdCB0aGlzIHNwb3QgYW5kIGhhdmUgcG9wdWxhdGVfbGluayByZXR1cm4gTm9uZS4KICAgICAgICAgICAgICAgICMgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5IGlzIE5vbmUgaGVyZSAoYmVjYXVzZSB3ZSdyZQogICAgICAgICAgICAgICAgIyBndWFyZGVkKSBhbmQgdXBncmFkZSBoYXMgbm8gaW1wYWN0IGV4Y2VwdCB3aGVuIHNhdGlzZmllZF9ieQogICAgICAgICAgICAgICAgIyBpcyBub3QgTm9uZS4KICAgICAgICAgICAgICAgICMgVGhlbiBpbnNpZGUgZmluZF9yZXF1aXJlbWVudCBleGlzdGluZ19hcHBsaWNhYmxlIC0+IEZhbHNlCiAgICAgICAgICAgICAgICAjIElmIG5vIG5ldyB2ZXJzaW9ucyBhcmUgZm91bmQsIERpc3RyaWJ1dGlvbk5vdEZvdW5kIGlzIHJhaXNlZCwKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIGEgcmVzdWx0IGlzIGd1YXJhbnRlZWQuCiAgICAgICAgICAgICAgICBhc3NlcnQgcmVxX3RvX2luc3RhbGwubGluawogICAgICAgICAgICAgICAgbGluayA9IHJlcV90b19pbnN0YWxsLmxpbmsKCiAgICAgICAgICAgICAgICAjIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHJlYWwgbGluaywgd2UgY2FuIHRlbGwgd2hhdCBraW5kIG9mCiAgICAgICAgICAgICAgICAjIHJlcXVpcmVtZW50cyB3ZSBoYXZlIGFuZCByYWlzZSBzb21lIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3JzCiAgICAgICAgICAgICAgICAjIHRoYW4gb3RoZXJ3aXNlLiAoRm9yIGV4YW1wbGUsIHdlIGNhbiByYWlzZSBWY3NIYXNoVW5zdXBwb3J0ZWQKICAgICAgICAgICAgICAgICMgZm9yIGEgVkNTIFVSTCByYXRoZXIgdGhhbiBIYXNoTWlzc2luZy4pCiAgICAgICAgICAgICAgICBpZiByZXF1aXJlX2hhc2hlczoKICAgICAgICAgICAgICAgICAgICAjIFdlIGNvdWxkIGNoZWNrIHRoZXNlIGZpcnN0IDIgY29uZGl0aW9ucyBpbnNpZGUKICAgICAgICAgICAgICAgICAgICAjIHVucGFja191cmwgYW5kIHNhdmUgcmVwZXRpdGlvbiBvZiBjb25kaXRpb25zLCBidXQgdGhlbgogICAgICAgICAgICAgICAgICAgICMgd2Ugd291bGQgcmVwb3J0IGxlc3MtdXNlZnVsIGVycm9yIG1lc3NhZ2VzIGZvcgogICAgICAgICAgICAgICAgICAgICMgdW5oYXNoYWJsZSByZXF1aXJlbWVudHMsIGNvbXBsYWluaW5nIHRoYXQgdGhlcmUncyBubwogICAgICAgICAgICAgICAgICAgICMgaGFzaCBwcm92aWRlZC4KICAgICAgICAgICAgICAgICAgICBpZiBpc192Y3NfdXJsKGxpbmspOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWY3NIYXNoVW5zdXBwb3J0ZWQoKQogICAgICAgICAgICAgICAgICAgIGVsaWYgaXNfZmlsZV91cmwobGluaykgYW5kIGlzX2Rpcl91cmwobGluayk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpcmVjdG9yeVVybEhhc2hVbnN1cHBvcnRlZCgpCiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCByZXFfdG9faW5zdGFsbC5vcmlnaW5hbF9saW5rIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHJlcV90b19pbnN0YWxsLmlzX3Bpbm5lZCk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgVW5waW5uZWQgcGFja2FnZXMgYXJlIGFza2luZyBmb3IgdHJvdWJsZSB3aGVuIGEgbmV3CiAgICAgICAgICAgICAgICAgICAgICAgICMgdmVyc2lvbiBpcyB1cGxvYWRlZC4gVGhpcyBpc24ndCBhIHNlY3VyaXR5IGNoZWNrLCBidXQKICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCBzYXZlcyB1c2VycyBhIHN1cnByaXNpbmcgaGFzaCBtaXNtYXRjaCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIyBmdXR1cmUuCiAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICAgICAgIyBmaWxlOi8vLyBVUkxzIGFyZW4ndCBwaW5uYWJsZSwgc28gZG9uJ3QgY29tcGxhaW4KICAgICAgICAgICAgICAgICAgICAgICAgIyBhYm91dCB0aGVtIG5vdCBiZWluZyBwaW5uZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEhhc2hVbnBpbm5lZCgpCiAgICAgICAgICAgICAgICBoYXNoZXMgPSByZXFfdG9faW5zdGFsbC5oYXNoZXMoCiAgICAgICAgICAgICAgICAgICAgdHJ1c3RfaW50ZXJuZXQ9bm90IHJlcXVpcmVfaGFzaGVzKQogICAgICAgICAgICAgICAgaWYgcmVxdWlyZV9oYXNoZXMgYW5kIG5vdCBoYXNoZXM6CiAgICAgICAgICAgICAgICAgICAgIyBLbm93bi1nb29kIGhhc2hlcyBhcmUgbWlzc2luZyBmb3IgdGhpcyByZXF1aXJlbWVudCwgc28KICAgICAgICAgICAgICAgICAgICAjIHNoaW0gaXQgd2l0aCBhIGZhY2FkZSBvYmplY3QgdGhhdCB3aWxsIHByb3Zva2UgaGFzaAogICAgICAgICAgICAgICAgICAgICMgY29tcHV0YXRpb24gYW5kIHRoZW4gcmFpc2UgYSBIYXNoTWlzc2luZyBleGNlcHRpb24KICAgICAgICAgICAgICAgICAgICAjIHNob3dpbmcgdGhlIHVzZXIgd2hhdCB0aGUgaGFzaCBzaG91bGQgYmUuCiAgICAgICAgICAgICAgICAgICAgaGFzaGVzID0gTWlzc2luZ0hhc2hlcygpCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciA9IHNlbGYuZG93bmxvYWRfZGlyCiAgICAgICAgICAgICAgICAgICAgIyBXZSBhbHdheXMgZGVsZXRlIHVucGFja2VkIHNkaXN0cyBhZnRlciBwaXAgcmFuLgogICAgICAgICAgICAgICAgICAgIGF1dG9kZWxldGVfdW5wYWNrZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwubGluay5pc193aGVlbCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi53aGVlbF9kb3dubG9hZF9kaXI6CiAgICAgICAgICAgICAgICAgICAgICAgICMgd2hlbiBkb2luZyAncGlwIHdoZWVsYCB3ZSBkb3dubG9hZCB3aGVlbHMgdG8gYQogICAgICAgICAgICAgICAgICAgICAgICAjIGRlZGljYXRlZCBkaXIuCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciA9IHNlbGYud2hlZWxfZG93bmxvYWRfZGlyCiAgICAgICAgICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwubGluay5pc193aGVlbDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZG93bmxvYWRfZGlyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXaGVuIGRvd25sb2FkaW5nLCB3ZSBvbmx5IHVucGFjayB3aGVlbHMgdG8gZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ldGFkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2RlbGV0ZV91bnBhY2tlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2hlbiBpbnN0YWxsaW5nIGEgd2hlZWwsIHdlIHVzZSB0aGUgdW5wYWNrZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hlZWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZGVsZXRlX3VucGFja2VkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICB1bnBhY2tfdXJsKAogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5saW5rLCByZXFfdG9faW5zdGFsbC5zb3VyY2VfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXIsIGF1dG9kZWxldGVfdW5wYWNrZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2VsZi5zZXNzaW9uLCBoYXNoZXM9aGFzaGVzKQogICAgICAgICAgICAgICAgZXhjZXB0IHJlcXVlc3RzLkhUVFBFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGluc3RhbGwgcmVxdWlyZW1lbnQgJXMgYmVjYXVzZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICdvZiBlcnJvciAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLAogICAgICAgICAgICAgICAgICAgICAgICBleGMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGluc3RhbGwgcmVxdWlyZW1lbnQgJXMgYmVjYXVzZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICdvZiBIVFRQIGVycm9yICVzIGZvciBVUkwgJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgKHJlcV90b19pbnN0YWxsLCBleGMsIHJlcV90b19pbnN0YWxsLmxpbmspCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdCA9IG1ha2VfYWJzdHJhY3RfZGlzdChyZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgICAgIGFic3RyYWN0X2Rpc3QucHJlcF9mb3JfZGlzdCgpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2Rvd25sb2FkOgogICAgICAgICAgICAgICAgICAgICMgTWFrZSBhIC56aXAgb2YgdGhlIHNvdXJjZV9kaXIgd2UgYWxyZWFkeSBjcmVhdGVkLgogICAgICAgICAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLmxpbmsuc2NoZW1lIGluIHZjcy5hbGxfc2NoZW1lczoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuYXJjaGl2ZShzZWxmLmRvd25sb2FkX2RpcikKICAgICAgICAgICAgICAgICMgcmVxX3RvX2luc3RhbGwucmVxIGlzIG9ubHkgYXZhaWwgYWZ0ZXIgdW5wYWNrIGZvciBVUkwKICAgICAgICAgICAgICAgICMgcGtncyByZXBlYXQgY2hlY2tfaWZfZXhpc3RzIHRvIHVuaW5zdGFsbC1vbi11cGdyYWRlCiAgICAgICAgICAgICAgICAjICgjMTQpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmNoZWNrX2lmX2V4aXN0cygpCiAgICAgICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi51cGdyYWRlIG9yIHNlbGYuaWdub3JlX2luc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCB1bmluc3RhbGwgY29uZmxpY3QgaWYgdXNlciBpbnN0YWxsIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbmZsaWN0IGlzIG5vdCB1c2VyIGluc3RhbGwKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IChzZWxmLnVzZV91c2VyX3NpdGUgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfaW5fdXNlcnNpdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSkpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuY29uZmxpY3RzX3dpdGggPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZXF1aXJlbWVudCBhbHJlYWR5IHNhdGlzZmllZCAodXNlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXVwZ3JhZGUgdG8gdXBncmFkZSk6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLAogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgICAgICAjICMgcGFyc2UgZGVwZW5kZW5jaWVzICMgIwogICAgICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgICAgICBkaXN0ID0gYWJzdHJhY3RfZGlzdC5kaXN0KGZpbmRlcikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY2hlY2tfZGlzdF9yZXF1aXJlc19weXRob24oZGlzdCkKICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkUHl0aG9uVmVyc2lvbiBhcyBlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVfcmVxdWlyZXNfcHl0aG9uOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGUuYXJnc1swXSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwucmVtb3ZlX3RlbXBvcmFyeV9zb3VyY2UoKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIG1vcmVfcmVxcyA9IFtdCgogICAgICAgICAgICBkZWYgYWRkX3JlcShzdWJyZXEsIGV4dHJhc19yZXF1ZXN0ZWQpOgogICAgICAgICAgICAgICAgc3ViX2luc3RhbGxfcmVxID0gSW5zdGFsbFJlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgICAgIHN0cihzdWJyZXEpLAogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLAogICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPXNlbGYuaXNvbGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9c2VsZi5fd2hlZWxfY2FjaGUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBtb3JlX3JlcXMuZXh0ZW5kKHNlbGYuYWRkX3JlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgICAgIHN1Yl9pbnN0YWxsX3JlcSwgcmVxX3RvX2luc3RhbGwubmFtZSwKICAgICAgICAgICAgICAgICAgICBleHRyYXNfcmVxdWVzdGVkPWV4dHJhc19yZXF1ZXN0ZWQpKQoKICAgICAgICAgICAgIyBXZSBhZGQgcmVxX3RvX2luc3RhbGwgYmVmb3JlIGl0cyBkZXBlbmRlbmNpZXMsIHNvIHRoYXQgd2UKICAgICAgICAgICAgIyBjYW4gcmVmZXIgdG8gaXQgd2hlbiBhZGRpbmcgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICBpZiBub3Qgc2VsZi5oYXNfcmVxdWlyZW1lbnQocmVxX3RvX2luc3RhbGwubmFtZSk6CiAgICAgICAgICAgICAgICAjICd1bm5hbWVkJyByZXF1aXJlbWVudHMgd2lsbCBnZXQgYWRkZWQgaGVyZQogICAgICAgICAgICAgICAgc2VsZi5hZGRfcmVxdWlyZW1lbnQocmVxX3RvX2luc3RhbGwsIE5vbmUpCgogICAgICAgICAgICBpZiBub3QgaWdub3JlX2RlcGVuZGVuY2llczoKICAgICAgICAgICAgICAgIGlmIChyZXFfdG9faW5zdGFsbC5leHRyYXMpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgIkluc3RhbGxpbmcgZXh0cmEgcmVxdWlyZW1lbnRzOiAlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICcsJy5qb2luKHJlcV90b19pbnN0YWxsLmV4dHJhcyksCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbWlzc2luZ19yZXF1ZXN0ZWQgPSBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgc2V0KHJlcV90b19pbnN0YWxsLmV4dHJhcykgLSBzZXQoZGlzdC5leHRyYXMpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgbWlzc2luZyBpbiBtaXNzaW5nX3JlcXVlc3RlZDoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJyVzIGRvZXMgbm90IHByb3ZpZGUgdGhlIGV4dHJhIFwnJXNcJycsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QsIG1pc3NpbmcKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgYXZhaWxhYmxlX3JlcXVlc3RlZCA9IHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICBzZXQoZGlzdC5leHRyYXMpICYgc2V0KHJlcV90b19pbnN0YWxsLmV4dHJhcykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBzdWJyZXEgaW4gZGlzdC5yZXF1aXJlcyhhdmFpbGFibGVfcmVxdWVzdGVkKToKICAgICAgICAgICAgICAgICAgICBhZGRfcmVxKHN1YnJlcSwgZXh0cmFzX3JlcXVlc3RlZD1hdmFpbGFibGVfcmVxdWVzdGVkKQoKICAgICAgICAgICAgIyBjbGVhbnVwIHRtcCBzcmMKICAgICAgICAgICAgc2VsZi5yZXFzX3RvX2NsZWFudXAuYXBwZW5kKHJlcV90b19pbnN0YWxsKQoKICAgICAgICAgICAgaWYgbm90IHJlcV90b19pbnN0YWxsLmVkaXRhYmxlIGFuZCBub3QgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICAgICAgIyBYWFg6IC0tbm8taW5zdGFsbCBsZWFkcyB0aGlzIHRvIHJlcG9ydCAnU3VjY2Vzc2Z1bGx5CiAgICAgICAgICAgICAgICAjIGRvd25sb2FkZWQnIGZvciBvbmx5IG5vbi1lZGl0YWJsZSByZXFzLCBldmVuIHRob3VnaCB3ZSB0b29rCiAgICAgICAgICAgICAgICAjIGFjdGlvbiBvbiB0aGVtLgogICAgICAgICAgICAgICAgc2VsZi5zdWNjZXNzZnVsbHlfZG93bmxvYWRlZC5hcHBlbmQocmVxX3RvX2luc3RhbGwpCgogICAgICAgIHJldHVybiBtb3JlX3JlcXMKCiAgICBkZWYgY2xlYW51cF9maWxlcyhzZWxmKToKICAgICAgICAiIiJDbGVhbiB1cCBmaWxlcywgcmVtb3ZlIGJ1aWxkcy4iIiIKICAgICAgICBsb2dnZXIuZGVidWcoJ0NsZWFuaW5nIHVwLi4uJykKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgZm9yIHJlcSBpbiBzZWxmLnJlcXNfdG9fY2xlYW51cDoKICAgICAgICAgICAgICAgIHJlcS5yZW1vdmVfdGVtcG9yYXJ5X3NvdXJjZSgpCgogICAgZGVmIF90b19pbnN0YWxsKHNlbGYpOgogICAgICAgICIiIkNyZWF0ZSB0aGUgaW5zdGFsbGF0aW9uIG9yZGVyLgoKICAgICAgICBUaGUgaW5zdGFsbGF0aW9uIG9yZGVyIGlzIHRvcG9sb2dpY2FsIC0gcmVxdWlyZW1lbnRzIGFyZSBpbnN0YWxsZWQKICAgICAgICBiZWZvcmUgdGhlIHJlcXVpcmluZyB0aGluZy4gV2UgYnJlYWsgY3ljbGVzIGF0IGFuIGFyYml0cmFyeSBwb2ludCwKICAgICAgICBhbmQgbWFrZSBubyBvdGhlciBndWFyYW50ZWVzLgogICAgICAgICIiIgogICAgICAgICMgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHdoaWNoIHdlIG1heSBjaGFuZ2UgYXQgYW55IHBvaW50CiAgICAgICAgIyBpbnN0YWxscyB0aGUgdXNlciBzcGVjaWZpZWQgdGhpbmdzIGluIHRoZSBvcmRlciBnaXZlbiwgZXhjZXB0IHdoZW4KICAgICAgICAjIGRlcGVuZGVuY2llcyBtdXN0IGNvbWUgZWFybGllciB0byBhY2hpZXZlIHRvcG9sb2dpY2FsIG9yZGVyLgogICAgICAgIG9yZGVyID0gW10KICAgICAgICBvcmRlcmVkX3JlcXMgPSBzZXQoKQoKICAgICAgICBkZWYgc2NoZWR1bGUocmVxKToKICAgICAgICAgICAgaWYgcmVxLnNhdGlzZmllZF9ieSBvciByZXEgaW4gb3JkZXJlZF9yZXFzOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmIHJlcS5jb25zdHJhaW50OgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIG9yZGVyZWRfcmVxcy5hZGQocmVxKQogICAgICAgICAgICBmb3IgZGVwIGluIHNlbGYuX2RlcGVuZGVuY2llc1tyZXFdOgogICAgICAgICAgICAgICAgc2NoZWR1bGUoZGVwKQogICAgICAgICAgICBvcmRlci5hcHBlbmQocmVxKQogICAgICAgIGZvciBpbnN0YWxsX3JlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKToKICAgICAgICAgICAgc2NoZWR1bGUoaW5zdGFsbF9yZXEpCiAgICAgICAgcmV0dXJuIG9yZGVyCgogICAgZGVmIGluc3RhbGwoc2VsZiwgaW5zdGFsbF9vcHRpb25zLCBnbG9iYWxfb3B0aW9ucz0oKSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIGV2ZXJ5dGhpbmcgaW4gdGhpcyBzZXQgKGFmdGVyIGhhdmluZyBkb3dubG9hZGVkIGFuZCB1bnBhY2tlZAogICAgICAgIHRoZSBwYWNrYWdlcykKICAgICAgICAiIiIKICAgICAgICB0b19pbnN0YWxsID0gc2VsZi5fdG9faW5zdGFsbCgpCgogICAgICAgIGlmIHRvX2luc3RhbGw6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ0luc3RhbGxpbmcgY29sbGVjdGVkIHBhY2thZ2VzOiAlcycsCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oW3JlcS5uYW1lIGZvciByZXEgaW4gdG9faW5zdGFsbF0pLAogICAgICAgICAgICApCgogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBmb3IgcmVxdWlyZW1lbnQgaW4gdG9faW5zdGFsbDoKICAgICAgICAgICAgICAgIGlmIHJlcXVpcmVtZW50LmNvbmZsaWN0c193aXRoOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAnRm91bmQgZXhpc3RpbmcgaW5zdGFsbGF0aW9uOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LmNvbmZsaWN0c193aXRoLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQudW5pbnN0YWxsKGF1dG9fY29uZmlybT1UcnVlKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50Lmluc3RhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICphcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAqKmt3YXJncwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICAgICAjIGlmIGluc3RhbGwgZGlkIG5vdCBzdWNjZWVkLCByb2xsYmFjayBwcmV2aW91cyB1bmluc3RhbGwKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZW1lbnQuY29uZmxpY3RzX3dpdGggYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuaW5zdGFsbF9zdWNjZWVkZWQpOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5yb2xsYmFja191bmluc3RhbGwoKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlbWVudC5jb25mbGljdHNfd2l0aCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50Lmluc3RhbGxfc3VjY2VlZGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuY29tbWl0X3VuaW5zdGFsbCgpCiAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5yZW1vdmVfdGVtcG9yYXJ5X3NvdXJjZSgpCgogICAgICAgIHNlbGYuc3VjY2Vzc2Z1bGx5X2luc3RhbGxlZCA9IHRvX2luc3RhbGwKUEsDBBQAAAAAAAAAIQAFRsRw8RoAAPEaAAA1AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV91bmluc3RhbGwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCB0ZW1wZmlsZQoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCB1c2VzX3B5Y2FjaGUsIFdJTkRPV1MsIGNhY2hlX2Zyb21fc291cmNlCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IFVuaW5zdGFsbGF0aW9uRXJyb3IKZnJvbSBwaXAudXRpbHMgaW1wb3J0IHJtdHJlZSwgYXNrLCBpc19sb2NhbCwgcmVuYW1lcywgbm9ybWFsaXplX3BhdGgKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFVuaW5zdGFsbFBhdGhTZXQob2JqZWN0KToKICAgICIiIkEgc2V0IG9mIGZpbGUgcGF0aHMgdG8gYmUgcmVtb3ZlZCBpbiB0aGUgdW5pbnN0YWxsYXRpb24gb2YgYQogICAgcmVxdWlyZW1lbnQuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCk6CiAgICAgICAgc2VsZi5wYXRocyA9IHNldCgpCiAgICAgICAgc2VsZi5fcmVmdXNlID0gc2V0KCkKICAgICAgICBzZWxmLnB0aCA9IHt9CiAgICAgICAgc2VsZi5kaXN0ID0gZGlzdAogICAgICAgIHNlbGYuc2F2ZV9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5fbW92ZWRfcGF0aHMgPSBbXQoKICAgIGRlZiBfcGVybWl0dGVkKHNlbGYsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIG9uZSB3ZSBhcmUgcGVybWl0dGVkIHRvCiAgICAgICAgcmVtb3ZlL21vZGlmeSwgRmFsc2Ugb3RoZXJ3aXNlLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaXNfbG9jYWwocGF0aCkKCiAgICBkZWYgYWRkKHNlbGYsIHBhdGgpOgogICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCgogICAgICAgICMgd2Ugbm9ybWFsaXplIHRoZSBoZWFkIHRvIHJlc29sdmUgcGFyZW50IGRpcmVjdG9yeSBzeW1saW5rcywgYnV0IG5vdAogICAgICAgICMgdGhlIHRhaWwsIHNpbmNlIHdlIG9ubHkgd2FudCB0byB1bmluc3RhbGwgc3ltbGlua3MsIG5vdCB0aGVpciB0YXJnZXRzCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihub3JtYWxpemVfcGF0aChoZWFkKSwgb3MucGF0aC5ub3JtY2FzZSh0YWlsKSkKCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBzZWxmLl9wZXJtaXR0ZWQocGF0aCk6CiAgICAgICAgICAgIHNlbGYucGF0aHMuYWRkKHBhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fcmVmdXNlLmFkZChwYXRoKQoKICAgICAgICAjIF9fcHljYWNoZV9fIGZpbGVzIGNhbiBzaG93IHVwIGFmdGVyICdpbnN0YWxsZWQtZmlsZXMudHh0JyBpcyBjcmVhdGVkLAogICAgICAgICMgZHVlIHRvIGltcG9ydHMKICAgICAgICBpZiBvcy5wYXRoLnNwbGl0ZXh0KHBhdGgpWzFdID09ICcucHknIGFuZCB1c2VzX3B5Y2FjaGU6CiAgICAgICAgICAgIHNlbGYuYWRkKGNhY2hlX2Zyb21fc291cmNlKHBhdGgpKQoKICAgIGRlZiBhZGRfcHRoKHNlbGYsIHB0aF9maWxlLCBlbnRyeSk6CiAgICAgICAgcHRoX2ZpbGUgPSBub3JtYWxpemVfcGF0aChwdGhfZmlsZSkKICAgICAgICBpZiBzZWxmLl9wZXJtaXR0ZWQocHRoX2ZpbGUpOgogICAgICAgICAgICBpZiBwdGhfZmlsZSBub3QgaW4gc2VsZi5wdGg6CiAgICAgICAgICAgICAgICBzZWxmLnB0aFtwdGhfZmlsZV0gPSBVbmluc3RhbGxQdGhFbnRyaWVzKHB0aF9maWxlKQogICAgICAgICAgICBzZWxmLnB0aFtwdGhfZmlsZV0uYWRkKGVudHJ5KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3JlZnVzZS5hZGQocHRoX2ZpbGUpCgogICAgZGVmIGNvbXBhY3Qoc2VsZiwgcGF0aHMpOgogICAgICAgICIiIkNvbXBhY3QgYSBwYXRoIHNldCB0byBjb250YWluIHRoZSBtaW5pbWFsIG51bWJlciBvZiBwYXRocwogICAgICAgIG5lY2Vzc2FyeSB0byBjb250YWluIGFsbCBwYXRocyBpbiB0aGUgc2V0LiBJZiAvYS9wYXRoLyBhbmQKICAgICAgICAvYS9wYXRoL3RvL2EvZmlsZS50eHQgYXJlIGJvdGggaW4gdGhlIHNldCwgbGVhdmUgb25seSB0aGUKICAgICAgICBzaG9ydGVyIHBhdGguIiIiCiAgICAgICAgc2hvcnRfcGF0aHMgPSBzZXQoKQogICAgICAgIGZvciBwYXRoIGluIHNvcnRlZChwYXRocywga2V5PWxlbik6CiAgICAgICAgICAgIGlmIG5vdCBhbnkoWwogICAgICAgICAgICAgICAgICAgIChwYXRoLnN0YXJ0c3dpdGgoc2hvcnRwYXRoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgcGF0aFtsZW4oc2hvcnRwYXRoLnJzdHJpcChvcy5wYXRoLnNlcCkpXSA9PSBvcy5wYXRoLnNlcCkKICAgICAgICAgICAgICAgICAgICBmb3Igc2hvcnRwYXRoIGluIHNob3J0X3BhdGhzXSk6CiAgICAgICAgICAgICAgICBzaG9ydF9wYXRocy5hZGQocGF0aCkKICAgICAgICByZXR1cm4gc2hvcnRfcGF0aHMKCiAgICBkZWYgX3N0YXNoKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuc2F2ZV9kaXIsIG9zLnBhdGguc3BsaXRkcml2ZShwYXRoKVsxXS5sc3RyaXAob3MucGF0aC5zZXApKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgYXV0b19jb25maXJtPUZhbHNlKToKICAgICAgICAiIiJSZW1vdmUgcGF0aHMgaW4gYGBzZWxmLnBhdGhzYGAgd2l0aCBjb25maXJtYXRpb24gKHVubGVzcwogICAgICAgIGBgYXV0b19jb25maXJtYGAgaXMgVHJ1ZSkuIiIiCiAgICAgICAgaWYgbm90IHNlbGYucGF0aHM6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgIkNhbid0IHVuaW5zdGFsbCAnJXMnLiBObyBmaWxlcyB3ZXJlIGZvdW5kIHRvIHVuaW5zdGFsbC4iLAogICAgICAgICAgICAgICAgc2VsZi5kaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgJ1VuaW5zdGFsbGluZyAlcy0lczonLAogICAgICAgICAgICBzZWxmLmRpc3QucHJvamVjdF9uYW1lLCBzZWxmLmRpc3QudmVyc2lvbgogICAgICAgICkKCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgIHBhdGhzID0gc29ydGVkKHNlbGYuY29tcGFjdChzZWxmLnBhdGhzKSkKCiAgICAgICAgICAgIGlmIGF1dG9fY29uZmlybToKICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gJ3knCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhwYXRoKQogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhc2soJ1Byb2NlZWQgKHkvbik/ICcsICgneScsICduJykpCiAgICAgICAgICAgIGlmIHNlbGYuX3JlZnVzZToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdOb3QgcmVtb3Zpbmcgb3IgbW9kaWZ5aW5nIChvdXRzaWRlIG9mIHByZWZpeCk6JykKICAgICAgICAgICAgICAgIGZvciBwYXRoIGluIHNlbGYuY29tcGFjdChzZWxmLl9yZWZ1c2UpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHBhdGgpCiAgICAgICAgICAgIGlmIHJlc3BvbnNlID09ICd5JzoKICAgICAgICAgICAgICAgIHNlbGYuc2F2ZV9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHN1ZmZpeD0nLXVuaW5zdGFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9J3BpcC0nKQogICAgICAgICAgICAgICAgZm9yIHBhdGggaW4gcGF0aHM6CiAgICAgICAgICAgICAgICAgICAgbmV3X3BhdGggPSBzZWxmLl9zdGFzaChwYXRoKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZpbmcgZmlsZSBvciBkaXJlY3RvcnkgJXMnLCBwYXRoKQogICAgICAgICAgICAgICAgICAgIHNlbGYuX21vdmVkX3BhdGhzLmFwcGVuZChwYXRoKQogICAgICAgICAgICAgICAgICAgIHJlbmFtZXMocGF0aCwgbmV3X3BhdGgpCiAgICAgICAgICAgICAgICBmb3IgcHRoIGluIHNlbGYucHRoLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgIHB0aC5yZW1vdmUoKQogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAlcy0lcycsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0LnByb2plY3RfbmFtZSwgc2VsZi5kaXN0LnZlcnNpb24KICAgICAgICAgICAgICAgICkKCiAgICBkZWYgcm9sbGJhY2soc2VsZik6CiAgICAgICAgIiIiUm9sbGJhY2sgdGhlIGNoYW5nZXMgcHJldmlvdXNseSBtYWRlIGJ5IHJlbW92ZSgpLiIiIgogICAgICAgIGlmIHNlbGYuc2F2ZV9kaXIgaXMgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHJvbGwgYmFjayAlczsgd2FzIG5vdCB1bmluc3RhbGxlZCIsCiAgICAgICAgICAgICAgICBzZWxmLmRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGxvZ2dlci5pbmZvKCdSb2xsaW5nIGJhY2sgdW5pbnN0YWxsIG9mICVzJywgc2VsZi5kaXN0LnByb2plY3RfbmFtZSkKICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLl9tb3ZlZF9wYXRoczoKICAgICAgICAgICAgdG1wX3BhdGggPSBzZWxmLl9zdGFzaChwYXRoKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlcGxhY2luZyAlcycsIHBhdGgpCiAgICAgICAgICAgIHJlbmFtZXModG1wX3BhdGgsIHBhdGgpCiAgICAgICAgZm9yIHB0aCBpbiBzZWxmLnB0aC52YWx1ZXMoKToKICAgICAgICAgICAgcHRoLnJvbGxiYWNrKCkKCiAgICBkZWYgY29tbWl0KHNlbGYpOgogICAgICAgICIiIlJlbW92ZSB0ZW1wb3Jhcnkgc2F2ZSBkaXI6IHJvbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIHBvc3NpYmxlLiIiIgogICAgICAgIGlmIHNlbGYuc2F2ZV9kaXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJtdHJlZShzZWxmLnNhdmVfZGlyKQogICAgICAgICAgICBzZWxmLnNhdmVfZGlyID0gTm9uZQogICAgICAgICAgICBzZWxmLl9tb3ZlZF9wYXRocyA9IFtdCgoKY2xhc3MgVW5pbnN0YWxsUHRoRW50cmllcyhvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHB0aF9maWxlKToKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUocHRoX2ZpbGUpOgogICAgICAgICAgICByYWlzZSBVbmluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCByZW1vdmUgZW50cmllcyBmcm9tIG5vbmV4aXN0ZW50IGZpbGUgJXMiICUgcHRoX2ZpbGUKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuZmlsZSA9IHB0aF9maWxlCiAgICAgICAgc2VsZi5lbnRyaWVzID0gc2V0KCkKICAgICAgICBzZWxmLl9zYXZlZF9saW5lcyA9IE5vbmUKCiAgICBkZWYgYWRkKHNlbGYsIGVudHJ5KToKICAgICAgICBlbnRyeSA9IG9zLnBhdGgubm9ybWNhc2UoZW50cnkpCiAgICAgICAgIyBPbiBXaW5kb3dzLCBvcy5wYXRoLm5vcm1jYXNlIGNvbnZlcnRzIHRoZSBlbnRyeSB0byB1c2UKICAgICAgICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBpcyBjb3JyZWN0IGZvciBlbnRyaWVzIHRoYXQgZGVzY3JpYmUgYWJzb2x1dGUKICAgICAgICAjIHBhdGhzIG91dHNpZGUgb2Ygc2l0ZS1wYWNrYWdlcywgYnV0IGFsbCB0aGUgb3RoZXJzIHVzZSBmb3J3YXJkCiAgICAgICAgIyBzbGFzaGVzLgogICAgICAgIGlmIFdJTkRPV1MgYW5kIG5vdCBvcy5wYXRoLnNwbGl0ZHJpdmUoZW50cnkpWzBdOgogICAgICAgICAgICBlbnRyeSA9IGVudHJ5LnJlcGxhY2UoJ1xcJywgJy8nKQogICAgICAgIHNlbGYuZW50cmllcy5hZGQoZW50cnkpCgogICAgZGVmIHJlbW92ZShzZWxmKToKICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92aW5nIHB0aCBlbnRyaWVzIGZyb20gJXM6Jywgc2VsZi5maWxlKQogICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGUsICdyYicpIGFzIGZoOgogICAgICAgICAgICAjIHdpbmRvd3MgdXNlcyAnXHJcbicgd2l0aCBweTNrLCBidXQgdXNlcyAnXG4nIHdpdGggcHkyLngKICAgICAgICAgICAgbGluZXMgPSBmaC5yZWFkbGluZXMoKQogICAgICAgICAgICBzZWxmLl9zYXZlZF9saW5lcyA9IGxpbmVzCiAgICAgICAgaWYgYW55KGInXHJcbicgaW4gbGluZSBmb3IgbGluZSBpbiBsaW5lcyk6CiAgICAgICAgICAgIGVuZGxpbmUgPSAnXHJcbicKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbmRsaW5lID0gJ1xuJwogICAgICAgIGZvciBlbnRyeSBpbiBzZWxmLmVudHJpZXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZpbmcgZW50cnk6ICVzJywgZW50cnkpCiAgICAgICAgICAgICAgICBsaW5lcy5yZW1vdmUoKGVudHJ5ICsgZW5kbGluZSkuZW5jb2RlKCJ1dGYtOCIpKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlLCAnd2InKSBhcyBmaDoKICAgICAgICAgICAgZmgud3JpdGVsaW5lcyhsaW5lcykKCiAgICBkZWYgcm9sbGJhY2soc2VsZik6CiAgICAgICAgaWYgc2VsZi5fc2F2ZWRfbGluZXMgaXMgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgJ0Nhbm5vdCByb2xsIGJhY2sgY2hhbmdlcyB0byAlcywgbm9uZSB3ZXJlIG1hZGUnLCBzZWxmLmZpbGUKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBsb2dnZXIuZGVidWcoJ1JvbGxpbmcgJXMgYmFjayB0byBwcmV2aW91cyBzdGF0ZScsIHNlbGYuZmlsZSkKICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlLCAnd2InKSBhcyBmaDoKICAgICAgICAgICAgZmgud3JpdGVsaW5lcyhzZWxmLl9zYXZlZF9saW5lcykKICAgICAgICByZXR1cm4gVHJ1ZQpQSwMEFAAAAAAAAAAhANusd/acAAAAnAAAADAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9zdGF0dXNfY29kZXMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKU1VDQ0VTUyA9IDAKRVJST1IgPSAxClVOS05PV05fRVJST1IgPSAyClZJUlRVQUxFTlZfTk9UX0ZPVU5EID0gMwpQUkVWSU9VU19CVUlMRF9ESVJfRVJST1IgPSA0Ck5PX01BVENIRVNfRk9VTkQgPSAyMwpQSwMEFAAAAAAAAAAhAOBatL4zagAAM2oAADIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgZXJybm8KaW1wb3J0IGlvCmltcG9ydCBsb2NhbGUKIyB3ZSBoYXZlIGEgc3VibW9kdWxlIG5hbWVkICdsb2dnaW5nJyB3aGljaCB3b3VsZCBzaGFkb3cgdGhpcyBpZiB3ZSB1c2VkIHRoZQojIHJlZ3VsYXIgbmFtZToKaW1wb3J0IGxvZ2dpbmcgYXMgc3RkX2xvZ2dpbmcKaW1wb3J0IHJlCmltcG9ydCBvcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN0YXQKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwppbXBvcnQgdGFyZmlsZQppbXBvcnQgemlwZmlsZQoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSW5zdGFsbGF0aW9uRXJyb3IKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBjb25zb2xlX3RvX3N0ciwgZXhwYW5kdXNlciwgc3RkbGliX3BrZ3MKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCAoCiAgICBzaXRlX3BhY2thZ2VzLCB1c2VyX3NpdGUsIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudiwgdmlydHVhbGVudl9ub19nbG9iYWwsCiAgICB3cml0ZV9kZWxldGVfbWFya2VyX2ZpbGUsCikKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgaW5wdXQKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IFBZMgpmcm9tIHBpcC5fdmVuZG9yLnJldHJ5aW5nIGltcG9ydCByZXRyeQoKaWYgUFkyOgogICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTyBhcyBTdHJpbmdJTwplbHNlOgogICAgZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KCl9fYWxsX18gPSBbJ3JtdHJlZScsICdkaXNwbGF5X3BhdGgnLCAnYmFja3VwX2RpcicsCiAgICAgICAgICAgJ2FzaycsICdzcGxpdGV4dCcsCiAgICAgICAgICAgJ2Zvcm1hdF9zaXplJywgJ2lzX2luc3RhbGxhYmxlX2RpcicsCiAgICAgICAgICAgJ2lzX3N2bl9wYWdlJywgJ2ZpbGVfY29udGVudHMnLAogICAgICAgICAgICdzcGxpdF9sZWFkaW5nX2RpcicsICdoYXNfbGVhZGluZ19kaXInLAogICAgICAgICAgICdub3JtYWxpemVfcGF0aCcsCiAgICAgICAgICAgJ3JlbmFtZXMnLCAnZ2V0X3Rlcm1pbmFsX3NpemUnLCAnZ2V0X3Byb2cnLAogICAgICAgICAgICd1bnppcF9maWxlJywgJ3VudGFyX2ZpbGUnLCAndW5wYWNrX2ZpbGUnLCAnY2FsbF9zdWJwcm9jZXNzJywKICAgICAgICAgICAnY2FwdHVyZWRfc3Rkb3V0JywgJ2Vuc3VyZV9kaXInLAogICAgICAgICAgICdBUkNISVZFX0VYVEVOU0lPTlMnLCAnU1VQUE9SVEVEX0VYVEVOU0lPTlMnLAogICAgICAgICAgICdnZXRfaW5zdGFsbGVkX3ZlcnNpb24nXQoKCmxvZ2dlciA9IHN0ZF9sb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCkJaMl9FWFRFTlNJT05TID0gKCcudGFyLmJ6MicsICcudGJ6JykKWFpfRVhURU5TSU9OUyA9ICgnLnRhci54eicsICcudHh6JywgJy50bHonLCAnLnRhci5seicsICcudGFyLmx6bWEnKQpaSVBfRVhURU5TSU9OUyA9ICgnLnppcCcsICcud2hsJykKVEFSX0VYVEVOU0lPTlMgPSAoJy50YXIuZ3onLCAnLnRneicsICcudGFyJykKQVJDSElWRV9FWFRFTlNJT05TID0gKAogICAgWklQX0VYVEVOU0lPTlMgKyBCWjJfRVhURU5TSU9OUyArIFRBUl9FWFRFTlNJT05TICsgWFpfRVhURU5TSU9OUykKU1VQUE9SVEVEX0VYVEVOU0lPTlMgPSBaSVBfRVhURU5TSU9OUyArIFRBUl9FWFRFTlNJT05TCnRyeToKICAgIGltcG9ydCBiejIgICMgbm9xYQogICAgU1VQUE9SVEVEX0VYVEVOU0lPTlMgKz0gQloyX0VYVEVOU0lPTlMKZXhjZXB0IEltcG9ydEVycm9yOgogICAgbG9nZ2VyLmRlYnVnKCdiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUnKQoKdHJ5OgogICAgIyBPbmx5IGZvciBQeXRob24gMy4zKwogICAgaW1wb3J0IGx6bWEgICMgbm9xYQogICAgU1VQUE9SVEVEX0VYVEVOU0lPTlMgKz0gWFpfRVhURU5TSU9OUwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBsb2dnZXIuZGVidWcoJ2x6bWEgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUnKQoKCmRlZiBpbXBvcnRfb3JfcmFpc2UocGtnX29yX21vZHVsZV9zdHJpbmcsIEV4Y2VwdGlvblR5cGUsICphcmdzLCAqKmt3YXJncyk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9faW1wb3J0X18ocGtnX29yX21vZHVsZV9zdHJpbmcpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uVHlwZSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGVuc3VyZV9kaXIocGF0aCk6CiAgICAiIiJvcy5wYXRoLm1ha2VkaXJzIHdpdGhvdXQgRUVYSVNULiIiIgogICAgdHJ5OgogICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCiAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICByYWlzZQoKCmRlZiBnZXRfcHJvZygpOgogICAgdHJ5OgogICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pIGluICgnX19tYWluX18ucHknLCAnLWMnKToKICAgICAgICAgICAgcmV0dXJuICIlcyAtbSBwaXAiICUgc3lzLmV4ZWN1dGFibGUKICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvciwgSW5kZXhFcnJvcik6CiAgICAgICAgcGFzcwogICAgcmV0dXJuICdwaXAnCgoKIyBSZXRyeSBldmVyeSBoYWxmIHNlY29uZCBmb3IgdXAgdG8gMyBzZWNvbmRzCkByZXRyeShzdG9wX21heF9kZWxheT0zMDAwLCB3YWl0X2ZpeGVkPTUwMCkKZGVmIHJtdHJlZShkaXIsIGlnbm9yZV9lcnJvcnM9RmFsc2UpOgogICAgc2h1dGlsLnJtdHJlZShkaXIsIGlnbm9yZV9lcnJvcnM9aWdub3JlX2Vycm9ycywKICAgICAgICAgICAgICAgICAgb25lcnJvcj1ybXRyZWVfZXJyb3JoYW5kbGVyKQoKCmRlZiBybXRyZWVfZXJyb3JoYW5kbGVyKGZ1bmMsIHBhdGgsIGV4Y19pbmZvKToKICAgICIiIk9uIFdpbmRvd3MsIHRoZSBmaWxlcyBpbiAuc3ZuIGFyZSByZWFkLW9ubHksIHNvIHdoZW4gcm10cmVlKCkgdHJpZXMgdG8KICAgIHJlbW92ZSB0aGVtLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLiAgV2UgY2F0Y2ggdGhhdCBoZXJlLCByZW1vdmUgdGhlCiAgICByZWFkLW9ubHkgYXR0cmlidXRlLCBhbmQgaG9wZWZ1bGx5IGNvbnRpbnVlIHdpdGhvdXQgcHJvYmxlbXMuIiIiCiAgICAjIGlmIGZpbGUgdHlwZSBjdXJyZW50bHkgcmVhZCBvbmx5CiAgICBpZiBvcy5zdGF0KHBhdGgpLnN0X21vZGUgJiBzdGF0LlNfSVJFQUQ6CiAgICAgICAgIyBjb252ZXJ0IHRvIHJlYWQvd3JpdGUKICAgICAgICBvcy5jaG1vZChwYXRoLCBzdGF0LlNfSVdSSVRFKQogICAgICAgICMgdXNlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB0byByZXBlYXQgdGhlIG9wZXJhdGlvbgogICAgICAgIGZ1bmMocGF0aCkKICAgICAgICByZXR1cm4KICAgIGVsc2U6CiAgICAgICAgcmFpc2UKCgpkZWYgZGlzcGxheV9wYXRoKHBhdGgpOgogICAgIiIiR2l2ZXMgdGhlIGRpc3BsYXkgdmFsdWUgZm9yIGEgZ2l2ZW4gcGF0aCwgbWFraW5nIGl0IHJlbGF0aXZlIHRvIGN3ZAogICAgaWYgcG9zc2libGUuIiIiCiAgICBwYXRoID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgocGF0aCkpCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CiAgICAgICAgcGF0aCA9IHBhdGguZGVjb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSwgJ3JlcGxhY2UnKQogICAgICAgIHBhdGggPSBwYXRoLmVuY29kZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksICdyZXBsYWNlJykKICAgIGlmIHBhdGguc3RhcnRzd2l0aChvcy5nZXRjd2QoKSArIG9zLnBhdGguc2VwKToKICAgICAgICBwYXRoID0gJy4nICsgcGF0aFtsZW4ob3MuZ2V0Y3dkKCkpOl0KICAgIHJldHVybiBwYXRoCgoKZGVmIGJhY2t1cF9kaXIoZGlyLCBleHQ9Jy5iYWsnKToKICAgICIiIkZpZ3VyZSBvdXQgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkgdG8gYmFjayB1cCB0aGUgZ2l2ZW4gZGlyIHRvCiAgICAoYWRkaW5nIC5iYWssIC5iYWsyLCBldGMpIiIiCiAgICBuID0gMQogICAgZXh0ZW5zaW9uID0gZXh0CiAgICB3aGlsZSBvcy5wYXRoLmV4aXN0cyhkaXIgKyBleHRlbnNpb24pOgogICAgICAgIG4gKz0gMQogICAgICAgIGV4dGVuc2lvbiA9IGV4dCArIHN0cihuKQogICAgcmV0dXJuIGRpciArIGV4dGVuc2lvbgoKCmRlZiBhc2tfcGF0aF9leGlzdHMobWVzc2FnZSwgb3B0aW9ucyk6CiAgICBmb3IgYWN0aW9uIGluIG9zLmVudmlyb24uZ2V0KCdQSVBfRVhJU1RTX0FDVElPTicsICcnKS5zcGxpdCgpOgogICAgICAgIGlmIGFjdGlvbiBpbiBvcHRpb25zOgogICAgICAgICAgICByZXR1cm4gYWN0aW9uCiAgICByZXR1cm4gYXNrKG1lc3NhZ2UsIG9wdGlvbnMpCgoKZGVmIGFzayhtZXNzYWdlLCBvcHRpb25zKToKICAgICIiIkFzayB0aGUgbWVzc2FnZSBpbnRlcmFjdGl2ZWx5LCB3aXRoIHRoZSBnaXZlbiBwb3NzaWJsZSByZXNwb25zZXMiIiIKICAgIHdoaWxlIDE6CiAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoJ1BJUF9OT19JTlBVVCcpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAnTm8gaW5wdXQgd2FzIGV4cGVjdGVkICgkUElQX05PX0lOUFVUIHNldCk7IHF1ZXN0aW9uOiAlcycgJQogICAgICAgICAgICAgICAgbWVzc2FnZQogICAgICAgICAgICApCiAgICAgICAgcmVzcG9uc2UgPSBpbnB1dChtZXNzYWdlKQogICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2Uuc3RyaXAoKS5sb3dlcigpCiAgICAgICAgaWYgcmVzcG9uc2Ugbm90IGluIG9wdGlvbnM6CiAgICAgICAgICAgIHByaW50KAogICAgICAgICAgICAgICAgJ1lvdXIgcmVzcG9uc2UgKCVyKSB3YXMgbm90IG9uZSBvZiB0aGUgZXhwZWN0ZWQgcmVzcG9uc2VzOiAnCiAgICAgICAgICAgICAgICAnJXMnICUgKHJlc3BvbnNlLCAnLCAnLmpvaW4ob3B0aW9ucykpCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCgpkZWYgZm9ybWF0X3NpemUoYnl0ZXMpOgogICAgaWYgYnl0ZXMgPiAxMDAwICogMTAwMDoKICAgICAgICByZXR1cm4gJyUuMWZNQicgJSAoYnl0ZXMgLyAxMDAwLjAgLyAxMDAwKQogICAgZWxpZiBieXRlcyA+IDEwICogMTAwMDoKICAgICAgICByZXR1cm4gJyVpa0InICUgKGJ5dGVzIC8gMTAwMCkKICAgIGVsaWYgYnl0ZXMgPiAxMDAwOgogICAgICAgIHJldHVybiAnJS4xZmtCJyAlIChieXRlcyAvIDEwMDAuMCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICclaWJ5dGVzJyAlIGJ5dGVzCgoKZGVmIGlzX2luc3RhbGxhYmxlX2RpcihwYXRoKToKICAgICIiIlJldHVybiBUcnVlIGlmIGBwYXRoYCBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgc2V0dXAucHkgZmlsZS4iIiIKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgc2V0dXBfcHkgPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ3NldHVwLnB5JykKICAgIGlmIG9zLnBhdGguaXNmaWxlKHNldHVwX3B5KToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGlzX3N2bl9wYWdlKGh0bWwpOgogICAgIiIiCiAgICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhZ2UgYXBwZWFycyB0byBiZSB0aGUgaW5kZXggcGFnZSBvZiBhbiBzdm4gcmVwb3NpdG9yeQogICAgIiIiCiAgICByZXR1cm4gKHJlLnNlYXJjaChyJzx0aXRsZT5bXjxdKlJldmlzaW9uIFxkKzonLCBodG1sKSBhbmQKICAgICAgICAgICAgcmUuc2VhcmNoKHInUG93ZXJlZCBieSAoPzo8YVtePl0qPz4pP1N1YnZlcnNpb24nLCBodG1sLCByZS5JKSkKCgpkZWYgZmlsZV9jb250ZW50cyhmaWxlbmFtZSk6CiAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGZwOgogICAgICAgIHJldHVybiBmcC5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpCgoKZGVmIHJlYWRfY2h1bmtzKGZpbGUsIHNpemU9aW8uREVGQVVMVF9CVUZGRVJfU0laRSk6CiAgICAiIiJZaWVsZCBwaWVjZXMgb2YgZGF0YSBmcm9tIGEgZmlsZS1saWtlIG9iamVjdCB1bnRpbCBFT0YuIiIiCiAgICB3aGlsZSBUcnVlOgogICAgICAgIGNodW5rID0gZmlsZS5yZWFkKHNpemUpCiAgICAgICAgaWYgbm90IGNodW5rOgogICAgICAgICAgICBicmVhawogICAgICAgIHlpZWxkIGNodW5rCgoKZGVmIHNwbGl0X2xlYWRpbmdfZGlyKHBhdGgpOgogICAgcGF0aCA9IHBhdGgubHN0cmlwKCcvJykubHN0cmlwKCdcXCcpCiAgICBpZiAnLycgaW4gcGF0aCBhbmQgKCgnXFwnIGluIHBhdGggYW5kIHBhdGguZmluZCgnLycpIDwgcGF0aC5maW5kKCdcXCcpKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAnXFwnIG5vdCBpbiBwYXRoKToKICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgnLycsIDEpCiAgICBlbGlmICdcXCcgaW4gcGF0aDoKICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgnXFwnLCAxKQogICAgZWxzZToKICAgICAgICByZXR1cm4gcGF0aCwgJycKCgpkZWYgaGFzX2xlYWRpbmdfZGlyKHBhdGhzKToKICAgICIiIlJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIHBhdGhzIGhhdmUgdGhlIHNhbWUgbGVhZGluZyBwYXRoIG5hbWUKICAgIChpLmUuLCBldmVyeXRoaW5nIGlzIGluIG9uZSBzdWJkaXJlY3RvcnkgaW4gYW4gYXJjaGl2ZSkiIiIKICAgIGNvbW1vbl9wcmVmaXggPSBOb25lCiAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAgICAgICBwcmVmaXgsIHJlc3QgPSBzcGxpdF9sZWFkaW5nX2RpcihwYXRoKQogICAgICAgIGlmIG5vdCBwcmVmaXg6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgY29tbW9uX3ByZWZpeCBpcyBOb25lOgogICAgICAgICAgICBjb21tb25fcHJlZml4ID0gcHJlZml4CiAgICAgICAgZWxpZiBwcmVmaXggIT0gY29tbW9uX3ByZWZpeDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBub3JtYWxpemVfcGF0aChwYXRoLCByZXNvbHZlX3N5bWxpbmtzPVRydWUpOgogICAgIiIiCiAgICBDb252ZXJ0IGEgcGF0aCB0byBpdHMgY2Fub25pY2FsLCBjYXNlLW5vcm1hbGl6ZWQsIGFic29sdXRlIHZlcnNpb24uCgogICAgIiIiCiAgICBwYXRoID0gZXhwYW5kdXNlcihwYXRoKQogICAgaWYgcmVzb2x2ZV9zeW1saW5rczoKICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MucGF0aC5hYnNwYXRoKHBhdGgpCiAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShwYXRoKQoKCmRlZiBzcGxpdGV4dChwYXRoKToKICAgICIiIkxpa2Ugb3MucGF0aC5zcGxpdGV4dCwgYnV0IHRha2Ugb2ZmIC50YXIgdG9vIiIiCiAgICBiYXNlLCBleHQgPSBwb3NpeHBhdGguc3BsaXRleHQocGF0aCkKICAgIGlmIGJhc2UubG93ZXIoKS5lbmRzd2l0aCgnLnRhcicpOgogICAgICAgIGV4dCA9IGJhc2VbLTQ6XSArIGV4dAogICAgICAgIGJhc2UgPSBiYXNlWzotNF0KICAgIHJldHVybiBiYXNlLCBleHQKCgpkZWYgcmVuYW1lcyhvbGQsIG5ldyk6CiAgICAiIiJMaWtlIG9zLnJlbmFtZXMoKSwgYnV0IGhhbmRsZXMgcmVuYW1pbmcgYWNyb3NzIGRldmljZXMuIiIiCiAgICAjIEltcGxlbWVudGF0aW9uIGJvcnJvd2VkIGZyb20gb3MucmVuYW1lcygpLgogICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQobmV3KQogICAgaWYgaGVhZCBhbmQgdGFpbCBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGhlYWQpOgogICAgICAgIG9zLm1ha2VkaXJzKGhlYWQpCgogICAgc2h1dGlsLm1vdmUob2xkLCBuZXcpCgogICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQob2xkKQogICAgaWYgaGVhZCBhbmQgdGFpbDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLnJlbW92ZWRpcnMoaGVhZCkKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcGFzcwoKCmRlZiBpc19sb2NhbChwYXRoKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgcGF0aCBpcyB3aXRoaW4gc3lzLnByZWZpeCwgaWYgd2UncmUgcnVubmluZyBpbiBhIHZpcnR1YWxlbnYuCgogICAgSWYgd2UncmUgbm90IGluIGEgdmlydHVhbGVudiwgYWxsIHBhdGhzIGFyZSBjb25zaWRlcmVkICJsb2NhbC4iCgogICAgIiIiCiAgICBpZiBub3QgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBub3JtYWxpemVfcGF0aChwYXRoKS5zdGFydHN3aXRoKG5vcm1hbGl6ZV9wYXRoKHN5cy5wcmVmaXgpKQoKCmRlZiBkaXN0X2lzX2xvY2FsKGRpc3QpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBnaXZlbiBEaXN0cmlidXRpb24gb2JqZWN0IGlzIGluc3RhbGxlZCBsb2NhbGx5CiAgICAoaS5lLiB3aXRoaW4gY3VycmVudCB2aXJ0dWFsZW52KS4KCiAgICBBbHdheXMgVHJ1ZSBpZiB3ZSdyZSBub3QgaW4gYSB2aXJ0dWFsZW52LgoKICAgICIiIgogICAgcmV0dXJuIGlzX2xvY2FsKGRpc3RfbG9jYXRpb24oZGlzdCkpCgoKZGVmIGRpc3RfaW5fdXNlcnNpdGUoZGlzdCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIGdpdmVuIERpc3RyaWJ1dGlvbiBpcyBpbnN0YWxsZWQgaW4gdXNlciBzaXRlLgogICAgIiIiCiAgICBub3JtX3BhdGggPSBub3JtYWxpemVfcGF0aChkaXN0X2xvY2F0aW9uKGRpc3QpKQogICAgcmV0dXJuIG5vcm1fcGF0aC5zdGFydHN3aXRoKG5vcm1hbGl6ZV9wYXRoKHVzZXJfc2l0ZSkpCgoKZGVmIGRpc3RfaW5fc2l0ZV9wYWNrYWdlcyhkaXN0KToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgZ2l2ZW4gRGlzdHJpYnV0aW9uIGlzIGluc3RhbGxlZCBpbgogICAgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigpLgogICAgIiIiCiAgICByZXR1cm4gbm9ybWFsaXplX3BhdGgoCiAgICAgICAgZGlzdF9sb2NhdGlvbihkaXN0KQogICAgKS5zdGFydHN3aXRoKG5vcm1hbGl6ZV9wYXRoKHNpdGVfcGFja2FnZXMpKQoKCmRlZiBkaXN0X2lzX2VkaXRhYmxlKGRpc3QpOgogICAgIiIiSXMgZGlzdHJpYnV0aW9uIGFuIGVkaXRhYmxlIGluc3RhbGw/IiIiCiAgICBmb3IgcGF0aF9pdGVtIGluIHN5cy5wYXRoOgogICAgICAgIGVnZ19saW5rID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZGlzdC5wcm9qZWN0X25hbWUgKyAnLmVnZy1saW5rJykKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShlZ2dfbGluayk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zKGxvY2FsX29ubHk9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPXN0ZGxpYl9wa2dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZWRpdGFibGVzPVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVzX29ubHk9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9vbmx5PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIGEgbGlzdCBvZiBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uIG9iamVjdHMuCgogICAgSWYgYGBsb2NhbF9vbmx5YGAgaXMgVHJ1ZSAoZGVmYXVsdCksIG9ubHkgcmV0dXJuIGluc3RhbGxhdGlvbnMKICAgIGxvY2FsIHRvIHRoZSBjdXJyZW50IHZpcnR1YWxlbnYsIGlmIGluIGEgdmlydHVhbGVudi4KCiAgICBgYHNraXBgYCBhcmd1bWVudCBpcyBhbiBpdGVyYWJsZSBvZiBsb3dlci1jYXNlIHByb2plY3QgbmFtZXMgdG8KICAgIGlnbm9yZTsgZGVmYXVsdHMgdG8gc3RkbGliX3BrZ3MKCiAgICBJZiBgYGVkaXRhYmxlc2BgIGlzIEZhbHNlLCBkb24ndCByZXBvcnQgZWRpdGFibGVzLgoKICAgIElmIGBgZWRpdGFibGVzX29ubHlgYCBpcyBUcnVlICwgb25seSByZXBvcnQgZWRpdGFibGVzLgoKICAgIElmIGBgdXNlcl9vbmx5YGAgaXMgVHJ1ZSAsIG9ubHkgcmVwb3J0IGluc3RhbGxhdGlvbnMgaW4gdGhlIHVzZXIKICAgIHNpdGUgZGlyZWN0b3J5LgoKICAgICIiIgogICAgaWYgbG9jYWxfb25seToKICAgICAgICBsb2NhbF90ZXN0ID0gZGlzdF9pc19sb2NhbAogICAgZWxzZToKICAgICAgICBkZWYgbG9jYWxfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBpZiBpbmNsdWRlX2VkaXRhYmxlczoKICAgICAgICBkZWYgZWRpdGFibGVfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIGVsc2U6CiAgICAgICAgZGVmIGVkaXRhYmxlX3Rlc3QoZCk6CiAgICAgICAgICAgIHJldHVybiBub3QgZGlzdF9pc19lZGl0YWJsZShkKQoKICAgIGlmIGVkaXRhYmxlc19vbmx5OgogICAgICAgIGRlZiBlZGl0YWJsZXNfb25seV90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gZGlzdF9pc19lZGl0YWJsZShkKQogICAgZWxzZToKICAgICAgICBkZWYgZWRpdGFibGVzX29ubHlfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBpZiB1c2VyX29ubHk6CiAgICAgICAgdXNlcl90ZXN0ID0gZGlzdF9pbl91c2Vyc2l0ZQogICAgZWxzZToKICAgICAgICBkZWYgdXNlcl90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHJldHVybiBbZCBmb3IgZCBpbiBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0CiAgICAgICAgICAgIGlmIGxvY2FsX3Rlc3QoZCkgYW5kCiAgICAgICAgICAgIGQua2V5IG5vdCBpbiBza2lwIGFuZAogICAgICAgICAgICBlZGl0YWJsZV90ZXN0KGQpIGFuZAogICAgICAgICAgICBlZGl0YWJsZXNfb25seV90ZXN0KGQpIGFuZAogICAgICAgICAgICB1c2VyX3Rlc3QoZCkKICAgICAgICAgICAgXQoKCmRlZiBlZ2dfbGlua19wYXRoKGRpc3QpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIHBhdGggZm9yIHRoZSAuZWdnLWxpbmsgZmlsZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSwgTm9uZS4KCiAgICBUaGVyZSdzIDMgc2NlbmFyaW9zOgogICAgMSkgbm90IGluIGEgdmlydHVhbGVudgogICAgICAgdHJ5IHRvIGZpbmQgaW4gc2l0ZS5VU0VSX1NJVEUsIHRoZW4gc2l0ZV9wYWNrYWdlcwogICAgMikgaW4gYSBuby1nbG9iYWwgdmlydHVhbGVudgogICAgICAgdHJ5IHRvIGZpbmQgaW4gc2l0ZV9wYWNrYWdlcwogICAgMykgaW4gYSB5ZXMtZ2xvYmFsIHZpcnR1YWxlbnYKICAgICAgIHRyeSB0byBmaW5kIGluIHNpdGVfcGFja2FnZXMsIHRoZW4gc2l0ZS5VU0VSX1NJVEUKICAgICAgIChkb24ndCBsb29rIGluIGdsb2JhbCBsb2NhdGlvbikKCiAgICBGb3IgIzEgYW5kICMzLCB0aGVyZSBjb3VsZCBiZSBvZGQgY2FzZXMsIHdoZXJlIHRoZXJlJ3MgYW4gZWdnLWxpbmsgaW4gMgogICAgbG9jYXRpb25zLgoKICAgIFRoaXMgbWV0aG9kIHdpbGwganVzdCByZXR1cm4gdGhlIGZpcnN0IG9uZSBmb3VuZC4KICAgICIiIgogICAgc2l0ZXMgPSBbXQogICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgaWYgdmlydHVhbGVudl9ub19nbG9iYWwoKToKICAgICAgICAgICAgc2l0ZXMuYXBwZW5kKHNpdGVfcGFja2FnZXMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2l0ZXMuYXBwZW5kKHNpdGVfcGFja2FnZXMpCiAgICAgICAgICAgIGlmIHVzZXJfc2l0ZToKICAgICAgICAgICAgICAgIHNpdGVzLmFwcGVuZCh1c2VyX3NpdGUpCiAgICBlbHNlOgogICAgICAgIGlmIHVzZXJfc2l0ZToKICAgICAgICAgICAgc2l0ZXMuYXBwZW5kKHVzZXJfc2l0ZSkKICAgICAgICBzaXRlcy5hcHBlbmQoc2l0ZV9wYWNrYWdlcykKCiAgICBmb3Igc2l0ZSBpbiBzaXRlczoKICAgICAgICBlZ2dsaW5rID0gb3MucGF0aC5qb2luKHNpdGUsIGRpc3QucHJvamVjdF9uYW1lKSArICcuZWdnLWxpbmsnCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZWdnbGluayk6CiAgICAgICAgICAgIHJldHVybiBlZ2dsaW5rCgoKZGVmIGRpc3RfbG9jYXRpb24oZGlzdCk6CiAgICAiIiIKICAgIEdldCB0aGUgc2l0ZS1wYWNrYWdlcyBsb2NhdGlvbiBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gR2VuZXJhbGx5CiAgICB0aGlzIGlzIGRpc3QubG9jYXRpb24sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBkZXZlbG9wLWluc3RhbGxlZAogICAgcGFja2FnZXMsIHdoZXJlIGRpc3QubG9jYXRpb24gaXMgdGhlIHNvdXJjZSBjb2RlIGxvY2F0aW9uLCBhbmQgd2UKICAgIHdhbnQgdG8ga25vdyB3aGVyZSB0aGUgZWdnLWxpbmsgZmlsZSBpcy4KCiAgICAiIiIKICAgIGVnZ19saW5rID0gZWdnX2xpbmtfcGF0aChkaXN0KQogICAgaWYgZWdnX2xpbms6CiAgICAgICAgcmV0dXJuIGVnZ19saW5rCiAgICByZXR1cm4gZGlzdC5sb2NhdGlvbgoKCmRlZiBnZXRfdGVybWluYWxfc2l6ZSgpOgogICAgIiIiUmV0dXJucyBhIHR1cGxlICh4LCB5KSByZXByZXNlbnRpbmcgdGhlIHdpZHRoKHgpIGFuZCB0aGUgaGVpZ2h0KHgpCiAgICBpbiBjaGFyYWN0ZXJzIG9mIHRoZSB0ZXJtaW5hbCB3aW5kb3cuIiIiCiAgICBkZWYgaW9jdGxfR1dJTlNaKGZkKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBmY250bAogICAgICAgICAgICBpbXBvcnQgdGVybWlvcwogICAgICAgICAgICBpbXBvcnQgc3RydWN0CiAgICAgICAgICAgIGNyID0gc3RydWN0LnVucGFjaygKICAgICAgICAgICAgICAgICdoaCcsCiAgICAgICAgICAgICAgICBmY250bC5pb2N0bChmZCwgdGVybWlvcy5USU9DR1dJTlNaLCAnMTIzNCcpCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgY3IgPT0gKDAsIDApOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBjcgogICAgY3IgPSBpb2N0bF9HV0lOU1ooMCkgb3IgaW9jdGxfR1dJTlNaKDEpIG9yIGlvY3RsX0dXSU5TWigyKQogICAgaWYgbm90IGNyOgogICAgICAgIHRyeToKICAgICAgICAgICAgZmQgPSBvcy5vcGVuKG9zLmN0ZXJtaWQoKSwgb3MuT19SRE9OTFkpCiAgICAgICAgICAgIGNyID0gaW9jdGxfR1dJTlNaKGZkKQogICAgICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHBhc3MKICAgIGlmIG5vdCBjcjoKICAgICAgICBjciA9IChvcy5lbnZpcm9uLmdldCgnTElORVMnLCAyNSksIG9zLmVudmlyb24uZ2V0KCdDT0xVTU5TJywgODApKQogICAgcmV0dXJuIGludChjclsxXSksIGludChjclswXSkKCgpkZWYgY3VycmVudF91bWFzaygpOgogICAgIiIiR2V0IHRoZSBjdXJyZW50IHVtYXNrIHdoaWNoIGludm9sdmVzIGhhdmluZyB0byBzZXQgaXQgdGVtcG9yYXJpbHkuIiIiCiAgICBtYXNrID0gb3MudW1hc2soMCkKICAgIG9zLnVtYXNrKG1hc2spCiAgICByZXR1cm4gbWFzawoKCmRlZiB1bnppcF9maWxlKGZpbGVuYW1lLCBsb2NhdGlvbiwgZmxhdHRlbj1UcnVlKToKICAgICIiIgogICAgVW56aXAgdGhlIGZpbGUgKHdpdGggcGF0aCBgZmlsZW5hbWVgKSB0byB0aGUgZGVzdGluYXRpb24gYGxvY2F0aW9uYC4gIEFsbAogICAgZmlsZXMgYXJlIHdyaXR0ZW4gYmFzZWQgb24gc3lzdGVtIGRlZmF1bHRzIGFuZCB1bWFzayAoaS5lLiBwZXJtaXNzaW9ucyBhcmUKICAgIG5vdCBwcmVzZXJ2ZWQpLCBleGNlcHQgdGhhdCByZWd1bGFyIGZpbGUgbWVtYmVycyB3aXRoIGFueSBleGVjdXRlCiAgICBwZXJtaXNzaW9ucyAodXNlciwgZ3JvdXAsIG9yIHdvcmxkKSBoYXZlICJjaG1vZCAreCIgYXBwbGllZCBhZnRlciBiZWluZwogICAgd3JpdHRlbi4gTm90ZSB0aGF0IGZvciB3aW5kb3dzLCBhbnkgZXhlY3V0ZSBjaGFuZ2VzIHVzaW5nIG9zLmNobW9kIGFyZQogICAgbm8tb3BzIHBlciB0aGUgcHl0aG9uIGRvY3MuCiAgICAiIiIKICAgIGVuc3VyZV9kaXIobG9jYXRpb24pCiAgICB6aXBmcCA9IG9wZW4oZmlsZW5hbWUsICdyYicpCiAgICB0cnk6CiAgICAgICAgemlwID0gemlwZmlsZS5aaXBGaWxlKHppcGZwLCBhbGxvd1ppcDY0PVRydWUpCiAgICAgICAgbGVhZGluZyA9IGhhc19sZWFkaW5nX2Rpcih6aXAubmFtZWxpc3QoKSkgYW5kIGZsYXR0ZW4KICAgICAgICBmb3IgaW5mbyBpbiB6aXAuaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgZGF0YSA9IHppcC5yZWFkKG5hbWUpCiAgICAgICAgICAgIGZuID0gbmFtZQogICAgICAgICAgICBpZiBsZWFkaW5nOgogICAgICAgICAgICAgICAgZm4gPSBzcGxpdF9sZWFkaW5nX2RpcihuYW1lKVsxXQogICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgZm4pCiAgICAgICAgICAgIGRpciA9IG9zLnBhdGguZGlybmFtZShmbikKICAgICAgICAgICAgaWYgZm4uZW5kc3dpdGgoJy8nKSBvciBmbi5lbmRzd2l0aCgnXFwnKToKICAgICAgICAgICAgICAgICMgQSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIoZm4pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKGRpcikKICAgICAgICAgICAgICAgIGZwID0gb3BlbihmbiwgJ3diJykKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNgogICAgICAgICAgICAgICAgICAgICMgaWYgbW9kZSBhbmQgcmVndWxhciBmaWxlIGFuZCBhbnkgZXhlY3V0ZSBwZXJtaXNzaW9ucyBmb3IKICAgICAgICAgICAgICAgICAgICAjIHVzZXIvZ3JvdXAvd29ybGQ/CiAgICAgICAgICAgICAgICAgICAgaWYgbW9kZSBhbmQgc3RhdC5TX0lTUkVHKG1vZGUpIGFuZCBtb2RlICYgMG8xMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICMgbWFrZSBkZXN0IGZpbGUgaGF2ZSBleGVjdXRlIGZvciB1c2VyL2dyb3VwL3dvcmxkCiAgICAgICAgICAgICAgICAgICAgICAgICMgKGNobW9kICt4KSBuby1vcCBvbiB3aW5kb3dzIHBlciBweXRob24gZG9jcwogICAgICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChmbiwgKDBvNzc3IC0gY3VycmVudF91bWFzaygpIHwgMG8xMTEpKQogICAgZmluYWxseToKICAgICAgICB6aXBmcC5jbG9zZSgpCgoKZGVmIHVudGFyX2ZpbGUoZmlsZW5hbWUsIGxvY2F0aW9uKToKICAgICIiIgogICAgVW50YXIgdGhlIGZpbGUgKHdpdGggcGF0aCBgZmlsZW5hbWVgKSB0byB0aGUgZGVzdGluYXRpb24gYGxvY2F0aW9uYC4KICAgIEFsbCBmaWxlcyBhcmUgd3JpdHRlbiBiYXNlZCBvbiBzeXN0ZW0gZGVmYXVsdHMgYW5kIHVtYXNrIChpLmUuIHBlcm1pc3Npb25zCiAgICBhcmUgbm90IHByZXNlcnZlZCksIGV4Y2VwdCB0aGF0IHJlZ3VsYXIgZmlsZSBtZW1iZXJzIHdpdGggYW55IGV4ZWN1dGUKICAgIHBlcm1pc3Npb25zICh1c2VyLCBncm91cCwgb3Igd29ybGQpIGhhdmUgImNobW9kICt4IiBhcHBsaWVkIGFmdGVyIGJlaW5nCiAgICB3cml0dGVuLiAgTm90ZSB0aGF0IGZvciB3aW5kb3dzLCBhbnkgZXhlY3V0ZSBjaGFuZ2VzIHVzaW5nIG9zLmNobW9kIGFyZQogICAgbm8tb3BzIHBlciB0aGUgcHl0aG9uIGRvY3MuCiAgICAiIiIKICAgIGVuc3VyZV9kaXIobG9jYXRpb24pCiAgICBpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZ3onKSBvciBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcudGd6Jyk6CiAgICAgICAgbW9kZSA9ICdyOmd6JwogICAgZWxpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKEJaMl9FWFRFTlNJT05TKToKICAgICAgICBtb2RlID0gJ3I6YnoyJwogICAgZWxpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKFhaX0VYVEVOU0lPTlMpOgogICAgICAgIG1vZGUgPSAncjp4eicKICAgIGVsaWYgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLnRhcicpOgogICAgICAgIG1vZGUgPSAncicKICAgIGVsc2U6CiAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICdDYW5ub3QgZGV0ZXJtaW5lIGNvbXByZXNzaW9uIHR5cGUgZm9yIGZpbGUgJXMnLCBmaWxlbmFtZSwKICAgICAgICApCiAgICAgICAgbW9kZSA9ICdyOionCiAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW5hbWUsIG1vZGUpCiAgICB0cnk6CiAgICAgICAgIyBub3RlOiBweXRob248PTIuNSBkb2Vzbid0IHNlZW0gdG8ga25vdyBhYm91dCBwYXggaGVhZGVycywgZmlsdGVyIHRoZW0KICAgICAgICBsZWFkaW5nID0gaGFzX2xlYWRpbmdfZGlyKFsKICAgICAgICAgICAgbWVtYmVyLm5hbWUgZm9yIG1lbWJlciBpbiB0YXIuZ2V0bWVtYmVycygpCiAgICAgICAgICAgIGlmIG1lbWJlci5uYW1lICE9ICdwYXhfZ2xvYmFsX2hlYWRlcicKICAgICAgICBdKQogICAgICAgIGZvciBtZW1iZXIgaW4gdGFyLmdldG1lbWJlcnMoKToKICAgICAgICAgICAgZm4gPSBtZW1iZXIubmFtZQogICAgICAgICAgICBpZiBmbiA9PSAncGF4X2dsb2JhbF9oZWFkZXInOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbGVhZGluZzoKICAgICAgICAgICAgICAgIGZuID0gc3BsaXRfbGVhZGluZ19kaXIoZm4pWzFdCiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIGZuKQogICAgICAgICAgICBpZiBtZW1iZXIuaXNkaXIoKToKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIocGF0aCkKICAgICAgICAgICAgZWxpZiBtZW1iZXIuaXNzeW0oKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB0YXIuX2V4dHJhY3RfbWVtYmVyKG1lbWJlciwgcGF0aCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICAgICAgICAgICMgU29tZSBjb3JydXB0IHRhciBmaWxlcyBzZWVtIHRvIHByb2R1Y2UgdGhpcwogICAgICAgICAgICAgICAgICAgICMgKHNwZWNpZmljYWxseSBiYWQgc3ltbGlua3MpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICdJbiB0aGUgdGFyIGZpbGUgJXMgdGhlIG1lbWJlciAlcyBpcyBpbnZhbGlkOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtZW1iZXIubmFtZSwgZXhjLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZwID0gdGFyLmV4dHJhY3RmaWxlKG1lbWJlcikKICAgICAgICAgICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBleGM6CiAgICAgICAgICAgICAgICAgICAgIyBTb21lIGNvcnJ1cHQgdGFyIGZpbGVzIHNlZW0gdG8gcHJvZHVjZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgIyAoc3BlY2lmaWNhbGx5IGJhZCBzeW1saW5rcykKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJ0luIHRoZSB0YXIgZmlsZSAlcyB0aGUgbWVtYmVyICVzIGlzIGludmFsaWQ6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1lbWJlci5uYW1lLCBleGMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShwYXRoKSkKICAgICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAnd2InKSBhcyBkZXN0ZnA6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKGZwLCBkZXN0ZnApCiAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgICAgICAgICAjIFVwZGF0ZSB0aGUgdGltZXN0YW1wICh1c2VmdWwgZm9yIGN5dGhvbiBjb21waWxlZCBmaWxlcykKICAgICAgICAgICAgICAgIHRhci51dGltZShtZW1iZXIsIHBhdGgpCiAgICAgICAgICAgICAgICAjIG1lbWJlciBoYXZlIGFueSBleGVjdXRlIHBlcm1pc3Npb25zIGZvciB1c2VyL2dyb3VwL3dvcmxkPwogICAgICAgICAgICAgICAgaWYgbWVtYmVyLm1vZGUgJiAwbzExMToKICAgICAgICAgICAgICAgICAgICAjIG1ha2UgZGVzdCBmaWxlIGhhdmUgZXhlY3V0ZSBmb3IgdXNlci9ncm91cC93b3JsZAogICAgICAgICAgICAgICAgICAgICMgbm8tb3Agb24gd2luZG93cyBwZXIgcHl0aG9uIGRvY3MKICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChwYXRoLCAoMG83NzcgLSBjdXJyZW50X3VtYXNrKCkgfCAwbzExMSkpCiAgICBmaW5hbGx5OgogICAgICAgIHRhci5jbG9zZSgpCgoKZGVmIHVucGFja19maWxlKGZpbGVuYW1lLCBsb2NhdGlvbiwgY29udGVudF90eXBlLCBsaW5rKToKICAgIGZpbGVuYW1lID0gb3MucGF0aC5yZWFscGF0aChmaWxlbmFtZSkKICAgIGlmIChjb250ZW50X3R5cGUgPT0gJ2FwcGxpY2F0aW9uL3ppcCcgb3IKICAgICAgICAgICAgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aChaSVBfRVhURU5TSU9OUykgb3IKICAgICAgICAgICAgemlwZmlsZS5pc196aXBmaWxlKGZpbGVuYW1lKSk6CiAgICAgICAgdW56aXBfZmlsZSgKICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgIGxvY2F0aW9uLAogICAgICAgICAgICBmbGF0dGVuPW5vdCBmaWxlbmFtZS5lbmRzd2l0aCgnLndobCcpCiAgICAgICAgKQogICAgZWxpZiAoY29udGVudF90eXBlID09ICdhcHBsaWNhdGlvbi94LWd6aXAnIG9yCiAgICAgICAgICAgIHRhcmZpbGUuaXNfdGFyZmlsZShmaWxlbmFtZSkgb3IKICAgICAgICAgICAgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgKICAgICAgICAgICAgICAgIFRBUl9FWFRFTlNJT05TICsgQloyX0VYVEVOU0lPTlMgKyBYWl9FWFRFTlNJT05TKSk6CiAgICAgICAgdW50YXJfZmlsZShmaWxlbmFtZSwgbG9jYXRpb24pCiAgICBlbGlmIChjb250ZW50X3R5cGUgYW5kIGNvbnRlbnRfdHlwZS5zdGFydHN3aXRoKCd0ZXh0L2h0bWwnKSBhbmQKICAgICAgICAgICAgaXNfc3ZuX3BhZ2UoZmlsZV9jb250ZW50cyhmaWxlbmFtZSkpKToKICAgICAgICAjIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoaXMKICAgICAgICBmcm9tIHBpcC52Y3Muc3VidmVyc2lvbiBpbXBvcnQgU3VidmVyc2lvbgogICAgICAgIFN1YnZlcnNpb24oJ3N2bisnICsgbGluay51cmwpLnVucGFjayhsb2NhdGlvbikKICAgIGVsc2U6CiAgICAgICAgIyBGSVhNRTogaGFuZGxlPwogICAgICAgICMgRklYTUU6IG1hZ2ljIHNpZ25hdHVyZXM/CiAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAnQ2Fubm90IHVucGFjayBmaWxlICVzIChkb3dubG9hZGVkIGZyb20gJXMsIGNvbnRlbnQtdHlwZTogJXMpOyAnCiAgICAgICAgICAgICdjYW5ub3QgZGV0ZWN0IGFyY2hpdmUgZm9ybWF0JywKICAgICAgICAgICAgZmlsZW5hbWUsIGxvY2F0aW9uLCBjb250ZW50X3R5cGUsCiAgICAgICAgKQogICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAnQ2Fubm90IGRldGVybWluZSBhcmNoaXZlIGZvcm1hdCBvZiAlcycgJSBsb2NhdGlvbgogICAgICAgICkKCgpkZWYgY2FsbF9zdWJwcm9jZXNzKGNtZCwgc2hvd19zdGRvdXQ9VHJ1ZSwgY3dkPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgb25fcmV0dXJuY29kZT0ncmFpc2UnLAogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfZGVzYz1Ob25lLAogICAgICAgICAgICAgICAgICAgIGV4dHJhX2Vudmlyb249Tm9uZSwgc3Bpbm5lcj1Ob25lKToKICAgICMgVGhpcyBmdW5jdGlvbidzIGhhbmRsaW5nIG9mIHN1YnByb2Nlc3Mgb3V0cHV0IGlzIGNvbmZ1c2luZyBhbmQgSQogICAgIyBwcmV2aW91c2x5IGJyb2tlIGl0IHRlcnJpYmx5LCBzbyBhcyBwZW5hbmNlIEkgd2lsbCB3cml0ZSBhIGxvbmcgY29tbWVudAogICAgIyBleHBsYWluaW5nIHRoaW5ncy4KICAgICMKICAgICMgVGhlIG9idmlvdXMgdGhpbmcgdGhhdCBhZmZlY3RzIG91dHB1dCBpcyB0aGUgc2hvd19zdGRvdXQ9CiAgICAjIGt3YXJnLiBzaG93X3N0ZG91dD1UcnVlIG1lYW5zLCBsZXQgdGhlIHN1YnByb2Nlc3Mgd3JpdGUgZGlyZWN0bHkgdG8gb3VyCiAgICAjIHN0ZG91dC4gRXZlbiB0aG91Z2ggaXQgaXMgbm9taW5hbGx5IHRoZSBkZWZhdWx0LCBpdCBpcyBhbG1vc3QgbmV2ZXIgdXNlZAogICAgIyBpbnNpZGUgcGlwIChhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlIHdpdGhvdXQgYSB2ZXJ5IGdvb2QKICAgICMgcmVhc29uKTsgYXMgb2YgMjAxNi0wMi0yMiBpdCBpcyBvbmx5IHVzZWQgaW4gYSBmZXcgcGxhY2VzIGluc2lkZSB0aGUgVkNTCiAgICAjIHdyYXBwZXIgY29kZS4gSWRlYWxseSB3ZSBzaG91bGQgZ2V0IHJpZCBvZiBpdCBlbnRpcmVseSwgYmVjYXVzZSBpdAogICAgIyBjcmVhdGVzIGEgbG90IG9mIGNvbXBsZXhpdHkgaGVyZSBmb3IgYSByYXJlbHkgdXNlZCBmZWF0dXJlLgogICAgIwogICAgIyBNb3N0IHBsYWNlcyBpbiBwaXAgc2V0IHNob3dfc3Rkb3V0PUZhbHNlLiBXaGF0IHRoaXMgbWVhbnMgaXM6CiAgICAjIC0gV2UgY29ubmVjdCB0aGUgY2hpbGQgc3Rkb3V0IHRvIGEgcGlwZSwgd2hpY2ggd2UgcmVhZC4KICAgICMgLSBCeSBkZWZhdWx0LCB3ZSBoaWRlIHRoZSBvdXRwdXQgYnV0IHNob3cgYSBzcGlubmVyIC0tIHVubGVzcyB0aGUKICAgICMgICBzdWJwcm9jZXNzIGV4aXRzIHdpdGggYW4gZXJyb3IsIGluIHdoaWNoIGNhc2Ugd2Ugc2hvdyB0aGUgb3V0cHV0LgogICAgIyAtIElmIHRoZSAtLXZlcmJvc2Ugb3B0aW9uIHdhcyBwYXNzZWQgKD0gbG9nbGV2ZWwgaXMgREVCVUcpLCB0aGVuIHdlIHNob3cKICAgICMgICB0aGUgb3V0cHV0IHVuY29uZGl0aW9uYWxseS4gKEJ1dCBpbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBzaG93CiAgICAjICAgdGhlIG91dHB1dCBhIHNlY29uZCB0aW1lIGlmIGl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIHdhcyBhbiBlcnJvci4pCiAgICAjCiAgICAjIHN0ZGVyciBpcyBhbHdheXMgbWVyZ2VkIHdpdGggc3Rkb3V0IChldmVuIGlmIHNob3dfc3Rkb3V0PVRydWUpLgogICAgaWYgc2hvd19zdGRvdXQ6CiAgICAgICAgc3Rkb3V0ID0gTm9uZQogICAgZWxzZToKICAgICAgICBzdGRvdXQgPSBzdWJwcm9jZXNzLlBJUEUKICAgIGlmIGNvbW1hbmRfZGVzYyBpcyBOb25lOgogICAgICAgIGNtZF9wYXJ0cyA9IFtdCiAgICAgICAgZm9yIHBhcnQgaW4gY21kOgogICAgICAgICAgICBpZiAnICcgaW4gcGFydCBvciAnXG4nIGluIHBhcnQgb3IgJyInIGluIHBhcnQgb3IgIiciIGluIHBhcnQ6CiAgICAgICAgICAgICAgICBwYXJ0ID0gJyIlcyInICUgcGFydC5yZXBsYWNlKCciJywgJ1xcIicpCiAgICAgICAgICAgIGNtZF9wYXJ0cy5hcHBlbmQocGFydCkKICAgICAgICBjb21tYW5kX2Rlc2MgPSAnICcuam9pbihjbWRfcGFydHMpCiAgICBsb2dnZXIuZGVidWcoIlJ1bm5pbmcgY29tbWFuZCAlcyIsIGNvbW1hbmRfZGVzYykKICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCiAgICBpZiBleHRyYV9lbnZpcm9uOgogICAgICAgIGVudi51cGRhdGUoZXh0cmFfZW52aXJvbikKICAgIHRyeToKICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbigKICAgICAgICAgICAgY21kLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsIHN0ZGluPU5vbmUsIHN0ZG91dD1zdGRvdXQsCiAgICAgICAgICAgIGN3ZD1jd2QsIGVudj1lbnYpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICJFcnJvciAlcyB3aGlsZSBleGVjdXRpbmcgY29tbWFuZCAlcyIsIGV4YywgY29tbWFuZF9kZXNjLAogICAgICAgICkKICAgICAgICByYWlzZQogICAgaWYgc3Rkb3V0IGlzIG5vdCBOb25lOgogICAgICAgIGFsbF9vdXRwdXQgPSBbXQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGxpbmUgPSBjb25zb2xlX3RvX3N0cihwcm9jLnN0ZG91dC5yZWFkbGluZSgpKQogICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCiAgICAgICAgICAgIGFsbF9vdXRwdXQuYXBwZW5kKGxpbmUgKyAnXG4nKQogICAgICAgICAgICBpZiBsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSA8PSBzdGRfbG9nZ2luZy5ERUJVRzoKICAgICAgICAgICAgICAgICMgU2hvdyB0aGUgbGluZSBpbW1lZGlhdGVseQogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGxpbmUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFVwZGF0ZSB0aGUgc3Bpbm5lcgogICAgICAgICAgICAgICAgaWYgc3Bpbm5lciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzcGlubmVyLnNwaW4oKQogICAgcHJvYy53YWl0KCkKICAgIGlmIHNwaW5uZXIgaXMgbm90IE5vbmU6CiAgICAgICAgaWYgcHJvYy5yZXR1cm5jb2RlOgogICAgICAgICAgICBzcGlubmVyLmZpbmlzaCgiZXJyb3IiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNwaW5uZXIuZmluaXNoKCJkb25lIikKICAgIGlmIHByb2MucmV0dXJuY29kZToKICAgICAgICBpZiBvbl9yZXR1cm5jb2RlID09ICdyYWlzZSc6CiAgICAgICAgICAgIGlmIChsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSA+IHN0ZF9sb2dnaW5nLkRFQlVHIGFuZAogICAgICAgICAgICAgICAgICAgIG5vdCBzaG93X3N0ZG91dCk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAnQ29tcGxldGUgb3V0cHV0IGZyb20gY29tbWFuZCAlczonLCBjb21tYW5kX2Rlc2MsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAnJy5qb2luKGFsbF9vdXRwdXQpICsKICAgICAgICAgICAgICAgICAgICAnXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICdDb21tYW5kICIlcyIgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlcyBpbiAlcycKICAgICAgICAgICAgICAgICUgKGNvbW1hbmRfZGVzYywgcHJvYy5yZXR1cm5jb2RlLCBjd2QpKQogICAgICAgIGVsaWYgb25fcmV0dXJuY29kZSA9PSAnd2Fybic6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ0NvbW1hbmQgIiVzIiBoYWQgZXJyb3IgY29kZSAlcyBpbiAlcycsCiAgICAgICAgICAgICAgICBjb21tYW5kX2Rlc2MsIHByb2MucmV0dXJuY29kZSwgY3dkLAogICAgICAgICAgICApCiAgICAgICAgZWxpZiBvbl9yZXR1cm5jb2RlID09ICdpZ25vcmUnOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCB2YWx1ZTogb25fcmV0dXJuY29kZT0lcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIob25fcmV0dXJuY29kZSkpCiAgICBpZiBub3Qgc2hvd19zdGRvdXQ6CiAgICAgICAgcmV0dXJuICcnLmpvaW4oYWxsX291dHB1dCkKCgpkZWYgcmVhZF90ZXh0X2ZpbGUoZmlsZW5hbWUpOgogICAgIiIiUmV0dXJuIHRoZSBjb250ZW50cyBvZiAqZmlsZW5hbWUqLgoKICAgIFRyeSB0byBkZWNvZGUgdGhlIGZpbGUgY29udGVudHMgd2l0aCB1dGYtOCwgdGhlIHByZWZlcnJlZCBzeXN0ZW0gZW5jb2RpbmcKICAgIChlLmcuLCBjcDEyNTIgb24gc29tZSBXaW5kb3dzIG1hY2hpbmVzKSwgYW5kIGxhdGluMSwgaW4gdGhhdCBvcmRlci4KICAgIERlY29kaW5nIGEgYnl0ZSBzdHJpbmcgd2l0aCBsYXRpbjEgd2lsbCBuZXZlciByYWlzZSBhbiBlcnJvci4gSW4gdGhlIHdvcnN0CiAgICBjYXNlLCB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgY29udGFpbiBzb21lIGdhcmJhZ2UgY2hhcmFjdGVycy4KCiAgICAiIiIKICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZnA6CiAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQoKICAgIGVuY29kaW5ncyA9IFsndXRmLTgnLCBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpLCAnbGF0aW4xJ10KICAgIGZvciBlbmMgaW4gZW5jb2RpbmdzOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKGVuYykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGJyZWFrCgogICAgYXNzZXJ0IHR5cGUoZGF0YSkgIT0gYnl0ZXMgICMgTGF0aW4xIHNob3VsZCBoYXZlIHdvcmtlZC4KICAgIHJldHVybiBkYXRhCgoKZGVmIF9tYWtlX2J1aWxkX2RpcihidWlsZF9kaXIpOgogICAgb3MubWFrZWRpcnMoYnVpbGRfZGlyKQogICAgd3JpdGVfZGVsZXRlX21hcmtlcl9maWxlKGJ1aWxkX2RpcikKCgpjbGFzcyBGYWtlRmlsZShvYmplY3QpOgogICAgIiIiV3JhcCBhIGxpc3Qgb2YgbGluZXMgaW4gYW4gb2JqZWN0IHdpdGggcmVhZGxpbmUoKSB0byBtYWtlCiAgICBDb25maWdQYXJzZXIgaGFwcHkuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZXMpOgogICAgICAgIHNlbGYuX2dlbiA9IChsIGZvciBsIGluIGxpbmVzKQoKICAgIGRlZiByZWFkbGluZShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KHNlbGYuX2dlbikKICAgICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZW4ubmV4dCgpCiAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2VuCgoKY2xhc3MgU3RyZWFtV3JhcHBlcihTdHJpbmdJTyk6CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9zdHJlYW0oY2xzLCBvcmlnX3N0cmVhbSk6CiAgICAgICAgY2xzLm9yaWdfc3RyZWFtID0gb3JpZ19zdHJlYW0KICAgICAgICByZXR1cm4gY2xzKCkKCiAgICAjIGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoKSBuZWVkcyBzdGRvdXQuZW5jb2RpbmcgdG8gcHJpbnQgdG8gc3Rkb3V0CiAgICBAcHJvcGVydHkKICAgIGRlZiBlbmNvZGluZyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5vcmlnX3N0cmVhbS5lbmNvZGluZwoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBjYXB0dXJlZF9vdXRwdXQoc3RyZWFtX25hbWUpOgogICAgIiIiUmV0dXJuIGEgY29udGV4dCBtYW5hZ2VyIHVzZWQgYnkgY2FwdHVyZWRfc3Rkb3V0L3N0ZGluL3N0ZGVycgogICAgdGhhdCB0ZW1wb3JhcmlseSByZXBsYWNlcyB0aGUgc3lzIHN0cmVhbSAqc3RyZWFtX25hbWUqIHdpdGggYSBTdHJpbmdJTy4KCiAgICBUYWtlbiBmcm9tIExpYi9zdXBwb3J0L19faW5pdF9fLnB5IGluIHRoZSBDUHl0aG9uIHJlcG8uCiAgICAiIiIKICAgIG9yaWdfc3Rkb3V0ID0gZ2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lKQogICAgc2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lLCBTdHJlYW1XcmFwcGVyLmZyb21fc3RyZWFtKG9yaWdfc3Rkb3V0KSkKICAgIHRyeToKICAgICAgICB5aWVsZCBnZXRhdHRyKHN5cywgc3RyZWFtX25hbWUpCiAgICBmaW5hbGx5OgogICAgICAgIHNldGF0dHIoc3lzLCBzdHJlYW1fbmFtZSwgb3JpZ19zdGRvdXQpCgoKZGVmIGNhcHR1cmVkX3N0ZG91dCgpOgogICAgIiIiQ2FwdHVyZSB0aGUgb3V0cHV0IG9mIHN5cy5zdGRvdXQ6CgogICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CiAgICAgICAgICAgcHJpbnQoJ2hlbGxvJykKICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LmdldHZhbHVlKCksICdoZWxsb1xuJykKCiAgICBUYWtlbiBmcm9tIExpYi9zdXBwb3J0L19faW5pdF9fLnB5IGluIHRoZSBDUHl0aG9uIHJlcG8uCiAgICAiIiIKICAgIHJldHVybiBjYXB0dXJlZF9vdXRwdXQoJ3N0ZG91dCcpCgoKY2xhc3MgY2FjaGVkX3Byb3BlcnR5KG9iamVjdCk6CiAgICAiIiJBIHByb3BlcnR5IHRoYXQgaXMgb25seSBjb21wdXRlZCBvbmNlIHBlciBpbnN0YW5jZSBhbmQgdGhlbiByZXBsYWNlcwogICAgICAgaXRzZWxmIHdpdGggYW4gb3JkaW5hcnkgYXR0cmlidXRlLiBEZWxldGluZyB0aGUgYXR0cmlidXRlIHJlc2V0cyB0aGUKICAgICAgIHByb3BlcnR5LgoKICAgICAgIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2JvdHRsZXB5L2JvdHRsZS9ibG9iLzAuMTEuNS9ib3R0bGUucHkjTDE3NQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMpOgogICAgICAgIHNlbGYuX19kb2NfXyA9IGdldGF0dHIoZnVuYywgJ19fZG9jX18nKQogICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIGNscyk6CiAgICAgICAgaWYgb2JqIGlzIE5vbmU6CiAgICAgICAgICAgICMgV2UncmUgYmVpbmcgYWNjZXNzZWQgZnJvbSB0aGUgY2xhc3MgaXRzZWxmLCBub3QgZnJvbSBhbiBvYmplY3QKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICB2YWx1ZSA9IG9iai5fX2RpY3RfX1tzZWxmLmZ1bmMuX19uYW1lX19dID0gc2VsZi5mdW5jKG9iaikKICAgICAgICByZXR1cm4gdmFsdWUKCgpkZWYgZ2V0X2luc3RhbGxlZF92ZXJzaW9uKGRpc3RfbmFtZSwgbG9va3VwX2RpcnM9Tm9uZSk6CiAgICAiIiJHZXQgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGRpc3RfbmFtZSBhdm9pZGluZyBwa2dfcmVzb3VyY2VzIGNhY2hlIiIiCiAgICAjIENyZWF0ZSBhIHJlcXVpcmVtZW50IHRoYXQgd2UnbGwgbG9vayBmb3IgaW5zaWRlIG9mIHNldHVwdG9vbHMuCiAgICByZXEgPSBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50LnBhcnNlKGRpc3RfbmFtZSkKCiAgICAjIFdlIHdhbnQgdG8gYXZvaWQgaGF2aW5nIHRoaXMgY2FjaGVkLCBzbyB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBhIG5ldwogICAgIyB3b3JraW5nIHNldCBlYWNoIHRpbWUuCiAgICBpZiBsb29rdXBfZGlycyBpcyBOb25lOgogICAgICAgIHdvcmtpbmdfc2V0ID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0KCkKICAgIGVsc2U6CiAgICAgICAgd29ya2luZ19zZXQgPSBwa2dfcmVzb3VyY2VzLldvcmtpbmdTZXQobG9va3VwX2RpcnMpCgogICAgIyBHZXQgdGhlIGluc3RhbGxlZCBkaXN0cmlidXRpb24gZnJvbSBvdXIgd29ya2luZyBzZXQKICAgIGRpc3QgPSB3b3JraW5nX3NldC5maW5kKHJlcSkKCiAgICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBnb3QgYW4gaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbiBvciBub3QsIGlmIHdlIGRpZAogICAgIyB3ZSB3YW50IHRvIHJldHVybiBpdCdzIHZlcnNpb24uCiAgICByZXR1cm4gZGlzdC52ZXJzaW9uIGlmIGRpc3QgZWxzZSBOb25lCgoKZGVmIGNvbnN1bWUoaXRlcmF0b3IpOgogICAgIiIiQ29uc3VtZSBhbiBpdGVyYWJsZSBhdCBDIHNwZWVkLiIiIgogICAgZGVxdWUoaXRlcmF0b3IsIG1heGxlbj0wKQpQSwMEFAAAAAAAAAAhADUK3jtrIgAAayIAADEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9hcHBkaXJzLnB5IiIiClRoaXMgY29kZSB3YXMgdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vQWN0aXZlU3RhdGUvYXBwZGlycyBhbmQgbW9kaWZpZWQKdG8gc3VpdCBvdXIgcHVycG9zZXMuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCBzeXMKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgV0lORE9XUywgZXhwYW5kdXNlcgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgUFkyLCB0ZXh0X3R5cGUKCgpkZWYgdXNlcl9jYWNoZV9kaXIoYXBwbmFtZSk6CiAgICByIiIiCiAgICBSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNhY2hlIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgoKICAgIFR5cGljYWwgdXNlciBjYWNoZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgfi9MaWJyYXJ5L0NhY2hlcy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4gKFhERyBkZWZhdWx0KQogICAgICAgIFdpbmRvd3M6ICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwTmFtZT5cQ2FjaGUKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzIGdvCiAgICBpbiB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlCiAgICBub24tcm9hbWluZyBhcHAgZGF0YSBkaXIgKHRoZSBkZWZhdWx0IHJldHVybmVkIGJ5IGB1c2VyX2RhdGFfZGlyYCkuIEFwcHMKICAgIHR5cGljYWxseSBwdXQgY2FjaGUgZGF0YSBzb21ld2hlcmUgKnVuZGVyKiB0aGUgZ2l2ZW4gZGlyIGhlcmUuIFNvbWUKICAgIGV4YW1wbGVzOgogICAgICAgIC4uLlxNb3ppbGxhXEZpcmVmb3hcUHJvZmlsZXNcPFByb2ZpbGVOYW1lPlxDYWNoZQogICAgICAgIC4uLlxBY21lXFN1cGVyQXBwXENhY2hlXDEuMAoKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiQ2FjaGUiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgdmFsdWUuCiAgICAiIiIKICAgIGlmIFdJTkRPV1M6CiAgICAgICAgIyBHZXQgdGhlIGJhc2UgcGF0aAogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfTE9DQUxfQVBQREFUQSIpKQoKICAgICAgICAjIFdoZW4gdXNpbmcgUHl0aG9uIDIsIHJldHVybiBwYXRocyBhcyBieXRlcyBvbiBXaW5kb3dzIGxpa2Ugd2UgZG8gb24KICAgICAgICAjIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiBTZWUgaGVscGVyIGZ1bmN0aW9uIGRvY3MgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICBpZiBQWTIgYW5kIGlzaW5zdGFuY2UocGF0aCwgdGV4dF90eXBlKToKICAgICAgICAgICAgcGF0aCA9IF93aW5fcGF0aF90b19ieXRlcyhwYXRoKQoKICAgICAgICAjIEFkZCBvdXIgYXBwIG5hbWUgYW5kIENhY2hlIGRpcmVjdG9yeSB0byBpdAogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSwgIkNhY2hlIikKICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgICMgR2V0IHRoZSBiYXNlIHBhdGgKICAgICAgICBwYXRoID0gZXhwYW5kdXNlcigifi9MaWJyYXJ5L0NhY2hlcyIpCgogICAgICAgICMgQWRkIG91ciBhcHAgbmFtZSB0byBpdAogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgIyBHZXQgdGhlIGJhc2UgcGF0aAogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoIlhER19DQUNIRV9IT01FIiwgZXhwYW5kdXNlcigifi8uY2FjaGUiKSkKCiAgICAgICAgIyBBZGQgb3VyIGFwcCBuYW1lIHRvIGl0CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQoKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgcm9hbWluZz1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgICAgICAgICAgICAgfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+ICAgICMgb3IgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkWERHX0RBVEFfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUCAobm90IHJvYW1pbmcpOiAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlwgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXBwbGljYXRpb24gRGF0YVw8QXBwTmFtZT4KICAgICAgICBXaW4gWFAgKHJvYW1pbmcpOiAgICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKG5vdCByb2FtaW5nKTogICBDOlxcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAocm9hbWluZyk6ICAgICAgIEM6XFxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcUm9hbWluZ1w8QXBwTmFtZT4KCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0RBVEFfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlZmF1bHQgIn4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIFdJTkRPV1M6CiAgICAgICAgY29uc3QgPSByb2FtaW5nIGFuZCAiQ1NJRExfQVBQREFUQSIgb3IgIkNTSURMX0xPQ0FMX0FQUERBVEEiCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcihjb25zdCkpLCBhcHBuYW1lKQogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgZXhwYW5kdXNlcignfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvJyksCiAgICAgICAgICAgIGFwcG5hbWUsCiAgICAgICAgKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBvcy5nZXRlbnYoJ1hER19EQVRBX0hPTUUnLCBleHBhbmR1c2VyKCJ+Ly5sb2NhbC9zaGFyZSIpKSwKICAgICAgICAgICAgYXBwbmFtZSwKICAgICAgICApCgogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jb25maWdfZGlyKGFwcG5hbWUsIHJvYW1pbmc9VHJ1ZSk6CiAgICAiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNvbmZpZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgVHJ1ZSkgY2FuIGJlIHNldCBGYWxzZSB0byBub3QgdXNlIHRoZQogICAgICAgICAgICBXaW5kb3dzIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYQogICAgICAgICAgICBXaW5kb3dzIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmNvbmZpZy88QXBwTmFtZT4KICAgICAgICBXaW4gKjogICAgICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0NPTkZJR19IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8uY29uZmlnLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIFdJTkRPV1M6CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgcm9hbWluZz1yb2FtaW5nKQogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19IT01FJywgZXhwYW5kdXNlcigifi8uY29uZmlnIikpCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQoKICAgIHJldHVybiBwYXRoCgoKIyBmb3IgdGhlIGRpc2N1c3Npb24gcmVnYXJkaW5nIHNpdGVfY29uZmlnX2RpcnMgbG9jYXRpb25zCiMgc2VlIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzE3MzM+CmRlZiBzaXRlX2NvbmZpZ19kaXJzKGFwcG5hbWUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBwb3RlbnRpYWwgdXNlci1zaGFyZWQgY29uZmlnIGRpcnMgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KCiAgICBUeXBpY2FsIHVzZXIgY29uZmlnIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPi8KICAgICAgICBVbml4OiAgICAgICAvZXRjIG9yICRYREdfQ09ORklHX0RJUlNbaV0vPEFwcE5hbWU+LyBmb3IgZWFjaCB2YWx1ZSBpbgogICAgICAgICAgICAgICAgICAgICRYREdfQ09ORklHX0RJUlMKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXEFsbCBVc2Vyc1xBcHBsaWNhdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgICAuLi5EYXRhXDxBcHBOYW1lPlwKICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICAgICBvbiBWaXN0YS4pCiAgICAgICAgV2luIDc6ICAgICAgSGlkZGVuLCBidXQgd3JpdGVhYmxlIG9uIFdpbiA3OgogICAgICAgICAgICAgICAgICAgIEM6XFByb2dyYW1EYXRhXDxBcHBOYW1lPlwKICAgICIiIgogICAgaWYgV0lORE9XUzoKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0NPTU1PTl9BUFBEQVRBIikpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpXQogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5qb2luKCcvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0JywgYXBwbmFtZSldCiAgICBlbHNlOgogICAgICAgICMgdHJ5IGxvb2tpbmcgaW4gJFhER19DT05GSUdfRElSUwogICAgICAgIHhkZ19jb25maWdfZGlycyA9IG9zLmdldGVudignWERHX0NPTkZJR19ESVJTJywgJy9ldGMveGRnJykKICAgICAgICBpZiB4ZGdfY29uZmlnX2RpcnM6CiAgICAgICAgICAgIHBhdGhsaXN0ID0gWwogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGV4cGFuZHVzZXIoeCksIGFwcG5hbWUpCiAgICAgICAgICAgICAgICBmb3IgeCBpbiB4ZGdfY29uZmlnX2RpcnMuc3BsaXQob3MucGF0aHNlcCkKICAgICAgICAgICAgXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGhsaXN0ID0gW10KCiAgICAgICAgIyBhbHdheXMgbG9vayBpbiAvZXRjIGRpcmVjdGx5IGFzIHdlbGwKICAgICAgICBwYXRobGlzdC5hcHBlbmQoJy9ldGMnKQoKICAgIHJldHVybiBwYXRobGlzdAoKCiMgLS0gV2luZG93cyBzdXBwb3J0IGZ1bmN0aW9ucyAtLQoKZGVmIF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5KGNzaWRsX25hbWUpOgogICAgIiIiCiAgICBUaGlzIGlzIGEgZmFsbGJhY2sgdGVjaG5pcXVlIGF0IGJlc3QuIEknbSBub3Qgc3VyZSBpZiB1c2luZyB0aGUKICAgIHJlZ2lzdHJ5IGZvciB0aGlzIGd1YXJhbnRlZXMgdXMgdGhlIGNvcnJlY3QgYW5zd2VyIGZvciBhbGwgQ1NJRExfKgogICAgbmFtZXMuCiAgICAiIiIKICAgIGltcG9ydCBfd2lucmVnCgogICAgc2hlbGxfZm9sZGVyX25hbWUgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAiQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogIkNvbW1vbiBBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6ICJMb2NhbCBBcHBEYXRhIiwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBrZXkgPSBfd2lucmVnLk9wZW5LZXkoCiAgICAgICAgX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICByIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMiCiAgICApCiAgICBkaXJlY3RvcnksIF90eXBlID0gX3dpbnJlZy5RdWVyeVZhbHVlRXgoa2V5LCBzaGVsbF9mb2xkZXJfbmFtZSkKICAgIHJldHVybiBkaXJlY3RvcnkKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzKGNzaWRsX25hbWUpOgogICAgY3NpZGxfY29uc3QgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAyNiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAzNSwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6IDI4LAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgIGN0eXBlcy53aW5kbGwuc2hlbGwzMi5TSEdldEZvbGRlclBhdGhXKE5vbmUsIGNzaWRsX2NvbnN0LCBOb25lLCAwLCBidWYpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gYnVmOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmMiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgICAgICBpZiBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkdldFNob3J0UGF0aE5hbWVXKGJ1Zi52YWx1ZSwgYnVmMiwgMTAyNCk6CiAgICAgICAgICAgIGJ1ZiA9IGJ1ZjIKCiAgICByZXR1cm4gYnVmLnZhbHVlCgppZiBXSU5ET1dTOgogICAgdHJ5OgogICAgICAgIGltcG9ydCBjdHlwZXMKICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeQoKCmRlZiBfd2luX3BhdGhfdG9fYnl0ZXMocGF0aCk6CiAgICAiIiJFbmNvZGUgV2luZG93cyBwYXRocyB0byBieXRlcy4gT25seSB1c2VkIG9uIFB5dGhvbiAyLgoKICAgIE1vdGl2YXRpb24gaXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIHdoZXJlIHBhdGhzCiAgICBhcmUgYWxzbyByZXR1cm5lZCBhcyBieXRlcy4gVGhpcyBhdm9pZHMgcHJvYmxlbXMgbWl4aW5nIGJ5dGVzIGFuZCBVbmljb2RlCiAgICBlbHNld2hlcmUgaW4gdGhlIGNvZGViYXNlLiBGb3IgbW9yZSBkZXRhaWxzIGFuZCBkaXNjdXNzaW9uIHNlZQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMzQ2Mz4uCgogICAgSWYgZW5jb2RpbmcgdXNpbmcgQVNDSUkgYW5kIE1CQ1MgZmFpbHMsIHJldHVybiB0aGUgb3JpZ2luYWwgVW5pY29kZSBwYXRoLgogICAgIiIiCiAgICBmb3IgZW5jb2RpbmcgaW4gKCdBU0NJSScsICdNQkNTJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gcGF0aC5lbmNvZGUoZW5jb2RpbmcpCiAgICAgICAgZXhjZXB0IChVbmljb2RlRW5jb2RlRXJyb3IsIExvb2t1cEVycm9yKToKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBhdGgKUEsDBBQAAAAAAAAAIQDNDE0uIAUAACAFAAAvAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvYnVpbGQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHRlbXBmaWxlCgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcm10cmVlCgoKY2xhc3MgQnVpbGREaXJlY3Rvcnkob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lLCBkZWxldGU9Tm9uZSk6CiAgICAgICAgIyBJZiB3ZSB3ZXJlIG5vdCBnaXZlbiBhbiBleHBsaWNpdCBkaXJlY3RvcnksIGFuZCB3ZSB3ZXJlIG5vdCBnaXZlbiBhbgogICAgICAgICMgZXhwbGljaXQgZGVsZXRlIG9wdGlvbiwgdGhlbiB3ZSdsbCBkZWZhdWx0IHRvIGRlbGV0aW5nLgogICAgICAgIGlmIG5hbWUgaXMgTm9uZSBhbmQgZGVsZXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGRlbGV0ZSA9IFRydWUKCiAgICAgICAgaWYgbmFtZSBpcyBOb25lOgogICAgICAgICAgICAjIFdlIHJlYWxwYXRoIGhlcmUgYmVjYXVzZSBzb21lIHN5c3RlbXMgaGF2ZSB0aGVpciBkZWZhdWx0IHRtcGRpcgogICAgICAgICAgICAjIHN5bWxpbmtlZCB0byBhbm90aGVyIGRpcmVjdG9yeS4gIFRoaXMgdGVuZHMgdG8gY29uZnVzZSBidWlsZAogICAgICAgICAgICAjIHNjcmlwdHMsIHNvIHdlIGNhbm9uaWNhbGl6ZSB0aGUgcGF0aCBieSB0cmF2ZXJzaW5nIHBvdGVudGlhbAogICAgICAgICAgICAjIHN5bWxpbmtzIGhlcmUuCiAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLnJlYWxwYXRoKHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSJwaXAtYnVpbGQtIikpCiAgICAgICAgICAgICMgSWYgd2Ugd2VyZSBub3QgZ2l2ZW4gYW4gZXhwbGljaXQgZGlyZWN0b3J5LCBhbmQgd2Ugd2VyZSBub3QgZ2l2ZW4KICAgICAgICAgICAgIyBhbiBleHBsaWNpdCBkZWxldGUgb3B0aW9uLCB0aGVuIHdlJ2xsIGRlZmF1bHQgdG8gZGVsZXRpbmcuCiAgICAgICAgICAgIGlmIGRlbGV0ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZGVsZXRlID0gVHJ1ZQoKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5kZWxldGUgPSBkZWxldGUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8e30geyFyfT4iLmZvcm1hdChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5uYW1lKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGMsIHZhbHVlLCB0Yik6CiAgICAgICAgc2VsZi5jbGVhbnVwKCkKCiAgICBkZWYgY2xlYW51cChzZWxmKToKICAgICAgICBpZiBzZWxmLmRlbGV0ZToKICAgICAgICAgICAgcm10cmVlKHNlbGYubmFtZSkKUEsDBBQAAAAAAAAAIQBxHmokuAgAALgIAAA1AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvZGVwcmVjYXRpb24ucHkiIiIKQSBtb2R1bGUgdGhhdCBpbXBsZW1lbnRzIHRvb2xpbmcgdG8gZW5hYmxlIGVhc3kgd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRpb25zLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCB3YXJuaW5ncwoKCmNsYXNzIFBpcERlcHJlY2F0aW9uV2FybmluZyhXYXJuaW5nKToKICAgIHBhc3MKCgpjbGFzcyBQZW5kaW5nKG9iamVjdCk6CiAgICBwYXNzCgoKY2xhc3MgUmVtb3ZlZEluUGlwMTBXYXJuaW5nKFBpcERlcHJlY2F0aW9uV2FybmluZyk6CiAgICBwYXNzCgoKY2xhc3MgUmVtb3ZlZEluUGlwMTFXYXJuaW5nKFBpcERlcHJlY2F0aW9uV2FybmluZywgUGVuZGluZyk6CiAgICBwYXNzCgoKY2xhc3MgUHl0aG9uMjZEZXByZWNhdGlvbldhcm5pbmcoUGlwRGVwcmVjYXRpb25XYXJuaW5nKToKICAgIHBhc3MKCgojIFdhcm5pbmdzIDwtPiBMb2dnaW5nIEludGVncmF0aW9uCgoKX3dhcm5pbmdzX3Nob3d3YXJuaW5nID0gTm9uZQoKCmRlZiBfc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKICAgIGlmIGZpbGUgaXMgbm90IE5vbmU6CiAgICAgICAgaWYgX3dhcm5pbmdzX3Nob3d3YXJuaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICBfd2FybmluZ3Nfc2hvd3dhcm5pbmcoCiAgICAgICAgICAgICAgICBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZSwgbGluZSwKICAgICAgICAgICAgKQogICAgZWxzZToKICAgICAgICBpZiBpc3N1YmNsYXNzKGNhdGVnb3J5LCBQaXBEZXByZWNhdGlvbldhcm5pbmcpOgogICAgICAgICAgICAjIFdlIHVzZSBhIHNwZWNpYWxseSBuYW1lZCBsb2dnZXIgd2hpY2ggd2lsbCBoYW5kbGUgYWxsIG9mIHRoZQogICAgICAgICAgICAjIGRlcHJlY2F0aW9uIG1lc3NhZ2VzIGZvciBwaXAuCiAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJwaXAuZGVwcmVjYXRpb25zIikKCiAgICAgICAgICAgICMgVGhpcyBpcyBwdXJwb3NlbHkgdXNpbmcgdGhlICUgZm9ybWF0dGVyIGhlcmUgaW5zdGVhZCBvZiBsZXR0aW5nCiAgICAgICAgICAgICMgdGhlIGxvZ2dpbmcgbW9kdWxlIGhhbmRsZSB0aGUgaW50ZXJwb2xhdGlvbi4gVGhpcyBpcyBiZWNhdXNlIHdlCiAgICAgICAgICAgICMgd2FudCBpdCB0byBhcHBlYXIgYXMgaWYgc29tZW9uZSB0eXBlZCB0aGlzIGVudGlyZSBtZXNzYWdlIG91dC4KICAgICAgICAgICAgbG9nX21lc3NhZ2UgPSAiREVQUkVDQVRJT046ICVzIiAlIG1lc3NhZ2UKCiAgICAgICAgICAgICMgUGlwRGVwcmVjYXRpb25XYXJuaW5ncyB0aGF0IGFyZSBQZW5kaW5nIHN0aWxsIGhhdmUgYXQgbGVhc3QgMgogICAgICAgICAgICAjIHZlcnNpb25zIHRvIGdvIHVudGlsIHRoZXkgYXJlIHJlbW92ZWQgc28gdGhleSBjYW4ganVzdCBiZQogICAgICAgICAgICAjIHdhcm5pbmdzLiAgT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgdmVyeSBuZXh0CiAgICAgICAgICAgICMgdmVyc2lvbiBvZiBwaXAuIFdlIHdhbnQgdGhlc2UgdG8gYmUgbW9yZSBvYnZpb3VzIHNvIHdlIHVzZSB0aGUKICAgICAgICAgICAgIyBFUlJPUiBsb2dnaW5nIGxldmVsLgogICAgICAgICAgICBpZiBpc3N1YmNsYXNzKGNhdGVnb3J5LCBQZW5kaW5nKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGxvZ19tZXNzYWdlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGxvZ19tZXNzYWdlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZygKICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlLCBsaW5lLAogICAgICAgICAgICApCgoKZGVmIGluc3RhbGxfd2FybmluZ19sb2dnZXIoKToKICAgICMgRW5hYmxlIG91ciBEZXByZWNhdGlvbiBXYXJuaW5ncwogICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJkZWZhdWx0IiwgUGlwRGVwcmVjYXRpb25XYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKCiAgICBnbG9iYWwgX3dhcm5pbmdzX3Nob3d3YXJuaW5nCgogICAgaWYgX3dhcm5pbmdzX3Nob3d3YXJuaW5nIGlzIE5vbmU6CiAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nID0gd2FybmluZ3Muc2hvd3dhcm5pbmcKICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IF9zaG93d2FybmluZwpQSwMEFAAAAAAAAAAhAL1aP7DLAwAAywMAADIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9lbmNvZGluZy5weWltcG9ydCBjb2RlY3MKaW1wb3J0IGxvY2FsZQppbXBvcnQgcmUKCgpCT01TID0gWwogICAgKGNvZGVjcy5CT01fVVRGOCwgJ3V0ZjgnKSwKICAgIChjb2RlY3MuQk9NX1VURjE2LCAndXRmMTYnKSwKICAgIChjb2RlY3MuQk9NX1VURjE2X0JFLCAndXRmMTYtYmUnKSwKICAgIChjb2RlY3MuQk9NX1VURjE2X0xFLCAndXRmMTYtbGUnKSwKICAgIChjb2RlY3MuQk9NX1VURjMyLCAndXRmMzInKSwKICAgIChjb2RlY3MuQk9NX1VURjMyX0JFLCAndXRmMzItYmUnKSwKICAgIChjb2RlY3MuQk9NX1VURjMyX0xFLCAndXRmMzItbGUnKSwKXQoKRU5DT0RJTkdfUkUgPSByZS5jb21waWxlKGInY29kaW5nWzo9XVxzKihbLVx3Ll0rKScpCgoKZGVmIGF1dG9fZGVjb2RlKGRhdGEpOgogICAgIiIiQ2hlY2sgYSBieXRlcyBzdHJpbmcgZm9yIGEgQk9NIHRvIGNvcnJlY3RseSBkZXRlY3QgdGhlIGVuY29kaW5nCgogICAgRmFsbGJhY2sgdG8gbG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKEZhbHNlKSBsaWtlIG9wZW4oKSBvbiBQeXRob24zIiIiCiAgICBmb3IgYm9tLCBlbmNvZGluZyBpbiBCT01TOgogICAgICAgIGlmIGRhdGEuc3RhcnRzd2l0aChib20pOgogICAgICAgICAgICByZXR1cm4gZGF0YVtsZW4oYm9tKTpdLmRlY29kZShlbmNvZGluZykKICAgICMgTGV0cyBjaGVjayB0aGUgZmlyc3QgdHdvIGxpbmVzIGFzIGluIFBFUDI2MwogICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdChiJ1xuJylbOjJdOgogICAgICAgIGlmIGxpbmVbMDoxXSA9PSBiJyMnIGFuZCBFTkNPRElOR19SRS5zZWFyY2gobGluZSk6CiAgICAgICAgICAgIGVuY29kaW5nID0gRU5DT0RJTkdfUkUuc2VhcmNoKGxpbmUpLmdyb3VwcygpWzBdLmRlY29kZSgnYXNjaWknKQogICAgICAgICAgICByZXR1cm4gZGF0YS5kZWNvZGUoZW5jb2RpbmcpCiAgICByZXR1cm4gZGF0YS5kZWNvZGUobG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKEZhbHNlKSkKUEsDBBQAAAAAAAAAIQDyQ+3AgwMAAIMDAAA0AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvZmlsZXN5c3RlbS5weWltcG9ydCBvcwppbXBvcnQgb3MucGF0aAoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBnZXRfcGF0aF91aWQKCgpkZWYgY2hlY2tfcGF0aF9vd25lcihwYXRoKToKICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhIHdheSB0byBjaGVjayB0aGUgZWZmZWN0aXZlIHVpZCBvZiB0aGlzIHByb2Nlc3MsIHRoZW4KICAgICMgd2UnbGwganVzdCBhc3N1bWUgdGhhdCB3ZSBvd24gdGhlIGRpcmVjdG9yeS4KICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAiZ2V0ZXVpZCIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgcHJldmlvdXMgPSBOb25lCiAgICB3aGlsZSBwYXRoICE9IHByZXZpb3VzOgogICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhwYXRoKToKICAgICAgICAgICAgIyBDaGVjayBpZiBwYXRoIGlzIHdyaXRhYmxlIGJ5IGN1cnJlbnQgdXNlci4KICAgICAgICAgICAgaWYgb3MuZ2V0ZXVpZCgpID09IDA6CiAgICAgICAgICAgICAgICAjIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHJvb3QgdXNlciBpbiBvcmRlciB0byBoYW5kbGUgcHJvcGVybHkKICAgICAgICAgICAgICAgICMgY2FzZXMgd2hlcmUgdXNlcnMgdXNlIHN1ZG8gd2l0aG91dCAtSCBmbGFnLgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHBhdGhfdWlkID0gZ2V0X3BhdGhfdWlkKHBhdGgpCiAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIHJldHVybiBwYXRoX3VpZCA9PSAwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gb3MuYWNjZXNzKHBhdGgsIG9zLldfT0spCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJldmlvdXMsIHBhdGggPSBwYXRoLCBvcy5wYXRoLmRpcm5hbWUocGF0aCkKUEsDBBQAAAAAAAAAIQAgNwV0ewsAAHsLAAAvAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvZ2xpYmMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHJlCmltcG9ydCBjdHlwZXMKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCB3YXJuaW5ncwoKCmRlZiBnbGliY192ZXJzaW9uX3N0cmluZygpOgogICAgIlJldHVybnMgZ2xpYmMgdmVyc2lvbiBzdHJpbmcsIG9yIE5vbmUgaWYgbm90IHVzaW5nIGdsaWJjLiIKCiAgICAjIGN0eXBlcy5DRExMKE5vbmUpIGludGVybmFsbHkgY2FsbHMgZGxvcGVuKE5VTEwpLCBhbmQgYXMgdGhlIGRsb3BlbgogICAgIyBtYW5wYWdlIHNheXMsICJJZiBmaWxlbmFtZSBpcyBOVUxMLCB0aGVuIHRoZSByZXR1cm5lZCBoYW5kbGUgaXMgZm9yIHRoZQogICAgIyBtYWluIHByb2dyYW0iLiBUaGlzIHdheSB3ZSBjYW4gbGV0IHRoZSBsaW5rZXIgZG8gdGhlIHdvcmsgdG8gZmlndXJlIG91dAogICAgIyB3aGljaCBsaWJjIG91ciBwcm9jZXNzIGlzIGFjdHVhbGx5IHVzaW5nLgogICAgcHJvY2Vzc19uYW1lc3BhY2UgPSBjdHlwZXMuQ0RMTChOb25lKQogICAgdHJ5OgogICAgICAgIGdudV9nZXRfbGliY192ZXJzaW9uID0gcHJvY2Vzc19uYW1lc3BhY2UuZ251X2dldF9saWJjX3ZlcnNpb24KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAjIFN5bWJvbCBkb2Vzbid0IGV4aXN0IC0+IHRoZXJlZm9yZSwgd2UgYXJlIG5vdCBsaW5rZWQgdG8KICAgICAgICAjIGdsaWJjLgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBDYWxsIGdudV9nZXRfbGliY192ZXJzaW9uLCB3aGljaCByZXR1cm5zIGEgc3RyaW5nIGxpa2UgIjIuNSIKICAgIGdudV9nZXRfbGliY192ZXJzaW9uLnJlc3R5cGUgPSBjdHlwZXMuY19jaGFyX3AKICAgIHZlcnNpb25fc3RyID0gZ251X2dldF9saWJjX3ZlcnNpb24oKQogICAgIyBweTIgLyBweTMgY29tcGF0aWJpbGl0eToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb25fc3RyLCBzdHIpOgogICAgICAgIHZlcnNpb25fc3RyID0gdmVyc2lvbl9zdHIuZGVjb2RlKCJhc2NpaSIpCgogICAgcmV0dXJuIHZlcnNpb25fc3RyCgoKIyBTZXBhcmF0ZWQgb3V0IGZyb20gaGF2ZV9jb21wYXRpYmxlX2dsaWJjIGZvciBlYXNpZXIgdW5pdCB0ZXN0aW5nCmRlZiBjaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcik6CiAgICAjIFBhcnNlIHN0cmluZyBhbmQgY2hlY2sgYWdhaW5zdCByZXF1ZXN0ZWQgdmVyc2lvbi4KICAgICMKICAgICMgV2UgdXNlIGEgcmVnZXhwIGluc3RlYWQgb2Ygc3RyLnNwbGl0IGJlY2F1c2Ugd2Ugd2FudCB0byBkaXNjYXJkIGFueQogICAgIyByYW5kb20ganVuayB0aGF0IG1pZ2h0IGNvbWUgYWZ0ZXIgdGhlIG1pbm9yIHZlcnNpb24gLS0gdGhpcyBtaWdodCBoYXBwZW4KICAgICMgaW4gcGF0Y2hlZC9mb3JrZWQgdmVyc2lvbnMgb2YgZ2xpYmMgKGUuZy4gTGluYXJvJ3MgdmVyc2lvbiBvZiBnbGliYwogICAgIyB1c2VzIHZlcnNpb24gc3RyaW5ncyBsaWtlICIyLjIwLTIwMTQuMTEiKS4gU2VlIGdoLTM1ODguCiAgICBtID0gcmUubWF0Y2gociIoP1A8bWFqb3I+WzAtOV0rKVwuKD9QPG1pbm9yPlswLTldKykiLCB2ZXJzaW9uX3N0cikKICAgIGlmIG5vdCBtOgogICAgICAgIHdhcm5pbmdzLndhcm4oIkV4cGVjdGVkIGdsaWJjIHZlcnNpb24gd2l0aCAyIGNvbXBvbmVudHMgbWFqb3IubWlub3IsIgogICAgICAgICAgICAgICAgICAgICAgIiBnb3Q6ICVzIiAlIHZlcnNpb25fc3RyLCBSdW50aW1lV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiAoaW50KG0uZ3JvdXAoIm1ham9yIikpID09IHJlcXVpcmVkX21ham9yIGFuZAogICAgICAgICAgICBpbnQobS5ncm91cCgibWlub3IiKSkgPj0gbWluaW11bV9taW5vcikKCgpkZWYgaGF2ZV9jb21wYXRpYmxlX2dsaWJjKHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgIHZlcnNpb25fc3RyID0gZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKQogICAgaWYgdmVyc2lvbl9zdHIgaXMgTm9uZToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBjaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcikKCgojIHBsYXRmb3JtLmxpYmNfdmVyIHJlZ3VsYXJseSByZXR1cm5zIGNvbXBsZXRlbHkgbm9uc2Vuc2ljYWwgZ2xpYmMKIyB2ZXJzaW9ucy4gRS5nLiBvbiBteSBjb21wdXRlciwgcGxhdGZvcm0gc2F5czoKIwojICAgfiQgcHl0aG9uMi43IC1jICdpbXBvcnQgcGxhdGZvcm07IHByaW50KHBsYXRmb3JtLmxpYmNfdmVyKCkpJwojICAgKCdnbGliYycsICcyLjcnKQojICAgfiQgcHl0aG9uMy41IC1jICdpbXBvcnQgcGxhdGZvcm07IHByaW50KHBsYXRmb3JtLmxpYmNfdmVyKCkpJwojICAgKCdnbGliYycsICcyLjknKQojCiMgQnV0IHRoZSB0cnV0aCBpczoKIwojICAgfiQgbGRkIC0tdmVyc2lvbgojICAgbGRkIChEZWJpYW4gR0xJQkMgMi4yMi0xMSkgMi4yMgojCiMgVGhpcyBpcyB1bmZvcnR1bmF0ZSwgYmVjYXVzZSBpdCBtZWFucyB0aGF0IHRoZSBsaW5laGF1bCBkYXRhIG9uIGxpYmMKIyB2ZXJzaW9ucyB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkgcGlwIDguMS4yIGFuZCBlYXJsaWVyIGlzIHVzZWxlc3MgYW5kCiMgbWlzbGVhZGluZy4gU29sdXRpb246IGluc3RlYWQgb2YgdXNpbmcgcGxhdGZvcm0sIHVzZSBvdXIgY29kZSB0aGF0IGFjdHVhbGx5CiMgd29ya3MuCmRlZiBsaWJjX3ZlcigpOgogICAgZ2xpYmNfdmVyc2lvbiA9IGdsaWJjX3ZlcnNpb25fc3RyaW5nKCkKICAgIGlmIGdsaWJjX3ZlcnNpb24gaXMgTm9uZToKICAgICAgICAjIEZvciBub24tZ2xpYmMgcGxhdGZvcm1zLCBmYWxsIGJhY2sgb24gcGxhdGZvcm0ubGliY192ZXIKICAgICAgICByZXR1cm4gcGxhdGZvcm0ubGliY192ZXIoKQogICAgZWxzZToKICAgICAgICByZXR1cm4gKCJnbGliYyIsIGdsaWJjX3ZlcnNpb24pClBLAwQUAAAAAAAAACEAqTTpBDILAAAyCwAAMAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2hhc2hlcy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgaGFzaGxpYgoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSGFzaE1pc21hdGNoLCBIYXNoTWlzc2luZywgSW5zdGFsbGF0aW9uRXJyb3IKZnJvbSBwaXAudXRpbHMgaW1wb3J0IHJlYWRfY2h1bmtzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBpdGVyaXRlbXMsIGl0ZXJrZXlzLCBpdGVydmFsdWVzCgoKIyBUaGUgcmVjb21tZW5kZWQgaGFzaCBhbGdvIG9mIHRoZSBtb21lbnQuIENoYW5nZSB0aGlzIHdoZW5ldmVyIHRoZSBzdGF0ZSBvZgojIHRoZSBhcnQgY2hhbmdlczsgaXQgd29uJ3QgaHVydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgpGQVZPUklURV9IQVNIID0gJ3NoYTI1NicKCgojIE5hbWVzIG9mIGhhc2hsaWIgYWxnb3JpdGhtcyBhbGxvd2VkIGJ5IHRoZSAtLWhhc2ggb3B0aW9uIGFuZCBgYHBpcCBoYXNoYGAKIyBDdXJyZW50bHksIHRob3NlIGFyZSB0aGUgb25lcyBhdCBsZWFzdCBhcyBjb2xsaXNpb24tcmVzaXN0YW50IGFzIHNoYTI1Ni4KU1RST05HX0hBU0hFUyA9IFsnc2hhMjU2JywgJ3NoYTM4NCcsICdzaGE1MTInXQoKCmNsYXNzIEhhc2hlcyhvYmplY3QpOgogICAgIiIiQSB3cmFwcGVyIHRoYXQgYnVpbGRzIG11bHRpcGxlIGhhc2hlcyBhdCBvbmNlIGFuZCBjaGVja3MgdGhlbSBhZ2FpbnN0CiAgICBrbm93bi1nb29kIHZhbHVlcwoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhc2hlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICA6cGFyYW0gaGFzaGVzOiBBIGRpY3Qgb2YgYWxnb3JpdGhtIG5hbWVzIHBvaW50aW5nIHRvIGxpc3RzIG9mIGFsbG93ZWQKICAgICAgICAgICAgaGV4IGRpZ2VzdHMKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9hbGxvd2VkID0ge30gaWYgaGFzaGVzIGlzIE5vbmUgZWxzZSBoYXNoZXMKCiAgICBkZWYgY2hlY2tfYWdhaW5zdF9jaHVua3Moc2VsZiwgY2h1bmtzKToKICAgICAgICAiIiJDaGVjayBnb29kIGhhc2hlcyBhZ2FpbnN0IG9uZXMgYnVpbHQgZnJvbSBpdGVyYWJsZSBvZiBjaHVua3Mgb2YKICAgICAgICBkYXRhLgoKICAgICAgICBSYWlzZSBIYXNoTWlzbWF0Y2ggaWYgbm9uZSBtYXRjaC4KCiAgICAgICAgIiIiCiAgICAgICAgZ290cyA9IHt9CiAgICAgICAgZm9yIGhhc2hfbmFtZSBpbiBpdGVya2V5cyhzZWxmLl9hbGxvd2VkKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZ290c1toYXNoX25hbWVdID0gaGFzaGxpYi5uZXcoaGFzaF9uYW1lKQogICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcignVW5rbm93biBoYXNoIG5hbWU6ICVzJyAlIGhhc2hfbmFtZSkKCiAgICAgICAgZm9yIGNodW5rIGluIGNodW5rczoKICAgICAgICAgICAgZm9yIGhhc2ggaW4gaXRlcnZhbHVlcyhnb3RzKToKICAgICAgICAgICAgICAgIGhhc2gudXBkYXRlKGNodW5rKQoKICAgICAgICBmb3IgaGFzaF9uYW1lLCBnb3QgaW4gaXRlcml0ZW1zKGdvdHMpOgogICAgICAgICAgICBpZiBnb3QuaGV4ZGlnZXN0KCkgaW4gc2VsZi5fYWxsb3dlZFtoYXNoX25hbWVdOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5fcmFpc2UoZ290cykKCiAgICBkZWYgX3JhaXNlKHNlbGYsIGdvdHMpOgogICAgICAgIHJhaXNlIEhhc2hNaXNtYXRjaChzZWxmLl9hbGxvd2VkLCBnb3RzKQoKICAgIGRlZiBjaGVja19hZ2FpbnN0X2ZpbGUoc2VsZiwgZmlsZSk6CiAgICAgICAgIiIiQ2hlY2sgZ29vZCBoYXNoZXMgYWdhaW5zdCBhIGZpbGUtbGlrZSBvYmplY3QKCiAgICAgICAgUmFpc2UgSGFzaE1pc21hdGNoIGlmIG5vbmUgbWF0Y2guCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmNoZWNrX2FnYWluc3RfY2h1bmtzKHJlYWRfY2h1bmtzKGZpbGUpKQoKICAgIGRlZiBjaGVja19hZ2FpbnN0X3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGZpbGU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNoZWNrX2FnYWluc3RfZmlsZShmaWxlKQoKICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gd2hldGhlciBJIGtub3cgYW55IGtub3duLWdvb2QgaGFzaGVzLiIiIgogICAgICAgIHJldHVybiBib29sKHNlbGYuX2FsbG93ZWQpCgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fbm9uemVyb19fKCkKCgpjbGFzcyBNaXNzaW5nSGFzaGVzKEhhc2hlcyk6CiAgICAiIiJBIHdvcmthbGlrZSBmb3IgSGFzaGVzIHVzZWQgd2hlbiB3ZSdyZSBtaXNzaW5nIGEgaGFzaCBmb3IgYSByZXF1aXJlbWVudAoKICAgIEl0IGNvbXB1dGVzIHRoZSBhY3R1YWwgaGFzaCBvZiB0aGUgcmVxdWlyZW1lbnQgYW5kIHJhaXNlcyBhIEhhc2hNaXNzaW5nCiAgICBleGNlcHRpb24gc2hvd2luZyBpdCB0byB0aGUgdXNlci4KCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAiIiJEb24ndCBvZmZlciB0aGUgYGBoYXNoZXNgYCBrd2FyZy4iIiIKICAgICAgICAjIFBhc3Mgb3VyIGZhdm9yaXRlIGhhc2ggaW4gdG8gZ2VuZXJhdGUgYSAiZ290dGVuIGhhc2giLiBXaXRoIHRoZQogICAgICAgICMgZW1wdHkgbGlzdCwgaXQgd2lsbCBuZXZlciBtYXRjaCwgc28gYW4gZXJyb3Igd2lsbCBhbHdheXMgcmFpc2UuCiAgICAgICAgc3VwZXIoTWlzc2luZ0hhc2hlcywgc2VsZikuX19pbml0X18oaGFzaGVzPXtGQVZPUklURV9IQVNIOiBbXX0pCgogICAgZGVmIF9yYWlzZShzZWxmLCBnb3RzKToKICAgICAgICByYWlzZSBIYXNoTWlzc2luZyhnb3RzW0ZBVk9SSVRFX0hBU0hdLmhleGRpZ2VzdCgpKQpQSwMEFAAAAAAAAAAhAGcm13j/DAAA/wwAADEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9sb2dnaW5nLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBsb2dnaW5nCmltcG9ydCBsb2dnaW5nLmhhbmRsZXJzCmltcG9ydCBvcwoKdHJ5OgogICAgaW1wb3J0IHRocmVhZGluZwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZwoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBXSU5ET1dTCmZyb20gcGlwLnV0aWxzIGltcG9ydCBlbnN1cmVfZGlyCgp0cnk6CiAgICBmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBjb2xvcmFtYQojIExvdHMgb2YgZGlmZmVyZW50IGVycm9ycyBjYW4gY29tZSBmcm9tIHRoaXMsIGluY2x1ZGluZyBTeXN0ZW1FcnJvciBhbmQKIyBJbXBvcnRFcnJvci4KZXhjZXB0IEV4Y2VwdGlvbjoKICAgIGNvbG9yYW1hID0gTm9uZQoKCl9sb2dfc3RhdGUgPSB0aHJlYWRpbmcubG9jYWwoKQpfbG9nX3N0YXRlLmluZGVudGF0aW9uID0gMAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBpbmRlbnRfbG9nKG51bT0yKToKICAgICIiIgogICAgQSBjb250ZXh0IG1hbmFnZXIgd2hpY2ggd2lsbCBjYXVzZSB0aGUgbG9nIG91dHB1dCB0byBiZSBpbmRlbnRlZCBmb3IgYW55CiAgICBsb2cgbWVzc2FnZXMgZW1pdHRlZCBpbnNpZGUgaXQuCiAgICAiIiIKICAgIF9sb2dfc3RhdGUuaW5kZW50YXRpb24gKz0gbnVtCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgX2xvZ19zdGF0ZS5pbmRlbnRhdGlvbiAtPSBudW0KCgpkZWYgZ2V0X2luZGVudGF0aW9uKCk6CiAgICByZXR1cm4gZ2V0YXR0cihfbG9nX3N0YXRlLCAnaW5kZW50YXRpb24nLCAwKQoKCmNsYXNzIEluZGVudGluZ0Zvcm1hdHRlcihsb2dnaW5nLkZvcm1hdHRlcik6CgogICAgZGVmIGZvcm1hdChzZWxmLCByZWNvcmQpOgogICAgICAgICIiIgogICAgICAgIENhbGxzIHRoZSBzdGFuZGFyZCBmb3JtYXR0ZXIsIGJ1dCB3aWxsIGluZGVudCBhbGwgb2YgdGhlIGxvZyBtZXNzYWdlcwogICAgICAgIGJ5IG91ciBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsLgogICAgICAgICIiIgogICAgICAgIGZvcm1hdHRlZCA9IGxvZ2dpbmcuRm9ybWF0dGVyLmZvcm1hdChzZWxmLCByZWNvcmQpCiAgICAgICAgZm9ybWF0dGVkID0gIiIuam9pbihbCiAgICAgICAgICAgICgiICIgKiBnZXRfaW5kZW50YXRpb24oKSkgKyBsaW5lCiAgICAgICAgICAgIGZvciBsaW5lIGluIGZvcm1hdHRlZC5zcGxpdGxpbmVzKFRydWUpCiAgICAgICAgXSkKICAgICAgICByZXR1cm4gZm9ybWF0dGVkCgoKZGVmIF9jb2xvcl93cmFwKCpjb2xvcnMpOgogICAgZGVmIHdyYXBwZWQoaW5wKToKICAgICAgICByZXR1cm4gIiIuam9pbihsaXN0KGNvbG9ycykgKyBbaW5wLCBjb2xvcmFtYS5TdHlsZS5SRVNFVF9BTExdKQogICAgcmV0dXJuIHdyYXBwZWQKCgpjbGFzcyBDb2xvcml6ZWRTdHJlYW1IYW5kbGVyKGxvZ2dpbmcuU3RyZWFtSGFuZGxlcik6CgogICAgIyBEb24ndCBidWlsZCB1cCBhIGxpc3Qgb2YgY29sb3JzIGlmIHdlIGRvbid0IGhhdmUgY29sb3JhbWEKICAgIGlmIGNvbG9yYW1hOgogICAgICAgIENPTE9SUyA9IFsKICAgICAgICAgICAgIyBUaGlzIG5lZWRzIHRvIGJlIGluIG9yZGVyIGZyb20gaGlnaGVzdCBsb2dnaW5nIGxldmVsIHRvIGxvd2VzdC4KICAgICAgICAgICAgKGxvZ2dpbmcuRVJST1IsIF9jb2xvcl93cmFwKGNvbG9yYW1hLkZvcmUuUkVEKSksCiAgICAgICAgICAgIChsb2dnaW5nLldBUk5JTkcsIF9jb2xvcl93cmFwKGNvbG9yYW1hLkZvcmUuWUVMTE9XKSksCiAgICAgICAgXQogICAgZWxzZToKICAgICAgICBDT0xPUlMgPSBbXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW09Tm9uZSk6CiAgICAgICAgbG9nZ2luZy5TdHJlYW1IYW5kbGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSkKCiAgICAgICAgaWYgV0lORE9XUyBhbmQgY29sb3JhbWE6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gY29sb3JhbWEuQW5zaVRvV2luMzIoc2VsZi5zdHJlYW0pCgogICAgZGVmIHNob3VsZF9jb2xvcihzZWxmKToKICAgICAgICAjIERvbid0IGNvbG9yaXplIHRoaW5ncyBpZiB3ZSBkbyBub3QgaGF2ZSBjb2xvcmFtYQogICAgICAgIGlmIG5vdCBjb2xvcmFtYToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJlYWxfc3RyZWFtID0gKAogICAgICAgICAgICBzZWxmLnN0cmVhbSBpZiBub3QgaXNpbnN0YW5jZShzZWxmLnN0cmVhbSwgY29sb3JhbWEuQW5zaVRvV2luMzIpCiAgICAgICAgICAgIGVsc2Ugc2VsZi5zdHJlYW0ud3JhcHBlZAogICAgICAgICkKCiAgICAgICAgIyBJZiB0aGUgc3RyZWFtIGlzIGEgdHR5IHdlIHNob3VsZCBjb2xvciBpdAogICAgICAgIGlmIGhhc2F0dHIocmVhbF9zdHJlYW0sICJpc2F0dHkiKSBhbmQgcmVhbF9zdHJlYW0uaXNhdHR5KCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICMgSWYgd2UgaGF2ZSBhbiBBU05JIHRlcm0gd2Ugc2hvdWxkIGNvbG9yIGl0CiAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIlRFUk0iKSA9PSAiQU5TSSI6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICMgSWYgYW55dGhpbmcgZWxzZSB3ZSBzaG91bGQgbm90IGNvbG9yIGl0CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGZvcm1hdChzZWxmLCByZWNvcmQpOgogICAgICAgIG1zZyA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlci5mb3JtYXQoc2VsZiwgcmVjb3JkKQoKICAgICAgICBpZiBzZWxmLnNob3VsZF9jb2xvcigpOgogICAgICAgICAgICBmb3IgbGV2ZWwsIGNvbG9yIGluIHNlbGYuQ09MT1JTOgogICAgICAgICAgICAgICAgaWYgcmVjb3JkLmxldmVsbm8gPj0gbGV2ZWw6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gY29sb3IobXNnKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHJldHVybiBtc2cKCgpjbGFzcyBCZXR0ZXJSb3RhdGluZ0ZpbGVIYW5kbGVyKGxvZ2dpbmcuaGFuZGxlcnMuUm90YXRpbmdGaWxlSGFuZGxlcik6CgogICAgZGVmIF9vcGVuKHNlbGYpOgogICAgICAgIGVuc3VyZV9kaXIob3MucGF0aC5kaXJuYW1lKHNlbGYuYmFzZUZpbGVuYW1lKSkKICAgICAgICByZXR1cm4gbG9nZ2luZy5oYW5kbGVycy5Sb3RhdGluZ0ZpbGVIYW5kbGVyLl9vcGVuKHNlbGYpCgoKY2xhc3MgTWF4TGV2ZWxGaWx0ZXIobG9nZ2luZy5GaWx0ZXIpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZXZlbCk6CiAgICAgICAgc2VsZi5sZXZlbCA9IGxldmVsCgogICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgogICAgICAgIHJldHVybiByZWNvcmQubGV2ZWxubyA8IHNlbGYubGV2ZWwKUEsDBBQAAAAAAAAAIQBIVNjqTxUAAE8VAAAyAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvb3V0ZGF0ZWQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGRhdGV0aW1lCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGxvY2tmaWxlCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nIGltcG9ydCB2ZXJzaW9uIGFzIHBhY2thZ2luZ192ZXJzaW9uCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IHRvdGFsX3NlY29uZHMsIFdJTkRPV1MKZnJvbSBwaXAubW9kZWxzIGltcG9ydCBQeVBJCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgVVNFUl9DQUNIRV9ESVIsIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudgpmcm9tIHBpcC51dGlscyBpbXBvcnQgZW5zdXJlX2RpciwgZ2V0X2luc3RhbGxlZF92ZXJzaW9uCmZyb20gcGlwLnV0aWxzLmZpbGVzeXN0ZW0gaW1wb3J0IGNoZWNrX3BhdGhfb3duZXIKCgpTRUxGQ0hFQ0tfREFURV9GTVQgPSAiJVktJW0tJWRUJUg6JU06JVNaIgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFZpcnR1YWxlbnZTZWxmQ2hlY2tTdGF0ZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuc3RhdGVmaWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgInBpcC1zZWxmY2hlY2suanNvbiIpCgogICAgICAgICMgTG9hZCB0aGUgZXhpc3Rpbmcgc3RhdGUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnN0YXRlZmlsZV9wYXRoKSBhcyBzdGF0ZWZpbGU6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0ganNvbi5sb2FkKHN0YXRlZmlsZSkKICAgICAgICBleGNlcHQgKElPRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICBzZWxmLnN0YXRlID0ge30KCiAgICBkZWYgc2F2ZShzZWxmLCBweXBpX3ZlcnNpb24sIGN1cnJlbnRfdGltZSk6CiAgICAgICAgIyBBdHRlbXB0IHRvIHdyaXRlIG91dCBvdXIgdmVyc2lvbiBjaGVjayBmaWxlCiAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RhdGVmaWxlX3BhdGgsICJ3IikgYXMgc3RhdGVmaWxlOgogICAgICAgICAgICBqc29uLmR1bXAoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImxhc3RfY2hlY2siOiBjdXJyZW50X3RpbWUuc3RyZnRpbWUoU0VMRkNIRUNLX0RBVEVfRk1UKSwKICAgICAgICAgICAgICAgICAgICAicHlwaV92ZXJzaW9uIjogcHlwaV92ZXJzaW9uLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHN0YXRlZmlsZSwKICAgICAgICAgICAgICAgIHNvcnRfa2V5cz1UcnVlLAogICAgICAgICAgICAgICAgc2VwYXJhdG9ycz0oIiwiLCAiOiIpCiAgICAgICAgICAgICkKCgpjbGFzcyBHbG9iYWxTZWxmQ2hlY2tTdGF0ZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuc3RhdGVmaWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oVVNFUl9DQUNIRV9ESVIsICJzZWxmY2hlY2suanNvbiIpCgogICAgICAgICMgTG9hZCB0aGUgZXhpc3Rpbmcgc3RhdGUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnN0YXRlZmlsZV9wYXRoKSBhcyBzdGF0ZWZpbGU6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0ganNvbi5sb2FkKHN0YXRlZmlsZSlbc3lzLnByZWZpeF0KICAgICAgICBleGNlcHQgKElPRXJyb3IsIFZhbHVlRXJyb3IsIEtleUVycm9yKToKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHt9CgogICAgZGVmIHNhdmUoc2VsZiwgcHlwaV92ZXJzaW9uLCBjdXJyZW50X3RpbWUpOgogICAgICAgICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugb3duIHRoZSBkaXJlY3RvcnkKICAgICAgICBpZiBub3QgY2hlY2tfcGF0aF9vd25lcihvcy5wYXRoLmRpcm5hbWUoc2VsZi5zdGF0ZWZpbGVfcGF0aCkpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBOb3cgdGhhdCB3ZSd2ZSBlbnN1cmVkIHRoZSBkaXJlY3RvcnkgaXMgb3duZWQgYnkgdGhpcyB1c2VyLCB3ZSdsbCBnbwogICAgICAgICMgYWhlYWQgYW5kIG1ha2Ugc3VyZSB0aGF0IGFsbCBvdXIgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQuCiAgICAgICAgZW5zdXJlX2Rpcihvcy5wYXRoLmRpcm5hbWUoc2VsZi5zdGF0ZWZpbGVfcGF0aCkpCgogICAgICAgICMgQXR0ZW1wdCB0byB3cml0ZSBvdXQgb3VyIHZlcnNpb24gY2hlY2sgZmlsZQogICAgICAgIHdpdGggbG9ja2ZpbGUuTG9ja0ZpbGUoc2VsZi5zdGF0ZWZpbGVfcGF0aCk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuc3RhdGVmaWxlX3BhdGgpOgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RhdGVmaWxlX3BhdGgpIGFzIHN0YXRlZmlsZToKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGpzb24ubG9hZChzdGF0ZWZpbGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzdGF0ZSA9IHt9CgogICAgICAgICAgICBzdGF0ZVtzeXMucHJlZml4XSA9IHsKICAgICAgICAgICAgICAgICJsYXN0X2NoZWNrIjogY3VycmVudF90aW1lLnN0cmZ0aW1lKFNFTEZDSEVDS19EQVRFX0ZNVCksCiAgICAgICAgICAgICAgICAicHlwaV92ZXJzaW9uIjogcHlwaV92ZXJzaW9uLAogICAgICAgICAgICB9CgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5zdGF0ZWZpbGVfcGF0aCwgInciKSBhcyBzdGF0ZWZpbGU6CiAgICAgICAgICAgICAgICBqc29uLmR1bXAoc3RhdGUsIHN0YXRlZmlsZSwgc29ydF9rZXlzPVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9ycz0oIiwiLCAiOiIpKQoKCmRlZiBsb2FkX3NlbGZjaGVja19zdGF0ZWZpbGUoKToKICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgIHJldHVybiBWaXJ0dWFsZW52U2VsZkNoZWNrU3RhdGUoKQogICAgZWxzZToKICAgICAgICByZXR1cm4gR2xvYmFsU2VsZkNoZWNrU3RhdGUoKQoKCmRlZiBwaXBfdmVyc2lvbl9jaGVjayhzZXNzaW9uKToKICAgICIiIkNoZWNrIGZvciBhbiB1cGRhdGUgZm9yIHBpcC4KCiAgICBMaW1pdCB0aGUgZnJlcXVlbmN5IG9mIGNoZWNrcyB0byBvbmNlIHBlciB3ZWVrLiBTdGF0ZSBpcyBzdG9yZWQgZWl0aGVyIGluCiAgICB0aGUgYWN0aXZlIHZpcnR1YWxlbnYgb3IgaW4gdGhlIHVzZXIncyBVU0VSX0NBQ0hFX0RJUiBrZXllZCBvZmYgdGhlIHByZWZpeAogICAgb2YgdGhlIHBpcCBzY3JpcHQgcGF0aC4KICAgICIiIgogICAgaW5zdGFsbGVkX3ZlcnNpb24gPSBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oInBpcCIpCiAgICBpZiBpbnN0YWxsZWRfdmVyc2lvbiBpcyBOb25lOgogICAgICAgIHJldHVybgoKICAgIHBpcF92ZXJzaW9uID0gcGFja2FnaW5nX3ZlcnNpb24ucGFyc2UoaW5zdGFsbGVkX3ZlcnNpb24pCiAgICBweXBpX3ZlcnNpb24gPSBOb25lCgogICAgdHJ5OgogICAgICAgIHN0YXRlID0gbG9hZF9zZWxmY2hlY2tfc3RhdGVmaWxlKCkKCiAgICAgICAgY3VycmVudF90aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUudXRjbm93KCkKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIHN0YXRlCiAgICAgICAgaWYgImxhc3RfY2hlY2siIGluIHN0YXRlLnN0YXRlIGFuZCAicHlwaV92ZXJzaW9uIiBpbiBzdGF0ZS5zdGF0ZToKICAgICAgICAgICAgbGFzdF9jaGVjayA9IGRhdGV0aW1lLmRhdGV0aW1lLnN0cnB0aW1lKAogICAgICAgICAgICAgICAgc3RhdGUuc3RhdGVbImxhc3RfY2hlY2siXSwKICAgICAgICAgICAgICAgIFNFTEZDSEVDS19EQVRFX0ZNVAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHRvdGFsX3NlY29uZHMoY3VycmVudF90aW1lIC0gbGFzdF9jaGVjaykgPCA3ICogMjQgKiA2MCAqIDYwOgogICAgICAgICAgICAgICAgcHlwaV92ZXJzaW9uID0gc3RhdGUuc3RhdGVbInB5cGlfdmVyc2lvbiJdCgogICAgICAgICMgUmVmcmVzaCB0aGUgdmVyc2lvbiBpZiB3ZSBuZWVkIHRvIG9yIGp1c3Qgc2VlIGlmIHdlIG5lZWQgdG8gd2FybgogICAgICAgIGlmIHB5cGlfdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICByZXNwID0gc2Vzc2lvbi5nZXQoCiAgICAgICAgICAgICAgICBQeVBJLnBpcF9qc29uX3VybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJBY2NlcHQiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCiAgICAgICAgICAgIHB5cGlfdmVyc2lvbiA9IFsKICAgICAgICAgICAgICAgIHYgZm9yIHYgaW4gc29ydGVkKAogICAgICAgICAgICAgICAgICAgIGxpc3QocmVzcC5qc29uKClbInJlbGVhc2VzIl0pLAogICAgICAgICAgICAgICAgICAgIGtleT1wYWNrYWdpbmdfdmVyc2lvbi5wYXJzZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIG5vdCBwYWNrYWdpbmdfdmVyc2lvbi5wYXJzZSh2KS5pc19wcmVyZWxlYXNlCiAgICAgICAgICAgIF1bLTFdCgogICAgICAgICAgICAjIHNhdmUgdGhhdCB3ZSd2ZSBwZXJmb3JtZWQgYSBjaGVjawogICAgICAgICAgICBzdGF0ZS5zYXZlKHB5cGlfdmVyc2lvbiwgY3VycmVudF90aW1lKQoKICAgICAgICByZW1vdGVfdmVyc2lvbiA9IHBhY2thZ2luZ192ZXJzaW9uLnBhcnNlKHB5cGlfdmVyc2lvbikKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgb3VyIHB5cGlfdmVyc2lvbiBpcyBvbGRlcgogICAgICAgIGlmIChwaXBfdmVyc2lvbiA8IHJlbW90ZV92ZXJzaW9uIGFuZAogICAgICAgICAgICAgICAgcGlwX3ZlcnNpb24uYmFzZV92ZXJzaW9uICE9IHJlbW90ZV92ZXJzaW9uLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICMgQWR2aXNlICJweXRob24gLW0gcGlwIiBvbiBXaW5kb3dzIHRvIGF2b2lkIGlzc3VlcwogICAgICAgICAgICAjIHdpdGggb3ZlcndyaXRpbmcgcGlwLmV4ZS4KICAgICAgICAgICAgaWYgV0lORE9XUzoKICAgICAgICAgICAgICAgIHBpcF9jbWQgPSAicHl0aG9uIC1tIHBpcCIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBpcF9jbWQgPSAicGlwIgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJZb3UgYXJlIHVzaW5nIHBpcCB2ZXJzaW9uICVzLCBob3dldmVyIHZlcnNpb24gJXMgaXMgIgogICAgICAgICAgICAgICAgImF2YWlsYWJsZS5cbllvdSBzaG91bGQgY29uc2lkZXIgdXBncmFkaW5nIHZpYSB0aGUgIgogICAgICAgICAgICAgICAgIiclcyBpbnN0YWxsIC0tdXBncmFkZSBwaXAnIGNvbW1hbmQuIiwKICAgICAgICAgICAgICAgIHBpcF92ZXJzaW9uLCBweXBpX3ZlcnNpb24sIHBpcF9jbWQKICAgICAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAiVGhlcmUgd2FzIGFuIGVycm9yIGNoZWNraW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBwaXAiLAogICAgICAgICAgICBleGNfaW5mbz1UcnVlLAogICAgICAgICkKUEsDBBQAAAAAAAAAIQAN5pK4IAgAACAIAAAzAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvcGFja2FnaW5nLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gZW1haWwucGFyc2VyIGltcG9ydCBGZWVkUGFyc2VyCgppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3lzCgpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZyBpbXBvcnQgc3BlY2lmaWVycwpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZyBpbXBvcnQgdmVyc2lvbgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCgpmcm9tIHBpcCBpbXBvcnQgZXhjZXB0aW9ucwoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKZGVmIGNoZWNrX3JlcXVpcmVzX3B5dGhvbihyZXF1aXJlc19weXRob24pOgogICAgIiIiCiAgICBDaGVjayBpZiB0aGUgcHl0aG9uIHZlcnNpb24gaW4gdXNlIG1hdGNoIHRoZSBgcmVxdWlyZXNfcHl0aG9uYCBzcGVjaWZpZXIuCgogICAgUmV0dXJucyBgVHJ1ZWAgaWYgdGhlIHZlcnNpb24gb2YgcHl0aG9uIGluIHVzZSBtYXRjaGVzIHRoZSByZXF1aXJlbWVudC4KICAgIFJldHVybnMgYEZhbHNlYCBpZiB0aGUgdmVyc2lvbiBvZiBweXRob24gaW4gdXNlIGRvZXMgbm90IG1hdGNoZXMgdGhlCiAgICByZXF1aXJlbWVudC4KCiAgICBSYWlzZXMgYW4gSW52YWxpZFNwZWNpZmllciBpZiBgcmVxdWlyZXNfcHl0aG9uYCBoYXZlIGFuIGludmFsaWQgZm9ybWF0LgogICAgIiIiCiAgICBpZiByZXF1aXJlc19weXRob24gaXMgTm9uZToKICAgICAgICAjIFRoZSBwYWNrYWdlIHByb3ZpZGVzIG5vIGluZm9ybWF0aW9uCiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJlcXVpcmVzX3B5dGhvbl9zcGVjaWZpZXIgPSBzcGVjaWZpZXJzLlNwZWNpZmllclNldChyZXF1aXJlc19weXRob24pCgogICAgIyBXZSBvbmx5IHVzZSBtYWpvci5taW5vci5taWNybwogICAgcHl0aG9uX3ZlcnNpb24gPSB2ZXJzaW9uLnBhcnNlKCcuJy5qb2luKG1hcChzdHIsIHN5cy52ZXJzaW9uX2luZm9bOjNdKSkpCiAgICByZXR1cm4gcHl0aG9uX3ZlcnNpb24gaW4gcmVxdWlyZXNfcHl0aG9uX3NwZWNpZmllcgoKCmRlZiBnZXRfbWV0YWRhdGEoZGlzdCk6CiAgICBpZiAoaXNpbnN0YW5jZShkaXN0LCBwa2dfcmVzb3VyY2VzLkRpc3RJbmZvRGlzdHJpYnV0aW9uKSBhbmQKICAgICAgICAgICAgZGlzdC5oYXNfbWV0YWRhdGEoJ01FVEFEQVRBJykpOgogICAgICAgIHJldHVybiBkaXN0LmdldF9tZXRhZGF0YSgnTUVUQURBVEEnKQogICAgZWxpZiBkaXN0Lmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICByZXR1cm4gZGlzdC5nZXRfbWV0YWRhdGEoJ1BLRy1JTkZPJykKCgpkZWYgY2hlY2tfZGlzdF9yZXF1aXJlc19weXRob24oZGlzdCk6CiAgICBtZXRhZGF0YSA9IGdldF9tZXRhZGF0YShkaXN0KQogICAgZmVlZF9wYXJzZXIgPSBGZWVkUGFyc2VyKCkKICAgIGZlZWRfcGFyc2VyLmZlZWQobWV0YWRhdGEpCiAgICBwa2dfaW5mb19kaWN0ID0gZmVlZF9wYXJzZXIuY2xvc2UoKQogICAgcmVxdWlyZXNfcHl0aG9uID0gcGtnX2luZm9fZGljdC5nZXQoJ1JlcXVpcmVzLVB5dGhvbicpCiAgICB0cnk6CiAgICAgICAgaWYgbm90IGNoZWNrX3JlcXVpcmVzX3B5dGhvbihyZXF1aXJlc19weXRob24pOgogICAgICAgICAgICByYWlzZSBleGNlcHRpb25zLlVuc3VwcG9ydGVkUHl0aG9uVmVyc2lvbigKICAgICAgICAgICAgICAgICIlcyByZXF1aXJlcyBQeXRob24gJyVzJyBidXQgdGhlIHJ1bm5pbmcgUHl0aG9uIGlzICVzIiAlICgKICAgICAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlc19weXRob24sCiAgICAgICAgICAgICAgICAgICAgJy4nLmpvaW4obWFwKHN0ciwgc3lzLnZlcnNpb25faW5mb1s6M10pKSwpCiAgICAgICAgICAgICkKICAgIGV4Y2VwdCBzcGVjaWZpZXJzLkludmFsaWRTcGVjaWZpZXIgYXMgZToKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgIlBhY2thZ2UgJXMgaGFzIGFuIGludmFsaWQgUmVxdWlyZXMtUHl0aG9uIGVudHJ5ICVzIC0gJXMiICUgKAogICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUsIHJlcXVpcmVzX3B5dGhvbiwgZSkpCiAgICAgICAgcmV0dXJuClBLAwQUAAAAAAAAACEAFqLyShYBAAAWAQAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL3NldHVwdG9vbHNfYnVpbGQucHkjIFNoaW0gdG8gd3JhcCBzZXR1cC5weSBpbnZvY2F0aW9uIHdpdGggc2V0dXB0b29scwpTRVRVUFRPT0xTX1NISU0gPSAoCiAgICAiaW1wb3J0IHNldHVwdG9vbHMsIHRva2VuaXplO19fZmlsZV9fPSVyOyIKICAgICJmPWdldGF0dHIodG9rZW5pemUsICdvcGVuJywgb3BlbikoX19maWxlX18pOyIKICAgICJjb2RlPWYucmVhZCgpLnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKTsiCiAgICAiZi5jbG9zZSgpOyIKICAgICJleGVjKGNvbXBpbGUoY29kZSwgX19maWxlX18sICdleGVjJykpIgopClBLAwQUAAAAAAAAACEA5eKQlU0tAABNLQAALAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL3VpLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgoKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgc3lzCmZyb20gc2lnbmFsIGltcG9ydCBzaWduYWwsIFNJR0lOVCwgZGVmYXVsdF9pbnRfaGFuZGxlcgppbXBvcnQgdGltZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgbG9nZ2luZwoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBXSU5ET1dTCmZyb20gcGlwLnV0aWxzIGltcG9ydCBmb3JtYXRfc2l6ZQpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBnZXRfaW5kZW50YXRpb24KZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgc2l4CmZyb20gcGlwLl92ZW5kb3IucHJvZ3Jlc3MuYmFyIGltcG9ydCBCYXIsIEluY3JlbWVudGFsQmFyCmZyb20gcGlwLl92ZW5kb3IucHJvZ3Jlc3MuaGVscGVycyBpbXBvcnQgKFdyaXRlbG5NaXhpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElERV9DVVJTT1IsIFNIT1dfQ1VSU09SKQpmcm9tIHBpcC5fdmVuZG9yLnByb2dyZXNzLnNwaW5uZXIgaW1wb3J0IFNwaW5uZXIKCnRyeToKICAgIGZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNvbG9yYW1hCiMgTG90cyBvZiBkaWZmZXJlbnQgZXJyb3JzIGNhbiBjb21lIGZyb20gdGhpcywgaW5jbHVkaW5nIFN5c3RlbUVycm9yIGFuZAojIEltcG9ydEVycm9yLgpleGNlcHQgRXhjZXB0aW9uOgogICAgY29sb3JhbWEgPSBOb25lCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpkZWYgX3NlbGVjdF9wcm9ncmVzc19jbGFzcyhwcmVmZXJyZWQsIGZhbGxiYWNrKToKICAgIGVuY29kaW5nID0gZ2V0YXR0cihwcmVmZXJyZWQuZmlsZSwgImVuY29kaW5nIiwgTm9uZSkKCiAgICAjIElmIHdlIGRvbid0IGtub3cgd2hhdCBlbmNvZGluZyB0aGlzIGZpbGUgaXMgaW4sIHRoZW4gd2UnbGwganVzdCBhc3N1bWUKICAgICMgdGhhdCBpdCBkb2Vzbid0IHN1cHBvcnQgdW5pY29kZSBhbmQgdXNlIHRoZSBBU0NJSSBiYXIuCiAgICBpZiBub3QgZW5jb2Rpbmc6CiAgICAgICAgcmV0dXJuIGZhbGxiYWNrCgogICAgIyBDb2xsZWN0IGFsbCBvZiB0aGUgcG9zc2libGUgY2hhcmFjdGVycyB3ZSB3YW50IHRvIHVzZSB3aXRoIHRoZSBwcmVmZXJyZWQKICAgICMgYmFyLgogICAgY2hhcmFjdGVycyA9IFsKICAgICAgICBnZXRhdHRyKHByZWZlcnJlZCwgImVtcHR5X2ZpbGwiLCBzaXgudGV4dF90eXBlKCkpLAogICAgICAgIGdldGF0dHIocHJlZmVycmVkLCAiZmlsbCIsIHNpeC50ZXh0X3R5cGUoKSksCiAgICBdCiAgICBjaGFyYWN0ZXJzICs9IGxpc3QoZ2V0YXR0cihwcmVmZXJyZWQsICJwaGFzZXMiLCBbXSkpCgogICAgIyBUcnkgdG8gZGVjb2RlIHRoZSBjaGFyYWN0ZXJzIHdlJ3JlIHVzaW5nIGZvciB0aGUgYmFyIHVzaW5nIHRoZSBlbmNvZGluZwogICAgIyBvZiB0aGUgZ2l2ZW4gZmlsZSwgaWYgdGhpcyB3b3JrcyB0aGVuIHdlJ2xsIGFzc3VtZSB0aGF0IHdlIGNhbiB1c2UgdGhlCiAgICAjIGZhbmNpZXIgYmFyIGFuZCBpZiBub3Qgd2UnbGwgZmFsbCBiYWNrIHRvIHRoZSBwbGFpbnRleHQgYmFyLgogICAgdHJ5OgogICAgICAgIHNpeC50ZXh0X3R5cGUoKS5qb2luKGNoYXJhY3RlcnMpLmVuY29kZShlbmNvZGluZykKICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgcmV0dXJuIGZhbGxiYWNrCiAgICBlbHNlOgogICAgICAgIHJldHVybiBwcmVmZXJyZWQKCgpfQmFzZUJhciA9IF9zZWxlY3RfcHJvZ3Jlc3NfY2xhc3MoSW5jcmVtZW50YWxCYXIsIEJhcikKCgpjbGFzcyBJbnRlcnJ1cHRpYmxlTWl4aW4ob2JqZWN0KToKICAgICIiIgogICAgSGVscGVyIHRvIGVuc3VyZSB0aGF0IHNlbGYuZmluaXNoKCkgZ2V0cyBjYWxsZWQgb24ga2V5Ym9hcmQgaW50ZXJydXB0LgoKICAgIFRoaXMgYWxsb3dzIGRvd25sb2FkcyB0byBiZSBpbnRlcnJ1cHRlZCB3aXRob3V0IGxlYXZpbmcgdGVtcG9yYXJ5IHN0YXRlCiAgICAobGlrZSBoaWRkZW4gY3Vyc29ycykgYmVoaW5kLgoKICAgIFRoaXMgY2xhc3MgaXMgc2ltaWxhciB0byB0aGUgcHJvZ3Jlc3MgbGlicmFyeSdzIGV4aXN0aW5nIFNpZ0ludE1peGluCiAgICBoZWxwZXIsIGJ1dCBhcyBvZiB2ZXJzaW9uIDEuMiwgdGhhdCBoZWxwZXIgaGFzIHRoZSBmb2xsb3dpbmcgcHJvYmxlbXM6CgogICAgMS4gSXQgY2FsbHMgc3lzLmV4aXQoKS4KICAgIDIuIEl0IGRpc2NhcmRzIHRoZSBleGlzdGluZyBTSUdJTlQgaGFuZGxlciBjb21wbGV0ZWx5LgogICAgMy4gSXQgbGVhdmVzIGl0cyBvd24gaGFuZGxlciBpbiBwbGFjZSBldmVuIGFmdGVyIGFuIHVuaW50ZXJydXB0ZWQgZmluaXNoLAogICAgICAgd2hpY2ggd2lsbCBoYXZlIHVuZXhwZWN0ZWQgZGVsYXllZCBlZmZlY3RzIGlmIHRoZSB1c2VyIHRyaWdnZXJzIGFuCiAgICAgICB1bnJlbGF0ZWQga2V5Ym9hcmQgaW50ZXJydXB0IHNvbWUgdGltZSBhZnRlciBhIHByb2dyZXNzLWRpc3BsYXlpbmcKICAgICAgIGRvd25sb2FkIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgZm9yIGV4YW1wbGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBTYXZlIHRoZSBvcmlnaW5hbCBTSUdJTlQgaGFuZGxlciBmb3IgbGF0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoSW50ZXJydXB0aWJsZU1peGluLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgICAgIHNlbGYub3JpZ2luYWxfaGFuZGxlciA9IHNpZ25hbChTSUdJTlQsIHNlbGYuaGFuZGxlX3NpZ2ludCkKCiAgICAgICAgIyBJZiBzaWduYWwoKSByZXR1cm5zIE5vbmUsIHRoZSBwcmV2aW91cyBoYW5kbGVyIHdhcyBub3QgaW5zdGFsbGVkIGZyb20KICAgICAgICAjIFB5dGhvbiwgYW5kIHdlIGNhbm5vdCByZXN0b3JlIGl0LiBUaGlzIHByb2JhYmx5IHNob3VsZCBub3QgaGFwcGVuLAogICAgICAgICMgYnV0IGlmIGl0IGRvZXMsIHdlIG11c3QgcmVzdG9yZSBzb21ldGhpbmcgc2Vuc2libGUgaW5zdGVhZCwgYXQgbGVhc3QuCiAgICAgICAgIyBUaGUgbGVhc3QgYmFkIG9wdGlvbiBzaG91bGQgYmUgUHl0aG9uJ3MgZGVmYXVsdCBTSUdJTlQgaGFuZGxlciwgd2hpY2gKICAgICAgICAjIGp1c3QgcmFpc2VzIEtleWJvYXJkSW50ZXJydXB0LgogICAgICAgIGlmIHNlbGYub3JpZ2luYWxfaGFuZGxlciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLm9yaWdpbmFsX2hhbmRsZXIgPSBkZWZhdWx0X2ludF9oYW5kbGVyCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXN0b3JlIHRoZSBvcmlnaW5hbCBTSUdJTlQgaGFuZGxlciBhZnRlciBmaW5pc2hpbmcuCgogICAgICAgIFRoaXMgc2hvdWxkIGhhcHBlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb2dyZXNzIGRpc3BsYXkgZmluaXNoZXMKICAgICAgICBub3JtYWxseSwgb3IgZ2V0cyBpbnRlcnJ1cHRlZC4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihJbnRlcnJ1cHRpYmxlTWl4aW4sIHNlbGYpLmZpbmlzaCgpCiAgICAgICAgc2lnbmFsKFNJR0lOVCwgc2VsZi5vcmlnaW5hbF9oYW5kbGVyKQoKICAgIGRlZiBoYW5kbGVfc2lnaW50KHNlbGYsIHNpZ251bSwgZnJhbWUpOgogICAgICAgICIiIgogICAgICAgIENhbGwgc2VsZi5maW5pc2goKSBiZWZvcmUgZGVsZWdhdGluZyB0byB0aGUgb3JpZ2luYWwgU0lHSU5UIGhhbmRsZXIuCgogICAgICAgIFRoaXMgaGFuZGxlciBzaG91bGQgb25seSBiZSBpbiBwbGFjZSB3aGlsZSB0aGUgcHJvZ3Jlc3MgZGlzcGxheSBpcwogICAgICAgIGFjdGl2ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmZpbmlzaCgpCiAgICAgICAgc2VsZi5vcmlnaW5hbF9oYW5kbGVyKHNpZ251bSwgZnJhbWUpCgoKY2xhc3MgRG93bmxvYWRQcm9ncmVzc01peGluKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoRG93bmxvYWRQcm9ncmVzc01peGluLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5tZXNzYWdlID0gKCIgIiAqIChnZXRfaW5kZW50YXRpb24oKSArIDIpKSArIHNlbGYubWVzc2FnZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRvd25sb2FkZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIGZvcm1hdF9zaXplKHNlbGYuaW5kZXgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZG93bmxvYWRfc3BlZWQoc2VsZik6CiAgICAgICAgIyBBdm9pZCB6ZXJvIGRpdmlzaW9uIGVycm9ycy4uLgogICAgICAgIGlmIHNlbGYuYXZnID09IDAuMDoKICAgICAgICAgICAgcmV0dXJuICIuLi4iCiAgICAgICAgcmV0dXJuIGZvcm1hdF9zaXplKDEgLyBzZWxmLmF2ZykgKyAiL3MiCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJldHR5X2V0YShzZWxmKToKICAgICAgICBpZiBzZWxmLmV0YToKICAgICAgICAgICAgcmV0dXJuICJldGEgJXMiICUgc2VsZi5ldGFfdGQKICAgICAgICByZXR1cm4gIiIKCiAgICBkZWYgaXRlcihzZWxmLCBpdCwgbj0xKToKICAgICAgICBmb3IgeCBpbiBpdDoKICAgICAgICAgICAgeWllbGQgeAogICAgICAgICAgICBzZWxmLm5leHQobikKICAgICAgICBzZWxmLmZpbmlzaCgpCgoKY2xhc3MgV2luZG93c01peGluKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBUaGUgV2luZG93cyB0ZXJtaW5hbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBoaWRlL3Nob3cgY3Vyc29yIEFOU0kgY29kZXMKICAgICAgICAjIGV2ZW4gd2l0aCBjb2xvcmFtYS4gU28gd2UnbGwgZW5zdXJlIHRoYXQgaGlkZV9jdXJzb3IgaXMgRmFsc2Ugb24KICAgICAgICAjIFdpbmRvd3MuCiAgICAgICAgIyBUaGlzIGNhbGwgbmVkcyB0byBnbyBiZWZvcmUgdGhlIHN1cGVyKCkgY2FsbCwgc28gdGhhdCBoaWRlX2N1cnNvcgogICAgICAgICMgaXMgc2V0IGluIHRpbWUuIFRoZSBiYXNlIHByb2dyZXNzIGJhciBjbGFzcyB3cml0ZXMgdGhlICJoaWRlIGN1cnNvciIKICAgICAgICAjIGNvZGUgdG8gdGhlIHRlcm1pbmFsIGluIGl0cyBpbml0LCBzbyBpZiB3ZSBkb24ndCBzZXQgdGhpcyBzb29uCiAgICAgICAgIyBlbm91Z2gsIHdlIGdldCBhICJoaWRlIiB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgInNob3ciLi4uCiAgICAgICAgaWYgV0lORE9XUyBhbmQgc2VsZi5oaWRlX2N1cnNvcjoKICAgICAgICAgICAgc2VsZi5oaWRlX2N1cnNvciA9IEZhbHNlCgogICAgICAgIHN1cGVyKFdpbmRvd3NNaXhpbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgICAgICAjIENoZWNrIGlmIHdlIGFyZSBydW5uaW5nIG9uIFdpbmRvd3MgYW5kIHdlIGhhdmUgdGhlIGNvbG9yYW1hIG1vZHVsZSwKICAgICAgICAjIGlmIHdlIGRvIHRoZW4gd3JhcCBvdXIgZmlsZSB3aXRoIGl0LgogICAgICAgIGlmIFdJTkRPV1MgYW5kIGNvbG9yYW1hOgogICAgICAgICAgICBzZWxmLmZpbGUgPSBjb2xvcmFtYS5BbnNpVG9XaW4zMihzZWxmLmZpbGUpCiAgICAgICAgICAgICMgVGhlIHByb2dyZXNzIGNvZGUgZXhwZWN0cyB0byBiZSBhYmxlIHRvIGNhbGwgc2VsZi5maWxlLmlzYXR0eSgpCiAgICAgICAgICAgICMgYnV0IHRoZSBjb2xvcmFtYS5BbnNpVG9XaW4zMigpIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhhdCwgc28gd2UnbGwKICAgICAgICAgICAgIyBhZGQgaXQuCiAgICAgICAgICAgIHNlbGYuZmlsZS5pc2F0dHkgPSBsYW1iZGE6IHNlbGYuZmlsZS53cmFwcGVkLmlzYXR0eSgpCiAgICAgICAgICAgICMgVGhlIHByb2dyZXNzIGNvZGUgZXhwZWN0cyB0byBiZSBhYmxlIHRvIGNhbGwgc2VsZi5maWxlLmZsdXNoKCkKICAgICAgICAgICAgIyBidXQgdGhlIGNvbG9yYW1hLkFuc2lUb1dpbjMyKCkgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGF0LCBzbyB3ZSdsbAogICAgICAgICAgICAjIGFkZCBpdC4KICAgICAgICAgICAgc2VsZi5maWxlLmZsdXNoID0gbGFtYmRhOiBzZWxmLmZpbGUud3JhcHBlZC5mbHVzaCgpCgoKY2xhc3MgRG93bmxvYWRQcm9ncmVzc0JhcihXaW5kb3dzTWl4aW4sIEludGVycnVwdGlibGVNaXhpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZFByb2dyZXNzTWl4aW4sIF9CYXNlQmFyKToKCiAgICBmaWxlID0gc3lzLnN0ZG91dAogICAgbWVzc2FnZSA9ICIlKHBlcmNlbnQpZCUlIgogICAgc3VmZml4ID0gIiUoZG93bmxvYWRlZClzICUoZG93bmxvYWRfc3BlZWQpcyAlKHByZXR0eV9ldGEpcyIKCgpjbGFzcyBEb3dubG9hZFByb2dyZXNzU3Bpbm5lcihXaW5kb3dzTWl4aW4sIEludGVycnVwdGlibGVNaXhpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG93bmxvYWRQcm9ncmVzc01peGluLCBXcml0ZWxuTWl4aW4sIFNwaW5uZXIpOgoKICAgIGZpbGUgPSBzeXMuc3Rkb3V0CiAgICBzdWZmaXggPSAiJShkb3dubG9hZGVkKXMgJShkb3dubG9hZF9zcGVlZClzIgoKICAgIGRlZiBuZXh0X3BoYXNlKHNlbGYpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICJfcGhhc2VyIik6CiAgICAgICAgICAgIHNlbGYuX3BoYXNlciA9IGl0ZXJ0b29scy5jeWNsZShzZWxmLnBoYXNlcykKICAgICAgICByZXR1cm4gbmV4dChzZWxmLl9waGFzZXIpCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBtZXNzYWdlID0gc2VsZi5tZXNzYWdlICUgc2VsZgogICAgICAgIHBoYXNlID0gc2VsZi5uZXh0X3BoYXNlKCkKICAgICAgICBzdWZmaXggPSBzZWxmLnN1ZmZpeCAlIHNlbGYKICAgICAgICBsaW5lID0gJycuam9pbihbCiAgICAgICAgICAgIG1lc3NhZ2UsCiAgICAgICAgICAgICIgIiBpZiBtZXNzYWdlIGVsc2UgIiIsCiAgICAgICAgICAgIHBoYXNlLAogICAgICAgICAgICAiICIgaWYgc3VmZml4IGVsc2UgIiIsCiAgICAgICAgICAgIHN1ZmZpeCwKICAgICAgICBdKQoKICAgICAgICBzZWxmLndyaXRlbG4obGluZSkKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR2VuZXJpYyAic29tZXRoaW5nIGlzIGhhcHBlbmluZyIgc3Bpbm5lcnMKIwojIFdlIGRvbid0IGV2ZW4gdHJ5IHVzaW5nIHByb2dyZXNzLnNwaW5uZXIuU3Bpbm5lciBoZXJlIGJlY2F1c2UgaXQncyBhY3R1YWxseQojIHNpbXBsZXIgdG8gcmVpbXBsZW1lbnQgZnJvbSBzY3JhdGNoIHRoYW4gdG8gY29lcmNlIHRoZWlyIGNvZGUgaW50byBkb2luZwojIHdoYXQgd2UgbmVlZC4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIGhpZGRlbl9jdXJzb3IoZmlsZSk6CiAgICAjIFRoZSBXaW5kb3dzIHRlcm1pbmFsIGRvZXMgbm90IHN1cHBvcnQgdGhlIGhpZGUvc2hvdyBjdXJzb3IgQU5TSSBjb2RlcywKICAgICMgZXZlbiB2aWEgY29sb3JhbWEuIFNvIGRvbid0IGV2ZW4gdHJ5LgogICAgaWYgV0lORE9XUzoKICAgICAgICB5aWVsZAogICAgIyBXZSBkb24ndCB3YW50IHRvIGNsdXR0ZXIgdGhlIG91dHB1dCB3aXRoIGNvbnRyb2wgY2hhcmFjdGVycyBpZiB3ZSdyZQogICAgIyB3cml0aW5nIHRvIGEgZmlsZSwgb3IgaWYgdGhlIHVzZXIgaXMgcnVubmluZyB3aXRoIC0tcXVpZXQuCiAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzM0MTgKICAgIGVsaWYgbm90IGZpbGUuaXNhdHR5KCkgb3IgbG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPiBsb2dnaW5nLklORk86CiAgICAgICAgeWllbGQKICAgIGVsc2U6CiAgICAgICAgZmlsZS53cml0ZShISURFX0NVUlNPUikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZS53cml0ZShTSE9XX0NVUlNPUikKCgpjbGFzcyBSYXRlTGltaXRlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcyk6CiAgICAgICAgc2VsZi5fbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzID0gbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzCiAgICAgICAgc2VsZi5fbGFzdF91cGRhdGUgPSAwCgogICAgZGVmIHJlYWR5KHNlbGYpOgogICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgZGVsdGEgPSBub3cgLSBzZWxmLl9sYXN0X3VwZGF0ZQogICAgICAgIHJldHVybiBkZWx0YSA+PSBzZWxmLl9taW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5fbGFzdF91cGRhdGUgPSB0aW1lLnRpbWUoKQoKCmNsYXNzIEludGVyYWN0aXZlU3Bpbm5lcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIGZpbGU9Tm9uZSwgc3Bpbl9jaGFycz0iLVxcfC8iLAogICAgICAgICAgICAgICAgICMgRW1waXJpY2FsbHksIDggdXBkYXRlcy9zZWNvbmQgbG9va3MgbmljZQogICAgICAgICAgICAgICAgIG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcz0wLjEyNSk6CiAgICAgICAgc2VsZi5fbWVzc2FnZSA9IG1lc3NhZ2UKICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CiAgICAgICAgICAgIGZpbGUgPSBzeXMuc3Rkb3V0CiAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKICAgICAgICBzZWxmLl9yYXRlX2xpbWl0ZXIgPSBSYXRlTGltaXRlcihtaW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMpCiAgICAgICAgc2VsZi5fZmluaXNoZWQgPSBGYWxzZQoKICAgICAgICBzZWxmLl9zcGluX2N5Y2xlID0gaXRlcnRvb2xzLmN5Y2xlKHNwaW5fY2hhcnMpCgogICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoIiAiICogZ2V0X2luZGVudGF0aW9uKCkgKyBzZWxmLl9tZXNzYWdlICsgIiAuLi4gIikKICAgICAgICBzZWxmLl93aWR0aCA9IDAKCiAgICBkZWYgX3dyaXRlKHNlbGYsIHN0YXR1cyk6CiAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLl9maW5pc2hlZAogICAgICAgICMgRXJhc2Ugd2hhdCB3ZSB3cm90ZSBiZWZvcmUgYnkgYmFja3NwYWNpbmcgdG8gdGhlIGJlZ2lubmluZywgd3JpdGluZwogICAgICAgICMgc3BhY2VzIHRvIG92ZXJ3cml0ZSB0aGUgb2xkIHRleHQsIGFuZCB0aGVuIGJhY2tzcGFjaW5nIGFnYWluCiAgICAgICAgYmFja3VwID0gIlxiIiAqIHNlbGYuX3dpZHRoCiAgICAgICAgc2VsZi5fZmlsZS53cml0ZShiYWNrdXAgKyAiICIgKiBzZWxmLl93aWR0aCArIGJhY2t1cCkKICAgICAgICAjIE5vdyB3ZSBoYXZlIGEgYmxhbmsgc2xhdGUgdG8gYWRkIG91ciBzdGF0dXMKICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0YXR1cykKICAgICAgICBzZWxmLl93aWR0aCA9IGxlbihzdGF0dXMpCiAgICAgICAgc2VsZi5fZmlsZS5mbHVzaCgpCiAgICAgICAgc2VsZi5fcmF0ZV9saW1pdGVyLnJlc2V0KCkKCiAgICBkZWYgc3BpbihzZWxmKToKICAgICAgICBpZiBzZWxmLl9maW5pc2hlZDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IHNlbGYuX3JhdGVfbGltaXRlci5yZWFkeSgpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl93cml0ZShuZXh0KHNlbGYuX3NwaW5fY3ljbGUpKQoKICAgIGRlZiBmaW5pc2goc2VsZiwgZmluYWxfc3RhdHVzKToKICAgICAgICBpZiBzZWxmLl9maW5pc2hlZDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5fd3JpdGUoZmluYWxfc3RhdHVzKQogICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoIlxuIikKICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKICAgICAgICBzZWxmLl9maW5pc2hlZCA9IFRydWUKCgojIFVzZWQgZm9yIGR1bWIgdGVybWluYWxzLCBub24taW50ZXJhY3RpdmUgaW5zdGFsbHMgKG5vIHR0eSksIGV0Yy4KIyBXZSBzdGlsbCBwcmludCB1cGRhdGVzIG9jY2FzaW9uYWxseSAob25jZSBldmVyeSA2MCBzZWNvbmRzIGJ5IGRlZmF1bHQpIHRvCiMgYWN0IGFzIGEga2VlcC1hbGl2ZSBmb3Igc3lzdGVtcyBsaWtlIFRyYXZpcy1DSSB0aGF0IHRha2UgbGFjay1vZi1vdXRwdXQgYXMKIyBhbiBpbmRpY2F0aW9uIHRoYXQgYSB0YXNrIGhhcyBmcm96ZW4uCmNsYXNzIE5vbkludGVyYWN0aXZlU3Bpbm5lcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcz02MCk6CiAgICAgICAgc2VsZi5fbWVzc2FnZSA9IG1lc3NhZ2UKICAgICAgICBzZWxmLl9maW5pc2hlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5fcmF0ZV9saW1pdGVyID0gUmF0ZUxpbWl0ZXIobWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzKQogICAgICAgIHNlbGYuX3VwZGF0ZSgic3RhcnRlZCIpCgogICAgZGVmIF91cGRhdGUoc2VsZiwgc3RhdHVzKToKICAgICAgICBhc3NlcnQgbm90IHNlbGYuX2ZpbmlzaGVkCiAgICAgICAgc2VsZi5fcmF0ZV9saW1pdGVyLnJlc2V0KCkKICAgICAgICBsb2dnZXIuaW5mbygiJXM6ICVzIiwgc2VsZi5fbWVzc2FnZSwgc3RhdHVzKQoKICAgIGRlZiBzcGluKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2ZpbmlzaGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3Qgc2VsZi5fcmF0ZV9saW1pdGVyLnJlYWR5KCk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX3VwZGF0ZSgic3RpbGwgcnVubmluZy4uLiIpCgogICAgZGVmIGZpbmlzaChzZWxmLCBmaW5hbF9zdGF0dXMpOgogICAgICAgIGlmIHNlbGYuX2ZpbmlzaGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl91cGRhdGUoImZpbmlzaGVkIHdpdGggc3RhdHVzICclcyciICUgKGZpbmFsX3N0YXR1cywpKQogICAgICAgIHNlbGYuX2ZpbmlzaGVkID0gVHJ1ZQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBvcGVuX3NwaW5uZXIobWVzc2FnZSk6CiAgICAjIEludGVyYWN0aXZlIHNwaW5uZXIgZ29lcyBkaXJlY3RseSB0byBzeXMuc3Rkb3V0IHJhdGhlciB0aGFuIGJlaW5nIHJvdXRlZAogICAgIyB0aHJvdWdoIHRoZSBsb2dnaW5nIHN5c3RlbSwgYnV0IGl0IGFjdHMgbGlrZSBpdCBoYXMgbGV2ZWwgSU5GTywKICAgICMgaS5lLiBpdCdzIG9ubHkgZGlzcGxheWVkIGlmIHdlJ3JlIGF0IGxldmVsIElORk8gb3IgYmV0dGVyLgogICAgIyBOb24taW50ZXJhY3RpdmUgc3Bpbm5lciBnb2VzIHRocm91Z2ggdGhlIGxvZ2dpbmcgc3lzdGVtLCBzbyBpdCBpcyBhbHdheXMKICAgICMgaW4gc3luYyB3aXRoIGxvZ2dpbmcgY29uZmlndXJhdGlvbi4KICAgIGlmIHN5cy5zdGRvdXQuaXNhdHR5KCkgYW5kIGxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpIDw9IGxvZ2dpbmcuSU5GTzoKICAgICAgICBzcGlubmVyID0gSW50ZXJhY3RpdmVTcGlubmVyKG1lc3NhZ2UpCiAgICBlbHNlOgogICAgICAgIHNwaW5uZXIgPSBOb25JbnRlcmFjdGl2ZVNwaW5uZXIobWVzc2FnZSkKICAgIHRyeToKICAgICAgICB3aXRoIGhpZGRlbl9jdXJzb3Ioc3lzLnN0ZG91dCk6CiAgICAgICAgICAgIHlpZWxkIHNwaW5uZXIKICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICBzcGlubmVyLmZpbmlzaCgiY2FuY2VsZWQiKQogICAgICAgIHJhaXNlCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHNwaW5uZXIuZmluaXNoKCJlcnJvciIpCiAgICAgICAgcmFpc2UKICAgIGVsc2U6CiAgICAgICAgc3Bpbm5lci5maW5pc2goImRvbmUiKQpQSwMEFAAAAAAAAAAhAMhWxUtWMAAAVjAAADAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3MvX19pbml0X18ucHkiIiJIYW5kbGVzIGFsbCBWQ1MgKHZlcnNpb24gY29udHJvbCkgc3VwcG9ydCIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGVycm5vCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBCYWRDb21tYW5kCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoZGlzcGxheV9wYXRoLCBiYWNrdXBfZGlyLCBjYWxsX3N1YnByb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgcm10cmVlLCBhc2tfcGF0aF9leGlzdHMpCgoKX19hbGxfXyA9IFsndmNzJywgJ2dldF9zcmNfcmVxdWlyZW1lbnQnXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFZjc1N1cHBvcnQob2JqZWN0KToKICAgIF9yZWdpc3RyeSA9IHt9CiAgICBzY2hlbWVzID0gWydzc2gnLCAnZ2l0JywgJ2hnJywgJ2J6cicsICdzZnRwJywgJ3N2biddCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICMgUmVnaXN0ZXIgbW9yZSBzY2hlbWVzIHdpdGggdXJscGFyc2UgZm9yIHZhcmlvdXMgdmVyc2lvbiBjb250cm9sCiAgICAgICAgIyBzeXN0ZW1zCiAgICAgICAgdXJsbGliX3BhcnNlLnVzZXNfbmV0bG9jLmV4dGVuZChzZWxmLnNjaGVtZXMpCiAgICAgICAgIyBQeXRob24gPj0gMi43LjQsIDMuMyBkb2Vzbid0IGhhdmUgdXNlc19mcmFnbWVudAogICAgICAgIGlmIGdldGF0dHIodXJsbGliX3BhcnNlLCAndXNlc19mcmFnbWVudCcsIE5vbmUpOgogICAgICAgICAgICB1cmxsaWJfcGFyc2UudXNlc19mcmFnbWVudC5leHRlbmQoc2VsZi5zY2hlbWVzKQogICAgICAgIHN1cGVyKFZjc1N1cHBvcnQsIHNlbGYpLl9faW5pdF9fKCkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3JlZ2lzdHJ5Ll9faXRlcl9fKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYWNrZW5kcyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9yZWdpc3RyeS52YWx1ZXMoKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaXJuYW1lcyhzZWxmKToKICAgICAgICByZXR1cm4gW2JhY2tlbmQuZGlybmFtZSBmb3IgYmFja2VuZCBpbiBzZWxmLmJhY2tlbmRzXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGFsbF9zY2hlbWVzKHNlbGYpOgogICAgICAgIHNjaGVtZXMgPSBbXQogICAgICAgIGZvciBiYWNrZW5kIGluIHNlbGYuYmFja2VuZHM6CiAgICAgICAgICAgIHNjaGVtZXMuZXh0ZW5kKGJhY2tlbmQuc2NoZW1lcykKICAgICAgICByZXR1cm4gc2NoZW1lcwoKICAgIGRlZiByZWdpc3RlcihzZWxmLCBjbHMpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGNscywgJ25hbWUnKToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0Nhbm5vdCByZWdpc3RlciBWQ1MgJXMnLCBjbHMuX19uYW1lX18pCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIGNscy5uYW1lIG5vdCBpbiBzZWxmLl9yZWdpc3RyeToKICAgICAgICAgICAgc2VsZi5fcmVnaXN0cnlbY2xzLm5hbWVdID0gY2xzCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVnaXN0ZXJlZCBWQ1MgYmFja2VuZDogJXMnLCBjbHMubmFtZSkKCiAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBjbHM9Tm9uZSwgbmFtZT1Ob25lKToKICAgICAgICBpZiBuYW1lIGluIHNlbGYuX3JlZ2lzdHJ5OgogICAgICAgICAgICBkZWwgc2VsZi5fcmVnaXN0cnlbbmFtZV0KICAgICAgICBlbGlmIGNscyBpbiBzZWxmLl9yZWdpc3RyeS52YWx1ZXMoKToKICAgICAgICAgICAgZGVsIHNlbGYuX3JlZ2lzdHJ5W2Nscy5uYW1lXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdDYW5ub3QgdW5yZWdpc3RlciBiZWNhdXNlIG5vIGNsYXNzIG9yIG5hbWUgZ2l2ZW4nKQoKICAgIGRlZiBnZXRfYmFja2VuZF9uYW1lKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZlcnNpb24gY29udHJvbCBiYWNrZW5kIGlmIGZvdW5kIGF0IGdpdmVuCiAgICAgICAgbG9jYXRpb24sIGUuZy4gdmNzLmdldF9iYWNrZW5kX25hbWUoJy9wYXRoL3RvL3Zjcy9jaGVja291dCcpCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHZjX3R5cGUgaW4gc2VsZi5fcmVnaXN0cnkudmFsdWVzKCk6CiAgICAgICAgICAgIGlmIHZjX3R5cGUuY29udHJvbHNfbG9jYXRpb24obG9jYXRpb24pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdEZXRlcm1pbmUgdGhhdCAlcyB1c2VzIFZDUzogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCB2Y190eXBlLm5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gdmNfdHlwZS5uYW1lCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZ2V0X2JhY2tlbmQoc2VsZiwgbmFtZSk6CiAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fcmVnaXN0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWdpc3RyeVtuYW1lXQoKICAgIGRlZiBnZXRfYmFja2VuZF9mcm9tX2xvY2F0aW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICB2Y190eXBlID0gc2VsZi5nZXRfYmFja2VuZF9uYW1lKGxvY2F0aW9uKQogICAgICAgIGlmIHZjX3R5cGU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9iYWNrZW5kKHZjX3R5cGUpCiAgICAgICAgcmV0dXJuIE5vbmUKCgp2Y3MgPSBWY3NTdXBwb3J0KCkKCgpjbGFzcyBWZXJzaW9uQ29udHJvbChvYmplY3QpOgogICAgbmFtZSA9ICcnCiAgICBkaXJuYW1lID0gJycKICAgICMgTGlzdCBvZiBzdXBwb3J0ZWQgc2NoZW1lcyBmb3IgdGhpcyBWZXJzaW9uIENvbnRyb2wKICAgIHNjaGVtZXMgPSAoKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmw9Tm9uZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIHN1cGVyKFZlcnNpb25Db250cm9sLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIF9pc19sb2NhbF9yZXBvc2l0b3J5KHNlbGYsIHJlcG8pOgogICAgICAgICIiIgogICAgICAgICAgIHBvc2l4IGFic29sdXRlIHBhdGhzIHN0YXJ0IHdpdGggb3MucGF0aC5zZXAsCiAgICAgICAgICAgd2luMzIgb25lcyBzdGFydCB3aXRoIGRyaXZlIChsaWtlIGM6XFxmb2xkZXIpCiAgICAgICAgIiIiCiAgICAgICAgZHJpdmUsIHRhaWwgPSBvcy5wYXRoLnNwbGl0ZHJpdmUocmVwbykKICAgICAgICByZXR1cm4gcmVwby5zdGFydHN3aXRoKG9zLnBhdGguc2VwKSBvciBkcml2ZQoKICAgICMgU2VlIGlzc3VlICMxMDgzIGZvciB3aHkgdGhpcyBtZXRob2Qgd2FzIGludHJvZHVjZWQ6CiAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMTA4MwogICAgZGVmIHRyYW5zbGF0ZV9lZ2dfc3VybmFtZShzZWxmLCBzdXJuYW1lKToKICAgICAgICAjIEZvciBleGFtcGxlLCBEamFuZ28gaGFzIGJyYW5jaGVzIG9mIHRoZSBmb3JtICJzdGFibGUvMS43LngiLgogICAgICAgIHJldHVybiBzdXJuYW1lLnJlcGxhY2UoJy8nLCAnXycpCgogICAgZGVmIGV4cG9ydChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgRXhwb3J0IHRoZSByZXBvc2l0b3J5IGF0IHRoZSB1cmwgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uCiAgICAgICAgaS5lLiBvbmx5IGRvd25sb2FkIHRoZSBmaWxlcywgd2l0aG91dCB2Y3MgaW5mb3JtYXRpb25zCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRfdXJsX3JldihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBjb3JyZWN0IHJlcG9zaXRvcnkgVVJMIGFuZCByZXZpc2lvbiBieSBwYXJzaW5nIHRoZSBnaXZlbgogICAgICAgIHJlcG9zaXRvcnkgVVJMCiAgICAgICAgIiIiCiAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICgKICAgICAgICAgICAgIlNvcnJ5LCAnJXMnIGlzIGEgbWFsZm9ybWVkIFZDUyB1cmwuICIKICAgICAgICAgICAgIlRoZSBmb3JtYXQgaXMgPHZjcz4rPHByb3RvY29sPjovLzx1cmw+LCAiCiAgICAgICAgICAgICJlLmcuIHN2bitodHRwOi8vbXlyZXBvL3N2bi9NeUFwcCNlZ2c9TXlBcHAiCiAgICAgICAgKQogICAgICAgIGFzc2VydCAnKycgaW4gc2VsZi51cmwsIGVycm9yX21lc3NhZ2UgJSBzZWxmLnVybAogICAgICAgIHVybCA9IHNlbGYudXJsLnNwbGl0KCcrJywgMSlbMV0KICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWcgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQogICAgICAgIHJldiA9IE5vbmUKICAgICAgICBpZiAnQCcgaW4gcGF0aDoKICAgICAgICAgICAgcGF0aCwgcmV2ID0gcGF0aC5yc3BsaXQoJ0AnLCAxKQogICAgICAgIHVybCA9IHVybGxpYl9wYXJzZS51cmx1bnNwbGl0KChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksICcnKSkKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgZ2V0X2luZm8oc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgKHVybCwgcmV2aXNpb24pLCB3aGVyZSBib3RoIGFyZSBzdHJpbmdzCiAgICAgICAgIiIiCiAgICAgICAgYXNzZXJ0IG5vdCBsb2NhdGlvbi5yc3RyaXAoJy8nKS5lbmRzd2l0aChzZWxmLmRpcm5hbWUpLCBcCiAgICAgICAgICAgICdCYWQgZGlyZWN0b3J5OiAlcycgJSBsb2NhdGlvbgogICAgICAgIHJldHVybiBzZWxmLmdldF91cmwobG9jYXRpb24pLCBzZWxmLmdldF9yZXZpc2lvbihsb2NhdGlvbikKCiAgICBkZWYgbm9ybWFsaXplX3VybChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIE5vcm1hbGl6ZSBhIFVSTCBmb3IgY29tcGFyaXNvbiBieSB1bnF1b3RpbmcgaXQgYW5kIHJlbW92aW5nIGFueQogICAgICAgIHRyYWlsaW5nIHNsYXNoLgogICAgICAgICIiIgogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudW5xdW90ZSh1cmwpLnJzdHJpcCgnLycpCgogICAgZGVmIGNvbXBhcmVfdXJscyhzZWxmLCB1cmwxLCB1cmwyKToKICAgICAgICAiIiIKICAgICAgICBDb21wYXJlIHR3byByZXBvIFVSTHMgZm9yIGlkZW50aXR5LCBpZ25vcmluZyBpbmNpZGVudGFsIGRpZmZlcmVuY2VzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5ub3JtYWxpemVfdXJsKHVybDEpID09IHNlbGYubm9ybWFsaXplX3VybCh1cmwyKSkKCiAgICBkZWYgb2J0YWluKHNlbGYsIGRlc3QpOgogICAgICAgICIiIgogICAgICAgIENhbGxlZCB3aGVuIGluc3RhbGxpbmcgb3IgdXBkYXRpbmcgYW4gZWRpdGFibGUgcGFja2FnZSwgdGFrZXMgdGhlCiAgICAgICAgc291cmNlIHBhdGggb2YgdGhlIGNoZWNrb3V0LgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIgogICAgICAgIFN3aXRjaCB0aGUgcmVwbyBhdCBgYGRlc3RgYCB0byBwb2ludCB0byBgYFVSTGBgLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiIKICAgICAgICBVcGRhdGUgYW4gYWxyZWFkeS1leGlzdGluZyByZXBvIHRvIHRoZSBnaXZlbiBgYHJldl9vcHRpb25zYGAuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBjaGVja192ZXJzaW9uKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgdmVyc2lvbiBpcyBpZGVudGljYWwgdG8gd2hhdCBleGlzdHMgYW5kCiAgICAgICAgZG9lc24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBjaGVja19kZXN0aW5hdGlvbihzZWxmLCBkZXN0LCB1cmwsIHJldl9vcHRpb25zLCByZXZfZGlzcGxheSk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSBhIGxvY2F0aW9uIHRvIHJlY2VpdmUgYSBjaGVja291dC9jbG9uZS4KCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIGxvY2F0aW9uIGlzIHJlYWR5IGZvciAoYW5kIHJlcXVpcmVzKSBhCiAgICAgICAgY2hlY2tvdXQvY2xvbmUsIEZhbHNlIG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICBjaGVja291dCA9IFRydWUKICAgICAgICBwcm9tcHQgPSBGYWxzZQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRlc3QpOgogICAgICAgICAgICBjaGVja291dCA9IEZhbHNlCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihkZXN0LCBzZWxmLmRpcm5hbWUpKToKICAgICAgICAgICAgICAgIGV4aXN0aW5nX3VybCA9IHNlbGYuZ2V0X3VybChkZXN0KQogICAgICAgICAgICAgICAgaWYgc2VsZi5jb21wYXJlX3VybHMoZXhpc3RpbmdfdXJsLCB1cmwpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgJyVzIGluICVzIGV4aXN0cywgYW5kIGhhcyBjb3JyZWN0IFVSTCAoJXMpJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvX25hbWUudGl0bGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3ZlcnNpb24oZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVcGRhdGluZyAlcyAlcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2X2Rpc3BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGUoZGVzdCwgcmV2X29wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2tpcHBpbmcgYmVjYXVzZSBhbHJlYWR5IHVwLXRvLWRhdGUuJykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICclcyAlcyBpbiAlcyBleGlzdHMgd2l0aCBVUkwgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3VybCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgcHJvbXB0ID0gKCcocyl3aXRjaCwgKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAgJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdzJywgJ2knLCAndycsICdiJykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnRGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzLCBhbmQgaXMgbm90IGEgJXMgJXMuJywKICAgICAgICAgICAgICAgICAgICBkZXN0LAogICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9fbmFtZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHByb21wdCA9ICgnKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAgJywgKCdpJywgJ3cnLCAnYicpKQogICAgICAgIGlmIHByb21wdDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnVGhlIHBsYW4gaXMgdG8gaW5zdGFsbCB0aGUgJXMgcmVwb3NpdG9yeSAlcycsCiAgICAgICAgICAgICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzcG9uc2UgPSBhc2tfcGF0aF9leGlzdHMoJ1doYXQgdG8gZG8/ICAlcycgJSBwcm9tcHRbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdFsxXSkKCiAgICAgICAgICAgIGlmIHJlc3BvbnNlID09ICdzJzoKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICdTd2l0Y2hpbmcgJXMgJXMgdG8gJXMlcycsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvX25hbWUsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgICAgICByZXZfZGlzcGxheSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHNlbGYuc3dpdGNoKGRlc3QsIHVybCwgcmV2X29wdGlvbnMpCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2knOgogICAgICAgICAgICAgICAgIyBkbyBub3RoaW5nCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ3cnOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RlbGV0aW5nICVzJywgZGlzcGxheV9wYXRoKGRlc3QpKQogICAgICAgICAgICAgICAgcm10cmVlKGRlc3QpCiAgICAgICAgICAgICAgICBjaGVja291dCA9IFRydWUKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnYic6CiAgICAgICAgICAgICAgICBkZXN0X2RpciA9IGJhY2t1cF9kaXIoZGVzdCkKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdCYWNraW5nIHVwICVzIHRvICVzJywgZGlzcGxheV9wYXRoKGRlc3QpLCBkZXN0X2RpciwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKGRlc3QsIGRlc3RfZGlyKQogICAgICAgICAgICAgICAgY2hlY2tvdXQgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2EnOgogICAgICAgICAgICAgICAgc3lzLmV4aXQoLTEpCiAgICAgICAgcmV0dXJuIGNoZWNrb3V0CgogICAgZGVmIHVucGFjayhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYW4gdXAgY3VycmVudCBsb2NhdGlvbiBhbmQgZG93bmxvYWQgdGhlIHVybCByZXBvc2l0b3J5CiAgICAgICAgKGFuZCB2Y3MgaW5mb3MpIGludG8gbG9jYXRpb24KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsb2NhdGlvbik6CiAgICAgICAgICAgIHJtdHJlZShsb2NhdGlvbikKICAgICAgICBzZWxmLm9idGFpbihsb2NhdGlvbikKCiAgICBkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChzZWxmLCBkaXN0LCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmVxdWlyZW1lbnQgbmVlZGVkIHRvCiAgICAgICAgcmVkb3dubG9hZCB0aGUgZmlsZXMgY3VycmVudGx5IHByZXNlbnQgaW4gbG9jYXRpb24sIHNvbWV0aGluZwogICAgICAgIGxpa2U6CiAgICAgICAgICB7cmVwb3NpdG9yeV91cmx9QHtyZXZpc2lvbn0jZWdnPXtwcm9qZWN0X25hbWV9LXt2ZXJzaW9uX2lkZW50aWZpZXJ9CiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHVybCB1c2VkIGF0IGxvY2F0aW9uCiAgICAgICAgVXNlZCBpbiBnZXRfaW5mbyBvciBjaGVja19kZXN0aW5hdGlvbgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgcmV2aXNpb24gb2YgdGhlIGZpbGVzIGF0IGxvY2F0aW9uCiAgICAgICAgVXNlZCBpbiBnZXRfaW5mbwogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgY21kLCBzaG93X3N0ZG91dD1UcnVlLCBjd2Q9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBvbl9yZXR1cm5jb2RlPSdyYWlzZScsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9kZXNjPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFfZW52aXJvbj1Ob25lLCBzcGlubmVyPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJ1biBhIFZDUyBzdWJjb21tYW5kCiAgICAgICAgVGhpcyBpcyBzaW1wbHkgYSB3cmFwcGVyIGFyb3VuZCBjYWxsX3N1YnByb2Nlc3MgdGhhdCBhZGRzIHRoZSBWQ1MKICAgICAgICBjb21tYW5kIG5hbWUsIGFuZCBjaGVja3MgdGhhdCB0aGUgVkNTIGlzIGF2YWlsYWJsZQogICAgICAgICIiIgogICAgICAgIGNtZCA9IFtzZWxmLm5hbWVdICsgY21kCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gY2FsbF9zdWJwcm9jZXNzKGNtZCwgc2hvd19zdGRvdXQsIGN3ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9yZXR1cm5jb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfZGVzYywgZXh0cmFfZW52aXJvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGlubmVyKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgICAgICMgZXJybm8uRU5PRU5UID0gbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQogICAgICAgICAgICAjIEluIG90aGVyIHdvcmRzLCB0aGUgVkNTIGV4ZWN1dGFibGUgaXNuJ3QgYXZhaWxhYmxlCiAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgogICAgICAgICAgICAgICAgcmFpc2UgQmFkQ29tbWFuZCgnQ2Fubm90IGZpbmQgY29tbWFuZCAlcicgJSBzZWxmLm5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSAgIyByZS1yYWlzZSBleGNlcHRpb24gaWYgYSBkaWZmZXJlbnQgZXJyb3Igb2NjdXJyZWQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBjb250cm9sc19sb2NhdGlvbihjbHMsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBpZiBhIGxvY2F0aW9uIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHZjcy4KICAgICAgICBJdCBpcyBtZWFudCB0byBiZSBvdmVycmlkZGVuIHRvIGltcGxlbWVudCBzbWFydGVyIGRldGVjdGlvbgogICAgICAgIG1lY2hhbmlzbXMgZm9yIHNwZWNpZmljIHZjcy4KICAgICAgICAiIiIKICAgICAgICBsb2dnZXIuZGVidWcoJ0NoZWNraW5nIGluICVzIGZvciAlcyAoJXMpLi4uJywKICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGNscy5kaXJuYW1lLCBjbHMubmFtZSkKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBjbHMuZGlybmFtZSkKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKCgpkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChkaXN0LCBsb2NhdGlvbik6CiAgICB2ZXJzaW9uX2NvbnRyb2wgPSB2Y3MuZ2V0X2JhY2tlbmRfZnJvbV9sb2NhdGlvbihsb2NhdGlvbikKICAgIGlmIHZlcnNpb25fY29udHJvbDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uX2NvbnRyb2woKS5nZXRfc3JjX3JlcXVpcmVtZW50KGRpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKQogICAgICAgIGV4Y2VwdCBCYWRDb21tYW5kOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdjYW5ub3QgZGV0ZXJtaW5lIHZlcnNpb24gb2YgZWRpdGFibGUgc291cmNlIGluICVzICcKICAgICAgICAgICAgICAgICcoJXMgY29tbWFuZCBub3QgZm91bmQgaW4gcGF0aCknLAogICAgICAgICAgICAgICAgbG9jYXRpb24sCiAgICAgICAgICAgICAgICB2ZXJzaW9uX2NvbnRyb2wubmFtZSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gZGlzdC5hc19yZXF1aXJlbWVudCgpCiAgICBsb2dnZXIud2FybmluZygKICAgICAgICAnY2Fubm90IGRldGVybWluZSB2ZXJzaW9uIG9mIGVkaXRhYmxlIHNvdXJjZSBpbiAlcyAoaXMgbm90IFNWTiAnCiAgICAgICAgJ2NoZWNrb3V0LCBHaXQgY2xvbmUsIE1lcmN1cmlhbCBjbG9uZSBvciBCYXphYXIgYnJhbmNoKScsCiAgICAgICAgbG9jYXRpb24sCiAgICApCiAgICByZXR1cm4gZGlzdC5hc19yZXF1aXJlbWVudCgpClBLAwQUAAAAAAAAACEA+8DMxdsOAADbDgAALgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3Zjcy9iYXphYXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCB0ZW1wZmlsZQoKIyBUT0RPOiBHZXQgdGhpcyBpbnRvIHNpeC5tb3Zlcy51cmxsaWIucGFyc2UKdHJ5OgogICAgZnJvbSB1cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgdXJscGFyc2UgYXMgdXJsbGliX3BhcnNlCgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcm10cmVlLCBkaXNwbGF5X3BhdGgKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MsIFZlcnNpb25Db250cm9sCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBwYXRoX3RvX3VybAoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEJhemFhcihWZXJzaW9uQ29udHJvbCk6CiAgICBuYW1lID0gJ2J6cicKICAgIGRpcm5hbWUgPSAnLmJ6cicKICAgIHJlcG9fbmFtZSA9ICdicmFuY2gnCiAgICBzY2hlbWVzID0gKAogICAgICAgICdienInLCAnYnpyK2h0dHAnLCAnYnpyK2h0dHBzJywgJ2J6citzc2gnLCAnYnpyK3NmdHAnLCAnYnpyK2Z0cCcsCiAgICAgICAgJ2J6citscCcsCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybD1Ob25lLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKEJhemFhciwgc2VsZikuX19pbml0X18odXJsLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgIyBQeXRob24gPj0gMi43LjQsIDMuMyBkb2Vzbid0IGhhdmUgdXNlc19mcmFnbWVudCBvciBub25faGllcmFyY2hpY2FsCiAgICAgICAgIyBSZWdpc3RlciBscCBidXQgZG8gbm90IGV4cG9zZSBhcyBhIHNjaGVtZSB0byBzdXBwb3J0IGJ6citscC4KICAgICAgICBpZiBnZXRhdHRyKHVybGxpYl9wYXJzZSwgJ3VzZXNfZnJhZ21lbnQnLCBOb25lKToKICAgICAgICAgICAgdXJsbGliX3BhcnNlLnVzZXNfZnJhZ21lbnQuZXh0ZW5kKFsnbHAnXSkKICAgICAgICAgICAgdXJsbGliX3BhcnNlLm5vbl9oaWVyYXJjaGljYWwuZXh0ZW5kKFsnbHAnXSkKCiAgICBkZWYgZXhwb3J0KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBFeHBvcnQgdGhlIEJhemFhciByZXBvc2l0b3J5IGF0IHRoZSB1cmwgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uCiAgICAgICAgIiIiCiAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCctZXhwb3J0JywgJ3BpcC0nKQogICAgICAgIHNlbGYudW5wYWNrKHRlbXBfZGlyKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvY2F0aW9uKToKICAgICAgICAgICAgIyBSZW1vdmUgdGhlIGxvY2F0aW9uIHRvIG1ha2Ugc3VyZSBCYXphYXIgY2FuIGV4cG9ydCBpdCBjb3JyZWN0bHkKICAgICAgICAgICAgcm10cmVlKGxvY2F0aW9uKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2V4cG9ydCcsIGxvY2F0aW9uXSwgY3dkPXRlbXBfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJtdHJlZSh0ZW1wX2RpcikKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydzd2l0Y2gnLCB1cmxdLCBjd2Q9ZGVzdCkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsncHVsbCcsICctcSddICsgcmV2X29wdGlvbnMsIGN3ZD1kZXN0KQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgZGVzdCk6CiAgICAgICAgdXJsLCByZXYgPSBzZWxmLmdldF91cmxfcmV2KCkKICAgICAgICBpZiByZXY6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gWyctcicsIHJldl0KICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnICh0byByZXZpc2lvbiAlcyknICUgcmV2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbXQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcnCiAgICAgICAgaWYgc2VsZi5jaGVja19kZXN0aW5hdGlvbihkZXN0LCB1cmwsIHJldl9vcHRpb25zLCByZXZfZGlzcGxheSk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ0NoZWNraW5nIG91dCAlcyVzIHRvICVzJywKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIHJldl9kaXNwbGF5LAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydicmFuY2gnLCAnLXEnXSArIHJldl9vcHRpb25zICsgW3VybCwgZGVzdF0pCgogICAgZGVmIGdldF91cmxfcmV2KHNlbGYpOgogICAgICAgICMgaG90Zml4IHRoZSBVUkwgc2NoZW1lIGFmdGVyIHJlbW92aW5nIGJ6cisgZnJvbSBienIrc3NoOi8vIHJlYWRkIGl0CiAgICAgICAgdXJsLCByZXYgPSBzdXBlcihCYXphYXIsIHNlbGYpLmdldF91cmxfcmV2KCkKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnc3NoOi8vJyk6CiAgICAgICAgICAgIHVybCA9ICdienIrJyArIHVybAogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICB1cmxzID0gc2VsZi5ydW5fY29tbWFuZChbJ2luZm8nXSwgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikKICAgICAgICBmb3IgbGluZSBpbiB1cmxzLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBmb3IgeCBpbiAoJ2NoZWNrb3V0IG9mIGJyYW5jaDogJywKICAgICAgICAgICAgICAgICAgICAgICdwYXJlbnQgYnJhbmNoOiAnKToKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCh4KToKICAgICAgICAgICAgICAgICAgICByZXBvID0gbGluZS5zcGxpdCh4KVsxXQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzX2xvY2FsX3JlcG9zaXRvcnkocmVwbyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoX3RvX3VybChyZXBvKQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBvCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICByZXZpc2lvbiA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsncmV2bm8nXSwgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikKICAgICAgICByZXR1cm4gcmV2aXNpb24uc3BsaXRsaW5lcygpWy0xXQoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXRfdXJsKGxvY2F0aW9uKQogICAgICAgIGlmIG5vdCByZXBvOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGlmIG5vdCByZXBvLmxvd2VyKCkuc3RhcnRzd2l0aCgnYnpyOicpOgogICAgICAgICAgICByZXBvID0gJ2J6cisnICsgcmVwbwogICAgICAgIGVnZ19wcm9qZWN0X25hbWUgPSBkaXN0LmVnZ19uYW1lKCkuc3BsaXQoJy0nLCAxKVswXQogICAgICAgIGN1cnJlbnRfcmV2ID0gc2VsZi5nZXRfcmV2aXNpb24obG9jYXRpb24pCiAgICAgICAgcmV0dXJuICclc0AlcyNlZ2c9JXMnICUgKHJlcG8sIGN1cnJlbnRfcmV2LCBlZ2dfcHJvamVjdF9uYW1lKQoKICAgIGRlZiBjaGVja192ZXJzaW9uKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiJBbHdheXMgYXNzdW1lIHRoZSB2ZXJzaW9ucyBkb24ndCBtYXRjaCIiIgogICAgICAgIHJldHVybiBGYWxzZQoKCnZjcy5yZWdpc3RlcihCYXphYXIpClBLAwQUAAAAAAAAACEAKL7eML0rAAC9KwAAKwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3Zjcy9naXQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBvcy5wYXRoCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IHNhbWVmaWxlCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEJhZENvbW1hbmQKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCByZXF1ZXN0IGFzIHVybGxpYl9yZXF1ZXN0CmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnZlcnNpb24gaW1wb3J0IHBhcnNlIGFzIHBhcnNlX3ZlcnNpb24KCmZyb20gcGlwLnV0aWxzIGltcG9ydCBkaXNwbGF5X3BhdGgsIHJtdHJlZQpmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgVmVyc2lvbkNvbnRyb2wKCgp1cmxzcGxpdCA9IHVybGxpYl9wYXJzZS51cmxzcGxpdAp1cmx1bnNwbGl0ID0gdXJsbGliX3BhcnNlLnVybHVuc3BsaXQKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBHaXQoVmVyc2lvbkNvbnRyb2wpOgogICAgbmFtZSA9ICdnaXQnCiAgICBkaXJuYW1lID0gJy5naXQnCiAgICByZXBvX25hbWUgPSAnY2xvbmUnCiAgICBzY2hlbWVzID0gKAogICAgICAgICdnaXQnLCAnZ2l0K2h0dHAnLCAnZ2l0K2h0dHBzJywgJ2dpdCtzc2gnLCAnZ2l0K2dpdCcsICdnaXQrZmlsZScsCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybD1Ob25lLCAqYXJncywgKiprd2FyZ3MpOgoKICAgICAgICAjIFdvcmtzIGFyb3VuZCBhbiBhcHBhcmVudCBHaXQgYnVnCiAgICAgICAgIyAoc2VlIGh0dHA6Ly9hcnRpY2xlLmdtYW5lLm9yZy9nbWFuZS5jb21wLnZlcnNpb24tY29udHJvbC5naXQvMTQ2NTAwKQogICAgICAgIGlmIHVybDoKICAgICAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybHNwbGl0KHVybCkKICAgICAgICAgICAgaWYgc2NoZW1lLmVuZHN3aXRoKCdmaWxlJyk6CiAgICAgICAgICAgICAgICBpbml0aWFsX3NsYXNoZXMgPSBwYXRoWzotbGVuKHBhdGgubHN0cmlwKCcvJykpXQogICAgICAgICAgICAgICAgbmV3cGF0aCA9ICgKICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3NsYXNoZXMgKwogICAgICAgICAgICAgICAgICAgIHVybGxpYl9yZXF1ZXN0LnVybDJwYXRobmFtZShwYXRoKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdcXCcsICcvJykubHN0cmlwKCcvJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHVybCA9IHVybHVuc3BsaXQoKHNjaGVtZSwgbmV0bG9jLCBuZXdwYXRoLCBxdWVyeSwgZnJhZ21lbnQpKQogICAgICAgICAgICAgICAgYWZ0ZXJfcGx1cyA9IHNjaGVtZS5maW5kKCcrJykgKyAxCiAgICAgICAgICAgICAgICB1cmwgPSBzY2hlbWVbOmFmdGVyX3BsdXNdICsgdXJsdW5zcGxpdCgKICAgICAgICAgICAgICAgICAgICAoc2NoZW1lW2FmdGVyX3BsdXM6XSwgbmV0bG9jLCBuZXdwYXRoLCBxdWVyeSwgZnJhZ21lbnQpLAogICAgICAgICAgICAgICAgKQoKICAgICAgICBzdXBlcihHaXQsIHNlbGYpLl9faW5pdF9fKHVybCwgKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBnZXRfZ2l0X3ZlcnNpb24oc2VsZik6CiAgICAgICAgVkVSU0lPTl9QRlggPSAnZ2l0IHZlcnNpb24gJwogICAgICAgIHZlcnNpb24gPSBzZWxmLnJ1bl9jb21tYW5kKFsndmVyc2lvbiddLCBzaG93X3N0ZG91dD1GYWxzZSkKICAgICAgICBpZiB2ZXJzaW9uLnN0YXJ0c3dpdGgoVkVSU0lPTl9QRlgpOgogICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbltsZW4oVkVSU0lPTl9QRlgpOl0KICAgICAgICBlbHNlOgogICAgICAgICAgICB2ZXJzaW9uID0gJycKICAgICAgICAjIGdldCBmaXJzdCAzIHBvc2l0aW9ucyBvZiB0aGUgZ2l0IHZlcnNpb24gYmVjYXN1ZQogICAgICAgICMgb24gd2luZG93cyBpdCBpcyB4Lnkuei53aW5kb3dzLnQsIGFuZCB0aGlzIHBhcnNlcyBhcwogICAgICAgICMgTGVnYWN5VmVyc2lvbiB3aGljaCBhbHdheXMgc21hbGxlciB0aGFuIGEgVmVyc2lvbi4KICAgICAgICB2ZXJzaW9uID0gJy4nLmpvaW4odmVyc2lvbi5zcGxpdCgnLicpWzozXSkKICAgICAgICByZXR1cm4gcGFyc2VfdmVyc2lvbih2ZXJzaW9uKQoKICAgIGRlZiBleHBvcnQoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIkV4cG9ydCB0aGUgR2l0IHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24iIiIKICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoJy1leHBvcnQnLCAncGlwLScpCiAgICAgICAgc2VsZi51bnBhY2sodGVtcF9kaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBub3QgbG9jYXRpb24uZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24gKyAnLycKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgICAgIFsnY2hlY2tvdXQtaW5kZXgnLCAnLWEnLCAnLWYnLCAnLS1wcmVmaXgnLCBsb2NhdGlvbl0sCiAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPXRlbXBfZGlyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJtdHJlZSh0ZW1wX2RpcikKCiAgICBkZWYgY2hlY2tfcmV2X29wdGlvbnMoc2VsZiwgcmV2LCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiQ2hlY2sgdGhlIHJldmlzaW9uIG9wdGlvbnMgYmVmb3JlIGNoZWNrb3V0IHRvIGNvbXBlbnNhdGUgdGhhdCB0YWdzCiAgICAgICAgYW5kIGJyYW5jaGVzIG1heSBuZWVkIG9yaWdpbi8gYXMgYSBwcmVmaXguCiAgICAgICAgUmV0dXJucyB0aGUgU0hBMSBvZiB0aGUgYnJhbmNoIG9yIHRhZyBpZiBmb3VuZC4KICAgICAgICAiIiIKICAgICAgICByZXZpc2lvbnMgPSBzZWxmLmdldF9zaG9ydF9yZWZzKGRlc3QpCgogICAgICAgIG9yaWdpbl9yZXYgPSAnb3JpZ2luLyVzJyAlIHJldgogICAgICAgIGlmIG9yaWdpbl9yZXYgaW4gcmV2aXNpb25zOgogICAgICAgICAgICAjIHJlbW90ZSBicmFuY2gKICAgICAgICAgICAgcmV0dXJuIFtyZXZpc2lvbnNbb3JpZ2luX3Jldl1dCiAgICAgICAgZWxpZiByZXYgaW4gcmV2aXNpb25zOgogICAgICAgICAgICAjIGEgbG9jYWwgdGFnIG9yIGJyYW5jaCBuYW1lCiAgICAgICAgICAgIHJldHVybiBbcmV2aXNpb25zW3Jldl1dCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgYSB0YWcgb3IgYnJhbmNoICclcycsIGFzc3VtaW5nIGNvbW1pdC4iLCByZXYsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIHJldl9vcHRpb25zCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIgogICAgICAgIENvbXBhcmUgdGhlIGN1cnJlbnQgc2hhIHRvIHRoZSByZWYuIHJlZiBtYXkgYmUgYSBicmFuY2ggb3IgdGFnIG5hbWUsCiAgICAgICAgYnV0IGN1cnJlbnQgcmV2IHdpbGwgYWx3YXlzIHBvaW50IHRvIGEgc2hhLiBUaGlzIG1lYW5zIHRoYXQgYSBicmFuY2gKICAgICAgICBvciB0YWcgd2lsbCBuZXZlciBjb21wYXJlIGFzIFRydWUuIFNvIHRoaXMgdWx0aW1hdGVseSBvbmx5IG1hdGNoZXMKICAgICAgICBhZ2FpbnN0IGV4YWN0IHNoYXMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3JldmlzaW9uKGRlc3QpLnN0YXJ0c3dpdGgocmV2X29wdGlvbnNbMF0pCgogICAgZGVmIHN3aXRjaChzZWxmLCBkZXN0LCB1cmwsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnY29uZmlnJywgJ3JlbW90ZS5vcmlnaW4udXJsJywgdXJsXSwgY3dkPWRlc3QpCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2NoZWNrb3V0JywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCgogICAgICAgIHNlbGYudXBkYXRlX3N1Ym1vZHVsZXMoZGVzdCkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAjIEZpcnN0IGZldGNoIGNoYW5nZXMgZnJvbSB0aGUgZGVmYXVsdCByZW1vdGUKICAgICAgICBpZiBzZWxmLmdldF9naXRfdmVyc2lvbigpID49IHBhcnNlX3ZlcnNpb24oJzEuOS4wJyk6CiAgICAgICAgICAgICMgZmV0Y2ggdGFncyBpbiBhZGRpdGlvbiB0byBldmVyeXRoaW5nIGVsc2UKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2ZldGNoJywgJy1xJywgJy0tdGFncyddLCBjd2Q9ZGVzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnZmV0Y2gnLCAnLXEnXSwgY3dkPWRlc3QpCiAgICAgICAgIyBUaGVuIHJlc2V0IHRvIHdhbnRlZCByZXZpc2lvbiAobWF5YmUgZXZlbiBvcmlnaW4vbWFzdGVyKQogICAgICAgIGlmIHJldl9vcHRpb25zOgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IHNlbGYuY2hlY2tfcmV2X29wdGlvbnMoCiAgICAgICAgICAgICAgICByZXZfb3B0aW9uc1swXSwgZGVzdCwgcmV2X29wdGlvbnMsCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsncmVzZXQnLCAnLS1oYXJkJywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCiAgICAgICAgIzogdXBkYXRlIHN1Ym1vZHVsZXMKICAgICAgICBzZWxmLnVwZGF0ZV9zdWJtb2R1bGVzKGRlc3QpCgogICAgZGVmIG9idGFpbihzZWxmLCBkZXN0KToKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIGlmIHJldjoKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbcmV2XQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcgKHRvICVzKScgJSByZXYKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFsnb3JpZ2luL21hc3RlciddCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJycKICAgICAgICBpZiBzZWxmLmNoZWNrX2Rlc3RpbmF0aW9uKGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnQ2xvbmluZyAlcyVzIHRvICVzJywgdXJsLCByZXZfZGlzcGxheSwgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydjbG9uZScsICctcScsIHVybCwgZGVzdF0pCgogICAgICAgICAgICBpZiByZXY6CiAgICAgICAgICAgICAgICByZXZfb3B0aW9ucyA9IHNlbGYuY2hlY2tfcmV2X29wdGlvbnMocmV2LCBkZXN0LCByZXZfb3B0aW9ucykKICAgICAgICAgICAgICAgICMgT25seSBkbyBhIGNoZWNrb3V0IGlmIHJldl9vcHRpb25zIGRpZmZlcnMgZnJvbSBIRUFECiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja192ZXJzaW9uKGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAgICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgICAgICAgICBbJ2NoZWNrb3V0JywgJy1xJ10gKyByZXZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgY3dkPWRlc3QsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAjOiByZXBvIG1heSBjb250YWluIHN1Ym1vZHVsZXMKICAgICAgICAgICAgc2VsZi51cGRhdGVfc3VibW9kdWxlcyhkZXN0KQoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJSZXR1cm4gVVJMIG9mIHRoZSBmaXJzdCByZW1vdGUgZW5jb3VudGVyZWQuIiIiCiAgICAgICAgcmVtb3RlcyA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsnY29uZmlnJywgJy0tZ2V0LXJlZ2V4cCcsICdyZW1vdGVcLi4qXC51cmwnXSwKICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikKICAgICAgICByZW1vdGVzID0gcmVtb3Rlcy5zcGxpdGxpbmVzKCkKICAgICAgICBmb3VuZF9yZW1vdGUgPSByZW1vdGVzWzBdCiAgICAgICAgZm9yIHJlbW90ZSBpbiByZW1vdGVzOgogICAgICAgICAgICBpZiByZW1vdGUuc3RhcnRzd2l0aCgncmVtb3RlLm9yaWdpbi51cmwgJyk6CiAgICAgICAgICAgICAgICBmb3VuZF9yZW1vdGUgPSByZW1vdGUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgdXJsID0gZm91bmRfcmVtb3RlLnNwbGl0KCcgJylbMV0KICAgICAgICByZXR1cm4gdXJsLnN0cmlwKCkKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBjdXJyZW50X3JldiA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsncmV2LXBhcnNlJywgJ0hFQUQnXSwgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikKICAgICAgICByZXR1cm4gY3VycmVudF9yZXYuc3RyaXAoKQoKICAgIGRlZiBnZXRfZnVsbF9yZWZzKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJZaWVsZHMgdHVwbGVzIG9mIChjb21taXQsIHJlZikgZm9yIGJyYW5jaGVzIGFuZCB0YWdzIiIiCiAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fY29tbWFuZChbJ3Nob3ctcmVmJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zdHJpcCgpLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgY29tbWl0LCByZWYgPSBsaW5lLnNwbGl0KCcgJywgMSkKICAgICAgICAgICAgeWllbGQgY29tbWl0LnN0cmlwKCksIHJlZi5zdHJpcCgpCgogICAgZGVmIGlzX3JlZl9yZW1vdGUoc2VsZiwgcmVmKToKICAgICAgICByZXR1cm4gcmVmLnN0YXJ0c3dpdGgoJ3JlZnMvcmVtb3Rlcy8nKQoKICAgIGRlZiBpc19yZWZfYnJhbmNoKHNlbGYsIHJlZik6CiAgICAgICAgcmV0dXJuIHJlZi5zdGFydHN3aXRoKCdyZWZzL2hlYWRzLycpCgogICAgZGVmIGlzX3JlZl90YWcoc2VsZiwgcmVmKToKICAgICAgICByZXR1cm4gcmVmLnN0YXJ0c3dpdGgoJ3JlZnMvdGFncy8nKQoKICAgIGRlZiBpc19yZWZfY29tbWl0KHNlbGYsIHJlZik6CiAgICAgICAgIiIiQSByZWYgaXMgYSBjb21taXQgc2hhIGlmIGl0IGlzIG5vdCBhbnl0aGluZyBlbHNlIiIiCiAgICAgICAgcmV0dXJuIG5vdCBhbnkoKAogICAgICAgICAgICBzZWxmLmlzX3JlZl9yZW1vdGUocmVmKSwKICAgICAgICAgICAgc2VsZi5pc19yZWZfYnJhbmNoKHJlZiksCiAgICAgICAgICAgIHNlbGYuaXNfcmVmX3RhZyhyZWYpLAogICAgICAgICkpCgogICAgIyBTaG91bGQgZGVwcmVjYXRlIGBnZXRfcmVmc2Agc2luY2UgaXQncyBhbWJpZ3VvdXMKICAgIGRlZiBnZXRfcmVmcyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3Nob3J0X3JlZnMobG9jYXRpb24pCgogICAgZGVmIGdldF9zaG9ydF9yZWZzKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJSZXR1cm4gbWFwIG9mIG5hbWVkIHJlZnMgKGJyYW5jaGVzIG9yIHRhZ3MpIHRvIGNvbW1pdCBoYXNoZXMuIiIiCiAgICAgICAgcnYgPSB7fQogICAgICAgIGZvciBjb21taXQsIHJlZiBpbiBzZWxmLmdldF9mdWxsX3JlZnMobG9jYXRpb24pOgogICAgICAgICAgICByZWZfbmFtZSA9IE5vbmUKICAgICAgICAgICAgaWYgc2VsZi5pc19yZWZfcmVtb3RlKHJlZik6CiAgICAgICAgICAgICAgICByZWZfbmFtZSA9IHJlZltsZW4oJ3JlZnMvcmVtb3Rlcy8nKTpdCiAgICAgICAgICAgIGVsaWYgc2VsZi5pc19yZWZfYnJhbmNoKHJlZik6CiAgICAgICAgICAgICAgICByZWZfbmFtZSA9IHJlZltsZW4oJ3JlZnMvaGVhZHMvJyk6XQogICAgICAgICAgICBlbGlmIHNlbGYuaXNfcmVmX3RhZyhyZWYpOgogICAgICAgICAgICAgICAgcmVmX25hbWUgPSByZWZbbGVuKCdyZWZzL3RhZ3MvJyk6XQogICAgICAgICAgICBpZiByZWZfbmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJ2W3JlZl9uYW1lXSA9IGNvbW1pdAogICAgICAgIHJldHVybiBydgoKICAgIGRlZiBfZ2V0X3N1YmRpcmVjdG9yeShzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHNldHVwLnB5IHRvIHRoZSBnaXQgcmVwbyByb290LiIiIgogICAgICAgICMgZmluZCB0aGUgcmVwbyByb290CiAgICAgICAgZ2l0X2RpciA9IHNlbGYucnVuX2NvbW1hbmQoWydyZXYtcGFyc2UnLCAnLS1naXQtZGlyJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikuc3RyaXAoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKGdpdF9kaXIpOgogICAgICAgICAgICBnaXRfZGlyID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBnaXRfZGlyKQogICAgICAgIHJvb3RfZGlyID0gb3MucGF0aC5qb2luKGdpdF9kaXIsICcuLicpCiAgICAgICAgIyBmaW5kIHNldHVwLnB5CiAgICAgICAgb3JpZ19sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgd2hpbGUgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihsb2NhdGlvbiwgJ3NldHVwLnB5JykpOgogICAgICAgICAgICBsYXN0X2xvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICAgICAgbG9jYXRpb24gPSBvcy5wYXRoLmRpcm5hbWUobG9jYXRpb24pCiAgICAgICAgICAgIGlmIGxvY2F0aW9uID09IGxhc3RfbG9jYXRpb246CiAgICAgICAgICAgICAgICAjIFdlJ3ZlIHRyYXZlcnNlZCB1cCB0byB0aGUgcm9vdCBvZiB0aGUgZmlsZXN5c3RlbSB3aXRob3V0CiAgICAgICAgICAgICAgICAjIGZpbmRpbmcgc2V0dXAucHkKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBzZXR1cC5weSBmb3IgZGlyZWN0b3J5ICVzICh0cmllZCBhbGwgIgogICAgICAgICAgICAgICAgICAgICJwYXJlbnQgZGlyZWN0b3JpZXMpIiwKICAgICAgICAgICAgICAgICAgICBvcmlnX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAjIHJlbGF0aXZlIHBhdGggb2Ygc2V0dXAucHkgdG8gcmVwbyByb290CiAgICAgICAgaWYgc2FtZWZpbGUocm9vdF9kaXIsIGxvY2F0aW9uKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3MucGF0aC5yZWxwYXRoKGxvY2F0aW9uLCByb290X2RpcikKCiAgICBkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChzZWxmLCBkaXN0LCBsb2NhdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0X3VybChsb2NhdGlvbikKICAgICAgICBpZiBub3QgcmVwby5sb3dlcigpLnN0YXJ0c3dpdGgoJ2dpdDonKToKICAgICAgICAgICAgcmVwbyA9ICdnaXQrJyArIHJlcG8KICAgICAgICBlZ2dfcHJvamVjdF9uYW1lID0gZGlzdC5lZ2dfbmFtZSgpLnNwbGl0KCctJywgMSlbMF0KICAgICAgICBpZiBub3QgcmVwbzoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBjdXJyZW50X3JldiA9IHNlbGYuZ2V0X3JldmlzaW9uKGxvY2F0aW9uKQogICAgICAgIHJlcSA9ICclc0AlcyNlZ2c9JXMnICUgKHJlcG8sIGN1cnJlbnRfcmV2LCBlZ2dfcHJvamVjdF9uYW1lKQogICAgICAgIHN1YmRpcmVjdG9yeSA9IHNlbGYuX2dldF9zdWJkaXJlY3RvcnkobG9jYXRpb24pCiAgICAgICAgaWYgc3ViZGlyZWN0b3J5OgogICAgICAgICAgICByZXEgKz0gJyZzdWJkaXJlY3Rvcnk9JyArIHN1YmRpcmVjdG9yeQogICAgICAgIHJldHVybiByZXEKCiAgICBkZWYgZ2V0X3VybF9yZXYoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUHJlZml4ZXMgc3R1YiBVUkxzIGxpa2UgJ3VzZXJAaG9zdG5hbWU6dXNlci9yZXBvLmdpdCcgd2l0aCAnc3NoOi8vJy4KICAgICAgICBUaGF0J3MgcmVxdWlyZWQgYmVjYXVzZSBhbHRob3VnaCB0aGV5IHVzZSBTU0ggdGhleSBzb21ldGltZXMgZG9lc24ndAogICAgICAgIHdvcmsgd2l0aCBhIHNzaDovLyBzY2hlbWUgKGUuZy4gR2l0aHViKS4gQnV0IHdlIG5lZWQgYSBzY2hlbWUgZm9yCiAgICAgICAgcGFyc2luZy4gSGVuY2Ugd2UgcmVtb3ZlIGl0IGFnYWluIGFmdGVyd2FyZHMgYW5kIHJldHVybiBpdCBhcyBhIHN0dWIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgJzovLycgbm90IGluIHNlbGYudXJsOgogICAgICAgICAgICBhc3NlcnQgJ2ZpbGU6JyBub3QgaW4gc2VsZi51cmwKICAgICAgICAgICAgc2VsZi51cmwgPSBzZWxmLnVybC5yZXBsYWNlKCdnaXQrJywgJ2dpdCtzc2g6Ly8nKQogICAgICAgICAgICB1cmwsIHJldiA9IHN1cGVyKEdpdCwgc2VsZikuZ2V0X3VybF9yZXYoKQogICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnc3NoOi8vJywgJycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdXJsLCByZXYgPSBzdXBlcihHaXQsIHNlbGYpLmdldF91cmxfcmV2KCkKCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIHVwZGF0ZV9zdWJtb2R1bGVzKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGxvY2F0aW9uLCAnLmdpdG1vZHVsZXMnKSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsnc3VibW9kdWxlJywgJ3VwZGF0ZScsICctLWluaXQnLCAnLS1yZWN1cnNpdmUnLCAnLXEnXSwKICAgICAgICAgICAgY3dkPWxvY2F0aW9uLAogICAgICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBjb250cm9sc19sb2NhdGlvbihjbHMsIGxvY2F0aW9uKToKICAgICAgICBpZiBzdXBlcihHaXQsIGNscykuY29udHJvbHNfbG9jYXRpb24obG9jYXRpb24pOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgciA9IGNscygpLnJ1bl9jb21tYW5kKFsncmV2LXBhcnNlJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9bG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3JldHVybmNvZGU9J2lnbm9yZScpCiAgICAgICAgICAgIHJldHVybiBub3QgcgogICAgICAgIGV4Y2VwdCBCYWRDb21tYW5kOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoImNvdWxkIG5vdCBkZXRlcm1pbmUgaWYgJXMgaXMgdW5kZXIgZ2l0IGNvbnRyb2wgIgogICAgICAgICAgICAgICAgICAgICAgICAgImJlY2F1c2UgZ2l0IGlzIG5vdCBhdmFpbGFibGUiLCBsb2NhdGlvbikKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgoKdmNzLnJlZ2lzdGVyKEdpdCkKUEsDBBQAAAAAAAAAIQB5YmodkA0AAJANAAAxAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdmNzL21lcmN1cmlhbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHRlbXBmaWxlCgpmcm9tIHBpcC51dGlscyBpbXBvcnQgZGlzcGxheV9wYXRoLCBybXRyZWUKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MsIFZlcnNpb25Db250cm9sCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBwYXRoX3RvX3VybApmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgTWVyY3VyaWFsKFZlcnNpb25Db250cm9sKToKICAgIG5hbWUgPSAnaGcnCiAgICBkaXJuYW1lID0gJy5oZycKICAgIHJlcG9fbmFtZSA9ICdjbG9uZScKICAgIHNjaGVtZXMgPSAoJ2hnJywgJ2hnK2h0dHAnLCAnaGcraHR0cHMnLCAnaGcrc3NoJywgJ2hnK3N0YXRpYy1odHRwJykKCiAgICBkZWYgZXhwb3J0KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJFeHBvcnQgdGhlIEhnIHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24iIiIKICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoJy1leHBvcnQnLCAncGlwLScpCiAgICAgICAgc2VsZi51bnBhY2sodGVtcF9kaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgWydhcmNoaXZlJywgbG9jYXRpb25dLCBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPXRlbXBfZGlyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJtdHJlZSh0ZW1wX2RpcikKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgIHJlcG9fY29uZmlnID0gb3MucGF0aC5qb2luKGRlc3QsIHNlbGYuZGlybmFtZSwgJ2hncmMnKQogICAgICAgIGNvbmZpZyA9IGNvbmZpZ3BhcnNlci5TYWZlQ29uZmlnUGFyc2VyKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbmZpZy5yZWFkKHJlcG9fY29uZmlnKQogICAgICAgICAgICBjb25maWcuc2V0KCdwYXRocycsICdkZWZhdWx0JywgdXJsKQogICAgICAgICAgICB3aXRoIG9wZW4ocmVwb19jb25maWcsICd3JykgYXMgY29uZmlnX2ZpbGU6CiAgICAgICAgICAgICAgICBjb25maWcud3JpdGUoY29uZmlnX2ZpbGUpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBjb25maWdwYXJzZXIuTm9TZWN0aW9uRXJyb3IpIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQ291bGQgbm90IHN3aXRjaCBNZXJjdXJpYWwgcmVwb3NpdG9yeSB0byAlczogJXMnLCB1cmwsIGV4YywKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWyd1cGRhdGUnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsncHVsbCcsICctcSddLCBjd2Q9ZGVzdCkKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsndXBkYXRlJywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCgogICAgZGVmIG9idGFpbihzZWxmLCBkZXN0KToKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIGlmIHJldjoKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbcmV2XQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcgKHRvIHJldmlzaW9uICVzKScgJSByZXYKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFtdCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJycKICAgICAgICBpZiBzZWxmLmNoZWNrX2Rlc3RpbmF0aW9uKGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnQ2xvbmluZyBoZyAlcyVzIHRvICVzJywKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIHJldl9kaXNwbGF5LAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydjbG9uZScsICctLW5vdXBkYXRlJywgJy1xJywgdXJsLCBkZXN0XSkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3VwZGF0ZScsICctcSddICsgcmV2X29wdGlvbnMsIGN3ZD1kZXN0KQoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICB1cmwgPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBbJ3Nob3djb25maWcnLCAncGF0aHMuZGVmYXVsdCddLAogICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKS5zdHJpcCgpCiAgICAgICAgaWYgc2VsZi5faXNfbG9jYWxfcmVwb3NpdG9yeSh1cmwpOgogICAgICAgICAgICB1cmwgPSBwYXRoX3RvX3VybCh1cmwpCiAgICAgICAgcmV0dXJuIHVybC5zdHJpcCgpCgogICAgZGVmIGdldF9yZXZpc2lvbihzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgY3VycmVudF9yZXZpc2lvbiA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsncGFyZW50cycsICctLXRlbXBsYXRlPXtyZXZ9J10sCiAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pLnN0cmlwKCkKICAgICAgICByZXR1cm4gY3VycmVudF9yZXZpc2lvbgoKICAgIGRlZiBnZXRfcmV2aXNpb25faGFzaChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgY3VycmVudF9yZXZfaGFzaCA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsncGFyZW50cycsICctLXRlbXBsYXRlPXtub2RlfSddLAogICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKS5zdHJpcCgpCiAgICAgICAgcmV0dXJuIGN1cnJlbnRfcmV2X2hhc2gKCiAgICBkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChzZWxmLCBkaXN0LCBsb2NhdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0X3VybChsb2NhdGlvbikKICAgICAgICBpZiBub3QgcmVwby5sb3dlcigpLnN0YXJ0c3dpdGgoJ2hnOicpOgogICAgICAgICAgICByZXBvID0gJ2hnKycgKyByZXBvCiAgICAgICAgZWdnX3Byb2plY3RfbmFtZSA9IGRpc3QuZWdnX25hbWUoKS5zcGxpdCgnLScsIDEpWzBdCiAgICAgICAgaWYgbm90IHJlcG86CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgY3VycmVudF9yZXZfaGFzaCA9IHNlbGYuZ2V0X3JldmlzaW9uX2hhc2gobG9jYXRpb24pCiAgICAgICAgcmV0dXJuICclc0AlcyNlZ2c9JXMnICUgKHJlcG8sIGN1cnJlbnRfcmV2X2hhc2gsIGVnZ19wcm9qZWN0X25hbWUpCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIkFsd2F5cyBhc3N1bWUgdGhlIHZlcnNpb25zIGRvbid0IG1hdGNoIiIiCiAgICAgICAgcmV0dXJuIEZhbHNlCgp2Y3MucmVnaXN0ZXIoTWVyY3VyaWFsKQpQSwMEFAAAAAAAAAAhAG40lUGGJAAAhiQAADIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3Mvc3VidmVyc2lvbi5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHJlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQoKZnJvbSBwaXAuaW5kZXggaW1wb3J0IExpbmsKZnJvbSBwaXAudXRpbHMgaW1wb3J0IHJtdHJlZSwgZGlzcGxheV9wYXRoCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MsIFZlcnNpb25Db250cm9sCgpfc3ZuX3htbF91cmxfcmUgPSByZS5jb21waWxlKCd1cmw9IihbXiJdKykiJykKX3N2bl9yZXZfcmUgPSByZS5jb21waWxlKCdjb21taXR0ZWQtcmV2PSIoXGQrKSInKQpfc3ZuX3VybF9yZSA9IHJlLmNvbXBpbGUocidVUkw6ICguKyknKQpfc3ZuX3JldmlzaW9uX3JlID0gcmUuY29tcGlsZShyJ1JldmlzaW9uOiAoLispJykKX3N2bl9pbmZvX3htbF9yZXZfcmUgPSByZS5jb21waWxlKHInXHMqcmV2aXNpb249IihcZCspIicpCl9zdm5faW5mb194bWxfdXJsX3JlID0gcmUuY29tcGlsZShyJzx1cmw+KC4qKTwvdXJsPicpCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgU3VidmVyc2lvbihWZXJzaW9uQ29udHJvbCk6CiAgICBuYW1lID0gJ3N2bicKICAgIGRpcm5hbWUgPSAnLnN2bicKICAgIHJlcG9fbmFtZSA9ICdjaGVja291dCcKICAgIHNjaGVtZXMgPSAoJ3N2bicsICdzdm4rc3NoJywgJ3N2bitodHRwJywgJ3N2bitodHRwcycsICdzdm4rc3ZuJykKCiAgICBkZWYgZ2V0X2luZm8oc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIlJldHVybnMgKHVybCwgcmV2aXNpb24pLCB3aGVyZSBib3RoIGFyZSBzdHJpbmdzIiIiCiAgICAgICAgYXNzZXJ0IG5vdCBsb2NhdGlvbi5yc3RyaXAoJy8nKS5lbmRzd2l0aChzZWxmLmRpcm5hbWUpLCBcCiAgICAgICAgICAgICdCYWQgZGlyZWN0b3J5OiAlcycgJSBsb2NhdGlvbgogICAgICAgIG91dHB1dCA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsnaW5mbycsIGxvY2F0aW9uXSwKICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsCiAgICAgICAgICAgIGV4dHJhX2Vudmlyb249eydMQU5HJzogJ0MnfSwKICAgICAgICApCiAgICAgICAgbWF0Y2ggPSBfc3ZuX3VybF9yZS5zZWFyY2gob3V0cHV0KQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQ2Fubm90IGRldGVybWluZSBVUkwgb2Ygc3ZuIGNoZWNrb3V0ICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChsb2NhdGlvbiksCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdPdXRwdXQgdGhhdCBjYW5ub3QgYmUgcGFyc2VkOiBcbiVzJywgb3V0cHV0KQogICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQogICAgICAgIHVybCA9IG1hdGNoLmdyb3VwKDEpLnN0cmlwKCkKICAgICAgICBtYXRjaCA9IF9zdm5fcmV2aXNpb25fcmUuc2VhcmNoKG91dHB1dCkKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ0Nhbm5vdCBkZXRlcm1pbmUgcmV2aXNpb24gb2Ygc3ZuIGNoZWNrb3V0ICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChsb2NhdGlvbiksCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdPdXRwdXQgdGhhdCBjYW5ub3QgYmUgcGFyc2VkOiBcbiVzJywgb3V0cHV0KQogICAgICAgICAgICByZXR1cm4gdXJsLCBOb25lCiAgICAgICAgcmV0dXJuIHVybCwgbWF0Y2guZ3JvdXAoMSkKCiAgICBkZWYgZXhwb3J0KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJFeHBvcnQgdGhlIHN2biByZXBvc2l0b3J5IGF0IHRoZSB1cmwgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uIiIiCiAgICAgICAgdXJsLCByZXYgPSBzZWxmLmdldF91cmxfcmV2KCkKICAgICAgICByZXZfb3B0aW9ucyA9IGdldF9yZXZfb3B0aW9ucyh1cmwsIHJldikKICAgICAgICB1cmwgPSBzZWxmLnJlbW92ZV9hdXRoX2Zyb21fdXJsKHVybCkKICAgICAgICBsb2dnZXIuaW5mbygnRXhwb3J0aW5nIHN2biByZXBvc2l0b3J5ICVzIHRvICVzJywgdXJsLCBsb2NhdGlvbikKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobG9jYXRpb24pOgogICAgICAgICAgICAgICAgIyBTdWJ2ZXJzaW9uIGRvZXNuJ3QgbGlrZSB0byBjaGVjayBvdXQgb3ZlciBhbiBleGlzdGluZwogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkgLS1mb3JjZSBmaXhlcyB0aGlzLCBidXQgd2FzIG9ubHkgYWRkZWQgaW4gc3ZuIDEuNQogICAgICAgICAgICAgICAgcm10cmVlKGxvY2F0aW9uKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgWydleHBvcnQnXSArIHJldl9vcHRpb25zICsgW3VybCwgbG9jYXRpb25dLAogICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UpCgogICAgZGVmIHN3aXRjaChzZWxmLCBkZXN0LCB1cmwsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnc3dpdGNoJ10gKyByZXZfb3B0aW9ucyArIFt1cmwsIGRlc3RdKQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWyd1cGRhdGUnXSArIHJldl9vcHRpb25zICsgW2Rlc3RdKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgZGVzdCk6CiAgICAgICAgdXJsLCByZXYgPSBzZWxmLmdldF91cmxfcmV2KCkKICAgICAgICByZXZfb3B0aW9ucyA9IGdldF9yZXZfb3B0aW9ucyh1cmwsIHJldikKICAgICAgICB1cmwgPSBzZWxmLnJlbW92ZV9hdXRoX2Zyb21fdXJsKHVybCkKICAgICAgICBpZiByZXY6CiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJyAodG8gcmV2aXNpb24gJXMpJyAlIHJldgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJycKICAgICAgICBpZiBzZWxmLmNoZWNrX2Rlc3RpbmF0aW9uKGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnQ2hlY2tpbmcgb3V0ICVzJXMgdG8gJXMnLAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgcmV2X2Rpc3BsYXksCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2NoZWNrb3V0JywgJy1xJ10gKyByZXZfb3B0aW9ucyArIFt1cmwsIGRlc3RdKQoKICAgIGRlZiBnZXRfbG9jYXRpb24oc2VsZiwgZGlzdCwgZGVwZW5kZW5jeV9saW5rcyk6CiAgICAgICAgZm9yIHVybCBpbiBkZXBlbmRlbmN5X2xpbmtzOgogICAgICAgICAgICBlZ2dfZnJhZ21lbnQgPSBMaW5rKHVybCkuZWdnX2ZyYWdtZW50CiAgICAgICAgICAgIGlmIG5vdCBlZ2dfZnJhZ21lbnQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiAnLScgaW4gZWdnX2ZyYWdtZW50OgogICAgICAgICAgICAgICAgIyBGSVhNRTogd2lsbCB0aGlzIHdvcmsgd2hlbiBhIHBhY2thZ2UgaGFzIC0gaW4gdGhlIG5hbWU/CiAgICAgICAgICAgICAgICBrZXkgPSAnLScuam9pbihlZ2dfZnJhZ21lbnQuc3BsaXQoJy0nKVs6LTFdKS5sb3dlcigpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBrZXkgPSBlZ2dfZnJhZ21lbnQKICAgICAgICAgICAgaWYga2V5ID09IGRpc3Qua2V5OgogICAgICAgICAgICAgICAgcmV0dXJuIHVybC5zcGxpdCgnIycsIDEpWzBdCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG1heGltdW0gcmV2aXNpb24gZm9yIGFsbCBmaWxlcyB1bmRlciBhIGdpdmVuIGxvY2F0aW9uCiAgICAgICAgIiIiCiAgICAgICAgIyBOb3RlOiB0YWtlbiBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbwogICAgICAgIHJldmlzaW9uID0gMAoKICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayhsb2NhdGlvbik6CiAgICAgICAgICAgIGlmIHNlbGYuZGlybmFtZSBub3QgaW4gZGlyczoKICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQogICAgICAgICAgICAgICAgY29udGludWUgICAgIyBubyBzZW5zZSB3YWxraW5nIHVuY29udHJvbGxlZCBzdWJkaXJzCiAgICAgICAgICAgIGRpcnMucmVtb3ZlKHNlbGYuZGlybmFtZSkKICAgICAgICAgICAgZW50cmllc19mbiA9IG9zLnBhdGguam9pbihiYXNlLCBzZWxmLmRpcm5hbWUsICdlbnRyaWVzJykKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGVudHJpZXNfZm4pOgogICAgICAgICAgICAgICAgIyBGSVhNRTogc2hvdWxkIHdlIHdhcm4/CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZGlydXJsLCBsb2NhbHJldiA9IHNlbGYuX2dldF9zdm5fdXJsX3JldihiYXNlKQoKICAgICAgICAgICAgaWYgYmFzZSA9PSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgIGJhc2VfdXJsID0gZGlydXJsICsgJy8nICAgIyBzYXZlIHRoZSByb290IHVybAogICAgICAgICAgICBlbGlmIG5vdCBkaXJ1cmwgb3Igbm90IGRpcnVybC5zdGFydHN3aXRoKGJhc2VfdXJsKToKICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQogICAgICAgICAgICAgICAgY29udGludWUgICAgIyBub3QgcGFydCBvZiB0aGUgc2FtZSBzdm4gdHJlZSwgc2tpcCBpdAogICAgICAgICAgICByZXZpc2lvbiA9IG1heChyZXZpc2lvbiwgbG9jYWxyZXYpCiAgICAgICAgcmV0dXJuIHJldmlzaW9uCgogICAgZGVmIGdldF91cmxfcmV2KHNlbGYpOgogICAgICAgICMgaG90Zml4IHRoZSBVUkwgc2NoZW1lIGFmdGVyIHJlbW92aW5nIHN2bisgZnJvbSBzdm4rc3NoOi8vIHJlYWRkIGl0CiAgICAgICAgdXJsLCByZXYgPSBzdXBlcihTdWJ2ZXJzaW9uLCBzZWxmKS5nZXRfdXJsX3JldigpCiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJ3NzaDovLycpOgogICAgICAgICAgICB1cmwgPSAnc3ZuKycgKyB1cmwKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgZ2V0X3VybChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIyBJbiBjYXNlcyB3aGVyZSB0aGUgc291cmNlIGlzIGluIGEgc3ViZGlyZWN0b3J5LCBub3QgYWxvbmdzaWRlCiAgICAgICAgIyBzZXR1cC5weSB3ZSBoYXZlIHRvIGxvb2sgdXAgaW4gdGhlIGxvY2F0aW9uIHVudGlsIHdlIGZpbmQgYSByZWFsCiAgICAgICAgIyBzZXR1cC5weQogICAgICAgIG9yaWdfbG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgIHdoaWxlIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4obG9jYXRpb24sICdzZXR1cC5weScpKToKICAgICAgICAgICAgbGFzdF9sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgICAgIGxvY2F0aW9uID0gb3MucGF0aC5kaXJuYW1lKGxvY2F0aW9uKQogICAgICAgICAgICBpZiBsb2NhdGlvbiA9PSBsYXN0X2xvY2F0aW9uOgogICAgICAgICAgICAgICAgIyBXZSd2ZSB0cmF2ZXJzZWQgdXAgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGVzeXN0ZW0gd2l0aG91dAogICAgICAgICAgICAgICAgIyBmaW5kaW5nIHNldHVwLnB5CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgc2V0dXAucHkgZm9yIGRpcmVjdG9yeSAlcyAodHJpZWQgYWxsICIKICAgICAgICAgICAgICAgICAgICAicGFyZW50IGRpcmVjdG9yaWVzKSIsCiAgICAgICAgICAgICAgICAgICAgb3JpZ19sb2NhdGlvbiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfc3ZuX3VybF9yZXYobG9jYXRpb24pWzBdCgogICAgZGVmIF9nZXRfc3ZuX3VybF9yZXYoc2VsZiwgbG9jYXRpb24pOgogICAgICAgIGZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEluc3RhbGxhdGlvbkVycm9yCgogICAgICAgIGVudHJpZXNfcGF0aCA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgc2VsZi5kaXJuYW1lLCAnZW50cmllcycpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZW50cmllc19wYXRoKToKICAgICAgICAgICAgd2l0aCBvcGVuKGVudHJpZXNfcGF0aCkgYXMgZjoKICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgIGVsc2U6ICAjIHN1YnZlcnNpb24gPj0gMS43IGRvZXMgbm90IGhhdmUgdGhlICdlbnRyaWVzJyBmaWxlCiAgICAgICAgICAgIGRhdGEgPSAnJwoKICAgICAgICBpZiAoZGF0YS5zdGFydHN3aXRoKCc4Jykgb3IKICAgICAgICAgICAgICAgIGRhdGEuc3RhcnRzd2l0aCgnOScpIG9yCiAgICAgICAgICAgICAgICBkYXRhLnN0YXJ0c3dpdGgoJzEwJykpOgogICAgICAgICAgICBkYXRhID0gbGlzdChtYXAoc3RyLnNwbGl0bGluZXMsIGRhdGEuc3BsaXQoJ1xuXHgwY1xuJykpKQogICAgICAgICAgICBkZWwgZGF0YVswXVswXSAgIyBnZXQgcmlkIG9mIHRoZSAnOCcKICAgICAgICAgICAgdXJsID0gZGF0YVswXVszXQogICAgICAgICAgICByZXZzID0gW2ludChkWzldKSBmb3IgZCBpbiBkYXRhIGlmIGxlbihkKSA+IDkgYW5kIGRbOV1dICsgWzBdCiAgICAgICAgZWxpZiBkYXRhLnN0YXJ0c3dpdGgoJzw/eG1sJyk6CiAgICAgICAgICAgIG1hdGNoID0gX3N2bl94bWxfdXJsX3JlLnNlYXJjaChkYXRhKQogICAgICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdCYWRseSBmb3JtYXR0ZWQgZGF0YTogJXInICUgZGF0YSkKICAgICAgICAgICAgdXJsID0gbWF0Y2guZ3JvdXAoMSkgICAgIyBnZXQgcmVwb3NpdG9yeSBVUkwKICAgICAgICAgICAgcmV2cyA9IFtpbnQobS5ncm91cCgxKSkgZm9yIG0gaW4gX3N2bl9yZXZfcmUuZmluZGl0ZXIoZGF0YSldICsgWzBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBzdWJ2ZXJzaW9uID49IDEuNwogICAgICAgICAgICAgICAgeG1sID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgICAgICAgICBbJ2luZm8nLCAnLS14bWwnLCBsb2NhdGlvbl0sCiAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB1cmwgPSBfc3ZuX2luZm9feG1sX3VybF9yZS5zZWFyY2goeG1sKS5ncm91cCgxKQogICAgICAgICAgICAgICAgcmV2cyA9IFsKICAgICAgICAgICAgICAgICAgICBpbnQobS5ncm91cCgxKSkgZm9yIG0gaW4gX3N2bl9pbmZvX3htbF9yZXZfcmUuZmluZGl0ZXIoeG1sKQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICBleGNlcHQgSW5zdGFsbGF0aW9uRXJyb3I6CiAgICAgICAgICAgICAgICB1cmwsIHJldnMgPSBOb25lLCBbXQoKICAgICAgICBpZiByZXZzOgogICAgICAgICAgICByZXYgPSBtYXgocmV2cykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXYgPSAwCgogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXRfdXJsKGxvY2F0aW9uKQogICAgICAgIGlmIHJlcG8gaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAjIEZJWE1FOiB3aHkgbm90IHByb2plY3QgbmFtZT8KICAgICAgICBlZ2dfcHJvamVjdF9uYW1lID0gZGlzdC5lZ2dfbmFtZSgpLnNwbGl0KCctJywgMSlbMF0KICAgICAgICByZXYgPSBzZWxmLmdldF9yZXZpc2lvbihsb2NhdGlvbikKICAgICAgICByZXR1cm4gJ3N2bislc0AlcyNlZ2c9JXMnICUgKHJlcG8sIHJldiwgZWdnX3Byb2plY3RfbmFtZSkKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiQWx3YXlzIGFzc3VtZSB0aGUgdmVyc2lvbnMgZG9uJ3QgbWF0Y2giIiIKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcmVtb3ZlX2F1dGhfZnJvbV91cmwodXJsKToKICAgICAgICAjIFJldHVybiBhIGNvcHkgb2YgdXJsIHdpdGggJ3VzZXJuYW1lOnBhc3N3b3JkQCcgcmVtb3ZlZC4KICAgICAgICAjIHVzZXJuYW1lL3Bhc3MgcGFyYW1zIGFyZSBwYXNzZWQgdG8gc3VidmVyc2lvbiB0aHJvdWdoIGZsYWdzCiAgICAgICAgIyBhbmQgYXJlIG5vdCByZWNvZ25pemVkIGluIHRoZSB1cmwuCgogICAgICAgICMgcGFyc2VkIHVybAogICAgICAgIHB1cmwgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQogICAgICAgIHN0cmlwcGVkX25ldGxvYyA9IFwKICAgICAgICAgICAgcHVybC5uZXRsb2Muc3BsaXQoJ0AnKVstMV0KCiAgICAgICAgIyBzdHJpcHBlZCB1cmwKICAgICAgICB1cmxfcGllY2VzID0gKAogICAgICAgICAgICBwdXJsLnNjaGVtZSwgc3RyaXBwZWRfbmV0bG9jLCBwdXJsLnBhdGgsIHB1cmwucXVlcnksIHB1cmwuZnJhZ21lbnQKICAgICAgICApCiAgICAgICAgc3VybCA9IHVybGxpYl9wYXJzZS51cmx1bnNwbGl0KHVybF9waWVjZXMpCiAgICAgICAgcmV0dXJuIHN1cmwKCgpkZWYgZ2V0X3Jldl9vcHRpb25zKHVybCwgcmV2KToKICAgIGlmIHJldjoKICAgICAgICByZXZfb3B0aW9ucyA9IFsnLXInLCByZXZdCiAgICBlbHNlOgogICAgICAgIHJldl9vcHRpb25zID0gW10KCiAgICByID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHVybCkKICAgIGlmIGhhc2F0dHIociwgJ3VzZXJuYW1lJyk6CiAgICAgICAgIyA+PSBQeXRob24tMi41CiAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gci51c2VybmFtZSwgci5wYXNzd29yZAogICAgZWxzZToKICAgICAgICBuZXRsb2MgPSByWzFdCiAgICAgICAgaWYgJ0AnIGluIG5ldGxvYzoKICAgICAgICAgICAgYXV0aCA9IG5ldGxvYy5zcGxpdCgnQCcpWzBdCiAgICAgICAgICAgIGlmICc6JyBpbiBhdXRoOgogICAgICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gYXV0aC5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBhdXRoLCBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gTm9uZSwgTm9uZQoKICAgIGlmIHVzZXJuYW1lOgogICAgICAgIHJldl9vcHRpb25zICs9IFsnLS11c2VybmFtZScsIHVzZXJuYW1lXQogICAgaWYgcGFzc3dvcmQ6CiAgICAgICAgcmV2X29wdGlvbnMgKz0gWyctLXBhc3N3b3JkJywgcGFzc3dvcmRdCiAgICByZXR1cm4gcmV2X29wdGlvbnMKCgp2Y3MucmVnaXN0ZXIoU3VidmVyc2lvbikKUEsDBBQAAAAAAAAAIQB9mSA7Cn0AAAp9AAApAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvd2hlZWwucHkiIiIKU3VwcG9ydCBmb3IgaW5zdGFsbGluZyBhbmQgYnVpbGRpbmcgdGhlICJ3aGVlbCIgYmluYXJ5IHBhY2thZ2UgZm9ybWF0LgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBjb21waWxlYWxsCmltcG9ydCBjc3YKaW1wb3J0IGVycm5vCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBvcy5wYXRoCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzdGF0CmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBiYXNlNjQgaW1wb3J0IHVybHNhZmVfYjY0ZW5jb2RlCmZyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBTdHJpbmdJTwoKaW1wb3J0IHBpcApmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGV4cGFuZHVzZXIKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IHBhdGhfdG9fdXJsLCB1bnBhY2tfdXJsCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEluc3RhbGxhdGlvbkVycm9yLCBJbnZhbGlkV2hlZWxGaWxlbmFtZSwgVW5zdXBwb3J0ZWRXaGVlbCkKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCBkaXN0dXRpbHNfc2NoZW1lLCBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRQpmcm9tIHBpcCBpbXBvcnQgcGVwNDI1dGFncwpmcm9tIHBpcC51dGlscyBpbXBvcnQgKAogICAgY2FsbF9zdWJwcm9jZXNzLCBlbnN1cmVfZGlyLCBjYXB0dXJlZF9zdGRvdXQsIHJtdHJlZSwgcmVhZF9jaHVua3MsCikKZnJvbSBwaXAudXRpbHMudWkgaW1wb3J0IG9wZW5fc3Bpbm5lcgpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnV0aWxzLnNldHVwdG9vbHNfYnVpbGQgaW1wb3J0IFNFVFVQVE9PTFNfU0hJTQpmcm9tIHBpcC5fdmVuZG9yLmRpc3RsaWIuc2NyaXB0cyBpbXBvcnQgU2NyaXB0TWFrZXIKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy51dGlscyBpbXBvcnQgY2Fub25pY2FsaXplX25hbWUKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgoKCndoZWVsX2V4dCA9ICcud2hsJwoKVkVSU0lPTl9DT01QQVRJQkxFID0gKDEsIDApCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgV2hlZWxDYWNoZShvYmplY3QpOgogICAgIiIiQSBjYWNoZSBvZiB3aGVlbHMgZm9yIGZ1dHVyZSBpbnN0YWxscy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGVfZGlyLCBmb3JtYXRfY29udHJvbCk6CiAgICAgICAgIiIiQ3JlYXRlIGEgd2hlZWwgY2FjaGUuCgogICAgICAgIDpwYXJhbSBjYWNoZV9kaXI6IFRoZSByb290IG9mIHRoZSBjYWNoZS4KICAgICAgICA6cGFyYW0gZm9ybWF0X2NvbnRyb2w6IEEgcGlwLmluZGV4LkZvcm1hdENvbnRyb2wgb2JqZWN0IHRvIGxpbWl0CiAgICAgICAgICAgIGJpbmFyaWVzIGJlaW5nIHJlYWQgZnJvbSB0aGUgY2FjaGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2FjaGVfZGlyID0gZXhwYW5kdXNlcihjYWNoZV9kaXIpIGlmIGNhY2hlX2RpciBlbHNlIE5vbmUKICAgICAgICBzZWxmLl9mb3JtYXRfY29udHJvbCA9IGZvcm1hdF9jb250cm9sCgogICAgZGVmIGNhY2hlZF93aGVlbChzZWxmLCBsaW5rLCBwYWNrYWdlX25hbWUpOgogICAgICAgIHJldHVybiBjYWNoZWRfd2hlZWwoCiAgICAgICAgICAgIHNlbGYuX2NhY2hlX2RpciwgbGluaywgc2VsZi5fZm9ybWF0X2NvbnRyb2wsIHBhY2thZ2VfbmFtZSkKCgpkZWYgX2NhY2hlX2Zvcl9saW5rKGNhY2hlX2RpciwgbGluayk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpcmVjdG9yeSB0byBzdG9yZSBjYWNoZWQgd2hlZWxzIGluIGZvciBsaW5rLgoKICAgIEJlY2F1c2UgdGhlcmUgYXJlIE0gd2hlZWxzIGZvciBhbnkgb25lIHNkaXN0LCB3ZSBwcm92aWRlIGEgZGlyZWN0b3J5CiAgICB0byBjYWNoZSB0aGVtIGluLCBhbmQgdGhlbiBjb25zdWx0IHRoYXQgZGlyZWN0b3J5IHdoZW4gbG9va2luZyB1cAogICAgY2FjaGUgaGl0cy4KCiAgICBXZSBvbmx5IGluc2VydCB0aGluZ3MgaW50byB0aGUgY2FjaGUgaWYgdGhleSBoYXZlIHBsYXVzaWJsZSB2ZXJzaW9uCiAgICBudW1iZXJzLCBzbyB0aGF0IHdlIGRvbid0IGNvbnRhbWluYXRlIHRoZSBjYWNoZSB3aXRoIHRoaW5ncyB0aGF0IHdlcmUgbm90CiAgICB1bmlxdWUuIEUuZy4gLi9wYWNrYWdlIG1pZ2h0IGhhdmUgZG96ZW5zIG9mIGluc3RhbGxzIGRvbmUgZm9yIGl0IGFuZCBidWlsZAogICAgYSB2ZXJzaW9uIG9mIDAuMC4uLmFuZCBpZiB3ZSBidWlsdCBhbmQgY2FjaGVkIGEgd2hlZWwsIHdlJ2QgZW5kIHVwIHVzaW5nCiAgICB0aGUgc2FtZSB3aGVlbCBldmVuIGlmIHRoZSBzb3VyY2UgaGFzIGJlZW4gZWRpdGVkLgoKICAgIDpwYXJhbSBjYWNoZV9kaXI6IFRoZSBjYWNoZV9kaXIgYmVpbmcgdXNlZCBieSBwaXAuCiAgICA6cGFyYW0gbGluazogVGhlIGxpbmsgb2YgdGhlIHNkaXN0IGZvciB3aGljaCB0aGlzIHdpbGwgY2FjaGUgd2hlZWxzLgogICAgIiIiCgogICAgIyBXZSB3YW50IHRvIGdlbmVyYXRlIGFuIHVybCB0byB1c2UgYXMgb3VyIGNhY2hlIGtleSwgd2UgZG9uJ3Qgd2FudCB0byBqdXN0CiAgICAjIHJlLXVzZSB0aGUgVVJMIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBvdGhlciBpdGVtcyBpbiB0aGUgZnJhZ21lbnQgYW5kIHdlCiAgICAjIGRvbid0IGNhcmUgYWJvdXQgdGhvc2UuCiAgICBrZXlfcGFydHMgPSBbbGluay51cmxfd2l0aG91dF9mcmFnbWVudF0KICAgIGlmIGxpbmsuaGFzaF9uYW1lIGlzIG5vdCBOb25lIGFuZCBsaW5rLmhhc2ggaXMgbm90IE5vbmU6CiAgICAgICAga2V5X3BhcnRzLmFwcGVuZCgiPSIuam9pbihbbGluay5oYXNoX25hbWUsIGxpbmsuaGFzaF0pKQogICAga2V5X3VybCA9ICIjIi5qb2luKGtleV9wYXJ0cykKCiAgICAjIEVuY29kZSBvdXIga2V5IHVybCB3aXRoIHNoYTIyNCwgd2UnbGwgdXNlIHRoaXMgYmVjYXVzZSBpdCBoYXMgc2ltaWxhcgogICAgIyBzZWN1cml0eSBwcm9wZXJ0aWVzIHRvIHNoYTI1NiwgYnV0IHdpdGggYSBzaG9ydGVyIHRvdGFsIG91dHB1dCAoYW5kIHRodXMKICAgICMgbGVzcyBzZWN1cmUpLiBIb3dldmVyIHRoZSBkaWZmZXJlbmNlcyBkb24ndCBtYWtlIGEgbG90IG9mIGRpZmZlcmVuY2UgZm9yCiAgICAjIG91ciB1c2UgY2FzZSBoZXJlLgogICAgaGFzaGVkID0gaGFzaGxpYi5zaGEyMjQoa2V5X3VybC5lbmNvZGUoKSkuaGV4ZGlnZXN0KCkKCiAgICAjIFdlIHdhbnQgdG8gbmVzdCB0aGUgZGlyZWN0b3JpZXMgc29tZSB0byBwcmV2ZW50IGhhdmluZyBhIHRvbiBvZiB0b3AgbGV2ZWwKICAgICMgZGlyZWN0b3JpZXMgd2hlcmUgd2UgbWlnaHQgcnVuIG91dCBvZiBzdWIgZGlyZWN0b3JpZXMgb24gc29tZSBGUy4KICAgIHBhcnRzID0gW2hhc2hlZFs6Ml0sIGhhc2hlZFsyOjRdLCBoYXNoZWRbNDo2XSwgaGFzaGVkWzY6XV0KCiAgICAjIEluc2lkZSBvZiB0aGUgYmFzZSBsb2NhdGlvbiBmb3IgY2FjaGVkIHdoZWVscywgZXhwYW5kIG91ciBwYXJ0cyBhbmQgam9pbgogICAgIyB0aGVtIGFsbCB0b2dldGhlci4KICAgIHJldHVybiBvcy5wYXRoLmpvaW4oY2FjaGVfZGlyLCAid2hlZWxzIiwgKnBhcnRzKQoKCmRlZiBjYWNoZWRfd2hlZWwoY2FjaGVfZGlyLCBsaW5rLCBmb3JtYXRfY29udHJvbCwgcGFja2FnZV9uYW1lKToKICAgIGlmIG5vdCBjYWNoZV9kaXI6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGlmIG5vdCBsaW5rOgogICAgICAgIHJldHVybiBsaW5rCiAgICBpZiBsaW5rLmlzX3doZWVsOgogICAgICAgIHJldHVybiBsaW5rCiAgICBpZiBub3QgbGluay5pc19hcnRpZmFjdDoKICAgICAgICByZXR1cm4gbGluawogICAgaWYgbm90IHBhY2thZ2VfbmFtZToKICAgICAgICByZXR1cm4gbGluawogICAgY2Fub25pY2FsX25hbWUgPSBjYW5vbmljYWxpemVfbmFtZShwYWNrYWdlX25hbWUpCiAgICBmb3JtYXRzID0gcGlwLmluZGV4LmZtdF9jdGxfZm9ybWF0cyhmb3JtYXRfY29udHJvbCwgY2Fub25pY2FsX25hbWUpCiAgICBpZiAiYmluYXJ5IiBub3QgaW4gZm9ybWF0czoKICAgICAgICByZXR1cm4gbGluawogICAgcm9vdCA9IF9jYWNoZV9mb3JfbGluayhjYWNoZV9kaXIsIGxpbmspCiAgICB0cnk6CiAgICAgICAgd2hlZWxfbmFtZXMgPSBvcy5saXN0ZGlyKHJvb3QpCiAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgIGlmIGUuZXJybm8gaW4gKGVycm5vLkVOT0VOVCwgZXJybm8uRU5PVERJUik6CiAgICAgICAgICAgIHJldHVybiBsaW5rCiAgICAgICAgcmFpc2UKICAgIGNhbmRpZGF0ZXMgPSBbXQogICAgZm9yIHdoZWVsX25hbWUgaW4gd2hlZWxfbmFtZXM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGVlbCA9IFdoZWVsKHdoZWVsX25hbWUpCiAgICAgICAgZXhjZXB0IEludmFsaWRXaGVlbEZpbGVuYW1lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIG5vdCB3aGVlbC5zdXBwb3J0ZWQoKToKICAgICAgICAgICAgIyBCdWlsdCBmb3IgYSBkaWZmZXJlbnQgcHl0aG9uL2FyY2gvZXRjCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoKHdoZWVsLnN1cHBvcnRfaW5kZXhfbWluKCksIHdoZWVsX25hbWUpKQogICAgaWYgbm90IGNhbmRpZGF0ZXM6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGNhbmRpZGF0ZXMuc29ydCgpCiAgICBwYXRoID0gb3MucGF0aC5qb2luKHJvb3QsIGNhbmRpZGF0ZXNbMF1bMV0pCiAgICByZXR1cm4gcGlwLmluZGV4LkxpbmsocGF0aF90b191cmwocGF0aCkpCgoKZGVmIHJlaGFzaChwYXRoLCBhbGdvPSdzaGEyNTYnLCBibG9ja3NpemU9MSA8PCAyMCk6CiAgICAiIiJSZXR1cm4gKGhhc2gsIGxlbmd0aCkgZm9yIHBhdGggdXNpbmcgaGFzaGxpYi5uZXcoYWxnbykiIiIKICAgIGggPSBoYXNobGliLm5ldyhhbGdvKQogICAgbGVuZ3RoID0gMAogICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CiAgICAgICAgZm9yIGJsb2NrIGluIHJlYWRfY2h1bmtzKGYsIHNpemU9YmxvY2tzaXplKToKICAgICAgICAgICAgbGVuZ3RoICs9IGxlbihibG9jaykKICAgICAgICAgICAgaC51cGRhdGUoYmxvY2spCiAgICBkaWdlc3QgPSAnc2hhMjU2PScgKyB1cmxzYWZlX2I2NGVuY29kZSgKICAgICAgICBoLmRpZ2VzdCgpCiAgICApLmRlY29kZSgnbGF0aW4xJykucnN0cmlwKCc9JykKICAgIHJldHVybiAoZGlnZXN0LCBsZW5ndGgpCgoKZGVmIG9wZW5fZm9yX2NzdihuYW1lLCBtb2RlKToKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgIG5sID0ge30KICAgICAgICBiaW4gPSAnYicKICAgIGVsc2U6CiAgICAgICAgbmwgPSB7J25ld2xpbmUnOiAnJ30KICAgICAgICBiaW4gPSAnJwogICAgcmV0dXJuIG9wZW4obmFtZSwgbW9kZSArIGJpbiwgKipubCkKCgpkZWYgZml4X3NjcmlwdChwYXRoKToKICAgICIiIlJlcGxhY2UgIyFweXRob24gd2l0aCAjIS9wYXRoL3RvL3B5dGhvbgogICAgUmV0dXJuIFRydWUgaWYgZmlsZSB3YXMgY2hhbmdlZC4iIiIKICAgICMgWFhYIFJFQ09SRCBoYXNoZXMgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQKICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBzY3JpcHQ6CiAgICAgICAgICAgIGZpcnN0bGluZSA9IHNjcmlwdC5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBmaXJzdGxpbmUuc3RhcnRzd2l0aChiJyMhcHl0aG9uJyk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgZXhlbmFtZSA9IHN5cy5leGVjdXRhYmxlLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgICAgIGZpcnN0bGluZSA9IGInIyEnICsgZXhlbmFtZSArIG9zLmxpbmVzZXAuZW5jb2RlKCJhc2NpaSIpCiAgICAgICAgICAgIHJlc3QgPSBzY3JpcHQucmVhZCgpCiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd3YicpIGFzIHNjcmlwdDoKICAgICAgICAgICAgc2NyaXB0LndyaXRlKGZpcnN0bGluZSkKICAgICAgICAgICAgc2NyaXB0LndyaXRlKHJlc3QpCiAgICAgICAgcmV0dXJuIFRydWUKCmRpc3RfaW5mb19yZSA9IHJlLmNvbXBpbGUociIiIl4oP1A8bmFtZXZlcj4oP1A8bmFtZT4uKz8pKC0oP1A8dmVyPlxkLis/KSk/KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwuZGlzdC1pbmZvJCIiIiwgcmUuVkVSQk9TRSkKCgpkZWYgcm9vdF9pc19wdXJlbGliKG5hbWUsIHdoZWVsZGlyKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgdGhlIGV4dHJhY3RlZCB3aGVlbCBpbiB3aGVlbGRpciBzaG91bGQgZ28gaW50byBwdXJlbGliLgogICAgIiIiCiAgICBuYW1lX2ZvbGRlZCA9IG5hbWUucmVwbGFjZSgiLSIsICJfIikKICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIod2hlZWxkaXIpOgogICAgICAgIG1hdGNoID0gZGlzdF9pbmZvX3JlLm1hdGNoKGl0ZW0pCiAgICAgICAgaWYgbWF0Y2ggYW5kIG1hdGNoLmdyb3VwKCduYW1lJykgPT0gbmFtZV9mb2xkZWQ6CiAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4od2hlZWxkaXIsIGl0ZW0sICdXSEVFTCcpKSBhcyB3aGVlbDoKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHdoZWVsOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmxvd2VyKCkucnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICJyb290LWlzLXB1cmVsaWI6IHRydWUiOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGdldF9lbnRyeXBvaW50cyhmaWxlbmFtZSk6CiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgIHJldHVybiB7fSwge30KCiAgICAjIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHlvdSBjYW4gcGFzcyBhIHN0cmluZyB0byBlbnRyeV9wb2ludHMgd3JhcHBlcnMgd2hpY2gKICAgICMgbWVhbnMgdGhhdCB0aGV5IG1heSBvciBtYXkgbm90IGJlIHZhbGlkIElOSSBmaWxlcy4gVGhlIGF0dGVtcHQgaGVyZSBpcyB0bwogICAgIyBzdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGluIG9yZGVyIHRvIG1ha2UgdGhlbSB2YWxpZCBJTkkKICAgICMgZmlsZXMuCiAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGZwOgogICAgICAgIGRhdGEgPSBTdHJpbmdJTygpCiAgICAgICAgZm9yIGxpbmUgaW4gZnA6CiAgICAgICAgICAgIGRhdGEud3JpdGUobGluZS5zdHJpcCgpKQogICAgICAgICAgICBkYXRhLndyaXRlKCJcbiIpCiAgICAgICAgZGF0YS5zZWVrKDApCgogICAgY3AgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKICAgIGNwLm9wdGlvbnhmb3JtID0gbGFtYmRhIG9wdGlvbjogb3B0aW9uCiAgICBjcC5yZWFkZnAoZGF0YSkKCiAgICBjb25zb2xlID0ge30KICAgIGd1aSA9IHt9CiAgICBpZiBjcC5oYXNfc2VjdGlvbignY29uc29sZV9zY3JpcHRzJyk6CiAgICAgICAgY29uc29sZSA9IGRpY3QoY3AuaXRlbXMoJ2NvbnNvbGVfc2NyaXB0cycpKQogICAgaWYgY3AuaGFzX3NlY3Rpb24oJ2d1aV9zY3JpcHRzJyk6CiAgICAgICAgZ3VpID0gZGljdChjcC5pdGVtcygnZ3VpX3NjcmlwdHMnKSkKICAgIHJldHVybiBjb25zb2xlLCBndWkKCgpkZWYgbW92ZV93aGVlbF9maWxlcyhuYW1lLCByZXEsIHdoZWVsZGlyLCB1c2VyPUZhbHNlLCBob21lPU5vbmUsIHJvb3Q9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgcHljb21waWxlPVRydWUsIHNjaGVtZT1Ob25lLCBpc29sYXRlZD1GYWxzZSwgcHJlZml4PU5vbmUpOgogICAgIiIiSW5zdGFsbCBhIHdoZWVsIiIiCgogICAgaWYgbm90IHNjaGVtZToKICAgICAgICBzY2hlbWUgPSBkaXN0dXRpbHNfc2NoZW1lKAogICAgICAgICAgICBuYW1lLCB1c2VyPXVzZXIsIGhvbWU9aG9tZSwgcm9vdD1yb290LCBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgcHJlZml4PXByZWZpeCwKICAgICAgICApCgogICAgaWYgcm9vdF9pc19wdXJlbGliKG5hbWUsIHdoZWVsZGlyKToKICAgICAgICBsaWJfZGlyID0gc2NoZW1lWydwdXJlbGliJ10KICAgIGVsc2U6CiAgICAgICAgbGliX2RpciA9IHNjaGVtZVsncGxhdGxpYiddCgogICAgaW5mb19kaXIgPSBbXQogICAgZGF0YV9kaXJzID0gW10KICAgIHNvdXJjZSA9IHdoZWVsZGlyLnJzdHJpcChvcy5wYXRoLnNlcCkgKyBvcy5wYXRoLnNlcAoKICAgICMgUmVjb3JkIGRldGFpbHMgb2YgdGhlIGZpbGVzIG1vdmVkCiAgICAjICAgaW5zdGFsbGVkID0gZmlsZXMgY29waWVkIGZyb20gdGhlIHdoZWVsIHRvIHRoZSBkZXN0aW5hdGlvbgogICAgIyAgIGNoYW5nZWQgPSBmaWxlcyBjaGFuZ2VkIHdoaWxlIGluc3RhbGxpbmcgKHNjcmlwdHMgIyEgbGluZSB0eXBpY2FsbHkpCiAgICAjICAgZ2VuZXJhdGVkID0gZmlsZXMgbmV3bHkgZ2VuZXJhdGVkIGR1cmluZyB0aGUgaW5zdGFsbCAoc2NyaXB0IHdyYXBwZXJzKQogICAgaW5zdGFsbGVkID0ge30KICAgIGNoYW5nZWQgPSBzZXQoKQogICAgZ2VuZXJhdGVkID0gW10KCiAgICAjIENvbXBpbGUgYWxsIG9mIHRoZSBweWMgZmlsZXMgdGhhdCB3ZSdyZSBnb2luZyB0byBiZSBpbnN0YWxsaW5nCiAgICBpZiBweWNvbXBpbGU6CiAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CiAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnKQogICAgICAgICAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2Rpcihzb3VyY2UsIGZvcmNlPVRydWUsIHF1aWV0PVRydWUpCiAgICAgICAgbG9nZ2VyLmRlYnVnKHN0ZG91dC5nZXR2YWx1ZSgpKQoKICAgIGRlZiBub3JtcGF0aChzcmMsIHApOgogICAgICAgIHJldHVybiBvcy5wYXRoLnJlbHBhdGgoc3JjLCBwKS5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCgogICAgZGVmIHJlY29yZF9pbnN0YWxsZWQoc3JjZmlsZSwgZGVzdGZpbGUsIG1vZGlmaWVkPUZhbHNlKToKICAgICAgICAiIiJNYXAgYXJjaGl2ZSBSRUNPUkQgcGF0aHMgdG8gaW5zdGFsbGF0aW9uIFJFQ09SRCBwYXRocy4iIiIKICAgICAgICBvbGRwYXRoID0gbm9ybXBhdGgoc3JjZmlsZSwgd2hlZWxkaXIpCiAgICAgICAgbmV3cGF0aCA9IG5vcm1wYXRoKGRlc3RmaWxlLCBsaWJfZGlyKQogICAgICAgIGluc3RhbGxlZFtvbGRwYXRoXSA9IG5ld3BhdGgKICAgICAgICBpZiBtb2RpZmllZDoKICAgICAgICAgICAgY2hhbmdlZC5hZGQoZGVzdGZpbGUpCgogICAgZGVmIGNsb2JiZXIoc291cmNlLCBkZXN0LCBpc19iYXNlLCBmaXhlcj1Ob25lLCBmaWx0ZXI9Tm9uZSk6CiAgICAgICAgZW5zdXJlX2RpcihkZXN0KSAgIyBjb21tb24gZm9yIHRoZSAnaW5jbHVkZScgcGF0aAoKICAgICAgICBmb3IgZGlyLCBzdWJkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNvdXJjZSk6CiAgICAgICAgICAgIGJhc2VkaXIgPSBkaXJbbGVuKHNvdXJjZSk6XS5sc3RyaXAob3MucGF0aC5zZXApCiAgICAgICAgICAgIGRlc3RkaXIgPSBvcy5wYXRoLmpvaW4oZGVzdCwgYmFzZWRpcikKICAgICAgICAgICAgaWYgaXNfYmFzZSBhbmQgYmFzZWRpci5zcGxpdChvcy5wYXRoLnNlcCwgMSlbMF0uZW5kc3dpdGgoJy5kYXRhJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmb3IgcyBpbiBzdWJkaXJzOgogICAgICAgICAgICAgICAgZGVzdHN1YmRpciA9IG9zLnBhdGguam9pbihkZXN0LCBiYXNlZGlyLCBzKQogICAgICAgICAgICAgICAgaWYgaXNfYmFzZSBhbmQgYmFzZWRpciA9PSAnJyBhbmQgZGVzdHN1YmRpci5lbmRzd2l0aCgnLmRhdGEnKToKICAgICAgICAgICAgICAgICAgICBkYXRhX2RpcnMuYXBwZW5kKHMpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsaWYgKGlzX2Jhc2UgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIHMuZW5kc3dpdGgoJy5kaXN0LWluZm8nKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplX25hbWUocykuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZV9uYW1lKHJlcS5uYW1lKSkpOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBub3QgaW5mb19kaXIsICgnTXVsdGlwbGUgLmRpc3QtaW5mbyBkaXJlY3RvcmllczogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RzdWJkaXIgKyAnLCAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgJy5qb2luKGluZm9fZGlyKSkKICAgICAgICAgICAgICAgICAgICBpbmZvX2Rpci5hcHBlbmQoZGVzdHN1YmRpcikKICAgICAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAjIFNraXAgdW53YW50ZWQgZmlsZXMKICAgICAgICAgICAgICAgIGlmIGZpbHRlciBhbmQgZmlsdGVyKGYpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzcmNmaWxlID0gb3MucGF0aC5qb2luKGRpciwgZikKICAgICAgICAgICAgICAgIGRlc3RmaWxlID0gb3MucGF0aC5qb2luKGRlc3QsIGJhc2VkaXIsIGYpCiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeSBjcmVhdGlvbiBpcyBsYXp5IGFuZCBhZnRlciB0aGUgZmlsZSBmaWx0ZXJpbmcgYWJvdmUKICAgICAgICAgICAgICAgICMgdG8gZW5zdXJlIHdlIGRvbid0IGluc3RhbGwgZW1wdHkgZGlyczsgZW1wdHkgZGlycyBjYW4ndCBiZQogICAgICAgICAgICAgICAgIyB1bmluc3RhbGxlZC4KICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIoZGVzdGRpcikKCiAgICAgICAgICAgICAgICAjIFdlIHVzZSBjb3B5ZmlsZSAobm90IG1vdmUsIGNvcHksIG9yIGNvcHkyKSB0byBiZSBleHRyYSBzdXJlCiAgICAgICAgICAgICAgICAjIHRoYXQgd2UgYXJlIG5vdCBtb3ZpbmcgZGlyZWN0b3JpZXMgb3ZlciAoY29weWZpbGUgZmFpbHMgZm9yCiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yaWVzKSBhcyB3ZWxsIGFzIHRvIGVuc3VyZSB0aGF0IHdlIGFyZSBub3QgY29weWluZwogICAgICAgICAgICAgICAgIyBvdmVyIGFueSBtZXRhZGF0YSBiZWNhdXNlIHdlIHdhbnQgbW9yZSBjb250cm9sIG92ZXIgd2hhdAogICAgICAgICAgICAgICAgIyBtZXRhZGF0YSB3ZSBhY3R1YWxseSBjb3B5IG92ZXIuCiAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoc3JjZmlsZSwgZGVzdGZpbGUpCgogICAgICAgICAgICAgICAgIyBDb3B5IG92ZXIgdGhlIG1ldGFkYXRhIGZvciB0aGUgZmlsZSwgY3VycmVudGx5IHRoaXMgb25seQogICAgICAgICAgICAgICAgIyBpbmNsdWRlcyB0aGUgYXRpbWUgYW5kIG10aW1lLgogICAgICAgICAgICAgICAgc3QgPSBvcy5zdGF0KHNyY2ZpbGUpCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAidXRpbWUiKToKICAgICAgICAgICAgICAgICAgICBvcy51dGltZShkZXN0ZmlsZSwgKHN0LnN0X2F0aW1lLCBzdC5zdF9tdGltZSkpCgogICAgICAgICAgICAgICAgIyBJZiBvdXIgZmlsZSBpcyBleGVjdXRhYmxlLCB0aGVuIG1ha2Ugb3VyIGRlc3RpbmF0aW9uIGZpbGUKICAgICAgICAgICAgICAgICMgZXhlY3V0YWJsZS4KICAgICAgICAgICAgICAgIGlmIG9zLmFjY2VzcyhzcmNmaWxlLCBvcy5YX09LKToKICAgICAgICAgICAgICAgICAgICBzdCA9IG9zLnN0YXQoc3JjZmlsZSkKICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgc3Quc3RfbW9kZSB8IHN0YXQuU19JWFVTUiB8IHN0YXQuU19JWEdSUCB8IHN0YXQuU19JWE9USAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChkZXN0ZmlsZSwgcGVybWlzc2lvbnMpCgogICAgICAgICAgICAgICAgY2hhbmdlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICBpZiBmaXhlcjoKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gZml4ZXIoZGVzdGZpbGUpCiAgICAgICAgICAgICAgICByZWNvcmRfaW5zdGFsbGVkKHNyY2ZpbGUsIGRlc3RmaWxlLCBjaGFuZ2VkKQoKICAgIGNsb2JiZXIoc291cmNlLCBsaWJfZGlyLCBUcnVlKQoKICAgIGFzc2VydCBpbmZvX2RpciwgIiVzIC5kaXN0LWluZm8gZGlyZWN0b3J5IG5vdCBmb3VuZCIgJSByZXEKCiAgICAjIEdldCB0aGUgZGVmaW5lZCBlbnRyeSBwb2ludHMKICAgIGVwX2ZpbGUgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdlbnRyeV9wb2ludHMudHh0JykKICAgIGNvbnNvbGUsIGd1aSA9IGdldF9lbnRyeXBvaW50cyhlcF9maWxlKQoKICAgIGRlZiBpc19lbnRyeXBvaW50X3dyYXBwZXIobmFtZSk6CiAgICAgICAgIyBFUCwgRVAuZXhlIGFuZCBFUC1zY3JpcHQucHkgYXJlIHNjcmlwdHMgZ2VuZXJhdGVkIGZvcgogICAgICAgICMgZW50cnkgcG9pbnQgRVAgYnkgc2V0dXB0b29scwogICAgICAgIGlmIG5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgICAgICBtYXRjaG5hbWUgPSBuYW1lWzotNF0KICAgICAgICBlbGlmIG5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLXNjcmlwdC5weScpOgogICAgICAgICAgICBtYXRjaG5hbWUgPSBuYW1lWzotMTBdCiAgICAgICAgZWxpZiBuYW1lLmxvd2VyKCkuZW5kc3dpdGgoIi5weWEiKToKICAgICAgICAgICAgbWF0Y2huYW1lID0gbmFtZVs6LTRdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWF0Y2huYW1lID0gbmFtZQogICAgICAgICMgSWdub3JlIHNldHVwdG9vbHMtZ2VuZXJhdGVkIHNjcmlwdHMKICAgICAgICByZXR1cm4gKG1hdGNobmFtZSBpbiBjb25zb2xlIG9yIG1hdGNobmFtZSBpbiBndWkpCgogICAgZm9yIGRhdGFkaXIgaW4gZGF0YV9kaXJzOgogICAgICAgIGZpeGVyID0gTm9uZQogICAgICAgIGZpbHRlciA9IE5vbmUKICAgICAgICBmb3Igc3ViZGlyIGluIG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHdoZWVsZGlyLCBkYXRhZGlyKSk6CiAgICAgICAgICAgIGZpeGVyID0gTm9uZQogICAgICAgICAgICBpZiBzdWJkaXIgPT0gJ3NjcmlwdHMnOgogICAgICAgICAgICAgICAgZml4ZXIgPSBmaXhfc2NyaXB0CiAgICAgICAgICAgICAgICBmaWx0ZXIgPSBpc19lbnRyeXBvaW50X3dyYXBwZXIKICAgICAgICAgICAgc291cmNlID0gb3MucGF0aC5qb2luKHdoZWVsZGlyLCBkYXRhZGlyLCBzdWJkaXIpCiAgICAgICAgICAgIGRlc3QgPSBzY2hlbWVbc3ViZGlyXQogICAgICAgICAgICBjbG9iYmVyKHNvdXJjZSwgZGVzdCwgRmFsc2UsIGZpeGVyPWZpeGVyLCBmaWx0ZXI9ZmlsdGVyKQoKICAgIG1ha2VyID0gU2NyaXB0TWFrZXIoTm9uZSwgc2NoZW1lWydzY3JpcHRzJ10pCgogICAgIyBFbnN1cmUgb2xkIHNjcmlwdHMgYXJlIG92ZXJ3cml0dGVuLgogICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8xODAwCiAgICBtYWtlci5jbG9iYmVyID0gVHJ1ZQoKICAgICMgRW5zdXJlIHdlIGRvbid0IGdlbmVyYXRlIGFueSB2YXJpYW50cyBmb3Igc2NyaXB0cyBiZWNhdXNlIHRoaXMgaXMgYWxtb3N0CiAgICAjIG5ldmVyIHdoYXQgc29tZWJvZHkgd2FudHMuCiAgICAjIFNlZSBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS9kaXN0bGliL2lzc3VlLzM1LwogICAgbWFrZXIudmFyaWFudHMgPSBzZXQoKCcnLCApKQoKICAgICMgVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIG90aGVyd2lzZSBkaXN0bGliIGNyZWF0ZXMgc2NyaXB0cyB0aGF0IGFyZSBub3QKICAgICMgZXhlY3V0YWJsZS4KICAgICMgU2VlIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL2Rpc3RsaWIvaXNzdWUvMzIvCiAgICBtYWtlci5zZXRfbW9kZSA9IFRydWUKCiAgICAjIFNpbXBsaWZ5IHRoZSBzY3JpcHQgYW5kIGZpeCB0aGUgZmFjdCB0aGF0IHRoZSBkZWZhdWx0IHNjcmlwdCBzd2FsbG93cwogICAgIyBldmVyeSBzaW5nbGUgc3RhY2sgdHJhY2UuCiAgICAjIFNlZSBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS9kaXN0bGliL2lzc3VlLzM0LwogICAgIyBTZWUgaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvZGlzdGxpYi9pc3N1ZS8zMy8KICAgIGRlZiBfZ2V0X3NjcmlwdF90ZXh0KGVudHJ5KToKICAgICAgICBpZiBlbnRyeS5zdWZmaXggaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiSW52YWxpZCBzY3JpcHQgZW50cnkgcG9pbnQ6ICVzIGZvciByZXE6ICVzIC0gQSBjYWxsYWJsZSAiCiAgICAgICAgICAgICAgICAic3VmZml4IGlzIHJlcXVpcmVkLiBDZiBodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuLyIKICAgICAgICAgICAgICAgICJsYXRlc3QvZGlzdHJpYnV0aW5nLmh0bWwjY29uc29sZS1zY3JpcHRzIGZvciBtb3JlICIKICAgICAgICAgICAgICAgICJpbmZvcm1hdGlvbi4iICUgKGVudHJ5LCByZXEpCiAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gbWFrZXIuc2NyaXB0X3RlbXBsYXRlICUgewogICAgICAgICAgICAibW9kdWxlIjogZW50cnkucHJlZml4LAogICAgICAgICAgICAiaW1wb3J0X25hbWUiOiBlbnRyeS5zdWZmaXguc3BsaXQoIi4iKVswXSwKICAgICAgICAgICAgImZ1bmMiOiBlbnRyeS5zdWZmaXgsCiAgICAgICAgfQoKICAgIG1ha2VyLl9nZXRfc2NyaXB0X3RleHQgPSBfZ2V0X3NjcmlwdF90ZXh0CiAgICBtYWtlci5zY3JpcHRfdGVtcGxhdGUgPSAiIiIjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQppbXBvcnQgcmUKaW1wb3J0IHN5cwoKZnJvbSAlKG1vZHVsZSlzIGltcG9ydCAlKGltcG9ydF9uYW1lKXMKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBzeXMuYXJndlswXSA9IHJlLnN1YihyJygtc2NyaXB0XC5weXc/fFwuZXhlKT8kJywgJycsIHN5cy5hcmd2WzBdKQogICAgc3lzLmV4aXQoJShmdW5jKXMoKSkKIiIiCgogICAgIyBTcGVjaWFsIGNhc2UgcGlwIGFuZCBzZXR1cHRvb2xzIHRvIGdlbmVyYXRlIHZlcnNpb25lZCB3cmFwcGVycwogICAgIwogICAgIyBUaGUgaXNzdWUgaXMgdGhhdCBzb21lIHByb2plY3RzIChzcGVjaWZpY2FsbHksIHBpcCBhbmQgc2V0dXB0b29scykgdXNlCiAgICAjIGNvZGUgaW4gc2V0dXAucHkgdG8gY3JlYXRlICJ2ZXJzaW9uZWQiIGVudHJ5IHBvaW50cyAtIHBpcDIuNyBvbiBQeXRob24KICAgICMgMi43LCBwaXAzLjMgb24gUHl0aG9uIDMuMywgZXRjLiBCdXQgdGhlc2UgZW50cnkgcG9pbnRzIGFyZSBiYWtlZCBpbnRvCiAgICAjIHRoZSB3aGVlbCBtZXRhZGF0YSBhdCBidWlsZCB0aW1lLCBhbmQgc28gaWYgdGhlIHdoZWVsIGlzIGluc3RhbGxlZCB3aXRoCiAgICAjIGEgKmRpZmZlcmVudCogdmVyc2lvbiBvZiBQeXRob24gdGhlIGVudHJ5IHBvaW50cyB3aWxsIGJlIHdyb25nLiBUaGUKICAgICMgY29ycmVjdCBmaXggZm9yIHRoaXMgaXMgdG8gZW5oYW5jZSB0aGUgbWV0YWRhdGEgdG8gYmUgYWJsZSB0byBkZXNjcmliZQogICAgIyBzdWNoIHZlcnNpb25lZCBlbnRyeSBwb2ludHMsIGJ1dCB0aGF0IHdvbid0IGhhcHBlbiB0aWxsIE1ldGFkYXRhIDIuMCBpcwogICAgIyBhdmFpbGFibGUuCiAgICAjIEluIHRoZSBtZWFudGltZSwgcHJvamVjdHMgdXNpbmcgdmVyc2lvbmVkIGVudHJ5IHBvaW50cyB3aWxsIGVpdGhlciBoYXZlCiAgICAjIGluY29ycmVjdCB2ZXJzaW9uZWQgZW50cnkgcG9pbnRzLCBvciB0aGV5IHdpbGwgbm90IGJlIGFibGUgdG8gZGlzdHJpYnV0ZQogICAgIyAidW5pdmVyc2FsIiB3aGVlbHMgKGkuZS4sIHRoZXkgd2lsbCBuZWVkIGEgd2hlZWwgcGVyIFB5dGhvbiB2ZXJzaW9uKS4KICAgICMKICAgICMgQmVjYXVzZSBzZXR1cHRvb2xzIGFuZCBwaXAgYXJlIGJ1bmRsZWQgd2l0aCBfZW5zdXJlcGlwIGFuZCB2aXJ0dWFsZW52LAogICAgIyB3ZSBuZWVkIHRvIHVzZSB1bml2ZXJzYWwgd2hlZWxzLiBTbywgYXMgYSBzdG9wZ2FwIHVudGlsIE1ldGFkYXRhIDIuMCwgd2UKICAgICMgb3ZlcnJpZGUgdGhlIHZlcnNpb25lZCBlbnRyeSBwb2ludHMgaW4gdGhlIHdoZWVsIGFuZCBnZW5lcmF0ZSB0aGUKICAgICMgY29ycmVjdCBvbmVzLiBUaGlzIGNvZGUgaXMgcHVyZWx5IGEgc2hvcnQtdGVybSBtZWFzdXJlIHVudGlsIE1ldGFkYXRhIDIuMAogICAgIyBpcyBhdmFpbGFibGUuCiAgICAjCiAgICAjIFRvIGFkZCB0aGUgbGV2ZWwgb2YgaGFjayBpbiB0aGlzIHNlY3Rpb24gb2YgY29kZSwgaW4gb3JkZXIgdG8gc3VwcG9ydAogICAgIyBlbnN1cmVwaXAgdGhpcyBjb2RlIHdpbGwgbG9vayBmb3IgYW4gYGBFTlNVUkVQSVBfT1BUSU9OU2BgIGVudmlyb25tZW50CiAgICAjIHZhcmlhYmxlIHdoaWNoIHdpbGwgY29udHJvbCB3aGljaCB2ZXJzaW9uIHNjcmlwdHMgZ2V0IGluc3RhbGxlZC4KICAgICMKICAgICMgRU5TVVJFUElQX09QVElPTlM9YWx0aW5zdGFsbAogICAgIyAgIC0gT25seSBwaXBYLlkgYW5kIGVhc3lfaW5zdGFsbC1YLlkgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIGluc3RhbGxlZAogICAgIyBFTlNVUkVQSVBfT1BUSU9OUz1pbnN0YWxsCiAgICAjICAgLSBwaXBYLlksIHBpcFgsIGVhc3lfaW5zdGFsbC1YLlkgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIGluc3RhbGxlZC4gTm90ZQogICAgIyAgICAgdGhhdCB0aGlzIG9wdGlvbiBpcyB0ZWNobmljYWxseSBpZiBFTlNVUkVQSVBfT1BUSU9OUyBpcyBzZXQgYW5kIGlzCiAgICAjICAgICBub3QgYWx0aW5zdGFsbAogICAgIyBERUZBVUxUCiAgICAjICAgLSBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBpbnN0YWxsIHBpcCwgcGlwWCwgcGlwWC5ZLCBlYXN5X2luc3RhbGwKICAgICMgICAgIGFuZCBlYXN5X2luc3RhbGwtWC5ZLgogICAgcGlwX3NjcmlwdCA9IGNvbnNvbGUucG9wKCdwaXAnLCBOb25lKQogICAgaWYgcGlwX3NjcmlwdDoKICAgICAgICBpZiAiRU5TVVJFUElQX09QVElPTlMiIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICBzcGVjID0gJ3BpcCA9ICcgKyBwaXBfc2NyaXB0CiAgICAgICAgICAgIGdlbmVyYXRlZC5leHRlbmQobWFrZXIubWFrZShzcGVjKSkKCiAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIkVOU1VSRVBJUF9PUFRJT05TIiwgIiIpICE9ICJhbHRpbnN0YWxsIjoKICAgICAgICAgICAgc3BlYyA9ICdwaXAlcyA9ICVzJyAlIChzeXMudmVyc2lvbls6MV0sIHBpcF9zY3JpcHQpCiAgICAgICAgICAgIGdlbmVyYXRlZC5leHRlbmQobWFrZXIubWFrZShzcGVjKSkKCiAgICAgICAgc3BlYyA9ICdwaXAlcyA9ICVzJyAlIChzeXMudmVyc2lvbls6M10sIHBpcF9zY3JpcHQpCiAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQogICAgICAgICMgRGVsZXRlIGFueSBvdGhlciB2ZXJzaW9uZWQgcGlwIGVudHJ5IHBvaW50cwogICAgICAgIHBpcF9lcCA9IFtrIGZvciBrIGluIGNvbnNvbGUgaWYgcmUubWF0Y2gocidwaXAoXGQoXC5cZCk/KT8kJywgayldCiAgICAgICAgZm9yIGsgaW4gcGlwX2VwOgogICAgICAgICAgICBkZWwgY29uc29sZVtrXQogICAgZWFzeV9pbnN0YWxsX3NjcmlwdCA9IGNvbnNvbGUucG9wKCdlYXN5X2luc3RhbGwnLCBOb25lKQogICAgaWYgZWFzeV9pbnN0YWxsX3NjcmlwdDoKICAgICAgICBpZiAiRU5TVVJFUElQX09QVElPTlMiIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICBzcGVjID0gJ2Vhc3lfaW5zdGFsbCA9ICcgKyBlYXN5X2luc3RhbGxfc2NyaXB0CiAgICAgICAgICAgIGdlbmVyYXRlZC5leHRlbmQobWFrZXIubWFrZShzcGVjKSkKCiAgICAgICAgc3BlYyA9ICdlYXN5X2luc3RhbGwtJXMgPSAlcycgJSAoc3lzLnZlcnNpb25bOjNdLCBlYXN5X2luc3RhbGxfc2NyaXB0KQogICAgICAgIGdlbmVyYXRlZC5leHRlbmQobWFrZXIubWFrZShzcGVjKSkKICAgICAgICAjIERlbGV0ZSBhbnkgb3RoZXIgdmVyc2lvbmVkIGVhc3lfaW5zdGFsbCBlbnRyeSBwb2ludHMKICAgICAgICBlYXN5X2luc3RhbGxfZXAgPSBbCiAgICAgICAgICAgIGsgZm9yIGsgaW4gY29uc29sZSBpZiByZS5tYXRjaChyJ2Vhc3lfaW5zdGFsbCgtXGRcLlxkKT8kJywgaykKICAgICAgICBdCiAgICAgICAgZm9yIGsgaW4gZWFzeV9pbnN0YWxsX2VwOgogICAgICAgICAgICBkZWwgY29uc29sZVtrXQoKICAgICMgR2VuZXJhdGUgdGhlIGNvbnNvbGUgYW5kIEdVSSBlbnRyeSBwb2ludHMgc3BlY2lmaWVkIGluIHRoZSB3aGVlbAogICAgaWYgbGVuKGNvbnNvbGUpID4gMDoKICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKAogICAgICAgICAgICBtYWtlci5tYWtlX211bHRpcGxlKFsnJXMgPSAlcycgJSBrdiBmb3Iga3YgaW4gY29uc29sZS5pdGVtcygpXSkKICAgICAgICApCiAgICBpZiBsZW4oZ3VpKSA+IDA6CiAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZCgKICAgICAgICAgICAgbWFrZXIubWFrZV9tdWx0aXBsZSgKICAgICAgICAgICAgICAgIFsnJXMgPSAlcycgJSBrdiBmb3Iga3YgaW4gZ3VpLml0ZW1zKCldLAogICAgICAgICAgICAgICAgeydndWknOiBUcnVlfQogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICMgUmVjb3JkIHBpcCBhcyB0aGUgaW5zdGFsbGVyCiAgICBpbnN0YWxsZXIgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdJTlNUQUxMRVInKQogICAgdGVtcF9pbnN0YWxsZXIgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdJTlNUQUxMRVIucGlwJykKICAgIHdpdGggb3Blbih0ZW1wX2luc3RhbGxlciwgJ3diJykgYXMgaW5zdGFsbGVyX2ZpbGU6CiAgICAgICAgaW5zdGFsbGVyX2ZpbGUud3JpdGUoYidwaXBcbicpCiAgICBzaHV0aWwubW92ZSh0ZW1wX2luc3RhbGxlciwgaW5zdGFsbGVyKQogICAgZ2VuZXJhdGVkLmFwcGVuZChpbnN0YWxsZXIpCgogICAgIyBSZWNvcmQgZGV0YWlscyBvZiBhbGwgZmlsZXMgaW5zdGFsbGVkCiAgICByZWNvcmQgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdSRUNPUkQnKQogICAgdGVtcF9yZWNvcmQgPSBvcy5wYXRoLmpvaW4oaW5mb19kaXJbMF0sICdSRUNPUkQucGlwJykKICAgIHdpdGggb3Blbl9mb3JfY3N2KHJlY29yZCwgJ3InKSBhcyByZWNvcmRfaW46CiAgICAgICAgd2l0aCBvcGVuX2Zvcl9jc3YodGVtcF9yZWNvcmQsICd3KycpIGFzIHJlY29yZF9vdXQ6CiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5yZWFkZXIocmVjb3JkX2luKQogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKHJlY29yZF9vdXQpCiAgICAgICAgICAgIGZvciByb3cgaW4gcmVhZGVyOgogICAgICAgICAgICAgICAgcm93WzBdID0gaW5zdGFsbGVkLnBvcChyb3dbMF0sIHJvd1swXSkKICAgICAgICAgICAgICAgIGlmIHJvd1swXSBpbiBjaGFuZ2VkOgogICAgICAgICAgICAgICAgICAgIHJvd1sxXSwgcm93WzJdID0gcmVoYXNoKHJvd1swXSkKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhyb3cpCiAgICAgICAgICAgIGZvciBmIGluIGdlbmVyYXRlZDoKICAgICAgICAgICAgICAgIGgsIGwgPSByZWhhc2goZikKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygobm9ybXBhdGgoZiwgbGliX2RpciksIGgsIGwpKQogICAgICAgICAgICBmb3IgZiBpbiBpbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKGluc3RhbGxlZFtmXSwgJycsICcnKSkKICAgIHNodXRpbC5tb3ZlKHRlbXBfcmVjb3JkLCByZWNvcmQpCgoKZGVmIF91bmlxdWUoZm4pOgogICAgQGZ1bmN0b29scy53cmFwcyhmbikKICAgIGRlZiB1bmlxdWUoKmFyZ3MsICoqa3cpOgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBpdGVtIGluIGZuKCphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHNlZW4uYWRkKGl0ZW0pCiAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCiAgICByZXR1cm4gdW5pcXVlCgoKIyBUT0RPOiB0aGlzIGdvZXMgc29tZXdoZXJlIGJlc2lkZXMgdGhlIHdoZWVsIG1vZHVsZQpAX3VuaXF1ZQpkZWYgdW5pbnN0YWxsYXRpb25fcGF0aHMoZGlzdCk6CiAgICAiIiIKICAgIFlpZWxkIGFsbCB0aGUgdW5pbnN0YWxsYXRpb24gcGF0aHMgZm9yIGRpc3QgYmFzZWQgb24gUkVDT1JELXdpdGhvdXQtLnB5YwoKICAgIFlpZWxkIHBhdGhzIHRvIGFsbCB0aGUgZmlsZXMgaW4gUkVDT1JELiBGb3IgZWFjaCAucHkgZmlsZSBpbiBSRUNPUkQsIGFkZAogICAgdGhlIC5weWMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgoKICAgIFVuaW5zdGFsbFBhdGhTZXQuYWRkKCkgdGFrZXMgY2FyZSBvZiB0aGUgX19weWNhY2hlX18gLnB5Yy4KICAgICIiIgogICAgZnJvbSBwaXAudXRpbHMgaW1wb3J0IEZha2VGaWxlICAjIGNpcmN1bGFyIGltcG9ydAogICAgciA9IGNzdi5yZWFkZXIoRmFrZUZpbGUoZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ1JFQ09SRCcpKSkKICAgIGZvciByb3cgaW4gcjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpc3QubG9jYXRpb24sIHJvd1swXSkKICAgICAgICB5aWVsZCBwYXRoCiAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgIGRuLCBmbiA9IG9zLnBhdGguc3BsaXQocGF0aCkKICAgICAgICAgICAgYmFzZSA9IGZuWzotM10KICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkbiwgYmFzZSArICcucHljJykKICAgICAgICAgICAgeWllbGQgcGF0aAoKCmRlZiB3aGVlbF92ZXJzaW9uKHNvdXJjZV9kaXIpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIFdoZWVsLVZlcnNpb24gb2YgYW4gZXh0cmFjdGVkIHdoZWVsLCBpZiBwb3NzaWJsZS4KCiAgICBPdGhlcndpc2UsIHJldHVybiBGYWxzZSBpZiB3ZSBjb3VsZG4ndCBwYXJzZSAvIGV4dHJhY3QgaXQuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBkaXN0ID0gW2QgZm9yIGQgaW4gcGtnX3Jlc291cmNlcy5maW5kX29uX3BhdGgoTm9uZSwgc291cmNlX2RpcildWzBdCgogICAgICAgIHdoZWVsX2RhdGEgPSBkaXN0LmdldF9tZXRhZGF0YSgnV0hFRUwnKQogICAgICAgIHdoZWVsX2RhdGEgPSBQYXJzZXIoKS5wYXJzZXN0cih3aGVlbF9kYXRhKQoKICAgICAgICB2ZXJzaW9uID0gd2hlZWxfZGF0YVsnV2hlZWwtVmVyc2lvbiddLnN0cmlwKCkKICAgICAgICB2ZXJzaW9uID0gdHVwbGUobWFwKGludCwgdmVyc2lvbi5zcGxpdCgnLicpKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgogICAgZXhjZXB0OgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBjaGVja19jb21wYXRpYmlsaXR5KHZlcnNpb24sIG5hbWUpOgogICAgIiIiCiAgICBSYWlzZXMgZXJyb3JzIG9yIHdhcm5zIGlmIGNhbGxlZCB3aXRoIGFuIGluY29tcGF0aWJsZSBXaGVlbC1WZXJzaW9uLgoKICAgIFBpcCBzaG91bGQgcmVmdXNlIHRvIGluc3RhbGwgYSBXaGVlbC1WZXJzaW9uIHRoYXQncyBhIG1ham9yIHNlcmllcwogICAgYWhlYWQgb2Ygd2hhdCBpdCdzIGNvbXBhdGlibGUgd2l0aCAoZS5nIDIuMCA+IDEuMSk7IGFuZCB3YXJuIHdoZW4KICAgIGluc3RhbGxpbmcgYSB2ZXJzaW9uIG9ubHkgbWlub3IgdmVyc2lvbiBhaGVhZCAoZS5nIDEuMiA+IDEuMSkuCgogICAgdmVyc2lvbjogYSAyLXR1cGxlIHJlcHJlc2VudGluZyBhIFdoZWVsLVZlcnNpb24gKE1ham9yLCBNaW5vcikKICAgIG5hbWU6IG5hbWUgb2Ygd2hlZWwgb3IgcGFja2FnZSB0byByYWlzZSBleGNlcHRpb24gYWJvdXQKCiAgICA6cmFpc2VzIFVuc3VwcG9ydGVkV2hlZWw6IHdoZW4gYW4gaW5jb21wYXRpYmxlIFdoZWVsLVZlcnNpb24gaXMgZ2l2ZW4KICAgICIiIgogICAgaWYgbm90IHZlcnNpb246CiAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRXaGVlbCgKICAgICAgICAgICAgIiVzIGlzIGluIGFuIHVuc3VwcG9ydGVkIG9yIGludmFsaWQgd2hlZWwiICUgbmFtZQogICAgICAgICkKICAgIGlmIHZlcnNpb25bMF0gPiBWRVJTSU9OX0NPTVBBVElCTEVbMF06CiAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRXaGVlbCgKICAgICAgICAgICAgIiVzJ3MgV2hlZWwtVmVyc2lvbiAoJXMpIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyB2ZXJzaW9uICIKICAgICAgICAgICAgIm9mIHBpcCIgJSAobmFtZSwgJy4nLmpvaW4obWFwKHN0ciwgdmVyc2lvbikpKQogICAgICAgICkKICAgIGVsaWYgdmVyc2lvbiA+IFZFUlNJT05fQ09NUEFUSUJMRToKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgJ0luc3RhbGxpbmcgZnJvbSBhIG5ld2VyIFdoZWVsLVZlcnNpb24gKCVzKScsCiAgICAgICAgICAgICcuJy5qb2luKG1hcChzdHIsIHZlcnNpb24pKSwKICAgICAgICApCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKICAgICIiIkEgd2hlZWwgZmlsZSIiIgoKICAgICMgVE9ETzogbWF5YmUgbW92ZSB0aGUgaW5zdGFsbCBjb2RlIGludG8gdGhpcyBjbGFzcwoKICAgIHdoZWVsX2ZpbGVfcmUgPSByZS5jb21waWxlKAogICAgICAgIHIiIiJeKD9QPG5hbWV2ZXI+KD9QPG5hbWU+Lis/KS0oP1A8dmVyPlxkLio/KSkKICAgICAgICAoKC0oP1A8YnVpbGQ+XGQuKj8pKT8tKD9QPHB5dmVyPi4rPyktKD9QPGFiaT4uKz8pLSg/UDxwbGF0Pi4rPykKICAgICAgICBcLndobHxcLmRpc3QtaW5mbykkIiIiLAogICAgICAgIHJlLlZFUkJPU0UKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUpOgogICAgICAgICIiIgogICAgICAgIDpyYWlzZXMgSW52YWxpZFdoZWVsRmlsZW5hbWU6IHdoZW4gdGhlIGZpbGVuYW1lIGlzIGludmFsaWQgZm9yIGEgd2hlZWwKICAgICAgICAiIiIKICAgICAgICB3aGVlbF9pbmZvID0gc2VsZi53aGVlbF9maWxlX3JlLm1hdGNoKGZpbGVuYW1lKQogICAgICAgIGlmIG5vdCB3aGVlbF9pbmZvOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkV2hlZWxGaWxlbmFtZSgKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSB2YWxpZCB3aGVlbCBmaWxlbmFtZS4iICUgZmlsZW5hbWUKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIHNlbGYubmFtZSA9IHdoZWVsX2luZm8uZ3JvdXAoJ25hbWUnKS5yZXBsYWNlKCdfJywgJy0nKQogICAgICAgICMgd2UnbGwgYXNzdW1lICJfIiBtZWFucyAiLSIgZHVlIHRvIHdoZWVsIG5hbWluZyBzY2hlbWUKICAgICAgICAjIChodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzExNTApCiAgICAgICAgc2VsZi52ZXJzaW9uID0gd2hlZWxfaW5mby5ncm91cCgndmVyJykucmVwbGFjZSgnXycsICctJykKICAgICAgICBzZWxmLnB5dmVyc2lvbnMgPSB3aGVlbF9pbmZvLmdyb3VwKCdweXZlcicpLnNwbGl0KCcuJykKICAgICAgICBzZWxmLmFiaXMgPSB3aGVlbF9pbmZvLmdyb3VwKCdhYmknKS5zcGxpdCgnLicpCiAgICAgICAgc2VsZi5wbGF0cyA9IHdoZWVsX2luZm8uZ3JvdXAoJ3BsYXQnKS5zcGxpdCgnLicpCgogICAgICAgICMgQWxsIHRoZSB0YWcgY29tYmluYXRpb25zIGZyb20gdGhpcyBmaWxlCiAgICAgICAgc2VsZi5maWxlX3RhZ3MgPSBzZXQoCiAgICAgICAgICAgICh4LCB5LCB6KSBmb3IgeCBpbiBzZWxmLnB5dmVyc2lvbnMKICAgICAgICAgICAgZm9yIHkgaW4gc2VsZi5hYmlzIGZvciB6IGluIHNlbGYucGxhdHMKICAgICAgICApCgogICAgZGVmIHN1cHBvcnRfaW5kZXhfbWluKHNlbGYsIHRhZ3M9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggdGhhdCBvbmUgb2YgdGhlIHdoZWVsJ3MgZmlsZV90YWcgY29tYmluYXRpb25zCiAgICAgICAgYWNoaWV2ZXMgaW4gdGhlIHN1cHBvcnRlZF90YWdzIGxpc3QgZS5nLiBpZiB0aGVyZSBhcmUgOCBzdXBwb3J0ZWQgdGFncywKICAgICAgICBhbmQgb25lIG9mIHRoZSBmaWxlIHRhZ3MgaXMgZmlyc3QgaW4gdGhlIGxpc3QsIHRoZW4gcmV0dXJuIDAuICBSZXR1cm5zCiAgICAgICAgTm9uZSBpcyB0aGUgd2hlZWwgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgICAiIiIKICAgICAgICBpZiB0YWdzIGlzIE5vbmU6ICAjIGZvciBtb2NrCiAgICAgICAgICAgIHRhZ3MgPSBwZXA0MjV0YWdzLnN1cHBvcnRlZF90YWdzCiAgICAgICAgaW5kZXhlcyA9IFt0YWdzLmluZGV4KGMpIGZvciBjIGluIHNlbGYuZmlsZV90YWdzIGlmIGMgaW4gdGFnc10KICAgICAgICByZXR1cm4gbWluKGluZGV4ZXMpIGlmIGluZGV4ZXMgZWxzZSBOb25lCgogICAgZGVmIHN1cHBvcnRlZChzZWxmLCB0YWdzPU5vbmUpOgogICAgICAgICIiIklzIHRoaXMgd2hlZWwgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtPyIiIgogICAgICAgIGlmIHRhZ3MgaXMgTm9uZTogICMgZm9yIG1vY2sKICAgICAgICAgICAgdGFncyA9IHBlcDQyNXRhZ3Muc3VwcG9ydGVkX3RhZ3MKICAgICAgICByZXR1cm4gYm9vbChzZXQodGFncykuaW50ZXJzZWN0aW9uKHNlbGYuZmlsZV90YWdzKSkKCgpjbGFzcyBXaGVlbEJ1aWxkZXIob2JqZWN0KToKICAgICIiIkJ1aWxkIHdoZWVscyBmcm9tIGEgUmVxdWlyZW1lbnRTZXQuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3NldCwgZmluZGVyLCBidWlsZF9vcHRpb25zPU5vbmUsCiAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnM9Tm9uZSk6CiAgICAgICAgc2VsZi5yZXF1aXJlbWVudF9zZXQgPSByZXF1aXJlbWVudF9zZXQKICAgICAgICBzZWxmLmZpbmRlciA9IGZpbmRlcgogICAgICAgIHNlbGYuX2NhY2hlX3Jvb3QgPSByZXF1aXJlbWVudF9zZXQuX3doZWVsX2NhY2hlLl9jYWNoZV9kaXIKICAgICAgICBzZWxmLl93aGVlbF9kaXIgPSByZXF1aXJlbWVudF9zZXQud2hlZWxfZG93bmxvYWRfZGlyCiAgICAgICAgc2VsZi5idWlsZF9vcHRpb25zID0gYnVpbGRfb3B0aW9ucyBvciBbXQogICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbnMgPSBnbG9iYWxfb3B0aW9ucyBvciBbXQoKICAgIGRlZiBfYnVpbGRfb25lKHNlbGYsIHJlcSwgb3V0cHV0X2RpciwgcHl0aG9uX3RhZz1Ob25lKToKICAgICAgICAiIiJCdWlsZCBvbmUgd2hlZWwuCgogICAgICAgIDpyZXR1cm46IFRoZSBmaWxlbmFtZSBvZiB0aGUgYnVpbHQgd2hlZWwsIG9yIE5vbmUgaWYgdGhlIGJ1aWxkIGZhaWxlZC4KICAgICAgICAiIiIKICAgICAgICB0ZW1wZCA9IHRlbXBmaWxlLm1rZHRlbXAoJ3BpcC13aGVlbC0nKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2VsZi5fX2J1aWxkX29uZShyZXEsIHRlbXBkLCBweXRob25fdGFnPXB5dGhvbl90YWcpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHdoZWVsX25hbWUgPSBvcy5saXN0ZGlyKHRlbXBkKVswXQogICAgICAgICAgICAgICAgICAgIHdoZWVsX3BhdGggPSBvcy5wYXRoLmpvaW4ob3V0cHV0X2Rpciwgd2hlZWxfbmFtZSkKICAgICAgICAgICAgICAgICAgICBzaHV0aWwubW92ZShvcy5wYXRoLmpvaW4odGVtcGQsIHdoZWVsX25hbWUpLCB3aGVlbF9wYXRoKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdTdG9yZWQgaW4gZGlyZWN0b3J5OiAlcycsIG91dHB1dF9kaXIpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdoZWVsX3BhdGgKICAgICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICMgSWdub3JlIHJldHVybiwgd2UgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSB1c2VmdWwuCiAgICAgICAgICAgIHNlbGYuX2NsZWFuX29uZShyZXEpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKHRlbXBkKQoKICAgIGRlZiBfYmFzZV9zZXR1cF9hcmdzKHNlbGYsIHJlcSk6CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsICItdSIsICctYycsCiAgICAgICAgICAgIFNFVFVQVE9PTFNfU0hJTSAlIHJlcS5zZXR1cF9weQogICAgICAgIF0gKyBsaXN0KHNlbGYuZ2xvYmFsX29wdGlvbnMpCgogICAgZGVmIF9fYnVpbGRfb25lKHNlbGYsIHJlcSwgdGVtcGQsIHB5dGhvbl90YWc9Tm9uZSk6CiAgICAgICAgYmFzZV9hcmdzID0gc2VsZi5fYmFzZV9zZXR1cF9hcmdzKHJlcSkKCiAgICAgICAgc3Bpbl9tZXNzYWdlID0gJ1J1bm5pbmcgc2V0dXAucHkgYmRpc3Rfd2hlZWwgZm9yICVzJyAlIChyZXEubmFtZSwpCiAgICAgICAgd2l0aCBvcGVuX3NwaW5uZXIoc3Bpbl9tZXNzYWdlKSBhcyBzcGlubmVyOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Rlc3RpbmF0aW9uIGRpcmVjdG9yeTogJXMnLCB0ZW1wZCkKICAgICAgICAgICAgd2hlZWxfYXJncyA9IGJhc2VfYXJncyArIFsnYmRpc3Rfd2hlZWwnLCAnLWQnLCB0ZW1wZF0gXAogICAgICAgICAgICAgICAgKyBzZWxmLmJ1aWxkX29wdGlvbnMKCiAgICAgICAgICAgIGlmIHB5dGhvbl90YWcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB3aGVlbF9hcmdzICs9IFsiLS1weXRob24tdGFnIiwgcHl0aG9uX3RhZ10KCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNhbGxfc3VicHJvY2Vzcyh3aGVlbF9hcmdzLCBjd2Q9cmVxLnNldHVwX3B5X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgc3Bpbm5lcj1zcGlubmVyKQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgc3Bpbm5lci5maW5pc2goImVycm9yIikKICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIGJ1aWxkaW5nIHdoZWVsIGZvciAlcycsIHJlcS5uYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9jbGVhbl9vbmUoc2VsZiwgcmVxKToKICAgICAgICBiYXNlX2FyZ3MgPSBzZWxmLl9iYXNlX3NldHVwX2FyZ3MocmVxKQoKICAgICAgICBsb2dnZXIuaW5mbygnUnVubmluZyBzZXR1cC5weSBjbGVhbiBmb3IgJXMnLCByZXEubmFtZSkKICAgICAgICBjbGVhbl9hcmdzID0gYmFzZV9hcmdzICsgWydjbGVhbicsICctLWFsbCddCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjYWxsX3N1YnByb2Nlc3MoY2xlYW5fYXJncywgY3dkPXJlcS5zb3VyY2VfZGlyLCBzaG93X3N0ZG91dD1GYWxzZSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIGNsZWFuaW5nIGJ1aWxkIGRpciBmb3IgJXMnLCByZXEubmFtZSkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGJ1aWxkKHNlbGYsIGF1dG9idWlsZGluZz1GYWxzZSk6CiAgICAgICAgIiIiQnVpbGQgd2hlZWxzLgoKICAgICAgICA6cGFyYW0gdW5wYWNrOiBJZiBUcnVlLCByZXBsYWNlIHRoZSBzZGlzdCB3ZSBidWlsdCBmcm9tIHdpdGggdGhlCiAgICAgICAgICAgIG5ld2x5IGJ1aWx0IHdoZWVsLCBpbiBwcmVwYXJhdGlvbiBmb3IgaW5zdGFsbGF0aW9uLgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgYWxsIHRoZSB3aGVlbHMgYnVpbHQgY29ycmVjdGx5LgogICAgICAgICIiIgogICAgICAgIGFzc2VydCBzZWxmLl93aGVlbF9kaXIgb3IgKGF1dG9idWlsZGluZyBhbmQgc2VsZi5fY2FjaGVfcm9vdCkKICAgICAgICAjIHVucGFjayBzZGlzdHMgYW5kIGNvbnN0cnVjdHMgcmVxIHNldAogICAgICAgIHNlbGYucmVxdWlyZW1lbnRfc2V0LnByZXBhcmVfZmlsZXMoc2VsZi5maW5kZXIpCgogICAgICAgIHJlcXNldCA9IHNlbGYucmVxdWlyZW1lbnRfc2V0LnJlcXVpcmVtZW50cy52YWx1ZXMoKQoKICAgICAgICBidWlsZHNldCA9IFtdCiAgICAgICAgZm9yIHJlcSBpbiByZXFzZXQ6CiAgICAgICAgICAgIGlmIHJlcS5jb25zdHJhaW50OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcmVxLmlzX3doZWVsOgogICAgICAgICAgICAgICAgaWYgbm90IGF1dG9idWlsZGluZzoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgJ1NraXBwaW5nICVzLCBkdWUgdG8gYWxyZWFkeSBiZWluZyB3aGVlbC4nLCByZXEubmFtZSkKICAgICAgICAgICAgZWxpZiBhdXRvYnVpbGRpbmcgYW5kIHJlcS5lZGl0YWJsZToKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxpZiBhdXRvYnVpbGRpbmcgYW5kIHJlcS5saW5rIGFuZCBub3QgcmVxLmxpbmsuaXNfYXJ0aWZhY3Q6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsaWYgYXV0b2J1aWxkaW5nIGFuZCBub3QgcmVxLnNvdXJjZV9kaXI6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBhdXRvYnVpbGRpbmc6CiAgICAgICAgICAgICAgICAgICAgbGluayA9IHJlcS5saW5rCiAgICAgICAgICAgICAgICAgICAgYmFzZSwgZXh0ID0gbGluay5zcGxpdGV4dCgpCiAgICAgICAgICAgICAgICAgICAgaWYgcGlwLmluZGV4LmVnZ19pbmZvX21hdGNoZXMoYmFzZSwgTm9uZSwgbGluaykgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb2Vzbid0IGxvb2sgbGlrZSBhIHBhY2thZ2UgLSBkb24ndCBhdXRvYnVpbGQgYSB3aGVlbAogICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2Ugd2UnbGwgaGF2ZSBubyB3YXkgdG8gbG9va3VwIHRoZSByZXN1bHQgc2FuZWx5CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgaWYgImJpbmFyeSIgbm90IGluIHBpcC5pbmRleC5mbXRfY3RsX2Zvcm1hdHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbmRlci5mb3JtYXRfY29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZV9uYW1lKHJlcS5uYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIGJkaXN0X3doZWVsIGZvciAlcywgZHVlIHRvIGJpbmFyaWVzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWluZyBkaXNhYmxlZCBmb3IgaXQuIiwgcmVxLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBidWlsZHNldC5hcHBlbmQocmVxKQoKICAgICAgICBpZiBub3QgYnVpbGRzZXQ6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICMgQnVpbGQgdGhlIHdoZWVscy4KICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgJ0J1aWxkaW5nIHdoZWVscyBmb3IgY29sbGVjdGVkIHBhY2thZ2VzOiAlcycsCiAgICAgICAgICAgICcsICcuam9pbihbcmVxLm5hbWUgZm9yIHJlcSBpbiBidWlsZHNldF0pLAogICAgICAgICkKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgYnVpbGRfc3VjY2VzcywgYnVpbGRfZmFpbHVyZSA9IFtdLCBbXQogICAgICAgICAgICBmb3IgcmVxIGluIGJ1aWxkc2V0OgogICAgICAgICAgICAgICAgcHl0aG9uX3RhZyA9IE5vbmUKICAgICAgICAgICAgICAgIGlmIGF1dG9idWlsZGluZzoKICAgICAgICAgICAgICAgICAgICBweXRob25fdGFnID0gcGVwNDI1dGFncy5pbXBsZW1lbnRhdGlvbl90YWcKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyID0gX2NhY2hlX2Zvcl9saW5rKHNlbGYuX2NhY2hlX3Jvb3QsIHJlcS5saW5rKQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlX2RpcihvdXRwdXRfZGlyKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJCdWlsZGluZyB3aGVlbCBmb3IgJXMgZmFpbGVkOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5uYW1lLCBlKQogICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9mYWlsdXJlLmFwcGVuZChyZXEpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXIgPSBzZWxmLl93aGVlbF9kaXIKICAgICAgICAgICAgICAgIHdoZWVsX2ZpbGUgPSBzZWxmLl9idWlsZF9vbmUoCiAgICAgICAgICAgICAgICAgICAgcmVxLCBvdXRwdXRfZGlyLAogICAgICAgICAgICAgICAgICAgIHB5dGhvbl90YWc9cHl0aG9uX3RhZywKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHdoZWVsX2ZpbGU6CiAgICAgICAgICAgICAgICAgICAgYnVpbGRfc3VjY2Vzcy5hcHBlbmQocmVxKQogICAgICAgICAgICAgICAgICAgIGlmIGF1dG9idWlsZGluZzoKICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFg6IFRoaXMgaXMgbWlsZGx5IGR1cGxpY2F0aXZlIHdpdGggcHJlcGFyZV9maWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgIyBidXQgbm90IGNsb3NlIGVub3VnaCB0byBwdWxsIG91dCB0byBhIHNpbmdsZSBjb21tb24KICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNvZGUgYmVsb3cgYXNzdW1lcyB0ZW1wb3Jhcnkgc291cmNlIGRpcnMgLQogICAgICAgICAgICAgICAgICAgICAgICAjIHByZXZlbnQgaXQgZG9pbmcgYmFkIHRoaW5ncy4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVxLnNvdXJjZV9kaXIgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNvdXJjZV9kaXIsIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHNvdXJjZSBkaXIgLSBtaXNzaW5nIG1hcmtlciIpCiAgICAgICAgICAgICAgICAgICAgICAgICMgRGVsZXRlIHRoZSBzb3VyY2Ugd2UgYnVpbHQgdGhlIHdoZWVsIGZyb20KICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnJlbW92ZV90ZW1wb3Jhcnlfc291cmNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXQgdGhlIGJ1aWxkIGRpcmVjdG9yeSBhZ2FpbiAtIG5hbWUgaXMga25vd24gZnJvbQogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSB3b3JrIHByZXBhcmVfZmlsZXMgZGlkLgogICAgICAgICAgICAgICAgICAgICAgICByZXEuc291cmNlX2RpciA9IHJlcS5idWlsZF9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdWlyZW1lbnRfc2V0LmJ1aWxkX2RpcikKICAgICAgICAgICAgICAgICAgICAgICAgIyBVcGRhdGUgdGhlIGxpbmsgZm9yIHRoaXMuCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5saW5rID0gcGlwLmluZGV4LkxpbmsoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX3RvX3VybCh3aGVlbF9maWxlKSkKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHJlcS5saW5rLmlzX3doZWVsCiAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgd2hlZWwgaW50byB0aGUgZGlyCiAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja191cmwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEubGluaywgcmVxLnNvdXJjZV9kaXIsIE5vbmUsIEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZWxmLnJlcXVpcmVtZW50X3NldC5zZXNzaW9uKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBidWlsZF9mYWlsdXJlLmFwcGVuZChyZXEpCgogICAgICAgICMgbm90aWZ5IHN1Y2Nlc3MvZmFpbHVyZQogICAgICAgIGlmIGJ1aWxkX3N1Y2Nlc3M6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSBidWlsdCAlcycsCiAgICAgICAgICAgICAgICAnICcuam9pbihbcmVxLm5hbWUgZm9yIHJlcSBpbiBidWlsZF9zdWNjZXNzXSksCiAgICAgICAgICAgICkKICAgICAgICBpZiBidWlsZF9mYWlsdXJlOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gYnVpbGQgJXMnLAogICAgICAgICAgICAgICAgJyAnLmpvaW4oW3JlcS5uYW1lIGZvciByZXEgaW4gYnVpbGRfZmFpbHVyZV0pLAogICAgICAgICAgICApCiAgICAgICAgIyBSZXR1cm4gVHJ1ZSBpZiBhbGwgYnVpbGRzIHdlcmUgc3VjY2Vzc2Z1bAogICAgICAgIHJldHVybiBsZW4oYnVpbGRfZmFpbHVyZSkgPT0gMApQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAFxPukV+AAAAfgAAADQAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvZWFzeV9pbnN0YWxsLnB5IiIiUnVuIHRoZSBFYXN5SW5zdGFsbCBjb21tYW5kIiIiCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBtYWluCiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQAXRJ4pB54BAAeeAQA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX19pbml0X18ucHkjIGNvZGluZzogdXRmLTgKIiIiClBhY2thZ2UgcmVzb3VyY2UgQVBJCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBIHJlc291cmNlIGlzIGEgbG9naWNhbCBmaWxlIGNvbnRhaW5lZCB3aXRoaW4gYSBwYWNrYWdlLCBvciBhIGxvZ2ljYWwKc3ViZGlyZWN0b3J5IHRoZXJlb2YuICBUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgZXhwZWN0cyByZXNvdXJjZSBuYW1lcwp0byBoYXZlIHRoZWlyIHBhdGggcGFydHMgc2VwYXJhdGVkIHdpdGggYGAvYGAsICpub3QqIHdoYXRldmVyIHRoZSBsb2NhbApwYXRoIHNlcGFyYXRvciBpcy4gIERvIG5vdCB1c2Ugb3MucGF0aCBvcGVyYXRpb25zIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2UKbmFtZXMgYmVpbmcgcGFzc2VkIGludG8gdGhlIEFQSS4KClRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggbm9ybWFsIGZpbGVzeXN0ZW0gcGFja2FnZXMsCi5lZ2cgZmlsZXMsIGFuZCB1bnBhY2tlZCAuZWdnIGZpbGVzLiAgSXQgY2FuIGFsc28gd29yayBpbiBhIGxpbWl0ZWQgd2F5IHdpdGgKLnppcCBmaWxlcyBhbmQgd2l0aCBjdXN0b20gUEVQIDMwMiBsb2FkZXJzIHRoYXQgc3VwcG9ydCB0aGUgYGBnZXRfZGF0YSgpYGAKbWV0aG9kLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgaW8KaW1wb3J0IHRpbWUKaW1wb3J0IHJlCmltcG9ydCB0eXBlcwppbXBvcnQgemlwZmlsZQppbXBvcnQgemlwaW1wb3J0CmltcG9ydCB3YXJuaW5ncwppbXBvcnQgc3RhdAppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBwa2d1dGlsCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBwbGlzdGxpYgppbXBvcnQgZW1haWwucGFyc2VyCmltcG9ydCBlcnJubwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGluc3BlY3QKZnJvbSBwa2d1dGlsIGltcG9ydCBnZXRfaW1wb3J0ZXIKCnRyeToKICAgIGltcG9ydCBfaW1wCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgUHl0aG9uIDMuMiBjb21wYXRpYmlsaXR5CiAgICBpbXBvcnQgaW1wIGFzIF9pbXAKCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBtYXAsIGZpbHRlcgoKIyBjYXB0dXJlIHRoZXNlIHRvIGJ5cGFzcyBzYW5kYm94aW5nCmZyb20gb3MgaW1wb3J0IHV0aW1lCnRyeToKICAgIGZyb20gb3MgaW1wb3J0IG1rZGlyLCByZW5hbWUsIHVubGluawogICAgV1JJVEVfU1VQUE9SVCA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBubyB3cml0ZSBzdXBwb3J0LCBwcm9iYWJseSB1bmRlciBHQUUKICAgIFdSSVRFX1NVUFBPUlQgPSBGYWxzZQoKZnJvbSBvcyBpbXBvcnQgb3BlbiBhcyBvc19vcGVuCmZyb20gb3MucGF0aCBpbXBvcnQgaXNkaXIsIHNwbGl0Cgp0cnk6CiAgICBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeSBhcyBpbXBvcnRsaWJfbWFjaGluZXJ5CiAgICAjIGFjY2VzcyBhdHRyaWJ1dGUgdG8gZm9yY2UgaW1wb3J0IHVuZGVyIGRlbGF5ZWQgaW1wb3J0IG1lY2hhbmlzbXMuCiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5Ll9fbmFtZV9fCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydGxpYl9tYWNoaW5lcnkgPSBOb25lCgpmcm9tIC4gaW1wb3J0IHB5MzFjb21wYXQKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgYXBwZGlycwpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnZlcnNpb24nKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcuc3BlY2lmaWVycycpCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy5yZXF1aXJlbWVudHMnKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcubWFya2VycycpCgoKaWYgKDMsIDApIDwgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiUHl0aG9uIDMuMyBvciBsYXRlciBpcyByZXF1aXJlZCIpCgppZiBzaXguUFkyOgogICAgIyBUaG9zZSBidWlsdGluIGV4Y2VwdGlvbnMgYXJlIG9ubHkgZGVmaW5lZCBpbiBQeXRob24gMwogICAgUGVybWlzc2lvbkVycm9yID0gTm9uZQogICAgTm90QURpcmVjdG9yeUVycm9yID0gTm9uZQoKIyBkZWNsYXJlIHNvbWUgZ2xvYmFscyB0aGF0IHdpbGwgYmUgZGVmaW5lZCBsYXRlciB0bwojIHNhdGlzZnkgdGhlIGxpbnRlcnMuCnJlcXVpcmUgPSBOb25lCndvcmtpbmdfc2V0ID0gTm9uZQoKCmNsYXNzIFBFUDQ0MFdhcm5pbmcoUnVudGltZVdhcm5pbmcpOgogICAgIiIiCiAgICBVc2VkIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBhIHZlcnNpb24gb3Igc3BlY2lmaWVyIG5vdCBjb21wbHlpbmcgd2l0aAogICAgUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIF9TZXR1cHRvb2xzVmVyc2lvbk1peGluKG9iamVjdCk6CiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2hhc2hfXygpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPCBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19sdF9fKG90aGVyKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpIDw9IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2xlX18ob3RoZXIpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPT0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZXFfXyhvdGhlcikKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA+PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19nZV9fKG90aGVyKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID4gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZ3RfXyhvdGhlcikKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSAhPSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19uZV9fKG90aGVyKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiB0dXBsZShzZWxmKVtrZXldCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGNvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUocicoXGQrIHwgW2Etel0rIHwgXC58IC0pJywgcmUuVkVSQk9TRSkKICAgICAgICByZXBsYWNlID0gewogICAgICAgICAgICAncHJlJzogJ2MnLAogICAgICAgICAgICAncHJldmlldyc6ICdjJywKICAgICAgICAgICAgJy0nOiAnZmluYWwtJywKICAgICAgICAgICAgJ3JjJzogJ2MnLAogICAgICAgICAgICAnZGV2JzogJ0AnLAogICAgICAgIH0uZ2V0CgogICAgICAgIGRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKICAgICAgICAgICAgZm9yIHBhcnQgaW4gY29tcG9uZW50X3JlLnNwbGl0KHMpOgogICAgICAgICAgICAgICAgcGFydCA9IHJlcGxhY2UocGFydCwgcGFydCkKICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQgPT0gJy4nOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBwYXJ0WzoxXSBpbiAnMDEyMzQ1Njc4OSc6CiAgICAgICAgICAgICAgICAgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHBhcnQuemZpbGwoOCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgJyonICsgcGFydAoKICAgICAgICAgICAgIyBlbnN1cmUgdGhhdCBhbHBoYS9iZXRhL2NhbmRpZGF0ZSBhcmUgYmVmb3JlIGZpbmFsCiAgICAgICAgICAgIHlpZWxkICcqZmluYWwnCgogICAgICAgIGRlZiBvbGRfcGFyc2VfdmVyc2lvbihzKToKICAgICAgICAgICAgcGFydHMgPSBbXQogICAgICAgICAgICBmb3IgcGFydCBpbiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzLmxvd2VyKCkpOgogICAgICAgICAgICAgICAgaWYgcGFydC5zdGFydHN3aXRoKCcqJyk6CiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgJy0nIGJlZm9yZSBhIHByZXJlbGVhc2UgdGFnCiAgICAgICAgICAgICAgICAgICAgaWYgcGFydCA8ICcqZmluYWwnOgogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICcqZmluYWwtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBlYWNoIHNlcmllcyBvZiBudW1lcmljIHBhcnRzCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAnMDAwMDAwMDAnOgogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQogICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICAgICAgICAgIHJldHVybiB0dXBsZShwYXJ0cykKCiAgICAgICAgIyBXYXJuIGZvciB1c2Ugb2YgdGhpcyBmdW5jdGlvbgogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICJZb3UgaGF2ZSBpdGVyYXRlZCBvdmVyIHRoZSByZXN1bHQgb2YgIgogICAgICAgICAgICAicGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uLiBUaGlzIGlzIGEgbGVnYWN5IGJlaGF2aW9yIHdoaWNoIGlzICIKICAgICAgICAgICAgImluY29uc2lzdGVudCB3aXRoIHRoZSBuZXcgdmVyc2lvbiBjbGFzcyBpbnRyb2R1Y2VkIGluIHNldHVwdG9vbHMgIgogICAgICAgICAgICAiOC4wLiBJbiBtb3N0IGNhc2VzLCBjb252ZXJzaW9uIHRvIGEgdHVwbGUgaXMgdW5uZWNlc3NhcnkuIEZvciAiCiAgICAgICAgICAgICJjb21wYXJpc29uIG9mIHZlcnNpb25zLCBzb3J0IHRoZSBWZXJzaW9uIGluc3RhbmNlcyBkaXJlY3RseS4gSWYgIgogICAgICAgICAgICAieW91IGhhdmUgYW5vdGhlciB1c2UgY2FzZSByZXF1aXJpbmcgdGhlIHR1cGxlLCBwbGVhc2UgZmlsZSBhICIKICAgICAgICAgICAgImJ1ZyB3aXRoIHRoZSBzZXR1cHRvb2xzIHByb2plY3QgZGVzY3JpYmluZyB0aGF0IG5lZWQuIiwKICAgICAgICAgICAgUnVudGltZVdhcm5pbmcsCiAgICAgICAgICAgIHN0YWNrbGV2ZWw9MSwKICAgICAgICApCgogICAgICAgIGZvciBwYXJ0IGluIG9sZF9wYXJzZV92ZXJzaW9uKHN0cihzZWxmKSk6CiAgICAgICAgICAgIHlpZWxkIHBhcnQKCgpjbGFzcyBTZXR1cHRvb2xzVmVyc2lvbihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbik6CiAgICBwYXNzCgoKY2xhc3MgU2V0dXB0b29sc0xlZ2FjeVZlcnNpb24oX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2luZy52ZXJzaW9uLkxlZ2FjeVZlcnNpb24pOgogICAgcGFzcwoKCmRlZiBwYXJzZV92ZXJzaW9uKHYpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBTZXR1cHRvb2xzVmVyc2lvbih2KQogICAgZXhjZXB0IHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBTZXR1cHRvb2xzTGVnYWN5VmVyc2lvbih2KQoKCl9zdGF0ZV92YXJzID0ge30KCgpkZWYgX2RlY2xhcmVfc3RhdGUodmFydHlwZSwgKiprdyk6CiAgICBnbG9iYWxzKCkudXBkYXRlKGt3KQogICAgX3N0YXRlX3ZhcnMudXBkYXRlKGRpY3QuZnJvbWtleXMoa3csIHZhcnR5cGUpKQoKCmRlZiBfX2dldHN0YXRlX18oKToKICAgIHN0YXRlID0ge30KICAgIGcgPSBnbG9iYWxzKCkKICAgIGZvciBrLCB2IGluIF9zdGF0ZV92YXJzLml0ZW1zKCk6CiAgICAgICAgc3RhdGVba10gPSBnWydfc2dldF8nICsgdl0oZ1trXSkKICAgIHJldHVybiBzdGF0ZQoKCmRlZiBfX3NldHN0YXRlX18oc3RhdGUpOgogICAgZyA9IGdsb2JhbHMoKQogICAgZm9yIGssIHYgaW4gc3RhdGUuaXRlbXMoKToKICAgICAgICBnWydfc3NldF8nICsgX3N0YXRlX3ZhcnNba11dKGssIGdba10sIHYpCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgX3NnZXRfZGljdCh2YWwpOgogICAgcmV0dXJuIHZhbC5jb3B5KCkKCgpkZWYgX3NzZXRfZGljdChrZXksIG9iLCBzdGF0ZSk6CiAgICBvYi5jbGVhcigpCiAgICBvYi51cGRhdGUoc3RhdGUpCgoKZGVmIF9zZ2V0X29iamVjdCh2YWwpOgogICAgcmV0dXJuIHZhbC5fX2dldHN0YXRlX18oKQoKCmRlZiBfc3NldF9vYmplY3Qoa2V5LCBvYiwgc3RhdGUpOgogICAgb2IuX19zZXRzdGF0ZV9fKHN0YXRlKQoKCl9zZ2V0X25vbmUgPSBfc3NldF9ub25lID0gbGFtYmRhICphcmdzOiBOb25lCgoKZGVmIGdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3MgbWF4aW11bSBjb21wYXRpYmxlIHZlcnNpb24uCgogICAgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgbm9ybWFsbHkgcmVwb3J0cyB0aGUgbWluaW11bSB2ZXJzaW9uCiAgICBvZiBNYWMgT1MgWCB0aGF0IHdvdWxkIGJlIHJlcXVpcmVkIHRvICp1c2UqIGV4dGVuc2lvbnMgcHJvZHVjZWQgYnkKICAgIGRpc3R1dGlscy4gIEJ1dCB3aGF0IHdlIHdhbnQgd2hlbiBjaGVja2luZyBjb21wYXRpYmlsaXR5IGlzIHRvIGtub3cgdGhlCiAgICB2ZXJzaW9uIG9mIE1hYyBPUyBYIHRoYXQgd2UgYXJlICpydW5uaW5nKi4gIFRvIGFsbG93IHVzYWdlIG9mIHBhY2thZ2VzIHRoYXQKICAgIGV4cGxpY2l0bHkgcmVxdWlyZSBhIG5ld2VyIHZlcnNpb24gb2YgTWFjIE9TIFgsIHdlIG11c3QgYWxzbyBrbm93IHRoZQogICAgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBPUy4KCiAgICBJZiB0aGlzIGNvbmRpdGlvbiBvY2N1cnMgZm9yIGFueSBvdGhlciBwbGF0Zm9ybSB3aXRoIGEgdmVyc2lvbiBpbiBpdHMKICAgIHBsYXRmb3JtIHN0cmluZ3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGV4dGVuZGVkIGFjY29yZGluZ2x5LgogICAgIiIiCiAgICBwbGF0ID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKICAgIG0gPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocGxhdCkKICAgIGlmIG0gaXMgbm90IE5vbmUgYW5kIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBsYXQgPSAnbWFjb3N4LSVzLSVzJyAlICgnLicuam9pbihfbWFjb3N4X3ZlcnMoKVs6Ml0pLCBtLmdyb3VwKDMpKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIG5vdCBNYWMgT1MgWAogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGxhdAoKCl9fYWxsX18gPSBbCiAgICAjIEJhc2ljIHJlc291cmNlIGFjY2VzcyBhbmQgZGlzdHJpYnV0aW9uL2VudHJ5IHBvaW50IGRpc2NvdmVyeQogICAgJ3JlcXVpcmUnLCAncnVuX3NjcmlwdCcsICdnZXRfcHJvdmlkZXInLCAnZ2V0X2Rpc3RyaWJ1dGlvbicsCiAgICAnbG9hZF9lbnRyeV9wb2ludCcsICdnZXRfZW50cnlfbWFwJywgJ2dldF9lbnRyeV9pbmZvJywKICAgICdpdGVyX2VudHJ5X3BvaW50cycsCiAgICAncmVzb3VyY2Vfc3RyaW5nJywgJ3Jlc291cmNlX3N0cmVhbScsICdyZXNvdXJjZV9maWxlbmFtZScsCiAgICAncmVzb3VyY2VfbGlzdGRpcicsICdyZXNvdXJjZV9leGlzdHMnLCAncmVzb3VyY2VfaXNkaXInLAoKICAgICMgRW52aXJvbm1lbnRhbCBjb250cm9sCiAgICAnZGVjbGFyZV9uYW1lc3BhY2UnLCAnd29ya2luZ19zZXQnLCAnYWRkX2FjdGl2YXRpb25fbGlzdGVuZXInLAogICAgJ2ZpbmRfZGlzdHJpYnV0aW9ucycsICdzZXRfZXh0cmFjdGlvbl9wYXRoJywgJ2NsZWFudXBfcmVzb3VyY2VzJywKICAgICdnZXRfZGVmYXVsdF9jYWNoZScsCgogICAgIyBQcmltYXJ5IGltcGxlbWVudGF0aW9uIGNsYXNzZXMKICAgICdFbnZpcm9ubWVudCcsICdXb3JraW5nU2V0JywgJ1Jlc291cmNlTWFuYWdlcicsCiAgICAnRGlzdHJpYnV0aW9uJywgJ1JlcXVpcmVtZW50JywgJ0VudHJ5UG9pbnQnLAoKICAgICMgRXhjZXB0aW9ucwogICAgJ1Jlc29sdXRpb25FcnJvcicsICdWZXJzaW9uQ29uZmxpY3QnLCAnRGlzdHJpYnV0aW9uTm90Rm91bmQnLAogICAgJ1Vua25vd25FeHRyYScsICdFeHRyYWN0aW9uRXJyb3InLAoKICAgICMgV2FybmluZ3MKICAgICdQRVA0NDBXYXJuaW5nJywKCiAgICAjIFBhcnNpbmcgZnVuY3Rpb25zIGFuZCBzdHJpbmcgdXRpbGl0aWVzCiAgICAncGFyc2VfcmVxdWlyZW1lbnRzJywgJ3BhcnNlX3ZlcnNpb24nLCAnc2FmZV9uYW1lJywgJ3NhZmVfdmVyc2lvbicsCiAgICAnZ2V0X3BsYXRmb3JtJywgJ2NvbXBhdGlibGVfcGxhdGZvcm1zJywgJ3lpZWxkX2xpbmVzJywgJ3NwbGl0X3NlY3Rpb25zJywKICAgICdzYWZlX2V4dHJhJywgJ3RvX2ZpbGVuYW1lJywgJ2ludmFsaWRfbWFya2VyJywgJ2V2YWx1YXRlX21hcmtlcicsCgogICAgIyBmaWxlc3lzdGVtIHV0aWxpdGllcwogICAgJ2Vuc3VyZV9kaXJlY3RvcnknLCAnbm9ybWFsaXplX3BhdGgnLAoKICAgICMgRGlzdHJpYnV0aW9uICJwcmVjZWRlbmNlIiBjb25zdGFudHMKICAgICdFR0dfRElTVCcsICdCSU5BUllfRElTVCcsICdTT1VSQ0VfRElTVCcsICdDSEVDS09VVF9ESVNUJywgJ0RFVkVMT1BfRElTVCcsCgogICAgIyAiUHJvdmlkZXIiIGludGVyZmFjZXMsIGltcGxlbWVudGF0aW9ucywgYW5kIHJlZ2lzdHJhdGlvbi9sb29rdXAgQVBJcwogICAgJ0lNZXRhZGF0YVByb3ZpZGVyJywgJ0lSZXNvdXJjZVByb3ZpZGVyJywgJ0ZpbGVNZXRhZGF0YScsCiAgICAnUGF0aE1ldGFkYXRhJywgJ0VnZ01ldGFkYXRhJywgJ0VtcHR5UHJvdmlkZXInLCAnZW1wdHlfcHJvdmlkZXInLAogICAgJ051bGxQcm92aWRlcicsICdFZ2dQcm92aWRlcicsICdEZWZhdWx0UHJvdmlkZXInLCAnWmlwUHJvdmlkZXInLAogICAgJ3JlZ2lzdGVyX2ZpbmRlcicsICdyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcicsICdyZWdpc3Rlcl9sb2FkZXJfdHlwZScsCiAgICAnZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzJywgJ2dldF9pbXBvcnRlcicsCgogICAgIyBEZXByZWNhdGVkL2JhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seQogICAgJ3J1bl9tYWluJywgJ0F2YWlsYWJsZURpc3RyaWJ1dGlvbnMnLApdCgoKY2xhc3MgUmVzb2x1dGlvbkVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGZvciBkZXBlbmRlbmN5IHJlc29sdXRpb24gZXJyb3JzIiIiCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArIHJlcHIoc2VsZi5hcmdzKQoKCmNsYXNzIFZlcnNpb25Db25mbGljdChSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiCiAgICBBbiBhbHJlYWR5LWluc3RhbGxlZCB2ZXJzaW9uIGNvbmZsaWN0cyB3aXRoIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbi4KCiAgICBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgaW5zdGFsbGVkIERpc3RyaWJ1dGlvbiBhbmQgdGhlIHJlcXVlc3RlZAogICAgUmVxdWlyZW1lbnQuCiAgICAiIiIKCiAgICBfdGVtcGxhdGUgPSAie3NlbGYuZGlzdH0gaXMgaW5zdGFsbGVkIGJ1dCB7c2VsZi5yZXF9IGlzIHJlcXVpcmVkIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRpc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzFdCgogICAgZGVmIHJlcG9ydChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGVtcGxhdGUuZm9ybWF0KCoqbG9jYWxzKCkpCgogICAgZGVmIHdpdGhfY29udGV4dChzZWxmLCByZXF1aXJlZF9ieSk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgcmVxdWlyZWRfYnkgaXMgbm9uLWVtcHR5LCByZXR1cm4gYSB2ZXJzaW9uIG9mIHNlbGYgdGhhdCBpcyBhCiAgICAgICAgQ29udGV4dHVhbFZlcnNpb25Db25mbGljdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgcmVxdWlyZWRfYnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgYXJncyA9IHNlbGYuYXJncyArIChyZXF1aXJlZF9ieSwpCiAgICAgICAgcmV0dXJuIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QoKmFyZ3MpCgoKY2xhc3MgQ29udGV4dHVhbFZlcnNpb25Db25mbGljdChWZXJzaW9uQ29uZmxpY3QpOgogICAgIiIiCiAgICBBIFZlcnNpb25Db25mbGljdCB0aGF0IGFjY2VwdHMgYSB0aGlyZCBwYXJhbWV0ZXIsIHRoZSBzZXQgb2YgdGhlCiAgICByZXF1aXJlbWVudHMgdGhhdCByZXF1aXJlZCB0aGUgaW5zdGFsbGVkIERpc3RyaWJ1dGlvbi4KICAgICIiIgoKICAgIF90ZW1wbGF0ZSA9IFZlcnNpb25Db25mbGljdC5fdGVtcGxhdGUgKyAnIGJ5IHtzZWxmLnJlcXVpcmVkX2J5fScKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlZF9ieShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzJdCgoKY2xhc3MgRGlzdHJpYnV0aW9uTm90Rm91bmQoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIkEgcmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kIiIiCgogICAgX3RlbXBsYXRlID0gKCJUaGUgJ3tzZWxmLnJlcX0nIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kICIKICAgICAgICAgICAgICAgICAiYW5kIGlzIHJlcXVpcmVkIGJ5IHtzZWxmLnJlcXVpcmVyc19zdHJ9IikKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZXJzX3N0cihzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5yZXF1aXJlcnM6CiAgICAgICAgICAgIHJldHVybiAndGhlIGFwcGxpY2F0aW9uJwogICAgICAgIHJldHVybiAnLCAnLmpvaW4oc2VsZi5yZXF1aXJlcnMpCgogICAgZGVmIHJlcG9ydChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGVtcGxhdGUuZm9ybWF0KCoqbG9jYWxzKCkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucmVwb3J0KCkKCgpjbGFzcyBVbmtub3duRXh0cmEoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIkRpc3RyaWJ1dGlvbiBkb2Vzbid0IGhhdmUgYW4gImV4dHJhIGZlYXR1cmUiIG9mIHRoZSBnaXZlbiBuYW1lIiIiCgoKX3Byb3ZpZGVyX2ZhY3RvcmllcyA9IHt9CgpQWV9NQUpPUiA9IHN5cy52ZXJzaW9uWzozXQpFR0dfRElTVCA9IDMKQklOQVJZX0RJU1QgPSAyClNPVVJDRV9ESVNUID0gMQpDSEVDS09VVF9ESVNUID0gMApERVZFTE9QX0RJU1QgPSAtMQoKCmRlZiByZWdpc3Rlcl9sb2FkZXJfdHlwZShsb2FkZXJfdHlwZSwgcHJvdmlkZXJfZmFjdG9yeSk6CiAgICAiIiJSZWdpc3RlciBgcHJvdmlkZXJfZmFjdG9yeWAgdG8gbWFrZSBwcm92aWRlcnMgZm9yIGBsb2FkZXJfdHlwZWAKCiAgICBgbG9hZGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiBgYG1vZHVsZS5fX2xvYWRlcl9fYGAsCiAgICBhbmQgYHByb3ZpZGVyX2ZhY3RvcnlgIGlzIGEgZnVuY3Rpb24gdGhhdCwgcGFzc2VkIGEgKm1vZHVsZSogb2JqZWN0LAogICAgcmV0dXJucyBhbiBgYElSZXNvdXJjZVByb3ZpZGVyYGAgZm9yIHRoYXQgbW9kdWxlLgogICAgIiIiCiAgICBfcHJvdmlkZXJfZmFjdG9yaWVzW2xvYWRlcl90eXBlXSA9IHByb3ZpZGVyX2ZhY3RvcnkKCgpkZWYgZ2V0X3Byb3ZpZGVyKG1vZHVsZU9yUmVxKToKICAgICIiIlJldHVybiBhbiBJUmVzb3VyY2VQcm92aWRlciBmb3IgdGhlIG5hbWVkIG1vZHVsZSBvciByZXF1aXJlbWVudCIiIgogICAgaWYgaXNpbnN0YW5jZShtb2R1bGVPclJlcSwgUmVxdWlyZW1lbnQpOgogICAgICAgIHJldHVybiB3b3JraW5nX3NldC5maW5kKG1vZHVsZU9yUmVxKSBvciByZXF1aXJlKHN0cihtb2R1bGVPclJlcSkpWzBdCiAgICB0cnk6CiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgX19pbXBvcnRfXyhtb2R1bGVPclJlcSkKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICByZXR1cm4gX2ZpbmRfYWRhcHRlcihfcHJvdmlkZXJfZmFjdG9yaWVzLCBsb2FkZXIpKG1vZHVsZSkKCgpkZWYgX21hY29zeF92ZXJzKF9jYWNoZT1bXSk6CiAgICBpZiBub3QgX2NhY2hlOgogICAgICAgIHZlcnNpb24gPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0KICAgICAgICAjIGZhbGxiYWNrIGZvciBNYWNQb3J0cwogICAgICAgIGlmIHZlcnNpb24gPT0gJyc6CiAgICAgICAgICAgIHBsaXN0ID0gJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdCcKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGxpc3QpOgogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihwbGlzdGxpYiwgJ3JlYWRQbGlzdCcpOgogICAgICAgICAgICAgICAgICAgIHBsaXN0X2NvbnRlbnQgPSBwbGlzdGxpYi5yZWFkUGxpc3QocGxpc3QpCiAgICAgICAgICAgICAgICAgICAgaWYgJ1Byb2R1Y3RWZXJzaW9uJyBpbiBwbGlzdF9jb250ZW50OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gcGxpc3RfY29udGVudFsnUHJvZHVjdFZlcnNpb24nXQoKICAgICAgICBfY2FjaGUuYXBwZW5kKHZlcnNpb24uc3BsaXQoJy4nKSkKICAgIHJldHVybiBfY2FjaGVbMF0KCgpkZWYgX21hY29zeF9hcmNoKG1hY2hpbmUpOgogICAgcmV0dXJuIHsnUG93ZXJQQyc6ICdwcGMnLCAnUG93ZXJfTWFjaW50b3NoJzogJ3BwYyd9LmdldChtYWNoaW5lLCBtYWNoaW5lKQoKCmRlZiBnZXRfYnVpbGRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3Mgc3RyaW5nIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zCgogICAgWFhYIEN1cnJlbnRseSB0aGlzIGlzIHRoZSBzYW1lIGFzIGBgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKClgYCwgYnV0IGl0CiAgICBuZWVkcyBzb21lIGhhY2tzIGZvciBMaW51eCBhbmQgTWFjIE9TIFguCiAgICAiIiIKICAgIHRyeToKICAgICAgICAjIFB5dGhvbiAyLjcgb3IgPj0zLjIKICAgICAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCgogICAgcGxhdCA9IGdldF9wbGF0Zm9ybSgpCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiIgYW5kIG5vdCBwbGF0LnN0YXJ0c3dpdGgoJ21hY29zeC0nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlcnNpb24gPSBfbWFjb3N4X3ZlcnMoKQogICAgICAgICAgICBtYWNoaW5lID0gb3MudW5hbWUoKVs0XS5yZXBsYWNlKCIgIiwgIl8iKQogICAgICAgICAgICByZXR1cm4gIm1hY29zeC0lZC4lZC0lcyIgJSAoCiAgICAgICAgICAgICAgICBpbnQodmVyc2lvblswXSksIGludCh2ZXJzaW9uWzFdKSwKICAgICAgICAgICAgICAgIF9tYWNvc3hfYXJjaChtYWNoaW5lKSwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIGlmIHNvbWVvbmUgaXMgcnVubmluZyBhIG5vbi1NYWMgZGFyd2luIHN5c3RlbSwgdGhpcyB3aWxsIGZhbGwKICAgICAgICAgICAgIyB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwbGF0CgoKbWFjb3NWZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyIm1hY29zeC0oXGQrKVwuKFxkKyktKC4qKSIpCmRhcndpblZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIiZGFyd2luLShcZCspXC4oXGQrKVwuKFxkKyktKC4qKSIpCiMgWFhYIGJhY2t3YXJkIGNvbXBhdApnZXRfcGxhdGZvcm0gPSBnZXRfYnVpbGRfcGxhdGZvcm0KCgpkZWYgY29tcGF0aWJsZV9wbGF0Zm9ybXMocHJvdmlkZWQsIHJlcXVpcmVkKToKICAgICIiIkNhbiBjb2RlIGZvciB0aGUgYHByb3ZpZGVkYCBwbGF0Zm9ybSBydW4gb24gdGhlIGByZXF1aXJlZGAgcGxhdGZvcm0/CgogICAgUmV0dXJucyB0cnVlIGlmIGVpdGhlciBwbGF0Zm9ybSBpcyBgYE5vbmVgYCwgb3IgdGhlIHBsYXRmb3JtcyBhcmUgZXF1YWwuCgogICAgWFhYIE5lZWRzIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBMaW51eCBhbmQgb3RoZXIgdW5peHkgT1Nlcy4KICAgICIiIgogICAgaWYgcHJvdmlkZWQgaXMgTm9uZSBvciByZXF1aXJlZCBpcyBOb25lIG9yIHByb3ZpZGVkID09IHJlcXVpcmVkOgogICAgICAgICMgZWFzeSBjYXNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIE1hYyBPUyBYIHNwZWNpYWwgY2FzZXMKICAgIHJlcU1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChyZXF1aXJlZCkKICAgIGlmIHJlcU1hYzoKICAgICAgICBwcm92TWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQoKICAgICAgICAjIGlzIHRoaXMgYSBNYWMgcGFja2FnZT8KICAgICAgICBpZiBub3QgcHJvdk1hYzoKICAgICAgICAgICAgIyB0aGlzIGlzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBwYWNrYWdlcyBidWlsdCBiZWZvcmUKICAgICAgICAgICAgIyBzZXR1cHRvb2xzIDAuNi4gQWxsIHBhY2thZ2VzIGJ1aWx0IGFmdGVyIHRoaXMgcG9pbnQgd2lsbAogICAgICAgICAgICAjIHVzZSB0aGUgbmV3IG1hY29zeCBkZXNpZ25hdGlvbi4KICAgICAgICAgICAgcHJvdkRhcndpbiA9IGRhcndpblZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCiAgICAgICAgICAgIGlmIHByb3ZEYXJ3aW46CiAgICAgICAgICAgICAgICBkdmVyc2lvbiA9IGludChwcm92RGFyd2luLmdyb3VwKDEpKQogICAgICAgICAgICAgICAgbWFjb3N2ZXJzaW9uID0gIiVzLiVzIiAlIChyZXFNYWMuZ3JvdXAoMSksIHJlcU1hYy5ncm91cCgyKSkKICAgICAgICAgICAgICAgIGlmIGR2ZXJzaW9uID09IDcgYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuMyIgb3IgXAogICAgICAgICAgICAgICAgICAgICAgICBkdmVyc2lvbiA9PSA4IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjQiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgICMgZWdnIGlzbid0IG1hY29zeCBvciBsZWdhY3kgZGFyd2luCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGFyZSB0aGV5IHRoZSBzYW1lIG1ham9yIHZlcnNpb24gYW5kIG1hY2hpbmUgdHlwZT8KICAgICAgICBpZiBwcm92TWFjLmdyb3VwKDEpICE9IHJlcU1hYy5ncm91cCgxKSBvciBcCiAgICAgICAgICAgICAgICBwcm92TWFjLmdyb3VwKDMpICE9IHJlcU1hYy5ncm91cCgzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgaXMgdGhlIHJlcXVpcmVkIE9TIG1ham9yIHVwZGF0ZSA+PSB0aGUgcHJvdmlkZWQgb25lPwogICAgICAgIGlmIGludChwcm92TWFjLmdyb3VwKDIpKSA+IGludChyZXFNYWMuZ3JvdXAoMikpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIFhYWCBMaW51eCBhbmQgb3RoZXIgcGxhdGZvcm1zJyBzcGVjaWFsIGNhc2VzIHNob3VsZCBnbyBoZXJlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgcnVuX3NjcmlwdChkaXN0X3NwZWMsIHNjcmlwdF9uYW1lKToKICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gYGRpc3Rfc3BlY2AgYW5kIHJ1biBpdHMgYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQogICAgbnMuY2xlYXIoKQogICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICByZXF1aXJlKGRpc3Rfc3BlYylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgoKIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CnJ1bl9tYWluID0gcnVuX3NjcmlwdAoKCmRlZiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpOgogICAgIiIiUmV0dXJuIGEgY3VycmVudCBkaXN0cmlidXRpb24gb2JqZWN0IGZvciBhIFJlcXVpcmVtZW50IG9yIHN0cmluZyIiIgogICAgaWYgaXNpbnN0YW5jZShkaXN0LCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBkaXN0ID0gUmVxdWlyZW1lbnQucGFyc2UoZGlzdCkKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgUmVxdWlyZW1lbnQpOgogICAgICAgIGRpc3QgPSBnZXRfcHJvdmlkZXIoZGlzdCkKICAgIGlmIG5vdCBpc2luc3RhbmNlKGRpc3QsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJFeHBlY3RlZCBzdHJpbmcsIFJlcXVpcmVtZW50LCBvciBEaXN0cmlidXRpb24iLCBkaXN0KQogICAgcmV0dXJuIGRpc3QKCgpkZWYgbG9hZF9lbnRyeV9wb2ludChkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgZm9yIGBkaXN0YCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkubG9hZF9lbnRyeV9wb2ludChncm91cCwgbmFtZSkKCgpkZWYgZ2V0X2VudHJ5X21hcChkaXN0LCBncm91cD1Ob25lKToKICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9tYXAoZ3JvdXApCgoKZGVmIGdldF9lbnRyeV9pbmZvKGRpc3QsIGdyb3VwLCBuYW1lKToKICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCgoKY2xhc3MgSU1ldGFkYXRhUHJvdmlkZXI6CiAgICBkZWYgaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UncyBkaXN0cmlidXRpb24gY29udGFpbiB0aGUgbmFtZWQgbWV0YWRhdGE/IiIiCgogICAgZGVmIGdldF9tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJUaGUgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICIiIllpZWxkIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGxpc3Qgb2Ygbm9uLWJsYW5rIG5vbi1jb21tZW50IGxpbmVzCgogICAgICAgTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBzdHJpcHBlZCBmcm9tIGVhY2ggbGluZSwgYW5kIGxpbmVzCiAgICAgICB3aXRoIGBgI2BgIGFzIHRoZSBmaXJzdCBub24tYmxhbmsgY2hhcmFjdGVyIGFyZSBvbWl0dGVkLiIiIgoKICAgIGRlZiBtZXRhZGF0YV9pc2RpcihuYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgbWV0YWRhdGEgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKG5hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgbWV0YWRhdGEgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKICAgIGRlZiBydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBuYW1lc3BhY2UpOgogICAgICAgICIiIkV4ZWN1dGUgdGhlIG5hbWVkIHNjcmlwdCBpbiB0aGUgc3VwcGxpZWQgbmFtZXNwYWNlIGRpY3Rpb25hcnkiIiIKCgpjbGFzcyBJUmVzb3VyY2VQcm92aWRlcihJTWV0YWRhdGFQcm92aWRlcik6CiAgICAiIiJBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlIGNvbnRhaW4gdGhlIG5hbWVkIHJlc291cmNlPyIiIgoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgcmVzb3VyY2UgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKCmNsYXNzIFdvcmtpbmdTZXQob2JqZWN0KToKICAgICIiIkEgY29sbGVjdGlvbiBvZiBhY3RpdmUgZGlzdHJpYnV0aW9ucyBvbiBzeXMucGF0aCAob3IgYSBzaW1pbGFyIGxpc3QpIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudHJpZXM9Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIHdvcmtpbmcgc2V0IGZyb20gbGlzdCBvZiBwYXRoIGVudHJpZXMgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgc2VsZi5lbnRyaWVzID0gW10KICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSB7fQogICAgICAgIHNlbGYuYnlfa2V5ID0ge30KICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFtdCgogICAgICAgIGlmIGVudHJpZXMgaXMgTm9uZToKICAgICAgICAgICAgZW50cmllcyA9IHN5cy5wYXRoCgogICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgogICAgICAgICAgICBzZWxmLmFkZF9lbnRyeShlbnRyeSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfbWFzdGVyKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHdzID0gY2xzKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gX19tYWluX18gaW1wb3J0IF9fcmVxdWlyZXNfXwogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgIyBUaGUgbWFpbiBwcm9ncmFtIGRvZXMgbm90IGxpc3QgYW55IHJlcXVpcmVtZW50cwogICAgICAgICAgICByZXR1cm4gd3MKCiAgICAgICAgIyBlbnN1cmUgdGhlIHJlcXVpcmVtZW50cyBhcmUgbWV0CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cy5yZXF1aXJlKF9fcmVxdWlyZXNfXykKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0OgogICAgICAgICAgICByZXR1cm4gY2xzLl9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhfX3JlcXVpcmVzX18pCgogICAgICAgIHJldHVybiB3cwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhjbHMsIHJlcV9zcGVjKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIHdvcmtpbmcgc2V0IGZyb20gYSByZXF1aXJlbWVudCBzcGVjLiBSZXdyaXRlcyBzeXMucGF0aC4KICAgICAgICAiIiIKICAgICAgICAjIHRyeSBpdCB3aXRob3V0IGRlZmF1bHRzIGFscmVhZHkgb24gc3lzLnBhdGgKICAgICAgICAjIGJ5IHN0YXJ0aW5nIHdpdGggYW4gZW1wdHkgcGF0aAogICAgICAgIHdzID0gY2xzKFtdKQogICAgICAgIHJlcXMgPSBwYXJzZV9yZXF1aXJlbWVudHMocmVxX3NwZWMpCiAgICAgICAgZGlzdHMgPSB3cy5yZXNvbHZlKHJlcXMsIEVudmlyb25tZW50KCkpCiAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgIHdzLmFkZChkaXN0KQoKICAgICAgICAjIGFkZCBhbnkgbWlzc2luZyBlbnRyaWVzIGZyb20gc3lzLnBhdGgKICAgICAgICBmb3IgZW50cnkgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIGlmIGVudHJ5IG5vdCBpbiB3cy5lbnRyaWVzOgogICAgICAgICAgICAgICAgd3MuYWRkX2VudHJ5KGVudHJ5KQoKICAgICAgICAjIHRoZW4gY29weSBiYWNrIHRvIHN5cy5wYXRoCiAgICAgICAgc3lzLnBhdGhbOl0gPSB3cy5lbnRyaWVzCiAgICAgICAgcmV0dXJuIHdzCgogICAgZGVmIGFkZF9lbnRyeShzZWxmLCBlbnRyeSk6CiAgICAgICAgIiIiQWRkIGEgcGF0aCBpdGVtIHRvIGBgLmVudHJpZXNgYCwgZmluZGluZyBhbnkgZGlzdHJpYnV0aW9ucyBvbiBpdAoKICAgICAgICBgYGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSlgYCBpcyB1c2VkIHRvIGZpbmQgZGlzdHJpYnV0aW9ucwogICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggZW50cnksIGFuZCB0aGV5IGFyZSBhZGRlZC4gIGBlbnRyeWAgaXMKICAgICAgICBhbHdheXMgYXBwZW5kZWQgdG8gYGAuZW50cmllc2BgLCBldmVuIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudC4KICAgICAgICAoVGhpcyBpcyBiZWNhdXNlIGBgc3lzLnBhdGhgYCBjYW4gY29udGFpbiB0aGUgc2FtZSB2YWx1ZSBtb3JlIHRoYW4KICAgICAgICBvbmNlLCBhbmQgdGhlIGBgLmVudHJpZXNgYCBvZiB0aGUgYGBzeXMucGF0aGBgIFdvcmtpbmdTZXQgc2hvdWxkIGFsd2F5cwogICAgICAgIGVxdWFsIGBgc3lzLnBhdGhgYC4pCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQogICAgICAgIHNlbGYuZW50cmllcy5hcHBlbmQoZW50cnkpCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKToKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCwgZW50cnksIEZhbHNlKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiVHJ1ZSBpZiBgZGlzdGAgaXMgdGhlIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIGl0cyBwcm9qZWN0IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYnlfa2V5LmdldChkaXN0LmtleSkgPT0gZGlzdAoKICAgIGRlZiBmaW5kKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiRmluZCBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyByZXF1aXJlbWVudCBgcmVxYAoKICAgICAgICBJZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIHRoaXMKICAgICAgICByZXR1cm5zIGl0IGFzIGxvbmcgYXMgaXQgbWVldHMgdGhlIHZlcnNpb24gcmVxdWlyZW1lbnQgc3BlY2lmaWVkIGJ5CiAgICAgICAgYHJlcWAuICBCdXQsIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBpdAogICAgICAgIGRvZXMgKm5vdCogbWVldCB0aGUgYHJlcWAgcmVxdWlyZW1lbnQsIGBgVmVyc2lvbkNvbmZsaWN0YGAgaXMgcmFpc2VkLgogICAgICAgIElmIHRoZXJlIGlzIG5vIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCwgYGBOb25lYGAKICAgICAgICBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgZGlzdCBub3QgaW4gcmVxOgogICAgICAgICAgICAjIFhYWCBhZGQgbW9yZSBpbmZvCiAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpCiAgICAgICAgcmV0dXJuIGRpc3QKCiAgICBkZWYgaXRlcl9lbnRyeV9wb2ludHMoc2VsZiwgZ3JvdXAsIG5hbWU9Tm9uZSk6CiAgICAgICAgIiIiWWllbGQgZW50cnkgcG9pbnQgb2JqZWN0cyBmcm9tIGBncm91cGAgbWF0Y2hpbmcgYG5hbWVgCgogICAgICAgIElmIGBuYW1lYCBpcyBOb25lLCB5aWVsZHMgYWxsIGVudHJ5IHBvaW50cyBpbiBgZ3JvdXBgIGZyb20gYWxsCiAgICAgICAgZGlzdHJpYnV0aW9ucyBpbiB0aGUgd29ya2luZyBzZXQsIG90aGVyd2lzZSBvbmx5IG9uZXMgbWF0Y2hpbmcKICAgICAgICBib3RoIGBncm91cGAgYW5kIGBuYW1lYCBhcmUgeWllbGRlZCAoaW4gZGlzdHJpYnV0aW9uIG9yZGVyKS4KICAgICAgICAiIiIKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgogICAgICAgICAgICBlbnRyaWVzID0gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKQogICAgICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBmb3IgZXAgaW4gZW50cmllcy52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBlcAogICAgICAgICAgICBlbGlmIG5hbWUgaW4gZW50cmllczoKICAgICAgICAgICAgICAgIHlpZWxkIGVudHJpZXNbbmFtZV0KCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCByZXF1aXJlcywgc2NyaXB0X25hbWUpOgogICAgICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gZm9yIGByZXF1aXJlc2AgYW5kIHJ1biBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgogICAgICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgICAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgICAgICBucy5jbGVhcigpCiAgICAgICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICAgICAgc2VsZi5yZXF1aXJlKHJlcXVpcmVzKVswXS5ydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBucykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBmb3Igbm9uLWR1cGxpY2F0ZSBwcm9qZWN0cyBpbiB0aGUgd29ya2luZyBzZXQKCiAgICAgICAgVGhlIHlpZWxkIG9yZGVyIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgaXRlbXMnIHBhdGggZW50cmllcyB3ZXJlCiAgICAgICAgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHNlZW4gPSB7fQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuZW50cmllczoKICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VsZi5lbnRyeV9rZXlzOgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGEgY2FjaGUgaXNzdWUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuZW50cnlfa2V5c1tpdGVtXToKICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWVuW2tleV0gPSAxCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5ieV9rZXlba2V5XQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCwgZW50cnk9Tm9uZSwgaW5zZXJ0PVRydWUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkFkZCBgZGlzdGAgdG8gd29ya2luZyBzZXQsIGFzc29jaWF0ZWQgd2l0aCBgZW50cnlgCgogICAgICAgIElmIGBlbnRyeWAgaXMgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBgYC5sb2NhdGlvbmBgIG9mIGBkaXN0YC4KICAgICAgICBPbiBleGl0IGZyb20gdGhpcyByb3V0aW5lLCBgZW50cnlgIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtpbmcKICAgICAgICBzZXQncyBgYC5lbnRyaWVzYGAgKGlmIGl0IHdhc24ndCBhbHJlYWR5IHByZXNlbnQpLgoKICAgICAgICBgZGlzdGAgaXMgb25seSBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaWYgaXQncyBmb3IgYSBwcm9qZWN0IHRoYXQKICAgICAgICBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIGRpc3RyaWJ1dGlvbiBpbiB0aGUgc2V0LCB1bmxlc3MgYHJlcGxhY2U9VHJ1ZWAuCiAgICAgICAgSWYgaXQncyBhZGRlZCwgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggdGhlIGBgc3Vic2NyaWJlKClgYCBtZXRob2QKICAgICAgICB3aWxsIGJlIGNhbGxlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBpbnNlcnQ6CiAgICAgICAgICAgIGRpc3QuaW5zZXJ0X29uKHNlbGYuZW50cmllcywgZW50cnksIHJlcGxhY2U9cmVwbGFjZSkKCiAgICAgICAgaWYgZW50cnkgaXMgTm9uZToKICAgICAgICAgICAgZW50cnkgPSBkaXN0LmxvY2F0aW9uCiAgICAgICAga2V5cyA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBrZXlzMiA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGRpc3QubG9jYXRpb24sIFtdKQogICAgICAgIGlmIG5vdCByZXBsYWNlIGFuZCBkaXN0LmtleSBpbiBzZWxmLmJ5X2tleToKICAgICAgICAgICAgIyBpZ25vcmUgaGlkZGVuIGRpc3Ryb3MKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuYnlfa2V5W2Rpc3Qua2V5XSA9IGRpc3QKICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czoKICAgICAgICAgICAga2V5cy5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXMyOgogICAgICAgICAgICBrZXlzMi5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgc2VsZi5fYWRkZWRfbmV3KGRpc3QpCgogICAgZGVmIHJlc29sdmUoc2VsZiwgcmVxdWlyZW1lbnRzLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsCiAgICAgICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPUZhbHNlLCBleHRyYXM9Tm9uZSk6CiAgICAgICAgIiIiTGlzdCBhbGwgZGlzdHJpYnV0aW9ucyBuZWVkZWQgdG8gKHJlY3Vyc2l2ZWx5KSBtZWV0IGByZXF1aXJlbWVudHNgCgogICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cy4gIGBlbnZgLAogICAgICAgIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlLiAgSWYKICAgICAgICBub3Qgc3VwcGxpZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSB3aXRoaW4gYW55CiAgICAgICAgZW50cnkgb3IgZGlzdHJpYnV0aW9uIGluIHRoZSB3b3JraW5nIHNldC4gIGBpbnN0YWxsZXJgLCBpZiBzdXBwbGllZCwKICAgICAgICB3aWxsIGJlIGludm9rZWQgd2l0aCBlYWNoIHJlcXVpcmVtZW50IHRoYXQgY2Fubm90IGJlIG1ldCBieSBhbgogICAgICAgIGFscmVhZHktaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbjsgaXQgc2hvdWxkIHJldHVybiBhIGBgRGlzdHJpYnV0aW9uYGAgb3IKICAgICAgICBgYE5vbmVgYC4KCiAgICAgICAgVW5sZXNzIGByZXBsYWNlX2NvbmZsaWN0aW5nPVRydWVgLCByYWlzZXMgYSBWZXJzaW9uQ29uZmxpY3QgZXhjZXB0aW9uCiAgICAgICAgaWYKICAgICAgICBhbnkgcmVxdWlyZW1lbnRzIGFyZSBmb3VuZCBvbiB0aGUgcGF0aCB0aGF0IGhhdmUgdGhlIGNvcnJlY3QgbmFtZSBidXQKICAgICAgICB0aGUgd3JvbmcgdmVyc2lvbi4gIE90aGVyd2lzZSwgaWYgYW4gYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQgaXQgd2lsbCBiZQogICAgICAgIGludm9rZWQgdG8gb2J0YWluIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIHJlcXVpcmVtZW50IGFuZCBhY3RpdmF0ZQogICAgICAgIGl0LgoKICAgICAgICBgZXh0cmFzYCBpcyBhIGxpc3Qgb2YgdGhlIGV4dHJhcyB0byBiZSB1c2VkIHdpdGggdGhlc2UgcmVxdWlyZW1lbnRzLgogICAgICAgIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgZXh0cmEgcmVxdWlyZW1lbnRzIG1heSBsb29rIGxpa2UgYG15X3JlcTsKICAgICAgICBleHRyYSA9ICJteV9leHRyYSJgLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgaW50ZXJwcmV0ZWQgYXMgYSBwdXJlbHkKICAgICAgICBvcHRpb25hbCByZXF1aXJlbWVudC4gIEluc3RlYWQsIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBhc3NlcnQgdGhhdCB0aGVzZQogICAgICAgIHJlcXVpcmVtZW50cyBhcmUgdHJ1bHkgcmVxdWlyZWQuCiAgICAgICAgIiIiCgogICAgICAgICMgc2V0IHVwIHRoZSBzdGFjawogICAgICAgIHJlcXVpcmVtZW50cyA9IGxpc3QocmVxdWlyZW1lbnRzKVs6Oi0xXQogICAgICAgICMgc2V0IG9mIHByb2Nlc3NlZCByZXF1aXJlbWVudHMKICAgICAgICBwcm9jZXNzZWQgPSB7fQogICAgICAgICMga2V5IC0+IGRpc3QKICAgICAgICBiZXN0ID0ge30KICAgICAgICB0b19hY3RpdmF0ZSA9IFtdCgogICAgICAgIHJlcV9leHRyYXMgPSBfUmVxRXh0cmFzKCkKCiAgICAgICAgIyBNYXBwaW5nIG9mIHJlcXVpcmVtZW50IHRvIHNldCBvZiBkaXN0cmlidXRpb25zIHRoYXQgcmVxdWlyZWQgaXQ7CiAgICAgICAgIyB1c2VmdWwgZm9yIHJlcG9ydGluZyBpbmZvIGFib3V0IGNvbmZsaWN0cy4KICAgICAgICByZXF1aXJlZF9ieSA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KHNldCkKCiAgICAgICAgd2hpbGUgcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAjIHByb2Nlc3MgZGVwZW5kZW5jaWVzIGJyZWFkdGgtZmlyc3QKICAgICAgICAgICAgcmVxID0gcmVxdWlyZW1lbnRzLnBvcCgwKQogICAgICAgICAgICBpZiByZXEgaW4gcHJvY2Vzc2VkOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgY3ljbGljIG9yIHJlZHVuZGFudCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBub3QgcmVxX2V4dHJhcy5tYXJrZXJzX3Bhc3MocmVxLCBleHRyYXMpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGRpc3QgPSBiZXN0LmdldChyZXEua2V5KQogICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIEZpbmQgdGhlIGJlc3QgZGlzdHJpYnV0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIG1hcAogICAgICAgICAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQogICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lIG9yIChkaXN0IG5vdCBpbiByZXEgYW5kIHJlcGxhY2VfY29uZmxpY3RpbmcpOgogICAgICAgICAgICAgICAgICAgIHdzID0gc2VsZgogICAgICAgICAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSBhbiBlbXB0eSBlbnZpcm9ubWVudCBhbmQgd29ya2luZ3NldCB0byBhdm9pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgZnVydGhlciBjb25mbGljdHMgd2l0aCB0aGUgY29uZmxpY3RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzdHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChbXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gV29ya2luZ1NldChbXSkKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gYmVzdFtyZXEua2V5XSA9IGVudi5iZXN0X21hdGNoKAogICAgICAgICAgICAgICAgICAgICAgICByZXEsIHdzLCBpbnN0YWxsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9cmVwbGFjZV9jb25mbGljdGluZwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVycyA9IHJlcXVpcmVkX2J5LmdldChyZXEsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RyaWJ1dGlvbk5vdEZvdW5kKHJlcSwgcmVxdWlyZXJzKQogICAgICAgICAgICAgICAgdG9fYWN0aXZhdGUuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIHJlcToKICAgICAgICAgICAgICAgICMgT29wcywgdGhlICJiZXN0IiBzbyBmYXIgY29uZmxpY3RzIHdpdGggYSBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBkZXBlbmRlbnRfcmVxID0gcmVxdWlyZWRfYnlbcmVxXQogICAgICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QsIHJlcSkud2l0aF9jb250ZXh0KGRlcGVuZGVudF9yZXEpCgogICAgICAgICAgICAjIHB1c2ggdGhlIG5ldyByZXF1aXJlbWVudHMgb250byB0aGUgc3RhY2sKICAgICAgICAgICAgbmV3X3JlcXVpcmVtZW50cyA9IGRpc3QucmVxdWlyZXMocmVxLmV4dHJhcylbOjotMV0KICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmV4dGVuZChuZXdfcmVxdWlyZW1lbnRzKQoKICAgICAgICAgICAgIyBSZWdpc3RlciB0aGUgbmV3IHJlcXVpcmVtZW50cyBuZWVkZWQgYnkgcmVxCiAgICAgICAgICAgIGZvciBuZXdfcmVxdWlyZW1lbnQgaW4gbmV3X3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgIHJlcXVpcmVkX2J5W25ld19yZXF1aXJlbWVudF0uYWRkKHJlcS5wcm9qZWN0X25hbWUpCiAgICAgICAgICAgICAgICByZXFfZXh0cmFzW25ld19yZXF1aXJlbWVudF0gPSByZXEuZXh0cmFzCgogICAgICAgICAgICBwcm9jZXNzZWRbcmVxXSA9IFRydWUKCiAgICAgICAgIyByZXR1cm4gbGlzdCBvZiBkaXN0cm9zIHRvIGFjdGl2YXRlCiAgICAgICAgcmV0dXJuIHRvX2FjdGl2YXRlCgogICAgZGVmIGZpbmRfcGx1Z2lucygKICAgICAgICAgICAgc2VsZiwgcGx1Z2luX2VudiwgZnVsbF9lbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsIGZhbGxiYWNrPVRydWUpOgogICAgICAgICIiIkZpbmQgYWxsIGFjdGl2YXRhYmxlIGRpc3RyaWJ1dGlvbnMgaW4gYHBsdWdpbl9lbnZgCgogICAgICAgIEV4YW1wbGUgdXNhZ2U6OgoKICAgICAgICAgICAgZGlzdHJpYnV0aW9ucywgZXJyb3JzID0gd29ya2luZ19zZXQuZmluZF9wbHVnaW5zKAogICAgICAgICAgICAgICAgRW52aXJvbm1lbnQocGx1Z2luX2Rpcmxpc3QpCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBhZGQgcGx1Z2lucytsaWJzIHRvIHN5cy5wYXRoCiAgICAgICAgICAgIG1hcCh3b3JraW5nX3NldC5hZGQsIGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgICAgICMgZGlzcGxheSBlcnJvcnMKICAgICAgICAgICAgcHJpbnQoJ0NvdWxkIG5vdCBsb2FkJywgZXJyb3JzKQoKICAgICAgICBUaGUgYHBsdWdpbl9lbnZgIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAgaW5zdGFuY2UgdGhhdCBjb250YWlucwogICAgICAgIG9ubHkgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBpbiB0aGUgcHJvamVjdCdzICJwbHVnaW4gZGlyZWN0b3J5IiBvcgogICAgICAgIGRpcmVjdG9yaWVzLiBUaGUgYGZ1bGxfZW52YCwgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAKICAgICAgICBjb250YWlucyBhbGwgY3VycmVudGx5LWF2YWlsYWJsZSBkaXN0cmlidXRpb25zLiAgSWYgYGZ1bGxfZW52YCBpcyBub3QKICAgICAgICBzdXBwbGllZCwgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBgYFdvcmtpbmdTZXRgYCB0aGlzCiAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCBvbiwgd2hpY2ggd2lsbCB0eXBpY2FsbHkgbWVhbiB0aGF0IGV2ZXJ5IGRpcmVjdG9yeSBvbgogICAgICAgIGBgc3lzLnBhdGhgYCB3aWxsIGJlIHNjYW5uZWQgZm9yIGRpc3RyaWJ1dGlvbnMuCgogICAgICAgIGBpbnN0YWxsZXJgIGlzIGEgc3RhbmRhcmQgaW5zdGFsbGVyIGNhbGxiYWNrIGFzIHVzZWQgYnkgdGhlCiAgICAgICAgYGByZXNvbHZlKClgYCBtZXRob2QuIFRoZSBgZmFsbGJhY2tgIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkCiAgICAgICAgYXR0ZW1wdCB0byByZXNvbHZlIG9sZGVyIHZlcnNpb25zIG9mIGEgcGx1Z2luIGlmIHRoZSBuZXdlc3QgdmVyc2lvbgogICAgICAgIGNhbm5vdCBiZSByZXNvbHZlZC4KCiAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIDItdHVwbGU6IChgZGlzdHJpYnV0aW9uc2AsIGBlcnJvcl9pbmZvYCksIHdoZXJlCiAgICAgICAgYGRpc3RyaWJ1dGlvbnNgIGlzIGEgbGlzdCBvZiB0aGUgZGlzdHJpYnV0aW9ucyBmb3VuZCBpbiBgcGx1Z2luX2VudmAKICAgICAgICB0aGF0IHdlcmUgbG9hZGFibGUsIGFsb25nIHdpdGggYW55IG90aGVyIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgbmVlZGVkCiAgICAgICAgdG8gcmVzb2x2ZSB0aGVpciBkZXBlbmRlbmNpZXMuICBgZXJyb3JfaW5mb2AgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcKICAgICAgICB1bmxvYWRhYmxlIHBsdWdpbiBkaXN0cmlidXRpb25zIHRvIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZQogICAgICAgIGVycm9yIHRoYXQgb2NjdXJyZWQuIFVzdWFsbHkgdGhpcyB3aWxsIGJlIGEgYGBEaXN0cmlidXRpb25Ob3RGb3VuZGBgIG9yCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpbnN0YW5jZS4KICAgICAgICAiIiIKCiAgICAgICAgcGx1Z2luX3Byb2plY3RzID0gbGlzdChwbHVnaW5fZW52KQogICAgICAgICMgc2NhbiBwcm9qZWN0IG5hbWVzIGluIGFscGhhYmV0aWMgb3JkZXIKICAgICAgICBwbHVnaW5fcHJvamVjdHMuc29ydCgpCgogICAgICAgIGVycm9yX2luZm8gPSB7fQogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSB7fQoKICAgICAgICBpZiBmdWxsX2VudiBpcyBOb25lOgogICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCiAgICAgICAgICAgIGVudiArPSBwbHVnaW5fZW52CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW52ID0gZnVsbF9lbnYgKyBwbHVnaW5fZW52CgogICAgICAgIHNoYWRvd19zZXQgPSBzZWxmLl9fY2xhc3NfXyhbXSkKICAgICAgICAjIHB1dCBhbGwgb3VyIGVudHJpZXMgaW4gc2hhZG93X3NldAogICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCBzZWxmKSkKCiAgICAgICAgZm9yIHByb2plY3RfbmFtZSBpbiBwbHVnaW5fcHJvamVjdHM6CgogICAgICAgICAgICBmb3IgZGlzdCBpbiBwbHVnaW5fZW52W3Byb2plY3RfbmFtZV06CgogICAgICAgICAgICAgICAgcmVxID0gW2Rpc3QuYXNfcmVxdWlyZW1lbnQoKV0KCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWVzID0gc2hhZG93X3NldC5yZXNvbHZlKHJlcSwgZW52LCBpbnN0YWxsZXIpCgogICAgICAgICAgICAgICAgZXhjZXB0IFJlc29sdXRpb25FcnJvciBhcyB2OgogICAgICAgICAgICAgICAgICAgICMgc2F2ZSBlcnJvciBpbmZvCiAgICAgICAgICAgICAgICAgICAgZXJyb3JfaW5mb1tkaXN0XSA9IHYKICAgICAgICAgICAgICAgICAgICBpZiBmYWxsYmFjazoKICAgICAgICAgICAgICAgICAgICAgICAgIyB0cnkgdGhlIG5leHQgb2xkZXIgdmVyc2lvbiBvZiBwcm9qZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBnaXZlIHVwIG9uIHRoaXMgcHJvamVjdCwga2VlcCBnb2luZwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbGlzdChtYXAoc2hhZG93X3NldC5hZGQsIHJlc29sdmVlcykpCiAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucy51cGRhdGUoZGljdC5mcm9ta2V5cyhyZXNvbHZlZXMpKQoKICAgICAgICAgICAgICAgICAgICAjIHN1Y2Nlc3MsIG5vIG5lZWQgdG8gdHJ5IGFueSBtb3JlIHZlcnNpb25zIG9mIHRoaXMgcHJvamVjdAogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSBsaXN0KGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgZGlzdHJpYnV0aW9ucy5zb3J0KCkKCiAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGlvbnMsIGVycm9yX2luZm8KCiAgICBkZWYgcmVxdWlyZShzZWxmLCAqcmVxdWlyZW1lbnRzKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCBkaXN0cmlidXRpb25zIG1hdGNoaW5nIGByZXF1aXJlbWVudHNgIGFyZSBhY3RpdmF0ZWQKCiAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHN0cmluZyBvciBhIChwb3NzaWJseS1uZXN0ZWQpIHNlcXVlbmNlCiAgICAgICAgdGhlcmVvZiwgc3BlY2lmeWluZyB0aGUgZGlzdHJpYnV0aW9ucyBhbmQgdmVyc2lvbnMgcmVxdWlyZWQuICBUaGUKICAgICAgICByZXR1cm4gdmFsdWUgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgZGlzdHJpYnV0aW9ucyB0aGF0IG5lZWRlZCB0byBiZQogICAgICAgIGFjdGl2YXRlZCB0byBmdWxmaWxsIHRoZSByZXF1aXJlbWVudHM7IGFsbCByZWxldmFudCBkaXN0cmlidXRpb25zIGFyZQogICAgICAgIGluY2x1ZGVkLCBldmVuIGlmIHRoZXkgd2VyZSBhbHJlYWR5IGFjdGl2YXRlZCBpbiB0aGlzIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIG5lZWRlZCA9IHNlbGYucmVzb2x2ZShwYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKSkKCiAgICAgICAgZm9yIGRpc3QgaW4gbmVlZGVkOgogICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgICAgICByZXR1cm4gbmVlZGVkCgogICAgZGVmIHN1YnNjcmliZShzZWxmLCBjYWxsYmFjaywgZXhpc3Rpbmc9VHJ1ZSk6CiAgICAgICAgIiIiSW52b2tlIGBjYWxsYmFja2AgZm9yIGFsbCBkaXN0cmlidXRpb25zCgogICAgICAgIElmIGBleGlzdGluZz1UcnVlYCAoZGVmYXVsdCksCiAgICAgICAgY2FsbCBvbiBhbGwgZXhpc3Rpbmcgb25lcywgYXMgd2VsbC4KICAgICAgICAiIiIKICAgICAgICBpZiBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKQogICAgICAgIGlmIG5vdCBleGlzdGluZzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZjoKICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKCiAgICBkZWYgX2FkZGVkX25ldyhzZWxmLCBkaXN0KToKICAgICAgICBmb3IgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLmVudHJpZXNbOl0sIHNlbGYuZW50cnlfa2V5cy5jb3B5KCksIHNlbGYuYnlfa2V5LmNvcHkoKSwKICAgICAgICAgICAgc2VsZi5jYWxsYmFja3NbOl0KICAgICAgICApCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBlX2tfYl9jKToKICAgICAgICBlbnRyaWVzLCBrZXlzLCBieV9rZXksIGNhbGxiYWNrcyA9IGVfa19iX2MKICAgICAgICBzZWxmLmVudHJpZXMgPSBlbnRyaWVzWzpdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ga2V5cy5jb3B5KCkKICAgICAgICBzZWxmLmJ5X2tleSA9IGJ5X2tleS5jb3B5KCkKICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IGNhbGxiYWNrc1s6XQoKCmNsYXNzIF9SZXFFeHRyYXMoZGljdCk6CiAgICAiIiIKICAgIE1hcCBlYWNoIHJlcXVpcmVtZW50IHRvIHRoZSBleHRyYXMgdGhhdCBkZW1hbmRlZCBpdC4KICAgICIiIgoKICAgIGRlZiBtYXJrZXJzX3Bhc3Moc2VsZiwgcmVxLCBleHRyYXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRXZhbHVhdGUgbWFya2VycyBmb3IgcmVxIGFnYWluc3QgZWFjaCBleHRyYSB0aGF0CiAgICAgICAgZGVtYW5kZWQgaXQuCgogICAgICAgIFJldHVybiBGYWxzZSBpZiB0aGUgcmVxIGhhcyBhIG1hcmtlciBhbmQgZmFpbHMKICAgICAgICBldmFsdWF0aW9uLiBPdGhlcndpc2UsIHJldHVybiBUcnVlLgogICAgICAgICIiIgogICAgICAgIGV4dHJhX2V2YWxzID0gKAogICAgICAgICAgICByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pCiAgICAgICAgICAgIGZvciBleHRyYSBpbiBzZWxmLmdldChyZXEsICgpKSArIChleHRyYXMgb3IgKE5vbmUsKSkKICAgICAgICApCiAgICAgICAgcmV0dXJuIG5vdCByZXEubWFya2VyIG9yIGFueShleHRyYV9ldmFscykKCgpjbGFzcyBFbnZpcm9ubWVudChvYmplY3QpOgogICAgIiIiU2VhcmNoYWJsZSBzbmFwc2hvdCBvZiBkaXN0cmlidXRpb25zIG9uIGEgc2VhcmNoIHBhdGgiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUsIHBsYXRmb3JtPWdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKSwKICAgICAgICAgICAgcHl0aG9uPVBZX01BSk9SKToKICAgICAgICAiIiJTbmFwc2hvdCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSBvbiBhIHNlYXJjaCBwYXRoCgogICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIG9uIGBzZWFyY2hfcGF0aGAgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAogICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4KCiAgICAgICAgYHBsYXRmb3JtYCBpcyBhbiBvcHRpb25hbCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgcGxhdGZvcm0KICAgICAgICB0aGF0IHBsYXRmb3JtLXNwZWNpZmljIGRpc3RyaWJ1dGlvbnMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGguICBJZgogICAgICAgIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIGBweXRob25gIGlzIGFuCiAgICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWluZyB0aGUgZGVzaXJlZCB2ZXJzaW9uIG9mIFB5dGhvbiAoZS5nLiBgYCczLjMnYGApOwogICAgICAgIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHZlcnNpb24uCgogICAgICAgIFlvdSBtYXkgZXhwbGljaXRseSBzZXQgYHBsYXRmb3JtYCAoYW5kL29yIGBweXRob25gKSB0byBgYE5vbmVgYCBpZiB5b3UKICAgICAgICB3aXNoIHRvIG1hcCAqYWxsKiBkaXN0cmlidXRpb25zLCBub3QganVzdCB0aG9zZSBjb21wYXRpYmxlIHdpdGggdGhlCiAgICAgICAgcnVubmluZyBwbGF0Zm9ybSBvciBQeXRob24gdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9kaXN0bWFwID0ge30KICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm0KICAgICAgICBzZWxmLnB5dGhvbiA9IHB5dGhvbgogICAgICAgIHNlbGYuc2NhbihzZWFyY2hfcGF0aCkKCiAgICBkZWYgY2FuX2FkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJJcyBkaXN0cmlidXRpb24gYGRpc3RgIGFjY2VwdGFibGUgZm9yIHRoaXMgZW52aXJvbm1lbnQ/CgogICAgICAgIFRoZSBkaXN0cmlidXRpb24gbXVzdCBtYXRjaCB0aGUgcGxhdGZvcm0gYW5kIHB5dGhvbiB2ZXJzaW9uCiAgICAgICAgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCB3aGVuIHRoaXMgZW52aXJvbm1lbnQgd2FzIGNyZWF0ZWQsIG9yIEZhbHNlCiAgICAgICAgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLnB5dGhvbiBpcyBOb25lIG9yIGRpc3QucHlfdmVyc2lvbiBpcyBOb25lCiAgICAgICAgICAgIG9yIGRpc3QucHlfdmVyc2lvbiA9PSBzZWxmLnB5dGhvbikgXAogICAgICAgICAgICBhbmQgY29tcGF0aWJsZV9wbGF0Zm9ybXMoZGlzdC5wbGF0Zm9ybSwgc2VsZi5wbGF0Zm9ybSkKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlJlbW92ZSBgZGlzdGAgZnJvbSB0aGUgZW52aXJvbm1lbnQiIiIKICAgICAgICBzZWxmLl9kaXN0bWFwW2Rpc3Qua2V5XS5yZW1vdmUoZGlzdCkKCiAgICBkZWYgc2NhbihzZWxmLCBzZWFyY2hfcGF0aD1Ob25lKToKICAgICAgICAiIiJTY2FuIGBzZWFyY2hfcGF0aGAgZm9yIGRpc3RyaWJ1dGlvbnMgdXNhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQKCiAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAogICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4gIE9ubHkgZGlzdHJpYnV0aW9ucyBjb25mb3JtaW5nIHRvCiAgICAgICAgdGhlIHBsYXRmb3JtL3B5dGhvbiB2ZXJzaW9uIGRlZmluZWQgYXQgaW5pdGlhbGl6YXRpb24gYXJlIGFkZGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlYXJjaF9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHNlYXJjaF9wYXRoID0gc3lzLnBhdGgKCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VhcmNoX3BhdGg6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhpdGVtKToKICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgbmV3ZXN0LXRvLW9sZGVzdCBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMgZm9yIGBwcm9qZWN0X25hbWVgCgogICAgICAgIFVzZXMgY2FzZS1pbnNlbnNpdGl2ZSBgcHJvamVjdF9uYW1lYCBjb21wYXJpc29uLCBhc3N1bWluZyBhbGwgdGhlCiAgICAgICAgcHJvamVjdCdzIGRpc3RyaWJ1dGlvbnMgdXNlIHRoZWlyIHByb2plY3QncyBuYW1lIGNvbnZlcnRlZCB0byBhbGwKICAgICAgICBsb3dlcmNhc2UgYXMgdGhlaXIga2V5LgoKICAgICAgICAiIiIKICAgICAgICBkaXN0cmlidXRpb25fa2V5ID0gcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICByZXR1cm4gc2VsZi5fZGlzdG1hcC5nZXQoZGlzdHJpYnV0aW9uX2tleSwgW10pCgogICAgZGVmIGFkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJBZGQgYGRpc3RgIGlmIHdlIGBgY2FuX2FkZCgpYGAgaXQgYW5kIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFkZGVkCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jYW5fYWRkKGRpc3QpIGFuZCBkaXN0Lmhhc192ZXJzaW9uKCk6CiAgICAgICAgICAgIGRpc3RzID0gc2VsZi5fZGlzdG1hcC5zZXRkZWZhdWx0KGRpc3Qua2V5LCBbXSkKICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBkaXN0cy5hcHBlbmQoZGlzdCkKICAgICAgICAgICAgICAgIGRpc3RzLnNvcnQoa2V5PW9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2hhc2hjbXAnKSwgcmV2ZXJzZT1UcnVlKQoKICAgIGRlZiBiZXN0X21hdGNoKAogICAgICAgICAgICBzZWxmLCByZXEsIHdvcmtpbmdfc2V0LCBpbnN0YWxsZXI9Tm9uZSwgcmVwbGFjZV9jb25mbGljdGluZz1GYWxzZSk6CiAgICAgICAgIiIiRmluZCBkaXN0cmlidXRpb24gYmVzdCBtYXRjaGluZyBgcmVxYCBhbmQgdXNhYmxlIG9uIGB3b3JraW5nX3NldGAKCiAgICAgICAgVGhpcyBjYWxscyB0aGUgYGBmaW5kKHJlcSlgYCBtZXRob2Qgb2YgdGhlIGB3b3JraW5nX3NldGAgdG8gc2VlIGlmIGEKICAgICAgICBzdWl0YWJsZSBkaXN0cmlidXRpb24gaXMgYWxyZWFkeSBhY3RpdmUuICAoVGhpcyBtYXkgcmFpc2UKICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGlmIGFuIHVuc3VpdGFibGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBpcyBhbHJlYWR5CiAgICAgICAgYWN0aXZlIGluIHRoZSBzcGVjaWZpZWQgYHdvcmtpbmdfc2V0YC4pICBJZiBhIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbgogICAgICAgIGlzbid0IGFjdGl2ZSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3ZXN0IGRpc3RyaWJ1dGlvbiBpbiB0aGUKICAgICAgICBlbnZpcm9ubWVudCB0aGF0IG1lZXRzIHRoZSBgYFJlcXVpcmVtZW50YGAgaW4gYHJlcWAuICBJZiBubyBzdWl0YWJsZQogICAgICAgIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwgYW5kIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSByZXN1bHQgb2YKICAgICAgICBjYWxsaW5nIHRoZSBlbnZpcm9ubWVudCdzIGBgb2J0YWluKHJlcSwgaW5zdGFsbGVyKWBgIG1ldGhvZCB3aWxsIGJlCiAgICAgICAgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkaXN0ID0gd29ya2luZ19zZXQuZmluZChyZXEpCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDoKICAgICAgICAgICAgaWYgbm90IHJlcGxhY2VfY29uZmxpY3Rpbmc6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBkaXN0ID0gTm9uZQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXEua2V5XToKICAgICAgICAgICAgaWYgZGlzdCBpbiByZXE6CiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICMgdHJ5IHRvIGRvd25sb2FkL2luc3RhbGwKICAgICAgICByZXR1cm4gc2VsZi5vYnRhaW4ocmVxLCBpbnN0YWxsZXIpCgogICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIChlLmcuIHZpYSBkb3dubG9hZCkKCiAgICAgICAgT2J0YWluIGEgZGlzdHJvIHRoYXQgbWF0Y2hlcyByZXF1aXJlbWVudCAoZS5nLiB2aWEgZG93bmxvYWQpLiAgSW4gdGhlCiAgICAgICAgYmFzZSBgYEVudmlyb25tZW50YGAgY2xhc3MsIHRoaXMgcm91dGluZSBqdXN0IHJldHVybnMKICAgICAgICBgYGluc3RhbGxlcihyZXF1aXJlbWVudClgYCwgdW5sZXNzIGBpbnN0YWxsZXJgIGlzIE5vbmUsIGluIHdoaWNoIGNhc2UKICAgICAgICBOb25lIGlzIHJldHVybmVkIGluc3RlYWQuICBUaGlzIG1ldGhvZCBpcyBhIGhvb2sgdGhhdCBhbGxvd3Mgc3ViY2xhc3NlcwogICAgICAgIHRvIGF0dGVtcHQgb3RoZXIgd2F5cyBvZiBvYnRhaW5pbmcgYSBkaXN0cmlidXRpb24gYmVmb3JlIGZhbGxpbmcgYmFjawogICAgICAgIHRvIHRoZSBgaW5zdGFsbGVyYCBhcmd1bWVudC4iIiIKICAgICAgICBpZiBpbnN0YWxsZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZXIocmVxdWlyZW1lbnQpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIHRoZSB1bmlxdWUgcHJvamVjdCBuYW1lcyBvZiB0aGUgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMiIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2Rpc3RtYXAua2V5cygpOgogICAgICAgICAgICBpZiBzZWxmW2tleV06CiAgICAgICAgICAgICAgICB5aWVsZCBrZXkKCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkluLXBsYWNlIGFkZGl0aW9uIG9mIGEgZGlzdHJpYnV0aW9uIG9yIGVudmlyb25tZW50IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgc2VsZi5hZGQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBFbnZpcm9ubWVudCk6CiAgICAgICAgICAgIGZvciBwcm9qZWN0IGluIG90aGVyOgogICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gb3RoZXJbcHJvamVjdF06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IGFkZCAlciB0byBlbnZpcm9ubWVudCIgJSAob3RoZXIsKSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJBZGQgYW4gZW52aXJvbm1lbnQgb3IgZGlzdHJpYnV0aW9uIHRvIGFuIGVudmlyb25tZW50IiIiCiAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oW10sIHBsYXRmb3JtPU5vbmUsIHB5dGhvbj1Ob25lKQogICAgICAgIGZvciBlbnYgaW4gc2VsZiwgb3RoZXI6CiAgICAgICAgICAgIG5ldyArPSBlbnYKICAgICAgICByZXR1cm4gbmV3CgoKIyBYWFggYmFja3dhcmQgY29tcGF0aWJpbGl0eQpBdmFpbGFibGVEaXN0cmlidXRpb25zID0gRW52aXJvbm1lbnQKCgpjbGFzcyBFeHRyYWN0aW9uRXJyb3IoUnVudGltZUVycm9yKToKICAgICIiIkFuIGVycm9yIG9jY3VycmVkIGV4dHJhY3RpbmcgYSByZXNvdXJjZQoKICAgIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGZyb20gaW5zdGFuY2VzIG9mIHRoaXMgZXhjZXB0aW9uOgoKICAgIG1hbmFnZXIKICAgICAgICBUaGUgcmVzb3VyY2UgbWFuYWdlciB0aGF0IHJhaXNlZCB0aGlzIGV4Y2VwdGlvbgoKICAgIGNhY2hlX3BhdGgKICAgICAgICBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlIGV4dHJhY3Rpb24KCiAgICBvcmlnaW5hbF9lcnJvcgogICAgICAgIFRoZSBleGNlcHRpb24gaW5zdGFuY2UgdGhhdCBjYXVzZWQgZXh0cmFjdGlvbiB0byBmYWlsCiAgICAiIiIKCgpjbGFzcyBSZXNvdXJjZU1hbmFnZXI6CiAgICAiIiJNYW5hZ2UgcmVzb3VyY2UgZXh0cmFjdGlvbiBhbmQgcGFja2FnZXMiIiIKICAgIGV4dHJhY3Rpb25fcGF0aCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXMgPSB7fQoKICAgIGRlZiByZXNvdXJjZV9leGlzdHMoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgbmFtZWQgcmVzb3VyY2UgZXhpc3Q/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5oYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSkKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeT8iIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2lzZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9maWxlbmFtZShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2VfZmlsZW5hbWUoCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmVhbShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJlYW0oCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmluZyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gc3BlY2lmaWVkIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyaW5nKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBuYW1lZCByZXNvdXJjZSBkaXJlY3RvcnkiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2xpc3RkaXIoCiAgICAgICAgICAgIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIGV4dHJhY3Rpb25fZXJyb3Ioc2VsZik6CiAgICAgICAgIiIiR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGZvciBwcm9ibGVtcyBleHRyYWN0aW5nIGZpbGUocykiIiIKCiAgICAgICAgb2xkX2V4YyA9IHN5cy5leGNfaW5mbygpWzFdCiAgICAgICAgY2FjaGVfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKCiAgICAgICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgICAgQ2FuJ3QgZXh0cmFjdCBmaWxlKHMpIHRvIGVnZyBjYWNoZQoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZXh0cmFjdCBmaWxlKHMpCiAgICAgICAgICAgIHRvIHRoZSBQeXRob24gZWdnIGNhY2hlOgoKICAgICAgICAgICAgICB7b2xkX2V4Y30KCiAgICAgICAgICAgIFRoZSBQeXRob24gZWdnIGNhY2hlIGRpcmVjdG9yeSBpcyBjdXJyZW50bHkgc2V0IHRvOgoKICAgICAgICAgICAgICB7Y2FjaGVfcGF0aH0KCiAgICAgICAgICAgIFBlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PwogICAgICAgICAgICBZb3UgY2FuIGNoYW5nZSB0aGUgY2FjaGUgZGlyZWN0b3J5IGJ5IHNldHRpbmcgdGhlIFBZVEhPTl9FR0dfQ0FDSEUKICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdG8gYW4gYWNjZXNzaWJsZSBkaXJlY3RvcnkuCiAgICAgICAgICAgICIiIikubHN0cmlwKCkKICAgICAgICBlcnIgPSBFeHRyYWN0aW9uRXJyb3IodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgZXJyLm1hbmFnZXIgPSBzZWxmCiAgICAgICAgZXJyLmNhY2hlX3BhdGggPSBjYWNoZV9wYXRoCiAgICAgICAgZXJyLm9yaWdpbmFsX2Vycm9yID0gb2xkX2V4YwogICAgICAgIHJhaXNlIGVycgoKICAgIGRlZiBnZXRfY2FjaGVfcGF0aChzZWxmLCBhcmNoaXZlX25hbWUsIG5hbWVzPSgpKToKICAgICAgICAiIiJSZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24gaW4gY2FjaGUgZm9yIGBhcmNoaXZlX25hbWVgIGFuZCBgbmFtZXNgCgogICAgICAgIFRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSByZXN1bHRpbmcgcGF0aCB3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcwogICAgICAgIG5vdCBhbHJlYWR5IGV4aXN0LiAgYGFyY2hpdmVfbmFtZWAgc2hvdWxkIGJlIHRoZSBiYXNlIGZpbGVuYW1lIG9mIHRoZQogICAgICAgIGVuY2xvc2luZyBlZ2cgKHdoaWNoIG1heSBub3QgYmUgdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyB6aXBmaWxlISksCiAgICAgICAgaW5jbHVkaW5nIGl0cyAiLmVnZyIgZXh0ZW5zaW9uLiAgYG5hbWVzYCwgaWYgcHJvdmlkZWQsIHNob3VsZCBiZSBhCiAgICAgICAgc2VxdWVuY2Ugb2YgcGF0aCBuYW1lIHBhcnRzICJ1bmRlciIgdGhlIGVnZydzIGV4dHJhY3Rpb24gbG9jYXRpb24uCgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSByZXNvdXJjZSBwcm92aWRlcnMgdGhhdCBuZWVkIHRvCiAgICAgICAgb2J0YWluIGFuIGV4dHJhY3Rpb24gbG9jYXRpb24sIGFuZCBvbmx5IGZvciBuYW1lcyB0aGV5IGludGVuZCB0bwogICAgICAgIGV4dHJhY3QsIGFzIGl0IHRyYWNrcyB0aGUgZ2VuZXJhdGVkIG5hbWVzIGZvciBwb3NzaWJsZSBjbGVhbnVwIGxhdGVyLgogICAgICAgICIiIgogICAgICAgIGV4dHJhY3RfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKICAgICAgICB0YXJnZXRfcGF0aCA9IG9zLnBhdGguam9pbihleHRyYWN0X3BhdGgsIGFyY2hpdmVfbmFtZSArICctdG1wJywgKm5hbWVzKQogICAgICAgIHRyeToKICAgICAgICAgICAgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KHRhcmdldF9wYXRoKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5leHRyYWN0aW9uX2Vycm9yKCkKCiAgICAgICAgc2VsZi5fd2Fybl91bnNhZmVfZXh0cmFjdGlvbl9wYXRoKGV4dHJhY3RfcGF0aCkKCiAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXNbdGFyZ2V0X3BhdGhdID0gMQogICAgICAgIHJldHVybiB0YXJnZXRfcGF0aAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfd2Fybl91bnNhZmVfZXh0cmFjdGlvbl9wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIElmIHRoZSBkZWZhdWx0IGV4dHJhY3Rpb24gcGF0aCBpcyBvdmVycmlkZGVuIGFuZCBzZXQgdG8gYW4gaW5zZWN1cmUKICAgICAgICBsb2NhdGlvbiwgc3VjaCBhcyAvdG1wLCBpdCBvcGVucyB1cCBhbiBvcHBvcnR1bml0eSBmb3IgYW4gYXR0YWNrZXIgdG8KICAgICAgICByZXBsYWNlIGFuIGV4dHJhY3RlZCBmaWxlIHdpdGggYW4gdW5hdXRob3JpemVkIHBheWxvYWQuIFdhcm4gdGhlIHVzZXIKICAgICAgICBpZiBhIGtub3duIGluc2VjdXJlIGxvY2F0aW9uIGlzIHVzZWQuCgogICAgICAgIFNlZSBEaXN0cmlidXRlICMzNzUgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5uYW1lID09ICdudCcgYW5kIG5vdCBwYXRoLnN0YXJ0c3dpdGgob3MuZW52aXJvblsnd2luZGlyJ10pOgogICAgICAgICAgICAjIE9uIFdpbmRvd3MsIHBlcm1pc3Npb25zIGFyZSBnZW5lcmFsbHkgcmVzdHJpY3RpdmUgYnkgZGVmYXVsdAogICAgICAgICAgICAjICBhbmQgdGVtcCBkaXJlY3RvcmllcyBhcmUgbm90IHdyaXRhYmxlIGJ5IG90aGVyIHVzZXJzLCBzbwogICAgICAgICAgICAjICBieXBhc3MgdGhlIHdhcm5pbmcuCiAgICAgICAgICAgIHJldHVybgogICAgICAgIG1vZGUgPSBvcy5zdGF0KHBhdGgpLnN0X21vZGUKICAgICAgICBpZiBtb2RlICYgc3RhdC5TX0lXT1RIIG9yIG1vZGUgJiBzdGF0LlNfSVdHUlA6CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICIlcyBpcyB3cml0YWJsZSBieSBncm91cC9vdGhlcnMgYW5kIHZ1bG5lcmFibGUgdG8gYXR0YWNrICIKICAgICAgICAgICAgICAgICJ3aGVuICIKICAgICAgICAgICAgICAgICJ1c2VkIHdpdGggZ2V0X3Jlc291cmNlX2ZpbGVuYW1lLiBDb25zaWRlciBhIG1vcmUgc2VjdXJlICIKICAgICAgICAgICAgICAgICJsb2NhdGlvbiAoc2V0IHdpdGggLnNldF9leHRyYWN0aW9uX3BhdGggb3IgdGhlICIKICAgICAgICAgICAgICAgICJQWVRIT05fRUdHX0NBQ0hFIGVudmlyb25tZW50IHZhcmlhYmxlKS4iICUgcGF0aAogICAgICAgICAgICApCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBVc2VyV2FybmluZykKCiAgICBkZWYgcG9zdHByb2Nlc3Moc2VsZiwgdGVtcG5hbWUsIGZpbGVuYW1lKToKICAgICAgICAiIiJQZXJmb3JtIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBwb3N0cHJvY2Vzc2luZyBvZiBgdGVtcG5hbWVgCgogICAgICAgIFRoaXMgaXMgd2hlcmUgTWFjIGhlYWRlciByZXdyaXRlcyBzaG91bGQgYmUgZG9uZTsgb3RoZXIgcGxhdGZvcm1zIGRvbid0CiAgICAgICAgaGF2ZSBhbnl0aGluZyBzcGVjaWFsIHRoZXkgc2hvdWxkIGRvLgoKICAgICAgICBSZXNvdXJjZSBwcm92aWRlcnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgT05MWSBhZnRlciBzdWNjZXNzZnVsbHkKICAgICAgICBleHRyYWN0aW5nIGEgY29tcHJlc3NlZCByZXNvdXJjZS4gIFRoZXkgbXVzdCBOT1QgY2FsbCBpdCBvbiByZXNvdXJjZXMKICAgICAgICB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBmaWxlc3lzdGVtLgoKICAgICAgICBgdGVtcG5hbWVgIGlzIHRoZSBjdXJyZW50ICh0ZW1wb3JhcnkpIG5hbWUgb2YgdGhlIGZpbGUsIGFuZCBgZmlsZW5hbWVgCiAgICAgICAgaXMgdGhlIG5hbWUgaXQgd2lsbCBiZSByZW5hbWVkIHRvIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdGhpcyByb3V0aW5lCiAgICAgICAgcmV0dXJucy4KICAgICAgICAiIiIKCiAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICAgICAjIE1ha2UgdGhlIHJlc291cmNlIGV4ZWN1dGFibGUKICAgICAgICAgICAgbW9kZSA9ICgob3Muc3RhdCh0ZW1wbmFtZSkuc3RfbW9kZSkgfCAwbzU1NSkgJiAwbzc3NzcKICAgICAgICAgICAgb3MuY2htb2QodGVtcG5hbWUsIG1vZGUpCgogICAgZGVmIHNldF9leHRyYWN0aW9uX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiU2V0IHRoZSBiYXNlIHBhdGggd2hlcmUgcmVzb3VyY2VzIHdpbGwgYmUgZXh0cmFjdGVkIHRvLCBpZiBuZWVkZWQuCgogICAgICAgIElmIHlvdSBkbyBub3QgY2FsbCB0aGlzIHJvdXRpbmUgYmVmb3JlIGFueSBleHRyYWN0aW9ucyB0YWtlIHBsYWNlLCB0aGUKICAgICAgICBwYXRoIGRlZmF1bHRzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGBnZXRfZGVmYXVsdF9jYWNoZSgpYGAuICAoV2hpY2gKICAgICAgICBpcyBiYXNlZCBvbiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdpdGggdmFyaW91cwogICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGZhbGxiYWNrcy4gIFNlZSB0aGF0IHJvdXRpbmUncyBkb2N1bWVudGF0aW9uIGZvciBtb3JlCiAgICAgICAgZGV0YWlscy4pCgogICAgICAgIFJlc291cmNlcyBhcmUgZXh0cmFjdGVkIHRvIHN1YmRpcmVjdG9yaWVzIG9mIHRoaXMgcGF0aCBiYXNlZCB1cG9uCiAgICAgICAgaW5mb3JtYXRpb24gZ2l2ZW4gYnkgdGhlIGBgSVJlc291cmNlUHJvdmlkZXJgYC4gIFlvdSBtYXkgc2V0IHRoaXMgdG8gYQogICAgICAgIHRlbXBvcmFyeSBkaXJlY3RvcnksIGJ1dCB0aGVuIHlvdSBtdXN0IGNhbGwgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgdG8KICAgICAgICBkZWxldGUgdGhlIGV4dHJhY3RlZCBmaWxlcyB3aGVuIGRvbmUuICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAogICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHdpbGwgYmUgYWJsZSB0byByZW1vdmUgYWxsIGV4dHJhY3RlZCBmaWxlcy4KCiAgICAgICAgKE5vdGU6IHlvdSBtYXkgbm90IGNoYW5nZSB0aGUgZXh0cmFjdGlvbiBwYXRoIGZvciBhIGdpdmVuIHJlc291cmNlCiAgICAgICAgbWFuYWdlciBvbmNlIHJlc291cmNlcyBoYXZlIGJlZW4gZXh0cmFjdGVkLCB1bmxlc3MgeW91IGZpcnN0IGNhbGwKICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYC4pCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jYWNoZWRfZmlsZXM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgY2hhbmdlIGV4dHJhY3Rpb24gcGF0aCwgZmlsZXMgYWxyZWFkeSBleHRyYWN0ZWQiCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5leHRyYWN0aW9uX3BhdGggPSBwYXRoCgogICAgZGVmIGNsZWFudXBfcmVzb3VyY2VzKHNlbGYsIGZvcmNlPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBEZWxldGUgYWxsIGV4dHJhY3RlZCByZXNvdXJjZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIHJldHVybmluZyBhIGxpc3QKICAgICAgICBvZiB0aGUgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIHRoYXQgY291bGQgbm90IGJlIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29uY3VycmVuY3kgcHJvdGVjdGlvbiwgc28gaXQgc2hvdWxkCiAgICAgICAgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGV4dHJhY3Rpb24gcGF0aCBpcyBhIHRlbXBvcmFyeQogICAgICAgIGRpcmVjdG9yeSBleGNsdXNpdmUgdG8gYSBzaW5nbGUgcHJvY2Vzcy4gIFRoaXMgbWV0aG9kIGlzIG5vdAogICAgICAgIGF1dG9tYXRpY2FsbHkgY2FsbGVkOyB5b3UgbXVzdCBjYWxsIGl0IGV4cGxpY2l0bHkgb3IgcmVnaXN0ZXIgaXQgYXMgYW4KICAgICAgICBgYGF0ZXhpdGBgIGZ1bmN0aW9uIGlmIHlvdSB3aXNoIHRvIGVuc3VyZSBjbGVhbnVwIG9mIGEgdGVtcG9yYXJ5CiAgICAgICAgZGlyZWN0b3J5IHVzZWQgZm9yIGV4dHJhY3Rpb25zLgogICAgICAgICIiIgogICAgICAgICMgWFhYCgoKZGVmIGdldF9kZWZhdWx0X2NhY2hlKCk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIG9yIGEgcGxhdGZvcm0tcmVsZXZhbnQgdXNlciBjYWNoZSBkaXIgZm9yIGFuIGFwcAogICAgbmFtZWQgIlB5dGhvbi1FZ2dzIi4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBvcy5lbnZpcm9uLmdldCgnUFlUSE9OX0VHR19DQUNIRScpCiAgICAgICAgb3IgYXBwZGlycy51c2VyX2NhY2hlX2RpcihhcHBuYW1lPSdQeXRob24tRWdncycpCiAgICApCgoKZGVmIHNhZmVfbmFtZShuYW1lKToKICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBuYW1lCgogICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYy8uIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJy0nLgogICAgIiIiCiAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgbmFtZSkKCgpkZWYgc2FmZV92ZXJzaW9uKHZlcnNpb24pOgogICAgIiIiCiAgICBDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCB2ZXJzaW9uIHN0cmluZwogICAgIiIiCiAgICB0cnk6CiAgICAgICAgIyBub3JtYWxpemUgdGhlIHZlcnNpb24KICAgICAgICByZXR1cm4gc3RyKHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24odmVyc2lvbikpCiAgICBleGNlcHQgcGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb246CiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnICcsICcuJykKICAgICAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgdmVyc2lvbikKCgpkZWYgc2FmZV9leHRyYShleHRyYSk6CiAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCAnZXh0cmEnIG5hbWUKCiAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJ18nLAogICAgYW5kIHRoZSByZXN1bHQgaXMgYWx3YXlzIGxvd2VyY2FzZWQuCiAgICAiIiIKICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Li1dKycsICdfJywgZXh0cmEpLmxvd2VyKCkKCgpkZWYgdG9fZmlsZW5hbWUobmFtZSk6CiAgICAiIiJDb252ZXJ0IGEgcHJvamVjdCBvciB2ZXJzaW9uIG5hbWUgdG8gaXRzIGZpbGVuYW1lLWVzY2FwZWQgZm9ybQoKICAgIEFueSAnLScgY2hhcmFjdGVycyBhcmUgY3VycmVudGx5IHJlcGxhY2VkIHdpdGggJ18nLgogICAgIiIiCiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCctJywgJ18nKQoKCmRlZiBpbnZhbGlkX21hcmtlcih0ZXh0KToKICAgICIiIgogICAgVmFsaWRhdGUgdGV4dCBhcyBhIFBFUCA1MDggZW52aXJvbm1lbnQgbWFya2VyOyByZXR1cm4gYW4gZXhjZXB0aW9uCiAgICBpZiBpbnZhbGlkIG9yIEZhbHNlIG90aGVyd2lzZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGV2YWx1YXRlX21hcmtlcih0ZXh0KQogICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGU6CiAgICAgICAgZS5maWxlbmFtZSA9IE5vbmUKICAgICAgICBlLmxpbmVubyA9IE5vbmUKICAgICAgICByZXR1cm4gZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGV2YWx1YXRlX21hcmtlcih0ZXh0LCBleHRyYT1Ob25lKToKICAgICIiIgogICAgRXZhbHVhdGUgYSBQRVAgNTA4IGVudmlyb25tZW50IG1hcmtlci4KICAgIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgbWFya2VyIHJlc3VsdCBpbiB0aGlzIGVudmlyb25tZW50LgogICAgUmFpc2UgU3ludGF4RXJyb3IgaWYgbWFya2VyIGlzIGludmFsaWQuCgogICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSAncHlwYXJzaW5nJyBtb2R1bGUuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBtYXJrZXIgPSBwYWNrYWdpbmcubWFya2Vycy5NYXJrZXIodGV4dCkKICAgICAgICByZXR1cm4gbWFya2VyLmV2YWx1YXRlKCkKICAgIGV4Y2VwdCBwYWNrYWdpbmcubWFya2Vycy5JbnZhbGlkTWFya2VyIGFzIGU6CiAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoZSkKCgpjbGFzcyBOdWxsUHJvdmlkZXI6CiAgICAiIiJUcnkgdG8gaW1wbGVtZW50IHJlc291cmNlcyBhbmQgbWV0YWRhdGEgZm9yIGFyYml0cmFyeSBQRVAgMzAyIGxvYWRlcnMiIiIKCiAgICBlZ2dfbmFtZSA9IE5vbmUKICAgIGVnZ19pbmZvID0gTm9uZQogICAgbG9hZGVyID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIHNlbGYubG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5kaXJuYW1lKGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCAnJykpCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gaW8uQnl0ZXNJTyhzZWxmLmdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldChzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgaGFzX3Jlc291cmNlKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9oYXMoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQoKICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX2luZm86CiAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgIHZhbHVlID0gc2VsZi5fZ2V0KHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQogICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGUoJ3V0Zi04JykgaWYgc2l4LlBZMyBlbHNlIHZhbHVlCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgbWV0YWRhdGFfaXNkaXIoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIHNlbGYuZWdnX2luZm86CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQogICAgICAgIHJldHVybiBbXQoKICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBuYW1lc3BhY2UpOgogICAgICAgIHNjcmlwdCA9ICdzY3JpcHRzLycgKyBzY3JpcHRfbmFtZQogICAgICAgIGlmIG5vdCBzZWxmLmhhc19tZXRhZGF0YShzY3JpcHQpOgogICAgICAgICAgICByYWlzZSBSZXNvbHV0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiU2NyaXB0IHtzY3JpcHQhcn0gbm90IGZvdW5kIGluIG1ldGFkYXRhIGF0IHtzZWxmLmVnZ19pbmZvIXJ9IgogICAgICAgICAgICAgICAgLmZvcm1hdCgqKmxvY2FscygpKSwKICAgICAgICAgICAgKQogICAgICAgIHNjcmlwdF90ZXh0ID0gc2VsZi5nZXRfbWV0YWRhdGEoc2NyaXB0KS5yZXBsYWNlKCdcclxuJywgJ1xuJykKICAgICAgICBzY3JpcHRfdGV4dCA9IHNjcmlwdF90ZXh0LnJlcGxhY2UoJ1xyJywgJ1xuJykKICAgICAgICBzY3JpcHRfZmlsZW5hbWUgPSBzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBzY3JpcHQpCiAgICAgICAgbmFtZXNwYWNlWydfX2ZpbGVfXyddID0gc2NyaXB0X2ZpbGVuYW1lCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2NyaXB0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc291cmNlID0gb3BlbihzY3JpcHRfZmlsZW5hbWUpLnJlYWQoKQogICAgICAgICAgICBjb2RlID0gY29tcGlsZShzb3VyY2UsIHNjcmlwdF9maWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICBleGVjKGNvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZyb20gbGluZWNhY2hlIGltcG9ydCBjYWNoZQogICAgICAgICAgICBjYWNoZVtzY3JpcHRfZmlsZW5hbWVdID0gKAogICAgICAgICAgICAgICAgbGVuKHNjcmlwdF90ZXh0KSwgMCwgc2NyaXB0X3RleHQuc3BsaXQoJ1xuJyksIHNjcmlwdF9maWxlbmFtZQogICAgICAgICAgICApCiAgICAgICAgICAgIHNjcmlwdF9jb2RlID0gY29tcGlsZShzY3JpcHRfdGV4dCwgc2NyaXB0X2ZpbGVuYW1lLCAnZXhlYycpCiAgICAgICAgICAgIGV4ZWMoc2NyaXB0X2NvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQoKICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfZm4oc2VsZiwgYmFzZSwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgaWYgcmVzb3VyY2VfbmFtZToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlLCAqcmVzb3VyY2VfbmFtZS5zcGxpdCgnLycpKQogICAgICAgIHJldHVybiBiYXNlCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLmxvYWRlciwgJ2dldF9kYXRhJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5nZXRfZGF0YShwYXRoKQogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciBsb2FkZXJzIHdpdGhvdXQgJ2dldF9kYXRhKCknIgogICAgICAgICkKCgpyZWdpc3Rlcl9sb2FkZXJfdHlwZShvYmplY3QsIE51bGxQcm92aWRlcikKCgpjbGFzcyBFZ2dQcm92aWRlcihOdWxsUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXIgYmFzZWQgb24gYSB2aXJ0dWFsIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBOdWxsUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCgogICAgZGVmIF9zZXR1cF9wcmVmaXgoc2VsZik6CiAgICAgICAgIyB3ZSBhc3N1bWUgaGVyZSB0aGF0IG91ciBtZXRhZGF0YSBtYXkgYmUgbmVzdGVkIGluc2lkZSBhICJiYXNrZXQiCiAgICAgICAgIyBvZiBtdWx0aXBsZSBlZ2dzOyB0aGF0J3Mgd2h5IHdlIHVzZSBtb2R1bGVfcGF0aCBpbnN0ZWFkIG9mIC5hcmNoaXZlCiAgICAgICAgcGF0aCA9IHNlbGYubW9kdWxlX3BhdGgKICAgICAgICBvbGQgPSBOb25lCiAgICAgICAgd2hpbGUgcGF0aCAhPSBvbGQ6CiAgICAgICAgICAgIGlmIF9pc19lZ2dfcGF0aChwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19yb290ID0gcGF0aAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgb2xkID0gcGF0aAogICAgICAgICAgICBwYXRoLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQoKCmNsYXNzIERlZmF1bHRQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJQcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMgaW4gdGhlIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKHBhdGgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5saXN0ZGlyKHBhdGgpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIG9wZW4oc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSksICdyYicpCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIHN0cmVhbToKICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcmVnaXN0ZXIoY2xzKToKICAgICAgICBsb2FkZXJfY2xzID0gZ2V0YXR0cigKICAgICAgICAgICAgaW1wb3J0bGliX21hY2hpbmVyeSwKICAgICAgICAgICAgJ1NvdXJjZUZpbGVMb2FkZXInLAogICAgICAgICAgICB0eXBlKE5vbmUpLAogICAgICAgICkKICAgICAgICByZWdpc3Rlcl9sb2FkZXJfdHlwZShsb2FkZXJfY2xzLCBjbHMpCgoKRGVmYXVsdFByb3ZpZGVyLl9yZWdpc3RlcigpCgoKY2xhc3MgRW1wdHlQcm92aWRlcihOdWxsUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXIgdGhhdCByZXR1cm5zIG5vdGhpbmcgZm9yIGFsbCByZXF1ZXN0cyIiIgoKICAgIF9pc2RpciA9IF9oYXMgPSBsYW1iZGEgc2VsZiwgcGF0aDogRmFsc2UKICAgIF9nZXQgPSBsYW1iZGEgc2VsZiwgcGF0aDogJycKICAgIF9saXN0ZGlyID0gbGFtYmRhIHNlbGYsIHBhdGg6IFtdCiAgICBtb2R1bGVfcGF0aCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKCmVtcHR5X3Byb3ZpZGVyID0gRW1wdHlQcm92aWRlcigpCgoKY2xhc3MgWmlwTWFuaWZlc3RzKGRpY3QpOgogICAgIiIiCiAgICB6aXAgbWFuaWZlc3QgYnVpbGRlcgogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYnVpbGQoY2xzLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIGRpY3Rpb25hcnkgc2ltaWxhciB0byB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeQogICAgICAgIGNhY2hlcywgZXhjZXB0IGluc3RlYWQgb2YgdHVwbGVzLCBzdG9yZSBaaXBJbmZvIG9iamVjdHMuCgogICAgICAgIFVzZSBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGggc2VwYXJhdG9yIChvcy5zZXApIGZvciB0aGUgcGF0aCBrZXlzCiAgICAgICAgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBweXB5IG9uIFdpbmRvd3MuCiAgICAgICAgIiIiCiAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUocGF0aCkgYXMgemZpbGU6CiAgICAgICAgICAgIGl0ZW1zID0gKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG5hbWUucmVwbGFjZSgnLycsIG9zLnNlcCksCiAgICAgICAgICAgICAgICAgICAgemZpbGUuZ2V0aW5mbyhuYW1lKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHpmaWxlLm5hbWVsaXN0KCkKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gZGljdChpdGVtcykKCiAgICBsb2FkID0gYnVpbGQKCgpjbGFzcyBNZW1vaXplZFppcE1hbmlmZXN0cyhaaXBNYW5pZmVzdHMpOgogICAgIiIiCiAgICBNZW1vaXplZCB6aXBmaWxlIG1hbmlmZXN0cy4KICAgICIiIgogICAgbWFuaWZlc3RfbW9kID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnbWFuaWZlc3RfbW9kJywgJ21hbmlmZXN0IG10aW1lJykKCiAgICBkZWYgbG9hZChzZWxmLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIGEgbWFuaWZlc3QgYXQgcGF0aCBvciByZXR1cm4gYSBzdWl0YWJsZSBtYW5pZmVzdCBhbHJlYWR5IGxvYWRlZC4KICAgICAgICAiIiIKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChwYXRoKQogICAgICAgIG10aW1lID0gb3Muc3RhdChwYXRoKS5zdF9tdGltZQoKICAgICAgICBpZiBwYXRoIG5vdCBpbiBzZWxmIG9yIHNlbGZbcGF0aF0ubXRpbWUgIT0gbXRpbWU6CiAgICAgICAgICAgIG1hbmlmZXN0ID0gc2VsZi5idWlsZChwYXRoKQogICAgICAgICAgICBzZWxmW3BhdGhdID0gc2VsZi5tYW5pZmVzdF9tb2QobWFuaWZlc3QsIG10aW1lKQoKICAgICAgICByZXR1cm4gc2VsZltwYXRoXS5tYW5pZmVzdAoKCmNsYXNzIFppcFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKICAgICIiIlJlc291cmNlIHN1cHBvcnQgZm9yIHppcHMgYW5kIGVnZ3MiIiIKCiAgICBlYWdlcnMgPSBOb25lCiAgICBfemlwX21hbmlmZXN0cyA9IE1lbW9pemVkWmlwTWFuaWZlc3RzKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBFZ2dQcm92aWRlci5fX2luaXRfXyhzZWxmLCBtb2R1bGUpCiAgICAgICAgc2VsZi56aXBfcHJlID0gc2VsZi5sb2FkZXIuYXJjaGl2ZSArIG9zLnNlcAoKICAgIGRlZiBfemlwaW5mb19uYW1lKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYSB6aXBmaWxlIHN1YnBhdGgKICAgICAgICAjIHVzYWJsZSB3aXRoIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5IGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLnppcF9wcmUpOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi56aXBfcHJlKQogICAgICAgICkKCiAgICBkZWYgX3BhcnRzKHNlbGYsIHppcF9wYXRoKToKICAgICAgICAjIENvbnZlcnQgYSB6aXBmaWxlIHN1YnBhdGggaW50byBhbiBlZ2ctcmVsYXRpdmUgcGF0aCBwYXJ0IGxpc3QuCiAgICAgICAgIyBwc2V1ZG8tZnMgcGF0aAogICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi5lZ2dfcm9vdCArIG9zLnNlcCk6CiAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuZWdnX3Jvb3QpICsgMTpdLnNwbGl0KG9zLnNlcCkKICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi5lZ2dfcm9vdCkKICAgICAgICApCgogICAgQHByb3BlcnR5CiAgICBkZWYgemlwaW5mbyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5femlwX21hbmlmZXN0cy5sb2FkKHNlbGYubG9hZGVyLmFyY2hpdmUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfbmFtZToKICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgICAgICJyZXNvdXJjZV9maWxlbmFtZSgpIG9ubHkgc3VwcG9ydGVkIGZvciAuZWdnLCBub3QgLnppcCIKICAgICAgICAgICAgKQogICAgICAgICMgbm8gbmVlZCB0byBsb2NrIGZvciBleHRyYWN0aW9uLCBzaW5jZSB3ZSB1c2UgdGVtcCBuYW1lcwogICAgICAgIHppcF9wYXRoID0gc2VsZi5fcmVzb3VyY2VfdG9femlwKHJlc291cmNlX25hbWUpCiAgICAgICAgZWFnZXJzID0gc2VsZi5fZ2V0X2VhZ2VyX3Jlc291cmNlcygpCiAgICAgICAgaWYgJy8nLmpvaW4oc2VsZi5fcGFydHMoemlwX3BhdGgpKSBpbiBlYWdlcnM6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGVhZ2VyczoKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgc2VsZi5fZWFnZXJfdG9femlwKG5hbWUpKQogICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHppcF9wYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2V0X2RhdGVfYW5kX3NpemUoemlwX3N0YXQpOgogICAgICAgIHNpemUgPSB6aXBfc3RhdC5maWxlX3NpemUKICAgICAgICAjIHltZGhtcyt3ZGF5LCB5ZGF5LCBkc3QKICAgICAgICBkYXRlX3RpbWUgPSB6aXBfc3RhdC5kYXRlX3RpbWUgKyAoMCwgMCwgLTEpCiAgICAgICAgIyAxOTgwIG9mZnNldCBhbHJlYWR5IGRvbmUKICAgICAgICB0aW1lc3RhbXAgPSB0aW1lLm1rdGltZShkYXRlX3RpbWUpCiAgICAgICAgcmV0dXJuIHRpbWVzdGFtcCwgc2l6ZQoKICAgIGRlZiBfZXh0cmFjdF9yZXNvdXJjZShzZWxmLCBtYW5hZ2VyLCB6aXBfcGF0aCk6CgogICAgICAgIGlmIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuX2luZGV4KClbemlwX3BhdGhdOgogICAgICAgICAgICAgICAgbGFzdCA9IHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgbWFuYWdlciwgb3MucGF0aC5qb2luKHppcF9wYXRoLCBuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAjIHJldHVybiB0aGUgZXh0cmFjdGVkIGRpcmVjdG9yeSBuYW1lCiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmRpcm5hbWUobGFzdCkKCiAgICAgICAgdGltZXN0YW1wLCBzaXplID0gc2VsZi5fZ2V0X2RhdGVfYW5kX3NpemUoc2VsZi56aXBpbmZvW3ppcF9wYXRoXSkKCiAgICAgICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJyJvcy5yZW5hbWUiIGFuZCAib3MudW5saW5rIiBhcmUgbm90IHN1cHBvcnRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uIHRoaXMgcGxhdGZvcm0nKQogICAgICAgIHRyeToKCiAgICAgICAgICAgIHJlYWxfcGF0aCA9IG1hbmFnZXIuZ2V0X2NhY2hlX3BhdGgoCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lLCBzZWxmLl9wYXJ0cyh6aXBfcGF0aCkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgc2VsZi5faXNfY3VycmVudChyZWFsX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKCiAgICAgICAgICAgIG91dGYsIHRtcG5hbSA9IF9ta3N0ZW1wKAogICAgICAgICAgICAgICAgIi4kZXh0cmFjdCIsCiAgICAgICAgICAgICAgICBkaXI9b3MucGF0aC5kaXJuYW1lKHJlYWxfcGF0aCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgb3Mud3JpdGUob3V0Ziwgc2VsZi5sb2FkZXIuZ2V0X2RhdGEoemlwX3BhdGgpKQogICAgICAgICAgICBvcy5jbG9zZShvdXRmKQogICAgICAgICAgICB1dGltZSh0bXBuYW0sICh0aW1lc3RhbXAsIHRpbWVzdGFtcCkpCiAgICAgICAgICAgIG1hbmFnZXIucG9zdHByb2Nlc3ModG1wbmFtLCByZWFsX3BhdGgpCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCgogICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShyZWFsX3BhdGgpOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzX2N1cnJlbnQocmVhbF9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGZpbGUgYmVjYW1lIGN1cnJlbnQgc2luY2UgaXQgd2FzIGNoZWNrZWQgYWJvdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICMgIHNvIHByb2NlZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKICAgICAgICAgICAgICAgICAgICAjIFdpbmRvd3MsIGRlbCBvbGQgZmlsZSBhbmQgcmV0cnkKICAgICAgICAgICAgICAgICAgICBlbGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKHJlYWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICMgcmVwb3J0IGEgdXNlci1mcmllbmRseSBlcnJvcgogICAgICAgICAgICBtYW5hZ2VyLmV4dHJhY3Rpb25fZXJyb3IoKQoKICAgICAgICByZXR1cm4gcmVhbF9wYXRoCgogICAgZGVmIF9pc19jdXJyZW50KHNlbGYsIGZpbGVfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSBmaWxlX3BhdGggaXMgY3VycmVudCBmb3IgdGhpcyB6aXBfcGF0aAogICAgICAgICIiIgogICAgICAgIHRpbWVzdGFtcCwgc2l6ZSA9IHNlbGYuX2dldF9kYXRlX2FuZF9zaXplKHNlbGYuemlwaW5mb1t6aXBfcGF0aF0pCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGZpbGVfcGF0aCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHN0YXQgPSBvcy5zdGF0KGZpbGVfcGF0aCkKICAgICAgICBpZiBzdGF0LnN0X3NpemUgIT0gc2l6ZSBvciBzdGF0LnN0X210aW1lICE9IHRpbWVzdGFtcDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBjaGVjayB0aGF0IHRoZSBjb250ZW50cyBtYXRjaAogICAgICAgIHppcF9jb250ZW50cyA9IHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKQogICAgICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQogICAgICAgIHJldHVybiB6aXBfY29udGVudHMgPT0gZmlsZV9jb250ZW50cwoKICAgIGRlZiBfZ2V0X2VhZ2VyX3Jlc291cmNlcyhzZWxmKToKICAgICAgICBpZiBzZWxmLmVhZ2VycyBpcyBOb25lOgogICAgICAgICAgICBlYWdlcnMgPSBbXQogICAgICAgICAgICBmb3IgbmFtZSBpbiAoJ25hdGl2ZV9saWJzLnR4dCcsICdlYWdlcl9yZXNvdXJjZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgICAgICAgICBlYWdlcnMuZXh0ZW5kKHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpKQogICAgICAgICAgICBzZWxmLmVhZ2VycyA9IGVhZ2VycwogICAgICAgIHJldHVybiBzZWxmLmVhZ2VycwoKICAgIGRlZiBfaW5kZXgoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZGlyaW5kZXgKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGluZCA9IHt9CiAgICAgICAgICAgIGZvciBwYXRoIGluIHNlbGYuemlwaW5mbzoKICAgICAgICAgICAgICAgIHBhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCiAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0czoKICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBvcy5zZXAuam9pbihwYXJ0c1s6LTFdKQogICAgICAgICAgICAgICAgICAgIGlmIHBhcmVudCBpbiBpbmQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdLmFwcGVuZChwYXJ0c1stMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0gPSBbcGFydHMucG9wKCldCiAgICAgICAgICAgIHNlbGYuX2RpcmluZGV4ID0gaW5kCiAgICAgICAgICAgIHJldHVybiBpbmQKCiAgICBkZWYgX2hhcyhzZWxmLCBmc3BhdGgpOgogICAgICAgIHppcF9wYXRoID0gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkKICAgICAgICByZXR1cm4gemlwX3BhdGggaW4gc2VsZi56aXBpbmZvIG9yIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpIGluIHNlbGYuX2luZGV4KCkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgZnNwYXRoKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9pbmRleCgpLmdldChzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKSwgKCkpKQoKICAgIGRlZiBfZWFnZXJfdG9femlwKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5lZ2dfcm9vdCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIF9yZXNvdXJjZV90b196aXAoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCgpyZWdpc3Rlcl9sb2FkZXJfdHlwZSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIFppcFByb3ZpZGVyKQoKCmNsYXNzIEZpbGVNZXRhZGF0YShFbXB0eVByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIGhhbmRsZXIgZm9yIHN0YW5kYWxvbmUgUEtHLUlORk8gZmlsZXMKCiAgICBVc2FnZTo6CgogICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKCIvcGF0aC90by9QS0ctSU5GTyIpCgogICAgVGhpcyBwcm92aWRlciByZWplY3RzIGFsbCBkYXRhIGFuZCBtZXRhZGF0YSByZXF1ZXN0cyBleGNlcHQgZm9yIFBLRy1JTkZPLAogICAgd2hpY2ggaXMgdHJlYXRlZCBhcyBleGlzdGluZywgYW5kIHdpbGwgYmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0CiAgICB0aGUgcHJvdmlkZWQgbG9jYXRpb24uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAoKICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIG5hbWUgPT0gJ1BLRy1JTkZPJyBhbmQgb3MucGF0aC5pc2ZpbGUoc2VsZi5wYXRoKQoKICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSAhPSAnUEtHLUlORk8nOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gbWV0YWRhdGEgZXhjZXB0IFBLRy1JTkZPIGlzIGF2YWlsYWJsZSIpCgogICAgICAgIHdpdGggaW8ub3BlbihzZWxmLnBhdGgsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0icmVwbGFjZSIpIGFzIGY6CiAgICAgICAgICAgIG1ldGFkYXRhID0gZi5yZWFkKCkKICAgICAgICBzZWxmLl93YXJuX29uX3JlcGxhY2VtZW50KG1ldGFkYXRhKQogICAgICAgIHJldHVybiBtZXRhZGF0YQoKICAgIGRlZiBfd2Fybl9vbl9yZXBsYWNlbWVudChzZWxmLCBtZXRhZGF0YSk6CiAgICAgICAgIyBQeXRob24gMi43IGNvbXBhdCBmb3I6IHJlcGxhY2VtZW50X2NoYXIgPSAn77+9JwogICAgICAgIHJlcGxhY2VtZW50X2NoYXIgPSBiJ1x4ZWZceGJmXHhiZCcuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgcmVwbGFjZW1lbnRfY2hhciBpbiBtZXRhZGF0YToKICAgICAgICAgICAgdG1wbCA9ICJ7c2VsZi5wYXRofSBjb3VsZCBub3QgYmUgcHJvcGVybHkgZGVjb2RlZCBpbiBVVEYtOCIKICAgICAgICAgICAgbXNnID0gdG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCgoKY2xhc3MgUGF0aE1ldGFkYXRhKERlZmF1bHRQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgZWdnIGRpcmVjdG9yaWVzCgogICAgVXNhZ2U6OgoKICAgICAgICAjIERldmVsb3BtZW50IGVnZ3M6CgogICAgICAgIGVnZ19pbmZvID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLmVnZy1pbmZvIgogICAgICAgIGJhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKQogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGJhc2VfZGlyLCBlZ2dfaW5mbykKICAgICAgICBkaXN0X25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZWdnX2luZm8pKVswXQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYmFzZWRpciwgcHJvamVjdF9uYW1lPWRpc3RfbmFtZSwgbWV0YWRhdGE9bWV0YWRhdGEpCgogICAgICAgICMgVW5wYWNrZWQgZWdnIGRpcmVjdG9yaWVzOgoKICAgICAgICBlZ2dfcGF0aCA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS12ZXItcHl2ZXItZXRjLmVnZyIKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCwgb3MucGF0aC5qb2luKGVnZ19wYXRoLCdFR0ctSU5GTycpKQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZWdnX2luZm8pOgogICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBwYXRoCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVnZ19pbmZvCgoKY2xhc3MgRWdnTWV0YWRhdGEoWmlwUHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIC5lZ2cgZmlsZXMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW1wb3J0ZXIpOgogICAgICAgICIiIkNyZWF0ZSBhIG1ldGFkYXRhIHByb3ZpZGVyIGZyb20gYSB6aXBpbXBvcnRlciIiIgoKICAgICAgICBzZWxmLnppcF9wcmUgPSBpbXBvcnRlci5hcmNoaXZlICsgb3Muc2VwCiAgICAgICAgc2VsZi5sb2FkZXIgPSBpbXBvcnRlcgogICAgICAgIGlmIGltcG9ydGVyLnByZWZpeDoKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguam9pbihpbXBvcnRlci5hcmNoaXZlLCBpbXBvcnRlci5wcmVmaXgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IGltcG9ydGVyLmFyY2hpdmUKICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQoKCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzPXt9KQoKCmRlZiByZWdpc3Rlcl9maW5kZXIoaW1wb3J0ZXJfdHlwZSwgZGlzdHJpYnV0aW9uX2ZpbmRlcik6CiAgICAiIiJSZWdpc3RlciBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgdG8gZmluZCBkaXN0cmlidXRpb25zIGluIHN5cy5wYXRoIGl0ZW1zCgogICAgYGltcG9ydGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiAiSW1wb3J0ZXIiIChzeXMucGF0aCBpdGVtCiAgICBoYW5kbGVyKSwgYW5kIGBkaXN0cmlidXRpb25fZmluZGVyYCBpcyBhIGNhbGxhYmxlIHRoYXQsIHBhc3NlZCBhIHBhdGgKICAgIGl0ZW0gYW5kIHRoZSBpbXBvcnRlciBpbnN0YW5jZSwgeWllbGRzIGBgRGlzdHJpYnV0aW9uYGAgaW5zdGFuY2VzIGZvdW5kIG9uCiAgICB0aGF0IHBhdGggaXRlbS4gIFNlZSBgYHBrZ19yZXNvdXJjZXMuZmluZF9vbl9wYXRoYGAgZm9yIGFuIGV4YW1wbGUuIiIiCiAgICBfZGlzdHJpYnV0aW9uX2ZpbmRlcnNbaW1wb3J0ZXJfdHlwZV0gPSBkaXN0cmlidXRpb25fZmluZGVyCgoKZGVmIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIHZpYSBgcGF0aF9pdGVtYCIiIgogICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQogICAgZmluZGVyID0gX2ZpbmRfYWRhcHRlcihfZGlzdHJpYnV0aW9uX2ZpbmRlcnMsIGltcG9ydGVyKQogICAgcmV0dXJuIGZpbmRlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KQoKCmRlZiBmaW5kX2VnZ3NfaW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiCiAgICBGaW5kIGVnZ3MgaW4gemlwIGZpbGVzOyBwb3NzaWJseSBtdWx0aXBsZSBuZXN0ZWQgZWdncy4KICAgICIiIgogICAgaWYgaW1wb3J0ZXIuYXJjaGl2ZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICMgd2hlZWxzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBmaW5kZXIKICAgICAgICAjIHRoZXkgZG9uJ3QgaGF2ZSBQS0ctSU5GTyBtZXRhZGF0YSwgYW5kIHdvbid0IGV2ZXIgY29udGFpbiBlZ2dzCiAgICAgICAgcmV0dXJuCiAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKGltcG9ydGVyKQogICAgaWYgbWV0YWRhdGEuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKHBhdGhfaXRlbSwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICBpZiBvbmx5OgogICAgICAgICMgZG9uJ3QgeWllbGQgbmVzdGVkIGRpc3Ryb3MKICAgICAgICByZXR1cm4KICAgIGZvciBzdWJpdGVtIGluIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoJy8nKToKICAgICAgICBpZiBfaXNfZWdnX3BhdGgoc3ViaXRlbSk6CiAgICAgICAgICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBzdWJpdGVtKQogICAgICAgICAgICBkaXN0cyA9IGZpbmRfZWdnc19pbl96aXAoemlwaW1wb3J0LnppcGltcG9ydGVyKHN1YnBhdGgpLCBzdWJwYXRoKQogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICBlbGlmIHN1Yml0ZW0ubG93ZXIoKS5lbmRzd2l0aCgnLmRpc3QtaW5mbycpOgogICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgc3VibWV0YSA9IEVnZ01ldGFkYXRhKHppcGltcG9ydC56aXBpbXBvcnRlcihzdWJwYXRoKSkKICAgICAgICAgICAgc3VibWV0YS5lZ2dfaW5mbyA9IHN1YnBhdGgKICAgICAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24ocGF0aF9pdGVtLCBzdWJpdGVtLCBzdWJtZXRhKQoKCnJlZ2lzdGVyX2ZpbmRlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbmRfZWdnc19pbl96aXApCgoKZGVmIGZpbmRfbm90aGluZyhpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgIHJldHVybiAoKQoKCnJlZ2lzdGVyX2ZpbmRlcihvYmplY3QsIGZpbmRfbm90aGluZykKCgpkZWYgX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcyk6CiAgICAiIiIKICAgIEdpdmVuIGEgbGlzdCBvZiBmaWxlbmFtZXMsIHJldHVybiB0aGVtIGluIGRlc2NlbmRpbmcgb3JkZXIKICAgIGJ5IHZlcnNpb24gbnVtYmVyLgoKICAgID4+PiBuYW1lcyA9ICdiYXInLCAnZm9vJywgJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnUHl0aG9uLTIuNy4xMC5lZ2cnLCAnUHl0aG9uLTIuNy4yLmVnZycsICdmb28nLCAnYmFyJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgPj4+IG5hbWVzID0gJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuM2IxLmVnZyddCiAgICAiIiIKICAgIGRlZiBfYnlfdmVyc2lvbihuYW1lKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSBlYWNoIGNvbXBvbmVudCBvZiB0aGUgZmlsZW5hbWUKICAgICAgICAiIiIKICAgICAgICBuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCiAgICAgICAgcGFydHMgPSBpdGVydG9vbHMuY2hhaW4obmFtZS5zcGxpdCgnLScpLCBbZXh0XSkKICAgICAgICByZXR1cm4gW3BhY2thZ2luZy52ZXJzaW9uLnBhcnNlKHBhcnQpIGZvciBwYXJ0IGluIHBhcnRzXQoKICAgIHJldHVybiBzb3J0ZWQobmFtZXMsIGtleT1fYnlfdmVyc2lvbiwgcmV2ZXJzZT1UcnVlKQoKCmRlZiBmaW5kX29uX3BhdGgoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGFjY2Vzc2libGUgb24gYSBzeXMucGF0aCBkaXJlY3RvcnkiIiIKICAgIHBhdGhfaXRlbSA9IF9ub3JtYWxpemVfY2FjaGVkKHBhdGhfaXRlbSkKCiAgICBpZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGhfaXRlbSk6CiAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoCiAgICAgICAgICAgIHBhdGhfaXRlbSwgbWV0YWRhdGE9UGF0aE1ldGFkYXRhKAogICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCAnRUdHLUlORk8nKQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGVudHJpZXMgPSBzYWZlX2xpc3RkaXIocGF0aF9pdGVtKQoKICAgICMgZm9yIHBlcmZvcm1hbmNlLCBiZWZvcmUgc29ydGluZyBieSB2ZXJzaW9uLAogICAgIyBzY3JlZW4gZW50cmllcyBmb3Igb25seSB0aG9zZSB0aGF0IHdpbGwgeWllbGQKICAgICMgZGlzdHJpYnV0aW9ucwogICAgZmlsdGVyZWQgPSAoCiAgICAgICAgZW50cnkKICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllcwogICAgICAgIGlmIGRpc3RfZmFjdG9yeShwYXRoX2l0ZW0sIGVudHJ5LCBvbmx5KQogICAgKQoKICAgICMgc2NhbiBmb3IgLmVnZyBhbmQgLmVnZy1pbmZvIGluIGRpcmVjdG9yeQogICAgcGF0aF9pdGVtX2VudHJpZXMgPSBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKGZpbHRlcmVkKQogICAgZm9yIGVudHJ5IGluIHBhdGhfaXRlbV9lbnRyaWVzOgogICAgICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpCiAgICAgICAgZmFjdG9yeSA9IGRpc3RfZmFjdG9yeShwYXRoX2l0ZW0sIGVudHJ5LCBvbmx5KQogICAgICAgIGZvciBkaXN0IGluIGZhY3RvcnkoZnVsbHBhdGgpOgogICAgICAgICAgICB5aWVsZCBkaXN0CgoKZGVmIGRpc3RfZmFjdG9yeShwYXRoX2l0ZW0sIGVudHJ5LCBvbmx5KToKICAgICIiIgogICAgUmV0dXJuIGEgZGlzdF9mYWN0b3J5IGZvciBhIHBhdGhfaXRlbSBhbmQgZW50cnkKICAgICIiIgogICAgbG93ZXIgPSBlbnRyeS5sb3dlcigpCiAgICBpc19tZXRhID0gYW55KG1hcChsb3dlci5lbmRzd2l0aCwgKCcuZWdnLWluZm8nLCAnLmRpc3QtaW5mbycpKSkKICAgIHJldHVybiAoCiAgICAgICAgZGlzdHJpYnV0aW9uc19mcm9tX21ldGFkYXRhCiAgICAgICAgaWYgaXNfbWV0YSBlbHNlCiAgICAgICAgZmluZF9kaXN0cmlidXRpb25zCiAgICAgICAgaWYgbm90IG9ubHkgYW5kIF9pc19lZ2dfcGF0aChlbnRyeSkgZWxzZQogICAgICAgIHJlc29sdmVfZWdnX2xpbmsKICAgICAgICBpZiBub3Qgb25seSBhbmQgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctbGluaycpIGVsc2UKICAgICAgICBOb0Rpc3RzKCkKICAgICkKCgpjbGFzcyBOb0Rpc3RzOgogICAgIiIiCiAgICA+Pj4gYm9vbChOb0Rpc3RzKCkpCiAgICBGYWxzZQoKICAgID4+PiBsaXN0KE5vRGlzdHMoKSgnYW55dGhpbmcnKSkKICAgIFtdCiAgICAiIiIKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGlmIHNpeC5QWTI6CiAgICAgICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXwoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBmdWxscGF0aCk6CiAgICAgICAgcmV0dXJuIGl0ZXIoKCkpCgoKZGVmIHNhZmVfbGlzdGRpcihwYXRoKToKICAgICIiIgogICAgQXR0ZW1wdCB0byBsaXN0IGNvbnRlbnRzIG9mIHBhdGgsIGJ1dCBzdXBwcmVzcyBzb21lIGV4Y2VwdGlvbnMuCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQogICAgZXhjZXB0IChQZXJtaXNzaW9uRXJyb3IsIE5vdEFEaXJlY3RvcnlFcnJvcik6CiAgICAgICAgcGFzcwogICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAjIElnbm9yZSB0aGUgZGlyZWN0b3J5IGlmIGRvZXMgbm90IGV4aXN0LCBub3QgYSBkaXJlY3Rvcnkgb3IKICAgICAgICAjIHBlcm1pc3Npb24gZGVuaWVkCiAgICAgICAgaWdub3JhYmxlID0gKAogICAgICAgICAgICBlLmVycm5vIGluIChlcnJuby5FTk9URElSLCBlcnJuby5FQUNDRVMsIGVycm5vLkVOT0VOVCkKICAgICAgICAgICAgIyBQeXRob24gMiBvbiBXaW5kb3dzIG5lZWRzIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkgOigKICAgICAgICAgICAgb3IgZ2V0YXR0cihlLCAid2luZXJyb3IiLCBOb25lKSA9PSAyNjcKICAgICAgICApCiAgICAgICAgaWYgbm90IGlnbm9yYWJsZToKICAgICAgICAgICAgcmFpc2UKICAgIHJldHVybiAoKQoKCmRlZiBkaXN0cmlidXRpb25zX2Zyb21fbWV0YWRhdGEocGF0aCk6CiAgICByb290ID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgIGlmIGxlbihvcy5saXN0ZGlyKHBhdGgpKSA9PSAwOgogICAgICAgICAgICAjIGVtcHR5IG1ldGFkYXRhIGRpcjsgc2tpcAogICAgICAgICAgICByZXR1cm4KICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShyb290LCBwYXRoKQogICAgZWxzZToKICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YShwYXRoKQogICAgZW50cnkgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICByb290LCBlbnRyeSwgbWV0YWRhdGEsIHByZWNlZGVuY2U9REVWRUxPUF9ESVNULAogICAgKQoKCmRlZiBub25fZW1wdHlfbGluZXMocGF0aCk6CiAgICAiIiIKICAgIFlpZWxkIG5vbi1lbXB0eSBsaW5lcyBmcm9tIGZpbGUgYXQgcGF0aAogICAgIiIiCiAgICB3aXRoIG9wZW4ocGF0aCkgYXMgZjoKICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIGxpbmU6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCgoKZGVmIHJlc29sdmVfZWdnX2xpbmsocGF0aCk6CiAgICAiIiIKICAgIEdpdmVuIGEgcGF0aCB0byBhbiAuZWdnLWxpbmssIHJlc29sdmUgZGlzdHJpYnV0aW9ucwogICAgcHJlc2VudCBpbiB0aGUgcmVmZXJlbmNlZCBwYXRoLgogICAgIiIiCiAgICByZWZlcmVuY2VkX3BhdGhzID0gbm9uX2VtcHR5X2xpbmVzKHBhdGgpCiAgICByZXNvbHZlZF9wYXRocyA9ICgKICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHBhdGgpLCByZWYpCiAgICAgICAgZm9yIHJlZiBpbiByZWZlcmVuY2VkX3BhdGhzCiAgICApCiAgICBkaXN0X2dyb3VwcyA9IG1hcChmaW5kX2Rpc3RyaWJ1dGlvbnMsIHJlc29sdmVkX3BhdGhzKQogICAgcmV0dXJuIG5leHQoZGlzdF9ncm91cHMsICgpKQoKCnJlZ2lzdGVyX2ZpbmRlcihwa2d1dGlsLkltcEltcG9ydGVyLCBmaW5kX29uX3BhdGgpCgppZiBoYXNhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksICdGaWxlRmluZGVyJyk6CiAgICByZWdpc3Rlcl9maW5kZXIoaW1wb3J0bGliX21hY2hpbmVyeS5GaWxlRmluZGVyLCBmaW5kX29uX3BhdGgpCgpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9uYW1lc3BhY2VfaGFuZGxlcnM9e30pCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX25hbWVzcGFjZV9wYWNrYWdlcz17fSkKCgpkZWYgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXJfdHlwZSwgbmFtZXNwYWNlX2hhbmRsZXIpOgogICAgIiIiUmVnaXN0ZXIgYG5hbWVzcGFjZV9oYW5kbGVyYCB0byBkZWNsYXJlIG5hbWVzcGFjZSBwYWNrYWdlcwoKICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQogICAgaGFuZGxlciksIGFuZCBgbmFtZXNwYWNlX2hhbmRsZXJgIGlzIGEgY2FsbGFibGUgbGlrZSB0aGlzOjoKCiAgICAgICAgZGVmIG5hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2VudHJ5LCBtb2R1bGVOYW1lLCBtb2R1bGUpOgogICAgICAgICAgICAjIHJldHVybiBhIHBhdGhfZW50cnkgdG8gdXNlIGZvciBjaGlsZCBwYWNrYWdlcwoKICAgIE5hbWVzcGFjZSBoYW5kbGVycyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGltcG9ydGVyIG9iamVjdCBoYXMgYWxyZWFkeQogICAgYWdyZWVkIHRoYXQgaXQgY2FuIGhhbmRsZSB0aGUgcmVsZXZhbnQgcGF0aCBpdGVtLCBhbmQgdGhleSBzaG91bGQgb25seQogICAgcmV0dXJuIGEgc3VicGF0aCBpZiB0aGUgbW9kdWxlIF9fcGF0aF9fIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhbgogICAgZXF1aXZhbGVudCBzdWJwYXRoLiAgRm9yIGFuIGV4YW1wbGUgbmFtZXNwYWNlIGhhbmRsZXIsIHNlZQogICAgYGBwa2dfcmVzb3VyY2VzLmZpbGVfbnNfaGFuZGxlcmBgLgogICAgIiIiCiAgICBfbmFtZXNwYWNlX2hhbmRsZXJzW2ltcG9ydGVyX3R5cGVdID0gbmFtZXNwYWNlX2hhbmRsZXIKCgpkZWYgX2hhbmRsZV9ucyhwYWNrYWdlTmFtZSwgcGF0aF9pdGVtKToKICAgICIiIkVuc3VyZSB0aGF0IG5hbWVkIHBhY2thZ2UgaW5jbHVkZXMgYSBzdWJwYXRoIG9mIHBhdGhfaXRlbSAoaWYgbmVlZGVkKSIiIgoKICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKHBhY2thZ2VOYW1lKQogICAgaWYgbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzLmdldChwYWNrYWdlTmFtZSkKICAgIGlmIG1vZHVsZSBpcyBOb25lOgogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW3BhY2thZ2VOYW1lXSA9IHR5cGVzLk1vZHVsZVR5cGUocGFja2FnZU5hbWUpCiAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW10KICAgICAgICBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSkKICAgIGVsaWYgbm90IGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFja2FnZU5hbWUpCiAgICBoYW5kbGVyID0gX2ZpbmRfYWRhcHRlcihfbmFtZXNwYWNlX2hhbmRsZXJzLCBpbXBvcnRlcikKICAgIHN1YnBhdGggPSBoYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpCiAgICBpZiBzdWJwYXRoIGlzIG5vdCBOb25lOgogICAgICAgIHBhdGggPSBtb2R1bGUuX19wYXRoX18KICAgICAgICBwYXRoLmFwcGVuZChzdWJwYXRoKQogICAgICAgIGxvYWRlci5sb2FkX21vZHVsZShwYWNrYWdlTmFtZSkKICAgICAgICBfcmVidWlsZF9tb2RfcGF0aChwYXRoLCBwYWNrYWdlTmFtZSwgbW9kdWxlKQogICAgcmV0dXJuIHN1YnBhdGgKCgpkZWYgX3JlYnVpbGRfbW9kX3BhdGgob3JpZ19wYXRoLCBwYWNrYWdlX25hbWUsIG1vZHVsZSk6CiAgICAiIiIKICAgIFJlYnVpbGQgbW9kdWxlLl9fcGF0aF9fIGVuc3VyaW5nIHRoYXQgYWxsIGVudHJpZXMgYXJlIG9yZGVyZWQKICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIgc3lzLnBhdGggb3JkZXIKICAgICIiIgogICAgc3lzX3BhdGggPSBbX25vcm1hbGl6ZV9jYWNoZWQocCkgZm9yIHAgaW4gc3lzLnBhdGhdCgogICAgZGVmIHNhZmVfc3lzX3BhdGhfaW5kZXgoZW50cnkpOgogICAgICAgICIiIgogICAgICAgIFdvcmthcm91bmQgZm9yICM1MjAgYW5kICM1MTMuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3lzX3BhdGguaW5kZXgoZW50cnkpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBmbG9hdCgnaW5mJykKCiAgICBkZWYgcG9zaXRpb25faW5fc3lzX3BhdGgocGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBvcmRpbmFsIG9mIHRoZSBwYXRoIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBpbiBzeXMucGF0aAogICAgICAgICIiIgogICAgICAgIHBhdGhfcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKICAgICAgICBtb2R1bGVfcGFydHMgPSBwYWNrYWdlX25hbWUuY291bnQoJy4nKSArIDEKICAgICAgICBwYXJ0cyA9IHBhdGhfcGFydHNbOi1tb2R1bGVfcGFydHNdCiAgICAgICAgcmV0dXJuIHNhZmVfc3lzX3BhdGhfaW5kZXgoX25vcm1hbGl6ZV9jYWNoZWQob3Muc2VwLmpvaW4ocGFydHMpKSkKCiAgICBpZiBub3QgaXNpbnN0YW5jZShvcmlnX3BhdGgsIGxpc3QpOgogICAgICAgICMgSXMgdGhpcyBiZWhhdmlvciB1c2VmdWwgd2hlbiBtb2R1bGUuX19wYXRoX18gaXMgbm90IGEgbGlzdD8KICAgICAgICByZXR1cm4KCiAgICBvcmlnX3BhdGguc29ydChrZXk9cG9zaXRpb25faW5fc3lzX3BhdGgpCiAgICBtb2R1bGUuX19wYXRoX19bOl0gPSBbX25vcm1hbGl6ZV9jYWNoZWQocCkgZm9yIHAgaW4gb3JpZ19wYXRoXQoKCmRlZiBkZWNsYXJlX25hbWVzcGFjZShwYWNrYWdlTmFtZSk6CiAgICAiIiJEZWNsYXJlIHRoYXQgcGFja2FnZSAncGFja2FnZU5hbWUnIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UiIiIKCiAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICB0cnk6CiAgICAgICAgaWYgcGFja2FnZU5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHBhdGgsIHBhcmVudCA9IHN5cy5wYXRoLCBOb25lCiAgICAgICAgaWYgJy4nIGluIHBhY2thZ2VOYW1lOgogICAgICAgICAgICBwYXJlbnQgPSAnLicuam9pbihwYWNrYWdlTmFtZS5zcGxpdCgnLicpWzotMV0pCiAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBhcmVudCkKICAgICAgICAgICAgaWYgcGFyZW50IG5vdCBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgX19pbXBvcnRfXyhwYXJlbnQpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhdGggPSBzeXMubW9kdWxlc1twYXJlbnRdLl9fcGF0aF9fCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYXJlbnQpCgogICAgICAgICMgVHJhY2sgd2hhdCBwYWNrYWdlcyBhcmUgbmFtZXNwYWNlcywgc28gd2hlbiBuZXcgcGF0aCBpdGVtcyBhcmUgYWRkZWQsCiAgICAgICAgIyB0aGV5IGNhbiBiZSB1cGRhdGVkCiAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhcmVudCwgW10pLmFwcGVuZChwYWNrYWdlTmFtZSkKICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFja2FnZU5hbWUsIFtdKQoKICAgICAgICBmb3IgcGF0aF9pdGVtIGluIHBhdGg6CiAgICAgICAgICAgICMgRW5zdXJlIGFsbCB0aGUgcGFyZW50J3MgcGF0aCBpdGVtcyBhcmUgcmVmbGVjdGVkIGluIHRoZSBjaGlsZCwKICAgICAgICAgICAgIyBpZiB0aGV5IGFwcGx5CiAgICAgICAgICAgIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSkKCiAgICBmaW5hbGx5OgogICAgICAgIF9pbXAucmVsZWFzZV9sb2NrKCkKCgpkZWYgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHBhdGhfaXRlbSwgcGFyZW50PU5vbmUpOgogICAgIiIiRW5zdXJlIHRoYXQgcHJldmlvdXNseS1kZWNsYXJlZCBuYW1lc3BhY2UgcGFja2FnZXMgaW5jbHVkZSBwYXRoX2l0ZW0iIiIKICAgIF9pbXAuYWNxdWlyZV9sb2NrKCkKICAgIHRyeToKICAgICAgICBmb3IgcGFja2FnZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzLmdldChwYXJlbnQsICgpKToKICAgICAgICAgICAgc3VicGF0aCA9IF9oYW5kbGVfbnMocGFja2FnZSwgcGF0aF9pdGVtKQogICAgICAgICAgICBpZiBzdWJwYXRoOgogICAgICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHN1YnBhdGgsIHBhY2thZ2UpCiAgICBmaW5hbGx5OgogICAgICAgIF9pbXAucmVsZWFzZV9sb2NrKCkKCgpkZWYgZmlsZV9uc19oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpOgogICAgIiIiQ29tcHV0ZSBhbiBucy1wYWNrYWdlIHN1YnBhdGggZm9yIGEgZmlsZXN5c3RlbSBvciB6aXBmaWxlIGltcG9ydGVyIiIiCgogICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLnNwbGl0KCcuJylbLTFdKQogICAgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVfY2FjaGVkKHN1YnBhdGgpCiAgICBmb3IgaXRlbSBpbiBtb2R1bGUuX19wYXRoX186CiAgICAgICAgaWYgX25vcm1hbGl6ZV9jYWNoZWQoaXRlbSkgPT0gbm9ybWFsaXplZDoKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgIyBPbmx5IHJldHVybiB0aGUgcGF0aCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlCiAgICAgICAgcmV0dXJuIHN1YnBhdGgKCgpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihwa2d1dGlsLkltcEltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQoKaWYgaGFzYXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnRmlsZUZpbmRlcicpOgogICAgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0bGliX21hY2hpbmVyeS5GaWxlRmluZGVyLCBmaWxlX25zX2hhbmRsZXIpCgoKZGVmIG51bGxfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKICAgIHJldHVybiBOb25lCgoKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIob2JqZWN0LCBudWxsX25zX2hhbmRsZXIpCgoKZGVmIG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKToKICAgICIiIk5vcm1hbGl6ZSBhIGZpbGUvZGlyIG5hbWUgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMiIiIKICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoZmlsZW5hbWUpKQoKCmRlZiBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSwgX2NhY2hlPXt9KToKICAgIHRyeToKICAgICAgICByZXR1cm4gX2NhY2hlW2ZpbGVuYW1lXQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIF9jYWNoZVtmaWxlbmFtZV0gPSByZXN1bHQgPSBub3JtYWxpemVfcGF0aChmaWxlbmFtZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9pc19lZ2dfcGF0aChwYXRoKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIGdpdmVuIHBhdGggYXBwZWFycyB0byBiZSBhbiBlZ2cuCiAgICAiIiIKICAgIHJldHVybiBwYXRoLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKQoKCmRlZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGgpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgZ2l2ZW4gcGF0aCBhcHBlYXJzIHRvIGJlIGFuIHVucGFja2VkIGVnZy4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBfaXNfZWdnX3BhdGgocGF0aCkgYW5kCiAgICAgICAgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycsICdQS0ctSU5GTycpKQogICAgKQoKCmRlZiBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSk6CiAgICBwYXJ0cyA9IHBhY2thZ2VOYW1lLnNwbGl0KCcuJykKICAgIG5hbWUgPSBwYXJ0cy5wb3AoKQogICAgaWYgcGFydHM6CiAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFydHMpCiAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1twYXJlbnRdLCBuYW1lLCBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0pCgoKZGVmIHlpZWxkX2xpbmVzKHN0cnMpOgogICAgIiIiWWllbGQgbm9uLWVtcHR5L25vbi1jb21tZW50IGxpbmVzIG9mIGEgc3RyaW5nIG9yIHNlcXVlbmNlIiIiCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIGZvciBzIGluIHN0cnMuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBzID0gcy5zdHJpcCgpCiAgICAgICAgICAgICMgc2tpcCBibGFuayBsaW5lcy9jb21tZW50cwogICAgICAgICAgICBpZiBzIGFuZCBub3Qgcy5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCiAgICBlbHNlOgogICAgICAgIGZvciBzcyBpbiBzdHJzOgogICAgICAgICAgICBmb3IgcyBpbiB5aWVsZF9saW5lcyhzcyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCgoKTU9EVUxFID0gcmUuY29tcGlsZShyIlx3KyhcLlx3KykqJCIpLm1hdGNoCkVHR19OQU1FID0gcmUuY29tcGlsZSgKICAgIHIiIiIKICAgICg/UDxuYW1lPlteLV0rKSAoCiAgICAgICAgLSg/UDx2ZXI+W14tXSspICgKICAgICAgICAgICAgLXB5KD9QPHB5dmVyPlteLV0rKSAoCiAgICAgICAgICAgICAgICAtKD9QPHBsYXQ+LispCiAgICAgICAgICAgICk/CiAgICAgICAgKT8KICAgICk/CiAgICAiIiIsCiAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSwKKS5tYXRjaAoKCmNsYXNzIEVudHJ5UG9pbnQob2JqZWN0KToKICAgICIiIk9iamVjdCByZXByZXNlbnRpbmcgYW4gYWR2ZXJ0aXNlZCBpbXBvcnRhYmxlIG9iamVjdCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2R1bGVfbmFtZSwgYXR0cnM9KCksIGV4dHJhcz0oKSwgZGlzdD1Ob25lKToKICAgICAgICBpZiBub3QgTU9EVUxFKG1vZHVsZV9uYW1lKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBtb2R1bGUgbmFtZSIsIG1vZHVsZV9uYW1lKQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLm1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmF0dHJzID0gdHVwbGUoYXR0cnMpCiAgICAgICAgc2VsZi5leHRyYXMgPSB0dXBsZShleHRyYXMpCiAgICAgICAgc2VsZi5kaXN0ID0gZGlzdAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHMgPSAiJXMgPSAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLm1vZHVsZV9uYW1lKQogICAgICAgIGlmIHNlbGYuYXR0cnM6CiAgICAgICAgICAgIHMgKz0gJzonICsgJy4nLmpvaW4oc2VsZi5hdHRycykKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcyArPSAnIFslc10nICUgJywnLmpvaW4oc2VsZi5leHRyYXMpCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJFbnRyeVBvaW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBkZWYgbG9hZChzZWxmLCByZXF1aXJlPVRydWUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVxdWlyZSBwYWNrYWdlcyBmb3IgdGhpcyBFbnRyeVBvaW50LCB0aGVuIHJlc29sdmUgaXQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmUgb3IgYXJncyBvciBrd2FyZ3M6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiUGFyYW1ldGVycyB0byBsb2FkIGFyZSBkZXByZWNhdGVkLiAgQ2FsbCAucmVzb2x2ZSBhbmQgIgogICAgICAgICAgICAgICAgIi5yZXF1aXJlIHNlcGFyYXRlbHkuIiwKICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MiwKICAgICAgICAgICAgKQogICAgICAgIGlmIHJlcXVpcmU6CiAgICAgICAgICAgIHNlbGYucmVxdWlyZSgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSgpCgogICAgZGVmIHJlc29sdmUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzb2x2ZSB0aGUgZW50cnkgcG9pbnQgZnJvbSBpdHMgbW9kdWxlIGFuZCBhdHRycy4KICAgICAgICAiIiIKICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKHNlbGYubW9kdWxlX25hbWUsIGZyb21saXN0PVsnX19uYW1lX18nXSwgbGV2ZWw9MCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmdW5jdG9vbHMucmVkdWNlKGdldGF0dHIsIHNlbGYuYXR0cnMsIG1vZHVsZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihzdHIoZXhjKSkKCiAgICBkZWYgcmVxdWlyZShzZWxmLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgIGlmIHNlbGYuZXh0cmFzIGFuZCBub3Qgc2VsZi5kaXN0OgogICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoIkNhbid0IHJlcXVpcmUoKSB3aXRob3V0IGEgZGlzdHJpYnV0aW9uIiwgc2VsZikKCiAgICAgICAgIyBHZXQgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhpcyBlbnRyeSBwb2ludCB3aXRoIGFsbCBpdHMgZXh0cmFzIGFuZAogICAgICAgICMgdGhlbiByZXNvbHZlIHRoZW0uIFdlIGhhdmUgdG8gcGFzcyBgZXh0cmFzYCBhbG9uZyB3aGVuIHJlc29sdmluZyBzbwogICAgICAgICMgdGhhdCB0aGUgd29ya2luZyBzZXQga25vd3Mgd2hhdCBleHRyYXMgd2Ugd2FudC4gT3RoZXJ3aXNlLCBmb3IKICAgICAgICAjIGRpc3QtaW5mbyBkaXN0cmlidXRpb25zLCB0aGUgd29ya2luZyBzZXQgd2lsbCBhc3N1bWUgdGhhdCB0aGUKICAgICAgICAjIHJlcXVpcmVtZW50cyBmb3IgdGhhdCBleHRyYSBhcmUgcHVyZWx5IG9wdGlvbmFsIGFuZCBza2lwIG92ZXIgdGhlbS4KICAgICAgICByZXFzID0gc2VsZi5kaXN0LnJlcXVpcmVzKHNlbGYuZXh0cmFzKQogICAgICAgIGl0ZW1zID0gd29ya2luZ19zZXQucmVzb2x2ZShyZXFzLCBlbnYsIGluc3RhbGxlciwgZXh0cmFzPXNlbGYuZXh0cmFzKQogICAgICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZCwgaXRlbXMpKQoKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKAogICAgICAgIHInXHMqJwogICAgICAgIHInKD9QPG5hbWU+Lis/KVxzKicKICAgICAgICByJz1ccyonCiAgICAgICAgcicoP1A8bW9kdWxlPltcdy5dKylccyonCiAgICAgICAgcicoOlxzKig/UDxhdHRyPltcdy5dKykpP1xzKicKICAgICAgICByJyg/UDxleHRyYXM+XFsuKlxdKT9ccyokJwogICAgKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlKGNscywgc3JjLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgc2luZ2xlIGVudHJ5IHBvaW50IGZyb20gc3RyaW5nIGBzcmNgCgogICAgICAgIEVudHJ5IHBvaW50IHN5bnRheCBmb2xsb3dzIHRoZSBmb3JtOjoKCiAgICAgICAgICAgIG5hbWUgPSBzb21lLm1vZHVsZTpzb21lLmF0dHIgW2V4dHJhMSwgZXh0cmEyXQoKICAgICAgICBUaGUgZW50cnkgbmFtZSBhbmQgbW9kdWxlIG5hbWUgYXJlIHJlcXVpcmVkLCBidXQgdGhlIGBgOmF0dHJzYGAgYW5kCiAgICAgICAgYGBbZXh0cmFzXWBgIHBhcnRzIGFyZSBvcHRpb25hbAogICAgICAgICIiIgogICAgICAgIG0gPSBjbHMucGF0dGVybi5tYXRjaChzcmMpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIG1zZyA9ICJFbnRyeVBvaW50IG11c3QgYmUgaW4gJ25hbWU9bW9kdWxlOmF0dHJzIFtleHRyYXNdJyBmb3JtYXQiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnLCBzcmMpCiAgICAgICAgcmVzID0gbS5ncm91cGRpY3QoKQogICAgICAgIGV4dHJhcyA9IGNscy5fcGFyc2VfZXh0cmFzKHJlc1snZXh0cmFzJ10pCiAgICAgICAgYXR0cnMgPSByZXNbJ2F0dHInXS5zcGxpdCgnLicpIGlmIHJlc1snYXR0ciddIGVsc2UgKCkKICAgICAgICByZXR1cm4gY2xzKHJlc1snbmFtZSddLCByZXNbJ21vZHVsZSddLCBhdHRycywgZXh0cmFzLCBkaXN0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9leHRyYXMoY2xzLCBleHRyYXNfc3BlYyk6CiAgICAgICAgaWYgbm90IGV4dHJhc19zcGVjOgogICAgICAgICAgICByZXR1cm4gKCkKICAgICAgICByZXEgPSBSZXF1aXJlbWVudC5wYXJzZSgneCcgKyBleHRyYXNfc3BlYykKICAgICAgICBpZiByZXEuc3BlY3M6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQogICAgICAgIHJldHVybiByZXEuZXh0cmFzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfZ3JvdXAoY2xzLCBncm91cCwgbGluZXMsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYW4gZW50cnkgcG9pbnQgZ3JvdXAiIiIKICAgICAgICBpZiBub3QgTU9EVUxFKGdyb3VwKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgdGhpcyA9IHt9CiAgICAgICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMobGluZXMpOgogICAgICAgICAgICBlcCA9IGNscy5wYXJzZShsaW5lLCBkaXN0KQogICAgICAgICAgICBpZiBlcC5uYW1lIGluIHRoaXM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZW50cnkgcG9pbnQiLCBncm91cCwgZXAubmFtZSkKICAgICAgICAgICAgdGhpc1tlcC5uYW1lXSA9IGVwCiAgICAgICAgcmV0dXJuIHRoaXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZV9tYXAoY2xzLCBkYXRhLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgbWFwIG9mIGVudHJ5IHBvaW50IGdyb3VwcyIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLml0ZW1zKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkYXRhID0gc3BsaXRfc2VjdGlvbnMoZGF0YSkKICAgICAgICBtYXBzID0ge30KICAgICAgICBmb3IgZ3JvdXAsIGxpbmVzIGluIGRhdGE6CiAgICAgICAgICAgIGlmIGdyb3VwIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3QgbGluZXM6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVudHJ5IHBvaW50cyBtdXN0IGJlIGxpc3RlZCBpbiBncm91cHMiKQogICAgICAgICAgICBncm91cCA9IGdyb3VwLnN0cmlwKCkKICAgICAgICAgICAgaWYgZ3JvdXAgaW4gbWFwczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgICAgIG1hcHNbZ3JvdXBdID0gY2xzLnBhcnNlX2dyb3VwKGdyb3VwLCBsaW5lcywgZGlzdCkKICAgICAgICByZXR1cm4gbWFwcwoKCmRlZiBfcmVtb3ZlX21kNV9mcmFnbWVudChsb2NhdGlvbik6CiAgICBpZiBub3QgbG9jYXRpb246CiAgICAgICAgcmV0dXJuICcnCiAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UobG9jYXRpb24pCiAgICBpZiBwYXJzZWRbLTFdLnN0YXJ0c3dpdGgoJ21kNT0nKToKICAgICAgICByZXR1cm4gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFyc2VkWzotMV0gKyAoJycsKSkKICAgIHJldHVybiBsb2NhdGlvbgoKCmRlZiBfdmVyc2lvbl9mcm9tX2ZpbGUobGluZXMpOgogICAgIiIiCiAgICBHaXZlbiBhbiBpdGVyYWJsZSBvZiBsaW5lcyBmcm9tIGEgTWV0YWRhdGEgZmlsZSwgcmV0dXJuCiAgICB0aGUgdmFsdWUgb2YgdGhlIFZlcnNpb24gZmllbGQsIGlmIHByZXNlbnQsIG9yIE5vbmUgb3RoZXJ3aXNlLgogICAgIiIiCiAgICBpc192ZXJzaW9uX2xpbmUgPSBsYW1iZGEgbGluZTogbGluZS5sb3dlcigpLnN0YXJ0c3dpdGgoJ3ZlcnNpb246JykKICAgIHZlcnNpb25fbGluZXMgPSBmaWx0ZXIoaXNfdmVyc2lvbl9saW5lLCBsaW5lcykKICAgIGxpbmUgPSBuZXh0KGl0ZXIodmVyc2lvbl9saW5lcyksICcnKQogICAgXywgXywgdmFsdWUgPSBsaW5lLnBhcnRpdGlvbignOicpCiAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZhbHVlLnN0cmlwKCkpIG9yIE5vbmUKCgpjbGFzcyBEaXN0cmlidXRpb24ob2JqZWN0KToKICAgICIiIldyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeSB3L21ldGFkYXRhIiIiCiAgICBQS0dfSU5GTyA9ICdQS0ctSU5GTycKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGxvY2F0aW9uPU5vbmUsIG1ldGFkYXRhPU5vbmUsIHByb2plY3RfbmFtZT1Ob25lLAogICAgICAgICAgICB2ZXJzaW9uPU5vbmUsIHB5X3ZlcnNpb249UFlfTUFKT1IsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgIHByZWNlZGVuY2U9RUdHX0RJU1QpOgogICAgICAgIHNlbGYucHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHByb2plY3RfbmFtZSBvciAnVW5rbm93bicpCiAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNhZmVfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHNlbGYucHlfdmVyc2lvbiA9IHB5X3ZlcnNpb24KICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm0KICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICBzZWxmLnByZWNlZGVuY2UgPSBwcmVjZWRlbmNlCiAgICAgICAgc2VsZi5fcHJvdmlkZXIgPSBtZXRhZGF0YSBvciBlbXB0eV9wcm92aWRlcgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fbG9jYXRpb24oY2xzLCBsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUsICoqa3cpOgogICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBbTm9uZV0gKiA0CiAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpCiAgICAgICAgaWYgZXh0Lmxvd2VyKCkgaW4gX2Rpc3RyaWJ1dGlvbkltcGw6CiAgICAgICAgICAgIGNscyA9IF9kaXN0cmlidXRpb25JbXBsW2V4dC5sb3dlcigpXQoKICAgICAgICAgICAgbWF0Y2ggPSBFR0dfTkFNRShiYXNlbmFtZSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gbWF0Y2guZ3JvdXAoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnLCAndmVyJywgJ3B5dmVyJywgJ3BsYXQnCiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGNscygKICAgICAgICAgICAgbG9jYXRpb24sIG1ldGFkYXRhLCBwcm9qZWN0X25hbWU9cHJvamVjdF9uYW1lLCB2ZXJzaW9uPXZlcnNpb24sCiAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcGxhdGZvcm09cGxhdGZvcm0sICoqa3cKICAgICAgICApLl9yZWxvYWRfdmVyc2lvbigpCgogICAgZGVmIF9yZWxvYWRfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc2hjbXAoc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5wYXJzZWRfdmVyc2lvbiwKICAgICAgICAgICAgc2VsZi5wcmVjZWRlbmNlLAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgX3JlbW92ZV9tZDVfZnJhZ21lbnQoc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbiBvciAnJywKICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybSBvciAnJywKICAgICAgICApCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuaGFzaGNtcCkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wIDwgb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPD0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPiBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA+PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgIyBJdCdzIG5vdCBhIERpc3RyaWJ1dGlvbiwgc28gdGhleSBhcmUgbm90IGVxdWFsCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPT0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgICMgVGhlc2UgcHJvcGVydGllcyBoYXZlIHRvIGJlIGxhenkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGxvYWQgYW55CiAgICAjIG1ldGFkYXRhIHVudGlsL3VubGVzcyBpdCdzIGFjdHVhbGx5IG5lZWRlZC4gIChpLmUuLCBzb21lIGRpc3RyaWJ1dGlvbnMKICAgICMgbWF5IG5vdCBrbm93IHRoZWlyIG5hbWUgb3IgdmVyc2lvbiB3aXRob3V0IGxvYWRpbmcgUEtHLUlORk8pCgogICAgQHByb3BlcnR5CiAgICBkZWYga2V5KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2tleQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fa2V5ID0ga2V5ID0gc2VsZi5wcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgIl9wYXJzZWRfdmVyc2lvbiIpOgogICAgICAgICAgICBzZWxmLl9wYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi52ZXJzaW9uKQoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VkX3ZlcnNpb24KCiAgICBkZWYgX3dhcm5fbGVnYWN5X3ZlcnNpb24oc2VsZik6CiAgICAgICAgTFYgPSBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uCiAgICAgICAgaXNfbGVnYWN5ID0gaXNpbnN0YW5jZShzZWxmLl9wYXJzZWRfdmVyc2lvbiwgTFYpCiAgICAgICAgaWYgbm90IGlzX2xlZ2FjeToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgV2hpbGUgYW4gZW1wdHkgdmVyc2lvbiBpcyB0ZWNobmljYWxseSBhIGxlZ2FjeSB2ZXJzaW9uIGFuZAogICAgICAgICMgaXMgbm90IGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uLCBpdCdzIGFsc28gdW5saWtlbHkgdG8KICAgICAgICAjIGFjdHVhbGx5IGNvbWUgZnJvbSBzb21lb25lIGFuZCBpbnN0ZWFkIGl0IGlzIG1vcmUgbGlrZWx5IHRoYXQKICAgICAgICAjIGl0IGNvbWVzIGZyb20gc2V0dXB0b29scyBhdHRlbXB0aW5nIHRvIHBhcnNlIGEgZmlsZW5hbWUgYW5kCiAgICAgICAgIyBpbmNsdWRpbmcgaXQgaW4gdGhlIGxpc3QuIFNvIGZvciB0aGF0IHdlJ2xsIGdhdGUgdGhpcyB3YXJuaW5nCiAgICAgICAgIyBvbiBpZiB0aGUgdmVyc2lvbiBpcyBhbnl0aGluZyBhdCBhbGwgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLnZlcnNpb246CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICAgICAne3Byb2plY3RfbmFtZX0gKHt2ZXJzaW9ufSknIGlzIGJlaW5nIHBhcnNlZCBhcyBhIGxlZ2FjeSwKICAgICAgICAgICAgbm9uIFBFUCA0NDAsCiAgICAgICAgICAgIHZlcnNpb24uIFlvdSBtYXkgZmluZCBvZGQgYmVoYXZpb3IgYW5kIHNvcnQgb3JkZXIuCiAgICAgICAgICAgIEluIHBhcnRpY3VsYXIgaXQgd2lsbCBiZSBzb3J0ZWQgYXMgbGVzcyB0aGFuIDAuMC4gSXQKICAgICAgICAgICAgaXMgcmVjb21tZW5kZWQgdG8gbWlncmF0ZSB0byBQRVAgNDQwIGNvbXBhdGlibGUKICAgICAgICAgICAgdmVyc2lvbnMuCiAgICAgICAgICAgICIiIikuc3RyaXAoKS5yZXBsYWNlKCdcbicsICcgJykKCiAgICAgICAgd2FybmluZ3Mud2Fybih0bXBsLmZvcm1hdCgqKnZhcnMoc2VsZikpLCBQRVA0NDBXYXJuaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgdmVyc2lvbiA9IF92ZXJzaW9uX2Zyb21fZmlsZShzZWxmLl9nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykpCiAgICAgICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIHRtcGwgPSAiTWlzc2luZyAnVmVyc2lvbjonIGhlYWRlciBhbmQvb3IgJXMgZmlsZSIKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IodG1wbCAlIHNlbGYuUEtHX0lORk8sIHNlbGYpCiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2RlcF9tYXAoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGRtID0gc2VsZi5fX2RlcF9tYXAgPSB7Tm9uZTogW119CiAgICAgICAgICAgIGZvciBuYW1lIGluICdyZXF1aXJlcy50eHQnLCAnZGVwZW5kcy50eHQnOgogICAgICAgICAgICAgICAgZm9yIGV4dHJhLCByZXFzIGluIHNwbGl0X3NlY3Rpb25zKHNlbGYuX2dldF9tZXRhZGF0YShuYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICc6JyBpbiBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLCBtYXJrZXIgPSBleHRyYS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnZhbGlkX21hcmtlcihtYXJrZXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYIHdhcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbm90IGV2YWx1YXRlX21hcmtlcihtYXJrZXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICAgICAgICAgICAgICBleHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEpIG9yIE5vbmUKICAgICAgICAgICAgICAgICAgICBkbS5zZXRkZWZhdWx0KGV4dHJhLCBbXSkuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXFzKSkKICAgICAgICAgICAgcmV0dXJuIGRtCgogICAgZGVmIHJlcXVpcmVzKHNlbGYsIGV4dHJhcz0oKSk6CiAgICAgICAgIiIiTGlzdCBvZiBSZXF1aXJlbWVudHMgbmVlZGVkIGZvciB0aGlzIGRpc3RybyBpZiBgZXh0cmFzYCBhcmUgdXNlZCIiIgogICAgICAgIGRtID0gc2VsZi5fZGVwX21hcAogICAgICAgIGRlcHMgPSBbXQogICAgICAgIGRlcHMuZXh0ZW5kKGRtLmdldChOb25lLCAoKSkpCiAgICAgICAgZm9yIGV4dCBpbiBleHRyYXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRlcHMuZXh0ZW5kKGRtW3NhZmVfZXh0cmEoZXh0KV0pCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgKICAgICAgICAgICAgICAgICAgICAiJXMgaGFzIG5vIHN1Y2ggZXh0cmEgZmVhdHVyZSAlciIgJSAoc2VsZiwgZXh0KQogICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBkZXBzCgogICAgZGVmIF9nZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBwYXRoPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBkaXN0cmlidXRpb24gaXMgaW1wb3J0YWJsZSBvbiBgcGF0aGAgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKICAgICAgICBzZWxmLmluc2VydF9vbihwYXRoLCByZXBsYWNlPXJlcGxhY2UpCiAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHNlbGYubG9jYXRpb24pCiAgICAgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBwa2cgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGtnKQoKICAgIGRlZiBlZ2dfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gd2hhdCB0aGlzIGRpc3RyaWJ1dGlvbidzIHN0YW5kYXJkIC5lZ2cgZmlsZW5hbWUgc2hvdWxkIGJlIiIiCiAgICAgICAgZmlsZW5hbWUgPSAiJXMtJXMtcHklcyIgJSAoCiAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNlbGYucHJvamVjdF9uYW1lKSwgdG9fZmlsZW5hbWUoc2VsZi52ZXJzaW9uKSwKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yIFBZX01BSk9SCiAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLnBsYXRmb3JtOgogICAgICAgICAgICBmaWxlbmFtZSArPSAnLScgKyBzZWxmLnBsYXRmb3JtCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYubG9jYXRpb246CiAgICAgICAgICAgIHJldHVybiAiJXMgKCVzKSIgJSAoc2VsZiwgc2VsZi5sb2NhdGlvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gZ2V0YXR0cihzZWxmLCAndmVyc2lvbicsIE5vbmUpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHZlcnNpb24gPSBOb25lCiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gb3IgIlt1bmtub3duIHZlcnNpb25dIgogICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCB2ZXJzaW9uKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICAiIiJEZWxlZ2F0ZSBhbGwgdW5yZWNvZ25pemVkIHB1YmxpYyBhdHRyaWJ1dGVzIHRvIC5tZXRhZGF0YSBwcm92aWRlciIiIgogICAgICAgIGlmIGF0dHIuc3RhcnRzd2l0aCgnXycpOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhdHRyKQogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX3Byb3ZpZGVyLCBhdHRyKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZmlsZW5hbWUoY2xzLCBmaWxlbmFtZSwgbWV0YWRhdGE9Tm9uZSwgKiprdyk6CiAgICAgICAgcmV0dXJuIGNscy5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YSwKICAgICAgICAgICAgKiprdwogICAgICAgICkKCiAgICBkZWYgYXNfcmVxdWlyZW1lbnQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgYGBSZXF1aXJlbWVudGBgIHRoYXQgbWF0Y2hlcyB0aGlzIGRpc3RyaWJ1dGlvbiBleGFjdGx5IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnBhcnNlZF92ZXJzaW9uLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKToKICAgICAgICAgICAgc3BlYyA9ICIlcz09JXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnBhcnNlZF92ZXJzaW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNwZWMgPSAiJXM9PT0lcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYucGFyc2VkX3ZlcnNpb24pCgogICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQoKICAgIGRlZiBsb2FkX2VudHJ5X3BvaW50KHNlbGYsIGdyb3VwLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCiAgICAgICAgZXAgPSBzZWxmLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQogICAgICAgIGlmIGVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJFbnRyeSBwb2ludCAlciBub3QgZm91bmQiICUgKChncm91cCwgbmFtZSksKSkKICAgICAgICByZXR1cm4gZXAubG9hZCgpCgogICAgZGVmIGdldF9lbnRyeV9tYXAoc2VsZiwgZ3JvdXA9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAgPSBFbnRyeVBvaW50LnBhcnNlX21hcCgKICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tZXRhZGF0YSgnZW50cnlfcG9pbnRzLnR4dCcpLCBzZWxmCiAgICAgICAgICAgICkKICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGVwX21hcC5nZXQoZ3JvdXAsIHt9KQogICAgICAgIHJldHVybiBlcF9tYXAKCiAgICBkZWYgZ2V0X2VudHJ5X2luZm8oc2VsZiwgZ3JvdXAsIG5hbWUpOgogICAgICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgICAgIHJldHVybiBzZWxmLmdldF9lbnRyeV9tYXAoZ3JvdXApLmdldChuYW1lKQoKICAgIGRlZiBpbnNlcnRfb24oc2VsZiwgcGF0aCwgbG9jPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBzZWxmLmxvY2F0aW9uIGlzIG9uIHBhdGgKCiAgICAgICAgSWYgcmVwbGFjZT1GYWxzZSAoZGVmYXVsdCk6CiAgICAgICAgICAgIC0gSWYgbG9jYXRpb24gaXMgYWxyZWFkeSBpbiBwYXRoIGFueXdoZXJlLCBkbyBub3RoaW5nLgogICAgICAgICAgICAtIEVsc2U6CiAgICAgICAgICAgICAgLSBJZiBpdCdzIGFuIGVnZyBhbmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgb24gcGF0aCwKICAgICAgICAgICAgICAgIGluc2VydCBqdXN0IGFoZWFkIG9mIHRoZSBwYXJlbnQuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgdG8gdGhlIGVuZCBvZiBwYXRoLgogICAgICAgIElmIHJlcGxhY2U9VHJ1ZToKICAgICAgICAgICAgLSBJZiBsb2NhdGlvbiBpcyBhbHJlYWR5IG9uIHBhdGggYW55d2hlcmUgKG5vdCBlZ2dzKQogICAgICAgICAgICAgIG9yIGhpZ2hlciBwcmlvcml0eSB0aGFuIGl0cyBwYXJlbnQgKGVnZ3MpCiAgICAgICAgICAgICAgZG8gbm90aGluZy4KICAgICAgICAgICAgLSBFbHNlOgogICAgICAgICAgICAgIC0gSWYgaXQncyBhbiBlZ2cgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG9uIHBhdGgsCiAgICAgICAgICAgICAgICBpbnNlcnQganVzdCBhaGVhZCBvZiB0aGUgcGFyZW50LAogICAgICAgICAgICAgICAgcmVtb3ZpbmcgYW55IGxvd2VyLXByaW9yaXR5IGVudHJpZXMuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgaXQgdG8gdGhlIGZyb250IG9mIHBhdGguCiAgICAgICAgIiIiCgogICAgICAgIGxvYyA9IGxvYyBvciBzZWxmLmxvY2F0aW9uCiAgICAgICAgaWYgbm90IGxvYzoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG5sb2MgPSBfbm9ybWFsaXplX2NhY2hlZChsb2MpCiAgICAgICAgYmRpciA9IG9zLnBhdGguZGlybmFtZShubG9jKQogICAgICAgIG5wYXRoID0gWyhwIGFuZCBfbm9ybWFsaXplX2NhY2hlZChwKSBvciBwKSBmb3IgcCBpbiBwYXRoXQoKICAgICAgICBmb3IgcCwgaXRlbSBpbiBlbnVtZXJhdGUobnBhdGgpOgogICAgICAgICAgICBpZiBpdGVtID09IG5sb2M6CiAgICAgICAgICAgICAgICBpZiByZXBsYWNlOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbW9kaWZ5IHBhdGggKGV2ZW4gcmVtb3ZpbmcgZHVwbGljYXRlcykgaWYKICAgICAgICAgICAgICAgICAgICAjIGZvdW5kIGFuZCBub3QgcmVwbGFjZQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbGlmIGl0ZW0gPT0gYmRpciBhbmQgc2VsZi5wcmVjZWRlbmNlID09IEVHR19ESVNUOgogICAgICAgICAgICAgICAgIyBpZiBpdCdzIGFuIC5lZ2csIGdpdmUgaXQgcHJlY2VkZW5jZSBvdmVyIGl0cyBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICMgVU5MRVNTIGl0J3MgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHN5cy5wYXRoIGFuZCByZXBsYWNlPUZhbHNlCiAgICAgICAgICAgICAgICBpZiAobm90IHJlcGxhY2UpIGFuZCBubG9jIGluIG5wYXRoW3A6XToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KHAsIGxvYykKICAgICAgICAgICAgICAgIG5wYXRoLmluc2VydChwLCBubG9jKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKICAgICAgICAgICAgaWYgcmVwbGFjZToKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KDAsIGxvYykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKGxvYykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgcCBpcyB0aGUgc3BvdCB3aGVyZSB3ZSBmb3VuZCBvciBpbnNlcnRlZCBsb2M7IG5vdyByZW1vdmUgZHVwbGljYXRlcwogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5wID0gbnBhdGguaW5kZXgobmxvYywgcCArIDEpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRlbCBucGF0aFtucF0sIHBhdGhbbnBdCiAgICAgICAgICAgICAgICAjIGhhIQogICAgICAgICAgICAgICAgcCA9IG5wCgogICAgICAgIHJldHVybgoKICAgIGRlZiBjaGVja192ZXJzaW9uX2NvbmZsaWN0KHNlbGYpOgogICAgICAgIGlmIHNlbGYua2V5ID09ICdzZXR1cHRvb2xzJzoKICAgICAgICAgICAgIyBpZ25vcmUgdGhlIGluZXZpdGFibGUgc2V0dXB0b29scyBzZWxmLWNvbmZsaWN0cyAgOigKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG5zcCA9IGRpY3QuZnJvbWtleXMoc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0JykpCiAgICAgICAgbG9jID0gbm9ybWFsaXplX3BhdGgoc2VsZi5sb2NhdGlvbikKICAgICAgICBmb3IgbW9kbmFtZSBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ3RvcF9sZXZlbC50eHQnKToKICAgICAgICAgICAgaWYgKG1vZG5hbWUgbm90IGluIHN5cy5tb2R1bGVzIG9yIG1vZG5hbWUgaW4gbnNwCiAgICAgICAgICAgICAgICAgICAgb3IgbW9kbmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG1vZG5hbWUgaW4gKCdwa2dfcmVzb3VyY2VzJywgJ3NldHVwdG9vbHMnLCAnc2l0ZScpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZm4gPSBnZXRhdHRyKHN5cy5tb2R1bGVzW21vZG5hbWVdLCAnX19maWxlX18nLCBOb25lKQogICAgICAgICAgICBpZiBmbiBhbmQgKG5vcm1hbGl6ZV9wYXRoKGZuKS5zdGFydHN3aXRoKGxvYykgb3IKICAgICAgICAgICAgICAgICAgICAgICBmbi5zdGFydHN3aXRoKHNlbGYubG9jYXRpb24pKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoCiAgICAgICAgICAgICAgICAiTW9kdWxlICVzIHdhcyBhbHJlYWR5IGltcG9ydGVkIGZyb20gJXMsIGJ1dCAlcyBpcyBiZWluZyBhZGRlZCIKICAgICAgICAgICAgICAgICIgdG8gc3lzLnBhdGgiICUgKG1vZG5hbWUsIGZuLCBzZWxmLmxvY2F0aW9uKSwKICAgICAgICAgICAgKQoKICAgIGRlZiBoYXNfdmVyc2lvbihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYudmVyc2lvbgogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBpc3N1ZV93YXJuaW5nKCJVbmJ1aWx0IGVnZyBmb3IgIiArIHJlcHIoc2VsZikpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNsb25lKHNlbGYsICoqa3cpOgogICAgICAgICIiIkNvcHkgdGhpcyBkaXN0cmlidXRpb24sIHN1YnN0aXR1dGluZyBpbiBhbnkgY2hhbmdlZCBrZXl3b3JkIGFyZ3MiIiIKICAgICAgICBuYW1lcyA9ICdwcm9qZWN0X25hbWUgdmVyc2lvbiBweV92ZXJzaW9uIHBsYXRmb3JtIGxvY2F0aW9uIHByZWNlZGVuY2UnCiAgICAgICAgZm9yIGF0dHIgaW4gbmFtZXMuc3BsaXQoKToKICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChhdHRyLCBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ21ldGFkYXRhJywgc2VsZi5fcHJvdmlkZXIpCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCoqa3cpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXh0cmFzKHNlbGYpOgogICAgICAgIHJldHVybiBbZGVwIGZvciBkZXAgaW4gc2VsZi5fZGVwX21hcCBpZiBkZXBdCgoKY2xhc3MgRWdnSW5mb0Rpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgZGVmIF9yZWxvYWRfdmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQYWNrYWdlcyBpbnN0YWxsZWQgYnkgZGlzdHV0aWxzIChlLmcuIG51bXB5IG9yIHNjaXB5KSwKICAgICAgICB3aGljaCB1c2VzIGFuIG9sZCBzYWZlX3ZlcnNpb24sIGFuZCBzbwogICAgICAgIHRoZWlyIHZlcnNpb24gbnVtYmVycyBjYW4gZ2V0IG1hbmdsZWQgd2hlbgogICAgICAgIGNvbnZlcnRlZCB0byBmaWxlbmFtZXMgKGUuZy4sIDEuMTEuMC5kZXYwKzIzMjllYWUgdG8KICAgICAgICAxLjExLjAuZGV2MF8yMzI5ZWFlKS4gVGhlc2UgZGlzdHJpYnV0aW9ucyB3aWxsIG5vdCBiZQogICAgICAgIHBhcnNlZCBwcm9wZXJseQogICAgICAgIGRvd25zdHJlYW0gYnkgRGlzdHJpYnV0aW9uIGFuZCBzYWZlX3ZlcnNpb24sIHNvCiAgICAgICAgdGFrZSBhbiBleHRyYSBzdGVwIGFuZCB0cnkgdG8gZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tCiAgICAgICAgdGhlIG1ldGFkYXRhIGZpbGUgaXRzZWxmIGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lLgogICAgICAgICIiIgogICAgICAgIG1kX3ZlcnNpb24gPSBfdmVyc2lvbl9mcm9tX2ZpbGUoc2VsZi5fZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pKQogICAgICAgIGlmIG1kX3ZlcnNpb246CiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24gPSBtZF92ZXJzaW9uCiAgICAgICAgcmV0dXJuIHNlbGYKCgpjbGFzcyBEaXN0SW5mb0Rpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgIiIiCiAgICBXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkKICAgIHcvbWV0YWRhdGEsIC5kaXN0LWluZm8gc3R5bGUuCiAgICAiIiIKICAgIFBLR19JTkZPID0gJ01FVEFEQVRBJwogICAgRVFFUSA9IHJlLmNvbXBpbGUociIoW1woLF0pXHMqKFxkLio/KVxzKihbLFwpXSkiKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9wYXJzZWRfcGtnX2luZm8oc2VsZik6CiAgICAgICAgIiIiUGFyc2UgYW5kIGNhY2hlIG1ldGFkYXRhIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGtnX2luZm8KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIG1ldGFkYXRhID0gc2VsZi5nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykKICAgICAgICAgICAgc2VsZi5fcGtnX2luZm8gPSBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2VzdHIobWV0YWRhdGEpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wa2dfaW5mbwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9kZXBfbWFwKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9fZGVwX21hcCA9IHNlbGYuX2NvbXB1dGVfZGVwZW5kZW5jaWVzKCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCgogICAgZGVmIF9jb21wdXRlX2RlcGVuZGVuY2llcyhzZWxmKToKICAgICAgICAiIiJSZWNvbXB1dGUgdGhpcyBkaXN0cmlidXRpb24ncyBkZXBlbmRlbmNpZXMuIiIiCiAgICAgICAgZG0gPSBzZWxmLl9fZGVwX21hcCA9IHtOb25lOiBbXX0KCiAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgIyBJbmNsdWRpbmcgYW55IGNvbmRpdGlvbiBleHByZXNzaW9ucwogICAgICAgIGZvciByZXEgaW4gc2VsZi5fcGFyc2VkX3BrZ19pbmZvLmdldF9hbGwoJ1JlcXVpcmVzLURpc3QnKSBvciBbXToKICAgICAgICAgICAgcmVxcy5leHRlbmQocGFyc2VfcmVxdWlyZW1lbnRzKHJlcSkpCgogICAgICAgIGRlZiByZXFzX2Zvcl9leHRyYShleHRyYSk6CiAgICAgICAgICAgIGZvciByZXEgaW4gcmVxczoKICAgICAgICAgICAgICAgIGlmIG5vdCByZXEubWFya2VyIG9yIHJlcS5tYXJrZXIuZXZhbHVhdGUoeydleHRyYSc6IGV4dHJhfSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVxCgogICAgICAgIGNvbW1vbiA9IGZyb3plbnNldChyZXFzX2Zvcl9leHRyYShOb25lKSkKICAgICAgICBkbVtOb25lXS5leHRlbmQoY29tbW9uKQoKICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5fcGFyc2VkX3BrZ19pbmZvLmdldF9hbGwoJ1Byb3ZpZGVzLUV4dHJhJykgb3IgW106CiAgICAgICAgICAgIHNfZXh0cmEgPSBzYWZlX2V4dHJhKGV4dHJhLnN0cmlwKCkpCiAgICAgICAgICAgIGRtW3NfZXh0cmFdID0gbGlzdChmcm96ZW5zZXQocmVxc19mb3JfZXh0cmEoZXh0cmEpKSAtIGNvbW1vbikKCiAgICAgICAgcmV0dXJuIGRtCgoKX2Rpc3RyaWJ1dGlvbkltcGwgPSB7CiAgICAnLmVnZyc6IERpc3RyaWJ1dGlvbiwKICAgICcuZWdnLWluZm8nOiBFZ2dJbmZvRGlzdHJpYnV0aW9uLAogICAgJy5kaXN0LWluZm8nOiBEaXN0SW5mb0Rpc3RyaWJ1dGlvbiwKfQoKCmRlZiBpc3N1ZV93YXJuaW5nKCphcmdzLCAqKmt3KToKICAgIGxldmVsID0gMQogICAgZyA9IGdsb2JhbHMoKQogICAgdHJ5OgogICAgICAgICMgZmluZCB0aGUgZmlyc3Qgc3RhY2sgZnJhbWUgdGhhdCBpcyAqbm90KiBjb2RlIGluCiAgICAgICAgIyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUsIHRvIHVzZSBmb3IgdGhlIHdhcm5pbmcKICAgICAgICB3aGlsZSBzeXMuX2dldGZyYW1lKGxldmVsKS5mX2dsb2JhbHMgaXMgZzoKICAgICAgICAgICAgbGV2ZWwgKz0gMQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgd2FybmluZ3Mud2FybihzdGFja2xldmVsPWxldmVsICsgMSwgKmFyZ3MsICoqa3cpCgoKY2xhc3MgUmVxdWlyZW1lbnRQYXJzZUVycm9yKFZhbHVlRXJyb3IpOgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICcgJy5qb2luKHNlbGYuYXJncykKCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnRzKHN0cnMpOgogICAgIiIiWWllbGQgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMgZm9yIGVhY2ggc3BlY2lmaWNhdGlvbiBpbiBgc3Ryc2AKCiAgICBgc3Ryc2AgbXVzdCBiZSBhIHN0cmluZywgb3IgYSAocG9zc2libHktbmVzdGVkKSBpdGVyYWJsZSB0aGVyZW9mLgogICAgIiIiCiAgICAjIGNyZWF0ZSBhIHN0ZXBwYWJsZSBpdGVyYXRvciwgc28gd2UgY2FuIGhhbmRsZSBcLWNvbnRpbnVhdGlvbnMKICAgIGxpbmVzID0gaXRlcih5aWVsZF9saW5lcyhzdHJzKSkKCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAjIERyb3AgY29tbWVudHMgLS0gYSBoYXNoIHdpdGhvdXQgYSBzcGFjZSBtYXkgYmUgaW4gYSBVUkwuCiAgICAgICAgaWYgJyAjJyBpbiBsaW5lOgogICAgICAgICAgICBsaW5lID0gbGluZVs6bGluZS5maW5kKCcgIycpXQogICAgICAgICMgSWYgdGhlcmUgaXMgYSBsaW5lIGNvbnRpbnVhdGlvbiwgZHJvcCBpdCwgYW5kIGFwcGVuZCB0aGUgbmV4dCBsaW5lLgogICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoJ1xcJyk6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0uc3RyaXAoKQogICAgICAgICAgICBsaW5lICs9IG5leHQobGluZXMpCiAgICAgICAgeWllbGQgUmVxdWlyZW1lbnQobGluZSkKCgpjbGFzcyBSZXF1aXJlbWVudChwYWNrYWdpbmcucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgICIiIkRPIE5PVCBDQUxMIFRISVMgVU5ET0NVTUVOVEVEIE1FVEhPRDsgdXNlIFJlcXVpcmVtZW50LnBhcnNlKCkhIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdXBlcihSZXF1aXJlbWVudCwgc2VsZikuX19pbml0X18ocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBwYWNrYWdpbmcucmVxdWlyZW1lbnRzLkludmFsaWRSZXF1aXJlbWVudCBhcyBlOgogICAgICAgICAgICByYWlzZSBSZXF1aXJlbWVudFBhcnNlRXJyb3Ioc3RyKGUpKQogICAgICAgIHNlbGYudW5zYWZlX25hbWUgPSBzZWxmLm5hbWUKICAgICAgICBwcm9qZWN0X25hbWUgPSBzYWZlX25hbWUoc2VsZi5uYW1lKQogICAgICAgIHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLmtleSA9IHByb2plY3RfbmFtZSwgcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICBzZWxmLnNwZWNzID0gWwogICAgICAgICAgICAoc3BlYy5vcGVyYXRvciwgc3BlYy52ZXJzaW9uKSBmb3Igc3BlYyBpbiBzZWxmLnNwZWNpZmllcl0KICAgICAgICBzZWxmLmV4dHJhcyA9IHR1cGxlKG1hcChzYWZlX2V4dHJhLCBzZWxmLmV4dHJhcykpCiAgICAgICAgc2VsZi5oYXNoQ21wID0gKAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgc2VsZi5zcGVjaWZpZXIsCiAgICAgICAgICAgIGZyb3plbnNldChzZWxmLmV4dHJhcyksCiAgICAgICAgICAgIHN0cihzZWxmLm1hcmtlcikgaWYgc2VsZi5tYXJrZXIgZWxzZSBOb25lLAogICAgICAgICkKICAgICAgICBzZWxmLl9faGFzaCA9IGhhc2goc2VsZi5oYXNoQ21wKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGlzaW5zdGFuY2Uob3RoZXIsIFJlcXVpcmVtZW50KSBhbmQKICAgICAgICAgICAgc2VsZi5oYXNoQ21wID09IG90aGVyLmhhc2hDbXAKICAgICAgICApCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIGlmIGl0ZW0ua2V5ICE9IHNlbGYua2V5OgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBpdGVtID0gaXRlbS52ZXJzaW9uCgogICAgICAgICMgQWxsb3cgcHJlcmVsZWFzZXMgYWx3YXlzIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBwcmV2aW91cyBiZWhhdmlvciBvZgogICAgICAgICMgdGhpcyBtZXRob2QuIEluIHRoZSBmdXR1cmUgdGhpcyBzaG91bGQgYmUgc21hcnRlciBhbmQgZm9sbG93IFBFUCA0NDAKICAgICAgICAjIG1vcmUgYWNjdXJhdGVseS4KICAgICAgICByZXR1cm4gc2VsZi5zcGVjaWZpZXIuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9VHJ1ZSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNoCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiUmVxdWlyZW1lbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBwYXJzZShzKToKICAgICAgICByZXEsID0gcGFyc2VfcmVxdWlyZW1lbnRzKHMpCiAgICAgICAgcmV0dXJuIHJlcQoKCmRlZiBfYWx3YXlzX29iamVjdChjbGFzc2VzKToKICAgICIiIgogICAgRW5zdXJlIG9iamVjdCBhcHBlYXJzIGluIHRoZSBtcm8gZXZlbgogICAgZm9yIG9sZC1zdHlsZSBjbGFzc2VzLgogICAgIiIiCiAgICBpZiBvYmplY3Qgbm90IGluIGNsYXNzZXM6CiAgICAgICAgcmV0dXJuIGNsYXNzZXMgKyAob2JqZWN0LCkKICAgIHJldHVybiBjbGFzc2VzCgoKZGVmIF9maW5kX2FkYXB0ZXIocmVnaXN0cnksIG9iKToKICAgICIiIlJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIGBvYmAgZnJvbSBgcmVnaXN0cnlgIiIiCiAgICB0eXBlcyA9IF9hbHdheXNfb2JqZWN0KGluc3BlY3QuZ2V0bXJvKGdldGF0dHIob2IsICdfX2NsYXNzX18nLCB0eXBlKG9iKSkpKQogICAgZm9yIHQgaW4gdHlwZXM6CiAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5W3RdCgoKZGVmIGVuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBgcGF0aGAgZXhpc3RzIiIiCiAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICBweTMxY29tcGF0Lm1ha2VkaXJzKGRpcm5hbWUsIGV4aXN0X29rPVRydWUpCgoKZGVmIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIlNhbmRib3gtYnlwYXNzaW5nIHZlcnNpb24gb2YgZW5zdXJlX2RpcmVjdG9yeSgpIiIiCiAgICBpZiBub3QgV1JJVEVfU1VQUE9SVDoKICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MubWtkaXIiIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4nKQogICAgZGlybmFtZSwgZmlsZW5hbWUgPSBzcGxpdChwYXRoKQogICAgaWYgZGlybmFtZSBhbmQgZmlsZW5hbWUgYW5kIG5vdCBpc2RpcihkaXJuYW1lKToKICAgICAgICBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkoZGlybmFtZSkKICAgICAgICBta2RpcihkaXJuYW1lLCAwbzc1NSkKCgpkZWYgc3BsaXRfc2VjdGlvbnMocyk6CiAgICAiIiJTcGxpdCBhIHN0cmluZyBvciBpdGVyYWJsZSB0aGVyZW9mIGludG8gKHNlY3Rpb24sIGNvbnRlbnQpIHBhaXJzCgogICAgRWFjaCBgYHNlY3Rpb25gYCBpcyBhIHN0cmlwcGVkIHZlcnNpb24gb2YgdGhlIHNlY3Rpb24gaGVhZGVyICgiW3NlY3Rpb25dIikKICAgIGFuZCBlYWNoIGBgY29udGVudGBgIGlzIGEgbGlzdCBvZiBzdHJpcHBlZCBsaW5lcyBleGNsdWRpbmcgYmxhbmsgbGluZXMgYW5kCiAgICBjb21tZW50LW9ubHkgbGluZXMuICBJZiB0aGVyZSBhcmUgYW55IHN1Y2ggbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBzZWN0aW9uCiAgICBoZWFkZXIsIHRoZXkncmUgcmV0dXJuZWQgaW4gYSBmaXJzdCBgYHNlY3Rpb25gYCBvZiBgYE5vbmVgYC4KICAgICIiIgogICAgc2VjdGlvbiA9IE5vbmUKICAgIGNvbnRlbnQgPSBbXQogICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMocyk6CiAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbIik6CiAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIl0iKToKICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gb3IgY29udGVudDoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CiAgICAgICAgICAgICAgICBzZWN0aW9uID0gbGluZVsxOi0xXS5zdHJpcCgpCiAgICAgICAgICAgICAgICBjb250ZW50ID0gW10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgc2VjdGlvbiBoZWFkaW5nIiwgbGluZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lKQoKICAgICMgd3JhcCB1cCBsYXN0IHNlZ21lbnQKICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKCgpkZWYgX21rc3RlbXAoKmFyZ3MsICoqa3cpOgogICAgb2xkX29wZW4gPSBvcy5vcGVuCiAgICB0cnk6CiAgICAgICAgIyB0ZW1wb3JhcmlseSBieXBhc3Mgc2FuZGJveGluZwogICAgICAgIG9zLm9wZW4gPSBvc19vcGVuCiAgICAgICAgcmV0dXJuIHRlbXBmaWxlLm1rc3RlbXAoKmFyZ3MsICoqa3cpCiAgICBmaW5hbGx5OgogICAgICAgICMgYW5kIHRoZW4gcHV0IGl0IGJhY2sKICAgICAgICBvcy5vcGVuID0gb2xkX29wZW4KCgojIFNpbGVuY2UgdGhlIFBFUDQ0MFdhcm5pbmcgYnkgZGVmYXVsdCwgc28gdGhhdCBlbmQgdXNlcnMgZG9uJ3QgZ2V0IGhpdCBieSBpdAojIHJhbmRvbWx5IGp1c3QgYmVjYXVzZSB0aGV5IHVzZSBwa2dfcmVzb3VyY2VzLiBXZSB3YW50IHRvIGFwcGVuZCB0aGUgcnVsZQojIGJlY2F1c2Ugd2Ugd2FudCBlYXJsaWVyIHVzZXMgb2YgZmlsdGVyd2FybmluZ3MgdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhpcwojIG9uZS4Kd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PVBFUDQ0MFdhcm5pbmcsIGFwcGVuZD1UcnVlKQoKCiMgZnJvbSBqYXJhY28uZnVuY3Rvb2xzIDEuMwpkZWYgX2NhbGxfYXNpZGUoZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIGYoKmFyZ3MsICoqa3dhcmdzKQogICAgcmV0dXJuIGYKCgpAX2NhbGxfYXNpZGUKZGVmIF9pbml0aWFsaXplKGc9Z2xvYmFscygpKToKICAgICJTZXQgdXAgZ2xvYmFsIHJlc291cmNlIG1hbmFnZXIgKGRlbGliZXJhdGVseSBub3Qgc3RhdGUtc2F2ZWQpIgogICAgbWFuYWdlciA9IFJlc291cmNlTWFuYWdlcigpCiAgICBnWydfbWFuYWdlciddID0gbWFuYWdlcgogICAgZy51cGRhdGUoCiAgICAgICAgKG5hbWUsIGdldGF0dHIobWFuYWdlciwgbmFtZSkpCiAgICAgICAgZm9yIG5hbWUgaW4gZGlyKG1hbmFnZXIpCiAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpCiAgICApCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZV9tYXN0ZXJfd29ya2luZ19zZXQoKToKICAgICIiIgogICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0IGFuZCBtYWtlIHRoZSBgYHJlcXVpcmUoKWBgCiAgICBBUEkgYXZhaWxhYmxlLgoKICAgIFRoaXMgZnVuY3Rpb24gaGFzIGV4cGxpY2l0IGVmZmVjdHMgb24gdGhlIGdsb2JhbCBzdGF0ZQogICAgb2YgcGtnX3Jlc291cmNlcy4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBvbmNlIGF0CiAgICB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBtb2R1bGUuCgogICAgSW52b2NhdGlvbiBieSBvdGhlciBwYWNrYWdlcyBpcyB1bnN1cHBvcnRlZCBhbmQgZG9uZQogICAgYXQgdGhlaXIgb3duIHJpc2suCiAgICAiIiIKICAgIHdvcmtpbmdfc2V0ID0gV29ya2luZ1NldC5fYnVpbGRfbWFzdGVyKCkKICAgIF9kZWNsYXJlX3N0YXRlKCdvYmplY3QnLCB3b3JraW5nX3NldD13b3JraW5nX3NldCkKCiAgICByZXF1aXJlID0gd29ya2luZ19zZXQucmVxdWlyZQogICAgaXRlcl9lbnRyeV9wb2ludHMgPSB3b3JraW5nX3NldC5pdGVyX2VudHJ5X3BvaW50cwogICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIgPSB3b3JraW5nX3NldC5zdWJzY3JpYmUKICAgIHJ1bl9zY3JpcHQgPSB3b3JraW5nX3NldC5ydW5fc2NyaXB0CiAgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgIHJ1bl9tYWluID0gcnVuX3NjcmlwdAogICAgIyBBY3RpdmF0ZSBhbGwgZGlzdHJpYnV0aW9ucyBhbHJlYWR5IG9uIHN5cy5wYXRoIHdpdGggcmVwbGFjZT1GYWxzZSBhbmQKICAgICMgZW5zdXJlIHRoYXQgYWxsIGRpc3RyaWJ1dGlvbnMgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGluIHRoZSBmdXR1cmUKICAgICMgKGUuZy4gYnkgY2FsbGluZyBgYHJlcXVpcmUoKWBgKSB3aWxsIGdldCBhY3RpdmF0ZWQgYXMgd2VsbCwKICAgICMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgKHJlcGxhY2U9VHJ1ZSkuCiAgICB0dXBsZSgKICAgICAgICBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9RmFsc2UpCiAgICAgICAgZm9yIGRpc3QgaW4gd29ya2luZ19zZXQKICAgICkKICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyKAogICAgICAgIGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9VHJ1ZSksCiAgICAgICAgZXhpc3Rpbmc9RmFsc2UsCiAgICApCiAgICB3b3JraW5nX3NldC5lbnRyaWVzID0gW10KICAgICMgbWF0Y2ggb3JkZXIKICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZF9lbnRyeSwgc3lzLnBhdGgpKQogICAgZ2xvYmFscygpLnVwZGF0ZShsb2NhbHMoKSkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAQ6uwJmZXAABmVwAARQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvYXBwZGlycy5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEFjdGl2ZVN0YXRlIFNvZnR3YXJlIEluYy4KIyBDb3B5cmlnaHQgKGMpIDIwMTMgRWRkeSBQZXRyaciZb3IKCiIiIlV0aWxpdGllcyBmb3IgZGV0ZXJtaW5pbmcgYXBwbGljYXRpb24tc3BlY2lmaWMgZGlycy4KClNlZSA8aHR0cDovL2dpdGh1Yi5jb20vQWN0aXZlU3RhdGUvYXBwZGlycz4gZm9yIGRldGFpbHMgYW5kIHVzYWdlLgoiIiIKIyBEZXYgTm90ZXM6CiMgLSBNU0ROIG9uIHdoZXJlIHRvIHN0b3JlIGFwcCBkYXRhIGZpbGVzOgojICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9kZWZhdWx0LmFzcHg/c2NpZD1rYjtlbi11czszMTAyOTQjWFNMVEgzMTk0MTIxMTIzMTIwMTIxMTIwMTIwCiMgLSBNYWMgT1MgWDogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9NYWNPU1gvQ29uY2VwdHVhbC9CUEZpbGVTeXN0ZW0vaW5kZXguaHRtbAojIC0gWERHIHNwZWMgZm9yIFVuKng6IGh0dHA6Ly9zdGFuZGFyZHMuZnJlZWRlc2t0b3Aub3JnL2Jhc2VkaXItc3BlYy9iYXNlZGlyLXNwZWMtbGF0ZXN0Lmh0bWwKCl9fdmVyc2lvbl9pbmZvX18gPSAoMSwgNCwgMCkKX192ZXJzaW9uX18gPSAnLicuam9pbihtYXAoc3RyLCBfX3ZlcnNpb25faW5mb19fKSkKCgppbXBvcnQgc3lzCmltcG9ydCBvcwoKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgppZiBQWTM6CiAgICB1bmljb2RlID0gc3RyCgppZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgaW1wb3J0IHBsYXRmb3JtCiAgICBvc19uYW1lID0gcGxhdGZvcm0uamF2YV92ZXIoKVszXVswXQogICAgaWYgb3NfbmFtZS5zdGFydHN3aXRoKCdXaW5kb3dzJyk6ICMgIldpbmRvd3MgWFAiLCAiV2luZG93cyA3IiwgZXRjLgogICAgICAgIHN5c3RlbSA9ICd3aW4zMicKICAgIGVsaWYgb3NfbmFtZS5zdGFydHN3aXRoKCdNYWMnKTogIyAiTWFjIE9TIFgiLCBldGMuCiAgICAgICAgc3lzdGVtID0gJ2RhcndpbicKICAgIGVsc2U6ICMgIkxpbnV4IiwgIlN1bk9TIiwgIkZyZWVCU0QiLCBldGMuCiAgICAgICAgIyBTZXR0aW5nIHRoaXMgdG8gImxpbnV4MiIgaXMgbm90IGlkZWFsLCBidXQgb25seSBXaW5kb3dzIG9yIE1hYwogICAgICAgICMgYXJlIGFjdHVhbGx5IGNoZWNrZWQgZm9yIGFuZCB0aGUgcmVzdCBvZiB0aGUgbW9kdWxlIGV4cGVjdHMKICAgICAgICAjICpzeXMucGxhdGZvcm0qIHN0eWxlIHN0cmluZ3MuCiAgICAgICAgc3lzdGVtID0gJ2xpbnV4MicKZWxzZToKICAgIHN5c3RlbSA9IHN5cy5wbGF0Zm9ybQoKCgpkZWYgdXNlcl9kYXRhX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgICAgICAgICAgICAgIH4vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiAgICAjIG9yIGluICRYREdfREFUQV9IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQIChub3Qgcm9hbWluZyk6ICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIFhQIChyb2FtaW5nKTogICAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChub3Qgcm9hbWluZyk6ICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAocm9hbWluZyk6ICAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxSb2FtaW5nXDxBcHBBdXRob3I+XDxBcHBOYW1lPgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfREFUQV9IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBjb25zdCA9IHJvYW1pbmcgYW5kICJDU0lETF9BUFBEQVRBIiBvciAiQ1NJRExfTE9DQUxfQVBQREFUQSIKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoY29uc3QpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LycpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfREFUQV9IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5sb2NhbC9zaGFyZSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgc2l0ZV9kYXRhX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG11bHRpcGF0aD1GYWxzZSk6CiAgICAiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNoYXJlZCBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAibXVsdGlwYXRoIiBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb25seSBhcHBsaWNhYmxlIHRvICpuaXgKICAgICAgICAgICAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSBsaXN0IG9mIGRhdGEgZGlycyBzaG91bGQgYmUKICAgICAgICAgICAgcmV0dXJuZWQuIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBpdGVtIGZyb20gWERHX0RBVEFfRElSUyBpcwogICAgICAgICAgICByZXR1cm5lZCwgb3IgJy91c3IvbG9jYWwvc2hhcmUvPEFwcE5hbWU+JywKICAgICAgICAgICAgaWYgWERHX0RBVEFfRElSUyBpcyBub3Qgc2V0CgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgIC9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgL3Vzci9sb2NhbC9zaGFyZS88QXBwTmFtZT4gb3IgL3Vzci9zaGFyZS88QXBwTmFtZT4KICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXEFsbCBVc2Vyc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeSBvbiBWaXN0YS4pCiAgICAgICAgV2luIDc6ICAgICAgQzpcUHJvZ3JhbURhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+ICAgIyBIaWRkZW4sIGJ1dCB3cml0ZWFibGUgb24gV2luIDcuCgogICAgRm9yIFVuaXgsIHRoaXMgaXMgdXNpbmcgdGhlICRYREdfREFUQV9ESVJTWzBdIGRlZmF1bHQuCgogICAgV0FSTklORzogRG8gbm90IHVzZSB0aGlzIG9uIFdpbmRvd3MuIFNlZSB0aGUgVmlzdGEtRmFpbCBub3RlIGFib3ZlIGZvciB3aHkuCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9DT01NT05fQVBQREFUQSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJy9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQnKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgIyBYREcgZGVmYXVsdCBmb3IgJFhER19EQVRBX0RJUlMKICAgICAgICAjIG9ubHkgZmlyc3QsIGlmIG11bHRpcGF0aCBpcyBGYWxzZQogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19EQVRBX0RJUlMnLAogICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aHNlcC5qb2luKFsnL3Vzci9sb2NhbC9zaGFyZScsICcvdXNyL3NoYXJlJ10pKQogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguZXhwYW5kdXNlcih4LnJzdHJpcChvcy5zZXApKSBmb3IgeCBpbiBwYXRoLnNwbGl0KG9zLnBhdGhzZXApXQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIHZlcnNpb246CiAgICAgICAgICAgICAgICBhcHBuYW1lID0gb3MucGF0aC5qb2luKGFwcG5hbWUsIHZlcnNpb24pCiAgICAgICAgICAgIHBhdGhsaXN0ID0gW29zLnNlcC5qb2luKFt4LCBhcHBuYW1lXSkgZm9yIHggaW4gcGF0aGxpc3RdCgogICAgICAgIGlmIG11bHRpcGF0aDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGhzZXAuam9pbihwYXRobGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXRoID0gcGF0aGxpc3RbMF0KICAgICAgICByZXR1cm4gcGF0aAoKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jb25maWdfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjb25maWcgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5jb25maWcvPEFwcE5hbWU+ICAgICAjIG9yIGluICRYREdfQ09ORklHX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gKjogICAgICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0NPTkZJR19IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVhZnVsdCAifi8uY29uZmlnLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIHN5c3RlbSBpbiBbIndpbjMyIiwgImRhcndpbiJdOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgTm9uZSwgcm9hbWluZykKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5jb25maWciKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHNpdGVfY29uZmlnX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG11bHRpcGF0aD1GYWxzZSk6CiAgICAiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNoYXJlZCBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAibXVsdGlwYXRoIiBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb25seSBhcHBsaWNhYmxlIHRvICpuaXgKICAgICAgICAgICAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSBsaXN0IG9mIGNvbmZpZyBkaXJzIHNob3VsZCBiZQogICAgICAgICAgICByZXR1cm5lZC4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGl0ZW0gZnJvbSBYREdfQ09ORklHX0RJUlMgaXMKICAgICAgICAgICAgcmV0dXJuZWQsIG9yICcvZXRjL3hkZy88QXBwTmFtZT4nLCBpZiBYREdfQ09ORklHX0RJUlMgaXMgbm90IHNldAoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICBzYW1lIGFzIHNpdGVfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgICAvZXRjL3hkZy88QXBwTmFtZT4gb3IgJFhER19DT05GSUdfRElSU1tpXS88QXBwTmFtZT4gZm9yIGVhY2ggdmFsdWUgaW4KICAgICAgICAgICAgICAgICAgICAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgV2luICo6ICAgICAgc2FtZSBhcyBzaXRlX2RhdGFfZGlyCiAgICAgICAgVmlzdGE6ICAgICAgKEZhaWwhICJDOlxQcm9ncmFtRGF0YSIgaXMgYSBoaWRkZW4gKnN5c3RlbSogZGlyZWN0b3J5IG9uIFZpc3RhLikKCiAgICBGb3IgVW5peCwgdGhpcyBpcyB1c2luZyB0aGUgJFhER19DT05GSUdfRElSU1swXSBkZWZhdWx0LCBpZiBtdWx0aXBhdGg9RmFsc2UKCiAgICBXQVJOSU5HOiBEbyBub3QgdXNlIHRoaXMgb24gV2luZG93cy4gU2VlIHRoZSBWaXN0YS1GYWlsIG5vdGUgYWJvdmUgZm9yIHdoeS4KICAgICIiIgogICAgaWYgc3lzdGVtIGluIFsid2luMzIiLCAiZGFyd2luIl06CiAgICAgICAgcGF0aCA9IHNpdGVfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yKQogICAgICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIGVsc2U6CiAgICAgICAgIyBYREcgZGVmYXVsdCBmb3IgJFhER19DT05GSUdfRElSUwogICAgICAgICMgb25seSBmaXJzdCwgaWYgbXVsdGlwYXRoIGlzIEZhbHNlCiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19ESVJTJywgJy9ldGMveGRnJykKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmV4cGFuZHVzZXIoeC5yc3RyaXAob3Muc2VwKSkgZm9yIHggaW4gcGF0aC5zcGxpdChvcy5wYXRoc2VwKV0KICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgYXBwbmFtZSA9IG9zLnBhdGguam9pbihhcHBuYW1lLCB2ZXJzaW9uKQogICAgICAgICAgICBwYXRobGlzdCA9IFtvcy5zZXAuam9pbihbeCwgYXBwbmFtZV0pIGZvciB4IGluIHBhdGhsaXN0XQoKICAgICAgICBpZiBtdWx0aXBhdGg6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aGxpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aCA9IHBhdGhsaXN0WzBdCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NhY2hlX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG9waW5pb249VHJ1ZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjYWNoZSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm9waW5pb24iIChib29sZWFuKSBjYW4gYmUgRmFsc2UgdG8gZGlzYWJsZSB0aGUgYXBwZW5kaW5nIG9mCiAgICAgICAgICAgICJDYWNoZSIgdG8gdGhlIGJhc2UgYXBwIGRhdGEgZGlyIGZvciBXaW5kb3dzLiBTZWUKICAgICAgICAgICAgZGlzY3Vzc2lvbiBiZWxvdy4KCiAgICBUeXBpY2FsIHVzZXIgY2FjaGUgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgIH4vTGlicmFyeS9DYWNoZXMvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgfi8uY2FjaGUvPEFwcE5hbWU+IChYREcgZGVmYXVsdCkKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cQ2FjaGUKICAgICAgICBWaXN0YTogICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XENhY2hlCgogICAgT24gV2luZG93cyB0aGUgb25seSBzdWdnZXN0aW9uIGluIHRoZSBNU0ROIGRvY3MgaXMgdGhhdCBsb2NhbCBzZXR0aW5ncyBnbyBpbgogICAgdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCBkaXJlY3RvcnkuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBub24tcm9hbWluZwogICAgYXBwIGRhdGEgZGlyICh0aGUgZGVmYXVsdCByZXR1cm5lZCBieSBgdXNlcl9kYXRhX2RpcmAgYWJvdmUpLiBBcHBzIHR5cGljYWxseQogICAgcHV0IGNhY2hlIGRhdGEgc29tZXdoZXJlICp1bmRlciogdGhlIGdpdmVuIGRpciBoZXJlLiBTb21lIGV4YW1wbGVzOgogICAgICAgIC4uLlxNb3ppbGxhXEZpcmVmb3hcUHJvZmlsZXNcPFByb2ZpbGVOYW1lPlxDYWNoZQogICAgICAgIC4uLlxBY21lXFN1cGVyQXBwXENhY2hlXDEuMAogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJDYWNoZSIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCB2YWx1ZS4KICAgIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIGBvcGluaW9uPUZhbHNlYCBvcHRpb24uCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9MT0NBTF9BUFBEQVRBIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAiQ2FjaGUiKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0NhY2hlcycpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ0FDSEVfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcignfi8uY2FjaGUnKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfbG9nX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG9waW5pb249VHJ1ZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBsb2cgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJvcGluaW9uIiAoYm9vbGVhbikgY2FuIGJlIEZhbHNlIHRvIGRpc2FibGUgdGhlIGFwcGVuZGluZyBvZgogICAgICAgICAgICAiTG9ncyIgdG8gdGhlIGJhc2UgYXBwIGRhdGEgZGlyIGZvciBXaW5kb3dzLCBhbmQgImxvZyIgdG8gdGhlCiAgICAgICAgICAgIGJhc2UgY2FjaGUgZGlyIGZvciBVbml4LiBTZWUgZGlzY3Vzc2lvbiBiZWxvdy4KCiAgICBUeXBpY2FsIHVzZXIgY2FjaGUgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgIH4vTGlicmFyeS9Mb2dzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPi9sb2cgICMgb3IgdW5kZXIgJFhER19DQUNIRV9IT01FIGlmIGRlZmluZWQKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cTG9ncwogICAgICAgIFZpc3RhOiAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cTG9ncwoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MKICAgIGdvIGluIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiAoTm90ZTogSSdtIGludGVyZXN0ZWQgaW4KICAgIGV4YW1wbGVzIG9mIHdoYXQgc29tZSB3aW5kb3dzIGFwcHMgdXNlIGZvciBhIGxvZ3MgZGlyLikKCiAgICBPUElOSU9OOiBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgIkxvZ3MiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAKICAgIHZhbHVlIGZvciBXaW5kb3dzIGFuZCBhcHBlbmRzICJsb2ciIHRvIHRoZSB1c2VyIGNhY2hlIGRpciBmb3IgVW5peC4KICAgIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIGBvcGluaW9uPUZhbHNlYCBvcHRpb24uCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAiZGFyd2luIjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9Mb2dzJyksCiAgICAgICAgICAgIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbikKICAgICAgICB2ZXJzaW9uID0gRmFsc2UKICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJMb2dzIikKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IHVzZXJfY2FjaGVfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbikKICAgICAgICB2ZXJzaW9uID0gRmFsc2UKICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJsb2ciKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmNsYXNzIEFwcERpcnMob2JqZWN0KToKICAgICIiIkNvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGdldHRpbmcgYXBwbGljYXRpb24gZGlycy4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcHBuYW1lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlLAogICAgICAgICAgICAgICAgIG11bHRpcGF0aD1GYWxzZSk6CiAgICAgICAgc2VsZi5hcHBuYW1lID0gYXBwbmFtZQogICAgICAgIHNlbGYuYXBwYXV0aG9yID0gYXBwYXV0aG9yCiAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgogICAgICAgIHNlbGYucm9hbWluZyA9IHJvYW1pbmcKICAgICAgICBzZWxmLm11bHRpcGF0aCA9IG11bHRpcGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfZGF0YV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfZGF0YV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgcm9hbWluZz1zZWxmLnJvYW1pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l0ZV9kYXRhX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2l0ZV9kYXRhX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCBtdWx0aXBhdGg9c2VsZi5tdWx0aXBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9jb25maWdfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2NvbmZpZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCByb2FtaW5nPXNlbGYucm9hbWluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaXRlX2NvbmZpZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNpdGVfY29uZmlnX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCBtdWx0aXBhdGg9c2VsZi5tdWx0aXBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9jYWNoZV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfY2FjaGVfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfbG9nX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9sb2dfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbikKCgojLS0tLSBpbnRlcm5hbCBzdXBwb3J0IHN0dWZmCgpkZWYgX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkoY3NpZGxfbmFtZSk6CiAgICAiIiJUaGlzIGlzIGEgZmFsbGJhY2sgdGVjaG5pcXVlIGF0IGJlc3QuIEknbSBub3Qgc3VyZSBpZiB1c2luZyB0aGUKICAgIHJlZ2lzdHJ5IGZvciB0aGlzIGd1YXJhbnRlZXMgdXMgdGhlIGNvcnJlY3QgYW5zd2VyIGZvciBhbGwgQ1NJRExfKgogICAgbmFtZXMuCiAgICAiIiIKICAgIGltcG9ydCBfd2lucmVnCgogICAgc2hlbGxfZm9sZGVyX25hbWUgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAiQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogIkNvbW1vbiBBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6ICJMb2NhbCBBcHBEYXRhIiwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBrZXkgPSBfd2lucmVnLk9wZW5LZXkoCiAgICAgICAgX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICByIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMiCiAgICApCiAgICBkaXIsIHR5cGUgPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeChrZXksIHNoZWxsX2ZvbGRlcl9uYW1lKQogICAgcmV0dXJuIGRpcgoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9weXdpbjMyKGNzaWRsX25hbWUpOgogICAgZnJvbSB3aW4zMmNvbS5zaGVsbCBpbXBvcnQgc2hlbGxjb24sIHNoZWxsCiAgICBkaXIgPSBzaGVsbC5TSEdldEZvbGRlclBhdGgoMCwgZ2V0YXR0cihzaGVsbGNvbiwgY3NpZGxfbmFtZSksIDAsIDApCiAgICAjIFRyeSB0byBtYWtlIHRoaXMgYSB1bmljb2RlIHBhdGggYmVjYXVzZSBTSEdldEZvbGRlclBhdGggZG9lcwogICAgIyBub3QgcmV0dXJuIHVuaWNvZGUgc3RyaW5ncyB3aGVuIHRoZXJlIGlzIHVuaWNvZGUgZGF0YSBpbiB0aGUKICAgICMgcGF0aC4KICAgIHRyeToKICAgICAgICBkaXIgPSB1bmljb2RlKGRpcikKCiAgICAgICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAgICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICAgICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICAgICAgZm9yIGMgaW4gZGlyOgogICAgICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgd2luMzJhcGkKICAgICAgICAgICAgICAgIGRpciA9IHdpbjMyYXBpLkdldFNob3J0UGF0aE5hbWUoZGlyKQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgIHBhc3MKICAgIHJldHVybiBkaXIKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzKGNzaWRsX25hbWUpOgogICAgaW1wb3J0IGN0eXBlcwoKICAgIGNzaWRsX2NvbnN0ID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogMjYsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogMzUsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAyOCwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICBjdHlwZXMud2luZGxsLnNoZWxsMzIuU0hHZXRGb2xkZXJQYXRoVyhOb25lLCBjc2lkbF9jb25zdCwgTm9uZSwgMCwgYnVmKQoKICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgIGZvciBjIGluIGJ1ZjoKICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgIGJ1ZjIgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICAgICAgaWYgY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5HZXRTaG9ydFBhdGhOYW1lVyhidWYudmFsdWUsIGJ1ZjIsIDEwMjQpOgogICAgICAgICAgICBidWYgPSBidWYyCgogICAgcmV0dXJuIGJ1Zi52YWx1ZQoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX2puYShjc2lkbF9uYW1lKToKICAgIGltcG9ydCBhcnJheQogICAgZnJvbSBjb20uc3VuIGltcG9ydCBqbmEKICAgIGZyb20gY29tLnN1bi5qbmEucGxhdGZvcm0gaW1wb3J0IHdpbjMyCgogICAgYnVmX3NpemUgPSB3aW4zMi5XaW5EZWYuTUFYX1BBVEggKiAyCiAgICBidWYgPSBhcnJheS56ZXJvcygnYycsIGJ1Zl9zaXplKQogICAgc2hlbGwgPSB3aW4zMi5TaGVsbDMyLklOU1RBTkNFCiAgICBzaGVsbC5TSEdldEZvbGRlclBhdGgoTm9uZSwgZ2V0YXR0cih3aW4zMi5TaGxPYmosIGNzaWRsX25hbWUpLCBOb25lLCB3aW4zMi5TaGxPYmouU0hHRlBfVFlQRV9DVVJSRU5ULCBidWYpCiAgICBkaXIgPSBqbmEuTmF0aXZlLnRvU3RyaW5nKGJ1Zi50b3N0cmluZygpKS5yc3RyaXAoIlwwIikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBkaXI6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYgPSBhcnJheS56ZXJvcygnYycsIGJ1Zl9zaXplKQogICAgICAgIGtlcm5lbCA9IHdpbjMyLktlcm5lbDMyLklOU1RBTkNFCiAgICAgICAgaWYga2VybmFsLkdldFNob3J0UGF0aE5hbWUoZGlyLCBidWYsIGJ1Zl9zaXplKToKICAgICAgICAgICAgZGlyID0gam5hLk5hdGl2ZS50b1N0cmluZyhidWYudG9zdHJpbmcoKSkucnN0cmlwKCJcMCIpCgogICAgcmV0dXJuIGRpcgoKaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHdpbjMyY29tLnNoZWxsCiAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfcHl3aW4zMgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbmRsbAogICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCBjb20uc3VuLmpuYQogICAgICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfam5hCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5CgoKIy0tLS0gc2VsZiB0ZXN0IGNvZGUKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBhcHBuYW1lID0gIk15QXBwIgogICAgYXBwYXV0aG9yID0gIk15Q29tcGFueSIKCiAgICBwcm9wcyA9ICgidXNlcl9kYXRhX2RpciIsICJzaXRlX2RhdGFfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NvbmZpZ19kaXIiLCAic2l0ZV9jb25maWdfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NhY2hlX2RpciIsICJ1c2VyX2xvZ19kaXIiKQoKICAgIHByaW50KCItLSBhcHAgZGlycyAod2l0aCBvcHRpb25hbCAndmVyc2lvbicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbj0iMS4wIikKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRob3V0IG9wdGlvbmFsICd2ZXJzaW9uJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGhvdXQgb3B0aW9uYWwgJ2FwcGF1dGhvcicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aCBkaXNhYmxlZCAnYXBwYXV0aG9yJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yPUZhbHNlKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpClBLAwQUAAAAAAAAACEAPClYxtACAADQAgAAUQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwgIl9fc3VtbWFyeV9fIiwgIl9fdXJpX18iLCAiX192ZXJzaW9uX18iLCAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwgIl9fbGljZW5zZV9fIiwgIl9fY29weXJpZ2h0X18iLApdCgpfX3RpdGxlX18gPSAicGFja2FnaW5nIgpfX3N1bW1hcnlfXyA9ICJDb3JlIHV0aWxpdGllcyBmb3IgUHl0aG9uIHBhY2thZ2VzIgpfX3VyaV9fID0gImh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BhY2thZ2luZyIKCl9fdmVyc2lvbl9fID0gIjE2LjgiCgpfX2F1dGhvcl9fID0gIkRvbmFsZCBTdHVmZnQgYW5kIGluZGl2aWR1YWwgY29udHJpYnV0b3JzIgpfX2VtYWlsX18gPSAiZG9uYWxkQHN0dWZmdC5pbyIKCl9fbGljZW5zZV9fID0gIkJTRCBvciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAiCl9fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IDIwMTQtMjAxNiAlcyIgJSBfX2F1dGhvcl9fClBLAwQUAAAAAAAAACEAgXaWygECAAABAgAAUAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKZnJvbSAuX19hYm91dF9fIGltcG9ydCAoCiAgICBfX2F1dGhvcl9fLCBfX2NvcHlyaWdodF9fLCBfX2VtYWlsX18sIF9fbGljZW5zZV9fLCBfX3N1bW1hcnlfXywgX190aXRsZV9fLAogICAgX191cmlfXywgX192ZXJzaW9uX18KKQoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLCAiX19zdW1tYXJ5X18iLCAiX191cmlfXyIsICJfX3ZlcnNpb25fXyIsICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLCAiX19saWNlbnNlX18iLCAiX19jb3B5cmlnaHRfXyIsCl0KUEsDBBQAAAAAAAAAIQDmaUrjXAMAAFwDAABPAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzeXMKCgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgojIGZsYWtlODogbm9xYQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIgogICAgQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLgogICAgIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKUEsDBBQAAAAAAAAAIQD6/aQSiAUAAIgFAABTAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgoKY2xhc3MgSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJJbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIE5lZ2F0aXZlSW5maW5pdHkKCkluZmluaXR5ID0gSW5maW5pdHkoKQoKCmNsYXNzIE5lZ2F0aXZlSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICItSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBJbmZpbml0eQoKTmVnYXRpdmVJbmZpbml0eSA9IE5lZ2F0aXZlSW5maW5pdHkoKQpQSwMEFAAAAAAAAAAhADD4E9w4IAAAOCAAAE8AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwoKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFBhcnNlRXhjZXB0aW9uLCBQYXJzZVJlc3VsdHMsIHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIEdyb3VwLCBGb3J3YXJkLCBRdW90ZWRTdHJpbmcKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgU3BlY2lmaWVyLCBJbnZhbGlkU3BlY2lmaWVyCgoKX19hbGxfXyA9IFsKICAgICJJbnZhbGlkTWFya2VyIiwgIlVuZGVmaW5lZENvbXBhcmlzb24iLCAiVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lIiwKICAgICJNYXJrZXIiLCAiZGVmYXVsdF9lbnZpcm9ubWVudCIsCl0KCgpjbGFzcyBJbnZhbGlkTWFya2VyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG1hcmtlciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkQ29tcGFyaXNvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHZhbHVlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBIG5hbWUgd2FzIGF0dGVtcHRlZCB0byBiZSB1c2VkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW5zaWRlIG9mIHRoZQogICAgZW52aXJvbm1lbnQuCiAgICAiIiIKCgpjbGFzcyBOb2RlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYudmFsdWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfSk+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSkKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBWYXJpYWJsZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpjbGFzcyBWYWx1ZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAnInswfSInLmZvcm1hdChzZWxmKQoKCmNsYXNzIE9wKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKClZBUklBQkxFID0gKAogICAgTCgiaW1wbGVtZW50YXRpb25fdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwKICAgIEwoImltcGxlbWVudGF0aW9uX25hbWUiKSB8CiAgICBMKCJweXRob25fZnVsbF92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fcmVsZWFzZSIpIHwKICAgIEwoInBsYXRmb3JtX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9tYWNoaW5lIikgfAogICAgTCgicGxhdGZvcm1fc3lzdGVtIikgfAogICAgTCgicHl0aG9uX3ZlcnNpb24iKSB8CiAgICBMKCJzeXNfcGxhdGZvcm0iKSB8CiAgICBMKCJvc19uYW1lIikgfAogICAgTCgib3MubmFtZSIpIHwgICMgUEVQLTM0NQogICAgTCgic3lzLnBsYXRmb3JtIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS52ZXJzaW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5tYWNoaW5lIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIFBFUC0zNDUKICAgIEwoInB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwgICMgdW5kb2N1bWVudGVkIHNldHVwdG9vbHMgbGVnYWN5CiAgICBMKCJleHRyYSIpCikKQUxJQVNFUyA9IHsKICAgICdvcy5uYW1lJzogJ29zX25hbWUnLAogICAgJ3N5cy5wbGF0Zm9ybSc6ICdzeXNfcGxhdGZvcm0nLAogICAgJ3BsYXRmb3JtLnZlcnNpb24nOiAncGxhdGZvcm1fdmVyc2lvbicsCiAgICAncGxhdGZvcm0ubWFjaGluZSc6ICdwbGF0Zm9ybV9tYWNoaW5lJywKICAgICdwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJywKICAgICdweXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJwp9ClZBUklBQkxFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYXJpYWJsZShBTElBU0VTLmdldCh0WzBdLCB0WzBdKSkpCgpWRVJTSU9OX0NNUCA9ICgKICAgIEwoIj09PSIpIHwKICAgIEwoIj09IikgfAogICAgTCgiPj0iKSB8CiAgICBMKCI8PSIpIHwKICAgIEwoIiE9IikgfAogICAgTCgifj0iKSB8CiAgICBMKCI+IikgfAogICAgTCgiPCIpCikKCk1BUktFUl9PUCA9IFZFUlNJT05fQ01QIHwgTCgibm90IGluIikgfCBMKCJpbiIpCk1BUktFUl9PUC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogT3AodFswXSkpCgpNQVJLRVJfVkFMVUUgPSBRdW90ZWRTdHJpbmcoIiciKSB8IFF1b3RlZFN0cmluZygnIicpCk1BUktFUl9WQUxVRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFsdWUodFswXSkpCgpCT09MT1AgPSBMKCJhbmQiKSB8IEwoIm9yIikKCk1BUktFUl9WQVIgPSBWQVJJQUJMRSB8IE1BUktFUl9WQUxVRQoKTUFSS0VSX0lURU0gPSBHcm91cChNQVJLRVJfVkFSICsgTUFSS0VSX09QICsgTUFSS0VSX1ZBUikKTUFSS0VSX0lURU0uc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHR1cGxlKHRbMF0pKQoKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKCk1BUktFUl9FWFBSID0gRm9yd2FyZCgpCk1BUktFUl9BVE9NID0gTUFSS0VSX0lURU0gfCBHcm91cChMUEFSRU4gKyBNQVJLRVJfRVhQUiArIFJQQVJFTikKTUFSS0VSX0VYUFIgPDwgTUFSS0VSX0FUT00gKyBaZXJvT3JNb3JlKEJPT0xPUCArIE1BUktFUl9FWFBSKQoKTUFSS0VSID0gc3RyaW5nU3RhcnQgKyBNQVJLRVJfRVhQUiArIHN0cmluZ0VuZAoKCmRlZiBfY29lcmNlX3BhcnNlX3Jlc3VsdChyZXN1bHRzKToKICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0cywgUGFyc2VSZXN1bHRzKToKICAgICAgICByZXR1cm4gW19jb2VyY2VfcGFyc2VfcmVzdWx0KGkpIGZvciBpIGluIHJlc3VsdHNdCiAgICBlbHNlOgogICAgICAgIHJldHVybiByZXN1bHRzCgoKZGVmIF9mb3JtYXRfbWFya2VyKG1hcmtlciwgZmlyc3Q9VHJ1ZSk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAjIFNvbWV0aW1lcyB3ZSBoYXZlIGEgc3RydWN0dXJlIGxpa2UgW1suLi5dXSB3aGljaCBpcyBhIHNpbmdsZSBpdGVtIGxpc3QKICAgICMgd2hlcmUgdGhlIHNpbmdsZSBpdGVtIGlzIGl0c2VsZiBpdCdzIG93biBsaXN0LiBJbiB0aGF0IGNhc2Ugd2Ugd2FudCBza2lwCiAgICAjIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgZXh0cmFuZW91cyAoKSBvbiB0aGUKICAgICMgb3V0c2lkZS4KICAgIGlmIChpc2luc3RhbmNlKG1hcmtlciwgbGlzdCkgYW5kIGxlbihtYXJrZXIpID09IDEgYW5kCiAgICAgICAgICAgIGlzaW5zdGFuY2UobWFya2VyWzBdLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKG1hcmtlclswXSkKCiAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgaW5uZXIgPSAoX2Zvcm1hdF9tYXJrZXIobSwgZmlyc3Q9RmFsc2UpIGZvciBtIGluIG1hcmtlcikKICAgICAgICBpZiBmaXJzdDoKICAgICAgICAgICAgcmV0dXJuICIgIi5qb2luKGlubmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiKCIgKyAiICIuam9pbihpbm5lcikgKyAiKSIKICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICByZXR1cm4gIiAiLmpvaW4oW20uc2VyaWFsaXplKCkgZm9yIG0gaW4gbWFya2VyXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hcmtlcgoKCl9vcGVyYXRvcnMgPSB7CiAgICAiaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBpbiByaHMsCiAgICAibm90IGluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgbm90IGluIHJocywKICAgICI8Ijogb3BlcmF0b3IubHQsCiAgICAiPD0iOiBvcGVyYXRvci5sZSwKICAgICI9PSI6IG9wZXJhdG9yLmVxLAogICAgIiE9Ijogb3BlcmF0b3IubmUsCiAgICAiPj0iOiBvcGVyYXRvci5nZSwKICAgICI+Ijogb3BlcmF0b3IuZ3QsCn0KCgpkZWYgX2V2YWxfb3AobGhzLCBvcCwgcmhzKToKICAgIHRyeToKICAgICAgICBzcGVjID0gU3BlY2lmaWVyKCIiLmpvaW4oW29wLnNlcmlhbGl6ZSgpLCByaHNdKSkKICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHNwZWMuY29udGFpbnMobGhzKQoKICAgIG9wZXIgPSBfb3BlcmF0b3JzLmdldChvcC5zZXJpYWxpemUoKSkKICAgIGlmIG9wZXIgaXMgTm9uZToKICAgICAgICByYWlzZSBVbmRlZmluZWRDb21wYXJpc29uKAogICAgICAgICAgICAiVW5kZWZpbmVkIHswIXJ9IG9uIHsxIXJ9IGFuZCB7MiFyfS4iLmZvcm1hdChvcCwgbGhzLCByaHMpCiAgICAgICAgKQoKICAgIHJldHVybiBvcGVyKGxocywgcmhzKQoKCl91bmRlZmluZWQgPSBvYmplY3QoKQoKCmRlZiBfZ2V0X2VudihlbnZpcm9ubWVudCwgbmFtZSk6CiAgICB2YWx1ZSA9IGVudmlyb25tZW50LmdldChuYW1lLCBfdW5kZWZpbmVkKQoKICAgIGlmIHZhbHVlIGlzIF91bmRlZmluZWQ6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKAogICAgICAgICAgICAiezAhcn0gZG9lcyBub3QgZXhpc3QgaW4gZXZhbHVhdGlvbiBlbnZpcm9ubWVudC4iLmZvcm1hdChuYW1lKQogICAgICAgICkKCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgX2V2YWx1YXRlX21hcmtlcnMobWFya2VycywgZW52aXJvbm1lbnQpOgogICAgZ3JvdXBzID0gW1tdXQoKICAgIGZvciBtYXJrZXIgaW4gbWFya2VyczoKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbHVhdGVfbWFya2VycyhtYXJrZXIsIGVudmlyb25tZW50KSkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgICAgIGxocywgb3AsIHJocyA9IG1hcmtlcgoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaHMsIFZhcmlhYmxlKToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCBsaHMudmFsdWUpCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSByaHMudmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IGxocy52YWx1ZQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIHJocy52YWx1ZSkKCiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsX29wKGxoc192YWx1ZSwgb3AsIHJoc192YWx1ZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IG1hcmtlciBpbiBbImFuZCIsICJvciJdCiAgICAgICAgICAgIGlmIG1hcmtlciA9PSAib3IiOgogICAgICAgICAgICAgICAgZ3JvdXBzLmFwcGVuZChbXSkKCiAgICByZXR1cm4gYW55KGFsbChpdGVtKSBmb3IgaXRlbSBpbiBncm91cHMpCgoKZGVmIGZvcm1hdF9mdWxsX3ZlcnNpb24oaW5mbyk6CiAgICB2ZXJzaW9uID0gJ3swLm1ham9yfS57MC5taW5vcn0uezAubWljcm99Jy5mb3JtYXQoaW5mbykKICAgIGtpbmQgPSBpbmZvLnJlbGVhc2VsZXZlbAogICAgaWYga2luZCAhPSAnZmluYWwnOgogICAgICAgIHZlcnNpb24gKz0ga2luZFswXSArIHN0cihpbmZvLnNlcmlhbCkKICAgIHJldHVybiB2ZXJzaW9uCgoKZGVmIGRlZmF1bHRfZW52aXJvbm1lbnQoKToKICAgIGlmIGhhc2F0dHIoc3lzLCAnaW1wbGVtZW50YXRpb24nKToKICAgICAgICBpdmVyID0gZm9ybWF0X2Z1bGxfdmVyc2lvbihzeXMuaW1wbGVtZW50YXRpb24udmVyc2lvbikKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gc3lzLmltcGxlbWVudGF0aW9uLm5hbWUKICAgIGVsc2U6CiAgICAgICAgaXZlciA9ICcwJwogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSAnJwoKICAgIHJldHVybiB7CiAgICAgICAgImltcGxlbWVudGF0aW9uX25hbWUiOiBpbXBsZW1lbnRhdGlvbl9uYW1lLAogICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogaXZlciwKICAgICAgICAib3NfbmFtZSI6IG9zLm5hbWUsCiAgICAgICAgInBsYXRmb3JtX21hY2hpbmUiOiBwbGF0Zm9ybS5tYWNoaW5lKCksCiAgICAgICAgInBsYXRmb3JtX3JlbGVhc2UiOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgInBsYXRmb3JtX3N5c3RlbSI6IHBsYXRmb3JtLnN5c3RlbSgpLAogICAgICAgICJwbGF0Zm9ybV92ZXJzaW9uIjogcGxhdGZvcm0udmVyc2lvbigpLAogICAgICAgICJweXRob25fZnVsbF92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIjogcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICAgICAgInB5dGhvbl92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKVs6M10sCiAgICAgICAgInN5c19wbGF0Zm9ybSI6IHN5cy5wbGF0Zm9ybSwKICAgIH0KCgpjbGFzcyBNYXJrZXIob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWFya2VyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX21hcmtlcnMgPSBfY29lcmNlX3BhcnNlX3Jlc3VsdChNQVJLRVIucGFyc2VTdHJpbmcobWFya2VyKSkKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyX3N0ciA9ICJJbnZhbGlkIG1hcmtlcjogezAhcn0sIHBhcnNlIGVycm9yIGF0IHsxIXJ9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICBtYXJrZXIsIG1hcmtlcltlLmxvYzplLmxvYyArIDhdKQogICAgICAgICAgICByYWlzZSBJbnZhbGlkTWFya2VyKGVycl9zdHIpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKHNlbGYuX21hcmtlcnMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPE1hcmtlcih7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQoKICAgIGRlZiBldmFsdWF0ZShzZWxmLCBlbnZpcm9ubWVudD1Ob25lKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIG1hcmtlci4KCiAgICAgICAgUmV0dXJuIHRoZSBib29sZWFuIGZyb20gZXZhbHVhdGluZyB0aGUgZ2l2ZW4gbWFya2VyIGFnYWluc3QgdGhlCiAgICAgICAgZW52aXJvbm1lbnQuIGVudmlyb25tZW50IGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIG92ZXJyaWRlIGFsbCBvcgogICAgICAgIHBhcnQgb2YgdGhlIGRldGVybWluZWQgZW52aXJvbm1lbnQuCgogICAgICAgIFRoZSBlbnZpcm9ubWVudCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgUHl0aG9uIHByb2Nlc3MuCiAgICAgICAgIiIiCiAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudCA9IGRlZmF1bHRfZW52aXJvbm1lbnQoKQogICAgICAgIGlmIGVudmlyb25tZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50LnVwZGF0ZShlbnZpcm9ubWVudCkKCiAgICAgICAgcmV0dXJuIF9ldmFsdWF0ZV9tYXJrZXJzKHNlbGYuX21hcmtlcnMsIGN1cnJlbnRfZW52aXJvbm1lbnQpClBLAwQUAAAAAAAAACEApYYd2wMRAAADEQAAVAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzdHJpbmcKaW1wb3J0IHJlCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZCwgb3JpZ2luYWxUZXh0Rm9yLCBQYXJzZUV4Y2VwdGlvbgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgV29yZCwgT3B0aW9uYWwsIFJlZ2V4LCBDb21iaW5lCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybHBhcnNlCgpmcm9tIC5tYXJrZXJzIGltcG9ydCBNQVJLRVJfRVhQUiwgTWFya2VyCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IExlZ2FjeVNwZWNpZmllciwgU3BlY2lmaWVyLCBTcGVjaWZpZXJTZXQKCgpjbGFzcyBJbnZhbGlkUmVxdWlyZW1lbnQoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgcmVxdWlyZW1lbnQgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCkFMUEhBTlVNID0gV29yZChzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMpCgpMQlJBQ0tFVCA9IEwoIlsiKS5zdXBwcmVzcygpClJCUkFDS0VUID0gTCgiXSIpLnN1cHByZXNzKCkKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKQ09NTUEgPSBMKCIsIikuc3VwcHJlc3MoKQpTRU1JQ09MT04gPSBMKCI7Iikuc3VwcHJlc3MoKQpBVCA9IEwoIkAiKS5zdXBwcmVzcygpCgpQVU5DVFVBVElPTiA9IFdvcmQoIi1fLiIpCklERU5USUZJRVJfRU5EID0gQUxQSEFOVU0gfCAoWmVyb09yTW9yZShQVU5DVFVBVElPTikgKyBBTFBIQU5VTSkKSURFTlRJRklFUiA9IENvbWJpbmUoQUxQSEFOVU0gKyBaZXJvT3JNb3JlKElERU5USUZJRVJfRU5EKSkKCk5BTUUgPSBJREVOVElGSUVSKCJuYW1lIikKRVhUUkEgPSBJREVOVElGSUVSCgpVUkkgPSBSZWdleChyJ1teIF0rJykoInVybCIpClVSTCA9IChBVCArIFVSSSkKCkVYVFJBU19MSVNUID0gRVhUUkEgKyBaZXJvT3JNb3JlKENPTU1BICsgRVhUUkEpCkVYVFJBUyA9IChMQlJBQ0tFVCArIE9wdGlvbmFsKEVYVFJBU19MSVNUKSArIFJCUkFDS0VUKSgiZXh0cmFzIikKClZFUlNJT05fUEVQNDQwID0gUmVnZXgoU3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQpWRVJTSU9OX0xFR0FDWSA9IFJlZ2V4KExlZ2FjeVNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKClZFUlNJT05fT05FID0gVkVSU0lPTl9QRVA0NDAgXiBWRVJTSU9OX0xFR0FDWQpWRVJTSU9OX01BTlkgPSBDb21iaW5lKFZFUlNJT05fT05FICsgWmVyb09yTW9yZShDT01NQSArIFZFUlNJT05fT05FKSwKICAgICAgICAgICAgICAgICAgICAgICBqb2luU3RyaW5nPSIsIiwgYWRqYWNlbnQ9RmFsc2UpKCJfcmF3X3NwZWMiKQpfVkVSU0lPTl9TUEVDID0gT3B0aW9uYWwoKChMUEFSRU4gKyBWRVJTSU9OX01BTlkgKyBSUEFSRU4pIHwgVkVSU0lPTl9NQU5ZKSkKX1ZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdC5fcmF3X3NwZWMgb3IgJycpCgpWRVJTSU9OX1NQRUMgPSBvcmlnaW5hbFRleHRGb3IoX1ZFUlNJT05fU1BFQykoInNwZWNpZmllciIpClZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdFsxXSkKCk1BUktFUl9FWFBSID0gb3JpZ2luYWxUZXh0Rm9yKE1BUktFUl9FWFBSKCkpKCJtYXJrZXIiKQpNQVJLRVJfRVhQUi5zZXRQYXJzZUFjdGlvbigKICAgIGxhbWJkYSBzLCBsLCB0OiBNYXJrZXIoc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdKQopCk1BUktFUl9TRVBFUkFUT1IgPSBTRU1JQ09MT04KTUFSS0VSID0gTUFSS0VSX1NFUEVSQVRPUiArIE1BUktFUl9FWFBSCgpWRVJTSU9OX0FORF9NQVJLRVIgPSBWRVJTSU9OX1NQRUMgKyBPcHRpb25hbChNQVJLRVIpClVSTF9BTkRfTUFSS0VSID0gVVJMICsgT3B0aW9uYWwoTUFSS0VSKQoKTkFNRURfUkVRVUlSRU1FTlQgPSBcCiAgICBOQU1FICsgT3B0aW9uYWwoRVhUUkFTKSArIChVUkxfQU5EX01BUktFUiB8IFZFUlNJT05fQU5EX01BUktFUikKClJFUVVJUkVNRU5UID0gc3RyaW5nU3RhcnQgKyBOQU1FRF9SRVFVSVJFTUVOVCArIHN0cmluZ0VuZAoKCmNsYXNzIFJlcXVpcmVtZW50KG9iamVjdCk6CiAgICAiIiJQYXJzZSBhIHJlcXVpcmVtZW50LgoKICAgIFBhcnNlIGEgZ2l2ZW4gcmVxdWlyZW1lbnQgc3RyaW5nIGludG8gaXRzIHBhcnRzLCBzdWNoIGFzIG5hbWUsIHNwZWNpZmllciwKICAgIFVSTCwgYW5kIGV4dHJhcy4gUmFpc2VzIEludmFsaWRSZXF1aXJlbWVudCBvbiBhIGJhZGx5LWZvcm1lZCByZXF1aXJlbWVudAogICAgc3RyaW5nLgogICAgIiIiCgogICAgIyBUT0RPOiBDYW4gd2UgdGVzdCB3aGV0aGVyIHNvbWV0aGluZyBpcyBjb250YWluZWQgd2l0aGluIGEgcmVxdWlyZW1lbnQ/CiAgICAjICAgICAgIElmIHNvIGhvdyBkbyB3ZSBkbyB0aGF0PyBEbyB3ZSBuZWVkIHRvIHRlc3QgYWdhaW5zdCB0aGUgX25hbWVfIG9mCiAgICAjICAgICAgIHRoZSB0aGluZyBhcyB3ZWxsIGFzIHRoZSB2ZXJzaW9uPyBXaGF0IGFib3V0IHRoZSBtYXJrZXJzPwogICAgIyBUT0RPOiBDYW4gd2Ugbm9ybWFsaXplIHRoZSBuYW1lIGFuZCBleHRyYSBuYW1lPwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVxID0gUkVRVUlSRU1FTlQucGFyc2VTdHJpbmcocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1aXJlbWVudCwgcGFyc2UgZXJyb3IgYXQgXCJ7MCFyfVwiIi5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc3RyaW5nW2UubG9jOmUubG9jICsgOF0pKQoKICAgICAgICBzZWxmLm5hbWUgPSByZXEubmFtZQogICAgICAgIGlmIHJlcS51cmw6CiAgICAgICAgICAgIHBhcnNlZF91cmwgPSB1cmxwYXJzZS51cmxwYXJzZShyZXEudXJsKQogICAgICAgICAgICBpZiBub3QgKHBhcnNlZF91cmwuc2NoZW1lIGFuZCBwYXJzZWRfdXJsLm5ldGxvYykgb3IgKAogICAgICAgICAgICAgICAgICAgIG5vdCBwYXJzZWRfdXJsLnNjaGVtZSBhbmQgbm90IHBhcnNlZF91cmwubmV0bG9jKToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgiSW52YWxpZCBVUkwgZ2l2ZW4iKQogICAgICAgICAgICBzZWxmLnVybCA9IHJlcS51cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybCA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhcyA9IHNldChyZXEuZXh0cmFzLmFzTGlzdCgpIGlmIHJlcS5leHRyYXMgZWxzZSBbXSkKICAgICAgICBzZWxmLnNwZWNpZmllciA9IFNwZWNpZmllclNldChyZXEuc3BlY2lmaWVyKQogICAgICAgIHNlbGYubWFya2VyID0gcmVxLm1hcmtlciBpZiByZXEubWFya2VyIGVsc2UgTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW3NlbGYubmFtZV0KCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiW3swfV0iLmZvcm1hdCgiLCIuam9pbihzb3J0ZWQoc2VsZi5leHRyYXMpKSkpCgogICAgICAgIGlmIHNlbGYuc3BlY2lmaWVyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc3RyKHNlbGYuc3BlY2lmaWVyKSkKCiAgICAgICAgaWYgc2VsZi51cmw6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiQCB7MH0iLmZvcm1hdChzZWxmLnVybCkpCgogICAgICAgIGlmIHNlbGYubWFya2VyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIjsgezB9Ii5mb3JtYXQoc2VsZi5tYXJrZXIpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8UmVxdWlyZW1lbnQoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKUEsDBBQAAAAAAAAAIQB8RYOMeW0AAHltAABSAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBhYmMKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzLCB3aXRoX21ldGFjbGFzcwpmcm9tIC52ZXJzaW9uIGltcG9ydCBWZXJzaW9uLCBMZWdhY3lWZXJzaW9uLCBwYXJzZQoKCmNsYXNzIEludmFsaWRTcGVjaWZpZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgc3BlY2lmaWVyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBCYXNlU3BlY2lmaWVyKHdpdGhfbWV0YWNsYXNzKGFiYy5BQkNNZXRhLCBvYmplY3QpKToKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBzdHIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuIFRoaXMKICAgICAgICBzaG91bGQgYmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIFNwZWNpZmllciBpdHNlbGYuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBoYXNoIHZhbHVlIGZvciB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgbm90IGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3Rwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIFNldHMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gaXRlbSBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRha2VzIGFuIGl0ZXJhYmxlIG9mIGl0ZW1zIGFuZCBmaWx0ZXJzIHRoZW0gc28gdGhhdCBvbmx5IGl0ZW1zIHdoaWNoCiAgICAgICAgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIgYXJlIGFsbG93ZWQgaW4gaXQuCiAgICAgICAgIiIiCgoKY2xhc3MgX0luZGl2aWR1YWxTcGVjaWZpZXIoQmFzZVNwZWNpZmllcik6CgogICAgX29wZXJhdG9ycyA9IHt9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHNwZWMpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkU3BlY2lmaWVyKCJJbnZhbGlkIHNwZWNpZmllcjogJ3swfSciLmZvcm1hdChzcGVjKSkKCiAgICAgICAgc2VsZi5fc3BlYyA9ICgKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoIm9wZXJhdG9yIikuc3RyaXAoKSwKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInZlcnNpb24iKS5zdHJpcCgpLAogICAgICAgICkKCiAgICAgICAgIyBTdG9yZSB3aGV0aGVyIG9yIG5vdCB0aGlzIFNwZWNpZmllciBzaG91bGQgYWNjZXB0IHByZXJlbGVhc2VzCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9ezJ9KT4iLmZvcm1hdCgKICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgIHN0cihzZWxmKSwKICAgICAgICAgICAgcHJlLAogICAgICAgICkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gInswfXsxfSIuZm9ybWF0KCpzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgPT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjICE9IG90aGVyLl9zcGVjCgogICAgZGVmIF9nZXRfb3BlcmF0b3Ioc2VsZiwgb3ApOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICJfY29tcGFyZV97MH0iLmZvcm1hdChzZWxmLl9vcGVyYXRvcnNbb3BdKSkKCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIHZlcnNpb24gPSBwYXJzZSh2ZXJzaW9uKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3BlcmF0b3Ioc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiBwcmVyZWxlYXNlcyBhcmUgdG8gYmUgYWxsb3dlZCBvciBub3QuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgTm9ybWFsaXplIGl0ZW0gdG8gYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24sIHRoaXMgYWxsb3dzIHVzIHRvIGhhdmUKICAgICAgICAjIGEgc2hvcnRjdXQgZm9yIGBgIjIuMCIgaW4gU3BlY2lmaWVyKCI+PTIiKQogICAgICAgIGl0ZW0gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBzaG91bGQgYmUgc3VwcG9ydGluZyBwcmVyZWxlYXNlcyBpbiB0aGlzIHNwZWNpZmllcgogICAgICAgICMgb3Igbm90LCBpZiB3ZSBkbyBub3Qgc3VwcG9ydCBwcmVyZWxlYXNlcyB0aGFuIHdlIGNhbiBzaG9ydCBjaXJjdWl0CiAgICAgICAgIyBsb2dpYyBpZiB0aGlzIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBpdGVtLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgQWN0dWFsbHkgZG8gdGhlIGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXRlbSBpcyBjb250YWluZWQKICAgICAgICAjIHdpdGhpbiB0aGlzIFNwZWNpZmllciBvciBub3QuCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9vcGVyYXRvcihzZWxmLm9wZXJhdG9yKShpdGVtLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgeWllbGRlZCA9IEZhbHNlCiAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICBrdyA9IHsicHJlcmVsZWFzZXMiOiBwcmVyZWxlYXNlcyBpZiBwcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBlbHNlIFRydWV9CgogICAgICAgICMgQXR0ZW1wdCB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIGl0ZXJhYmxlIGFuZCBpZiBhbnkgb2YKICAgICAgICAjIHRoZW0gbWF0Y2gsIHlpZWxkIHRoZW0uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gaXRlcmFibGU6CiAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gc2VsZi5fY29lcmNlX3ZlcnNpb24odmVyc2lvbikKCiAgICAgICAgICAgIGlmIHNlbGYuY29udGFpbnMocGFyc2VkX3ZlcnNpb24sICoqa3cpOgogICAgICAgICAgICAgICAgIyBJZiBvdXIgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2UsIGFuZCB3ZSB3ZXJlIG5vdCBzZXQgdG8gYWxsb3cKICAgICAgICAgICAgICAgICMgcHJlcmVsZWFzZXMsIHRoZW4gd2UnbGwgc3RvcmUgaXQgZm9yIGxhdGVyIGluY2FzZSBub3RoaW5nCiAgICAgICAgICAgICAgICAjIGVsc2UgbWF0Y2hlcyB0aGlzIHNwZWNpZmllci4KICAgICAgICAgICAgICAgIGlmIChwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgKHByZXJlbGVhc2VzIG9yIHNlbGYucHJlcmVsZWFzZXMpKToKICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQodmVyc2lvbikKICAgICAgICAgICAgICAgICMgRWl0aGVyIHRoaXMgaXMgbm90IGEgcHJlcmVsZWFzZSwgb3Igd2Ugc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICAgICAgIyBhY2NlcHRpbmcgcHJlcmVsZWFzZXMgZnJvbSB0aGUgYmVnaW5pbmcuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKICAgICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGl0ZXJhdGVkIG92ZXIgZXZlcnl0aGluZywgZGV0ZXJtaW5lIGlmIHdlJ3ZlIHlpZWxkZWQKICAgICAgICAjIGFueSB2YWx1ZXMsIGFuZCBpZiB3ZSBoYXZlIG5vdCBhbmQgd2UgaGF2ZSBhbnkgcHJlcmVsZWFzZXMgc3RvcmVkIHVwCiAgICAgICAgIyB0aGVuIHdlIHdpbGwgZ28gYWhlYWQgYW5kIHlpZWxkIHRoZSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBub3QgeWllbGRlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIGZvciB2ZXJzaW9uIGluIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKCmNsYXNzIExlZ2FjeVNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9ICgKICAgICAgICByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPig9PXwhPXw8PXw+PXw8fD4pKQogICAgICAgIFxzKgogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICBbXiw7XHMpXSogIyBTaW5jZSB0aGlzIGlzIGEgImxlZ2FjeSIgc3BlY2lmaWVyLCBhbmQgdGhlIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICMgc3RyaW5nIGNhbiBiZSBqdXN0IGFib3V0IGFueXRoaW5nLCB3ZSBtYXRjaCBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAjIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZSwgYSBzZW1pLWNvbG9uIGZvciBtYXJrZXIgc3VwcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICMgYSBjbG9zaW5nIHBhcmVuIHNpbmNlIHZlcnNpb25zIGNhbiBiZSBlbmNsb3NlZCBpbgogICAgICAgICAgICAgICAgICAgICAgIyB0aGVtLCBhbmQgYSBjb21tYSBzaW5jZSBpdCdzIGEgdmVyc2lvbiBzZXBhcmF0b3IuCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgfQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgIHZlcnNpb24gPSBMZWdhY3lWZXJzaW9uKHN0cih2ZXJzaW9uKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlICE9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDwgc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPiBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKCmRlZiBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUoZm4pOgogICAgQGZ1bmN0b29scy53cmFwcyhmbikKICAgIGRlZiB3cmFwcGVkKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9zcGVjdGl2ZSwgVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBmbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYykKICAgIHJldHVybiB3cmFwcGVkCgoKY2xhc3MgU3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gKAogICAgICAgIHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KH49fD09fCE9fDw9fD49fDx8Pnw9PT0pKQogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGlkZW50aXR5IG9wZXJhdG9ycyBhbGxvdyBmb3IgYW4gZXNjYXBlIGhhdGNoIHRoYXQgd2lsbAogICAgICAgICAgICAgICAgIyBkbyBhbiBleGFjdCBzdHJpbmcgbWF0Y2ggb2YgdGhlIHZlcnNpb24geW91IHdpc2ggdG8gaW5zdGFsbC4KICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIG5vdCBiZSBwYXJzZWQgYnkgUEVQIDQ0MCBhbmQgd2UgY2Fubm90IGRldGVybWluZQogICAgICAgICAgICAgICAgIyBhbnkgc2VtYW50aWMgbWVhbmluZyBmcm9tIGl0LiBUaGlzIG9wZXJhdG9yIGlzIGRpc2NvdXJhZ2VkCiAgICAgICAgICAgICAgICAjIGJ1dCBpbmNsdWRlZCBlbnRpcmVseSBhcyBhbiBlc2NhcGUgaGF0Y2guCiAgICAgICAgICAgICAgICAoPzw9PT09KSAgIyBPbmx5IG1hdGNoIGZvciB0aGUgaWRlbnRpdHkgb3BlcmF0b3IKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgW15cc10qICAgICMgV2UganVzdCBtYXRjaCBldmVyeXRoaW5nLCBleGNlcHQgZm9yIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNpbmNlIHdlIGFyZSBvbmx5IHRlc3RpbmcgZm9yIHN0cmljdCBpZGVudGl0eS4KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIHdpbGQgY2FyZCBhbmQgbG9jYWwKICAgICAgICAgICAgICAgICMgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIHNvIHdlIGhhdmUgdG8gZGVmaW5lIHRoZXNlIHR3bwogICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc2VwYXJhdGVseSB0byBlbmFibGUgdGhhdC4KICAgICAgICAgICAgICAgICg/PD09PXwhPSkgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIGVxdWFscyBhbmQgbm90IGVxdWFscwoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwoKICAgICAgICAgICAgICAgICMgWW91IGNhbm5vdCB1c2UgYSB3aWxkIGNhcmQgYW5kIGEgZGV2IG9yIGxvY2FsIHZlcnNpb24KICAgICAgICAgICAgICAgICMgdG9nZXRoZXIgc28gZ3JvdXAgdGhlbSB3aXRoIGEgfCBhbmQgbWFrZSB0aGVtIG9wdGlvbmFsLgogICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzpcK1thLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKT8gIyBsb2NhbAogICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICBcLlwqICAjIFdpbGQgY2FyZCBzeW50YXggb2YgLioKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGNvbXBhdGlibGUgb3BlcmF0b3IgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGRpZ2l0cyBpbiB0aGUKICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICAgICAgKD88PX49KSAgICAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgdGhlIGNvbXBhdGlibGUgb3BlcmF0b3IKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKyAgICMgcmVsZWFzZSAgKFdlIGhhdmUgYSArIGluc3RlYWQgb2YgYSAqKQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBBbGwgb3RoZXIgb3BlcmF0b3JzIG9ubHkgYWxsb3cgYSBzdWIgc2V0IG9mIHdoYXQgdGhlCiAgICAgICAgICAgICAgICAjIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGRvLiBTcGVjaWZpY2FsbHkgdGhleSBkbyBub3QgYWxsb3cKICAgICAgICAgICAgICAgICMgbG9jYWwgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIG5vciBkbyB0aGV5IGFsbG93IHRoZSBwcmVmaXgKICAgICAgICAgICAgICAgICMgbWF0Y2hpbmcgd2lsZCBjYXJkcy4KICAgICAgICAgICAgICAgICg/PCE9PXwhPXx+PSkgICAgICAgICAjIFdlIGhhdmUgc3BlY2lhbCBjYXNlcyBmb3IgdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtYXRjaCBoZXJlLgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICJ+PSI6ICJjb21wYXRpYmxlIiwKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgICAgICAiPT09IjogImFyYml0cmFyeSIsCiAgICB9CgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2NvbXBhdGlibGUoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29tcGF0aWJsZSByZWxlYXNlcyBoYXZlIGFuIGVxdWl2YWxlbnQgY29tYmluYXRpb24gb2YgPj0gYW5kID09LiBUaGF0CiAgICAgICAgIyBpcyB0aGF0IH49Mi4yIGlzIGVxdWl2YWxlbnQgdG8gPj0yLjIsPT0yLiouIFRoaXMgYWxsb3dzIHVzIHRvCiAgICAgICAgIyBpbXBsZW1lbnQgdGhpcyBpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgc3BlY2lmaWVycyBpbnN0ZWFkIG9mCiAgICAgICAgIyBpbXBsZW1lbnRpbmcgaXQgb3Vyc2VsdmVzLiBUaGUgb25seSB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNvbnN0cnVjdAogICAgICAgICMgdGhlIG90aGVyIHNwZWNpZmllcnMuCgogICAgICAgICMgV2Ugd2FudCBldmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBpdGVtIGluIHRoZSB2ZXJzaW9uLCBidXQgd2Ugd2FudCB0bwogICAgICAgICMgaWdub3JlIHBvc3QgYW5kIGRldiByZWxlYXNlcyBhbmQgd2Ugd2FudCB0byB0cmVhdCB0aGUgcHJlLXJlbGVhc2UgYXMKICAgICAgICAjIGl0J3Mgb3duIHNlcGFyYXRlIHNlZ21lbnQuCiAgICAgICAgcHJlZml4ID0gIi4iLmpvaW4oCiAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICBpdGVydG9vbHMudGFrZXdoaWxlKAogICAgICAgICAgICAgICAgICAgIGxhbWJkYSB4OiAobm90IHguc3RhcnRzd2l0aCgicG9zdCIpIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguc3RhcnRzd2l0aCgiZGV2IikpLAogICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3NwbGl0KHNwZWMpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApWzotMV0KICAgICAgICApCgogICAgICAgICMgQWRkIHRoZSBwcmVmaXggbm90YXRpb24gdG8gdGhlIGVuZCBvZiBvdXIgc3RyaW5nCiAgICAgICAgcHJlZml4ICs9ICIuKiIKCiAgICAgICAgcmV0dXJuIChzZWxmLl9nZXRfb3BlcmF0b3IoIj49IikocHJvc3BlY3RpdmUsIHNwZWMpIGFuZAogICAgICAgICAgICAgICAgc2VsZi5fZ2V0X29wZXJhdG9yKCI9PSIpKHByb3NwZWN0aXZlLCBwcmVmaXgpKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBXZSBuZWVkIHNwZWNpYWwgbG9naWMgdG8gaGFuZGxlIHByZWZpeCBtYXRjaGluZwogICAgICAgIGlmIHNwZWMuZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgcHJlZml4IG1hdGNoaW5nIHdlIHdhbnQgdG8gaWdub3JlIGxvY2FsIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHNwZWMgb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYW4gaW1wbGljaXQKICAgICAgICAgICAgIyBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICBzcGVjID0gX3ZlcnNpb25fc3BsaXQoc3BlY1s6LTJdKSAgIyBSZW1vdmUgdGhlIHRyYWlsaW5nIC4qCgogICAgICAgICAgICAjIFNwbGl0IHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlCiAgICAgICAgICAgICMgaXMgYW4gaW1wbGljaXQgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2UKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IF92ZXJzaW9uX3NwbGl0KHN0cihwcm9zcGVjdGl2ZSkpCgogICAgICAgICAgICAjIFNob3J0ZW4gdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gdG8gYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzcGVjCiAgICAgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZXIgaXMgYSBwcmVmaXggb2YgdGhlCiAgICAgICAgICAgICMgcHJvc3BlY3RpdmUgdmVyc2lvbiBvciBub3QuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gcHJvc3BlY3RpdmVbOmxlbihzcGVjKV0KCiAgICAgICAgICAgICMgUGFkIG91dCBvdXIgdHdvIHNpZGVzIHdpdGggemVyb3Mgc28gdGhhdCB0aGV5IGJvdGggZXF1YWwgdGhlIHNhbWUKICAgICAgICAgICAgIyBsZW5ndGguCiAgICAgICAgICAgIHNwZWMsIHByb3NwZWN0aXZlID0gX3BhZF92ZXJzaW9uKHNwZWMsIHByb3NwZWN0aXZlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQ29udmVydCBvdXIgc3BlYyBzdHJpbmcgaW50byBhIFZlcnNpb24KICAgICAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgICAgICMgSWYgdGhlIHNwZWNpZmllciBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgc2VnbWVudCwgdGhlbiB3ZSB3YW50IHRvCiAgICAgICAgICAgICMgYWN0IGFzIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGFsc28gZG9lcyBub3QgaGF2ZSBhIGxvY2FsCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgaWYgbm90IHNwZWMubG9jYWw6CiAgICAgICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQoKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc3BlYwoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBub3Qgc2VsZi5fY29tcGFyZV9lcXVhbChwcm9zcGVjdGl2ZSwgc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPCBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgcHJlLXJlbGVhc2UKICAgICAgICAjIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllciAoZS5nLiA8My4xIHNob3VsZAogICAgICAgICMgbm90IG1hdGNoIDMuMS5kZXYwLCBidXQgc2hvdWxkIG1hdGNoIDMuMC5kZXYwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wcmVyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGxlc3MgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlIHNhbWUKICAgICAgICAjIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA+IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHBvc3QtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQKICAgICAgICAjIHBvc3QtcmVsZWFzZSB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIKICAgICAgICAjIChlLmcuID4zLjEgc2hvdWxkIG5vdCBtYXRjaCAzLjAucG9zdDAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4yLnBvc3QwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wb3N0cmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcG9zdHJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIGRvIG5vdCBhbGxvdyBhIGxvY2FsIHZlcnNpb24gb2YgdGhlIHZlcnNpb24gbWVudGlvbmVkCiAgICAgICAgIyBpbiB0aGUgc3BlY2lmaWVyLCB3aGljaCBpcyB0ZWNoaW5jYWxseSBncmVhdGVyIHRoYW4sIHRvIG1hdGNoLgogICAgICAgIGlmIHByb3NwZWN0aXZlLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlCiAgICAgICAgIyBzYW1lIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX2NvbXBhcmVfYXJiaXRyYXJ5KHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gc3RyKHByb3NwZWN0aXZlKS5sb3dlcigpID09IHN0cihzcGVjKS5sb3dlcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB0aGVyZSBpcyBhbiBleHBsaWNpdCBwcmVyZWxlYXNlcyBzZXQgZm9yIHRoaXMsIHRoZW4gd2UnbGwganVzdAogICAgICAgICMgYmxpbmRseSB1c2UgdGhhdC4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgTG9vayBhdCBhbGwgb2Ygb3VyIHNwZWNpZmllcnMgYW5kIGRldGVybWluZSBpZiB0aGV5IGFyZSBpbmNsdXNpdmUKICAgICAgICAjIG9wZXJhdG9ycywgYW5kIGlmIHRoZXkgYXJlIGlmIHRoZXkgYXJlIGluY2x1ZGluZyBhbiBleHBsaWNpdAogICAgICAgICMgcHJlcmVsZWFzZS4KICAgICAgICBvcGVyYXRvciwgdmVyc2lvbiA9IHNlbGYuX3NwZWMKICAgICAgICBpZiBvcGVyYXRvciBpbiBbIj09IiwgIj49IiwgIjw9IiwgIn49IiwgIj09PSJdOgogICAgICAgICAgICAjIFRoZSA9PSBzcGVjaWZpZXIgY2FuIGluY2x1ZGUgYSB0cmFpbGluZyAuKiwgaWYgaXQgZG9lcyB3ZQogICAgICAgICAgICAjIHdhbnQgdG8gcmVtb3ZlIGJlZm9yZSBwYXJzaW5nLgogICAgICAgICAgICBpZiBvcGVyYXRvciA9PSAiPT0iIGFuZCB2ZXJzaW9uLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bOi0yXQoKICAgICAgICAgICAgIyBQYXJzZSB0aGUgdmVyc2lvbiwgYW5kIGlmIGl0IGlzIGEgcHJlLXJlbGVhc2UgdGhhbiB0aGlzCiAgICAgICAgICAgICMgc3BlY2lmaWVyIGFsbG93cyBwcmUtcmVsZWFzZXMuCiAgICAgICAgICAgIGlmIHBhcnNlKHZlcnNpb24pLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCgpfcHJlZml4X3JlZ2V4ID0gcmUuY29tcGlsZShyIl4oWzAtOV0rKSgoPzphfGJ8Y3xyYylbMC05XSspJCIpCgoKZGVmIF92ZXJzaW9uX3NwbGl0KHZlcnNpb24pOgogICAgcmVzdWx0ID0gW10KICAgIGZvciBpdGVtIGluIHZlcnNpb24uc3BsaXQoIi4iKToKICAgICAgICBtYXRjaCA9IF9wcmVmaXhfcmVnZXguc2VhcmNoKGl0ZW0pCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJlc3VsdC5leHRlbmQobWF0Y2guZ3JvdXBzKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfcGFkX3ZlcnNpb24obGVmdCwgcmlnaHQpOgogICAgbGVmdF9zcGxpdCwgcmlnaHRfc3BsaXQgPSBbXSwgW10KCiAgICAjIEdldCB0aGUgcmVsZWFzZSBzZWdtZW50IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgbGVmdCkpKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIHJpZ2h0KSkpCgogICAgIyBHZXQgdGhlIHJlc3Qgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsZWZ0W2xlbihsZWZ0X3NwbGl0WzBdKTpdKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKHJpZ2h0W2xlbihyaWdodF9zcGxpdFswXSk6XSkKCiAgICAjIEluc2VydCBvdXIgcGFkZGluZwogICAgbGVmdF9zcGxpdC5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBbIjAiXSAqIG1heCgwLCBsZW4ocmlnaHRfc3BsaXRbMF0pIC0gbGVuKGxlZnRfc3BsaXRbMF0pKSwKICAgICkKICAgIHJpZ2h0X3NwbGl0Lmluc2VydCgKICAgICAgICAxLAogICAgICAgIFsiMCJdICogbWF4KDAsIGxlbihsZWZ0X3NwbGl0WzBdKSAtIGxlbihyaWdodF9zcGxpdFswXSkpLAogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgbGlzdChpdGVydG9vbHMuY2hhaW4oKmxlZnRfc3BsaXQpKSwKICAgICAgICBsaXN0KGl0ZXJ0b29scy5jaGFpbigqcmlnaHRfc3BsaXQpKSwKICAgICkKCgpjbGFzcyBTcGVjaWZpZXJTZXQoQmFzZVNwZWNpZmllcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgU3BsaXQgb24gLCB0byBicmVhayBlYWNoIGluZGlkaXZ1YWwgc3BlY2lmaWVyIGludG8gaXQncyBvd24gaXRlbSwgYW5kCiAgICAgICAgIyBzdHJpcCBlYWNoIGl0ZW0gdG8gcmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgICBzcGVjaWZpZXJzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGVjaWZpZXJzLnNwbGl0KCIsIikgaWYgcy5zdHJpcCgpXQoKICAgICAgICAjIFBhcnNlZCBlYWNoIGluZGl2aWR1YWwgc3BlY2lmaWVyLCBhdHRlbXB0aW5nIGZpcnN0IHRvIG1ha2UgaXQgYQogICAgICAgICMgU3BlY2lmaWVyIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBMZWdhY3lTcGVjaWZpZXIuCiAgICAgICAgcGFyc2VkID0gc2V0KCkKICAgICAgICBmb3Igc3BlY2lmaWVyIGluIHNwZWNpZmllcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoU3BlY2lmaWVyKHNwZWNpZmllcikpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChMZWdhY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkKCiAgICAgICAgIyBUdXJuIG91ciBwYXJzZWQgc3BlY2lmaWVycyBpbnRvIGEgZnJvemVuIHNldCBhbmQgc2F2ZSB0aGVtIGZvciBsYXRlci4KICAgICAgICBzZWxmLl9zcGVjcyA9IGZyb3plbnNldChwYXJzZWQpCgogICAgICAgICMgU3RvcmUgb3VyIHByZXJlbGVhc2VzIHZhbHVlIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIGlmCiAgICAgICAgIyB3ZSBhY2NlcHQgcHJlcmVsZWFzZXMgb3Igbm90LgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPFNwZWNpZmllclNldCh7MCFyfXsxfSk+Ii5mb3JtYXQoc3RyKHNlbGYpLCBwcmUpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIsIi5qb2luKHNvcnRlZChzdHIocykgZm9yIHMgaW4gc2VsZi5fc3BlY3MpKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjcykKCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHNwZWNpZmllciA9IFNwZWNpZmllclNldCgpCiAgICAgICAgc3BlY2lmaWVyLl9zcGVjcyA9IGZyb3plbnNldChzZWxmLl9zcGVjcyB8IG90aGVyLl9zcGVjcykKCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gb3RoZXIuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgPT0gb3RoZXIuX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCBjb21iaW5lIFNwZWNpZmllclNldHMgd2l0aCBUcnVlIGFuZCBGYWxzZSBwcmVyZWxlYXNlICIKICAgICAgICAgICAgICAgICJvdmVycmlkZXMuIgogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBzcGVjaWZpZXIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzID09IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgIT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zcGVjcykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fc3BlY3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYW4gZXhwbGljaXQgcHJlcmVsZWFzZSBtb2RpZmllciwgdGhlbiB3ZSdsbAogICAgICAgICMgcGFzcyB0aGF0IHRocm91Z2ggaGVyZS4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgYW5kIHdlIGRvbid0IGhhdmUgYSBmb3JjZWQgdmFsdWUsCiAgICAgICAgIyB0aGVuIHdlJ2xsIGp1c3QgcmV0dXJuIE5vbmUgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHNob3VsZCBoYXZlCiAgICAgICAgIyBwcmUtcmVsZWFzZXMgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLl9zcGVjczoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBPdGhlcndpc2Ugd2UnbGwgc2VlIGlmIGFueSBvZiB0aGUgZ2l2ZW4gc3BlY2lmaWVycyBhY2NlcHQKICAgICAgICAjIHByZXJlbGVhc2VzLCBpZiBhbnkgb2YgdGhlbSBkbyB3ZSdsbCByZXR1cm4gVHJ1ZSwgb3RoZXJ3aXNlIEZhbHNlLgogICAgICAgIHJldHVybiBhbnkocy5wcmVyZWxlYXNlcyBmb3IgcyBpbiBzZWxmLl9zcGVjcykKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRW5zdXJlIHRoYXQgb3VyIGl0ZW0gaXMgYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24gaW5zdGFuY2UuCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgaXRlbSA9IHBhcnNlKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIFdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgZ29pbmcgdG8gYWxsb3cgcHJlLXJlbGVhc2VzIGJ5IGxvb2tpbmcgdG8KICAgICAgICAjIHNlZSBpZiBhbnkgb2YgdGhlIHVuZGVybHlpbmcgaXRlbXMgc3VwcG9ydHMgdGhlbS4gSWYgbm9uZSBvZiB0aGVtIGRvCiAgICAgICAgIyBhbmQgdGhpcyBpdGVtIGlzIGEgcHJlLXJlbGVhc2UgdGhlbiB3ZSBkbyBub3QgYWxsb3cgaXQgYW5kIHdlIGNhbgogICAgICAgICMgc2hvcnQgY2lyY3VpdCB0aGF0IGhlcmUuCiAgICAgICAgIyBOb3RlOiBUaGlzIG1lYW5zIHRoYXQgMS4wLmRldjEgd291bGQgbm90IGJlIGNvbnRhaW5lZCBpbiBzb21ldGhpbmcKICAgICAgICAjICAgICAgIGxpa2UgPj0xLjAuZGV2YWJjIGhvd2V2ZXIgaXQgd291bGQgYmUgaW4gPj0xLjAuZGViYWJjLD4wLjAuZGV2MAogICAgICAgIGlmIG5vdCBwcmVyZWxlYXNlcyBhbmQgaXRlbS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBXZSBzaW1wbHkgZGlzcGF0Y2ggdG8gdGhlIHVuZGVybHlpbmcgc3BlY3MgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUKICAgICAgICAjIGdpdmVuIHZlcnNpb24gaXMgY29udGFpbmVkIHdpdGhpbiBhbGwgb2YgdGhlbS4KICAgICAgICAjIE5vdGU6IFRoaXMgdXNlIG9mIGFsbCgpIGhlcmUgbWVhbnMgdGhhdCBhbiBlbXB0eSBzZXQgb2Ygc3BlY2lmaWVycwogICAgICAgICMgICAgICAgd2lsbCBhbHdheXMgcmV0dXJuIFRydWUsIHRoaXMgaXMgYW4gZXhwbGljaXQgZGVzaWduIGRlY2lzaW9uLgogICAgICAgIHJldHVybiBhbGwoCiAgICAgICAgICAgIHMuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGZvciBzIGluIHNlbGYuX3NwZWNzCiAgICAgICAgKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2Ugd2FudCB0byB3cmFwIG91ciBpdGVyYWJsZSBpbiB0aGUKICAgICAgICAjIGZpbHRlciBtZXRob2QgZm9yIGVhY2ggb25lLCB0aGlzIHdpbGwgYWN0IGFzIGEgbG9naWNhbCBBTkQgYW1vbmdzdAogICAgICAgICMgZWFjaCBzcGVjaWZpZXIuCiAgICAgICAgaWYgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIGZvciBzcGVjIGluIHNlbGYuX3NwZWNzOgogICAgICAgICAgICAgICAgaXRlcmFibGUgPSBzcGVjLmZpbHRlcihpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Ym9vbChwcmVyZWxlYXNlcykpCiAgICAgICAgICAgIHJldHVybiBpdGVyYWJsZQogICAgICAgICMgSWYgd2UgZG8gbm90IGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2UgbmVlZCB0byBoYXZlIGEgcm91Z2ggZmlsdGVyCiAgICAgICAgIyB3aGljaCB3aWxsIGZpbHRlciBvdXQgYW55IHByZS1yZWxlYXNlcywgdW5sZXNzIHRoZXJlIGFyZSBubyBmaW5hbAogICAgICAgICMgcmVsZWFzZXMsIGFuZCB3aGljaCB3aWxsIGZpbHRlciBvdXQgTGVnYWN5VmVyc2lvbiBpbiBnZW5lcmFsLgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbHRlcmVkID0gW10KICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlcmFibGU6CiAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIHNvbWUga2luZCBvZiBWZXJzaW9uIGNsYXNzIGZvciB0aGlzIGl0ZW0uCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gcGFyc2UoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBpdGVtCgogICAgICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IGFueSBpdGVtIHdoaWNoIGlzIHBhcnNlZCBhcyBhIExlZ2FjeVZlcnNpb24KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgIyBTdG9yZSBhbnkgaXRlbSB3aGljaCBpcyBhIHByZS1yZWxlYXNlIGZvciBsYXRlciB1bmxlc3Mgd2UndmUKICAgICAgICAgICAgICAgICMgYWxyZWFkeSBmb3VuZCBhIGZpbmFsIHZlcnNpb24gb3Igd2UgYXJlIGFjY2VwdGluZyBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgaWYgcGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZDoKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZChpdGVtKQoKICAgICAgICAgICAgIyBJZiB3ZSd2ZSBmb3VuZCBubyBpdGVtcyBleGNlcHQgZm9yIHByZS1yZWxlYXNlcywgdGhlbiB3ZSdsbCBnbwogICAgICAgICAgICAjIGFoZWFkIGFuZCB1c2UgdGhlIHByZS1yZWxlYXNlcwogICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzIGFuZCBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kX3ByZXJlbGVhc2VzCgogICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQKUEsDBBQAAAAAAAAAIQDF6icPpQEAAKUBAABNAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgcmUKCgpfY2Fub25pY2FsaXplX3JlZ2V4ID0gcmUuY29tcGlsZShyIlstXy5dKyIpCgoKZGVmIGNhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpOgogICAgIyBUaGlzIGlzIHRha2VuIGZyb20gUEVQIDUwMy4KICAgIHJldHVybiBfY2Fub25pY2FsaXplX3JlZ2V4LnN1YigiLSIsIG5hbWUpLmxvd2VyKCkKUEsDBBQAAAAAAAAAIQAO78ahJC0AACQtAABPAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX3N0cnVjdHVyZXMgaW1wb3J0IEluZmluaXR5CgoKX19hbGxfXyA9IFsKICAgICJwYXJzZSIsICJWZXJzaW9uIiwgIkxlZ2FjeVZlcnNpb24iLCAiSW52YWxpZFZlcnNpb24iLCAiVkVSU0lPTl9QQVRURVJOIgpdCgoKX1ZlcnNpb24gPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKAogICAgIl9WZXJzaW9uIiwKICAgIFsiZXBvY2giLCAicmVsZWFzZSIsICJkZXYiLCAicHJlIiwgInBvc3QiLCAibG9jYWwiXSwKKQoKCmRlZiBwYXJzZSh2ZXJzaW9uKToKICAgICIiIgogICAgUGFyc2UgdGhlIGdpdmVuIHZlcnNpb24gc3RyaW5nIGFuZCByZXR1cm4gZWl0aGVyIGEgOmNsYXNzOmBWZXJzaW9uYCBvYmplY3QKICAgIG9yIGEgOmNsYXNzOmBMZWdhY3lWZXJzaW9uYCBvYmplY3QgZGVwZW5kaW5nIG9uIGlmIHRoZSBnaXZlbiB2ZXJzaW9uIGlzCiAgICBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiBvciBhIGxlZ2FjeSB2ZXJzaW9uLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFZlcnNpb24odmVyc2lvbikKICAgIGV4Y2VwdCBJbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gTGVnYWN5VmVyc2lvbih2ZXJzaW9uKQoKCmNsYXNzIEludmFsaWRWZXJzaW9uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHZlcnNpb24gd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIF9CYXNlVmVyc2lvbihvYmplY3QpOgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9rZXkpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDwgbykKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPD0gbykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPT0gbykKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPj0gbykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPiBvKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyAhPSBvKQoKICAgIGRlZiBfY29tcGFyZShzZWxmLCBvdGhlciwgbWV0aG9kKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBtZXRob2Qoc2VsZi5fa2V5LCBvdGhlci5fa2V5KQoKCmNsYXNzIExlZ2FjeVZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHN0cih2ZXJzaW9uKQogICAgICAgIHNlbGYuX2tleSA9IF9sZWdhY3lfY21wa2V5KHNlbGYuX3ZlcnNpb24pCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TGVnYWN5VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUoCiAgICByIihcZCsgfCBbYS16XSsgfCBcLnwgLSkiLCByZS5WRVJCT1NFLAopCgpfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwID0gewogICAgInByZSI6ICJjIiwgInByZXZpZXciOiAiYyIsICItIjogImZpbmFsLSIsICJyYyI6ICJjIiwgImRldiI6ICJAIiwKfQoKCmRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKICAgIGZvciBwYXJ0IGluIF9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUuc3BsaXQocyk6CiAgICAgICAgcGFydCA9IF9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAuZ2V0KHBhcnQsIHBhcnQpCgogICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQgPT0gIi4iOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBwYXJ0WzoxXSBpbiAiMDEyMzQ1Njc4OSI6CiAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkICIqIiArIHBhcnQKCiAgICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKICAgIHlpZWxkICIqZmluYWwiCgoKZGVmIF9sZWdhY3lfY21wa2V5KHZlcnNpb24pOgogICAgIyBXZSBoYXJkY29kZSBhbiBlcG9jaCBvZiAtMSBoZXJlLiBBIFBFUCA0NDAgdmVyc2lvbiBjYW4gb25seSBoYXZlIGEgZXBvY2gKICAgICMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuIFRoaXMgd2lsbCBlZmZlY3RpdmVseSBwdXQgdGhlIExlZ2FjeVZlcnNpb24sCiAgICAjIHdoaWNoIHVzZXMgdGhlIGRlZmFjdG8gc3RhbmRhcmQgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBieSBzZXR1cHRvb2xzLAogICAgIyBhcyBiZWZvcmUgYWxsIFBFUCA0NDAgdmVyc2lvbnMuCiAgICBlcG9jaCA9IC0xCgogICAgIyBUaGlzIHNjaGVtZSBpcyB0YWtlbiBmcm9tIHBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbiBzZXR1cHRvb2xzIHByaW9yIHRvCiAgICAjIGl0J3MgYWRvcHRpb24gb2YgdGhlIHBhY2thZ2luZyBsaWJyYXJ5LgogICAgcGFydHMgPSBbXQogICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHModmVyc2lvbi5sb3dlcigpKToKICAgICAgICBpZiBwYXJ0LnN0YXJ0c3dpdGgoIioiKToKICAgICAgICAgICAgIyByZW1vdmUgIi0iIGJlZm9yZSBhIHByZXJlbGVhc2UgdGFnCiAgICAgICAgICAgIGlmIHBhcnQgPCAiKmZpbmFsIjoKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIipmaW5hbC0iOgogICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiMDAwMDAwMDAiOgogICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICBwYXJ0cyA9IHR1cGxlKHBhcnRzKQoKICAgIHJldHVybiBlcG9jaCwgcGFydHMKCiMgRGVsaWJlcmF0ZWx5IG5vdCBhbmNob3JlZCB0byB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nLCB0byBtYWtlIGl0CiMgZWFzaWVyIGZvciAzcmQgcGFydHkgY29kZSB0byByZXVzZQpWRVJTSU9OX1BBVFRFUk4gPSByIiIiCiAgICB2PwogICAgKD86CiAgICAgICAgKD86KD9QPGVwb2NoPlswLTldKykhKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVwb2NoCiAgICAgICAgKD9QPHJlbGVhc2U+WzAtOV0rKD86XC5bMC05XSspKikgICAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudAogICAgICAgICg/UDxwcmU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmUtcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbD4oYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICAgICAoP1A8cG9zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICg/Oi0oP1A8cG9zdF9uMT5bMC05XSspKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbD5wb3N0fHJldnxyKQogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbjI+WzAtOV0rKT8KICAgICAgICAgICAgKQogICAgICAgICk/CiAgICAgICAgKD9QPGRldj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9sPmRldikKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X24+WzAtOV0rKT8KICAgICAgICApPwogICAgKQogICAgKD86XCsoP1A8bG9jYWw+W2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopKT8gICAgICAgIyBsb2NhbCB2ZXJzaW9uCiIiIgoKCmNsYXNzIFZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBWRVJTSU9OX1BBVFRFUk4gKyByIlxzKiQiLAogICAgICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFLAogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAjIFZhbGlkYXRlIHRoZSB2ZXJzaW9uIGFuZCBwYXJzZSBpdCBpbnRvIHBpZWNlcwogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHZlcnNpb24pCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVmVyc2lvbigiSW52YWxpZCB2ZXJzaW9uOiAnezB9JyIuZm9ybWF0KHZlcnNpb24pKQoKICAgICAgICAjIFN0b3JlIHRoZSBwYXJzZWQgb3V0IHBpZWNlcyBvZiB0aGUgdmVyc2lvbgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBfVmVyc2lvbigKICAgICAgICAgICAgZXBvY2g9aW50KG1hdGNoLmdyb3VwKCJlcG9jaCIpKSBpZiBtYXRjaC5ncm91cCgiZXBvY2giKSBlbHNlIDAsCiAgICAgICAgICAgIHJlbGVhc2U9dHVwbGUoaW50KGkpIGZvciBpIGluIG1hdGNoLmdyb3VwKCJyZWxlYXNlIikuc3BsaXQoIi4iKSksCiAgICAgICAgICAgIHByZT1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicHJlX2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBwb3N0PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X24xIikgb3IgbWF0Y2guZ3JvdXAoInBvc3RfbjIiKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgZGV2PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJkZXZfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGxvY2FsPV9wYXJzZV9sb2NhbF92ZXJzaW9uKG1hdGNoLmdyb3VwKCJsb2NhbCIpKSwKICAgICAgICApCgogICAgICAgICMgR2VuZXJhdGUgYSBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBzb3J0aW5nCiAgICAgICAgc2VsZi5fa2V5ID0gX2NtcGtleSgKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5lcG9jaCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5yZWxlYXNlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnByZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wb3N0LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmRldiwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5sb2NhbCwKICAgICAgICApCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgICMgUHJlLXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnByZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIiLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucHJlKSkKCiAgICAgICAgIyBQb3N0LXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnBvc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLnBvc3R7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLnBvc3RbMV0pKQoKICAgICAgICAjIERldmVsb3BtZW50IHJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmRldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIuZGV2ezB9Ii5mb3JtYXQoc2VsZi5fdmVyc2lvbi5kZXZbMV0pKQoKICAgICAgICAjIExvY2FsIHZlcnNpb24gc2VnbWVudAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICIrezB9Ii5mb3JtYXQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ubG9jYWwpKQogICAgICAgICAgICApCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpLnNwbGl0KCIrIiwgMSlbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHZlcnNpb25fc3RyaW5nID0gc3RyKHNlbGYpCiAgICAgICAgaWYgIisiIGluIHZlcnNpb25fc3RyaW5nOgogICAgICAgICAgICByZXR1cm4gdmVyc2lvbl9zdHJpbmcuc3BsaXQoIisiLCAxKVsxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5kZXYgb3Igc2VsZi5fdmVyc2lvbi5wcmUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5wb3N0KQoKCmRlZiBfcGFyc2VfbGV0dGVyX3ZlcnNpb24obGV0dGVyLCBudW1iZXIpOgogICAgaWYgbGV0dGVyOgogICAgICAgICMgV2UgY29uc2lkZXIgdGhlcmUgdG8gYmUgYW4gaW1wbGljaXQgMCBpbiBhIHByZS1yZWxlYXNlIGlmIHRoZXJlIGlzCiAgICAgICAgIyBub3QgYSBudW1lcmFsIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgICBpZiBudW1iZXIgaXMgTm9uZToKICAgICAgICAgICAgbnVtYmVyID0gMAoKICAgICAgICAjIFdlIG5vcm1hbGl6ZSBhbnkgbGV0dGVycyB0byB0aGVpciBsb3dlciBjYXNlIGZvcm0KICAgICAgICBsZXR0ZXIgPSBsZXR0ZXIubG93ZXIoKQoKICAgICAgICAjIFdlIGNvbnNpZGVyIHNvbWUgd29yZHMgdG8gYmUgYWx0ZXJuYXRlIHNwZWxsaW5ncyBvZiBvdGhlciB3b3JkcyBhbmQKICAgICAgICAjIGluIHRob3NlIGNhc2VzIHdlIHdhbnQgdG8gbm9ybWFsaXplIHRoZSBzcGVsbGluZ3MgdG8gb3VyIHByZWZlcnJlZAogICAgICAgICMgc3BlbGxpbmcuCiAgICAgICAgaWYgbGV0dGVyID09ICJhbHBoYSI6CiAgICAgICAgICAgIGxldHRlciA9ICJhIgogICAgICAgIGVsaWYgbGV0dGVyID09ICJiZXRhIjoKICAgICAgICAgICAgbGV0dGVyID0gImIiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJjIiwgInByZSIsICJwcmV2aWV3Il06CiAgICAgICAgICAgIGxldHRlciA9ICJyYyIKICAgICAgICBlbGlmIGxldHRlciBpbiBbInJldiIsICJyIl06CiAgICAgICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQogICAgaWYgbm90IGxldHRlciBhbmQgbnVtYmVyOgogICAgICAgICMgV2UgYXNzdW1lIGlmIHdlIGFyZSBnaXZlbiBhIG51bWJlciwgYnV0IHdlIGFyZSBub3QgZ2l2ZW4gYSBsZXR0ZXIKICAgICAgICAjIHRoZW4gdGhpcyBpcyB1c2luZyB0aGUgaW1wbGljaXQgcG9zdCByZWxlYXNlIHN5bnRheCAoZS5nLiAxLjAtMSkKICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKCgpfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzID0gcmUuY29tcGlsZShyIltcLl8tXSIpCgoKZGVmIF9wYXJzZV9sb2NhbF92ZXJzaW9uKGxvY2FsKToKICAgICIiIgogICAgVGFrZXMgYSBzdHJpbmcgbGlrZSBhYmMuMS50d2VsdmUgYW5kIHR1cm5zIGl0IGludG8gKCJhYmMiLCAxLCAidHdlbHZlIikuCiAgICAiIiIKICAgIGlmIGxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgIHJldHVybiB0dXBsZSgKICAgICAgICAgICAgcGFydC5sb3dlcigpIGlmIG5vdCBwYXJ0LmlzZGlnaXQoKSBlbHNlIGludChwYXJ0KQogICAgICAgICAgICBmb3IgcGFydCBpbiBfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzLnNwbGl0KGxvY2FsKQogICAgICAgICkKCgpkZWYgX2NtcGtleShlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsKToKICAgICMgV2hlbiB3ZSBjb21wYXJlIGEgcmVsZWFzZSB2ZXJzaW9uLCB3ZSB3YW50IHRvIGNvbXBhcmUgaXQgd2l0aCBhbGwgb2YgdGhlCiAgICAjIHRyYWlsaW5nIHplcm9zIHJlbW92ZWQuIFNvIHdlJ2xsIHVzZSBhIHJldmVyc2UgdGhlIGxpc3QsIGRyb3AgYWxsIHRoZSBub3cKICAgICMgbGVhZGluZyB6ZXJvcyB1bnRpbCB3ZSBjb21lIHRvIHNvbWV0aGluZyBub24gemVybywgdGhlbiB0YWtlIHRoZSByZXN0CiAgICAjIHJlLXJldmVyc2UgaXQgYmFjayBpbnRvIHRoZSBjb3JyZWN0IG9yZGVyIGFuZCBtYWtlIGl0IGEgdHVwbGUgYW5kIHVzZQogICAgIyB0aGF0IGZvciBvdXIgc29ydGluZyBrZXkuCiAgICByZWxlYXNlID0gdHVwbGUoCiAgICAgICAgcmV2ZXJzZWQobGlzdCgKICAgICAgICAgICAgaXRlcnRvb2xzLmRyb3B3aGlsZSgKICAgICAgICAgICAgICAgIGxhbWJkYSB4OiB4ID09IDAsCiAgICAgICAgICAgICAgICByZXZlcnNlZChyZWxlYXNlKSwKICAgICAgICAgICAgKQogICAgICAgICkpCiAgICApCgogICAgIyBXZSBuZWVkIHRvICJ0cmljayIgdGhlIHNvcnRpbmcgYWxnb3JpdGhtIHRvIHB1dCAxLjAuZGV2MCBiZWZvcmUgMS4wYTAuCiAgICAjIFdlJ2xsIGRvIHRoaXMgYnkgYWJ1c2luZyB0aGUgcHJlIHNlZ21lbnQsIGJ1dCB3ZSBfb25seV8gd2FudCB0byBkbyB0aGlzCiAgICAjIGlmIHRoZXJlIGlzIG5vdCBhIHByZSBvciBhIHBvc3Qgc2VnbWVudC4gSWYgd2UgaGF2ZSBvbmUgb2YgdGhvc2UgdGhlbgogICAgIyB0aGUgbm9ybWFsIHNvcnRpbmcgcnVsZXMgd2lsbCBoYW5kbGUgdGhpcyBjYXNlIGNvcnJlY3RseS4KICAgIGlmIHByZSBpcyBOb25lIGFuZCBwb3N0IGlzIE5vbmUgYW5kIGRldiBpcyBub3QgTm9uZToKICAgICAgICBwcmUgPSAtSW5maW5pdHkKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHByZS1yZWxlYXNlIChleGNlcHQgYXMgbm90ZWQgYWJvdmUpIHNob3VsZCBzb3J0IGFmdGVyCiAgICAjIHRob3NlIHdpdGggb25lLgogICAgZWxpZiBwcmUgaXMgTm9uZToKICAgICAgICBwcmUgPSBJbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHBvc3Qgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBwb3N0IGlzIE5vbmU6CiAgICAgICAgcG9zdCA9IC1JbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGRldmVsb3BtZW50IHNlZ21lbnQgc2hvdWxkIHNvcnQgYWZ0ZXIgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBkZXYgaXMgTm9uZToKICAgICAgICBkZXYgPSBJbmZpbml0eQoKICAgIGlmIGxvY2FsIGlzIE5vbmU6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgbG9jYWwgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICAgICAgbG9jYWwgPSAtSW5maW5pdHkKICAgIGVsc2U6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRoIGEgbG9jYWwgc2VnbWVudCBuZWVkIHRoYXQgc2VnbWVudCBwYXJzZWQgdG8gaW1wbGVtZW50CiAgICAgICAgIyB0aGUgc29ydGluZyBydWxlcyBpbiBQRVA0NDAuCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBiZWZvcmUgbnVtZXJpYyBzZWdtZW50cwogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgbGV4aWNvZ3JhcGhpY2FsbHkKICAgICAgICAjIC0gTnVtZXJpYyBzZWdtZW50cyBzb3J0IG51bWVyaWNhbGx5CiAgICAgICAgIyAtIFNob3J0ZXIgdmVyc2lvbnMgc29ydCBiZWZvcmUgbG9uZ2VyIHZlcnNpb25zIHdoZW4gdGhlIHByZWZpeGVzCiAgICAgICAgIyAgIG1hdGNoIGV4YWN0bHkKICAgICAgICBsb2NhbCA9IHR1cGxlKAogICAgICAgICAgICAoaSwgIiIpIGlmIGlzaW5zdGFuY2UoaSwgaW50KSBlbHNlICgtSW5maW5pdHksIGkpCiAgICAgICAgICAgIGZvciBpIGluIGxvY2FsCiAgICAgICAgKQoKICAgIHJldHVybiBlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsClBLAwQUAAAAAAAAACEAeCgUw+uBAwDrgQMARwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcHlwYXJzaW5nLnB5IyBtb2R1bGUgcHlwYXJzaW5nLnB5DQojDQojIENvcHlyaWdodCAoYykgMjAwMy0yMDE2ICBQYXVsIFQuIE1jR3VpcmUNCiMNCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nDQojIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQ0KIyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nDQojIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwNCiMgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvDQojIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bw0KIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQojDQojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlDQojIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KIw0KIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCiMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GDQojIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4NCiMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkNCiMgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwNCiMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUNCiMgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQojDQoNCl9fZG9jX18gPSBcDQoiIiINCnB5cGFyc2luZyBtb2R1bGUgLSBDbGFzc2VzIGFuZCBtZXRob2RzIHRvIGRlZmluZSBhbmQgZXhlY3V0ZSBwYXJzaW5nIGdyYW1tYXJzDQoNClRoZSBweXBhcnNpbmcgbW9kdWxlIGlzIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNyZWF0aW5nIGFuZCBleGVjdXRpbmcgc2ltcGxlIGdyYW1tYXJzLA0KdnMuIHRoZSB0cmFkaXRpb25hbCBsZXgveWFjYyBhcHByb2FjaCwgb3IgdGhlIHVzZSBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2l0aCBweXBhcnNpbmcsIHlvdQ0KZG9uJ3QgbmVlZCB0byBsZWFybiBhIG5ldyBzeW50YXggZm9yIGRlZmluaW5nIGdyYW1tYXJzIG9yIG1hdGNoaW5nIGV4cHJlc3Npb25zIC0gdGhlIHBhcnNpbmcgbW9kdWxlDQpwcm92aWRlcyBhIGxpYnJhcnkgb2YgY2xhc3NlcyB0aGF0IHlvdSB1c2UgdG8gY29uc3RydWN0IHRoZSBncmFtbWFyIGRpcmVjdGx5IGluIFB5dGhvbi4NCg0KSGVyZSBpcyBhIHByb2dyYW0gdG8gcGFyc2UgIkhlbGxvLCBXb3JsZCEiIChvciBhbnkgZ3JlZXRpbmcgb2YgdGhlIGZvcm0gDQpDeyI8c2FsdXRhdGlvbj4sIDxhZGRyZXNzZWU+ISJ9KSwgYnVpbHQgdXAgdXNpbmcgTHtXb3JkfSwgTHtMaXRlcmFsfSwgYW5kIEx7QW5kfSBlbGVtZW50cyANCihMeycrJzxQYXJzZXJFbGVtZW50Ll9fYWRkX18+fSBvcGVyYXRvciBnaXZlcyBMe0FuZH0gZXhwcmVzc2lvbnMsIHN0cmluZ3MgYXJlIGF1dG8tY29udmVydGVkIHRvDQpMe0xpdGVyYWx9IGV4cHJlc3Npb25zKTo6DQoNCiAgICBmcm9tIHB5cGFyc2luZyBpbXBvcnQgV29yZCwgYWxwaGFzDQoNCiAgICAjIGRlZmluZSBncmFtbWFyIG9mIGEgZ3JlZXRpbmcNCiAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIg0KDQogICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISINCiAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkNCg0KVGhlIHByb2dyYW0gb3V0cHV0cyB0aGUgZm9sbG93aW5nOjoNCg0KICAgIEhlbGxvLCBXb3JsZCEgLT4gWydIZWxsbycsICcsJywgJ1dvcmxkJywgJyEnXQ0KDQpUaGUgUHl0aG9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFtbWFyIGlzIHF1aXRlIHJlYWRhYmxlLCBvd2luZyB0byB0aGUgc2VsZi1leHBsYW5hdG9yeQ0KY2xhc3MgbmFtZXMsIGFuZCB0aGUgdXNlIG9mICcrJywgJ3wnIGFuZCAnXicgb3BlcmF0b3JzLg0KDQpUaGUgTHtQYXJzZVJlc3VsdHN9IG9iamVjdCByZXR1cm5lZCBmcm9tIEx7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZzxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gY2FuIGJlIGFjY2Vzc2VkIGFzIGEgbmVzdGVkIGxpc3QsIGEgZGljdGlvbmFyeSwgb3IgYW4NCm9iamVjdCB3aXRoIG5hbWVkIGF0dHJpYnV0ZXMuDQoNClRoZSBweXBhcnNpbmcgbW9kdWxlIGhhbmRsZXMgc29tZSBvZiB0aGUgcHJvYmxlbXMgdGhhdCBhcmUgdHlwaWNhbGx5IHZleGluZyB3aGVuIHdyaXRpbmcgdGV4dCBwYXJzZXJzOg0KIC0gZXh0cmEgb3IgbWlzc2luZyB3aGl0ZXNwYWNlICh0aGUgYWJvdmUgcHJvZ3JhbSB3aWxsIGFsc28gaGFuZGxlICJIZWxsbyxXb3JsZCEiLCAiSGVsbG8gICwgIFdvcmxkICAhIiwgZXRjLikNCiAtIHF1b3RlZCBzdHJpbmdzDQogLSBlbWJlZGRlZCBjb21tZW50cw0KIiIiDQoNCl9fdmVyc2lvbl9fID0gIjIuMS4xMCINCl9fdmVyc2lvblRpbWVfXyA9ICIwNyBPY3QgMjAxNiAwMTozMSBVVEMiDQpfX2F1dGhvcl9fID0gIlBhdWwgTWNHdWlyZSA8cHRtY2dAdXNlcnMuc291cmNlZm9yZ2UubmV0PiINCg0KaW1wb3J0IHN0cmluZw0KZnJvbSB3ZWFrcmVmIGltcG9ydCByZWYgYXMgd2tyZWYNCmltcG9ydCBjb3B5DQppbXBvcnQgc3lzDQppbXBvcnQgd2FybmluZ3MNCmltcG9ydCByZQ0KaW1wb3J0IHNyZV9jb25zdGFudHMNCmltcG9ydCBjb2xsZWN0aW9ucw0KaW1wb3J0IHBwcmludA0KaW1wb3J0IHRyYWNlYmFjaw0KaW1wb3J0IHR5cGVzDQpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQ0KDQp0cnk6DQogICAgZnJvbSBfdGhyZWFkIGltcG9ydCBSTG9jaw0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBSTG9jaw0KDQp0cnk6DQogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0DQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgdHJ5Og0KICAgICAgICBmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QNCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgICAgIF9PcmRlcmVkRGljdCA9IE5vbmUNCg0KI34gc3lzLnN0ZGVyci53cml0ZSggInRlc3RpbmcgcHlwYXJzaW5nIG1vZHVsZSwgdmVyc2lvbiAlcywgJXNcbiIgJSAoX192ZXJzaW9uX18sX192ZXJzaW9uVGltZV9fICkgKQ0KDQpfX2FsbF9fID0gWw0KJ0FuZCcsICdDYXNlbGVzc0tleXdvcmQnLCAnQ2FzZWxlc3NMaXRlcmFsJywgJ0NoYXJzTm90SW4nLCAnQ29tYmluZScsICdEaWN0JywgJ0VhY2gnLCAnRW1wdHknLA0KJ0ZvbGxvd2VkQnknLCAnRm9yd2FyZCcsICdHb1RvQ29sdW1uJywgJ0dyb3VwJywgJ0tleXdvcmQnLCAnTGluZUVuZCcsICdMaW5lU3RhcnQnLCAnTGl0ZXJhbCcsDQonTWF0Y2hGaXJzdCcsICdOb01hdGNoJywgJ05vdEFueScsICdPbmVPck1vcmUnLCAnT25seU9uY2UnLCAnT3B0aW9uYWwnLCAnT3InLA0KJ1BhcnNlQmFzZUV4Y2VwdGlvbicsICdQYXJzZUVsZW1lbnRFbmhhbmNlJywgJ1BhcnNlRXhjZXB0aW9uJywgJ1BhcnNlRXhwcmVzc2lvbicsICdQYXJzZUZhdGFsRXhjZXB0aW9uJywNCidQYXJzZVJlc3VsdHMnLCAnUGFyc2VTeW50YXhFeGNlcHRpb24nLCAnUGFyc2VyRWxlbWVudCcsICdRdW90ZWRTdHJpbmcnLCAnUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbicsDQonUmVnZXgnLCAnU2tpcFRvJywgJ1N0cmluZ0VuZCcsICdTdHJpbmdTdGFydCcsICdTdXBwcmVzcycsICdUb2tlbicsICdUb2tlbkNvbnZlcnRlcicsIA0KJ1doaXRlJywgJ1dvcmQnLCAnV29yZEVuZCcsICdXb3JkU3RhcnQnLCAnWmVyb09yTW9yZScsDQonYWxwaGFudW1zJywgJ2FscGhhcycsICdhbHBoYXM4Yml0JywgJ2FueUNsb3NlVGFnJywgJ2FueU9wZW5UYWcnLCAnY1N0eWxlQ29tbWVudCcsICdjb2wnLA0KJ2NvbW1hU2VwYXJhdGVkTGlzdCcsICdjb21tb25IVE1MRW50aXR5JywgJ2NvdW50ZWRBcnJheScsICdjcHBTdHlsZUNvbW1lbnQnLCAnZGJsUXVvdGVkU3RyaW5nJywNCidkYmxTbGFzaENvbW1lbnQnLCAnZGVsaW1pdGVkTGlzdCcsICdkaWN0T2YnLCAnZG93bmNhc2VUb2tlbnMnLCAnZW1wdHknLCAnaGV4bnVtcycsDQonaHRtbENvbW1lbnQnLCAnamF2YVN0eWxlQ29tbWVudCcsICdsaW5lJywgJ2xpbmVFbmQnLCAnbGluZVN0YXJ0JywgJ2xpbmVubycsDQonbWFrZUhUTUxUYWdzJywgJ21ha2VYTUxUYWdzJywgJ21hdGNoT25seUF0Q29sJywgJ21hdGNoUHJldmlvdXNFeHByJywgJ21hdGNoUHJldmlvdXNMaXRlcmFsJywNCiduZXN0ZWRFeHByJywgJ251bGxEZWJ1Z0FjdGlvbicsICdudW1zJywgJ29uZU9mJywgJ29wQXNzb2MnLCAnb3BlcmF0b3JQcmVjZWRlbmNlJywgJ3ByaW50YWJsZXMnLA0KJ3B1bmM4Yml0JywgJ3B5dGhvblN0eWxlQ29tbWVudCcsICdxdW90ZWRTdHJpbmcnLCAncmVtb3ZlUXVvdGVzJywgJ3JlcGxhY2VIVE1MRW50aXR5JywgDQoncmVwbGFjZVdpdGgnLCAncmVzdE9mTGluZScsICdzZ2xRdW90ZWRTdHJpbmcnLCAnc3JhbmdlJywgJ3N0cmluZ0VuZCcsDQonc3RyaW5nU3RhcnQnLCAndHJhY2VQYXJzZUFjdGlvbicsICd1bmljb2RlU3RyaW5nJywgJ3VwY2FzZVRva2VucycsICd3aXRoQXR0cmlidXRlJywNCidpbmRlbnRlZEJsb2NrJywgJ29yaWdpbmFsVGV4dEZvcicsICd1bmdyb3VwJywgJ2luZml4Tm90YXRpb24nLCdsb2NhdGVkRXhwcicsICd3aXRoQ2xhc3MnLA0KJ0Nsb3NlTWF0Y2gnLCAndG9rZW5NYXAnLCAncHlwYXJzaW5nX2NvbW1vbicsDQpdDQoNCnN5c3RlbV92ZXJzaW9uID0gdHVwbGUoc3lzLnZlcnNpb25faW5mbylbOjNdDQpQWV8zID0gc3lzdGVtX3ZlcnNpb25bMF0gPT0gMw0KaWYgUFlfMzoNCiAgICBfTUFYX0lOVCA9IHN5cy5tYXhzaXplDQogICAgYmFzZXN0cmluZyA9IHN0cg0KICAgIHVuaWNociA9IGNocg0KICAgIF91c3RyID0gc3RyDQoNCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zDQogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbc3VtLCBsZW4sIHNvcnRlZCwgcmV2ZXJzZWQsIGxpc3QsIHR1cGxlLCBzZXQsIGFueSwgYWxsLCBtaW4sIG1heF0NCg0KZWxzZToNCiAgICBfTUFYX0lOVCA9IHN5cy5tYXhpbnQNCiAgICByYW5nZSA9IHhyYW5nZQ0KDQogICAgZGVmIF91c3RyKG9iaik6DQogICAgICAgICIiIkRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHN0cihvYmopIHRoYXQgdHJpZXMgdG8gYmUgVW5pY29kZSBmcmllbmRseS4gSXQgZmlyc3QgdHJpZXMNCiAgICAgICAgICAgc3RyKG9iaikuIElmIHRoYXQgZmFpbHMgd2l0aCBhIFVuaWNvZGVFbmNvZGVFcnJvciwgdGhlbiBpdCB0cmllcyB1bmljb2RlKG9iaikuIEl0DQogICAgICAgICAgIHRoZW4gPCByZXR1cm5zIHRoZSB1bmljb2RlIG9iamVjdCB8IGVuY29kZXMgaXQgd2l0aCB0aGUgZGVmYXVsdCBlbmNvZGluZyB8IC4uLiA+Lg0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosdW5pY29kZSk6DQogICAgICAgICAgICByZXR1cm4gb2JqDQoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgIyBJZiB0aGlzIHdvcmtzLCB0aGVuIF91c3RyKG9iaikgaGFzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBzdHIob2JqKSwgc28NCiAgICAgICAgICAgICMgaXQgd29uJ3QgYnJlYWsgYW55IGV4aXN0aW5nIGNvZGUuDQogICAgICAgICAgICByZXR1cm4gc3RyKG9iaikNCg0KICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOg0KICAgICAgICAgICAgIyBFbHNlIGVuY29kZSBpdA0KICAgICAgICAgICAgcmV0ID0gdW5pY29kZShvYmopLmVuY29kZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksICd4bWxjaGFycmVmcmVwbGFjZScpDQogICAgICAgICAgICB4bWxjaGFycmVmID0gUmVnZXgoJyYjXGQrOycpDQogICAgICAgICAgICB4bWxjaGFycmVmLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiAnXFx1JyArIGhleChpbnQodFswXVsyOi0xXSkpWzI6XSkNCiAgICAgICAgICAgIHJldHVybiB4bWxjaGFycmVmLnRyYW5zZm9ybVN0cmluZyhyZXQpDQoNCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdG9sZXJhbnQgb2YgUHl0aG9uIHZlcnNpb24sIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucw0KICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW10NCiAgICBpbXBvcnQgX19idWlsdGluX18NCiAgICBmb3IgZm5hbWUgaW4gInN1bSBsZW4gc29ydGVkIHJldmVyc2VkIGxpc3QgdHVwbGUgc2V0IGFueSBhbGwgbWluIG1heCIuc3BsaXQoKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2luZ2xlQXJnQnVpbHRpbnMuYXBwZW5kKGdldGF0dHIoX19idWlsdGluX18sZm5hbWUpKQ0KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgDQpfZ2VuZXJhdG9yVHlwZSA9IHR5cGUoKHkgZm9yIHkgaW4gcmFuZ2UoMSkpKQ0KIA0KZGVmIF94bWxfZXNjYXBlKGRhdGEpOg0KICAgICIiIkVzY2FwZSAmLCA8LCA+LCAiLCAnLCBldGMuIGluIGEgc3RyaW5nIG9mIGRhdGEuIiIiDQoNCiAgICAjIGFtcGVyc2FuZCBtdXN0IGJlIHJlcGxhY2VkIGZpcnN0DQogICAgZnJvbV9zeW1ib2xzID0gJyY+PCJcJycNCiAgICB0b19zeW1ib2xzID0gKCcmJytzKyc7JyBmb3IgcyBpbiAiYW1wIGd0IGx0IHF1b3QgYXBvcyIuc3BsaXQoKSkNCiAgICBmb3IgZnJvbV8sdG9fIGluIHppcChmcm9tX3N5bWJvbHMsIHRvX3N5bWJvbHMpOg0KICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKGZyb21fLCB0b18pDQogICAgcmV0dXJuIGRhdGENCg0KY2xhc3MgX0NvbnN0YW50cyhvYmplY3QpOg0KICAgIHBhc3MNCg0KYWxwaGFzICAgICA9IHN0cmluZy5hc2NpaV91cHBlcmNhc2UgKyBzdHJpbmcuYXNjaWlfbG93ZXJjYXNlDQpudW1zICAgICAgID0gIjAxMjM0NTY3ODkiDQpoZXhudW1zICAgID0gbnVtcyArICJBQkNERUZhYmNkZWYiDQphbHBoYW51bXMgID0gYWxwaGFzICsgbnVtcw0KX2JzbGFzaCAgICA9IGNocig5MikNCnByaW50YWJsZXMgPSAiIi5qb2luKGMgZm9yIGMgaW4gc3RyaW5nLnByaW50YWJsZSBpZiBjIG5vdCBpbiBzdHJpbmcud2hpdGVzcGFjZSkNCg0KY2xhc3MgUGFyc2VCYXNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6DQogICAgIiIiYmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIGFsbCBwYXJzaW5nIHJ1bnRpbWUgZXhjZXB0aW9ucyIiIg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzDQogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcHN0ciwgbG9jPTAsIG1zZz1Ob25lLCBlbGVtPU5vbmUgKToNCiAgICAgICAgc2VsZi5sb2MgPSBsb2MNCiAgICAgICAgaWYgbXNnIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLm1zZyA9IHBzdHINCiAgICAgICAgICAgIHNlbGYucHN0ciA9ICIiDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1zZyA9IG1zZw0KICAgICAgICAgICAgc2VsZi5wc3RyID0gcHN0cg0KICAgICAgICBzZWxmLnBhcnNlckVsZW1lbnQgPSBlbGVtDQogICAgICAgIHNlbGYuYXJncyA9IChwc3RyLCBsb2MsIG1zZykNCg0KICAgIEBjbGFzc21ldGhvZA0KICAgIGRlZiBfZnJvbV9leGNlcHRpb24oY2xzLCBwZSk6DQogICAgICAgICIiIg0KICAgICAgICBpbnRlcm5hbCBmYWN0b3J5IG1ldGhvZCB0byBzaW1wbGlmeSBjcmVhdGluZyBvbmUgdHlwZSBvZiBQYXJzZUV4Y2VwdGlvbiANCiAgICAgICAgZnJvbSBhbm90aGVyIC0gYXZvaWRzIGhhdmluZyBfX2luaXRfXyBzaWduYXR1cmUgY29uZmxpY3RzIGFtb25nIHN1YmNsYXNzZXMNCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBjbHMocGUucHN0ciwgcGUubG9jLCBwZS5tc2csIHBlLnBhcnNlckVsZW1lbnQpDQoNCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIGFuYW1lICk6DQogICAgICAgICIiInN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOg0KICAgICAgICAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgIiIiDQogICAgICAgIGlmKCBhbmFtZSA9PSAibGluZW5vIiApOg0KICAgICAgICAgICAgcmV0dXJuIGxpbmVubyggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsaWYoIGFuYW1lIGluICgiY29sIiwgImNvbHVtbiIpICk6DQogICAgICAgICAgICByZXR1cm4gY29sKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxpZiggYW5hbWUgPT0gImxpbmUiICk6DQogICAgICAgICAgICByZXR1cm4gbGluZSggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhbmFtZSkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiJXMgKGF0IGNoYXIgJWQpLCAobGluZTolZCwgY29sOiVkKSIgJSBcDQogICAgICAgICAgICAgICAgKCBzZWxmLm1zZywgc2VsZi5sb2MsIHNlbGYubGluZW5vLCBzZWxmLmNvbHVtbiApDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQ0KICAgIGRlZiBtYXJrSW5wdXRsaW5lKCBzZWxmLCBtYXJrZXJTdHJpbmcgPSAiPiE8IiApOg0KICAgICAgICAiIiJFeHRyYWN0cyB0aGUgZXhjZXB0aW9uIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCBhbmQgbWFya3MNCiAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSBleGNlcHRpb24gd2l0aCBhIHNwZWNpYWwgc3ltYm9sLg0KICAgICAgICAiIiINCiAgICAgICAgbGluZV9zdHIgPSBzZWxmLmxpbmUNCiAgICAgICAgbGluZV9jb2x1bW4gPSBzZWxmLmNvbHVtbiAtIDENCiAgICAgICAgaWYgbWFya2VyU3RyaW5nOg0KICAgICAgICAgICAgbGluZV9zdHIgPSAiIi5qb2luKChsaW5lX3N0cls6bGluZV9jb2x1bW5dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJTdHJpbmcsIGxpbmVfc3RyW2xpbmVfY29sdW1uOl0pKQ0KICAgICAgICByZXR1cm4gbGluZV9zdHIuc3RyaXAoKQ0KICAgIGRlZiBfX2Rpcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gImxpbmVubyBjb2wgbGluZSIuc3BsaXQoKSArIGRpcih0eXBlKHNlbGYpKQ0KDQpjbGFzcyBQYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICIiIg0KICAgIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwYXJzZSBleHByZXNzaW9ucyBkb24ndCBtYXRjaCBjbGFzczsNCiAgICBzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToNCiAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0cnk6DQogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikNCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgcHJpbnQocGUpDQogICAgICAgICAgICBwcmludCgiY29sdW1uOiB7fSIuZm9ybWF0KHBlLmNvbCkpDQogICAgICAgICAgICANCiAgICBwcmludHM6Og0KICAgICAgIEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICBjb2x1bW46IDENCiAgICAiIiINCiAgICBwYXNzDQoNCmNsYXNzIFBhcnNlRmF0YWxFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAiIiJ1c2VyLXRocm93YWJsZSBleGNlcHRpb24gdGhyb3duIHdoZW4gaW5jb25zaXN0ZW50IHBhcnNlIGNvbnRlbnQNCiAgICAgICBpcyBmb3VuZDsgc3RvcHMgYWxsIHBhcnNpbmcgaW1tZWRpYXRlbHkiIiINCiAgICBwYXNzDQoNCmNsYXNzIFBhcnNlU3ludGF4RXhjZXB0aW9uKFBhcnNlRmF0YWxFeGNlcHRpb24pOg0KICAgICIiImp1c3QgbGlrZSBMe1BhcnNlRmF0YWxFeGNlcHRpb259LCBidXQgdGhyb3duIGludGVybmFsbHkgd2hlbiBhbg0KICAgICAgIEx7RXJyb3JTdG9wPEFuZC5fRXJyb3JTdG9wPn0gKCctJyBvcGVyYXRvcikgaW5kaWNhdGVzIHRoYXQgcGFyc2luZyBpcyB0byBzdG9wIA0KICAgICAgIGltbWVkaWF0ZWx5IGJlY2F1c2UgYW4gdW5iYWNrdHJhY2thYmxlIHN5bnRheCBlcnJvciBoYXMgYmVlbiBmb3VuZCIiIg0KICAgIHBhc3MNCg0KI34gY2xhc3MgUmVwYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICN+ICIiIkV4cGVyaW1lbnRhbCBjbGFzcyAtIHBhcnNlIGFjdGlvbnMgY2FuIHJhaXNlIHRoaXMgZXhjZXB0aW9uIHRvIGNhdXNlDQogICAgICAgI34gcHlwYXJzaW5nIHRvIHJlcGFyc2UgdGhlIGlucHV0IHN0cmluZzoNCiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgaW5wdXQgc3RyaW5nLCBhbmQvb3INCiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgc3RhcnQgbG9jYXRpb24NCiAgICAgICAjfiBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgUmVwYXJzZUV4Y2VwdGlvbiBpbiB0aGUgY29uc3RydWN0b3IsIGFuZCByYWlzZSB0aGUNCiAgICAgICAjfiBleGNlcHRpb24gaW4gYSBwYXJzZSBhY3Rpb24gdG8gY2F1c2UgcHlwYXJzaW5nIHRvIHVzZSB0aGUgbmV3IHN0cmluZy9sb2NhdGlvbi4NCiAgICAgICAjfiBTZXR0aW5nIHRoZSB2YWx1ZXMgYXMgTm9uZSBjYXVzZXMgbm8gY2hhbmdlIHRvIGJlIG1hZGUuDQogICAgICAgI34gIiIiDQogICAgI34gZGVmIF9faW5pdF8oIHNlbGYsIG5ld3N0cmluZywgcmVzdGFydExvYyApOg0KICAgICAgICAjfiBzZWxmLm5ld1BhcnNlVGV4dCA9IG5ld3N0cmluZw0KICAgICAgICAjfiBzZWxmLnJlcGFyc2VMb2MgPSByZXN0YXJ0TG9jDQoNCmNsYXNzIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oRXhjZXB0aW9uKToNCiAgICAiIiJleGNlcHRpb24gdGhyb3duIGJ5IEx7UGFyc2VyRWxlbWVudC52YWxpZGF0ZX0gaWYgdGhlIGdyYW1tYXIgY291bGQgYmUgaW1wcm9wZXJseSByZWN1cnNpdmUiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZSA9IHBhcnNlRWxlbWVudExpc3QNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbjogJXMiICUgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZQ0KDQpjbGFzcyBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChvYmplY3QpOg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLHAxLHAyKToNCiAgICAgICAgc2VsZi50dXAgPSAocDEscDIpDQogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsaSk6DQogICAgICAgIHJldHVybiBzZWxmLnR1cFtpXQ0KICAgIGRlZiBfX3JlcHJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi50dXBbMF0pDQogICAgZGVmIHNldE9mZnNldChzZWxmLGkpOg0KICAgICAgICBzZWxmLnR1cCA9IChzZWxmLnR1cFswXSxpKQ0KDQpjbGFzcyBQYXJzZVJlc3VsdHMob2JqZWN0KToNCiAgICAiIiINCiAgICBTdHJ1Y3R1cmVkIHBhcnNlIHJlc3VsdHMsIHRvIHByb3ZpZGUgbXVsdGlwbGUgbWVhbnMgb2YgYWNjZXNzIHRvIHRoZSBwYXJzZWQgZGF0YToNCiAgICAgICAtIGFzIGEgbGlzdCAoQ3tsZW4ocmVzdWx0cyl9KQ0KICAgICAgIC0gYnkgbGlzdCBpbmRleCAoQ3tyZXN1bHRzWzBdLCByZXN1bHRzWzFdfSwgZXRjLikNCiAgICAgICAtIGJ5IGF0dHJpYnV0ZSAoQ3tyZXN1bHRzLjxyZXN1bHRzTmFtZT59IC0gc2VlIEx7UGFyc2VyRWxlbWVudC5zZXRSZXN1bHRzTmFtZX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkNCiAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06DQogICAgICAgICMgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCg0KICAgICAgICAjIHBhcnNlU3RyaW5nIHJldHVybnMgYSBQYXJzZVJlc3VsdHMgb2JqZWN0DQogICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikNCg0KICAgICAgICBkZWYgdGVzdChzLCBmbj1yZXByKToNCiAgICAgICAgICAgIHByaW50KCIlcyAtPiAlcyIgJSAocywgZm4oZXZhbChzKSkpKQ0KICAgICAgICB0ZXN0KCJsaXN0KHJlc3VsdCkiKQ0KICAgICAgICB0ZXN0KCJyZXN1bHRbMF0iKQ0KICAgICAgICB0ZXN0KCJyZXN1bHRbJ21vbnRoJ10iKQ0KICAgICAgICB0ZXN0KCJyZXN1bHQuZGF5IikNCiAgICAgICAgdGVzdCgiJ21vbnRoJyBpbiByZXN1bHQiKQ0KICAgICAgICB0ZXN0KCInbWludXRlcycgaW4gcmVzdWx0IikNCiAgICAgICAgdGVzdCgicmVzdWx0LmR1bXAoKSIsIHN0cikNCiAgICBwcmludHM6Og0KICAgICAgICBsaXN0KHJlc3VsdCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQogICAgICAgIHJlc3VsdFswXSAtPiAnMTk5OScNCiAgICAgICAgcmVzdWx0Wydtb250aCddIC0+ICcxMicNCiAgICAgICAgcmVzdWx0LmRheSAtPiAnMzEnDQogICAgICAgICdtb250aCcgaW4gcmVzdWx0IC0+IFRydWUNCiAgICAgICAgJ21pbnV0ZXMnIGluIHJlc3VsdCAtPiBGYWxzZQ0KICAgICAgICByZXN1bHQuZHVtcCgpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KICAgICAgICAtIGRheTogMzENCiAgICAgICAgLSBtb250aDogMTINCiAgICAgICAgLSB5ZWFyOiAxOTk5DQogICAgIiIiDQogICAgZGVmIF9fbmV3X18oY2xzLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBjbHMpOg0KICAgICAgICAgICAgcmV0dXJuIHRva2xpc3QNCiAgICAgICAgcmV0b2JqID0gb2JqZWN0Ll9fbmV3X18oY2xzKQ0KICAgICAgICByZXRvYmouX19kb2luaXQgPSBUcnVlDQogICAgICAgIHJldHVybiByZXRvYmoNCg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzDQogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlLCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToNCiAgICAgICAgaWYgc2VsZi5fX2RvaW5pdDoNCiAgICAgICAgICAgIHNlbGYuX19kb2luaXQgPSBGYWxzZQ0KICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBOb25lDQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQ0KICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQ0KICAgICAgICAgICAgc2VsZi5fX2FzTGlzdCA9IGFzTGlzdA0KICAgICAgICAgICAgc2VsZi5fX21vZGFsID0gbW9kYWwNCiAgICAgICAgICAgIGlmIHRva2xpc3QgaXMgTm9uZToNCiAgICAgICAgICAgICAgICB0b2tsaXN0ID0gW10NCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgbGlzdCk6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSB0b2tsaXN0WzpdDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgX2dlbmVyYXRvclR5cGUpOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gbGlzdCh0b2tsaXN0KQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IFt0b2tsaXN0XQ0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3QgPSBkaWN0KCkNCg0KICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lIGFuZCBuYW1lOg0KICAgICAgICAgICAgaWYgbm90IG1vZGFsOg0KICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzW25hbWVdID0gMA0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLGludCk6DQogICAgICAgICAgICAgICAgbmFtZSA9IF91c3RyKG5hbWUpICMgd2lsbCBhbHdheXMgcmV0dXJuIGEgc3RyLCBidXQgdXNlIF91c3RyIGZvciBjb25zaXN0ZW5jeQ0KICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lDQogICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UodG9rbGlzdCwgKHR5cGUoTm9uZSksIGJhc2VzdHJpbmcsIGxpc3QpKSBhbmQgdG9rbGlzdCBpbiAoTm9uZSwnJyxbXSkpOg0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxiYXNlc3RyaW5nKToNCiAgICAgICAgICAgICAgICAgICAgdG9rbGlzdCA9IFsgdG9rbGlzdCBdDQogICAgICAgICAgICAgICAgaWYgYXNMaXN0Og0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tsaXN0LmNvcHkoKSwwKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KFBhcnNlUmVzdWx0cyh0b2tsaXN0WzBdKSwwKQ0KICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdLl9fbmFtZSA9IG5hbWUNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdFswXQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgKEtleUVycm9yLFR5cGVFcnJvcixJbmRleEVycm9yKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0DQoNCiAgICBkZWYgX19nZXRpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggaSwgKGludCxzbGljZSkgKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdFtpXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgaSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W2ldWy0xXVswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtpXSBdKQ0KDQogICAgZGVmIF9fc2V0aXRlbV9fKCBzZWxmLCBrLCB2LCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2LF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KToNCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFt2XQ0KICAgICAgICAgICAgc3ViID0gdlswXQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaywoaW50LHNsaWNlKSk6DQogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdFtrXSA9IHYNCiAgICAgICAgICAgIHN1YiA9IHYNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFtfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2LDApXQ0KICAgICAgICAgICAgc3ViID0gdg0KICAgICAgICBpZiBpc2luc3RhbmNlKHN1YixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgc3ViLl9fcGFyZW50ID0gd2tyZWYoc2VsZikNCg0KICAgIGRlZiBfX2RlbGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKGksKGludCxzbGljZSkpOg0KICAgICAgICAgICAgbXlsZW4gPSBsZW4oIHNlbGYuX190b2tsaXN0ICkNCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFtpXQ0KDQogICAgICAgICAgICAjIGNvbnZlcnQgaW50IHRvIHNsaWNlDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGksIGludCk6DQogICAgICAgICAgICAgICAgaWYgaSA8IDA6DQogICAgICAgICAgICAgICAgICAgIGkgKz0gbXlsZW4NCiAgICAgICAgICAgICAgICBpID0gc2xpY2UoaSwgaSsxKQ0KICAgICAgICAgICAgIyBnZXQgcmVtb3ZlZCBpbmRpY2VzDQogICAgICAgICAgICByZW1vdmVkID0gbGlzdChyYW5nZSgqaS5pbmRpY2VzKG15bGVuKSkpDQogICAgICAgICAgICByZW1vdmVkLnJldmVyc2UoKQ0KICAgICAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkNCiAgICAgICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICAgICAgZm9yIGogaW4gcmVtb3ZlZDoNCiAgICAgICAgICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiAtIChwb3NpdGlvbiA+IGopKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZGVsIHNlbGYuX190b2tkaWN0W2ldDQoNCiAgICBkZWYgX19jb250YWluc19fKCBzZWxmLCBrICk6DQogICAgICAgIHJldHVybiBrIGluIHNlbGYuX190b2tkaWN0DQoNCiAgICBkZWYgX19sZW5fXyggc2VsZiApOiByZXR1cm4gbGVuKCBzZWxmLl9fdG9rbGlzdCApDQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOiByZXR1cm4gKCBub3Qgbm90IHNlbGYuX190b2tsaXN0ICkNCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fDQogICAgZGVmIF9faXRlcl9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdCApDQogICAgZGVmIF9fcmV2ZXJzZWRfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3RbOjotMV0gKQ0KICAgIGRlZiBfaXRlcmtleXMoIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9fdG9rZGljdCwgIml0ZXJrZXlzIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3QuaXRlcmtleXMoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fX3Rva2RpY3QpDQoNCiAgICBkZWYgX2l0ZXJ2YWx1ZXMoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIChzZWxmW2tdIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpDQogICAgICAgICAgICANCiAgICBkZWYgX2l0ZXJpdGVtcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gKChrLCBzZWxmW2tdKSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQ0KDQogICAgaWYgUFlfMzoNCiAgICAgICAga2V5cyA9IF9pdGVya2V5cyAgICAgICANCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICAgICAgdmFsdWVzID0gX2l0ZXJ2YWx1ZXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVtcyA9IF9pdGVyaXRlbXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICBlbHNlOg0KICAgICAgICBpdGVya2V5cyA9IF9pdGVya2V5cw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVydmFsdWVzID0gX2l0ZXJ2YWx1ZXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVyaXRlbXMgPSBfaXRlcml0ZW1zDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGRlZiBrZXlzKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoYXMgYSBsaXN0IGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVya2V5cygpKQ0KDQogICAgICAgIGRlZiB2YWx1ZXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICBkZWYgaXRlbXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWVzIChhcyBhIGxpc3Qgb2YgdHVwbGVzIGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkNCg0KICAgIGRlZiBoYXNrZXlzKCBzZWxmICk6DQogICAgICAgICIiIlNpbmNlIGtleXMoKSByZXR1cm5zIGFuIGl0ZXJhdG9yLCB0aGlzIG1ldGhvZCBpcyBoZWxwZnVsIGluIGJ5cGFzc2luZw0KICAgICAgICAgICBjb2RlIHRoYXQgbG9va3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW55IGRlZmluZWQgcmVzdWx0cyBuYW1lcy4iIiINCiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3Rva2RpY3QpDQogICAgICAgIA0KICAgIGRlZiBwb3AoIHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICIiIg0KICAgICAgICBSZW1vdmVzIGFuZCByZXR1cm5zIGl0ZW0gYXQgc3BlY2lmaWVkIGluZGV4IChkZWZhdWx0PUN7bGFzdH0pLg0KICAgICAgICBTdXBwb3J0cyBib3RoIEN7bGlzdH0gYW5kIEN7ZGljdH0gc2VtYW50aWNzIGZvciBDe3BvcCgpfS4gSWYgcGFzc2VkIG5vDQogICAgICAgIGFyZ3VtZW50IG9yIGFuIGludGVnZXIgYXJndW1lbnQsIGl0IHdpbGwgdXNlIEN7bGlzdH0gc2VtYW50aWNzDQogICAgICAgIGFuZCBwb3AgdG9rZW5zIGZyb20gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4gSWYgcGFzc2VkIGEgDQogICAgICAgIG5vbi1pbnRlZ2VyIGFyZ3VtZW50IChtb3N0IGxpa2VseSBhIHN0cmluZyksIGl0IHdpbGwgdXNlIEN7ZGljdH0NCiAgICAgICAgc2VtYW50aWNzIGFuZCBwb3AgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZnJvbSBhbnkgZGVmaW5lZCANCiAgICAgICAgcmVzdWx0cyBuYW1lcy4gQSBzZWNvbmQgZGVmYXVsdCByZXR1cm4gdmFsdWUgYXJndW1lbnQgaXMgDQogICAgICAgIHN1cHBvcnRlZCwganVzdCBhcyBpbiBDe2RpY3QucG9wKCl9Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGVmIHJlbW92ZV9maXJzdCh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoMCkNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9maXJzdCkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMTIzJywgJzMyMSddDQoNCiAgICAgICAgICAgIGxhYmVsID0gV29yZChhbHBoYXMpDQogICAgICAgICAgICBwYXR0ID0gbGFiZWwoIkxBQkVMIikgKyBPbmVPck1vcmUoV29yZChudW1zKSkNCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQ0KDQogICAgICAgICAgICAjIFVzZSBwb3AoKSBpbiBhIHBhcnNlIGFjdGlvbiB0byByZW1vdmUgbmFtZWQgcmVzdWx0IChub3RlIHRoYXQgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyBub3QNCiAgICAgICAgICAgICMgcmVtb3ZlZCBmcm9tIGxpc3QgZm9ybSBvZiByZXN1bHRzKQ0KICAgICAgICAgICAgZGVmIHJlbW92ZV9MQUJFTCh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoIkxBQkVMIikNCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zDQogICAgICAgICAgICBwYXR0LmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9MQUJFTCkNCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICAtIExBQkVMOiBBQUINCg0KICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3QgYXJnczoNCiAgICAgICAgICAgIGFyZ3MgPSBbLTFdDQogICAgICAgIGZvciBrLHYgaW4ga3dhcmdzLml0ZW1zKCk6DQogICAgICAgICAgICBpZiBrID09ICdkZWZhdWx0JzoNCiAgICAgICAgICAgICAgICBhcmdzID0gKGFyZ3NbMF0sIHYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigicG9wKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlIGspDQogICAgICAgIGlmIChpc2luc3RhbmNlKGFyZ3NbMF0sIGludCkgb3IgDQogICAgICAgICAgICAgICAgICAgICAgICBsZW4oYXJncykgPT0gMSBvciANCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gaW4gc2VsZik6DQogICAgICAgICAgICBpbmRleCA9IGFyZ3NbMF0NCiAgICAgICAgICAgIHJldCA9IHNlbGZbaW5kZXhdDQogICAgICAgICAgICBkZWwgc2VsZltpbmRleF0NCiAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGRlZmF1bHR2YWx1ZSA9IGFyZ3NbMV0NCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0dmFsdWUNCg0KICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0VmFsdWU9Tm9uZSk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIG5hbWVkIHJlc3VsdCBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LCBvciBpZiB0aGVyZSBpcyBubw0KICAgICAgICBzdWNoIG5hbWUsIHRoZW4gcmV0dXJucyB0aGUgZ2l2ZW4gQ3tkZWZhdWx0VmFsdWV9IG9yIEN7Tm9uZX0gaWYgbm8NCiAgICAgICAgQ3tkZWZhdWx0VmFsdWV9IGlzIHNwZWNpZmllZC4NCg0KICAgICAgICBTaW1pbGFyIHRvIEN7ZGljdC5nZXQoKX0uDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoInllYXIiKSkgIyAtPiAnMTk5OScNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiLCAibm90IHNwZWNpZmllZCIpKSAjIC0+ICdub3Qgc3BlY2lmaWVkJw0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIpKSAjIC0+IE5vbmUNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGtleSBpbiBzZWxmOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZQ0KDQogICAgZGVmIGluc2VydCggc2VsZiwgaW5kZXgsIGluc1N0ciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW5zZXJ0cyBuZXcgZWxlbWVudCBhdCBsb2NhdGlvbiBpbmRleCBpbiB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLg0KICAgICAgICANCiAgICAgICAgU2ltaWxhciB0byBDe2xpc3QuaW5zZXJ0KCl9Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQoNCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGluc2VydCB0aGUgcGFyc2UgbG9jYXRpb24gaW4gdGhlIGZyb250IG9mIHRoZSBwYXJzZWQgcmVzdWx0cw0KICAgICAgICAgICAgZGVmIGluc2VydF9sb2NuKGxvY24sIHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmluc2VydCgwLCBsb2NuKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGluc2VydF9sb2NuKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWzAsICcwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuaW5zZXJ0KGluZGV4LCBpbnNTdHIpDQogICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5DQogICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToNCiAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiArIChwb3NpdGlvbiA+IGluZGV4KSkNCg0KICAgIGRlZiBhcHBlbmQoIHNlbGYsIGl0ZW0gKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBzaW5nbGUgZWxlbWVudCB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gY29tcHV0ZSB0aGUgc3VtIG9mIHRoZSBwYXJzZWQgaW50ZWdlcnMsIGFuZCBhZGQgaXQgdG8gdGhlIGVuZA0KICAgICAgICAgICAgZGVmIGFwcGVuZF9zdW0odG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKHN1bShtYXAoaW50LCB0b2tlbnMpKSkNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihhcHBlbmRfc3VtKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnLCA0NDRdDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLl9fdG9rbGlzdC5hcHBlbmQoaXRlbSkNCg0KICAgIGRlZiBleHRlbmQoIHNlbGYsIGl0ZW1zZXEgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBzZXF1ZW5jZSBvZiBlbGVtZW50cyB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gYXBwZW5kIHRoZSByZXZlcnNlIG9mIHRoZSBtYXRjaGVkIHN0cmluZ3MsIHRvIG1ha2UgYSBwYWxpbmRyb21lDQogICAgICAgICAgICBkZWYgbWFrZV9wYWxpbmRyb21lKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmV4dGVuZChyZXZlcnNlZChbdFs6Oi0xXSBmb3IgdCBpbiB0b2tlbnNdKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gJycuam9pbih0b2tlbnMpDQogICAgICAgICAgICBwcmludChwYXR0LmFkZFBhcnNlQWN0aW9uKG1ha2VfcGFsaW5kcm9tZSkucGFyc2VTdHJpbmcoImxza2RqIHNkbGtqZiBsa3NkIikpICMgLT4gJ2xza2Rqc2Rsa2pmbGtzZGRza2xmamtsZHNqZGtzbCcNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbXNlcSwgUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgIHNlbGYgKz0gaXRlbXNlcQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QuZXh0ZW5kKGl0ZW1zZXEpDQoNCiAgICBkZWYgY2xlYXIoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIENsZWFyIGFsbCBlbGVtZW50cyBhbmQgcmVzdWx0cyBuYW1lcy4NCiAgICAgICAgIiIiDQogICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFs6XQ0KICAgICAgICBzZWxmLl9fdG9rZGljdC5jbGVhcigpDQoNCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIG5hbWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGZbbmFtZV0NCiAgICAgICAgZXhjZXB0IEtleUVycm9yOg0KICAgICAgICAgICAgcmV0dXJuICIiDQogICAgICAgICAgICANCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9fdG9rZGljdDoNCiAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtuYW1lXVstMV1bMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbbmFtZV0gXSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiAiIg0KDQogICAgZGVmIF9fYWRkX18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIHJldCA9IHNlbGYuY29weSgpDQogICAgICAgIHJldCArPSBvdGhlcg0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgX19pYWRkX18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIG90aGVyLl9fdG9rZGljdDoNCiAgICAgICAgICAgIG9mZnNldCA9IGxlbihzZWxmLl9fdG9rbGlzdCkNCiAgICAgICAgICAgIGFkZG9mZnNldCA9IGxhbWJkYSBhOiBvZmZzZXQgaWYgYTwwIGVsc2UgYStvZmZzZXQNCiAgICAgICAgICAgIG90aGVyaXRlbXMgPSBvdGhlci5fX3Rva2RpY3QuaXRlbXMoKQ0KICAgICAgICAgICAgb3RoZXJkaWN0aXRlbXMgPSBbKGssIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZbMF0sYWRkb2Zmc2V0KHZbMV0pKSApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayx2bGlzdCkgaW4gb3RoZXJpdGVtcyBmb3IgdiBpbiB2bGlzdF0NCiAgICAgICAgICAgIGZvciBrLHYgaW4gb3RoZXJkaWN0aXRlbXM6DQogICAgICAgICAgICAgICAgc2VsZltrXSA9IHYNCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZbMF0sUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgdlswXS5fX3BhcmVudCA9IHdrcmVmKHNlbGYpDQogICAgICAgICAgICANCiAgICAgICAgc2VsZi5fX3Rva2xpc3QgKz0gb3RoZXIuX190b2tsaXN0DQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZSggb3RoZXIuX19hY2N1bU5hbWVzICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KSBhbmQgb3RoZXIgPT0gMDoNCiAgICAgICAgICAgICMgdXNlZnVsIGZvciBtZXJnaW5nIG1hbnkgUGFyc2VSZXN1bHRzIHVzaW5nIHN1bSgpIGJ1aWx0aW4NCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgIyB0aGlzIG1heSByYWlzZSBhIFR5cGVFcnJvciAtIHNvIGJlIGl0DQogICAgICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmDQogICAgICAgIA0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIiglcywgJXMpIiAlICggcmVwciggc2VsZi5fX3Rva2xpc3QgKSwgcmVwciggc2VsZi5fX3Rva2RpY3QgKSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gJ1snICsgJywgJy5qb2luKF91c3RyKGkpIGlmIGlzaW5zdGFuY2UoaSwgUGFyc2VSZXN1bHRzKSBlbHNlIHJlcHIoaSkgZm9yIGkgaW4gc2VsZi5fX3Rva2xpc3QpICsgJ10nDQoNCiAgICBkZWYgX2FzU3RyaW5nTGlzdCggc2VsZiwgc2VwPScnICk6DQogICAgICAgIG91dCA9IFtdDQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuX190b2tsaXN0Og0KICAgICAgICAgICAgaWYgb3V0IGFuZCBzZXA6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChzZXApDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKCBpdGVtLCBQYXJzZVJlc3VsdHMgKToNCiAgICAgICAgICAgICAgICBvdXQgKz0gaXRlbS5fYXNTdHJpbmdMaXN0KCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggX3VzdHIoaXRlbSkgKQ0KICAgICAgICByZXR1cm4gb3V0DQoNCiAgICBkZWYgYXNMaXN0KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGxpc3Qgb2YgbWF0Y2hpbmcgdG9rZW5zLCBhbGwgY29udmVydGVkIHRvIHN0cmluZ3MuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIHJlc3VsdCA9IHBhdHQucGFyc2VTdHJpbmcoInNsZGtqIGxzZGtqIHNsZGtqIikNCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBwcmludHMgaW4gc3RyaW5nLWxpa2UgZm9ybSwgaXQgaXMgYWN0dWFsbHkgYSBweXBhcnNpbmcgUGFyc2VSZXN1bHRzDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlc3VsdCkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBVc2UgYXNMaXN0KCkgdG8gY3JlYXRlIGFuIGFjdHVhbCBsaXN0DQogICAgICAgICAgICByZXN1bHRfbGlzdCA9IHJlc3VsdC5hc0xpc3QoKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfbGlzdCksIHJlc3VsdF9saXN0KSAjIC0+IDxjbGFzcyAnbGlzdCc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQ0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIFtyZXMuYXNMaXN0KCkgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKSBlbHNlIHJlcyBmb3IgcmVzIGluIHNlbGYuX190b2tsaXN0XQ0KDQogICAgZGVmIGFzRGljdCggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyB0aGUgbmFtZWQgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBkaWN0aW9uYXJ5Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0KSwgcmVwcihyZXN1bHQpKSAjIC0+IDxjbGFzcyAncHlwYXJzaW5nLlBhcnNlUmVzdWx0cyc+IChbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10sIHsnZGF5JzogWygnMTk5OScsIDQpXSwgJ3llYXInOiBbKCcxMicsIDApXSwgJ21vbnRoJzogWygnMzEnLCAyKV19KQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHRfZGljdCA9IHJlc3VsdC5hc0RpY3QoKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfZGljdCksIHJlcHIocmVzdWx0X2RpY3QpKSAjIC0+IDxjbGFzcyAnZGljdCc+IHsnZGF5JzogJzE5OTknLCAneWVhcic6ICcxMicsICdtb250aCc6ICczMSd9DQoNCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggYSBQYXJzZVJlc3VsdHMgc3VwcG9ydHMgZGljdC1saWtlIGFjY2Vzcywgc29tZXRpbWUgeW91IGp1c3QgbmVlZCB0byBoYXZlIGEgZGljdA0KICAgICAgICAgICAgaW1wb3J0IGpzb24NCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkgIyAtPiBFeGNlcHRpb246IFR5cGVFcnJvcjogLi4uIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZQ0KICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQuYXNEaWN0KCkpKSAjIC0+IHsibW9udGgiOiAiMzEiLCAiZGF5IjogIjE5OTkiLCAieWVhciI6ICIxMiJ9DQogICAgICAgICIiIg0KICAgICAgICBpZiBQWV8zOg0KICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlbXMNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZXJpdGVtcw0KICAgICAgICAgICAgDQogICAgICAgIGRlZiB0b0l0ZW0ob2JqKToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIGlmIG9iai5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouYXNEaWN0KCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RvSXRlbSh2KSBmb3IgdiBpbiBvYmpdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBvYmoNCiAgICAgICAgICAgICAgICANCiAgICAgICAgcmV0dXJuIGRpY3QoKGssdG9JdGVtKHYpKSBmb3Igayx2IGluIGl0ZW1fZm4oKSkNCg0KICAgIGRlZiBjb3B5KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgYSBDe1BhcnNlUmVzdWx0c30gb2JqZWN0Lg0KICAgICAgICAiIiINCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKCBzZWxmLl9fdG9rbGlzdCApDQogICAgICAgIHJldC5fX3Rva2RpY3QgPSBzZWxmLl9fdG9rZGljdC5jb3B5KCkNCiAgICAgICAgcmV0Ll9fcGFyZW50ID0gc2VsZi5fX3BhcmVudA0KICAgICAgICByZXQuX19hY2N1bU5hbWVzLnVwZGF0ZSggc2VsZi5fX2FjY3VtTmFtZXMgKQ0KICAgICAgICByZXQuX19uYW1lID0gc2VsZi5fX25hbWUNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIGFzWE1MKCBzZWxmLCBkb2N0YWc9Tm9uZSwgbmFtZWRJdGVtc09ubHk9RmFsc2UsIGluZGVudD0iIiwgZm9ybWF0dGVkPVRydWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIChEZXByZWNhdGVkKSBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIFhNTC4gVGFncyBhcmUgY3JlYXRlZCBmb3IgdG9rZW5zIGFuZCBsaXN0cyB0aGF0IGhhdmUgZGVmaW5lZCByZXN1bHRzIG5hbWVzLg0KICAgICAgICAiIiINCiAgICAgICAgbmwgPSAiXG4iDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIG5hbWVkSXRlbXMgPSBkaWN0KCh2WzFdLGspIGZvciAoayx2bGlzdCkgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHYgaW4gdmxpc3QpDQogICAgICAgIG5leHRMZXZlbEluZGVudCA9IGluZGVudCArICIgICINCg0KICAgICAgICAjIGNvbGxhcHNlIG91dCBpbmRlbnRzIGlmIGZvcm1hdHRpbmcgaXMgbm90IGRlc2lyZWQNCiAgICAgICAgaWYgbm90IGZvcm1hdHRlZDoNCiAgICAgICAgICAgIGluZGVudCA9ICIiDQogICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSAiIg0KICAgICAgICAgICAgbmwgPSAiIg0KDQogICAgICAgIHNlbGZUYWcgPSBOb25lDQogICAgICAgIGlmIGRvY3RhZyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGZUYWcgPSBkb2N0YWcNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIHNlbGYuX19uYW1lOg0KICAgICAgICAgICAgICAgIHNlbGZUYWcgPSBzZWxmLl9fbmFtZQ0KDQogICAgICAgIGlmIG5vdCBzZWxmVGFnOg0KICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6DQogICAgICAgICAgICAgICAgcmV0dXJuICIiDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGZUYWcgPSAiSVRFTSINCg0KICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPCIsIHNlbGZUYWcsICI+IiBdDQoNCiAgICAgICAgZm9yIGkscmVzIGluIGVudW1lcmF0ZShzZWxmLl9fdG9rbGlzdCk6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlcyxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoNCiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKG5hbWVkSXRlbXNbaV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBpbmRpdmlkdWFsIHRva2VuLCBzZWUgaWYgdGhlcmUgaXMgYSBuYW1lIGZvciBpdA0KICAgICAgICAgICAgICAgIHJlc1RhZyA9IE5vbmUNCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6DQogICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9IG5hbWVkSXRlbXNbaV0NCiAgICAgICAgICAgICAgICBpZiBub3QgcmVzVGFnOg0KICAgICAgICAgICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSAiSVRFTSINCiAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCA9IF94bWxfZXNjYXBlKF91c3RyKHJlcykpDQogICAgICAgICAgICAgICAgb3V0ICs9IFsgbmwsIG5leHRMZXZlbEluZGVudCwgIjwiLCByZXNUYWcsICI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvIiwgcmVzVGFnLCAiPiIgXQ0KDQogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8LyIsIHNlbGZUYWcsICI+IiBdDQogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkNCg0KICAgIGRlZiBfX2xvb2t1cChzZWxmLHN1Yik6DQogICAgICAgIGZvciBrLHZsaXN0IGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICBmb3Igdixsb2MgaW4gdmxpc3Q6DQogICAgICAgICAgICAgICAgaWYgc3ViIGlzIHY6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBrDQogICAgICAgIHJldHVybiBOb25lDQoNCiAgICBkZWYgZ2V0TmFtZShzZWxmKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgdGhlIHJlc3VsdHMgbmFtZSBmb3IgdGhpcyB0b2tlbiBleHByZXNzaW9uLiBVc2VmdWwgd2hlbiBzZXZlcmFsIA0KICAgICAgICBkaWZmZXJlbnQgZXhwcmVzc2lvbnMgbWlnaHQgbWF0Y2ggYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIHNzbl9leHByID0gUmVnZXgociJcZFxkXGQtXGRcZC1cZFxkXGRcZCIpDQogICAgICAgICAgICBob3VzZV9udW1iZXJfZXhwciA9IFN1cHByZXNzKCcjJykgKyBXb3JkKG51bXMsIGFscGhhbnVtcykNCiAgICAgICAgICAgIHVzZXJfZGF0YSA9IChHcm91cChob3VzZV9udW1iZXJfZXhwcikoImhvdXNlX251bWJlciIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChzc25fZXhwcikoInNzbiIpDQogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKGludGVnZXIpKCJhZ2UiKSkNCiAgICAgICAgICAgIHVzZXJfaW5mbyA9IE9uZU9yTW9yZSh1c2VyX2RhdGEpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IHVzZXJfaW5mby5wYXJzZVN0cmluZygiMjIgMTExLTIyLTMzMzMgIzIyMUIiKQ0KICAgICAgICAgICAgZm9yIGl0ZW0gaW4gcmVzdWx0Og0KICAgICAgICAgICAgICAgIHByaW50KGl0ZW0uZ2V0TmFtZSgpLCAnOicsIGl0ZW1bMF0pDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBhZ2UgOiAyMg0KICAgICAgICAgICAgc3NuIDogMTExLTIyLTMzMzMNCiAgICAgICAgICAgIGhvdXNlX251bWJlciA6IDIyMUINCiAgICAgICAgIiIiDQogICAgICAgIGlmIHNlbGYuX19uYW1lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lDQogICAgICAgIGVsaWYgc2VsZi5fX3BhcmVudDoNCiAgICAgICAgICAgIHBhciA9IHNlbGYuX19wYXJlbnQoKQ0KICAgICAgICAgICAgaWYgcGFyOg0KICAgICAgICAgICAgICAgIHJldHVybiBwYXIuX19sb29rdXAoc2VsZikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgZWxpZiAobGVuKHNlbGYpID09IDEgYW5kDQogICAgICAgICAgICAgICBsZW4oc2VsZi5fX3Rva2RpY3QpID09IDEgYW5kDQogICAgICAgICAgICAgICBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3QudmFsdWVzKCkpKVswXVsxXSBpbiAoMCwtMSkpOg0KICAgICAgICAgICAgcmV0dXJuIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC5rZXlzKCkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCg0KICAgIGRlZiBkdW1wKHNlbGYsIGluZGVudD0nJywgZGVwdGg9MCwgZnVsbD1UcnVlKToNCiAgICAgICAgIiIiDQogICAgICAgIERpYWdub3N0aWMgbWV0aG9kIGZvciBsaXN0aW5nIG91dCB0aGUgY29udGVudHMgb2YgYSBDe1BhcnNlUmVzdWx0c30uDQogICAgICAgIEFjY2VwdHMgYW4gb3B0aW9uYWwgQ3tpbmRlbnR9IGFyZ3VtZW50IHNvIHRoYXQgdGhpcyBzdHJpbmcgY2FuIGJlIGVtYmVkZGVkDQogICAgICAgIGluIGEgbmVzdGVkIGRpc3BsYXkgb2Ygb3RoZXIgZGF0YS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpDQogICAgICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddDQogICAgICAgICAgICAtIGRheTogMTk5OQ0KICAgICAgICAgICAgLSBtb250aDogMzENCiAgICAgICAgICAgIC0geWVhcjogMTINCiAgICAgICAgIiIiDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIE5MID0gJ1xuJw0KICAgICAgICBvdXQuYXBwZW5kKCBpbmRlbnQrX3VzdHIoc2VsZi5hc0xpc3QoKSkgKQ0KICAgICAgICBpZiBmdWxsOg0KICAgICAgICAgICAgaWYgc2VsZi5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgaXRlbXMgPSBzb3J0ZWQoKHN0cihrKSwgdikgZm9yIGssdiBpbiBzZWxmLml0ZW1zKCkpDQogICAgICAgICAgICAgICAgZm9yIGssdiBpbiBpdGVtczoNCiAgICAgICAgICAgICAgICAgICAgaWYgb3V0Og0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChOTCkNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggIiVzJXMtICVzOiAiICUgKGluZGVudCwoJyAgJypkZXB0aCksIGspICkNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiB2Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIHYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKF91c3RyKHYpKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXByKHYpKQ0KICAgICAgICAgICAgZWxpZiBhbnkoaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpIGZvciB2diBpbiBzZWxmKToNCiAgICAgICAgICAgICAgICB2ID0gc2VsZg0KICAgICAgICAgICAgICAgIGZvciBpLHZ2IGluIGVudW1lcmF0ZSh2KToNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksdnYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLF91c3RyKHZ2KSkpDQogICAgICAgICAgICANCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQ0KDQogICAgZGVmIHBwcmludChzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAiIiINCiAgICAgICAgUHJldHR5LXByaW50ZXIgZm9yIHBhcnNlZCByZXN1bHRzIGFzIGEgbGlzdCwgdXNpbmcgdGhlIEN7cHByaW50fSBtb2R1bGUuDQogICAgICAgIEFjY2VwdHMgYWRkaXRpb25hbCBwb3NpdGlvbmFsIG9yIGtleXdvcmQgYXJncyBhcyBkZWZpbmVkIGZvciB0aGUgDQogICAgICAgIEN7cHByaW50LnBwcmludH0gbWV0aG9kLiAoVXtodHRwOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9wcHJpbnQuaHRtbCNwcHJpbnQucHByaW50fSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykNCiAgICAgICAgICAgIG51bSA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGZ1bmMgPSBGb3J3YXJkKCkNCiAgICAgICAgICAgIHRlcm0gPSBpZGVudCB8IG51bSB8IEdyb3VwKCcoJyArIGZ1bmMgKyAnKScpDQogICAgICAgICAgICBmdW5jIDw8PSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQ0KICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5wYXJzZVN0cmluZygiZm5hIGEsYiwoZm5iIGMsZCwyMDApLDEwMCIpDQogICAgICAgICAgICByZXN1bHQucHByaW50KHdpZHRoPTQwKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydmbmEnLA0KICAgICAgICAgICAgIFsnYScsDQogICAgICAgICAgICAgICdiJywNCiAgICAgICAgICAgICAgWycoJywgJ2ZuYicsIFsnYycsICdkJywgJzIwMCddLCAnKSddLA0KICAgICAgICAgICAgICAnMTAwJ11dDQogICAgICAgICIiIg0KICAgICAgICBwcHJpbnQucHByaW50KHNlbGYuYXNMaXN0KCksICphcmdzLCAqKmt3YXJncykNCg0KICAgICMgYWRkIHN1cHBvcnQgZm9yIHBpY2tsZSBwcm90b2NvbA0KICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6DQogICAgICAgIHJldHVybiAoIHNlbGYuX190b2tsaXN0LA0KICAgICAgICAgICAgICAgICAoIHNlbGYuX190b2tkaWN0LmNvcHkoKSwNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fcGFyZW50IGlzIG5vdCBOb25lIGFuZCBzZWxmLl9fcGFyZW50KCkgb3IgTm9uZSwNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcywNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fbmFtZSApICkNCg0KICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZixzdGF0ZSk6DQogICAgICAgIHNlbGYuX190b2tsaXN0ID0gc3RhdGVbMF0NCiAgICAgICAgKHNlbGYuX190b2tkaWN0LA0KICAgICAgICAgcGFyLA0KICAgICAgICAgaW5BY2N1bU5hbWVzLA0KICAgICAgICAgc2VsZi5fX25hbWUpID0gc3RhdGVbMV0NCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQ0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoaW5BY2N1bU5hbWVzKQ0KICAgICAgICBpZiBwYXIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gd2tyZWYocGFyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUNCg0KICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0LCBzZWxmLl9fbmFtZSwgc2VsZi5fX2FzTGlzdCwgc2VsZi5fX21vZGFsDQoNCiAgICBkZWYgX19kaXJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIChkaXIodHlwZShzZWxmKSkgKyBsaXN0KHNlbGYua2V5cygpKSkNCg0KY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcucmVnaXN0ZXIoUGFyc2VSZXN1bHRzKQ0KDQpkZWYgY29sIChsb2Msc3RyZyk6DQogICAgIiIiUmV0dXJucyBjdXJyZW50IGNvbHVtbiB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgIFRoZSBmaXJzdCBjb2x1bW4gaXMgbnVtYmVyIDEuDQoNCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAiIiINCiAgICBzID0gc3RyZw0KICAgIHJldHVybiAxIGlmIDA8bG9jPGxlbihzKSBhbmQgc1tsb2MtMV0gPT0gJ1xuJyBlbHNlIGxvYyAtIHMucmZpbmQoIlxuIiwgMCwgbG9jKQ0KDQpkZWYgbGluZW5vKGxvYyxzdHJnKToNCiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgbGluZSBudW1iZXIgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICBUaGUgZmlyc3QgbGluZSBpcyBudW1iZXIgMS4NCg0KICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICIiIg0KICAgIHJldHVybiBzdHJnLmNvdW50KCJcbiIsMCxsb2MpICsgMQ0KDQpkZWYgbGluZSggbG9jLCBzdHJnICk6DQogICAgIiIiUmV0dXJucyB0aGUgbGluZSBvZiB0ZXh0IGNvbnRhaW5pbmcgbG9jIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgICAgICIiIg0KICAgIGxhc3RDUiA9IHN0cmcucmZpbmQoIlxuIiwgMCwgbG9jKQ0KICAgIG5leHRDUiA9IHN0cmcuZmluZCgiXG4iLCBsb2MpDQogICAgaWYgbmV4dENSID49IDA6DQogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOm5leHRDUl0NCiAgICBlbHNlOg0KICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpdDQoNCmRlZiBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIgKToNCiAgICBwcmludCAoKCJNYXRjaCAiICsgX3VzdHIoZXhwcikgKyAiIGF0IGxvYyAiICsgX3VzdHIobG9jKSArICIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpKQ0KDQpkZWYgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24oIGluc3RyaW5nLCBzdGFydGxvYywgZW5kbG9jLCBleHByLCB0b2tzICk6DQogICAgcHJpbnQgKCJNYXRjaGVkICIgKyBfdXN0cihleHByKSArICIgLT4gIiArIHN0cih0b2tzLmFzTGlzdCgpKSkNCg0KZGVmIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIsIGV4YyApOg0KICAgIHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiICsgX3VzdHIoZXhjKSkNCg0KZGVmIG51bGxEZWJ1Z0FjdGlvbigqYXJncyk6DQogICAgIiIiJ0RvLW5vdGhpbmcnIGRlYnVnIGFjdGlvbiwgdG8gc3VwcHJlc3MgZGVidWdnaW5nIG91dHB1dCBkdXJpbmcgcGFyc2luZy4iIiINCiAgICBwYXNzDQoNCiMgT25seSB3b3JrcyBvbiBQeXRob24gMy54IC0gbm9ubG9jYWwgaXMgdG94aWMgdG8gUHl0aG9uIDIgaW5zdGFsbHMNCiN+ICdkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcNCiN+IGRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTMpOg0KICAgICN+IGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6DQogICAgICAgICN+IHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkNCiAgICAjfiBsaW1pdCA9IDANCiAgICAjfiBmb3VuZEFyaXR5ID0gRmFsc2UNCiAgICAjfiBkZWYgd3JhcHBlcigqYXJncyk6DQogICAgICAgICN+IG5vbmxvY2FsIGxpbWl0LGZvdW5kQXJpdHkNCiAgICAgICAgI34gd2hpbGUgMToNCiAgICAgICAgICAgICN+IHRyeToNCiAgICAgICAgICAgICAgICAjfiByZXQgPSBmdW5jKCphcmdzW2xpbWl0Ol0pDQogICAgICAgICAgICAgICAgI34gZm91bmRBcml0eSA9IFRydWUNCiAgICAgICAgICAgICAgICAjfiByZXR1cm4gcmV0DQogICAgICAgICAgICAjfiBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgICN+IGlmIGxpbWl0ID09IG1heGFyZ3Mgb3IgZm91bmRBcml0eToNCiAgICAgICAgICAgICAgICAgICAgI34gcmFpc2UNCiAgICAgICAgICAgICAgICAjfiBsaW1pdCArPSAxDQogICAgICAgICAgICAgICAgI34gY29udGludWUNCiAgICAjfiByZXR1cm4gd3JhcHBlcg0KDQojIHRoaXMgdmVyc2lvbiBpcyBQeXRob24gMi54LTMueCBjcm9zcy1jb21wYXRpYmxlDQonZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnDQpkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0yKToNCiAgICBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOg0KICAgICAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpDQogICAgbGltaXQgPSBbMF0NCiAgICBmb3VuZEFyaXR5ID0gW0ZhbHNlXQ0KICAgIA0KICAgICMgdHJhY2ViYWNrIHJldHVybiBkYXRhIHN0cnVjdHVyZSBjaGFuZ2VkIGluIFB5My41IC0gbm9ybWFsaXplIGJhY2sgdG8gcGxhaW4gdHVwbGVzDQogICAgaWYgc3lzdGVtX3ZlcnNpb25bOjJdID49ICgzLDUpOg0KICAgICAgICBkZWYgZXh0cmFjdF9zdGFjayhsaW1pdD0wKToNCiAgICAgICAgICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgUHl0aG9uIDMuNS4wIC0gZXh0cmEgZGVlcCBjYWxsIHN0YWNrIGJ5IDENCiAgICAgICAgICAgIG9mZnNldCA9IC0zIGlmIHN5c3RlbV92ZXJzaW9uID09ICgzLDUsMCkgZWxzZSAtMg0KICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrKGxpbWl0PS1vZmZzZXQrbGltaXQtMSlbb2Zmc2V0XQ0KICAgICAgICAgICAgcmV0dXJuIFsoZnJhbWVfc3VtbWFyeS5maWxlbmFtZSwgZnJhbWVfc3VtbWFyeS5saW5lbm8pXQ0KICAgICAgICBkZWYgZXh0cmFjdF90Yih0YiwgbGltaXQ9MCk6DQogICAgICAgICAgICBmcmFtZXMgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YiwgbGltaXQ9bGltaXQpDQogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gZnJhbWVzWy0xXQ0KICAgICAgICAgICAgcmV0dXJuIFsoZnJhbWVfc3VtbWFyeS5maWxlbmFtZSwgZnJhbWVfc3VtbWFyeS5saW5lbm8pXQ0KICAgIGVsc2U6DQogICAgICAgIGV4dHJhY3Rfc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjaw0KICAgICAgICBleHRyYWN0X3RiID0gdHJhY2ViYWNrLmV4dHJhY3RfdGINCiAgICANCiAgICAjIHN5bnRoZXNpemUgd2hhdCB3b3VsZCBiZSByZXR1cm5lZCBieSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayBhdCB0aGUgY2FsbCB0byANCiAgICAjIHVzZXIncyBwYXJzZSBhY3Rpb24gJ2Z1bmMnLCBzbyB0aGF0IHdlIGRvbid0IGluY3VyIGNhbGwgcGVuYWx0eSBhdCBwYXJzZSB0aW1lDQogICAgDQogICAgTElORV9ESUZGID0gNg0KICAgICMgSUYgQU5ZIENPREUgQ0hBTkdFUywgRVZFTiBKVVNUIENPTU1FTlRTIE9SIEJMQU5LIExJTkVTLCBCRVRXRUVOIFRIRSBORVhUIExJTkUgQU5EIA0KICAgICMgVEhFIENBTEwgVE8gRlVOQyBJTlNJREUgV1JBUFBFUiwgTElORV9ESUZGIE1VU1QgQkUgTU9ESUZJRUQhISEhDQogICAgdGhpc19saW5lID0gZXh0cmFjdF9zdGFjayhsaW1pdD0yKVstMV0NCiAgICBwYV9jYWxsX2xpbmVfc3ludGggPSAodGhpc19saW5lWzBdLCB0aGlzX2xpbmVbMV0rTElORV9ESUZGKQ0KDQogICAgZGVmIHdyYXBwZXIoKmFyZ3MpOg0KICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldCA9IGZ1bmMoKmFyZ3NbbGltaXRbMF06XSkNCiAgICAgICAgICAgICAgICBmb3VuZEFyaXR5WzBdID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgIyByZS1yYWlzZSBUeXBlRXJyb3JzIGlmIHRoZXkgZGlkIG5vdCBjb21lIGZyb20gb3VyIGFyaXR5IHRlc3RpbmcNCiAgICAgICAgICAgICAgICBpZiBmb3VuZEFyaXR5WzBdOg0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbLTFdDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXh0cmFjdF90Yih0YiwgbGltaXQ9MilbLTFdWzoyXSA9PSBwYV9jYWxsX2xpbmVfc3ludGg6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCB0Yg0KDQogICAgICAgICAgICAgICAgaWYgbGltaXRbMF0gPD0gbWF4YXJnczoNCiAgICAgICAgICAgICAgICAgICAgbGltaXRbMF0gKz0gMQ0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgIHJhaXNlDQoNCiAgICAjIGNvcHkgZnVuYyBuYW1lIHRvIHdyYXBwZXIgZm9yIHNlbnNpYmxlIGRlYnVnIG91dHB1dA0KICAgIGZ1bmNfbmFtZSA9ICI8cGFyc2UgYWN0aW9uPiINCiAgICB0cnk6DQogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpDQogICAgd3JhcHBlci5fX25hbWVfXyA9IGZ1bmNfbmFtZQ0KDQogICAgcmV0dXJuIHdyYXBwZXINCg0KY2xhc3MgUGFyc2VyRWxlbWVudChvYmplY3QpOg0KICAgICIiIkFic3RyYWN0IGJhc2UgbGV2ZWwgcGFyc2VyIGVsZW1lbnQgY2xhc3MuIiIiDQogICAgREVGQVVMVF9XSElURV9DSEFSUyA9ICIgXG5cdFxyIg0KICAgIHZlcmJvc2Vfc3RhY2t0cmFjZSA9IEZhbHNlDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIGNoYXJzICk6DQogICAgICAgIHIiIiINCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzIGFyZSBzcGFjZSwgPFRBQj4gYW5kIG5ld2xpbmUNCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJywgJ2doaScsICdqa2wnXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIGNoYW5nZSB0byBqdXN0IHRyZWF0IG5ld2xpbmUgYXMgc2lnbmlmaWNhbnQNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycygiIFx0IikNCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJ10NCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyA9IGNoYXJzDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGlubGluZUxpdGVyYWxzVXNpbmcoY2xzKToNCiAgICAgICAgIiIiDQogICAgICAgIFNldCBjbGFzcyB0byBiZSB1c2VkIGZvciBpbmNsdXNpb24gb2Ygc3RyaW5nIGxpdGVyYWxzIGludG8gYSBwYXJzZXIuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgZGVmYXVsdCBsaXRlcmFsIGNsYXNzIHVzZWQgaXMgTGl0ZXJhbA0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCg0KDQogICAgICAgICAgICAjIGNoYW5nZSB0byBTdXBwcmVzcw0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pbmxpbmVMaXRlcmFsc1VzaW5nKFN1cHByZXNzKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcxMicsICczMSddDQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBjbHMNCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QoKQ0KICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBOb25lDQogICAgICAgICN+IHNlbGYubmFtZSA9ICI8dW5rbm93bj4iICAjIGRvbid0IGRlZmluZSBzZWxmLm5hbWUsIGxldCBzdWJjbGFzc2VzIHRyeS9leGNlcHQgdXBjYWxsDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSA9IE5vbmUNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2F2ZWxpc3QNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UgIyB1c2VkIHdoZW4gY2hlY2tpbmcgZm9yIGxlZnQtcmVjdXJzaW9uDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBGYWxzZQ0KICAgICAgICBzZWxmLmlnbm9yZUV4cHJzID0gbGlzdCgpDQogICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQ0KICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gVHJ1ZSAjIHVzZWQgdG8gb3B0aW1pemUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBzdWJjbGFzc2VzIHRoYXQgZG9uJ3QgYWR2YW5jZSBwYXJzZSBpbmRleA0KICAgICAgICBzZWxmLmVycm1zZyA9ICIiDQogICAgICAgIHNlbGYubW9kYWxSZXN1bHRzID0gVHJ1ZSAjIHVzZWQgdG8gbWFyayByZXN1bHRzIG5hbWVzIGFzIG1vZGFsIChyZXBvcnQgb25seSBsYXN0KSBvciBjdW11bGF0aXZlIChsaXN0IGFsbCkNCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoIE5vbmUsIE5vbmUsIE5vbmUgKSAjY3VzdG9tIGRlYnVnIGFjdGlvbnMNCiAgICAgICAgc2VsZi5yZSA9IE5vbmUNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlICMgdXNlZCB0byBhdm9pZCByZWR1bmRhbnQgY2FsbHMgdG8gcHJlUGFyc2UNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gRmFsc2UNCg0KICAgIGRlZiBjb3B5KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBNYWtlIGEgY29weSBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH0uICBVc2VmdWwgZm9yIGRlZmluaW5nIGRpZmZlcmVudCBwYXJzZSBhY3Rpb25zDQogICAgICAgIGZvciB0aGUgc2FtZSBwYXJzaW5nIHBhdHRlcm4sIHVzaW5nIGNvcGllcyBvZiB0aGUgb3JpZ2luYWwgcGFyc2UgZWxlbWVudC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIGludGVnZXJLID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCkgKyBTdXBwcmVzcygiSyIpDQogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShpbnRlZ2VySyB8IGludGVnZXJNIHwgaW50ZWdlcikucGFyc2VTdHJpbmcoIjVLIDEwMCA2NDBLIDI1Nk0iKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFs1MTIwLCAxMDAsIDY1NTM2MCwgMjY4NDM1NDU2XQ0KICAgICAgICBFcXVpdmFsZW50IGZvcm0gb2YgQ3tleHByLmNvcHkoKX0gaXMganVzdCBDe2V4cHIoKX06Og0KICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyKCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikNCiAgICAgICAgIiIiDQogICAgICAgIGNweSA9IGNvcHkuY29weSggc2VsZiApDQogICAgICAgIGNweS5wYXJzZUFjdGlvbiA9IHNlbGYucGFyc2VBY3Rpb25bOl0NCiAgICAgICAgY3B5Lmlnbm9yZUV4cHJzID0gc2VsZi5pZ25vcmVFeHByc1s6XQ0KICAgICAgICBpZiBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFyczoNCiAgICAgICAgICAgIGNweS53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgIHJldHVybiBjcHkNCg0KICAgIGRlZiBzZXROYW1lKCBzZWxmLCBuYW1lICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgbmFtZSBmb3IgdGhpcyBleHByZXNzaW9uLCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBjbGVhcmVyLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBXb3JkKG51bXMpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwiZXhjZXB0aW9uIik6DQogICAgICAgICAgICBzZWxmLmV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHJlZmVyZW5jaW5nIG1hdGNoaW5nIHRva2VucyBhcyBhIG5lc3RlZCBhdHRyaWJ1dGUNCiAgICAgICAgb2YgdGhlIHJldHVybmVkIHBhcnNlIHJlc3VsdHMuDQogICAgICAgIE5PVEU6IHRoaXMgcmV0dXJucyBhICpjb3B5KiBvZiB0aGUgb3JpZ2luYWwgQ3tQYXJzZXJFbGVtZW50fSBvYmplY3Q7DQogICAgICAgIHRoaXMgaXMgc28gdGhhdCB0aGUgY2xpZW50IGNhbiBkZWZpbmUgYSBiYXNpYyBlbGVtZW50LCBzdWNoIGFzIGFuDQogICAgICAgIGludGVnZXIsIGFuZCByZWZlcmVuY2UgaXQgaW4gbXVsdGlwbGUgcGxhY2VzIHdpdGggZGlmZmVyZW50IG5hbWVzLg0KDQogICAgICAgIFlvdSBjYW4gYWxzbyBzZXQgcmVzdWx0cyBuYW1lcyB1c2luZyB0aGUgYWJicmV2aWF0ZWQgc3ludGF4LA0KICAgICAgICBDe2V4cHIoIm5hbWUiKX0gaW4gcGxhY2Ugb2YgQ3tleHByLnNldFJlc3VsdHNOYW1lKCJuYW1lIil9IC0gDQogICAgICAgIHNlZSBMe0l7X19jYWxsX199PF9fY2FsbF9fPn0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoIm1vbnRoIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQ0KDQogICAgICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICIiIg0KICAgICAgICBuZXdzZWxmID0gc2VsZi5jb3B5KCkNCiAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiKiIpOg0KICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi0xXQ0KICAgICAgICAgICAgbGlzdEFsbE1hdGNoZXM9VHJ1ZQ0KICAgICAgICBuZXdzZWxmLnJlc3VsdHNOYW1lID0gbmFtZQ0KICAgICAgICBuZXdzZWxmLm1vZGFsUmVzdWx0cyA9IG5vdCBsaXN0QWxsTWF0Y2hlcw0KICAgICAgICByZXR1cm4gbmV3c2VsZg0KDQogICAgZGVmIHNldEJyZWFrKHNlbGYsYnJlYWtGbGFnID0gVHJ1ZSk6DQogICAgICAgICIiIk1ldGhvZCB0byBpbnZva2UgdGhlIFB5dGhvbiBwZGIgZGVidWdnZXIgd2hlbiB0aGlzIGVsZW1lbnQgaXMNCiAgICAgICAgICAgYWJvdXQgdG8gYmUgcGFyc2VkLiBTZXQgQ3ticmVha0ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0bw0KICAgICAgICAgICBkaXNhYmxlLg0KICAgICAgICAiIiINCiAgICAgICAgaWYgYnJlYWtGbGFnOg0KICAgICAgICAgICAgX3BhcnNlTWV0aG9kID0gc2VsZi5fcGFyc2UNCiAgICAgICAgICAgIGRlZiBicmVha2VyKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSk6DQogICAgICAgICAgICAgICAgaW1wb3J0IHBkYg0KICAgICAgICAgICAgICAgIHBkYi5zZXRfdHJhY2UoKQ0KICAgICAgICAgICAgICAgIHJldHVybiBfcGFyc2VNZXRob2QoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlICkNCiAgICAgICAgICAgIGJyZWFrZXIuX29yaWdpbmFsUGFyc2VNZXRob2QgPSBfcGFyc2VNZXRob2QNCiAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gYnJlYWtlcg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9wYXJzZSwiX29yaWdpbmFsUGFyc2VNZXRob2QiKToNCiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZSA9IHNlbGYuX3BhcnNlLl9vcmlnaW5hbFBhcnNlTWV0aG9kDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiBzdWNjZXNzZnVsbHkgbWF0Y2hpbmcgcGFyc2UgZWxlbWVudCBkZWZpbml0aW9uLg0KICAgICAgICBQYXJzZSBhY3Rpb24gZm4gaXMgYSBjYWxsYWJsZSBtZXRob2Qgd2l0aCAwLTMgYXJndW1lbnRzLCBjYWxsZWQgYXMgQ3tmbihzLGxvYyx0b2tzKX0sDQogICAgICAgIEN7Zm4obG9jLHRva3MpfSwgQ3tmbih0b2tzKX0sIG9yIGp1c3QgQ3tmbigpfSwgd2hlcmU6DQogICAgICAgICAtIHMgICA9IHRoZSBvcmlnaW5hbCBzdHJpbmcgYmVpbmcgcGFyc2VkIChzZWUgbm90ZSBiZWxvdykNCiAgICAgICAgIC0gbG9jID0gdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcNCiAgICAgICAgIC0gdG9rcyA9IGEgbGlzdCBvZiB0aGUgbWF0Y2hlZCB0b2tlbnMsIHBhY2thZ2VkIGFzIGEgQ3tMe1BhcnNlUmVzdWx0c319IG9iamVjdA0KICAgICAgICBJZiB0aGUgZnVuY3Rpb25zIGluIGZucyBtb2RpZnkgdGhlIHRva2VucywgdGhleSBjYW4gcmV0dXJuIHRoZW0gYXMgdGhlIHJldHVybg0KICAgICAgICB2YWx1ZSBmcm9tIGZuLCBhbmQgdGhlIG1vZGlmaWVkIGxpc3Qgb2YgdG9rZW5zIHdpbGwgcmVwbGFjZSB0aGUgb3JpZ2luYWwuDQogICAgICAgIE90aGVyd2lzZSwgZm4gZG9lcyBub3QgbmVlZCB0byByZXR1cm4gYW55IHZhbHVlLg0KDQogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOg0KICAgICAgICAgLSBjYWxsRHVyaW5nVHJ5ID0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlIGlmIHBhcnNlIGFjdGlvbiBzaG91bGQgYmUgcnVuIGR1cmluZyBsb29rYWhlYWRzIGFuZCBhbHRlcm5hdGUgdGVzdGluZw0KDQogICAgICAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgICAgICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgICAgICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgICAgICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgICAgICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCg0KICAgICAgICAgICAgIyB1c2UgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG8gaW50cyBhdCBwYXJzZSB0aW1lDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgIyBub3RlIHRoYXQgaW50ZWdlciBmaWVsZHMgYXJlIG5vdyBpbnRzLCBub3Qgc3RyaW5ncw0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbMTk5OSwgJy8nLCAxMiwgJy8nLCAzMV0NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0ga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGFkZFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIHBhcnNlIGFjdGlvbiB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59Lg0KICAgICAgICANCiAgICAgICAgU2VlIGV4YW1wbGVzIGluIEx7SXtjb3B5fTxjb3B5Pn0uDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uICs9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGFkZENvbmRpdGlvbihzZWxmLCAqZm5zLCAqKmt3YXJncyk6DQogICAgICAgICIiIkFkZCBhIGJvb2xlYW4gcHJlZGljYXRlIGZ1bmN0aW9uIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSANCiAgICAgICAgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59IGZvciBmdW5jdGlvbiBjYWxsIHNpZ25hdHVyZXMuIFVubGlrZSBDe3NldFBhcnNlQWN0aW9ufSwgDQogICAgICAgIGZ1bmN0aW9ucyBwYXNzZWQgdG8gQ3thZGRDb25kaXRpb259IG5lZWQgdG8gcmV0dXJuIGJvb2xlYW4gc3VjY2Vzcy9mYWlsIG9mIHRoZSBjb25kaXRpb24uDQoNCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6DQogICAgICAgICAtIG1lc3NhZ2UgPSBkZWZpbmUgYSBjdXN0b20gbWVzc2FnZSB0byBiZSB1c2VkIGluIHRoZSByYWlzZWQgZXhjZXB0aW9uDQogICAgICAgICAtIGZhdGFsICAgPSBpZiBUcnVlLCB3aWxsIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24gdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5OyBvdGhlcndpc2Ugd2lsbCByYWlzZSBQYXJzZUV4Y2VwdGlvbg0KICAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIHllYXJfaW50ID0gaW50ZWdlci5jb3B5KCkNCiAgICAgICAgICAgIHllYXJfaW50LmFkZENvbmRpdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSA+PSAyMDAwLCBtZXNzYWdlPSJPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIiKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSB5ZWFyX2ludCArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gRXhjZXB0aW9uOiBPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAiIiINCiAgICAgICAgbXNnID0ga3dhcmdzLmdldCgibWVzc2FnZSIsICJmYWlsZWQgdXNlci1kZWZpbmVkIGNvbmRpdGlvbiIpDQogICAgICAgIGV4Y190eXBlID0gUGFyc2VGYXRhbEV4Y2VwdGlvbiBpZiBrd2FyZ3MuZ2V0KCJmYXRhbCIsIEZhbHNlKSBlbHNlIFBhcnNlRXhjZXB0aW9uDQogICAgICAgIGZvciBmbiBpbiBmbnM6DQogICAgICAgICAgICBkZWYgcGEocyxsLHQpOg0KICAgICAgICAgICAgICAgIGlmIG5vdCBib29sKF90cmltX2FyaXR5KGZuKShzLGwsdCkpOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBleGNfdHlwZShzLGwsbXNnKQ0KICAgICAgICAgICAgc2VsZi5wYXJzZUFjdGlvbi5hcHBlbmQocGEpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RmFpbEFjdGlvbiggc2VsZiwgZm4gKToNCiAgICAgICAgIiIiRGVmaW5lIGFjdGlvbiB0byBwZXJmb3JtIGlmIHBhcnNpbmcgZmFpbHMgYXQgdGhpcyBleHByZXNzaW9uLg0KICAgICAgICAgICBGYWlsIGFjdG9uIGZuIGlzIGEgY2FsbGFibGUgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgYXJndW1lbnRzDQogICAgICAgICAgIEN7Zm4ocyxsb2MsZXhwcixlcnIpfSB3aGVyZToNCiAgICAgICAgICAgIC0gcyA9IHN0cmluZyBiZWluZyBwYXJzZWQNCiAgICAgICAgICAgIC0gbG9jID0gbG9jYXRpb24gd2hlcmUgZXhwcmVzc2lvbiBtYXRjaCB3YXMgYXR0ZW1wdGVkIGFuZCBmYWlsZWQNCiAgICAgICAgICAgIC0gZXhwciA9IHRoZSBwYXJzZSBleHByZXNzaW9uIHRoYXQgZmFpbGVkDQogICAgICAgICAgICAtIGVyciA9IHRoZSBleGNlcHRpb24gdGhyb3duDQogICAgICAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vIHZhbHVlLiAgSXQgbWF5IHRocm93IEN7THtQYXJzZUZhdGFsRXhjZXB0aW9ufX0NCiAgICAgICAgICAgaWYgaXQgaXMgZGVzaXJlZCB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHkuIiIiDQogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IGZuDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX3NraXBJZ25vcmFibGVzKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGV4cHJzRm91bmQgPSBUcnVlDQogICAgICAgIHdoaWxlIGV4cHJzRm91bmQ6DQogICAgICAgICAgICBleHByc0ZvdW5kID0gRmFsc2UNCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jLGR1bW15ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIHBhc3MNCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQoNCiAgICAgICAgaWYgc2VsZi5za2lwV2hpdGVzcGFjZToNCiAgICAgICAgICAgIHd0ID0gc2VsZi53aGl0ZUNoYXJzDQogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIHd0Og0KICAgICAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gdG9rZW5saXN0DQoNCiAgICAjfiBAcHJvZmlsZQ0KICAgIGRlZiBfcGFyc2VOb0NhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToNCiAgICAgICAgZGVidWdnaW5nID0gKCBzZWxmLmRlYnVnICkgI2FuZCBkb0FjdGlvbnMgKQ0KDQogICAgICAgIGlmIGRlYnVnZ2luZyBvciBzZWxmLmZhaWxBY3Rpb246DQogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoIixzZWxmLCJhdCBsb2MiLGxvYywiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKQ0KICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzBdICk6DQogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMF0oIGluc3RyaW5nLCBsb2MsIHNlbGYgKQ0KICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYw0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICN+IHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiLCBlcnIpDQogICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z0FjdGlvbnNbMl06DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxBY3Rpb24oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYw0KICAgICAgICAgICAgaWYgc2VsZi5tYXlJbmRleEVycm9yIG9yIGxvYyA+PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KDQogICAgICAgIHRva2VucyA9IHNlbGYucG9zdFBhcnNlKCBpbnN0cmluZywgbG9jLCB0b2tlbnMgKQ0KDQogICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLCBzZWxmLnJlc3VsdHNOYW1lLCBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0LCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgIGlmIHNlbGYucGFyc2VBY3Rpb24gYW5kIChkb0FjdGlvbnMgb3Igc2VsZi5jYWxsRHVyaW5nVHJ5KToNCiAgICAgICAgICAgIGlmIGRlYnVnZ2luZzoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAgICAgI34gcHJpbnQgIkV4Y2VwdGlvbiByYWlzZWQgaW4gdXNlciBwYXJzZSBhY3Rpb246IiwgZXJyDQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1syXSApOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApDQogICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KDQogICAgICAgIGlmIGRlYnVnZ2luZzoNCiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2hlZCIsc2VsZiwiLT4iLHJldFRva2Vucy5hc0xpc3QoKSkNCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1sxXSApOg0KICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzFdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIGxvYywgc2VsZiwgcmV0VG9rZW5zICkNCg0KICAgICAgICByZXR1cm4gbG9jLCByZXRUb2tlbnMNCg0KICAgIGRlZiB0cnlQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1GYWxzZSApWzBdDQogICAgICAgIGV4Y2VwdCBQYXJzZUZhdGFsRXhjZXB0aW9uOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgIA0KICAgIGRlZiBjYW5QYXJzZU5leHQoc2VsZiwgaW5zdHJpbmcsIGxvYyk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYudHJ5UGFyc2UoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBUcnVlDQoNCiAgICBjbGFzcyBfVW5ib3VuZGVkQ2FjaGUob2JqZWN0KToNCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KICAgICAgICAgICAgY2FjaGUgPSB7fQ0KICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCg0KICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCg0KICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCg0KICAgIGlmIF9PcmRlcmVkRGljdCBpcyBub3QgTm9uZToNCiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOg0KICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOg0KICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgICAgIGNhY2hlID0gX09yZGVyZWREaWN0KCkNCg0KICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2FjaGUpID4gc2l6ZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcGl0ZW0oRmFsc2UpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCg0KICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCg0KICAgIGVsc2U6DQogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToNCiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToNCiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgICAgICBjYWNoZSA9IHt9DQogICAgICAgICAgICAgICAga2V5X2ZpZm8gPSBjb2xsZWN0aW9ucy5kZXF1ZShbXSwgc2l6ZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2FjaGUpID4gc2l6ZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcChrZXlfZmlmby5wb3BsZWZ0KCksIE5vbmUpDQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmFwcGVuZChrZXkpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uY2xlYXIoKQ0KDQogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KDQogICAgIyBhcmd1bWVudCBjYWNoZSBmb3Igb3B0aW1pemluZyByZXBlYXRlZCBjYWxscyB3aGVuIGJhY2t0cmFja2luZyB0aHJvdWdoIHJlY3Vyc2l2ZSBleHByZXNzaW9ucw0KICAgIHBhY2tyYXRfY2FjaGUgPSB7fSAjIHRoaXMgaXMgc2V0IGxhdGVyIGJ5IGVuYWJsZWRQYWNrcmF0KCk7IHRoaXMgaXMgaGVyZSBzbyB0aGF0IHJlc2V0Q2FjaGUoKSBkb2Vzbid0IGZhaWwNCiAgICBwYWNrcmF0X2NhY2hlX2xvY2sgPSBSTG9jaygpDQogICAgcGFja3JhdF9jYWNoZV9zdGF0cyA9IFswLCAwXQ0KDQogICAgIyB0aGlzIG1ldGhvZCBnZXRzIHJlcGVhdGVkbHkgY2FsbGVkIGR1cmluZyBiYWNrdHJhY2tpbmcgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgLQ0KICAgICMgd2UgY2FuIGNhY2hlIHRoZXNlIGFyZ3VtZW50cyBhbmQgc2F2ZSBvdXJzZWx2ZXMgdGhlIHRyb3VibGUgb2YgcmUtcGFyc2luZyB0aGUgY29udGFpbmVkIGV4cHJlc3Npb24NCiAgICBkZWYgX3BhcnNlQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOg0KICAgICAgICBISVQsIE1JU1MgPSAwLCAxDQogICAgICAgIGxvb2t1cCA9IChzZWxmLCBpbnN0cmluZywgbG9jLCBjYWxsUHJlUGFyc2UsIGRvQWN0aW9ucykNCiAgICAgICAgd2l0aCBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfbG9jazoNCiAgICAgICAgICAgIGNhY2hlID0gUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlDQogICAgICAgICAgICB2YWx1ZSA9IGNhY2hlLmdldChsb29rdXApDQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBjYWNoZS5ub3RfaW5fY2FjaGU6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW01JU1NdICs9IDENCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fcGFyc2VOb0NhY2hlKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgICAgICMgY2FjaGUgYSBjb3B5IG9mIHRoZSBleGNlcHRpb24sIHdpdGhvdXQgdGhlIHRyYWNlYmFjaw0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCBwZS5fX2NsYXNzX18oKnBlLmFyZ3MpKQ0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tISVRdICs9IDENCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBFeGNlcHRpb24pOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSB2YWx1ZQ0KICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkNCg0KICAgIF9wYXJzZSA9IF9wYXJzZU5vQ2FjaGUNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgcmVzZXRDYWNoZSgpOg0KICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUuY2xlYXIoKQ0KICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbOl0gPSBbMF0gKiBsZW4oUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzKQ0KDQogICAgX3BhY2tyYXRFbmFibGVkID0gRmFsc2UNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGVuYWJsZVBhY2tyYXQoY2FjaGVfc2l6ZV9saW1pdD0xMjgpOg0KICAgICAgICAiIiJFbmFibGVzICJwYWNrcmF0IiBwYXJzaW5nLCB3aGljaCBhZGRzIG1lbW9pemluZyB0byB0aGUgcGFyc2luZyBsb2dpYy4NCiAgICAgICAgICAgUmVwZWF0ZWQgcGFyc2UgYXR0ZW1wdHMgYXQgdGhlIHNhbWUgc3RyaW5nIGxvY2F0aW9uICh3aGljaCBoYXBwZW5zDQogICAgICAgICAgIG9mdGVuIGluIG1hbnkgY29tcGxleCBncmFtbWFycykgY2FuIGltbWVkaWF0ZWx5IHJldHVybiBhIGNhY2hlZCB2YWx1ZSwNCiAgICAgICAgICAgaW5zdGVhZCBvZiByZS1leGVjdXRpbmcgcGFyc2luZy92YWxpZGF0aW5nIGNvZGUuICBNZW1vaXppbmcgaXMgZG9uZSBvZg0KICAgICAgICAgICBib3RoIHZhbGlkIHJlc3VsdHMgYW5kIHBhcnNpbmcgZXhjZXB0aW9ucy4NCiAgICAgICAgICAgDQogICAgICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAgICAtIGNhY2hlX3NpemVfbGltaXQgLSAoZGVmYXVsdD1DezEyOH0pIC0gaWYgYW4gaW50ZWdlciB2YWx1ZSBpcyBwcm92aWRlZA0KICAgICAgICAgICAgICB3aWxsIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBwYWNrcmF0IGNhY2hlOyBpZiBOb25lIGlzIHBhc3NlZCwgdGhlbg0KICAgICAgICAgICAgICB0aGUgY2FjaGUgc2l6ZSB3aWxsIGJlIHVuYm91bmRlZDsgaWYgMCBpcyBwYXNzZWQsIHRoZSBjYWNoZSB3aWxsDQogICAgICAgICAgICAgIGJlIGVmZmVjdGl2ZWx5IGRpc2FibGVkLg0KICAgICAgICAgICAgDQogICAgICAgICAgIFRoaXMgc3BlZWR1cCBtYXkgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgdGhhdCB1c2UgcGFyc2UgYWN0aW9ucyB0aGF0DQogICAgICAgICAgIGhhdmUgc2lkZS1lZmZlY3RzLiAgRm9yIHRoaXMgcmVhc29uLCBwYWNrcmF0IHBhcnNpbmcgaXMgZGlzYWJsZWQgd2hlbg0KICAgICAgICAgICB5b3UgZmlyc3QgaW1wb3J0IHB5cGFyc2luZy4gIFRvIGFjdGl2YXRlIHRoZSBwYWNrcmF0IGZlYXR1cmUsIHlvdXINCiAgICAgICAgICAgcHJvZ3JhbSBtdXN0IGNhbGwgdGhlIGNsYXNzIG1ldGhvZCBDe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpfS4gIElmDQogICAgICAgICAgIHlvdXIgcHJvZ3JhbSB1c2VzIEN7cHN5Y299IHRvICJjb21waWxlIGFzIHlvdSBnbyIsIHlvdSBtdXN0IGNhbGwNCiAgICAgICAgICAgQ3tlbmFibGVQYWNrcmF0fSBiZWZvcmUgY2FsbGluZyBDe3BzeWNvLmZ1bGwoKX0uICBJZiB5b3UgZG8gbm90IGRvIHRoaXMsDQogICAgICAgICAgIFB5dGhvbiB3aWxsIGNyYXNoLiAgRm9yIGJlc3QgcmVzdWx0cywgY2FsbCBDe2VuYWJsZVBhY2tyYXQoKX0gaW1tZWRpYXRlbHkNCiAgICAgICAgICAgYWZ0ZXIgaW1wb3J0aW5nIHB5cGFyc2luZy4NCiAgICAgICAgICAgDQogICAgICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgICAgaW1wb3J0IHB5cGFyc2luZw0KICAgICAgICAgICAgICAgcHlwYXJzaW5nLlBhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3QgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQ6DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZCA9IFRydWUNCiAgICAgICAgICAgIGlmIGNhY2hlX3NpemVfbGltaXQgaXMgTm9uZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9VbmJvdW5kZWRDYWNoZSgpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX0ZpZm9DYWNoZShjYWNoZV9zaXplX2xpbWl0KQ0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFyc2UgPSBQYXJzZXJFbGVtZW50Ll9wYXJzZUNhY2hlDQoNCiAgICBkZWYgcGFyc2VTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBwYXJzZUFsbD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuDQogICAgICAgIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBjbGllbnQgY29kZSwgb25jZSB0aGUgY29tcGxldGUNCiAgICAgICAgZXhwcmVzc2lvbiBoYXMgYmVlbiBidWlsdC4NCg0KICAgICAgICBJZiB5b3Ugd2FudCB0aGUgZ3JhbW1hciB0byByZXF1aXJlIHRoYXQgdGhlIGVudGlyZSBpbnB1dCBzdHJpbmcgYmUNCiAgICAgICAgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgdGhlbiBzZXQgQ3twYXJzZUFsbH0gdG8gVHJ1ZSAoZXF1aXZhbGVudCB0byBlbmRpbmcNCiAgICAgICAgdGhlIGdyYW1tYXIgd2l0aCBDe0x7U3RyaW5nRW5kKCl9fSkuDQoNCiAgICAgICAgTm90ZTogQ3twYXJzZVN0cmluZ30gaW1wbGljaXRseSBjYWxscyBDe2V4cGFuZHRhYnMoKX0gb24gdGhlIGlucHV0IHN0cmluZywNCiAgICAgICAgaW4gb3JkZXIgdG8gcmVwb3J0IHByb3BlciBjb2x1bW4gbnVtYmVycyBpbiBwYXJzZSBhY3Rpb25zLg0KICAgICAgICBJZiB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5zIHRhYnMgYW5kDQogICAgICAgIHRoZSBncmFtbWFyIHVzZXMgcGFyc2UgYWN0aW9ucyB0aGF0IHVzZSB0aGUgQ3tsb2N9IGFyZ3VtZW50IHRvIGluZGV4IGludG8gdGhlDQogICAgICAgIHN0cmluZyBiZWluZyBwYXJzZWQsIHlvdSBjYW4gZW5zdXJlIHlvdSBoYXZlIGEgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBpbnB1dA0KICAgICAgICBzdHJpbmcgYnk6DQogICAgICAgICAtIGNhbGxpbmcgQ3twYXJzZVdpdGhUYWJzfSBvbiB5b3VyIGdyYW1tYXIgYmVmb3JlIGNhbGxpbmcgQ3twYXJzZVN0cmluZ30NCiAgICAgICAgICAgKHNlZSBMe0l7cGFyc2VXaXRoVGFic308cGFyc2VXaXRoVGFicz59KQ0KICAgICAgICAgLSBkZWZpbmUgeW91ciBwYXJzZSBhY3Rpb24gdXNpbmcgdGhlIGZ1bGwgQ3socyxsb2MsdG9rcyl9IHNpZ25hdHVyZSwgYW5kDQogICAgICAgICAgIHJlZmVyZW5jZSB0aGUgaW5wdXQgc3RyaW5nIHVzaW5nIHRoZSBwYXJzZSBhY3Rpb24ncyBDe3N9IGFyZ3VtZW50DQogICAgICAgICAtIGV4cGxpY3RseSBleHBhbmQgdGhlIHRhYnMgaW4geW91ciBpbnB1dCBzdHJpbmcgYmVmb3JlIGNhbGxpbmcNCiAgICAgICAgICAgQ3twYXJzZVN0cmluZ30NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnKSAgIyAtPiBbJ2FhYWFhJ10NCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJywgcGFyc2VBbGw9VHJ1ZSkgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBlbmQgb2YgdGV4dA0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkNCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmUoKQ0KICAgICAgICAgICAgI34gc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6DQogICAgICAgICAgICBpbnN0cmluZyA9IGluc3RyaW5nLmV4cGFuZHRhYnMoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuX3BhcnNlKCBpbnN0cmluZywgMCApDQogICAgICAgICAgICBpZiBwYXJzZUFsbDoNCiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICBzZSA9IEVtcHR5KCkgKyBTdHJpbmdFbmQoKQ0KICAgICAgICAgICAgICAgIHNlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiB0b2tlbnMNCg0KICAgIGRlZiBzY2FuU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCwgb3ZlcmxhcD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgU2NhbiB0aGUgaW5wdXQgc3RyaW5nIGZvciBleHByZXNzaW9uIG1hdGNoZXMuICBFYWNoIG1hdGNoIHdpbGwgcmV0dXJuIHRoZQ0KICAgICAgICBtYXRjaGluZyB0b2tlbnMsIHN0YXJ0IGxvY2F0aW9uLCBhbmQgZW5kIGxvY2F0aW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsDQogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2Nhbm5pbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLiAgSWYNCiAgICAgICAgQ3tvdmVybGFwfSBpcyBzcGVjaWZpZWQsIHRoZW4gb3ZlcmxhcHBpbmcgbWF0Y2hlcyB3aWxsIGJlIHJlcG9ydGVkLg0KDQogICAgICAgIE5vdGUgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBsb2NhdGlvbnMgYXJlIHJlcG9ydGVkIHJlbGF0aXZlIHRvIHRoZSBzdHJpbmcNCiAgICAgICAgYmVpbmcgcGFyc2VkLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXJzaW5nDQogICAgICAgIHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCB0YWJzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgc291cmNlID0gInNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4NyINCiAgICAgICAgICAgIHByaW50KHNvdXJjZSkNCiAgICAgICAgICAgIGZvciB0b2tlbnMsc3RhcnQsZW5kIGluIFdvcmQoYWxwaGFzKS5zY2FuU3RyaW5nKHNvdXJjZSk6DQogICAgICAgICAgICAgICAgcHJpbnQoJyAnKnN0YXJ0ICsgJ14nKihlbmQtc3RhcnQpKQ0KICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArIHRva2Vuc1swXSkNCiAgICAgICAgDQogICAgICAgIHByaW50czo6DQogICAgICAgIA0KICAgICAgICAgICAgc2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3DQogICAgICAgICAgICBeXl5eXg0KICAgICAgICAgICAgc2xkamYNCiAgICAgICAgICAgICAgICAgICAgXl5eXl5eXg0KICAgICAgICAgICAgICAgICAgICBsc2RqamtmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZGtqZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsa2pzZmQNCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6DQogICAgICAgICAgICBpbnN0cmluZyA9IF91c3RyKGluc3RyaW5nKS5leHBhbmR0YWJzKCkNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGxvYyA9IDANCiAgICAgICAgcHJlcGFyc2VGbiA9IHNlbGYucHJlUGFyc2UNCiAgICAgICAgcGFyc2VGbiA9IHNlbGYuX3BhcnNlDQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpDQogICAgICAgIG1hdGNoZXMgPSAwDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8PSBpbnN0cmxlbiBhbmQgbWF0Y2hlcyA8IG1heE1hdGNoZXM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgbmV4dExvYyx0b2tlbnMgPSBwYXJzZUZuKCBpbnN0cmluZywgcHJlbG9jLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzENCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBpZiBuZXh0TG9jID4gbG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyArPSAxDQogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbnMsIHByZWxvYywgbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3ZlcmxhcDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0bG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV4dGxvYyA+IGxvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyArPSAxDQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiB0cmFuc2Zvcm1TdHJpbmcoIHNlbGYsIGluc3RyaW5nICk6DQogICAgICAgICIiIg0KICAgICAgICBFeHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgdG8gbW9kaWZ5IG1hdGNoaW5nIHRleHQgd2l0aCBtb2RpZmllZCB0b2tlbnMgdGhhdCBtYXkNCiAgICAgICAgYmUgcmV0dXJuZWQgZnJvbSBhIHBhcnNlIGFjdGlvbi4gIFRvIHVzZSBDe3RyYW5zZm9ybVN0cmluZ30sIGRlZmluZSBhIGdyYW1tYXIgYW5kDQogICAgICAgIGF0dGFjaCBhIHBhcnNlIGFjdGlvbiB0byBpdCB0aGF0IG1vZGlmaWVzIHRoZSByZXR1cm5lZCB0b2tlbiBsaXN0Lg0KICAgICAgICBJbnZva2luZyBDe3RyYW5zZm9ybVN0cmluZygpfSBvbiBhIHRhcmdldCBzdHJpbmcgd2lsbCB0aGVuIHNjYW4gZm9yIG1hdGNoZXMsDQogICAgICAgIGFuZCByZXBsYWNlIHRoZSBtYXRjaGVkIHRleHQgcGF0dGVybnMgYWNjb3JkaW5nIHRvIHRoZSBsb2dpYyBpbiB0aGUgcGFyc2UNCiAgICAgICAgYWN0aW9uLiAgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gcmV0dXJucyB0aGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIHN0cmluZy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgICAgIHdkLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdLnRpdGxlKCkpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KHdkLnRyYW5zZm9ybVN0cmluZygibm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yay4iKSkNCiAgICAgICAgUHJpbnRzOjoNCiAgICAgICAgICAgIE5vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsuDQogICAgICAgICIiIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBsYXN0RSA9IDANCiAgICAgICAgIyBmb3JjZSBwcmVzZXJ2YXRpb24gb2YgPFRBQj5zLCB0byBtaW5pbWl6ZSB1bndhbnRlZCB0cmFuc2Zvcm1hdGlvbiBvZiBzdHJpbmcsIGFuZCB0bw0KICAgICAgICAjIGtlZXAgc3RyaW5nIGxvY3Mgc3RyYWlnaHQgYmV0d2VlbiB0cmFuc2Zvcm1TdHJpbmcgYW5kIHNjYW5TdHJpbmcNCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcgKToNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBpbnN0cmluZ1tsYXN0RTpzXSApDQogICAgICAgICAgICAgICAgaWYgdDoNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdC5hc0xpc3QoKQ0KICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodCxsaXN0KToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0DQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHQpDQogICAgICAgICAgICAgICAgbGFzdEUgPSBlDQogICAgICAgICAgICBvdXQuYXBwZW5kKGluc3RyaW5nW2xhc3RFOl0pDQogICAgICAgICAgICBvdXQgPSBbbyBmb3IgbyBpbiBvdXQgaWYgb10NCiAgICAgICAgICAgIHJldHVybiAiIi5qb2luKG1hcChfdXN0cixfZmxhdHRlbihvdXQpKSkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHNlYXJjaFN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFub3RoZXIgZXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHNpbXBsaWZ5aW5nIHRoZSBhY2Nlc3MgdG8gdGhlIHRva2VucyBmb3VuZA0KICAgICAgICB0byBtYXRjaCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbA0KICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNlYXJjaGluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgYSBjYXBpdGFsaXplZCB3b3JkIHN0YXJ0cyB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBsb3dlcmNhc2UgbGV0dGVycw0KICAgICAgICAgICAgY2FwX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQoY2FwX3dvcmQuc2VhcmNoU3RyaW5nKCJNb3JlIHRoYW4gSXJvbiwgbW9yZSB0aGFuIExlYWQsIG1vcmUgdGhhbiBHb2xkIEkgbmVlZCBFbGVjdHJpY2l0eSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydNb3JlJywgJ0lyb24nLCAnTGVhZCcsICdHb2xkJywgJ0knXQ0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHQgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcsIG1heE1hdGNoZXMgKSBdKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgc3BsaXQoc2VsZiwgaW5zdHJpbmcsIG1heHNwbGl0PV9NQVhfSU5ULCBpbmNsdWRlU2VwYXJhdG9ycz1GYWxzZSk6DQogICAgICAgICIiIg0KICAgICAgICBHZW5lcmF0b3IgbWV0aG9kIHRvIHNwbGl0IGEgc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBleHByZXNzaW9uIGFzIGEgc2VwYXJhdG9yLg0KICAgICAgICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwgQ3ttYXhzcGxpdH0gYXJndW1lbnQsIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygc3BsaXRzOw0KICAgICAgICBhbmQgdGhlIG9wdGlvbmFsIEN7aW5jbHVkZVNlcGFyYXRvcnN9IGFyZ3VtZW50IChkZWZhdWx0PUN7RmFsc2V9KSwgaWYgdGhlIHNlcGFyYXRpbmcNCiAgICAgICAgbWF0Y2hpbmcgdGV4dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHNwbGl0IHJlc3VsdHMuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjogICAgICAgIA0KICAgICAgICAgICAgcHVuYyA9IG9uZU9mKGxpc3QoIi4sOzovLSE/IikpDQogICAgICAgICAgICBwcmludChsaXN0KHB1bmMuc3BsaXQoIlRoaXMsIHRoaXM/LCB0aGlzIHNlbnRlbmNlLCBpcyBiYWRseSBwdW5jdHVhdGVkISIpKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnVGhpcycsICcgdGhpcycsICcnLCAnIHRoaXMgc2VudGVuY2UnLCAnIGlzIGJhZGx5IHB1bmN0dWF0ZWQnLCAnJ10NCiAgICAgICAgIiIiDQogICAgICAgIHNwbGl0cyA9IDANCiAgICAgICAgbGFzdCA9IDANCiAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyhpbnN0cmluZywgbWF4TWF0Y2hlcz1tYXhzcGxpdCk6DQogICAgICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0OnNdDQogICAgICAgICAgICBpZiBpbmNsdWRlU2VwYXJhdG9yczoNCiAgICAgICAgICAgICAgICB5aWVsZCB0WzBdDQogICAgICAgICAgICBsYXN0ID0gZQ0KICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0Ol0NCg0KICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7QW5kfX0uIEFkZGluZyBzdHJpbmdzIHRvIGEgUGFyc2VyRWxlbWVudA0KICAgICAgICBjb252ZXJ0cyB0aGVtIHRvIEx7TGl0ZXJhbH1zIGJ5IGRlZmF1bHQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiDQogICAgICAgICAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIg0KICAgICAgICAgICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpDQogICAgICAgIFByaW50czo6DQogICAgICAgICAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBBbmQoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZg0KDQogICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciwgcmV0dXJucyBDe0x7QW5kfX0gd2l0aCBlcnJvciBzdG9wDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gQW5kKCBbIHNlbGYsIEFuZC5fRXJyb3JTdG9wKCksIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcnN1Yl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciAtIHNlbGYNCg0KICAgIGRlZiBfX211bF9fKHNlbGYsb3RoZXIpOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKiBvcGVyYXRvciwgYWxsb3dzIHVzZSBvZiBDe2V4cHIgKiAzfSBpbiBwbGFjZSBvZg0KICAgICAgICBDe2V4cHIgKyBleHByICsgZXhwcn0uICBFeHByZXNzaW9ucyBtYXkgYWxzbyBtZSBtdWx0aXBsaWVkIGJ5IGEgMi1pbnRlZ2VyDQogICAgICAgIHR1cGxlLCBzaW1pbGFyIHRvIEN7e21pbixtYXh9fSBtdWx0aXBsaWVycyBpbiByZWd1bGFyIGV4cHJlc3Npb25zLiAgVHVwbGVzDQogICAgICAgIG1heSBhbHNvIGluY2x1ZGUgQ3tOb25lfSBhcyBpbjoNCiAgICAgICAgIC0gQ3tleHByKihuLE5vbmUpfSBvciBDe2V4cHIqKG4sKX0gaXMgZXF1aXZhbGVudA0KICAgICAgICAgICAgICB0byBDe2V4cHIqbiArIEx7WmVyb09yTW9yZX0oZXhwcil9DQogICAgICAgICAgICAgIChyZWFkIGFzICJhdCBsZWFzdCBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikNCiAgICAgICAgIC0gQ3tleHByKihOb25lLG4pfSBpcyBlcXVpdmFsZW50IHRvIEN7ZXhwciooMCxuKX0NCiAgICAgICAgICAgICAgKHJlYWQgYXMgIjAgdG8gbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpDQogICAgICAgICAtIEN7ZXhwciooTm9uZSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7WmVyb09yTW9yZX0oZXhwcil9DQogICAgICAgICAtIEN7ZXhwciooMSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7T25lT3JNb3JlfShleHByKX0NCg0KICAgICAgICBOb3RlIHRoYXQgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYNCiAgICAgICAgbW9yZSB0aGFuIG4gZXhwcnMgZXhpc3QgaW4gdGhlIGlucHV0IHN0cmVhbTsgdGhhdCBpcywNCiAgICAgICAgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCBlbmZvcmNlIGEgbWF4aW11bSBudW1iZXIgb2YgZXhwcg0KICAgICAgICBvY2N1cnJlbmNlcy4gIElmIHRoaXMgYmVoYXZpb3IgaXMgZGVzaXJlZCwgdGhlbiB3cml0ZQ0KICAgICAgICBDe2V4cHIqKE5vbmUsbikgKyB+ZXhwcn0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KToNCiAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyLDANCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLHR1cGxlKToNCiAgICAgICAgICAgIG90aGVyID0gKG90aGVyICsgKE5vbmUsIE5vbmUpKVs6Ml0NCiAgICAgICAgICAgIGlmIG90aGVyWzBdIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgb3RoZXIgPSAoMCwgb3RoZXJbMV0pDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIG90aGVyWzFdIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMDoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFplcm9Pck1vcmUoc2VsZikNCiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAxOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT25lT3JNb3JlKHNlbGYpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYqb3RoZXJbMF0gKyBaZXJvT3JNb3JlKHNlbGYpDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgaXNpbnN0YW5jZShvdGhlclsxXSxpbnQpOg0KICAgICAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyDQogICAgICAgICAgICAgICAgb3B0RWxlbWVudHMgLT0gbWluRWxlbWVudHMNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAoJyVzJywnJXMnKSBvYmplY3RzIiwgdHlwZShvdGhlclswXSksdHlwZShvdGhlclsxXSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICclcycgb2JqZWN0cyIsIHR5cGUob3RoZXIpKQ0KDQogICAgICAgIGlmIG1pbkVsZW1lbnRzIDwgMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IG5lZ2F0aXZlIHZhbHVlIikNCiAgICAgICAgaWYgb3B0RWxlbWVudHMgPCAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2Vjb25kIHR1cGxlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBmaXJzdCB0dXBsZSB2YWx1ZSIpDQogICAgICAgIGlmIG1pbkVsZW1lbnRzID09IG9wdEVsZW1lbnRzID09IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSAwIG9yICgwLDApIikNCg0KICAgICAgICBpZiAob3B0RWxlbWVudHMpOg0KICAgICAgICAgICAgZGVmIG1ha2VPcHRpb25hbExpc3Qobik6DQogICAgICAgICAgICAgICAgaWYgbj4xOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZiArIG1ha2VPcHRpb25hbExpc3Qobi0xKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZikNCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzOg0KICAgICAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IEFuZChbc2VsZl0qbWluRWxlbWVudHMpICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0ID0gbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6DQogICAgICAgICAgICAgICAgcmV0ID0gc2VsZg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZi5fX211bF9fKG90aGVyKQ0KDQogICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciAtIHJldHVybnMgQ3tMe01hdGNoRmlyc3R9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIE1hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgfCBzZWxmDQoNCiAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe09yfX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBPciggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3J4b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgXiBzZWxmDQoNCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0VhY2h9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIEVhY2goIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yYW5kX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyICYgc2VsZg0KDQogICAgZGVmIF9faW52ZXJ0X18oIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIH4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtOb3RBbnl9fQ0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIE5vdEFueSggc2VsZiApDQoNCiAgICBkZWYgX19jYWxsX18oc2VsZiwgbmFtZT1Ob25lKToNCiAgICAgICAgIiIiDQogICAgICAgIFNob3J0Y3V0IGZvciBDe0x7c2V0UmVzdWx0c05hbWV9fSwgd2l0aCBDe2xpc3RBbGxNYXRjaGVzPUZhbHNlfS4NCiAgICAgICAgDQogICAgICAgIElmIEN7bmFtZX0gaXMgZ2l2ZW4gd2l0aCBhIHRyYWlsaW5nIEN7JyonfSBjaGFyYWN0ZXIsIHRoZW4gQ3tsaXN0QWxsTWF0Y2hlc30gd2lsbCBiZQ0KICAgICAgICBwYXNzZWQgYXMgQ3tUcnVlfS4NCiAgICAgICAgICAgDQogICAgICAgIElmIEN7bmFtZX0gaXMgb21pdHRlZCwgc2FtZSBhcyBjYWxsaW5nIEN7THtjb3B5fX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIHRoZXNlIGFyZSBlcXVpdmFsZW50DQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKS5zZXRSZXN1bHRzTmFtZSgibmFtZSIpICsgV29yZChudW1zKyItIikuc2V0UmVzdWx0c05hbWUoInNvY3NlY25vIikNCiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKSgic29jc2Vjbm8iKSAgICAgICAgICAgICANCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRSZXN1bHRzTmFtZShuYW1lKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpDQoNCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFN1cHByZXNzZXMgdGhlIG91dHB1dCBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH07IHVzZWZ1bCB0byBrZWVwIHB1bmN0dWF0aW9uIGZyb20NCiAgICAgICAgY2x1dHRlcmluZyB1cCByZXR1cm5lZCBvdXRwdXQuDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gU3VwcHJlc3MoIHNlbGYgKQ0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgRGlzYWJsZXMgdGhlIHNraXBwaW5nIG9mIHdoaXRlc3BhY2UgYmVmb3JlIG1hdGNoaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQ0KICAgICAgICBDe1BhcnNlckVsZW1lbnR9J3MgZGVmaW5lZCBwYXR0ZXJuLiAgVGhpcyBpcyBub3JtYWxseSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieQ0KICAgICAgICB0aGUgcHlwYXJzaW5nIG1vZHVsZSwgYnV0IG1heSBiZSBuZWVkZWQgaW4gc29tZSB3aGl0ZXNwYWNlLXNlbnNpdGl2ZSBncmFtbWFycy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFdoaXRlc3BhY2VDaGFycyggc2VsZiwgY2hhcnMgKToNCiAgICAgICAgIiIiDQogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBjaGFycw0KICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgcGFyc2VXaXRoVGFicyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgT3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3IgdG8gZXhwYW5kIEN7PFRBQj59cyB0byBzcGFjZXMgYmVmb3JlIHBhcnNpbmcgdGhlIGlucHV0IHN0cmluZy4NCiAgICAgICAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIEN7cGFyc2VTdHJpbmd9IHdoZW4gdGhlIGlucHV0IGdyYW1tYXIgY29udGFpbnMgZWxlbWVudHMgdGhhdA0KICAgICAgICBtYXRjaCBDezxUQUI+fSBjaGFyYWN0ZXJzLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgZXhwcmVzc2lvbiB0byBiZSBpZ25vcmVkIChlLmcuLCBjb21tZW50cykgd2hpbGUgZG9pbmcgcGF0dGVybg0KICAgICAgICBtYXRjaGluZzsgbWF5IGJlIGNhbGxlZCByZXBlYXRlZGx5LCB0byBkZWZpbmUgbXVsdGlwbGUgY29tbWVudCBvciBvdGhlcg0KICAgICAgICBpZ25vcmFibGUgcGF0dGVybnMuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaiddDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhdHQuaWdub3JlKGNTdHlsZUNvbW1lbnQpDQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJywgJ2xza2pkJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgb3RoZXIgPSBTdXBwcmVzcyhvdGhlcikNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQoIFN1cHByZXNzKCBvdGhlci5jb3B5KCkgKSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RGVidWdBY3Rpb25zKCBzZWxmLCBzdGFydEFjdGlvbiwgc3VjY2Vzc0FjdGlvbiwgZXhjZXB0aW9uQWN0aW9uICk6DQogICAgICAgICIiIg0KICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKHN0YXJ0QWN0aW9uIG9yIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0FjdGlvbiBvciBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQWN0aW9uIG9yIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24pDQogICAgICAgIHNlbGYuZGVidWcgPSBUcnVlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RGVidWcoIHNlbGYsIGZsYWc9VHJ1ZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuDQogICAgICAgIFNldCBDe2ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0byBkaXNhYmxlLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0TmFtZSgiYWxwaGF3b3JkIikNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoIm51bXdvcmQiKQ0KICAgICAgICAgICAgdGVybSA9IHdkIHwgaW50ZWdlcg0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHR1cm4gb24gZGVidWdnaW5nIGZvciB3ZA0KICAgICAgICAgICAgd2Quc2V0RGVidWcoKQ0KDQogICAgICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoImFiYyAxMjMgeHl6IDg5MCIpDQogICAgICAgIA0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAwKDEsMSkNCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsnYWJjJ10NCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMygxLDQpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDcoMSw4KQ0KICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWyd4eXonXQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxMSgxLDEyKQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTIpLCAobGluZToxLCBjb2w6MTMpDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDE1KDEsMTYpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxNSksIChsaW5lOjEsIGNvbDoxNikNCg0KICAgICAgICBUaGUgb3V0cHV0IHNob3duIGlzIHRoYXQgcHJvZHVjZWQgYnkgdGhlIGRlZmF1bHQgZGVidWcgYWN0aW9ucyAtIGN1c3RvbSBkZWJ1ZyBhY3Rpb25zIGNhbiBiZQ0KICAgICAgICBzcGVjaWZpZWQgdXNpbmcgTHtzZXREZWJ1Z0FjdGlvbnN9LiBQcmlvciB0byBhdHRlbXB0aW5nDQogICAgICAgIHRvIG1hdGNoIHRoZSBDe3dkfSBleHByZXNzaW9uLCB0aGUgZGVidWdnaW5nIG1lc3NhZ2UgQ3siTWF0Y2ggPGV4cHJuYW1lPiBhdCBsb2MgPG4+KDxsaW5lPiw8Y29sPikifQ0KICAgICAgICBpcyBzaG93bi4gVGhlbiBpZiB0aGUgcGFyc2Ugc3VjY2VlZHMsIGEgQ3siTWF0Y2hlZCJ9IG1lc3NhZ2UgaXMgc2hvd24sIG9yIGFuIEN7IkV4Y2VwdGlvbiByYWlzZWQifQ0KICAgICAgICBtZXNzYWdlIGlzIHNob3duLiBBbHNvIG5vdGUgdGhlIHVzZSBvZiBMe3NldE5hbWV9IHRvIGFzc2lnbiBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgdG8gdGhlIGV4cHJlc3Npb24sDQogICAgICAgIHdoaWNoIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGVhc2llciB0byB1bmRlcnN0YW5kIC0gZm9yIGluc3RhbmNlLCB0aGUgZGVmYXVsdA0KICAgICAgICBuYW1lIGNyZWF0ZWQgZm9yIHRoZSBDe1dvcmR9IGV4cHJlc3Npb24gd2l0aG91dCBjYWxsaW5nIEN7c2V0TmFtZX0gaXMgQ3siVzooQUJDRC4uLikifS4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGZsYWc6DQogICAgICAgICAgICBzZWxmLnNldERlYnVnQWN0aW9ucyggX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLCBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbiApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBwYXNzDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgIiIiDQogICAgICAgIENoZWNrIGRlZmluZWQgZXhwcmVzc2lvbnMgZm9yIHZhbGlkIHN0cnVjdHVyZSwgY2hlY2sgZm9yIGluZmluaXRlIHJlY3Vyc2l2ZSBkZWZpbml0aW9ucy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCg0KICAgIGRlZiBwYXJzZUZpbGUoIHNlbGYsIGZpbGVfb3JfZmlsZW5hbWUsIHBhcnNlQWxsPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIHRoZSBnaXZlbiBmaWxlIG9yIGZpbGVuYW1lLg0KICAgICAgICBJZiBhIGZpbGVuYW1lIGlzIHNwZWNpZmllZCAoaW5zdGVhZCBvZiBhIGZpbGUgb2JqZWN0KSwNCiAgICAgICAgdGhlIGVudGlyZSBmaWxlIGlzIG9wZW5lZCwgcmVhZCwgYW5kIGNsb3NlZCBiZWZvcmUgcGFyc2luZy4NCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmaWxlX29yX2ZpbGVuYW1lLnJlYWQoKQ0KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9vcl9maWxlbmFtZSwgInIiKSBhcyBmOg0KICAgICAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZVN0cmluZyhmaWxlX2NvbnRlbnRzLCBwYXJzZUFsbCkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIF9fZXFfXyhzZWxmLG90aGVyKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgUGFyc2VyRWxlbWVudCk6DQogICAgICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlciBvciB2YXJzKHNlbGYpID09IHZhcnMob3RoZXIpDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGVzKG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlckVsZW1lbnQsc2VsZik9PW90aGVyDQoNCiAgICBkZWYgX19uZV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQ0KDQogICAgZGVmIF9faGFzaF9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gaGFzaChpZChzZWxmKSkNCg0KICAgIGRlZiBfX3JlcV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZiA9PSBvdGhlcg0KDQogICAgZGVmIF9fcm5lX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpDQoNCiAgICBkZWYgbWF0Y2hlcyhzZWxmLCB0ZXN0U3RyaW5nLCBwYXJzZUFsbD1UcnVlKToNCiAgICAgICAgIiIiDQogICAgICAgIE1ldGhvZCBmb3IgcXVpY2sgdGVzdGluZyBvZiBhIHBhcnNlciBhZ2FpbnN0IGEgdGVzdCBzdHJpbmcuIEdvb2QgZm9yIHNpbXBsZSANCiAgICAgICAgaW5saW5lIG1pY3JvdGVzdHMgb2Ygc3ViIGV4cHJlc3Npb25zIHdoaWxlIGJ1aWxkaW5nIHVwIGxhcmdlciBwYXJzZXIuDQogICAgICAgICAgIA0KICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgLSB0ZXN0U3RyaW5nIC0gdG8gdGVzdCBhZ2FpbnN0IHRoaXMgZXhwcmVzc2lvbiBmb3IgYSBtYXRjaA0KICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cw0KICAgICAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZXhwciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGFzc2VydCBleHByLm1hdGNoZXMoIjEwMCIpDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnBhcnNlU3RyaW5nKF91c3RyKHRlc3RTdHJpbmcpLCBwYXJzZUFsbD1wYXJzZUFsbCkNCiAgICAgICAgICAgIHJldHVybiBUcnVlDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgICAgICAgICANCiAgICBkZWYgcnVuVGVzdHMoc2VsZiwgdGVzdHMsIHBhcnNlQWxsPVRydWUsIGNvbW1lbnQ9JyMnLCBmdWxsRHVtcD1UcnVlLCBwcmludFJlc3VsdHM9VHJ1ZSwgZmFpbHVyZVRlc3RzPUZhbHNlKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gYSBzZXJpZXMgb2YgdGVzdCBzdHJpbmdzLCBzaG93aW5nIGVhY2gNCiAgICAgICAgdGVzdCwgdGhlIHBhcnNlZCByZXN1bHRzIG9yIHdoZXJlIHRoZSBwYXJzZSBmYWlsZWQuIFF1aWNrIGFuZCBlYXN5IHdheSB0bw0KICAgICAgICBydW4gYSBwYXJzZSBleHByZXNzaW9uIGFnYWluc3QgYSBsaXN0IG9mIHNhbXBsZSBzdHJpbmdzLg0KICAgICAgICAgICANCiAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgIC0gdGVzdHMgLSBhIGxpc3Qgb2Ygc2VwYXJhdGUgdGVzdCBzdHJpbmdzLCBvciBhIG11bHRpbGluZSBzdHJpbmcgb2YgdGVzdCBzdHJpbmdzDQogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzICAgICAgICAgICANCiAgICAgICAgIC0gY29tbWVudCAtIChkZWZhdWx0PUN7JyMnfSkgLSBleHByZXNzaW9uIGZvciBpbmRpY2F0aW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRoZSB0ZXN0IA0KICAgICAgICAgICAgICBzdHJpbmc7IHBhc3MgTm9uZSB0byBkaXNhYmxlIGNvbW1lbnQgZmlsdGVyaW5nDQogICAgICAgICAtIGZ1bGxEdW1wIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBkdW1wIHJlc3VsdHMgYXMgbGlzdCBmb2xsb3dlZCBieSByZXN1bHRzIG5hbWVzIGluIG5lc3RlZCBvdXRsaW5lOw0KICAgICAgICAgICAgICBpZiBGYWxzZSwgb25seSBkdW1wIG5lc3RlZCBsaXN0DQogICAgICAgICAtIHByaW50UmVzdWx0cyAtIChkZWZhdWx0PUN7VHJ1ZX0pIHByaW50cyB0ZXN0IG91dHB1dCB0byBzdGRvdXQNCiAgICAgICAgIC0gZmFpbHVyZVRlc3RzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlcyBpZiB0aGVzZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gZmFpbCBwYXJzaW5nDQoNCiAgICAgICAgUmV0dXJuczogYSAoc3VjY2VzcywgcmVzdWx0cykgdHVwbGUsIHdoZXJlIHN1Y2Nlc3MgaW5kaWNhdGVzIHRoYXQgYWxsIHRlc3RzIHN1Y2NlZWRlZA0KICAgICAgICAob3IgZmFpbGVkIGlmIEN7ZmFpbHVyZVRlc3RzfSBpcyBUcnVlKSwgYW5kIHRoZSByZXN1bHRzIGNvbnRhaW4gYSBsaXN0IG9mIGxpbmVzIG9mIGVhY2ggDQogICAgICAgIHRlc3QncyBvdXRwdXQNCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgbnVtYmVyX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLm51bWJlci5jb3B5KCkNCg0KICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyDQogICAgICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyDQogICAgICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgICAgICcnJykNCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgMTAwWg0KICAgICAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicNCiAgICAgICAgICAgICAgICAtLjEwMA0KICAgICAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nDQogICAgICAgICAgICAgICAgMy4xNC4xNTkNCiAgICAgICAgICAgICAgICAnJycsIGZhaWx1cmVUZXN0cz1UcnVlKQ0KICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcg0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICBbMTAwXQ0KDQogICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXINCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgIFstMTAwXQ0KDQogICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICAgICBTdWNjZXNzDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyDQogICAgICAgICAgICAxMDBaDQogICAgICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciAzKSwgKGxpbmU6MSwgY29sOjQpDQoNCiAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicNCiAgICAgICAgICAgIC0uMTAwDQogICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCB7cmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIHwgcmVhbCBudW1iZXIgfCBzaWduZWQgaW50ZWdlcn0gKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KDQogICAgICAgICAgICAjIHRvbyBtYW55ICcuJw0KICAgICAgICAgICAgMy4xNC4xNTkNCiAgICAgICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpDQoNCiAgICAgICAgICAgIFN1Y2Nlc3MNCg0KICAgICAgICBFYWNoIHRlc3Qgc3RyaW5nIG11c3QgYmUgb24gYSBzaW5nbGUgbGluZS4gSWYgeW91IHdhbnQgdG8gdGVzdCBhIHN0cmluZyB0aGF0IHNwYW5zIG11bHRpcGxlDQogICAgICAgIGxpbmVzLCBjcmVhdGUgYSB0ZXN0IGxpa2UgdGhpczo6DQoNCiAgICAgICAgICAgIGV4cHIucnVuVGVzdChyInRoaXMgaXMgYSB0ZXN0XFxuIG9mIHN0cmluZ3MgdGhhdCBzcGFucyBcXG4gMyBsaW5lcyIpDQogICAgICAgIA0KICAgICAgICAoTm90ZSB0aGF0IHRoaXMgaXMgYSByYXcgc3RyaW5nIGxpdGVyYWwsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIGxlYWRpbmcgJ3InLikNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdHMsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgdGVzdHMgPSBsaXN0KG1hcChzdHIuc3RyaXAsIHRlc3RzLnJzdHJpcCgpLnNwbGl0bGluZXMoKSkpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoY29tbWVudCwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBjb21tZW50ID0gTGl0ZXJhbChjb21tZW50KQ0KICAgICAgICBhbGxSZXN1bHRzID0gW10NCiAgICAgICAgY29tbWVudHMgPSBbXQ0KICAgICAgICBzdWNjZXNzID0gVHJ1ZQ0KICAgICAgICBmb3IgdCBpbiB0ZXN0czoNCiAgICAgICAgICAgIGlmIGNvbW1lbnQgaXMgbm90IE5vbmUgYW5kIGNvbW1lbnQubWF0Y2hlcyh0LCBGYWxzZSkgb3IgY29tbWVudHMgYW5kIG5vdCB0Og0KICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCh0KQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpZiBub3QgdDoNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgb3V0ID0gWydcbicuam9pbihjb21tZW50cyksIHRdDQogICAgICAgICAgICBjb21tZW50cyA9IFtdDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdCA9IHQucmVwbGFjZShyJ1xuJywnXG4nKQ0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGFyc2VTdHJpbmcodCwgcGFyc2VBbGw9cGFyc2VBbGwpDQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXN1bHQuZHVtcChmdWxsPWZ1bGxEdW1wKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgbm90IGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICBmYXRhbCA9ICIoRkFUQUwpIiBpZiBpc2luc3RhbmNlKHBlLCBQYXJzZUZhdGFsRXhjZXB0aW9uKSBlbHNlICIiDQogICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiB0Og0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGxpbmUocGUubG9jLCB0KSkNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqKGNvbChwZS5sb2MsdCktMSkgKyAnXicgKyBmYXRhbCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJypwZS5sb2MgKyAnXicgKyBmYXRhbCkNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMOiAiICsgc3RyKHBlKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gcGUNCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUwtRVhDRVBUSU9OOiAiICsgc3RyKGV4YykpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV4Yw0KDQogICAgICAgICAgICBpZiBwcmludFJlc3VsdHM6DQogICAgICAgICAgICAgICAgaWYgZnVsbER1bXA6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJycpDQogICAgICAgICAgICAgICAgcHJpbnQoJ1xuJy5qb2luKG91dCkpDQoNCiAgICAgICAgICAgIGFsbFJlc3VsdHMuYXBwZW5kKCh0LCByZXN1bHQpKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MsIGFsbFJlc3VsdHMNCg0KICAgICAgICANCmNsYXNzIFRva2VuKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IEN7UGFyc2VyRWxlbWVudH0gc3ViY2xhc3MsIGZvciBkZWZpbmluZyBhdG9taWMgbWF0Y2hpbmcgcGF0dGVybnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFRva2VuLHNlbGYpLl9faW5pdF9fKCBzYXZlbGlzdD1GYWxzZSApDQoNCg0KY2xhc3MgRW1wdHkoVG9rZW4pOg0KICAgICIiIg0KICAgIEFuIGVtcHR5IHRva2VuLCB3aWxsIGFsd2F5cyBtYXRjaC4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoRW1wdHksc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSAiRW1wdHkiDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCg0KY2xhc3MgTm9NYXRjaChUb2tlbik6DQogICAgIiIiDQogICAgQSB0b2tlbiB0aGF0IHdpbGwgbmV2ZXIgbWF0Y2guDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKE5vTWF0Y2gsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSAiTm9NYXRjaCINCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiVW5tYXRjaGFibGUgdG9rZW4iDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KDQpjbGFzcyBMaXRlcmFsKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZy4NCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoJykgICMgLT4gWydibGFoJ10NCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoZm9vYmxhaCcpICAjIC0+IFsnYmxhaCddDQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhJykgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAiYmxhaCINCiAgICANCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NMaXRlcmFsfS4NCiAgICANCiAgICBGb3Iga2V5d29yZCBtYXRjaGluZyAoZm9yY2Ugd29yZCBicmVhayBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtYXRjaGVkIHN0cmluZyksDQogICAgdXNlIEx7S2V5d29yZH0gb3IgTHtDYXNlbGVzc0tleXdvcmR9Lg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcgKToNCiAgICAgICAgc3VwZXIoTGl0ZXJhbCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0NCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gTGl0ZXJhbDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBFbXB0eQ0KICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBfdXN0cihzZWxmLm1hdGNoKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBhICpsb3QqDQogICAgIyBpZiB0aGlzIGlzIGEgc2luZ2xlIGNoYXJhY3RlciBtYXRjaCBzdHJpbmcgIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG1hdGNoZXMsDQogICAgIyBzaG9ydC1jaXJjdWl0IGFzIHF1aWNrbHkgYXMgcG9zc2libGUsIGFuZCBhdm9pZCBjYWxsaW5nIHN0YXJ0c3dpdGgNCiAgICAjfiBAcHJvZmlsZQ0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kDQogICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgKToNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCl9MID0gTGl0ZXJhbA0KUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gTGl0ZXJhbA0KDQpjbGFzcyBLZXl3b3JkKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZyBhcyBhIGtleXdvcmQsIHRoYXQgaXMsIGl0IG11c3QgYmUNCiAgICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1rZXl3b3JkIGNoYXJhY3Rlci4gIENvbXBhcmUgd2l0aCBDe0x7TGl0ZXJhbH19Og0KICAgICAtIEN7TGl0ZXJhbCgiaWYiKX0gd2lsbCBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmQW5kT25seUlmJ30uDQogICAgIC0gQ3tLZXl3b3JkKCJpZiIpfSB3aWxsIG5vdDsgaXQgd2lsbCBvbmx5IG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWYgeD0xJ30sIG9yIEN7J2lmKHk9PTIpJ30NCiAgICBBY2NlcHRzIHR3byBvcHRpb25hbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaW4gYWRkaXRpb24gdG8gdGhlIGtleXdvcmQgc3RyaW5nOg0KICAgICAtIEN7aWRlbnRDaGFyc30gaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGJlIHZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVycywNCiAgICAgICAgICBkZWZhdWx0aW5nIHRvIGFsbCBhbHBoYW51bWVyaWNzICsgIl8iIGFuZCAiJCINCiAgICAgLSBDe2Nhc2VsZXNzfSBhbGxvd3MgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgZGVmYXVsdCBpcyBDe0ZhbHNlfS4NCiAgICAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnQiKSAgIyAtPiBbJ3N0YXJ0J10NCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnRpbmciKSAgIyAtPiBFeGNlcHRpb24NCg0KICAgIEZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCB1c2UgTHtDYXNlbGVzc0tleXdvcmR9Lg0KICAgICIiIg0KICAgIERFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGFscGhhbnVtcysiXyQiDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUsIGNhc2VsZXNzPUZhbHNlICk6DQogICAgICAgIHN1cGVyKEtleXdvcmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBpZiBpZGVudENoYXJzIGlzIE5vbmU6DQogICAgICAgICAgICBpZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMNCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQ0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBLZXl3b3JkOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgIHNlbGYubmFtZSA9ICciJXMiJyAlIHNlbGYubWF0Y2gNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5jYXNlbGVzcyA9IGNhc2VsZXNzDQogICAgICAgIGlmIGNhc2VsZXNzOg0KICAgICAgICAgICAgc2VsZi5jYXNlbGVzc21hdGNoID0gbWF0Y2hTdHJpbmcudXBwZXIoKQ0KICAgICAgICAgICAgaWRlbnRDaGFycyA9IGlkZW50Q2hhcnMudXBwZXIoKQ0KICAgICAgICBzZWxmLmlkZW50Q2hhcnMgPSBzZXQoaWRlbnRDaGFycykNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuY2FzZWxlc3M6DQogICAgICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZA0KICAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQNCiAgICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZA0KICAgICAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSBhbmQNCiAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kDQogICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICBjID0gc3VwZXIoS2V5d29yZCxzZWxmKS5jb3B5KCkNCiAgICAgICAgYy5pZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMNCiAgICAgICAgcmV0dXJuIGMNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc2V0RGVmYXVsdEtleXdvcmRDaGFycyggY2hhcnMgKToNCiAgICAgICAgIiIiT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IEtleXdvcmQgY2hhcnMNCiAgICAgICAgIiIiDQogICAgICAgIEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gY2hhcnMNCg0KY2xhc3MgQ2FzZWxlc3NMaXRlcmFsKExpdGVyYWwpOg0KICAgICIiIg0KICAgIFRva2VuIHRvIG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZywgaWdub3JpbmcgY2FzZSBvZiBsZXR0ZXJzLg0KICAgIE5vdGU6IHRoZSBtYXRjaGVkIHJlc3VsdHMgd2lsbCBhbHdheXMgYmUgaW4gdGhlIGNhc2Ugb2YgdGhlIGdpdmVuDQogICAgbWF0Y2ggc3RyaW5nLCBOT1QgdGhlIGNhc2Ugb2YgdGhlIGlucHV0IHRleHQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzTGl0ZXJhbCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnLCAnQ01EJ10NCiAgICAgICAgDQogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0tleXdvcmR9LikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6DQogICAgICAgIHN1cGVyKENhc2VsZXNzTGl0ZXJhbCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcudXBwZXIoKSApDQogICAgICAgICMgUHJlc2VydmUgdGhlIGRlZmluaW5nIGxpdGVyYWwuDQogICAgICAgIHNlbGYucmV0dXJuU3RyaW5nID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5uYW1lID0gIiclcyciICUgc2VsZi5yZXR1cm5TdHJpbmcNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5tYXRjaDoNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5yZXR1cm5TdHJpbmcNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIENhc2VsZXNzS2V5d29yZChLZXl3b3JkKToNCiAgICAiIiINCiAgICBDYXNlbGVzcyB2ZXJzaW9uIG9mIEx7S2V5d29yZH0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzS2V5d29yZCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnXQ0KICAgICAgICANCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzTGl0ZXJhbH0uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSApOg0KICAgICAgICBzdXBlcihDYXNlbGVzc0tleXdvcmQsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzLCBjYXNlbGVzcz1UcnVlICkNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kDQogICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgQ2xvc2VNYXRjaChUb2tlbik6DQogICAgIiIiDQogICAgQSB2YXJpYXRpb24gb24gTHtMaXRlcmFsfSB3aGljaCBtYXRjaGVzICJjbG9zZSIgbWF0Y2hlcywgdGhhdCBpcywgDQogICAgc3RyaW5ncyB3aXRoIGF0IG1vc3QgJ24nIG1pc21hdGNoaW5nIGNoYXJhY3RlcnMuIEN7Q2xvc2VNYXRjaH0gdGFrZXMgcGFyYW1ldGVyczoNCiAgICAgLSBDe21hdGNoX3N0cmluZ30gLSBzdHJpbmcgdG8gYmUgbWF0Y2hlZA0KICAgICAtIEN7bWF4TWlzbWF0Y2hlc30gLSAoQ3tkZWZhdWx0PTF9KSBtYXhpbXVtIG51bWJlciBvZiBtaXNtYXRjaGVzIGFsbG93ZWQgdG8gY291bnQgYXMgYSBtYXRjaA0KICAgIA0KICAgIFRoZSByZXN1bHRzIGZyb20gYSBzdWNjZXNzZnVsIHBhcnNlIHdpbGwgY29udGFpbiB0aGUgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIGZvbGxvd2luZyBuYW1lZCByZXN1bHRzOg0KICAgICAtIEN7bWlzbWF0Y2hlc30gLSBhIGxpc3Qgb2YgdGhlIHBvc2l0aW9ucyB3aXRoaW4gdGhlIG1hdGNoX3N0cmluZyB3aGVyZSBtaXNtYXRjaGVzIHdlcmUgZm91bmQNCiAgICAgLSBDe29yaWdpbmFsfSAtIHRoZSBvcmlnaW5hbCBtYXRjaF9zdHJpbmcgdXNlZCB0byBjb21wYXJlIGFnYWluc3QgdGhlIGlucHV0IHN0cmluZw0KICAgIA0KICAgIElmIEN7bWlzbWF0Y2hlc30gaXMgYW4gZW1wdHkgbGlzdCwgdGhlbiB0aGUgbWF0Y2ggd2FzIGFuIGV4YWN0IG1hdGNoLg0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIpDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAnQVRDQVRDR0FBVEdHQScgKHdpdGggdXAgdG8gMSBtaXNtYXRjaGVzKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQoNCiAgICAgICAgIyBleGFjdCBtYXRjaA0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFUR0dBIikgIyAtPiAoWydBVENBVENHQUFUR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbXV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCg0KICAgICAgICAjIGNsb3NlIG1hdGNoIGFsbG93aW5nIHVwIHRvIDIgbWlzbWF0Y2hlcw0KICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIsIG1heE1pc21hdGNoZXM9MikNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gKFsnQVRDQVhDR0FBWEdHQSddLCB7J21pc21hdGNoZXMnOiBbWzQsIDldXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXRjaF9zdHJpbmcsIG1heE1pc21hdGNoZXM9MSk6DQogICAgICAgIHN1cGVyKENsb3NlTWF0Y2gsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSBtYXRjaF9zdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaF9zdHJpbmcgPSBtYXRjaF9zdHJpbmcNCiAgICAgICAgc2VsZi5tYXhNaXNtYXRjaGVzID0gbWF4TWlzbWF0Y2hlcw0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAlciAod2l0aCB1cCB0byAlZCBtaXNtYXRjaGVzKSIgJSAoc2VsZi5tYXRjaF9zdHJpbmcsIHNlbGYubWF4TWlzbWF0Y2hlcykNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBsZW4oc2VsZi5tYXRjaF9zdHJpbmcpDQoNCiAgICAgICAgaWYgbWF4bG9jIDw9IGluc3RybGVuOg0KICAgICAgICAgICAgbWF0Y2hfc3RyaW5nID0gc2VsZi5tYXRjaF9zdHJpbmcNCiAgICAgICAgICAgIG1hdGNoX3N0cmluZ2xvYyA9IDANCiAgICAgICAgICAgIG1pc21hdGNoZXMgPSBbXQ0KICAgICAgICAgICAgbWF4TWlzbWF0Y2hlcyA9IHNlbGYubWF4TWlzbWF0Y2hlcw0KDQogICAgICAgICAgICBmb3IgbWF0Y2hfc3RyaW5nbG9jLHNfbSBpbiBlbnVtZXJhdGUoemlwKGluc3RyaW5nW2xvYzptYXhsb2NdLCBzZWxmLm1hdGNoX3N0cmluZykpOg0KICAgICAgICAgICAgICAgIHNyYyxtYXQgPSBzX20NCiAgICAgICAgICAgICAgICBpZiBzcmMgIT0gbWF0Og0KICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZChtYXRjaF9zdHJpbmdsb2MpDQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihtaXNtYXRjaGVzKSA+IG1heE1pc21hdGNoZXM6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MgPSBtYXRjaF9zdHJpbmdsb2MgKyAxDQogICAgICAgICAgICAgICAgcmVzdWx0cyA9IFBhcnNlUmVzdWx0cyhbaW5zdHJpbmdbc3RhcnQ6bG9jXV0pDQogICAgICAgICAgICAgICAgcmVzdWx0c1snb3JpZ2luYWwnXSA9IHNlbGYubWF0Y2hfc3RyaW5nDQogICAgICAgICAgICAgICAgcmVzdWx0c1snbWlzbWF0Y2hlcyddID0gbWlzbWF0Y2hlcw0KICAgICAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdHMNCg0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KDQpjbGFzcyBXb3JkKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgYWxsb3dlZCBjaGFyYWN0ZXIgc2V0cy4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGFsbG93ZWQgaW5pdGlhbCBjaGFyYWN0ZXJzLA0KICAgIGFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIGFsbG93ZWQgYm9keSBjaGFyYWN0ZXJzIChpZiBvbWl0dGVkLA0KICAgIGRlZmF1bHRzIHRvIHRoZSBpbml0aWFsIGNoYXJhY3RlciBzZXQpLCBhbmQgYW4gb3B0aW9uYWwgbWluaW11bSwNCiAgICBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhDQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9DQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uIEFuIG9wdGlvbmFsDQogICAgQ3tleGNsdWRlQ2hhcnN9IHBhcmFtZXRlciBjYW4gbGlzdCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgZm91bmQgaW4gDQogICAgdGhlIGlucHV0IEN7Ym9keUNoYXJzfSBzdHJpbmc7IHVzZWZ1bCB0byBkZWZpbmUgYSB3b3JkIG9mIGFsbCBwcmludGFibGVzDQogICAgZXhjZXB0IGZvciBvbmUgb3IgdHdvIGNoYXJhY3RlcnMsIGZvciBpbnN0YW5jZS4NCiAgICANCiAgICBMe3NyYW5nZX0gaXMgdXNlZnVsIGZvciBkZWZpbmluZyBjdXN0b20gY2hhcmFjdGVyIHNldCBzdHJpbmdzIGZvciBkZWZpbmluZyANCiAgICBDe1dvcmR9IGV4cHJlc3Npb25zLCB1c2luZyByYW5nZSBub3RhdGlvbiBmcm9tIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIgc2V0cy4NCiAgICANCiAgICBBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHVzZSBDe1dvcmR9IHRvIG1hdGNoIGEgc3BlY2lmaWMgbGl0ZXJhbCBzdHJpbmcsIGFzIGluIA0KICAgIEN7V29yZCgiQWRkcmVzcyIpfS4gUmVtZW1iZXIgdGhhdCBDe1dvcmR9IHVzZXMgdGhlIHN0cmluZyBhcmd1bWVudCB0byBkZWZpbmUNCiAgICBJe3NldHN9IG9mIG1hdGNoYWJsZSBjaGFyYWN0ZXJzLiBUaGlzIGV4cHJlc3Npb24gd291bGQgbWF0Y2ggIkFkZCIsICJBQUEiLA0KICAgICJkQXJlZCIsIG9yIGFueSBvdGhlciB3b3JkIG1hZGUgdXAgb2YgdGhlIGNoYXJhY3RlcnMgJ0EnLCAnZCcsICdyJywgJ2UnLCBhbmQgJ3MnLg0KICAgIFRvIG1hdGNoIGFuIGV4YWN0IGxpdGVyYWwgc3RyaW5nLCB1c2UgTHtMaXRlcmFsfSBvciBMe0tleXdvcmR9Lg0KDQogICAgcHlwYXJzaW5nIGluY2x1ZGVzIGhlbHBlciBzdHJpbmdzIGZvciBidWlsZGluZyBXb3JkczoNCiAgICAgLSBMe2FscGhhc30NCiAgICAgLSBMe251bXN9DQogICAgIC0gTHthbHBoYW51bXN9DQogICAgIC0gTHtoZXhudW1zfQ0KICAgICAtIEx7YWxwaGFzOGJpdH0gKGFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gYWNjZW50ZWQsIHRpbGRlZCwgdW1sYXV0ZWQsIGV0Yy4pDQogICAgIC0gTHtwdW5jOGJpdH0gKG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGN1cnJlbmN5LCBzeW1ib2xzLCBzdXBlcnNjcmlwdHMsIGRpYWNyaXRpY2FscywgZXRjLikNCiAgICAgLSBMe3ByaW50YWJsZXN9IChhbnkgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyKQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgYSB3b3JkIGNvbXBvc2VkIG9mIGRpZ2l0cw0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKSAjIGVxdWl2YWxlbnQgdG8gV29yZCgiMDEyMzQ1Njc4OSIpIG9yIFdvcmQoc3JhbmdlKCIwLTkiKSkNCiAgICAgICAgDQogICAgICAgICMgYSB3b3JkIHdpdGggYSBsZWFkaW5nIGNhcGl0YWwsIGFuZCB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlDQogICAgICAgIGNhcGl0YWxfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQ0KDQogICAgICAgICMgaG9zdG5hbWVzIGFyZSBhbHBoYW51bWVyaWMsIHdpdGggbGVhZGluZyBhbHBoYSwgYW5kICctJw0KICAgICAgICBob3N0bmFtZSA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMrJy0nKQ0KICAgICAgICANCiAgICAgICAgIyByb21hbiBudW1lcmFsIChub3QgYSBzdHJpY3QgcGFyc2VyLCBhY2NlcHRzIGludmFsaWQgbWl4IG9mIGNoYXJhY3RlcnMpDQogICAgICAgIHJvbWFuID0gV29yZCgiSVZYTENETSIpDQogICAgICAgIA0KICAgICAgICAjIGFueSBzdHJpbmcgb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycywgZXhjZXB0IGZvciAnLCcNCiAgICAgICAgY3N2X3ZhbHVlID0gV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9IiwiKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgaW5pdENoYXJzLCBib2R5Q2hhcnM9Tm9uZSwgbWluPTEsIG1heD0wLCBleGFjdD0wLCBhc0tleXdvcmQ9RmFsc2UsIGV4Y2x1ZGVDaGFycz1Ob25lICk6DQogICAgICAgIHN1cGVyKFdvcmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBpZiBleGNsdWRlQ2hhcnM6DQogICAgICAgICAgICBpbml0Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gaW5pdENoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykNCiAgICAgICAgICAgIGlmIGJvZHlDaGFyczoNCiAgICAgICAgICAgICAgICBib2R5Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gYm9keUNoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykNCiAgICAgICAgc2VsZi5pbml0Q2hhcnNPcmlnID0gaW5pdENoYXJzDQogICAgICAgIHNlbGYuaW5pdENoYXJzID0gc2V0KGluaXRDaGFycykNCiAgICAgICAgaWYgYm9keUNoYXJzIDoNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGJvZHlDaGFycw0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoYm9keUNoYXJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gaW5pdENoYXJzDQogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChpbml0Q2hhcnMpDQoNCiAgICAgICAgc2VsZi5tYXhTcGVjaWZpZWQgPSBtYXggPiAwDQoNCiAgICAgICAgaWYgbWluIDwgMToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoV29yZCgpKSBpZiB6ZXJvLWxlbmd0aCB3b3JkIGlzIHBlcm1pdHRlZCIpDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmFzS2V5d29yZCA9IGFzS2V5d29yZA0KDQogICAgICAgIGlmICcgJyBub3QgaW4gc2VsZi5pbml0Q2hhcnNPcmlnK3NlbGYuYm9keUNoYXJzT3JpZyBhbmQgKG1pbj09MSBhbmQgbWF4PT0wIGFuZCBleGFjdD09MCk6DQogICAgICAgICAgICBpZiBzZWxmLmJvZHlDaGFyc09yaWcgPT0gc2VsZi5pbml0Q2hhcnNPcmlnOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXSsiICUgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpDQogICAgICAgICAgICBlbGlmIGxlbihzZWxmLmluaXRDaGFyc09yaWcpID09IDE6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICIlc1slc10qIiAlIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlLmVzY2FwZShzZWxmLmluaXRDaGFyc09yaWcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc11bJXNdKiIgJSBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpDQogICAgICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gciJcYiIrc2VsZi5yZVN0cmluZytyIlxiIg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKCBzZWxmLnJlU3RyaW5nICkNCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IE5vbmUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYucmU6DQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykNCiAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0Lmdyb3VwKCkNCg0KICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYuaW5pdENoYXJzKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBib2R5Y2hhcnMgPSBzZWxmLmJvZHlDaGFycw0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuDQogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBpbnN0cmxlbiApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIHRocm93RXhjZXB0aW9uID0gRmFsc2UNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KICAgICAgICBpZiBzZWxmLm1heFNwZWNpZmllZCBhbmQgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOg0KICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQogICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOg0KICAgICAgICAgICAgaWYgKHN0YXJ0PjAgYW5kIGluc3RyaW5nW3N0YXJ0LTFdIGluIGJvZHljaGFycykgb3IgKGxvYzxpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnMpOg0KICAgICAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KDQogICAgICAgIGlmIHRocm93RXhjZXB0aW9uOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFdvcmQsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCg0KICAgICAgICAgICAgZGVmIGNoYXJzQXNTdHIocyk6DQogICAgICAgICAgICAgICAgaWYgbGVuKHMpPjQ6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzWzo0XSsiLi4uIg0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzDQoNCiAgICAgICAgICAgIGlmICggc2VsZi5pbml0Q2hhcnNPcmlnICE9IHNlbGYuYm9keUNoYXJzT3JpZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcywlcykiICUgKCBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZyksIGNoYXJzQXNTdHIoc2VsZi5ib2R5Q2hhcnNPcmlnKSApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcykiICUgY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIFJlZ2V4KFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IG1hdGNoIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcmVndWxhciBleHByZXNzaW9uIGluIGEgZm9ybSByZWNvZ25pemVkIGJ5IHRoZSBpbmJ1aWx0IFB5dGhvbiByZSBtb2R1bGUuDQogICAgSWYgdGhlIGdpdmVuIHJlZ2V4IGNvbnRhaW5zIG5hbWVkIGdyb3VwcyAoZGVmaW5lZCB1c2luZyBDeyg/UDxuYW1lPi4uLil9KSwgdGhlc2Ugd2lsbCBiZSBwcmVzZXJ2ZWQgYXMgDQogICAgbmFtZWQgcGFyc2UgcmVzdWx0cy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZWFsbnVtID0gUmVnZXgociJbKy1dP1xkK1wuXGQqIikNCiAgICAgICAgZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkPyktKD9QPGRheT5cZFxkPyknKQ0KICAgICAgICAjIHJlZjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjczOTkvaG93LWRvLXlvdS1tYXRjaC1vbmx5LXZhbGlkLXJvbWFuLW51bWVyYWxzLXdpdGgtYS1yZWd1bGFyLWV4cHJlc3Npb24NCiAgICAgICAgcm9tYW4gPSBSZWdleChyIk17MCw0fShDTXxDRHxEP0N7MCwzfSkoWEN8WEx8TD9YezAsM30pKElYfElWfFY/SXswLDN9KSIpDQogICAgIiIiDQogICAgY29tcGlsZWRSRXR5cGUgPSB0eXBlKHJlLmNvbXBpbGUoIltBLVpdIikpDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXR0ZXJuLCBmbGFncz0wKToNCiAgICAgICAgIiIiVGhlIHBhcmFtZXRlcnMgQ3twYXR0ZXJufSBhbmQgQ3tmbGFnc30gYXJlIHBhc3NlZCB0byB0aGUgQ3tyZS5jb21waWxlKCl9IGZ1bmN0aW9uIGFzLWlzLiBTZWUgdGhlIFB5dGhvbiBDe3JlfSBtb2R1bGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBhY2NlcHRhYmxlIHBhdHRlcm5zIGFuZCBmbGFncy4iIiINCiAgICAgICAgc3VwZXIoUmVnZXgsc2VsZikuX19pbml0X18oKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBpZiBub3QgcGF0dGVybjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gUmVnZXg7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBwYXR0ZXJuDQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MNCg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuDQogICAgICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgcGF0dGVybiwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgICAgIHJhaXNlDQoNCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHBhdHRlcm4sIFJlZ2V4LmNvbXBpbGVkUkV0eXBlKToNCiAgICAgICAgICAgIHNlbGYucmUgPSBwYXR0ZXJuDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBcDQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc3RyKHBhdHRlcm4pDQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MNCiAgICAgICAgICAgIA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUmVnZXggbWF5IG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIHN0cmluZyBvciBhIGNvbXBpbGVkIFJFIG9iamVjdCIpDQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpDQogICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgZCA9IHJlc3VsdC5ncm91cGRpY3QoKQ0KICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMocmVzdWx0Lmdyb3VwKCkpDQogICAgICAgIGlmIGQ6DQogICAgICAgICAgICBmb3IgayBpbiBkOg0KICAgICAgICAgICAgICAgIHJldFtrXSA9IGRba10NCiAgICAgICAgcmV0dXJuIGxvYyxyZXQNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihSZWdleCxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJSZTooJXMpIiAlIHJlcHIoc2VsZi5wYXR0ZXJuKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBRdW90ZWRTdHJpbmcoVG9rZW4pOg0KICAgIHIiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IGFyZSBkZWxpbWl0ZWQgYnkgcXVvdGluZyBjaGFyYWN0ZXJzLg0KICAgIA0KICAgIERlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6DQogICAgICAgIC0gcXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIHF1b3RlIGRlbGltaXRpbmcgc3RyaW5nDQogICAgICAgIC0gZXNjQ2hhciAtIGNoYXJhY3RlciB0byBlc2NhcGUgcXVvdGVzLCB0eXBpY2FsbHkgYmFja3NsYXNoIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgICAgIC0gZXNjUXVvdGUgLSBzcGVjaWFsIHF1b3RlIHNlcXVlbmNlIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCBxdW90ZSBzdHJpbmcgKHN1Y2ggYXMgU1FMJ3MgIiIgdG8gZXNjYXBlIGFuIGVtYmVkZGVkICIpIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgICAgIC0gbXVsdGlsaW5lIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcXVvdGVzIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzIChkZWZhdWx0PUN7RmFsc2V9KQ0KICAgICAgICAtIHVucXVvdGVSZXN1bHRzIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hdGNoZWQgdGV4dCBzaG91bGQgYmUgdW5xdW90ZWQgKGRlZmF1bHQ9Q3tUcnVlfSkNCiAgICAgICAgLSBlbmRRdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgZW5kIG9mIHRoZSBxdW90ZSBkZWxpbWl0ZWQgc3RyaW5nIChkZWZhdWx0PUN7Tm9uZX0gPT4gc2FtZSBhcyBxdW90ZUNoYXIpDQogICAgICAgIC0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzIC0gY29udmVydCBlc2NhcGVkIHdoaXRlc3BhY2UgKEN7J1x0J30sIEN7J1xuJ30sIGV0Yy4pIHRvIGFjdHVhbCB3aGl0ZXNwYWNlIChkZWZhdWx0PUN7VHJ1ZX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcXMgPSBRdW90ZWRTdHJpbmcoJyInKQ0KICAgICAgICBwcmludChxcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSIgc2xkamYnKSkNCiAgICAgICAgY29tcGxleF9xcyA9IFF1b3RlZFN0cmluZygne3snLCBlbmRRdW90ZUNoYXI9J319JykNCiAgICAgICAgcHJpbnQoY29tcGxleF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmIHt7VGhpcyBpcyB0aGUgInF1b3RlIn19IHNsZGpmJykpDQogICAgICAgIHNxbF9xcyA9IFF1b3RlZFN0cmluZygnIicsIGVzY1F1b3RlPSciIicpDQogICAgICAgIHByaW50KHNxbF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICIiZW1iZWRkZWQiIiBxdW90ZXMiIHNsZGpmJykpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUnXV0NCiAgICAgICAgW1snVGhpcyBpcyB0aGUgInF1b3RlIiddXQ0KICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICJlbWJlZGRlZCIgcXVvdGVzJ11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBxdW90ZUNoYXIsIGVzY0NoYXI9Tm9uZSwgZXNjUXVvdGU9Tm9uZSwgbXVsdGlsaW5lPUZhbHNlLCB1bnF1b3RlUmVzdWx0cz1UcnVlLCBlbmRRdW90ZUNoYXI9Tm9uZSwgY29udmVydFdoaXRlc3BhY2VFc2NhcGVzPVRydWUpOg0KICAgICAgICBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19pbml0X18oKQ0KDQogICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIGZyb20gcXVvdGUgY2hhcnMgLSB3b250IHdvcmsgYW55d2F5DQogICAgICAgIHF1b3RlQ2hhciA9IHF1b3RlQ2hhci5zdHJpcCgpDQogICAgICAgIGlmIG5vdCBxdW90ZUNoYXI6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJxdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQ0KDQogICAgICAgIGlmIGVuZFF1b3RlQ2hhciBpcyBOb25lOg0KICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gcXVvdGVDaGFyDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXIuc3RyaXAoKQ0KICAgICAgICAgICAgaWYgbm90IGVuZFF1b3RlQ2hhcjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJlbmRRdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkNCg0KICAgICAgICBzZWxmLnF1b3RlQ2hhciA9IHF1b3RlQ2hhcg0KICAgICAgICBzZWxmLnF1b3RlQ2hhckxlbiA9IGxlbihxdW90ZUNoYXIpDQogICAgICAgIHNlbGYuZmlyc3RRdW90ZUNoYXIgPSBxdW90ZUNoYXJbMF0NCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXINCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXJMZW4gPSBsZW4oZW5kUXVvdGVDaGFyKQ0KICAgICAgICBzZWxmLmVzY0NoYXIgPSBlc2NDaGFyDQogICAgICAgIHNlbGYuZXNjUXVvdGUgPSBlc2NRdW90ZQ0KICAgICAgICBzZWxmLnVucXVvdGVSZXN1bHRzID0gdW5xdW90ZVJlc3VsdHMNCiAgICAgICAgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgPSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMNCg0KICAgICAgICBpZiBtdWx0aWxpbmU6DQogICAgICAgICAgICBzZWxmLmZsYWdzID0gcmUuTVVMVElMSU5FIHwgcmUuRE9UQUxMDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lcyVzXScgJSBcDQogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLA0KICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksDQogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IDANCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzXG5cciVzXScgJSBcDQogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLA0KICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksDQogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQ0KICAgICAgICBpZiBsZW4oc2VsZi5lbmRRdW90ZUNoYXIpID4gMToNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAoDQogICAgICAgICAgICAgICAgJ3woPzonICsgJyl8KD86Jy5qb2luKCIlc1teJXNdIiAlIChyZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXJbOmldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhcltpXSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5lbmRRdW90ZUNoYXIpLTEsMCwtMSkpICsgJyknDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICBpZiBlc2NRdW90ZToNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMpJyAlIHJlLmVzY2FwZShlc2NRdW90ZSkpDQogICAgICAgIGlmIGVzY0NoYXI6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzLiknICUgcmUuZXNjYXBlKGVzY0NoYXIpKQ0KICAgICAgICAgICAgc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4gPSByZS5lc2NhcGUoc2VsZi5lc2NDaGFyKSsiKC4pIg0KICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInKSolcycgJSByZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXIpKQ0KDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykNCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4NCiAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgc2VsZi5wYXR0ZXJuLA0KICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJhaXNlDQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmVzdWx0ID0gaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0UXVvdGVDaGFyIGFuZCBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykgb3IgTm9uZQ0KICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgIHJldCA9IHJlc3VsdC5ncm91cCgpDQoNCiAgICAgICAgaWYgc2VsZi51bnF1b3RlUmVzdWx0czoNCg0KICAgICAgICAgICAgIyBzdHJpcCBvZmYgcXVvdGVzDQogICAgICAgICAgICByZXQgPSByZXRbc2VsZi5xdW90ZUNoYXJMZW46LXNlbGYuZW5kUXVvdGVDaGFyTGVuXQ0KDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJldCxiYXNlc3RyaW5nKToNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCB3aGl0ZXNwYWNlDQogICAgICAgICAgICAgICAgaWYgJ1xcJyBpbiByZXQgYW5kIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzOg0KICAgICAgICAgICAgICAgICAgICB3c19tYXAgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByJ1x0JyA6ICdcdCcsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xuJyA6ICdcbicsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xmJyA6ICdcZicsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xyJyA6ICdccicsDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZm9yIHdzbGl0LHdzY2hhciBpbiB3c19tYXAuaXRlbXMoKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHdzbGl0LCB3c2NoYXIpDQoNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBjaGFyYWN0ZXJzDQogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NDaGFyOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZS5zdWIoc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4sIlxnPDE+IixyZXQpDQoNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBxdW90ZXMNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY1F1b3RlOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZShzZWxmLmVzY1F1b3RlLCBzZWxmLmVuZFF1b3RlQ2hhcikNCg0KICAgICAgICByZXR1cm4gbG9jLCByZXQNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAicXVvdGVkIHN0cmluZywgc3RhcnRpbmcgd2l0aCAlcyBlbmRpbmcgd2l0aCAlcyIgJSAoc2VsZi5xdW90ZUNoYXIsIHNlbGYuZW5kUXVvdGVDaGFyKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBDaGFyc05vdEluKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgY2hhcmFjdGVycyBJe25vdH0gaW4gYSBnaXZlbiBzZXQgKHdpbGwNCiAgICBpbmNsdWRlIHdoaXRlc3BhY2UgaW4gbWF0Y2hlZCBjaGFyYWN0ZXJzIGlmIG5vdCBsaXN0ZWQgaW4gdGhlIHByb3ZpZGVkIGV4Y2x1c2lvbiBzZXQgLSBzZWUgZXhhbXBsZSkuDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBkaXNhbGxvd2VkIGNoYXJhY3RlcnMsIGFuZCBhbiBvcHRpb25hbA0KICAgIG1pbmltdW0sIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGENCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0NCiAgICBhcmUgMCwgbWVhbmluZyBubyBtYXhpbXVtIG9yIGV4YWN0IGxlbmd0aCByZXN0cmljdGlvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGRlZmluZSBhIGNvbW1hLXNlcGFyYXRlZC12YWx1ZSBhcyBhbnl0aGluZyB0aGF0IGlzIG5vdCBhICcsJw0KICAgICAgICBjc3ZfdmFsdWUgPSBDaGFyc05vdEluKCcsJykNCiAgICAgICAgcHJpbnQoZGVsaW1pdGVkTGlzdChjc3ZfdmFsdWUpLnBhcnNlU3RyaW5nKCJka2xzLGxzZGtqZixzMTIgMzQsQCEjLDIxMyIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnZGtscycsICdsc2RramYnLCAnczEyIDM0JywgJ0AhIycsICcyMTMnXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbm90Q2hhcnMsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCApOg0KICAgICAgICBzdXBlcihDaGFyc05vdEluLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYubm90Q2hhcnMgPSBub3RDaGFycw0KDQogICAgICAgIGlmIG1pbiA8IDE6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKENoYXJzTm90SW4oKSkgaWYgemVyby1sZW5ndGggY2hhciBncm91cCBpcyBwZXJtaXR0ZWQiKQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9ICggc2VsZi5taW5MZW4gPT0gMCApDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBpbnN0cmluZ1tsb2NdIGluIHNlbGYubm90Q2hhcnM6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBub3RjaGFycyA9IHNlbGYubm90Q2hhcnMNCiAgICAgICAgbWF4bGVuID0gbWluKCBzdGFydCtzZWxmLm1heExlbiwgbGVuKGluc3RyaW5nKSApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxlbiBhbmQgXA0KICAgICAgICAgICAgICAoaW5zdHJpbmdbbG9jXSBub3QgaW4gbm90Y2hhcnMpOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKENoYXJzTm90SW4sIHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgaWYgbGVuKHNlbGYubm90Q2hhcnMpID4gNDoNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzLi4uKSIgJSBzZWxmLm5vdENoYXJzWzo0XQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzKSIgJSBzZWxmLm5vdENoYXJzDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBXaGl0ZShUb2tlbik6DQogICAgIiIiDQogICAgU3BlY2lhbCBtYXRjaGluZyBjbGFzcyBmb3IgbWF0Y2hpbmcgd2hpdGVzcGFjZS4gIE5vcm1hbGx5LCB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQNCiAgICBieSBweXBhcnNpbmcgZ3JhbW1hcnMuICBUaGlzIGNsYXNzIGlzIGluY2x1ZGVkIHdoZW4gc29tZSB3aGl0ZXNwYWNlIHN0cnVjdHVyZXMNCiAgICBhcmUgc2lnbmlmaWNhbnQuICBEZWZpbmUgd2l0aCBhIHN0cmluZyBjb250YWluaW5nIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gYmUNCiAgICBtYXRjaGVkOyBkZWZhdWx0IGlzIEN7IiBcXHRcXHJcXG4ifS4gIEFsc28gdGFrZXMgb3B0aW9uYWwgQ3ttaW59LCBDe21heH0sIGFuZCBDe2V4YWN0fSBhcmd1bWVudHMsDQogICAgYXMgZGVmaW5lZCBmb3IgdGhlIEN7THtXb3JkfX0gY2xhc3MuDQogICAgIiIiDQogICAgd2hpdGVTdHJzID0gew0KICAgICAgICAiICIgOiAiPFNQQz4iLA0KICAgICAgICAiXHQiOiAiPFRBQj4iLA0KICAgICAgICAiXG4iOiAiPExGPiIsDQogICAgICAgICJcciI6ICI8Q1I+IiwNCiAgICAgICAgIlxmIjogIjxGRj4iLA0KICAgICAgICB9DQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzPSIgXHRcclxuIiwgbWluPTEsIG1heD0wLCBleGFjdD0wKToNCiAgICAgICAgc3VwZXIoV2hpdGUsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm1hdGNoV2hpdGUgPSB3cw0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggIiIuam9pbihjIGZvciBjIGluIHNlbGYud2hpdGVDaGFycyBpZiBjIG5vdCBpbiBzZWxmLm1hdGNoV2hpdGUpICkNCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLm5hbWUgPSAoIiIuam9pbihXaGl0ZS53aGl0ZVN0cnNbY10gZm9yIGMgaW4gc2VsZi5tYXRjaFdoaXRlKSkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLm1hdGNoV2hpdGUpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4NCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGxlbihpbnN0cmluZykgKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gc2VsZi5tYXRjaFdoaXRlOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQoNCmNsYXNzIF9Qb3NpdGlvblRva2VuKFRva2VuKToNCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoX1Bvc2l0aW9uVG9rZW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWU9c2VsZi5fX2NsYXNzX18uX19uYW1lX18NCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KY2xhc3MgR29Ub0NvbHVtbihfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gYWR2YW5jZSB0byBhIHNwZWNpZmljIGNvbHVtbiBvZiBpbnB1dCB0ZXh0OyB1c2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgY29sbm8gKToNCiAgICAgICAgc3VwZXIoR29Ub0NvbHVtbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuY29sID0gY29sbm8NCg0KICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBpZiBjb2wobG9jLGluc3RyaW5nKSAhPSBzZWxmLmNvbDoNCiAgICAgICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXS5pc3NwYWNlKCkgYW5kIGNvbCggbG9jLCBpbnN0cmluZyApICE9IHNlbGYuY29sIDoNCiAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0aGlzY29sID0gY29sKCBsb2MsIGluc3RyaW5nICkNCiAgICAgICAgaWYgdGhpc2NvbCA+IHNlbGYuY29sOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsICJUZXh0IG5vdCBpbiBleHBlY3RlZCBjb2x1bW4iLCBzZWxmICkNCiAgICAgICAgbmV3bG9jID0gbG9jICsgc2VsZi5jb2wgLSB0aGlzY29sDQogICAgICAgIHJldCA9IGluc3RyaW5nWyBsb2M6IG5ld2xvYyBdDQogICAgICAgIHJldHVybiBuZXdsb2MsIHJldA0KDQoNCmNsYXNzIExpbmVTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgDQogICAgICAgIHRlc3QgPSAnJydcDQogICAgICAgIEFBQSB0aGlzIGxpbmUNCiAgICAgICAgQUFBIGFuZCB0aGlzIGxpbmUNCiAgICAgICAgICBBQUEgYnV0IG5vdCB0aGlzIG9uZQ0KICAgICAgICBCIEFBQSBhbmQgZGVmaW5pdGVseSBub3QgdGhpcyBvbmUNCiAgICAgICAgJycnDQoNCiAgICAgICAgZm9yIHQgaW4gKExpbmVTdGFydCgpICsgJ0FBQScgKyByZXN0T2ZMaW5lKS5zZWFyY2hTdHJpbmcodGVzdCk6DQogICAgICAgICAgICBwcmludCh0KQ0KICAgIA0KICAgIFByaW50czo6DQogICAgICAgIFsnQUFBJywgJyB0aGlzIGxpbmUnXQ0KICAgICAgICBbJ0FBQScsICcgYW5kIHRoaXMgbGluZSddICAgIA0KDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKExpbmVTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIGxpbmUiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBjb2wobG9jLCBpbnN0cmluZykgPT0gMToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBMaW5lRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTGluZUVuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMucmVwbGFjZSgiXG4iLCIiKSApDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiBsaW5lIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jPGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICBpZiBpbnN0cmluZ1tsb2NdID09ICJcbiI6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYysxLCAiXG4iDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIFN0cmluZ1N0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFN0cmluZ1N0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgdGV4dCINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyAhPSAwOg0KICAgICAgICAgICAgIyBzZWUgaWYgZW50aXJlIHN0cmluZyB1cCB0byBoZXJlIGlzIGp1c3Qgd2hpdGVzcGFjZSBhbmQgaWdub3JlYWJsZXMNCiAgICAgICAgICAgIGlmIGxvYyAhPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgMCApOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQpjbGFzcyBTdHJpbmdFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoU3RyaW5nRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIHRleHQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgPCBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdDQogICAgICAgIGVsaWYgbG9jID4gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgV29yZFN0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBXb3JkLCBhbmQNCiAgICBpcyBub3QgcHJlY2VkZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30NCiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywNCiAgICB1c2UgQ3tXb3JkU3RhcnQoYWxwaGFudW1zKX0uIEN7V29yZFN0YXJ0fSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGJlZ2lubmluZyBvZg0KICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6DQogICAgICAgIHN1cGVyKFdvcmRTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBzdGFydCBvZiBhIHdvcmQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyAhPSAwOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvYy0xXSBpbiBzZWxmLndvcmRDaGFycyBvcg0KICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvY10gbm90IGluIHNlbGYud29yZENoYXJzKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KY2xhc3MgV29yZEVuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgV29yZCwgYW5kDQogICAgaXMgbm90IGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9DQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsDQogICAgdXNlIEN7V29yZEVuZChhbHBoYW51bXMpfS4gQ3tXb3JkRW5kfSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGVuZCBvZg0KICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgZW5kIG9mIGEgbGluZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6DQogICAgICAgIHN1cGVyKFdvcmRFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIGVuZCBvZiBhIHdvcmQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBpZiBpbnN0cmxlbj4wIGFuZCBsb2M8aW5zdHJsZW46DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSBpbiBzZWxmLndvcmRDaGFycyBvcg0KICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQoNCmNsYXNzIFBhcnNlRXhwcmVzc2lvbihQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBQYXJzZXJFbGVtZW50LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIF9nZW5lcmF0b3JUeXBlICk6DQogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggZXhwcnMgKSBdDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZSggZXhwcnMsIGNvbGxlY3Rpb25zLkl0ZXJhYmxlICk6DQogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpDQogICAgICAgICAgICAjIGlmIHNlcXVlbmNlIG9mIHN0cmluZ3MgcHJvdmlkZWQsIHdyYXAgd2l0aCBMaXRlcmFsDQogICAgICAgICAgICBpZiBhbGwoaXNpbnN0YW5jZShleHByLCBiYXNlc3RyaW5nKSBmb3IgZXhwciBpbiBleHBycyk6DQogICAgICAgICAgICAgICAgZXhwcnMgPSBtYXAoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBleHBycykNCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KGV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KCBleHBycyApDQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIGV4cHJzIF0NCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBGYWxzZQ0KDQogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIHJldHVybiBzZWxmLmV4cHJzW2ldDQoNCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBzZWxmLmV4cHJzLmFwcGVuZCggb3RoZXIgKQ0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgICIiIkV4dGVuZHMgQ3tsZWF2ZVdoaXRlc3BhY2V9IGRlZmluZWQgaW4gYmFzZSBjbGFzcywgYW5kIGFsc28gaW52b2tlcyBDe2xlYXZlV2hpdGVzcGFjZX0gb24NCiAgICAgICAgICAgYWxsIGNvbnRhaW5lZCBleHByZXNzaW9ucy4iIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXhwcnMgPSBbIGUuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnMgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFeHByZXNzaW9uLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHBycykgKQ0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgIyBjb2xsYXBzZSBuZXN0ZWQgQW5kJ3Mgb2YgdGhlIGZvcm0gQW5kKCBBbmQoIEFuZCggYSxiKSwgYyksIGQpIHRvIEFuZCggYSxiLGMsZCApDQogICAgICAgICMgYnV0IG9ubHkgaWYgdGhlcmUgYXJlIG5vIHBhcnNlIGFjdGlvbnMgb3IgcmVzdWx0c05hbWVzIG9uIHRoZSBuZXN0ZWQgQW5kJ3MNCiAgICAgICAgIyAobGlrZXdpc2UgZm9yIE9yJ3MgYW5kIE1hdGNoRmlyc3QncykNCiAgICAgICAgaWYgKCBsZW4oc2VsZi5leHBycykgPT0gMiApOg0KICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWzBdDQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZA0KICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQNCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kDQogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gb3RoZXIuZXhwcnNbOl0gKyBbIHNlbGYuZXhwcnNbMV0gXQ0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yDQoNCiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1stMV0NCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kDQogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZA0KICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBzZWxmLmV4cHJzWzotMV0gKyBvdGhlci5leHByc1s6XQ0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yDQoNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIF91c3RyKHNlbGYpDQogICAgICAgIA0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOg0KICAgICAgICByZXQgPSBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc2V0UmVzdWx0c05hbWUobmFtZSxsaXN0QWxsTWF0Y2hlcykNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KICAgICAgICANCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLmNvcHkoKQ0KICAgICAgICByZXQuZXhwcnMgPSBbZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHByc10NCiAgICAgICAgcmV0dXJuIHJldA0KDQpjbGFzcyBBbmQoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCBpbiB0aGUgZ2l2ZW4gb3JkZXIuDQogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snKyd9IG9wZXJhdG9yLg0KICAgIE1heSBhbHNvIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyctJ30gb3BlcmF0b3IsIHdoaWNoIHdpbGwgc3VwcHJlc3MgYmFja3RyYWNraW5nLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIG5hbWVfZXhwciA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQoNCiAgICAgICAgZXhwciA9IEFuZChbaW50ZWdlcigiaWQiKSxuYW1lX2V4cHIoIm5hbWUiKSxpbnRlZ2VyKCJhZ2UiKV0pDQogICAgICAgICMgbW9yZSBlYXNpbHkgd3JpdHRlbiBhczoNCiAgICAgICAgZXhwciA9IGludGVnZXIoImlkIikgKyBuYW1lX2V4cHIoIm5hbWUiKSArIGludGVnZXIoImFnZSIpDQogICAgIiIiDQoNCiAgICBjbGFzcyBfRXJyb3JTdG9wKEVtcHR5KToNCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICAgICBzdXBlcihBbmQuX0Vycm9yU3RvcCxzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpDQogICAgICAgICAgICBzZWxmLm5hbWUgPSAnLScNCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOg0KICAgICAgICBzdXBlcihBbmQsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwcnNbMF0ud2hpdGVDaGFycyApDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHJzWzBdLnNraXBXaGl0ZXNwYWNlDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgIyBwYXNzIEZhbHNlIGFzIGxhc3QgYXJnIHRvIF9wYXJzZSBmb3IgZmlyc3QgZWxlbWVudCwgc2luY2Ugd2UgYWxyZWFkeQ0KICAgICAgICAjIHByZS1wYXJzZWQgdGhlIHN0cmluZyBhcyBwYXJ0IG9mIG91ciBBbmQgcHJlLXBhcnNpbmcNCiAgICAgICAgbG9jLCByZXN1bHRsaXN0ID0gc2VsZi5leHByc1swXS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZXJyb3JTdG9wID0gRmFsc2UNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByc1sxOl06DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIEFuZC5fRXJyb3JTdG9wKToNCiAgICAgICAgICAgICAgICBlcnJvclN0b3AgPSBUcnVlDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlmIGVycm9yU3RvcDoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZVN5bnRheEV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgICAgICBwZS5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbi5fZnJvbV9leGNlcHRpb24ocGUpDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uKGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICBpZiBleHBydG9rZW5zIG9yIGV4cHJ0b2tlbnMuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgIHJlc3VsdGxpc3QgKz0gZXhwcnRva2Vucw0KICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRsaXN0DQoNCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjQW5kKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCiAgICAgICAgICAgIGlmIG5vdCBlLm1heVJldHVybkVtcHR5Og0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIE9yKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLg0KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIHRoZSBsb25nZXN0IHN0cmluZyB3aWxsIGJlIHVzZWQuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeydeJ30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBjb25zdHJ1Y3QgT3IgdXNpbmcgJ14nIG9wZXJhdG9yDQogICAgICAgIA0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIF4gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKE9yLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgaWYgc2VsZi5leHByczoNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIG1heEV4Y0xvYyA9IC0xDQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUNCiAgICAgICAgbWF0Y2hlcyA9IFtdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgbG9jMiA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQ0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgc2F2ZSBtYXRjaCBhbW9uZyBhbGwgbWF0Y2hlcywgdG8gcmV0cnkgbG9uZ2VzdCB0byBzaG9ydGVzdA0KICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKChsb2MyLCBlKSkNCg0KICAgICAgICBpZiBtYXRjaGVzOg0KICAgICAgICAgICAgbWF0Y2hlcy5zb3J0KGtleT1sYW1iZGEgeDogLXhbMF0pDQogICAgICAgICAgICBmb3IgXyxlIGluIG1hdGNoZXM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCg0KICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6DQogICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikNCg0KDQogICAgZGVmIF9faXhvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI09yKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIF4gIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBNYXRjaEZpcnN0KFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLg0KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGZpcnN0IG9uZSBsaXN0ZWQgaXMgdGhlIG9uZSB0aGF0IHdpbGwgbWF0Y2guDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyd8J30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBjb25zdHJ1Y3QgTWF0Y2hGaXJzdCB1c2luZyAnfCcgb3BlcmF0b3INCiAgICAgICAgDQogICAgICAgICMgd2F0Y2ggdGhlIG9yZGVyIG9mIGV4cHJlc3Npb25zIHRvIG1hdGNoDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgfCBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBGYWlsISAtPiBbWycxMjMnXSwgWyczJ10sIFsnMTQxNiddLCBbJzc4OSddXQ0KDQogICAgICAgICMgcHV0IG1vcmUgc2VsZWN0aXZlIGV4cHJlc3Npb24gZmlyc3QNCiAgICAgICAgbnVtYmVyID0gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkgfCBXb3JkKG51bXMpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEJldHRlciAtPiBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKE1hdGNoRmlyc3Qsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBpZiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgbWF4RXhjTG9jID0gLTENCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldCA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQ0KDQogICAgICAgICMgb25seSBnb3QgaGVyZSBpZiBubyBleHByZXNzaW9uIG1hdGNoZWQsIHJhaXNlIGV4Y2VwdGlvbiBmb3IgbWF0Y2ggdGhhdCBtYWRlIGl0IHRoZSBmdXJ0aGVzdA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQ0KDQogICAgZGVmIF9faW9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiB8ICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgRWFjaChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kLCBidXQgaW4gYW55IG9yZGVyLg0KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JyYnfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb2xvciA9IG9uZU9mKCJSRUQgT1JBTkdFIFlFTExPVyBHUkVFTiBCTFVFIFBVUlBMRSBCTEFDSyBXSElURSBCUk9XTiIpDQogICAgICAgIHNoYXBlX3R5cGUgPSBvbmVPZigiU1FVQVJFIENJUkNMRSBUUklBTkdMRSBTVEFSIEhFWEFHT04gT0NUQUdPTiIpDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIHNoYXBlX2F0dHIgPSAic2hhcGU6IiArIHNoYXBlX3R5cGUoInNoYXBlIikNCiAgICAgICAgcG9zbl9hdHRyID0gInBvc246IiArIEdyb3VwKGludGVnZXIoIngiKSArICcsJyArIGludGVnZXIoInkiKSkoInBvc24iKQ0KICAgICAgICBjb2xvcl9hdHRyID0gImNvbG9yOiIgKyBjb2xvcigiY29sb3IiKQ0KICAgICAgICBzaXplX2F0dHIgPSAic2l6ZToiICsgaW50ZWdlcigic2l6ZSIpDQoNCiAgICAgICAgIyB1c2UgRWFjaCAodXNpbmcgb3BlcmF0b3IgJyYnKSB0byBhY2NlcHQgYXR0cmlidXRlcyBpbiBhbnkgb3JkZXIgDQogICAgICAgICMgKHNoYXBlIGFuZCBwb3NuIGFyZSByZXF1aXJlZCwgY29sb3IgYW5kIHNpemUgYXJlIG9wdGlvbmFsKQ0KICAgICAgICBzaGFwZV9zcGVjID0gc2hhcGVfYXR0ciAmIHBvc25fYXR0ciAmIE9wdGlvbmFsKGNvbG9yX2F0dHIpICYgT3B0aW9uYWwoc2l6ZV9hdHRyKQ0KDQogICAgICAgIHNoYXBlX3NwZWMucnVuVGVzdHMoJycnDQogICAgICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMA0KICAgICAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MA0KICAgICAgICAgICAgY29sb3I6R1JFRU4gc2l6ZToyMCBzaGFwZTpUUklBTkdMRSBwb3NuOjIwLDQwDQogICAgICAgICAgICAnJycNCiAgICAgICAgICAgICkNCiAgICBwcmludHM6Og0KICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMA0KICAgICAgICBbJ3NoYXBlOicsICdTUVVBUkUnLCAnY29sb3I6JywgJ0JMQUNLJywgJ3Bvc246JywgWycxMDAnLCAnLCcsICcxMjAnXV0NCiAgICAgICAgLSBjb2xvcjogQkxBQ0sNCiAgICAgICAgLSBwb3NuOiBbJzEwMCcsICcsJywgJzEyMCddDQogICAgICAgICAgLSB4OiAxMDANCiAgICAgICAgICAtIHk6IDEyMA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCg0KDQogICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODANCiAgICAgICAgWydzaGFwZTonLCAnQ0lSQ0xFJywgJ3NpemU6JywgJzUwJywgJ2NvbG9yOicsICdCTFVFJywgJ3Bvc246JywgWyc1MCcsICcsJywgJzgwJ11dDQogICAgICAgIC0gY29sb3I6IEJMVUUNCiAgICAgICAgLSBwb3NuOiBbJzUwJywgJywnLCAnODAnXQ0KICAgICAgICAgIC0geDogNTANCiAgICAgICAgICAtIHk6IDgwDQogICAgICAgIC0gc2hhcGU6IENJUkNMRQ0KICAgICAgICAtIHNpemU6IDUwDQoNCg0KICAgICAgICBjb2xvcjogR1JFRU4gc2l6ZTogMjAgc2hhcGU6IFRSSUFOR0xFIHBvc246IDIwLDQwDQogICAgICAgIFsnY29sb3I6JywgJ0dSRUVOJywgJ3NpemU6JywgJzIwJywgJ3NoYXBlOicsICdUUklBTkdMRScsICdwb3NuOicsIFsnMjAnLCAnLCcsICc0MCddXQ0KICAgICAgICAtIGNvbG9yOiBHUkVFTg0KICAgICAgICAtIHBvc246IFsnMjAnLCAnLCcsICc0MCddDQogICAgICAgICAgLSB4OiAyMA0KICAgICAgICAgIC0geTogNDANCiAgICAgICAgLSBzaGFwZTogVFJJQU5HTEUNCiAgICAgICAgLSBzaXplOiAyMA0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOg0KICAgICAgICBzdXBlcihFYWNoLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmluaXRFeHByR3JvdXBzOg0KICAgICAgICAgICAgc2VsZi5vcHQxbWFwID0gZGljdCgoaWQoZS5leHByKSxlKSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkpDQogICAgICAgICAgICBvcHQxID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIF0NCiAgICAgICAgICAgIG9wdDIgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBlLm1heVJldHVybkVtcHR5IGFuZCBub3QgaXNpbnN0YW5jZShlLE9wdGlvbmFsKV0NCiAgICAgICAgICAgIHNlbGYub3B0aW9uYWxzID0gb3B0MSArIG9wdDINCiAgICAgICAgICAgIHNlbGYubXVsdGlvcHRpb25hbHMgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxaZXJvT3JNb3JlKSBdDQogICAgICAgICAgICBzZWxmLm11bHRpcmVxdWlyZWQgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPbmVPck1vcmUpIF0NCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBub3QgaXNpbnN0YW5jZShlLChPcHRpb25hbCxaZXJvT3JNb3JlLE9uZU9yTW9yZSkpIF0NCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgKz0gc2VsZi5tdWx0aXJlcXVpcmVkDQogICAgICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gRmFsc2UNCiAgICAgICAgdG1wTG9jID0gbG9jDQogICAgICAgIHRtcFJlcWQgPSBzZWxmLnJlcXVpcmVkWzpdDQogICAgICAgIHRtcE9wdCAgPSBzZWxmLm9wdGlvbmFsc1s6XQ0KICAgICAgICBtYXRjaE9yZGVyID0gW10NCg0KICAgICAgICBrZWVwTWF0Y2hpbmcgPSBUcnVlDQogICAgICAgIHdoaWxlIGtlZXBNYXRjaGluZzoNCiAgICAgICAgICAgIHRtcEV4cHJzID0gdG1wUmVxZCArIHRtcE9wdCArIHNlbGYubXVsdGlvcHRpb25hbHMgKyBzZWxmLm11bHRpcmVxdWlyZWQNCiAgICAgICAgICAgIGZhaWxlZCA9IFtdDQogICAgICAgICAgICBmb3IgZSBpbiB0bXBFeHByczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHRtcExvYyA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCB0bXBMb2MgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFwcGVuZChlKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoT3JkZXIuYXBwZW5kKHNlbGYub3B0MW1hcC5nZXQoaWQoZSksZSkpDQogICAgICAgICAgICAgICAgICAgIGlmIGUgaW4gdG1wUmVxZDoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlcWQucmVtb3ZlKGUpDQogICAgICAgICAgICAgICAgICAgIGVsaWYgZSBpbiB0bXBPcHQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBPcHQucmVtb3ZlKGUpDQogICAgICAgICAgICBpZiBsZW4oZmFpbGVkKSA9PSBsZW4odG1wRXhwcnMpOg0KICAgICAgICAgICAgICAgIGtlZXBNYXRjaGluZyA9IEZhbHNlDQoNCiAgICAgICAgaWYgdG1wUmVxZDoNCiAgICAgICAgICAgIG1pc3NpbmcgPSAiLCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gdG1wUmVxZCkNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxvYywiTWlzc2luZyBvbmUgb3IgbW9yZSByZXF1aXJlZCBlbGVtZW50cyAoJXMpIiAlIG1pc3NpbmcgKQ0KDQogICAgICAgICMgYWRkIGFueSB1bm1hdGNoZWQgT3B0aW9uYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBkZWZhdWx0IHZhbHVlcyBkZWZpbmVkDQogICAgICAgIG1hdGNoT3JkZXIgKz0gW2UgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIGFuZCBlLmV4cHIgaW4gdG1wT3B0XQ0KDQogICAgICAgIHJlc3VsdGxpc3QgPSBbXQ0KICAgICAgICBmb3IgZSBpbiBtYXRjaE9yZGVyOg0KICAgICAgICAgICAgbG9jLHJlc3VsdHMgPSBlLl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zKQ0KICAgICAgICAgICAgcmVzdWx0bGlzdC5hcHBlbmQocmVzdWx0cykNCg0KICAgICAgICBmaW5hbFJlc3VsdHMgPSBzdW0ocmVzdWx0bGlzdCwgUGFyc2VSZXN1bHRzKFtdKSkNCiAgICAgICAgcmV0dXJuIGxvYywgZmluYWxSZXN1bHRzDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgJiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIFBhcnNlRWxlbWVudEVuaGFuY2UoUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZXJFbGVtZW50fSwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQ0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHByLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBpZiBpc3N1YmNsYXNzKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgVG9rZW4pOg0KICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZXhwcikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhMaXRlcmFsKGV4cHIpKQ0KICAgICAgICBzZWxmLmV4cHIgPSBleHByDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgaWYgZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IGV4cHIubWF5SW5kZXhFcnJvcg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGV4cHIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBleHByLndoaXRlQ2hhcnMgKQ0KICAgICAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IGV4cHIuc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IGV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBleHByLmNhbGxQcmVwYXJzZQ0KICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoZXhwci5pZ25vcmVFeHBycykNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIixsb2Msc2VsZi5lcnJtc2csc2VsZikNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXhwciA9IHNlbGYuZXhwci5jb3B5KCkNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLnN0cmVhbWxpbmUoKQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgaWYgc2VsZiBpbiBwYXJzZUVsZW1lbnRMaXN0Og0KICAgICAgICAgICAgcmFpc2UgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbiggcGFyc2VFbGVtZW50TGlzdCtbc2VsZl0gKQ0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lIGFuZCBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHIpICkNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIEZvbGxvd2VkQnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgTG9va2FoZWFkIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tGb2xsb3dlZEJ5fQ0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkNCiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBtYXRjaGVzIGF0IHRoZSBjdXJyZW50DQogICAgcG9zaXRpb24uICBDe0ZvbGxvd2VkQnl9IGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgdXNlIEZvbGxvd2VkQnkgdG8gbWF0Y2ggYSBsYWJlbCBvbmx5IGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgJzonDQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKCJzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiB1cHBlciBsZWZ0IikucHByaW50KCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydjb2xvcicsICdCTEFDSyddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihGb2xsb3dlZEJ5LHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzZWxmLmV4cHIudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQoNCmNsYXNzIE5vdEFueShQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBMb29rYWhlYWQgdG8gZGlzYWxsb3cgbWF0Y2hpbmcgd2l0aCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Tm90QW55fQ0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkNCiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBkb2VzIEl7bm90fSBtYXRjaCBhdCB0aGUgY3VycmVudA0KICAgIHBvc2l0aW9uLiAgQWxzbywgQ3tOb3RBbnl9IGRvZXMgSXtub3R9IHNraXAgb3ZlciBsZWFkaW5nIHdoaXRlc3BhY2UuIEN7Tm90QW55fQ0KICAgIGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0LiAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSAnficgb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKE5vdEFueSxzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZSAgIyBkbyBOT1QgdXNlIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCksIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGV4cHJzDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYuZXJybXNnID0gIkZvdW5kIHVud2FudGVkIHRva2VuLCAiK191c3RyKHNlbGYuZXhwcikNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuZXhwci5jYW5QYXJzZU5leHQoaW5zdHJpbmcsIGxvYyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIn57IiArIF91c3RyKHNlbGYuZXhwcikgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIF9NdWx0aXBsZU1hdGNoKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOg0KICAgICAgICBzdXBlcihfTXVsdGlwbGVNYXRjaCwgc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KICAgICAgICBlbmRlciA9IHN0b3BPbg0KICAgICAgICBpZiBpc2luc3RhbmNlKGVuZGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGVuZGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGVuZGVyKQ0KICAgICAgICBzZWxmLm5vdF9lbmRlciA9IH5lbmRlciBpZiBlbmRlciBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHNlbGZfZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UNCiAgICAgICAgc2VsZl9za2lwX2lnbm9yYWJsZXMgPSBzZWxmLl9za2lwSWdub3JhYmxlcw0KICAgICAgICBjaGVja19lbmRlciA9IHNlbGYubm90X2VuZGVyIGlzIG5vdCBOb25lDQogICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgdHJ5X25vdF9lbmRlciA9IHNlbGYubm90X2VuZGVyLnRyeVBhcnNlDQogICAgICAgIA0KICAgICAgICAjIG11c3QgYmUgYXQgbGVhc3Qgb25lIChidXQgZmlyc3Qgc2VlIGlmIHdlIGFyZSB0aGUgc3RvcE9uIHNlbnRpbmVsOw0KICAgICAgICAjIGlmIHNvLCBmYWlsKQ0KICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaGFzSWdub3JlRXhwcnMgPSAobm90IG5vdCBzZWxmLmlnbm9yZUV4cHJzKQ0KICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQ0KICAgICAgICAgICAgICAgIGlmIGhhc0lnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmX3NraXBfaWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICAgICAgbG9jLCB0bXB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgaWYgdG1wdG9rZW5zIG9yIHRtcHRva2Vucy5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyArPSB0bXB0b2tlbnMNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMNCiAgICAgICAgDQpjbGFzcyBPbmVPck1vcmUoX011bHRpcGxlTWF0Y2gpOg0KICAgICIiIg0KICAgIFJlcGV0aXRpb24gb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQogICAgDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggb25lIG9yIG1vcmUgdGltZXMNCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwNCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiANCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICANCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KDQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBCTEFDSyINCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgICMgRmFpbCEgcmVhZCAnY29sb3InIGFzIGRhdGEgaW5zdGVhZCBvZiBuZXh0IGxhYmVsIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSBjb2xvciddXQ0KDQogICAgICAgICMgdXNlIHN0b3BPbiBhdHRyaWJ1dGUgZm9yIE9uZU9yTW9yZSB0byBhdm9pZCByZWFkaW5nIGxhYmVsIHN0cmluZyBhcyBwYXJ0IG9mIHRoZSBkYXRhDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAjIEJldHRlciAtPiBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdCTEFDSyddXQ0KICAgICAgICANCiAgICAgICAgIyBjb3VsZCBhbHNvIGJlIHdyaXR0ZW4gYXMNCiAgICAgICAgKGF0dHJfZXhwciAqICgxLCkpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpDQogICAgIiIiDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArIF91c3RyKHNlbGYuZXhwcikgKyAifS4uLiINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFplcm9Pck1vcmUoX011bHRpcGxlTWF0Y2gpOg0KICAgICIiIg0KICAgIE9wdGlvbmFsIHJlcGV0aXRpb24gb2YgemVybyBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KICAgIA0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcw0KICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbA0KICAgICAgICAgIChvbmx5IHJlcXVpcmVkIGlmIHRoZSBzZW50aW5lbCB3b3VsZCBvcmRpbmFyaWx5IG1hdGNoIHRoZSByZXBldGl0aW9uIA0KICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIA0KDQogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe09uZU9yTW9yZX0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToNCiAgICAgICAgc3VwZXIoWmVyb09yTW9yZSxzZWxmKS5fX2luaXRfXyhleHByLCBzdG9wT249c3RvcE9uKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICANCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoWmVyb09yTW9yZSwgc2VsZikucGFyc2VJbXBsKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucykNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXS4uLiINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIF9OdWxsVG9rZW4ob2JqZWN0KToNCiAgICBkZWYgX19ib29sX18oc2VsZik6DQogICAgICAgIHJldHVybiBGYWxzZQ0KICAgIF9fbm9uemVyb19fID0gX19ib29sX18NCiAgICBkZWYgX19zdHJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICIiDQoNCl9vcHRpb25hbE5vdE1hdGNoZWQgPSBfTnVsbFRva2VuKCkNCmNsYXNzIE9wdGlvbmFsKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIE9wdGlvbmFsIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzDQogICAgIC0gZGVmYXVsdCAob3B0aW9uYWwpIC0gdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIG9wdGlvbmFsIGV4cHJlc3Npb24gaXMgbm90IGZvdW5kLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgVVMgcG9zdGFsIGNvZGUgY2FuIGJlIGEgNS1kaWdpdCB6aXAsIHBsdXMgb3B0aW9uYWwgNC1kaWdpdCBxdWFsaWZpZXINCiAgICAgICAgemlwID0gQ29tYmluZShXb3JkKG51bXMsIGV4YWN0PTUpICsgT3B0aW9uYWwoJy0nICsgV29yZChudW1zLCBleGFjdD00KSkpDQogICAgICAgIHppcC5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUNCiAgICAgICAgICAgIDEyMzQ1DQogICAgICAgICAgICANCiAgICAgICAgICAgICMgWklQKzQgZm9ybQ0KICAgICAgICAgICAgMTIxMDEtMDAwMQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIGludmFsaWQgWklQDQogICAgICAgICAgICA5ODc2NS0NCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlDQogICAgICAgIDEyMzQ1DQogICAgICAgIFsnMTIzNDUnXQ0KDQogICAgICAgICMgWklQKzQgZm9ybQ0KICAgICAgICAxMjEwMS0wMDAxDQogICAgICAgIFsnMTIxMDEtMDAwMSddDQoNCiAgICAgICAgIyBpbnZhbGlkIFpJUA0KICAgICAgICA5ODc2NS0NCiAgICAgICAgICAgICBeDQogICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDUpLCAobGluZToxLCBjb2w6NikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGRlZmF1bHQ9X29wdGlvbmFsTm90TWF0Y2hlZCApOg0KICAgICAgICBzdXBlcihPcHRpb25hbCxzZWxmKS5fX2luaXRfXyggZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICBzZWxmLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHQNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGxvYywgdG9rZW5zID0gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgaWYgc2VsZi5kZWZhdWx0VmFsdWUgaXMgbm90IF9vcHRpb25hbE5vdE1hdGNoZWQ6DQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByLnJlc3VsdHNOYW1lOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBQYXJzZVJlc3VsdHMoWyBzZWxmLmRlZmF1bHRWYWx1ZSBdKQ0KICAgICAgICAgICAgICAgICAgICB0b2tlbnNbc2VsZi5leHByLnJlc3VsdHNOYW1lXSA9IHNlbGYuZGVmYXVsdFZhbHVlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gWyBzZWxmLmRlZmF1bHRWYWx1ZSBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHRva2VucyA9IFtdDQogICAgICAgIHJldHVybiBsb2MsIHRva2Vucw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBTa2lwVG8oUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIHNraXBwaW5nIG92ZXIgYWxsIHVuZGVmaW5lZCB0ZXh0IHVudGlsIHRoZSBtYXRjaGVkIGV4cHJlc3Npb24gaXMgZm91bmQuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSB0YXJnZXQgZXhwcmVzc2lvbiBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGRhdGEgdG8gYmUgc2tpcHBlZA0KICAgICAtIGluY2x1ZGUgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaWYgVHJ1ZSwgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGFsc28gcGFyc2VkIA0KICAgICAgICAgICh0aGUgc2tpcHBlZCB0ZXh0IGFuZCB0YXJnZXQgZXhwcmVzc2lvbiBhcmUgcmV0dXJuZWQgYXMgYSAyLWVsZW1lbnQgbGlzdCkuDQogICAgIC0gaWdub3JlIC0gKGRlZmF1bHQ9Q3tOb25lfSkgdXNlZCB0byBkZWZpbmUgZ3JhbW1hcnMgKHR5cGljYWxseSBxdW90ZWQgc3RyaW5ncyBhbmQgDQogICAgICAgICAgY29tbWVudHMpIHRoYXQgbWlnaHQgY29udGFpbiBmYWxzZSBtYXRjaGVzIHRvIHRoZSB0YXJnZXQgZXhwcmVzc2lvbg0KICAgICAtIGZhaWxPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBiZSANCiAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgc2tpcHBlZCB0ZXN0OyBpZiBmb3VuZCBiZWZvcmUgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGZvdW5kLCANCiAgICAgICAgICB0aGUgU2tpcFRvIGlzIG5vdCBhIG1hdGNoDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVwb3J0ID0gJycnDQogICAgICAgICAgICBPdXRzdGFuZGluZyBJc3N1ZXMgUmVwb3J0IC0gMSBKYW4gMjAwMA0KDQogICAgICAgICAgICAgICAjIHwgU2V2ZXJpdHkgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBEYXlzIE9wZW4NCiAgICAgICAgICAgIC0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQ0KICAgICAgICAgICAgIDEwMSB8IENyaXRpY2FsIHwgSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCAgICAgICAgICAgICAgICAgfCAgICAgICAgICA2DQogICAgICAgICAgICAgIDk0IHwgQ29zbWV0aWMgfCBTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykgICAgICAgICB8ICAgICAgICAgMTQNCiAgICAgICAgICAgICAgNzkgfCBNaW5vciAgICB8IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzIHwgICAgICAgICA0Nw0KICAgICAgICAgICAgJycnDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIFNFUCA9IFN1cHByZXNzKCd8JykNCiAgICAgICAgIyB1c2UgU2tpcFRvIHRvIHNpbXBseSBtYXRjaCBldmVyeXRoaW5nIHVwIHVudGlsIHRoZSBuZXh0IFNFUA0KICAgICAgICAjIC0gaWdub3JlIHF1b3RlZCBzdHJpbmdzLCBzbyB0aGF0IGEgJ3wnIGNoYXJhY3RlciBpbnNpZGUgYSBxdW90ZWQgc3RyaW5nIGRvZXMgbm90IG1hdGNoDQogICAgICAgICMgLSBwYXJzZSBhY3Rpb24gd2lsbCBjYWxsIHRva2VuLnN0cmlwKCkgZm9yIGVhY2ggbWF0Y2hlZCB0b2tlbiwgaS5lLiwgdGhlIGRlc2NyaXB0aW9uIGJvZHkNCiAgICAgICAgc3RyaW5nX2RhdGEgPSBTa2lwVG8oU0VQLCBpZ25vcmU9cXVvdGVkU3RyaW5nKQ0KICAgICAgICBzdHJpbmdfZGF0YS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIuc3RyaXApKQ0KICAgICAgICB0aWNrZXRfZXhwciA9IChpbnRlZ2VyKCJpc3N1ZV9udW0iKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJzZXYiKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJkZXNjIikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyKCJkYXlzX29wZW4iKSkNCiAgICAgICAgDQogICAgICAgIGZvciB0a3QgaW4gdGlja2V0X2V4cHIuc2VhcmNoU3RyaW5nKHJlcG9ydCk6DQogICAgICAgICAgICBwcmludCB0a3QuZHVtcCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWycxMDEnLCAnQ3JpdGljYWwnLCAnSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCcsICc2J10NCiAgICAgICAgLSBkYXlzX29wZW46IDYNCiAgICAgICAgLSBkZXNjOiBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoDQogICAgICAgIC0gaXNzdWVfbnVtOiAxMDENCiAgICAgICAgLSBzZXY6IENyaXRpY2FsDQogICAgICAgIFsnOTQnLCAnQ29zbWV0aWMnLCAiU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpIiwgJzE0J10NCiAgICAgICAgLSBkYXlzX29wZW46IDE0DQogICAgICAgIC0gZGVzYzogU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpDQogICAgICAgIC0gaXNzdWVfbnVtOiA5NA0KICAgICAgICAtIHNldjogQ29zbWV0aWMNCiAgICAgICAgWyc3OScsICdNaW5vcicsICdTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cycsICc0NyddDQogICAgICAgIC0gZGF5c19vcGVuOiA0Nw0KICAgICAgICAtIGRlc2M6IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzDQogICAgICAgIC0gaXNzdWVfbnVtOiA3OQ0KICAgICAgICAtIHNldjogTWlub3INCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyLCBpbmNsdWRlPUZhbHNlLCBpZ25vcmU9Tm9uZSwgZmFpbE9uPU5vbmUgKToNCiAgICAgICAgc3VwZXIoIFNraXBUbywgc2VsZiApLl9faW5pdF9fKCBvdGhlciApDQogICAgICAgIHNlbGYuaWdub3JlRXhwciA9IGlnbm9yZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmluY2x1ZGVNYXRjaCA9IGluY2x1ZGUNCiAgICAgICAgc2VsZi5hc0xpc3QgPSBGYWxzZQ0KICAgICAgICBpZiBpc2luc3RhbmNlKGZhaWxPbiwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhmYWlsT24pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IGZhaWxPbg0KICAgICAgICBzZWxmLmVycm1zZyA9ICJObyBtYXRjaCBmb3VuZCBmb3IgIitfdXN0cihzZWxmLmV4cHIpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzdGFydGxvYyA9IGxvYw0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgZXhwciA9IHNlbGYuZXhwcg0KICAgICAgICBleHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQ0KICAgICAgICBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgPSBzZWxmLmZhaWxPbi5jYW5QYXJzZU5leHQgaWYgc2VsZi5mYWlsT24gaXMgbm90IE5vbmUgZWxzZSBOb25lDQogICAgICAgIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSA9IHNlbGYuaWdub3JlRXhwci50cnlQYXJzZSBpZiBzZWxmLmlnbm9yZUV4cHIgaXMgbm90IE5vbmUgZWxzZSBOb25lDQogICAgICAgIA0KICAgICAgICB0bXBsb2MgPSBsb2MNCiAgICAgICAgd2hpbGUgdG1wbG9jIDw9IGluc3RybGVuOg0KICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0IGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICMgYnJlYWsgaWYgZmFpbE9uIGV4cHJlc3Npb24gbWF0Y2hlcw0KICAgICAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dChpbnN0cmluZywgdG1wbG9jKToNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgIyBhZHZhbmNlIHBhc3QgaWdub3JlIGV4cHJlc3Npb25zDQogICAgICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wbG9jID0gc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlKGluc3RyaW5nLCB0bXBsb2MpDQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgZXhwcl9wYXJzZShpbnN0cmluZywgdG1wbG9jLCBkb0FjdGlvbnM9RmFsc2UsIGNhbGxQcmVQYXJzZT1GYWxzZSkNCiAgICAgICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgICAgICMgbm8gbWF0Y2gsIGFkdmFuY2UgbG9jIGluIHN0cmluZw0KICAgICAgICAgICAgICAgIHRtcGxvYyArPSAxDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgbWF0Y2hlZCBza2lwdG8gZXhwciwgZG9uZQ0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICMgcmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcgd2l0aG91dCBtYXRjaGluZyBza2lwdG8gZXhwciwgZmFpbA0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgIyBidWlsZCB1cCByZXR1cm4gdmFsdWVzDQogICAgICAgIGxvYyA9IHRtcGxvYw0KICAgICAgICBza2lwdGV4dCA9IGluc3RyaW5nW3N0YXJ0bG9jOmxvY10NCiAgICAgICAgc2tpcHJlc3VsdCA9IFBhcnNlUmVzdWx0cyhza2lwdGV4dCkNCiAgICAgICAgDQogICAgICAgIGlmIHNlbGYuaW5jbHVkZU1hdGNoOg0KICAgICAgICAgICAgbG9jLCBtYXQgPSBleHByX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMsY2FsbFByZVBhcnNlPUZhbHNlKQ0KICAgICAgICAgICAgc2tpcHJlc3VsdCArPSBtYXQNCg0KICAgICAgICByZXR1cm4gbG9jLCBza2lwcmVzdWx0DQoNCmNsYXNzIEZvcndhcmQoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBleHByZXNzaW9uIHRvIGJlIGRlZmluZWQgbGF0ZXIgLQ0KICAgIHVzZWQgZm9yIHJlY3Vyc2l2ZSBncmFtbWFycywgc3VjaCBhcyBhbGdlYnJhaWMgaW5maXggbm90YXRpb24uDQogICAgV2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBrbm93biwgaXQgaXMgYXNzaWduZWQgdG8gdGhlIEN7Rm9yd2FyZH0gdmFyaWFibGUgdXNpbmcgdGhlICc8PCcgb3BlcmF0b3IuDQoNCiAgICBOb3RlOiB0YWtlIGNhcmUgd2hlbiBhc3NpZ25pbmcgdG8gQ3tGb3J3YXJkfSBub3QgdG8gb3Zlcmxvb2sgcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMuDQogICAgU3BlY2lmaWNhbGx5LCAnfCcgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICc8PCcsIHNvIHRoYXQ6Og0KICAgICAgICBmd2RFeHByIDw8IGEgfCBiIHwgYw0KICAgIHdpbGwgYWN0dWFsbHkgYmUgZXZhbHVhdGVkIGFzOjoNCiAgICAgICAgKGZ3ZEV4cHIgPDwgYSkgfCBiIHwgYw0KICAgIHRoZXJlYnkgbGVhdmluZyBiIGFuZCBjIG91dCBhcyBwYXJzZWFibGUgYWx0ZXJuYXRpdmVzLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UNCiAgICBleHBsaWNpdGx5IGdyb3VwIHRoZSB2YWx1ZXMgaW5zZXJ0ZWQgaW50byB0aGUgQ3tGb3J3YXJkfTo6DQogICAgICAgIGZ3ZEV4cHIgPDwgKGEgfCBiIHwgYykNCiAgICBDb252ZXJ0aW5nIHRvIHVzZSB0aGUgJzw8PScgb3BlcmF0b3IgaW5zdGVhZCB3aWxsIGF2b2lkIHRoaXMgcHJvYmxlbS4NCg0KICAgIFNlZSBMe1BhcnNlUmVzdWx0cy5wcHJpbnR9IGZvciBhbiBleGFtcGxlIG9mIGEgcmVjdXJzaXZlIHBhcnNlciBjcmVhdGVkIHVzaW5nDQogICAgQ3tGb3J3YXJkfS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyPU5vbmUgKToNCiAgICAgICAgc3VwZXIoRm9yd2FyZCxzZWxmKS5fX2luaXRfXyggb3RoZXIsIHNhdmVsaXN0PUZhbHNlICkNCg0KICAgIGRlZiBfX2xzaGlmdF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3Mob3RoZXIpDQogICAgICAgIHNlbGYuZXhwciA9IG90aGVyDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gc2VsZi5leHByLm1heUluZGV4RXJyb3INCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IHNlbGYuZXhwci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByLndoaXRlQ2hhcnMgKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByLnNraXBXaGl0ZXNwYWNlDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0DQogICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKHNlbGYuZXhwci5pZ25vcmVFeHBycykNCiAgICAgICAgcmV0dXJuIHNlbGYNCiAgICAgICAgDQogICAgZGVmIF9faWxzaGlmdF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYgPDwgb3RoZXINCiAgICANCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICBpZiBzZWxmIG5vdCBpbiB2YWxpZGF0ZVRyYWNlOg0KICAgICAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKFtdKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6IC4uLiINCg0KICAgICAgICAjIHN0dWJiZWQgb3V0IGZvciBub3cgLSBjcmVhdGVzIGF3ZnVsIG1lbW9yeSBhbmQgcGVyZiBpc3N1ZXMNCiAgICAgICAgc2VsZi5fcmV2ZXJ0Q2xhc3MgPSBzZWxmLl9fY2xhc3NfXw0KICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IF9Gb3J3YXJkTm9SZWN1cnNlDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSBfdXN0cihzZWxmLmV4cHIpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldFN0cmluZyA9ICJOb25lIg0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBzZWxmLl9yZXZlcnRDbGFzcw0KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAiICsgcmV0U3RyaW5nDQoNCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEZvcndhcmQsc2VsZikuY29weSgpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXQgPSBGb3J3YXJkKCkNCiAgICAgICAgICAgIHJldCA8PD0gc2VsZg0KICAgICAgICAgICAgcmV0dXJuIHJldA0KDQpjbGFzcyBfRm9yd2FyZE5vUmVjdXJzZShGb3J3YXJkKToNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIi4uLiINCg0KY2xhc3MgVG9rZW5Db252ZXJ0ZXIoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZUV4cHJlc3Npb259LCBmb3IgY29udmVydGluZyBwYXJzZWQgcmVzdWx0cy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHN1cGVyKFRva2VuQ29udmVydGVyLHNlbGYpLl9faW5pdF9fKCBleHByICkjLCBzYXZlbGlzdCApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IEZhbHNlDQoNCmNsYXNzIENvbWJpbmUoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byBjb25jYXRlbmF0ZSBhbGwgbWF0Y2hpbmcgdG9rZW5zIHRvIGEgc2luZ2xlIHN0cmluZy4NCiAgICBCeSBkZWZhdWx0LCB0aGUgbWF0Y2hpbmcgcGF0dGVybnMgbXVzdCBhbHNvIGJlIGNvbnRpZ3VvdXMgaW4gdGhlIGlucHV0IHN0cmluZzsNCiAgICB0aGlzIGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIEN7J2FkamFjZW50PUZhbHNlJ30gaW4gdGhlIGNvbnN0cnVjdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlYWwgPSBXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKQ0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10NCiAgICAgICAgIyB3aWxsIGFsc28gZXJyb25lb3VzbHkgbWF0Y2ggdGhlIGZvbGxvd2luZw0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddDQoNCiAgICAgICAgcmVhbCA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMy4xNDE2J10NCiAgICAgICAgIyBubyBtYXRjaCB3aGVuIHRoZXJlIGFyZSBpbnRlcm5hbCBzcGFjZXMNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGpvaW5TdHJpbmc9IiIsIGFkamFjZW50PVRydWUgKToNCiAgICAgICAgc3VwZXIoQ29tYmluZSxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgICMgc3VwcHJlc3Mgd2hpdGVzcGFjZS1zdHJpcHBpbmcgaW4gY29udGFpbmVkIHBhcnNlIGV4cHJlc3Npb25zLCBidXQgcmUtZW5hYmxlIGl0IG9uIHRoZSBDb21iaW5lIGl0c2VsZg0KICAgICAgICBpZiBhZGphY2VudDoNCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5hZGphY2VudCA9IGFkamFjZW50DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYuam9pblN0cmluZyA9IGpvaW5TdHJpbmcNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBzZWxmLmFkamFjZW50Og0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pZ25vcmUoc2VsZiwgb3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggQ29tYmluZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0VG9rcyA9IHRva2VubGlzdC5jb3B5KCkNCiAgICAgICAgZGVsIHJldFRva3NbOl0NCiAgICAgICAgcmV0VG9rcyArPSBQYXJzZVJlc3VsdHMoWyAiIi5qb2luKHRva2VubGlzdC5fYXNTdHJpbmdMaXN0KHNlbGYuam9pblN0cmluZykpIF0sIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzKQ0KDQogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWUgYW5kIHJldFRva3MuaGFza2V5cygpOg0KICAgICAgICAgICAgcmV0dXJuIFsgcmV0VG9rcyBdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gcmV0VG9rcw0KDQpjbGFzcyBHcm91cChUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIHJldHVybiB0aGUgbWF0Y2hlZCB0b2tlbnMgYXMgYSBsaXN0IC0gdXNlZnVsIGZvciByZXR1cm5pbmcgdG9rZW5zIG9mIEN7THtaZXJvT3JNb3JlfX0gYW5kIEN7THtPbmVPck1vcmV9fSBleHByZXNzaW9ucy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBudW0gPSBXb3JkKG51bXMpDQogICAgICAgIHRlcm0gPSBpZGVudCB8IG51bQ0KICAgICAgICBmdW5jID0gaWRlbnQgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKQ0KICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCAnYScsICdiJywgJzEwMCddDQoNCiAgICAgICAgZnVuYyA9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpDQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsIFsnYScsICdiJywgJzEwMCddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihHcm91cCxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQ0KDQpjbGFzcyBEaWN0KFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIGEgcmVwZXRpdGl2ZSBleHByZXNzaW9uIGFzIGEgbGlzdCwgYnV0IGFsc28gYXMgYSBkaWN0aW9uYXJ5Lg0KICAgIEVhY2ggZWxlbWVudCBjYW4gYWxzbyBiZSByZWZlcmVuY2VkIHVzaW5nIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgZXhwcmVzc2lvbiBhcyBpdHMga2V5Lg0KICAgIFVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcgd2hlbiB0aGUgZmlyc3QgY29sdW1uIGNhbiBiZSB1c2VkIGFzIGEgaXRlbSBrZXkuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCg0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiDQogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgDQogICAgICAgICMgcHJpbnQgYXR0cmlidXRlcyBhcyBwbGFpbiBncm91cHMNCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgIyBpbnN0ZWFkIG9mIE9uZU9yTW9yZShleHByKSwgcGFyc2UgdXNpbmcgRGljdChPbmVPck1vcmUoR3JvdXAoZXhwcikpKSAtIERpY3Qgd2lsbCBhdXRvLWFzc2lnbiBuYW1lcw0KICAgICAgICByZXN1bHQgPSBEaWN0KE9uZU9yTW9yZShHcm91cChhdHRyX2V4cHIpKSkucGFyc2VTdHJpbmcodGV4dCkNCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgICMgYWNjZXNzIG5hbWVkIGZpZWxkcyBhcyBkaWN0IGVudHJpZXMsIG9yIG91dHB1dCBhcyBkaWN0DQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkgICAgICAgIA0KICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydzaGFwZScsICdTUVVBUkUnLCAncG9zbicsICd1cHBlciBsZWZ0JywgJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnLCAndGV4dHVyZScsICdidXJsYXAnXQ0KDQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQ0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlDQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXANCiAgICAgICAgU1FVQVJFDQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnLCAnc2hhcGUnOiAnU1FVQVJFJ30NCiAgICBTZWUgbW9yZSBleGFtcGxlcyBhdCBMe1BhcnNlUmVzdWx0c30gb2YgYWNjZXNzaW5nIGZpZWxkcyBieSByZXN1bHRzIG5hbWUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKERpY3Qsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgZm9yIGksdG9rIGluIGVudW1lcmF0ZSh0b2tlbmxpc3QpOg0KICAgICAgICAgICAgaWYgbGVuKHRvaykgPT0gMDoNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWtleSA9IHRva1swXQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpa2V5LGludCk6DQogICAgICAgICAgICAgICAgaWtleSA9IF91c3RyKHRva1swXSkuc3RyaXAoKQ0KICAgICAgICAgICAgaWYgbGVuKHRvayk9PTE6DQogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoIiIsaSkNCiAgICAgICAgICAgIGVsaWYgbGVuKHRvayk9PTIgYW5kIG5vdCBpc2luc3RhbmNlKHRva1sxXSxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva1sxXSxpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBkaWN0dmFsdWUgPSB0b2suY29weSgpICNQYXJzZVJlc3VsdHMoaSkNCiAgICAgICAgICAgICAgICBkZWwgZGljdHZhbHVlWzBdDQogICAgICAgICAgICAgICAgaWYgbGVuKGRpY3R2YWx1ZSkhPSAxIG9yIChpc2luc3RhbmNlKGRpY3R2YWx1ZSxQYXJzZVJlc3VsdHMpIGFuZCBkaWN0dmFsdWUuaGFza2V5cygpKToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlLGkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlWzBdLGkpDQoNCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZToNCiAgICAgICAgICAgIHJldHVybiBbIHRva2VubGlzdCBdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gdG9rZW5saXN0DQoNCg0KY2xhc3MgU3VwcHJlc3MoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciBmb3IgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2YgYSBwYXJzZWQgZXhwcmVzc2lvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBzb3VyY2UgPSAiYSwgYiwgYyxkIg0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICB3ZF9saXN0MSA9IHdkICsgWmVyb09yTW9yZSgnLCcgKyB3ZCkNCiAgICAgICAgcHJpbnQod2RfbGlzdDEucGFyc2VTdHJpbmcoc291cmNlKSkNCg0KICAgICAgICAjIG9mdGVuLCBkZWxpbWl0ZXJzIHRoYXQgYXJlIHVzZWZ1bCBkdXJpbmcgcGFyc2luZyBhcmUganVzdCBpbiB0aGUNCiAgICAgICAgIyB3YXkgYWZ0ZXJ3YXJkIC0gdXNlIFN1cHByZXNzIHRvIGtlZXAgdGhlbSBvdXQgb2YgdGhlIHBhcnNlZCBvdXRwdXQNCiAgICAgICAgd2RfbGlzdDIgPSB3ZCArIFplcm9Pck1vcmUoU3VwcHJlc3MoJywnKSArIHdkKQ0KICAgICAgICBwcmludCh3ZF9saXN0Mi5wYXJzZVN0cmluZyhzb3VyY2UpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnYScsICcsJywgJ2InLCAnLCcsICdjJywgJywnLCAnZCddDQogICAgICAgIFsnYScsICdiJywgJ2MnLCAnZCddDQogICAgKFNlZSBhbHNvIEx7ZGVsaW1pdGVkTGlzdH0uKQ0KICAgICIiIg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gW10NCg0KICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gc2VsZg0KDQoNCmNsYXNzIE9ubHlPbmNlKG9iamVjdCk6DQogICAgIiIiDQogICAgV3JhcHBlciBmb3IgcGFyc2UgYWN0aW9ucywgdG8gZW5zdXJlIHRoZXkgYXJlIG9ubHkgY2FsbGVkIG9uY2UuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZENhbGwpOg0KICAgICAgICBzZWxmLmNhbGxhYmxlID0gX3RyaW1fYXJpdHkobWV0aG9kQ2FsbCkNCiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQ0KICAgIGRlZiBfX2NhbGxfXyhzZWxmLHMsbCx0KToNCiAgICAgICAgaWYgbm90IHNlbGYuY2FsbGVkOg0KICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGYuY2FsbGFibGUocyxsLHQpDQogICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUNCiAgICAgICAgICAgIHJldHVybiByZXN1bHRzDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiIikNCiAgICBkZWYgcmVzZXQoc2VsZik6DQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCg0KZGVmIHRyYWNlUGFyc2VBY3Rpb24oZik6DQogICAgIiIiDQogICAgRGVjb3JhdG9yIGZvciBkZWJ1Z2dpbmcgcGFyc2UgYWN0aW9ucy4gDQogICAgDQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGlzIGNhbGxlZCwgdGhpcyBkZWNvcmF0b3Igd2lsbCBwcmludCBDeyI+PiBlbnRlcmluZyBJe21ldGhvZC1uYW1lfShsaW5lOkl7Y3VycmVudF9zb3VyY2VfbGluZX0sIEl7cGFyc2VfbG9jYXRpb259LCBJe21hdGNoZWRfdG9rZW5zfSkiLn0NCiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gY29tcGxldGVzLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPDwifSBmb2xsb3dlZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUsIG9yIGFueSBleGNlcHRpb24gdGhhdCB0aGUgcGFyc2UgYWN0aW9uIHJhaXNlZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KDQogICAgICAgIEB0cmFjZVBhcnNlQWN0aW9uDQogICAgICAgIGRlZiByZW1vdmVfZHVwbGljYXRlX2NoYXJzKHRva2Vucyk6DQogICAgICAgICAgICByZXR1cm4gJycuam9pbihzb3J0ZWQoc2V0KCcnLmpvaW4odG9rZW5zKSkpDQoNCiAgICAgICAgd2RzID0gT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbihyZW1vdmVfZHVwbGljYXRlX2NoYXJzKQ0KICAgICAgICBwcmludCh3ZHMucGFyc2VTdHJpbmcoInNsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgPj5lbnRlcmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzKGxpbmU6ICdzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZicsIDAsIChbJ3Nsa2RqcycsICdzbGQnLCAnc2xkZCcsICdzZGxmJywgJ3NkbGpmJ10sIHt9KSkNCiAgICAgICAgPDxsZWF2aW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMgKHJldDogJ2RmamtscycpDQogICAgICAgIFsnZGZqa2xzJ10NCiAgICAiIiINCiAgICBmID0gX3RyaW1fYXJpdHkoZikNCiAgICBkZWYgeigqcGFBcmdzKToNCiAgICAgICAgdGhpc0Z1bmMgPSBmLl9fbmFtZV9fDQogICAgICAgIHMsbCx0ID0gcGFBcmdzWy0zOl0NCiAgICAgICAgaWYgbGVuKHBhQXJncyk+MzoNCiAgICAgICAgICAgIHRoaXNGdW5jID0gcGFBcmdzWzBdLl9fY2xhc3NfXy5fX25hbWVfXyArICcuJyArIHRoaXNGdW5jDQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI+PmVudGVyaW5nICVzKGxpbmU6ICclcycsICVkLCAlcilcbiIgJSAodGhpc0Z1bmMsbGluZShsLHMpLGwsdCkgKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXQgPSBmKCpwYUFyZ3MpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAoZXhjZXB0aW9uOiAlcylcbiIgJSAodGhpc0Z1bmMsZXhjKSApDQogICAgICAgICAgICByYWlzZQ0KICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChyZXQ6ICVyKVxuIiAlICh0aGlzRnVuYyxyZXQpICkNCiAgICAgICAgcmV0dXJuIHJldA0KICAgIHRyeToNCiAgICAgICAgei5fX25hbWVfXyA9IGYuX19uYW1lX18NCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgIHBhc3MNCiAgICByZXR1cm4geg0KDQojDQojIGdsb2JhbCBoZWxwZXJzDQojDQpkZWYgZGVsaW1pdGVkTGlzdCggZXhwciwgZGVsaW09IiwiLCBjb21iaW5lPUZhbHNlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIGRlbGltaXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIC0gdGhlIGRlbGltaXRlciBkZWZhdWx0cyB0byAnLCcuDQogICAgQnkgZGVmYXVsdCwgdGhlIGxpc3QgZWxlbWVudHMgYW5kIGRlbGltaXRlcnMgY2FuIGhhdmUgaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSwgYW5kDQogICAgY29tbWVudHMsIGJ1dCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgQ3tjb21iaW5lPVRydWV9IGluIHRoZSBjb25zdHJ1Y3Rvci4NCiAgICBJZiBDe2NvbWJpbmV9IGlzIHNldCB0byBDe1RydWV9LCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZCBhcyBhIHNpbmdsZSB0b2tlbg0KICAgIHN0cmluZywgd2l0aCB0aGUgZGVsaW1pdGVycyBpbmNsdWRlZDsgb3RoZXJ3aXNlLCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZA0KICAgIGFzIGEgbGlzdCBvZiB0b2tlbnMsIHdpdGggdGhlIGRlbGltaXRlcnMgc3VwcHJlc3NlZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFhLGJiLGNjIikgIyAtPiBbJ2FhJywgJ2JiJywgJ2NjJ10NCiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGhleG51bXMpLCBkZWxpbT0nOicsIGNvbWJpbmU9VHJ1ZSkucGFyc2VTdHJpbmcoIkFBOkJCOkNDOkREOkVFIikgIyAtPiBbJ0FBOkJCOkNDOkREOkVFJ10NCiAgICAiIiINCiAgICBkbE5hbWUgPSBfdXN0cihleHByKSsiIFsiK191c3RyKGRlbGltKSsiICIrX3VzdHIoZXhwcikrIl0uLi4iDQogICAgaWYgY29tYmluZToNCiAgICAgICAgcmV0dXJuIENvbWJpbmUoIGV4cHIgKyBaZXJvT3JNb3JlKCBkZWxpbSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybiAoIGV4cHIgKyBaZXJvT3JNb3JlKCBTdXBwcmVzcyggZGVsaW0gKSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQ0KDQpkZWYgY291bnRlZEFycmF5KCBleHByLCBpbnRFeHByPU5vbmUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgY291bnRlZCBsaXN0IG9mIGV4cHJlc3Npb25zLg0KICAgIFRoaXMgaGVscGVyIGRlZmluZXMgYSBwYXR0ZXJuIG9mIHRoZSBmb3JtOjoNCiAgICAgICAgaW50ZWdlciBleHByIGV4cHIgZXhwci4uLg0KICAgIHdoZXJlIHRoZSBsZWFkaW5nIGludGVnZXIgdGVsbHMgaG93IG1hbnkgZXhwciBleHByZXNzaW9ucyBmb2xsb3cuDQogICAgVGhlIG1hdGNoZWQgdG9rZW5zIHJldHVybnMgdGhlIGFycmF5IG9mIGV4cHIgdG9rZW5zIGFzIGEgbGlzdCAtIHRoZSBsZWFkaW5nIGNvdW50IHRva2VuIGlzIHN1cHByZXNzZWQuDQogICAgDQogICAgSWYgQ3tpbnRFeHByfSBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uIHRoYXQgcHJvZHVjZXMgYW4gaW50ZWdlciB2YWx1ZS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygnMiBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQ0KDQogICAgICAgICMgaW4gdGhpcyBwYXJzZXIsIHRoZSBsZWFkaW5nIGludGVnZXIgdmFsdWUgaXMgZ2l2ZW4gaW4gYmluYXJ5LA0KICAgICAgICAjICcxMCcgaW5kaWNhdGluZyB0aGF0IDIgdmFsdWVzIGFyZSBpbiB0aGUgYXJyYXkNCiAgICAgICAgYmluYXJ5Q29uc3RhbnQgPSBXb3JkKCcwMScpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiBpbnQodFswXSwgMikpDQogICAgICAgIGNvdW50ZWRBcnJheShXb3JkKGFscGhhcyksIGludEV4cHI9YmluYXJ5Q29uc3RhbnQpLnBhcnNlU3RyaW5nKCcxMCBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQ0KICAgICIiIg0KICAgIGFycmF5RXhwciA9IEZvcndhcmQoKQ0KICAgIGRlZiBjb3VudEZpZWxkUGFyc2VBY3Rpb24ocyxsLHQpOg0KICAgICAgICBuID0gdFswXQ0KICAgICAgICBhcnJheUV4cHIgPDwgKG4gYW5kIEdyb3VwKEFuZChbZXhwcl0qbikpIG9yIEdyb3VwKGVtcHR5KSkNCiAgICAgICAgcmV0dXJuIFtdDQogICAgaWYgaW50RXhwciBpcyBOb25lOg0KICAgICAgICBpbnRFeHByID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDppbnQodFswXSkpDQogICAgZWxzZToNCiAgICAgICAgaW50RXhwciA9IGludEV4cHIuY29weSgpDQogICAgaW50RXhwci5zZXROYW1lKCJhcnJheUxlbiIpDQogICAgaW50RXhwci5hZGRQYXJzZUFjdGlvbihjb3VudEZpZWxkUGFyc2VBY3Rpb24sIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXR1cm4gKCBpbnRFeHByICsgYXJyYXlFeHByICkuc2V0TmFtZSgnKGxlbikgJyArIF91c3RyKGV4cHIpICsgJy4uLicpDQoNCmRlZiBfZmxhdHRlbihMKToNCiAgICByZXQgPSBbXQ0KICAgIGZvciBpIGluIEw6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoaSxsaXN0KToNCiAgICAgICAgICAgIHJldC5leHRlbmQoX2ZsYXR0ZW4oaSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXQuYXBwZW5kKGkpDQogICAgcmV0dXJuIHJldA0KDQpkZWYgbWF0Y2hQcmV2aW91c0xpdGVyYWwoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20NCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcw0KICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoNCiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpDQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNMaXRlcmFsKGZpcnN0KQ0KICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZA0KICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBhDQogICAgcHJldmlvdXMgbGl0ZXJhbCwgd2lsbCBhbHNvIG1hdGNoIHRoZSBsZWFkaW5nIEN7IjE6MSJ9IGluIEN7IjE6MTAifS4NCiAgICBJZiB0aGlzIGlzIG5vdCBkZXNpcmVkLCB1c2UgQ3ttYXRjaFByZXZpb3VzRXhwcn0uDQogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLg0KICAgICIiIg0KICAgIHJlcCA9IEZvcndhcmQoKQ0KICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToNCiAgICAgICAgaWYgdDoNCiAgICAgICAgICAgIGlmIGxlbih0KSA9PSAxOg0KICAgICAgICAgICAgICAgIHJlcCA8PCB0WzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgZmxhdHRlbiB0IHRva2Vucw0KICAgICAgICAgICAgICAgIHRmbGF0ID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgICAgICAgICByZXAgPDwgQW5kKExpdGVyYWwodHQpIGZvciB0dCBpbiB0ZmxhdCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJlcCA8PCBFbXB0eSgpDQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpDQogICAgcmV0dXJuIHJlcA0KDQpkZWYgbWF0Y2hQcmV2aW91c0V4cHIoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20NCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcw0KICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoNCiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpDQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNFeHByKGZpcnN0KQ0KICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZA0KICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBieQ0KICAgIGV4cHJlc3Npb25zLCB3aWxsIEl7bm90fSBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn07DQogICAgdGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVkLCBzbw0KICAgIEN7IjEifSBpcyBjb21wYXJlZCB3aXRoIEN7IjEwIn0uDQogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLg0KICAgICIiIg0KICAgIHJlcCA9IEZvcndhcmQoKQ0KICAgIGUyID0gZXhwci5jb3B5KCkNCiAgICByZXAgPDw9IGUyDQogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOg0KICAgICAgICBtYXRjaFRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgIGRlZiBtdXN0TWF0Y2hUaGVzZVRva2VucyhzLGwsdCk6DQogICAgICAgICAgICB0aGVzZVRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgICAgICBpZiAgdGhlc2VUb2tlbnMgIT0gbWF0Y2hUb2tlbnM6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsMCwiIikNCiAgICAgICAgcmVwLnNldFBhcnNlQWN0aW9uKCBtdXN0TWF0Y2hUaGVzZVRva2VucywgY2FsbER1cmluZ1RyeT1UcnVlICkNCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkNCiAgICByZXR1cm4gcmVwDQoNCmRlZiBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHMpOg0KICAgICN+ICBlc2NhcGUgdGhlc2UgY2hhcnM6IF4tXQ0KICAgIGZvciBjIGluIHIiXF4tXSI6DQogICAgICAgIHMgPSBzLnJlcGxhY2UoYyxfYnNsYXNoK2MpDQogICAgcyA9IHMucmVwbGFjZSgiXG4iLHIiXG4iKQ0KICAgIHMgPSBzLnJlcGxhY2UoIlx0IixyIlx0IikNCiAgICByZXR1cm4gX3VzdHIocykNCg0KZGVmIG9uZU9mKCBzdHJzLCBjYXNlbGVzcz1GYWxzZSwgdXNlUmVnZXg9VHJ1ZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBxdWlja2x5IGRlZmluZSBhIHNldCBvZiBhbHRlcm5hdGl2ZSBMaXRlcmFscywgYW5kIG1ha2VzIHN1cmUgdG8gZG8NCiAgICBsb25nZXN0LWZpcnN0IHRlc3Rpbmcgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0LCByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBvcmRlciwNCiAgICBidXQgcmV0dXJucyBhIEN7THtNYXRjaEZpcnN0fX0gZm9yIGJlc3QgcGVyZm9ybWFuY2UuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIHN0cnMgLSBhIHN0cmluZyBvZiBzcGFjZS1kZWxpbWl0ZWQgbGl0ZXJhbHMsIG9yIGEgY29sbGVjdGlvbiBvZiBzdHJpbmcgbGl0ZXJhbHMNCiAgICAgLSBjYXNlbGVzcyAtIChkZWZhdWx0PUN7RmFsc2V9KSAtIHRyZWF0IGFsbCBsaXRlcmFscyBhcyBjYXNlbGVzcw0KICAgICAtIHVzZVJlZ2V4IC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBhcyBhbiBvcHRpbWl6YXRpb24sIHdpbGwgZ2VuZXJhdGUgYSBSZWdleA0KICAgICAgICAgIG9iamVjdDsgb3RoZXJ3aXNlLCB3aWxsIGdlbmVyYXRlIGEgQ3tNYXRjaEZpcnN0fSBvYmplY3QgKGlmIEN7Y2FzZWxlc3M9VHJ1ZX0sIG9yDQogICAgICAgICAgaWYgY3JlYXRpbmcgYSBDe1JlZ2V4fSByYWlzZXMgYW4gZXhjZXB0aW9uKQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvbXBfb3BlciA9IG9uZU9mKCI8ID0gPiA8PSA+PSAhPSIpDQogICAgICAgIHZhciA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpDQogICAgICAgIHRlcm0gPSB2YXIgfCBudW1iZXINCiAgICAgICAgY29tcGFyaXNvbl9leHByID0gdGVybSArIGNvbXBfb3BlciArIHRlcm0NCiAgICAgICAgcHJpbnQoY29tcGFyaXNvbl9leHByLnNlYXJjaFN0cmluZygiQiA9IDEyICBBQT0yMyBCPD1BQSBBQT4xMiIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ0InLCAnPScsICcxMiddLCBbJ0FBJywgJz0nLCAnMjMnXSwgWydCJywgJzw9JywgJ0FBJ10sIFsnQUEnLCAnPicsICcxMiddXQ0KICAgICIiIg0KICAgIGlmIGNhc2VsZXNzOg0KICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhLnVwcGVyKCkgPT0gYi51cHBlcigpICkNCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIudXBwZXIoKS5zdGFydHN3aXRoKGEudXBwZXIoKSkgKQ0KICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IENhc2VsZXNzTGl0ZXJhbA0KICAgIGVsc2U6DQogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEgPT0gYiApDQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnN0YXJ0c3dpdGgoYSkgKQ0KICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IExpdGVyYWwNCg0KICAgIHN5bWJvbHMgPSBbXQ0KICAgIGlmIGlzaW5zdGFuY2Uoc3RycyxiYXNlc3RyaW5nKToNCiAgICAgICAgc3ltYm9scyA9IHN0cnMuc3BsaXQoKQ0KICAgIGVsaWYgaXNpbnN0YW5jZShzdHJzLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSk6DQogICAgICAgIHN5bWJvbHMgPSBsaXN0KHN0cnMpDQogICAgZWxzZToNCiAgICAgICAgd2FybmluZ3Mud2FybigiSW52YWxpZCBhcmd1bWVudCB0byBvbmVPZiwgZXhwZWN0ZWQgc3RyaW5nIG9yIGl0ZXJhYmxlIiwNCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgaWYgbm90IHN5bWJvbHM6DQogICAgICAgIHJldHVybiBOb01hdGNoKCkNCg0KICAgIGkgPSAwDQogICAgd2hpbGUgaSA8IGxlbihzeW1ib2xzKS0xOg0KICAgICAgICBjdXIgPSBzeW1ib2xzW2ldDQogICAgICAgIGZvciBqLG90aGVyIGluIGVudW1lcmF0ZShzeW1ib2xzW2krMTpdKToNCiAgICAgICAgICAgIGlmICggaXNlcXVhbChvdGhlciwgY3VyKSApOg0KICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQ0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICBlbGlmICggbWFza3MoY3VyLCBvdGhlcikgKToNCiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0NCiAgICAgICAgICAgICAgICBzeW1ib2xzLmluc2VydChpLG90aGVyKQ0KICAgICAgICAgICAgICAgIGN1ciA9IG90aGVyDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGkgKz0gMQ0KDQogICAgaWYgbm90IGNhc2VsZXNzIGFuZCB1c2VSZWdleDoNCiAgICAgICAgI34gcHJpbnQgKHN0cnMsIi0+IiwgInwiLmpvaW4oIFsgX2VzY2FwZVJlZ2V4Q2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHNdICkpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGlmIGxlbihzeW1ib2xzKT09bGVuKCIiLmpvaW4oc3ltYm9scykpOg0KICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggIlslc10iICUgIiIuam9pbihfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAifCIuam9pbihyZS5lc2NhcGUoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiRXhjZXB0aW9uIGNyZWF0aW5nIFJlZ2V4IGZvciBvbmVPZiwgYnVpbGRpbmcgTWF0Y2hGaXJzdCIsDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCg0KDQogICAgIyBsYXN0IHJlc29ydCwganVzdCB1c2UgTWF0Y2hGaXJzdA0KICAgIHJldHVybiBNYXRjaEZpcnN0KHBhcnNlRWxlbWVudENsYXNzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQoNCmRlZiBkaWN0T2YoIGtleSwgdmFsdWUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZWFzaWx5IGFuZCBjbGVhcmx5IGRlZmluZSBhIGRpY3Rpb25hcnkgYnkgc3BlY2lmeWluZyB0aGUgcmVzcGVjdGl2ZSBwYXR0ZXJucw0KICAgIGZvciB0aGUga2V5IGFuZCB2YWx1ZS4gIFRha2VzIGNhcmUgb2YgZGVmaW5pbmcgdGhlIEN7THtEaWN0fX0sIEN7THtaZXJvT3JNb3JlfX0sIGFuZCBDe0x7R3JvdXB9fSB0b2tlbnMNCiAgICBpbiB0aGUgcHJvcGVyIG9yZGVyLiAgVGhlIGtleSBwYXR0ZXJuIGNhbiBpbmNsdWRlIGRlbGltaXRpbmcgbWFya2VycyBvciBwdW5jdHVhdGlvbiwNCiAgICBhcyBsb25nIGFzIHRoZXkgYXJlIHN1cHByZXNzZWQsIHRoZXJlYnkgbGVhdmluZyB0aGUgc2lnbmlmaWNhbnQga2V5IHRleHQuICBUaGUgdmFsdWUNCiAgICBwYXR0ZXJuIGNhbiBpbmNsdWRlIG5hbWVkIHJlc3VsdHMsIHNvIHRoYXQgdGhlIEN7RGljdH0gcmVzdWx0cyBjYW4gaW5jbHVkZSBuYW1lZCB0b2tlbg0KICAgIGZpZWxkcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiDQogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgYXR0cl9sYWJlbCA9IGxhYmVsDQogICAgICAgIGF0dHJfdmFsdWUgPSBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikNCg0KICAgICAgICAjIHNpbWlsYXIgdG8gRGljdCwgYnV0IHNpbXBsZXIgY2FsbCBmb3JtYXQNCiAgICAgICAgcmVzdWx0ID0gZGljdE9mKGF0dHJfbGFiZWwsIGF0dHJfdmFsdWUpLnBhcnNlU3RyaW5nKHRleHQpDQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkNCiAgICAgICAgcHJpbnQocmVzdWx0LnNoYXBlKSAgIyBvYmplY3QgYXR0cmlidXRlIGFjY2VzcyB3b3JrcyB0b28NCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQ0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlDQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXANCiAgICAgICAgU1FVQVJFDQogICAgICAgIFNRVUFSRQ0KICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAnc2hhcGUnOiAnU1FVQVJFJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCd9DQogICAgIiIiDQogICAgcmV0dXJuIERpY3QoIFplcm9Pck1vcmUoIEdyb3VwICgga2V5ICsgdmFsdWUgKSApICkNCg0KZGVmIG9yaWdpbmFsVGV4dEZvcihleHByLCBhc1N0cmluZz1UcnVlKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCwgdW50b2tlbml6ZWQgdGV4dCBmb3IgYSBnaXZlbiBleHByZXNzaW9uLiAgVXNlZnVsIHRvDQogICAgcmVzdG9yZSB0aGUgcGFyc2VkIGZpZWxkcyBvZiBhbiBIVE1MIHN0YXJ0IHRhZyBpbnRvIHRoZSByYXcgdGFnIHRleHQgaXRzZWxmLCBvciB0bw0KICAgIHJldmVydCBzZXBhcmF0ZSB0b2tlbnMgd2l0aCBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1hdGNoaW5nDQogICAgaW5wdXQgdGV4dC4gQnkgZGVmYXVsdCwgcmV0dXJucyBhc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcnNlZCB0ZXh0LiAgDQogICAgICAgDQogICAgSWYgdGhlIG9wdGlvbmFsIEN7YXNTdHJpbmd9IGFyZ3VtZW50IGlzIHBhc3NlZCBhcyBDe0ZhbHNlfSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgDQogICAgQ3tMe1BhcnNlUmVzdWx0c319IGNvbnRhaW5pbmcgYW55IHJlc3VsdHMgbmFtZXMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgbWF0Y2hlZCwgYW5kIGEgDQogICAgc2luZ2xlIHRva2VuIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcuICBTbyBpZiANCiAgICB0aGUgZXhwcmVzc2lvbiBwYXNzZWQgdG8gQ3tMe29yaWdpbmFsVGV4dEZvcn19IGNvbnRhaW5zIGV4cHJlc3Npb25zIHdpdGggZGVmaW5lZA0KICAgIHJlc3VsdHMgbmFtZXMsIHlvdSBtdXN0IHNldCBDe2FzU3RyaW5nfSB0byBDe0ZhbHNlfSBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSB0aG9zZQ0KICAgIHJlc3VsdHMgbmFtZSB2YWx1ZXMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgc3JjID0gInRoaXMgaXMgdGVzdCA8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+IG5vcm1hbCB0ZXh0ICINCiAgICAgICAgZm9yIHRhZyBpbiAoImIiLCJpIik6DQogICAgICAgICAgICBvcGVuZXIsY2xvc2VyID0gbWFrZUhUTUxUYWdzKHRhZykNCiAgICAgICAgICAgIHBhdHQgPSBvcmlnaW5hbFRleHRGb3Iob3BlbmVyICsgU2tpcFRvKGNsb3NlcikgKyBjbG9zZXIpDQogICAgICAgICAgICBwcmludChwYXR0LnNlYXJjaFN0cmluZyhzcmMpWzBdKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiddDQogICAgICAgIFsnPGk+dGV4dDwvaT4nXQ0KICAgICIiIg0KICAgIGxvY01hcmtlciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbG9jLHQ6IGxvYykNCiAgICBlbmRsb2NNYXJrZXIgPSBsb2NNYXJrZXIuY29weSgpDQogICAgZW5kbG9jTWFya2VyLmNhbGxQcmVwYXJzZSA9IEZhbHNlDQogICAgbWF0Y2hFeHByID0gbG9jTWFya2VyKCJfb3JpZ2luYWxfc3RhcnQiKSArIGV4cHIgKyBlbmRsb2NNYXJrZXIoIl9vcmlnaW5hbF9lbmQiKQ0KICAgIGlmIGFzU3RyaW5nOg0KICAgICAgICBleHRyYWN0VGV4dCA9IGxhbWJkYSBzLGwsdDogc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdDQogICAgZWxzZToNCiAgICAgICAgZGVmIGV4dHJhY3RUZXh0KHMsbCx0KToNCiAgICAgICAgICAgIHRbOl0gPSBbc1t0LnBvcCgnX29yaWdpbmFsX3N0YXJ0Jyk6dC5wb3AoJ19vcmlnaW5hbF9lbmQnKV1dDQogICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKGV4dHJhY3RUZXh0KQ0KICAgIG1hdGNoRXhwci5pZ25vcmVFeHBycyA9IGV4cHIuaWdub3JlRXhwcnMNCiAgICByZXR1cm4gbWF0Y2hFeHByDQoNCmRlZiB1bmdyb3VwKGV4cHIpOiANCiAgICAiIiINCiAgICBIZWxwZXIgdG8gdW5kbyBweXBhcnNpbmcncyBkZWZhdWx0IGdyb3VwaW5nIG9mIEFuZCBleHByZXNzaW9ucywgZXZlbg0KICAgIGlmIGFsbCBidXQgb25lIGFyZSBub24tZW1wdHkuDQogICAgIiIiDQogICAgcmV0dXJuIFRva2VuQ29udmVydGVyKGV4cHIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0pDQoNCmRlZiBsb2NhdGVkRXhwcihleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVjb3JhdGUgYSByZXR1cm5lZCB0b2tlbiB3aXRoIGl0cyBzdGFydGluZyBhbmQgZW5kaW5nIGxvY2F0aW9ucyBpbiB0aGUgaW5wdXQgc3RyaW5nLg0KICAgIFRoaXMgaGVscGVyIGFkZHMgdGhlIGZvbGxvd2luZyByZXN1bHRzIG5hbWVzOg0KICAgICAtIGxvY25fc3RhcnQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gYmVnaW5zDQogICAgIC0gbG9jbl9lbmQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gZW5kcw0KICAgICAtIHZhbHVlID0gdGhlIGFjdHVhbCBwYXJzZWQgcmVzdWx0cw0KDQogICAgQmUgY2FyZWZ1bCBpZiB0aGUgaW5wdXQgdGV4dCBjb250YWlucyBDezxUQUI+fSBjaGFyYWN0ZXJzLCB5b3UgbWF5IHdhbnQgdG8gY2FsbA0KICAgIEN7THtQYXJzZXJFbGVtZW50LnBhcnNlV2l0aFRhYnN9fQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgIGZvciBtYXRjaCBpbiBsb2NhdGVkRXhwcih3ZCkuc2VhcmNoU3RyaW5nKCJsanNkZjEyM2xrc2RqamYxMjNsa2tqajEyMjIiKToNCiAgICAgICAgICAgIHByaW50KG1hdGNoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbMCwgJ2xqc2RmJywgNV1dDQogICAgICAgIFtbOCwgJ2xrc2RqamYnLCAxNV1dDQogICAgICAgIFtbMTgsICdsa2tqaicsIDIzXV0NCiAgICAiIiINCiAgICBsb2NhdG9yID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6IGwpDQogICAgcmV0dXJuIEdyb3VwKGxvY2F0b3IoImxvY25fc3RhcnQiKSArIGV4cHIoInZhbHVlIikgKyBsb2NhdG9yLmNvcHkoKS5sZWF2ZVdoaXRlc3BhY2UoKSgibG9jbl9lbmQiKSkNCg0KDQojIGNvbnZlbmllbmNlIGNvbnN0YW50cyBmb3IgcG9zaXRpb25hbCBleHByZXNzaW9ucw0KZW1wdHkgICAgICAgPSBFbXB0eSgpLnNldE5hbWUoImVtcHR5IikNCmxpbmVTdGFydCAgID0gTGluZVN0YXJ0KCkuc2V0TmFtZSgibGluZVN0YXJ0IikNCmxpbmVFbmQgICAgID0gTGluZUVuZCgpLnNldE5hbWUoImxpbmVFbmQiKQ0Kc3RyaW5nU3RhcnQgPSBTdHJpbmdTdGFydCgpLnNldE5hbWUoInN0cmluZ1N0YXJ0IikNCnN0cmluZ0VuZCAgID0gU3RyaW5nRW5kKCkuc2V0TmFtZSgic3RyaW5nRW5kIikNCg0KX2VzY2FwZWRQdW5jID0gV29yZCggX2JzbGFzaCwgciJcW10tKi4kK14/KCl+ICIsIGV4YWN0PTIgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXVsxXSkNCl9lc2NhcGVkSGV4Q2hhciA9IFJlZ2V4KHIiXFwwP1t4WF1bMC05YS1mQS1GXSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdLmxzdHJpcChyJ1wweCcpLDE2KSkpDQpfZXNjYXBlZE9jdENoYXIgPSBSZWdleChyIlxcMFswLTddKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF1bMTpdLDgpKSkNCl9zaW5nbGVDaGFyID0gX2VzY2FwZWRQdW5jIHwgX2VzY2FwZWRIZXhDaGFyIHwgX2VzY2FwZWRPY3RDaGFyIHwgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9cidcXScsIGV4YWN0PTEpIHwgUmVnZXgociJcdyIsIHJlLlVOSUNPREUpDQpfY2hhclJhbmdlID0gR3JvdXAoX3NpbmdsZUNoYXIgKyBTdXBwcmVzcygiLSIpICsgX3NpbmdsZUNoYXIpDQpfcmVCcmFja2V0RXhwciA9IExpdGVyYWwoIlsiKSArIE9wdGlvbmFsKCJeIikuc2V0UmVzdWx0c05hbWUoIm5lZ2F0ZSIpICsgR3JvdXAoIE9uZU9yTW9yZSggX2NoYXJSYW5nZSB8IF9zaW5nbGVDaGFyICkgKS5zZXRSZXN1bHRzTmFtZSgiYm9keSIpICsgIl0iDQoNCmRlZiBzcmFuZ2Uocyk6DQogICAgciIiIg0KICAgIEhlbHBlciB0byBlYXNpbHkgZGVmaW5lIHN0cmluZyByYW5nZXMgZm9yIHVzZSBpbiBXb3JkIGNvbnN0cnVjdGlvbi4gIEJvcnJvd3MNCiAgICBzeW50YXggZnJvbSByZWdleHAgJ1tdJyBzdHJpbmcgcmFuZ2UgZGVmaW5pdGlvbnM6Og0KICAgICAgICBzcmFuZ2UoIlswLTldIikgICAtPiAiMDEyMzQ1Njc4OSINCiAgICAgICAgc3JhbmdlKCJbYS16XSIpICAgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ig0KICAgICAgICBzcmFuZ2UoIlthLXokX10iKSAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXokXyINCiAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgZW5jbG9zZWQgaW4gW10ncywgYW5kIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgdGhlIGV4cGFuZGVkDQogICAgY2hhcmFjdGVyIHNldCBqb2luZWQgaW50byBhIHNpbmdsZSBzdHJpbmcuDQogICAgVGhlIHZhbHVlcyBlbmNsb3NlZCBpbiB0aGUgW10ncyBtYXkgYmU6DQogICAgIC0gYSBzaW5nbGUgY2hhcmFjdGVyDQogICAgIC0gYW4gZXNjYXBlZCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgYmFja3NsYXNoIChzdWNoIGFzIEN7XC19IG9yIEN7XF19KQ0KICAgICAtIGFuIGVzY2FwZWQgaGV4IGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydceCd9IChDe1x4MjF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpIA0KICAgICAgICAgKEN7XDB4IyN9IGlzIGFsc28gc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgDQogICAgIC0gYW4gZXNjYXBlZCBvY3RhbCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXDAnfSAoQ3tcMDQxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKQ0KICAgICAtIGEgcmFuZ2Ugb2YgYW55IG9mIHRoZSBhYm92ZSwgc2VwYXJhdGVkIGJ5IGEgZGFzaCAoQ3snYS16J30sIGV0Yy4pDQogICAgIC0gYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSAoQ3snYWVpb3V5J30sIEN7J2EtekEtWjAtOV8kJ30sIGV0Yy4pDQogICAgIiIiDQogICAgX2V4cGFuZGVkID0gbGFtYmRhIHA6IHAgaWYgbm90IGlzaW5zdGFuY2UocCxQYXJzZVJlc3VsdHMpIGVsc2UgJycuam9pbih1bmljaHIoYykgZm9yIGMgaW4gcmFuZ2Uob3JkKHBbMF0pLG9yZChwWzFdKSsxKSkNCiAgICB0cnk6DQogICAgICAgIHJldHVybiAiIi5qb2luKF9leHBhbmRlZChwYXJ0KSBmb3IgcGFydCBpbiBfcmVCcmFja2V0RXhwci5wYXJzZVN0cmluZyhzKS5ib2R5KQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIHJldHVybiAiIg0KDQpkZWYgbWF0Y2hPbmx5QXRDb2wobik6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgcGFyc2UgYWN0aW9ucyB0aGF0IHJlcXVpcmUgbWF0Y2hpbmcgYXQgYSBzcGVjaWZpYw0KICAgIGNvbHVtbiBpbiB0aGUgaW5wdXQgdGV4dC4NCiAgICAiIiINCiAgICBkZWYgdmVyaWZ5Q29sKHN0cmcsbG9jbix0b2tzKToNCiAgICAgICAgaWYgY29sKGxvY24sc3RyZykgIT0gbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHN0cmcsbG9jbiwibWF0Y2hlZCB0b2tlbiBub3QgYXQgY29sdW1uICVkIiAlIG4pDQogICAgcmV0dXJuIHZlcmlmeUNvbA0KDQpkZWYgcmVwbGFjZVdpdGgocmVwbFN0cik6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgY29tbW9uIHBhcnNlIGFjdGlvbnMgdGhhdCBzaW1wbHkgcmV0dXJuIGEgbGl0ZXJhbCB2YWx1ZS4gIEVzcGVjaWFsbHkNCiAgICB1c2VmdWwgd2hlbiB1c2VkIHdpdGggQ3tMe3RyYW5zZm9ybVN0cmluZzxQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZz59KCl9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIG51bSA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgbmEgPSBvbmVPZigiTi9BIE5BIikuc2V0UGFyc2VBY3Rpb24ocmVwbGFjZVdpdGgobWF0aC5uYW4pKQ0KICAgICAgICB0ZXJtID0gbmEgfCBudW0NCiAgICAgICAgDQogICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiMzI0IDIzNCBOL0EgMjM0IikgIyAtPiBbMzI0LCAyMzQsIG5hbiwgMjM0XQ0KICAgICIiIg0KICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IFtyZXBsU3RyXQ0KDQpkZWYgcmVtb3ZlUXVvdGVzKHMsbCx0KToNCiAgICAiIiINCiAgICBIZWxwZXIgcGFyc2UgYWN0aW9uIGZvciByZW1vdmluZyBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcXVvdGVkIHN0cmluZ3MuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBieSBkZWZhdWx0LCBxdW90YXRpb24gbWFya3MgYXJlIGluY2x1ZGVkIGluIHBhcnNlZCByZXN1bHRzDQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIl0NCg0KICAgICAgICAjIHVzZSByZW1vdmVRdW90ZXMgdG8gc3RyaXAgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgcXVvdGVkU3RyaW5nLnNldFBhcnNlQWN0aW9uKHJlbW92ZVF1b3RlcykNCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIk5vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50Il0NCiAgICAiIiINCiAgICByZXR1cm4gdFswXVsxOi0xXQ0KDQpkZWYgdG9rZW5NYXAoZnVuYywgKmFyZ3MpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBwYXJzZSBhY3Rpb24gYnkgbWFwcGluZyBhIGZ1bmN0aW9uIHRvIGFsbCBlbGVtZW50cyBvZiBhIFBhcnNlUmVzdWx0cyBsaXN0LklmIGFueSBhZGRpdGlvbmFsIA0KICAgIGFyZ3MgYXJlIHBhc3NlZCwgdGhleSBhcmUgZm9yd2FyZGVkIHRvIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlcg0KICAgIHRoZSB0b2tlbiwgYXMgaW4gQ3toZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpfSwgd2hpY2ggd2lsbCBjb252ZXJ0IHRoZQ0KICAgIHBhcnNlZCBkYXRhIHRvIGFuIGludGVnZXIgdXNpbmcgYmFzZSAxNi4NCg0KICAgIEV4YW1wbGUgKGNvbXBhcmUgdGhlIGxhc3QgdG8gZXhhbXBsZSBpbiBMe1BhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nfTo6DQogICAgICAgIGhleF9pbnRzID0gT25lT3JNb3JlKFdvcmQoaGV4bnVtcykpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKQ0KICAgICAgICBoZXhfaW50cy5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhDQogICAgICAgICAgICAnJycpDQogICAgICAgIA0KICAgICAgICB1cHBlcndvcmQgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnVwcGVyKSkNCiAgICAgICAgT25lT3JNb3JlKHVwcGVyd29yZCkucnVuVGVzdHMoJycnDQogICAgICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnRpdGxlKSkNCiAgICAgICAgT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikucnVuVGVzdHMoJycnDQogICAgICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrDQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWENCiAgICAgICAgWzAsIDE3LCAzNCwgMTcwLCAyNTUsIDEwLCAxMywgMjZdDQoNCiAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQ0KICAgICAgICBbJ01ZJywgJ0tJTkdET00nLCAnRk9SJywgJ0EnLCAnSE9SU0UnXQ0KDQogICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsNCiAgICAgICAgWydOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrJ10NCiAgICAiIiINCiAgICBkZWYgcGEocyxsLHQpOg0KICAgICAgICByZXR1cm4gW2Z1bmModG9rbiwgKmFyZ3MpIGZvciB0b2tuIGluIHRdDQoNCiAgICB0cnk6DQogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpDQogICAgcGEuX19uYW1lX18gPSBmdW5jX25hbWUNCg0KICAgIHJldHVybiBwYQ0KDQp1cGNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkNCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLnVwY2FzZVRva2Vuc30iIiINCg0KZG93bmNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkNCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmRvd25jYXNlVG9rZW5zfSIiIg0KICAgIA0KZGVmIF9tYWtlVGFncyh0YWdTdHIsIHhtbCk6DQogICAgIiIiSW50ZXJuYWwgaGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucywgZ2l2ZW4gYSB0YWcgbmFtZSIiIg0KICAgIGlmIGlzaW5zdGFuY2UodGFnU3RyLGJhc2VzdHJpbmcpOg0KICAgICAgICByZXNuYW1lID0gdGFnU3RyDQogICAgICAgIHRhZ1N0ciA9IEtleXdvcmQodGFnU3RyLCBjYXNlbGVzcz1ub3QgeG1sKQ0KICAgIGVsc2U6DQogICAgICAgIHJlc25hbWUgPSB0YWdTdHIubmFtZQ0KDQogICAgdGFnQXR0ck5hbWUgPSBXb3JkKGFscGhhcyxhbHBoYW51bXMrIl8tOiIpDQogICAgaWYgKHhtbCk6DQogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IGRibFF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApDQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwNCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lICsgU3VwcHJlc3MoIj0iKSArIHRhZ0F0dHJWYWx1ZSApKSkgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpDQogICAgZWxzZToNCiAgICAgICAgcHJpbnRhYmxlc0xlc3NSQWJyYWNrID0gIiIuam9pbihjIGZvciBjIGluIHByaW50YWJsZXMgaWYgYyBub3QgaW4gIj4iKQ0KICAgICAgICB0YWdBdHRyVmFsdWUgPSBxdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKSB8IFdvcmQocHJpbnRhYmxlc0xlc3NSQWJyYWNrKQ0KICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcDQogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZS5zZXRQYXJzZUFjdGlvbihkb3duY2FzZVRva2VucykgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSApKSkgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpDQogICAgY2xvc2VUYWcgPSBDb21iaW5lKF9MKCI8LyIpICsgdGFnU3RyICsgIj4iKQ0KDQogICAgb3BlblRhZyA9IG9wZW5UYWcuc2V0UmVzdWx0c05hbWUoInN0YXJ0IisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8JXM+IiAlIHJlc25hbWUpDQogICAgY2xvc2VUYWcgPSBjbG9zZVRhZy5zZXRSZXN1bHRzTmFtZSgiZW5kIisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8LyVzPiIgJSByZXNuYW1lKQ0KICAgIG9wZW5UYWcudGFnID0gcmVzbmFtZQ0KICAgIGNsb3NlVGFnLnRhZyA9IHJlc25hbWUNCiAgICByZXR1cm4gb3BlblRhZywgY2xvc2VUYWcNCg0KZGVmIG1ha2VIVE1MVGFncyh0YWdTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIEhUTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMNCiAgICB0YWdzIGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLCBhdHRyaWJ1dGVzIHdpdGggbmFtZXNwYWNlcyBhbmQgd2l0aCBxdW90ZWQgb3IgdW5xdW90ZWQgdmFsdWVzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicNCiAgICAgICAgIyBtYWtlSFRNTFRhZ3MgcmV0dXJucyBweXBhcnNpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZ3MgYXMgYSAyLXR1cGxlDQogICAgICAgIGEsYV9lbmQgPSBtYWtlSFRNTFRhZ3MoIkEiKQ0KICAgICAgICBsaW5rX2V4cHIgPSBhICsgU2tpcFRvKGFfZW5kKSgibGlua190ZXh0IikgKyBhX2VuZA0KICAgICAgICANCiAgICAgICAgZm9yIGxpbmsgaW4gbGlua19leHByLnNlYXJjaFN0cmluZyh0ZXh0KToNCiAgICAgICAgICAgICMgYXR0cmlidXRlcyBpbiB0aGUgPEE+IHRhZyAobGlrZSAiaHJlZiIgc2hvd24gaGVyZSkgYXJlIGFsc28gYWNjZXNzaWJsZSBhcyBuYW1lZCByZXN1bHRzDQogICAgICAgICAgICBwcmludChsaW5rLmxpbmtfdGV4dCwgJy0+JywgbGluay5ocmVmKQ0KICAgIHByaW50czo6DQogICAgICAgIHB5cGFyc2luZyAtPiBodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tDQogICAgIiIiDQogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBGYWxzZSApDQoNCmRlZiBtYWtlWE1MVGFncyh0YWdTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIFhNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcw0KICAgIHRhZ3Mgb25seSBpbiB0aGUgZ2l2ZW4gdXBwZXIvbG93ZXIgY2FzZS4NCg0KICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHttYWtlSFRNTFRhZ3N9DQogICAgIiIiDQogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBUcnVlICkNCg0KZGVmIHdpdGhBdHRyaWJ1dGUoKmFyZ3MsKiphdHRyRGljdCk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNyZWF0ZSBhIHZhbGlkYXRpbmcgcGFyc2UgYWN0aW9uIHRvIGJlIHVzZWQgd2l0aCBzdGFydCB0YWdzIGNyZWF0ZWQNCiAgICB3aXRoIEN7THttYWtlWE1MVGFnc319IG9yIEN7THttYWtlSFRNTFRhZ3N9fS4gVXNlIEN7d2l0aEF0dHJpYnV0ZX0gdG8gcXVhbGlmeSBhIHN0YXJ0aW5nIHRhZw0KICAgIHdpdGggYSByZXF1aXJlZCBhdHRyaWJ1dGUgdmFsdWUsIHRvIGF2b2lkIGZhbHNlIG1hdGNoZXMgb24gY29tbW9uIHRhZ3Mgc3VjaCBhcw0KICAgIEN7PFREPn0gb3IgQ3s8RElWPn0uDQoNCiAgICBDYWxsIEN7d2l0aEF0dHJpYnV0ZX0gd2l0aCBhIHNlcmllcyBvZiBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcy4gU3BlY2lmeSB0aGUgbGlzdA0KICAgIG9mIGZpbHRlciBhdHRyaWJ1dGVzIG5hbWVzIGFuZCB2YWx1ZXMgYXM6DQogICAgIC0ga2V5d29yZCBhcmd1bWVudHMsIGFzIGluIEN7KGFsaWduPSJyaWdodCIpfSwgb3INCiAgICAgLSBhcyBhbiBleHBsaWNpdCBkaWN0IHdpdGggQ3sqKn0gb3BlcmF0b3IsIHdoZW4gYW4gYXR0cmlidXRlIG5hbWUgaXMgYWxzbyBhIFB5dGhvbg0KICAgICAgICAgIHJlc2VydmVkIHdvcmQsIGFzIGluIEN7Kip7ImNsYXNzIjoiQ3VzdG9tZXIiLCAiYWxpZ24iOiJyaWdodCJ9fQ0KICAgICAtIGEgbGlzdCBvZiBuYW1lLXZhbHVlIHR1cGxlcywgYXMgaW4gKCAoIm5zMTpjbGFzcyIsICJDdXN0b21lciIpLCAoIm5zMjphbGlnbiIsInJpZ2h0IikgKQ0KICAgIEZvciBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBhIG5hbWVzcGFjZSBwcmVmaXgsIHlvdSBtdXN0IHVzZSB0aGUgc2Vjb25kIGZvcm0uICBBdHRyaWJ1dGUNCiAgICBuYW1lcyBhcmUgbWF0Y2hlZCBpbnNlbnNpdGl2ZSB0byB1cHBlci9sb3dlciBjYXNlLg0KICAgICAgIA0KICAgIElmIGp1c3QgdGVzdGluZyBmb3IgQ3tjbGFzc30gKHdpdGggb3Igd2l0aG91dCBhIG5hbWVzcGFjZSksIHVzZSBDe0x7d2l0aENsYXNzfX0uDQoNCiAgICBUbyB2ZXJpZnkgdGhhdCB0aGUgYXR0cmlidXRlIGV4aXN0cywgYnV0IHdpdGhvdXQgc3BlY2lmeWluZyBhIHZhbHVlLCBwYXNzDQogICAgQ3t3aXRoQXR0cmlidXRlLkFOWV9WQUxVRX0gYXMgdGhlIHZhbHVlLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGh0bWwgPSAnJycNCiAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICBTb21lIHRleHQNCiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+DQogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2Pg0KICAgICAgICAgICAgPGRpdj50aGlzIGhhcyBubyB0eXBlPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgJycnDQogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQ0KDQogICAgICAgICMgb25seSBtYXRjaCBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlIHdpdGggdmFsdWUgImdyaWQiDQogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPSJncmlkIikpDQogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQ0KICAgICAgICANCiAgICAgICAgIyBjb25zdHJ1Y3QgYSBtYXRjaCB3aXRoIGFueSBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZQ0KICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQ0KICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkNCiAgICBwcmludHM6Og0KICAgICAgICAxIDQgMCAxIDANCg0KICAgICAgICAxIDQgMCAxIDANCiAgICAgICAgMSwzIDIsMyAxLDENCiAgICAiIiINCiAgICBpZiBhcmdzOg0KICAgICAgICBhdHRycyA9IGFyZ3NbOl0NCiAgICBlbHNlOg0KICAgICAgICBhdHRycyA9IGF0dHJEaWN0Lml0ZW1zKCkNCiAgICBhdHRycyA9IFsoayx2KSBmb3Igayx2IGluIGF0dHJzXQ0KICAgIGRlZiBwYShzLGwsdG9rZW5zKToNCiAgICAgICAgZm9yIGF0dHJOYW1lLGF0dHJWYWx1ZSBpbiBhdHRyczoNCiAgICAgICAgICAgIGlmIGF0dHJOYW1lIG5vdCBpbiB0b2tlbnM6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJubyBtYXRjaGluZyBhdHRyaWJ1dGUgIiArIGF0dHJOYW1lKQ0KICAgICAgICAgICAgaWYgYXR0clZhbHVlICE9IHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFIGFuZCB0b2tlbnNbYXR0ck5hbWVdICE9IGF0dHJWYWx1ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsImF0dHJpYnV0ZSAnJXMnIGhhcyB2YWx1ZSAnJXMnLCBtdXN0IGJlICclcyciICUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJOYW1lLCB0b2tlbnNbYXR0ck5hbWVdLCBhdHRyVmFsdWUpKQ0KICAgIHJldHVybiBwYQ0Kd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgPSBvYmplY3QoKQ0KDQpkZWYgd2l0aENsYXNzKGNsYXNzbmFtZSwgbmFtZXNwYWNlPScnKToNCiAgICAiIiINCiAgICBTaW1wbGlmaWVkIHZlcnNpb24gb2YgQ3tMe3dpdGhBdHRyaWJ1dGV9fSB3aGVuIG1hdGNoaW5nIG9uIGEgZGl2IGNsYXNzIC0gbWFkZQ0KICAgIGRpZmZpY3VsdCBiZWNhdXNlIEN7Y2xhc3N9IGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQeXRob24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaHRtbCA9ICcnJw0KICAgICAgICAgICAgPGRpdj4NCiAgICAgICAgICAgIFNvbWUgdGV4dA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4NCiAgICAgICAgICAgIDxkaXY+dGhpcyAmbHQ7ZGl2Jmd0OyBoYXMgbm8gY2xhc3M8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAnJycNCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpDQogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKCJncmlkIikpDQogICAgICAgIA0KICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkNCiAgICAgICAgDQogICAgICAgIGRpdl9hbnlfdHlwZSA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcyh3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSkpDQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZGl2X2hlYWRlci5ib2R5KQ0KICAgIHByaW50czo6DQogICAgICAgIDEgNCAwIDEgMA0KDQogICAgICAgIDEgNCAwIDEgMA0KICAgICAgICAxLDMgMiwzIDEsMQ0KICAgICIiIg0KICAgIGNsYXNzYXR0ciA9ICIlczpjbGFzcyIgJSBuYW1lc3BhY2UgaWYgbmFtZXNwYWNlIGVsc2UgImNsYXNzIg0KICAgIHJldHVybiB3aXRoQXR0cmlidXRlKCoqe2NsYXNzYXR0ciA6IGNsYXNzbmFtZX0pICAgICAgICANCg0Kb3BBc3NvYyA9IF9Db25zdGFudHMoKQ0Kb3BBc3NvYy5MRUZUID0gb2JqZWN0KCkNCm9wQXNzb2MuUklHSFQgPSBvYmplY3QoKQ0KDQpkZWYgaW5maXhOb3RhdGlvbiggYmFzZUV4cHIsIG9wTGlzdCwgbHBhcj1TdXBwcmVzcygnKCcpLCBycGFyPVN1cHByZXNzKCcpJykgKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgZ3JhbW1hcnMgb2YgZXhwcmVzc2lvbnMgbWFkZSB1cCBvZg0KICAgIG9wZXJhdG9ycyB3b3JraW5nIGluIGEgcHJlY2VkZW5jZSBoaWVyYXJjaHkuICBPcGVyYXRvcnMgbWF5IGJlIHVuYXJ5IG9yDQogICAgYmluYXJ5LCBsZWZ0LSBvciByaWdodC1hc3NvY2lhdGl2ZS4gIFBhcnNlIGFjdGlvbnMgY2FuIGFsc28gYmUgYXR0YWNoZWQNCiAgICB0byBvcGVyYXRvciBleHByZXNzaW9ucy4gVGhlIGdlbmVyYXRlZCBwYXJzZXIgd2lsbCBhbHNvIHJlY29nbml6ZSB0aGUgdXNlIA0KICAgIG9mIHBhcmVudGhlc2VzIHRvIG92ZXJyaWRlIG9wZXJhdG9yIHByZWNlZGVuY2VzIChzZWUgZXhhbXBsZSBiZWxvdykuDQogICAgDQogICAgTm90ZTogaWYgeW91IGRlZmluZSBhIGRlZXAgb3BlcmF0b3IgbGlzdCwgeW91IG1heSBzZWUgcGVyZm9ybWFuY2UgaXNzdWVzDQogICAgd2hlbiB1c2luZyBpbmZpeE5vdGF0aW9uLiBTZWUgTHtQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXR9IGZvciBhDQogICAgbWVjaGFuaXNtIHRvIHBvdGVudGlhbGx5IGltcHJvdmUgeW91ciBwYXJzZXIgcGVyZm9ybWFuY2UuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGJhc2VFeHByIC0gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG1vc3QgYmFzaWMgZWxlbWVudCBmb3IgdGhlIG5lc3RlZA0KICAgICAtIG9wTGlzdCAtIGxpc3Qgb2YgdHVwbGVzLCBvbmUgZm9yIGVhY2ggb3BlcmF0b3IgcHJlY2VkZW5jZSBsZXZlbCBpbiB0aGUNCiAgICAgIGV4cHJlc3Npb24gZ3JhbW1hcjsgZWFjaCB0dXBsZSBpcyBvZiB0aGUgZm9ybQ0KICAgICAgKG9wRXhwciwgbnVtVGVybXMsIHJpZ2h0TGVmdEFzc29jLCBwYXJzZUFjdGlvbiksIHdoZXJlOg0KICAgICAgIC0gb3BFeHByIGlzIHRoZSBweXBhcnNpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9wZXJhdG9yOw0KICAgICAgICAgIG1heSBhbHNvIGJlIGEgc3RyaW5nLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIExpdGVyYWw7DQogICAgICAgICAgaWYgbnVtVGVybXMgaXMgMywgb3BFeHByIGlzIGEgdHVwbGUgb2YgdHdvIGV4cHJlc3Npb25zLCBmb3IgdGhlDQogICAgICAgICAgdHdvIG9wZXJhdG9ycyBzZXBhcmF0aW5nIHRoZSAzIHRlcm1zDQogICAgICAgLSBudW1UZXJtcyBpcyB0aGUgbnVtYmVyIG9mIHRlcm1zIGZvciB0aGlzIG9wZXJhdG9yIChtdXN0DQogICAgICAgICAgYmUgMSwgMiwgb3IgMykNCiAgICAgICAtIHJpZ2h0TGVmdEFzc29jIGlzIHRoZSBpbmRpY2F0b3Igd2hldGhlciB0aGUgb3BlcmF0b3IgaXMNCiAgICAgICAgICByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZlLCB1c2luZyB0aGUgcHlwYXJzaW5nLWRlZmluZWQNCiAgICAgICAgICBjb25zdGFudHMgQ3tvcEFzc29jLlJJR0hUfSBhbmQgQ3tvcEFzc29jLkxFRlR9Lg0KICAgICAgIC0gcGFyc2VBY3Rpb24gaXMgdGhlIHBhcnNlIGFjdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgNCiAgICAgICAgICBleHByZXNzaW9ucyBtYXRjaGluZyB0aGlzIG9wZXJhdG9yIGV4cHJlc3Npb24gKHRoZQ0KICAgICAgICAgIHBhcnNlIGFjdGlvbiB0dXBsZSBtZW1iZXIgbWF5IGJlIG9taXR0ZWQpDQogICAgIC0gbHBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGxlZnQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKCcpfSkNCiAgICAgLSBycGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgcmlnaHQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKScpfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIHNpbXBsZSBleGFtcGxlIG9mIGZvdXItZnVuY3Rpb24gYXJpdGhtZXRpYyB3aXRoIGludHMgYW5kIHZhcmlhYmxlIG5hbWVzDQogICAgICAgIGludGVnZXIgPSBweXBhcnNpbmdfY29tbW9uLnNpZ25lZF9pbnRlZ2VyDQogICAgICAgIHZhcm5hbWUgPSBweXBhcnNpbmdfY29tbW9uLmlkZW50aWZpZXIgDQogICAgICAgIA0KICAgICAgICBhcml0aF9leHByID0gaW5maXhOb3RhdGlvbihpbnRlZ2VyIHwgdmFybmFtZSwNCiAgICAgICAgICAgIFsNCiAgICAgICAgICAgICgnLScsIDEsIG9wQXNzb2MuUklHSFQpLA0KICAgICAgICAgICAgKG9uZU9mKCcqIC8nKSwgMiwgb3BBc3NvYy5MRUZUKSwNCiAgICAgICAgICAgIChvbmVPZignKyAtJyksIDIsIG9wQXNzb2MuTEVGVCksDQogICAgICAgICAgICBdKQ0KICAgICAgICANCiAgICAgICAgYXJpdGhfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIDUrMyo2DQogICAgICAgICAgICAoNSszKSo2DQogICAgICAgICAgICAtMi0tMTENCiAgICAgICAgICAgICcnJywgZnVsbER1bXA9RmFsc2UpDQogICAgcHJpbnRzOjoNCiAgICAgICAgNSszKjYNCiAgICAgICAgW1s1LCAnKycsIFszLCAnKicsIDZdXV0NCg0KICAgICAgICAoNSszKSo2DQogICAgICAgIFtbWzUsICcrJywgM10sICcqJywgNl1dDQoNCiAgICAgICAgLTItLTExDQogICAgICAgIFtbWyctJywgMl0sICctJywgWyctJywgMTFdXV0NCiAgICAiIiINCiAgICByZXQgPSBGb3J3YXJkKCkNCiAgICBsYXN0RXhwciA9IGJhc2VFeHByIHwgKCBscGFyICsgcmV0ICsgcnBhciApDQogICAgZm9yIGksb3BlckRlZiBpbiBlbnVtZXJhdGUob3BMaXN0KToNCiAgICAgICAgb3BFeHByLGFyaXR5LHJpZ2h0TGVmdEFzc29jLHBhID0gKG9wZXJEZWYgKyAoTm9uZSwpKVs6NF0NCiAgICAgICAgdGVybU5hbWUgPSAiJXMgdGVybSIgJSBvcEV4cHIgaWYgYXJpdHkgPCAzIGVsc2UgIiVzJXMgdGVybSIgJSBvcEV4cHINCiAgICAgICAgaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgIGlmIG9wRXhwciBpcyBOb25lIG9yIGxlbihvcEV4cHIpICE9IDI6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWYgbnVtdGVybXM9Mywgb3BFeHByIG11c3QgYmUgYSB0dXBsZSBvciBsaXN0IG9mIHR3byBleHByZXNzaW9ucyIpDQogICAgICAgICAgICBvcEV4cHIxLCBvcEV4cHIyID0gb3BFeHByDQogICAgICAgIHRoaXNFeHByID0gRm9yd2FyZCgpLnNldE5hbWUodGVybU5hbWUpDQogICAgICAgIGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuTEVGVDoNCiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciApICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoNCiAgICAgICAgICAgICAgICBpZiBvcEV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyBsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIGxhc3RFeHByICkgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIrbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKGxhc3RFeHByKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwcikgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikNCiAgICAgICAgZWxpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLlJJR0hUOg0KICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToNCiAgICAgICAgICAgICAgICAjIHRyeSB0byBhdm9pZCBMUiB3aXRoIHRoaXMgZXh0cmEgdGVzdA0KICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9wRXhwciwgT3B0aW9uYWwpOg0KICAgICAgICAgICAgICAgICAgICBvcEV4cHIgPSBPcHRpb25hbChvcEV4cHIpDQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShvcEV4cHIuZXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBvcEV4cHIgKyB0aGlzRXhwciApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6DQogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyB0aGlzRXhwciApICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCB0aGlzRXhwciApICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByKSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBpbmRpY2F0ZSByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZpdHkiKQ0KICAgICAgICBpZiBwYToNCiAgICAgICAgICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbiggcGEgKQ0KICAgICAgICB0aGlzRXhwciA8PD0gKCBtYXRjaEV4cHIuc2V0TmFtZSh0ZXJtTmFtZSkgfCBsYXN0RXhwciApDQogICAgICAgIGxhc3RFeHByID0gdGhpc0V4cHINCiAgICByZXQgPDw9IGxhc3RFeHByDQogICAgcmV0dXJuIHJldA0KDQpvcGVyYXRvclByZWNlZGVuY2UgPSBpbmZpeE5vdGF0aW9uDQoiIiIoRGVwcmVjYXRlZCkgRm9ybWVyIG5hbWUgb2YgQ3tMe2luZml4Tm90YXRpb259fSwgd2lsbCBiZSBkcm9wcGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIiIiDQoNCmRibFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIpDQpzZ2xRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMiKQ0KcXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyJyIoPzpbXiJcblxyXFxdfCg/OiIiKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSonKSsnIid8DQogICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgicXVvdGVkU3RyaW5nIHVzaW5nIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIikNCnVuaWNvZGVTdHJpbmcgPSBDb21iaW5lKF9MKCd1JykgKyBxdW90ZWRTdHJpbmcuY29weSgpKS5zZXROYW1lKCJ1bmljb2RlIHN0cmluZyBsaXRlcmFsIikNCg0KZGVmIG5lc3RlZEV4cHIob3BlbmVyPSIoIiwgY2xvc2VyPSIpIiwgY29udGVudD1Ob25lLCBpZ25vcmVFeHByPXF1b3RlZFN0cmluZy5jb3B5KCkpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIG5lc3RlZCBsaXN0cyBlbmNsb3NlZCBpbiBvcGVuaW5nIGFuZCBjbG9zaW5nDQogICAgZGVsaW1pdGVycyAoIigiIGFuZCAiKSIgYXJlIHRoZSBkZWZhdWx0KS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gb3BlbmVyIC0gb3BlbmluZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKCJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbg0KICAgICAtIGNsb3NlciAtIGNsb3NpbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IikifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24NCiAgICAgLSBjb250ZW50IC0gZXhwcmVzc2lvbiBmb3IgaXRlbXMgd2l0aGluIHRoZSBuZXN0ZWQgbGlzdHMgKGRlZmF1bHQ9Q3tOb25lfSkNCiAgICAgLSBpZ25vcmVFeHByIC0gZXhwcmVzc2lvbiBmb3IgaWdub3Jpbmcgb3BlbmluZyBhbmQgY2xvc2luZyBkZWxpbWl0ZXJzIChkZWZhdWx0PUN7cXVvdGVkU3RyaW5nfSkNCg0KICAgIElmIGFuIGV4cHJlc3Npb24gaXMgbm90IHByb3ZpZGVkIGZvciB0aGUgY29udGVudCBhcmd1bWVudCwgdGhlIG5lc3RlZA0KICAgIGV4cHJlc3Npb24gd2lsbCBjYXB0dXJlIGFsbCB3aGl0ZXNwYWNlLWRlbGltaXRlZCBjb250ZW50IGJldHdlZW4gZGVsaW1pdGVycw0KICAgIGFzIGEgbGlzdCBvZiBzZXBhcmF0ZSB2YWx1ZXMuDQoNCiAgICBVc2UgdGhlIEN7aWdub3JlRXhwcn0gYXJndW1lbnQgdG8gZGVmaW5lIGV4cHJlc3Npb25zIHRoYXQgbWF5IGNvbnRhaW4NCiAgICBvcGVuaW5nIG9yIGNsb3NpbmcgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBvcGVuaW5nDQogICAgb3IgY2xvc2luZyBjaGFyYWN0ZXJzIGZvciBuZXN0aW5nLCBzdWNoIGFzIHF1b3RlZFN0cmluZyBvciBhIGNvbW1lbnQNCiAgICBleHByZXNzaW9uLiAgU3BlY2lmeSBtdWx0aXBsZSBleHByZXNzaW9ucyB1c2luZyBhbiBDe0x7T3J9fSBvciBDe0x7TWF0Y2hGaXJzdH19Lg0KICAgIFRoZSBkZWZhdWx0IGlzIEx7cXVvdGVkU3RyaW5nfSwgYnV0IGlmIG5vIGV4cHJlc3Npb25zIGFyZSB0byBiZSBpZ25vcmVkLA0KICAgIHRoZW4gcGFzcyBDe05vbmV9IGZvciB0aGlzIGFyZ3VtZW50Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfdHlwZSA9IG9uZU9mKCJ2b2lkIGludCBzaG9ydCBsb25nIGNoYXIgZmxvYXQgZG91YmxlIikNCiAgICAgICAgZGVjbF9kYXRhX3R5cGUgPSBDb21iaW5lKGRhdGFfdHlwZSArIE9wdGlvbmFsKFdvcmQoJyonKSkpDQogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKQ0KICAgICAgICBudW1iZXIgPSBweXBhcnNpbmdfY29tbW9uLm51bWJlcg0KICAgICAgICBhcmcgPSBHcm91cChkZWNsX2RhdGFfdHlwZSArIGlkZW50KQ0KICAgICAgICBMUEFSLFJQQVIgPSBtYXAoU3VwcHJlc3MsICIoKSIpDQoNCiAgICAgICAgY29kZV9ib2R5ID0gbmVzdGVkRXhwcigneycsICd9JywgaWdub3JlRXhwcj0ocXVvdGVkU3RyaW5nIHwgY1N0eWxlQ29tbWVudCkpDQoNCiAgICAgICAgY19mdW5jdGlvbiA9IChkZWNsX2RhdGFfdHlwZSgidHlwZSIpIA0KICAgICAgICAgICAgICAgICAgICAgICsgaWRlbnQoIm5hbWUiKQ0KICAgICAgICAgICAgICAgICAgICAgICsgTFBBUiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QoYXJnKSwgW10pKCJhcmdzIikgKyBSUEFSIA0KICAgICAgICAgICAgICAgICAgICAgICsgY29kZV9ib2R5KCJib2R5IikpDQogICAgICAgIGNfZnVuY3Rpb24uaWdub3JlKGNTdHlsZUNvbW1lbnQpDQogICAgICAgIA0KICAgICAgICBzb3VyY2VfY29kZSA9ICcnJw0KICAgICAgICAgICAgaW50IGlzX29kZChpbnQgeCkgeyANCiAgICAgICAgICAgICAgICByZXR1cm4gKHglMik7IA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaW50IGRlY190b19oZXgoY2hhciBoY2hhcikgeyANCiAgICAgICAgICAgICAgICBpZiAoaGNoYXIgPj0gJzAnICYmIGhjaGFyIDw9ICc5JykgeyANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmQoaGNoYXIpLW9yZCgnMCcpKTsgDQogICAgICAgICAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoMTArb3JkKGhjaGFyKS1vcmQoJ0EnKSk7DQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgIH0NCiAgICAgICAgJycnDQogICAgICAgIGZvciBmdW5jIGluIGNfZnVuY3Rpb24uc2VhcmNoU3RyaW5nKHNvdXJjZV9jb2RlKToNCiAgICAgICAgICAgIHByaW50KCIlKG5hbWUpcyAoJSh0eXBlKXMpIGFyZ3M6ICUoYXJncylzIiAlIGZ1bmMpDQoNCiAgICBwcmludHM6Og0KICAgICAgICBpc19vZGQgKGludCkgYXJnczogW1snaW50JywgJ3gnXV0NCiAgICAgICAgZGVjX3RvX2hleCAoaW50KSBhcmdzOiBbWydjaGFyJywgJ2hjaGFyJ11dDQogICAgIiIiDQogICAgaWYgb3BlbmVyID09IGNsb3NlcjoNCiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBzdHJpbmdzIGNhbm5vdCBiZSB0aGUgc2FtZSIpDQogICAgaWYgY29udGVudCBpcyBOb25lOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG9wZW5lcixiYXNlc3RyaW5nKSBhbmQgaXNpbnN0YW5jZShjbG9zZXIsYmFzZXN0cmluZyk6DQogICAgICAgICAgICBpZiBsZW4ob3BlbmVyKSA9PSAxIGFuZCBsZW4oY2xvc2VyKT09MToNCiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5pZ25vcmVFeHByICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4ob3BlbmVyK2Nsb3NlcitQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKGVtcHR5LmNvcHkoKStDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5MaXRlcmFsKG9wZW5lcikgKyB+TGl0ZXJhbChjbG9zZXIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIGFyZ3VtZW50cyBtdXN0IGJlIHN0cmluZ3MgaWYgbm8gY29udGVudCBleHByZXNzaW9uIGlzIGdpdmVuIikNCiAgICByZXQgPSBGb3J3YXJkKCkNCiAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggaWdub3JlRXhwciB8IHJldCB8IGNvbnRlbnQgKSArIFN1cHByZXNzKGNsb3NlcikgKQ0KICAgIGVsc2U6DQogICAgICAgIHJldCA8PD0gR3JvdXAoIFN1cHByZXNzKG9wZW5lcikgKyBaZXJvT3JNb3JlKCByZXQgfCBjb250ZW50ICkgICsgU3VwcHJlc3MoY2xvc2VyKSApDQogICAgcmV0LnNldE5hbWUoJ25lc3RlZCAlcyVzIGV4cHJlc3Npb24nICUgKG9wZW5lcixjbG9zZXIpKQ0KICAgIHJldHVybiByZXQNCg0KZGVmIGluZGVudGVkQmxvY2soYmxvY2tTdGF0ZW1lbnRFeHByLCBpbmRlbnRTdGFjaywgaW5kZW50PVRydWUpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHNwYWNlLWRlbGltaXRlZCBpbmRlbnRhdGlvbiBibG9ja3MsIHN1Y2ggYXMNCiAgICB0aG9zZSB1c2VkIHRvIGRlZmluZSBibG9jayBzdGF0ZW1lbnRzIGluIFB5dGhvbiBzb3VyY2UgY29kZS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gYmxvY2tTdGF0ZW1lbnRFeHByIC0gZXhwcmVzc2lvbiBkZWZpbmluZyBzeW50YXggb2Ygc3RhdGVtZW50IHRoYXQNCiAgICAgICAgICAgIGlzIHJlcGVhdGVkIHdpdGhpbiB0aGUgaW5kZW50ZWQgYmxvY2sNCiAgICAgLSBpbmRlbnRTdGFjayAtIGxpc3QgY3JlYXRlZCBieSBjYWxsZXIgdG8gbWFuYWdlIGluZGVudGF0aW9uIHN0YWNrDQogICAgICAgICAgICAobXVsdGlwbGUgc3RhdGVtZW50V2l0aEluZGVudGVkQmxvY2sgZXhwcmVzc2lvbnMgd2l0aGluIGEgc2luZ2xlIGdyYW1tYXINCiAgICAgICAgICAgIHNob3VsZCBzaGFyZSBhIGNvbW1vbiBpbmRlbnRTdGFjaykNCiAgICAgLSBpbmRlbnQgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBibG9jayBtdXN0IGJlIGluZGVudGVkIGJleW9uZCB0aGUNCiAgICAgICAgICAgIHRoZSBjdXJyZW50IGxldmVsOyBzZXQgdG8gRmFsc2UgZm9yIGJsb2NrIG9mIGxlZnQtbW9zdCBzdGF0ZW1lbnRzDQogICAgICAgICAgICAoZGVmYXVsdD1De1RydWV9KQ0KDQogICAgQSB2YWxpZCBibG9jayBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIEN7YmxvY2tTdGF0ZW1lbnR9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGEgPSAnJycNCiAgICAgICAgZGVmIEEoeik6DQogICAgICAgICAgQTENCiAgICAgICAgICBCID0gMTAwDQogICAgICAgICAgRyA9IEEyDQogICAgICAgICAgQTINCiAgICAgICAgICBBMw0KICAgICAgICBCDQogICAgICAgIGRlZiBCQihhLGIsYyk6DQogICAgICAgICAgQkIxDQogICAgICAgICAgZGVmIEJCQSgpOg0KICAgICAgICAgICAgYmJhMQ0KICAgICAgICAgICAgYmJhMg0KICAgICAgICAgICAgYmJhMw0KICAgICAgICBDDQogICAgICAgIEQNCiAgICAgICAgZGVmIHNwYW0oeCx5KToNCiAgICAgICAgICAgICBkZWYgZWdncyh6KToNCiAgICAgICAgICAgICAgICAgcGFzcw0KICAgICAgICAnJycNCg0KDQogICAgICAgIGluZGVudFN0YWNrID0gWzFdDQogICAgICAgIHN0bXQgPSBGb3J3YXJkKCkNCg0KICAgICAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykNCiAgICAgICAgZnVuY0RlY2wgPSAoImRlZiIgKyBpZGVudGlmaWVyICsgR3JvdXAoICIoIiArIE9wdGlvbmFsKCBkZWxpbWl0ZWRMaXN0KGlkZW50aWZpZXIpICkgKyAiKSIgKSArICI6IikNCiAgICAgICAgZnVuY19ib2R5ID0gaW5kZW50ZWRCbG9jayhzdG10LCBpbmRlbnRTdGFjaykNCiAgICAgICAgZnVuY0RlZiA9IEdyb3VwKCBmdW5jRGVjbCArIGZ1bmNfYm9keSApDQoNCiAgICAgICAgcnZhbHVlID0gRm9yd2FyZCgpDQogICAgICAgIGZ1bmNDYWxsID0gR3JvdXAoaWRlbnRpZmllciArICIoIiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QocnZhbHVlKSkgKyAiKSIpDQogICAgICAgIHJ2YWx1ZSA8PCAoZnVuY0NhbGwgfCBpZGVudGlmaWVyIHwgV29yZChudW1zKSkNCiAgICAgICAgYXNzaWdubWVudCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiPSIgKyBydmFsdWUpDQogICAgICAgIHN0bXQgPDwgKCBmdW5jRGVmIHwgYXNzaWdubWVudCB8IGlkZW50aWZpZXIgKQ0KDQogICAgICAgIG1vZHVsZV9ib2R5ID0gT25lT3JNb3JlKHN0bXQpDQoNCiAgICAgICAgcGFyc2VUcmVlID0gbW9kdWxlX2JvZHkucGFyc2VTdHJpbmcoZGF0YSkNCiAgICAgICAgcGFyc2VUcmVlLnBwcmludCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snZGVmJywNCiAgICAgICAgICAnQScsDQogICAgICAgICAgWycoJywgJ3onLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbWydBMSddLCBbWydCJywgJz0nLCAnMTAwJ11dLCBbWydHJywgJz0nLCAnQTInXV0sIFsnQTInXSwgWydBMyddXV0sDQogICAgICAgICAnQicsDQogICAgICAgICBbJ2RlZicsDQogICAgICAgICAgJ0JCJywNCiAgICAgICAgICBbJygnLCAnYScsICdiJywgJ2MnLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbWydCQjEnXSwgW1snZGVmJywgJ0JCQScsIFsnKCcsICcpJ10sICc6JywgW1snYmJhMSddLCBbJ2JiYTInXSwgWydiYmEzJ11dXV1dXSwNCiAgICAgICAgICdDJywNCiAgICAgICAgICdEJywNCiAgICAgICAgIFsnZGVmJywNCiAgICAgICAgICAnc3BhbScsDQogICAgICAgICAgWycoJywgJ3gnLCAneScsICcpJ10sDQogICAgICAgICAgJzonLA0KICAgICAgICAgIFtbWydkZWYnLCAnZWdncycsIFsnKCcsICd6JywgJyknXSwgJzonLCBbWydwYXNzJ11dXV1dXV0gDQogICAgIiIiDQogICAgZGVmIGNoZWNrUGVlckluZGVudChzLGwsdCk6DQogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4NCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgY3VyQ29sICE9IGluZGVudFN0YWNrWy0xXToNCiAgICAgICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uKHMsbCwiaWxsZWdhbCBuZXN0aW5nIikNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgcGVlciBlbnRyeSIpDQoNCiAgICBkZWYgY2hlY2tTdWJJbmRlbnQocyxsLHQpOg0KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQ0KICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICBpbmRlbnRTdGFjay5hcHBlbmQoIGN1ckNvbCApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHN1YmVudHJ5IikNCg0KICAgIGRlZiBjaGVja1VuaW5kZW50KHMsbCx0KToNCiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybg0KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQ0KICAgICAgICBpZiBub3QoaW5kZW50U3RhY2sgYW5kIGN1ckNvbCA8IGluZGVudFN0YWNrWy0xXSBhbmQgY3VyQ29sIDw9IGluZGVudFN0YWNrWy0yXSk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhbiB1bmluZGVudCIpDQogICAgICAgIGluZGVudFN0YWNrLnBvcCgpDQoNCiAgICBOTCA9IE9uZU9yTW9yZShMaW5lRW5kKCkuc2V0V2hpdGVzcGFjZUNoYXJzKCJcdCAiKS5zdXBwcmVzcygpKQ0KICAgIElOREVOVCA9IChFbXB0eSgpICsgRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1N1YkluZGVudCkpLnNldE5hbWUoJ0lOREVOVCcpDQogICAgUEVFUiAgID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1BlZXJJbmRlbnQpLnNldE5hbWUoJycpDQogICAgVU5ERU5UID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1VuaW5kZW50KS5zZXROYW1lKCdVTklOREVOVCcpDQogICAgaWYgaW5kZW50Og0KICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsNCiAgICAgICAgICAgICN+IEZvbGxvd2VkQnkoYmxvY2tTdGF0ZW1lbnRFeHByKSArDQogICAgICAgICAgICBJTkRFTlQgKyAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSArIFVOREVOVCkNCiAgICBlbHNlOg0KICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsNCiAgICAgICAgICAgIChPbmVPck1vcmUoIFBFRVIgKyBHcm91cChibG9ja1N0YXRlbWVudEV4cHIpICsgT3B0aW9uYWwoTkwpICkpICkNCiAgICBibG9ja1N0YXRlbWVudEV4cHIuaWdub3JlKF9ic2xhc2ggKyBMaW5lRW5kKCkpDQogICAgcmV0dXJuIHNtRXhwci5zZXROYW1lKCdpbmRlbnRlZCBibG9jaycpDQoNCmFscGhhczhiaXQgPSBzcmFuZ2UociJbXDB4YzAtXDB4ZDZcMHhkOC1cMHhmNlwweGY4LVwweGZmXSIpDQpwdW5jOGJpdCA9IHNyYW5nZShyIltcMHhhMS1cMHhiZlwweGQ3XDB4ZjddIikNCg0KYW55T3BlblRhZyxhbnlDbG9zZVRhZyA9IG1ha2VIVE1MVGFncyhXb3JkKGFscGhhcyxhbHBoYW51bXMrIl86Iikuc2V0TmFtZSgnYW55IHRhZycpKQ0KX2h0bWxFbnRpdHlNYXAgPSBkaWN0KHppcCgiZ3QgbHQgYW1wIG5ic3AgcXVvdCBhcG9zIi5zcGxpdCgpLCc+PCYgIlwnJykpDQpjb21tb25IVE1MRW50aXR5ID0gUmVnZXgoJyYoP1A8ZW50aXR5PicgKyAnfCcuam9pbihfaHRtbEVudGl0eU1hcC5rZXlzKCkpICsiKTsiKS5zZXROYW1lKCJjb21tb24gSFRNTCBlbnRpdHkiKQ0KZGVmIHJlcGxhY2VIVE1MRW50aXR5KHQpOg0KICAgICIiIkhlbHBlciBwYXJzZXIgYWN0aW9uIHRvIHJlcGxhY2UgY29tbW9uIEhUTUwgZW50aXRpZXMgd2l0aCB0aGVpciBzcGVjaWFsIGNoYXJhY3RlcnMiIiINCiAgICByZXR1cm4gX2h0bWxFbnRpdHlNYXAuZ2V0KHQuZW50aXR5KQ0KDQojIGl0J3MgZWFzeSB0byBnZXQgdGhlc2UgY29tbWVudCBzdHJ1Y3R1cmVzIHdyb25nIC0gdGhleSdyZSB2ZXJ5IGNvbW1vbiwgc28gbWF5IGFzIHdlbGwgbWFrZSB0aGVtIGF2YWlsYWJsZQ0KY1N0eWxlQ29tbWVudCA9IENvbWJpbmUoUmVnZXgociIvXCooPzpbXipdfFwqKD8hLykpKiIpICsgJyovJykuc2V0TmFtZSgiQyBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7LyogLi4uICovfSINCg0KaHRtbENvbW1lbnQgPSBSZWdleChyIjwhLS1bXHNcU10qPy0tPiIpLnNldE5hbWUoIkhUTUwgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDezwhLS0gLi4uIC0tPn0iDQoNCnJlc3RPZkxpbmUgPSBSZWdleChyIi4qIikubGVhdmVXaGl0ZXNwYWNlKCkuc2V0TmFtZSgicmVzdCBvZiBsaW5lIikNCmRibFNsYXNoQ29tbWVudCA9IFJlZ2V4KHIiLy8oPzpcXFxufFteXG5dKSoiKS5zZXROYW1lKCIvLyBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7Ly8gLi4uICh0byBlbmQgb2YgbGluZSl9Ig0KDQpjcHBTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLyd8IGRibFNsYXNoQ29tbWVudCkuc2V0TmFtZSgiQysrIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgZWl0aGVyIGZvcm0gQ3tMe2NTdHlsZUNvbW1lbnR9fSBvciBDe0x7ZGJsU2xhc2hDb21tZW50fX0iDQoNCmphdmFTdHlsZUNvbW1lbnQgPSBjcHBTdHlsZUNvbW1lbnQNCiJTYW1lIGFzIEN7THtjcHBTdHlsZUNvbW1lbnR9fSINCg0KcHl0aG9uU3R5bGVDb21tZW50ID0gUmVnZXgociIjLioiKS5zZXROYW1lKCJQeXRob24gc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDeyMgLi4uICh0byBlbmQgb2YgbGluZSl9Ig0KDQpfY29tbWFzZXBpdGVtID0gQ29tYmluZShPbmVPck1vcmUoV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwoIFdvcmQoIiBcdCIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxpdGVyYWwoIiwiKSArIH5MaW5lRW5kKCkgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpDQpjb21tYVNlcGFyYXRlZExpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWFTZXBhcmF0ZWRMaXN0IikNCiIiIihEZXByZWNhdGVkKSBQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4NCiAgIFRoaXMgZXhwcmVzc2lvbiBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5jb21tYV9zZXBhcmF0ZWRfbGlzdH0uIiIiDQoNCiMgc29tZSBvdGhlciB1c2VmdWwgZXhwcmVzc2lvbnMgLSB1c2luZyBsb3dlci1jYXNlIGNsYXNzIG5hbWUgc2luY2Ugd2UgYXJlIHJlYWxseSB1c2luZyB0aGlzIGFzIGEgbmFtZXNwYWNlDQpjbGFzcyBweXBhcnNpbmdfY29tbW9uOg0KICAgICIiIg0KICAgIEhlcmUgYXJlIHNvbWUgY29tbW9uIGxvdy1sZXZlbCBleHByZXNzaW9ucyB0aGF0IG1heSBiZSB1c2VmdWwgaW4ganVtcC1zdGFydGluZyBwYXJzZXIgZGV2ZWxvcG1lbnQ6DQogICAgIC0gbnVtZXJpYyBmb3JtcyAoTHtpbnRlZ2VyczxpbnRlZ2VyPn0sIEx7cmVhbHM8cmVhbD59LCBMe3NjaWVudGlmaWMgbm90YXRpb248c2NpX3JlYWw+fSkNCiAgICAgLSBjb21tb24gTHtwcm9ncmFtbWluZyBpZGVudGlmaWVyczxpZGVudGlmaWVyPn0NCiAgICAgLSBuZXR3b3JrIGFkZHJlc3NlcyAoTHtNQUM8bWFjX2FkZHJlc3M+fSwgTHtJUHY0PGlwdjRfYWRkcmVzcz59LCBMe0lQdjY8aXB2Nl9hZGRyZXNzPn0pDQogICAgIC0gSVNPODYwMSBMe2RhdGVzPGlzbzg2MDFfZGF0ZT59IGFuZCBMe2RhdGV0aW1lPGlzbzg2MDFfZGF0ZXRpbWU+fQ0KICAgICAtIEx7VVVJRDx1dWlkPn0NCiAgICAgLSBMe2NvbW1hLXNlcGFyYXRlZCBsaXN0PGNvbW1hX3NlcGFyYXRlZF9saXN0Pn0NCiAgICBQYXJzZSBhY3Rpb25zOg0KICAgICAtIEN7THtjb252ZXJ0VG9JbnRlZ2VyfX0NCiAgICAgLSBDe0x7Y29udmVydFRvRmxvYXR9fQ0KICAgICAtIEN7THtjb252ZXJ0VG9EYXRlfX0NCiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZXRpbWV9fQ0KICAgICAtIEN7THtzdHJpcEhUTUxUYWdzfX0NCiAgICAgLSBDe0x7dXBjYXNlVG9rZW5zfX0NCiAgICAgLSBDe0x7ZG93bmNhc2VUb2tlbnN9fQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQ0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICArMTAwDQogICAgICAgICAgICAzLjE0MTU5DQogICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24uZm51bWJlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgKzEwMA0KICAgICAgICAgICAgMy4xNDE1OQ0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBoZXggbnVtYmVycw0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICBGRg0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24uZnJhY3Rpb24ucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGZyYWN0aW9ucw0KICAgICAgICAgICAgMS8yDQogICAgICAgICAgICAtMy80DQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5taXhlZF9pbnRlZ2VyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBtaXhlZCBmcmFjdGlvbnMNCiAgICAgICAgICAgIDENCiAgICAgICAgICAgIDEvMg0KICAgICAgICAgICAgLTMvNA0KICAgICAgICAgICAgMS0zLzQNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBpbXBvcnQgdXVpZA0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyB1dWlkDQogICAgICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlDQogICAgICAgIDEwMA0KICAgICAgICBbMTAwXQ0KDQogICAgICAgIC0xMDANCiAgICAgICAgWy0xMDBdDQoNCiAgICAgICAgKzEwMA0KICAgICAgICBbMTAwXQ0KDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgWzMuMTQxNTldDQoNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgMWUtMTINCiAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICAgICAgMTAwDQogICAgICAgIFsxMDAuMF0NCg0KICAgICAgICAtMTAwDQogICAgICAgIFstMTAwLjBdDQoNCiAgICAgICAgKzEwMA0KICAgICAgICBbMTAwLjBdDQoNCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICBbMy4xNDE1OV0NCg0KICAgICAgICA2LjAyZTIzDQogICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAxZS0xMg0KICAgICAgICBbMWUtMTJdDQoNCiAgICAgICAgIyBoZXggbnVtYmVycw0KICAgICAgICAxMDANCiAgICAgICAgWzI1Nl0NCg0KICAgICAgICBGRg0KICAgICAgICBbMjU1XQ0KDQogICAgICAgICMgZnJhY3Rpb25zDQogICAgICAgIDEvMg0KICAgICAgICBbMC41XQ0KDQogICAgICAgIC0zLzQNCiAgICAgICAgWy0wLjc1XQ0KDQogICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zDQogICAgICAgIDENCiAgICAgICAgWzFdDQoNCiAgICAgICAgMS8yDQogICAgICAgIFswLjVdDQoNCiAgICAgICAgLTMvNA0KICAgICAgICBbLTAuNzVdDQoNCiAgICAgICAgMS0zLzQNCiAgICAgICAgWzEuNzVdDQoNCiAgICAgICAgIyB1dWlkDQogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICBbVVVJRCgnMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JyldDQogICAgIiIiDQoNCiAgICBjb252ZXJ0VG9JbnRlZ2VyID0gdG9rZW5NYXAoaW50KQ0KICAgICIiIg0KICAgIFBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgaW50ZWdlcnMgdG8gUHl0aG9uIGludA0KICAgICIiIg0KDQogICAgY29udmVydFRvRmxvYXQgPSB0b2tlbk1hcChmbG9hdCkNCiAgICAiIiINCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIG51bWJlcnMgdG8gUHl0aG9uIGZsb2F0DQogICAgIiIiDQoNCiAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIHVuc2lnbmVkIGludGVnZXIsIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBoZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0TmFtZSgiaGV4IGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsMTYpKQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgc2lnbmVkX2ludGVnZXIgPSBSZWdleChyJ1srLV0/XGQrJykuc2V0TmFtZSgic2lnbmVkIGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYW4gaW50ZWdlciB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgc2lnbiwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIGZyYWN0aW9uID0gKHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpICsgJy8nICsgc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkpLnNldE5hbWUoImZyYWN0aW9uIikNCiAgICAiIiJmcmFjdGlvbmFsIGV4cHJlc3Npb24gb2YgYW4gaW50ZWdlciBkaXZpZGVkIGJ5IGFuIGludGVnZXIsIHJldHVybnMgYSBmbG9hdCIiIg0KICAgIGZyYWN0aW9uLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0OiB0WzBdL3RbLTFdKQ0KDQogICAgbWl4ZWRfaW50ZWdlciA9IChmcmFjdGlvbiB8IHNpZ25lZF9pbnRlZ2VyICsgT3B0aW9uYWwoT3B0aW9uYWwoJy0nKS5zdXBwcmVzcygpICsgZnJhY3Rpb24pKS5zZXROYW1lKCJmcmFjdGlvbiBvciBtaXhlZCBpbnRlZ2VyLWZyYWN0aW9uIikNCiAgICAiIiJtaXhlZCBpbnRlZ2VyIG9mIHRoZSBmb3JtICdpbnRlZ2VyIC0gZnJhY3Rpb24nLCB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgaW50ZWdlciwgcmV0dXJucyBmbG9hdCIiIg0KICAgIG1peGVkX2ludGVnZXIuYWRkUGFyc2VBY3Rpb24oc3VtKQ0KDQogICAgcmVhbCA9IFJlZ2V4KHInWystXT9cZCtcLlxkKicpLnNldE5hbWUoInJlYWwgbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBhbmQgcmV0dXJucyBhIGZsb2F0IiIiDQoNCiAgICBzY2lfcmVhbCA9IFJlZ2V4KHInWystXT9cZCsoW2VFXVsrLV0/XGQrfFwuXGQqKFtlRV1bKy1dP1xkKyk/KScpLnNldE5hbWUoInJlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2l0aCBvcHRpb25hbCBzY2llbnRpZmljIG5vdGF0aW9uIGFuZCByZXR1cm5zIGEgZmxvYXQiIiINCg0KICAgICMgc3RyZWFtbGluaW5nIHRoaXMgZXhwcmVzc2lvbiBtYWtlcyB0aGUgZG9jcyBuaWNlci1sb29raW5nDQogICAgbnVtYmVyID0gKHNjaV9yZWFsIHwgcmVhbCB8IHNpZ25lZF9pbnRlZ2VyKS5zdHJlYW1saW5lKCkNCiAgICAiIiJhbnkgbnVtZXJpYyBleHByZXNzaW9uLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiB0eXBlIiIiDQoNCiAgICBmbnVtYmVyID0gUmVnZXgocidbKy1dP1xkK1wuP1xkKihbZUVdWystXT9cZCspPycpLnNldE5hbWUoImZudW1iZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdCIiIg0KICAgIA0KICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpLnNldE5hbWUoImlkZW50aWZpZXIiKQ0KICAgICIiInR5cGljYWwgY29kZSBpZGVudGlmaWVyIChsZWFkaW5nIGFscGhhIG9yICdfJywgZm9sbG93ZWQgYnkgMCBvciBtb3JlIGFscGhhcywgbnVtcywgb3IgJ18nKSIiIg0KICAgIA0KICAgIGlwdjRfYWRkcmVzcyA9IFJlZ2V4KHInKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KShcLigyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkpezN9Jykuc2V0TmFtZSgiSVB2NCBhZGRyZXNzIikNCiAgICAiSVB2NCBhZGRyZXNzIChDezAuMC4wLjAgLSAyNTUuMjU1LjI1NS4yNTV9KSINCg0KICAgIF9pcHY2X3BhcnQgPSBSZWdleChyJ1swLTlhLWZBLUZdezEsNH0nKS5zZXROYW1lKCJoZXhfaW50ZWdlciIpDQogICAgX2Z1bGxfaXB2Nl9hZGRyZXNzID0gKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqNykuc2V0TmFtZSgiZnVsbCBJUHY2IGFkZHJlc3MiKQ0KICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MgPSAoT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkgKyAiOjoiICsgT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkpLnNldE5hbWUoInNob3J0IElQdjYgYWRkcmVzcyIpDQogICAgX3Nob3J0X2lwdjZfYWRkcmVzcy5hZGRDb25kaXRpb24obGFtYmRhIHQ6IHN1bSgxIGZvciB0dCBpbiB0IGlmIHB5cGFyc2luZ19jb21tb24uX2lwdjZfcGFydC5tYXRjaGVzKHR0KSkgPCA4KQ0KICAgIF9taXhlZF9pcHY2X2FkZHJlc3MgPSAoIjo6ZmZmZjoiICsgaXB2NF9hZGRyZXNzKS5zZXROYW1lKCJtaXhlZCBJUHY2IGFkZHJlc3MiKQ0KICAgIGlwdjZfYWRkcmVzcyA9IENvbWJpbmUoKF9mdWxsX2lwdjZfYWRkcmVzcyB8IF9taXhlZF9pcHY2X2FkZHJlc3MgfCBfc2hvcnRfaXB2Nl9hZGRyZXNzKS5zZXROYW1lKCJJUHY2IGFkZHJlc3MiKSkuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikNCiAgICAiSVB2NiBhZGRyZXNzIChsb25nLCBzaG9ydCwgb3IgbWl4ZWQgZm9ybSkiDQogICAgDQogICAgbWFjX2FkZHJlc3MgPSBSZWdleChyJ1swLTlhLWZBLUZdezJ9KFs6Li1dKVswLTlhLWZBLUZdezJ9KD86XDFbMC05YS1mQS1GXXsyfSl7NH0nKS5zZXROYW1lKCJNQUMgYWRkcmVzcyIpDQogICAgIk1BQyBhZGRyZXNzIHh4Onh4Onh4Onh4Onh4IChtYXkgYWxzbyBoYXZlICctJyBvciAnLicgZGVsaW1pdGVycykiDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGNvbnZlcnRUb0RhdGUoZm10PSIlWS0lbS0lZCIpOg0KICAgICAgICAiIiINCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGUNCg0KICAgICAgICBQYXJhbXMgLQ0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkIn0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkYXRlX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZS5jb3B5KCkNCiAgICAgICAgICAgIGRhdGVfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGUoKSkNCiAgICAgICAgICAgIHByaW50KGRhdGVfZXhwci5wYXJzZVN0cmluZygiMTk5OS0xMi0zMSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGUoMTk5OSwgMTIsIDMxKV0NCiAgICAgICAgIiIiDQogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5zdHJwdGltZSh0WzBdLCBmbXQpLmRhdGUoKQ0KICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocywgbCwgc3RyKHZlKSkNCiAgICAgICAgcmV0dXJuIGN2dF9mbg0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBjb252ZXJ0VG9EYXRldGltZShmbXQ9IiVZLSVtLSVkVCVIOiVNOiVTLiVmIik6DQogICAgICAgICIiIg0KICAgICAgICBIZWxwZXIgdG8gY3JlYXRlIGEgcGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBkYXRldGltZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGV0aW1lDQoNCiAgICAgICAgUGFyYW1zIC0NCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZFQlSDolTTolUy4lZiJ9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZHRfZXhwciA9IHB5cGFyc2luZ19jb21tb24uaXNvODYwMV9kYXRldGltZS5jb3B5KCkNCiAgICAgICAgICAgIGR0X2V4cHIuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5jb252ZXJ0VG9EYXRldGltZSgpKQ0KICAgICAgICAgICAgcHJpbnQoZHRfZXhwci5wYXJzZVN0cmluZygiMTk5OS0xMi0zMVQyMzo1OTo1OS45OTkiKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFtkYXRldGltZS5kYXRldGltZSgxOTk5LCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTAwMCldDQogICAgICAgICIiIg0KICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KQ0KICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocywgbCwgc3RyKHZlKSkNCiAgICAgICAgcmV0dXJuIGN2dF9mbg0KDQogICAgaXNvODYwMV9kYXRlID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSkoPzotKD9QPG1vbnRoPlxkXGQpKD86LSg/UDxkYXk+XGRcZCkpPyk/Jykuc2V0TmFtZSgiSVNPODYwMSBkYXRlIikNCiAgICAiSVNPODYwMSBkYXRlIChDe3l5eXktbW0tZGR9KSINCg0KICAgIGlzbzg2MDFfZGF0ZXRpbWUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KS0oP1A8bW9udGg+XGRcZCktKD9QPGRheT5cZFxkKVtUIF0oP1A8aG91cj5cZFxkKTooP1A8bWludXRlPlxkXGQpKDooP1A8c2Vjb25kPlxkXGQoXC5cZCopPyk/KT8oP1A8dHo+WnxbKy1dXGRcZDo/XGRcZCk/Jykuc2V0TmFtZSgiSVNPODYwMSBkYXRldGltZSIpDQogICAgIklTTzg2MDEgZGF0ZXRpbWUgKEN7eXl5eS1tbS1kZFRoaDptbTpzcy5zKFp8Ky0wMDowMCl9KSAtIHRyYWlsaW5nIHNlY29uZHMsIG1pbGxpc2Vjb25kcywgYW5kIHRpbWV6b25lIG9wdGlvbmFsOyBhY2NlcHRzIHNlcGFyYXRpbmcgQ3snVCd9IG9yIEN7JyAnfSINCg0KICAgIHV1aWQgPSBSZWdleChyJ1swLTlhLWZBLUZdezh9KC1bMC05YS1mQS1GXXs0fSl7M30tWzAtOWEtZkEtRl17MTJ9Jykuc2V0TmFtZSgiVVVJRCIpDQogICAgIlVVSUQgKEN7eHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4fSkiDQoNCiAgICBfaHRtbF9zdHJpcHBlciA9IGFueU9wZW5UYWcuc3VwcHJlc3MoKSB8IGFueUNsb3NlVGFnLnN1cHByZXNzKCkNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHN0cmlwSFRNTFRhZ3MocywgbCwgdG9rZW5zKToNCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlIGFjdGlvbiB0byByZW1vdmUgSFRNTCB0YWdzIGZyb20gd2ViIHBhZ2UgSFRNTCBzb3VyY2UNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgc3RyaXAgSFRNTCBsaW5rcyBmcm9tIG5vcm1hbCB0ZXh0IA0KICAgICAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+Jw0KICAgICAgICAgICAgdGQsdGRfZW5kID0gbWFrZUhUTUxUYWdzKCJURCIpDQogICAgICAgICAgICB0YWJsZV90ZXh0ID0gdGQgKyBTa2lwVG8odGRfZW5kKS5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLnN0cmlwSFRNTFRhZ3MpKCJib2R5IikgKyB0ZF9lbmQNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQodGFibGVfdGV4dC5wYXJzZVN0cmluZyh0ZXh0KS5ib2R5KSAjIC0+ICdNb3JlIGluZm8gYXQgdGhlIHB5cGFyc2luZyB3aWtpIHBhZ2UnDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gcHlwYXJzaW5nX2NvbW1vbi5faHRtbF9zdHJpcHBlci50cmFuc2Zvcm1TdHJpbmcodG9rZW5zWzBdKQ0KDQogICAgX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICsgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE9wdGlvbmFsKCBXaGl0ZSgiIFx0IikgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpDQogICAgY29tbWFfc2VwYXJhdGVkX2xpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWEgc2VwYXJhdGVkIGxpc3QiKQ0KICAgICIiIlByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiIiIg0KDQogICAgdXBjYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKSkNCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4iIiINCg0KICAgIGRvd25jYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKSkNCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4iIiINCg0KDQppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOg0KDQogICAgc2VsZWN0VG9rZW4gICAgPSBDYXNlbGVzc0xpdGVyYWwoInNlbGVjdCIpDQogICAgZnJvbVRva2VuICAgICAgPSBDYXNlbGVzc0xpdGVyYWwoImZyb20iKQ0KDQogICAgaWRlbnQgICAgICAgICAgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zICsgIl8kIikNCg0KICAgIGNvbHVtbk5hbWUgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykNCiAgICBjb2x1bW5OYW1lTGlzdCA9IEdyb3VwKGRlbGltaXRlZExpc3QoY29sdW1uTmFtZSkpLnNldE5hbWUoImNvbHVtbnMiKQ0KICAgIGNvbHVtblNwZWMgICAgID0gKCcqJyB8IGNvbHVtbk5hbWVMaXN0KQ0KDQogICAgdGFibGVOYW1lICAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQ0KICAgIHRhYmxlTmFtZUxpc3QgID0gR3JvdXAoZGVsaW1pdGVkTGlzdCh0YWJsZU5hbWUpKS5zZXROYW1lKCJ0YWJsZXMiKQ0KICAgIA0KICAgIHNpbXBsZVNRTCAgICAgID0gc2VsZWN0VG9rZW4oImNvbW1hbmQiKSArIGNvbHVtblNwZWMoImNvbHVtbnMiKSArIGZyb21Ub2tlbiArIHRhYmxlTmFtZUxpc3QoInRhYmxlcyIpDQoNCiAgICAjIGRlbW8gcnVuVGVzdHMgbWV0aG9kLCBpbmNsdWRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGVzdCBzdHJpbmcNCiAgICBzaW1wbGVTUUwucnVuVGVzdHMoIiIiDQogICAgICAgICMgJyonIGFzIGNvbHVtbiBsaXN0IGFuZCBkb3R0ZWQgdGFibGUgbmFtZQ0KICAgICAgICBzZWxlY3QgKiBmcm9tIFNZUy5YWVpaWQ0KDQogICAgICAgICMgY2FzZWxlc3MgbWF0Y2ggb24gIlNFTEVDVCIsIGFuZCBjYXN0cyBiYWNrIHRvICJzZWxlY3QiDQogICAgICAgIFNFTEVDVCAqIGZyb20gWFlaWlksIEFCQw0KDQogICAgICAgICMgbGlzdCBvZiBjb2x1bW4gbmFtZXMsIGFuZCBtaXhlZCBjYXNlIFNFTEVDVCBrZXl3b3JkDQogICAgICAgIFNlbGVjdCBBQSxCQixDQyBmcm9tIFN5cy5kdWFsDQoNCiAgICAgICAgIyBtdWx0aXBsZSB0YWJsZXMNCiAgICAgICAgU2VsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbCwgVGFibGUyDQoNCiAgICAgICAgIyBpbnZhbGlkIFNFTEVDVCBrZXl3b3JkIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgWGVsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbA0KDQogICAgICAgICMgaW5jb21wbGV0ZSBjb21tYW5kIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgU2VsZWN0DQoNCiAgICAgICAgIyBpbnZhbGlkIGNvbHVtbiBuYW1lIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgU2VsZWN0IF5eXiBmcm94IFN5cy5kdWFsDQoNCiAgICAgICAgIiIiKQ0KDQogICAgcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICAtMTAwDQogICAgICAgICsxMDANCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICA2LjAyZTIzDQogICAgICAgIDFlLTEyDQogICAgICAgICIiIikNCg0KICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICAtMTAwDQogICAgICAgICsxMDANCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICA2LjAyZTIzDQogICAgICAgIDFlLTEyDQogICAgICAgICIiIikNCg0KICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICBGRg0KICAgICAgICAiIiIpDQoNCiAgICBpbXBvcnQgdXVpZA0KICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQ0KICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygiIiINCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgICIiIikNClBLAwQUAAAAAAAAACEAmVhNWpJ1AACSdQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3Ivc2l4LnB5IiIiVXRpbGl0aWVzIGZvciB3cml0aW5nIGNvZGUgdGhhdCBydW5zIG9uIFB5dGhvbiAyIGFuZCAzIiIiCgojIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEJlbmphbWluIFBldGVyc29uCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKIyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQojIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCl9fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24gPGJlbmphbWluQHB5dGhvbi5vcmc+IgpfX3ZlcnNpb25fXyA9ICIxLjEwLjAiCgoKIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzClBZMzQgPSBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPj0gKDMsIDQpCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICBpbnRlZ2VyX3R5cGVzID0gaW50LAogICAgY2xhc3NfdHlwZXMgPSB0eXBlLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBiaW5hcnlfdHlwZSA9IGJ5dGVzCgogICAgTUFYU0laRSA9IHN5cy5tYXhzaXplCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCiAgICBjbGFzc190eXBlcyA9ICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBiaW5hcnlfdHlwZSA9IHN0cgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJqYXZhIik6CiAgICAgICAgIyBKeXRob24gYWx3YXlzIHVzZXMgMzIgYml0cy4KICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICBlbHNlOgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0byBoYXZlIHNpemVvZihsb25nKSAhPSBzaXplb2YoUHlfc3NpemVfdCkuCiAgICAgICAgY2xhc3MgWChvYmplY3QpOgoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMSA8PCAzMQogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuKFgoKSkKICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIyAzMi1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgNjQtYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgNjMpIC0gMSkKICAgICAgICBkZWwgWAoKCmRlZiBfYWRkX2RvYyhmdW5jLCBkb2MpOgogICAgIiIiQWRkIGRvY3VtZW50YXRpb24gdG8gYSBmdW5jdGlvbi4iIiIKICAgIGZ1bmMuX19kb2NfXyA9IGRvYwoKCmRlZiBfaW1wb3J0X21vZHVsZShuYW1lKToKICAgICIiIkltcG9ydCBtb2R1bGUsIHJldHVybmluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBsYXN0IGRvdC4iIiIKICAgIF9faW1wb3J0X18obmFtZSkKICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQoKCmNsYXNzIF9MYXp5RGVzY3Iob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgdHApOgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHNldGF0dHIob2JqLCBzZWxmLm5hbWUsIHJlc3VsdCkgICMgSW52b2tlcyBfX3NldF9fLgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBUaGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBhdm9pZHMgcnVubmluZyB0aGlzIGFnYWluIGJ5CiAgICAgICAgICAgICMgcmVtb3ZpbmcgdGhpcyBkZXNjcmlwdG9yLgogICAgICAgICAgICBkZWxhdHRyKG9iai5fX2NsYXNzX18sIHNlbGYubmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTW92ZWRNb2R1bGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZCwgbmV3PU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkTW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXcgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGQKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICBfbW9kdWxlID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9tb2R1bGUsIGF0dHIpCiAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3VwZXIoX0xhenlNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5fX2RvY19fID0gc2VsZi5fX2NsYXNzX18uX19kb2NfXwoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIGF0dHJzID0gWyJfX2RvY19fIiwgIl9fbmFtZV9fIl0KICAgICAgICBhdHRycyArPSBbYXR0ci5uYW1lIGZvciBhdHRyIGluIHNlbGYuX21vdmVkX2F0dHJpYnV0ZXNdCiAgICAgICAgcmV0dXJuIGF0dHJzCgogICAgIyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICBfbW92ZWRfYXR0cmlidXRlcyA9IFtdCgoKY2xhc3MgTW92ZWRBdHRyaWJ1dGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZF9tb2QsIG5ld19tb2QsIG9sZF9hdHRyPU5vbmUsIG5ld19hdHRyPU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkQXR0cmlidXRlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3X21vZCBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3X21vZCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXdfbW9kCiAgICAgICAgICAgIGlmIG5ld19hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG9sZF9hdHRyCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG5ld19hdHRyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGRfbW9kCiAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvbGRfYXR0ciA9IG5hbWUKICAgICAgICAgICAgc2VsZi5hdHRyID0gb2xkX2F0dHIKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgbW9kdWxlID0gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCiAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBzZWxmLmF0dHIpCgoKY2xhc3MgX1NpeE1ldGFQYXRoSW1wb3J0ZXIob2JqZWN0KToKCiAgICAiIiIKICAgIEEgbWV0YSBwYXRoIGltcG9ydGVyIHRvIGltcG9ydCBzaXgubW92ZXMgYW5kIGl0cyBzdWJtb2R1bGVzLgoKICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFBFUDMwMiBmaW5kZXIgYW5kIGxvYWRlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAgIHdpdGggUHl0aG9uIDIuNSBhbmQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG9mIFB5dGhvbjMKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXhfbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IHNpeF9tb2R1bGVfbmFtZQogICAgICAgIHNlbGYua25vd25fbW9kdWxlcyA9IHt9CgogICAgZGVmIF9hZGRfbW9kdWxlKHNlbGYsIG1vZCwgKmZ1bGxuYW1lcyk6CiAgICAgICAgZm9yIGZ1bGxuYW1lIGluIGZ1bGxuYW1lczoKICAgICAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXSA9IG1vZAoKICAgIGRlZiBfZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5rbm93bl9tb2R1bGVzOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgbG9hZGVyIGRvZXMgbm90IGtub3cgbW9kdWxlICIgKyBmdWxsbmFtZSkKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgcmVsb2FkCiAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBtb2QgPSBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkKICAgICAgICBpZiBpc2luc3RhbmNlKG1vZCwgTW92ZWRNb2R1bGUpOgogICAgICAgICAgICBtb2QgPSBtb2QuX3Jlc29sdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRydWUsIGlmIHRoZSBuYW1lZCBtb2R1bGUgaXMgYSBwYWNrYWdlLgoKICAgICAgICBXZSBuZWVkIHRoaXMgbWV0aG9kIHRvIGdldCBjb3JyZWN0IHNwZWMgb2JqZWN0cyB3aXRoCiAgICAgICAgUHl0aG9uIDMuNCAoc2VlIFBFUDQ1MSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSksICJfX3BhdGhfXyIpCgogICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiJSZXR1cm4gTm9uZQoKICAgICAgICBSZXF1aXJlZCwgaWYgaXNfcGFja2FnZSBpcyBpbXBsZW1lbnRlZCIiIgogICAgICAgIHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSAgIyBldmVudHVhbGx5IHJhaXNlcyBJbXBvcnRFcnJvcgogICAgICAgIHJldHVybiBOb25lCiAgICBnZXRfc291cmNlID0gZ2V0X2NvZGUgICMgc2FtZSBhcyBnZXRfY29kZQoKX2ltcG9ydGVyID0gX1NpeE1ldGFQYXRoSW1wb3J0ZXIoX19uYW1lX18pCgoKY2xhc3MgX01vdmVkSXRlbXMoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQoKCl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImNTdHJpbmdJTyIsICJjU3RyaW5nSU8iLCAiaW8iLCAiU3RyaW5nSU8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXIiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImlmaWx0ZXIiLCAiZmlsdGVyIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyZmFsc2UiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpZmlsdGVyZmFsc2UiLCAiZmlsdGVyZmFsc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnB1dCIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJyYXdfaW5wdXQiLCAiaW5wdXQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnRlcm4iLCAiX19idWlsdGluX18iLCAic3lzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgibWFwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpbWFwIiwgIm1hcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZCIsICJvcyIsICJvcyIsICJnZXRjd2R1IiwgImdldGN3ZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZGIiLCAib3MiLCAib3MiLCAiZ2V0Y3dkIiwgImdldGN3ZGIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWxvYWRfbW9kdWxlIiwgIl9fYnVpbHRpbl9fIiwgImltcG9ydGxpYiIgaWYgUFkzNCBlbHNlICJpbXAiLCAicmVsb2FkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVkdWNlIiwgIl9fYnVpbHRpbl9fIiwgImZ1bmN0b29scyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNobGV4X3F1b3RlIiwgInBpcGVzIiwgInNobGV4IiwgInF1b3RlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3RyaW5nSU8iLCAiU3RyaW5nSU8iLCAiaW8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyRGljdCIsICJVc2VyRGljdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJMaXN0IiwgIlVzZXJMaXN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlclN0cmluZyIsICJVc2VyU3RyaW5nIiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgieHJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaXppcCIsICJ6aXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXBfbG9uZ2VzdCIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgIml6aXBfbG9uZ2VzdCIsICJ6aXBfbG9uZ2VzdCIpLAogICAgTW92ZWRNb2R1bGUoImJ1aWx0aW5zIiwgIl9fYnVpbHRpbl9fIiksCiAgICBNb3ZlZE1vZHVsZSgiY29uZmlncGFyc2VyIiwgIkNvbmZpZ1BhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImNvcHlyZWciLCAiY29weV9yZWciKSwKICAgIE1vdmVkTW9kdWxlKCJkYm1fZ251IiwgImdkYm0iLCAiZGJtLmdudSIpLAogICAgTW92ZWRNb2R1bGUoIl9kdW1teV90aHJlYWQiLCAiZHVtbXlfdGhyZWFkIiwgIl9kdW1teV90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZWphciIsICJjb29raWVsaWIiLCAiaHR0cC5jb29raWVqYXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZXMiLCAiQ29va2llIiwgImh0dHAuY29va2llcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfZW50aXRpZXMiLCAiaHRtbGVudGl0eWRlZnMiLCAiaHRtbC5lbnRpdGllcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfcGFyc2VyIiwgIkhUTUxQYXJzZXIiLCAiaHRtbC5wYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2NsaWVudCIsICJodHRwbGliIiwgImh0dHAuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU11bHRpcGFydCIsICJlbWFpbC5taW1lLm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbm9ubXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVOb25NdWx0aXBhcnQiLCAiZW1haWwubWltZS5ub25tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX3RleHQiLCAiZW1haWwuTUlNRVRleHQiLCAiZW1haWwubWltZS50ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9iYXNlIiwgImVtYWlsLk1JTUVCYXNlIiwgImVtYWlsLm1pbWUuYmFzZSIpLAogICAgTW92ZWRNb2R1bGUoIkJhc2VIVFRQU2VydmVyIiwgIkJhc2VIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiQ0dJSFRUUFNlcnZlciIsICJDR0lIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiU2ltcGxlSFRUUFNlcnZlciIsICJTaW1wbGVIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiY1BpY2tsZSIsICJjUGlja2xlIiwgInBpY2tsZSIpLAogICAgTW92ZWRNb2R1bGUoInF1ZXVlIiwgIlF1ZXVlIiksCiAgICBNb3ZlZE1vZHVsZSgicmVwcmxpYiIsICJyZXByIiksCiAgICBNb3ZlZE1vZHVsZSgic29ja2V0c2VydmVyIiwgIlNvY2tldFNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIl90aHJlYWQiLCAidGhyZWFkIiwgIl90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyIiwgIlRraW50ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RpYWxvZyIsICJEaWFsb2ciLCAidGtpbnRlci5kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZpbGVkaWFsb2ciLCAiRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Njcm9sbGVkdGV4dCIsICJTY3JvbGxlZFRleHQiLCAidGtpbnRlci5zY3JvbGxlZHRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3NpbXBsZWRpYWxvZyIsICJTaW1wbGVEaWFsb2ciLCAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RpeCIsICJUaXgiLCAidGtpbnRlci50aXgiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3R0ayIsICJ0dGsiLCAidGtpbnRlci50dGsiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbnN0YW50cyIsICJUa2NvbnN0YW50cyIsICJ0a2ludGVyLmNvbnN0YW50cyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZG5kIiwgIlRrZG5kIiwgInRraW50ZXIuZG5kIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb2xvcmNob29zZXIiLCAidGtDb2xvckNob29zZXIiLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29sb3JjaG9vc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb21tb25kaWFsb2ciLCAidGtDb21tb25EaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29tbW9uZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a2ZpbGVkaWFsb2ciLCAidGtGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZm9udCIsICJ0a0ZvbnQiLCAidGtpbnRlci5mb250IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9tZXNzYWdlYm94IiwgInRrTWVzc2FnZUJveCIsICJ0a2ludGVyLm1lc3NhZ2Vib3giKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Rrc2ltcGxlZGlhbG9nIiwgInRrU2ltcGxlRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9wYXJzZSIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX2Vycm9yIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9lcnJvciIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9yb2JvdHBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfY2xpZW50IiwgInhtbHJwY2xpYiIsICJ4bWxycGMuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX3NlcnZlciIsICJTaW1wbGVYTUxSUENTZXJ2ZXIiLCAieG1scnBjLnNlcnZlciIpLApdCiMgQWRkIHdpbmRvd3Mgc3BlY2lmaWMgbW9kdWxlcy4KaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICBfbW92ZWRfYXR0cmlidXRlcyArPSBbCiAgICAgICAgTW92ZWRNb2R1bGUoIndpbnJlZyIsICJfd2lucmVnIiksCiAgICBdCgpmb3IgYXR0ciBpbiBfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIGF0dHIubmFtZSwgYXR0cikKICAgIGlmIGlzaW5zdGFuY2UoYXR0ciwgTW92ZWRNb2R1bGUpOgogICAgICAgIF9pbXBvcnRlci5fYWRkX21vZHVsZShhdHRyLCAibW92ZXMuIiArIGF0dHIubmFtZSkKZGVsIGF0dHIKCl9Nb3ZlZEl0ZW1zLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX21vdmVkX2F0dHJpYnV0ZXMKCm1vdmVzID0gX01vdmVkSXRlbXMoX19uYW1lX18gKyAiLm1vdmVzIikKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKG1vdmVzLCAibW92ZXMiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3BhcnNlIiIiCgoKX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlBhcnNlUmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlNwbGl0UmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzbCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxkZWZyYWciLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsam9pbiIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxwYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxzcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVuc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZW5jb2RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHF1ZXJ5IiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHRhZyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR1c2VyIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX2ZyYWdtZW50IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfbmV0bG9jIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcGFyYW1zIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcXVlcnkiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19yZWxhdGl2ZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcGFyc2UiLCAibW92ZXMudXJsbGliLnBhcnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9lcnJvciIiIgoKCl91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNvbnRlbnRUb29TaG9ydEVycm9yIiwgInVybGxpYiIsICJ1cmxsaWIuZXJyb3IiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIuZXJyb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfZXJyb3IiLCAibW92ZXMudXJsbGliLmVycm9yIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JlcXVlc3QiIiIKCgpfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxvcGVuIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnN0YWxsX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYnVpbGRfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXRobmFtZTJ1cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsMnBhdGhuYW1lIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldHByb3hpZXMiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUmVxdWVzdCIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiT3BlbmVyRGlyZWN0b3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUmVkaXJlY3RIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQ29va2llUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkJhc2VIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eURpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFNIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGaWxlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ2FjaGVGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVbmtub3duSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxyZXRyaWV2ZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxjbGVhbnVwIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGYW5jeVVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwcm94eV9ieXBhc3MiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXF1ZXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JlcXVlc3QiLCAibW92ZXMudXJsbGliLnJlcXVlc3QiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3Jlc3BvbnNlIiIiCgoKX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGJhc2UiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGNsb3NlaG9vayIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mbyIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mb3VybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlc3BvbnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3Jlc3BvbnNlIiwgIm1vdmVzLnVybGxpYi5yZXNwb25zZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiIiIKCgpfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUm9ib3RGaWxlUGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIsICJtb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgICIiIkNyZWF0ZSBhIHNpeC5tb3Zlcy51cmxsaWIgbmFtZXNwYWNlIHRoYXQgcmVzZW1ibGVzIHRoZSBQeXRob24gMyBuYW1lc3BhY2UiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCiAgICBwYXJzZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3BhcnNlIikKICAgIGVycm9yID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfZXJyb3IiKQogICAgcmVxdWVzdCA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JlcXVlc3QiKQogICAgcmVzcG9uc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXNwb25zZSIpCiAgICByb2JvdHBhcnNlciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gWydwYXJzZScsICdlcnJvcicsICdyZXF1ZXN0JywgJ3Jlc3BvbnNlJywgJ3JvYm90cGFyc2VyJ10KCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYihfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliIikKCgpkZWYgYWRkX21vdmUobW92ZSk6CiAgICAiIiJBZGQgYW4gaXRlbSB0byBzaXgubW92ZXMuIiIiCiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBtb3ZlLm5hbWUsIG1vdmUpCgoKZGVmIHJlbW92ZV9tb3ZlKG5hbWUpOgogICAgIiIiUmVtb3ZlIGl0ZW0gZnJvbSBzaXgubW92ZXMuIiIiCiAgICB0cnk6CiAgICAgICAgZGVsYXR0cihfTW92ZWRJdGVtcywgbmFtZSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBtb3Zlcy5fX2RpY3RfX1tuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIm5vIHN1Y2ggbW92ZSwgJXIiICUgKG5hbWUsKSkKCgppZiBQWTM6CiAgICBfbWV0aF9mdW5jID0gIl9fZnVuY19fIgogICAgX21ldGhfc2VsZiA9ICJfX3NlbGZfXyIKCiAgICBfZnVuY19jbG9zdXJlID0gIl9fY2xvc3VyZV9fIgogICAgX2Z1bmNfY29kZSA9ICJfX2NvZGVfXyIKICAgIF9mdW5jX2RlZmF1bHRzID0gIl9fZGVmYXVsdHNfXyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiX19nbG9iYWxzX18iCmVsc2U6CiAgICBfbWV0aF9mdW5jID0gImltX2Z1bmMiCiAgICBfbWV0aF9zZWxmID0gImltX3NlbGYiCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJmdW5jX2Nsb3N1cmUiCiAgICBfZnVuY19jb2RlID0gImZ1bmNfY29kZSIKICAgIF9mdW5jX2RlZmF1bHRzID0gImZ1bmNfZGVmYXVsdHMiCiAgICBfZnVuY19nbG9iYWxzID0gImZ1bmNfZ2xvYmFscyIKCgp0cnk6CiAgICBhZHZhbmNlX2l0ZXJhdG9yID0gbmV4dApleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGFkdmFuY2VfaXRlcmF0b3IoaXQpOgogICAgICAgIHJldHVybiBpdC5uZXh0KCkKbmV4dCA9IGFkdmFuY2VfaXRlcmF0b3IKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gYW55KCJfX2NhbGxfXyIgaW4ga2xhc3MuX19kaWN0X18gZm9yIGtsYXNzIGluIHR5cGUob2JqKS5fX21yb19fKQoKCmlmIFBZMzoKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZAoKICAgIGNyZWF0ZV9ib3VuZF9tZXRob2QgPSB0eXBlcy5NZXRob2RUeXBlCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiBmdW5jCgogICAgSXRlcmF0b3IgPSBvYmplY3QKZWxzZToKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZC5pbV9mdW5jCgogICAgZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoZnVuYywgb2JqKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBvYmosIG9iai5fX2NsYXNzX18pCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIE5vbmUsIGNscykKCiAgICBjbGFzcyBJdGVyYXRvcihvYmplY3QpOgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX19uZXh0X18oc2VsZikKCiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCl9hZGRfZG9jKGdldF91bmJvdW5kX2Z1bmN0aW9uLAogICAgICAgICAiIiJHZXQgdGhlIGZ1bmN0aW9uIG91dCBvZiBhIHBvc3NpYmx5IHVuYm91bmQgZnVuY3Rpb24iIiIpCgoKZ2V0X21ldGhvZF9mdW5jdGlvbiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfZnVuYykKZ2V0X21ldGhvZF9zZWxmID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9zZWxmKQpnZXRfZnVuY3Rpb25fY2xvc3VyZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY2xvc3VyZSkKZ2V0X2Z1bmN0aW9uX2NvZGUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2NvZGUpCmdldF9mdW5jdGlvbl9kZWZhdWx0cyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZGVmYXVsdHMpCmdldF9mdW5jdGlvbl9nbG9iYWxzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19nbG9iYWxzKQoKCmlmIFBZMzoKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmtleXMoKiprdykpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC52YWx1ZXMoKiprdykpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLml0ZW1zKCoqa3cpKQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5saXN0cygqKmt3KSkKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigia2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoIml0ZW1zIikKZWxzZToKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVya2V5cygqKmt3KQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJ2YWx1ZXMoKiprdykKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJpdGVtcygqKmt3KQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmxpc3RzKCoqa3cpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3dmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdpdGVtcyIpCgpfYWRkX2RvYyhpdGVya2V5cywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVydmFsdWVzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcml0ZW1zLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcmxpc3RzLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIFt2YWx1ZXNdKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKCgppZiBQWTM6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoImxhdGluLTEiKQoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiBzCiAgICB1bmljaHIgPSBjaHIKICAgIGltcG9ydCBzdHJ1Y3QKICAgIGludDJieXRlID0gc3RydWN0LlN0cnVjdCgiPkIiKS5wYWNrCiAgICBkZWwgc3RydWN0CiAgICBieXRlMmludCA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCkKICAgIGluZGV4Ynl0ZXMgPSBvcGVyYXRvci5nZXRpdGVtCiAgICBpdGVyYnl0ZXMgPSBpdGVyCiAgICBpbXBvcnQgaW8KICAgIFN0cmluZ0lPID0gaW8uU3RyaW5nSU8KICAgIEJ5dGVzSU8gPSBpby5CeXRlc0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRDb3VudEVxdWFsIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8PSAxOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCiAgICBlbHNlOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXgiCmVsc2U6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcwogICAgIyBXb3JrYXJvdW5kIGZvciBzdGFuZGFsb25lIGJhY2tzbGFzaAoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiB1bmljb2RlKHMucmVwbGFjZShyJ1xcJywgcidcXFxcJyksICJ1bmljb2RlX2VzY2FwZSIpCiAgICB1bmljaHIgPSB1bmljaHIKICAgIGludDJieXRlID0gY2hyCgogICAgZGVmIGJ5dGUyaW50KGJzKToKICAgICAgICByZXR1cm4gb3JkKGJzWzBdKQoKICAgIGRlZiBpbmRleGJ5dGVzKGJ1ZiwgaSk6CiAgICAgICAgcmV0dXJuIG9yZChidWZbaV0pCiAgICBpdGVyYnl0ZXMgPSBmdW5jdG9vbHMucGFydGlhbChpdGVydG9vbHMuaW1hcCwgb3JkKQogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBTdHJpbmdJTyA9IEJ5dGVzSU8gPSBTdHJpbmdJTy5TdHJpbmdJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0SXRlbXNFcXVhbCIKICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKX2FkZF9kb2MoYiwgIiIiQnl0ZSBsaXRlcmFsIiIiKQpfYWRkX2RvYyh1LCAiIiJUZXh0IGxpdGVyYWwiIiIpCgoKZGVmIGFzc2VydENvdW50RXF1YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRDb3VudEVxdWFsKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmFpc2VzUmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmlmIFBZMzoKICAgIGV4ZWNfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgImV4ZWMiKQoKICAgIGRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgdmFsdWUgPSB0cCgpCiAgICAgICAgaWYgdmFsdWUuX190cmFjZWJhY2tfXyBpcyBub3QgdGI6CiAgICAgICAgICAgIHJhaXNlIHZhbHVlLndpdGhfdHJhY2ViYWNrKHRiKQogICAgICAgIHJhaXNlIHZhbHVlCgplbHNlOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oIiIiZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGIKIiIiKQoKCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIGlmIGZyb21fdmFsdWUgaXMgTm9uZToKICAgICAgICByYWlzZSB2YWx1ZQogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsc2U6CiAgICBkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICAgICAgcmFpc2UgdmFsdWUKCgpwcmludF8gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAicHJpbnQiLCBOb25lKQppZiBwcmludF8gaXMgTm9uZToKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJUaGUgbmV3LXN0eWxlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMi40IGFuZCAyLjUuIiIiCiAgICAgICAgZnAgPSBrd2FyZ3MucG9wKCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBpZiBmcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmIHdyaXRlKGRhdGEpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgIyBJZiB0aGUgZmlsZSBoYXMgYW4gZW5jb2RpbmcsIGVuY29kZSB1bmljb2RlIHdpdGggaXQuCiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKGZwLCBmaWxlKSBhbmQKICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGZwLmVuY29kaW5nIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGVycm9ycyA9IGdldGF0dHIoZnAsICJlcnJvcnMiLCBOb25lKQogICAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gInN0cmljdCIKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShmcC5lbmNvZGluZywgZXJyb3JzKQogICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgIHdhbnRfdW5pY29kZSA9IEZhbHNlCiAgICAgICAgc2VwID0ga3dhcmdzLnBvcCgic2VwIiwgTm9uZSkKICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VwLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXAsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGVuZCA9IGt3YXJncy5wb3AoImVuZCIsIE5vbmUpCiAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVuZCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZW5kLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJlbmQgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcmludCgpIikKICAgICAgICBpZiBub3Qgd2FudF91bmljb2RlOgogICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgd2FudF91bmljb2RlOgogICAgICAgICAgICBuZXdsaW5lID0gdW5pY29kZSgiXG4iKQogICAgICAgICAgICBzcGFjZSA9IHVuaWNvZGUoIiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ld2xpbmUgPSAiXG4iCiAgICAgICAgICAgIHNwYWNlID0gIiAiCiAgICAgICAgaWYgc2VwIGlzIE5vbmU6CiAgICAgICAgICAgIHNlcCA9IHNwYWNlCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZCA9IG5ld2xpbmUKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgaToKICAgICAgICAgICAgICAgIHdyaXRlKHNlcCkKICAgICAgICAgICAgd3JpdGUoYXJnKQogICAgICAgIHdyaXRlKGVuZCkKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgMyk6CiAgICBfcHJpbnQgPSBwcmludF8KCiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZnAgPSBrd2FyZ3MuZ2V0KCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBmbHVzaCA9IGt3YXJncy5wb3AoImZsdXNoIiwgRmFsc2UpCiAgICAgICAgX3ByaW50KCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBmbHVzaCBhbmQgZnAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZwLmZsdXNoKCkKCl9hZGRfZG9jKHJlcmFpc2UsICIiIlJlcmFpc2UgYW4gZXhjZXB0aW9uLiIiIikKCmlmIHN5cy52ZXJzaW9uX2luZm9bMDoyXSA8ICgzLCA0KToKICAgIGRlZiB3cmFwcyh3cmFwcGVkLCBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgIGRlZiB3cmFwcGVyKGYpOgogICAgICAgICAgICBmID0gZnVuY3Rvb2xzLndyYXBzKHdyYXBwZWQsIGFzc2lnbmVkLCB1cGRhdGVkKShmKQogICAgICAgICAgICBmLl9fd3JhcHBlZF9fID0gd3JhcHBlZAogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIHJldHVybiB3cmFwcGVyCmVsc2U6CiAgICB3cmFwcyA9IGZ1bmN0b29scy53cmFwcwoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgoKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQoKCmRlZiBhZGRfbWV0YWNsYXNzKG1ldGFjbGFzcyk6CiAgICAiIiJDbGFzcyBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgIGRlZiB3cmFwcGVyKGNscyk6CiAgICAgICAgb3JpZ192YXJzID0gY2xzLl9fZGljdF9fLmNvcHkoKQogICAgICAgIHNsb3RzID0gb3JpZ192YXJzLmdldCgnX19zbG90c19fJykKICAgICAgICBpZiBzbG90cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgc3RyKToKICAgICAgICAgICAgICAgIHNsb3RzID0gW3Nsb3RzXQogICAgICAgICAgICBmb3Igc2xvdHNfdmFyIGluIHNsb3RzOgogICAgICAgICAgICAgICAgb3JpZ192YXJzLnBvcChzbG90c192YXIpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX19kaWN0X18nLCBOb25lKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fd2Vha3JlZl9fJywgTm9uZSkKICAgICAgICByZXR1cm4gbWV0YWNsYXNzKGNscy5fX25hbWVfXywgY2xzLl9fYmFzZXNfXywgb3JpZ192YXJzKQogICAgcmV0dXJuIHdyYXBwZXIKCgpkZWYgcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlKGtsYXNzKToKICAgICIiIgogICAgQSBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIF9fdW5pY29kZV9fIGFuZCBfX3N0cl9fIG1ldGhvZHMgdW5kZXIgUHl0aG9uIDIuCiAgICBVbmRlciBQeXRob24gMyBpdCBkb2VzIG5vdGhpbmcuCgogICAgVG8gc3VwcG9ydCBQeXRob24gMiBhbmQgMyB3aXRoIGEgc2luZ2xlIGNvZGUgYmFzZSwgZGVmaW5lIGEgX19zdHJfXyBtZXRob2QKICAgIHJldHVybmluZyB0ZXh0IGFuZCBhcHBseSB0aGlzIGRlY29yYXRvciB0byB0aGUgY2xhc3MuCiAgICAiIiIKICAgIGlmIFBZMjoKICAgICAgICBpZiAnX19zdHJfXycgbm90IGluIGtsYXNzLl9fZGljdF9fOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJAcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlIGNhbm5vdCBiZSBhcHBsaWVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYmVjYXVzZSBpdCBkb2Vzbid0IGRlZmluZSBfX3N0cl9fKCkuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18pCiAgICAgICAga2xhc3MuX191bmljb2RlX18gPSBrbGFzcy5fX3N0cl9fCiAgICAgICAga2xhc3MuX19zdHJfXyA9IGxhbWJkYSBzZWxmOiBzZWxmLl9fdW5pY29kZV9fKCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXR1cm4ga2xhc3MKCgojIENvbXBsZXRlIHRoZSBtb3ZlcyBpbXBsZW1lbnRhdGlvbi4KIyBUaGlzIGNvZGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZHVsZSB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZGluZy4KIyBUdXJuIHRoaXMgbW9kdWxlIGludG8gYSBwYWNrYWdlLgpfX3BhdGhfXyA9IFtdICAjIHJlcXVpcmVkIGZvciBQRVAgMzAyIGFuZCBQRVAgNDUxCl9fcGFja2FnZV9fID0gX19uYW1lX18gICMgc2VlIFBFUCAzNjYgQFJlc2VydmVkQXNzaWdubWVudAppZiBnbG9iYWxzKCkuZ2V0KCJfX3NwZWNfXyIpIGlzIG5vdCBOb25lOgogICAgX19zcGVjX18uc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbXSAgIyBQRVAgNDUxIEBVbmRlZmluZWRWYXJpYWJsZQojIFJlbW92ZSBvdGhlciBzaXggbWV0YSBwYXRoIGltcG9ydGVycywgc2luY2UgdGhleSBjYXVzZSBwcm9ibGVtcy4gVGhpcyBjYW4KIyBoYXBwZW4gaWYgc2l4IGlzIHJlbW92ZWQgZnJvbSBzeXMubW9kdWxlcyBhbmQgdGhlbiByZWxvYWRlZC4gKFNldHVwdG9vbHMgZG9lcwojIHRoaXMgZm9yIHNvbWUgcmVhc29uLikKaWYgc3lzLm1ldGFfcGF0aDoKICAgIGZvciBpLCBpbXBvcnRlciBpbiBlbnVtZXJhdGUoc3lzLm1ldGFfcGF0aCk6CiAgICAgICAgIyBIZXJlJ3Mgc29tZSByZWFsIG5hc3RpbmVzczogQW5vdGhlciAiaW5zdGFuY2UiIG9mIHRoZSBzaXggbW9kdWxlIG1pZ2h0CiAgICAgICAgIyBiZSBmbG9hdGluZyBhcm91bmQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QgdXNlIGlzaW5zdGFuY2UoKSB0byBjaGVjayBmb3IKICAgICAgICAjIHRoZSBzaXggbWV0YSBwYXRoIGltcG9ydGVyLCBzaW5jZSB0aGUgb3RoZXIgc2l4IGluc3RhbmNlIHdpbGwgaGF2ZQogICAgICAgICMgaW5zZXJ0ZWQgYW4gaW1wb3J0ZXIgd2l0aCBkaWZmZXJlbnQgY2xhc3MuCiAgICAgICAgaWYgKHR5cGUoaW1wb3J0ZXIpLl9fbmFtZV9fID09ICJfU2l4TWV0YVBhdGhJbXBvcnRlciIgYW5kCiAgICAgICAgICAgICAgICBpbXBvcnRlci5uYW1lID09IF9fbmFtZV9fKToKICAgICAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbaV0KICAgICAgICAgICAgYnJlYWsKICAgIGRlbCBpLCBpbXBvcnRlcgojIEZpbmFsbHksIGFkZCB0aGUgaW1wb3J0ZXIgdG8gdGhlIG1ldGEgcGF0aCBpbXBvcnQgaG9vay4Kc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2ltcG9ydGVyKQpQSwMEFAAAAAAAAAAhAHXY8Xm3CQAAtwkAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9leHRlcm4vX19pbml0X18ucHlpbXBvcnQgc3lzCgoKY2xhc3MgVmVuZG9ySW1wb3J0ZXI6CiAgICAiIiIKICAgIEEgUEVQIDMwMiBtZXRhIHBhdGggaW1wb3J0ZXIgZm9yIGZpbmRpbmcgb3B0aW9uYWxseS12ZW5kb3JlZAogICAgb3Igb3RoZXJ3aXNlIG5hdHVyYWxseS1pbnN0YWxsZWQgcGFja2FnZXMgZnJvbSByb290X25hbWUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdF9uYW1lLCB2ZW5kb3JlZF9uYW1lcz0oKSwgdmVuZG9yX3BrZz1Ob25lKToKICAgICAgICBzZWxmLnJvb3RfbmFtZSA9IHJvb3RfbmFtZQogICAgICAgIHNlbGYudmVuZG9yZWRfbmFtZXMgPSBzZXQodmVuZG9yZWRfbmFtZXMpCiAgICAgICAgc2VsZi52ZW5kb3JfcGtnID0gdmVuZG9yX3BrZyBvciByb290X25hbWUucmVwbGFjZSgnZXh0ZXJuJywgJ192ZW5kb3InKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNlYXJjaF9wYXRoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNlYXJjaCBmaXJzdCB0aGUgdmVuZG9yIHBhY2thZ2UgdGhlbiBhcyBhIG5hdHVyYWwgcGFja2FnZS4KICAgICAgICAiIiIKICAgICAgICB5aWVsZCBzZWxmLnZlbmRvcl9wa2cgKyAnLicKICAgICAgICB5aWVsZCAnJwoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gc2VsZiB3aGVuIGZ1bGxuYW1lIHN0YXJ0cyB3aXRoIHJvb3RfbmFtZSBhbmQgdGhlCiAgICAgICAgdGFyZ2V0IG1vZHVsZSBpcyBvbmUgdmVuZG9yZWQgdGhyb3VnaCB0aGlzIGltcG9ydGVyLgogICAgICAgICIiIgogICAgICAgIHJvb3QsIGJhc2UsIHRhcmdldCA9IGZ1bGxuYW1lLnBhcnRpdGlvbihzZWxmLnJvb3RfbmFtZSArICcuJykKICAgICAgICBpZiByb290OgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3QgYW55KG1hcCh0YXJnZXQuc3RhcnRzd2l0aCwgc2VsZi52ZW5kb3JlZF9uYW1lcykpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZSBvdmVyIHRoZSBzZWFyY2ggcGF0aCB0byBsb2NhdGUgYW5kIGxvYWQgZnVsbG5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgcm9vdCwgYmFzZSwgdGFyZ2V0ID0gZnVsbG5hbWUucGFydGl0aW9uKHNlbGYucm9vdF9uYW1lICsgJy4nKQogICAgICAgIGZvciBwcmVmaXggaW4gc2VsZi5zZWFyY2hfcGF0aDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZXh0YW50ID0gcHJlZml4ICsgdGFyZ2V0CiAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKGV4dGFudCkKICAgICAgICAgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW2V4dGFudF0KICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgICAgICAgICAgIyBteXN0ZXJpb3VzIGhhY2s6CiAgICAgICAgICAgICAgICAjIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBleHRhbnQgcGFja2FnZS9tb2R1bGUKICAgICAgICAgICAgICAgICMgb24gbGF0ZXIgUHl0aG9uIHZlcnNpb25zIHRvIGNhdXNlIHJlbGF0aXZlIGltcG9ydHMKICAgICAgICAgICAgICAgICMgaW4gdGhlIHZlbmRvciBwYWNrYWdlIHRvIHJlc29sdmUgdGhlIHNhbWUgbW9kdWxlcwogICAgICAgICAgICAgICAgIyBhcyB0aG9zZSBnb2luZyB0aHJvdWdoIHRoaXMgaW1wb3J0ZXIuCiAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID4gKDMsIDMpOgogICAgICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tleHRhbnRdCiAgICAgICAgICAgICAgICByZXR1cm4gbW9kCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICJUaGUgJ3t0YXJnZXR9JyBwYWNrYWdlIGlzIHJlcXVpcmVkOyAiCiAgICAgICAgICAgICAgICAibm9ybWFsbHkgdGhpcyBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIHNvIGlmIHlvdSBnZXQgIgogICAgICAgICAgICAgICAgInRoaXMgd2FybmluZywgY29uc3VsdCB0aGUgcGFja2FnZXIgb2YgeW91ciAiCiAgICAgICAgICAgICAgICAiZGlzdHJpYnV0aW9uLiIuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgICkKCiAgICBkZWYgaW5zdGFsbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIHRoaXMgaW1wb3J0ZXIgaW50byBzeXMubWV0YV9wYXRoIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZiBub3QgaW4gc3lzLm1ldGFfcGF0aDoKICAgICAgICAgICAgc3lzLm1ldGFfcGF0aC5hcHBlbmQoc2VsZikKCgpuYW1lcyA9ICdwYWNrYWdpbmcnLCAncHlwYXJzaW5nJywgJ3NpeCcsICdhcHBkaXJzJwpWZW5kb3JJbXBvcnRlcihfX25hbWVfXywgbmFtZXMpLmluc3RhbGwoKQpQSwMEFAAAAAAAAAAhAMdHfTJYAgAAWAIAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9weTMxY29tcGF0LnB5aW1wb3J0IG9zCmltcG9ydCBlcnJubwppbXBvcnQgc3lzCgoKZGVmIF9tYWtlZGlyc18zMShwYXRoLCBleGlzdF9vaz1GYWxzZSk6CiAgICB0cnk6CiAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICBpZiBub3QgZXhpc3Rfb2sgb3IgZXhjLmVycm5vICE9IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgcmFpc2UKCgojIHJlbHkgb24gY29tcGF0aWJpbGl0eSBiZWhhdmlvciB1bnRpbCBtb2RlIGNvbnNpZGVyYXRpb25zCiMgIGFuZCBleGlzdHNfb2sgY29uc2lkZXJhdGlvbnMgYXJlIGRpc2VudGFuZ2xlZC4KIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9wdWxsLzEwODMjaXNzdWVjb21tZW50LTMxNTE2ODY2MwpuZWVkc19tYWtlZGlycyA9ICgKICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMiwgNSkgb3IKICAgICgzLCAzKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMsIDYpIG9yCiAgICAoMywgNCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCA0LCAxKQopCm1ha2VkaXJzID0gX21ha2VkaXJzXzMxIGlmIG5lZWRzX21ha2VkaXJzIGVsc2Ugb3MubWFrZWRpcnMKUEsDBBQAAAAAAAAAIQB/1LpcjgUAAI4FAABQAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3QuLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3NldHVwdG9vbHMuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vcmVhZHRoZWRvY3Mub3JnL3Byb2plY3RzL3NldHVwdG9vbHMvYmFkZ2UvP3ZlcnNpb249bGF0ZXN0CiAgICA6dGFyZ2V0OiBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8KCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9TGludXglMjBidWlsZCUyMCU0MCUyMFRyYXZpcyUyMENJCiAgIDp0YXJnZXQ6IGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9weXBhL3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9qYXJhY28vc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xhYmVsPVdpbmRvd3MlMjBidWlsZCUyMCU0MCUyMEFwcHZleW9yCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvamFyYWNvL3NldHVwdG9vbHMvYnJhbmNoL21hc3RlcgoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvcHl2ZXJzaW9ucy9zZXR1cHRvb2xzLnN2ZwoKU2VlIHRoZSBgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucwo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9pbnN0YWxsaW5nLz5gXyBpbiB0aGUgUHl0aG9uIFBhY2thZ2luZwpVc2VyJ3MgR3VpZGUgZm9yIGluc3RydWN0aW9ucyBvbiBpbnN0YWxsaW5nLCB1cGdyYWRpbmcsIGFuZCB1bmluc3RhbGxpbmcKU2V0dXB0b29scy4KClRoZSBwcm9qZWN0IGlzIGBtYWludGFpbmVkIGF0IEdpdEh1YiA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scz5gXy4KClF1ZXN0aW9ucyBhbmQgY29tbWVudHMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZSBgZGlzdHV0aWxzLXNpZwptYWlsaW5nIGxpc3QgPGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL2Rpc3R1dGlscy1zaWcvPmBfLgpCdWcgcmVwb3J0cyBhbmQgZXNwZWNpYWxseSB0ZXN0ZWQgcGF0Y2hlcyBtYXkgYmUKc3VibWl0dGVkIGRpcmVjdGx5IHRvIHRoZSBgYnVnIHRyYWNrZXIKPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzPmBfLgoKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSBzZXR1cHRvb2xzIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLApjaGF0IHJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlCmBQeVBBIENvZGUgb2YgQ29uZHVjdCA8aHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0Lz5gXy4KCgpQSwMEFAAAAAAAAAAhAFDXqwc2BAAANgQAAEwAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0xJQ0VOU0UudHh0Q29weXJpZ2h0IChDKSAyMDE2IEphc29uIFIgQ29vbWJzIDxqYXJhY29AamFyYWNvLmNvbT4KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuClBLAwQUAAAAAAAAACEA8QyQ/+4KAADuCgAASQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTUVUQURBVEFNZXRhZGF0YS1WZXJzaW9uOiAyLjAKTmFtZTogc2V0dXB0b29scwpWZXJzaW9uOiAzOC4yLjQKU3VtbWFyeTogRWFzaWx5IGRvd25sb2FkLCBidWlsZCwgaW5zdGFsbCwgdXBncmFkZSwgYW5kIHVuaW5zdGFsbCBQeXRob24gcGFja2FnZXMKSG9tZS1wYWdlOiBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzCkF1dGhvcjogUHl0aG9uIFBhY2thZ2luZyBBdXRob3JpdHkKQXV0aG9yLWVtYWlsOiBkaXN0dXRpbHMtc2lnQHB5dGhvbi5vcmcKTGljZW5zZTogVU5LTk9XTgpEZXNjcmlwdGlvbi1Db250ZW50LVR5cGU6IHRleHQveC1yc3Q7IGNoYXJzZXQ9VVRGLTgKS2V5d29yZHM6IENQQU4gUHlQSSBkaXN0dXRpbHMgZWdncyBwYWNrYWdlIG1hbmFnZW1lbnQKUGxhdGZvcm06IFVOS05PV04KQ2xhc3NpZmllcjogRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZQpDbGFzc2lmaWVyOiBJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzCkNsYXNzaWZpZXI6IExpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IE1JVCBMaWNlbnNlCkNsYXNzaWZpZXI6IE9wZXJhdGluZyBTeXN0ZW0gOjogT1MgSW5kZXBlbmRlbnQKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4zCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNQpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy42CkNsYXNzaWZpZXI6IFRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcyA6OiBQeXRob24gTW9kdWxlcwpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTeXN0ZW0gOjogQXJjaGl2aW5nIDo6IFBhY2thZ2luZwpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTeXN0ZW0gOjogU3lzdGVtcyBBZG1pbmlzdHJhdGlvbgpDbGFzc2lmaWVyOiBUb3BpYyA6OiBVdGlsaXRpZXMKUmVxdWlyZXMtUHl0aG9uOiA+PTIuNywhPTMuMC4qLCE9My4xLiosIT0zLjIuKgpQcm92aWRlcy1FeHRyYTogY2VydHMKUmVxdWlyZXMtRGlzdDogY2VydGlmaSAoPT0yMDE2LjkuMjYpOyBleHRyYSA9PSAnY2VydHMnClByb3ZpZGVzLUV4dHJhOiBzc2wKUmVxdWlyZXMtRGlzdDogd2luY2VydHN0b3JlICg9PTAuMik7IHN5c19wbGF0Zm9ybT09J3dpbjMyJyBhbmQgZXh0cmEgPT0gJ3NzbCcKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3Yvc2V0dXB0b29scy5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9weXBpLm9yZy9wcm9qZWN0L3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9yZWFkdGhlZG9jcy5vcmcvcHJvamVjdHMvc2V0dXB0b29scy9iYWRnZS8/dmVyc2lvbj1sYXRlc3QKICAgIDp0YXJnZXQ6IGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pbwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3RyYXZpcy9weXBhL3NldHVwdG9vbHMvbWFzdGVyLnN2Zz9sYWJlbD1MaW51eCUyMGJ1aWxkJTIwJTQwJTIwVHJhdmlzJTIwQ0kKICAgOnRhcmdldDogaHR0cHM6Ly90cmF2aXMtY2kub3JnL3B5cGEvc2V0dXB0b29scwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL2FwcHZleW9yL2NpL2phcmFjby9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9V2luZG93cyUyMGJ1aWxkJTIwJTQwJTIwQXBwdmV5b3IKICAgOnRhcmdldDogaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9qYXJhY28vc2V0dXB0b29scy9icmFuY2gvbWFzdGVyCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS9weXZlcnNpb25zL3NldHVwdG9vbHMuc3ZnCgpTZWUgdGhlIGBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zCjxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2luc3RhbGxpbmcvPmBfIGluIHRoZSBQeXRob24gUGFja2FnaW5nClVzZXIncyBHdWlkZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGluc3RhbGxpbmcsIHVwZ3JhZGluZywgYW5kIHVuaW5zdGFsbGluZwpTZXR1cHRvb2xzLgoKVGhlIHByb2plY3QgaXMgYG1haW50YWluZWQgYXQgR2l0SHViIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzPmBfLgoKUXVlc3Rpb25zIGFuZCBjb21tZW50cyBzaG91bGQgYmUgZGlyZWN0ZWQgdG8gdGhlIGBkaXN0dXRpbHMtc2lnCm1haWxpbmcgbGlzdCA8aHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvZGlzdHV0aWxzLXNpZy8+YF8uCkJ1ZyByZXBvcnRzIGFuZCBlc3BlY2lhbGx5IHRlc3RlZCBwYXRjaGVzIG1heSBiZQpzdWJtaXR0ZWQgZGlyZWN0bHkgdG8gdGhlIGBidWcgdHJhY2tlcgo8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXM+YF8uCgoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHNldHVwdG9vbHMgcHJvamVjdCdzIGNvZGViYXNlcywgaXNzdWUgdHJhY2tlcnMsCmNoYXQgcm9vbXMsIGFuZCBtYWlsaW5nIGxpc3RzIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUKYFB5UEEgQ29kZSBvZiBDb25kdWN0IDxodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvPmBfLgoKClBLAwQUAAAAAAAAACEAXKwmp4MeAACDHgAARwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vUkVDT1JEZWFzeV9pbnN0YWxsLnB5LHNoYTI1Nj1NREM5dnQ1QXhEc1hYNXFjS2xCejJUblc2VHB1dl9Bb2JuZmhDSjlYM1BNLDEyNg0KcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSxzaGEyNTY9NFFZMTVQOGNTX09BemJYSXl0bWJ2R2tudlg3dmRpaW9tRzRZaGJRUlpDSSwxMDU5OTENCnBrZ19yZXNvdXJjZXMvcHkzMWNvbXBhdC5weSxzaGEyNTY9LXlzVnFveExldEFuTDk0dU0wa0hrb21LUVRDMUpaTE4yWlVqcVVoTWVLRSw2MDANCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvYXBwZGlycy5weSxzaGEyNTY9dGdHYUwwbTRKbzJWZXVHZm9PT2lmTHY3YTdvVUVKdTJuMXZSa3FvUHctMCwyMjM3NA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3B5cGFyc2luZy5weSxzaGEyNTY9UGlmZUxZMy1XaEljQlZ6THR2MFU0VF9wd0R0UHJ1QmhCQ2tnNXZMcWEyOCwyMjk4NjcNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9zaXgucHksc2hhMjU2PUE2aGRKWlZqSTN0X2dlZWJaOUJ6VXZ3UnJJWG8wbGZ3elFsTTJMY0t5YXMsMzAwOTgNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5LHNoYTI1Nj16a2NDUFROXzZUY0xXME5ybGcwMTc2LVIxUVFfV1ZQVG04c3oxUjQtSGpNLDcyMA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSxzaGEyNTY9X3ZOYWM1VHJ6d3NyemJPRkliRi01Y0hxY19ZMmFQVDJEN3pySVIwNkJPbyw1MTMNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSxzaGEyNTY9VmlfQTByQVFlSGJVLWE5WDB0dDF5UW05UnFrZ1FiRFN4elJ3OFdsVTlrQSw4NjANCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHksc2hhMjU2PVJJbUVDSjRjX3dUbGFUWVl3WllMSEVpZWJETWFBSm1LMW9QQVJodzFUNW8sMTQxNg0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5LHNoYTI1Nj11RWNCQnRHdnpxbHRnbkFycWI5YzRScmNJblhlekRMb3MxNHpiQkhoV0pvLDgyNDgNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5LHNoYTI1Nj1TaWtMMlV5bmJzVDBxdFk5bHRxbmduZGhhX3NmbzB3NlhHRmhBaG9Tb2FRLDQzNTUNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSxzaGEyNTY9U0FNUmVyek8zZksySWtGWkNhWmt1d1phTF9FR3FITk96NHBuaTR2aG5OMCwyODAyNQ0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSxzaGEyNTY9M202V3ZQbTZOTnhFOHJrVEdtbjByNzVCX0daU0dnN2lrYWZ4SHNCTjFXQSw0MjENCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSxzaGEyNTY9T3dHbnhZZnIyZ2hOell4NTlxV0lCa3JLM1NuQjZuLVpmZDFYYUxwbm5NMCwxMTU1Ng0KcGtnX3Jlc291cmNlcy9leHRlcm4vX19pbml0X18ucHksc2hhMjU2PUpVdGxISHZseEhTTnVCNHBXcU5qY3g3bjZrRy1md1hnN3FtSjJ6TkpsSVksMjQ4Nw0Kc2V0dXB0b29scy9fX2luaXRfXy5weSxzaGEyNTY9V1dJZENiRkpuWjlmWm9hV0ROX3gxdkRBX1JrbS1TYzE1aUt2UHRJWUtGcyw1NzAwDQpzZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weSxzaGEyNTY9a3c4SWJfbEtqQ2NuUEtOYlM3aDhIenRSVkswZDVSYWNVM3JfS1JkVm5tTSw2NTkyDQpzZXR1cHRvb2xzL2J1aWxkX21ldGEucHksc2hhMjU2PUZsbGFLVHIxdlNKeWlVZVJqVkpFWm1lRWFSemhZdWVObGltdGN3YUpiYTgsNTY3MQ0Kc2V0dXB0b29scy9jbGktMzIuZXhlLHNoYTI1Nj1kZkV1b3ZNTm5BMkhMYTNqUmZNUFZpNXRrNFI3YWxDYnBUdnV4dEN5dzBZLDY1NTM2DQpzZXR1cHRvb2xzL2NsaS02NC5leGUsc2hhMjU2PUtMQUJ1NXB5cm5va0pDdjZza2pYWjZHc1hleVlIR2NxT1VUM29ISTNYcG8sNzQ3NTINCnNldHVwdG9vbHMvY2xpLmV4ZSxzaGEyNTY9ZGZFdW92TU5uQTJITGEzalJmTVBWaTV0azRSN2FsQ2JwVHZ1eHRDeXcwWSw2NTUzNg0Kc2V0dXB0b29scy9jb25maWcucHksc2hhMjU2PVpUQ2dBQzE4bTR4WHh1ZmxsZkd4aS1YSHZGZzZnal9qR3Bpc1JqcDBLQ3csMTYzMDUNCnNldHVwdG9vbHMvZGVwX3V0aWwucHksc2hhMjU2PWZnaXh2QzFSN3NIM3IxM2t0eWY3TjBGQUxvcUVYTDFjQmFybU5wU0VvV2csOTM1DQpzZXR1cHRvb2xzL2RlcGVuZHMucHksc2hhMjU2PWhDOFFJRGNNM1ZEcFJYdlJWQTZPZkw5QWFRZnh2aHhIY05fdzZzQXlOcTgsNTgzNw0Kc2V0dXB0b29scy9kaXN0LnB5LHNoYTI1Nj1seDVFcnJuN25hbF9fd3VILTlZSXBHRkZaR05ZbnNoY0VNRFp0SEJQcHJrLDQwMzM2DQpzZXR1cHRvb2xzL2V4dGVuc2lvbi5weSxzaGEyNTY9dWM2bkhJLU14d21OQ05QYlVpQm55YlN5cWhwSnFqYmh2T1EtZW1kdnRfRSwxNzI5DQpzZXR1cHRvb2xzL2dsaWJjLnB5LHNoYTI1Nj1YNjRWdkdQTDJBYlVSS3dZUnNXSk9YWEdBWU9pRl92MnFpeGVUa0FVTHVVLDMxNDYNCnNldHVwdG9vbHMvZ2xvYi5weSxzaGEyNTY9WS1mcHY4d2RIWnp2OURQQ2FHQUNwTVNCV0o2YW1xXzFlMFJfaThfZWw0dyw1MjA3DQpzZXR1cHRvb2xzL2d1aS0zMi5leGUsc2hhMjU2PVhCcjBiSE1BNkhwejJzOXM5QnpqbC1Qd1hmYTluSDRpZTByRm40VjJrV0EsNjU1MzYNCnNldHVwdG9vbHMvZ3VpLTY0LmV4ZSxzaGEyNTY9YVlLTWhYMUlKTG40VUxIZ1dYMHNFMHlSRVV0NkIzVEVIZl9qT3c2eU55RSw3NTI2NA0Kc2V0dXB0b29scy9ndWkuZXhlLHNoYTI1Nj1YQnIwYkhNQTZIcHoyczlzOUJ6amwtUHdYZmE5bkg0aWUwckZuNFYya1dBLDY1NTM2DQpzZXR1cHRvb2xzL2xhdW5jaC5weSxzaGEyNTY9c2Q3ZWp3aEJvY0NEeF93RzlySXMwT2FaOEh0bW1GVThaQzZJUl9TMEx2Zyw3ODcNCnNldHVwdG9vbHMvbGliMnRvM19leC5weSxzaGEyNTY9dDVlMTJoYlIycGk5VjRleldEVEI0Sk0tQUlTVW5HT2ttY25ZSGVrM3hqZywyMDEzDQpzZXR1cHRvb2xzL21vbmtleS5weSxzaGEyNTY9elpHVEg3cDB4ZVhRS0xtRXdKVFBJRTRtNW03ZkplSG9Bc3h5djVNOGVfRSw1Nzg5DQpzZXR1cHRvb2xzL21zdmMucHksc2hhMjU2PUFFYldOTEowcFR1SEpTa1F1QlpFVDZ3cl9kMi15R0dQa2RIQ01kSUtXQjQsNDA4ODQNCnNldHVwdG9vbHMvbmFtZXNwYWNlcy5weSxzaGEyNTY9RjBOcmJ2OEtDVDJPck83cndhMDNvbTRONEdaS0FsbmNlLXJyLWNnRFFhOCwzMTk5DQpzZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHksc2hhMjU2PUI3ZzdOcENZa19iRWpqZXFCbTNOYnFCa2JKaGgtbW5yZXMzbDFWMmhkbHcsNDA1MDcNCnNldHVwdG9vbHMvcGVwNDI1dGFncy5weSxzaGEyNTY9TnVHTXgxZ0dpZjd4NmlZZW1oMExmZ0JyX0ZaRjVHRk9SSWJnbU1kVThKNCwxMDg4Mg0Kc2V0dXB0b29scy9weTI3Y29tcGF0LnB5LHNoYTI1Nj0zbXd4Uk1EazVRNU8xclNYT0VSYlFEWGhGcXdESmhoVWl0Zk1XX3FwVUNvLDUzNg0Kc2V0dXB0b29scy9weTMxY29tcGF0LnB5LHNoYTI1Nj1YdVUxSENzR0VfM3pHdkJSSWhZdzJpQi1JaENGSzQtUHh3X2pNaXFkTlZrLDExOTINCnNldHVwdG9vbHMvcHkzM2NvbXBhdC5weSxzaGEyNTY9VzhfSkZacjhXUWJKVF83LUpGV2pjXzZsSEd0b01LLTRwQ3JISXdrNUpOMCw5OTgNCnNldHVwdG9vbHMvcHkzNmNvbXBhdC5weSxzaGEyNTY9VlVEV3htdTVydDRRSGxHVFJ0QUZ1Nlc1anZmTDZXQmplREF6ZW9CeTBPTSwyODkxDQpzZXR1cHRvb2xzL3NhbmRib3gucHksc2hhMjU2PTlVYndmRUw1UVk0MzZvTUkxTHRGV29oaG9aLVV6d0h2R3laalVIX3Foa3csMTQyNzYNCnNldHVwdG9vbHMvc2NyaXB0IChkZXYpLnRtcGwsc2hhMjU2PWY3TVIxN2RUa3phcWtDTVNWc2V5T0NNVnJQVlNNZG1UUXNhQjhjWnpmdUksMjAxDQpzZXR1cHRvb2xzL3NjcmlwdC50bXBsLHNoYTI1Nj1XR1R0NXBpZXpPMjdjLURieDZsNVE0VDNGZjIwQTV6Nzg3Mmh2M2FBaFlZLDEzOA0Kc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5LHNoYTI1Nj1CVnQ2eUlyRE1YSm9mbEE1SjZESkljc0pVZldfWEVlVmhPemVsVFRGRFA0LDIzMDcNCnNldHVwdG9vbHMvc3NsX3N1cHBvcnQucHksc2hhMjU2PVlCREpzQ1pqU3A2MkNXanhtU2trZTlrbjlyaEhIajI1Q3VzNnpoSlJXM2MsODQ5Mg0Kc2V0dXB0b29scy91bmljb2RlX3V0aWxzLnB5LHNoYTI1Nj1OT2laXzVoRDcyQTZ3LTR3Vmo4YXdIRk0zbjUxS213MUljX3Z4MTVYRnF3LDk5Ng0Kc2V0dXB0b29scy92ZXJzaW9uLnB5LHNoYTI1Nj1vZ19jdVpRYjBRSTZ1a0taRmZaV1BscjFIZ0pCUFBuMnZPMm1fYkk5WlRFLDE0NA0Kc2V0dXB0b29scy93aGVlbC5weSxzaGEyNTY9NnFZOFR0T19ZSnMyY2o5SnRmaUdRZGx2TllVMlRYRFpOay0yS3ZlQkpiYyw3MjMzDQpzZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weSxzaGEyNTY9NUdyZnFTUDItZExHSm9aVHEyZzZkQ0treVF4eGEybjVJUWlYbEpDb1lFRSw3MTQNCnNldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weSxzaGEyNTY9Tld6SjBBMUJFZW5nWnBWZXFVeVdMTm0yYms0UDNGNGlMNVFVRXJIeTdrQSw1OTQNCnNldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weSxzaGEyNTY9S2pwRTBzel9TRElIdjNmcFpjSVFLLXNDa0p6LVNyQzZHbXVnNmI5TmtjOCwyNDI2DQpzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5LHNoYTI1Nj1kaDg4VzhwTUhVSlBIbExULVhuUHZ5eURjbU1mRWJJMmpLMUUzdzFFSEtjLDE4MDExDQpzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5LHNoYTI1Nj1CN2wwVG56Q0diLTBuTGxtNnJTMDBqV0xrb2pBU3dWbWRoVzJ3NVF6X0FrLDE1MDgNCnNldHVwdG9vbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5LHNoYTI1Nj1fNmR6M2xwQjF0WTIwMEx4S1BMTTdxZ3dUQ2NlT01nYVdGRi1qVzItcG0wLDYzNw0Kc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2NsaWIucHksc2hhMjU2PWJROWFCci01WlNPLTlmR3NHc0RMejBtbm5GdGVIVVpuZnRWTGtodkhEcTAsNDQ4NA0Kc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weSxzaGEyNTY9ZE84OWotSUMwZEFqU3R5MXNTWnh2aTBMU2RrUEdSX1pQWEZ1QUFGRFpqNCwxMzA0OQ0Kc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5LHNoYTI1Nj15V3lZYWFTOUYzbzlKYkljem4wNjRBNWcxQzVfVWlLUkR4R2FUcVlidExFLDk1OTYNCnNldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5LHNoYTI1Nj13S2JPdzJfcVV2Y0R0aTJsWm10eGJEbVliNTR5QUFpYkV4elhJdlRvei1BLDgwNDYNCnNldHVwdG9vbHMvY29tbWFuZC9kaXN0X2luZm8ucHksc2hhMjU2PTV0NmtPZnJkZ0FMVC1QM29nc3M2UEY5ay1MZXllc3VleWN1azNkVXlabkksOTYwDQpzZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5LHNoYTI1Nj1ZQUlzVWh6bXdfc2h2dm9EUDhFZXNEUzJ4YkZIN3RENE11WUU4WDN4NlljLDg3MTI1DQpzZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHksc2hhMjU2PURMUjVfWHItZ1JxeFF3SmN5VkNrVXJmVlpacmlNdVFTV29RR0ozWEw3VDgsMjQ5NDQNCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5LHNoYTI1Nj1hMEVacExfQTg2NktFZGhpY1RHYnV5RF9UWWwxc3lrZnpkcnJpLXphelQ0LDQ2ODMNCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5LHNoYTI1Nj1iTWdlSWVSaVh6UTREQUdQVjEzMjhrY2p3UWpIak9XVTRGbmdBV0xWNzhRLDIyMDMNCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weSxzaGEyNTY9MTFteGYwQ2gxMk5zdVl3UzhQSHdYQlJ2eWg2NzFRQU00Y1RSaDdlcHpHMCwzODQwDQpzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5LHNoYTI1Nj1VRDByRVo2ODYxbVRZaElkemNzcUtuVWw4UG96b2NYV2w5VkJRMVZUV25jLDI0MzkNCnNldHVwdG9vbHMvY29tbWFuZC9sYXVuY2hlciBtYW5pZmVzdC54bWwsc2hhMjU2PXhsTGJqV3JCMDF0S0MwLWhsVmtPS2tpU1Biek1tbDJlT1B0Sl91Y0NuYkUsNjI4DQpzZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weSxzaGEyNTY9U3pqWmNPeEY3emRGVVQ0N1p2Mm43QU0zSDhrb0R5c18wT3BTLW45Z0lmYyw0OTg2DQpzZXR1cHRvb2xzL2NvbW1hbmQvcmVnaXN0ZXIucHksc2hhMjU2PWJIbE1tMXFtQmJTZGFoVE9UOHc2VWhBLUVnZVFJejdwNmNELXFPYXVhaUksMjcwDQpzZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5LHNoYTI1Nj1jbzVDMUVrSTdQMEdHVDZUcXotVDJTSWoyTEJKVFpYWUVMcG1hbzZkNEtRLDIxNjQNCnNldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weSxzaGEyNTY9emE3UUNCY1FpbUtLcmlXY29DY2JoeFBqVXozMGdTQjc0enVUTDQ3eHBQNCw2NTgNCnNldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weSxzaGEyNTY9b2JEVGUyQm1XdDJQbG5GUFpaaDdlMExXdmVtRXNiQ0NPOU16aHJUWmptOCw2NzExDQpzZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5LHNoYTI1Nj1OVFdEeXgtZ2pERi10eGY0ZE81NzdzN0xPekhWb0tSME1xMzNyRnhhUnI4LDUwODUNCnNldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5LHNoYTI1Nj1NZUJBY1hVZVBHalBLcWp6NHp2VHJIYXRMdk5zamxQRmNhZ3QzWG5GWWRrLDkyMTQNCnNldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHksc2hhMjU2PWkxZ2ZJdFozblFPbjVGS1hiOHRMQzJLZDdlS0M4bFdPNGJkRTZOcUdwRTQsMTE3Mg0Kc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZF9kb2NzLnB5LHNoYTI1Nj1vWGlHcGxNX2NVS0x3RTRDV1d3OThSekN1ZkF1OHRCaE1DOTdHZWdGY21zLDczMTENCnNldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5LHNoYTI1Nj1adENMWVE4SlR0T3RtN1NZb3hla1p3LVV6WTNUUjUwU1JJVWFlcXIyUk9rLDEzMQ0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdCxzaGEyNTY9SXQzYTNHUmpUNTcwMW1xaHJwTWNMeVdfWVMyRG9rdi1YOHpXb1RhTVJlMCwxNDIyDQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTElDRU5TRS50eHQsc2hhMjU2PXd5bzZ3NVd2WXlIdjBvdm5QUWFnRHcyMnE0aDlIQ0hVX3NSaEtOSUZiVm8sMTA3OA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL01FVEFEQVRBLHNoYTI1Nj1XTGdwYlVYMW9PNW9HZTc0d2VjUlJMLW50bE5jampPRXdVZFFrak5RTnpJLDI3OTgNCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9SRUNPUkQsLA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1dIRUVMLHNoYTI1Nj1rZHNOLTVPSkFaSWlITi1pTzRSaGw4Mkt5UzBiRFdmNHVCd01ia05hZnI4LDExMA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2RlcGVuZGVuY3lfbGlua3MudHh0LHNoYTI1Nj1IbGtDRmtvSzVUYlo1RU1MYkxLWWhMY1lfRTMxa0JXRDhUcVcyRWdtYXRRLDIzOQ0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHQsc2hhMjU2PWpCcUNZRGxWamxfX3NqWUZHWG8xSlFHSU1BWUZKRS1wcllXVXRuTVpFZXcsMjk5MA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL21ldGFkYXRhLmpzb24sc2hhMjU2PXhkMF9OZ01PLWFUSi13c002ZHQ2ZGdRV2V4SXZ2ZkN6dU8wa1JEN01aNWssNDkwMQ0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHQsc2hhMjU2PTJIVVhWVndBNFBmZjF4Z1RGcjNHc1RYWEthUGFPNnZsRzZvTkpfNHU0VGcsMzgNCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby96aXAtc2FmZSxzaGEyNTY9QWJwSEdjZ0xiLWtSc0pHbndGRWt0azd1enBaT0NjQlk3NC1ZQmRyS1ZHcywxDQpQSwMEFAAAAAAAAAAhAPbd0r5uAAAAbgAAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1dIRUVMV2hlZWwtVmVyc2lvbjogMS4wCkdlbmVyYXRvcjogYmRpc3Rfd2hlZWwgKDAuMzAuMCkKUm9vdC1Jcy1QdXJlbGliOiB0cnVlClRhZzogcHkyLW5vbmUtYW55ClRhZzogcHkzLW5vbmUtYW55CgpQSwMEFAAAAAAAAAAhADfZX93vAAAA7wAAAFUAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2RlcGVuZGVuY3lfbGlua3MudHh0aHR0cHM6Ly9maWxlcy5weXRob25ob3N0ZWQub3JnL3BhY2thZ2VzL3NvdXJjZS9jL2NlcnRpZmkvY2VydGlmaS0yMDE2LjkuMjYudGFyLmd6I21kNT1iYWE4MWU5NTFhMjk5NTg1NjM2ODlkODY4ZWYxMDY0ZApodHRwczovL2ZpbGVzLnB5dGhvbmhvc3RlZC5vcmcvcGFja2FnZXMvc291cmNlL3cvd2luY2VydHN0b3JlL3dpbmNlcnRzdG9yZS0wLjIuemlwI21kNT1hZTcyOGYyZjAwNzE4NTY0OGQwYzdhODY3OWIzNjFlMgpQSwMEFAAAAAAAAAAhANE1jo6uCwAArgsAAFEAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRbY29uc29sZV9zY3JpcHRzXQplYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KZWFzeV9pbnN0YWxsLTMuNiA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbgoKW2Rpc3R1dGlscy5jb21tYW5kc10KYWxpYXMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYWxpYXM6YWxpYXMKYmRpc3RfZWdnID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZzpiZGlzdF9lZ2cKYmRpc3RfcnBtID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X3JwbTpiZGlzdF9ycG0KYmRpc3Rfd2luaW5zdCA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0OmJkaXN0X3dpbmluc3QKYnVpbGRfY2xpYiA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9jbGliOmJ1aWxkX2NsaWIKYnVpbGRfZXh0ID0gc2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2V4dDpidWlsZF9leHQKYnVpbGRfcHkgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfcHk6YnVpbGRfcHkKZGV2ZWxvcCA9IHNldHVwdG9vbHMuY29tbWFuZC5kZXZlbG9wOmRldmVsb3AKZGlzdF9pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmRpc3RfaW5mbzpkaXN0X2luZm8KZWFzeV9pbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDplYXN5X2luc3RhbGwKZWdnX2luZm8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86ZWdnX2luZm8KaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsOmluc3RhbGwKaW5zdGFsbF9lZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvOmluc3RhbGxfZWdnX2luZm8KaW5zdGFsbF9saWIgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9saWI6aW5zdGFsbF9saWIKaW5zdGFsbF9zY3JpcHRzID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfc2NyaXB0czppbnN0YWxsX3NjcmlwdHMKcmVnaXN0ZXIgPSBzZXR1cHRvb2xzLmNvbW1hbmQucmVnaXN0ZXI6cmVnaXN0ZXIKcm90YXRlID0gc2V0dXB0b29scy5jb21tYW5kLnJvdGF0ZTpyb3RhdGUKc2F2ZW9wdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2F2ZW9wdHM6c2F2ZW9wdHMKc2Rpc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3Q6c2Rpc3QKc2V0b3B0ID0gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdDpzZXRvcHQKdGVzdCA9IHNldHVwdG9vbHMuY29tbWFuZC50ZXN0OnRlc3QKdXBsb2FkID0gc2V0dXB0b29scy5jb21tYW5kLnVwbG9hZDp1cGxvYWQKdXBsb2FkX2RvY3MgPSBzZXR1cHRvb2xzLmNvbW1hbmQudXBsb2FkX2RvY3M6dXBsb2FkX2RvY3MKCltkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHNdCmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZGVwZW5kZW5jeV9saW5rcyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZWFnZXJfcmVzb3VyY2VzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAplbnRyeV9wb2ludHMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZW50cnlfcG9pbnRzCmV4Y2x1ZGVfcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YQpleHRyYXNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19leHRyYXMKaW5jbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKaW5zdGFsbF9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKbmFtZXNwYWNlX3BhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX25zcApwYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCnBhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VzCnB5dGhvbl9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19zcGVjaWZpZXIKc2V0dXBfcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCnRlc3RfbG9hZGVyID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUKdGVzdF9ydW5uZXIgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZQp0ZXN0X3N1aXRlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3Rlc3Rfc3VpdGUKdGVzdHNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKdXNlXzJ0bzMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKdXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CnVzZV8ydG8zX2ZpeGVycyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKemlwX3NhZmUgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKCltlZ2dfaW5mby53cml0ZXJzXQpQS0ctSU5GTyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9wa2dfaW5mbwpkZXBlbmRlbmN5X2xpbmtzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCmRlcGVuZHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndhcm5fZGVwZW5kc19vYnNvbGV0ZQplYWdlcl9yZXNvdXJjZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKZW50cnlfcG9pbnRzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9lbnRyaWVzCm5hbWVzcGFjZV9wYWNrYWdlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwpyZXF1aXJlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcmVxdWlyZW1lbnRzCnRvcF9sZXZlbC50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfdG9wbGV2ZWxfbmFtZXMKCltzZXR1cHRvb2xzLmluc3RhbGxhdGlvbl0KZWdnc2VjdXRhYmxlID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDpib290c3RyYXAKClBLAwQUAAAAAAAAACEA+9Yg9SUTAAAlEwAATgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vbWV0YWRhdGEuanNvbnsiY2xhc3NpZmllcnMiOiBbIkRldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUiLCAiSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycyIsICJMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBNSVQgTGljZW5zZSIsICJPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjciLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjUiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNiIsICJUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMgOjogUHl0aG9uIE1vZHVsZXMiLCAiVG9waWMgOjogU3lzdGVtIDo6IEFyY2hpdmluZyA6OiBQYWNrYWdpbmciLCAiVG9waWMgOjogU3lzdGVtIDo6IFN5c3RlbXMgQWRtaW5pc3RyYXRpb24iLCAiVG9waWMgOjogVXRpbGl0aWVzIl0sICJkZXNjcmlwdGlvbl9jb250ZW50X3R5cGUiOiAidGV4dC94LXJzdDsgY2hhcnNldD1VVEYtOCIsICJleHRlbnNpb25zIjogeyJweXRob24uY29tbWFuZHMiOiB7IndyYXBfY29uc29sZSI6IHsiZWFzeV9pbnN0YWxsIjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbiIsICJlYXN5X2luc3RhbGwtMy42IjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbiJ9fSwgInB5dGhvbi5kZXRhaWxzIjogeyJjb250YWN0cyI6IFt7ImVtYWlsIjogImRpc3R1dGlscy1zaWdAcHl0aG9uLm9yZyIsICJuYW1lIjogIlB5dGhvbiBQYWNrYWdpbmcgQXV0aG9yaXR5IiwgInJvbGUiOiAiYXV0aG9yIn1dLCAiZG9jdW1lbnRfbmFtZXMiOiB7ImRlc2NyaXB0aW9uIjogIkRFU0NSSVBUSU9OLnJzdCIsICJsaWNlbnNlIjogIkxJQ0VOU0UudHh0In0sICJwcm9qZWN0X3VybHMiOiB7IkhvbWUiOiAiaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scyJ9fSwgInB5dGhvbi5leHBvcnRzIjogeyJjb25zb2xlX3NjcmlwdHMiOiB7ImVhc3lfaW5zdGFsbCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4iLCAiZWFzeV9pbnN0YWxsLTMuNiI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4ifSwgImRpc3R1dGlscy5jb21tYW5kcyI6IHsiYWxpYXMiOiAic2V0dXB0b29scy5jb21tYW5kLmFsaWFzOmFsaWFzIiwgImJkaXN0X2VnZyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfZWdnOmJkaXN0X2VnZyIsICJiZGlzdF9ycG0iOiAic2V0dXB0b29scy5jb21tYW5kLmJkaXN0X3JwbTpiZGlzdF9ycG0iLCAiYmRpc3Rfd2luaW5zdCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdDpiZGlzdF93aW5pbnN0IiwgImJ1aWxkX2NsaWIiOiAic2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2NsaWI6YnVpbGRfY2xpYiIsICJidWlsZF9leHQiOiAic2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2V4dDpidWlsZF9leHQiLCAiYnVpbGRfcHkiOiAic2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX3B5OmJ1aWxkX3B5IiwgImRldmVsb3AiOiAic2V0dXB0b29scy5jb21tYW5kLmRldmVsb3A6ZGV2ZWxvcCIsICJkaXN0X2luZm8iOiAic2V0dXB0b29scy5jb21tYW5kLmRpc3RfaW5mbzpkaXN0X2luZm8iLCAiZWFzeV9pbnN0YWxsIjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6ZWFzeV9pbnN0YWxsIiwgImVnZ19pbmZvIjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzplZ2dfaW5mbyIsICJpbnN0YWxsIjogInNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsOmluc3RhbGwiLCAiaW5zdGFsbF9lZ2dfaW5mbyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9lZ2dfaW5mbzppbnN0YWxsX2VnZ19pbmZvIiwgImluc3RhbGxfbGliIjogInNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2xpYjppbnN0YWxsX2xpYiIsICJpbnN0YWxsX3NjcmlwdHMiOiAic2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfc2NyaXB0czppbnN0YWxsX3NjcmlwdHMiLCAicmVnaXN0ZXIiOiAic2V0dXB0b29scy5jb21tYW5kLnJlZ2lzdGVyOnJlZ2lzdGVyIiwgInJvdGF0ZSI6ICJzZXR1cHRvb2xzLmNvbW1hbmQucm90YXRlOnJvdGF0ZSIsICJzYXZlb3B0cyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuc2F2ZW9wdHM6c2F2ZW9wdHMiLCAic2Rpc3QiOiAic2V0dXB0b29scy5jb21tYW5kLnNkaXN0OnNkaXN0IiwgInNldG9wdCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0OnNldG9wdCIsICJ0ZXN0IjogInNldHVwdG9vbHMuY29tbWFuZC50ZXN0OnRlc3QiLCAidXBsb2FkIjogInNldHVwdG9vbHMuY29tbWFuZC51cGxvYWQ6dXBsb2FkIiwgInVwbG9hZF9kb2NzIjogInNldHVwdG9vbHMuY29tbWFuZC51cGxvYWRfZG9jczp1cGxvYWRfZG9jcyJ9LCAiZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzIjogeyJjb252ZXJ0XzJ0bzNfZG9jdGVzdHMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJkZXBlbmRlbmN5X2xpbmtzIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QiLCAiZWFnZXJfcmVzb3VyY2VzIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QiLCAiZW50cnlfcG9pbnRzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19lbnRyeV9wb2ludHMiLCAiZXhjbHVkZV9wYWNrYWdlX2RhdGEiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YSIsICJleHRyYXNfcmVxdWlyZSI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZXh0cmFzIiwgImluY2x1ZGVfcGFja2FnZV9kYXRhIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbCIsICJpbnN0YWxsX3JlcXVpcmVzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMiLCAibmFtZXNwYWNlX3BhY2thZ2VzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19uc3AiLCAicGFja2FnZV9kYXRhIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlX2RhdGEiLCAicGFja2FnZXMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VzIiwgInB5dGhvbl9yZXF1aXJlcyI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfc3BlY2lmaWVyIiwgInNldHVwX3JlcXVpcmVzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMiLCAidGVzdF9sb2FkZXIiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUiLCAidGVzdF9ydW5uZXIiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUiLCAidGVzdF9zdWl0ZSI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfdGVzdF9zdWl0ZSIsICJ0ZXN0c19yZXF1aXJlIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMiLCAidXNlXzJ0bzMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sIiwgInVzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QiLCAidXNlXzJ0bzNfZml4ZXJzIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QiLCAiemlwX3NhZmUiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sIn0sICJlZ2dfaW5mby53cml0ZXJzIjogeyJQS0ctSU5GTyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcGtnX2luZm8iLCAiZGVwZW5kZW5jeV9saW5rcy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmciLCAiZGVwZW5kcy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndhcm5fZGVwZW5kc19vYnNvbGV0ZSIsICJlYWdlcl9yZXNvdXJjZXMudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnIiwgImVudHJ5X3BvaW50cy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX2VudHJpZXMiLCAibmFtZXNwYWNlX3BhY2thZ2VzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZyIsICJyZXF1aXJlcy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3JlcXVpcmVtZW50cyIsICJ0b3BfbGV2ZWwudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV90b3BsZXZlbF9uYW1lcyJ9LCAic2V0dXB0b29scy5pbnN0YWxsYXRpb24iOiB7ImVnZ3NlY3V0YWJsZSI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOmJvb3RzdHJhcCJ9fX0sICJleHRyYXMiOiBbImNlcnRzIiwgInNzbCJdLCAiZ2VuZXJhdG9yIjogImJkaXN0X3doZWVsICgwLjMwLjApIiwgImtleXdvcmRzIjogWyJDUEFOIiwgIlB5UEkiLCAiZGlzdHV0aWxzIiwgImVnZ3MiLCAicGFja2FnZSIsICJtYW5hZ2VtZW50Il0sICJtZXRhZGF0YV92ZXJzaW9uIjogIjIuMCIsICJuYW1lIjogInNldHVwdG9vbHMiLCAicmVxdWlyZXNfcHl0aG9uIjogIj49Mi43LCE9My4wLiosIT0zLjEuKiwhPTMuMi4qIiwgInJ1bl9yZXF1aXJlcyI6IFt7ImV4dHJhIjogImNlcnRzIiwgInJlcXVpcmVzIjogWyJjZXJ0aWZpICg9PTIwMTYuOS4yNikiXX0sIHsiZW52aXJvbm1lbnQiOiAic3lzX3BsYXRmb3JtPT0nd2luMzInIiwgImV4dHJhIjogInNzbCIsICJyZXF1aXJlcyI6IFsid2luY2VydHN0b3JlICg9PTAuMikiXX1dLCAic3VtbWFyeSI6ICJFYXNpbHkgZG93bmxvYWQsIGJ1aWxkLCBpbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyIsICJ2ZXJzaW9uIjogIjM4LjIuNCJ9UEsDBBQAAAAAAAAAIQAwXAGRJgAAACYAAABOAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby90b3BfbGV2ZWwudHh0ZWFzeV9pbnN0YWxsCnBrZ19yZXNvdXJjZXMKc2V0dXB0b29scwpQSwMEFAAAAAAAAAAhAJMG1zIBAAAAAQAAAEkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3ppcC1zYWZlClBLAwQUAAAAAAAAACEAIwtKA0QWAABEFgAAOwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL19faW5pdF9fLnB5IiIiRXh0ZW5zaW9ucyB0byB0aGUgJ2Rpc3R1dGlscycgZm9yIGxhcmdlIG9yIGNvbXBsZXggZGlzdHJpYnV0aW9ucyIiIgoKaW1wb3J0IG9zCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGRpc3R1dGlscy5jb3JlCmltcG9ydCBkaXN0dXRpbHMuZmlsZWxpc3QKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaGNhc2UKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXIsIG1hcAoKaW1wb3J0IHNldHVwdG9vbHMudmVyc2lvbgpmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBFeHRlbnNpb24KZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbiwgRmVhdHVyZQpmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgUmVxdWlyZQpmcm9tIC4gaW1wb3J0IG1vbmtleQoKX19hbGxfXyA9IFsKICAgICdzZXR1cCcsICdEaXN0cmlidXRpb24nLCAnRmVhdHVyZScsICdDb21tYW5kJywgJ0V4dGVuc2lvbicsICdSZXF1aXJlJywKICAgICdmaW5kX3BhY2thZ2VzJywKXQoKX192ZXJzaW9uX18gPSBzZXR1cHRvb2xzLnZlcnNpb24uX192ZXJzaW9uX18KCmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBOb25lCgojIElmIHdlIHJ1biAydG8zIG9uIC5weSBmaWxlcywgc2hvdWxkIHdlIGFsc28gY29udmVydCBkb2NzdHJpbmdzPwojIERlZmF1bHQ6IHllczsgYXNzdW1lIHRoYXQgd2UgY2FuIGRldGVjdCBkb2N0ZXN0cyByZWxpYWJseQpydW5fMnRvM19vbl9kb2N0ZXN0cyA9IFRydWUKIyBTdGFuZGFyZCBwYWNrYWdlIG5hbWVzIGZvciBmaXhlciBwYWNrYWdlcwpsaWIydG8zX2ZpeGVyX3BhY2thZ2VzID0gWydsaWIydG8zLmZpeGVzJ10KCgpjbGFzcyBQYWNrYWdlRmluZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIEdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgUHl0aG9uIHBhY2thZ2VzIGZvdW5kIHdpdGhpbiBhIGRpcmVjdG9yeQogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZmluZChjbHMsIHdoZXJlPScuJywgZXhjbHVkZT0oKSwgaW5jbHVkZT0oJyonLCkpOgogICAgICAgICIiIlJldHVybiBhIGxpc3QgYWxsIFB5dGhvbiBwYWNrYWdlcyBmb3VuZCB3aXRoaW4gZGlyZWN0b3J5ICd3aGVyZScKCiAgICAgICAgJ3doZXJlJyBpcyB0aGUgcm9vdCBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBiZSBzZWFyY2hlZCBmb3IgcGFja2FnZXMuICBJdAogICAgICAgIHNob3VsZCBiZSBzdXBwbGllZCBhcyBhICJjcm9zcy1wbGF0Zm9ybSIgKGkuZS4gVVJMLXN0eWxlKSBwYXRoOyBpdCB3aWxsCiAgICAgICAgYmUgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsb2NhbCBwYXRoIHN5bnRheC4KCiAgICAgICAgJ2V4Y2x1ZGUnIGlzIGEgc2VxdWVuY2Ugb2YgcGFja2FnZSBuYW1lcyB0byBleGNsdWRlOyAnKicgY2FuIGJlIHVzZWQKICAgICAgICBhcyBhIHdpbGRjYXJkIGluIHRoZSBuYW1lcywgc3VjaCB0aGF0ICdmb28uKicgd2lsbCBleGNsdWRlIGFsbAogICAgICAgIHN1YnBhY2thZ2VzIG9mICdmb28nIChidXQgbm90ICdmb28nIGl0c2VsZikuCgogICAgICAgICdpbmNsdWRlJyBpcyBhIHNlcXVlbmNlIG9mIHBhY2thZ2UgbmFtZXMgdG8gaW5jbHVkZS4gIElmIGl0J3MKICAgICAgICBzcGVjaWZpZWQsIG9ubHkgdGhlIG5hbWVkIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuICBJZiBpdCdzIG5vdAogICAgICAgIHNwZWNpZmllZCwgYWxsIGZvdW5kIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuICAnaW5jbHVkZScgY2FuIGNvbnRhaW4KICAgICAgICBzaGVsbCBzdHlsZSB3aWxkY2FyZCBwYXR0ZXJucyBqdXN0IGxpa2UgJ2V4Y2x1ZGUnLgogICAgICAgICIiIgoKICAgICAgICByZXR1cm4gbGlzdChjbHMuX2ZpbmRfcGFja2FnZXNfaXRlcigKICAgICAgICAgICAgY29udmVydF9wYXRoKHdoZXJlKSwKICAgICAgICAgICAgY2xzLl9idWlsZF9maWx0ZXIoJ2V6X3NldHVwJywgJypfX3B5Y2FjaGVfXycsICpleGNsdWRlKSwKICAgICAgICAgICAgY2xzLl9idWlsZF9maWx0ZXIoKmluY2x1ZGUpKSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZmluZF9wYWNrYWdlc19pdGVyKGNscywgd2hlcmUsIGV4Y2x1ZGUsIGluY2x1ZGUpOgogICAgICAgICIiIgogICAgICAgIEFsbCB0aGUgcGFja2FnZXMgZm91bmQgaW4gJ3doZXJlJyB0aGF0IHBhc3MgdGhlICdpbmNsdWRlJyBmaWx0ZXIsIGJ1dAogICAgICAgIG5vdCB0aGUgJ2V4Y2x1ZGUnIGZpbHRlci4KICAgICAgICAiIiIKICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayh3aGVyZSwgZm9sbG93bGlua3M9VHJ1ZSk6CiAgICAgICAgICAgICMgQ29weSBkaXJzIHRvIGl0ZXJhdGUgb3ZlciBpdCwgdGhlbiBlbXB0eSBkaXJzLgogICAgICAgICAgICBhbGxfZGlycyA9IGRpcnNbOl0KICAgICAgICAgICAgZGlyc1s6XSA9IFtdCgogICAgICAgICAgICBmb3IgZGlyIGluIGFsbF9kaXJzOgogICAgICAgICAgICAgICAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKHJvb3QsIGRpcikKICAgICAgICAgICAgICAgIHJlbF9wYXRoID0gb3MucGF0aC5yZWxwYXRoKGZ1bGxfcGF0aCwgd2hlcmUpCiAgICAgICAgICAgICAgICBwYWNrYWdlID0gcmVsX3BhdGgucmVwbGFjZShvcy5wYXRoLnNlcCwgJy4nKQoKICAgICAgICAgICAgICAgICMgU2tpcCBkaXJlY3RvcnkgdHJlZXMgdGhhdCBhcmUgbm90IHZhbGlkIHBhY2thZ2VzCiAgICAgICAgICAgICAgICBpZiAoJy4nIGluIGRpciBvciBub3QgY2xzLl9sb29rc19saWtlX3BhY2thZ2UoZnVsbF9wYXRoKSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAjIFNob3VsZCB0aGlzIHBhY2thZ2UgYmUgaW5jbHVkZWQ/CiAgICAgICAgICAgICAgICBpZiBpbmNsdWRlKHBhY2thZ2UpIGFuZCBub3QgZXhjbHVkZShwYWNrYWdlKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYWNrYWdlCgogICAgICAgICAgICAgICAgIyBLZWVwIHNlYXJjaGluZyBzdWJkaXJlY3RvcmllcywgYXMgdGhlcmUgbWF5IGJlIG1vcmUgcGFja2FnZXMKICAgICAgICAgICAgICAgICMgZG93biB0aGVyZSwgZXZlbiBpZiB0aGUgcGFyZW50IHdhcyBleGNsdWRlZC4KICAgICAgICAgICAgICAgIGRpcnMuYXBwZW5kKGRpcikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2xvb2tzX2xpa2VfcGFja2FnZShwYXRoKToKICAgICAgICAiIiJEb2VzIGEgZGlyZWN0b3J5IGxvb2sgbGlrZSBhIHBhY2thZ2U/IiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihwYXRoLCAnX19pbml0X18ucHknKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2J1aWxkX2ZpbHRlcigqcGF0dGVybnMpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgbGlzdCBvZiBwYXR0ZXJucywgcmV0dXJuIGEgY2FsbGFibGUgdGhhdCB3aWxsIGJlIHRydWUgb25seSBpZgogICAgICAgIHRoZSBpbnB1dCBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGF0dGVybnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxhbWJkYSBuYW1lOiBhbnkoZm5tYXRjaGNhc2UobmFtZSwgcGF0PXBhdCkgZm9yIHBhdCBpbiBwYXR0ZXJucykKCgpjbGFzcyBQRVA0MjBQYWNrYWdlRmluZGVyKFBhY2thZ2VGaW5kZXIpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9sb29rc19saWtlX3BhY2thZ2UocGF0aCk6CiAgICAgICAgcmV0dXJuIFRydWUKCgpmaW5kX3BhY2thZ2VzID0gUGFja2FnZUZpbmRlci5maW5kCgoKZGVmIF9pbnN0YWxsX3NldHVwX3JlcXVpcmVzKGF0dHJzKToKICAgICMgTm90ZTogZG8gbm90IHVzZSBgc2V0dXB0b29scy5EaXN0cmlidXRpb25gIGRpcmVjdGx5LCBhcwogICAgIyBvdXIgUEVQIDUxNyBiYWNrZW5kIHBhdGNoIGBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb25gLgogICAgZGlzdCA9IGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbihkaWN0KAogICAgICAgIChrLCB2KSBmb3IgaywgdiBpbiBhdHRycy5pdGVtcygpCiAgICAgICAgaWYgayBpbiAoJ2RlcGVuZGVuY3lfbGlua3MnLCAnc2V0dXBfcmVxdWlyZXMnKQogICAgKSkKICAgICMgSG9ub3Igc2V0dXAuY2ZnJ3Mgb3B0aW9ucy4KICAgIGRpc3QucGFyc2VfY29uZmlnX2ZpbGVzKGlnbm9yZV9vcHRpb25fZXJyb3JzPVRydWUpCiAgICBpZiBkaXN0LnNldHVwX3JlcXVpcmVzOgogICAgICAgIGRpc3QuZmV0Y2hfYnVpbGRfZWdncyhkaXN0LnNldHVwX3JlcXVpcmVzKQoKCmRlZiBzZXR1cCgqKmF0dHJzKToKICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW55IHJlcXVpcmVtZW50cyBuZWVkZWQgdG8gaW50ZXJwcmV0ICdhdHRycycuCiAgICBfaW5zdGFsbF9zZXR1cF9yZXF1aXJlcyhhdHRycykKICAgIHJldHVybiBkaXN0dXRpbHMuY29yZS5zZXR1cCgqKmF0dHJzKQoKc2V0dXAuX19kb2NfXyA9IGRpc3R1dGlscy5jb3JlLnNldHVwLl9fZG9jX18KCgpfQ29tbWFuZCA9IG1vbmtleS5nZXRfdW5wYXRjaGVkKGRpc3R1dGlscy5jb3JlLkNvbW1hbmQpCgoKY2xhc3MgQ29tbWFuZChfQ29tbWFuZCk6CiAgICBfX2RvY19fID0gX0NvbW1hbmQuX19kb2NfXwoKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCwgKiprdyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IHRoZSBjb21tYW5kIGZvciBkaXN0LCB1cGRhdGluZwogICAgICAgIHZhcnMoc2VsZikgd2l0aCBhbnkga2V5d29yZCBwYXJhbWV0ZXJzLgogICAgICAgICIiIgogICAgICAgIF9Db21tYW5kLl9faW5pdF9fKHNlbGYsIGRpc3QpCiAgICAgICAgdmFycyhzZWxmKS51cGRhdGUoa3cpCgogICAgZGVmIHJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcz0wLCAqKmt3KToKICAgICAgICBjbWQgPSBfQ29tbWFuZC5yZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHMpCiAgICAgICAgdmFycyhjbWQpLnVwZGF0ZShrdykKICAgICAgICByZXR1cm4gY21kCgoKZGVmIF9maW5kX2FsbF9zaW1wbGUocGF0aCk6CiAgICAiIiIKICAgIEZpbmQgYWxsIGZpbGVzIHVuZGVyICdwYXRoJwogICAgIiIiCiAgICByZXN1bHRzID0gKAogICAgICAgIG9zLnBhdGguam9pbihiYXNlLCBmaWxlKQogICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgsIGZvbGxvd2xpbmtzPVRydWUpCiAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXMKICAgICkKICAgIHJldHVybiBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIHJlc3VsdHMpCgoKZGVmIGZpbmRhbGwoZGlyPW9zLmN1cmRpcik6CiAgICAiIiIKICAgIEZpbmQgYWxsIGZpbGVzIHVuZGVyICdkaXInIGFuZCByZXR1cm4gdGhlIGxpc3Qgb2YgZnVsbCBmaWxlbmFtZXMuCiAgICBVbmxlc3MgZGlyIGlzICcuJywgcmV0dXJuIGZ1bGwgZmlsZW5hbWVzIHdpdGggZGlyIHByZXBlbmRlZC4KICAgICIiIgogICAgZmlsZXMgPSBfZmluZF9hbGxfc2ltcGxlKGRpcikKICAgIGlmIGRpciA9PSBvcy5jdXJkaXI6CiAgICAgICAgbWFrZV9yZWwgPSBmdW5jdG9vbHMucGFydGlhbChvcy5wYXRoLnJlbHBhdGgsIHN0YXJ0PWRpcikKICAgICAgICBmaWxlcyA9IG1hcChtYWtlX3JlbCwgZmlsZXMpCiAgICByZXR1cm4gbGlzdChmaWxlcykKCgptb25rZXkucGF0Y2hfYWxsKCkKUEsDBBQAAAAAAAAAIQClh2VRwBkAAMAZAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5IiIiVXRpbGl0aWVzIGZvciBleHRyYWN0aW5nIGNvbW1vbiBhcmNoaXZlIGZvcm1hdHMiIiIKCmltcG9ydCB6aXBmaWxlCmltcG9ydCB0YXJmaWxlCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IGNvbnRleHRsaWIKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBlbnN1cmVfZGlyZWN0b3J5CgpfX2FsbF9fID0gWwogICAgInVucGFja19hcmNoaXZlIiwgInVucGFja196aXBmaWxlIiwgInVucGFja190YXJmaWxlIiwgImRlZmF1bHRfZmlsdGVyIiwKICAgICJVbnJlY29nbml6ZWRGb3JtYXQiLCAiZXh0cmFjdGlvbl9kcml2ZXJzIiwgInVucGFja19kaXJlY3RvcnkiLApdCgoKY2xhc3MgVW5yZWNvZ25pemVkRm9ybWF0KERpc3R1dGlsc0Vycm9yKToKICAgICIiIkNvdWxkbid0IHJlY29nbml6ZSB0aGUgYXJjaGl2ZSB0eXBlIiIiCgoKZGVmIGRlZmF1bHRfZmlsdGVyKHNyYywgZHN0KToKICAgICIiIlRoZSBkZWZhdWx0IHByb2dyZXNzL2ZpbHRlciBjYWxsYmFjazsgcmV0dXJucyBUcnVlIGZvciBhbGwgZmlsZXMiIiIKICAgIHJldHVybiBkc3QKCgpkZWYgdW5wYWNrX2FyY2hpdmUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIsCiAgICAgICAgZHJpdmVycz1Ob25lKToKICAgICIiIlVucGFjayBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAsIG9yIHJhaXNlIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAKCiAgICBgcHJvZ3Jlc3NfZmlsdGVyYCBpcyBhIGZ1bmN0aW9uIHRha2luZyB0d28gYXJndW1lbnRzOiBhIHNvdXJjZSBwYXRoCiAgICBpbnRlcm5hbCB0byB0aGUgYXJjaGl2ZSAoJy8nLXNlcGFyYXRlZCksIGFuZCBhIGZpbGVzeXN0ZW0gcGF0aCB3aGVyZSBpdAogICAgd2lsbCBiZSBleHRyYWN0ZWQuICBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gdGhlIGRlc2lyZWQgZXh0cmFjdCBwYXRoCiAgICAod2hpY2ggbWF5IGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIGluKSwgb3IgZWxzZSBgYE5vbmVgYCB0byBza2lwCiAgICB0aGF0IGZpbGUgb3IgZGlyZWN0b3J5LiAgVGhlIGNhbGxiYWNrIGNhbiB0aHVzIGJlIHVzZWQgdG8gcmVwb3J0IG9uIHRoZQogICAgcHJvZ3Jlc3Mgb2YgdGhlIGV4dHJhY3Rpb24sIGFzIHdlbGwgYXMgdG8gZmlsdGVyIHRoZSBpdGVtcyBleHRyYWN0ZWQgb3IKICAgIGFsdGVyIHRoZWlyIGV4dHJhY3Rpb24gcGF0aHMuCgogICAgYGRyaXZlcnNgLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBmdW5jdGlvbnMgd2l0aCB0aGUKICAgIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgZnVuY3Rpb24gKG1pbnVzIHRoZSBgZHJpdmVyc2AgYXJndW1lbnQpLCB0aGF0IHJhaXNlCiAgICBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIHRoZXkgZG8gbm90IHN1cHBvcnQgZXh0cmFjdGluZyB0aGUgZGVzaWduYXRlZAogICAgYXJjaGl2ZSB0eXBlLiAgVGhlIGBkcml2ZXJzYCBhcmUgdHJpZWQgaW4gc2VxdWVuY2UgdW50aWwgb25lIGlzIGZvdW5kIHRoYXQKICAgIGRvZXMgbm90IHJhaXNlIGFuIGVycm9yLCBvciB1bnRpbCBhbGwgYXJlIGV4aGF1c3RlZCAoaW4gd2hpY2ggY2FzZQogICAgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpcyByYWlzZWQpLiAgSWYgeW91IGRvIG5vdCBzdXBwbHkgYSBzZXF1ZW5jZSBvZgogICAgZHJpdmVycywgdGhlIG1vZHVsZSdzIGBgZXh0cmFjdGlvbl9kcml2ZXJzYGAgY29uc3RhbnQgd2lsbCBiZSB1c2VkLCB3aGljaAogICAgbWVhbnMgdGhhdCBgYHVucGFja196aXBmaWxlYGAgYW5kIGBgdW5wYWNrX3RhcmZpbGVgYCB3aWxsIGJlIHRyaWVkLCBpbiB0aGF0CiAgICBvcmRlci4KICAgICIiIgogICAgZm9yIGRyaXZlciBpbiBkcml2ZXJzIG9yIGV4dHJhY3Rpb25fZHJpdmVyczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRyaXZlcihmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcikKICAgICAgICBleGNlcHQgVW5yZWNvZ25pemVkRm9ybWF0OgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybgogICAgZWxzZToKICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoCiAgICAgICAgICAgICJOb3QgYSByZWNvZ25pemVkIGFyY2hpdmUgdHlwZTogJXMiICUgZmlsZW5hbWUKICAgICAgICApCgoKZGVmIHVucGFja19kaXJlY3RvcnkoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgogICAgIiIiIlVucGFjayIgYSBkaXJlY3RvcnksIHVzaW5nIHRoZSBzYW1lIGludGVyZmFjZSBhcyBmb3IgYXJjaGl2ZXMKCiAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIGRpcmVjdG9yeQogICAgIiIiCiAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgZmlsZW5hbWUpCgogICAgcGF0aHMgPSB7CiAgICAgICAgZmlsZW5hbWU6ICgnJywgZXh0cmFjdF9kaXIpLAogICAgfQogICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoZmlsZW5hbWUpOgogICAgICAgIHNyYywgZHN0ID0gcGF0aHNbYmFzZV0KICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSwgZCldID0gc3JjICsgZCArICcvJywgb3MucGF0aC5qb2luKGRzdCwgZCkKICAgICAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGRzdCwgZikKICAgICAgICAgICAgdGFyZ2V0ID0gcHJvZ3Jlc3NfZmlsdGVyKHNyYyArIGYsIHRhcmdldCkKICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKICAgICAgICAgICAgICAgICMgc2tpcCBub24tZmlsZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGJhc2UsIGYpCiAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShmLCB0YXJnZXQpCiAgICAgICAgICAgIHNodXRpbC5jb3B5c3RhdChmLCB0YXJnZXQpCgoKZGVmIHVucGFja196aXBmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKICAgICIiIlVucGFjayB6aXAgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCgogICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSB6aXBmaWxlIChhcyBkZXRlcm1pbmVkCiAgICBieSBgYHppcGZpbGUuaXNfemlwZmlsZSgpYGApLiAgU2VlIGBgdW5wYWNrX2FyY2hpdmUoKWBgIGZvciBhbiBleHBsYW5hdGlvbgogICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgogICAgIiIiCgogICAgaWYgbm90IHppcGZpbGUuaXNfemlwZmlsZShmaWxlbmFtZSk6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KCIlcyBpcyBub3QgYSB6aXAgZmlsZSIgJSAoZmlsZW5hbWUsKSkKCiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSkgYXMgejoKICAgICAgICBmb3IgaW5mbyBpbiB6LmluZm9saXN0KCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCgogICAgICAgICAgICAjIGRvbid0IGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMgb3Igb25lcyB3aXRoIC4uIGluIHRoZW0KICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcvJykgb3IgJy4uJyBpbiBuYW1lLnNwbGl0KCcvJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGV4dHJhY3RfZGlyLCAqbmFtZS5zcGxpdCgnLycpKQogICAgICAgICAgICB0YXJnZXQgPSBwcm9ncmVzc19maWx0ZXIobmFtZSwgdGFyZ2V0KQogICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBmaWxlCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgICAgIGRhdGEgPSB6LnJlYWQoaW5mby5maWxlbmFtZSkKICAgICAgICAgICAgICAgIHdpdGggb3Blbih0YXJnZXQsICd3YicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQogICAgICAgICAgICB1bml4X2F0dHJpYnV0ZXMgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKICAgICAgICAgICAgaWYgdW5peF9hdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgb3MuY2htb2QodGFyZ2V0LCB1bml4X2F0dHJpYnV0ZXMpCgoKZGVmIHVucGFja190YXJmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKICAgICIiIlVucGFjayB0YXIvdGFyLmd6L3Rhci5iejIgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCgogICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSB0YXJmaWxlIChhcyBkZXRlcm1pbmVkCiAgICBieSBgYHRhcmZpbGUub3BlbigpYGApLiAgU2VlIGBgdW5wYWNrX2FyY2hpdmUoKWBgIGZvciBhbiBleHBsYW5hdGlvbgogICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgdGFyb2JqID0gdGFyZmlsZS5vcGVuKGZpbGVuYW1lKQogICAgZXhjZXB0IHRhcmZpbGUuVGFyRXJyb3I6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KAogICAgICAgICAgICAiJXMgaXMgbm90IGEgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQgdGFyIGZpbGUiICUgKGZpbGVuYW1lLCkKICAgICAgICApCiAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyh0YXJvYmopOgogICAgICAgICMgZG9uJ3QgZG8gYW55IGNob3duaW5nIQogICAgICAgIHRhcm9iai5jaG93biA9IGxhbWJkYSAqYXJnczogTm9uZQogICAgICAgIGZvciBtZW1iZXIgaW4gdGFyb2JqOgogICAgICAgICAgICBuYW1lID0gbWVtYmVyLm5hbWUKICAgICAgICAgICAgIyBkb24ndCBleHRyYWN0IGFic29sdXRlIHBhdGhzIG9yIG9uZXMgd2l0aCAuLiBpbiB0aGVtCiAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJy8nKSBhbmQgJy4uJyBub3QgaW4gbmFtZS5zcGxpdCgnLycpOgogICAgICAgICAgICAgICAgcHJlbGltX2RzdCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKCiAgICAgICAgICAgICAgICAjIHJlc29sdmUgYW55IGxpbmtzIGFuZCB0byBleHRyYWN0IHRoZSBsaW5rIHRhcmdldHMgYXMgbm9ybWFsCiAgICAgICAgICAgICAgICAjIGZpbGVzCiAgICAgICAgICAgICAgICB3aGlsZSBtZW1iZXIgaXMgbm90IE5vbmUgYW5kIChtZW1iZXIuaXNsbmsoKSBvciBtZW1iZXIuaXNzeW0oKSk6CiAgICAgICAgICAgICAgICAgICAgbGlua3BhdGggPSBtZW1iZXIubGlua25hbWUKICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIuaXNzeW0oKToKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IHBvc2l4cGF0aC5kaXJuYW1lKG1lbWJlci5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IHBvc2l4cGF0aC5qb2luKGJhc2UsIGxpbmtwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IHBvc2l4cGF0aC5ub3JtcGF0aChsaW5rcGF0aCkKICAgICAgICAgICAgICAgICAgICBtZW1iZXIgPSB0YXJvYmouX2dldG1lbWJlcihsaW5rcGF0aCkKCiAgICAgICAgICAgICAgICBpZiBtZW1iZXIgaXMgbm90IE5vbmUgYW5kIChtZW1iZXIuaXNmaWxlKCkgb3IgbWVtYmVyLmlzZGlyKCkpOgogICAgICAgICAgICAgICAgICAgIGZpbmFsX2RzdCA9IHByb2dyZXNzX2ZpbHRlcihuYW1lLCBwcmVsaW1fZHN0KQogICAgICAgICAgICAgICAgICAgIGlmIGZpbmFsX2RzdDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmluYWxfZHN0LmVuZHN3aXRoKG9zLnNlcCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9kc3QgPSBmaW5hbF9kc3RbOi0xXQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBVZ2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcm9iai5fZXh0cmFjdF9tZW1iZXIobWVtYmVyLCBmaW5hbF9kc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCB0YXJmaWxlLkV4dHJhY3RFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hvd24vY2htb2QvbWtmaWZvL21rbm9kZS9tYWtlZGV2IGZhaWxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBUcnVlCgoKZXh0cmFjdGlvbl9kcml2ZXJzID0gdW5wYWNrX2RpcmVjdG9yeSwgdW5wYWNrX3ppcGZpbGUsIHVucGFja190YXJmaWxlClBLAwQUAAAAAAAAACEAH+I9HCcWAAAnFgAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2J1aWxkX21ldGEucHkiIiJBIFBFUCA1MTcgaW50ZXJmYWNlIHRvIHNldHVwdG9vbHMKClByZXZpb3VzbHksIHdoZW4gYSB1c2VyIG9yIGEgY29tbWFuZCBsaW5lIHRvb2wgKGxldCdzIGNhbGwgaXQgYSAiZnJvbnRlbmQiKQpuZWVkZWQgdG8gbWFrZSBhIHJlcXVlc3Qgb2Ygc2V0dXB0b29scyB0byB0YWtlIGEgY2VydGFpbiBhY3Rpb24sIGZvcgpleGFtcGxlLCBnZW5lcmF0aW5nIGEgbGlzdCBvZiBpbnN0YWxsYXRpb24gcmVxdWlyZW1lbnRzLCB0aGUgZnJvbnRlbmQgd291bGQKd291bGQgY2FsbCAic2V0dXAucHkgZWdnX2luZm8iIG9yICJzZXR1cC5weSBiZGlzdF93aGVlbCIgb24gdGhlIGNvbW1hbmQgbGluZS4KClBFUCA1MTcgZGVmaW5lcyBhIGRpZmZlcmVudCBtZXRob2Qgb2YgaW50ZXJmYWNpbmcgd2l0aCBzZXR1cHRvb2xzLiBSYXRoZXIKdGhhbiBjYWxsaW5nICJzZXR1cC5weSIgZGlyZWN0bHksIHRoZSBmcm9udGVuZCBzaG91bGQ6CgogIDEuIFNldCB0aGUgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIGRpcmVjdG9yeSB3aXRoIGEgc2V0dXAucHkgZmlsZQogIDIuIEltcG9ydCB0aGlzIG1vZHVsZSBpbnRvIGEgc2FmZSBweXRob24gaW50ZXJwcmV0ZXIgKG9uZSBpbiB3aGljaAogICAgIHNldHVwdG9vbHMgY2FuIHBvdGVudGlhbGx5IHNldCBnbG9iYWwgdmFyaWFibGVzIG9yIGNyYXNoIGhhcmQpLgogIDMuIENhbGwgb25lIG9mIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiBQRVAgNTE3LgoKV2hhdCBlYWNoIGZ1bmN0aW9uIGRvZXMgaXMgZGVmaW5lZCBpbiBQRVAgNTE3LiBIb3dldmVyLCBoZXJlIGlzIGEgImNhc3VhbCIKZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb25zICh0aGlzIGRlZmluaXRpb24gc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gZm9yCmJ1ZyByZXBvcnRzIG9yIEFQSSBzdGFiaWxpdHkpOgoKICAtIGBidWlsZF93aGVlbGA6IGJ1aWxkIGEgd2hlZWwgaW4gdGhlIGZvbGRlciBhbmQgcmV0dXJuIHRoZSBiYXNlbmFtZQogIC0gYGdldF9yZXF1aXJlc19mb3JfYnVpbGRfd2hlZWxgOiBnZXQgdGhlIGBzZXR1cF9yZXF1aXJlc2AgdG8gYnVpbGQKICAtIGBwcmVwYXJlX21ldGFkYXRhX2Zvcl9idWlsZF93aGVlbGA6IGdldCB0aGUgYGluc3RhbGxfcmVxdWlyZXNgCiAgLSBgYnVpbGRfc2Rpc3RgOiBidWlsZCBhbiBzZGlzdCBpbiB0aGUgZm9sZGVyIGFuZCByZXR1cm4gdGhlIGJhc2VuYW1lCiAgLSBgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdGA6IGdldCB0aGUgYHNldHVwX3JlcXVpcmVzYCB0byBidWlsZAoKQWdhaW4sIHRoaXMgaXMgbm90IGEgZm9ybWFsIGRlZmluaXRpb24hIEp1c3QgYSAidGFzdGUiIG9mIHRoZSBtb2R1bGUuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHRva2VuaXplCmltcG9ydCBzaHV0aWwKaW1wb3J0IGNvbnRleHRsaWIKCmltcG9ydCBzZXR1cHRvb2xzCmltcG9ydCBkaXN0dXRpbHMKCgpjbGFzcyBTZXR1cFJlcXVpcmVtZW50c0Vycm9yKEJhc2VFeGNlcHRpb24pOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnMpOgogICAgICAgIHNlbGYuc3BlY2lmaWVycyA9IHNwZWNpZmllcnMKCgpjbGFzcyBEaXN0cmlidXRpb24oc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbik6CiAgICBkZWYgZmV0Y2hfYnVpbGRfZWdncyhzZWxmLCBzcGVjaWZpZXJzKToKICAgICAgICByYWlzZSBTZXR1cFJlcXVpcmVtZW50c0Vycm9yKHNwZWNpZmllcnMpCgogICAgQGNsYXNzbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIHBhdGNoKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZQogICAgICAgIGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbiB3aXRoIHRoaXMgY2xhc3MKICAgICAgICBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgY29udGV4dC4KICAgICAgICAiIiIKICAgICAgICBvcmlnID0gZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uCiAgICAgICAgZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uID0gY2xzCiAgICAgICAgdHJ5OgogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbiA9IG9yaWcKCgpkZWYgX3J1bl9zZXR1cChzZXR1cF9zY3JpcHQ9J3NldHVwLnB5Jyk6CiAgICAjIE5vdGUgdGhhdCB3ZSBjYW4gcmV1c2Ugb3VyIGJ1aWxkIGRpcmVjdG9yeSBiZXR3ZWVuIGNhbGxzCiAgICAjIENvcnJlY3RuZXNzIGNvbWVzIGZpcnN0LCB0aGVuIG9wdGltaXphdGlvbiBsYXRlcgogICAgX19maWxlX18gPSBzZXR1cF9zY3JpcHQKICAgIF9fbmFtZV9fID0gJ19fbWFpbl9fJwogICAgZiA9IGdldGF0dHIodG9rZW5pemUsICdvcGVuJywgb3BlbikoX19maWxlX18pCiAgICBjb2RlID0gZi5yZWFkKCkucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpCiAgICBmLmNsb3NlKCkKICAgIGV4ZWMoY29tcGlsZShjb2RlLCBfX2ZpbGVfXywgJ2V4ZWMnKSwgbG9jYWxzKCkpCgoKZGVmIF9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncyk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBjb25maWdfc2V0dGluZ3Mgb3Ige30KICAgIGNvbmZpZ19zZXR0aW5ncy5zZXRkZWZhdWx0KCctLWdsb2JhbC1vcHRpb24nLCBbXSkKICAgIHJldHVybiBjb25maWdfc2V0dGluZ3MKCgpkZWYgX2dldF9idWlsZF9yZXF1aXJlcyhjb25maWdfc2V0dGluZ3MpOgogICAgY29uZmlnX3NldHRpbmdzID0gX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgcmVxdWlyZW1lbnRzID0gWydzZXR1cHRvb2xzJywgJ3doZWVsJ10KCiAgICBzeXMuYXJndiA9IHN5cy5hcmd2WzoxXSArIFsnZWdnX2luZm8nXSArIFwKICAgICAgICBjb25maWdfc2V0dGluZ3NbIi0tZ2xvYmFsLW9wdGlvbiJdCiAgICB0cnk6CiAgICAgICAgd2l0aCBEaXN0cmlidXRpb24ucGF0Y2goKToKICAgICAgICAgICAgX3J1bl9zZXR1cCgpCiAgICBleGNlcHQgU2V0dXBSZXF1aXJlbWVudHNFcnJvciBhcyBlOgogICAgICAgIHJlcXVpcmVtZW50cyArPSBlLnNwZWNpZmllcnMKCiAgICByZXR1cm4gcmVxdWlyZW1lbnRzCgoKZGVmIF9nZXRfaW1tZWRpYXRlX3N1YmRpcmVjdG9yaWVzKGFfZGlyKToKICAgIHJldHVybiBbbmFtZSBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKGFfZGlyKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihhX2RpciwgbmFtZSkpXQoKCmRlZiBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3doZWVsKGNvbmZpZ19zZXR0aW5ncz1Ob25lKToKICAgIGNvbmZpZ19zZXR0aW5ncyA9IF9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKICAgIHJldHVybiBfZ2V0X2J1aWxkX3JlcXVpcmVzKGNvbmZpZ19zZXR0aW5ncykKCgpkZWYgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdChjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICByZXR1cm4gX2dldF9idWlsZF9yZXF1aXJlcyhjb25maWdfc2V0dGluZ3MpCgoKZGVmIHByZXBhcmVfbWV0YWRhdGFfZm9yX2J1aWxkX3doZWVsKG1ldGFkYXRhX2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ2Rpc3RfaW5mbycsICctLWVnZy1iYXNlJywgbWV0YWRhdGFfZGlyZWN0b3J5XQogICAgX3J1bl9zZXR1cCgpCiAgICAKICAgIGRpc3RfaW5mb19kaXJlY3RvcnkgPSBtZXRhZGF0YV9kaXJlY3RvcnkKICAgIHdoaWxlIFRydWU6ICAgIAogICAgICAgIGRpc3RfaW5mb3MgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKGRpc3RfaW5mb19kaXJlY3RvcnkpCiAgICAgICAgICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyldCgogICAgICAgIGlmIGxlbihkaXN0X2luZm9zKSA9PSAwIGFuZCBcCiAgICAgICAgICAgICAgICBsZW4oX2dldF9pbW1lZGlhdGVfc3ViZGlyZWN0b3JpZXMoZGlzdF9pbmZvX2RpcmVjdG9yeSkpID09IDE6CiAgICAgICAgICAgIGRpc3RfaW5mb19kaXJlY3RvcnkgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBkaXN0X2luZm9fZGlyZWN0b3J5LCBvcy5saXN0ZGlyKGRpc3RfaW5mb19kaXJlY3RvcnkpWzBdKQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBhc3NlcnQgbGVuKGRpc3RfaW5mb3MpID09IDEKICAgICAgICBicmVhawoKICAgICMgUEVQIDUxNyByZXF1aXJlcyB0aGF0IHRoZSAuZGlzdC1pbmZvIGRpcmVjdG9yeSBiZSBwbGFjZWQgaW4gdGhlCiAgICAjIG1ldGFkYXRhX2RpcmVjdG9yeS4gVG8gY29tcGx5LCB3ZSBNVVNUIGNvcHkgdGhlIGRpcmVjdG9yeSB0byB0aGUgcm9vdAogICAgaWYgZGlzdF9pbmZvX2RpcmVjdG9yeSAhPSBtZXRhZGF0YV9kaXJlY3Rvcnk6CiAgICAgICAgc2h1dGlsLm1vdmUoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0X2luZm9fZGlyZWN0b3J5LCBkaXN0X2luZm9zWzBdKSwKICAgICAgICAgICAgbWV0YWRhdGFfZGlyZWN0b3J5KQogICAgICAgIHNodXRpbC5ybXRyZWUoZGlzdF9pbmZvX2RpcmVjdG9yeSwgaWdub3JlX2Vycm9ycz1UcnVlKQoKICAgIHJldHVybiBkaXN0X2luZm9zWzBdCgoKZGVmIGJ1aWxkX3doZWVsKHdoZWVsX2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzPU5vbmUsCiAgICAgICAgICAgICAgICBtZXRhZGF0YV9kaXJlY3Rvcnk9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICB3aGVlbF9kaXJlY3RvcnkgPSBvcy5wYXRoLmFic3BhdGgod2hlZWxfZGlyZWN0b3J5KQogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ2JkaXN0X3doZWVsJ10gKyBcCiAgICAgICAgY29uZmlnX3NldHRpbmdzWyItLWdsb2JhbC1vcHRpb24iXQogICAgX3J1bl9zZXR1cCgpCiAgICBpZiB3aGVlbF9kaXJlY3RvcnkgIT0gJ2Rpc3QnOgogICAgICAgIHNodXRpbC5ybXRyZWUod2hlZWxfZGlyZWN0b3J5KQogICAgICAgIHNodXRpbC5jb3B5dHJlZSgnZGlzdCcsIHdoZWVsX2RpcmVjdG9yeSkKCiAgICB3aGVlbHMgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKHdoZWVsX2RpcmVjdG9yeSkKICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcud2hsJyldCgogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIHJldHVybiB3aGVlbHNbMF0KCgpkZWYgYnVpbGRfc2Rpc3Qoc2Rpc3RfZGlyZWN0b3J5LCBjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICBzZGlzdF9kaXJlY3RvcnkgPSBvcy5wYXRoLmFic3BhdGgoc2Rpc3RfZGlyZWN0b3J5KQogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ3NkaXN0J10gKyBcCiAgICAgICAgY29uZmlnX3NldHRpbmdzWyItLWdsb2JhbC1vcHRpb24iXQogICAgX3J1bl9zZXR1cCgpCiAgICBpZiBzZGlzdF9kaXJlY3RvcnkgIT0gJ2Rpc3QnOgogICAgICAgIHNodXRpbC5ybXRyZWUoc2Rpc3RfZGlyZWN0b3J5KQogICAgICAgIHNodXRpbC5jb3B5dHJlZSgnZGlzdCcsIHNkaXN0X2RpcmVjdG9yeSkKCiAgICBzZGlzdHMgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKHNkaXN0X2RpcmVjdG9yeSkKICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcudGFyLmd6JyldCgogICAgYXNzZXJ0IGxlbihzZGlzdHMpID09IDEKICAgIHJldHVybiBzZGlzdHNbMF0KUEsDBBQAAAAAAAAAIQD1hnppAAABAAAAAQA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY2xpLTMyLmV4ZU1akAADAAAABAAAAP//AAC4AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAOH7oOALQJzSG4AUzNIVRoaXMgcHJvZ3JhbSBjYW5ub3QgYmUgcnVuIGluIERPUyBtb2RlLg0NCiQAAAAAAAAAWVP+ah0ykDkdMpA5HTKQOTr06zkeMpA5HTKROUYykDmgfQY5GTKQOQNg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hMF44kAAagfB+ARZiYWU/f//O8EPh60JAAD/JIXfMkAAg43o/f///4m1kP3//4m1wP3//4m1zP3//4m10P3//4m18P3//4m1yP3//+l2CQAAD77Cg+ggdEqD6AN0NoPoCHQlSEh0FYPoAw+FVwkAAION8P3//wjpSwkAAION8P3//wTpPwkAAION8P3//wHpMwkAAIGN8P3//4AAAADpJAkAAION8P3//wLpGAkAAID6KnUsg8cEib3c/f//i3/8O/6Jvcz9//8PjfkIAACDjfD9//8E953M/f//6ecIAACLhcz9//9rwAoPvsqNRAjQiYXM/f//6cwIAACJtej9///pwQgAAID6KnUmg8cEib3c/f//i3/8O/6Jvej9//8PjaIIAACDjej9////6ZYIAACLhej9//9rwAoPvsqNRAjQiYXo/f//6XsIAACA+kl0VYD6aHREgPpsdBiA+ncPhWMIAACBjfD9//8ACAAA6VQIAACAO2x1FkOBjfD9//8AEAAAiZ3E/f//6TkIAACDjfD9//8Q6S0IAACDjfD9//8g6SEIAACKAzw2dR2AewE0dRdDQ4GN8P3//wCAAACJncT9///p/gcAADwzdR2AewEydRdDQ4Gl8P3///9///+JncT9///p3QcAADxkD4TVBwAAPGkPhM0HAAA8bw+ExQcAADx1D4S9BwAAPHgPhLUHAAA8WA+ErQcAAIm1lP3//42FpP3//1APtsJQibXI/f//6KQ8AABZhcCKhe/9//9ZdCKLjbT9//+Ntdj9///opPv//4oDQ4mdxP3//4TAD4Sk/P//i420/f//jbXY/f//6IL7///pTQcAAA++woP4ZA+P6AEAAA+EeQIAAIP4Uw+P8gAAAA+EgAAAAIPoQXQQSEh0WEhIdAhISA+FkgUAAIDCIMeFkP3//wEAAACIle/9//+DjfD9//9AObXo/f//jZ30/f//uAACAACJneT9//+JhaD9//8PjUgCAADHhej9//8GAAAA6aUCAAD3hfD9//8wCAAAD4WYAAAAgY3w/f//AAgAAOmJAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3c/f//i3/8ib3k/f//D4SxBAAAO/51C6GUEkEAiYXk/f//i4Xk/f//x4XI/f//AQAAAOl/BAAAg+hYD4TaAgAASEh0eSvBD4Qn////SEgPhZ4EAACDxwT3hfD9//8QCAAAib3c/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F4P3//1Do5zoAAIPEEIXAdB/HhcD9//8BAAAA6xOKR/yIhfT9///HheD9//8BAAAAjYX0/f//iYXk/f//6TUEAACLB4PHBIm93P3//zvGdDuLSAQ7znQ094Xw/f//AAgAAA+/AImN5P3//3QUmSvC0fjHhcj9//8BAAAA6fADAACJtcj9///p5QMAAKGQEkEAiYXk/f//UOheOAAAWenOAwAAg/hwD4/7AQAAD4TjAQAAg/hlD4y8AwAAg/hnD440/v//g/hpdHGD+G50KIP4bw+FoAMAAPaF8P3//4DHheD9//8IAAAAdGGBjfD9//8AAgAA61WLN4PHBIm93P3//+jXNwAAhcAPhC/6///2hfD9//8gdAxmi4XY/f//ZokG6wiLhdj9//+JBseFwP3//wEAAADppgQAAION8P3//0DHheD9//8KAAAAi43w/f//98EAgAAAD4SpAQAAiweLVwSDxwjp1QEAAHURgPpndWXHhej9//8BAAAA61k5hej9//9+BomF6P3//4G96P3//6MAAAB+P4u16P3//4HGXQEAAFboHgsAAIqV7/3//1mJhbz9//+FwHQQiYXk/f//ibWg/f//i9jrCseF6P3//6MAAAAz9osHg8cIiYWI/f//i0f8iYWM/f//jYWk/f//UP+1kP3//w++wv+16P3//4m93P3//1D/taD9//+NhYj9//9TUP81WBxBAOg9IAAAWf/Qi73w/f//g8QcgeeAAAAAdCA5tej9//91GI2FpP3//1BT/zVkHEEA6A4gAABZ/9BZWYC97/3//2d1HDv+dRiNhaT9//9QU/81YBxBAOjpHwAAWf/QWVmAOy11EYGN8P3//wABAABDiZ3k/f//U+kD/v//x4Xo/f//CAAAAImNuP3//+skg+hzD4S2/P//SEgPhIn+//+D6AMPhbYBAADHhbj9//8nAAAA9oXw/f//gMeF4P3//xAAAAAPhGn+//+Khbj9//8EUcaF1P3//zCIhdX9///HhdD9//8CAAAA6UX+///3wQAQAAAPhUv+//+DxwT2wSB0GIm93P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJvdz9///2wUB0GzvWfxd8BDvGcxH32IPSAPfagY3w/f//AAEAAPeF8P3//wCQAACL2ov4dQIz24O96P3//wB9DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8cLw3UGIYXQ/f//jXXzi4Xo/f///43o/f//hcB/BovHC8N0LYuF4P3//5lSUFNX6IA3AACDwTCD+TmJnaD9//+L+IvafgYDjbj9//+IDk7rvY1F8yvGRveF8P3//wACAACJheD9//+JteT9//90YYXAdAeLzoA5MHRW/43k/f//i43k/f//xgEwQOs+SWY5MHQGQEA7znX0K4Xk/f//0fjrKDv+dQuhkBJBAImF5P3//4uF5P3//+sHSYA4AHQFQDvOdfUrheT9//+JheD9//+DvcD9//8AD4VcAQAAi4Xw/f//qEB0MqkAAQAAdAnGhdT9//8t6xioAXQJxoXU/f//K+sLqAJ0EcaF1P3//yDHhdD9//8BAAAAi53M/f//K53g/f//K53Q/f//9oXw/f//DHUX/7W0/f//jYXY/f//U2og6HD1//+DxAz/tdD9//+LvbT9//+Nhdj9//+NjdT9///odvX///aF8P3//whZdBv2hfD9//8EdRJXU2owjYXY/f//6C71//+DxAyDvcj9//8Ai4Xg/f//dGaFwH5ii7Xk/f//iYWg/f//D7cG/42g/f//UGoGjUX0UI2FmP3//0ZQRuiBNQAAg8QQhcB1KDmFmP3//3Qg/7WY/f//jYXY/f//jU306PH0//+DvaD9//8AWXW16xyDjdj9////6xOLjeT9//9QjYXY/f//6Mr0//9Zg73Y/f//AHwb9oXw/f//BHQSV1NqII2F2P3//+iC9P//g8QMg728/f//AHQT/7W8/f//6AQIAACDpbz9//8AWYudxP3//4oDiIXv/f//hMB0E4uNlP3//4u93P3//4rQ6eH1//+AvbD9//8AdAqLhaz9//+DYHD9i4XY/f//i038X14zzVvoBuz//8nDkOoqQADrKEAAGylAAHkpQADFKUAA0ClAABYqQABEK0AAalRoUPVAAOhlBAAAM/+JffyNRZxQ/xVA4EAAx0X8/v///2pAaiBeVuh1BgAAWVk7xw+EFAIAAKOgKkEAiTWQKkEAjYgACAAA6zDGQAQAgwj/xkAFCol4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xgiB/mgVQQB85l5bw4v/VYvsi0UI/zTFSBRBAP8VHOBAAF3Dagxo2PVAAOhe+f//M/9HiX3kM9s5HXQpQQB1GOi0GQAAah7oAhgAAGj/AAAA6IDj//9ZWYt1CI009UgUQQA5HnQEi8frbmoY6An7//9Zi/g7+3UP6MX4///HAAwAAAAzwOtRagroWQAAAFmJXfw5HnUsaKAPAABX6HQgAABZWYXAdRdX6P77//9Z6I/4///HAAwAAACJXeTrC4k+6wdX6OP7//9Zx0X8/v///+gJAAAAi0Xk6Pb4///DagroKP///1nDi/9Vi+yLRQhWjTTFSBRBAIM+AHUTUOgi////WYXAdQhqEeh04v//Wf82/xUY4EAAXl3Dagxo+PVAAOho+P//i00IM/87z3YuauBYM9L38TtFDBvAQHUf6P/3///HAAwAAABXV1dXV+iH9///g8QUM8Dp1QAAAA+vTQyL8Yl1CDv3dQMz9kYz24ld5IP+4Hdpgz2EKkEAA3VLg8YPg+bwiXUMi0UIOwVwKkEAdzdqBOhM////WYl9/P91COjoNQAAWYlF5MdF/P7////oXwAAAItd5DvfdBH/dQhXU+g22///g8QMO991YVZqCP81dClBAP8VZOBAAIvYO991TDk9gClBAHQzVuiSHwAAWYXAD4Vy////i0UQO8cPhFD////HAAwAAADpRf///zP/i3UMagTo8P3//1nDO991DYtFEDvHdAbHAAwAAACLw+ic9///w1WL7IPsBIl9/It9CItNDMHpB2YP78DrCI2kJAAAAACQZg9/B2YPf0cQZg9/RyBmD39HMGYPf0dAZg9/R1BmD39HYGYPf0dwjb+AAAAASXXQi338i+Vdw1WL7IPsEIl9/ItFCJmL+DP6K/qD5w8z+iv6hf91PItNEIvRg+J/iVX0O8p0EivKUVDoc////4PECItFCItV9IXSdEUDRRArwolF+DPAi334i03086qLRQjrLvffg8cQiX3wM8CLfQiLTfDzqotF8ItNCItVEAPIK9BSagBR6H7///+DxAyLRQiLffyL5V3DagxoGPZAAOhk9v//g2X8AGYPKMHHReQBAAAA6yOLReyLAIsAPQUAAMB0Cj0dAADAdAMzwMMzwEDDi2Xog2XkAMdF/P7///+LReToZvb//8OL/1WL7IPsGDPAU4lF/IlF9IlF+FOc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//+NhUjl//87TRBzOYuVPOX///+FPOX//4oSQYD6CnUQ/4Uw5f//xgANQP+FROX//4gQQP+FROX//4G9ROX///8TAABywovYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhEICAACLhSzl//8BhTjl//87ww+MOgIAAIuFPOX//yuFNOX//ztFEA+CTP///+kgAgAAiYVE5f//gPsCD4XRAAAAOU0QD4ZNAgAA6waLtSjl//+LjUTl//+DpTzl//8AK4005f//jYVI5f//O00Qc0aLlUTl//+DhUTl//8CD7cSQUFmg/oKdRaDhTDl//8Cag1bZokYQECDhTzl//8Cg4U85f//AmaJEEBAgb085f///hMAAHK1i9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EYgEAAIuFLOX//wGFOOX//zvDD4xaAQAAi4VE5f//K4U05f//O0UQD4I/////6UABAAA5TRAPhnwBAACLjUTl//+DpTzl//8AK4005f//agKNhUj5//9eO00QczyLlUTl//8PtxIBtUTl//8DzmaD+gp1DmoNW2aJGAPGAbU85f//AbU85f//ZokQA8aBvTzl//+oBgAAcr8z9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbDgQACL2DveD4SXAAAAagCNhSzl//9Qi8MrxlCNhDXw6///UIuFKOX//4sA/zQH/xWY4EAAhcB0DAO1LOX//zvef8vrDP8VXOBAAImFQOX//zvef1yLhUTl//8rhTTl//+JhTjl//87RRAPggr////rP2oAjY0s5f//Uf91EP+1NOX///8w/xWY4EAAhcB0FYuFLOX//4OlQOX//wCJhTjl///rDP8VXOBAAImFQOX//4O9OOX//wB1bIO9QOX//wB0LWoFXjm1QOX//3UU6Ba3///HAAkAAADoHrf//4kw6z//tUDl///oIrf//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOjWtv//xwAcAAAA6N62//+DIACDyP/rDIuFOOX//yuFMOX//19bi038M81e6Gie///Jw2oQaOj3QADo6Lb//4tFCIP4/nUb6KK2//+DIADoh7b//8cACQAAAIPI/+mdAAAAM/87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6E6v////NuhHr////3Yg6D+v////diToN6////92KOgvr////3Ys6Cev////djDoH6////92NOgXr////3Yc6A+v////djjoB6////92POj/rv//g8RA/3ZA6PSu////dkTo7K7///92SOjkrv///3ZM6Nyu////dlDo1K7///92VOjMrv///3ZY6MSu////dlzovK7///92YOi0rv///3Zk6Kyu////dmjopK7///92bOicrv///3Zw6JSu////dnTojK7///92eOiErv///3Z86Hyu//+DxED/toAAAADobq7///+2hAAAAOhjrv///7aIAAAA6Fiu////towAAADoTa7///+2kAAAAOhCrv///7aUAAAA6Deu////tpgAAADoLK7///+2nAAAAOghrv///7agAAAA6Bau////tqQAAADoC67///+2qAAAAOgArv//g8QsXl3Di/9Vi+xWi3UIhfZ0NYsGOwVIHUEAdAdQ6N2t//9Zi0YEOwVMHUEAdAdQ6Mut//9Zi3YIOzVQHUEAdAdW6Lmt//9ZXl3Di/9Vi+xWi3UIhfZ0fotGDDsFVB1BAHQHUOiXrf//WYtGEDsFWB1BAHQHUOiFrf//WYtGFDsFXB1BAHQHUOhzrf//WYtGGDsFYB1BAHQHUOhhrf//WYtGHDsFZB1BAHQHUOhPrf//WYtGIDsFaB1BAHQHUOg9rf//WYt2JDs1bB1BAHQHVugrrf//WV5dw4v/VYvsi0UIUzPbVlc7w3QHi30MO/t3G+ihqf//ahZeiTBTU1NTU+gqqf//g8QUi8brPIt1EDvzdQSIGOvai9A4GnQEQk91+Dv7dO6KDogKQkY6y3QDT3XzO/t1EIgY6Fqp//9qIlmJCIvx67UzwF9eW13DzMzMzMzMVYvsVjPAUFBQUFBQUFCLVQyNSQCKAgrAdAmDwgEPqwQk6/GLdQiDyf+NSQCDwQGKBgrAdAmDxgEPowQkc+6LwYPEIF7Jw4v/VYvsU1aLdQgz21c5XRR1EDvzdRA5XQx1EjPAX15bXcM783QHi30MO/t3G+jMqP//ahZeiTBTU1NTU+hVqP//g8QUi8br1TldFHUEiB7ryotVEDvTdQSIHuvRg30U/4vGdQ+KCogIQEI6y3QeT3Xz6xmKCogIQEI6y3QIT3QF/00Ude45XRR1AogYO/t1i4N9FP91D4tF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AABDYW5ub3Qgb3BlbiAlcwoALXNjcmlwdC5weQAAQ29yRXhpdFByb2Nlc3MAAG0AcwBjAG8AcgBlAGUALgBkAGwAbAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAAAAAAGAAAGAAEAABAAAwYABgIQBEVFRQUFBQUFNTAAUAAAAAAoIDhQWAcIADcwMFdQBwAAICAIAAAAAAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAKghQQAAIkEAAAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAEVuY29kZVBvaW50ZXIAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxv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b3dTdGF0aW9uAEdldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEAAABHZXRMYXN0QWN0aXZlUG9wdXAAAEdldEFjdGl2ZVdpbmRvdwBNZXNzYWdlQm94QQBVU0VSMzIuRExMAABTdW5Nb25UdWVXZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAAQ09OT1VUJAAuY29tAAAAAC5leGUAAAAALmJhdAAAAAAuY21kAAAAAC5cAABTeXN0ZW1Sb290AAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAA0DcAACBpAAAQmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADXGEAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALwjQAAAAAAA/v///wAAAADM////AAAAAP7///+pJUAAvSVAAAAAAAD+////AAAAAIz///8AAAAA/v///zw1QABANUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAOM6QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAsTtAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAA7PUAAAAAAAAAAAAAHPUAA/v///wAAAADU////AAAAAP7///8AAAAAwD5AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADzP0AAAAAAAP7///8AAAAA1P///wAAAAD+////HUFAADlBQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAALUdAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAD7SkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAGtOQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAArVBAAP7///8AAAAAvFBAAP7///8AAAAA2P///wAAAAD+////AAAAAG9SQAD+////AAAAAHtSQAD+////AAAAANT///8AAAAA/v///wAAAAA1WUAAAAAAAP7///8AAAAA2P///wAAAAD+////21pAAO9aQAAAAAAA/v///wAAAADY////AAAAAP7///8tW0AAMVtAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAACIXkAAAAAAAP7///8AAAAA0P///wAAAAD+////GF9AAC9fQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAKWpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAA6bEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAD55QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAToFAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAAvgkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAACSVQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAvZdAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABUoUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAMulQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAkadAAAAAAAAAAAAAzaZAAP7///8AAAAA0P///wAAAAD+////AAAAAEyuQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAaMJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAALykAAVPkAAAAAAAAAAAAADgABAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJT6AACw+gAAxvoAANz6AADu+gAABvsAABz7AAA0+wAATPsAAGD7AABo+wAAevsAAIj7AACa+wAArPsAALz7AADK+wAA3PsAAPT7AAAI/AAAHPwAADj8AABW/AAAavwAAHr8AACG/AAAkvwAAJ78AAC2/AAAzvwAANj8AADk/AAA9vwAAAT9AAAQ/QAAHv0AACj9AAA4/QAATv0AAFr9AABq/QAAkv0AAKz9AADE/QAA3v0AAPT9AAAO/gAAHP4AACr+AABE/gAAVP4AAGr+AACE/gAAkP4AAJ7+AACu/gAAvv4AAND+AADk/gAA9P4AAAr/AAAa/wAALP8AAD7/AABQ/wAAYv8AAG7/AAB8/wAAjP8AAKL/AACy/wAAwv8AAND/AADi/wAA9P8AABwAAQAoAAEAOAABAEoAAQAAAAAAUgFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAAMYBR2V0RXhpdENvZGVQcm9jZXNzAABuBFdhaXRGb3JTaW5nbGVPYmplY3QAlQBDcmVhdGVQcm9jZXNzQQAArwNTZXRDb25zb2xlQ3RybEhhbmRsZXIA9QFHZXRNb2R1bGVGaWxlTmFtZUEAANoARW50ZXJDcml0aWNhbFNlY3Rpb24AAPQCTGVhdmVDcml0aWNhbFNlY3Rpb24AAPoBR2V0TW9kdWxlSGFuZGxlVwAAKwRTbGVlcAAiAkdldFByb2NBZGRyZXNzAAAFAUV4aXRQcm9jZXNzAHABR2V0Q29tbWFuZExpbmVBAPADU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADYAUdldEZpbGVUeXBlADwCR2V0U3RhcnR1cEluZm9BAL8ARGVsZXRlQ3JpdGljYWxTZWN0aW9uADcEVGVybWluYXRlUHJvY2VzcwAAqgFHZXRDdXJyZW50UHJvY2VzcwBIBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAHwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA1gJJc0RlYnVnZ2VyUHJlc2VudADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXAFHZXRDUEluZm8AxQJJbnRlcmxvY2tlZEluY3JlbWVudAAAwQJJbnRlcmxvY2tlZERlY3JlbWVudAAAUwFHZXRBQ1AAABQCR2V0T0VNQ1AAAOACSXNWYWxpZENvZGVQYWdlAD4EVGxzR2V0VmFsdWUAPARUbHNBbGxvYwAAPwRUbHNTZXRWYWx1ZQA9BFRsc0ZyZWUA9ANTZXRMYXN0RXJyb3IAAK4BR2V0Q3VycmVudFRocmVhZElkAACXBFdyaXRlRmlsZQD2AkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEsBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwAFHZXRFbnZpcm9ubWVudFN0cmluZ3MATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCEBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwgFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACkAkhlYXBDcmVhdGUAAGEEVmlydHVhbEZyZWUAWQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAAqwFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAmgNSdGxVbndpbmQAqQJIZWFwUmVBbGxvYwBeBFZpcnR1YWxBbGxvYwAAhAFHZXRDb25zb2xlQ1AAAJYBR2V0Q29uc29sZU1vZGUAAEIBRmx1c2hGaWxlQnVmZmVycwAA5gJMQ01hcFN0cmluZ0EAAB8DTXVsdGlCeXRlVG9XaWRlQ2hhcgDoAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA5wNTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCMBFdyaXRlQ29uc29sZUEAmgFHZXRDb25zb2xlT3V0cHV0Q1AAAJYEV3JpdGVDb25zb2xlVwAGBFNldFN0ZEhhbmRsZQAAeQBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADYA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAbgNSZWFkRmlsZQAA1QNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMoBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMArQQAAAAAAwCtBAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO5kC7sRm/ROojQAABAAAAbOJAAFziQAD/////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AUABAAAAsDgBQAEAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAAAAAAAAcnVudGltZSBlcnJvciAAAA0KAAAAAAAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAAAAAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAAAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAAAAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgAAAAAAAAAAAAAAAAANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAAAAAAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAAAAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAAAAAAB0AAMAEAAAAAAAAAAAAAACWAADABAAAAAAAAAAAAAAAjQAAwAgAAAAAAAAAAAAAAI4AAMAIAAAAAAAAAAAAAACPAADACAAAAAAAAAAAAAAAkAAAwAgAAAAAAAAAAAAAAJEAAMAIAAAAAAAAAAAAAACSAADACAAAAAAAAAAAAAAAkwAAwAgAAAAAAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAA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bGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADbAEVudGVyQ3JpdGljYWxTZWN0aW9uAADuAkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAAC8EU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABgFFeGl0UHJvY2VzcwBxAUdldENvbW1hbmRMaW5lQQCeA1J0bFVud2luZEV4APQDU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADZAUdldEZpbGVUeXBlADwCR2V0U3RhcnR1cEluZm9BAMAARGVsZXRlQ3JpdGljYWxTZWN0aW9uADsEVGVybWluYXRlUHJvY2VzcwAAqwFHZXRDdXJyZW50UHJvY2VzcwBMBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAIwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA0AJJc0RlYnVnZ2VyUHJlc2VudACfA1J0bFZpcnR1YWxVbndpbmQAAJgDUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAkQNSdGxDYXB0dXJlQ29udGV4dADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXQFHZXRDUEluZm8AVAFHZXRBQ1AAABQCR2V0T0VNQ1AAANoCSXNWYWxpZENvZGVQYWdlANcARW5jb2RlUG9pbnRlcgC5AERlY29kZVBvaW50ZXIAQAFGbHNHZXRWYWx1ZQBBAUZsc1NldFZhbHVlAD8BRmxzRnJlZQD4A1NldExhc3RFcnJvcgAArwFHZXRDdXJyZW50VGhyZWFkSWQAAD4BRmxzQWxsb2MAAJsEV3JpdGVGaWxlAPACTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDBAUdldEVudmlyb25tZW50U3RyaW5ncwBNAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIgEV2lkZUNoYXJUb011bHRpQnl0ZQDDAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKoCSGVhcFNldEluZm9ybWF0aW9uAACkAkhlYXBDcmVhdGUAAFMDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKwBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAKkCSGVhcFJlQWxsb2MAhQFHZXRDb25zb2xlQ1AAAJcBR2V0Q29uc29sZU1vZGUAAEMBRmx1c2hGaWxlQnVmZmVycwAA4AJMQ01hcFN0cmluZ0EAABkDTXVsdGlCeXRlVG9XaWRlQ2hhcgDiAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA7ANTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCQBFdyaXRlQ29uc29sZUEAmwFHZXRDb25zb2xlT3V0cHV0Q1AAAJoEV3JpdGVDb25zb2xlVwAKBFNldFN0ZEhhbmRsZQAAegBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADdA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAaANSZWFkRmlsZQAA2gNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMsBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgRQFAAQAAAAAAAAAAAAAA4EUBQAEAAAABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyot8tmSsAAM1dINJm1P//TCkAQAEAAAABAAAAAAAAAAD0AEABAAAA8PMAQAEAAAD//////////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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//+E0g+EHwoAAEODvdj9//8AiZ3E/f//D4wLCgAAisIsIDxYdxEPvsIPvoBY4kAAg+APM/brBDP2M8APvoTBeOJAAGoHwfgEWYmFlP3//zvBD4etCQAA/ySF3zJAAION6P3///+JtZD9//+JtcD9//+Jtcz9//+JtdD9//+JtfD9//+Jtcj9///pdgkAAA++woPoIHRKg+gDdDaD6Ah0JUhIdBWD6AMPhVcJAACDjfD9//8I6UsJAACDjfD9//8E6T8JAACDjfD9//8B6TMJAACBjfD9//+AAAAA6SQJAACDjfD9//8C6RgJAACA+ip1LIPHBIm93P3//4t//Dv+ib3M/f//D435CAAAg43w/f//BPedzP3//+nnCAAAi4XM/f//a8AKD77KjUQI0ImFzP3//+nMCAAAibXo/f//6cEIAACA+ip1JoPHBIm93P3//4t//Dv+ib3o/f//D42iCAAAg43o/f///+mWCAAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+l7CAAAgPpJdFWA+mh0RID6bHQYgPp3D4VjCAAAgY3w/f//AAgAAOlUCAAAgDtsdRZDgY3w/f//ABAAAImdxP3//+k5CAAAg43w/f//EOktCAAAg43w/f//IOkhCAAAigM8NnUdgHsBNHUXQ0OBjfD9//8AgAAAiZ3E/f//6f4HAAA8M3UdgHsBMnUXQ0OBpfD9////f///iZ3E/f//6d0HAAA8ZA+E1QcAADxpD4TNBwAAPG8PhMUHAAA8dQ+EvQcAADx4D4S1BwAAPFgPhK0HAACJtZT9//+NhaT9//9QD7bCUIm1yP3//+ikPAAAWYXAioXv/f//WXQii420/f//jbXY/f//6KT7//+KA0OJncT9//+EwA+EpPz//4uNtP3//4212P3//+iC+///6U0HAAAPvsKD+GQPj+gBAAAPhHkCAACD+FMPj/IAAAAPhIAAAACD6EF0EEhIdFhISHQISEgPhZIFAACAwiDHhZD9//8BAAAAiJXv/f//g43w/f//QDm16P3//42d9P3//7gAAgAAiZ3k/f//iYWg/f//D41IAgAAx4Xo/f//BgAAAOmlAgAA94Xw/f//MAgAAA+FmAAAAIGN8P3//wAIAADpiQAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm93P3//4t//Im95P3//w+EsQQAADv+dQuhlBJBAImF5P3//4uF5P3//8eFyP3//wEAAADpfwQAAIPoWA+E2gIAAEhIdHkrwQ+EJ////0hID4WeBAAAg8cE94Xw/f//EAgAAIm93P3//3QwD7dH/FBoAAIAAI2F9P3//1CNheD9//9Q6Oc6AACDxBCFwHQfx4XA/f//AQAAAOsTikf8iIX0/f//x4Xg/f//AQAAAI2F9P3//4mF5P3//+k1BAAAiweDxwSJvdz9//87xnQ7i0gEO850NPeF8P3//wAIAAAPvwCJjeT9//90FJkrwtH4x4XI/f//AQAAAOnwAwAAibXI/f//6eUDAAChkBJBAImF5P3//1DoXjgAAFnpzgMAAIP4cA+P+wEAAA+E4wEAAIP4ZQ+MvAMAAIP4Zw+ONP7//4P4aXRxg/hudCiD+G8PhaADAAD2hfD9//+Ax4Xg/f//CAAAAHRhgY3w/f//AAIAAOtVizeDxwSJvdz9///o1zcAAIXAD4Qv+v//9oXw/f//IHQMZouF2P3//2aJBusIi4XY/f//iQbHhcD9//8BAAAA6aYEAACDjfD9//9Ax4Xg/f//CgAAAIuN8P3///fBAIAAAA+EqQEAAIsHi1cEg8cI6dUBAAB1EYD6Z3Vlx4Xo/f//AQAAAOtZOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj+Ltej9//+Bxl0BAABW6B4LAACKle/9//9ZiYW8/f//hcB0EImF5P3//4m1oP3//4vY6wrHhej9//+jAAAAM/aLB4PHCImFiP3//4tH/ImFjP3//42FpP3//1D/tZD9//8PvsL/tej9//+Jvdz9//9Q/7Wg/f//jYWI/f//U1D/NVgcQQDoPSAAAFn/0Iu98P3//4PEHIHngAAAAHQgObXo/f//dRiNhaT9//9QU/81ZBxBAOgOIAAAWf/QWVmAve/9//9ndRw7/nUYjYWk/f//UFP/NWAcQQDo6R8AAFn/0FlZgDstdRGBjfD9//8AAQAAQ4md5P3//1PpA/7//8eF6P3//wgAAACJjbj9///rJIPocw+Etvz//0hID4SJ/v//g+gDD4W2AQAAx4W4/f//JwAAAPaF8P3//4DHheD9//8QAAAAD4Rp/v//ioW4/f//BFHGhdT9//8wiIXV/f//x4XQ/f//AgAAAOlF/v//98EAEAAAD4VL/v//g8cE9sEgdBiJvdz9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3c/f//9sFAdBs71n8XfAQ7xnMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi9qL+HUCM9uDvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vHC8N1BiGF0P3//41184uF6P3///+N6P3//4XAfwaLxwvDdC2LheD9//+ZUlBTV+iANwAAg8Ewg/k5iZ2g/f//i/iL2n4GA424/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXg/f//ibXk/f//dGGFwHQHi86AOTB0Vv+N5P3//4uN5P3//8YBMEDrPklmOTB0BkBAO8519CuF5P3//9H46yg7/nULoZASQQCJheT9//+LheT9///rB0mAOAB0BUA7znX1K4Xk/f//iYXg/f//g73A/f//AA+FXAEAAIuF8P3//6hAdDKpAAEAAHQJxoXU/f//LesYqAF0CcaF1P3//yvrC6gCdBHGhdT9//8gx4XQ/f//AQAAAIudzP3//yud4P3//yud0P3///aF8P3//wx1F/+1tP3//42F2P3//1NqIOhw9f//g8QM/7XQ/f//i720/f//jYXY/f//jY3U/f//6Hb1///2hfD9//8IWXQb9oXw/f//BHUSV1NqMI2F2P3//+gu9f//g8QMg73I/f//AIuF4P3//3RmhcB+You15P3//4mFoP3//w+3Bv+NoP3//1BqBo1F9FCNhZj9//9GUEbogTUAAIPEEIXAdSg5hZj9//90IP+1mP3//42F2P3//41N9Ojx9P//g72g/f//AFl1tescg43Y/f///+sTi43k/f//UI2F2P3//+jK9P//WYO92P3//wB8G/aF8P3//wR0EldTaiCNhdj9///ogvT//4PEDIO9vP3//wB0E/+1vP3//+gECAAAg6W8/f//AFmLncT9//+KA4iF7/3//4TAdBOLjZT9//+Lvdz9//+K0Onh9f//gL2w/f//AHQKi4Ws/f//g2Bw/YuF2P3//4tN/F9eM81b6Abs///Jw5DqKkAA6yhAABspQAB5KUAAxSlAANApQAAWKkAARCtAAGpUaFD1QADoZQQAADP/iX38jUWcUP8VQOBA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AIuFNOX//4mNQOX//4TbD4XKAAAAiYU85f//OU0QD4YgAwAA6waLtSjl//+LjTzl//+DpUTl//8AK4005f//jYVI5f//O00QczmLlTzl////hTzl//+KEkGA+gp1EP+FMOX//8YADUD/hUTl//+IEED/hUTl//+BvUTl////EwAAcsKL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RCAgAAi4Us5f//AYU45f//O8MPjDoCAACLhTzl//8rhTTl//87RRAPgkz////pIAIAAImFROX//4D7Ag+F0QAAADlNEA+GTQIAAOsGi7Uo5f//i41E5f//g6U85f//ACuNNOX//42FSOX//ztNEHNGi5VE5f//g4VE5f//Ag+3EkFBZoP6CnUWg4Uw5f//AmoNW2aJGEBAg4U85f//AoOFPOX//wJmiRBAQIG9POX///4TAABytYvYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhGIBAACLhSzl//8BhTjl//87ww+MWgEAAIuFROX//yuFNOX//ztFEA+CP////+lAAQAAOU0QD4Z8AQAAi41E5f//g6U85f//ACuNNOX//2oCjYVI+f//XjtNEHM8i5VE5f//D7cSAbVE5f//A85mg/oKdQ5qDVtmiRgDxgG1POX//wG1POX//2aJEAPGgb085f//qAYAAHK/M/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xWw4EAAi9g73g+ElwAAAGoAjYUs5f//UIvDK8ZQjYQ18Ov//1CLhSjl//+LAP80B/8VmOBAAIXAdAwDtSzl//873n/L6wz/FVzgQACJhUDl//873n9ci4VE5f//K4U05f//iYU45f//O0UQD4IK////6z9qAI2NLOX//1H/dRD/tTTl////MP8VmOBAAIXAdBWLhSzl//+DpUDl//8AiYU45f//6wz/FVzgQACJhUDl//+DvTjl//8AdWyDvUDl//8AdC1qBV45tUDl//91FOgWt///xwAJAAAA6B63//+JMOs//7VA5f//6CK3//9Z6zGLtSjl//+LBvZEBwRAdA+LhTTl//+AOBp1BDPA6yTo1rb//8cAHAAAAOjetv//gyAAg8j/6wyLhTjl//8rhTDl//9fW4tN/DPNXuhonv//ycNqEGjo90AA6Oi2//+LRQiD+P51G+iitv//gyAA6Ie2///HAAkAAACDyP/pnQAAADP/O8d8CDsFkCpBAHIh6Hm2//+JOOhftv//xwAJAAAAV1dXV1fo57X//4PEFOvJi8jB+QWNHI2gKkEAi/CD5h/B5gaLCw++TDEEg+EBdL9Q6DkkAABZiX38iwP2RDAEAXQW/3UQ/3UM/3UI6C74//+DxAyJReTrFuj8tf//xwAJAAAA6AS2//+JOINN5P/HRfz+////6AkAAACLReToaLb//8P/dQjogyQAAFnDahBoCPhAAOgMtv//i0UIg/j+dRPos7X//8cACQAAAIPI/+mqAAAAM9s7w3wIOwWQKkEAchrokrX//8cACQAAAFNTU1NT6Bq1//+DxBTr0IvIwfkFjTyNoCpBAIvwg+YfweYGiw8PvkwOBIPhAXTGUOhsIwAAWYld/IsH9kQGBAF0Mf91COjgIgAAWVD/FeTgQACFwHUL/xVc4EAAiUXk6wOJXeQ5XeR0Gegxtf//i03kiQjoFLX//8cACQAAAINN5P/HRfz+////6AkAAACLReToh7X//8P/dQjooiMAAFnDi/9Vi+yD7BBTM9s5XQh1HOjWtP//U1NTU1PHABYAAADoXrT//4PEFDPA62pWi3UMO/N1GuiytP//U1NTU1PHABYAAADoOrT//4PEFOsFOXUIcgQzwOs+/3UQjU3w6Fac//+LTfSNRv85WQh0HEg5RQh3Cg+2EPZECh0EdfCLzivIg+EBK/FOi8Y4Xfx0B4tN+INhcP1eW8nDi/9Vi+xqAP91DP91COhV////g8QMXcOL/1WL7IPsFFMz21aLdQg5XRR1EDvzdRA5XQx1EDPA6ecBAAA783QFOV0Mdx7oCbT//2oWXlNTU1NTiTDokrP//4PEFIvG6cABAAA5XRR1BIge68lXi30QO/t1Hoge6Niz//9qFl5TU1NTU4kw6GGz//+DxBTpKAEAAP91GI1N7OiDm///i0XwOVgIdRX/dRRX/3UMVuijCgAAg8QQ6UwBAACDfRT/i1UMi8Z1D4oPiAhARzrLdB9KdfPrGooPiAhARzrLdAhKdAX/TRR17jldFHUDiBhAO9MPhcgAAAA4H3QGg30UAXU1jXj/iX38O/5yHo1F7FCLRfwPtgBQ6DC///9ZWYXAdAj/Tfw5dfxz4ovHK0X8qAEPhcMAAACDfRT/dVqLRQyD+AF2Oo18Bv6JfRQ7/nIhjUXsUItFFA+2AFDo7L7//1lZhcB0CP9NFDl1FHPii0UMi88rTRT2wQF0BIgf6wSIXAb/OF34dAeLRfSDYHD9alBY6Y0AAACIHui3sv//aiJeU1NTU1OJMOhAsv//g8QUOF34dAeLRfSDYHD9i8brZIvIK86D+QJ8TY14/ol9FDv+ch6NRexQi0UUD7YAUOhpvv//WVmFwHQI/00UOXUUc+KLxytFFKgBdByIH+hUsv//i8hqKliJAThd+HQXi030g2Fw/esOOF34dAeLRfSDYHD9M8BfXlvJw4v/VYvsi0UIhcB0EoPoCIE43d0AAHUHUOh4tf//WV3Di/9Vi+yD7BShgBJBADPFiUX8U1Yz21eL8TkdhClBAHU4U1Mz/0dXaGTqQABoAAEAAFP/FfDgQACFwHQIiT2EKUEA6xX/FVzgQACD+Hh1CscFhClBAAIAAAA5XRR+IotNFItFEEk4GHQIQDvLdfaDyf+LRRQrwUg7RRR9AUCJRRShhClBAIP4Ag+ErAEAADvDD4SkAQAAg/gBD4XMAQAAiV34OV0gdQiLBotABIlFIIs17OBAADPAOV0kU1P/dRQPlcD/dRCNBMUBAAAAUP91IP/Wi/g7+w+EjwEAAH5DauAz0lj394P4AnI3jUQ/CD0ABAAAdxPojiMAAIvEO8N0HMcAzMwAAOsRUOgM5P//WTvDdAnHAN3dAACDwAiJRfTrA4ld9Dld9A+EPgEAAFf/dfT/dRT/dRBqAf91IP/WhcAPhOMAAACLNfDgQABTU1f/dfT/dQz/dQj/1ovIiU34O8sPhMIAAAD3RQwABAAAdCk5XRwPhLAAAAA7TRwPj6cAAAD/dRz/dRhX/3X0/3UM/3UI/9bpkAAAADvLfkVq4DPSWPfxg/gCcjmNRAkIPQAEAAB3FujPIgAAi/Q783RqxwbMzAAAg8YI6xpQ6Erj//9ZO8N0CccA3d0AAIPACIvw6wIz9jvzdEH/dfhWV/919P91DP91CP8V8OBAAIXAdCJTUzldHHUEU1PrBv91HP91GP91+FZT/3Ug/xWw4EAAiUX4Vui4/f//Wf919Oiv/f//i0X4WelZAQAAiV30iV3wOV0IdQiLBotAFIlFCDldIHUIiwaLQASJRSD/dQjoICAAAFmJReyD+P91BzPA6SEBAAA7RSAPhNsAAABTU41NFFH/dRBQ/3Ug6D4gAACDxBiJRfQ7w3TUizXo4EAAU1P/dRRQ/3UM/3UI/9aJRfg7w3UHM/bptwAAAH49g/jgdziDwAg9AAQAAHcW6LkhAACL/Dv7dN3HB8zMAACDxwjrGlDoNOL//1k7w3QJxwDd3QAAg8AIi/jrAjP/O/t0tP91+FNX6MCS//+DxAz/dfhX/3UU/3X0/3UM/3UI/9aJRfg7w3UEM/brJf91HI1F+P91GFBX/3Ug/3Xs6I0fAACL8Il18IPEGPfeG/YjdfhX6I38//9Z6xr/dRz/dRj/dRT/dRD/dQz/dQj/FejgQACL8Dld9HQJ/3X06Pix//9Zi0XwO8N0DDlFGHQHUOjlsf//WYvGjWXgX15bi038M83oJ5b//8nDi/9Vi+yD7BD/dQiNTfDoIZb///91KI1N8P91JP91IP91HP91GP91FP91EP91DOgo/P//g8QggH38AHQHi034g2Fw/cnDi/9Vi+xRUaGAEkEAM8WJRfyhiClBAFNWM9tXi/k7w3U6jUX4UDP2RlZoZOpAAFb/FfjgQACFwHQIiTWIKUEA6zT/FVzgQACD+Hh1CmoCWKOIKUEA6wWhiClBAIP4Ag+EzwAAADvDD4THAAAAg/gBD4XoAAAAiV34OV0YdQiLB4tABIlFGIs17OBAADPAOV0gU1P/dRAPlcD/dQyNBMUBAAAAUP91GP/Wi/g7+w+EqwAAAH48gf/w//9/dzSNRD8IPQAEAAB3E+jSHwAAi8Q7w3QcxwDMzAAA6xFQ6FDg//9ZO8N0CccA3d0AAIPACIvYhdt0aY0EP1BqAFPo3pD//4PEDFdT/3UQ/3UMagH/dRj/1oXAdBH/dRRQU/91CP8V+OBAAIlF+FPoyfr//4tF+FnrdTP2OV0cdQiLB4tAFIlFHDldGHUIiweLQASJRRj/dRzoQR0AAFmD+P91BDPA60c7RRh0HlNTjU0QUf91DFD/dRjoaR0AAIvwg8QYO/N03Il1DP91FP91EP91DP91CP91HP8V9OBAAIv4O/N0B1bo5q///1mLx41l7F9eW4tN/DPN6CiU///Jw4v/VYvsg+wQ/3UIjU3w6CKU////dSSNTfD/dSD/dRz/dRj/dRT/dRD/dQzoFv7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4SBAQAA/3YE6Hav////dgjobq////92DOhmr////3YQ6F6v////dhToVq////92GOhOr////zboR6////92IOg/r////3Yk6Dev////dijoL6////92LOgnr////3Yw6B+v////djToF6////92HOgPr////3Y46Aev////djzo/67//4PEQP92QOj0rv///3ZE6Oyu////dkjo5K7///92TOjcrv///3ZQ6NSu////dlTozK7///92WOjErv///3Zc6Lyu////dmDotK7///92ZOisrv///3Zo6KSu////dmzonK7///92cOiUrv///3Z06Iyu////dnjohK7///92fOh8rv//g8RA/7aAAAAA6G6u////toQAAADoY67///+2iAAAAOhYrv///7aMAAAA6E2u////tpAAAADoQq7///+2lAAAAOg3rv///7aYAAAA6Cyu////tpwAAADoIa7///+2oAAAAOgWrv///7akAAAA6Auu////tqgAAADoAK7//4PELF5dw4v/VYvsVot1CIX2dDWLBjsFSB1BAHQHUOjdrf//WYtGBDsFTB1BAHQHUOjLrf//WYt2CDs1UB1BAHQHVui5rf//WV5dw4v/VYvsVot1CIX2dH6LRgw7BVQdQQB0B1Dol63//1mLRhA7BVgdQQB0B1Doha3//1mLRhQ7BVwdQQB0B1Doc63//1mLRhg7BWAdQQB0B1DoYa3//1mLRhw7BWQdQQB0B1DoT63//1mLRiA7BWgdQQB0B1DoPa3//1mLdiQ7NWwdQQB0B1boK63//1leXcOL/1WL7ItFCFMz21ZXO8N0B4t9DDv7dxvooan//2oWXokwU1NTU1PoKqn//4PEFIvG6zyLdRA783UEiBjr2ovQOBp0BEJPdfg7+3Tuig6ICkJGOst0A0918zv7dRCIGOhaqf//aiJZiQiL8eu1M8BfXltdw8zMzMzMzFWL7FYzwFBQUFBQUFBQi1UMjUkAigIKwHQJg8IBD6sEJOvxi3UIg8n/jUkAg8EBigYKwHQJg8YBD6MEJHPui8GDxCBeycOL/1WL7FNWi3UIM9tXOV0UdRA783UQOV0MdRIzwF9eW13DO/N0B4t9DDv7dxvozKj//2oWXokwU1NTU1PoVaj//4PEFIvG69U5XRR1BIge68qLVRA703UEiB7r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YyAlcwAAAENhbm5vdCBmaW5kIFB5dGhvbiBleGVjdXRhYmxlICVzCgAAACMhcHl0aG9uLmV4ZQAAAAAjIQAAQ2Fubm90IG9wZW4gJXMKAC1zY3JpcHQucHkAAENvckV4aXRQcm9jZXNzAABtAHMAYwBvAHIAZQBlAC4AZABsAGwAAAAoAG4AdQBsAGwAKQAAAAAAKG51bGwpAAAAAAAABgAABgABAAAQAAMGAAYCEARFRUUFBQUFBTUwAFAAAAAAKCA4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAAB4cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAACoIUEAACJBAAAAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAABFbmNvZGVQb2ludGVyAAAASwBFAFIATgBFAEwAMwAyAC4ARABMAEwAAAAAAERlY29kZVBvaW50ZXIAAABGbHNGcmVlAEZsc1NldFZhbHVlAEZsc0dldFZhbHVlAEZsc0FsbG9jAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBz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YXkATW9uZGF5AABTdW5kYXkAAFNhdABGcmkAVGh1AFdlZABUdWUATW9uAFN1bgBHZXRQcm9jZXNzV2luZG93U3RhdGlvbgBHZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25BAAAAR2V0TGFzdEFjdGl2ZVBvcHVwAABHZXRBY3RpdmVXaW5kb3cATWVzc2FnZUJveEEAVVNFUjMyLkRMTAAAU3VuTW9uVHVlV2VkVGh1RnJpU2F0AAAASmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjAAAAAENPTk9VVCQALmNvbQAAAAAuZXhlAAAAAC5iYXQAAAAALmNtZAAAAAAuXAAAU3lzdGVtUm9vdAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIASQQDQ9EAAAwAAANA3AAAgaQAAEJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA1xhAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAC8I0AAAAAAAP7///8AAAAAzP///wAAAAD+////qSVAAL0lQAAAAAAA/v///wAAAACM////AAAAAP7///88NUAAQDVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADjOkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAALE7QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAOz1AAAAAAAAAAAAABz1AAP7///8AAAAA1P///wAAAAD+////AAAAAMA+QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA8z9AAAAAAAD+////AAAAANT///8AAAAA/v///x1BQAA5QUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAC1HQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAA+0pAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABrTkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAK1QQAD+////AAAAALxQQAD+////AAAAANj///8AAAAA/v///wAAAABvUkAA/v///wAAAAB7UkAA/v///wAAAADU////AAAAAP7///8AAAAANVlAAAAAAAD+////AAAAANj///8AAAAA/v///9taQADvWkAAAAAAAP7///8AAAAA2P///wAAAAD+////LVtAADFbQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAAiF5AAAAAAAD+////AAAAAND///8AAAAA/v///xhfQAAvX0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAClqQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAOmxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAA+eUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAE6BQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAL4JAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAAklUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL2XQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAVKFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADLpUAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAAJGnQAAAAAAAAAAAAM2mQAD+////AAAAAND///8AAAAA/v///wAAAABMrkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAGjCQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAC8pAAFT5AAAAAAAAAAAAAA4AAQAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAACU+gAAsPoAAMb6AADc+gAA7voAAAb7AAAc+wAANPsAAEz7AABg+wAAaPsAAHr7AACI+wAAmvsAAKz7AAC8+wAAyvsAANz7AAD0+wAACPwAABz8AAA4/AAAVvwAAGr8AAB6/AAAhvwAAJL8AACe/AAAtvwAAM78AADY/AAA5PwAAPb8AAAE/QAAEP0AAB79AAAo/QAAOP0AAE79AABa/QAAav0AAJL9AACs/QAAxP0AAN79AAD0/QAADv4AABz+AAAq/gAARP4AAFT+AABq/gAAhP4AAJD+AACe/gAArv4AAL7+AADQ/gAA5P4AAPT+AAAK/wAAGv8AACz/AAA+/wAAUP8AAGL/AABu/wAAfP8AAIz/AACi/wAAsv8AAML/AADQ/wAA4v8AAPT/AAAcAAEAKAABADgAAQBKAAEAAAAAAFIBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADGAUdldEV4aXRDb2RlUHJvY2VzcwAAbgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJUAQ3JlYXRlUHJvY2Vzc0EAAK8DU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADaAEVudGVyQ3JpdGljYWxTZWN0aW9uAAD0AkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAACsEU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABQFFeGl0UHJvY2VzcwBwAUdldENvbW1hbmRMaW5lQQDwA1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2AFHZXRGaWxlVHlwZQA8AkdldFN0YXJ0dXBJbmZvQQC/AERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA3BFRlcm1pbmF0ZVByb2Nlc3MAAKoBR2V0Q3VycmVudFByb2Nlc3MASARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAB8EU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANYCSXNEZWJ1Z2dlclByZXNlbnQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAFwBR2V0Q1BJbmZvAMUCSW50ZXJsb2NrZWRJbmNyZW1lbnQAAMECSW50ZXJsb2NrZWREZWNyZW1lbnQAAFMBR2V0QUNQAAAUAkdldE9FTUNQAADgAklzVmFsaWRDb2RlUGFnZQA+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOcDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAjARXcml0ZUNvbnNvbGVBAJoBR2V0Q29uc29sZU91dHB1dENQAACWBFdyaXRlQ29uc29sZVcABgRTZXRTdGRIYW5kbGUAAHkAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA2ANTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAG4DUmVhZEZpbGUAANUDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADKAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAK0EAAAAAAMArQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATuZAu7EZv0TqI0AAAQAAAGziQABc4kAA/////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAAngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsAAAAYBwAADAAAAAwAAAAIAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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dCcsICdzZXRvcHQnLCAndGVzdCcsICdpbnN0YWxsX2VnZ19pbmZvJywgJ2luc3RhbGxfc2NyaXB0cycsCiAgICAncmVnaXN0ZXInLCAnYmRpc3Rfd2luaW5zdCcsICd1cGxvYWRfZG9jcycsICd1cGxvYWQnLCAnYnVpbGRfY2xpYicsCiAgICAnZGlzdF9pbmZvJywKXQoKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdCBpbXBvcnQgYmRpc3QKaW1wb3J0IHN5cwoKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGluc3RhbGxfc2NyaXB0cwoKaWYgJ2VnZycgbm90IGluIGJkaXN0LmZvcm1hdF9jb21tYW5kczoKICAgIGJkaXN0LmZvcm1hdF9jb21tYW5kWydlZ2cnXSA9ICgnYmRpc3RfZWdnJywgIlB5dGhvbiAuZWdnIGZpbGUiKQogICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRzLmFwcGVuZCgnZWdnJykKCmRlbCBiZGlzdCwgc3lzClBLAwQUAAAAAAAAACEAUPgj8noJAAB6CQAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHlmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgpmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZSwgY29uZmlnX2ZpbGUKCgpkZWYgc2hxdW90ZShhcmcpOgogICAgIiIiUXVvdGUgYW4gYXJndW1lbnQgZm9yIGxhdGVyIHBhcnNpbmcgYnkgc2hsZXguc3BsaXQoKSIiIgogICAgZm9yIGMgaW4gJyInLCAiJyIsICJcXCIsICIjIjoKICAgICAgICBpZiBjIGluIGFyZzoKICAgICAgICAgICAgcmV0dXJuIHJlcHIoYXJnKQogICAgaWYgYXJnLnNwbGl0KCkgIT0gW2FyZ106CiAgICAgICAgcmV0dXJuIHJlcHIoYXJnKQogICAgcmV0dXJuIGFyZwoKCmNsYXNzIGFsaWFzKG9wdGlvbl9iYXNlKToKICAgICIiIkRlZmluZSBhIHNob3J0Y3V0IHRoYXQgaW52b2tlcyBvbmUgb3IgbW9yZSBjb21tYW5kcyIiIgoKICAgIGRlc2NyaXB0aW9uID0gImRlZmluZSBhIHNob3J0Y3V0IHRvIGludm9rZSBvbmUgb3IgbW9yZSBjb21tYW5kcyIKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gVHJ1ZQoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3JlbW92ZScsICdyJywgJ3JlbW92ZSAodW5zZXQpIHRoZSBhbGlhcycpLAogICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucwoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9wdGlvbl9iYXNlLmJvb2xlYW5fb3B0aW9ucyArIFsncmVtb3ZlJ10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuYXJncyA9IE5vbmUKICAgICAgICBzZWxmLnJlbW92ZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5yZW1vdmUgYW5kIGxlbihzZWxmLmFyZ3MpICE9IDE6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBleGFjdGx5IG9uZSBhcmd1bWVudCAodGhlIGFsaWFzIG5hbWUpIHdoZW4gIgogICAgICAgICAgICAgICAgInVzaW5nIC0tcmVtb3ZlIgogICAgICAgICAgICApCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBhbGlhc2VzID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdhbGlhc2VzJykKCiAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKICAgICAgICAgICAgcHJpbnQoIkNvbW1hbmQgQWxpYXNlcyIpCiAgICAgICAgICAgIHByaW50KCItLS0tLS0tLS0tLS0tLS0iKQogICAgICAgICAgICBmb3IgYWxpYXMgaW4gYWxpYXNlczoKICAgICAgICAgICAgICAgIHByaW50KCJzZXR1cC5weSBhbGlhcyIsIGZvcm1hdF9hbGlhcyhhbGlhcywgYWxpYXNlcykpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBlbGlmIGxlbihzZWxmLmFyZ3MpID09IDE6CiAgICAgICAgICAgIGFsaWFzLCA9IHNlbGYuYXJncwogICAgICAgICAgICBpZiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBOb25lCiAgICAgICAgICAgIGVsaWYgYWxpYXMgaW4gYWxpYXNlczoKICAgICAgICAgICAgICAgIHByaW50KCJzZXR1cC5weSBhbGlhcyIsIGZvcm1hdF9hbGlhcyhhbGlhcywgYWxpYXNlcykpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50KCJObyBhbGlhcyBkZWZpbml0aW9uIGZvdW5kIGZvciAlciIgJSBhbGlhcykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFsaWFzID0gc2VsZi5hcmdzWzBdCiAgICAgICAgICAgIGNvbW1hbmQgPSAnICcuam9pbihtYXAoc2hxdW90ZSwgc2VsZi5hcmdzWzE6XSkpCgogICAgICAgIGVkaXRfY29uZmlnKHNlbGYuZmlsZW5hbWUsIHsnYWxpYXNlcyc6IHthbGlhczogY29tbWFuZH19LCBzZWxmLmRyeV9ydW4pCgoKZGVmIGZvcm1hdF9hbGlhcyhuYW1lLCBhbGlhc2VzKToKICAgIHNvdXJjZSwgY29tbWFuZCA9IGFsaWFzZXNbbmFtZV0KICAgIGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgnZ2xvYmFsJyk6CiAgICAgICAgc291cmNlID0gJy0tZ2xvYmFsLWNvbmZpZyAnCiAgICBlbGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgndXNlcicpOgogICAgICAgIHNvdXJjZSA9ICctLXVzZXItY29uZmlnICcKICAgIGVsaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdsb2NhbCcpOgogICAgICAgIHNvdXJjZSA9ICcnCiAgICBlbHNlOgogICAgICAgIHNvdXJjZSA9ICctLWZpbGVuYW1lPSVyJyAlIHNvdXJjZQogICAgcmV0dXJuIHNvdXJjZSArIG5hbWUgKyAnICcgKyBjb21tYW5kClBLAwQUAAAAAAAAACEAScwroVtGAABbRgAARAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5IiIic2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZwoKQnVpbGQgLmVnZyBkaXN0cmlidXRpb25zIiIiCgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IHJlbW92ZV90cmVlLCBta3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIHR5cGVzIGltcG9ydCBDb2RlVHlwZQppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBtYXJzaGFsCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZ2V0X2J1aWxkX3BsYXRmb3JtLCBEaXN0cmlidXRpb24sIGVuc3VyZV9kaXJlY3RvcnkKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBFbnRyeVBvaW50CmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgp0cnk6CiAgICAjIFB5dGhvbiAyLjcgb3IgPj0zLjIKICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGF0aCwgZ2V0X3B5dGhvbl92ZXJzaW9uCgogICAgZGVmIF9nZXRfcHVyZWxpYigpOgogICAgICAgIHJldHVybiBnZXRfcGF0aCgicHVyZWxpYiIpCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl9saWIsIGdldF9weXRob25fdmVyc2lvbgoKICAgIGRlZiBfZ2V0X3B1cmVsaWIoKToKICAgICAgICByZXR1cm4gZ2V0X3B5dGhvbl9saWIoRmFsc2UpCgoKZGVmIHN0cmlwX21vZHVsZShmaWxlbmFtZSk6CiAgICBpZiAnLicgaW4gZmlsZW5hbWU6CiAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKVswXQogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJ21vZHVsZScpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi02XQogICAgcmV0dXJuIGZpbGVuYW1lCgpkZWYgc29ydGVkX3dhbGsoZGlyKToKICAgICIiIkRvIG9zLndhbGsgaW4gYSByZXByb2R1Y2libGUgd2F5LAogICAgaW5kZXBlbmRlbnQgb2YgaW5kZXRlcm1pbmlzdGljIGZpbGVzeXN0ZW0gcmVhZGRpciBvcmRlcgogICAgIiIiCiAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhkaXIpOgogICAgICAgIGRpcnMuc29ydCgpCiAgICAgICAgZmlsZXMuc29ydCgpCiAgICAgICAgeWllbGQgYmFzZSwgZGlycywgZmlsZXMKCmRlZiB3cml0ZV9zdHViKHJlc291cmNlLCBweWZpbGUpOgogICAgX3N0dWJfdGVtcGxhdGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgZGVmIF9fYm9vdHN0cmFwX18oKToKICAgICAgICAgICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18sIF9fZmlsZV9fCiAgICAgICAgICAgIGltcG9ydCBzeXMsIHBrZ19yZXNvdXJjZXMsIGltcAogICAgICAgICAgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sICVyKQogICAgICAgICAgICBfX2xvYWRlcl9fID0gTm9uZTsgZGVsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18KICAgICAgICAgICAgaW1wLmxvYWRfZHluYW1pYyhfX25hbWVfXyxfX2ZpbGVfXykKICAgICAgICBfX2Jvb3RzdHJhcF9fKCkKICAgICAgICAiIiIpLmxzdHJpcCgpCiAgICB3aXRoIG9wZW4ocHlmaWxlLCAndycpIGFzIGY6CiAgICAgICAgZi53cml0ZShfc3R1Yl90ZW1wbGF0ZSAlIHJlc291cmNlKQoKCmNsYXNzIGJkaXN0X2VnZyhDb21tYW5kKToKICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhbiBcImVnZ1wiIGRpc3RyaWJ1dGlvbiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdiZGlzdC1kaXI9JywgJ2InLAogICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAogICAgICAgICgncGxhdC1uYW1lPScsICdwJywgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfYnVpbGRfcGxhdGZvcm0oKSksCiAgICAgICAgKCdleGNsdWRlLXNvdXJjZS1maWxlcycsIE5vbmUsCiAgICAgICAgICJyZW1vdmUgYWxsIC5weSBmaWxlcyBmcm9tIHRoZSBnZW5lcmF0ZWQgZWdnIiksCiAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCiAgICAgICAgICJrZWVwIHRoZSBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUgYXJvdW5kIGFmdGVyICIgKwogICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksCiAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCiAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLAogICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbCiAgICAgICAgJ2tlZXAtdGVtcCcsICdza2lwLWJ1aWxkJywgJ2V4Y2x1ZGUtc291cmNlLWZpbGVzJwogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCiAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSAwCiAgICAgICAgc2VsZi5lZ2dfb3V0cHV0ID0gTm9uZQogICAgICAgIHNlbGYuZXhjbHVkZV9zb3VyY2VfZmlsZXMgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgZWlfY21kID0gc2VsZi5laV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIHNlbGYuZWdnX2luZm8gPSBlaV9jbWQuZWdnX2luZm8KCiAgICAgICAgaWYgc2VsZi5iZGlzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgYmRpc3RfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ2VnZycpCgogICAgICAgIGlmIHNlbGYucGxhdF9uYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYucGxhdF9uYW1lID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQoKICAgICAgICBpZiBzZWxmLmVnZ19vdXRwdXQgaXMgTm9uZToKCiAgICAgICAgICAgICMgQ29tcHV0ZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGVnZwogICAgICAgICAgICBiYXNlbmFtZSA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAogICAgICAgICAgICAgICAgZ2V0X3B5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKSBhbmQgc2VsZi5wbGF0X25hbWUKICAgICAgICAgICAgKS5lZ2dfbmFtZSgpCgogICAgICAgICAgICBzZWxmLmVnZ19vdXRwdXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgYmFzZW5hbWUgKyAnLmVnZycpCgogICAgZGVmIGRvX2luc3RhbGxfZGF0YShzZWxmKToKICAgICAgICAjIEhhY2sgZm9yIHBhY2thZ2VzIHRoYXQgaW5zdGFsbCBkYXRhIHRvIGluc3RhbGwncyAtLWluc3RhbGwtbGliCiAgICAgICAgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKS5pbnN0YWxsX2xpYiA9IHNlbGYuYmRpc3RfZGlyCgogICAgICAgIHNpdGVfcGFja2FnZXMgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoX2dldF9wdXJlbGliKCkpKQogICAgICAgIG9sZCwgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMsIFtdCgogICAgICAgIGZvciBpdGVtIGluIG9sZDoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCB0dXBsZSkgYW5kIGxlbihpdGVtKSA9PSAyOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2FicyhpdGVtWzBdKToKICAgICAgICAgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoaXRlbVswXSkKICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkID0gb3MucGF0aC5ub3JtY2FzZShyZWFscGF0aCkKICAgICAgICAgICAgICAgICAgICBpZiBub3JtYWxpemVkID09IHNpdGVfcGFja2FnZXMgb3Igbm9ybWFsaXplZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICBzaXRlX3BhY2thZ2VzICsgb3Muc2VwCiAgICAgICAgICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHJlYWxwYXRoW2xlbihzaXRlX3BhY2thZ2VzKSArIDE6XSwgaXRlbVsxXQogICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBlbHNlOiByYWlzZSA/Pz8KICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcy5hcHBlbmQoaXRlbSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBwYWNrYWdlIGRhdGEgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICAgICAgc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfZGF0YScsIGZvcmNlPTAsIHJvb3Q9Tm9uZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzID0gb2xkCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBbc2VsZi5lZ2dfb3V0cHV0XQoKICAgIGRlZiBjYWxsX2NvbW1hbmQoc2VsZiwgY21kbmFtZSwgKiprdyk6CiAgICAgICAgIiIiSW52b2tlIHJlaW5pdGlhbGl6ZWQgY29tbWFuZCBgY21kbmFtZWAgd2l0aCBrZXl3b3JkIGFyZ3MiIiIKICAgICAgICBmb3IgZGlybmFtZSBpbiBJTlNUQUxMX0RJUkVDVE9SWV9BVFRSUzoKICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChkaXJuYW1lLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICBrdy5zZXRkZWZhdWx0KCdza2lwX2J1aWxkJywgc2VsZi5za2lwX2J1aWxkKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ2RyeV9ydW4nLCBzZWxmLmRyeV9ydW4pCiAgICAgICAgY21kID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZChjbWRuYW1lLCAqKmt3KQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kbmFtZSkKICAgICAgICByZXR1cm4gY21kCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIEdlbmVyYXRlIG1ldGFkYXRhIGZpcnN0CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgICMgV2UgcnVuIGluc3RhbGxfbGliIGJlZm9yZSBpbnN0YWxsX2RhdGEsIGJlY2F1c2Ugc29tZSBkYXRhIGhhY2tzCiAgICAgICAgIyBwdWxsIHRoZWlyIGRhdGEgcGF0aCBmcm9tIHRoZSBpbnN0YWxsX2xpYiBjb21tYW5kLgogICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIGxpYnJhcnkgY29kZSB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgIGluc3RjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpCiAgICAgICAgb2xkX3Jvb3QgPSBpbnN0Y21kLnJvb3QKICAgICAgICBpbnN0Y21kLnJvb3QgPSBOb25lCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2NfbGlicmFyaWVzKCkgYW5kIG5vdCBzZWxmLnNraXBfYnVpbGQ6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2NsaWInKQogICAgICAgIGNtZCA9IHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX2xpYicsIHdhcm5fZGlyPTApCiAgICAgICAgaW5zdGNtZC5yb290ID0gb2xkX3Jvb3QKCiAgICAgICAgYWxsX291dHB1dHMsIGV4dF9vdXRwdXRzID0gc2VsZi5nZXRfZXh0X291dHB1dHMoKQogICAgICAgIHNlbGYuc3R1YnMgPSBbXQogICAgICAgIHRvX2NvbXBpbGUgPSBbXQogICAgICAgIGZvciAocCwgZXh0X25hbWUpIGluIGVudW1lcmF0ZShleHRfb3V0cHV0cyk6CiAgICAgICAgICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGV4dF9uYW1lKQogICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsIHN0cmlwX21vZHVsZShmaWxlbmFtZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5weScpCiAgICAgICAgICAgIHNlbGYuc3R1YnMuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nIHN0dWIgbG9hZGVyIGZvciAlcyIsIGV4dF9uYW1lKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgd3JpdGVfc3R1Yihvcy5wYXRoLmJhc2VuYW1lKGV4dF9uYW1lKSwgcHlmaWxlKQogICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgIGV4dF9vdXRwdXRzW3BdID0gZXh0X25hbWUucmVwbGFjZShvcy5zZXAsICcvJykKCiAgICAgICAgaWYgdG9fY29tcGlsZToKICAgICAgICAgICAgY21kLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXM6CiAgICAgICAgICAgIHNlbGYuZG9faW5zdGFsbF9kYXRhKCkKCiAgICAgICAgIyBNYWtlIHRoZSBFR0ctSU5GTyBkaXJlY3RvcnkKICAgICAgICBhcmNoaXZlX3Jvb3QgPSBzZWxmLmJkaXN0X2RpcgogICAgICAgIGVnZ19pbmZvID0gb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwgJ0VHRy1JTkZPJykKICAgICAgICBzZWxmLm1rcGF0aChlZ2dfaW5mbykKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnc2NyaXB0cycpCiAgICAgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHNjcmlwdHMgdG8gJXMiLCBzY3JpcHRfZGlyKQogICAgICAgICAgICBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9zY3JpcHRzJywgaW5zdGFsbF9kaXI9c2NyaXB0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fZXA9MSkKCiAgICAgICAgc2VsZi5jb3B5X21ldGFkYXRhX3RvKGVnZ19pbmZvKQogICAgICAgIG5hdGl2ZV9saWJzID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAibmF0aXZlX2xpYnMudHh0IikKICAgICAgICBpZiBhbGxfb3V0cHV0czoKICAgICAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgJXMiLCBuYXRpdmVfbGlicykKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkobmF0aXZlX2xpYnMpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUgPSBvcGVuKG5hdGl2ZV9saWJzLCAnd3QnKQogICAgICAgICAgICAgICAgbGlic19maWxlLndyaXRlKCdcbicuam9pbihhbGxfb3V0cHV0cykpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUud3JpdGUoJ1xuJykKICAgICAgICAgICAgICAgIGxpYnNfZmlsZS5jbG9zZSgpCiAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShuYXRpdmVfbGlicyk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJyZW1vdmluZyAlcyIsIG5hdGl2ZV9saWJzKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hdGl2ZV9saWJzKQoKICAgICAgICB3cml0ZV9zYWZldHlfZmxhZygKICAgICAgICAgICAgb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwgJ0VHRy1JTkZPJyksIHNlbGYuemlwX3NhZmUoKQogICAgICAgICkKCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sICdkZXBlbmRzLnR4dCcpKToKICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJ2RlcGVuZHMudHh0JyB3aWxsIG5vdCBiZSB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgogICAgICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5leGNsdWRlX3NvdXJjZV9maWxlczoKICAgICAgICAgICAgc2VsZi56YXBfcHlmaWxlcygpCgogICAgICAgICMgTWFrZSB0aGUgYXJjaGl2ZQogICAgICAgIG1ha2VfemlwZmlsZShzZWxmLmVnZ19vdXRwdXQsIGFyY2hpdmVfcm9vdCwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCiAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLCBtb2RlPXNlbGYuZ2VuX2hlYWRlcigpKQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBfdGVtcDoKICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQoKICAgICAgICAjIEFkZCB0byAnRGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMnIHNvIHRoYXQgdGhlICJ1cGxvYWQiIGNvbW1hbmQgd29ya3MKICAgICAgICBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnZGlzdF9maWxlcycsIFtdKS5hcHBlbmQoCiAgICAgICAgICAgICgnYmRpc3RfZWdnJywgZ2V0X3B5dGhvbl92ZXJzaW9uKCksIHNlbGYuZWdnX291dHB1dCkpCgogICAgZGVmIHphcF9weWZpbGVzKHNlbGYpOgogICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAucHkgZmlsZXMgZnJvbSB0ZW1wb3JhcnkgZGlyZWN0b3J5IikKICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gd2Fsa19lZ2coc2VsZi5iZGlzdF9kaXIpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgbmFtZSkKCiAgICAgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nICVzIiwgcGF0aCkKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCdfX3B5Y2FjaGVfXycpOgogICAgICAgICAgICAgICAgICAgIHBhdGhfb2xkID0gcGF0aAoKICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcicoP1A8bmFtZT4uKylcLig/UDxtYWdpYz5bXi5dKylcLnB5YycKICAgICAgICAgICAgICAgICAgICBtID0gcmUubWF0Y2gocGF0dGVybiwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBwYXRoX25ldyA9IG9zLnBhdGguam9pbihiYXNlLCBvcy5wYXJkaXIsIG0uZ3JvdXAoJ25hbWUnKSArICcucHljJykKICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVuYW1pbmcgZmlsZSBmcm9tIFslc10gdG8gWyVzXSIgJSAocGF0aF9vbGQsIHBhdGhfbmV3KSkKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoX25ldykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShwYXRoX29sZCwgcGF0aF9uZXcpCgoKICAgIGRlZiB6aXBfc2FmZShzZWxmKToKICAgICAgICBzYWZlID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3ppcF9zYWZlJywgTm9uZSkKICAgICAgICBpZiBzYWZlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2FmZQogICAgICAgIGxvZy53YXJuKCJ6aXBfc2FmZSBmbGFnIG5vdCBzZXQ7IGFuYWx5emluZyBhcmNoaXZlIGNvbnRlbnRzLi4uIikKICAgICAgICByZXR1cm4gYW5hbHl6ZV9lZ2coc2VsZi5iZGlzdF9kaXIsIHNlbGYuc3R1YnMpCgogICAgZGVmIGdlbl9oZWFkZXIoc2VsZik6CiAgICAgICAgZXBtID0gRW50cnlQb2ludC5wYXJzZV9tYXAoc2VsZi5kaXN0cmlidXRpb24uZW50cnlfcG9pbnRzIG9yICcnKQogICAgICAgIGVwID0gZXBtLmdldCgnc2V0dXB0b29scy5pbnN0YWxsYXRpb24nLCB7fSkuZ2V0KCdlZ2dzZWN1dGFibGUnKQogICAgICAgIGlmIGVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAndycgICMgbm90IGFuIGVnZ3NlY3V0YWJsZSwgZG8gaXQgdGhlIHVzdWFsIHdheS4KCiAgICAgICAgaWYgbm90IGVwLmF0dHJzIG9yIGVwLmV4dHJhczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJlZ2dzZWN1dGFibGUgZW50cnkgcG9pbnQgKCVyKSBjYW5ub3QgaGF2ZSAnZXh0cmFzJyAiCiAgICAgICAgICAgICAgICAib3IgcmVmZXIgdG8gYSBtb2R1bGUiICUgKGVwLCkKICAgICAgICAgICAgKQoKICAgICAgICBweXZlciA9IHN5cy52ZXJzaW9uWzozXQogICAgICAgIHBrZyA9IGVwLm1vZHVsZV9uYW1lCiAgICAgICAgZnVsbCA9ICcuJy5qb2luKGVwLmF0dHJzKQogICAgICAgIGJhc2UgPSBlcC5hdHRyc1swXQogICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmVnZ19vdXRwdXQpCgogICAgICAgIGhlYWRlciA9ICgKICAgICAgICAgICAgIiMhL2Jpbi9zaFxuIgogICAgICAgICAgICAnaWYgWyBgYmFzZW5hbWUgJDBgID0gIiUoYmFzZW5hbWUpcyIgXVxuJwogICAgICAgICAgICAndGhlbiBleGVjIHB5dGhvbiUocHl2ZXIpcyAtYyAiJwogICAgICAgICAgICAiaW1wb3J0IHN5cywgb3M7IHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmFic3BhdGgoJyQwJykpOyAiCiAgICAgICAgICAgICJmcm9tICUocGtnKXMgaW1wb3J0ICUoYmFzZSlzOyBzeXMuZXhpdCglKGZ1bGwpcygpKSIKICAgICAgICAgICAgJyIgIiRAIlxuJwogICAgICAgICAgICAnZWxzZVxuJwogICAgICAgICAgICAnICBlY2hvICQwIGlzIG5vdCB0aGUgY29ycmVjdCBuYW1lIGZvciB0aGlzIGVnZyBmaWxlLlxuJwogICAgICAgICAgICAnICBlY2hvIFBsZWFzZSByZW5hbWUgaXQgYmFjayB0byAlKGJhc2VuYW1lKXMgYW5kIHRyeSBhZ2Fpbi5cbicKICAgICAgICAgICAgJyAgZXhlYyBmYWxzZVxuJwogICAgICAgICAgICAnZmlcbicKICAgICAgICApICUgbG9jYWxzKCkKCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZShzZWxmLmVnZ19vdXRwdXQpLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5lZ2dfb3V0cHV0LCAndycpCiAgICAgICAgICAgIGYud3JpdGUoaGVhZGVyKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICByZXR1cm4gJ2EnCgogICAgZGVmIGNvcHlfbWV0YWRhdGFfdG8oc2VsZiwgdGFyZ2V0X2Rpcik6CiAgICAgICAgIkNvcHkgbWV0YWRhdGEgKGVnZyBpbmZvKSB0byB0aGUgdGFyZ2V0X2RpciIKICAgICAgICAjIG5vcm1hbGl6ZSB0aGUgcGF0aCAoc28gdGhhdCBhIGZvcndhcmQtc2xhc2ggaW4gZWdnX2luZm8gd2lsbAogICAgICAgICMgbWF0Y2ggdXNpbmcgc3RhcnRzd2l0aCBiZWxvdykKICAgICAgICBub3JtX2VnZ19pbmZvID0gb3MucGF0aC5ub3JtcGF0aChzZWxmLmVnZ19pbmZvKQogICAgICAgIHByZWZpeCA9IG9zLnBhdGguam9pbihub3JtX2VnZ19pbmZvLCAnJykKICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLmVpX2NtZC5maWxlbGlzdC5maWxlczoKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2RpciwgcGF0aFtsZW4ocHJlZml4KTpdKQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShwYXRoLCB0YXJnZXQpCgogICAgZGVmIGdldF9leHRfb3V0cHV0cyhzZWxmKToKICAgICAgICAiIiJHZXQgYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIHRvIEMgZXh0ZW5zaW9ucyBpbiB0aGUgb3V0cHV0IGRpc3RybyIiIgoKICAgICAgICBhbGxfb3V0cHV0cyA9IFtdCiAgICAgICAgZXh0X291dHB1dHMgPSBbXQoKICAgICAgICBwYXRocyA9IHtzZWxmLmJkaXN0X2RpcjogJyd9CiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKHNlbGYuYmRpc3RfZGlyKToKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSlbMV0ubG93ZXIoKSBpbiBOQVRJVkVfRVhURU5TSU9OUzoKICAgICAgICAgICAgICAgICAgICBhbGxfb3V0cHV0cy5hcHBlbmQocGF0aHNbYmFzZV0gKyBmaWxlbmFtZSkKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGRpcnM6CiAgICAgICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZW5hbWUpXSA9IChwYXRoc1tiYXNlXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSArICcvJykKCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9leHQnKQogICAgICAgICAgICBmb3IgZXh0IGluIGJ1aWxkX2NtZC5leHRlbnNpb25zOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IGJ1aWxkX2NtZC5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBidWlsZF9jbWQuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKS5zdGFydHN3aXRoKCdkbC0nKToKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsIGZpbGVuYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKCiAgICAgICAgcmV0dXJuIGFsbF9vdXRwdXRzLCBleHRfb3V0cHV0cwoKCk5BVElWRV9FWFRFTlNJT05TID0gZGljdC5mcm9ta2V5cygnLmRsbCAuc28gLmR5bGliIC5weWQnLnNwbGl0KCkpCgoKZGVmIHdhbGtfZWdnKGVnZ19kaXIpOgogICAgIiIiV2FsayBhbiB1bnBhY2tlZCBlZ2cncyBjb250ZW50cywgc2tpcHBpbmcgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSIiIgogICAgd2Fsa2VyID0gc29ydGVkX3dhbGsoZWdnX2RpcikKICAgIGJhc2UsIGRpcnMsIGZpbGVzID0gbmV4dCh3YWxrZXIpCiAgICBpZiAnRUdHLUlORk8nIGluIGRpcnM6CiAgICAgICAgZGlycy5yZW1vdmUoJ0VHRy1JTkZPJykKICAgIHlpZWxkIGJhc2UsIGRpcnMsIGZpbGVzCiAgICBmb3IgYmRmIGluIHdhbGtlcjoKICAgICAgICB5aWVsZCBiZGYKCgpkZWYgYW5hbHl6ZV9lZ2coZWdnX2Rpciwgc3R1YnMpOgogICAgIyBjaGVjayBmb3IgZXhpc3RpbmcgZmxhZyBpbiBFR0ctSU5GTwogICAgZm9yIGZsYWcsIGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihlZ2dfZGlyLCAnRUdHLUlORk8nLCBmbikpOgogICAgICAgICAgICByZXR1cm4gZmxhZwogICAgaWYgbm90IGNhbl9zY2FuKCk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBzYWZlID0gVHJ1ZQogICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHdhbGtfZWdnKGVnZ19kaXIpOgogICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKSBvciBuYW1lLmVuZHN3aXRoKCcucHl3Jyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbGlmIG5hbWUuZW5kc3dpdGgoJy5weWMnKSBvciBuYW1lLmVuZHN3aXRoKCcucHlvJyk6CiAgICAgICAgICAgICAgICAjIGFsd2F5cyBzY2FuLCBldmVuIGlmIHdlIGFscmVhZHkga25vdyB3ZSdyZSBub3Qgc2FmZQogICAgICAgICAgICAgICAgc2FmZSA9IHNjYW5fbW9kdWxlKGVnZ19kaXIsIGJhc2UsIG5hbWUsIHN0dWJzKSBhbmQgc2FmZQogICAgcmV0dXJuIHNhZmUKCgpkZWYgd3JpdGVfc2FmZXR5X2ZsYWcoZWdnX2Rpciwgc2FmZSk6CiAgICAjIFdyaXRlIG9yIHJlbW92ZSB6aXAgc2FmZXR5IGZsYWcgZmlsZShzKQogICAgZm9yIGZsYWcsIGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgogICAgICAgIGZuID0gb3MucGF0aC5qb2luKGVnZ19kaXIsIGZuKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKICAgICAgICAgICAgaWYgc2FmZSBpcyBOb25lIG9yIGJvb2woc2FmZSkgIT0gZmxhZzoKICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKICAgICAgICBlbGlmIHNhZmUgaXMgbm90IE5vbmUgYW5kIGJvb2woc2FmZSkgPT0gZmxhZzoKICAgICAgICAgICAgZiA9IG9wZW4oZm4sICd3dCcpCiAgICAgICAgICAgIGYud3JpdGUoJ1xuJykKICAgICAgICAgICAgZi5jbG9zZSgpCgoKc2FmZXR5X2ZsYWdzID0gewogICAgVHJ1ZTogJ3ppcC1zYWZlJywKICAgIEZhbHNlOiAnbm90LXppcC1zYWZlJywKfQoKCmRlZiBzY2FuX21vZHVsZShlZ2dfZGlyLCBiYXNlLCBuYW1lLCBzdHVicyk6CiAgICAiIiJDaGVjayB3aGV0aGVyIG1vZHVsZSBwb3NzaWJseSB1c2VzIHVuc2FmZS1mb3ItemlwZmlsZSBzdHVmZiIiIgoKICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsIG5hbWUpCiAgICBpZiBmaWxlbmFtZVs6LTFdIGluIHN0dWJzOgogICAgICAgIHJldHVybiBUcnVlICAjIEV4dGVuc2lvbiBtb2R1bGUKICAgIHBrZyA9IGJhc2VbbGVuKGVnZ19kaXIpICsgMTpdLnJlcGxhY2Uob3Muc2VwLCAnLicpCiAgICBtb2R1bGUgPSBwa2cgKyAocGtnIGFuZCAnLicgb3IgJycpICsgb3MucGF0aC5zcGxpdGV4dChuYW1lKVswXQogICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgICAgICBza2lwID0gOCAgIyBza2lwIG1hZ2ljICYgZGF0ZQogICAgZWxzZToKICAgICAgICBza2lwID0gMTIgICMgc2tpcCBtYWdpYyAmIGRhdGUgJiBmaWxlIHNpemUKICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncmInKQogICAgZi5yZWFkKHNraXApCiAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpCiAgICBmLmNsb3NlKCkKICAgIHNhZmUgPSBUcnVlCiAgICBzeW1ib2xzID0gZGljdC5mcm9ta2V5cyhpdGVyX3N5bWJvbHMoY29kZSkpCiAgICBmb3IgYmFkIGluIFsnX19maWxlX18nLCAnX19wYXRoX18nXToKICAgICAgICBpZiBiYWQgaW4gc3ltYm9sczoKICAgICAgICAgICAgbG9nLndhcm4oIiVzOiBtb2R1bGUgcmVmZXJlbmNlcyAlcyIsIG1vZHVsZSwgYmFkKQogICAgICAgICAgICBzYWZlID0gRmFsc2UKICAgIGlmICdpbnNwZWN0JyBpbiBzeW1ib2xzOgogICAgICAgIGZvciBiYWQgaW4gWwogICAgICAgICAgICAnZ2V0c291cmNlJywgJ2dldGFic2ZpbGUnLCAnZ2V0c291cmNlZmlsZScsICdnZXRmaWxlJwogICAgICAgICAgICAnZ2V0c291cmNlbGluZXMnLCAnZmluZHNvdXJjZScsICdnZXRjb21tZW50cycsICdnZXRmcmFtZWluZm8nLAogICAgICAgICAgICAnZ2V0aW5uZXJmcmFtZXMnLCAnZ2V0b3V0ZXJmcmFtZXMnLCAnc3RhY2snLCAndHJhY2UnCiAgICAgICAgXToKICAgICAgICAgICAgaWYgYmFkIGluIHN5bWJvbHM6CiAgICAgICAgICAgICAgICBsb2cud2FybigiJXM6IG1vZHVsZSBNQVkgYmUgdXNpbmcgaW5zcGVjdC4lcyIsIG1vZHVsZSwgYmFkKQogICAgICAgICAgICAgICAgc2FmZSA9IEZhbHNlCiAgICByZXR1cm4gc2FmZQoKCmRlZiBpdGVyX3N5bWJvbHMoY29kZSk6CiAgICAiIiJZaWVsZCBuYW1lcyBhbmQgc3RyaW5ncyB1c2VkIGJ5IGBjb2RlYCBhbmQgaXRzIG5lc3RlZCBjb2RlIG9iamVjdHMiIiIKICAgIGZvciBuYW1lIGluIGNvZGUuY29fbmFtZXM6CiAgICAgICAgeWllbGQgbmFtZQogICAgZm9yIGNvbnN0IGluIGNvZGUuY29fY29uc3RzOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29uc3QsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB5aWVsZCBjb25zdAogICAgICAgIGVsaWYgaXNpbnN0YW5jZShjb25zdCwgQ29kZVR5cGUpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBpdGVyX3N5bWJvbHMoY29uc3QpOgogICAgICAgICAgICAgICAgeWllbGQgbmFtZQoKCmRlZiBjYW5fc2NhbigpOgogICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJykgYW5kIHN5cy5wbGF0Zm9ybSAhPSAnY2xpJzoKICAgICAgICAjIENQeXRob24sIFB5UHksIGV0Yy4KICAgICAgICByZXR1cm4gVHJ1ZQogICAgbG9nLndhcm4oIlVuYWJsZSB0byBhbmFseXplIGNvbXBpbGVkIGNvZGUgb24gdGhpcyBwbGF0Zm9ybS4iKQogICAgbG9nLndhcm4oIlBsZWFzZSBhc2sgdGhlIGF1dGhvciB0byBpbmNsdWRlIGEgJ3ppcF9zYWZlJyIKICAgICAgICAgICAgICIgc2V0dGluZyAoZWl0aGVyIFRydWUgb3IgRmFsc2UpIGluIHRoZSBwYWNrYWdlJ3Mgc2V0dXAucHkiKQoKCiMgQXR0cmlidXRlIG5hbWVzIG9mIG9wdGlvbnMgZm9yIGNvbW1hbmRzIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBjb252aW5jZWQgdG8KIyBpbnN0YWxsIHRvIHRoZSBlZ2cgYnVpbGQgZGlyZWN0b3J5CgpJTlNUQUxMX0RJUkVDVE9SWV9BVFRSUyA9IFsKICAgICdpbnN0YWxsX2xpYicsICdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RhdGEnLCAnaW5zdGFsbF9iYXNlJwpdCgoKZGVmIG1ha2VfemlwZmlsZSh6aXBfZmlsZW5hbWUsIGJhc2VfZGlyLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgY29tcHJlc3M9VHJ1ZSwKICAgICAgICAgICAgICAgICBtb2RlPSd3Jyk6CiAgICAiIiJDcmVhdGUgYSB6aXAgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4gIFRoZSBvdXRwdXQKICAgIHppcCBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfZGlyJyArICIuemlwIi4gIFVzZXMgZWl0aGVyIHRoZSAiemlwZmlsZSIKICAgIFB5dGhvbiBtb2R1bGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIEluZm9aSVAgInppcCIgdXRpbGl0eSAoaWYgaW5zdGFsbGVkCiAgICBhbmQgZm91bmQgb24gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGgpLiAgSWYgbmVpdGhlciB0b29sIGlzIGF2YWlsYWJsZSwKICAgIHJhaXNlcyBEaXN0dXRpbHNFeGVjRXJyb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgemlwIGZpbGUuCiAgICAiIiIKICAgIGltcG9ydCB6aXBmaWxlCgogICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZSh6aXBfZmlsZW5hbWUpLCBkcnlfcnVuPWRyeV9ydW4pCiAgICBsb2cuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQoKICAgIGRlZiB2aXNpdCh6LCBkaXJuYW1lLCBuYW1lcyk6CiAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKSkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICBwID0gcGF0aFtsZW4oYmFzZV9kaXIpICsgMTpdCiAgICAgICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICB6LndyaXRlKHBhdGgsIHApCiAgICAgICAgICAgICAgICBsb2cuZGVidWcoImFkZGluZyAnJXMnIiwgcCkKCiAgICBjb21wcmVzc2lvbiA9IHppcGZpbGUuWklQX0RFRkxBVEVEIGlmIGNvbXByZXNzIGVsc2UgemlwZmlsZS5aSVBfU1RPUkVECiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICB6ID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgbW9kZSwgY29tcHJlc3Npb249Y29tcHJlc3Npb24pCiAgICAgICAgZm9yIGRpcm5hbWUsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKGJhc2VfZGlyKToKICAgICAgICAgICAgdmlzaXQoeiwgZGlybmFtZSwgZmlsZXMpCiAgICAgICAgei5jbG9zZSgpCiAgICBlbHNlOgogICAgICAgIGZvciBkaXJuYW1lLCBkaXJzLCBmaWxlcyBpbiBzb3J0ZWRfd2FsayhiYXNlX2Rpcik6CiAgICAgICAgICAgIHZpc2l0KE5vbmUsIGRpcm5hbWUsIGZpbGVzKQogICAgcmV0dXJuIHppcF9maWxlbmFtZQpQSwMEFAAAAAAAAAAhAOvSdBbkBQAA5AUAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9ycG0gYXMgb3JpZwoKCmNsYXNzIGJkaXN0X3JwbShvcmlnLmJkaXN0X3JwbSk6CiAgICAiIiIKICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJkaXN0X3JwbSBiZWhhdmlvciB0byBkbyB0aGUgZm9sbG93aW5nOgoKICAgIDEuIFJ1biBlZ2dfaW5mbyB0byBlbnN1cmUgdGhlIG5hbWUgYW5kIHZlcnNpb24gYXJlIHByb3Blcmx5IGNhbGN1bGF0ZWQuCiAgICAyLiBBbHdheXMgcnVuICdpbnN0YWxsJyB1c2luZyAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCB0bwogICAgICAgZGlzYWJsZSBlZ2dzIGluIFJQTSBkaXN0cmlidXRpb25zLgogICAgMy4gUmVwbGFjZSBkYXNoIHdpdGggdW5kZXJzY29yZSBpbiB0aGUgdmVyc2lvbiBudW1iZXJzIGZvciBiZXR0ZXIgUlBNCiAgICAgICBjb21wYXRpYmlsaXR5LgogICAgIiIiCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIGVuc3VyZSBkaXN0cm8gbmFtZSBpcyB1cC10by1kYXRlCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICBvcmlnLmJkaXN0X3JwbS5ydW4oc2VsZikKCiAgICBkZWYgX21ha2Vfc3BlY19maWxlKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCiAgICAgICAgcnBtdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnLScsICdfJykKICAgICAgICBzcGVjID0gb3JpZy5iZGlzdF9ycG0uX21ha2Vfc3BlY19maWxlKHNlbGYpCiAgICAgICAgbGluZTIzID0gJyVkZWZpbmUgdmVyc2lvbiAnICsgdmVyc2lvbgogICAgICAgIGxpbmUyNCA9ICclZGVmaW5lIHZlcnNpb24gJyArIHJwbXZlcnNpb24KICAgICAgICBzcGVjID0gWwogICAgICAgICAgICBsaW5lLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAiU291cmNlMDogJXtuYW1lfS0le3ZlcnNpb259LnRhciIsCiAgICAgICAgICAgICAgICAiU291cmNlMDogJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufS50YXIiCiAgICAgICAgICAgICkucmVwbGFjZSgKICAgICAgICAgICAgICAgICJzZXR1cC5weSBpbnN0YWxsICIsCiAgICAgICAgICAgICAgICAic2V0dXAucHkgaW5zdGFsbCAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCAiCiAgICAgICAgICAgICkucmVwbGFjZSgKICAgICAgICAgICAgICAgICIlc2V0dXAiLAogICAgICAgICAgICAgICAgIiVzZXR1cCAtbiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259IgogICAgICAgICAgICApLnJlcGxhY2UobGluZTIzLCBsaW5lMjQpCiAgICAgICAgICAgIGZvciBsaW5lIGluIHNwZWMKICAgICAgICBdCiAgICAgICAgaW5zZXJ0X2xvYyA9IHNwZWMuaW5kZXgobGluZTI0KSArIDEKICAgICAgICB1bm1hbmdsZWRfdmVyc2lvbiA9ICIlZGVmaW5lIHVubWFuZ2xlZF92ZXJzaW9uICIgKyB2ZXJzaW9uCiAgICAgICAgc3BlYy5pbnNlcnQoaW5zZXJ0X2xvYywgdW5tYW5nbGVkX3ZlcnNpb24pCiAgICAgICAgcmV0dXJuIHNwZWMKUEsDBBQAAAAAAAAAIQAgjHUUfQIAAH0CAABIAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3dpbmluc3QgYXMgb3JpZwoKCmNsYXNzIGJkaXN0X3dpbmluc3Qob3JpZy5iZGlzdF93aW5pbnN0KToKICAgIGRlZiByZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHM9MCk6CiAgICAgICAgIiIiCiAgICAgICAgU3VwcGxlbWVudCByZWluaXRpYWxpemVfY29tbWFuZCB0byB3b3JrIGFyb3VuZAogICAgICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDgxOQogICAgICAgICIiIgogICAgICAgIGNtZCA9IHNlbGYuZGlzdHJpYnV0aW9uLnJlaW5pdGlhbGl6ZV9jb21tYW5kKAogICAgICAgICAgICBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHMpCiAgICAgICAgaWYgY29tbWFuZCBpbiAoJ2luc3RhbGwnLCAnaW5zdGFsbF9saWInKToKICAgICAgICAgICAgY21kLmluc3RhbGxfbGliID0gTm9uZQogICAgICAgIHJldHVybiBjbWQKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYuX2lzX3J1bm5pbmcgPSBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcmlnLmJkaXN0X3dpbmluc3QucnVuKHNlbGYpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5faXNfcnVubmluZyA9IEZhbHNlClBLAwQUAAAAAAAAACEAJxqNG4QRAACEEQAARQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfY2xpYi5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9jbGliIGFzIG9yaWcKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBzZXR1cHRvb2xzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9wYWlyd2lzZV9ncm91cAoKCmNsYXNzIGJ1aWxkX2NsaWIob3JpZy5idWlsZF9jbGliKToKICAgICIiIgogICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnVpbGRfY2xpYiBiZWhhdmlvdXIgdG8gZG8gdGhlIGZvbGxvd2luZzoKCiAgICAxLiBJbXBsZW1lbnQgYSBydWRpbWVudGFyeSB0aW1lc3RhbXAtYmFzZWQgZGVwZW5kZW5jeSBzeXN0ZW0KICAgICAgIHNvICdjb21waWxlKCknIGRvZXNuJ3QgcnVuIGV2ZXJ5IHRpbWUuCiAgICAyLiBBZGQgbW9yZSBrZXlzIHRvIHRoZSAnYnVpbGRfaW5mbycgZGljdGlvbmFyeToKICAgICAgICAqIG9ial9kZXBzIC0gc3BlY2lmeSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggb2JqZWN0IGNvbXBpbGVkLgogICAgICAgICAgICAgICAgICAgICB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZyBhIGtleQogICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBzb3VyY2UgZmlsZW5hbWUgdG8gYSBsaXN0IG9mCiAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4gVXNlIGFuIGVtcHR5IHN0cmluZyBmb3IgZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4KICAgICAgICAqIGNmbGFncyAgIC0gc3BlY2lmeSBhIGxpc3Qgb2YgYWRkaXRpb25hbCBmbGFncyB0byBwYXNzIHRvCiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21waWxlci4KICAgICIiIgoKICAgIGRlZiBidWlsZF9saWJyYXJpZXMoc2VsZiwgbGlicmFyaWVzKToKICAgICAgICBmb3IgKGxpYl9uYW1lLCBidWlsZF9pbmZvKSBpbiBsaWJyYXJpZXM6CiAgICAgICAgICAgIHNvdXJjZXMgPSBidWlsZF9pbmZvLmdldCgnc291cmNlcycpCiAgICAgICAgICAgIGlmIHNvdXJjZXMgaXMgTm9uZSBvciBub3QgaXNpbnN0YW5jZShzb3VyY2VzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICInc291cmNlcycgbXVzdCBiZSBwcmVzZW50IGFuZCBtdXN0IGJlICIKICAgICAgICAgICAgICAgICAgICAgICAiYSBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMiICUgbGliX25hbWUpCiAgICAgICAgICAgIHNvdXJjZXMgPSBsaXN0KHNvdXJjZXMpCgogICAgICAgICAgICBsb2cuaW5mbygiYnVpbGRpbmcgJyVzJyBsaWJyYXJ5IiwgbGliX25hbWUpCgogICAgICAgICAgICAjIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHRoZSBjb3JyZWN0IHR5cGUuCiAgICAgICAgICAgICMgb2JqX2RlcHMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvZiBrZXlzIGFzIHNvdXJjZXMKICAgICAgICAgICAgIyBhbmQgYSBsaXN0L3R1cGxlIG9mIGZpbGVzIHRoYXQgYXJlIGl0cyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIG9ial9kZXBzID0gYnVpbGRfaW5mby5nZXQoJ29ial9kZXBzJywgZGljdCgpKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvYmpfZGVwcywgZGljdCk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCiAgICAgICAgICAgIGRlcGVuZGVuY2llcyA9IFtdCgogICAgICAgICAgICAjIEdldCB0aGUgZ2xvYmFsIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBzcGVjaWZpZWQgYnkgdGhlICcnIGtleS4KICAgICAgICAgICAgIyBUaGVzZSB3aWxsIGdvIGludG8gZXZlcnkgc291cmNlJ3MgZGVwZW5kZW5jeSBsaXN0LgogICAgICAgICAgICBnbG9iYWxfZGVwcyA9IG9ial9kZXBzLmdldCgnJywgbGlzdCgpKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShnbG9iYWxfZGVwcywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCgogICAgICAgICAgICAjIEJ1aWxkIHRoZSBsaXN0IHRvIGJlIHVzZWQgYnkgbmV3ZXJfcGFpcndpc2VfZ3JvdXAKICAgICAgICAgICAgIyBlYWNoIHNvdXJjZSB3aWxsIGJlIGF1dG8tYWRkZWQgdG8gaXRzIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgZm9yIHNvdXJjZSBpbiBzb3VyY2VzOgogICAgICAgICAgICAgICAgc3JjX2RlcHMgPSBbc291cmNlXQogICAgICAgICAgICAgICAgc3JjX2RlcHMuZXh0ZW5kKGdsb2JhbF9kZXBzKQogICAgICAgICAgICAgICAgZXh0cmFfZGVwcyA9IG9ial9kZXBzLmdldChzb3VyY2UsIGxpc3QoKSkKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dHJhX2RlcHMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIidvYmpfZGVwcycgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSAnc291cmNlOiBsaXN0JyIgJSBsaWJfbmFtZSkKICAgICAgICAgICAgICAgIHNyY19kZXBzLmV4dGVuZChleHRyYV9kZXBzKQogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFwcGVuZChzcmNfZGVwcykKCiAgICAgICAgICAgIGV4cGVjdGVkX29iamVjdHMgPSBzZWxmLmNvbXBpbGVyLm9iamVjdF9maWxlbmFtZXMoCiAgICAgICAgICAgICAgICAgICAgc291cmNlcywKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfdGVtcAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIG5ld2VyX3BhaXJ3aXNlX2dyb3VwKGRlcGVuZGVuY2llcywgZXhwZWN0ZWRfb2JqZWN0cykgIT0gKFtdLCBbXSk6CiAgICAgICAgICAgICAgICAjIEZpcnN0LCBjb21waWxlIHRoZSBzb3VyY2UgY29kZSB0byBvYmplY3QgZmlsZXMgaW4gdGhlIGxpYnJhcnkKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5LiAgKFRoaXMgc2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0byBwdXR0aW5nIG9iamVjdAogICAgICAgICAgICAgICAgIyBmaWxlcyBpbiBhIHRlbXBvcmFyeSBidWlsZCBkaXJlY3RvcnkuKQogICAgICAgICAgICAgICAgbWFjcm9zID0gYnVpbGRfaW5mby5nZXQoJ21hY3JvcycpCiAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBidWlsZF9pbmZvLmdldCgnaW5jbHVkZV9kaXJzJykKICAgICAgICAgICAgICAgIGNmbGFncyA9IGJ1aWxkX2luZm8uZ2V0KCdjZmxhZ3MnKQogICAgICAgICAgICAgICAgb2JqZWN0cyA9IHNlbGYuY29tcGlsZXIuY29tcGlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcywKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX3RlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hY3Jvcz1tYWNyb3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPWNmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9c2VsZi5kZWJ1ZwogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIE5vdyAibGluayIgdGhlIG9iamVjdCBmaWxlcyB0b2dldGhlciBpbnRvIGEgc3RhdGljIGxpYnJhcnkuCiAgICAgICAgICAgICMgKE9uIFVuaXggYXQgbGVhc3QsIHRoaXMgaXNuJ3QgcmVhbGx5IGxpbmtpbmcgLS0gaXQganVzdAogICAgICAgICAgICAjIGJ1aWxkcyBhbiBhcmNoaXZlLiAgV2hhdGV2ZXIuKQogICAgICAgICAgICBzZWxmLmNvbXBpbGVyLmNyZWF0ZV9zdGF0aWNfbGliKAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX29iamVjdHMsCiAgICAgICAgICAgICAgICAgICAgbGliX25hbWUsCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX2NsaWIsCiAgICAgICAgICAgICAgICAgICAgZGVidWc9c2VsZi5kZWJ1ZwogICAgICAgICAgICAgICAgICAgICkKUEsDBBQAAAAAAAAAIQCRpWnn+TIAAPkyAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHlpbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBpbXAKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfZHVfYnVpbGRfZXh0CmZyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgY29weV9maWxlCmZyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgbmV3X2NvbXBpbGVyCmZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgY3VzdG9taXplX2NvbXBpbGVyLCBnZXRfY29uZmlnX3Zhcgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4Cgp0cnk6CiAgICAjIEF0dGVtcHQgdG8gdXNlIEN5dGhvbiBmb3IgYnVpbGRpbmcgZXh0ZW5zaW9ucywgaWYgYXZhaWxhYmxlCiAgICBmcm9tIEN5dGhvbi5EaXN0dXRpbHMuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQgYXMgX2J1aWxkX2V4dApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBfYnVpbGRfZXh0ID0gX2R1X2J1aWxkX2V4dAoKIyBtYWtlIHN1cmUgX2NvbmZpZ192YXJzIGlzIGluaXRpYWxpemVkCmdldF9jb25maWdfdmFyKCJMRFNIQVJFRCIpCmZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgX2NvbmZpZ192YXJzIGFzIF9DT05GSUdfVkFSUwoKCmRlZiBfY3VzdG9taXplX2NvbXBpbGVyX2Zvcl9zaGxpYihjb21waWxlcik6CiAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgIyBidWlsZGluZyAuZHlsaWIgcmVxdWlyZXMgYWRkaXRpb25hbCBjb21waWxlciBmbGFncyBvbiBPU1g7IGhlcmUgd2UKICAgICAgICAjIHRlbXBvcmFyaWx5IHN1YnN0aXR1dGUgdGhlIHB5Y29uZmlnLmggdmFyaWFibGVzIHNvIHRoYXQgZGlzdHV0aWxzJwogICAgICAgICMgJ2N1c3RvbWl6ZV9jb21waWxlcicgdXNlcyB0aGVtIGJlZm9yZSB3ZSBidWlsZCB0aGUgc2hhcmVkIGxpYnJhcmllcy4KICAgICAgICB0bXAgPSBfQ09ORklHX1ZBUlMuY29weSgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFhYWCBIZWxwISAgSSBkb24ndCBoYXZlIGFueSBpZGVhIHdoZXRoZXIgdGhlc2UgYXJlIHJpZ2h0Li4uCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snTERTSEFSRUQnXSA9ICgKICAgICAgICAgICAgICAgICJnY2MgLVdsLC14IC1keW5hbWljbGliIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAiKQogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ0NDU0hBUkVEJ10gPSAiIC1keW5hbWljbGliIgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ1NPJ10gPSAiLmR5bGliIgogICAgICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoY29tcGlsZXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgX0NPTkZJR19WQVJTLmNsZWFyKCkKICAgICAgICAgICAgX0NPTkZJR19WQVJTLnVwZGF0ZSh0bXApCiAgICBlbHNlOgogICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKCgpoYXZlX3J0bGQgPSBGYWxzZQp1c2Vfc3R1YnMgPSBGYWxzZQpsaWJ0eXBlID0gJ3NoYXJlZCcKCmlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgIHVzZV9zdHVicyA9IFRydWUKZWxpZiBvcy5uYW1lICE9ICdudCc6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IGRsCiAgICAgICAgdXNlX3N0dWJzID0gaGF2ZV9ydGxkID0gaGFzYXR0cihkbCwgJ1JUTERfTk9XJykKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgppZl9kbCA9IGxhbWJkYSBzOiBzIGlmIGhhdmVfcnRsZCBlbHNlICcnCgoKZGVmIGdldF9hYmkzX3N1ZmZpeCgpOgogICAgIiIiUmV0dXJuIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgYW4gYWJpMy1jb21wbGlhbnQgRXh0ZW5zaW9uKCkiIiIKICAgIGZvciBzdWZmaXgsIF8sIF8gaW4gKHMgZm9yIHMgaW4gaW1wLmdldF9zdWZmaXhlcygpIGlmIHNbMl0gPT0gaW1wLkNfRVhURU5TSU9OKToKICAgICAgICBpZiAnLmFiaTMnIGluIHN1ZmZpeDogICMgVW5peAogICAgICAgICAgICByZXR1cm4gc3VmZml4CiAgICAgICAgZWxpZiBzdWZmaXggPT0gJy5weWQnOiAgIyBXaW5kb3dzCiAgICAgICAgICAgIHJldHVybiBzdWZmaXgKCgpjbGFzcyBidWlsZF9leHQoX2J1aWxkX2V4dCk6CiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIkJ1aWxkIGV4dGVuc2lvbnMgaW4gYnVpbGQgZGlyZWN0b3J5LCB0aGVuIGNvcHkgaWYgLS1pbnBsYWNlIiIiCiAgICAgICAgb2xkX2lucGxhY2UsIHNlbGYuaW5wbGFjZSA9IHNlbGYuaW5wbGFjZSwgMAogICAgICAgIF9idWlsZF9leHQucnVuKHNlbGYpCiAgICAgICAgc2VsZi5pbnBsYWNlID0gb2xkX2lucGxhY2UKICAgICAgICBpZiBvbGRfaW5wbGFjZToKICAgICAgICAgICAgc2VsZi5jb3B5X2V4dGVuc2lvbnNfdG9fc291cmNlKCkKCiAgICBkZWYgY29weV9leHRlbnNpb25zX3RvX3NvdXJjZShzZWxmKToKICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CiAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKICAgICAgICAgICAgbW9kcGF0aCA9IGZ1bGxuYW1lLnNwbGl0KCcuJykKICAgICAgICAgICAgcGFja2FnZSA9ICcuJy5qb2luKG1vZHBhdGhbOi0xXSkKICAgICAgICAgICAgcGFja2FnZV9kaXIgPSBidWlsZF9weS5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKICAgICAgICAgICAgZGVzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKICAgICAgICAgICAgc3JjX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCBmaWxlbmFtZSkKCiAgICAgICAgICAgICMgQWx3YXlzIGNvcHksIGV2ZW4gaWYgc291cmNlIGlzIG9sZGVyIHRoYW4gZGVzdGluYXRpb24sIHRvIGVuc3VyZQogICAgICAgICAgICAjIHRoYXQgdGhlIHJpZ2h0IGV4dGVuc2lvbnMgZm9yIHRoZSBjdXJyZW50IFB5dGhvbi9wbGF0Zm9ybSBhcmUKICAgICAgICAgICAgIyB1c2VkLgogICAgICAgICAgICBjb3B5X2ZpbGUoCiAgICAgICAgICAgICAgICBzcmNfZmlsZW5hbWUsIGRlc3RfZmlsZW5hbWUsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAogICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4KICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CiAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIocGFja2FnZV9kaXIgb3Igb3MuY3VyZGlyLCBleHQsIFRydWUpCgogICAgZGVmIGdldF9leHRfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIGZpbGVuYW1lID0gX2J1aWxkX2V4dC5nZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKQogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYuZXh0X21hcDoKICAgICAgICAgICAgZXh0ID0gc2VsZi5leHRfbWFwW2Z1bGxuYW1lXQogICAgICAgICAgICB1c2VfYWJpMyA9ICgKICAgICAgICAgICAgICAgIHNpeC5QWTMKICAgICAgICAgICAgICAgIGFuZCBnZXRhdHRyKGV4dCwgJ3B5X2xpbWl0ZWRfYXBpJykKICAgICAgICAgICAgICAgIGFuZCBnZXRfYWJpM19zdWZmaXgoKQogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHVzZV9hYmkzOgogICAgICAgICAgICAgICAgc29fZXh0ID0gX2dldF9jb25maWdfdmFyXzgzNygnRVhUX1NVRkZJWCcpCiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotbGVuKHNvX2V4dCldCiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgZ2V0X2FiaTNfc3VmZml4KCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgZm4sIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zaGxpYl9jb21waWxlci5saWJyYXJ5X2ZpbGVuYW1lKGZuLCBsaWJ0eXBlKQogICAgICAgICAgICBlbGlmIHVzZV9zdHVicyBhbmQgZXh0Ll9saW5rc190b19keW5hbWljOgogICAgICAgICAgICAgICAgZCwgZm4gPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihkLCAnZGwtJyArIGZuKQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgX2J1aWxkX2V4dC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnNobGliX2NvbXBpbGVyID0gTm9uZQogICAgICAgIHNlbGYuc2hsaWJzID0gW10KICAgICAgICBzZWxmLmV4dF9tYXAgPSB7fQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIF9idWlsZF9leHQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuZXh0ZW5zaW9ucyA9IHNlbGYuZXh0ZW5zaW9ucyBvciBbXQogICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKICAgICAgICBzZWxmLnNobGlicyA9IFtleHQgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnMKICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSldCiAgICAgICAgaWYgc2VsZi5zaGxpYnM6CiAgICAgICAgICAgIHNlbGYuc2V0dXBfc2hsaWJfY29tcGlsZXIoKQogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgogICAgICAgICAgICBleHQuX2Z1bGxfbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKICAgICAgICAgICAgZnVsbG5hbWUgPSBleHQuX2Z1bGxfbmFtZQogICAgICAgICAgICBzZWxmLmV4dF9tYXBbZnVsbG5hbWVdID0gZXh0CgogICAgICAgICAgICAjIGRpc3R1dGlscyAzLjEgd2lsbCBhbHNvIGFzayBmb3IgbW9kdWxlIG5hbWVzCiAgICAgICAgICAgICMgWFhYIHdoYXQgdG8gZG8gd2l0aCBjb25mbGljdHM/CiAgICAgICAgICAgIHNlbGYuZXh0X21hcFtmdWxsbmFtZS5zcGxpdCgnLicpWy0xXV0gPSBleHQKCiAgICAgICAgICAgIGx0ZCA9IHNlbGYuc2hsaWJzIGFuZCBzZWxmLmxpbmtzX3RvX2R5bmFtaWMoZXh0KSBvciBGYWxzZQogICAgICAgICAgICBucyA9IGx0ZCBhbmQgdXNlX3N0dWJzIGFuZCBub3QgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpCiAgICAgICAgICAgIGV4dC5fbGlua3NfdG9fZHluYW1pYyA9IGx0ZAogICAgICAgICAgICBleHQuX25lZWRzX3N0dWIgPSBucwogICAgICAgICAgICBmaWxlbmFtZSA9IGV4dC5fZmlsZV9uYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQogICAgICAgICAgICBsaWJkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCBmaWxlbmFtZSkpCiAgICAgICAgICAgIGlmIGx0ZCBhbmQgbGliZGlyIG5vdCBpbiBleHQubGlicmFyeV9kaXJzOgogICAgICAgICAgICAgICAgZXh0LmxpYnJhcnlfZGlycy5hcHBlbmQobGliZGlyKQogICAgICAgICAgICBpZiBsdGQgYW5kIHVzZV9zdHVicyBhbmQgb3MuY3VyZGlyIG5vdCBpbiBleHQucnVudGltZV9saWJyYXJ5X2RpcnM6CiAgICAgICAgICAgICAgICBleHQucnVudGltZV9saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLmN1cmRpcikKCiAgICBkZWYgc2V0dXBfc2hsaWJfY29tcGlsZXIoc2VsZik6CiAgICAgICAgY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyID0gbmV3X2NvbXBpbGVyKAogICAgICAgICAgICBjb21waWxlcj1zZWxmLmNvbXBpbGVyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1biwgZm9yY2U9c2VsZi5mb3JjZQogICAgICAgICkKICAgICAgICBfY3VzdG9taXplX2NvbXBpbGVyX2Zvcl9zaGxpYihjb21waWxlcikKCiAgICAgICAgaWYgc2VsZi5pbmNsdWRlX2RpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9pbmNsdWRlX2RpcnMoc2VsZi5pbmNsdWRlX2RpcnMpCiAgICAgICAgaWYgc2VsZi5kZWZpbmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgJ2RlZmluZScgb3B0aW9uIGlzIGEgbGlzdCBvZiAobmFtZSx2YWx1ZSkgdHVwbGVzCiAgICAgICAgICAgIGZvciAobmFtZSwgdmFsdWUpIGluIHNlbGYuZGVmaW5lOgogICAgICAgICAgICAgICAgY29tcGlsZXIuZGVmaW5lX21hY3JvKG5hbWUsIHZhbHVlKQogICAgICAgIGlmIHNlbGYudW5kZWYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBtYWNybyBpbiBzZWxmLnVuZGVmOgogICAgICAgICAgICAgICAgY29tcGlsZXIudW5kZWZpbmVfbWFjcm8obWFjcm8pCiAgICAgICAgaWYgc2VsZi5saWJyYXJpZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saWJyYXJpZXMoc2VsZi5saWJyYXJpZXMpCiAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2RpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saWJyYXJ5X2RpcnMoc2VsZi5saWJyYXJ5X2RpcnMpCiAgICAgICAgaWYgc2VsZi5ycGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X3J1bnRpbWVfbGlicmFyeV9kaXJzKHNlbGYucnBhdGgpCiAgICAgICAgaWYgc2VsZi5saW5rX29iamVjdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saW5rX29iamVjdHMoc2VsZi5saW5rX29iamVjdHMpCgogICAgICAgICMgaGFjayBzbyBkaXN0dXRpbHMnIGJ1aWxkX2V4dGVuc2lvbigpIGJ1aWxkcyBhIGxpYnJhcnkgaW5zdGVhZAogICAgICAgIGNvbXBpbGVyLmxpbmtfc2hhcmVkX29iamVjdCA9IGxpbmtfc2hhcmVkX29iamVjdC5fX2dldF9fKGNvbXBpbGVyKQoKICAgIGRlZiBnZXRfZXhwb3J0X3N5bWJvbHMoc2VsZiwgZXh0KToKICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgIHJldHVybiBleHQuZXhwb3J0X3N5bWJvbHMKICAgICAgICByZXR1cm4gX2J1aWxkX2V4dC5nZXRfZXhwb3J0X3N5bWJvbHMoc2VsZiwgZXh0KQoKICAgIGRlZiBidWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KToKICAgICAgICBleHQuX2NvbnZlcnRfcHl4X3NvdXJjZXNfdG9fbGFuZygpCiAgICAgICAgX2NvbXBpbGVyID0gc2VsZi5jb21waWxlcgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIKICAgICAgICAgICAgX2J1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KQogICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CiAgICAgICAgICAgICAgICBjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKS5idWlsZF9saWIKICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc3R1YihjbWQsIGV4dCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gX2NvbXBpbGVyCgogICAgZGVmIGxpbmtzX3RvX2R5bmFtaWMoc2VsZiwgZXh0KToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnZXh0JyBsaW5rcyB0byBhIGR5bmFtaWMgbGliIGluIHRoZSBzYW1lIHBhY2thZ2UiIiIKICAgICAgICAjIFhYWCB0aGlzIHNob3VsZCBjaGVjayB0byBlbnN1cmUgdGhlIGxpYiBpcyBhY3R1YWxseSBiZWluZyBidWlsdAogICAgICAgICMgWFhYIGFzIGR5bmFtaWMsIGFuZCBub3QganVzdCB1c2luZyBhIGxvY2FsbHktZm91bmQgdmVyc2lvbiBvciBhCiAgICAgICAgIyBYWFggc3RhdGljLWNvbXBpbGVkIHZlcnNpb24KICAgICAgICBsaWJuYW1lcyA9IGRpY3QuZnJvbWtleXMoW2xpYi5fZnVsbF9uYW1lIGZvciBsaWIgaW4gc2VsZi5zaGxpYnNdKQogICAgICAgIHBrZyA9ICcuJy5qb2luKGV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJylbOi0xXSArIFsnJ10pCiAgICAgICAgcmV0dXJuIGFueShwa2cgKyBsaWJuYW1lIGluIGxpYm5hbWVzIGZvciBsaWJuYW1lIGluIGV4dC5saWJyYXJpZXMpCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBfYnVpbGRfZXh0LmdldF9vdXRwdXRzKHNlbGYpICsgc2VsZi5fX2dldF9zdHVic19vdXRwdXRzKCkKCiAgICBkZWYgX19nZXRfc3R1YnNfb3V0cHV0cyhzZWxmKToKICAgICAgICAjIGFzc2VtYmxlIHRoZSBiYXNlIG5hbWUgZm9yIGVhY2ggZXh0ZW5zaW9uIHRoYXQgbmVlZHMgYSBzdHViCiAgICAgICAgbnNfZXh0X2Jhc2VzID0gKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKQogICAgICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9ucwogICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWIKICAgICAgICApCiAgICAgICAgIyBwYWlyIGVhY2ggYmFzZSB3aXRoIHRoZSBleHRlbnNpb24KICAgICAgICBwYWlycyA9IGl0ZXJ0b29scy5wcm9kdWN0KG5zX2V4dF9iYXNlcywgc2VsZi5fX2dldF9vdXRwdXRfZXh0ZW5zaW9ucygpKQogICAgICAgIHJldHVybiBsaXN0KGJhc2UgKyBmbmV4dCBmb3IgYmFzZSwgZm5leHQgaW4gcGFpcnMpCgogICAgZGVmIF9fZ2V0X291dHB1dF9leHRlbnNpb25zKHNlbGYpOgogICAgICAgIHlpZWxkICcucHknCiAgICAgICAgeWllbGQgJy5weWMnCiAgICAgICAgaWYgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5Jykub3B0aW1pemU6CiAgICAgICAgICAgIHlpZWxkICcucHlvJwoKICAgIGRlZiB3cml0ZV9zdHViKHNlbGYsIG91dHB1dF9kaXIsIGV4dCwgY29tcGlsZT1GYWxzZSk6CiAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgc3R1YiBsb2FkZXIgZm9yICVzIHRvICVzIiwgZXh0Ll9mdWxsX25hbWUsCiAgICAgICAgICAgICAgICAgb3V0cHV0X2RpcikKICAgICAgICBzdHViX2ZpbGUgPSAob3MucGF0aC5qb2luKG91dHB1dF9kaXIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKSArCiAgICAgICAgICAgICAgICAgICAgICcucHknKQogICAgICAgIGlmIGNvbXBpbGUgYW5kIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHN0dWJfZmlsZSArICIgYWxyZWFkeSBleGlzdHMhIFBsZWFzZSBkZWxldGUuIikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmID0gb3BlbihzdHViX2ZpbGUsICd3JykKICAgICAgICAgICAgZi53cml0ZSgKICAgICAgICAgICAgICAgICdcbicuam9pbihbCiAgICAgICAgICAgICAgICAgICAgImRlZiBfX2Jvb3RzdHJhcF9fKCk6IiwKICAgICAgICAgICAgICAgICAgICAiICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fZmlsZV9fLCBfX2xvYWRlcl9fIiwKICAgICAgICAgICAgICAgICAgICAiICAgaW1wb3J0IHN5cywgb3MsIHBrZ19yZXNvdXJjZXMsIGltcCIgKyBpZl9kbCgiLCBkbCIpLAogICAgICAgICAgICAgICAgICAgICIgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUiCiAgICAgICAgICAgICAgICAgICAgIihfX25hbWVfXywlcikiCiAgICAgICAgICAgICAgICAgICAgJSBvcy5wYXRoLmJhc2VuYW1lKGV4dC5fZmlsZV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAiICAgZGVsIF9fYm9vdHN0cmFwX18iLAogICAgICAgICAgICAgICAgICAgICIgICBpZiAnX19sb2FkZXJfXycgaW4gZ2xvYmFscygpOiIsCiAgICAgICAgICAgICAgICAgICAgIiAgICAgICBkZWwgX19sb2FkZXJfXyIsCiAgICAgICAgICAgICAgICAgICAgaWZfZGwoIiAgIG9sZF9mbGFncyA9IHN5cy5nZXRkbG9wZW5mbGFncygpIiksCiAgICAgICAgICAgICAgICAgICAgIiAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKSIsCiAgICAgICAgICAgICAgICAgICAgIiAgIHRyeToiLAogICAgICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpIiwKICAgICAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3MoZGwuUlRMRF9OT1cpIiksCiAgICAgICAgICAgICAgICAgICAgIiAgICAgaW1wLmxvYWRfZHluYW1pYyhfX25hbWVfXyxfX2ZpbGVfXykiLAogICAgICAgICAgICAgICAgICAgICIgICBmaW5hbGx5OiIsCiAgICAgICAgICAgICAgICAgICAgaWZfZGwoIiAgICAgc3lzLnNldGRsb3BlbmZsYWdzKG9sZF9mbGFncykiKSwKICAgICAgICAgICAgICAgICAgICAiICAgICBvcy5jaGRpcihvbGRfZGlyKSIsCiAgICAgICAgICAgICAgICAgICAgIl9fYm9vdHN0cmFwX18oKSIsCiAgICAgICAgICAgICAgICAgICAgIiIgICMgdGVybWluYWwgXG4KICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICkKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgaWYgY29tcGlsZToKICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCgogICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgb3B0aW1pemUgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbF9saWInKS5vcHRpbWl6ZQogICAgICAgICAgICBpZiBvcHRpbWl6ZSA+IDA6CiAgICAgICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPW9wdGltaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRydWUsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHN0dWJfZmlsZSkKCgppZiB1c2Vfc3R1YnMgb3Igb3MubmFtZSA9PSAnbnQnOgogICAgIyBCdWlsZCBzaGFyZWQgbGlicmFyaWVzCiAgICAjCiAgICBkZWYgbGlua19zaGFyZWRfb2JqZWN0KAogICAgICAgICAgICBzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLCBsaWJyYXJpZXM9Tm9uZSwKICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsIGV4cG9ydF9zeW1ib2xzPU5vbmUsCiAgICAgICAgICAgIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLAogICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKICAgICAgICBzZWxmLmxpbmsoCiAgICAgICAgICAgIHNlbGYuU0hBUkVEX0xJQlJBUlksIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLAogICAgICAgICAgICBvdXRwdXRfZGlyLCBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMsCiAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzLCBkZWJ1ZywgZXh0cmFfcHJlYXJncywgZXh0cmFfcG9zdGFyZ3MsCiAgICAgICAgICAgIGJ1aWxkX3RlbXAsIHRhcmdldF9sYW5nCiAgICAgICAgKQplbHNlOgogICAgIyBCdWlsZCBzdGF0aWMgbGlicmFyaWVzIGV2ZXJ5d2hlcmUgZWxzZQogICAgbGlidHlwZSA9ICdzdGF0aWMnCgogICAgZGVmIGxpbmtfc2hhcmVkX29iamVjdCgKICAgICAgICAgICAgc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwgbGlicmFyaWVzPU5vbmUsCiAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLCBleHBvcnRfc3ltYm9scz1Ob25lLAogICAgICAgICAgICBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwKICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CiAgICAgICAgIyBYWFggd2UgbmVlZCB0byBlaXRoZXIgZGlzYWxsb3cgdGhlc2UgYXR0cnMgb24gTGlicmFyeSBpbnN0YW5jZXMsCiAgICAgICAgIyBvciB3YXJuL2Fib3J0IGhlcmUgaWYgc2V0LCBvciBzb21ldGhpbmcuLi4KICAgICAgICAjIGxpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKICAgICAgICAjIGV4cG9ydF9zeW1ib2xzPU5vbmUsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKICAgICAgICAjIGJ1aWxkX3RlbXA9Tm9uZQoKICAgICAgICBhc3NlcnQgb3V0cHV0X2RpciBpcyBOb25lICAjIGRpc3R1dGlscyBidWlsZF9leHQgZG9lc24ndCBwYXNzIHRoaXMKICAgICAgICBvdXRwdXRfZGlyLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQob3V0cHV0X2xpYm5hbWUpCiAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCiAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKCJ4Iikuc3RhcnRzd2l0aCgnbGliJyk6CiAgICAgICAgICAgICMgc3RyaXAgJ2xpYicgcHJlZml4OyB0aGlzIGlzIGtsdWRneSBpZiBzb21lIHBsYXRmb3JtIHVzZXMKICAgICAgICAgICAgIyBhIGRpZmZlcmVudCBwcmVmaXgKICAgICAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVszOl0KCiAgICAgICAgc2VsZi5jcmVhdGVfc3RhdGljX2xpYigKICAgICAgICAgICAgb2JqZWN0cywgYmFzZW5hbWUsIG91dHB1dF9kaXIsIGRlYnVnLCB0YXJnZXRfbGFuZwogICAgICAgICkKCgpkZWYgX2dldF9jb25maWdfdmFyXzgzNyhuYW1lKToKICAgICIiIgogICAgSW4gaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9wdWxsLzgzNywgd2UgZGlzY292ZXJlZAogICAgUHl0aG9uIDMuMy4wIGV4cG9zZXMgdGhlIGV4dGVuc2lvbiBzdWZmaXggdW5kZXIgdGhlIG5hbWUgJ1NPJy4KICAgICIiIgogICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzLCAxKToKICAgICAgICBuYW1lID0gJ1NPJwogICAgcmV0dXJuIGdldF9jb25maWdfdmFyKG5hbWUpClBLAwQUAAAAAAAAACEAQEZC3HwlAAB8JQAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHlmcm9tIGdsb2IgaW1wb3J0IGdsb2IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9weSBhcyBvcmlnCmltcG9ydCBvcwppbXBvcnQgZm5tYXRjaAppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IGlvCmltcG9ydCBkaXN0dXRpbHMuZXJyb3JzCmltcG9ydCBpdGVydG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwLCBmaWx0ZXIsIGZpbHRlcmZhbHNlCgp0cnk6CiAgICBmcm9tIHNldHVwdG9vbHMubGliMnRvM19leCBpbXBvcnQgTWl4aW4ydG8zCmV4Y2VwdCBJbXBvcnRFcnJvcjoKCiAgICBjbGFzcyBNaXhpbjJ0bzM6CiAgICAgICAgZGVmIHJ1bl8ydG8zKHNlbGYsIGZpbGVzLCBkb2N0ZXN0cz1UcnVlKToKICAgICAgICAgICAgImRvIG5vdGhpbmciCgoKY2xhc3MgYnVpbGRfcHkob3JpZy5idWlsZF9weSwgTWl4aW4ydG8zKToKICAgICIiIkVuaGFuY2VkICdidWlsZF9weScgY29tbWFuZCB0aGF0IGluY2x1ZGVzIGRhdGEgZmlsZXMgd2l0aCBwYWNrYWdlcwoKICAgIFRoZSBkYXRhIGZpbGVzIGFyZSBzcGVjaWZpZWQgdmlhIGEgJ3BhY2thZ2VfZGF0YScgYXJndW1lbnQgdG8gJ3NldHVwKCknLgogICAgU2VlICdzZXR1cHRvb2xzLmRpc3QuRGlzdHJpYnV0aW9uJyBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIEFsc28sIHRoaXMgdmVyc2lvbiBvZiB0aGUgJ2J1aWxkX3B5JyBjb21tYW5kIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBib3RoCiAgICAncHlfbW9kdWxlcycgYW5kICdwYWNrYWdlcycgaW4gdGhlIHNhbWUgc2V0dXAgb3BlcmF0aW9uLgogICAgIiIiCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5idWlsZF9weS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RhdGEKICAgICAgICBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhID0gKHNlbGYuZGlzdHJpYnV0aW9uLmV4Y2x1ZGVfcGFja2FnZV9kYXRhIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSkKICAgICAgICBpZiAnZGF0YV9maWxlcycgaW4gc2VsZi5fX2RpY3RfXzoKICAgICAgICAgICAgZGVsIHNlbGYuX19kaWN0X19bJ2RhdGFfZmlsZXMnXQogICAgICAgIHNlbGYuX191cGRhdGVkX2ZpbGVzID0gW10KICAgICAgICBzZWxmLl9fZG9jdGVzdHNfMnRvMyA9IFtdCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiJCdWlsZCBtb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNvcHkgZGF0YSBmaWxlcyB0byBidWlsZCBkaXJlY3RvcnkiIiIKICAgICAgICBpZiBub3Qgc2VsZi5weV9tb2R1bGVzIGFuZCBub3Qgc2VsZi5wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIHNlbGYucHlfbW9kdWxlczoKICAgICAgICAgICAgc2VsZi5idWlsZF9tb2R1bGVzKCkKCiAgICAgICAgaWYgc2VsZi5wYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlcygpCiAgICAgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZV9kYXRhKCkKCiAgICAgICAgc2VsZi5ydW5fMnRvMyhzZWxmLl9fdXBkYXRlZF9maWxlcywgRmFsc2UpCiAgICAgICAgc2VsZi5ydW5fMnRvMyhzZWxmLl9fdXBkYXRlZF9maWxlcywgVHJ1ZSkKICAgICAgICBzZWxmLnJ1bl8ydG8zKHNlbGYuX19kb2N0ZXN0c18ydG8zLCBUcnVlKQoKICAgICAgICAjIE9ubHkgY29tcGlsZSBhY3R1YWwgLnB5IGZpbGVzLCB1c2luZyBvdXIgYmFzZSBjbGFzcycgaWRlYSBvZiB3aGF0IG91cgogICAgICAgICMgb3V0cHV0IGZpbGVzIGFyZS4KICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShvcmlnLmJ1aWxkX3B5LmdldF9vdXRwdXRzKHNlbGYsIGluY2x1ZGVfYnl0ZWNvZGU9MCkpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgICJsYXppbHkgY29tcHV0ZSBkYXRhIGZpbGVzIgogICAgICAgIGlmIGF0dHIgPT0gJ2RhdGFfZmlsZXMnOgogICAgICAgICAgICBzZWxmLmRhdGFfZmlsZXMgPSBzZWxmLl9nZXRfZGF0YV9maWxlcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGFfZmlsZXMKICAgICAgICByZXR1cm4gb3JpZy5idWlsZF9weS5fX2dldGF0dHJfXyhzZWxmLCBhdHRyKQoKICAgIGRlZiBidWlsZF9tb2R1bGUoc2VsZiwgbW9kdWxlLCBtb2R1bGVfZmlsZSwgcGFja2FnZSk6CiAgICAgICAgaWYgc2l4LlBZMiBhbmQgaXNpbnN0YW5jZShwYWNrYWdlLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgIyBhdm9pZCBlcnJvcnMgb24gUHl0aG9uIDIgd2hlbiB1bmljb2RlIGlzIHBhc3NlZCAoIzE5MCkKICAgICAgICAgICAgcGFja2FnZSA9IHBhY2thZ2Uuc3BsaXQoJy4nKQogICAgICAgIG91dGZpbGUsIGNvcGllZCA9IG9yaWcuYnVpbGRfcHkuYnVpbGRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgbW9kdWxlX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSkKICAgICAgICBpZiBjb3BpZWQ6CiAgICAgICAgICAgIHNlbGYuX191cGRhdGVkX2ZpbGVzLmFwcGVuZChvdXRmaWxlKQogICAgICAgIHJldHVybiBvdXRmaWxlLCBjb3BpZWQKCiAgICBkZWYgX2dldF9kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIGxpc3Qgb2YgJyhwYWNrYWdlLHNyY19kaXIsYnVpbGRfZGlyLGZpbGVuYW1lcyknIHR1cGxlcyIiIgogICAgICAgIHNlbGYuYW5hbHl6ZV9tYW5pZmVzdCgpCiAgICAgICAgcmV0dXJuIGxpc3QobWFwKHNlbGYuX2dldF9wa2dfZGF0YV9maWxlcywgc2VsZi5wYWNrYWdlcyBvciAoKSkpCgogICAgZGVmIF9nZXRfcGtnX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSk6CiAgICAgICAgIyBMb2NhdGUgcGFja2FnZSBzb3VyY2UgZGlyZWN0b3J5CiAgICAgICAgc3JjX2RpciA9IHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCgogICAgICAgICMgQ29tcHV0ZSBwYWNrYWdlIGJ1aWxkIGRpcmVjdG9yeQogICAgICAgIGJ1aWxkX2RpciA9IG9zLnBhdGguam9pbigqKFtzZWxmLmJ1aWxkX2xpYl0gKyBwYWNrYWdlLnNwbGl0KCcuJykpKQoKICAgICAgICAjIFN0cmlwIGRpcmVjdG9yeSBmcm9tIGdsb2JiZWQgZmlsZW5hbWVzCiAgICAgICAgZmlsZW5hbWVzID0gWwogICAgICAgICAgICBvcy5wYXRoLnJlbHBhdGgoZmlsZSwgc3JjX2RpcikKICAgICAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5maW5kX2RhdGFfZmlsZXMocGFja2FnZSwgc3JjX2RpcikKICAgICAgICBdCiAgICAgICAgcmV0dXJuIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzCgogICAgZGVmIGZpbmRfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyKToKICAgICAgICAiIiJSZXR1cm4gZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKICAgICAgICBwYXR0ZXJucyA9IHNlbGYuX2dldF9wbGF0Zm9ybV9wYXR0ZXJucygKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEsCiAgICAgICAgICAgIHBhY2thZ2UsCiAgICAgICAgICAgIHNyY19kaXIsCiAgICAgICAgKQogICAgICAgIGdsb2JzX2V4cGFuZGVkID0gbWFwKGdsb2IsIHBhdHRlcm5zKQogICAgICAgICMgZmxhdHRlbiB0aGUgZXhwYW5kZWQgZ2xvYnMgaW50byBhbiBpdGVyYWJsZSBvZiBtYXRjaGVzCiAgICAgICAgZ2xvYnNfbWF0Y2hlcyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKGdsb2JzX2V4cGFuZGVkKQogICAgICAgIGdsb2JfZmlsZXMgPSBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIGdsb2JzX21hdGNoZXMpCiAgICAgICAgZmlsZXMgPSBpdGVydG9vbHMuY2hhaW4oCiAgICAgICAgICAgIHNlbGYubWFuaWZlc3RfZmlsZXMuZ2V0KHBhY2thZ2UsIFtdKSwKICAgICAgICAgICAgZ2xvYl9maWxlcywKICAgICAgICApCiAgICAgICAgcmV0dXJuIHNlbGYuZXhjbHVkZV9kYXRhX2ZpbGVzKHBhY2thZ2UsIHNyY19kaXIsIGZpbGVzKQoKICAgIGRlZiBidWlsZF9wYWNrYWdlX2RhdGEoc2VsZik6CiAgICAgICAgIiIiQ29weSBkYXRhIGZpbGVzIGludG8gYnVpbGQgZGlyZWN0b3J5IiIiCiAgICAgICAgZm9yIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIHNlbGYuZGF0YV9maWxlczoKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihidWlsZF9kaXIsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgob3MucGF0aC5kaXJuYW1lKHRhcmdldCkpCiAgICAgICAgICAgICAgICBzcmNmaWxlID0gb3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgb3V0ZiwgY29waWVkID0gc2VsZi5jb3B5X2ZpbGUoc3JjZmlsZSwgdGFyZ2V0KQogICAgICAgICAgICAgICAgc3JjZmlsZSA9IG9zLnBhdGguYWJzcGF0aChzcmNmaWxlKQogICAgICAgICAgICAgICAgaWYgKGNvcGllZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgc3JjZmlsZSBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX19kb2N0ZXN0c18ydG8zLmFwcGVuZChvdXRmKQoKICAgIGRlZiBhbmFseXplX21hbmlmZXN0KHNlbGYpOgogICAgICAgIHNlbGYubWFuaWZlc3RfZmlsZXMgPSBtZiA9IHt9CiAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfcGFja2FnZV9kYXRhOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzcmNfZGlycyA9IHt9CiAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKICAgICAgICAgICAgIyBMb2NhdGUgcGFja2FnZSBzb3VyY2UgZGlyZWN0b3J5CiAgICAgICAgICAgIHNyY19kaXJzW2Fzc2VydF9yZWxhdGl2ZShzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKSldID0gcGFja2FnZQoKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBmb3IgcGF0aCBpbiBlaV9jbWQuZmlsZWxpc3QuZmlsZXM6CiAgICAgICAgICAgIGQsIGYgPSBvcy5wYXRoLnNwbGl0KGFzc2VydF9yZWxhdGl2ZShwYXRoKSkKICAgICAgICAgICAgcHJldiA9IE5vbmUKICAgICAgICAgICAgb2xkZiA9IGYKICAgICAgICAgICAgd2hpbGUgZCBhbmQgZCAhPSBwcmV2IGFuZCBkIG5vdCBpbiBzcmNfZGlyczoKICAgICAgICAgICAgICAgIHByZXYgPSBkCiAgICAgICAgICAgICAgICBkLCBkZiA9IG9zLnBhdGguc3BsaXQoZCkKICAgICAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oZGYsIGYpCiAgICAgICAgICAgIGlmIGQgaW4gc3JjX2RpcnM6CiAgICAgICAgICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcucHknKSBhbmQgZiA9PSBvbGRmOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIGl0J3MgYSBtb2R1bGUsIG5vdCBkYXRhCiAgICAgICAgICAgICAgICBtZi5zZXRkZWZhdWx0KHNyY19kaXJzW2RdLCBbXSkuYXBwZW5kKHBhdGgpCgogICAgZGVmIGdldF9kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgIHBhc3MgICMgTGF6aWx5IGNvbXB1dGUgZGF0YSBmaWxlcyBpbiBfZ2V0X2RhdGFfZmlsZXMoKSBmdW5jdGlvbi4KCiAgICBkZWYgY2hlY2tfcGFja2FnZShzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2Rpcik6CiAgICAgICAgIiIiQ2hlY2sgbmFtZXNwYWNlIHBhY2thZ2VzJyBfX2luaXRfXyBmb3IgZGVjbGFyZV9uYW1lc3BhY2UiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhY2thZ2VzX2NoZWNrZWRbcGFja2FnZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaW5pdF9weSA9IG9yaWcuYnVpbGRfcHkuY2hlY2tfcGFja2FnZShzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2RpcikKICAgICAgICBzZWxmLnBhY2thZ2VzX2NoZWNrZWRbcGFja2FnZV0gPSBpbml0X3B5CgogICAgICAgIGlmIG5vdCBpbml0X3B5IG9yIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybiBpbml0X3B5CgogICAgICAgIGZvciBwa2cgaW4gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICBpZiBwa2cgPT0gcGFja2FnZSBvciBwa2cuc3RhcnRzd2l0aChwYWNrYWdlICsgJy4nKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGluaXRfcHkKCiAgICAgICAgd2l0aCBpby5vcGVuKGluaXRfcHksICdyYicpIGFzIGY6CiAgICAgICAgICAgIGNvbnRlbnRzID0gZi5yZWFkKCkKICAgICAgICBpZiBiJ2RlY2xhcmVfbmFtZXNwYWNlJyBub3QgaW4gY29udGVudHM6CiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiTmFtZXNwYWNlIHBhY2thZ2UgcHJvYmxlbTogJXMgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSwgYnV0ICIKICAgICAgICAgICAgICAgICJpdHNcbl9faW5pdF9fLnB5IGRvZXMgbm90IGNhbGwgZGVjbGFyZV9uYW1lc3BhY2UoKSEgUGxlYXNlICIKICAgICAgICAgICAgICAgICdmaXggaXQuXG4oU2VlIHRoZSBzZXR1cHRvb2xzIG1hbnVhbCB1bmRlciAnCiAgICAgICAgICAgICAgICAnIk5hbWVzcGFjZSBQYWNrYWdlcyIgZm9yIGRldGFpbHMuKVxuIicgJSAocGFja2FnZSwpCiAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gaW5pdF9weQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5wYWNrYWdlc19jaGVja2VkID0ge30KICAgICAgICBvcmlnLmJ1aWxkX3B5LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQoKICAgIGRlZiBnZXRfcGFja2FnZV9kaXIoc2VsZiwgcGFja2FnZSk6CiAgICAgICAgcmVzID0gb3JpZy5idWlsZF9weS5nZXRfcGFja2FnZV9kaXIoc2VsZiwgcGFja2FnZSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zcmNfcm9vdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmRpc3RyaWJ1dGlvbi5zcmNfcm9vdCwgcmVzKQogICAgICAgIHJldHVybiByZXMKCiAgICBkZWYgZXhjbHVkZV9kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UsIHNyY19kaXIsIGZpbGVzKToKICAgICAgICAiIiJGaWx0ZXIgZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKICAgICAgICBmaWxlcyA9IGxpc3QoZmlsZXMpCiAgICAgICAgcGF0dGVybnMgPSBzZWxmLl9nZXRfcGxhdGZvcm1fcGF0dGVybnMoCiAgICAgICAgICAgIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEsCiAgICAgICAgICAgIHBhY2thZ2UsCiAgICAgICAgICAgIHNyY19kaXIsCiAgICAgICAgKQogICAgICAgIG1hdGNoX2dyb3VwcyA9ICgKICAgICAgICAgICAgZm5tYXRjaC5maWx0ZXIoZmlsZXMsIHBhdHRlcm4pCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zCiAgICAgICAgKQogICAgICAgICMgZmxhdHRlbiB0aGUgZ3JvdXBzIG9mIG1hdGNoZXMgaW50byBhbiBpdGVyYWJsZSBvZiBtYXRjaGVzCiAgICAgICAgbWF0Y2hlcyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKG1hdGNoX2dyb3VwcykKICAgICAgICBiYWQgPSBzZXQobWF0Y2hlcykKICAgICAgICBrZWVwZXJzID0gKAogICAgICAgICAgICBmbgogICAgICAgICAgICBmb3IgZm4gaW4gZmlsZXMKICAgICAgICAgICAgaWYgZm4gbm90IGluIGJhZAogICAgICAgICkKICAgICAgICAjIGRpdGNoIGR1cGVzCiAgICAgICAgcmV0dXJuIGxpc3QoX3VuaXF1ZV9ldmVyc2VlbihrZWVwZXJzKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9wbGF0Zm9ybV9wYXR0ZXJucyhzcGVjLCBwYWNrYWdlLCBzcmNfZGlyKToKICAgICAgICAiIiIKICAgICAgICB5aWVsZCBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHBhdHRlcm5zIChzdWl0YWJsZSBmb3IgZ2xvYgogICAgICAgIG9yIGZuX21hdGNoKSBmcm9tIGEgZ2xvYi1iYXNlZCBzcGVjIChzdWNoIGFzCiAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgb3Igc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YSkKICAgICAgICBtYXRjaGluZyBwYWNrYWdlIGluIHNyY19kaXIuCiAgICAgICAgIiIiCiAgICAgICAgcmF3X3BhdHRlcm5zID0gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICBzcGVjLmdldCgnJywgW10pLAogICAgICAgICAgICBzcGVjLmdldChwYWNrYWdlLCBbXSksCiAgICAgICAgKQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICMgRWFjaCBwYXR0ZXJuIGhhcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzcmNfZGlyLCBjb252ZXJ0X3BhdGgocGF0dGVybikpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHJhd19wYXR0ZXJucwogICAgICAgICkKCgojIGZyb20gUHl0aG9uIGRvY3MKZGVmIF91bmlxdWVfZXZlcnNlZW4oaXRlcmFibGUsIGtleT1Ob25lKToKICAgICJMaXN0IHVuaXF1ZSBlbGVtZW50cywgcHJlc2VydmluZyBvcmRlci4gUmVtZW1iZXIgYWxsIGVsZW1lbnRzIGV2ZXIgc2Vlbi4iCiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykgLS0+IEEgQiBDIEQKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQkJDY0FEJywgc3RyLmxvd2VyKSAtLT4gQSBCIEMgRAogICAgc2VlbiA9IHNldCgpCiAgICBzZWVuX2FkZCA9IHNlZW4uYWRkCiAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBmaWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICB5aWVsZCBlbGVtZW50CiAgICBlbHNlOgogICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCiAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAoKCmRlZiBhc3NlcnRfcmVsYXRpdmUocGF0aCk6CiAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICByZXR1cm4gcGF0aAogICAgZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCgogICAgbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIEVycm9yOiBzZXR1cCBzY3JpcHQgc3BlY2lmaWVzIGFuIGFic29sdXRlIHBhdGg6CgogICAgICAgICAgICAlcwoKICAgICAgICBzZXR1cCgpIGFyZ3VtZW50cyBtdXN0ICphbHdheXMqIGJlIC8tc2VwYXJhdGVkIHBhdGhzIHJlbGF0aXZlIHRvIHRoZQogICAgICAgIHNldHVwLnB5IGRpcmVjdG9yeSwgKm5ldmVyKiBhYnNvbHV0ZSBwYXRocy4KICAgICAgICAiIiIpLmxzdHJpcCgpICUgcGF0aAogICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcihtc2cpClBLAwQUAAAAAAAAACEAQFw7/24fAABuHwAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgZ2xvYgppbXBvcnQgaW8KCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgbm9ybWFsaXplX3BhdGgKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBlYXN5X2luc3RhbGwKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBuYW1lc3BhY2VzCmltcG9ydCBzZXR1cHRvb2xzCgoKY2xhc3MgZGV2ZWxvcChuYW1lc3BhY2VzLkRldmVsb3BJbnN0YWxsZXIsIGVhc3lfaW5zdGFsbCk6CiAgICAiIiJTZXQgdXAgcGFja2FnZSBmb3IgZGV2ZWxvcG1lbnQiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIHBhY2thZ2UgaW4gJ2RldmVsb3BtZW50IG1vZGUnIgoKICAgIHVzZXJfb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC51c2VyX29wdGlvbnMgKyBbCiAgICAgICAgKCJ1bmluc3RhbGwiLCAidSIsICJVbmluc3RhbGwgdGhpcyBzb3VyY2UgcGFja2FnZSIpLAogICAgICAgICgiZWdnLXBhdGg9IiwgTm9uZSwgIlNldCB0aGUgcGF0aCB0byBiZSB1c2VkIGluIHRoZSAuZWdnLWxpbmsgZmlsZSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbJ3VuaW5zdGFsbCddCgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBGYWxzZSAgIyBvdmVycmlkZSBiYXNlCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpZiBzZWxmLnVuaW5zdGFsbDoKICAgICAgICAgICAgc2VsZi5tdWx0aV92ZXJzaW9uID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnVuaW5zdGFsbF9saW5rKCkKICAgICAgICAgICAgc2VsZi51bmluc3RhbGxfbmFtZXNwYWNlcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Zvcl9kZXZlbG9wbWVudCgpCiAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucygpCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnVuaW5zdGFsbCA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19wYXRoID0gTm9uZQogICAgICAgIGVhc3lfaW5zdGFsbC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnNldHVwX3BhdGggPSBOb25lCiAgICAgICAgc2VsZi5hbHdheXNfY29weV9mcm9tID0gJy4nICAjIGFsd2F5cyBjb3B5IGVnZ3MgaW5zdGFsbGVkIGluIGN1cmRpcgoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGVpID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBpZiBlaS5icm9rZW5fZWdnX2luZm86CiAgICAgICAgICAgIHRlbXBsYXRlID0gIlBsZWFzZSByZW5hbWUgJXIgdG8gJXIgYmVmb3JlIHVzaW5nICdkZXZlbG9wJyIKICAgICAgICAgICAgYXJncyA9IGVpLmVnZ19pbmZvLCBlaS5icm9rZW5fZWdnX2luZm8KICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IodGVtcGxhdGUgJSBhcmdzKQogICAgICAgIHNlbGYuYXJncyA9IFtlaS5lZ2dfbmFtZV0KCiAgICAgICAgZWFzeV9pbnN0YWxsLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmV4cGFuZF9iYXNlZGlycygpCiAgICAgICAgc2VsZi5leHBhbmRfZGlycygpCiAgICAgICAgIyBwaWNrIHVwIHNldHVwLWRpciAuZWdnIGZpbGVzIG9ubHk6IG5vIC5lZ2ctaW5mbwogICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5zY2FuKGdsb2IuZ2xvYignKi5lZ2cnKSkKCiAgICAgICAgZWdnX2xpbmtfZm4gPSBlaS5lZ2dfbmFtZSArICcuZWdnLWxpbmsnCiAgICAgICAgc2VsZi5lZ2dfbGluayA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBlZ2dfbGlua19mbikKICAgICAgICBzZWxmLmVnZ19iYXNlID0gZWkuZWdnX2Jhc2UKICAgICAgICBpZiBzZWxmLmVnZ19wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGggPSBvcy5wYXRoLmFic3BhdGgoZWkuZWdnX2Jhc2UpCgogICAgICAgIHRhcmdldCA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgZWdnX3BhdGggPSBub3JtYWxpemVfcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVnZ19wYXRoKSkKICAgICAgICBpZiBlZ2dfcGF0aCAhPSB0YXJnZXQ6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIi0tZWdnLXBhdGggbXVzdCBiZSBhIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgaW5zdGFsbCIKICAgICAgICAgICAgICAgICIgZGlyZWN0b3J5IHRvICIgKyB0YXJnZXQKICAgICAgICAgICAgKQoKICAgICAgICAjIE1ha2UgYSBkaXN0cmlidXRpb24gZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlCiAgICAgICAgc2VsZi5kaXN0ID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgIFBhdGhNZXRhZGF0YSh0YXJnZXQsIG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfaW5mbykpLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9ZWkuZWdnX25hbWUKICAgICAgICApCgogICAgICAgIHNlbGYuc2V0dXBfcGF0aCA9IHNlbGYuX3Jlc29sdmVfc2V0dXBfcGF0aCgKICAgICAgICAgICAgc2VsZi5lZ2dfYmFzZSwKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciwKICAgICAgICAgICAgc2VsZi5lZ2dfcGF0aCwKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZXNvbHZlX3NldHVwX3BhdGgoZWdnX2Jhc2UsIGluc3RhbGxfZGlyLCBlZ2dfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdGUgYSBwYXRoIGZyb20gZWdnX2Jhc2UgYmFjayB0byAnLicgd2hlcmUgdGhlCiAgICAgICAgc2V0dXAgc2NyaXB0IHJlc2lkZXMgYW5kIGVuc3VyZSB0aGF0IHBhdGggcG9pbnRzIHRvIHRoZQogICAgICAgIHNldHVwIHBhdGggZnJvbSAkaW5zdGFsbF9kaXIvJGVnZ19wYXRoLgogICAgICAgICIiIgogICAgICAgIHBhdGhfdG9fc2V0dXAgPSBlZ2dfYmFzZS5yZXBsYWNlKG9zLnNlcCwgJy8nKS5yc3RyaXAoJy8nKQogICAgICAgIGlmIHBhdGhfdG9fc2V0dXAgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBwYXRoX3RvX3NldHVwID0gJy4uLycgKiAocGF0aF90b19zZXR1cC5jb3VudCgnLycpICsgMSkKICAgICAgICByZXNvbHZlZCA9IG5vcm1hbGl6ZV9wYXRoKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oaW5zdGFsbF9kaXIsIGVnZ19wYXRoLCBwYXRoX3RvX3NldHVwKQogICAgICAgICkKICAgICAgICBpZiByZXNvbHZlZCAhPSBub3JtYWxpemVfcGF0aChvcy5jdXJkaXIpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgYSBjb25zaXN0ZW50IHBhdGggdG8gc2V0dXAgc2NyaXB0IGZyb20iCiAgICAgICAgICAgICAgICAiIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkiLCByZXNvbHZlZCwgbm9ybWFsaXplX3BhdGgob3MuY3VyZGlyKSkKICAgICAgICByZXR1cm4gcGF0aF90b19zZXR1cAoKICAgIGRlZiBpbnN0YWxsX2Zvcl9kZXZlbG9wbWVudChzZWxmKToKICAgICAgICBpZiBzaXguUFkzIGFuZCBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndXNlXzJ0bzMnLCBGYWxzZSk6CiAgICAgICAgICAgICMgSWYgd2UgcnVuIDJ0bzMgd2UgY2FuIG5vdCBkbyB0aGlzIGlucGxhY2U6CgogICAgICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX3B5JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgICAgIGJweV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYnVpbGRfcHkiKQogICAgICAgICAgICBidWlsZF9wYXRoID0gbm9ybWFsaXplX3BhdGgoYnB5X2NtZC5idWlsZF9saWIpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnZWdnX2luZm8nLCBlZ2dfYmFzZT1idWlsZF9wYXRoKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCgogICAgICAgICAgICAjIEZpeHVwIGVnZy1saW5rIGFuZCBlYXN5LWluc3RhbGwucHRoCiAgICAgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGggPSBidWlsZF9wYXRoCiAgICAgICAgICAgIHNlbGYuZGlzdC5sb2NhdGlvbiA9IGJ1aWxkX3BhdGgKICAgICAgICAgICAgIyBYWFgKICAgICAgICAgICAgc2VsZi5kaXN0Ll9wcm92aWRlciA9IFBhdGhNZXRhZGF0YShidWlsZF9wYXRoLCBlaV9jbWQuZWdnX2luZm8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXaXRob3V0IDJ0bzMgaW5wbGFjZSB3b3JrcyBmaW5lOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQoKICAgICAgICBzZWxmLmluc3RhbGxfc2l0ZV9weSgpICAjIGVuc3VyZSB0aGF0IHRhcmdldCBkaXIgaXMgc2l0ZS1zYWZlCiAgICAgICAgaWYgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tOgogICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20pCiAgICAgICAgICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCiAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQoKICAgICAgICAjIGNyZWF0ZSBhbiAuZWdnLWxpbmsgaW4gdGhlIGluc3RhbGxhdGlvbiBkaXIsIHBvaW50aW5nIHRvIG91ciBlZ2cKICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5lZ2dfbGluaywgInciKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLmVnZ19wYXRoICsgIlxuIiArIHNlbGYuc2V0dXBfcGF0aCkKICAgICAgICAjIHBvc3Rwcm9jZXNzIHRoZSBpbnN0YWxsZWQgZGlzdHJvLCBmaXhpbmcgdXAgLnB0aCwgaW5zdGFsbGluZyBzY3JpcHRzLAogICAgICAgICMgYW5kIGhhbmRsaW5nIHJlcXVpcmVtZW50cwogICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oTm9uZSwgc2VsZi5kaXN0LCBub3Qgc2VsZi5ub19kZXBzKQoKICAgIGRlZiB1bmluc3RhbGxfbGluayhzZWxmKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmVnZ19saW5rKToKICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIChsaW5rIHRvICVzKSIsIHNlbGYuZWdnX2xpbmssIHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgICAgIGVnZ19saW5rX2ZpbGUgPSBvcGVuKHNlbGYuZWdnX2xpbmspCiAgICAgICAgICAgIGNvbnRlbnRzID0gW2xpbmUucnN0cmlwKCkgZm9yIGxpbmUgaW4gZWdnX2xpbmtfZmlsZV0KICAgICAgICAgICAgZWdnX2xpbmtfZmlsZS5jbG9zZSgpCiAgICAgICAgICAgIGlmIGNvbnRlbnRzIG5vdCBpbiAoW3NlbGYuZWdnX3BhdGhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLmVnZ19wYXRoLCBzZWxmLnNldHVwX3BhdGhdKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJMaW5rIHBvaW50cyB0byAlczogdW5pbnN0YWxsIGFib3J0ZWQiLCBjb250ZW50cykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZWdnX2xpbmspCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgc2VsZi51cGRhdGVfcHRoKHNlbGYuZGlzdCkgICMgcmVtb3ZlIGFueSAucHRoIGxpbmsgdG8gdXMKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICAjIFhYWCBzaG91bGQgYWxzbyBjaGVjayBmb3IgZW50cnkgcG9pbnQgc2NyaXB0cyEKICAgICAgICAgICAgbG9nLndhcm4oIk5vdGU6IHlvdSBtdXN0IHVuaW5zdGFsbCBvciByZXBsYWNlIHNjcmlwdHMgbWFudWFsbHkhIikKCiAgICBkZWYgaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICBpZiBkaXN0IGlzIG5vdCBzZWxmLmRpc3Q6CiAgICAgICAgICAgICMgSW5zdGFsbGluZyBhIGRlcGVuZGVuY3ksIHNvIGZhbGwgYmFjayB0byBub3JtYWwgYmVoYXZpb3IKICAgICAgICAgICAgcmV0dXJuIGVhc3lfaW5zdGFsbC5pbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpCgogICAgICAgICMgY3JlYXRlIHdyYXBwZXIgc2NyaXB0cyBpbiB0aGUgc2NyaXB0IGRpciwgcG9pbnRpbmcgdG8gZGlzdC5zY3JpcHRzCgogICAgICAgICMgbmV3LXN0eWxlLi4uCiAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQoKICAgICAgICAjIC4uLmFuZCBvbGQtc3R5bGUKICAgICAgICBmb3Igc2NyaXB0X25hbWUgaW4gc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0cyBvciBbXToKICAgICAgICAgICAgc2NyaXB0X3BhdGggPSBvcy5wYXRoLmFic3BhdGgoY29udmVydF9wYXRoKHNjcmlwdF9uYW1lKSkKICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9wYXRoKQogICAgICAgICAgICB3aXRoIGlvLm9wZW4oc2NyaXB0X3BhdGgpIGFzIHN0cm06CiAgICAgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IHN0cm0ucmVhZCgpCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoZGlzdCwgc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0LCBzY3JpcHRfcGF0aCkKCiAgICBkZWYgaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgZGlzdCA9IFZlcnNpb25sZXNzUmVxdWlyZW1lbnQoZGlzdCkKICAgICAgICByZXR1cm4gZWFzeV9pbnN0YWxsLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpCgoKY2xhc3MgVmVyc2lvbmxlc3NSZXF1aXJlbWVudChvYmplY3QpOgogICAgIiIiCiAgICBBZGFwdCBhIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIHRvIHNpbXBseSByZXR1cm4gdGhlIHByb2plY3QKICAgIG5hbWUgYXMgdGhlICdyZXF1aXJlbWVudCcgc28gdGhhdCBzY3JpcHRzIHdpbGwgd29yayBhY3Jvc3MKICAgIG11bHRpcGxlIHZlcnNpb25zLgoKICAgID4+PiBkaXN0ID0gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0nZm9vJywgdmVyc2lvbj0nMS4wJykKICAgID4+PiBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgJ2Zvbz09MS4wJwogICAgPj4+IGFkYXB0ZWRfZGlzdCA9IFZlcnNpb25sZXNzUmVxdWlyZW1lbnQoZGlzdCkKICAgID4+PiBzdHIoYWRhcHRlZF9kaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAnZm9vJwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QpOgogICAgICAgIHNlbGYuX19kaXN0ID0gZGlzdAoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fZGlzdCwgbmFtZSkKCiAgICBkZWYgYXNfcmVxdWlyZW1lbnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucHJvamVjdF9uYW1lClBLAwQUAAAAAAAAACEA/+j2kcADAADAAwAARAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZGlzdF9pbmZvLnB5IiIiCkNyZWF0ZSBhIGRpc3RfaW5mbyBkaXJlY3RvcnkKQXMgZGVmaW5lZCBpbiB0aGUgd2hlZWwgc3BlY2lmaWNhdGlvbgoiIiIKCmltcG9ydCBvcwoKZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCgoKY2xhc3MgZGlzdF9pbmZvKENvbW1hbmQpOgoKICAgIGRlc2NyaXB0aW9uID0gJ2NyZWF0ZSBhIC5kaXN0LWluZm8gZGlyZWN0b3J5JwoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2VnZy1iYXNlPScsICdlJywgImRpcmVjdG9yeSBjb250YWluaW5nIC5lZ2ctaW5mbyBkaXJlY3RvcmllcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSkiKSwKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgZWdnX2luZm8gPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVnZ19pbmZvLmVnZ19iYXNlID0gc2VsZi5lZ2dfYmFzZQogICAgICAgIGVnZ19pbmZvLmZpbmFsaXplX29wdGlvbnMoKQogICAgICAgIGVnZ19pbmZvLnJ1bigpCiAgICAgICAgZGlzdF9pbmZvX2RpciA9IGVnZ19pbmZvLmVnZ19pbmZvWzotbGVuKCcuZWdnLWluZm8nKV0gKyAnLmRpc3QtaW5mbycKICAgICAgICBsb2cuaW5mbygiY3JlYXRpbmcgJ3t9JyIuZm9ybWF0KG9zLnBhdGguYWJzcGF0aChkaXN0X2luZm9fZGlyKSkpCgogICAgICAgIGJkaXN0X3doZWVsID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0X3doZWVsJykKICAgICAgICBiZGlzdF93aGVlbC5lZ2cyZGlzdChlZ2dfaW5mby5lZ2dfaW5mbywgZGlzdF9pbmZvX2RpcikKUEsDBBQAAAAAAAAAIQCrdBLpVVQBAFVUAQBHAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHkjIS91c3IvYmluL2VudiBweXRob24KIiIiCkVhc3kgSW5zdGFsbAotLS0tLS0tLS0tLS0KCkEgdG9vbCBmb3IgZG9pbmcgYXV0b21hdGljIGRvd25sb2FkL2V4dHJhY3QvYnVpbGQgb2YgZGlzdHV0aWxzLWJhc2VkIFB5dGhvbgpwYWNrYWdlcy4gIEZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLCBzZWUgdGhlIGFjY29tcGFueWluZyBFYXN5SW5zdGFsbC50eHQKZmlsZSwgb3IgdmlzaXQgdGhlIGBFYXN5SW5zdGFsbCBob21lIHBhZ2VgX18uCgpfXyBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Vhc3lfaW5zdGFsbC5odG1sCgoiIiIKCmZyb20gZ2xvYiBpbXBvcnQgZ2xvYgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoLCBzdWJzdF92YXJzCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKAogICAgRGlzdHV0aWxzQXJnRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yLAogICAgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsCikKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBJTlNUQUxMX1NDSEVNRVMsIFNDSEVNRV9LRVlTCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfc2NyaXB0cyBpbXBvcnQgZmlyc3RfbGluZV9yZQpmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB6aXBpbXBvcnQKaW1wb3J0IHNodXRpbAppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHJlCmltcG9ydCBzdGF0CmltcG9ydCByYW5kb20KaW1wb3J0IHRleHR3cmFwCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgc2l0ZQppbXBvcnQgc3RydWN0CmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzaGxleAppbXBvcnQgaW8KCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyLCBtYXAKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgcnVuX3NldHVwCmZyb20gc2V0dXB0b29scy5weTMxY29tcGF0IGltcG9ydCBnZXRfcGF0aCwgZ2V0X2NvbmZpZ192YXJzCmZyb20gc2V0dXB0b29scy5weTI3Y29tcGF0IGltcG9ydCBybXRyZWVfc2FmZQpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgc2V0b3B0CmZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19hcmNoaXZlCmZyb20gc2V0dXB0b29scy5wYWNrYWdlX2luZGV4IGltcG9ydCAoCiAgICBQYWNrYWdlSW5kZXgsIHBhcnNlX3JlcXVpcmVtZW50X2FyZywgVVJMX1NDSEVNRSwKKQpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgYmRpc3RfZWdnLCBlZ2dfaW5mbwpmcm9tIHNldHVwdG9vbHMud2hlZWwgaW1wb3J0IFdoZWVsCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKAogICAgeWllbGRfbGluZXMsIG5vcm1hbGl6ZV9wYXRoLCByZXNvdXJjZV9zdHJpbmcsIGVuc3VyZV9kaXJlY3RvcnksCiAgICBnZXRfZGlzdHJpYnV0aW9uLCBmaW5kX2Rpc3RyaWJ1dGlvbnMsIEVudmlyb25tZW50LCBSZXF1aXJlbWVudCwKICAgIERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBFZ2dNZXRhZGF0YSwgV29ya2luZ1NldCwgRGlzdHJpYnV0aW9uTm90Rm91bmQsCiAgICBWZXJzaW9uQ29uZmxpY3QsIERFVkVMT1BfRElTVCwKKQppbXBvcnQgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0CgojIFR1cm4gb24gUEVQNDQwV2FybmluZ3MKd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImRlZmF1bHQiLCBjYXRlZ29yeT1wa2dfcmVzb3VyY2VzLlBFUDQ0MFdhcm5pbmcpCgpfX2FsbF9fID0gWwogICAgJ3NhbWVmaWxlJywgJ2Vhc3lfaW5zdGFsbCcsICdQdGhEaXN0cmlidXRpb25zJywgJ2V4dHJhY3Rfd2luaW5zdF9jZmcnLAogICAgJ21haW4nLCAnZ2V0X2V4ZV9wcmVmaXhlcycsCl0KCgpkZWYgaXNfNjRiaXQoKToKICAgIHJldHVybiBzdHJ1Y3QuY2FsY3NpemUoIlAiKSA9PSA4CgoKZGVmIHNhbWVmaWxlKHAxLCBwMik6CiAgICAiIiIKICAgIERldGVybWluZSBpZiB0d28gcGF0aHMgcmVmZXJlbmNlIHRoZSBzYW1lIGZpbGUuCgogICAgQXVnbWVudHMgb3MucGF0aC5zYW1lZmlsZSB0byB3b3JrIG9uIFdpbmRvd3MgYW5kCiAgICBzdXBwcmVzc2VzIGVycm9ycyBpZiB0aGUgcGF0aCBkb2Vzbid0IGV4aXN0LgogICAgIiIiCiAgICBib3RoX2V4aXN0ID0gb3MucGF0aC5leGlzdHMocDEpIGFuZCBvcy5wYXRoLmV4aXN0cyhwMikKICAgIHVzZV9zYW1lZmlsZSA9IGhhc2F0dHIob3MucGF0aCwgJ3NhbWVmaWxlJykgYW5kIGJvdGhfZXhpc3QKICAgIGlmIHVzZV9zYW1lZmlsZToKICAgICAgICByZXR1cm4gb3MucGF0aC5zYW1lZmlsZShwMSwgcDIpCiAgICBub3JtX3AxID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAxKSkKICAgIG5vcm1fcDIgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGgubm9ybWNhc2UocDIpKQogICAgcmV0dXJuIG5vcm1fcDEgPT0gbm9ybV9wMgoKCmlmIHNpeC5QWTI6CgogICAgZGVmIF90b19hc2NpaShzKToKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBpc2FzY2lpKHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2l4LnRleHRfdHlwZShzLCAnYXNjaWknKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQplbHNlOgoKICAgIGRlZiBfdG9fYXNjaWkocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCdhc2NpaScpCgogICAgZGVmIGlzYXNjaWkocyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzLmVuY29kZSgnYXNjaWknKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKCl9vbmVfbGluZXIgPSBsYW1iZGEgdGV4dDogdGV4dHdyYXAuZGVkZW50KHRleHQpLnN0cmlwKCkucmVwbGFjZSgnXG4nLCAnOyAnKQoKCmNsYXNzIGVhc3lfaW5zdGFsbChDb21tYW5kKToKICAgICIiIk1hbmFnZSBhIGRvd25sb2FkL2J1aWxkL2luc3RhbGwgcHJvY2VzcyIiIgogICAgZGVzY3JpcHRpb24gPSAiRmluZC9nZXQvaW5zdGFsbCBQeXRob24gcGFja2FnZXMiCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IFRydWUKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdwcmVmaXg9JywgTm9uZSwgImluc3RhbGxhdGlvbiBwcmVmaXgiKSwKICAgICAgICAoInppcC1vayIsICJ6IiwgImluc3RhbGwgcGFja2FnZSBhcyBhIHppcGZpbGUiKSwKICAgICAgICAoIm11bHRpLXZlcnNpb24iLCAibSIsICJtYWtlIGFwcHMgaGF2ZSB0byByZXF1aXJlKCkgYSB2ZXJzaW9uIiksCiAgICAgICAgKCJ1cGdyYWRlIiwgIlUiLCAiZm9yY2UgdXBncmFkZSAoc2VhcmNoZXMgUHlQSSBmb3IgbGF0ZXN0IHZlcnNpb25zKSIpLAogICAgICAgICgiaW5zdGFsbC1kaXI9IiwgImQiLCAiaW5zdGFsbCBwYWNrYWdlIHRvIERJUiIpLAogICAgICAgICgic2NyaXB0LWRpcj0iLCAicyIsICJpbnN0YWxsIHNjcmlwdHMgdG8gRElSIiksCiAgICAgICAgKCJleGNsdWRlLXNjcmlwdHMiLCAieCIsICJEb24ndCBpbnN0YWxsIHNjcmlwdHMiKSwKICAgICAgICAoImFsd2F5cy1jb3B5IiwgImEiLCAiQ29weSBhbGwgbmVlZGVkIHBhY2thZ2VzIHRvIGluc3RhbGwgZGlyIiksCiAgICAgICAgKCJpbmRleC11cmw9IiwgImkiLCAiYmFzZSBVUkwgb2YgUHl0aG9uIFBhY2thZ2UgSW5kZXgiKSwKICAgICAgICAoImZpbmQtbGlua3M9IiwgImYiLCAiYWRkaXRpb25hbCBVUkwocykgdG8gc2VhcmNoIGZvciBwYWNrYWdlcyIpLAogICAgICAgICgiYnVpbGQtZGlyZWN0b3J5PSIsICJiIiwKICAgICAgICAgImRvd25sb2FkL2V4dHJhY3QvYnVpbGQgaW4gRElSOyBrZWVwIHRoZSByZXN1bHRzIiksCiAgICAgICAgKCdvcHRpbWl6ZT0nLCAnTycsCiAgICAgICAgICJhbHNvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb246IC1PMSBmb3IgXCJweXRob24gLU9cIiwgIgogICAgICAgICAiLU8yIGZvciBcInB5dGhvbiAtT09cIiwgYW5kIC1PMCB0byBkaXNhYmxlIFtkZWZhdWx0OiAtTzBdIiksCiAgICAgICAgKCdyZWNvcmQ9JywgTm9uZSwKICAgICAgICAgImZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyIpLAogICAgICAgICgnYWx3YXlzLXVuemlwJywgJ1onLCAiZG9uJ3QgaW5zdGFsbCBhcyBhIHppcGZpbGUsIG5vIG1hdHRlciB3aGF0IiksCiAgICAgICAgKCdzaXRlLWRpcnM9JywgJ1MnLCAibGlzdCBvZiBkaXJlY3RvcmllcyB3aGVyZSAucHRoIGZpbGVzIHdvcmsiKSwKICAgICAgICAoJ2VkaXRhYmxlJywgJ2UnLCAiSW5zdGFsbCBzcGVjaWZpZWQgcGFja2FnZXMgaW4gZWRpdGFibGUgZm9ybSIpLAogICAgICAgICgnbm8tZGVwcycsICdOJywgImRvbid0IGluc3RhbGwgZGVwZW5kZW5jaWVzIiksCiAgICAgICAgKCdhbGxvdy1ob3N0cz0nLCAnSCcsICJwYXR0ZXJuKHMpIHRoYXQgaG9zdG5hbWVzIG11c3QgbWF0Y2giKSwKICAgICAgICAoJ2xvY2FsLXNuYXBzaG90cy1vaycsICdsJywKICAgICAgICAgImFsbG93IGJ1aWxkaW5nIGVnZ3MgZnJvbSBsb2NhbCBjaGVja291dHMiKSwKICAgICAgICAoJ3ZlcnNpb24nLCBOb25lLCAicHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIpLAogICAgICAgICgnbm8tZmluZC1saW5rcycsIE5vbmUsCiAgICAgICAgICJEb24ndCBsb2FkIGZpbmQtbGlua3MgZGVmaW5lZCBpbiBwYWNrYWdlcyBiZWluZyBpbnN0YWxsZWQiKQogICAgXQogICAgYm9vbGVhbl9vcHRpb25zID0gWwogICAgICAgICd6aXAtb2snLCAnbXVsdGktdmVyc2lvbicsICdleGNsdWRlLXNjcmlwdHMnLCAndXBncmFkZScsICdhbHdheXMtY29weScsCiAgICAgICAgJ2VkaXRhYmxlJywKICAgICAgICAnbm8tZGVwcycsICdsb2NhbC1zbmFwc2hvdHMtb2snLCAndmVyc2lvbicKICAgIF0KCiAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgaGVscF9tc2cgPSAiaW5zdGFsbCBpbiB1c2VyIHNpdGUtcGFja2FnZSAnJXMnIiAlIHNpdGUuVVNFUl9TSVRFCiAgICAgICAgdXNlcl9vcHRpb25zLmFwcGVuZCgoJ3VzZXInLCBOb25lLCBoZWxwX21zZykpCiAgICAgICAgYm9vbGVhbl9vcHRpb25zLmFwcGVuZCgndXNlcicpCgogICAgbmVnYXRpdmVfb3B0ID0geydhbHdheXMtdW56aXAnOiAnemlwLW9rJ30KICAgIGNyZWF0ZV9pbmRleCA9IFBhY2thZ2VJbmRleAoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgIyB0aGUgLS11c2VyIG9wdGlvbiBzZWVtcyB0byBiZSBhbiBvcHQtaW4gb25lLAogICAgICAgICMgc28gdGhlIGRlZmF1bHQgc2hvdWxkIGJlIEZhbHNlLgogICAgICAgIHNlbGYudXNlciA9IDAKICAgICAgICBzZWxmLnppcF9vayA9IHNlbGYubG9jYWxfc25hcHNob3RzX29rID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyA9IE5vbmUKICAgICAgICBzZWxmLmluZGV4X3VybCA9IE5vbmUKICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBOb25lCiAgICAgICAgc2VsZi5idWlsZF9kaXJlY3RvcnkgPSBOb25lCiAgICAgICAgc2VsZi5hcmdzID0gTm9uZQogICAgICAgIHNlbGYub3B0aW1pemUgPSBzZWxmLnJlY29yZCA9IE5vbmUKICAgICAgICBzZWxmLnVwZ3JhZGUgPSBzZWxmLmFsd2F5c19jb3B5ID0gc2VsZi5tdWx0aV92ZXJzaW9uID0gTm9uZQogICAgICAgIHNlbGYuZWRpdGFibGUgPSBzZWxmLm5vX2RlcHMgPSBzZWxmLmFsbG93X2hvc3RzID0gTm9uZQogICAgICAgIHNlbGYucm9vdCA9IHNlbGYucHJlZml4ID0gc2VsZi5ub19yZXBvcnQgPSBOb25lCiAgICAgICAgc2VsZi52ZXJzaW9uID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9wdXJlbGliID0gTm9uZSAgIyBmb3IgcHVyZSBtb2R1bGUgZGlzdHJpYnV0aW9ucwogICAgICAgIHNlbGYuaW5zdGFsbF9wbGF0bGliID0gTm9uZSAgIyBub24tcHVyZSAoZGlzdHMgdy8gZXh0ZW5zaW9ucykKICAgICAgICBzZWxmLmluc3RhbGxfaGVhZGVycyA9IE5vbmUgICMgZm9yIEMvQysrIGhlYWRlcnMKICAgICAgICBzZWxmLmluc3RhbGxfbGliID0gTm9uZSAgIyBzZXQgdG8gZWl0aGVyIHB1cmVsaWIgb3IgcGxhdGxpYgogICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHRzID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9kYXRhID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9wbGF0YmFzZSA9IE5vbmUKICAgICAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2VyYmFzZSA9IHNpdGUuVVNFUl9CQVNFCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2Vyc2l0ZSA9IHNpdGUuVVNFUl9TSVRFCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJiYXNlID0gTm9uZQogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcnNpdGUgPSBOb25lCiAgICAgICAgc2VsZi5ub19maW5kX2xpbmtzID0gTm9uZQoKICAgICAgICAjIE9wdGlvbnMgbm90IHNwZWNpZmlhYmxlIHZpYSBjb21tYW5kIGxpbmUKICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXggPSBOb25lCiAgICAgICAgc2VsZi5wdGhfZmlsZSA9IHNlbGYuYWx3YXlzX2NvcHlfZnJvbSA9IE5vbmUKICAgICAgICBzZWxmLnNpdGVfZGlycyA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxlZF9wcm9qZWN0cyA9IHt9CiAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gRmFsc2UKICAgICAgICAjIEFsd2F5cyByZWFkIGVhc3lfaW5zdGFsbCBvcHRpb25zLCBldmVuIGlmIHdlIGFyZSBzdWJjbGFzc2VkLCBvciBoYXZlCiAgICAgICAgIyBhbiBpbmRlcGVuZGVudCBpbnN0YW5jZSBjcmVhdGVkLiAgVGhpcyBlbnN1cmVzIHRoYXQgZGVmYXVsdHMgd2lsbAogICAgICAgICMgYWx3YXlzIGNvbWUgZnJvbSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlKHMpJyAiZWFzeV9pbnN0YWxsIgogICAgICAgICMgc2VjdGlvbiwgZXZlbiBpZiB0aGlzIGlzIGEgImRldmVsb3AiIG9yICJpbnN0YWxsIiBjb21tYW5kLCBvciBzb21lCiAgICAgICAgIyBvdGhlciBlbWJlZGRpbmcuCiAgICAgICAgc2VsZi5fZHJ5X3J1biA9IE5vbmUKICAgICAgICBzZWxmLnZlcmJvc2UgPSBzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uX3NldF9jb21tYW5kX29wdGlvbnMoCiAgICAgICAgICAgIHNlbGYsIHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykKICAgICAgICApCgogICAgZGVmIGRlbGV0ZV9ibG9ja2VycyhzZWxmLCBibG9ja2Vycyk6CiAgICAgICAgZXh0YW50X2Jsb2NrZXJzID0gKAogICAgICAgICAgICBmaWxlbmFtZSBmb3IgZmlsZW5hbWUgaW4gYmxvY2tlcnMKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpIG9yIG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKQogICAgICAgICkKICAgICAgICBsaXN0KG1hcChzZWxmLl9kZWxldGVfcGF0aCwgZXh0YW50X2Jsb2NrZXJzKSkKCiAgICBkZWYgX2RlbGV0ZV9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyAlcyIsIHBhdGgpCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaXNfdHJlZSA9IG9zLnBhdGguaXNkaXIocGF0aCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhwYXRoKQogICAgICAgIHJlbW92ZXIgPSBybXRyZWUgaWYgaXNfdHJlZSBlbHNlIG9zLnVubGluawogICAgICAgIHJlbW92ZXIocGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3JlbmRlcl92ZXJzaW9uKCk6CiAgICAgICAgIiIiCiAgICAgICAgUmVuZGVyIHRoZSBTZXR1cHRvb2xzIHZlcnNpb24gYW5kIGluc3RhbGxhdGlvbiBkZXRhaWxzLCB0aGVuIGV4aXQuCiAgICAgICAgIiIiCiAgICAgICAgdmVyID0gc3lzLnZlcnNpb25bOjNdCiAgICAgICAgZGlzdCA9IGdldF9kaXN0cmlidXRpb24oJ3NldHVwdG9vbHMnKQogICAgICAgIHRtcGwgPSAnc2V0dXB0b29scyB7ZGlzdC52ZXJzaW9ufSBmcm9tIHtkaXN0LmxvY2F0aW9ufSAoUHl0aG9uIHt2ZXJ9KScKICAgICAgICBwcmludCh0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KCkKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnZlcnNpb24gYW5kIHNlbGYuX3JlbmRlcl92ZXJzaW9uKCkKCiAgICAgICAgcHlfdmVyc2lvbiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KICAgICAgICBwcmVmaXgsIGV4ZWNfcHJlZml4ID0gZ2V0X2NvbmZpZ192YXJzKCdwcmVmaXgnLCAnZXhlY19wcmVmaXgnKQoKICAgICAgICBzZWxmLmNvbmZpZ192YXJzID0gewogICAgICAgICAgICAnZGlzdF9uYW1lJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSwKICAgICAgICAgICAgJ2Rpc3RfdmVyc2lvbic6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCiAgICAgICAgICAgICdkaXN0X2Z1bGxuYW1lJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCksCiAgICAgICAgICAgICdweV92ZXJzaW9uJzogcHlfdmVyc2lvbiwKICAgICAgICAgICAgJ3B5X3ZlcnNpb25fc2hvcnQnOiBweV92ZXJzaW9uWzA6M10sCiAgICAgICAgICAgICdweV92ZXJzaW9uX25vZG90JzogcHlfdmVyc2lvblswXSArIHB5X3ZlcnNpb25bMl0sCiAgICAgICAgICAgICdzeXNfcHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAncHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAnc3lzX2V4ZWNfcHJlZml4JzogZXhlY19wcmVmaXgsCiAgICAgICAgICAgICdleGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LAogICAgICAgICAgICAjIE9ubHkgcHl0aG9uIDMuMisgaGFzIGFiaWZsYWdzCiAgICAgICAgICAgICdhYmlmbGFncyc6IGdldGF0dHIoc3lzLCAnYWJpZmxhZ3MnLCAnJyksCiAgICAgICAgfQoKICAgICAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgICAgIHNlbGYuY29uZmlnX3ZhcnNbJ3VzZXJiYXNlJ10gPSBzZWxmLmluc3RhbGxfdXNlcmJhc2UKICAgICAgICAgICAgc2VsZi5jb25maWdfdmFyc1sndXNlcnNpdGUnXSA9IHNlbGYuaW5zdGFsbF91c2Vyc2l0ZQoKICAgICAgICBzZWxmLl9maXhfaW5zdGFsbF9kaXJfZm9yX3VzZXJfc2l0ZSgpCgogICAgICAgIHNlbGYuZXhwYW5kX2Jhc2VkaXJzKCkKICAgICAgICBzZWxmLmV4cGFuZF9kaXJzKCkKCiAgICAgICAgc2VsZi5fZXhwYW5kKAogICAgICAgICAgICAnaW5zdGFsbF9kaXInLCAnc2NyaXB0X2RpcicsICdidWlsZF9kaXJlY3RvcnknLAogICAgICAgICAgICAnc2l0ZV9kaXJzJywKICAgICAgICApCiAgICAgICAgIyBJZiBhIG5vbi1kZWZhdWx0IGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgd2FzIHNwZWNpZmllZCwgZGVmYXVsdCB0aGUKICAgICAgICAjIHNjcmlwdCBkaXJlY3RvcnkgdG8gbWF0Y2ggaXQuCiAgICAgICAgaWYgc2VsZi5zY3JpcHRfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc2NyaXB0X2RpciA9IHNlbGYuaW5zdGFsbF9kaXIKCiAgICAgICAgaWYgc2VsZi5ub19maW5kX2xpbmtzIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYubm9fZmluZF9saW5rcyA9IEZhbHNlCgogICAgICAgICMgTGV0IGluc3RhbGxfZGlyIGdldCBzZXQgYnkgaW5zdGFsbF9saWIgY29tbWFuZCwgd2hpY2ggaW4gdHVybgogICAgICAgICMgZ2V0cyBpdHMgaW5mbyBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQsIGFuZCB0YWtlcyBpbnRvIGFjY291bnQKICAgICAgICAjIC0tcHJlZml4IGFuZCAtLWhvbWUgYW5kIGFsbCB0aGF0IG90aGVyIGNydWQuCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoCiAgICAgICAgICAgICdpbnN0YWxsX2xpYicsICgnaW5zdGFsbF9kaXInLCAnaW5zdGFsbF9kaXInKQogICAgICAgICkKICAgICAgICAjIExpa2V3aXNlLCBzZXQgZGVmYXVsdCBzY3JpcHRfZGlyIGZyb20gJ2luc3RhbGxfc2NyaXB0cy5pbnN0YWxsX2RpcicKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygKICAgICAgICAgICAgJ2luc3RhbGxfc2NyaXB0cycsICgnaW5zdGFsbF9kaXInLCAnc2NyaXB0X2RpcicpCiAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLnVzZXIgYW5kIHNlbGYuaW5zdGFsbF9wdXJlbGliOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gc2VsZi5pbnN0YWxsX3B1cmVsaWIKICAgICAgICAgICAgc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5pbnN0YWxsX3NjcmlwdHMKICAgICAgICAjIGRlZmF1bHQgLS1yZWNvcmQgZnJvbSB0aGUgaW5zdGFsbCBjb21tYW5kCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGwnLCAoJ3JlY29yZCcsICdyZWNvcmQnKSkKICAgICAgICAjIFNob3VsZCB0aGlzIGJlIG1vdmVkIHRvIHRoZSBpZiBzdGF0ZW1lbnQgYmVsb3c/IEl0J3Mgbm90IHVzZWQKICAgICAgICAjIGVsc2V3aGVyZQogICAgICAgIG5vcm1wYXRoID0gbWFwKG5vcm1hbGl6ZV9wYXRoLCBzeXMucGF0aCkKICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMgPSBnZXRfc2l0ZV9kaXJzKCkKICAgICAgICBpZiBzZWxmLnNpdGVfZGlycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2l0ZV9kaXJzID0gWwogICAgICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKHMuc3RyaXAoKSkgZm9yIHMgaW4KICAgICAgICAgICAgICAgIHNlbGYuc2l0ZV9kaXJzLnNwbGl0KCcsJykKICAgICAgICAgICAgXQogICAgICAgICAgICBmb3IgZCBpbiBzaXRlX2RpcnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiJXMgKGluIC0tc2l0ZS1kaXJzKSBkb2VzIG5vdCBleGlzdCIsIGQpCiAgICAgICAgICAgICAgICBlbGlmIG5vcm1hbGl6ZV9wYXRoKGQpIG5vdCBpbiBub3JtcGF0aDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgZCArICIgKGluIC0tc2l0ZS1kaXJzKSBpcyBub3Qgb24gc3lzLnBhdGgiCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMuYXBwZW5kKG5vcm1hbGl6ZV9wYXRoKGQpKQogICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBzZWxmLmNoZWNrX3NpdGVfZGlyKCkKICAgICAgICBzZWxmLmluZGV4X3VybCA9IHNlbGYuaW5kZXhfdXJsIG9yICJodHRwczovL3B5cGkucHl0aG9uLm9yZy9zaW1wbGUiCiAgICAgICAgc2VsZi5zaGFkb3dfcGF0aCA9IHNlbGYuYWxsX3NpdGVfZGlyc1s6XQogICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gc2VsZi5pbnN0YWxsX2Rpciwgbm9ybWFsaXplX3BhdGgoc2VsZi5zY3JpcHRfZGlyKToKICAgICAgICAgICAgaWYgcGF0aF9pdGVtIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgogICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5pbnNlcnQoMCwgcGF0aF9pdGVtKQoKICAgICAgICBpZiBzZWxmLmFsbG93X2hvc3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBob3N0cyA9IFtzLnN0cmlwKCkgZm9yIHMgaW4gc2VsZi5hbGxvd19ob3N0cy5zcGxpdCgnLCcpXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGhvc3RzID0gWycqJ10KICAgICAgICBpZiBzZWxmLnBhY2thZ2VfaW5kZXggaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4ID0gc2VsZi5jcmVhdGVfaW5kZXgoCiAgICAgICAgICAgICAgICBzZWxmLmluZGV4X3VybCwgc2VhcmNoX3BhdGg9c2VsZi5zaGFkb3dfcGF0aCwgaG9zdHM9aG9zdHMsCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmxvY2FsX2luZGV4ID0gRW52aXJvbm1lbnQoc2VsZi5zaGFkb3dfcGF0aCArIHN5cy5wYXRoKQoKICAgICAgICBpZiBzZWxmLmZpbmRfbGlua3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5maW5kX2xpbmtzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IHNlbGYuZmluZF9saW5rcy5zcGxpdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gW10KICAgICAgICBpZiBzZWxmLmxvY2FsX3NuYXBzaG90c19vazoKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LnNjYW5fZWdnX2xpbmtzKHNlbGYuc2hhZG93X3BhdGggKyBzeXMucGF0aCkKICAgICAgICBpZiBub3Qgc2VsZi5ub19maW5kX2xpbmtzOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3Moc2VsZi5maW5kX2xpbmtzKQogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsICgnb3B0aW1pemUnLCAnb3B0aW1pemUnKSkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLm9wdGltaXplLCBpbnQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLm9wdGltaXplID0gaW50KHNlbGYub3B0aW1pemUpCiAgICAgICAgICAgICAgICBpZiBub3QgKDAgPD0gc2VsZi5vcHRpbWl6ZSA8PSAyKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIi0tb3B0aW1pemUgbXVzdCBiZSAwLCAxLCBvciAyIikKCiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZSBhbmQgbm90IHNlbGYuYnVpbGRfZGlyZWN0b3J5OgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSBidWlsZCBkaXJlY3RvcnkgKC1iKSB3aGVuIHVzaW5nIC0tZWRpdGFibGUiCiAgICAgICAgICAgICkKICAgICAgICBpZiBub3Qgc2VsZi5hcmdzOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICJObyB1cmxzLCBmaWxlbmFtZXMsIG9yIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgKHNlZSAtLWhlbHApIikKCiAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KCiAgICBkZWYgX2ZpeF9pbnN0YWxsX2Rpcl9mb3JfdXNlcl9zaXRlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZpeCB0aGUgaW5zdGFsbF9kaXIgaWYgIi0tdXNlciIgd2FzIHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYudXNlciBvciBub3Qgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5jcmVhdGVfaG9tZV9wYXRoKCkKICAgICAgICBpZiBzZWxmLmluc3RhbGxfdXNlcmJhc2UgaXMgTm9uZToKICAgICAgICAgICAgbXNnID0gIlVzZXIgYmFzZSBkaXJlY3RvcnkgaXMgbm90IHNwZWNpZmllZCIKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihtc2cpCiAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBzZWxmLmluc3RhbGxfdXNlcmJhc2UKICAgICAgICBzY2hlbWVfbmFtZSA9IG9zLm5hbWUucmVwbGFjZSgncG9zaXgnLCAndW5peCcpICsgJ191c2VyJwogICAgICAgIHNlbGYuc2VsZWN0X3NjaGVtZShzY2hlbWVfbmFtZSkKCiAgICBkZWYgX2V4cGFuZF9hdHRycyhzZWxmLCBhdHRycyk6CiAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CiAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnIG9yIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsKQogICAgICAgICAgICAgICAgdmFsID0gc3Vic3RfdmFycyh2YWwsIHNlbGYuY29uZmlnX3ZhcnMpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKCiAgICBkZWYgZXhwYW5kX2Jhc2VkaXJzKHNlbGYpOgogICAgICAgICIiIkNhbGxzIGBvcy5wYXRoLmV4cGFuZHVzZXJgIG9uIGluc3RhbGxfYmFzZSwgaW5zdGFsbF9wbGF0YmFzZSBhbmQKICAgICAgICByb290LiIiIgogICAgICAgIHNlbGYuX2V4cGFuZF9hdHRycyhbJ2luc3RhbGxfYmFzZScsICdpbnN0YWxsX3BsYXRiYXNlJywgJ3Jvb3QnXSkKCiAgICBkZWYgZXhwYW5kX2RpcnMoc2VsZik6CiAgICAgICAgIiIiQ2FsbHMgYG9zLnBhdGguZXhwYW5kdXNlcmAgb24gaW5zdGFsbCBkaXJzLiIiIgogICAgICAgIGRpcnMgPSBbCiAgICAgICAgICAgICdpbnN0YWxsX3B1cmVsaWInLAogICAgICAgICAgICAnaW5zdGFsbF9wbGF0bGliJywKICAgICAgICAgICAgJ2luc3RhbGxfbGliJywKICAgICAgICAgICAgJ2luc3RhbGxfaGVhZGVycycsCiAgICAgICAgICAgICdpbnN0YWxsX3NjcmlwdHMnLAogICAgICAgICAgICAnaW5zdGFsbF9kYXRhJywKICAgICAgICBdCiAgICAgICAgc2VsZi5fZXhwYW5kX2F0dHJzKGRpcnMpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpZiBzZWxmLnZlcmJvc2UgIT0gc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZToKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKQogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5hcmdzOgogICAgICAgICAgICAgICAgc2VsZi5lYXN5X2luc3RhbGwoc3BlYywgbm90IHNlbGYubm9fZGVwcykKICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICBvdXRwdXRzID0gc2VsZi5vdXRwdXRzCiAgICAgICAgICAgICAgICBpZiBzZWxmLnJvb3Q6ICAjIHN0cmlwIGFueSBwYWNrYWdlIHByZWZpeAogICAgICAgICAgICAgICAgICAgIHJvb3RfbGVuID0gbGVuKHNlbGYucm9vdCkKICAgICAgICAgICAgICAgICAgICBmb3IgY291bnRlciBpbiByYW5nZShsZW4ob3V0cHV0cykpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzW2NvdW50ZXJdID0gb3V0cHV0c1tjb3VudGVyXVtyb290X2xlbjpdCiAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgZmlsZV91dGlsCgogICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIGZpbGVfdXRpbC53cml0ZV9maWxlLCAoc2VsZi5yZWNvcmQsIG91dHB1dHMpLAogICAgICAgICAgICAgICAgICAgICJ3cml0aW5nIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIHRvICclcyciICUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY29yZAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlKQoKICAgIGRlZiBwc2V1ZG9fdGVtcG5hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgcHNldWRvLXRlbXBuYW1lIGJhc2UgaW4gdGhlIGluc3RhbGwgZGlyZWN0b3J5LgogICAgICAgIFRoaXMgY29kZSBpcyBpbnRlbnRpb25hbGx5IG5haXZlOyBpZiBhIG1hbGljaW91cyBwYXJ0eSBjYW4gd3JpdGUgdG8KICAgICAgICB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB5b3UncmUgYWxyZWFkeSBpbiBkZWVwIGRvb2Rvby4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGlkID0gcmFuZG9tLnJhbmRpbnQoMCwgc3lzLm1heHNpemUpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAidGVzdC1lYXN5LWluc3RhbGwtJXMiICUgcGlkKQoKICAgIGRlZiB3YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIGNoZWNrX3NpdGVfZGlyKHNlbGYpOgogICAgICAgICIiIlZlcmlmeSB0aGF0IHNlbGYuaW5zdGFsbF9kaXIgaXMgLnB0aC1jYXBhYmxlIGRpciwgaWYgbmVlZGVkIiIiCgogICAgICAgIGluc3RkaXIgPSBub3JtYWxpemVfcGF0aChzZWxmLmluc3RhbGxfZGlyKQogICAgICAgIHB0aF9maWxlID0gb3MucGF0aC5qb2luKGluc3RkaXIsICdlYXN5LWluc3RhbGwucHRoJykKCiAgICAgICAgIyBJcyBpdCBhIGNvbmZpZ3VyZWQsIFBZVEhPTlBBVEgsIGltcGxpY2l0LCBvciBleHBsaWNpdCBzaXRlIGRpcj8KICAgICAgICBpc19zaXRlX2RpciA9IGluc3RkaXIgaW4gc2VsZi5hbGxfc2l0ZV9kaXJzCgogICAgICAgIGlmIG5vdCBpc19zaXRlX2RpciBhbmQgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgIyBObz8gIFRoZW4gZGlyZWN0bHkgdGVzdCB3aGV0aGVyIGl0IGRvZXMgLnB0aCBmaWxlIHByb2Nlc3NpbmcKICAgICAgICAgICAgaXNfc2l0ZV9kaXIgPSBzZWxmLmNoZWNrX3B0aF9wcm9jZXNzaW5nKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBjYW4gd3JpdGUgdG8gdGFyZ2V0IGRpcgogICAgICAgICAgICB0ZXN0ZmlsZSA9IHNlbGYucHNldWRvX3RlbXBuYW1lKCkgKyAnLndyaXRlLXRlc3QnCiAgICAgICAgICAgIHRlc3RfZXhpc3RzID0gb3MucGF0aC5leGlzdHModGVzdGZpbGUpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIHRlc3RfZXhpc3RzOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZmlsZSkKICAgICAgICAgICAgICAgIG9wZW4odGVzdGZpbGUsICd3JykuY2xvc2UoKQogICAgICAgICAgICAgICAgb3MudW5saW5rKHRlc3RmaWxlKQogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgc2VsZi5jYW50X3dyaXRlX3RvX3RhcmdldCgpCgogICAgICAgIGlmIG5vdCBpc19zaXRlX2RpciBhbmQgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgIyBDYW4ndCBpbnN0YWxsIG5vbi1tdWx0aSB0byBub24tc2l0ZSBkaXIKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc2VsZi5ub19kZWZhdWx0X3ZlcnNpb25fbXNnKCkpCgogICAgICAgIGlmIGlzX3NpdGVfZGlyOgogICAgICAgICAgICBpZiBzZWxmLnB0aF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gUHRoRGlzdHJpYnV0aW9ucyhwdGhfZmlsZSwgc2VsZi5hbGxfc2l0ZV9kaXJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUgPSBOb25lCgogICAgICAgIGlmIGluc3RkaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCwgX3B5dGhvbnBhdGgoKSk6CiAgICAgICAgICAgICMgb25seSBQWVRIT05QQVRIIGRpcnMgbmVlZCBhIHNpdGUucHksIHNvIHByZXRlbmQgaXQncyB0aGVyZQogICAgICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCiAgICAgICAgZWxpZiBzZWxmLm11bHRpX3ZlcnNpb24gYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhwdGhfZmlsZSk6CiAgICAgICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUgICMgZG9uJ3QgbmVlZCBzaXRlLnB5IGluIHRoaXMgY2FzZQogICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZSAgIyBhbmQgZG9uJ3QgY3JlYXRlIGEgLnB0aCBmaWxlCiAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IGluc3RkaXIKCiAgICBfX2NhbnRfd3JpdGVfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIGNhbid0IGNyZWF0ZSBvciByZW1vdmUgZmlsZXMgaW4gaW5zdGFsbCBkaXJlY3RvcnkKCiAgICAgICAgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gYWRkIG9yIHJlbW92ZSBmaWxlcyBpbiB0aGUKICAgICAgICBpbnN0YWxsYXRpb24gZGlyZWN0b3J5OgoKICAgICAgICAgICAgJXMKCiAgICAgICAgVGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCAodmlhIC0taW5zdGFsbC1kaXIsIC0tcHJlZml4LCBvcgogICAgICAgIHRoZSBkaXN0dXRpbHMgZGVmYXVsdCBzZXR0aW5nKSB3YXM6CgogICAgICAgICAgICAlcwogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBfX25vdF9leGlzdHNfaWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgVGhpcyBkaXJlY3RvcnkgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiAgUGxlYXNlIGNyZWF0ZSBpdCBhbmQgdHJ5IGFnYWluLCBvcgogICAgICAgIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5ICh1c2luZyB0aGUgLWQgb3IgLS1pbnN0YWxsLWRpcgogICAgICAgIG9wdGlvbikuCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIF9fYWNjZXNzX21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBQZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8gIElmIHRoZQogICAgICAgIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgaXMgYSBzeXN0ZW0tb3duZWQgZGlyZWN0b3J5LCB5b3UgbWF5IG5lZWQgdG8gc2lnbiBpbgogICAgICAgIGFzIHRoZSBhZG1pbmlzdHJhdG9yIG9yICJyb290IiBhY2NvdW50LiAgSWYgeW91IGRvIG5vdCBoYXZlIGFkbWluaXN0cmF0aXZlCiAgICAgICAgYWNjZXNzIHRvIHRoaXMgbWFjaGluZSwgeW91IG1heSB3aXNoIHRvIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24KICAgICAgICBkaXJlY3RvcnksIHByZWZlcmFibHkgb25lIHRoYXQgaXMgbGlzdGVkIGluIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAogICAgICAgIHZhcmlhYmxlLgoKICAgICAgICBGb3IgaW5mb3JtYXRpb24gb24gb3RoZXIgb3B0aW9ucywgeW91IG1heSB3aXNoIHRvIGNvbnN1bHQgdGhlCiAgICAgICAgZG9jdW1lbnRhdGlvbiBhdDoKCiAgICAgICAgICBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Vhc3lfaW5zdGFsbC5odG1sCgogICAgICAgIFBsZWFzZSBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGZvciB5b3VyIHN5c3RlbSBhbmQgdHJ5IGFnYWluLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgY2FudF93cml0ZV90b190YXJnZXQoc2VsZik6CiAgICAgICAgbXNnID0gc2VsZi5fX2NhbnRfd3JpdGVfbXNnICUgKHN5cy5leGNfaW5mbygpWzFdLCBzZWxmLmluc3RhbGxfZGlyLCkKCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuaW5zdGFsbF9kaXIpOgogICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19ub3RfZXhpc3RzX2lkCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9fYWNjZXNzX21zZwogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKCiAgICBkZWYgY2hlY2tfcHRoX3Byb2Nlc3Npbmcoc2VsZik6CiAgICAgICAgIiIiRW1waXJpY2FsbHkgdmVyaWZ5IHdoZXRoZXIgLnB0aCBmaWxlcyBhcmUgc3VwcG9ydGVkIGluIGluc3QuIGRpciIiIgogICAgICAgIGluc3RkaXIgPSBzZWxmLmluc3RhbGxfZGlyCiAgICAgICAgbG9nLmluZm8oIkNoZWNraW5nIC5wdGggZmlsZSBzdXBwb3J0IGluICVzIiwgaW5zdGRpcikKICAgICAgICBwdGhfZmlsZSA9IHNlbGYucHNldWRvX3RlbXBuYW1lKCkgKyAiLnB0aCIKICAgICAgICBva19maWxlID0gcHRoX2ZpbGUgKyAnLm9rJwogICAgICAgIG9rX2V4aXN0cyA9IG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpCiAgICAgICAgdG1wbCA9IF9vbmVfbGluZXIoIiIiCiAgICAgICAgICAgIGltcG9ydCBvcwogICAgICAgICAgICBmID0gb3Blbih7b2tfZmlsZSFyfSwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKCdPSycpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAiIiIpICsgJ1xuJwogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgb2tfZXhpc3RzOgogICAgICAgICAgICAgICAgb3MudW5saW5rKG9rX2ZpbGUpCiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUob2tfZmlsZSkKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0Lm1ha2VkaXJzKGRpcm5hbWUsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgIGYgPSBvcGVuKHB0aF9maWxlLCAndycpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgc2VsZi5jYW50X3dyaXRlX3RvX3RhcmdldCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZi53cml0ZSh0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgZiA9IE5vbmUKICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBzeXMuZXhlY3V0YWJsZQogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChleGVjdXRhYmxlKQogICAgICAgICAgICAgICAgICAgIGFsdCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCAncHl0aG9udy5leGUnKQogICAgICAgICAgICAgICAgICAgIHVzZV9hbHQgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lLmxvd2VyKCkgPT0gJ3B5dGhvbi5leGUnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhhbHQpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIHVzZV9hbHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdXNlIHB5dGhvbncuZXhlIHRvIGF2b2lkIG9wZW5pbmcgYSBjb25zb2xlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYWx0CgogICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCgogICAgICAgICAgICAgICAgc3Bhd24oW2V4ZWN1dGFibGUsICctRScsICctYycsICdwYXNzJ10sIDApCgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICJURVNUIFBBU1NFRDogJXMgYXBwZWFycyB0byBzdXBwb3J0IC5wdGggZmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZGlyCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG9rX2ZpbGUpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwdGhfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHB0aF9maWxlKQogICAgICAgIGlmIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgIGxvZy53YXJuKCJURVNUIEZBSUxFRDogJXMgZG9lcyBOT1Qgc3VwcG9ydCAucHRoIGZpbGVzIiwgaW5zdGRpcikKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICAiIiJXcml0ZSBhbGwgdGhlIHNjcmlwdHMgZm9yIGBkaXN0YCwgdW5sZXNzIHNjcmlwdHMgYXJlIGV4Y2x1ZGVkIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZV9zY3JpcHRzIGFuZCBkaXN0Lm1ldGFkYXRhX2lzZGlyKCdzY3JpcHRzJyk6CiAgICAgICAgICAgIGZvciBzY3JpcHRfbmFtZSBpbiBkaXN0Lm1ldGFkYXRhX2xpc3RkaXIoJ3NjcmlwdHMnKToKICAgICAgICAgICAgICAgIGlmIGRpc3QubWV0YWRhdGFfaXNkaXIoJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lKToKICAgICAgICAgICAgICAgICAgICAjIFRoZSAic2NyaXB0IiBpcyBhIGRpcmVjdG9yeSwgbGlrZWx5IGEgUHl0aG9uIDMKICAgICAgICAgICAgICAgICAgICAjIF9fcHljYWNoZV9fIGRpcmVjdG9yeSwgc28gc2tpcCBpdC4KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICBkaXN0LCBzY3JpcHRfbmFtZSwKICAgICAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YSgnc2NyaXB0cy8nICsgc2NyaXB0X25hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQoKICAgIGRlZiBhZGRfb3V0cHV0KHNlbGYsIHBhdGgpOgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgpOgogICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQob3MucGF0aC5qb2luKGJhc2UsIGZpbGVuYW1lKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKHBhdGgpCgogICAgZGVmIG5vdF9lZGl0YWJsZShzZWxmLCBzcGVjKToKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50ICVyOiB5b3UgY2FuJ3QgdXNlIGZpbGVuYW1lcyBvciBVUkxzICIKICAgICAgICAgICAgICAgICJ3aXRoIC0tZWRpdGFibGUgKGV4Y2VwdCB2aWEgdGhlIC0tZmluZC1saW5rcyBvcHRpb24pLiIKICAgICAgICAgICAgICAgICUgKHNwZWMsKQogICAgICAgICAgICApCgogICAgZGVmIGNoZWNrX2VkaXRhYmxlKHNlbGYsIHNwZWMpOgogICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICIlciBhbHJlYWR5IGV4aXN0cyBpbiAlczsgY2FuJ3QgZG8gYSBjaGVja291dCB0aGVyZSIgJQogICAgICAgICAgICAgICAgKHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSkKICAgICAgICAgICAgKQoKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgX3RtcGRpcihzZWxmKToKICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD1zaXgudSgiZWFzeV9pbnN0YWxsLSIpKQogICAgICAgIHRyeToKICAgICAgICAgICAgIyBjYXN0IHRvIHN0ciBhcyB3b3JrYXJvdW5kIGZvciAjNzA5IGFuZCAjNzEwIGFuZCAjNzEyCiAgICAgICAgICAgIHlpZWxkIHN0cih0bXBkaXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MucGF0aC5leGlzdHModG1wZGlyKSBhbmQgcm10cmVlKHJtdHJlZV9zYWZlKHRtcGRpcikpCgogICAgZGVmIGVhc3lfaW5zdGFsbChzZWxmLCBzcGVjLCBkZXBzPUZhbHNlKToKICAgICAgICBpZiBub3Qgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NpdGVfcHkoKQoKICAgICAgICB3aXRoIHNlbGYuX3RtcGRpcigpIGFzIHRtcGRpcjoKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYywgUmVxdWlyZW1lbnQpOgogICAgICAgICAgICAgICAgaWYgVVJMX1NDSEVNRShzcGVjKToKICAgICAgICAgICAgICAgICAgICAjIEl0J3MgYSB1cmwsIGRvd25sb2FkIGl0IHRvIHRtcGRpciBhbmQgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2VkaXRhYmxlKHNwZWMpCiAgICAgICAgICAgICAgICAgICAgZGwgPSBzZWxmLnBhY2thZ2VfaW5kZXguZG93bmxvYWQoc3BlYywgdG1wZGlyKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShOb25lLCBkbCwgdG1wZGlyLCBkZXBzLCBUcnVlKQoKICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CiAgICAgICAgICAgICAgICAgICAgIyBFeGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSwganVzdCBwcm9jZXNzIGl0IGRpcmVjdGx5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZWRpdGFibGUoc3BlYykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgc3BlYywgdG1wZGlyLCBkZXBzLCBUcnVlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzcGVjID0gcGFyc2VfcmVxdWlyZW1lbnRfYXJnKHNwZWMpCgogICAgICAgICAgICBzZWxmLmNoZWNrX2VkaXRhYmxlKHNwZWMpCiAgICAgICAgICAgIGRpc3QgPSBzZWxmLnBhY2thZ2VfaW5kZXguZmV0Y2hfZGlzdHJpYnV0aW9uKAogICAgICAgICAgICAgICAgc3BlYywgdG1wZGlyLCBzZWxmLnVwZ3JhZGUsIHNlbGYuZWRpdGFibGUsCiAgICAgICAgICAgICAgICBub3Qgc2VsZi5hbHdheXNfY29weSwgc2VsZi5sb2NhbF9pbmRleAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgIG1zZyA9ICJDb3VsZCBub3QgZmluZCBzdWl0YWJsZSBkaXN0cmlidXRpb24gZm9yICVyIiAlIHNwZWMKICAgICAgICAgICAgICAgIGlmIHNlbGYuYWx3YXlzX2NvcHk6CiAgICAgICAgICAgICAgICAgICAgbXNnICs9ICIgKC0tYWx3YXlzLWNvcHkgc2tpcHMgc3lzdGVtIGFuZCBkZXZlbG9wbWVudCBlZ2dzKSIKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKICAgICAgICAgICAgZWxpZiBkaXN0LnByZWNlZGVuY2UgPT0gREVWRUxPUF9ESVNUOgogICAgICAgICAgICAgICAgIyAuZWdnLWluZm8gZGlzdHMgZG9uJ3QgbmVlZCBpbnN0YWxsaW5nLCBqdXN0IHByb2Nlc3MgZGVwcwogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzLCAiVXNpbmciKQogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShzcGVjLCBkaXN0LmxvY2F0aW9uLCB0bXBkaXIsIGRlcHMpCgogICAgZGVmIGluc3RhbGxfaXRlbShzZWxmLCBzcGVjLCBkb3dubG9hZCwgdG1wZGlyLCBkZXBzLCBpbnN0YWxsX25lZWRlZD1GYWxzZSk6CgogICAgICAgICMgSW5zdGFsbGF0aW9uIGlzIGFsc28gbmVlZGVkIGlmIGZpbGUgaW4gdG1wZGlyIG9yIGlzIG5vdCBhbiBlZ2cKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIHNlbGYuYWx3YXlzX2NvcHkKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIG9zLnBhdGguZGlybmFtZShkb3dubG9hZCkgPT0gdG1wZGlyCiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBub3QgZG93bmxvYWQuZW5kc3dpdGgoJy5lZ2cnKQogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3IgKAogICAgICAgICAgICBzZWxmLmFsd2F5c19jb3B5X2Zyb20gaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShub3JtYWxpemVfcGF0aChkb3dubG9hZCkpID09CiAgICAgICAgICAgIG5vcm1hbGl6ZV9wYXRoKHNlbGYuYWx3YXlzX2NvcHlfZnJvbSkKICAgICAgICApCgogICAgICAgIGlmIHNwZWMgYW5kIG5vdCBpbnN0YWxsX25lZWRlZDoKICAgICAgICAgICAgIyBhdCB0aGlzIHBvaW50LCB3ZSBrbm93IGl0J3MgYSBsb2NhbCAuZWdnLCB3ZSBqdXN0IGRvbid0IGtub3cgaWYKICAgICAgICAgICAgIyBpdCdzIGFscmVhZHkgaW5zdGFsbGVkLgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLmxvY2FsX2luZGV4W3NwZWMucHJvamVjdF9uYW1lXToKICAgICAgICAgICAgICAgIGlmIGRpc3QubG9jYXRpb24gPT0gZG93bmxvYWQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGluc3RhbGxfbmVlZGVkID0gVHJ1ZSAgIyBpdCdzIG5vdCBpbiB0aGUgbG9jYWwgaW5kZXgKCiAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgJXMiLCBvcy5wYXRoLmJhc2VuYW1lKGRvd25sb2FkKSkKCiAgICAgICAgaWYgaW5zdGFsbF9uZWVkZWQ6CiAgICAgICAgICAgIGRpc3RzID0gc2VsZi5pbnN0YWxsX2VnZ3Moc3BlYywgZG93bmxvYWQsIHRtcGRpcikKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3QsIGRlcHMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzdHMgPSBbc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRvd25sb2FkKV0KICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0c1swXSwgZGVwcywgIlVzaW5nIikKCiAgICAgICAgaWYgc3BlYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBpZiBkaXN0IGluIHNwZWM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKCiAgICBkZWYgc2VsZWN0X3NjaGVtZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJTZXRzIHRoZSBpbnN0YWxsIGRpcmVjdG9yaWVzIGJ5IGFwcGx5aW5nIHRoZSBpbnN0YWxsIHNjaGVtZXMuIiIiCiAgICAgICAgIyBpdCdzIHRoZSBjYWxsZXIncyBwcm9ibGVtIGlmIHRoZXkgc3VwcGx5IGEgYmFkIG5hbWUhCiAgICAgICAgc2NoZW1lID0gSU5TVEFMTF9TQ0hFTUVTW25hbWVdCiAgICAgICAgZm9yIGtleSBpbiBTQ0hFTUVfS0VZUzoKICAgICAgICAgICAgYXR0cm5hbWUgPSAnaW5zdGFsbF8nICsga2V5CiAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgYXR0cm5hbWUpIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHJuYW1lLCBzY2hlbWVba2V5XSkKCiAgICBkZWYgcHJvY2Vzc19kaXN0cmlidXRpb24oc2VsZiwgcmVxdWlyZW1lbnQsIGRpc3QsIGRlcHM9VHJ1ZSwgKmluZm8pOgogICAgICAgIHNlbGYudXBkYXRlX3B0aChkaXN0KQogICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGQoZGlzdCkKICAgICAgICBpZiBkaXN0IGluIHNlbGYubG9jYWxfaW5kZXhbZGlzdC5rZXldOgogICAgICAgICAgICBzZWxmLmxvY2FsX2luZGV4LnJlbW92ZShkaXN0KQogICAgICAgIHNlbGYubG9jYWxfaW5kZXguYWRkKGRpc3QpCiAgICAgICAgc2VsZi5pbnN0YWxsX2VnZ19zY3JpcHRzKGRpc3QpCiAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHNbZGlzdC5rZXldID0gZGlzdAogICAgICAgIGxvZy5pbmZvKHNlbGYuaW5zdGFsbGF0aW9uX3JlcG9ydChyZXF1aXJlbWVudCwgZGlzdCwgKmluZm8pKQogICAgICAgIGlmIChkaXN0Lmhhc19tZXRhZGF0YSgnZGVwZW5kZW5jeV9saW5rcy50eHQnKSBhbmQKICAgICAgICAgICAgICAgIG5vdCBzZWxmLm5vX2ZpbmRfbGlua3MpOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3MoCiAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZGVwZW5kZW5jeV9saW5rcy50eHQnKQogICAgICAgICAgICApCiAgICAgICAgaWYgbm90IGRlcHMgYW5kIG5vdCBzZWxmLmFsd2F5c19jb3B5OgogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIG5vdCBOb25lIGFuZCBkaXN0LmtleSAhPSByZXF1aXJlbWVudC5rZXk6CiAgICAgICAgICAgIGxvZy53YXJuKCJTa2lwcGluZyBkZXBlbmRlbmNpZXMgZm9yICVzIiwgZGlzdCkKICAgICAgICAgICAgcmV0dXJuICAjIFhYWCB0aGlzIGlzIG5vdCB0aGUgZGlzdHJpYnV0aW9uIHdlIHdlcmUgbG9va2luZyBmb3IKICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIE5vbmUgb3IgZGlzdCBub3QgaW4gcmVxdWlyZW1lbnQ6CiAgICAgICAgICAgICMgaWYgd2Ugd291bmQgdXAgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uLCByZXNvbHZlIHdoYXQgd2UndmUgZ290CiAgICAgICAgICAgIGRpc3RyZXEgPSBkaXN0LmFzX3JlcXVpcmVtZW50KCkKICAgICAgICAgICAgcmVxdWlyZW1lbnQgPSBSZXF1aXJlbWVudChzdHIoZGlzdHJlcSkpCiAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIHJlcXVpcmVtZW50KQogICAgICAgIHRyeToKICAgICAgICAgICAgZGlzdHJvcyA9IFdvcmtpbmdTZXQoW10pLnJlc29sdmUoCiAgICAgICAgICAgICAgICBbcmVxdWlyZW1lbnRdLCBzZWxmLmxvY2FsX2luZGV4LCBzZWxmLmVhc3lfaW5zdGFsbAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IERpc3RyaWJ1dGlvbk5vdEZvdW5kIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHN0cihlKSkKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKGUucmVwb3J0KCkpCiAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weSBvciBzZWxmLmFsd2F5c19jb3B5X2Zyb206CiAgICAgICAgICAgICMgRm9yY2UgYWxsIHRoZSByZWxldmFudCBkaXN0cm9zIHRvIGJlIGNvcGllZCBvciBhY3RpdmF0ZWQKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHJvczoKICAgICAgICAgICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBzZWxmLmluc3RhbGxlZF9wcm9qZWN0czoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAgICAgbG9nLmluZm8oIkZpbmlzaGVkIHByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIHJlcXVpcmVtZW50KQoKICAgIGRlZiBzaG91bGRfdW56aXAoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgc2VsZi56aXBfb2sgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi56aXBfb2sKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnbm90LXppcC1zYWZlJyk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgaWYgbm90IGRpc3QuaGFzX21ldGFkYXRhKCd6aXAtc2FmZScpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBtYXliZV9tb3ZlKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpOgogICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc3BlYy5rZXkpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0KToKICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBidWlsZCBkaXJlY3RvcnkgJXMgd2lsbCBub3QgYmUga2VwdCIKICAgICAgICAgICAgKQogICAgICAgICAgICBsb2cud2Fybihtc2csIHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc2V0dXBfYmFzZSkKICAgICAgICAgICAgcmV0dXJuIHNldHVwX2Jhc2UKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgogICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZGlybmFtZShkaXN0X2ZpbGVuYW1lKSA9PSBzZXR1cF9iYXNlOgogICAgICAgICAgICAgICAgb3MudW5saW5rKGRpc3RfZmlsZW5hbWUpICAjIGdldCBpdCBvdXQgb2YgdGhlIHRtcCBkaXIKICAgICAgICAgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHNldHVwX2Jhc2UpCiAgICAgICAgICAgIGlmIGxlbihjb250ZW50cykgPT0gMToKICAgICAgICAgICAgICAgIGRpc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgY29udGVudHNbMF0pCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIG9ubHkgdGhpbmcgdGhlcmUgaXMgYSBkaXJlY3RvcnksIG1vdmUgaXQgaW5zdGVhZAogICAgICAgICAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBkaXN0X2ZpbGVuYW1lCiAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkc3QpCiAgICAgICAgc2h1dGlsLm1vdmUoc2V0dXBfYmFzZSwgZHN0KQogICAgICAgIHJldHVybiBkc3QKCiAgICBkZWYgaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgc2VsZi5leGNsdWRlX3NjcmlwdHM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZvciBhcmdzIGluIFNjcmlwdFdyaXRlci5iZXN0KCkuZ2V0X2FyZ3MoZGlzdCk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KCphcmdzKQoKICAgIGRlZiBpbnN0YWxsX3NjcmlwdChzZWxmLCBkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIGRldl9wYXRoPU5vbmUpOgogICAgICAgICIiIkdlbmVyYXRlIGEgbGVnYWN5IHNjcmlwdCB3cmFwcGVyIGFuZCBpbnN0YWxsIGl0IiIiCiAgICAgICAgc3BlYyA9IHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAgICAgaXNfc2NyaXB0ID0gaXNfcHl0aG9uX3NjcmlwdChzY3JpcHRfdGV4dCwgc2NyaXB0X25hbWUpCgogICAgICAgIGlmIGlzX3NjcmlwdDoKICAgICAgICAgICAgYm9keSA9IHNlbGYuX2xvYWRfdGVtcGxhdGUoZGV2X3BhdGgpICUgbG9jYWxzKCkKICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBTY3JpcHRXcml0ZXIuZ2V0X2hlYWRlcihzY3JpcHRfdGV4dCkgKyBib2R5CiAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoc2NyaXB0X25hbWUsIF90b19hc2NpaShzY3JpcHRfdGV4dCksICdiJykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2xvYWRfdGVtcGxhdGUoZGV2X3BhdGgpOgogICAgICAgICIiIgogICAgICAgIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiB0ZW1wbGF0ZSBzY3JpcHRzIGluIHRoZSBwYWNrYWdlLiBUaGlzCiAgICAgICAgZnVuY3Rpb24gbG9hZHMgb25lIG9mIHRoZW0gYW5kIHByZXBhcmVzIGl0IGZvciB1c2UuCiAgICAgICAgIiIiCiAgICAgICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTM0IGZvciBpbmZvCiAgICAgICAgIyBvbiBzY3JpcHQgZmlsZSBuYW1pbmcgYW5kIGRvd25zdHJlYW0gaXNzdWVzIHdpdGggU1ZSNAogICAgICAgIG5hbWUgPSAnc2NyaXB0LnRtcGwnCiAgICAgICAgaWYgZGV2X3BhdGg6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy50bXBsJywgJyAoZGV2KS50bXBsJykKCiAgICAgICAgcmF3X2J5dGVzID0gcmVzb3VyY2Vfc3RyaW5nKCdzZXR1cHRvb2xzJywgbmFtZSkKICAgICAgICByZXR1cm4gcmF3X2J5dGVzLmRlY29kZSgndXRmLTgnKQoKICAgIGRlZiB3cml0ZV9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGNvbnRlbnRzLCBtb2RlPSJ0IiwgYmxvY2tlcnM9KCkpOgogICAgICAgICIiIldyaXRlIGFuIGV4ZWN1dGFibGUgZmlsZSB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkiIiIKICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyggICMgY2xlYW4gdXAgb2xkIC5weS8ucHl3IHcvbyBhIHNjcmlwdAogICAgICAgICAgICBbb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2RpciwgeCkgZm9yIHggaW4gYmxvY2tlcnNdCiAgICAgICAgKQogICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLnNjcmlwdF9kaXIpCiAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2Rpciwgc2NyaXB0X25hbWUpCiAgICAgICAgc2VsZi5hZGRfb3V0cHV0KHRhcmdldCkKCiAgICAgICAgbWFzayA9IGN1cnJlbnRfdW1hc2soKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXQpOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHRhcmdldCkKICAgICAgICAgICAgd2l0aCBvcGVuKHRhcmdldCwgInciICsgbW9kZSkgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoY29udGVudHMpCiAgICAgICAgICAgIGNobW9kKHRhcmdldCwgMG83NzcgLSBtYXNrKQoKICAgIGRlZiBpbnN0YWxsX2VnZ3Moc2VsZiwgc3BlYywgZGlzdF9maWxlbmFtZSwgdG1wZGlyKToKICAgICAgICAjIC5lZ2cgZGlycyBvciBmaWxlcyBhcmUgYWxyZWFkeSBidWlsdCwgc28ganVzdCByZXR1cm4gdGhlbQogICAgICAgIGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9lZ2coZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KICAgICAgICBlbGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9leGUoZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KICAgICAgICBlbGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF93aGVlbChkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpXQoKICAgICAgICAjIEFueXRoaW5nIGVsc2UsIHRyeSB0byBleHRyYWN0IGFuZCBidWlsZAogICAgICAgIHNldHVwX2Jhc2UgPSB0bXBkaXIKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShkaXN0X2ZpbGVuYW1lKSBhbmQgbm90IGRpc3RfZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICB1bnBhY2tfYXJjaGl2ZShkaXN0X2ZpbGVuYW1lLCB0bXBkaXIsIHNlbGYudW5wYWNrX3Byb2dyZXNzKQogICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc2V0dXBfYmFzZSA9IG9zLnBhdGguYWJzcGF0aChkaXN0X2ZpbGVuYW1lKQoKICAgICAgICBpZiAoc2V0dXBfYmFzZS5zdGFydHN3aXRoKHRtcGRpcikgICMgc29tZXRoaW5nIHdlIGRvd25sb2FkZWQKICAgICAgICAgICAgICAgIGFuZCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSBhbmQgc3BlYyBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBzZWxmLm1heWJlX21vdmUoc3BlYywgZGlzdF9maWxlbmFtZSwgc2V0dXBfYmFzZSkKCiAgICAgICAgIyBGaW5kIHRoZSBzZXR1cC5weSBmaWxlCiAgICAgICAgc2V0dXBfc2NyaXB0ID0gb3MucGF0aC5qb2luKHNldHVwX2Jhc2UsICdzZXR1cC5weScpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZXR1cF9zY3JpcHQpOgogICAgICAgICAgICBzZXR1cHMgPSBnbG9iKG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnKicsICdzZXR1cC5weScpKQogICAgICAgICAgICBpZiBub3Qgc2V0dXBzOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgYSBzZXR1cCBzY3JpcHQgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgbGVuKHNldHVwcykgPiAxOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIHNldHVwIHNjcmlwdHMgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2V0dXBfc2NyaXB0ID0gc2V0dXBzWzBdCgogICAgICAgICMgTm93IHJ1biBpdCwgYW5kIHJldHVybiB0aGUgcmVzdWx0CiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgbG9nLmluZm8oc2VsZi5yZXBvcnRfZWRpdGFibGUoc3BlYywgc2V0dXBfc2NyaXB0KSkKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnVpbGRfYW5kX2luc3RhbGwoc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlKQoKICAgIGRlZiBlZ2dfZGlzdHJpYnV0aW9uKHNlbGYsIGVnZ19wYXRoKToKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGVnZ19wYXRoKToKICAgICAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoZWdnX3BhdGgsIG9zLnBhdGguam9pbihlZ2dfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRUdHLUlORk8nKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKHppcGltcG9ydC56aXBpbXBvcnRlcihlZ2dfcGF0aCkpCiAgICAgICAgcmV0dXJuIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKGVnZ19wYXRoLCBtZXRhZGF0YT1tZXRhZGF0YSkKCiAgICBkZWYgaW5zdGFsbF9lZ2coc2VsZiwgZWdnX3BhdGgsIHRtcGRpcik6CiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIsCiAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpLAogICAgICAgICkKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguYWJzcGF0aChkZXN0aW5hdGlvbikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRlc3RpbmF0aW9uKQoKICAgICAgICBkaXN0ID0gc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGVnZ19wYXRoKQogICAgICAgIGlmIG5vdCBzYW1lZmlsZShlZ2dfcGF0aCwgZGVzdGluYXRpb24pOgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRlc3RpbmF0aW9uKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgICAgIGRpcl91dGlsLnJlbW92ZV90cmVlKGRlc3RpbmF0aW9uLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rLAogICAgICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiwpLAogICAgICAgICAgICAgICAgICAgICJSZW1vdmluZyAiICsgZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5ld19kaXN0X2lzX3ppcHBlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGVnZ19wYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBlZ2dfcGF0aC5zdGFydHN3aXRoKHRtcGRpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLmNvcHl0cmVlLCAiQ29weWluZyIKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5zaG91bGRfdW56aXAoZGlzdCk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgoZGVzdGluYXRpb24pCiAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNlbGYudW5wYWNrX2FuZF9jb21waWxlLCAiRXh0cmFjdGluZyIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X2Rpc3RfaXNfemlwcGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGlmIGVnZ19wYXRoLnN0YXJ0c3dpdGgodG1wZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5tb3ZlLCAiTW92aW5nIgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwuY29weTIsICJDb3B5aW5nIgogICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIGYsCiAgICAgICAgICAgICAgICAgICAgKGVnZ19wYXRoLCBkZXN0aW5hdGlvbiksCiAgICAgICAgICAgICAgICAgICAgKG0gKyAiICVzIHRvICVzIikgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZGVzdGluYXRpb24pCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHVwZGF0ZV9kaXN0X2NhY2hlcygKICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICAgICBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzPW5ld19kaXN0X2lzX3ppcHBlZCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHVwZGF0ZV9kaXN0X2NhY2hlcyhkZXN0aW5hdGlvbiwgZml4X3ppcGltcG9ydGVyX2NhY2hlcz1GYWxzZSkKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIHNlbGYuYWRkX291dHB1dChkZXN0aW5hdGlvbikKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRlc3RpbmF0aW9uKQoKICAgIGRlZiBpbnN0YWxsX2V4ZShzZWxmLCBkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpOgogICAgICAgICMgU2VlIGlmIGl0J3MgdmFsaWQsIGdldCBkYXRhCiAgICAgICAgY2ZnID0gZXh0cmFjdF93aW5pbnN0X2NmZyhkaXN0X2ZpbGVuYW1lKQogICAgICAgIGlmIGNmZyBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSB2YWxpZCBkaXN0dXRpbHMgV2luZG93cyAuZXhlIiAlIGRpc3RfZmlsZW5hbWUKICAgICAgICAgICAgKQogICAgICAgICMgQ3JlYXRlIGEgZHVtbXkgZGlzdHJpYnV0aW9uIG9iamVjdCB1bnRpbCB3ZSBidWlsZCB0aGUgcmVhbCBkaXN0cm8KICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBOb25lLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9Y2ZnLmdldCgnbWV0YWRhdGEnLCAnbmFtZScpLAogICAgICAgICAgICB2ZXJzaW9uPWNmZy5nZXQoJ21ldGFkYXRhJywgJ3ZlcnNpb24nKSwgcGxhdGZvcm09Z2V0X3BsYXRmb3JtKCksCiAgICAgICAgKQoKICAgICAgICAjIENvbnZlcnQgdGhlIC5leGUgdG8gYW4gdW5wYWNrZWQgZWdnCiAgICAgICAgZWdnX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBkaXN0LmVnZ19uYW1lKCkgKyAnLmVnZycpCiAgICAgICAgZGlzdC5sb2NhdGlvbiA9IGVnZ19wYXRoCiAgICAgICAgZWdnX3RtcCA9IGVnZ19wYXRoICsgJy50bXAnCiAgICAgICAgX2VnZ19pbmZvID0gb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycpCiAgICAgICAgcGtnX2luZiA9IG9zLnBhdGguam9pbihfZWdnX2luZm8sICdQS0ctSU5GTycpCiAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShwa2dfaW5mKSAgIyBtYWtlIHN1cmUgRUdHLUlORk8gZGlyIGV4aXN0cwogICAgICAgIGRpc3QuX3Byb3ZpZGVyID0gUGF0aE1ldGFkYXRhKGVnZ190bXAsIF9lZ2dfaW5mbykgICMgWFhYCiAgICAgICAgc2VsZi5leGVfdG9fZWdnKGRpc3RfZmlsZW5hbWUsIGVnZ190bXApCgogICAgICAgICMgV3JpdGUgRUdHLUlORk8vUEtHLUlORk8KICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGtnX2luZik6CiAgICAgICAgICAgIGYgPSBvcGVuKHBrZ19pbmYsICd3JykKICAgICAgICAgICAgZi53cml0ZSgnTWV0YWRhdGEtVmVyc2lvbjogMS4wXG4nKQogICAgICAgICAgICBmb3IgaywgdiBpbiBjZmcuaXRlbXMoJ21ldGFkYXRhJyk6CiAgICAgICAgICAgICAgICBpZiBrICE9ICd0YXJnZXRfdmVyc2lvbic6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnJXM6ICVzXG4nICUgKGsucmVwbGFjZSgnXycsICctJykudGl0bGUoKSwgdikpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oX2VnZ19pbmZvLCAnc2NyaXB0cycpCiAgICAgICAgIyBkZWxldGUgZW50cnktcG9pbnQgc2NyaXB0cyB0byBhdm9pZCBkdXBpbmcKICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyhbCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCBhcmdzWzBdKQogICAgICAgICAgICBmb3IgYXJncyBpbiBTY3JpcHRXcml0ZXIuZ2V0X2FyZ3MoZGlzdCkKICAgICAgICBdKQogICAgICAgICMgQnVpbGQgLmVnZyBmaWxlIGZyb20gdG1wZGlyCiAgICAgICAgYmRpc3RfZWdnLm1ha2VfemlwZmlsZSgKICAgICAgICAgICAgZWdnX3BhdGgsIGVnZ190bXAsIHZlcmJvc2U9c2VsZi52ZXJib3NlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1biwKICAgICAgICApCiAgICAgICAgIyBpbnN0YWxsIHRoZSAuZWdnCiAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9lZ2coZWdnX3BhdGgsIHRtcGRpcikKCiAgICBkZWYgZXhlX3RvX2VnZyhzZWxmLCBkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKToKICAgICAgICAiIiJFeHRyYWN0IGEgYmRpc3Rfd2luaW5zdCB0byB0aGUgZGlyZWN0b3JpZXMgYW4gZWdnIHdvdWxkIHVzZSIiIgogICAgICAgICMgQ2hlY2sgZm9yIC5wdGggZmlsZSBhbmQgc2V0IHVwIHByZWZpeCB0cmFuc2xhdGlvbnMKICAgICAgICBwcmVmaXhlcyA9IGdldF9leGVfcHJlZml4ZXMoZGlzdF9maWxlbmFtZSkKICAgICAgICB0b19jb21waWxlID0gW10KICAgICAgICBuYXRpdmVfbGlicyA9IFtdCiAgICAgICAgdG9wX2xldmVsID0ge30KCiAgICAgICAgZGVmIHByb2Nlc3Moc3JjLCBkc3QpOgogICAgICAgICAgICBzID0gc3JjLmxvd2VyKCkKICAgICAgICAgICAgZm9yIG9sZCwgbmV3IGluIHByZWZpeGVzOgogICAgICAgICAgICAgICAgaWYgcy5zdGFydHN3aXRoKG9sZCk6CiAgICAgICAgICAgICAgICAgICAgc3JjID0gbmV3ICsgc3JjW2xlbihvbGQpOl0KICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHNyYy5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGVnZ190bXAsICpwYXJ0cykKICAgICAgICAgICAgICAgICAgICBkbCA9IGRzdC5sb3dlcigpCiAgICAgICAgICAgICAgICAgICAgaWYgZGwuZW5kc3dpdGgoJy5weWQnKSBvciBkbC5lbmRzd2l0aCgnLmRsbCcpOgogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c1stMV0gPSBiZGlzdF9lZ2cuc3RyaXBfbW9kdWxlKHBhcnRzWy0xXSkKICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xldmVsW29zLnBhdGguc3BsaXRleHQocGFydHNbMF0pWzBdXSA9IDEKICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2xpYnMuYXBwZW5kKHNyYykKICAgICAgICAgICAgICAgICAgICBlbGlmIGRsLmVuZHN3aXRoKCcucHknKSBhbmQgb2xkICE9ICdTQ1JJUFRTLyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbFtvcy5wYXRoLnNwbGl0ZXh0KHBhcnRzWzBdKVswXV0gPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKGRzdCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHN0CiAgICAgICAgICAgIGlmIG5vdCBzcmMuZW5kc3dpdGgoJy5wdGgnKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJXQVJOSU5HOiBjYW4ndCBwcm9jZXNzICVzIiwgc3JjKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIGV4dHJhY3QsIHRyYWNraW5nIC5weWQvLmRsbC0+bmF0aXZlX2xpYnMgYW5kIC5weSAtPiB0b19jb21waWxlCiAgICAgICAgdW5wYWNrX2FyY2hpdmUoZGlzdF9maWxlbmFtZSwgZWdnX3RtcCwgcHJvY2VzcykKICAgICAgICBzdHVicyA9IFtdCiAgICAgICAgZm9yIHJlcyBpbiBuYXRpdmVfbGliczoKICAgICAgICAgICAgaWYgcmVzLmxvd2VyKCkuZW5kc3dpdGgoJy5weWQnKTogICMgY3JlYXRlIHN0dWJzIGZvciAucHlkJ3MKICAgICAgICAgICAgICAgIHBhcnRzID0gcmVzLnNwbGl0KCcvJykKICAgICAgICAgICAgICAgIHJlc291cmNlID0gcGFydHNbLTFdCiAgICAgICAgICAgICAgICBwYXJ0c1stMV0gPSBiZGlzdF9lZ2cuc3RyaXBfbW9kdWxlKHBhcnRzWy0xXSkgKyAnLnB5JwogICAgICAgICAgICAgICAgcHlmaWxlID0gb3MucGF0aC5qb2luKGVnZ190bXAsICpwYXJ0cykKICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgICAgIHN0dWJzLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc3R1YihyZXNvdXJjZSwgcHlmaWxlKQogICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUpICAjIGNvbXBpbGUgLnB5J3MKICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc2FmZXR5X2ZsYWcoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nKSwKICAgICAgICAgICAgYmRpc3RfZWdnLmFuYWx5emVfZWdnKGVnZ190bXAsIHN0dWJzKSkgICMgd3JpdGUgemlwLXNhZmV0eSBmbGFnCgogICAgICAgIGZvciBuYW1lIGluICd0b3BfbGV2ZWwnLCAnbmF0aXZlX2xpYnMnOgogICAgICAgICAgICBpZiBsb2NhbHMoKVtuYW1lXToKICAgICAgICAgICAgICAgIHR4dCA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nLCBuYW1lICsgJy50eHQnKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHR4dCk6CiAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4odHh0LCAndycpCiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4obG9jYWxzKClbbmFtZV0pICsgJ1xuJykKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKCiAgICBkZWYgaW5zdGFsbF93aGVlbChzZWxmLCB3aGVlbF9wYXRoLCB0bXBkaXIpOgogICAgICAgIHdoZWVsID0gV2hlZWwod2hlZWxfcGF0aCkKICAgICAgICBhc3NlcnQgd2hlZWwuaXNfY29tcGF0aWJsZSgpCiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpciwgd2hlZWwuZWdnX25hbWUoKSkKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguYWJzcGF0aChkZXN0aW5hdGlvbikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRlc3RpbmF0aW9uKQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGVzdGluYXRpb24pIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZGVzdGluYXRpb24pOgogICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShkZXN0aW5hdGlvbiwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgIG9zLnVubGluaywKICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiwpLAogICAgICAgICAgICAgICAgIlJlbW92aW5nICIgKyBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgd2hlZWwuaW5zdGFsbF9hc19lZ2csCiAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24sKSwKICAgICAgICAgICAgICAgICgiSW5zdGFsbGluZyAlcyB0byAlcyIpICUgKAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUod2hlZWxfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRlc3RpbmF0aW9uKQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHVwZGF0ZV9kaXN0X2NhY2hlcyhkZXN0aW5hdGlvbiwgZml4X3ppcGltcG9ydGVyX2NhY2hlcz1GYWxzZSkKICAgICAgICBzZWxmLmFkZF9vdXRwdXQoZGVzdGluYXRpb24pCiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkZXN0aW5hdGlvbikKCiAgICBfX212X3dhcm5pbmcgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgQmVjYXVzZSB0aGlzIGRpc3RyaWJ1dGlvbiB3YXMgaW5zdGFsbGVkIC0tbXVsdGktdmVyc2lvbiwgYmVmb3JlIHlvdSBjYW4KICAgICAgICBpbXBvcnQgbW9kdWxlcyBmcm9tIHRoaXMgcGFja2FnZSBpbiBhbiBhcHBsaWNhdGlvbiwgeW91IHdpbGwgbmVlZCB0bwogICAgICAgICdpbXBvcnQgcGtnX3Jlc291cmNlcycgYW5kIHRoZW4gdXNlIGEgJ3JlcXVpcmUoKScgY2FsbCBzaW1pbGFyIHRvIG9uZSBvZgogICAgICAgIHRoZXNlIGV4YW1wbGVzLCBpbiBvcmRlciB0byBzZWxlY3QgdGhlIGRlc2lyZWQgdmVyc2lvbjoKCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXMiKSAgIyBsYXRlc3QgaW5zdGFsbGVkIHZlcnNpb24KICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz09JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIGV4YWN0IHZlcnNpb24KICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz49JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIHZlcnNpb24gb3IgaGlnaGVyCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIF9faWRfd2FybmluZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBOb3RlIGFsc28gdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBtdXN0IGJlIG9uIHN5cy5wYXRoIGF0IHJ1bnRpbWUgZm9yCiAgICAgICAgdGhpcyB0byB3b3JrLiAgKGUuZy4gYnkgYmVpbmcgdGhlIGFwcGxpY2F0aW9uJ3Mgc2NyaXB0IGRpcmVjdG9yeSwgYnkgYmVpbmcgb24KICAgICAgICBQWVRIT05QQVRILCBvciBieSBiZWluZyBhZGRlZCB0byBzeXMucGF0aCBieSB5b3VyIGNvZGUuKQogICAgICAgICIiIikKCiAgICBkZWYgaW5zdGFsbGF0aW9uX3JlcG9ydChzZWxmLCByZXEsIGRpc3QsIHdoYXQ9Ikluc3RhbGxlZCIpOgogICAgICAgICIiIkhlbHBmdWwgaW5zdGFsbGF0aW9uIG1lc3NhZ2UgZm9yIGRpc3BsYXkgdG8gcGFja2FnZSB1c2VycyIiIgogICAgICAgIG1zZyA9ICJcbiUod2hhdClzICUoZWdnbG9jKXMlKGV4dHJhcylzIgogICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBhbmQgbm90IHNlbGYubm9fcmVwb3J0OgogICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19tdl93YXJuaW5nCiAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9kaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCwgc3lzLnBhdGgpOgogICAgICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9faWRfd2FybmluZwoKICAgICAgICBlZ2dsb2MgPSBkaXN0LmxvY2F0aW9uCiAgICAgICAgbmFtZSA9IGRpc3QucHJvamVjdF9uYW1lCiAgICAgICAgdmVyc2lvbiA9IGRpc3QudmVyc2lvbgogICAgICAgIGV4dHJhcyA9ICcnICAjIFRPRE86IHNlbGYucmVwb3J0X2V4dHJhcyhyZXEsIGRpc3QpCiAgICAgICAgcmV0dXJuIG1zZyAlIGxvY2FscygpCgogICAgX19lZGl0YWJsZV9tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgRXh0cmFjdGVkIGVkaXRhYmxlIHZlcnNpb24gb2YgJShzcGVjKXMgdG8gJShkaXJuYW1lKXMKCiAgICAgICAgSWYgaXQgdXNlcyBzZXR1cHRvb2xzIGluIGl0cyBzZXR1cCBzY3JpcHQsIHlvdSBjYW4gYWN0aXZhdGUgaXQgaW4KICAgICAgICAiZGV2ZWxvcG1lbnQiIG1vZGUgYnkgZ29pbmcgdG8gdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmc6OgoKICAgICAgICAgICAgJShweXRob24pcyBzZXR1cC5weSBkZXZlbG9wCgogICAgICAgIFNlZSB0aGUgc2V0dXB0b29scyBkb2N1bWVudGF0aW9uIGZvciB0aGUgImRldmVsb3AiIGNvbW1hbmQgZm9yIG1vcmUgaW5mby4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIHJlcG9ydF9lZGl0YWJsZShzZWxmLCBzcGVjLCBzZXR1cF9zY3JpcHQpOgogICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KQogICAgICAgIHB5dGhvbiA9IHN5cy5leGVjdXRhYmxlCiAgICAgICAgcmV0dXJuICdcbicgKyBzZWxmLl9fZWRpdGFibGVfbXNnICUgbG9jYWxzKCkKCiAgICBkZWYgcnVuX3NldHVwKHNlbGYsIHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSwgYXJncyk6CiAgICAgICAgc3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCgnZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfZWdnJywgYmRpc3RfZWdnKQogICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmVnZ19pbmZvJywgZWdnX2luZm8pCgogICAgICAgIGFyZ3MgPSBsaXN0KGFyZ3MpCiAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMjoKICAgICAgICAgICAgdiA9ICd2JyAqIChzZWxmLnZlcmJvc2UgLSAxKQogICAgICAgICAgICBhcmdzLmluc2VydCgwLCAnLScgKyB2KQogICAgICAgIGVsaWYgc2VsZi52ZXJib3NlIDwgMjoKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgJy1xJykKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsICctbicpCiAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICJSdW5uaW5nICVzICVzIiwgc2V0dXBfc2NyaXB0W2xlbihzZXR1cF9iYXNlKSArIDE6XSwgJyAnLmpvaW4oYXJncykKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKQogICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIHY6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJTZXR1cCBzY3JpcHQgZXhpdGVkIHdpdGggJXMiICUgKHYuYXJnc1swXSwpKQoKICAgIGRlZiBidWlsZF9hbmRfaW5zdGFsbChzZWxmLCBzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UpOgogICAgICAgIGFyZ3MgPSBbJ2JkaXN0X2VnZycsICctLWRpc3QtZGlyJ10KCiAgICAgICAgZGlzdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKAogICAgICAgICAgICBwcmVmaXg9J2VnZy1kaXN0LXRtcC0nLCBkaXI9b3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9zZXRfZmV0Y2hlcl9vcHRpb25zKG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpKQogICAgICAgICAgICBhcmdzLmFwcGVuZChkaXN0X2RpcikKCiAgICAgICAgICAgIHNlbGYucnVuX3NldHVwKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSwgYXJncykKICAgICAgICAgICAgYWxsX2VnZ3MgPSBFbnZpcm9ubWVudChbZGlzdF9kaXJdKQogICAgICAgICAgICBlZ2dzID0gW10KICAgICAgICAgICAgZm9yIGtleSBpbiBhbGxfZWdnczoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIGFsbF9lZ2dzW2tleV06CiAgICAgICAgICAgICAgICAgICAgZWdncy5hcHBlbmQoc2VsZi5pbnN0YWxsX2VnZyhkaXN0LmxvY2F0aW9uLCBzZXR1cF9iYXNlKSkKICAgICAgICAgICAgaWYgbm90IGVnZ3MgYW5kIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBsb2cud2FybigiTm8gZWdncyBmb3VuZCBpbiAlcyAoc2V0dXAgc2NyaXB0IHByb2JsZW0/KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2RpcikKICAgICAgICAgICAgcmV0dXJuIGVnZ3MKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBybXRyZWUoZGlzdF9kaXIpCiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkgICMgcmVzdG9yZSBvdXIgbG9nIHZlcmJvc2l0eQoKICAgIGRlZiBfc2V0X2ZldGNoZXJfb3B0aW9ucyhzZWxmLCBiYXNlKToKICAgICAgICAiIiIKICAgICAgICBXaGVuIGVhc3lfaW5zdGFsbCBpcyBhYm91dCB0byBydW4gYmRpc3RfZWdnIG9uIGEgc291cmNlIGRpc3QsIHRoYXQKICAgICAgICBzb3VyY2UgZGlzdCBtaWdodCBoYXZlICdzZXR1cF9yZXF1aXJlcycgZGlyZWN0aXZlcywgcmVxdWlyaW5nCiAgICAgICAgYWRkaXRpb25hbCBmZXRjaGluZy4gRW5zdXJlIHRoZSBmZXRjaGVyIG9wdGlvbnMgZ2l2ZW4gdG8gZWFzeV9pbnN0YWxsCiAgICAgICAgYXJlIGF2YWlsYWJsZSB0byB0aGF0IGNvbW1hbmQgYXMgd2VsbC4KICAgICAgICAiIiIKICAgICAgICAjIGZpbmQgdGhlIGZldGNoIG9wdGlvbnMgZnJvbSBlYXN5X2luc3RhbGwgYW5kIHdyaXRlIHRoZW0gb3V0CiAgICAgICAgIyB0byB0aGUgc2V0dXAuY2ZnIGZpbGUuCiAgICAgICAgZWlfb3B0cyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykuY29weSgpCiAgICAgICAgZmV0Y2hfZGlyZWN0aXZlcyA9ICgKICAgICAgICAgICAgJ2ZpbmRfbGlua3MnLCAnc2l0ZV9kaXJzJywgJ2luZGV4X3VybCcsICdvcHRpbWl6ZScsCiAgICAgICAgICAgICdzaXRlX2RpcnMnLCAnYWxsb3dfaG9zdHMnLAogICAgICAgICkKICAgICAgICBmZXRjaF9vcHRpb25zID0ge30KICAgICAgICBmb3Iga2V5LCB2YWwgaW4gZWlfb3B0cy5pdGVtcygpOgogICAgICAgICAgICBpZiBrZXkgbm90IGluIGZldGNoX2RpcmVjdGl2ZXM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmZXRjaF9vcHRpb25zW2tleS5yZXBsYWNlKCdfJywgJy0nKV0gPSB2YWxbMV0KICAgICAgICAjIGNyZWF0ZSBhIHNldHRpbmdzIGRpY3Rpb25hcnkgc3VpdGFibGUgZm9yIGBlZGl0X2NvbmZpZ2AKICAgICAgICBzZXR0aW5ncyA9IGRpY3QoZWFzeV9pbnN0YWxsPWZldGNoX29wdGlvbnMpCiAgICAgICAgY2ZnX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsICdzZXR1cC5jZmcnKQogICAgICAgIHNldG9wdC5lZGl0X2NvbmZpZyhjZmdfZmlsZW5hbWUsIHNldHRpbmdzKQoKICAgIGRlZiB1cGRhdGVfcHRoKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIHNlbGYucHRoX2ZpbGUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGZvciBkIGluIHNlbGYucHRoX2ZpbGVbZGlzdC5rZXldOiAgIyBkcm9wIG9sZCBlbnRyaWVzCiAgICAgICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBvciBkLmxvY2F0aW9uICE9IGRpc3QubG9jYXRpb246CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMgZnJvbSBlYXN5LWluc3RhbGwucHRoIGZpbGUiLCBkKQogICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZS5yZW1vdmUoZCkKICAgICAgICAgICAgICAgIGlmIGQubG9jYXRpb24gaW4gc2VsZi5zaGFkb3dfcGF0aDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLnJlbW92ZShkLmxvY2F0aW9uKQoKICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIGluIHNlbGYucHRoX2ZpbGUucGF0aHM6CiAgICAgICAgICAgICAgICBsb2cuaW5mbygKICAgICAgICAgICAgICAgICAgICAiJXMgaXMgYWxyZWFkeSB0aGUgYWN0aXZlIHZlcnNpb24gaW4gZWFzeS1pbnN0YWxsLnB0aCIsCiAgICAgICAgICAgICAgICAgICAgZGlzdCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBZGRpbmcgJXMgdG8gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZGlzdCkKICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuYWRkKGRpc3QpICAjIGFkZCBuZXcgZW50cnkKICAgICAgICAgICAgICAgIGlmIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYuc2hhZG93X3BhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5hcHBlbmQoZGlzdC5sb2NhdGlvbikKCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKCiAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuc2F2ZSgpCgogICAgICAgICAgICBpZiBkaXN0LmtleSA9PSAnc2V0dXB0b29scyc6CiAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHNldHVwdG9vbHMgaXRzZWxmIG5ldmVyIGJlY29tZXMgdW5hdmFpbGFibGUhCiAgICAgICAgICAgICAgICAjIFhYWCBzaG91bGQgdGhpcyBjaGVjayBmb3IgbGF0ZXN0IHZlcnNpb24/CiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAnc2V0dXB0b29scy5wdGgnKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd3QnKQogICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLnB0aF9maWxlLm1ha2VfcmVsYXRpdmUoZGlzdC5sb2NhdGlvbikgKyAnXG4nKQogICAgICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgZGVmIHVucGFja19wcm9ncmVzcyhzZWxmLCBzcmMsIGRzdCk6CiAgICAgICAgIyBQcm9ncmVzcyBmaWx0ZXIgZm9yIHVucGFja2luZwogICAgICAgIGxvZy5kZWJ1ZygiVW5wYWNraW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCiAgICAgICAgcmV0dXJuIGRzdCAgIyBvbmx5IHVucGFjay1hbmQtY29tcGlsZSBza2lwcyBmaWxlcyBmb3IgZHJ5IHJ1bgoKICAgIGRlZiB1bnBhY2tfYW5kX2NvbXBpbGUoc2VsZiwgZWdnX3BhdGgsIGRlc3RpbmF0aW9uKToKICAgICAgICB0b19jb21waWxlID0gW10KICAgICAgICB0b19jaG1vZCA9IFtdCgogICAgICAgIGRlZiBwZihzcmMsIGRzdCk6CiAgICAgICAgICAgIGlmIGRzdC5lbmRzd2l0aCgnLnB5JykgYW5kIG5vdCBzcmMuc3RhcnRzd2l0aCgnRUdHLUlORk8vJyk6CiAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChkc3QpCiAgICAgICAgICAgIGVsaWYgZHN0LmVuZHN3aXRoKCcuZGxsJykgb3IgZHN0LmVuZHN3aXRoKCcuc28nKToKICAgICAgICAgICAgICAgIHRvX2NobW9kLmFwcGVuZChkc3QpCiAgICAgICAgICAgIHNlbGYudW5wYWNrX3Byb2dyZXNzKHNyYywgZHN0KQogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYuZHJ5X3J1biBhbmQgZHN0IG9yIE5vbmUKCiAgICAgICAgdW5wYWNrX2FyY2hpdmUoZWdnX3BhdGgsIGRlc3RpbmF0aW9uLCBwZikKICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGZvciBmIGluIHRvX2NobW9kOgogICAgICAgICAgICAgICAgbW9kZSA9ICgob3Muc3RhdChmKVtzdGF0LlNUX01PREVdKSB8IDBvNTU1KSAmIDBvNzc1NQogICAgICAgICAgICAgICAgY2htb2QoZiwgbW9kZSkKCiAgICBkZWYgYnl0ZV9jb21waWxlKHNlbGYsIHRvX2NvbXBpbGUpOgogICAgICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgogICAgICAgICAgICBzZWxmLndhcm4oJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkLCBza2lwcGluZy4nKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyB0cnkgdG8gbWFrZSB0aGUgYnl0ZSBjb21waWxlIG1lc3NhZ2VzIHF1aWV0ZXIKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlIC0gMSkKCiAgICAgICAgICAgIGJ5dGVfY29tcGlsZSh0b19jb21waWxlLCBvcHRpbWl6ZT0wLCBmb3JjZT0xLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgaWYgc2VsZi5vcHRpbWl6ZToKICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZSgKICAgICAgICAgICAgICAgICAgICB0b19jb21waWxlLCBvcHRpbWl6ZT1zZWxmLm9wdGltaXplLCBmb3JjZT0xLAogICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLAogICAgICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkgICMgcmVzdG9yZSBvcmlnaW5hbCB2ZXJib3NpdHkKCiAgICBfX25vX2RlZmF1bHRfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIGJhZCBpbnN0YWxsIGRpcmVjdG9yeSBvciBQWVRIT05QQVRICgogICAgICAgIFlvdSBhcmUgYXR0ZW1wdGluZyB0byBpbnN0YWxsIGEgcGFja2FnZSB0byBhIGRpcmVjdG9yeSB0aGF0IGlzIG5vdAogICAgICAgIG9uIFBZVEhPTlBBVEggYW5kIHdoaWNoIFB5dGhvbiBkb2VzIG5vdCByZWFkICIucHRoIiBmaWxlcyBmcm9tLiAgVGhlCiAgICAgICAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkICh2aWEgLS1pbnN0YWxsLWRpciwgLS1wcmVmaXgsIG9yCiAgICAgICAgdGhlIGRpc3R1dGlscyBkZWZhdWx0IHNldHRpbmcpIHdhczoKCiAgICAgICAgICAgICVzCgogICAgICAgIGFuZCB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgY3VycmVudGx5IGNvbnRhaW5zOgoKICAgICAgICAgICAgJXIKCiAgICAgICAgSGVyZSBhcmUgc29tZSBvZiB5b3VyIG9wdGlvbnMgZm9yIGNvcnJlY3RpbmcgdGhlIHByb2JsZW06CgogICAgICAgICogWW91IGNhbiBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgaS5lLiwgb25lIHRoYXQgaXMKICAgICAgICAgIG9uIFBZVEhPTlBBVEggb3Igc3VwcG9ydHMgLnB0aCBmaWxlcwoKICAgICAgICAqIFlvdSBjYW4gYWRkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50CiAgICAgICAgICB2YXJpYWJsZS4gIChJdCBtdXN0IHRoZW4gYWxzbyBiZSBvbiBQWVRIT05QQVRIIHdoZW5ldmVyIHlvdSBydW4KICAgICAgICAgIFB5dGhvbiBhbmQgd2FudCB0byB1c2UgdGhlIHBhY2thZ2UocykgeW91IGFyZSBpbnN0YWxsaW5nLikKCiAgICAgICAgKiBZb3UgY2FuIHNldCB1cCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byBzdXBwb3J0ICIucHRoIiBmaWxlcyBieQogICAgICAgICAgdXNpbmcgb25lIG9mIHRoZSBhcHByb2FjaGVzIGRlc2NyaWJlZCBoZXJlOgoKICAgICAgICAgIGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZWFzeV9pbnN0YWxsLmh0bWwjY3VzdG9tLWluc3RhbGxhdGlvbi1sb2NhdGlvbnMKCgogICAgICAgIFBsZWFzZSBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGZvciB5b3VyIHN5c3RlbSBhbmQgdHJ5IGFnYWluLiIiIikubHN0cmlwKCkKCiAgICBkZWYgbm9fZGVmYXVsdF92ZXJzaW9uX21zZyhzZWxmKToKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuX19ub19kZWZhdWx0X21zZwogICAgICAgIHJldHVybiB0ZW1wbGF0ZSAlIChzZWxmLmluc3RhbGxfZGlyLCBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKSkKCiAgICBkZWYgaW5zdGFsbF9zaXRlX3B5KHNlbGYpOgogICAgICAgICIiIk1ha2Ugc3VyZSB0aGVyZSdzIGEgc2l0ZS5weSBpbiB0aGUgdGFyZ2V0IGRpciwgaWYgbmVlZGVkIiIiCgogICAgICAgIGlmIHNlbGYuc2l0ZXB5X2luc3RhbGxlZDoKICAgICAgICAgICAgcmV0dXJuICAjIGFscmVhZHkgZGlkIGl0LCBvciBkb24ndCBuZWVkIHRvCgogICAgICAgIHNpdGVweSA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAic2l0ZS5weSIpCiAgICAgICAgc291cmNlID0gcmVzb3VyY2Vfc3RyaW5nKCJzZXR1cHRvb2xzIiwgInNpdGUtcGF0Y2gucHkiKQogICAgICAgIHNvdXJjZSA9IHNvdXJjZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBjdXJyZW50ID0gIiIKCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2l0ZXB5KToKICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBleGlzdGluZyBzaXRlLnB5IGluICVzIiwgc2VsZi5pbnN0YWxsX2RpcikKICAgICAgICAgICAgd2l0aCBpby5vcGVuKHNpdGVweSkgYXMgc3RybToKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzdHJtLnJlYWQoKQoKICAgICAgICAgICAgaWYgbm90IGN1cnJlbnQuc3RhcnRzd2l0aCgnZGVmIF9fYm9vdCgpOicpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHNldHVwdG9vbHMtZ2VuZXJhdGVkIHNpdGUucHk7IHBsZWFzZSIKICAgICAgICAgICAgICAgICAgICAiIHJlbW92ZSBpdC4iICUgc2l0ZXB5CiAgICAgICAgICAgICAgICApCgogICAgICAgIGlmIGN1cnJlbnQgIT0gc291cmNlOgogICAgICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgJXMiLCBzaXRlcHkpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHNpdGVweSkKICAgICAgICAgICAgICAgIHdpdGggaW8ub3BlbihzaXRlcHksICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgc3RybToKICAgICAgICAgICAgICAgICAgICBzdHJtLndyaXRlKHNvdXJjZSkKICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUoW3NpdGVweV0pCgogICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUKCiAgICBkZWYgY3JlYXRlX2hvbWVfcGF0aChzZWxmKToKICAgICAgICAiIiJDcmVhdGUgZGlyZWN0b3JpZXMgdW5kZXIgfi4iIiIKICAgICAgICBpZiBub3Qgc2VsZi51c2VyOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBob21lID0gY29udmVydF9wYXRoKG9zLnBhdGguZXhwYW5kdXNlcigifiIpKQogICAgICAgIGZvciBuYW1lLCBwYXRoIGluIHNpeC5pdGVyaXRlbXMoc2VsZi5jb25maWdfdmFycyk6CiAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChob21lKSBhbmQgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJvcy5tYWtlZGlycygnJXMnLCAwbzcwMCkiICUgcGF0aCkKICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgsIDBvNzAwKQoKICAgIElOU1RBTExfU0NIRU1FUyA9IGRpY3QoCiAgICAgICAgcG9zaXg9ZGljdCgKICAgICAgICAgICAgaW5zdGFsbF9kaXI9JyRiYXNlL2xpYi9weXRob24kcHlfdmVyc2lvbl9zaG9ydC9zaXRlLXBhY2thZ2VzJywKICAgICAgICAgICAgc2NyaXB0X2Rpcj0nJGJhc2UvYmluJywKICAgICAgICApLAogICAgKQoKICAgIERFRkFVTFRfU0NIRU1FID0gZGljdCgKICAgICAgICBpbnN0YWxsX2Rpcj0nJGJhc2UvTGliL3NpdGUtcGFja2FnZXMnLAogICAgICAgIHNjcmlwdF9kaXI9JyRiYXNlL1NjcmlwdHMnLAogICAgKQoKICAgIGRlZiBfZXhwYW5kKHNlbGYsICphdHRycyk6CiAgICAgICAgY29uZmlnX3ZhcnMgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLmNvbmZpZ192YXJzCgogICAgICAgIGlmIHNlbGYucHJlZml4OgogICAgICAgICAgICAjIFNldCBkZWZhdWx0IGluc3RhbGxfZGlyL3NjcmlwdHMgZnJvbSAtLXByZWZpeAogICAgICAgICAgICBjb25maWdfdmFycyA9IGNvbmZpZ192YXJzLmNvcHkoKQogICAgICAgICAgICBjb25maWdfdmFyc1snYmFzZSddID0gc2VsZi5wcmVmaXgKICAgICAgICAgICAgc2NoZW1lID0gc2VsZi5JTlNUQUxMX1NDSEVNRVMuZ2V0KG9zLm5hbWUsIHNlbGYuREVGQVVMVF9TQ0hFTUUpCiAgICAgICAgICAgIGZvciBhdHRyLCB2YWwgaW4gc2NoZW1lLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHN1YnN0X3ZhcnMKCiAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CiAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgdmFsID0gc3Vic3RfdmFycyh2YWwsIGNvbmZpZ192YXJzKQogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICAgICAgICAgICAgIHZhbCA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWwpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKCgpkZWYgX3B5dGhvbnBhdGgoKToKICAgIGl0ZW1zID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCAnJykuc3BsaXQob3MucGF0aHNlcCkKICAgIHJldHVybiBmaWx0ZXIoTm9uZSwgaXRlbXMpCgoKZGVmIGdldF9zaXRlX2RpcnMoKToKICAgICIiIgogICAgUmV0dXJuIGEgbGlzdCBvZiAnc2l0ZScgZGlycwogICAgIiIiCgogICAgc2l0ZWRpcnMgPSBbXQoKICAgICMgc3RhcnQgd2l0aCBQWVRIT05QQVRICiAgICBzaXRlZGlycy5leHRlbmQoX3B5dGhvbnBhdGgoKSkKCiAgICBwcmVmaXhlcyA9IFtzeXMucHJlZml4XQogICAgaWYgc3lzLmV4ZWNfcHJlZml4ICE9IHN5cy5wcmVmaXg6CiAgICAgICAgcHJlZml4ZXMuYXBwZW5kKHN5cy5leGVjX3ByZWZpeCkKICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CiAgICAgICAgaWYgcHJlZml4OgogICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdvczJlbXgnLCAncmlzY29zJyk6CiAgICAgICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHByZWZpeCwgIkxpYiIsICJzaXRlLXBhY2thZ2VzIikpCiAgICAgICAgICAgIGVsaWYgb3Muc2VwID09ICcvJzoKICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZChbCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICJsaWIiLAogICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpdGUtcGFja2FnZXMiLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXB5dGhvbiIpLAogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZChbCiAgICAgICAgICAgICAgICAgICAgcHJlZml4LAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1wYWNrYWdlcyIpLAogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICAgICAgICAgIyBmb3IgZnJhbWV3b3JrIGJ1aWxkcyAqb25seSogd2UgYWRkIHRoZSBzdGFuZGFyZCBBcHBsZQogICAgICAgICAgICAgICAgIyBsb2NhdGlvbnMuIEN1cnJlbnRseSBvbmx5IHBlci11c2VyLCBidXQgL0xpYnJhcnkgYW5kCiAgICAgICAgICAgICAgICAjIC9OZXR3b3JrL0xpYnJhcnkgY291bGQgYmUgYWRkZWQgdG9vCiAgICAgICAgICAgICAgICBpZiAnUHl0aG9uLmZyYW1ld29yaycgaW4gcHJlZml4OgogICAgICAgICAgICAgICAgICAgIGhvbWUgPSBvcy5lbnZpcm9uLmdldCgnSE9NRScpCiAgICAgICAgICAgICAgICAgICAgaWYgaG9tZToKICAgICAgICAgICAgICAgICAgICAgICAgaG9tZV9zcCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGlicmFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlLXBhY2thZ2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQoaG9tZV9zcCkKICAgIGxpYl9wYXRocyA9IGdldF9wYXRoKCdwdXJlbGliJyksIGdldF9wYXRoKCdwbGF0bGliJykKICAgIGZvciBzaXRlX2xpYiBpbiBsaWJfcGF0aHM6CiAgICAgICAgaWYgc2l0ZV9saWIgbm90IGluIHNpdGVkaXJzOgogICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQoc2l0ZV9saWIpCgogICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgIHNpdGVkaXJzLmFwcGVuZChzaXRlLlVTRVJfU0lURSkKCiAgICB0cnk6CiAgICAgICAgc2l0ZWRpcnMuZXh0ZW5kKHNpdGUuZ2V0c2l0ZXBhY2thZ2VzKCkpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHNpdGVkaXJzID0gbGlzdChtYXAobm9ybWFsaXplX3BhdGgsIHNpdGVkaXJzKSkKCiAgICByZXR1cm4gc2l0ZWRpcnMKCgpkZWYgZXhwYW5kX3BhdGhzKGlucHV0cyk6CiAgICAiIiJZaWVsZCBzeXMucGF0aCBkaXJlY3RvcmllcyB0aGF0IG1pZ2h0IGNvbnRhaW4gIm9sZC1zdHlsZSIgcGFja2FnZXMiIiIKCiAgICBzZWVuID0ge30KCiAgICBmb3IgZGlybmFtZSBpbiBpbnB1dHM6CiAgICAgICAgZGlybmFtZSA9IG5vcm1hbGl6ZV9wYXRoKGRpcm5hbWUpCiAgICAgICAgaWYgZGlybmFtZSBpbiBzZWVuOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBzZWVuW2Rpcm5hbWVdID0gMQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKICAgICAgICB5aWVsZCBkaXJuYW1lLCBmaWxlcwoKICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbm90IG5hbWUuZW5kc3dpdGgoJy5wdGgnKToKICAgICAgICAgICAgICAgICMgV2Ugb25seSBjYXJlIGFib3V0IHRoZSAucHRoIGZpbGVzCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBuYW1lIGluICgnZWFzeS1pbnN0YWxsLnB0aCcsICdzZXR1cHRvb2xzLnB0aCcpOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgLnB0aCBmaWxlcyB0aGF0IHdlIGNvbnRyb2wKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIFJlYWQgdGhlIC5wdGggZmlsZQogICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkpCiAgICAgICAgICAgIGxpbmVzID0gbGlzdCh5aWVsZF9saW5lcyhmKSkKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgICAgICAgICAjIFlpZWxkIGV4aXN0aW5nIG5vbi1kdXBlLCBub24taW1wb3J0IGRpcmVjdG9yeSBsaW5lcyBmcm9tIGl0CiAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICAgICAgaWYgbm90IGxpbmUuc3RhcnRzd2l0aCgiaW1wb3J0Iik6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5vcm1hbGl6ZV9wYXRoKGxpbmUucnN0cmlwKCkpCiAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICAgICAgc2VlbltsaW5lXSA9IDEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIobGluZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBsaW5lLCBvcy5saXN0ZGlyKGxpbmUpCgoKZGVmIGV4dHJhY3Rfd2luaW5zdF9jZmcoZGlzdF9maWxlbmFtZSk6CiAgICAiIiJFeHRyYWN0IGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgYmRpc3Rfd2luaW5zdCAuZXhlCgogICAgUmV0dXJucyBhIGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIsIG9yIE5vbmUKICAgICIiIgogICAgZiA9IG9wZW4oZGlzdF9maWxlbmFtZSwgJ3JiJykKICAgIHRyeToKICAgICAgICBlbmRyZWMgPSB6aXBmaWxlLl9FbmRSZWNEYXRhKGYpCiAgICAgICAgaWYgZW5kcmVjIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHByZXBlbmRlZCA9IChlbmRyZWNbOV0gLSBlbmRyZWNbNV0pIC0gZW5kcmVjWzZdCiAgICAgICAgaWYgcHJlcGVuZGVkIDwgMTI6ICAjIG5vIHdpbmluc3QgZGF0YSBoZXJlCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZi5zZWVrKHByZXBlbmRlZCAtIDEyKQoKICAgICAgICB0YWcsIGNmZ2xlbiwgYm1sZW4gPSBzdHJ1Y3QudW5wYWNrKCI8aWlpIiwgZi5yZWFkKDEyKSkKICAgICAgICBpZiB0YWcgbm90IGluICgweDEyMzQ1NjdBLCAweDEyMzQ1NjdCKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUgICMgbm90IGEgdmFsaWQgdGFnCgogICAgICAgIGYuc2VlayhwcmVwZW5kZWQgLSAoMTIgKyBjZmdsZW4pKQogICAgICAgIGluaXQgPSB7J3ZlcnNpb24nOiAnJywgJ3RhcmdldF92ZXJzaW9uJzogJyd9CiAgICAgICAgY2ZnID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcihpbml0KQogICAgICAgIHRyeToKICAgICAgICAgICAgcGFydCA9IGYucmVhZChjZmdsZW4pCiAgICAgICAgICAgICMgUmVhZCB1cCB0byB0aGUgZmlyc3QgbnVsbCBieXRlLgogICAgICAgICAgICBjb25maWcgPSBwYXJ0LnNwbGl0KGInXDAnLCAxKVswXQogICAgICAgICAgICAjIE5vdyB0aGUgY29uZmlnIGlzIGluIGJ5dGVzLCBidXQgZm9yIFJhd0NvbmZpZ1BhcnNlciwgaXQgc2hvdWxkCiAgICAgICAgICAgICMgIGJlIHRleHQsIHNvIGRlY29kZSBpdC4KICAgICAgICAgICAgY29uZmlnID0gY29uZmlnLmRlY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgICAgIGNmZy5yZWFkZnAoc2l4LlN0cmluZ0lPKGNvbmZpZykpCiAgICAgICAgZXhjZXB0IGNvbmZpZ3BhcnNlci5FcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBub3QgY2ZnLmhhc19zZWN0aW9uKCdtZXRhZGF0YScpIG9yIG5vdCBjZmcuaGFzX3NlY3Rpb24oJ1NldHVwJyk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGNmZwoKICAgIGZpbmFsbHk6CiAgICAgICAgZi5jbG9zZSgpCgoKZGVmIGdldF9leGVfcHJlZml4ZXMoZXhlX2ZpbGVuYW1lKToKICAgICIiIkdldCBleGUtPmVnZyBwYXRoIHRyYW5zbGF0aW9ucyBmb3IgYSBnaXZlbiAuZXhlIGZpbGUiIiIKCiAgICBwcmVmaXhlcyA9IFsKICAgICAgICAoJ1BVUkVMSUIvJywgJycpLAogICAgICAgICgnUExBVExJQi9weXdpbjMyX3N5c3RlbTMyJywgJycpLAogICAgICAgICgnUExBVExJQi8nLCAnJyksCiAgICAgICAgKCdTQ1JJUFRTLycsICdFR0ctSU5GTy9zY3JpcHRzLycpLAogICAgICAgICgnREFUQS9saWIvc2l0ZS1wYWNrYWdlcycsICcnKSwKICAgIF0KICAgIHogPSB6aXBmaWxlLlppcEZpbGUoZXhlX2ZpbGVuYW1lKQogICAgdHJ5OgogICAgICAgIGZvciBpbmZvIGluIHouaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgcGFydHMgPSBuYW1lLnNwbGl0KCcvJykKICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAzIGFuZCBwYXJ0c1syXSA9PSAnUEtHLUlORk8nOgogICAgICAgICAgICAgICAgaWYgcGFydHNbMV0uZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgogICAgICAgICAgICAgICAgICAgIHByZWZpeGVzLmluc2VydCgwLCAoJy8nLmpvaW4ocGFydHNbOjJdKSwgJ0VHRy1JTkZPLycpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgIT0gMiBvciBub3QgbmFtZS5lbmRzd2l0aCgnLnB0aCcpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLW5zcGtnLnB0aCcpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcGFydHNbMF0udXBwZXIoKSBpbiAoJ1BVUkVMSUInLCAnUExBVExJQicpOgogICAgICAgICAgICAgICAgY29udGVudHMgPSB6LnJlYWQobmFtZSkKICAgICAgICAgICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5kZWNvZGUoKQogICAgICAgICAgICAgICAgZm9yIHB0aCBpbiB5aWVsZF9saW5lcyhjb250ZW50cyk6CiAgICAgICAgICAgICAgICAgICAgcHRoID0gcHRoLnN0cmlwKCkucmVwbGFjZSgnXFwnLCAnLycpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHB0aC5zdGFydHN3aXRoKCdpbXBvcnQnKToKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuYXBwZW5kKCgoJyVzLyVzLycgJSAocGFydHNbMF0sIHB0aCkpLCAnJykpCiAgICBmaW5hbGx5OgogICAgICAgIHouY2xvc2UoKQogICAgcHJlZml4ZXMgPSBbKHgubG93ZXIoKSwgeSkgZm9yIHgsIHkgaW4gcHJlZml4ZXNdCiAgICBwcmVmaXhlcy5zb3J0KCkKICAgIHByZWZpeGVzLnJldmVyc2UoKQogICAgcmV0dXJuIHByZWZpeGVzCgoKY2xhc3MgUHRoRGlzdHJpYnV0aW9ucyhFbnZpcm9ubWVudCk6CiAgICAiIiJBIC5wdGggZmlsZSB3aXRoIERpc3RyaWJ1dGlvbiBwYXRocyBpbiBpdCIiIgoKICAgIGRpcnR5ID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIHNpdGVkaXJzPSgpKToKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBzZWxmLnNpdGVkaXJzID0gbGlzdChtYXAobm9ybWFsaXplX3BhdGgsIHNpdGVkaXJzKSkKICAgICAgICBzZWxmLmJhc2VkaXIgPSBub3JtYWxpemVfcGF0aChvcy5wYXRoLmRpcm5hbWUoc2VsZi5maWxlbmFtZSkpCiAgICAgICAgc2VsZi5fbG9hZCgpCiAgICAgICAgRW52aXJvbm1lbnQuX19pbml0X18oc2VsZiwgW10sIE5vbmUsIE5vbmUpCiAgICAgICAgZm9yIHBhdGggaW4geWllbGRfbGluZXMoc2VsZi5wYXRocyk6CiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuYWRkLCBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aCwgVHJ1ZSkpKQoKICAgIGRlZiBfbG9hZChzZWxmKToKICAgICAgICBzZWxmLnBhdGhzID0gW10KICAgICAgICBzYXdfaW1wb3J0ID0gRmFsc2UKICAgICAgICBzZWVuID0gZGljdC5mcm9ta2V5cyhzZWxmLnNpdGVkaXJzKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuZmlsZW5hbWUpOgogICAgICAgICAgICBmID0gb3BlbihzZWxmLmZpbGVuYW1lLCAncnQnKQogICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdpbXBvcnQnKToKICAgICAgICAgICAgICAgICAgICBzYXdfaW1wb3J0ID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBwYXRoID0gbGluZS5yc3RyaXAoKQogICAgICAgICAgICAgICAgc2VsZi5wYXRocy5hcHBlbmQocGF0aCkKICAgICAgICAgICAgICAgIGlmIG5vdCBwYXRoLnN0cmlwKCkgb3IgcGF0aC5zdHJpcCgpLnN0YXJ0c3dpdGgoJyMnKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIyBza2lwIG5vbi1leGlzdGVudCBwYXRocywgaW4gY2FzZSBzb21lYm9keSBkZWxldGVkIGEgcGFja2FnZQogICAgICAgICAgICAgICAgIyBtYW51YWxseSwgYW5kIGR1cGxpY2F0ZSBwYXRocyBhcyB3ZWxsCiAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5wYXRoc1stMV0gPSBub3JtYWxpemVfcGF0aCgKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlZGlyLCBwYXRoKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpIG9yIHBhdGggaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGhzLnBvcCgpICAjIHNraXAgaXQKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZSAgIyB3ZSBjbGVhbmVkIHVwLCBzbyB3ZSdyZSBkaXJ0eSBub3cgOikKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc2VlbltwYXRoXSA9IDEKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgICAgIGlmIHNlbGYucGF0aHMgYW5kIG5vdCBzYXdfaW1wb3J0OgogICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZSAgIyBlbnN1cmUgYW55dGhpbmcgd2UgdG91Y2ggaGFzIGltcG9ydCB3cmFwcGVycwogICAgICAgIHdoaWxlIHNlbGYucGF0aHMgYW5kIG5vdCBzZWxmLnBhdGhzWy0xXS5zdHJpcCgpOgogICAgICAgICAgICBzZWxmLnBhdGhzLnBvcCgpCgogICAgZGVmIHNhdmUoc2VsZik6CiAgICAgICAgIiIiV3JpdGUgY2hhbmdlZCAucHRoIGZpbGUgYmFjayB0byBkaXNrIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZGlydHk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByZWxfcGF0aHMgPSBsaXN0KG1hcChzZWxmLm1ha2VfcmVsYXRpdmUsIHNlbGYucGF0aHMpKQogICAgICAgIGlmIHJlbF9wYXRoczoKICAgICAgICAgICAgbG9nLmRlYnVnKCJTYXZpbmcgJXMiLCBzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICBsaW5lcyA9IHNlbGYuX3dyYXBfbGluZXMocmVsX3BhdGhzKQogICAgICAgICAgICBkYXRhID0gJ1xuJy5qb2luKGxpbmVzKSArICdcbicKCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHNlbGYuZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGVuYW1lLCAnd3QnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQoKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZW5hbWUpOgogICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nIGVtcHR5ICVzIiwgc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZmlsZW5hbWUpCgogICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfd3JhcF9saW5lcyhsaW5lcyk6CiAgICAgICAgcmV0dXJuIGxpbmVzCgogICAgZGVmIGFkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCiAgICAgICAgbmV3X3BhdGggPSAoCiAgICAgICAgICAgIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYucGF0aHMgYW5kICgKICAgICAgICAgICAgICAgIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYuc2l0ZWRpcnMgb3IKICAgICAgICAgICAgICAgICMgYWNjb3VudCBmb3IgJy4nIGJlaW5nIGluIFBZVEhPTlBBVEgKICAgICAgICAgICAgICAgIGRpc3QubG9jYXRpb24gPT0gb3MuZ2V0Y3dkKCkKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICBpZiBuZXdfcGF0aDoKICAgICAgICAgICAgc2VsZi5wYXRocy5hcHBlbmQoZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUKICAgICAgICBFbnZpcm9ubWVudC5hZGQoc2VsZiwgZGlzdCkKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlJlbW92ZSBgZGlzdGAgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIG1hcCIiIgogICAgICAgIHdoaWxlIGRpc3QubG9jYXRpb24gaW4gc2VsZi5wYXRoczoKICAgICAgICAgICAgc2VsZi5wYXRocy5yZW1vdmUoZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUKICAgICAgICBFbnZpcm9ubWVudC5yZW1vdmUoc2VsZiwgZGlzdCkKCiAgICBkZWYgbWFrZV9yZWxhdGl2ZShzZWxmLCBwYXRoKToKICAgICAgICBucGF0aCwgbGFzdCA9IG9zLnBhdGguc3BsaXQobm9ybWFsaXplX3BhdGgocGF0aCkpCiAgICAgICAgYmFzZWxlbiA9IGxlbihzZWxmLmJhc2VkaXIpCiAgICAgICAgcGFydHMgPSBbbGFzdF0KICAgICAgICBzZXAgPSBvcy5hbHRzZXAgPT0gJy8nIGFuZCAnLycgb3Igb3Muc2VwCiAgICAgICAgd2hpbGUgbGVuKG5wYXRoKSA+PSBiYXNlbGVuOgogICAgICAgICAgICBpZiBucGF0aCA9PSBzZWxmLmJhc2VkaXI6CiAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQob3MuY3VyZGlyKQogICAgICAgICAgICAgICAgcGFydHMucmV2ZXJzZSgpCiAgICAgICAgICAgICAgICByZXR1cm4gc2VwLmpvaW4ocGFydHMpCiAgICAgICAgICAgIG5wYXRoLCBsYXN0ID0gb3MucGF0aC5zcGxpdChucGF0aCkKICAgICAgICAgICAgcGFydHMuYXBwZW5kKGxhc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHBhdGgKCgpjbGFzcyBSZXdyaXRlUHRoRGlzdHJpYnV0aW9ucyhQdGhEaXN0cmlidXRpb25zKToKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF93cmFwX2xpbmVzKGNscywgbGluZXMpOgogICAgICAgIHlpZWxkIGNscy5wcmVsdWRlCiAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgIHlpZWxkIGxpbmUKICAgICAgICB5aWVsZCBjbHMucG9zdGx1ZGUKCiAgICBwcmVsdWRlID0gX29uZV9saW5lcigiIiIKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgc3lzLl9fcGxlbiA9IGxlbihzeXMucGF0aCkKICAgICAgICAiIiIpCiAgICBwb3N0bHVkZSA9IF9vbmVfbGluZXIoIiIiCiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIG5ldyA9IHN5cy5wYXRoW3N5cy5fX3BsZW46XQogICAgICAgIGRlbCBzeXMucGF0aFtzeXMuX19wbGVuOl0KICAgICAgICBwID0gZ2V0YXR0cihzeXMsICdfX2VnZ2luc2VydCcsIDApCiAgICAgICAgc3lzLnBhdGhbcDpwXSA9IG5ldwogICAgICAgIHN5cy5fX2VnZ2luc2VydCA9IHAgKyBsZW4obmV3KQogICAgICAgICIiIikKCgppZiBvcy5lbnZpcm9uLmdldCgnU0VUVVBUT09MU19TWVNfUEFUSF9URUNITklRVUUnLCAncmF3JykgPT0gJ3Jld3JpdGUnOgogICAgUHRoRGlzdHJpYnV0aW9ucyA9IFJld3JpdGVQdGhEaXN0cmlidXRpb25zCgoKZGVmIF9maXJzdF9saW5lX3JlKCk6CiAgICAiIiIKICAgIFJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBiYXNlZCBvbiBmaXJzdF9saW5lX3JlIHN1aXRhYmxlIGZvciBtYXRjaGluZwogICAgc3RyaW5ncy4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShmaXJzdF9saW5lX3JlLnBhdHRlcm4sIHN0cik6CiAgICAgICAgcmV0dXJuIGZpcnN0X2xpbmVfcmUKCiAgICAjIGZpcnN0X2xpbmVfcmUgaW4gUHl0aG9uID49My4xLjQgYW5kID49My4yLjEgaXMgYSBieXRlcyBwYXR0ZXJuLgogICAgcmV0dXJuIHJlLmNvbXBpbGUoZmlyc3RfbGluZV9yZS5wYXR0ZXJuLmRlY29kZSgpKQoKCmRlZiBhdXRvX2NobW9kKGZ1bmMsIGFyZywgZXhjKToKICAgIGlmIGZ1bmMgaW4gW29zLnVubGluaywgb3MucmVtb3ZlXSBhbmQgb3MubmFtZSA9PSAnbnQnOgogICAgICAgIGNobW9kKGFyZywgc3RhdC5TX0lXUklURSkKICAgICAgICByZXR1cm4gZnVuYyhhcmcpCiAgICBldCwgZXYsIF8gPSBzeXMuZXhjX2luZm8oKQogICAgc2l4LnJlcmFpc2UoZXQsIChldlswXSwgZXZbMV0gKyAoIiAlcyAlcyIgJSAoZnVuYywgYXJnKSkpKQoKCmRlZiB1cGRhdGVfZGlzdF9jYWNoZXMoZGlzdF9wYXRoLCBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzKToKICAgICIiIgogICAgRml4IGFueSBnbG9iYWxseSBjYWNoZWQgYGRpc3RfcGF0aGAgcmVsYXRlZCBkYXRhCgogICAgYGRpc3RfcGF0aGAgc2hvdWxkIGJlIGEgcGF0aCBvZiBhIG5ld2x5IGluc3RhbGxlZCBlZ2cgZGlzdHJpYnV0aW9uICh6aXBwZWQKICAgIG9yIHVuemlwcGVkKS4KCiAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSBjb250YWlucyBmaW5kZXIgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjYWNoZWQgd2hlbgogICAgaW1wb3J0aW5nIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uLiBBbnkgc3VjaCBmaW5kZXJzIG5lZWQgdG8gYmUKICAgIGNsZWFyZWQgc2luY2UgdGhlIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbiBtaWdodCBiZSBwYWNrYWdlZCBkaWZmZXJlbnRseSwKICAgIGUuZy4gYSB6aXBwZWQgZWdnIGRpc3RyaWJ1dGlvbiBtaWdodCBnZXQgcmVwbGFjZWQgd2l0aCBhbiB1bnppcHBlZCBlZ2cKICAgIGZvbGRlciBvciB2aWNlIHZlcnNhLiBIYXZpbmcgdGhlIG9sZCBmaW5kZXJzIGNhY2hlZCBtYXkgdGhlbiBjYXVzZSBQeXRob24KICAgIHRvIGF0dGVtcHQgbG9hZGluZyBtb2R1bGVzIGZyb20gdGhlIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbiB1c2luZyBhbgogICAgaW5jb3JyZWN0IGxvYWRlci4KCiAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgb2JqZWN0cyBhcmUgUHl0aG9uIGxvYWRlcnMgY2hhcmdlZCB3aXRoIGltcG9ydGluZwogICAgZGF0YSBwYWNrYWdlZCBpbnNpZGUgemlwIGFyY2hpdmVzLiBJZiBzdGFsZSBsb2FkZXJzIHJlZmVyZW5jaW5nIHRoZQogICAgb3JpZ2luYWwgZGlzdHJpYnV0aW9uLCBhcmUgbGVmdCBiZWhpbmQsIHRoZXkgY2FuIGZhaWwgdG8gbG9hZCBtb2R1bGVzIGZyb20KICAgIHRoZSByZXBsYWNlbWVudCBkaXN0cmlidXRpb24uIEUuZy4gaWYgYW4gb2xkIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZQogICAgaXMgdXNlZCB0byBsb2FkIGRhdGEgZnJvbSBhIG5ldyB6aXBwZWQgZWdnIGFyY2hpdmUsIGl0IG1heSBjYXVzZSB0aGUKICAgIG9wZXJhdGlvbiB0byBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gdGhlIHdyb25nIGxvY2F0aW9uIC0KICAgIG9uZSBpbmRpY2F0ZWQgYnkgdGhlIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbidzIHppcCBhcmNoaXZlIGRpcmVjdG9yeQogICAgaW5mb3JtYXRpb24uIFN1Y2ggYW4gb3BlcmF0aW9uIG1heSB0aGVuIGZhaWwgb3V0cmlnaHQsIGUuZy4gcmVwb3J0IGhhdmluZwogICAgcmVhZCBhICdiYWQgbG9jYWwgZmlsZSBoZWFkZXInLCBvciBldmVuIHdvcnNlLCBpdCBtYXkgZmFpbCBzaWxlbnRseSAmCiAgICByZXR1cm4gaW52YWxpZCBkYXRhLgoKICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSBjb250YWlucyBjYWNoZWQgemlwIGFyY2hpdmUgZGlyZWN0b3J5CiAgICBpbmZvcm1hdGlvbiBmb3IgYWxsIGV4aXN0aW5nIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgYW5kIGFsbCBzdWNoCiAgICBpbnN0YW5jZXMgY29ubmVjdGVkIHRvIHRoZSBzYW1lIGFyY2hpdmUgc2hhcmUgdGhlIHNhbWUgY2FjaGVkIGRpcmVjdG9yeQogICAgaW5mb3JtYXRpb24uCgogICAgSWYgYXNrZWQsIGFuZCB0aGUgdW5kZXJseWluZyBQeXRob24gaW1wbGVtZW50YXRpb24gYWxsb3dzIGl0LCB3ZSBjYW4gZml4CiAgICBhbGwgZXhpc3RpbmcgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byB0cmFjawogICAgdGhlbSBkb3duIGFuZCByZW1vdmUgdGhlbSBvbmUgYnkgb25lLCBieSB1cGRhdGluZyB0aGVpciBzaGFyZWQgY2FjaGVkIHppcAogICAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uIFRoaXMsIG9mIGNvdXJzZSwgYXNzdW1lcyB0aGF0IHRoZQogICAgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uIGlzIHBhY2thZ2VkIGFzIGEgemlwcGVkIGVnZy4KCiAgICBJZiBub3QgYXNrZWQgdG8gZml4IGV4aXN0aW5nIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMsIHdlIHN0aWxsIGRvCiAgICBvdXIgYmVzdCB0byBjbGVhciBhbnkgcmVtYWluaW5nIHppcGltcG9ydC56aXBpbXBvcnRlciByZWxhdGVkIGNhY2hlZCBkYXRhCiAgICB0aGF0IG1pZ2h0IHNvbWVob3cgbGF0ZXIgZ2V0IHVzZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgZGF0YSBmcm9tIHRoZSBuZXcKICAgIGRpc3RyaWJ1dGlvbiBhbmQgdGh1cyBjYXVzZSBzdWNoIGxvYWQgb3BlcmF0aW9ucyB0byBmYWlsLiBOb3RlIHRoYXQgd2hlbgogICAgdHJhY2tpbmcgZG93biBzdWNoIHJlbWFpbmluZyBzdGFsZSBkYXRhLCB3ZSBjYW4gbm90IGNhdGNoIGV2ZXJ5IGNvbmNlaXZhYmxlCiAgICB1c2FnZSBmcm9tIGhlcmUsIGFuZCB3ZSBjbGVhciBvbmx5IHRob3NlIHRoYXQgd2Uga25vdyBvZiBhbmQgaGF2ZSBmb3VuZCB0bwogICAgY2F1c2UgcHJvYmxlbXMgaWYgbGVmdCBhbGl2ZS4gQW55IHJlbWFpbmluZyBjYWNoZXMgc2hvdWxkIGJlIHVwZGF0ZWQgYnkKICAgIHdob21ldmVyIGlzIGluIGNoYXJnZSBvZiBtYWludGFpbmluZyB0aGVtLCBpLmUuIHRoZXkgc2hvdWxkIGJlIHJlYWR5IHRvCiAgICBoYW5kbGUgdXMgcmVwbGFjaW5nIHRoZWlyIHppcCBhcmNoaXZlcyB3aXRoIG5ldyBkaXN0cmlidXRpb25zIGF0IHJ1bnRpbWUuCgogICAgIiIiCiAgICAjIFRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGtub3duIHNvdXJjZXMgb2Ygc3RhbGUgemlwaW1wb3J0LnppcGltcG9ydGVyCiAgICAjIGluc3RhbmNlcyB0aGF0IHdlIGRvIG5vdCBjbGVhciBoZXJlLCBidXQgbWlnaHQgaWYgZXZlciBnaXZlbiBhIHJlYXNvbiB0bwogICAgIyBkbyBzbzoKICAgICMgKiBHbG9iYWwgc2V0dXB0b29scyBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0IChhLmsuYS4gJ21hc3RlciB3b3JraW5nCiAgICAjIHNldCcpIG1heSBjb250YWluIGRpc3RyaWJ1dGlvbnMgd2hpY2ggbWF5IGluIHR1cm4gY29udGFpbiB0aGVpcgogICAgIyAgIHppcGltcG9ydC56aXBpbXBvcnRlciBsb2FkZXJzLgogICAgIyAqIFNldmVyYWwgemlwaW1wb3J0LnppcGltcG9ydGVyIGxvYWRlcnMgaGVsZCBieSBsb2NhbCB2YXJpYWJsZXMgZnVydGhlcgogICAgIyAgIHVwIHRoZSBmdW5jdGlvbiBjYWxsIHN0YWNrIHdoZW4gcnVubmluZyB0aGUgc2V0dXB0b29scyBpbnN0YWxsYXRpb24uCiAgICAjICogQWxyZWFkeSBsb2FkZWQgbW9kdWxlcyBtYXkgaGF2ZSB0aGVpciBfX2xvYWRlcl9fIGF0dHJpYnV0ZSBzZXQgdG8gdGhlCiAgICAjICAgZXhhY3QgbG9hZGVyIGluc3RhbmNlIHVzZWQgd2hlbiBpbXBvcnRpbmcgdGhlbS4gUHl0aG9uIDMuNCBkb2NzIHN0YXRlCiAgICAjICAgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkIG1vc3RseSBmb3IgaW50cm9zcGVjdGlvbiBhbmQgc28gaXMKICAgICMgICBub3QgZXhwZWN0ZWQgdG8gY2F1c2UgdXMgcHJvYmxlbXMuCiAgICBub3JtYWxpemVkX3BhdGggPSBub3JtYWxpemVfcGF0aChkaXN0X3BhdGgpCiAgICBfdW5jYWNoZShub3JtYWxpemVkX3BhdGgsIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlKQogICAgaWYgZml4X3ppcGltcG9ydGVyX2NhY2hlczoKICAgICAgICBfcmVwbGFjZV96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKQogICAgZWxzZToKICAgICAgICAjIEhlcmUsIGV2ZW4gdGhvdWdoIHdlIGRvIG5vdCB3YW50IHRvIGZpeCBleGlzdGluZyBhbmQgbm93IHN0YWxlCiAgICAgICAgIyB6aXBpbXBvcnRlciBjYWNoZSBpbmZvcm1hdGlvbiwgd2Ugc3RpbGwgd2FudCB0byByZW1vdmUgaXQuIFJlbGF0ZWQgdG8KICAgICAgICAjIFB5dGhvbidzIHppcCBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBjYWNoZSwgd2UgY2xlYXIgZWFjaCBvZgogICAgICAgICMgaXRzIHN0YWxlIGVudHJpZXMgaW4gdHdvIHBoYXNlczoKICAgICAgICAjICAgMS4gQ2xlYXIgdGhlIGVudHJ5IHNvIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHppcCBhcmNoaXZlIGluZm9ybWF0aW9uCiAgICAgICAgIyAgICAgIHZpYSBhbnkgZXhpc3Rpbmcgc3RhbGUgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBmYWlscy4KICAgICAgICAjICAgMi4gUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBjYWNoZSBzbyBhbnkgbmV3bHkgY29uc3RydWN0ZWQKICAgICAgICAjICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBkbyBub3QgZW5kIHVwIHVzaW5nIG9sZCBzdGFsZQogICAgICAgICMgICAgICB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCiAgICAgICAgIyBUaGlzIHdob2xlIHN0YWxlIGRhdGEgcmVtb3ZhbCBzdGVwIGRvZXMgbm90IHNlZW0gc3RyaWN0bHkgbmVjZXNzYXJ5LAogICAgICAgICMgYnV0IGhhcyBiZWVuIGxlZnQgaW4gYmVjYXVzZSBpdCB3YXMgZG9uZSBiZWZvcmUgd2Ugc3RhcnRlZCByZXBsYWNpbmcKICAgICAgICAjIHRoZSB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gY2FjaGUgY29udGVudCBpZiBwb3NzaWJsZSwgYW5kCiAgICAgICAgIyB0aGVyZSBhcmUgbm8gcmVsZXZhbnQgdW5pdCB0ZXN0cyB0aGF0IHdlIGNhbiBkZXBlbmQgb24gdG8gdGVsbCB1cyBpZgogICAgICAgICMgdGhpcyBpcyByZWFsbHkgbmVlZGVkLgogICAgICAgIF9yZW1vdmVfYW5kX2NsZWFyX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpCgoKZGVmIF9jb2xsZWN0X3ppcGltcG9ydGVyX2NhY2hlX2VudHJpZXMobm9ybWFsaXplZF9wYXRoLCBjYWNoZSk6CiAgICAiIiIKICAgIFJldHVybiB6aXBpbXBvcnRlciBjYWNoZSBlbnRyeSBrZXlzIHJlbGF0ZWQgdG8gYSBnaXZlbiBub3JtYWxpemVkIHBhdGguCgogICAgQWx0ZXJuYXRpdmUgcGF0aCBzcGVsbGluZ3MgKGUuZy4gdGhvc2UgdXNpbmcgZGlmZmVyZW50IGNoYXJhY3RlciBjYXNlIG9yCiAgICB0aG9zZSB1c2luZyBhbHRlcm5hdGl2ZSBwYXRoIHNlcGFyYXRvcnMpIHJlbGF0ZWQgdG8gdGhlIHNhbWUgcGF0aCBhcmUKICAgIGluY2x1ZGVkLiBBbnkgc3ViLXBhdGggZW50cmllcyBhcmUgaW5jbHVkZWQgYXMgd2VsbCwgaS5lLiB0aG9zZQogICAgY29ycmVzcG9uZGluZyB0byB6aXAgYXJjaGl2ZXMgZW1iZWRkZWQgaW4gb3RoZXIgemlwIGFyY2hpdmVzLgoKICAgICIiIgogICAgcmVzdWx0ID0gW10KICAgIHByZWZpeF9sZW4gPSBsZW4obm9ybWFsaXplZF9wYXRoKQogICAgZm9yIHAgaW4gY2FjaGU6CiAgICAgICAgbnAgPSBub3JtYWxpemVfcGF0aChwKQogICAgICAgIGlmIChucC5zdGFydHN3aXRoKG5vcm1hbGl6ZWRfcGF0aCkgYW5kCiAgICAgICAgICAgICAgICBucFtwcmVmaXhfbGVuOnByZWZpeF9sZW4gKyAxXSBpbiAob3Muc2VwLCAnJykpOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHApCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUobm9ybWFsaXplZF9wYXRoLCBjYWNoZSwgdXBkYXRlcj1Ob25lKToKICAgICIiIgogICAgVXBkYXRlIHppcGltcG9ydGVyIGNhY2hlIGRhdGEgZm9yIGEgZ2l2ZW4gbm9ybWFsaXplZCBwYXRoLgoKICAgIEFueSBzdWItcGF0aCBlbnRyaWVzIGFyZSBwcm9jZXNzZWQgYXMgd2VsbCwgaS5lLiB0aG9zZSBjb3JyZXNwb25kaW5nIHRvIHppcAogICAgYXJjaGl2ZXMgZW1iZWRkZWQgaW4gb3RoZXIgemlwIGFyY2hpdmVzLgoKICAgIEdpdmVuIHVwZGF0ZXIgaXMgYSBjYWxsYWJsZSB0YWtpbmcgYSBjYWNoZSBlbnRyeSBrZXkgYW5kIHRoZSBvcmlnaW5hbCBlbnRyeQogICAgKGFmdGVyIGFscmVhZHkgcmVtb3ZpbmcgdGhlIGVudHJ5IGZyb20gdGhlIGNhY2hlKSwgYW5kIGV4cGVjdGVkIHRvIHVwZGF0ZQogICAgdGhlIGVudHJ5IGFuZCBwb3NzaWJseSByZXR1cm4gYSBuZXcgb25lIHRvIGJlIGluc2VydGVkIGluIGl0cyBwbGFjZS4KICAgIFJldHVybmluZyBOb25lIGluZGljYXRlcyB0aGF0IHRoZSBlbnRyeSBzaG91bGQgbm90IGJlIHJlcGxhY2VkIHdpdGggYSBuZXcKICAgIG9uZS4gSWYgbm8gdXBkYXRlciBpcyBnaXZlbiwgdGhlIGNhY2hlIGVudHJpZXMgYXJlIHNpbXBseSByZW1vdmVkIHdpdGhvdXQKICAgIGFueSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcsIHRoZSBzYW1lIGFzIGlmIHRoZSB1cGRhdGVyIHNpbXBseSByZXR1cm5lZCBOb25lLgoKICAgICIiIgogICAgZm9yIHAgaW4gX2NvbGxlY3RfemlwaW1wb3J0ZXJfY2FjaGVfZW50cmllcyhub3JtYWxpemVkX3BhdGgsIGNhY2hlKToKICAgICAgICAjIE4uQi4gcHlweSdzIGN1c3RvbSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUgaW1wbGVtZW50YXRpb24gZG9lcwogICAgICAgICMgbm90IHN1cHBvcnQgdGhlIGNvbXBsZXRlIGRpY3QgaW50ZXJmYWNlOgogICAgICAgICMgKiBEb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCwgdGh1cyBub3QgYWxsb3dpbmcgdGhpcyBmdW5jdGlvbgogICAgICAgICMgICAgdG8gYmUgdXNlZCBvbmx5IGZvciByZW1vdmluZyBleGlzdGluZyBjYWNoZSBlbnRyaWVzLgogICAgICAgICMgICogRG9lcyBub3Qgc3VwcG9ydCB0aGUgZGljdC5wb3AoKSBtZXRob2QsIGZvcmNpbmcgdXMgdG8gdXNlIHRoZQogICAgICAgICMgICAgZ2V0L2RlbCBwYXR0ZXJucyBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWUgdGhlCiAgICAgICAgIyAgICBmb2xsb3dpbmcgbGlua3M6CiAgICAgICAgIyAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzIwMiNpc3N1ZWNvbW1lbnQtMjAyOTEzNDIwCiAgICAgICAgIyAgICAgIGh0dHA6Ly9iaXQubHkvMmg5aXRKWAogICAgICAgIG9sZF9lbnRyeSA9IGNhY2hlW3BdCiAgICAgICAgZGVsIGNhY2hlW3BdCiAgICAgICAgbmV3X2VudHJ5ID0gdXBkYXRlciBhbmQgdXBkYXRlcihwLCBvbGRfZW50cnkpCiAgICAgICAgaWYgbmV3X2VudHJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjYWNoZVtwXSA9IG5ld19lbnRyeQoKCmRlZiBfdW5jYWNoZShub3JtYWxpemVkX3BhdGgsIGNhY2hlKToKICAgIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUobm9ybWFsaXplZF9wYXRoLCBjYWNoZSkKCgpkZWYgX3JlbW92ZV9hbmRfY2xlYXJfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCk6CiAgICBkZWYgY2xlYXJfYW5kX3JlbW92ZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEocGF0aCwgb2xkX2VudHJ5KToKICAgICAgICBvbGRfZW50cnkuY2xlYXIoKQoKICAgIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUoCiAgICAgICAgbm9ybWFsaXplZF9wYXRoLCB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUsCiAgICAgICAgdXBkYXRlcj1jbGVhcl9hbmRfcmVtb3ZlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YSkKCgojIFB5UHkgUHl0aG9uIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGFsbG93IGRpcmVjdGx5IHdyaXRpbmcgdG8gdGhlCiMgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlIGFuZCBzbyBwcmV2ZW50cyB1cyBmcm9tIGF0dGVtcHRpbmcgdG8gY29ycmVjdAojIGl0cyBjb250ZW50LiBUaGUgYmVzdCB3ZSBjYW4gZG8gdGhlcmUgaXMgY2xlYXIgdGhlIHByb2JsZW1hdGljIGNhY2hlIGNvbnRlbnQKIyBhbmQgaGF2ZSBQeVB5IHJlcG9wdWxhdGUgaXQgYXMgbmVlZGVkLiBUaGUgZG93bnNpZGUgaXMgdGhhdCBpZiB0aGVyZSBhcmUgYW55CiMgc3RhbGUgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBsYXlpbmcgYXJvdW5kLCBhdHRlbXB0aW5nIHRvIHVzZSB0aGVtCiMgd2lsbCBmYWlsIGR1ZSB0byBub3QgaGF2aW5nIGl0cyB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlCiMgaW5zdGVhZCBvZiBiZWluZyBhdXRvbWF0aWNhbGx5IGNvcnJlY3RlZCB0byB1c2UgdGhlIG5ldyBjb3JyZWN0IHppcCBhcmNoaXZlCiMgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgppZiAnX19weXB5X18nIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKICAgIF9yZXBsYWNlX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YSA9IFwKICAgICAgICBfcmVtb3ZlX2FuZF9jbGVhcl96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEKZWxzZToKCiAgICBkZWYgX3JlcGxhY2VfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCk6CiAgICAgICAgZGVmIHJlcGxhY2VfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKHBhdGgsIG9sZF9lbnRyeSk6CiAgICAgICAgICAgICMgTi5CLiBJbiB0aGVvcnksIHdlIGNvdWxkIGxvYWQgdGhlIHppcCBkaXJlY3RvcnkgaW5mb3JtYXRpb24ganVzdAogICAgICAgICAgICAjIG9uY2UgZm9yIGFsbCB1cGRhdGVkIHBhdGggc3BlbGxpbmdzLCBhbmQgdGhlbiBjb3B5IGl0IGxvY2FsbHkgYW5kCiAgICAgICAgICAgICMgdXBkYXRlIGl0cyBjb250YWluZWQgcGF0aCBzdHJpbmdzIHRvIGNvbnRhaW4gdGhlIGNvcnJlY3QKICAgICAgICAgICAgIyBzcGVsbGluZywgYnV0IHRoYXQgc2VlbXMgbGlrZSBhIHdheSB0b28gaW52YXNpdmUgbW92ZSAodGhpcyBjYWNoZQogICAgICAgICAgICAjIHN0cnVjdHVyZSBpcyBub3Qgb2ZmaWNpYWxseSBkb2N1bWVudGVkIGFueXdoZXJlIGFuZCBjb3VsZCBpbgogICAgICAgICAgICAjIHRoZW9yeSBjaGFuZ2Ugd2l0aCBuZXcgUHl0aG9uIHJlbGVhc2VzKSBmb3Igbm8gc2lnbmlmaWNhbnQKICAgICAgICAgICAgIyBiZW5lZml0LgogICAgICAgICAgICBvbGRfZW50cnkuY2xlYXIoKQogICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGF0aCkKICAgICAgICAgICAgb2xkX2VudHJ5LnVwZGF0ZSh6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbcGF0aF0pCiAgICAgICAgICAgIHJldHVybiBvbGRfZW50cnkKCiAgICAgICAgX3VwZGF0ZV96aXBpbXBvcnRlcl9jYWNoZSgKICAgICAgICAgICAgbm9ybWFsaXplZF9wYXRoLCB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUsCiAgICAgICAgICAgIHVwZGF0ZXI9cmVwbGFjZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEpCgoKZGVmIGlzX3B5dGhvbih0ZXh0LCBmaWxlbmFtZT0nPHN0cmluZz4nKToKICAgICJJcyB0aGlzIHN0cmluZyBhIHZhbGlkIFB5dGhvbiBzY3JpcHQ/IgogICAgdHJ5OgogICAgICAgIGNvbXBpbGUodGV4dCwgZmlsZW5hbWUsICdleGVjJykKICAgIGV4Y2VwdCAoU3ludGF4RXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBlbHNlOgogICAgICAgIHJldHVybiBUcnVlCgoKZGVmIGlzX3NoKGV4ZWN1dGFibGUpOgogICAgIiIiRGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgZXhlY3V0YWJsZSBpcyBhIC5zaCAoY29udGFpbnMgYSAjISBsaW5lKSIiIgogICAgdHJ5OgogICAgICAgIHdpdGggaW8ub3BlbihleGVjdXRhYmxlLCBlbmNvZGluZz0nbGF0aW4tMScpIGFzIGZwOgogICAgICAgICAgICBtYWdpYyA9IGZwLnJlYWQoMikKICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKICAgIHJldHVybiBtYWdpYyA9PSAnIyEnCgoKZGVmIG50X3F1b3RlX2FyZyhhcmcpOgogICAgIiIiUXVvdGUgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgYWNjb3JkaW5nIHRvIFdpbmRvd3MgcGFyc2luZyBydWxlcyIiIgogICAgcmV0dXJuIHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFthcmddKQoKCmRlZiBpc19weXRob25fc2NyaXB0KHNjcmlwdF90ZXh0LCBmaWxlbmFtZSk6CiAgICAiIiJJcyB0aGlzIHRleHQsIGFzIGEgd2hvbGUsIGEgUHl0aG9uIHNjcmlwdD8gKGFzIG9wcG9zZWQgdG8gc2hlbGwvYmF0L2V0Yy4KICAgICIiIgogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCcucHl3Jyk6CiAgICAgICAgcmV0dXJuIFRydWUgICMgZXh0ZW5zaW9uIHNheXMgaXQncyBQeXRob24KICAgIGlmIGlzX3B5dGhvbihzY3JpcHRfdGV4dCwgZmlsZW5hbWUpOgogICAgICAgIHJldHVybiBUcnVlICAjIGl0J3Mgc3ludGFjdGljYWxseSB2YWxpZCBQeXRob24KICAgIGlmIHNjcmlwdF90ZXh0LnN0YXJ0c3dpdGgoJyMhJyk6CiAgICAgICAgIyBJdCBiZWdpbnMgd2l0aCBhICcjIScgbGluZSwgc28gY2hlY2sgaWYgJ3B5dGhvbicgaXMgaW4gaXQgc29tZXdoZXJlCiAgICAgICAgcmV0dXJuICdweXRob24nIGluIHNjcmlwdF90ZXh0LnNwbGl0bGluZXMoKVswXS5sb3dlcigpCgogICAgcmV0dXJuIEZhbHNlICAjIE5vdCBhbnkgUHl0aG9uIEkgY2FuIHJlY29nbml6ZQoKCnRyeToKICAgIGZyb20gb3MgaW1wb3J0IGNobW9kIGFzIF9jaG1vZApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIEp5dGhvbiBjb21wYXRpYmlsaXR5CiAgICBkZWYgX2NobW9kKCphcmdzKToKICAgICAgICBwYXNzCgoKZGVmIGNobW9kKHBhdGgsIG1vZGUpOgogICAgbG9nLmRlYnVnKCJjaGFuZ2luZyBtb2RlIG9mICVzIHRvICVvIiwgcGF0aCwgbW9kZSkKICAgIHRyeToKICAgICAgICBfY2htb2QocGF0aCwgbW9kZSkKICAgIGV4Y2VwdCBvcy5lcnJvciBhcyBlOgogICAgICAgIGxvZy5kZWJ1ZygiY2htb2QgZmFpbGVkOiAlcyIsIGUpCgoKY2xhc3MgQ29tbWFuZFNwZWMobGlzdCk6CiAgICAiIiIKICAgIEEgY29tbWFuZCBzcGVjIGZvciBhICMhIGhlYWRlciwgc3BlY2lmaWVkIGFzIGEgbGlzdCBvZiBhcmd1bWVudHMgYWtpbiB0bwogICAgdGhvc2UgcGFzc2VkIHRvIFBvcGVuLgogICAgIiIiCgogICAgb3B0aW9ucyA9IFtdCiAgICBzcGxpdF9hcmdzID0gZGljdCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYmVzdChjbHMpOgogICAgICAgICIiIgogICAgICAgIENob29zZSB0aGUgYmVzdCBDb21tYW5kU3BlYyBjbGFzcyBiYXNlZCBvbiBlbnZpcm9ubWVudGFsIGNvbmRpdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGNscwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9zeXNfZXhlY3V0YWJsZShjbHMpOgogICAgICAgIF9kZWZhdWx0ID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSkKICAgICAgICByZXR1cm4gb3MuZW52aXJvbi5nZXQoJ19fUFlWRU5WX0xBVU5DSEVSX18nLCBfZGVmYXVsdCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3BhcmFtKGNscywgcGFyYW0pOgogICAgICAgICIiIgogICAgICAgIENvbnN0cnVjdCBhIENvbW1hbmRTcGVjIGZyb20gYSBwYXJhbWV0ZXIgdG8gYnVpbGRfc2NyaXB0cywgd2hpY2ggbWF5CiAgICAgICAgYmUgTm9uZS4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmFtLCBjbHMpOgogICAgICAgICAgICByZXR1cm4gcGFyYW0KICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmFtLCBsaXN0KToKICAgICAgICAgICAgcmV0dXJuIGNscyhwYXJhbSkKICAgICAgICBpZiBwYXJhbSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gY2xzLmZyb21fZW52aXJvbm1lbnQoKQogICAgICAgICMgb3RoZXJ3aXNlLCBhc3N1bWUgaXQncyBhIHN0cmluZy4KICAgICAgICByZXR1cm4gY2xzLmZyb21fc3RyaW5nKHBhcmFtKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZW52aXJvbm1lbnQoY2xzKToKICAgICAgICByZXR1cm4gY2xzKFtjbHMuX3N5c19leGVjdXRhYmxlKCldKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fc3RyaW5nKGNscywgc3RyaW5nKToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgYSBjb21tYW5kIHNwZWMgZnJvbSBhIHNpbXBsZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgY29tbWFuZAogICAgICAgIGxpbmUgcGFyc2VhYmxlIGJ5IHNobGV4LnNwbGl0LgogICAgICAgICIiIgogICAgICAgIGl0ZW1zID0gc2hsZXguc3BsaXQoc3RyaW5nLCAqKmNscy5zcGxpdF9hcmdzKQogICAgICAgIHJldHVybiBjbHMoaXRlbXMpCgogICAgZGVmIGluc3RhbGxfb3B0aW9ucyhzZWxmLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgc2VsZi5vcHRpb25zID0gc2hsZXguc3BsaXQoc2VsZi5fZXh0cmFjdF9vcHRpb25zKHNjcmlwdF90ZXh0KSkKICAgICAgICBjbWRsaW5lID0gc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoc2VsZikKICAgICAgICBpZiBub3QgaXNhc2NpaShjbWRsaW5lKToKICAgICAgICAgICAgc2VsZi5vcHRpb25zWzowXSA9IFsnLXgnXQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZXh0cmFjdF9vcHRpb25zKG9yaWdfc2NyaXB0KToKICAgICAgICAiIiIKICAgICAgICBFeHRyYWN0IGFueSBvcHRpb25zIGZyb20gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBmaXJzdCA9IChvcmlnX3NjcmlwdCArICdcbicpLnNwbGl0bGluZXMoKVswXQogICAgICAgIG1hdGNoID0gX2ZpcnN0X2xpbmVfcmUoKS5tYXRjaChmaXJzdCkKICAgICAgICBvcHRpb25zID0gbWF0Y2guZ3JvdXAoMSkgb3IgJycgaWYgbWF0Y2ggZWxzZSAnJwogICAgICAgIHJldHVybiBvcHRpb25zLnN0cmlwKCkKCiAgICBkZWYgYXNfaGVhZGVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9yZW5kZXIoc2VsZiArIGxpc3Qoc2VsZi5vcHRpb25zKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3N0cmlwX3F1b3RlcyhpdGVtKToKICAgICAgICBfUVVPVEVTID0gJyJcJycKICAgICAgICBmb3IgcSBpbiBfUVVPVEVTOgogICAgICAgICAgICBpZiBpdGVtLnN0YXJ0c3dpdGgocSkgYW5kIGl0ZW0uZW5kc3dpdGgocSk6CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVsxOi0xXQogICAgICAgIHJldHVybiBpdGVtCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZW5kZXIoaXRlbXMpOgogICAgICAgIGNtZGxpbmUgPSBzdWJwcm9jZXNzLmxpc3QyY21kbGluZSgKICAgICAgICAgICAgQ29tbWFuZFNwZWMuX3N0cmlwX3F1b3RlcyhpdGVtLnN0cmlwKCkpIGZvciBpdGVtIGluIGl0ZW1zKQogICAgICAgIHJldHVybiAnIyEnICsgY21kbGluZSArICdcbicKCgojIEZvciBwYnIgY29tcGF0OyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4Kc3lzX2V4ZWN1dGFibGUgPSBDb21tYW5kU3BlYy5fc3lzX2V4ZWN1dGFibGUoKQoKCmNsYXNzIFdpbmRvd3NDb21tYW5kU3BlYyhDb21tYW5kU3BlYyk6CiAgICBzcGxpdF9hcmdzID0gZGljdChwb3NpeD1GYWxzZSkKCgpjbGFzcyBTY3JpcHRXcml0ZXIob2JqZWN0KToKICAgICIiIgogICAgRW5jYXBzdWxhdGVzIGJlaGF2aW9yIGFyb3VuZCB3cml0aW5nIGVudHJ5IHBvaW50IHNjcmlwdHMgZm9yIGNvbnNvbGUgYW5kCiAgICBndWkgYXBwcy4KICAgICIiIgoKICAgIHRlbXBsYXRlID0gdGV4dHdyYXAuZGVkZW50KHIiIiIKICAgICAgICAjIEVBU1ktSU5TVEFMTC1FTlRSWS1TQ1JJUFQ6ICUoc3BlYylyLCUoZ3JvdXApciwlKG5hbWUpcgogICAgICAgIF9fcmVxdWlyZXNfXyA9ICUoc3BlYylyCiAgICAgICAgaW1wb3J0IHJlCiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgbG9hZF9lbnRyeV9wb2ludAoKICAgICAgICBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgICAgICAgICBzeXMuYXJndlswXSA9IHJlLnN1YihyJygtc2NyaXB0XC5weXc/fFwuZXhlKT8kJywgJycsIHN5cy5hcmd2WzBdKQogICAgICAgICAgICBzeXMuZXhpdCgKICAgICAgICAgICAgICAgIGxvYWRfZW50cnlfcG9pbnQoJShzcGVjKXIsICUoZ3JvdXApciwgJShuYW1lKXIpKCkKICAgICAgICAgICAgKQogICAgIiIiKS5sc3RyaXAoKQoKICAgIGNvbW1hbmRfc3BlY19jbGFzcyA9IENvbW1hbmRTcGVjCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3NjcmlwdF9hcmdzKGNscywgZGlzdCwgZXhlY3V0YWJsZT1Ob25lLCB3aW5pbnN0PUZhbHNlKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGdldF9hcmdzIiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgIHdyaXRlciA9IChXaW5kb3dzU2NyaXB0V3JpdGVyIGlmIHdpbmluc3QgZWxzZSBTY3JpcHRXcml0ZXIpLmJlc3QoKQogICAgICAgIGhlYWRlciA9IGNscy5nZXRfc2NyaXB0X2hlYWRlcigiIiwgZXhlY3V0YWJsZSwgd2luaW5zdCkKICAgICAgICByZXR1cm4gd3JpdGVyLmdldF9hcmdzKGRpc3QsIGhlYWRlcikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfc2NyaXB0X2hlYWRlcihjbHMsIHNjcmlwdF90ZXh0LCBleGVjdXRhYmxlPU5vbmUsIHdpbmluc3Q9RmFsc2UpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgZ2V0X2hlYWRlciIsIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICBpZiB3aW5pbnN0OgogICAgICAgICAgICBleGVjdXRhYmxlID0gInB5dGhvbi5leGUiCiAgICAgICAgY21kID0gY2xzLmNvbW1hbmRfc3BlY19jbGFzcy5iZXN0KCkuZnJvbV9wYXJhbShleGVjdXRhYmxlKQogICAgICAgIGNtZC5pbnN0YWxsX29wdGlvbnMoc2NyaXB0X3RleHQpCiAgICAgICAgcmV0dXJuIGNtZC5hc19oZWFkZXIoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9hcmdzKGNscywgZGlzdCwgaGVhZGVyPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFlpZWxkIHdyaXRlX3NjcmlwdCgpIGFyZ3VtZW50IHR1cGxlcyBmb3IgYSBkaXN0cmlidXRpb24ncwogICAgICAgIGNvbnNvbGVfc2NyaXB0cyBhbmQgZ3VpX3NjcmlwdHMgZW50cnkgcG9pbnRzLgogICAgICAgICIiIgogICAgICAgIGlmIGhlYWRlciBpcyBOb25lOgogICAgICAgICAgICBoZWFkZXIgPSBjbHMuZ2V0X2hlYWRlcigpCiAgICAgICAgc3BlYyA9IHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAgICAgZm9yIHR5cGVfIGluICdjb25zb2xlJywgJ2d1aSc6CiAgICAgICAgICAgIGdyb3VwID0gdHlwZV8gKyAnX3NjcmlwdHMnCiAgICAgICAgICAgIGZvciBuYW1lLCBlcCBpbiBkaXN0LmdldF9lbnRyeV9tYXAoZ3JvdXApLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBjbHMuX2Vuc3VyZV9zYWZlX25hbWUobmFtZSkKICAgICAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gY2xzLnRlbXBsYXRlICUgbG9jYWxzKCkKICAgICAgICAgICAgICAgIGFyZ3MgPSBjbHMuX2dldF9zY3JpcHRfYXJncyh0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCkKICAgICAgICAgICAgICAgIGZvciByZXMgaW4gYXJnczoKICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXMKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2Vuc3VyZV9zYWZlX25hbWUobmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUHJldmVudCBwYXRocyBpbiAqX3NjcmlwdHMgZW50cnkgcG9pbnQgbmFtZXMuCiAgICAgICAgIiIiCiAgICAgICAgaGFzX3BhdGhfc2VwID0gcmUuc2VhcmNoKHInW1xcL10nLCBuYW1lKQogICAgICAgIGlmIGhhc19wYXRoX3NlcDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUGF0aCBzZXBhcmF0b3JzIG5vdCBhbGxvd2VkIGluIHNjcmlwdCBuYW1lcyIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3dyaXRlcihjbHMsIGZvcmNlX3dpbmRvd3MpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgYmVzdCIsIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICByZXR1cm4gV2luZG93c1NjcmlwdFdyaXRlci5iZXN0KCkgaWYgZm9yY2Vfd2luZG93cyBlbHNlIGNscy5iZXN0KCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiZXN0KGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgU2VsZWN0IHRoZSBiZXN0IFNjcmlwdFdyaXRlciBmb3IgdGhpcyBlbnZpcm9ubWVudC4KICAgICAgICAiIiIKICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBvciAob3MubmFtZSA9PSAnamF2YScgYW5kIG9zLl9uYW1lID09ICdudCcpOgogICAgICAgICAgICByZXR1cm4gV2luZG93c1NjcmlwdFdyaXRlci5iZXN0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gY2xzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9zY3JpcHRfYXJncyhjbHMsIHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KToKICAgICAgICAjIFNpbXBseSB3cml0ZSB0aGUgc3R1YiB3aXRoIG5vIGV4dGVuc2lvbi4KICAgICAgICB5aWVsZCAobmFtZSwgaGVhZGVyICsgc2NyaXB0X3RleHQpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X2hlYWRlcihjbHMsIHNjcmlwdF90ZXh0PSIiLCBleGVjdXRhYmxlPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSBhICMhIGxpbmUsIGdldHRpbmcgb3B0aW9ucyAoaWYgYW55KSBmcm9tIHNjcmlwdF90ZXh0IiIiCiAgICAgICAgY21kID0gY2xzLmNvbW1hbmRfc3BlY19jbGFzcy5iZXN0KCkuZnJvbV9wYXJhbShleGVjdXRhYmxlKQogICAgICAgIGNtZC5pbnN0YWxsX29wdGlvbnMoc2NyaXB0X3RleHQpCiAgICAgICAgcmV0dXJuIGNtZC5hc19oZWFkZXIoKQoKCmNsYXNzIFdpbmRvd3NTY3JpcHRXcml0ZXIoU2NyaXB0V3JpdGVyKToKICAgIGNvbW1hbmRfc3BlY19jbGFzcyA9IFdpbmRvd3NDb21tYW5kU3BlYwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF93cml0ZXIoY2xzKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGJlc3QiLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgcmV0dXJuIGNscy5iZXN0KCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiZXN0KGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgU2VsZWN0IHRoZSBiZXN0IFNjcmlwdFdyaXRlciBzdWl0YWJsZSBmb3IgV2luZG93cwogICAgICAgICIiIgogICAgICAgIHdyaXRlcl9sb29rdXAgPSBkaWN0KAogICAgICAgICAgICBleGVjdXRhYmxlPVdpbmRvd3NFeGVjdXRhYmxlTGF1bmNoZXJXcml0ZXIsCiAgICAgICAgICAgIG5hdHVyYWw9Y2xzLAogICAgICAgICkKICAgICAgICAjIGZvciBjb21wYXRpYmlsaXR5LCB1c2UgdGhlIGV4ZWN1dGFibGUgbGF1bmNoZXIgYnkgZGVmYXVsdAogICAgICAgIGxhdW5jaGVyID0gb3MuZW52aXJvbi5nZXQoJ1NFVFVQVE9PTFNfTEFVTkNIRVInLCAnZXhlY3V0YWJsZScpCiAgICAgICAgcmV0dXJuIHdyaXRlcl9sb29rdXBbbGF1bmNoZXJdCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9zY3JpcHRfYXJncyhjbHMsIHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KToKICAgICAgICAiRm9yIFdpbmRvd3MsIGFkZCBhIC5weSBleHRlbnNpb24iCiAgICAgICAgZXh0ID0gZGljdChjb25zb2xlPScucHlhJywgZ3VpPScucHl3JylbdHlwZV9dCiAgICAgICAgaWYgZXh0IG5vdCBpbiBvcy5lbnZpcm9uWydQQVRIRVhUJ10ubG93ZXIoKS5zcGxpdCgnOycpOgogICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAie2V4dH0gbm90IGxpc3RlZCBpbiBQQVRIRVhUOyBzY3JpcHRzIHdpbGwgbm90IGJlICIKICAgICAgICAgICAgICAgICJyZWNvZ25pemVkIGFzIGV4ZWN1dGFibGVzLiIKICAgICAgICAgICAgKS5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIFVzZXJXYXJuaW5nKQogICAgICAgIG9sZCA9IFsnLnB5YScsICcucHknLCAnLXNjcmlwdC5weScsICcucHljJywgJy5weW8nLCAnLnB5dycsICcuZXhlJ10KICAgICAgICBvbGQucmVtb3ZlKGV4dCkKICAgICAgICBoZWFkZXIgPSBjbHMuX2FkanVzdF9oZWFkZXIodHlwZV8sIGhlYWRlcikKICAgICAgICBibG9ja2VycyA9IFtuYW1lICsgeCBmb3IgeCBpbiBvbGRdCiAgICAgICAgeWllbGQgbmFtZSArIGV4dCwgaGVhZGVyICsgc2NyaXB0X3RleHQsICd0JywgYmxvY2tlcnMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYWRqdXN0X2hlYWRlcihjbHMsIHR5cGVfLCBvcmlnX2hlYWRlcik6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBzdXJlICdweXRob253JyBpcyB1c2VkIGZvciBndWkgYW5kIGFuZCAncHl0aG9uJyBpcyB1c2VkIGZvcgogICAgICAgIGNvbnNvbGUgKHJlZ2FyZGxlc3Mgb2Ygd2hhdCBzeXMuZXhlY3V0YWJsZSBpcykuCiAgICAgICAgIiIiCiAgICAgICAgcGF0dGVybiA9ICdweXRob253LmV4ZScKICAgICAgICByZXBsID0gJ3B5dGhvbi5leGUnCiAgICAgICAgaWYgdHlwZV8gPT0gJ2d1aSc6CiAgICAgICAgICAgIHBhdHRlcm4sIHJlcGwgPSByZXBsLCBwYXR0ZXJuCiAgICAgICAgcGF0dGVybl9vYiA9IHJlLmNvbXBpbGUocmUuZXNjYXBlKHBhdHRlcm4pLCByZS5JR05PUkVDQVNFKQogICAgICAgIG5ld19oZWFkZXIgPSBwYXR0ZXJuX29iLnN1YihzdHJpbmc9b3JpZ19oZWFkZXIsIHJlcGw9cmVwbCkKICAgICAgICByZXR1cm4gbmV3X2hlYWRlciBpZiBjbHMuX3VzZV9oZWFkZXIobmV3X2hlYWRlcikgZWxzZSBvcmlnX2hlYWRlcgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdXNlX2hlYWRlcihuZXdfaGVhZGVyKToKICAgICAgICAiIiIKICAgICAgICBTaG91bGQgX2FkanVzdF9oZWFkZXIgdXNlIHRoZSByZXBsYWNlZCBoZWFkZXI/CgogICAgICAgIE9uIG5vbi13aW5kb3dzIHN5c3RlbXMsIGFsd2F5cyB1c2UuIE9uCiAgICAgICAgV2luZG93cyBzeXN0ZW1zLCBvbmx5IHVzZSB0aGUgcmVwbGFjZWQgaGVhZGVyIGlmIGl0IHJlc29sdmVzCiAgICAgICAgdG8gYW4gZXhlY3V0YWJsZSBvbiB0aGUgc3lzdGVtLgogICAgICAgICIiIgogICAgICAgIGNsZWFuX2hlYWRlciA9IG5ld19oZWFkZXJbMjotMV0uc3RyaXAoJyInKQogICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJyBvciBmaW5kX2V4ZWN1dGFibGUoY2xlYW5faGVhZGVyKQoKCmNsYXNzIFdpbmRvd3NFeGVjdXRhYmxlTGF1bmNoZXJXcml0ZXIoV2luZG93c1NjcmlwdFdyaXRlcik6CiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3NjcmlwdF9hcmdzKGNscywgdHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpOgogICAgICAgICIiIgogICAgICAgIEZvciBXaW5kb3dzLCBhZGQgYSAucHkgZXh0ZW5zaW9uIGFuZCBhbiAuZXhlIGxhdW5jaGVyCiAgICAgICAgIiIiCiAgICAgICAgaWYgdHlwZV8gPT0gJ2d1aSc6CiAgICAgICAgICAgIGxhdW5jaGVyX3R5cGUgPSAnZ3VpJwogICAgICAgICAgICBleHQgPSAnLXNjcmlwdC5weXcnCiAgICAgICAgICAgIG9sZCA9IFsnLnB5dyddCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGF1bmNoZXJfdHlwZSA9ICdjbGknCiAgICAgICAgICAgIGV4dCA9ICctc2NyaXB0LnB5JwogICAgICAgICAgICBvbGQgPSBbJy5weScsICcucHljJywgJy5weW8nXQogICAgICAgIGhkciA9IGNscy5fYWRqdXN0X2hlYWRlcih0eXBlXywgaGVhZGVyKQogICAgICAgIGJsb2NrZXJzID0gW25hbWUgKyB4IGZvciB4IGluIG9sZF0KICAgICAgICB5aWVsZCAobmFtZSArIGV4dCwgaGRyICsgc2NyaXB0X3RleHQsICd0JywgYmxvY2tlcnMpCiAgICAgICAgeWllbGQgKAogICAgICAgICAgICBuYW1lICsgJy5leGUnLCBnZXRfd2luX2xhdW5jaGVyKGxhdW5jaGVyX3R5cGUpLAogICAgICAgICAgICAnYicgICMgd3JpdGUgaW4gYmluYXJ5IG1vZGUKICAgICAgICApCiAgICAgICAgaWYgbm90IGlzXzY0Yml0KCk6CiAgICAgICAgICAgICMgaW5zdGFsbCBhIG1hbmlmZXN0IGZvciB0aGUgbGF1bmNoZXIgdG8gcHJldmVudCBXaW5kb3dzCiAgICAgICAgICAgICMgZnJvbSBkZXRlY3RpbmcgaXQgYXMgYW4gaW5zdGFsbGVyICh3aGljaCBpdCB3aWxsIGZvcgogICAgICAgICAgICAjICBsYXVuY2hlcnMgbGlrZSBlYXN5X2luc3RhbGwuZXhlKS4gQ29uc2lkZXIgb25seQogICAgICAgICAgICAjICBhZGRpbmcgYSBtYW5pZmVzdCBmb3IgbGF1bmNoZXJzIGRldGVjdGVkIGFzIGluc3RhbGxlcnMuCiAgICAgICAgICAgICMgIFNlZSBEaXN0cmlidXRlICMxNDMgZm9yIGRldGFpbHMuCiAgICAgICAgICAgIG1fbmFtZSA9IG5hbWUgKyAnLmV4ZS5tYW5pZmVzdCcKICAgICAgICAgICAgeWllbGQgKG1fbmFtZSwgbG9hZF9sYXVuY2hlcl9tYW5pZmVzdChuYW1lKSwgJ3QnKQoKCiMgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkKZ2V0X3NjcmlwdF9hcmdzID0gU2NyaXB0V3JpdGVyLmdldF9zY3JpcHRfYXJncwpnZXRfc2NyaXB0X2hlYWRlciA9IFNjcmlwdFdyaXRlci5nZXRfc2NyaXB0X2hlYWRlcgoKCmRlZiBnZXRfd2luX2xhdW5jaGVyKHR5cGUpOgogICAgIiIiCiAgICBMb2FkIHRoZSBXaW5kb3dzIGxhdW5jaGVyIChleGVjdXRhYmxlKSBzdWl0YWJsZSBmb3IgbGF1bmNoaW5nIGEgc2NyaXB0LgoKICAgIGB0eXBlYCBzaG91bGQgYmUgZWl0aGVyICdjbGknIG9yICdndWknCgogICAgUmV0dXJucyB0aGUgZXhlY3V0YWJsZSBhcyBhIGJ5dGUgc3RyaW5nLgogICAgIiIiCiAgICBsYXVuY2hlcl9mbiA9ICclcy5leGUnICUgdHlwZQogICAgaWYgaXNfNjRiaXQoKToKICAgICAgICBsYXVuY2hlcl9mbiA9IGxhdW5jaGVyX2ZuLnJlcGxhY2UoIi4iLCAiLTY0LiIpCiAgICBlbHNlOgogICAgICAgIGxhdW5jaGVyX2ZuID0gbGF1bmNoZXJfZm4ucmVwbGFjZSgiLiIsICItMzIuIikKICAgIHJldHVybiByZXNvdXJjZV9zdHJpbmcoJ3NldHVwdG9vbHMnLCBsYXVuY2hlcl9mbikKCgpkZWYgbG9hZF9sYXVuY2hlcl9tYW5pZmVzdChuYW1lKToKICAgIG1hbmlmZXN0ID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9zdHJpbmcoX19uYW1lX18sICdsYXVuY2hlciBtYW5pZmVzdC54bWwnKQogICAgaWYgc2l4LlBZMjoKICAgICAgICByZXR1cm4gbWFuaWZlc3QgJSB2YXJzKCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hbmlmZXN0LmRlY29kZSgndXRmLTgnKSAlIHZhcnMoKQoKCmRlZiBybXRyZWUocGF0aCwgaWdub3JlX2Vycm9ycz1GYWxzZSwgb25lcnJvcj1hdXRvX2NobW9kKToKICAgIHJldHVybiBzaHV0aWwucm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnMsIG9uZXJyb3IpCgoKZGVmIGN1cnJlbnRfdW1hc2soKToKICAgIHRtcCA9IG9zLnVtYXNrKDBvMDIyKQogICAgb3MudW1hc2sodG1wKQogICAgcmV0dXJuIHRtcAoKCmRlZiBib290c3RyYXAoKToKICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBzZXR1cHRvb2xzKi5lZ2cgaXMgcnVuIHVzaW5nIC9iaW4vc2gKICAgIGltcG9ydCBzZXR1cHRvb2xzCgogICAgYXJndjAgPSBvcy5wYXRoLmRpcm5hbWUoc2V0dXB0b29scy5fX3BhdGhfX1swXSkKICAgIHN5cy5hcmd2WzBdID0gYXJndjAKICAgIHN5cy5hcmd2LmFwcGVuZChhcmd2MCkKICAgIG1haW4oKQoKCmRlZiBtYWluKGFyZ3Y9Tm9uZSwgKiprdyk6CiAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwCiAgICBmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uCgogICAgY2xhc3MgRGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcyhEaXN0cmlidXRpb24pOgogICAgICAgIGNvbW1vbl91c2FnZSA9ICIiCgogICAgICAgIGRlZiBfc2hvd19oZWxwKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgd2l0aCBfcGF0Y2hfdXNhZ2UoKToKICAgICAgICAgICAgICAgIERpc3RyaWJ1dGlvbi5fc2hvd19oZWxwKHNlbGYsICphcmdzLCAqKmt3KQoKICAgIGlmIGFyZ3YgaXMgTm9uZToKICAgICAgICBhcmd2ID0gc3lzLmFyZ3ZbMTpdCgogICAgd2l0aCBfcGF0Y2hfdXNhZ2UoKToKICAgICAgICBzZXR1cCgKICAgICAgICAgICAgc2NyaXB0X2FyZ3M9WyctcScsICdlYXN5X2luc3RhbGwnLCAnLXYnXSArIGFyZ3YsCiAgICAgICAgICAgIHNjcmlwdF9uYW1lPXN5cy5hcmd2WzBdIG9yICdlYXN5X2luc3RhbGwnLAogICAgICAgICAgICBkaXN0Y2xhc3M9RGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcywKICAgICAgICAgICAgKiprdwogICAgICAgICkKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgX3BhdGNoX3VzYWdlKCk6CiAgICBpbXBvcnQgZGlzdHV0aWxzLmNvcmUKICAgIFVTQUdFID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIHVzYWdlOiAlKHNjcmlwdClzIFtvcHRpb25zXSByZXF1aXJlbWVudF9vcl91cmwgLi4uCiAgICAgICAgICAgb3I6ICUoc2NyaXB0KXMgLS1oZWxwCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBnZW5fdXNhZ2Uoc2NyaXB0X25hbWUpOgogICAgICAgIHJldHVybiBVU0FHRSAlIGRpY3QoCiAgICAgICAgICAgIHNjcmlwdD1vcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9uYW1lKSwKICAgICAgICApCgogICAgc2F2ZWQgPSBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UKICAgIGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZSA9IGdlbl91c2FnZQogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZSA9IHNhdmVkClBLAwQUAAAAAAAAACEATixyQnBhAABwYQAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkiIiJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8KCkNyZWF0ZSBhIGRpc3RyaWJ1dGlvbidzIC5lZ2ctaW5mbyBkaXJlY3RvcnkgYW5kIGNvbnRlbnRzIiIiCgpmcm9tIGRpc3R1dGlscy5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QgYXMgX0ZpbGVMaXN0CmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzSW50ZXJuYWxFcnJvcgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwppbXBvcnQgZGlzdHV0aWxzLmZpbGVsaXN0CmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgaW8KaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB0aW1lCmltcG9ydCBjb2xsZWN0aW9ucwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdCBpbXBvcnQgc2Rpc3QKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHdhbGtfcmV2Y3RybApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBiZGlzdF9lZ2cKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICBwYXJzZV9yZXF1aXJlbWVudHMsIHNhZmVfbmFtZSwgcGFyc2VfdmVyc2lvbiwKICAgIHNhZmVfdmVyc2lvbiwgeWllbGRfbGluZXMsIEVudHJ5UG9pbnQsIGl0ZXJfZW50cnlfcG9pbnRzLCB0b19maWxlbmFtZSkKaW1wb3J0IHNldHVwdG9vbHMudW5pY29kZV91dGlscyBhcyB1bmljb2RlX3V0aWxzCmZyb20gc2V0dXB0b29scy5nbG9iIGltcG9ydCBnbG9iCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKCgpkZWYgdHJhbnNsYXRlX3BhdHRlcm4oZ2xvYik6CiAgICAiIiIKICAgIFRyYW5zbGF0ZSBhIGZpbGUgcGF0aCBnbG9iIGxpa2UgJyoudHh0JyBpbiB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgIFRoaXMgZGlmZmVycyBmcm9tIGZubWF0Y2gudHJhbnNsYXRlIHdoaWNoIGFsbG93cyB3aWxkY2FyZHMgdG8gbWF0Y2gKICAgIGRpcmVjdG9yeSBzZXBhcmF0b3JzLiBJdCBhbHNvIGtub3dzIGFib3V0ICcqKi8nIHdoaWNoIG1hdGNoZXMgYW55IG51bWJlciBvZgogICAgZGlyZWN0b3JpZXMuCiAgICAiIiIKICAgIHBhdCA9ICcnCgogICAgIyBUaGlzIHdpbGwgc3BsaXQgb24gJy8nIHdpdGhpbiBbY2hhcmFjdGVyIGNsYXNzZXNdLiBUaGlzIGlzIGRlbGliZXJhdGUuCiAgICBjaHVua3MgPSBnbG9iLnNwbGl0KG9zLnBhdGguc2VwKQoKICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCiAgICB2YWxpZF9jaGFyID0gJ1teJXNdJyAlIChzZXAsKQoKICAgIGZvciBjLCBjaHVuayBpbiBlbnVtZXJhdGUoY2h1bmtzKToKICAgICAgICBsYXN0X2NodW5rID0gYyA9PSBsZW4oY2h1bmtzKSAtIDEKCiAgICAgICAgIyBDaHVua3MgdGhhdCBhcmUgYSBsaXRlcmFsICoqIGFyZSBnbG9ic3RhcnMuIFRoZXkgbWF0Y2ggYW55dGhpbmcuCiAgICAgICAgaWYgY2h1bmsgPT0gJyoqJzoKICAgICAgICAgICAgaWYgbGFzdF9jaHVuazoKICAgICAgICAgICAgICAgICMgTWF0Y2ggYW55dGhpbmcgaWYgdGhpcyBpcyB0aGUgbGFzdCBjb21wb25lbnQKICAgICAgICAgICAgICAgIHBhdCArPSAnLionCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE1hdGNoICcobmFtZS8pKicKICAgICAgICAgICAgICAgIHBhdCArPSAnKD86JXMrJXMpKicgJSAodmFsaWRfY2hhciwgc2VwKQogICAgICAgICAgICBjb250aW51ZSAgIyBCcmVhayBoZXJlIGFzIHRoZSB3aG9sZSBwYXRoIGNvbXBvbmVudCBoYXMgYmVlbiBoYW5kbGVkCgogICAgICAgICMgRmluZCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSByZW1haW5kZXIKICAgICAgICBpID0gMAogICAgICAgIGNodW5rX2xlbiA9IGxlbihjaHVuaykKICAgICAgICB3aGlsZSBpIDwgY2h1bmtfbGVuOgogICAgICAgICAgICBjaGFyID0gY2h1bmtbaV0KICAgICAgICAgICAgaWYgY2hhciA9PSAnKic6CiAgICAgICAgICAgICAgICAjIE1hdGNoIGFueSBudW1iZXIgb2YgbmFtZSBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICBwYXQgKz0gdmFsaWRfY2hhciArICcqJwogICAgICAgICAgICBlbGlmIGNoYXIgPT0gJz8nOgogICAgICAgICAgICAgICAgIyBNYXRjaCBhIG5hbWUgY2hhcmFjdGVyCiAgICAgICAgICAgICAgICBwYXQgKz0gdmFsaWRfY2hhcgogICAgICAgICAgICBlbGlmIGNoYXIgPT0gJ1snOgogICAgICAgICAgICAgICAgIyBDaGFyYWN0ZXIgY2xhc3MKICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpICsgMQogICAgICAgICAgICAgICAgIyBTa2lwIGluaXRpYWwgIS9dIGNoYXJzCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSA9PSAnISc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSA9PSAnXSc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCgogICAgICAgICAgICAgICAgIyBMb29wIHRpbGwgdGhlIGNsb3NpbmcgXSBpcyBmb3VuZAogICAgICAgICAgICAgICAgd2hpbGUgaW5uZXJfaSA8IGNodW5rX2xlbiBhbmQgY2h1bmtbaW5uZXJfaV0gIT0gJ10nOgogICAgICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpbm5lcl9pICsgMQoKICAgICAgICAgICAgICAgIGlmIGlubmVyX2kgPj0gY2h1bmtfbGVuOgogICAgICAgICAgICAgICAgICAgICMgR290IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyB3aXRob3V0IGZpbmRpbmcgYSBjbG9zaW5nIF0KICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCB0cmVhdCB0aGlzIGFzIGEgbWF0Y2hpbmcgZ3JvdXAsIGJ1dCBhcyBhIGxpdGVyYWwgWwogICAgICAgICAgICAgICAgICAgIHBhdCArPSByZS5lc2NhcGUoY2hhcikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBHcmFiIHRoZSBpbnNpZGVzIG9mIHRoZSBbYnJhY2tldHNdCiAgICAgICAgICAgICAgICAgICAgaW5uZXIgPSBjaHVua1tpICsgMTppbm5lcl9pXQogICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgPSAnJwoKICAgICAgICAgICAgICAgICAgICAjIENsYXNzIG5lZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgaWYgaW5uZXJbMF0gPT0gJyEnOgogICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2NsYXNzID0gJ14nCiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyID0gaW5uZXJbMTpdCgogICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgKz0gcmUuZXNjYXBlKGlubmVyKQogICAgICAgICAgICAgICAgICAgIHBhdCArPSAnWyVzXScgJSAoY2hhcl9jbGFzcywpCgogICAgICAgICAgICAgICAgICAgICMgU2tpcCB0byB0aGUgZW5kIF0KICAgICAgICAgICAgICAgICAgICBpID0gaW5uZXJfaQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0ICs9IHJlLmVzY2FwZShjaGFyKQogICAgICAgICAgICBpICs9IDEKCiAgICAgICAgIyBKb2luIGVhY2ggY2h1bmsgd2l0aCB0aGUgZGlyIHNlcGFyYXRvcgogICAgICAgIGlmIG5vdCBsYXN0X2NodW5rOgogICAgICAgICAgICBwYXQgKz0gc2VwCgogICAgcGF0ICs9IHInXFonCiAgICByZXR1cm4gcmUuY29tcGlsZShwYXQsIGZsYWdzPXJlLk1VTFRJTElORXxyZS5ET1RBTEwpCgoKY2xhc3MgZWdnX2luZm8oQ29tbWFuZCk6CiAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYSBkaXN0cmlidXRpb24ncyAuZWdnLWluZm8gZGlyZWN0b3J5IgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2VnZy1iYXNlPScsICdlJywgImRpcmVjdG9yeSBjb250YWluaW5nIC5lZ2ctaW5mbyBkaXJlY3RvcmllcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSkiKSwKICAgICAgICAoJ3RhZy1kYXRlJywgJ2QnLCAiQWRkIGRhdGUgc3RhbXAgKGUuZy4gMjAwNTA1MjgpIHRvIHZlcnNpb24gbnVtYmVyIiksCiAgICAgICAgKCd0YWctYnVpbGQ9JywgJ2InLCAiU3BlY2lmeSBleHBsaWNpdCB0YWcgdG8gYWRkIHRvIHZlcnNpb24gbnVtYmVyIiksCiAgICAgICAgKCduby1kYXRlJywgJ0QnLCAiRG9uJ3QgaW5jbHVkZSBkYXRlIHN0YW1wIFtkZWZhdWx0XSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsndGFnLWRhdGUnXQogICAgbmVnYXRpdmVfb3B0ID0gewogICAgICAgICduby1kYXRlJzogJ3RhZy1kYXRlJywKICAgIH0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZWdnX25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfdmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19iYXNlID0gTm9uZQogICAgICAgIHNlbGYuZWdnX2luZm8gPSBOb25lCiAgICAgICAgc2VsZi50YWdfYnVpbGQgPSBOb25lCiAgICAgICAgc2VsZi50YWdfZGF0ZSA9IDAKICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IEZhbHNlCiAgICAgICAgc2VsZi52dGFncyA9IE5vbmUKCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICMgYWxsb3cgdGhlICd0YWdfc3ZuX3JldmlzaW9uJyB0byBiZSBkZXRlY3RlZCBhbmQKICAgICMgc2V0LCBzdXBwb3J0aW5nIHNkaXN0cyBidWlsdCBvbiBvbGRlciBTZXR1cHRvb2xzLgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFnX3N2bl9yZXZpc2lvbihzZWxmKToKICAgICAgICBwYXNzCgogICAgQHRhZ19zdm5fcmV2aXNpb24uc2V0dGVyCiAgICBkZWYgdGFnX3N2bl9yZXZpc2lvbihzZWxmLCB2YWx1ZSk6CiAgICAgICAgcGFzcwogICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgZGVmIHNhdmVfdmVyc2lvbl9pbmZvKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICAiIiIKICAgICAgICBNYXRlcmlhbGl6ZSB0aGUgdmFsdWUgb2YgZGF0ZSBpbnRvIHRoZQogICAgICAgIGJ1aWxkIHRhZy4gSW5zdGFsbCBidWlsZCBrZXlzIGluIGEgZGV0ZXJtaW5pc3RpYyBvcmRlcgogICAgICAgIHRvIGF2b2lkIGFyYml0cmFyeSByZW9yZGVyaW5nIG9uIHN1YnNlcXVlbnQgYnVpbGRzLgogICAgICAgICIiIgogICAgICAgIGVnZ19pbmZvID0gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKQogICAgICAgICMgZm9sbG93IHRoZSBvcmRlciB0aGVzZSBrZXlzIHdvdWxkIGhhdmUgYmVlbiBhZGRlZAogICAgICAgICMgd2hlbiBQWVRIT05IQVNIU0VFRD0wCiAgICAgICAgZWdnX2luZm9bJ3RhZ19idWlsZCddID0gc2VsZi50YWdzKCkKICAgICAgICBlZ2dfaW5mb1sndGFnX2RhdGUnXSA9IDAKICAgICAgICBlZGl0X2NvbmZpZyhmaWxlbmFtZSwgZGljdChlZ2dfaW5mbz1lZ2dfaW5mbykpCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IHNhZmVfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKQogICAgICAgIHNlbGYudnRhZ3MgPSBzZWxmLnRhZ3MoKQogICAgICAgIHNlbGYuZWdnX3ZlcnNpb24gPSBzZWxmLnRhZ2dlZF92ZXJzaW9uKCkKCiAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYuZWdnX3ZlcnNpb24pCgogICAgICAgIHRyeToKICAgICAgICAgICAgaXNfdmVyc2lvbiA9IGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pCiAgICAgICAgICAgIHNwZWMgPSAoCiAgICAgICAgICAgICAgICAiJXM9PSVzIiBpZiBpc192ZXJzaW9uIGVsc2UgIiVzPT09JXMiCiAgICAgICAgICAgICkKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgIHBhcnNlX3JlcXVpcmVtZW50cyhzcGVjICUgKHNlbGYuZWdnX25hbWUsIHNlbGYuZWdnX3ZlcnNpb24pKQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiSW52YWxpZCBkaXN0cmlidXRpb24gbmFtZSBvciB2ZXJzaW9uIHN5bnRheDogJXMtJXMiICUKICAgICAgICAgICAgICAgIChzZWxmLmVnZ19uYW1lLCBzZWxmLmVnZ192ZXJzaW9uKQogICAgICAgICAgICApCgogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgaXMgTm9uZToKICAgICAgICAgICAgZGlycyA9IHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyCiAgICAgICAgICAgIHNlbGYuZWdnX2Jhc2UgPSAoZGlycyBvciB7fSkuZ2V0KCcnLCBvcy5jdXJkaXIpCgogICAgICAgIHNlbGYuZW5zdXJlX2Rpcm5hbWUoJ2VnZ19iYXNlJykKICAgICAgICBzZWxmLmVnZ19pbmZvID0gdG9fZmlsZW5hbWUoc2VsZi5lZ2dfbmFtZSkgKyAnLmVnZy1pbmZvJwogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2Jhc2UsIHNlbGYuZWdnX2luZm8pCiAgICAgICAgaWYgJy0nIGluIHNlbGYuZWdnX25hbWU6CiAgICAgICAgICAgIHNlbGYuY2hlY2tfYnJva2VuX2VnZ19pbmZvKCkKCiAgICAgICAgIyBTZXQgcGFja2FnZSB2ZXJzaW9uIGZvciB0aGUgYmVuZWZpdCBvZiBkdW1iZXIgY29tbWFuZHMKICAgICAgICAjIChlLmcuIHNkaXN0LCBiZGlzdF93aW5pbnN0LCBldGMuKQogICAgICAgICMKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS52ZXJzaW9uID0gc2VsZi5lZ2dfdmVyc2lvbgoKICAgICAgICAjIElmIHdlIGJvb3RzdHJhcHBlZCBhcm91bmQgdGhlIGxhY2sgb2YgYSBQS0ctSU5GTywgYXMgbWlnaHQgYmUgdGhlCiAgICAgICAgIyBjYXNlIGluIGEgZnJlc2ggY2hlY2tvdXQsIG1ha2Ugc3VyZSB0aGF0IGFueSBzcGVjaWFsIHRhZ3MgZ2V0IGFkZGVkCiAgICAgICAgIyB0byB0aGUgdmVyc2lvbiBpbmZvCiAgICAgICAgIwogICAgICAgIHBkID0gc2VsZi5kaXN0cmlidXRpb24uX3BhdGNoZWRfZGlzdAogICAgICAgIGlmIHBkIGlzIG5vdCBOb25lIGFuZCBwZC5rZXkgPT0gc2VsZi5lZ2dfbmFtZS5sb3dlcigpOgogICAgICAgICAgICBwZC5fdmVyc2lvbiA9IHNlbGYuZWdnX3ZlcnNpb24KICAgICAgICAgICAgcGQuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLmVnZ192ZXJzaW9uKQogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5fcGF0Y2hlZF9kaXN0ID0gTm9uZQoKICAgIGRlZiB3cml0ZV9vcl9kZWxldGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSwgZm9yY2U9RmFsc2UpOgogICAgICAgICIiIldyaXRlIGBkYXRhYCB0byBgZmlsZW5hbWVgIG9yIGRlbGV0ZSBpZiBlbXB0eQoKICAgICAgICBJZiBgZGF0YWAgaXMgbm9uLWVtcHR5LCB0aGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgYGB3cml0ZV9maWxlKClgYC4KICAgICAgICBJZiBgZGF0YWAgaXMgZW1wdHkgYnV0IG5vdCBgYE5vbmVgYCwgdGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nCiAgICAgICAgYGBkZWxldGVfZmlsZShmaWxlbmFtZSlgLiAgSWYgYGRhdGFgIGlzIGBgTm9uZWBgLCB0aGVuIHRoaXMgaXMgYSBuby1vcAogICAgICAgIHVubGVzcyBgZmlsZW5hbWVgIGV4aXN0cywgaW4gd2hpY2ggY2FzZSBhIHdhcm5pbmcgaXMgaXNzdWVkIGFib3V0IHRoZQogICAgICAgIG9ycGhhbmVkIGZpbGUgKGlmIGBmb3JjZWAgaXMgZmFsc2UpLCBvciBkZWxldGVkIChpZiBgZm9yY2VgIGlzIHRydWUpLgogICAgICAgICIiIgogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZSh3aGF0LCBmaWxlbmFtZSwgZGF0YSkKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lIGFuZCBub3QgZm9yY2U6CiAgICAgICAgICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgICAgICAgICAiJXMgbm90IHNldCBpbiBzZXR1cCgpLCBidXQgJXMgZXhpc3RzIiwgd2hhdCwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5kZWxldGVfZmlsZShmaWxlbmFtZSkKCiAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSk6CiAgICAgICAgIiIiV3JpdGUgYGRhdGFgIHRvIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQKCiAgICAgICAgYHdoYXRgIGlzIHVzZWQgaW4gYSBsb2cgbWVzc2FnZSB0byBpZGVudGlmeSB3aGF0IGlzIGJlaW5nIHdyaXR0ZW4KICAgICAgICB0byB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBsb2cuaW5mbygid3JpdGluZyAlcyB0byAlcyIsIHdoYXQsIGZpbGVuYW1lKQogICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZSgidXRmLTgiKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQogICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIGRlZiBkZWxldGVfZmlsZShzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiRGVsZXRlIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQiIiIKICAgICAgICBsb2cuaW5mbygiZGVsZXRpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCgogICAgZGVmIHRhZ2dlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCiAgICAgICAgIyBlZ2dfaW5mbyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciBhIGRpc3RyaWJ1dGlvbiwKICAgICAgICAjIGluIHdoaWNoIGNhc2UgdGhlIHZlcnNpb24gc3RyaW5nIGFscmVhZHkgY29udGFpbnMgYWxsIHRhZ3MuCiAgICAgICAgaWYgc2VsZi52dGFncyBhbmQgdmVyc2lvbi5lbmRzd2l0aChzZWxmLnZ0YWdzKToKICAgICAgICAgICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmVyc2lvbiArIHNlbGYudnRhZ3MpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmVnZ19pbmZvKQogICAgICAgIGluc3RhbGxlciA9IHNlbGYuZGlzdHJpYnV0aW9uLmZldGNoX2J1aWxkX2VnZwogICAgICAgIGZvciBlcCBpbiBpdGVyX2VudHJ5X3BvaW50cygnZWdnX2luZm8ud3JpdGVycycpOgogICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1pbnN0YWxsZXIpCiAgICAgICAgICAgIHdyaXRlciA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICB3cml0ZXIoc2VsZiwgZXAubmFtZSwgb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sIGVwLm5hbWUpKQoKICAgICAgICAjIEdldCByaWQgb2YgbmF0aXZlX2xpYnMudHh0IGlmIGl0IHdhcyBwdXQgdGhlcmUgYnkgb2xkZXIgYmRpc3RfZWdnCiAgICAgICAgbmwgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgIm5hdGl2ZV9saWJzLnR4dCIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmwpOgogICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKG5sKQoKICAgICAgICBzZWxmLmZpbmRfc291cmNlcygpCgogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgdmVyc2lvbiA9ICcnCiAgICAgICAgaWYgc2VsZi50YWdfYnVpbGQ6CiAgICAgICAgICAgIHZlcnNpb24gKz0gc2VsZi50YWdfYnVpbGQKICAgICAgICBpZiBzZWxmLnRhZ19kYXRlOgogICAgICAgICAgICB2ZXJzaW9uICs9IHRpbWUuc3RyZnRpbWUoIi0lWSVtJWQiKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIGZpbmRfc291cmNlcyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBTT1VSQ0VTLnR4dCBtYW5pZmVzdCBmaWxlIiIiCiAgICAgICAgbWFuaWZlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgIlNPVVJDRVMudHh0IikKICAgICAgICBtbSA9IG1hbmlmZXN0X21ha2VyKHNlbGYuZGlzdHJpYnV0aW9uKQogICAgICAgIG1tLm1hbmlmZXN0ID0gbWFuaWZlc3RfZmlsZW5hbWUKICAgICAgICBtbS5ydW4oKQogICAgICAgIHNlbGYuZmlsZWxpc3QgPSBtbS5maWxlbGlzdAoKICAgIGRlZiBjaGVja19icm9rZW5fZWdnX2luZm8oc2VsZik6CiAgICAgICAgYmVpID0gc2VsZi5lZ2dfbmFtZSArICcuZWdnLWluZm8nCiAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSAhPSBvcy5jdXJkaXI6CiAgICAgICAgICAgIGJlaSA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19iYXNlLCBiZWkpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoYmVpKToKICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAiLSIgKiA3OCArICdcbicKICAgICAgICAgICAgICAgICJOb3RlOiBZb3VyIGN1cnJlbnQgLmVnZy1pbmZvIGRpcmVjdG9yeSBoYXMgYSAnLScgaW4gaXRzIG5hbWU7IgogICAgICAgICAgICAgICAgJ1xudGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSB3aXRoICJzZXR1cC5weSBkZXZlbG9wIi5cblxuJwogICAgICAgICAgICAgICAgJ1BsZWFzZSByZW5hbWUgJXMgdG8gJXMgdG8gY29ycmVjdCB0aGlzIHByb2JsZW0uXG4nICsgJy0nICogNzgsCiAgICAgICAgICAgICAgICBiZWksIHNlbGYuZWdnX2luZm8KICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IHNlbGYuZWdnX2luZm8KICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGJlaSAgIyBtYWtlIGl0IHdvcmsgZm9yIG5vdwoKCmNsYXNzIEZpbGVMaXN0KF9GaWxlTGlzdCk6CiAgICAjIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgdmFyaW91cyBNQU5JRkVTVC5pbiBjb21tYW5kcwoKICAgIGRlZiBwcm9jZXNzX3RlbXBsYXRlX2xpbmUoc2VsZiwgbGluZSk6CiAgICAgICAgIyBQYXJzZSB0aGUgbGluZTogc3BsaXQgaXQgdXAsIG1ha2Ugc3VyZSB0aGUgcmlnaHQgbnVtYmVyIG9mIHdvcmRzCiAgICAgICAgIyBpcyB0aGVyZSwgYW5kIHJldHVybiB0aGUgcmVsZXZhbnQgd29yZHMuICAnYWN0aW9uJyBpcyBhbHdheXMKICAgICAgICAjIGRlZmluZWQ6IGl0J3MgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGxpbmUuICBXaGljaCBvZiB0aGUgb3RoZXIKICAgICAgICAjIHRocmVlIGFyZSBkZWZpbmVkIGRlcGVuZHMgb24gdGhlIGFjdGlvbjsgaXQnbGwgYmUgZWl0aGVyCiAgICAgICAgIyBwYXR0ZXJucywgKGRpciBhbmQgcGF0dGVybnMpLCBvciAoZGlyX3BhdHRlcm4pLgogICAgICAgIChhY3Rpb24sIHBhdHRlcm5zLCBkaXIsIGRpcl9wYXR0ZXJuKSA9IHNlbGYuX3BhcnNlX3RlbXBsYXRlX2xpbmUobGluZSkKCiAgICAgICAgIyBPSywgbm93IHdlIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIHZhbGlkIGFuZCB3ZSBoYXZlIHRoZQogICAgICAgICMgcmlnaHQgbnVtYmVyIG9mIHdvcmRzIG9uIHRoZSBsaW5lIGZvciB0aGF0IGFjdGlvbiAtLSBzbyB3ZQogICAgICAgICMgY2FuIHByb2NlZWQgd2l0aCBtaW5pbWFsIGVycm9yLWNoZWNraW5nLgogICAgICAgIGlmIGFjdGlvbiA9PSAnaW5jbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImluY2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pbmNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiBubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAnJXMnIiwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2V4Y2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJleGNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgbWF0Y2hpbmcgJyVzJyIpLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ2xvYmFsLWluY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJnbG9iYWwtaW5jbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdsb2JhbF9pbmNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnl3aGVyZSBpbiBkaXN0cmlidXRpb24iKSwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1leGNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZ2xvYmFsLWV4Y2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5nbG9iYWxfZXhjbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgbWF0Y2hpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBmb3VuZCBhbnl3aGVyZSBpbiBkaXN0cmlidXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWluY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJyZWN1cnNpdmUtaW5jbHVkZSAlcyAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXIsICcgJy5qb2luKHBhdHRlcm5zKSkpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlX2luY2x1ZGUoZGlyLCBwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcycgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5kZXIgZGlyZWN0b3J5ICclcyciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCBkaXIpCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdyZWN1cnNpdmUtZXhjbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInJlY3Vyc2l2ZS1leGNsdWRlICVzICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpciwgJyAnLmpvaW4ocGF0dGVybnMpKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWN1cnNpdmVfZXhjbHVkZShkaXIsIHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyBtYXRjaGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAnJXMnIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ3JhZnQnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJncmFmdCAiICsgZGlyX3BhdHRlcm4pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdyYWZ0KGRpcl9wYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiBubyBkaXJlY3RvcmllcyBmb3VuZCBtYXRjaGluZyAnJXMnIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9wYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncHJ1bmUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJwcnVuZSAiICsgZGlyX3BhdHRlcm4pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBydW5lKGRpcl9wYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCgibm8gcHJldmlvdXNseS1pbmNsdWRlZCBkaXJlY3RvcmllcyBmb3VuZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoaW5nICclcyciKSwgZGlyX3BhdHRlcm4pCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ludGVybmFsRXJyb3IoCiAgICAgICAgICAgICAgICAidGhpcyBjYW5ub3QgaGFwcGVuOiBpbnZhbGlkIGFjdGlvbiAnJXMnIiAlIGFjdGlvbikKCiAgICBkZWYgX3JlbW92ZV9maWxlcyhzZWxmLCBwcmVkaWNhdGUpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhbGwgZmlsZXMgZnJvbSB0aGUgZmlsZSBsaXN0IHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZS4KICAgICAgICBSZXR1cm4gVHJ1ZSBpZiBhbnkgbWF0Y2hpbmcgZmlsZXMgd2VyZSByZW1vdmVkCiAgICAgICAgIiIiCiAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZpbGVzKSAtIDEsIC0xLCAtMSk6CiAgICAgICAgICAgIGlmIHByZWRpY2F0ZShzZWxmLmZpbGVzW2ldKToKICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoIiByZW1vdmluZyAiICsgc2VsZi5maWxlc1tpXSkKICAgICAgICAgICAgICAgIGRlbCBzZWxmLmZpbGVzW2ldCiAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICByZXR1cm4gZm91bmQKCiAgICBkZWYgaW5jbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiJJbmNsdWRlIGZpbGVzIHRoYXQgbWF0Y2ggJ3BhdHRlcm4nLiIiIgogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gZ2xvYihwYXR0ZXJuKSBpZiBub3Qgb3MucGF0aC5pc2RpcihmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgZXhjbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiJFeGNsdWRlIGZpbGVzIHRoYXQgbWF0Y2ggJ3BhdHRlcm4nLiIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybikKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiByZWN1cnNpdmVfaW5jbHVkZShzZWxmLCBkaXIsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEluY2x1ZGUgYWxsIGZpbGVzIGFueXdoZXJlIGluICdkaXIvJyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLgogICAgICAgICIiIgogICAgICAgIGZ1bGxfcGF0dGVybiA9IG9zLnBhdGguam9pbihkaXIsICcqKicsIHBhdHRlcm4pCiAgICAgICAgZm91bmQgPSBbZiBmb3IgZiBpbiBnbG9iKGZ1bGxfcGF0dGVybiwgcmVjdXJzaXZlPVRydWUpCiAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZildCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIHJlY3Vyc2l2ZV9leGNsdWRlKHNlbGYsIGRpciwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgRXhjbHVkZSBhbnkgZmlsZSBhbnl3aGVyZSBpbiAnZGlyLycgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbihkaXIsICcqKicsIHBhdHRlcm4pKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIGdyYWZ0KHNlbGYsIGRpcik6CiAgICAgICAgIiIiSW5jbHVkZSBhbGwgZmlsZXMgZnJvbSAnZGlyLycuIiIiCiAgICAgICAgZm91bmQgPSBbCiAgICAgICAgICAgIGl0ZW0KICAgICAgICAgICAgZm9yIG1hdGNoX2RpciBpbiBnbG9iKGRpcikKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZGlzdHV0aWxzLmZpbGVsaXN0LmZpbmRhbGwobWF0Y2hfZGlyKQogICAgICAgIF0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgcHJ1bmUoc2VsZiwgZGlyKToKICAgICAgICAiIiJGaWx0ZXIgb3V0IGZpbGVzIGZyb20gJ2Rpci8nLiIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKGRpciwgJyoqJykpCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgZ2xvYmFsX2luY2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgSW5jbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgbWF0Y2ggdGhlCiAgICAgICAgcGF0dGVybi4gVGhpcyBpcyB2ZXJ5IGluZWZmaWNpZW50IG9uIGxhcmdlIGZpbGUgdHJlZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5hbGxmaWxlcyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmZpbmRhbGwoKQogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKCcqKicsIHBhdHRlcm4pKQogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gc2VsZi5hbGxmaWxlcyBpZiBtYXRjaC5tYXRjaChmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgZ2xvYmFsX2V4Y2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgRXhjbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbignKionLCBwYXR0ZXJuKSkKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6CiAgICAgICAgaWYgaXRlbS5lbmRzd2l0aCgnXHInKTogICMgRml4IG9sZGVyIHNkaXN0cyBidWlsdCBvbiBXaW5kb3dzCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtWzotMV0KICAgICAgICBwYXRoID0gY29udmVydF9wYXRoKGl0ZW0pCgogICAgICAgIGlmIHNlbGYuX3NhZmVfcGF0aChwYXRoKToKICAgICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQocGF0aCkKCiAgICBkZWYgZXh0ZW5kKHNlbGYsIHBhdGhzKToKICAgICAgICBzZWxmLmZpbGVzLmV4dGVuZChmaWx0ZXIoc2VsZi5fc2FmZV9wYXRoLCBwYXRocykpCgogICAgZGVmIF9yZXBhaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZSBzZWxmLmZpbGVzIHdpdGggb25seSBzYWZlIHBhdGhzCgogICAgICAgIEJlY2F1c2Ugc29tZSBvd25lcnMgb2YgRmlsZUxpc3QgbWFuaXB1bGF0ZSB0aGUgdW5kZXJseWluZwogICAgICAgIGBgZmlsZXNgYCBhdHRyaWJ1dGUgZGlyZWN0bHksIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHRvCiAgICAgICAgcmVwYWlyIHRob3NlIHBhdGhzLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsZXMgPSBsaXN0KGZpbHRlcihzZWxmLl9zYWZlX3BhdGgsIHNlbGYuZmlsZXMpKQoKICAgIGRlZiBfc2FmZV9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIGVuY193YXJuID0gIiclcycgbm90ICVzIGVuY29kYWJsZSAtLSBza2lwcGluZyIKCiAgICAgICAgIyBUbyBhdm9pZCBhY2NpZGVudGFsIHRyYW5zLWNvZGluZ3MgZXJyb3JzLCBmaXJzdCB0byB1bmljb2RlCiAgICAgICAgdV9wYXRoID0gdW5pY29kZV91dGlscy5maWxlc3lzX2RlY29kZShwYXRoKQogICAgICAgIGlmIHVfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBsb2cud2FybigiJyVzJyBpbiB1bmV4cGVjdGVkIGVuY29kaW5nIC0tIHNraXBwaW5nIiAlIHBhdGgpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIE11c3QgZW5zdXJlIHV0Zi04IGVuY29kYWJpbGl0eQogICAgICAgIHV0ZjhfcGF0aCA9IHVuaWNvZGVfdXRpbHMudHJ5X2VuY29kZSh1X3BhdGgsICJ1dGYtOCIpCiAgICAgICAgaWYgdXRmOF9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy53YXJuKGVuY193YXJuLCBwYXRoLCAndXRmLTgnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGFjY2VwdCBpcyBlaXRoZXIgd2F5IGNoZWNrcyBvdXQKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModV9wYXRoKSBvciBvcy5wYXRoLmV4aXN0cyh1dGY4X3BhdGgpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAjIHRoaXMgd2lsbCBjYXRjaCBhbnkgZW5jb2RlIGVycm9ycyBkZWNvZGluZyB1X3BhdGgKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICBsb2cud2FybihlbmNfd2FybiwgcGF0aCwgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQoKCmNsYXNzIG1hbmlmZXN0X21ha2VyKHNkaXN0KToKICAgIHRlbXBsYXRlID0gIk1BTklGRVNULmluIgoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi51c2VfZGVmYXVsdHMgPSAxCiAgICAgICAgc2VsZi5wcnVuZSA9IDEKICAgICAgICBzZWxmLm1hbmlmZXN0X29ubHkgPSAxCiAgICAgICAgc2VsZi5mb3JjZV9tYW5pZmVzdCA9IDEKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLmZpbGVsaXN0ID0gRmlsZUxpc3QoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLm1hbmlmZXN0KToKICAgICAgICAgICAgc2VsZi53cml0ZV9tYW5pZmVzdCgpICAjIGl0IG11c3QgZXhpc3Qgc28gaXQnbGwgZ2V0IGluIHRoZSBsaXN0CiAgICAgICAgc2VsZi5hZGRfZGVmYXVsdHMoKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGVtcGxhdGUpOgogICAgICAgICAgICBzZWxmLnJlYWRfdGVtcGxhdGUoKQogICAgICAgIHNlbGYucHJ1bmVfZmlsZV9saXN0KCkKICAgICAgICBzZWxmLmZpbGVsaXN0LnNvcnQoKQogICAgICAgIHNlbGYuZmlsZWxpc3QucmVtb3ZlX2R1cGxpY2F0ZXMoKQogICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKQoKICAgIGRlZiBfbWFuaWZlc3Rfbm9ybWFsaXplKHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSB1bmljb2RlX3V0aWxzLmZpbGVzeXNfZGVjb2RlKHBhdGgpCiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZShvcy5zZXAsICcvJykKCiAgICBkZWYgd3JpdGVfbWFuaWZlc3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGUgdGhlIGZpbGUgbGlzdCBpbiAnc2VsZi5maWxlbGlzdCcgdG8gdGhlIG1hbmlmZXN0IGZpbGUKICAgICAgICBuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5maWxlbGlzdC5fcmVwYWlyKCkKCiAgICAgICAgIyBOb3cgX3JlcGFpcnMgc2hvdWxkIGVuY29kYWJpbGl0eSwgYnV0IG5vdCB1bmljb2RlCiAgICAgICAgZmlsZXMgPSBbc2VsZi5fbWFuaWZlc3Rfbm9ybWFsaXplKGYpIGZvciBmIGluIHNlbGYuZmlsZWxpc3QuZmlsZXNdCiAgICAgICAgbXNnID0gIndyaXRpbmcgbWFuaWZlc3QgZmlsZSAnJXMnIiAlIHNlbGYubWFuaWZlc3QKICAgICAgICBzZWxmLmV4ZWN1dGUod3JpdGVfZmlsZSwgKHNlbGYubWFuaWZlc3QsIGZpbGVzKSwgbXNnKQoKICAgIGRlZiB3YXJuKHNlbGYsIG1zZyk6CiAgICAgICAgaWYgbm90IHNlbGYuX3Nob3VsZF9zdXBwcmVzc193YXJuaW5nKG1zZyk6CiAgICAgICAgICAgIHNkaXN0Lndhcm4oc2VsZiwgbXNnKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc2hvdWxkX3N1cHByZXNzX3dhcm5pbmcobXNnKToKICAgICAgICAiIiIKICAgICAgICBzdXBwcmVzcyBtaXNzaW5nLWZpbGUgd2FybmluZ3MgZnJvbSBzZGlzdAogICAgICAgICIiIgogICAgICAgIHJldHVybiByZS5tYXRjaChyInN0YW5kYXJkIGZpbGUgLipub3QgZm91bmQiLCBtc2cpCgogICAgZGVmIGFkZF9kZWZhdWx0cyhzZWxmKToKICAgICAgICBzZGlzdC5hZGRfZGVmYXVsdHMoc2VsZikKICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChzZWxmLnRlbXBsYXRlKQogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHNlbGYubWFuaWZlc3QpCiAgICAgICAgcmNmaWxlcyA9IGxpc3Qod2Fsa19yZXZjdHJsKCkpCiAgICAgICAgaWYgcmNmaWxlczoKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQocmNmaWxlcykKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICBzZWxmLnJlYWRfbWFuaWZlc3QoKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgc2VsZi5maWxlbGlzdC5ncmFmdChlaV9jbWQuZWdnX2luZm8pCgogICAgZGVmIHBydW5lX2ZpbGVfbGlzdChzZWxmKToKICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCiAgICAgICAgYmFzZV9kaXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQogICAgICAgIHNlbGYuZmlsZWxpc3QucHJ1bmUoYnVpbGQuYnVpbGRfYmFzZSkKICAgICAgICBzZWxmLmZpbGVsaXN0LnBydW5lKGJhc2VfZGlyKQogICAgICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCiAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4ocicoXnwnICsgc2VwICsgcicpKFJDU3xDVlN8XC5zdm4pJyArIHNlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdleD0xKQoKCmRlZiB3cml0ZV9maWxlKGZpbGVuYW1lLCBjb250ZW50cyk6CiAgICAiIiJDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB3cml0ZSAnY29udGVudHMnIChhCiAgICBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdpdGhvdXQgbGluZSB0ZXJtaW5hdG9ycykgdG8gaXQuCiAgICAiIiIKICAgIGNvbnRlbnRzID0gIlxuIi5qb2luKGNvbnRlbnRzKQoKICAgICMgYXNzdW1pbmcgdGhlIGNvbnRlbnRzIGhhcyBiZWVuIHZldHRlZCBmb3IgdXRmLTggZW5jb2RpbmcKICAgIGNvbnRlbnRzID0gY29udGVudHMuZW5jb2RlKCJ1dGYtOCIpCgogICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAid2IiKSBhcyBmOiAgIyBhbHdheXMgd3JpdGUgUE9TSVgtc3R5bGUgbWFuaWZlc3QKICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQoKCmRlZiB3cml0ZV9wa2dfaW5mbyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBsb2cuaW5mbygid3JpdGluZyAlcyIsIGZpbGVuYW1lKQogICAgaWYgbm90IGNtZC5kcnlfcnVuOgogICAgICAgIG1ldGFkYXRhID0gY21kLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQogICAgICAgIG1ldGFkYXRhLnZlcnNpb24sIG9sZHZlciA9IGNtZC5lZ2dfdmVyc2lvbiwgbWV0YWRhdGEudmVyc2lvbgogICAgICAgIG1ldGFkYXRhLm5hbWUsIG9sZG5hbWUgPSBjbWQuZWdnX25hbWUsIG1ldGFkYXRhLm5hbWUKICAgICAgICBtZXRhZGF0YS5sb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZSA9IGdldGF0dHIoCiAgICAgICAgICAgIGNtZC5kaXN0cmlidXRpb24sCiAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZScKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIHdyaXRlIHVuZXNjYXBlZCBkYXRhIHRvIFBLRy1JTkZPLCBzbyBvbGRlciBwa2dfcmVzb3VyY2VzCiAgICAgICAgICAgICMgY2FuIHN0aWxsIHBhcnNlIGl0CiAgICAgICAgICAgIG1ldGFkYXRhLndyaXRlX3BrZ19pbmZvKGNtZC5lZ2dfaW5mbykKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uID0gb2xkbmFtZSwgb2xkdmVyCgogICAgICAgIHNhZmUgPSBnZXRhdHRyKGNtZC5kaXN0cmlidXRpb24sICd6aXBfc2FmZScsIE5vbmUpCgogICAgICAgIGJkaXN0X2VnZy53cml0ZV9zYWZldHlfZmxhZyhjbWQuZWdnX2luZm8sIHNhZmUpCgoKZGVmIHdhcm5fZGVwZW5kc19vYnNvbGV0ZShjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIGlzIG5vdCB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgogICAgICAgICAgICAiVXNlIHRoZSBpbnN0YWxsX3JlcXVpcmVzL2V4dHJhc19yZXF1aXJlIHNldHVwKCkgYXJncyBpbnN0ZWFkLiIKICAgICAgICApCgoKZGVmIF93cml0ZV9yZXF1aXJlbWVudHMoc3RyZWFtLCByZXFzKToKICAgIGxpbmVzID0geWllbGRfbGluZXMocmVxcyBvciAoKSkKICAgIGFwcGVuZF9jciA9IGxhbWJkYSBsaW5lOiBsaW5lICsgJ1xuJwogICAgbGluZXMgPSBtYXAoYXBwZW5kX2NyLCBsaW5lcykKICAgIHN0cmVhbS53cml0ZWxpbmVzKGxpbmVzKQoKCmRlZiB3cml0ZV9yZXF1aXJlbWVudHMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgZGlzdCA9IGNtZC5kaXN0cmlidXRpb24KICAgIGRhdGEgPSBzaXguU3RyaW5nSU8oKQogICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBkaXN0Lmluc3RhbGxfcmVxdWlyZXMpCiAgICBleHRyYXNfcmVxdWlyZSA9IGRpc3QuZXh0cmFzX3JlcXVpcmUgb3Ige30KICAgIGZvciBleHRyYSBpbiBzb3J0ZWQoZXh0cmFzX3JlcXVpcmUpOgogICAgICAgIGRhdGEud3JpdGUoJ1xuW3tleHRyYX1dXG4nLmZvcm1hdCgqKnZhcnMoKSkpCiAgICAgICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBleHRyYXNfcmVxdWlyZVtleHRyYV0pCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoInJlcXVpcmVtZW50cyIsIGZpbGVuYW1lLCBkYXRhLmdldHZhbHVlKCkpCgoKZGVmIHdyaXRlX3NldHVwX3JlcXVpcmVtZW50cyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBkYXRhID0gaW8uU3RyaW5nSU8oKQogICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBjbWQuZGlzdHJpYnV0aW9uLnNldHVwX3JlcXVpcmVzKQogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCJzZXR1cC1yZXF1aXJlbWVudHMiLCBmaWxlbmFtZSwgZGF0YS5nZXR2YWx1ZSgpKQoKCmRlZiB3cml0ZV90b3BsZXZlbF9uYW1lcyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBwa2dzID0gZGljdC5mcm9ta2V5cygKICAgICAgICBbCiAgICAgICAgICAgIGsuc3BsaXQoJy4nLCAxKVswXQogICAgICAgICAgICBmb3IgayBpbiBjbWQuZGlzdHJpYnV0aW9uLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCkKICAgICAgICBdCiAgICApCiAgICBjbWQud3JpdGVfZmlsZSgidG9wLWxldmVsIG5hbWVzIiwgZmlsZW5hbWUsICdcbicuam9pbihzb3J0ZWQocGtncykpICsgJ1xuJykKCgpkZWYgb3ZlcndyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICB3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUsIFRydWUpCgoKZGVmIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgZm9yY2U9RmFsc2UpOgogICAgYXJnbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpWzBdCiAgICB2YWx1ZSA9IGdldGF0dHIoY21kLmRpc3RyaWJ1dGlvbiwgYXJnbmFtZSwgTm9uZSkKICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgIHZhbHVlID0gJ1xuJy5qb2luKHZhbHVlKSArICdcbicKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZShhcmduYW1lLCBmaWxlbmFtZSwgdmFsdWUsIGZvcmNlKQoKCmRlZiB3cml0ZV9lbnRyaWVzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGVwID0gY21kLmRpc3RyaWJ1dGlvbi5lbnRyeV9wb2ludHMKCiAgICBpZiBpc2luc3RhbmNlKGVwLCBzaXguc3RyaW5nX3R5cGVzKSBvciBlcCBpcyBOb25lOgogICAgICAgIGRhdGEgPSBlcAogICAgZWxpZiBlcCBpcyBub3QgTm9uZToKICAgICAgICBkYXRhID0gW10KICAgICAgICBmb3Igc2VjdGlvbiwgY29udGVudHMgaW4gc29ydGVkKGVwLml0ZW1zKCkpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb250ZW50cywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBjb250ZW50cyA9IEVudHJ5UG9pbnQucGFyc2VfZ3JvdXAoc2VjdGlvbiwgY29udGVudHMpCiAgICAgICAgICAgICAgICBjb250ZW50cyA9ICdcbicuam9pbihzb3J0ZWQobWFwKHN0ciwgY29udGVudHMudmFsdWVzKCkpKSkKICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ1slc11cbiVzXG5cbicgJSAoc2VjdGlvbiwgY29udGVudHMpKQogICAgICAgIGRhdGEgPSAnJy5qb2luKGRhdGEpCgogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCdlbnRyeSBwb2ludHMnLCBmaWxlbmFtZSwgZGF0YSwgVHJ1ZSkKCgpkZWYgZ2V0X3BrZ19pbmZvX3JldmlzaW9uKCk6CiAgICAiIiIKICAgIEdldCBhIC1yIyMjIG9mZiBvZiBQS0ctSU5GTyBWZXJzaW9uIGluIGNhc2UgdGhpcyBpcyBhbiBzZGlzdCBvZgogICAgYSBzdWJ2ZXJzaW9uIHJldmlzaW9uLgogICAgIiIiCiAgICB3YXJuaW5ncy53YXJuKCJnZXRfcGtnX2luZm9fcmV2aXNpb24gaXMgZGVwcmVjYXRlZC4iLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICBpZiBvcy5wYXRoLmV4aXN0cygnUEtHLUlORk8nKToKICAgICAgICB3aXRoIGlvLm9wZW4oJ1BLRy1JTkZPJykgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gociJWZXJzaW9uOi4qLXIoXGQrKVxzKiQiLCBsaW5lKQogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludChtYXRjaC5ncm91cCgxKSkKICAgIHJldHVybiAwClBLAwQUAAAAAAAAACEAjdu1P0sSAABLEgAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzQXJnRXJyb3IKaW1wb3J0IGluc3BlY3QKaW1wb3J0IGdsb2IKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBhcyBvcmlnCgppbXBvcnQgc2V0dXB0b29scwoKIyBQcmlvciB0byBudW1weSAxLjksIE51bVB5IHJlbGllcyBvbiB0aGUgJ19pbnN0YWxsJyBuYW1lLCBzbyBwcm92aWRlIGl0IGZvcgojIG5vdy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzE5OS8KX2luc3RhbGwgPSBvcmlnLmluc3RhbGwKCgpjbGFzcyBpbnN0YWxsKG9yaWcuaW5zdGFsbCk6CiAgICAiIiJVc2UgZWFzeV9pbnN0YWxsIHRvIGluc3RhbGwgdGhlIHBhY2thZ2UsIHcvZGVwZW5kZW5jaWVzIiIiCgogICAgdXNlcl9vcHRpb25zID0gb3JpZy5pbnN0YWxsLnVzZXJfb3B0aW9ucyArIFsKICAgICAgICAoJ29sZC1hbmQtdW5tYW5hZ2VhYmxlJywgTm9uZSwgIlRyeSBub3QgdG8gdXNlIHRoaXMhIiksCiAgICAgICAgKCdzaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQnLCBOb25lLAogICAgICAgICAidXNlZCBieSBzeXN0ZW0gcGFja2FnZSBidWlsZGVycyB0byBjcmVhdGUgJ2ZsYXQnIGVnZ3MiKSwKICAgIF0KICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9yaWcuaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbCiAgICAgICAgJ29sZC1hbmQtdW5tYW5hZ2VhYmxlJywgJ3NpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCcsCiAgICBdCiAgICBuZXdfY29tbWFuZHMgPSBbCiAgICAgICAgKCdpbnN0YWxsX2VnZ19pbmZvJywgbGFtYmRhIHNlbGY6IFRydWUpLAogICAgICAgICgnaW5zdGFsbF9zY3JpcHRzJywgbGFtYmRhIHNlbGY6IFRydWUpLAogICAgXQogICAgX25jID0gZGljdChuZXdfY29tbWFuZHMpCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmluc3RhbGwuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5vbGRfYW5kX3VubWFuYWdlYWJsZSA9IE5vbmUKICAgICAgICBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmluc3RhbGwuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYucm9vdDoKICAgICAgICAgICAgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgPSBUcnVlCiAgICAgICAgZWxpZiBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKICAgICAgICAgICAgaWYgbm90IHNlbGYucm9vdCBhbmQgbm90IHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgLS1yZWNvcmQgb3IgLS1yb290IHdoZW4gYnVpbGRpbmcgc3lzdGVtIgogICAgICAgICAgICAgICAgICAgICIgcGFja2FnZXMiCiAgICAgICAgICAgICAgICApCgogICAgZGVmIGhhbmRsZV9leHRyYV9wYXRoKHNlbGYpOgogICAgICAgIGlmIHNlbGYucm9vdCBvciBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKICAgICAgICAgICAgIyBleHBsaWNpdCBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IG1vZGUsIGFsbG93IGV4dHJhX3BhdGggdG8gd29yawogICAgICAgICAgICByZXR1cm4gb3JpZy5pbnN0YWxsLmhhbmRsZV9leHRyYV9wYXRoKHNlbGYpCgogICAgICAgICMgSWdub3JlIGV4dHJhX3BhdGggd2hlbiBpbnN0YWxsaW5nIGFuIGVnZyAob3IgYmVpbmcgcnVuIGJ5IGFub3RoZXIKICAgICAgICAjIGNvbW1hbmQgd2l0aG91dCAtLXJvb3Qgb3IgLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQKICAgICAgICBzZWxmLnBhdGhfZmlsZSA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhX2RpcnMgPSAnJwoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBFeHBsaWNpdCByZXF1ZXN0IGZvciBvbGQtc3R5bGUgaW5zdGFsbD8gIEp1c3QgZG8gaXQKICAgICAgICBpZiBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlIG9yIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgogICAgICAgICAgICByZXR1cm4gb3JpZy5pbnN0YWxsLnJ1bihzZWxmKQoKICAgICAgICBpZiBub3Qgc2VsZi5fY2FsbGVkX2Zyb21fc2V0dXAoaW5zcGVjdC5jdXJyZW50ZnJhbWUoKSk6CiAgICAgICAgICAgICMgUnVuIGluIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgbW9kZSB0byBzdXBwb3J0IGJkaXN0XyogY29tbWFuZHMuCiAgICAgICAgICAgIG9yaWcuaW5zdGFsbC5ydW4oc2VsZikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmRvX2VnZ19pbnN0YWxsKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NhbGxlZF9mcm9tX3NldHVwKHJ1bl9mcmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgQXR0ZW1wdCB0byBkZXRlY3Qgd2hldGhlciBydW4oKSB3YXMgY2FsbGVkIGZyb20gc2V0dXAoKSBvciBieSBhbm90aGVyCiAgICAgICAgY29tbWFuZC4gIElmIGNhbGxlZCBieSBzZXR1cCgpLCB0aGUgcGFyZW50IGNhbGxlciB3aWxsIGJlIHRoZQogICAgICAgICdydW5fY29tbWFuZCcgbWV0aG9kIGluICdkaXN0dXRpbHMuZGlzdCcsIGFuZCAqaXRzKiBjYWxsZXIgd2lsbCBiZQogICAgICAgIHRoZSAncnVuX2NvbW1hbmRzJyBtZXRob2QuICBJZiBjYWxsZWQgYW55IG90aGVyIHdheSwgdGhlCiAgICAgICAgaW1tZWRpYXRlIGNhbGxlciAqbWlnaHQqIGJlICdydW5fY29tbWFuZCcsIGJ1dCBpdCB3b24ndCBoYXZlIGJlZW4KICAgICAgICBjYWxsZWQgYnkgJ3J1bl9jb21tYW5kcycuIFJldHVybiBUcnVlIGluIHRoYXQgY2FzZSBvciBpZiBhIGNhbGwgc3RhY2sKICAgICAgICBpcyB1bmF2YWlsYWJsZS4gUmV0dXJuIEZhbHNlIG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICBpZiBydW5fZnJhbWUgaXMgTm9uZToKICAgICAgICAgICAgbXNnID0gIkNhbGwgc3RhY2sgbm90IGF2YWlsYWJsZS4gYmRpc3RfKiBjb21tYW5kcyBtYXkgZmFpbC4iCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQogICAgICAgICAgICBpZiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSA9PSAnSXJvblB5dGhvbic6CiAgICAgICAgICAgICAgICBtc2cgPSAiRm9yIGJlc3QgcmVzdWx0cywgcGFzcyAtWDpGcmFtZXMgdG8gZW5hYmxlIGNhbGwgc3RhY2suIgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmVzID0gaW5zcGVjdC5nZXRvdXRlcmZyYW1lcyhydW5fZnJhbWUpWzJdCiAgICAgICAgY2FsbGVyLCA9IHJlc1s6MV0KICAgICAgICBpbmZvID0gaW5zcGVjdC5nZXRmcmFtZWluZm8oY2FsbGVyKQogICAgICAgIGNhbGxlcl9tb2R1bGUgPSBjYWxsZXIuZl9nbG9iYWxzLmdldCgnX19uYW1lX18nLCAnJykKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBjYWxsZXJfbW9kdWxlID09ICdkaXN0dXRpbHMuZGlzdCcKICAgICAgICAgICAgYW5kIGluZm8uZnVuY3Rpb24gPT0gJ3J1bl9jb21tYW5kcycKICAgICAgICApCgogICAgZGVmIGRvX2VnZ19pbnN0YWxsKHNlbGYpOgoKICAgICAgICBlYXN5X2luc3RhbGwgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9jbGFzcygnZWFzeV9pbnN0YWxsJykKCiAgICAgICAgY21kID0gZWFzeV9pbnN0YWxsKAogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbiwgYXJncz0ieCIsIHJvb3Q9c2VsZi5yb290LCByZWNvcmQ9c2VsZi5yZWNvcmQsCiAgICAgICAgKQogICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkgICMgZmluYWxpemUgYmVmb3JlIGJkaXN0X2VnZyBtdW5nZXMgaW5zdGFsbCBjbWQKICAgICAgICBjbWQuYWx3YXlzX2NvcHlfZnJvbSA9ICcuJyAgIyBtYWtlIHN1cmUgbG9jYWwtZGlyIGVnZ3MgZ2V0IGluc3RhbGxlZAoKICAgICAgICAjIHBpY2sgdXAgc2V0dXAtZGlyIC5lZ2cgZmlsZXMgb25seTogbm8gLmVnZy1pbmZvCiAgICAgICAgY21kLnBhY2thZ2VfaW5kZXguc2NhbihnbG9iLmdsb2IoJyouZWdnJykpCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2JkaXN0X2VnZycpCiAgICAgICAgYXJncyA9IFtzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9vYmooJ2JkaXN0X2VnZycpLmVnZ19vdXRwdXRdCgogICAgICAgIGlmIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbToKICAgICAgICAgICAgIyBCb290c3RyYXAgc2VsZi1pbnN0YWxsYXRpb24gb2Ygc2V0dXB0b29scwogICAgICAgICAgICBhcmdzLmluc2VydCgwLCBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20pCgogICAgICAgIGNtZC5hcmdzID0gYXJncwogICAgICAgIGNtZC5ydW4oKQogICAgICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCgojIFhYWCBQeXRob24gMy4xIGRvZXNuJ3Qgc2VlIF9uYyBpZiB0aGlzIGlzIGluc2lkZSB0aGUgY2xhc3MKaW5zdGFsbC5zdWJfY29tbWFuZHMgPSAoCiAgICBbY21kIGZvciBjbWQgaW4gb3JpZy5pbnN0YWxsLnN1Yl9jb21tYW5kcyBpZiBjbWRbMF0gbm90IGluIGluc3RhbGwuX25jXSArCiAgICBpbnN0YWxsLm5ld19jb21tYW5kcwopClBLAwQUAAAAAAAAACEAXNKo5ZsIAACbCAAASwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCmltcG9ydCBvcwoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCmZyb20gc2V0dXB0b29scyBpbXBvcnQgbmFtZXNwYWNlcwpmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfYXJjaGl2ZQppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmNsYXNzIGluc3RhbGxfZWdnX2luZm8obmFtZXNwYWNlcy5JbnN0YWxsZXIsIENvbW1hbmQpOgogICAgIiIiSW5zdGFsbCBhbiAuZWdnLWluZm8gZGlyZWN0b3J5IGZvciB0aGUgcGFja2FnZSIiIgoKICAgIGRlc2NyaXB0aW9uID0gIkluc3RhbGwgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBmb3IgdGhlIHBhY2thZ2UiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnaW5zdGFsbC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIGluc3RhbGwgdG8iKSwKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfZGlyJywgJ2luc3RhbGxfZGlyJykpCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBiYXNlbmFtZSA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBOb25lLCBOb25lLCBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbgogICAgICAgICkuZWdnX25hbWUoKSArICcuZWdnLWluZm8nCiAgICAgICAgc2VsZi5zb3VyY2UgPSBlaV9jbWQuZWdnX2luZm8KICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBiYXNlbmFtZSkKICAgICAgICBzZWxmLm91dHB1dHMgPSBbXQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2VsZi50YXJnZXQpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoc2VsZi50YXJnZXQpOgogICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShzZWxmLnRhcmdldCwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRhcmdldCk6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShvcy51bmxpbmssIChzZWxmLnRhcmdldCwpLCAiUmVtb3ZpbmcgIiArIHNlbGYudGFyZ2V0KQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuZW5zdXJlX2RpcmVjdG9yeShzZWxmLnRhcmdldCkKICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgIHNlbGYuY29weXRyZWUsICgpLCAiQ29weWluZyAlcyB0byAlcyIgJSAoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0KQogICAgICAgICkKICAgICAgICBzZWxmLmluc3RhbGxfbmFtZXNwYWNlcygpCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLm91dHB1dHMKCiAgICBkZWYgY29weXRyZWUoc2VsZik6CiAgICAgICAgIyBDb3B5IHRoZSAuZWdnLWluZm8gdHJlZSB0byBzaXRlLXBhY2thZ2VzCiAgICAgICAgZGVmIHNraW1tZXIoc3JjLCBkc3QpOgogICAgICAgICAgICAjIGZpbHRlciBvdXQgc291cmNlLWNvbnRyb2wgZGlyZWN0b3JpZXM7IG5vdGUgdGhhdCAnc3JjJyBpcyBhbHdheXMKICAgICAgICAgICAgIyBhICcvJy1zZXBhcmF0ZWQgcGF0aCwgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4gICdkc3QnIGlzIGEKICAgICAgICAgICAgIyBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLgogICAgICAgICAgICBmb3Igc2tpcCBpbiAnLnN2bi8nLCAnQ1ZTLyc6CiAgICAgICAgICAgICAgICBpZiBzcmMuc3RhcnRzd2l0aChza2lwKSBvciAnLycgKyBza2lwIGluIHNyYzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKGRzdCkKICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3B5aW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCiAgICAgICAgICAgIHJldHVybiBkc3QKCiAgICAgICAgdW5wYWNrX2FyY2hpdmUoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0LCBza2ltbWVyKQpQSwMEFAAAAAAAAAAhAJCcO1MADwAAAA8AAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5aW1wb3J0IG9zCmltcG9ydCBpbXAKZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QsIHN0YXJtYXAKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfbGliIGFzIG9yaWcKCgpjbGFzcyBpbnN0YWxsX2xpYihvcmlnLmluc3RhbGxfbGliKToKICAgICIiIkRvbid0IGFkZCBjb21waWxlZCBmbGFncyB0byBmaWxlbmFtZXMgb2Ygbm9uLVB5dGhvbiBmaWxlcyIiIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5idWlsZCgpCiAgICAgICAgb3V0ZmlsZXMgPSBzZWxmLmluc3RhbGwoKQogICAgICAgIGlmIG91dGZpbGVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIGFsd2F5cyBjb21waWxlLCBpbiBjYXNlIHdlIGhhdmUgYW55IGV4dGVuc2lvbiBzdHVicyB0byBkZWFsIHdpdGgKICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3V0ZmlsZXMpCgogICAgZGVmIGdldF9leGNsdXNpb25zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGNvbGxlY3Rpb25zLlNpemVkIGNvbGxlY3Rpb25zLkNvbnRhaW5lciBvZiBwYXRocyB0byBiZQogICAgICAgIGV4Y2x1ZGVkIGZvciBzaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgaW5zdGFsbGF0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBhbGxfcGFja2FnZXMgPSAoCiAgICAgICAgICAgIHBrZwogICAgICAgICAgICBmb3IgbnNfcGtnIGluIHNlbGYuX2dldF9TVkVNX05TUHMoKQogICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2FsbF9wYWNrYWdlcyhuc19wa2cpCiAgICAgICAgKQoKICAgICAgICBleGNsX3NwZWNzID0gcHJvZHVjdChhbGxfcGFja2FnZXMsIHNlbGYuX2dlbl9leGNsdXNpb25fcGF0aHMoKSkKICAgICAgICByZXR1cm4gc2V0KHN0YXJtYXAoc2VsZi5fZXhjbHVkZV9wa2dfcGF0aCwgZXhjbF9zcGVjcykpCgogICAgZGVmIF9leGNsdWRlX3BrZ19wYXRoKHNlbGYsIHBrZywgZXhjbHVzaW9uX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgcGFja2FnZSBuYW1lIGFuZCBleGNsdXNpb24gcGF0aCB3aXRoaW4gdGhhdCBwYWNrYWdlLAogICAgICAgIGNvbXB1dGUgdGhlIGZ1bGwgZXhjbHVzaW9uIHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBwa2cuc3BsaXQoJy4nKSArIFtleGNsdXNpb25fcGF0aF0KICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICpwYXJ0cykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2FsbF9wYWNrYWdlcyhwa2dfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgPj4+IGxpc3QoaW5zdGFsbF9saWIuX2FsbF9wYWNrYWdlcygnZm9vLmJhci5iYXonKSkKICAgICAgICBbJ2Zvby5iYXIuYmF6JywgJ2Zvby5iYXInLCAnZm9vJ10KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBwa2dfbmFtZToKICAgICAgICAgICAgeWllbGQgcGtnX25hbWUKICAgICAgICAgICAgcGtnX25hbWUsIHNlcCwgY2hpbGQgPSBwa2dfbmFtZS5ycGFydGl0aW9uKCcuJykKCiAgICBkZWYgX2dldF9TVkVNX05TUHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IG5hbWVzcGFjZSBwYWNrYWdlcyAobGlzdCkgYnV0IG9ubHkgZm9yCiAgICAgICAgc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkIGluc3RhbGxhdGlvbnMgYW5kIGVtcHR5IG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICAjIFRPRE86IGlzIGl0IG5lY2Vzc2FyeSB0byBzaG9ydC1jaXJjdWl0IGhlcmU/IGkuZS4gd2hhdCdzIHRoZSBjb3N0CiAgICAgICAgIyBpZiBnZXRfZmluYWxpemVkX2NvbW1hbmQgaXMgY2FsbGVkIGV2ZW4gd2hlbiBuYW1lc3BhY2VfcGFja2FnZXMgaXMKICAgICAgICAjIEZhbHNlPwogICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBpbnN0YWxsX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykKICAgICAgICBzdmVtID0gaW5zdGFsbF9jbWQuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkCgogICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgaWYgc3ZlbSBlbHNlIFtdCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZW5fZXhjbHVzaW9uX3BhdGhzKCk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdGUgZmlsZSBwYXRocyB0byBiZSBleGNsdWRlZCBmb3IgbmFtZXNwYWNlIHBhY2thZ2VzIChieXRlY29kZQogICAgICAgIGNhY2hlIGZpbGVzKS4KICAgICAgICAiIiIKICAgICAgICAjIGFsd2F5cyBleGNsdWRlIHRoZSBwYWNrYWdlIG1vZHVsZSBpdHNlbGYKICAgICAgICB5aWVsZCAnX19pbml0X18ucHknCgogICAgICAgIHlpZWxkICdfX2luaXRfXy5weWMnCiAgICAgICAgeWllbGQgJ19faW5pdF9fLnB5bycKCiAgICAgICAgaWYgbm90IGhhc2F0dHIoaW1wLCAnZ2V0X3RhZycpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbignX19weWNhY2hlX18nLCAnX19pbml0X18uJyArIGltcC5nZXRfdGFnKCkpCiAgICAgICAgeWllbGQgYmFzZSArICcucHljJwogICAgICAgIHlpZWxkIGJhc2UgKyAnLnB5bycKICAgICAgICB5aWVsZCBiYXNlICsgJy5vcHQtMS5weWMnCiAgICAgICAgeWllbGQgYmFzZSArICcub3B0LTIucHljJwoKICAgIGRlZiBjb3B5X3RyZWUoCiAgICAgICAgICAgIHNlbGYsIGluZmlsZSwgb3V0ZmlsZSwKICAgICAgICAgICAgcHJlc2VydmVfbW9kZT0xLCBwcmVzZXJ2ZV90aW1lcz0xLCBwcmVzZXJ2ZV9zeW1saW5rcz0wLCBsZXZlbD0xCiAgICApOgogICAgICAgIGFzc2VydCBwcmVzZXJ2ZV9tb2RlIGFuZCBwcmVzZXJ2ZV90aW1lcyBhbmQgbm90IHByZXNlcnZlX3N5bWxpbmtzCiAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQoKICAgICAgICBpZiBub3QgZXhjbHVkZToKICAgICAgICAgICAgcmV0dXJuIG9yaWcuaW5zdGFsbF9saWIuY29weV90cmVlKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSkKCiAgICAgICAgIyBFeGNsdWRlIG5hbWVzcGFjZSBwYWNrYWdlIF9faW5pdF9fLnB5KiBmaWxlcyBmcm9tIHRoZSBvdXRwdXQKCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2RpcmVjdG9yeQogICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCiAgICAgICAgb3V0ZmlsZXMgPSBbXQoKICAgICAgICBkZWYgcGYoc3JjLCBkc3QpOgogICAgICAgICAgICBpZiBkc3QgaW4gZXhjbHVkZToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJTa2lwcGluZyBpbnN0YWxsYXRpb24gb2YgJXMgKG5hbWVzcGFjZSBwYWNrYWdlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkc3QpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGxvZy5pbmZvKCJjb3B5aW5nICVzIC0+ICVzIiwgc3JjLCBvcy5wYXRoLmRpcm5hbWUoZHN0KSkKICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKGRzdCkKICAgICAgICAgICAgcmV0dXJuIGRzdAoKICAgICAgICB1bnBhY2tfZGlyZWN0b3J5KGluZmlsZSwgb3V0ZmlsZSwgcGYpCiAgICAgICAgcmV0dXJuIG91dGZpbGVzCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIG91dHB1dHMgPSBvcmlnLmluc3RhbGxfbGliLmdldF9vdXRwdXRzKHNlbGYpCiAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQogICAgICAgIGlmIGV4Y2x1ZGU6CiAgICAgICAgICAgIHJldHVybiBbZiBmb3IgZiBpbiBvdXRwdXRzIGlmIGYgbm90IGluIGV4Y2x1ZGVdCiAgICAgICAgcmV0dXJuIG91dHB1dHMKUEsDBBQAAAAAAAAAIQBGP/EehwkAAIcJAABKAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHMgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IHN5cwoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgZW5zdXJlX2RpcmVjdG9yeQoKCmNsYXNzIGluc3RhbGxfc2NyaXB0cyhvcmlnLmluc3RhbGxfc2NyaXB0cyk6CiAgICAiIiJEbyBub3JtYWwgc2NyaXB0IGluc3RhbGwsIHBsdXMgYW55IGVnZ19pbmZvIHdyYXBwZXIgc2NyaXB0cyIiIgoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5pbnN0YWxsX3NjcmlwdHMuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5ub19lcCA9IEZhbHNlCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpbXBvcnQgc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBhcyBlaQoKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKICAgICAgICAgICAgb3JpZy5pbnN0YWxsX3NjcmlwdHMucnVuKHNlbGYpICAjIHJ1biBmaXJzdCB0byBzZXQgdXAgc2VsZi5vdXRmaWxlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYub3V0ZmlsZXMgPSBbXQogICAgICAgIGlmIHNlbGYubm9fZXA6CiAgICAgICAgICAgICMgZG9uJ3QgaW5zdGFsbCBlbnRyeSBwb2ludCBzY3JpcHRzIGludG8gLmVnZyBmaWxlIQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBlaV9jbWQuZWdnX2Jhc2UsIFBhdGhNZXRhZGF0YShlaV9jbWQuZWdnX2Jhc2UsIGVpX2NtZC5lZ2dfaW5mbyksCiAgICAgICAgICAgIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAogICAgICAgICkKICAgICAgICBic19jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCiAgICAgICAgZXhlY19wYXJhbSA9IGdldGF0dHIoYnNfY21kLCAnZXhlY3V0YWJsZScsIE5vbmUpCiAgICAgICAgYndfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImJkaXN0X3dpbmluc3QiKQogICAgICAgIGlzX3dpbmluc3QgPSBnZXRhdHRyKGJ3X2NtZCwgJ19pc19ydW5uaW5nJywgRmFsc2UpCiAgICAgICAgd3JpdGVyID0gZWkuU2NyaXB0V3JpdGVyCiAgICAgICAgaWYgaXNfd2luaW5zdDoKICAgICAgICAgICAgZXhlY19wYXJhbSA9ICJweXRob24uZXhlIgogICAgICAgICAgICB3cml0ZXIgPSBlaS5XaW5kb3dzU2NyaXB0V3JpdGVyCiAgICAgICAgaWYgZXhlY19wYXJhbSA9PSBzeXMuZXhlY3V0YWJsZToKICAgICAgICAgICAgIyBJbiBjYXNlIHRoZSBwYXRoIHRvIHRoZSBQeXRob24gZXhlY3V0YWJsZSBjb250YWlucyBhIHNwYWNlLCB3cmFwCiAgICAgICAgICAgICMgaXQgc28gaXQncyBub3Qgc3BsaXQgdXAuCiAgICAgICAgICAgIGV4ZWNfcGFyYW0gPSBbZXhlY19wYXJhbV0KICAgICAgICAjIHJlc29sdmUgdGhlIHdyaXRlciB0byB0aGUgZW52aXJvbm1lbnQKICAgICAgICB3cml0ZXIgPSB3cml0ZXIuYmVzdCgpCiAgICAgICAgY21kID0gd3JpdGVyLmNvbW1hbmRfc3BlY19jbGFzcy5iZXN0KCkuZnJvbV9wYXJhbShleGVjX3BhcmFtKQogICAgICAgIGZvciBhcmdzIGluIHdyaXRlci5nZXRfYXJncyhkaXN0LCBjbWQuYXNfaGVhZGVyKCkpOgogICAgICAgICAgICBzZWxmLndyaXRlX3NjcmlwdCgqYXJncykKCiAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBjb250ZW50cywgbW9kZT0idCIsICppZ25vcmVkKToKICAgICAgICAiIiJXcml0ZSBhbiBleGVjdXRhYmxlIGZpbGUgdG8gdGhlIHNjcmlwdHMgZGlyZWN0b3J5IiIiCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBjaG1vZCwgY3VycmVudF91bWFzawoKICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyBzY3JpcHQgdG8gJXMiLCBzY3JpcHRfbmFtZSwgc2VsZi5pbnN0YWxsX2RpcikKICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpciwgc2NyaXB0X25hbWUpCiAgICAgICAgc2VsZi5vdXRmaWxlcy5hcHBlbmQodGFyZ2V0KQoKICAgICAgICBtYXNrID0gY3VycmVudF91bWFzaygpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwgInciICsgbW9kZSkKICAgICAgICAgICAgZi53cml0ZShjb250ZW50cykKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgIGNobW9kKHRhcmdldCwgMG83NzcgLSBtYXNrKQpQSwMEFAAAAAAAAAAhAH1zYL96EwAAehMAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3B5MzZjb21wYXQucHlpbXBvcnQgb3MKZnJvbSBnbG9iIGltcG9ydCBnbG9iCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscy5jb21tYW5kIGltcG9ydCBzZGlzdAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGZpbHRlcgoKCmNsYXNzIHNkaXN0X2FkZF9kZWZhdWx0czoKICAgICIiIgogICAgTWl4LWluIHByb3ZpZGluZyBmb3J3YXJkLWNvbXBhdGliaWxpdHkgZm9yIGZ1bmN0aW9uYWxpdHkgYXMgZm91bmQgaW4KICAgIGRpc3R1dGlscyBvbiBQeXRob24gMy43LgoKICAgIERvIG5vdCBlZGl0IHRoZSBjb2RlIGluIHRoaXMgY2xhc3MgZXhjZXB0IHRvIHVwZGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBhcyBpbXBsZW1lbnRlZCBpbiBkaXN0dXRpbHMuIEluc3RlYWQsIG92ZXJyaWRlIGluIHRoZSBzdWJjbGFzcy4KICAgICIiIgoKICAgIGRlZiBhZGRfZGVmYXVsdHMoc2VsZik6CiAgICAgICAgIiIiQWRkIGFsbCB0aGUgZGVmYXVsdCBmaWxlcyB0byBzZWxmLmZpbGVsaXN0OgogICAgICAgICAgLSBSRUFETUUgb3IgUkVBRE1FLnR4dAogICAgICAgICAgLSBzZXR1cC5weQogICAgICAgICAgLSB0ZXN0L3Rlc3QqLnB5CiAgICAgICAgICAtIGFsbCBwdXJlIFB5dGhvbiBtb2R1bGVzIG1lbnRpb25lZCBpbiBzZXR1cCBzY3JpcHQKICAgICAgICAgIC0gYWxsIGZpbGVzIHBvaW50ZWQgYnkgcGFja2FnZV9kYXRhIChidWlsZF9weSkKICAgICAgICAgIC0gYWxsIGZpbGVzIGRlZmluZWQgaW4gZGF0YV9maWxlcy4KICAgICAgICAgIC0gYWxsIGZpbGVzIGRlZmluZWQgYXMgc2NyaXB0cy4KICAgICAgICAgIC0gYWxsIEMgc291cmNlcyBsaXN0ZWQgYXMgcGFydCBvZiBleHRlbnNpb25zIG9yIEMgbGlicmFyaWVzCiAgICAgICAgICAgIGluIHRoZSBzZXR1cCBzY3JpcHQgKGRvZXNuJ3QgY2F0Y2ggQyBoZWFkZXJzISkKICAgICAgICBXYXJucyBpZiAoUkVBRE1FIG9yIFJFQURNRS50eHQpIG9yIHNldHVwLnB5IGFyZSBtaXNzaW5nOyBldmVyeXRoaW5nCiAgICAgICAgZWxzZSBpcyBvcHRpb25hbC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfc3RhbmRhcmRzKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfb3B0aW9uYWwoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19weXRob24oKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfZXh0KCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfY19saWJzKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfc2NyaXB0cygpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jc19wYXRoX2V4aXN0cyhmc3BhdGgpOgogICAgICAgICIiIgogICAgICAgIENhc2Utc2Vuc2l0aXZlIHBhdGggZXhpc3RlbmNlIGNoZWNrCgogICAgICAgID4+PiBzZGlzdF9hZGRfZGVmYXVsdHMuX2NzX3BhdGhfZXhpc3RzKF9fZmlsZV9fKQogICAgICAgIFRydWUKICAgICAgICA+Pj4gc2Rpc3RfYWRkX2RlZmF1bHRzLl9jc19wYXRoX2V4aXN0cyhfX2ZpbGVfXy51cHBlcigpKQogICAgICAgIEZhbHNlCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZzcGF0aCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgbWFrZSBhYnNvbHV0ZSBzbyB3ZSBhbHdheXMgaGF2ZSBhIGRpcmVjdG9yeQogICAgICAgIGFic3BhdGggPSBvcy5wYXRoLmFic3BhdGgoZnNwYXRoKQogICAgICAgIGRpcmVjdG9yeSwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGFic3BhdGgpCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX3N0YW5kYXJkcyhzZWxmKToKICAgICAgICBzdGFuZGFyZHMgPSBbc2VsZi5SRUFETUVTLCBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRfbmFtZV0KICAgICAgICBmb3IgZm4gaW4gc3RhbmRhcmRzOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZuLCB0dXBsZSk6CiAgICAgICAgICAgICAgICBhbHRzID0gZm4KICAgICAgICAgICAgICAgIGdvdF9pdCA9IEZhbHNlCiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gYWx0czoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9jc19wYXRoX2V4aXN0cyhmbik6CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdF9pdCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZm4pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgaWYgbm90IGdvdF9pdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oInN0YW5kYXJkIGZpbGUgbm90IGZvdW5kOiBzaG91bGQgaGF2ZSBvbmUgb2YgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsICcuam9pbihhbHRzKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NzX3BhdGhfZXhpc3RzKGZuKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChmbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJzdGFuZGFyZCBmaWxlICclcycgbm90IGZvdW5kIiAlIGZuKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX29wdGlvbmFsKHNlbGYpOgogICAgICAgIG9wdGlvbmFsID0gWyd0ZXN0L3Rlc3QqLnB5JywgJ3NldHVwLmNmZyddCiAgICAgICAgZm9yIHBhdHRlcm4gaW4gb3B0aW9uYWw6CiAgICAgICAgICAgIGZpbGVzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBnbG9iKHBhdHRlcm4pKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChmaWxlcykKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19weXRob24oc2VsZik6CiAgICAgICAgIyBidWlsZF9weSBpcyB1c2VkIHRvIGdldDoKICAgICAgICAjICAtIHB5dGhvbiBtb2R1bGVzCiAgICAgICAgIyAgLSBmaWxlcyBkZWZpbmVkIGluIHBhY2thZ2VfZGF0YQogICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKCiAgICAgICAgIyBnZXR0aW5nIHB5dGhvbiBmaWxlcwogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKToKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfcHkuZ2V0X3NvdXJjZV9maWxlcygpKQoKICAgICAgICAjIGdldHRpbmcgcGFja2FnZV9kYXRhIGZpbGVzCiAgICAgICAgIyAoY29tcHV0ZWQgaW4gYnVpbGRfcHkuZGF0YV9maWxlcyBieSBidWlsZF9weS5maW5hbGl6ZV9vcHRpb25zKQogICAgICAgIGZvciBwa2csIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIGJ1aWxkX3B5LmRhdGFfZmlsZXM6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChvcy5wYXRoLmpvaW4oc3JjX2RpciwgZmlsZW5hbWUpKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoc2VsZik6CiAgICAgICAgIyBnZXR0aW5nIGRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2RhdGFfZmlsZXMoKToKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgc3RyKToKICAgICAgICAgICAgICAgICAgICAjIHBsYWluIGZpbGUKICAgICAgICAgICAgICAgICAgICBpdGVtID0gY29udmVydF9wYXRoKGl0ZW0pCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoaXRlbSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgYSAoZGlybmFtZSwgZmlsZW5hbWVzKSB0dXBsZQogICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIGZpbGVuYW1lcyA9IGl0ZW0KICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjb252ZXJ0X3BhdGgoZikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChmKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2V4dChzZWxmKToKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKICAgICAgICAgICAgYnVpbGRfZXh0ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX2V4dC5nZXRfc291cmNlX2ZpbGVzKCkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfY19saWJzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpOgogICAgICAgICAgICBidWlsZF9jbGliID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2NsaWInKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9jbGliLmdldF9zb3VyY2VfZmlsZXMoKSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19zY3JpcHRzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19zY3JpcHRzKCk6CiAgICAgICAgICAgIGJ1aWxkX3NjcmlwdHMgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3NjcmlwdHMuZ2V0X3NvdXJjZV9maWxlcygpKQoKCmlmIGhhc2F0dHIoc2Rpc3Quc2Rpc3QsICdfYWRkX2RlZmF1bHRzX3N0YW5kYXJkcycpOgogICAgIyBkaXNhYmxlIHRoZSBmdW5jdGlvbmFsaXR5IGFscmVhZHkgYXZhaWxhYmxlIHVwc3RyZWFtCiAgICBjbGFzcyBzZGlzdF9hZGRfZGVmYXVsdHM6CiAgICAgICAgcGFzcwpQSwMEFAAAAAAAAAAhAM3/rZAOAQAADgEAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3JlZ2lzdGVyLnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyIGFzIG9yaWcKCgpjbGFzcyByZWdpc3RlcihvcmlnLnJlZ2lzdGVyKToKICAgIF9fZG9jX18gPSBvcmlnLnJlZ2lzdGVyLl9fZG9jX18KCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2UgYXJlIHVzaW5nIHZhbGlkIGN1cnJlbnQgbmFtZS92ZXJzaW9uIGluZm8KICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgb3JpZy5yZWdpc3Rlci5ydW4oc2VsZikKUEsDBBQAAAAAAAAAIQAZytSkdAgAAHQIAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHlmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKCmNsYXNzIHJvdGF0ZShDb21tYW5kKToKICAgICIiIkRlbGV0ZSBvbGRlciBkaXN0cmlidXRpb25zIiIiCgogICAgZGVzY3JpcHRpb24gPSAiZGVsZXRlIG9sZGVyIGRpc3RyaWJ1dGlvbnMsIGtlZXBpbmcgTiBuZXdlc3QgZmlsZXMiCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdtYXRjaD0nLCAnbScsICJwYXR0ZXJucyB0byBtYXRjaCAocmVxdWlyZWQpIiksCiAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsICJkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpc3RyaWJ1dGlvbnMgYXJlIiksCiAgICAgICAgKCdrZWVwPScsICdrJywgIm51bWJlciBvZiBtYXRjaGluZyBkaXN0cmlidXRpb25zIHRvIGtlZXAiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5tYXRjaCA9IE5vbmUKICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYua2VlcCA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBpZiBzZWxmLm1hdGNoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmUgb3IgbW9yZSAoY29tbWEtc2VwYXJhdGVkKSBtYXRjaCBwYXR0ZXJucyAiCiAgICAgICAgICAgICAgICAiKGUuZy4gJy56aXAnIG9yICcuZWdnJykiCiAgICAgICAgICAgICkKICAgICAgICBpZiBzZWxmLmtlZXAgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSBudW1iZXIgb2YgZmlsZXMgdG8ga2VlcCIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmtlZXAgPSBpbnQoc2VsZi5rZWVwKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiLS1rZWVwIG11c3QgYmUgYW4gaW50ZWdlciIpCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1hdGNoLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgc2VsZi5tYXRjaCA9IFsKICAgICAgICAgICAgICAgIGNvbnZlcnRfcGF0aChwLnN0cmlwKCkpIGZvciBwIGluIHNlbGYubWF0Y2guc3BsaXQoJywnKQogICAgICAgICAgICBdCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGZyb20gZ2xvYiBpbXBvcnQgZ2xvYgoKICAgICAgICBmb3IgcGF0dGVybiBpbiBzZWxmLm1hdGNoOgogICAgICAgICAgICBwYXR0ZXJuID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSArICcqJyArIHBhdHRlcm4KICAgICAgICAgICAgZmlsZXMgPSBnbG9iKG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBwYXR0ZXJuKSkKICAgICAgICAgICAgZmlsZXMgPSBbKG9zLnBhdGguZ2V0bXRpbWUoZiksIGYpIGZvciBmIGluIGZpbGVzXQogICAgICAgICAgICBmaWxlcy5zb3J0KCkKICAgICAgICAgICAgZmlsZXMucmV2ZXJzZSgpCgogICAgICAgICAgICBsb2cuaW5mbygiJWQgZmlsZShzKSBtYXRjaGluZyAlcyIsIGxlbihmaWxlcyksIHBhdHRlcm4pCiAgICAgICAgICAgIGZpbGVzID0gZmlsZXNbc2VsZi5rZWVwOl0KICAgICAgICAgICAgZm9yICh0LCBmKSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyAlcyIsIGYpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZik6CiAgICAgICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZikKUEsDBBQAAAAAAAAAIQAEgdY0kgIAAJICAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weWZyb20gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdCBpbXBvcnQgZWRpdF9jb25maWcsIG9wdGlvbl9iYXNlCgoKY2xhc3Mgc2F2ZW9wdHMob3B0aW9uX2Jhc2UpOgogICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJzYXZlIHN1cHBsaWVkIG9wdGlvbnMgdG8gc2V0dXAuY2ZnIG9yIG90aGVyIGNvbmZpZyBmaWxlIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgZGlzdCA9IHNlbGYuZGlzdHJpYnV0aW9uCiAgICAgICAgc2V0dGluZ3MgPSB7fQoKICAgICAgICBmb3IgY21kIGluIGRpc3QuY29tbWFuZF9vcHRpb25zOgoKICAgICAgICAgICAgaWYgY21kID09ICdzYXZlb3B0cyc6CiAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBkb24ndCBzYXZlIG91ciBvd24gb3B0aW9ucyEKCiAgICAgICAgICAgIGZvciBvcHQsIChzcmMsIHZhbCkgaW4gZGlzdC5nZXRfb3B0aW9uX2RpY3QoY21kKS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgc3JjID09ICJjb21tYW5kIGxpbmUiOgogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldGRlZmF1bHQoY21kLCB7fSlbb3B0XSA9IHZhbAoKICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCBzZXR0aW5ncywgc2VsZi5kcnlfcnVuKQpQSwMEFAAAAAAAAAAhALcf0W43GgAANxoAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgaW8KaW1wb3J0IGNvbnRleHRsaWIKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSAucHkzNmNvbXBhdCBpbXBvcnQgc2Rpc3RfYWRkX2RlZmF1bHRzCgppbXBvcnQgcGtnX3Jlc291cmNlcwoKX2RlZmF1bHRfcmV2Y3RybCA9IGxpc3QKCgpkZWYgd2Fsa19yZXZjdHJsKGRpcm5hbWU9JycpOgogICAgIiIiRmluZCBhbGwgZmlsZXMgdW5kZXIgcmV2aXNpb24gY29udHJvbCIiIgogICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ3NldHVwdG9vbHMuZmlsZV9maW5kZXJzJyk6CiAgICAgICAgZm9yIGl0ZW0gaW4gZXAubG9hZCgpKGRpcm5hbWUpOgogICAgICAgICAgICB5aWVsZCBpdGVtCgoKY2xhc3Mgc2Rpc3Qoc2Rpc3RfYWRkX2RlZmF1bHRzLCBvcmlnLnNkaXN0KToKICAgICIiIlNtYXJ0IHNkaXN0IHRoYXQgZmluZHMgYW55dGhpbmcgc3VwcG9ydGVkIGJ5IHJldmlzaW9uIGNvbnRyb2wiIiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdmb3JtYXRzPScsIE5vbmUsCiAgICAgICAgICJmb3JtYXRzIGZvciBzb3VyY2UgZGlzdHJpYnV0aW9uIChjb21tYS1zZXBhcmF0ZWQgbGlzdCkiKSwKICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKICAgICAgICAgImtlZXAgdGhlIGRpc3RyaWJ1dGlvbiB0cmVlIGFyb3VuZCBhZnRlciBjcmVhdGluZyAiICsKICAgICAgICAgImFyY2hpdmUgZmlsZShzKSIpLAogICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAogICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlKHMpIGluICIKICAgICAgICAgIltkZWZhdWx0OiBkaXN0XSIpLAogICAgXQoKICAgIG5lZ2F0aXZlX29wdCA9IHt9CgogICAgUkVBRE1FX0VYVEVOU0lPTlMgPSBbJycsICcucnN0JywgJy50eHQnLCAnLm1kJ10KICAgIFJFQURNRVMgPSB0dXBsZSgnUkVBRE1FezB9Jy5mb3JtYXQoZXh0KSBmb3IgZXh0IGluIFJFQURNRV9FWFRFTlNJT05TKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgc2VsZi5maWxlbGlzdCA9IGVpX2NtZC5maWxlbGlzdAogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKG9zLnBhdGguam9pbihlaV9jbWQuZWdnX2luZm8sICdTT1VSQ0VTLnR4dCcpKQogICAgICAgIHNlbGYuY2hlY2tfcmVhZG1lKCkKCiAgICAgICAgIyBSdW4gc3ViIGNvbW1hbmRzCiAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZF9uYW1lKQoKICAgICAgICBzZWxmLm1ha2VfZGlzdHJpYnV0aW9uKCkKCiAgICAgICAgZGlzdF9maWxlcyA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICdkaXN0X2ZpbGVzJywgW10pCiAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5hcmNoaXZlX2ZpbGVzOgogICAgICAgICAgICBkYXRhID0gKCdzZGlzdCcsICcnLCBmaWxlKQogICAgICAgICAgICBpZiBkYXRhIG5vdCBpbiBkaXN0X2ZpbGVzOgogICAgICAgICAgICAgICAgZGlzdF9maWxlcy5hcHBlbmQoZGF0YSkKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuc2Rpc3QuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCgogICAgICAgIHNlbGYuX2RlZmF1bHRfdG9fZ3p0YXIoKQoKICAgIGRlZiBfZGVmYXVsdF90b19nenRhcihzZWxmKToKICAgICAgICAjIG9ubHkgbmVlZGVkIG9uIFB5dGhvbiBwcmlvciB0byAzLjYuCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgNiwgMCwgJ2JldGEnLCAxKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mb3JtYXRzID0gWydnenRhciddCgogICAgZGVmIG1ha2VfZGlzdHJpYnV0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdvcmthcm91bmQgZm9yICM1MTYKICAgICAgICAiIiIKICAgICAgICB3aXRoIHNlbGYuX3JlbW92ZV9vc19saW5rKCk6CiAgICAgICAgICAgIG9yaWcuc2Rpc3QubWFrZV9kaXN0cmlidXRpb24oc2VsZikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIF9yZW1vdmVfb3NfbGluaygpOgogICAgICAgICIiIgogICAgICAgIEluIGEgY29udGV4dCwgcmVtb3ZlIGFuZCByZXN0b3JlIG9zLmxpbmsgaWYgaXQgZXhpc3RzCiAgICAgICAgIiIiCgogICAgICAgIGNsYXNzIE5vVmFsdWU6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgb3JpZ192YWwgPSBnZXRhdHRyKG9zLCAnbGluaycsIE5vVmFsdWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgb3MubGluawogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKICAgICAgICB0cnk6CiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgb3JpZ192YWwgaXMgbm90IE5vVmFsdWU6CiAgICAgICAgICAgICAgICBzZXRhdHRyKG9zLCAnbGluaycsIG9yaWdfdmFsKQoKICAgIGRlZiBfX3JlYWRfdGVtcGxhdGVfaGFjayhzZWxmKToKICAgICAgICAjIFRoaXMgZ3JvZHkgaGFjayBjbG9zZXMgdGhlIHRlbXBsYXRlIGZpbGUgKE1BTklGRVNULmluKSBpZiBhbgogICAgICAgICMgIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHJlYWRfdGVtcGxhdGUuCiAgICAgICAgIyBEb2luZyBzbyBwcmV2ZW50cyBhbiBlcnJvciB3aGVuIGVhc3lfaW5zdGFsbCBhdHRlbXB0cyB0byBkZWxldGUgdGhlCiAgICAgICAgIyAgZmlsZS4KICAgICAgICB0cnk6CiAgICAgICAgICAgIG9yaWcuc2Rpc3QucmVhZF90ZW1wbGF0ZShzZWxmKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIF8sIF8sIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgdGIudGJfbmV4dC50Yl9mcmFtZS5mX2xvY2Fsc1sndGVtcGxhdGUnXS5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlCgogICAgIyBCZWdpbm5pbmcgd2l0aCBQeXRob24gMi43LjIsIDMuMS40LCBhbmQgMy4yLjEsIHRoaXMgbGVha3kgZmlsZSBoYW5kbGUKICAgICMgIGhhcyBiZWVuIGZpeGVkLCBzbyBvbmx5IG92ZXJyaWRlIHRoZSBtZXRob2QgaWYgd2UncmUgdXNpbmcgYW4gZWFybGllcgogICAgIyAgUHl0aG9uLgogICAgaGFzX2xlYWt5X2hhbmRsZSA9ICgKICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcsIDIpCiAgICAgICAgb3IgKDMsIDApIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMSwgNCkKICAgICAgICBvciAoMywgMikgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyLCAxKQogICAgKQogICAgaWYgaGFzX2xlYWt5X2hhbmRsZToKICAgICAgICByZWFkX3RlbXBsYXRlID0gX19yZWFkX3RlbXBsYXRlX2hhY2sKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19weXRob24oc2VsZik6CiAgICAgICAgIiIiZ2V0dGluZyBweXRob24gZmlsZXMiIiIKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfcHkuZ2V0X3NvdXJjZV9maWxlcygpKQogICAgICAgICAgICAjIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbmNvbXBhdGlibGUgd2l0aCBpbmNsdWRlX3BhY2thZ2VfZGF0YSwgYW5kCiAgICAgICAgICAgICMgd2lsbCBpbiBmYWN0IGNyZWF0ZSBhbiBpbmZpbml0ZSByZWN1cnNpb24gaWYgaW5jbHVkZV9wYWNrYWdlX2RhdGEKICAgICAgICAgICAgIyBpcyBUcnVlLiAgVXNlIG9mIGluY2x1ZGVfcGFja2FnZV9kYXRhIHdpbGwgaW1wbHkgdGhhdAogICAgICAgICAgICAjIGRpc3R1dGlscy1zdHlsZSBhdXRvbWF0aWMgaGFuZGxpbmcgb2YgcGFja2FnZV9kYXRhIGlzIGRpc2FibGVkCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5pbmNsdWRlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgICAgIGZvciBfLCBzcmNfZGlyLCBfLCBmaWxlbmFtZXMgaW4gYnVpbGRfcHkuZGF0YV9maWxlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChbb3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzXSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2l4LlBZMjoKICAgICAgICAgICAgICAgIHNkaXN0X2FkZF9kZWZhdWx0cy5fYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoc2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN1cGVyKCkuX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKCkKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICBsb2cud2FybigiZGF0YV9maWxlcyBjb250YWlucyB1bmV4cGVjdGVkIG9iamVjdHMiKQoKICAgIGRlZiBjaGVja19yZWFkbWUoc2VsZik6CiAgICAgICAgZm9yIGYgaW4gc2VsZi5SRUFETUVTOgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud2FybigKICAgICAgICAgICAgICAgICJzdGFuZGFyZCBmaWxlIG5vdCBmb3VuZDogc2hvdWxkIGhhdmUgb25lIG9mICIgKwogICAgICAgICAgICAgICAgJywgJy5qb2luKHNlbGYuUkVBRE1FUykKICAgICAgICAgICAgKQoKICAgIGRlZiBtYWtlX3JlbGVhc2VfdHJlZShzZWxmLCBiYXNlX2RpciwgZmlsZXMpOgogICAgICAgIG9yaWcuc2Rpc3QubWFrZV9yZWxlYXNlX3RyZWUoc2VsZiwgYmFzZV9kaXIsIGZpbGVzKQoKICAgICAgICAjIFNhdmUgYW55IGVnZ19pbmZvIGNvbW1hbmQgbGluZSBvcHRpb25zIHVzZWQgdG8gY3JlYXRlIHRoaXMgc2Rpc3QKICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKGJhc2VfZGlyLCAnc2V0dXAuY2ZnJykKICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpIGFuZCBvcy5wYXRoLmV4aXN0cyhkZXN0KToKICAgICAgICAgICAgIyB1bmxpbmsgYW5kIHJlLWNvcHksIHNpbmNlIGl0IG1pZ2h0IGJlIGhhcmQtbGlua2VkLCBhbmQKICAgICAgICAgICAgIyB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgc291cmNlIHZlcnNpb24KICAgICAgICAgICAgb3MudW5saW5rKGRlc3QpCiAgICAgICAgICAgIHNlbGYuY29weV9maWxlKCdzZXR1cC5jZmcnLCBkZXN0KQoKICAgICAgICBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKS5zYXZlX3ZlcnNpb25faW5mbyhkZXN0KQoKICAgIGRlZiBfbWFuaWZlc3RfaXNfbm90X2dlbmVyYXRlZChzZWxmKToKICAgICAgICAjIGNoZWNrIGZvciBzcGVjaWFsIGNvbW1lbnQgdXNlZCBpbiAyLjcuMSBhbmQgaGlnaGVyCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgd2l0aCBpby5vcGVuKHNlbGYubWFuaWZlc3QsICdyYicpIGFzIGZwOgogICAgICAgICAgICBmaXJzdF9saW5lID0gZnAucmVhZGxpbmUoKQogICAgICAgIHJldHVybiAoZmlyc3RfbGluZSAhPQogICAgICAgICAgICAgICAgJyMgZmlsZSBHRU5FUkFURUQgYnkgZGlzdHV0aWxzLCBkbyBOT1QgZWRpdFxuJy5lbmNvZGUoKSkKCiAgICBkZWYgcmVhZF9tYW5pZmVzdChzZWxmKToKICAgICAgICAiIiJSZWFkIHRoZSBtYW5pZmVzdCBmaWxlIChuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcpIGFuZCB1c2UgaXQgdG8KICAgICAgICBmaWxsIGluICdzZWxmLmZpbGVsaXN0JywgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgc291cmNlCiAgICAgICAgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgogICAgICAgIGxvZy5pbmZvKCJyZWFkaW5nIG1hbmlmZXN0IGZpbGUgJyVzJyIsIHNlbGYubWFuaWZlc3QpCiAgICAgICAgbWFuaWZlc3QgPSBvcGVuKHNlbGYubWFuaWZlc3QsICdyYicpCiAgICAgICAgZm9yIGxpbmUgaW4gbWFuaWZlc3Q6CiAgICAgICAgICAgICMgVGhlIG1hbmlmZXN0IG11c3QgY29udGFpbiBVVEYtOC4gU2VlICMzMDMuCiAgICAgICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKCdVVEYtOCcpCiAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlciBub3QgVVRGLTggZGVjb2RhYmxlIC0tIHNraXBwaW5nIiAlIGxpbmUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIyBpZ25vcmUgY29tbWVudHMgYW5kIGJsYW5rIGxpbmVzCiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCcjJykgb3Igbm90IGxpbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChsaW5lKQogICAgICAgIG1hbmlmZXN0LmNsb3NlKCkKUEsDBBQAAAAAAAAAIQCbcMvH3RMAAN0TAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHlmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBkaXN0dXRpbHMKaW1wb3J0IG9zCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKCl9fYWxsX18gPSBbJ2NvbmZpZ19maWxlJywgJ2VkaXRfY29uZmlnJywgJ29wdGlvbl9iYXNlJywgJ3NldG9wdCddCgoKZGVmIGNvbmZpZ19maWxlKGtpbmQ9ImxvY2FsIik6CiAgICAiIiJHZXQgdGhlIGZpbGVuYW1lIG9mIHRoZSBkaXN0dXRpbHMsIGxvY2FsLCBnbG9iYWwsIG9yIHBlci11c2VyIGNvbmZpZwoKICAgIGBraW5kYCBtdXN0IGJlIG9uZSBvZiAibG9jYWwiLCAiZ2xvYmFsIiwgb3IgInVzZXIiCiAgICAiIiIKICAgIGlmIGtpbmQgPT0gJ2xvY2FsJzoKICAgICAgICByZXR1cm4gJ3NldHVwLmNmZycKICAgIGlmIGtpbmQgPT0gJ2dsb2JhbCc6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigKICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRpc3R1dGlscy5fX2ZpbGVfXyksICdkaXN0dXRpbHMuY2ZnJwogICAgICAgICkKICAgIGlmIGtpbmQgPT0gJ3VzZXInOgogICAgICAgIGRvdCA9IG9zLm5hbWUgPT0gJ3Bvc2l4JyBhbmQgJy4nIG9yICcnCiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhwYW5kdXNlcihjb252ZXJ0X3BhdGgoIn4vJXNweWRpc3R1dGlscy5jZmciICUgZG90KSkKICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgImNvbmZpZ19maWxlKCkgdHlwZSBtdXN0IGJlICdsb2NhbCcsICdnbG9iYWwnLCBvciAndXNlciciLCBraW5kCiAgICApCgoKZGVmIGVkaXRfY29uZmlnKGZpbGVuYW1lLCBzZXR0aW5ncywgZHJ5X3J1bj1GYWxzZSk6CiAgICAiIiJFZGl0IGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGluY2x1ZGUgYHNldHRpbmdzYAoKICAgIGBzZXR0aW5nc2AgaXMgYSBkaWN0aW9uYXJ5IG9mIGRpY3Rpb25hcmllcyBvciBgYE5vbmVgYCB2YWx1ZXMsIGtleWVkIGJ5CiAgICBjb21tYW5kL3NlY3Rpb24gbmFtZS4gIEEgYGBOb25lYGAgdmFsdWUgbWVhbnMgdG8gZGVsZXRlIHRoZSBlbnRpcmUgc2VjdGlvbiwKICAgIHdoaWxlIGEgZGljdGlvbmFyeSBsaXN0cyBzZXR0aW5ncyB0byBiZSBjaGFuZ2VkIG9yIGRlbGV0ZWQgaW4gdGhhdCBzZWN0aW9uLgogICAgQSBzZXR0aW5nIG9mIGBgTm9uZWBgIG1lYW5zIHRvIGRlbGV0ZSB0aGF0IHNldHRpbmcuCiAgICAiIiIKICAgIGxvZy5kZWJ1ZygiUmVhZGluZyBjb25maWd1cmF0aW9uIGZyb20gJXMiLCBmaWxlbmFtZSkKICAgIG9wdHMgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKICAgIG9wdHMucmVhZChbZmlsZW5hbWVdKQogICAgZm9yIHNlY3Rpb24sIG9wdGlvbnMgaW4gc2V0dGluZ3MuaXRlbXMoKToKICAgICAgICBpZiBvcHRpb25zIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyBzZWN0aW9uIFslc10gZnJvbSAlcyIsIHNlY3Rpb24sIGZpbGVuYW1lKQogICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbm90IG9wdHMuaGFzX3NlY3Rpb24oc2VjdGlvbik6CiAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBuZXcgc2VjdGlvbiBbJXNdIHRvICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBvcHRzLmFkZF9zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgICAgIGZvciBvcHRpb24sIHZhbHVlIGluIG9wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAiRGVsZXRpbmcgJXMuJXMgZnJvbSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgb3B0cy5yZW1vdmVfb3B0aW9uKHNlY3Rpb24sIG9wdGlvbikKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0cy5vcHRpb25zKHNlY3Rpb24pOgogICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgZW1wdHkgWyVzXSBzZWN0aW9uIGZyb20gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5yZW1vdmVfc2VjdGlvbihzZWN0aW9uKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nICVzLiVzIHRvICVyIGluICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgb3B0cy5zZXQoc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSkKCiAgICBsb2cuaW5mbygiV3JpdGluZyAlcyIsIGZpbGVuYW1lKQogICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGY6CiAgICAgICAgICAgIG9wdHMud3JpdGUoZikKCgpjbGFzcyBvcHRpb25fYmFzZShDb21tYW5kKToKICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbW1hbmRzIHRoYXQgbWVzcyB3aXRoIGNvbmZpZyBmaWxlcyIiIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2dsb2JhbC1jb25maWcnLCAnZycsCiAgICAgICAgICJzYXZlIG9wdGlvbnMgdG8gdGhlIHNpdGUtd2lkZSBkaXN0dXRpbHMuY2ZnIGZpbGUiKSwKICAgICAgICAoJ3VzZXItY29uZmlnJywgJ3UnLAogICAgICAgICAic2F2ZSBvcHRpb25zIHRvIHRoZSBjdXJyZW50IHVzZXIncyBweWRpc3R1dGlscy5jZmcgZmlsZSIpLAogICAgICAgICgnZmlsZW5hbWU9JywgJ2YnLAogICAgICAgICAiY29uZmlndXJhdGlvbiBmaWxlIHRvIHVzZSAoZGVmYXVsdD1zZXR1cC5jZmcpIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gWwogICAgICAgICdnbG9iYWwtY29uZmlnJywgJ3VzZXItY29uZmlnJywKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZ2xvYmFsX2NvbmZpZyA9IE5vbmUKICAgICAgICBzZWxmLnVzZXJfY29uZmlnID0gTm9uZQogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgZmlsZW5hbWVzID0gW10KICAgICAgICBpZiBzZWxmLmdsb2JhbF9jb25maWc6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ2dsb2JhbCcpKQogICAgICAgIGlmIHNlbGYudXNlcl9jb25maWc6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ3VzZXInKSkKICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKHNlbGYuZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IGZpbGVuYW1lczoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnbG9jYWwnKSkKICAgICAgICBpZiBsZW4oZmlsZW5hbWVzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmx5IG9uZSBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uIiwKICAgICAgICAgICAgICAgIGZpbGVuYW1lcwogICAgICAgICAgICApCiAgICAgICAgc2VsZi5maWxlbmFtZSwgPSBmaWxlbmFtZXMKCgpjbGFzcyBzZXRvcHQob3B0aW9uX2Jhc2UpOgogICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJzZXQgYW4gb3B0aW9uIGluIHNldHVwLmNmZyBvciBhbm90aGVyIGNvbmZpZyBmaWxlIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2NvbW1hbmQ9JywgJ2MnLCAnY29tbWFuZCB0byBzZXQgYW4gb3B0aW9uIGZvcicpLAogICAgICAgICgnb3B0aW9uPScsICdvJywgJ29wdGlvbiB0byBzZXQnKSwKICAgICAgICAoJ3NldC12YWx1ZT0nLCAncycsICd2YWx1ZSBvZiB0aGUgb3B0aW9uJyksCiAgICAgICAgKCdyZW1vdmUnLCAncicsICdyZW1vdmUgKHVuc2V0KSB0aGUgdmFsdWUnKSwKICAgIF0gKyBvcHRpb25fYmFzZS51c2VyX29wdGlvbnMKCiAgICBib29sZWFuX29wdGlvbnMgPSBvcHRpb25fYmFzZS5ib29sZWFuX29wdGlvbnMgKyBbJ3JlbW92ZSddCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCiAgICAgICAgc2VsZi5vcHRpb24gPSBOb25lCiAgICAgICAgc2VsZi5zZXRfdmFsdWUgPSBOb25lCiAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYuY29tbWFuZCBpcyBOb25lIG9yIHNlbGYub3B0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgLS1jb21tYW5kICphbmQqIC0tb3B0aW9uIikKICAgICAgICBpZiBzZWxmLnNldF92YWx1ZSBpcyBOb25lIGFuZCBub3Qgc2VsZi5yZW1vdmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgLS1zZXQtdmFsdWUgb3IgLS1yZW1vdmUiKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgZWRpdF9jb25maWcoCiAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsIHsKICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZDoge3NlbGYub3B0aW9uLnJlcGxhY2UoJy0nLCAnXycpOiBzZWxmLnNldF92YWx1ZX0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2VsZi5kcnlfcnVuCiAgICAgICAgKQpQSwMEFAAAAAAAAAAhAN0Z4Z7+IwAA/iMAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHlpbXBvcnQgb3MKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBzeXMKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgdW5pdHRlc3QKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvciwgRGlzdHV0aWxzT3B0aW9uRXJyb3IKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0TG9hZGVyCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcCwgZmlsdGVyCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IChyZXNvdXJjZV9saXN0ZGlyLCByZXNvdXJjZV9leGlzdHMsIG5vcm1hbGl6ZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nX3NldCwgX25hbWVzcGFjZV9wYWNrYWdlcywgZXZhbHVhdGVfbWFya2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lciwgcmVxdWlyZSwgRW50cnlQb2ludCkKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgoKY2xhc3MgU2Nhbm5pbmdMb2FkZXIoVGVzdExvYWRlcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIFRlc3RMb2FkZXIuX19pbml0X18oc2VsZikKICAgICAgICBzZWxmLl92aXNpdGVkID0gc2V0KCkKCiAgICBkZWYgbG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLCBtb2R1bGUsIHBhdHRlcm49Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gbW9kdWxlCgogICAgICAgIElmIHRoZSBtb2R1bGUgaXMgYSBwYWNrYWdlLCBsb2FkIHRlc3RzIGZyb20gYWxsIHRoZSBtb2R1bGVzIGluIGl0LgogICAgICAgIElmIHRoZSBtb2R1bGUgaGFzIGFuIGBgYWRkaXRpb25hbF90ZXN0c2BgIGZ1bmN0aW9uLCBjYWxsIGl0IGFuZCBhZGQKICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSB0ZXN0cy4KICAgICAgICAiIiIKICAgICAgICBpZiBtb2R1bGUgaW4gc2VsZi5fdmlzaXRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBzZWxmLl92aXNpdGVkLmFkZChtb2R1bGUpCgogICAgICAgIHRlc3RzID0gW10KICAgICAgICB0ZXN0cy5hcHBlbmQoVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsIG1vZHVsZSkpCgogICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAiYWRkaXRpb25hbF90ZXN0cyIpOgogICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kdWxlLmFkZGl0aW9uYWxfdGVzdHMoKSkKCiAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgogICAgICAgICAgICBmb3IgZmlsZSBpbiByZXNvdXJjZV9saXN0ZGlyKG1vZHVsZS5fX25hbWVfXywgJycpOgogICAgICAgICAgICAgICAgaWYgZmlsZS5lbmRzd2l0aCgnLnB5JykgYW5kIGZpbGUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGUgPSBtb2R1bGUuX19uYW1lX18gKyAnLicgKyBmaWxlWzotM10KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgcmVzb3VyY2VfZXhpc3RzKG1vZHVsZS5fX25hbWVfXywgZmlsZSArICcvX19pbml0X18ucHknKToKICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlID0gbW9kdWxlLl9fbmFtZV9fICsgJy4nICsgZmlsZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB0ZXN0cy5hcHBlbmQoc2VsZi5sb2FkVGVzdHNGcm9tTmFtZShzdWJtb2R1bGUpKQoKICAgICAgICBpZiBsZW4odGVzdHMpICE9IDE6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnN1aXRlQ2xhc3ModGVzdHMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHRlc3RzWzBdICAjIGRvbid0IGNyZWF0ZSBhIG5lc3RlZCBzdWl0ZSBmb3Igb25seSBvbmUgcmV0dXJuCgoKIyBhZGFwdGVkIGZyb20gamFyYWNvLmNsYXNzZXMucHJvcGVydGllczpOb25EYXRhUHJvcGVydHkKY2xhc3MgTm9uRGF0YVByb3BlcnR5KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZmdldCk6CiAgICAgICAgc2VsZi5mZ2V0ID0gZmdldAoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgb2JqdHlwZT1Ob25lKToKICAgICAgICBpZiBvYmogaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICByZXR1cm4gc2VsZi5mZ2V0KG9iaikKCgpjbGFzcyB0ZXN0KENvbW1hbmQpOgogICAgIiIiQ29tbWFuZCB0byBydW4gdW5pdCB0ZXN0cyBhZnRlciBpbi1wbGFjZSBidWlsZCIiIgoKICAgIGRlc2NyaXB0aW9uID0gInJ1biB1bml0IHRlc3RzIGFmdGVyIGluLXBsYWNlIGJ1aWxkIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3Rlc3QtbW9kdWxlPScsICdtJywgIlJ1biAndGVzdF9zdWl0ZScgaW4gc3BlY2lmaWVkIG1vZHVsZSIpLAogICAgICAgICgndGVzdC1zdWl0ZT0nLCAncycsCiAgICAgICAgICJSdW4gc2luZ2xlIHRlc3QsIGNhc2Ugb3Igc3VpdGUgKGUuZy4gJ21vZHVsZS50ZXN0X3N1aXRlJykiKSwKICAgICAgICAoJ3Rlc3QtcnVubmVyPScsICdyJywgIlRlc3QgcnVubmVyIHRvIHVzZSIpLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gTm9uZQogICAgICAgIHNlbGYudGVzdF9tb2R1bGUgPSBOb25lCiAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9IE5vbmUKICAgICAgICBzZWxmLnRlc3RfcnVubmVyID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgoKICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGUgYW5kIHNlbGYudGVzdF9tb2R1bGU6CiAgICAgICAgICAgIG1zZyA9ICJZb3UgbWF5IHNwZWNpZnkgYSBtb2R1bGUgb3IgYSBzdWl0ZSwgYnV0IG5vdCBib3RoIgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcihtc2cpCgogICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZSBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLnRlc3RfbW9kdWxlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBzZWxmLmRpc3RyaWJ1dGlvbi50ZXN0X3N1aXRlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBzZWxmLnRlc3RfbW9kdWxlICsgIi50ZXN0X3N1aXRlIgoKICAgICAgICBpZiBzZWxmLnRlc3RfbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndGVzdF9sb2FkZXInLCBOb25lKQogICAgICAgIGlmIHNlbGYudGVzdF9sb2FkZXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9ICJzZXR1cHRvb2xzLmNvbW1hbmQudGVzdDpTY2FubmluZ0xvYWRlciIKICAgICAgICBpZiBzZWxmLnRlc3RfcnVubmVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYudGVzdF9ydW5uZXIgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndGVzdF9ydW5uZXInLCBOb25lKQoKICAgIEBOb25EYXRhUHJvcGVydHkKICAgIGRlZiB0ZXN0X2FyZ3Moc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fdGVzdF9hcmdzKCkpCgogICAgZGVmIF90ZXN0X2FyZ3Moc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYudGVzdF9zdWl0ZSBhbmQgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNyk6CiAgICAgICAgICAgIHlpZWxkICdkaXNjb3ZlcicKICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CiAgICAgICAgICAgIHlpZWxkICctLXZlcmJvc2UnCiAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlOgogICAgICAgICAgICB5aWVsZCBzZWxmLnRlc3Rfc3VpdGUKCiAgICBkZWYgd2l0aF9wcm9qZWN0X29uX3N5c19wYXRoKHNlbGYsIGZ1bmMpOgogICAgICAgICIiIgogICAgICAgIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHByb2plY3Rfb25fc3lzX3BhdGggY29udGV4dC4KICAgICAgICAiIiIKICAgICAgICB3aXRoIHNlbGYucHJvamVjdF9vbl9zeXNfcGF0aCgpOgogICAgICAgICAgICBmdW5jKCkKCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIHByb2plY3Rfb25fc3lzX3BhdGgoc2VsZiwgaW5jbHVkZV9kaXN0cz1bXSk6CiAgICAgICAgd2l0aF8ydG8zID0gc2l4LlBZMyBhbmQgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3VzZV8ydG8zJywgRmFsc2UpCgogICAgICAgIGlmIHdpdGhfMnRvMzoKICAgICAgICAgICAgIyBJZiB3ZSBydW4gMnRvMyB3ZSBjYW4gbm90IGRvIHRoaXMgaW5wbGFjZToKCiAgICAgICAgICAgICMgRW5zdXJlIG1ldGFkYXRhIGlzIHVwLXRvLWRhdGUKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfcHknLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICAgICAgYnB5X2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJidWlsZF9weSIpCiAgICAgICAgICAgIGJ1aWxkX3BhdGggPSBub3JtYWxpemVfcGF0aChicHlfY21kLmJ1aWxkX2xpYikKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucwogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdlZ2dfaW5mbycsIGVnZ19iYXNlPWJ1aWxkX3BhdGgpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFdpdGhvdXQgMnRvMyBpbnBsYWNlIHdvcmtzIGZpbmU6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucyBpbi1wbGFjZQogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTEpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCgogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCgogICAgICAgIG9sZF9wYXRoID0gc3lzLnBhdGhbOl0KICAgICAgICBvbGRfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmNvcHkoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHByb2plY3RfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGVpX2NtZC5lZ2dfYmFzZSkKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHByb2plY3RfcGF0aCkKICAgICAgICAgICAgd29ya2luZ19zZXQuX19pbml0X18oKQogICAgICAgICAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcihsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZSgpKQogICAgICAgICAgICByZXF1aXJlKCclcz09JXMnICUgKGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uKSkKICAgICAgICAgICAgd2l0aCBzZWxmLnBhdGhzX29uX3B5dGhvbnBhdGgoW3Byb2plY3RfcGF0aF0pOgogICAgICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzeXMucGF0aFs6XSA9IG9sZF9wYXRoCiAgICAgICAgICAgIHN5cy5tb2R1bGVzLmNsZWFyKCkKICAgICAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKG9sZF9tb2R1bGVzKQogICAgICAgICAgICB3b3JraW5nX3NldC5fX2luaXRfXygpCgogICAgQHN0YXRpY21ldGhvZAogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBwYXRoc19vbl9weXRob25wYXRoKHBhdGhzKToKICAgICAgICAiIiIKICAgICAgICBBZGQgdGhlIGluZGljYXRlZCBwYXRocyB0byB0aGUgaGVhZCBvZiB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAogICAgICAgIHZhcmlhYmxlIHNvIHRoYXQgc3VicHJvY2Vzc2VzIHdpbGwgYWxzbyBzZWUgdGhlIHBhY2thZ2VzIGF0CiAgICAgICAgdGhlc2UgcGF0aHMuCgogICAgICAgIERvIHRoaXMgaW4gYSBjb250ZXh0IHRoYXQgcmVzdG9yZXMgdGhlIHZhbHVlIG9uIGV4aXQuCiAgICAgICAgIiIiCiAgICAgICAgbm90aGluZyA9IG9iamVjdCgpCiAgICAgICAgb3JpZ19weXRob25wYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCBub3RoaW5nKQogICAgICAgIGN1cnJlbnRfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgJycpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcmVmaXggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aHMpCiAgICAgICAgICAgIHRvX2pvaW4gPSBmaWx0ZXIoTm9uZSwgW3ByZWZpeCwgY3VycmVudF9weXRob25wYXRoXSkKICAgICAgICAgICAgbmV3X3BhdGggPSBvcy5wYXRoc2VwLmpvaW4odG9fam9pbikKICAgICAgICAgICAgaWYgbmV3X3BhdGg6CiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSBuZXdfcGF0aAogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIG9yaWdfcHl0aG9ucGF0aCBpcyBub3RoaW5nOgogICAgICAgICAgICAgICAgb3MuZW52aXJvbi5wb3AoJ1BZVEhPTlBBVEgnLCBOb25lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gb3JpZ19weXRob25wYXRoCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGluc3RhbGxfZGlzdHMoZGlzdCk6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCB0aGUgcmVxdWlyZW1lbnRzIGluZGljYXRlZCBieSBzZWxmLmRpc3RyaWJ1dGlvbiBhbmQKICAgICAgICByZXR1cm4gYW4gaXRlcmFibGUgb2YgdGhlIGRpc3RzIHRoYXQgd2VyZSBidWlsdC4KICAgICAgICAiIiIKICAgICAgICBpcl9kID0gZGlzdC5mZXRjaF9idWlsZF9lZ2dzKGRpc3QuaW5zdGFsbF9yZXF1aXJlcykKICAgICAgICB0cl9kID0gZGlzdC5mZXRjaF9idWlsZF9lZ2dzKGRpc3QudGVzdHNfcmVxdWlyZSBvciBbXSkKICAgICAgICBlcl9kID0gZGlzdC5mZXRjaF9idWlsZF9lZ2dzKAogICAgICAgICAgICB2IGZvciBrLCB2IGluIGRpc3QuZXh0cmFzX3JlcXVpcmUuaXRlbXMoKQogICAgICAgICAgICBpZiBrLnN0YXJ0c3dpdGgoJzonKSBhbmQgZXZhbHVhdGVfbWFya2VyKGtbMTpdKQogICAgICAgICkKICAgICAgICByZXR1cm4gaXRlcnRvb2xzLmNoYWluKGlyX2QsIHRyX2QsIGVyX2QpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpbnN0YWxsZWRfZGlzdHMgPSBzZWxmLmluc3RhbGxfZGlzdHMoc2VsZi5kaXN0cmlidXRpb24pCgogICAgICAgIGNtZCA9ICcgJy5qb2luKHNlbGYuX2FyZ3YpCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKCdza2lwcGluZyAiJXMiIChkcnkgcnVuKScgJSBjbWQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmFubm91bmNlKCdydW5uaW5nICIlcyInICUgY21kKQoKICAgICAgICBwYXRocyA9IG1hcChvcGVyYXRvci5hdHRyZ2V0dGVyKCdsb2NhdGlvbicpLCBpbnN0YWxsZWRfZGlzdHMpCiAgICAgICAgd2l0aCBzZWxmLnBhdGhzX29uX3B5dGhvbnBhdGgocGF0aHMpOgogICAgICAgICAgICB3aXRoIHNlbGYucHJvamVjdF9vbl9zeXNfcGF0aCgpOgogICAgICAgICAgICAgICAgc2VsZi5ydW5fdGVzdHMoKQoKICAgIGRlZiBydW5fdGVzdHMoc2VsZik6CiAgICAgICAgIyBQdXJnZSBtb2R1bGVzIHVuZGVyIHRlc3QgZnJvbSBzeXMubW9kdWxlcy4gVGhlIHRlc3QgbG9hZGVyIHdpbGwKICAgICAgICAjIHJlLWltcG9ydCB0aGVtIGZyb20gdGhlIGJ1aWxkIGxvY2F0aW9uLiBSZXF1aXJlZCB3aGVuIDJ0bzMgaXMgdXNlZAogICAgICAgICMgd2l0aCBuYW1lc3BhY2UgcGFja2FnZXMuCiAgICAgICAgaWYgc2l4LlBZMyBhbmQgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3VzZV8ydG8zJywgRmFsc2UpOgogICAgICAgICAgICBtb2R1bGUgPSBzZWxmLnRlc3Rfc3VpdGUuc3BsaXQoJy4nKVswXQogICAgICAgICAgICBpZiBtb2R1bGUgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgIGRlbF9tb2R1bGVzID0gW10KICAgICAgICAgICAgICAgIGlmIG1vZHVsZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBkZWxfbW9kdWxlcy5hcHBlbmQobW9kdWxlKQogICAgICAgICAgICAgICAgbW9kdWxlICs9ICcuJwogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKG1vZHVsZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbF9tb2R1bGVzLmFwcGVuZChuYW1lKQogICAgICAgICAgICAgICAgbGlzdChtYXAoc3lzLm1vZHVsZXMuX19kZWxpdGVtX18sIGRlbF9tb2R1bGVzKSkKCiAgICAgICAgdGVzdCA9IHVuaXR0ZXN0Lm1haW4oCiAgICAgICAgICAgIE5vbmUsIE5vbmUsIHNlbGYuX2FyZ3YsCiAgICAgICAgICAgIHRlc3RMb2FkZXI9c2VsZi5fcmVzb2x2ZV9hc19lcChzZWxmLnRlc3RfbG9hZGVyKSwKICAgICAgICAgICAgdGVzdFJ1bm5lcj1zZWxmLl9yZXNvbHZlX2FzX2VwKHNlbGYudGVzdF9ydW5uZXIpLAogICAgICAgICAgICBleGl0PUZhbHNlLAogICAgICAgICkKICAgICAgICBpZiBub3QgdGVzdC5yZXN1bHQud2FzU3VjY2Vzc2Z1bCgpOgogICAgICAgICAgICBtc2cgPSAnVGVzdCBmYWlsZWQ6ICVzJyAlIHRlc3QucmVzdWx0CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuRVJST1IpCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfYXJndihzZWxmKToKICAgICAgICByZXR1cm4gWyd1bml0dGVzdCddICsgc2VsZi50ZXN0X2FyZ3MKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Jlc29sdmVfYXNfZXAodmFsKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIHRoZSBpbmRpY2F0ZWQgYXR0cmlidXRlIHZhbHVlLCBjYWxsZWQsIGFzIGEgYXMgaWYgaXQgd2VyZQogICAgICAgIHNwZWNpZmllZCBhcyBhbiBlbnRyeSBwb2ludC4KICAgICAgICAiIiIKICAgICAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcGFyc2VkID0gRW50cnlQb2ludC5wYXJzZSgieD0iICsgdmFsKQogICAgICAgIHJldHVybiBwYXJzZWQucmVzb2x2ZSgpKCkKUEsDBBQAAAAAAAAAIQDZJItnlAQAAJQEAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHlpbXBvcnQgZ2V0cGFzcwpmcm9tIGRpc3R1dGlscy5jb21tYW5kIGltcG9ydCB1cGxvYWQgYXMgb3JpZwoKCmNsYXNzIHVwbG9hZChvcmlnLnVwbG9hZCk6CiAgICAiIiIKICAgIE92ZXJyaWRlIGRlZmF1bHQgdXBsb2FkIGJlaGF2aW9yIHRvIG9idGFpbiBwYXNzd29yZAogICAgaW4gYSB2YXJpZXR5IG9mIGRpZmZlcmVudCB3YXlzLgogICAgIiIiCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy51cGxvYWQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYudXNlcm5hbWUgPSAoCiAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgb3IKICAgICAgICAgICAgZ2V0cGFzcy5nZXR1c2VyKCkKICAgICAgICApCiAgICAgICAgIyBBdHRlbXB0IHRvIG9idGFpbiBwYXNzd29yZC4gU2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGF0IHRoZSBmaXJzdAogICAgICAgICMgc2lnbiBvZiBzdWNjZXNzLgogICAgICAgIHNlbGYucGFzc3dvcmQgPSAoCiAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgb3IKICAgICAgICAgICAgc2VsZi5fbG9hZF9wYXNzd29yZF9mcm9tX2tleXJpbmcoKSBvcgogICAgICAgICAgICBzZWxmLl9wcm9tcHRfZm9yX3Bhc3N3b3JkKCkKICAgICAgICApCgogICAgZGVmIF9sb2FkX3Bhc3N3b3JkX2Zyb21fa2V5cmluZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIGxvYWQgcGFzc3dvcmQgZnJvbSBrZXlyaW5nLiBTdXBwcmVzcyBFeGNlcHRpb25zLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAga2V5cmluZyA9IF9faW1wb3J0X18oJ2tleXJpbmcnKQogICAgICAgICAgICByZXR1cm4ga2V5cmluZy5nZXRfcGFzc3dvcmQoc2VsZi5yZXBvc2l0b3J5LCBzZWxmLnVzZXJuYW1lKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgX3Byb21wdF9mb3JfcGFzc3dvcmQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUHJvbXB0IGZvciBhIHBhc3N3b3JkIG9uIHRoZSB0dHkuIFN1cHByZXNzIEV4Y2VwdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZ2V0cGFzcy5nZXRwYXNzKCkKICAgICAgICBleGNlcHQgKEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgogICAgICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEA8pfzxo8cAACPHAAARgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkX2RvY3MucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoiIiJ1cGxvYWRfZG9jcwoKSW1wbGVtZW50cyBhIERpc3R1dGlscyAndXBsb2FkX2RvY3MnIHN1YmNvbW1hbmQgKHVwbG9hZCBkb2N1bWVudGF0aW9uIHRvClB5UEkncyBweXRob25ob3N0ZWQub3JnKS4KIiIiCgpmcm9tIGJhc2U2NCBpbXBvcnQgc3RhbmRhcmRfYjY0ZW5jb2RlCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgppbXBvcnQgb3MKaW1wb3J0IHNvY2tldAppbXBvcnQgemlwZmlsZQppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHNodXRpbAppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBmdW5jdG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQsIHVybGxpYgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBpdGVyX2VudHJ5X3BvaW50cwpmcm9tIC51cGxvYWQgaW1wb3J0IHVwbG9hZAoKCmRlZiBfZW5jb2RlKHMpOgogICAgZXJyb3JzID0gJ3N1cnJvZ2F0ZWVzY2FwZScgaWYgc2l4LlBZMyBlbHNlICdzdHJpY3QnCiAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JywgZXJyb3JzKQoKCmNsYXNzIHVwbG9hZF9kb2NzKHVwbG9hZCk6CiAgICAjIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlcG9zaXRvcnkgYXMgdXBsb2FkX2RvY3MgaXNuJ3QKICAgICMgc3VwcG9ydGVkIGJ5IFdhcmVob3VzZSAoYW5kIHdvbid0IGJlKS4KICAgIERFRkFVTFRfUkVQT1NJVE9SWSA9ICdodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpLycKCiAgICBkZXNjcmlwdGlvbiA9ICdVcGxvYWQgZG9jdW1lbnRhdGlvbiB0byBQeVBJJwoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3JlcG9zaXRvcnk9JywgJ3InLAogICAgICAgICAidXJsIG9mIHJlcG9zaXRvcnkgW2RlZmF1bHQ6ICVzXSIgJSB1cGxvYWQuREVGQVVMVF9SRVBPU0lUT1JZKSwKICAgICAgICAoJ3Nob3ctcmVzcG9uc2UnLCBOb25lLAogICAgICAgICAnZGlzcGxheSBmdWxsIHJlc3BvbnNlIHRleHQgZnJvbSBzZXJ2ZXInKSwKICAgICAgICAoJ3VwbG9hZC1kaXI9JywgTm9uZSwgJ2RpcmVjdG9yeSB0byB1cGxvYWQnKSwKICAgIF0KICAgIGJvb2xlYW5fb3B0aW9ucyA9IHVwbG9hZC5ib29sZWFuX29wdGlvbnMKCiAgICBkZWYgaGFzX3NwaGlueChzZWxmKToKICAgICAgICBpZiBzZWxmLnVwbG9hZF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgZm9yIGVwIGluIGl0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnLCAnYnVpbGRfc3BoaW54Jyk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHN1Yl9jb21tYW5kcyA9IFsoJ2J1aWxkX3NwaGlueCcsIGhhc19zcGhpbngpXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgdXBsb2FkLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYudXBsb2FkX2RpciA9IE5vbmUKICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgdXBsb2FkLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLnVwbG9hZF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5oYXNfc3BoaW54KCk6CiAgICAgICAgICAgICAgICBidWlsZF9zcGhpbnggPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc3BoaW54JykKICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IGJ1aWxkX3NwaGlueC5idWlsZGVyX3RhcmdldF9kaXIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IG9zLnBhdGguam9pbihidWlsZC5idWlsZF9iYXNlLCAnZG9jcycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5lbnN1cmVfZGlybmFtZSgndXBsb2FkX2RpcicpCiAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IHNlbGYudXBsb2FkX2RpcgogICAgICAgIGlmICdweXBpLnB5dGhvbi5vcmcnIGluIHNlbGYucmVwb3NpdG9yeToKICAgICAgICAgICAgbG9nLndhcm4oIlVwbG9hZF9kb2NzIGNvbW1hbmQgaXMgZGVwcmVjYXRlZC4gVXNlIFJURCBpbnN0ZWFkLiIpCiAgICAgICAgc2VsZi5hbm5vdW5jZSgnVXNpbmcgdXBsb2FkIGRpcmVjdG9yeSAlcycgJSBzZWxmLnRhcmdldF9kaXIpCgogICAgZGVmIGNyZWF0ZV96aXBmaWxlKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSwgInciKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi50YXJnZXRfZGlyKSAgIyBqdXN0IGluIGNhc2UKICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi50YXJnZXRfZGlyKToKICAgICAgICAgICAgICAgIGlmIHJvb3QgPT0gc2VsZi50YXJnZXRfZGlyIGFuZCBub3QgZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgdG1wbCA9ICJubyBmaWxlcyBmb3VuZCBpbiB1cGxvYWQgZGlyZWN0b3J5ICclcyciCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IodG1wbCAlIHNlbGYudGFyZ2V0X2RpcikKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgIGZ1bGwgPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSA9IHJvb3RbbGVuKHNlbGYudGFyZ2V0X2Rpcik6XS5sc3RyaXAob3MucGF0aC5zZXApCiAgICAgICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihyZWxhdGl2ZSwgbmFtZSkKICAgICAgICAgICAgICAgICAgICB6aXBfZmlsZS53cml0ZShmdWxsLCBkZXN0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHppcF9maWxlLmNsb3NlKCkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgUnVuIHN1YiBjb21tYW5kcwogICAgICAgIGZvciBjbWRfbmFtZSBpbiBzZWxmLmdldF9zdWJfY29tbWFuZHMoKToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKCiAgICAgICAgdG1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgIG5hbWUgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS5nZXRfbmFtZSgpCiAgICAgICAgemlwX2ZpbGUgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgIiVzLnppcCIgJSBuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jcmVhdGVfemlwZmlsZSh6aXBfZmlsZSkKICAgICAgICAgICAgc2VsZi51cGxvYWRfZmlsZSh6aXBfZmlsZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzaHV0aWwucm10cmVlKHRtcF9kaXIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9idWlsZF9wYXJ0KGl0ZW0sIHNlcF9ib3VuZGFyeSk6CiAgICAgICAga2V5LCB2YWx1ZXMgPSBpdGVtCiAgICAgICAgdGl0bGUgPSAnXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicgJSBrZXkKICAgICAgICAjIGhhbmRsZSBtdWx0aXBsZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBuYW1lCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWVzLCBsaXN0KToKICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc10KICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICB0aXRsZSArPSAnOyBmaWxlbmFtZT0iJXMiJyAlIHZhbHVlWzBdCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IF9lbmNvZGUodmFsdWUpCiAgICAgICAgICAgIHlpZWxkIHNlcF9ib3VuZGFyeQogICAgICAgICAgICB5aWVsZCBfZW5jb2RlKHRpdGxlKQogICAgICAgICAgICB5aWVsZCBiIlxuXG4iCiAgICAgICAgICAgIHlpZWxkIHZhbHVlCiAgICAgICAgICAgIGlmIHZhbHVlIGFuZCB2YWx1ZVstMTpdID09IGInXHInOgogICAgICAgICAgICAgICAgeWllbGQgYidcbicgICMgd3JpdGUgYW4gZXh0cmEgbmV3bGluZSAobHVydmUgTWFjcykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfbXVsdGlwYXJ0KGNscywgZGF0YSk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgdXAgdGhlIE1JTUUgcGF5bG9hZCBmb3IgdGhlIFBPU1QgZGF0YQogICAgICAgICIiIgogICAgICAgIGJvdW5kYXJ5ID0gYictLS0tLS0tLS0tLS0tLUdIU0tGSkRMR0RTNzU0M0ZKS0xGSFJFNzU2NDI3NTY3NDMyNTQnCiAgICAgICAgc2VwX2JvdW5kYXJ5ID0gYidcbi0tJyArIGJvdW5kYXJ5CiAgICAgICAgZW5kX2JvdW5kYXJ5ID0gc2VwX2JvdW5kYXJ5ICsgYictLScKICAgICAgICBlbmRfaXRlbXMgPSBlbmRfYm91bmRhcnksIGIiXG4iLAogICAgICAgIGJ1aWxkZXIgPSBmdW5jdG9vbHMucGFydGlhbCgKICAgICAgICAgICAgY2xzLl9idWlsZF9wYXJ0LAogICAgICAgICAgICBzZXBfYm91bmRhcnk9c2VwX2JvdW5kYXJ5LAogICAgICAgICkKICAgICAgICBwYXJ0X2dyb3VwcyA9IG1hcChidWlsZGVyLCBkYXRhLml0ZW1zKCkpCiAgICAgICAgcGFydHMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShwYXJ0X2dyb3VwcykKICAgICAgICBib2R5X2l0ZW1zID0gaXRlcnRvb2xzLmNoYWluKHBhcnRzLCBlbmRfaXRlbXMpCiAgICAgICAgY29udGVudF90eXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzJyAlIGJvdW5kYXJ5LmRlY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiBiJycuam9pbihib2R5X2l0ZW1zKSwgY29udGVudF90eXBlCgogICAgZGVmIHVwbG9hZF9maWxlKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQogICAgICAgIG1ldGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQogICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICc6YWN0aW9uJzogJ2RvY191cGxvYWQnLAogICAgICAgICAgICAnbmFtZSc6IG1ldGEuZ2V0X25hbWUoKSwKICAgICAgICAgICAgJ2NvbnRlbnQnOiAob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIGNvbnRlbnQpLAogICAgICAgIH0KICAgICAgICAjIHNldCB1cCB0aGUgYXV0aGVudGljYXRpb24KICAgICAgICBjcmVkZW50aWFscyA9IF9lbmNvZGUoc2VsZi51c2VybmFtZSArICc6JyArIHNlbGYucGFzc3dvcmQpCiAgICAgICAgY3JlZGVudGlhbHMgPSBzdGFuZGFyZF9iNjRlbmNvZGUoY3JlZGVudGlhbHMpCiAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgY3JlZGVudGlhbHMgPSBjcmVkZW50aWFscy5kZWNvZGUoJ2FzY2lpJykKICAgICAgICBhdXRoID0gIkJhc2ljICIgKyBjcmVkZW50aWFscwoKICAgICAgICBib2R5LCBjdCA9IHNlbGYuX2J1aWxkX211bHRpcGFydChkYXRhKQoKICAgICAgICBtc2cgPSAiU3VibWl0dGluZyBkb2N1bWVudGF0aW9uIHRvICVzIiAlIChzZWxmLnJlcG9zaXRvcnkpCiAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5JTkZPKQoKICAgICAgICAjIGJ1aWxkIHRoZSBSZXF1ZXN0CiAgICAgICAgIyBXZSBjYW4ndCB1c2UgdXJsbGliMiBzaW5jZSB3ZSBuZWVkIHRvIHNlbmQgdGhlIEJhc2ljCiAgICAgICAgIyBhdXRoIHJpZ2h0IHdpdGggdGhlIGZpcnN0IHJlcXVlc3QKICAgICAgICBzY2hlbWEsIG5ldGxvYywgdXJsLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudHMgPSBcCiAgICAgICAgICAgIHVybGxpYi5wYXJzZS51cmxwYXJzZShzZWxmLnJlcG9zaXRvcnkpCiAgICAgICAgYXNzZXJ0IG5vdCBwYXJhbXMgYW5kIG5vdCBxdWVyeSBhbmQgbm90IGZyYWdtZW50cwogICAgICAgIGlmIHNjaGVtYSA9PSAnaHR0cCc6CiAgICAgICAgICAgIGNvbm4gPSBodHRwX2NsaWVudC5IVFRQQ29ubmVjdGlvbihuZXRsb2MpCiAgICAgICAgZWxpZiBzY2hlbWEgPT0gJ2h0dHBzJzoKICAgICAgICAgICAgY29ubiA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbihuZXRsb2MpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoInVuc3VwcG9ydGVkIHNjaGVtYSAiICsgc2NoZW1hKQoKICAgICAgICBkYXRhID0gJycKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uY29ubmVjdCgpCiAgICAgICAgICAgIGNvbm4ucHV0cmVxdWVzdCgiUE9TVCIsIHVybCkKICAgICAgICAgICAgY29udGVudF90eXBlID0gY3QKICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScsIGNvbnRlbnRfdHlwZSkKICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJywgc3RyKGxlbihib2R5KSkpCiAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCdBdXRob3JpemF0aW9uJywgYXV0aCkKICAgICAgICAgICAgY29ubi5lbmRoZWFkZXJzKCkKICAgICAgICAgICAgY29ubi5zZW5kKGJvZHkpCiAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKHN0cihlKSwgbG9nLkVSUk9SKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgciA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgIGlmIHIuc3RhdHVzID09IDIwMDoKICAgICAgICAgICAgbXNnID0gJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycgJSAoci5zdGF0dXMsIHIucmVhc29uKQogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCiAgICAgICAgZWxpZiByLnN0YXR1cyA9PSAzMDE6CiAgICAgICAgICAgIGxvY2F0aW9uID0gci5nZXRoZWFkZXIoJ0xvY2F0aW9uJykKICAgICAgICAgICAgaWYgbG9jYXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gJ2h0dHBzOi8vcHl0aG9uaG9zdGVkLm9yZy8lcy8nICUgbWV0YS5nZXRfbmFtZSgpCiAgICAgICAgICAgIG1zZyA9ICdVcGxvYWQgc3VjY2Vzc2Z1bC4gVmlzaXQgJXMnICUgbG9jYXRpb24KICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5JTkZPKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1zZyA9ICdVcGxvYWQgZmFpbGVkICglcyk6ICVzJyAlIChyLnN0YXR1cywgci5yZWFzb24pCiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuRVJST1IpCiAgICAgICAgaWYgc2VsZi5zaG93X3Jlc3BvbnNlOgogICAgICAgICAgICBwcmludCgnLScgKiA3NSwgci5yZWFkKCksICctJyAqIDc1KQpQSwMEFAAAAAAAAAAhAIlHECSxPwAAsT8AADkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb25maWcucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgdW5pY29kZV9saXRlcmFscwppbXBvcnQgaW8KaW1wb3J0IG9zCmltcG9ydCBzeXMKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwKZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc0ZpbGVFcnJvcgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeCBpbXBvcnQgc3RyaW5nX3R5cGVzCgoKZGVmIHJlYWRfY29uZmlndXJhdGlvbigKICAgICAgICBmaWxlcGF0aCwgZmluZF9vdGhlcnM9RmFsc2UsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICIiIlJlYWQgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlIGFuZCByZXR1cm5zIG9wdGlvbnMgZnJvbSBpdCBhcyBhIGRpY3QuCgogICAgOnBhcmFtIHN0cnx1bmljb2RlIGZpbGVwYXRoOiBQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZQogICAgICAgIHRvIGdldCBvcHRpb25zIGZyb20uCgogICAgOnBhcmFtIGJvb2wgZmluZF9vdGhlcnM6IFdoZXRoZXIgdG8gc2VhcmNoIGZvciBvdGhlciBjb25maWd1cmF0aW9uIGZpbGVzCiAgICAgICAgd2hpY2ggY291bGQgYmUgb24gaW4gdmFyaW91cyBwbGFjZXMuCgogICAgOnBhcmFtIGJvb2wgaWdub3JlX29wdGlvbl9lcnJvcnM6IFdoZXRoZXIgdG8gc2lsZW50bHkgaWdub3JlCiAgICAgICAgb3B0aW9ucywgdmFsdWVzIG9mIHdoaWNoIGNvdWxkIG5vdCBiZSByZXNvbHZlZCAoZS5nLiBkdWUgdG8gZXhjZXB0aW9ucwogICAgICAgIGluIGRpcmVjdGl2ZXMgc3VjaCBhcyBmaWxlOiwgYXR0cjosIGV0Yy4pLgogICAgICAgIElmIEZhbHNlIGV4Y2VwdGlvbnMgYXJlIHByb3BhZ2F0ZWQgYXMgZXhwZWN0ZWQuCgogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKICAgIGZyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24sIF9EaXN0cmlidXRpb24KCiAgICBmaWxlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChmaWxlcGF0aCkKCiAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZXBhdGgpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKICAgICAgICAgICAgJ0NvbmZpZ3VyYXRpb24gZmlsZSAlcyBkb2VzIG5vdCBleGlzdC4nICUgZmlsZXBhdGgpCgogICAgY3VycmVudF9kaXJlY3RvcnkgPSBvcy5nZXRjd2QoKQogICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKGZpbGVwYXRoKSkKCiAgICB0cnk6CiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCgogICAgICAgIGZpbGVuYW1lcyA9IGRpc3QuZmluZF9jb25maWdfZmlsZXMoKSBpZiBmaW5kX290aGVycyBlbHNlIFtdCiAgICAgICAgaWYgZmlsZXBhdGggbm90IGluIGZpbGVuYW1lczoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChmaWxlcGF0aCkKCiAgICAgICAgX0Rpc3RyaWJ1dGlvbi5wYXJzZV9jb25maWdfZmlsZXMoZGlzdCwgZmlsZW5hbWVzPWZpbGVuYW1lcykKCiAgICAgICAgaGFuZGxlcnMgPSBwYXJzZV9jb25maWd1cmF0aW9uKAogICAgICAgICAgICBkaXN0LCBkaXN0LmNvbW1hbmRfb3B0aW9ucywKICAgICAgICAgICAgaWdub3JlX29wdGlvbl9lcnJvcnM9aWdub3JlX29wdGlvbl9lcnJvcnMpCgogICAgZmluYWxseToKICAgICAgICBvcy5jaGRpcihjdXJyZW50X2RpcmVjdG9yeSkKCiAgICByZXR1cm4gY29uZmlndXJhdGlvbl90b19kaWN0KGhhbmRsZXJzKQoKCmRlZiBjb25maWd1cmF0aW9uX3RvX2RpY3QoaGFuZGxlcnMpOgogICAgIiIiUmV0dXJucyBjb25maWd1cmF0aW9uIGRhdGEgZ2F0aGVyZWQgYnkgZ2l2ZW4gaGFuZGxlcnMgYXMgYSBkaWN0LgoKICAgIDpwYXJhbSBsaXN0W0NvbmZpZ0hhbmRsZXJdIGhhbmRsZXJzOiBIYW5kbGVycyBsaXN0LAogICAgICAgIHVzdWFsbHkgZnJvbSBwYXJzZV9jb25maWd1cmF0aW9uKCkKCiAgICA6cnR5cGU6IGRpY3QKICAgICIiIgogICAgY29uZmlnX2RpY3QgPSBkZWZhdWx0ZGljdChkaWN0KQoKICAgIGZvciBoYW5kbGVyIGluIGhhbmRsZXJzOgoKICAgICAgICBvYmpfYWxpYXMgPSBoYW5kbGVyLnNlY3Rpb25fcHJlZml4CiAgICAgICAgdGFyZ2V0X29iaiA9IGhhbmRsZXIudGFyZ2V0X29iagoKICAgICAgICBmb3Igb3B0aW9uIGluIGhhbmRsZXIuc2V0X29wdGlvbnM6CiAgICAgICAgICAgIGdldHRlciA9IGdldGF0dHIodGFyZ2V0X29iaiwgJ2dldF8lcycgJSBvcHRpb24sIE5vbmUpCgogICAgICAgICAgICBpZiBnZXR0ZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cih0YXJnZXRfb2JqLCBvcHRpb24pCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBnZXR0ZXIoKQoKICAgICAgICAgICAgY29uZmlnX2RpY3Rbb2JqX2FsaWFzXVtvcHRpb25dID0gdmFsdWUKCiAgICByZXR1cm4gY29uZmlnX2RpY3QKCgpkZWYgcGFyc2VfY29uZmlndXJhdGlvbigKICAgICAgICBkaXN0cmlidXRpb24sIGNvbW1hbmRfb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UpOgogICAgIiIiUGVyZm9ybXMgYWRkaXRpb25hbCBwYXJzaW5nIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwogICAgZm9yIGEgZGlzdHJpYnV0aW9uLgoKICAgIFJldHVybnMgYSBsaXN0IG9mIHVzZWQgb3B0aW9uIGhhbmRsZXJzLgoKICAgIDpwYXJhbSBEaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uOgogICAgOnBhcmFtIGRpY3QgY29tbWFuZF9vcHRpb25zOgogICAgOnBhcmFtIGJvb2wgaWdub3JlX29wdGlvbl9lcnJvcnM6IFdoZXRoZXIgdG8gc2lsZW50bHkgaWdub3JlCiAgICAgICAgb3B0aW9ucywgdmFsdWVzIG9mIHdoaWNoIGNvdWxkIG5vdCBiZSByZXNvbHZlZCAoZS5nLiBkdWUgdG8gZXhjZXB0aW9ucwogICAgICAgIGluIGRpcmVjdGl2ZXMgc3VjaCBhcyBmaWxlOiwgYXR0cjosIGV0Yy4pLgogICAgICAgIElmIEZhbHNlIGV4Y2VwdGlvbnMgYXJlIHByb3BhZ2F0ZWQgYXMgZXhwZWN0ZWQuCiAgICA6cnR5cGU6IGxpc3QKICAgICIiIgogICAgbWV0YSA9IENvbmZpZ01ldGFkYXRhSGFuZGxlcigKICAgICAgICBkaXN0cmlidXRpb24ubWV0YWRhdGEsIGNvbW1hbmRfb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnMpCiAgICBtZXRhLnBhcnNlKCkKCiAgICBvcHRpb25zID0gQ29uZmlnT3B0aW9uc0hhbmRsZXIoCiAgICAgICAgZGlzdHJpYnV0aW9uLCBjb21tYW5kX29wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzKQogICAgb3B0aW9ucy5wYXJzZSgpCgogICAgcmV0dXJuIFttZXRhLCBvcHRpb25zXQoKCmNsYXNzIENvbmZpZ0hhbmRsZXIob2JqZWN0KToKICAgICIiIkhhbmRsZXMgbWV0YWRhdGEgc3VwcGxpZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4iIiIKCiAgICBzZWN0aW9uX3ByZWZpeCA9IE5vbmUKICAgICIiIlByZWZpeCBmb3IgY29uZmlnIHNlY3Rpb25zIGhhbmRsZWQgYnkgdGhpcyBoYW5kbGVyLgogICAgTXVzdCBiZSBwcm92aWRlZCBieSBjbGFzcyBoZWlycy4KCiAgICAiIiIKCiAgICBhbGlhc2VzID0ge30KICAgICIiIk9wdGlvbnMgYWxpYXNlcy4KICAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdmFyaW91cyBwYWNrYWdlcy4gRS5nLjogZDJ0bzEgYW5kIHBici4KICAgIE5vdGU6IGAtYCBpbiBrZXlzIGlzIHJlcGxhY2VkIHdpdGggYF9gIGJ5IGNvbmZpZyBwYXJzZXIuCgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmdldF9vYmosIG9wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICAgICBzZWN0aW9ucyA9IHt9CgogICAgICAgIHNlY3Rpb25fcHJlZml4ID0gc2VsZi5zZWN0aW9uX3ByZWZpeAogICAgICAgIGZvciBzZWN0aW9uX25hbWUsIHNlY3Rpb25fb3B0aW9ucyBpbiBvcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG5vdCBzZWN0aW9uX25hbWUuc3RhcnRzd2l0aChzZWN0aW9uX3ByZWZpeCk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgc2VjdGlvbl9uYW1lID0gc2VjdGlvbl9uYW1lLnJlcGxhY2Uoc2VjdGlvbl9wcmVmaXgsICcnKS5zdHJpcCgnLicpCiAgICAgICAgICAgIHNlY3Rpb25zW3NlY3Rpb25fbmFtZV0gPSBzZWN0aW9uX29wdGlvbnMKCiAgICAgICAgc2VsZi5pZ25vcmVfb3B0aW9uX2Vycm9ycyA9IGlnbm9yZV9vcHRpb25fZXJyb3JzCiAgICAgICAgc2VsZi50YXJnZXRfb2JqID0gdGFyZ2V0X29iagogICAgICAgIHNlbGYuc2VjdGlvbnMgPSBzZWN0aW9ucwogICAgICAgIHNlbGYuc2V0X29wdGlvbnMgPSBbXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlcnMoc2VsZik6CiAgICAgICAgIiIiTWV0YWRhdGEgaXRlbSBuYW1lIHRvIHBhcnNlciBmdW5jdGlvbiBtYXBwaW5nLiIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICclcyBtdXN0IHByb3ZpZGUgLnBhcnNlcnMgcHJvcGVydHknICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG9wdGlvbl9uYW1lLCB2YWx1ZSk6CiAgICAgICAgdW5rbm93biA9IHR1cGxlKCkKICAgICAgICB0YXJnZXRfb2JqID0gc2VsZi50YXJnZXRfb2JqCgogICAgICAgICMgVHJhbnNsYXRlIGFsaWFzIGludG8gcmVhbCBuYW1lLgogICAgICAgIG9wdGlvbl9uYW1lID0gc2VsZi5hbGlhc2VzLmdldChvcHRpb25fbmFtZSwgb3B0aW9uX25hbWUpCgogICAgICAgIGN1cnJlbnRfdmFsdWUgPSBnZXRhdHRyKHRhcmdldF9vYmosIG9wdGlvbl9uYW1lLCB1bmtub3duKQoKICAgICAgICBpZiBjdXJyZW50X3ZhbHVlIGlzIHVua25vd246CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKG9wdGlvbl9uYW1lKQoKICAgICAgICBpZiBjdXJyZW50X3ZhbHVlOgogICAgICAgICAgICAjIEFscmVhZHkgaW5oYWJpdGVkLiBTa2lwcGluZy4KICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNraXBfb3B0aW9uID0gRmFsc2UKICAgICAgICBwYXJzZXIgPSBzZWxmLnBhcnNlcnMuZ2V0KG9wdGlvbl9uYW1lKQogICAgICAgIGlmIHBhcnNlcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZXIodmFsdWUpCgogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgc2tpcF9vcHRpb24gPSBUcnVlCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVfb3B0aW9uX2Vycm9yczoKICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBpZiBza2lwX29wdGlvbjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNldHRlciA9IGdldGF0dHIodGFyZ2V0X29iaiwgJ3NldF8lcycgJSBvcHRpb25fbmFtZSwgTm9uZSkKICAgICAgICBpZiBzZXR0ZXIgaXMgTm9uZToKICAgICAgICAgICAgc2V0YXR0cih0YXJnZXRfb2JqLCBvcHRpb25fbmFtZSwgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2V0dGVyKHZhbHVlKQoKICAgICAgICBzZWxmLnNldF9vcHRpb25zLmFwcGVuZChvcHRpb25fbmFtZSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfbGlzdChjbHMsIHZhbHVlLCBzZXBhcmF0b3I9JywnKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgbGlzdC4KCiAgICAgICAgVmFsdWUgaXMgc3BsaXQgZWl0aGVyIGJ5IHNlcGFyYXRvciAoZGVmYXVsdHMgdG8gY29tbWEpIG9yIGJ5IGxpbmVzLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnBhcmFtIHNlcGFyYXRvcjogTGlzdCBpdGVtcyBzZXBhcmF0b3IgY2hhcmFjdGVyLgogICAgICAgIDpydHlwZTogbGlzdAogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOiAgIyBfZ2V0X3BhcnNlcl9jb21wb3VuZCBjYXNlCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBpZiAnXG4nIGluIHZhbHVlOgogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0bGluZXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoc2VwYXJhdG9yKQoKICAgICAgICByZXR1cm4gW2NodW5rLnN0cmlwKCkgZm9yIGNodW5rIGluIHZhbHVlIGlmIGNodW5rLnN0cmlwKCldCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2RpY3QoY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIGRpY3QuCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICBzZXBhcmF0b3IgPSAnPScKICAgICAgICByZXN1bHQgPSB7fQogICAgICAgIGZvciBsaW5lIGluIGNscy5fcGFyc2VfbGlzdCh2YWx1ZSk6CiAgICAgICAgICAgIGtleSwgc2VwLCB2YWwgPSBsaW5lLnBhcnRpdGlvbihzZXBhcmF0b3IpCiAgICAgICAgICAgIGlmIHNlcCAhPSBzZXBhcmF0b3I6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHBhcnNlIG9wdGlvbiB2YWx1ZSB0byBkaWN0OiAlcycgJSB2YWx1ZSkKICAgICAgICAgICAgcmVzdWx0W2tleS5zdHJpcCgpXSA9IHZhbC5zdHJpcCgpCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfYm9vbChjbHMsIHZhbHVlKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGJvb2xlYW4uCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IGJvb2wKICAgICAgICAiIiIKICAgICAgICB2YWx1ZSA9IHZhbHVlLmxvd2VyKCkKICAgICAgICByZXR1cm4gdmFsdWUgaW4gKCcxJywgJ3RydWUnLCAneWVzJykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZmlsZShjbHMsIHZhbHVlKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgc3RyaW5nLCBhbGxvd2luZyBpbmNsdWRpbmcgdGV4dAogICAgICAgIGZyb20gbmVhcmVzdCBmaWxlcyB1c2luZyBgZmlsZTpgIGRpcmVjdGl2ZS4KCiAgICAgICAgRGlyZWN0aXZlIGlzIHNhbmRib3hlZCBhbmQgd29uJ3QgcmVhY2ggYW55dGhpbmcgb3V0c2lkZQogICAgICAgIGRpcmVjdG9yeSB3aXRoIHNldHVwLnB5LgoKICAgICAgICBFeGFtcGxlczoKICAgICAgICAgICAgZmlsZTogTElDRU5TRQogICAgICAgICAgICBmaWxlOiBSRUFETUUucnN0LCBDSEFOR0VMT0cubWQsIHNyYy9maWxlLnR4dAoKICAgICAgICA6cGFyYW0gc3RyIHZhbHVlOgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgaW5jbHVkZV9kaXJlY3RpdmUgPSAnZmlsZTonCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgaWYgbm90IHZhbHVlLnN0YXJ0c3dpdGgoaW5jbHVkZV9kaXJlY3RpdmUpOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgc3BlYyA9IHZhbHVlW2xlbihpbmNsdWRlX2RpcmVjdGl2ZSk6XQogICAgICAgIGZpbGVwYXRocyA9IChvcy5wYXRoLmFic3BhdGgocGF0aC5zdHJpcCgpKSBmb3IgcGF0aCBpbiBzcGVjLnNwbGl0KCcsJykpCiAgICAgICAgcmV0dXJuICdcbicuam9pbigKICAgICAgICAgICAgY2xzLl9yZWFkX2ZpbGUocGF0aCkKICAgICAgICAgICAgZm9yIHBhdGggaW4gZmlsZXBhdGhzCiAgICAgICAgICAgIGlmIChjbHMuX2Fzc2VydF9sb2NhbChwYXRoKSBvciBUcnVlKQogICAgICAgICAgICBhbmQgb3MucGF0aC5pc2ZpbGUocGF0aCkKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9hc3NlcnRfbG9jYWwoZmlsZXBhdGgpOgogICAgICAgIGlmIG5vdCBmaWxlcGF0aC5zdGFydHN3aXRoKG9zLmdldGN3ZCgpKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnYGZpbGU6YCBkaXJlY3RpdmUgY2FuIG5vdCBhY2Nlc3MgJXMnICUgZmlsZXBhdGgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZWFkX2ZpbGUoZmlsZXBhdGgpOgogICAgICAgIHdpdGggaW8ub3BlbihmaWxlcGF0aCwgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2F0dHIoY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIG1vZHVsZSBhdHRyaWJ1dGUuCgogICAgICAgIEV4YW1wbGVzOgogICAgICAgICAgICBhdHRyOiBwYWNrYWdlLmF0dHIKICAgICAgICAgICAgYXR0cjogcGFja2FnZS5tb2R1bGUuYXR0cgoKICAgICAgICA6cGFyYW0gc3RyIHZhbHVlOgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgYXR0cl9kaXJlY3RpdmUgPSAnYXR0cjonCiAgICAgICAgaWYgbm90IHZhbHVlLnN0YXJ0c3dpdGgoYXR0cl9kaXJlY3RpdmUpOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgYXR0cnNfcGF0aCA9IHZhbHVlLnJlcGxhY2UoYXR0cl9kaXJlY3RpdmUsICcnKS5zdHJpcCgpLnNwbGl0KCcuJykKICAgICAgICBhdHRyX25hbWUgPSBhdHRyc19wYXRoLnBvcCgpCgogICAgICAgIG1vZHVsZV9uYW1lID0gJy4nLmpvaW4oYXR0cnNfcGF0aCkKICAgICAgICBtb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lIG9yICdfX2luaXRfXycKCiAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmdldGN3ZCgpKQogICAgICAgIHRyeToKICAgICAgICAgICAgbW9kdWxlID0gaW1wb3J0X21vZHVsZShtb2R1bGVfbmFtZSkKICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG1vZHVsZSwgYXR0cl9uYW1lKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzeXMucGF0aCA9IHN5cy5wYXRoWzE6XQoKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3BhcnNlcl9jb21wb3VuZChjbHMsICpwYXJzZV9tZXRob2RzKToKICAgICAgICAiIiJSZXR1cm5zIHBhcnNlciBmdW5jdGlvbiB0byByZXByZXNlbnRzIHZhbHVlIGFzIGEgbGlzdC4KCiAgICAgICAgUGFyc2VzIGEgdmFsdWUgYXBwbHlpbmcgZ2l2ZW4gbWV0aG9kcyBvbmUgYWZ0ZXIgYW5vdGhlci4KCiAgICAgICAgOnBhcmFtIHBhcnNlX21ldGhvZHM6CiAgICAgICAgOnJ0eXBlOiBjYWxsYWJsZQogICAgICAgICIiIgogICAgICAgIGRlZiBwYXJzZSh2YWx1ZSk6CiAgICAgICAgICAgIHBhcnNlZCA9IHZhbHVlCgogICAgICAgICAgICBmb3IgbWV0aG9kIGluIHBhcnNlX21ldGhvZHM6CiAgICAgICAgICAgICAgICBwYXJzZWQgPSBtZXRob2QocGFyc2VkKQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlZAoKICAgICAgICByZXR1cm4gcGFyc2UKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2Vfc2VjdGlvbl90b19kaWN0KGNscywgc2VjdGlvbl9vcHRpb25zLCB2YWx1ZXNfcGFyc2VyPU5vbmUpOgogICAgICAgICIiIlBhcnNlcyBzZWN0aW9uIG9wdGlvbnMgaW50byBhIGRpY3Rpb25hcnkuCgogICAgICAgIE9wdGlvbmFsbHkgYXBwbGllcyBhIGdpdmVuIHBhcnNlciB0byB2YWx1ZXMuCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICA6cGFyYW0gY2FsbGFibGUgdmFsdWVzX3BhcnNlcjoKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICB2YWx1ZSA9IHt9CiAgICAgICAgdmFsdWVzX3BhcnNlciA9IHZhbHVlc19wYXJzZXIgb3IgKGxhbWJkYSB2YWw6IHZhbCkKICAgICAgICBmb3Iga2V5LCAoXywgdmFsKSBpbiBzZWN0aW9uX29wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgdmFsdWVba2V5XSA9IHZhbHVlc19wYXJzZXIodmFsKQogICAgICAgIHJldHVybiB2YWx1ZQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgZm9yIChuYW1lLCAoXywgdmFsdWUpKSBpbiBzZWN0aW9uX29wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHZhbHVlCgogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzICAjIEtlZXAgc2lsZW50IGZvciBhIG5ldyBvcHRpb24gbWF5IGFwcGVhciBhbnl0aW1lLgoKICAgIGRlZiBwYXJzZShzZWxmKToKICAgICAgICAiIiJQYXJzZXMgY29uZmlndXJhdGlvbiBmaWxlIGl0ZW1zIGZyb20gb25lCiAgICAgICAgb3IgbW9yZSByZWxhdGVkIHNlY3Rpb25zLgoKICAgICAgICAiIiIKICAgICAgICBmb3Igc2VjdGlvbl9uYW1lLCBzZWN0aW9uX29wdGlvbnMgaW4gc2VsZi5zZWN0aW9ucy5pdGVtcygpOgoKICAgICAgICAgICAgbWV0aG9kX3Bvc3RmaXggPSAnJwogICAgICAgICAgICBpZiBzZWN0aW9uX25hbWU6ICAjIFtzZWN0aW9uLm9wdGlvbl0gdmFyaWFudAogICAgICAgICAgICAgICAgbWV0aG9kX3Bvc3RmaXggPSAnXyVzJyAlIHNlY3Rpb25fbmFtZQoKICAgICAgICAgICAgc2VjdGlvbl9wYXJzZXJfbWV0aG9kID0gZ2V0YXR0cigKICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAjIERvdHMgaW4gc2VjdGlvbiBuYW1lcyBhcmUgdHJhbmxzYXRlZCBpbnRvIGR1bmRlcnNjb3Jlcy4KICAgICAgICAgICAgICAgICgncGFyc2Vfc2VjdGlvbiVzJyAlIG1ldGhvZF9wb3N0Zml4KS5yZXBsYWNlKCcuJywgJ19fJyksCiAgICAgICAgICAgICAgICBOb25lKQoKICAgICAgICAgICAgaWYgc2VjdGlvbl9wYXJzZXJfbWV0aG9kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnVW5zdXBwb3J0ZWQgZGlzdHJpYnV0aW9uIG9wdGlvbiBzZWN0aW9uOiBbJXMuJXNdJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWN0aW9uX3ByZWZpeCwgc2VjdGlvbl9uYW1lKSkKCiAgICAgICAgICAgIHNlY3Rpb25fcGFyc2VyX21ldGhvZChzZWN0aW9uX29wdGlvbnMpCgoKY2xhc3MgQ29uZmlnTWV0YWRhdGFIYW5kbGVyKENvbmZpZ0hhbmRsZXIpOgoKICAgIHNlY3Rpb25fcHJlZml4ID0gJ21ldGFkYXRhJwoKICAgIGFsaWFzZXMgPSB7CiAgICAgICAgJ2hvbWVfcGFnZSc6ICd1cmwnLAogICAgICAgICdzdW1tYXJ5JzogJ2Rlc2NyaXB0aW9uJywKICAgICAgICAnY2xhc3NpZmllcic6ICdjbGFzc2lmaWVycycsCiAgICAgICAgJ3BsYXRmb3JtJzogJ3BsYXRmb3JtcycsCiAgICB9CgogICAgc3RyaWN0X21vZGUgPSBGYWxzZQogICAgIiIiV2UgbmVlZCB0byBrZWVwIGl0IGxvb3NlLCB0byBiZSBwYXJ0aWFsbHkgY29tcGF0aWJsZSB3aXRoCiAgICBgcGJyYCBhbmQgYGQydG8xYCBwYWNrYWdlcyB3aGljaCBhbHNvIHVzZXMgYG1ldGFkYXRhYCBzZWN0aW9uLgoKICAgICIiIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlcnMoc2VsZik6CiAgICAgICAgIiIiTWV0YWRhdGEgaXRlbSBuYW1lIHRvIHBhcnNlciBmdW5jdGlvbiBtYXBwaW5nLiIiIgogICAgICAgIHBhcnNlX2xpc3QgPSBzZWxmLl9wYXJzZV9saXN0CiAgICAgICAgcGFyc2VfZmlsZSA9IHNlbGYuX3BhcnNlX2ZpbGUKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ3BsYXRmb3Jtcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdrZXl3b3Jkcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdwcm92aWRlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdyZXF1aXJlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdvYnNvbGV0ZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnY2xhc3NpZmllcnMnOiBzZWxmLl9nZXRfcGFyc2VyX2NvbXBvdW5kKHBhcnNlX2ZpbGUsIHBhcnNlX2xpc3QpLAogICAgICAgICAgICAnbGljZW5zZSc6IHBhcnNlX2ZpbGUsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHBhcnNlX2ZpbGUsCiAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uJzogcGFyc2VfZmlsZSwKICAgICAgICAgICAgJ3ZlcnNpb24nOiBzZWxmLl9wYXJzZV92ZXJzaW9uLAogICAgICAgIH0KCiAgICBkZWYgX3BhcnNlX3ZlcnNpb24oc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlBhcnNlcyBgdmVyc2lvbmAgb3B0aW9uIHZhbHVlLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBzdHIKCiAgICAgICAgIiIiCiAgICAgICAgdmVyc2lvbiA9IHNlbGYuX3BhcnNlX2F0dHIodmFsdWUpCgogICAgICAgIGlmIGNhbGxhYmxlKHZlcnNpb24pOgogICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbigpCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIGlmIGhhc2F0dHIodmVyc2lvbiwgJ19faXRlcl9fJyk6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJy4nLmpvaW4obWFwKHN0ciwgdmVyc2lvbikpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJyVzJyAlIHZlcnNpb24KCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCgpjbGFzcyBDb25maWdPcHRpb25zSGFuZGxlcihDb25maWdIYW5kbGVyKToKCiAgICBzZWN0aW9uX3ByZWZpeCA9ICdvcHRpb25zJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlcnMoc2VsZik6CiAgICAgICAgIiIiTWV0YWRhdGEgaXRlbSBuYW1lIHRvIHBhcnNlciBmdW5jdGlvbiBtYXBwaW5nLiIiIgogICAgICAgIHBhcnNlX2xpc3QgPSBzZWxmLl9wYXJzZV9saXN0CiAgICAgICAgcGFyc2VfbGlzdF9zZW1pY29sb24gPSBwYXJ0aWFsKHNlbGYuX3BhcnNlX2xpc3QsIHNlcGFyYXRvcj0nOycpCiAgICAgICAgcGFyc2VfYm9vbCA9IHNlbGYuX3BhcnNlX2Jvb2wKICAgICAgICBwYXJzZV9kaWN0ID0gc2VsZi5fcGFyc2VfZGljdAoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnemlwX3NhZmUnOiBwYXJzZV9ib29sLAogICAgICAgICAgICAndXNlXzJ0bzMnOiBwYXJzZV9ib29sLAogICAgICAgICAgICAnaW5jbHVkZV9wYWNrYWdlX2RhdGEnOiBwYXJzZV9ib29sLAogICAgICAgICAgICAncGFja2FnZV9kaXInOiBwYXJzZV9kaWN0LAogICAgICAgICAgICAndXNlXzJ0bzNfZml4ZXJzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3VzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2NvbnZlcnRfMnRvM19kb2N0ZXN0cyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdzY3JpcHRzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2VhZ2VyX3Jlc291cmNlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdkZXBlbmRlbmN5X2xpbmtzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ25hbWVzcGFjZV9wYWNrYWdlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdpbnN0YWxsX3JlcXVpcmVzJzogcGFyc2VfbGlzdF9zZW1pY29sb24sCiAgICAgICAgICAgICdzZXR1cF9yZXF1aXJlcyc6IHBhcnNlX2xpc3Rfc2VtaWNvbG9uLAogICAgICAgICAgICAndGVzdHNfcmVxdWlyZSc6IHBhcnNlX2xpc3Rfc2VtaWNvbG9uLAogICAgICAgICAgICAncGFja2FnZXMnOiBzZWxmLl9wYXJzZV9wYWNrYWdlcywKICAgICAgICAgICAgJ2VudHJ5X3BvaW50cyc6IHNlbGYuX3BhcnNlX2ZpbGUsCiAgICAgICAgICAgICdweV9tb2R1bGVzJzogcGFyc2VfbGlzdCwKICAgICAgICB9CgogICAgZGVmIF9wYXJzZV9wYWNrYWdlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiUGFyc2VzIGBwYWNrYWdlc2Agb3B0aW9uIHZhbHVlLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBsaXN0CiAgICAgICAgIiIiCiAgICAgICAgZmluZF9kaXJlY3RpdmUgPSAnZmluZDonCgogICAgICAgIGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKGZpbmRfZGlyZWN0aXZlKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX2xpc3QodmFsdWUpCgogICAgICAgICMgUmVhZCBmdW5jdGlvbiBhcmd1bWVudHMgZnJvbSBhIGRlZGljYXRlZCBzZWN0aW9uLgogICAgICAgIGZpbmRfa3dhcmdzID0gc2VsZi5wYXJzZV9zZWN0aW9uX3BhY2thZ2VzX19maW5kKAogICAgICAgICAgICBzZWxmLnNlY3Rpb25zLmdldCgncGFja2FnZXMuZmluZCcsIHt9KSkKCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBmaW5kX3BhY2thZ2VzCgogICAgICAgIHJldHVybiBmaW5kX3BhY2thZ2VzKCoqZmluZF9rd2FyZ3MpCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fcGFja2FnZXNfX2ZpbmQoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYHBhY2thZ2VzLmZpbmRgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICBUbyBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggX3BhcnNlX3BhY2thZ2VzKCkuCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBzZWN0aW9uX2RhdGEgPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3QoCiAgICAgICAgICAgIHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKCiAgICAgICAgdmFsaWRfa2V5cyA9IFsnd2hlcmUnLCAnaW5jbHVkZScsICdleGNsdWRlJ10KCiAgICAgICAgZmluZF9rd2FyZ3MgPSBkaWN0KAogICAgICAgICAgICBbKGssIHYpIGZvciBrLCB2IGluIHNlY3Rpb25fZGF0YS5pdGVtcygpIGlmIGsgaW4gdmFsaWRfa2V5cyBhbmQgdl0pCgogICAgICAgIHdoZXJlID0gZmluZF9rd2FyZ3MuZ2V0KCd3aGVyZScpCiAgICAgICAgaWYgd2hlcmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZpbmRfa3dhcmdzWyd3aGVyZSddID0gd2hlcmVbMF0gICMgY2FzdCBsaXN0IHRvIHNpbmdsZSB2YWwKCiAgICAgICAgcmV0dXJuIGZpbmRfa3dhcmdzCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fZW50cnlfcG9pbnRzKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBlbnRyeV9wb2ludHNgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgcGFyc2VkID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKICAgICAgICBzZWxmWydlbnRyeV9wb2ludHMnXSA9IHBhcnNlZAoKICAgIGRlZiBfcGFyc2VfcGFja2FnZV9kYXRhKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgcGFyc2VkID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKCiAgICAgICAgcm9vdCA9IHBhcnNlZC5nZXQoJyonKQogICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgIHBhcnNlZFsnJ10gPSByb290CiAgICAgICAgICAgIGRlbCBwYXJzZWRbJyonXQoKICAgICAgICByZXR1cm4gcGFyc2VkCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fcGFja2FnZV9kYXRhKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBwYWNrYWdlX2RhdGFgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgc2VsZlsncGFja2FnZV9kYXRhJ10gPSBzZWxmLl9wYXJzZV9wYWNrYWdlX2RhdGEoc2VjdGlvbl9vcHRpb25zKQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2V4Y2x1ZGVfcGFja2FnZV9kYXRhKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBleGNsdWRlX3BhY2thZ2VfZGF0YWAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBzZWxmWydleGNsdWRlX3BhY2thZ2VfZGF0YSddID0gc2VsZi5fcGFyc2VfcGFja2FnZV9kYXRhKAogICAgICAgICAgICBzZWN0aW9uX29wdGlvbnMpCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fZXh0cmFzX3JlcXVpcmUoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYGV4dHJhc19yZXF1aXJlYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHBhcnNlX2xpc3QgPSBwYXJ0aWFsKHNlbGYuX3BhcnNlX2xpc3QsIHNlcGFyYXRvcj0nOycpCiAgICAgICAgc2VsZlsnZXh0cmFzX3JlcXVpcmUnXSA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdCgKICAgICAgICAgICAgc2VjdGlvbl9vcHRpb25zLCBwYXJzZV9saXN0KQpQSwMEFAAAAAAAAAAhABoiBDKnAwAApwMAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kZXBfdXRpbC5weWZyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9ncm91cAoKIyB5ZXMsIHRoaXMgaXMgd2FzIGFsbW9zdCBlbnRpcmVseSBjb3B5LXBhc3RlZCBmcm9tCiMgJ25ld2VyX3BhaXJ3aXNlKCknLCB0aGlzIGlzIGp1c3QgYW5vdGhlciBjb252ZW5pZW5jZQojIGZ1bmN0aW9uLgpkZWYgbmV3ZXJfcGFpcndpc2VfZ3JvdXAoc291cmNlc19ncm91cHMsIHRhcmdldHMpOgogICAgIiIiV2FsayBib3RoIGFyZ3VtZW50cyBpbiBwYXJhbGxlbCwgdGVzdGluZyBpZiBlYWNoIHNvdXJjZSBncm91cCBpcyBuZXdlcgogICAgdGhhbiBpdHMgY29ycmVzcG9uZGluZyB0YXJnZXQuIFJldHVybnMgYSBwYWlyIG9mIGxpc3RzIChzb3VyY2VzX2dyb3VwcywKICAgIHRhcmdldHMpIHdoZXJlIHNvdXJjZXMgaXMgbmV3ZXIgdGhhbiB0YXJnZXQsIGFjY29yZGluZyB0byB0aGUgc2VtYW50aWNzCiAgICBvZiAnbmV3ZXJfZ3JvdXAoKScuCiAgICAiIiIKICAgIGlmIGxlbihzb3VyY2VzX2dyb3VwcykgIT0gbGVuKHRhcmdldHMpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIidzb3VyY2VzX2dyb3VwJyBhbmQgJ3RhcmdldHMnIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIikKCiAgICAjIGJ1aWxkIGEgcGFpciBvZiBsaXN0cyAoc291cmNlc19ncm91cHMsIHRhcmdldHMpIHdoZXJlIHNvdXJjZSBpcyBuZXdlcgogICAgbl9zb3VyY2VzID0gW10KICAgIG5fdGFyZ2V0cyA9IFtdCiAgICBmb3IgaSBpbiByYW5nZShsZW4oc291cmNlc19ncm91cHMpKToKICAgICAgICBpZiBuZXdlcl9ncm91cChzb3VyY2VzX2dyb3Vwc1tpXSwgdGFyZ2V0c1tpXSk6CiAgICAgICAgICAgIG5fc291cmNlcy5hcHBlbmQoc291cmNlc19ncm91cHNbaV0pCiAgICAgICAgICAgIG5fdGFyZ2V0cy5hcHBlbmQodGFyZ2V0c1tpXSkKCiAgICByZXR1cm4gbl9zb3VyY2VzLCBuX3RhcmdldHMKUEsDBBQAAAAAAAAAIQBbKS1qzRYAAM0WAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGVwZW5kcy5weWltcG9ydCBzeXMKaW1wb3J0IGltcAppbXBvcnQgbWFyc2hhbApmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBTdHJpY3RWZXJzaW9uCmZyb20gaW1wIGltcG9ydCBQS0dfRElSRUNUT1JZLCBQWV9DT01QSUxFRCwgUFlfU09VUkNFLCBQWV9GUk9aRU4KCmZyb20gLnB5MzNjb21wYXQgaW1wb3J0IEJ5dGVjb2RlCgoKX19hbGxfXyA9IFsKICAgICdSZXF1aXJlJywgJ2ZpbmRfbW9kdWxlJywgJ2dldF9tb2R1bGVfY29uc3RhbnQnLCAnZXh0cmFjdF9jb25zdGFudCcKXQoKCmNsYXNzIFJlcXVpcmU6CiAgICAiIiJBIHByZXJlcXVpc2l0ZSB0byBidWlsZGluZyBvciBpbnN0YWxsaW5nIGEgZGlzdHJpYnV0aW9uIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHJlcXVlc3RlZF92ZXJzaW9uLCBtb2R1bGUsIGhvbWVwYWdlPScnLAogICAgICAgICAgICBhdHRyaWJ1dGU9Tm9uZSwgZm9ybWF0PU5vbmUpOgoKICAgICAgICBpZiBmb3JtYXQgaXMgTm9uZSBhbmQgcmVxdWVzdGVkX3ZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvcm1hdCA9IFN0cmljdFZlcnNpb24KCiAgICAgICAgaWYgZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXF1ZXN0ZWRfdmVyc2lvbiA9IGZvcm1hdChyZXF1ZXN0ZWRfdmVyc2lvbikKICAgICAgICAgICAgaWYgYXR0cmlidXRlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAnX192ZXJzaW9uX18nCgogICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGxvY2FscygpKQogICAgICAgIGRlbCBzZWxmLnNlbGYKCiAgICBkZWYgZnVsbF9uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBmdWxsIHBhY2thZ2UvZGlzdHJpYnV0aW9uIG5hbWUsIHcvdmVyc2lvbiIiIgogICAgICAgIGlmIHNlbGYucmVxdWVzdGVkX3ZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbikKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgZGVmIHZlcnNpb25fb2soc2VsZiwgdmVyc2lvbik6CiAgICAgICAgIiIiSXMgJ3ZlcnNpb24nIHN1ZmZpY2llbnRseSB1cC10by1kYXRlPyIiIgogICAgICAgIHJldHVybiBzZWxmLmF0dHJpYnV0ZSBpcyBOb25lIG9yIHNlbGYuZm9ybWF0IGlzIE5vbmUgb3IgXAogICAgICAgICAgICBzdHIodmVyc2lvbikgIT0gInVua25vd24iIGFuZCB2ZXJzaW9uID49IHNlbGYucmVxdWVzdGVkX3ZlcnNpb24KCiAgICBkZWYgZ2V0X3ZlcnNpb24oc2VsZiwgcGF0aHM9Tm9uZSwgZGVmYXVsdD0idW5rbm93biIpOgogICAgICAgICIiIkdldCB2ZXJzaW9uIG51bWJlciBvZiBpbnN0YWxsZWQgbW9kdWxlLCAnTm9uZScsIG9yICdkZWZhdWx0JwoKICAgICAgICBTZWFyY2ggJ3BhdGhzJyBmb3IgbW9kdWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm4gJ05vbmUnLiAgSWYgZm91bmQsCiAgICAgICAgcmV0dXJuIHRoZSBleHRyYWN0ZWQgdmVyc2lvbiBhdHRyaWJ1dGUsIG9yICdkZWZhdWx0JyBpZiBubyB2ZXJzaW9uCiAgICAgICAgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aXRob3V0CiAgICAgICAgaW1wb3J0aW5nIHRoZSBtb2R1bGUuICBUaGUgdmVyc2lvbiBpcyBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZQogICAgICAgIHJlcXVpcmVtZW50J3MgdmVyc2lvbiBmb3JtYXQgKGlmIGFueSksIHVubGVzcyBpdCBpcyAnTm9uZScgb3IgdGhlCiAgICAgICAgc3VwcGxpZWQgJ2RlZmF1bHQnLgogICAgICAgICIiIgoKICAgICAgICBpZiBzZWxmLmF0dHJpYnV0ZSBpcyBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmLCBwLCBpID0gZmluZF9tb2R1bGUoc2VsZi5tb2R1bGUsIHBhdGhzKQogICAgICAgICAgICAgICAgaWYgZjoKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHYgPSBnZXRfbW9kdWxlX2NvbnN0YW50KHNlbGYubW9kdWxlLCBzZWxmLmF0dHJpYnV0ZSwgZGVmYXVsdCwgcGF0aHMpCgogICAgICAgIGlmIHYgaXMgbm90IE5vbmUgYW5kIHYgaXMgbm90IGRlZmF1bHQgYW5kIHNlbGYuZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQodikKCiAgICAgICAgcmV0dXJuIHYKCiAgICBkZWYgaXNfcHJlc2VudChzZWxmLCBwYXRocz1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkZXBlbmRlbmN5IGlzIHByZXNlbnQgb24gJ3BhdGhzJyIiIgogICAgICAgIHJldHVybiBzZWxmLmdldF92ZXJzaW9uKHBhdGhzKSBpcyBub3QgTm9uZQoKICAgIGRlZiBpc19jdXJyZW50KHNlbGYsIHBhdGhzPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmIGRlcGVuZGVuY3kgaXMgcHJlc2VudCBhbmQgdXAtdG8tZGF0ZSBvbiAncGF0aHMnIiIiCiAgICAgICAgdmVyc2lvbiA9IHNlbGYuZ2V0X3ZlcnNpb24ocGF0aHMpCiAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX29rKHZlcnNpb24pCgoKZGVmIGZpbmRfbW9kdWxlKG1vZHVsZSwgcGF0aHM9Tm9uZSk6CiAgICAiIiJKdXN0IGxpa2UgJ2ltcC5maW5kX21vZHVsZSgpJywgYnV0IHdpdGggcGFja2FnZSBzdXBwb3J0IiIiCgogICAgcGFydHMgPSBtb2R1bGUuc3BsaXQoJy4nKQoKICAgIHdoaWxlIHBhcnRzOgogICAgICAgIHBhcnQgPSBwYXJ0cy5wb3AoMCkKICAgICAgICBmLCBwYXRoLCAoc3VmZml4LCBtb2RlLCBraW5kKSA9IGluZm8gPSBpbXAuZmluZF9tb2R1bGUocGFydCwgcGF0aHMpCgogICAgICAgIGlmIGtpbmQgPT0gUEtHX0RJUkVDVE9SWToKICAgICAgICAgICAgcGFydHMgPSBwYXJ0cyBvciBbJ19faW5pdF9fJ10KICAgICAgICAgICAgcGF0aHMgPSBbcGF0aF0KCiAgICAgICAgZWxpZiBwYXJ0czoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNhbid0IGZpbmQgJXIgaW4gJXMiICUgKHBhcnRzLCBtb2R1bGUpKQoKICAgIHJldHVybiBpbmZvCgoKZGVmIGdldF9tb2R1bGVfY29uc3RhbnQobW9kdWxlLCBzeW1ib2wsIGRlZmF1bHQ9LTEsIHBhdGhzPU5vbmUpOgogICAgIiIiRmluZCAnbW9kdWxlJyBieSBzZWFyY2hpbmcgJ3BhdGhzJywgYW5kIGV4dHJhY3QgJ3N5bWJvbCcKCiAgICBSZXR1cm4gJ05vbmUnIGlmICdtb2R1bGUnIGRvZXMgbm90IGV4aXN0IG9uICdwYXRocycsIG9yIGl0IGRvZXMgbm90IGRlZmluZQogICAgJ3N5bWJvbCcuICBJZiB0aGUgbW9kdWxlIGRlZmluZXMgJ3N5bWJvbCcgYXMgYSBjb25zdGFudCwgcmV0dXJuIHRoZQogICAgY29uc3RhbnQuICBPdGhlcndpc2UsIHJldHVybiAnZGVmYXVsdCcuIiIiCgogICAgdHJ5OgogICAgICAgIGYsIHBhdGgsIChzdWZmaXgsIG1vZGUsIGtpbmQpID0gZmluZF9tb2R1bGUobW9kdWxlLCBwYXRocykKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAjIE1vZHVsZSBkb2Vzbid0IGV4aXN0CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICB0cnk6CiAgICAgICAgaWYga2luZCA9PSBQWV9DT01QSUxFRDoKICAgICAgICAgICAgZi5yZWFkKDgpICAjIHNraXAgbWFnaWMgJiBkYXRlCiAgICAgICAgICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZikKICAgICAgICBlbGlmIGtpbmQgPT0gUFlfRlJPWkVOOgogICAgICAgICAgICBjb2RlID0gaW1wLmdldF9mcm96ZW5fb2JqZWN0KG1vZHVsZSkKICAgICAgICBlbGlmIGtpbmQgPT0gUFlfU09VUkNFOgogICAgICAgICAgICBjb2RlID0gY29tcGlsZShmLnJlYWQoKSwgcGF0aCwgJ2V4ZWMnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgTm90IHNvbWV0aGluZyB3ZSBjYW4gcGFyc2U7IHdlJ2xsIGhhdmUgdG8gaW1wb3J0IGl0LiAgOigKICAgICAgICAgICAgaWYgbW9kdWxlIG5vdCBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgIGltcC5sb2FkX21vZHVsZShtb2R1bGUsIGYsIHBhdGgsIChzdWZmaXgsIG1vZGUsIGtpbmQpKQogICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2R1bGVdLCBzeW1ib2wsIE5vbmUpCgogICAgZmluYWxseToKICAgICAgICBpZiBmOgogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICByZXR1cm4gZXh0cmFjdF9jb25zdGFudChjb2RlLCBzeW1ib2wsIGRlZmF1bHQpCgoKZGVmIGV4dHJhY3RfY29uc3RhbnQoY29kZSwgc3ltYm9sLCBkZWZhdWx0PS0xKToKICAgICIiIkV4dHJhY3QgdGhlIGNvbnN0YW50IHZhbHVlIG9mICdzeW1ib2wnIGZyb20gJ2NvZGUnCgogICAgSWYgdGhlIG5hbWUgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYSBjb25zdGFudCB2YWx1ZSBieSB0aGUgUHl0aG9uIGNvZGUKICAgIG9iamVjdCAnY29kZScsIHJldHVybiB0aGF0IHZhbHVlLiAgSWYgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYW4gZXhwcmVzc2lvbiwKICAgIHJldHVybiAnZGVmYXVsdCcuICBPdGhlcndpc2UsIHJldHVybiAnTm9uZScuCgogICAgUmV0dXJuIHZhbHVlIGlzIGJhc2VkIG9uIHRoZSBmaXJzdCBhc3NpZ25tZW50IHRvICdzeW1ib2wnLiAgJ3N5bWJvbCcgbXVzdAogICAgYmUgYSBnbG9iYWwsIG9yIGF0IGxlYXN0IGEgbm9uLSJmYXN0IiBsb2NhbCBpbiB0aGUgY29kZSBibG9jay4gIFRoYXQgaXMsCiAgICBvbmx5ICdTVE9SRV9OQU1FJyBhbmQgJ1NUT1JFX0dMT0JBTCcgb3Bjb2RlcyBhcmUgY2hlY2tlZCwgYW5kICdzeW1ib2wnCiAgICBtdXN0IGJlIHByZXNlbnQgaW4gJ2NvZGUuY29fbmFtZXMnLgogICAgIiIiCiAgICBpZiBzeW1ib2wgbm90IGluIGNvZGUuY29fbmFtZXM6CiAgICAgICAgIyBuYW1lJ3Mgbm90IHRoZXJlLCBjYW4ndCBwb3NzaWJseSBiZSBhbiBhc3NpZ25tZW50CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBuYW1lX2lkeCA9IGxpc3QoY29kZS5jb19uYW1lcykuaW5kZXgoc3ltYm9sKQoKICAgIFNUT1JFX05BTUUgPSA5MAogICAgU1RPUkVfR0xPQkFMID0gOTcKICAgIExPQURfQ09OU1QgPSAxMDAKCiAgICBjb25zdCA9IGRlZmF1bHQKCiAgICBmb3IgYnl0ZV9jb2RlIGluIEJ5dGVjb2RlKGNvZGUpOgogICAgICAgIG9wID0gYnl0ZV9jb2RlLm9wY29kZQogICAgICAgIGFyZyA9IGJ5dGVfY29kZS5hcmcKCiAgICAgICAgaWYgb3AgPT0gTE9BRF9DT05TVDoKICAgICAgICAgICAgY29uc3QgPSBjb2RlLmNvX2NvbnN0c1thcmddCiAgICAgICAgZWxpZiBhcmcgPT0gbmFtZV9pZHggYW5kIChvcCA9PSBTVE9SRV9OQU1FIG9yIG9wID09IFNUT1JFX0dMT0JBTCk6CiAgICAgICAgICAgIHJldHVybiBjb25zdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnN0ID0gZGVmYXVsdAoKCmRlZiBfdXBkYXRlX2dsb2JhbHMoKToKICAgICIiIgogICAgUGF0Y2ggdGhlIGdsb2JhbHMgdG8gcmVtb3ZlIHRoZSBvYmplY3RzIG5vdCBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMuCgogICAgWFhYIGl0J2QgYmUgYmV0dGVyIHRvIHRlc3QgYXNzZXJ0aW9ucyBhYm91dCBieXRlY29kZSBpbnN0ZWFkLgogICAgIiIiCgogICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJykgYW5kIHN5cy5wbGF0Zm9ybSAhPSAnY2xpJzoKICAgICAgICByZXR1cm4KICAgIGluY29tcGF0aWJsZSA9ICdleHRyYWN0X2NvbnN0YW50JywgJ2dldF9tb2R1bGVfY29uc3RhbnQnCiAgICBmb3IgbmFtZSBpbiBpbmNvbXBhdGlibGU6CiAgICAgICAgZGVsIGdsb2JhbHMoKVtuYW1lXQogICAgICAgIF9fYWxsX18ucmVtb3ZlKG5hbWUpCgoKX3VwZGF0ZV9nbG9iYWxzKCkKUEsDBBQAAAAAAAAAIQAldIcFkJ0AAJCdAAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGlzdC5weV9fYWxsX18gPSBbJ0Rpc3RyaWJ1dGlvbiddCgppbXBvcnQgcmUKaW1wb3J0IG9zCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgbnVtYmVycwppbXBvcnQgZGlzdHV0aWxzLmxvZwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5jbWQKaW1wb3J0IGRpc3R1dGlscy5kaXN0CmltcG9ydCBpdGVydG9vbHMKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoCiAgICBEaXN0dXRpbHNPcHRpb25FcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgRGlzdHV0aWxzU2V0dXBFcnJvciwKKQpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCByZmM4MjJfZXNjYXBlCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcCwgZmlsdGVyLCBmaWx0ZXJmYWxzZQpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKCmZyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBSZXF1aXJlCmZyb20gc2V0dXB0b29scyBpbXBvcnQgd2luZG93c19zdXBwb3J0CmZyb20gc2V0dXB0b29scy5tb25rZXkgaW1wb3J0IGdldF91bnBhdGNoZWQKZnJvbSBzZXR1cHRvb2xzLmNvbmZpZyBpbXBvcnQgcGFyc2VfY29uZmlndXJhdGlvbgppbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIC5weTM2Y29tcGF0IGltcG9ydCBEaXN0cmlidXRpb25fcGFyc2VfY29uZmlnX2ZpbGVzCgpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcuc3BlY2lmaWVycycpCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uJykKCgpkZWYgX2dldF91bnBhdGNoZWQoY2xzKToKICAgIHdhcm5pbmdzLndhcm4oIkRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24iLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChjbHMpCgoKIyBCYXNlZCBvbiBQeXRob24gMy41IHZlcnNpb24KZGVmIHdyaXRlX3BrZ19maWxlKHNlbGYsIGZpbGUpOgogICAgIiIiV3JpdGUgdGhlIFBLRy1JTkZPIGZvcm1hdCBkYXRhIHRvIGEgZmlsZSBvYmplY3QuCiAgICAiIiIKICAgIHZlcnNpb24gPSAnMS4wJwogICAgaWYgKHNlbGYucHJvdmlkZXMgb3Igc2VsZi5yZXF1aXJlcyBvciBzZWxmLm9ic29sZXRlcyBvcgogICAgICAgICAgICBzZWxmLmNsYXNzaWZpZXJzIG9yIHNlbGYuZG93bmxvYWRfdXJsKToKICAgICAgICB2ZXJzaW9uID0gJzEuMScKICAgICMgU2V0dXB0b29scyBzcGVjaWZpYyBmb3IgUEVQIDM0NQogICAgaWYgaGFzYXR0cihzZWxmLCAncHl0aG9uX3JlcXVpcmVzJyk6CiAgICAgICAgdmVyc2lvbiA9ICcxLjInCgogICAgZmlsZS53cml0ZSgnTWV0YWRhdGEtVmVyc2lvbjogJXNcbicgJSB2ZXJzaW9uKQogICAgZmlsZS53cml0ZSgnTmFtZTogJXNcbicgJSBzZWxmLmdldF9uYW1lKCkpCiAgICBmaWxlLndyaXRlKCdWZXJzaW9uOiAlc1xuJyAlIHNlbGYuZ2V0X3ZlcnNpb24oKSkKICAgIGZpbGUud3JpdGUoJ1N1bW1hcnk6ICVzXG4nICUgc2VsZi5nZXRfZGVzY3JpcHRpb24oKSkKICAgIGZpbGUud3JpdGUoJ0hvbWUtcGFnZTogJXNcbicgJSBzZWxmLmdldF91cmwoKSkKICAgIGZpbGUud3JpdGUoJ0F1dGhvcjogJXNcbicgJSBzZWxmLmdldF9jb250YWN0KCkpCiAgICBmaWxlLndyaXRlKCdBdXRob3ItZW1haWw6ICVzXG4nICUgc2VsZi5nZXRfY29udGFjdF9lbWFpbCgpKQogICAgZmlsZS53cml0ZSgnTGljZW5zZTogJXNcbicgJSBzZWxmLmdldF9saWNlbnNlKCkpCiAgICBpZiBzZWxmLmRvd25sb2FkX3VybDoKICAgICAgICBmaWxlLndyaXRlKCdEb3dubG9hZC1VUkw6ICVzXG4nICUgc2VsZi5kb3dubG9hZF91cmwpCgogICAgbG9uZ19kZXNjX2NvbnRlbnRfdHlwZSA9IGdldGF0dHIoCiAgICAgICAgc2VsZiwKICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUnLAogICAgICAgIE5vbmUKICAgICkgb3IgJ1VOS05PV04nCiAgICBmaWxlLndyaXRlKCdEZXNjcmlwdGlvbi1Db250ZW50LVR5cGU6ICVzXG4nICUgbG9uZ19kZXNjX2NvbnRlbnRfdHlwZSkKCiAgICBsb25nX2Rlc2MgPSByZmM4MjJfZXNjYXBlKHNlbGYuZ2V0X2xvbmdfZGVzY3JpcHRpb24oKSkKICAgIGZpbGUud3JpdGUoJ0Rlc2NyaXB0aW9uOiAlc1xuJyAlIGxvbmdfZGVzYykKCiAgICBrZXl3b3JkcyA9ICcsJy5qb2luKHNlbGYuZ2V0X2tleXdvcmRzKCkpCiAgICBpZiBrZXl3b3JkczoKICAgICAgICBmaWxlLndyaXRlKCdLZXl3b3JkczogJXNcbicgJSBrZXl3b3JkcykKCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdQbGF0Zm9ybScsIHNlbGYuZ2V0X3BsYXRmb3JtcygpKQogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnQ2xhc3NpZmllcicsIHNlbGYuZ2V0X2NsYXNzaWZpZXJzKCkpCgogICAgIyBQRVAgMzE0CiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdSZXF1aXJlcycsIHNlbGYuZ2V0X3JlcXVpcmVzKCkpCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdQcm92aWRlcycsIHNlbGYuZ2V0X3Byb3ZpZGVzKCkpCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdPYnNvbGV0ZXMnLCBzZWxmLmdldF9vYnNvbGV0ZXMoKSkKCiAgICAjIFNldHVwdG9vbHMgc3BlY2lmaWMgZm9yIFBFUCAzNDUKICAgIGlmIGhhc2F0dHIoc2VsZiwgJ3B5dGhvbl9yZXF1aXJlcycpOgogICAgICAgIGZpbGUud3JpdGUoJ1JlcXVpcmVzLVB5dGhvbjogJXNcbicgJSBzZWxmLnB5dGhvbl9yZXF1aXJlcykKCgojIGZyb20gUHl0aG9uIDMuNApkZWYgd3JpdGVfcGtnX2luZm8oc2VsZiwgYmFzZV9kaXIpOgogICAgIiIiV3JpdGUgdGhlIFBLRy1JTkZPIGZpbGUgaW50byB0aGUgcmVsZWFzZSB0cmVlLgogICAgIiIiCiAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGJhc2VfZGlyLCAnUEtHLUlORk8nKSwgJ3cnLAogICAgICAgICAgICAgIGVuY29kaW5nPSdVVEYtOCcpIGFzIHBrZ19pbmZvOgogICAgICAgIHNlbGYud3JpdGVfcGtnX2ZpbGUocGtnX2luZm8pCgoKc2VxdWVuY2UgPSB0dXBsZSwgbGlzdAoKCmRlZiBjaGVja19pbXBvcnRhYmxlKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgIHRyeToKICAgICAgICBlcCA9IHBrZ19yZXNvdXJjZXMuRW50cnlQb2ludC5wYXJzZSgneD0nICsgdmFsdWUpCiAgICAgICAgYXNzZXJ0IG5vdCBlcC5leHRyYXMKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgQXNzZXJ0aW9uRXJyb3IpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICIlciBtdXN0IGJlIGltcG9ydGFibGUgJ21vZHVsZTphdHRycycgc3RyaW5nIChnb3QgJXIpIgogICAgICAgICAgICAlIChhdHRyLCB2YWx1ZSkKICAgICAgICApCgoKZGVmIGFzc2VydF9zdHJpbmdfbGlzdChkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIHN0cmluZyBsaXN0IG9yIE5vbmUiIiIKICAgIHRyeToKICAgICAgICBhc3NlcnQgJycuam9pbih2YWx1ZSkgIT0gdmFsdWUKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgQXNzZXJ0aW9uRXJyb3IpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICIlciBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIChnb3QgJXIpIiAlIChhdHRyLCB2YWx1ZSkKICAgICAgICApCgoKZGVmIGNoZWNrX25zcChkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBuYW1lc3BhY2UgcGFja2FnZXMgYXJlIHZhbGlkIiIiCiAgICBuc19wYWNrYWdlcyA9IHZhbHVlCiAgICBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCwgYXR0ciwgbnNfcGFja2FnZXMpCiAgICBmb3IgbnNwIGluIG5zX3BhY2thZ2VzOgogICAgICAgIGlmIG5vdCBkaXN0Lmhhc19jb250ZW50c19mb3IobnNwKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJEaXN0cmlidXRpb24gY29udGFpbnMgbm8gbW9kdWxlcyBvciBwYWNrYWdlcyBmb3IgIiArCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIHBhY2thZ2UgJXIiICUgbnNwCiAgICAgICAgICAgICkKICAgICAgICBwYXJlbnQsIHNlcCwgY2hpbGQgPSBuc3AucnBhcnRpdGlvbignLicpCiAgICAgICAgaWYgcGFyZW50IGFuZCBwYXJlbnQgbm90IGluIG5zX3BhY2thZ2VzOgogICAgICAgICAgICBkaXN0dXRpbHMubG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJXIgaXMgZGVjbGFyZWQgYXMgYSBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0ICVyIgogICAgICAgICAgICAgICAgIiBpcyBub3Q6IHBsZWFzZSBjb3JyZWN0IHRoaXMgaW4gc2V0dXAucHkiLCBuc3AsIHBhcmVudAogICAgICAgICAgICApCgoKZGVmIGNoZWNrX2V4dHJhcyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBleHRyYXNfcmVxdWlyZSBtYXBwaW5nIGlzIHZhbGlkIiIiCiAgICB0cnk6CiAgICAgICAgbGlzdChpdGVydG9vbHMuc3Rhcm1hcChfY2hlY2tfZXh0cmEsIHZhbHVlLml0ZW1zKCkpKQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAiJ2V4dHJhc19yZXF1aXJlJyBtdXN0IGJlIGEgZGljdGlvbmFyeSB3aG9zZSB2YWx1ZXMgYXJlICIKICAgICAgICAgICAgInN0cmluZ3Mgb3IgbGlzdHMgb2Ygc3RyaW5ncyBjb250YWluaW5nIHZhbGlkIHByb2plY3QvdmVyc2lvbiAiCiAgICAgICAgICAgICJyZXF1aXJlbWVudCBzcGVjaWZpZXJzLiIKICAgICAgICApCgoKZGVmIF9jaGVja19leHRyYShleHRyYSwgcmVxcyk6CiAgICBuYW1lLCBzZXAsIG1hcmtlciA9IGV4dHJhLnBhcnRpdGlvbignOicpCiAgICBpZiBtYXJrZXIgYW5kIHBrZ19yZXNvdXJjZXMuaW52YWxpZF9tYXJrZXIobWFya2VyKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCJJbnZhbGlkIGVudmlyb25tZW50IG1hcmtlcjogIiArIG1hcmtlcikKICAgIGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHMocmVxcykpCgoKZGVmIGFzc2VydF9ib29sKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIFRydWUsIEZhbHNlLCAwLCBvciAxIiIiCiAgICBpZiBib29sKHZhbHVlKSAhPSB2YWx1ZToKICAgICAgICB0bXBsID0gInthdHRyIXJ9IG11c3QgYmUgYSBib29sZWFuIHZhbHVlIChnb3Qge3ZhbHVlIXJ9KSIKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKHRtcGwuZm9ybWF0KGF0dHI9YXR0ciwgdmFsdWU9dmFsdWUpKQoKCmRlZiBjaGVja19yZXF1aXJlbWVudHMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgaW5zdGFsbF9yZXF1aXJlcyBpcyBhIHZhbGlkIHJlcXVpcmVtZW50cyBsaXN0IiIiCiAgICB0cnk6CiAgICAgICAgbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyh2YWx1ZSkpCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGRpY3QsIHNldCkpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVub3JkZXJlZCB0eXBlcyBhcmUgbm90IGFsbG93ZWQiKQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpIGFzIGVycm9yOgogICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICJ7YXR0ciFyfSBtdXN0IGJlIGEgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyAiCiAgICAgICAgICAgICJjb250YWluaW5nIHZhbGlkIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjaWZpZXJzOyB7ZXJyb3J9IgogICAgICAgICkKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKHRtcGwuZm9ybWF0KGF0dHI9YXR0ciwgZXJyb3I9ZXJyb3IpKQoKCmRlZiBjaGVja19zcGVjaWZpZXIoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSB2YWxpZCB2ZXJzaW9uIHNwZWNpZmllciIiIgogICAgdHJ5OgogICAgICAgIHBhY2thZ2luZy5zcGVjaWZpZXJzLlNwZWNpZmllclNldCh2YWx1ZSkKICAgIGV4Y2VwdCBwYWNrYWdpbmcuc3BlY2lmaWVycy5JbnZhbGlkU3BlY2lmaWVyIGFzIGVycm9yOgogICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICJ7YXR0ciFyfSBtdXN0IGJlIGEgc3RyaW5nICIKICAgICAgICAgICAgImNvbnRhaW5pbmcgdmFsaWQgdmVyc2lvbiBzcGVjaWZpZXJzOyB7ZXJyb3J9IgogICAgICAgICkKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKHRtcGwuZm9ybWF0KGF0dHI9YXR0ciwgZXJyb3I9ZXJyb3IpKQoKCmRlZiBjaGVja19lbnRyeV9wb2ludHMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgZW50cnlfcG9pbnRzIG1hcCBpcyBwYXJzZWFibGUiIiIKICAgIHRyeToKICAgICAgICBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2VfbWFwKHZhbHVlKQogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKGUpCgoKZGVmIGNoZWNrX3Rlc3Rfc3VpdGUoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoInRlc3Rfc3VpdGUgbXVzdCBiZSBhIHN0cmluZyIpCgoKZGVmIGNoZWNrX3BhY2thZ2VfZGF0YShkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIGRpY3Rpb25hcnkgb2YgcGFja2FnZSBuYW1lcyB0byBnbG9iIGxpc3RzIiIiCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKICAgICAgICBmb3IgaywgdiBpbiB2YWx1ZS5pdGVtcygpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrLCBzdHIpOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaXRlcih2KQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4KICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgYXR0ciArICIgbXVzdCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIGxpc3RzIG9mICIKICAgICAgICAid2lsZGNhcmQgcGF0dGVybnMiCiAgICApCgoKZGVmIGNoZWNrX3BhY2thZ2VzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgIGZvciBwa2duYW1lIGluIHZhbHVlOgogICAgICAgIGlmIG5vdCByZS5tYXRjaChyJ1x3KyhcLlx3KykqJywgcGtnbmFtZSk6CiAgICAgICAgICAgIGRpc3R1dGlscy5sb2cud2FybigKICAgICAgICAgICAgICAgICJXQVJOSU5HOiAlciBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWU7IHBsZWFzZSB1c2Ugb25seSAiCiAgICAgICAgICAgICAgICAiLi1zZXBhcmF0ZWQgcGFja2FnZSBuYW1lcyBpbiBzZXR1cC5weSIsIHBrZ25hbWUKICAgICAgICAgICAgKQoKCl9EaXN0cmlidXRpb24gPSBnZXRfdW5wYXRjaGVkKGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbikKCgpjbGFzcyBEaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uX3BhcnNlX2NvbmZpZ19maWxlcywgX0Rpc3RyaWJ1dGlvbik6CiAgICAiIiJEaXN0cmlidXRpb24gd2l0aCBzdXBwb3J0IGZvciBmZWF0dXJlcywgdGVzdHMsIGFuZCBwYWNrYWdlIGRhdGEKCiAgICBUaGlzIGlzIGFuIGVuaGFuY2VkIHZlcnNpb24gb2YgJ2Rpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbicgdGhhdAogICAgZWZmZWN0aXZlbHkgYWRkcyB0aGUgZm9sbG93aW5nIG5ldyBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyB0byAnc2V0dXAoKSc6CgogICAgICdpbnN0YWxsX3JlcXVpcmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIHNwZWNpZnlpbmcgcHJvamVjdAogICAgICAgIHZlcnNpb25zIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiByZXF1aXJlcyB3aGVuIGluc3RhbGxlZCwgaW4gdGhlIGZvcm1hdAogICAgICAgIHVzZWQgYnkgJ3BrZ19yZXNvdXJjZXMucmVxdWlyZSgpJy4gIFRoZXkgd2lsbCBiZSBpbnN0YWxsZWQKICAgICAgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLiAgSWYgeW91IHdpc2ggdG8gdXNlCiAgICAgICAgcGFja2FnZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBpbiBQeVBJLCBvciB3YW50IHRvIGdpdmUgeW91ciB1c2VycyBhbgogICAgICAgIGFsdGVybmF0ZSBkb3dubG9hZCBsb2NhdGlvbiwgeW91IGNhbiBhZGQgYSAnZmluZF9saW5rcycgb3B0aW9uIHRvIHRoZQogICAgICAgICdbZWFzeV9pbnN0YWxsXScgc2VjdGlvbiBvZiB5b3VyIHByb2plY3QncyAnc2V0dXAuY2ZnJyBmaWxlLCBhbmQgdGhlbgogICAgICAgIHNldHVwdG9vbHMgd2lsbCBzY2FuIHRoZSBsaXN0ZWQgd2ViIHBhZ2VzIGZvciBsaW5rcyB0aGF0IHNhdGlzZnkgdGhlCiAgICAgICAgcmVxdWlyZW1lbnRzLgoKICAgICAnZXh0cmFzX3JlcXVpcmUnIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIG9mIG9wdGlvbmFsICJleHRyYXMiIHRvIHRoZQogICAgICAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnQocykgdGhhdCB1c2luZyB0aG9zZSBleHRyYXMgaW5jdXJzLiBGb3IgZXhhbXBsZSwKICAgICAgICB0aGlzOjoKCiAgICAgICAgICAgIGV4dHJhc19yZXF1aXJlID0gZGljdChyZVNUID0gWyJkb2N1dGlscz49MC4zIiwgInJlU1RlZGl0Il0pCgogICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBleHRyYQogICAgICAgIGNhcGFiaWxpdHkgY2FsbGVkICJyZVNUIiwgYnV0IGl0IGNhbiBvbmx5IGJlIHVzZWQgaWYgZG9jdXRpbHMgYW5kCiAgICAgICAgcmVTVGVkaXQgYXJlIGluc3RhbGxlZC4gIElmIHRoZSB1c2VyIGluc3RhbGxzIHlvdXIgcGFja2FnZSB1c2luZwogICAgICAgIEVhc3lJbnN0YWxsIGFuZCByZXF1ZXN0cyBvbmUgb2YgeW91ciBleHRyYXMsIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgd2lsbCBiZSBpbnN0YWxsZWQgaWYgbmVlZGVkLgoKICAgICAnZmVhdHVyZXMnICoqZGVwcmVjYXRlZCoqIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIG9wdGlvbiBuYW1lcyB0bwogICAgICAgICdzZXR1cHRvb2xzLkZlYXR1cmUnCiAgICAgICAgb2JqZWN0cy4gIEZlYXR1cmVzIGFyZSBhIHBvcnRpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBiZQogICAgICAgIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkIGJhc2VkIG9uIHVzZXIgb3B0aW9ucywgaW50ZXItZmVhdHVyZSBkZXBlbmRlbmNpZXMsCiAgICAgICAgYW5kIGF2YWlsYWJpbGl0eSBvbiB0aGUgY3VycmVudCBzeXN0ZW0uICBFeGNsdWRlZCBmZWF0dXJlcyBhcmUgb21pdHRlZAogICAgICAgIGZyb20gYWxsIHNldHVwIGNvbW1hbmRzLCBpbmNsdWRpbmcgc291cmNlIGFuZCBiaW5hcnkgZGlzdHJpYnV0aW9ucywgc28KICAgICAgICB5b3UgY2FuIGNyZWF0ZSBtdWx0aXBsZSBkaXN0cmlidXRpb25zIGZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUuCiAgICAgICAgRmVhdHVyZSBuYW1lcyBzaG91bGQgYmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLCBleGNlcHQgdGhhdCB0aGV5IG1heQogICAgICAgIGNvbnRhaW4gdGhlICctJyAobWludXMpIHNpZ24uICBGZWF0dXJlcyBjYW4gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKICAgICAgICB2aWEgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zICctLXdpdGgtWCcgYW5kICctLXdpdGhvdXQtWCcsIHdoZXJlICdYJyBpcwogICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlLiAgV2hldGhlciBhIGZlYXR1cmUgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCwgYW5kCiAgICAgICAgd2hldGhlciB5b3UgYXJlIGFsbG93ZWQgdG8gY29udHJvbCB0aGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaXMKICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSBGZWF0dXJlIG9iamVjdC4gIFNlZSB0aGUgJ0ZlYXR1cmUnIGNsYXNzIGZvciBtb3JlCiAgICAgICAgaW5mb3JtYXRpb24uCgogICAgICd0ZXN0X3N1aXRlJyAtLSB0aGUgbmFtZSBvZiBhIHRlc3Qgc3VpdGUgdG8gcnVuIGZvciB0aGUgJ3Rlc3QnIGNvbW1hbmQuCiAgICAgICAgSWYgdGhlIHVzZXIgcnVucyAncHl0aG9uIHNldHVwLnB5IHRlc3QnLCB0aGUgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZCwKICAgICAgICBhbmQgdGhlIG5hbWVkIHRlc3Qgc3VpdGUgd2lsbCBiZSBydW4uICBUaGUgZm9ybWF0IGlzIHRoZSBzYW1lIGFzCiAgICAgICAgd291bGQgYmUgdXNlZCBvbiBhICd1bml0dGVzdC5weScgY29tbWFuZCBsaW5lLiAgVGhhdCBpcywgaXQgaXMgdGhlCiAgICAgICAgZG90dGVkIG5hbWUgb2YgYW4gb2JqZWN0IHRvIGltcG9ydCBhbmQgY2FsbCB0byBnZW5lcmF0ZSBhIHRlc3Qgc3VpdGUuCgogICAgICdwYWNrYWdlX2RhdGEnIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgZmlsZW5hbWVzCiAgICAgICAgb3IgZ2xvYnMgdG8gdXNlIHRvIGZpbmQgZGF0YSBmaWxlcyBjb250YWluZWQgaW4gdGhlIG5hbWVkIHBhY2thZ2VzLgogICAgICAgIElmIHRoZSBkaWN0aW9uYXJ5IGhhcyBmaWxlbmFtZXMgb3IgZ2xvYnMgbGlzdGVkIHVuZGVyICciIicgKHRoZSBlbXB0eQogICAgICAgIHN0cmluZyksIHRob3NlIG5hbWVzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGluIGV2ZXJ5IHBhY2thZ2UsIGluIGFkZGl0aW9uCiAgICAgICAgdG8gYW55IG5hbWVzIGZvciB0aGUgc3BlY2lmaWMgcGFja2FnZS4gIERhdGEgZmlsZXMgZm91bmQgdXNpbmcgdGhlc2UKICAgICAgICBuYW1lcy9nbG9icyB3aWxsIGJlIGluc3RhbGxlZCBhbG9uZyB3aXRoIHRoZSBwYWNrYWdlLCBpbiB0aGUgc2FtZQogICAgICAgIGxvY2F0aW9uIGFzIHRoZSBwYWNrYWdlLiAgTm90ZSB0aGF0IGdsb2JzIGFyZSBhbGxvd2VkIHRvIHJlZmVyZW5jZQogICAgICAgIHRoZSBjb250ZW50cyBvZiBub24tcGFja2FnZSBzdWJkaXJlY3RvcmllcywgYXMgbG9uZyBhcyB5b3UgdXNlICcvJyBhcwogICAgICAgIGEgcGF0aCBzZXBhcmF0b3IuICAoR2xvYnMgYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvCiAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aHMgYXQgcnVudGltZS4pCgogICAgSW4gYWRkaXRpb24gdG8gdGhlc2UgbmV3IGtleXdvcmRzLCB0aGlzIGNsYXNzIGFsc28gaGFzIHNldmVyYWwgbmV3IG1ldGhvZHMKICAgIGZvciBtYW5pcHVsYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbidzIGNvbnRlbnRzLiAgRm9yIGV4YW1wbGUsIHRoZSAnaW5jbHVkZSgpJwogICAgYW5kICdleGNsdWRlKCknIG1ldGhvZHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgaW4tcGxhY2UgYWRkIGFuZCBzdWJ0cmFjdAogICAgY29tbWFuZHMgdGhhdCBhZGQgb3IgcmVtb3ZlIHBhY2thZ2VzLCBtb2R1bGVzLCBleHRlbnNpb25zLCBhbmQgc28gb24gZnJvbQogICAgdGhlIGRpc3RyaWJ1dGlvbi4gIFRoZXkgYXJlIHVzZWQgYnkgdGhlIGZlYXR1cmUgc3Vic3lzdGVtIHRvIGNvbmZpZ3VyZSB0aGUKICAgIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGluY2x1ZGVkIGFuZCBleGNsdWRlZCBmZWF0dXJlcy4KICAgICIiIgoKICAgIF9wYXRjaGVkX2Rpc3QgPSBOb25lCgogICAgZGVmIHBhdGNoX21pc3NpbmdfcGtnX2luZm8oc2VsZiwgYXR0cnMpOgogICAgICAgICMgRmFrZSB1cCBhIHJlcGxhY2VtZW50IGZvciB0aGUgZGF0YSB0aGF0IHdvdWxkIG5vcm1hbGx5IGNvbWUgZnJvbQogICAgICAgICMgUEtHLUlORk8sIGJ1dCB3aGljaCBtaWdodCBub3QgeWV0IGJlIGJ1aWx0IGlmIHRoaXMgaXMgYSBmcmVzaAogICAgICAgICMgY2hlY2tvdXQuCiAgICAgICAgIwogICAgICAgIGlmIG5vdCBhdHRycyBvciAnbmFtZScgbm90IGluIGF0dHJzIG9yICd2ZXJzaW9uJyBub3QgaW4gYXR0cnM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGtleSA9IHBrZ19yZXNvdXJjZXMuc2FmZV9uYW1lKHN0cihhdHRyc1snbmFtZSddKSkubG93ZXIoKQogICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LmJ5X2tleS5nZXQoa2V5KQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmUgYW5kIG5vdCBkaXN0Lmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICAgICAgZGlzdC5fdmVyc2lvbiA9IHBrZ19yZXNvdXJjZXMuc2FmZV92ZXJzaW9uKHN0cihhdHRyc1sndmVyc2lvbiddKSkKICAgICAgICAgICAgc2VsZi5fcGF0Y2hlZF9kaXN0ID0gZGlzdAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhdHRycz1Ob25lKToKICAgICAgICBoYXZlX3BhY2thZ2VfZGF0YSA9IGhhc2F0dHIoc2VsZiwgInBhY2thZ2VfZGF0YSIpCiAgICAgICAgaWYgbm90IGhhdmVfcGFja2FnZV9kYXRhOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSA9IHt9CiAgICAgICAgYXR0cnMgPSBhdHRycyBvciB7fQogICAgICAgIGlmICdmZWF0dXJlcycgaW4gYXR0cnMgb3IgJ3JlcXVpcmVfZmVhdHVyZXMnIGluIGF0dHJzOgogICAgICAgICAgICBGZWF0dXJlLndhcm5fZGVwcmVjYXRlZCgpCiAgICAgICAgc2VsZi5yZXF1aXJlX2ZlYXR1cmVzID0gW10KICAgICAgICBzZWxmLmZlYXR1cmVzID0ge30KICAgICAgICBzZWxmLmRpc3RfZmlsZXMgPSBbXQogICAgICAgIHNlbGYuc3JjX3Jvb3QgPSBhdHRycy5wb3AoInNyY19yb290IiwgTm9uZSkKICAgICAgICBzZWxmLnBhdGNoX21pc3NpbmdfcGtnX2luZm8oYXR0cnMpCiAgICAgICAgc2VsZi5sb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZSA9IGF0dHJzLmdldCgKICAgICAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlJwogICAgICAgICkKICAgICAgICBzZWxmLmRlcGVuZGVuY3lfbGlua3MgPSBhdHRycy5wb3AoJ2RlcGVuZGVuY3lfbGlua3MnLCBbXSkKICAgICAgICBzZWxmLnNldHVwX3JlcXVpcmVzID0gYXR0cnMucG9wKCdzZXR1cF9yZXF1aXJlcycsIFtdKQogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMnKToKICAgICAgICAgICAgdmFycyhzZWxmKS5zZXRkZWZhdWx0KGVwLm5hbWUsIE5vbmUpCiAgICAgICAgX0Rpc3RyaWJ1dGlvbi5fX2luaXRfXyhzZWxmLCBhdHRycykKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubWV0YWRhdGEudmVyc2lvbiwgbnVtYmVycy5OdW1iZXIpOgogICAgICAgICAgICAjIFNvbWUgcGVvcGxlIGFwcGFyZW50bHkgdGFrZSAidmVyc2lvbiBudW1iZXIiIHRvbyBsaXRlcmFsbHkgOikKICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS52ZXJzaW9uID0gc3RyKHNlbGYubWV0YWRhdGEudmVyc2lvbikKCiAgICAgICAgaWYgc2VsZi5tZXRhZGF0YS52ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2ZXIgPSBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKHNlbGYubWV0YWRhdGEudmVyc2lvbikKICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfdmVyc2lvbiA9IHN0cih2ZXIpCiAgICAgICAgICAgICAgICBpZiBzZWxmLm1ldGFkYXRhLnZlcnNpb24gIT0gbm9ybWFsaXplZF92ZXJzaW9uOgogICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAgICAgICAgICJOb3JtYWxpemluZyAnJXMnIHRvICclcyciICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiA9IG5vcm1hbGl6ZWRfdmVyc2lvbgogICAgICAgICAgICBleGNlcHQgKHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uLCBUeXBlRXJyb3IpOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICAgICAiVGhlIHZlcnNpb24gc3BlY2lmaWVkICglcikgaXMgYW4gaW52YWxpZCB2ZXJzaW9uLCB0aGlzICIKICAgICAgICAgICAgICAgICAgICAibWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkIHdpdGggbmV3ZXIgdmVyc2lvbnMgb2YgIgogICAgICAgICAgICAgICAgICAgICJzZXR1cHRvb2xzLCBwaXAsIGFuZCBQeVBJLiBQbGVhc2Ugc2VlIFBFUCA0NDAgZm9yIG1vcmUgIgogICAgICAgICAgICAgICAgICAgICJkZXRhaWxzLiIgJSBzZWxmLm1ldGFkYXRhLnZlcnNpb24KICAgICAgICAgICAgICAgICkKICAgICAgICBzZWxmLl9maW5hbGl6ZV9yZXF1aXJlcygpCgogICAgZGVmIF9maW5hbGl6ZV9yZXF1aXJlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZXQgYG1ldGFkYXRhLnB5dGhvbl9yZXF1aXJlc2AgYW5kIGZpeCBlbnZpcm9ubWVudCBtYXJrZXJzCiAgICAgICAgaW4gYGluc3RhbGxfcmVxdWlyZXNgIGFuZCBgZXh0cmFzX3JlcXVpcmVgLgogICAgICAgICIiIgogICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ3B5dGhvbl9yZXF1aXJlcycsIE5vbmUpOgogICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnB5dGhvbl9yZXF1aXJlcyA9IHNlbGYucHl0aG9uX3JlcXVpcmVzCiAgICAgICAgc2VsZi5fY29udmVydF9leHRyYXNfcmVxdWlyZW1lbnRzKCkKICAgICAgICBzZWxmLl9tb3ZlX2luc3RhbGxfcmVxdWlyZW1lbnRzX21hcmtlcnMoKQoKICAgIGRlZiBfY29udmVydF9leHRyYXNfcmVxdWlyZW1lbnRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbnZlcnQgcmVxdWlyZW1lbnRzIGluIGBleHRyYXNfcmVxdWlyZWAgb2YgdGhlIGZvcm0KICAgICAgICBgImV4dHJhIjogWyJiYXJiYXpxdXV4OyB7bWFya2VyfSJdYCB0bwogICAgICAgIGAiZXh0cmE6e21hcmtlcn0iOiBbImJhcmJhenF1dXgiXWAuCiAgICAgICAgIiIiCiAgICAgICAgc3BlY19leHRfcmVxcyA9IGdldGF0dHIoc2VsZiwgJ2V4dHJhc19yZXF1aXJlJywgTm9uZSkgb3Ige30KICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmUgPSBkZWZhdWx0ZGljdChsaXN0KQogICAgICAgIGZvciBzZWN0aW9uLCB2IGluIHNwZWNfZXh0X3JlcXMuaXRlbXMoKToKICAgICAgICAgICAgIyBEbyBub3Qgc3RyaXAgZW1wdHkgc2VjdGlvbnMuCiAgICAgICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZVtzZWN0aW9uXQogICAgICAgICAgICBmb3IgciBpbiBwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyh2KToKICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHNlbGYuX3N1ZmZpeF9mb3IocikKICAgICAgICAgICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZVtzZWN0aW9uICsgc3VmZml4XS5hcHBlbmQocikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3N1ZmZpeF9mb3IocmVxKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSByZXF1aXJlbWVudCwgcmV0dXJuIHRoZSAnZXh0cmFzX3JlcXVpcmUnIHN1ZmZpeCBmb3IKICAgICAgICB0aGF0IHJlcXVpcmVtZW50LgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnOicgKyBzdHIocmVxLm1hcmtlcikgaWYgcmVxLm1hcmtlciBlbHNlICcnCgogICAgZGVmIF9tb3ZlX2luc3RhbGxfcmVxdWlyZW1lbnRzX21hcmtlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTW92ZSByZXF1aXJlbWVudHMgaW4gYGluc3RhbGxfcmVxdWlyZXNgIHRoYXQgYXJlIHVzaW5nIGVudmlyb25tZW50CiAgICAgICAgbWFya2VycyBgZXh0cmFzX3JlcXVpcmVgLgogICAgICAgICIiIgoKICAgICAgICAjIGRpdmlkZSB0aGUgaW5zdGFsbF9yZXF1aXJlcyBpbnRvIHR3byBzZXRzLCBzaW1wbGUgb25lcyBzdGlsbAogICAgICAgICMgaGFuZGxlZCBieSBpbnN0YWxsX3JlcXVpcmVzIGFuZCBtb3JlIGNvbXBsZXggb25lcyBoYW5kbGVkCiAgICAgICAgIyBieSBleHRyYXNfcmVxdWlyZS4KCiAgICAgICAgZGVmIGlzX3NpbXBsZV9yZXEocmVxKToKICAgICAgICAgICAgcmV0dXJuIG5vdCByZXEubWFya2VyCgogICAgICAgIHNwZWNfaW5zdF9yZXFzID0gZ2V0YXR0cihzZWxmLCAnaW5zdGFsbF9yZXF1aXJlcycsIE5vbmUpIG9yICgpCiAgICAgICAgaW5zdF9yZXFzID0gbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyhzcGVjX2luc3RfcmVxcykpCiAgICAgICAgc2ltcGxlX3JlcXMgPSBmaWx0ZXIoaXNfc2ltcGxlX3JlcSwgaW5zdF9yZXFzKQogICAgICAgIGNvbXBsZXhfcmVxcyA9IGZpbHRlcmZhbHNlKGlzX3NpbXBsZV9yZXEsIGluc3RfcmVxcykKICAgICAgICBzZWxmLmluc3RhbGxfcmVxdWlyZXMgPSBsaXN0KG1hcChzdHIsIHNpbXBsZV9yZXFzKSkKCiAgICAgICAgZm9yIHIgaW4gY29tcGxleF9yZXFzOgogICAgICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmVbJzonICsgc3RyKHIubWFya2VyKV0uYXBwZW5kKHIpCiAgICAgICAgc2VsZi5leHRyYXNfcmVxdWlyZSA9IGRpY3QoCiAgICAgICAgICAgIChrLCBbc3RyKHIpIGZvciByIGluIG1hcChzZWxmLl9jbGVhbl9yZXEsIHYpXSkKICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlLml0ZW1zKCkKICAgICAgICApCgogICAgZGVmIF9jbGVhbl9yZXEoc2VsZiwgcmVxKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIFJlcXVpcmVtZW50LCByZW1vdmUgZW52aXJvbm1lbnQgbWFya2VycyBhbmQgcmV0dXJuIGl0LgogICAgICAgICIiIgogICAgICAgIHJlcS5tYXJrZXIgPSBOb25lCiAgICAgICAgcmV0dXJuIHJlcQoKICAgIGRlZiBwYXJzZV9jb25maWdfZmlsZXMoc2VsZiwgZmlsZW5hbWVzPU5vbmUsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICAgICAiIiJQYXJzZXMgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHZhcmlvdXMgbGV2ZWxzCiAgICAgICAgYW5kIGxvYWRzIGNvbmZpZ3VyYXRpb24uCgogICAgICAgICIiIgogICAgICAgIF9EaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcz1maWxlbmFtZXMpCgogICAgICAgIHBhcnNlX2NvbmZpZ3VyYXRpb24oc2VsZiwgc2VsZi5jb21tYW5kX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfb3B0aW9uX2Vycm9ycz1pZ25vcmVfb3B0aW9uX2Vycm9ycykKICAgICAgICBzZWxmLl9maW5hbGl6ZV9yZXF1aXJlcygpCgogICAgZGVmIHBhcnNlX2NvbW1hbmRfbGluZShzZWxmKToKICAgICAgICAiIiJQcm9jZXNzIGZlYXR1cmVzIGFmdGVyIHBhcnNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMiIiIKICAgICAgICByZXN1bHQgPSBfRGlzdHJpYnV0aW9uLnBhcnNlX2NvbW1hbmRfbGluZShzZWxmKQogICAgICAgIGlmIHNlbGYuZmVhdHVyZXM6CiAgICAgICAgICAgIHNlbGYuX2ZpbmFsaXplX2ZlYXR1cmVzKCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9mZWF0dXJlX2F0dHJuYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkNvbnZlcnQgZmVhdHVyZSBuYW1lIHRvIGNvcnJlc3BvbmRpbmcgb3B0aW9uIGF0dHJpYnV0ZSBuYW1lIiIiCiAgICAgICAgcmV0dXJuICd3aXRoXycgKyBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCgogICAgZGVmIGZldGNoX2J1aWxkX2VnZ3Moc2VsZiwgcmVxdWlyZXMpOgogICAgICAgICIiIlJlc29sdmUgcHJlLXNldHVwIHJlcXVpcmVtZW50cyIiIgogICAgICAgIHJlc29sdmVkX2Rpc3RzID0gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5yZXNvbHZlKAogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyhyZXF1aXJlcyksCiAgICAgICAgICAgIGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZywKICAgICAgICAgICAgcmVwbGFjZV9jb25mbGljdGluZz1UcnVlLAogICAgICAgICkKICAgICAgICBmb3IgZGlzdCBpbiByZXNvbHZlZF9kaXN0czoKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5hZGQoZGlzdCwgcmVwbGFjZT1UcnVlKQogICAgICAgIHJldHVybiByZXNvbHZlZF9kaXN0cwoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIF9EaXN0cmlidXRpb24uZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYuZmVhdHVyZXM6CiAgICAgICAgICAgIHNlbGYuX3NldF9nbG9iYWxfb3B0c19mcm9tX2ZlYXR1cmVzKCkKCiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5zZXR1cF9rZXl3b3JkcycpOgogICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZiwgZXAubmFtZSwgTm9uZSkKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZykKICAgICAgICAgICAgICAgIGVwLmxvYWQoKShzZWxmLCBlcC5uYW1lLCB2YWx1ZSkKICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdjb252ZXJ0XzJ0bzNfZG9jdGVzdHMnLCBOb25lKToKICAgICAgICAgICAgIyBYWFggbWF5IGNvbnZlcnQgdG8gc2V0IGhlcmUgd2hlbiB3ZSBjYW4gcmVseSBvbiBzZXQgYmVpbmcgYnVpbHRpbgogICAgICAgICAgICBzZWxmLmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IFsKICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChwKQogICAgICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMKICAgICAgICAgICAgXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY29udmVydF8ydG8zX2RvY3Rlc3RzID0gW10KCiAgICBkZWYgZ2V0X2VnZ19jYWNoZV9kaXIoc2VsZik6CiAgICAgICAgZWdnX2NhY2hlX2RpciA9IG9zLnBhdGguam9pbihvcy5jdXJkaXIsICcuZWdncycpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGVnZ19jYWNoZV9kaXIpOgogICAgICAgICAgICBvcy5ta2RpcihlZ2dfY2FjaGVfZGlyKQogICAgICAgICAgICB3aW5kb3dzX3N1cHBvcnQuaGlkZV9maWxlKGVnZ19jYWNoZV9kaXIpCiAgICAgICAgICAgIHJlYWRtZV90eHRfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oZWdnX2NhY2hlX2RpciwgJ1JFQURNRS50eHQnKQogICAgICAgICAgICB3aXRoIG9wZW4ocmVhZG1lX3R4dF9maWxlbmFtZSwgJ3cnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZSgnVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZWdncyB0aGF0IHdlcmUgZG93bmxvYWRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICdieSBzZXR1cHRvb2xzIHRvIGJ1aWxkLCB0ZXN0LCBhbmQgcnVuIHBsdWctaW5zLlxuXG4nKQogICAgICAgICAgICAgICAgZi53cml0ZSgnVGhpcyBkaXJlY3RvcnkgY2FjaGVzIHRob3NlIGVnZ3MgdG8gcHJldmVudCAnCiAgICAgICAgICAgICAgICAgICAgICAgICdyZXBlYXRlZCBkb3dubG9hZHMuXG5cbicpCiAgICAgICAgICAgICAgICBmLndyaXRlKCdIb3dldmVyLCBpdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGlzIGRpcmVjdG9yeS5cblxuJykKCiAgICAgICAgcmV0dXJuIGVnZ19jYWNoZV9kaXIKCiAgICBkZWYgZmV0Y2hfYnVpbGRfZWdnKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiRmV0Y2ggYW4gZWdnIG5lZWRlZCBmb3IgYnVpbGRpbmciIiIKICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGVhc3lfaW5zdGFsbAogICAgICAgIGRpc3QgPSBzZWxmLl9fY2xhc3NfXyh7J3NjcmlwdF9hcmdzJzogWydlYXN5X2luc3RhbGwnXX0pCiAgICAgICAgb3B0cyA9IGRpc3QuZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQogICAgICAgIG9wdHMuY2xlYXIoKQogICAgICAgIG9wdHMudXBkYXRlKAogICAgICAgICAgICAoaywgdikKICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpLml0ZW1zKCkKICAgICAgICAgICAgaWYgayBpbiAoCiAgICAgICAgICAgICAgICAjIGRvbid0IHVzZSBhbnkgb3RoZXIgc2V0dGluZ3MKICAgICAgICAgICAgICAgICdmaW5kX2xpbmtzJywgJ3NpdGVfZGlycycsICdpbmRleF91cmwnLAogICAgICAgICAgICAgICAgJ29wdGltaXplJywgJ3NpdGVfZGlycycsICdhbGxvd19ob3N0cycsCiAgICAgICAgKSkKICAgICAgICBpZiBzZWxmLmRlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgIGxpbmtzID0gc2VsZi5kZXBlbmRlbmN5X2xpbmtzWzpdCiAgICAgICAgICAgIGlmICdmaW5kX2xpbmtzJyBpbiBvcHRzOgogICAgICAgICAgICAgICAgbGlua3MgPSBvcHRzWydmaW5kX2xpbmtzJ11bMV0gKyBsaW5rcwogICAgICAgICAgICBvcHRzWydmaW5kX2xpbmtzJ10gPSAoJ3NldHVwJywgbGlua3MpCiAgICAgICAgaW5zdGFsbF9kaXIgPSBzZWxmLmdldF9lZ2dfY2FjaGVfZGlyKCkKICAgICAgICBjbWQgPSBlYXN5X2luc3RhbGwoCiAgICAgICAgICAgIGRpc3QsIGFyZ3M9WyJ4Il0sIGluc3RhbGxfZGlyPWluc3RhbGxfZGlyLAogICAgICAgICAgICBleGNsdWRlX3NjcmlwdHM9VHJ1ZSwKICAgICAgICAgICAgYWx3YXlzX2NvcHk9RmFsc2UsIGJ1aWxkX2RpcmVjdG9yeT1Ob25lLCBlZGl0YWJsZT1GYWxzZSwKICAgICAgICAgICAgdXBncmFkZT1GYWxzZSwgbXVsdGlfdmVyc2lvbj1UcnVlLCBub19yZXBvcnQ9VHJ1ZSwgdXNlcj1GYWxzZQogICAgICAgICkKICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCiAgICAgICAgcmV0dXJuIGNtZC5lYXN5X2luc3RhbGwocmVxKQoKICAgIGRlZiBfc2V0X2dsb2JhbF9vcHRzX2Zyb21fZmVhdHVyZXMoc2VsZik6CiAgICAgICAgIiIiQWRkIC0td2l0aC1YLy0td2l0aG91dC1YIG9wdGlvbnMgYmFzZWQgb24gb3B0aW9uYWwgZmVhdHVyZXMiIiIKCiAgICAgICAgZ28gPSBbXQogICAgICAgIG5vID0gc2VsZi5uZWdhdGl2ZV9vcHQuY29weSgpCgogICAgICAgIGZvciBuYW1lLCBmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgTm9uZSkKICAgICAgICAgICAgZmVhdHVyZS52YWxpZGF0ZShzZWxmKQoKICAgICAgICAgICAgaWYgZmVhdHVyZS5vcHRpb25hbDoKICAgICAgICAgICAgICAgIGRlc2NyID0gZmVhdHVyZS5kZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgaW5jZGVmID0gJyAoZGVmYXVsdCknCiAgICAgICAgICAgICAgICBleGNkZWYgPSAnJwogICAgICAgICAgICAgICAgaWYgbm90IGZlYXR1cmUuaW5jbHVkZV9ieV9kZWZhdWx0KCk6CiAgICAgICAgICAgICAgICAgICAgZXhjZGVmLCBpbmNkZWYgPSBpbmNkZWYsIGV4Y2RlZgoKICAgICAgICAgICAgICAgIG5ldyA9ICgKICAgICAgICAgICAgICAgICAgICAoJ3dpdGgtJyArIG5hbWUsIE5vbmUsICdpbmNsdWRlICcgKyBkZXNjciArIGluY2RlZiksCiAgICAgICAgICAgICAgICAgICAgKCd3aXRob3V0LScgKyBuYW1lLCBOb25lLCAnZXhjbHVkZSAnICsgZGVzY3IgKyBleGNkZWYpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZ28uZXh0ZW5kKG5ldykKICAgICAgICAgICAgICAgIG5vWyd3aXRob3V0LScgKyBuYW1lXSA9ICd3aXRoLScgKyBuYW1lCgogICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbnMgPSBzZWxmLmZlYXR1cmVfb3B0aW9ucyA9IGdvICsgc2VsZi5nbG9iYWxfb3B0aW9ucwogICAgICAgIHNlbGYubmVnYXRpdmVfb3B0ID0gc2VsZi5mZWF0dXJlX25lZ29wdCA9IG5vCgogICAgZGVmIF9maW5hbGl6ZV9mZWF0dXJlcyhzZWxmKToKICAgICAgICAiIiJBZGQvcmVtb3ZlIGZlYXR1cmVzIGFuZCByZXNvbHZlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW0iIiIKCiAgICAgICAgIyBGaXJzdCwgZmxhZyBhbGwgdGhlIGVuYWJsZWQgaXRlbXMgKGFuZCB0aHVzIHRoZWlyIGRlcGVuZGVuY2llcykKICAgICAgICBmb3IgbmFtZSwgZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CiAgICAgICAgICAgIGVuYWJsZWQgPSBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSkKICAgICAgICAgICAgaWYgZW5hYmxlZCBvciAoZW5hYmxlZCBpcyBOb25lIGFuZCBmZWF0dXJlLmluY2x1ZGVfYnlfZGVmYXVsdCgpKToKICAgICAgICAgICAgICAgIGZlYXR1cmUuaW5jbHVkZV9pbihzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgMSkKCiAgICAgICAgIyBUaGVuIGRpc2FibGUgdGhlIHJlc3QsIHNvIHRoYXQgb2ZmLWJ5LWRlZmF1bHQgZmVhdHVyZXMgZG9uJ3QKICAgICAgICAjIGdldCBmbGFnZ2VkIGFzIGVycm9ycyB3aGVuIHRoZXkncmUgcmVxdWlyZWQgYnkgYW4gZW5hYmxlZCBmZWF0dXJlCiAgICAgICAgZm9yIG5hbWUsIGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpOgogICAgICAgICAgICAgICAgZmVhdHVyZS5leGNsdWRlX2Zyb20oc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIDApCgogICAgZGVmIGdldF9jb21tYW5kX2NsYXNzKHNlbGYsIGNvbW1hbmQpOgogICAgICAgICIiIlBsdWdnYWJsZSB2ZXJzaW9uIG9mIGdldF9jb21tYW5kX2NsYXNzKCkiIiIKICAgICAgICBpZiBjb21tYW5kIGluIHNlbGYuY21kY2xhc3M6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNtZGNsYXNzW2NvbW1hbmRdCgogICAgICAgIGVwcyA9IHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycsIGNvbW1hbmQpCiAgICAgICAgZm9yIGVwIGluIGVwczoKICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2cpCiAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbY29tbWFuZF0gPSBjbWRjbGFzcyA9IGVwLmxvYWQoKQogICAgICAgICAgICByZXR1cm4gY21kY2xhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9jbGFzcyhzZWxmLCBjb21tYW5kKQoKICAgIGRlZiBwcmludF9jb21tYW5kcyhzZWxmKToKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJyk6CiAgICAgICAgICAgIGlmIGVwLm5hbWUgbm90IGluIHNlbGYuY21kY2xhc3M6CiAgICAgICAgICAgICAgICAjIGRvbid0IHJlcXVpcmUgZXh0cmFzIGFzIHRoZSBjb21tYW5kcyB3b24ndCBiZSBpbnZva2VkCiAgICAgICAgICAgICAgICBjbWRjbGFzcyA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tlcC5uYW1lXSA9IGNtZGNsYXNzCiAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24ucHJpbnRfY29tbWFuZHMoc2VsZikKCiAgICBkZWYgZ2V0X2NvbW1hbmRfbGlzdChzZWxmKToKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJyk6CiAgICAgICAgICAgIGlmIGVwLm5hbWUgbm90IGluIHNlbGYuY21kY2xhc3M6CiAgICAgICAgICAgICAgICAjIGRvbid0IHJlcXVpcmUgZXh0cmFzIGFzIHRoZSBjb21tYW5kcyB3b24ndCBiZSBpbnZva2VkCiAgICAgICAgICAgICAgICBjbWRjbGFzcyA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tlcC5uYW1lXSA9IGNtZGNsYXNzCiAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfbGlzdChzZWxmKQoKICAgIGRlZiBfc2V0X2ZlYXR1cmUoc2VsZiwgbmFtZSwgc3RhdHVzKToKICAgICAgICAiIiJTZXQgZmVhdHVyZSdzIGluY2x1c2lvbiBzdGF0dXMiIiIKICAgICAgICBzZXRhdHRyKHNlbGYsIHNlbGYuX2ZlYXR1cmVfYXR0cm5hbWUobmFtZSksIHN0YXR1cykKCiAgICBkZWYgZmVhdHVyZV9pc19pbmNsdWRlZChzZWxmLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gMSBpZiBmZWF0dXJlIGlzIGluY2x1ZGVkLCAwIGlmIGV4Y2x1ZGVkLCAnTm9uZScgaWYgdW5rbm93biIiIgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIHNlbGYuX2ZlYXR1cmVfYXR0cm5hbWUobmFtZSkpCgogICAgZGVmIGluY2x1ZGVfZmVhdHVyZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJSZXF1ZXN0IGluY2x1c2lvbiBvZiBmZWF0dXJlIG5hbWVkICduYW1lJyIiIgoKICAgICAgICBpZiBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSkgPT0gMDoKICAgICAgICAgICAgZGVzY3IgPSBzZWxmLmZlYXR1cmVzW25hbWVdLmRlc2NyaXB0aW9uCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgZGVzY3IgKyAiIGlzIHJlcXVpcmVkLCBidXQgd2FzIGV4Y2x1ZGVkIG9yIGlzIG5vdCBhdmFpbGFibGUiCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmZlYXR1cmVzW25hbWVdLmluY2x1ZGVfaW4oc2VsZikKICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCAxKQoKICAgIGRlZiBpbmNsdWRlKHNlbGYsICoqYXR0cnMpOgogICAgICAgICIiIkFkZCBpdGVtcyB0byBkaXN0cmlidXRpb24gdGhhdCBhcmUgbmFtZWQgaW4ga2V5d29yZCBhcmd1bWVudHMKCiAgICAgICAgRm9yIGV4YW1wbGUsICdkaXN0LmV4Y2x1ZGUocHlfbW9kdWxlcz1bIngiXSknIHdvdWxkIGFkZCAneCcgdG8KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ3B5X21vZHVsZXMnIGF0dHJpYnV0ZSwgaWYgaXQgd2FzIG5vdCBhbHJlYWR5CiAgICAgICAgdGhlcmUuCgogICAgICAgIEN1cnJlbnRseSwgdGhpcyBtZXRob2Qgb25seSBzdXBwb3J0cyBpbmNsdXNpb24gZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmUKICAgICAgICBsaXN0cyBvciB0dXBsZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgYWRkaW5nIHRvIG90aGVyCiAgICAgICAgYXR0cmlidXRlcyBpbiB0aGlzIG9yIGEgc3ViY2xhc3MsIHlvdSBjYW4gYWRkIGFuICdfaW5jbHVkZV9YJyBtZXRob2QsCiAgICAgICAgd2hlcmUgJ1gnIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGgKICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdpbmNsdWRlKCknLiAgU28sICdkaXN0LmluY2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJwogICAgICAgIHdpbGwgdHJ5IHRvIGNhbGwgJ2Rpc3QuX2luY2x1ZGVfZm9vKHsiYmFyIjoiYmF6In0pJywgd2hpY2ggY2FuIHRoZW4KICAgICAgICBoYW5kbGUgd2hhdGV2ZXIgc3BlY2lhbCBpbmNsdXNpb24gbG9naWMgaXMgbmVlZGVkLgogICAgICAgICIiIgogICAgICAgIGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCk6CiAgICAgICAgICAgIGluY2x1ZGUgPSBnZXRhdHRyKHNlbGYsICdfaW5jbHVkZV8nICsgaywgTm9uZSkKICAgICAgICAgICAgaWYgaW5jbHVkZToKICAgICAgICAgICAgICAgIGluY2x1ZGUodikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2luY2x1ZGVfbWlzYyhrLCB2KQoKICAgIGRlZiBleGNsdWRlX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSk6CiAgICAgICAgIiIiUmVtb3ZlIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9ucyBpbiBuYW1lZCBwYWNrYWdlIiIiCgogICAgICAgIHBmeCA9IHBhY2thZ2UgKyAnLicKICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VzID0gWwogICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLnBhY2thZ2VzCiAgICAgICAgICAgICAgICBpZiBwICE9IHBhY2thZ2UgYW5kIG5vdCBwLnN0YXJ0c3dpdGgocGZ4KQogICAgICAgICAgICBdCgogICAgICAgIGlmIHNlbGYucHlfbW9kdWxlczoKICAgICAgICAgICAgc2VsZi5weV9tb2R1bGVzID0gWwogICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLnB5X21vZHVsZXMKICAgICAgICAgICAgICAgIGlmIHAgIT0gcGFja2FnZSBhbmQgbm90IHAuc3RhcnRzd2l0aChwZngpCiAgICAgICAgICAgIF0KCiAgICAgICAgaWYgc2VsZi5leHRfbW9kdWxlczoKICAgICAgICAgICAgc2VsZi5leHRfbW9kdWxlcyA9IFsKICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5leHRfbW9kdWxlcwogICAgICAgICAgICAgICAgaWYgcC5uYW1lICE9IHBhY2thZ2UgYW5kIG5vdCBwLm5hbWUuc3RhcnRzd2l0aChwZngpCiAgICAgICAgICAgIF0KCiAgICBkZWYgaGFzX2NvbnRlbnRzX2ZvcihzZWxmLCBwYWNrYWdlKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnZXhjbHVkZV9wYWNrYWdlKHBhY2thZ2UpJyB3b3VsZCBkbyBzb21ldGhpbmciIiIKCiAgICAgICAgcGZ4ID0gcGFja2FnZSArICcuJwoKICAgICAgICBmb3IgcCBpbiBzZWxmLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCk6CiAgICAgICAgICAgIGlmIHAgPT0gcGFja2FnZSBvciBwLnN0YXJ0c3dpdGgocGZ4KToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9leGNsdWRlX21pc2Moc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkhhbmRsZSAnZXhjbHVkZSgpJyBmb3IgbGlzdC90dXBsZSBhdHRycyB3aXRob3V0IGEgc3BlY2lhbCBoYW5kbGVyIiIiCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSAoJXIpIiAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgb2xkID0gZ2V0YXR0cihzZWxmLCBuYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogTm8gc3VjaCBkaXN0cmlidXRpb24gc2V0dGluZyIgJSBuYW1lCiAgICAgICAgICAgICkKICAgICAgICBpZiBvbGQgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKG9sZCwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgbmFtZSArICI6IHRoaXMgc2V0dGluZyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgaW5jbHVkZS9leGNsdWRlIgogICAgICAgICAgICApCiAgICAgICAgZWxpZiBvbGQ6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgW2l0ZW0gZm9yIGl0ZW0gaW4gb2xkIGlmIGl0ZW0gbm90IGluIHZhbHVlXSkKCiAgICBkZWYgX2luY2x1ZGVfbWlzYyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiSGFuZGxlICdpbmNsdWRlKCknIGZvciBsaXN0L3R1cGxlIGF0dHJzIHdpdGhvdXQgYSBzcGVjaWFsIGhhbmRsZXIiIiIKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCAoJXIpIiAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgb2xkID0gZ2V0YXR0cihzZWxmLCBuYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogTm8gc3VjaCBkaXN0cmlidXRpb24gc2V0dGluZyIgJSBuYW1lCiAgICAgICAgICAgICkKICAgICAgICBpZiBvbGQgaXMgTm9uZToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCB2YWx1ZSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG9sZCwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgbmFtZSArICI6IHRoaXMgc2V0dGluZyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgaW5jbHVkZS9leGNsdWRlIgogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV3ID0gW2l0ZW0gZm9yIGl0ZW0gaW4gdmFsdWUgaWYgaXRlbSBub3QgaW4gb2xkXQogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIG9sZCArIG5ldykKCiAgICBkZWYgZXhjbHVkZShzZWxmLCAqKmF0dHJzKToKICAgICAgICAiIiJSZW1vdmUgaXRlbXMgZnJvbSBkaXN0cmlidXRpb24gdGhhdCBhcmUgbmFtZWQgaW4ga2V5d29yZCBhcmd1bWVudHMKCiAgICAgICAgRm9yIGV4YW1wbGUsICdkaXN0LmV4Y2x1ZGUocHlfbW9kdWxlcz1bIngiXSknIHdvdWxkIHJlbW92ZSAneCcgZnJvbQogICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAncHlfbW9kdWxlcycgYXR0cmlidXRlLiAgRXhjbHVkaW5nIHBhY2thZ2VzIHVzZXMKICAgICAgICB0aGUgJ2V4Y2x1ZGVfcGFja2FnZSgpJyBtZXRob2QsIHNvIGFsbCBvZiB0aGUgcGFja2FnZSdzIGNvbnRhaW5lZAogICAgICAgIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9ucyBhcmUgYWxzbyBleGNsdWRlZC4KCiAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIGV4Y2x1c2lvbiBmcm9tIGF0dHJpYnV0ZXMgdGhhdCBhcmUKICAgICAgICBsaXN0cyBvciB0dXBsZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkaW5nIGZyb20gb3RoZXIKICAgICAgICBhdHRyaWJ1dGVzIGluIHRoaXMgb3IgYSBzdWJjbGFzcywgeW91IGNhbiBhZGQgYW4gJ19leGNsdWRlX1gnIG1ldGhvZCwKICAgICAgICB3aGVyZSAnWCcgaXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aAogICAgICAgIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJ2V4Y2x1ZGUoKScuICBTbywgJ2Rpc3QuZXhjbHVkZShmb289eyJiYXIiOiJiYXoifSknCiAgICAgICAgd2lsbCB0cnkgdG8gY2FsbCAnZGlzdC5fZXhjbHVkZV9mb28oeyJiYXIiOiJiYXoifSknLCB3aGljaCBjYW4gdGhlbgogICAgICAgIGhhbmRsZSB3aGF0ZXZlciBzcGVjaWFsIGV4Y2x1c2lvbiBsb2dpYyBpcyBuZWVkZWQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGssIHYgaW4gYXR0cnMuaXRlbXMoKToKICAgICAgICAgICAgZXhjbHVkZSA9IGdldGF0dHIoc2VsZiwgJ19leGNsdWRlXycgKyBrLCBOb25lKQogICAgICAgICAgICBpZiBleGNsdWRlOgogICAgICAgICAgICAgICAgZXhjbHVkZSh2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fZXhjbHVkZV9taXNjKGssIHYpCgogICAgZGVmIF9leGNsdWRlX3BhY2thZ2VzKHNlbGYsIHBhY2thZ2VzKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYWNrYWdlcywgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgInBhY2thZ2VzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlICglcikiICUgKHBhY2thZ2VzLCkKICAgICAgICAgICAgKQogICAgICAgIGxpc3QobWFwKHNlbGYuZXhjbHVkZV9wYWNrYWdlLCBwYWNrYWdlcykpCgogICAgZGVmIF9wYXJzZV9jb21tYW5kX29wdHMoc2VsZiwgcGFyc2VyLCBhcmdzKToKICAgICAgICAjIFJlbW92ZSAtLXdpdGgtWC8tLXdpdGhvdXQtWCBvcHRpb25zIHdoZW4gcHJvY2Vzc2luZyBjb21tYW5kIGFyZ3MKICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gc2VsZi5fX2NsYXNzX18uZ2xvYmFsX29wdGlvbnMKICAgICAgICBzZWxmLm5lZ2F0aXZlX29wdCA9IHNlbGYuX19jbGFzc19fLm5lZ2F0aXZlX29wdAoKICAgICAgICAjIEZpcnN0LCBleHBhbmQgYW55IGFsaWFzZXMKICAgICAgICBjb21tYW5kID0gYXJnc1swXQogICAgICAgIGFsaWFzZXMgPSBzZWxmLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCiAgICAgICAgd2hpbGUgY29tbWFuZCBpbiBhbGlhc2VzOgogICAgICAgICAgICBzcmMsIGFsaWFzID0gYWxpYXNlc1tjb21tYW5kXQogICAgICAgICAgICBkZWwgYWxpYXNlc1tjb21tYW5kXSAgIyBlbnN1cmUgZWFjaCBhbGlhcyBjYW4gZXhwYW5kIG9ubHkgb25jZSEKICAgICAgICAgICAgaW1wb3J0IHNobGV4CiAgICAgICAgICAgIGFyZ3NbOjFdID0gc2hsZXguc3BsaXQoYWxpYXMsIFRydWUpCiAgICAgICAgICAgIGNvbW1hbmQgPSBhcmdzWzBdCgogICAgICAgIG5hcmdzID0gX0Rpc3RyaWJ1dGlvbi5fcGFyc2VfY29tbWFuZF9vcHRzKHNlbGYsIHBhcnNlciwgYXJncykKCiAgICAgICAgIyBIYW5kbGUgY29tbWFuZHMgdGhhdCB3YW50IHRvIGNvbnN1bWUgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMKICAgICAgICBjbWRfY2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNvbW1hbmQpCiAgICAgICAgaWYgZ2V0YXR0cihjbWRfY2xhc3MsICdjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cycsIE5vbmUpOgogICAgICAgICAgICBzZWxmLmdldF9vcHRpb25fZGljdChjb21tYW5kKVsnYXJncyddID0gKCJjb21tYW5kIGxpbmUiLCBuYXJncykKICAgICAgICAgICAgaWYgbmFyZ3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIG5hcmdzCgogICAgZGVmIGdldF9jbWRsaW5lX29wdGlvbnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgJ3tjbWQ6IHtvcHQ6dmFsfX0nIG1hcCBvZiBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMKCiAgICAgICAgT3B0aW9uIG5hbWVzIGFyZSBhbGwgbG9uZywgYnV0IGRvIG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nICctLScsIGFuZAogICAgICAgIGNvbnRhaW4gZGFzaGVzIHJhdGhlciB0aGFuIHVuZGVyc2NvcmVzLiAgSWYgdGhlIG9wdGlvbiBkb2Vzbid0IHRha2UKICAgICAgICBhbiBhcmd1bWVudCAoZS5nLiAnLS1xdWlldCcpLCB0aGUgJ3ZhbCcgaXMgJ05vbmUnLgoKICAgICAgICBOb3RlIHRoYXQgb3B0aW9ucyBwcm92aWRlZCBieSBjb25maWcgZmlsZXMgYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQuCiAgICAgICAgIiIiCgogICAgICAgIGQgPSB7fQoKICAgICAgICBmb3IgY21kLCBvcHRzIGluIHNlbGYuY29tbWFuZF9vcHRpb25zLml0ZW1zKCk6CgogICAgICAgICAgICBmb3Igb3B0LCAoc3JjLCB2YWwpIGluIG9wdHMuaXRlbXMoKToKCiAgICAgICAgICAgICAgICBpZiBzcmMgIT0gImNvbW1hbmQgbGluZSI6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICBvcHQgPSBvcHQucmVwbGFjZSgnXycsICctJykKCiAgICAgICAgICAgICAgICBpZiB2YWwgPT0gMDoKICAgICAgICAgICAgICAgICAgICBjbWRvYmogPSBzZWxmLmdldF9jb21tYW5kX29iaihjbWQpCiAgICAgICAgICAgICAgICAgICAgbmVnX29wdCA9IHNlbGYubmVnYXRpdmVfb3B0LmNvcHkoKQogICAgICAgICAgICAgICAgICAgIG5lZ19vcHQudXBkYXRlKGdldGF0dHIoY21kb2JqLCAnbmVnYXRpdmVfb3B0Jywge30pKQogICAgICAgICAgICAgICAgICAgIGZvciBuZWcsIHBvcyBpbiBuZWdfb3B0Lml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcyA9PSBvcHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgPSBuZWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBoZXJlIikKCiAgICAgICAgICAgICAgICBlbGlmIHZhbCA9PSAxOgogICAgICAgICAgICAgICAgICAgIHZhbCA9IE5vbmUKCiAgICAgICAgICAgICAgICBkLnNldGRlZmF1bHQoY21kLCB7fSlbb3B0XSA9IHZhbAoKICAgICAgICByZXR1cm4gZAoKICAgIGRlZiBpdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiJZaWVsZCBhbGwgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb24gbmFtZXMgaW4gZGlzdHJpYnV0aW9uIiIiCgogICAgICAgIGZvciBwa2cgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKICAgICAgICAgICAgeWllbGQgcGtnCgogICAgICAgIGZvciBtb2R1bGUgaW4gc2VsZi5weV9tb2R1bGVzIG9yICgpOgogICAgICAgICAgICB5aWVsZCBtb2R1bGUKCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dF9tb2R1bGVzIG9yICgpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgdHVwbGUpOgogICAgICAgICAgICAgICAgbmFtZSwgYnVpbGRpbmZvID0gZXh0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lID0gZXh0Lm5hbWUKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnbW9kdWxlJyk6CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs6LTZdCiAgICAgICAgICAgIHlpZWxkIG5hbWUKCiAgICBkZWYgaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpOgogICAgICAgICIiIklmIHRoZXJlIHdlcmUgYW55IG5vbi1nbG9iYWwgImRpc3BsYXktb25seSIgb3B0aW9ucwogICAgICAgICgtLWhlbHAtY29tbWFuZHMgb3IgdGhlIG1ldGFkYXRhIGRpc3BsYXkgb3B0aW9ucykgb24gdGhlIGNvbW1hbmQKICAgICAgICBsaW5lLCBkaXNwbGF5IHRoZSByZXF1ZXN0ZWQgaW5mbyBhbmQgcmV0dXJuIHRydWU7IGVsc2UgcmV0dXJuCiAgICAgICAgZmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgaW1wb3J0IHN5cwoKICAgICAgICBpZiBzaXguUFkyIG9yIHNlbGYuaGVscF9jb21tYW5kczoKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCgogICAgICAgICMgU3Rkb3V0IG1heSBiZSBTdHJpbmdJTyAoZS5nLiBpbiB0ZXN0cykKICAgICAgICBpbXBvcnQgaW8KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzeXMuc3Rkb3V0LCBpby5UZXh0SU9XcmFwcGVyKToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCgogICAgICAgICMgRG9uJ3Qgd3JhcCBzdGRvdXQgaWYgdXRmLTggaXMgYWxyZWFkeSB0aGUgZW5jb2RpbmcuIFByb3ZpZGVzCiAgICAgICAgIyAgd29ya2Fyb3VuZCBmb3IgIzMzNC4KICAgICAgICBpZiBzeXMuc3Rkb3V0LmVuY29kaW5nLmxvd2VyKCkgaW4gKCd1dGYtOCcsICd1dGY4Jyk6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQoKICAgICAgICAjIFByaW50IG1ldGFkYXRhIGluIFVURi04IG5vIG1hdHRlciB0aGUgcGxhdGZvcm0KICAgICAgICBlbmNvZGluZyA9IHN5cy5zdGRvdXQuZW5jb2RpbmcKICAgICAgICBlcnJvcnMgPSBzeXMuc3Rkb3V0LmVycm9ycwogICAgICAgIG5ld2xpbmUgPSBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJyBhbmQgJ1xuJyBvciBOb25lCiAgICAgICAgbGluZV9idWZmZXJpbmcgPSBzeXMuc3Rkb3V0LmxpbmVfYnVmZmVyaW5nCgogICAgICAgIHN5cy5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKAogICAgICAgICAgICBzeXMuc3Rkb3V0LmRldGFjaCgpLCAndXRmLTgnLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGlvLlRleHRJT1dyYXBwZXIoCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmRldGFjaCgpLCBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLCBsaW5lX2J1ZmZlcmluZykKCgpjbGFzcyBGZWF0dXJlOgogICAgIiIiCiAgICAqKmRlcHJlY2F0ZWQqKiAtLSBUaGUgYEZlYXR1cmVgIGZhY2lsaXR5IHdhcyBuZXZlciBjb21wbGV0ZWx5IGltcGxlbWVudGVkCiAgICBvciBzdXBwb3J0ZWQsIGBoYXMgcmVwb3J0ZWQgaXNzdWVzCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvNTg+YF8gYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbgogICAgYSBmdXR1cmUgdmVyc2lvbi4KCiAgICBBIHN1YnNldCBvZiB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlIGV4Y2x1ZGVkIGlmIHVubmVlZGVkL3dhbnRlZAoKICAgIEZlYXR1cmVzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZXNlIGtleXdvcmQgYXJndW1lbnRzOgoKICAgICAgJ2Rlc2NyaXB0aW9uJyAtLSBhIHNob3J0LCBodW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZSwgdG8KICAgICAgICAgYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcywgYW5kIG9wdGlvbiBoZWxwIG1lc3NhZ2VzLgoKICAgICAgJ3N0YW5kYXJkJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSBpcyBpbmNsdWRlZCBieSBkZWZhdWx0IGlmIGl0IGlzCiAgICAgICAgIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzeXN0ZW0uICBPdGhlcndpc2UsIHRoZSBmZWF0dXJlIGlzIG9ubHkKICAgICAgICAgaW5jbHVkZWQgaWYgcmVxdWVzdGVkIHZpYSBhIGNvbW1hbmQgbGluZSAnLS13aXRoLVgnIG9wdGlvbiwgb3IgaWYKICAgICAgICAgYW5vdGhlciBpbmNsdWRlZCBmZWF0dXJlIHJlcXVpcmVzIGl0LiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnRmFsc2UnLgoKICAgICAgJ2F2YWlsYWJsZScgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciBpbnN0YWxsYXRpb24gb24gdGhlCiAgICAgICAgIGN1cnJlbnQgc3lzdGVtLiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnVHJ1ZScuCgogICAgICAnb3B0aW9uYWwnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlJ3MgaW5jbHVzaW9uIGNhbiBiZSBjb250cm9sbGVkIGZyb20gdGhlCiAgICAgICAgIGNvbW1hbmQgbGluZSwgdXNpbmcgdGhlICctLXdpdGgtWCcgb3IgJy0td2l0aG91dC1YJyBvcHRpb25zLiAgSWYKICAgICAgICAgZmFsc2UsIHRoZSBmZWF0dXJlJ3MgaW5jbHVzaW9uIHN0YXR1cyBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHksCiAgICAgICAgIGJhc2VkIG9uICdhdmFpbGFiaWxlJywgJ3N0YW5kYXJkJywgYW5kIHdoZXRoZXIgYW55IG90aGVyIGZlYXR1cmUKICAgICAgICAgcmVxdWlyZXMgaXQuICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdUcnVlJy4KCiAgICAgICdyZXF1aXJlX2ZlYXR1cmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIG5hbWluZyBmZWF0dXJlcwogICAgICAgICB0aGF0IHNob3VsZCBhbHNvIGJlIGluY2x1ZGVkIGlmIHRoaXMgZmVhdHVyZSBpcyBpbmNsdWRlZC4gIERlZmF1bHRzIHRvCiAgICAgICAgIGVtcHR5IGxpc3QuICBNYXkgYWxzbyBjb250YWluICdSZXF1aXJlJyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlCiAgICAgICAgIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLgoKICAgICAgJ3JlbW92ZScgLS0gYSBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBwYWNrYWdlcyB0byBiZSByZW1vdmVkCiAgICAgICAgIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBpZiB0aGlzIGZlYXR1cmUgaXMgKm5vdCogaW5jbHVkZWQuICBJZiB0aGUKICAgICAgICAgZmVhdHVyZSAqaXMqIGluY2x1ZGVkLCB0aGlzIGFyZ3VtZW50IGlzIGlnbm9yZWQuICBUaGlzIGFyZ3VtZW50IGV4aXN0cwogICAgICAgICB0byBzdXBwb3J0IHJlbW92aW5nIGZlYXR1cmVzIHRoYXQgImNyb3NzY3V0IiBhIGRpc3RyaWJ1dGlvbiwgc3VjaCBhcwogICAgICAgICBkZWZpbmluZyBhICd0ZXN0cycgZmVhdHVyZSB0aGF0IHJlbW92ZXMgYWxsIHRoZSAndGVzdHMnIHN1YnBhY2thZ2VzCiAgICAgICAgIHByb3ZpZGVkIGJ5IG90aGVyIGZlYXR1cmVzLiAgVGhlIGRlZmF1bHQgZm9yIHRoaXMgYXJndW1lbnQgaXMgYW4gZW1wdHkKICAgICAgICAgbGlzdC4gIChOb3RlOiB0aGUgbmFtZWQgcGFja2FnZShzKSBvciBtb2R1bGVzIG11c3QgZXhpc3QgaW4gdGhlIGJhc2UKICAgICAgICAgZGlzdHJpYnV0aW9uIHdoZW4gdGhlICdzZXR1cCgpJyBmdW5jdGlvbiBpcyBpbml0aWFsbHkgY2FsbGVkLikKCiAgICAgIG90aGVyIGtleXdvcmRzIC0tIGFueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc2F2ZWQsIGFuZCBwYXNzZWQgdG8KICAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdpbmNsdWRlKCknIGFuZCAnZXhjbHVkZSgpJyBtZXRob2RzIHdoZW4gdGhlCiAgICAgICAgIGZlYXR1cmUgaXMgaW5jbHVkZWQgb3IgZXhjbHVkZWQsIHJlc3BlY3RpdmVseS4gIFNvLCBmb3IgZXhhbXBsZSwgeW91CiAgICAgICAgIGNvdWxkIHBhc3MgJ3BhY2thZ2VzPVsiYSIsImIiXScgdG8gY2F1c2UgcGFja2FnZXMgJ2EnIGFuZCAnYicgdG8gYmUKICAgICAgICAgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBkaXN0cmlidXRpb24gYXMgYXBwcm9wcmlhdGUuCgogICAgQSBmZWF0dXJlIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgJ3JlcXVpcmVzJywgJ3JlbW92ZScsIG9yIG90aGVyCiAgICBrZXl3b3JkIGFyZ3VtZW50LiAgT3RoZXJ3aXNlLCBpdCBjYW4ndCBhZmZlY3QgdGhlIGRpc3RyaWJ1dGlvbiBpbiBhbnkgd2F5LgogICAgTm90ZSBhbHNvIHRoYXQgeW91IGNhbiBzdWJjbGFzcyAnRmVhdHVyZScgdG8gY3JlYXRlIHlvdXIgb3duIHNwZWNpYWxpemVkCiAgICBmZWF0dXJlIHR5cGVzIHRoYXQgbW9kaWZ5IHRoZSBkaXN0cmlidXRpb24gaW4gb3RoZXIgd2F5cyB3aGVuIGluY2x1ZGVkIG9yCiAgICBleGNsdWRlZC4gIFNlZSB0aGUgZG9jc3RyaW5ncyBmb3IgdGhlIHZhcmlvdXMgbWV0aG9kcyBoZXJlIGZvciBtb3JlIGRldGFpbC4KICAgIEFzaWRlIGZyb20gdGhlIG1ldGhvZHMsIHRoZSBvbmx5IGZlYXR1cmUgYXR0cmlidXRlcyB0aGF0IGRpc3RyaWJ1dGlvbnMgbG9vawogICAgYXQgYXJlICdkZXNjcmlwdGlvbicgYW5kICdvcHRpb25hbCcuCiAgICAiIiIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgd2Fybl9kZXByZWNhdGVkKCk6CiAgICAgICAgbXNnID0gKAogICAgICAgICAgICAiRmVhdHVyZXMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSAiCiAgICAgICAgICAgICJ2ZXJzaW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvNjUuIgogICAgICAgICkKICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTMpCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBkZXNjcmlwdGlvbiwgc3RhbmRhcmQ9RmFsc2UsIGF2YWlsYWJsZT1UcnVlLAogICAgICAgICAgICBvcHRpb25hbD1UcnVlLCByZXF1aXJlX2ZlYXR1cmVzPSgpLCByZW1vdmU9KCksICoqZXh0cmFzKToKICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZCgpCgogICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgogICAgICAgIHNlbGYuc3RhbmRhcmQgPSBzdGFuZGFyZAogICAgICAgIHNlbGYuYXZhaWxhYmxlID0gYXZhaWxhYmxlCiAgICAgICAgc2VsZi5vcHRpb25hbCA9IG9wdGlvbmFsCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXF1aXJlX2ZlYXR1cmVzLCAoc3RyLCBSZXF1aXJlKSk6CiAgICAgICAgICAgIHJlcXVpcmVfZmVhdHVyZXMgPSByZXF1aXJlX2ZlYXR1cmVzLAoKICAgICAgICBzZWxmLnJlcXVpcmVfZmVhdHVyZXMgPSBbCiAgICAgICAgICAgIHIgZm9yIHIgaW4gcmVxdWlyZV9mZWF0dXJlcyBpZiBpc2luc3RhbmNlKHIsIHN0cikKICAgICAgICBdCiAgICAgICAgZXIgPSBbciBmb3IgciBpbiByZXF1aXJlX2ZlYXR1cmVzIGlmIG5vdCBpc2luc3RhbmNlKHIsIHN0cildCiAgICAgICAgaWYgZXI6CiAgICAgICAgICAgIGV4dHJhc1sncmVxdWlyZV9mZWF0dXJlcyddID0gZXIKCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZW1vdmUsIHN0cik6CiAgICAgICAgICAgIHJlbW92ZSA9IHJlbW92ZSwKICAgICAgICBzZWxmLnJlbW92ZSA9IHJlbW92ZQogICAgICAgIHNlbGYuZXh0cmFzID0gZXh0cmFzCgogICAgICAgIGlmIG5vdCByZW1vdmUgYW5kIG5vdCByZXF1aXJlX2ZlYXR1cmVzIGFuZCBub3QgZXh0cmFzOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIkZlYXR1cmUgJXM6IG11c3QgZGVmaW5lICdyZXF1aXJlX2ZlYXR1cmVzJywgJ3JlbW92ZScsIG9yICIKICAgICAgICAgICAgICAgICJhdCBsZWFzdCBvbmUgb2YgJ3BhY2thZ2VzJywgJ3B5X21vZHVsZXMnLCBldGMuIgogICAgICAgICAgICApCgogICAgZGVmIGluY2x1ZGVfYnlfZGVmYXVsdChzZWxmKToKICAgICAgICAiIiJTaG91bGQgdGhpcyBmZWF0dXJlIGJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQ/IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYXZhaWxhYmxlIGFuZCBzZWxmLnN0YW5kYXJkCgogICAgZGVmIGluY2x1ZGVfaW4oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiRW5zdXJlIGZlYXR1cmUgYW5kIGl0cyByZXF1aXJlbWVudHMgYXJlIGluY2x1ZGVkIGluIGRpc3RyaWJ1dGlvbgoKICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbgogICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQogICAgICAgIHBlciBmZWF0dXJlLCBhbmQgc28gc2hvdWxkIGJlIGlkZW1wb3RlbnQuCgogICAgICAgICIiIgoKICAgICAgICBpZiBub3Qgc2VsZi5hdmFpbGFibGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaXB0aW9uICsgIiBpcyByZXF1aXJlZCwgIgogICAgICAgICAgICAgICAgImJ1dCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0iCiAgICAgICAgICAgICkKCiAgICAgICAgZGlzdC5pbmNsdWRlKCoqc2VsZi5leHRyYXMpCgogICAgICAgIGZvciBmIGluIHNlbGYucmVxdWlyZV9mZWF0dXJlczoKICAgICAgICAgICAgZGlzdC5pbmNsdWRlX2ZlYXR1cmUoZikKCiAgICBkZWYgZXhjbHVkZV9mcm9tKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkVuc3VyZSBmZWF0dXJlIGlzIGV4Y2x1ZGVkIGZyb20gZGlzdHJpYnV0aW9uCgogICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbi4gIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIKICAgICAgICBmZWF0dXJlLCBhbmQgb25seSBhZnRlciBhbGwgaW5jbHVkZWQgZmVhdHVyZXMgaGF2ZSBiZWVuIGFza2VkIHRvCiAgICAgICAgaW5jbHVkZSB0aGVtc2VsdmVzLgogICAgICAgICIiIgoKICAgICAgICBkaXN0LmV4Y2x1ZGUoKipzZWxmLmV4dHJhcykKCiAgICAgICAgaWYgc2VsZi5yZW1vdmU6CiAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYucmVtb3ZlOgogICAgICAgICAgICAgICAgZGlzdC5leGNsdWRlX3BhY2thZ2UoaXRlbSkKCiAgICBkZWYgdmFsaWRhdGUoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiVmVyaWZ5IHRoYXQgZmVhdHVyZSBtYWtlcyBzZW5zZSBpbiBjb250ZXh0IG9mIGRpc3RyaWJ1dGlvbgoKICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRpc3RyaWJ1dGlvbiBqdXN0IGJlZm9yZSBpdCBwYXJzZXMgaXRzCiAgICAgICAgY29tbWFuZCBsaW5lLiAgSXQgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSAncmVtb3ZlJyBhdHRyaWJ1dGUsIGlmIGFueSwKICAgICAgICBjb250YWlucyBvbmx5IHZhbGlkIHBhY2thZ2UvbW9kdWxlIG5hbWVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIGJhc2UKICAgICAgICBkaXN0cmlidXRpb24gd2hlbiAnc2V0dXAoKScgaXMgY2FsbGVkLiAgWW91IG1heSBvdmVycmlkZSBpdCBpbiBhCiAgICAgICAgc3ViY2xhc3MgdG8gcGVyZm9ybSBhbnkgb3RoZXIgcmVxdWlyZWQgdmFsaWRhdGlvbiBvZiB0aGUgZmVhdHVyZQogICAgICAgIGFnYWluc3QgYSB0YXJnZXQgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgoKICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgaWYgbm90IGRpc3QuaGFzX2NvbnRlbnRzX2ZvcihpdGVtKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIiVzIHdhbnRzIHRvIGJlIGFibGUgdG8gcmVtb3ZlICVzLCBidXQgdGhlIGRpc3RyaWJ1dGlvbiIKICAgICAgICAgICAgICAgICAgICAiIGRvZXNuJ3QgY29udGFpbiBhbnkgcGFja2FnZXMgb3IgbW9kdWxlcyB1bmRlciAlcyIKICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBpdGVtLCBpdGVtKQogICAgICAgICAgICAgICAgKQpQSwMEFAAAAAAAAAAhALmqke7BBgAAwQYAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9leHRlbnNpb24ucHlpbXBvcnQgcmUKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKaW1wb3J0IGRpc3R1dGlscy5leHRlbnNpb24KCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gLm1vbmtleSBpbXBvcnQgZ2V0X3VucGF0Y2hlZAoKCmRlZiBfaGF2ZV9jeXRob24oKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgQ3l0aG9uIGNhbiBiZSBpbXBvcnRlZC4KICAgICIiIgogICAgY3l0aG9uX2ltcGwgPSAnQ3l0aG9uLkRpc3R1dGlscy5idWlsZF9leHQnCiAgICB0cnk6CiAgICAgICAgIyBmcm9tIChjeXRob25faW1wbCkgaW1wb3J0IGJ1aWxkX2V4dAogICAgICAgIF9faW1wb3J0X18oY3l0aG9uX2ltcGwsIGZyb21saXN0PVsnYnVpbGRfZXh0J10pLmJ1aWxkX2V4dAogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHBhc3MKICAgIHJldHVybiBGYWxzZQoKCiMgZm9yIGNvbXBhdGliaWxpdHkKaGF2ZV9weXJleCA9IF9oYXZlX2N5dGhvbgoKX0V4dGVuc2lvbiA9IGdldF91bnBhdGNoZWQoZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uKQoKCmNsYXNzIEV4dGVuc2lvbihfRXh0ZW5zaW9uKToKICAgICIiIkV4dGVuc2lvbiB0aGF0IHVzZXMgJy5jJyBmaWxlcyBpbiBwbGFjZSBvZiAnLnB5eCcgZmlsZXMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgc291cmNlcywgKmFyZ3MsICoqa3cpOgogICAgICAgICMgVGhlICphcmdzIGlzIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eSBhcyBjYWxscyBtYXkgdXNlIHBvc2l0aW9uYWwKICAgICAgICAjIGFyZ3VtZW50cy4gcHlfbGltaXRlZF9hcGkgbWF5IGJlIHNldCBvbmx5IHZpYSBrZXl3b3JkLgogICAgICAgIHNlbGYucHlfbGltaXRlZF9hcGkgPSBrdy5wb3AoInB5X2xpbWl0ZWRfYXBpIiwgRmFsc2UpCiAgICAgICAgX0V4dGVuc2lvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBzb3VyY2VzLCAqYXJncywgKiprdykKCiAgICBkZWYgX2NvbnZlcnRfcHl4X3NvdXJjZXNfdG9fbGFuZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlIHNvdXJjZXMgd2l0aCAucHl4IGV4dGVuc2lvbnMgdG8gc291cmNlcyB3aXRoIHRoZSB0YXJnZXQKICAgICAgICBsYW5ndWFnZSBleHRlbnNpb24uIFRoaXMgbWVjaGFuaXNtIGFsbG93cyBsYW5ndWFnZSBhdXRob3JzIHRvIHN1cHBseQogICAgICAgIHByZS1jb252ZXJ0ZWQgc291cmNlcyBidXQgdG8gcHJlZmVyIHRoZSAucHl4IHNvdXJjZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgX2hhdmVfY3l0aG9uKCk6CiAgICAgICAgICAgICMgdGhlIGJ1aWxkIGhhcyBDeXRob24sIHNvIGFsbG93IGl0IHRvIGNvbXBpbGUgdGhlIC5weXggZmlsZXMKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbGFuZyA9IHNlbGYubGFuZ3VhZ2Ugb3IgJycKICAgICAgICB0YXJnZXRfZXh0ID0gJy5jcHAnIGlmIGxhbmcubG93ZXIoKSA9PSAnYysrJyBlbHNlICcuYycKICAgICAgICBzdWIgPSBmdW5jdG9vbHMucGFydGlhbChyZS5zdWIsICcucHl4JCcsIHRhcmdldF9leHQpCiAgICAgICAgc2VsZi5zb3VyY2VzID0gbGlzdChtYXAoc3ViLCBzZWxmLnNvdXJjZXMpKQoKCmNsYXNzIExpYnJhcnkoRXh0ZW5zaW9uKToKICAgICIiIkp1c3QgbGlrZSBhIHJlZ3VsYXIgRXh0ZW5zaW9uLCBidXQgYnVpbHQgYXMgYSBsaWJyYXJ5IGluc3RlYWQiIiIKUEsDBBQAAAAAAAAAIQDQintlgwAAAIMAAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5ZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgVmVuZG9ySW1wb3J0ZXIKCm5hbWVzID0gJ3NpeCcsClZlbmRvckltcG9ydGVyKF9fbmFtZV9fLCBuYW1lcywgJ3BrZ19yZXNvdXJjZXMuX3ZlbmRvcicpLmluc3RhbGwoKQpQSwMEFAAAAAAAAAAhAATqwb1KDAAASgwAADgAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9nbGliYy5weSMgVGhpcyBmaWxlIG9yaWdpbmFsbHkgZnJvbSBwaXA6CiMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2Jsb2IvOGY0ZjE1YTVhOTVkN2Q1YjUxMWNlYWVlOWVkMjYxMTc2YzE4MTk3MC9zcmMvcGlwL19pbnRlcm5hbC91dGlscy9nbGliYy5weQpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGN0eXBlcwppbXBvcnQgcmUKaW1wb3J0IHdhcm5pbmdzCgoKZGVmIGdsaWJjX3ZlcnNpb25fc3RyaW5nKCk6CiAgICAiUmV0dXJucyBnbGliYyB2ZXJzaW9uIHN0cmluZywgb3IgTm9uZSBpZiBub3QgdXNpbmcgZ2xpYmMuIgoKICAgICMgY3R5cGVzLkNETEwoTm9uZSkgaW50ZXJuYWxseSBjYWxscyBkbG9wZW4oTlVMTCksIGFuZCBhcyB0aGUgZGxvcGVuCiAgICAjIG1hbnBhZ2Ugc2F5cywgIklmIGZpbGVuYW1lIGlzIE5VTEwsIHRoZW4gdGhlIHJldHVybmVkIGhhbmRsZSBpcyBmb3IgdGhlCiAgICAjIG1haW4gcHJvZ3JhbSIuIFRoaXMgd2F5IHdlIGNhbiBsZXQgdGhlIGxpbmtlciBkbyB0aGUgd29yayB0byBmaWd1cmUgb3V0CiAgICAjIHdoaWNoIGxpYmMgb3VyIHByb2Nlc3MgaXMgYWN0dWFsbHkgdXNpbmcuCiAgICBwcm9jZXNzX25hbWVzcGFjZSA9IGN0eXBlcy5DRExMKE5vbmUpCiAgICB0cnk6CiAgICAgICAgZ251X2dldF9saWJjX3ZlcnNpb24gPSBwcm9jZXNzX25hbWVzcGFjZS5nbnVfZ2V0X2xpYmNfdmVyc2lvbgogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICMgU3ltYm9sIGRvZXNuJ3QgZXhpc3QgLT4gdGhlcmVmb3JlLCB3ZSBhcmUgbm90IGxpbmtlZCB0bwogICAgICAgICMgZ2xpYmMuCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAjIENhbGwgZ251X2dldF9saWJjX3ZlcnNpb24sIHdoaWNoIHJldHVybnMgYSBzdHJpbmcgbGlrZSAiMi41IgogICAgZ251X2dldF9saWJjX3ZlcnNpb24ucmVzdHlwZSA9IGN0eXBlcy5jX2NoYXJfcAogICAgdmVyc2lvbl9zdHIgPSBnbnVfZ2V0X2xpYmNfdmVyc2lvbigpCiAgICAjIHB5MiAvIHB5MyBjb21wYXRpYmlsaXR5OgogICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbl9zdHIsIHN0cik6CiAgICAgICAgdmVyc2lvbl9zdHIgPSB2ZXJzaW9uX3N0ci5kZWNvZGUoImFzY2lpIikKCiAgICByZXR1cm4gdmVyc2lvbl9zdHIKCgojIFNlcGFyYXRlZCBvdXQgZnJvbSBoYXZlX2NvbXBhdGlibGVfZ2xpYmMgZm9yIGVhc2llciB1bml0IHRlc3RpbmcKZGVmIGNoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgICMgUGFyc2Ugc3RyaW5nIGFuZCBjaGVjayBhZ2FpbnN0IHJlcXVlc3RlZCB2ZXJzaW9uLgogICAgIwogICAgIyBXZSB1c2UgYSByZWdleHAgaW5zdGVhZCBvZiBzdHIuc3BsaXQgYmVjYXVzZSB3ZSB3YW50IHRvIGRpc2NhcmQgYW55CiAgICAjIHJhbmRvbSBqdW5rIHRoYXQgbWlnaHQgY29tZSBhZnRlciB0aGUgbWlub3IgdmVyc2lvbiAtLSB0aGlzIG1pZ2h0IGhhcHBlbgogICAgIyBpbiBwYXRjaGVkL2ZvcmtlZCB2ZXJzaW9ucyBvZiBnbGliYyAoZS5nLiBMaW5hcm8ncyB2ZXJzaW9uIG9mIGdsaWJjCiAgICAjIHVzZXMgdmVyc2lvbiBzdHJpbmdzIGxpa2UgIjIuMjAtMjAxNC4xMSIpLiBTZWUgZ2gtMzU4OC4KICAgIG0gPSByZS5tYXRjaChyIig/UDxtYWpvcj5bMC05XSspXC4oP1A8bWlub3I+WzAtOV0rKSIsIHZlcnNpb25fc3RyKQogICAgaWYgbm90IG06CiAgICAgICAgd2FybmluZ3Mud2FybigiRXhwZWN0ZWQgZ2xpYmMgdmVyc2lvbiB3aXRoIDIgY29tcG9uZW50cyBtYWpvci5taW5vciwiCiAgICAgICAgICAgICAgICAgICAgICAiIGdvdDogJXMiICUgdmVyc2lvbl9zdHIsIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIChpbnQobS5ncm91cCgibWFqb3IiKSkgPT0gcmVxdWlyZWRfbWFqb3IgYW5kCiAgICAgICAgICAgIGludChtLmdyb3VwKCJtaW5vciIpKSA+PSBtaW5pbXVtX21pbm9yKQoKCmRlZiBoYXZlX2NvbXBhdGlibGVfZ2xpYmMocmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpOgogICAgdmVyc2lvbl9zdHIgPSBnbGliY192ZXJzaW9uX3N0cmluZygpCiAgICBpZiB2ZXJzaW9uX3N0ciBpcyBOb25lOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIGNoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKQoKCiMgcGxhdGZvcm0ubGliY192ZXIgcmVndWxhcmx5IHJldHVybnMgY29tcGxldGVseSBub25zZW5zaWNhbCBnbGliYwojIHZlcnNpb25zLiBFLmcuIG9uIG15IGNvbXB1dGVyLCBwbGF0Zm9ybSBzYXlzOgojCiMgICB+JCBweXRob24yLjcgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQocGxhdGZvcm0ubGliY192ZXIoKSknCiMgICAoJ2dsaWJjJywgJzIuNycpCiMgICB+JCBweXRob24zLjUgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQocGxhdGZvcm0ubGliY192ZXIoKSknCiMgICAoJ2dsaWJjJywgJzIuOScpCiMKIyBCdXQgdGhlIHRydXRoIGlzOgojCiMgICB+JCBsZGQgLS12ZXJzaW9uCiMgICBsZGQgKERlYmlhbiBHTElCQyAyLjIyLTExKSAyLjIyCiMKIyBUaGlzIGlzIHVuZm9ydHVuYXRlLCBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgdGhlIGxpbmVoYXVsIGRhdGEgb24gbGliYwojIHZlcnNpb25zIHRoYXQgd2FzIGdlbmVyYXRlZCBieSBwaXAgOC4xLjIgYW5kIGVhcmxpZXIgaXMgdXNlbGVzcyBhbmQKIyBtaXNsZWFkaW5nLiBTb2x1dGlvbjogaW5zdGVhZCBvZiB1c2luZyBwbGF0Zm9ybSwgdXNlIG91ciBjb2RlIHRoYXQgYWN0dWFsbHkKIyB3b3Jrcy4KZGVmIGxpYmNfdmVyKCk6CiAgICAiIiJUcnkgdG8gZGV0ZXJtaW5lIHRoZSBnbGliYyB2ZXJzaW9uCgogICAgUmV0dXJucyBhIHR1cGxlIG9mIHN0cmluZ3MgKGxpYiwgdmVyc2lvbikgd2hpY2ggZGVmYXVsdCB0byBlbXB0eSBzdHJpbmdzCiAgICBpbiBjYXNlIHRoZSBsb29rdXAgZmFpbHMuCiAgICAiIiIKICAgIGdsaWJjX3ZlcnNpb24gPSBnbGliY192ZXJzaW9uX3N0cmluZygpCiAgICBpZiBnbGliY192ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuICgiIiwgIiIpCiAgICBlbHNlOgogICAgICAgIHJldHVybiAoImdsaWJjIiwgZ2xpYmNfdmVyc2lvbikKUEsDBBQAAAAAAAAAIQC8XaE5VxQAAFcUAAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xvYi5weSIiIgpGaWxlbmFtZSBnbG9iYmluZyB1dGlsaXR5LiBNb3N0bHkgYSBjb3B5IG9mIGBnbG9iYCBmcm9tIFB5dGhvbiAzLjUuCgpDaGFuZ2VzIGluY2x1ZGU6CiAqIGB5aWVsZCBmcm9tYCBhbmQgUEVQMzEwMiBgKmAgcmVtb3ZlZC4KICogYGJ5dGVzYCBjaGFuZ2VkIHRvIGBzaXguYmluYXJ5X3R5cGVgLgogKiBIaWRkZW4gZmlsZXMgYXJlIG5vdCBpZ25vcmVkLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IGZubWF0Y2gKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXggaW1wb3J0IGJpbmFyeV90eXBlCgpfX2FsbF9fID0gWyJnbG9iIiwgImlnbG9iIiwgImVzY2FwZSJdCgoKZGVmIGdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1GYWxzZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KCiAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCiAgICBkb3QgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgYnkgJyonIGFuZCAnPycKICAgIHBhdHRlcm5zLgoKICAgIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGUgcGF0dGVybiAnKionIHdpbGwgbWF0Y2ggYW55IGZpbGVzIGFuZAogICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIGFuZCBzdWJkaXJlY3Rvcmllcy4KICAgICIiIgogICAgcmV0dXJuIGxpc3QoaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1yZWN1cnNpdmUpKQoKCmRlZiBpZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlPUZhbHNlKToKICAgICIiIlJldHVybiBhbiBpdGVyYXRvciB3aGljaCB5aWVsZHMgdGhlIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KCiAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCiAgICBkb3QgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgYnkgJyonIGFuZCAnPycKICAgIHBhdHRlcm5zLgoKICAgIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGUgcGF0dGVybiAnKionIHdpbGwgbWF0Y2ggYW55IGZpbGVzIGFuZAogICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIGFuZCBzdWJkaXJlY3Rvcmllcy4KICAgICIiIgogICAgaXQgPSBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSkKICAgIGlmIHJlY3Vyc2l2ZSBhbmQgX2lzcmVjdXJzaXZlKHBhdGhuYW1lKToKICAgICAgICBzID0gbmV4dChpdCkgICMgc2tpcCBlbXB0eSBzdHJpbmcKICAgICAgICBhc3NlcnQgbm90IHMKICAgIHJldHVybiBpdAoKCmRlZiBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSk6CiAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aG5hbWUpCiAgICBpZiBub3QgaGFzX21hZ2ljKHBhdGhuYW1lKToKICAgICAgICBpZiBiYXNlbmFtZToKICAgICAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHBhdGhuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGhuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBQYXR0ZXJucyBlbmRpbmcgd2l0aCBhIHNsYXNoIHNob3VsZCBtYXRjaCBvbmx5IGRpcmVjdG9yaWVzCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRobmFtZQogICAgICAgIHJldHVybgogICAgaWYgbm90IGRpcm5hbWU6CiAgICAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUoYmFzZW5hbWUpOgogICAgICAgICAgICBmb3IgeCBpbiBnbG9iMihkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIHggaW4gZ2xvYjEoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgeAogICAgICAgIHJldHVybgogICAgIyBgb3MucGF0aC5zcGxpdCgpYCByZXR1cm5zIHRoZSBhcmd1bWVudCBpdHNlbGYgYXMgYSBkaXJuYW1lIGlmIGl0IGlzIGEKICAgICMgZHJpdmUgb3IgVU5DIHBhdGguICBQcmV2ZW50IGFuIGluZmluaXRlIHJlY3Vyc2lvbiBpZiBhIGRyaXZlIG9yIFVOQyBwYXRoCiAgICAjIGNvbnRhaW5zIG1hZ2ljIGNoYXJhY3RlcnMgKGkuZS4gcidcXD9cQzonKS4KICAgIGlmIGRpcm5hbWUgIT0gcGF0aG5hbWUgYW5kIGhhc19tYWdpYyhkaXJuYW1lKToKICAgICAgICBkaXJzID0gX2lnbG9iKGRpcm5hbWUsIHJlY3Vyc2l2ZSkKICAgIGVsc2U6CiAgICAgICAgZGlycyA9IFtkaXJuYW1lXQogICAgaWYgaGFzX21hZ2ljKGJhc2VuYW1lKToKICAgICAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShiYXNlbmFtZSk6CiAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjIKICAgICAgICBlbHNlOgogICAgICAgICAgICBnbG9iX2luX2RpciA9IGdsb2IxCiAgICBlbHNlOgogICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjAKICAgIGZvciBkaXJuYW1lIGluIGRpcnM6CiAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYl9pbl9kaXIoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkKCgojIFRoZXNlIDIgaGVscGVyIGZ1bmN0aW9ucyBub24tcmVjdXJzaXZlbHkgZ2xvYiBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KIyBUaGV5IHJldHVybiBhIGxpc3Qgb2YgYmFzZW5hbWVzLiBgZ2xvYjFgIGFjY2VwdHMgYSBwYXR0ZXJuIHdoaWxlIGBnbG9iMGAKIyB0YWtlcyBhIGxpdGVyYWwgYmFzZW5hbWUgKHNvIGl0IG9ubHkgaGFzIHRvIGNoZWNrIGZvciBpdHMgZXhpc3RlbmNlKS4KCgpkZWYgZ2xvYjEoZGlybmFtZSwgcGF0dGVybik6CiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJpbmFyeV90eXBlKToKICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpci5lbmNvZGUoJ0FTQ0lJJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICByZXR1cm4gW10KICAgIHJldHVybiBmbm1hdGNoLmZpbHRlcihuYW1lcywgcGF0dGVybikKCgpkZWYgZ2xvYjAoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgaWYgbm90IGJhc2VuYW1lOgogICAgICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyBhbiBlbXB0eSBiYXNlbmFtZSBmb3IgcGF0aHMgZW5kaW5nIHdpdGggYQogICAgICAgICMgZGlyZWN0b3J5IHNlcGFyYXRvci4gICdxKngvJyBzaG91bGQgbWF0Y2ggb25seSBkaXJlY3Rvcmllcy4KICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICByZXR1cm4gW2Jhc2VuYW1lXQogICAgZWxzZToKICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMob3MucGF0aC5qb2luKGRpcm5hbWUsIGJhc2VuYW1lKSk6CiAgICAgICAgICAgIHJldHVybiBbYmFzZW5hbWVdCiAgICByZXR1cm4gW10KCgojIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHlpZWxkcyByZWxhdGl2ZSBwYXRobmFtZXMgaW5zaWRlIGEgbGl0ZXJhbAojIGRpcmVjdG9yeS4KCgpkZWYgZ2xvYjIoZGlybmFtZSwgcGF0dGVybik6CiAgICBhc3NlcnQgX2lzcmVjdXJzaXZlKHBhdHRlcm4pCiAgICB5aWVsZCBwYXR0ZXJuWzowXQogICAgZm9yIHggaW4gX3JsaXN0ZGlyKGRpcm5hbWUpOgogICAgICAgIHlpZWxkIHgKCgojIFJlY3Vyc2l2ZWx5IHlpZWxkcyByZWxhdGl2ZSBwYXRobmFtZXMgaW5zaWRlIGEgbGl0ZXJhbCBkaXJlY3RvcnkuCmRlZiBfcmxpc3RkaXIoZGlybmFtZSk6CiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiBpc2luc3RhbmNlKGRpcm5hbWUsIGJpbmFyeV90eXBlKToKICAgICAgICAgICAgZGlybmFtZSA9IGJpbmFyeV90eXBlKG9zLmN1cmRpciwgJ0FTQ0lJJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgcmV0dXJuCiAgICBmb3IgeCBpbiBuYW1lczoKICAgICAgICB5aWVsZCB4CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCB4KSBpZiBkaXJuYW1lIGVsc2UgeAogICAgICAgIGZvciB5IGluIF9ybGlzdGRpcihwYXRoKToKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHgsIHkpCgoKbWFnaWNfY2hlY2sgPSByZS5jb21waWxlKCcoWyo/W10pJykKbWFnaWNfY2hlY2tfYnl0ZXMgPSByZS5jb21waWxlKGInKFsqP1tdKScpCgoKZGVmIGhhc19tYWdpYyhzKToKICAgIGlmIGlzaW5zdGFuY2UocywgYmluYXJ5X3R5cGUpOgogICAgICAgIG1hdGNoID0gbWFnaWNfY2hlY2tfYnl0ZXMuc2VhcmNoKHMpCiAgICBlbHNlOgogICAgICAgIG1hdGNoID0gbWFnaWNfY2hlY2suc2VhcmNoKHMpCiAgICByZXR1cm4gbWF0Y2ggaXMgbm90IE5vbmUKCgpkZWYgX2lzcmVjdXJzaXZlKHBhdHRlcm4pOgogICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBiaW5hcnlfdHlwZSk6CiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT0gYicqKicKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT0gJyoqJwoKCmRlZiBlc2NhcGUocGF0aG5hbWUpOgogICAgIiIiRXNjYXBlIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICAiIiIKICAgICMgRXNjYXBpbmcgaXMgZG9uZSBieSB3cmFwcGluZyBhbnkgb2YgIio/WyIgYmV0d2VlbiBzcXVhcmUgYnJhY2tldHMuCiAgICAjIE1ldGFjaGFyYWN0ZXJzIGRvIG5vdCB3b3JrIGluIHRoZSBkcml2ZSBwYXJ0IGFuZCBzaG91bGRuJ3QgYmUgZXNjYXBlZC4KICAgIGRyaXZlLCBwYXRobmFtZSA9IG9zLnBhdGguc3BsaXRkcml2ZShwYXRobmFtZSkKICAgIGlmIGlzaW5zdGFuY2UocGF0aG5hbWUsIGJpbmFyeV90eXBlKToKICAgICAgICBwYXRobmFtZSA9IG1hZ2ljX2NoZWNrX2J5dGVzLnN1YihicidbXDFdJywgcGF0aG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGhuYW1lID0gbWFnaWNfY2hlY2suc3ViKHInW1wxXScsIHBhdGhuYW1lKQogICAgcmV0dXJuIGRyaXZlICsgcGF0aG5hbWUKUEsDBBQAAAAAAAAAIQAQ+fwpAAABAAAAAQA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ3VpLTMyLmV4ZU1akAADAAAABAAAAP//AAC4AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAAAOH7oOALQJzSG4AUzNIVRoaXMgcHJvZ3JhbSBj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wfkFweAGAwSNoCpBAOsCi8L2QCSAD4Vn////M8k72Q+EXf///4oTiY3Y/f//iY3g/f//iY28/f//iJXv/f//hNIPhB8KAABDg73Y/f//AImdxP3//w+MCwoAAIrCLCA8WHcRD77CD76AWOJAAIPgDzP26wQz9jPAD76EwXjiQABqB8H4BFmJhZT9//87wQ+HrQkAAP8khQszQACDjej9////ibWQ/f//ibXA/f//ibXM/f//ibXQ/f//ibXw/f//ibXI/f//6XYJAAAPvsKD6CB0SoPoA3Q2g+gIdCVISHQVg+gDD4VXCQAAg43w/f//COlLCQAAg43w/f//BOk/CQAAg43w/f//AekzCQAAgY3w/f//gAAAAOkkCQAAg43w/f//AukYCQAAgPoqdSyDxwSJvdz9//+Lf/w7/om9zP3//w+N+QgAAION8P3//wT3ncz9///p5wgAAIuFzP3//2vACg++yo1ECNCJhcz9///pzAgAAIm16P3//+nBCAAAgPoqdSaDxwSJvdz9//+Lf/w7/om96P3//w+NoggAAION6P3////plggAAIuF6P3//2vACg++yo1ECNCJhej9///pewgAAID6SXRVgPpodESA+mx0GID6dw+FYwgAAIGN8P3//wAIAADpVAgAAIA7bHUWQ4GN8P3//wAQAACJncT9///pOQgAAION8P3//xDpLQgAAION8P3//yDpIQgAAIoDPDZ1HYB7ATR1F0NDgY3w/f//AIAAAImdxP3//+n+BwAAPDN1HYB7ATJ1F0NDgaXw/f///3///4mdxP3//+ndBwAAPGQPhNUHAAA8aQ+EzQcAADxvD4TFBwAAPHUPhL0HAAA8eA+EtQcAADxYD4StBwAAibWU/f//jYWk/f//UA+2wlCJtcj9///oCD0AAFmFwIqF7/3//1l0IouNtP3//4212P3//+ik+///igNDiZ3E/f//hMAPhKT8//+LjbT9//+Ntdj9///ogvv//+lNBwAAD77Cg/hkD4/oAQAAD4R5AgAAg/hTD4/yAAAAD4SAAAAAg+hBdBBISHRYSEh0CEhID4WSBQAAgMIgx4WQ/f//AQAAAIiV7/3//4ON8P3//0A5tej9//+NnfT9//+4AAIAAImd5P3//4mFoP3//w+NSAIAAMeF6P3//wYAAADppQIAAPeF8P3//zAIAAAPhZgAAACBjfD9//8ACAAA6YkAAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJvdz9//+Lf/yJveT9//8PhLEEAAA7/nULoZQSQQCJheT9//+LheT9///Hhcj9//8BAAAA6X8EAACD6FgPhNoCAABISHR5K8EPhCf///9ISA+FngQAAIPHBPeF8P3//xAIAACJvdz9//90MA+3R/xQaAACAACNhfT9//9QjYXg/f//UOhLOwAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6MI4AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Do4AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugiCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6EEgAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoEiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6O0fAABZ/9BZWYA7LXURgY3w/f//AAEAAEOJneT9//9T6QP+///Hhej9//8IAAAAiY24/f//6ySD6HMPhLb8//9ISA+Eif7//4PoAw+FtgEAAMeFuP3//ycAAAD2hfD9//+Ax4Xg/f//EAAAAA+Eaf7//4qFuP3//wRRxoXU/f//MIiF1f3//8eF0P3//wIAAADpRf7///fBABAAAA+FS/7//4PHBPbBIHQYib3c/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om93P3///bBQHQbO9Z/F3wEO8ZzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIvai/h1AjPbg73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LxwvDdQYhhdD9//+NdfOLhej9////jej9//+FwH8Gi8cLw3Qti4Xg/f//mVJQU1fo5DcAAIPBMIP5OYmdoP3//4v4i9p+BgONuP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF4P3//4m15P3//3RhhcB0B4vOgDkwdFb/jeT9//+LjeT9///GATBA6z5JZjkwdAZAQDvOdfQrheT9///R+OsoO/51C6GQEkEAiYXk/f//i4Xk/f//6wdJgDgAdAVAO8519SuF5P3//4mF4P3//4O9wP3//wAPhVwBAACLhfD9//+oQHQyqQABAAB0CcaF1P3//y3rGKgBdAnGhdT9//8r6wuoAnQRxoXU/f//IMeF0P3//wEAAACLncz9//8rneD9//8rndD9///2hfD9//8MdRf/tbT9//+Nhdj9//9TaiDocPX//4PEDP+10P3//4u9tP3//42F2P3//42N1P3//+h29f//9oXw/f//CFl0G/aF8P3//wR1EldTajCNhdj9///oLvX//4PEDIO9yP3//wCLheD9//90ZoXAfmKLteT9//+JhaD9//8Ptwb/jaD9//9QagaNRfRQjYWY/f//RlBG6OU1AACDxBCFwHUoOYWY/f//dCD/tZj9//+Nhdj9//+NTfTo8fT//4O9oP3//wBZdbXrHION2P3////rE4uN5P3//1CNhdj9///oyvT//1mDvdj9//8AfBv2hfD9//8EdBJXU2ogjYXY/f//6IL0//+DxAyDvbz9//8AdBP/tbz9///oCAgAAIOlvP3//wBZi53E/f//igOIhe/9//+EwHQTi42U/f//i73c/f//itDp4fX//4C9sP3//wB0CouFrP3//4NgcP2Lhdj9//+LTfxfXjPNW+ja6///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tUDl//+JjSDl//88AXQEPAJ1Uv+1QOX//+glJQAAWWY7hUDl//8PhWgDAACDhTjl//8Cg70g5f//AHQpag1YUImFQOX//+j4JAAAWWY7hUDl//8PhTsDAAD/hTjl////hTDl//+LRRA5hUTl//8Pgvn9///pJwMAAIsOihP/hTjl//+IVA80iw6JRA846Q4DAAAzyYsGA8f2QASAD4S/AgAAi4U05f//iY1A5f//hNsPhcoAAACJhTzl//85TRAPhiADAADrBou1KOX//4uNPOX//4OlROX//wArjTTl//+NhUjl//87TRBzOYuVPOX///+FPOX//4oSQYD6CnUQ/4Uw5f//xgANQP+FROX//4gQQP+FROX//4G9ROX///8TAABywovYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhEICAACLhSzl//8BhTjl//87ww+MOgIAAIuFPOX//yuFNOX//ztFEA+CTP///+kgAgAAiYVE5f//gPsCD4XRAAAAOU0QD4ZNAgAA6waLtSjl//+LjUTl//+DpTzl//8AK4005f//jYVI5f//O00Qc0aLlUTl//+DhUTl//8CD7cSQUFmg/oKdRaDhTDl//8Cag1bZokYQECDhTzl//8Cg4U85f//AmaJEEBAgb085f///hMAAHK1i9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EYgEAAIuFLOX//wGFOOX//zvDD4xaAQAAi4VE5f//K4U05f//O0UQD4I/////6UABAAA5TRAPhnwBAACLjUTl//+DpTzl//8AK4005f//agKNhUj5//9eO00QczyLlUTl//8PtxIBtUTl//8DzmaD+gp1DmoNW2aJGAPGAbU85f//AbU85f//ZokQA8aBvTzl//+oBgAAcr8z9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbDgQACL2DveD4SXAAAAagCNhSzl//9Qi8MrxlCNhDXw6///UIuFKOX//4sA/zQH/xWY4EAAhcB0DAO1LOX//zvef8vrDP8VXOBAAImFQOX//zvef1yLhUTl//8rhTTl//+JhTjl//87RRAPggr////rP2oAjY0s5f//Uf91EP+1NOX///8w/xWY4EAAhcB0FYuFLOX//4OlQOX//wCJhTjl///rDP8VXOBAAImFQOX//4O9OOX//wB1bIO9QOX//wB0LWoFXjm1QOX//3UU6LK2///HAAkAAADourb//4kw6z//tUDl///ovrb//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOhytv//xwAcAAAA6Hq2//+DIACDyP/rDIuFOOX//yuFMOX//19bi038M81e6Nid///Jw2oQaPD3QADohLb//4tFCIP4/nUb6D62//+DIADoI7b//8cACQAAAIPI/+mdAAAAM/87x3wIOwWQKkEAciHoFbb//4k46Pu1///HAAkAAABXV1dXV+iDtf//g8QU68mLyMH5BY0cjaAqQQCL8IPmH8HmBosLD75MMQSD4QF0v1DoOSQAAFmJffyLA/ZEMAQBdBb/dRD/dQz/dQjoLvj//4PEDIlF5OsW6Ji1///HAAkAAADooLX//4k4g03k/8dF/P7////oCQAAAItF5OgEtv//w/91COiDJAAAWcNqEGgQ+EAA6Ki1//+LRQiD+P51E+hPtf//xwAJAAAAg8j/6aoAAAAz2zvDfAg7BZAqQQByGugutf//xwAJAAAAU1NTU1PotrT//4PEFOvQi8jB+QWNPI2gKkEAi/CD5h/B5gaLDw++TA4Eg+EBdMZQ6GwjAABZiV38iwf2RAYEAXQx/3UI6OAiAABZUP8V5OBAAIXAdQv/FVzgQACJReTrA4ld5Dld5HQZ6M20//+LTeSJCOiwtP//xwAJAAAAg03k/8dF/P7////oCQAAAItF5Ogjtf//w/91COiiIwAAWcOL/1WL7IPsEFMz2zldCHUc6HK0//9TU1NTU8cAFgAAAOj6s///g8QUM8DralaLdQw783Ua6E60//9TU1NTU8cAFgAAAOjWs///g8QU6wU5dQhyBDPA6z7/dRCNTfDoxpv//4tN9I1G/zlZCHQcSDlFCHcKD7YQ9kQKHQR18IvOK8iD4QEr8U6Lxjhd/HQHi034g2Fw/V5bycOL/1WL7GoA/3UM/3UI6FX///+DxAxdw4v/VYvsg+wUUzPbVot1CDldFHUQO/N1EDldDHUQM8Dp5wEAADvzdAU5XQx3Huils///ahZeU1NTU1OJMOgus///g8QUi8bpwAEAADldFHUEiB7ryVeLfRA7+3UeiB7odLP//2oWXlNTU1NTiTDo/bL//4PEFOkoAQAA/3UYjU3s6POa//+LRfA5WAh1Ff91FFf/dQxW6KMKAACDxBDpTAEAAIN9FP+LVQyLxnUPig+ICEBHOst0H0p18+saig+ICEBHOst0CEp0Bf9NFHXuOV0UdQOIGEA70w+FyAAAADgfdAaDfRQBdTWNeP+Jffw7/nIejUXsUItF/A+2AFDo0L7//1lZhcB0CP9N/Dl1/HPii8crRfyoAQ+FwwAAAIN9FP91WotFDIP4AXY6jXwG/ol9FDv+ciGNRexQi0UUD7YAUOiMvv//WVmFwHQI/00UOXUUc+KLRQyLzytNFPbBAXQEiB/rBIhcBv84Xfh0B4tF9INgcP1qUFjpjQAAAIge6FOy//9qIl5TU1NTU4kw6Nyx//+DxBQ4Xfh0B4tF9INgcP2Lxutki8grzoP5AnxNjXj+iX0UO/5yHo1F7FCLRRQPtgBQ6Am+//9ZWYXAdAj/TRQ5dRRz4ovHK0UUqAF0HIgf6PCx//+LyGoqWIkBOF34dBeLTfSDYXD96w44Xfh0B4tF9INgcP0zwF9eW8nDi/9Vi+yLRQiFwHQSg+gIgTjd3QAAdQdQ6Bi1//9ZXcOL/1WL7IPsFKGAEkEAM8WJRfxTVjPbV4vxOR2EKUEAdThTUzP/R1doZOpAAGgAAQAAU/8V8OBAAIXAdAiJPYQpQQDrFf8VXOBAAIP4eHUKxwWEKUEAAgAAADldFH4ii00Ui0UQSTgYdAhAO8t19oPJ/4tFFCvBSDtFFH0BQIlFFKGEKUEAg/gCD4SsAQAAO8MPhKQBAACD+AEPhcwBAACJXfg5XSB1CIsGi0AEiUUgizXs4EAAM8A5XSRTU/91FA+VwP91EI0ExQEAAABQ/3Ug/9aL+Dv7D4SPAQAAfkNq4DPSWPf3g/gCcjeNRD8IPQAEAAB3E+iOIwAAi8Q7w3QcxwDMzAAA6xFQ6Azk//9ZO8N0CccA3d0AAIPACIlF9OsDiV30OV30D4Q+AQAAV/919P91FP91EGoB/3Ug/9aFwA+E4wAAAIs18OBAAFNTV/919P91DP91CP/Wi8iJTfg7yw+EwgAAAPdFDAAEAAB0KTldHA+EsAAAADtNHA+PpwAAAP91HP91GFf/dfT/dQz/dQj/1umQAAAAO8t+RWrgM9JY9/GD+AJyOY1ECQg9AAQAAHcW6M8iAACL9DvzdGrHBszMAACDxgjrGlDoSuP//1k7w3QJxwDd3QAAg8AIi/DrAjP2O/N0Qf91+FZX/3X0/3UM/3UI/xXw4EAAhcB0IlNTOV0cdQRTU+sG/3Uc/3UY/3X4VlP/dSD/FbDgQACJRfhW6Lj9//9Z/3X06K/9//+LRfhZ6VkBAACJXfSJXfA5XQh1CIsGi0AUiUUIOV0gdQiLBotABIlFIP91COggIAAAWYlF7IP4/3UHM8DpIQEAADtFIA+E2wAAAFNTjU0UUf91EFD/dSDoPiAAAIPEGIlF9DvDdNSLNejgQABTU/91FFD/dQz/dQj/1olF+DvDdQcz9um3AAAAfj2D+OB3OIPACD0ABAAAdxbouSEAAIv8O/t03ccHzMwAAIPHCOsaUOg04v//WTvDdAnHAN3dAACDwAiL+OsCM/87+3S0/3X4U1foMJL//4PEDP91+Ff/dRT/dfT/dQz/dQj/1olF+DvDdQQz9usl/3UcjUX4/3UYUFf/dSD/dezojR8AAIvwiXXwg8QY994b9iN1+Ffojfz//1nrGv91HP91GP91FP91EP91DP91CP8V6OBAAIvwOV30dAn/dfTomLH//1mLRfA7w3QMOUUYdAdQ6IWx//9Zi8aNZeBfXluLTfwzzeiXlf//ycOL/1WL7IPsEP91CI1N8OiRlf///3UojU3w/3Uk/3Ug/3Uc/3UY/3UU/3UQ/3UM6Cj8//+DxCCAffwAdAeLTfiDYXD9ycOL/1WL7FFRoYASQQAzxYlF/KGIKUEAU1Yz21eL+TvDdTqNRfhQM/ZGVmhk6kAAVv8V+OBAAIXAdAiJNYgpQQDrNP8VXOBAAIP4eHUKagJYo4gpQQDrBaGIKUEAg/gCD4TPAAAAO8MPhMcAAACD+AEPhegAAACJXfg5XRh1CIsHi0AEiUUYizXs4EAAM8A5XSBTU/91EA+VwP91DI0ExQEAAABQ/3UY/9aL+Dv7D4SrAAAAfjyB//D//393NI1EPwg9AAQAAHcT6NIfAACLxDvDdBzHAMzMAADrEVDoUOD//1k7w3QJxwDd3QAAg8AIi9iF23RpjQQ/UGoAU+hOkP//g8QMV1P/dRD/dQxqAf91GP/WhcB0Ef91FFBT/3UI/xX44EAAiUX4U+jJ+v//i0X4Wet1M/Y5XRx1CIsHi0AUiUUcOV0YdQiLB4tABIlFGP91HOhBHQAAWYP4/3UEM8DrRztFGHQeU1ONTRBR/3UMUP91GOhpHQAAi/CDxBg783TciXUM/3UU/3UQ/3UM/3UI/3Uc/xX04EAAi/g783QHVuiGr///WYvHjWXsX15bi038M83omJP//8nDi/9Vi+yD7BD/dQiNTfDokpP///91JI1N8P91IP91HP91GP91FP91EP91DOgW/v//g8QcgH38AHQHi034g2Fw/cnDi/9Vi+xWi3UIhfYPhIEBAAD/dgToFq////92COgOr////3YM6Aav////dhDo/q7///92FOj2rv///3YY6O6u////Nujnrv///3Yg6N+u////diTo167///92KOjPrv///3Ys6Meu////djDov67///92NOi3rv///3Yc6K+u////djjop67///92POifrv//g8RA/3ZA6JSu////dkTojK7///92SOiErv///3ZM6Hyu////dlDodK7///92VOhsrv///3ZY6GSu////dlzoXK7///92YOhUrv///3Zk6Eyu////dmjoRK7///92bOg8rv///3Zw6DSu////dnToLK7///92eOgkrv///3Z86Byu//+DxED/toAAAADoDq7///+2hAAAAOgDrv///7aIAAAA6Pit////towAAADo7a3///+2kAAAAOjirf///7aUAAAA6Net////tpgAAADozK3///+2nAAAAOjBrf///7agAAAA6Lat////tqQAAADoq63///+2qAAAAOigrf//g8QsXl3Di/9Vi+xWi3UIhfZ0NYsGOwVIHUEAdAdQ6H2t//9Zi0YEOwVMHUEAdAdQ6Gut//9Zi3YIOzVQHUEAdAdW6Fmt//9ZXl3Di/9Vi+xWi3UIhfZ0fotGDDsFVB1BAHQHUOg3rf//WYtGEDsFWB1BAHQHUOglrf//WYtGFDsFXB1BAHQHUOgTrf//WYtGGDsFYB1BAHQHUOgBrf//WYtGHDsFZB1BAHQHUOjvrP//WYtGIDsFaB1BAHQHUOjdrP//WYt2JDs1bB1BAHQHVujLrP//WV5dw4v/VYvsi0UIUzPbVlc7w3QHi30MO/t3G+g9qf//ahZeiTBTU1NTU+jGqP//g8QUi8brPIt1EDvzdQSIGOvai9A4GnQEQk91+Dv7dO6KDogKQkY6y3QDT3XzO/t1EIgY6Pao//9qIlmJCIvx67UzwF9eW13DzMzMzMzM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JXMAAENvdWxkIG5vdCBleGVjICVzAAAAQ2Fubm90IGZpbmQgUHl0aG9uIGV4ZWN1dGFibGUgJXMKAAAAIyFweXRob24uZXhlAAAAACMhAABDYW5ub3Qgb3BlbiAlcwoALXNjcmlwdC5weXcAQ29yRXhpdFByb2Nlc3MAAG0AcwBjAG8AcgBlAGUALgBkAGwAbAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAAAAAAGAAAGAAEAABAAAwYABgIQBEVFRQUFBQUFNTAAUAAAAAAoIDhQWAcIADcwMFdQBwAAICAIAAAAAAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAKghQQAAIkEAAAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAEVuY29kZVBvaW50ZXIAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAw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V2VkbmVzZGF5AAAAVHVlc2RheQBNb25kYXkAAFN1bmRheQAAU2F0AEZyaQBUaHUAV2VkAFR1ZQBNb24AU3VuAEdldFByb2Nlc3NXaW5kb3dTdGF0aW9uAEdldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEAAABHZXRMYXN0QWN0aXZlUG9wdXAAAEdldEFjdGl2ZVdpbmRvdwBNZXNzYWdlQm94QQBVU0VSMzIuRExMAABTdW5Nb25UdWVXZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAAQ09OT1VUJAAuY29tAAAAAC5leGUAAAAALmJhdAAAAAAuY21kAAAAAC5cAABTeXN0ZW1Sb290AAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAAADgAALBpAACgmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADcGEAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALwjQAAAAAAA/v///wAAAACI////AAAAAP7////6JUAA/iVAAP7////AJUAA1CVAAP7///8AAAAAjP///wAAAAD+////aDVAAGw1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAEztAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADhO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAGs9QAAAAAAAAAAAADc9QAD+////AAAAANT///8AAAAA/v///wAAAADwPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAACNAQAAAAAAA/v///wAAAADU////AAAAAP7///9NQUAAaUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABdR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAACtLQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAm05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADdUEAA/v///wAAAADsUEAA/v///wAAAADY////AAAAAP7///8AAAAAn1JAAP7///8AAAAAq1JAAP7///8AAAAA1P///wAAAAD+////AAAAAGVZQAAAAAAA/v///wAAAADY////AAAAAP7///8LW0AAH1tAAAAAAAD+////AAAAANj///8AAAAA/v///11bQABhW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAALheQAAAAAAA/v///wAAAADQ////AAAAAP7///9IX0AAX19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAC5akAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAMpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAznlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADegUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAtJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABNmEAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAW6ZAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAAhqEAAAAAAAAAAAABdp0AA/v///wAAAADQ////AAAAAP7///8AAAAA3K5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAD4wkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAJvKQABc+QAAAAAAAAAAAAAWAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnPoAALj6AADO+gAA5PoAAPb6AAAO+wAAJPsAADz7AABU+wAAaPsAAHD7AACC+wAAkPsAAKL7AAC0+wAAxvsAANb7AADk+wAA/PsAABD8AAAk/AAAQPwAAF78AABy/AAAgvwAAI78AACa/AAApvwAAL78AADW/AAA4PwAAOz8AAD+/AAADP0AABj9AAAm/QAAMP0AAED9AABW/QAAYv0AAHL9AACa/QAAtP0AAMz9AADm/QAA/P0AABb+AAAk/gAAMv4AAEz+AABc/gAAcv4AAIz+AACY/gAApv4AALb+AADG/gAA2P4AAOz+AAD8/gAAEv8AACL/AAA0/wAARv8AAFj/AABq/wAAdv8AAIT/AACU/wAAqv8AALr/AADK/wAA2P8AAOr/AAD8/wAAJAABADAAAQBAAAEAUgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEAPAJHZXRTdGFydHVwSW5mb0EA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADnA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAIwEV3JpdGVDb25zb2xlQQCaAUdldENvbnNvbGVPdXRwdXRDUAAAlgRXcml0ZUNvbnNvbGVXAAYEU2V0U3RkSGFuZGxlAAB5AENyZWF0ZUZpbGVBAFMAQ29tcGFyZVN0cmluZ0EAAFYAQ29tcGFyZVN0cmluZ1cAANgDU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEAS0VSTkVMMzIuZGxsAABuA1JlYWRGaWxlAADVA1NldEVuZE9mRmlsZQAAJgJHZXRQcm9jZXNzSGVhcAAAygFHZXRGaWxlQXR0cmlidXRlc0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMArQQAAAAAAwCtBAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO5kC7sRm/ROojQAACAAAAbOJAAFziQAD/////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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D0iD6QJmiwQKSYPoAmaJAfbBBHQNSIPpBIsECkmD6ASJAU2LyEnB6QV1UE2LyEnB6QN0FEiD6QhIiwQKSf/JSIkBdfBJg+AHTYXAdQdJi8PDDx8ASP/JigQKSf/IiAF180mLw8NmZmZmZmZmDx+EAAAAAABmZmaQZmaQSYH5ACAAAHNCSItECvhMi1QK8EiD6SBIiUEYTIlREEiLRAoITIsUCkn/yUiJQQhMiRF11UmD4B/pc////2ZmZmYPH4QAAAAAAGaQSIH6APD//3e1uCAAAABIgemAAAAADxgECg8YRApA/8h17EiBwQAQAAC4QAAAAEyLTAr4TItUCvBMD8NJ+EwPw1HwTItMCuhMi1QK4EwPw0noTA/DUeBMi0wK2EyLVArQSIPpQEwPw0kYTA/DURBMi0wKCEyLFAr/yEwPw0kITA/DEXWqSYHoABAAAEmB+AAQAAAPg3H////wgAwkAOm6/v//SIXJD4TgAQAAU0iD7CBIi9lIi0kI6Aay//9Ii0sQ6P2x//9Ii0sY6PSx//9Ii0sg6Oux//9Ii0so6OKx//9Ii0sw6Nmx//9Iiwvo0bH//0iLS0DoyLH//0iLS0jov7H//0iLS1DotrH//0iLS1jorbH//0iLS2DopLH//0iLS2jom7H//0iLSzjokrH//0iLS3DoibH//0iLS3jogLH//0iLi4AAAADodLH//0iLi4gAAADoaLH//0iLi5AAAADoXLH//0iLi5gAAADoULH//0iLi6AAAADoRLH//0iLi6gAAADoOLH//0iLi7AAAADoLLH//0iLi7gAAADoILH//0iLi8AAAADoFLH//0iLi8gAAADoCLH//0iLi9AAAADo/LD//0iLi9gAAADo8LD//0iLi+AAAADo5LD//0iLi+gAAADo2LD//0iLi/AAAADozLD//0iLi/gAAADowLD//0iLiwABAADotLD//0iLiwgBAADoqLD//0iLixABAADonLD//0iLixgBAADokLD//0iLiyABAADohLD//0iLiygBAADoeLD//0iLizABAADobLD//0iLizgBAADoYLD//0iLi0ABAADoVLD//0iLi0gBAADoSLD//0iLi1ABAADoPLD//0iDxCBbw8zMSIXJdEJTSIPsIEiL2UiLCUg7DSmgAAB0BegWsP//SItLCEg7DR+gAAB0BegEsP//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BQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAAAAAABA4AUABAAAAsDgBQAEAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAAAAAAAAcnVudGltZSBlcnJvciAAAA0KAAAAAAAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAAAAAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAAAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAAAAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgAAAAAAAAAAAAAAAAANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAAAAAAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAAAAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAAAAAAB0AAMAEAAAAAAAAAAAAAACWAADABAAAAAAAAAAAAAAAjQAAwAgAAAAAAAAAAAAAAI4AAMAIAAAAAAAAAAAAAACPAADACAAAAAAAAAAAAAAAkAAAwAgAAAAAAAAAAAAAAJEAAMAIAAAAAAAAAAAAAACSAADACAAAAAAAAAAAAAAAkwAAwAgAAAAAAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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dGVDb25zb2xlQ3RybEV2ZW50AADHAUdldEV4aXRDb2RlUHJvY2VzcwAAcgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJYAQ3JlYXRlUHJvY2Vzc0EAALQDU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADbAEVudGVyQ3JpdGljYWxTZWN0aW9uAADuAkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAAC8EU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABgFFeGl0UHJvY2VzcwBxAUdldENvbW1hbmRMaW5lQQA8AkdldFN0YXJ0dXBJbmZvQQCeA1J0bFVud2luZEV4APQDU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADZAUdldEZpbGVUeXBlAMAARGVsZXRlQ3JpdGljYWxTZWN0aW9uADsEVGVybWluYXRlUHJvY2VzcwAAqwFHZXRDdXJyZW50UHJvY2VzcwBMBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAIwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA0AJJc0RlYnVnZ2VyUHJlc2VudACfA1J0bFZpcnR1YWxVbndpbmQAAJgDUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAkQNSdGxDYXB0dXJlQ29udGV4dADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXQFHZXRDUEluZm8AVAFHZXRBQ1AAABQCR2V0T0VNQ1AAANoCSXNWYWxpZENvZGVQYWdlANcARW5jb2RlUG9pbnRlcgC5AERlY29kZVBvaW50ZXIAQAFGbHNHZXRWYWx1ZQBBAUZsc1NldFZhbHVlAD8BRmxzRnJlZQD4A1NldExhc3RFcnJvcgAArwFHZXRDdXJyZW50VGhyZWFkSWQAAD4BRmxzQWxsb2MAAJsEV3JpdGVGaWxlAPACTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDBAUdldEVudmlyb25tZW50U3RyaW5ncwBNAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIgEV2lkZUNoYXJUb011bHRpQnl0ZQDDAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKoCSGVhcFNldEluZm9ybWF0aW9uAACkAkhlYXBDcmVhdGUAAFMDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKwBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAKkCSGVhcFJlQWxsb2MAhQFHZXRDb25zb2xlQ1AAAJcBR2V0Q29uc29sZU1vZGUAAEMBRmx1c2hGaWxlQnVmZmVycwAA4AJMQ01hcFN0cmluZ0EAABkDTXVsdGlCeXRlVG9XaWRlQ2hhcgDiAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA7ANTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCQBFdyaXRlQ29uc29sZUEAmwFHZXRDb25zb2xlT3V0cHV0Q1AAAJoEV3JpdGVDb25zb2xlVwAKBFNldFN0ZEhhbmRsZQAAegBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADdA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAaANSZWFkRmlsZQAA2gNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMsBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgRQFAAQAAAAAAAAAAAAAA4EUBQAEAAAABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyot8tmSsAAM1dINJm1P//XCkAQAEAAAACAAAAAAAAAAD0AEABAAAA8PMAQAEAAAD//////////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AION8P3//wT3ncz9///p5wgAAIuFzP3//2vACg++yo1ECNCJhcz9///pzAgAAIm16P3//+nBCAAAgPoqdSaDxwSJvdz9//+Lf/w7/om96P3//w+NoggAAION6P3////plggAAIuF6P3//2vACg++yo1ECNCJhej9///pewgAAID6SXRVgPpodESA+mx0GID6dw+FYwgAAIGN8P3//wAIAADpVAgAAIA7bHUWQ4GN8P3//wAQAACJncT9///pOQgAAION8P3//xDpLQgAAION8P3//yDpIQgAAIoDPDZ1HYB7ATR1F0NDgY3w/f//AIAAAImdxP3//+n+BwAAPDN1HYB7ATJ1F0NDgaXw/f///3///4mdxP3//+ndBwAAPGQPhNUHAAA8aQ+EzQcAADxvD4TFBwAAPHUPhL0HAAA8eA+EtQcAADxYD4StBwAAibWU/f//jYWk/f//UA+2wlCJtcj9///oCD0AAFmFwIqF7/3//1l0IouNtP3//4212P3//+ik+///igNDiZ3E/f//hMAPhKT8//+LjbT9//+Ntdj9///ogvv//+lNBwAAD77Cg/hkD4/oAQAAD4R5AgAAg/hTD4/yAAAAD4SAAAAAg+hBdBBISHRYSEh0CEhID4WSBQAAgMIgx4WQ/f//AQAAAIiV7/3//4ON8P3//0A5tej9//+NnfT9//+4AAIAAImd5P3//4mFoP3//w+NSAIAAMeF6P3//wYAAADppQIAAPeF8P3//zAIAAAPhZgAAACBjfD9//8ACAAA6YkAAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJvdz9//+Lf/yJveT9//8PhLEEAAA7/nULoZQSQQCJheT9//+LheT9///Hhcj9//8BAAAA6X8EAACD6FgPhNoCAABISHR5K8EPhCf///9ISA+FngQAAIPHBPeF8P3//xAIAACJvdz9//90MA+3R/xQaAACAACNhfT9//9QjYXg/f//UOhLOwAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6MI4AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Do4AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugiCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6EEgAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoEiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6O0fAABZ/9BZWYA7LXURgY3w/f//AAEAAEOJneT9//9T6QP+///Hhej9//8IAAAAiY24/f//6ySD6HMPhLb8//9ISA+Eif7//4PoAw+FtgEAAMeFuP3//ycAAAD2hfD9//+Ax4Xg/f//EAAAAA+Eaf7//4qFuP3//wRRxoXU/f//MIiF1f3//8eF0P3//wIAAADpRf7///fBABAAAA+FS/7//4PHBPbBIHQYib3c/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om93P3///bBQHQbO9Z/F3wEO8ZzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIvai/h1AjPbg73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LxwvDdQYhhdD9//+NdfOLhej9////jej9//+FwH8Gi8cLw3Qti4Xg/f//mVJQU1fo5DcAAIPBMIP5OYmdoP3//4v4i9p+BgONuP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF4P3//4m15P3//3RhhcB0B4vOgDkwdFb/jeT9//+LjeT9///GATBA6z5JZjkwdAZAQDvOdfQrheT9///R+OsoO/51C6GQEkEAiYXk/f//i4Xk/f//6wdJgDgAdAVAO8519SuF5P3//4mF4P3//4O9wP3//wAPhVwBAACLhfD9//+oQHQyqQABAAB0CcaF1P3//y3rGKgBdAnGhdT9//8r6wuoAnQRxoXU/f//IMeF0P3//wEAAACLncz9//8rneD9//8rndD9///2hfD9//8MdRf/tbT9//+Nhdj9//9TaiDocPX//4PEDP+10P3//4u9tP3//42F2P3//42N1P3//+h29f//9oXw/f//CFl0G/aF8P3//wR1EldTajCNhdj9///oLvX//4PEDIO9yP3//wCLheD9//90ZoXAfmKLteT9//+JhaD9//8Ptwb/jaD9//9QagaNRfRQjYWY/f//RlBG6OU1AACDxBCFwHUoOYWY/f//dCD/tZj9//+Nhdj9//+NTfTo8fT//4O9oP3//wBZdbXrHION2P3////rE4uN5P3//1CNhdj9///oyvT//1mDvdj9//8AfBv2hfD9//8EdBJXU2ogjYXY/f//6IL0//+DxAyDvbz9//8AdBP/tbz9///oCAgAAIOlvP3//wBZi53E/f//igOIhe/9//+EwHQTi42U/f//i73c/f//itDp4fX//4C9sP3//wB0CouFrP3//4NgcP2Lhdj9//+LTfxfXjPNW+ja6///ycOQFitAABcpQABHKUAApSlAAPEpQAD8KUAAQipAAHArQABqVGhY9UAA6GUEAAAz/4l9/I1FnFD/FTTgQADHRfz+////akBqIF5W6HkGAABZWTvHD4QUAgAAo6AqQQCJNZAqQQCNiAAIAADrMMZABACDCP/GQAUKiXgIxkAkAMZAJQrGQCYKiXg4xkA0AIPAQIsNoCpBAIHBAAgAADvBcsxmOX3OD4QKAQAAi0XQO8cPhP8AAACLOI1YBI0EO4lF5L4ACAAAO/58Aov+x0XgAQAAAOtbakBqIOjrBQAAWVmFwHRWi03gjQyNoCpBAIkBgwWQKkEAII2QAAgAAOsqxkAEAIMI/8ZABQqDYAgAgGAkgMZAJQrGQCYKg2A4AMZANACDwECLEQPWO8Jy0v9F4Dk9kCpBAHyd6waLPZAqQQCDZeAAhf9+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//+DxBTpQwYAAPZABCB0EWoCagBqAP91COhjGQAAg8QQ/3UI6NXq//9ZhcAPhJ0CAACLBvZEBwSAD4SQAgAA6IvW//+LQGwzyTlIFI2FHOX//w+UwVCLBv80B4mNIOX///8V4OBAAIXAD4RgAgAAM8k5jSDl//90CITbD4RQAgAA/xXc4EAAi5005f//iYUc5f//M8CJhTzl//85RRAPhkIFAACJhUTl//+KhSfl//+EwA+FZwEAAIoLi7Uo5f//M8CA+QoPlMCJhSDl//+LBgPHg3g4AHQVilA0iFX0iE31g2A4AGoCjUX0UOtLD77BUOjX7P//WYXAdDqLjTTl//8rywNNEDPAQDvID4alAQAAagKNhUDl//9TUOg8KAAAg8QMg/j/D4SxBAAAQ/+FROX//+sbagFTjYVA5f//UOgYKAAAg8QMg/j/D4SNBAAAM8BQUGoFjU30UWoBjY1A5f//UVD/tRzl//9D/4VE5f///xWw4EAAi/CF9g+EXAQAAGoAjYU85f//UFaNRfRQi4Uo5f//iwD/NAf/FZjgQACFwA+EKQQAAIuFROX//4uNMOX//wPBObU85f//iYU45f//D4wVBAAAg70g5f//AA+EzQAAAGoAjYU85f//UGoBjUX0UIuFKOX//4sAxkX0Df80B/8VmOBAAIXAD4TQAwAAg7085f//AQ+MzwMAAP+FMOX///+FOOX//+mDAAAAPAF0BDwCdSEPtzMzyWaD/goPlMFDQ4OFROX//wKJtUDl//+JjSDl//88AXQEPAJ1Uv+1QOX//+glJQAAWWY7hUDl//8PhWgDAACDhTjl//8Cg70g5f//AHQpag1YUImFQOX//+j4JAAAWWY7hUDl//8PhTsDAAD/hTjl////hTDl//+LRRA5hUTl//8Pgvn9///pJwMAAIsOihP/hTjl//+IVA80iw6JRA846Q4DAAAzyYsGA8f2QASAD4S/AgAAi4U05f//iY1A5f//hNsPhcoAAACJhTzl//85TRAPhiADAADrBou1KOX//4uNPOX//4OlROX//wArjTTl//+NhUjl//87TRBzOYuVPOX///+FPOX//4oSQYD6CnUQ/4Uw5f//xgANQP+FROX//4gQQP+FROX//4G9ROX///8TAABywovYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhEICAACLhSzl//8BhTjl//87ww+MOgIAAIuFPOX//yuFNOX//ztFEA+CTP///+kgAgAAiYVE5f//gPsCD4XRAAAAOU0QD4ZNAgAA6waLtSjl//+LjUTl//+DpTzl//8AK4005f//jYVI5f//O00Qc0aLlUTl//+DhUTl//8CD7cSQUFmg/oKdRaDhTDl//8Cag1bZokYQECDhTzl//8Cg4U85f//AmaJEEBAgb085f///hMAAHK1i9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EYgEAAIuFLOX//wGFOOX//zvDD4xaAQAAi4VE5f//K4U05f//O0UQD4I/////6UABAAA5TRAPhnwBAACLjUTl//+DpTzl//8AK4005f//agKNhUj5//9eO00QczyLlUTl//8PtxIBtUTl//8DzmaD+gp1DmoNW2aJGAPGAbU85f//AbU85f//ZokQA8aBvTzl//+oBgAAcr8z9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbDgQACL2DveD4SXAAAAagCNhSzl//9Qi8MrxlCNhDXw6///UIuFKOX//4sA/zQH/xWY4EAAhcB0DAO1LOX//zvef8vrDP8VXOBAAImFQOX//zvef1yLhUTl//8rhTTl//+JhTjl//87RRAPggr////rP2oAjY0s5f//Uf91EP+1NOX///8w/xWY4EAAhcB0FYuFLOX//4OlQOX//wCJhTjl///rDP8VXOBAAImFQOX//4O9OOX//wB1bIO9QOX//wB0LWoFXjm1QOX//3UU6LK2///HAAkAAADourb//4kw6z//tUDl///ovrb//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOhytv//xwAcAAAA6Hq2//+DIACDyP/rDIuFOOX//yuFMOX//19bi038M81e6Nid///Jw2oQaPD3QADohLb//4tFCIP4/nUb6D62//+DIADoI7b//8cACQAAAIPI/+mdAAAAM/87x3wIOwWQKkEAciHoFbb//4k46Pu1///HAAkAAABXV1dXV+iDtf//g8QU68mLyMH5BY0cjaAqQQCL8IPmH8HmBosLD75MMQSD4QF0v1DoOSQAAFmJffyLA/ZEMAQBdBb/dRD/dQz/dQjoLvj//4PEDIlF5OsW6Ji1///HAAkAAADooLX//4k4g03k/8dF/P7////oCQAAAItF5OgEtv//w/91COiDJAAAWcNqEGgQ+EAA6Ki1//+LRQiD+P51E+hPtf//xwAJAAAAg8j/6aoAAAAz2zvDfAg7BZAqQQByGugutf//xwAJAAAAU1NTU1PotrT//4PEFOvQi8jB+QWNPI2gKkEAi/CD5h/B5gaLDw++TA4Eg+EBdMZQ6GwjAABZiV38iwf2RAYEAXQx/3UI6OAiAABZUP8V5OBAAIXAdQv/FVzgQACJReTrA4ld5Dld5HQZ6M20//+LTeSJCOiwtP//xwAJAAAAg03k/8dF/P7////oCQAAAItF5Ogjtf//w/91COiiIwAAWcOL/1WL7IPsEFMz2zldCHUc6HK0//9TU1NTU8cAFgAAAOj6s///g8QUM8DralaLdQw783Ua6E60//9TU1NTU8cAFgAAAOjWs///g8QU6wU5dQhyBDPA6z7/dRCNTfDoxpv//4tN9I1G/zlZCHQcSDlFCHcKD7YQ9kQKHQR18IvOK8iD4QEr8U6Lxjhd/HQHi034g2Fw/V5bycOL/1WL7GoA/3UM/3UI6FX///+DxAxdw4v/VYvsg+wUUzPbVot1CDldFHUQO/N1EDldDHUQM8Dp5wEAADvzdAU5XQx3Huils///ahZeU1NTU1OJMOgus///g8QUi8bpwAEAADldFHUEiB7ryVeLfRA7+3UeiB7odLP//2oWXlNTU1NTiTDo/bL//4PEFOkoAQAA/3UYjU3s6POa//+LRfA5WAh1Ff91FFf/dQxW6KMKAACDxBDpTAEAAIN9FP+LVQyLxnUPig+ICEBHOst0H0p18+saig+ICEBHOst0CEp0Bf9NFHXuOV0UdQOIGEA70w+FyAAAADgfdAaDfRQBdTWNeP+Jffw7/nIejUXsUItF/A+2AFDo0L7//1lZhcB0CP9N/Dl1/HPii8crRfyoAQ+FwwAAAIN9FP91WotFDIP4AXY6jXwG/ol9FDv+ciGNRexQi0UUD7YAUOiMvv//WVmFwHQI/00UOXUUc+KLRQyLzytNFPbBAXQEiB/rBIhcBv84Xfh0B4tF9INgcP1qUFjpjQAAAIge6FOy//9qIl5TU1NTU4kw6Nyx//+DxBQ4Xfh0B4tF9INgcP2Lxutki8grzoP5AnxNjXj+iX0UO/5yHo1F7FCLRRQPtgBQ6Am+//9ZWYXAdAj/TRQ5dRRz4ovHK0UUqAF0HIgf6PCx//+LyGoqWIkBOF34dBeLTfSDYXD96w44Xfh0B4tF9INgcP0zwF9eW8nDi/9Vi+yLRQiFwHQSg+gIgTjd3QAAdQdQ6Bi1//9ZXcOL/1WL7IPsFKGAEkEAM8WJRfxTVjPbV4vxOR2EKUEAdThTUzP/R1doZOpAAGgAAQAAU/8V8OBAAIXAdAiJPYQpQQDrFf8VXOBAAIP4eHUKxwWEKUEAAgAAADldFH4ii00Ui0UQSTgYdAhAO8t19oPJ/4tFFCvBSDtFFH0BQIlFFKGEKUEAg/gCD4SsAQAAO8MPhKQBAACD+AEPhcwBAACJXfg5XSB1CIsGi0AEiUUgizXs4EAAM8A5XSRTU/91FA+VwP91EI0ExQEAAABQ/3Ug/9aL+Dv7D4SPAQAAfkNq4DPSWPf3g/gCcjeNRD8IPQAEAAB3E+iOIwAAi8Q7w3QcxwDMzAAA6xFQ6Azk//9ZO8N0CccA3d0AAIPACIlF9OsDiV30OV30D4Q+AQAAV/919P91FP91EGoB/3Ug/9aFwA+E4wAAAIs18OBAAFNTV/919P91DP91CP/Wi8iJTfg7yw+EwgAAAPdFDAAEAAB0KTldHA+EsAAAADtNHA+PpwAAAP91HP91GFf/dfT/dQz/dQj/1umQAAAAO8t+RWrgM9JY9/GD+AJyOY1ECQg9AAQAAHcW6M8iAACL9DvzdGrHBszMAACDxgjrGlDoSuP//1k7w3QJxwDd3QAAg8AIi/DrAjP2O/N0Qf91+FZX/3X0/3UM/3UI/xXw4EAAhcB0IlNTOV0cdQRTU+sG/3Uc/3UY/3X4VlP/dSD/FbDgQACJRfhW6Lj9//9Z/3X06K/9//+LRfhZ6VkBAACJXfSJXfA5XQh1CIsGi0AUiUUIOV0gdQiLBotABIlFIP91COggIAAAWYlF7IP4/3UHM8DpIQEAADtFIA+E2wAAAFNTjU0UUf91EFD/dSDoPiAAAIPEGIlF9DvDdNSLNejgQABTU/91FFD/dQz/dQj/1olF+DvDdQcz9um3AAAAfj2D+OB3OIPACD0ABAAAdxbouSEAAIv8O/t03ccHzMwAAIPHCOsaUOg04v//WTvDdAnHAN3dAACDwAiL+OsCM/87+3S0/3X4U1foMJL//4PEDP91+Ff/dRT/dfT/dQz/dQj/1olF+DvDdQQz9usl/3UcjUX4/3UYUFf/dSD/dezojR8AAIvwiXXwg8QY994b9iN1+Ffojfz//1nrGv91HP91GP91FP91EP91DP91CP8V6OBAAIvwOV30dAn/dfTomLH//1mLRfA7w3QMOUUYdAdQ6IWx//9Zi8aNZeBfXluLTfwzzeiXlf//ycOL/1WL7IPsEP91CI1N8OiRlf///3UojU3w/3Uk/3Ug/3Uc/3UY/3UU/3UQ/3UM6Cj8//+DxCCAffwAdAeLTfiDYXD9ycOL/1WL7FFRoYASQQAzxYlF/KGIKUEAU1Yz21eL+TvDdTqNRfhQM/ZGVmhk6kAAVv8V+OBAAIXAdAiJNYgpQQDrNP8VXOBAAIP4eHUKagJYo4gpQQDrBaGIKUEAg/gCD4TPAAAAO8MPhMcAAACD+AEPhegAAACJXfg5XRh1CIsHi0AEiUUYizXs4EAAM8A5XSBTU/91EA+VwP91DI0ExQEAAABQ/3UY/9aL+Dv7D4SrAAAAfjyB//D//393NI1EPwg9AAQAAHcT6NIfAACLxDvDdBzHAMzMAADrEVDoUOD//1k7w3QJxwDd3QAAg8AIi9iF23RpjQQ/UGoAU+hOkP//g8QMV1P/dRD/dQxqAf91GP/WhcB0Ef91FFBT/3UI/xX44EAAiUX4U+jJ+v//i0X4Wet1M/Y5XRx1CIsHi0AUiUUcOV0YdQiLB4tABIlFGP91HOhBHQAAWYP4/3UEM8DrRztFGHQeU1ONTRBR/3UMUP91GOhpHQAAi/CDxBg783TciXUM/3UU/3UQ/3UM/3UI/3Uc/xX04EAAi/g783QHVuiGr///WYvHjWXsX15bi038M83omJP//8nDi/9Vi+yD7BD/dQiNTfDokpP///91JI1N8P91IP91HP91GP91FP91EP91DOgW/v//g8QcgH38AHQHi034g2Fw/cnDi/9Vi+xWi3UIhfYPhIEBAAD/dgToFq////92COgOr////3YM6Aav////dhDo/q7///92FOj2rv///3YY6O6u////Nujnrv///3Yg6N+u////diTo167///92KOjPrv///3Ys6Meu////djDov67///92NOi3rv///3Yc6K+u////djjop67///92POifrv//g8RA/3ZA6JSu////dkTojK7///92SOiErv///3ZM6Hyu////dlDodK7///92VOhsrv///3ZY6GSu////dlzoXK7///92YOhUrv///3Zk6Eyu////dmjoRK7///92bOg8rv///3Zw6DSu////dnToLK7///92eOgkrv///3Z86Byu//+DxED/toAAAADoDq7///+2hAAAAOgDrv///7aIAAAA6Pit////towAAADo7a3///+2kAAAAOjirf///7aUAAAA6Net////tpgAAADozK3///+2nAAAAOjBrf///7agAAAA6Lat////tqQAAADoq63///+2qAAAAOigrf//g8QsXl3Di/9Vi+xWi3UIhfZ0NYsGOwVIHUEAdAdQ6H2t//9Zi0YEOwVMHUEAdAdQ6Gut//9Zi3YIOzVQHUEAdAdW6Fmt//9ZXl3Di/9Vi+xWi3UIhfZ0fotGDDsFVB1BAHQHUOg3rf//WYtGEDsFWB1BAHQHUOglrf//WYtGFDsFXB1BAHQHUOgTrf//WYtGGDsFYB1BAHQHUOgBrf//WYtGHDsFZB1BAHQHUOjvrP//WYtGIDsFaB1BAHQHUOjdrP//WYt2JDs1bB1BAHQHVujLrP//WV5dw4v/VYvsi0UIUzPbVlc7w3QHi30MO/t3G+g9qf//ahZeiTBTU1NTU+jGqP//g8QUi8brPIt1EDvzdQSIGOvai9A4GnQEQk91+Dv7dO6KDogKQkY6y3QDT3XzO/t1EIgY6Pao//9qIlmJCIvx67UzwF9eW13DzMzMzMzMVYvsVjPAUFBQUFBQUFCLVQyNSQCKAgrAdAmDwgEPqwQk6/GLdQiDyf+NSQCDwQGKBgrAdAmDxgEPowQkc+6LwYPEIF7Jw4v/VYvsU1aLdQgz21c5XRR1EDvzdRA5XQx1EjPAX15bXcM783QHi30MO/t3G+hoqP//ahZeiTBTU1NTU+jxp///g8QUi8br1TldFHUEiB7ryotVEDvTdQSIHuvRg30U/4vGdQ+KCogIQEI6y3QeT3Xz6xmKCogIQEI6y3QIT3QF/00Ude45XRR1AogYO/t1i4N9FP91D4tFDGpQiFwG/1jpeP///4ge6O6n//9qIlmJCIvx64KL/1WL7ItNCFMz21ZXO8t0B4t9DDv7dxvoyKf//2oWXokwU1NTU1PoUaf//4PEFIvG6zCLdRA783UEiBnr2ovRigaIAkJGOsN0A091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MDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAEVuY29kZVBvaW50ZXIAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAAjgAAwAgAAAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgAAAAAAAAAkwAAwAgAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAg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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAAADgAALBpAACgmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADcGEAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALwjQAAAAAAA/v///wAAAACI////AAAAAP7////6JUAA/iVAAP7////AJUAA1CVAAP7///8AAAAAjP///wAAAAD+////aDVAAGw1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAEztAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADhO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAGs9QAAAAAAAAAAAADc9QAD+////AAAAANT///8AAAAA/v///wAAAADwPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAACNAQAAAAAAA/v///wAAAADU////AAAAAP7///9NQUAAaUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABdR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAACtLQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAm05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADdUEAA/v///wAAAADsUEAA/v///wAAAADY////AAAAAP7///8AAAAAn1JAAP7///8AAAAAq1JAAP7///8AAAAA1P///wAAAAD+////AAAAAGVZQAAAAAAA/v///wAAAADY////AAAAAP7///8LW0AAH1tAAAAAAAD+////AAAAANj///8AAAAA/v///11bQABhW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAALheQAAAAAAA/v///wAAAADQ////AAAAAP7///9IX0AAX19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAC5akAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAMpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAznlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADegUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAtJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABNmEAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAW6ZAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAAhqEAAAAAAAAAAAABdp0AA/v///wAAAADQ////AAAAAP7///8AAAAA3K5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAD4wkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAJvKQABc+QAAAAAAAAAAAAAWAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnPoAALj6AADO+gAA5PoAAPb6AAAO+wAAJPsAADz7AABU+wAAaPsAAHD7AACC+wAAkPsAAKL7AAC0+wAAxvsAANb7AADk+wAA/PsAABD8AAAk/AAAQPwAAF78AABy/AAAgvwAAI78AACa/AAApvwAAL78AADW/AAA4PwAAOz8AAD+/AAADP0AABj9AAAm/QAAMP0AAED9AABW/QAAYv0AAHL9AACa/QAAtP0AAMz9AADm/QAA/P0AABb+AAAk/gAAMv4AAEz+AABc/gAAcv4AAIz+AACY/gAApv4AALb+AADG/gAA2P4AAOz+AAD8/gAAEv8AACL/AAA0/wAARv8AAFj/AABq/wAAdv8AAIT/AACU/wAAqv8AALr/AADK/wAA2P8AAOr/AAD8/wAAJAABADAAAQBAAAEAUgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEAPAJHZXRTdGFydHVwSW5mb0EA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5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AAEAAAABAAAAAAAAAAAAAAAAAAAASB1BAAAAAAAAAAAAaOtAAPDvQABw8UAAiBxBAJgaQQABAAAAmBpBAGgVQQD//////////wIAAAD46EAACAAAAMzoQAAJAAAAoOhAAAoAAAAI6EAAEAAAANznQAARAAAArOdAABIAAACI50AAEwAAAFznQAAYAAAAJOdAABkAAAD85kAAGgAAAMTmQAAbAAAAjOZAABwAAABk5kAAHgAAAETmQAAfAAAA4OVAACAAAACo5UAAIQAAALDkQAAiAAAAEORAAHgAAAAA5EAAeQAAAPDjQAB6AAAA4ONAAPwAAADc40AA/wAAAMzjQABemEAAXphAAF6YQABemEAAXphAAF6YQABemEAAXphAAF6YQABemEAAAwAAAAcAAAB4AAAACgAAABAAAAAAAAAAaOtAAGrtQACY80AAlPNAAJDzQACM80AAiPNAAITzQACA80AAePNAAHDzQABo80AAXPNAAFDzQABI80AAPPNAADjzQAA080AAMPNAACzzQAAo80AAJPNAACDzQAAc80AAGPNAABTzQAAQ80AADPNAAATzQAD48kAA8PJAAOjyQAAo80AA4PJAANjyQADQ8kAAxPJAALzyQACw8kAApPJAAKDyQACc8kAAkPJAAHzyQABw8kAACQQAAAEAAAAAAAAAiBxBAC4AAABEHUEAjClBAIwpQQCMKUEAjClBAIwpQQCMKUEAjClBAIwpQQCMKUEAf39/f39/f39IHUEAAQAAAC4AAAABAAAAAAAAAAAAAAADAAAAIAWTGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAACAcAAAAQAAAPDx//8AAAAAUFNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBEVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQHUEAEB5BAP////8AAAAAAAAAAP////8AAAAAAAAAAP7////+/////////x4AAAA7AAAAWgAAAHgAAACXAAAAtQAAANQAAADzAAAAEQEAADABAABOAQAAbQEAAP////8eAAAAOgAAAFkAAAB3AAAAlgAAALQAAADTAAAA8gAAABABAAAvAQAATQEAAGwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgIDAwMDAwMDAwAAAAAAAAAAbPRAAGT0QABc9EAAVPRAAAIAAAAAAAAAAAAAAAAAAABQSwMEFAAAAAAAAAAhAGT5fpsTAwAAEwMAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9sYXVuY2gucHkiIiIKTGF1bmNoIHRoZSBQeXRob24gc2NyaXB0IG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIKc2V0dXB0b29scyBpcyBib290c3RyYXBwZWQgdmlhIGltcG9ydC4KIiIiCgojIE5vdGUgdGhhdCBzZXR1cHRvb2xzIGdldHMgaW1wb3J0ZWQgaW1wbGljaXRseSBieSB0aGUKIyBpbnZvY2F0aW9uIG9mIHRoaXMgc2NyaXB0IHVzaW5nIHB5dGhvbiAtbSBzZXR1cHRvb2xzLmxhdW5jaAoKaW1wb3J0IHRva2VuaXplCmltcG9ydCBzeXMKCgpkZWYgcnVuKCk6CiAgICAiIiIKICAgIFJ1biB0aGUgc2NyaXB0IGluIHN5cy5hcmd2WzFdIGFzIGlmIGl0IGhhZAogICAgYmVlbiBpbnZva2VkIG5hdHVyYWxseS4KICAgICIiIgogICAgX19idWlsdGluc19fCiAgICBzY3JpcHRfbmFtZSA9IHN5cy5hcmd2WzFdCiAgICBuYW1lc3BhY2UgPSBkaWN0KAogICAgICAgIF9fZmlsZV9fPXNjcmlwdF9uYW1lLAogICAgICAgIF9fbmFtZV9fPSdfX21haW5fXycsCiAgICAgICAgX19kb2NfXz1Ob25lLAogICAgKQogICAgc3lzLmFyZ3ZbOl0gPSBzeXMuYXJndlsxOl0KCiAgICBvcGVuXyA9IGdldGF0dHIodG9rZW5pemUsICdvcGVuJywgb3BlbikKICAgIHNjcmlwdCA9IG9wZW5fKHNjcmlwdF9uYW1lKS5yZWFkKCkKICAgIG5vcm1fc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKQogICAgY29kZSA9IGNvbXBpbGUobm9ybV9zY3JpcHQsIHNjcmlwdF9uYW1lLCAnZXhlYycpCiAgICBleGVjKGNvZGUsIG5hbWVzcGFjZSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcnVuKCkKUEsDBBQAAAAAAAAAIQCHUeui3QcAAN0HAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbGliMnRvM19leC5weSIiIgpDdXN0b21pemVkIE1peGluMnRvMyBzdXBwb3J0OgoKIC0gYWRkcyBzdXBwb3J0IGZvciBjb252ZXJ0aW5nIGRvY3Rlc3RzCgoKVGhpcyBtb2R1bGUgcmFpc2VzIGFuIEltcG9ydEVycm9yIG9uIFB5dGhvbiAyLgoiIiIKCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IE1peGluMnRvMyBhcyBfTWl4aW4ydG8zCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBsaWIydG8zLnJlZmFjdG9yIGltcG9ydCBSZWZhY3RvcmluZ1Rvb2wsIGdldF9maXhlcnNfZnJvbV9wYWNrYWdlCgppbXBvcnQgc2V0dXB0b29scwoKCmNsYXNzIERpc3R1dGlsc1JlZmFjdG9yaW5nVG9vbChSZWZhY3RvcmluZ1Rvb2wpOgogICAgZGVmIGxvZ19lcnJvcihzZWxmLCBtc2csICphcmdzLCAqKmt3KToKICAgICAgICBsb2cuZXJyb3IobXNnLCAqYXJncykKCiAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLmluZm8obXNnLCAqYXJncykKCiAgICBkZWYgbG9nX2RlYnVnKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5kZWJ1Zyhtc2csICphcmdzKQoKCmNsYXNzIE1peGluMnRvMyhfTWl4aW4ydG8zKToKICAgIGRlZiBydW5fMnRvMyhzZWxmLCBmaWxlcywgZG9jdGVzdHM9RmFsc2UpOgogICAgICAgICMgU2VlIG9mIHRoZSBkaXN0cmlidXRpb24gb3B0aW9uIGhhcyBiZWVuIHNldCwgb3RoZXJ3aXNlIGNoZWNrIHRoZQogICAgICAgICMgc2V0dXB0b29scyBkZWZhdWx0LgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zIGlzIG5vdCBUcnVlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3QgZmlsZXM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxvZy5pbmZvKCJGaXhpbmcgIiArICIgIi5qb2luKGZpbGVzKSkKICAgICAgICBzZWxmLl9fYnVpbGRfZml4ZXJfbmFtZXMoKQogICAgICAgIHNlbGYuX19leGNsdWRlX2ZpeGVycygpCiAgICAgICAgaWYgZG9jdGVzdHM6CiAgICAgICAgICAgIGlmIHNldHVwdG9vbHMucnVuXzJ0bzNfb25fZG9jdGVzdHM6CiAgICAgICAgICAgICAgICByID0gRGlzdHV0aWxzUmVmYWN0b3JpbmdUb29sKHNlbGYuZml4ZXJfbmFtZXMpCiAgICAgICAgICAgICAgICByLnJlZmFjdG9yKGZpbGVzLCB3cml0ZT1UcnVlLCBkb2N0ZXN0c19vbmx5PVRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX01peGluMnRvMy5ydW5fMnRvMyhzZWxmLCBmaWxlcykKCiAgICBkZWYgX19idWlsZF9maXhlcl9uYW1lcyhzZWxmKToKICAgICAgICBpZiBzZWxmLmZpeGVyX25hbWVzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZpeGVyX25hbWVzID0gW10KICAgICAgICBmb3IgcCBpbiBzZXR1cHRvb2xzLmxpYjJ0bzNfZml4ZXJfcGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYuZml4ZXJfbmFtZXMuZXh0ZW5kKGdldF9maXhlcnNfZnJvbV9wYWNrYWdlKHApKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2ZpeGVycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZml4ZXJzOgogICAgICAgICAgICAgICAgc2VsZi5maXhlcl9uYW1lcy5leHRlbmQoZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UocCkpCgogICAgZGVmIF9fZXhjbHVkZV9maXhlcnMoc2VsZik6CiAgICAgICAgZXhjbHVkZWRfZml4ZXJzID0gZ2V0YXR0cihzZWxmLCAnZXhjbHVkZV9maXhlcnMnLCBbXSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19leGNsdWRlX2ZpeGVycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZXhjbHVkZWRfZml4ZXJzLmV4dGVuZChzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19leGNsdWRlX2ZpeGVycykKICAgICAgICBmb3IgZml4ZXJfbmFtZSBpbiBleGNsdWRlZF9maXhlcnM6CiAgICAgICAgICAgIGlmIGZpeGVyX25hbWUgaW4gc2VsZi5maXhlcl9uYW1lczoKICAgICAgICAgICAgICAgIHNlbGYuZml4ZXJfbmFtZXMucmVtb3ZlKGZpeGVyX25hbWUpClBLAwQUAAAAAAAAACEAjUNyXp0WAACdFgAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL21vbmtleS5weSIiIgpNb25rZXkgcGF0Y2hpbmcgb2YgZGlzdHV0aWxzLgoiIiIKCmltcG9ydCBzeXMKaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdAppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHR5cGVzCmltcG9ydCBmdW5jdG9vbHMKZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKaW1wb3J0IGluc3BlY3QKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKaW1wb3J0IHNldHVwdG9vbHMKCl9fYWxsX18gPSBbXQoiIiIKRXZlcnl0aGluZyBpcyBwcml2YXRlLiBDb250YWN0IHRoZSBwcm9qZWN0IHRlYW0KaWYgeW91IHRoaW5rIHlvdSBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KIiIiCgoKZGVmIF9nZXRfbXJvKGNscyk6CiAgICAiIiIKICAgIFJldHVybnMgdGhlIGJhc2VzIGNsYXNzZXMgZm9yIGNscyBzb3J0ZWQgYnkgdGhlIE1STy4KCiAgICBXb3JrcyBhcm91bmQgYW4gaXNzdWUgb24gSnl0aG9uIHdoZXJlIGluc3BlY3QuZ2V0bXJvIHdpbGwgbm90IHJldHVybiBhbGwKICAgIGJhc2UgY2xhc3NlcyBpZiBtdWx0aXBsZSBjbGFzc2VzIHNoYXJlIHRoZSBzYW1lIG5hbWUuIEluc3RlYWQsIHRoaXMKICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyB0aGUgY2xhc3MgaXRzZWxmLCBhbmQgdGhlIGNvbnRlbnRzCiAgICBvZiBjbHMuX19iYXNlc19fLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTAyNC4KICAgICIiIgogICAgaWYgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkgPT0gIkp5dGhvbiI6CiAgICAgICAgcmV0dXJuIChjbHMsKSArIGNscy5fX2Jhc2VzX18KICAgIHJldHVybiBpbnNwZWN0LmdldG1ybyhjbHMpCgoKZGVmIGdldF91bnBhdGNoZWQoaXRlbSk6CiAgICBsb29rdXAgPSAoCiAgICAgICAgZ2V0X3VucGF0Y2hlZF9jbGFzcyBpZiBpc2luc3RhbmNlKGl0ZW0sIHNpeC5jbGFzc190eXBlcykgZWxzZQogICAgICAgIGdldF91bnBhdGNoZWRfZnVuY3Rpb24gaWYgaXNpbnN0YW5jZShpdGVtLCB0eXBlcy5GdW5jdGlvblR5cGUpIGVsc2UKICAgICAgICBsYW1iZGEgaXRlbTogTm9uZQogICAgKQogICAgcmV0dXJuIGxvb2t1cChpdGVtKQoKCmRlZiBnZXRfdW5wYXRjaGVkX2NsYXNzKGNscyk6CiAgICAiIiJQcm90ZWN0IGFnYWluc3QgcmUtcGF0Y2hpbmcgdGhlIGRpc3R1dGlscyBpZiByZWxvYWRlZAoKICAgIEFsc28gZW5zdXJlcyB0aGF0IG5vIG90aGVyIGRpc3R1dGlscyBleHRlbnNpb24gbW9ua2V5cGF0Y2hlZCB0aGUgZGlzdHV0aWxzCiAgICBmaXJzdC4KICAgICIiIgogICAgZXh0ZXJuYWxfYmFzZXMgPSAoCiAgICAgICAgY2xzCiAgICAgICAgZm9yIGNscyBpbiBfZ2V0X21ybyhjbHMpCiAgICAgICAgaWYgbm90IGNscy5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ3NldHVwdG9vbHMnKQogICAgKQogICAgYmFzZSA9IG5leHQoZXh0ZXJuYWxfYmFzZXMpCiAgICBpZiBub3QgYmFzZS5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ2Rpc3R1dGlscycpOgogICAgICAgIG1zZyA9ICJkaXN0dXRpbHMgaGFzIGFscmVhZHkgYmVlbiBwYXRjaGVkIGJ5ICVyIiAlIGNscwogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1zZykKICAgIHJldHVybiBiYXNlCgoKZGVmIHBhdGNoX2FsbCgpOgogICAgIyB3ZSBjYW4ndCBwYXRjaCBkaXN0dXRpbHMuY21kLCBhbGFzCiAgICBkaXN0dXRpbHMuY29yZS5Db21tYW5kID0gc2V0dXB0b29scy5Db21tYW5kCgogICAgaGFzX2lzc3VlXzEyODg1ID0gc3lzLnZlcnNpb25faW5mbyA8PSAoMywgNSwgMykKCiAgICBpZiBoYXNfaXNzdWVfMTI4ODU6CiAgICAgICAgIyBmaXggZmluZGFsbCBidWcgaW4gZGlzdHV0aWxzIChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTI4ODUpCiAgICAgICAgZGlzdHV0aWxzLmZpbGVsaXN0LmZpbmRhbGwgPSBzZXR1cHRvb2xzLmZpbmRhbGwKCiAgICBuZWVkc193YXJlaG91c2UgPSAoCiAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3LCAxMykKICAgICAgICBvcgogICAgICAgICgzLCAwKSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMywgNykKICAgICAgICBvcgogICAgICAgICgzLCA0KSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNCwgNikKICAgICAgICBvcgogICAgICAgICgzLCA1KSA8IHN5cy52ZXJzaW9uX2luZm8gPD0gKDMsIDUsIDMpCiAgICApCgogICAgaWYgbmVlZHNfd2FyZWhvdXNlOgogICAgICAgIHdhcmVob3VzZSA9ICdodHRwczovL3VwbG9hZC5weXBpLm9yZy9sZWdhY3kvJwogICAgICAgIGRpc3R1dGlscy5jb25maWcuUHlQSVJDQ29tbWFuZC5ERUZBVUxUX1JFUE9TSVRPUlkgPSB3YXJlaG91c2UKCiAgICBfcGF0Y2hfZGlzdHJpYnV0aW9uX21ldGFkYXRhX3dyaXRlX3BrZ19maWxlKCkKICAgIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGFfd3JpdGVfcGtnX2luZm8oKQoKICAgICMgSW5zdGFsbCBEaXN0cmlidXRpb24gdGhyb3VnaG91dCB0aGUgZGlzdHV0aWxzCiAgICBmb3IgbW9kdWxlIGluIGRpc3R1dGlscy5kaXN0LCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmNtZDoKICAgICAgICBtb2R1bGUuRGlzdHJpYnV0aW9uID0gc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbgoKICAgICMgSW5zdGFsbCB0aGUgcGF0Y2hlZCBFeHRlbnNpb24KICAgIGRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbiA9IHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgZGlzdHV0aWxzLmV4dGVuc2lvbi5FeHRlbnNpb24gPSBzZXR1cHRvb2xzLmV4dGVuc2lvbi5FeHRlbnNpb24KICAgIGlmICdkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnIGluIHN5cy5tb2R1bGVzOgogICAgICAgIHN5cy5tb2R1bGVzWydkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnXS5FeHRlbnNpb24gPSAoCiAgICAgICAgICAgIHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgICAgICkKCiAgICBwYXRjaF9mb3JfbXN2Y19zcGVjaWFsaXplZF9jb21waWxlcigpCgoKZGVmIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGFfd3JpdGVfcGtnX2ZpbGUoKToKICAgICIiIlBhdGNoIHdyaXRlX3BrZ19maWxlIHRvIGFsc28gd3JpdGUgUmVxdWlyZXMtUHl0aG9uL1JlcXVpcmVzLUV4dGVybmFsIiIiCiAgICBkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb25NZXRhZGF0YS53cml0ZV9wa2dfZmlsZSA9ICgKICAgICAgICBzZXR1cHRvb2xzLmRpc3Qud3JpdGVfcGtnX2ZpbGUKICAgICkKCgpkZWYgX3BhdGNoX2Rpc3RyaWJ1dGlvbl9tZXRhZGF0YV93cml0ZV9wa2dfaW5mbygpOgogICAgIiIiCiAgICBXb3JrYXJvdW5kIGlzc3VlICMxOTcgLSBQeXRob24gMyBwcmlvciB0byAzLjIuMiB1c2VzIGFuIGVudmlyb25tZW50LWxvY2FsCiAgICBlbmNvZGluZyB0byBzYXZlIHRoZSBwa2dfaW5mby4gTW9ua2V5LXBhdGNoIGl0cyB3cml0ZV9wa2dfaW5mbyBtZXRob2QgdG8KICAgIGNvcnJlY3QgdGhpcyB1bmRlc2lyYWJsZSBiZWhhdmlvci4KICAgICIiIgogICAgZW52aXJvbm1lbnRfbG9jYWwgPSAoMywpIDw9IHN5cy52ZXJzaW9uX2luZm9bOjNdIDwgKDMsIDIsIDIpCiAgICBpZiBub3QgZW52aXJvbm1lbnRfbG9jYWw6CiAgICAgICAgcmV0dXJuCgogICAgZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uTWV0YWRhdGEud3JpdGVfcGtnX2luZm8gPSAoCiAgICAgICAgc2V0dXB0b29scy5kaXN0LndyaXRlX3BrZ19pbmZvCiAgICApCgoKZGVmIHBhdGNoX2Z1bmMocmVwbGFjZW1lbnQsIHRhcmdldF9tb2QsIGZ1bmNfbmFtZSk6CiAgICAiIiIKICAgIFBhdGNoIGZ1bmNfbmFtZSBpbiB0YXJnZXRfbW9kIHdpdGggcmVwbGFjZW1lbnQKCiAgICBJbXBvcnRhbnQgLSBvcmlnaW5hbCBtdXN0IGJlIHJlc29sdmVkIGJ5IG5hbWUgdG8gYXZvaWQKICAgIHBhdGNoaW5nIGFuIGFscmVhZHkgcGF0Y2hlZCBmdW5jdGlvbi4KICAgICIiIgogICAgb3JpZ2luYWwgPSBnZXRhdHRyKHRhcmdldF9tb2QsIGZ1bmNfbmFtZSkKCiAgICAjIHNldCB0aGUgJ3VucGF0Y2hlZCcgYXR0cmlidXRlIG9uIHRoZSByZXBsYWNlbWVudCB0bwogICAgIyBwb2ludCB0byB0aGUgb3JpZ2luYWwuCiAgICB2YXJzKHJlcGxhY2VtZW50KS5zZXRkZWZhdWx0KCd1bnBhdGNoZWQnLCBvcmlnaW5hbCkKCiAgICAjIHJlcGxhY2UgdGhlIGZ1bmN0aW9uIGluIHRoZSBvcmlnaW5hbCBtb2R1bGUKICAgIHNldGF0dHIodGFyZ2V0X21vZCwgZnVuY19uYW1lLCByZXBsYWNlbWVudCkKCgpkZWYgZ2V0X3VucGF0Y2hlZF9mdW5jdGlvbihjYW5kaWRhdGUpOgogICAgcmV0dXJuIGdldGF0dHIoY2FuZGlkYXRlLCAndW5wYXRjaGVkJykKCgpkZWYgcGF0Y2hfZm9yX21zdmNfc3BlY2lhbGl6ZWRfY29tcGlsZXIoKToKICAgICIiIgogICAgUGF0Y2ggZnVuY3Rpb25zIGluIGRpc3R1dGlscyB0byB1c2Ugc3RhbmRhbG9uZSBNaWNyb3NvZnQgVmlzdWFsIEMrKwogICAgY29tcGlsZXJzLgogICAgIiIiCiAgICAjIGltcG9ydCBsYXRlIHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydHMgb24gUHl0aG9uIDwgMy41CiAgICBtc3ZjID0gaW1wb3J0X21vZHVsZSgnc2V0dXB0b29scy5tc3ZjJykKCiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CiAgICAgICAgIyBDb21waWxlcnMgb25seSBhdmFpbGFibGVzIG9uIE1pY3Jvc29mdCBXaW5kb3dzCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHBhdGNoX3BhcmFtcyhtb2RfbmFtZSwgZnVuY19uYW1lKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHRoZSBwYXJhbWV0ZXJzIGZvciBwYXRjaF9mdW5jIHRvIHBhdGNoIGluZGljYXRlZCBmdW5jdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXBsX3ByZWZpeCA9ICdtc3ZjOV8nIGlmICdtc3ZjOScgaW4gbW9kX25hbWUgZWxzZSAnbXN2YzE0XycKICAgICAgICByZXBsX25hbWUgPSByZXBsX3ByZWZpeCArIGZ1bmNfbmFtZS5sc3RyaXAoJ18nKQogICAgICAgIHJlcGwgPSBnZXRhdHRyKG1zdmMsIHJlcGxfbmFtZSkKICAgICAgICBtb2QgPSBpbXBvcnRfbW9kdWxlKG1vZF9uYW1lKQogICAgICAgIGlmIG5vdCBoYXNhdHRyKG1vZCwgZnVuY19uYW1lKToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoZnVuY19uYW1lKQogICAgICAgIHJldHVybiByZXBsLCBtb2QsIGZ1bmNfbmFtZQoKICAgICMgUHl0aG9uIDIuNyB0byAzLjQKICAgIG1zdmM5ID0gZnVuY3Rvb2xzLnBhcnRpYWwocGF0Y2hfcGFyYW1zLCAnZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXInKQoKICAgICMgUHl0aG9uIDMuNSsKICAgIG1zdmMxNCA9IGZ1bmN0b29scy5wYXJ0aWFsKHBhdGNoX3BhcmFtcywgJ2Rpc3R1dGlscy5fbXN2Y2NvbXBpbGVyJykKCiAgICB0cnk6CiAgICAgICAgIyBQYXRjaCBkaXN0dXRpbHMubXN2Yzljb21waWxlcgogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmM5KCdmaW5kX3ZjdmFyc2FsbCcpKQogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmM5KCdxdWVyeV92Y3ZhcnNhbGwnKSkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgICMgUGF0Y2ggZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuX2dldF92Y19lbnYKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjMTQoJ19nZXRfdmNfZW52JykpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIFBhdGNoIGRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLmdlbl9saWJfb3B0aW9ucyBmb3IgTnVtcHkKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjMTQoJ2dlbl9saWJfb3B0aW9ucycpKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQCCw5TmtJ8AALSfAAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbXN2Yy5weSIiIgpJbXByb3ZlZCBzdXBwb3J0IGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBjb21waWxlcnMuCgpLbm93biBzdXBwb3J0ZWQgY29tcGlsZXJzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjA6CiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBDb21waWxlciBmb3IgUHl0aG9uIDIuNyAoeDg2LCBhbWQ2NCkKICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA2LjEgKHg4NiwgeDY0LCBpYTY0KQogICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMCAoeDg2LCB4NjQsIGlhNjQpCgpNaWNyb3NvZnQgVmlzdWFsIEMrKyAxMC4wOgogICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMSAoeDg2LCB4NjQsIGlhNjQpCgpNaWNyb3NvZnQgVmlzdWFsIEMrKyAxNC4wOgogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQnVpbGQgVG9vbHMgMjAxNSAoeDg2LCB4NjQsIGFybSkKICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTcgKHg4NiwgeDY0LCBhcm0sIGFybTY0KQogICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gQnVpbGQgVG9vbHMgMjAxNyAoeDg2LCB4NjQsIGFybSwgYXJtNjQpCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgTGVnYWN5VmVyc2lvbgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGZpbHRlcmZhbHNlCgpmcm9tIC5tb25rZXkgaW1wb3J0IGdldF91bnBhdGNoZWQKCmlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKICAgIGZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB3aW5yZWcKICAgIHNhZmVfZW52ID0gb3MuZW52aXJvbgplbHNlOgogICAgIiIiCiAgICBNb2NrIHdpbnJlZyBhbmQgZW52aXJvbiBzbyB0aGUgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZAogICAgb24gdGhpcyBwbGF0Zm9ybS4KICAgICIiIgoKICAgIGNsYXNzIHdpbnJlZzoKICAgICAgICBIS0VZX1VTRVJTID0gTm9uZQogICAgICAgIEhLRVlfQ1VSUkVOVF9VU0VSID0gTm9uZQogICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSA9IE5vbmUKICAgICAgICBIS0VZX0NMQVNTRVNfUk9PVCA9IE5vbmUKCiAgICBzYWZlX2VudiA9IGRpY3QoKQoKX21zdmM5X3N1cHByZXNzX2Vycm9ycyA9ICgKICAgICMgbXN2Yzljb21waWxlciBpc24ndCBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMKICAgIEltcG9ydEVycm9yLAogICAgCiAgICAjIG1zdmM5Y29tcGlsZXIgcmFpc2VzIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IgaW4gc29tZQogICAgIyBlbnZpcm9ubWVudHMuIFNlZSAjMTExOC4KICAgIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKQoKdHJ5OgogICAgZnJvbSBkaXN0dXRpbHMubXN2Yzljb21waWxlciBpbXBvcnQgUmVnCmV4Y2VwdCBfbXN2Yzlfc3VwcHJlc3NfZXJyb3JzOgogICAgcGFzcwoKCmRlZiBtc3ZjOV9maW5kX3ZjdmFyc2FsbCh2ZXJzaW9uKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIuZmluZF92Y3ZhcnNhbGwiIHRvIHVzZSB0aGUgc3RhbmRhbG9uZQogICAgY29tcGlsZXIgYnVpbGQgZm9yIFB5dGhvbiAoVkNGb3JQeXRob24pLiBGYWxsIGJhY2sgdG8gb3JpZ2luYWwgYmVoYXZpb3IKICAgIHdoZW4gdGhlIHN0YW5kYWxvbmUgY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4KCiAgICBSZWRpcmVjdCB0aGUgcGF0aCBvZiAidmN2YXJzYWxsLmJhdCIuCgogICAgS25vd24gc3VwcG9ydGVkIGNvbXBpbGVycwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wOgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIENvbXBpbGVyIGZvciBQeXRob24gMi43ICh4ODYsIGFtZDY0KQoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHZlcnNpb246IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KCiAgICBSZXR1cm4KICAgIC0tLS0tLQogICAgdmN2YXJzYWxsLmJhdCBwYXRoOiBzdHIKICAgICIiIgogICAgVkNfQkFTRSA9IHInU29mdHdhcmVcJXNNaWNyb3NvZnRcRGV2RGl2XFZDRm9yUHl0aG9uXCUwLjFmJwogICAga2V5ID0gVkNfQkFTRSAlICgnJywgdmVyc2lvbikKICAgIHRyeToKICAgICAgICAjIFBlci11c2VyIGluc3RhbGxzIHJlZ2lzdGVyIHRoZSBjb21waWxlciBwYXRoIGhlcmUKICAgICAgICBwcm9kdWN0ZGlyID0gUmVnLmdldF92YWx1ZShrZXksICJpbnN0YWxsZGlyIikKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgQWxsLXVzZXIgaW5zdGFsbHMgb24gYSA2NC1iaXQgc3lzdGVtIHJlZ2lzdGVyIGhlcmUKICAgICAgICAgICAga2V5ID0gVkNfQkFTRSAlICgnV293NjQzMk5vZGVcXCcsIHZlcnNpb24pCiAgICAgICAgICAgIHByb2R1Y3RkaXIgPSBSZWcuZ2V0X3ZhbHVlKGtleSwgImluc3RhbGxkaXIiKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcHJvZHVjdGRpciA9IE5vbmUKCiAgICBpZiBwcm9kdWN0ZGlyOgogICAgICAgIHZjdmFyc2FsbCA9IG9zLnBhdGgub3MucGF0aC5qb2luKHByb2R1Y3RkaXIsICJ2Y3ZhcnNhbGwuYmF0IikKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSh2Y3ZhcnNhbGwpOgogICAgICAgICAgICByZXR1cm4gdmN2YXJzYWxsCgogICAgcmV0dXJuIGdldF91bnBhdGNoZWQobXN2YzlfZmluZF92Y3ZhcnNhbGwpKHZlcnNpb24pCgoKZGVmIG1zdmM5X3F1ZXJ5X3ZjdmFyc2FsbCh2ZXIsIGFyY2g9J3g4NicsICphcmdzLCAqKmt3YXJncyk6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyLnF1ZXJ5X3ZjdmFyc2FsbCIgZm9yIHN1cHBvcnQgZXh0cmEKICAgIGNvbXBpbGVycy4KCiAgICBTZXQgZW52aXJvbm1lbnQgd2l0aG91dCB1c2Ugb2YgInZjdmFyc2FsbC5iYXQiLgoKICAgIEtub3duIHN1cHBvcnRlZCBjb21waWxlcnMKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMDoKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBDb21waWxlciBmb3IgUHl0aG9uIDIuNyAoeDg2LCBhbWQ2NCkKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNi4xICh4ODYsIHg2NCwgaWE2NCkKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNy4wICh4ODYsIHg2NCwgaWE2NCkKCiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAxMC4wOgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjEgKHg4NiwgeDY0LCBpYTY0KQoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHZlcjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgYXJjaDogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KCiAgICBSZXR1cm4KICAgIC0tLS0tLQogICAgZW52aXJvbm1lbnQ6IGRpY3QKICAgICIiIgogICAgIyBUcnkgdG8gZ2V0IGVudmlyb25lbWVudCBmcm9tIHZjdmFyc2FsbC5iYXQgKENsYXNzaWNhbCB3YXkpCiAgICB0cnk6CiAgICAgICAgb3JpZyA9IGdldF91bnBhdGNoZWQobXN2YzlfcXVlcnlfdmN2YXJzYWxsKQogICAgICAgIHJldHVybiBvcmlnKHZlciwgYXJjaCwgKmFyZ3MsICoqa3dhcmdzKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcjoKICAgICAgICAjIFBhc3MgZXJyb3IgaWYgVmN2YXJzYWxsLmJhdCBpcyBtaXNzaW5nCiAgICAgICAgcGFzcwogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgIyBQYXNzIGVycm9yIGlmIGVudmlyb25tZW50IG5vdCBzZXQgYWZ0ZXIgZXhlY3V0aW5nIHZjdmFyc2FsbC5iYXQKICAgICAgICBwYXNzCgogICAgIyBJZiBlcnJvciwgdHJ5IHRvIHNldCBlbnZpcm9ubWVudCBkaXJlY3RseQogICAgdHJ5OgogICAgICAgIHJldHVybiBFbnZpcm9ubWVudEluZm8oYXJjaCwgdmVyKS5yZXR1cm5fZW52KCkKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IgYXMgZXhjOgogICAgICAgIF9hdWdtZW50X2V4Y2VwdGlvbihleGMsIHZlciwgYXJjaCkKICAgICAgICByYWlzZQoKCmRlZiBtc3ZjMTRfZ2V0X3ZjX2VudihwbGF0X3NwZWMpOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMuX21zdmNjb21waWxlci5fZ2V0X3ZjX2VudiIgZm9yIHN1cHBvcnQgZXh0cmEKICAgIGNvbXBpbGVycy4KCiAgICBTZXQgZW52aXJvbm1lbnQgd2l0aG91dCB1c2Ugb2YgInZjdmFyc2FsbC5iYXQiLgoKICAgIEtub3duIHN1cHBvcnRlZCBjb21waWxlcnMKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDE0LjA6CiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQnVpbGQgVG9vbHMgMjAxNSAoeDg2LCB4NjQsIGFybSkKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDE3ICh4ODYsIHg2NCwgYXJtLCBhcm02NCkKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scyAyMDE3ICh4ODYsIHg2NCwgYXJtLCBhcm02NCkKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBwbGF0X3NwZWM6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCgogICAgUmV0dXJuCiAgICAtLS0tLS0KICAgIGVudmlyb25tZW50OiBkaWN0CiAgICAiIiIKICAgICMgVHJ5IHRvIGdldCBlbnZpcm9ubWVudCBmcm9tIHZjdmFyc2FsbC5iYXQgKENsYXNzaWNhbCB3YXkpCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGdldF91bnBhdGNoZWQobXN2YzE0X2dldF92Y19lbnYpKHBsYXRfc3BlYykKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CiAgICAgICAgIyBQYXNzIGVycm9yIFZjdmFyc2FsbC5iYXQgaXMgbWlzc2luZwogICAgICAgIHBhc3MKCiAgICAjIElmIGVycm9yLCB0cnkgdG8gc2V0IGVudmlyb25tZW50IGRpcmVjdGx5CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50SW5mbyhwbGF0X3NwZWMsIHZjX21pbl92ZXI9MTQuMCkucmV0dXJuX2VudigpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yIGFzIGV4YzoKICAgICAgICBfYXVnbWVudF9leGNlcHRpb24oZXhjLCAxNC4wKQogICAgICAgIHJhaXNlCgoKZGVmIG1zdmMxNF9nZW5fbGliX29wdGlvbnMoKmFyZ3MsICoqa3dhcmdzKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuZ2VuX2xpYl9vcHRpb25zIiBmb3IgZml4CiAgICBjb21wYXRpYmlsaXR5IGJldHdlZW4gIm51bXB5LmRpc3R1dGlscyIgYW5kICJkaXN0dXRpbHMuX21zdmNjb21waWxlciIKICAgIChmb3IgTnVtcHkgPCAxLjExLjIpCiAgICAiIiIKICAgIGlmICJudW1weS5kaXN0dXRpbHMiIGluIHN5cy5tb2R1bGVzOgogICAgICAgIGltcG9ydCBudW1weSBhcyBucAogICAgICAgIGlmIExlZ2FjeVZlcnNpb24obnAuX192ZXJzaW9uX18pIDwgTGVnYWN5VmVyc2lvbignMS4xMS4yJyk6CiAgICAgICAgICAgIHJldHVybiBucC5kaXN0dXRpbHMuY2NvbXBpbGVyLmdlbl9saWJfb3B0aW9ucygqYXJncywgKiprd2FyZ3MpCiAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChtc3ZjMTRfZ2VuX2xpYl9vcHRpb25zKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIF9hdWdtZW50X2V4Y2VwdGlvbihleGMsIHZlcnNpb24sIGFyY2g9JycpOgogICAgIiIiCiAgICBBZGQgZGV0YWlscyB0byB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgdG8gaGVscCBndWlkZSB0aGUgdXNlcgogICAgYXMgdG8gd2hhdCBhY3Rpb24gd2lsbCByZXNvbHZlIGl0LgogICAgIiIiCiAgICAjIEVycm9yIGlmIE1TVkMrKyBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGVudmlyb25tZW50IG5vdCBzZXQKICAgIG1lc3NhZ2UgPSBleGMuYXJnc1swXQoKICAgIGlmICJ2Y3ZhcnNhbGwiIGluIG1lc3NhZ2UubG93ZXIoKSBvciAidmlzdWFsIGMiIGluIG1lc3NhZ2UubG93ZXIoKToKICAgICAgICAjIFNwZWNpYWwgZXJyb3IgbWVzc2FnZSBpZiBNU1ZDKysgbm90IGluc3RhbGxlZAogICAgICAgIHRtcGwgPSAnTWljcm9zb2Z0IFZpc3VhbCBDKysge3ZlcnNpb246MC4xZn0gaXMgcmVxdWlyZWQuJwogICAgICAgIG1lc3NhZ2UgPSB0bXBsLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgIG1zZG93bmxvYWQgPSAnd3d3Lm1pY3Jvc29mdC5jb20vZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPSVkJwogICAgICAgIGlmIHZlcnNpb24gPT0gOS4wOgogICAgICAgICAgICBpZiBhcmNoLmxvd2VyKCkuZmluZCgnaWE2NCcpID4gLTE6CiAgICAgICAgICAgICAgICAjIEZvciBWQysrIDkuMCwgaWYgSUE2NCBzdXBwb3J0IGlzIG5lZWRlZCwgcmVkaXJlY3QgdXNlcgogICAgICAgICAgICAgICAgIyB0byBXaW5kb3dzIFNESyA3LjAKICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBHZXQgaXQgd2l0aCAiTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMCI6ICcKICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gbXNkb3dubG9hZCAlIDMxMzgKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgRm9yIFZDKysgOS4wIHJlZGlyZWN0IHVzZXIgdG8gVmMrKyBmb3IgUHl0aG9uIDIuNyA6CiAgICAgICAgICAgICAgICAjIFRoaXMgcmVkaXJlY3Rpb24gbGluayBpcyBtYWludGFpbmVkIGJ5IE1pY3Jvc29mdC4KICAgICAgICAgICAgICAgICMgQ29udGFjdCB2c3B5dGhvbkBtaWNyb3NvZnQuY29tIGlmIGl0IG5lZWRzIHVwZGF0aW5nLgogICAgICAgICAgICAgICAgbWVzc2FnZSArPSAnIEdldCBpdCBmcm9tIGh0dHA6Ly9ha2EubXMvdmNweXRob24yNycKICAgICAgICBlbGlmIHZlcnNpb24gPT0gMTAuMDoKICAgICAgICAgICAgIyBGb3IgVkMrKyAxMC4wIFJlZGlyZWN0IHVzZXIgdG8gV2luZG93cyBTREsgNy4xCiAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBHZXQgaXQgd2l0aCAiTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMSI6ICcKICAgICAgICAgICAgbWVzc2FnZSArPSBtc2Rvd25sb2FkICUgODI3OQogICAgICAgIGVsaWYgdmVyc2lvbiA+PSAxNC4wOgogICAgICAgICAgICAjIEZvciBWQysrIDE0LjAgUmVkaXJlY3QgdXNlciB0byBWaXN1YWwgQysrIEJ1aWxkIFRvb2xzCiAgICAgICAgICAgIG1lc3NhZ2UgKz0gKCcgR2V0IGl0IHdpdGggIk1pY3Jvc29mdCBWaXN1YWwgQysrIEJ1aWxkIFRvb2xzIjogJwogICAgICAgICAgICAgICAgICAgICAgICByJ2h0dHA6Ly9sYW5kaW5naHViLnZpc3VhbHN0dWRpby5jb20vJwogICAgICAgICAgICAgICAgICAgICAgICAndmlzdWFsLWNwcC1idWlsZC10b29scycpCgogICAgZXhjLmFyZ3MgPSAobWVzc2FnZSwgKQoKCmNsYXNzIFBsYXRmb3JtSW5mbzoKICAgICIiIgogICAgQ3VycmVudCBhbmQgVGFyZ2V0IEFyY2hpdGVjdHVyZXMgaW5mb3JtYXRpb25zLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGFyY2g6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCiAgICAiIiIKICAgIGN1cnJlbnRfY3B1ID0gc2FmZV9lbnYuZ2V0KCdwcm9jZXNzb3JfYXJjaGl0ZWN0dXJlJywgJycpLmxvd2VyKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXJjaCk6CiAgICAgICAgc2VsZi5hcmNoID0gYXJjaC5sb3dlcigpLnJlcGxhY2UoJ3g2NCcsICdhbWQ2NCcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFyZ2V0X2NwdShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmNoW3NlbGYuYXJjaC5maW5kKCdfJykgKyAxOl0KCiAgICBkZWYgdGFyZ2V0X2lzX3g4NihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50YXJnZXRfY3B1ID09ICd4ODYnCgogICAgZGVmIGN1cnJlbnRfaXNfeDg2KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmN1cnJlbnRfY3B1ID09ICd4ODYnCgogICAgZGVmIGN1cnJlbnRfZGlyKHNlbGYsIGhpZGV4ODY9RmFsc2UsIHg2ND1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ3VycmVudCBwbGF0Zm9ybSBzcGVjaWZpYyBzdWJmb2xkZXIuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgaGlkZXg4NjogYm9vbAogICAgICAgICAgICByZXR1cm4gJycgYW5kIG5vdCAnXHg4NicgaWYgYXJjaGl0ZWN0dXJlIGlzIHg4Ni4KICAgICAgICB4NjQ6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICdceDY0JyBhbmQgbm90ICdcYW1kNjQnIGlmIGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3ViZm9sZGVyOiBzdHIKICAgICAgICAgICAgJ1x0YXJnZXQnLCBvciAnJyAoc2VlIGhpZGV4ODYgcGFyYW1ldGVyKQogICAgICAgICIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICcnIGlmIChzZWxmLmN1cnJlbnRfY3B1ID09ICd4ODYnIGFuZCBoaWRleDg2KSBlbHNlCiAgICAgICAgICAgIHInXHg2NCcgaWYgKHNlbGYuY3VycmVudF9jcHUgPT0gJ2FtZDY0JyBhbmQgeDY0KSBlbHNlCiAgICAgICAgICAgIHInXCVzJyAlIHNlbGYuY3VycmVudF9jcHUKICAgICAgICApCgogICAgZGVmIHRhcmdldF9kaXIoc2VsZiwgaGlkZXg4Nj1GYWxzZSwgeDY0PUZhbHNlKToKICAgICAgICByIiIiCiAgICAgICAgVGFyZ2V0IHBsYXRmb3JtIHNwZWNpZmljIHN1YmZvbGRlci4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBoaWRleDg2OiBib29sCiAgICAgICAgICAgIHJldHVybiAnJyBhbmQgbm90ICdceDg2JyBpZiBhcmNoaXRlY3R1cmUgaXMgeDg2LgogICAgICAgIHg2NDogYm9vbAogICAgICAgICAgICByZXR1cm4gJ1x4NjQnIGFuZCBub3QgJ1xhbWQ2NCcgaWYgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdWJmb2xkZXI6IHN0cgogICAgICAgICAgICAnXGN1cnJlbnQnLCBvciAnJyAoc2VlIGhpZGV4ODYgcGFyYW1ldGVyKQogICAgICAgICIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICcnIGlmIChzZWxmLnRhcmdldF9jcHUgPT0gJ3g4NicgYW5kIGhpZGV4ODYpIGVsc2UKICAgICAgICAgICAgcidceDY0JyBpZiAoc2VsZi50YXJnZXRfY3B1ID09ICdhbWQ2NCcgYW5kIHg2NCkgZWxzZQogICAgICAgICAgICByJ1wlcycgJSBzZWxmLnRhcmdldF9jcHUKICAgICAgICApCgogICAgZGVmIGNyb3NzX2RpcihzZWxmLCBmb3JjZXg4Nj1GYWxzZSk6CiAgICAgICAgciIiIgogICAgICAgIENyb3NzIHBsYXRmb3JtIHNwZWNpZmljIHN1YmZvbGRlci4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBmb3JjZXg4NjogYm9vbAogICAgICAgICAgICBVc2UgJ3g4NicgYXMgY3VycmVudCBhcmNoaXRlY3R1cmUgZXZlbiBpZiBjdXJyZW50IGFjcml0ZWN0dXJlIGlzCiAgICAgICAgICAgIG5vdCB4ODYuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN1YmZvbGRlcjogc3RyCiAgICAgICAgICAgICcnIGlmIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgY3VycmVudCBhcmNoaXRlY3R1cmUsCiAgICAgICAgICAgICdcY3VycmVudF90YXJnZXQnIGlmIG5vdC4KICAgICAgICAiIiIKICAgICAgICBjdXJyZW50ID0gJ3g4NicgaWYgZm9yY2V4ODYgZWxzZSBzZWxmLmN1cnJlbnRfY3B1CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJycgaWYgc2VsZi50YXJnZXRfY3B1ID09IGN1cnJlbnQgZWxzZQogICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIoKS5yZXBsYWNlKCdcXCcsICdcXCVzXycgJSBjdXJyZW50KQogICAgICAgICkKCgpjbGFzcyBSZWdpc3RyeUluZm86CiAgICAiIiIKICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIHJlbGF0ZWQgcmVnaXN0cnkgaW5mb3JtYXRpb25zLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHBsYXRmb3JtX2luZm86IFBsYXRmb3JtSW5mbwogICAgICAgICJQbGF0Zm9ybUluZm8iIGluc3RhbmNlLgogICAgIiIiCiAgICBIS0VZUyA9ICh3aW5yZWcuSEtFWV9VU0VSUywKICAgICAgICAgICAgIHdpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICAgICAgIHdpbnJlZy5IS0VZX0xPQ0FMX01BQ0hJTkUsCiAgICAgICAgICAgICB3aW5yZWcuSEtFWV9DTEFTU0VTX1JPT1QpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtX2luZm8pOgogICAgICAgIHNlbGYucGkgPSBwbGF0Zm9ybV9pbmZvCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmlzdWFsc3R1ZGlvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIHJvb3QgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnVmlzdWFsU3R1ZGlvJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN4cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTeFMgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi52aXN1YWxzdHVkaW8sICdTeFMnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZjKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIFZDNyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLnN4cywgJ1ZDNycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gVlM3IHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuc3hzLCAnVlM3JykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2Y19mb3JfcHl0aG9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIGZvciBQeXRob24gcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiByJ0RldkRpdlxWQ0ZvclB5dGhvbicKCiAgICBAcHJvcGVydHkKICAgIGRlZiBtaWNyb3NvZnRfc2RrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBTREsgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnTWljcm9zb2Z0IFNES3MnCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2luZG93c19zZGsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MvUGxhdGZvcm0gU0RLIHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYubWljcm9zb2Z0X3NkaywgJ1dpbmRvd3MnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5ldGZ4X3NkayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgU0RLIHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYubWljcm9zb2Z0X3NkaywgJ05FVEZYU0RLJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aW5kb3dzX2tpdHNfcm9vdHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgS2l0cyBSb290cyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHInV2luZG93cyBLaXRzXEluc3RhbGxlZCBSb290cycKCiAgICBkZWYgbWljcm9zb2Z0KHNlbGYsIGtleSwgeDg2PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4ga2V5IGluIE1pY3Jvc29mdCBzb2Z0d2FyZSByZWdpc3RyeS4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBrZXk6IHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkgcGF0aCB3aGVyZSBsb29rLgogICAgICAgIHg4Njogc3RyCiAgICAgICAgICAgIEZvcmNlIHg4NiBzb2Z0d2FyZSByZWdpc3RyeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyOiB2YWx1ZQogICAgICAgICIiIgogICAgICAgIG5vZGU2NCA9ICcnIGlmIHNlbGYucGkuY3VycmVudF9pc194ODYoKSBvciB4ODYgZWxzZSAnV293NjQzMk5vZGUnCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbignU29mdHdhcmUnLCBub2RlNjQsICdNaWNyb3NvZnQnLCBrZXkpCgogICAgZGVmIGxvb2t1cChzZWxmLCBrZXksIG5hbWUpOgogICAgICAgICIiIgogICAgICAgIExvb2sgZm9yIHZhbHVlcyBpbiByZWdpc3RyeSBpbiBNaWNyb3NvZnQgc29mdHdhcmUgcmVnaXN0cnkuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAga2V5OiBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5IHBhdGggd2hlcmUgbG9vay4KICAgICAgICBuYW1lOiBzdHIKICAgICAgICAgICAgVmFsdWUgbmFtZSB0byBmaW5kLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHI6IHZhbHVlCiAgICAgICAgIiIiCiAgICAgICAgS0VZX1JFQUQgPSB3aW5yZWcuS0VZX1JFQUQKICAgICAgICBvcGVua2V5ID0gd2lucmVnLk9wZW5LZXkKICAgICAgICBtcyA9IHNlbGYubWljcm9zb2Z0CiAgICAgICAgZm9yIGhrZXkgaW4gc2VsZi5IS0VZUzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYmtleSA9IG9wZW5rZXkoaGtleSwgbXMoa2V5KSwgMCwgS0VZX1JFQUQpCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgYmtleSA9IG9wZW5rZXkoaGtleSwgbXMoa2V5LCBUcnVlKSwgMCwgS0VZX1JFQUQpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHdpbnJlZy5RdWVyeVZhbHVlRXgoYmtleSwgbmFtZSlbMF0KICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIHBhc3MKCgpjbGFzcyBTeXN0ZW1JbmZvOgogICAgIiIiCiAgICBNaWNyb3NvZnQgV2luZG93cyBhbmQgVmlzdWFsIFN0dWRpbyByZWxhdGVkIHN5c3RlbSBpbm9ybWF0aW9ucy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICByZWdpc3RyeV9pbmZvOiBSZWdpc3RyeUluZm8KICAgICAgICAiUmVnaXN0cnlJbmZvIiBpbnN0YW5jZS4KICAgIHZjX3ZlcjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgIiIiCgogICAgIyBWYXJpYWJsZXMgYW5kIHByb3BlcnRpZXMgaW4gdGhpcyBjbGFzcyB1c2Ugb3JpZ2luYWxzIENhbWVsQ2FzZSB2YXJpYWJsZXMKICAgICMgbmFtZXMgZnJvbSBNaWNyb3NvZnQgc291cmNlIGZpbGVzIGZvciBtb3JlIGVhc3kgY29tcGFyYWlzb24uCiAgICBXaW5EaXIgPSBzYWZlX2Vudi5nZXQoJ1dpbkRpcicsICcnKQogICAgUHJvZ3JhbUZpbGVzID0gc2FmZV9lbnYuZ2V0KCdQcm9ncmFtRmlsZXMnLCAnJykKICAgIFByb2dyYW1GaWxlc3g4NiA9IHNhZmVfZW52LmdldCgnUHJvZ3JhbUZpbGVzKHg4NiknLCBQcm9ncmFtRmlsZXMpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlZ2lzdHJ5X2luZm8sIHZjX3Zlcj1Ob25lKToKICAgICAgICBzZWxmLnJpID0gcmVnaXN0cnlfaW5mbwogICAgICAgIHNlbGYucGkgPSBzZWxmLnJpLnBpCiAgICAgICAgc2VsZi52Y192ZXIgPSB2Y192ZXIgb3Igc2VsZi5fZmluZF9sYXRlc3RfYXZhaWxhYmxlX3ZjX3ZlcigpCgogICAgZGVmIF9maW5kX2xhdGVzdF9hdmFpbGFibGVfdmNfdmVyKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmluZF9hdmFpbGFibGVfdmNfdmVycygpWy0xXQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICBlcnIgPSAnTm8gTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbiBmb3VuZCcKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKGVycikKCiAgICBkZWYgZmluZF9hdmFpbGFibGVfdmNfdmVycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGaW5kIGFsbCBhdmFpbGFibGUgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbnMuCiAgICAgICAgIiIiCiAgICAgICAgbXMgPSBzZWxmLnJpLm1pY3Jvc29mdAogICAgICAgIHZja2V5cyA9IChzZWxmLnJpLnZjLCBzZWxmLnJpLnZjX2Zvcl9weXRob24sIHNlbGYucmkudnMpCiAgICAgICAgdmNfdmVycyA9IFtdCiAgICAgICAgZm9yIGhrZXkgaW4gc2VsZi5yaS5IS0VZUzoKICAgICAgICAgICAgZm9yIGtleSBpbiB2Y2tleXM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgYmtleSA9IHdpbnJlZy5PcGVuS2V5KGhrZXksIG1zKGtleSksIDAsIHdpbnJlZy5LRVlfUkVBRCkKICAgICAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHN1YmtleXMsIHZhbHVlcywgXyA9IHdpbnJlZy5RdWVyeUluZm9LZXkoYmtleSkKICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHZhbHVlcyk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXIgPSBmbG9hdCh3aW5yZWcuRW51bVZhbHVlKGJrZXksIGkpWzBdKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB2ZXIgbm90IGluIHZjX3ZlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y192ZXJzLmFwcGVuZCh2ZXIpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN1YmtleXMpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdmVyID0gZmxvYXQod2lucmVnLkVudW1LZXkoYmtleSwgaSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZlciBub3QgaW4gdmNfdmVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjX3ZlcnMuYXBwZW5kKHZlcikKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBzb3J0ZWQodmNfdmVycykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWU0luc3RhbGxEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgICMgRGVmYXVsdCBwYXRoCiAgICAgICAgbmFtZSA9ICdNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAlMC4xZicgJSBzZWxmLnZjX3ZlcgogICAgICAgIGRlZmF1bHQgPSBvcy5wYXRoLmpvaW4oc2VsZi5Qcm9ncmFtRmlsZXN4ODYsIG5hbWUpCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZzLCAnJTAuMWYnICUgc2VsZi52Y192ZXIpIG9yIGRlZmF1bHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ0luc3RhbGxEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIHNlbGYuVlNJbnN0YWxsRGlyCgogICAgICAgIGd1ZXNzX3ZjID0gc2VsZi5fZ3Vlc3NfdmMoKSBvciBzZWxmLl9ndWVzc192Y19sZWdhY3koKQoKICAgICAgICAjIFRyeSB0byBnZXQgIlZDKysgZm9yIFB5dGhvbiIgcGF0aCBmcm9tIHJlZ2lzdHJ5IGFzIGRlZmF1bHQgcGF0aAogICAgICAgIHJlZ19wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucmkudmNfZm9yX3B5dGhvbiwgJyUwLjFmJyAlIHNlbGYudmNfdmVyKQogICAgICAgIHB5dGhvbl92YyA9IHNlbGYucmkubG9va3VwKHJlZ19wYXRoLCAnaW5zdGFsbGRpcicpCiAgICAgICAgZGVmYXVsdF92YyA9IG9zLnBhdGguam9pbihweXRob25fdmMsICdWQycpIGlmIHB5dGhvbl92YyBlbHNlIGd1ZXNzX3ZjCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHBhdGggPSBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnJTAuMWYnICUgc2VsZi52Y192ZXIpIG9yIGRlZmF1bHRfdmMKCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgIG1zZyA9ICdNaWNyb3NvZnQgVmlzdWFsIEMrKyBkaXJlY3Rvcnkgbm90IGZvdW5kJwogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXNnKQoKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfZ3Vlc3NfdmMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG9jYXRlIFZpc3VhbCBDIGZvciAyMDE3CiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gMTQuMDoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGRlZmF1bHQgPSByJ1ZDXFRvb2xzXE1TVkMnCiAgICAgICAgZ3Vlc3NfdmMgPSBvcy5wYXRoLmpvaW4oc2VsZi5WU0luc3RhbGxEaXIsIGRlZmF1bHQpCiAgICAgICAgIyBTdWJkaXIgd2l0aCBWQyBleGFjdCB2ZXJzaW9uIGFzIG5hbWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZjX2V4YWN0X3ZlciA9IG9zLmxpc3RkaXIoZ3Vlc3NfdmMpWy0xXQogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGd1ZXNzX3ZjLCB2Y19leGFjdF92ZXIpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yLCBJbmRleEVycm9yKToKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBfZ3Vlc3NfdmNfbGVnYWN5KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIExvY2F0ZSBWaXN1YWwgQyBmb3IgdmVyc2lvbnMgcHJpb3IgdG8gMjAxNwogICAgICAgICIiIgogICAgICAgIGRlZmF1bHQgPSByJ01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvICUwLjFmXFZDJyAlIHNlbGYudmNfdmVyCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLlByb2dyYW1GaWxlc3g4NiwgZGVmYXVsdCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU2RrVmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBNU1ZDKysgdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSA5LjA6CiAgICAgICAgICAgIHJldHVybiAoJzcuMCcsICc2LjEnLCAnNi4wYScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA9PSAxMC4wOgogICAgICAgICAgICByZXR1cm4gKCc3LjEnLCAnNy4wYScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA9PSAxMS4wOgogICAgICAgICAgICByZXR1cm4gKCc4LjAnLCAnOC4wYScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA9PSAxMi4wOgogICAgICAgICAgICByZXR1cm4gKCc4LjEnLCAnOC4xYScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICByZXR1cm4gKCcxMC4wJywgJzguMScpCgogICAgQHByb3BlcnR5CiAgICBkZWYgV2luZG93c1Nka0xhc3RWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBsYXN0IHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdXNlX2xhc3RfZGlyX25hbWUob3MucGF0aC5qb2luKAogICAgICAgICAgICBzZWxmLldpbmRvd3NTZGtEaXIsICdsaWInKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU2RrRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgc2RrZGlyID0gJycKICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgICMgVHJ5IHRvIGdldCBpdCBmcm9tIHJlZ2lzdHJ5CiAgICAgICAgICAgIGxvYyA9IG9zLnBhdGguam9pbihzZWxmLnJpLndpbmRvd3Nfc2RrLCAndiVzJyAlIHZlcikKICAgICAgICAgICAgc2RrZGlyID0gc2VsZi5yaS5sb29rdXAobG9jLCAnaW5zdGFsbGF0aW9uZm9sZGVyJykKICAgICAgICAgICAgaWYgc2RrZGlyOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBub3Qgc2RrZGlyIG9yIG5vdCBvcy5wYXRoLmlzZGlyKHNka2Rpcik6CiAgICAgICAgICAgICMgVHJ5IHRvIGdldCAiVkMrKyBmb3IgUHl0aG9uIiB2ZXJzaW9uIGZyb20gcmVnaXN0cnkKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnJpLnZjX2Zvcl9weXRob24sICclMC4xZicgJSBzZWxmLnZjX3ZlcikKICAgICAgICAgICAgaW5zdGFsbF9iYXNlID0gc2VsZi5yaS5sb29rdXAocGF0aCwgJ2luc3RhbGxkaXInKQogICAgICAgICAgICBpZiBpbnN0YWxsX2Jhc2U6CiAgICAgICAgICAgICAgICBzZGtkaXIgPSBvcy5wYXRoLmpvaW4oaW5zdGFsbF9iYXNlLCAnV2luU0RLJykKICAgICAgICBpZiBub3Qgc2RrZGlyIG9yIG5vdCBvcy5wYXRoLmlzZGlyKHNka2Rpcik6CiAgICAgICAgICAgICMgSWYgZmFpbCwgdXNlIGRlZmF1bHQgbmV3IHBhdGgKICAgICAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICAgICAgaW50dmVyID0gdmVyWzp2ZXIucmZpbmQoJy4nKV0KICAgICAgICAgICAgICAgIHBhdGggPSByJ01pY3Jvc29mdCBTREtzXFdpbmRvd3MgS2l0c1wlcycgJSAoaW50dmVyKQogICAgICAgICAgICAgICAgZCA9IG9zLnBhdGguam9pbihzZWxmLlByb2dyYW1GaWxlcywgcGF0aCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZCk6CiAgICAgICAgICAgICAgICAgICAgc2RrZGlyID0gZAogICAgICAgIGlmIG5vdCBzZGtkaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoc2RrZGlyKToKICAgICAgICAgICAgIyBJZiBmYWlsLCB1c2UgZGVmYXVsdCBvbGQgcGF0aAogICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgICAgICBwYXRoID0gcidNaWNyb3NvZnQgU0RLc1xXaW5kb3dzXHYlcycgJSB2ZXIKICAgICAgICAgICAgICAgIGQgPSBvcy5wYXRoLmpvaW4oc2VsZi5Qcm9ncmFtRmlsZXMsIHBhdGgpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGQpOgogICAgICAgICAgICAgICAgICAgIHNka2RpciA9IGQKICAgICAgICBpZiBub3Qgc2RrZGlyOgogICAgICAgICAgICAjIElmIGZhaWwsIHVzZSBQbGF0Zm9ybSBTREsKICAgICAgICAgICAgc2RrZGlyID0gb3MucGF0aC5qb2luKHNlbGYuVkNJbnN0YWxsRGlyLCAnUGxhdGZvcm1TREsnKQogICAgICAgIHJldHVybiBzZGtkaXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU0RLRXhlY3V0YWJsZVBhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIGV4ZWN1dGFibGUgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgICMgRmluZCBXaW5TREsgTmV0RnggVG9vbHMgcmVnaXN0cnkgZGlyIG5hbWUKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSAxMS4wOgogICAgICAgICAgICBuZXRmeHZlciA9IDM1CiAgICAgICAgICAgIGFyY2ggPSAnJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ldGZ4dmVyID0gNDAKICAgICAgICAgICAgaGlkZXg4NiA9IFRydWUgaWYgc2VsZi52Y192ZXIgPD0gMTIuMCBlbHNlIEZhbHNlCiAgICAgICAgICAgIGFyY2ggPSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlLCBoaWRleDg2PWhpZGV4ODYpCiAgICAgICAgZnggPSAnV2luU0RLLU5ldEZ4JWRUb29scyVzJyAlIChuZXRmeHZlciwgYXJjaC5yZXBsYWNlKCdcXCcsICctJykpCgogICAgICAgICMgbGlzdGUgYWxsIHBvc3NpYmxlcyByZWdpc3RyeSBwYXRocwogICAgICAgIHJlZ3BhdGhzID0gW10KICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYuTmV0RnhTZGtWZXJzaW9uOgogICAgICAgICAgICAgICAgcmVncGF0aHMgKz0gW29zLnBhdGguam9pbihzZWxmLnJpLm5ldGZ4X3NkaywgdmVyLCBmeCldCgogICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgcmVncGF0aHMgKz0gW29zLnBhdGguam9pbihzZWxmLnJpLndpbmRvd3Nfc2RrLCAndiVzQScgJSB2ZXIsIGZ4KV0KCiAgICAgICAgIyBSZXR1cm4gaW5zdGFsbGF0aW9uIGZvbGRlciBmcm9tIHRoZSBtb3JlIHJlY2VudCBwYXRoCiAgICAgICAgZm9yIHBhdGggaW4gcmVncGF0aHM6CiAgICAgICAgICAgIGV4ZWNwYXRoID0gc2VsZi5yaS5sb29rdXAocGF0aCwgJ2luc3RhbGxhdGlvbmZvbGRlcicpCiAgICAgICAgICAgIGlmIGV4ZWNwYXRoOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gZXhlY3BhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGU2hhcnBJbnN0YWxsRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgRiMgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIHBhdGggPSByJyUwLjFmXFNldHVwXEYjJyAlIHNlbGYudmNfdmVyCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnJpLnZpc3VhbHN0dWRpbywgcGF0aCkKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAocGF0aCwgJ3Byb2R1Y3RkaXInKSBvciAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVuaXZlcnNhbENSVFNka0RpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIENSVCBTREsgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgICMgU2V0IEtpdCBSb290cyB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgdmVycyA9ICgnMTAnLCAnODEnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZlcnMgPSAoKQoKICAgICAgICAjIEZpbmQgcGF0aCBvZiB0aGUgbW9yZSByZWNlbnQgS2l0CiAgICAgICAgZm9yIHZlciBpbiB2ZXJzOgogICAgICAgICAgICBzZGtkaXIgPSBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLndpbmRvd3Nfa2l0c19yb290cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tpdHNyb290JXMnICUgdmVyKQogICAgICAgICAgICBpZiBzZGtkaXI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBzZGtkaXIgb3IgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBVbml2ZXJzYWxDUlRTZGtMYXN0VmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgbGFzdCB2ZXJzaW9uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3VzZV9sYXN0X2Rpcl9uYW1lKG9zLnBhdGguam9pbigKICAgICAgICAgICAgc2VsZi5Vbml2ZXJzYWxDUlRTZGtEaXIsICdsaWInKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNka1ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFNESyB2ZXJzaW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIFNldCBGeFNkayB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgcmV0dXJuICgnNC42LjEnLCAnNC42JykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNka0RpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgU0RLIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICBmb3IgdmVyIGluIHNlbGYuTmV0RnhTZGtWZXJzaW9uOgogICAgICAgICAgICBsb2MgPSBvcy5wYXRoLmpvaW4oc2VsZi5yaS5uZXRmeF9zZGssIHZlcikKICAgICAgICAgICAgc2RrZGlyID0gc2VsZi5yaS5sb29rdXAobG9jLCAna2l0c2luc3RhbGxhdGlvbmZvbGRlcicpCiAgICAgICAgICAgIGlmIHNka2RpcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHNka2RpciBvciAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya0RpcjMyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayAzMmJpdCBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBEZWZhdWx0IHBhdGgKICAgICAgICBndWVzc19mdyA9IG9zLnBhdGguam9pbihzZWxmLldpbkRpciwgcidNaWNyb3NvZnQuTkVUXEZyYW1ld29yaycpCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnZnJhbWV3b3JrZGlyMzInKSBvciBndWVzc19mdwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya0RpcjY0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayA2NGJpdCBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBEZWZhdWx0IHBhdGgKICAgICAgICBndWVzc19mdyA9IG9zLnBhdGguam9pbihzZWxmLldpbkRpciwgcidNaWNyb3NvZnQuTkVUXEZyYW1ld29yazY0JykKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICdmcmFtZXdvcmtkaXI2NCcpIG9yIGd1ZXNzX2Z3CgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrVmVyc2lvbjMyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayAzMmJpdCB2ZXJzaW9ucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9kb3RfbmV0X3ZlcnNpb25zKDMyKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya1ZlcnNpb242NChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgNjRiaXQgdmVyc2lvbnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfZG90X25ldF92ZXJzaW9ucyg2NCkKCiAgICBkZWYgX2ZpbmRfZG90X25ldF92ZXJzaW9ucyhzZWxmLCBiaXRzKToKICAgICAgICAiIiIKICAgICAgICBGaW5kIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayB2ZXJzaW9ucy4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBiaXRzOiBpbnQKICAgICAgICAgICAgUGxhdGZvcm0gbnVtYmVyIG9mIGJpdHM6IDMyIG9yIDY0LgogICAgICAgICIiIgogICAgICAgICMgRmluZCBhY3R1YWwgLk5FVCB2ZXJzaW9uIGluIHJlZ2lzdHJ5CiAgICAgICAgcmVnX3ZlciA9IHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICdmcmFtZXdvcmt2ZXIlZCcgJSBiaXRzKQogICAgICAgIGRvdF9uZXRfZGlyID0gZ2V0YXR0cihzZWxmLCAnRnJhbWV3b3JrRGlyJWQnICUgYml0cykKICAgICAgICB2ZXIgPSByZWdfdmVyIG9yIHNlbGYuX3VzZV9sYXN0X2Rpcl9uYW1lKGRvdF9uZXRfZGlyLCAndicpIG9yICcnCgogICAgICAgICMgU2V0IC5ORVQgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBNU1ZDKysgdmVyc2lvbgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDEyLjA6CiAgICAgICAgICAgIGZyYW1ld29ya3ZlciA9ICh2ZXIsICd2NC4wJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID49IDEwLjA6CiAgICAgICAgICAgIGZyYW1ld29ya3ZlciA9ICgndjQuMC4zMDMxOScgaWYgdmVyLmxvd2VyKClbOjJdICE9ICd2NCcgZWxzZSB2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndjMuNScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA9PSA5LjA6CiAgICAgICAgICAgIGZyYW1ld29ya3ZlciA9ICgndjMuNScsICd2Mi4wLjUwNzI3JykKICAgICAgICBpZiBzZWxmLnZjX3ZlciA9PSA4LjA6CiAgICAgICAgICAgIGZyYW1ld29ya3ZlciA9ICgndjMuMCcsICd2Mi4wLjUwNzI3JykKICAgICAgICByZXR1cm4gZnJhbWV3b3JrdmVyCgogICAgZGVmIF91c2VfbGFzdF9kaXJfbmFtZShzZWxmLCBwYXRoLCBwcmVmaXg9JycpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBuYW1lIG9mIHRoZSBsYXN0IGRpciBpbiBwYXRoIG9yICcnIGlmIG5vIGRpciBmb3VuZC4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBwYXRoOiBzdHIKICAgICAgICAgICAgVXNlIGRpcnMgaW4gdGhpcyBwYXRoCiAgICAgICAgcHJlZml4OiBzdHIKICAgICAgICAgICAgVXNlIG9ubHkgZGlycyBzdGFydGluZ3MgYnkgdGhpcyBwcmVmaXgKICAgICAgICAiIiIKICAgICAgICBtYXRjaGluZ19kaXJzID0gKAogICAgICAgICAgICBkaXJfbmFtZQogICAgICAgICAgICBmb3IgZGlyX25hbWUgaW4gcmV2ZXJzZWQob3MubGlzdGRpcihwYXRoKSkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4ocGF0aCwgZGlyX25hbWUpKSBhbmQKICAgICAgICAgICAgZGlyX25hbWUuc3RhcnRzd2l0aChwcmVmaXgpCiAgICAgICAgKQogICAgICAgIHJldHVybiBuZXh0KG1hdGNoaW5nX2RpcnMsIE5vbmUpIG9yICcnCgoKY2xhc3MgRW52aXJvbm1lbnRJbmZvOgogICAgIiIiCiAgICBSZXR1cm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBzcGVjaWZpZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbgogICAgYW5kIHBsYXRmb3JtIDogTGliLCBJbmNsdWRlLCBQYXRoIGFuZCBsaWJwYXRoLgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgY29tcGF0aWJsZSB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMCB0byAxNC4wLgoKICAgIFNjcmlwdCBjcmVhdGVkIGJ5IGFuYWx5c2luZyBNaWNyb3NvZnQgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBmaWxlcyBsaWtlCiAgICAidmN2YXJzWy4uLl0uYmF0IiwgIlNldEVudi5DbWQiLCAidmNidWlsZHRvb2xzLmJhdCIsIC4uLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGFyY2g6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCiAgICB2Y192ZXI6IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4gSWYgbm90IHNldCwgYXV0b2RldGVjdCB0aGUgbGFzdAogICAgICAgIHZlcnNpb24uCiAgICB2Y19taW5fdmVyOiBmbG9hdAogICAgICAgIE1pbmltdW0gTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KICAgICIiIgoKICAgICMgVmFyaWFibGVzIGFuZCBwcm9wZXJ0aWVzIGluIHRoaXMgY2xhc3MgdXNlIG9yaWdpbmFscyBDYW1lbENhc2UgdmFyaWFibGVzCiAgICAjIG5hbWVzIGZyb20gTWljcm9zb2Z0IHNvdXJjZSBmaWxlcyBmb3IgbW9yZSBlYXN5IGNvbXBhcmFpc29uLgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmNoLCB2Y192ZXI9Tm9uZSwgdmNfbWluX3Zlcj0wKToKICAgICAgICBzZWxmLnBpID0gUGxhdGZvcm1JbmZvKGFyY2gpCiAgICAgICAgc2VsZi5yaSA9IFJlZ2lzdHJ5SW5mbyhzZWxmLnBpKQogICAgICAgIHNlbGYuc2kgPSBTeXN0ZW1JbmZvKHNlbGYucmksIHZjX3ZlcikKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCB2Y19taW5fdmVyOgogICAgICAgICAgICBlcnIgPSAnTm8gc3VpdGFibGUgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbiBmb3VuZCcKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKGVycikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2Y192ZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5zaS52Y192ZXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWU1Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFRvb2xzCiAgICAgICAgIiIiCiAgICAgICAgcGF0aHMgPSBbcidDb21tb243XElERScsIHInQ29tbW9uN1xUb29scyddCgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUsIHg2ND1UcnVlKQogICAgICAgICAgICBwYXRocyArPSBbcidDb21tb243XElERVxDb21tb25FeHRlbnNpb25zXE1pY3Jvc29mdFxUZXN0V2luZG93J10KICAgICAgICAgICAgcGF0aHMgKz0gW3InVGVhbSBUb29sc1xQZXJmb3JtYW5jZSBUb29scyddCiAgICAgICAgICAgIHBhdGhzICs9IFtyJ1RlYW0gVG9vbHNcUGVyZm9ybWFuY2UgVG9vbHMlcycgJSBhcmNoX3N1YmRpcl0KCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5WU0luc3RhbGxEaXIsIHBhdGgpIGZvciBwYXRoIGluIHBhdGhzXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgJiBNaWNyb3NvZnQgRm91bmRhdGlvbiBDbGFzcyBJbmNsdWRlcwogICAgICAgICIiIgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCAnSW5jbHVkZScpLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCByJ0FUTE1GQ1xJbmNsdWRlJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgJiBNaWNyb3NvZnQgRm91bmRhdGlvbiBDbGFzcyBMaWJyYXJpZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNS4wOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2RpcihoaWRleDg2PVRydWUpCiAgICAgICAgcGF0aHMgPSBbJ0xpYiVzJyAlIGFyY2hfc3ViZGlyLCByJ0FUTE1GQ1xMaWIlcycgJSBhcmNoX3N1YmRpcl0KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgcGF0aHMgKz0gW3InTGliXHN0b3JlJXMnICUgYXJjaF9zdWJkaXJdCgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCBwYXRoKSBmb3IgcGF0aCBpbiBwYXRoc10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ1N0b3JlUmVmcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBzdG9yZSByZWZlcmVuY2VzIExpYnJhcmllcwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTQuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsIHInTGliXHN0b3JlXHJlZmVyZW5jZXMnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ1Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIFRvb2xzCiAgICAgICAgIiIiCiAgICAgICAgc2kgPSBzZWxmLnNpCiAgICAgICAgdG9vbHMgPSBbb3MucGF0aC5qb2luKHNpLlZDSW5zdGFsbERpciwgJ1ZDUGFja2FnZXMnKV0KCiAgICAgICAgZm9yY2V4ODYgPSBUcnVlIGlmIHNlbGYudmNfdmVyIDw9IDEwLjAgZWxzZSBGYWxzZQogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jcm9zc19kaXIoZm9yY2V4ODYpCiAgICAgICAgaWYgYXJjaF9zdWJkaXI6CiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuVkNJbnN0YWxsRGlyLCAnQmluJXMnICUgYXJjaF9zdWJkaXIpXQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA9PSAxNC4wOgogICAgICAgICAgICBwYXRoID0gJ0JpbiVzJyAlIHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlKQogICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKHNpLlZDSW5zdGFsbERpciwgcGF0aCldCgogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgaG9zdF9kaXIgPSAocidiaW5cSG9zdFg4NiVzJyBpZiBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCkgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByJ2JpblxIb3N0WDY0JXMnKQogICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgc2kuVkNJbnN0YWxsRGlyLCBob3N0X2RpciAlIHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkpXQoKICAgICAgICAgICAgaWYgc2VsZi5waS5jdXJyZW50X2NwdSAhPSBzZWxmLnBpLnRhcmdldF9jcHU6CiAgICAgICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIHNpLlZDSW5zdGFsbERpciwgaG9zdF9kaXIgJSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlKSldCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuVkNJbnN0YWxsRGlyLCAnQmluJyldCgogICAgICAgIHJldHVybiB0b29scwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE9TTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBMaWJyYXJpZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSAxMC4wOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2RpcihoaWRleDg2PVRydWUsIHg2ND1UcnVlKQogICAgICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdMaWIlcycgJSBhcmNoX3N1YmRpcildCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgICAgICBsaWIgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnbGliJykKICAgICAgICAgICAgbGlidmVyID0gc2VsZi5fc2RrX3N1YmRpcgogICAgICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihsaWIsICclc3VtJXMnICUgKGxpYnZlciAsIGFyY2hfc3ViZGlyKSldCgogICAgQHByb3BlcnR5CiAgICBkZWYgT1NJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgSW5jbHVkZQogICAgICAgICIiIgogICAgICAgIGluY2x1ZGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnaW5jbHVkZScpCgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDEwLjA6CiAgICAgICAgICAgIHJldHVybiBbaW5jbHVkZSwgb3MucGF0aC5qb2luKGluY2x1ZGUsICdnbCcpXQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICAgICAgc2RrdmVyID0gc2VsZi5fc2RrX3N1YmRpcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2RrdmVyID0gJycKICAgICAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJyVzc2hhcmVkJyAlIHNka3ZlciksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGluY2x1ZGUsICclc3VtJyAlIHNka3ZlciksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGluY2x1ZGUsICclc3dpbnJ0JyAlIHNka3ZlcildCgogICAgQHByb3BlcnR5CiAgICBkZWYgT1NMaWJwYXRoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBMaWJyYXJpZXMgUGF0aHMKICAgICAgICAiIiIKICAgICAgICByZWYgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnUmVmZXJlbmNlcycpCiAgICAgICAgbGlicGF0aCA9IFtdCgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDkuMDoKICAgICAgICAgICAgbGlicGF0aCArPSBzZWxmLk9TTGlicmFyaWVzCgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDExLjA6CiAgICAgICAgICAgIGxpYnBhdGggKz0gW29zLnBhdGguam9pbihyZWYsIHInQ29tbW9uQ29uZmlndXJhdGlvblxOZXV0cmFsJyldCgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIGxpYnBhdGggKz0gWwogICAgICAgICAgICAgICAgcmVmLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ1VuaW9uTWV0YWRhdGEnKSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICByZWYsCiAgICAgICAgICAgICAgICAgICAgJ1dpbmRvd3MuRm91bmRhdGlvbi5Vbml2ZXJzYWxBcGlDb250cmFjdCcsCiAgICAgICAgICAgICAgICAgICAgJzEuMC4wLjAnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICByZWYsCiAgICAgICAgICAgICAgICAgICAgJ1dpbmRvd3MuRm91bmRhdGlvbi5Gb3VuZGF0aW9uQ29udHJhY3QnLAogICAgICAgICAgICAgICAgICAgICcxLjAuMC4wJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgcmVmLAogICAgICAgICAgICAgICAgICAgICdXaW5kb3dzLk5ldHdvcmtpbmcuQ29ubmVjdGl2aXR5Lld3YW5Db250cmFjdCcsCiAgICAgICAgICAgICAgICAgICAgJzEuMC4wLjAnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICBzZWxmLnNpLldpbmRvd3NTZGtEaXIsCiAgICAgICAgICAgICAgICAgICAgJ0V4dGVuc2lvblNES3MnLAogICAgICAgICAgICAgICAgICAgICdNaWNyb3NvZnQuVkNMaWJzJywKICAgICAgICAgICAgICAgICAgICAnJTAuMWYnICUgc2VsZi52Y192ZXIsCiAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICdDb21tb25Db25maWd1cmF0aW9uJywKICAgICAgICAgICAgICAgICAgICAnbmV1dHJhbCcsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICBdCiAgICAgICAgcmV0dXJuIGxpYnBhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBTZGtUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgVG9vbHMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9zZGtfdG9vbHMoKSkKCiAgICBkZWYgX3Nka190b29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgVG9vbHMgcGF0aHMgZ2VuZXJhdG9yCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNS4wOgogICAgICAgICAgICBiaW5fZGlyID0gJ0JpbicgaWYgc2VsZi52Y192ZXIgPD0gMTEuMCBlbHNlIHInQmluXHg4NicKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgYmluX2RpcikKCiAgICAgICAgaWYgbm90IHNlbGYucGkuY3VycmVudF9pc194ODYoKToKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlKQogICAgICAgICAgICBwYXRoID0gJ0JpbiVzJyAlIGFyY2hfc3ViZGlyCiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsIHBhdGgpCgogICAgICAgIGlmIHNlbGYudmNfdmVyID09IDEwLjAgb3Igc2VsZi52Y192ZXIgPT0gMTEuMDoKICAgICAgICAgICAgaWYgc2VsZi5waS50YXJnZXRfaXNfeDg2KCk6CiAgICAgICAgICAgICAgICBhcmNoX3N1YmRpciA9ICcnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlLCB4NjQ9VHJ1ZSkKICAgICAgICAgICAgcGF0aCA9IHInQmluXE5FVEZYIDQuMCBUb29scyVzJyAlIGFyY2hfc3ViZGlyCiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsIHBhdGgpCgogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdCaW4nKQogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUpCiAgICAgICAgICAgIHNka3ZlciA9IHNlbGYuc2kuV2luZG93c1Nka0xhc3RWZXJzaW9uCiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihwYXRoLCAnJXMlcycgJSAoc2RrdmVyLCBhcmNoX3N1YmRpcikpCgogICAgICAgIGlmIHNlbGYuc2kuV2luZG93c1NES0V4ZWN1dGFibGVQYXRoOgogICAgICAgICAgICB5aWVsZCBzZWxmLnNpLldpbmRvd3NTREtFeGVjdXRhYmxlUGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9zZGtfc3ViZGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyB2ZXJzaW9uIHN1YmRpcgogICAgICAgICIiIgogICAgICAgIHVjcnR2ZXIgPSBzZWxmLnNpLldpbmRvd3NTZGtMYXN0VmVyc2lvbgogICAgICAgIHJldHVybiAoJyVzXFwnICUgdWNydHZlcikgaWYgdWNydHZlciBlbHNlICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgU2RrU2V0dXAoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIFNldHVwCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPiA5LjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdTZXR1cCcpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZ4VG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFRvb2xzCiAgICAgICAgIiIiCiAgICAgICAgcGkgPSBzZWxmLnBpCiAgICAgICAgc2kgPSBzZWxmLnNpCgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDEwLjA6CiAgICAgICAgICAgIGluY2x1ZGUzMiA9IFRydWUKICAgICAgICAgICAgaW5jbHVkZTY0ID0gbm90IHBpLnRhcmdldF9pc194ODYoKSBhbmQgbm90IHBpLmN1cnJlbnRfaXNfeDg2KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbmNsdWRlMzIgPSBwaS50YXJnZXRfaXNfeDg2KCkgb3IgcGkuY3VycmVudF9pc194ODYoKQogICAgICAgICAgICBpbmNsdWRlNjQgPSBwaS5jdXJyZW50X2NwdSA9PSAnYW1kNjQnIG9yIHBpLnRhcmdldF9jcHUgPT0gJ2FtZDY0JwoKICAgICAgICB0b29scyA9IFtdCiAgICAgICAgaWYgaW5jbHVkZTMyOgogICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKHNpLkZyYW1ld29ya0RpcjMyLCB2ZXIpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgdmVyIGluIHNpLkZyYW1ld29ya1ZlcnNpb24zMl0KICAgICAgICBpZiBpbmNsdWRlNjQ6CiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuRnJhbWV3b3JrRGlyNjQsIHZlcikKICAgICAgICAgICAgICAgICAgICAgIGZvciB2ZXIgaW4gc2kuRnJhbWV3b3JrVmVyc2lvbjY0XQogICAgICAgIHJldHVybiB0b29scwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U0RLTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTmV0IEZyYW1ld29yayBTREsgTGlicmFyaWVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNC4wIG9yIG5vdCBzZWxmLnNpLk5ldEZ4U2RrRGlyOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5OZXRGeFNka0RpciwgcidsaWJcdW0lcycgJSBhcmNoX3N1YmRpcildCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTREtJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5ldCBGcmFtZXdvcmsgU0RLIEluY2x1ZGVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNC4wIG9yIG5vdCBzZWxmLnNpLk5ldEZ4U2RrRGlyOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5OZXRGeFNka0RpciwgcidpbmNsdWRlXHVtJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVnNURGIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gVGVhbSBTeXN0ZW0gRGF0YWJhc2UKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLlZTSW5zdGFsbERpciwgcidWU1RTREJcRGVwbG95JyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgTVNCdWlsZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgQnVpbGQgRW5naW5lCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxMi4wOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBlbGlmIHNlbGYudmNfdmVyIDwgMTUuMDoKICAgICAgICAgICAgYmFzZV9wYXRoID0gc2VsZi5zaS5Qcm9ncmFtRmlsZXN4ODYKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBiYXNlX3BhdGggPSBzZWxmLnNpLlZTSW5zdGFsbERpcgogICAgICAgICAgICBhcmNoX3N1YmRpciA9ICcnCgogICAgICAgIHBhdGggPSByJ01TQnVpbGRcJTAuMWZcYmluJXMnICUgKHNlbGYudmNfdmVyLCBhcmNoX3N1YmRpcikKICAgICAgICBidWlsZCA9IFtvcy5wYXRoLmpvaW4oYmFzZV9wYXRoLCBwYXRoKV0KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgIyBBZGQgUm9zbHluIEMjICYgVmlzdWFsIEJhc2ljIENvbXBpbGVyCiAgICAgICAgICAgIGJ1aWxkICs9IFtvcy5wYXRoLmpvaW4oYmFzZV9wYXRoLCBwYXRoLCAnUm9zbHluJyldCgogICAgICAgIHJldHVybiBidWlsZAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEhUTUxIZWxwV29ya3Nob3Aoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IEhUTUwgSGVscCBXb3Jrc2hvcAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTEuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuUHJvZ3JhbUZpbGVzeDg2LCAnSFRNTCBIZWxwIFdvcmtzaG9wJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVUNSVExpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgTGlicmFyaWVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNC4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgbGliID0gb3MucGF0aC5qb2luKHNlbGYuc2kuVW5pdmVyc2FsQ1JUU2RrRGlyLCAnbGliJykKICAgICAgICB1Y3J0dmVyID0gc2VsZi5fdWNydF9zdWJkaXIKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihsaWIsICclc3VjcnQlcycgJSAodWNydHZlciwgYXJjaF9zdWJkaXIpKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBVQ1JUSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIEluY2x1ZGUKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE0LjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBpbmNsdWRlID0gb3MucGF0aC5qb2luKHNlbGYuc2kuVW5pdmVyc2FsQ1JUU2RrRGlyLCAnaW5jbHVkZScpCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJyVzdWNydCcgJSBzZWxmLl91Y3J0X3N1YmRpcildCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3VjcnRfc3ViZGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyB2ZXJzaW9uIHN1YmRpcgogICAgICAgICIiIgogICAgICAgIHVjcnR2ZXIgPSBzZWxmLnNpLlVuaXZlcnNhbENSVFNka0xhc3RWZXJzaW9uCiAgICAgICAgcmV0dXJuICgnJXNcXCcgJSB1Y3J0dmVyKSBpZiB1Y3J0dmVyIGVsc2UgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGU2hhcnAoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBGIwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTEuMCBhbmQgc2VsZi52Y192ZXIgPiAxMi4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIHNlbGYuc2kuRlNoYXJwSW5zdGFsbERpcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDUnVudGltZVJlZGlzdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBydW50aW1lIHJlZGlzdHJpYnVhYmxlIGRsbAogICAgICAgICIiIgogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTU6CiAgICAgICAgICAgIHJlZGlzdF9wYXRoID0gc2VsZi5zaS5WQ0luc3RhbGxEaXIKICAgICAgICAgICAgdmNydW50aW1lID0gJ3JlZGlzdCVzXFxNaWNyb3NvZnQuVkMlZDAuQ1JUXFx2Y3J1bnRpbWUlZDAuZGxsJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlZGlzdF9wYXRoID0gc2VsZi5zaS5WQ0luc3RhbGxEaXIucmVwbGFjZSgnXFxUb29scycsICdcXFJlZGlzdCcpCiAgICAgICAgICAgIHZjcnVudGltZSA9ICdvbmVjb3JlJXNcXE1pY3Jvc29mdC5WQyVkMC5DUlRcXHZjcnVudGltZSVkMC5kbGwnCgogICAgICAgICMgVmlzdWFsIFN0dWRpbyAyMDE3ICBpcyBzdGlsbCBWaXN1YWwgQysrIDE0LjAKICAgICAgICBkbGxfdmVyID0gMTQuMCBpZiBzZWxmLnZjX3ZlciA9PSAxNSBlbHNlIHNlbGYudmNfdmVyCgogICAgICAgIHZjcnVudGltZSA9IHZjcnVudGltZSAlIChhcmNoX3N1YmRpciwgc2VsZi52Y192ZXIsIGRsbF92ZXIpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihyZWRpc3RfcGF0aCwgdmNydW50aW1lKQoKICAgIGRlZiByZXR1cm5fZW52KHNlbGYsIGV4aXN0cz1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gZW52aXJvbm1lbnQgZGljdC4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBleGlzdHM6IGJvb2wKICAgICAgICAgICAgSXQgVHJ1ZSwgb25seSByZXR1cm4gZXhpc3RpbmcgcGF0aHMuCiAgICAgICAgIiIiCiAgICAgICAgZW52ID0gZGljdCgKICAgICAgICAgICAgaW5jbHVkZT1zZWxmLl9idWlsZF9wYXRocygnaW5jbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNJbmNsdWRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5PU0luY2x1ZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlVDUlRJbmNsdWRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5OZXRGeFNES0luY2x1ZGVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICAgICBsaWI9c2VsZi5fYnVpbGRfcGF0aHMoJ2xpYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ0xpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk9TTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRnhUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlVDUlRMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5OZXRGeFNES0xpYnJhcmllc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICAgICBsaWJwYXRoPXNlbGYuX2J1aWxkX3BhdGhzKCdsaWJwYXRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ0xpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GeFRvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlZDU3RvcmVSZWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk9TTGlicGF0aF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICAgICAgcGF0aD1zZWxmLl9idWlsZF9wYXRocygncGF0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5WU1Rvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlZzVERiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlNka1Rvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlNka1NldHVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZ4VG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTVNCdWlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5IVE1MSGVscFdvcmtzaG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZTaGFycF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICApCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQgYW5kIG9zLnBhdGguaXNmaWxlKHNlbGYuVkNSdW50aW1lUmVkaXN0KToKICAgICAgICAgICAgZW52WydweV92Y3J1bnRpbWVfcmVkaXN0J10gPSBzZWxmLlZDUnVudGltZVJlZGlzdAogICAgICAgIHJldHVybiBlbnYKCiAgICBkZWYgX2J1aWxkX3BhdGhzKHNlbGYsIG5hbWUsIHNwZWNfcGF0aF9saXN0cywgZXhpc3RzKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGFuZCBzcGVjaWZpZWQgcGF0aHMsCiAgICAgICAgcmV0dXJuIGEgcGF0aHNlcC1zZXBhcmF0ZWQgc3RyaW5nIG9mIHBhdGhzIGNvbnRhaW5pbmcKICAgICAgICB1bmlxdWUsIGV4dGFudCwgZGlyZWN0b3JpZXMgZnJvbSB0aG9zZSBwYXRocyBhbmQgZnJvbQogICAgICAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gUmFpc2UgYW4gZXJyb3IgaWYgbm8gcGF0aHMKICAgICAgICBhcmUgcmVzb2x2ZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBmbGF0dGVuIHNwZWNfcGF0aF9saXN0cwogICAgICAgIHNwZWNfcGF0aHMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShzcGVjX3BhdGhfbGlzdHMpCiAgICAgICAgZW52X3BhdGhzID0gc2FmZV9lbnYuZ2V0KG5hbWUsICcnKS5zcGxpdChvcy5wYXRoc2VwKQogICAgICAgIHBhdGhzID0gaXRlcnRvb2xzLmNoYWluKHNwZWNfcGF0aHMsIGVudl9wYXRocykKICAgICAgICBleHRhbnRfcGF0aHMgPSBsaXN0KGZpbHRlcihvcy5wYXRoLmlzZGlyLCBwYXRocykpIGlmIGV4aXN0cyBlbHNlIHBhdGhzCiAgICAgICAgaWYgbm90IGV4dGFudF9wYXRoczoKICAgICAgICAgICAgbXNnID0gIiVzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGVtcHR5IiAlIG5hbWUudXBwZXIoKQogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXNnKQogICAgICAgIHVuaXF1ZV9wYXRocyA9IHNlbGYuX3VuaXF1ZV9ldmVyc2VlbihleHRhbnRfcGF0aHMpCiAgICAgICAgcmV0dXJuIG9zLnBhdGhzZXAuam9pbih1bmlxdWVfcGF0aHMpCgogICAgIyBmcm9tIFB5dGhvbiBkb2NzCiAgICBkZWYgX3VuaXF1ZV9ldmVyc2VlbihzZWxmLCBpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIExpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLgogICAgICAgIFJlbWVtYmVyIGFsbCBlbGVtZW50cyBldmVyIHNlZW4uCgogICAgICAgIF91bmlxdWVfZXZlcnNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpIC0tPiBBIEIgQyBECgogICAgICAgIF91bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECiAgICAgICAgIiIiCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgc2Vlbl9hZGQgPSBzZWVuLmFkZAogICAgICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBmaWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICAgICAgc2Vlbl9hZGQoZWxlbWVudCkKICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKICAgICAgICAgICAgICAgIGsgPSBrZXkoZWxlbWVudCkKICAgICAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2Vlbl9hZGQoaykKICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50ClBLAwQUAAAAAAAAACEAYwvj1n8MAAB/DAAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL25hbWVzcGFjZXMucHlpbXBvcnQgb3MKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgaXRlcnRvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgoKZmxhdHRlbiA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlCgoKY2xhc3MgSW5zdGFsbGVyOgoKICAgIG5zcGtnX2V4dCA9ICctbnNwa2cucHRoJwoKICAgIGRlZiBpbnN0YWxsX25hbWVzcGFjZXMoc2VsZik6CiAgICAgICAgbnNwID0gc2VsZi5fZ2V0X2FsbF9uc19wYWNrYWdlcygpCiAgICAgICAgaWYgbm90IG5zcDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZmlsZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5fZ2V0X3RhcmdldCgpKQogICAgICAgIGZpbGVuYW1lICs9IHNlbGYubnNwa2dfZXh0CiAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyIsIGZpbGVuYW1lKQogICAgICAgIGxpbmVzID0gbWFwKHNlbGYuX2dlbl9uc3BrZ19saW5lLCBuc3ApCgogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgIyBhbHdheXMgZ2VuZXJhdGUgdGhlIGxpbmVzLCBldmVuIGluIGRyeSBydW4KICAgICAgICAgICAgbGlzdChsaW5lcykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3d0JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZWxpbmVzKGxpbmVzKQoKICAgIGRlZiB1bmluc3RhbGxfbmFtZXNwYWNlcyhzZWxmKToKICAgICAgICBmaWxlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzZWxmLl9nZXRfdGFyZ2V0KCkpCiAgICAgICAgZmlsZW5hbWUgKz0gc2VsZi5uc3BrZ19leHQKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCgogICAgZGVmIF9nZXRfdGFyZ2V0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnRhcmdldAoKICAgIF9uc3BrZ190bXBsID0gKAogICAgICAgICJpbXBvcnQgc3lzLCB0eXBlcywgb3MiLAogICAgICAgICJoYXNfbWZzID0gc3lzLnZlcnNpb25faW5mbyA+ICgzLCA1KSIsCiAgICAgICAgInAgPSBvcy5wYXRoLmpvaW4oJShyb290KXMsIColKHB0aClyKSIsCiAgICAgICAgImltcG9ydGxpYiA9IGhhc19tZnMgYW5kIF9faW1wb3J0X18oJ2ltcG9ydGxpYi51dGlsJykiLAogICAgICAgICJoYXNfbWZzIGFuZCBfX2ltcG9ydF9fKCdpbXBvcnRsaWIubWFjaGluZXJ5JykiLAogICAgICAgICJtID0gaGFzX21mcyBhbmQgIgogICAgICAgICAgICAic3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCglKHBrZylyLCAiCiAgICAgICAgICAgICAgICAiaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYygiCiAgICAgICAgICAgICAgICAgICAgImltcG9ydGxpYi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX3NwZWMoJShwa2cpciwgIgogICAgICAgICAgICAgICAgICAgICAgICAiW29zLnBhdGguZGlybmFtZShwKV0pKSkiLAogICAgICAgICJtID0gbSBvciAiCiAgICAgICAgICAgICJzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCUocGtnKXIsIHR5cGVzLk1vZHVsZVR5cGUoJShwa2cpcikpIiwKICAgICAgICAibXAgPSAobSBvciBbXSkgYW5kIG0uX19kaWN0X18uc2V0ZGVmYXVsdCgnX19wYXRoX18nLFtdKSIsCiAgICAgICAgIihwIG5vdCBpbiBtcCkgYW5kIG1wLmFwcGVuZChwKSIsCiAgICApCiAgICAibGluZXMgZm9yIHRoZSBuYW1lc3BhY2UgaW5zdGFsbGVyIgoKICAgIF9uc3BrZ190bXBsX211bHRpID0gKAogICAgICAgICdtIGFuZCBzZXRhdHRyKHN5cy5tb2R1bGVzWyUocGFyZW50KXJdLCAlKGNoaWxkKXIsIG0pJywKICAgICkKICAgICJhZGRpdGlvbmFsIGxpbmUocykgd2hlbiBhIHBhcmVudCBwYWNrYWdlIGlzIGluZGljYXRlZCIKCiAgICBkZWYgX2dldF9yb290KHNlbGYpOgogICAgICAgIHJldHVybiAic3lzLl9nZXRmcmFtZSgxKS5mX2xvY2Fsc1snc2l0ZWRpciddIgoKICAgIGRlZiBfZ2VuX25zcGtnX2xpbmUoc2VsZiwgcGtnKToKICAgICAgICAjIGVuc3VyZSBwa2cgaXMgbm90IGEgdW5pY29kZSBzdHJpbmcgdW5kZXIgUHl0aG9uIDIuNwogICAgICAgIHBrZyA9IHN0cihwa2cpCiAgICAgICAgcHRoID0gdHVwbGUocGtnLnNwbGl0KCcuJykpCiAgICAgICAgcm9vdCA9IHNlbGYuX2dldF9yb290KCkKICAgICAgICB0bXBsX2xpbmVzID0gc2VsZi5fbnNwa2dfdG1wbAogICAgICAgIHBhcmVudCwgc2VwLCBjaGlsZCA9IHBrZy5ycGFydGl0aW9uKCcuJykKICAgICAgICBpZiBwYXJlbnQ6CiAgICAgICAgICAgIHRtcGxfbGluZXMgKz0gc2VsZi5fbnNwa2dfdG1wbF9tdWx0aQogICAgICAgIHJldHVybiAnOycuam9pbih0bXBsX2xpbmVzKSAlIGxvY2FscygpICsgJ1xuJwoKICAgIGRlZiBfZ2V0X2FsbF9uc19wYWNrYWdlcyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gc29ydGVkIGxpc3Qgb2YgYWxsIHBhY2thZ2UgbmFtZXNwYWNlcyIiIgogICAgICAgIHBrZ3MgPSBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgb3IgW10KICAgICAgICByZXR1cm4gc29ydGVkKGZsYXR0ZW4obWFwKHNlbGYuX3BrZ19uYW1lcywgcGtncykpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcGtnX25hbWVzKHBrZyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBuYW1lc3BhY2UgcGFja2FnZSwgeWllbGQgdGhlIGNvbXBvbmVudHMgb2YgdGhhdAogICAgICAgIHBhY2thZ2UuCgogICAgICAgID4+PiBuYW1lcyA9IEluc3RhbGxlci5fcGtnX25hbWVzKCdhLmIuYycpCiAgICAgICAgPj4+IHNldChuYW1lcykgPT0gc2V0KFsnYScsICdhLmInLCAnYS5iLmMnXSkKICAgICAgICBUcnVlCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBwa2cuc3BsaXQoJy4nKQogICAgICAgIHdoaWxlIHBhcnRzOgogICAgICAgICAgICB5aWVsZCAnLicuam9pbihwYXJ0cykKICAgICAgICAgICAgcGFydHMucG9wKCkKCgpjbGFzcyBEZXZlbG9wSW5zdGFsbGVyKEluc3RhbGxlcik6CiAgICBkZWYgX2dldF9yb290KHNlbGYpOgogICAgICAgIHJldHVybiByZXByKHN0cihzZWxmLmVnZ19wYXRoKSkKCiAgICBkZWYgX2dldF90YXJnZXQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2xpbmsKUEsDBBQAAAAAAAAAIQCJsBPOO54AADueAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weSIiIlB5UEkgYW5kIGRpcmVjdCBwYWNrYWdlIGRvd25sb2FkaW5nIiIiCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzb2NrZXQKaW1wb3J0IGJhc2U2NAppbXBvcnQgaGFzaGxpYgppbXBvcnQgaXRlcnRvb2xzCmZyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcwoKdHJ5OgogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHNwbGl0dXNlcgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHVybGxpYjIgaW1wb3J0IHNwbGl0dXNlcgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIsIGh0dHBfY2xpZW50LCBjb25maWdwYXJzZXIsIG1hcAoKaW1wb3J0IHNldHVwdG9vbHMKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICBDSEVDS09VVF9ESVNULCBEaXN0cmlidXRpb24sIEJJTkFSWV9ESVNULCBub3JtYWxpemVfcGF0aCwgU09VUkNFX0RJU1QsCiAgICBFbnZpcm9ubWVudCwgZmluZF9kaXN0cmlidXRpb25zLCBzYWZlX25hbWUsIHNhZmVfdmVyc2lvbiwKICAgIHRvX2ZpbGVuYW1lLCBSZXF1aXJlbWVudCwgREVWRUxPUF9ESVNULCBFR0dfRElTVCwKKQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNzbF9zdXBwb3J0CmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgpmcm9tIGZubWF0Y2ggaW1wb3J0IHRyYW5zbGF0ZQpmcm9tIHNldHVwdG9vbHMucHkyN2NvbXBhdCBpbXBvcnQgZ2V0X2FsbF9oZWFkZXJzCmZyb20gc2V0dXB0b29scy53aGVlbCBpbXBvcnQgV2hlZWwKCkVHR19GUkFHTUVOVCA9IHJlLmNvbXBpbGUocideZWdnPShbLUEtWmEtejAtOV8uKyFdKykkJykKSFJFRiA9IHJlLmNvbXBpbGUoIiIiaHJlZlxccyo9XFxzKlsnIl0/KFteJyI+IF0rKSIiIiwgcmUuSSkKIyB0aGlzIGlzIGhlcmUgdG8gZml4IGVtYWNzJyBjcnVkZHkgYnJva2VuIHN5bnRheCBoaWdobGlnaHRpbmcKUFlQSV9NRDUgPSByZS5jb21waWxlKAogICAgJzxhIGhyZWY9IihbXiIjXSspIj4oW148XSspPC9hPlxuXFxzK1xcKDxhICg/OnRpdGxlPSJNRDUgaGFzaCJcblxccyspJwogICAgJ2hyZWY9IlteP10rXFw/OmFjdGlvbj1zaG93X21kNSZhbXA7ZGlnZXN0PShbMC05YS1mXXszMn0pIj5tZDU8L2E+XFwpJwopClVSTF9TQ0hFTUUgPSByZS5jb21waWxlKCcoWy0rLmEtejAtOV17Mix9KTonLCByZS5JKS5tYXRjaApFWFRFTlNJT05TID0gIi50YXIuZ3ogLnRhci5iejIgLnRhciAuemlwIC50Z3oiLnNwbGl0KCkKCl9fYWxsX18gPSBbCiAgICAnUGFja2FnZUluZGV4JywgJ2Rpc3Ryb3NfZm9yX3VybCcsICdwYXJzZV9iZGlzdF93aW5pbnN0JywKICAgICdpbnRlcnByZXRfZGlzdHJvX25hbWUnLApdCgpfU09DS0VUX1RJTUVPVVQgPSAxNQoKX3RtcGwgPSAic2V0dXB0b29scy97c2V0dXB0b29scy5fX3ZlcnNpb25fX30gUHl0aG9uLXVybGxpYi97cHlfbWFqb3J9Igp1c2VyX2FnZW50ID0gX3RtcGwuZm9ybWF0KHB5X21ham9yPXN5cy52ZXJzaW9uWzozXSwgc2V0dXB0b29scz1zZXR1cHRvb2xzKQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYyk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgIk5vdCBhIFVSTCwgZXhpc3RpbmcgZmlsZSwgb3IgcmVxdWlyZW1lbnQgc3BlYzogJXIiICUgKHNwZWMsKQogICAgICAgICkKCgpkZWYgcGFyc2VfYmRpc3Rfd2luaW5zdChuYW1lKToKICAgICIiIlJldHVybiAoYmFzZSxweXZlcnNpb24pIG9yIChOb25lLE5vbmUpIGZvciBwb3NzaWJsZSAuZXhlIG5hbWUiIiIKCiAgICBsb3dlciA9IG5hbWUubG93ZXIoKQogICAgYmFzZSwgcHlfdmVyLCBwbGF0ID0gTm9uZSwgTm9uZSwgTm9uZQoKICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy53aW4zMi5leGUnKToKICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xMF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4zMicKICAgICAgICBlbGlmIGxvd2VyLnN0YXJ0c3dpdGgoJy53aW4zMi1weScsIC0xNik6CiAgICAgICAgICAgIHB5X3ZlciA9IG5hbWVbLTc6LTRdCiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTZdCiAgICAgICAgICAgIHBsYXQgPSAnd2luMzInCiAgICAgICAgZWxpZiBsb3dlci5lbmRzd2l0aCgnLndpbi1hbWQ2NC5leGUnKToKICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xNF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4tYW1kNjQnCiAgICAgICAgZWxpZiBsb3dlci5zdGFydHN3aXRoKCcud2luLWFtZDY0LXB5JywgLTIwKToKICAgICAgICAgICAgcHlfdmVyID0gbmFtZVstNzotNF0KICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0yMF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4tYW1kNjQnCiAgICByZXR1cm4gYmFzZSwgcHlfdmVyLCBwbGF0CgoKZGVmIGVnZ19pbmZvX2Zvcl91cmwodXJsKToKICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbWV0ZXJzLCBxdWVyeSwgZnJhZ21lbnQgPSBwYXJ0cwogICAgYmFzZSA9IHVybGxpYi5wYXJzZS51bnF1b3RlKHBhdGguc3BsaXQoJy8nKVstMV0pCiAgICBpZiBzZXJ2ZXIgPT0gJ3NvdXJjZWZvcmdlLm5ldCcgYW5kIGJhc2UgPT0gJ2Rvd25sb2FkJzogICMgWFhYIFl1Y2sKICAgICAgICBiYXNlID0gdXJsbGliLnBhcnNlLnVucXVvdGUocGF0aC5zcGxpdCgnLycpWy0yXSkKICAgIGlmICcjJyBpbiBiYXNlOgogICAgICAgIGJhc2UsIGZyYWdtZW50ID0gYmFzZS5zcGxpdCgnIycsIDEpCiAgICByZXR1cm4gYmFzZSwgZnJhZ21lbnQKCgpkZWYgZGlzdHJvc19mb3JfdXJsKHVybCwgbWV0YWRhdGE9Tm9uZSk6CiAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIHRoYXQgbWlnaHQgYmUgZm91bmQgYXQgYSBVUkwiIiIKICAgIGJhc2UsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybCh1cmwpCiAgICBmb3IgZGlzdCBpbiBkaXN0cm9zX2Zvcl9sb2NhdGlvbih1cmwsIGJhc2UsIG1ldGFkYXRhKToKICAgICAgICB5aWVsZCBkaXN0CiAgICBpZiBmcmFnbWVudDoKICAgICAgICBtYXRjaCA9IEVHR19GUkFHTUVOVC5tYXRjaChmcmFnbWVudCkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgICAgICAgICAgdXJsLCBtYXRjaC5ncm91cCgxKSwgbWV0YWRhdGEsIHByZWNlZGVuY2U9Q0hFQ0tPVVRfRElTVAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKCmRlZiBkaXN0cm9zX2Zvcl9sb2NhdGlvbihsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBiYXNlbmFtZSIiIgogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cuemlwJyk6CiAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LTRdICAjIHN0cmlwIHRoZSAuemlwCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmVnZycpIGFuZCAnLScgaW4gYmFzZW5hbWU6CiAgICAgICAgIyBvbmx5IG9uZSwgdW5hbWJpZ3VvdXMgaW50ZXJwcmV0YXRpb24KICAgICAgICByZXR1cm4gW0Rpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpXQogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy53aGwnKSBhbmQgJy0nIGluIGJhc2VuYW1lOgogICAgICAgIHdoZWVsID0gV2hlZWwoYmFzZW5hbWUpCiAgICAgICAgaWYgbm90IHdoZWVsLmlzX2NvbXBhdGlibGUoKToKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgcmV0dXJuIFtEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGxvY2F0aW9uPWxvY2F0aW9uLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9d2hlZWwucHJvamVjdF9uYW1lLAogICAgICAgICAgICB2ZXJzaW9uPXdoZWVsLnZlcnNpb24sCiAgICAgICAgICAgICMgSW5jcmVhc2UgcHJpb3JpdHkgb3ZlciBlZ2dzLgogICAgICAgICAgICBwcmVjZWRlbmNlPUVHR19ESVNUICsgMSwKICAgICAgICApXQogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICB3aW5fYmFzZSwgcHlfdmVyLCBwbGF0Zm9ybSA9IHBhcnNlX2JkaXN0X3dpbmluc3QoYmFzZW5hbWUpCiAgICAgICAgaWYgd2luX2Jhc2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwgd2luX2Jhc2UsIG1ldGFkYXRhLCBweV92ZXIsIEJJTkFSWV9ESVNULCBwbGF0Zm9ybQogICAgICAgICAgICApCiAgICAjIFRyeSBzb3VyY2UgZGlzdHJvIGV4dGVuc2lvbnMgKC56aXAsIC50Z3osIGV0Yy4pCiAgICAjCiAgICBmb3IgZXh0IGluIEVYVEVOU0lPTlM6CiAgICAgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoZXh0KToKICAgICAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LWxlbihleHQpXQogICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpCiAgICByZXR1cm4gW10gICMgbm8gZXh0ZW5zaW9uIG1hdGNoZWQKCgpkZWYgZGlzdHJvc19mb3JfZmlsZW5hbWUoZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgcG9zc2libGUgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBhIGZpbGVuYW1lIiIiCiAgICByZXR1cm4gZGlzdHJvc19mb3JfbG9jYXRpb24oCiAgICAgICAgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEKICAgICkKCgpkZWYgaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgIGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEsIHB5X3ZlcnNpb249Tm9uZSwgcHJlY2VkZW5jZT1TT1VSQ0VfRElTVCwKICAgICAgICBwbGF0Zm9ybT1Ob25lCik6CiAgICAiIiJHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKCiAgICBOb3RlOiBpZiBgbG9jYXRpb25gIGlzIGEgZmlsZXN5c3RlbSBmaWxlbmFtZSwgeW91IHNob3VsZCBjYWxsCiAgICBgYHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoKWBgIG9uIGl0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMKICAgIHJvdXRpbmUhCiAgICAiIiIKICAgICMgR2VuZXJhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb25zIG9mIGEgc291cmNlIGRpc3RybyBuYW1lCiAgICAjIEJlY2F1c2Ugc29tZSBwYWNrYWdlcyBhcmUgYW1iaWd1b3VzIGFzIHRvIG5hbWUvdmVyc2lvbnMgc3BsaXQKICAgICMgZS5nLiAiYWRucy1weXRob24tMS4xLjAiLCAiZWdlbml4LW14LWNvbW1lcmNpYWwiLCBldGMuCiAgICAjIFNvLCB3ZSBnZW5lcmF0ZSBlYWNoIHBvc3NpYmxlIGludGVyZXByZXRhdGlvbiAoZS5nLiAiYWRucywgcHl0aG9uLTEuMS4wIgogICAgIyAiYWRucy1weXRob24sIDEuMS4wIiwgYW5kICJhZG5zLXB5dGhvbi0xLjEuMCwgbm8gdmVyc2lvbiIpLiAgSW4gcHJhY3RpY2UsCiAgICAjIHRoZSBzcHVyaW91cyBpbnRlcnByZXRhdGlvbnMgc2hvdWxkIGJlIGlnbm9yZWQsIGJlY2F1c2UgaW4gdGhlIGV2ZW50CiAgICAjIHRoZXJlJ3MgYWxzbyBhbiAiYWRucyIgcGFja2FnZSwgdGhlIHNwdXJpb3VzICJweXRob24tMS4xLjAiIHZlcnNpb24gd2lsbAogICAgIyBjb21wYXJlIGxvd2VyIHRoYW4gYW55IG51bWVyaWMgdmVyc2lvbiBudW1iZXIsIGFuZCBpcyB0aGVyZWZvcmUgdW5saWtlbHkKICAgICMgdG8gbWF0Y2ggYSByZXF1ZXN0IGZvciBpdC4gIEl0J3Mgc3RpbGwgYSBwb3RlbnRpYWwgcHJvYmxlbSwgdGhvdWdoLCBhbmQKICAgICMgaW4gdGhlIGxvbmcgcnVuIFB5UEkgYW5kIHRoZSBkaXN0dXRpbHMgc2hvdWxkIGdvIGZvciAic2FmZSIgbmFtZXMgYW5kCiAgICAjIHZlcnNpb25zIGluIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIG5hbWVzIChzZGlzdCBhbmQgYmRpc3QpLgoKICAgIHBhcnRzID0gYmFzZW5hbWUuc3BsaXQoJy0nKQogICAgaWYgbm90IHB5X3ZlcnNpb24gYW5kIGFueShyZS5tYXRjaChyJ3B5XGRcLlxkJCcsIHApIGZvciBwIGluIHBhcnRzWzI6XSk6CiAgICAgICAgIyBpdCBpcyBhIGJkaXN0X2R1bWIsIG5vdCBhbiBzZGlzdCAtLSBiYWlsIG91dAogICAgICAgIHJldHVybgoKICAgIGZvciBwIGluIHJhbmdlKDEsIGxlbihwYXJ0cykgKyAxKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgJy0nLmpvaW4ocGFydHNbOnBdKSwgJy0nLmpvaW4ocGFydHNbcDpdKSwKICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwcmVjZWRlbmNlPXByZWNlZGVuY2UsCiAgICAgICAgICAgIHBsYXRmb3JtPXBsYXRmb3JtCiAgICAgICAgKQoKCiMgRnJvbSBQeXRob24gMi43IGRvY3MKZGVmIHVuaXF1ZV9ldmVyc2VlbihpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgIkxpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLiBSZW1lbWJlciBhbGwgZWxlbWVudHMgZXZlciBzZWVuLiIKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRAogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECiAgICBzZWVuID0gc2V0KCkKICAgIHNlZW5fYWRkID0gc2Vlbi5hZGQKICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgIGZvciBlbGVtZW50IGluIHNpeC5tb3Zlcy5maWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICB5aWVsZCBlbGVtZW50CiAgICBlbHNlOgogICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCiAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAoKCmRlZiB1bmlxdWVfdmFsdWVzKGZ1bmMpOgogICAgIiIiCiAgICBXcmFwIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhYmxlIHN1Y2ggdGhhdCB0aGUgcmVzdWx0aW5nIGl0ZXJhYmxlCiAgICBvbmx5IGV2ZXIgeWllbGRzIHVuaXF1ZSBpdGVtcy4KICAgICIiIgoKICAgIEB3cmFwcyhmdW5jKQogICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICByZXR1cm4gdW5pcXVlX2V2ZXJzZWVuKGZ1bmMoKmFyZ3MsICoqa3dhcmdzKSkKCiAgICByZXR1cm4gd3JhcHBlcgoKClJFTCA9IHJlLmNvbXBpbGUociIiIjwoW14+XSpcc3JlbFxzKj1ccypbJyJdPyhbXiciPl0rKVtePl0qKT4iIiIsIHJlLkkpCiMgdGhpcyBsaW5lIGlzIGhlcmUgdG8gZml4IGVtYWNzJyBjcnVkZHkgYnJva2VuIHN5bnRheCBoaWdobGlnaHRpbmcKCgpAdW5pcXVlX3ZhbHVlcwpkZWYgZmluZF9leHRlcm5hbF9saW5rcyh1cmwsIHBhZ2UpOgogICAgIiIiRmluZCByZWw9ImhvbWVwYWdlIiBhbmQgcmVsPSJkb3dubG9hZCIgbGlua3MgaW4gYHBhZ2VgLCB5aWVsZGluZyBVUkxzIiIiCgogICAgZm9yIG1hdGNoIGluIFJFTC5maW5kaXRlcihwYWdlKToKICAgICAgICB0YWcsIHJlbCA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgcmVscyA9IHNldChtYXAoc3RyLnN0cmlwLCByZWwubG93ZXIoKS5zcGxpdCgnLCcpKSkKICAgICAgICBpZiAnaG9tZXBhZ2UnIGluIHJlbHMgb3IgJ2Rvd25sb2FkJyBpbiByZWxzOgogICAgICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcih0YWcpOgogICAgICAgICAgICAgICAgeWllbGQgdXJsbGliLnBhcnNlLnVybGpvaW4odXJsLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKCiAgICBmb3IgdGFnIGluICgiPHRoPkhvbWUgUGFnZSIsICI8dGg+RG93bmxvYWQgVVJMIik6CiAgICAgICAgcG9zID0gcGFnZS5maW5kKHRhZykKICAgICAgICBpZiBwb3MgIT0gLTE6CiAgICAgICAgICAgIG1hdGNoID0gSFJFRi5zZWFyY2gocGFnZSwgcG9zKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHlpZWxkIHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpCgoKY2xhc3MgQ29udGVudENoZWNrZXIob2JqZWN0KToKICAgICIiIgogICAgQSBudWxsIGNvbnRlbnQgY2hlY2tlciB0aGF0IGRlZmluZXMgdGhlIGludGVyZmFjZSBmb3IgY2hlY2tpbmcgY29udGVudAogICAgIiIiCgogICAgZGVmIGZlZWQoc2VsZiwgYmxvY2spOgogICAgICAgICIiIgogICAgICAgIEZlZWQgYSBibG9jayBvZiBkYXRhIHRvIHRoZSBoYXNoLgogICAgICAgICIiIgogICAgICAgIHJldHVybgoKICAgIGRlZiBpc192YWxpZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayB0aGUgaGFzaC4gUmV0dXJuIEZhbHNlIGlmIHZhbGlkYXRpb24gZmFpbHMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmVwb3J0KHNlbGYsIHJlcG9ydGVyLCB0ZW1wbGF0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbCByZXBvcnRlciB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGVja2VyIChoYXNoIG5hbWUpCiAgICAgICAgc3Vic3RpdHV0ZWQgaW50byB0aGUgdGVtcGxhdGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuCgoKY2xhc3MgSGFzaENoZWNrZXIoQ29udGVudENoZWNrZXIpOgogICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoCiAgICAgICAgcicoP1A8aGFzaF9uYW1lPnNoYTF8c2hhMjI0fHNoYTM4NHxzaGEyNTZ8c2hhNTEyfG1kNSk9JwogICAgICAgIHInKD9QPGV4cGVjdGVkPlthLWYwLTldKyknCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhc2hfbmFtZSwgZXhwZWN0ZWQpOgogICAgICAgIHNlbGYuaGFzaF9uYW1lID0gaGFzaF9uYW1lCiAgICAgICAgc2VsZi5oYXNoID0gaGFzaGxpYi5uZXcoaGFzaF9uYW1lKQogICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fdXJsKGNscywgdXJsKToKICAgICAgICAiQ29uc3RydWN0IGEgKHBvc3NpYmx5IG51bGwpIENvbnRlbnRDaGVja2VyIGZyb20gYSBVUkwiCiAgICAgICAgZnJhZ21lbnQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVstMV0KICAgICAgICBpZiBub3QgZnJhZ21lbnQ6CiAgICAgICAgICAgIHJldHVybiBDb250ZW50Q2hlY2tlcigpCiAgICAgICAgbWF0Y2ggPSBjbHMucGF0dGVybi5zZWFyY2goZnJhZ21lbnQpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByZXR1cm4gQ29udGVudENoZWNrZXIoKQogICAgICAgIHJldHVybiBjbHMoKiptYXRjaC5ncm91cGRpY3QoKSkKCiAgICBkZWYgZmVlZChzZWxmLCBibG9jayk6CiAgICAgICAgc2VsZi5oYXNoLnVwZGF0ZShibG9jaykKCiAgICBkZWYgaXNfdmFsaWQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaC5oZXhkaWdlc3QoKSA9PSBzZWxmLmV4cGVjdGVkCgogICAgZGVmIHJlcG9ydChzZWxmLCByZXBvcnRlciwgdGVtcGxhdGUpOgogICAgICAgIG1zZyA9IHRlbXBsYXRlICUgc2VsZi5oYXNoX25hbWUKICAgICAgICByZXR1cm4gcmVwb3J0ZXIobXNnKQoKCmNsYXNzIFBhY2thZ2VJbmRleChFbnZpcm9ubWVudCk6CiAgICAiIiJBIGRpc3RyaWJ1dGlvbiBpbmRleCB0aGF0IHNjYW5zIHdlYiBwYWdlcyBmb3IgZG93bmxvYWQgVVJMcyIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgaW5kZXhfdXJsPSJodHRwczovL3B5cGkucHl0aG9uLm9yZy9zaW1wbGUiLCBob3N0cz0oJyonLCksCiAgICAgICAgICAgIGNhX2J1bmRsZT1Ob25lLCB2ZXJpZnlfc3NsPVRydWUsICphcmdzLCAqKmt3CiAgICApOgogICAgICAgIEVudmlyb25tZW50Ll9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuaW5kZXhfdXJsID0gaW5kZXhfdXJsICsgIi8iIFs6bm90IGluZGV4X3VybC5lbmRzd2l0aCgnLycpXQogICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzID0ge30KICAgICAgICBzZWxmLmZldGNoZWRfdXJscyA9IHt9CiAgICAgICAgc2VsZi5wYWNrYWdlX3BhZ2VzID0ge30KICAgICAgICBzZWxmLmFsbG93cyA9IHJlLmNvbXBpbGUoJ3wnLmpvaW4obWFwKHRyYW5zbGF0ZSwgaG9zdHMpKSkubWF0Y2gKICAgICAgICBzZWxmLnRvX3NjYW4gPSBbXQogICAgICAgIHVzZV9zc2wgPSAoCiAgICAgICAgICAgIHZlcmlmeV9zc2wKICAgICAgICAgICAgYW5kIHNzbF9zdXBwb3J0LmlzX2F2YWlsYWJsZQogICAgICAgICAgICBhbmQgKGNhX2J1bmRsZSBvciBzc2xfc3VwcG9ydC5maW5kX2NhX2J1bmRsZSgpKQogICAgICAgICkKICAgICAgICBpZiB1c2Vfc3NsOgogICAgICAgICAgICBzZWxmLm9wZW5lciA9IHNzbF9zdXBwb3J0Lm9wZW5lcl9mb3IoY2FfYnVuZGxlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYub3BlbmVyID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbgoKICAgIGRlZiBwcm9jZXNzX3VybChzZWxmLCB1cmwsIHJldHJpZXZlPUZhbHNlKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIFVSTCBhcyBhIHBvc3NpYmxlIGRvd25sb2FkLCBhbmQgbWF5YmUgcmV0cmlldmUgaXQiIiIKICAgICAgICBpZiB1cmwgaW4gc2VsZi5zY2FubmVkX3VybHMgYW5kIG5vdCByZXRyaWV2ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5zY2FubmVkX3VybHNbdXJsXSA9IFRydWUKICAgICAgICBpZiBub3QgVVJMX1NDSEVNRSh1cmwpOgogICAgICAgICAgICBzZWxmLnByb2Nlc3NfZmlsZW5hbWUodXJsKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXN0cyA9IGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpCiAgICAgICAgICAgIGlmIGRpc3RzOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYudXJsX29rKHVybCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnKCJGb3VuZCBsaW5rOiAlcyIsIHVybCkKCiAgICAgICAgaWYgZGlzdHMgb3Igbm90IHJldHJpZXZlIG9yIHVybCBpbiBzZWxmLmZldGNoZWRfdXJsczoKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5hZGQsIGRpc3RzKSkKICAgICAgICAgICAgcmV0dXJuICAjIGRvbid0IG5lZWQgdGhlIGFjdHVhbCBwYWdlCgogICAgICAgIGlmIG5vdCBzZWxmLnVybF9vayh1cmwpOgogICAgICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1t1cmxdID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5pbmZvKCJSZWFkaW5nICVzIiwgdXJsKQogICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW3VybF0gPSBUcnVlICAjIHByZXZlbnQgbXVsdGlwbGUgZmV0Y2ggYXR0ZW1wdHMKICAgICAgICB0bXBsID0gIkRvd25sb2FkIGVycm9yIG9uICVzOiAlJXMgLS0gU29tZSBwYWNrYWdlcyBtYXkgbm90IGJlIGZvdW5kISIKICAgICAgICBmID0gc2VsZi5vcGVuX3VybCh1cmwsIHRtcGwgJSB1cmwpCiAgICAgICAgaWYgZiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1tmLnVybF0gPSBUcnVlCiAgICAgICAgaWYgJ2h0bWwnIG5vdCBpbiBmLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnLCAnJykubG93ZXIoKToKICAgICAgICAgICAgZi5jbG9zZSgpICAjIG5vdCBodG1sLCB3ZSBjYW4ndCBwcm9jZXNzIGl0CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBiYXNlID0gZi51cmwgICMgaGFuZGxlIHJlZGlyZWN0cwogICAgICAgIHBhZ2UgPSBmLnJlYWQoKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhZ2UsIHN0cik6CiAgICAgICAgICAgICMgSW4gUHl0aG9uIDMgYW5kIGdvdCBieXRlcyBidXQgd2FudCBzdHIuCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgdXJsbGliLmVycm9yLkhUVFBFcnJvcik6CiAgICAgICAgICAgICAgICAjIEVycm9ycyBoYXZlIG5vIGNoYXJzZXQsIGFzc3VtZSBsYXRpbjE6CiAgICAgICAgICAgICAgICBjaGFyc2V0ID0gJ2xhdGluLTEnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjaGFyc2V0ID0gZi5oZWFkZXJzLmdldF9wYXJhbSgnY2hhcnNldCcpIG9yICdsYXRpbi0xJwogICAgICAgICAgICBwYWdlID0gcGFnZS5kZWNvZGUoY2hhcnNldCwgImlnbm9yZSIpCiAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIocGFnZSk6CiAgICAgICAgICAgIGxpbmsgPSB1cmxsaWIucGFyc2UudXJsam9pbihiYXNlLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3VybChsaW5rKQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKHNlbGYuaW5kZXhfdXJsKSBhbmQgZ2V0YXR0cihmLCAnY29kZScsIE5vbmUpICE9IDQwNDoKICAgICAgICAgICAgcGFnZSA9IHNlbGYucHJvY2Vzc19pbmRleCh1cmwsIHBhZ2UpCgogICAgZGVmIHByb2Nlc3NfZmlsZW5hbWUoc2VsZiwgZm4sIG5lc3RlZD1GYWxzZSk6CiAgICAgICAgIyBwcm9jZXNzIGZpbGVuYW1lcyBvciBkaXJlY3RvcmllcwogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmbik6CiAgICAgICAgICAgIHNlbGYud2FybigiTm90IGZvdW5kOiAlcyIsIGZuKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmbikgYW5kIG5vdCBuZXN0ZWQ6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKGZuKQogICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2ZpbGVuYW1lKG9zLnBhdGguam9pbihwYXRoLCBpdGVtKSwgVHJ1ZSkKCiAgICAgICAgZGlzdHMgPSBkaXN0cm9zX2Zvcl9maWxlbmFtZShmbikKICAgICAgICBpZiBkaXN0czoKICAgICAgICAgICAgc2VsZi5kZWJ1ZygiRm91bmQ6ICVzIiwgZm4pCiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuYWRkLCBkaXN0cykpCgogICAgZGVmIHVybF9vayhzZWxmLCB1cmwsIGZhdGFsPUZhbHNlKToKICAgICAgICBzID0gVVJMX1NDSEVNRSh1cmwpCiAgICAgICAgaXNfZmlsZSA9IHMgYW5kIHMuZ3JvdXAoMSkubG93ZXIoKSA9PSAnZmlsZScKICAgICAgICBpZiBpc19maWxlIG9yIHNlbGYuYWxsb3dzKHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpWzFdKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICJcbk5vdGU6IEJ5cGFzc2luZyAlcyAoZGlzYWxsb3dlZCBob3N0OyBzZWUgIgogICAgICAgICAgICAiaHR0cDovL2JpdC5seS8yaHJJbW5ZIGZvciBkZXRhaWxzKS5cbiIpCiAgICAgICAgaWYgZmF0YWw6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZyAlIHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndhcm4obXNnLCB1cmwpCgogICAgZGVmIHNjYW5fZWdnX2xpbmtzKHNlbGYsIHNlYXJjaF9wYXRoKToKICAgICAgICBkaXJzID0gZmlsdGVyKG9zLnBhdGguaXNkaXIsIHNlYXJjaF9wYXRoKQogICAgICAgIGVnZ19saW5rcyA9ICgKICAgICAgICAgICAgKHBhdGgsIGVudHJ5KQogICAgICAgICAgICBmb3IgcGF0aCBpbiBkaXJzCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKHBhdGgpCiAgICAgICAgICAgIGlmIGVudHJ5LmVuZHN3aXRoKCcuZWdnLWxpbmsnKQogICAgICAgICkKICAgICAgICBsaXN0KGl0ZXJ0b29scy5zdGFybWFwKHNlbGYuc2Nhbl9lZ2dfbGluaywgZWdnX2xpbmtzKSkKCiAgICBkZWYgc2Nhbl9lZ2dfbGluayhzZWxmLCBwYXRoLCBlbnRyeSk6CiAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihwYXRoLCBlbnRyeSkpIGFzIHJhd19saW5lczoKICAgICAgICAgICAgIyBmaWx0ZXIgbm9uLWVtcHR5IGxpbmVzCiAgICAgICAgICAgIGxpbmVzID0gbGlzdChmaWx0ZXIoTm9uZSwgbWFwKHN0ci5zdHJpcCwgcmF3X2xpbmVzKSkpCgogICAgICAgIGlmIGxlbihsaW5lcykgIT0gMjoKICAgICAgICAgICAgIyBmb3JtYXQgaXMgbm90IHJlY29nbml6ZWQ7IHB1bnQKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGVnZ19wYXRoLCBzZXR1cF9wYXRoID0gbGluZXMKCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKG9zLnBhdGguam9pbihwYXRoLCBlZ2dfcGF0aCkpOgogICAgICAgICAgICBkaXN0LmxvY2F0aW9uID0gb3MucGF0aC5qb2luKHBhdGgsICpsaW5lcykKICAgICAgICAgICAgZGlzdC5wcmVjZWRlbmNlID0gU09VUkNFX0RJU1QKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICBkZWYgcHJvY2Vzc19pbmRleChzZWxmLCB1cmwsIHBhZ2UpOgogICAgICAgICIiIlByb2Nlc3MgdGhlIGNvbnRlbnRzIG9mIGEgUHlQSSBwYWdlIiIiCgogICAgICAgIGRlZiBzY2FuKGxpbmspOgogICAgICAgICAgICAjIFByb2Nlc3MgYSBVUkwgdG8gc2VlIGlmIGl0J3MgZm9yIGEgcGFja2FnZSBwYWdlCiAgICAgICAgICAgIGlmIGxpbmsuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCk6CiAgICAgICAgICAgICAgICBwYXJ0cyA9IGxpc3QobWFwKAogICAgICAgICAgICAgICAgICAgIHVybGxpYi5wYXJzZS51bnF1b3RlLCBsaW5rW2xlbihzZWxmLmluZGV4X3VybCk6XS5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyIGFuZCAnIycgbm90IGluIHBhcnRzWzFdOgogICAgICAgICAgICAgICAgICAgICMgaXQncyBhIHBhY2thZ2UgcGFnZSwgc2FuaXRpemUgYW5kIGluZGV4IGl0CiAgICAgICAgICAgICAgICAgICAgcGtnID0gc2FmZV9uYW1lKHBhcnRzWzBdKQogICAgICAgICAgICAgICAgICAgIHZlciA9IHNhZmVfdmVyc2lvbihwYXJ0c1sxXSkKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VfcGFnZXMuc2V0ZGVmYXVsdChwa2cubG93ZXIoKSwge30pW2xpbmtdID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b19maWxlbmFtZShwa2cpLCB0b19maWxlbmFtZSh2ZXIpCiAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCgogICAgICAgICMgcHJvY2VzcyBhbiBpbmRleCBwYWdlIGludG8gdGhlIHBhY2thZ2UtcGFnZSBpbmRleAogICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHBhZ2UpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzY2FuKHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgcGtnLCB2ZXIgPSBzY2FuKHVybCkgICMgZW5zdXJlIHRoaXMgcGFnZSBpcyBpbiB0aGUgcGFnZSBpbmRleAogICAgICAgIGlmIHBrZzoKICAgICAgICAgICAgIyBwcm9jZXNzIGluZGl2aWR1YWwgcGFja2FnZSBwYWdlCiAgICAgICAgICAgIGZvciBuZXdfdXJsIGluIGZpbmRfZXh0ZXJuYWxfbGlua3ModXJsLCBwYWdlKToKICAgICAgICAgICAgICAgICMgUHJvY2VzcyB0aGUgZm91bmQgVVJMCiAgICAgICAgICAgICAgICBiYXNlLCBmcmFnID0gZWdnX2luZm9fZm9yX3VybChuZXdfdXJsKQogICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnLnB5JykgYW5kIG5vdCBmcmFnOgogICAgICAgICAgICAgICAgICAgIGlmIHZlcjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3VybCArPSAnI2VnZz0lcy0lcycgJSAocGtnLCB2ZXIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZWVkX3ZlcnNpb25faW5mbyh1cmwpCiAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKG5ld191cmwpCgogICAgICAgICAgICByZXR1cm4gUFlQSV9NRDUuc3ViKAogICAgICAgICAgICAgICAgbGFtYmRhIG06ICc8YSBocmVmPSIlcyNtZDU9JXMiPiVzPC9hPicgJSBtLmdyb3VwKDEsIDMsIDIpLCBwYWdlCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIiIgICMgbm8gc2Vuc2UgZG91YmxlLXNjYW5uaW5nIG5vbi1wYWNrYWdlIHBhZ2VzCgogICAgZGVmIG5lZWRfdmVyc2lvbl9pbmZvKHNlbGYsIHVybCk6CiAgICAgICAgc2VsZi5zY2FuX2FsbCgKICAgICAgICAgICAgIlBhZ2UgYXQgJXMgbGlua3MgdG8gLnB5IGZpbGUocykgd2l0aG91dCB2ZXJzaW9uIGluZm87IGFuIGluZGV4ICIKICAgICAgICAgICAgInNjYW4gaXMgcmVxdWlyZWQuIiwgdXJsCiAgICAgICAgKQoKICAgIGRlZiBzY2FuX2FsbChzZWxmLCBtc2c9Tm9uZSwgKmFyZ3MpOgogICAgICAgIGlmIHNlbGYuaW5kZXhfdXJsIG5vdCBpbiBzZWxmLmZldGNoZWRfdXJsczoKICAgICAgICAgICAgaWYgbXNnOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKG1zZywgKmFyZ3MpCiAgICAgICAgICAgIHNlbGYuaW5mbygKICAgICAgICAgICAgICAgICJTY2FubmluZyBpbmRleCBvZiBhbGwgcGFja2FnZXMgKHRoaXMgbWF5IHRha2UgYSB3aGlsZSkiCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsKQoKICAgIGRlZiBmaW5kX3BhY2thZ2VzKHNlbGYsIHJlcXVpcmVtZW50KToKICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUgKyAnLycpCgogICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CiAgICAgICAgICAgICMgRmFsbCBiYWNrIHRvIHNhZmUgdmVyc2lvbiBvZiB0aGUgbmFtZQogICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQucHJvamVjdF9uYW1lICsgJy8nKQoKICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXkpOgogICAgICAgICAgICAjIFdlIGNvdWxkbid0IGZpbmQgdGhlIHRhcmdldCBwYWNrYWdlLCBzbyBzZWFyY2ggdGhlIGluZGV4IHBhZ2UgdG9vCiAgICAgICAgICAgIHNlbGYubm90X2ZvdW5kX2luX2luZGV4KHJlcXVpcmVtZW50KQoKICAgICAgICBmb3IgdXJsIGluIGxpc3Qoc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXksICgpKSk6CiAgICAgICAgICAgICMgc2NhbiBlYWNoIHBhZ2UgdGhhdCBtaWdodCBiZSByZWxhdGVkIHRvIHRoZSBkZXNpcmVkIHBhY2thZ2UKICAgICAgICAgICAgc2VsZi5zY2FuX3VybCh1cmwpCgogICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgIHNlbGYucHJlc2NhbigpCiAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxdWlyZW1lbnQua2V5XToKICAgICAgICAgICAgaWYgZGlzdCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgICAgIHNlbGYuZGVidWcoIiVzIGRvZXMgbm90IG1hdGNoICVzIiwgcmVxdWlyZW1lbnQsIGRpc3QpCiAgICAgICAgcmV0dXJuIHN1cGVyKFBhY2thZ2VJbmRleCwgc2VsZikub2J0YWluKHJlcXVpcmVtZW50LCBpbnN0YWxsZXIpCgogICAgZGVmIGNoZWNrX2hhc2goc2VsZiwgY2hlY2tlciwgZmlsZW5hbWUsIHRmcCk6CiAgICAgICAgIiIiCiAgICAgICAgY2hlY2tlciBpcyBhIENvbnRlbnRDaGVja2VyCiAgICAgICAgIiIiCiAgICAgICAgY2hlY2tlci5yZXBvcnQoCiAgICAgICAgICAgIHNlbGYuZGVidWcsCiAgICAgICAgICAgICJWYWxpZGF0aW5nICUlcyBjaGVja3N1bSBmb3IgJXMiICUgZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IGNoZWNrZXIuaXNfdmFsaWQoKToKICAgICAgICAgICAgdGZwLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICIlcyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgJXM7ICIKICAgICAgICAgICAgICAgICJwb3NzaWJsZSBkb3dubG9hZCBwcm9ibGVtPyIKICAgICAgICAgICAgICAgICUgKGNoZWNrZXIuaGFzaC5uYW1lLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKICAgICAgICAgICAgKQoKICAgIGRlZiBhZGRfZmluZF9saW5rcyhzZWxmLCB1cmxzKToKICAgICAgICAiIiJBZGQgYHVybHNgIHRvIHRoZSBsaXN0IHRoYXQgd2lsbCBiZSBwcmVzY2FubmVkIGZvciBzZWFyY2hlcyIiIgogICAgICAgIGZvciB1cmwgaW4gdXJsczoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgc2VsZi50b19zY2FuIGlzIE5vbmUgICMgaWYgd2UgaGF2ZSBhbHJlYWR5ICJnb25lIG9ubGluZSIKICAgICAgICAgICAgICAgIG9yIG5vdCBVUkxfU0NIRU1FKHVybCkgICMgb3IgaXQncyBhIGxvY2FsIGZpbGUvZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBvciB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKQogICAgICAgICAgICAgICAgb3IgbGlzdChkaXN0cm9zX2Zvcl91cmwodXJsKSkgICMgb3IgYSBkaXJlY3QgcGFja2FnZSBsaW5rCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAjIHRoZW4gZ28gYWhlYWQgYW5kIHByb2Nlc3MgaXQgbm93CiAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHVybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBkZWZlciByZXRyaWV2YWwgdGlsbCBsYXRlcgogICAgICAgICAgICAgICAgc2VsZi50b19zY2FuLmFwcGVuZCh1cmwpCgogICAgZGVmIHByZXNjYW4oc2VsZik6CiAgICAgICAgIiIiU2NhbiB1cmxzIHNjaGVkdWxlZCBmb3IgcHJlc2Nhbm5pbmcgKGUuZy4gLS1maW5kLWxpbmtzKSIiIgogICAgICAgIGlmIHNlbGYudG9fc2NhbjoKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5zY2FuX3VybCwgc2VsZi50b19zY2FuKSkKICAgICAgICBzZWxmLnRvX3NjYW4gPSBOb25lICAjIGZyb20gbm93IG9uLCBnbyBhaGVhZCBhbmQgcHJvY2VzcyBpbW1lZGlhdGVseQoKICAgIGRlZiBub3RfZm91bmRfaW5faW5kZXgoc2VsZiwgcmVxdWlyZW1lbnQpOgogICAgICAgIGlmIHNlbGZbcmVxdWlyZW1lbnQua2V5XTogICMgd2UndmUgc2VlbiBhdCBsZWFzdCBvbmUgZGlzdHJvCiAgICAgICAgICAgIG1ldGgsIG1zZyA9IHNlbGYuaW5mbywgIkNvdWxkbid0IHJldHJpZXZlIGluZGV4IHBhZ2UgZm9yICVyIgogICAgICAgIGVsc2U6ICAjIG5vIGRpc3Ryb3Mgc2VlbiBmb3IgdGhpcyBuYW1lLCBtaWdodCBiZSBtaXNzcGVsbGVkCiAgICAgICAgICAgIG1ldGgsIG1zZyA9ICgKICAgICAgICAgICAgICAgIHNlbGYud2FybiwKICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGluZGV4IHBhZ2UgZm9yICVyIChtYXliZSBtaXNzcGVsbGVkPykiKQogICAgICAgIG1ldGgobXNnLCByZXF1aXJlbWVudC51bnNhZmVfbmFtZSkKICAgICAgICBzZWxmLnNjYW5fYWxsKCkKCiAgICBkZWYgZG93bmxvYWQoc2VsZiwgc3BlYywgdG1wZGlyKToKICAgICAgICAiIiJMb2NhdGUgYW5kL29yIGRvd25sb2FkIGBzcGVjYCB0byBgdG1wZGlyYCwgcmV0dXJuaW5nIGEgbG9jYWwgcGF0aAoKICAgICAgICBgc3BlY2AgbWF5IGJlIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCwgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIFVSTCwKICAgICAgICBhbiBleGlzdGluZyBsb2NhbCBmaWxlbmFtZSwgb3IgYSBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlYwogICAgICAgIChpLmUuIHRoZSBzdHJpbmcgZm9ybSBvZiBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3QpLiAgSWYgaXQgaXMgdGhlIFVSTAogICAgICAgIG9mIGEgLnB5IGZpbGUgd2l0aCBhbiB1bmFtYmlndW91cyBgYCNlZ2c9bmFtZS12ZXJzaW9uYGAgdGFnIChpLmUuLCBvbmUKICAgICAgICB0aGF0IGVzY2FwZXMgYGAtYGAgYXMgYGBfYGAgdGhyb3VnaG91dCksIGEgdHJpdmlhbCBgYHNldHVwLnB5YGAgaXMKICAgICAgICBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYWxvbmdzaWRlIHRoZSBkb3dubG9hZGVkIGZpbGUuCgogICAgICAgIElmIGBzcGVjYCBpcyBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3Qgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhCiAgICAgICAgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWMsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGxvY2F0aW9uIG9mCiAgICAgICAgYSBtYXRjaGluZyBkaXN0cmlidXRpb24gKHBvc3NpYmx5IGFmdGVyIGRvd25sb2FkaW5nIGl0IHRvIGB0bXBkaXJgKS4KICAgICAgICBJZiBgc3BlY2AgaXMgYSBsb2NhbGx5IGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWUsIGl0IGlzIHNpbXBseQogICAgICAgIHJldHVybmVkIHVuY2hhbmdlZC4gIElmIGBzcGVjYCBpcyBhIFVSTCwgaXQgaXMgZG93bmxvYWRlZCB0byBhIHN1YnBhdGgKICAgICAgICBvZiBgdG1wZGlyYCwgYW5kIHRoZSBsb2NhbCBmaWxlbmFtZSBpcyByZXR1cm5lZC4gIFZhcmlvdXMgZXJyb3JzIG1heSBiZQogICAgICAgIHJhaXNlZCBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBkb3dubG9hZGluZy4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLCBSZXF1aXJlbWVudCk6CiAgICAgICAgICAgIHNjaGVtZSA9IFVSTF9TQ0hFTUUoc3BlYykKICAgICAgICAgICAgaWYgc2NoZW1lOgogICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZG93bmxvYWRfdXJsKHNjaGVtZS5ncm91cCgxKSwgc3BlYywgdG1wZGlyKQogICAgICAgICAgICAgICAgYmFzZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHNwZWMpCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZ2VuX3NldHVwKGZvdW5kLCBmcmFnbWVudCwgdG1wZGlyKQogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CiAgICAgICAgICAgICAgICAjIEV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LCBqdXN0IHJldHVybiBpdAogICAgICAgICAgICAgICAgcmV0dXJuIHNwZWMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNwZWMgPSBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYykKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLmZldGNoX2Rpc3RyaWJ1dGlvbihzcGVjLCB0bXBkaXIpLCAnbG9jYXRpb24nLCBOb25lKQoKICAgIGRlZiBmZXRjaF9kaXN0cmlidXRpb24oCiAgICAgICAgICAgIHNlbGYsIHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW49RmFsc2UsIHNvdXJjZT1GYWxzZSwKICAgICAgICAgICAgZGV2ZWxvcF9vaz1GYWxzZSwgbG9jYWxfaW5kZXg9Tm9uZSk6CiAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKCiAgICAgICAgYHJlcXVpcmVtZW50YCBtdXN0IGJlIGEgYGBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50YGAgaW5zdGFuY2UuCiAgICAgICAgSWYgbmVjZXNzYXJ5LCBvciBpZiB0aGUgYGZvcmNlX3NjYW5gIGZsYWcgaXMgc2V0LCB0aGUgcmVxdWlyZW1lbnQgaXMKICAgICAgICBzZWFyY2hlZCBmb3IgaW4gdGhlIChvbmxpbmUpIHBhY2thZ2UgaW5kZXggYXMgd2VsbCBhcyB0aGUgbG9jYWxseQogICAgICAgIGluc3RhbGxlZCBwYWNrYWdlcy4gIElmIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgaXMgZm91bmQsCiAgICAgICAgdGhlIHJldHVybmVkIGRpc3RyaWJ1dGlvbidzIGBgbG9jYXRpb25gYCBpcyB0aGUgdmFsdWUgeW91IHdvdWxkIGhhdmUKICAgICAgICBnb3R0ZW4gZnJvbSBjYWxsaW5nIHRoZSBgYGRvd25sb2FkKClgYCBtZXRob2Qgd2l0aCB0aGUgbWF0Y2hpbmcKICAgICAgICBkaXN0cmlidXRpb24ncyBVUkwgb3IgZmlsZW5hbWUuICBJZiBubyBtYXRjaGluZyBkaXN0cmlidXRpb24gaXMgZm91bmQsCiAgICAgICAgYGBOb25lYGAgaXMgcmV0dXJuZWQuCgogICAgICAgIElmIHRoZSBgc291cmNlYCBmbGFnIGlzIHNldCwgb25seSBzb3VyY2UgZGlzdHJpYnV0aW9ucyBhbmQgc291cmNlCiAgICAgICAgY2hlY2tvdXQgbGlua3Mgd2lsbCBiZSBjb25zaWRlcmVkLiAgVW5sZXNzIHRoZSBgZGV2ZWxvcF9va2AgZmxhZyBpcwogICAgICAgIHNldCwgZGV2ZWxvcG1lbnQgYW5kIHN5c3RlbSBlZ2dzIChpLmUuLCB0aG9zZSB1c2luZyB0aGUgYGAuZWdnLWluZm9gYAogICAgICAgIGZvcm1hdCkgd2lsbCBiZSBpZ25vcmVkLgogICAgICAgICIiIgogICAgICAgICMgcHJvY2VzcyBhIFJlcXVpcmVtZW50CiAgICAgICAgc2VsZi5pbmZvKCJTZWFyY2hpbmcgZm9yICVzIiwgcmVxdWlyZW1lbnQpCiAgICAgICAgc2tpcHBlZCA9IHt9CiAgICAgICAgZGlzdCA9IE5vbmUKCiAgICAgICAgZGVmIGZpbmQocmVxLCBlbnY9Tm9uZSk6CiAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgogICAgICAgICAgICAgICAgZW52ID0gc2VsZgogICAgICAgICAgICAjIEZpbmQgYSBtYXRjaGluZyBkaXN0cmlidXRpb247IG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UKCiAgICAgICAgICAgIGZvciBkaXN0IGluIGVudltyZXEua2V5XToKCiAgICAgICAgICAgICAgICBpZiBkaXN0LnByZWNlZGVuY2UgPT0gREVWRUxPUF9ESVNUIGFuZCBub3QgZGV2ZWxvcF9vazoKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBza2lwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZGV2ZWxvcG1lbnQgb3Igc3lzdGVtIGVnZzogJXMiLCBkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRbZGlzdF0gPSAxCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICB0ZXN0ID0gKAogICAgICAgICAgICAgICAgICAgIGRpc3QgaW4gcmVxCiAgICAgICAgICAgICAgICAgICAgYW5kIChkaXN0LnByZWNlZGVuY2UgPD0gU09VUkNFX0RJU1Qgb3Igbm90IHNvdXJjZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHRlc3Q6CiAgICAgICAgICAgICAgICAgICAgbG9jID0gc2VsZi5kb3dubG9hZChkaXN0LmxvY2F0aW9uLCB0bXBkaXIpCiAgICAgICAgICAgICAgICAgICAgZGlzdC5kb3dubG9hZF9sb2NhdGlvbiA9IGxvYwogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3QuZG93bmxvYWRfbG9jYXRpb24pOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAoKICAgICAgICBpZiBmb3JjZV9zY2FuOgogICAgICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQoKICAgICAgICBpZiBub3QgZGlzdCBhbmQgbG9jYWxfaW5kZXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50LCBsb2NhbF9pbmRleCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLnRvX3NjYW4gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lIGFuZCBub3QgZm9yY2Vfc2NhbjoKICAgICAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAiTm8gbG9jYWwgcGFja2FnZXMgb3Igd29ya2luZyBkb3dubG9hZCBsaW5rcyBmb3VuZCBmb3IgJXMlcyIsCiAgICAgICAgICAgICAgICAoc291cmNlIGFuZCAiYSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mICIgb3IgIiIpLAogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluZm8oIkJlc3QgbWF0Y2g6ICVzIiwgZGlzdCkKICAgICAgICAgICAgcmV0dXJuIGRpc3QuY2xvbmUobG9jYXRpb249ZGlzdC5kb3dubG9hZF9sb2NhdGlvbikKCiAgICBkZWYgZmV0Y2goc2VsZiwgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlKToKICAgICAgICAiIiJPYnRhaW4gYSBmaWxlIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKCiAgICAgICAgREVQUkVDQVRFRDsgdXNlIHRoZSBgYGZldGNoX2Rpc3RyaWJ1dGlvbigpYGAgbWV0aG9kIG5vdyBpbnN0ZWFkLiAgRm9yCiAgICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCBidXQgcmV0dXJucyB0aGUKICAgICAgICBgYGxvY2F0aW9uYGAgb2YgdGhlIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uIGluc3RlYWQgb2YgYSBkaXN0cmlidXRpb24KICAgICAgICBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuZmV0Y2hfZGlzdHJpYnV0aW9uKHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW4sIHNvdXJjZSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGlzdC5sb2NhdGlvbgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGdlbl9zZXR1cChzZWxmLCBmaWxlbmFtZSwgZnJhZ21lbnQsIHRtcGRpcik6CiAgICAgICAgbWF0Y2ggPSBFR0dfRlJBR01FTlQubWF0Y2goZnJhZ21lbnQpCiAgICAgICAgZGlzdHMgPSBtYXRjaCBhbmQgWwogICAgICAgICAgICBkIGZvciBkIGluCiAgICAgICAgICAgIGludGVycHJldF9kaXN0cm9fbmFtZShmaWxlbmFtZSwgbWF0Y2guZ3JvdXAoMSksIE5vbmUpIGlmIGQudmVyc2lvbgogICAgICAgIF0gb3IgW10KCiAgICAgICAgaWYgbGVuKGRpc3RzKSA9PSAxOiAgIyB1bmFtYmlndW91cyBgYCNlZ2dgYCBmcmFnbWVudAogICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCgogICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZmlsZSBoYXMgYmVlbiBkb3dubG9hZGVkIHRvIHRoZSB0ZW1wIGRpci4KICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKSAhPSB0bXBkaXI6CiAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBiYXNlbmFtZSkKICAgICAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgc2FtZWZpbGUKICAgICAgICAgICAgICAgIGlmIG5vdCBzYW1lZmlsZShmaWxlbmFtZSwgZHN0KToKICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIoZmlsZW5hbWUsIGRzdCkKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGRzdAoKICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbih0bXBkaXIsICdzZXR1cC5weScpLCAndycpIGFzIGZpbGU6CiAgICAgICAgICAgICAgICBmaWxlLndyaXRlKAogICAgICAgICAgICAgICAgICAgICJmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwXG4iCiAgICAgICAgICAgICAgICAgICAgInNldHVwKG5hbWU9JXIsIHZlcnNpb249JXIsIHB5X21vZHVsZXM9WyVyXSlcbiIKICAgICAgICAgICAgICAgICAgICAlICgKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHNbMF0ucHJvamVjdF9uYW1lLCBkaXN0c1swXS52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgICAgIGVsaWYgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHVuYW1iaWd1b3VzbHkgaW50ZXJwcmV0IHByb2plY3QvdmVyc2lvbiBpZGVudGlmaWVyICVyOyAiCiAgICAgICAgICAgICAgICAiYW55IGRhc2hlcyBpbiB0aGUgbmFtZSBvciB2ZXJzaW9uIHNob3VsZCBiZSBlc2NhcGVkIHVzaW5nICIKICAgICAgICAgICAgICAgICJ1bmRlcnNjb3Jlcy4gJXIiICUgKGZyYWdtZW50LCBkaXN0cykKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHByb2Nlc3MgcGxhaW4gLnB5IGZpbGVzIHdpdGhvdXQgYW4gJyNlZ2c9bmFtZS12ZXJzaW9uJyIKICAgICAgICAgICAgICAgICIgc3VmZml4IHRvIGVuYWJsZSBhdXRvbWF0aWMgc2V0dXAgc2NyaXB0IGdlbmVyYXRpb24uIgogICAgICAgICAgICApCgogICAgZGxfYmxvY2tzaXplID0gODE5MgoKICAgIGRlZiBfZG93bmxvYWRfdG8oc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgc2VsZi5pbmZvKCJEb3dubG9hZGluZyAlcyIsIHVybCkKICAgICAgICAjIERvd25sb2FkIHRoZSBmaWxlCiAgICAgICAgZnAgPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjaGVja2VyID0gSGFzaENoZWNrZXIuZnJvbV91cmwodXJsKQogICAgICAgICAgICBmcCA9IHNlbGYub3Blbl91cmwodXJsKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZwLCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJDYW4ndCBkb3dubG9hZCAlczogJXMgJXMiICUgKHVybCwgZnAuY29kZSwgZnAubXNnKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBoZWFkZXJzID0gZnAuaW5mbygpCiAgICAgICAgICAgIGJsb2NrbnVtID0gMAogICAgICAgICAgICBicyA9IHNlbGYuZGxfYmxvY2tzaXplCiAgICAgICAgICAgIHNpemUgPSAtMQogICAgICAgICAgICBpZiAiY29udGVudC1sZW5ndGgiIGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICAjIFNvbWUgc2VydmVycyByZXR1cm4gbXVsdGlwbGUgQ29udGVudC1MZW5ndGggaGVhZGVycyA6KAogICAgICAgICAgICAgICAgc2l6ZXMgPSBnZXRfYWxsX2hlYWRlcnMoaGVhZGVycywgJ0NvbnRlbnQtTGVuZ3RoJykKICAgICAgICAgICAgICAgIHNpemUgPSBtYXgobWFwKGludCwgc2l6ZXMpKQogICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd2InKSBhcyB0ZnA6CiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIGJsb2NrID0gZnAucmVhZChicykKICAgICAgICAgICAgICAgICAgICBpZiBibG9jazoKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlci5mZWVkKGJsb2NrKQogICAgICAgICAgICAgICAgICAgICAgICB0ZnAud3JpdGUoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrbnVtICs9IDEKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgc2VsZi5jaGVja19oYXNoKGNoZWNrZXIsIGZpbGVuYW1lLCB0ZnApCiAgICAgICAgICAgIHJldHVybiBoZWFkZXJzCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgZnA6CiAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCgogICAgZGVmIHJlcG9ydGhvb2soc2VsZiwgdXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJsa3NpemUsIHNpemUpOgogICAgICAgIHBhc3MgICMgbm8tb3AKCiAgICBkZWYgb3Blbl91cmwoc2VsZiwgdXJsLCB3YXJuaW5nPU5vbmUpOgogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdmaWxlOicpOgogICAgICAgICAgICByZXR1cm4gbG9jYWxfb3Blbih1cmwpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3Blbl93aXRoX2F1dGgodXJsLCBzZWxmLm9wZW5lcikKICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIGh0dHBfY2xpZW50LkludmFsaWRVUkwpIGFzIHY6CiAgICAgICAgICAgIG1zZyA9ICcgJy5qb2luKFtzdHIoYXJnKSBmb3IgYXJnIGluIHYuYXJnc10pCiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgbXNnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoJyVzICVzJyAlICh1cmwsIG1zZykpCiAgICAgICAgZXhjZXB0IHVybGxpYi5lcnJvci5IVFRQRXJyb3IgYXMgdjoKICAgICAgICAgICAgcmV0dXJuIHYKICAgICAgICBleGNlcHQgdXJsbGliLmVycm9yLlVSTEVycm9yIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdi5yZWFzb24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiRG93bmxvYWQgZXJyb3IgZm9yICVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHVybCwgdi5yZWFzb24pKQogICAgICAgIGV4Y2VwdCBodHRwX2NsaWVudC5CYWRTdGF0dXNMaW5lIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdi5saW5lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJyVzIHJldHVybmVkIGEgYmFkIHN0YXR1cyBsaW5lLiBUaGUgc2VydmVyIG1pZ2h0IGJlICcKICAgICAgICAgICAgICAgICAgICAnZG93biwgJXMnICUKICAgICAgICAgICAgICAgICAgICAodXJsLCB2LmxpbmUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IChodHRwX2NsaWVudC5IVFRQRXhjZXB0aW9uLCBzb2NrZXQuZXJyb3IpIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJEb3dubG9hZCBlcnJvciBmb3IgJXM6ICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodXJsLCB2KSkKCiAgICBkZWYgX2Rvd25sb2FkX3VybChzZWxmLCBzY2hlbWUsIHVybCwgdG1wZGlyKToKICAgICAgICAjIERldGVybWluZSBkb3dubG9hZCBmaWxlbmFtZQogICAgICAgICMKICAgICAgICBuYW1lLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwodXJsKQogICAgICAgIGlmIG5hbWU6CiAgICAgICAgICAgIHdoaWxlICcuLicgaW4gbmFtZToKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy4uJywgJy4nKS5yZXBsYWNlKCdcXCcsICdfJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lID0gIl9fZG93bmxvYWRlZF9fIiAgIyBkZWZhdWx0IGlmIFVSTCBoYXMgbm8gcGF0aCBjb250ZW50cwoKICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcuZWdnLnppcCcpOgogICAgICAgICAgICBuYW1lID0gbmFtZVs6LTRdICAjIHN0cmlwIHRoZSBleHRyYSAuemlwIGJlZm9yZSBkb3dubG9hZAoKICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIsIG5hbWUpCgogICAgICAgICMgRG93bmxvYWQgdGhlIGZpbGUKICAgICAgICAjCiAgICAgICAgaWYgc2NoZW1lID09ICdzdm4nIG9yIHNjaGVtZS5zdGFydHN3aXRoKCdzdm4rJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKICAgICAgICBlbGlmIHNjaGVtZSA9PSAnZ2l0JyBvciBzY2hlbWUuc3RhcnRzd2l0aCgnZ2l0KycpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfZ2l0KHVybCwgZmlsZW5hbWUpCiAgICAgICAgZWxpZiBzY2hlbWUuc3RhcnRzd2l0aCgnaGcrJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9oZyh1cmwsIGZpbGVuYW1lKQogICAgICAgIGVsaWYgc2NoZW1lID09ICdmaWxlJzoKICAgICAgICAgICAgcmV0dXJuIHVybGxpYi5yZXF1ZXN0LnVybDJwYXRobmFtZSh1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVsyXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybF9vayh1cmwsIFRydWUpICAjIHJhaXNlcyBlcnJvciBpZiBub3QgYWxsb3dlZAogICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0ZW1wdF9kb3dubG9hZCh1cmwsIGZpbGVuYW1lKQoKICAgIGRlZiBzY2FuX3VybChzZWxmLCB1cmwpOgogICAgICAgIHNlbGYucHJvY2Vzc191cmwodXJsLCBUcnVlKQoKICAgIGRlZiBfYXR0ZW1wdF9kb3dubG9hZChzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBoZWFkZXJzID0gc2VsZi5fZG93bmxvYWRfdG8odXJsLCBmaWxlbmFtZSkKICAgICAgICBpZiAnaHRtbCcgaW4gaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScsICcnKS5sb3dlcigpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfaHRtbCh1cmwsIGhlYWRlcnMsIGZpbGVuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfZG93bmxvYWRfaHRtbChzZWxmLCB1cmwsIGhlYWRlcnMsIGZpbGVuYW1lKToKICAgICAgICBmaWxlID0gb3BlbihmaWxlbmFtZSkKICAgICAgICBmb3IgbGluZSBpbiBmaWxlOgogICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCk6CiAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBhIHN1YnZlcnNpb24gaW5kZXggcGFnZQogICAgICAgICAgICAgICAgaWYgcmUuc2VhcmNoKHInPHRpdGxlPihbXi0gXSsgLSApP1JldmlzaW9uIFxkKzonLCBsaW5lKToKICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBzdWJ2ZXJzaW9uIGluZGV4IHBhZ2U6CiAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGJyZWFrICAjIG5vdCBhbiBpbmRleCBwYWdlCiAgICAgICAgZmlsZS5jbG9zZSgpCiAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJVbmV4cGVjdGVkIEhUTUwgcGFnZSBmb3VuZCBhdCAiICsgdXJsKQoKICAgIGRlZiBfZG93bmxvYWRfc3ZuKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIHVybCA9IHVybC5zcGxpdCgnIycsIDEpWzBdICAjIHJlbW92ZSBhbnkgZnJhZ21lbnQgZm9yIHN2bidzIHNha2UKICAgICAgICBjcmVkcyA9ICcnCiAgICAgICAgaWYgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnc3ZuOicpIGFuZCAnQCcgaW4gdXJsOgogICAgICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcCwgcSwgZiA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIGlmIG5vdCBuZXRsb2MgYW5kIHBhdGguc3RhcnRzd2l0aCgnLy8nKSBhbmQgJy8nIGluIHBhdGhbMjpdOgogICAgICAgICAgICAgICAgbmV0bG9jLCBwYXRoID0gcGF0aFsyOl0uc3BsaXQoJy8nLCAxKQogICAgICAgICAgICAgICAgYXV0aCwgaG9zdCA9IHNwbGl0dXNlcihuZXRsb2MpCiAgICAgICAgICAgICAgICBpZiBhdXRoOgogICAgICAgICAgICAgICAgICAgIGlmICc6JyBpbiBhdXRoOgogICAgICAgICAgICAgICAgICAgICAgICB1c2VyLCBwdyA9IGF1dGguc3BsaXQoJzonLCAxKQogICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9ICIgLS11c2VybmFtZT0lcyAtLXBhc3N3b3JkPSVzIiAlICh1c2VyLCBwdykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9ICIgLS11c2VybmFtZT0iICsgYXV0aAogICAgICAgICAgICAgICAgICAgIG5ldGxvYyA9IGhvc3QKICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHNjaGVtZSwgbmV0bG9jLCB1cmwsIHAsIHEsIGYKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJ0cykKICAgICAgICBzZWxmLmluZm8oIkRvaW5nIHN1YnZlcnNpb24gY2hlY2tvdXQgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJzdm4gY2hlY2tvdXQlcyAtcSAlcyAlcyIgJSAoY3JlZHMsIHVybCwgZmlsZW5hbWUpKQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9RmFsc2UpOgogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxzcGxpdCh1cmwpCgogICAgICAgIHNjaGVtZSA9IHNjaGVtZS5zcGxpdCgnKycsIDEpWy0xXQoKICAgICAgICAjIFNvbWUgZnJhZ21lbnQgaWRlbnRpZmljYXRpb24gZmFpbHMKICAgICAgICBwYXRoID0gcGF0aC5zcGxpdCgnIycsIDEpWzBdCgogICAgICAgIHJldiA9IE5vbmUKICAgICAgICBpZiAnQCcgaW4gcGF0aDoKICAgICAgICAgICAgcGF0aCwgcmV2ID0gcGF0aC5yc3BsaXQoJ0AnLCAxKQoKICAgICAgICAjIEFsc28sIGRpc2NhcmQgZnJhZ21lbnQKICAgICAgICB1cmwgPSB1cmxsaWIucGFyc2UudXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCAnJykpCgogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBfZG93bmxvYWRfZ2l0KHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3BsaXQoJyMnLCAxKVswXQogICAgICAgIHVybCwgcmV2ID0gc2VsZi5fdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9VHJ1ZSkKCiAgICAgICAgc2VsZi5pbmZvKCJEb2luZyBnaXQgY2xvbmUgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJnaXQgY2xvbmUgLS1xdWlldCAlcyAlcyIgJSAodXJsLCBmaWxlbmFtZSkpCgogICAgICAgIGlmIHJldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5pbmZvKCJDaGVja2luZyBvdXQgJXMiLCByZXYpCiAgICAgICAgICAgIG9zLnN5c3RlbSgiKGNkICVzICYmIGdpdCBjaGVja291dCAtLXF1aWV0ICVzKSIgJSAoCiAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgIHJldiwKICAgICAgICAgICAgKSkKCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9kb3dubG9hZF9oZyhzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnNwbGl0KCcjJywgMSlbMF0KICAgICAgICB1cmwsIHJldiA9IHNlbGYuX3Zjc19zcGxpdF9yZXZfZnJvbV91cmwodXJsLCBwb3BfcHJlZml4PVRydWUpCgogICAgICAgIHNlbGYuaW5mbygiRG9pbmcgaGcgY2xvbmUgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJoZyBjbG9uZSAtLXF1aWV0ICVzICVzIiAlICh1cmwsIGZpbGVuYW1lKSkKCiAgICAgICAgaWYgcmV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmluZm8oIlVwZGF0aW5nIHRvICVzIiwgcmV2KQogICAgICAgICAgICBvcy5zeXN0ZW0oIihjZCAlcyAmJiBoZyB1cCAtQyAtciAlcyAtcSkiICUgKAogICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICByZXYsCiAgICAgICAgICAgICkpCgogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuZGVidWcobXNnLCAqYXJncykKCiAgICBkZWYgaW5mbyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuaW5mbyhtc2csICphcmdzKQoKICAgIGRlZiB3YXJuKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy53YXJuKG1zZywgKmFyZ3MpCgoKIyBUaGlzIHBhdHRlcm4gbWF0Y2hlcyBhIGNoYXJhY3RlciBlbnRpdHkgcmVmZXJlbmNlIChhIGRlY2ltYWwgbnVtZXJpYwojIHJlZmVyZW5jZXMsIGEgaGV4YWRlY2ltYWwgbnVtZXJpYyByZWZlcmVuY2UsIG9yIGEgbmFtZWQgcmVmZXJlbmNlKS4KZW50aXR5X3N1YiA9IHJlLmNvbXBpbGUocicmKCMoXGQrfHhbXGRhLWZBLUZdKyl8W1x3LjotXSspOz8nKS5zdWIKCgpkZWYgdWNocihjKToKICAgIGlmIG5vdCBpc2luc3RhbmNlKGMsIGludCk6CiAgICAgICAgcmV0dXJuIGMKICAgIGlmIGMgPiAyNTU6CiAgICAgICAgcmV0dXJuIHNpeC51bmljaHIoYykKICAgIHJldHVybiBjaHIoYykKCgpkZWYgZGVjb2RlX2VudGl0eShtYXRjaCk6CiAgICB3aGF0ID0gbWF0Y2guZ3JvdXAoMSkKICAgIGlmIHdoYXQuc3RhcnRzd2l0aCgnI3gnKToKICAgICAgICB3aGF0ID0gaW50KHdoYXRbMjpdLCAxNikKICAgIGVsaWYgd2hhdC5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgd2hhdCA9IGludCh3aGF0WzE6XSkKICAgIGVsc2U6CiAgICAgICAgd2hhdCA9IHNpeC5tb3Zlcy5odG1sX2VudGl0aWVzLm5hbWUyY29kZXBvaW50LmdldCh3aGF0LCBtYXRjaC5ncm91cCgwKSkKICAgIHJldHVybiB1Y2hyKHdoYXQpCgoKZGVmIGh0bWxkZWNvZGUodGV4dCk6CiAgICAiIiJEZWNvZGUgSFRNTCBlbnRpdGllcyBpbiB0aGUgZ2l2ZW4gdGV4dC4iIiIKICAgIHJldHVybiBlbnRpdHlfc3ViKGRlY29kZV9lbnRpdHksIHRleHQpCgoKZGVmIHNvY2tldF90aW1lb3V0KHRpbWVvdXQ9MTUpOgogICAgZGVmIF9zb2NrZXRfdGltZW91dChmdW5jKToKICAgICAgICBkZWYgX3NvY2tldF90aW1lb3V0KCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIG9sZF90aW1lb3V0ID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkKCiAgICAgICAgcmV0dXJuIF9zb2NrZXRfdGltZW91dAoKICAgIHJldHVybiBfc29ja2V0X3RpbWVvdXQKCgpkZWYgX2VuY29kZV9hdXRoKGF1dGgpOgogICAgIiIiCiAgICBBIGZ1bmN0aW9uIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLTMuMyB0aGF0IHdpbGwgZW5jb2RlCiAgICBhdXRoIGZyb20gYSBVUkwgc3VpdGFibGUgZm9yIGFuIEhUVFAgaGVhZGVyLgogICAgPj4+IHN0cihfZW5jb2RlX2F1dGgoJ3VzZXJuYW1lJTNBcGFzc3dvcmQnKSkKICAgICdkWE5sY201aGJXVTZjR0Z6YzNkdmNtUT0nCgogICAgTG9uZyBhdXRoIHN0cmluZ3Mgc2hvdWxkIG5vdCBjYXVzZSBhIG5ld2xpbmUgdG8gYmUgaW5zZXJ0ZWQuCiAgICA+Pj4gbG9uZ19hdXRoID0gJ3VzZXJuYW1lOicgKyAncGFzc3dvcmQnKjEwCiAgICA+Pj4gY2hyKDEwKSBpbiBzdHIoX2VuY29kZV9hdXRoKGxvbmdfYXV0aCkpCiAgICBGYWxzZQogICAgIiIiCiAgICBhdXRoX3MgPSB1cmxsaWIucGFyc2UudW5xdW90ZShhdXRoKQogICAgIyBjb252ZXJ0IHRvIGJ5dGVzCiAgICBhdXRoX2J5dGVzID0gYXV0aF9zLmVuY29kZSgpCiAgICAjIHVzZSB0aGUgbGVnYWN5IGludGVyZmFjZSBmb3IgUHl0aG9uIDIuMyBzdXBwb3J0CiAgICBlbmNvZGVkX2J5dGVzID0gYmFzZTY0LmVuY29kZXN0cmluZyhhdXRoX2J5dGVzKQogICAgIyBjb252ZXJ0IGJhY2sgdG8gYSBzdHJpbmcKICAgIGVuY29kZWQgPSBlbmNvZGVkX2J5dGVzLmRlY29kZSgpCiAgICAjIHN0cmlwIHRoZSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4KICAgIHJldHVybiBlbmNvZGVkLnJlcGxhY2UoJ1xuJywgJycpCgoKY2xhc3MgQ3JlZGVudGlhbChvYmplY3QpOgogICAgIiIiCiAgICBBIHVzZXJuYW1lL3Bhc3N3b3JkIHBhaXIuIFVzZSBsaWtlIGEgbmFtZWR0dXBsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VybmFtZSwgcGFzc3dvcmQpOgogICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICB5aWVsZCBzZWxmLnVzZXJuYW1lCiAgICAgICAgeWllbGQgc2VsZi5wYXNzd29yZAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJSh1c2VybmFtZSlzOiUocGFzc3dvcmQpcycgJSB2YXJzKHNlbGYpCgoKY2xhc3MgUHlQSUNvbmZpZyhjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIGZyb20gfi8ucHlwaXJjCiAgICAgICAgIiIiCiAgICAgICAgZGVmYXVsdHMgPSBkaWN0LmZyb21rZXlzKFsndXNlcm5hbWUnLCAncGFzc3dvcmQnLCAncmVwb3NpdG9yeSddLCAnJykKICAgICAgICBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyLl9faW5pdF9fKHNlbGYsIGRlZmF1bHRzKQoKICAgICAgICByYyA9IG9zLnBhdGguam9pbihvcy5wYXRoLmV4cGFuZHVzZXIoJ34nKSwgJy5weXBpcmMnKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJjKToKICAgICAgICAgICAgc2VsZi5yZWFkKHJjKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNyZWRzX2J5X3JlcG9zaXRvcnkoc2VsZik6CiAgICAgICAgc2VjdGlvbnNfd2l0aF9yZXBvc2l0b3JpZXMgPSBbCiAgICAgICAgICAgIHNlY3Rpb24gZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9ucygpCiAgICAgICAgICAgIGlmIHNlbGYuZ2V0KHNlY3Rpb24sICdyZXBvc2l0b3J5Jykuc3RyaXAoKQogICAgICAgIF0KCiAgICAgICAgcmV0dXJuIGRpY3QobWFwKHNlbGYuX2dldF9yZXBvX2NyZWQsIHNlY3Rpb25zX3dpdGhfcmVwb3NpdG9yaWVzKSkKCiAgICBkZWYgX2dldF9yZXBvX2NyZWQoc2VsZiwgc2VjdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0KHNlY3Rpb24sICdyZXBvc2l0b3J5Jykuc3RyaXAoKQogICAgICAgIHJldHVybiByZXBvLCBDcmVkZW50aWFsKAogICAgICAgICAgICBzZWxmLmdldChzZWN0aW9uLCAndXNlcm5hbWUnKS5zdHJpcCgpLAogICAgICAgICAgICBzZWxmLmdldChzZWN0aW9uLCAncGFzc3dvcmQnKS5zdHJpcCgpLAogICAgICAgICkKCiAgICBkZWYgZmluZF9jcmVkZW50aWFsKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgdGhlIFVSTCBpbmRpY2F0ZWQgYXBwZWFycyB0byBiZSBhIHJlcG9zaXRvcnkgZGVmaW5lZCBpbiB0aGlzCiAgICAgICAgY29uZmlnLCByZXR1cm4gdGhlIGNyZWRlbnRpYWwgZm9yIHRoYXQgcmVwb3NpdG9yeS4KICAgICAgICAiIiIKICAgICAgICBmb3IgcmVwb3NpdG9yeSwgY3JlZCBpbiBzZWxmLmNyZWRzX2J5X3JlcG9zaXRvcnkuaXRlbXMoKToKICAgICAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgocmVwb3NpdG9yeSk6CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlZAoKCmRlZiBvcGVuX3dpdGhfYXV0aCh1cmwsIG9wZW5lcj11cmxsaWIucmVxdWVzdC51cmxvcGVuKToKICAgICIiIk9wZW4gYSB1cmxsaWIyIHJlcXVlc3QsIGhhbmRsaW5nIEhUVFAgYXV0aGVudGljYXRpb24iIiIKCiAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCgogICAgIyBEb3VibGUgc2NoZW1lIGRvZXMgbm90IHJhaXNlIG9uIE1hYyBPUyBYIGFzIHJldmVhbGVkIGJ5IGEKICAgICMgZmFpbGluZyB0ZXN0LiBXZSB3b3VsZCBleHBlY3QgIm5vbm51bWVyaWMgcG9ydCIuIFJlZnMgIzIwLgogICAgaWYgbmV0bG9jLmVuZHN3aXRoKCc6Jyk6CiAgICAgICAgcmFpc2UgaHR0cF9jbGllbnQuSW52YWxpZFVSTCgibm9ubnVtZXJpYyBwb3J0OiAnJyIpCgogICAgaWYgc2NoZW1lIGluICgnaHR0cCcsICdodHRwcycpOgogICAgICAgIGF1dGgsIGhvc3QgPSBzcGxpdHVzZXIobmV0bG9jKQogICAgZWxzZToKICAgICAgICBhdXRoID0gTm9uZQoKICAgIGlmIG5vdCBhdXRoOgogICAgICAgIGNyZWQgPSBQeVBJQ29uZmlnKCkuZmluZF9jcmVkZW50aWFsKHVybCkKICAgICAgICBpZiBjcmVkOgogICAgICAgICAgICBhdXRoID0gc3RyKGNyZWQpCiAgICAgICAgICAgIGluZm8gPSBjcmVkLnVzZXJuYW1lLCB1cmwKICAgICAgICAgICAgbG9nLmluZm8oJ0F1dGhlbnRpY2F0aW5nIGFzICVzIGZvciAlcyAoZnJvbSAucHlwaXJjKScsICppbmZvKQoKICAgIGlmIGF1dGg6CiAgICAgICAgYXV0aCA9ICJCYXNpYyAiICsgX2VuY29kZV9hdXRoKGF1dGgpCiAgICAgICAgcGFydHMgPSBzY2hlbWUsIGhvc3QsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcKICAgICAgICBuZXdfdXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCiAgICAgICAgcmVxdWVzdCA9IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3QobmV3X3VybCkKICAgICAgICByZXF1ZXN0LmFkZF9oZWFkZXIoIkF1dGhvcml6YXRpb24iLCBhdXRoKQogICAgZWxzZToKICAgICAgICByZXF1ZXN0ID0gdXJsbGliLnJlcXVlc3QuUmVxdWVzdCh1cmwpCgogICAgcmVxdWVzdC5hZGRfaGVhZGVyKCdVc2VyLUFnZW50JywgdXNlcl9hZ2VudCkKICAgIGZwID0gb3BlbmVyKHJlcXVlc3QpCgogICAgaWYgYXV0aDoKICAgICAgICAjIFB1dCBhdXRoZW50aWNhdGlvbiBpbmZvIGJhY2sgaW50byByZXF1ZXN0IFVSTCBpZiBzYW1lIGhvc3QsCiAgICAgICAgIyBzbyB0aGF0IGxpbmtzIGZvdW5kIG9uIHRoZSBwYWdlIHdpbGwgd29yawogICAgICAgIHMyLCBoMiwgcGF0aDIsIHBhcmFtMiwgcXVlcnkyLCBmcmFnMiA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShmcC51cmwpCiAgICAgICAgaWYgczIgPT0gc2NoZW1lIGFuZCBoMiA9PSBob3N0OgogICAgICAgICAgICBwYXJ0cyA9IHMyLCBuZXRsb2MsIHBhdGgyLCBwYXJhbTIsIHF1ZXJ5MiwgZnJhZzIKICAgICAgICAgICAgZnAudXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCgogICAgcmV0dXJuIGZwCgoKIyBhZGRpbmcgYSB0aW1lb3V0IHRvIGF2b2lkIGZyZWV6aW5nIHBhY2thZ2VfaW5kZXgKb3Blbl93aXRoX2F1dGggPSBzb2NrZXRfdGltZW91dChfU09DS0VUX1RJTUVPVVQpKG9wZW5fd2l0aF9hdXRoKQoKCmRlZiBmaXhfc2ZfdXJsKHVybCk6CiAgICByZXR1cm4gdXJsICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKCgpkZWYgbG9jYWxfb3Blbih1cmwpOgogICAgIiIiUmVhZCBhIGxvY2FsIHBhdGgsIHdpdGggc3BlY2lhbCBzdXBwb3J0IGZvciBkaXJlY3RvcmllcyIiIgogICAgc2NoZW1lLCBzZXJ2ZXIsIHBhdGgsIHBhcmFtLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICBmaWxlbmFtZSA9IHVybGxpYi5yZXF1ZXN0LnVybDJwYXRobmFtZShwYXRoKQogICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgogICAgICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC51cmxvcGVuKHVybCkKICAgIGVsaWYgcGF0aC5lbmRzd2l0aCgnLycpIGFuZCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKICAgICAgICBmaWxlcyA9IFtdCiAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcihmaWxlbmFtZSk6CiAgICAgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGZpbGVuYW1lLCBmKQogICAgICAgICAgICBpZiBmID09ICdpbmRleC5odG1sJzoKICAgICAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCwgJ3InKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICBib2R5ID0gZnAucmVhZCgpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZmlsZXBhdGgpOgogICAgICAgICAgICAgICAgZiArPSAnLycKICAgICAgICAgICAgZmlsZXMuYXBwZW5kKCc8YSBocmVmPSJ7bmFtZX0iPntuYW1lfTwvYT4nLmZvcm1hdChuYW1lPWYpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICAgICAiPGh0bWw+PGhlYWQ+PHRpdGxlPnt1cmx9PC90aXRsZT4iCiAgICAgICAgICAgICAgICAiPC9oZWFkPjxib2R5PntmaWxlc308L2JvZHk+PC9odG1sPiIpCiAgICAgICAgICAgIGJvZHkgPSB0bXBsLmZvcm1hdCh1cmw9dXJsLCBmaWxlcz0nXG4nLmpvaW4oZmlsZXMpKQogICAgICAgIHN0YXR1cywgbWVzc2FnZSA9IDIwMCwgIk9LIgogICAgZWxzZToKICAgICAgICBzdGF0dXMsIG1lc3NhZ2UsIGJvZHkgPSA0MDQsICJQYXRoIG5vdCBmb3VuZCIsICJOb3QgZm91bmQiCgogICAgaGVhZGVycyA9IHsnY29udGVudC10eXBlJzogJ3RleHQvaHRtbCd9CiAgICBib2R5X3N0cmVhbSA9IHNpeC5TdHJpbmdJTyhib2R5KQogICAgcmV0dXJuIHVybGxpYi5lcnJvci5IVFRQRXJyb3IodXJsLCBzdGF0dXMsIG1lc3NhZ2UsIGhlYWRlcnMsIGJvZHlfc3RyZWFtKQpQSwMEFAAAAAAAAAAhAOXm6L6CKgAAgioAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9wZXA0MjV0YWdzLnB5IyBUaGlzIGZpbGUgb3JpZ2luYWxseSBmcm9tIHBpcDoKIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvYmxvYi84ZjRmMTVhNWE5NWQ3ZDViNTExY2VhZWU5ZWQyNjExNzZjMTgxOTcwL3NyYy9waXAvX2ludGVybmFsL3BlcDQyNXRhZ3MucHkKIiIiR2VuZXJhdGUgYW5kIHdvcmsgd2l0aCBQRVAgNDI1IENvbXBhdGliaWxpdHkgVGFncy4iIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBkaXN0dXRpbHMudXRpbAppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHN5c2NvbmZpZwppbXBvcnQgd2FybmluZ3MKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKCmZyb20gLiBpbXBvcnQgZ2xpYmMKCl9vc3hfYXJjaF9wYXQgPSByZS5jb21waWxlKHInKC4rKV8oXGQrKV8oXGQrKV8oLispJykKCgpkZWYgZ2V0X2NvbmZpZ192YXIodmFyKToKICAgIHRyeToKICAgICAgICByZXR1cm4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKHZhcikKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6ICAjIElzc3VlICMxMDc0CiAgICAgICAgd2FybmluZ3Mud2Fybigie30iLmZvcm1hdChlKSwgUnVudGltZVdhcm5pbmcpCiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgZ2V0X2FiYnJfaW1wbCgpOgogICAgIiIiUmV0dXJuIGFiYnJldmlhdGVkIGltcGxlbWVudGF0aW9uIG5hbWUuIiIiCiAgICBpZiBoYXNhdHRyKHN5cywgJ3B5cHlfdmVyc2lvbl9pbmZvJyk6CiAgICAgICAgcHlpbXBsID0gJ3BwJwogICAgZWxpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgICAgIHB5aW1wbCA9ICdqeScKICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICdjbGknOgogICAgICAgIHB5aW1wbCA9ICdpcCcKICAgIGVsc2U6CiAgICAgICAgcHlpbXBsID0gJ2NwJwogICAgcmV0dXJuIHB5aW1wbAoKCmRlZiBnZXRfaW1wbF92ZXIoKToKICAgICIiIlJldHVybiBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uLiIiIgogICAgaW1wbF92ZXIgPSBnZXRfY29uZmlnX3ZhcigicHlfdmVyc2lvbl9ub2RvdCIpCiAgICBpZiBub3QgaW1wbF92ZXIgb3IgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgaW1wbF92ZXIgPSAnJy5qb2luKG1hcChzdHIsIGdldF9pbXBsX3ZlcnNpb25faW5mbygpKSkKICAgIHJldHVybiBpbXBsX3ZlcgoKCmRlZiBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKToKICAgICIiIlJldHVybiBzeXMudmVyc2lvbl9pbmZvLWxpa2UgdHVwbGUgZm9yIHVzZSBpbiBkZWNyZW1lbnRpbmcgdGhlIG1pbm9yCiAgICB2ZXJzaW9uLiIiIgogICAgaWYgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgIyBhcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8yODgyCiAgICAgICAgcmV0dXJuIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMucHlweV92ZXJzaW9uX2luZm8ubWFqb3IsCiAgICAgICAgICAgICAgICBzeXMucHlweV92ZXJzaW9uX2luZm8ubWlub3IpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdCgoKZGVmIGdldF9pbXBsX3RhZygpOgogICAgIiIiCiAgICBSZXR1cm5zIHRoZSBUYWcgZm9yIHRoaXMgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCiAgICAiIiIKICAgIHJldHVybiAie317fSIuZm9ybWF0KGdldF9hYmJyX2ltcGwoKSwgZ2V0X2ltcGxfdmVyKCkpCgoKZGVmIGdldF9mbGFnKHZhciwgZmFsbGJhY2ssIGV4cGVjdGVkPVRydWUsIHdhcm49VHJ1ZSk6CiAgICAiIiJVc2UgYSBmYWxsYmFjayBtZXRob2QgZm9yIGRldGVybWluaW5nIFNPQUJJIGZsYWdzIGlmIHRoZSBuZWVkZWQgY29uZmlnCiAgICB2YXIgaXMgdW5zZXQgb3IgdW5hdmFpbGFibGUuIiIiCiAgICB2YWwgPSBnZXRfY29uZmlnX3Zhcih2YXIpCiAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICBpZiB3YXJuOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb25maWcgdmFyaWFibGUgJ3swfScgaXMgdW5zZXQsIFB5dGhvbiBBQkkgdGFnIG1heSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIGluY29ycmVjdCIuZm9ybWF0KHZhciksIFJ1bnRpbWVXYXJuaW5nLCAyKQogICAgICAgIHJldHVybiBmYWxsYmFjaygpCiAgICByZXR1cm4gdmFsID09IGV4cGVjdGVkCgoKZGVmIGdldF9hYmlfdGFnKCk6CiAgICAiIiJSZXR1cm4gdGhlIEFCSSB0YWcgYmFzZWQgb24gU09BQkkgKGlmIGF2YWlsYWJsZSkgb3IgZW11bGF0ZSBTT0FCSQogICAgKENQeXRob24gMiwgUHlQeSkuIiIiCiAgICBzb2FiaSA9IGdldF9jb25maWdfdmFyKCdTT0FCSScpCiAgICBpbXBsID0gZ2V0X2FiYnJfaW1wbCgpCiAgICBpZiBub3Qgc29hYmkgYW5kIGltcGwgaW4geydjcCcsICdwcCd9IGFuZCBoYXNhdHRyKHN5cywgJ21heHVuaWNvZGUnKToKICAgICAgICBkID0gJycKICAgICAgICBtID0gJycKICAgICAgICB1ID0gJycKICAgICAgICBpZiBnZXRfZmxhZygnUHlfREVCVUcnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50JyksCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIGQgPSAnZCcKICAgICAgICBpZiBnZXRfZmxhZygnV0lUSF9QWU1BTExPQycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBpbXBsID09ICdjcCcsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIG0gPSAnbScKICAgICAgICBpZiBnZXRfZmxhZygnUHlfVU5JQ09ERV9TSVpFJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHN5cy5tYXh1bmljb2RlID09IDB4MTBmZmZmLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPTQsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMykpKSBcCiAgICAgICAgICAgICAgICBhbmQgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgICAgICAgICAgdSA9ICd1JwogICAgICAgIGFiaSA9ICclcyVzJXMlcyVzJyAlIChpbXBsLCBnZXRfaW1wbF92ZXIoKSwgZCwgbSwgdSkKICAgIGVsaWYgc29hYmkgYW5kIHNvYWJpLnN0YXJ0c3dpdGgoJ2NweXRob24tJyk6CiAgICAgICAgYWJpID0gJ2NwJyArIHNvYWJpLnNwbGl0KCctJylbMV0KICAgIGVsaWYgc29hYmk6CiAgICAgICAgYWJpID0gc29hYmkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGVsc2U6CiAgICAgICAgYWJpID0gTm9uZQogICAgcmV0dXJuIGFiaQoKCmRlZiBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgcmV0dXJuIHN5cy5tYXhzaXplID09IDIxNDc0ODM2NDcKCgpkZWYgZ2V0X3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gb3VyIHBsYXRmb3JtIG5hbWUgJ3dpbjMyJywgJ2xpbnV4X3g4Nl82NCciIiIKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAjIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIHJldHVybnMgdGhlIHJlbGVhc2UgYmFzZWQgb24gdGhlIHZhbHVlCiAgICAgICAgIyBvZiBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgb24gd2hpY2ggUHl0aG9uIHdhcyBidWlsdCwgd2hpY2ggbWF5CiAgICAgICAgIyBiZSBzaWduaWZpY2FudGx5IG9sZGVyIHRoYW4gdGhlIHVzZXIncyBjdXJyZW50IG1hY2hpbmUuCiAgICAgICAgcmVsZWFzZSwgXywgbWFjaGluZSA9IHBsYXRmb3JtLm1hY192ZXIoKQogICAgICAgIHNwbGl0X3ZlciA9IHJlbGVhc2Uuc3BsaXQoJy4nKQoKICAgICAgICBpZiBtYWNoaW5lID09ICJ4ODZfNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICAgICBtYWNoaW5lID0gImkzODYiCiAgICAgICAgZWxpZiBtYWNoaW5lID09ICJwcGM2NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgICAgIG1hY2hpbmUgPSAicHBjIgoKICAgICAgICByZXR1cm4gJ21hY29zeF97fV97fV97fScuZm9ybWF0KHNwbGl0X3ZlclswXSwgc3BsaXRfdmVyWzFdLCBtYWNoaW5lKQoKICAgICMgWFhYIHJlbW92ZSBkaXN0dXRpbHMgZGVwZW5kZW5jeQogICAgcmVzdWx0ID0gZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGlmIHJlc3VsdCA9PSAibGludXhfeDg2XzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAjIDMyIGJpdCBQeXRob24gcHJvZ3JhbSAocnVubmluZyBvbiBhIDY0IGJpdCBMaW51eCk6IHBpcCBzaG91bGQgb25seQogICAgICAgICMgaW5zdGFsbCBhbmQgcnVuIDMyIGJpdCBjb21waWxlZCBleHRlbnNpb25zIGluIHRoYXQgY2FzZS4KICAgICAgICByZXN1bHQgPSAibGludXhfaTY4NiIKCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIGlzX21hbnlsaW51eDFfY29tcGF0aWJsZSgpOgogICAgIyBPbmx5IExpbnV4LCBhbmQgb25seSB4ODYtNjQgLyBpNjg2CiAgICBpZiBnZXRfcGxhdGZvcm0oKSBub3QgaW4geyJsaW51eF94ODZfNjQiLCAibGludXhfaTY4NiJ9OgogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgQ2hlY2sgZm9yIHByZXNlbmNlIG9mIF9tYW55bGludXggbW9kdWxlCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IF9tYW55bGludXgKICAgICAgICByZXR1cm4gYm9vbChfbWFueWxpbnV4Lm1hbnlsaW51eDFfY29tcGF0aWJsZSkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAjIEZhbGwgdGhyb3VnaCB0byBoZXVyaXN0aWMgY2hlY2sgYmVsb3cKICAgICAgICBwYXNzCgogICAgIyBDaGVjayBnbGliYyB2ZXJzaW9uLiBDZW50T1MgNSB1c2VzIGdsaWJjIDIuNS4KICAgIHJldHVybiBnbGliYy5oYXZlX2NvbXBhdGlibGVfZ2xpYmMoMiwgNSkKCgpkZWYgZ2V0X2Rhcndpbl9hcmNoZXMobWFqb3IsIG1pbm9yLCBtYWNoaW5lKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGFyY2hlcyAoaW5jbHVkaW5nIGdyb3VwIGFyY2hlcykgZm9yCiAgICB0aGUgZ2l2ZW4gbWFqb3IsIG1pbm9yIGFuZCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBvZiBhbiBtYWNPUyBtYWNoaW5lLgogICAgIiIiCiAgICBhcmNoZXMgPSBbXQoKICAgIGRlZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGFyY2gpOgogICAgICAgICMgTG9va2luZyBhdCB0aGUgYXBwbGljYXRpb24gc3VwcG9ydCBmb3IgbWFjT1MgdmVyc2lvbnMgaW4gdGhlIGNoYXJ0CiAgICAgICAgIyBwcm92aWRlZCBieSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PU19YI1ZlcnNpb25zIGl0IGFwcGVhcnMKICAgICAgICAjIG91ciB0aW1lbGluZSBsb29rcyByb3VnaGx5IGxpa2U6CiAgICAgICAgIwogICAgICAgICMgMTAuMCAtIEludHJvZHVjZXMgcHBjIHN1cHBvcnQuCiAgICAgICAgIyAxMC40IC0gSW50cm9kdWNlcyBwcGM2NCwgaTM4NiwgYW5kIHg4Nl82NCBzdXBwb3J0LCBob3dldmVyIHRoZSBwcGM2NAogICAgICAgICMgICAgICAgIGFuZCB4ODZfNjQgc3VwcG9ydCBpcyBDTEkgb25seSwgYW5kIGNhbm5vdCBiZSB1c2VkIGZvciBHVUkKICAgICAgICAjICAgICAgICBhcHBsaWNhdGlvbnMuCiAgICAgICAgIyAxMC41IC0gRXh0ZW5kcyBwcGM2NCBhbmQgeDg2XzY0IHN1cHBvcnQgdG8gY292ZXIgR1VJIGFwcGxpY2F0aW9ucy4KICAgICAgICAjIDEwLjYgLSBEcm9wcyBzdXBwb3J0IGZvciBwcGM2NAogICAgICAgICMgMTAuNyAtIERyb3BzIHN1cHBvcnQgZm9yIHBwYwogICAgICAgICMKICAgICAgICAjIEdpdmVuIHRoYXQgd2UgZG8gbm90IGtub3cgaWYgd2UncmUgaW5zdGFsbGluZyBhIENMSSBvciBhIEdVSQogICAgICAgICMgYXBwbGljYXRpb24sIHdlIG11c3QgYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgaXQgbWlnaHQgYmUgYSBHVUkKICAgICAgICAjIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgcHBjNjQgYW5kIHg4Nl82NCBzdXBwb3J0IGRpZCBub3Qgb2NjdXIKICAgICAgICAjIHVudGlsIDEwLjUuCiAgICAgICAgIwogICAgICAgICMgTm90ZTogVGhlIGFib3ZlIGluZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlICJBcHBsaWNhdGlvbiBzdXBwb3J0IgogICAgICAgICMgICAgICAgY29sdW1uIGluIHRoZSBjaGFydCBub3QgdGhlICJQcm9jZXNzb3Igc3VwcG9ydCIgc2luY2UgSSBiZWxpZXZlCiAgICAgICAgIyAgICAgICB0aGF0IHdlIGNhcmUgYWJvdXQgd2hhdCBpbnN0cnVjdGlvbiBzZXRzIGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UKICAgICAgICAjICAgICAgIG5vdCB3aGljaCBwcm9jZXNzb3JzIHRoZSBPUyBzdXBwb3J0cy4KICAgICAgICBpZiBhcmNoID09ICdwcGMnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPD0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggPT0gJ3BwYzY0JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID09ICgxMCwgNSkKICAgICAgICBpZiBhcmNoID09ICdpMzg2JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgxMCwgNCkKICAgICAgICBpZiBhcmNoID09ICd4ODZfNjQnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPj0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggaW4gZ3JvdXBzOgogICAgICAgICAgICBmb3IgZ2FyY2ggaW4gZ3JvdXBzW2FyY2hdOgogICAgICAgICAgICAgICAgaWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBnYXJjaCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBncm91cHMgPSBPcmRlcmVkRGljdChbCiAgICAgICAgKCJmYXQiLCAoImkzODYiLCAicHBjIikpLAogICAgICAgICgiaW50ZWwiLCAoIng4Nl82NCIsICJpMzg2IikpLAogICAgICAgICgiZmF0NjQiLCAoIng4Nl82NCIsICJwcGM2NCIpKSwKICAgICAgICAoImZhdDMyIiwgKCJ4ODZfNjQiLCAiaTM4NiIsICJwcGMiKSksCiAgICBdKQoKICAgIGlmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgbWFjaGluZSk6CiAgICAgICAgYXJjaGVzLmFwcGVuZChtYWNoaW5lKQoKICAgIGZvciBnYXJjaCBpbiBncm91cHM6CiAgICAgICAgaWYgbWFjaGluZSBpbiBncm91cHNbZ2FyY2hdIGFuZCBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGdhcmNoKToKICAgICAgICAgICAgYXJjaGVzLmFwcGVuZChnYXJjaCkKCiAgICBhcmNoZXMuYXBwZW5kKCd1bml2ZXJzYWwnKQoKICAgIHJldHVybiBhcmNoZXMKCgpkZWYgZ2V0X3N1cHBvcnRlZCh2ZXJzaW9ucz1Ob25lLCBub2FyY2g9RmFsc2UsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgICAgICAgIGltcGw9Tm9uZSwgYWJpPU5vbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdGFncyBmb3IgZWFjaCB2ZXJzaW9uIHNwZWNpZmllZCBpbgogICAgYHZlcnNpb25zYC4KCiAgICA6cGFyYW0gdmVyc2lvbnM6IGEgbGlzdCBvZiBzdHJpbmcgdmVyc2lvbnMsIG9mIHRoZSBmb3JtIFsiMzMiLCAiMzIiXSwKICAgICAgICBvciBOb25lLiBUaGUgZmlyc3QgdmVyc2lvbiB3aWxsIGJlIGFzc3VtZWQgdG8gc3VwcG9ydCBvdXIgQUJJLgogICAgOnBhcmFtIHBsYXRmb3JtOiBzcGVjaWZ5IHRoZSBleGFjdCBwbGF0Zm9ybSB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIHN5c3RlbSBwbGF0Zm9ybS4KICAgIDpwYXJhbSBpbXBsOiBzcGVjaWZ5IHRoZSBleGFjdCBpbXBsZW1lbnRhdGlvbiB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIGludGVycHJldGVyIGltcGwuCiAgICA6cGFyYW0gYWJpOiBzcGVjaWZ5IHRoZSBleGFjdCBhYmkgeW91IHdhbnQgdmFsaWQKICAgICAgICB0YWdzIGZvciwgb3IgTm9uZS4gSWYgTm9uZSwgdXNlIHRoZSBsb2NhbCBpbnRlcnByZXRlciBhYmkuCiAgICAiIiIKICAgIHN1cHBvcnRlZCA9IFtdCgogICAgIyBWZXJzaW9ucyBtdXN0IGJlIGdpdmVuIHdpdGggcmVzcGVjdCB0byB0aGUgcHJlZmVyZW5jZQogICAgaWYgdmVyc2lvbnMgaXMgTm9uZToKICAgICAgICB2ZXJzaW9ucyA9IFtdCiAgICAgICAgdmVyc2lvbl9pbmZvID0gZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkKICAgICAgICBtYWpvciA9IHZlcnNpb25faW5mb1s6LTFdCiAgICAgICAgIyBTdXBwb3J0IGFsbCBwcmV2aW91cyBtaW5vciBQeXRob24gdmVyc2lvbnMuCiAgICAgICAgZm9yIG1pbm9yIGluIHJhbmdlKHZlcnNpb25faW5mb1stMV0sIC0xLCAtMSk6CiAgICAgICAgICAgIHZlcnNpb25zLmFwcGVuZCgnJy5qb2luKG1hcChzdHIsIG1ham9yICsgKG1pbm9yLCkpKSkKCiAgICBpbXBsID0gaW1wbCBvciBnZXRfYWJicl9pbXBsKCkKCiAgICBhYmlzID0gW10KCiAgICBhYmkgPSBhYmkgb3IgZ2V0X2FiaV90YWcoKQogICAgaWYgYWJpOgogICAgICAgIGFiaXNbMDowXSA9IFthYmldCgogICAgYWJpM3MgPSBzZXQoKQogICAgaW1wb3J0IGltcAogICAgZm9yIHN1ZmZpeCBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCk6CiAgICAgICAgaWYgc3VmZml4WzBdLnN0YXJ0c3dpdGgoJy5hYmknKToKICAgICAgICAgICAgYWJpM3MuYWRkKHN1ZmZpeFswXS5zcGxpdCgnLicsIDIpWzFdKQoKICAgIGFiaXMuZXh0ZW5kKHNvcnRlZChsaXN0KGFiaTNzKSkpCgogICAgYWJpcy5hcHBlbmQoJ25vbmUnKQoKICAgIGlmIG5vdCBub2FyY2g6CiAgICAgICAgYXJjaCA9IHBsYXRmb3JtIG9yIGdldF9wbGF0Zm9ybSgpCiAgICAgICAgaWYgYXJjaC5zdGFydHN3aXRoKCdtYWNvc3gnKToKICAgICAgICAgICAgIyBzdXBwb3J0IG1hY29zeC0xMC42LWludGVsIG9uIG1hY29zeC0xMC45LXg4Nl82NAogICAgICAgICAgICBtYXRjaCA9IF9vc3hfYXJjaF9wYXQubWF0Y2goYXJjaCkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBuYW1lLCBtYWpvciwgbWlub3IsIGFjdHVhbF9hcmNoID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgICAgIHRwbCA9ICd7fV97fV8laV8lcycuZm9ybWF0KG5hbWUsIG1ham9yKQogICAgICAgICAgICAgICAgYXJjaGVzID0gW10KICAgICAgICAgICAgICAgIGZvciBtIGluIHJldmVyc2VkKHJhbmdlKGludChtaW5vcikgKyAxKSk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gZ2V0X2Rhcndpbl9hcmNoZXMoaW50KG1ham9yKSwgbSwgYWN0dWFsX2FyY2gpOgogICAgICAgICAgICAgICAgICAgICAgICBhcmNoZXMuYXBwZW5kKHRwbCAlIChtLCBhKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgYXJjaCBwYXR0ZXJuIGRpZG4ndCBtYXRjaCAoPyEpCiAgICAgICAgICAgICAgICBhcmNoZXMgPSBbYXJjaF0KICAgICAgICBlbGlmIHBsYXRmb3JtIGlzIE5vbmUgYW5kIGlzX21hbnlsaW51eDFfY29tcGF0aWJsZSgpOgogICAgICAgICAgICBhcmNoZXMgPSBbYXJjaC5yZXBsYWNlKCdsaW51eCcsICdtYW55bGludXgxJyksIGFyY2hdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaGVzID0gW2FyY2hdCgogICAgICAgICMgQ3VycmVudCB2ZXJzaW9uLCBjdXJyZW50IEFQSSAoYnVpbHQgc3BlY2lmaWNhbGx5IGZvciBvdXIgUHl0aG9uKToKICAgICAgICBmb3IgYWJpIGluIGFiaXM6CiAgICAgICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXSksIGFiaSwgYXJjaCkpCgogICAgICAgICMgYWJpMyBtb2R1bGVzIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9uIG9mIFB5dGhvbgogICAgICAgIGZvciB2ZXJzaW9uIGluIHZlcnNpb25zWzE6XToKICAgICAgICAgICAgIyBhYmkzIHdhcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjIKICAgICAgICAgICAgaWYgdmVyc2lvbiBpbiB7JzMxJywgJzMwJ306CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBmb3IgYWJpIGluIGFiaTNzOiAgICMgZW1wdHkgc2V0IGlmIG5vdCBQeXRob24gMwogICAgICAgICAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCIlcyVzIiAlIChpbXBsLCB2ZXJzaW9uKSwgYWJpLCBhcmNoKSkKCiAgICAgICAgIyBIYXMgYmluYXJpZXMsIGRvZXMgbm90IHVzZSB0aGUgUHl0aG9uIEFQSToKICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uc1swXVswXSksICdub25lJywgYXJjaCkpCgogICAgIyBObyBhYmkgLyBhcmNoLCBidXQgcmVxdWlyZXMgb3VyIGltcGxlbWVudGF0aW9uOgogICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdKSwgJ25vbmUnLCAnYW55JykpCiAgICAjIFRhZ2dlZCBzcGVjaWZpY2FsbHkgYXMgYmVpbmcgY3Jvc3MtdmVyc2lvbiBjb21wYXRpYmxlCiAgICAjICh3aXRoIGp1c3QgdGhlIG1ham9yIHZlcnNpb24gc3BlY2lmaWVkKQogICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCAnYW55JykpCgogICAgIyBObyBhYmkgLyBhcmNoLCBnZW5lcmljIFB5dGhvbgogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvbiwpLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uWzBdKSwgJ25vbmUnLCAnYW55JykpCgogICAgcmV0dXJuIHN1cHBvcnRlZAoKCmltcGxlbWVudGF0aW9uX3RhZyA9IGdldF9pbXBsX3RhZygpClBLAwQUAAAAAAAAACEAsmanVxgCAAAYAgAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5Mjdjb21wYXQucHkiIiIKQ29tcGF0aWJpbGl0eSBTdXBwb3J0IGZvciBQeXRob24gMi43IGFuZCBlYXJsaWVyCiIiIgoKaW1wb3J0IHBsYXRmb3JtCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCgpkZWYgZ2V0X2FsbF9oZWFkZXJzKG1lc3NhZ2UsIGtleSk6CiAgICAiIiIKICAgIEdpdmVuIGFuIEhUVFBNZXNzYWdlLCByZXR1cm4gYWxsIGhlYWRlcnMgbWF0Y2hpbmcgYSBnaXZlbiBrZXkuCiAgICAiIiIKICAgIHJldHVybiBtZXNzYWdlLmdldF9hbGwoa2V5KQoKCmlmIHNpeC5QWTI6CiAgICBkZWYgZ2V0X2FsbF9oZWFkZXJzKG1lc3NhZ2UsIGtleSk6CiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0aGVhZGVycyhrZXkpCgoKbGludXhfcHkyX2FzY2lpID0gKAogICAgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0xpbnV4JyBhbmQKICAgIHNpeC5QWTIKKQoKcm10cmVlX3NhZmUgPSBzdHIgaWYgbGludXhfcHkyX2FzY2lpIGVsc2UgbGFtYmRhIHg6IHgKIiIiV29ya2Fyb3VuZCBmb3IgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI0NjcyIiIiClBLAwQUAAAAAAAAACEA0LlIWqgEAACoBAAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzFjb21wYXQucHlfX2FsbF9fID0gWydnZXRfY29uZmlnX3ZhcnMnLCAnZ2V0X3BhdGgnXQoKdHJ5OgogICAgIyBQeXRob24gMi43IG9yID49My4yCiAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXJzLCBnZXRfcGF0aApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFycywgZ2V0X3B5dGhvbl9saWIKCiAgICBkZWYgZ2V0X3BhdGgobmFtZSk6CiAgICAgICAgaWYgbmFtZSBub3QgaW4gKCdwbGF0bGliJywgJ3B1cmVsaWInKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTmFtZSBtdXN0IGJlIHB1cmVsaWIgb3IgcGxhdGxpYiIpCiAgICAgICAgcmV0dXJuIGdldF9weXRob25fbGliKG5hbWUgPT0gJ3BsYXRsaWInKQoKCnRyeToKICAgICMgUHl0aG9uID49My4yCiAgICBmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlEaXJlY3RvcnkKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHNodXRpbAogICAgaW1wb3J0IHRlbXBmaWxlCgogICAgY2xhc3MgVGVtcG9yYXJ5RGlyZWN0b3J5KG9iamVjdCk6CiAgICAgICAgIiIiCiAgICAgICAgVmVyeSBzaW1wbGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBjb250ZXh0IG1hbmFnZXIuCiAgICAgICAgV2lsbCB0cnkgdG8gZGVsZXRlIGFmdGVyd2FyZCwgYnV0IHdpbGwgYWxzbyBpZ25vcmUgT1MgYW5kIHNpbWlsYXIKICAgICAgICBlcnJvcnMgb24gZGVsZXRpb24uCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZSAgIyBIYW5kbGUgbWtkdGVtcCByYWlzaW5nIGFuIGV4Y2VwdGlvbgogICAgICAgICAgICBzZWxmLm5hbWUgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKCiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjdHlwZSwgZXhjdmFsdWUsIGV4Y3RyYWNlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLm5hbWUsIFRydWUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiAgIyByZW1vdmFsIGVycm9ycyBhcmUgbm90IHRoZSBvbmx5IHBvc3NpYmxlCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHNlbGYubmFtZSA9IE5vbmUKUEsDBBQAAAAAAAAAIQDJYZLA5gMAAOYDAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzM2NvbXBhdC5weWltcG9ydCBkaXMKaW1wb3J0IGFycmF5CmltcG9ydCBjb2xsZWN0aW9ucwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgoKT3BBcmcgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdPcEFyZycsICdvcGNvZGUgYXJnJykKCgpjbGFzcyBCeXRlY29kZV9jb21wYXQob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlKToKICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkICcob3AsYXJnKScgcGFpciBmb3IgZWFjaCBvcGVyYXRpb24gaW4gY29kZSBvYmplY3QgJ2NvZGUnIiIiCgogICAgICAgIGJ5dGVzID0gYXJyYXkuYXJyYXkoJ2InLCBzZWxmLmNvZGUuY29fY29kZSkKICAgICAgICBlb2YgPSBsZW4oc2VsZi5jb2RlLmNvX2NvZGUpCgogICAgICAgIHB0ciA9IDAKICAgICAgICBleHRlbmRlZF9hcmcgPSAwCgogICAgICAgIHdoaWxlIHB0ciA8IGVvZjoKCiAgICAgICAgICAgIG9wID0gYnl0ZXNbcHRyXQoKICAgICAgICAgICAgaWYgb3AgPj0gZGlzLkhBVkVfQVJHVU1FTlQ6CgogICAgICAgICAgICAgICAgYXJnID0gYnl0ZXNbcHRyICsgMV0gKyBieXRlc1twdHIgKyAyXSAqIDI1NiArIGV4dGVuZGVkX2FyZwogICAgICAgICAgICAgICAgcHRyICs9IDMKCiAgICAgICAgICAgICAgICBpZiBvcCA9PSBkaXMuRVhURU5ERURfQVJHOgogICAgICAgICAgICAgICAgICAgIGxvbmdfdHlwZSA9IHNpeC5pbnRlZ2VyX3R5cGVzWy0xXQogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IGFyZyAqIGxvbmdfdHlwZSg2NTUzNikKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyZyA9IE5vbmUKICAgICAgICAgICAgICAgIHB0ciArPSAxCgogICAgICAgICAgICB5aWVsZCBPcEFyZyhvcCwgYXJnKQoKCkJ5dGVjb2RlID0gZ2V0YXR0cihkaXMsICdCeXRlY29kZScsIEJ5dGVjb2RlX2NvbXBhdCkKUEsDBBQAAAAAAAAAIQCFGZoLSwsAAEsLAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzNmNvbXBhdC5weWltcG9ydCBzeXMKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzdHJ0b2Jvb2wKZnJvbSBkaXN0dXRpbHMuZGVidWcgaW1wb3J0IERFQlVHCgoKY2xhc3MgRGlzdHJpYnV0aW9uX3BhcnNlX2NvbmZpZ19maWxlczoKICAgICIiIgogICAgTWl4LWluIHByb3ZpZGluZyBmb3J3YXJkLWNvbXBhdGliaWxpdHkgZm9yIGZ1bmN0aW9uYWxpdHkgdG8gYmUKICAgIGluY2x1ZGVkIGJ5IGRlZmF1bHQgb24gUHl0aG9uIDMuNy4KCiAgICBEbyBub3QgZWRpdCB0aGUgY29kZSBpbiB0aGlzIGNsYXNzIGV4Y2VwdCB0byB1cGRhdGUgZnVuY3Rpb25hbGl0eQogICAgYXMgaW1wbGVtZW50ZWQgaW4gZGlzdHV0aWxzLgogICAgIiIiCiAgICBkZWYgcGFyc2VfY29uZmlnX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcz1Ob25lKToKICAgICAgICBmcm9tIGNvbmZpZ3BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyCgogICAgICAgICMgSWdub3JlIGluc3RhbGwgZGlyZWN0b3J5IG9wdGlvbnMgaWYgd2UgaGF2ZSBhIHZlbnYKICAgICAgICBpZiBzeXMucHJlZml4ICE9IHN5cy5iYXNlX3ByZWZpeDoKICAgICAgICAgICAgaWdub3JlX29wdGlvbnMgPSBbCiAgICAgICAgICAgICAgICAnaW5zdGFsbC1iYXNlJywgJ2luc3RhbGwtcGxhdGJhc2UnLCAnaW5zdGFsbC1saWInLAogICAgICAgICAgICAgICAgJ2luc3RhbGwtcGxhdGxpYicsICdpbnN0YWxsLXB1cmVsaWInLCAnaW5zdGFsbC1oZWFkZXJzJywKICAgICAgICAgICAgICAgICdpbnN0YWxsLXNjcmlwdHMnLCAnaW5zdGFsbC1kYXRhJywgJ3ByZWZpeCcsICdleGVjLXByZWZpeCcsCiAgICAgICAgICAgICAgICAnaG9tZScsICd1c2VyJywgJ3Jvb3QnXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlnbm9yZV9vcHRpb25zID0gW10KCiAgICAgICAgaWdub3JlX29wdGlvbnMgPSBmcm96ZW5zZXQoaWdub3JlX29wdGlvbnMpCgogICAgICAgIGlmIGZpbGVuYW1lcyBpcyBOb25lOgogICAgICAgICAgICBmaWxlbmFtZXMgPSBzZWxmLmZpbmRfY29uZmlnX2ZpbGVzKCkKCiAgICAgICAgaWYgREVCVUc6CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIkRpc3RyaWJ1dGlvbi5wYXJzZV9jb25maWdfZmlsZXMoKToiKQoKICAgICAgICBwYXJzZXIgPSBDb25maWdQYXJzZXIoaW50ZXJwb2xhdGlvbj1Ob25lKQogICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIGlmIERFQlVHOgogICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiICByZWFkaW5nICVzIiAlIGZpbGVuYW1lKQogICAgICAgICAgICBwYXJzZXIucmVhZChmaWxlbmFtZSkKICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gcGFyc2VyLnNlY3Rpb25zKCk6CiAgICAgICAgICAgICAgICBvcHRpb25zID0gcGFyc2VyLm9wdGlvbnMoc2VjdGlvbikKICAgICAgICAgICAgICAgIG9wdF9kaWN0ID0gc2VsZi5nZXRfb3B0aW9uX2RpY3Qoc2VjdGlvbikKCiAgICAgICAgICAgICAgICBmb3Igb3B0IGluIG9wdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3B0ICE9ICdfX25hbWVfXycgYW5kIG9wdCBub3QgaW4gaWdub3JlX29wdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHBhcnNlci5nZXQoc2VjdGlvbixvcHQpCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdCA9IG9wdC5yZXBsYWNlKCctJywgJ18nKQogICAgICAgICAgICAgICAgICAgICAgICBvcHRfZGljdFtvcHRdID0gKGZpbGVuYW1lLCB2YWwpCgogICAgICAgICAgICAjIE1ha2UgdGhlIENvbmZpZ1BhcnNlciBmb3JnZXQgZXZlcnl0aGluZyAoc28gd2UgcmV0YWluCiAgICAgICAgICAgICMgdGhlIG9yaWdpbmFsIGZpbGVuYW1lcyB0aGF0IG9wdGlvbnMgY29tZSBmcm9tKQogICAgICAgICAgICBwYXJzZXIuX19pbml0X18oKQoKICAgICAgICAjIElmIHRoZXJlIHdhcyBhICJnbG9iYWwiIHNlY3Rpb24gaW4gdGhlIGNvbmZpZyBmaWxlLCB1c2UgaXQKICAgICAgICAjIHRvIHNldCBEaXN0cmlidXRpb24gb3B0aW9ucy4KCiAgICAgICAgaWYgJ2dsb2JhbCcgaW4gc2VsZi5jb21tYW5kX29wdGlvbnM6CiAgICAgICAgICAgIGZvciAob3B0LCAoc3JjLCB2YWwpKSBpbiBzZWxmLmNvbW1hbmRfb3B0aW9uc1snZ2xvYmFsJ10uaXRlbXMoKToKICAgICAgICAgICAgICAgIGFsaWFzID0gc2VsZi5uZWdhdGl2ZV9vcHQuZ2V0KG9wdCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpZiBhbGlhczoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhbGlhcywgbm90IHN0cnRvYm9vbCh2YWwpKQogICAgICAgICAgICAgICAgICAgIGVsaWYgb3B0IGluICgndmVyYm9zZScsICdkcnlfcnVuJyk6ICMgdWdoIQogICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdCwgc3RydG9ib29sKHZhbCkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHQsIHZhbCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIG1zZzoKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcihtc2cpCgoKaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCk6CiAgICAjIFB5dGhvbiAyIGJlaGF2aW9yIGlzIHN1ZmZpY2llbnQKICAgIGNsYXNzIERpc3RyaWJ1dGlvbl9wYXJzZV9jb25maWdfZmlsZXM6CiAgICAgICAgcGFzcwoKCmlmIEZhbHNlOgogICAgIyBXaGVuIHVwZGF0ZWQgYmVoYXZpb3IgaXMgYXZhaWxhYmxlIHVwc3RyZWFtLAogICAgIyBkaXNhYmxlIG92ZXJyaWRlIGhlcmUuCiAgICBjbGFzcyBEaXN0cmlidXRpb25fcGFyc2VfY29uZmlnX2ZpbGVzOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQCMU5pjxDcAAMQ3AAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2FuZGJveC5weWltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgcGlja2xlCmltcG9ydCB0ZXh0d3JhcAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBidWlsdGlucywgbWFwCgppbXBvcnQgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0CgppZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgaW1wb3J0IG9yZy5weXRob24ubW9kdWxlcy5wb3NpeC5Qb3NpeE1vZHVsZSBhcyBfb3MKZWxzZToKICAgIF9vcyA9IHN5cy5tb2R1bGVzW29zLm5hbWVdCnRyeToKICAgIF9maWxlID0gZmlsZQpleGNlcHQgTmFtZUVycm9yOgogICAgX2ZpbGUgPSBOb25lCl9vcGVuID0gb3Blbgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgd29ya2luZ19zZXQKCgpfX2FsbF9fID0gWwogICAgIkFic3RyYWN0U2FuZGJveCIsICJEaXJlY3RvcnlTYW5kYm94IiwgIlNhbmRib3hWaW9sYXRpb24iLCAicnVuX3NldHVwIiwKXQoKCmRlZiBfZXhlY2ZpbGUoZmlsZW5hbWUsIGdsb2JhbHMsIGxvY2Fscz1Ob25lKToKICAgICIiIgogICAgUHl0aG9uIDMgaW1wbGVtZW50YXRpb24gb2YgZXhlY2ZpbGUuCiAgICAiIiIKICAgIG1vZGUgPSAncmInCiAgICB3aXRoIG9wZW4oZmlsZW5hbWUsIG1vZGUpIGFzIHN0cmVhbToKICAgICAgICBzY3JpcHQgPSBzdHJlYW0ucmVhZCgpCiAgICBpZiBsb2NhbHMgaXMgTm9uZToKICAgICAgICBsb2NhbHMgPSBnbG9iYWxzCiAgICBjb2RlID0gY29tcGlsZShzY3JpcHQsIGZpbGVuYW1lLCAnZXhlYycpCiAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9hcmd2KHJlcGw9Tm9uZSk6CiAgICBzYXZlZCA9IHN5cy5hcmd2WzpdCiAgICBpZiByZXBsIGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5hcmd2WzpdID0gcmVwbAogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZWQKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9wYXRoKCk6CiAgICBzYXZlZCA9IHN5cy5wYXRoWzpdCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBvdmVycmlkZV90ZW1wKHJlcGxhY2VtZW50KToKICAgICIiIgogICAgTW9ua2V5LXBhdGNoIHRlbXBmaWxlLnRlbXBkaXIgd2l0aCByZXBsYWNlbWVudCwgZW5zdXJpbmcgaXQgZXhpc3RzCiAgICAiIiIKICAgIHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdC5tYWtlZGlycyhyZXBsYWNlbWVudCwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBzYXZlZCA9IHRlbXBmaWxlLnRlbXBkaXIKCiAgICB0ZW1wZmlsZS50ZW1wZGlyID0gcmVwbGFjZW1lbnQKCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgdGVtcGZpbGUudGVtcGRpciA9IHNhdmVkCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHB1c2hkKHRhcmdldCk6CiAgICBzYXZlZCA9IG9zLmdldGN3ZCgpCiAgICBvcy5jaGRpcih0YXJnZXQpCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2hkaXIoc2F2ZWQpCgoKY2xhc3MgVW5waWNrbGVhYmxlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICAiIiIKICAgIEFuIGV4Y2VwdGlvbiByZXByZXNlbnRpbmcgYW5vdGhlciBFeGNlcHRpb24gdGhhdCBjb3VsZCBub3QgYmUgcGlja2xlZC4KICAgICIiIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBkdW1wKHR5cGUsIGV4Yyk6CiAgICAgICAgIiIiCiAgICAgICAgQWx3YXlzIHJldHVybiBhIGR1bXBlZCAocGlja2xlZCkgdHlwZSBhbmQgZXhjLiBJZiBleGMgY2FuJ3QgYmUgcGlja2xlZCwKICAgICAgICB3cmFwIGl0IGluIFVucGlja2xlYWJsZUV4Y2VwdGlvbiBmaXJzdC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBwaWNrbGUuZHVtcHModHlwZSksIHBpY2tsZS5kdW1wcyhleGMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIyBnZXQgVW5waWNrbGVhYmxlRXhjZXB0aW9uIGluc2lkZSB0aGUgc2FuZGJveAogICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgVW5waWNrbGVhYmxlRXhjZXB0aW9uIGFzIGNscwogICAgICAgICAgICByZXR1cm4gY2xzLmR1bXAoY2xzLCBjbHMocmVwcihleGMpKSkKCgpjbGFzcyBFeGNlcHRpb25TYXZlcjoKICAgICIiIgogICAgQSBDb250ZXh0IE1hbmFnZXIgdGhhdCB3aWxsIHNhdmUgYW4gZXhjZXB0aW9uLCBzZXJpYWxpemVkLCBhbmQgcmVzdG9yZSBpdAogICAgbGF0ZXIuCiAgICAiIiIKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIGV4YywgdGIpOgogICAgICAgIGlmIG5vdCBleGM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIGR1bXAgdGhlIGV4Y2VwdGlvbgogICAgICAgIHNlbGYuX3NhdmVkID0gVW5waWNrbGVhYmxlRXhjZXB0aW9uLmR1bXAodHlwZSwgZXhjKQogICAgICAgIHNlbGYuX3RiID0gdGIKCiAgICAgICAgIyBzdXBwcmVzcyB0aGUgZXhjZXB0aW9uCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmVzdW1lKHNlbGYpOgogICAgICAgICJyZXN0b3JlIGFuZCByZS1yYWlzZSBhbnkgZXhjZXB0aW9uIgoKICAgICAgICBpZiAnX3NhdmVkJyBub3QgaW4gdmFycyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHR5cGUsIGV4YyA9IG1hcChwaWNrbGUubG9hZHMsIHNlbGYuX3NhdmVkKQogICAgICAgIHNpeC5yZXJhaXNlKHR5cGUsIGV4Yywgc2VsZi5fdGIpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfbW9kdWxlcygpOgogICAgIiIiCiAgICBDb250ZXh0IGluIHdoaWNoIGltcG9ydGVkIG1vZHVsZXMgYXJlIHNhdmVkLgoKICAgIFRyYW5zbGF0ZXMgZXhjZXB0aW9ucyBpbnRlcm5hbCB0byB0aGUgY29udGV4dCBpbnRvIHRoZSBlcXVpdmFsZW50IGV4Y2VwdGlvbgogICAgb3V0c2lkZSB0aGUgY29udGV4dC4KICAgICIiIgogICAgc2F2ZWQgPSBzeXMubW9kdWxlcy5jb3B5KCkKICAgIHdpdGggRXhjZXB0aW9uU2F2ZXIoKSBhcyBzYXZlZF9leGM6CiAgICAgICAgeWllbGQgc2F2ZWQKCiAgICBzeXMubW9kdWxlcy51cGRhdGUoc2F2ZWQpCiAgICAjIHJlbW92ZSBhbnkgbW9kdWxlcyBpbXBvcnRlZCBzaW5jZQogICAgZGVsX21vZHVsZXMgPSAoCiAgICAgICAgbW9kX25hbWUgZm9yIG1vZF9uYW1lIGluIHN5cy5tb2R1bGVzCiAgICAgICAgaWYgbW9kX25hbWUgbm90IGluIHNhdmVkCiAgICAgICAgIyBleGNsdWRlIGFueSBlbmNvZGluZ3MgbW9kdWxlcy4gU2VlICMyODUKICAgICAgICBhbmQgbm90IG1vZF9uYW1lLnN0YXJ0c3dpdGgoJ2VuY29kaW5ncy4nKQogICAgKQogICAgX2NsZWFyX21vZHVsZXMoZGVsX21vZHVsZXMpCgogICAgc2F2ZWRfZXhjLnJlc3VtZSgpCgoKZGVmIF9jbGVhcl9tb2R1bGVzKG1vZHVsZV9uYW1lcyk6CiAgICBmb3IgbW9kX25hbWUgaW4gbGlzdChtb2R1bGVfbmFtZXMpOgogICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2RfbmFtZV0KCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9wa2dfcmVzb3VyY2VzX3N0YXRlKCk6CiAgICBzYXZlZCA9IHBrZ19yZXNvdXJjZXMuX19nZXRzdGF0ZV9fKCkKICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBwa2dfcmVzb3VyY2VzLl9fc2V0c3RhdGVfXyhzYXZlZCkKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2V0dXBfY29udGV4dChzZXR1cF9kaXIpOgogICAgdGVtcF9kaXIgPSBvcy5wYXRoLmpvaW4oc2V0dXBfZGlyLCAndGVtcCcpCiAgICB3aXRoIHNhdmVfcGtnX3Jlc291cmNlc19zdGF0ZSgpOgogICAgICAgIHdpdGggc2F2ZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIGhpZGVfc2V0dXB0b29scygpCiAgICAgICAgICAgIHdpdGggc2F2ZV9wYXRoKCk6CiAgICAgICAgICAgICAgICB3aXRoIHNhdmVfYXJndigpOgogICAgICAgICAgICAgICAgICAgIHdpdGggb3ZlcnJpZGVfdGVtcCh0ZW1wX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggcHVzaGQoc2V0dXBfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW5zdXJlIHNldHVwdG9vbHMgY29tbWFuZHMgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbXBvcnRfXygnc2V0dXB0b29scycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZAoKCmRlZiBfbmVlZHNfaGlkaW5nKG1vZF9uYW1lKToKICAgICIiIgogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3BrZ19yZXNvdXJjZXMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHNfcGx1Z2luJykKICAgIEZhbHNlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnc2V0dXB0b29scy5fX2luaXRfXycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnZGlzdHV0aWxzJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdvcycpCiAgICBGYWxzZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ0N5dGhvbicpCiAgICBUcnVlCiAgICAiIiIKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKHInKHNldHVwdG9vbHN8cGtnX3Jlc291cmNlc3xkaXN0dXRpbHN8Q3l0aG9uKShcLnwkKScpCiAgICByZXR1cm4gYm9vbChwYXR0ZXJuLm1hdGNoKG1vZF9uYW1lKSkKCgpkZWYgaGlkZV9zZXR1cHRvb2xzKCk6CiAgICAiIiIKICAgIFJlbW92ZSByZWZlcmVuY2VzIHRvIHNldHVwdG9vbHMnIG1vZHVsZXMgZnJvbSBzeXMubW9kdWxlcyB0byBhbGxvdyB0aGUKICAgIGludm9jYXRpb24gdG8gaW1wb3J0IHRoZSBtb3N0IGFwcHJvcHJpYXRlIHNldHVwdG9vbHMuIFRoaXMgdGVjaG5pcXVlIGlzCiAgICBuZWNlc3NhcnkgdG8gYXZvaWQgaXNzdWVzIHN1Y2ggYXMgIzMxNSB3aGVyZSBzZXR1cHRvb2xzIHVwZ3JhZGluZyBpdHNlbGYKICAgIHdvdWxkIGZhaWwgdG8gZmluZCBhIGZ1bmN0aW9uIGRlY2xhcmVkIGluIHRoZSBtZXRhZGF0YS4KICAgICIiIgogICAgbW9kdWxlcyA9IGZpbHRlcihfbmVlZHNfaGlkaW5nLCBzeXMubW9kdWxlcykKICAgIF9jbGVhcl9tb2R1bGVzKG1vZHVsZXMpCgoKZGVmIHJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIGFyZ3MpOgogICAgIiIiUnVuIGEgZGlzdHV0aWxzIHNldHVwIHNjcmlwdCwgc2FuZGJveGVkIGluIGl0cyBkaXJlY3RvcnkiIiIKICAgIHNldHVwX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KSkKICAgIHdpdGggc2V0dXBfY29udGV4dChzZXR1cF9kaXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc3lzLmFyZ3ZbOl0gPSBbc2V0dXBfc2NyaXB0XSArIGxpc3QoYXJncykKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNldHVwX2RpcikKICAgICAgICAgICAgIyByZXNldCB0byBpbmNsdWRlIHNldHVwIGRpciwgdy9jbGVhbiBjYWxsYmFjayBsaXN0CiAgICAgICAgICAgIHdvcmtpbmdfc2V0Ll9faW5pdF9fKCkKICAgICAgICAgICAgd29ya2luZ19zZXQuY2FsbGJhY2tzLmFwcGVuZChsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZSgpKQoKICAgICAgICAgICAgIyBfX2ZpbGVfXyBzaG91bGQgYmUgYSBieXRlIHN0cmluZyBvbiBQeXRob24gMiAoIzcxMikKICAgICAgICAgICAgZHVuZGVyX2ZpbGUgPSAoCiAgICAgICAgICAgICAgICBzZXR1cF9zY3JpcHQKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2V0dXBfc2NyaXB0LCBzdHIpIGVsc2UKICAgICAgICAgICAgICAgIHNldHVwX3NjcmlwdC5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICAgICApCgogICAgICAgICAgICB3aXRoIERpcmVjdG9yeVNhbmRib3goc2V0dXBfZGlyKToKICAgICAgICAgICAgICAgIG5zID0gZGljdChfX2ZpbGVfXz1kdW5kZXJfZmlsZSwgX19uYW1lX189J19fbWFpbl9fJykKICAgICAgICAgICAgICAgIF9leGVjZmlsZShzZXR1cF9zY3JpcHQsIG5zKQogICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIHY6CiAgICAgICAgICAgIGlmIHYuYXJncyBhbmQgdi5hcmdzWzBdOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgIyBOb3JtYWwgZXhpdCwganVzdCByZXR1cm4KCgpjbGFzcyBBYnN0cmFjdFNhbmRib3g6CiAgICAiIiJXcmFwICdvcycgbW9kdWxlIGFuZCAnb3BlbigpJyBidWlsdGluIGZvciB2aXJ0dWFsaXppbmcgc2V0dXAgc2NyaXB0cyIiIgoKICAgIF9hY3RpdmUgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9hdHRycyA9IFsKICAgICAgICAgICAgbmFtZSBmb3IgbmFtZSBpbiBkaXIoX29zKQogICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJykgYW5kIGhhc2F0dHIoc2VsZiwgbmFtZSkKICAgICAgICBdCgogICAgZGVmIF9jb3B5KHNlbGYsIHNvdXJjZSk6CiAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5fYXR0cnM6CiAgICAgICAgICAgIHNldGF0dHIob3MsIG5hbWUsIGdldGF0dHIoc291cmNlLCBuYW1lKSkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHNlbGYuX2NvcHkoc2VsZikKICAgICAgICBpZiBfZmlsZToKICAgICAgICAgICAgYnVpbHRpbnMuZmlsZSA9IHNlbGYuX2ZpbGUKICAgICAgICBidWlsdGlucy5vcGVuID0gc2VsZi5fb3BlbgogICAgICAgIHNlbGYuX2FjdGl2ZSA9IFRydWUKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICBzZWxmLl9hY3RpdmUgPSBGYWxzZQogICAgICAgIGlmIF9maWxlOgogICAgICAgICAgICBidWlsdGlucy5maWxlID0gX2ZpbGUKICAgICAgICBidWlsdGlucy5vcGVuID0gX29wZW4KICAgICAgICBzZWxmLl9jb3B5KF9vcykKCiAgICBkZWYgcnVuKHNlbGYsIGZ1bmMpOgogICAgICAgICIiIlJ1biAnZnVuYycgdW5kZXIgb3Mgc2FuZGJveGluZyIiIgogICAgICAgIHdpdGggc2VsZjoKICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKQoKICAgIGRlZiBfbWtfZHVhbF9wYXRoX3dyYXBwZXIobmFtZSk6CiAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgc3JjLCBkc3QgPSBzZWxmLl9yZW1hcF9wYWlyKG5hbWUsIHNyYywgZHN0LCAqYXJncywgKiprdykKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHNyYywgZHN0LCAqYXJncywgKiprdykKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBmb3IgbmFtZSBpbiBbInJlbmFtZSIsICJsaW5rIiwgInN5bWxpbmsiXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpCgogICAgZGVmIF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKG5hbWUsIG9yaWdpbmFsPU5vbmUpOgogICAgICAgIG9yaWdpbmFsID0gb3JpZ2luYWwgb3IgZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUsIHBhdGgsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgaWYgX2ZpbGU6CiAgICAgICAgX2ZpbGUgPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignZmlsZScsIF9maWxlKQogICAgX29wZW4gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignb3BlbicsIF9vcGVuKQogICAgZm9yIG5hbWUgaW4gWwogICAgICAgICJzdGF0IiwgImxpc3RkaXIiLCAiY2hkaXIiLCAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsCiAgICAgICAgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLCAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJsc3RhdCIsCiAgICAgICAgInN0YXJ0ZmlsZSIsICJta2ZpZm8iLCAibWtub2QiLCAicGF0aGNvbmYiLCAiYWNjZXNzIgogICAgXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIobmFtZSkKCiAgICBkZWYgX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKToKICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLl9yZW1hcF9pbnB1dChuYW1lLCBwYXRoLCAqYXJncywgKiprdykKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpKQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWydyZWFkbGluaycsICd0ZW1wbmFtJ106CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSkKCiAgICBkZWYgX21rX3F1ZXJ5KG5hbWUpOgogICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgcmV0dmFsID0gb3JpZ2luYWwoKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgcmV0dmFsKQogICAgICAgICAgICByZXR1cm4gcmV0dmFsCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWydnZXRjd2QnLCAndG1wbmFtJ106CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19xdWVyeShuYW1lKQoKICAgIGRlZiBfdmFsaWRhdGVfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAiIiJDYWxsZWQgdG8gcmVtYXAgb3IgdmFsaWRhdGUgYW55IHBhdGgsIHdoZXRoZXIgaW5wdXQgb3Igb3V0cHV0IiIiCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQoKICAgIGRlZiBfcmVtYXBfb3V0cHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIG91dHB1dHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQoKICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLCBvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIHBhaXJzIGxpa2UgcmVuYW1lLCBsaW5rLCBhbmQgc3ltbGluayBvcGVyYXRpb25zIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uICsgJy1mcm9tJywgc3JjLCAqYXJncywgKiprdyksCiAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbiArICctdG8nLCBkc3QsICphcmdzLCAqKmt3KQogICAgICAgICkKCgppZiBoYXNhdHRyKG9zLCAnZGV2bnVsbCcpOgogICAgX0VYQ0VQVElPTlMgPSBbb3MuZGV2bnVsbCxdCmVsc2U6CiAgICBfRVhDRVBUSU9OUyA9IFtdCgoKY2xhc3MgRGlyZWN0b3J5U2FuZGJveChBYnN0cmFjdFNhbmRib3gpOgogICAgIiIiUmVzdHJpY3Qgb3BlcmF0aW9ucyB0byBhIHNpbmdsZSBzdWJkaXJlY3RvcnkgLSBwc2V1ZG8tY2hyb290IiIiCgogICAgd3JpdGVfb3BzID0gZGljdC5mcm9ta2V5cyhbCiAgICAgICAgIm9wZW4iLCAiY2htb2QiLCAiY2hvd24iLCAibWtkaXIiLCAicmVtb3ZlIiwgInVubGluayIsICJybWRpciIsCiAgICAgICAgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibWtmaWZvIiwgIm1rbm9kIiwgInRlbXBuYW0iLAogICAgXSkKCiAgICBfZXhjZXB0aW9uX3BhdHRlcm5zID0gWwogICAgICAgICMgQWxsb3cgbGliMnRvMyB0byBhdHRlbXB0IHRvIHNhdmUgYSBwaWNrbGVkIGdyYW1tYXIgb2JqZWN0ICgjMTIxKQogICAgICAgIHInLipsaWIydG8zLipcLnBpY2tsZSQnLAogICAgXQogICAgImV4ZW1wdCB3cml0aW5nIHRvIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4iCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNhbmRib3gsIGV4Y2VwdGlvbnM9X0VYQ0VQVElPTlMpOgogICAgICAgIHNlbGYuX3NhbmRib3ggPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoc2FuZGJveCkpCiAgICAgICAgc2VsZi5fcHJlZml4ID0gb3MucGF0aC5qb2luKHNlbGYuX3NhbmRib3gsICcnKQogICAgICAgIHNlbGYuX2V4Y2VwdGlvbnMgPSBbCiAgICAgICAgICAgIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChwYXRoKSkKICAgICAgICAgICAgZm9yIHBhdGggaW4gZXhjZXB0aW9ucwogICAgICAgIF0KICAgICAgICBBYnN0cmFjdFNhbmRib3guX19pbml0X18oc2VsZikKCiAgICBkZWYgX3Zpb2xhdGlvbihzZWxmLCBvcGVyYXRpb24sICphcmdzLCAqKmt3KToKICAgICAgICBmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgU2FuZGJveFZpb2xhdGlvbgogICAgICAgIHJhaXNlIFNhbmRib3hWaW9sYXRpb24ob3BlcmF0aW9uLCBhcmdzLCBrdykKCiAgICBpZiBfZmlsZToKCiAgICAgICAgZGVmIF9maWxlKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIG1vZGUgbm90IGluICgncicsICdydCcsICdyYicsICdyVScsICdVJykgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigiZmlsZSIsIHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gX2ZpbGUocGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCgogICAgZGVmIF9vcGVuKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6CiAgICAgICAgaWYgbW9kZSBub3QgaW4gKCdyJywgJ3J0JywgJ3JiJywgJ3JVJywgJ1UnKSBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oIm9wZW4iLCBwYXRoLCBtb2RlLCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gX29wZW4ocGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCgogICAgZGVmIHRtcG5hbShzZWxmKToKICAgICAgICBzZWxmLl92aW9sYXRpb24oInRtcG5hbSIpCgogICAgZGVmIF9vayhzZWxmLCBwYXRoKToKICAgICAgICBhY3RpdmUgPSBzZWxmLl9hY3RpdmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCiAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHBhdGgpKQogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgc2VsZi5fZXhlbXB0ZWQocmVhbHBhdGgpCiAgICAgICAgICAgICAgICBvciByZWFscGF0aCA9PSBzZWxmLl9zYW5kYm94CiAgICAgICAgICAgICAgICBvciByZWFscGF0aC5zdGFydHN3aXRoKHNlbGYuX3ByZWZpeCkKICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IGFjdGl2ZQoKICAgIGRlZiBfZXhlbXB0ZWQoc2VsZiwgZmlsZXBhdGgpOgogICAgICAgIHN0YXJ0X21hdGNoZXMgPSAoCiAgICAgICAgICAgIGZpbGVwYXRoLnN0YXJ0c3dpdGgoZXhjZXB0aW9uKQogICAgICAgICAgICBmb3IgZXhjZXB0aW9uIGluIHNlbGYuX2V4Y2VwdGlvbnMKICAgICAgICApCiAgICAgICAgcGF0dGVybl9tYXRjaGVzID0gKAogICAgICAgICAgICByZS5tYXRjaChwYXR0ZXJuLCBmaWxlcGF0aCkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gc2VsZi5fZXhjZXB0aW9uX3BhdHRlcm5zCiAgICAgICAgKQogICAgICAgIGNhbmRpZGF0ZXMgPSBpdGVydG9vbHMuY2hhaW4oc3RhcnRfbWF0Y2hlcywgcGF0dGVybl9tYXRjaGVzKQogICAgICAgIHJldHVybiBhbnkoY2FuZGlkYXRlcykKCiAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKICAgICAgICBpZiBvcGVyYXRpb24gaW4gc2VsZi53cml0ZV9vcHMgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKG9wZXJhdGlvbiwgb3MucGF0aC5yZWFscGF0aChwYXRoKSwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3JlbWFwX3BhaXIoc2VsZiwgb3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9vayhzcmMpIG9yIG5vdCBzZWxmLl9vayhkc3QpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIChzcmMsIGRzdCkKCiAgICBkZWYgb3BlbihzZWxmLCBmaWxlLCBmbGFncywgbW9kZT0wbzc3NywgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgbG93LWxldmVsIG9zLm9wZW4oKSIiIgogICAgICAgIGlmIGZsYWdzICYgV1JJVEVfRkxBR1MgYW5kIG5vdCBzZWxmLl9vayhmaWxlKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJvcy5vcGVuIiwgZmlsZSwgZmxhZ3MsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiBfb3Mub3BlbihmaWxlLCBmbGFncywgbW9kZSwgKmFyZ3MsICoqa3cpCgoKV1JJVEVfRkxBR1MgPSBmdW5jdG9vbHMucmVkdWNlKAogICAgb3BlcmF0b3Iub3JfLCBbZ2V0YXR0cihfb3MsIGEsIDApIGZvciBhIGluCiAgICAgICAgIk9fV1JPTkxZIE9fUkRXUiBPX0FQUEVORCBPX0NSRUFUIE9fVFJVTkMgT19URU1QT1JBUlkiLnNwbGl0KCldCikKCgpjbGFzcyBTYW5kYm94VmlvbGF0aW9uKERpc3R1dGlsc0Vycm9yKToKICAgICIiIkEgc2V0dXAgc2NyaXB0IGF0dGVtcHRlZCB0byBtb2RpZnkgdGhlIGZpbGVzeXN0ZW0gb3V0c2lkZSB0aGUgc2FuZGJveCIiIgoKICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgU2FuZGJveFZpb2xhdGlvbjoge2NtZH17YXJncyFyfSB7a3dhcmdzfQoKICAgICAgICBUaGUgcGFja2FnZSBzZXR1cCBzY3JpcHQgaGFzIGF0dGVtcHRlZCB0byBtb2RpZnkgZmlsZXMgb24geW91ciBzeXN0ZW0KICAgICAgICB0aGF0IGFyZSBub3Qgd2l0aGluIHRoZSBFYXN5SW5zdGFsbCBidWlsZCBhcmVhLCBhbmQgaGFzIGJlZW4gYWJvcnRlZC4KCiAgICAgICAgVGhpcyBwYWNrYWdlIGNhbm5vdCBiZSBzYWZlbHkgaW5zdGFsbGVkIGJ5IEVhc3lJbnN0YWxsLCBhbmQgbWF5IG5vdAogICAgICAgIHN1cHBvcnQgYWx0ZXJuYXRlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMgZXZlbiBpZiB5b3UgcnVuIGl0cyBzZXR1cAogICAgICAgIHNjcmlwdCBieSBoYW5kLiAgUGxlYXNlIGluZm9ybSB0aGUgcGFja2FnZSdzIGF1dGhvciBhbmQgdGhlIEVhc3lJbnN0YWxsCiAgICAgICAgbWFpbnRhaW5lcnMgdG8gZmluZCBvdXQgaWYgYSBmaXggb3Igd29ya2Fyb3VuZCBpcyBhdmFpbGFibGUuCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGNtZCwgYXJncywga3dhcmdzID0gc2VsZi5hcmdzCiAgICAgICAgcmV0dXJuIHNlbGYudG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKUEsDBBQAAAAAAAAAIQCoM7S+igAAAIoAAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2NyaXB0LnRtcGwjIEVBU1ktSU5TVEFMTC1TQ1JJUFQ6ICUoc3BlYylyLCUoc2NyaXB0X25hbWUpcgpfX3JlcXVpcmVzX18gPSAlKHNwZWMpcgpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykucnVuX3NjcmlwdCglKHNwZWMpciwgJShzY3JpcHRfbmFtZSlyKQpQSwMEFAAAAAAAAAAhAALBlOMDCQAAAwkAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5ZGVmIF9fYm9vdCgpOgogICAgaW1wb3J0IHN5cwogICAgaW1wb3J0IG9zCiAgICBQWVRIT05QQVRIID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnKQogICAgaWYgUFlUSE9OUEFUSCBpcyBOb25lIG9yIChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBhbmQgbm90IFBZVEhPTlBBVEgpOgogICAgICAgIFBZVEhPTlBBVEggPSBbXQogICAgZWxzZToKICAgICAgICBQWVRIT05QQVRIID0gUFlUSE9OUEFUSC5zcGxpdChvcy5wYXRoc2VwKQoKICAgIHBpYyA9IGdldGF0dHIoc3lzLCAncGF0aF9pbXBvcnRlcl9jYWNoZScsIHt9KQogICAgc3RkcGF0aCA9IHN5cy5wYXRoW2xlbihQWVRIT05QQVRIKTpdCiAgICBteWRpciA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKCiAgICBmb3IgaXRlbSBpbiBzdGRwYXRoOgogICAgICAgIGlmIGl0ZW0gPT0gbXlkaXIgb3Igbm90IGl0ZW06CiAgICAgICAgICAgIGNvbnRpbnVlICAjIHNraXAgaWYgY3VycmVudCBkaXIuIG9uIFdpbmRvd3MsIG9yIG15IG93biBkaXJlY3RvcnkKICAgICAgICBpbXBvcnRlciA9IHBpYy5nZXQoaXRlbSkKICAgICAgICBpZiBpbXBvcnRlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUoJ3NpdGUnKQogICAgICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkX21vZHVsZSgnc2l0ZScpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCBpbXAgICMgQXZvaWQgaW1wb3J0IGxvb3AgaW4gUHl0aG9uID49IDMuMwogICAgICAgICAgICAgICAgc3RyZWFtLCBwYXRoLCBkZXNjciA9IGltcC5maW5kX21vZHVsZSgnc2l0ZScsIFtpdGVtXSkKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgc3RyZWFtIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKICAgICAgICAgICAgICAgIGltcC5sb2FkX21vZHVsZSgnc2l0ZScsIHN0cmVhbSwgcGF0aCwgZGVzY3IpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQogICAgICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ291bGRuJ3QgZmluZCB0aGUgcmVhbCAnc2l0ZScgbW9kdWxlIikKCiAgICBrbm93bl9wYXRocyA9IGRpY3QoWyhtYWtlcGF0aChpdGVtKVsxXSwgMSkgZm9yIGl0ZW0gaW4gc3lzLnBhdGhdKSAgIyAyLjIgY29tcAoKICAgIG9sZHBvcyA9IGdldGF0dHIoc3lzLCAnX19lZ2dpbnNlcnQnLCAwKSAgIyBzYXZlIG9sZCBpbnNlcnRpb24gcG9zaXRpb24KICAgIHN5cy5fX2VnZ2luc2VydCA9IDAgICMgYW5kIHJlc2V0IHRoZSBjdXJyZW50IG9uZQoKICAgIGZvciBpdGVtIGluIFBZVEhPTlBBVEg6CiAgICAgICAgYWRkc2l0ZWRpcihpdGVtKQoKICAgIHN5cy5fX2VnZ2luc2VydCArPSBvbGRwb3MgICMgcmVzdG9yZSBlZmZlY3RpdmUgb2xkIHBvc2l0aW9uCgogICAgZCwgbmQgPSBtYWtlcGF0aChzdGRwYXRoWzBdKQogICAgaW5zZXJ0X2F0ID0gTm9uZQogICAgbmV3X3BhdGggPSBbXQoKICAgIGZvciBpdGVtIGluIHN5cy5wYXRoOgogICAgICAgIHAsIG5wID0gbWFrZXBhdGgoaXRlbSkKCiAgICAgICAgaWYgbnAgPT0gbmQgYW5kIGluc2VydF9hdCBpcyBOb25lOgogICAgICAgICAgICAjIFdlJ3ZlIGhpdCB0aGUgZmlyc3QgJ3N5c3RlbScgcGF0aCBlbnRyeSwgc28gYWRkZWQgZW50cmllcyBnbyBoZXJlCiAgICAgICAgICAgIGluc2VydF9hdCA9IGxlbihuZXdfcGF0aCkKCiAgICAgICAgaWYgbnAgaW4ga25vd25fcGF0aHMgb3IgaW5zZXJ0X2F0IGlzIE5vbmU6CiAgICAgICAgICAgIG5ld19wYXRoLmFwcGVuZChpdGVtKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgbmV3IHBhdGggYWZ0ZXIgdGhlIGluc2VydCBwb2ludCwgYmFjay1pbnNlcnQgaXQKICAgICAgICAgICAgbmV3X3BhdGguaW5zZXJ0KGluc2VydF9hdCwgaXRlbSkKICAgICAgICAgICAgaW5zZXJ0X2F0ICs9IDEKCiAgICBzeXMucGF0aFs6XSA9IG5ld19wYXRoCgoKaWYgX19uYW1lX18gPT0gJ3NpdGUnOgogICAgX19ib290KCkKICAgIGRlbCBfX2Jvb3QKUEsDBBQAAAAAAAAAIQCIm1tOLCEAACwhAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc3NsX3N1cHBvcnQucHlpbXBvcnQgb3MKaW1wb3J0IHNvY2tldAppbXBvcnQgYXRleGl0CmltcG9ydCByZQppbXBvcnQgZnVuY3Rvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBodHRwX2NsaWVudCwgbWFwLCBmaWx0ZXIKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgUmVzb2x1dGlvbkVycm9yLCBFeHRyYWN0aW9uRXJyb3IKCnRyeToKICAgIGltcG9ydCBzc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgc3NsID0gTm9uZQoKX19hbGxfXyA9IFsKICAgICdWZXJpZnlpbmdIVFRQU0hhbmRsZXInLCAnZmluZF9jYV9idW5kbGUnLCAnaXNfYXZhaWxhYmxlJywgJ2NlcnRfcGF0aHMnLAogICAgJ29wZW5lcl9mb3InCl0KCmNlcnRfcGF0aHMgPSAiIiIKL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQKL2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydAovdXNyL3NoYXJlL3NzbC9jZXJ0cy9jYS1idW5kbGUuY3J0Ci91c3IvbG9jYWwvc2hhcmUvY2VydHMvY2Etcm9vdC5jcnQKL2V0Yy9zc2wvY2VydC5wZW0KL1N5c3RlbS9MaWJyYXJ5L09wZW5TU0wvY2VydHMvY2VydC5wZW0KL3Vzci9sb2NhbC9zaGFyZS9jZXJ0cy9jYS1yb290LW5zcy5jcnQKL2V0Yy9zc2wvY2EtYnVuZGxlLnBlbQoiIiIuc3RyaXAoKS5zcGxpdCgpCgp0cnk6CiAgICBIVFRQU0hhbmRsZXIgPSB1cmxsaWIucmVxdWVzdC5IVFRQU0hhbmRsZXIKICAgIEhUVFBTQ29ubmVjdGlvbiA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbgpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBIVFRQU0hhbmRsZXIgPSBIVFRQU0Nvbm5lY3Rpb24gPSBvYmplY3QKCmlzX2F2YWlsYWJsZSA9IHNzbCBpcyBub3QgTm9uZSBhbmQgb2JqZWN0IG5vdCBpbiAoSFRUUFNIYW5kbGVyLCBIVFRQU0Nvbm5lY3Rpb24pCgoKdHJ5OgogICAgZnJvbSBzc2wgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IsIG1hdGNoX2hvc3RuYW1lCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciA9IE5vbmUKICAgICAgICBtYXRjaF9ob3N0bmFtZSA9IE5vbmUKCmlmIG5vdCBDZXJ0aWZpY2F0ZUVycm9yOgoKICAgIGNsYXNzIENlcnRpZmljYXRlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKCmlmIG5vdCBtYXRjaF9ob3N0bmFtZToKCiAgICBkZWYgX2Ruc25hbWVfbWF0Y2goZG4sIGhvc3RuYW1lLCBtYXhfd2lsZGNhcmRzPTEpOgogICAgICAgICIiIk1hdGNoaW5nIGFjY29yZGluZyB0byBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMwoKICAgICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MTI1I3NlY3Rpb24tNi40LjMKICAgICAgICAiIiIKICAgICAgICBwYXRzID0gW10KICAgICAgICBpZiBub3QgZG46CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFBvcnRlZCBmcm9tIHB5dGhvbjMtc3ludGF4OgogICAgICAgICMgbGVmdG1vc3QsICpyZW1haW5kZXIgPSBkbi5zcGxpdChyJy4nKQogICAgICAgIHBhcnRzID0gZG4uc3BsaXQocicuJykKICAgICAgICBsZWZ0bW9zdCA9IHBhcnRzWzBdCiAgICAgICAgcmVtYWluZGVyID0gcGFydHNbMTpdCgogICAgICAgIHdpbGRjYXJkcyA9IGxlZnRtb3N0LmNvdW50KCcqJykKICAgICAgICBpZiB3aWxkY2FyZHMgPiBtYXhfd2lsZGNhcmRzOgogICAgICAgICAgICAjIElzc3VlICMxNzk4MDogYXZvaWQgZGVuaWFscyBvZiBzZXJ2aWNlIGJ5IHJlZnVzaW5nIG1vcmUKICAgICAgICAgICAgIyB0aGFuIG9uZSB3aWxkY2FyZCBwZXIgZnJhZ21lbnQuICBBIHN1cnZleSBvZiBlc3RhYmxpc2hlZAogICAgICAgICAgICAjIHBvbGljeSBhbW9uZyBTU0wgaW1wbGVtZW50YXRpb25zIHNob3dlZCBpdCB0byBiZSBhCiAgICAgICAgICAgICMgcmVhc29uYWJsZSBjaG9pY2UuCiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoCiAgICAgICAgICAgICAgICAidG9vIG1hbnkgd2lsZGNhcmRzIGluIGNlcnRpZmljYXRlIEROUyBuYW1lOiAiICsgcmVwcihkbikpCgogICAgICAgICMgc3BlZWQgdXAgY29tbW9uIGNhc2Ugdy9vIHdpbGRjYXJkcwogICAgICAgIGlmIG5vdCB3aWxkY2FyZHM6CiAgICAgICAgICAgIHJldHVybiBkbi5sb3dlcigpID09IGhvc3RuYW1lLmxvd2VyKCkKCiAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAxLgogICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllciBpbiB3aGljaAogICAgICAgICMgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBjb21wcmlzZXMgYSBsYWJlbCBvdGhlciB0aGFuIHRoZSBsZWZ0LW1vc3QgbGFiZWwuCiAgICAgICAgaWYgbGVmdG1vc3QgPT0gJyonOgogICAgICAgICAgICAjIFdoZW4gJyonIGlzIGEgZnJhZ21lbnQgYnkgaXRzZWxmLCBpdCBtYXRjaGVzIGEgbm9uLWVtcHR5IGRvdGxlc3MKICAgICAgICAgICAgIyBmcmFnbWVudC4KICAgICAgICAgICAgcGF0cy5hcHBlbmQoJ1teLl0rJykKICAgICAgICBlbGlmIGxlZnRtb3N0LnN0YXJ0c3dpdGgoJ3huLS0nKSBvciBob3N0bmFtZS5zdGFydHN3aXRoKCd4bi0tJyk6CiAgICAgICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMy4KICAgICAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyCiAgICAgICAgICAgICMgd2hlcmUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBpcyBlbWJlZGRlZCB3aXRoaW4gYW4gQS1sYWJlbCBvcgogICAgICAgICAgICAjIFUtbGFiZWwgb2YgYW4gaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWUuCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPdGhlcndpc2UsICcqJyBtYXRjaGVzIGFueSBkb3RsZXNzIHN0cmluZywgZS5nLiB3d3cqCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkucmVwbGFjZShyJ1wqJywgJ1teLl0qJykpCgogICAgICAgICMgYWRkIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLCBpZ25vcmUgYW55IHdpbGRjYXJkcwogICAgICAgIGZvciBmcmFnIGluIHJlbWFpbmRlcjoKICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGZyYWcpKQoKICAgICAgICBwYXQgPSByZS5jb21waWxlKHInXEEnICsgcidcLicuam9pbihwYXRzKSArIHInXFonLCByZS5JR05PUkVDQVNFKQogICAgICAgIHJldHVybiBwYXQubWF0Y2goaG9zdG5hbWUpCgogICAgZGVmIG1hdGNoX2hvc3RuYW1lKGNlcnQsIGhvc3RuYW1lKToKICAgICAgICAiIiJWZXJpZnkgdGhhdCAqY2VydCogKGluIGRlY29kZWQgZm9ybWF0IGFzIHJldHVybmVkIGJ5CiAgICAgICAgU1NMU29ja2V0LmdldHBlZXJjZXJ0KCkpIG1hdGNoZXMgdGhlICpob3N0bmFtZSouICBSRkMgMjgxOCBhbmQgUkZDIDYxMjUKICAgICAgICBydWxlcyBhcmUgZm9sbG93ZWQsIGJ1dCBJUCBhZGRyZXNzZXMgYXJlIG5vdCBhY2NlcHRlZCBmb3IgKmhvc3RuYW1lKi4KCiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciBpcyByYWlzZWQgb24gZmFpbHVyZS4gT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJucyBub3RoaW5nLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBjZXJ0OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBvciBubyBjZXJ0aWZpY2F0ZSIpCiAgICAgICAgZG5zbmFtZXMgPSBbXQogICAgICAgIHNhbiA9IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNhbjoKICAgICAgICAgICAgaWYga2V5ID09ICdETlMnOgogICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBub3QgZG5zbmFtZXM6CiAgICAgICAgICAgICMgVGhlIHN1YmplY3QgaXMgb25seSBjaGVja2VkIHdoZW4gdGhlcmUgaXMgbm8gZE5TTmFtZSBlbnRyeQogICAgICAgICAgICAjIGluIHN1YmplY3RBbHROYW1lCiAgICAgICAgICAgIGZvciBzdWIgaW4gY2VydC5nZXQoJ3N1YmplY3QnLCAoKSk6CiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzdWI6CiAgICAgICAgICAgICAgICAgICAgIyBYWFggYWNjb3JkaW5nIHRvIFJGQyAyODE4LCB0aGUgbW9zdCBzcGVjaWZpYyBDb21tb24gTmFtZQogICAgICAgICAgICAgICAgICAgICMgbXVzdCBiZSB1c2VkLgogICAgICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbW9uTmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIGxlbihkbnNuYW1lcykgPiAxOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICAgICAiZG9lc24ndCBtYXRjaCBlaXRoZXIgb2YgJXMiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgJywgJy5qb2luKG1hcChyZXByLCBkbnNuYW1lcykpKSkKICAgICAgICBlbGlmIGxlbihkbnNuYW1lcykgPT0gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggJXIiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgZG5zbmFtZXNbMF0pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoIm5vIGFwcHJvcHJpYXRlIGNvbW1vbk5hbWUgb3IgIgogICAgICAgICAgICAgICAgInN1YmplY3RBbHROYW1lIGZpZWxkcyB3ZXJlIGZvdW5kIikKCgpjbGFzcyBWZXJpZnlpbmdIVFRQU0hhbmRsZXIoSFRUUFNIYW5kbGVyKToKICAgICIiIlNpbXBsZSB2ZXJpZnlpbmcgaGFuZGxlcjogbm8gYXV0aCwgc3ViY2xhc3NlcywgdGltZW91dHMsIGV0Yy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FfYnVuZGxlKToKICAgICAgICBzZWxmLmNhX2J1bmRsZSA9IGNhX2J1bmRsZQogICAgICAgIEhUVFBTSGFuZGxlci5fX2luaXRfXyhzZWxmKQoKICAgIGRlZiBodHRwc19vcGVuKHNlbGYsIHJlcSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbigKICAgICAgICAgICAgbGFtYmRhIGhvc3QsICoqa3c6IFZlcmlmeWluZ0hUVFBTQ29ubihob3N0LCBzZWxmLmNhX2J1bmRsZSwgKiprdyksIHJlcQogICAgICAgICkKCgpjbGFzcyBWZXJpZnlpbmdIVFRQU0Nvbm4oSFRUUFNDb25uZWN0aW9uKToKICAgICIiIlNpbXBsZSB2ZXJpZnlpbmcgY29ubmVjdGlvbjogbm8gYXV0aCwgc3ViY2xhc3NlcywgdGltZW91dHMsIGV0Yy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgY2FfYnVuZGxlLCAqKmt3KToKICAgICAgICBIVFRQU0Nvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgaG9zdCwgKiprdykKICAgICAgICBzZWxmLmNhX2J1bmRsZSA9IGNhX2J1bmRsZQoKICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgIHNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oCiAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYucG9ydCksIGdldGF0dHIoc2VsZiwgJ3NvdXJjZV9hZGRyZXNzJywgTm9uZSkKICAgICAgICApCgogICAgICAgICMgSGFuZGxlIHRoZSBzb2NrZXQgaWYgYSAocHJveHkpIHR1bm5lbCBpcyBwcmVzZW50CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnX3R1bm5lbCcpIGFuZCBnZXRhdHRyKHNlbGYsICdfdHVubmVsX2hvc3QnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jawogICAgICAgICAgICBzZWxmLl90dW5uZWwoKQogICAgICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3Nzc2OiBQeXRob24+PTMuNC4xIGFuZCA+PTIuNy43CiAgICAgICAgICAgICMgY2hhbmdlIHNlbGYuaG9zdCB0byBtZWFuIHRoZSBwcm94eSBzZXJ2ZXIgaG9zdCB3aGVuIHR1bm5lbGluZyBpcwogICAgICAgICAgICAjIGJlaW5nIHVzZWQuIEFkYXB0LCBzaW5jZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGVzdGluYXRpb24KICAgICAgICAgICAgIyBob3N0IGZvciB0aGUgbWF0Y2hfaG9zdG5hbWUoKSBjb21wYXJpc29uLgogICAgICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYuX3R1bm5lbF9ob3N0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWN0dWFsX2hvc3QgPSBzZWxmLmhvc3QKCiAgICAgICAgaWYgaGFzYXR0cihzc2wsICdjcmVhdGVfZGVmYXVsdF9jb250ZXh0Jyk6CiAgICAgICAgICAgIGN0eCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KGNhZmlsZT1zZWxmLmNhX2J1bmRsZSkKICAgICAgICAgICAgc2VsZi5zb2NrID0gY3R4LndyYXBfc29ja2V0KHNvY2ssIHNlcnZlcl9ob3N0bmFtZT1hY3R1YWxfaG9zdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRoaXMgaXMgZm9yIHB5dGhvbiA8IDIuNy45IGFuZCA8IDMuND8KICAgICAgICAgICAgc2VsZi5zb2NrID0gc3NsLndyYXBfc29ja2V0KAogICAgICAgICAgICAgICAgc29jaywgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1zZWxmLmNhX2J1bmRsZQogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtYXRjaF9ob3N0bmFtZShzZWxmLnNvY2suZ2V0cGVlcmNlcnQoKSwgYWN0dWFsX2hvc3QpCiAgICAgICAgZXhjZXB0IENlcnRpZmljYXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuc29jay5zaHV0ZG93bihzb2NrZXQuU0hVVF9SRFdSKQogICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQogICAgICAgICAgICByYWlzZQoKCmRlZiBvcGVuZXJfZm9yKGNhX2J1bmRsZT1Ob25lKToKICAgICIiIkdldCBhIHVybG9wZW4oKSByZXBsYWNlbWVudCB0aGF0IHVzZXMgY2FfYnVuZGxlIGZvciB2ZXJpZmljYXRpb24iIiIKICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC5idWlsZF9vcGVuZXIoCiAgICAgICAgVmVyaWZ5aW5nSFRUUFNIYW5kbGVyKGNhX2J1bmRsZSBvciBmaW5kX2NhX2J1bmRsZSgpKQogICAgKS5vcGVuCgoKIyBmcm9tIGphcmFjby5mdW5jdG9vbHMKZGVmIG9uY2UoZnVuYyk6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bmMpCiAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGZ1bmMsICdhbHdheXNfcmV0dXJucycpOgogICAgICAgICAgICBmdW5jLmFsd2F5c19yZXR1cm5zID0gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIGZ1bmMuYWx3YXlzX3JldHVybnMKICAgIHJldHVybiB3cmFwcGVyCgoKQG9uY2UKZGVmIGdldF93aW5fY2VydGZpbGUoKToKICAgIHRyeToKICAgICAgICBpbXBvcnQgd2luY2VydHN0b3JlCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBjbGFzcyBDZXJ0RmlsZSh3aW5jZXJ0c3RvcmUuQ2VydEZpbGUpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoQ2VydEZpbGUsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYuY2xvc2UpCgogICAgICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc3VwZXIoQ2VydEZpbGUsIHNlbGYpLmNsb3NlKCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgX3dpbmNlcnRzID0gQ2VydEZpbGUoKQogICAgX3dpbmNlcnRzLmFkZHN0b3JlKCdDQScpCiAgICBfd2luY2VydHMuYWRkc3RvcmUoJ1JPT1QnKQogICAgcmV0dXJuIF93aW5jZXJ0cy5uYW1lCgoKZGVmIGZpbmRfY2FfYnVuZGxlKCk6CiAgICAiIiJSZXR1cm4gYW4gZXhpc3RpbmcgQ0EgYnVuZGxlIHBhdGgsIG9yIE5vbmUiIiIKICAgIGV4dGFudF9jZXJ0X3BhdGhzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBjZXJ0X3BhdGhzKQogICAgcmV0dXJuICgKICAgICAgICBnZXRfd2luX2NlcnRmaWxlKCkKICAgICAgICBvciBuZXh0KGV4dGFudF9jZXJ0X3BhdGhzLCBOb25lKQogICAgICAgIG9yIF9jZXJ0aWZpX3doZXJlKCkKICAgICkKCgpkZWYgX2NlcnRpZmlfd2hlcmUoKToKICAgIHRyeToKICAgICAgICByZXR1cm4gX19pbXBvcnRfXygnY2VydGlmaScpLndoZXJlKCkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIFJlc29sdXRpb25FcnJvciwgRXh0cmFjdGlvbkVycm9yKToKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAmkLXmuQDAADkAwAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3VuaWNvZGVfdXRpbHMucHlpbXBvcnQgdW5pY29kZWRhdGEKaW1wb3J0IHN5cwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgoKIyBIRlMgUGx1cyB1c2VzIGRlY29tcG9zZWQgVVRGLTgKZGVmIGRlY29tcG9zZShwYXRoKToKICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgnTkZEJywgcGF0aCkKICAgIHRyeToKICAgICAgICBwYXRoID0gcGF0aC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBwYXRoID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCdORkQnLCBwYXRoKQogICAgICAgIHBhdGggPSBwYXRoLmVuY29kZSgndXRmLTgnKQogICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICBwYXNzICAjIE5vdCBVVEYtOAogICAgcmV0dXJuIHBhdGgKCgpkZWYgZmlsZXN5c19kZWNvZGUocGF0aCk6CiAgICAiIiIKICAgIEVuc3VyZSB0aGF0IHRoZSBnaXZlbiBwYXRoIGlzIGRlY29kZWQsCiAgICBOT05FIHdoZW4gbm8gZXhwZWN0ZWQgZW5jb2Rpbmcgd29ya3MKICAgICIiIgoKICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBmc19lbmMgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgb3IgJ3V0Zi04JwogICAgY2FuZGlkYXRlcyA9IGZzX2VuYywgJ3V0Zi04JwoKICAgIGZvciBlbmMgaW4gY2FuZGlkYXRlczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBwYXRoLmRlY29kZShlbmMpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgY29udGludWUKCgpkZWYgdHJ5X2VuY29kZShzdHJpbmcsIGVuYyk6CiAgICAidHVybiB1bmljb2RlIGVuY29kaW5nIGludG8gYSBmdW5jdGlvbmFsIHJvdXRpbmUiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN0cmluZy5lbmNvZGUoZW5jKQogICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICByZXR1cm4gTm9uZQpQSwMEFAAAAAAAAAAhAEixTGKQAAAAkAAAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy92ZXJzaW9uLnB5aW1wb3J0IHBrZ19yZXNvdXJjZXMKCnRyeToKICAgIF9fdmVyc2lvbl9fID0gcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKCdzZXR1cHRvb2xzJykudmVyc2lvbgpleGNlcHQgRXhjZXB0aW9uOgogICAgX192ZXJzaW9uX18gPSAndW5rbm93bicKUEsDBBQAAAAAAAAAIQBwHQjzQRwAAEEcAAA4AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvd2hlZWwucHknJydXaGVlbHMgc3VwcG9ydC4nJycKCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQppbXBvcnQgZW1haWwKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBwYXJzZV92ZXJzaW9uCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4uc2l4IGltcG9ydCBQWTMKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBEaXN0cmlidXRpb24gYXMgU2V0dXB0b29sc0Rpc3RyaWJ1dGlvbgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHBlcDQyNXRhZ3MKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8gaW1wb3J0IHdyaXRlX3JlcXVpcmVtZW50cwoKCldIRUVMX05BTUUgPSByZS5jb21waWxlKAogICAgciIiIl4oP1A8cHJvamVjdF9uYW1lPi4rPyktKD9QPHZlcnNpb24+XGQuKj8pCiAgICAoKC0oP1A8YnVpbGQ+XGQuKj8pKT8tKD9QPHB5X3ZlcnNpb24+Lis/KS0oP1A8YWJpPi4rPyktKD9QPHBsYXRmb3JtPi4rPykKICAgIClcLndobCQiIiIsCnJlLlZFUkJPU0UpLm1hdGNoCgpOQU1FU1BBQ0VfUEFDS0FHRV9JTklUID0gJycnXAp0cnk6CiAgICBfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykuZGVjbGFyZV9uYW1lc3BhY2UoX19uYW1lX18pCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF9fcGF0aF9fID0gX19pbXBvcnRfXygncGtndXRpbCcpLmV4dGVuZF9wYXRoKF9fcGF0aF9fLCBfX25hbWVfXykKJycnCgoKZGVmIHVucGFjayhzcmNfZGlyLCBkc3RfZGlyKToKICAgICcnJ01vdmUgZXZlcnl0aGluZyB1bmRlciBgc3JjX2RpcmAgdG8gYGRzdF9kaXJgLCBhbmQgZGVsZXRlIHRoZSBmb3JtZXIuJycnCiAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKHNyY19kaXIpOgogICAgICAgIHN1YmRpciA9IG9zLnBhdGgucmVscGF0aChkaXJwYXRoLCBzcmNfZGlyKQogICAgICAgIGZvciBmIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGYpCiAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3RfZGlyLCBzdWJkaXIsIGYpCiAgICAgICAgICAgIG9zLnJlbmFtZXMoc3JjLCBkc3QpCiAgICAgICAgZm9yIG4sIGQgaW4gcmV2ZXJzZWQobGlzdChlbnVtZXJhdGUoZGlybmFtZXMpKSk6CiAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBkKQogICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0X2Rpciwgc3ViZGlyLCBkKQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZHN0KToKICAgICAgICAgICAgICAgICMgRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGluIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgIyByZW5hbWUgaXQgYW5kIHBydW5lIGl0IGZyb20gb3Mud2FsayBsaXN0LgogICAgICAgICAgICAgICAgb3MucmVuYW1lcyhzcmMsIGRzdCkKICAgICAgICAgICAgICAgIGRlbCBkaXJuYW1lc1tuXQogICAgIyBDbGVhbnVwLgogICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhzcmNfZGlyLCB0b3Bkb3duPVRydWUpOgogICAgICAgIGFzc2VydCBub3QgZmlsZW5hbWVzCiAgICAgICAgb3Mucm1kaXIoZGlycGF0aCkKCgpjbGFzcyBXaGVlbChvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgbWF0Y2ggPSBXSEVFTF9OQU1FKG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludmFsaWQgd2hlZWwgbmFtZTogJXInICUgZmlsZW5hbWUpCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgZm9yIGssIHYgaW4gbWF0Y2guZ3JvdXBkaWN0KCkuaXRlbXMoKToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrLCB2KQoKICAgIGRlZiB0YWdzKHNlbGYpOgogICAgICAgICcnJ0xpc3QgdGFncyAocHlfdmVyc2lvbiwgYWJpLCBwbGF0Zm9ybSkgc3VwcG9ydGVkIGJ5IHRoaXMgd2hlZWwuJycnCiAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5wcm9kdWN0KHNlbGYucHlfdmVyc2lvbi5zcGxpdCgnLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFiaS5zcGxpdCgnLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBsYXRmb3JtLnNwbGl0KCcuJykpCgogICAgZGVmIGlzX2NvbXBhdGlibGUoc2VsZik6CiAgICAgICAgJycnSXMgdGhlIHdoZWVsIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBwbGF0Zm9ybT8nJycKICAgICAgICBzdXBwb3J0ZWRfdGFncyA9IHBlcDQyNXRhZ3MuZ2V0X3N1cHBvcnRlZCgpCiAgICAgICAgcmV0dXJuIG5leHQoKFRydWUgZm9yIHQgaW4gc2VsZi50YWdzKCkgaWYgdCBpbiBzdXBwb3J0ZWRfdGFncyksIEZhbHNlKQoKICAgIGRlZiBlZ2dfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBwcm9qZWN0X25hbWU9c2VsZi5wcm9qZWN0X25hbWUsIHZlcnNpb249c2VsZi52ZXJzaW9uLAogICAgICAgICAgICBwbGF0Zm9ybT0oTm9uZSBpZiBzZWxmLnBsYXRmb3JtID09ICdhbnknIGVsc2UgZ2V0X3BsYXRmb3JtKCkpLAogICAgICAgICkuZWdnX25hbWUoKSArICcuZWdnJwoKICAgIGRlZiBpbnN0YWxsX2FzX2VnZyhzZWxmLCBkZXN0aW5hdGlvbl9lZ2dkaXIpOgogICAgICAgICcnJ0luc3RhbGwgd2hlZWwgYXMgYW4gZWdnIGRpcmVjdG9yeS4nJycKICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLmZpbGVuYW1lKSBhcyB6ZjoKICAgICAgICAgICAgZGlzdF9iYXNlbmFtZSA9ICclcy0lcycgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICAgICAgZGlzdF9pbmZvID0gJyVzLmRpc3QtaW5mbycgJSBkaXN0X2Jhc2VuYW1lCiAgICAgICAgICAgIGRpc3RfZGF0YSA9ICclcy5kYXRhJyAlIGRpc3RfYmFzZW5hbWUKICAgICAgICAgICAgZGVmIGdldF9tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgICAgIHdpdGggemYub3BlbignJXMvJXMnICUgKGRpc3RfaW5mbywgbmFtZSkpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZnAucmVhZCgpLmRlY29kZSgndXRmLTgnKSBpZiBQWTMgZWxzZSBmcC5yZWFkKCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKHZhbHVlKQogICAgICAgICAgICB3aGVlbF9tZXRhZGF0YSA9IGdldF9tZXRhZGF0YSgnV0hFRUwnKQogICAgICAgICAgICBkaXN0X21ldGFkYXRhID0gZ2V0X21ldGFkYXRhKCdNRVRBREFUQScpCiAgICAgICAgICAgICMgQ2hlY2sgd2hlZWwgZm9ybWF0IHZlcnNpb24gaXMgc3VwcG9ydGVkLgogICAgICAgICAgICB3aGVlbF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbih3aGVlbF9tZXRhZGF0YS5nZXQoJ1doZWVsLVZlcnNpb24nKSkKICAgICAgICAgICAgaWYgbm90IHBhcnNlX3ZlcnNpb24oJzEuMCcpIDw9IHdoZWVsX3ZlcnNpb24gPCBwYXJzZV92ZXJzaW9uKCcyLjBkZXYwJyk6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd1bnN1cHBvcnRlZCB3aGVlbCBmb3JtYXQgdmVyc2lvbjogJXMnICUgd2hlZWxfdmVyc2lvbikKICAgICAgICAgICAgIyBFeHRyYWN0IHRvIHRhcmdldCBkaXJlY3RvcnkuCiAgICAgICAgICAgIG9zLm1rZGlyKGRlc3RpbmF0aW9uX2VnZ2RpcikKICAgICAgICAgICAgemYuZXh0cmFjdGFsbChkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgICAgICMgQ29udmVydCBtZXRhZGF0YS4KICAgICAgICAgICAgZGlzdF9pbmZvID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvKQogICAgICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbywKICAgICAgICAgICAgICAgIG1ldGFkYXRhPVBhdGhNZXRhZGF0YShkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbykKICAgICAgICAgICAgKQogICAgICAgICAgICAjIE5vdGU6IHdlIG5lZWQgdG8gZXZhbHVhdGUgYW5kIHN0cmlwIG1hcmtlcnMgbm93LAogICAgICAgICAgICAjIGFzIHdlIGNhbid0IGVhc2lseSBjb252ZXJ0IGJhY2sgZnJvbSB0aGUgc3ludGF4OgogICAgICAgICAgICAjIGZvb2JhcjsgImxpbnV4IiBpbiBzeXNfcGxhdGZvcm0gYW5kIGV4dHJhID09ICd0ZXN0JwogICAgICAgICAgICBkZWYgcmF3X3JlcShyZXEpOgogICAgICAgICAgICAgICAgcmVxLm1hcmtlciA9IE5vbmUKICAgICAgICAgICAgICAgIHJldHVybiBzdHIocmVxKQogICAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzID0gbGlzdChzb3J0ZWQobWFwKHJhd19yZXEsIGRpc3QucmVxdWlyZXMoKSkpKQogICAgICAgICAgICBleHRyYXNfcmVxdWlyZSA9IHsKICAgICAgICAgICAgICAgIGV4dHJhOiBsaXN0KHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICByZXEKICAgICAgICAgICAgICAgICAgICBmb3IgcmVxIGluIG1hcChyYXdfcmVxLCBkaXN0LnJlcXVpcmVzKChleHRyYSwpKSkKICAgICAgICAgICAgICAgICAgICBpZiByZXEgbm90IGluIGluc3RhbGxfcmVxdWlyZXMKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICBmb3IgZXh0cmEgaW4gZGlzdC5leHRyYXMKICAgICAgICAgICAgfQogICAgICAgICAgICBlZ2dfaW5mbyA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsICdFR0ctSU5GTycpCiAgICAgICAgICAgIG9zLnJlbmFtZShkaXN0X2luZm8sIGVnZ19pbmZvKQogICAgICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKGVnZ19pbmZvLCAnTUVUQURBVEEnKSwKICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ1BLRy1JTkZPJykpCiAgICAgICAgICAgIHNldHVwX2Rpc3QgPSBTZXR1cHRvb2xzRGlzdHJpYnV0aW9uKGF0dHJzPWRpY3QoCiAgICAgICAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzPWluc3RhbGxfcmVxdWlyZXMsCiAgICAgICAgICAgICAgICBleHRyYXNfcmVxdWlyZT1leHRyYXNfcmVxdWlyZSwKICAgICAgICAgICAgKSkKICAgICAgICAgICAgd3JpdGVfcmVxdWlyZW1lbnRzKHNldHVwX2Rpc3QuZ2V0X2NvbW1hbmRfb2JqKCdlZ2dfaW5mbycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgb3MucGF0aC5qb2luKGVnZ19pbmZvLCAncmVxdWlyZXMudHh0JykpCiAgICAgICAgICAgICMgTW92ZSBkYXRhIGVudHJpZXMgdG8gdGhlaXIgY29ycmVjdCBsb2NhdGlvbi4KICAgICAgICAgICAgZGlzdF9kYXRhID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9kYXRhKQogICAgICAgICAgICBkaXN0X2RhdGFfc2NyaXB0cyA9IG9zLnBhdGguam9pbihkaXN0X2RhdGEsICdzY3JpcHRzJykKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGlzdF9kYXRhX3NjcmlwdHMpOgogICAgICAgICAgICAgICAgZWdnX2luZm9fc2NyaXB0cyA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFR0ctSU5GTycsICdzY3JpcHRzJykKICAgICAgICAgICAgICAgIG9zLm1rZGlyKGVnZ19pbmZvX3NjcmlwdHMpCiAgICAgICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihkaXN0X2RhdGFfc2NyaXB0cyk6CiAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgYnl0ZWNvZGUsIGFzIGl0J3Mgbm90IHByb3Blcmx5IGhhbmRsZWQKICAgICAgICAgICAgICAgICAgICAjIGR1cmluZyBlYXN5X2luc3RhbGwgc2NyaXB0cyBpbnN0YWxsIHBoYXNlLgogICAgICAgICAgICAgICAgICAgIGlmIGVudHJ5LmVuZHN3aXRoKCcucHljJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oZGlzdF9kYXRhX3NjcmlwdHMsIGVudHJ5KSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKGRpc3RfZGF0YV9zY3JpcHRzLCBlbnRyeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX2luZm9fc2NyaXB0cywgZW50cnkpKQogICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlzdF9kYXRhX3NjcmlwdHMpCiAgICAgICAgICAgIGZvciBzdWJkaXIgaW4gZmlsdGVyKG9zLnBhdGguZXhpc3RzLCAoCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdF9kYXRhLCBkKQogICAgICAgICAgICAgICAgZm9yIGQgaW4gKCdkYXRhJywgJ2hlYWRlcnMnLCAncHVyZWxpYicsICdwbGF0bGliJykKICAgICAgICAgICAgKSk6CiAgICAgICAgICAgICAgICB1bnBhY2soc3ViZGlyLCBkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3RfZGF0YSk6CiAgICAgICAgICAgICAgICBvcy5ybWRpcihkaXN0X2RhdGEpCiAgICAgICAgICAgICMgRml4IG5hbWVzcGFjZSBwYWNrYWdlcy4KICAgICAgICAgICAgbmFtZXNwYWNlX3BhY2thZ2VzID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5hbWVzcGFjZV9wYWNrYWdlcyk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4obmFtZXNwYWNlX3BhY2thZ2VzKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VfcGFja2FnZXMgPSBmcC5yZWFkKCkuc3BsaXQoKQogICAgICAgICAgICAgICAgZm9yIG1vZCBpbiBuYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICAgICAgbW9kX2RpciA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsICptb2Quc3BsaXQoJy4nKSkKICAgICAgICAgICAgICAgICAgICBtb2RfaW5pdCA9IG9zLnBhdGguam9pbihtb2RfZGlyLCAnX19pbml0X18ucHknKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG1vZF9kaXIpIGFuZCBub3Qgb3MucGF0aC5leGlzdHMobW9kX2luaXQpOgogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4obW9kX2luaXQsICd3JykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcC53cml0ZShOQU1FU1BBQ0VfUEFDS0FHRV9JTklUKQpQSwMEFAAAAAAAAAAhAPnL7g3KAgAAygIAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy93aW5kb3dzX3N1cHBvcnQucHlpbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGN0eXBlcwoKCmRlZiB3aW5kb3dzX29ubHkoZnVuYyk6CiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CiAgICAgICAgcmV0dXJuIGxhbWJkYSAqYXJncywgKiprd2FyZ3M6IE5vbmUKICAgIHJldHVybiBmdW5jCgoKQHdpbmRvd3Nfb25seQpkZWYgaGlkZV9maWxlKHBhdGgpOgogICAgIiIiCiAgICBTZXQgdGhlIGhpZGRlbiBhdHRyaWJ1dGUgb24gYSBmaWxlIG9yIGRpcmVjdG9yeS4KCiAgICBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk2MjIxMzMvCgogICAgYHBhdGhgIG11c3QgYmUgdGV4dC4KICAgICIiIgogICAgX19pbXBvcnRfXygnY3R5cGVzLndpbnR5cGVzJykKICAgIFNldEZpbGVBdHRyaWJ1dGVzID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5TZXRGaWxlQXR0cmlidXRlc1cKICAgIFNldEZpbGVBdHRyaWJ1dGVzLmFyZ3R5cGVzID0gY3R5cGVzLndpbnR5cGVzLkxQV1NUUiwgY3R5cGVzLndpbnR5cGVzLkRXT1JECiAgICBTZXRGaWxlQXR0cmlidXRlcy5yZXN0eXBlID0gY3R5cGVzLndpbnR5cGVzLkJPT0wKCiAgICBGSUxFX0FUVFJJQlVURV9ISURERU4gPSAweDAyCgogICAgcmV0ID0gU2V0RmlsZUF0dHJpYnV0ZXMocGF0aCwgRklMRV9BVFRSSUJVVEVfSElEREVOKQogICAgaWYgbm90IHJldDoKICAgICAgICByYWlzZSBjdHlwZXMuV2luRXJyb3IoKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAC0AAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAIg6pdRVJgAAVSYAAEoAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdFdoZWVsCj09PT09CgpBIGJ1aWx0LXBhY2thZ2UgZm9ybWF0IGZvciBQeXRob24uCgpBIHdoZWVsIGlzIGEgWklQLWZvcm1hdCBhcmNoaXZlIHdpdGggYSBzcGVjaWFsbHkgZm9ybWF0dGVkIGZpbGVuYW1lCmFuZCB0aGUgLndobCBleHRlbnNpb24uIEl0IGlzIGRlc2lnbmVkIHRvIGNvbnRhaW4gYWxsIHRoZSBmaWxlcyBmb3IgYQpQRVAgMzc2IGNvbXBhdGlibGUgaW5zdGFsbCBpbiBhIHdheSB0aGF0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIG9uLWRpc2sKZm9ybWF0LiBNYW55IHBhY2thZ2VzIHdpbGwgYmUgcHJvcGVybHkgaW5zdGFsbGVkIHdpdGggb25seSB0aGUgIlVucGFjayIKc3RlcCAoc2ltcGx5IGV4dHJhY3RpbmcgdGhlIGZpbGUgb250byBzeXMucGF0aCksIGFuZCB0aGUgdW5wYWNrZWQgYXJjaGl2ZQpwcmVzZXJ2ZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvICJTcHJlYWQiIChjb3B5IGRhdGEgYW5kIHNjcmlwdHMgdG8gdGhlaXIKZmluYWwgbG9jYXRpb25zKSBhdCBhbnkgbGF0ZXIgdGltZS4KClRoZSB3aGVlbCBwcm9qZWN0IHByb3ZpZGVzIGEgYGJkaXN0X3doZWVsYCBjb21tYW5kIGZvciBzZXR1cHRvb2xzCihyZXF1aXJlcyBzZXR1cHRvb2xzID49IDAuOC4wKS4gV2hlZWwgZmlsZXMgY2FuIGJlIGluc3RhbGxlZCB3aXRoIGEKbmV3ZXIgYHBpcGAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAgb3Igd2l0aCB3aGVlbCdzIG93biBjb21tYW5kCmxpbmUgdXRpbGl0eS4KClRoZSB3aGVlbCBkb2N1bWVudGF0aW9uIGlzIGF0IGh0dHA6Ly93aGVlbC5ydGZkLm9yZy8uIFRoZSBmaWxlIGZvcm1hdAppcyBkb2N1bWVudGVkIGluIFBFUCA0MjcgKGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8pLgoKVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBhdCBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS93aGVlbAoKV2h5IG5vdCBlZ2c/Ci0tLS0tLS0tLS0tLQoKUHl0aG9uJ3MgZWdnIGZvcm1hdCBwcmVkYXRlcyB0aGUgcGFja2FnaW5nIHJlbGF0ZWQgc3RhbmRhcmRzIHdlIGhhdmUKdG9kYXksIHRoZSBtb3N0IGltcG9ydGFudCBiZWluZyBQRVAgMzc2ICJEYXRhYmFzZSBvZiBJbnN0YWxsZWQgUHl0aG9uCkRpc3RyaWJ1dGlvbnMiIHdoaWNoIHNwZWNpZmllcyB0aGUgLmRpc3QtaW5mbyBkaXJlY3RvcnkgKGluc3RlYWQgb2YKLmVnZy1pbmZvKSBhbmQgUEVQIDQyNiAiTWV0YWRhdGEgZm9yIFB5dGhvbiBTb2Z0d2FyZSBQYWNrYWdlcyAyLjAiCndoaWNoIHNwZWNpZmllcyBob3cgdG8gZXhwcmVzcyBkZXBlbmRlbmNpZXMgKGluc3RlYWQgb2YgcmVxdWlyZXMudHh0CmluIC5lZ2ctaW5mbykuCgpXaGVlbCBpbXBsZW1lbnRzIHRoZXNlIHRoaW5ncy4gSXQgYWxzbyBwcm92aWRlcyBhIHJpY2hlciBmaWxlIG5hbWluZwpjb252ZW50aW9uIHRoYXQgY29tbXVuaWNhdGVzIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gYW5kIEFCSSBhcyB3ZWxsCmFzIHNpbXBseSB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiB1c2VkIGluIGEgcGFydGljdWxhciBwYWNrYWdlLgoKVW5saWtlIC5lZ2csIHdoZWVsIHdpbGwgYmUgYSBmdWxseS1kb2N1bWVudGVkIHN0YW5kYXJkIGF0IHRoZSBiaW5hcnkKbGV2ZWwgdGhhdCBpcyB0cnVseSBlYXN5IHRvIGluc3RhbGwgZXZlbiBpZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZQpyZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCgoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHdoZWVsIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLCBjaGF0CnJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlIGBQeVBBIENvZGUgb2YgQ29uZHVjdGBfLgoKLi4gX1B5UEEgQ29kZSBvZiBDb25kdWN0OiBodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvCgoKCjAuMjkuMAo9PT09PT0KLSBGaXggY29tcHJlc3Npb24gdHlwZSBvZiBmaWxlcyBpbiBhcmNoaXZlIChJc3N1ZSAjMTU1LCBQdWxsIFJlcXVlc3QgIzYyLAogIHRoYW5rcyBYYXZpZXIgRmVybmFuZGV6KQoKMC4yOC4wCj09PT09PQotIEZpeCBmaWxlIG1vZGVzIGluIGFyY2hpdmUgKElzc3VlICMxNTQpCgowLjI3LjAKPT09PT09Ci0gU3VwcG9ydCBmb3JjaW5nIGEgcGxhdGZvcm0gdGFnIHVzaW5nIGAtLXBsYXQtbmFtZWAgb24gcHVyZS1QeXRob24gd2hlZWxzLCBhcwogIHdlbGwgYXMgbm9uc3RhbmRhcmQgcGxhdGZvcm0gdGFncyBvbiBub24tcHVyZSB3aGVlbHMgKFB1bGwgUmVxdWVzdCAjNjAsIElzc3VlCiAgIzE0NCwgdGhhbmtzIEFuZHLDqXMgRMOtYXopCi0gQWRkIFNPQUJJIHRhZ3MgdG8gcGxhdGZvcm0tc3BlY2lmaWMgd2hlZWxzIGJ1aWx0IGZvciBQeXRob24gMi5YIChQdWxsIFJlcXVlc3QKICAjNTUsIElzc3VlICM2MywgSXNzdWUgIzEwMSkKLSBTdXBwb3J0IHJlcHJvZHVjaWJsZSB3aGVlbCBmaWxlcywgd2hlZWxzIHRoYXQgY2FuIGJlIHJlYnVpbHQgYW5kIHdpbGwgaGFzaCB0bwogIHRoZSBzYW1lIHZhbHVlcyBhcyBwcmV2aW91cyBidWlsZHMgKFB1bGwgUmVxdWVzdCAjNTIsIElzc3VlICMxNDMsIHRoYW5rcwogIEJhcnJ5IFdhcnNhdykKLSBTdXBwb3J0IGZvciBjaGFuZ2VzIGluIGtleXJpbmcgPj0gOC4wIChQdWxsIFJlcXVlc3QgIzYxLCB0aGFua3MgSmFzb24gUi4KICBDb29tYnMpCi0gVXNlIHRoZSBmaWxlIGNvbnRleHQgbWFuYWdlciB3aGVuIGNoZWNraW5nIGlmIGRlcGVuZGVuY3lfbGlua3MudHh0IGlzIGVtcHR5LAogIGZpeGVzIHByb2JsZW1zIGJ1aWxkaW5nIHdoZWVscyB1bmRlciBQeVB5IG9uIFdpbmRvd3MgIChJc3N1ZSAjMTUwLCB0aGFua3MKICBDb3NpbW8gTHVwbykKLSBEb24ndCBhdHRlbXB0IHRvIChyZWN1cnNpdmVseSkgY3JlYXRlIGEgYnVpbGQgZGlyZWN0b3J5IGVuZGluZyB3aXRoIGAuLmAKICAoaW52YWxpZCBvbiBhbGwgcGxhdGZvcm1zLCBidXQgY29kZSB3YXMgb25seSBleGVjdXRlZCBvbiBXaW5kb3dzKSAoSXNzdWUgIzkxKQotIEFkZGVkIHRoZSBQeVBBIENvZGUgb2YgQ29uZHVjdCAoUHVsbCBSZXF1ZXN0ICM1NikKCjAuMjYuMAo9PT09PT0KLSBGaXggbXVsdGlwbGUgZW50cnlwb2ludCBjb21wYXJpc29uIGZhaWx1cmUgb24gUHl0aG9uIDMgKElzc3VlICMxNDgpCgowLjI1LjAKPT09PT09Ci0gQWRkIFB5dGhvbiAzLjUgdG8gdG94IGNvbmZpZ3VyYXRpb24KLSBEZXRlcm1pbmlzdGljIChzb3J0ZWQpIG1ldGFkYXRhCi0gRml4IHRhZ2dpbmcgZm9yIFB5dGhvbiAzLjUgY29tcGF0aWJpbGl0eQotIFN1cHBvcnQgcHkyLW5vbmUtJ2FyY2gnIGFuZCBweTMtbm9uZS0nYXJjaCcgdGFncwotIFRyZWF0IGRhdGEtb25seSB3aGVlbHMgYXMgcHVyZQotIFdyaXRlIHRvIHRlbXBvcmFyeSBmaWxlIGFuZCByZW5hbWUgd2hlbiB1c2luZyB3aGVlbCBpbnN0YWxsIC0tZm9yY2UKCjAuMjQuMAo9PT09PT0KLSBUaGUgcHl0aG9uIHRhZyB1c2VkIGZvciBwdXJlLXB5dGhvbiBwYWNrYWdlcyBpcyBub3cgLnB5TiAobWFqb3IgdmVyc2lvbgogIG9ubHkpLiBUaGlzIGNoYW5nZSBhY3R1YWxseSBvY2N1cnJlZCBpbiAwLjIzLjAgd2hlbiB0aGUgLS1weXRob24tdGFnCiAgb3B0aW9uIHdhcyBhZGRlZCwgYnV0IHdhcyBub3QgZXhwbGljaXRseSBtZW50aW9uZWQgaW4gdGhlIGNoYW5nZWxvZyB0aGVuLgotIHdpbmluc3Qyd2hlZWwgYW5kIGVnZzJ3aGVlbCByZW1vdmVkLiBVc2UgIndoZWVsIGNvbnZlcnQgW2FyY2hpdmVdIgogIGluc3RlYWQuCi0gV2hlZWwgbm93IHN1cHBvcnRzIHNldHVwdG9vbHMgc3R5bGUgY29uZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHZpYSB0aGUKICBleHRyYXNfcmVxdWlyZT17fSBzeW50YXguIFNlcGFyYXRlICdleHRyYScgbmFtZXMgZnJvbSBjb25kaXRpb25zIHVzaW5nCiAgdGhlIDogY2hhcmFjdGVyLiBXaGVlbCdzIG93biBzZXR1cC5weSBkb2VzIHRoaXMuIChUaGUgZW1wdHktc3RyaW5nCiAgZXh0cmEgaXMgdGhlIHNhbWUgYXMgaW5zdGFsbF9yZXF1aXJlcy4pIFRoZXNlIGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cwogIHNob3VsZCB3b3JrIHRoZSBzYW1lIHdoZXRoZXIgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIGJ5IHdoZWVsIG9yCiAgYnkgc2V0dXAucHkuCgowLjIzLjAKPT09PT09Ci0gQ29tcGF0aWJpbGl0eSB0YWcgZmxhZ3MgYWRkZWQgdG8gdGhlIGJkaXN0X3doZWVsIGNvbW1hbmQKLSBzZGlzdCBzaG91bGQgaW5jbHVkZSBmaWxlcyBuZWNlc3NhcnkgZm9yIHRlc3RzCi0gJ3doZWVsIGNvbnZlcnQnIGNhbiBub3cgYWxzbyBjb252ZXJ0IHVucGFja2VkIGVnZ3MgdG8gd2hlZWwKLSBSZW5hbWUgcHlkaXN0Lmpzb24gdG8gbWV0YWRhdGEuanNvbiB0byBhdm9pZCBzdGVwcGluZyBvbiB0aGUgUEVQCi0gVGhlIC0tc2tpcC1zY3JpcHRzIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBhbmQgbm90IGdlbmVyYXRpbmcgc2NyaXB0cyBpcyBub3cKICB0aGUgZGVmYXVsdC4gVGhlIG9wdGlvbiB3YXMgYSB0ZW1wb3JhcnkgYXBwcm9hY2ggdW50aWwgaW5zdGFsbGVycyBjb3VsZAogIGdlbmVyYXRlIHNjcmlwdHMgdGhlbXNlbHZlcy4gVGhhdCBpcyBub3cgdGhlIGNhc2Ugd2l0aCBwaXAgMS41IGFuZCBsYXRlci4KICBOb3RlIHRoYXQgdXNpbmcgcGlwIDEuNCB0byBpbnN0YWxsIGEgd2hlZWwgd2l0aG91dCBzY3JpcHRzIHdpbGwgbGVhdmUgdGhlCiAgaW5zdGFsbGF0aW9uIHdpdGhvdXQgZW50cnktcG9pbnQgd3JhcHBlcnMuIFRoZSAid2hlZWwgaW5zdGFsbC1zY3JpcHRzIgogIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHNjcmlwdHMgaW4gc3VjaCBjYXNlcy4KLSBUaGFuayB5b3UgY29udHJpYnV0b3JzCgowLjIyLjAKPT09PT09Ci0gSW5jbHVkZSBlbnRyeV9wb2ludHMudHh0LCBzY3JpcHRzIGEuay5hLiBjb21tYW5kcywgaW4gZXhwZXJpbWVudGFsCiAgcHlkaXN0Lmpzb24KLSBJbXByb3ZlZCB0ZXN0X3JlcXVpcmVzIHBhcnNpbmcKLSBQeXRob24gMi42IGZpeGVzLCAid2hlZWwgdmVyc2lvbiIgY29tbWFuZCBjb3VydGVzeSBwb21icmVkYW5uZQoKMC4yMS4wCj09PT09PQotIFByZWdlbmVyYXRlZCBzY3JpcHRzIGFyZSB0aGUgZGVmYXVsdCBhZ2Fpbi4KLSAic2V0dXAucHkgYmRpc3Rfd2hlZWwgLS1za2lwLXNjcmlwdHMiIHR1cm5zIHRoZW0gb2ZmLgotIHNldHVwdG9vbHMgaXMgbm8gbG9uZ2VyIGEgbGlzdGVkIHJlcXVpcmVtZW50IGZvciB0aGUgJ3doZWVsJwogIHBhY2thZ2UuIEl0IGlzIG9mIGNvdXJzZSBzdGlsbCByZXF1aXJlZCBpbiBvcmRlciBmb3IgYmRpc3Rfd2hlZWwKICB0byB3b3JrLgotICJweXRob24gLW0gd2hlZWwiIGF2b2lkcyBpbXBvcnRpbmcgcGtnX3Jlc291cmNlcyB1bnRpbCBpdCdzIG5lY2Vzc2FyeS4KCjAuMjAuMAo9PT09PT0KLSBObyBsb25nZXIgaW5jbHVkZSBjb25zb2xlX3NjcmlwdHMgaW4gd2hlZWxzLiBPcmRpbmFyeSBzY3JpcHRzIChzaGVsbCBmaWxlcywKICBzdGFuZGFsb25lIFB5dGhvbiBmaWxlcykgYXJlIGluY2x1ZGVkIGFzIHVzdWFsLgotIEluY2x1ZGUgbmV3IGNvbW1hbmQgInB5dGhvbiAtbSB3aGVlbCBpbnN0YWxsLXNjcmlwdHMgW2Rpc3RyaWJ1dGlvbgogIFtkaXN0cmlidXRpb24gLi4uXV0iIHRvIGluc3RhbGwgdGhlIGNvbnNvbGVfc2NyaXB0cyAoc2V0dXB0b29scy1zdHlsZQogIHNjcmlwdHMgdXNpbmcgcGtnX3Jlc291cmNlcykgZm9yIGEgZGlzdHJpYnV0aW9uLgoKMC4xOS4wCj09PT09PQotIHB5bWV0YS5qc29uIGJlY29tZXMgcHlkaXN0Lmpzb24KCjAuMTguMAo9PT09PT0KLSBQeXRob24gMyBVbmljb2RlIGltcHJvdmVtZW50cwoKMC4xNy4wCj09PT09PQotIFN1cHBvcnQgbGF0ZXN0IFBFUC00MjYgInB5bWV0YS5qc29uIiAoanNvbi1mb3JtYXQgbWV0YWRhdGEpCgowLjE2LjAKPT09PT09Ci0gUHl0aG9uIDIuNiBjb21wYXRpYmlsaXR5IGJ1Z2ZpeCAodGhhbmtzIEpvaG4gTWNGYXJsYW5lKQotIE5vbi1wcmVyZWxlYXNlIHZlcnNpb24gbnVtYmVyCgoxLjAuMGEyCj09PT09PT0KLSBCdWdmaXggZm9yIEMtZXh0ZW5zaW9uIHRhZ3MgZm9yIENQeXRob24gMy4zICh1c2luZyBTT0FCSSkKCjEuMC4wYTEKPT09PT09PQotIEJ1Z2ZpeCBmb3IgYmRpc3Rfd2luaW5zdCBjb252ZXJ0ZXIgIndoZWVsIGNvbnZlcnQiCi0gQnVnZml4IGZvciBkaXN0cyB3aGVyZSAiaXMgcHVyZSIgaXMgTm9uZSBpbnN0ZWFkIG9mIFRydWUgb3IgRmFsc2UKCjEuMC4wYTAKPT09PT09PQotIFVwZGF0ZSBmb3IgdmVyc2lvbiAxLjAgb2YgV2hlZWwgKFBFUCBhY2NlcHRlZCkuCi0gUHl0aG9uIDMgZml4IGZvciBtb3ZpbmcgVW5pY29kZSBEZXNjcmlwdGlvbiB0byBtZXRhZGF0YSBib2R5Ci0gSW5jbHVkZSBydWRpbWVudGFyeSBBUEkgZG9jdW1lbnRhdGlvbiBpbiBTcGhpbnggKHRoYW5rcyBLZXZpbiBIb3JuKQoKMC4xNS4wCj09PT09PQotIFZhcmlvdXMgaW1wcm92ZW1lbnRzCgowLjE0LjAKPT09PT09Ci0gQ2hhbmdlZCB0aGUgc2lnbmF0dXJlIGZvcm1hdCB0byBiZXR0ZXIgY29tcGx5IHdpdGggdGhlIGN1cnJlbnQgSldTIHNwZWMuCiAgQnJlYWtzIGFsbCBleGlzdGluZyBzaWduYXR1cmVzLgotIEluY2x1ZGUgYGB3aGVlbCB1bnNpZ25gYCBjb21tYW5kIHRvIHJlbW92ZSBSRUNPUkQuandzIGZyb20gYW4gYXJjaGl2ZS4KLSBQdXQgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBuZXdseSBhbGxvd2VkIHBheWxvYWQgc2VjdGlvbiBvZiBQS0ctSU5GTwogIChNRVRBREFUQSkgZmlsZXMuCgowLjEzLjAKPT09PT09Ci0gVXNlIGRpc3R1dGlscyBpbnN0ZWFkIG9mIHN5c2NvbmZpZyB0byBnZXQgaW5zdGFsbGF0aW9uIHBhdGhzOyBjYW4gaW5zdGFsbAogIGhlYWRlcnMuCi0gSW1wcm92ZSBXaGVlbEZpbGUoKSBzb3J0LgotIEFsbG93IGJvb3RzdHJhcCBpbnN0YWxscyB3aXRob3V0IGFueSBwa2dfcmVzb3VyY2VzLgoKMC4xMi4wCj09PT09PQotIFVuaXQgdGVzdCBmb3Igd2hlZWwudG9vbC5pbnN0YWxsCgowLjExLjAKPT09PT09Ci0gQVBJIGNsZWFudXAKCjAuMTAuMwo9PT09PT0KLSBTY3JpcHRzIGZpeGVyIGZpeAoKMC4xMC4yCj09PT09PQotIEZpeCBrZXlnZW4KCjAuMTAuMQo9PT09PT0KLSBQcmVzZXJ2ZSBhdHRyaWJ1dGVzIG9uIGluc3RhbGwuCgowLjEwLjAKPT09PT09Ci0gSW5jbHVkZSBhIGNvcHkgb2YgcGtnX3Jlc291cmNlcy4gV2hlZWwgY2FuIG5vdyBpbnN0YWxsIGludG8gYSB2aXJ0dWFsZW52CiAgdGhhdCBkb2VzIG5vdCBoYXZlIGRpc3RyaWJ1dGUgKHRob3VnaCBtb3N0IHBhY2thZ2VzIHN0aWxsIHJlcXVpcmUKICBwa2dfcmVzb3VyY2VzIHRvIGFjdHVhbGx5IHdvcms7IHdoZWVsIGluc3RhbGwgZGlzdHJpYnV0ZSkKLSBEZWZpbmUgYSBuZXcgc2V0dXAuY2ZnIHNlY3Rpb24gW3doZWVsXS4gdW5pdmVyc2FsPTEgd2lsbAogIGFwcGx5IHRoZSBweTIucHkzLW5vbmUtYW55IHRhZyBmb3IgcHVyZSBweXRob24gd2hlZWxzLgoKMC45LjcKPT09PT0KLSBPbmx5IGltcG9ydCBkaXJzcGVjIHdoZW4gbmVlZGVkLiBkaXJzcGVjIGlzIG9ubHkgbmVlZGVkIHRvIGZpbmQgdGhlCiAgY29uZmlndXJhdGlvbiBmb3Iga2V5Z2VuL3NpZ25pbmcgb3BlcmF0aW9ucy4KCjAuOS42Cj09PT09Ci0gcmVxdWlyZXMtZGlzdCBmcm9tIHNldHVwLmNmZyBvdmVyd3JpdGVzIGFueSByZXF1aXJlbWVudHMgZnJvbSBzZXR1cC5weQogIENhcmUgbXVzdCBiZSB0YWtlbiB0aGF0IHRoZSByZXF1aXJlbWVudHMgYXJlIHRoZSBzYW1lIGluIGJvdGggY2FzZXMsCiAgb3IganVzdCBhbHdheXMgaW5zdGFsbCBmcm9tIHdoZWVsLgotIGRyb3AgZGlyc3BlYyByZXF1aXJlbWVudCBvbiB3aW4zMgotIGltcHJvdmVkIGNvbW1hbmQgbGluZSB1dGlsaXR5LCBhZGRzICd3aGVlbCBjb252ZXJ0IFtlZ2cgb3Igd2luaW5zdF0nIHRvCiAgY29udmVydCBsZWdhY3kgYmluYXJ5IGZvcm1hdHMgdG8gd2hlZWwKCjAuOS41Cj09PT09Ci0gV2hlZWwncyBvd24gd2hlZWwgZmlsZSBjYW4gYmUgZXhlY3V0ZWQgYnkgUHl0aG9uLCBhbmQgY2FuIGluc3RhbGwgaXRzZWxmOgogIGBgcHl0aG9uIHdoZWVsLTAuOS41LXB5Mjctbm9uZS1hbnkvd2hlZWwgaW5zdGFsbCAuLi5gYAotIFVzZSBhcmdwYXJzZTsgYmFzaWMgYGB3aGVlbCBpbnN0YWxsYGAgY29tbWFuZCBzaG91bGQgcnVuIHdpdGggb25seSBzdGRsaWIKICBkZXBlbmRlbmNpZXMuCi0gQWxsb3cgcmVxdWlyZXNfZGlzdCBpbiBzZXR1cC5jZmcncyBbbWV0YWRhdGFdIHNlY3Rpb24uIEluIGFkZGl0aW9uIHRvCiAgZGVwZW5kZW5jaWVzIGluIHNldHVwLnB5LCBidXQgd2lsbCBvbmx5IGJlIGludGVycHJldGVkIHdoZW4gaW5zdGFsbGluZwogIGZyb20gd2hlZWwsIG5vdCBmcm9tIHNkaXN0LiBDYW4gYmUgcXVhbGlmaWVkIHdpdGggZW52aXJvbm1lbnQgbWFya2Vycy4KCjAuOS40Cj09PT09Ci0gRml4IHdoZWVsLnNpZ25hdHVyZXMgaW4gc2Rpc3QKCjAuOS4zCj09PT09Ci0gSW50ZWdyYXRlZCBkaWdpdGFsIHNpZ25hdHVyZXMgc3VwcG9ydCB3aXRob3V0IEMgZXh0ZW5zaW9ucy4KLSBJbnRlZ3JhdGVkICJ3aGVlbCBpbnN0YWxsIiBjb21tYW5kIChzaW5nbGUgcGFja2FnZSwgbm8gZGVwZW5kZW5jeQogIHJlc29sdXRpb24pIGluY2x1ZGluZyBjb21wYXRpYmlsaXR5IGNoZWNrLgotIFN1cHBvcnQgUHl0aG9uIDMuMwotIFVzZSBNZXRhZGF0YSAxLjMgKFBFUCA0MjYpCgowLjkuMgo9PT09PQotIEF1dG9tYXRpYyBzaWduaW5nIGlmIFdIRUVMX1RPT0wgcG9pbnRzIHRvIHRoZSB3aGVlbCBiaW5hcnkKLSBFdmVuIG1vcmUgUHl0aG9uIDMgZml4ZXMKCjAuOS4xCj09PT09Ci0gJ3doZWVsIHNpZ24nIHVzZXMgdGhlIGtleXMgZ2VuZXJhdGVkIGJ5ICd3aGVlbCBrZXlnZW4nIChpbnN0ZWFkIG9mIGdlbmVyYXRpbmcKICBhIG5ldyBrZXkgYXQgcmFuZG9tIGVhY2ggdGltZSkKLSBQeXRob24gMi8zIGVuY29kaW5nL2RlY29kaW5nIGZpeGVzCi0gUnVuIHRlc3RzIG9uIFB5dGhvbiAyLjYgKHdpdGhvdXQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbikKCjAuOQo9PT0KLSBVcGRhdGVkIGRpZ2l0YWwgc2lnbmF0dXJlcyBzY2hlbWUKLSBQeXRob24gMyBzdXBwb3J0IGZvciBkaWdpdGFsIHNpZ25hdHVyZXMKLSBBbHdheXMgdmVyaWZ5IFJFQ09SRCBoYXNoZXMgb24gZXh0cmFjdAotICJ3aGVlbCIgY29tbWFuZCBsaW5lIHRvb2wgdG8gc2lnbiwgdmVyaWZ5LCB1bnBhY2sgd2hlZWwgZmlsZXMKCjAuOAo9PT0KLSBub25lL2FueSBkcmFmdCBwZXAgdGFncyB1cGRhdGUKLSBpbXByb3ZlZCB3aW5pbnN0MndoZWVsIHNjcmlwdAotIGRvYyBjaGFuZ2VzIGFuZCBvdGhlciBpbXByb3ZlbWVudHMKCjAuNwo9PT0KLSBzb3J0IC5kaXN0LWluZm8gYXQgZW5kIG9mIHdoZWVsIGFyY2hpdmUKLSBXaW5kb3dzICYgUHl0aG9uIDMgZml4ZXMgZnJvbSBQYXVsIE1vb3JlCi0gcGVwOAotIHNjcmlwdHMgdG8gY29udmVydCB3aW5pbnN0ICYgZWdnIHRvIHdoZWVsCgowLjYKPT09Ci0gcmVxdWlyZSBkaXN0cmlidXRlID49IDAuNi4yOAotIHN0b3AgdXNpbmcgdmVybGliCgowLjUKPT09Ci0gd29ya2luZyBwcmV0dHkgd2VsbAoKMC40LjIKPT09PT0KLSBoeXBoZW5hdGVkIG5hbWUgZml4CgowLjQKPT09Ci0gaW1wcm92ZSB0ZXN0IGNvdmVyYWdlCi0gaW1wcm92ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHkKLSBpbmNsdWRlIHRveC5pbmkgY291cnRlc3kgb2YgTWFyYyBBYnJhbW93aXR6Ci0gZHJhZnQgaG1hYyBzaGEtMjU2IHNpZ25pbmcgZnVuY3Rpb24KCjAuMwo9PT0KLSBwcm90b3R5cGUgZWdnMndoZWVsIGNvbnZlcnNpb24gc2NyaXB0CgowLjIKPT09Ci0gUHl0aG9uIDMgY29tcGF0aWJpbGl0eQoKMC4xCj09PQotIEluaXRpYWwgdmVyc2lvbgoKClBLAwQUAAAAAAAAACEAcP+un2UEAABlBAAARgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTElDRU5TRS50eHQid2hlZWwiIGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IERhbmllbCBIb2x0aCA8ZGhvbHRoQGZhc3RtYWlsLmZtPiBhbmQKY29udHJpYnV0b3JzLgoKVGhlIE1JVCBMaWNlbnNlCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQpjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAp0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCnRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAphbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCmluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMClRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLApBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpQSwMEFAAAAAAAAAAhAERtmYENKwAADSsAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL01FVEFEQVRBTWV0YWRhdGEtVmVyc2lvbjogMi4wCk5hbWU6IHdoZWVsClZlcnNpb246IDAuMzAuMGEwClN1bW1hcnk6IEEgYnVpbHQtcGFja2FnZSBmb3JtYXQgZm9yIFB5dGhvbi4KSG9tZS1wYWdlOiBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS93aGVlbC8KQXV0aG9yOiBEYW5pZWwgSG9sdGgKQXV0aG9yLWVtYWlsOiBkaG9sdGhAZmFzdG1haWwuZm0KTGljZW5zZTogTUlUCktleXdvcmRzOiB3aGVlbCxwYWNrYWdpbmcKUGxhdGZvcm06IFVOS05PV04KQ2xhc3NpZmllcjogRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDQgLSBCZXRhCkNsYXNzaWZpZXI6IEludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjYKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4yCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNApSZXF1aXJlcy1EaXN0OiBhcmdwYXJzZTsgcHl0aG9uX3ZlcnNpb249PSIyLjYiClByb3ZpZGVzLUV4dHJhOiBmYXN0ZXItc2lnbmF0dXJlcwpSZXF1aXJlcy1EaXN0OiBlZDI1NTE5bGw7IGV4dHJhID09ICdmYXN0ZXItc2lnbmF0dXJlcycKUHJvdmlkZXMtRXh0cmE6IHNpZ25hdHVyZXMKUmVxdWlyZXMtRGlzdDoga2V5cmluZzsgZXh0cmEgPT0gJ3NpZ25hdHVyZXMnClJlcXVpcmVzLURpc3Q6IGtleXJpbmdzLmFsdDsgZXh0cmEgPT0gJ3NpZ25hdHVyZXMnClByb3ZpZGVzLUV4dHJhOiBzaWduYXR1cmVzClJlcXVpcmVzLURpc3Q6IGltcG9ydGxpYjsgcHl0aG9uX3ZlcnNpb249PSIyLjYiIGFuZCBleHRyYSA9PSAnc2lnbmF0dXJlcycKUHJvdmlkZXMtRXh0cmE6IHNpZ25hdHVyZXMKUmVxdWlyZXMtRGlzdDogcHl4ZGc7IHN5c19wbGF0Zm9ybSE9IndpbjMyIiBhbmQgZXh0cmEgPT0gJ3NpZ25hdHVyZXMnClByb3ZpZGVzLUV4dHJhOiB0b29sCgpXaGVlbAo9PT09PQoKQSBidWlsdC1wYWNrYWdlIGZvcm1hdCBmb3IgUHl0aG9uLgoKQSB3aGVlbCBpcyBhIFpJUC1mb3JtYXQgYXJjaGl2ZSB3aXRoIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBmaWxlbmFtZQphbmQgdGhlIC53aGwgZXh0ZW5zaW9uLiBJdCBpcyBkZXNpZ25lZCB0byBjb250YWluIGFsbCB0aGUgZmlsZXMgZm9yIGEKUEVQIDM3NiBjb21wYXRpYmxlIGluc3RhbGwgaW4gYSB3YXkgdGhhdCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBvbi1kaXNrCmZvcm1hdC4gTWFueSBwYWNrYWdlcyB3aWxsIGJlIHByb3Blcmx5IGluc3RhbGxlZCB3aXRoIG9ubHkgdGhlICJVbnBhY2siCnN0ZXAgKHNpbXBseSBleHRyYWN0aW5nIHRoZSBmaWxlIG9udG8gc3lzLnBhdGgpLCBhbmQgdGhlIHVucGFja2VkIGFyY2hpdmUKcHJlc2VydmVzIGVub3VnaCBpbmZvcm1hdGlvbiB0byAiU3ByZWFkIiAoY29weSBkYXRhIGFuZCBzY3JpcHRzIHRvIHRoZWlyCmZpbmFsIGxvY2F0aW9ucykgYXQgYW55IGxhdGVyIHRpbWUuCgpUaGUgd2hlZWwgcHJvamVjdCBwcm92aWRlcyBhIGBiZGlzdF93aGVlbGAgY29tbWFuZCBmb3Igc2V0dXB0b29scwoocmVxdWlyZXMgc2V0dXB0b29scyA+PSAwLjguMCkuIFdoZWVsIGZpbGVzIGNhbiBiZSBpbnN0YWxsZWQgd2l0aCBhCm5ld2VyIGBwaXBgIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwIG9yIHdpdGggd2hlZWwncyBvd24gY29tbWFuZApsaW5lIHV0aWxpdHkuCgpUaGUgd2hlZWwgZG9jdW1lbnRhdGlvbiBpcyBhdCBodHRwOi8vd2hlZWwucnRmZC5vcmcvLiBUaGUgZmlsZSBmb3JtYXQKaXMgZG9jdW1lbnRlZCBpbiBQRVAgNDI3IChodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvKS4KClRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgYXQgaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvd2hlZWwKCldoeSBub3QgZWdnPwotLS0tLS0tLS0tLS0KClB5dGhvbidzIGVnZyBmb3JtYXQgcHJlZGF0ZXMgdGhlIHBhY2thZ2luZyByZWxhdGVkIHN0YW5kYXJkcyB3ZSBoYXZlCnRvZGF5LCB0aGUgbW9zdCBpbXBvcnRhbnQgYmVpbmcgUEVQIDM3NiAiRGF0YWJhc2Ugb2YgSW5zdGFsbGVkIFB5dGhvbgpEaXN0cmlidXRpb25zIiB3aGljaCBzcGVjaWZpZXMgdGhlIC5kaXN0LWluZm8gZGlyZWN0b3J5IChpbnN0ZWFkIG9mCi5lZ2ctaW5mbykgYW5kIFBFUCA0MjYgIk1ldGFkYXRhIGZvciBQeXRob24gU29mdHdhcmUgUGFja2FnZXMgMi4wIgp3aGljaCBzcGVjaWZpZXMgaG93IHRvIGV4cHJlc3MgZGVwZW5kZW5jaWVzIChpbnN0ZWFkIG9mIHJlcXVpcmVzLnR4dAppbiAuZWdnLWluZm8pLgoKV2hlZWwgaW1wbGVtZW50cyB0aGVzZSB0aGluZ3MuIEl0IGFsc28gcHJvdmlkZXMgYSByaWNoZXIgZmlsZSBuYW1pbmcKY29udmVudGlvbiB0aGF0IGNvbW11bmljYXRlcyB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGFuZCBBQkkgYXMgd2VsbAphcyBzaW1wbHkgdGhlIGxhbmd1YWdlIHZlcnNpb24gdXNlZCBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4KClVubGlrZSAuZWdnLCB3aGVlbCB3aWxsIGJlIGEgZnVsbHktZG9jdW1lbnRlZCBzdGFuZGFyZCBhdCB0aGUgYmluYXJ5CmxldmVsIHRoYXQgaXMgdHJ1bHkgZWFzeSB0byBpbnN0YWxsIGV2ZW4gaWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUKcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgoKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSB3aGVlbCBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywgY2hhdApyb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZSBgUHlQQSBDb2RlIG9mIENvbmR1Y3RgXy4KCi4uIF9QeVBBIENvZGUgb2YgQ29uZHVjdDogaHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0LwoKCgowLjI5LjAKPT09PT09Ci0gRml4IGNvbXByZXNzaW9uIHR5cGUgb2YgZmlsZXMgaW4gYXJjaGl2ZSAoSXNzdWUgIzE1NSwgUHVsbCBSZXF1ZXN0ICM2MiwKICB0aGFua3MgWGF2aWVyIEZlcm5hbmRleikKCjAuMjguMAo9PT09PT0KLSBGaXggZmlsZSBtb2RlcyBpbiBhcmNoaXZlIChJc3N1ZSAjMTU0KQoKMC4yNy4wCj09PT09PQotIFN1cHBvcnQgZm9yY2luZyBhIHBsYXRmb3JtIHRhZyB1c2luZyBgLS1wbGF0LW5hbWVgIG9uIHB1cmUtUHl0aG9uIHdoZWVscywgYXMKICB3ZWxsIGFzIG5vbnN0YW5kYXJkIHBsYXRmb3JtIHRhZ3Mgb24gbm9uLXB1cmUgd2hlZWxzIChQdWxsIFJlcXVlc3QgIzYwLCBJc3N1ZQogICMxNDQsIHRoYW5rcyBBbmRyw6lzIETDrWF6KQotIEFkZCBTT0FCSSB0YWdzIHRvIHBsYXRmb3JtLXNwZWNpZmljIHdoZWVscyBidWlsdCBmb3IgUHl0aG9uIDIuWCAoUHVsbCBSZXF1ZXN0CiAgIzU1LCBJc3N1ZSAjNjMsIElzc3VlICMxMDEpCi0gU3VwcG9ydCByZXByb2R1Y2libGUgd2hlZWwgZmlsZXMsIHdoZWVscyB0aGF0IGNhbiBiZSByZWJ1aWx0IGFuZCB3aWxsIGhhc2ggdG8KICB0aGUgc2FtZSB2YWx1ZXMgYXMgcHJldmlvdXMgYnVpbGRzIChQdWxsIFJlcXVlc3QgIzUyLCBJc3N1ZSAjMTQzLCB0aGFua3MKICBCYXJyeSBXYXJzYXcpCi0gU3VwcG9ydCBmb3IgY2hhbmdlcyBpbiBrZXlyaW5nID49IDguMCAoUHVsbCBSZXF1ZXN0ICM2MSwgdGhhbmtzIEphc29uIFIuCiAgQ29vbWJzKQotIFVzZSB0aGUgZmlsZSBjb250ZXh0IG1hbmFnZXIgd2hlbiBjaGVja2luZyBpZiBkZXBlbmRlbmN5X2xpbmtzLnR4dCBpcyBlbXB0eSwKICBmaXhlcyBwcm9ibGVtcyBidWlsZGluZyB3aGVlbHMgdW5kZXIgUHlQeSBvbiBXaW5kb3dzICAoSXNzdWUgIzE1MCwgdGhhbmtzCiAgQ29zaW1vIEx1cG8pCi0gRG9uJ3QgYXR0ZW1wdCB0byAocmVjdXJzaXZlbHkpIGNyZWF0ZSBhIGJ1aWxkIGRpcmVjdG9yeSBlbmRpbmcgd2l0aCBgLi5gCiAgKGludmFsaWQgb24gYWxsIHBsYXRmb3JtcywgYnV0IGNvZGUgd2FzIG9ubHkgZXhlY3V0ZWQgb24gV2luZG93cykgKElzc3VlICM5MSkKLSBBZGRlZCB0aGUgUHlQQSBDb2RlIG9mIENvbmR1Y3QgKFB1bGwgUmVxdWVzdCAjNTYpCgowLjI2LjAKPT09PT09Ci0gRml4IG11bHRpcGxlIGVudHJ5cG9pbnQgY29tcGFyaXNvbiBmYWlsdXJlIG9uIFB5dGhvbiAzIChJc3N1ZSAjMTQ4KQoKMC4yNS4wCj09PT09PQotIEFkZCBQeXRob24gMy41IHRvIHRveCBjb25maWd1cmF0aW9uCi0gRGV0ZXJtaW5pc3RpYyAoc29ydGVkKSBtZXRhZGF0YQotIEZpeCB0YWdnaW5nIGZvciBQeXRob24gMy41IGNvbXBhdGliaWxpdHkKLSBTdXBwb3J0IHB5Mi1ub25lLSdhcmNoJyBhbmQgcHkzLW5vbmUtJ2FyY2gnIHRhZ3MKLSBUcmVhdCBkYXRhLW9ubHkgd2hlZWxzIGFzIHB1cmUKLSBXcml0ZSB0byB0ZW1wb3JhcnkgZmlsZSBhbmQgcmVuYW1lIHdoZW4gdXNpbmcgd2hlZWwgaW5zdGFsbCAtLWZvcmNlCgowLjI0LjAKPT09PT09Ci0gVGhlIHB5dGhvbiB0YWcgdXNlZCBmb3IgcHVyZS1weXRob24gcGFja2FnZXMgaXMgbm93IC5weU4gKG1ham9yIHZlcnNpb24KICBvbmx5KS4gVGhpcyBjaGFuZ2UgYWN0dWFsbHkgb2NjdXJyZWQgaW4gMC4yMy4wIHdoZW4gdGhlIC0tcHl0aG9uLXRhZwogIG9wdGlvbiB3YXMgYWRkZWQsIGJ1dCB3YXMgbm90IGV4cGxpY2l0bHkgbWVudGlvbmVkIGluIHRoZSBjaGFuZ2Vsb2cgdGhlbi4KLSB3aW5pbnN0MndoZWVsIGFuZCBlZ2cyd2hlZWwgcmVtb3ZlZC4gVXNlICJ3aGVlbCBjb252ZXJ0IFthcmNoaXZlXSIKICBpbnN0ZWFkLgotIFdoZWVsIG5vdyBzdXBwb3J0cyBzZXR1cHRvb2xzIHN0eWxlIGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cyB2aWEgdGhlCiAgZXh0cmFzX3JlcXVpcmU9e30gc3ludGF4LiBTZXBhcmF0ZSAnZXh0cmEnIG5hbWVzIGZyb20gY29uZGl0aW9ucyB1c2luZwogIHRoZSA6IGNoYXJhY3Rlci4gV2hlZWwncyBvd24gc2V0dXAucHkgZG9lcyB0aGlzLiAoVGhlIGVtcHR5LXN0cmluZwogIGV4dHJhIGlzIHRoZSBzYW1lIGFzIGluc3RhbGxfcmVxdWlyZXMuKSBUaGVzZSBjb25kaXRpb25hbCByZXF1aXJlbWVudHMKICBzaG91bGQgd29yayB0aGUgc2FtZSB3aGV0aGVyIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSB3aGVlbCBvcgogIGJ5IHNldHVwLnB5LgoKMC4yMy4wCj09PT09PQotIENvbXBhdGliaWxpdHkgdGFnIGZsYWdzIGFkZGVkIHRvIHRoZSBiZGlzdF93aGVlbCBjb21tYW5kCi0gc2Rpc3Qgc2hvdWxkIGluY2x1ZGUgZmlsZXMgbmVjZXNzYXJ5IGZvciB0ZXN0cwotICd3aGVlbCBjb252ZXJ0JyBjYW4gbm93IGFsc28gY29udmVydCB1bnBhY2tlZCBlZ2dzIHRvIHdoZWVsCi0gUmVuYW1lIHB5ZGlzdC5qc29uIHRvIG1ldGFkYXRhLmpzb24gdG8gYXZvaWQgc3RlcHBpbmcgb24gdGhlIFBFUAotIFRoZSAtLXNraXAtc2NyaXB0cyBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZCwgYW5kIG5vdCBnZW5lcmF0aW5nIHNjcmlwdHMgaXMgbm93CiAgdGhlIGRlZmF1bHQuIFRoZSBvcHRpb24gd2FzIGEgdGVtcG9yYXJ5IGFwcHJvYWNoIHVudGlsIGluc3RhbGxlcnMgY291bGQKICBnZW5lcmF0ZSBzY3JpcHRzIHRoZW1zZWx2ZXMuIFRoYXQgaXMgbm93IHRoZSBjYXNlIHdpdGggcGlwIDEuNSBhbmQgbGF0ZXIuCiAgTm90ZSB0aGF0IHVzaW5nIHBpcCAxLjQgdG8gaW5zdGFsbCBhIHdoZWVsIHdpdGhvdXQgc2NyaXB0cyB3aWxsIGxlYXZlIHRoZQogIGluc3RhbGxhdGlvbiB3aXRob3V0IGVudHJ5LXBvaW50IHdyYXBwZXJzLiBUaGUgIndoZWVsIGluc3RhbGwtc2NyaXB0cyIKICBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGluIHN1Y2ggY2FzZXMuCi0gVGhhbmsgeW91IGNvbnRyaWJ1dG9ycwoKMC4yMi4wCj09PT09PQotIEluY2x1ZGUgZW50cnlfcG9pbnRzLnR4dCwgc2NyaXB0cyBhLmsuYS4gY29tbWFuZHMsIGluIGV4cGVyaW1lbnRhbAogIHB5ZGlzdC5qc29uCi0gSW1wcm92ZWQgdGVzdF9yZXF1aXJlcyBwYXJzaW5nCi0gUHl0aG9uIDIuNiBmaXhlcywgIndoZWVsIHZlcnNpb24iIGNvbW1hbmQgY291cnRlc3kgcG9tYnJlZGFubmUKCjAuMjEuMAo9PT09PT0KLSBQcmVnZW5lcmF0ZWQgc2NyaXB0cyBhcmUgdGhlIGRlZmF1bHQgYWdhaW4uCi0gInNldHVwLnB5IGJkaXN0X3doZWVsIC0tc2tpcC1zY3JpcHRzIiB0dXJucyB0aGVtIG9mZi4KLSBzZXR1cHRvb2xzIGlzIG5vIGxvbmdlciBhIGxpc3RlZCByZXF1aXJlbWVudCBmb3IgdGhlICd3aGVlbCcKICBwYWNrYWdlLiBJdCBpcyBvZiBjb3Vyc2Ugc3RpbGwgcmVxdWlyZWQgaW4gb3JkZXIgZm9yIGJkaXN0X3doZWVsCiAgdG8gd29yay4KLSAicHl0aG9uIC1tIHdoZWVsIiBhdm9pZHMgaW1wb3J0aW5nIHBrZ19yZXNvdXJjZXMgdW50aWwgaXQncyBuZWNlc3NhcnkuCgowLjIwLjAKPT09PT09Ci0gTm8gbG9uZ2VyIGluY2x1ZGUgY29uc29sZV9zY3JpcHRzIGluIHdoZWVscy4gT3JkaW5hcnkgc2NyaXB0cyAoc2hlbGwgZmlsZXMsCiAgc3RhbmRhbG9uZSBQeXRob24gZmlsZXMpIGFyZSBpbmNsdWRlZCBhcyB1c3VhbC4KLSBJbmNsdWRlIG5ldyBjb21tYW5kICJweXRob24gLW0gd2hlZWwgaW5zdGFsbC1zY3JpcHRzIFtkaXN0cmlidXRpb24KICBbZGlzdHJpYnV0aW9uIC4uLl1dIiB0byBpbnN0YWxsIHRoZSBjb25zb2xlX3NjcmlwdHMgKHNldHVwdG9vbHMtc3R5bGUKICBzY3JpcHRzIHVzaW5nIHBrZ19yZXNvdXJjZXMpIGZvciBhIGRpc3RyaWJ1dGlvbi4KCjAuMTkuMAo9PT09PT0KLSBweW1ldGEuanNvbiBiZWNvbWVzIHB5ZGlzdC5qc29uCgowLjE4LjAKPT09PT09Ci0gUHl0aG9uIDMgVW5pY29kZSBpbXByb3ZlbWVudHMKCjAuMTcuMAo9PT09PT0KLSBTdXBwb3J0IGxhdGVzdCBQRVAtNDI2ICJweW1ldGEuanNvbiIgKGpzb24tZm9ybWF0IG1ldGFkYXRhKQoKMC4xNi4wCj09PT09PQotIFB5dGhvbiAyLjYgY29tcGF0aWJpbGl0eSBidWdmaXggKHRoYW5rcyBKb2huIE1jRmFybGFuZSkKLSBOb24tcHJlcmVsZWFzZSB2ZXJzaW9uIG51bWJlcgoKMS4wLjBhMgo9PT09PT09Ci0gQnVnZml4IGZvciBDLWV4dGVuc2lvbiB0YWdzIGZvciBDUHl0aG9uIDMuMyAodXNpbmcgU09BQkkpCgoxLjAuMGExCj09PT09PT0KLSBCdWdmaXggZm9yIGJkaXN0X3dpbmluc3QgY29udmVydGVyICJ3aGVlbCBjb252ZXJ0IgotIEJ1Z2ZpeCBmb3IgZGlzdHMgd2hlcmUgImlzIHB1cmUiIGlzIE5vbmUgaW5zdGVhZCBvZiBUcnVlIG9yIEZhbHNlCgoxLjAuMGEwCj09PT09PT0KLSBVcGRhdGUgZm9yIHZlcnNpb24gMS4wIG9mIFdoZWVsIChQRVAgYWNjZXB0ZWQpLgotIFB5dGhvbiAzIGZpeCBmb3IgbW92aW5nIFVuaWNvZGUgRGVzY3JpcHRpb24gdG8gbWV0YWRhdGEgYm9keQotIEluY2x1ZGUgcnVkaW1lbnRhcnkgQVBJIGRvY3VtZW50YXRpb24gaW4gU3BoaW54ICh0aGFua3MgS2V2aW4gSG9ybikKCjAuMTUuMAo9PT09PT0KLSBWYXJpb3VzIGltcHJvdmVtZW50cwoKMC4xNC4wCj09PT09PQotIENoYW5nZWQgdGhlIHNpZ25hdHVyZSBmb3JtYXQgdG8gYmV0dGVyIGNvbXBseSB3aXRoIHRoZSBjdXJyZW50IEpXUyBzcGVjLgogIEJyZWFrcyBhbGwgZXhpc3Rpbmcgc2lnbmF0dXJlcy4KLSBJbmNsdWRlIGBgd2hlZWwgdW5zaWduYGAgY29tbWFuZCB0byByZW1vdmUgUkVDT1JELmp3cyBmcm9tIGFuIGFyY2hpdmUuCi0gUHV0IHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgbmV3bHkgYWxsb3dlZCBwYXlsb2FkIHNlY3Rpb24gb2YgUEtHLUlORk8KICAoTUVUQURBVEEpIGZpbGVzLgoKMC4xMy4wCj09PT09PQotIFVzZSBkaXN0dXRpbHMgaW5zdGVhZCBvZiBzeXNjb25maWcgdG8gZ2V0IGluc3RhbGxhdGlvbiBwYXRoczsgY2FuIGluc3RhbGwKICBoZWFkZXJzLgotIEltcHJvdmUgV2hlZWxGaWxlKCkgc29ydC4KLSBBbGxvdyBib290c3RyYXAgaW5zdGFsbHMgd2l0aG91dCBhbnkgcGtnX3Jlc291cmNlcy4KCjAuMTIuMAo9PT09PT0KLSBVbml0IHRlc3QgZm9yIHdoZWVsLnRvb2wuaW5zdGFsbAoKMC4xMS4wCj09PT09PQotIEFQSSBjbGVhbnVwCgowLjEwLjMKPT09PT09Ci0gU2NyaXB0cyBmaXhlciBmaXgKCjAuMTAuMgo9PT09PT0KLSBGaXgga2V5Z2VuCgowLjEwLjEKPT09PT09Ci0gUHJlc2VydmUgYXR0cmlidXRlcyBvbiBpbnN0YWxsLgoKMC4xMC4wCj09PT09PQotIEluY2x1ZGUgYSBjb3B5IG9mIHBrZ19yZXNvdXJjZXMuIFdoZWVsIGNhbiBub3cgaW5zdGFsbCBpbnRvIGEgdmlydHVhbGVudgogIHRoYXQgZG9lcyBub3QgaGF2ZSBkaXN0cmlidXRlICh0aG91Z2ggbW9zdCBwYWNrYWdlcyBzdGlsbCByZXF1aXJlCiAgcGtnX3Jlc291cmNlcyB0byBhY3R1YWxseSB3b3JrOyB3aGVlbCBpbnN0YWxsIGRpc3RyaWJ1dGUpCi0gRGVmaW5lIGEgbmV3IHNldHVwLmNmZyBzZWN0aW9uIFt3aGVlbF0uIHVuaXZlcnNhbD0xIHdpbGwKICBhcHBseSB0aGUgcHkyLnB5My1ub25lLWFueSB0YWcgZm9yIHB1cmUgcHl0aG9uIHdoZWVscy4KCjAuOS43Cj09PT09Ci0gT25seSBpbXBvcnQgZGlyc3BlYyB3aGVuIG5lZWRlZC4gZGlyc3BlYyBpcyBvbmx5IG5lZWRlZCB0byBmaW5kIHRoZQogIGNvbmZpZ3VyYXRpb24gZm9yIGtleWdlbi9zaWduaW5nIG9wZXJhdGlvbnMuCgowLjkuNgo9PT09PQotIHJlcXVpcmVzLWRpc3QgZnJvbSBzZXR1cC5jZmcgb3ZlcndyaXRlcyBhbnkgcmVxdWlyZW1lbnRzIGZyb20gc2V0dXAucHkKICBDYXJlIG11c3QgYmUgdGFrZW4gdGhhdCB0aGUgcmVxdWlyZW1lbnRzIGFyZSB0aGUgc2FtZSBpbiBib3RoIGNhc2VzLAogIG9yIGp1c3QgYWx3YXlzIGluc3RhbGwgZnJvbSB3aGVlbC4KLSBkcm9wIGRpcnNwZWMgcmVxdWlyZW1lbnQgb24gd2luMzIKLSBpbXByb3ZlZCBjb21tYW5kIGxpbmUgdXRpbGl0eSwgYWRkcyAnd2hlZWwgY29udmVydCBbZWdnIG9yIHdpbmluc3RdJyB0bwogIGNvbnZlcnQgbGVnYWN5IGJpbmFyeSBmb3JtYXRzIHRvIHdoZWVsCgowLjkuNQo9PT09PQotIFdoZWVsJ3Mgb3duIHdoZWVsIGZpbGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IFB5dGhvbiwgYW5kIGNhbiBpbnN0YWxsIGl0c2VsZjoKICBgYHB5dGhvbiB3aGVlbC0wLjkuNS1weTI3LW5vbmUtYW55L3doZWVsIGluc3RhbGwgLi4uYGAKLSBVc2UgYXJncGFyc2U7IGJhc2ljIGBgd2hlZWwgaW5zdGFsbGBgIGNvbW1hbmQgc2hvdWxkIHJ1biB3aXRoIG9ubHkgc3RkbGliCiAgZGVwZW5kZW5jaWVzLgotIEFsbG93IHJlcXVpcmVzX2Rpc3QgaW4gc2V0dXAuY2ZnJ3MgW21ldGFkYXRhXSBzZWN0aW9uLiBJbiBhZGRpdGlvbiB0bwogIGRlcGVuZGVuY2llcyBpbiBzZXR1cC5weSwgYnV0IHdpbGwgb25seSBiZSBpbnRlcnByZXRlZCB3aGVuIGluc3RhbGxpbmcKICBmcm9tIHdoZWVsLCBub3QgZnJvbSBzZGlzdC4gQ2FuIGJlIHF1YWxpZmllZCB3aXRoIGVudmlyb25tZW50IG1hcmtlcnMuCgowLjkuNAo9PT09PQotIEZpeCB3aGVlbC5zaWduYXR1cmVzIGluIHNkaXN0CgowLjkuMwo9PT09PQotIEludGVncmF0ZWQgZGlnaXRhbCBzaWduYXR1cmVzIHN1cHBvcnQgd2l0aG91dCBDIGV4dGVuc2lvbnMuCi0gSW50ZWdyYXRlZCAid2hlZWwgaW5zdGFsbCIgY29tbWFuZCAoc2luZ2xlIHBhY2thZ2UsIG5vIGRlcGVuZGVuY3kKICByZXNvbHV0aW9uKSBpbmNsdWRpbmcgY29tcGF0aWJpbGl0eSBjaGVjay4KLSBTdXBwb3J0IFB5dGhvbiAzLjMKLSBVc2UgTWV0YWRhdGEgMS4zIChQRVAgNDI2KQoKMC45LjIKPT09PT0KLSBBdXRvbWF0aWMgc2lnbmluZyBpZiBXSEVFTF9UT09MIHBvaW50cyB0byB0aGUgd2hlZWwgYmluYXJ5Ci0gRXZlbiBtb3JlIFB5dGhvbiAzIGZpeGVzCgowLjkuMQo9PT09PQotICd3aGVlbCBzaWduJyB1c2VzIHRoZSBrZXlzIGdlbmVyYXRlZCBieSAnd2hlZWwga2V5Z2VuJyAoaW5zdGVhZCBvZiBnZW5lcmF0aW5nCiAgYSBuZXcga2V5IGF0IHJhbmRvbSBlYWNoIHRpbWUpCi0gUHl0aG9uIDIvMyBlbmNvZGluZy9kZWNvZGluZyBmaXhlcwotIFJ1biB0ZXN0cyBvbiBQeXRob24gMi42ICh3aXRob3V0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24pCgowLjkKPT09Ci0gVXBkYXRlZCBkaWdpdGFsIHNpZ25hdHVyZXMgc2NoZW1lCi0gUHl0aG9uIDMgc3VwcG9ydCBmb3IgZGlnaXRhbCBzaWduYXR1cmVzCi0gQWx3YXlzIHZlcmlmeSBSRUNPUkQgaGFzaGVzIG9uIGV4dHJhY3QKLSAid2hlZWwiIGNvbW1hbmQgbGluZSB0b29sIHRvIHNpZ24sIHZlcmlmeSwgdW5wYWNrIHdoZWVsIGZpbGVzCgowLjgKPT09Ci0gbm9uZS9hbnkgZHJhZnQgcGVwIHRhZ3MgdXBkYXRlCi0gaW1wcm92ZWQgd2luaW5zdDJ3aGVlbCBzY3JpcHQKLSBkb2MgY2hhbmdlcyBhbmQgb3RoZXIgaW1wcm92ZW1lbnRzCgowLjcKPT09Ci0gc29ydCAuZGlzdC1pbmZvIGF0IGVuZCBvZiB3aGVlbCBhcmNoaXZlCi0gV2luZG93cyAmIFB5dGhvbiAzIGZpeGVzIGZyb20gUGF1bCBNb29yZQotIHBlcDgKLSBzY3JpcHRzIHRvIGNvbnZlcnQgd2luaW5zdCAmIGVnZyB0byB3aGVlbAoKMC42Cj09PQotIHJlcXVpcmUgZGlzdHJpYnV0ZSA+PSAwLjYuMjgKLSBzdG9wIHVzaW5nIHZlcmxpYgoKMC41Cj09PQotIHdvcmtpbmcgcHJldHR5IHdlbGwKCjAuNC4yCj09PT09Ci0gaHlwaGVuYXRlZCBuYW1lIGZpeAoKMC40Cj09PQotIGltcHJvdmUgdGVzdCBjb3ZlcmFnZQotIGltcHJvdmUgV2luZG93cyBjb21wYXRpYmlsaXR5Ci0gaW5jbHVkZSB0b3guaW5pIGNvdXJ0ZXN5IG9mIE1hcmMgQWJyYW1vd2l0egotIGRyYWZ0IGhtYWMgc2hhLTI1NiBzaWduaW5nIGZ1bmN0aW9uCgowLjMKPT09Ci0gcHJvdG90eXBlIGVnZzJ3aGVlbCBjb252ZXJzaW9uIHNjcmlwdAoKMC4yCj09PQotIFB5dGhvbiAzIGNvbXBhdGliaWxpdHkKCjAuMQo9PT0KLSBJbml0aWFsIHZlcnNpb24KCgpQSwMEFAAAAAAAAAAhAKcPuxadDwAAnQ8AAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1JFQ09SRHdoZWVsL19faW5pdF9fLnB5LHNoYTI1Nj1kbWJvVURmcGJXeGVyY1ZYYmJRRUxzVDFMNFpReU9IUXZKS2p2Y0FLWXRjLDk5DQp3aGVlbC9fX21haW5fXy5weSxzaGEyNTY9TGJEREdJZDA4cVR4dWhMWXFYNW1YTzFNVXM5RC1IaHhiNU5WYzUzZWowayw0MTYNCndoZWVsL2FyY2hpdmUucHksc2hhMjU2PU82dVhrLXpKOHk0WS0wckNvSFA3Q0xLbFBwV1FCSDQ0emVSZWdhSzhGSm8sMjI0Nw0Kd2hlZWwvYmRpc3Rfd2hlZWwucHksc2hhMjU2PXVzZEZrWnZRb3BLLVN4XzNsMFRFTTJabTMzQncxQ19vYlRJVXo3Sk03cEksMTg0MDgNCndoZWVsL2RlY29yYXRvci5weSxzaGEyNTY9VTJLNzdaWjh4M3g1dlNJR0NjRWVoOEdBeEI2ckFCQjdBbER3UnVrYW9Dayw1NDENCndoZWVsL2VnZzJ3aGVlbC5weSxzaGEyNTY9LTdNMkpGaTIza1ota2hiTndrMWlWTDhQMTRORmRiQWhNYzFTSGhuWjJmQSwzMDI3DQp3aGVlbC9lZ2duYW1lcy50eHQsc2hhMjU2PVg2TFlzT2pNZDhsbHJ6TG8zU0IzRndKLXVOOUlza0pxWUtKRHEyekljYnMsMjQ5MA0Kd2hlZWwvaW5zdGFsbC5weSxzaGEyNTY9ZENSN0lIbWVBckxqZ2IweUY5WW1NaDNfcUlqLUM5ajFwM3VQU3JwelpPOCwxODA5OA0Kd2hlZWwvbWV0YWRhdGEucHksc2hhMjU2PU96OHgyVkQweExiYVdIMDZ5VFJDYjN2U2RXbld2cFBPd1kybzlEOGlGR1UsMTE2NzYNCndoZWVsL3BhdGhzLnB5LHNoYTI1Nj02QW1HLU1LeC1OZUpPQzl6VUpvU1NaalloWllHbVgxVUhHX04wSWJrcGxJLDExMzANCndoZWVsL3BlcDQyNXRhZ3MucHksc2hhMjU2PXBBMWV5YjFIT0Ftd1NpWFRtZlFobUFja2Zrbmh0RWVsTERaT2NWS1phRTAsNTgyOQ0Kd2hlZWwvcGtnaW5mby5weSxzaGEyNTY9LWdMT1R1UXJrUmY0Z2VPRDA0cW0wSVVrZFlBYmpnODFqLTV6TnR2V0E5QSwxMjI1DQp3aGVlbC91dGlsLnB5LHNoYTI1Nj1QZTJKWjlnck5qbUFjUlJKYXkyMEZsRFZKVWJlUFdhUjVsdHlTbzNjNnpRLDQ4OTANCndoZWVsL3dpbmluc3Qyd2hlZWwucHksc2hhMjU2PXhWZkVFS2JTNGhNcHYtd2dPUWliNG4wcFNwZ3Jwam5yQkRIMkpEU05jckUsNzg2Mw0Kd2hlZWwvc2lnbmF0dXJlcy9fX2luaXRfXy5weSxzaGEyNTY9a1pwS05zbXhCRFpodVhmODVfdXl5NXFCSDQwQXhWVF8wdXRiQWlUcF95ZywzNzc5DQp3aGVlbC9zaWduYXR1cmVzL2RqYmVjLnB5LHNoYTI1Nj01M0hUbmxObGZxT0hGRGY4T1lfNktMOHN4UjRzd2lMc1doVWp0dzNXM25JLDY3NTUNCndoZWVsL3NpZ25hdHVyZXMvZWQyNTUxOXB5LnB5LHNoYTI1Nj1TZVR4aU1aN2ttb01kSXVyQlNhS2I4S3UtYW1HbmY2WlRSR0VsTHpWOGlJLDE2OTUNCndoZWVsL3NpZ25hdHVyZXMva2V5cy5weSxzaGEyNTY9UThGTFZ5NWRpeERpeS01b19SbWxzRGhnWWRFclRDcDVjM1o4eDcwWDFzZywzMzE2DQp3aGVlbC90ZXN0L19faW5pdF9fLnB5LHNoYTI1Nj1NME5adVE3LTExMmw4SzJoMWVheVZ2U212UXJ1ZnJPY0Q1QVlLZ0lmX0lzLDENCndoZWVsL3Rlc3QvY29uZnRlc3QucHksc2hhMjU2PVM3M25IdG90UnI2X09HQlhtZVdQVmRqVm1WS1phejR1aTRMUFlkMGFQOVUsMTY4OQ0Kd2hlZWwvdGVzdC9weWRpc3Qtc2NoZW1hLmpzb24sc2hhMjU2PXluRXZOdlRoQzF6UmE3RmlvTXNXM2stOW5sOTh5dEVvbzFfM3hiT1AyZW8sMTE0ODMNCndoZWVsL3Rlc3QvdGVzdC0xLjAtcHkyLnB5My1ub25lLXdpbjMyLndobCxzaGEyNTY9SkNfVVhUTjVLbExyZHU0M3VINGNhWlNVeXpydFBjVXNSZS12VE11bnBsRSw1MjI2DQp3aGVlbC90ZXN0L3Rlc3RfYmFzaWMucHksc2hhMjU2PWExdVJ1NE1aUGJFRUt5VXNLWXZHdHo0cWo0S1gzRTc3VjZKbVhKTGRYLWssNjUwOQ0Kd2hlZWwvdGVzdC90ZXN0X2luc3RhbGwucHksc2hhMjU2PWMwRUVDWFBrVklHaENEOVY1YWQycXNCUFJQWWIxZWhoYVMwazZHdjVKUWMsMTg2Ng0Kd2hlZWwvdGVzdC90ZXN0X2tleXMucHksc2hhMjU2PTVtQmM5dGYyVHdDM1RDcHgxeVNUWXNDZTV5dmQ2a01LNjRBbFVVQ2NLRVksMjU3NQ0Kd2hlZWwvdGVzdC90ZXN0X3BhdGhzLnB5LHNoYTI1Nj0tUU9WVURGSklwRjlPUE5SekNKLVhmNG5CaWJLbFVlX2c0YWFaNnNtM3dFLDE3Mg0Kd2hlZWwvdGVzdC90ZXN0X3JhbmtpbmcucHksc2hhMjU2PUZTQVFYNG9IWjQ3NmpMZGRxVk1sR21RRnRiRWVsOWE4U3pPbmdKMDNUSncsMTQ5Ng0Kd2hlZWwvdGVzdC90ZXN0X3NpZ25hdHVyZXMucHksc2hhMjU2PVo0UkVYajYycDI4Z2JTREIyRF9PeG9wQS1UVFhJQ1RaNWUyeVozZWpFVmMsMTEyMA0Kd2hlZWwvdGVzdC90ZXN0X3RhZ29wdC5weSxzaGEyNTY9dDdBLWlSYmUzYkgySXo2TktkU0VPcEZGSUZTRjlJNEFUbWxyUkJYb0NjUSw1OTI3DQp3aGVlbC90ZXN0L3Rlc3RfdG9vbC5weSxzaGEyNTY9eXQ1ZEFyOG1wNTFXb0R6dDBNbWx3UGsweGY3RnZYQWVkeS1ZbE5aWHYxSSw2NTYNCndoZWVsL3Rlc3QvdGVzdF93aGVlbGZpbGUucHksc2hhMjU2PXg0ZXh6UVl1UUI0OFlIcWhVMk5aeU43NmstQlNLNjc4NC03cnllMHE2U3MsNDU4NQ0Kd2hlZWwvdGVzdC9jb21wbGV4LWRpc3Qvc2V0dXAucHksc2hhMjU2PTRpMV9BSm9KeG80aTZpay1tdnlkbzIzQUY4Qkh6am1BRVFZYTVKNFlQSzQsODU1DQp3aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9jb21wbGV4ZGlzdC9fX2luaXRfXy5weSxzaGEyNTY9UEdESldRVHhqTFhxbk5yYnFtVEtLX3lrNkRWUUJOZVJwLVlwUDd3MXJWaywyMw0Kd2hlZWwvdGVzdC9leHRlbnNpb24uZGlzdC9zZXR1cC5weSxzaGEyNTY9cGRSbC13dnE1T1ZNRzA0M1hyV1p3ejRmaXZGWldkV01Od0w4ZHlLYlQwYyw0NTYNCndoZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlci5oLHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCndoZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlcnNkaXN0LnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCndoZWVsL3Rlc3QvaGVhZGVycy5kaXN0L3NldHVwLnB5LHNoYTI1Nj1wM2Q5VEd5N05MWDZUbmtCSG5OSHplZHFZb09rZEdRdndoZXlEUWpmLUpRLDMyNA0Kd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9zZXR1cC5weSxzaGEyNTY9OHpXZW43MVVtLWlOX0E1dGhvdDZWRm9ncmtXc19SR1ZPLWpyX014a0ZvZywzODMNCndoZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2ltcGxlZGlzdC9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQp3aGVlbC90b29sL19faW5pdF9fLnB5LHNoYTI1Nj1wMHVubDlNZ3Jia1pZVk9EVnhFS01XUkk5WWExTV91WGNxWG5YSHpJNERrLDEzMjE3DQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0LHNoYTI1Nj1KSDZtb2dVSWF0UVZRZXdJaDRHQjF5d0N4dVdibTdHNFRqSV82M2RVUnA4LDk4MTMNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9MSUNFTlNFLnR4dCxzaGEyNTY9ektuaURHcnhfUHYybEFqemQzYVNoc3Z1dk43VE5oQU1tMG9fTmZ2bU5lUSwxMTI1DQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTUVUQURBVEEsc2hhMjU2PWl4OXpONWZhNGplT0RRcm42NGZVQVFhX3Vscm1ScGhpNFNLSEFZVXF0TncsMTEwMjENCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9SRUNPUkQsLA0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1dIRUVMLHNoYTI1Nj01d3ZmQjdHdmdaQWJLQlNFOXVYOVpiaTZMQ0wtX0tnZXpnSGJsWGhDUm5NLDExMw0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHQsc2hhMjU2PXBUeWVHVnN1Y3lmcl9CWGU1T1FLdUExQnA1WUthSUFXeTVwZWprcTRReDAsMTA5DQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vbWV0YWRhdGEuanNvbixzaGEyNTY9eF9tWmpMek9hWWNlem1uclN2RzY3ZDA3U2hwY1JGZHJnV2VVZTZ6cEw1WSwxNjI2DQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dCxzaGEyNTY9SHhTQkliZ0VzdE1QZTRlRmF3aEE2Nk1xLVFZSE1vcFhWb0FuY2ZqYl8xYyw2DQpQSwMEFAAAAAAAAAAhAJTflntxAAAAcQAAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1dIRUVMV2hlZWwtVmVyc2lvbjogMS4wCkdlbmVyYXRvcjogYmRpc3Rfd2hlZWwgKDAuMzAuMC5hMCkKUm9vdC1Jcy1QdXJlbGliOiB0cnVlClRhZzogcHkyLW5vbmUtYW55ClRhZzogcHkzLW5vbmUtYW55CgpQSwMEFAAAAAAAAAAhAOJF36xtAAAAbQAAAEsAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRbY29uc29sZV9zY3JpcHRzXQp3aGVlbCA9IHdoZWVsLnRvb2w6bWFpbgoKW2Rpc3R1dGlscy5jb21tYW5kc10KYmRpc3Rfd2hlZWwgPSB3aGVlbC5iZGlzdF93aGVlbDpiZGlzdF93aGVlbAoKUEsDBBQAAAAAAAAAIQBSsk7WWgYAAFoGAABIAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9tZXRhZGF0YS5qc29ueyJjbGFzc2lmaWVycyI6IFsiRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDQgLSBCZXRhIiwgIkludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjYiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4yIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNCJdLCAiZXh0ZW5zaW9ucyI6IHsicHl0aG9uLmNvbW1hbmRzIjogeyJ3cmFwX2NvbnNvbGUiOiB7IndoZWVsIjogIndoZWVsLnRvb2w6bWFpbiJ9fSwgInB5dGhvbi5kZXRhaWxzIjogeyJjb250YWN0cyI6IFt7ImVtYWlsIjogImRob2x0aEBmYXN0bWFpbC5mbSIsICJuYW1lIjogIkRhbmllbCBIb2x0aCIsICJyb2xlIjogImF1dGhvciJ9XSwgImRvY3VtZW50X25hbWVzIjogeyJkZXNjcmlwdGlvbiI6ICJERVNDUklQVElPTi5yc3QiLCAibGljZW5zZSI6ICJMSUNFTlNFLnR4dCJ9LCAicHJvamVjdF91cmxzIjogeyJIb21lIjogImh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3doZWVsLyJ9fSwgInB5dGhvbi5leHBvcnRzIjogeyJjb25zb2xlX3NjcmlwdHMiOiB7IndoZWVsIjogIndoZWVsLnRvb2w6bWFpbiJ9LCAiZGlzdHV0aWxzLmNvbW1hbmRzIjogeyJiZGlzdF93aGVlbCI6ICJ3aGVlbC5iZGlzdF93aGVlbDpiZGlzdF93aGVlbCJ9fX0sICJleHRyYXMiOiBbImZhc3Rlci1zaWduYXR1cmVzIiwgInNpZ25hdHVyZXMiLCAidG9vbCJdLCAiZ2VuZXJhdG9yIjogImJkaXN0X3doZWVsICgwLjMwLjAuYTApIiwgImtleXdvcmRzIjogWyJ3aGVlbCIsICJwYWNrYWdpbmciXSwgImxpY2Vuc2UiOiAiTUlUIiwgIm1ldGFkYXRhX3ZlcnNpb24iOiAiMi4wIiwgIm5hbWUiOiAid2hlZWwiLCAicnVuX3JlcXVpcmVzIjogW3siZXh0cmEiOiAiZmFzdGVyLXNpZ25hdHVyZXMiLCAicmVxdWlyZXMiOiBbImVkMjU1MTlsbCJdfSwgeyJleHRyYSI6ICJzaWduYXR1cmVzIiwgInJlcXVpcmVzIjogWyJrZXlyaW5nIiwgImtleXJpbmdzLmFsdCJdfSwgeyJlbnZpcm9ubWVudCI6ICJweXRob25fdmVyc2lvbj09XCIyLjZcIiIsICJyZXF1aXJlcyI6IFsiYXJncGFyc2UiXX0sIHsiZW52aXJvbm1lbnQiOiAicHl0aG9uX3ZlcnNpb249PVwiMi42XCIiLCAiZXh0cmEiOiAic2lnbmF0dXJlcyIsICJyZXF1aXJlcyI6IFsiaW1wb3J0bGliIl19LCB7ImVudmlyb25tZW50IjogInN5c19wbGF0Zm9ybSE9XCJ3aW4zMlwiIiwgImV4dHJhIjogInNpZ25hdHVyZXMiLCAicmVxdWlyZXMiOiBbInB5eGRnIl19XSwgInN1bW1hcnkiOiAiQSBidWlsdC1wYWNrYWdlIGZvcm1hdCBmb3IgUHl0aG9uLiIsICJ0ZXN0X3JlcXVpcmVzIjogW3sicmVxdWlyZXMiOiBbImNvdmVyYWdlIiwgImpzb25zY2hlbWEiLCAicHl0ZXN0IiwgInB5dGVzdC1jb3YiXX1dLCAidmVyc2lvbiI6ICIwLjMwLjBhMCJ9UEsDBBQAAAAAAAAAIQAZY95lBgAAAAYAAABIAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0d2hlZWwKUEsDBBQAAAAAAAAAIQBhN6VHYwAAAGMAAAAzAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL19faW5pdF9fLnB5IyBfX3ZhcmlhYmxlc19fIHdpdGggZG91YmxlLXF1b3RlZCB2YWx1ZXMgd2lsbCBiZSBhdmFpbGFibGUgaW4gc2V0dXAucHk6Cl9fdmVyc2lvbl9fID0gIjAuMzAuMC5hMCIKUEsDBBQAAAAAAAAAIQAkabdUoAEAAKABAAAzAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL19fbWFpbl9fLnB5IiIiCldoZWVsIGNvbW1hbmQgbGluZSB0b29sIChlbmFibGUgcHl0aG9uIC1tIHdoZWVsIHN5bnRheCkKIiIiCgppbXBvcnQgc3lzCgpkZWYgbWFpbigpOiAjIG5lZWRlZCBmb3IgY29uc29sZSBzY3JpcHQKICAgIGlmIF9fcGFja2FnZV9fID09ICcnOgogICAgICAgICMgVG8gYmUgYWJsZSB0byBydW4gJ3B5dGhvbiB3aGVlbC0wLjkud2hsL3doZWVsJzoKICAgICAgICBpbXBvcnQgb3MucGF0aAogICAgICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKICAgICAgICBzeXMucGF0aFswOjBdID0gW3BhdGhdCiAgICBpbXBvcnQgd2hlZWwudG9vbAogICAgc3lzLmV4aXQod2hlZWwudG9vbC5tYWluKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgc3lzLmV4aXQobWFpbigpKQpQSwMEFAAAAAAAAAAhACBTglLHCAAAxwgAADIAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvYXJjaGl2ZS5weSIiIgpBcmNoaXZlIHRvb2xzIGZvciB3aGVlbC4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHRpbWUKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHppcGZpbGUKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ3aGVlbCIpCgoKZGVmIGFyY2hpdmVfd2hlZWxmaWxlKGJhc2VfbmFtZSwgYmFzZV9kaXIpOgogICAgJycnQXJjaGl2ZSBhbGwgZmlsZXMgdW5kZXIgYGJhc2VfZGlyYCBpbiBhIHdobCBmaWxlIGFuZCBuYW1lIGl0IGxpa2UKICAgIGBiYXNlX25hbWVgLgogICAgJycnCiAgICBvbGRkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MuY3VyZGlyKQogICAgYmFzZV9uYW1lID0gb3MucGF0aC5hYnNwYXRoKGJhc2VfbmFtZSkKICAgIHRyeToKICAgICAgICBvcy5jaGRpcihiYXNlX2RpcikKICAgICAgICByZXR1cm4gbWFrZV93aGVlbGZpbGVfaW5uZXIoYmFzZV9uYW1lKQogICAgZmluYWxseToKICAgICAgICBvcy5jaGRpcihvbGRkaXIpCgoKZGVmIG1ha2Vfd2hlZWxmaWxlX2lubmVyKGJhc2VfbmFtZSwgYmFzZV9kaXI9Jy4nKToKICAgICIiIkNyZWF0ZSBhIHdobCBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlciAnYmFzZV9kaXInLgoKICAgIFBsYWNlcyAuZGlzdC1pbmZvIGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuIiIiCgogICAgemlwX2ZpbGVuYW1lID0gYmFzZV9uYW1lICsgIi53aGwiCgogICAgbG9nLmluZm8oImNyZWF0aW5nICclcycgYW5kIGFkZGluZyAnJXMnIHRvIGl0IiwgemlwX2ZpbGVuYW1lLCBiYXNlX2RpcikKCiAgICAjIFNvbWUgYXBwbGljYXRpb25zIG5lZWQgcmVwcm9kdWNpYmxlIC53aGwgZmlsZXMsIGJ1dCB0aGV5IGNhbid0IGRvIHRoaXMKICAgICMgd2l0aG91dCBmb3JjaW5nIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGluZGl2aWR1YWwgWmlwSW5mbyBvYmplY3RzLiAgU2VlCiAgICAjIGlzc3VlICMxNDMuCiAgICB0aW1lc3RhbXAgPSBvcy5lbnZpcm9uLmdldCgnU09VUkNFX0RBVEVfRVBPQ0gnKQogICAgaWYgdGltZXN0YW1wIGlzIE5vbmU6CiAgICAgICAgZGF0ZV90aW1lID0gTm9uZQogICAgZWxzZToKICAgICAgICBkYXRlX3RpbWUgPSB0aW1lLmdtdGltZShpbnQodGltZXN0YW1wKSlbMDo2XQoKICAgICMgWFhYIHN1cHBvcnQgYnoyLCB4eiB3aGVuIGF2YWlsYWJsZQogICAgemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgInciLCBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKCiAgICBzY29yZSA9IHsnV0hFRUwnOiAxLCAnTUVUQURBVEEnOiAyLCAnUkVDT1JEJzogM30KICAgIGRlZmVycmVkID0gW10KCiAgICBkZWYgd3JpdGVmaWxlKHBhdGgsIGRhdGVfdGltZSk6CiAgICAgICAgc3QgPSBvcy5zdGF0KHBhdGgpCiAgICAgICAgaWYgZGF0ZV90aW1lIGlzIE5vbmU6CiAgICAgICAgICAgIG10aW1lID0gdGltZS5nbXRpbWUoc3Quc3RfbXRpbWUpCiAgICAgICAgICAgIGRhdGVfdGltZSA9IG10aW1lWzA6Nl0KICAgICAgICB6aW5mbyA9IHppcGZpbGUuWmlwSW5mbyhwYXRoLCBkYXRlX3RpbWUpCiAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciA9IHN0LnN0X21vZGUgPDwgMTYKICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gemlwZmlsZS5aSVBfREVGTEFURUQKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZnA6CiAgICAgICAgICAgIHppcC53cml0ZXN0cih6aW5mbywgZnAucmVhZCgpKQogICAgICAgIGxvZy5pbmZvKCJhZGRpbmcgJyVzJyIgJSBwYXRoKQoKICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoYmFzZV9kaXIpOgogICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGRpcnBhdGgsIG5hbWUpKQoKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICBpZiBkaXJwYXRoLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQuYXBwZW5kKChzY29yZS5nZXQobmFtZSwgMCksIHBhdGgpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB3cml0ZWZpbGUocGF0aCwgZGF0ZV90aW1lKQoKICAgIGRlZmVycmVkLnNvcnQoKQogICAgZm9yIHNjb3JlLCBwYXRoIGluIGRlZmVycmVkOgogICAgICAgIHdyaXRlZmlsZShwYXRoLCBkYXRlX3RpbWUpCgogICAgemlwLmNsb3NlKCkKCiAgICByZXR1cm4gemlwX2ZpbGVuYW1lClBLAwQUAAAAAAAAACEASq8k0ehHAADoRwAANgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9iZGlzdF93aGVlbC5weSIiIgpDcmVhdGUgYSB3aGVlbCAoLndobCkgZGlzdHJpYnV0aW9uLgoKQSB3aGVlbCBpcyBhIGJ1aWx0IGFyY2hpdmUgZm9ybWF0LgoiIiIKCmltcG9ydCBjc3YKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IG9zCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgc2h1dGlsCmltcG9ydCBqc29uCmltcG9ydCBzeXMKaW1wb3J0IHJlCgp0cnk6CiAgICBpbXBvcnQgc3lzY29uZmlnCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hIG5vY292ZXIKICAgICMgUHl0aG9uIDwgMi43CiAgICBpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZyBhcyBzeXNjb25maWcKCmltcG9ydCBwa2dfcmVzb3VyY2VzCgpzYWZlX25hbWUgPSBwa2dfcmVzb3VyY2VzLnNhZmVfbmFtZQpzYWZlX3ZlcnNpb24gPSBwa2dfcmVzb3VyY2VzLnNhZmVfdmVyc2lvbgoKZnJvbSBzaHV0aWwgaW1wb3J0IHJtdHJlZQpmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yCgpmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCmZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl92ZXJzaW9uCgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nIGFzIGxvZ2dlcgoKZnJvbSAucGVwNDI1dGFncyBpbXBvcnQgZ2V0X2FiYnJfaW1wbCwgZ2V0X2ltcGxfdmVyLCBnZXRfYWJpX3RhZywgZ2V0X3BsYXRmb3JtCmZyb20gLnV0aWwgaW1wb3J0IG5hdGl2ZSwgb3Blbl9mb3JfY3N2CmZyb20gLmFyY2hpdmUgaW1wb3J0IGFyY2hpdmVfd2hlZWxmaWxlCmZyb20gLnBrZ2luZm8gaW1wb3J0IHJlYWRfcGtnX2luZm8sIHdyaXRlX3BrZ19pbmZvCmZyb20gLm1ldGFkYXRhIGltcG9ydCBwa2dpbmZvX3RvX2RpY3QKZnJvbSAuIGltcG9ydCBwZXA0MjV0YWdzLCBtZXRhZGF0YQpmcm9tIC4gaW1wb3J0IF9fdmVyc2lvbl9fIGFzIHdoZWVsX3ZlcnNpb24KClBZX0xJTUlURURfQVBJX1BBVFRFUk4gPSByJ2NwM1xkJwoKZGVmIHNhZmVyX25hbWUobmFtZSk6CiAgICByZXR1cm4gc2FmZV9uYW1lKG5hbWUpLnJlcGxhY2UoJy0nLCAnXycpCgpkZWYgc2FmZXJfdmVyc2lvbih2ZXJzaW9uKToKICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmVyc2lvbikucmVwbGFjZSgnLScsICdfJykKCmNsYXNzIGJkaXN0X3doZWVsKENvbW1hbmQpOgoKICAgIGRlc2NyaXB0aW9uID0gJ2NyZWF0ZSBhIHdoZWVsIGRpc3RyaWJ1dGlvbicKCiAgICB1c2VyX29wdGlvbnMgPSBbKCdiZGlzdC1kaXI9JywgJ2InLAogICAgICAgICAgICAgICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICgncGxhdC1uYW1lPScsICdwJywKICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCiAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9wbGF0Zm9ybSgpKSwKICAgICAgICAgICAgICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKICAgICAgICAgICAgICAgICAgICAgImtlZXAgdGhlIHBzZXVkby1pbnN0YWxsYXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgIiArCiAgICAgICAgICAgICAgICAgICAgICJjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUiKSwKICAgICAgICAgICAgICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgZmluYWwgYnVpbHQgZGlzdHJpYnV0aW9ucyBpbiIpLAogICAgICAgICAgICAgICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLAogICAgICAgICAgICAgICAgICAgICgncmVsYXRpdmUnLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAiYnVpbGQgdGhlIGFyY2hpdmUgdXNpbmcgcmVsYXRpdmUgcGF0aHMiCiAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogZmFsc2UpIiksCiAgICAgICAgICAgICAgICAgICAgKCdvd25lcj0nLCAndScsCiAgICAgICAgICAgICAgICAgICAgICJPd25lciBuYW1lIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRhciBmaWxlIgogICAgICAgICAgICAgICAgICAgICAiIFtkZWZhdWx0OiBjdXJyZW50IHVzZXJdIiksCiAgICAgICAgICAgICAgICAgICAgKCdncm91cD0nLCAnZycsCiAgICAgICAgICAgICAgICAgICAgICJHcm91cCBuYW1lIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRhciBmaWxlIgogICAgICAgICAgICAgICAgICAgICAiIFtkZWZhdWx0OiBjdXJyZW50IGdyb3VwXSIpLAogICAgICAgICAgICAgICAgICAgICgndW5pdmVyc2FsJywgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgIm1ha2UgYSB1bml2ZXJzYWwgd2hlZWwiCiAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IGZhbHNlKSIpLAogICAgICAgICAgICAgICAgICAgICgncHl0aG9uLXRhZz0nLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIGltcGxlbWVudGF0aW9uIGNvbXBhdGliaWxpdHkgdGFnIgogICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiBweSVzKSIgJSBnZXRfaW1wbF92ZXIoKVswXSksCiAgICAgICAgICAgICAgICAgICAgKCdweS1saW1pdGVkLWFwaT0nLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHRhZyAoY3AzMnxjcDMzfGNwTk4pIGZvciBhYmkzIHdoZWVsIHRhZyIKICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogZmFsc2UpIiksCiAgICAgICAgICAgICAgICAgICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsna2VlcC10ZW1wJywgJ3NraXAtYnVpbGQnLCAncmVsYXRpdmUnLCAndW5pdmVyc2FsJ10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuYmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYuZGF0YV9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5wbGF0X3RhZyA9IE5vbmUKICAgICAgICBzZWxmLmZvcm1hdCA9ICd6aXAnCiAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSBGYWxzZQogICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5kaXN0aW5mb19kaXIgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dpbmZvX2RpciA9IE5vbmUKICAgICAgICBzZWxmLnJvb3RfaXNfcHVyZSA9IE5vbmUKICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSBOb25lCiAgICAgICAgc2VsZi5yZWxhdGl2ZSA9IEZhbHNlCiAgICAgICAgc2VsZi5vd25lciA9IE5vbmUKICAgICAgICBzZWxmLmdyb3VwID0gTm9uZQogICAgICAgIHNlbGYudW5pdmVyc2FsID0gRmFsc2UKICAgICAgICBzZWxmLnB5dGhvbl90YWcgPSAncHknICsgZ2V0X2ltcGxfdmVyKClbMF0KICAgICAgICBzZWxmLnB5X2xpbWl0ZWRfYXBpID0gRmFsc2UKICAgICAgICBzZWxmLnBsYXRfbmFtZV9zdXBwbGllZCA9IEZhbHNlCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5iZGlzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgYmRpc3RfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ3doZWVsJykKCiAgICAgICAgc2VsZi5kYXRhX2RpciA9IHNlbGYud2hlZWxfZGlzdF9uYW1lICsgJy5kYXRhJwogICAgICAgIHNlbGYucGxhdF9uYW1lX3N1cHBsaWVkID0gc2VsZi5wbGF0X25hbWUgaXMgbm90IE5vbmUKCiAgICAgICAgbmVlZF9vcHRpb25zID0gKCdkaXN0X2RpcicsICdwbGF0X25hbWUnLCAnc2tpcF9idWlsZCcpCgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnppcChuZWVkX29wdGlvbnMsIG5lZWRfb3B0aW9ucykpCgogICAgICAgIHNlbGYucm9vdF9pc19wdXJlID0gbm90IChzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKSkKCiAgICAgICAgaWYgc2VsZi5weV9saW1pdGVkX2FwaSBhbmQgbm90IHJlLm1hdGNoKFBZX0xJTUlURURfQVBJX1BBVFRFUk4sIHNlbGYucHlfbGltaXRlZF9hcGkpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJweS1saW1pdGVkLWFwaSBtdXN0IG1hdGNoICclcyciICUgUFlfTElNSVRFRF9BUElfUEFUVEVSTikKCiAgICAgICAgIyBTdXBwb3J0IGxlZ2FjeSBbd2hlZWxdIHNlY3Rpb24gZm9yIHNldHRpbmcgdW5pdmVyc2FsCiAgICAgICAgd2hlZWwgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ3doZWVsJykKICAgICAgICBpZiAndW5pdmVyc2FsJyBpbiB3aGVlbDoKICAgICAgICAgICAgIyBwbGVhc2UgZG9uJ3QgZGVmaW5lIHRoaXMgaW4geW91ciBnbG9iYWwgY29uZmlncwogICAgICAgICAgICB2YWwgPSB3aGVlbFsndW5pdmVyc2FsJ11bMV0uc3RyaXAoKQogICAgICAgICAgICBpZiB2YWwubG93ZXIoKSBpbiAoJzEnLCAndHJ1ZScsICd5ZXMnKToKICAgICAgICAgICAgICAgIHNlbGYudW5pdmVyc2FsID0gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdoZWVsX2Rpc3RfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gZGlzdHJpYnV0aW9uIGZ1bGwgbmFtZSB3aXRoIC0gcmVwbGFjZWQgd2l0aCBfIiIiCiAgICAgICAgcmV0dXJuICctJy5qb2luKChzYWZlcl9uYW1lKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgc2FmZXJfdmVyc2lvbihzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpKSkpCgogICAgZGVmIGdldF90YWcoc2VsZik6CiAgICAgICAgIyBiZGlzdCBzZXRzIHNlbGYucGxhdF9uYW1lIGlmIHVuc2V0LCB3ZSBzaG91bGQgb25seSB1c2UgaXQgZm9yIHB1cmVweQogICAgICAgICMgd2hlZWxzIGlmIHRoZSB1c2VyIHN1cHBsaWVkIGl0LgogICAgICAgIGlmIHNlbGYucGxhdF9uYW1lX3N1cHBsaWVkOgogICAgICAgICAgICBwbGF0X25hbWUgPSBzZWxmLnBsYXRfbmFtZQogICAgICAgIGVsaWYgc2VsZi5yb290X2lzX3B1cmU6CiAgICAgICAgICAgIHBsYXRfbmFtZSA9ICdhbnknCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGxhdF9uYW1lID0gc2VsZi5wbGF0X25hbWUgb3IgZ2V0X3BsYXRmb3JtKCkKICAgICAgICAgICAgaWYgcGxhdF9uYW1lIGluICgnbGludXgteDg2XzY0JywgJ2xpbnV4X3g4Nl82NCcpIGFuZCBzeXMubWF4c2l6ZSA9PSAyMTQ3NDgzNjQ3OgogICAgICAgICAgICAgICAgcGxhdF9uYW1lID0gJ2xpbnV4X2k2ODYnCiAgICAgICAgcGxhdF9uYW1lID0gcGxhdF9uYW1lLnJlcGxhY2UoJy0nLCAnXycpLnJlcGxhY2UoJy4nLCAnXycpCgoKICAgICAgICBpZiBzZWxmLnJvb3RfaXNfcHVyZToKICAgICAgICAgICAgaWYgc2VsZi51bml2ZXJzYWw6CiAgICAgICAgICAgICAgICBpbXBsID0gJ3B5Mi5weTMnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpbXBsID0gc2VsZi5weXRob25fdGFnCiAgICAgICAgICAgIHRhZyA9IChpbXBsLCAnbm9uZScsIHBsYXRfbmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbXBsX25hbWUgPSBnZXRfYWJicl9pbXBsKCkKICAgICAgICAgICAgaW1wbF92ZXIgPSBnZXRfaW1wbF92ZXIoKQogICAgICAgICAgICBpbXBsID0gaW1wbF9uYW1lICsgaW1wbF92ZXIKICAgICAgICAgICAgIyBXZSBkb24ndCB3b3JrIG9uIENQeXRob24gMy4xLCAzLjAuCiAgICAgICAgICAgIGlmIHNlbGYucHlfbGltaXRlZF9hcGkgYW5kIChpbXBsX25hbWUgKyBpbXBsX3Zlcikuc3RhcnRzd2l0aCgnY3AzJyk6CiAgICAgICAgICAgICAgICBpbXBsID0gc2VsZi5weV9saW1pdGVkX2FwaQogICAgICAgICAgICAgICAgYWJpX3RhZyA9ICdhYmkzJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYWJpX3RhZyA9IHN0cihnZXRfYWJpX3RhZygpKS5sb3dlcigpCiAgICAgICAgICAgIHRhZyA9IChpbXBsLCBhYmlfdGFnLCBwbGF0X25hbWUpCiAgICAgICAgICAgIHN1cHBvcnRlZF90YWdzID0gcGVwNDI1dGFncy5nZXRfc3VwcG9ydGVkKAogICAgICAgICAgICAgICAgc3VwcGxpZWRfcGxhdGZvcm09cGxhdF9uYW1lIGlmIHNlbGYucGxhdF9uYW1lX3N1cHBsaWVkIGVsc2UgTm9uZSkKICAgICAgICAgICAgIyBYWFggc3dpdGNoIHRvIHRoaXMgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIGZvciBub24tcHVyZToKICAgICAgICAgICAgaWYgbm90IHNlbGYucHlfbGltaXRlZF9hcGk6CiAgICAgICAgICAgICAgICBhc3NlcnQgdGFnID09IHN1cHBvcnRlZF90YWdzWzBdLCAiJXMgIT0gJXMiICUgKHRhZywgc3VwcG9ydGVkX3RhZ3NbMF0pCiAgICAgICAgICAgIGFzc2VydCB0YWcgaW4gc3VwcG9ydGVkX3RhZ3MsICJ3b3VsZCBidWlsZCB3aGVlbCB3aXRoIHVuc3VwcG9ydGVkIHRhZyAlcyIgJSB0YWcKICAgICAgICByZXR1cm4gdGFnCgogICAgZGVmIGdldF9hcmNoaXZlX2Jhc2VuYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhcmNoaXZlIG5hbWUgd2l0aG91dCBleHRlbnNpb24iIiIKCiAgICAgICAgaW1wbF90YWcsIGFiaV90YWcsIHBsYXRfdGFnID0gc2VsZi5nZXRfdGFnKCkKCiAgICAgICAgYXJjaGl2ZV9iYXNlbmFtZSA9ICIlcy0lcy0lcy0lcyIgJSAoCiAgICAgICAgICAgIHNlbGYud2hlZWxfZGlzdF9uYW1lLAogICAgICAgICAgICBpbXBsX3RhZywKICAgICAgICAgICAgYWJpX3RhZywKICAgICAgICAgICAgcGxhdF90YWcpCiAgICAgICAgcmV0dXJuIGFyY2hpdmVfYmFzZW5hbWUKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGJ1aWxkX3NjcmlwdHMgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKICAgICAgICBidWlsZF9zY3JpcHRzLmV4ZWN1dGFibGUgPSAncHl0aG9uJwoKICAgICAgICBpZiBub3Qgc2VsZi5za2lwX2J1aWxkOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZCcpCgogICAgICAgIGluc3RhbGwgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdpbnN0YWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWluaXRfc3ViY29tbWFuZHM9VHJ1ZSkKICAgICAgICBpbnN0YWxsLnJvb3QgPSBzZWxmLmJkaXN0X2RpcgogICAgICAgIGluc3RhbGwuY29tcGlsZSA9IEZhbHNlCiAgICAgICAgaW5zdGFsbC5za2lwX2J1aWxkID0gc2VsZi5za2lwX2J1aWxkCiAgICAgICAgaW5zdGFsbC53YXJuX2RpciA9IEZhbHNlCgogICAgICAgICMgQSB3aGVlbCB3aXRob3V0IHNldHVwdG9vbHMgc2NyaXB0cyBpcyBtb3JlIGNyb3NzLXBsYXRmb3JtLgogICAgICAgICMgVXNlIHRoZSAodW5kb2N1bWVudGVkKSBgbm9fZXBgIG9wdGlvbiB0byBzZXR1cHRvb2xzJwogICAgICAgICMgaW5zdGFsbF9zY3JpcHRzIGNvbW1hbmQgdG8gYXZvaWQgY3JlYXRpbmcgZW50cnkgcG9pbnQgc2NyaXB0cy4KICAgICAgICBpbnN0YWxsX3NjcmlwdHMgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdpbnN0YWxsX3NjcmlwdHMnKQogICAgICAgIGluc3RhbGxfc2NyaXB0cy5ub19lcCA9IFRydWUKCiAgICAgICAgIyBVc2UgYSBjdXN0b20gc2NoZW1lIGZvciB0aGUgYXJjaGl2ZSwgYmVjYXVzZSB3ZSBoYXZlIHRvIGRlY2lkZQogICAgICAgICMgYXQgaW5zdGFsbGF0aW9uIHRpbWUgd2hpY2ggc2NoZW1lIHRvIHVzZS4KICAgICAgICBmb3Iga2V5IGluICgnaGVhZGVycycsICdzY3JpcHRzJywgJ2RhdGEnLCAncHVyZWxpYicsICdwbGF0bGliJyk6CiAgICAgICAgICAgIHNldGF0dHIoaW5zdGFsbCwKICAgICAgICAgICAgICAgICAgICAnaW5zdGFsbF8nICsga2V5LAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmRhdGFfZGlyLCBrZXkpKQoKICAgICAgICBiYXNlZGlyX29ic2VydmVkID0gJycKCiAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAjIHdpbjMyIGJhcmZzIGlmIGFueSBvZiB0aGVzZSBhcmUgJyc7IGNvdWxkIGJlICcuJz8KICAgICAgICAgICAgIyAoZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbDpjaGFuZ2Vfcm9vdHMgYnVnKQogICAgICAgICAgICBiYXNlZGlyX29ic2VydmVkID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5kYXRhX2RpciwgJy4uJykpCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9saWJiYXNlID0gc2VsZi5pbnN0YWxsX2xpYiA9IGJhc2VkaXJfb2JzZXJ2ZWQKCiAgICAgICAgc2V0YXR0cihpbnN0YWxsLAogICAgICAgICAgICAgICAgJ2luc3RhbGxfcHVyZWxpYicgaWYgc2VsZi5yb290X2lzX3B1cmUgZWxzZSAnaW5zdGFsbF9wbGF0bGliJywKICAgICAgICAgICAgICAgIGJhc2VkaXJfb2JzZXJ2ZWQpCgogICAgICAgIGxvZ2dlci5pbmZvKCJpbnN0YWxsaW5nIHRvICVzIiwgc2VsZi5iZGlzdF9kaXIpCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2luc3RhbGwnKQoKICAgICAgICBhcmNoaXZlX2Jhc2VuYW1lID0gc2VsZi5nZXRfYXJjaGl2ZV9iYXNlbmFtZSgpCgogICAgICAgIHBzZXVkb2luc3RhbGxfcm9vdCA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBhcmNoaXZlX2Jhc2VuYW1lKQogICAgICAgIGlmIG5vdCBzZWxmLnJlbGF0aXZlOgogICAgICAgICAgICBhcmNoaXZlX3Jvb3QgPSBzZWxmLmJkaXN0X2RpcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hpdmVfcm9vdCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHNlbGYuYmRpc3RfZGlyLAogICAgICAgICAgICAgICAgc2VsZi5fZW5zdXJlX3JlbGF0aXZlKGluc3RhbGwuaW5zdGFsbF9iYXNlKSkKCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoCiAgICAgICAgICAgICdpbnN0YWxsX2VnZ19pbmZvJywgKCd0YXJnZXQnLCAnZWdnaW5mb19kaXInKSkKICAgICAgICBzZWxmLmRpc3RpbmZvX2RpciA9IG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMuZGlzdC1pbmZvJyAlIHNlbGYud2hlZWxfZGlzdF9uYW1lKQogICAgICAgIHNlbGYuZWdnMmRpc3Qoc2VsZi5lZ2dpbmZvX2RpciwKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdGluZm9fZGlyKQoKICAgICAgICBzZWxmLndyaXRlX3doZWVsZmlsZShzZWxmLmRpc3RpbmZvX2RpcikKCiAgICAgICAgc2VsZi53cml0ZV9yZWNvcmQoc2VsZi5iZGlzdF9kaXIsIHNlbGYuZGlzdGluZm9fZGlyKQoKICAgICAgICAjIE1ha2UgdGhlIGFyY2hpdmUKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5kaXN0X2Rpcik6CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKHNlbGYuZGlzdF9kaXIpCiAgICAgICAgd2hlZWxfbmFtZSA9IGFyY2hpdmVfd2hlZWxmaWxlKHBzZXVkb2luc3RhbGxfcm9vdCwgYXJjaGl2ZV9yb290KQoKICAgICAgICAjIFNpZ24gdGhlIGFyY2hpdmUKICAgICAgICBpZiAnV0hFRUxfVE9PTCcgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgc3VicHJvY2Vzcy5jYWxsKFtvcy5lbnZpcm9uWydXSEVFTF9UT09MJ10sICdzaWduJywgd2hlZWxfbmFtZV0pCgogICAgICAgICMgQWRkIHRvICdEaXN0cmlidXRpb24uZGlzdF9maWxlcycgc28gdGhhdCB0aGUgInVwbG9hZCIgY29tbWFuZCB3b3JrcwogICAgICAgIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICdkaXN0X2ZpbGVzJywgW10pLmFwcGVuZCgKICAgICAgICAgICAgKCdiZGlzdF93aGVlbCcsIGdldF9weXRob25fdmVyc2lvbigpLCB3aGVlbF9uYW1lKSkKCiAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgogICAgICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygncmVtb3ZpbmcgJXMnLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJtdHJlZShzZWxmLmJkaXN0X2RpcikKCiAgICBkZWYgd3JpdGVfd2hlZWxmaWxlKHNlbGYsIHdoZWVsZmlsZV9iYXNlLCBnZW5lcmF0b3I9J2JkaXN0X3doZWVsICgnICsgd2hlZWxfdmVyc2lvbiArICcpJyk6CiAgICAgICAgZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCiAgICAgICAgbXNnID0gTWVzc2FnZSgpCiAgICAgICAgbXNnWydXaGVlbC1WZXJzaW9uJ10gPSAnMS4wJyAgIyBvZiB0aGUgc3BlYwogICAgICAgIG1zZ1snR2VuZXJhdG9yJ10gPSBnZW5lcmF0b3IKICAgICAgICBtc2dbJ1Jvb3QtSXMtUHVyZWxpYiddID0gc3RyKHNlbGYucm9vdF9pc19wdXJlKS5sb3dlcigpCgogICAgICAgICMgRG9lc24ndCB3b3JrIGZvciBiZGlzdF93aW5pbnN0CiAgICAgICAgaW1wbF90YWcsIGFiaV90YWcsIHBsYXRfdGFnID0gc2VsZi5nZXRfdGFnKCkKICAgICAgICBmb3IgaW1wbCBpbiBpbXBsX3RhZy5zcGxpdCgnLicpOgogICAgICAgICAgICBmb3IgYWJpIGluIGFiaV90YWcuc3BsaXQoJy4nKToKICAgICAgICAgICAgICAgIGZvciBwbGF0IGluIHBsYXRfdGFnLnNwbGl0KCcuJyk6CiAgICAgICAgICAgICAgICAgICAgbXNnWydUYWcnXSA9ICctJy5qb2luKChpbXBsLCBhYmksIHBsYXQpKQoKICAgICAgICB3aGVlbGZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih3aGVlbGZpbGVfYmFzZSwgJ1dIRUVMJykKICAgICAgICBsb2dnZXIuaW5mbygnY3JlYXRpbmcgJXMnLCB3aGVlbGZpbGVfcGF0aCkKICAgICAgICB3aXRoIG9wZW4od2hlZWxmaWxlX3BhdGgsICd3JykgYXMgZjoKICAgICAgICAgICAgR2VuZXJhdG9yKGYsIG1heGhlYWRlcmxlbj0wKS5mbGF0dGVuKG1zZykKCiAgICBkZWYgX2Vuc3VyZV9yZWxhdGl2ZShzZWxmLCBwYXRoKToKICAgICAgICAjIGNvcGllZCBmcm9tIGRpcl91dGlsLCBkZWxldGVkCiAgICAgICAgZHJpdmUsIHBhdGggPSBvcy5wYXRoLnNwbGl0ZHJpdmUocGF0aCkKICAgICAgICBpZiBwYXRoWzA6MV0gPT0gb3Muc2VwOgogICAgICAgICAgICBwYXRoID0gZHJpdmUgKyBwYXRoWzE6XQogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9wa2dpbmZvX3RvX21ldGFkYXRhKHNlbGYsIGVnZ19pbmZvX3BhdGgsIHBrZ2luZm9fcGF0aCk6CiAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnBrZ2luZm9fdG9fbWV0YWRhdGEoZWdnX2luZm9fcGF0aCwgcGtnaW5mb19wYXRoKQoKICAgIGRlZiBsaWNlbnNlX2ZpbGUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGxpY2Vuc2UgZmlsZW5hbWUgZnJvbSBhIGxpY2Vuc2UtZmlsZSBrZXkgaW4gc2V0dXAuY2ZnLCBvciBOb25lLiIiIgogICAgICAgIG1ldGFkYXRhID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdtZXRhZGF0YScpCiAgICAgICAgaWYgbm90ICdsaWNlbnNlX2ZpbGUnIGluIG1ldGFkYXRhOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBtZXRhZGF0YVsnbGljZW5zZV9maWxlJ11bMV0KCiAgICBkZWYgc2V0dXBjZmdfcmVxdWlyZW1lbnRzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIHJlcXVpcmVtZW50cyBmcm9tIHNldHVwLmNmZyBhcwogICAgICAgICgnUmVxdWlyZXMtRGlzdCcsICdyZXF1aXJlbWVudDsgcXVhbGlmaWVyJykgdHVwbGVzLiBGcm9tIGEgbWV0YWRhdGEKICAgICAgICBzZWN0aW9uIGluIHNldHVwLmNmZzoKCiAgICAgICAgW21ldGFkYXRhXQogICAgICAgIHByb3ZpZGVzLWV4dHJhID0gZXh0cmExCiAgICAgICAgICAgIGV4dHJhMgogICAgICAgIHJlcXVpcmVzLWRpc3QgPSByZXF1aXJlbWVudDsgcXVhbGlmaWVyCiAgICAgICAgICAgIGFub3RoZXI7IHF1YWxpZmllcjIKICAgICAgICAgICAgdW5xdWFsaWZpZWQKCiAgICAgICAgWWllbGRzCgogICAgICAgICgnUHJvdmlkZXMtRXh0cmEnLCAnZXh0cmExJyksCiAgICAgICAgKCdQcm92aWRlcy1FeHRyYScsICdleHRyYTInKSwKICAgICAgICAoJ1JlcXVpcmVzLURpc3QnLCAncmVxdWlyZW1lbnQ7IHF1YWxpZmllcicpLAogICAgICAgICgnUmVxdWlyZXMtRGlzdCcsICdhbm90aGVyOyBxdWFsaWZpZXIyJyksCiAgICAgICAgKCdSZXF1aXJlcy1EaXN0JywgJ3VucXVhbGlmaWVkJykKICAgICAgICAiIiIKICAgICAgICBtZXRhZGF0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnbWV0YWRhdGEnKQoKICAgICAgICAjIG91ciAuaW5pIHBhcnNlciBmb2xkcyAtIHRvIF8gaW4ga2V5IG5hbWVzOgogICAgICAgIGZvciBrZXksIHRpdGxlIGluICgoJ3Byb3ZpZGVzX2V4dHJhJywgJ1Byb3ZpZGVzLUV4dHJhJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgncmVxdWlyZXNfZGlzdCcsICdSZXF1aXJlcy1EaXN0JykpOgogICAgICAgICAgICBpZiBub3Qga2V5IGluIG1ldGFkYXRhOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZmllbGQgPSBtZXRhZGF0YVtrZXldCiAgICAgICAgICAgIGZvciBsaW5lIGluIGZpZWxkWzFdLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB5aWVsZCAodGl0bGUsIGxpbmUpCgogICAgZGVmIGFkZF9yZXF1aXJlbWVudHMoc2VsZiwgbWV0YWRhdGFfcGF0aCk6CiAgICAgICAgIiIiQWRkIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGZyb20gc2V0dXAuY2ZnIHRvIGZpbGUgbWV0YWRhdGFfcGF0aCIiIgogICAgICAgIGFkZGl0aW9uYWwgPSBsaXN0KHNlbGYuc2V0dXBjZmdfcmVxdWlyZW1lbnRzKCkpCiAgICAgICAgaWYgbm90IGFkZGl0aW9uYWw6IHJldHVybgogICAgICAgIHBrZ19pbmZvID0gcmVhZF9wa2dfaW5mbyhtZXRhZGF0YV9wYXRoKQogICAgICAgIGlmICdQcm92aWRlcy1FeHRyYScgaW4gcGtnX2luZm8gb3IgJ1JlcXVpcmVzLURpc3QnIGluIHBrZ19pbmZvOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdzZXR1cC5jZmcgcmVxdWlyZW1lbnRzIG92ZXJ3cml0ZSB2YWx1ZXMgZnJvbSBzZXR1cC5weScpCiAgICAgICAgICAgIGRlbCBwa2dfaW5mb1snUHJvdmlkZXMtRXh0cmEnXQogICAgICAgICAgICBkZWwgcGtnX2luZm9bJ1JlcXVpcmVzLURpc3QnXQogICAgICAgIGZvciBrLCB2IGluIGFkZGl0aW9uYWw6CiAgICAgICAgICAgIHBrZ19pbmZvW2tdID0gdgogICAgICAgIHdyaXRlX3BrZ19pbmZvKG1ldGFkYXRhX3BhdGgsIHBrZ19pbmZvKQoKICAgIGRlZiBlZ2cyZGlzdChzZWxmLCBlZ2dpbmZvX3BhdGgsIGRpc3RpbmZvX3BhdGgpOgogICAgICAgICIiIkNvbnZlcnQgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBpbnRvIGEgLmRpc3QtaW5mbyBkaXJlY3RvcnkiIiIKICAgICAgICBkZWYgYWRpb3MocCk6CiAgICAgICAgICAgICIiIkFwcHJvcHJpYXRlbHkgZGVsZXRlIGRpcmVjdG9yeSwgZmlsZSBvciBsaW5rLiIiIgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHApIGFuZCBvcy5wYXRoLmlzZGlyKHApOgogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShwKQogICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHApOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHApCgogICAgICAgIGFkaW9zKGRpc3RpbmZvX3BhdGgpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhlZ2dpbmZvX3BhdGgpOgogICAgICAgICAgICAjIFRoZXJlIGlzIG5vIGVnZy1pbmZvLiBUaGlzIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhlIGVnZy1pbmZvCiAgICAgICAgICAgICMgZmlsZS9kaXJlY3RvcnkgaXMgbm90IG5hbWVkIG1hdGNoaW5nIHRoZSBkaXN0cmlidXRpb24gbmFtZSB1c2VkCiAgICAgICAgICAgICMgdG8gbmFtZSB0aGUgYXJjaGl2ZSBmaWxlLiBDaGVjayBmb3IgdGhpcyBjYXNlIGFuZCByZXBvcnQKICAgICAgICAgICAgIyBhY2NvcmRpbmdseS4KICAgICAgICAgICAgaW1wb3J0IGdsb2IKICAgICAgICAgICAgcGF0ID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShlZ2dpbmZvX3BhdGgpLCAnKi5lZ2ctaW5mbycpCiAgICAgICAgICAgIHBvc3NpYmxlID0gZ2xvYi5nbG9iKHBhdCkKICAgICAgICAgICAgZXJyID0gIkVnZyBtZXRhZGF0YSBleHBlY3RlZCBhdCAlcyBidXQgbm90IGZvdW5kIiAlIChlZ2dpbmZvX3BhdGgsKQogICAgICAgICAgICBpZiBwb3NzaWJsZToKICAgICAgICAgICAgICAgIGFsdCA9IG9zLnBhdGguYmFzZW5hbWUocG9zc2libGVbMF0pCiAgICAgICAgICAgICAgICBlcnIgKz0gIiAoJXMgZm91bmQgLSBwb3NzaWJsZSBtaXNuYW1lZCBhcmNoaXZlIGZpbGU/KSIgJSAoYWx0LCkKCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJyKQoKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShlZ2dpbmZvX3BhdGgpOgogICAgICAgICAgICAjIC5lZ2ctaW5mbyBpcyBhIHNpbmdsZSBmaWxlCiAgICAgICAgICAgIHBrZ2luZm9fcGF0aCA9IGVnZ2luZm9fcGF0aAogICAgICAgICAgICBwa2dfaW5mbyA9IHNlbGYuX3BrZ2luZm9fdG9fbWV0YWRhdGEoZWdnaW5mb19wYXRoLCBlZ2dpbmZvX3BhdGgpCiAgICAgICAgICAgIG9zLm1rZGlyKGRpc3RpbmZvX3BhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyAuZWdnLWluZm8gaXMgYSBkaXJlY3RvcnkKICAgICAgICAgICAgcGtnaW5mb19wYXRoID0gb3MucGF0aC5qb2luKGVnZ2luZm9fcGF0aCwgJ1BLRy1JTkZPJykKICAgICAgICAgICAgcGtnX2luZm8gPSBzZWxmLl9wa2dpbmZvX3RvX21ldGFkYXRhKGVnZ2luZm9fcGF0aCwgcGtnaW5mb19wYXRoKQoKICAgICAgICAgICAgIyBpZ25vcmUgY29tbW9uIGVnZyBtZXRhZGF0YSB0aGF0IGlzIHVzZWxlc3MgdG8gd2hlZWwKICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKGVnZ2luZm9fcGF0aCwgZGlzdGluZm9fcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZT1sYW1iZGEgeCwgeTogc2V0KCgnUEtHLUlORk8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcy50eHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTT1VSQ0VTLnR4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdC16aXAtc2FmZScsKSkpCgogICAgICAgICAgICAjIGRlbGV0ZSBkZXBlbmRlbmN5X2xpbmtzIGlmIGl0IGlzIG9ubHkgd2hpdGVzcGFjZQogICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwgJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKICAgICAgICAgICAgd2l0aCBvcGVuKGRlcGVuZGVuY3lfbGlua3NfcGF0aCwgJ3InKSBhcyBkZXBlbmRlbmN5X2xpbmtzX2ZpbGU6CiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzID0gZGVwZW5kZW5jeV9saW5rc19maWxlLnJlYWQoKS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBkZXBlbmRlbmN5X2xpbmtzOgogICAgICAgICAgICAgICAgYWRpb3MoZGVwZW5kZW5jeV9saW5rc19wYXRoKQoKICAgICAgICB3cml0ZV9wa2dfaW5mbyhvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwgJ01FVEFEQVRBJyksIHBrZ19pbmZvKQoKICAgICAgICAjIFhYWCBkZXByZWNhdGVkLiBTdGlsbCB1c2VmdWwgZm9yIGN1cnJlbnQgZGlzdHJpYnV0ZS9zZXR1cHRvb2xzLgogICAgICAgIG1ldGFkYXRhX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwgJ01FVEFEQVRBJykKICAgICAgICBzZWxmLmFkZF9yZXF1aXJlbWVudHMobWV0YWRhdGFfcGF0aCkKCiAgICAgICAgIyBYWFggaW50ZW50aW9uYWxseSBhIGRpZmZlcmVudCBwYXRoIHRoYW4gdGhlIFBFUC4KICAgICAgICBtZXRhZGF0YV9qc29uX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwgJ21ldGFkYXRhLmpzb24nKQogICAgICAgIHB5bWV0YSA9IHBrZ2luZm9fdG9fZGljdChtZXRhZGF0YV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb249c2VsZi5kaXN0cmlidXRpb24pCgogICAgICAgIGlmICdkZXNjcmlwdGlvbicgaW4gcHltZXRhOgogICAgICAgICAgICBkZXNjcmlwdGlvbl9maWxlbmFtZSA9ICdERVNDUklQVElPTi5yc3QnCiAgICAgICAgICAgIGRlc2NyaXB0aW9uX3RleHQgPSBweW1ldGEucG9wKCdkZXNjcmlwdGlvbicpCiAgICAgICAgICAgIGRlc2NyaXB0aW9uX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdGluZm9fcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9maWxlbmFtZSkKICAgICAgICAgICAgd2l0aCBvcGVuKGRlc2NyaXB0aW9uX3BhdGgsICJ3YiIpIGFzIGRlc2NyaXB0aW9uX2ZpbGU6CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9maWxlLndyaXRlKGRlc2NyaXB0aW9uX3RleHQuZW5jb2RlKCd1dGYtOCcpKQogICAgICAgICAgICBweW1ldGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmRldGFpbHMnXVsnZG9jdW1lbnRfbmFtZXMnXVsnZGVzY3JpcHRpb24nXSA9IGRlc2NyaXB0aW9uX2ZpbGVuYW1lCgogICAgICAgICMgWFhYIGhldXJpc3RpY2FsbHkgY29weSBhbnkgTElDRU5TRS9MSUNFTlNFLnR4dD8KICAgICAgICBsaWNlbnNlID0gc2VsZi5saWNlbnNlX2ZpbGUoKQogICAgICAgIGlmIGxpY2Vuc2U6CiAgICAgICAgICAgIGxpY2Vuc2VfZmlsZW5hbWUgPSAnTElDRU5TRS50eHQnCiAgICAgICAgICAgIHNodXRpbC5jb3B5KGxpY2Vuc2UsIG9zLnBhdGguam9pbihzZWxmLmRpc3RpbmZvX2RpciwgbGljZW5zZV9maWxlbmFtZSkpCiAgICAgICAgICAgIHB5bWV0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZGV0YWlscyddWydkb2N1bWVudF9uYW1lcyddWydsaWNlbnNlJ10gPSBsaWNlbnNlX2ZpbGVuYW1lCgogICAgICAgIHdpdGggb3BlbihtZXRhZGF0YV9qc29uX3BhdGgsICJ3IikgYXMgbWV0YWRhdGFfanNvbjoKICAgICAgICAgICAganNvbi5kdW1wKHB5bWV0YSwgbWV0YWRhdGFfanNvbiwgc29ydF9rZXlzPVRydWUpCgogICAgICAgIGFkaW9zKGVnZ2luZm9fcGF0aCkKCiAgICBkZWYgd3JpdGVfcmVjb3JkKHNlbGYsIGJkaXN0X2RpciwgZGlzdGluZm9fZGlyKToKICAgICAgICBmcm9tIC51dGlsIGltcG9ydCB1cmxzYWZlX2I2NGVuY29kZQoKICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19kaXIsICdSRUNPUkQnKQogICAgICAgIHJlY29yZF9yZWxwYXRoID0gb3MucGF0aC5yZWxwYXRoKHJlY29yZF9wYXRoLCBiZGlzdF9kaXIpCgogICAgICAgIGRlZiB3YWxrKCk6CiAgICAgICAgICAgIGZvciBkaXIsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoYmRpc3RfZGlyKToKICAgICAgICAgICAgICAgIGRpcnMuc29ydCgpCiAgICAgICAgICAgICAgICBmb3IgZiBpbiBzb3J0ZWQoZmlsZXMpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihkaXIsIGYpCgogICAgICAgIGRlZiBza2lwKHBhdGgpOgogICAgICAgICAgICAiIiJXaGVlbCBoYXNoZXMgZXZlcnkgcG9zc2libGUgZmlsZS4iIiIKICAgICAgICAgICAgcmV0dXJuIChwYXRoID09IHJlY29yZF9yZWxwYXRoKQoKICAgICAgICB3aXRoIG9wZW5fZm9yX2NzdihyZWNvcmRfcGF0aCwgJ3crJykgYXMgcmVjb3JkX2ZpbGU6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIocmVjb3JkX2ZpbGUpCiAgICAgICAgICAgIGZvciBwYXRoIGluIHdhbGsoKToKICAgICAgICAgICAgICAgIHJlbHBhdGggPSBvcy5wYXRoLnJlbHBhdGgocGF0aCwgYmRpc3RfZGlyKQogICAgICAgICAgICAgICAgaWYgc2tpcChyZWxwYXRoKToKICAgICAgICAgICAgICAgICAgICBoYXNoID0gJycKICAgICAgICAgICAgICAgICAgICBzaXplID0gJycKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgIGRpZ2VzdCA9IGhhc2hsaWIuc2hhMjU2KGRhdGEpLmRpZ2VzdCgpCiAgICAgICAgICAgICAgICAgICAgaGFzaCA9ICdzaGEyNTY9JyArIG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShkaWdlc3QpKQogICAgICAgICAgICAgICAgICAgIHNpemUgPSBsZW4oZGF0YSkKICAgICAgICAgICAgICAgIHJlY29yZF9wYXRoID0gb3MucGF0aC5yZWxwYXRoKAogICAgICAgICAgICAgICAgICAgIHBhdGgsIGJkaXN0X2RpcikucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKQogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChyZWNvcmRfcGF0aCwgaGFzaCwgc2l6ZSkpClBLAwQUAAAAAAAAACEAo3lSdx0CAAAdAgAANAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9kZWNvcmF0b3IucHkjIGZyb20gUHlyYW1pZAoKCmNsYXNzIHJlaWZ5KG9iamVjdCk6CiAgICAiIiJQdXQgdGhlIHJlc3VsdCBvZiBhIG1ldGhvZCB3aGljaCB1c2VzIHRoaXMgKG5vbi1kYXRhKQogICAgZGVzY3JpcHRvciBkZWNvcmF0b3IgaW4gdGhlIGluc3RhbmNlIGRpY3QgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwsCiAgICBlZmZlY3RpdmVseSByZXBsYWNpbmcgdGhlIGRlY29yYXRvciB3aXRoIGFuIGluc3RhbmNlIHZhcmlhYmxlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdyYXBwZWQpOgogICAgICAgIHNlbGYud3JhcHBlZCA9IHdyYXBwZWQKICAgICAgICBzZWxmLl9fZG9jX18gPSB3cmFwcGVkLl9fZG9jX18KCiAgICBkZWYgX19nZXRfXyhzZWxmLCBpbnN0LCBvYmp0eXBlPU5vbmUpOgogICAgICAgIGlmIGluc3QgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICB2YWwgPSBzZWxmLndyYXBwZWQoaW5zdCkKICAgICAgICBzZXRhdHRyKGluc3QsIHNlbGYud3JhcHBlZC5fX25hbWVfXywgdmFsKQogICAgICAgIHJldHVybiB2YWwKUEsDBBQAAAAAAAAAIQDTYQ8k0wsAANMLAAA0AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2VnZzJ3aGVlbC5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgppbXBvcnQgb3MucGF0aAppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHdoZWVsLmJkaXN0X3doZWVsCmltcG9ydCBzaHV0aWwKaW1wb3J0IGRpc3R1dGlscy5kaXN0CmZyb20gZGlzdHV0aWxzLmFyY2hpdmVfdXRpbCBpbXBvcnQgbWFrZV9hcmNoaXZlCmZyb20gYXJncGFyc2UgaW1wb3J0IEFyZ3VtZW50UGFyc2VyCmZyb20gZ2xvYiBpbXBvcnQgaWdsb2IKZnJvbSB3aGVlbC53aW5pbnN0MndoZWVsIGltcG9ydCBfYmRpc3Rfd2hlZWxfdGFnCgplZ2dfaW5mb19yZSA9IHJlLmNvbXBpbGUocicnJyg/UDxuYW1lPi4rPyktKD9QPHZlcj4uKz8pCiAgICAoLSg/UDxweXZlcj4uKz8pKT8oLSg/UDxhcmNoPi4rPykpPy5lZ2cnJycsIHJlLlZFUkJPU0UpCgpkZWYgZWdnMndoZWVsKGVnZ19wYXRoLCBkZXN0X2Rpcik6CiAgICBlZ2dfaW5mbyA9IGVnZ19pbmZvX3JlLm1hdGNoKG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpKS5ncm91cGRpY3QoKQogICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9Il9lMnciKQogICAgaWYgb3MucGF0aC5pc2ZpbGUoZWdnX3BhdGgpOgogICAgICAgICMgYXNzdW1lIHdlIGhhdmUgYSBiZGlzdF9lZ2cgb3RoZXJ3aXNlCiAgICAgICAgZWdnID0gemlwZmlsZS5aaXBGaWxlKGVnZ19wYXRoKQogICAgICAgIGVnZy5leHRyYWN0YWxsKGRpcikKICAgIGVsc2U6CiAgICAgICAgIyBzdXBwb3J0IGJ1aWxkb3V0LXN0eWxlIGluc3RhbGxlZCBlZ2dzIGRpcmVjdG9yaWVzCiAgICAgICAgZm9yIHB0aCBpbiBvcy5saXN0ZGlyKGVnZ19wYXRoKToKICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKGVnZ19wYXRoLCBwdGgpCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNyYyk6CiAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIoc3JjLCBkaXIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaHV0aWwuY29weXRyZWUoc3JjLCBvcy5wYXRoLmpvaW4oZGlyLCBwdGgpKQoKICAgIGRpc3RfaW5mbyA9ICIlcy0lcyIgJSAoZWdnX2luZm9bJ25hbWUnXSwgZWdnX2luZm9bJ3ZlciddKQogICAgYWJpID0gJ25vbmUnCiAgICBweXZlciA9IGVnZ19pbmZvWydweXZlciddLnJlcGxhY2UoJy4nLCAnJykKICAgIGFyY2ggPSAoZWdnX2luZm9bJ2FyY2gnXSBvciAnYW55JykucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGlmIGFyY2ggIT0gJ2FueSc6CiAgICAgICAgIyBhc3N1bWUgYWxsIGJpbmFyeSBlZ2dzIGFyZSBmb3IgQ1B5dGhvbgogICAgICAgIHB5dmVyID0gJ2NwJyArIHB5dmVyWzI6XQogICAgd2hlZWxfbmFtZSA9ICctJy5qb2luKCgKICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHl2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWJpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2gKICAgICAgICAgICAgICAgICAgICAgICAgICApKQogICAgcm9vdF9pc19wdXJlbGliID0gZWdnX2luZm9bJ2FyY2gnXSBpcyBOb25lCiAgICBpZiByb290X2lzX3B1cmVsaWI6CiAgICAgICAgYncgPSB3aGVlbC5iZGlzdF93aGVlbC5iZGlzdF93aGVlbChkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24oKSkKICAgIGVsc2U6CiAgICAgICAgYncgPSBfYmRpc3Rfd2hlZWxfdGFnKGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbigpKQoKICAgIGJ3LnJvb3RfaXNfcHVyZSA9IHJvb3RfaXNfcHVyZWxpYgogICAgYncucHl0aG9uX3RhZyA9IHB5dmVyCiAgICBidy5wbGF0X25hbWVfc3VwcGxpZWQgPSBUcnVlCiAgICBidy5wbGF0X25hbWUgPSBlZ2dfaW5mb1snYXJjaCddIG9yICdhbnknCiAgICBpZiBub3Qgcm9vdF9pc19wdXJlbGliOgogICAgICAgIGJ3LmZ1bGxfdGFnX3N1cHBsaWVkID0gVHJ1ZQogICAgICAgIGJ3LmZ1bGxfdGFnID0gKHB5dmVyLCBhYmksIGFyY2gpCgogICAgZGlzdF9pbmZvX2RpciA9IG9zLnBhdGguam9pbihkaXIsICclcy5kaXN0LWluZm8nICUgZGlzdF9pbmZvKQogICAgYncuZWdnMmRpc3Qob3MucGF0aC5qb2luKGRpciwgJ0VHRy1JTkZPJyksCiAgICAgICAgICAgICAgICBkaXN0X2luZm9fZGlyKQogICAgYncud3JpdGVfd2hlZWxmaWxlKGRpc3RfaW5mb19kaXIsIGdlbmVyYXRvcj0nZWdnMndoZWVsJykKICAgIGJ3LndyaXRlX3JlY29yZChkaXIsIGRpc3RfaW5mb19kaXIpCiAgICBmaWxlbmFtZSA9IG1ha2VfYXJjaGl2ZShvcy5wYXRoLmpvaW4oZGVzdF9kaXIsIHdoZWVsX25hbWUpLCAnemlwJywgcm9vdF9kaXI9ZGlyKQogICAgb3MucmVuYW1lKGZpbGVuYW1lLCBmaWxlbmFtZVs6LTNdICsgJ3dobCcpCiAgICBzaHV0aWwucm10cmVlKGRpcikKCmRlZiBtYWluKCk6CiAgICBwYXJzZXIgPSBBcmd1bWVudFBhcnNlcigpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdlZ2dzJywgbmFyZ3M9JyonLCBoZWxwPSJFZ2dzIHRvIGNvbnZlcnQiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZXN0LWRpcicsICctZCcsIGRlZmF1bHQ9b3MucGF0aC5jdXJkaXIsCiAgICAgICAgICAgIGhlbHA9IkRpcmVjdG9yeSB0byBzdG9yZSB3aGVlbHMgKGRlZmF1bHQgJShkZWZhdWx0KXMpIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsICctdicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogICAgZm9yIHBhdCBpbiBhcmdzLmVnZ3M6CiAgICAgICAgZm9yIGVnZyBpbiBpZ2xvYihwYXQpOgogICAgICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJ7MH0uLi4gIi5mb3JtYXQoZWdnKSkKICAgICAgICAgICAgZWdnMndoZWVsKGVnZywgYXJncy5kZXN0X2RpcikKICAgICAgICAgICAgaWYgYXJncy52ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiT0tcbiIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAECTyM7oJAAC6CQAANAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9lZ2duYW1lcy50eHR2Y2FyZC0wLjcuOC1weTIuNy5lZ2cKcXRhbGNoZW15LTAuNy4xLXB5Mi43LmVnZwpBTVFQRGVsaXZlci0wLjEtcHkyLjcuZWdnCmluZmkucmVnaXN0cnktMC4xLjEtcHkyLjcuZWdnCmluZmkuaW5zdHJ1Y3QtMC41LjUtcHkyLjcuZWdnCmluZmkuZGV2aWNlbWFuYWdlci0wLjEuMi1weTIuNy5lZ2cKVHJhY1RpeFN1bW1hcnktMS4wLXB5Mi43LmVnZwpUb3NjYVdpZGdldHMtMC45LjEyLXB5Mi43LmVnZwphcmNoaXBlbF9hZ2VudF9pcGhvbmVfbm90aWZpY2F0aW9uLTAuNS4wYmV0YS1weTIuNy5lZ2cKYXJjaGlwZWxfYWdlbnRfYWN0aW9uX3NjaGVkdWxlci0wLjUuMGJldGEtcHkyLjcuZWdnCmFvLnNvY2lhbC0xLjAuMi1weTIuNy5lZ2cKYXBnbC0wLjctcHkyLjcuZWdnCnNhdGNobW9fcGF5bWVudF9wYXl3b3JsZC0wLjEuMS1weTIuNy5lZ2cKc25tcHNpbS0wLjEuMy1weTIuNy5lZ2cKc3NoaW0tMC4yLXB5Mi43LmVnZwpzaG92ZS0wLjMuNC1weTIuNy5lZ2cKc2ltcGxlYXZyby0wLjMuMC1weTIuNy5lZ2cKd2todG1sdG9wZGYtMC4yLXB5Mi43LmVnZwp3b2trZWwtMC43LjAtcHkyLjcuZWdnCmptYm9fc29jaWFsLTAuMC42LXB5Mi43LmVnZwpqbWJvX3Bvc3QtMC4wLjYtcHkyLjcuZWdnCmpjcmFjay0wLjAuMi1weTIuNy5lZ2cKcmlhay0xLjQuMC1weTIuNy5lZ2cKcmVzdGNsaWVudC0wLjEwLjItcHkyLjcuZWdnClN1dGVraC0wLjguMS1weTIuNy5lZ2cKdHJheWlmeS0wLjAuMS1weTIuNy5lZ2cKdHdlZXB5LTEuOS1weTIuNy5lZ2cKdG9wem9vdG9vbHMtMC4yLjEtcHkyLjcuZWdnCmhheXN0YWNrLTAuMTYtcHkyLjcuZWdnCnpvcGUuaW50ZXJmYWNlLTQuMC4xLXB5Mi43LXdpbjMyLmVnZwpuZXVyb3NoYXJlLTAuOC41LXB5Mi43LW1hY29zeC0xMC43LWludGVsLmVnZwpuZGdfaHR0cHNjbGllbnQtMC4yLjAtcHkyLjcuZWdnCmxpYnRlbGUtMC4zLXB5Mi43LmVnZwpsaXRleC5jeHBvb2wtMS4wLjItcHkyLjcuZWdnCm9ic3B5LmlyaXMtMC41LjEtcHkyLjcuZWdnCm9ic3B5Lm1zZWVkLTAuNi4xLXB5Mi43LXdpbjMyLmVnZwpvYnNweS5jb3JlLTAuNi4yLXB5Mi43LmVnZwpDb3JlUG9zdC0wLjAuMy1weTIuNy5lZ2cKZm5vcmRzdGFsay0wLjAuMy1weTIuNy5lZ2cKUGVyc2lzdGVuY2UtMi4xMy4yLXB5Mi43LXdpbjMyLmVnZwpQeWRhcC0zLjEuUkMxLXB5Mi43LmVnZwpQeUV4ZWNKUy0xLjAuNC1weTIuNy5lZ2cKV2FsbHktMC43LjItcHkyLjcuZWdnCkV4dGVuc2lvbkNsYXNzLTQuMGExLXB5Mi43LXdpbjMyLmVnZwpGZWVkamFjay0wLjkuMTYtcHkyLjcuZWdnCk1hcnMyNC0wLjMuOS1weTIuNy5lZ2cKSGFsV2ViLTAuNi4wLXB5Mi43LmVnZwpEQVJFLTAuNy4xNDAtcHkyLjcuZWdnCm1hY2hvbGliLTEuMy1weTIuNy5lZ2cKbWFycm93LndzZ2kuZWdyZXNzLmNvbXByZXNzaW9uLTEuMS1weTIuNy5lZ2cKbWNzLTAuMy43LXB5Mi43LmVnZwpLb29rLTAuNi4wLXB5Mi43LmVnZwplci0wLjEtcHkyLjcuZWdnCmV2YXNpb25fZGlyZWN0b3ItMS4xLjQtcHkyLjcuZWdnCmRqcXVlcnktMC4xYS1weTIuNy5lZ2cKZGphbmdvX2ZhY3RvcnktMC43LXB5Mi43LmVnZwpkamFuZ29fZ2l6bW8tMC4wLjMtcHkyLjcuZWdnCmRqYW5nb19jYXRlZ29yeS0wLjEtcHkyLjcuZWdnCmRid3JhcC0wLjMuMi1weTIuNy5lZ2cKZGphbmdvX3N1cGVyZ2VuZXJpYy0xLjAtcHkyLjcuZWdnCmRqYW5nb19keW5hbW8tMC4yNS1weTIuNy5lZ2cKZGphbmdvX2Fjb2xsYWJhdXRoLTAuMS1weTIuNy5lZ2cKZGphbmdvX3FybGluay0wLjEuMC1weTIuNy5lZ2cKZGphbmdvX2FkZG9ucy0wLjYuNi1weTIuNy5lZ2cKY292ZXJfZ3JhYmJlci0xLjEuMi1weTIuNy5lZ2cKY2hlbS0xLjEtcHkyLjcuZWdnCmNydWQtMC4xLXB5Mi43LmVnZwpib25nby0wLjEtcHkyLjcuZWdnCmJ5dGVjb2RlaGFja3MtQXByaWwyMDAwLXB5Mi43LmVnZwpncmVlbmxldC0wLjMuNC1weTIuNy13aW4zMi5lZ2cKZ2ludm9rZS0wLjMuMS1weTIuNy5lZ2cKcHlvYmpjX2ZyYW1ld29ya19TY3JpcHRpbmdCcmlkZ2UtMi4zLXB5Mi43LmVnZwpwZWNhbi0wLjIuMGEtcHkyLjcuZWdnCnB5cmVzcy0wLjIuMC1weTIuNy5lZ2cKcHlvYmpjX2ZyYW1ld29ya19QdWJTdWItMi4zLXB5Mi43LmVnZwpweW9iamNfZnJhbWV3b3JrX0V4Y2VwdGlvbkhhbmRsaW5nLTIuMy1weTIuNy5lZ2cKcHl3cHMtdHJ1bmstcHkyLjcuZWdnCnB5b2JqY19mcmFtZXdvcmtfQ0ZOZXR3b3JrLTIuMy1weTIuNy1tYWNvc3gtMTAuNi1mYXQuZWdnCnB5LnNhdW50ZXItMC40MC1weTIuNy5lZ2cKcHlmbm9yZG1ldHJpYy0wLjAuMS1weTIuNy5lZ2cKcHl3cy0xLjEuMS1weTIuNy5lZ2cKcHJlc3RhcHl0LTAuNC4wLXB5Mi43LmVnZwpwYXNzbGliLTEuNS4zLXB5Mi43LmVnZwpweWdhLTIuMS1weTIuNy5lZ2cKcHlnaXRodWIzLTAuMy1weTIuNy5lZ2cKcHlvYmpjX2ZyYW1ld29ya19PcGVuRGlyZWN0b3J5LTIuMy1weTIuNy5lZ2cKeWFwb3NpYi0wLjIuNzUtcHkyLjctbGludXgteDg2XzY0LmVnZwpQSwMEFAAAAAAAAAAhALG8ufayRgAAskYAADIAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvaW5zdGFsbC5weSIiIgpPcGVyYXRpb25zIG9uIGV4aXN0aW5nIHdoZWVsIGZpbGVzLCBpbmNsdWRpbmcgYmFzaWMgaW5zdGFsbGF0aW9uLiAKIiIiCiMgWFhYIHNlZSBwYXRjaGVkIHBpcCB0byBpbnN0YWxsCgppbXBvcnQgc3lzCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgb3MucGF0aAppbXBvcnQgcmUKaW1wb3J0IHppcGZpbGUKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGNzdgoKaW1wb3J0IHNodXRpbAoKdHJ5OgogICAgX2JpZ19udW1iZXIgPSBzeXMubWF4c2l6ZQpleGNlcHQgTmFtZUVycm9yOgogICAgX2JpZ19udW1iZXIgPSBzeXMubWF4aW50Cgpmcm9tIC5kZWNvcmF0b3IgaW1wb3J0IHJlaWZ5CmZyb20gLnV0aWwgaW1wb3J0ICh1cmxzYWZlX2I2NGVuY29kZSwgZnJvbV9qc29uLCB1cmxzYWZlX2I2NGRlY29kZSwKICAgICAgICAgICAgICAgICAgIG5hdGl2ZSwgYmluYXJ5LCBIYXNoaW5nRmlsZSkKZnJvbSAuIGltcG9ydCBzaWduYXR1cmVzCmZyb20gLnBrZ2luZm8gaW1wb3J0IHJlYWRfcGtnX2luZm9fYnl0ZXMKZnJvbSAudXRpbCBpbXBvcnQgb3Blbl9mb3JfY3N2Cgpmcm9tIC5wZXA0MjV0YWdzIGltcG9ydCBnZXRfc3VwcG9ydGVkCmZyb20gLnBhdGhzIGltcG9ydCBnZXRfaW5zdGFsbF9wYXRocwoKIyBUaGUgbmV4dCBtYWpvciB2ZXJzaW9uIGFmdGVyIHRoaXMgdmVyc2lvbiBvZiB0aGUgJ3doZWVsJyB0b29sOgpWRVJTSU9OX1RPT19ISUdIID0gKDEsIDApCgojIE5vbi1ncmVlZHkgbWF0Y2hpbmcgb2YgYW4gb3B0aW9uYWwgYnVpbGQgbnVtYmVyIG1heSBiZSB0b28gY2xldmVyIChtb3JlCiMgaW52YWxpZCB3aGVlbCBmaWxlbmFtZXMgd2lsbCBtYXRjaCkuIFNlcGFyYXRlIHJlZ2V4IGZvciAuZGlzdC1pbmZvPwpXSEVFTF9JTkZPX1JFID0gcmUuY29tcGlsZSgKICAgIHIiIiJeKD9QPG5hbWV2ZXI+KD9QPG5hbWU+Lis/KSgtKD9QPHZlcj5cZC4rPykpPykKICAgICgoLSg/UDxidWlsZD5cZC4qPykpPy0oP1A8cHl2ZXI+Lis/KS0oP1A8YWJpPi4rPyktKD9QPHBsYXQ+Lis/KQogICAgXC53aGx8XC5kaXN0LWluZm8pJCIiIiwKICAgIHJlLlZFUkJPU0UpLm1hdGNoCgpkZWYgcGFyc2VfdmVyc2lvbih2ZXJzaW9uKToKICAgICIiIlVzZSBwYXJzZV92ZXJzaW9uIGZyb20gcGtnX3Jlc291cmNlcyBvciBkaXN0dXRpbHMgYXMgYXZhaWxhYmxlLiIiIgogICAgZ2xvYmFsIHBhcnNlX3ZlcnNpb24KICAgIHRyeToKICAgICAgICBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHBhcnNlX3ZlcnNpb24KICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBMb29zZVZlcnNpb24gYXMgcGFyc2VfdmVyc2lvbgogICAgcmV0dXJuIHBhcnNlX3ZlcnNpb24odmVyc2lvbikKCmNsYXNzIEJhZFdoZWVsRmlsZShWYWx1ZUVycm9yKToKICAgIHBhc3MKCgpjbGFzcyBXaGVlbEZpbGUob2JqZWN0KToKICAgICIiIlBhcnNlIHdoZWVsLXNwZWNpZmljIGF0dHJpYnV0ZXMgZnJvbSBhIHdoZWVsICgud2hsKSBmaWxlIGFuZCBvZmZlcgogICAgYmFzaWMgaW5zdGFsbGF0aW9uIGFuZCB2ZXJpZmljYXRpb24gc3VwcG9ydC4KICAgIAogICAgV2hlZWxGaWxlIGNhbiBiZSB1c2VkIHRvIHNpbXBseSBwYXJzZSBhIHdoZWVsIGZpbGVuYW1lIGJ5IGF2b2lkaW5nIHRoZQogICAgbWV0aG9kcyB0aGF0IHJlcXVpcmUgdGhlIGFjdHVhbCBmaWxlIGNvbnRlbnRzLiIiIgoKICAgIFdIRUVMX0lORk8gPSAiV0hFRUwiCiAgICBSRUNPUkQgPSAiUkVDT1JEIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgIGZwPU5vbmUsCiAgICAgICAgICAgICAgICAgYXBwZW5kPUZhbHNlLAogICAgICAgICAgICAgICAgIGNvbnRleHQ9Z2V0X3N1cHBvcnRlZCk6CiAgICAgICAgIiIiCiAgICAgICAgOnBhcmFtIGZwOiBBIHNlZWthYmxlIGZpbGUtbGlrZSBvYmplY3Qgb3IgTm9uZSB0byBvcGVuKGZpbGVuYW1lKS4KICAgICAgICA6cGFyYW0gYXBwZW5kOiBPcGVuIGFyY2hpdmUgaW4gYXBwZW5kIG1vZGUuCiAgICAgICAgOnBhcmFtIGNvbnRleHQ6IEZ1bmN0aW9uIHJldHVybmluZyBsaXN0IG9mIHN1cHBvcnRlZCB0YWdzLiBXaGVlbHMKICAgICAgICBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGV4dCB0byBiZSBzb3J0YWJsZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBzZWxmLmZwID0gZnAKICAgICAgICBzZWxmLmFwcGVuZCA9IGFwcGVuZAogICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQKICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCiAgICAgICAgc2VsZi5wYXJzZWRfZmlsZW5hbWUgPSBXSEVFTF9JTkZPX1JFKGJhc2VuYW1lKQogICAgICAgIGlmIG5vdCBiYXNlbmFtZS5lbmRzd2l0aCgnLndobCcpIG9yIHNlbGYucGFyc2VkX2ZpbGVuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZSgiQmFkIGZpbGVuYW1lICclcyciICUgZmlsZW5hbWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGlzdGluZm9fbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIiVzLmRpc3QtaW5mbyIgJSBzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZXZlcicpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGF0YWRpcl9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMuZGF0YSIgJSBzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZXZlcicpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVjb3JkX25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICIlcy8lcyIgJSAoc2VsZi5kaXN0aW5mb19uYW1lLCBzZWxmLlJFQ09SRCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aGVlbGluZm9fbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIiVzLyVzIiAlIChzZWxmLmRpc3RpbmZvX25hbWUsIHNlbGYuV0hFRUxfSU5GTykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0YWdzKHNlbGYpOgogICAgICAgICIiIkEgd2hlZWwgZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRoZQogICAgICAgIHBlcmlvZC1kZWxpbWl0ZWQgdGFncyBpbiBpdHMgZmlsZW5hbWUuCiAgICAgICAgVG8gY2hvb3NlIGEgd2hlZWwgZmlsZSBhbW9uZyBzZXZlcmFsIGNhbmRpZGF0ZXMgaGF2aW5nIHRoZSBzYW1lCiAgICAgICAgZGlzdHJpYnV0aW9uIHZlcnNpb24gJ3ZlcicsIGFuIGluc3RhbGxlciByYW5rcyBlYWNoIHRyaXBsZSBvZgogICAgICAgIChweXZlciwgYWJpLCBwbGF0KSB0aGF0IGl0cyBQeXRob24gaW5zdGFsbGF0aW9uIGNhbiBydW4sIHNvcnRpbmcKICAgICAgICB0aGUgd2hlZWxzIGJ5IHRoZSBiZXN0LXJhbmtlZCB0YWcgaXQgc3VwcG9ydHMgYW5kIHRoZW4gYnkgdGhlaXIKICAgICAgICBhcml0eSB3aGljaCBpcyBqdXN0IGxlbihsaXN0KGNvbXBhdGliaWxpdHlfdGFncykpLgogICAgICAgICIiIgogICAgICAgIHRhZ3MgPSBzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cGRpY3QoKQogICAgICAgIGZvciBweXZlciBpbiB0YWdzWydweXZlciddLnNwbGl0KCcuJyk6CiAgICAgICAgICAgIGZvciBhYmkgaW4gdGFnc1snYWJpJ10uc3BsaXQoJy4nKToKICAgICAgICAgICAgICAgIGZvciBwbGF0IGluIHRhZ3NbJ3BsYXQnXS5zcGxpdCgnLicpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIChweXZlciwgYWJpLCBwbGF0KQoKICAgIGNvbXBhdGliaWxpdHlfdGFncyA9IHRhZ3MKCiAgICBAcHJvcGVydHkKICAgIGRlZiBhcml0eShzZWxmKToKICAgICAgICAiIiJUaGUgbnVtYmVyIG9mIGNvbXBhdGliaWxpdHkgdGFncyB0aGUgd2hlZWwgZGVjbGFyZXMuIiIiCiAgICAgICAgcmV0dXJuIGxlbihsaXN0KHNlbGYuY29tcGF0aWJpbGl0eV90YWdzKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiByYW5rKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIExvd2VzdCBpbmRleCBvZiBhbnkgb2YgdGhpcyB3aGVlbCdzIHRhZ3MgaW4gc2VsZi5jb250ZXh0KCksIGFuZCB0aGUKICAgICAgICBhcml0eSBlLmcuICgwLCAxKQogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmNvbXBhdGliaWxpdHlfcmFuayhzZWxmLmNvbnRleHQoKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wYXRpYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJhbmtbMF0gIT0gX2JpZ19udW1iZXIgICMgYmFkIEFQSSEKCiAgICAjIGRlcHJlY2F0ZWQ6CiAgICBkZWYgY29tcGF0aWJpbGl0eV9yYW5rKHNlbGYsIHN1cHBvcnRlZCk6CiAgICAgICAgIiIiUmFuayB0aGUgd2hlZWwgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHRhZ3MuIFNtYWxsZXIgcmFua3MgYXJlIG1vcmUKICAgICAgICBjb21wYXRpYmxlIQoKICAgICAgICA6cGFyYW0gc3VwcG9ydGVkOiBBIGxpc3Qgb2YgY29tcGF0aWJpbGl0eSB0YWdzIHRoYXQgdGhlIGN1cnJlbnQKICAgICAgICAgICAgUHl0aG9uIGltcGxlbWVuYXRpb24gY2FuIHJ1bi4KICAgICAgICAiIiIKICAgICAgICBwcmVmZXJlbmNlcyA9IFtdCiAgICAgICAgZm9yIHRhZyBpbiBzZWxmLmNvbXBhdGliaWxpdHlfdGFnczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcHJlZmVyZW5jZXMuYXBwZW5kKHN1cHBvcnRlZC5pbmRleCh0YWcpKQogICAgICAgICAgICAjIFRhZyBub3QgcHJlc2VudAogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBpZiBsZW4ocHJlZmVyZW5jZXMpOgogICAgICAgICAgICByZXR1cm4gKG1pbihwcmVmZXJlbmNlcyksIHNlbGYuYXJpdHkpCiAgICAgICAgcmV0dXJuIChfYmlnX251bWJlciwgMCkKCiAgICAjIGRlcHJlY2F0ZWQKICAgIGRlZiBzdXBwb3J0c19jdXJyZW50X3B5dGhvbihzZWxmLCB4KToKICAgICAgICBhc3NlcnQgc2VsZi5jb250ZXh0ID09IHgsICdjb250ZXh0IG1pc21hdGNoJwogICAgICAgIHJldHVybiBzZWxmLmNvbXBhdGlibGUKCiAgICAjIENvbXBhcmFiaWxpdHkuCiAgICAjIFdoZWVscyBhcmUgZXF1YWwgaWYgdGhleSByZWZlciB0byB0aGUgc2FtZSBmaWxlLgogICAgIyBJZiB0d28gd2hlZWxzIGFyZSBub3QgZXF1YWwsIGNvbXBhcmUgYmFzZWQgb24gKGluIHRoaXMgb3JkZXIpOgogICAgIyAgIDEuIE5hbWUKICAgICMgICAyLiBWZXJzaW9uCiAgICAjICAgMy4gQ29tcGF0aWJpbGl0eSByYW5rCiAgICAjICAgNC4gRmlsZW5hbWUgKGFzIGEgdGllYnJlYWtlcikKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9zb3J0X2tleShzZWxmKToKICAgICAgICByZXR1cm4gKHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1lJyksCiAgICAgICAgICAgICAgICBwYXJzZV92ZXJzaW9uKHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCd2ZXInKSksCiAgICAgICAgICAgICAgICB0dXBsZSgteCBmb3IgeCBpbiBzZWxmLnJhbmspLAogICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZSA9PSBvdGhlci5maWxlbmFtZQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lICE9IG90aGVyLmZpbGVuYW1lCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgc2VsZi5jb250ZXh0ICE9IG90aGVyLmNvbnRleHQ6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiezB9LmNvbnRleHQgIT0gezF9LmNvbnRleHQiLmZvcm1hdChzZWxmLCBvdGhlcikpCgogICAgICAgIHJldHVybiBzZWxmLl9zb3J0X2tleSA8IG90aGVyLl9zb3J0X2tleQoKICAgICAgICAjIFhYWCBwcnVuZQoKICAgICAgICBzbiA9IHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1lJykKICAgICAgICBvbiA9IG90aGVyLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZScpCiAgICAgICAgaWYgc24gIT0gb246CiAgICAgICAgICAgIHJldHVybiBzbiA8IG9uCiAgICAgICAgc3YgPSBwYXJzZV92ZXJzaW9uKHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCd2ZXInKSkKICAgICAgICBvdiA9IHBhcnNlX3ZlcnNpb24ob3RoZXIucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCd2ZXInKSkKICAgICAgICBpZiBzdiAhPSBvdjoKICAgICAgICAgICAgcmV0dXJuIHN2IDwgb3YKICAgICAgICAjIENvbXBhdGliaWxpdHkKICAgICAgICBpZiBzZWxmLmNvbnRleHQgIT0gb3RoZXIuY29udGV4dDoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ7MH0uY29udGV4dCAhPSB7MX0uY29udGV4dCIuZm9ybWF0KHNlbGYsIG90aGVyKSkKICAgICAgICBzYyA9IHNlbGYucmFuawogICAgICAgIG9jID0gb3RoZXIucmFuawogICAgICAgIGlmIHNjICE9IE5vbmUgYW5kIG9jICE9IE5vbmUgYW5kIHNjICE9IG9jOgogICAgICAgICAgICAjIFNtYWxsZXIgY29tcGF0aWJpbGl0eSByYW5rcyBhcmUgImJldHRlciIgdGhhbiBsYXJnZXIgb25lcywKICAgICAgICAgICAgIyBzbyB3ZSBoYXZlIHRvIHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBjb21wYXJpc29uIGhlcmUhCiAgICAgICAgICAgIHJldHVybiBzYyA+IG9jCiAgICAgICAgZWxpZiBzYyA9PSBOb25lIGFuZCBvYyAhPSBOb25lOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZSA8IG90aGVyLmZpbGVuYW1lCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG90aGVyIDwgc2VsZgoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmID09IG90aGVyIG9yIHNlbGYgPCBvdGhlcgoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmID09IG90aGVyIG9yIG90aGVyIDwgc2VsZgoKICAgICMKICAgICMgTWV0aG9kcyB1c2luZyB0aGUgZmlsZSdzIGNvbnRlbnRzOgogICAgIwoKICAgIEByZWlmeQogICAgZGVmIHppcGZpbGUoc2VsZik6CiAgICAgICAgbW9kZSA9ICJyIgogICAgICAgIGlmIHNlbGYuYXBwZW5kOgogICAgICAgICAgICBtb2RlID0gImEiCiAgICAgICAgdnpmID0gVmVyaWZ5aW5nWmlwRmlsZShzZWxmLmZwIGlmIHNlbGYuZnAgZWxzZSBzZWxmLmZpbGVuYW1lLCBtb2RlKQogICAgICAgIGlmIG5vdCBzZWxmLmFwcGVuZDoKICAgICAgICAgICAgc2VsZi52ZXJpZnkodnpmKQogICAgICAgIHJldHVybiB2emYKCiAgICBAcmVpZnkKICAgIGRlZiBwYXJzZWRfd2hlZWxfaW5mbyhzZWxmKToKICAgICAgICAiIiJQYXJzZSB3aGVlbCBtZXRhZGF0YSAodGhlIC5kYXRhL1dIRUVMIGZpbGUpIiIiCiAgICAgICAgcmV0dXJuIHJlYWRfcGtnX2luZm9fYnl0ZXMoc2VsZi56aXBmaWxlLnJlYWQoc2VsZi53aGVlbGluZm9fbmFtZSkpCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZik6CiAgICAgICAgdmVyc2lvbiA9IHNlbGYucGFyc2VkX3doZWVsX2luZm9bJ1doZWVsLVZlcnNpb24nXQogICAgICAgIGlmIHR1cGxlKG1hcChpbnQsIHZlcnNpb24uc3BsaXQoJy4nKSkpID49IFZFUlNJT05fVE9PX0hJR0g6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIldoZWVsIHZlcnNpb24gaXMgdG9vIGhpZ2giKQoKICAgIEByZWlmeQogICAgZGVmIGluc3RhbGxfcGF0aHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3VsdCBkaXN0dXRpbHMgdG8gZ2V0IHRoZSBpbnN0YWxsIHBhdGhzIGZvciBvdXIgZGlzdC4gIEEgZGljdCB3aXRoCiAgICAgICAgKCdwdXJlbGliJywgJ3BsYXRsaWInLCAnaGVhZGVycycsICdzY3JpcHRzJywgJ2RhdGEnKS4KICAgICAgICAKICAgICAgICBXZSB1c2UgdGhlIG5hbWUgZnJvbSBvdXIgZmlsZW5hbWUgYXMgdGhlIGRpc3QgbmFtZSwgd2hpY2ggbWVhbnMgaGVhZGVycwogICAgICAgIGNvdWxkIGJlIGluc3RhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UgaWYgdGhlIGZpbGVzeXN0ZW0tZXNjYXBlZCBuYW1lCiAgICAgICAgaXMgZGlmZmVyZW50IHRoYW4gdGhlIE5hbWUuICBXaG8gY2FyZXM/IAogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZScpCiAgICAgICAgcmV0dXJuIGdldF9pbnN0YWxsX3BhdGhzKG5hbWUpCgogICAgZGVmIGluc3RhbGwoc2VsZiwgZm9yY2U9RmFsc2UsIG92ZXJyaWRlcz17fSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCB0aGUgd2hlZWwgaW50byBzaXRlLXBhY2thZ2VzLgogICAgICAgICIiIgoKICAgICAgICAjIFV0aWxpdHkgdG8gZ2V0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGZvciBhIHBhcnRpY3VsYXIga2V5CiAgICAgICAgZGVmIGdldF9wYXRoKGtleSk6CiAgICAgICAgICAgIHJldHVybiBvdmVycmlkZXMuZ2V0KGtleSkgb3Igc2VsZi5pbnN0YWxsX3BhdGhzW2tleV0KCiAgICAgICAgIyBUaGUgYmFzZSB0YXJnZXQgbG9jYXRpb24gaXMgZWl0aGVyIHB1cmVsaWIgb3IgcGxhdGxpYgogICAgICAgIGlmIHNlbGYucGFyc2VkX3doZWVsX2luZm9bJ1Jvb3QtSXMtUHVyZWxpYiddID09ICd0cnVlJzoKICAgICAgICAgICAgcm9vdCA9IGdldF9wYXRoKCdwdXJlbGliJykKICAgICAgICBlbHNlOgogICAgICAgICAgICByb290ID0gZ2V0X3BhdGgoJ3BsYXRsaWInKQoKICAgICAgICAjIFBhcnNlIGFsbCB0aGUgbmFtZXMgaW4gdGhlIGFyY2hpdmUKICAgICAgICBuYW1lX3RyYW5zID0ge30KICAgICAgICBmb3IgaW5mbyBpbiBzZWxmLnppcGZpbGUuaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgIyBaaXAgZmlsZXMgY2FuIGNvbnRhaW4gZW50cmllcyByZXByZXNlbnRpbmcgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgICMgVGhlc2UgZW5kIGluIGEgJy8nLgogICAgICAgICAgICAjIFdlIGlnbm9yZSB0aGVzZSwgYXMgd2UgY3JlYXRlIGRpcmVjdG9yaWVzIG9uIGRlbWFuZC4KICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgUGF0aG5hbWVzIGluIGEgemlwZmlsZSBuYW1lbGlzdCBhcmUgYWx3YXlzIC8tc2VwYXJhdGVkLgogICAgICAgICAgICAjIEluIHRoZW9yeSwgcGF0aHMgY291bGQgc3RhcnQgd2l0aCAuLyBvciBoYXZlIG90aGVyIG9kZGl0aWVzCiAgICAgICAgICAgICMgYnV0IHRoaXMgd29uJ3QgaGFwcGVuIGluIHByYWN0aWNhbCBjYXNlcyBvZiB3ZWxsLWZvcm1lZCB3aGVlbHMuCiAgICAgICAgICAgICMgV2UnbGwgY292ZXIgdGhlIHNpbXBsZSBjYXNlIG9mIGFuIGluaXRpYWwgJy4vJyBhcyBpdCdzIGJvdGggZWFzeQogICAgICAgICAgICAjIHRvIGRvIGFuZCBtb3JlIGNvbW1vbiB0aGFuIG1vc3Qgb3RoZXIgb2RkaXRpZXMuCiAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnLi8nKToKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzI6XQoKICAgICAgICAgICAgIyBTcGxpdCBvZmYgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGlkZW50aWZ5IGZpbGVzIHRoYXQgYXJlIHRvIGJlCiAgICAgICAgICAgICMgaW5zdGFsbGVkIGluIG5vbi1yb290IGxvY2F0aW9ucwogICAgICAgICAgICBiYXNlZGlyLCBzZXAsIGZpbGVuYW1lID0gbmFtZS5wYXJ0aXRpb24oJy8nKQogICAgICAgICAgICBpZiBzZXAgYW5kIGJhc2VkaXIgPT0gc2VsZi5kYXRhZGlyX25hbWU6CiAgICAgICAgICAgICAgICAjIERhdGEgZmlsZS4gVGFyZ2V0IGRlc3RpbmF0aW9uIGlzIGVsc2V3aGVyZQogICAgICAgICAgICAgICAga2V5LCBzZXAsIGZpbGVuYW1lID0gZmlsZW5hbWUucGFydGl0aW9uKCcvJykKICAgICAgICAgICAgICAgIGlmIG5vdCBzZXA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBmaWxlbmFtZSBpbiB3aGVlbDogezB9Ii5mb3JtYXQobmFtZSkpCiAgICAgICAgICAgICAgICB0YXJnZXQgPSBnZXRfcGF0aChrZXkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE5vcm1hbCBmaWxlLiBUYXJnZXQgZGVzdGluYXRpb24gaXMgcm9vdAogICAgICAgICAgICAgICAga2V5ID0gJycKICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvb3QKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbmFtZQoKICAgICAgICAgICAgIyBNYXAgdGhlIGFjdHVhbCBmaWxlbmFtZSBmcm9tIHRoZSB6aXBmaWxlIHRvIGl0cyBpbnRlbmRlZCB0YXJnZXQKICAgICAgICAgICAgIyBkaXJlY3RvcnkgYW5kIHRoZSBwYXRobmFtZSByZWxhdGl2ZSB0byB0aGF0IGRpcmVjdG9yeS4KICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHRhcmdldCwgZmlsZW5hbWUpKQogICAgICAgICAgICBuYW1lX3RyYW5zW2luZm9dID0gKGtleSwgdGFyZ2V0LCBmaWxlbmFtZSwgZGVzdCkKCiAgICAgICAgIyBXZSdyZSBub3cgcmVhZHkgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgYWN0dWFsIGluc3RhbGwuIFRoZSBwcm9jZXNzCiAgICAgICAgIyBpcyBhcyBmb2xsb3dzOgogICAgICAgICMgICAxLiBQcmVjaGVja3MgLSBpcyB0aGUgd2hlZWwgdmFsaWQsIGlzIGl0cyBkZWNsYXJlZCBhcmNoaXRlY3R1cmUKICAgICAgICAjICAgICAgT0ssIGV0Yy4gW1tSZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyXV0KICAgICAgICAjICAgMi4gT3ZlcndyaXRlIGNoZWNrIC0gZG8gYW55IG9mIHRoZSBmaWxlcyB0byBiZSBpbnN0YWxsZWQgYWxyZWFkeQogICAgICAgICMgICAgICBleGlzdD8KICAgICAgICAjICAgMy4gQWN0dWFsIGluc3RhbGwgLSBwdXQgdGhlIGZpbGVzIGluIHRoZWlyIHRhcmdldCBsb2NhdGlvbnMuCiAgICAgICAgIyAgIDQuIFVwZGF0ZSBSRUNPUkQgLSB3cml0ZSBhIHN1aXRhYmx5IG1vZGlmaWVkIFJFQ09SRCBmaWxlIHRvCiAgICAgICAgIyAgICAgIHJlZmxlY3QgdGhlIGFjdHVhbCBpbnN0YWxsZWQgcGF0aHMuCgogICAgICAgIGlmIG5vdCBmb3JjZToKICAgICAgICAgICAgZm9yIGluZm8sIHYgaW4gbmFtZV90cmFucy5pdGVtcygpOgogICAgICAgICAgICAgICAgayA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgICAgIGtleSwgdGFyZ2V0LCBmaWxlbmFtZSwgZGVzdCA9IHYKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRlc3QpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIldoZWVsIGZpbGUgezB9IHdvdWxkIG92ZXJ3cml0ZSB7MX0uIFVzZSBmb3JjZSBpZiB0aGlzIGlzIGludGVuZGVkIi5mb3JtYXQoaywgZGVzdCkpCgogICAgICAgICMgR2V0IHRoZSBuYW1lIG9mIG91ciBleGVjdXRhYmxlLCBmb3IgdXNlIHdoZW4gcmVwbGFjaW5nIHNjcmlwdAogICAgICAgICMgd3JhcHBlciBoYXNoYmFuZyBsaW5lcy4KICAgICAgICAjIFdlIGVuY29kZSBpdCB1c2luZyBnZXRmaWxlc3lzdGVtZW5jb2RpbmcsIGFzIHRoYXQgaXMgInRoZSBuYW1lIG9mCiAgICAgICAgIyB0aGUgZW5jb2RpbmcgdXNlZCB0byBjb252ZXJ0IFVuaWNvZGUgZmlsZW5hbWVzIGludG8gc3lzdGVtIGZpbGUKICAgICAgICAjIG5hbWVzIi4KICAgICAgICBleGVuYW1lID0gc3lzLmV4ZWN1dGFibGUuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICByZWNvcmRfZGF0YSA9IFtdCiAgICAgICAgcmVjb3JkX25hbWUgPSBzZWxmLmRpc3RpbmZvX25hbWUgKyAnL1JFQ09SRCcKICAgICAgICBmb3IgaW5mbywgKGtleSwgdGFyZ2V0LCBmaWxlbmFtZSwgZGVzdCkgaW4gbmFtZV90cmFucy5pdGVtcygpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICBzb3VyY2UgPSBzZWxmLnppcGZpbGUub3BlbihpbmZvKQogICAgICAgICAgICAjIFNraXAgdGhlIFJFQ09SRCBmaWxlCiAgICAgICAgICAgIGlmIG5hbWUgPT0gcmVjb3JkX25hbWU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBkZGlyID0gb3MucGF0aC5kaXJuYW1lKGRlc3QpCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRkaXIpOgogICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoZGRpcikKICAgICAgICAgICAgZGVzdGluYXRpb24gPSBIYXNoaW5nRmlsZShvcGVuKGRlc3QsICd3YicpKQogICAgICAgICAgICBpZiBrZXkgPT0gJ3NjcmlwdHMnOgogICAgICAgICAgICAgICAgaGFzaGJhbmcgPSBzb3VyY2UucmVhZGxpbmUoKQogICAgICAgICAgICAgICAgaWYgaGFzaGJhbmcuc3RhcnRzd2l0aChiJyMhcHl0aG9uJyk6CiAgICAgICAgICAgICAgICAgICAgaGFzaGJhbmcgPSBiJyMhJyArIGV4ZW5hbWUgKyBiaW5hcnkob3MubGluZXNlcCkKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLndyaXRlKGhhc2hiYW5nKQogICAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooc291cmNlLCBkZXN0aW5hdGlvbikKICAgICAgICAgICAgcmVsZGVzdCA9IG9zLnBhdGgucmVscGF0aChkZXN0LCByb290KQogICAgICAgICAgICByZWxkZXN0LnJlcGxhY2Uob3Muc2VwLCAnLycpCiAgICAgICAgICAgIHJlY29yZF9kYXRhLmFwcGVuZCgocmVsZGVzdCwgZGVzdGluYXRpb24uZGlnZXN0KCksIGRlc3RpbmF0aW9uLmxlbmd0aCkpCiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNsb3NlKCkKICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKICAgICAgICAgICAgIyBwcmVzZXJ2ZSBhdHRyaWJ1dGVzIChlc3BlY2lhbGx5ICt4IGJpdCBmb3Igc2NyaXB0cykKICAgICAgICAgICAgYXR0cnMgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKICAgICAgICAgICAgaWYgYXR0cnM6ICAjIHRlbmRzIHRvIGJlIDAgaWYgV2luZG93cy4KICAgICAgICAgICAgICAgIG9zLmNobW9kKGRlc3QsIGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNikKCiAgICAgICAgcmVjb3JkX25hbWUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgc2VsZi5yZWNvcmRfbmFtZSkKICAgICAgICB3aXRoIG9wZW5fZm9yX2NzdihyZWNvcmRfbmFtZSwgJ3crJykgYXMgcmVjb3JkX2ZpbGU6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIocmVjb3JkX2ZpbGUpCiAgICAgICAgICAgIGZvciByZWxkZXN0LCBkaWdlc3QsIGxlbmd0aCBpbiBzb3J0ZWQocmVjb3JkX2RhdGEpOgogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChyZWxkZXN0LCBkaWdlc3QsIGxlbmd0aCkpCiAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygoc2VsZi5yZWNvcmRfbmFtZSwgJycsICcnKSkKCiAgICBkZWYgdmVyaWZ5KHNlbGYsIHppcGZpbGU9Tm9uZSk6CiAgICAgICAgIiIiQ29uZmlndXJlIHRoZSBWZXJpZnlpbmdaaXBGaWxlIGB6aXBmaWxlYCBieSB2ZXJpZnlpbmcgaXRzIHNpZ25hdHVyZSAKICAgICAgICBhbmQgc2V0dGluZyBleHBlY3RlZCBoYXNoZXMgZm9yIGV2ZXJ5IGhhc2ggaW4gUkVDT1JELgogICAgICAgIENhbGxlciBtdXN0IGNvbXBsZXRlIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSBjb21wbGV0ZWx5IHJlYWRpbmcgCiAgICAgICAgZXZlcnkgZmlsZSBpbiB0aGUgYXJjaGl2ZSAoZS5nLiB3aXRoIGV4dHJhY3RhbGwpLiIiIgogICAgICAgIHNpZyA9IE5vbmUKICAgICAgICBpZiB6aXBmaWxlIGlzIE5vbmU6CiAgICAgICAgICAgIHppcGZpbGUgPSBzZWxmLnppcGZpbGUKICAgICAgICB6aXBmaWxlLnN0cmljdCA9IFRydWUKCiAgICAgICAgcmVjb3JkX25hbWUgPSAnLycuam9pbigoc2VsZi5kaXN0aW5mb19uYW1lLCAnUkVDT1JEJykpCiAgICAgICAgc2lnX25hbWUgPSAnLycuam9pbigoc2VsZi5kaXN0aW5mb19uYW1lLCAnUkVDT1JELmp3cycpKQogICAgICAgICMgdG9sZXJhdGUgcy9taW1lIHNpZ25hdHVyZXM6CiAgICAgICAgc21pbWVfc2lnX25hbWUgPSAnLycuam9pbigoc2VsZi5kaXN0aW5mb19uYW1lLCAnUkVDT1JELnA3cycpKQogICAgICAgIHppcGZpbGUuc2V0X2V4cGVjdGVkX2hhc2gocmVjb3JkX25hbWUsIE5vbmUpCiAgICAgICAgemlwZmlsZS5zZXRfZXhwZWN0ZWRfaGFzaChzaWdfbmFtZSwgTm9uZSkKICAgICAgICB6aXBmaWxlLnNldF9leHBlY3RlZF9oYXNoKHNtaW1lX3NpZ19uYW1lLCBOb25lKQogICAgICAgIHJlY29yZCA9IHppcGZpbGUucmVhZChyZWNvcmRfbmFtZSkKCiAgICAgICAgcmVjb3JkX2RpZ2VzdCA9IHVybHNhZmVfYjY0ZW5jb2RlKGhhc2hsaWIuc2hhMjU2KHJlY29yZCkuZGlnZXN0KCkpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaWcgPSBmcm9tX2pzb24obmF0aXZlKHppcGZpbGUucmVhZChzaWdfbmFtZSkpKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjogICMgbm8gc2lnbmF0dXJlCiAgICAgICAgICAgIHBhc3MKICAgICAgICBpZiBzaWc6CiAgICAgICAgICAgIGhlYWRlcnMsIHBheWxvYWQgPSBzaWduYXR1cmVzLnZlcmlmeShzaWcpCiAgICAgICAgICAgIGlmIHBheWxvYWRbJ2hhc2gnXSAhPSAic2hhMjU2PSIgKyBuYXRpdmUocmVjb3JkX2RpZ2VzdCk6CiAgICAgICAgICAgICAgICBtc2cgPSAiUkVDT1JELnNpZyBjbGFpbWVkIFJFQ09SRCBoYXNoIHswfSAhPSBjb21wdXRlZCBoYXNoIHsxfS4iCiAgICAgICAgICAgICAgICByYWlzZSBCYWRXaGVlbEZpbGUobXNnLmZvcm1hdChwYXlsb2FkWydoYXNoJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmUocmVjb3JkX2RpZ2VzdCkpKQoKICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKChuYXRpdmUocikgZm9yIHIgaW4gcmVjb3JkLnNwbGl0bGluZXMoKSkpCgogICAgICAgIGZvciByb3cgaW4gcmVhZGVyOgogICAgICAgICAgICBmaWxlbmFtZSA9IHJvd1swXQogICAgICAgICAgICBoYXNoID0gcm93WzFdCiAgICAgICAgICAgIGlmIG5vdCBoYXNoOgogICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgbm90IGluIChyZWNvcmRfbmFtZSwgc2lnX25hbWUpOgogICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzIGhhcyBubyBoYXNoIVxuIiAlIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgYWxnbywgZGF0YSA9IHJvd1sxXS5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgIGFzc2VydCBhbGdvID09ICJzaGEyNTYiLCAiVW5zdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG0iCiAgICAgICAgICAgIHppcGZpbGUuc2V0X2V4cGVjdGVkX2hhc2goZmlsZW5hbWUsIHVybHNhZmVfYjY0ZGVjb2RlKGJpbmFyeShkYXRhKSkpCgoKY2xhc3MgVmVyaWZ5aW5nWmlwRmlsZSh6aXBmaWxlLlppcEZpbGUpOgogICAgIiIiWmlwRmlsZSB0aGF0IGNhbiBhc3NlcnQgdGhhdCBlYWNoIG9mIGl0cyBleHRyYWN0ZWQgY29udGVudHMgbWF0Y2hlcwogICAgYW4gZXhwZWN0ZWQgc2hhMjU2IGhhc2guIE5vdGUgdGhhdCBlYWNoIGZpbGUgbXVzdCBiZSBjb21wbGV0bHkgcmVhZCBpbiAKICAgIG9yZGVyIGZvciBpdHMgaGFzaCB0byBiZSBjaGVja2VkLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlPSJyIiwKICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9TVE9SRUQsCiAgICAgICAgICAgICAgICAgYWxsb3daaXA2ND1GYWxzZSk6CiAgICAgICAgemlwZmlsZS5aaXBGaWxlLl9faW5pdF9fKHNlbGYsIGZpbGUsIG1vZGUsIGNvbXByZXNzaW9uLCBhbGxvd1ppcDY0KQoKICAgICAgICBzZWxmLnN0cmljdCA9IEZhbHNlCiAgICAgICAgc2VsZi5fZXhwZWN0ZWRfaGFzaGVzID0ge30KICAgICAgICBzZWxmLl9oYXNoX2FsZ29yaXRobSA9IGhhc2hsaWIuc2hhMjU2CgogICAgZGVmIHNldF9leHBlY3RlZF9oYXNoKHNlbGYsIG5hbWUsIGhhc2gpOgogICAgICAgICIiIgogICAgICAgIDpwYXJhbSBuYW1lOiBuYW1lIG9mIHppcCBlbnRyeQogICAgICAgIDpwYXJhbSBoYXNoOiBieXRlcyBvZiBoYXNoIChvciBOb25lIGZvciAiZG9uJ3QgY2FyZSIpCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZXhwZWN0ZWRfaGFzaGVzW25hbWVdID0gaGFzaAoKICAgIGRlZiBvcGVuKHNlbGYsIG5hbWVfb3JfaW5mbywgbW9kZT0iciIsIHB3ZD1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gZmlsZS1saWtlIG9iamVjdCBmb3IgJ25hbWUnLiIiIgogICAgICAgICMgQSBub24tbW9ua2V5LXBhdGNoZWQgdmVyc2lvbiB3b3VsZCBjb250YWluIG1vc3Qgb2YgemlwZmlsZS5weQogICAgICAgIGVmID0gemlwZmlsZS5aaXBGaWxlLm9wZW4oc2VsZiwgbmFtZV9vcl9pbmZvLCBtb2RlLCBwd2QpCiAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lX29yX2luZm8sIHppcGZpbGUuWmlwSW5mbyk6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lX29yX2luZm8uZmlsZW5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lID0gbmFtZV9vcl9pbmZvCiAgICAgICAgaWYgKG5hbWUgaW4gc2VsZi5fZXhwZWN0ZWRfaGFzaGVzCiAgICAgICAgICAgIGFuZCBzZWxmLl9leHBlY3RlZF9oYXNoZXNbbmFtZV0gIT0gTm9uZSk6CiAgICAgICAgICAgIGV4cGVjdGVkX2hhc2ggPSBzZWxmLl9leHBlY3RlZF9oYXNoZXNbbmFtZV0KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgX3VwZGF0ZV9jcmNfb3JpZyA9IGVmLl91cGRhdGVfY3JjCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ05lZWQgWmlwRXh0RmlsZS5fdXBkYXRlX2NyYyB0byBpbXBsZW1lbnQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBoYXNoIHZlcmlmaWNhdGlvbiAoaW4gUHl0aG9uID49IDIuNyknKQogICAgICAgICAgICAgICAgcmV0dXJuIGVmCiAgICAgICAgICAgIHJ1bm5pbmdfaGFzaCA9IHNlbGYuX2hhc2hfYWxnb3JpdGhtKCkKICAgICAgICAgICAgaWYgaGFzYXR0cihlZiwgJ19lb2YnKTogICMgcHkzMwogICAgICAgICAgICAgICAgZGVmIF91cGRhdGVfY3JjKGRhdGEpOgogICAgICAgICAgICAgICAgICAgIF91cGRhdGVfY3JjX29yaWcoZGF0YSkKICAgICAgICAgICAgICAgICAgICBydW5uaW5nX2hhc2gudXBkYXRlKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgaWYgZWYuX2VvZiBhbmQgcnVubmluZ19oYXNoLmRpZ2VzdCgpICE9IGV4cGVjdGVkX2hhc2g6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZSgiQmFkIGhhc2ggZm9yIGZpbGUgJXIiICUgZWYubmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRlZiBfdXBkYXRlX2NyYyhkYXRhLCBlb2Y9Tm9uZSk6CiAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZV9jcmNfb3JpZyhkYXRhLCBlb2Y9ZW9mKQogICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfaGFzaC51cGRhdGUoZGF0YSkKICAgICAgICAgICAgICAgICAgICBpZiBlb2YgYW5kIHJ1bm5pbmdfaGFzaC5kaWdlc3QoKSAhPSBleHBlY3RlZF9oYXNoOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWRXaGVlbEZpbGUoIkJhZCBoYXNoIGZvciBmaWxlICVyIiAlIGVmLm5hbWUpCiAgICAgICAgICAgIGVmLl91cGRhdGVfY3JjID0gX3VwZGF0ZV9jcmMKICAgICAgICBlbGlmIHNlbGYuc3RyaWN0IGFuZCBuYW1lIG5vdCBpbiBzZWxmLl9leHBlY3RlZF9oYXNoZXM6CiAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZSgiTm8gZXhwZWN0ZWQgaGFzaCBmb3IgZmlsZSAlciIgJSBlZi5uYW1lKQogICAgICAgIHJldHVybiBlZgoKICAgIGRlZiBwb3Aoc2VsZik6CiAgICAgICAgIiIiVHJ1bmNhdGUgdGhlIGxhc3QgZmlsZSBvZmYgdGhpcyB6aXBmaWxlLgogICAgICAgIEFzc3VtZXMgaW5mb2xpc3QoKSBpcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgZmlsZXMgKHRydWUgZm9yCiAgICAgICAgb3JkaW5hcnkgemlwIGZpbGVzIGNyZWF0ZWQgYnkgUHl0aG9uKSIiIgogICAgICAgIGlmIG5vdCBzZWxmLmZwOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHBvcCBmcm9tIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKICAgICAgICBsYXN0ID0gc2VsZi5pbmZvbGlzdCgpLnBvcCgpCiAgICAgICAgZGVsIHNlbGYuTmFtZVRvSW5mb1tsYXN0LmZpbGVuYW1lXQogICAgICAgIHNlbGYuZnAuc2VlayhsYXN0LmhlYWRlcl9vZmZzZXQsIG9zLlNFRUtfU0VUKQogICAgICAgIHNlbGYuZnAudHJ1bmNhdGUoKQogICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKUEsDBBQAAAAAAAAAIQA5KHcLnC0AAJwtAAAzAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL21ldGFkYXRhLnB5IiIiClRvb2xzIGZvciBjb252ZXJ0aW5nIG9sZC0gdG8gbmV3LXN0eWxlIG1ldGFkYXRhLgoiIiIKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKZnJvbSAucGtnaW5mbyBpbXBvcnQgcmVhZF9wa2dfaW5mbwpmcm9tIC51dGlsIGltcG9ydCBPcmRlcmVkRGVmYXVsdERpY3QKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgT3JkZXJlZERpY3QgPSBkaWN0CgppbXBvcnQgcmUKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBwa2dfcmVzb3VyY2VzCmltcG9ydCBlbWFpbC5wYXJzZXIKCmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18gYXMgd2hlZWxfdmVyc2lvbgoKTUVUQURBVEFfVkVSU0lPTiA9ICIyLjAiCgpQTFVSQUxfRklFTERTID0geyAiY2xhc3NpZmllciIgOiAiY2xhc3NpZmllcnMiLAogICAgICAgICAgICAgICAgICAicHJvdmlkZXNfZGlzdCIgOiAicHJvdmlkZXMiLAogICAgICAgICAgICAgICAgICAicHJvdmlkZXNfZXh0cmEiIDogImV4dHJhcyIgfQoKU0tJUF9GSUVMRFMgPSBzZXQoKQoKQ09OVEFDVF9GSUVMRFMgPSAoKHsiZW1haWwiOiJhdXRob3JfZW1haWwiLCAibmFtZSI6ICJhdXRob3IifSwKICAgICAgICAgICAgICAgICAgICAiYXV0aG9yIiksCiAgICAgICAgICAgICAgICAgICh7ImVtYWlsIjoibWFpbnRhaW5lcl9lbWFpbCIsICJuYW1lIjogIm1haW50YWluZXIifSwKICAgICAgICAgICAgICAgICAgICAibWFpbnRhaW5lciIpKQoKIyBjb21tb25seSBmaWxsZWQgb3V0IGFzICJVTktOT1dOIiBieSBkaXN0dXRpbHM6ClVOS05PV05fRklFTERTID0gc2V0KCgiYXV0aG9yIiwgImF1dGhvcl9lbWFpbCIsICJwbGF0Zm9ybSIsICJob21lX3BhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgImxpY2Vuc2UiKSkKCiMgV2hlZWwgaXRzZWxmIGlzIHByb2JhYmx5IHRoZSBvbmx5IHByb2dyYW0gdGhhdCB1c2VzIG5vbi1leHRyYXMgbWFya2VycwojIGluIE1FVEFEQVRBL1BLRy1JTkZPLiBTdXBwb3J0IGl0cyBzeW50YXggd2l0aCB0aGUgZXh0cmEgYXQgdGhlIGVuZCBvbmx5LgpFWFRSQV9SRSA9IHJlLmNvbXBpbGUoIiIiXig/UDxwYWNrYWdlPi4qPykoO1xzKig/UDxjb25kaXRpb24+Lio/KShleHRyYSA9PSAnKD9QPGV4dHJhPi4qPyknKT8pJCIiIikKS0VZV09SRFNfUkUgPSByZS5jb21waWxlKCJbXDAtLF0rIikKCk1heVJlcXVpcmVzS2V5ID0gbmFtZWR0dXBsZSgnTWF5UmVxdWlyZXNLZXknLCAoJ2NvbmRpdGlvbicsICdleHRyYScpKQoKZGVmIHVuaXF1ZShpdGVyYWJsZSk6CiAgICAiIiIKICAgIFlpZWxkIHVuaXF1ZSB2YWx1ZXMgaW4gaXRlcmFibGUsIHByZXNlcnZpbmcgb3JkZXIuCiAgICAiIiIKICAgIHNlZW4gPSBzZXQoKQogICAgZm9yIHZhbHVlIGluIGl0ZXJhYmxlOgogICAgICAgIGlmIG5vdCB2YWx1ZSBpbiBzZWVuOgogICAgICAgICAgICBzZWVuLmFkZCh2YWx1ZSkKICAgICAgICAgICAgeWllbGQgdmFsdWUKCgpkZWYgaGFuZGxlX3JlcXVpcmVzKG1ldGFkYXRhLCBwa2dfaW5mbywga2V5KToKICAgICIiIgogICAgUGxhY2UgdGhlIHJ1bnRpbWUgcmVxdWlyZW1lbnRzIGZyb20gcGtnX2luZm8gaW50byBtZXRhZGF0YS4KICAgICIiIgogICAgbWF5X3JlcXVpcmVzID0gT3JkZXJlZERlZmF1bHREaWN0KGxpc3QpCiAgICBmb3IgdmFsdWUgaW4gc29ydGVkKHBrZ19pbmZvLmdldF9hbGwoa2V5KSk6CiAgICAgICAgZXh0cmFfbWF0Y2ggPSBFWFRSQV9SRS5zZWFyY2godmFsdWUpCiAgICAgICAgaWYgZXh0cmFfbWF0Y2g6CiAgICAgICAgICAgIGdyb3VwZGljdCA9IGV4dHJhX21hdGNoLmdyb3VwZGljdCgpCiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGdyb3VwZGljdFsnY29uZGl0aW9uJ10KICAgICAgICAgICAgZXh0cmEgPSBncm91cGRpY3RbJ2V4dHJhJ10KICAgICAgICAgICAgcGFja2FnZSA9IGdyb3VwZGljdFsncGFja2FnZSddCiAgICAgICAgICAgIGlmIGNvbmRpdGlvbi5lbmRzd2l0aCgnIGFuZCAnKToKICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbls6LTVdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29uZGl0aW9uLCBleHRyYSA9IE5vbmUsIE5vbmUKICAgICAgICAgICAgcGFja2FnZSA9IHZhbHVlCiAgICAgICAga2V5ID0gTWF5UmVxdWlyZXNLZXkoY29uZGl0aW9uLCBleHRyYSkKICAgICAgICBtYXlfcmVxdWlyZXNba2V5XS5hcHBlbmQocGFja2FnZSkKCiAgICBpZiBtYXlfcmVxdWlyZXM6CiAgICAgICAgbWV0YWRhdGFbJ3J1bl9yZXF1aXJlcyddID0gW10KICAgICAgICBkZWYgc29ydF9rZXkoaXRlbSk6CiAgICAgICAgICAgICMgQm90aCBjb25kaXRpb24gYW5kIGV4dHJhIGNvdWxkIGJlIE5vbmUsIHdoaWNoIGNhbid0IGJlIGNvbXBhcmVkCiAgICAgICAgICAgICMgYWdhaW5zdCBzdHJpbmdzIGluIFB5dGhvbiAzLgogICAgICAgICAgICBrZXksIHZhbHVlID0gaXRlbQogICAgICAgICAgICBpZiBrZXkuY29uZGl0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gJycKICAgICAgICAgICAgcmV0dXJuIGtleS5jb25kaXRpb24KICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzb3J0ZWQobWF5X3JlcXVpcmVzLml0ZW1zKCksIGtleT1zb3J0X2tleSk6CiAgICAgICAgICAgIG1heV9yZXF1aXJlbWVudCA9IE9yZGVyZWREaWN0KCgoJ3JlcXVpcmVzJywgdmFsdWUpLCkpCiAgICAgICAgICAgIGlmIGtleS5leHRyYToKICAgICAgICAgICAgICAgIG1heV9yZXF1aXJlbWVudFsnZXh0cmEnXSA9IGtleS5leHRyYQogICAgICAgICAgICBpZiBrZXkuY29uZGl0aW9uOgogICAgICAgICAgICAgICAgbWF5X3JlcXVpcmVtZW50WydlbnZpcm9ubWVudCddID0ga2V5LmNvbmRpdGlvbgogICAgICAgICAgICBtZXRhZGF0YVsncnVuX3JlcXVpcmVzJ10uYXBwZW5kKG1heV9yZXF1aXJlbWVudCkKCiAgICAgICAgaWYgbm90ICdleHRyYXMnIGluIG1ldGFkYXRhOgogICAgICAgICAgICBtZXRhZGF0YVsnZXh0cmFzJ10gPSBbXQogICAgICAgIG1ldGFkYXRhWydleHRyYXMnXS5leHRlbmQoW2tleS5leHRyYSBmb3Iga2V5IGluIG1heV9yZXF1aXJlcy5rZXlzKCkgaWYga2V5LmV4dHJhXSkKCgpkZWYgcGtnaW5mb190b19kaWN0KHBhdGgsIGRpc3RyaWJ1dGlvbj1Ob25lKToKICAgICIiIgogICAgQ29udmVydCBQS0ctSU5GTyB0byBhIHByb3RvdHlwZSBNZXRhZGF0YSAyLjAgKFBFUCA0MjYpIGRpY3QuCgogICAgVGhlIGRlc2NyaXB0aW9uIGlzIGluY2x1ZGVkIHVuZGVyIHRoZSBrZXkgWydkZXNjcmlwdGlvbiddIHJhdGhlciB0aGFuCiAgICBiZWluZyB3cml0dGVuIHRvIGEgc2VwYXJhdGUgZmlsZS4KCiAgICBwYXRoOiBwYXRoIHRvIFBLRy1JTkZPIGZpbGUKICAgIGRpc3RyaWJ1dGlvbjogb3B0aW9uYWwgZGlzdHV0aWxzIERpc3RyaWJ1dGlvbigpCiAgICAiIiIKCiAgICBtZXRhZGF0YSA9IE9yZGVyZWREZWZhdWx0RGljdChsYW1iZGE6IE9yZGVyZWREZWZhdWx0RGljdChsYW1iZGE6IE9yZGVyZWREZWZhdWx0RGljdChPcmRlcmVkRGljdCkpKQogICAgbWV0YWRhdGFbImdlbmVyYXRvciJdID0gImJkaXN0X3doZWVsICgiICsgd2hlZWxfdmVyc2lvbiArICIpIgogICAgdHJ5OgogICAgICAgIHVuaWNvZGUKICAgICAgICBwa2dfaW5mbyA9IHJlYWRfcGtnX2luZm8ocGF0aCkKICAgIGV4Y2VwdCBOYW1lRXJyb3I6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIHBrZ19pbmZvX2ZpbGU6CiAgICAgICAgICAgIHBrZ19pbmZvID0gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKHBrZ19pbmZvX2ZpbGUucmVhZCgpLmRlY29kZSgndXRmLTgnKSkKICAgIGRlc2NyaXB0aW9uID0gTm9uZQoKICAgIGlmIHBrZ19pbmZvWydTdW1tYXJ5J106CiAgICAgICAgbWV0YWRhdGFbJ3N1bW1hcnknXSA9IHBrZ2luZm9fdW5pY29kZShwa2dfaW5mbywgJ1N1bW1hcnknKQogICAgICAgIGRlbCBwa2dfaW5mb1snU3VtbWFyeSddCgogICAgaWYgcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ106CiAgICAgICAgZGVzY3JpcHRpb24gPSBkZWRlbnRfZGVzY3JpcHRpb24ocGtnX2luZm8pCiAgICAgICAgZGVsIHBrZ19pbmZvWydEZXNjcmlwdGlvbiddCiAgICBlbHNlOgogICAgICAgIHBheWxvYWQgPSBwa2dfaW5mby5nZXRfcGF5bG9hZCgpCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXlsb2FkLCBieXRlcyk6CiAgICAgICAgICAgICMgQXZvaWQgYSBQeXRob24gMiBVbmljb2RlIGVycm9yLgogICAgICAgICAgICAjIFdlIHN0aWxsIHN1ZmZlciA/IGdseXBocyBvbiBQeXRob24gMy4KICAgICAgICAgICAgcGF5bG9hZCA9IHBheWxvYWQuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgcGF5bG9hZDoKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBwYXlsb2FkCgogICAgaWYgZGVzY3JpcHRpb246CiAgICAgICAgcGtnX2luZm9bJ2Rlc2NyaXB0aW9uJ10gPSBkZXNjcmlwdGlvbgoKICAgIGZvciBrZXkgaW4gc29ydGVkKHVuaXF1ZShrLmxvd2VyKCkgZm9yIGsgaW4gcGtnX2luZm8ua2V5cygpKSk6CiAgICAgICAgbG93X2tleSA9IGtleS5yZXBsYWNlKCctJywgJ18nKQoKICAgICAgICBpZiBsb3dfa2V5IGluIFNLSVBfRklFTERTOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBsb3dfa2V5IGluIFVOS05PV05fRklFTERTIGFuZCBwa2dfaW5mby5nZXQoa2V5KSA9PSAnVU5LTk9XTic6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGxvd19rZXkgaW4gc29ydGVkKFBMVVJBTF9GSUVMRFMpOgogICAgICAgICAgICBtZXRhZGF0YVtQTFVSQUxfRklFTERTW2xvd19rZXldXSA9IHBrZ19pbmZvLmdldF9hbGwoa2V5KQoKICAgICAgICBlbGlmIGxvd19rZXkgPT0gInJlcXVpcmVzX2Rpc3QiOgogICAgICAgICAgICBoYW5kbGVfcmVxdWlyZXMobWV0YWRhdGEsIHBrZ19pbmZvLCBrZXkpCgogICAgICAgIGVsaWYgbG93X2tleSA9PSAncHJvdmlkZXNfZXh0cmEnOgogICAgICAgICAgICBpZiBub3QgJ2V4dHJhcycgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgICAgICBtZXRhZGF0YVsnZXh0cmFzJ10gPSBbXQogICAgICAgICAgICBtZXRhZGF0YVsnZXh0cmFzJ10uZXh0ZW5kKHBrZ19pbmZvLmdldF9hbGwoa2V5KSkKCiAgICAgICAgZWxpZiBsb3dfa2V5ID09ICdob21lX3BhZ2UnOgogICAgICAgICAgICBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZGV0YWlscyddWydwcm9qZWN0X3VybHMnXSA9IHsnSG9tZSc6cGtnX2luZm9ba2V5XX0KCiAgICAgICAgZWxpZiBsb3dfa2V5ID09ICdrZXl3b3Jkcyc6CiAgICAgICAgICAgIG1ldGFkYXRhWydrZXl3b3JkcyddID0gS0VZV09SRFNfUkUuc3BsaXQocGtnX2luZm9ba2V5XSkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YWRhdGFbbG93X2tleV0gPSBwa2dfaW5mb1trZXldCgogICAgbWV0YWRhdGFbJ21ldGFkYXRhX3ZlcnNpb24nXSA9IE1FVEFEQVRBX1ZFUlNJT04KCiAgICBpZiAnZXh0cmFzJyBpbiBtZXRhZGF0YToKICAgICAgICBtZXRhZGF0YVsnZXh0cmFzJ10gPSBzb3J0ZWQoc2V0KG1ldGFkYXRhWydleHRyYXMnXSkpCgogICAgIyBpbmNsdWRlIG1vcmUgaW5mb3JtYXRpb24gaWYgZGlzdHJpYnV0aW9uIGlzIGF2YWlsYWJsZQogICAgaWYgZGlzdHJpYnV0aW9uOgogICAgICAgIGZvciByZXF1aXJlcywgYXR0ciBpbiAoKCd0ZXN0X3JlcXVpcmVzJywgJ3Rlc3RzX3JlcXVpcmUnKSwpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudHMgPSBnZXRhdHRyKGRpc3RyaWJ1dGlvbiwgYXR0cikKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWlyZW1lbnRzLCBsaXN0KToKICAgICAgICAgICAgICAgICAgICBuZXdfcmVxdWlyZW1lbnRzID0gc29ydGVkKGNvbnZlcnRfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpCiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbcmVxdWlyZXNdID0gW3sncmVxdWlyZXMnOm5ld19yZXF1aXJlbWVudHN9XQogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgIyBoYW5kbGUgY29udGFjdHMKICAgIGNvbnRhY3RzID0gW10KICAgIGZvciBjb250YWN0X3R5cGUsIHJvbGUgaW4gQ09OVEFDVF9GSUVMRFM6CiAgICAgICAgY29udGFjdCA9IE9yZGVyZWREaWN0KCkKICAgICAgICBmb3Iga2V5IGluIHNvcnRlZChjb250YWN0X3R5cGUpOgogICAgICAgICAgICBpZiBjb250YWN0X3R5cGVba2V5XSBpbiBtZXRhZGF0YToKICAgICAgICAgICAgICAgIGNvbnRhY3Rba2V5XSA9IG1ldGFkYXRhLnBvcChjb250YWN0X3R5cGVba2V5XSkKICAgICAgICBpZiBjb250YWN0OgogICAgICAgICAgICBjb250YWN0Wydyb2xlJ10gPSByb2xlCiAgICAgICAgICAgIGNvbnRhY3RzLmFwcGVuZChjb250YWN0KQogICAgaWYgY29udGFjdHM6CiAgICAgICAgbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmRldGFpbHMnXVsnY29udGFjdHMnXSA9IGNvbnRhY3RzCgogICAgIyBjb252ZXJ0IGVudHJ5IHBvaW50cyB0byBleHBvcnRzCiAgICB0cnk6CiAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUocGF0aCksICJlbnRyeV9wb2ludHMudHh0IiksICJyIikgYXMgZXBfZmlsZToKICAgICAgICAgICAgZXBfbWFwID0gcGtnX3Jlc291cmNlcy5FbnRyeVBvaW50LnBhcnNlX21hcChlcF9maWxlLnJlYWQoKSkKICAgICAgICBleHBvcnRzID0gT3JkZXJlZERpY3QoKQogICAgICAgIGZvciBncm91cCwgaXRlbXMgaW4gc29ydGVkKGVwX21hcC5pdGVtcygpKToKICAgICAgICAgICAgZXhwb3J0c1tncm91cF0gPSBPcmRlcmVkRGljdCgpCiAgICAgICAgICAgIGZvciBpdGVtIGluIHNvcnRlZChtYXAoc3RyLCBpdGVtcy52YWx1ZXMoKSkpOgogICAgICAgICAgICAgICAgbmFtZSwgZXhwb3J0ID0gaXRlbS5zcGxpdCgnID0gJywgMSkKICAgICAgICAgICAgICAgIGV4cG9ydHNbZ3JvdXBdW25hbWVdID0gZXhwb3J0CiAgICAgICAgaWYgZXhwb3J0czoKICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmV4cG9ydHMnXSA9IGV4cG9ydHMKICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgIHBhc3MKCiAgICAjIGNvcHkgY29uc29sZV9zY3JpcHRzIGVudHJ5IHBvaW50cyB0byBjb21tYW5kcwogICAgaWYgJ3B5dGhvbi5leHBvcnRzJyBpbiBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddOgogICAgICAgIGZvciAoZXBfc2NyaXB0LCB3cmFwX3NjcmlwdCkgaW4gKCgnY29uc29sZV9zY3JpcHRzJywgJ3dyYXBfY29uc29sZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZ3VpX3NjcmlwdHMnLCAnd3JhcF9ndWknKSk6CiAgICAgICAgICAgIGlmIGVwX3NjcmlwdCBpbiBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZXhwb3J0cyddOgogICAgICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmNvbW1hbmRzJ11bd3JhcF9zY3JpcHRdID0gXAogICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5leHBvcnRzJ11bZXBfc2NyaXB0XQoKICAgIHJldHVybiBtZXRhZGF0YQoKZGVmIHJlcXVpcmVzX3RvX3JlcXVpcmVzX2Rpc3QocmVxdWlyZW1lbnQpOgogICAgIiIiQ29tcG9zZSB0aGUgdmVyc2lvbiBwcmVkaWNhdGVzIGZvciByZXF1aXJlbWVudCBpbiBQRVAgMzQ1IGZhc2hpb24uIiIiCiAgICByZXF1aXJlc19kaXN0ID0gW10KICAgIGZvciBvcCwgdmVyIGluIHJlcXVpcmVtZW50LnNwZWNzOgogICAgICAgIHJlcXVpcmVzX2Rpc3QuYXBwZW5kKG9wICsgdmVyKQogICAgaWYgbm90IHJlcXVpcmVzX2Rpc3Q6CiAgICAgICAgcmV0dXJuICcnCiAgICByZXR1cm4gIiAoJXMpIiAlICcsJy5qb2luKHJlcXVpcmVzX2Rpc3QpCgpkZWYgY29udmVydF9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKToKICAgICIiIllpZWxkIFJlcXVpcmVzLURpc3Q6IHN0cmluZ3MgZm9yIHBhcnNlZCByZXF1aXJlbWVudHMgc3RyaW5ncy4iIiIKICAgIGZvciByZXEgaW4gcmVxdWlyZW1lbnRzOgogICAgICAgIHBhcnNlZF9yZXF1aXJlbWVudCA9IHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2UocmVxKQogICAgICAgIHNwZWMgPSByZXF1aXJlc190b19yZXF1aXJlc19kaXN0KHBhcnNlZF9yZXF1aXJlbWVudCkKICAgICAgICBleHRyYXMgPSAiLCIuam9pbihwYXJzZWRfcmVxdWlyZW1lbnQuZXh0cmFzKQogICAgICAgIGlmIGV4dHJhczoKICAgICAgICAgICAgZXh0cmFzID0gIlslc10iICUgZXh0cmFzCiAgICAgICAgeWllbGQgKHBhcnNlZF9yZXF1aXJlbWVudC5wcm9qZWN0X25hbWUgKyBleHRyYXMgKyBzcGVjKQoKZGVmIGdlbmVyYXRlX3JlcXVpcmVtZW50cyhleHRyYXNfcmVxdWlyZSk6CiAgICAiIiIKICAgIENvbnZlcnQgcmVxdWlyZW1lbnRzIGZyb20gYSBzZXR1cCgpLXN0eWxlIGRpY3Rpb25hcnkgdG8gKCdSZXF1aXJlcy1EaXN0JywgJ3JlcXVpcmVtZW50JykKICAgIGFuZCAoJ1Byb3ZpZGVzLUV4dHJhJywgJ2V4dHJhJykgdHVwbGVzLgoKICAgIGV4dHJhc19yZXF1aXJlIGlzIGEgZGljdGlvbmFyeSBvZiB7ZXh0cmE6IFtyZXF1aXJlbWVudHNdfSBhcyBwYXNzZWQgdG8gc2V0dXAoKSwKICAgIHVzaW5nIHRoZSBlbXB0eSBleHRyYSB7Jyc6IFtyZXF1aXJlbWVudHNdfSB0byBob2xkIGluc3RhbGxfcmVxdWlyZXMuCiAgICAiIiIKICAgIGZvciBleHRyYSwgZGVwZW5kcyBpbiBleHRyYXNfcmVxdWlyZS5pdGVtcygpOgogICAgICAgIGNvbmRpdGlvbiA9ICcnCiAgICAgICAgaWYgZXh0cmEgYW5kICc6JyBpbiBleHRyYTogICMgc2V0dXB0b29scyBleHRyYTpjb25kaXRpb24gc3ludGF4CiAgICAgICAgICAgIGV4dHJhLCBjb25kaXRpb24gPSBleHRyYS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgIGV4dHJhID0gcGtnX3Jlc291cmNlcy5zYWZlX2V4dHJhKGV4dHJhKQogICAgICAgIGlmIGV4dHJhOgogICAgICAgICAgICB5aWVsZCAoJ1Byb3ZpZGVzLUV4dHJhJywgZXh0cmEpCiAgICAgICAgICAgIGlmIGNvbmRpdGlvbjoKICAgICAgICAgICAgICAgIGNvbmRpdGlvbiArPSAiIGFuZCAiCiAgICAgICAgICAgIGNvbmRpdGlvbiArPSAiZXh0cmEgPT0gJyVzJyIgJSBleHRyYQogICAgICAgIGlmIGNvbmRpdGlvbjoKICAgICAgICAgICAgY29uZGl0aW9uID0gJzsgJyArIGNvbmRpdGlvbgogICAgICAgIGZvciBuZXdfcmVxIGluIGNvbnZlcnRfcmVxdWlyZW1lbnRzKGRlcGVuZHMpOgogICAgICAgICAgICB5aWVsZCAoJ1JlcXVpcmVzLURpc3QnLCBuZXdfcmVxICsgY29uZGl0aW9uKQoKZGVmIHBrZ2luZm9fdG9fbWV0YWRhdGEoZWdnX2luZm9fcGF0aCwgcGtnaW5mb19wYXRoKToKICAgICIiIgogICAgQ29udmVydCAuZWdnLWluZm8gZGlyZWN0b3J5IHdpdGggUEtHLUlORk8gdG8gdGhlIE1ldGFkYXRhIDEuMyBha2EKICAgIG9sZC1kcmFmdCBNZXRhZGF0YSAyLjAgZm9ybWF0LgogICAgIiIiCiAgICBwa2dfaW5mbyA9IHJlYWRfcGtnX2luZm8ocGtnaW5mb19wYXRoKQogICAgcGtnX2luZm8ucmVwbGFjZV9oZWFkZXIoJ01ldGFkYXRhLVZlcnNpb24nLCAnMi4wJykKICAgIHJlcXVpcmVzX3BhdGggPSBvcy5wYXRoLmpvaW4oZWdnX2luZm9fcGF0aCwgJ3JlcXVpcmVzLnR4dCcpCiAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZXF1aXJlc19wYXRoKToKICAgICAgICB3aXRoIG9wZW4ocmVxdWlyZXNfcGF0aCkgYXMgcmVxdWlyZXNfZmlsZToKICAgICAgICAgICAgcmVxdWlyZXMgPSByZXF1aXJlc19maWxlLnJlYWQoKQogICAgICAgIGZvciBleHRyYSwgcmVxcyBpbiBzb3J0ZWQocGtnX3Jlc291cmNlcy5zcGxpdF9zZWN0aW9ucyhyZXF1aXJlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9bGFtYmRhIHg6IHhbMF0gb3IgJycpOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBnZW5lcmF0ZV9yZXF1aXJlbWVudHMoe2V4dHJhOiByZXFzfSk6CiAgICAgICAgICAgICAgICBwa2dfaW5mb1tpdGVtWzBdXSA9IGl0ZW1bMV0KCiAgICBkZXNjcmlwdGlvbiA9IHBrZ19pbmZvWydEZXNjcmlwdGlvbiddCiAgICBpZiBkZXNjcmlwdGlvbjoKICAgICAgICBwa2dfaW5mby5zZXRfcGF5bG9hZChkZWRlbnRfZGVzY3JpcHRpb24ocGtnX2luZm8pKQogICAgICAgIGRlbCBwa2dfaW5mb1snRGVzY3JpcHRpb24nXQoKICAgIHJldHVybiBwa2dfaW5mbwoKCmRlZiBwa2dpbmZvX3VuaWNvZGUocGtnX2luZm8sIGZpZWxkKToKICAgICIiIkhhY2sgdG8gY29heCBVbmljb2RlIG91dCBvZiBhbiBlbWFpbCBNZXNzYWdlKCkgLSBQeXRob24gMy4zKyIiIgogICAgdGV4dCA9IHBrZ19pbmZvW2ZpZWxkXQogICAgZmllbGQgPSBmaWVsZC5sb3dlcigpCiAgICBpZiBub3QgaXNpbnN0YW5jZSh0ZXh0LCBzdHIpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHBrZ19pbmZvLCAncmF3X2l0ZW1zJyk6ICAjIFB5dGhvbiAzLjIKICAgICAgICAgICAgcmV0dXJuIHN0cih0ZXh0KQogICAgICAgIGZvciBpdGVtIGluIHBrZ19pbmZvLnJhd19pdGVtcygpOgogICAgICAgICAgICBpZiBpdGVtWzBdLmxvd2VyKCkgPT0gZmllbGQ6CiAgICAgICAgICAgICAgICB0ZXh0ID0gaXRlbVsxXS5lbmNvZGUoJ2FzY2lpJywgJ3N1cnJvZ2F0ZWVzY2FwZScpXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgcmV0dXJuIHRleHQKCgpkZWYgZGVkZW50X2Rlc2NyaXB0aW9uKHBrZ19pbmZvKToKICAgICIiIgogICAgRGVkZW50IGFuZCBjb252ZXJ0IHBrZ19pbmZvWydEZXNjcmlwdGlvbiddIHRvIFVuaWNvZGUuCiAgICAiIiIKICAgIGRlc2NyaXB0aW9uID0gcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ10KCiAgICAjIFB5dGhvbiAzIFVuaWNvZGUgaGFuZGxpbmcsIHNvcnRhLgogICAgc3Vycm9nYXRlcyA9IEZhbHNlCiAgICBpZiBub3QgaXNpbnN0YW5jZShkZXNjcmlwdGlvbiwgc3RyKToKICAgICAgICBzdXJyb2dhdGVzID0gVHJ1ZQogICAgICAgIGRlc2NyaXB0aW9uID0gcGtnaW5mb191bmljb2RlKHBrZ19pbmZvLCAnRGVzY3JpcHRpb24nKQoKICAgIGRlc2NyaXB0aW9uX2xpbmVzID0gZGVzY3JpcHRpb24uc3BsaXRsaW5lcygpCiAgICBkZXNjcmlwdGlvbl9kZWRlbnQgPSAnXG4nLmpvaW4oCiAgICAgICAgICAgICMgaWYgdGhlIGZpcnN0IGxpbmUgb2YgbG9uZ19kZXNjcmlwdGlvbiBpcyBibGFuaywKICAgICAgICAgICAgIyB0aGUgZmlyc3QgbGluZSBoZXJlIHdpbGwgYmUgaW5kZW50ZWQuCiAgICAgICAgICAgIChkZXNjcmlwdGlvbl9saW5lc1swXS5sc3RyaXAoKSwKICAgICAgICAgICAgIHRleHR3cmFwLmRlZGVudCgnXG4nLmpvaW4oZGVzY3JpcHRpb25fbGluZXNbMTpdKSksCiAgICAgICAgICAgICAnXG4nKSkKCiAgICBpZiBzdXJyb2dhdGVzOgogICAgICAgIGRlc2NyaXB0aW9uX2RlZGVudCA9IGRlc2NyaXB0aW9uX2RlZGVudFwKICAgICAgICAgICAgICAgIC5lbmNvZGUoInV0ZjgiKVwKICAgICAgICAgICAgICAgIC5kZWNvZGUoImFzY2lpIiwgInN1cnJvZ2F0ZWVzY2FwZSIpCgogICAgcmV0dXJuIGRlc2NyaXB0aW9uX2RlZGVudAoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBpbXBvcnQgc3lzLCBwcHJpbnQKICAgIHBwcmludC5wcHJpbnQocGtnaW5mb190b19kaWN0KHN5cy5hcmd2WzFdKSkKUEsDBBQAAAAAAAAAIQBh9jXSagQAAGoEAAAwAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BhdGhzLnB5IiIiCkluc3RhbGxhdGlvbiBwYXRocy4KCk1hcCB0aGUgLmRhdGEvIHN1YmRpcmVjdG9yeSBuYW1lcyB0byBpbnN0YWxsIHBhdGhzLgoiIiIKCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzeXMKaW1wb3J0IGRpc3R1dGlscy5kaXN0IGFzIGRpc3QKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgYXMgaW5zdGFsbAoKZGVmIGdldF9pbnN0YWxsX2NvbW1hbmQobmFtZSk6CiAgICAjIGxhdGUgYmluZGluZyBkdWUgdG8gcG90ZW50aWFsIG1vbmtleXBhdGNoaW5nCiAgICBkID0gZGlzdC5EaXN0cmlidXRpb24oeyduYW1lJzpuYW1lfSkKICAgIGkgPSBpbnN0YWxsLmluc3RhbGwoZCkKICAgIGkuZmluYWxpemVfb3B0aW9ucygpCiAgICByZXR1cm4gaQoKZGVmIGdldF9pbnN0YWxsX3BhdGhzKG5hbWUpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIChkaXN0dXRpbHMpIGluc3RhbGwgcGF0aHMgZm9yIHRoZSBuYW1lZCBkaXN0LgogICAgCiAgICBBIGRpY3Qgd2l0aCAoJ3B1cmVsaWInLCAncGxhdGxpYicsICdoZWFkZXJzJywgJ3NjcmlwdHMnLCAnZGF0YScpIGtleXMuCiAgICAiIiIKICAgIHBhdGhzID0ge30KCiAgICBpID0gZ2V0X2luc3RhbGxfY29tbWFuZChuYW1lKQoKICAgIGZvciBrZXkgaW4gaW5zdGFsbC5TQ0hFTUVfS0VZUzoKICAgICAgICBwYXRoc1trZXldID0gZ2V0YXR0cihpLCAnaW5zdGFsbF8nICsga2V5KQoKICAgICMgcGlwIHVzZXMgYSBzaW1pbGFyIHBhdGggYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSdzIChyZWFkLW9ubHkpCiAgICAjIGluY2x1ZGUgZGlyZWN0b3J5OgogICAgaWYgaGFzYXR0cihzeXMsICdyZWFsX3ByZWZpeCcpOiAgIyB2aXJ0dWFsZW52CiAgICAgICAgcGF0aHNbJ2hlYWRlcnMnXSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbicgKyBzeXMudmVyc2lvbls6M10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKQoKICAgIHJldHVybiBwYXRocwpQSwMEFAAAAAAAAAAhAGtiVnzFFgAAxRYAADUAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGVwNDI1dGFncy5weSIiIkdlbmVyYXRlIGFuZCB3b3JrIHdpdGggUEVQIDQyNSBDb21wYXRpYmlsaXR5IFRhZ3MuIiIiCgppbXBvcnQgc3lzCmltcG9ydCB3YXJuaW5ncwoKdHJ5OgogICAgaW1wb3J0IHN5c2NvbmZpZwpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYSBub2NvdmVyCiAgICAjIFB5dGhvbiA8IDIuNwogICAgaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWcgYXMgc3lzY29uZmlnCmltcG9ydCBkaXN0dXRpbHMudXRpbAoKCmRlZiBnZXRfY29uZmlnX3Zhcih2YXIpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIodmFyKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZTogICMgcGlwIElzc3VlICMxMDc0CiAgICAgICAgd2FybmluZ3Mud2FybigiezB9Ii5mb3JtYXQoZSksIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgIHJldHVybiBOb25lCgoKZGVmIGdldF9hYmJyX2ltcGwoKToKICAgICIiIlJldHVybiBhYmJyZXZpYXRlZCBpbXBsZW1lbnRhdGlvbiBuYW1lLiIiIgogICAgaWYgaGFzYXR0cihzeXMsICdweXB5X3ZlcnNpb25faW5mbycpOgogICAgICAgIHB5aW1wbCA9ICdwcCcKICAgIGVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICAgICBweWltcGwgPSAnanknCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnY2xpJzoKICAgICAgICBweWltcGwgPSAnaXAnCiAgICBlbHNlOgogICAgICAgIHB5aW1wbCA9ICdjcCcKICAgIHJldHVybiBweWltcGwKCgpkZWYgZ2V0X2ltcGxfdmVyKCk6CiAgICAiIiJSZXR1cm4gaW1wbGVtZW50YXRpb24gdmVyc2lvbi4iIiIKICAgIGltcGxfdmVyID0gZ2V0X2NvbmZpZ192YXIoInB5X3ZlcnNpb25fbm9kb3QiKQogICAgaWYgbm90IGltcGxfdmVyIG9yIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgIGltcGxfdmVyID0gJycuam9pbihtYXAoc3RyLCBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKSkpCiAgICByZXR1cm4gaW1wbF92ZXIKCgpkZWYgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCk6CiAgICAiIiJSZXR1cm4gc3lzLnZlcnNpb25faW5mby1saWtlIHR1cGxlIGZvciB1c2UgaW4gZGVjcmVtZW50aW5nIHRoZSBtaW5vcgogICAgdmVyc2lvbi4iIiIKICAgIGlmIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgICMgYXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMjg4MgogICAgICAgIHJldHVybiAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1ham9yLAogICAgICAgICAgICAgICAgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pbm9yKQogICAgZWxzZToKICAgICAgICByZXR1cm4gc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXQoKCmRlZiBnZXRfZmxhZyh2YXIsIGZhbGxiYWNrLCBleHBlY3RlZD1UcnVlLCB3YXJuPVRydWUpOgogICAgIiIiVXNlIGEgZmFsbGJhY2sgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBTT0FCSSBmbGFncyBpZiB0aGUgbmVlZGVkIGNvbmZpZwogICAgdmFyIGlzIHVuc2V0IG9yIHVuYXZhaWxhYmxlLiIiIgogICAgdmFsID0gZ2V0X2NvbmZpZ192YXIodmFyKQogICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgaWYgd2FybjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ29uZmlnIHZhcmlhYmxlICd7MH0nIGlzIHVuc2V0LCBQeXRob24gQUJJIHRhZyBtYXkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBpbmNvcnJlY3QiLmZvcm1hdCh2YXIpLCBSdW50aW1lV2FybmluZywgMikKICAgICAgICByZXR1cm4gZmFsbGJhY2soKQogICAgcmV0dXJuIHZhbCA9PSBleHBlY3RlZAoKCmRlZiBnZXRfYWJpX3RhZygpOgogICAgIiIiUmV0dXJuIHRoZSBBQkkgdGFnIGJhc2VkIG9uIFNPQUJJIChpZiBhdmFpbGFibGUpIG9yIGVtdWxhdGUgU09BQkkKICAgIChDUHl0aG9uIDIsIFB5UHkpLiIiIgogICAgc29hYmkgPSBnZXRfY29uZmlnX3ZhcignU09BQkknKQogICAgaW1wbCA9IGdldF9hYmJyX2ltcGwoKQogICAgaWYgbm90IHNvYWJpIGFuZCBpbXBsIGluICgnY3AnLCAncHAnKSBhbmQgaGFzYXR0cihzeXMsICdtYXh1bmljb2RlJyk6CiAgICAgICAgZCA9ICcnCiAgICAgICAgbSA9ICcnCiAgICAgICAgdSA9ICcnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X0RFQlVHJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBkID0gJ2QnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1dJVEhfUFlNQUxMT0MnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaW1wbCA9PSAnY3AnLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBtID0gJ20nCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X1VOSUNPREVfU0laRScsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzeXMubWF4dW5pY29kZSA9PSAweDEwZmZmZiwKICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD00LAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpKSkgXAogICAgICAgICAgICAgICAgYW5kIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMyk6CiAgICAgICAgICAgIHUgPSAndScKICAgICAgICBhYmkgPSAnJXMlcyVzJXMlcycgJSAoaW1wbCwgZ2V0X2ltcGxfdmVyKCksIGQsIG0sIHUpCiAgICBlbGlmIHNvYWJpIGFuZCBzb2FiaS5zdGFydHN3aXRoKCdjcHl0aG9uLScpOgogICAgICAgIGFiaSA9ICdjcCcgKyBzb2FiaS5zcGxpdCgnLScpWzFdCiAgICBlbGlmIHNvYWJpOgogICAgICAgIGFiaSA9IHNvYWJpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBlbHNlOgogICAgICAgIGFiaSA9IE5vbmUKICAgIHJldHVybiBhYmkKCgpkZWYgZ2V0X3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gb3VyIHBsYXRmb3JtIG5hbWUgJ3dpbjMyJywgJ2xpbnV4X3g4Nl82NCciIiIKICAgICMgWFhYIHJlbW92ZSBkaXN0dXRpbHMgZGVwZW5kZW5jeQogICAgcmVzdWx0ID0gZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGlmIHJlc3VsdCA9PSAibGludXhfeDg2XzY0IiBhbmQgc3lzLm1heHNpemUgPT0gMjE0NzQ4MzY0NzoKICAgICAgICAjIHBpcCBwdWxsIHJlcXVlc3QgIzM0OTcKICAgICAgICByZXN1bHQgPSAibGludXhfaTY4NiIKICAgIHJldHVybiByZXN1bHQKCgpkZWYgZ2V0X3N1cHBvcnRlZCh2ZXJzaW9ucz1Ob25lLCBzdXBwbGllZF9wbGF0Zm9ybT1Ob25lKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHRhZ3MgZm9yIGVhY2ggdmVyc2lvbiBzcGVjaWZpZWQgaW4KICAgIGB2ZXJzaW9uc2AuCgogICAgOnBhcmFtIHZlcnNpb25zOiBhIGxpc3Qgb2Ygc3RyaW5nIHZlcnNpb25zLCBvZiB0aGUgZm9ybSBbIjMzIiwgIjMyIl0sIAogICAgICAgIG9yIE5vbmUuIFRoZSBmaXJzdCB2ZXJzaW9uIHdpbGwgYmUgYXNzdW1lZCB0byBzdXBwb3J0IG91ciBBQkkuCiAgICAiIiIKICAgIHN1cHBvcnRlZCA9IFtdCiAgICAKICAgICMgVmVyc2lvbnMgbXVzdCBiZSBnaXZlbiB3aXRoIHJlc3BlY3QgdG8gdGhlIHByZWZlcmVuY2UKICAgIGlmIHZlcnNpb25zIGlzIE5vbmU6CiAgICAgICAgdmVyc2lvbnMgPSBbXQogICAgICAgIHZlcnNpb25faW5mbyA9IGdldF9pbXBsX3ZlcnNpb25faW5mbygpCiAgICAgICAgbWFqb3IgPSB2ZXJzaW9uX2luZm9bOi0xXQogICAgICAgICMgU3VwcG9ydCBhbGwgcHJldmlvdXMgbWlub3IgUHl0aG9uIHZlcnNpb25zLgogICAgICAgIGZvciBtaW5vciBpbiByYW5nZSh2ZXJzaW9uX2luZm9bLTFdLCAtMSwgLTEpOgogICAgICAgICAgICB2ZXJzaW9ucy5hcHBlbmQoJycuam9pbihtYXAoc3RyLCBtYWpvciArIChtaW5vciwpKSkpCiAgICAgICAgICAgIAogICAgaW1wbCA9IGdldF9hYmJyX2ltcGwoKQogICAgCiAgICBhYmlzID0gW10KCiAgICBhYmkgPSBnZXRfYWJpX3RhZygpCiAgICBpZiBhYmk6CiAgICAgICAgYWJpc1swOjBdID0gW2FiaV0KIAogICAgYWJpM3MgPSBzZXQoKQogICAgaW1wb3J0IGltcAogICAgZm9yIHN1ZmZpeCBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCk6CiAgICAgICAgaWYgc3VmZml4WzBdLnN0YXJ0c3dpdGgoJy5hYmknKToKICAgICAgICAgICAgYWJpM3MuYWRkKHN1ZmZpeFswXS5zcGxpdCgnLicsIDIpWzFdKQoKICAgIGFiaXMuZXh0ZW5kKHNvcnRlZChsaXN0KGFiaTNzKSkpCgogICAgYWJpcy5hcHBlbmQoJ25vbmUnKQoKICAgIHBsYXRmb3JtcyA9IFtdCiAgICBpZiBzdXBwbGllZF9wbGF0Zm9ybToKICAgICAgICBwbGF0Zm9ybXMuYXBwZW5kKHN1cHBsaWVkX3BsYXRmb3JtKQogICAgcGxhdGZvcm1zLmFwcGVuZChnZXRfcGxhdGZvcm0oKSkKICAgIAogICAgIyBDdXJyZW50IHZlcnNpb24sIGN1cnJlbnQgQVBJIChidWlsdCBzcGVjaWZpY2FsbHkgZm9yIG91ciBQeXRob24pOgogICAgZm9yIGFiaSBpbiBhYmlzOgogICAgICAgIGZvciBhcmNoIGluIHBsYXRmb3JtczoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdKSwgYWJpLCBhcmNoKSkKCiAgICAjIGFiaTMgbW9kdWxlcyBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBQeXRob24KICAgIGZvciB2ZXJzaW9uIGluIHZlcnNpb25zWzE6XToKICAgICAgICAjIGFiaTMgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuMgogICAgICAgIGlmIHZlcnNpb24gaW4gKCczMScsICczMCcpOgogICAgICAgICAgICBicmVhawogICAgICAgIGZvciBhYmkgaW4gYWJpM3M6ICAgIyBlbXB0eSBzZXQgaWYgbm90IFB5dGhvbiAzCiAgICAgICAgICAgIGZvciBhcmNoIGluIHBsYXRmb3JtczoKICAgICAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCIlcyVzIiAlIChpbXBsLCB2ZXJzaW9uKSwgYWJpLCBhcmNoKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGJ1dCByZXF1aXJlcyBvdXIgaW1wbGVtZW50YXRpb246CiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICAjIFRhZ2dlZCBzcGVjaWZpY2FsbHkgYXMgYmVpbmcgY3Jvc3MtdmVyc2lvbiBjb21wYXRpYmxlIAogICAgICAgICAgICAjICh3aXRoIGp1c3QgdGhlIG1ham9yIHZlcnNpb24gc3BlY2lmaWVkKQogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsICdhbnknKSkgCiAgICAKICAgICMgTWFqb3IgUHl0aG9uIHZlcnNpb24gKyBwbGF0Zm9ybTsgZS5nLiBiaW5hcmllcyBub3QgdXNpbmcgdGhlIFB5dGhvbiBBUEkKICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uc1swXVswXSksICdub25lJywgYXJjaCkpCgogICAgIyBObyBhYmkgLyBhcmNoLCBnZW5lcmljIFB5dGhvbgogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvbiwpLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uWzBdKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgCiAgICByZXR1cm4gc3VwcG9ydGVkClBLAwQUAAAAAAAAACEAgEMYoMkEAADJBAAAMgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9wa2dpbmZvLnB5IiIiVG9vbHMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgUEtHLUlORk8gLyBNRVRBREFUQSB3aXRob3V0IGNhcmluZwphYm91dCB0aGUgZW5jb2RpbmcuIiIiCgpmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyCgp0cnk6CiAgICB1bmljb2RlCiAgICBfUFkzID0gRmFsc2UKZXhjZXB0IE5hbWVFcnJvcjoKICAgIF9QWTMgPSBUcnVlCgppZiBub3QgX1BZMzoKICAgIGZyb20gZW1haWwuZ2VuZXJhdG9yIGltcG9ydCBHZW5lcmF0b3IKICAgIAogICAgZGVmIHJlYWRfcGtnX2luZm9fYnl0ZXMoYnl0ZXN0cik6CiAgICAgICAgcmV0dXJuIFBhcnNlcigpLnBhcnNlc3RyKGJ5dGVzdHIpCgogICAgZGVmIHJlYWRfcGtnX2luZm8ocGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyIikgYXMgaGVhZGVyczoKICAgICAgICAgICAgbWVzc2FnZSA9IFBhcnNlcigpLnBhcnNlKGhlYWRlcnMpCiAgICAgICAgcmV0dXJuIG1lc3NhZ2UKCiAgICBkZWYgd3JpdGVfcGtnX2luZm8ocGF0aCwgbWVzc2FnZSk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd3JykgYXMgbWV0YWRhdGE6CiAgICAgICAgICAgIEdlbmVyYXRvcihtZXRhZGF0YSwgbWF4aGVhZGVybGVuPTApLmZsYXR0ZW4obWVzc2FnZSkgCgplbHNlOgogICAgZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEJ5dGVzR2VuZXJhdG9yCiAgICBkZWYgcmVhZF9wa2dfaW5mb19ieXRlcyhieXRlc3RyKToKICAgICAgICBoZWFkZXJzID0gYnl0ZXN0ci5kZWNvZGUoZW5jb2Rpbmc9ImFzY2lpIiwgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiKQogICAgICAgIG1lc3NhZ2UgPSBQYXJzZXIoKS5wYXJzZXN0cihoZWFkZXJzKQogICAgICAgIHJldHVybiBtZXNzYWdlCgogICAgZGVmIHJlYWRfcGtnX2luZm8ocGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyIiwgCiAgICAgICAgICAgICAgICAgIGVuY29kaW5nPSJhc2NpaSIsIAogICAgICAgICAgICAgICAgICBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIpIGFzIGhlYWRlcnM6CiAgICAgICAgICAgIG1lc3NhZ2UgPSBQYXJzZXIoKS5wYXJzZShoZWFkZXJzKQogICAgICAgIHJldHVybiBtZXNzYWdlCgogICAgZGVmIHdyaXRlX3BrZ19pbmZvKHBhdGgsIG1lc3NhZ2UpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiKSBhcyBvdXQ6CiAgICAgICAgICAgIEJ5dGVzR2VuZXJhdG9yKG91dCwgbWF4aGVhZGVybGVuPTApLmZsYXR0ZW4obWVzc2FnZSkKClBLAwQUAAAAAAAAACEA/EzmTMMOAADDDgAAPgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL19faW5pdF9fLnB5IiIiCkNyZWF0ZSBhbmQgdmVyaWZ5IGp3cy1qcyBmb3JtYXQgRWQyNTUxOSBzaWduYXR1cmVzLgoiIiIKCl9fYWxsX18gPSBbICdzaWduJywgJ3ZlcmlmeScgXQoKaW1wb3J0IGpzb24KZnJvbSAuLnV0aWwgaW1wb3J0IHVybHNhZmVfYjY0ZGVjb2RlLCB1cmxzYWZlX2I2NGVuY29kZSwgbmF0aXZlLCBiaW5hcnkKCmVkMjU1MTlsbCA9IE5vbmUKCkFMRyA9ICJFZDI1NTE5IgoKZGVmIGdldF9lZDI1NTE5bGwoKToKICAgICIiIkxhenkgaW1wb3J0LWFuZC10ZXN0IG9mIGVkMjU1MTkgbW9kdWxlIiIiCiAgICBnbG9iYWwgZWQyNTUxOWxsCiAgICAKICAgIGlmIG5vdCBlZDI1NTE5bGw6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgZWQyNTUxOWxsICMgZmFzdCAodGhvdXNhbmRzIC8gcykKICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBPU0Vycm9yKTogIyBwcmFnbWEgbm9jb3ZlcgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGVkMjU1MTlweSBhcyBlZDI1NTE5bGwgIyBwdXJlIFB5dGhvbiAoaHVuZHJlZHMgLyBzKQogICAgICAgIHRlc3QoKQogICAgCiAgICByZXR1cm4gZWQyNTUxOWxsCgpkZWYgc2lnbihwYXlsb2FkLCBrZXlwYWlyKToKICAgICIiIlJldHVybiBhIEpXUy1KUyBmb3JtYXQgc2lnbmF0dXJlIGdpdmVuIGEgSlNPTi1zZXJpYWxpemFibGUgcGF5bG9hZCBhbmQgCiAgICBhbiBFZDI1NTE5IGtleXBhaXIuIiIiCiAgICBnZXRfZWQyNTUxOWxsKCkKICAgICMKICAgIGhlYWRlciA9IHsKICAgICAgICAgICAgICAgICJhbGciOiBBTEcsCiAgICAgICAgICAgICAgICAiandrIjogewogICAgICAgICAgICAgICAgICAgICJrdHkiOiBBTEcsICMgYWxnIC0+IGt0eSBpbiBqd2stMDguCiAgICAgICAgICAgICAgICAgICAgInZrIjogbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGtleXBhaXIudmspKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgCiAgICBlbmNvZGVkX2hlYWRlciA9IHVybHNhZmVfYjY0ZW5jb2RlKGJpbmFyeShqc29uLmR1bXBzKGhlYWRlciwgc29ydF9rZXlzPVRydWUpKSkKICAgIGVuY29kZWRfcGF5bG9hZCA9IHVybHNhZmVfYjY0ZW5jb2RlKGJpbmFyeShqc29uLmR1bXBzKHBheWxvYWQsIHNvcnRfa2V5cz1UcnVlKSkpCiAgICBzZWN1cmVkX2lucHV0ID0gYiIuIi5qb2luKChlbmNvZGVkX2hlYWRlciwgZW5jb2RlZF9wYXlsb2FkKSkKICAgIHNpZ19tc2cgPSBlZDI1NTE5bGwuY3J5cHRvX3NpZ24oc2VjdXJlZF9pbnB1dCwga2V5cGFpci5zaykKICAgIHNpZ25hdHVyZSA9IHNpZ19tc2dbOmVkMjU1MTlsbC5TSUdOQVRVUkVCWVRFU10KICAgIGVuY29kZWRfc2lnbmF0dXJlID0gdXJsc2FmZV9iNjRlbmNvZGUoc2lnbmF0dXJlKQogICAgCiAgICByZXR1cm4geyJyZWNpcGllbnRzIjogCiAgICAgICAgICAgIFt7ImhlYWRlciI6bmF0aXZlKGVuY29kZWRfaGVhZGVyKSwKICAgICAgICAgICAgICJzaWduYXR1cmUiOm5hdGl2ZShlbmNvZGVkX3NpZ25hdHVyZSl9XSwKICAgICAgICAgICAgInBheWxvYWQiOiBuYXRpdmUoZW5jb2RlZF9wYXlsb2FkKX0KCmRlZiBhc3NlcnRUcnVlKGNvbmRpdGlvbiwgbWVzc2FnZT0iIik6CiAgICBpZiBub3QgY29uZGl0aW9uOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobWVzc2FnZSkKICAgIApkZWYgdmVyaWZ5KGp3c2pzKToKICAgICIiIlJldHVybiAoZGVjb2RlZCBoZWFkZXJzLCBwYXlsb2FkKSBpZiBhbGwgc2lnbmF0dXJlcyBpbiBqd3NqcyBhcmUKICAgIGNvbnNpc3RlbnQsIGVsc2UgcmFpc2UgVmFsdWVFcnJvci4KICAgIAogICAgQ2FsbGVyIG11c3QgZGVjaWRlIHdoZXRoZXIgdGhlIGtleXMgYXJlIGFjdHVhbGx5IHRydXN0ZWQuIiIiCiAgICBnZXRfZWQyNTUxOWxsKCkgICAgCiAgICAjIFhYWCBmb3JiaWQgZHVwbGljYXRlIGtleXMgaW4gSlNPTiBpbnB1dCB1c2luZyBvYmplY3RfcGFpcnNfaG9vayAoMi43KykKICAgIHJlY2lwaWVudHMgPSBqd3Nqc1sicmVjaXBpZW50cyJdCiAgICBlbmNvZGVkX3BheWxvYWQgPSBiaW5hcnkoandzanNbInBheWxvYWQiXSkKICAgIGhlYWRlcnMgPSBbXQogICAgZm9yIHJlY2lwaWVudCBpbiByZWNpcGllbnRzOgogICAgICAgIGFzc2VydFRydWUobGVuKHJlY2lwaWVudCkgPT0gMiwgIlVua25vd24gcmVjaXBpZW50IGtleSB7MH0iLmZvcm1hdChyZWNpcGllbnQpKQogICAgICAgIGggPSBiaW5hcnkocmVjaXBpZW50WyJoZWFkZXIiXSkKICAgICAgICBzID0gYmluYXJ5KHJlY2lwaWVudFsic2lnbmF0dXJlIl0pCiAgICAgICAgaGVhZGVyID0ganNvbi5sb2FkcyhuYXRpdmUodXJsc2FmZV9iNjRkZWNvZGUoaCkpKQogICAgICAgIGFzc2VydFRydWUoaGVhZGVyWyJhbGciXSA9PSBBTEcsIAogICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgYWxnb3JpdGhtIHswfSIuZm9ybWF0KGhlYWRlclsiYWxnIl0pKQogICAgICAgIGlmICJhbGciIGluIGhlYWRlclsiandrIl0gYW5kIG5vdCAia3R5IiBpbiBoZWFkZXJbImp3ayJdOgogICAgICAgICAgICBoZWFkZXJbImp3ayJdWyJrdHkiXSA9IGhlYWRlclsiandrIl1bImFsZyJdICMgYi93IGZvciBKV0sgPCAtMDgKICAgICAgICBhc3NlcnRUcnVlKGhlYWRlclsiandrIl1bImt0eSJdID09IEFMRywgIyB0cnVlIGZvciBFZDI1NTE5CiAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBrZXkgdHlwZSB7MH0iLmZvcm1hdChoZWFkZXJbImp3ayJdWyJrdHkiXSkpCiAgICAgICAgdmsgPSB1cmxzYWZlX2I2NGRlY29kZShiaW5hcnkoaGVhZGVyWyJqd2siXVsidmsiXSkpCiAgICAgICAgc2VjdXJlZF9pbnB1dCA9IGIiLiIuam9pbigoaCwgZW5jb2RlZF9wYXlsb2FkKSkKICAgICAgICBzaWcgPSB1cmxzYWZlX2I2NGRlY29kZShzKQogICAgICAgIHNpZ19tc2cgPSBzaWcrc2VjdXJlZF9pbnB1dAogICAgICAgIHZlcmlmaWVkX2lucHV0ID0gbmF0aXZlKGVkMjU1MTlsbC5jcnlwdG9fc2lnbl9vcGVuKHNpZ19tc2csIHZrKSkKICAgICAgICB2ZXJpZmllZF9oZWFkZXIsIHZlcmlmaWVkX3BheWxvYWQgPSB2ZXJpZmllZF9pbnB1dC5zcGxpdCgnLicpCiAgICAgICAgdmVyaWZpZWRfaGVhZGVyID0gYmluYXJ5KHZlcmlmaWVkX2hlYWRlcikKICAgICAgICBkZWNvZGVkX2hlYWRlciA9IG5hdGl2ZSh1cmxzYWZlX2I2NGRlY29kZSh2ZXJpZmllZF9oZWFkZXIpKQogICAgICAgIGhlYWRlcnMuYXBwZW5kKGpzb24ubG9hZHMoZGVjb2RlZF9oZWFkZXIpKQoKICAgIHZlcmlmaWVkX3BheWxvYWQgPSBiaW5hcnkodmVyaWZpZWRfcGF5bG9hZCkKCiAgICAjIG9ubHkgcmV0dXJuIGhlYWRlciwgcGF5bG9hZCB0aGF0IGhhdmUgcGFzc2VkIHRocm91Z2ggdGhlIGNyeXB0byBsaWJyYXJ5LgogICAgcGF5bG9hZCA9IGpzb24ubG9hZHMobmF0aXZlKHVybHNhZmVfYjY0ZGVjb2RlKHZlcmlmaWVkX3BheWxvYWQpKSkKCiAgICByZXR1cm4gaGVhZGVycywgcGF5bG9hZAoKZGVmIHRlc3QoKToKICAgIGtwID0gZWQyNTUxOWxsLmNyeXB0b19zaWduX2tleXBhaXIoKQogICAgcGF5bG9hZCA9IHsndGVzdCc6ICdvbnN0YXJ0dXAnfQogICAgandzanMgPSBqc29uLmxvYWRzKGpzb24uZHVtcHMoc2lnbihwYXlsb2FkLCBrcCkpKQogICAgdmVyaWZ5KGp3c2pzKQogICAgandzanNbJ3BheWxvYWQnXSArPSAneCcKICAgIHRyeToKICAgICAgICB2ZXJpZnkoandzanMpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOiAjIHByYWdtYSBubyBjb3ZlcgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiTm8gZXJyb3IgZnJvbSBiYWQgd2hlZWwuc2lnbmF0dXJlcyBwYXlsb2FkLiIpCgpQSwMEFAAAAAAAAAAhAPxQ/+BjGgAAYxoAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9kamJlYy5weSMgRWQyNTUxOSBkaWdpdGFsIHNpZ25hdHVyZXMKIyBCYXNlZCBvbiBodHRwOi8vZWQyNTUxOS5jci55cC50by9weXRob24vZWQyNTUxOS5weQojIFNlZSBhbHNvIGh0dHA6Ly9lZDI1NTE5LmNyLnlwLnRvL3NvZnR3YXJlLmh0bWwKIyBBZGFwdGVkIGJ5IFJvbiBHYXJyZXQKIyBTcGVkIHVwIGNvbnNpZGVyYWJseSB1c2luZyBjb29yZGluYXRlIHRyYW5zZm9ybXMgZm91bmQgb246CiMgaHR0cDovL3d3dy5oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1leHRlbmRlZC0xLmh0bWwKIyBTcGVjaWZpY2FsbHkgYWRkLTIwMDgtaHdjZC00IGFuZCBkYmwtMjAwOC1od2NkCgp0cnk6ICMgcHJhZ21hIG5vY292ZXIKICAgIHVuaWNvZGUKICAgIFBZMyA9IEZhbHNlCiAgICBkZWYgYXNieXRlcyhiKToKICAgICAgICAiIiJDb252ZXJ0IGFycmF5IG9mIGludGVnZXJzIHRvIGJ5dGUgc3RyaW5nIiIiCiAgICAgICAgcmV0dXJuICcnLmpvaW4oY2hyKHgpIGZvciB4IGluIGIpCiAgICBkZWYgam9pbmJ5dGVzKGIpOgogICAgICAgICIiIkNvbnZlcnQgYXJyYXkgb2YgYnl0ZXMgdG8gYnl0ZSBzdHJpbmciIiIKICAgICAgICByZXR1cm4gJycuam9pbihiKQogICAgZGVmIGJpdChoLCBpKToKICAgICAgICAiIiJSZXR1cm4gaSd0aCBiaXQgb2YgYnl0ZXN0cmluZyBoIiIiCiAgICAgICAgcmV0dXJuIChvcmQoaFtpLy84XSkgPj4gKGklOCkpICYgMQoKZXhjZXB0IE5hbWVFcnJvcjogIyBwcmFnbWEgbm9jb3ZlcgogICAgUFkzID0gVHJ1ZQogICAgYXNieXRlcyA9IGJ5dGVzCiAgICBqb2luYnl0ZXMgPSBieXRlcwogICAgZGVmIGJpdChoLCBpKToKICAgICAgICByZXR1cm4gKGhbaS8vOF0gPj4gKGklOCkpICYgMQoKaW1wb3J0IGhhc2hsaWIKCmIgPSAyNTYKcSA9IDIqKjI1NSAtIDE5CmwgPSAyKioyNTIgKyAyNzc0MjMxNzc3NzM3MjM1MzUzNTg1MTkzNzc5MDg4MzY0ODQ5MwoKZGVmIEgobSk6CiAgICByZXR1cm4gaGFzaGxpYi5zaGE1MTIobSkuZGlnZXN0KCkKCmRlZiBleHBtb2QoYiwgZSwgbSk6CiAgICBpZiBlID09IDA6IHJldHVybiAxCiAgICB0ID0gZXhwbW9kKGIsIGUgLy8gMiwgbSkgKiogMiAlIG0KICAgIGlmIGUgJiAxOiB0ID0gKHQgKiBiKSAlIG0KICAgIHJldHVybiB0CgojIENhbiBwcm9iYWJseSBnZXQgc29tZSBleHRyYSBzcGVlZHVwIGhlcmUgYnkgcmVwbGFjaW5nIHRoaXMgd2l0aAojIGFuIGV4dGVuZGVkLWV1Y2xpZGVhbiwgYnV0IHBlcmZvcm1hbmNlIHNlZW1zIE9LIHdpdGhvdXQgdGhhdApkZWYgaW52KHgpOgogICAgcmV0dXJuIGV4cG1vZCh4LCBxLTIsIHEpCgpkID0gLTEyMTY2NSAqIGludigxMjE2NjYpCkkgPSBleHBtb2QoMiwocS0xKS8vNCxxKQoKZGVmIHhyZWNvdmVyKHkpOgogICAgeHggPSAoeSp5LTEpICogaW52KGQqeSp5KzEpCiAgICB4ID0gZXhwbW9kKHh4LChxKzMpLy84LHEpCiAgICBpZiAoeCp4IC0geHgpICUgcSAhPSAwOiB4ID0gKHgqSSkgJSBxCiAgICBpZiB4ICUgMiAhPSAwOiB4ID0gcS14CiAgICByZXR1cm4geAoKQnkgPSA0ICogaW52KDUpCkJ4ID0geHJlY292ZXIoQnkpCkIgPSBbQnggJSBxLEJ5ICUgcV0KCiNkZWYgZWR3YXJkcyhQLFEpOgojICAgIHgxID0gUFswXQojICAgIHkxID0gUFsxXQojICAgIHgyID0gUVswXQojICAgIHkyID0gUVsxXQojICAgIHgzID0gKHgxKnkyK3gyKnkxKSAqIGludigxK2QqeDEqeDIqeTEqeTIpCiMgICAgeTMgPSAoeTEqeTIreDEqeDIpICogaW52KDEtZCp4MSp4Mip5MSp5MikKIyAgICByZXR1cm4gKHgzICUgcSx5MyAlIHEpCgojZGVmIHNjYWxhcm11bHQoUCxlKToKIyAgICBpZiBlID09IDA6IHJldHVybiBbMCwxXQojICAgIFEgPSBzY2FsYXJtdWx0KFAsZS8yKQojICAgIFEgPSBlZHdhcmRzKFEsUSkKIyAgICBpZiBlICYgMTogUSA9IGVkd2FyZHMoUSxQKQojICAgIHJldHVybiBRCgojIEZhc3RlciAoISkgdmVyc2lvbiBiYXNlZCBvbjoKIyBodHRwOi8vd3d3Lmh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbAoKZGVmIHhwdF9hZGQocHQxLCBwdDIpOgogICAgKFgxLCBZMSwgWjEsIFQxKSA9IHB0MQogICAgKFgyLCBZMiwgWjIsIFQyKSA9IHB0MgogICAgQSA9ICgoWTEtWDEpKihZMitYMikpICUgcQogICAgQiA9ICgoWTErWDEpKihZMi1YMikpICUgcQogICAgQyA9IChaMSoyKlQyKSAlIHEKICAgIEQgPSAoVDEqMipaMikgJSBxCiAgICBFID0gKEQrQykgJSBxCiAgICBGID0gKEItQSkgJSBxCiAgICBHID0gKEIrQSkgJSBxCiAgICBIID0gKEQtQykgJSBxCiAgICBYMyA9IChFKkYpICUgcQogICAgWTMgPSAoRypIKSAlIHEKICAgIFozID0gKEYqRykgJSBxCiAgICBUMyA9IChFKkgpICUgcQogICAgcmV0dXJuIChYMywgWTMsIFozLCBUMykKCmRlZiB4cHRfZG91YmxlIChwdCk6CiAgICAoWDEsIFkxLCBaMSwgXykgPSBwdAogICAgQSA9IChYMSpYMSkKICAgIEIgPSAoWTEqWTEpCiAgICBDID0gKDIqWjEqWjEpCiAgICBEID0gKC1BKSAlIHEKICAgIEogPSAoWDErWTEpICUgcQogICAgRSA9IChKKkotQS1CKSAlIHEKICAgIEcgPSAoRCtCKSAlIHEKICAgIEYgPSAoRy1DKSAlIHEKICAgIEggPSAoRC1CKSAlIHEKICAgIFgzID0gKEUqRikgJSBxCiAgICBZMyA9IChHKkgpICUgcQogICAgWjMgPSAoRipHKSAlIHEKICAgIFQzID0gKEUqSCkgJSBxCiAgICByZXR1cm4gKFgzLCBZMywgWjMsIFQzKQoKZGVmIHB0X3hmb3JtIChwdCk6CiAgICAoeCwgeSkgPSBwdAogICAgcmV0dXJuICh4LCB5LCAxLCAoeCp5KSVxKQoKZGVmIHB0X3VueGZvcm0gKHB0KToKICAgICh4LCB5LCB6LCBfKSA9IHB0CiAgICByZXR1cm4gKCh4Kmludih6KSklcSwgKHkqaW52KHopKSVxKQoKZGVmIHhwdF9tdWx0IChwdCwgbik6CiAgICBpZiBuPT0wOiByZXR1cm4gcHRfeGZvcm0oKDAsMSkpCiAgICBfID0geHB0X2RvdWJsZSh4cHRfbXVsdChwdCwgbj4+MSkpCiAgICByZXR1cm4geHB0X2FkZChfLCBwdCkgaWYgbiYxIGVsc2UgXwoKZGVmIHNjYWxhcm11bHQocHQsIGUpOgogICAgcmV0dXJuIHB0X3VueGZvcm0oeHB0X211bHQocHRfeGZvcm0ocHQpLCBlKSkKCmRlZiBlbmNvZGVpbnQoeSk6CiAgICBiaXRzID0gWyh5ID4+IGkpICYgMSBmb3IgaSBpbiByYW5nZShiKV0KICAgIGUgPSBbKHN1bShbYml0c1tpICogOCArIGpdIDw8IGogZm9yIGogaW4gcmFuZ2UoOCldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYi8vOCldCiAgICByZXR1cm4gYXNieXRlcyhlKQoKZGVmIGVuY29kZXBvaW50KFApOgogICAgeCA9IFBbMF0KICAgIHkgPSBQWzFdCiAgICBiaXRzID0gWyh5ID4+IGkpICYgMSBmb3IgaSBpbiByYW5nZShiIC0gMSldICsgW3ggJiAxXQogICAgZSA9IFsoc3VtKFtiaXRzW2kgKiA4ICsgal0gPDwgaiBmb3IgaiBpbiByYW5nZSg4KV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShiLy84KV0KICAgIHJldHVybiBhc2J5dGVzKGUpCiAgICAKZGVmIHB1YmxpY2tleShzayk6CiAgICBoID0gSChzaykKICAgIGEgPSAyKiooYi0yKSArIHN1bSgyKippICogYml0KGgsaSkgZm9yIGkgaW4gcmFuZ2UoMyxiLTIpKQogICAgQSA9IHNjYWxhcm11bHQoQixhKQogICAgcmV0dXJuIGVuY29kZXBvaW50KEEpCgpkZWYgSGludChtKToKICAgIGggPSBIKG0pCiAgICByZXR1cm4gc3VtKDIqKmkgKiBiaXQoaCxpKSBmb3IgaSBpbiByYW5nZSgyKmIpKQoKZGVmIHNpZ25hdHVyZShtLHNrLHBrKToKICAgIGggPSBIKHNrKQogICAgYSA9IDIqKihiLTIpICsgc3VtKDIqKmkgKiBiaXQoaCxpKSBmb3IgaSBpbiByYW5nZSgzLGItMikpCiAgICBpbnRlciA9IGpvaW5ieXRlcyhbaFtpXSBmb3IgaSBpbiByYW5nZShiLy84LGIvLzQpXSkKICAgIHIgPSBIaW50KGludGVyICsgbSkKICAgIFIgPSBzY2FsYXJtdWx0KEIscikKICAgIFMgPSAociArIEhpbnQoZW5jb2RlcG9pbnQoUikgKyBwayArIG0pICogYSkgJSBsCiAgICByZXR1cm4gZW5jb2RlcG9pbnQoUikgKyBlbmNvZGVpbnQoUykKCmRlZiBpc29uY3VydmUoUCk6CiAgICB4ID0gUFswXQogICAgeSA9IFBbMV0KICAgIHJldHVybiAoLXgqeCArIHkqeSAtIDEgLSBkKngqeCp5KnkpICUgcSA9PSAwCgpkZWYgZGVjb2RlaW50KHMpOgogICAgcmV0dXJuIHN1bSgyKippICogYml0KHMsaSkgZm9yIGkgaW4gcmFuZ2UoMCxiKSkKCmRlZiBkZWNvZGVwb2ludChzKToKICAgIHkgPSBzdW0oMioqaSAqIGJpdChzLGkpIGZvciBpIGluIHJhbmdlKDAsYi0xKSkKICAgIHggPSB4cmVjb3Zlcih5KQogICAgaWYgeCAmIDEgIT0gYml0KHMsYi0xKTogeCA9IHEteAogICAgUCA9IFt4LHldCiAgICBpZiBub3QgaXNvbmN1cnZlKFApOiByYWlzZSBFeGNlcHRpb24oImRlY29kaW5nIHBvaW50IHRoYXQgaXMgbm90IG9uIGN1cnZlIikKICAgIHJldHVybiBQCgpkZWYgY2hlY2t2YWxpZChzLCBtLCBwayk6CiAgICBpZiBsZW4ocykgIT0gYi8vNDogcmFpc2UgRXhjZXB0aW9uKCJzaWduYXR1cmUgbGVuZ3RoIGlzIHdyb25nIikKICAgIGlmIGxlbihwaykgIT0gYi8vODogcmFpc2UgRXhjZXB0aW9uKCJwdWJsaWMta2V5IGxlbmd0aCBpcyB3cm9uZyIpCiAgICBSID0gZGVjb2RlcG9pbnQoc1swOmIvLzhdKQogICAgQSA9IGRlY29kZXBvaW50KHBrKQogICAgUyA9IGRlY29kZWludChzW2IvLzg6Yi8vNF0pCiAgICBoID0gSGludChlbmNvZGVwb2ludChSKSArIHBrICsgbSkKICAgIHYxID0gc2NhbGFybXVsdChCLFMpCiMgIHYyID0gZWR3YXJkcyhSLHNjYWxhcm11bHQoQSxoKSkKICAgIHYyID0gcHRfdW54Zm9ybSh4cHRfYWRkKHB0X3hmb3JtKFIpLCBwdF94Zm9ybShzY2FsYXJtdWx0KEEsIGgpKSkpCiAgICByZXR1cm4gdjE9PXYyCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIyBDdXJ2ZTI1NTE5IHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBieSBNYXR0aGV3IERlbXBza3ksIGZyb206CiMgaHR0cDovL2NyLnlwLnRvL2hpZ2hzcGVlZC9uYWNsY3J5cHRvLTIwMDkwMzEwLnBkZgoKIyBQID0gMiAqKiAyNTUgLSAxOQpQID0gcQpBID0gNDg2NjYyCgojZGVmIGV4cG1vZChiLCBlLCBtKToKIyAgICBpZiBlID09IDA6IHJldHVybiAxCiMgICAgdCA9IGV4cG1vZChiLCBlIC8gMiwgbSkgKiogMiAlIG0KIyAgICBpZiBlICYgMTogdCA9ICh0ICogYikgJSBtCiMgICAgcmV0dXJuIHQKCiMgZGVmIGludih4KTogcmV0dXJuIGV4cG1vZCh4LCBQIC0gMiwgUCkKCmRlZiBhZGQobiwgbSwgZCk6CiAgICAoeG4sIHpuKSA9IG4KICAgICh4bSwgem0pID0gbSAKICAgICh4ZCwgemQpID0gZAogICAgeCA9IDQgKiAoeG0gKiB4biAtIHptICogem4pICoqIDIgKiB6ZAogICAgeiA9IDQgKiAoeG0gKiB6biAtIHptICogeG4pICoqIDIgKiB4ZAogICAgcmV0dXJuICh4ICUgUCwgeiAlIFApCgpkZWYgZG91YmxlKG4pOgogICAgKHhuLCB6bikgPSBuCiAgICB4ID0gKHhuICoqIDIgLSB6biAqKiAyKSAqKiAyCiAgICB6ID0gNCAqIHhuICogem4gKiAoeG4gKiogMiArIEEgKiB4biAqIHpuICsgem4gKiogMikKICAgIHJldHVybiAoeCAlIFAsIHogJSBQKQoKZGVmIGN1cnZlMjU1MTkobiwgYmFzZT05KToKICAgIG9uZSA9IChiYXNlLDEpCiAgICB0d28gPSBkb3VibGUob25lKQogICAgIyBmKG0pIGV2YWx1YXRlcyB0byBhIHR1cGxlCiAgICAjIGNvbnRhaW5pbmcgdGhlIG10aCBtdWx0aXBsZSBhbmQgdGhlCiAgICAjIChtKzEpdGggbXVsdGlwbGUgb2YgYmFzZS4KICAgIGRlZiBmKG0pOgogICAgICAgIGlmIG0gPT0gMTogcmV0dXJuIChvbmUsIHR3bykKICAgICAgICAocG0sIHBtMSkgPSBmKG0gLy8gMikKICAgICAgICBpZiAobSAmIDEpOgogICAgICAgICAgICByZXR1cm4gKGFkZChwbSwgcG0xLCBvbmUpLCBkb3VibGUocG0xKSkKICAgICAgICByZXR1cm4gKGRvdWJsZShwbSksIGFkZChwbSwgcG0xLCBvbmUpKQogICAgKCh4LHopLCBfKSA9IGYobikKICAgIHJldHVybiAoeCAqIGludih6KSkgJSBQCgppbXBvcnQgcmFuZG9tCgpkZWYgZ2Vua2V5KG49MCk6CiAgICBuID0gbiBvciByYW5kb20ucmFuZGludCgwLFApCiAgICBuICY9IH43CiAgICBuICY9IH4oMTI4IDw8IDggKiAzMSkKICAgIG4gfD0gNjQgPDwgOCAqIDMxCiAgICByZXR1cm4gbgoKI2RlZiBzdHIyaW50KHMpOgojICAgIHJldHVybiBpbnQoaGV4bGlmeShzKSwgMTYpCiMgICAgIyByZXR1cm4gc3VtKG9yZChzW2ldKSA8PCAoOCAqIGkpIGZvciBpIGluIHJhbmdlKDMyKSkKIwojZGVmIGludDJzdHIobik6CiMgICAgcmV0dXJuIHVuaGV4bGlmeSgiJXgiICUgbikKIyAgICAjIHJldHVybiAnJy5qb2luKFtjaHIoKG4gPj4gKDggKiBpKSkgJiAyNTUpIGZvciBpIGluIHJhbmdlKDMyKV0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpkZWYgZHNhX3Rlc3QoKToKICAgIGltcG9ydCBvcwogICAgbXNnID0gc3RyKHJhbmRvbS5yYW5kaW50KHEscStxKSkuZW5jb2RlKCd1dGYtOCcpCiAgICBzayA9IG9zLnVyYW5kb20oMzIpCiAgICBwayA9IHB1YmxpY2tleShzaykKICAgIHNpZyA9IHNpZ25hdHVyZShtc2csIHNrLCBwaykKICAgIHJldHVybiBjaGVja3ZhbGlkKHNpZywgbXNnLCBwaykKCmRlZiBkaF90ZXN0KCk6CiAgICBzazEgPSBnZW5rZXkoKQogICAgc2syID0gZ2Vua2V5KCkKICAgIHJldHVybiBjdXJ2ZTI1NTE5KHNrMSwgY3VydmUyNTUxOShzazIpKSA9PSBjdXJ2ZTI1NTE5KHNrMiwgY3VydmUyNTUxOShzazEpKQoKUEsDBBQAAAAAAAAAIQBMASU+nwYAAJ8GAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMvZWQyNTUxOXB5LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgb3MKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKZnJvbSAuIGltcG9ydCBkamJlYwoKX19hbGxfXyA9IFsnY3J5cHRvX3NpZ24nLCAnY3J5cHRvX3NpZ25fb3BlbicsICdjcnlwdG9fc2lnbl9rZXlwYWlyJywgJ0tleXBhaXInLAogICAgICAgICAgICdQVUJMSUNLRVlCWVRFUycsICdTRUNSRVRLRVlCWVRFUycsICdTSUdOQVRVUkVCWVRFUyddCgpQVUJMSUNLRVlCWVRFUz0zMgpTRUNSRVRLRVlCWVRFUz02NApTSUdOQVRVUkVCWVRFUz02NAoKS2V5cGFpciA9IG5hbWVkdHVwbGUoJ0tleXBhaXInLCAoJ3ZrJywgJ3NrJykpICMgdmVyaWZ5aW5nIGtleSwgc2VjcmV0IGtleQoKZGVmIGNyeXB0b19zaWduX2tleXBhaXIoc2VlZD1Ob25lKToKICAgICIiIlJldHVybiAodmVyaWZ5aW5nLCBzZWNyZXQpIGtleSBmcm9tIGEgZ2l2ZW4gc2VlZCwgb3Igb3MudXJhbmRvbSgzMikiIiIgICAgCiAgICBpZiBzZWVkIGlzIE5vbmU6CiAgICAgICAgc2VlZCA9IG9zLnVyYW5kb20oUFVCTElDS0VZQllURVMpCiAgICBlbHNlOgogICAgICAgIHdhcm5pbmdzLndhcm4oImVkMjU1MTlsbCBzaG91bGQgY2hvb3NlIHJhbmRvbSBzZWVkLiIsCiAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZykKICAgIGlmIGxlbihzZWVkKSAhPSAzMjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZWVkIG11c3QgYmUgMzIgcmFuZG9tIGJ5dGVzIG9yIE5vbmUuIikKICAgIHNrYnl0ZXMgPSBzZWVkCiAgICB2a2J5dGVzID0gZGpiZWMucHVibGlja2V5KHNrYnl0ZXMpCiAgICByZXR1cm4gS2V5cGFpcih2a2J5dGVzLCBza2J5dGVzK3ZrYnl0ZXMpCgoKZGVmIGNyeXB0b19zaWduKG1zZywgc2spOgogICAgIiIiUmV0dXJuIHNpZ25hdHVyZSttZXNzYWdlIGdpdmVuIG1lc3NhZ2UgYW5kIHNlY3JldCBrZXkuCiAgICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBmaXJzdCBTSUdOQVRVUkVCWVRFUyBieXRlcyBvZiB0aGUgcmV0dXJuIHZhbHVlLgogICAgQSBjb3B5IG9mIG1zZyBpcyBpbiB0aGUgcmVtYWluZGVyLiIiIgogICAgaWYgbGVuKHNrKSAhPSBTRUNSRVRLRVlCWVRFUzoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJCYWQgc2lnbmluZyBrZXkgbGVuZ3RoICVkIiAlIGxlbihzaykpCiAgICB2a2J5dGVzID0gc2tbUFVCTElDS0VZQllURVM6XQogICAgc2tieXRlcyA9IHNrWzpQVUJMSUNLRVlCWVRFU10KICAgIHNpZyA9IGRqYmVjLnNpZ25hdHVyZShtc2csIHNrYnl0ZXMsIHZrYnl0ZXMpCiAgICByZXR1cm4gc2lnICsgbXNnCgoKZGVmIGNyeXB0b19zaWduX29wZW4oc2lnbmVkLCB2ayk6CiAgICAiIiJSZXR1cm4gbWVzc2FnZSBnaXZlbiBzaWduYXR1cmUrbWVzc2FnZSBhbmQgdGhlIHZlcmlmeWluZyBrZXkuIiIiCiAgICBpZiBsZW4odmspICE9IFBVQkxJQ0tFWUJZVEVTOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkJhZCB2ZXJpZnlpbmcga2V5IGxlbmd0aCAlZCIgJSBsZW4odmspKQogICAgcmMgPSBkamJlYy5jaGVja3ZhbGlkKHNpZ25lZFs6U0lHTkFUVVJFQllURVNdLCBzaWduZWRbU0lHTkFUVVJFQllURVM6XSwgdmspCiAgICBpZiBub3QgcmM6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmMgIT0gVHJ1ZSIsIHJjKSAgICAKICAgIHJldHVybiBzaWduZWRbU0lHTkFUVVJFQllURVM6XQoKUEsDBBQAAAAAAAAAIQDb2+It9AwAAPQMAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMva2V5cy5weSIiIlN0b3JlIGFuZCByZXRyaWV2ZSB3aGVlbCBzaWduaW5nIC8gdmVyaWZ5aW5nIGtleXMuCgpHaXZlbiBhIHNjb3BlIChhIHBhY2thZ2UgbmFtZSwgKyBtZWFuaW5nICJhbGwgcGFja2FnZXMiLCBvciAtIG1lYW5pbmcgCiJubyBwYWNrYWdlcyIpLCByZXR1cm4gYSBsaXN0IG9mIHZlcmlmeWluZyBrZXlzIHRoYXQgYXJlIHRydXN0ZWQgZm9yIHRoYXQgCnNjb3BlLgoKR2l2ZW4gYSBwYWNrYWdlIG5hbWUsIHJldHVybiBhIGxpc3Qgb2YgKHNjb3BlLCBrZXkpIHN1Z2dlc3RlZCBrZXlzIHRvIHNpZ24KdGhhdCBwYWNrYWdlIChvbmx5IHRoZSB2ZXJpZnlpbmcga2V5czsgdGhlIHByaXZhdGUgc2lnbmluZyBrZXkgaXMgc3RvcmVkCmVsc2V3aGVyZSkuCgpLZXlzIGhlcmUgYXJlIHJlcHJlc2VudGVkIGFzIHVybHNhZmVfYjY0ZW5jb2RlZCBzdHJpbmdzIHdpdGggbm8gcGFkZGluZy4KClRlbnRhdGl2ZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlOgoKIyBsaXN0IHRydXN0cwp3aGVlbCB0cnVzdAojIHRydXN0IGEgcGFydGljdWxhciBrZXkgZm9yIGFsbAp3aGVlbCB0cnVzdCArIGtleQojIHRydXN0IGtleSBmb3IgYmVhZ2xldm90ZQp3aGVlbCB0cnVzdCBiZWFnbGV2b3RlIGtleQojIHN0b3AgdHJ1c3RpbmcgYSBrZXkgZm9yIGFsbAp3aGVlbCB1bnRydXN0ICsga2V5CgojIGdlbmVyYXRlIGEga2V5IHBhaXIKd2hlZWwga2V5Z2VuCgojIGltcG9ydCBhIHNpZ25pbmcga2V5IGZyb20gYSBmaWxlCndoZWVsIGltcG9ydCBrZXlmaWxlCgojIGV4cG9ydCBhIHNpZ25pbmcga2V5CndoZWVsIGV4cG9ydCBrZXkKIiIiCgppbXBvcnQganNvbgppbXBvcnQgb3MucGF0aApmcm9tIC4udXRpbCBpbXBvcnQgbmF0aXZlLCBsb2FkX2NvbmZpZ19wYXRocywgc2F2ZV9jb25maWdfcGF0aAoKY2xhc3MgV2hlZWxLZXlzKG9iamVjdCk6CiAgICBTQ0hFTUEgPSAxCiAgICBDT05GSUdfTkFNRSA9ICd3aGVlbC5qc29uJwogICAgCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5kYXRhID0geydzaWduZXJzJzpbXSwgJ3ZlcmlmaWVycyc6W119CiAgICAgICAgCiAgICBkZWYgbG9hZChzZWxmKToKICAgICAgICAjIFhYWCBKU09OIGlzIG5vdCBhIGdyZWF0IGRhdGFiYXNlCiAgICAgICAgZm9yIHBhdGggaW4gbG9hZF9jb25maWdfcGF0aHMoJ3doZWVsJyk6CiAgICAgICAgICAgIGNvbmYgPSBvcy5wYXRoLmpvaW4obmF0aXZlKHBhdGgpLCBzZWxmLkNPTkZJR19OQU1FKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjb25mKToKICAgICAgICAgICAgICAgIHdpdGggb3Blbihjb25mLCAncicpIGFzIGluZmlsZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBqc29uLmxvYWQoaW5maWxlKQogICAgICAgICAgICAgICAgICAgIGZvciB4IGluICgnc2lnbmVycycsICd2ZXJpZmllcnMnKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHggaW4gc2VsZi5kYXRhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhW3hdID0gW10KICAgICAgICAgICAgICAgICAgICBpZiAnc2NoZW1hJyBub3QgaW4gc2VsZi5kYXRhOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGFbJ3NjaGVtYSddID0gc2VsZi5TQ0hFTUEKICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuZGF0YVsnc2NoZW1hJ10gIT0gc2VsZi5TQ0hFTUE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHdoZWVsLmpzb24gdmVyc2lvbiB7MH0sIGV4cGVjdGVkIHsxfSIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YVsnc2NoZW1hJ10sIHNlbGYuU0NIRU1BKSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2F2ZShzZWxmKToKICAgICAgICAjIFRyeSBub3QgdG8gY2FsbCB0aGlzIGEgdmVyeSBsb25nIHRpbWUgYWZ0ZXIgbG9hZCgpIAogICAgICAgIHBhdGggPSBzYXZlX2NvbmZpZ19wYXRoKCd3aGVlbCcpCiAgICAgICAgY29uZiA9IG9zLnBhdGguam9pbihuYXRpdmUocGF0aCksIHNlbGYuQ09ORklHX05BTUUpCiAgICAgICAgd2l0aCBvcGVuKGNvbmYsICd3KycpIGFzIG91dDoKICAgICAgICAgICAganNvbi5kdW1wKHNlbGYuZGF0YSwgb3V0LCBpbmRlbnQ9MikKICAgICAgICByZXR1cm4gc2VsZgogICAgCiAgICBkZWYgdHJ1c3Qoc2VsZiwgc2NvcGUsIHZrKToKICAgICAgICAiIiJTdGFydCB0cnVzdGluZyBhIHBhcnRpY3VsYXIga2V5IGZvciBnaXZlbiBzY29wZS4iIiIKICAgICAgICBzZWxmLmRhdGFbJ3ZlcmlmaWVycyddLmFwcGVuZCh7J3Njb3BlJzpzY29wZSwgJ3ZrJzp2a30pCiAgICAgICAgcmV0dXJuIHNlbGYKICAgIAogICAgZGVmIHVudHJ1c3Qoc2VsZiwgc2NvcGUsIHZrKToKICAgICAgICAiIiJTdG9wIHRydXN0aW5nIGEgcGFydGljdWxhciBrZXkgZm9yIGdpdmVuIHNjb3BlLiIiIgogICAgICAgIHNlbGYuZGF0YVsndmVyaWZpZXJzJ10ucmVtb3ZlKHsnc2NvcGUnOnNjb3BlLCAndmsnOnZrfSkKICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIAogICAgZGVmIHRydXN0ZWQoc2VsZiwgc2NvcGU9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgWyhzY29wZSwgdHJ1c3RlZCBrZXkpLCAuLi5dIGZvciBnaXZlbiBzY29wZS4iIiIKICAgICAgICB0cnVzdCA9IFsoeFsnc2NvcGUnXSwgeFsndmsnXSkgZm9yIHggaW4gc2VsZi5kYXRhWyd2ZXJpZmllcnMnXSBpZiB4WydzY29wZSddIGluIChzY29wZSwgJysnKV0KICAgICAgICB0cnVzdC5zb3J0KGtleT1sYW1iZGEgeDogeFswXSkKICAgICAgICB0cnVzdC5yZXZlcnNlKCkKICAgICAgICByZXR1cm4gdHJ1c3QKICAgIAogICAgZGVmIHNpZ25lcnMoc2VsZiwgc2NvcGUpOgogICAgICAgICIiIlJldHVybiBsaXN0IG9mIHNpZ25pbmcga2V5KHMpLiIiIgogICAgICAgIHNpZ24gPSBbKHhbJ3Njb3BlJ10sIHhbJ3ZrJ10pIGZvciB4IGluIHNlbGYuZGF0YVsnc2lnbmVycyddIGlmIHhbJ3Njb3BlJ10gaW4gKHNjb3BlLCAnKycpXQogICAgICAgIHNpZ24uc29ydChrZXk9bGFtYmRhIHg6IHhbMF0pCiAgICAgICAgc2lnbi5yZXZlcnNlKCkKICAgICAgICByZXR1cm4gc2lnbgogICAgCiAgICBkZWYgYWRkX3NpZ25lcihzZWxmLCBzY29wZSwgdmspOgogICAgICAgICIiIlJlbWVtYmVyIHZlcmlmeWluZyBrZXkgdmsgYXMgYmVpbmcgdmFsaWQgZm9yIHNpZ25pbmcgaW4gc2NvcGUuIiIiCiAgICAgICAgc2VsZi5kYXRhWydzaWduZXJzJ10uYXBwZW5kKHsnc2NvcGUnOnNjb3BlLCAndmsnOnZrfSkKICAgIApQSwMEFAAAAAAAAAAhAP+eZXABAAAAAQAAADgAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9fX2luaXRfXy5weSNQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAEoXR9IXAAAAFwAAAFEAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvY29tcGxleGRpc3QvX19pbml0X18ucHlkZWYgbWFpbigpOgogICAgcmV0dXJuClBLAwQUAAAAAAAAACEAHAoXOFcDAABXAwAAQgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9zZXR1cC5weWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKCnRyeToKICAgIHVuaWNvZGUKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcwoKc2V0dXAobmFtZT0nY29tcGxleC1kaXN0JywKICAgICAgdmVyc2lvbj0nMC4xJywKICAgICAgZGVzY3JpcHRpb249dTgoJ0Fub3RoZXIgdGVzdGluZyBkaXN0cmlidXRpb24gXE57U05PV01BTn0nKSwKICAgICAgbG9uZ19kZXNjcmlwdGlvbj11OCgnQW5vdGhlciB0ZXN0aW5nIGRpc3RyaWJ1dGlvbiBcTntTTk9XTUFOfScpLAogICAgICBhdXRob3I9IklsbHVzdHJpb3VzIEF1dGhvciIsCiAgICAgIGF1dGhvcl9lbWFpbD0iaWxsdXN0cmlvdXNAZXhhbXBsZS5vcmciLAogICAgICB1cmw9Imh0dHA6Ly9leGFtcGxlLm9yZy9leGVtcGxhcnkiLAogICAgICBwYWNrYWdlcz1bJ2NvbXBsZXhkaXN0J10sCiAgICAgIHNldHVwX3JlcXVpcmVzPVsid2hlZWwiLCAic2V0dXB0b29scyJdLAogICAgICBpbnN0YWxsX3JlcXVpcmVzPVsicXV1eCIsICJzcGxvcnQiXSwKICAgICAgZXh0cmFzX3JlcXVpcmU9eydzaW1wbGUnOlsnc2ltcGxlLmRpc3QnXX0sCiAgICAgIHRlc3RzX3JlcXVpcmU9WyJmb28iLCAiYmFyPj0xMC4wLjAiXSwKICAgICAgZW50cnlfcG9pbnRzPXsKICAgICAgICAgICdjb25zb2xlX3NjcmlwdHMnOiBbCiAgICAgICAgICAgICAgJ2NvbXBsZXgtZGlzdD1jb21wbGV4ZGlzdDptYWluJywKICAgICAgICAgICAgICAnY29tcGxleC1kaXN0Mj1jb21wbGV4ZGlzdDptYWluJywKICAgICAgICAgIF0sCiAgICAgIH0sCiAgICAgICkKClBLAwQUAAAAAAAAACEAKEsYZZkGAACZBgAAOAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbmZ0ZXN0LnB5IiIiDQpweXRlc3QgbG9jYWwgY29uZmlndXJhdGlvbiBwbHVnLWluDQoiIiINCg0KaW1wb3J0IGdjDQppbXBvcnQgd2FybmluZ3MNCg0KaW1wb3J0IHB5dGVzdA0KDQpAcHl0ZXN0LnlpZWxkX2ZpeHR1cmUoc2NvcGU9J2Z1bmN0aW9uJywgYXV0b3VzZT1UcnVlKQ0KZGVmIGVycm9yX29uX1Jlc291cmNlV2FybmluZygpOg0KICAgICIiIlRoaXMgZml4dHVyZSBjYXB0dXJlcyBSZXNvdXJjZVdhcm5pbmcncyBhbmQgcmVwb3J0cyBhbiAiZXJyb3IiDQogICAgZGVzY3JpYmluZyB0aGUgZmlsZSBoYW5kbGVzIGxlZnQgb3Blbi4NCiAgICANCiAgICBUaGlzIGlzIHNob3duIHJlZ2FyZGxlc3Mgb2YgaG93IHN1Y2Nlc3NmdWwgdGhlIHRlc3Qgd2FzLCBpZiBhIHRlc3QgZmFpbHMNCiAgICBhbmQgbGVhdmVzIGZpbGVzIG9wZW4gdGhlbiB0aG9zZSBmaWxlcyB3aWxsIGJlIHJlcG9ydGVkLiAgSWRlYWxseSwgZXZlbg0KICAgIHRob3NlIGZpbGVzIHNob3VsZCBiZSBjbG9zZWQgcHJvcGVybHkgYWZ0ZXIgYSB0ZXN0IGZhaWx1cmUgb3IgZXhjZXB0aW9uLg0KDQogICAgU2luY2Ugb25seSBQeXRob24gMyBhbmQgUHlQeTMgaGF2ZSBSZXNvdXJjZVdhcm5pbmcncywgdGhpcyBjb250ZXh0IHdpbGwNCiAgICBoYXZlIG5vIGVmZmVjdCB3aGVuIHJ1bm5pbmcgdGVzdHMgb24gUHl0aG9uIDIgb3IgUHlQeS4NCg0KICAgIEJlY2F1c2Ugb2YgYXV0b3VzZT1UcnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBlbmFibGVkIGZvcg0KICAgIGFsbCB0ZXN0XyogZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlLg0KDQogICAgVGhpcyBjb2RlIGlzIHByaW1hcmlseSBiYXNlZCBvbiB0aGUgZXhhbXBsZXMgZm91bmQgaGVyZToNCiAgICBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNDcxNzAyNy9jb252ZXJ0LXB5dGhvbi0zLXJlc291cmNld2FybmluZ3MtaW50by1leGNlcHRpb24NCiAgICAiIiINCiAgICB0cnk6DQogICAgICAgIFJlc291cmNlV2FybmluZw0KICAgIGV4Y2VwdCBOYW1lRXJyb3I6DQogICAgICAgICMgUHl0aG9uIDIsIFB5UHkNCiAgICAgICAgeWllbGQNCiAgICAgICAgcmV0dXJuDQogICAgIyBQeXRob24gMywgUHlQeTMNCiAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyBjYXVnaHQ6DQogICAgICAgIHdhcm5pbmdzLnJlc2V0d2FybmluZ3MoKSAjIGNsZWFyIGFsbCBmaWx0ZXJzDQogICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJykgIyBpZ25vcmUgYWxsDQogICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignYWx3YXlzJywgUmVzb3VyY2VXYXJuaW5nKSAjIGFkZCBmaWx0ZXINCiAgICAgICAgeWllbGQgIyBydW4gdGVzdHMgaW4gdGhpcyBjb250ZXh0DQogICAgICAgIGdjLmNvbGxlY3QoKSAjIHJ1biBnYXJiYWdlIGNvbGxlY3Rpb24gKGZvciBweXB5MykNCiAgICAgICAgaWYgbm90IGNhdWdodDoNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICBweXRlc3QuZmFpbCgnVGhlIGZvbGxvd2luZyBmaWxlIGRlc2NyaXB0b3JzIHdlcmUgbm90IGNsb3NlZCBwcm9wZXJseTpcbicgKw0KICAgICAgICAgICAgICAgICAgICAnXG4nLmpvaW4oKHN0cih3YXJuaW5nLm1lc3NhZ2UpIGZvciB3YXJuaW5nIGluIGNhdWdodCkpLA0KICAgICAgICAgICAgICAgICAgICBweXRyYWNlPUZhbHNlKQ0KUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABHAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvZXh0ZW5zaW9uLmRpc3QvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAF+GzE/IAQAAyAEAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9leHRlbnNpb24uZGlzdC9zZXR1cC5weWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgoKdHJ5OgogICAgdW5pY29kZQogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JykKCnNldHVwKG5hbWU9J2V4dGVuc2lvbi5kaXN0JywKICAgICAgdmVyc2lvbj0nMC4xJywKICAgICAgZGVzY3JpcHRpb249dTgoJ0EgdGVzdGluZyBkaXN0cmlidXRpb24gXE57U05PV01BTn0nKSwKICAgICAgZXh0X21vZHVsZXM9WwogICAgICAgICAgRXh0ZW5zaW9uKG5hbWU9J2V4dGVuc2lvbicsIAogICAgICAgICAgc291cmNlcz1bJ2V4dGVuc2lvbi5jJ10sIAogICAgICAgICAgcHlfbGltaXRlZF9hcGk9VHJ1ZSkKICAgICAgICAgIF0sCiAgICAgICkKClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAARQAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAQgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9oZWFkZXIuaFBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAASAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9oZWFkZXJzZGlzdC5weVBLAwQUAAAAAAAAACEAmcQnLEQBAABEAQAAQgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9zZXR1cC5weWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKCnRyeToKICAgIHVuaWNvZGUKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykuZW5jb2RlKCd1dGYtOCcpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCd1dGYtOCcpCgpzZXR1cChuYW1lPSdoZWFkZXJzLmRpc3QnLAogICAgICB2ZXJzaW9uPScwLjEnLAogICAgICBkZXNjcmlwdGlvbj11OCgnQSBkaXN0cmlidXRpb24gd2l0aCBoZWFkZXJzJyksCiAgICAgIGhlYWRlcnM9WydoZWFkZXIuaCddCiAgICAgICkKClBLAwQUAAAAAAAAACEAaj7d19ssAADbLAAAPwAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3B5ZGlzdC1zY2hlbWEuanNvbnsKICAiaWQiOiAiaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI2LyIsCiAgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKICAidGl0bGUiOiAiTWV0YWRhdGEgZm9yIFB5dGhvbiBTb2Z0d2FyZSBQYWNrYWdlcyAyLjAiLAogICJ0eXBlIjogIm9iamVjdCIsCiAgInByb3BlcnRpZXMiOiB7CiAgICAibWV0YWRhdGFfdmVyc2lvbiI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIlZlcnNpb24gb2YgdGhlIGZpbGUgZm9ybWF0IiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXihcXGQrKFxcLlxcZCspKikkIgogICAgfSwKICAgICJnZW5lcmF0b3IiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJOYW1lIGFuZCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIHRoYXQgcHJvZHVjZWQgdGhpcyBmaWxlLiIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bMC05QS1aYS16XShbMC05QS1aYS16Xy4tXSpbMC05QS1aYS16XSkoIFxcKC4qXFwpKT8kIgogICAgfSwKICAgICJuYW1lIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG5hbWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4iLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Rpc3RyaWJ1dGlvbl9uYW1lIgogICAgfSwKICAgICJ2ZXJzaW9uIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRpc3RyaWJ1dGlvbidzIHB1YmxpYyB2ZXJzaW9uIGlkZW50aWZpZXIiLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeKFxcZCsoXFwuXFxkKykqKSgoYXxifGN8cmMpKFxcZCspKT8oXFwuKHBvc3QpKFxcZCspKT8oXFwuKGRldikoXFxkKykpPyQiCiAgICB9LAogICAgInNvdXJjZV9sYWJlbCI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgY29uc3RyYWluZWQgaWRlbnRpZnlpbmcgdGV4dCBzdHJpbmciLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeWzAtOWEtel8uLStdKyQiCiAgICB9LAogICAgInNvdXJjZV91cmwiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHN0cmluZyBjb250YWluaW5nIGEgZnVsbCBVUkwgd2hlcmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBkaXN0cmlidXRpb24gY2FuIGJlIGRvd25sb2FkZWQuIiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICB9LAogICAgInN1bW1hcnkiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIG9uZS1saW5lIHN1bW1hcnkgb2Ygd2hhdCB0aGUgZGlzdHJpYnV0aW9uIGRvZXMuIiwKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJleHRyYXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygb3B0aW9uYWwgc2V0cyBvZiBkZXBlbmRlbmNpZXMgdGhhdCBtYXkgYmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIGluIFwibWF5X3JlcXVpcmVcIiBhbmQgc2ltaWxhciBmaWVsZHMuIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4dHJhX25hbWUiCiAgICAgIH0KICAgIH0sCiAgICAibWV0YV9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBzdWJkaXN0cmlidXRpb25zIG1hZGUgYXZhaWxhYmxlIHRocm91Z2ggdGhpcyBtZXRhZGlzdHJpYnV0aW9uLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmNpZXMiCiAgICB9LAogICAgInJ1bl9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvdGhlciBkaXN0cmlidXRpb25zIG5lZWRlZCB0byBydW4gdGhpcyBkaXN0cmlidXRpb24uIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY2llcyIKICAgIH0sCiAgICAidGVzdF9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvdGhlciBkaXN0cmlidXRpb25zIG5lZWRlZCB3aGVuIHRoaXMgZGlzdHJpYnV0aW9uIGlzIHRlc3RlZC4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jaWVzIgogICAgfSwKICAgICJidWlsZF9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvdGhlciBkaXN0cmlidXRpb25zIG5lZWRlZCB3aGVuIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGJ1aWx0LiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmNpZXMiCiAgICB9LAogICAgImRldl9yZXF1aXJlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvdGhlciBkaXN0cmlidXRpb25zIG5lZWRlZCB3aGVuIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGRldmVsb3BlZC4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jaWVzIgogICAgfSwKICAgICJwcm92aWRlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgcmVxdWlyZW1lbnRzIHRoYXQgYXJlIHNhdGlzZmllZCBieSBpbnN0YWxsaW5nIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGVzZSBzdHJpbmdzIG11c3QgYmUgb2YgdGhlIGZvcm0gTmFtZSBvciBOYW1lIChWZXJzaW9uKSIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIml0ZW1zIjogewogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wcm92aWRlc19kZWNsYXJhdGlvbiIKICAgICAgfQogICAgfSwKICAgICJtb2R1bGVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG1vZHVsZXMgYW5kL29yIHBhY2thZ2VzIGF2YWlsYWJsZSBmb3IgaW1wb3J0IGFmdGVyIGluc3RhbGxpbmcgdGhpcyBkaXN0cmlidXRpb24uIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3F1YWxpZmllZF9uYW1lIgogICAgICB9CiAgICB9LAogICAgIm5hbWVzcGFjZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgbmFtZXNwYWNlIHBhY2thZ2VzIHRoaXMgZGlzdHJpYnV0aW9uIGNvbnRyaWJ1dGVzIHRvIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3F1YWxpZmllZF9uYW1lIgogICAgICB9CiAgICB9LAogICAgIm9ic29sZXRlZF9ieSI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBwcm9qZWN0IGlzIG5vIGxvbmdlciBiZWluZyBkZXZlbG9wZWQuIFRoZSBuYW1lZCBwcm9qZWN0IHByb3ZpZGVzIGEgc3Vic3RpdHV0ZSBvciByZXBsYWNlbWVudC4iLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3JlcXVpcmVtZW50IgogICAgfSwKICAgICJzdXBwb3J0c19lbnZpcm9ubWVudHMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygc3RyaW5ncyBzcGVjaWZ5aW5nIHRoZSBlbnZpcm9ubWVudHMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGV4cGxpY2l0bHkgc3VwcG9ydHMuIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Vudmlyb25tZW50X21hcmtlciIKICAgICAgfQogICAgfSwKICAgICJpbnN0YWxsX2hvb2tzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGluc3RhbGxfaG9va3MgZmllbGQgaXMgdXNlZCB0byBkZWZpbmUgdmFyaW91cyBvcGVyYXRpb25zIHRoYXQgbWF5IGJlIGludm9rZWQgb24gYSBkaXN0cmlidXRpb24gaW4gYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBtYW5uZXIuIiwKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgInBvc3RpbnN0YWxsIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhwb3J0X3NwZWNpZmllciIKICAgICAgICB9LAogICAgICAgICJwcmV1bmluc3RhbGwiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHBvcnRfc3BlY2lmaWVyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJleHRlbnNpb25zIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiRXh0ZW5zaW9ucyB0byB0aGUgbWV0YWRhdGEgbWF5IGJlIHByZXNlbnQgaW4gYSBtYXBwaW5nIHVuZGVyIHRoZSAnZXh0ZW5zaW9ucycga2V5LiIsCiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXh0ZW5zaW9ucyIKICAgIH0KICB9LAoKICAicmVxdWlyZWQiOiBbIm1ldGFkYXRhX3ZlcnNpb24iLCAibmFtZSIsICJ2ZXJzaW9uIiwgInN1bW1hcnkiXSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSwKCiAgImRlZmluaXRpb25zIjogewogICAgImNvbnRhY3QiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJuYW1lIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0sCiAgICAgICAgImVtYWlsIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0sCiAgICAgICAgInVybCI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICB9LAogICAgICAgICJyb2xlIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0KICAgICAgfSwKICAgICAgInJlcXVpcmVkIjogWyJuYW1lIl0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY3kiCiAgICAgIH0KICAgIH0sCiAgICAiZGVwZW5kZW5jeSI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgImV4dHJhIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXh0cmFfbmFtZSIKICAgICAgICB9LAogICAgICAgICJlbnZpcm9ubWVudCI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Vudmlyb25tZW50X21hcmtlciIKICAgICAgICB9LAogICAgICAgICJyZXF1aXJlcyI6IHsKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9yZXF1aXJlbWVudCIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJyZXF1aXJlZCI6IFsicmVxdWlyZXMiXSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAiZXh0ZW5zaW9ucyI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogewogICAgICAgICJeW0EtWmEtel1bMC05QS1aYS16X10qKFsuXVswLTlBLVphLXpfXSopKiQiOiB7fQogICAgICB9LAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAicHl0aG9uLmRldGFpbHMiIDogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgImRvY3VtZW50X25hbWVzIjogewogICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOYW1lcyBvZiBzdXBwb3J0aW5nIG1ldGFkYXRhIGRvY3VtZW50cyIsCiAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kb2N1bWVudF9uYW1lIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjaGFuZ2Vsb2ciOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZG9jdW1lbnRfbmFtZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGljZW5zZSI6IHsKICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kb2N1bWVudF9uYW1lIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImtleXdvcmRzIjogewogICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgYWRkaXRpb25hbCBrZXl3b3JkcyB0byBiZSB1c2VkIHRvIGFzc2lzdCBzZWFyY2hpbmcgZm9yIHRoZSBkaXN0cmlidXRpb24gaW4gYSBsYXJnZXIgY2F0YWxvZy4iLAogICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibGljZW5zZSI6IHsKICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbGljZW5zZSBjb3ZlcmluZyB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiY2xhc3NpZmllcnMiOiB7CiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBzdHJpbmdzLCB3aXRoIGVhY2ggZ2l2aW5nIGEgc2luZ2xlIGNsYXNzaWZpY2F0aW9uIHZhbHVlIGZvciB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJweXRob24ucHJvamVjdCIgOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGNyZWF0aW9uIGFuZCBtYWludGVuYW5jZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Byb2plY3Rfb3JfaW50ZWdyYXRvciIKICAgICAgICB9LAogICAgICAgICJweXRob24uaW50ZWdyYXRvciIgOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGRvd25zdHJlYW0gcmVkaXN0cmlidXRvciBvZiB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Byb2plY3Rfb3JfaW50ZWdyYXRvciIKICAgICAgICB9LAogICAgICAgICJweXRob24uY29tbWFuZHMiIDogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbW1hbmQgbGluZSBpbnRlcmZhY2VzIHByb3ZpZGVkIGJ5IHRoaXMgZGlzdHJpYnV0aW9uIiwKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbW1hbmRzIgogICAgICAgIH0sCiAgICAgICAgInB5dGhvbi5leHBvcnRzIiA6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPdGhlciBleHBvcnRlZCBpbnRlcmZhY2VzIHByb3ZpZGVkIGJ5IHRoaXMgZGlzdHJpYnV0aW9uIiwKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4cG9ydHMiCiAgICAgICAgfQogICAgICB9LAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgfSwKICAgICJjb21tYW5kcyI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgIndyYXBfY29uc29sZSI6IHsKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbW1hbmRfbWFwIgogICAgICAgIH0sCiAgICAgICAgIndyYXBfZ3VpIjogewogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29tbWFuZF9tYXAiCiAgICAgICAgfSwKICAgICAgICAicHJlYnVpbHQiOiB7CiAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcmVsYXRpdmVfcGF0aCIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgImV4cG9ydHMiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKICAgICAgICAiXltBLVphLXpdWzAtOUEtWmEtel9dKihbLl1bMC05QS1aYS16X10qKSokIjogewogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgIi4iOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4cG9ydF9zcGVjaWZpZXIiCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgICAgIH0KICAgICAgfSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAiY29tbWFuZF9tYXAiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKICAgICAgICAiXlswLTlBLVphLXpdKFswLTlBLVphLXpfLi1dKlswLTlBLVphLXpdKT8kIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhwb3J0X3NwZWNpZmllciIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgInByb2plY3Rfb3JfaW50ZWdyYXRvciIgOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAiY29udGFjdHMiOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIGNvbnRyaWJ1dG9yIGVudHJpZXMgZ2l2aW5nIHRoZSByZWNvbW1lbmRlZCBjb250YWN0IHBvaW50cyBmb3IgZ2V0dGluZyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9qZWN0LiIsCiAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29udGFjdCIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJjb250cmlidXRvcnMiOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIGNvbnRyaWJ1dG9yIGVudHJpZXMgZm9yIG90aGVyIGNvbnRyaWJ1dG9ycyBub3QgYWxyZWFkeSBsaXN0ZWQgYXMgY3VycmVudCBwcm9qZWN0IHBvaW50cyBvZiBjb250YWN0LiIsCiAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29udGFjdCIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwcm9qZWN0X3VybHMiOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBtYXBwaW5nIG9mIGFyYml0cmFyeSB0ZXh0IGxhYmVscyB0byBhZGRpdGlvbmFsIFVSTHMgcmVsZXZhbnQgdG8gdGhlIHByb2plY3QuIiwKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiZGlzdHJpYnV0aW9uX25hbWUiOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bMC05QS1aYS16XShbMC05QS1aYS16Xy4tXSpbMC05QS1aYS16XSk/JCIKICAgIH0sCiAgICAicmVxdWlyZW1lbnQiOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAicHJvdmlkZXNfZGVjbGFyYXRpb24iOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAiZW52aXJvbm1lbnRfbWFya2VyIjogewogICAgICAidHlwZSI6ICJzdHJpbmciCiAgICB9LAogICAgImRvY3VtZW50X25hbWUiOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAiZXh0cmFfbmFtZSIgOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bMC05QS1aYS16XShbMC05QS1aYS16Xy4tXSpbMC05QS1aYS16XSk/JCIKICAgIH0sCiAgICAicmVsYXRpdmVfcGF0aCIgOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAiZXhwb3J0X3NwZWNpZmllciI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXihbQS1aYS16X11bQS1aYS16XzAtOV0qKFsuXVtBLVphLXpfXVtBLVphLXpfMC05XSopKikoOltBLVphLXpfXVtBLVphLXpfMC05XSooWy5dW0EtWmEtel9dW0EtWmEtel8wLTldKikqKT8oXFxbWzAtOUEtWmEtel0oWzAtOUEtWmEtel8uLV0qWzAtOUEtWmEtel0pP1xcXSk/JCIKICAgIH0sCiAgICAicXVhbGlmaWVkX25hbWUiIDogewogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeW0EtWmEtel9dW0EtWmEtel8wLTldKihbLl1bQS1aYS16X11bQS1aYS16XzAtOV0qKSokIgogICAgfSwKICAgICJwcmVmaXhlZF9uYW1lIiA6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXltBLVphLXpfXVtBLVphLXpfMC05XSooWy5dW0EtWmEtel8wLTldKikqJCIKICAgIH0KICB9Cn0KUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3QvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhANNNBKN/AQAAfwEAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9zZXR1cC5weWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKCnRyeToKICAgIHVuaWNvZGUKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykuZW5jb2RlKCd1dGYtOCcpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCd1dGYtOCcpCgpzZXR1cChuYW1lPSdzaW1wbGUuZGlzdCcsCiAgICAgIHZlcnNpb249JzAuMScsCiAgICAgIGRlc2NyaXB0aW9uPXU4KCdBIHRlc3RpbmcgZGlzdHJpYnV0aW9uIFxOe1NOT1dNQU59JyksCiAgICAgIHBhY2thZ2VzPVsnc2ltcGxlZGlzdCddLAogICAgICBleHRyYXNfcmVxdWlyZT17J3ZvdGluZyc6IFsnYmVhZ2xldm90ZSddfSwKICAgICAgKQoKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABPAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2ltcGxlZGlzdC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAduBM+moUAABqFAAATAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3QtMS4wLXB5Mi5weTMtbm9uZS13aW4zMi53aGxQSwMEFAAAAAgABrFUQLnWS+ulDAAAABoAAAkAAABoZWxsby5weWTtWA1QXNUVvrvshiVZwqqs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dXRpbAppbXBvcnQgd2hlZWwudG9vbAoKZnJvbSB3aGVlbCBpbXBvcnQgZWdnMndoZWVsCmZyb20gd2hlZWwuaW5zdGFsbCBpbXBvcnQgV2hlZWxGaWxlCmZyb20gemlwZmlsZSBpbXBvcnQgWmlwRmlsZQpmcm9tIHNodXRpbCBpbXBvcnQgcm10cmVlCgp0ZXN0X2Rpc3RyaWJ1dGlvbnMgPSAoImNvbXBsZXgtZGlzdCIsICJzaW1wbGUuZGlzdCIsICJoZWFkZXJzLmRpc3QiKQoKZGVmIHRlYXJkb3duX21vZHVsZSgpOgogICAgIiIiRGVsZXRlIGVnZ3Mvd2hlZWxzIGNyZWF0ZWQgYnkgdGVzdHMuIiIiCiAgICBiYXNlID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsICcnKQogICAgZm9yIGRpc3QgaW4gdGVzdF9kaXN0cmlidXRpb25zOgogICAgICAgIGZvciBzdWJkaXIgaW4gKCdidWlsZCcsICdkaXN0Jyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJtdHJlZShvcy5wYXRoLmpvaW4oYmFzZSwgZGlzdCwgc3ViZGlyKSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgpkZWYgc2V0dXBfbW9kdWxlKCk6CiAgICBidWlsZF93aGVlbCgpCiAgICBidWlsZF9lZ2coKQoKZGVmIGJ1aWxkX3doZWVsKCk6CiAgICAiIiJCdWlsZCB3aGVlbHMgZnJvbSB0ZXN0IGRpc3RyaWJ1dGlvbnMuIiIiCiAgICBmb3IgZGlzdCBpbiB0ZXN0X2Rpc3RyaWJ1dGlvbnM6CiAgICAgICAgcHdkID0gb3MucGF0aC5hYnNwYXRoKG9zLmN1cmRpcikKICAgICAgICBkaXN0ZGlyID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsIGRpc3QpCiAgICAgICAgb3MuY2hkaXIoZGlzdGRpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN5cy5hcmd2ID0gWycnLCAnYmRpc3Rfd2hlZWwnXQogICAgICAgICAgICBleGVjKGNvbXBpbGUob3Blbignc2V0dXAucHknKS5yZWFkKCksICdzZXR1cC5weScsICdleGVjJykpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MuY2hkaXIocHdkKQoKZGVmIGJ1aWxkX2VnZygpOgogICAgIiIiQnVpbGQgZWdncyBmcm9tIHRlc3QgZGlzdHJpYnV0aW9ucy4iIiIKICAgIGZvciBkaXN0IGluIHRlc3RfZGlzdHJpYnV0aW9uczoKICAgICAgICBwd2QgPSBvcy5wYXRoLmFic3BhdGgob3MuY3VyZGlyKQogICAgICAgIGRpc3RkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgZGlzdCkKICAgICAgICBvcy5jaGRpcihkaXN0ZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgc3lzLmFyZ3YgPSBbJycsICdiZGlzdF9lZ2cnXQogICAgICAgICAgICBleGVjKGNvbXBpbGUob3Blbignc2V0dXAucHknKS5yZWFkKCksICdzZXR1cC5weScsICdleGVjJykpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MuY2hkaXIocHdkKQoKZGVmIHRlc3RfZmluZGFibGUoKToKICAgICIiIk1ha2Ugc3VyZSBwa2dfcmVzb3VyY2VzIGNhbiBmaW5kIHVzLiIiIgogICAgYXNzZXJ0IHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYnlfa2V5Wyd3aGVlbCddLnZlcnNpb24KCmRlZiB0ZXN0X2VnZ19yZSgpOgogICAgIiIiTWFrZSBzdXJlIGVnZ19pbmZvX3JlIG1hdGNoZXMuIiIiCiAgICBlZ2dfbmFtZXNfcGF0aCA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsJywgJ2VnZ25hbWVzLnR4dCcpCiAgICB3aXRoIG9wZW4oZWdnX25hbWVzX3BhdGgpIGFzIGVnZ19uYW1lczoKICAgICAgICBmb3IgbGluZSBpbiBlZ2dfbmFtZXM6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBhc3NlcnQgZWdnMndoZWVsLmVnZ19pbmZvX3JlLm1hdGNoKGxpbmUpLCBsaW5lCgpkZWYgdGVzdF9jb21wYXRpYmlsaXR5X3RhZ3MoKToKICAgICIiIlRlc3QgY29tcGF0aWJpbHR5IHRhZ3MgYXJlIHdvcmtpbmcuIiIiCiAgICB3ZiA9IFdoZWVsRmlsZSgicGFja2FnZS0xLjAuMC1jcDMyLmNwMzMtbm9hYmktbm9hcmNoLndobCIpCiAgICBhc3NlcnQgKGxpc3Qod2YuY29tcGF0aWJpbGl0eV90YWdzKSA9PQogICAgICAgICAgICAgICAgIFsoJ2NwMzInLCAnbm9hYmknLCAnbm9hcmNoJyksICgnY3AzMycsICdub2FiaScsICdub2FyY2gnKV0pCiAgICBhc3NlcnQgKHdmLmFyaXR5ID09IDIpCgogICAgd2YyID0gV2hlZWxGaWxlKCJwYWNrYWdlLTEuMC4wLTFzdC1jcDMzLW5vYWJpLW5vYXJjaC53aGwiKQogICAgd2YyX2luZm8gPSB3ZjIucGFyc2VkX2ZpbGVuYW1lLmdyb3VwZGljdCgpCiAgICBhc3NlcnQgd2YyX2luZm9bJ2J1aWxkJ10gPT0gJzFzdCcsIHdmMl9pbmZvCgpkZWYgdGVzdF9jb252ZXJ0X2VnZygpOgogICAgYmFzZSA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLCAnJykKICAgIGZvciBkaXN0IGluIHRlc3RfZGlzdHJpYnV0aW9uczoKICAgICAgICBkaXN0ZGlyID0gb3MucGF0aC5qb2luKGJhc2UsIGRpc3QsICdkaXN0JykKICAgICAgICBlZ2dzID0gW2UgZm9yIGUgaW4gb3MubGlzdGRpcihkaXN0ZGlyKSBpZiBlLmVuZHN3aXRoKCcuZWdnJyldCiAgICAgICAgd2hlZWwudG9vbC5jb252ZXJ0KGVnZ3MsIGRpc3RkaXIsIHZlcmJvc2U9RmFsc2UpCgpkZWYgdGVzdF91bnBhY2soKToKICAgICIiIgogICAgTWFrZSBzdXJlICd3aGVlbCB1bnBhY2snIHdvcmtzLgogICAgVGhpcyBhbHNvIHZlcmlmaWVzIHRoZSBpbnRlZ3JpdHkgb2Ygb3VyIHRlc3Rpbmcgd2hlZWwgZmlsZXMuCiAgICAiIiIKICAgIGZvciBkaXN0IGluIHRlc3RfZGlzdHJpYnV0aW9uczoKICAgICAgICBkaXN0ZGlyID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRpc3QsICdkaXN0JykpCiAgICAgICAgZm9yIHdoZWVsZmlsZSBpbiAodyBmb3IgdyBpbiBvcy5saXN0ZGlyKGRpc3RkaXIpIGlmIHcuZW5kc3dpdGgoJy53aGwnKSk6CiAgICAgICAgICAgIHdoZWVsLnRvb2wudW5wYWNrKG9zLnBhdGguam9pbihkaXN0ZGlyLCB3aGVlbGZpbGUpLCBkaXN0ZGlyKQoKZGVmIHRlc3Rfbm9fc2NyaXB0cygpOgogICAgIiIiTWFrZSBzdXJlIGVudHJ5IHBvaW50IHNjcmlwdHMgYXJlIG5vdCBnZW5lcmF0ZWQuIiIiCiAgICBkaXN0ID0gImNvbXBsZXgtZGlzdCIKICAgIGJhc2VkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgZGlzdCkKICAgIGZvciAoZGlybmFtZSwgc3ViZGlycywgZmlsZW5hbWVzKSBpbiBvcy53YWxrKGJhc2VkaXIpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgICAgICB3aGwgPSBaaXBGaWxlKG9zLnBhdGguam9pbihkaXJuYW1lLCBmaWxlbmFtZSkpCiAgICAgICAgICAgICAgICBmb3IgZW50cnkgaW4gd2hsLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5vdCAnLmRhdGEvc2NyaXB0cy8nIGluIGVudHJ5LmZpbGVuYW1lCgpkZWYgdGVzdF9weWRpc3QoKToKICAgICIiIk1ha2Ugc3VyZSBweWRpc3QuanNvbiBleGlzdHMgYW5kIHZhbGlkYXRlcyBhZ2FpbnN0IG91ciBzY2hlbWEuIiIiCiAgICAjIFhYWCB0aGlzIHRlc3QgbWF5IG5lZWQgbWFudWFsIGNsZWFudXAgb2Ygb2xkZXIgd2hlZWxzCgogICAgaW1wb3J0IGpzb25zY2hlbWEKCiAgICBkZWYgb3Blbl9qc29uKGZpbGVuYW1lKToKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGpzb25fZmlsZToKICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoanNvbl9maWxlLnJlYWQoKS5kZWNvZGUoJ3V0Zi04JykpCgogICAgcHltZXRhX3NjaGVtYSA9IG9wZW5fanNvbihyZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweWRpc3Qtc2NoZW1hLmpzb24nKSkKICAgIHZhbGlkID0gMAogICAgZm9yIGRpc3QgaW4gKCJzaW1wbGUuZGlzdCIsICJjb21wbGV4LWRpc3QiKToKICAgICAgICBiYXNlZGlyID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsIGRpc3QpCiAgICAgICAgZm9yIChkaXJuYW1lLCBzdWJkaXJzLCBmaWxlbmFtZXMpIGluIG9zLndhbGsoYmFzZWRpcik6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICAgICAgICAgIHdobCA9IFppcEZpbGUob3MucGF0aC5qb2luKGRpcm5hbWUsIGZpbGVuYW1lKSkKICAgICAgICAgICAgICAgICAgICBmb3IgZW50cnkgaW4gd2hsLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudHJ5LmZpbGVuYW1lLmVuZHN3aXRoKCcvbWV0YWRhdGEuanNvbicpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHltZXRhID0ganNvbi5sb2Fkcyh3aGwucmVhZChlbnRyeSkuZGVjb2RlKCd1dGYtOCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbnNjaGVtYS52YWxpZGF0ZShweW1ldGEsIHB5bWV0YV9zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCArPSAxCiAgICBhc3NlcnQgdmFsaWQgPiAwLCAiTm8gbWV0YWRhdGEuanNvbiBmb3VuZCIKCmRlZiB0ZXN0X3V0aWwoKToKICAgICIiIlRlc3QgZnVuY3Rpb25zIGluIHV0aWwucHkuIiIiCiAgICBmb3IgaSBpbiByYW5nZSgxMCk6CiAgICAgICAgYmVmb3JlID0gYicqJyAqIGkKICAgICAgICBlbmNvZGVkID0gd2hlZWwudXRpbC51cmxzYWZlX2I2NGVuY29kZShiZWZvcmUpCiAgICAgICAgYXNzZXJ0IG5vdCBlbmNvZGVkLmVuZHN3aXRoKGInPScpCiAgICAgICAgYWZ0ZXIgPSB3aGVlbC51dGlsLnVybHNhZmVfYjY0ZGVjb2RlKGVuY29kZWQpCiAgICAgICAgYXNzZXJ0IGJlZm9yZSA9PSBhZnRlcgoKCmRlZiB0ZXN0X3BpY2tfYmVzdCgpOgogICAgIiIiVGVzdCB0aGUgd2hlZWwgcmFua2luZyBhbGdvcml0aG0uIiIiCiAgICBkZWYgZ2V0X3RhZ3MocmVzKToKICAgICAgICBpbmZvID0gcmVzWy0xXS5wYXJzZWRfZmlsZW5hbWUuZ3JvdXBkaWN0KCkKICAgICAgICByZXR1cm4gaW5mb1sncHl2ZXInXSwgaW5mb1snYWJpJ10sIGluZm9bJ3BsYXQnXQoKICAgIGNhbmRfdGFncyA9IFsoJ3B5MjcnLCAnbm9hYmknLCAnbm9hcmNoJyksICgncHkyNicsICdub2FiaScsICdub2FyY2gnKSwKICAgICAgICAgICAgICAgICAoJ2NwMjcnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLAogICAgICAgICAgICAgICAgICgnY3AyNicsICdub2FiaScsICdsaW51eF9pNjg2JyksCiAgICAgICAgICAgICAgICAgKCdjcDI3JywgJ25vYWJpJywgJ2xpbnV4X3g4Nl82NCcpLAogICAgICAgICAgICAgICAgICgnY3AyNicsICdub2FiaScsICdsaW51eF94ODZfNjQnKV0KICAgIGNhbmRfd2hlZWxzID0gW1doZWVsRmlsZSgndGVzdHBrZy0xLjAtJXMtJXMtJXMud2hsJyAlIHQpCiAgICAgICAgICAgICAgICAgICBmb3IgdCBpbiBjYW5kX3RhZ3NdCgogICAgc3VwcG9ydGVkID0gWygnY3AyNycsICdub2FiaScsICdsaW51eF9pNjg2JyksICgncHkyNycsICdub2FiaScsICdub2FyY2gnKV0KICAgIHN1cHBvcnRlZDIgPSBbKCdjcDI3JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwgKCdweTI3JywgJ25vYWJpJywgJ25vYXJjaCcpLAogICAgICAgICAgICAgICAgICAoJ2NwMjYnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLCAoJ3B5MjYnLCAnbm9hYmknLCAnbm9hcmNoJyldCiAgICBzdXBwb3J0ZWQzID0gWygnY3AyNicsICdub2FiaScsICdsaW51eF9pNjg2JyksICgncHkyNicsICdub2FiaScsICdub2FyY2gnKSwKICAgICAgICAgICAgICAgICAgKCdjcDI3JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwgKCdweTI3JywgJ25vYWJpJywgJ25vYXJjaCcpXQoKICAgIGZvciBzdXBwIGluIChzdXBwb3J0ZWQsIHN1cHBvcnRlZDIsIHN1cHBvcnRlZDMpOgogICAgICAgIGNvbnRleHQgPSBsYW1iZGE6IGxpc3Qoc3VwcCkKICAgICAgICBmb3Igd2hlZWwgaW4gY2FuZF93aGVlbHM6CiAgICAgICAgICAgIHdoZWVsLmNvbnRleHQgPSBjb250ZXh0CiAgICAgICAgYmVzdCA9IG1heChjYW5kX3doZWVscykKICAgICAgICBhc3NlcnQgbGlzdChiZXN0LnRhZ3MpWzBdID09IHN1cHBbMF0KCiAgICAgICAgIyBhc3NlcnRfZXF1YWwoCiAgICAgICAgIyAgICAgbGlzdChtYXAoZ2V0X3RhZ3MsIHBpY2tfYmVzdChjYW5kX3doZWVscywgc3VwcCwgdG9wPUZhbHNlKSkpLCBzdXBwKQpQSwMEFAAAAAAAAAAhAG0Esr5KBwAASgcAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2luc3RhbGwucHkjIFRlc3Qgd2hlZWwuDQojIFRoZSBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIGNvbnRlbnRzOg0KIyAgIGhlbGxvLnB5ZA0KIyAgIGhlbGxvL2hlbGxvLnB5DQojICAgaGVsbG8vX19pbml0X18ucHkNCiMgICB0ZXN0LTEuMC5kYXRhL2RhdGEvaGVsbG8uZGF0DQojICAgdGVzdC0xLjAuZGF0YS9oZWFkZXJzL2hlbGxvLmRhdA0KIyAgIHRlc3QtMS4wLmRhdGEvc2NyaXB0cy9oZWxsby5zaA0KIyAgIHRlc3QtMS4wLmRpc3QtaW5mby9XSEVFTA0KIyAgIHRlc3QtMS4wLmRpc3QtaW5mby9NRVRBREFUQQ0KIyAgIHRlc3QtMS4wLmRpc3QtaW5mby9SRUNPUkQNCiMgVGhlIHJvb3QgaXMgUExBVExJQg0KIyBTbywgc29tZSBpbiBQTEFUTElCLCBhbmQgb25lIGluIGVhY2ggb2YgREFUQSwgSEVBREVSUyBhbmQgU0NSSVBUUy4NCg0KaW1wb3J0IHdoZWVsLnRvb2wNCmltcG9ydCB3aGVlbC5wZXA0MjV0YWdzDQpmcm9tIHdoZWVsLmluc3RhbGwgaW1wb3J0IFdoZWVsRmlsZQ0KZnJvbSB0ZW1wZmlsZSBpbXBvcnQgbWtkdGVtcA0KaW1wb3J0IHNodXRpbA0KaW1wb3J0IG9zDQoNClRISVNESVIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pDQpURVNUV0hFRUwgPSBvcy5wYXRoLmpvaW4oVEhJU0RJUiwgJ3Rlc3QtMS4wLXB5Mi5weTMtbm9uZS13aW4zMi53aGwnKQ0KDQpkZWYgY2hlY2soKnBhdGgpOg0KICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oKnBhdGgpKQ0KDQpkZWYgdGVzdF9pbnN0YWxsKCk6DQogICAgdGVtcGRpciA9IG1rZHRlbXAoKQ0KICAgIGRlZiBnZXRfc3VwcG9ydGVkKCk6DQogICAgICAgIHJldHVybiBsaXN0KHdoZWVsLnBlcDQyNXRhZ3MuZ2V0X3N1cHBvcnRlZCgpKSArIFsoJ3B5MycsICdub25lJywgJ3dpbjMyJyldDQogICAgd2hsID0gV2hlZWxGaWxlKFRFU1RXSEVFTCwgY29udGV4dD1nZXRfc3VwcG9ydGVkKQ0KICAgIGFzc2VydCB3aGwuc3VwcG9ydHNfY3VycmVudF9weXRob24oZ2V0X3N1cHBvcnRlZCkNCiAgICB0cnk6DQogICAgICAgIGxvY3MgPSB7fQ0KICAgICAgICBmb3Iga2V5IGluICgncHVyZWxpYicsICdwbGF0bGliJywgJ3NjcmlwdHMnLCAnaGVhZGVycycsICdkYXRhJyk6DQogICAgICAgICAgICBsb2NzW2tleV0gPSBvcy5wYXRoLmpvaW4odGVtcGRpciwga2V5KQ0KICAgICAgICAgICAgb3MubWtkaXIobG9jc1trZXldKQ0KICAgICAgICB3aGwuaW5zdGFsbChvdmVycmlkZXM9bG9jcykNCiAgICAgICAgYXNzZXJ0IGxlbihvcy5saXN0ZGlyKGxvY3NbJ3B1cmVsaWInXSkpID09IDANCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3BsYXRsaWInXSwgJ2hlbGxvLnB5ZCcpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydwbGF0bGliJ10sICdoZWxsbycsICdoZWxsby5weScpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydwbGF0bGliJ10sICdoZWxsbycsICdfX2luaXRfXy5weScpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydkYXRhJ10sICdoZWxsby5kYXQnKQ0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1snaGVhZGVycyddLCAnaGVsbG8uZGF0JykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3NjcmlwdHMnXSwgJ2hlbGxvLnNoJykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3BsYXRsaWInXSwgJ3Rlc3QtMS4wLmRpc3QtaW5mbycsICdSRUNPUkQnKQ0KICAgIGZpbmFsbHk6DQogICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikNCg0KZGVmIHRlc3RfaW5zdGFsbF90b29sKCk6DQogICAgIiIiU2xpZ2h0bHkgaW1wcm92ZSBjb3ZlcmFnZSBvZiB3aGVlbC5pbnN0YWxsIiIiDQogICAgd2hlZWwudG9vbC5pbnN0YWxsKFtURVNUV0hFRUxdLCBmb3JjZT1UcnVlLCBkcnlfcnVuPVRydWUpDQoNCiAgICBQSwMEFAAAAAAAAAAhAPdhH5MPCgAADwoAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2tleXMucHlpbXBvcnQgdGVtcGZpbGUKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBqc29uCgpmcm9tIHdoZWVsLnNpZ25hdHVyZXMgaW1wb3J0IGtleXMKCndoZWVsX2pzb24gPSAiIiIKewogICJ2ZXJpZmllcnMiOiBbCiAgICB7CiAgICAgICJzY29wZSI6ICIrIiwgCiAgICAgICJ2ayI6ICJicC1iaksyZkZndEEtOERoS0tBQVBtOS1lQVpjWF91MDNvQnYyUmxLT0JjIgogICAgfSwgCiAgICB7CiAgICAgICJzY29wZSI6ICIrIiwgCiAgICAgICJ2ayI6ICJLQUhaQmZ5cUZXM09jRkRiTFNHNG5QQ2pYeFVQeTcycGhQOUk0Um45TUFvIgogICAgfSwKICAgIHsKICAgICAgInNjb3BlIjogIisiLCAKICAgICAgInZrIjogInRtQVlDclNmajhndEoxMHYzVmt2VzdqT25kS21RSVlFMTJoZ25GdTNjdmsiCiAgICB9IAogIF0sIAogICJzaWduZXJzIjogWwogICAgewogICAgICAic2NvcGUiOiAiKyIsIAogICAgICAidmsiOiAidG1BWUNyU2ZqOGd0SjEwdjNWa3ZXN2pPbmRLbVFJWUUxMmhnbkZ1M2N2ayIKICAgIH0sIAogICAgewogICAgICAic2NvcGUiOiAiKyIsIAogICAgICAidmsiOiAiS0FIWkJmeXFGVzNPY0ZEYkxTRzRuUENqWHhVUHk3MnBoUDlJNFJuOU1BbyIKICAgIH0KICBdLCAKICAic2NoZW1hIjogMQp9CiIiIgoKY2xhc3MgVGVzdFdoZWVsS2V5cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb25maWcgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoc3VmZml4PScuanNvbicpCiAgICAgICAgc2VsZi5jb25maWcuY2xvc2UoKQogICAgICAgIAogICAgICAgIHNlbGYuY29uZmlnX3BhdGgsIHNlbGYuY29uZmlnX2ZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLmNvbmZpZy5uYW1lKSAKICAgICAgICBkZWYgbG9hZCgqYXJncyk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5jb25maWdfcGF0aF0KICAgICAgICBkZWYgc2F2ZSgqYXJncyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbmZpZ19wYXRoCiAgICAgICAga2V5cy5sb2FkX2NvbmZpZ19wYXRocyA9IGxvYWQKICAgICAgICBrZXlzLnNhdmVfY29uZmlnX3BhdGggPSBzYXZlCiAgICAgICAgc2VsZi53ayA9IGtleXMuV2hlZWxLZXlzKCkKICAgICAgICBzZWxmLndrLkNPTkZJR19OQU1FID0gc2VsZi5jb25maWdfZmlsZW5hbWUKICAgICAgICAKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBvcy51bmxpbmsoc2VsZi5jb25maWcubmFtZSkKICAgICAgICAKICAgIGRlZiB0ZXN0X2xvYWRfc2F2ZShzZWxmKToKICAgICAgICBzZWxmLndrLmRhdGEgPSBqc29uLmxvYWRzKHdoZWVsX2pzb24pCiAgICAgICAgCiAgICAgICAgc2VsZi53ay5hZGRfc2lnbmVyKCcrJywgJzY3ODkwJykKICAgICAgICBzZWxmLndrLmFkZF9zaWduZXIoJ3Njb3BlJywgJ2FiY2RlZmcnKQogICAgICAgIAogICAgICAgIHNlbGYud2sudHJ1c3QoJ2Vwb2NzJywgJ2dmZWRjYmEnKQogICAgICAgIHNlbGYud2sudHJ1c3QoJysnLCAnMTIzNDUnKQogICAgICAgIAogICAgICAgIHNlbGYud2suc2F2ZSgpCiAgICAgICAgCiAgICAgICAgZGVsIHNlbGYud2suZGF0YQogICAgICAgIHNlbGYud2subG9hZCgpCiAgICAgICAgCiAgICAgICAgc2lnbmVycyA9IHNlbGYud2suc2lnbmVycygnc2NvcGUnKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaWduZXJzWzBdID09ICgnc2NvcGUnLCAnYWJjZGVmZycpLCBzZWxmLndrLmRhdGFbJ3NpZ25lcnMnXSkKICAgICAgICBzZWxmLmFzc2VydFRydWUoc2lnbmVyc1sxXVswXSA9PSAnKycsIHNlbGYud2suZGF0YVsnc2lnbmVycyddKQogICAgICAgIAogICAgICAgIHRydXN0ZWQgPSBzZWxmLndrLnRydXN0ZWQoJ2Vwb2NzJykKICAgICAgICBzZWxmLmFzc2VydFRydWUodHJ1c3RlZFswXSA9PSAoJ2Vwb2NzJywgJ2dmZWRjYmEnKSkKICAgICAgICBzZWxmLmFzc2VydFRydWUodHJ1c3RlZFsxXVswXSA9PSAnKycpCiAgICAgICAgCiAgICAgICAgc2VsZi53ay51bnRydXN0KCdlcG9jcycsICdnZmVkY2JhJykKICAgICAgICB0cnVzdGVkID0gc2VsZi53ay50cnVzdGVkKCdlcG9jcycpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnZXBvY3MnLCAnZ2ZlZGNiYScpIG5vdCBpbiB0cnVzdGVkKQogICAgICAgIAogICAgZGVmIHRlc3RfbG9hZF9zYXZlX2luY29tcGxldGUoc2VsZik6CiAgICAgICAgc2VsZi53ay5kYXRhID0ganNvbi5sb2Fkcyh3aGVlbF9qc29uKQogICAgICAgIGRlbCBzZWxmLndrLmRhdGFbJ3NpZ25lcnMnXQogICAgICAgIHNlbGYud2suZGF0YVsnc2NoZW1hJ10gPSBzZWxmLndrLlNDSEVNQSsxCiAgICAgICAgc2VsZi53ay5zYXZlKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYud2subG9hZCgpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIFZhbHVlRXJyb3IiKQogICAgICAgIAogICAgICAgIGRlbCBzZWxmLndrLmRhdGFbJ3NjaGVtYSddCiAgICAgICAgc2VsZi53ay5zYXZlKCkKICAgICAgICBzZWxmLndrLmxvYWQoKQogICAgCiAgICAKUEsDBBQAAAAAAAAAIQBiWHRjrAAAAKwAAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9wYXRocy5weWltcG9ydCB3aGVlbC5wYXRocwpmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IFNDSEVNRV9LRVlTCgpkZWYgdGVzdF9wYXRoKCk6CiAgICBkID0gd2hlZWwucGF0aHMuZ2V0X2luc3RhbGxfcGF0aHMoJ3doZWVsJykKICAgIGFzc2VydCBsZW4oZCkgPT0gbGVuKFNDSEVNRV9LRVlTKQpQSwMEFAAAAAAAAAAhAG2WMfnYBQAA2AUAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3JhbmtpbmcucHlpbXBvcnQgdW5pdHRlc3QKCmZyb20gd2hlZWwucGVwNDI1dGFncyBpbXBvcnQgZ2V0X3N1cHBvcnRlZApmcm9tIHdoZWVsLmluc3RhbGwgaW1wb3J0IFdoZWVsRmlsZQoKV0hFRUxQQVQgPSAiJShuYW1lKXMtJSh2ZXIpcy0lKHB5dmVyKXMtJShhYmkpcy0lKGFyY2gpcy53aGwiCmRlZiBtYWtlX3doZWVsKG5hbWUsIHZlciwgcHl2ZXIsIGFiaSwgYXJjaCk6CiAgICBuYW1lID0gV0hFRUxQQVQgJSBkaWN0KG5hbWU9bmFtZSwgdmVyPXZlciwgcHl2ZXI9cHl2ZXIsIGFiaT1hYmksCiAgICAgICAgICAgIGFyY2g9YXJjaCkKICAgIHJldHVybiBXaGVlbEZpbGUobmFtZSkKCiMgVGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBnZW5lcmF0ZV9zdXBwb3J0ZWQgd2lsbCBhbHdheXMgcmV0dXJuIHRoZQojIGV4YWN0IHB5dmVyLCBhYmksIGFuZCBhcmNoaXRlY3R1cmUgZm9yIGl0cyBmaXJzdCAoYmVzdCkgbWF0Y2guCnN1cCA9IGdldF9zdXBwb3J0ZWQoKQpweXZlciwgYWJpLCBhcmNoID0gc3VwWzBdCmdlbnZlciA9ICdweScgKyBweXZlclsyOl0KbWFqdmVyID0gZ2VudmVyWzozXQoKQ09NQklOQVRJT05TID0gKAogICAgKCdiYXInLCAnMC45JywgJ3B5Mi5weTMnLCAnbm9uZScsICdhbnknKSwKICAgICgnYmFyJywgJzAuOScsIG1hanZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2JhcicsICcwLjknLCBnZW52ZXIsICdub25lJywgJ2FueScpLAogICAgKCdiYXInLCAnMC45JywgcHl2ZXIsIGFiaSwgYXJjaCksCiAgICAoJ2JhcicsICcxLjMuMicsIG1hanZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2JhcicsICczLjEnLCBnZW52ZXIsICdub25lJywgJ2FueScpLAogICAgKCdiYXInLCAnMy4xJywgcHl2ZXIsIGFiaSwgYXJjaCksCiAgICAoJ2ZvbycsICcxLjAnLCBtYWp2ZXIsICdub25lJywgJ2FueScpLAogICAgKCdmb28nLCAnMS4xJywgcHl2ZXIsIGFiaSwgYXJjaCksCiAgICAoJ2ZvbycsICcyLjEnLCBtYWp2ZXIgKyAnMCcsICdub25lJywgJ2FueScpLAogICAgIyBUaGlzIHdpbGwgbm90IGJlIGNvbXBhdGlibGUgZm9yIFB5dGhvbiB4LjAuIEJld2FyZSB3aGVuIHdlIGhpdCBQeXRob24KICAgICMgNC4wLCBhbmQgZG9uJ3QgdGVzdCB3aXRoIDMuMCEhIQogICAgKCdmb28nLCAnMi4xJywgbWFqdmVyICsgJzEnLCAnbm9uZScsICdhbnknKSwKICAgICgnZm9vJywgJzIuMScsIHB5dmVyICwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2ZvbycsICcyLjEnLCBweXZlciAsIGFiaSwgYXJjaCksCikKCldIRUVMUyA9IFsgbWFrZV93aGVlbCgqYXJncykgZm9yIGFyZ3MgaW4gQ09NQklOQVRJT05TIF0KCmNsYXNzIFRlc3RSYW5raW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2NvbXBhcmlzb24oc2VsZik6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKFdIRUVMUyktMSk6CiAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGkpOgogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFdIRUVMU1tqXTxXSEVFTFNbaV0pClBLAwQUAAAAAAAAACEApCl/MWAEAABgBAAAPwAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfc2lnbmF0dXJlcy5weWZyb20gd2hlZWwgaW1wb3J0IHNpZ25hdHVyZXMKZnJvbSB3aGVlbC5zaWduYXR1cmVzIGltcG9ydCBkamJlYywgZWQyNTUxOXB5CmZyb20gd2hlZWwudXRpbCBpbXBvcnQgYmluYXJ5CgpkZWYgdGVzdF9nZXRsaWIoKToKICAgIHNpZ25hdHVyZXMuZ2V0X2VkMjU1MTlsbCgpCgpkZWYgdGVzdF9kamJlYygpOgogICAgZGpiZWMuZHNhX3Rlc3QoKSAgICAKICAgIGRqYmVjLmRoX3Rlc3QoKQogICAgCmRlZiB0ZXN0X2VkMjU1MTlweSgpOgogICAga3AwID0gZWQyNTUxOXB5LmNyeXB0b19zaWduX2tleXBhaXIoYmluYXJ5KCcgJyozMikpCiAgICBrcCA9IGVkMjU1MTlweS5jcnlwdG9fc2lnbl9rZXlwYWlyKCkKICAgICAgICAKICAgIHNpZ25lZCA9IGVkMjU1MTlweS5jcnlwdG9fc2lnbihiaW5hcnkoJ3Rlc3QnKSwga3Auc2spCiAgICAKICAgIGVkMjU1MTlweS5jcnlwdG9fc2lnbl9vcGVuKHNpZ25lZCwga3AudmspCiAgICAKICAgIHRyeToKICAgICAgICBlZDI1NTE5cHkuY3J5cHRvX3NpZ25fb3BlbihzaWduZWQsIGtwMC52aykKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFeHBlY3RlZCBWYWx1ZUVycm9yIikKICAgIAogICAgdHJ5OgogICAgICAgIGVkMjU1MTlweS5jcnlwdG9fc2lnbl9rZXlwYWlyKGJpbmFyeSgnICcqMzMpKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIFZhbHVlRXJyb3IiKQogICAgCiAgICB0cnk6CiAgICAgICAgZWQyNTUxOXB5LmNyeXB0b19zaWduKGJpbmFyeSgnJyksIGJpbmFyeSgnICcpKjMxKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIFZhbHVlRXJyb3IiKQogICAgCiAgICB0cnk6CiAgICAgICAgZWQyNTUxOXB5LmNyeXB0b19zaWduX29wZW4oYmluYXJ5KCcnKSwgYmluYXJ5KCcgJykqMzEpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRXhwZWN0ZWQgVmFsdWVFcnJvciIpCiAgICBQSwMEFAAAAAAAAAAhAJxXQvAnFwAAJxcAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3RhZ29wdC5weSIiIgpUZXN0cyBmb3IgdGhlIGJkaXN0X3doZWVsIHRhZyBvcHRpb25zICgtLXB5dGhvbi10YWcsIC0tdW5pdmVyc2FsLCBhbmQKLS1wbGF0LW5hbWUpCiIiIgoKaW1wb3J0IHN5cwppbXBvcnQgc2h1dGlsCmltcG9ydCBweXRlc3QKaW1wb3J0IHB5LnBhdGgKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzdWJwcm9jZXNzCgpTRVRVUF9QWSA9ICIiIlwKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCgpzZXR1cCgKICAgIG5hbWU9IlRlc3QiLAogICAgdmVyc2lvbj0iMS4wIiwKICAgIGF1dGhvcl9lbWFpbD0iYXV0aG9yQGV4YW1wbGUuY29tIiwKICAgIHB5X21vZHVsZXM9WyJ0ZXN0Il0sCiAgICB7ZXh0X21vZHVsZXN9CikKIiIiCgpFWFRfTU9EVUxFUyA9ICJleHRfbW9kdWxlcz1bRXh0ZW5zaW9uKCdfdGVzdCcsIHNvdXJjZXM9Wyd0ZXN0LmMnXSldLCIKCkBweXRlc3QuZml4dHVyZQpkZWYgdGVtcF9wa2cocmVxdWVzdCwgZXh0PUZhbHNlKToKICAgIHRlbXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGRlZiBmaW4oKToKICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpCiAgICByZXF1ZXN0LmFkZGZpbmFsaXplcihmaW4pCiAgICB0ZW1wcGF0aCA9IHB5LnBhdGgubG9jYWwodGVtcGRpcikKICAgIHRlbXBwYXRoLmpvaW4oJ3Rlc3QucHknKS53cml0ZSgncHJpbnQoIkhlbGxvLCB3b3JsZCIpJykKICAgIGlmIGV4dDoKICAgICAgICB0ZW1wcGF0aC5qb2luKCd0ZXN0LmMnKS53cml0ZSgnI2luY2x1ZGUgPHN0ZGlvLmg+JykKICAgICAgICBzZXR1cF9weSA9IFNFVFVQX1BZLmZvcm1hdChleHRfbW9kdWxlcz1FWFRfTU9EVUxFUykKICAgIGVsc2U6CiAgICAgICAgc2V0dXBfcHkgPSBTRVRVUF9QWS5mb3JtYXQoZXh0X21vZHVsZXM9JycpCiAgICB0ZW1wcGF0aC5qb2luKCdzZXR1cC5weScpLndyaXRlKHNldHVwX3B5KQogICAgcmV0dXJuIHRlbXBwYXRoCgpAcHl0ZXN0LmZpeHR1cmUKZGVmIHRlbXBfZXh0X3BrZyhyZXF1ZXN0KToKICAgIHJldHVybiB0ZW1wX3BrZyhyZXF1ZXN0LCBleHQ9VHJ1ZSkKCmRlZiB0ZXN0X2RlZmF1bHRfdGFnKHRlbXBfcGtnKToKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCddLAogICAgICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lID09ICdUZXN0LTEuMC1weSVzLW5vbmUtYW55LndobCcgJSAoc3lzLnZlcnNpb25bMF0sKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9leHBsaWNpdF90YWcodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tcHl0aG9uLXRhZz1weTMyJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTMyLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3VuaXZlcnNhbF90YWcodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tdW5pdmVyc2FsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTIucHkzLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3VuaXZlcnNhbF9iZWF0c19leHBsaWNpdF90YWcodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tdW5pdmVyc2FsJywgJy0tcHl0aG9uLXRhZz1weTMyJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTIucHkzLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3VuaXZlcnNhbF9pbl9zZXR1cF9jZmcodGVtcF9wa2cpOgogICAgdGVtcF9wa2cuam9pbignc2V0dXAuY2ZnJykud3JpdGUoJ1tiZGlzdF93aGVlbF1cbnVuaXZlcnNhbD0xJykKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuc3RhcnRzd2l0aCgnVGVzdC0xLjAtcHkyLnB5My0nKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9weXRob250YWdfaW5fc2V0dXBfY2ZnKHRlbXBfcGtnKToKICAgIHRlbXBfcGtnLmpvaW4oJ3NldHVwLmNmZycpLndyaXRlKCdbYmRpc3Rfd2hlZWxdXG5weXRob25fdGFnPXB5MzInKQogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTMyLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X2xlZ2FjeV93aGVlbF9zZWN0aW9uX2luX3NldHVwX2NmZyh0ZW1wX3BrZyk6CiAgICB0ZW1wX3BrZy5qb2luKCdzZXR1cC5jZmcnKS53cml0ZSgnW3doZWVsXVxudW5pdmVyc2FsPTEnKQogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTIucHkzLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3BsYXRfbmFtZV9wdXJlcHkodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tcGxhdC1uYW1lPXRlc3RwbGF0LnB1cmUnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLmVuZHN3aXRoKCctdGVzdHBsYXRfcHVyZS53aGwnKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9wbGF0X25hbWVfZXh0KHRlbXBfZXh0X3BrZyk6CiAgICB0cnk6CiAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCcsICctLXBsYXQtbmFtZT10ZXN0cGxhdC5hcmNoJ10sCiAgICAgICAgICAgIGN3ZD1zdHIodGVtcF9leHRfcGtnKSkKICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKICAgICAgICBweXRlc3Quc2tpcCgiQ2Fubm90IGNvbXBpbGUgQyBFeHRlbnNpb25zIikKICAgIGRpc3RfZGlyID0gdGVtcF9leHRfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5lbmRzd2l0aCgnLXRlc3RwbGF0X2FyY2gud2hsJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfcGxhdF9uYW1lX3B1cmVweV9pbl9zZXR1cGNmZyh0ZW1wX3BrZyk6CiAgICB0ZW1wX3BrZy5qb2luKCdzZXR1cC5jZmcnKS53cml0ZSgnW2JkaXN0X3doZWVsXVxucGxhdF9uYW1lPXRlc3RwbGF0LnB1cmUnKQogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5lbmRzd2l0aCgnLXRlc3RwbGF0X3B1cmUud2hsJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfcGxhdF9uYW1lX2V4dF9pbl9zZXR1cGNmZyh0ZW1wX2V4dF9wa2cpOgogICAgdGVtcF9leHRfcGtnLmpvaW4oJ3NldHVwLmNmZycpLndyaXRlKCdbYmRpc3Rfd2hlZWxdXG5wbGF0X25hbWU9dGVzdHBsYXQuYXJjaCcpCiAgICB0cnk6CiAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCddLAogICAgICAgICAgICBjd2Q9c3RyKHRlbXBfZXh0X3BrZykpCiAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3I6CiAgICAgICAgcHl0ZXN0LnNraXAoIkNhbm5vdCBjb21waWxlIEMgRXh0ZW5zaW9ucyIpCiAgICBkaXN0X2RpciA9IHRlbXBfZXh0X3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuZW5kc3dpdGgoJy10ZXN0cGxhdF9hcmNoLndobCcpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKUEsDBBQAAAAAAAAAIQDUPh9WkAIAAJACAAA5AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF90b29sLnB5ZnJvbSAuLiBpbXBvcnQgdG9vbAoKZGVmIHRlc3Rfa2V5Z2VuKCk6CiAgICBkZWYgZ2V0X2tleXJpbmcoKToKICAgICAgICBXaGVlbEtleXMsIGtleXJpbmcgPSB0b29sLmdldF9rZXlyaW5nKCkKCiAgICAgICAgY2xhc3MgV2hlZWxLZXlzVGVzdChXaGVlbEtleXMpOgogICAgICAgICAgICBkZWYgc2F2ZShzZWxmKToKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgY2xhc3Mga2V5cmluZ1Rlc3Q6CiAgICAgICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgICAgICBkZWYgZ2V0X2tleXJpbmcoY2xzKToKICAgICAgICAgICAgICAgIGNsYXNzIGtleXJpbmdUZXN0MjoKICAgICAgICAgICAgICAgICAgICBwdyA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBkZWYgc2V0X3Bhc3N3b3JkKHNlbGYsIGEsIGIsIGMpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB3ID0gYwogICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfcGFzc3dvcmQoc2VsZiwgYSwgYik6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnB3CgogICAgICAgICAgICAgICAgcmV0dXJuIGtleXJpbmdUZXN0MigpCgogICAgICAgIHJldHVybiBXaGVlbEtleXNUZXN0LCBrZXlyaW5nVGVzdAoKICAgIHRvb2wua2V5Z2VuKGdldF9rZXlyaW5nPWdldF9rZXlyaW5nKQpQSwMEFAAAAAAAAAAhAEViREzpEQAA6REAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3doZWVsZmlsZS5weWltcG9ydCBvcwppbXBvcnQgd2hlZWwuaW5zdGFsbAppbXBvcnQgd2hlZWwuYXJjaGl2ZQppbXBvcnQgaGFzaGxpYgp0cnk6CiAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGlvIGltcG9ydCBCeXRlc0lPIGFzIFN0cmluZ0lPCmltcG9ydCBjb2RlY3MKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHB5dGVzdAppbXBvcnQgc2h1dGlsCmltcG9ydCB0ZW1wZmlsZQpmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCgpAY29udGV4dG1hbmFnZXIKZGVmIGVudmlyb24oa2V5LCB2YWx1ZSk6CiAgICBvbGRfdmFsdWUgPSBvcy5lbnZpcm9uLmdldChrZXkpCiAgICB0cnk6CiAgICAgICAgb3MuZW52aXJvbltrZXldID0gdmFsdWUKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBpZiBvbGRfdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgZGVsIG9zLmVudmlyb25ba2V5XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG9zLmVudmlyb25ba2V5XSA9IG9sZF92YWx1ZQoKQGNvbnRleHRtYW5hZ2VyCmRlZiB0ZW1wb3JhcnlfZGlyZWN0b3J5KCk6CiAgICAjIHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IGluIFB5dGhvbiAyLgogICAgdGVtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgdHJ5OgogICAgICAgIHlpZWxkIHRlbXBkaXIKICAgIGZpbmFsbHk6CiAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQoKQGNvbnRleHRtYW5hZ2VyCmRlZiByZWFkYWJsZV96aXBmaWxlKHBhdGgpOgogICAgIyB6aXBmaWxlLlppcEZpbGUoKSBpc24ndCBhIGNvbnRleHQgbWFuYWdlciB1bmRlciBQeXRob24gMi4KICAgIHpmID0gemlwZmlsZS5aaXBGaWxlKHBhdGgsICdyJykKICAgIHRyeToKICAgICAgICB5aWVsZCB6ZgogICAgZmluYWxseToKICAgICAgICB6Zi5jbG9zZSgpCgoKZGVmIHRlc3RfdmVyaWZ5aW5nX3ppcGZpbGUoKToKICAgIGlmIG5vdCBoYXNhdHRyKHppcGZpbGUuWmlwRXh0RmlsZSwgJ191cGRhdGVfY3JjJyk6CiAgICAgICAgcHl0ZXN0LnNraXAoJ05vIFpJUCB2ZXJpZmljYXRpb24uIE1pc3NpbmcgWmlwRXh0RmlsZS5fdXBkYXRlX2NyYy4nKQogICAgCiAgICBzaW8gPSBTdHJpbmdJTygpCiAgICB6ZiA9IHppcGZpbGUuWmlwRmlsZShzaW8sICd3JykKICAgIHpmLndyaXRlc3RyKCJvbmUiLCBiImZpcnN0IGZpbGUiKQogICAgemYud3JpdGVzdHIoInR3byIsIGIic2Vjb25kIGZpbGUiKQogICAgemYud3JpdGVzdHIoInRocmVlIiwgYiJ0aGlyZCBmaWxlIikKICAgIHpmLmNsb3NlKCkKICAgIAogICAgIyBJbiBkZWZhdWx0IG1vZGUsIFZlcmlmeWluZ1ppcEZpbGUgY2hlY2tzIHRoZSBoYXNoIG9mIGFueSByZWFkIGZpbGUKICAgICMgbWVudGlvbmVkIHdpdGggc2V0X2V4cGVjdGVkX2hhc2goKS4gRmlsZXMgbm90IG1lbnRpb25lZCB3aXRoCiAgICAjIHNldF9leHBlY3RlZF9oYXNoKCkgYXJlIG5vdCBjaGVja2VkLgogICAgdnpmID0gd2hlZWwuaW5zdGFsbC5WZXJpZnlpbmdaaXBGaWxlKHNpbywgJ3InKQogICAgdnpmLnNldF9leHBlY3RlZF9oYXNoKCJvbmUiLCBoYXNobGliLnNoYTI1NihiImZpcnN0IGZpbGUiKS5kaWdlc3QoKSkKICAgIHZ6Zi5zZXRfZXhwZWN0ZWRfaGFzaCgidGhyZWUiLCAiYmx1cmJsZSIpCiAgICB2emYub3Blbigib25lIikucmVhZCgpCiAgICB2emYub3BlbigidHdvIikucmVhZCgpCiAgICB0cnk6CiAgICAgICAgdnpmLm9wZW4oInRocmVlIikucmVhZCgpCiAgICBleGNlcHQgd2hlZWwuaW5zdGFsbC5CYWRXaGVlbEZpbGU6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oImV4cGVjdGVkIGV4Y2VwdGlvbiAnQmFkV2hlZWxGaWxlKCknIikKICAgIAogICAgIyBJbiBzdHJpY3QgbW9kZSwgVmVyaWZ5aW5nWmlwRmlsZSByZXF1aXJlcyBldmVyeSByZWFkIGZpbGUgdG8gYmUKICAgICMgbWVudGlvbmVkIHdpdGggc2V0X2V4cGVjdGVkX2hhc2goKS4KICAgIHZ6Zi5zdHJpY3QgPSBUcnVlCiAgICB0cnk6CiAgICAgICAgdnpmLm9wZW4oInR3byIpLnJlYWQoKQogICAgZXhjZXB0IHdoZWVsLmluc3RhbGwuQmFkV2hlZWxGaWxlOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJleHBlY3RlZCBleGNlcHRpb24gJ0JhZFdoZWVsRmlsZSgpJyIpCiAgICAgICAgCiAgICB2emYuc2V0X2V4cGVjdGVkX2hhc2goInR3byIsIE5vbmUpCiAgICB2emYub3BlbigidHdvIikucmVhZCgpCiAgICAKZGVmIHRlc3RfcG9wX3ppcGZpbGUoKToKICAgIHNpbyA9IFN0cmluZ0lPKCkKICAgIHpmID0gd2hlZWwuaW5zdGFsbC5WZXJpZnlpbmdaaXBGaWxlKHNpbywgJ3cnKQogICAgemYud3JpdGVzdHIoIm9uZSIsIGIiZmlyc3QgZmlsZSIpCiAgICB6Zi53cml0ZXN0cigidHdvIiwgYiJzZWNvbmQgZmlsZSIpCiAgICB6Zi5jbG9zZSgpCiAgICAKICAgIHRyeToKICAgICAgICB6Zi5wb3AoKQogICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKICAgICAgICBwYXNzICMgYWxyZWFkeSBjbG9zZWQKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJleHBlY3RlZCBSdW50aW1lRXJyb3IiKQogICAgCiAgICB6ZiA9IHdoZWVsLmluc3RhbGwuVmVyaWZ5aW5nWmlwRmlsZShzaW8sICdhJykKICAgIHpmLnBvcCgpCiAgICB6Zi5jbG9zZSgpCiAgICAKICAgIHpmID0gd2hlZWwuaW5zdGFsbC5WZXJpZnlpbmdaaXBGaWxlKHNpbywgJ3InKQogICAgYXNzZXJ0IGxlbih6Zi5pbmZvbGlzdCgpKSA9PSAxCgpkZWYgdGVzdF96aXBmaWxlX3RpbWVzdGFtcCgpOgogICAgIyBBbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBpbmZsdWVuY2UgdGhlIHRpbWVzdGFtcCBvbgogICAgIyBUYXJJbmZvIG9iamVjdHMgaW5zaWRlIHRoZSB6aXAuICBTZWUgaXNzdWUgIzE0My4gIFRlbXBvcmFyeURpcmVjdG9yeSBpcwogICAgIyBub3QgYSBjb250ZXh0IG1hbmFnZXIgdW5kZXIgUHl0aG9uIDMuCiAgICB3aXRoIHRlbXBvcmFyeV9kaXJlY3RvcnkoKSBhcyB0ZW1wZGlyOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiAoJ29uZScsICd0d28nLCAndGhyZWUnKToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihwYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGZwOgogICAgICAgICAgICAgICAgZnAud3JpdGUoZmlsZW5hbWUgKyAnXG4nKQogICAgICAgIHppcF9iYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ2R1bW15JykKICAgICAgICAjIFRoZSBlYXJsaWVzdCBkYXRlIHJlcHJlc2VudGFibGUgaW4gVGFySW5mb3MsIDE5ODAtMDEtMDEKICAgICAgICB3aXRoIGVudmlyb24oJ1NPVVJDRV9EQVRFX0VQT0NIJywgJzMxNTU3NjA2MCcpOgogICAgICAgICAgICB6aXBfZmlsZW5hbWUgPSB3aGVlbC5hcmNoaXZlLm1ha2Vfd2hlZWxmaWxlX2lubmVyKAogICAgICAgICAgICAgICAgemlwX2Jhc2VfbmFtZSwgdGVtcGRpcikKICAgICAgICB3aXRoIHJlYWRhYmxlX3ppcGZpbGUoemlwX2ZpbGVuYW1lKSBhcyB6ZjoKICAgICAgICAgICAgZm9yIGluZm8gaW4gemYuaW5mb2xpc3QoKToKICAgICAgICAgICAgICAgIGFzc2VydCBpbmZvLmRhdGVfdGltZVs6M10gPT0gKDE5ODAsIDEsIDEpCgpkZWYgdGVzdF96aXBmaWxlX2F0dHJpYnV0ZXMoKToKICAgICMgV2l0aCB0aGUgY2hhbmdlIGZyb20gWmlwRmlsZS53cml0ZSgpIHRvIC53cml0ZXN0cigpLCB3ZSBuZWVkIHRvIG1hbnVhbGx5CiAgICAjIHNldCBtZW1iZXIgYXR0cmlidXRlcy4KICAgIHdpdGggdGVtcG9yYXJ5X2RpcmVjdG9yeSgpIGFzIHRlbXBkaXI6CiAgICAgICAgZmlsZXMgPSAoKCdmb28nLCAwbzY0NCksICgnYmFyJywgMG83NTUpKQogICAgICAgIGZvciBmaWxlbmFtZSwgbW9kZSBpbiBmaWxlczoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihwYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGZwOgogICAgICAgICAgICAgICAgZnAud3JpdGUoZmlsZW5hbWUgKyAnXG4nKQogICAgICAgICAgICBvcy5jaG1vZChwYXRoLCBtb2RlKQogICAgICAgIHppcF9iYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ2R1bW15JykKICAgICAgICB6aXBfZmlsZW5hbWUgPSB3aGVlbC5hcmNoaXZlLm1ha2Vfd2hlZWxmaWxlX2lubmVyKAogICAgICAgICAgICB6aXBfYmFzZV9uYW1lLCB0ZW1wZGlyKQogICAgICAgIHdpdGggcmVhZGFibGVfemlwZmlsZSh6aXBfZmlsZW5hbWUpIGFzIHpmOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUsIG1vZGUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpbmZvID0gemYuZ2V0aW5mbyhvcy5wYXRoLmpvaW4odGVtcGRpciwgZmlsZW5hbWUpKQogICAgICAgICAgICAgICAgYXNzZXJ0IGluZm8uZXh0ZXJuYWxfYXR0ciA9PSAobW9kZSB8IDBvMTAwMDAwKSA8PCAxNgogICAgICAgICAgICAgICAgYXNzZXJ0IGluZm8uY29tcHJlc3NfdHlwZSA9PSB6aXBmaWxlLlpJUF9ERUZMQVRFRApQSwMEFAAAAAAAAAAhAKMtAxehMwAAoTMAADgAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdG9vbC9fX2luaXRfXy5weSIiIgpXaGVlbCBjb21tYW5kLWxpbmUgdXRpbGl0eS4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IHN5cwppbXBvcnQganNvbgoKZnJvbSBnbG9iIGltcG9ydCBpZ2xvYgpmcm9tIC4uIGltcG9ydCBzaWduYXR1cmVzCmZyb20gLi51dGlsIGltcG9ydCAodXJsc2FmZV9iNjRkZWNvZGUsIHVybHNhZmVfYjY0ZW5jb2RlLCBuYXRpdmUsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICBtYXRjaGVzX3JlcXVpcmVtZW50KQpmcm9tIC4uaW5zdGFsbCBpbXBvcnQgV2hlZWxGaWxlLCBWZXJpZnlpbmdaaXBGaWxlCmZyb20gLi5wYXRocyBpbXBvcnQgZ2V0X2luc3RhbGxfY29tbWFuZAoKZGVmIHJlcXVpcmVfcGtncmVzb3VyY2VzKG5hbWUpOgogICAgdHJ5OgogICAgICAgIGltcG9ydCBwa2dfcmVzb3VyY2VzCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCInezB9JyBuZWVkcyBwa2dfcmVzb3VyY2VzIChwYXJ0IG9mIHNldHVwdG9vbHMpLiIuZm9ybWF0KG5hbWUpKQoKaW1wb3J0IGFyZ3BhcnNlCgpjbGFzcyBXaGVlbEVycm9yKEV4Y2VwdGlvbik6IHBhc3MKCiMgRm9yIHRlc3RhYmlsaXR5CmRlZiBnZXRfa2V5cmluZygpOgogICAgdHJ5OgogICAgICAgIGZyb20gLi5zaWduYXR1cmVzIGltcG9ydCBrZXlzCiAgICAgICAgaW1wb3J0IGtleXJpbmcKICAgICAgICBhc3NlcnQga2V5cmluZy5nZXRfa2V5cmluZygpLnByaW9yaXR5CiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBc3NlcnRpb25FcnJvcik6CiAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiSW5zdGFsbCB3aGVlbFtzaWduYXR1cmVzXSAocmVxdWlyZXMga2V5cmluZywga2V5cmluZ3MuYWx0LCBweXhkZykgZm9yIHNpZ25hdHVyZXMuIikKICAgIHJldHVybiBrZXlzLldoZWVsS2V5cywga2V5cmluZwoKZGVmIGtleWdlbihnZXRfa2V5cmluZz1nZXRfa2V5cmluZyk6CiAgICAiIiJHZW5lcmF0ZSBhIHB1YmxpYy9wcml2YXRlIGtleSBwYWlyLiIiIgogICAgV2hlZWxLZXlzLCBrZXlyaW5nID0gZ2V0X2tleXJpbmcoKQoKICAgIGVkMjU1MTlsbCA9IHNpZ25hdHVyZXMuZ2V0X2VkMjU1MTlsbCgpCgogICAgd2sgPSBXaGVlbEtleXMoKS5sb2FkKCkKCiAgICBrZXlwYWlyID0gZWQyNTUxOWxsLmNyeXB0b19zaWduX2tleXBhaXIoKQogICAgdmsgPSBuYXRpdmUodXJsc2FmZV9iNjRlbmNvZGUoa2V5cGFpci52aykpCiAgICBzayA9IG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShrZXlwYWlyLnNrKSkKICAgIGtyID0ga2V5cmluZy5nZXRfa2V5cmluZygpCiAgICBrci5zZXRfcGFzc3dvcmQoIndoZWVsIiwgdmssIHNrKQogICAgc3lzLnN0ZG91dC53cml0ZSgiQ3JlYXRlZCBFZDI1NTE5IGtleXBhaXIgd2l0aCB2az17MH1cbiIuZm9ybWF0KHZrKSkKICAgIHN5cy5zdGRvdXQud3JpdGUoImluIHswIXJ9XG4iLmZvcm1hdChrcikpCgogICAgc2syID0ga3IuZ2V0X3Bhc3N3b3JkKCd3aGVlbCcsIHZrKQogICAgaWYgc2syICE9IHNrOgogICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIktleXJpbmcgaXMgYnJva2VuLiBDb3VsZCBub3QgcmV0cmlldmUgc2VjcmV0IGtleS4iKQoKICAgIHN5cy5zdGRvdXQud3JpdGUoIlRydXN0aW5nIHswfSB0byBzaWduIGFuZCB2ZXJpZnkgYWxsIHBhY2thZ2VzLlxuIi5mb3JtYXQodmspKQogICAgd2suYWRkX3NpZ25lcignKycsIHZrKQogICAgd2sudHJ1c3QoJysnLCB2aykKICAgIHdrLnNhdmUoKQoKZGVmIHNpZ24od2hlZWxmaWxlLCByZXBsYWNlPUZhbHNlLCBnZXRfa2V5cmluZz1nZXRfa2V5cmluZyk6CiAgICAiIiJTaWduIGEgd2hlZWwiIiIKICAgIFdoZWVsS2V5cywga2V5cmluZyA9IGdldF9rZXlyaW5nKCkKCiAgICBlZDI1NTE5bGwgPSBzaWduYXR1cmVzLmdldF9lZDI1NTE5bGwoKQoKICAgIHdmID0gV2hlZWxGaWxlKHdoZWVsZmlsZSwgYXBwZW5kPVRydWUpCiAgICB3ayA9IFdoZWVsS2V5cygpLmxvYWQoKQoKICAgIG5hbWUgPSB3Zi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWUnKQogICAgc2lnbl93aXRoID0gd2suc2lnbmVycyhuYW1lKVswXQogICAgc3lzLnN0ZG91dC53cml0ZSgiU2lnbmluZyB7MH0gd2l0aCB7MX1cbiIuZm9ybWF0KG5hbWUsIHNpZ25fd2l0aFsxXSkpCgogICAgdmsgPSBzaWduX3dpdGhbMV0KICAgIGtyID0ga2V5cmluZy5nZXRfa2V5cmluZygpCiAgICBzayA9IGtyLmdldF9wYXNzd29yZCgnd2hlZWwnLCB2aykKICAgIGtleXBhaXIgPSBlZDI1NTE5bGwuS2V5cGFpcih1cmxzYWZlX2I2NGRlY29kZShiaW5hcnkodmspKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxzYWZlX2I2NGRlY29kZShiaW5hcnkoc2spKSkKCgogICAgcmVjb3JkX25hbWUgPSB3Zi5kaXN0aW5mb19uYW1lICsgJy9SRUNPUkQnCiAgICBzaWdfbmFtZSA9IHdmLmRpc3RpbmZvX25hbWUgKyAnL1JFQ09SRC5qd3MnCiAgICBpZiBzaWdfbmFtZSBpbiB3Zi56aXBmaWxlLm5hbWVsaXN0KCk6CiAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiV2hlZWwgaXMgYWxyZWFkeSBzaWduZWQuIikKICAgIHJlY29yZF9kYXRhID0gd2YuemlwZmlsZS5yZWFkKHJlY29yZF9uYW1lKQogICAgcGF5bG9hZCA9IHsiaGFzaCI6InNoYTI1Nj0iICsgbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGhhc2hsaWIuc2hhMjU2KHJlY29yZF9kYXRhKS5kaWdlc3QoKSkpfQogICAgc2lnID0gc2lnbmF0dXJlcy5zaWduKHBheWxvYWQsIGtleXBhaXIpCiAgICB3Zi56aXBmaWxlLndyaXRlc3RyKHNpZ19uYW1lLCBqc29uLmR1bXBzKHNpZywgc29ydF9rZXlzPVRydWUpKQogICAgd2YuemlwZmlsZS5jbG9zZSgpCgpkZWYgdW5zaWduKHdoZWVsZmlsZSk6CiAgICAiIiIKICAgIFJlbW92ZSBSRUNPUkQuandzIGZyb20gYSB3aGVlbCBieSB0cnVuY2F0aW5nIHRoZSB6aXAgZmlsZS4KCiAgICBSRUNPUkQuandzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4gVGhlIHppcCBmaWxlIG11c3QgYmUgYW4KICAgIG9yZGluYXJ5IGFyY2hpdmUsIHdpdGggdGhlIGNvbXByZXNzZWQgZmlsZXMgYW5kIHRoZSBkaXJlY3RvcnkgaW4gdGhlIHNhbWUKICAgIG9yZGVyLCBhbmQgd2l0aG91dCBhbnkgbm9uLXppcCBjb250ZW50IGFmdGVyIHRoZSB0cnVuY2F0aW9uIHBvaW50LgogICAgIiIiCiAgICB2emYgPSBWZXJpZnlpbmdaaXBGaWxlKHdoZWVsZmlsZSwgImEiKQogICAgaW5mbyA9IHZ6Zi5pbmZvbGlzdCgpCiAgICBpZiBub3QgKGxlbihpbmZvKSBhbmQgaW5mb1stMV0uZmlsZW5hbWUuZW5kc3dpdGgoJy9SRUNPUkQuandzJykpOgogICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIlJFQ09SRC5qd3Mgbm90IGZvdW5kIGF0IGVuZCBvZiBhcmNoaXZlLiIpCiAgICB2emYucG9wKCkKICAgIHZ6Zi5jbG9zZSgpCgpkZWYgdmVyaWZ5KHdoZWVsZmlsZSk6CiAgICAiIiJWZXJpZnkgYSB3aGVlbC4KCiAgICBUaGUgc2lnbmF0dXJlIHdpbGwgYmUgdmVyaWZpZWQgZm9yIGludGVybmFsIGNvbnNpc3RlbmN5IE9OTFkgYW5kIHByaW50ZWQuCiAgICBXaGVlbCdzIG93biB1bnBhY2svaW5zdGFsbCBjb21tYW5kcyB2ZXJpZnkgdGhlIG1hbmlmZXN0IGFnYWluc3QgdGhlCiAgICBzaWduYXR1cmUgYW5kIGZpbGUgY29udGVudHMuCiAgICAiIiIKICAgIHdmID0gV2hlZWxGaWxlKHdoZWVsZmlsZSkKICAgIHNpZ19uYW1lID0gd2YuZGlzdGluZm9fbmFtZSArICcvUkVDT1JELmp3cycKICAgIHNpZyA9IGpzb24ubG9hZHMobmF0aXZlKHdmLnppcGZpbGUub3BlbihzaWdfbmFtZSkucmVhZCgpKSkKICAgIHZlcmlmaWVkID0gc2lnbmF0dXJlcy52ZXJpZnkoc2lnKQogICAgc3lzLnN0ZGVyci53cml0ZSgiU2lnbmF0dXJlcyBhcmUgaW50ZXJuYWxseSBjb25zaXN0ZW50LlxuIikKICAgIHN5cy5zdGRvdXQud3JpdGUoanNvbi5kdW1wcyh2ZXJpZmllZCwgaW5kZW50PTIpKQogICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQoKZGVmIHVucGFjayh3aGVlbGZpbGUsIGRlc3Q9Jy4nKToKICAgICIiIlVucGFjayBhIHdoZWVsLgoKICAgIFdoZWVsIGNvbnRlbnQgd2lsbCBiZSB1bnBhY2tlZCB0byB7ZGVzdH0ve25hbWV9LXt2ZXJ9LCB3aGVyZSB7bmFtZX0KICAgIGlzIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHt2ZXJ9IGl0cyB2ZXJzaW9uLgoKICAgIDpwYXJhbSB3aGVlbGZpbGU6IFRoZSBwYXRoIHRvIHRoZSB3aGVlbC4KICAgIDpwYXJhbSBkZXN0OiBEZXN0aW5hdGlvbiBkaXJlY3RvcnkgKGRlZmF1bHQgdG8gY3VycmVudCBkaXJlY3RvcnkpLgogICAgIiIiCiAgICB3ZiA9IFdoZWVsRmlsZSh3aGVlbGZpbGUpCiAgICBuYW1ldmVyID0gd2YucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1ldmVyJykKICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5qb2luKGRlc3QsIG5hbWV2ZXIpCiAgICBzeXMuc3RkZXJyLndyaXRlKCJVbnBhY2tpbmcgdG86ICVzXG4iICUgKGRlc3RpbmF0aW9uKSkKICAgIHdmLnppcGZpbGUuZXh0cmFjdGFsbChkZXN0aW5hdGlvbikKICAgIHdmLnppcGZpbGUuY2xvc2UoKQoKZGVmIGluc3RhbGwocmVxdWlyZW1lbnRzLCByZXF1aXJlbWVudHNfZmlsZT1Ob25lLAogICAgICAgICAgICB3aGVlbF9kaXJzPU5vbmUsIGZvcmNlPUZhbHNlLCBsaXN0X2ZpbGVzPUZhbHNlLAogICAgICAgICAgICBkcnlfcnVuPUZhbHNlKToKICAgICIiIkluc3RhbGwgd2hlZWxzLgoKICAgIDpwYXJhbSByZXF1aXJlbWVudHM6IEEgbGlzdCBvZiByZXF1aXJlbWVudHMgb3Igd2hlZWwgZmlsZXMgdG8gaW5zdGFsbC4KICAgIDpwYXJhbSByZXF1aXJlbWVudHNfZmlsZTogQSBmaWxlIGNvbnRhaW5pbmcgcmVxdWlyZW1lbnRzIHRvIGluc3RhbGwuCiAgICA6cGFyYW0gd2hlZWxfZGlyczogQSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3Igd2hlZWxzLgogICAgOnBhcmFtIGZvcmNlOiBJbnN0YWxsIGEgd2hlZWwgZmlsZSBldmVuIGlmIGl0IGlzIG5vdCBjb21wYXRpYmxlLgogICAgOnBhcmFtIGxpc3RfZmlsZXM6IE9ubHkgbGlzdCB0aGUgZmlsZXMgdG8gaW5zdGFsbCwgZG9uJ3QgaW5zdGFsbCB0aGVtLgogICAgOnBhcmFtIGRyeV9ydW46IERvIGV2ZXJ5dGhpbmcgYnV0IHRoZSBhY3R1YWwgaW5zdGFsbC4KICAgICIiIgoKICAgICMgSWYgbm8gd2hlZWwgZGlyZWN0b3JpZXMgc3BlY2lmaWVkLCB1c2UgdGhlIFdIRUVMUEFUSCBlbnZpcm9ubWVudAogICAgIyB2YXJpYWJsZSwgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoYXQgaXMgbm90IHNldC4KICAgIGlmIG5vdCB3aGVlbF9kaXJzOgogICAgICAgIHdoZWVscGF0aCA9IG9zLmdldGVudigiV0hFRUxQQVRIIikKICAgICAgICBpZiB3aGVlbHBhdGg6CiAgICAgICAgICAgIHdoZWVsX2RpcnMgPSB3aGVlbHBhdGguc3BsaXQob3MucGF0aHNlcCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB3aGVlbF9kaXJzID0gWyBvcy5wYXRoLmN1cmRpciBdCgogICAgIyBHZXQgYSBsaXN0IG9mIGFsbCB2YWxpZCB3aGVlbHMgaW4gd2hlZWxfZGlycwogICAgYWxsX3doZWVscyA9IFtdCiAgICBmb3IgZCBpbiB3aGVlbF9kaXJzOgogICAgICAgIGZvciB3IGluIG9zLmxpc3RkaXIoZCk6CiAgICAgICAgICAgIGlmIHcuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgICAgIHdmID0gV2hlZWxGaWxlKG9zLnBhdGguam9pbihkLCB3KSkKICAgICAgICAgICAgICAgIGlmIHdmLmNvbXBhdGlibGU6CiAgICAgICAgICAgICAgICAgICAgYWxsX3doZWVscy5hcHBlbmQod2YpCgogICAgIyBJZiB0aGVyZSBpcyBhIHJlcXVpcmVtZW50cyBmaWxlLCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcmVxdWlyZW1lbnRzCiAgICBpZiByZXF1aXJlbWVudHNfZmlsZToKICAgICAgICAjIElmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIHNlYXJjaCBmb3IgaXQgaW4gd2hlZWxfZGlycwogICAgICAgICMgVGhpcyBhbGxvd3Mgc3RhbmRhcmQgcmVxdWlyZW1lbnRzIGZpbGVzIHRvIGJlIHN0b3JlZCB3aXRoIHRoZQogICAgICAgICMgd2hlZWxzLgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZXF1aXJlbWVudHNfZmlsZSk6CiAgICAgICAgICAgIGZvciBkIGluIHdoZWVsX2RpcnM6CiAgICAgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKGQsIHJlcXVpcmVtZW50c19maWxlKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRzX2ZpbGUgPSBuYW1lCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgd2l0aCBvcGVuKHJlcXVpcmVtZW50c19maWxlKSBhcyBmZDoKICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmV4dGVuZChmZCkKCiAgICB0b19pbnN0YWxsID0gW10KICAgIGZvciByZXEgaW4gcmVxdWlyZW1lbnRzOgogICAgICAgIGlmIHJlcS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICAjIEV4cGxpY2l0bHkgc3BlY2lmaWVkIHdoZWVsIGZpbGVuYW1lCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlcSk6CiAgICAgICAgICAgICAgICB3ZiA9IFdoZWVsRmlsZShyZXEpCiAgICAgICAgICAgICAgICBpZiB3Zi5jb21wYXRpYmxlIG9yIGZvcmNlOgogICAgICAgICAgICAgICAgICAgIHRvX2luc3RhbGwuYXBwZW5kKHdmKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAoInswfSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgUHl0aG9uLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWZvcmNlIHRvIGluc3RhbGwgYW55d2F5LiIuZm9ybWF0KHJlcSkpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgV2hlZWxFcnJvcihtc2cpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFdlIGNvdWxkIHNlYXJjaCBvbiB3aGVlbF9kaXJzLCBidXQgaXQncyBwcm9iYWJseSBPSyB0bwogICAgICAgICAgICAgICAgIyBhc3N1bWUgdGhlIHVzZXIgaGFzIG1hZGUgYW4gZXJyb3IuCiAgICAgICAgICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJObyBzdWNoIHdoZWVsIGZpbGU6IHt9Ii5mb3JtYXQocmVxKSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBXZSBoYXZlIGEgcmVxdWlyZW1lbnQgc3BlYwogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBwa2dfcmVzb3VyY2VzLCB0aGlzIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uCiAgICAgICAgbWF0Y2hlcyA9IG1hdGNoZXNfcmVxdWlyZW1lbnQocmVxLCBhbGxfd2hlZWxzKQogICAgICAgIGlmIG5vdCBtYXRjaGVzOgogICAgICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJObyBtYXRjaCBmb3IgcmVxdWlyZW1lbnQge30iLmZvcm1hdChyZXEpKQogICAgICAgIHRvX2luc3RhbGwuYXBwZW5kKG1heChtYXRjaGVzKSkKCiAgICAjIFdlIG5vdyBoYXZlIGEgbGlzdCBvZiB3aGVlbHMgdG8gaW5zdGFsbAogICAgaWYgbGlzdF9maWxlczoKICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJJbnN0YWxsaW5nOlxuIikKCiAgICBpZiBkcnlfcnVuOgogICAgICAgIHJldHVybgoKICAgIGZvciB3ZiBpbiB0b19pbnN0YWxsOgogICAgICAgIGlmIGxpc3RfZmlsZXM6CiAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiAgICB7MH1cbiIuZm9ybWF0KHdmLmZpbGVuYW1lKSkKICAgICAgICAgICAgY29udGludWUKICAgICAgICB3Zi5pbnN0YWxsKGZvcmNlPWZvcmNlKQogICAgICAgIHdmLnppcGZpbGUuY2xvc2UoKQoKZGVmIGluc3RhbGxfc2NyaXB0cyhkaXN0cmlidXRpb25zKToKICAgICIiIgogICAgUmVnZW5lcmF0ZSB0aGUgZW50cnlfcG9pbnRzIGNvbnNvbGVfc2NyaXB0cyBmb3IgdGhlIG5hbWVkIGRpc3RyaWJ1dGlvbi4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBlYXN5X2luc3RhbGwKICAgICAgICBpbXBvcnQgcGtnX3Jlc291cmNlcwogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiJ3doZWVsIGluc3RhbGxfc2NyaXB0cycgbmVlZHMgc2V0dXB0b29scy4iKQoKICAgIGZvciBkaXN0IGluIGRpc3RyaWJ1dGlvbnM6CiAgICAgICAgcGtnX3Jlc291cmNlc19kaXN0ID0gcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKGRpc3QpCiAgICAgICAgaW5zdGFsbCA9IGdldF9pbnN0YWxsX2NvbW1hbmQoZGlzdCkKICAgICAgICBjb21tYW5kID0gZWFzeV9pbnN0YWxsLmVhc3lfaW5zdGFsbChpbnN0YWxsLmRpc3RyaWJ1dGlvbikKICAgICAgICBjb21tYW5kLmFyZ3MgPSBbJ3doZWVsJ10gIyBkdW1teSBhcmd1bWVudAogICAgICAgIGNvbW1hbmQuZmluYWxpemVfb3B0aW9ucygpCiAgICAgICAgY29tbWFuZC5pbnN0YWxsX2VnZ19zY3JpcHRzKHBrZ19yZXNvdXJjZXNfZGlzdCkKCmRlZiBjb252ZXJ0KGluc3RhbGxlcnMsIGRlc3RfZGlyLCB2ZXJib3NlKToKICAgIHJlcXVpcmVfcGtncmVzb3VyY2VzKCd3aGVlbCBjb252ZXJ0JykKCiAgICAjIE9ubHkgc3VwcG9ydCB3aGVlbCBjb252ZXJ0IGlmIHBrZ19yZXNvdXJjZXMgaXMgcHJlc2VudAogICAgZnJvbSAuLndpbmluc3Qyd2hlZWwgaW1wb3J0IGJkaXN0X3dpbmluc3Qyd2hlZWwKICAgIGZyb20gLi5lZ2cyd2hlZWwgaW1wb3J0IGVnZzJ3aGVlbAoKICAgIGZvciBwYXQgaW4gaW5zdGFsbGVyczoKICAgICAgICBmb3IgaW5zdGFsbGVyIGluIGlnbG9iKHBhdCk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQoaW5zdGFsbGVyKVsxXSA9PSAnLmVnZyc6CiAgICAgICAgICAgICAgICBjb252ID0gZWdnMndoZWVsCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb252ID0gYmRpc3Rfd2luaW5zdDJ3aGVlbAogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiezB9Li4uICIuZm9ybWF0KGluc3RhbGxlcikpCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgICAgICAgICAgY29udihpbnN0YWxsZXIsIGRlc3RfZGlyKQogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiT0tcbiIpCgpkZWYgcGFyc2VyKCk6CiAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQogICAgcyA9IHAuYWRkX3N1YnBhcnNlcnMoaGVscD0iY29tbWFuZHMiKQoKICAgIGRlZiBrZXlnZW5fZihhcmdzKToKICAgICAgICBrZXlnZW4oKQogICAga2V5Z2VuX3BhcnNlciA9IHMuYWRkX3BhcnNlcigna2V5Z2VuJywgaGVscD0nR2VuZXJhdGUgc2lnbmluZyBrZXknKQogICAga2V5Z2VuX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1rZXlnZW5fZikKCiAgICBkZWYgc2lnbl9mKGFyZ3MpOgogICAgICAgIHNpZ24oYXJncy53aGVlbGZpbGUpCiAgICBzaWduX3BhcnNlciA9IHMuYWRkX3BhcnNlcignc2lnbicsIGhlbHA9J1NpZ24gd2hlZWwnKQogICAgc2lnbl9wYXJzZXIuYWRkX2FyZ3VtZW50KCd3aGVlbGZpbGUnLCBoZWxwPSdXaGVlbCBmaWxlJykKICAgIHNpZ25fcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXNpZ25fZikKCiAgICBkZWYgdW5zaWduX2YoYXJncyk6CiAgICAgICAgdW5zaWduKGFyZ3Mud2hlZWxmaWxlKQogICAgdW5zaWduX3BhcnNlciA9IHMuYWRkX3BhcnNlcigndW5zaWduJywgaGVscD11bnNpZ24uX19kb2NfXykKICAgIHVuc2lnbl9wYXJzZXIuYWRkX2FyZ3VtZW50KCd3aGVlbGZpbGUnLCBoZWxwPSdXaGVlbCBmaWxlJykKICAgIHVuc2lnbl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9dW5zaWduX2YpCgogICAgZGVmIHZlcmlmeV9mKGFyZ3MpOgogICAgICAgIHZlcmlmeShhcmdzLndoZWVsZmlsZSkKICAgIHZlcmlmeV9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ3ZlcmlmeScsIGhlbHA9dmVyaWZ5Ll9fZG9jX18pCiAgICB2ZXJpZnlfcGFyc2VyLmFkZF9hcmd1bWVudCgnd2hlZWxmaWxlJywgaGVscD0nV2hlZWwgZmlsZScpCiAgICB2ZXJpZnlfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXZlcmlmeV9mKQoKICAgIGRlZiB1bnBhY2tfZihhcmdzKToKICAgICAgICB1bnBhY2soYXJncy53aGVlbGZpbGUsIGFyZ3MuZGVzdCkKICAgIHVucGFja19wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ3VucGFjaycsIGhlbHA9J1VucGFjayB3aGVlbCcpCiAgICB1bnBhY2tfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZXN0JywgJy1kJywgaGVscD0nRGVzdGluYXRpb24gZGlyZWN0b3J5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Jy4nKQogICAgdW5wYWNrX3BhcnNlci5hZGRfYXJndW1lbnQoJ3doZWVsZmlsZScsIGhlbHA9J1doZWVsIGZpbGUnKQogICAgdW5wYWNrX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz11bnBhY2tfZikKCiAgICBkZWYgaW5zdGFsbF9mKGFyZ3MpOgogICAgICAgIGluc3RhbGwoYXJncy5yZXF1aXJlbWVudHMsIGFyZ3MucmVxdWlyZW1lbnRzX2ZpbGUsCiAgICAgICAgICAgICAgICBhcmdzLndoZWVsX2RpcnMsIGFyZ3MuZm9yY2UsIGFyZ3MubGlzdF9maWxlcykKICAgIGluc3RhbGxfcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdpbnN0YWxsJywgaGVscD0nSW5zdGFsbCB3aGVlbHMnKQogICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCdyZXF1aXJlbWVudHMnLCBuYXJncz0nKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUmVxdWlyZW1lbnRzIHRvIGluc3RhbGwuJykKICAgIGluc3RhbGxfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb3JjZScsIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdJbnN0YWxsIGluY29tcGF0aWJsZSB3aGVlbCBmaWxlcy4nKQogICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXdoZWVsLWRpcicsICctZCcsIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd3aGVlbF9kaXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdEaXJlY3RvcmllcyBjb250YWluaW5nIHdoZWVscy4nKQogICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXJlcXVpcmVtZW50cy1maWxlJywgJy1yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBIGZpbGUgY29udGFpbmluZyByZXF1aXJlbWVudHMgdG8gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsLiIpCiAgICBpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tbGlzdCcsICctbCcsIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0nbGlzdF9maWxlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJMaXN0IHdoZWVscyB3aGljaCB3b3VsZCBiZSBpbnN0YWxsZWQsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGRvbid0IGFjdHVhbGx5IGluc3RhbGwgYW55dGhpbmcuIikKICAgIGluc3RhbGxfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWluc3RhbGxfZikKCiAgICBkZWYgaW5zdGFsbF9zY3JpcHRzX2YoYXJncyk6CiAgICAgICAgaW5zdGFsbF9zY3JpcHRzKGFyZ3MuZGlzdHJpYnV0aW9ucykKICAgIGluc3RhbGxfc2NyaXB0c19wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ2luc3RhbGwtc2NyaXB0cycsIGhlbHA9J0luc3RhbGwgY29uc29sZV9zY3JpcHRzJykKICAgIGluc3RhbGxfc2NyaXB0c19wYXJzZXIuYWRkX2FyZ3VtZW50KCdkaXN0cmlidXRpb25zJywgbmFyZ3M9JyonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUmVnZW5lcmF0ZSBjb25zb2xlX3NjcmlwdHMgZm9yIHRoZXNlIGRpc3RyaWJ1dGlvbnMnKQogICAgaW5zdGFsbF9zY3JpcHRzX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1pbnN0YWxsX3NjcmlwdHNfZikKCiAgICBkZWYgY29udmVydF9mKGFyZ3MpOgogICAgICAgIGNvbnZlcnQoYXJncy5pbnN0YWxsZXJzLCBhcmdzLmRlc3RfZGlyLCBhcmdzLnZlcmJvc2UpCiAgICBjb252ZXJ0X3BhcnNlciA9IHMuYWRkX3BhcnNlcignY29udmVydCcsIGhlbHA9J0NvbnZlcnQgZWdnIG9yIHdpbmluc3QgdG8gd2hlZWwnKQogICAgY29udmVydF9wYXJzZXIuYWRkX2FyZ3VtZW50KCdpbnN0YWxsZXJzJywgbmFyZ3M9JyonLCBoZWxwPSdJbnN0YWxsZXJzIHRvIGNvbnZlcnQnKQogICAgY29udmVydF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlc3QtZGlyJywgJy1kJywgZGVmYXVsdD1vcy5wYXRoLmN1cmRpciwKICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IHRvIHN0b3JlIHdoZWVscyAoZGVmYXVsdCAlKGRlZmF1bHQpcykiKQogICAgY29udmVydF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLCAnLXYnLCBhY3Rpb249J3N0b3JlX3RydWUnKQogICAgY29udmVydF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9Y29udmVydF9mKQoKICAgIGRlZiB2ZXJzaW9uX2YoYXJncyk6CiAgICAgICAgZnJvbSAuLiBpbXBvcnQgX192ZXJzaW9uX18KICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJ3aGVlbCAlc1xuIiAlIF9fdmVyc2lvbl9fKQogICAgdmVyc2lvbl9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ3ZlcnNpb24nLCBoZWxwPSdQcmludCB2ZXJzaW9uIGFuZCBleGl0JykKICAgIHZlcnNpb25fcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXZlcnNpb25fZikKCiAgICBkZWYgaGVscF9mKGFyZ3MpOgogICAgICAgIHAucHJpbnRfaGVscCgpCiAgICBoZWxwX3BhcnNlciA9IHMuYWRkX3BhcnNlcignaGVscCcsIGhlbHA9J1Nob3cgdGhpcyBoZWxwJykKICAgIGhlbHBfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWhlbHBfZikKCiAgICByZXR1cm4gcAoKZGVmIG1haW4oKToKICAgIHAgPSBwYXJzZXIoKQogICAgYXJncyA9IHAucGFyc2VfYXJncygpCiAgICBpZiBub3QgaGFzYXR0cihhcmdzLCAnZnVuYycpOgogICAgICAgIHAucHJpbnRfaGVscCgpCiAgICBlbHNlOgogICAgICAgICMgWFhYIG9uIFB5dGhvbiAzLjMgd2UgZ2V0ICdhcmdzIGhhcyBubyBmdW5jJyByYXRoZXIgdGhhbiBzaG9ydCBoZWxwLgogICAgICAgIHRyeToKICAgICAgICAgICAgYXJncy5mdW5jKGFyZ3MpCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZXhjZXB0IFdoZWVsRXJyb3IgYXMgZToKICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShlLm1lc3NhZ2UgKyAiXG4iKQogICAgcmV0dXJuIDEKUEsDBBQAAAAAAAAAIQDP2DOyGhMAABoTAAAvAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3V0aWwucHkiIiJVdGlsaXR5IGZ1bmN0aW9ucy4iIiIKCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBiYXNlNjQKaW1wb3J0IGpzb24KaW1wb3J0IGhhc2hsaWIKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgT3JkZXJlZERpY3QgPSBkaWN0CgpfX2FsbF9fID0gWyd1cmxzYWZlX2I2NGVuY29kZScsICd1cmxzYWZlX2I2NGRlY29kZScsICd1dGY4JywKICAgICAgICAgICAndG9fanNvbicsICdmcm9tX2pzb24nLCAnbWF0Y2hlc19yZXF1aXJlbWVudCddCgpkZWYgdXJsc2FmZV9iNjRlbmNvZGUoZGF0YSk6CiAgICAiIiJ1cmxzYWZlX2I2NGVuY29kZSB3aXRob3V0IHBhZGRpbmciIiIKICAgIHJldHVybiBiYXNlNjQudXJsc2FmZV9iNjRlbmNvZGUoZGF0YSkucnN0cmlwKGJpbmFyeSgnPScpKQoKCmRlZiB1cmxzYWZlX2I2NGRlY29kZShkYXRhKToKICAgICIiInVybHNhZmVfYjY0ZGVjb2RlIHdpdGhvdXQgcGFkZGluZyIiIgogICAgcGFkID0gYic9JyAqICg0IC0gKGxlbihkYXRhKSAmIDMpKQogICAgcmV0dXJuIGJhc2U2NC51cmxzYWZlX2I2NGRlY29kZShkYXRhICsgcGFkKQoKCmRlZiB0b19qc29uKG8pOgogICAgJycnQ29udmVydCBnaXZlbiBkYXRhIHRvIEpTT04uJycnCiAgICByZXR1cm4ganNvbi5kdW1wcyhvLCBzb3J0X2tleXM9VHJ1ZSkKCgpkZWYgZnJvbV9qc29uKGopOgogICAgJycnRGVjb2RlIGEgSlNPTiBwYXlsb2FkLicnJwogICAgcmV0dXJuIGpzb24ubG9hZHMoaikKCmRlZiBvcGVuX2Zvcl9jc3YobmFtZSwgbW9kZSk6CiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICBubCA9IHt9CiAgICAgICAgYmluID0gJ2InCiAgICBlbHNlOgogICAgICAgIG5sID0geyAnbmV3bGluZSc6ICcnIH0KICAgICAgICBiaW4gPSAnJwogICAgcmV0dXJuIG9wZW4obmFtZSwgbW9kZSArIGJpbiwgKipubCkKCnRyeToKICAgIHVuaWNvZGUKCiAgICBkZWYgdXRmOChkYXRhKToKICAgICAgICAnJydVdGYtOCBlbmNvZGUgZGF0YS4nJycKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpOgogICAgICAgICAgICByZXR1cm4gZGF0YS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gZGF0YQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIHV0ZjgoZGF0YSk6CiAgICAgICAgJycnVXRmLTggZW5jb2RlIGRhdGEuJycnCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzdHIpOgogICAgICAgICAgICByZXR1cm4gZGF0YS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gZGF0YQoKCnRyeToKICAgICMgRm9yIGVuY29kaW5nIGFzY2lpIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gYnl0ZXN0cmluZ3MsIGFzIGlzIHJlcGVhdGVkbHkKICAgICMgbmVjZXNzYXJ5IGluIEpTT04tYmFzZWQgY3J5cHRvIHVuZGVyIFB5dGhvbiAzCiAgICB1bmljb2RlCiAgICBkZWYgbmF0aXZlKHMpOgogICAgICAgIHJldHVybiBzCiAgICBkZWYgYmluYXJ5KHMpOgogICAgICAgIGlmIGlzaW5zdGFuY2UocywgdW5pY29kZSk6CiAgICAgICAgICAgIHJldHVybiBzLmVuY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiBzCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgbmF0aXZlKHMpOgogICAgICAgIGlmIGlzaW5zdGFuY2UocywgYnl0ZXMpOgogICAgICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gcwogICAgZGVmIGJpbmFyeShzKToKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIHN0cik6CiAgICAgICAgICAgIHJldHVybiBzLmVuY29kZSgnYXNjaWknKQoKY2xhc3MgSGFzaGluZ0ZpbGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmZCwgaGFzaHR5cGU9J3NoYTI1NicpOgogICAgICAgIHNlbGYuZmQgPSBmZAogICAgICAgIHNlbGYuaGFzaHR5cGUgPSBoYXNodHlwZQogICAgICAgIHNlbGYuaGFzaCA9IGhhc2hsaWIubmV3KGhhc2h0eXBlKQogICAgICAgIHNlbGYubGVuZ3RoID0gMAogICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgogICAgICAgIHNlbGYuaGFzaC51cGRhdGUoZGF0YSkKICAgICAgICBzZWxmLmxlbmd0aCArPSBsZW4oZGF0YSkKICAgICAgICBzZWxmLmZkLndyaXRlKGRhdGEpCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5mZC5jbG9zZSgpCiAgICBkZWYgZGlnZXN0KHNlbGYpOgogICAgICAgIGlmIHNlbGYuaGFzaHR5cGUgPT0gJ21kNSc6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmhhc2guaGV4ZGlnZXN0KCkKICAgICAgICBkaWdlc3QgPSBzZWxmLmhhc2guZGlnZXN0KCkKICAgICAgICByZXR1cm4gc2VsZi5oYXNodHlwZSArICc9JyArIG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShkaWdlc3QpKQoKY2xhc3MgT3JkZXJlZERlZmF1bHREaWN0KE9yZGVyZWREaWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICBzZWxmLmRlZmF1bHRfZmFjdG9yeSA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3QgKGFyZ3NbMF0gaXMgTm9uZSBvciBjYWxsYWJsZShhcmdzWzBdKSk6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUgb3IgTm9uZScpCiAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9mYWN0b3J5ID0gYXJnc1swXQogICAgICAgICAgICBhcmdzID0gYXJnc1sxOl0KICAgICAgICBzdXBlcihPcmRlcmVkRGVmYXVsdERpY3QsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgX19taXNzaW5nX18gKHNlbGYsIGtleSk6CiAgICAgICAgaWYgc2VsZi5kZWZhdWx0X2ZhY3RvcnkgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQogICAgICAgIHNlbGZba2V5XSA9IGRlZmF1bHQgPSBzZWxmLmRlZmF1bHRfZmFjdG9yeSgpCiAgICAgICAgcmV0dXJuIGRlZmF1bHQKCmlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgogICAgaW1wb3J0IGN0eXBlcy53aW50eXBlcwogICAgIyBDU0lETF9BUFBEQVRBIGZvciByZWZlcmVuY2UgLSBub3QgdXNlZCBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKICAgICMgZGlyc3BlYywgd2hpY2ggdXNlcyBMT0NBTF9BUFBEQVRBIGFuZCBDT01NT05fQVBQREFUQSBpbiB0aGF0IG9yZGVyCiAgICBjc2lkbCA9IGRpY3QoQ1NJRExfQVBQREFUQT0yNiwgQ1NJRExfTE9DQUxfQVBQREFUQT0yOCwKICAgICAgICAgICAgQ1NJRExfQ09NTU9OX0FQUERBVEE9MzUpCiAgICBkZWYgZ2V0X3BhdGgobmFtZSk6CiAgICAgICAgU0hHRlBfVFlQRV9DVVJSRU5UID0gMAogICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoY3R5cGVzLndpbnR5cGVzLk1BWF9QQVRIKQogICAgICAgIGN0eXBlcy53aW5kbGwuc2hlbGwzMi5TSEdldEZvbGRlclBhdGhXKDAsIGNzaWRsW25hbWVdLCAwLCBTSEdGUF9UWVBFX0NVUlJFTlQsIGJ1ZikKICAgICAgICByZXR1cm4gYnVmLnZhbHVlCgogICAgZGVmIHNhdmVfY29uZmlnX3BhdGgoKnJlc291cmNlKToKICAgICAgICBhcHBkYXRhID0gZ2V0X3BhdGgoIkNTSURMX0xPQ0FMX0FQUERBVEEiKQogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYXBwZGF0YSwgKnJlc291cmNlKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQogICAgICAgIHJldHVybiBwYXRoCiAgICBkZWYgbG9hZF9jb25maWdfcGF0aHMoKnJlc291cmNlKToKICAgICAgICBpZHMgPSBbIkNTSURMX0xPQ0FMX0FQUERBVEEiLCAiQ1NJRExfQ09NTU9OX0FQUERBVEEiXQogICAgICAgIGZvciBpZCBpbiBpZHM6CiAgICAgICAgICAgIGJhc2UgPSBnZXRfcGF0aChpZCkKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCAqcmVzb3VyY2UpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICAgICAgeWllbGQgcGF0aAplbHNlOgogICAgZGVmIHNhdmVfY29uZmlnX3BhdGgoKnJlc291cmNlKToKICAgICAgICBpbXBvcnQgeGRnLkJhc2VEaXJlY3RvcnkKICAgICAgICByZXR1cm4geGRnLkJhc2VEaXJlY3Rvcnkuc2F2ZV9jb25maWdfcGF0aCgqcmVzb3VyY2UpCiAgICBkZWYgbG9hZF9jb25maWdfcGF0aHMoKnJlc291cmNlKToKICAgICAgICBpbXBvcnQgeGRnLkJhc2VEaXJlY3RvcnkKICAgICAgICByZXR1cm4geGRnLkJhc2VEaXJlY3RvcnkubG9hZF9jb25maWdfcGF0aHMoKnJlc291cmNlKQoKZGVmIG1hdGNoZXNfcmVxdWlyZW1lbnQocmVxLCB3aGVlbHMpOgogICAgIiIiTGlzdCBvZiB3aGVlbHMgbWF0Y2hpbmcgYSByZXF1aXJlbWVudC4KCiAgICA6cGFyYW0gcmVxOiBUaGUgcmVxdWlyZW1lbnQgdG8gc2F0aXNmeQogICAgOnBhcmFtIHdoZWVsczogTGlzdCBvZiB3aGVlbHMgdG8gc2VhcmNoLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24sIFJlcXVpcmVtZW50CiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgdXNlIHJlcXVpcmVtZW50cyB3aXRob3V0IHBrZ19yZXNvdXJjZXMiKQoKICAgIHJlcSA9IFJlcXVpcmVtZW50LnBhcnNlKHJlcSkKCiAgICBzZWxlY3RlZCA9IFtdCiAgICBmb3Igd2YgaW4gd2hlZWxzOgogICAgICAgIGYgPSB3Zi5wYXJzZWRfZmlsZW5hbWUKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT1mLmdyb3VwKCJuYW1lIiksIHZlcnNpb249Zi5ncm91cCgidmVyIikpCiAgICAgICAgaWYgZGlzdCBpbiByZXE6CiAgICAgICAgICAgIHNlbGVjdGVkLmFwcGVuZCh3ZikKICAgIHJldHVybiBzZWxlY3RlZApQSwMEFAAAAAAAAAAhAPO05Ci3HgAAtx4AADgAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvd2luaW5zdDJ3aGVlbC5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgppbXBvcnQgb3MucGF0aAppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHdoZWVsLmJkaXN0X3doZWVsCmltcG9ydCBkaXN0dXRpbHMuZGlzdApmcm9tIGRpc3R1dGlscy5hcmNoaXZlX3V0aWwgaW1wb3J0IG1ha2VfYXJjaGl2ZQpmcm9tIHNodXRpbCBpbXBvcnQgcm10cmVlCmZyb20gd2hlZWwuYXJjaGl2ZSBpbXBvcnQgYXJjaGl2ZV93aGVlbGZpbGUKZnJvbSBhcmdwYXJzZSBpbXBvcnQgQXJndW1lbnRQYXJzZXIKZnJvbSBnbG9iIGltcG9ydCBpZ2xvYgoKZWdnX2luZm9fcmUgPSByZS5jb21waWxlKHInJycoXnwvKSg/UDxuYW1lPlteL10rPyktKD9QPHZlcj4uKz8pCiAgICAoLSg/UDxweXZlcj4uKz8pKT8oLSg/UDxhcmNoPi4rPykpPy5lZ2ctaW5mbygvfCQpJycnLCByZS5WRVJCT1NFKQoKZGVmIHBhcnNlX2luZm8od2luaW5mb19uYW1lLCBlZ2dpbmZvX25hbWUpOgogICAgIiIiRXh0cmFjdCBtZXRhZGF0YSBmcm9tIGZpbGVuYW1lcy4KICAgIAogICAgRXh0cmFjdHMgdGhlIDQgbWV0YWRhdGFpdGVtcyBuZWVkZWQgKG5hbWUsIHZlcnNpb24sIHB5dmVyc2lvbiwgYXJjaCkgZnJvbQogICAgdGhlIGluc3RhbGxlciBmaWxlbmFtZSBhbmQgdGhlIG5hbWUgb2YgdGhlIGVnZy1pbmZvIGRpcmVjdG9yeSBlbWJlZGRlZCBpbgogICAgdGhlIHppcGZpbGUgKGlmIGFueSkuCgogICAgVGhlIGVnZ2luZm8gZmlsZW5hbWUgaGFzIHRoZSBmb3JtYXQ6OgoKICAgICAgICBuYW1lLXZlcigtcHl2ZXIpKC1hcmNoKS5lZ2ctaW5mbwoKICAgIFRoZSBpbnN0YWxsZXIgZmlsZW5hbWUgaGFzIHRoZSBmb3JtYXQ6OgoKICAgICAgICBuYW1lLXZlci5hcmNoKC1weXZlcikuZXhlCgogICAgU29tZSB0aGluZ3MgdG8gbm90ZToKCiAgICAxLiBUaGUgaW5zdGFsbGVyIGZpbGVuYW1lIGlzIG5vdCBkZWZpbml0aXZlLiBBbiBpbnN0YWxsZXIgY2FuIGJlIHJlbmFtZWQKICAgICAgIGFuZCB3b3JrIHBlcmZlY3RseSB3ZWxsIGFzIGFuIGluc3RhbGxlci4gU28gbW9yZSByZWxpYWJsZSBkYXRhIHNob3VsZAogICAgICAgYmUgdXNlZCB3aGVuZXZlciBwb3NzaWJsZS4KICAgIDIuIFRoZSBlZ2ctaW5mbyBkYXRhIHNob3VsZCBiZSBwcmVmZXJyZWQgZm9yIHRoZSBuYW1lIGFuZCB2ZXJzaW9uLCBiZWNhdXNlCiAgICAgICB0aGVzZSBjb21lIHN0cmFpZ2h0IGZyb20gdGhlIGRpc3R1dGlscyBtZXRhZGF0YSwgYW5kIGFyZSBtYW5kYXRvcnkuCiAgICAzLiBUaGUgcHl2ZXIgZnJvbSB0aGUgZWdnLWluZm8gZGF0YSBzaG91bGQgYmUgaWdub3JlZCwgYXMgaXQgaXMKICAgICAgIGNvbnN0cnVjdGVkIGZyb20gdGhlIHZlcnNpb24gb2YgUHl0aG9uIHVzZWQgdG8gYnVpbGQgdGhlIGluc3RhbGxlciwKICAgICAgIHdoaWNoIGlzIGlycmVsZXZhbnQgLSB0aGUgaW5zdGFsbGVyIGZpbGVuYW1lIGlzIGNvcnJlY3QgaGVyZSAoZXZlbiB0bwogICAgICAgdGhlIHBvaW50IHRoYXQgd2hlbiBpdCdzIG5vdCB0aGVyZSwgYW55IHZlcnNpb24gaXMgaW1wbGllZCkuCiAgICA0LiBUaGUgYXJjaGl0ZWN0dXJlIG11c3QgYmUgdGFrZW4gZnJvbSB0aGUgaW5zdGFsbGVyIGZpbGVuYW1lLCBhcyBpdCBpcwogICAgICAgbm90IGluY2x1ZGVkIGluIHRoZSBlZ2ctaW5mbyBkYXRhLgogICAgNS4gQXJjaGl0ZWN0dXJlLW5ldXRyYWwgaW5zdGFsbGVycyBzdGlsbCBoYXZlIGFuIGFyY2hpdGVjdHVyZSBiZWNhdXNlIHRoZQogICAgICAgaW5zdGFsbGVyIGZvcm1hdCBpdHNlbGYgKGJlaW5nIGV4ZWN1dGFibGUpIGlzIGFyY2hpdGVjdHVyZS1zcGVjaWZpYy4gV2UKICAgICAgIHNob3VsZCB0aGVyZWZvcmUgaWdub3JlIHRoZSBhcmNoaXRlY3R1cmUgaWYgdGhlIGNvbnRlbnQgaXMgcHVyZS1weXRob24uCiAgICAiIiIKCiAgICBlZ2dpbmZvID0gTm9uZQogICAgaWYgZWdnaW5mb19uYW1lOgogICAgICAgIGVnZ2luZm8gPSBlZ2dfaW5mb19yZS5zZWFyY2goZWdnaW5mb19uYW1lKQogICAgICAgIGlmIG5vdCBlZ2dpbmZvOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFZ2cgaW5mbyBmaWxlbmFtZSAlcyBpcyBub3QgdmFsaWQiICUKICAgICAgICAgICAgICAgICAgICAoZWdnaW5mb19uYW1lLCkpCgogICAgIyBQYXJzZSB0aGUgd2luaW5zdCBmaWxlbmFtZQogICAgIyAxLiBEaXN0cmlidXRpb24gbmFtZSAodXAgdG8gdGhlIGZpcnN0ICctJykKICAgIHdfbmFtZSwgc2VwLCByZXN0ID0gd2luaW5mb19uYW1lLnBhcnRpdGlvbignLScpCiAgICBpZiBub3Qgc2VwOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkluc3RhbGxlciBmaWxlbmFtZSAlcyBpcyBub3QgdmFsaWQiICUKICAgICAgICAgICAgICAgICh3aW5pbmZvX25hbWUsKSkKICAgICMgU3RyaXAgJy5leGUnCiAgICByZXN0ID0gcmVzdFs6LTRdCiAgICAjIDIuIFB5dGhvbiB2ZXJzaW9uIChmcm9tIHRoZSBsYXN0ICctJywgbXVzdCBzdGFydCB3aXRoICdweScpCiAgICByZXN0Miwgc2VwLCB3X3B5dmVyID0gcmVzdC5ycGFydGl0aW9uKCctJykKICAgIGlmIHNlcCBhbmQgd19weXZlci5zdGFydHN3aXRoKCdweScpOgogICAgICAgIHJlc3QgPSByZXN0MgogICAgICAgIHdfcHl2ZXIgPSB3X3B5dmVyLnJlcGxhY2UoJy4nLCAnJykKICAgIGVsc2U6CiAgICAgICAgIyBOb3QgdmVyc2lvbiBzcGVjaWZpYyAtIHVzZSBweTIucHkzLiBXaGlsZSBpdCBpcyBwb3NzaWJsZSB0aGF0CiAgICAgICAgIyBwdXJlLVB5dGhvbiBjb2RlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggYm90aCBQeXRob24gMiBhbmQgMywgdGhlcmUKICAgICAgICAjIGlzIG5vIHdheSBvZiBrbm93aW5nIGZyb20gdGhlIHdpbmluc3QgZm9ybWF0LCBzbyB3ZSBhc3N1bWUgdGhlIGJlc3QKICAgICAgICAjIGhlcmUgKHRoZSB1c2VyIGNhbiBhbHdheXMgbWFudWFsbHkgcmVuYW1lIHRoZSB3aGVlbCB0byBiZSBtb3JlCiAgICAgICAgIyByZXN0cmljdGl2ZSBpZiBuZWVkZWQpLgogICAgICAgIHdfcHl2ZXIgPSAncHkyLnB5MycKICAgICMgMy4gVmVyc2lvbiBhbmQgYXJjaGl0ZWN0dXJlCiAgICB3X3Zlciwgc2VwLCB3X2FyY2ggPSByZXN0LnJwYXJ0aXRpb24oJy4nKQogICAgaWYgbm90IHNlcDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnN0YWxsZXIgZmlsZW5hbWUgJXMgaXMgbm90IHZhbGlkIiAlCiAgICAgICAgICAgICAgICAod2luaW5mb19uYW1lLCkpCgogICAgaWYgZWdnaW5mbzoKICAgICAgICB3X25hbWUgPSBlZ2dpbmZvLmdyb3VwKCduYW1lJykKICAgICAgICB3X3ZlciA9IGVnZ2luZm8uZ3JvdXAoJ3ZlcicpCgogICAgcmV0dXJuIGRpY3QobmFtZT13X25hbWUsIHZlcj13X3ZlciwgYXJjaD13X2FyY2gsIHB5dmVyPXdfcHl2ZXIpCgpkZWYgYmRpc3Rfd2luaW5zdDJ3aGVlbChwYXRoLCBkZXN0X2Rpcj1vcy5wYXRoLmN1cmRpcik6CiAgICBiZHcgPSB6aXBmaWxlLlppcEZpbGUocGF0aCkKCiAgICAjIFNlYXJjaCBmb3IgZWdnLWluZm8gaW4gdGhlIGFyY2hpdmUKICAgIGVnZ2luZm9fbmFtZSA9IE5vbmUKICAgIGZvciBmaWxlbmFtZSBpbiBiZHcubmFtZWxpc3QoKToKICAgICAgICBpZiAnLmVnZy1pbmZvJyBpbiBmaWxlbmFtZToKICAgICAgICAgICAgZWdnaW5mb19uYW1lID0gZmlsZW5hbWUKICAgICAgICAgICAgYnJlYWsKCiAgICBpbmZvID0gcGFyc2VfaW5mbyhvcy5wYXRoLmJhc2VuYW1lKHBhdGgpLCBlZ2dpbmZvX25hbWUpCgogICAgcm9vdF9pc19wdXJlbGliID0gVHJ1ZQogICAgZm9yIHppcGluZm8gaW4gYmR3LmluZm9saXN0KCk6CiAgICAgICAgaWYgemlwaW5mby5maWxlbmFtZS5zdGFydHN3aXRoKCdQTEFUTElCJyk6CiAgICAgICAgICAgIHJvb3RfaXNfcHVyZWxpYiA9IEZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiByb290X2lzX3B1cmVsaWI6CiAgICAgICAgcGF0aHMgPSB7J3B1cmVsaWInOiAnJ30KICAgIGVsc2U6CiAgICAgICAgcGF0aHMgPSB7J3BsYXRsaWInOiAnJ30KCiAgICBkaXN0X2luZm8gPSAiJShuYW1lKXMtJSh2ZXIpcyIgJSBpbmZvCiAgICBkYXRhZGlyID0gIiVzLmRhdGEvIiAlIGRpc3RfaW5mbwoKICAgICMgcmV3cml0ZSBwYXRocyB0byB0cmljayBaaXBGaWxlIGludG8gZXh0cmFjdGluZyBhbiBlZ2cKICAgICMgWFhYIGdyYWIgd2luaW5zdCAuaW5pIC0gYmV0d2VlbiAuZXhlLCBwYWRkaW5nLCBhbmQgZmlyc3QgemlwIGZpbGUuCiAgICBtZW1iZXJzID0gW10KICAgIGVnZ2luZm9fbmFtZSA9ICcnCiAgICBmb3IgemlwaW5mbyBpbiBiZHcuaW5mb2xpc3QoKToKICAgICAgICBrZXksIGJhc2VuYW1lID0gemlwaW5mby5maWxlbmFtZS5zcGxpdCgnLycsIDEpCiAgICAgICAga2V5ID0ga2V5Lmxvd2VyKCkKICAgICAgICBiYXNlcGF0aCA9IHBhdGhzLmdldChrZXksIE5vbmUpCiAgICAgICAgaWYgYmFzZXBhdGggaXMgTm9uZToKICAgICAgICAgICAgYmFzZXBhdGggPSBkYXRhZGlyICsga2V5Lmxvd2VyKCkgKyAnLycKICAgICAgICBvbGRuYW1lID0gemlwaW5mby5maWxlbmFtZQogICAgICAgIG5ld25hbWUgPSBiYXNlcGF0aCArIGJhc2VuYW1lCiAgICAgICAgemlwaW5mby5maWxlbmFtZSA9IG5ld25hbWUKICAgICAgICBkZWwgYmR3Lk5hbWVUb0luZm9bb2xkbmFtZV0KICAgICAgICBiZHcuTmFtZVRvSW5mb1tuZXduYW1lXSA9IHppcGluZm8KICAgICAgICAjIENvbGxlY3QgbWVtYmVyIG5hbWVzLCBidXQgb21pdCAnJyAoZnJvbSBhbiBlbnRyeSBsaWtlICJQTEFUTElCLyIKICAgICAgICBpZiBuZXduYW1lOgogICAgICAgICAgICBtZW1iZXJzLmFwcGVuZChuZXduYW1lKQogICAgICAgICMgUmVtZW1iZXIgZWdnLWluZm8gbmFtZSBmb3IgdGhlIGVnZzJkaXN0IGNhbGwgYmVsb3cKICAgICAgICBpZiBub3QgZWdnaW5mb19uYW1lOgogICAgICAgICAgICBpZiBuZXduYW1lLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKICAgICAgICAgICAgICAgIGVnZ2luZm9fbmFtZSA9IG5ld25hbWUKICAgICAgICAgICAgZWxpZiAnLmVnZy1pbmZvLycgaW4gbmV3bmFtZToKICAgICAgICAgICAgICAgIGVnZ2luZm9fbmFtZSwgc2VwLCBfID0gbmV3bmFtZS5ycGFydGl0aW9uKCcvJykKICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSJfYjJ3IikKICAgIGJkdy5leHRyYWN0YWxsKGRpciwgbWVtYmVycykKCiAgICAjIGVnZzJ3aGVlbAogICAgYWJpID0gJ25vbmUnCiAgICBweXZlciA9IGluZm9bJ3B5dmVyJ10KICAgIGFyY2ggPSAoaW5mb1snYXJjaCddIG9yICdhbnknKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgIyBXaW5pbnN0IGluc3RhbGxlcnMgYWx3YXlzIGhhdmUgYXJjaCBldmVuIGlmIHRoZXkgYXJlIG5vdAogICAgIyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgKGJlY2F1c2UgdGhlIGZvcm1hdCBpdHNlbGYgaXMpLgogICAgIyBTbywgYXNzdW1lIHRoZSBjb250ZW50IGlzIGFyY2hpdGVjdHVyZS1uZXV0cmFsIGlmIHJvb3QgaXMgcHVyZWxpYi4KICAgIGlmIHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBhcmNoID0gJ2FueScKICAgICMgSWYgdGhlIGluc3RhbGxlciBpcyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMsIGl0J3MgYWxtb3N0IGNlcnRhaW5seSBhbHNvCiAgICAjIENQeXRob24tc3BlY2lmaWMuCiAgICBpZiBhcmNoICE9ICdhbnknOgogICAgICAgIHB5dmVyID0gcHl2ZXIucmVwbGFjZSgncHknLCAnY3AnKQogICAgd2hlZWxfbmFtZSA9ICctJy5qb2luKCgKICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHl2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWJpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2gKICAgICAgICAgICAgICAgICAgICAgICAgICApKQogICAgaWYgcm9vdF9pc19wdXJlbGliOgogICAgICAgIGJ3ID0gd2hlZWwuYmRpc3Rfd2hlZWwuYmRpc3Rfd2hlZWwoZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uKCkpCiAgICBlbHNlOgogICAgICAgIGJ3ID0gX2JkaXN0X3doZWVsX3RhZyhkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24oKSkKCiAgICBidy5yb290X2lzX3B1cmUgPSByb290X2lzX3B1cmVsaWIKICAgIGJ3LnB5dGhvbl90YWcgPSBweXZlcgogICAgYncucGxhdF9uYW1lX3N1cHBsaWVkID0gVHJ1ZQogICAgYncucGxhdF9uYW1lID0gaW5mb1snYXJjaCddIG9yICdhbnknCgogICAgaWYgbm90IHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBidy5mdWxsX3RhZ19zdXBwbGllZCA9IFRydWUKICAgICAgICBidy5mdWxsX3RhZyA9IChweXZlciwgYWJpLCBhcmNoKQoKICAgIGRpc3RfaW5mb19kaXIgPSBvcy5wYXRoLmpvaW4oZGlyLCAnJXMuZGlzdC1pbmZvJyAlIGRpc3RfaW5mbykKICAgIGJ3LmVnZzJkaXN0KG9zLnBhdGguam9pbihkaXIsIGVnZ2luZm9fbmFtZSksIGRpc3RfaW5mb19kaXIpCiAgICBidy53cml0ZV93aGVlbGZpbGUoZGlzdF9pbmZvX2RpciwgZ2VuZXJhdG9yPSd3aW5pbnN0MndoZWVsJykKICAgIGJ3LndyaXRlX3JlY29yZChkaXIsIGRpc3RfaW5mb19kaXIpCiAgICAKICAgIGFyY2hpdmVfd2hlZWxmaWxlKG9zLnBhdGguam9pbihkZXN0X2Rpciwgd2hlZWxfbmFtZSksIGRpcikKICAgIHJtdHJlZShkaXIpCgoKY2xhc3MgX2JkaXN0X3doZWVsX3RhZyh3aGVlbC5iZGlzdF93aGVlbC5iZGlzdF93aGVlbCk6CiAgICAjIGFsbG93IHRoZSBjbGllbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZ2VuZXJhdGVkIHdoZWVsIHRhZwogICAgIyBUaGUgZGVmYXVsdCBiZGlzdF93aGVlbCBpbXBsZW1lbnRhdGlvbiB1c2VzIHB5dGhvbiBhbmQgYWJpIHRhZ3MKICAgICMgb2YgdGhlIHJ1bm5pbmcgcHl0aG9uIHByb2Nlc3MuIFRoaXMgaXMgbm90IHN1aXRhYmxlIGZvcgogICAgIyBnZW5lcmF0aW5nL3JlcGFja2FnaW5nIHByZWJ1aWxkIGJpbmFyaWVzLgoKICAgIGZ1bGxfdGFnX3N1cHBsaWVkID0gRmFsc2UKICAgIGZ1bGxfdGFnID0gTm9uZSAgIyBOb25lIG9yIGEgKHB5dGFnLCBzb2FiaXRhZywgcGxhdHRhZykgdHJpcGxlCgogICAgZGVmIGdldF90YWcoc2VsZik6CiAgICAgICAgaWYgc2VsZi5mdWxsX3RhZ19zdXBwbGllZCBhbmQgc2VsZi5mdWxsX3RhZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZnVsbF90YWcKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX2JkaXN0X3doZWVsX3RhZywgc2VsZikuZ2V0X3RhZygpCgoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IEFyZ3VtZW50UGFyc2VyKCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2luc3RhbGxlcnMnLCBuYXJncz0nKicsIGhlbHA9Ikluc3RhbGxlcnMgdG8gY29udmVydCIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlc3QtZGlyJywgJy1kJywgZGVmYXVsdD1vcy5wYXRoLmN1cmRpciwKICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IHRvIHN0b3JlIHdoZWVscyAoZGVmYXVsdCAlKGRlZmF1bHQpcykiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdzdG9yZV90cnVlJykKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgICBmb3IgcGF0IGluIGFyZ3MuaW5zdGFsbGVyczoKICAgICAgICBmb3IgaW5zdGFsbGVyIGluIGlnbG9iKHBhdCk6CiAgICAgICAgICAgIGlmIGFyZ3MudmVyYm9zZToKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoInswfS4uLiAiLmZvcm1hdChpbnN0YWxsZXIpKQogICAgICAgICAgICBiZGlzdF93aW5pbnN0MndoZWVsKGluc3RhbGxlciwgYXJncy5kZXN0X2RpcikKICAgICAgICAgICAgaWYgYXJncy52ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiT0tcbiIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAIgAAAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAI+hjYY9MgAAPTIAAB4AAABydWxlc19weXRob24vcGFja2FnaW5nL3BpcHRvb2wjIS91c3IvYmluL2VudiBweXRob24KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgemlwZmlsZQoKIyBSZXR1cm4gVHJ1ZSBpZiBydW5uaW5nIG9uIFdpbmRvd3MKZGVmIElzV2luZG93cygpOgogIHJldHVybiBvcy5uYW1lID09ICdudCcKCmRlZiBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgocGF0aCk6CiAgIiIiCiAgQWRkaW5nIFVOQyBwcmVmaXggYWZ0ZXIgZ2V0dGluZyBhIG5vcm1hbGl6ZWQgYWJzb2x1dGUgV2luZG93cyBwYXRoLAogIGl0J3Mgbm8tb3AgZm9yIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyBvciBpZiBydW5uaW5nIHVuZGVyIHB5dGhvbjIuCiAgIiIiCiAgcGF0aCA9IHBhdGguc3RyaXAoKQoKICAjIE5vIG5lZWQgdG8gYWRkIHByZWZpeCBmb3Igbm9uLVdpbmRvd3MgcGxhdGZvcm1zLgogICMgQW5kIFxcP1wgZG9lc24ndCB3b3JrIGluIHB5dGhvbiAyCiAgaWYgbm90IElzV2luZG93cygpIG9yIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgcmV0dXJuIHBhdGgKCiAgIyBMZXRzIHN0YXJ0IHRoZSB1bmljb2RlIGZ1bgogIHVuaWNvZGVfcHJlZml4ID0gIlxcXFw/XFwiCiAgaWYgcGF0aC5zdGFydHN3aXRoKHVuaWNvZGVfcHJlZml4KToKICAgIHJldHVybiBwYXRoCgogICMgb3MucGF0aC5hYnNwYXRoIHJldHVybnMgYSBub3JtYWxpemVkIGFic29sdXRlIHBhdGgKICByZXR1cm4gdW5pY29kZV9wcmVmaXggKyBvcy5wYXRoLmFic3BhdGgocGF0aCkKCmRlZiBIYXNXaW5kb3dzRXhlY3V0YWJsZUV4dGVuc2lvbihwYXRoKToKICByZXR1cm4gcGF0aC5lbmRzd2l0aCgnLmV4ZScpIG9yIHBhdGguZW5kc3dpdGgoJy5jb20nKSBvciBwYXRoLmVuZHN3aXRoKCcuYmF0JykKClBZVEhPTl9CSU5BUlkgPSAnYmF6ZWxfdG9vbHMvdG9vbHMvcHl0aG9uL3B5M3dyYXBwZXIuc2gnCmlmIElzV2luZG93cygpIGFuZCBub3QgSGFzV2luZG93c0V4ZWN1dGFibGVFeHRlbnNpb24oUFlUSE9OX0JJTkFSWSk6CiAgUFlUSE9OX0JJTkFSWSA9IFBZVEhPTl9CSU5BUlkgKyAnLmV4ZScKCiMgRmluZCBhIGZpbGUgaW4gYSBnaXZlbiBzZWFyY2ggcGF0aC4KZGVmIFNlYXJjaFBhdGgobmFtZSk6CiAgc2VhcmNoX3BhdGggPSBvcy5nZXRlbnYoJ1BBVEgnLCBvcy5kZWZwYXRoKS5zcGxpdChvcy5wYXRoc2VwKQogIGZvciBkaXJlY3RvcnkgaW4gc2VhcmNoX3BhdGg6CiAgICBpZiBkaXJlY3RvcnkgPT0gJyc6IGNvbnRpbnVlCiAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSkKICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpIGFuZCBvcy5hY2Nlc3MocGF0aCwgb3MuWF9PSyk6CiAgICAgIHJldHVybiBwYXRoCiAgcmV0dXJuIE5vbmUKCmRlZiBJc1J1bm5pbmdGcm9tWmlwKCk6CiAgcmV0dXJuIEZhbHNlCgojIEZpbmQgdGhlIHJlYWwgUHl0aG9uIGJpbmFyeSBpZiBpdCdzIG5vdCBhIG5vcm1hbCBhYnNvbHV0ZSBwYXRoCmRlZiBGaW5kUHl0aG9uQmluYXJ5KG1vZHVsZV9zcGFjZSk6CiAgaWYgUFlUSE9OX0JJTkFSWS5zdGFydHN3aXRoKCcvLycpOgogICAgIyBDYXNlIDE6IFBhdGggaXMgYSBsYWJlbC4gTm90IHN1cHBvcnRlZCB5ZXQuCiAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgJ0JhemVsIGRvZXMgbm90IHN1cHBvcnQgZXhlY3V0aW9uIG9mIFB5dGhvbiBpbnRlcnByZXRlcnMgdmlhIGxhYmVscyB5ZXQnKQogIGVsaWYgb3MucGF0aC5pc2FicyhQWVRIT05fQklOQVJZKToKICAgICMgQ2FzZSAyOiBBYnNvbHV0ZSBwYXRoLgogICAgcmV0dXJuIFBZVEhPTl9CSU5BUlkKICAjIFVzZSBub3JtcGF0aCgpIHRvIGNvbnZlcnQgc2xhc2hlcyB0byBvcy5zZXAgb24gV2luZG93cy4KICBlbGlmIG9zLnNlcCBpbiBvcy5wYXRoLm5vcm1wYXRoKFBZVEhPTl9CSU5BUlkpOgogICAgIyBDYXNlIDM6IFBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdC4KICAgIHJldHVybiBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCBQWVRIT05fQklOQVJZKQogIGVsc2U6CiAgICAjIENhc2UgNDogUGF0aCBoYXMgdG8gYmUgbG9va2VkIHVwIGluIHRoZSBzZWFyY2ggcGF0aC4KICAgIHJldHVybiBTZWFyY2hQYXRoKFBZVEhPTl9CSU5BUlkpCgpkZWYgQ3JlYXRlUHl0aG9uUGF0aEVudHJpZXMocHl0aG9uX2ltcG9ydHMsIG1vZHVsZV9zcGFjZSk6CiAgcGFydHMgPSBweXRob25faW1wb3J0cy5zcGxpdCgnOicpOwogIHJldHVybiBbbW9kdWxlX3NwYWNlXSArIFsiJXMvJXMiICUgKG1vZHVsZV9zcGFjZSwgcGF0aCkgZm9yIHBhdGggaW4gcGFydHNdCgojIEZpbmQgdGhlIHJ1bmZpbGVzIHRyZWUKZGVmIEZpbmRNb2R1bGVTcGFjZSgpOgogIHN0dWJfZmlsZW5hbWUgPSBzeXMuYXJndlswXQogIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHN0dWJfZmlsZW5hbWUpOgogICAgc3R1Yl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgc3R1Yl9maWxlbmFtZSkKCiAgd2hpbGUgVHJ1ZToKICAgIG1vZHVsZV9zcGFjZSA9IHN0dWJfZmlsZW5hbWUgKyAoJy5leGUnIGlmIElzV2luZG93cygpIGVsc2UgJycpICsgJy5ydW5maWxlcycKICAgIGlmIG9zLnBhdGguaXNkaXIobW9kdWxlX3NwYWNlKToKICAgICAgcmV0dXJuIG1vZHVsZV9zcGFjZQoKICAgIHJ1bmZpbGVzX3BhdHRlcm4gPSByJyguKlwucnVuZmlsZXMpJyArIChyJ1xcJyBpZiBJc1dpbmRvd3MoKSBlbHNlICcvJykgKyAnLionCiAgICBtYXRjaG9iaiA9IHJlLm1hdGNoKHJ1bmZpbGVzX3BhdHRlcm4sIHN0dWJfZmlsZW5hbWUpCiAgICBpZiBtYXRjaG9iajoKICAgICAgcmV0dXJuIG1hdGNob2JqLmdyb3VwKDEpCgogICAgaWYgbm90IG9zLnBhdGguaXNsaW5rKHN0dWJfZmlsZW5hbWUpOgogICAgICBicmVhawogICAgdGFyZ2V0ID0gb3MucmVhZGxpbmsoc3R1Yl9maWxlbmFtZSkKICAgIGlmIG9zLnBhdGguaXNhYnModGFyZ2V0KToKICAgICAgc3R1Yl9maWxlbmFtZSA9IHRhcmdldAogICAgZWxzZToKICAgICAgc3R1Yl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3R1Yl9maWxlbmFtZSksIHRhcmdldCkKCiAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0Nhbm5vdCBmaW5kIC5ydW5maWxlcyBkaXJlY3RvcnkgZm9yICVzJyAlIHN5cy5hcmd2WzBdKQoKZGVmIEV4dHJhY3RaaXAoemlwX3BhdGgsIGRlc3RfZGlyKToKICAiIiJFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSwgcHJlc2VydmluZyB0aGUgdW5peCBmaWxlIG1vZGUgYml0cy4KCiAgVGhlc2UgaW5jbHVkZSB0aGUgcGVybWlzc2lvbiBiaXRzLCBhbmQgaW4gcGFydGljdWxhciwgdGhlIGV4ZWN1dGFibGUgYml0LgoKICBJZGVhbGx5IHRoZSB6aXBmaWxlIG1vZHVsZSBzaG91bGQgc2V0IHRoZXNlIGJpdHMsIGJ1dCBpdCBkb2Vzbid0LiBTZWU6CiAgaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNTc5NS4KCiAgQXJnczoKICAgICAgemlwX3BhdGg6IFRoZSBwYXRoIHRvIHRoZSB6aXAgZmlsZSB0byBleHRyYWN0CiAgICAgIGRlc3RfZGlyOiBUaGUgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CiAgIiIiCiAgemlwX3BhdGggPSBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgoemlwX3BhdGgpCiAgZGVzdF9kaXIgPSBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgoZGVzdF9kaXIpCiAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX3BhdGgpIGFzIHpmOgogICAgZm9yIGluZm8gaW4gemYuaW5mb2xpc3QoKToKICAgICAgemYuZXh0cmFjdChpbmZvLCBkZXN0X2RpcikKICAgICAgIyBVTkMtcHJlZml4ZWQgcGF0aHMgbXVzdCBiZSBhYnNvbHV0ZS9ub3JtYWxpemVkLiBTZWUKICAgICAgIyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL2Rlc2t0b3AvZmlsZWlvL25hbWluZy1hLWZpbGUjbWF4aW11bS1wYXRoLWxlbmd0aC1saW1pdGF0aW9uCiAgICAgIGZpbGVfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oZGVzdF9kaXIsIGluZm8uZmlsZW5hbWUpKQogICAgICAjIFRoZSBVbml4IHN0X21vZGUgYml0cyAoc2VlICJtYW4gNyBpbm9kZSIpIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIDE2CiAgICAgICMgYml0cyBvZiBleHRlcm5hbF9hdHRyLiBPZiB0aG9zZSwgd2Ugc2V0IHRoZSBsb3dlciAxMiBiaXRzLCB3aGljaCBhcmUgdGhlCiAgICAgICMgZmlsZSBtb2RlIGJpdHMgKHNpbmNlIHRoZSBmaWxlIHR5cGUgYml0cyBjYW4ndCBiZSBzZXQgYnkgY2htb2QgYW55d2F5KS4KICAgICAgYXR0cnMgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKICAgICAgaWYgYXR0cnMgIT0gMDogICMgUnVtb3IgaGFzIGl0IHRoZXNlIGNhbiBiZSAwIGZvciB6aXBzIGNyZWF0ZWQgb24gV2luZG93cy4KICAgICAgICBvcy5jaG1vZChmaWxlX3BhdGgsIGF0dHJzICYgMG83Nzc3KQoKIyBDcmVhdGUgdGhlIHJ1bmZpbGVzIHRyZWUgYnkgZXh0cmFjdGluZyB0aGUgemlwIGZpbGUKZGVmIENyZWF0ZU1vZHVsZVNwYWNlKCk6CiAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCIiLCAiQmF6ZWwucnVuZmlsZXNfIikKICBFeHRyYWN0WmlwKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIHRlbXBfZGlyKQogIHJldHVybiBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJydW5maWxlcyIpCgojIFJldHVybnMgcmVwb3NpdG9yeSByb290cyB0byBhZGQgdG8gdGhlIGltcG9ydCBwYXRoLgpkZWYgR2V0UmVwb3NpdG9yaWVzSW1wb3J0cyhtb2R1bGVfc3BhY2UsIGltcG9ydF9hbGwpOgogIGlmIGltcG9ydF9hbGw6CiAgICByZXBvX2RpcnMgPSBbb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgZCkgZm9yIGQgaW4gb3MubGlzdGRpcihtb2R1bGVfc3BhY2UpXQogICAgcmV0dXJuIFtkIGZvciBkIGluIHJlcG9fZGlycyBpZiBvcy5wYXRoLmlzZGlyKGQpXQogIHJldHVybiBbb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgInJ1bGVzX3B5dGhvbiIpXQoKIyBGaW5kcyB0aGUgcnVuZmlsZXMgbWFuaWZlc3Qgb3IgdGhlIHJ1bmZpbGVzIGRpcmVjdG9yeS4KZGVmIFJ1bmZpbGVzRW52dmFyKG1vZHVsZV9zcGFjZSk6CiAgIyBJZiB0aGlzIGJpbmFyeSBpcyB0aGUgZGF0YS1kZXBlbmRlbmN5IG9mIGFub3RoZXIgb25lLCB0aGUgb3RoZXIgc2V0cwogICMgUlVORklMRVNfTUFOSUZFU1RfRklMRSBvciBSVU5GSUxFU19ESVIgZm9yIG91ciBzYWtlLgogIHJ1bmZpbGVzID0gb3MuZW52aXJvbi5nZXQoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBOb25lKQogIGlmIHJ1bmZpbGVzOgogICAgcmV0dXJuICgnUlVORklMRVNfTUFOSUZFU1RfRklMRScsIHJ1bmZpbGVzKQoKICBydW5maWxlcyA9IG9zLmVudmlyb24uZ2V0KCdSVU5GSUxFU19ESVInLCBOb25lKQogIGlmIHJ1bmZpbGVzOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgcnVuZmlsZXMpCgogICMgSWYgcnVubmluZyBmcm9tIGEgemlwLCB0aGVyZSdzIG5vIG1hbmlmZXN0IGZpbGUuCiAgaWYgSXNSdW5uaW5nRnJvbVppcCgpOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgbW9kdWxlX3NwYWNlKQoKICAjIExvb2sgZm9yIHRoZSBydW5maWxlcyAib3V0cHV0IiBtYW5pZmVzdCwgYXJndlswXSArICIucnVuZmlsZXNfbWFuaWZlc3QiCiAgcnVuZmlsZXMgPSBtb2R1bGVfc3BhY2UgKyAnX21hbmlmZXN0JwogIGlmIG9zLnBhdGguZXhpc3RzKHJ1bmZpbGVzKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBydW5maWxlcykKCiAgIyBMb29rIGZvciB0aGUgcnVuZmlsZXMgImlucHV0IiBtYW5pZmVzdCwgYXJndlswXSArICIucnVuZmlsZXMvTUFOSUZFU1QiCiAgcnVuZmlsZXMgPSBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCAnTUFOSUZFU1QnKQogIGlmIG9zLnBhdGguZXhpc3RzKHJ1bmZpbGVzKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIHJ1bmZpbGVzKQoKICAjIElmIHJ1bm5pbmcgaW4gYSBzYW5kYm94IGFuZCBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldCwgdGhlbgogICMgTG9vayBmb3IgdGhlIHJ1bmZpbGVzICBuZXh0IHRvIHRoZSBiaW5hcnkuCiAgaWYgbW9kdWxlX3NwYWNlLmVuZHN3aXRoKCcucnVuZmlsZXMnKSBhbmQgb3MucGF0aC5pc2Rpcihtb2R1bGVfc3BhY2UpOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgbW9kdWxlX3NwYWNlKQoKICByZXR1cm4gKE5vbmUsIE5vbmUpCgojIFRPRE8oIzY0NDMpOiBSZW1vdmUgdGhpcyBvbmNlIHRoZXJlJ3Mgbm8gbG9uZ2VyIGEgaG9zdCBjb25maWd1cmF0aW9uIGZvcgojIFB5dGhvbiB0YXJnZXRzIHRvIGFwcGVhciBpbi4KZGVmIE1heWJlRW1pdEhvc3RWZXJzaW9uV2FybmluZyhyZXRfY29kZSk6CiAgIiIiV2FybiB0aGUgdXNlciBpZiBhIGZhaWx1cmUgbWF5IGJlIGR1ZSB0byB0aGUgaG9zdCBjb25maWcncyB2ZXJzaW9uLgoKICBUaGlzIGVtaXRzIGEgbWVzc2FnZSB0byBzdGRlcnIgaWYKICAgIDEpIHJldF9jb2RlIGlzIG5vbi16ZXJvLAogICAgMikgdGhlIHRhcmdldCB3YXMgYnVpbHQgaW4gdGhlIGhvc3QgY29uZmlnIGFuZCB3aXRoIHRvb2xjaGFpbnMgZW5hYmxlZCwgYW5kCiAgICAzKSBhdCBhbmFseXNpcyB0aW1lIHdlIGRldGVjdGVkIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgaG9zdCBjb25maWcncyB2ZXJzaW9uCiAgICAgICBhbmQgdGhpcyB0YXJnZXQncyBleHBsaWNpdGx5IGRlY2xhcmVkIHZlcnNpb24sIG9yIGVsc2UgdGhpcyB0YXJnZXQgZGlkCiAgICAgICBub3QgZXhwbGljaXRseSBkZWNsYXJlIGl0cyB2ZXJzaW9uLiAoVGhlIGZvcm1lciBkaWFnbm9zZXMgdGFyZ2V0cwogICAgICAgYWZmZWN0ZWQgYnkgIzY0NDMsIGFuZCB0aGUgbGF0dGVyIGRpYWdub3NlcyB0YXJnZXRzIHRoYXQgYXJlIGJyb2tlbiBieQogICAgICAgZml4aW5nICM0ODE1LikKCiAgU2VlIGFsc28gIzc4OTksICM4NTQ5LCBhbmQgUHlDb21tb24jc2hvdWxkV2FybkFib3V0SG9zdFZlcnNpb25VcG9uRmFpbHVyZS4KCiAgU2luY2UgdGhpcyB3YXJuaW5nIGlzIGVtaXR0ZWQgaGVyZSBpbiB0aGUgc3R1YiBzY3JpcHQgYW5kIG5vdCBpbiBCYXplbCBpdHNlbGYsCiAgaXQgd2lsbCBiZSBwcmVzZW50IGluIGFsbCBmYWlsaW5nIHJ1bnMgb2YgYWZmZWN0ZWQgdGFyZ2V0cywgZXZlbiB3aGVuIGV4ZWN1dGVkCiAgZGlyZWN0bHkgYW5kIG5vdCB2aWEgYGJhemVsIHJ1bmAuIEhvd2V2ZXIsIG5vdGUgdGhhdCB0aGlzIHdhcm5pbmcgaXMgbmV2ZXIKICBhZGRlZCB0byBub24taG9zdC1jb25maWd1cmVkIHRhcmdldHMsIGFuZCB0aGF0IGl0IGNhbiBiZSBkaXNhYmxlZCBieSBlbnN1cmluZwogIHRoZSBjb3JyZWN0IFB5dGhvbiB2ZXJzaW9uIGlzIHBhc3NlZCB0byAtLWhvc3RfZm9yY2VfcHl0aG9uIGFuZCBkZWNsYXJlZCBpbgogIHRvb2xzJyBweXRob25fdmVyc2lvbiBhdHRyaWJ1dGVzLgoKICBBcmdzOgogICAgICByZXRfY29kZTogVGhlIGV4aXQgY29kZSBvZiB0aGUgcGF5bG9hZCB1c2VyIHByb2dyYW0KICAiIiIKICBpZiByZXRfY29kZSA9PSAwOgogICAgcmV0dXJuCiAgaWYgbm90IEZhbHNlOgogICAgcmV0dXJuCgogIGhvc3RfdmVyc2lvbiA9ICIzIgogIHRhcmdldF92ZXJzaW9uID0gIjMiCiAgb3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9uID0gIjIiIGlmIGhvc3RfdmVyc2lvbiA9PSAiMyIgZWxzZSAiMyIKCiAgaWYgRmFsc2U6CiAgICAjIE1pc21hdGNoIHdpdGggZXhwbGljaXRseSBkZWNsYXJlZCB2ZXJzaW9uLgogICAgZGlhZ25vc3RpYyA9ICIiIlwKTm90ZTogVGhlIGZhaWx1cmUgb2YgdGFyZ2V0IHt0YXJnZXR9ICh3aXRoIGV4aXQgY29kZSB7cmV0X2NvZGV9KSBtYXkgaGF2ZSBiZWVuIFwKY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgaXQgaXMgYSBQeXRob24ge3RhcmdldF92ZXJzaW9ufSBwcm9ncmFtIHRoYXQgd2FzIGJ1aWx0IFwKaW4gdGhlIGhvc3QgY29uZmlndXJhdGlvbiwgd2hpY2ggdXNlcyBQeXRob24ge2hvc3RfdmVyc2lvbn0uIFlvdSBjYW4gY2hhbmdlIFwKdGhlIGhvc3QgY29uZmlndXJhdGlvbiAoZm9yIHRoZSBlbnRpcmUgYnVpbGQpIHRvIGluc3RlYWQgdXNlIFB5dGhvbiBcCnt0YXJnZXRfdmVyc2lvbn0gYnkgc2V0dGluZyAtLWhvc3RfZm9yY2VfcHl0aG9uPVBZe3RhcmdldF92ZXJzaW9ufS5cCiIiIi5mb3JtYXQoCiAgICB0YXJnZXQ9Ii8vcGFja2FnaW5nOnBpcHRvb2wiLAogICAgcmV0X2NvZGU9cmV0X2NvZGUsCiAgICB0YXJnZXRfdmVyc2lvbj10YXJnZXRfdmVyc2lvbiwKICAgIGhvc3RfdmVyc2lvbj1ob3N0X3ZlcnNpb24pCiAgZWxzZToKICAgIGRpYWdub3N0aWMgPSAiIiJcCk5vdGU6IFRoZSBmYWlsdXJlIG9mIHRhcmdldCB7dGFyZ2V0fSAod2l0aCBleGl0IGNvZGUge3JldF9jb2RlfSkgbWF5IGhhdmUgYmVlbiBcCmNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IGl0IGlzIHJ1bm5pbmcgdW5kZXIgUHl0aG9uIHtob3N0X3ZlcnNpb259IGluc3RlYWQgb2YgXApQeXRob24ge29wcG9zaXRlX29mX2hvc3RfdmVyc2lvbn0uIEV4YW1pbmUgdGhlIGVycm9yIHRvIGRldGVybWluZSBpZiB0aGF0IFwKYXBwZWFycyB0byBiZSB0aGUgcHJvYmxlbS4gU2luY2UgdGhpcyB0YXJnZXQgaXMgYnVpbHQgaW4gdGhlIGhvc3QgXApjb25maWd1cmF0aW9uLCB0aGUgb25seSB3YXkgdG8gY2hhbmdlIGl0cyB2ZXJzaW9uIGlzIHRvIHNldCBcCi0taG9zdF9mb3JjZV9weXRob249UFl7b3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9ufSwgd2hpY2ggYWZmZWN0cyB0aGUgZW50aXJlIFwKYnVpbGQuXAoiIiIuZm9ybWF0KAogICAgdGFyZ2V0PSIvL3BhY2thZ2luZzpwaXB0b29sIiwKICAgIHJldF9jb2RlPXJldF9jb2RlLAogICAgaG9zdF92ZXJzaW9uPWhvc3RfdmVyc2lvbiwKICAgIG9wcG9zaXRlX29mX2hvc3RfdmVyc2lvbj1vcHBvc2l0ZV9vZl9ob3N0X3ZlcnNpb24pCgogICMgVE9ETyhicmFuZGpvbik6IENoYW5nZSB0aGUgd29yZGluZyAiWW91IGFyZSBsaWtlbHkgc2VlaW5nIHRoaXMgbWVzc2FnZQogICMgYmVjYXVzZSIgdG8gc29tZXRoaW5nIGxlc3Mgc3Ryb25nIGFmdGVyIGEgZmV3IHJlbGVhc2VzIGZyb20gMC4yNy4gQnkgdGhhdAogICMgcG9pbnQsIG1pZ3JhdGlvbiBmb3IgdG9vbGNoYWlucyB3b24ndCBiZSB0aGUgbWFpbiByZWFzb24gdGhpcyBlcnJvciBpcyBzZWVuCiAgIyBieSB1c2Vycy4KICBtZXNzYWdlID0gIiIiXAotLS0tLS0tLS0tLS0tLS0tCntkaWFnbm9zdGljfQoKSWYgdGhpcyBlcnJvciBzdGFydGVkIG9jY3VycmluZyBpbiBCYXplbCAwLjI3IGFuZCBsYXRlciwgaXQgbWF5IGJlIGJlY2F1c2UgdGhlIFwKUHl0aG9uIHRvb2xjaGFpbiBub3cgZW5mb3JjZXMgdGhhdCB0YXJnZXRzIGFuYWx5emVkIGFzIFBZMiBhbmQgUFkzIHJ1biB1bmRlciBhIFwKUHl0aG9uIDIgYW5kIFB5dGhvbiAzIGludGVycHJldGVyLCByZXNwZWN0aXZlbHkuIFNlZSBcCmh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2lzc3Vlcy83ODk5IGZvciBtb3JlIGluZm9ybWF0aW9uLgotLS0tLS0tLS0tLS0tLS0tIiIiLmZvcm1hdChkaWFnbm9zdGljPWRpYWdub3N0aWMpCiAgcHJpbnQobWVzc2FnZSwgZmlsZT1zeXMuc3RkZXJyKQoKZGVmIE1haW4oKToKICBhcmdzID0gc3lzLmFyZ3ZbMTpdCgogIG5ld19lbnYgPSB7fQoKICBpZiBJc1J1bm5pbmdGcm9tWmlwKCk6CiAgICBtb2R1bGVfc3BhY2UgPSBDcmVhdGVNb2R1bGVTcGFjZSgpCiAgZWxzZToKICAgIG1vZHVsZV9zcGFjZSA9IEZpbmRNb2R1bGVTcGFjZSgpCgogIHB5dGhvbl9pbXBvcnRzID0gJ3BpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNDpwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zOnBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMCcKICBweXRob25fcGF0aF9lbnRyaWVzID0gQ3JlYXRlUHl0aG9uUGF0aEVudHJpZXMocHl0aG9uX2ltcG9ydHMsIG1vZHVsZV9zcGFjZSkKICBweXRob25fcGF0aF9lbnRyaWVzICs9IEdldFJlcG9zaXRvcmllc0ltcG9ydHMobW9kdWxlX3NwYWNlLCBUcnVlKQoKICBweXRob25fcGF0aF9lbnRyaWVzID0gW0dldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChkKSBmb3IgZCBpbiBweXRob25fcGF0aF9lbnRyaWVzXQoKICBvbGRfcHl0aG9uX3BhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgcHl0aG9uX3BhdGggPSBvcy5wYXRoc2VwLmpvaW4ocHl0aG9uX3BhdGhfZW50cmllcykKICBpZiBvbGRfcHl0aG9uX3BhdGg6CiAgICBweXRob25fcGF0aCArPSBvcy5wYXRoc2VwICsgb2xkX3B5dGhvbl9wYXRoCgogIGlmIElzV2luZG93cygpOgogICAgcHl0aG9uX3BhdGggPSBweXRob25fcGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICBuZXdfZW52WydQWVRIT05QQVRIJ10gPSBweXRob25fcGF0aAogIHJ1bmZpbGVzX2VudmtleSwgcnVuZmlsZXNfZW52dmFsdWUgPSBSdW5maWxlc0VudnZhcihtb2R1bGVfc3BhY2UpCiAgaWYgcnVuZmlsZXNfZW52a2V5OgogICAgbmV3X2VudltydW5maWxlc19lbnZrZXldID0gcnVuZmlsZXNfZW52dmFsdWUKCiAgIyBOb3cgbG9vayBmb3IgbXkgbWFpbiBweXRob24gc291cmNlIGZpbGUuCiAgIyBUaGUgbWFnaWMgc3RyaW5nIHBlcmNlbnQtbWFpbi1wZXJjZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGZpbGVuYW1lIG9mIHRoZQogICMgbWFpbiBmaWxlIG9mIHRoZSBQeXRob24gYmluYXJ5IGluIEJhemVsUHl0aG9uU2VtYW50aWNzLmphdmEuCiAgcmVsX3BhdGggPSAncnVsZXNfcHl0aG9uL3BhY2thZ2luZy9waXB0b29sLnB5JwogIGlmIElzV2luZG93cygpOgogICAgcmVsX3BhdGggPSByZWxfcGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICBtYWluX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgcmVsX3BhdGgpCiAgbWFpbl9maWxlbmFtZSA9IEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChtYWluX2ZpbGVuYW1lKQogIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhtYWluX2ZpbGVuYW1lKSwgXAogICAgICAgICAnQ2Fubm90IGV4ZWMoKSAlcjogZmlsZSBub3QgZm91bmQuJyAlIG1haW5fZmlsZW5hbWUKICBhc3NlcnQgb3MuYWNjZXNzKG1haW5fZmlsZW5hbWUsIG9zLlJfT0spLCBcCiAgICAgICAgICdDYW5ub3QgZXhlYygpICVyOiBmaWxlIG5vdCByZWFkYWJsZS4nICUgbWFpbl9maWxlbmFtZQoKICBwcm9ncmFtID0gcHl0aG9uX3Byb2dyYW0gPSBGaW5kUHl0aG9uQmluYXJ5KG1vZHVsZV9zcGFjZSkKICBpZiBweXRob25fcHJvZ3JhbSBpcyBOb25lOgogICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHB5dGhvbiBiaW5hcnk6ICcgKyBQWVRIT05fQklOQVJZKQogIGFyZ3MgPSBbcHl0aG9uX3Byb2dyYW0sIG1haW5fZmlsZW5hbWVdICsgYXJncwoKICBvcy5lbnZpcm9uLnVwZGF0ZShuZXdfZW52KQoKICB0cnk6CiAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgICAgIyBJZiBSVU5fVU5ERVJfUlVORklMRVMgZXF1YWxzIDEsIGl0IG1lYW5zIHdlIG5lZWQgdG8KICAgICAgIyBjaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSByaWdodCBydW5maWxlcyBkaXJlY3RvcnkuCiAgICAgICMgKFNvIHRoYXQgdGhlIGRhdGEgZmlsZXMgYXJlIGFjY2Vzc2libGUpCiAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJSVU5fVU5ERVJfUlVORklMRVMiKSA9PSAiMSI6CiAgICAgICAgb3MuY2hkaXIob3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgInJ1bGVzX3B5dGhvbiIpKQogICAgICByZXRfY29kZSA9IHN1YnByb2Nlc3MuY2FsbChhcmdzKQogICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguZGlybmFtZShtb2R1bGVfc3BhY2UpLCBUcnVlKQogICAgICBNYXliZUVtaXRIb3N0VmVyc2lvbldhcm5pbmcocmV0X2NvZGUpCiAgICAgIHN5cy5leGl0KHJldF9jb2RlKQogICAgZWxzZToKICAgICAgIyBPbiBXaW5kb3dzLCBvcy5leGVjdiBkb2Vzbid0IGhhbmRsZSBhcmd1bWVudHMgd2l0aCBzcGFjZXMgY29ycmVjdGx5LAogICAgICAjIGFuZCBpdCBhY3R1YWxseSBzdGFydHMgYSBzdWJwcm9jZXNzIGp1c3QgbGlrZSBzdWJwcm9jZXNzLmNhbGwuCiAgICAgICMKICAgICAgIyBJZiB3ZSBtYXkgbmVlZCB0byBlbWl0IGEgaG9zdCBjb25maWcgd2FybmluZyBhZnRlciBleGVjdXRpb24sIGRvbid0CiAgICAgICMgZXhlY3YgYmVjYXVzZSB3ZSBuZWVkIGNvbnRyb2wgdG8gcmV0dXJuIGhlcmUuIFRoaXMgb25seSBoYXBwZW5zIGZvcgogICAgICAjIHRhcmdldHMgYnVpbHQgaW4gdGhlIGhvc3QgY29uZmlnLCBzbyBvdGhlciB0YXJnZXRzIHN0aWxsIGdldCB0byB0YWtlCiAgICAgICMgYWR2YW50YWdlIG9mIHRoZSBwZXJmb3JtYW5jZSBiZW5lZml0cyBvZiBleGVjdi4KICAgICAgaWYgSXNXaW5kb3dzKCkgb3IgRmFsc2U6CiAgICAgICAgcmV0X2NvZGUgPSBzdWJwcm9jZXNzLmNhbGwoYXJncykKICAgICAgICBNYXliZUVtaXRIb3N0VmVyc2lvbldhcm5pbmcocmV0X2NvZGUpCiAgICAgICAgc3lzLmV4aXQocmV0X2NvZGUpCiAgICAgIGVsc2U6CiAgICAgICAgb3MuZXhlY3YoYXJnc1swXSwgYXJncykKICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKICAgICMgVGhpcyB3b3JrcyBmcm9tIFB5dGhvbiAyLjQgYWxsIHRoZSB3YXkgdG8gMy54LgogICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCiAgICAjIFRoaXMgZXhjZXB0aW9uIG9jY3VycyB3aGVuIG9zLmV4ZWN2KCkgZmFpbHMgZm9yIHNvbWUgcmVhc29uLgogICAgaWYgbm90IGdldGF0dHIoZSwgJ2ZpbGVuYW1lJywgTm9uZSk6CiAgICAgIGUuZmlsZW5hbWUgPSBwcm9ncmFtICAjIEFkZCBpbmZvIHRvIGVycm9yIG1lc3NhZ2UKICAgIHJhaXNlCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogIE1haW4oKQpQSwMEFAAAAAAAAAAhACVYVUxyHwAAch8AACEAAABydWxlc19weXRob24vcGFja2FnaW5nL3BpcHRvb2wucHkjIENvcHlyaWdodCAyMDE3IFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiIiIlRoZSBwaXB0b29sIG1vZHVsZSBpbXBvcnRzIHBpcCByZXF1aXJlbWVudHMgaW50byBCYXplbCBydWxlcy4iIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQgYXRleGl0CmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgcGtndXRpbAppbXBvcnQgcGtnX3Jlc291cmNlcwppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQoKIyBOb3RlOiBXZSBjYXJlZnVsbHkgaW1wb3J0IHRoZSBmb2xsb3dpbmcgbW9kdWxlcyBpbiBhIHBhcnRpY3VsYXIKIyBvcmRlciwgc2luY2UgdGhlc2UgbW9kdWxlcyBtb2RpZnkgdGhlIGltcG9ydCBwYXRoIGFuZCBtYWNoaW5lcnkuCmltcG9ydCBwa2dfcmVzb3VyY2VzCgoKZGVmIGV4dHJhY3RfcGFja2FnZXMocGFja2FnZV9uYW1lcyk6CiAgICAiIiJFeHRyYWN0IHppcGZpbGUgY29udGVudHMgdG8gZGlzayBhbmQgYWRkIHRvIGltcG9ydCBwYXRoIiIiCgogICAgIyBTZXQgYSBzYWZlIGV4dHJhY3Rpb24gZGlyCiAgICBleHRyYWN0aW9uX3RtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZSgKICAgICAgICBleHRyYWN0aW9uX3RtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKSkKICAgIHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb25fcGF0aChleHRyYWN0aW9uX3RtcGRpcikKCiAgICAjIEV4dHJhY3QgZWFjaCBwYWNrYWdlIHRvIGRpc2sKICAgIGRpcnNfdG9fYWRkID0gW10KICAgIGZvciBwYWNrYWdlX25hbWUgaW4gcGFja2FnZV9uYW1lczoKICAgICAgICByZXEgPSBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50LnBhcnNlKHBhY2thZ2VfbmFtZSkKICAgICAgICBleHRyYWN0aW9uX2RpciA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUocmVxLCAnJykKICAgICAgICBkaXJzX3RvX2FkZC5hcHBlbmQoZXh0cmFjdGlvbl9kaXIpCgogICAgIyBBZGQgZXh0cmFjdGVkIGRpcmVjdG9yaWVzIHRvIGltcG9ydCBwYXRoIGFoZWFkIG9mIHRoZWlyIHppcCBmaWxlCiAgICAjIGNvdW50ZXJwYXJ0cy4KICAgIHN5cy5wYXRoWzA6MF0gPSBkaXJzX3RvX2FkZAogICAgZXhpc3RpbmdfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJykKICAgIGlmIGV4aXN0aW5nX3B5dGhvbnBhdGg6CiAgICAgICAgZGlyc190b19hZGQuZXh0ZW5kKGV4aXN0aW5nX3B5dGhvbnBhdGguc3BsaXQoJzonKSkKICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9ICc6Jy5qb2luKGRpcnNfdG9fYWRkKQoKCiMgV2hlZWwsIHBpcCwgYW5kIHNldHVwdG9vbHMgYXJlIG11Y2ggaGFwcGllciBydW5uaW5nIGZyb20gYWN0dWFsCiMgZmlsZXMgb24gZGlzaywgcmF0aGVyIHRoYW4gZW50cmllcyBpbiBhIHppcGZpbGUuICBFeHRyYWN0IHppcGZpbGUKIyBjb250ZW50cywgYWRkIHRob3NlIGNvbnRlbnRzIHRvIHRoZSBwYXRoLCB0aGVuIGltcG9ydCB0aGVtLgpleHRyYWN0X3BhY2thZ2VzKFsncGlwJywgJ3NldHVwdG9vbHMnLCAnd2hlZWwnXSkKCiMgRGVmZWF0IHBpcCdzIGF0dGVtcHQgdG8gbWFuZ2xlIHN5cy5wYXRoCnNhdmVkX3N5c19wYXRoID0gc3lzLnBhdGgKc3lzLnBhdGggPSBzeXMucGF0aFs6XQppbXBvcnQgcGlwCnN5cy5wYXRoID0gc2F2ZWRfc3lzX3BhdGgKCmltcG9ydCBzZXR1cHRvb2xzCmltcG9ydCB3aGVlbAoKCmRlZiBwaXBfbWFpbihhcmd2KToKICAgICMgRXh0cmFjdCB0aGUgY2VydGlmaWNhdGVzIGZyb20gdGhlIFBBUiBmb2xsb3dpbmcgdGhlIGV4YW1wbGUgb2YgZ2V0LXBpcC5weQogICAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9nZXQtcGlwL2Jsb2IvNDMwYmEzNzc3NmFlMmFkODkvdGVtcGxhdGUucHkjTDE2NC1MMTY4CiAgICBjZXJ0X3RtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgY2VydF9wYXRoID0gb3MucGF0aC5qb2luKGNlcnRfdG1wZGlyLCAiY2FjZXJ0LnBlbSIpCiAgICBhdGV4aXQucmVnaXN0ZXIobGFtYmRhOiBzaHV0aWwucm10cmVlKGNlcnRfdG1wZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpKQogICAgd2l0aCBvcGVuKGNlcnRfcGF0aCwgIndiIikgYXMgY2VydDoKICAgICAgY2VydC53cml0ZShwa2d1dGlsLmdldF9kYXRhKCJwaXAuX3ZlbmRvci5yZXF1ZXN0cyIsICJjYWNlcnQucGVtIikpCiAgICBhcmd2ID0gWyItLWlzb2xhdGVkIiwgIi0tZGlzYWJsZS1waXAtdmVyc2lvbi1jaGVjayIsICItLWNlcnQiLCBjZXJ0X3BhdGhdICsgYXJndgogICAgcmV0dXJuIHBpcC5tYWluKGFyZ3YpCgpmcm9tIHBhY2thZ2luZy53aGwgaW1wb3J0IFdoZWVsCgpwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKICAgIGRlc2NyaXB0aW9uPSdJbXBvcnQgUHl0aG9uIGRlcGVuZGVuY2llcyBpbnRvIEJhemVsLicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXB5dGhvbl9pbnRlcnByZXRlcicsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgUHl0aG9uIGludGVycHJldGVyIHRvIHVzZSB3aGVuIGV4dHJhY3RpbmcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVlbHMuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW5hbWUnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIG5hbWVzcGFjZSBvZiB0aGUgaW1wb3J0LicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1pbnB1dCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgcmVxdWlyZW1lbnRzLnR4dCBmaWxlIHRvIGltcG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSByZXF1aXJlbWVudHMuYnpsIGZpbGUgdG8gZXhwb3J0LicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kaXJlY3RvcnknLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRvIHB1dCAud2hsIGZpbGVzLicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1leHRyYV9waXBfYXJncycsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdFeHRyYSBhcmd1bWVudHMgdG8gcGFzcyBkb3duIHRvIHBpcC4nKSkKCmRlZiBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpOgogICIiIkRldGVybWluZXMgdGhlIGxpc3Qgb2YgcG9zc2libGUgImV4dHJhcyIgZm9yIGVhY2ggLndobAoKICBUaGUgcG9zc2liaWxpdHkgb2YgYW4gZXh0cmEgaXMgZGV0ZXJtaW5lZCBieSBsb29raW5nIGF0IGl0cwogIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLCBhbmQgZGV0ZXJtaW5pbmUgd2hldGhlciB0aGV5IGFyZQogIHNhdGlzZmllZCBieSB0aGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgd2hlZWxzLgoKICBBcmdzOgogICAgd2hsczogYSBsaXN0IG9mIFdoZWVsIG9iamVjdHMKCiAgUmV0dXJuczoKICAgIGEgZGljdCB0aGF0IGlzIGtleWVkIGJ5IHRoZSBXaGVlbCBvYmplY3RzIGluIHdobHMsIGFuZCB3aG9zZQogICAgdmFsdWVzIGFyZSBsaXN0cyBvZiBwb3NzaWJsZSBleHRyYXMuCiAgIiIiCiAgd2hsX21hcCA9IHsKICAgIHdobC5kaXN0cmlidXRpb24oKTogd2hsCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgogICMgVE9ETyhtYXR0bW9vcik6IENvbnNpZGVyIG1lbW9pemluZyBpZiB0aGlzIHJlY3Vyc2lvbiBldmVyIGJlY29tZXMKICAjIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBpdC4KICBkZWYgaXNfcG9zc2libGUoZGlzdHJvLCBleHRyYSk6CiAgICBkaXN0cm8gPSBkaXN0cm8ucmVwbGFjZSgiLSIsICJfIikKICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgLndobCBhdCBhbGwsIHRoZW4gdGhpcyBpc24ndCBwb3NzaWJsZS4KICAgIGlmIGRpc3RybyBub3QgaW4gd2hsX21hcDoKICAgICAgcmV0dXJuIEZhbHNlCiAgICB3aGwgPSB3aGxfbWFwW2Rpc3Ryb10KICAgICMgSWYgd2UgaGF2ZSB0aGUgLndobCwgYW5kIHdlIGRvbid0IG5lZWQgYW55dGhpbmcgZXh0cmEgdGhlbgogICAgIyB3ZSBjYW4gc2F0aXNmeSB0aGlzIGRlcGVuZGVuY3kuCiAgICBpZiBub3QgZXh0cmE6CiAgICAgIHJldHVybiBUcnVlCiAgICAjIElmIHdlIGRvIG5lZWQgc29tZXRoaW5nIGV4dHJhLCB0aGVuIGNoZWNrIHRoZSBleHRyYSdzCiAgICAjIGRlcGVuZGVuY2llcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgZnVsbHkgc2F0aXNmaWVkLgogICAgZm9yIGV4dHJhX2RlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhPWV4dHJhKToKICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShleHRyYV9kZXApCiAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZGVwIGFuZCBhbnkgZXh0cmFzIGFyZSBhbGwgcG9zc2libGUuCiAgICAgIGlmIG5vdCBpc19wb3NzaWJsZShyZXEucHJvamVjdF9uYW1lLCBOb25lKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgZm9yIGUgaW4gcmVxLmV4dHJhczoKICAgICAgICBpZiBub3QgaXNfcG9zc2libGUocmVxLnByb2plY3RfbmFtZSwgZSk6CiAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICMgSWYgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGV4dHJhIGFyZSBzYXRpc2ZpYWJsZSB0aGVuCiAgICAjIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGlzIGRlcGVuZGVuY3kuCiAgICByZXR1cm4gVHJ1ZQoKICByZXR1cm4gewogICAgd2hsOiBbCiAgICAgIGV4dHJhCiAgICAgIGZvciBleHRyYSBpbiB3aGwuZXh0cmFzKCkKICAgICAgaWYgaXNfcG9zc2libGUod2hsLmRpc3RyaWJ1dGlvbigpLCBleHRyYSkKICAgIF0KICAgIGZvciB3aGwgaW4gd2hscwogIH0KCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvYmxvYi85LjAuMS9waXAvX19pbml0X18ucHkjTDIwOQogIHBpcF9hcmdzID0gWyJ3aGVlbCIsICItdyIsIGFyZ3MuZGlyZWN0b3J5LCAiLXIiLCBhcmdzLmlucHV0XQogIGlmIGFyZ3MuZXh0cmFfcGlwX2FyZ3M6CiAgICAgIHBpcF9hcmdzICs9IGFyZ3MuZXh0cmFfcGlwX2FyZ3Muc3RyaXAoIlwiIikuc3BsaXQoKQogIGlmIHBpcF9tYWluKHBpcF9hcmdzKToKICAgIHN5cy5leGl0KDEpCgogICMgRW51bWVyYXRlIHRoZSAud2hsIGZpbGVzIHdlIGRvd25sb2FkZWQuCiAgZGVmIGxpc3Rfd2hscygpOgogICAgZGlyID0gYXJncy5kaXJlY3RvcnkgKyAnLycKICAgIGZvciByb290LCB1bnVzZWRfZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGRpcik6CiAgICAgIGZvciBmbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgaWYgZm5hbWUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihyb290LCBmbmFtZSkKCiAgd2hscyA9IFtXaGVlbChwYXRoKSBmb3IgcGF0aCBpbiBsaXN0X3dobHMoKV0KICBwb3NzaWJsZV9leHRyYXMgPSBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpCgogIGRlZiByZXBvc2l0b3J5X25hbWUod2hlZWwpOgogICAgcmV0dXJuIGFyZ3MubmFtZSArICJfIiArIHdoZWVsLnJlcG9zaXRvcnlfc3VmZml4KCkKCiAgZGVmIHdobF9saWJyYXJ5KHdoZWVsKToKICAgICMgSW5kZW50YXRpb24gaGVyZSBtYXR0ZXJzLiAgd2hsX2xpYnJhcnkgbXVzdCBiZSB3aXRoaW4gdGhlIHNjb3BlCiAgICAjIG9mIHRoZSBmdW5jdGlvbiBiZWxvdy4gIFdlIGFsc28gYXZvaWQgcmVpbXBvcnRpbmcgYW4gZXhpc3RpbmcgV0hMLgogICAgcmV0dXJuICIiIgogIGlmICJ7cmVwb19uYW1lfSIgbm90IGluIG5hdGl2ZS5leGlzdGluZ19ydWxlcygpOgogICAgd2hsX2xpYnJhcnkoCiAgICAgICAgbmFtZSA9ICJ7cmVwb19uYW1lfSIsCiAgICAgICAgcHl0aG9uX2ludGVycHJldGVyID0gIntweXRob25faW50ZXJwcmV0ZXJ9IiwKICAgICAgICB3aGwgPSAiQHtuYW1lfS8vOntwYXRofSIsCiAgICAgICAgcmVxdWlyZW1lbnRzID0gIkB7bmFtZX0vLzpyZXF1aXJlbWVudHMuYnpsIiwKICAgICAgICBleHRyYXMgPSBbe2V4dHJhc31dCiAgICApIiIiLmZvcm1hdChuYW1lPWFyZ3MubmFtZSwgcmVwb19uYW1lPXJlcG9zaXRvcnlfbmFtZSh3aGVlbCksCiAgICAgICAgICAgICAgICBweXRob25faW50ZXJwcmV0ZXI9YXJncy5weXRob25faW50ZXJwcmV0ZXIsCiAgICAgICAgICAgICAgICBwYXRoPXdoZWVsLmJhc2VuYW1lKCksCiAgICAgICAgICAgICAgICBleHRyYXM9JywnLmpvaW4oWwogICAgICAgICAgICAgICAgICAnIiVzIicgJSBleHRyYQogICAgICAgICAgICAgICAgICBmb3IgZXh0cmEgaW4gcG9zc2libGVfZXh0cmFzLmdldCh3aGVlbCwgW10pCiAgICAgICAgICAgICAgICBdKSkKCiAgd2hsX3RhcmdldHMgPSAnLCcuam9pbihbCiAgICAnLCcuam9pbihbCiAgICAgICciJXMiOiAiQCVzLy86cGtnIicgJSAod2hsLmRpc3RyaWJ1dGlvbigpLmxvd2VyKCksIHJlcG9zaXRvcnlfbmFtZSh3aGwpKQogICAgXSArIFsKICAgICAgIyBGb3IgZXZlcnkgZXh0cmEgdGhhdCBpcyBwb3NzaWJsZSBmcm9tIHRoaXMgcmVxdWlyZW1lbnRzLnR4dAogICAgICAnIiVzWyVzXSI6ICJAJXMvLzolcyInICUgKHdobC5kaXN0cmlidXRpb24oKS5sb3dlcigpLCBleHRyYS5sb3dlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlfbmFtZSh3aGwpLCBleHRyYSkKICAgICAgZm9yIGV4dHJhIGluIHBvc3NpYmxlX2V4dHJhcy5nZXQod2hsLCBbXSkKICAgIF0pCiAgICBmb3Igd2hsIGluIHdobHMKICBdKQoKICB3aXRoIG9wZW4oYXJncy5vdXRwdXQsICd3JykgYXMgZjoKICAgIGYud3JpdGUoIiIiXAojIEluc3RhbGwgcGlwIHJlcXVpcmVtZW50cy4KIwojIEdlbmVyYXRlZCBmcm9tIHtpbnB1dH0KCmxvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjp3aGwuYnpsIiwgIndobF9saWJyYXJ5IikKCmRlZiBwaXBfaW5zdGFsbCgpOgogIHt3aGxfbGlicmFyaWVzfQoKX3JlcXVpcmVtZW50cyA9IHt7CiAge21hcHBpbmdzfQp9fQoKYWxsX3JlcXVpcmVtZW50cyA9IF9yZXF1aXJlbWVudHMudmFsdWVzKCkKCmRlZiByZXF1aXJlbWVudChuYW1lKToKICBuYW1lX2tleSA9IG5hbWUucmVwbGFjZSgiLSIsICJfIikubG93ZXIoKQogIGlmIG5hbWVfa2V5IG5vdCBpbiBfcmVxdWlyZW1lbnRzOgogICAgZmFpbCgiQ291bGQgbm90IGZpbmQgcGlwLXByb3ZpZGVkIGRlcGVuZGVuY3k6ICclcyciICUgbmFtZSkKICByZXR1cm4gX3JlcXVpcmVtZW50c1tuYW1lX2tleV0KIiIiLmZvcm1hdChpbnB1dD1hcmdzLmlucHV0LAogICAgICAgICAgIHdobF9saWJyYXJpZXM9J1xuJy5qb2luKG1hcCh3aGxfbGlicmFyeSwgd2hscykpIGlmIHdobHMgZWxzZSAicGFzcyIsCiAgICAgICAgICAgbWFwcGluZ3M9d2hsX3RhcmdldHMpKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICBtYWluKCkKUEsDBBQAAAAAAAAAIQB/uX4PiBYAAIgWAAAdAAAAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy93aGwucHkjIENvcHlyaWdodCAyMDE3IFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiIiIlRoZSB3aGwgbW9kdWxlcyBkZWZpbmVzIGNsYXNzZXMgZm9yIGludGVyYWN0aW5nIHdpdGggUHl0aG9uIHBhY2thZ2VzLiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgcGtnX3Jlc291cmNlcwppbXBvcnQgcmUKaW1wb3J0IHppcGZpbGUKCgpjbGFzcyBXaGVlbChvYmplY3QpOgoKICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICBzZWxmLl9wYXRoID0gcGF0aAoKICBkZWYgcGF0aChzZWxmKToKICAgIHJldHVybiBzZWxmLl9wYXRoCgogIGRlZiBiYXNlbmFtZShzZWxmKToKICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHNlbGYucGF0aCgpKQoKICBkZWYgZGlzdHJpYnV0aW9uKHNlbGYpOgogICAgIyBTZWUgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8jZmlsZS1uYW1lLWNvbnZlbnRpb24KICAgIHBhcnRzID0gc2VsZi5iYXNlbmFtZSgpLnNwbGl0KCctJykKICAgIHJldHVybiBwYXJ0c1swXQoKICBkZWYgdmVyc2lvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMV0KCiAgZGVmIHJlcG9zaXRvcnlfc3VmZml4KHNlbGYpOgogICAgIyBSZXR1cm5zIGEgY2Fub25pY2FsIHN1ZmZpeCB0aGF0IHdpbGwgZm9ybSBwYXJ0IG9mIHRoZSBuYW1lIG9mIHRoZSBCYXplbAogICAgIyByZXBvc2l0b3J5IGZvciB0aGlzIHBhY2thZ2UuCiAgICBjYW5vbmljYWwgPSAncHlwaV9fe31fe30nLmZvcm1hdChzZWxmLmRpc3RyaWJ1dGlvbigpLCBzZWxmLnZlcnNpb24oKSkKICAgICMgRXNjYXBlIGFueSBpbGxlZ2FsIGNoYXJhY3RlcnMgd2l0aCB1bmRlcnNjb3JlLgogICAgcmV0dXJuIHJlLnN1YignWy0uK10nLCAnXycsIGNhbm9uaWNhbCkKCiAgZGVmIF9kaXN0X2luZm8oc2VsZik6CiAgICAjIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZGlzdC1pbmZvIGRpcmVjdG9yeSB3aXRoaW4gdGhlIC53aGwgZmlsZS4KICAgICMgZS5nLiBnb29nbGVfY2xvdWQtMC4yNy4wLXB5Mi5weTMtbm9uZS1hbnkud2hsIC0+CiAgICAjICAgICAgZ29vZ2xlX2Nsb3VkLTAuMjcuMC5kaXN0LWluZm8KICAgIHJldHVybiAne30te30uZGlzdC1pbmZvJy5mb3JtYXQoc2VsZi5kaXN0cmlidXRpb24oKSwgc2VsZi52ZXJzaW9uKCkpCgogIGRlZiBtZXRhZGF0YShzZWxmKToKICAgICMgRXh0cmFjdCB0aGUgc3RydWN0dXJlZCBkYXRhIGZyb20gbWV0YWRhdGEuanNvbiBpbiB0aGUgV0hMJ3MgZGlzdC1pbmZvCiAgICAjIGRpcmVjdG9yeS4KICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHNlbGYucGF0aCgpLCAncicpIGFzIHdobDoKICAgICAgIyBmaXJzdCBjaGVjayBmb3IgbWV0YWRhdGEuanNvbgogICAgICB0cnk6CiAgICAgICAgd2l0aCB3aGwub3BlbihzZWxmLl9kaXN0X2luZm8oKSArICcvbWV0YWRhdGEuanNvbicpIGFzIGY6CiAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhmLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgIHBhc3MKICAgICAgIyBmYWxsIGJhY2sgdG8gTUVUQURBVEEgZmlsZSAoaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8pCiAgICAgIHdpdGggd2hsLm9wZW4oc2VsZi5fZGlzdF9pbmZvKCkgKyAnL01FVEFEQVRBJykgYXMgZjoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfbWV0YWRhdGEoZi5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQoKICBkZWYgbmFtZShzZWxmKToKICAgIHJldHVybiBzZWxmLm1ldGFkYXRhKCkuZ2V0KCduYW1lJykKCiAgZGVmIGRlcGVuZGVuY2llcyhzZWxmLCBleHRyYT1Ob25lKToKICAgICIiIkFjY2VzcyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgV2hlZWwuCgogICAgQXJnczoKICAgICAgZXh0cmE6IGlmIHNwZWNpZmllZCwgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgb2YgdGhlIG5hbWVkICJleHRyYSIuCgogICAgWWllbGRzOgogICAgICB0aGUgbmFtZXMgb2YgcmVxdWlyZW1lbnRzIGZyb20gdGhlIG1ldGFkYXRhLmpzb24KICAgICIiIgogICAgIyBUT0RPKG1hdHRtb29yKTogSXMgdGhlcmUgYSBzY2hlbWEgdG8gZm9sbG93IGZvciB0aGlzPwogICAgZGVwZW5kZW5jeV9zZXQgPSBzZXQoKQoKICAgIHJ1bl9yZXF1aXJlcyA9IHNlbGYubWV0YWRhdGEoKS5nZXQoJ3J1bl9yZXF1aXJlcycsIFtdKQogICAgZm9yIHJlcXVpcmVtZW50IGluIHJ1bl9yZXF1aXJlczoKICAgICAgaWYgcmVxdWlyZW1lbnQuZ2V0KCdleHRyYScpICE9IGV4dHJhOgogICAgICAgICMgTWF0Y2ggdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGV4dHJhIHdlJ3JlIGxvb2tpbmcgZm9yLgogICAgICAgIGNvbnRpbnVlCiAgICAgIG1hcmtlciA9IHJlcXVpcmVtZW50LmdldCgnZW52aXJvbm1lbnQnKQogICAgICBpZiBtYXJrZXIgYW5kIG5vdCBwa2dfcmVzb3VyY2VzLmV2YWx1YXRlX21hcmtlcihtYXJrZXIpOgogICAgICAgICMgVGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIFBFUCA1MDggbWFya2VyLAogICAgICAgICMgc28gaWdub3JlIHRoaXMgcmVxdWlyZW1lbnQuCiAgICAgICAgY29udGludWUKICAgICAgcmVxdWlyZXMgPSByZXF1aXJlbWVudC5nZXQoJ3JlcXVpcmVzJywgW10pCiAgICAgIGZvciBlbnRyeSBpbiByZXF1aXJlczoKICAgICAgICAjIFN0cmlwIG9mZiBhbnkgdHJhaWxpbmcgdmVyc2lvbmluZyBkYXRhLgogICAgICAgIHBhcnRzID0gcmUuc3BsaXQoJ1sgPjw9KCldJywgZW50cnkpCiAgICAgICAgZGVwZW5kZW5jeV9zZXQuYWRkKHBhcnRzWzBdKQoKICAgIHJldHVybiBkZXBlbmRlbmN5X3NldAoKICBkZWYgZXh0cmFzKHNlbGYpOgogICAgcmV0dXJuIHNlbGYubWV0YWRhdGEoKS5nZXQoJ2V4dHJhcycsIFtdKQoKICBkZWYgZXhwYW5kKHNlbGYsIGRpcmVjdG9yeSk6CiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLnBhdGgoKSwgJ3InKSBhcyB3aGw6CiAgICAgIHdobC5leHRyYWN0YWxsKGRpcmVjdG9yeSkKCiAgIyBfcGFyc2VfbWV0YWRhdGEgcGFyc2VzIE1FVEFEQVRBIGZpbGVzIGFjY29yZGluZyB0byBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMzE0LwogIGRlZiBfcGFyc2VfbWV0YWRhdGEoc2VsZiwgY29udGVudCk6CiAgICAjIFRPRE86IGhhbmRsZSBmaWVsZHMgb3RoZXIgdGhhbiBqdXN0IG5hbWUKICAgIG5hbWVfcGF0dGVybiA9IHJlLmNvbXBpbGUoJ05hbWU6ICguKiknKQogICAgcmV0dXJuIHsgJ25hbWUnOiBuYW1lX3BhdHRlcm4uc2VhcmNoKGNvbnRlbnQpLmdyb3VwKDEpIH0KCgpwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKICAgIGRlc2NyaXB0aW9uPSdVbnBhY2sgYSBXSEwgZmlsZSBhcyBhIHB5X2xpYnJhcnkuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0td2hsJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSAud2hsIGZpbGUgd2UgYXJlIGV4cGFuZGluZy4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tcmVxdWlyZW1lbnRzJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHBpcF9pbXBvcnQgZnJvbSB3aGljaCB0byBkcmF3IGRlcGVuZGVuY2llcy4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kaXJlY3RvcnknLCBhY3Rpb249J3N0b3JlJywgZGVmYXVsdD0nLicsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRvIGV4cGFuZCB0aGluZ3MuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZXh0cmFzJywgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBzZXQgb2YgZXh0cmFzIGZvciB3aGljaCB0byBnZW5lcmF0ZSBsaWJyYXJ5IHRhcmdldHMuJykKCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICB3aGwgPSBXaGVlbChhcmdzLndobCkKCiAgIyBFeHRyYWN0IHRoZSBmaWxlcyBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogIHdobC5leHBhbmQoYXJncy5kaXJlY3RvcnkpCgogIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oYXJncy5kaXJlY3RvcnksICdCVUlMRCcpLCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIgpwYWNrYWdlKGRlZmF1bHRfdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdKQoKbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2xpYnJhcnkiKQpsb2FkKCJ7cmVxdWlyZW1lbnRzfSIsICJyZXF1aXJlbWVudCIpCgpweV9saWJyYXJ5KAogICAgbmFtZSA9ICJwa2ciLAogICAgc3JjcyA9IGdsb2IoWyIqKi8qLnB5Il0pLAogICAgZGF0YSA9IGdsb2IoWyIqKi8qIl0sIGV4Y2x1ZGU9WyIqKi8qLnB5IiwgIioqLyogKiIsICJCVUlMRCIsICJXT1JLU1BBQ0UiXSksCiAgICAjIFRoaXMgbWFrZXMgdGhpcyBkaXJlY3RvcnkgYSB0b3AtbGV2ZWwgaW4gdGhlIHB5dGhvbiBpbXBvcnQKICAgICMgc2VhcmNoIHBhdGggZm9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGlzLgogICAgaW1wb3J0cyA9IFsiLiJdLAogICAgZGVwcyA9IFt7ZGVwZW5kZW5jaWVzfV0sCikKe2V4dHJhc30iIiIuZm9ybWF0KAogIHJlcXVpcmVtZW50cz1hcmdzLnJlcXVpcmVtZW50cywKICBkZXBlbmRlbmNpZXM9JywnLmpvaW4oWwogICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGQKICAgIGZvciBkIGluIHdobC5kZXBlbmRlbmNpZXMoKQogIF0pLAogIGV4dHJhcz0nXG5cbicuam9pbihbCiAgICAiIiJweV9saWJyYXJ5KAogICAgbmFtZSA9ICJ7ZXh0cmF9IiwKICAgIGRlcHMgPSBbCiAgICAgICAgIjpwa2ciLHtkZXBzfQogICAgXSwKKSIiIi5mb3JtYXQoZXh0cmE9ZXh0cmEsCiAgICAgICAgICAgIGRlcHM9JywnLmpvaW4oWwogICAgICAgICAgICAgICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGRlcAogICAgICAgICAgICAgICAgZm9yIGRlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhKQogICAgICAgICAgICBdKSkKICAgIGZvciBleHRyYSBpbiBhcmdzLmV4dHJhcyBvciBbXQogIF0pKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAHN1YnBhci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAGgAAAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQCPoHM8ty4AALcuAAAZAAAAc3VicGFyL3J1bnRpbWUvc3VwcG9ydC5weSMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiIiIlJ1bnRpbWUgc3VwcG9ydCBjb2RlIGZvciBleGVjdXRhYmxlcyBjcmVhdGVkIGJ5IFN1YnBhci4KCjEuIFRoaXJkLXBhcnR5IG1vZHVsZXMgcmVxdWlyZSBzb21lIFBZVEhPTlBBVEggbWFuaXB1bGF0aW9uLgoKMi4gUHl0aG9uIGNhbiBuYXRpdmVseSBpbXBvcnQgcHl0aG9uIG1vZHVsZXMgZnJvbSBhIHppcCBhcmNoaXZlLCBidXQKICAgQyBleHRlbnNpb24gbW9kdWxlcyByZXF1aXJlIHNvbWUgaGVscC4KCjMuIFJlc291cmNlcyBzdG9yZWQgaW4gYSAucGFyIGZpbGUgbWF5IG5lZWQgdG8gYmUgZXhwb3NlZCBhcyBPUy1sZXZlbAogICBmaWxlcyBpbnN0ZWFkIG9mIFB5dGhvbiBGaWxlIG9iamVjdHMuCgpXZSBob29rIGludG8gdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlLCBpZiBwcmVzZW50LCB0byBhY2hpZXZlIDIgYW5kIDMuCgpMaW1pdGF0aW9uczoKCkEuIFJldHJpZXZpbmcgcmVzb3VyY2VzIGZyb20gcGFja2FnZXMKCkl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBkbyB0aGlzOgogICAgZm4gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCdteXBhY2thZ2UnLCAnbXlmaWxlJykKQnV0IGluc3RlYWQgb25lIG11c3QgZG8KICAgIGZuID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgKICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2Uuc3BlYygnbXlwYWNrYWdlJyksCiAgICAgICAgICAgICAnbXlmaWxlJykKCkIuIEV4dHJhY3Rpb24gZGlyCgpZb3Ugc2hvdWxkIGV4cGxpY2l0bHkgc2V0IHRoZSBkZWZhdWx0IGV4dHJhY3Rpb24gZGlyZWN0b3J5LCB2aWEKYHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb25fcGF0aChteV9kaXJlY3RvcnkpYCwgc2luY2UgdGhlIGRlZmF1bHQKaXMgbm90IHNhZmUuICBGb3IgZXhhbXBsZToKCiAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb24odG1wZGlyKQoKWW91IHNob3VsZCBhcnJhbmdlIGZvciB0aGF0IGRpcmVjdG9yeSB0byBiZSBkZWxldGVkIGF0IHNvbWUgcG9pbnQuCk5vdGUgdGhhdCBwa2dfcmVzb3VyY2VzLmNsZWFudXBfcmVzb3VyY2VzKCkgaXMgYW4gdW5pbXBsZW1lbnRlZCBuby1vcCwKc28gdXNlIHNvbWV0aGluZyBlbHNlLiAgRm9yIGV4YW1wbGU6CgogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZSh0bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCgoiIiIKCmltcG9ydCBhdGV4aXQKaW1wb3J0IG9zCmltcG9ydCBwa2d1dGlsCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB6aXBmaWxlCmltcG9ydCB6aXBpbXBvcnQKCgpkZWYgX2xvZyhtc2cpOgogICAgIiIiUHJpbnQgYSBkZWJ1Z2dpbmcgbWVzc2FnZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgcHl0aG9uIC12diBvdXRwdXQiIiIKICAgIGlmIHN5cy5mbGFncy52ZXJib3NlOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuJykKCgpkZWYgX2ZpbmRfYXJjaGl2ZSgpOgogICAgIiIiRmluZCB0aGUgcGF0aCB0byB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyAucGFyIGZpbGUKCiAgICBXZSBkb24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgcHJlZml4IGlzIG5vbi1lbXB0eS4KICAgICIiIgogICAgbWFpbiA9IHN5cy5tb2R1bGVzLmdldCgnX19tYWluX18nKQogICAgaWYgbm90IG1haW46CiAgICAgICAgX2xvZygnIyBfX21haW5fXyBtb2R1bGUgbm90IGZvdW5kJykKICAgICAgICByZXR1cm4gTm9uZQogICAgbWFpbl9sb2FkZXIgPSBnZXRhdHRyKG1haW4sICdfX2xvYWRlcl9fJykKICAgIGlmIG5vdCBtYWluX2xvYWRlcjoKICAgICAgICBfbG9nKCcjIF9fbWFpbl9fLl9fbG9hZGVyX18gbm90IHNldCcpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHByZWZpeCA9IGdldGF0dHIobWFpbl9sb2FkZXIsICdwcmVmaXgnKQogICAgaWYgcHJlZml4ICE9ICcnOgogICAgICAgIF9sb2coJyMgdW5leHBlY3RlZCBwcmVmaXggZm9yIF9fbWFpbl9fLl9fbG9hZGVyX18gaXMgJXMnICUKICAgICAgICAgICAgIG1haW5fbG9hZGVyLnByZWZpeCkKICAgICAgICByZXR1cm4gTm9uZQogICAgYXJjaGl2ZV9wYXRoID0gZ2V0YXR0cihtYWluX2xvYWRlciwgJ2FyY2hpdmUnKQogICAgaWYgbm90IGFyY2hpdmVfcGF0aDoKICAgICAgICBfbG9nKCcjIG1pc3NpbmcgYXJjaGl2ZSBmb3IgX19tYWluX18uX19sb2FkZXJfXycpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBhcmNoaXZlX3BhdGgKCgpkZWYgX2V4dHJhY3RfZmlsZXMoYXJjaGl2ZV9wYXRoKToKICAgICIiIkV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoaXMgLnBhciBmaWxlIHRvIGRpc2suCgogICAgVGhpcyBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIHJlZ2lzdGVycyBhbiBhdGV4aXQKICAgIGhhbmRsZXIgdG8gY2xlYW4gdGhhdCBkaXJlY3Rvcnkgb24gcHJvZ3JhbSBleGl0LiAgRXh0cmFjdGlvbiBhbmQKICAgIGNsZWFudXAgd2lsbCBwb3RlbnRpYWxseSB1c2Ugc2lnbmlmaWNhbnQgdGltZSBhbmQgZGlzayBzcGFjZS4KCiAgICBSZXR1cm5zOgogICAgICAgIERpcmVjdG9yeSB3aGVyZSBjb250ZW50cyB3ZXJlIGV4dHJhY3RlZCB0by4KICAgICIiIgogICAgZXh0cmFjdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKCiAgICBkZWYgX2V4dHJhY3RfZmlsZXNfY2xlYW51cCgpOgogICAgICAgIHNodXRpbC5ybXRyZWUoZXh0cmFjdF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKICAgIGF0ZXhpdC5yZWdpc3RlcihfZXh0cmFjdF9maWxlc19jbGVhbnVwKQogICAgX2xvZygnIyBleHRyYWN0aW5nICVzIHRvICVzJyAlIChhcmNoaXZlX3BhdGgsIGV4dHJhY3RfZGlyKSkKCiAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShhcmNoaXZlX3BhdGgsIG1vZGU9J3InKQogICAgemlwX2ZpbGUuZXh0cmFjdGFsbChleHRyYWN0X2RpcikKICAgIHppcF9maWxlLmNsb3NlKCkKCiAgICByZXR1cm4gZXh0cmFjdF9kaXIKCgpkZWYgX3ZlcnNpb25fY2hlY2tfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzKToKICAgICIiIkNoZWNrIHRoYXQgcGtnX3Jlc291cmNlcyBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkLiIiIgogICAgIyBDaGVjayB0aGF0IHBrZ19yZXNvdXJjZXMgaXMgbmV3IGVub3VnaC4KICAgICMKICAgICMgRGV0ZXJtaW5pbmcgdGhlIHZlcnNpb24gb2YgYW4gYXJiaXRyYXJpbHkgb2xkIHZlcnNpb24gb2YKICAgICMgcGtnX3Jlc291cmNlcyBpcyB0b3VnaCwgc2luY2UgaXQgZG9lc24ndCBoYXZlIGEgdmVyc2lvbiBsaXRlcmFsLAogICAgIyBhbmQgdGhlIGFjY29tcGFueWluZyBzZXR1cHRvb2xzIHBhY2thZ2UgY29tcHV0ZXMgaXRzIHZlcnNpb24KICAgICMgZHluYW1pY2FsbHkgZnJvbSBtZXRhZGF0YSB0aGF0IG1pZ2h0IG5vdCBleGlzdC4gIEFsc28gc2V0dXB0b29scwogICAgIyBtaWdodCBub3QgZXhpc3QsIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2Ugb2YgdGhlIHBpcC12ZW5kb3JlZCBjb3B5CiAgICAjIG9mIHBrZ19yZXNvdXJjZXMuCiAgICAjCiAgICAjIFdlIGRvIGEgZmVhdHVyZSBkZXRlY3Rpb24gaW5zdGVhZC4gIFdlIGV4YW1pbmUKICAgICMgcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZCwgYW5kIHNlZSBpZiBpdCBoYXMgYXQgbGVhc3QgdGhlCiAgICAjIHRoaXJkIGRlZmF1bHQgYXJndW1lbnQgKCdyZXBsYWNlJykuCiAgICB0cnk6CiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgICAgIGRlZmF1bHRzID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZC5pbV9mdW5jLmZ1bmNfZGVmYXVsdHMKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWZhdWx0cyA9IHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldC5hZGQuX19kZWZhdWx0c19fCiAgICAgICAgcmV0dXJuIGxlbihkZWZhdWx0cykgPj0gMwogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBfc2V0dXBfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzX25hbWUpOgogICAgIiIiU2V0dXAgaG9va3MgaW50byB0aGUgYHBrZ19yZXNvdXJjZXNgIG1vZHVsZQoKICAgIFRoaXMgZW5hYmxlcyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUgdG8gZmluZCBtZXRhZGF0YSBmcm9tIHdoZWVscwogICAgdGhhdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhpcyAucGFyIGZpbGUuCgogICAgVGhlIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBoZXJlIGFyZSBzY29wZWQgdG8gdGhpcyBmdW5jdGlvbiwgc2luY2UKICAgIHdlIG1pZ2h0IGhhdmUgbXVsdGl0cGxlIHBrZ19yZXNvdXJjZXMgbW9kdWxlcywgb3Igbm9uZS4KICAgICIiIgoKICAgIHRyeToKICAgICAgICBfX2ltcG9ydF9fKHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBwa2dfcmVzb3VyY2VzID0gc3lzLm1vZHVsZXMuZ2V0KHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBpZiBwa2dfcmVzb3VyY2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGlmIG5vdCBfdmVyc2lvbl9jaGVja19wa2dfcmVzb3VyY2VzKHBrZ19yZXNvdXJjZXMpOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGNsYXNzIERpc3RJbmZvTWV0YWRhdGEocGtnX3Jlc291cmNlcy5FZ2dNZXRhZGF0YSk6CiAgICAgICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIHppcCBmaWxlcyBjb250YWluaW5nIC5kaXN0LWluZm8KCiAgICAgICAgSW4gZmluZF9kaXN0X2luZm9faW5femlwKCksIHdlIGNhbGwKICAgICAgICBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKGRpcmVjdG9yeV9uYW1lKS4gIEhvd2V2ZXIsIGl0IGRvZXNuJ3QKICAgICAgICB3b3JrIHdpdGggRWdnTWV0YWRhdGEsIGJlY2F1c2UgX3ppcGluZm9fbmFtZSgpIGV4cGVjdHMgdGhlCiAgICAgICAgZGlyZWN0b3J5IG5hbWUgdG8gZW5kIHdpdGggYSAvLCBidXQgbWV0YWRhdGEuX2xpc3RkaXIoKSB3aGljaAogICAgICAgIGV4cGVjdHMgdGhlIGRpcmVjdG9yeSB0byBfbm90XyBlbmQgd2l0aCBhIC8uCgogICAgICAgIFRoZXJlZm9yZSB0aGlzIGNsYXNzIGV4aXN0cy4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIF96aXBpbmZvX25hbWUoc2VsZiwgZnNwYXRoKToKICAgICAgICAgICAgIiIiT3ZlcnJpZGVzIEVnZ01ldGFkYXRhLl96aXBpbmZvX25hbWUiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYQogICAgICAgICAgICAjIHppcGZpbGUgc3VicGF0aCB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeQogICAgICAgICAgICAjIGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICAgICAgZnNwYXRoID0gZnNwYXRoLnJzdHJpcChvcy5zZXApCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmxvYWRlci5hcmNoaXZlOgogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuemlwX3ByZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLnppcF9wcmUpCiAgICAgICAgICAgICkKCiAgICAgICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICIiIk92ZXJyaWRlcyBFZ2dNZXRhZGF0YS5fcGFydHMiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydAogICAgICAgICAgICAjIGxpc3QuCiAgICAgICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmVnZ19yb290OgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkgKyAxOl0uc3BsaXQob3Muc2VwKQogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgICAgICkKCiAgICBkZWYgZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgICAgICIiIkZpbmQgZGlzdC1pbmZvIHN0eWxlIG1ldGFkYXRhIGluIHppcCBmaWxlcy4KCiAgICAgICAgaW1wb3J0ZXI6IFBFUCAzMDItc3R5bGUgSW1wb3J0ZXIgb2JqZWN0CiAgICAgICAgcGF0aF9pdGVtIChzdHIpOiBmaWxlbmFtZSBvciBwc2V1ZG8tZmlsZW5hbWUgbGlrZToKICAgICAgICAgICAgL3Vzci9zb21lZGlycy9tYWluLnBhcgogICAgICAgICAgICBvcgogICAgICAgICAgICAvdXNyL3NvbWVkaXJzL21haW4ucGFyL3B5cGlfX3BvcnRwaWNrZXJfMV8yXzAKICAgICAgICBvbmx5IChib29sKTogV2UgaWdub3JlIHRoZSBgb25seWAgZmxhZyBiZWNhdXNlIGl0J3Mgbm90IGNsZWFyCiAgICAgICAgICAgIHdoYXQgaXQgc2hvdWxkIGFjdHVhbGx5IGRvIGluIHRoaXMgY2FzZS4KCiAgICAgICAgWWllbGRzIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIG9iamVjdHMKICAgICAgICAiIiIKICAgICAgICBtZXRhZGF0YSA9IERpc3RJbmZvTWV0YWRhdGEoaW1wb3J0ZXIpCiAgICAgICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignLycpOgogICAgICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzdWJpdGVtKQogICAgICAgICAgICBpZiBleHQubG93ZXIoKSA9PSAnLmRpc3QtaW5mbyc6CiAgICAgICAgICAgICAgICAjIFBhcnNlIGRpc3RyaWJ1dGlvbiBuYW1lCiAgICAgICAgICAgICAgICBtYXRjaCA9IHBrZ19yZXNvdXJjZXMuRUdHX05BTUUoYmFzZW5hbWUpCiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUgPSAndW5rbm93bicKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSA9IG1hdGNoLmdyb3VwKCduYW1lJykKICAgICAgICAgICAgICAgICMgQ3JlYXRlIG1ldGFkYXRhIG9iamVjdAogICAgICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgICAgICBzdWJtZXRhID0gRGlzdEluZm9NZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGF0aF9pdGVtKSkKICAgICAgICAgICAgICAgICMgT3ZlcnJpZGUgcGtnX3Jlc291cmNlcyBkZWZhdWx0cyB0byBhdm9pZAogICAgICAgICAgICAgICAgIyAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90CiAgICAgICAgICAgICAgICAjIC56aXAiIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX25hbWUgPSBwcm9qZWN0X25hbWUKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX2luZm8gPSBzdWJwYXRoCiAgICAgICAgICAgICAgICBzdWJtZXRhLmVnZ19yb290ID0gcGF0aF9pdGVtCiAgICAgICAgICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIHN1Yml0ZW0sIHN1Ym1ldGEpCiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgZGVmIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICAgICAiIiJDaGFpbiB0b2dldGhlciBvdXIgZmluZGVyIGFuZCB0aGUgc3RhbmRhcmQgcGtnX3Jlc291cmNlcyBmaW5kZXIKCiAgICAgICAgRm9yIHNpbXBsaWNpdHksIGFuZCBzaW5jZSBwa2dfcmVzb3VyY2VzIGRvZXNuJ3QgcHJvdmlkZSBhIHB1YmxpYwogICAgICAgIGludGVyZmFjZSB0byBkbyBzbywgd2UgaGFyZGNvZGUgdGhlIGNoYWluaW5nIChmaW5kX2VnZ3NfaW5femlwKS4KICAgICAgICAiIiIKICAgICAgICAjIE91ciBmaW5kZXIKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSk6CiAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAjIFRoZSBzdGFuZGFyZCBwa2dfcmVzb3VyY2VzIGZpbmRlcgogICAgICAgIGZvciBkaXN0IGluIHBrZ19yZXNvdXJjZXMuZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KToKICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgIHJldHVybgoKICAgICMgVGhpcyBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyByZWdpc3RlcmVkIGZpbmRlci4KICAgIHBrZ19yZXNvdXJjZXMucmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcCkKCiAgICAjIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBXb3JraW5nU2V0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kCiAgICAjIHRoZXJlIGlzIG5vIHB1YmxpYyBpbnRlcmZhY2UgdG8gZWFzaWx5IHJlZnJlc2gvcmVsb2FkIGl0IHRoYXQKICAgICMgZG9lc24ndCBhbHNvIGhhdmUgYSAiRG9uJ3QgdXNlIHRoaXMiIHdhcm5pbmcuICBTbyB3ZSBtYW51YWxseQogICAgIyBhZGQganVzdCB0aGUgZW50cmllcyB3ZSBrbm93IGFib3V0IHRvIHRoZSBleGlzdGluZyBXb3JraW5nU2V0LgogICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgIGltcG9ydGVyID0gcGtndXRpbC5nZXRfaW1wb3J0ZXIoZW50cnkpCiAgICAgICAgaWYgaXNpbnN0YW5jZShpbXBvcnRlciwgemlwaW1wb3J0LnppcGltcG9ydGVyKToKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBlbnRyeSwgb25seT1UcnVlKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGlzdC5fcHJvdmlkZXIsIERpc3RJbmZvTWV0YWRhdGEpOgogICAgICAgICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYWRkKGRpc3QsIGVudHJ5LCBpbnNlcnQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT1UcnVlKQoKCmRlZiBfaW5pdGlhbGl6ZV9pbXBvcnRfcGF0aChpbXBvcnRfcm9vdHMsIGltcG9ydF9wcmVmaXgpOgogICAgIiIiQWRkIGV4dHJhIGVudHJpZXMgdG8gUFlUSE9OUEFUSCBzbyB0aGF0IG1vZHVsZXMgY2FuIGJlIGltcG9ydGVkLiIiIgogICAgIyBXZSB0cnkgdG8gbWF0Y2ggdG8gb3JkZXIgb2YgQmF6ZWwncyBzdHViCiAgICBmdWxsX3Jvb3RzID0gWwogICAgICAgIG9zLnBhdGguam9pbihpbXBvcnRfcHJlZml4LCBpbXBvcnRfcm9vdCkKICAgICAgICBmb3IgaW1wb3J0X3Jvb3QgaW4gaW1wb3J0X3Jvb3RzXQogICAgc3lzLnBhdGhbMToxXSA9IGZ1bGxfcm9vdHMKICAgIF9sb2coJyMgYWRkaW5nICVzIHRvIHN5cy5wYXRoJyAlIGZ1bGxfcm9vdHMpCgoKZGVmIHNldHVwKGltcG9ydF9yb290cywgemlwX3NhZmUpOgogICAgIiIiSW5pdGlhbGl6ZSBzdWJwYXIgcnVuLXRpbWUgc3VwcG9ydAoKICAgIEFyZ3M6CiAgICAgIGltcG9ydF9yb290IChsaXN0KTogc3ViZGlycyBpbnNpZGUgLnBhciBmaWxlIHRvIGFkZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaW1wb3J0IHBhdGggYXQgcnVudGltZS4KICAgICAgemlwX3NhZmUgKGJvb2wpOiBJZiBGYWxzZSwgZXh0cmFjdCB0aGUgLnBhciBmaWxlIGNvbnRlbnRzIHRvIGEKICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhbmQgaW1wb3J0IGV2ZXJ5dGhpbmcgZnJvbQogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZGlyZWN0b3J5LgoKICAgIFJldHVybnM6CiAgICAgIFRydWUgaWYgc2V0dXAgd2FzIHN1Y2Nlc3NmdWwsIGVsc2UgRmFsc2UKICAgICIiIgogICAgYXJjaGl2ZV9wYXRoID0gX2ZpbmRfYXJjaGl2ZSgpCiAgICBpZiBub3QgYXJjaGl2ZV9wYXRoOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQnLAogICAgICAgICAgICAgICAgICAgICAgVXNlcldhcm5pbmcpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBvcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbMF0pICE9IG9zLnBhdGguYWJzcGF0aChhcmNoaXZlX3BhdGgpOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQuICcgKwogICAgICAgICAgICAgICAgICAgICAgJ2FyY2hpdmVfcGF0aCB3YXMgJXIsIHN5cy5wYXRoIHdhcyAlcicgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRoLCBzeXMucGF0aCksCiAgICAgICAgICAgICAgICAgICAgICBVc2VyV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIEV4dHJhY3QgZmlsZXMgdG8gZGlzayBpZiBuZWNlc3NhcnkKICAgIGlmIG5vdCB6aXBfc2FmZToKICAgICAgICBleHRyYWN0X2RpciA9IF9leHRyYWN0X2ZpbGVzKGFyY2hpdmVfcGF0aCkKICAgICAgICAjIHN5cy5wYXRoWzBdIGlzIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRpbmcgLnBhciBmaWxlLiAgUG9pbnQKICAgICAgICAjIGl0IHRvIHRoZSBleHRyYWN0IGRpcmVjdG9yeSBpbnN0ZWFkLCBzbyB0aGF0IFB5dGhvbiBzZWFyY2hlcwogICAgICAgICMgdGhlcmUgZm9yIGltcG9ydHMuCiAgICAgICAgc3lzLnBhdGhbMF0gPSBleHRyYWN0X2RpcgogICAgICAgIGltcG9ydF9wcmVmaXggPSBleHRyYWN0X2RpcgogICAgZWxzZTogICMgSW1wb3J0IGRpcmVjdGx5IGZyb20gLnBhciBmaWxlCiAgICAgICAgZXh0cmFjdF9kaXIgPSBOb25lCiAgICAgICAgaW1wb3J0X3ByZWZpeCA9IGFyY2hpdmVfcGF0aAoKICAgICMgSW5pdGlhbGl6ZSBpbXBvcnQgcGF0aAogICAgX2luaXRpYWxpemVfaW1wb3J0X3BhdGgoaW1wb3J0X3Jvb3RzLCBpbXBvcnRfcHJlZml4KQoKICAgICMgQWRkIGhvb2sgZm9yIHBhY2thZ2UgbWV0YWRhdGEKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwa2dfcmVzb3VyY2VzJykKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwaXAuX3ZlbmRvci5wa2dfcmVzb3VyY2VzJykKCiAgICByZXR1cm4gVHJ1ZQpQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAXAAAAX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAKlJvIQohAAAKIQAACwAAAAAAAAAAAAAAAABAAAAAX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEATzlpVeINAADiDQAAJgAAAAAAAAAAAAAAAABzIQAAYmF6ZWxfdG9vbHMvdG9vbHMvcHl0aG9uL3B5M3dyYXBwZXIuc2hQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAACZLwAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCrcTRXBwUAAAcFAABAAAAAAAAAAAAAAAAAAN8vAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0UEsBAhQDFAAAAAAAAAAhADxQfyX5CQAA+QkAADkAAAAAAAAAAAAAAAAARDUAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9NRVRBREFUQVBLAQIUAxQAAAAAAAAAIQBX/iPlmGIAAJhiAAA3AAAAAAAAAAAAAAAAAJQ/AABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vUkVDT1JEUEsBAhQDFAAAAAAAAAAhAPbd0r5uAAAAbgAAADYAAAAAAAAAAAAAAAAAgaIAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9XSEVFTFBLAQIUAxQAAAAAAAAAIQC0F5jERAAAAEQAAABBAAAAAAAAAAAAAAAAAEOjAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFBLAQIUAxQAAAAAAAAAIQDI4LebHQYAAB0GAAA+AAAAAAAAAAAAAAAAAOajAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vbWV0YWRhdGEuanNvblBLAQIUAxQAAAAAAAAAIQDHH5fCBAAAAAQAAAA+AAAAAAAAAAAAAAAAAF+qAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vdG9wX2xldmVsLnR4dFBLAQIUAxQAAAAAAAAAIQANW9B2tC4AALQuAAAsAAAAAAAAAAAAAAAAAL+qAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBLSaRlSAIAAEgCAAAsAAAAAAAAAAAAAAAAAL3ZAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fX21haW5fXy5weVBLAQIUAxQAAAAAAAAAIQBPvcxIPhIAAD4SAAA0AAAAAAAAAAAAAAAAAE/cAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAIWJlopgVwAAYFcAADMAAAAAAAAAAAAAAAAA3+4AAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvYXBwZGlycy5weVBLAQIUAxQAAAAAAAAAIQAAVqw6LgEAAC4BAABBAAAAAAAAAAAAAAAAAJBGAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDaVEalKAUAACgFAAA9AAAAAAAAAAAAAAAAAB1IAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fY21kLnB5UEsBAhQDFAAAAAAAAAAhAFDmqSwAEgAAABIAAEAAAAAAAAAAAAAAAAAAoE0BAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2FkYXB0ZXIucHlQSwECFAMUAAAAAAAAACEAEqrG8BYDAAAWAwAAPgAAAAAAAAAAAAAAAAD+XwEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGUucHlQSwECFAMUAAAAAAAAACEAnh1W/HEBAABxAQAASAAAAAAAAAAAAAAAAABwYwEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAMGnBv/MDQAAzA0AAEoAAAAAAAAAAAAAAAAAR2UBAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9maWxlX2NhY2hlLnB5UEsBAhQDFAAAAAAAAAAhANOIxlTNAwAAzQMAAEsAAAAAAAAAAAAAAAAAe3MBAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9yZWRpc19jYWNoZS5weVBLAQIUAxQAAAAAAAAAIQAtPC0zfAEAAHwBAAA/AAAAAAAAAAAAAAAAALF3AQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb21wYXQucHlQSwECFAMUAAAAAAAAACEAx2C53uAyAADgMgAAQwAAAAAAAAAAAAAAAACKeQEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29udHJvbGxlci5weVBLAQIUAxQAAAAAAAAAIQBsJjR84wkAAOMJAABEAAAAAAAAAAAAAAAAAMusAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9maWxld3JhcHBlci5weVBLAQIUAxQAAAAAAAAAIQAOVB78LRAAAC0QAABDAAAAAAAAAAAAAAAAABC3AQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9oZXVyaXN0aWNzLnB5UEsBAhQDFAAAAAAAAAAhABJhgLiIGQAAiBkAAEIAAAAAAAAAAAAAAAAAnscBAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3NlcmlhbGl6ZS5weVBLAQIUAxQAAAAAAAAAIQCLe8VC8gEAAPIBAABAAAAAAAAAAAAAAAAAAIbhAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC93cmFwcGVyLnB5UEsBAhQDFAAAAAAAAAAhABRwBUc/AAAAPwAAADwAAAAAAAAAAAAAAAAA1uMBAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCDK9rBKQAAACkAAAA8AAAAAAAAAAAAAAAAAG/kAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEABaHa9fAiBADwIgQAOwAAAAAAAAAAAAAAAADy5AEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL2NhY2VydC5wZW1QSwECFAMUAAAAAAAAACEACRNCR0QDAABEAwAAOAAAAAAAAAAAAAAAAAA7CAYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL2NvcmUucHlQSwECFAMUAAAAAAAAACEA8M8PUxcGAAAXBgAAPAAAAAAAAAAAAAAAAADVCwYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhADm/hBAWegAAFnoAADwAAAAAAAAAAAAAAAAARhIGAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1ZnJlcS5weVBLAQIUAxQAAAAAAAAAIQDL52dm3QYAAN0GAAA+AAAAAAAAAAAAAAAAALaMBgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvYmlnNXByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQDgWSg9wyQAAMMkAABEAAAAAAAAAAAAAAAAAO+TBgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcmRpc3RyaWJ1dGlvbi5weVBLAQIUAxQAAAAAAAAAIQCJWSSIyw4AAMsOAABGAAAAAAAAAAAAAAAAABS5BgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldGdyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAOCXYVr2EwAA9hMAAEEAAAAAAAAAAAAAAAAAQ8gGAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0cHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAJMG1zIBAAAAAQAAAEAAAAAAAAAAAAAAAAAAmNwGAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAX92tubIKAACyCgAAQgAAAAAAAAAAAAAAAAD33AYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NsaS9jaGFyZGV0ZWN0LnB5UEsBAhQDFAAAAAAAAAAhAFz7N0gGDgAABg4AAEYAAAAAAAAAAAAAAAAACegGAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jb2RpbmdzdGF0ZW1hY2hpbmUucHlQSwECFAMUAAAAAAAAACEAfIblZW4EAABuBAAAOgAAAAAAAAAAAAAAAABz9gYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQC9QpoxPwcAAD8HAAA/AAAAAAAAAAAAAAAAADn7BgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY3A5NDlwcm9iZXIucHlQSwECFAMUAAAAAAAAACEARASsyX0GAAB9BgAAOQAAAAAAAAAAAAAAAADVAgcAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VudW1zLnB5UEsBAhQDFAAAAAAAAAAhAASIBT1uDwAAbg8AAD0AAAAAAAAAAAAAAAAAqQkHAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lc2Nwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAwQpgog4pAAAOKQAAOQAAAAAAAAAAAAAAAAByGQcAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VzY3NtLnB5UEsBAhQDFAAAAAAAAAAhACA3xNClDgAApQ4AAD8AAAAAAAAAAAAAAAAA10IHAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNqcHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQD0QQN56jQAAOo0AAA9AAAAAAAAAAAAAAAAANlRBwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3JmcmVxLnB5UEsBAhQDFAAAAAAAAAAhACYFl/jUBgAA1AYAAD8AAAAAAAAAAAAAAAAAHocHAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcnByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQDM20nVhXsAAIV7AAA9AAAAAAAAAAAAAAAAAE+OBwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdmcmVxLnB5UEsBAhQDFAAAAAAAAAAhAKBBjRjTBgAA0wYAAD8AAAAAAAAAAAAAAAAALwoIAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d3Byb2Jlci5weVBLAQIUAxQAAAAAAAAAIQAZRdLX61AAAOtQAAA+AAAAAAAAAAAAAAAAAF8RCABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEyZnJlcS5weVBLAQIUAxQAAAAAAAAAIQB+q/6P2gYAANoGAABAAAAAAAAAAAAAAAAAAKZiCABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEycHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAA0p07IONgAADjYAAEAAAAAAAAAAAAAAAAAA3mkIAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9oZWJyZXdwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAwho5YbFkAACxZAAAOwAAAAAAAAAAAAAAAABKoAgAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2ppc2ZyZXEucHlQSwECFAMUAAAAAAAAACEABnklartMAAC7TAAAOgAAAAAAAAAAAAAAAABUBQkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2pwY250eC5weVBLAQIUAxQAAAAAAAAAIQDwaMnKJzIAACcyAABGAAAAAAAAAAAAAAAAAGdSCQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2J1bGdhcmlhbm1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAMjxVpscRgAAHEYAAEUAAAAAAAAAAAAAAAAA8oQJAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nY3lyaWxsaWNtb2RlbC5weVBLAQIUAxQAAAAAAAAAIQD+u68pkDEAAJAxAABCAAAAAAAAAAAAAAAAAHHLCQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2dyZWVrbW9kZWwucHlQSwECFAMUAAAAAAAAACEAj2atGFEsAABRLAAAQwAAAAAAAAAAAAAAAABh/QkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdoZWJyZXdtb2RlbC5weVBLAQIUAxQAAAAAAAAAIQDDwVWAMDEAADAxAABGAAAAAAAAAAAAAAAAABMqCgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2h1bmdhcmlhbm1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhACIP0j8aLAAAGiwAAEEAAAAAAAAAAAAAAAAAp1sKAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndGhhaW1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhALUyw2ReKwAAXisAAEQAAAAAAAAAAAAAAAAAIIgKAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndHVya2lzaG1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAOTs8KT6FAAA+hQAAEAAAAAAAAAAAAAAAAAA4LMKAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYXRpbjFwcm9iZXIucHlQSwECFAMUAAAAAAAAACEANnUYTVUNAABVDQAAQwAAAAAAAAAAAAAAAAA4yQoAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY2hhcnNldHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQCt0xGo3AcAANwHAABDAAAAAAAAAAAAAAAAAO7WCgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc2dyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAGn24Q+JYwAAiWMAADoAAAAAAAAAAAAAAAAAK98KAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9tYmNzc20ucHlQSwECFAMUAAAAAAAAACEAHnXvHhkWAAAZFgAAQwAAAAAAAAAAAAAAAAAMQwsAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NiY2hhcnNldHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQCK/k+g2g0AANoNAABDAAAAAAAAAAAAAAAAAIZZCwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2Jjc2dyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhANaRZzK+DgAAvg4AAD4AAAAAAAAAAAAAAAAAwWcLAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9zamlzcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAHWARz3FMAAAxTAAAEUAAAAAAAAAAAAAAAAA23YLAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC91bml2ZXJzYWxkZXRlY3Rvci5weVBLAQIUAxQAAAAAAAAAIQD1v7w9zgoAAM4KAAA+AAAAAAAAAAAAAAAAAAOoCwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdXRmOHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQBHx5DX8gAAAPIAAAA7AAAAAAAAAAAAAAAAAC2zCwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQBY1Gk58AAAAPAAAAA9AAAAAAAAAAAAAAAAAHi0CwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAD4Vp1/cCQAA3AkAADkAAAAAAAAAAAAAAAAAw7ULAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaS5weVBLAQIUAxQAAAAAAAAAIQDHY8DZxCUAAMQlAABAAAAAAAAAAAAAAAAAAPa/CwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL2Fuc2l0b3dpbjMyLnB5UEsBAhQDFAAAAAAAAAAhAH3W2C99BwAAfQcAAD8AAAAAAAAAAAAAAAAAGOYLAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvaW5pdGlhbGlzZS5weVBLAQIUAxQAAAAAAAAAIQANbaI99RQAAPUUAAA6AAAAAAAAAAAAAAAAAPLtCwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbjMyLnB5UEsBAhQDFAAAAAAAAAAhAHd7ZyGSGAAAkhgAADwAAAAAAAAAAAAAAAAAPwMMAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvd2ludGVybS5weVBLAQIUAxQAAAAAAAAAIQAmnFGXRQIAAEUCAAA8AAAAAAAAAAAAAAAAACscDABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAI+9n/BIBAAASAQAARgAAAAAAAAAAAAAAAADKHgwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCvii9lywMAAMsDAABCAAAAAAAAAAAAAAAAAEAgDABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L21pc2MucHlQSwECFAMUAAAAAAAAACEA4mI90C9kAAAvZAAARAAAAAAAAAAAAAAAAABrJAwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zaHV0aWwucHlQSwECFAMUAAAAAAAAACEAbxYArTkKAAA5CgAASAAAAAAAAAAAAAAAAAD8iAwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcuY2ZnUEsBAhQDFAAAAAAAAAAhADYPUtZLaQAAS2kAAEcAAAAAAAAAAAAAAAAAm5MMAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLnB5UEsBAhQDFAAAAAAAAAAhAERCH0PUaQEA1GkBAEUAAAAAAAAAAAAAAAAAS/0MAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvdGFyZmlsZS5weVBLAQIUAxQAAAAAAAAAIQBfCXNgYZ8AAGGfAAA6AAAAAAAAAAAAAAAAAIJnDgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhADoKw7wIwgAACMIAADwAAAAAAAAAAAAAAAAAOwcPAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9kYXRhYmFzZS5weVBLAQIUAxQAAAAAAAAAIQCDOOItXVIAAF1SAAA5AAAAAAAAAAAAAAAAAJ3JDwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvaW5kZXgucHlQSwECFAMUAAAAAAAAACEA0cV4r0XHAABFxwAAPAAAAAAAAAAAAAAAAABRHBAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2xvY2F0b3JzLnB5UEsBAhQDFAAAAAAAAAAhAIaXtZvaOQAA2jkAADwAAAAAAAAAAAAAAAAA8OMQAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9tYW5pZmVzdC5weVBLAQIUAxQAAAAAAAAAIQA9Ea4CihgAAIoYAAA7AAAAAAAAAAAAAAAAACQeEQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWFya2Vycy5weVBLAQIUAxQAAAAAAAAAIQANpmzxsZcAALGXAAA8AAAAAAAAAAAAAAAAAAc3EQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWV0YWRhdGEucHlQSwECFAMUAAAAAAAAACEAyLdFmA4qAAAOKgAAPQAAAAAAAAAAAAAAAAASzxEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3Jlc291cmNlcy5weVBLAQIUAxQAAAAAAAAAIQC6/+vbeDsAAHg7AAA7AAAAAAAAAAAAAAAAAHv5EQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvc2NyaXB0cy5weVBLAQIUAxQAAAAAAAAAIQD1mJAMAFwBAABcAQA4AAAAAAAAAAAAAAAAAEw1EgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdDMyLmV4ZVBLAQIUAxQAAAAAAAAAIQCe4sVZAH4BAAB+AQA4AAAAAAAAAAAAAAAAAKKREwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdDY0LmV4ZVBLAQIUAxQAAAAAAAAAIQA32AEl/84AAP/OAAA4AAAAAAAAAAAAAAAAAPgPFQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdXRpbC5weVBLAQIUAxQAAAAAAAAAIQCg/QVWn1wAAJ9cAAA7AAAAAAAAAAAAAAAAAE3fFQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQDYfQCJAE4BAABOAQA4AAAAAAAAAAAAAAAAAEU8FgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdzMyLmV4ZVBLAQIUAxQAAAAAAAAAIQBezEvvAHABAABwAQA4AAAAAAAAAAAAAAAAAJuKFwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdzY0LmV4ZVBLAQIUAxQAAAAAAAAAIQBf1KCpy5gAAMuYAAA5AAAAAAAAAAAAAAAAAPH6GABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvd2hlZWwucHlQSwECFAMUAAAAAAAAACEAkcHArs2VAADNlQAAMgAAAAAAAAAAAAAAAAATlBkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0cm8ucHlQSwECFAMUAAAAAAAAACEAopuZnAwDAAAMAwAAPQAAAAAAAAAAAAAAAAAwKhoAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDVeA7iQUEAAEFBAAA+AAAAAAAAAAAAAAAAAJctGgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19paGF0ZXhtbC5weVBLAQIUAxQAAAAAAAAAIQAeDG01FH8AABR/AABBAAAAAAAAAAAAAAAAADRvGgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19pbnB1dHN0cmVhbS5weVBLAQIUAxQAAAAAAAAAIQDERmoWJCsBACQrAQA/AAAAAAAAAAAAAAAAAKfuGgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190b2tlbml6ZXIucHlQSwECFAMUAAAAAAAAACEA79OvDyEBAAAhAQAAQwAAAAAAAAAAAAAAAAAoGhwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDMlT6W0wMAANMDAABAAAAAAAAAAAAAAAAAAKobHABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL19iYXNlLnB5UEsBAhQDFAAAAAAAAAAhACRVnamaBAAAmgQAAEEAAAAAAAAAAAAAAAAA2x8cAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvZGF0cmllLnB5UEsBAhQDFAAAAAAAAAAhAEtPbs7vBgAA7wYAAD0AAAAAAAAAAAAAAAAA1CQcAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvcHkucHlQSwECFAMUAAAAAAAAACEAJuOuWAAQAAAAEAAAOwAAAAAAAAAAAAAAAAAeLBwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdXRpbHMucHlQSwECFAMUAAAAAAAAACEAyKR9/rtFAQC7RQEAPgAAAAAAAAAAAAAAAAB3PBwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9jb25zdGFudHMucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAACOgh0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAG7QfIBtAgAAbQIAAFMAAAAAAAAAAAAAAAAA8YIdAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9hbHBoYWJldGljYWxhdHRyaWJ1dGVzLnB5UEsBAhQDFAAAAAAAAAAhACKA+8QeAQAAHgEAAEEAAAAAAAAAAAAAAAAAz4UdAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9iYXNlLnB5UEsBAhQDFAAAAAAAAAAhACHAPIy2CgAAtgoAAFAAAAAAAAAAAAAAAAAATIcdAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9pbmplY3RfbWV0YV9jaGFyc2V0LnB5UEsBAhQDFAAAAAAAAAAhAH3r0rUlDQAAJQ0AAEEAAAAAAAAAAAAAAAAAcJIdAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9saW50LnB5UEsBAhQDFAAAAAAAAAAhACHtnSQmKQAAJikAAEkAAAAAAAAAAAAAAAAA9J8dAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9vcHRpb25hbHRhZ3MucHlQSwECFAMUAAAAAAAAACEAmh5UmBhiAAAYYgAARgAAAAAAAAAAAAAAAACByR0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3Nhbml0aXplci5weVBLAQIUAxQAAAAAAAAAIQCfjmqtcwQAAHMEAABHAAAAAAAAAAAAAAAAAP0rHgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvd2hpdGVzcGFjZS5weVBLAQIUAxQAAAAAAAAAIQBj2HfcsskBALLJAQBAAAAAAAAAAAAAAAAAANUwHgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2h0bWw1cGFyc2VyLnB5UEsBAhQDFAAAAAAAAAAhANzHuzRhNwAAYTcAAD8AAAAAAAAAAAAAAAAA5fofAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvc2VyaWFsaXplci5weVBLAQIUAxQAAAAAAAAAIQCCMmMk0AAAANAAAABKAAAAAAAAAAAAAAAAAKMyIABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAxJ8e+EwYAABMGAABIAAAAAAAAAAAAAAAAANszIABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9nZW5zaGkucHlQSwECFAMUAAAAAAAAACEA5FxfEH0GAAB9BgAARQAAAAAAAAAAAAAAAABUOiAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvc2F4LnB5UEsBAhQDFAAAAAAAAAAhAEfZN25ODQAATg0AAEoAAAAAAAAAAAAAAAAANEEgAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAETKVqp2NgAAdjYAAEYAAAAAAAAAAAAAAAAA6k4gAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2Jhc2UucHlQSwECFAMUAAAAAAAAACEACOou+IMiAACDIgAARQAAAAAAAAAAAAAAAADEhSAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZG9tLnB5UEsBAhQDFAAAAAAAAAAhAKF9l/DcMQAA3DEAAEcAAAAAAAAAAAAAAAAAqqggAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlLnB5UEsBAhQDFAAAAAAAAAAhANr+StBRNwAAUTcAAEwAAAAAAAAAAAAAAAAA69ogAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlX2x4bWwucHlQSwECFAMUAAAAAAAAACEAc0QhlqgVAACoFQAASQAAAAAAAAAAAAAAAACmEiEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBNI5jASxMAAEsTAABFAAAAAAAAAAAAAAAAALUoIQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2Jhc2UucHlQSwECFAMUAAAAAAAAACEAZYpvqYUFAACFBQAARAAAAAAAAAAAAAAAAABjPCEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9kb20ucHlQSwECFAMUAAAAAAAAACEAIsEQMUwSAABMEgAARgAAAAAAAAAAAAAAAABKQiEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZS5weVBLAQIUAxQAAAAAAAAAIQCWDZxHpRgAAKUYAABLAAAAAAAAAAAAAAAAAPpUIQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2V0cmVlX2x4bWwucHlQSwECFAMUAAAAAAAAACEAE19tEAUJAAAFCQAARwAAAAAAAAAAAAAAAAAIbiEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9nZW5zaGkucHlQSwECFAMUAAAAAAAAACEAAEdcmzoAAAA6AAAAOQAAAAAAAAAAAAAAAABydyEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAPNI1OnjDAAA4wwAADYAAAAAAAAAAAAAAAAAA3ghAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb2RlYy5weVBLAQIUAxQAAAAAAAAAIQB8gZZw6AAAAOgAAAA3AAAAAAAAAAAAAAAAADqFIQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAAku+nF+LAAAfiwAADUAAAAAAAAAAAAAAAAAd4YhAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb3JlLnB5UEsBAhQDFAAAAAAAAAAhAGO8+hHngAAA54AAADkAAAAAAAAAAAAAAAAASLMhAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9pZG5hZGF0YS5weVBLAQIUAxQAAAAAAAAAIQC3Y/Sy1QYAANUGAAA6AAAAAAAAAAAAAAAAAIY0IgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvaW50cmFuZ2VzLnB5UEsBAhQDFAAAAAAAAAAhABvnfaIVAAAAFQAAAD0AAAAAAAAAAAAAAAAAszsiAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9wYWNrYWdlX2RhdGEucHlQSwECFAMUAAAAAAAAACEAyYWFhXDSAgBw0gIAOgAAAAAAAAAAAAAAAAAjPCIAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL3V0czQ2ZGF0YS5weVBLAQIUAxQAAAAAAAAAIQDdxKYFMDkBADA5AQA1AAAAAAAAAAAAAAAAAOsOJQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lwYWRkcmVzcy5weVBLAQIUAxQAAAAAAAAAIQDzmSOAmyQAAJskAAA9AAAAAAAAAAAAAAAAAG5IJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhACve8idcCgAAXAoAAEEAAAAAAAAAAAAAAAAAZG0mAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvbGlua2xvY2tmaWxlLnB5UEsBAhQDFAAAAAAAAAAhACEmvH4YDAAAGAwAAEIAAAAAAAAAAAAAAAAAH3gmAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvbWtkaXJsb2NrZmlsZS5weVBLAQIUAxQAAAAAAAAAIQAgPHItyhcAAMoXAABAAAAAAAAAAAAAAAAAAJeEJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3BpZGxvY2tmaWxlLnB5UEsBAhQDFAAAAAAAAAAhALuF8L2CFQAAghUAAEMAAAAAAAAAAAAAAAAAv5wmAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3FsaXRlbG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEAkSMJ2TgKAAA4CgAARAAAAAAAAAAAAAAAAACisiYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9zeW1saW5rbG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEA1lIZI/4PAAD+DwAANwAAAAAAAAAAAAAAAAA8vSYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9vcmRlcmVkZGljdC5weVBLAQIUAxQAAAAAAAAAIQA8KVjG0AIAANACAAA/AAAAAAAAAAAAAAAAAI/NJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHlQSwECFAMUAAAAAAAAACEAgXaWygECAAABAgAAPgAAAAAAAAAAAAAAAAC80CYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA5mlK41wDAABcAwAAPQAAAAAAAAAAAAAAAAAZ0yYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQD6/aQSiAUAAIgFAABBAAAAAAAAAAAAAAAAANDWJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQB9LCtXJiAAACYgAAA9AAAAAAAAAAAAAAAAALfcJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5UEsBAhQDFAAAAAAAAAAhAK4Rn/PnEAAA5xAAAEIAAAAAAAAAAAAAAAAAOP0mAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weVBLAQIUAxQAAAAAAAAAIQB8RYOMeW0AAHltAABAAAAAAAAAAAAAAAAAAH8OJwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5UEsBAhQDFAAAAAAAAAAhAMXqJw+lAQAApQEAADsAAAAAAAAAAAAAAAAAVnwnAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAA7vxqEkLQAAJC0AAD0AAAAAAAAAAAAAAAAAVH4nAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAyS1AJj6TAQA+kwEAQgAAAAAAAAAAAAAAAADTqycAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAPpacYzPCwAAzwsAAD0AAAAAAAAAAAAAAAAAcT8pAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAD8NGA30KAAB9CgAAOAAAAAAAAAAAAAAAAACbSykAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9iYXIucHlQSwECFAMUAAAAAAAAACEAKn/xMN4FAADeBQAAPAAAAAAAAAAAAAAAAABuVikAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9jb3VudGVyLnB5UEsBAhQDFAAAAAAAAAAhAM7sD04mCwAAJgsAADwAAAAAAAAAAAAAAAAAplwpAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvaGVscGVycy5weVBLAQIUAxQAAAAAAAAAIQB3CFJ7IgUAACIFAAA8AAAAAAAAAAAAAAAAACZoKQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL3NwaW5uZXIucHlQSwECFAMUAAAAAAAAACEAwSB0jqtrAwCrawMANQAAAAAAAAAAAAAAAACibSkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9weXBhcnNpbmcucHlQSwECFAMUAAAAAAAAACEAYB4HjQUDAAAFAwAANQAAAAAAAAAAAAAAAACg2SwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZS12ZW5kb3IucHlQSwECFAMUAAAAAAAAACEAH8buMPcNAAD3DQAAPQAAAAAAAAAAAAAAAAD43CwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDffHkltAEAALQBAABAAAAAAAAAAAAAAAAAAErrLABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19fdmVyc2lvbl9fLnB5UEsBAhQDFAAAAAAAAAAhAIipObtIBAAASAQAAEQAAAAAAAAAAAAAAAAAXO0sAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX2ludGVybmFsX3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhACNQ3lIYUgAAGFIAAD0AAAAAAAAAAAAAAAAABvIsAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYWRhcHRlcnMucHlQSwECFAMUAAAAAAAAACEAmGPoL10YAABdGAAAOAAAAAAAAAAAAAAAAAB5RC0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hcGkucHlQSwECFAMUAAAAAAAAACEAA63ykgAmAAAAJgAAOQAAAAAAAAAAAAAAAAAsXS0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hdXRoLnB5UEsBAhQDFAAAAAAAAAAhAAWh2vXwIgQA8CIEADwAAAAAAAAAAAAAAAAAg4MtAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY2FjZXJ0LnBlbVBLAQIUAxQAAAAAAAAAIQCCsqLP0QEAANEBAAA6AAAAAAAAAAAAAAAAAM2mMQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2NlcnRzLnB5UEsBAhQDFAAAAAAAAAAhAHfJYU1aBgAAWgYAADsAAAAAAAAAAAAAAAAA9qgxAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhABNDyTMgRwAAIEcAADwAAAAAAAAAAAAAAAAAqa8xAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29va2llcy5weVBLAQIUAxQAAAAAAAAAIQD5zunQKwwAACsMAAA/AAAAAAAAAAAAAAAAACP3MQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2V4Y2VwdGlvbnMucHlQSwECFAMUAAAAAAAAACEAhB1g4lMOAABTDgAAOQAAAAAAAAAAAAAAAACrAzIAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9oZWxwLnB5UEsBAhQDFAAAAAAAAAAhAHnao8r/AgAA/wIAADoAAAAAAAAAAAAAAAAAVRIyAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvaG9va3MucHlQSwECFAMUAAAAAAAAACEAZX1HdAOFAAADhQAAOwAAAAAAAAAAAAAAAACsFTIAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9tb2RlbHMucHlQSwECFAMUAAAAAAAAACEAEjzegbcCAAC3AgAAPQAAAAAAAAAAAAAAAAAImzIAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9wYWNrYWdlcy5weVBLAQIUAxQAAAAAAAAAIQBfn2aZmmsAAJprAAA9AAAAAAAAAAAAAAAAABqeMgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3Nlc3Npb25zLnB5UEsBAhQDFAAAAAAAAAAhAEE41+L7DAAA+wwAAEEAAAAAAAAAAAAAAAAADwozAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RhdHVzX2NvZGVzLnB5UEsBAhQDFAAAAAAAAAAhAOYgyg/ECwAAxAsAAD8AAAAAAAAAAAAAAAAAaRczAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQBHwdlXBGwAAARsAAA6AAAAAAAAAAAAAAAAAIojMwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhACF7vAr0JgAA9CYAADQAAAAAAAAAAAAAAAAA5o8zAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmV0cnlpbmcucHlQSwECFAMUAAAAAAAAACEAmVhNWpJ1AACSdQAALwAAAAAAAAAAAAAAAAAstzMAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9zaXgucHlQSwECFAMUAAAAAAAAACEAkj71hyULAAAlCwAAPAAAAAAAAAAAAAAAAAALLTQAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAZ05TcJwAA3CcAAEAAAAAAAAAAAAAAAAAAijg0AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9fY29sbGVjdGlvbnMucHlQSwECFAMUAAAAAAAAACEAYISup8syAADLMgAAPgAAAAAAAAAAAAAAAADEYDQAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb24ucHlQSwECFAMUAAAAAAAAACEAFxocbx6KAAAeigAAQgAAAAAAAAAAAAAAAADrkzQAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb25wb29sLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAaR41AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAFUAAAAAAAAAAAAAAAAAyx41AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAt1mLfZhEAACYRAAAVQAAAAAAAAAAAAAAAAA+HzUAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9iaW5kaW5ncy5weVBLAQIUAxQAAAAAAAAAIQAEr9yQHi8AAB4vAABWAAAAAAAAAAAAAAAAAElkNQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2xvd19sZXZlbC5weVBLAQIUAxQAAAAAAAAAIQAYw62TcSoAAHEqAABFAAAAAAAAAAAAAAAAANuTNQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9hcHBlbmdpbmUucHlQSwECFAMUAAAAAAAAACEALqVxjX4RAAB+EQAARAAAAAAAAAAAAAAAAACvvjUAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvbnRsbXBvb2wucHlQSwECFAMUAAAAAAAAACEA8yq2cfo7AAD6OwAARQAAAAAAAAAAAAAAAACP0DUAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvcHlvcGVuc3NsLnB5UEsBAhQDFAAAAAAAAAAhAOdTwPMldwAAJXcAAEsAAAAAAAAAAAAAAAAA7Aw2AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NlY3VyZXRyYW5zcG9ydC5weVBLAQIUAxQAAAAAAAAAIQDQUymZMxgAADMYAABBAAAAAAAAAAAAAAAAAHqENgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zb2Nrcy5weVBLAQIUAxQAAAAAAAAAIQDymskDyxkAAMsZAAA+AAAAAAAAAAAAAAAAAAydNgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvZXhjZXB0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQABOYyyNxcAADcXAAA6AAAAAAAAAAAAAAAAADO3NgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvZmllbGRzLnB5UEsBAhQDFAAAAAAAAAAhANdd0BcRCQAAEQkAADwAAAAAAAAAAAAAAAAAws42AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9maWxlcG9zdC5weVBLAQIUAxQAAAAAAAAAIQCPXaB8bQAAAG0AAABFAAAAAAAAAAAAAAAAAC3YNgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAATwAAAAAAAAAAAAAAAAD92DYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBSVxy5tQUAALUFAABPAAAAAAAAAAAAAAAAAGrZNgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvYmFja3BvcnRzL21ha2VmaWxlLnB5UEsBAhQDFAAAAAAAAAAhAEbBpmfnIgAA5yIAAEkAAAAAAAAAAAAAAAAAjN82AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9vcmRlcmVkX2RpY3QucHlQSwECFAMUAAAAAAAAACEAmVhNWpJ1AACSdQAAQAAAAAAAAAAAAAAAAADaAjcAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NpeC5weVBLAQIUAxQAAAAAAAAAIQD7bcrlsAIAALACAABYAAAAAAAAAAAAAAAAAMp4NwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhALU6jytGFgAARhYAAF8AAAAAAAAAAAAAAAAA8Hs3AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX2ltcGxlbWVudGF0aW9uLnB5UEsBAhQDFAAAAAAAAAAhAPCuGJLZPwAA2T8AAD8AAAAAAAAAAAAAAAAAs5I3AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wb29sbWFuYWdlci5weVBLAQIUAxQAAAAAAAAAIQDKMeTEOhcAADoXAAA7AAAAAAAAAAAAAAAAAOnSNwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVxdWVzdC5weVBLAQIUAxQAAAAAAAAAIQA/SoJhd1kAAHdZAAA8AAAAAAAAAAAAAAAAAHzqNwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVzcG9uc2UucHlQSwECFAMUAAAAAAAAACEAUnXhvxQEAAAUBAAAQQAAAAAAAAAAAAAAAABNRDgAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAq59fPY0QAACNEAAAQwAAAAAAAAAAAAAAAADASDgAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvY29ubmVjdGlvbi5weVBLAQIUAxQAAAAAAAAAIQBBYZDXeQ4AAHkOAABAAAAAAAAAAAAAAAAAAK5ZOABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXF1ZXN0LnB5UEsBAhQDFAAAAAAAAAAhAPQ5HJ8nCQAAJwkAAEEAAAAAAAAAAAAAAAAAhWg4AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3Jlc3BvbnNlLnB5UEsBAhQDFAAAAAAAAAAhAD1h79sJOQAACTkAAD4AAAAAAAAAAAAAAAAAC3I4AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JldHJ5LnB5UEsBAhQDFAAAAAAAAAAhAH3POz2bUgAAm1IAAEIAAAAAAAAAAAAAAAAAcKs4AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3NlbGVjdG9ycy5weVBLAQIUAxQAAAAAAAAAIQDV78iisC8AALAvAAA9AAAAAAAAAAAAAAAAAGv+OABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zc2xfLnB5UEsBAhQDFAAAAAAAAAAhAFVSziAdJgAAHSYAAEAAAAAAAAAAAAAAAAAAdi45AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3RpbWVvdXQucHlQSwECFAMUAAAAAAAAACEAwx5tEVcZAABXGQAAPAAAAAAAAAAAAAAAAADxVDkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdXJsLnB5UEsBAhQDFAAAAAAAAAAhALY8I/yrBQAAqwUAAD0AAAAAAAAAAAAAAAAAom45AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3dhaXQucHlQSwECFAMUAAAAAAAAACEAb8GhOFApAABQKQAAQQAAAAAAAAAAAAAAAACodDkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAx60IixMjAAATIwAAPwAAAAAAAAAAAAAAAABXnjkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvbGFiZWxzLnB5UEsBAhQDFAAAAAAAAAAhAFB/MR8ZBQAAGQUAAEEAAAAAAAAAAAAAAAAAx8E5AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL21rbGFiZWxzLnB5UEsBAhQDFAAAAAAAAAAhABabPh2iGQAAohkAAD4AAAAAAAAAAAAAAAAAP8c5AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3Rlc3RzLnB5UEsBAhQDFAAAAAAAAAAhAEhvRb7SEAAA0hAAAEcAAAAAAAAAAAAAAAAAPeE5AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3hfdXNlcl9kZWZpbmVkLnB5UEsBAhQDFAAAAAAAAAAhAIIYi/WGLgAAhi4AAC8AAAAAAAAAAAAAAAAAdPI5AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2Jhc2Vjb21tYW5kLnB5UEsBAhQDFAAAAAAAAAAhAKur/jvhKAAA4SgAAC4AAAAAAAAAAAAAAAAARyE6AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2Jhc2VwYXJzZXIucHlQSwECFAMUAAAAAAAAACEAS5kyIVpAAABaQAAALgAAAAAAAAAAAAAAAAB0SjoAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY21kb3B0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQCQDYdDxAgAAMQIAAA1AAAAAAAAAAAAAAAAABqLOgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAdYTtfZgUAAGYFAAAyAAAAAAAAAAAAAAAAADGUOgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9jaGVjay5weVBLAQIUAxQAAAAAAAAAIQAwwcyzlQkAAJUJAAA3AAAAAAAAAAAAAAAAAOeZOgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9jb21wbGV0aW9uLnB5UEsBAhQDFAAAAAAAAAAhANkemaaCHgAAgh4AADUAAAAAAAAAAAAAAAAA0aM6AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2Rvd25sb2FkLnB5UEsBAhQDFAAAAAAAAAAhAMP282ATCwAAEwsAADMAAAAAAAAAAAAAAAAApsI6AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2ZyZWV6ZS5weVBLAQIUAxQAAAAAAAAAIQD4ieykPQYAAD0GAAAxAAAAAAAAAAAAAAAAAArOOgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9oYXNoLnB5UEsBAhQDFAAAAAAAAAAhAB4W0J3WAwAA1gMAADEAAAAAAAAAAAAAAAAAltQ6AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2hlbHAucHlQSwECFAMUAAAAAAAAACEASyWGFgREAAAERAAANAAAAAAAAAAAAAAAAAC72DoAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQAPS8c4aSwAAGksAAAxAAAAAAAAAAAAAAAAABEdOwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9saXN0LnB5UEsBAhQDFAAAAAAAAAAhAK5ChNyWEQAAlhEAADMAAAAAAAAAAAAAAAAAyUk7AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3NlYXJjaC5weVBLAQIUAxQAAAAAAAAAIQAMUx8kAxcAAAMXAAAxAAAAAAAAAAAAAAAAALBbOwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9zaG93LnB5UEsBAhQDFAAAAAAAAAAhAKuJGT9ECwAARAsAADYAAAAAAAAAAAAAAAAAAnM7AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3VuaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQCXN3PmMR4AADEeAAAyAAAAAAAAAAAAAAAAAJp+OwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQCZJ6lxQBIAAEASAAAzAAAAAAAAAAAAAAAAABudOwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21wYXQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAgqKllzhaAAA4WgAANQAAAAAAAAAAAAAAAACsrzsAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tcGF0L2RpY3Rjb25maWcucHlQSwECFAMUAAAAAAAAACEA/T8pUZl9AACZfQAALAAAAAAAAAAAAAAAAAA3CjwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvZG93bmxvYWQucHlQSwECFAMUAAAAAAAAACEAvnqWmLkfAAC5HwAALgAAAAAAAAAAAAAAAAAaiDwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvZXhjZXB0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQA2+CX/DpwAAA6cAAApAAAAAAAAAAAAAAAAAB+oPABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9pbmRleC5weVBLAQIUAxQAAAAAAAAAIQC3D3eZ+hUAAPoVAAAtAAAAAAAAAAAAAAAAAHREPQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9sb2NhdGlvbnMucHlQSwECFAMUAAAAAAAAACEAqhpnvEcAAABHAAAAMwAAAAAAAAAAAAAAAAC5Wj0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvbW9kZWxzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAGhOMm3nAQAA5wEAADAAAAAAAAAAAAAAAAAAUVs9AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL21vZGVscy9pbmRleC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA3AAAAAAAAAAAAAAAAAIZdPQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9vcGVyYXRpb25zL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAM9lYqg2BgAANgYAADQAAAAAAAAAAAAAAAAA2109AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL29wZXJhdGlvbnMvY2hlY2sucHlQSwECFAMUAAAAAAAAACEA+SIzM0oUAABKFAAANQAAAAAAAAAAAAAAAABjZD0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvb3BlcmF0aW9ucy9mcmVlemUucHlQSwECFAMUAAAAAAAAACEA+iiEteQqAADkKgAALgAAAAAAAAAAAAAAAAAAeT0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvcGVwNDI1dGFncy5weVBLAQIUAxQAAAAAAAAAIQBcadIZFAEAABQBAAAwAAAAAAAAAAAAAAAAADCkPQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAHOCMCpYuAACWLgAAMAAAAAAAAAAAAAAAAACSpT0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV9maWxlLnB5UEsBAhQDFAAAAAAAAAAhAIFtVcOXtQAAl7UAADMAAAAAAAAAAAAAAAAAdtQ9AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3JlcS9yZXFfaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQAS3ZJ2noYAAJ6GAAAvAAAAAAAAAAAAAAAAAF6KPgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX3NldC5weVBLAQIUAxQAAAAAAAAAIQAFRsRw8RoAAPEaAAA1AAAAAAAAAAAAAAAAAEkRPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX3VuaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQDbrHf2nAAAAJwAAAAwAAAAAAAAAAAAAAAAAI0sPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9zdGF0dXNfY29kZXMucHlQSwECFAMUAAAAAAAAACEA4Fq0vjNqAAAzagAAMgAAAAAAAAAAAAAAAAB3LT8AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEANQreO2siAABrIgAAMQAAAAAAAAAAAAAAAAD6lz8AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvYXBwZGlycy5weVBLAQIUAxQAAAAAAAAAIQDNDE0uIAUAACAFAAAvAAAAAAAAAAAAAAAAALS6PwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9idWlsZC5weVBLAQIUAxQAAAAAAAAAIQBxHmokuAgAALgIAAA1AAAAAAAAAAAAAAAAACHAPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9kZXByZWNhdGlvbi5weVBLAQIUAxQAAAAAAAAAIQC9Wj+wywMAAMsDAAAyAAAAAAAAAAAAAAAAACzJPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9lbmNvZGluZy5weVBLAQIUAxQAAAAAAAAAIQDyQ+3AgwMAAIMDAAA0AAAAAAAAAAAAAAAAAEfNPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9maWxlc3lzdGVtLnB5UEsBAhQDFAAAAAAAAAAhACA3BXR7CwAAewsAAC8AAAAAAAAAAAAAAAAAHNE/AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2dsaWJjLnB5UEsBAhQDFAAAAAAAAAAhAKk06QQyCwAAMgsAADAAAAAAAAAAAAAAAAAA5Nw/AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2hhc2hlcy5weVBLAQIUAxQAAAAAAAAAIQBnJtd4/wwAAP8MAAAxAAAAAAAAAAAAAAAAAGToPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9sb2dnaW5nLnB5UEsBAhQDFAAAAAAAAAAhAEhU2OpPFQAATxUAADIAAAAAAAAAAAAAAAAAsvU/AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL291dGRhdGVkLnB5UEsBAhQDFAAAAAAAAAAhAA3mkrggCAAAIAgAADMAAAAAAAAAAAAAAAAAUQtAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL3BhY2thZ2luZy5weVBLAQIUAxQAAAAAAAAAIQAWovJKFgEAABYBAAA6AAAAAAAAAAAAAAAAAMITQABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9zZXR1cHRvb2xzX2J1aWxkLnB5UEsBAhQDFAAAAAAAAAAhAOXikJVNLQAATS0AACwAAAAAAAAAAAAAAAAAMBVAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL3VpLnB5UEsBAhQDFAAAAAAAAAAhAMhWxUtWMAAAVjAAADAAAAAAAAAAAAAAAAAAx0JAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3Zjcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQD7wMzF2w4AANsOAAAuAAAAAAAAAAAAAAAAAGtzQABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3MvYmF6YWFyLnB5UEsBAhQDFAAAAAAAAAAhACi+3jC9KwAAvSsAACsAAAAAAAAAAAAAAAAAkoJAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3Zjcy9naXQucHlQSwECFAMUAAAAAAAAACEAeWJqHZANAACQDQAAMQAAAAAAAAAAAAAAAACYrkAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdmNzL21lcmN1cmlhbC5weVBLAQIUAxQAAAAAAAAAIQBuNJVBhiQAAIYkAAAyAAAAAAAAAAAAAAAAAHe8QABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3Mvc3VidmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQB9mSA7Cn0AAAp9AAApAAAAAAAAAAAAAAAAAE3hQABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAJ5eQQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAXE+6RX4AAAB+AAAANAAAAAAAAAAAAAAAAADsXkEAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L2Vhc3lfaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQAXRJ4pB54BAAeeAQA+AAAAAAAAAAAAAAAAALxfQQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABGAAAAAAAAAAAAAAAAAB/+QgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAEOrsCZmVwAAZlcAAEUAAAAAAAAAAAAAAAAAg/5CAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvYXBwZGlycy5weVBLAQIUAxQAAAAAAAAAIQA8KVjG0AIAANACAABRAAAAAAAAAAAAAAAAAExWQwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHlQSwECFAMUAAAAAAAAACEAgXaWygECAAABAgAAUAAAAAAAAAAAAAAAAACLWUMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA5mlK41wDAABcAwAATwAAAAAAAAAAAAAAAAD6W0MAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQD6/aQSiAUAAIgFAABTAAAAAAAAAAAAAAAAAMNfQwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQAw+BPcOCAAADggAABPAAAAAAAAAAAAAAAAALxlQwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5UEsBAhQDFAAAAAAAAAAhAKWGHdsDEQAAAxEAAFQAAAAAAAAAAAAAAAAAYYZDAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weVBLAQIUAxQAAAAAAAAAIQB8RYOMeW0AAHltAABSAAAAAAAAAAAAAAAAANaXQwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5UEsBAhQDFAAAAAAAAAAhAMXqJw+lAQAApQEAAE0AAAAAAAAAAAAAAAAAvwVEAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAA7vxqEkLQAAJC0AAE8AAAAAAAAAAAAAAAAAzwdEAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAeCgUw+uBAwDrgQMARwAAAAAAAAAAAAAAAABgNUQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9weXBhcnNpbmcucHlQSwECFAMUAAAAAAAAACEAmVhNWpJ1AACSdQAAQQAAAAAAAAAAAAAAAACwt0cAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9zaXgucHlQSwECFAMUAAAAAAAAACEAddjxebcJAAC3CQAARQAAAAAAAAAAAAAAAAChLUgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvZXh0ZXJuL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAMdHfTJYAgAAWAIAAEAAAAAAAAAAAAAAAAAAuzdIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL3B5MzFjb21wYXQucHlQSwECFAMUAAAAAAAAACEAf9S6XI4FAACOBQAAUAAAAAAAAAAAAAAAAABxOkgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3RQSwECFAMUAAAAAAAAACEAUNerBzYEAAA2BAAATAAAAAAAAAAAAAAAAABtQEgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9MSUNFTlNFLnR4dFBLAQIUAxQAAAAAAAAAIQDxDJD/7goAAO4KAABJAAAAAAAAAAAAAAAAAA1FSABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL01FVEFEQVRBUEsBAhQDFAAAAAAAAAAhAFysJqeDHgAAgx4AAEcAAAAAAAAAAAAAAAAAYlBIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vUkVDT1JEUEsBAhQDFAAAAAAAAAAhAPbd0r5uAAAAbgAAAEYAAAAAAAAAAAAAAAAASm9IAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vV0hFRUxQSwECFAMUAAAAAAAAACEAN9lf3e8AAADvAAAAVQAAAAAAAAAAAAAAAAAccEgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9kZXBlbmRlbmN5X2xpbmtzLnR4dFBLAQIUAxQAAAAAAAAAIQDRNY6OrgsAAK4LAABRAAAAAAAAAAAAAAAAAH5xSABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRQSwECFAMUAAAAAAAAACEA+9Yg9SUTAAAlEwAATgAAAAAAAAAAAAAAAACbfUgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9tZXRhZGF0YS5qc29uUEsBAhQDFAAAAAAAAAAhADBcAZEmAAAAJgAAAE4AAAAAAAAAAAAAAAAALJFIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dFBLAQIUAxQAAAAAAAAAIQCTBtcyAQAAAAEAAABJAAAAAAAAAAAAAAAAAL6RSABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3ppcC1zYWZlUEsBAhQDFAAAAAAAAAAhACMLSgNEFgAARBYAADsAAAAAAAAAAAAAAAAAJpJIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAKWHZVHAGQAAwBkAAD8AAAAAAAAAAAAAAAAAw6hIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weVBLAQIUAxQAAAAAAAAAIQAf4j0cJxYAACcWAAA9AAAAAAAAAAAAAAAAAODCSABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9idWlsZF9tZXRhLnB5UEsBAhQDFAAAAAAAAAAhAPWGemkAAAEAAAABADoAAAAAAAAAAAAAAAAAYtlIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NsaS0zMi5leGVQSwECFAMUAAAAAAAAACEAYnDO2wAkAQAAJAEAOgAAAAAAAAAAAAAAAAC62UkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY2xpLTY0LmV4ZVBLAQIUAxQAAAAAAAAAIQD1hnppAAABAAAAAQA3AAAAAAAAAAAAAAAAABL+SgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jbGkuZXhlUEsBAhQDFAAAAAAAAAAhAEGcFlJSAgAAUgIAAEMAAAAAAAAAAAAAAAAAZ/5LAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAUPgj8noJAAB6CQAAQAAAAAAAAAAAAAAAAAAaAUwAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weVBLAQIUAxQAAAAAAAAAIQBJzCuhW0YAAFtGAABEAAAAAAAAAAAAAAAAAPIKTABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weVBLAQIUAxQAAAAAAAAAIQDr0nQW5AUAAOQFAABEAAAAAAAAAAAAAAAAAK9RTABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weVBLAQIUAxQAAAAAAAAAIQAgjHUUfQIAAH0CAABIAAAAAAAAAAAAAAAAAPVXTABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHlQSwECFAMUAAAAAAAAACEAJxqNG4QRAACEEQAARQAAAAAAAAAAAAAAAADYWkwAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9jbGliLnB5UEsBAhQDFAAAAAAAAAAhAJGlaef5MgAA+TIAAEQAAAAAAAAAAAAAAAAAv2xMAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5UEsBAhQDFAAAAAAAAAAhAEBGQtx8JQAAfCUAAEMAAAAAAAAAAAAAAAAAGqBMAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHlQSwECFAMUAAAAAAAAACEAQFw7/24fAABuHwAAQgAAAAAAAAAAAAAAAAD3xUwAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5UEsBAhQDFAAAAAAAAAAhAP/o9pHAAwAAwAMAAEQAAAAAAAAAAAAAAAAAxeVMAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZGlzdF9pbmZvLnB5UEsBAhQDFAAAAAAAAAAhAKt0EulVVAEAVVQBAEcAAAAAAAAAAAAAAAAA5+lMAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhAE4sckJwYQAAcGEAAEMAAAAAAAAAAAAAAAAAoT5OAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHlQSwECFAMUAAAAAAAAACEAjdu1P0sSAABLEgAAQgAAAAAAAAAAAAAAAAByoE4AcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhAFzSqOWbCAAAmwgAAEsAAAAAAAAAAAAAAAAAHbNOAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weVBLAQIUAxQAAAAAAAAAIQCQnDtTAA8AAAAPAABGAAAAAAAAAAAAAAAAACG8TgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5UEsBAhQDFAAAAAAAAAAhAEY/8R6HCQAAhwkAAEoAAAAAAAAAAAAAAAAAhctOAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5UEsBAhQDFAAAAAAAAAAhAH1zYL96EwAAehMAAEUAAAAAAAAAAAAAAAAAdNVOAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQDN/62QDgEAAA4BAABDAAAAAAAAAAAAAAAAAFHpTgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3JlZ2lzdGVyLnB5UEsBAhQDFAAAAAAAAAAhABnK1KR0CAAAdAgAAEEAAAAAAAAAAAAAAAAAwOpOAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5UEsBAhQDFAAAAAAAAAAhAASB1jSSAgAAkgIAAEMAAAAAAAAAAAAAAAAAk/NOAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHlQSwECFAMUAAAAAAAAACEAtx/RbjcaAAA3GgAAQAAAAAAAAAAAAAAAAACG9k4AcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weVBLAQIUAxQAAAAAAAAAIQCbcMvH3RMAAN0TAABBAAAAAAAAAAAAAAAAABsRTwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weVBLAQIUAxQAAAAAAAAAIQDdGeGe/iMAAP4jAAA/AAAAAAAAAAAAAAAAAFclTwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHlQSwECFAMUAAAAAAAAACEA2SSLZ5QEAACUBAAAQQAAAAAAAAAAAAAAAACySU8AcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHlQSwECFAMUAAAAAAAAACEA8pfzxo8cAACPHAAARgAAAAAAAAAAAAAAAAClTk8AcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWRfZG9jcy5weVBLAQIUAxQAAAAAAAAAIQCJRxAksT8AALE/AAA5AAAAAAAAAAAAAAAAAJhrTwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb25maWcucHlQSwECFAMUAAAAAAAAACEAGiIEMqcDAACnAwAAOwAAAAAAAAAAAAAAAACgq08AcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGVwX3V0aWwucHlQSwECFAMUAAAAAAAAACEAWyktas0WAADNFgAAOgAAAAAAAAAAAAAAAACgr08AcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGVwZW5kcy5weVBLAQIUAxQAAAAAAAAAIQAldIcFkJ0AAJCdAAA3AAAAAAAAAAAAAAAAAMXGTwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kaXN0LnB5UEsBAhQDFAAAAAAAAAAhALmqke7BBgAAwQYAADwAAAAAAAAAAAAAAAAAqmRQAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2V4dGVuc2lvbi5weVBLAQIUAxQAAAAAAAAAIQDQintlgwAAAIMAAABCAAAAAAAAAAAAAAAAAMVrUABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9leHRlcm4vX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEABOrBvUoMAABKDAAAOAAAAAAAAAAAAAAAAACobFAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xpYmMucHlQSwECFAMUAAAAAAAAACEAvF2hOVcUAABXFAAANwAAAAAAAAAAAAAAAABIeVAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xvYi5weVBLAQIUAxQAAAAAAAAAIQAQ+fwpAAABAAAAAQA6AAAAAAAAAAAAAAAAAPSNUABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9ndWktMzIuZXhlUEsBAhQDFAAAAAAAAAAhANgOq/QAJgEAACYBADoAAAAAAAAAAAAAAAAATI5RAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2d1aS02NC5leGVQSwECFAMUAAAAAAAAACEAEPn8KQAAAQAAAAEANwAAAAAAAAAAAAAAAACktFIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ3VpLmV4ZVBLAQIUAxQAAAAAAAAAIQBk+X6bEwMAABMDAAA5AAAAAAAAAAAAAAAAAPm0UwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9sYXVuY2gucHlQSwECFAMUAAAAAAAAACEAh1Hrot0HAADdBwAAPQAAAAAAAAAAAAAAAABjuFMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbGliMnRvM19leC5weVBLAQIUAxQAAAAAAAAAIQCNQ3JenRYAAJ0WAAA5AAAAAAAAAAAAAAAAAJvAUwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9tb25rZXkucHlQSwECFAMUAAAAAAAAACEAgsOU5rSfAAC0nwAANwAAAAAAAAAAAAAAAACP11MAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbXN2Yy5weVBLAQIUAxQAAAAAAAAAIQBjC+PWfwwAAH8MAAA9AAAAAAAAAAAAAAAAAJh3VABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9uYW1lc3BhY2VzLnB5UEsBAhQDFAAAAAAAAAAhAImwE847ngAAO54AAEAAAAAAAAAAAAAAAAAAcoRUAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHlQSwECFAMUAAAAAAAAACEA5ebovoIqAACCKgAAPQAAAAAAAAAAAAAAAAALI1UAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcGVwNDI1dGFncy5weVBLAQIUAxQAAAAAAAAAIQCyZqdXGAIAABgCAAA9AAAAAAAAAAAAAAAAAOhNVQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTI3Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhANC5SFqoBAAAqAQAAD0AAAAAAAAAAAAAAAAAW1BVAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzFjb21wYXQucHlQSwECFAMUAAAAAAAAACEAyWGSwOYDAADmAwAAPQAAAAAAAAAAAAAAAABeVVUAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzM2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQCFGZoLSwsAAEsLAAA9AAAAAAAAAAAAAAAAAJ9ZVQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTM2Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAIxTmmPENwAAxDcAADoAAAAAAAAAAAAAAAAARWVVAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NhbmRib3gucHlQSwECFAMUAAAAAAAAACEAqDO0vooAAACKAAAAOwAAAAAAAAAAAAAAAABhnVUAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2NyaXB0LnRtcGxQSwECFAMUAAAAAAAAACEAAsGU4wMJAAADCQAAPQAAAAAAAAAAAAAAAABEnlUAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weVBLAQIUAxQAAAAAAAAAIQCIm1tOLCEAACwhAAA+AAAAAAAAAAAAAAAAAKKnVQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zc2xfc3VwcG9ydC5weVBLAQIUAxQAAAAAAAAAIQCaQtea5AMAAOQDAABAAAAAAAAAAAAAAAAAACrJVQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy91bmljb2RlX3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAEixTGKQAAAAkAAAADoAAAAAAAAAAAAAAAAAbM1VAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAcB0I80EcAABBHAAAOAAAAAAAAAAAAAAAAABUzlUAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvd2hlZWwucHlQSwECFAMUAAAAAAAAACEA+cvuDcoCAADKAgAAQgAAAAAAAAAAAAAAAADr6lUAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvd2luZG93c19zdXBwb3J0LnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAC0AAAAAAAAAAAAAAAAAFe5VAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCIOqXUVSYAAFUmAABKAAAAAAAAAAAAAAAAAGDuVQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdFBLAQIUAxQAAAAAAAAAIQBw/66fZQQAAGUEAABGAAAAAAAAAAAAAAAAAB0VVgBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL0xJQ0VOU0UudHh0UEsBAhQDFAAAAAAAAAAhAERtmYENKwAADSsAAEMAAAAAAAAAAAAAAAAA5hlWAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTUVUQURBVEFQSwECFAMUAAAAAAAAACEApw+7Fp0PAACdDwAAQQAAAAAAAAAAAAAAAABURVYAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9SRUNPUkRQSwECFAMUAAAAAAAAACEAlN+We3EAAABxAAAAQAAAAAAAAAAAAAAAAABQVVYAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9XSEVFTFBLAQIUAxQAAAAAAAAAIQDiRd+sbQAAAG0AAABLAAAAAAAAAAAAAAAAAB9WVgBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRQSwECFAMUAAAAAAAAACEAUrJO1loGAABaBgAASAAAAAAAAAAAAAAAAAD1VlYAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9tZXRhZGF0YS5qc29uUEsBAhQDFAAAAAAAAAAhABlj3mUGAAAABgAAAEgAAAAAAAAAAAAAAAAAtV1WAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dFBLAQIUAxQAAAAAAAAAIQBhN6VHYwAAAGMAAAAzAAAAAAAAAAAAAAAAACFeVgBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAJGm3VKABAACgAQAAMwAAAAAAAAAAAAAAAADVXlYAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL19fbWFpbl9fLnB5UEsBAhQDFAAAAAAAAAAhACBTglLHCAAAxwgAADIAAAAAAAAAAAAAAAAAxmBWAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9hcmNoaXZlLnB5UEsBAhQDFAAAAAAAAAAhAEqvJNHoRwAA6EcAADYAAAAAAAAAAAAAAAAA3WlWAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9iZGlzdF93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQCjeVJ3HQIAAB0CAAA0AAAAAAAAAAAAAAAAABmyVgBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvZGVjb3JhdG9yLnB5UEsBAhQDFAAAAAAAAAAhANNhDyTTCwAA0wsAADQAAAAAAAAAAAAAAAAAiLRWAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9lZ2cyd2hlZWwucHlQSwECFAMUAAAAAAAAACEAECTyM7oJAAC6CQAANAAAAAAAAAAAAAAAAACtwFYAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2VnZ25hbWVzLnR4dFBLAQIUAxQAAAAAAAAAIQCxvLn2skYAALJGAAAyAAAAAAAAAAAAAAAAALnKVgBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQA5KHcLnC0AAJwtAAAzAAAAAAAAAAAAAAAAALsRVwBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvbWV0YWRhdGEucHlQSwECFAMUAAAAAAAAACEAYfY10moEAABqBAAAMAAAAAAAAAAAAAAAAACoP1cAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BhdGhzLnB5UEsBAhQDFAAAAAAAAAAhAGtiVnzFFgAAxRYAADUAAAAAAAAAAAAAAAAAYERXAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9wZXA0MjV0YWdzLnB5UEsBAhQDFAAAAAAAAAAhAIBDGKDJBAAAyQQAADIAAAAAAAAAAAAAAAAAeFtXAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9wa2dpbmZvLnB5UEsBAhQDFAAAAAAAAAAhAPxM5kzDDgAAww4AAD4AAAAAAAAAAAAAAAAAkWBXAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAPxQ/+BjGgAAYxoAADsAAAAAAAAAAAAAAAAAsG9XAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL2RqYmVjLnB5UEsBAhQDFAAAAAAAAAAhAEwBJT6fBgAAnwYAAD8AAAAAAAAAAAAAAAAAbIpXAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL2VkMjU1MTlweS5weVBLAQIUAxQAAAAAAAAAIQDb2+It9AwAAPQMAAA6AAAAAAAAAAAAAAAAAGiRVwBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9rZXlzLnB5UEsBAhQDFAAAAAAAAAAhAP+eZXABAAAAAQAAADgAAAAAAAAAAAAAAAAAtJ5XAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAC59XAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBKF0fSFwAAABcAAABRAAAAAAAAAAAAAAAAAG6fVwBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvY29tcGxleGRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAHAoXOFcDAABXAwAAQgAAAAAAAAAAAAAAAAD0n1cAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvY29tcGxleC1kaXN0L3NldHVwLnB5UEsBAhQDFAAAAAAAAAAhAChLGGWZBgAAmQYAADgAAAAAAAAAAAAAAAAAq6NXAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbmZ0ZXN0LnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEcAAAAAAAAAAAAAAAAAmqpXAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2V4dGVuc2lvbi5kaXN0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAF+GzE/IAQAAyAEAAEQAAAAAAAAAAAAAAAAA/6pXAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2V4dGVuc2lvbi5kaXN0L3NldHVwLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAKa1XAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAIytVwBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyLmhQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAAAADsrVcAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlcnNkaXN0LnB5UEsBAhQDFAAAAAAAAAAhAJnEJyxEAQAARAEAAEIAAAAAAAAAAAAAAAAAUq5XAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9zZXR1cC5weVBLAQIUAxQAAAAAAAAAIQBqPt3X2ywAANssAAA/AAAAAAAAAAAAAAAAAPavVwBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9weWRpc3Qtc2NoZW1hLmpzb25QSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAu3VcAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA000Eo38BAAB/AQAAQQAAAAAAAAAAAAAAAACQ3VcAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2V0dXAucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAATwAAAAAAAAAAAAAAAABu31cAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2ltcGxlZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQB24Ez6ahQAAGoUAABMAAAAAAAAAAAAAAAAANvfVwBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0LTEuMC1weTIucHkzLW5vbmUtd2luMzIud2hsUEsBAhQDFAAAAAAAAAAhADgr7xFtGQAAbRkAADoAAAAAAAAAAAAAAAAAr/RXAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfYmFzaWMucHlQSwECFAMUAAAAAAAAACEAbQSyvkoHAABKBwAAPAAAAAAAAAAAAAAAAAB0DlgAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhAPdhH5MPCgAADwoAADkAAAAAAAAAAAAAAAAAGBZYAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfa2V5cy5weVBLAQIUAxQAAAAAAAAAIQBiWHRjrAAAAKwAAAA6AAAAAAAAAAAAAAAAAH4gWABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3BhdGhzLnB5UEsBAhQDFAAAAAAAAAAhAG2WMfnYBQAA2AUAADwAAAAAAAAAAAAAAAAAgiFYAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfcmFua2luZy5weVBLAQIUAxQAAAAAAAAAIQCkKX8xYAQAAGAEAAA/AAAAAAAAAAAAAAAAALQnWABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3NpZ25hdHVyZXMucHlQSwECFAMUAAAAAAAAACEAnFdC8CcXAAAnFwAAOwAAAAAAAAAAAAAAAABxLFgAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF90YWdvcHQucHlQSwECFAMUAAAAAAAAACEA1D4fVpACAACQAgAAOQAAAAAAAAAAAAAAAADxQ1gAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF90b29sLnB5UEsBAhQDFAAAAAAAAAAhAEViREzpEQAA6REAAD4AAAAAAAAAAAAAAAAA2EZYAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfd2hlZWxmaWxlLnB5UEsBAhQDFAAAAAAAAAAhAKMtAxehMwAAoTMAADgAAAAAAAAAAAAAAAAAHVlYAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90b29sL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAM/YM7IaEwAAGhMAAC8AAAAAAAAAAAAAAAAAFI1YAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC91dGlsLnB5UEsBAhQDFAAAAAAAAAAhAPO05Ci3HgAAtx4AADgAAAAAAAAAAAAAAAAAe6BYAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC93aW5pbnN0MndoZWVsLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAiL9YAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAj6GNhj0yAAA9MgAAHgAAAAAAAAAAAAAAAADIv1gAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy9waXB0b29sUEsBAhQDFAAAAAAAAAAhACVYVUxyHwAAch8AACEAAAAAAAAAAAAAAAAAQfJYAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvcGlwdG9vbC5weVBLAQIUAxQAAAAAAAAAIQB/uX4PiBYAAIgWAAAdAAAAAAAAAAAAAAAAAPIRWQBydWxlc19weXRob24vcGFja2FnaW5nL3dobC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAAAALUoWQBzdWJwYXIvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAGgAAAAAAAAAAAAAAAADlKFkAc3VicGFyL3J1bnRpbWUvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAj6BzPLcuAAC3LgAAGQAAAAAAAAAAAAAAAAAdKVkAc3VicGFyL3J1bnRpbWUvc3VwcG9ydC5weVBLBQYAAAAAsgGyAam1AAALWFkAAAA=